diff --git a/assembly/features/org.eclipse.jsf.assembly.feature/.cvsignore b/assembly/features/org.eclipse.jsf.assembly.feature/.cvsignore
deleted file mode 100644
index 49d8479..0000000
--- a/assembly/features/org.eclipse.jsf.assembly.feature/.cvsignore
+++ /dev/null
@@ -1,3 +0,0 @@
-*.bin.dist.zip
-build.xml
-feature.temp.folder
diff --git a/assembly/features/org.eclipse.jsf.assembly.feature/.project b/assembly/features/org.eclipse.jsf.assembly.feature/.project
deleted file mode 100644
index 5adb9e2..0000000
--- a/assembly/features/org.eclipse.jsf.assembly.feature/.project
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.jsf.assembly.feature</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.pde.FeatureBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.FeatureNature</nature>
-	</natures>
-</projectDescription>
diff --git a/assembly/features/org.eclipse.jsf.assembly.feature/.settings/org.eclipse.core.resources.prefs b/assembly/features/org.eclipse.jsf.assembly.feature/.settings/org.eclipse.core.resources.prefs
deleted file mode 100644
index fa491bf..0000000
--- a/assembly/features/org.eclipse.jsf.assembly.feature/.settings/org.eclipse.core.resources.prefs
+++ /dev/null
@@ -1,3 +0,0 @@
-#Sun May 27 16:00:47 EDT 2007
-eclipse.preferences.version=1
-encoding/<project>=ISO-8859-1
diff --git a/assembly/features/org.eclipse.jsf.assembly.feature/build.properties b/assembly/features/org.eclipse.jsf.assembly.feature/build.properties
deleted file mode 100644
index 8b13789..0000000
--- a/assembly/features/org.eclipse.jsf.assembly.feature/build.properties
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/assembly/features/org.eclipse.jsf.assembly.feature/eclipse_update_120.jpg b/assembly/features/org.eclipse.jsf.assembly.feature/eclipse_update_120.jpg
deleted file mode 100644
index bfdf708..0000000
--- a/assembly/features/org.eclipse.jsf.assembly.feature/eclipse_update_120.jpg
+++ /dev/null
Binary files differ
diff --git a/assembly/features/org.eclipse.jsf.assembly.feature/epl-v10.html b/assembly/features/org.eclipse.jsf.assembly.feature/epl-v10.html
deleted file mode 100644
index 022ad29..0000000
--- a/assembly/features/org.eclipse.jsf.assembly.feature/epl-v10.html
+++ /dev/null
@@ -1,328 +0,0 @@
-<html xmlns:o="urn:schemas-microsoft-com:office:office"
-xmlns:w="urn:schemas-microsoft-com:office:word"
-xmlns="http://www.w3.org/TR/REC-html40">
-
-<head>
-<meta http-equiv=Content-Type content="text/html; charset=windows-1252">
-<meta name=ProgId content=Word.Document>
-<meta name=Generator content="Microsoft Word 9">
-<meta name=Originator content="Microsoft Word 9">
-<link rel=File-List
-href="./Eclipse%20EPL%202003_11_10%20Final_files/filelist.xml">
-<title>Eclipse Public License - Version 1.0</title>
-<!--[if gte mso 9]><xml>
- <o:DocumentProperties>
-  <o:Revision>2</o:Revision>
-  <o:TotalTime>3</o:TotalTime>
-  <o:Created>2004-03-05T23:03:00Z</o:Created>
-  <o:LastSaved>2004-03-05T23:03:00Z</o:LastSaved>
-  <o:Pages>4</o:Pages>
-  <o:Words>1626</o:Words>
-  <o:Characters>9270</o:Characters>
-   <o:Lines>77</o:Lines>
-  <o:Paragraphs>18</o:Paragraphs>
-  <o:CharactersWithSpaces>11384</o:CharactersWithSpaces>
-  <o:Version>9.4402</o:Version>
- </o:DocumentProperties>
-</xml><![endif]--><!--[if gte mso 9]><xml>
- <w:WordDocument>
-  <w:TrackRevisions/>
- </w:WordDocument>
-</xml><![endif]-->
-<style>
-<!--
- /* Font Definitions */
-@font-face
-	{font-family:Tahoma;
-	panose-1:2 11 6 4 3 5 4 4 2 4;
-	mso-font-charset:0;
-	mso-generic-font-family:swiss;
-	mso-font-pitch:variable;
-	mso-font-signature:553679495 -2147483648 8 0 66047 0;}
- /* Style Definitions */
-p.MsoNormal, li.MsoNormal, div.MsoNormal
-	{mso-style-parent:"";
-	margin:0in;
-	margin-bottom:.0001pt;
-	mso-pagination:widow-orphan;
-	font-size:12.0pt;
-	font-family:"Times New Roman";
-	mso-fareast-font-family:"Times New Roman";}
-p
-	{margin-right:0in;
-	mso-margin-top-alt:auto;
-	mso-margin-bottom-alt:auto;
-	margin-left:0in;
-	mso-pagination:widow-orphan;
-	font-size:12.0pt;
-	font-family:"Times New Roman";
-	mso-fareast-font-family:"Times New Roman";}
-p.BalloonText, li.BalloonText, div.BalloonText
-	{mso-style-name:"Balloon Text";
-	margin:0in;
-	margin-bottom:.0001pt;
-	mso-pagination:widow-orphan;
-	font-size:8.0pt;
-	font-family:Tahoma;
-	mso-fareast-font-family:"Times New Roman";}
-@page Section1
-	{size:8.5in 11.0in;
-	margin:1.0in 1.25in 1.0in 1.25in;
-	mso-header-margin:.5in;
-	mso-footer-margin:.5in;
-	mso-paper-source:0;}
-div.Section1
-	{page:Section1;}
--->
-</style>
-</head>
-
-<body lang=EN-US style='tab-interval:.5in'>
-
-<div class=Section1>
-
-<p align=center style='text-align:center'><b>Eclipse Public License - v 1.0</b>
-</p>
-
-<p><span style='font-size:10.0pt'>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER
-THE TERMS OF THIS ECLIPSE PUBLIC LICENSE (&quot;AGREEMENT&quot;). ANY USE,
-REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE
-OF THIS AGREEMENT.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>1. DEFINITIONS</span></b> </p>
-
-<p><span style='font-size:10.0pt'>&quot;Contribution&quot; means:</span> </p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-in the case of the initial Contributor, the initial code and documentation
-distributed under this Agreement, and<br clear=left>
-b) in the case of each subsequent Contributor:</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>i)
-changes to the Program, and</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>ii)
-additions to the Program;</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>where
-such changes and/or additions to the Program originate from and are distributed
-by that particular Contributor. A Contribution 'originates' from a Contributor
-if it was added to the Program by such Contributor itself or anyone acting on
-such Contributor's behalf. Contributions do not include additions to the
-Program which: (i) are separate modules of software distributed in conjunction
-with the Program under their own license agreement, and (ii) are not derivative
-works of the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>&quot;Contributor&quot; means any person or
-entity that distributes the Program.</span> </p>
-
-<p><span style='font-size:10.0pt'>&quot;Licensed Patents &quot; mean patent
-claims licensable by a Contributor which are necessarily infringed by the use
-or sale of its Contribution alone or when combined with the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>&quot;Program&quot; means the Contributions
-distributed in accordance with this Agreement.</span> </p>
-
-<p><span style='font-size:10.0pt'>&quot;Recipient&quot; means anyone who
-receives the Program under this Agreement, including all Contributors.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>2. GRANT OF RIGHTS</span></b> </p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-Subject to the terms of this Agreement, each Contributor hereby grants Recipient
-a non-exclusive, worldwide, royalty-free copyright license to<span
-style='color:red'> </span>reproduce, prepare derivative works of, publicly
-display, publicly perform, distribute and sublicense the Contribution of such
-Contributor, if any, and such derivative works, in source code and object code
-form.</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b)
-Subject to the terms of this Agreement, each Contributor hereby grants
-Recipient a non-exclusive, worldwide,<span style='color:green'> </span>royalty-free
-patent license under Licensed Patents to make, use, sell, offer to sell, import
-and otherwise transfer the Contribution of such Contributor, if any, in source
-code and object code form. This patent license shall apply to the combination
-of the Contribution and the Program if, at the time the Contribution is added
-by the Contributor, such addition of the Contribution causes such combination
-to be covered by the Licensed Patents. The patent license shall not apply to
-any other combinations which include the Contribution. No hardware per se is
-licensed hereunder. </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>c)
-Recipient understands that although each Contributor grants the licenses to its
-Contributions set forth herein, no assurances are provided by any Contributor
-that the Program does not infringe the patent or other intellectual property
-rights of any other entity. Each Contributor disclaims any liability to Recipient
-for claims brought by any other entity based on infringement of intellectual
-property rights or otherwise. As a condition to exercising the rights and
-licenses granted hereunder, each Recipient hereby assumes sole responsibility
-to secure any other intellectual property rights needed, if any. For example,
-if a third party patent license is required to allow Recipient to distribute
-the Program, it is Recipient's responsibility to acquire that license before
-distributing the Program.</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>d)
-Each Contributor represents that to its knowledge it has sufficient copyright
-rights in its Contribution, if any, to grant the copyright license set forth in
-this Agreement. </span></p>
-
-<p><b><span style='font-size:10.0pt'>3. REQUIREMENTS</span></b> </p>
-
-<p><span style='font-size:10.0pt'>A Contributor may choose to distribute the
-Program in object code form under its own license agreement, provided that:</span>
-</p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-it complies with the terms and conditions of this Agreement; and</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b)
-its license agreement:</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>i)
-effectively disclaims on behalf of all Contributors all warranties and
-conditions, express and implied, including warranties or conditions of title
-and non-infringement, and implied warranties or conditions of merchantability
-and fitness for a particular purpose; </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>ii)
-effectively excludes on behalf of all Contributors all liability for damages,
-including direct, indirect, special, incidental and consequential damages, such
-as lost profits; </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>iii)
-states that any provisions which differ from this Agreement are offered by that
-Contributor alone and not by any other party; and</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>iv)
-states that source code for the Program is available from such Contributor, and
-informs licensees how to obtain it in a reasonable manner on or through a
-medium customarily used for software exchange.<span style='color:blue'> </span></span></p>
-
-<p><span style='font-size:10.0pt'>When the Program is made available in source
-code form:</span> </p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-it must be made available under this Agreement; and </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b) a
-copy of this Agreement must be included with each copy of the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>Contributors may not remove or alter any
-copyright notices contained within the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>Each Contributor must identify itself as the
-originator of its Contribution, if any, in a manner that reasonably allows
-subsequent Recipients to identify the originator of the Contribution. </span></p>
-
-<p><b><span style='font-size:10.0pt'>4. COMMERCIAL DISTRIBUTION</span></b> </p>
-
-<p><span style='font-size:10.0pt'>Commercial distributors of software may
-accept certain responsibilities with respect to end users, business partners
-and the like. While this license is intended to facilitate the commercial use
-of the Program, the Contributor who includes the Program in a commercial
-product offering should do so in a manner which does not create potential
-liability for other Contributors. Therefore, if a Contributor includes the
-Program in a commercial product offering, such Contributor (&quot;Commercial
-Contributor&quot;) hereby agrees to defend and indemnify every other
-Contributor (&quot;Indemnified Contributor&quot;) against any losses, damages and
-costs (collectively &quot;Losses&quot;) arising from claims, lawsuits and other
-legal actions brought by a third party against the Indemnified Contributor to
-the extent caused by the acts or omissions of such Commercial Contributor in
-connection with its distribution of the Program in a commercial product
-offering. The obligations in this section do not apply to any claims or Losses
-relating to any actual or alleged intellectual property infringement. In order
-to qualify, an Indemnified Contributor must: a) promptly notify the Commercial
-Contributor in writing of such claim, and b) allow the Commercial Contributor
-to control, and cooperate with the Commercial Contributor in, the defense and
-any related settlement negotiations. The Indemnified Contributor may participate
-in any such claim at its own expense.</span> </p>
-
-<p><span style='font-size:10.0pt'>For example, a Contributor might include the
-Program in a commercial product offering, Product X. That Contributor is then a
-Commercial Contributor. If that Commercial Contributor then makes performance
-claims, or offers warranties related to Product X, those performance claims and
-warranties are such Commercial Contributor's responsibility alone. Under this
-section, the Commercial Contributor would have to defend claims against the
-other Contributors related to those performance claims and warranties, and if a
-court requires any other Contributor to pay any damages as a result, the
-Commercial Contributor must pay those damages.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>5. NO WARRANTY</span></b> </p>
-
-<p><span style='font-size:10.0pt'>EXCEPT AS EXPRESSLY SET FORTH IN THIS
-AGREEMENT, THE PROGRAM IS PROVIDED ON AN &quot;AS IS&quot; 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. Each Recipient is solely
-responsible for determining the appropriateness of using and distributing the
-Program and assumes all risks associated with its exercise of rights under this
-Agreement , including but not limited to the risks and costs of program errors,
-compliance with applicable laws, damage to or loss of data, programs or
-equipment, and unavailability or interruption of operations. </span></p>
-
-<p><b><span style='font-size:10.0pt'>6. DISCLAIMER OF LIABILITY</span></b> </p>
-
-<p><span style='font-size:10.0pt'>EXCEPT AS EXPRESSLY SET FORTH IN THIS
-AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY
-OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF
-THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF
-THE POSSIBILITY OF SUCH DAMAGES.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>7. GENERAL</span></b> </p>
-
-<p><span style='font-size:10.0pt'>If any provision of this Agreement is invalid
-or unenforceable under applicable law, it shall not affect the validity or
-enforceability of the remainder of the terms of this Agreement, and without
-further action by the parties hereto, such provision shall be reformed to the
-minimum extent necessary to make such provision valid and enforceable.</span> </p>
-
-<p><span style='font-size:10.0pt'>If Recipient institutes patent litigation
-against any entity (including a cross-claim or counterclaim in a lawsuit)
-alleging that the Program itself (excluding combinations of the Program with
-other software or hardware) infringes such Recipient's patent(s), then such
-Recipient's rights granted under Section 2(b) shall terminate as of the date
-such litigation is filed. </span></p>
-
-<p><span style='font-size:10.0pt'>All Recipient's rights under this Agreement
-shall terminate if it fails to comply with any of the material terms or
-conditions of this Agreement and does not cure such failure in a reasonable
-period of time after becoming aware of such noncompliance. If all Recipient's
-rights under this Agreement terminate, Recipient agrees to cease use and
-distribution of the Program as soon as reasonably practicable. However,
-Recipient's obligations under this Agreement and any licenses granted by
-Recipient relating to the Program shall continue and survive. </span></p>
-
-<p><span style='font-size:10.0pt'>Everyone is permitted to copy and distribute
-copies of this Agreement, but in order to avoid inconsistency the Agreement is
-copyrighted and may only be modified in the following manner. The Agreement
-Steward reserves the right to publish new versions (including revisions) of
-this Agreement from time to time. No one other than the Agreement Steward has
-the right to modify this Agreement. The Eclipse Foundation is the initial
-Agreement Steward. The Eclipse Foundation may assign the responsibility to
-serve as the Agreement Steward to a suitable separate entity. Each new version
-of the Agreement will be given a distinguishing version number. The Program
-(including Contributions) may always be distributed subject to the version of
-the Agreement under which it was received. In addition, after a new version of
-the Agreement is published, Contributor may elect to distribute the Program
-(including its Contributions) under the new version. Except as expressly stated
-in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to
-the intellectual property of any Contributor under this Agreement, whether
-expressly, by implication, estoppel or otherwise. All rights in the Program not
-expressly granted under this Agreement are reserved.</span> </p>
-
-<p><span style='font-size:10.0pt'>This Agreement is governed by the laws of the
-State of New York and the intellectual property laws of the United States of
-America. No party to this Agreement will bring a legal action under this
-Agreement more than one year after the cause of action arose. Each party waives
-its rights to a jury trial in any resulting litigation.</span> </p>
-
-<p class=MsoNormal><![if !supportEmptyParas]>&nbsp;<![endif]><o:p></o:p></p>
-
-</div>
-
-</body>
-
-</html>
diff --git a/assembly/features/org.eclipse.jsf.assembly.feature/feature.properties b/assembly/features/org.eclipse.jsf.assembly.feature/feature.properties
deleted file mode 100644
index dca2899..0000000
--- a/assembly/features/org.eclipse.jsf.assembly.feature/feature.properties
+++ /dev/null
@@ -1,150 +0,0 @@
-###############################################################################
-# Copyright (c) 2005 Oracle Corporation.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-name=JavaServer Faces Tools (JSF) Project
-provider=Eclipse Web Tools Platform
-description=WTP JavaServer Faces Tools (JSF) Project 
-
-# "copyright" property - text of the "Feature Update Copyright"
-copyright=\
-Copyright (c) 2006 Oracle Corporation.\
-All rights reserved. This program and the accompanying materials\
-are made available under the terms of the Eclipse Public License v1.0\
-which accompanies this distribution, and is available at\
-http://www.eclipse.org/legal/epl-v10.html\
-\n\
-Contributors:\n\
-    Oracle Corporation - initial API and implementation\n
-################ end of copyright property ####################################
-
-license=\
-Eclipse Foundation Software User Agreement\n\
-April 14, 2010\n\
-\n\
-Usage Of Content\n\
-\n\
-THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR\n\
-OTHER MATERIALS FOR OPEN SOURCE PROJECTS (COLLECTIVELY "CONTENT").\n\
-USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS\n\
-AGREEMENT AND/OR THE TERMS AND CONDITIONS OF LICENSE AGREEMENTS OR\n\
-NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU\n\
-AGREE THAT YOUR USE OF THE CONTENT IS GOVERNED BY THIS AGREEMENT\n\
-AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS\n\
-OR NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE\n\
-TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND CONDITIONS\n\
-OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED\n\
-BELOW, THEN YOU MAY NOT USE THE CONTENT.\n\
-\n\
-Applicable Licenses\n\
-\n\
-Unless otherwise indicated, all Content made available by the\n\
-Eclipse Foundation is provided to you under the terms and conditions of\n\
-the Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is\n\
-provided with this Content and is also available at http://www.eclipse.org/legal/epl-v10.html.\n\
-For purposes of the EPL, "Program" will mean the Content.\n\
-\n\
-Content includes, but is not limited to, source code, object code,\n\
-documentation and other files maintained in the Eclipse Foundation source code\n\
-repository ("Repository") in software modules ("Modules") and made available\n\
-as downloadable archives ("Downloads").\n\
-\n\
-       - Content may be structured and packaged into modules to facilitate delivering,\n\
-         extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"),\n\
-         plug-in fragments ("Fragments"), and features ("Features").\n\
-       - Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java(TM) ARchive)\n\
-         in a directory named "plugins".\n\
-       - A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.\n\
-         Each Feature may be packaged as a sub-directory in a directory named "features".\n\
-         Within a Feature, files named "feature.xml" may contain a list of the names and version\n\
-         numbers of the Plug-ins and/or Fragments associated with that Feature.\n\
-       - Features may also include other Features ("Included Features"). Within a Feature, files\n\
-         named "feature.xml" may contain a list of the names and version numbers of Included Features.\n\
-\n\
-The terms and conditions governing Plug-ins and Fragments should be\n\
-contained in files named "about.html" ("Abouts"). The terms and\n\
-conditions governing Features and Included Features should be contained\n\
-in files named "license.html" ("Feature Licenses"). Abouts and Feature\n\
-Licenses may be located in any directory of a Download or Module\n\
-including, but not limited to the following locations:\n\
-\n\
-       - The top-level (root) directory\n\
-       - Plug-in and Fragment directories\n\
-       - Inside Plug-ins and Fragments packaged as JARs\n\
-       - Sub-directories of the directory named "src" of certain Plug-ins\n\
-       - Feature directories\n\
-\n\
-Note: if a Feature made available by the Eclipse Foundation is installed using the\n\
-Provisioning Technology (as defined below), you must agree to a license ("Feature \n\
-Update License") during the installation process. If the Feature contains\n\
-Included Features, the Feature Update License should either provide you\n\
-with the terms and conditions governing the Included Features or inform\n\
-you where you can locate them. Feature Update Licenses may be found in\n\
-the "license" property of files named "feature.properties" found within a Feature.\n\
-Such Abouts, Feature Licenses, and Feature Update Licenses contain the\n\
-terms and conditions (or references to such terms and conditions) that\n\
-govern your use of the associated Content in that directory.\n\
-\n\
-THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER\n\
-TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.\n\
-SOME OF THESE OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):\n\
-\n\
-       - Common Public License Version 1.0 (available at http://www.eclipse.org/legal/cpl-v10.html)\n\
-       - Apache Software License 1.1 (available at http://www.apache.org/licenses/LICENSE)\n\
-       - Apache Software License 2.0 (available at http://www.apache.org/licenses/LICENSE-2.0)\n\
-       - Metro Link Public License 1.00 (available at http://www.opengroup.org/openmotif/supporters/metrolink/license.html)\n\
-       - Mozilla Public License Version 1.1 (available at http://www.mozilla.org/MPL/MPL-1.1.html)\n\
-\n\
-IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR\n\
-TO USE OF THE CONTENT. If no About, Feature License, or Feature Update License\n\
-is provided, please contact the Eclipse Foundation to determine what terms and conditions\n\
-govern that particular Content.\n\
-\n\
-\n\Use of Provisioning Technology\n\
-\n\
-The Eclipse Foundation makes available provisioning software, examples of which include,\n\
-but are not limited to, p2 and the Eclipse Update Manager ("Provisioning Technology") for\n\
-the purpose of allowing users to install software, documentation, information and/or\n\
-other materials (collectively "Installable Software"). This capability is provided with\n\
-the intent of allowing such users to install, extend and update Eclipse-based products.\n\
-Information about packaging Installable Software is available at\n\
-http://eclipse.org/equinox/p2/repository_packaging.html ("Specification").\n\
-\n\
-You may use Provisioning Technology to allow other parties to install Installable Software.\n\
-You shall be responsible for enabling the applicable license agreements relating to the\n\
-Installable Software to be presented to, and accepted by, the users of the Provisioning Technology\n\
-in accordance with the Specification. By using Provisioning Technology in such a manner and\n\
-making it available in accordance with the Specification, you further acknowledge your\n\
-agreement to, and the acquisition of all necessary rights to permit the following:\n\
-\n\
-       1. A series of actions may occur ("Provisioning Process") in which a user may execute\n\
-          the Provisioning Technology on a machine ("Target Machine") with the intent of installing,\n\
-          extending or updating the functionality of an Eclipse-based product.\n\
-       2. During the Provisioning Process, the Provisioning Technology may cause third party\n\
-          Installable Software or a portion thereof to be accessed and copied to the Target Machine.\n\
-       3. Pursuant to the Specification, you will provide to the user the terms and conditions that\n\
-          govern the use of the Installable Software ("Installable Software Agreement") and such\n\
-          Installable Software Agreement shall be accessed from the Target Machine in accordance\n\
-          with the Specification. Such Installable Software Agreement must inform the user of the\n\
-          terms and conditions that govern the Installable Software and must solicit acceptance by\n\
-          the end user in the manner prescribed in such Installable Software Agreement. Upon such\n\
-          indication of agreement by the user, the provisioning Technology will complete installation\n\
-          of the Installable Software.\n\
-\n\
-Cryptography\n\
-\n\
-Content may contain encryption software. The country in which you are\n\
-currently may have restrictions on the import, possession, and use,\n\
-and/or re-export to another country, of encryption software. BEFORE\n\
-using any encryption software, please check the country's laws,\n\
-regulations and policies concerning the import, possession, or use, and\n\
-re-export of encryption software, to see if this is permitted.\n\
-\n\
-Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.\n
-########### end of license property ##########################################
diff --git a/assembly/features/org.eclipse.jsf.assembly.feature/feature.xml b/assembly/features/org.eclipse.jsf.assembly.feature/feature.xml
deleted file mode 100644
index 7855173..0000000
--- a/assembly/features/org.eclipse.jsf.assembly.feature/feature.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<feature
-      id="org.eclipse.jsf.assembly.feature"
-      label="%name"
-      version="3.2.1.qualifier"
-      provider-name="%provider"
-      plugin="org.eclipse.jsf.branding">
-
-   <description>
-      %description
-   </description>
-
-   <copyright>
-      %copyright
-   </copyright>
-
-   <license url="license.html">
-      %license
-   </license>
-
-   <includes
-         id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature"
-         version="0.0.0"/>
-
-   <includes
-         id="org.eclipse.jst.webpageeditor.feature"
-         version="0.0.0"/>
-
-   <includes
-         id="org.eclipse.jsf.feature"
-         version="0.0.0"/>
-
-</feature>
diff --git a/assembly/features/org.eclipse.jsf.assembly.feature/license.html b/assembly/features/org.eclipse.jsf.assembly.feature/license.html
deleted file mode 100644
index 14f2e99..0000000
--- a/assembly/features/org.eclipse.jsf.assembly.feature/license.html
+++ /dev/null
@@ -1,99 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3c.org/TR/1999/REC-html401-19991224/loose.dtd">
-<!-- saved from url=(0044)http://www.eclipse.org/legal/epl/notice.html -->
-<HTML><HEAD><TITLE>Eclipse.org Software User Agreement</TITLE>
-<META http-equiv=Content-Type content="text/html; charset=iso-8859-1">
-<META content="MSHTML 6.00.2800.1479" name=GENERATOR></HEAD>
-<BODY lang=EN-US vLink=purple link=blue>
-<H2>Eclipse Foundation Software User Agreement</H2>
-<P>June 06, 2007</P>
-<H3>Usage Of Content</H3>
-<P>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION 
-AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS (COLLECTIVELY "CONTENT"). USE OF 
-THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE 
-TERMS AND CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED 
-BELOW. BY USING THE CONTENT, YOU AGREE THAT YOUR USE OF THE CONTENT IS GOVERNED 
-BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE 
-AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW. IF YOU DO NOT AGREE TO THE 
-TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND CONDITIONS OF ANY 
-APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU 
-MAY NOT USE THE CONTENT.</P>
-<H3>Applicable Licenses</H3>
-<P>Unless otherwise indicated, all Content made available by the Eclipse 
-Foundation is provided to you under the terms and conditions of the Eclipse 
-Public License Version 1.0 ("EPL"). A copy of the EPL is provided with this 
-Content and is also available at <A 
-href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</A>. 
-For purposes of the EPL, "Program" will mean the Content.</P>
-<P>Content includes, but is not limited to, source code, object code, 
-documentation and other files maintained in the Eclipse.org CVS repository 
-("Repository") in CVS modules ("Modules") and made available as downloadable 
-archives ("Downloads").</P>
-<P>Content may be apportioned into plug-ins ("Plug-ins"), plug-in fragments 
-("Fragments"), and features ("Features"). A Feature is a bundle of one or more 
-Plug-ins and/or Fragments and associated material. Files named "feature.xml" may 
-contain a list of the names and version numbers of the Plug-ins and/or Fragments 
-associated with a Feature. Plug-ins and Fragments are located in directories 
-named "plugins" and Features are located in directories named "features".</P>
-<P>Features may also include other Features ("Included Features"). Files named 
-"feature.xml" may contain a list of the names and version numbers of Included 
-Features.</P>
-<P>The terms and conditions governing Plug-ins and Fragments should be contained 
-in files named "about.html" ("Abouts"). The terms and conditions governing 
-Features and Included Features should be contained in files named "license.html" 
-("Feature Licenses"). Abouts and Feature Licenses may be located in any 
-directory of a Download or Module including, but not limited to the following 
-locations:</P>
-<UL>
-  <LI>The top-level (root) directory 
-  <LI>Plug-in and Fragment directories 
-  <LI>Subdirectories of the directory named "src" of certain Plug-ins 
-  <LI>Feature directories </LI></UL>
-<P>Note: if a Feature made available by the Eclipse Foundation is installed 
-using the Eclipse Update Manager, you must agree to a license ("Feature Update 
-License") during the installation process. If the Feature contains Included 
-Features, the Feature Update License should either provide you with the terms 
-and conditions governing the Included Features or inform you where you can 
-locate them. Feature Update Licenses may be found in the "license" property of 
-files named "feature.properties". Such Abouts, Feature Licenses and Feature 
-Update Licenses contain the terms and conditions (or references to such terms 
-and conditions) that govern your use of the associated Content in that 
-directory.</P>
-<P>THE ABOUTS, FEATURE LICENSES AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL 
-OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS. SOME OF THESE 
-OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):</P>
-<UL>
-  <LI>Common Public License Version 1.0 (available at <A 
-  href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</A>) 
-
-  <LI>Apache Software License 1.1 (available at <A 
-  href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</A>) 
-
-  <LI>Apache Software License 2.0 (available at <A 
-  href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</A>) 
-
-  <LI>IBM Public License 1.0 (available at <A 
-  href="http://oss.software.ibm.com/developerworks/opensource/license10.html">http://oss.software.ibm.com/developerworks/opensource/license10.html</A>) 
-
-  <LI>Metro Link Public License 1.00 (available at <A 
-  href="http://www.opengroup.org/openmotif/supporters/metrolink/license.html">http://www.opengroup.org/openmotif/supporters/metrolink/license.html</A>) 
-
-  <LI>Mozilla Public License Version 1.1 (available at <A 
-  href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</A>) 
-  </LI>
-    
-  <LI>Common Development and Distribution License (CDDL) Version 1.0 (available at <A 
-  href="http://www.sun.com/cddl/cddl.html">http://www.sun.com/cddl/cddl.html)</A>
-  </LI>
-</UL>
-<P>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR 
-TO USE OF THE CONTENT. If no About, Feature License or Feature Update License is 
-provided, please contact the Eclipse Foundation to determine what terms and 
-conditions govern that particular Content.</P>
-<H3>Cryptography</H3>
-<P>Content may contain encryption software. The country in which you are 
-currently may have restrictions on the import, possession, and use, and/or 
-re-export to another country, of encryption software. BEFORE using any 
-encryption software, please check the country's laws, regulations and policies 
-concerning the import, possession, or use, and re-export of encryption software, 
-to see if this is permitted.</P></BODY></HTML>
-
diff --git a/assembly/features/org.eclipse.jsf_sdk.assembly.feature/.cvsignore b/assembly/features/org.eclipse.jsf_sdk.assembly.feature/.cvsignore
deleted file mode 100644
index bc2abf7..0000000
--- a/assembly/features/org.eclipse.jsf_sdk.assembly.feature/.cvsignore
+++ /dev/null
@@ -1,4 +0,0 @@
-*.bin.dist.zip
-build.xml
-features
-plugins
diff --git a/assembly/features/org.eclipse.jsf_sdk.assembly.feature/.project b/assembly/features/org.eclipse.jsf_sdk.assembly.feature/.project
deleted file mode 100644
index 8a30754..0000000
--- a/assembly/features/org.eclipse.jsf_sdk.assembly.feature/.project
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.jsf_sdk.assembly.feature</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.pde.FeatureBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.FeatureNature</nature>
-	</natures>
-</projectDescription>
diff --git a/assembly/features/org.eclipse.jsf_sdk.assembly.feature/build.properties b/assembly/features/org.eclipse.jsf_sdk.assembly.feature/build.properties
deleted file mode 100644
index e69de29..0000000
--- a/assembly/features/org.eclipse.jsf_sdk.assembly.feature/build.properties
+++ /dev/null
diff --git a/assembly/features/org.eclipse.jsf_sdk.assembly.feature/eclipse_update_120.jpg b/assembly/features/org.eclipse.jsf_sdk.assembly.feature/eclipse_update_120.jpg
deleted file mode 100644
index bfdf708..0000000
--- a/assembly/features/org.eclipse.jsf_sdk.assembly.feature/eclipse_update_120.jpg
+++ /dev/null
Binary files differ
diff --git a/assembly/features/org.eclipse.jsf_sdk.assembly.feature/epl-v10.html b/assembly/features/org.eclipse.jsf_sdk.assembly.feature/epl-v10.html
deleted file mode 100644
index ed4b196..0000000
--- a/assembly/features/org.eclipse.jsf_sdk.assembly.feature/epl-v10.html
+++ /dev/null
@@ -1,328 +0,0 @@
-<html xmlns:o="urn:schemas-microsoft-com:office:office"
-xmlns:w="urn:schemas-microsoft-com:office:word"
-xmlns="http://www.w3.org/TR/REC-html40">
-
-<head>
-<meta http-equiv=Content-Type content="text/html; charset=windows-1252">
-<meta name=ProgId content=Word.Document>
-<meta name=Generator content="Microsoft Word 9">
-<meta name=Originator content="Microsoft Word 9">
-<link rel=File-List
-href="./Eclipse%20EPL%202003_11_10%20Final_files/filelist.xml">
-<title>Eclipse Public License - Version 1.0</title>
-<!--[if gte mso 9]><xml>
- <o:DocumentProperties>
-  <o:Revision>2</o:Revision>
-  <o:TotalTime>3</o:TotalTime>
-  <o:Created>2004-03-05T23:03:00Z</o:Created>
-  <o:LastSaved>2004-03-05T23:03:00Z</o:LastSaved>
-  <o:Pages>4</o:Pages>
-  <o:Words>1626</o:Words>
-  <o:Characters>9270</o:Characters>
-   <o:Lines>77</o:Lines>
-  <o:Paragraphs>18</o:Paragraphs>
-  <o:CharactersWithSpaces>11384</o:CharactersWithSpaces>
-  <o:Version>9.4402</o:Version>
- </o:DocumentProperties>
-</xml><![endif]--><!--[if gte mso 9]><xml>
- <w:WordDocument>
-  <w:TrackRevisions/>
- </w:WordDocument>
-</xml><![endif]-->
-<style>
-<!--
- /* Font Definitions */
-@font-face
-	{font-family:Tahoma;
-	panose-1:2 11 6 4 3 5 4 4 2 4;
-	mso-font-charset:0;
-	mso-generic-font-family:swiss;
-	mso-font-pitch:variable;
-	mso-font-signature:553679495 -2147483648 8 0 66047 0;}
- /* Style Definitions */
-p.MsoNormal, li.MsoNormal, div.MsoNormal
-	{mso-style-parent:"";
-	margin:0in;
-	margin-bottom:.0001pt;
-	mso-pagination:widow-orphan;
-	font-size:12.0pt;
-	font-family:"Times New Roman";
-	mso-fareast-font-family:"Times New Roman";}
-p
-	{margin-right:0in;
-	mso-margin-top-alt:auto;
-	mso-margin-bottom-alt:auto;
-	margin-left:0in;
-	mso-pagination:widow-orphan;
-	font-size:12.0pt;
-	font-family:"Times New Roman";
-	mso-fareast-font-family:"Times New Roman";}
-p.BalloonText, li.BalloonText, div.BalloonText
-	{mso-style-name:"Balloon Text";
-	margin:0in;
-	margin-bottom:.0001pt;
-	mso-pagination:widow-orphan;
-	font-size:8.0pt;
-	font-family:Tahoma;
-	mso-fareast-font-family:"Times New Roman";}
-@page Section1
-	{size:8.5in 11.0in;
-	margin:1.0in 1.25in 1.0in 1.25in;
-	mso-header-margin:.5in;
-	mso-footer-margin:.5in;
-	mso-paper-source:0;}
-div.Section1
-	{page:Section1;}
--->
-</style>
-</head>
-
-<body lang=EN-US style='tab-interval:.5in'>
-
-<div class=Section1>
-
-<p align=center style='text-align:center'><b>Eclipse Public License - v 1.0</b>
-</p>
-
-<p><span style='font-size:10.0pt'>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER
-THE TERMS OF THIS ECLIPSE PUBLIC LICENSE (&quot;AGREEMENT&quot;). ANY USE,
-REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE
-OF THIS AGREEMENT.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>1. DEFINITIONS</span></b> </p>
-
-<p><span style='font-size:10.0pt'>&quot;Contribution&quot; means:</span> </p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-in the case of the initial Contributor, the initial code and documentation
-distributed under this Agreement, and<br clear=left>
-b) in the case of each subsequent Contributor:</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>i)
-changes to the Program, and</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>ii)
-additions to the Program;</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>where
-such changes and/or additions to the Program originate from and are distributed
-by that particular Contributor. A Contribution 'originates' from a Contributor
-if it was added to the Program by such Contributor itself or anyone acting on
-such Contributor's behalf. Contributions do not include additions to the
-Program which: (i) are separate modules of software distributed in conjunction
-with the Program under their own license agreement, and (ii) are not derivative
-works of the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>&quot;Contributor&quot; means any person or
-entity that distributes the Program.</span> </p>
-
-<p><span style='font-size:10.0pt'>&quot;Licensed Patents &quot; mean patent
-claims licensable by a Contributor which are necessarily infringed by the use
-or sale of its Contribution alone or when combined with the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>&quot;Program&quot; means the Contributions
-distributed in accordance with this Agreement.</span> </p>
-
-<p><span style='font-size:10.0pt'>&quot;Recipient&quot; means anyone who
-receives the Program under this Agreement, including all Contributors.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>2. GRANT OF RIGHTS</span></b> </p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-Subject to the terms of this Agreement, each Contributor hereby grants Recipient
-a non-exclusive, worldwide, royalty-free copyright license to<span
-style='color:red'> </span>reproduce, prepare derivative works of, publicly
-display, publicly perform, distribute and sublicense the Contribution of such
-Contributor, if any, and such derivative works, in source code and object code
-form.</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b)
-Subject to the terms of this Agreement, each Contributor hereby grants
-Recipient a non-exclusive, worldwide,<span style='color:green'> </span>royalty-free
-patent license under Licensed Patents to make, use, sell, offer to sell, import
-and otherwise transfer the Contribution of such Contributor, if any, in source
-code and object code form. This patent license shall apply to the combination
-of the Contribution and the Program if, at the time the Contribution is added
-by the Contributor, such addition of the Contribution causes such combination
-to be covered by the Licensed Patents. The patent license shall not apply to
-any other combinations which include the Contribution. No hardware per se is
-licensed hereunder. </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>c)
-Recipient understands that although each Contributor grants the licenses to its
-Contributions set forth herein, no assurances are provided by any Contributor
-that the Program does not infringe the patent or other intellectual property
-rights of any other entity. Each Contributor disclaims any liability to Recipient
-for claims brought by any other entity based on infringement of intellectual
-property rights or otherwise. As a condition to exercising the rights and
-licenses granted hereunder, each Recipient hereby assumes sole responsibility
-to secure any other intellectual property rights needed, if any. For example,
-if a third party patent license is required to allow Recipient to distribute
-the Program, it is Recipient's responsibility to acquire that license before
-distributing the Program.</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>d)
-Each Contributor represents that to its knowledge it has sufficient copyright
-rights in its Contribution, if any, to grant the copyright license set forth in
-this Agreement. </span></p>
-
-<p><b><span style='font-size:10.0pt'>3. REQUIREMENTS</span></b> </p>
-
-<p><span style='font-size:10.0pt'>A Contributor may choose to distribute the
-Program in object code form under its own license agreement, provided that:</span>
-</p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-it complies with the terms and conditions of this Agreement; and</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b)
-its license agreement:</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>i)
-effectively disclaims on behalf of all Contributors all warranties and
-conditions, express and implied, including warranties or conditions of title
-and non-infringement, and implied warranties or conditions of merchantability
-and fitness for a particular purpose; </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>ii)
-effectively excludes on behalf of all Contributors all liability for damages,
-including direct, indirect, special, incidental and consequential damages, such
-as lost profits; </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>iii)
-states that any provisions which differ from this Agreement are offered by that
-Contributor alone and not by any other party; and</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>iv)
-states that source code for the Program is available from such Contributor, and
-informs licensees how to obtain it in a reasonable manner on or through a
-medium customarily used for software exchange.<span style='color:blue'> </span></span></p>
-
-<p><span style='font-size:10.0pt'>When the Program is made available in source
-code form:</span> </p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-it must be made available under this Agreement; and </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b) a
-copy of this Agreement must be included with each copy of the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>Contributors may not remove or alter any
-copyright notices contained within the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>Each Contributor must identify itself as the
-originator of its Contribution, if any, in a manner that reasonably allows
-subsequent Recipients to identify the originator of the Contribution. </span></p>
-
-<p><b><span style='font-size:10.0pt'>4. COMMERCIAL DISTRIBUTION</span></b> </p>
-
-<p><span style='font-size:10.0pt'>Commercial distributors of software may
-accept certain responsibilities with respect to end users, business partners
-and the like. While this license is intended to facilitate the commercial use
-of the Program, the Contributor who includes the Program in a commercial
-product offering should do so in a manner which does not create potential
-liability for other Contributors. Therefore, if a Contributor includes the
-Program in a commercial product offering, such Contributor (&quot;Commercial
-Contributor&quot;) hereby agrees to defend and indemnify every other
-Contributor (&quot;Indemnified Contributor&quot;) against any losses, damages and
-costs (collectively &quot;Losses&quot;) arising from claims, lawsuits and other
-legal actions brought by a third party against the Indemnified Contributor to
-the extent caused by the acts or omissions of such Commercial Contributor in
-connection with its distribution of the Program in a commercial product
-offering. The obligations in this section do not apply to any claims or Losses
-relating to any actual or alleged intellectual property infringement. In order
-to qualify, an Indemnified Contributor must: a) promptly notify the Commercial
-Contributor in writing of such claim, and b) allow the Commercial Contributor
-to control, and cooperate with the Commercial Contributor in, the defense and
-any related settlement negotiations. The Indemnified Contributor may participate
-in any such claim at its own expense.</span> </p>
-
-<p><span style='font-size:10.0pt'>For example, a Contributor might include the
-Program in a commercial product offering, Product X. That Contributor is then a
-Commercial Contributor. If that Commercial Contributor then makes performance
-claims, or offers warranties related to Product X, those performance claims and
-warranties are such Commercial Contributor's responsibility alone. Under this
-section, the Commercial Contributor would have to defend claims against the
-other Contributors related to those performance claims and warranties, and if a
-court requires any other Contributor to pay any damages as a result, the
-Commercial Contributor must pay those damages.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>5. NO WARRANTY</span></b> </p>
-
-<p><span style='font-size:10.0pt'>EXCEPT AS EXPRESSLY SET FORTH IN THIS
-AGREEMENT, THE PROGRAM IS PROVIDED ON AN &quot;AS IS&quot; 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. Each Recipient is solely
-responsible for determining the appropriateness of using and distributing the
-Program and assumes all risks associated with its exercise of rights under this
-Agreement , including but not limited to the risks and costs of program errors,
-compliance with applicable laws, damage to or loss of data, programs or
-equipment, and unavailability or interruption of operations. </span></p>
-
-<p><b><span style='font-size:10.0pt'>6. DISCLAIMER OF LIABILITY</span></b> </p>
-
-<p><span style='font-size:10.0pt'>EXCEPT AS EXPRESSLY SET FORTH IN THIS
-AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY
-OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF
-THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF
-THE POSSIBILITY OF SUCH DAMAGES.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>7. GENERAL</span></b> </p>
-
-<p><span style='font-size:10.0pt'>If any provision of this Agreement is invalid
-or unenforceable under applicable law, it shall not affect the validity or
-enforceability of the remainder of the terms of this Agreement, and without
-further action by the parties hereto, such provision shall be reformed to the
-minimum extent necessary to make such provision valid and enforceable.</span> </p>
-
-<p><span style='font-size:10.0pt'>If Recipient institutes patent litigation
-against any entity (including a cross-claim or counterclaim in a lawsuit)
-alleging that the Program itself (excluding combinations of the Program with
-other software or hardware) infringes such Recipient's patent(s), then such
-Recipient's rights granted under Section 2(b) shall terminate as of the date
-such litigation is filed. </span></p>
-
-<p><span style='font-size:10.0pt'>All Recipient's rights under this Agreement
-shall terminate if it fails to comply with any of the material terms or
-conditions of this Agreement and does not cure such failure in a reasonable
-period of time after becoming aware of such noncompliance. If all Recipient's
-rights under this Agreement terminate, Recipient agrees to cease use and
-distribution of the Program as soon as reasonably practicable. However,
-Recipient's obligations under this Agreement and any licenses granted by
-Recipient relating to the Program shall continue and survive. </span></p>
-
-<p><span style='font-size:10.0pt'>Everyone is permitted to copy and distribute
-copies of this Agreement, but in order to avoid inconsistency the Agreement is
-copyrighted and may only be modified in the following manner. The Agreement
-Steward reserves the right to publish new versions (including revisions) of
-this Agreement from time to time. No one other than the Agreement Steward has
-the right to modify this Agreement. The Eclipse Foundation is the initial
-Agreement Steward. The Eclipse Foundation may assign the responsibility to
-serve as the Agreement Steward to a suitable separate entity. Each new version
-of the Agreement will be given a distinguishing version number. The Program
-(including Contributions) may always be distributed subject to the version of
-the Agreement under which it was received. In addition, after a new version of
-the Agreement is published, Contributor may elect to distribute the Program
-(including its Contributions) under the new version. Except as expressly stated
-in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to
-the intellectual property of any Contributor under this Agreement, whether
-expressly, by implication, estoppel or otherwise. All rights in the Program not
-expressly granted under this Agreement are reserved.</span> </p>
-
-<p><span style='font-size:10.0pt'>This Agreement is governed by the laws of the
-State of New York and the intellectual property laws of the United States of
-America. No party to this Agreement will bring a legal action under this
-Agreement more than one year after the cause of action arose. Each party waives
-its rights to a jury trial in any resulting litigation.</span> </p>
-
-<p class=MsoNormal><![if !supportEmptyParas]>&nbsp;<![endif]><o:p></o:p></p>
-
-</div>
-
-</body>
-
-</html>
\ No newline at end of file
diff --git a/assembly/features/org.eclipse.jsf_sdk.assembly.feature/feature.properties b/assembly/features/org.eclipse.jsf_sdk.assembly.feature/feature.properties
deleted file mode 100644
index 70bca85..0000000
--- a/assembly/features/org.eclipse.jsf_sdk.assembly.feature/feature.properties
+++ /dev/null
@@ -1,158 +0,0 @@
-###############################################################################
-# Copyright (c) 2006 Oracle.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle. - initial API and implementation
-###############################################################################
-name=JavaServer Faces Tools (JSF) Project SDK
-provider=Eclipse Web Tools Platform
-description=WTP JavaServer Faces Tools (JSF) Project  SDK
-
-
-
-# "copyright" property - text of the "Feature Update Copyright"
-copyright=\
-Copyright (c) 2006 Oracle Corporation.\n\
-All rights reserved. This program and the accompanying materials\n\
-are made available under the terms of the Eclipse Public License v1.0\n\
-which accompanies this distribution, and is available at\n\
-http://www.eclipse.org/legal/epl-v10.html\n\
-\n\
-Contributors:\n\
-    Oracle - initial API and implementation\n
-################ end of copyright property ####################################
-
-# "licenseURL" property - URL of the "Feature License"
-# do not translate value - just change to point to a locale-specific HTML page
-licenseURL=license.html
-
-# "license" property - text of the "Feature Update License"
-# should be plain text version of license agreement pointed to be "licenseURL"
-license=\
-Eclipse Foundation Software User Agreement\n\
-April 14, 2010\n\
-\n\
-Usage Of Content\n\
-\n\
-THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR\n\
-OTHER MATERIALS FOR OPEN SOURCE PROJECTS (COLLECTIVELY "CONTENT").\n\
-USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS\n\
-AGREEMENT AND/OR THE TERMS AND CONDITIONS OF LICENSE AGREEMENTS OR\n\
-NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU\n\
-AGREE THAT YOUR USE OF THE CONTENT IS GOVERNED BY THIS AGREEMENT\n\
-AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS\n\
-OR NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE\n\
-TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND CONDITIONS\n\
-OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED\n\
-BELOW, THEN YOU MAY NOT USE THE CONTENT.\n\
-\n\
-Applicable Licenses\n\
-\n\
-Unless otherwise indicated, all Content made available by the\n\
-Eclipse Foundation is provided to you under the terms and conditions of\n\
-the Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is\n\
-provided with this Content and is also available at http://www.eclipse.org/legal/epl-v10.html.\n\
-For purposes of the EPL, "Program" will mean the Content.\n\
-\n\
-Content includes, but is not limited to, source code, object code,\n\
-documentation and other files maintained in the Eclipse Foundation source code\n\
-repository ("Repository") in software modules ("Modules") and made available\n\
-as downloadable archives ("Downloads").\n\
-\n\
-       - Content may be structured and packaged into modules to facilitate delivering,\n\
-         extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"),\n\
-         plug-in fragments ("Fragments"), and features ("Features").\n\
-       - Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java(TM) ARchive)\n\
-         in a directory named "plugins".\n\
-       - A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.\n\
-         Each Feature may be packaged as a sub-directory in a directory named "features".\n\
-         Within a Feature, files named "feature.xml" may contain a list of the names and version\n\
-         numbers of the Plug-ins and/or Fragments associated with that Feature.\n\
-       - Features may also include other Features ("Included Features"). Within a Feature, files\n\
-         named "feature.xml" may contain a list of the names and version numbers of Included Features.\n\
-\n\
-The terms and conditions governing Plug-ins and Fragments should be\n\
-contained in files named "about.html" ("Abouts"). The terms and\n\
-conditions governing Features and Included Features should be contained\n\
-in files named "license.html" ("Feature Licenses"). Abouts and Feature\n\
-Licenses may be located in any directory of a Download or Module\n\
-including, but not limited to the following locations:\n\
-\n\
-       - The top-level (root) directory\n\
-       - Plug-in and Fragment directories\n\
-       - Inside Plug-ins and Fragments packaged as JARs\n\
-       - Sub-directories of the directory named "src" of certain Plug-ins\n\
-       - Feature directories\n\
-\n\
-Note: if a Feature made available by the Eclipse Foundation is installed using the\n\
-Provisioning Technology (as defined below), you must agree to a license ("Feature \n\
-Update License") during the installation process. If the Feature contains\n\
-Included Features, the Feature Update License should either provide you\n\
-with the terms and conditions governing the Included Features or inform\n\
-you where you can locate them. Feature Update Licenses may be found in\n\
-the "license" property of files named "feature.properties" found within a Feature.\n\
-Such Abouts, Feature Licenses, and Feature Update Licenses contain the\n\
-terms and conditions (or references to such terms and conditions) that\n\
-govern your use of the associated Content in that directory.\n\
-\n\
-THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER\n\
-TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.\n\
-SOME OF THESE OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):\n\
-\n\
-       - Common Public License Version 1.0 (available at http://www.eclipse.org/legal/cpl-v10.html)\n\
-       - Apache Software License 1.1 (available at http://www.apache.org/licenses/LICENSE)\n\
-       - Apache Software License 2.0 (available at http://www.apache.org/licenses/LICENSE-2.0)\n\
-       - Metro Link Public License 1.00 (available at http://www.opengroup.org/openmotif/supporters/metrolink/license.html)\n\
-       - Mozilla Public License Version 1.1 (available at http://www.mozilla.org/MPL/MPL-1.1.html)\n\
-\n\
-IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR\n\
-TO USE OF THE CONTENT. If no About, Feature License, or Feature Update License\n\
-is provided, please contact the Eclipse Foundation to determine what terms and conditions\n\
-govern that particular Content.\n\
-\n\
-\n\Use of Provisioning Technology\n\
-\n\
-The Eclipse Foundation makes available provisioning software, examples of which include,\n\
-but are not limited to, p2 and the Eclipse Update Manager ("Provisioning Technology") for\n\
-the purpose of allowing users to install software, documentation, information and/or\n\
-other materials (collectively "Installable Software"). This capability is provided with\n\
-the intent of allowing such users to install, extend and update Eclipse-based products.\n\
-Information about packaging Installable Software is available at\n\
-http://eclipse.org/equinox/p2/repository_packaging.html ("Specification").\n\
-\n\
-You may use Provisioning Technology to allow other parties to install Installable Software.\n\
-You shall be responsible for enabling the applicable license agreements relating to the\n\
-Installable Software to be presented to, and accepted by, the users of the Provisioning Technology\n\
-in accordance with the Specification. By using Provisioning Technology in such a manner and\n\
-making it available in accordance with the Specification, you further acknowledge your\n\
-agreement to, and the acquisition of all necessary rights to permit the following:\n\
-\n\
-       1. A series of actions may occur ("Provisioning Process") in which a user may execute\n\
-          the Provisioning Technology on a machine ("Target Machine") with the intent of installing,\n\
-          extending or updating the functionality of an Eclipse-based product.\n\
-       2. During the Provisioning Process, the Provisioning Technology may cause third party\n\
-          Installable Software or a portion thereof to be accessed and copied to the Target Machine.\n\
-       3. Pursuant to the Specification, you will provide to the user the terms and conditions that\n\
-          govern the use of the Installable Software ("Installable Software Agreement") and such\n\
-          Installable Software Agreement shall be accessed from the Target Machine in accordance\n\
-          with the Specification. Such Installable Software Agreement must inform the user of the\n\
-          terms and conditions that govern the Installable Software and must solicit acceptance by\n\
-          the end user in the manner prescribed in such Installable Software Agreement. Upon such\n\
-          indication of agreement by the user, the provisioning Technology will complete installation\n\
-          of the Installable Software.\n\
-\n\
-Cryptography\n\
-\n\
-Content may contain encryption software. The country in which you are\n\
-currently may have restrictions on the import, possession, and use,\n\
-and/or re-export to another country, of encryption software. BEFORE\n\
-using any encryption software, please check the country's laws,\n\
-regulations and policies concerning the import, possession, or use, and\n\
-re-export of encryption software, to see if this is permitted.\n\
-\n\
-Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.\n
-########### end of license property ##########################################
diff --git a/assembly/features/org.eclipse.jsf_sdk.assembly.feature/feature.xml b/assembly/features/org.eclipse.jsf_sdk.assembly.feature/feature.xml
deleted file mode 100644
index 0abfb98..0000000
--- a/assembly/features/org.eclipse.jsf_sdk.assembly.feature/feature.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<feature
-      id="org.eclipse.jsf_sdk.assembly.feature"
-      label="%featureName"
-      version="3.2.1.qualifier"
-      provider-name="%providerName"
-      image="eclipse_update_120.jpg">
-
-   <description>
-      %description
-   </description>
-
-   <copyright>
-      %copyright
-   </copyright>
-
-   <license url="license.html">
-      %license
-   </license>
-
-   <includes
-         id="org.eclipse.jst.jsf.apache.trinidad.tagsupport_sdk.feature"
-         version="0.0.0"/>
-
-   <includes
-         id="org.eclipse.jst.webpageeditor_sdk.feature"
-         version="0.0.0"/>
-
-   <includes
-         id="org.eclipse.jsf_sdk.feature"
-         version="0.0.0"/>
-
-</feature>
diff --git a/assembly/features/org.eclipse.jsf_sdk.assembly.feature/license.html b/assembly/features/org.eclipse.jsf_sdk.assembly.feature/license.html
deleted file mode 100644
index c184ca3..0000000
--- a/assembly/features/org.eclipse.jsf_sdk.assembly.feature/license.html
+++ /dev/null
@@ -1,107 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1" ?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
-<title>Eclipse Foundation Software User Agreement</title>
-</head>
-
-<body lang="EN-US">
-<h2>Eclipse Foundation Software User Agreement</h2>
-<p>April 14, 2010</p>
-
-<h3>Usage Of Content</h3>
-
-<p>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS
-   (COLLECTIVELY &quot;CONTENT&quot;).  USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND
-   CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU AGREE THAT YOUR USE
-   OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR
-   NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND
-   CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.</p>
-
-<h3>Applicable Licenses</h3>
-
-<p>Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0
-   (&quot;EPL&quot;).  A copy of the EPL is provided with this Content and is also available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-   For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse Foundation source code
-   repository (&quot;Repository&quot;) in software modules (&quot;Modules&quot;) and made available as downloadable archives (&quot;Downloads&quot;).</p>
-
-<ul>
-       <li>Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content.  Typical modules may include plug-ins (&quot;Plug-ins&quot;), plug-in fragments (&quot;Fragments&quot;), and features (&quot;Features&quot;).</li>
-       <li>Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java&trade; ARchive) in a directory named &quot;plugins&quot;.</li>
-       <li>A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.  Each Feature may be packaged as a sub-directory in a directory named &quot;features&quot;.  Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of the Plug-ins
-      and/or Fragments associated with that Feature.</li>
-       <li>Features may also include other Features (&quot;Included Features&quot;). Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of Included Features.</li>
-</ul>
-
-<p>The terms and conditions governing Plug-ins and Fragments should be contained in files named &quot;about.html&quot; (&quot;Abouts&quot;). The terms and conditions governing Features and
-Included Features should be contained in files named &quot;license.html&quot; (&quot;Feature Licenses&quot;).  Abouts and Feature Licenses may be located in any directory of a Download or Module
-including, but not limited to the following locations:</p>
-
-<ul>
-       <li>The top-level (root) directory</li>
-       <li>Plug-in and Fragment directories</li>
-       <li>Inside Plug-ins and Fragments packaged as JARs</li>
-       <li>Sub-directories of the directory named &quot;src&quot; of certain Plug-ins</li>
-       <li>Feature directories</li>
-</ul>
-
-<p>Note: if a Feature made available by the Eclipse Foundation is installed using the Provisioning Technology (as defined below), you must agree to a license (&quot;Feature Update License&quot;) during the
-installation process.  If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or
-inform you where you can locate them.  Feature Update Licenses may be found in the &quot;license&quot; property of files named &quot;feature.properties&quot; found within a Feature.
-Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in
-that directory.</p>
-
-<p>THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.  SOME OF THESE
-OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):</p>
-
-<ul>
-       <li>Common Public License Version 1.0 (available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>)</li>
-       <li>Apache Software License 1.1 (available at <a href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</a>)</li>
-       <li>Apache Software License 2.0 (available at <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>)</li>
-       <li>Metro Link Public License 1.00 (available at <a href="http://www.opengroup.org/openmotif/supporters/metrolink/license.html">http://www.opengroup.org/openmotif/supporters/metrolink/license.html</a>)</li>
-       <li>Mozilla Public License Version 1.1 (available at <a href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</a>)</li>
-</ul>
-
-<p>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT.  If no About, Feature License, or Feature Update License is provided, please
-contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.</p>
-
-
-<h3>Use of Provisioning Technology</h3>
-
-<p>The Eclipse Foundation makes available provisioning software, examples of which include, but are not limited to, p2 and the Eclipse
-   Update Manager (&quot;Provisioning Technology&quot;) for the purpose of allowing users to install software, documentation, information and/or
-   other materials (collectively &quot;Installable Software&quot;). This capability is provided with the intent of allowing such users to
-   install, extend and update Eclipse-based products. Information about packaging Installable Software is available at <a
-       href="http://eclipse.org/equinox/p2/repository_packaging.html">http://eclipse.org/equinox/p2/repository_packaging.html</a>
-   (&quot;Specification&quot;).</p>
-
-<p>You may use Provisioning Technology to allow other parties to install Installable Software. You shall be responsible for enabling the
-   applicable license agreements relating to the Installable Software to be presented to, and accepted by, the users of the Provisioning Technology
-   in accordance with the Specification. By using Provisioning Technology in such a manner and making it available in accordance with the
-   Specification, you further acknowledge your agreement to, and the acquisition of all necessary rights to permit the following:</p>
-
-<ol>
-       <li>A series of actions may occur (&quot;Provisioning Process&quot;) in which a user may execute the Provisioning Technology
-       on a machine (&quot;Target Machine&quot;) with the intent of installing, extending or updating the functionality of an Eclipse-based
-       product.</li>
-       <li>During the Provisioning Process, the Provisioning Technology may cause third party Installable Software or a portion thereof to be
-       accessed and copied to the Target Machine.</li>
-       <li>Pursuant to the Specification, you will provide to the user the terms and conditions that govern the use of the Installable
-       Software (&quot;Installable Software Agreement&quot;) and such Installable Software Agreement shall be accessed from the Target
-       Machine in accordance with the Specification. Such Installable Software Agreement must inform the user of the terms and conditions that govern
-       the Installable Software and must solicit acceptance by the end user in the manner prescribed in such Installable Software Agreement. Upon such
-       indication of agreement by the user, the provisioning Technology will complete installation of the Installable Software.</li>
-</ol>
-
-<h3>Cryptography</h3>
-
-<p>Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to
-   another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import,
-   possession, or use, and re-export of encryption software, to see if this is permitted.</p>
-
-<p><small>Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.</small></p>
-</body>
-</html>
diff --git a/assembly/plugins/org.eclipse.jsf.branding/.cvsignore b/assembly/plugins/org.eclipse.jsf.branding/.cvsignore
deleted file mode 100644
index 7033a79..0000000
--- a/assembly/plugins/org.eclipse.jsf.branding/.cvsignore
+++ /dev/null
@@ -1,4 +0,0 @@
-bin
-@dot*
-temp.folder
-build.xml
diff --git a/assembly/plugins/org.eclipse.jsf.branding/.project b/assembly/plugins/org.eclipse.jsf.branding/.project
deleted file mode 100644
index c1c23a4..0000000
--- a/assembly/plugins/org.eclipse.jsf.branding/.project
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.jsf.branding</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-	</natures>
-</projectDescription>
diff --git a/assembly/plugins/org.eclipse.jsf.branding/META-INF/MANIFEST.MF b/assembly/plugins/org.eclipse.jsf.branding/META-INF/MANIFEST.MF
deleted file mode 100644
index b295675..0000000
--- a/assembly/plugins/org.eclipse.jsf.branding/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,7 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %plugin.Name
-Bundle-SymbolicName: org.eclipse.jsf.branding
-Bundle-Version: 3.2.0.qualifier
-Bundle-Localization: plugin
-Bundle-Vendor: %plugin.Provider
diff --git a/assembly/plugins/org.eclipse.jsf.branding/about.html b/assembly/plugins/org.eclipse.jsf.branding/about.html
deleted file mode 100644
index 7c80c6c..0000000
--- a/assembly/plugins/org.eclipse.jsf.branding/about.html
+++ /dev/null
@@ -1,22 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<head>
-<title>About</title>
-<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>June 06, 2007</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise indicated below, the Content is provided to you under the terms and conditions of the
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content.</p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/assembly/plugins/org.eclipse.jsf.branding/about.ini b/assembly/plugins/org.eclipse.jsf.branding/about.ini
deleted file mode 100644
index 0aac4fb..0000000
--- a/assembly/plugins/org.eclipse.jsf.branding/about.ini
+++ /dev/null
@@ -1,40 +0,0 @@
-###############################################################################
-# Copyright (c) 2006, 2009 Oracle.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation. - initial API and implementation
-###############################################################################
-
-# about.ini
-# contains information about a feature
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# "%key" are externalized strings defined in about.properties
-# This file does not need to be translated.
-
-# Property "aboutText" contains blurb for "About" dialog (translated)
-aboutText=%blurb
-
-# Property "windowImage" contains path to window icon (16x16)
-# needed for primary features only
-
-# Property "featureImage" contains path to feature image (32x32)
-featureImage=icons/WTP_icon_x32_v2.png
-
-# Property "aboutImage" contains path to product image (500x330 or 115x164)
-# needed for primary features only
-
-# Property "appName" contains name of the application (translated)
-# needed for primary features only
-
-# Property "welcomePage" contains path to welcome page (special XML-based format)
-# optional
-
-# Property "welcomePerspective" contains the id of the perspective in which the
-# welcome page is to be opened.
-# optional
-
-
diff --git a/assembly/plugins/org.eclipse.jsf.branding/about.mappings b/assembly/plugins/org.eclipse.jsf.branding/about.mappings
deleted file mode 100644
index bddaab4..0000000
--- a/assembly/plugins/org.eclipse.jsf.branding/about.mappings
+++ /dev/null
@@ -1,6 +0,0 @@
-# about.mappings
-# contains fill-ins for about.properties
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# This file does not need to be translated.
-
-0=@build@
\ No newline at end of file
diff --git a/assembly/plugins/org.eclipse.jsf.branding/about.properties b/assembly/plugins/org.eclipse.jsf.branding/about.properties
deleted file mode 100644
index 9e7f778..0000000
--- a/assembly/plugins/org.eclipse.jsf.branding/about.properties
+++ /dev/null
@@ -1,24 +0,0 @@
-###############################################################################
-# Copyright (c) 2005 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-
-# about.properties
-# contains externalized strings for about.ini
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# fill-ins are supplied by about.mappings
-# This file should be translated.
-
-blurb=JavaServer Faces Tools\n\
-\n\
-Version: {featureVersion}\n\
-Build id: {0}\n\
-\n\
-(c) Copyright Oracle contributors and others 2006, 2009.  All rights reserved.\n\
-Visit http://www.eclipse.org/webtools
diff --git a/assembly/plugins/org.eclipse.jsf.branding/build.properties b/assembly/plugins/org.eclipse.jsf.branding/build.properties
deleted file mode 100644
index 094e1ae..0000000
--- a/assembly/plugins/org.eclipse.jsf.branding/build.properties
+++ /dev/null
@@ -1,20 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2006 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-bin.includes = META-INF/,\
-               eclipse32.png,\
-               eclipse32.gif,\
-               about.properties,\
-               about.mappings,\
-               about.ini,\
-               about.html,\
-               plugin.properties,\
-               icons/WTP_icon_x32_v2.png
-
diff --git a/assembly/plugins/org.eclipse.jsf.branding/eclipse32.gif b/assembly/plugins/org.eclipse.jsf.branding/eclipse32.gif
deleted file mode 100644
index e6ad7cc..0000000
--- a/assembly/plugins/org.eclipse.jsf.branding/eclipse32.gif
+++ /dev/null
Binary files differ
diff --git a/assembly/plugins/org.eclipse.jsf.branding/eclipse32.png b/assembly/plugins/org.eclipse.jsf.branding/eclipse32.png
deleted file mode 100644
index 568fac1..0000000
--- a/assembly/plugins/org.eclipse.jsf.branding/eclipse32.png
+++ /dev/null
Binary files differ
diff --git a/assembly/plugins/org.eclipse.jsf.branding/icons/WTP_icon_x32_v2.png b/assembly/plugins/org.eclipse.jsf.branding/icons/WTP_icon_x32_v2.png
deleted file mode 100644
index 6f09c2a..0000000
--- a/assembly/plugins/org.eclipse.jsf.branding/icons/WTP_icon_x32_v2.png
+++ /dev/null
Binary files differ
diff --git a/assembly/plugins/org.eclipse.jsf.branding/plugin.properties b/assembly/plugins/org.eclipse.jsf.branding/plugin.properties
deleted file mode 100644
index 2b7a864..0000000
--- a/assembly/plugins/org.eclipse.jsf.branding/plugin.properties
+++ /dev/null
@@ -1,13 +0,0 @@
-###############################################################################
-# Copyright (c) 2006 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial API and implementation
-###############################################################################
-
-plugin.Name=JavaServer Faces Tools
-plugin.Provider=Eclipse.org
\ No newline at end of file
diff --git a/jsf/features/org.eclipse.jsf.feature/.cvsignore b/jsf/features/org.eclipse.jsf.feature/.cvsignore
deleted file mode 100644
index dafb923..0000000
--- a/jsf/features/org.eclipse.jsf.feature/.cvsignore
+++ /dev/null
@@ -1,4 +0,0 @@
-build.xml
-*bin.dist.zip
-org.eclipse.jst.jsf.feature*.jar
-feature.temp.folder
diff --git a/jsf/features/org.eclipse.jsf.feature/.project b/jsf/features/org.eclipse.jsf.feature/.project
deleted file mode 100644
index dff7881..0000000
--- a/jsf/features/org.eclipse.jsf.feature/.project
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.jsf.feature</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.pde.FeatureBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.FeatureNature</nature>
-	</natures>
-</projectDescription>
diff --git a/jsf/features/org.eclipse.jsf.feature/.settings/org.eclipse.core.resources.prefs b/jsf/features/org.eclipse.jsf.feature/.settings/org.eclipse.core.resources.prefs
deleted file mode 100644
index 9a9e24d..0000000
--- a/jsf/features/org.eclipse.jsf.feature/.settings/org.eclipse.core.resources.prefs
+++ /dev/null
@@ -1,3 +0,0 @@
-#Sun May 27 16:03:41 EDT 2007
-eclipse.preferences.version=1
-encoding/<project>=ISO-8859-1
diff --git a/jsf/features/org.eclipse.jsf.feature/build.properties b/jsf/features/org.eclipse.jsf.feature/build.properties
deleted file mode 100644
index b19fffd..0000000
--- a/jsf/features/org.eclipse.jsf.feature/build.properties
+++ /dev/null
@@ -1,15 +0,0 @@
-###############################################################################
-# Copyright (c) 2005 Oracle Corporation.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#    Gerry Kessler - initial API and implementation
-###############################################################################
-bin.includes = feature.xml,\
-               license.html,\
-               feature.properties,\
-               epl-v10.html,\
-               eclipse_update_120.jpg
diff --git a/jsf/features/org.eclipse.jsf.feature/eclipse_update_120.jpg b/jsf/features/org.eclipse.jsf.feature/eclipse_update_120.jpg
deleted file mode 100644
index bfdf708..0000000
--- a/jsf/features/org.eclipse.jsf.feature/eclipse_update_120.jpg
+++ /dev/null
Binary files differ
diff --git a/jsf/features/org.eclipse.jsf.feature/epl-v10.html b/jsf/features/org.eclipse.jsf.feature/epl-v10.html
deleted file mode 100644
index 022ad29..0000000
--- a/jsf/features/org.eclipse.jsf.feature/epl-v10.html
+++ /dev/null
@@ -1,328 +0,0 @@
-<html xmlns:o="urn:schemas-microsoft-com:office:office"
-xmlns:w="urn:schemas-microsoft-com:office:word"
-xmlns="http://www.w3.org/TR/REC-html40">
-
-<head>
-<meta http-equiv=Content-Type content="text/html; charset=windows-1252">
-<meta name=ProgId content=Word.Document>
-<meta name=Generator content="Microsoft Word 9">
-<meta name=Originator content="Microsoft Word 9">
-<link rel=File-List
-href="./Eclipse%20EPL%202003_11_10%20Final_files/filelist.xml">
-<title>Eclipse Public License - Version 1.0</title>
-<!--[if gte mso 9]><xml>
- <o:DocumentProperties>
-  <o:Revision>2</o:Revision>
-  <o:TotalTime>3</o:TotalTime>
-  <o:Created>2004-03-05T23:03:00Z</o:Created>
-  <o:LastSaved>2004-03-05T23:03:00Z</o:LastSaved>
-  <o:Pages>4</o:Pages>
-  <o:Words>1626</o:Words>
-  <o:Characters>9270</o:Characters>
-   <o:Lines>77</o:Lines>
-  <o:Paragraphs>18</o:Paragraphs>
-  <o:CharactersWithSpaces>11384</o:CharactersWithSpaces>
-  <o:Version>9.4402</o:Version>
- </o:DocumentProperties>
-</xml><![endif]--><!--[if gte mso 9]><xml>
- <w:WordDocument>
-  <w:TrackRevisions/>
- </w:WordDocument>
-</xml><![endif]-->
-<style>
-<!--
- /* Font Definitions */
-@font-face
-	{font-family:Tahoma;
-	panose-1:2 11 6 4 3 5 4 4 2 4;
-	mso-font-charset:0;
-	mso-generic-font-family:swiss;
-	mso-font-pitch:variable;
-	mso-font-signature:553679495 -2147483648 8 0 66047 0;}
- /* Style Definitions */
-p.MsoNormal, li.MsoNormal, div.MsoNormal
-	{mso-style-parent:"";
-	margin:0in;
-	margin-bottom:.0001pt;
-	mso-pagination:widow-orphan;
-	font-size:12.0pt;
-	font-family:"Times New Roman";
-	mso-fareast-font-family:"Times New Roman";}
-p
-	{margin-right:0in;
-	mso-margin-top-alt:auto;
-	mso-margin-bottom-alt:auto;
-	margin-left:0in;
-	mso-pagination:widow-orphan;
-	font-size:12.0pt;
-	font-family:"Times New Roman";
-	mso-fareast-font-family:"Times New Roman";}
-p.BalloonText, li.BalloonText, div.BalloonText
-	{mso-style-name:"Balloon Text";
-	margin:0in;
-	margin-bottom:.0001pt;
-	mso-pagination:widow-orphan;
-	font-size:8.0pt;
-	font-family:Tahoma;
-	mso-fareast-font-family:"Times New Roman";}
-@page Section1
-	{size:8.5in 11.0in;
-	margin:1.0in 1.25in 1.0in 1.25in;
-	mso-header-margin:.5in;
-	mso-footer-margin:.5in;
-	mso-paper-source:0;}
-div.Section1
-	{page:Section1;}
--->
-</style>
-</head>
-
-<body lang=EN-US style='tab-interval:.5in'>
-
-<div class=Section1>
-
-<p align=center style='text-align:center'><b>Eclipse Public License - v 1.0</b>
-</p>
-
-<p><span style='font-size:10.0pt'>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER
-THE TERMS OF THIS ECLIPSE PUBLIC LICENSE (&quot;AGREEMENT&quot;). ANY USE,
-REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE
-OF THIS AGREEMENT.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>1. DEFINITIONS</span></b> </p>
-
-<p><span style='font-size:10.0pt'>&quot;Contribution&quot; means:</span> </p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-in the case of the initial Contributor, the initial code and documentation
-distributed under this Agreement, and<br clear=left>
-b) in the case of each subsequent Contributor:</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>i)
-changes to the Program, and</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>ii)
-additions to the Program;</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>where
-such changes and/or additions to the Program originate from and are distributed
-by that particular Contributor. A Contribution 'originates' from a Contributor
-if it was added to the Program by such Contributor itself or anyone acting on
-such Contributor's behalf. Contributions do not include additions to the
-Program which: (i) are separate modules of software distributed in conjunction
-with the Program under their own license agreement, and (ii) are not derivative
-works of the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>&quot;Contributor&quot; means any person or
-entity that distributes the Program.</span> </p>
-
-<p><span style='font-size:10.0pt'>&quot;Licensed Patents &quot; mean patent
-claims licensable by a Contributor which are necessarily infringed by the use
-or sale of its Contribution alone or when combined with the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>&quot;Program&quot; means the Contributions
-distributed in accordance with this Agreement.</span> </p>
-
-<p><span style='font-size:10.0pt'>&quot;Recipient&quot; means anyone who
-receives the Program under this Agreement, including all Contributors.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>2. GRANT OF RIGHTS</span></b> </p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-Subject to the terms of this Agreement, each Contributor hereby grants Recipient
-a non-exclusive, worldwide, royalty-free copyright license to<span
-style='color:red'> </span>reproduce, prepare derivative works of, publicly
-display, publicly perform, distribute and sublicense the Contribution of such
-Contributor, if any, and such derivative works, in source code and object code
-form.</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b)
-Subject to the terms of this Agreement, each Contributor hereby grants
-Recipient a non-exclusive, worldwide,<span style='color:green'> </span>royalty-free
-patent license under Licensed Patents to make, use, sell, offer to sell, import
-and otherwise transfer the Contribution of such Contributor, if any, in source
-code and object code form. This patent license shall apply to the combination
-of the Contribution and the Program if, at the time the Contribution is added
-by the Contributor, such addition of the Contribution causes such combination
-to be covered by the Licensed Patents. The patent license shall not apply to
-any other combinations which include the Contribution. No hardware per se is
-licensed hereunder. </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>c)
-Recipient understands that although each Contributor grants the licenses to its
-Contributions set forth herein, no assurances are provided by any Contributor
-that the Program does not infringe the patent or other intellectual property
-rights of any other entity. Each Contributor disclaims any liability to Recipient
-for claims brought by any other entity based on infringement of intellectual
-property rights or otherwise. As a condition to exercising the rights and
-licenses granted hereunder, each Recipient hereby assumes sole responsibility
-to secure any other intellectual property rights needed, if any. For example,
-if a third party patent license is required to allow Recipient to distribute
-the Program, it is Recipient's responsibility to acquire that license before
-distributing the Program.</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>d)
-Each Contributor represents that to its knowledge it has sufficient copyright
-rights in its Contribution, if any, to grant the copyright license set forth in
-this Agreement. </span></p>
-
-<p><b><span style='font-size:10.0pt'>3. REQUIREMENTS</span></b> </p>
-
-<p><span style='font-size:10.0pt'>A Contributor may choose to distribute the
-Program in object code form under its own license agreement, provided that:</span>
-</p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-it complies with the terms and conditions of this Agreement; and</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b)
-its license agreement:</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>i)
-effectively disclaims on behalf of all Contributors all warranties and
-conditions, express and implied, including warranties or conditions of title
-and non-infringement, and implied warranties or conditions of merchantability
-and fitness for a particular purpose; </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>ii)
-effectively excludes on behalf of all Contributors all liability for damages,
-including direct, indirect, special, incidental and consequential damages, such
-as lost profits; </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>iii)
-states that any provisions which differ from this Agreement are offered by that
-Contributor alone and not by any other party; and</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>iv)
-states that source code for the Program is available from such Contributor, and
-informs licensees how to obtain it in a reasonable manner on or through a
-medium customarily used for software exchange.<span style='color:blue'> </span></span></p>
-
-<p><span style='font-size:10.0pt'>When the Program is made available in source
-code form:</span> </p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-it must be made available under this Agreement; and </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b) a
-copy of this Agreement must be included with each copy of the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>Contributors may not remove or alter any
-copyright notices contained within the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>Each Contributor must identify itself as the
-originator of its Contribution, if any, in a manner that reasonably allows
-subsequent Recipients to identify the originator of the Contribution. </span></p>
-
-<p><b><span style='font-size:10.0pt'>4. COMMERCIAL DISTRIBUTION</span></b> </p>
-
-<p><span style='font-size:10.0pt'>Commercial distributors of software may
-accept certain responsibilities with respect to end users, business partners
-and the like. While this license is intended to facilitate the commercial use
-of the Program, the Contributor who includes the Program in a commercial
-product offering should do so in a manner which does not create potential
-liability for other Contributors. Therefore, if a Contributor includes the
-Program in a commercial product offering, such Contributor (&quot;Commercial
-Contributor&quot;) hereby agrees to defend and indemnify every other
-Contributor (&quot;Indemnified Contributor&quot;) against any losses, damages and
-costs (collectively &quot;Losses&quot;) arising from claims, lawsuits and other
-legal actions brought by a third party against the Indemnified Contributor to
-the extent caused by the acts or omissions of such Commercial Contributor in
-connection with its distribution of the Program in a commercial product
-offering. The obligations in this section do not apply to any claims or Losses
-relating to any actual or alleged intellectual property infringement. In order
-to qualify, an Indemnified Contributor must: a) promptly notify the Commercial
-Contributor in writing of such claim, and b) allow the Commercial Contributor
-to control, and cooperate with the Commercial Contributor in, the defense and
-any related settlement negotiations. The Indemnified Contributor may participate
-in any such claim at its own expense.</span> </p>
-
-<p><span style='font-size:10.0pt'>For example, a Contributor might include the
-Program in a commercial product offering, Product X. That Contributor is then a
-Commercial Contributor. If that Commercial Contributor then makes performance
-claims, or offers warranties related to Product X, those performance claims and
-warranties are such Commercial Contributor's responsibility alone. Under this
-section, the Commercial Contributor would have to defend claims against the
-other Contributors related to those performance claims and warranties, and if a
-court requires any other Contributor to pay any damages as a result, the
-Commercial Contributor must pay those damages.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>5. NO WARRANTY</span></b> </p>
-
-<p><span style='font-size:10.0pt'>EXCEPT AS EXPRESSLY SET FORTH IN THIS
-AGREEMENT, THE PROGRAM IS PROVIDED ON AN &quot;AS IS&quot; 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. Each Recipient is solely
-responsible for determining the appropriateness of using and distributing the
-Program and assumes all risks associated with its exercise of rights under this
-Agreement , including but not limited to the risks and costs of program errors,
-compliance with applicable laws, damage to or loss of data, programs or
-equipment, and unavailability or interruption of operations. </span></p>
-
-<p><b><span style='font-size:10.0pt'>6. DISCLAIMER OF LIABILITY</span></b> </p>
-
-<p><span style='font-size:10.0pt'>EXCEPT AS EXPRESSLY SET FORTH IN THIS
-AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY
-OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF
-THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF
-THE POSSIBILITY OF SUCH DAMAGES.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>7. GENERAL</span></b> </p>
-
-<p><span style='font-size:10.0pt'>If any provision of this Agreement is invalid
-or unenforceable under applicable law, it shall not affect the validity or
-enforceability of the remainder of the terms of this Agreement, and without
-further action by the parties hereto, such provision shall be reformed to the
-minimum extent necessary to make such provision valid and enforceable.</span> </p>
-
-<p><span style='font-size:10.0pt'>If Recipient institutes patent litigation
-against any entity (including a cross-claim or counterclaim in a lawsuit)
-alleging that the Program itself (excluding combinations of the Program with
-other software or hardware) infringes such Recipient's patent(s), then such
-Recipient's rights granted under Section 2(b) shall terminate as of the date
-such litigation is filed. </span></p>
-
-<p><span style='font-size:10.0pt'>All Recipient's rights under this Agreement
-shall terminate if it fails to comply with any of the material terms or
-conditions of this Agreement and does not cure such failure in a reasonable
-period of time after becoming aware of such noncompliance. If all Recipient's
-rights under this Agreement terminate, Recipient agrees to cease use and
-distribution of the Program as soon as reasonably practicable. However,
-Recipient's obligations under this Agreement and any licenses granted by
-Recipient relating to the Program shall continue and survive. </span></p>
-
-<p><span style='font-size:10.0pt'>Everyone is permitted to copy and distribute
-copies of this Agreement, but in order to avoid inconsistency the Agreement is
-copyrighted and may only be modified in the following manner. The Agreement
-Steward reserves the right to publish new versions (including revisions) of
-this Agreement from time to time. No one other than the Agreement Steward has
-the right to modify this Agreement. The Eclipse Foundation is the initial
-Agreement Steward. The Eclipse Foundation may assign the responsibility to
-serve as the Agreement Steward to a suitable separate entity. Each new version
-of the Agreement will be given a distinguishing version number. The Program
-(including Contributions) may always be distributed subject to the version of
-the Agreement under which it was received. In addition, after a new version of
-the Agreement is published, Contributor may elect to distribute the Program
-(including its Contributions) under the new version. Except as expressly stated
-in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to
-the intellectual property of any Contributor under this Agreement, whether
-expressly, by implication, estoppel or otherwise. All rights in the Program not
-expressly granted under this Agreement are reserved.</span> </p>
-
-<p><span style='font-size:10.0pt'>This Agreement is governed by the laws of the
-State of New York and the intellectual property laws of the United States of
-America. No party to this Agreement will bring a legal action under this
-Agreement more than one year after the cause of action arose. Each party waives
-its rights to a jury trial in any resulting litigation.</span> </p>
-
-<p class=MsoNormal><![if !supportEmptyParas]>&nbsp;<![endif]><o:p></o:p></p>
-
-</div>
-
-</body>
-
-</html>
diff --git a/jsf/features/org.eclipse.jsf.feature/feature.properties b/jsf/features/org.eclipse.jsf.feature/feature.properties
deleted file mode 100644
index 567597d..0000000
--- a/jsf/features/org.eclipse.jsf.feature/feature.properties
+++ /dev/null
@@ -1,151 +0,0 @@
-###############################################################################
-# Copyright (c) 2005, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-name=JavaServer Faces Tools (JSF) Project
-provider=Eclipse Web Tools Platform
-description=WTP JavaServer Faces Tools (JSF) Project 
-updateSiteName=The Eclipse Web Tools Platform (WTP) Project update site
-licenseURL=license.html
-# "copyright" property - text of the "Feature Update Copyright"
-copyright=\
-Copyright (c) 2006 Oracle Corporation.\
-All rights reserved. This program and the accompanying materials\
-are made available under the terms of the Eclipse Public License v1.0\
-which accompanies this distribution, and is available at\
-http://www.eclipse.org/legal/epl-v10.html\
-\n\
-Contributors:\n\
-    Oracle Corporation - initial API and implementation\n
-################ end of copyright property ####################################
-
-license=\
-Eclipse Foundation Software User Agreement\n\
-April 14, 2010\n\
-\n\
-Usage Of Content\n\
-\n\
-THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR\n\
-OTHER MATERIALS FOR OPEN SOURCE PROJECTS (COLLECTIVELY "CONTENT").\n\
-USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS\n\
-AGREEMENT AND/OR THE TERMS AND CONDITIONS OF LICENSE AGREEMENTS OR\n\
-NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU\n\
-AGREE THAT YOUR USE OF THE CONTENT IS GOVERNED BY THIS AGREEMENT\n\
-AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS\n\
-OR NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE\n\
-TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND CONDITIONS\n\
-OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED\n\
-BELOW, THEN YOU MAY NOT USE THE CONTENT.\n\
-\n\
-Applicable Licenses\n\
-\n\
-Unless otherwise indicated, all Content made available by the\n\
-Eclipse Foundation is provided to you under the terms and conditions of\n\
-the Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is\n\
-provided with this Content and is also available at http://www.eclipse.org/legal/epl-v10.html.\n\
-For purposes of the EPL, "Program" will mean the Content.\n\
-\n\
-Content includes, but is not limited to, source code, object code,\n\
-documentation and other files maintained in the Eclipse Foundation source code\n\
-repository ("Repository") in software modules ("Modules") and made available\n\
-as downloadable archives ("Downloads").\n\
-\n\
-       - Content may be structured and packaged into modules to facilitate delivering,\n\
-         extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"),\n\
-         plug-in fragments ("Fragments"), and features ("Features").\n\
-       - Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java(TM) ARchive)\n\
-         in a directory named "plugins".\n\
-       - A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.\n\
-         Each Feature may be packaged as a sub-directory in a directory named "features".\n\
-         Within a Feature, files named "feature.xml" may contain a list of the names and version\n\
-         numbers of the Plug-ins and/or Fragments associated with that Feature.\n\
-       - Features may also include other Features ("Included Features"). Within a Feature, files\n\
-         named "feature.xml" may contain a list of the names and version numbers of Included Features.\n\
-\n\
-The terms and conditions governing Plug-ins and Fragments should be\n\
-contained in files named "about.html" ("Abouts"). The terms and\n\
-conditions governing Features and Included Features should be contained\n\
-in files named "license.html" ("Feature Licenses"). Abouts and Feature\n\
-Licenses may be located in any directory of a Download or Module\n\
-including, but not limited to the following locations:\n\
-\n\
-       - The top-level (root) directory\n\
-       - Plug-in and Fragment directories\n\
-       - Inside Plug-ins and Fragments packaged as JARs\n\
-       - Sub-directories of the directory named "src" of certain Plug-ins\n\
-       - Feature directories\n\
-\n\
-Note: if a Feature made available by the Eclipse Foundation is installed using the\n\
-Provisioning Technology (as defined below), you must agree to a license ("Feature \n\
-Update License") during the installation process. If the Feature contains\n\
-Included Features, the Feature Update License should either provide you\n\
-with the terms and conditions governing the Included Features or inform\n\
-you where you can locate them. Feature Update Licenses may be found in\n\
-the "license" property of files named "feature.properties" found within a Feature.\n\
-Such Abouts, Feature Licenses, and Feature Update Licenses contain the\n\
-terms and conditions (or references to such terms and conditions) that\n\
-govern your use of the associated Content in that directory.\n\
-\n\
-THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER\n\
-TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.\n\
-SOME OF THESE OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):\n\
-\n\
-       - Common Public License Version 1.0 (available at http://www.eclipse.org/legal/cpl-v10.html)\n\
-       - Apache Software License 1.1 (available at http://www.apache.org/licenses/LICENSE)\n\
-       - Apache Software License 2.0 (available at http://www.apache.org/licenses/LICENSE-2.0)\n\
-       - Metro Link Public License 1.00 (available at http://www.opengroup.org/openmotif/supporters/metrolink/license.html)\n\
-       - Mozilla Public License Version 1.1 (available at http://www.mozilla.org/MPL/MPL-1.1.html)\n\
-\n\
-IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR\n\
-TO USE OF THE CONTENT. If no About, Feature License, or Feature Update License\n\
-is provided, please contact the Eclipse Foundation to determine what terms and conditions\n\
-govern that particular Content.\n\
-\n\
-\n\Use of Provisioning Technology\n\
-\n\
-The Eclipse Foundation makes available provisioning software, examples of which include,\n\
-but are not limited to, p2 and the Eclipse Update Manager ("Provisioning Technology") for\n\
-the purpose of allowing users to install software, documentation, information and/or\n\
-other materials (collectively "Installable Software"). This capability is provided with\n\
-the intent of allowing such users to install, extend and update Eclipse-based products.\n\
-Information about packaging Installable Software is available at\n\
-http://eclipse.org/equinox/p2/repository_packaging.html ("Specification").\n\
-\n\
-You may use Provisioning Technology to allow other parties to install Installable Software.\n\
-You shall be responsible for enabling the applicable license agreements relating to the\n\
-Installable Software to be presented to, and accepted by, the users of the Provisioning Technology\n\
-in accordance with the Specification. By using Provisioning Technology in such a manner and\n\
-making it available in accordance with the Specification, you further acknowledge your\n\
-agreement to, and the acquisition of all necessary rights to permit the following:\n\
-\n\
-       1. A series of actions may occur ("Provisioning Process") in which a user may execute\n\
-          the Provisioning Technology on a machine ("Target Machine") with the intent of installing,\n\
-          extending or updating the functionality of an Eclipse-based product.\n\
-       2. During the Provisioning Process, the Provisioning Technology may cause third party\n\
-          Installable Software or a portion thereof to be accessed and copied to the Target Machine.\n\
-       3. Pursuant to the Specification, you will provide to the user the terms and conditions that\n\
-          govern the use of the Installable Software ("Installable Software Agreement") and such\n\
-          Installable Software Agreement shall be accessed from the Target Machine in accordance\n\
-          with the Specification. Such Installable Software Agreement must inform the user of the\n\
-          terms and conditions that govern the Installable Software and must solicit acceptance by\n\
-          the end user in the manner prescribed in such Installable Software Agreement. Upon such\n\
-          indication of agreement by the user, the provisioning Technology will complete installation\n\
-          of the Installable Software.\n\
-\n\
-Cryptography\n\
-\n\
-Content may contain encryption software. The country in which you are\n\
-currently may have restrictions on the import, possession, and use,\n\
-and/or re-export to another country, of encryption software. BEFORE\n\
-using any encryption software, please check the country's laws,\n\
-regulations and policies concerning the import, possession, or use, and\n\
-re-export of encryption software, to see if this is permitted.\n\
-\n\
-Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.\n
-########### end of license property ##########################################
diff --git a/jsf/features/org.eclipse.jsf.feature/feature.xml b/jsf/features/org.eclipse.jsf.feature/feature.xml
deleted file mode 100644
index 1f2f8f9..0000000
--- a/jsf/features/org.eclipse.jsf.feature/feature.xml
+++ /dev/null
@@ -1,98 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<feature
-      id="org.eclipse.jsf.feature"
-      label="%name"
-      version="3.2.1.qualifier"
-      provider-name="%provider"
-      image="eclipse_update_120.jpg">
-
-   <description>
-      %description
-   </description>
-
-   <copyright>
-      %copyright
-   </copyright>
-
-   <license url="license.html">
-      %license
-   </license>
-
-   <plugin
-         id="org.eclipse.jst.jsf.common"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.jst.jsf.common.runtime"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.jst.jsf.common.ui"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.jst.jsf.core"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.jst.jsf.facelet.core"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.jst.jsf.facelet.ui"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.jst.jsf.facesconfig"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.jst.jsf.facesconfig.ui"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.jst.jsf.ui"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.jst.jsf.standard.tagsupport"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.jsf.branding"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-</feature>
diff --git a/jsf/features/org.eclipse.jsf.feature/license.html b/jsf/features/org.eclipse.jsf.feature/license.html
deleted file mode 100644
index a450af9..0000000
--- a/jsf/features/org.eclipse.jsf.feature/license.html
+++ /dev/null
@@ -1,97 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3c.org/TR/1999/REC-html401-19991224/loose.dtd">
-<!-- saved from url=(0044)http://www.eclipse.org/legal/epl/notice.html -->
-<HTML><HEAD><TITLE>Eclipse.org Software User Agreement</TITLE>
-<META http-equiv=Content-Type content="text/html; charset=iso-8859-1">
-<META content="MSHTML 6.00.2800.1479" name=GENERATOR></HEAD>
-<BODY lang=EN-US vLink=purple link=blue>
-<H2>Eclipse Foundation Software User Agreement</H2>
-
-<H3>Usage Of Content</H3>
-<P>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION 
-AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS (COLLECTIVELY "CONTENT"). USE OF 
-THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE 
-TERMS AND CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED 
-BELOW. BY USING THE CONTENT, YOU AGREE THAT YOUR USE OF THE CONTENT IS GOVERNED 
-BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE 
-AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW. IF YOU DO NOT AGREE TO THE 
-TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND CONDITIONS OF ANY 
-APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU 
-MAY NOT USE THE CONTENT.</P>
-<H3>Applicable Licenses</H3>
-<P>Unless otherwise indicated, all Content made available by the Eclipse 
-Foundation is provided to you under the terms and conditions of the Eclipse 
-Public License Version 1.0 ("EPL"). A copy of the EPL is provided with this 
-Content and is also available at <A 
-href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</A>. 
-For purposes of the EPL, "Program" will mean the Content.</P>
-<P>Content includes, but is not limited to, source code, object code, 
-documentation and other files maintained in the Eclipse.org CVS repository 
-("Repository") in CVS modules ("Modules") and made available as downloadable 
-archives ("Downloads").</P>
-<P>Content may be apportioned into plug-ins ("Plug-ins"), plug-in fragments 
-("Fragments"), and features ("Features"). A Feature is a bundle of one or more 
-Plug-ins and/or Fragments and associated material. Files named "feature.xml" may 
-contain a list of the names and version numbers of the Plug-ins and/or Fragments 
-associated with a Feature. Plug-ins and Fragments are located in directories 
-named "plugins" and Features are located in directories named "features".</P>
-<P>Features may also include other Features ("Included Features"). Files named 
-"feature.xml" may contain a list of the names and version numbers of Included 
-Features.</P>
-<P>The terms and conditions governing Plug-ins and Fragments should be contained 
-in files named "about.html" ("Abouts"). The terms and conditions governing 
-Features and Included Features should be contained in files named "license.html" 
-("Feature Licenses"). Abouts and Feature Licenses may be located in any 
-directory of a Download or Module including, but not limited to the following 
-locations:</P>
-<UL>
-  <LI>The top-level (root) directory 
-  <LI>Plug-in and Fragment directories 
-  <LI>Subdirectories of the directory named "src" of certain Plug-ins 
-  <LI>Feature directories </LI></UL>
-<P>Note: if a Feature made available by the Eclipse Foundation is installed 
-using the Eclipse Update Manager, you must agree to a license ("Feature Update 
-License") during the installation process. If the Feature contains Included 
-Features, the Feature Update License should either provide you with the terms 
-and conditions governing the Included Features or inform you where you can 
-locate them. Feature Update Licenses may be found in the "license" property of 
-files named "feature.properties". Such Abouts, Feature Licenses and Feature 
-Update Licenses contain the terms and conditions (or references to such terms 
-and conditions) that govern your use of the associated Content in that 
-directory.</P>
-<P>THE ABOUTS, FEATURE LICENSES AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL 
-OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS. SOME OF THESE 
-OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):</P>
-<UL>
-  <LI>Common Public License Version 1.0 (available at <A 
-  href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</A>) 
-
-  <LI>Apache Software License 1.1 (available at <A 
-  href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</A>) 
-
-  <LI>Apache Software License 2.0 (available at <A 
-  href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</A>) 
-
-  <LI>IBM Public License 1.0 (available at <A 
-  href="http://oss.software.ibm.com/developerworks/opensource/license10.html">http://oss.software.ibm.com/developerworks/opensource/license10.html</A>) 
-
-  <LI>Metro Link Public License 1.00 (available at <A 
-  href="http://www.opengroup.org/openmotif/supporters/metrolink/license.html">http://www.opengroup.org/openmotif/supporters/metrolink/license.html</A>) 
-
-  <LI>Mozilla Public License Version 1.1 (available at <A 
-  href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</A>)
-  
-    <li>Common Development and Distribution License (CDDL) Version 1.0 (available at <A 
-  href="http://www.sun.com/cddl/cddl.html">http://www.sun.com/cddl/cddl.html)</A>
-  </LI> 
-  </LI></UL>
-<P>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR 
-TO USE OF THE CONTENT. If no About, Feature License or Feature Update License is 
-provided, please contact the Eclipse Foundation to determine what terms and 
-conditions govern that particular Content.</P>
-<H3>Cryptography</H3>
-<P>Content may contain encryption software. The country in which you are 
-currently may have restrictions on the import, possession, and use, and/or 
-re-export to another country, of encryption software. BEFORE using any 
-encryption software, please check the country's laws, regulations and policies 
-concerning the import, possession, or use, and re-export of encryption software, 
-to see if this is permitted.</P></BODY></HTML>
diff --git a/jsf/features/org.eclipse.jsf.feature/sourceTemplateBundle/about.html b/jsf/features/org.eclipse.jsf.feature/sourceTemplateBundle/about.html
deleted file mode 100644
index fe81d46..0000000
--- a/jsf/features/org.eclipse.jsf.feature/sourceTemplateBundle/about.html
+++ /dev/null
@@ -1,27 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<head>
-<title>About</title>
-<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
-
-<P>June, 2008</P>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise indicated below, the Content is provided to you under the terms and conditions of the
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content.</p>
-
-<h3>Source Code</h3>
-<p>This plug-in contains source code zip files (&quot;Source Zips&quot;) that correspond to binary content in other plug-ins. These Source Zips may be distributed under different license
-agreements and/or notices. Details about these license agreements and notices are contained in &quot;about.html&quot; files (&quot;Abouts&quot;) located in sub-directories in the
-src/ directory of this plug-in. Such Abouts govern your use of the Source Zips in that directory, not the EPL.</p>
-
-</body>
-</html>
diff --git a/jsf/features/org.eclipse.jsf.feature/sourceTemplateBundle/about.ini b/jsf/features/org.eclipse.jsf.feature/sourceTemplateBundle/about.ini
deleted file mode 100644
index 2dee36a..0000000
--- a/jsf/features/org.eclipse.jsf.feature/sourceTemplateBundle/about.ini
+++ /dev/null
@@ -1,31 +0,0 @@
-# about.ini
-# contains information about a feature
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# "%key" are externalized strings defined in about.properties
-# This file does not need to be translated.
-
-# Property "aboutText" contains blurb for "About" dialog (translated)
-aboutText=%blurb
-
-# Property "windowImage" contains path to window icon (16x16)
-# needed for primary features only
-
-# Property "featureImage" contains path to feature image (32x32)
-featureImage=eclipse32.gif
-
-# Property "aboutImage" contains path to product image (500x330 or 115x164)
-# needed for primary features only
-
-# Property "appName" contains name of the application (not translated)
-# needed for primary features only
-
-# Property "welcomePage" contains path to welcome page (special XML-based format)
-# optional
-
-# Property "welcomePerspective" contains the id of the perspective in which the
-# welcome page is to be opened.
-# optional
-
-
-
-
diff --git a/jsf/features/org.eclipse.jsf.feature/sourceTemplateBundle/about.mappings b/jsf/features/org.eclipse.jsf.feature/sourceTemplateBundle/about.mappings
deleted file mode 100644
index a28390a..0000000
--- a/jsf/features/org.eclipse.jsf.feature/sourceTemplateBundle/about.mappings
+++ /dev/null
@@ -1,6 +0,0 @@
-# about.mappings
-# contains fill-ins for about.properties
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# This file does not need to be translated.
-
-0=@build@
diff --git a/jsf/features/org.eclipse.jsf.feature/sourceTemplateBundle/about.properties b/jsf/features/org.eclipse.jsf.feature/sourceTemplateBundle/about.properties
deleted file mode 100644
index 4e33f86..0000000
--- a/jsf/features/org.eclipse.jsf.feature/sourceTemplateBundle/about.properties
+++ /dev/null
@@ -1,26 +0,0 @@
-###############################################################################
-# Copyright (c) 2005, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-# about.properties
-# contains externalized strings for about.ini
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# fill-ins are supplied by about.mappings
-# This file should be translated.
-#
-# Do not translate any values surrounded by {}
-
-blurb=JavaServer Faces Tools Source\n\
-\n\
-Version: {featureVersion}\n\
-Build id: {0}\n\
-\n\
-(c) Copyright Eclipse contributors and others 2005.  All rights reserved.\n\
-Visit http://www.eclipse.org/webtools
-
diff --git a/jsf/features/org.eclipse.jsf.feature/sourceTemplateBundle/build.properties b/jsf/features/org.eclipse.jsf.feature/sourceTemplateBundle/build.properties
deleted file mode 100644
index 43309f0..0000000
--- a/jsf/features/org.eclipse.jsf.feature/sourceTemplateBundle/build.properties
+++ /dev/null
@@ -1,13 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-
-bin.includes = about.html, about.ini, about.mappings, about.properties, eclipse32.gif, plugin.properties, plugin.xml, src/**, META-INF/
-sourcePlugin = true
diff --git a/jsf/features/org.eclipse.jsf.feature/sourceTemplateBundle/eclipse32.gif b/jsf/features/org.eclipse.jsf.feature/sourceTemplateBundle/eclipse32.gif
deleted file mode 100644
index e6ad7cc..0000000
--- a/jsf/features/org.eclipse.jsf.feature/sourceTemplateBundle/eclipse32.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/features/org.eclipse.jsf.feature/sourceTemplateBundle/eclipse32.png b/jsf/features/org.eclipse.jsf.feature/sourceTemplateBundle/eclipse32.png
deleted file mode 100644
index 50ae49d..0000000
--- a/jsf/features/org.eclipse.jsf.feature/sourceTemplateBundle/eclipse32.png
+++ /dev/null
Binary files differ
diff --git a/jsf/features/org.eclipse.jsf.feature/sourceTemplateBundle/eclipse_update_120.jpg b/jsf/features/org.eclipse.jsf.feature/sourceTemplateBundle/eclipse_update_120.jpg
deleted file mode 100644
index bfdf708..0000000
--- a/jsf/features/org.eclipse.jsf.feature/sourceTemplateBundle/eclipse_update_120.jpg
+++ /dev/null
Binary files differ
diff --git a/jsf/features/org.eclipse.jsf.feature/sourceTemplateBundle/epl-v10.html b/jsf/features/org.eclipse.jsf.feature/sourceTemplateBundle/epl-v10.html
deleted file mode 100644
index 022ad29..0000000
--- a/jsf/features/org.eclipse.jsf.feature/sourceTemplateBundle/epl-v10.html
+++ /dev/null
@@ -1,328 +0,0 @@
-<html xmlns:o="urn:schemas-microsoft-com:office:office"
-xmlns:w="urn:schemas-microsoft-com:office:word"
-xmlns="http://www.w3.org/TR/REC-html40">
-
-<head>
-<meta http-equiv=Content-Type content="text/html; charset=windows-1252">
-<meta name=ProgId content=Word.Document>
-<meta name=Generator content="Microsoft Word 9">
-<meta name=Originator content="Microsoft Word 9">
-<link rel=File-List
-href="./Eclipse%20EPL%202003_11_10%20Final_files/filelist.xml">
-<title>Eclipse Public License - Version 1.0</title>
-<!--[if gte mso 9]><xml>
- <o:DocumentProperties>
-  <o:Revision>2</o:Revision>
-  <o:TotalTime>3</o:TotalTime>
-  <o:Created>2004-03-05T23:03:00Z</o:Created>
-  <o:LastSaved>2004-03-05T23:03:00Z</o:LastSaved>
-  <o:Pages>4</o:Pages>
-  <o:Words>1626</o:Words>
-  <o:Characters>9270</o:Characters>
-   <o:Lines>77</o:Lines>
-  <o:Paragraphs>18</o:Paragraphs>
-  <o:CharactersWithSpaces>11384</o:CharactersWithSpaces>
-  <o:Version>9.4402</o:Version>
- </o:DocumentProperties>
-</xml><![endif]--><!--[if gte mso 9]><xml>
- <w:WordDocument>
-  <w:TrackRevisions/>
- </w:WordDocument>
-</xml><![endif]-->
-<style>
-<!--
- /* Font Definitions */
-@font-face
-	{font-family:Tahoma;
-	panose-1:2 11 6 4 3 5 4 4 2 4;
-	mso-font-charset:0;
-	mso-generic-font-family:swiss;
-	mso-font-pitch:variable;
-	mso-font-signature:553679495 -2147483648 8 0 66047 0;}
- /* Style Definitions */
-p.MsoNormal, li.MsoNormal, div.MsoNormal
-	{mso-style-parent:"";
-	margin:0in;
-	margin-bottom:.0001pt;
-	mso-pagination:widow-orphan;
-	font-size:12.0pt;
-	font-family:"Times New Roman";
-	mso-fareast-font-family:"Times New Roman";}
-p
-	{margin-right:0in;
-	mso-margin-top-alt:auto;
-	mso-margin-bottom-alt:auto;
-	margin-left:0in;
-	mso-pagination:widow-orphan;
-	font-size:12.0pt;
-	font-family:"Times New Roman";
-	mso-fareast-font-family:"Times New Roman";}
-p.BalloonText, li.BalloonText, div.BalloonText
-	{mso-style-name:"Balloon Text";
-	margin:0in;
-	margin-bottom:.0001pt;
-	mso-pagination:widow-orphan;
-	font-size:8.0pt;
-	font-family:Tahoma;
-	mso-fareast-font-family:"Times New Roman";}
-@page Section1
-	{size:8.5in 11.0in;
-	margin:1.0in 1.25in 1.0in 1.25in;
-	mso-header-margin:.5in;
-	mso-footer-margin:.5in;
-	mso-paper-source:0;}
-div.Section1
-	{page:Section1;}
--->
-</style>
-</head>
-
-<body lang=EN-US style='tab-interval:.5in'>
-
-<div class=Section1>
-
-<p align=center style='text-align:center'><b>Eclipse Public License - v 1.0</b>
-</p>
-
-<p><span style='font-size:10.0pt'>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER
-THE TERMS OF THIS ECLIPSE PUBLIC LICENSE (&quot;AGREEMENT&quot;). ANY USE,
-REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE
-OF THIS AGREEMENT.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>1. DEFINITIONS</span></b> </p>
-
-<p><span style='font-size:10.0pt'>&quot;Contribution&quot; means:</span> </p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-in the case of the initial Contributor, the initial code and documentation
-distributed under this Agreement, and<br clear=left>
-b) in the case of each subsequent Contributor:</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>i)
-changes to the Program, and</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>ii)
-additions to the Program;</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>where
-such changes and/or additions to the Program originate from and are distributed
-by that particular Contributor. A Contribution 'originates' from a Contributor
-if it was added to the Program by such Contributor itself or anyone acting on
-such Contributor's behalf. Contributions do not include additions to the
-Program which: (i) are separate modules of software distributed in conjunction
-with the Program under their own license agreement, and (ii) are not derivative
-works of the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>&quot;Contributor&quot; means any person or
-entity that distributes the Program.</span> </p>
-
-<p><span style='font-size:10.0pt'>&quot;Licensed Patents &quot; mean patent
-claims licensable by a Contributor which are necessarily infringed by the use
-or sale of its Contribution alone or when combined with the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>&quot;Program&quot; means the Contributions
-distributed in accordance with this Agreement.</span> </p>
-
-<p><span style='font-size:10.0pt'>&quot;Recipient&quot; means anyone who
-receives the Program under this Agreement, including all Contributors.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>2. GRANT OF RIGHTS</span></b> </p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-Subject to the terms of this Agreement, each Contributor hereby grants Recipient
-a non-exclusive, worldwide, royalty-free copyright license to<span
-style='color:red'> </span>reproduce, prepare derivative works of, publicly
-display, publicly perform, distribute and sublicense the Contribution of such
-Contributor, if any, and such derivative works, in source code and object code
-form.</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b)
-Subject to the terms of this Agreement, each Contributor hereby grants
-Recipient a non-exclusive, worldwide,<span style='color:green'> </span>royalty-free
-patent license under Licensed Patents to make, use, sell, offer to sell, import
-and otherwise transfer the Contribution of such Contributor, if any, in source
-code and object code form. This patent license shall apply to the combination
-of the Contribution and the Program if, at the time the Contribution is added
-by the Contributor, such addition of the Contribution causes such combination
-to be covered by the Licensed Patents. The patent license shall not apply to
-any other combinations which include the Contribution. No hardware per se is
-licensed hereunder. </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>c)
-Recipient understands that although each Contributor grants the licenses to its
-Contributions set forth herein, no assurances are provided by any Contributor
-that the Program does not infringe the patent or other intellectual property
-rights of any other entity. Each Contributor disclaims any liability to Recipient
-for claims brought by any other entity based on infringement of intellectual
-property rights or otherwise. As a condition to exercising the rights and
-licenses granted hereunder, each Recipient hereby assumes sole responsibility
-to secure any other intellectual property rights needed, if any. For example,
-if a third party patent license is required to allow Recipient to distribute
-the Program, it is Recipient's responsibility to acquire that license before
-distributing the Program.</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>d)
-Each Contributor represents that to its knowledge it has sufficient copyright
-rights in its Contribution, if any, to grant the copyright license set forth in
-this Agreement. </span></p>
-
-<p><b><span style='font-size:10.0pt'>3. REQUIREMENTS</span></b> </p>
-
-<p><span style='font-size:10.0pt'>A Contributor may choose to distribute the
-Program in object code form under its own license agreement, provided that:</span>
-</p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-it complies with the terms and conditions of this Agreement; and</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b)
-its license agreement:</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>i)
-effectively disclaims on behalf of all Contributors all warranties and
-conditions, express and implied, including warranties or conditions of title
-and non-infringement, and implied warranties or conditions of merchantability
-and fitness for a particular purpose; </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>ii)
-effectively excludes on behalf of all Contributors all liability for damages,
-including direct, indirect, special, incidental and consequential damages, such
-as lost profits; </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>iii)
-states that any provisions which differ from this Agreement are offered by that
-Contributor alone and not by any other party; and</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>iv)
-states that source code for the Program is available from such Contributor, and
-informs licensees how to obtain it in a reasonable manner on or through a
-medium customarily used for software exchange.<span style='color:blue'> </span></span></p>
-
-<p><span style='font-size:10.0pt'>When the Program is made available in source
-code form:</span> </p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-it must be made available under this Agreement; and </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b) a
-copy of this Agreement must be included with each copy of the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>Contributors may not remove or alter any
-copyright notices contained within the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>Each Contributor must identify itself as the
-originator of its Contribution, if any, in a manner that reasonably allows
-subsequent Recipients to identify the originator of the Contribution. </span></p>
-
-<p><b><span style='font-size:10.0pt'>4. COMMERCIAL DISTRIBUTION</span></b> </p>
-
-<p><span style='font-size:10.0pt'>Commercial distributors of software may
-accept certain responsibilities with respect to end users, business partners
-and the like. While this license is intended to facilitate the commercial use
-of the Program, the Contributor who includes the Program in a commercial
-product offering should do so in a manner which does not create potential
-liability for other Contributors. Therefore, if a Contributor includes the
-Program in a commercial product offering, such Contributor (&quot;Commercial
-Contributor&quot;) hereby agrees to defend and indemnify every other
-Contributor (&quot;Indemnified Contributor&quot;) against any losses, damages and
-costs (collectively &quot;Losses&quot;) arising from claims, lawsuits and other
-legal actions brought by a third party against the Indemnified Contributor to
-the extent caused by the acts or omissions of such Commercial Contributor in
-connection with its distribution of the Program in a commercial product
-offering. The obligations in this section do not apply to any claims or Losses
-relating to any actual or alleged intellectual property infringement. In order
-to qualify, an Indemnified Contributor must: a) promptly notify the Commercial
-Contributor in writing of such claim, and b) allow the Commercial Contributor
-to control, and cooperate with the Commercial Contributor in, the defense and
-any related settlement negotiations. The Indemnified Contributor may participate
-in any such claim at its own expense.</span> </p>
-
-<p><span style='font-size:10.0pt'>For example, a Contributor might include the
-Program in a commercial product offering, Product X. That Contributor is then a
-Commercial Contributor. If that Commercial Contributor then makes performance
-claims, or offers warranties related to Product X, those performance claims and
-warranties are such Commercial Contributor's responsibility alone. Under this
-section, the Commercial Contributor would have to defend claims against the
-other Contributors related to those performance claims and warranties, and if a
-court requires any other Contributor to pay any damages as a result, the
-Commercial Contributor must pay those damages.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>5. NO WARRANTY</span></b> </p>
-
-<p><span style='font-size:10.0pt'>EXCEPT AS EXPRESSLY SET FORTH IN THIS
-AGREEMENT, THE PROGRAM IS PROVIDED ON AN &quot;AS IS&quot; 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. Each Recipient is solely
-responsible for determining the appropriateness of using and distributing the
-Program and assumes all risks associated with its exercise of rights under this
-Agreement , including but not limited to the risks and costs of program errors,
-compliance with applicable laws, damage to or loss of data, programs or
-equipment, and unavailability or interruption of operations. </span></p>
-
-<p><b><span style='font-size:10.0pt'>6. DISCLAIMER OF LIABILITY</span></b> </p>
-
-<p><span style='font-size:10.0pt'>EXCEPT AS EXPRESSLY SET FORTH IN THIS
-AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY
-OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF
-THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF
-THE POSSIBILITY OF SUCH DAMAGES.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>7. GENERAL</span></b> </p>
-
-<p><span style='font-size:10.0pt'>If any provision of this Agreement is invalid
-or unenforceable under applicable law, it shall not affect the validity or
-enforceability of the remainder of the terms of this Agreement, and without
-further action by the parties hereto, such provision shall be reformed to the
-minimum extent necessary to make such provision valid and enforceable.</span> </p>
-
-<p><span style='font-size:10.0pt'>If Recipient institutes patent litigation
-against any entity (including a cross-claim or counterclaim in a lawsuit)
-alleging that the Program itself (excluding combinations of the Program with
-other software or hardware) infringes such Recipient's patent(s), then such
-Recipient's rights granted under Section 2(b) shall terminate as of the date
-such litigation is filed. </span></p>
-
-<p><span style='font-size:10.0pt'>All Recipient's rights under this Agreement
-shall terminate if it fails to comply with any of the material terms or
-conditions of this Agreement and does not cure such failure in a reasonable
-period of time after becoming aware of such noncompliance. If all Recipient's
-rights under this Agreement terminate, Recipient agrees to cease use and
-distribution of the Program as soon as reasonably practicable. However,
-Recipient's obligations under this Agreement and any licenses granted by
-Recipient relating to the Program shall continue and survive. </span></p>
-
-<p><span style='font-size:10.0pt'>Everyone is permitted to copy and distribute
-copies of this Agreement, but in order to avoid inconsistency the Agreement is
-copyrighted and may only be modified in the following manner. The Agreement
-Steward reserves the right to publish new versions (including revisions) of
-this Agreement from time to time. No one other than the Agreement Steward has
-the right to modify this Agreement. The Eclipse Foundation is the initial
-Agreement Steward. The Eclipse Foundation may assign the responsibility to
-serve as the Agreement Steward to a suitable separate entity. Each new version
-of the Agreement will be given a distinguishing version number. The Program
-(including Contributions) may always be distributed subject to the version of
-the Agreement under which it was received. In addition, after a new version of
-the Agreement is published, Contributor may elect to distribute the Program
-(including its Contributions) under the new version. Except as expressly stated
-in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to
-the intellectual property of any Contributor under this Agreement, whether
-expressly, by implication, estoppel or otherwise. All rights in the Program not
-expressly granted under this Agreement are reserved.</span> </p>
-
-<p><span style='font-size:10.0pt'>This Agreement is governed by the laws of the
-State of New York and the intellectual property laws of the United States of
-America. No party to this Agreement will bring a legal action under this
-Agreement more than one year after the cause of action arose. Each party waives
-its rights to a jury trial in any resulting litigation.</span> </p>
-
-<p class=MsoNormal><![if !supportEmptyParas]>&nbsp;<![endif]><o:p></o:p></p>
-
-</div>
-
-</body>
-
-</html>
diff --git a/jsf/features/org.eclipse.jsf.feature/sourceTemplateBundle/license.html b/jsf/features/org.eclipse.jsf.feature/sourceTemplateBundle/license.html
deleted file mode 100644
index 14b1d50..0000000
--- a/jsf/features/org.eclipse.jsf.feature/sourceTemplateBundle/license.html
+++ /dev/null
@@ -1,83 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<head>
-<meta http-equiv=Content-Type content="text/html; charset=iso-8859-1">
-<title>Eclipse.org Software User Agreement</title>
-</head>
-
-<body lang="EN-US" link=blue vlink=purple>
-<h2>Eclipse Foundation Software User Agreement</h2>
-<p>June 06, 2007</p>
-
-<h3>Usage Of Content</h3>
-
-<p>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS
-   (COLLECTIVELY &quot;CONTENT&quot;).  USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND
-   CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU AGREE THAT YOUR USE
-   OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR
-   NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND
-   CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.</p>
-   
-<h3>Applicable Licenses</h3>   
-   
-<p>Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0
-   (&quot;EPL&quot;).  A copy of the EPL is provided with this Content and is also available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-   For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse.org CVS repository (&quot;Repository&quot;) in CVS
-   modules (&quot;Modules&quot;) and made available as downloadable archives (&quot;Downloads&quot;).</p>
-   
-<ul>
-	<li>Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content.  Typical modules may include plug-ins (&quot;Plug-ins&quot;), plug-in fragments (&quot;Fragments&quot;), and features (&quot;Features&quot;).</li>
-	<li>Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java&trade; ARchive) in a directory named &quot;plugins&quot;.</li>
-	<li>A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.  Each Feature may be packaged as a sub-directory in a directory named &quot;features&quot;.  Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of the Plug-ins
-      and/or Fragments associated with that Feature.</li>
-	<li>Features may also include other Features (&quot;Included Features&quot;). Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of Included Features.</li>
-</ul>   
- 
-<p>The terms and conditions governing Plug-ins and Fragments should be contained in files named &quot;about.html&quot; (&quot;Abouts&quot;). The terms and conditions governing Features and
-Included Features should be contained in files named &quot;license.html&quot; (&quot;Feature Licenses&quot;).  Abouts and Feature Licenses may be located in any directory of a Download or Module
-including, but not limited to the following locations:</p>
-
-<ul>
-	<li>The top-level (root) directory</li>
-	<li>Plug-in and Fragment directories</li>
-	<li>Inside Plug-ins and Fragments packaged as JARs</li>
-	<li>Sub-directories of the directory named &quot;src&quot; of certain Plug-ins</li>
-	<li>Feature directories</li>
-</ul>
-		
-<p>Note: if a Feature made available by the Eclipse Foundation is installed using the Eclipse Update Manager, you must agree to a license (&quot;Feature Update License&quot;) during the
-installation process.  If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or
-inform you where you can locate them.  Feature Update Licenses may be found in the &quot;license&quot; property of files named &quot;feature.properties&quot; found within a Feature.
-Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in
-that directory.</p>
-
-<p>THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.  SOME OF THESE
-OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):</p>
-
-<ul>
-	<li>Common Public License Version 1.0 (available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>)</li>
-	<li>Apache Software License 1.1 (available at <a href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</a>)</li>
-	<li>Apache Software License 2.0 (available at <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>)</li>
-	<li>IBM Public License 1.0 (available at <a href="http://oss.software.ibm.com/developerworks/opensource/license10.html">http://oss.software.ibm.com/developerworks/opensource/license10.html</a>)</li>	
-	<li>Metro Link Public License 1.00 (available at <a href="http://www.opengroup.org/openmotif/supporters/metrolink/license.html">http://www.opengroup.org/openmotif/supporters/metrolink/license.html</a>)</li>
-	<li>Mozilla Public License Version 1.1 (available at <a href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</a>)</li>
-  
-  <LI>Common Development and Distribution License (CDDL) Version 1.0 (available at <A 
-  href="http://www.sun.com/cddl/cddl.html">http://www.sun.com/cddl/cddl.html)</A>
-  </LI>
-</UL>
-
-<p>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT.  If no About, Feature License, or Feature Update License is provided, please
-contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.</p>
-
-<h3>Cryptography</h3>
-
-<p>Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to
-   another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import,
-   possession, or use, and re-export of encryption software, to see if this is permitted.</p>
-   
-<small>Java and all Java-based trademarks are trademarks of Sun Microsystems, Inc. in the United States, other countries, or both.</small>   
-</body>
-</html>
diff --git a/jsf/features/org.eclipse.jsf.feature/sourceTemplateBundle/plugin.properties b/jsf/features/org.eclipse.jsf.feature/sourceTemplateBundle/plugin.properties
deleted file mode 100644
index 1c402d4..0000000
--- a/jsf/features/org.eclipse.jsf.feature/sourceTemplateBundle/plugin.properties
+++ /dev/null
@@ -1,12 +0,0 @@
-###############################################################################
-# Copyright (c) 2005, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-pluginName=JavaServer Faces Tools - Source
-providerName=Eclipse.org
diff --git a/jsf/features/org.eclipse.jsf.feature/sourceTemplateFeature/build.properties b/jsf/features/org.eclipse.jsf.feature/sourceTemplateFeature/build.properties
deleted file mode 100644
index 963f71d..0000000
--- a/jsf/features/org.eclipse.jsf.feature/sourceTemplateFeature/build.properties
+++ /dev/null
@@ -1,16 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2005 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation- initial API and implementation
-###############################################################################
-bin.includes =\
-epl-v10.html,\
-eclipse_update_120.jpg,\
-feature.xml,\
-feature.properties,\
-license.html
diff --git a/jsf/features/org.eclipse.jsf.feature/sourceTemplateFeature/eclipse_update_120.jpg b/jsf/features/org.eclipse.jsf.feature/sourceTemplateFeature/eclipse_update_120.jpg
deleted file mode 100644
index bfdf708..0000000
--- a/jsf/features/org.eclipse.jsf.feature/sourceTemplateFeature/eclipse_update_120.jpg
+++ /dev/null
Binary files differ
diff --git a/jsf/features/org.eclipse.jsf.feature/sourceTemplateFeature/epl-v10.html b/jsf/features/org.eclipse.jsf.feature/sourceTemplateFeature/epl-v10.html
deleted file mode 100644
index 022ad29..0000000
--- a/jsf/features/org.eclipse.jsf.feature/sourceTemplateFeature/epl-v10.html
+++ /dev/null
@@ -1,328 +0,0 @@
-<html xmlns:o="urn:schemas-microsoft-com:office:office"
-xmlns:w="urn:schemas-microsoft-com:office:word"
-xmlns="http://www.w3.org/TR/REC-html40">
-
-<head>
-<meta http-equiv=Content-Type content="text/html; charset=windows-1252">
-<meta name=ProgId content=Word.Document>
-<meta name=Generator content="Microsoft Word 9">
-<meta name=Originator content="Microsoft Word 9">
-<link rel=File-List
-href="./Eclipse%20EPL%202003_11_10%20Final_files/filelist.xml">
-<title>Eclipse Public License - Version 1.0</title>
-<!--[if gte mso 9]><xml>
- <o:DocumentProperties>
-  <o:Revision>2</o:Revision>
-  <o:TotalTime>3</o:TotalTime>
-  <o:Created>2004-03-05T23:03:00Z</o:Created>
-  <o:LastSaved>2004-03-05T23:03:00Z</o:LastSaved>
-  <o:Pages>4</o:Pages>
-  <o:Words>1626</o:Words>
-  <o:Characters>9270</o:Characters>
-   <o:Lines>77</o:Lines>
-  <o:Paragraphs>18</o:Paragraphs>
-  <o:CharactersWithSpaces>11384</o:CharactersWithSpaces>
-  <o:Version>9.4402</o:Version>
- </o:DocumentProperties>
-</xml><![endif]--><!--[if gte mso 9]><xml>
- <w:WordDocument>
-  <w:TrackRevisions/>
- </w:WordDocument>
-</xml><![endif]-->
-<style>
-<!--
- /* Font Definitions */
-@font-face
-	{font-family:Tahoma;
-	panose-1:2 11 6 4 3 5 4 4 2 4;
-	mso-font-charset:0;
-	mso-generic-font-family:swiss;
-	mso-font-pitch:variable;
-	mso-font-signature:553679495 -2147483648 8 0 66047 0;}
- /* Style Definitions */
-p.MsoNormal, li.MsoNormal, div.MsoNormal
-	{mso-style-parent:"";
-	margin:0in;
-	margin-bottom:.0001pt;
-	mso-pagination:widow-orphan;
-	font-size:12.0pt;
-	font-family:"Times New Roman";
-	mso-fareast-font-family:"Times New Roman";}
-p
-	{margin-right:0in;
-	mso-margin-top-alt:auto;
-	mso-margin-bottom-alt:auto;
-	margin-left:0in;
-	mso-pagination:widow-orphan;
-	font-size:12.0pt;
-	font-family:"Times New Roman";
-	mso-fareast-font-family:"Times New Roman";}
-p.BalloonText, li.BalloonText, div.BalloonText
-	{mso-style-name:"Balloon Text";
-	margin:0in;
-	margin-bottom:.0001pt;
-	mso-pagination:widow-orphan;
-	font-size:8.0pt;
-	font-family:Tahoma;
-	mso-fareast-font-family:"Times New Roman";}
-@page Section1
-	{size:8.5in 11.0in;
-	margin:1.0in 1.25in 1.0in 1.25in;
-	mso-header-margin:.5in;
-	mso-footer-margin:.5in;
-	mso-paper-source:0;}
-div.Section1
-	{page:Section1;}
--->
-</style>
-</head>
-
-<body lang=EN-US style='tab-interval:.5in'>
-
-<div class=Section1>
-
-<p align=center style='text-align:center'><b>Eclipse Public License - v 1.0</b>
-</p>
-
-<p><span style='font-size:10.0pt'>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER
-THE TERMS OF THIS ECLIPSE PUBLIC LICENSE (&quot;AGREEMENT&quot;). ANY USE,
-REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE
-OF THIS AGREEMENT.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>1. DEFINITIONS</span></b> </p>
-
-<p><span style='font-size:10.0pt'>&quot;Contribution&quot; means:</span> </p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-in the case of the initial Contributor, the initial code and documentation
-distributed under this Agreement, and<br clear=left>
-b) in the case of each subsequent Contributor:</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>i)
-changes to the Program, and</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>ii)
-additions to the Program;</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>where
-such changes and/or additions to the Program originate from and are distributed
-by that particular Contributor. A Contribution 'originates' from a Contributor
-if it was added to the Program by such Contributor itself or anyone acting on
-such Contributor's behalf. Contributions do not include additions to the
-Program which: (i) are separate modules of software distributed in conjunction
-with the Program under their own license agreement, and (ii) are not derivative
-works of the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>&quot;Contributor&quot; means any person or
-entity that distributes the Program.</span> </p>
-
-<p><span style='font-size:10.0pt'>&quot;Licensed Patents &quot; mean patent
-claims licensable by a Contributor which are necessarily infringed by the use
-or sale of its Contribution alone or when combined with the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>&quot;Program&quot; means the Contributions
-distributed in accordance with this Agreement.</span> </p>
-
-<p><span style='font-size:10.0pt'>&quot;Recipient&quot; means anyone who
-receives the Program under this Agreement, including all Contributors.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>2. GRANT OF RIGHTS</span></b> </p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-Subject to the terms of this Agreement, each Contributor hereby grants Recipient
-a non-exclusive, worldwide, royalty-free copyright license to<span
-style='color:red'> </span>reproduce, prepare derivative works of, publicly
-display, publicly perform, distribute and sublicense the Contribution of such
-Contributor, if any, and such derivative works, in source code and object code
-form.</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b)
-Subject to the terms of this Agreement, each Contributor hereby grants
-Recipient a non-exclusive, worldwide,<span style='color:green'> </span>royalty-free
-patent license under Licensed Patents to make, use, sell, offer to sell, import
-and otherwise transfer the Contribution of such Contributor, if any, in source
-code and object code form. This patent license shall apply to the combination
-of the Contribution and the Program if, at the time the Contribution is added
-by the Contributor, such addition of the Contribution causes such combination
-to be covered by the Licensed Patents. The patent license shall not apply to
-any other combinations which include the Contribution. No hardware per se is
-licensed hereunder. </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>c)
-Recipient understands that although each Contributor grants the licenses to its
-Contributions set forth herein, no assurances are provided by any Contributor
-that the Program does not infringe the patent or other intellectual property
-rights of any other entity. Each Contributor disclaims any liability to Recipient
-for claims brought by any other entity based on infringement of intellectual
-property rights or otherwise. As a condition to exercising the rights and
-licenses granted hereunder, each Recipient hereby assumes sole responsibility
-to secure any other intellectual property rights needed, if any. For example,
-if a third party patent license is required to allow Recipient to distribute
-the Program, it is Recipient's responsibility to acquire that license before
-distributing the Program.</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>d)
-Each Contributor represents that to its knowledge it has sufficient copyright
-rights in its Contribution, if any, to grant the copyright license set forth in
-this Agreement. </span></p>
-
-<p><b><span style='font-size:10.0pt'>3. REQUIREMENTS</span></b> </p>
-
-<p><span style='font-size:10.0pt'>A Contributor may choose to distribute the
-Program in object code form under its own license agreement, provided that:</span>
-</p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-it complies with the terms and conditions of this Agreement; and</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b)
-its license agreement:</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>i)
-effectively disclaims on behalf of all Contributors all warranties and
-conditions, express and implied, including warranties or conditions of title
-and non-infringement, and implied warranties or conditions of merchantability
-and fitness for a particular purpose; </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>ii)
-effectively excludes on behalf of all Contributors all liability for damages,
-including direct, indirect, special, incidental and consequential damages, such
-as lost profits; </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>iii)
-states that any provisions which differ from this Agreement are offered by that
-Contributor alone and not by any other party; and</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>iv)
-states that source code for the Program is available from such Contributor, and
-informs licensees how to obtain it in a reasonable manner on or through a
-medium customarily used for software exchange.<span style='color:blue'> </span></span></p>
-
-<p><span style='font-size:10.0pt'>When the Program is made available in source
-code form:</span> </p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-it must be made available under this Agreement; and </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b) a
-copy of this Agreement must be included with each copy of the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>Contributors may not remove or alter any
-copyright notices contained within the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>Each Contributor must identify itself as the
-originator of its Contribution, if any, in a manner that reasonably allows
-subsequent Recipients to identify the originator of the Contribution. </span></p>
-
-<p><b><span style='font-size:10.0pt'>4. COMMERCIAL DISTRIBUTION</span></b> </p>
-
-<p><span style='font-size:10.0pt'>Commercial distributors of software may
-accept certain responsibilities with respect to end users, business partners
-and the like. While this license is intended to facilitate the commercial use
-of the Program, the Contributor who includes the Program in a commercial
-product offering should do so in a manner which does not create potential
-liability for other Contributors. Therefore, if a Contributor includes the
-Program in a commercial product offering, such Contributor (&quot;Commercial
-Contributor&quot;) hereby agrees to defend and indemnify every other
-Contributor (&quot;Indemnified Contributor&quot;) against any losses, damages and
-costs (collectively &quot;Losses&quot;) arising from claims, lawsuits and other
-legal actions brought by a third party against the Indemnified Contributor to
-the extent caused by the acts or omissions of such Commercial Contributor in
-connection with its distribution of the Program in a commercial product
-offering. The obligations in this section do not apply to any claims or Losses
-relating to any actual or alleged intellectual property infringement. In order
-to qualify, an Indemnified Contributor must: a) promptly notify the Commercial
-Contributor in writing of such claim, and b) allow the Commercial Contributor
-to control, and cooperate with the Commercial Contributor in, the defense and
-any related settlement negotiations. The Indemnified Contributor may participate
-in any such claim at its own expense.</span> </p>
-
-<p><span style='font-size:10.0pt'>For example, a Contributor might include the
-Program in a commercial product offering, Product X. That Contributor is then a
-Commercial Contributor. If that Commercial Contributor then makes performance
-claims, or offers warranties related to Product X, those performance claims and
-warranties are such Commercial Contributor's responsibility alone. Under this
-section, the Commercial Contributor would have to defend claims against the
-other Contributors related to those performance claims and warranties, and if a
-court requires any other Contributor to pay any damages as a result, the
-Commercial Contributor must pay those damages.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>5. NO WARRANTY</span></b> </p>
-
-<p><span style='font-size:10.0pt'>EXCEPT AS EXPRESSLY SET FORTH IN THIS
-AGREEMENT, THE PROGRAM IS PROVIDED ON AN &quot;AS IS&quot; 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. Each Recipient is solely
-responsible for determining the appropriateness of using and distributing the
-Program and assumes all risks associated with its exercise of rights under this
-Agreement , including but not limited to the risks and costs of program errors,
-compliance with applicable laws, damage to or loss of data, programs or
-equipment, and unavailability or interruption of operations. </span></p>
-
-<p><b><span style='font-size:10.0pt'>6. DISCLAIMER OF LIABILITY</span></b> </p>
-
-<p><span style='font-size:10.0pt'>EXCEPT AS EXPRESSLY SET FORTH IN THIS
-AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY
-OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF
-THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF
-THE POSSIBILITY OF SUCH DAMAGES.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>7. GENERAL</span></b> </p>
-
-<p><span style='font-size:10.0pt'>If any provision of this Agreement is invalid
-or unenforceable under applicable law, it shall not affect the validity or
-enforceability of the remainder of the terms of this Agreement, and without
-further action by the parties hereto, such provision shall be reformed to the
-minimum extent necessary to make such provision valid and enforceable.</span> </p>
-
-<p><span style='font-size:10.0pt'>If Recipient institutes patent litigation
-against any entity (including a cross-claim or counterclaim in a lawsuit)
-alleging that the Program itself (excluding combinations of the Program with
-other software or hardware) infringes such Recipient's patent(s), then such
-Recipient's rights granted under Section 2(b) shall terminate as of the date
-such litigation is filed. </span></p>
-
-<p><span style='font-size:10.0pt'>All Recipient's rights under this Agreement
-shall terminate if it fails to comply with any of the material terms or
-conditions of this Agreement and does not cure such failure in a reasonable
-period of time after becoming aware of such noncompliance. If all Recipient's
-rights under this Agreement terminate, Recipient agrees to cease use and
-distribution of the Program as soon as reasonably practicable. However,
-Recipient's obligations under this Agreement and any licenses granted by
-Recipient relating to the Program shall continue and survive. </span></p>
-
-<p><span style='font-size:10.0pt'>Everyone is permitted to copy and distribute
-copies of this Agreement, but in order to avoid inconsistency the Agreement is
-copyrighted and may only be modified in the following manner. The Agreement
-Steward reserves the right to publish new versions (including revisions) of
-this Agreement from time to time. No one other than the Agreement Steward has
-the right to modify this Agreement. The Eclipse Foundation is the initial
-Agreement Steward. The Eclipse Foundation may assign the responsibility to
-serve as the Agreement Steward to a suitable separate entity. Each new version
-of the Agreement will be given a distinguishing version number. The Program
-(including Contributions) may always be distributed subject to the version of
-the Agreement under which it was received. In addition, after a new version of
-the Agreement is published, Contributor may elect to distribute the Program
-(including its Contributions) under the new version. Except as expressly stated
-in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to
-the intellectual property of any Contributor under this Agreement, whether
-expressly, by implication, estoppel or otherwise. All rights in the Program not
-expressly granted under this Agreement are reserved.</span> </p>
-
-<p><span style='font-size:10.0pt'>This Agreement is governed by the laws of the
-State of New York and the intellectual property laws of the United States of
-America. No party to this Agreement will bring a legal action under this
-Agreement more than one year after the cause of action arose. Each party waives
-its rights to a jury trial in any resulting litigation.</span> </p>
-
-<p class=MsoNormal><![if !supportEmptyParas]>&nbsp;<![endif]><o:p></o:p></p>
-
-</div>
-
-</body>
-
-</html>
diff --git a/jsf/features/org.eclipse.jsf.feature/sourceTemplateFeature/feature.properties b/jsf/features/org.eclipse.jsf.feature/sourceTemplateFeature/feature.properties
deleted file mode 100644
index 60a119c..0000000
--- a/jsf/features/org.eclipse.jsf.feature/sourceTemplateFeature/feature.properties
+++ /dev/null
@@ -1,166 +0,0 @@
-###############################################################################
-# Copyright (c) 2006 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-# feature.properties
-# contains externalized strings for feature.xml
-# "%foo" in feature.xml corresponds to the key "foo" in this file
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# This file should be translated.
-
-# "featureName" property - name of the feature
-name=JavaServer Faces Tools (JSF) Project
-# "providerName" property - name of the company that provides the feature
-provider=Eclipse Web Tools Platform
-# "description" property - description of the feature
-description=WTP JavaServer Faces Tools (JSF) Project
-
-# "copyright" property - text of the "Feature Update Copyright"
-copyright=\
-Copyright (c) 2006 Oracle Corporation.\
-All rights reserved. This program and the accompanying materials\
-are made available under the terms of the Eclipse Public License v1.0\
-which accompanies this distribution, and is available at\
-http://www.eclipse.org/legal/epl-v10.html\
-\n\
-Contributors:\n\
-    Oracle Corporation - initial API and implementation\n
-################ end of copyright property ####################################
-
-
-# "licenseURL" property - URL of the "Feature License"
-# do not translate value - just change to point to a locale-specific HTML page
-licenseURL=license.html
-
-# "license" property - text of the "Feature Update License"
-# should be plain text version of license agreement pointed to be "licenseURL"
-license=\
-Eclipse Foundation Software User Agreement\n\
-April 14, 2010\n\
-\n\
-Usage Of Content\n\
-\n\
-THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR\n\
-OTHER MATERIALS FOR OPEN SOURCE PROJECTS (COLLECTIVELY "CONTENT").\n\
-USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS\n\
-AGREEMENT AND/OR THE TERMS AND CONDITIONS OF LICENSE AGREEMENTS OR\n\
-NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU\n\
-AGREE THAT YOUR USE OF THE CONTENT IS GOVERNED BY THIS AGREEMENT\n\
-AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS\n\
-OR NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE\n\
-TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND CONDITIONS\n\
-OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED\n\
-BELOW, THEN YOU MAY NOT USE THE CONTENT.\n\
-\n\
-Applicable Licenses\n\
-\n\
-Unless otherwise indicated, all Content made available by the\n\
-Eclipse Foundation is provided to you under the terms and conditions of\n\
-the Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is\n\
-provided with this Content and is also available at http://www.eclipse.org/legal/epl-v10.html.\n\
-For purposes of the EPL, "Program" will mean the Content.\n\
-\n\
-Content includes, but is not limited to, source code, object code,\n\
-documentation and other files maintained in the Eclipse Foundation source code\n\
-repository ("Repository") in software modules ("Modules") and made available\n\
-as downloadable archives ("Downloads").\n\
-\n\
-       - Content may be structured and packaged into modules to facilitate delivering,\n\
-         extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"),\n\
-         plug-in fragments ("Fragments"), and features ("Features").\n\
-       - Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java(TM) ARchive)\n\
-         in a directory named "plugins".\n\
-       - A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.\n\
-         Each Feature may be packaged as a sub-directory in a directory named "features".\n\
-         Within a Feature, files named "feature.xml" may contain a list of the names and version\n\
-         numbers of the Plug-ins and/or Fragments associated with that Feature.\n\
-       - Features may also include other Features ("Included Features"). Within a Feature, files\n\
-         named "feature.xml" may contain a list of the names and version numbers of Included Features.\n\
-\n\
-The terms and conditions governing Plug-ins and Fragments should be\n\
-contained in files named "about.html" ("Abouts"). The terms and\n\
-conditions governing Features and Included Features should be contained\n\
-in files named "license.html" ("Feature Licenses"). Abouts and Feature\n\
-Licenses may be located in any directory of a Download or Module\n\
-including, but not limited to the following locations:\n\
-\n\
-       - The top-level (root) directory\n\
-       - Plug-in and Fragment directories\n\
-       - Inside Plug-ins and Fragments packaged as JARs\n\
-       - Sub-directories of the directory named "src" of certain Plug-ins\n\
-       - Feature directories\n\
-\n\
-Note: if a Feature made available by the Eclipse Foundation is installed using the\n\
-Provisioning Technology (as defined below), you must agree to a license ("Feature \n\
-Update License") during the installation process. If the Feature contains\n\
-Included Features, the Feature Update License should either provide you\n\
-with the terms and conditions governing the Included Features or inform\n\
-you where you can locate them. Feature Update Licenses may be found in\n\
-the "license" property of files named "feature.properties" found within a Feature.\n\
-Such Abouts, Feature Licenses, and Feature Update Licenses contain the\n\
-terms and conditions (or references to such terms and conditions) that\n\
-govern your use of the associated Content in that directory.\n\
-\n\
-THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER\n\
-TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.\n\
-SOME OF THESE OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):\n\
-\n\
-       - Common Public License Version 1.0 (available at http://www.eclipse.org/legal/cpl-v10.html)\n\
-       - Apache Software License 1.1 (available at http://www.apache.org/licenses/LICENSE)\n\
-       - Apache Software License 2.0 (available at http://www.apache.org/licenses/LICENSE-2.0)\n\
-       - Metro Link Public License 1.00 (available at http://www.opengroup.org/openmotif/supporters/metrolink/license.html)\n\
-       - Mozilla Public License Version 1.1 (available at http://www.mozilla.org/MPL/MPL-1.1.html)\n\
-\n\
-IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR\n\
-TO USE OF THE CONTENT. If no About, Feature License, or Feature Update License\n\
-is provided, please contact the Eclipse Foundation to determine what terms and conditions\n\
-govern that particular Content.\n\
-\n\
-\n\Use of Provisioning Technology\n\
-\n\
-The Eclipse Foundation makes available provisioning software, examples of which include,\n\
-but are not limited to, p2 and the Eclipse Update Manager ("Provisioning Technology") for\n\
-the purpose of allowing users to install software, documentation, information and/or\n\
-other materials (collectively "Installable Software"). This capability is provided with\n\
-the intent of allowing such users to install, extend and update Eclipse-based products.\n\
-Information about packaging Installable Software is available at\n\
-http://eclipse.org/equinox/p2/repository_packaging.html ("Specification").\n\
-\n\
-You may use Provisioning Technology to allow other parties to install Installable Software.\n\
-You shall be responsible for enabling the applicable license agreements relating to the\n\
-Installable Software to be presented to, and accepted by, the users of the Provisioning Technology\n\
-in accordance with the Specification. By using Provisioning Technology in such a manner and\n\
-making it available in accordance with the Specification, you further acknowledge your\n\
-agreement to, and the acquisition of all necessary rights to permit the following:\n\
-\n\
-       1. A series of actions may occur ("Provisioning Process") in which a user may execute\n\
-          the Provisioning Technology on a machine ("Target Machine") with the intent of installing,\n\
-          extending or updating the functionality of an Eclipse-based product.\n\
-       2. During the Provisioning Process, the Provisioning Technology may cause third party\n\
-          Installable Software or a portion thereof to be accessed and copied to the Target Machine.\n\
-       3. Pursuant to the Specification, you will provide to the user the terms and conditions that\n\
-          govern the use of the Installable Software ("Installable Software Agreement") and such\n\
-          Installable Software Agreement shall be accessed from the Target Machine in accordance\n\
-          with the Specification. Such Installable Software Agreement must inform the user of the\n\
-          terms and conditions that govern the Installable Software and must solicit acceptance by\n\
-          the end user in the manner prescribed in such Installable Software Agreement. Upon such\n\
-          indication of agreement by the user, the provisioning Technology will complete installation\n\
-          of the Installable Software.\n\
-\n\
-Cryptography\n\
-\n\
-Content may contain encryption software. The country in which you are\n\
-currently may have restrictions on the import, possession, and use,\n\
-and/or re-export to another country, of encryption software. BEFORE\n\
-using any encryption software, please check the country's laws,\n\
-regulations and policies concerning the import, possession, or use, and\n\
-re-export of encryption software, to see if this is permitted.\n\
-\n\
-Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.\n
-########### end of license property ##########################################
diff --git a/jsf/features/org.eclipse.jsf.feature/sourceTemplateFeature/license.html b/jsf/features/org.eclipse.jsf.feature/sourceTemplateFeature/license.html
deleted file mode 100644
index c184ca3..0000000
--- a/jsf/features/org.eclipse.jsf.feature/sourceTemplateFeature/license.html
+++ /dev/null
@@ -1,107 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1" ?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
-<title>Eclipse Foundation Software User Agreement</title>
-</head>
-
-<body lang="EN-US">
-<h2>Eclipse Foundation Software User Agreement</h2>
-<p>April 14, 2010</p>
-
-<h3>Usage Of Content</h3>
-
-<p>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS
-   (COLLECTIVELY &quot;CONTENT&quot;).  USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND
-   CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU AGREE THAT YOUR USE
-   OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR
-   NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND
-   CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.</p>
-
-<h3>Applicable Licenses</h3>
-
-<p>Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0
-   (&quot;EPL&quot;).  A copy of the EPL is provided with this Content and is also available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-   For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse Foundation source code
-   repository (&quot;Repository&quot;) in software modules (&quot;Modules&quot;) and made available as downloadable archives (&quot;Downloads&quot;).</p>
-
-<ul>
-       <li>Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content.  Typical modules may include plug-ins (&quot;Plug-ins&quot;), plug-in fragments (&quot;Fragments&quot;), and features (&quot;Features&quot;).</li>
-       <li>Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java&trade; ARchive) in a directory named &quot;plugins&quot;.</li>
-       <li>A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.  Each Feature may be packaged as a sub-directory in a directory named &quot;features&quot;.  Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of the Plug-ins
-      and/or Fragments associated with that Feature.</li>
-       <li>Features may also include other Features (&quot;Included Features&quot;). Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of Included Features.</li>
-</ul>
-
-<p>The terms and conditions governing Plug-ins and Fragments should be contained in files named &quot;about.html&quot; (&quot;Abouts&quot;). The terms and conditions governing Features and
-Included Features should be contained in files named &quot;license.html&quot; (&quot;Feature Licenses&quot;).  Abouts and Feature Licenses may be located in any directory of a Download or Module
-including, but not limited to the following locations:</p>
-
-<ul>
-       <li>The top-level (root) directory</li>
-       <li>Plug-in and Fragment directories</li>
-       <li>Inside Plug-ins and Fragments packaged as JARs</li>
-       <li>Sub-directories of the directory named &quot;src&quot; of certain Plug-ins</li>
-       <li>Feature directories</li>
-</ul>
-
-<p>Note: if a Feature made available by the Eclipse Foundation is installed using the Provisioning Technology (as defined below), you must agree to a license (&quot;Feature Update License&quot;) during the
-installation process.  If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or
-inform you where you can locate them.  Feature Update Licenses may be found in the &quot;license&quot; property of files named &quot;feature.properties&quot; found within a Feature.
-Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in
-that directory.</p>
-
-<p>THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.  SOME OF THESE
-OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):</p>
-
-<ul>
-       <li>Common Public License Version 1.0 (available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>)</li>
-       <li>Apache Software License 1.1 (available at <a href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</a>)</li>
-       <li>Apache Software License 2.0 (available at <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>)</li>
-       <li>Metro Link Public License 1.00 (available at <a href="http://www.opengroup.org/openmotif/supporters/metrolink/license.html">http://www.opengroup.org/openmotif/supporters/metrolink/license.html</a>)</li>
-       <li>Mozilla Public License Version 1.1 (available at <a href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</a>)</li>
-</ul>
-
-<p>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT.  If no About, Feature License, or Feature Update License is provided, please
-contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.</p>
-
-
-<h3>Use of Provisioning Technology</h3>
-
-<p>The Eclipse Foundation makes available provisioning software, examples of which include, but are not limited to, p2 and the Eclipse
-   Update Manager (&quot;Provisioning Technology&quot;) for the purpose of allowing users to install software, documentation, information and/or
-   other materials (collectively &quot;Installable Software&quot;). This capability is provided with the intent of allowing such users to
-   install, extend and update Eclipse-based products. Information about packaging Installable Software is available at <a
-       href="http://eclipse.org/equinox/p2/repository_packaging.html">http://eclipse.org/equinox/p2/repository_packaging.html</a>
-   (&quot;Specification&quot;).</p>
-
-<p>You may use Provisioning Technology to allow other parties to install Installable Software. You shall be responsible for enabling the
-   applicable license agreements relating to the Installable Software to be presented to, and accepted by, the users of the Provisioning Technology
-   in accordance with the Specification. By using Provisioning Technology in such a manner and making it available in accordance with the
-   Specification, you further acknowledge your agreement to, and the acquisition of all necessary rights to permit the following:</p>
-
-<ol>
-       <li>A series of actions may occur (&quot;Provisioning Process&quot;) in which a user may execute the Provisioning Technology
-       on a machine (&quot;Target Machine&quot;) with the intent of installing, extending or updating the functionality of an Eclipse-based
-       product.</li>
-       <li>During the Provisioning Process, the Provisioning Technology may cause third party Installable Software or a portion thereof to be
-       accessed and copied to the Target Machine.</li>
-       <li>Pursuant to the Specification, you will provide to the user the terms and conditions that govern the use of the Installable
-       Software (&quot;Installable Software Agreement&quot;) and such Installable Software Agreement shall be accessed from the Target
-       Machine in accordance with the Specification. Such Installable Software Agreement must inform the user of the terms and conditions that govern
-       the Installable Software and must solicit acceptance by the end user in the manner prescribed in such Installable Software Agreement. Upon such
-       indication of agreement by the user, the provisioning Technology will complete installation of the Installable Software.</li>
-</ol>
-
-<h3>Cryptography</h3>
-
-<p>Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to
-   another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import,
-   possession, or use, and re-export of encryption software, to see if this is permitted.</p>
-
-<p><small>Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.</small></p>
-</body>
-</html>
diff --git a/jsf/features/org.eclipse.jsf.feature/sourceTemplatePlugin/about.html b/jsf/features/org.eclipse.jsf.feature/sourceTemplatePlugin/about.html
deleted file mode 100644
index e991479..0000000
--- a/jsf/features/org.eclipse.jsf.feature/sourceTemplatePlugin/about.html
+++ /dev/null
@@ -1,27 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<head>
-<title>About</title>
-<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
-
-<p>June, 2008</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise indicated below, the Content is provided to you under the terms and conditions of the
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content.</p>
-
-<h3>Source Code</h3>
-<p>This plug-in contains source code zip files (&quot;Source Zips&quot;) that correspond to binary content in other plug-ins. These Source Zips may be distributed under different license
-agreements and/or notices. Details about these license agreements and notices are contained in &quot;about.html&quot; files (&quot;Abouts&quot;) located in sub-directories in the
-src/ directory of this plug-in. Such Abouts govern your use of the Source Zips in that directory, not the EPL.</p>
-
-</body>
-</html>
diff --git a/jsf/features/org.eclipse.jsf.feature/sourceTemplatePlugin/about.ini b/jsf/features/org.eclipse.jsf.feature/sourceTemplatePlugin/about.ini
deleted file mode 100644
index 2dee36a..0000000
--- a/jsf/features/org.eclipse.jsf.feature/sourceTemplatePlugin/about.ini
+++ /dev/null
@@ -1,31 +0,0 @@
-# about.ini
-# contains information about a feature
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# "%key" are externalized strings defined in about.properties
-# This file does not need to be translated.
-
-# Property "aboutText" contains blurb for "About" dialog (translated)
-aboutText=%blurb
-
-# Property "windowImage" contains path to window icon (16x16)
-# needed for primary features only
-
-# Property "featureImage" contains path to feature image (32x32)
-featureImage=eclipse32.gif
-
-# Property "aboutImage" contains path to product image (500x330 or 115x164)
-# needed for primary features only
-
-# Property "appName" contains name of the application (not translated)
-# needed for primary features only
-
-# Property "welcomePage" contains path to welcome page (special XML-based format)
-# optional
-
-# Property "welcomePerspective" contains the id of the perspective in which the
-# welcome page is to be opened.
-# optional
-
-
-
-
diff --git a/jsf/features/org.eclipse.jsf.feature/sourceTemplatePlugin/about.mappings b/jsf/features/org.eclipse.jsf.feature/sourceTemplatePlugin/about.mappings
deleted file mode 100644
index a28390a..0000000
--- a/jsf/features/org.eclipse.jsf.feature/sourceTemplatePlugin/about.mappings
+++ /dev/null
@@ -1,6 +0,0 @@
-# about.mappings
-# contains fill-ins for about.properties
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# This file does not need to be translated.
-
-0=@build@
diff --git a/jsf/features/org.eclipse.jsf.feature/sourceTemplatePlugin/about.properties b/jsf/features/org.eclipse.jsf.feature/sourceTemplatePlugin/about.properties
deleted file mode 100644
index 4e33f86..0000000
--- a/jsf/features/org.eclipse.jsf.feature/sourceTemplatePlugin/about.properties
+++ /dev/null
@@ -1,26 +0,0 @@
-###############################################################################
-# Copyright (c) 2005, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-# about.properties
-# contains externalized strings for about.ini
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# fill-ins are supplied by about.mappings
-# This file should be translated.
-#
-# Do not translate any values surrounded by {}
-
-blurb=JavaServer Faces Tools Source\n\
-\n\
-Version: {featureVersion}\n\
-Build id: {0}\n\
-\n\
-(c) Copyright Eclipse contributors and others 2005.  All rights reserved.\n\
-Visit http://www.eclipse.org/webtools
-
diff --git a/jsf/features/org.eclipse.jsf.feature/sourceTemplatePlugin/build.properties b/jsf/features/org.eclipse.jsf.feature/sourceTemplatePlugin/build.properties
deleted file mode 100644
index 05582e3..0000000
--- a/jsf/features/org.eclipse.jsf.feature/sourceTemplatePlugin/build.properties
+++ /dev/null
@@ -1,12 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-bin.includes = about.html, about.ini, about.mappings, about.properties, eclipse32.gif, plugin.properties, plugin.xml, src/**, META-INF/
-sourcePlugin = true
diff --git a/jsf/features/org.eclipse.jsf.feature/sourceTemplatePlugin/eclipse32.gif b/jsf/features/org.eclipse.jsf.feature/sourceTemplatePlugin/eclipse32.gif
deleted file mode 100644
index e6ad7cc..0000000
--- a/jsf/features/org.eclipse.jsf.feature/sourceTemplatePlugin/eclipse32.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/features/org.eclipse.jsf.feature/sourceTemplatePlugin/eclipse32.png b/jsf/features/org.eclipse.jsf.feature/sourceTemplatePlugin/eclipse32.png
deleted file mode 100644
index 50ae49d..0000000
--- a/jsf/features/org.eclipse.jsf.feature/sourceTemplatePlugin/eclipse32.png
+++ /dev/null
Binary files differ
diff --git a/jsf/features/org.eclipse.jsf.feature/sourceTemplatePlugin/eclipse_update_120.jpg b/jsf/features/org.eclipse.jsf.feature/sourceTemplatePlugin/eclipse_update_120.jpg
deleted file mode 100644
index bfdf708..0000000
--- a/jsf/features/org.eclipse.jsf.feature/sourceTemplatePlugin/eclipse_update_120.jpg
+++ /dev/null
Binary files differ
diff --git a/jsf/features/org.eclipse.jsf.feature/sourceTemplatePlugin/epl-v10.html b/jsf/features/org.eclipse.jsf.feature/sourceTemplatePlugin/epl-v10.html
deleted file mode 100644
index 022ad29..0000000
--- a/jsf/features/org.eclipse.jsf.feature/sourceTemplatePlugin/epl-v10.html
+++ /dev/null
@@ -1,328 +0,0 @@
-<html xmlns:o="urn:schemas-microsoft-com:office:office"
-xmlns:w="urn:schemas-microsoft-com:office:word"
-xmlns="http://www.w3.org/TR/REC-html40">
-
-<head>
-<meta http-equiv=Content-Type content="text/html; charset=windows-1252">
-<meta name=ProgId content=Word.Document>
-<meta name=Generator content="Microsoft Word 9">
-<meta name=Originator content="Microsoft Word 9">
-<link rel=File-List
-href="./Eclipse%20EPL%202003_11_10%20Final_files/filelist.xml">
-<title>Eclipse Public License - Version 1.0</title>
-<!--[if gte mso 9]><xml>
- <o:DocumentProperties>
-  <o:Revision>2</o:Revision>
-  <o:TotalTime>3</o:TotalTime>
-  <o:Created>2004-03-05T23:03:00Z</o:Created>
-  <o:LastSaved>2004-03-05T23:03:00Z</o:LastSaved>
-  <o:Pages>4</o:Pages>
-  <o:Words>1626</o:Words>
-  <o:Characters>9270</o:Characters>
-   <o:Lines>77</o:Lines>
-  <o:Paragraphs>18</o:Paragraphs>
-  <o:CharactersWithSpaces>11384</o:CharactersWithSpaces>
-  <o:Version>9.4402</o:Version>
- </o:DocumentProperties>
-</xml><![endif]--><!--[if gte mso 9]><xml>
- <w:WordDocument>
-  <w:TrackRevisions/>
- </w:WordDocument>
-</xml><![endif]-->
-<style>
-<!--
- /* Font Definitions */
-@font-face
-	{font-family:Tahoma;
-	panose-1:2 11 6 4 3 5 4 4 2 4;
-	mso-font-charset:0;
-	mso-generic-font-family:swiss;
-	mso-font-pitch:variable;
-	mso-font-signature:553679495 -2147483648 8 0 66047 0;}
- /* Style Definitions */
-p.MsoNormal, li.MsoNormal, div.MsoNormal
-	{mso-style-parent:"";
-	margin:0in;
-	margin-bottom:.0001pt;
-	mso-pagination:widow-orphan;
-	font-size:12.0pt;
-	font-family:"Times New Roman";
-	mso-fareast-font-family:"Times New Roman";}
-p
-	{margin-right:0in;
-	mso-margin-top-alt:auto;
-	mso-margin-bottom-alt:auto;
-	margin-left:0in;
-	mso-pagination:widow-orphan;
-	font-size:12.0pt;
-	font-family:"Times New Roman";
-	mso-fareast-font-family:"Times New Roman";}
-p.BalloonText, li.BalloonText, div.BalloonText
-	{mso-style-name:"Balloon Text";
-	margin:0in;
-	margin-bottom:.0001pt;
-	mso-pagination:widow-orphan;
-	font-size:8.0pt;
-	font-family:Tahoma;
-	mso-fareast-font-family:"Times New Roman";}
-@page Section1
-	{size:8.5in 11.0in;
-	margin:1.0in 1.25in 1.0in 1.25in;
-	mso-header-margin:.5in;
-	mso-footer-margin:.5in;
-	mso-paper-source:0;}
-div.Section1
-	{page:Section1;}
--->
-</style>
-</head>
-
-<body lang=EN-US style='tab-interval:.5in'>
-
-<div class=Section1>
-
-<p align=center style='text-align:center'><b>Eclipse Public License - v 1.0</b>
-</p>
-
-<p><span style='font-size:10.0pt'>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER
-THE TERMS OF THIS ECLIPSE PUBLIC LICENSE (&quot;AGREEMENT&quot;). ANY USE,
-REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE
-OF THIS AGREEMENT.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>1. DEFINITIONS</span></b> </p>
-
-<p><span style='font-size:10.0pt'>&quot;Contribution&quot; means:</span> </p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-in the case of the initial Contributor, the initial code and documentation
-distributed under this Agreement, and<br clear=left>
-b) in the case of each subsequent Contributor:</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>i)
-changes to the Program, and</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>ii)
-additions to the Program;</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>where
-such changes and/or additions to the Program originate from and are distributed
-by that particular Contributor. A Contribution 'originates' from a Contributor
-if it was added to the Program by such Contributor itself or anyone acting on
-such Contributor's behalf. Contributions do not include additions to the
-Program which: (i) are separate modules of software distributed in conjunction
-with the Program under their own license agreement, and (ii) are not derivative
-works of the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>&quot;Contributor&quot; means any person or
-entity that distributes the Program.</span> </p>
-
-<p><span style='font-size:10.0pt'>&quot;Licensed Patents &quot; mean patent
-claims licensable by a Contributor which are necessarily infringed by the use
-or sale of its Contribution alone or when combined with the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>&quot;Program&quot; means the Contributions
-distributed in accordance with this Agreement.</span> </p>
-
-<p><span style='font-size:10.0pt'>&quot;Recipient&quot; means anyone who
-receives the Program under this Agreement, including all Contributors.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>2. GRANT OF RIGHTS</span></b> </p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-Subject to the terms of this Agreement, each Contributor hereby grants Recipient
-a non-exclusive, worldwide, royalty-free copyright license to<span
-style='color:red'> </span>reproduce, prepare derivative works of, publicly
-display, publicly perform, distribute and sublicense the Contribution of such
-Contributor, if any, and such derivative works, in source code and object code
-form.</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b)
-Subject to the terms of this Agreement, each Contributor hereby grants
-Recipient a non-exclusive, worldwide,<span style='color:green'> </span>royalty-free
-patent license under Licensed Patents to make, use, sell, offer to sell, import
-and otherwise transfer the Contribution of such Contributor, if any, in source
-code and object code form. This patent license shall apply to the combination
-of the Contribution and the Program if, at the time the Contribution is added
-by the Contributor, such addition of the Contribution causes such combination
-to be covered by the Licensed Patents. The patent license shall not apply to
-any other combinations which include the Contribution. No hardware per se is
-licensed hereunder. </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>c)
-Recipient understands that although each Contributor grants the licenses to its
-Contributions set forth herein, no assurances are provided by any Contributor
-that the Program does not infringe the patent or other intellectual property
-rights of any other entity. Each Contributor disclaims any liability to Recipient
-for claims brought by any other entity based on infringement of intellectual
-property rights or otherwise. As a condition to exercising the rights and
-licenses granted hereunder, each Recipient hereby assumes sole responsibility
-to secure any other intellectual property rights needed, if any. For example,
-if a third party patent license is required to allow Recipient to distribute
-the Program, it is Recipient's responsibility to acquire that license before
-distributing the Program.</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>d)
-Each Contributor represents that to its knowledge it has sufficient copyright
-rights in its Contribution, if any, to grant the copyright license set forth in
-this Agreement. </span></p>
-
-<p><b><span style='font-size:10.0pt'>3. REQUIREMENTS</span></b> </p>
-
-<p><span style='font-size:10.0pt'>A Contributor may choose to distribute the
-Program in object code form under its own license agreement, provided that:</span>
-</p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-it complies with the terms and conditions of this Agreement; and</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b)
-its license agreement:</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>i)
-effectively disclaims on behalf of all Contributors all warranties and
-conditions, express and implied, including warranties or conditions of title
-and non-infringement, and implied warranties or conditions of merchantability
-and fitness for a particular purpose; </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>ii)
-effectively excludes on behalf of all Contributors all liability for damages,
-including direct, indirect, special, incidental and consequential damages, such
-as lost profits; </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>iii)
-states that any provisions which differ from this Agreement are offered by that
-Contributor alone and not by any other party; and</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>iv)
-states that source code for the Program is available from such Contributor, and
-informs licensees how to obtain it in a reasonable manner on or through a
-medium customarily used for software exchange.<span style='color:blue'> </span></span></p>
-
-<p><span style='font-size:10.0pt'>When the Program is made available in source
-code form:</span> </p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-it must be made available under this Agreement; and </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b) a
-copy of this Agreement must be included with each copy of the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>Contributors may not remove or alter any
-copyright notices contained within the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>Each Contributor must identify itself as the
-originator of its Contribution, if any, in a manner that reasonably allows
-subsequent Recipients to identify the originator of the Contribution. </span></p>
-
-<p><b><span style='font-size:10.0pt'>4. COMMERCIAL DISTRIBUTION</span></b> </p>
-
-<p><span style='font-size:10.0pt'>Commercial distributors of software may
-accept certain responsibilities with respect to end users, business partners
-and the like. While this license is intended to facilitate the commercial use
-of the Program, the Contributor who includes the Program in a commercial
-product offering should do so in a manner which does not create potential
-liability for other Contributors. Therefore, if a Contributor includes the
-Program in a commercial product offering, such Contributor (&quot;Commercial
-Contributor&quot;) hereby agrees to defend and indemnify every other
-Contributor (&quot;Indemnified Contributor&quot;) against any losses, damages and
-costs (collectively &quot;Losses&quot;) arising from claims, lawsuits and other
-legal actions brought by a third party against the Indemnified Contributor to
-the extent caused by the acts or omissions of such Commercial Contributor in
-connection with its distribution of the Program in a commercial product
-offering. The obligations in this section do not apply to any claims or Losses
-relating to any actual or alleged intellectual property infringement. In order
-to qualify, an Indemnified Contributor must: a) promptly notify the Commercial
-Contributor in writing of such claim, and b) allow the Commercial Contributor
-to control, and cooperate with the Commercial Contributor in, the defense and
-any related settlement negotiations. The Indemnified Contributor may participate
-in any such claim at its own expense.</span> </p>
-
-<p><span style='font-size:10.0pt'>For example, a Contributor might include the
-Program in a commercial product offering, Product X. That Contributor is then a
-Commercial Contributor. If that Commercial Contributor then makes performance
-claims, or offers warranties related to Product X, those performance claims and
-warranties are such Commercial Contributor's responsibility alone. Under this
-section, the Commercial Contributor would have to defend claims against the
-other Contributors related to those performance claims and warranties, and if a
-court requires any other Contributor to pay any damages as a result, the
-Commercial Contributor must pay those damages.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>5. NO WARRANTY</span></b> </p>
-
-<p><span style='font-size:10.0pt'>EXCEPT AS EXPRESSLY SET FORTH IN THIS
-AGREEMENT, THE PROGRAM IS PROVIDED ON AN &quot;AS IS&quot; 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. Each Recipient is solely
-responsible for determining the appropriateness of using and distributing the
-Program and assumes all risks associated with its exercise of rights under this
-Agreement , including but not limited to the risks and costs of program errors,
-compliance with applicable laws, damage to or loss of data, programs or
-equipment, and unavailability or interruption of operations. </span></p>
-
-<p><b><span style='font-size:10.0pt'>6. DISCLAIMER OF LIABILITY</span></b> </p>
-
-<p><span style='font-size:10.0pt'>EXCEPT AS EXPRESSLY SET FORTH IN THIS
-AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY
-OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF
-THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF
-THE POSSIBILITY OF SUCH DAMAGES.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>7. GENERAL</span></b> </p>
-
-<p><span style='font-size:10.0pt'>If any provision of this Agreement is invalid
-or unenforceable under applicable law, it shall not affect the validity or
-enforceability of the remainder of the terms of this Agreement, and without
-further action by the parties hereto, such provision shall be reformed to the
-minimum extent necessary to make such provision valid and enforceable.</span> </p>
-
-<p><span style='font-size:10.0pt'>If Recipient institutes patent litigation
-against any entity (including a cross-claim or counterclaim in a lawsuit)
-alleging that the Program itself (excluding combinations of the Program with
-other software or hardware) infringes such Recipient's patent(s), then such
-Recipient's rights granted under Section 2(b) shall terminate as of the date
-such litigation is filed. </span></p>
-
-<p><span style='font-size:10.0pt'>All Recipient's rights under this Agreement
-shall terminate if it fails to comply with any of the material terms or
-conditions of this Agreement and does not cure such failure in a reasonable
-period of time after becoming aware of such noncompliance. If all Recipient's
-rights under this Agreement terminate, Recipient agrees to cease use and
-distribution of the Program as soon as reasonably practicable. However,
-Recipient's obligations under this Agreement and any licenses granted by
-Recipient relating to the Program shall continue and survive. </span></p>
-
-<p><span style='font-size:10.0pt'>Everyone is permitted to copy and distribute
-copies of this Agreement, but in order to avoid inconsistency the Agreement is
-copyrighted and may only be modified in the following manner. The Agreement
-Steward reserves the right to publish new versions (including revisions) of
-this Agreement from time to time. No one other than the Agreement Steward has
-the right to modify this Agreement. The Eclipse Foundation is the initial
-Agreement Steward. The Eclipse Foundation may assign the responsibility to
-serve as the Agreement Steward to a suitable separate entity. Each new version
-of the Agreement will be given a distinguishing version number. The Program
-(including Contributions) may always be distributed subject to the version of
-the Agreement under which it was received. In addition, after a new version of
-the Agreement is published, Contributor may elect to distribute the Program
-(including its Contributions) under the new version. Except as expressly stated
-in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to
-the intellectual property of any Contributor under this Agreement, whether
-expressly, by implication, estoppel or otherwise. All rights in the Program not
-expressly granted under this Agreement are reserved.</span> </p>
-
-<p><span style='font-size:10.0pt'>This Agreement is governed by the laws of the
-State of New York and the intellectual property laws of the United States of
-America. No party to this Agreement will bring a legal action under this
-Agreement more than one year after the cause of action arose. Each party waives
-its rights to a jury trial in any resulting litigation.</span> </p>
-
-<p class=MsoNormal><![if !supportEmptyParas]>&nbsp;<![endif]><o:p></o:p></p>
-
-</div>
-
-</body>
-
-</html>
diff --git a/jsf/features/org.eclipse.jsf.feature/sourceTemplatePlugin/license.html b/jsf/features/org.eclipse.jsf.feature/sourceTemplatePlugin/license.html
deleted file mode 100644
index fec4a48..0000000
--- a/jsf/features/org.eclipse.jsf.feature/sourceTemplatePlugin/license.html
+++ /dev/null
@@ -1,82 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<head>
-<meta http-equiv=Content-Type content="text/html; charset=iso-8859-1">
-<title>Eclipse.org Software User Agreement</title>
-</head>
-
-<body lang="EN-US" link=blue vlink=purple>
-<h2>Eclipse Foundation Software User Agreement</h2>
-<p>June 06, 2007</p>
-
-<h3>Usage Of Content</h3>
-
-<p>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS
-   (COLLECTIVELY &quot;CONTENT&quot;).  USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND
-   CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU AGREE THAT YOUR USE
-   OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR
-   NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND
-   CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.</p>
-   
-<h3>Applicable Licenses</h3>   
-   
-<p>Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0
-   (&quot;EPL&quot;).  A copy of the EPL is provided with this Content and is also available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-   For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse.org CVS repository (&quot;Repository&quot;) in CVS
-   modules (&quot;Modules&quot;) and made available as downloadable archives (&quot;Downloads&quot;).</p>
-   
-<ul>
-	<li>Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content.  Typical modules may include plug-ins (&quot;Plug-ins&quot;), plug-in fragments (&quot;Fragments&quot;), and features (&quot;Features&quot;).</li>
-	<li>Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java&trade; ARchive) in a directory named &quot;plugins&quot;.</li>
-	<li>A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.  Each Feature may be packaged as a sub-directory in a directory named &quot;features&quot;.  Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of the Plug-ins
-      and/or Fragments associated with that Feature.</li>
-	<li>Features may also include other Features (&quot;Included Features&quot;). Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of Included Features.</li>
-</ul>   
- 
-<p>The terms and conditions governing Plug-ins and Fragments should be contained in files named &quot;about.html&quot; (&quot;Abouts&quot;). The terms and conditions governing Features and
-Included Features should be contained in files named &quot;license.html&quot; (&quot;Feature Licenses&quot;).  Abouts and Feature Licenses may be located in any directory of a Download or Module
-including, but not limited to the following locations:</p>
-
-<ul>
-	<li>The top-level (root) directory</li>
-	<li>Plug-in and Fragment directories</li>
-	<li>Inside Plug-ins and Fragments packaged as JARs</li>
-	<li>Sub-directories of the directory named &quot;src&quot; of certain Plug-ins</li>
-	<li>Feature directories</li>
-</ul>
-		
-<p>Note: if a Feature made available by the Eclipse Foundation is installed using the Eclipse Update Manager, you must agree to a license (&quot;Feature Update License&quot;) during the
-installation process.  If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or
-inform you where you can locate them.  Feature Update Licenses may be found in the &quot;license&quot; property of files named &quot;feature.properties&quot; found within a Feature.
-Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in
-that directory.</p>
-
-<p>THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.  SOME OF THESE
-OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):</p>
-
-<ul>
-	<li>Common Public License Version 1.0 (available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>)</li>
-	<li>Apache Software License 1.1 (available at <a href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</a>)</li>
-	<li>Apache Software License 2.0 (available at <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>)</li>
-	<li>IBM Public License 1.0 (available at <a href="http://oss.software.ibm.com/developerworks/opensource/license10.html">http://oss.software.ibm.com/developerworks/opensource/license10.html</a>)</li>	
-	<li>Metro Link Public License 1.00 (available at <a href="http://www.opengroup.org/openmotif/supporters/metrolink/license.html">http://www.opengroup.org/openmotif/supporters/metrolink/license.html</a>)</li>
-	<li>Mozilla Public License Version 1.1 (available at <a href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</a>)</li>
-  <LI>Common Development and Distribution License (CDDL) Version 1.0 (available at <A 
-  href="http://www.sun.com/cddl/cddl.html">http://www.sun.com/cddl/cddl.html)</A>
-  </LI>
-</UL>
-
-<p>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT.  If no About, Feature License, or Feature Update License is provided, please
-contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.</p>
-
-<h3>Cryptography</h3>
-
-<p>Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to
-   another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import,
-   possession, or use, and re-export of encryption software, to see if this is permitted.</p>
-   
-<small>Java and all Java-based trademarks are trademarks of Sun Microsystems, Inc. in the United States, other countries, or both.</small>   
-</body>
-</html>
diff --git a/jsf/features/org.eclipse.jsf.feature/sourceTemplatePlugin/plugin.properties b/jsf/features/org.eclipse.jsf.feature/sourceTemplatePlugin/plugin.properties
deleted file mode 100644
index 1c402d4..0000000
--- a/jsf/features/org.eclipse.jsf.feature/sourceTemplatePlugin/plugin.properties
+++ /dev/null
@@ -1,12 +0,0 @@
-###############################################################################
-# Copyright (c) 2005, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-pluginName=JavaServer Faces Tools - Source
-providerName=Eclipse.org
diff --git a/jsf/features/org.eclipse.jsf_sdk.feature/.project b/jsf/features/org.eclipse.jsf_sdk.feature/.project
deleted file mode 100644
index bf76782..0000000
--- a/jsf/features/org.eclipse.jsf_sdk.feature/.project
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.jsf_sdk.feature</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.pde.FeatureBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.FeatureNature</nature>
-	</natures>
-</projectDescription>
diff --git a/jsf/features/org.eclipse.jsf_sdk.feature/.settings/org.eclipse.core.resources.prefs b/jsf/features/org.eclipse.jsf_sdk.feature/.settings/org.eclipse.core.resources.prefs
deleted file mode 100644
index fa491bf..0000000
--- a/jsf/features/org.eclipse.jsf_sdk.feature/.settings/org.eclipse.core.resources.prefs
+++ /dev/null
@@ -1,3 +0,0 @@
-#Sun May 27 16:00:47 EDT 2007
-eclipse.preferences.version=1
-encoding/<project>=ISO-8859-1
diff --git a/jsf/features/org.eclipse.jsf_sdk.feature/build.properties b/jsf/features/org.eclipse.jsf_sdk.feature/build.properties
deleted file mode 100644
index a0dbc1f..0000000
--- a/jsf/features/org.eclipse.jsf_sdk.feature/build.properties
+++ /dev/null
@@ -1,18 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-bin.includes = feature.xml,\
-               license.html,\
-               feature.properties,\
-               epl-v10.html,\
-               eclipse_update_120.jpg
-               
-
-generate.feature@org.eclipse.jsf.feature.source=org.eclipse.jsf.feature
\ No newline at end of file
diff --git a/jsf/features/org.eclipse.jsf_sdk.feature/eclipse_update_120.jpg b/jsf/features/org.eclipse.jsf_sdk.feature/eclipse_update_120.jpg
deleted file mode 100644
index bfdf708..0000000
--- a/jsf/features/org.eclipse.jsf_sdk.feature/eclipse_update_120.jpg
+++ /dev/null
Binary files differ
diff --git a/jsf/features/org.eclipse.jsf_sdk.feature/epl-v10.html b/jsf/features/org.eclipse.jsf_sdk.feature/epl-v10.html
deleted file mode 100644
index ed4b196..0000000
--- a/jsf/features/org.eclipse.jsf_sdk.feature/epl-v10.html
+++ /dev/null
@@ -1,328 +0,0 @@
-<html xmlns:o="urn:schemas-microsoft-com:office:office"
-xmlns:w="urn:schemas-microsoft-com:office:word"
-xmlns="http://www.w3.org/TR/REC-html40">
-
-<head>
-<meta http-equiv=Content-Type content="text/html; charset=windows-1252">
-<meta name=ProgId content=Word.Document>
-<meta name=Generator content="Microsoft Word 9">
-<meta name=Originator content="Microsoft Word 9">
-<link rel=File-List
-href="./Eclipse%20EPL%202003_11_10%20Final_files/filelist.xml">
-<title>Eclipse Public License - Version 1.0</title>
-<!--[if gte mso 9]><xml>
- <o:DocumentProperties>
-  <o:Revision>2</o:Revision>
-  <o:TotalTime>3</o:TotalTime>
-  <o:Created>2004-03-05T23:03:00Z</o:Created>
-  <o:LastSaved>2004-03-05T23:03:00Z</o:LastSaved>
-  <o:Pages>4</o:Pages>
-  <o:Words>1626</o:Words>
-  <o:Characters>9270</o:Characters>
-   <o:Lines>77</o:Lines>
-  <o:Paragraphs>18</o:Paragraphs>
-  <o:CharactersWithSpaces>11384</o:CharactersWithSpaces>
-  <o:Version>9.4402</o:Version>
- </o:DocumentProperties>
-</xml><![endif]--><!--[if gte mso 9]><xml>
- <w:WordDocument>
-  <w:TrackRevisions/>
- </w:WordDocument>
-</xml><![endif]-->
-<style>
-<!--
- /* Font Definitions */
-@font-face
-	{font-family:Tahoma;
-	panose-1:2 11 6 4 3 5 4 4 2 4;
-	mso-font-charset:0;
-	mso-generic-font-family:swiss;
-	mso-font-pitch:variable;
-	mso-font-signature:553679495 -2147483648 8 0 66047 0;}
- /* Style Definitions */
-p.MsoNormal, li.MsoNormal, div.MsoNormal
-	{mso-style-parent:"";
-	margin:0in;
-	margin-bottom:.0001pt;
-	mso-pagination:widow-orphan;
-	font-size:12.0pt;
-	font-family:"Times New Roman";
-	mso-fareast-font-family:"Times New Roman";}
-p
-	{margin-right:0in;
-	mso-margin-top-alt:auto;
-	mso-margin-bottom-alt:auto;
-	margin-left:0in;
-	mso-pagination:widow-orphan;
-	font-size:12.0pt;
-	font-family:"Times New Roman";
-	mso-fareast-font-family:"Times New Roman";}
-p.BalloonText, li.BalloonText, div.BalloonText
-	{mso-style-name:"Balloon Text";
-	margin:0in;
-	margin-bottom:.0001pt;
-	mso-pagination:widow-orphan;
-	font-size:8.0pt;
-	font-family:Tahoma;
-	mso-fareast-font-family:"Times New Roman";}
-@page Section1
-	{size:8.5in 11.0in;
-	margin:1.0in 1.25in 1.0in 1.25in;
-	mso-header-margin:.5in;
-	mso-footer-margin:.5in;
-	mso-paper-source:0;}
-div.Section1
-	{page:Section1;}
--->
-</style>
-</head>
-
-<body lang=EN-US style='tab-interval:.5in'>
-
-<div class=Section1>
-
-<p align=center style='text-align:center'><b>Eclipse Public License - v 1.0</b>
-</p>
-
-<p><span style='font-size:10.0pt'>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER
-THE TERMS OF THIS ECLIPSE PUBLIC LICENSE (&quot;AGREEMENT&quot;). ANY USE,
-REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE
-OF THIS AGREEMENT.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>1. DEFINITIONS</span></b> </p>
-
-<p><span style='font-size:10.0pt'>&quot;Contribution&quot; means:</span> </p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-in the case of the initial Contributor, the initial code and documentation
-distributed under this Agreement, and<br clear=left>
-b) in the case of each subsequent Contributor:</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>i)
-changes to the Program, and</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>ii)
-additions to the Program;</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>where
-such changes and/or additions to the Program originate from and are distributed
-by that particular Contributor. A Contribution 'originates' from a Contributor
-if it was added to the Program by such Contributor itself or anyone acting on
-such Contributor's behalf. Contributions do not include additions to the
-Program which: (i) are separate modules of software distributed in conjunction
-with the Program under their own license agreement, and (ii) are not derivative
-works of the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>&quot;Contributor&quot; means any person or
-entity that distributes the Program.</span> </p>
-
-<p><span style='font-size:10.0pt'>&quot;Licensed Patents &quot; mean patent
-claims licensable by a Contributor which are necessarily infringed by the use
-or sale of its Contribution alone or when combined with the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>&quot;Program&quot; means the Contributions
-distributed in accordance with this Agreement.</span> </p>
-
-<p><span style='font-size:10.0pt'>&quot;Recipient&quot; means anyone who
-receives the Program under this Agreement, including all Contributors.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>2. GRANT OF RIGHTS</span></b> </p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-Subject to the terms of this Agreement, each Contributor hereby grants Recipient
-a non-exclusive, worldwide, royalty-free copyright license to<span
-style='color:red'> </span>reproduce, prepare derivative works of, publicly
-display, publicly perform, distribute and sublicense the Contribution of such
-Contributor, if any, and such derivative works, in source code and object code
-form.</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b)
-Subject to the terms of this Agreement, each Contributor hereby grants
-Recipient a non-exclusive, worldwide,<span style='color:green'> </span>royalty-free
-patent license under Licensed Patents to make, use, sell, offer to sell, import
-and otherwise transfer the Contribution of such Contributor, if any, in source
-code and object code form. This patent license shall apply to the combination
-of the Contribution and the Program if, at the time the Contribution is added
-by the Contributor, such addition of the Contribution causes such combination
-to be covered by the Licensed Patents. The patent license shall not apply to
-any other combinations which include the Contribution. No hardware per se is
-licensed hereunder. </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>c)
-Recipient understands that although each Contributor grants the licenses to its
-Contributions set forth herein, no assurances are provided by any Contributor
-that the Program does not infringe the patent or other intellectual property
-rights of any other entity. Each Contributor disclaims any liability to Recipient
-for claims brought by any other entity based on infringement of intellectual
-property rights or otherwise. As a condition to exercising the rights and
-licenses granted hereunder, each Recipient hereby assumes sole responsibility
-to secure any other intellectual property rights needed, if any. For example,
-if a third party patent license is required to allow Recipient to distribute
-the Program, it is Recipient's responsibility to acquire that license before
-distributing the Program.</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>d)
-Each Contributor represents that to its knowledge it has sufficient copyright
-rights in its Contribution, if any, to grant the copyright license set forth in
-this Agreement. </span></p>
-
-<p><b><span style='font-size:10.0pt'>3. REQUIREMENTS</span></b> </p>
-
-<p><span style='font-size:10.0pt'>A Contributor may choose to distribute the
-Program in object code form under its own license agreement, provided that:</span>
-</p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-it complies with the terms and conditions of this Agreement; and</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b)
-its license agreement:</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>i)
-effectively disclaims on behalf of all Contributors all warranties and
-conditions, express and implied, including warranties or conditions of title
-and non-infringement, and implied warranties or conditions of merchantability
-and fitness for a particular purpose; </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>ii)
-effectively excludes on behalf of all Contributors all liability for damages,
-including direct, indirect, special, incidental and consequential damages, such
-as lost profits; </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>iii)
-states that any provisions which differ from this Agreement are offered by that
-Contributor alone and not by any other party; and</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>iv)
-states that source code for the Program is available from such Contributor, and
-informs licensees how to obtain it in a reasonable manner on or through a
-medium customarily used for software exchange.<span style='color:blue'> </span></span></p>
-
-<p><span style='font-size:10.0pt'>When the Program is made available in source
-code form:</span> </p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-it must be made available under this Agreement; and </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b) a
-copy of this Agreement must be included with each copy of the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>Contributors may not remove or alter any
-copyright notices contained within the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>Each Contributor must identify itself as the
-originator of its Contribution, if any, in a manner that reasonably allows
-subsequent Recipients to identify the originator of the Contribution. </span></p>
-
-<p><b><span style='font-size:10.0pt'>4. COMMERCIAL DISTRIBUTION</span></b> </p>
-
-<p><span style='font-size:10.0pt'>Commercial distributors of software may
-accept certain responsibilities with respect to end users, business partners
-and the like. While this license is intended to facilitate the commercial use
-of the Program, the Contributor who includes the Program in a commercial
-product offering should do so in a manner which does not create potential
-liability for other Contributors. Therefore, if a Contributor includes the
-Program in a commercial product offering, such Contributor (&quot;Commercial
-Contributor&quot;) hereby agrees to defend and indemnify every other
-Contributor (&quot;Indemnified Contributor&quot;) against any losses, damages and
-costs (collectively &quot;Losses&quot;) arising from claims, lawsuits and other
-legal actions brought by a third party against the Indemnified Contributor to
-the extent caused by the acts or omissions of such Commercial Contributor in
-connection with its distribution of the Program in a commercial product
-offering. The obligations in this section do not apply to any claims or Losses
-relating to any actual or alleged intellectual property infringement. In order
-to qualify, an Indemnified Contributor must: a) promptly notify the Commercial
-Contributor in writing of such claim, and b) allow the Commercial Contributor
-to control, and cooperate with the Commercial Contributor in, the defense and
-any related settlement negotiations. The Indemnified Contributor may participate
-in any such claim at its own expense.</span> </p>
-
-<p><span style='font-size:10.0pt'>For example, a Contributor might include the
-Program in a commercial product offering, Product X. That Contributor is then a
-Commercial Contributor. If that Commercial Contributor then makes performance
-claims, or offers warranties related to Product X, those performance claims and
-warranties are such Commercial Contributor's responsibility alone. Under this
-section, the Commercial Contributor would have to defend claims against the
-other Contributors related to those performance claims and warranties, and if a
-court requires any other Contributor to pay any damages as a result, the
-Commercial Contributor must pay those damages.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>5. NO WARRANTY</span></b> </p>
-
-<p><span style='font-size:10.0pt'>EXCEPT AS EXPRESSLY SET FORTH IN THIS
-AGREEMENT, THE PROGRAM IS PROVIDED ON AN &quot;AS IS&quot; 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. Each Recipient is solely
-responsible for determining the appropriateness of using and distributing the
-Program and assumes all risks associated with its exercise of rights under this
-Agreement , including but not limited to the risks and costs of program errors,
-compliance with applicable laws, damage to or loss of data, programs or
-equipment, and unavailability or interruption of operations. </span></p>
-
-<p><b><span style='font-size:10.0pt'>6. DISCLAIMER OF LIABILITY</span></b> </p>
-
-<p><span style='font-size:10.0pt'>EXCEPT AS EXPRESSLY SET FORTH IN THIS
-AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY
-OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF
-THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF
-THE POSSIBILITY OF SUCH DAMAGES.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>7. GENERAL</span></b> </p>
-
-<p><span style='font-size:10.0pt'>If any provision of this Agreement is invalid
-or unenforceable under applicable law, it shall not affect the validity or
-enforceability of the remainder of the terms of this Agreement, and without
-further action by the parties hereto, such provision shall be reformed to the
-minimum extent necessary to make such provision valid and enforceable.</span> </p>
-
-<p><span style='font-size:10.0pt'>If Recipient institutes patent litigation
-against any entity (including a cross-claim or counterclaim in a lawsuit)
-alleging that the Program itself (excluding combinations of the Program with
-other software or hardware) infringes such Recipient's patent(s), then such
-Recipient's rights granted under Section 2(b) shall terminate as of the date
-such litigation is filed. </span></p>
-
-<p><span style='font-size:10.0pt'>All Recipient's rights under this Agreement
-shall terminate if it fails to comply with any of the material terms or
-conditions of this Agreement and does not cure such failure in a reasonable
-period of time after becoming aware of such noncompliance. If all Recipient's
-rights under this Agreement terminate, Recipient agrees to cease use and
-distribution of the Program as soon as reasonably practicable. However,
-Recipient's obligations under this Agreement and any licenses granted by
-Recipient relating to the Program shall continue and survive. </span></p>
-
-<p><span style='font-size:10.0pt'>Everyone is permitted to copy and distribute
-copies of this Agreement, but in order to avoid inconsistency the Agreement is
-copyrighted and may only be modified in the following manner. The Agreement
-Steward reserves the right to publish new versions (including revisions) of
-this Agreement from time to time. No one other than the Agreement Steward has
-the right to modify this Agreement. The Eclipse Foundation is the initial
-Agreement Steward. The Eclipse Foundation may assign the responsibility to
-serve as the Agreement Steward to a suitable separate entity. Each new version
-of the Agreement will be given a distinguishing version number. The Program
-(including Contributions) may always be distributed subject to the version of
-the Agreement under which it was received. In addition, after a new version of
-the Agreement is published, Contributor may elect to distribute the Program
-(including its Contributions) under the new version. Except as expressly stated
-in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to
-the intellectual property of any Contributor under this Agreement, whether
-expressly, by implication, estoppel or otherwise. All rights in the Program not
-expressly granted under this Agreement are reserved.</span> </p>
-
-<p><span style='font-size:10.0pt'>This Agreement is governed by the laws of the
-State of New York and the intellectual property laws of the United States of
-America. No party to this Agreement will bring a legal action under this
-Agreement more than one year after the cause of action arose. Each party waives
-its rights to a jury trial in any resulting litigation.</span> </p>
-
-<p class=MsoNormal><![if !supportEmptyParas]>&nbsp;<![endif]><o:p></o:p></p>
-
-</div>
-
-</body>
-
-</html>
\ No newline at end of file
diff --git a/jsf/features/org.eclipse.jsf_sdk.feature/feature.properties b/jsf/features/org.eclipse.jsf_sdk.feature/feature.properties
deleted file mode 100644
index 6f8f9d4..0000000
--- a/jsf/features/org.eclipse.jsf_sdk.feature/feature.properties
+++ /dev/null
@@ -1,161 +0,0 @@
-###############################################################################
-# Copyright (c) 2005, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-name=JavaServer Faces Tools (JSF) Project SDK
-provider=Eclipse Web Tools Platform
-description=WTP JavaServer Faces Tools (JSF) Project SDK
-
-# "updateSiteName" property - label for the update site
-updateSiteName=The Eclipse Web Tools Platform (WTP) Project update site
-
-# "description" property - description of the feature
-
-# "licenseURL" property - URL of the "Feature License"
-# do not translate value - just change to point to a locale-specific HTML page
-licenseURL=license.html
-
-# "copyright" property - text of the "Feature Update Copyright"
-copyright=\
-Copyright (c) 2006 Oracle Corporation.\
-All rights reserved. This program and the accompanying materials\
-are made available under the terms of the Eclipse Public License v1.0\
-which accompanies this distribution, and is available at\
-http://www.eclipse.org/legal/epl-v10.html\
-\n\
-Contributors:\n\
-    Oracle Corporation - initial API and implementation\n
-################ end of copyright property ####################################
-
-# "license" property - text of the "Feature Update License"
-# should be plain text version of license agreement pointed to be "licenseURL"
-license=\
-Eclipse Foundation Software User Agreement\n\
-April 14, 2010\n\
-\n\
-Usage Of Content\n\
-\n\
-THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR\n\
-OTHER MATERIALS FOR OPEN SOURCE PROJECTS (COLLECTIVELY "CONTENT").\n\
-USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS\n\
-AGREEMENT AND/OR THE TERMS AND CONDITIONS OF LICENSE AGREEMENTS OR\n\
-NOTICES INDICATED OR REFERENCED BELOW. BY USING THE CONTENT, YOU\n\
-AGREE THAT YOUR USE OF THE CONTENT IS GOVERNED BY THIS AGREEMENT\n\
-AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS\n\
-OR NOTICES INDICATED OR REFERENCED BELOW. IF YOU DO NOT AGREE TO THE\n\
-TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND CONDITIONS\n\
-OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED\n\
-BELOW, THEN YOU MAY NOT USE THE CONTENT.\n\
-\n\
-Applicable Licenses\n\
-\n\
-Unless otherwise indicated, all Content made available by the\n\
-Eclipse Foundation is provided to you under the terms and conditions of\n\
-the Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is\n\
-provided with this Content and is also available at http://www.eclipse.org/legal/epl-v10.html.\n\
-For purposes of the EPL, "Program" will mean the Content.\n\
-\n\
-Content includes, but is not limited to, source code, object code,\n\
-documentation and other files maintained in the Eclipse Foundation source code\n\
-repository ("Repository") in software modules ("Modules") and made available\n\
-as downloadable archives ("Downloads").\n\
-\n\
-   - Content may be structured and packaged into modules to facilitate delivering,\n\
-     extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"),\n\
-     plug-in fragments ("Fragments"), and features ("Features").\n\
-       - Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java(TM) ARchive)\n\
-     in a directory named "plugins".\n\
-   - A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.\n\
-     Each Feature may be packaged as a sub-directory in a directory named "features".\n\
-     Within a Feature, files named "feature.xml" may contain a list of the names and version\n\
-     numbers of the Plug-ins and/or Fragments associated with that Feature.\n\
-   - Features may also include other Features ("Included Features"). Within a Feature, files\n\
-     named "feature.xml" may contain a list of the names and version numbers of Included Features.\n\
-\n\
-The terms and conditions governing Plug-ins and Fragments should be\n\
-contained in files named "about.html" ("Abouts"). The terms and\n\
-conditions governing Features and Included Features should be contained\n\
-in files named "license.html" ("Feature Licenses"). Abouts and Feature\n\
-Licenses may be located in any directory of a Download or Module\n\
-including, but not limited to the following locations:\n\
-\n\
-   - The top-level (root) directory\n\
-   - Plug-in and Fragment directories\n\
-   - Inside Plug-ins and Fragments packaged as JARs\n\
-   - Sub-directories of the directory named "src" of certain Plug-ins\n\
-   - Feature directories\n\
-\n\
-Note: if a Feature made available by the Eclipse Foundation is installed using the\n\
-Provisioning Technology (as defined below), you must agree to a license ("Feature \n\
-Update License") during the installation process. If the Feature contains\n\
-Included Features, the Feature Update License should either provide you\n\
-with the terms and conditions governing the Included Features or inform\n\
-you where you can locate them. Feature Update Licenses may be found in\n\
-the "license" property of files named "feature.properties" found within a Feature.\n\
-Such Abouts, Feature Licenses, and Feature Update Licenses contain the\n\
-terms and conditions (or references to such terms and conditions) that\n\
-govern your use of the associated Content in that directory.\n\
-\n\
-THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER\n\
-TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.\n\
-SOME OF THESE OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):\n\
-\n\
-    - Common Public License Version 1.0 (available at http://www.eclipse.org/legal/cpl-v10.html)\n\
-    - Apache Software License 1.1 (available at http://www.apache.org/licenses/LICENSE)\n\
-    - Apache Software License 2.0 (available at http://www.apache.org/licenses/LICENSE-2.0)\n\
-    - Metro Link Public License 1.00 (available at http://www.opengroup.org/openmotif/supporters/metrolink/license.html)\n\
-    - Mozilla Public License Version 1.1 (available at http://www.mozilla.org/MPL/MPL-1.1.html)\n\
-\n\
-IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR\n\
-TO USE OF THE CONTENT. If no About, Feature License, or Feature Update License\n\
-is provided, please contact the Eclipse Foundation to determine what terms and conditions\n\
-govern that particular Content.\n\
-\n\
-\n\Use of Provisioning Technology\n\
-\n\
-The Eclipse Foundation makes available provisioning software, examples of which include,\n\
-but are not limited to, p2 and the Eclipse Update Manager ("Provisioning Technology") for\n\
-the purpose of allowing users to install software, documentation, information and/or\n\
-other materials (collectively "Installable Software"). This capability is provided with\n\
-the intent of allowing such users to install, extend and update Eclipse-based products.\n\
-Information about packaging Installable Software is available at\n\
-http://eclipse.org/equinox/p2/repository_packaging.html ("Specification").\n\
-\n\
-You may use Provisioning Technology to allow other parties to install Installable Software.\n\
-You shall be responsible for enabling the applicable license agreements relating to the\n\
-Installable Software to be presented to, and accepted by, the users of the Provisioning Technology\n\
-in accordance with the Specification. By using Provisioning Technology in such a manner and\n\
-making it available in accordance with the Specification, you further acknowledge your\n\
-agreement to, and the acquisition of all necessary rights to permit the following:\n\
-\n\
-       1. A series of actions may occur ("Provisioning Process") in which a user may execute\n\
-          the Provisioning Technology on a machine ("Target Machine") with the intent of installing,\n\
-          extending or updating the functionality of an Eclipse-based product.\n\
-       2. During the Provisioning Process, the Provisioning Technology may cause third party\n\
-          Installable Software or a portion thereof to be accessed and copied to the Target Machine.\n\
-       3. Pursuant to the Specification, you will provide to the user the terms and conditions that\n\
-          govern the use of the Installable Software ("Installable Software Agreement") and such\n\
-          Installable Software Agreement shall be accessed from the Target Machine in accordance\n\
-          with the Specification. Such Installable Software Agreement must inform the user of the\n\
-          terms and conditions that govern the Installable Software and must solicit acceptance by\n\
-          the end user in the manner prescribed in such Installable Software Agreement. Upon such\n\
-          indication of agreement by the user, the provisioning Technology will complete installation\n\
-          of the Installable Software.\n\
-\n\
-Cryptography\n\
-\n\
-Content may contain encryption software. The country in which you are\n\
-currently may have restrictions on the import, possession, and use,\n\
-and/or re-export to another country, of encryption software. BEFORE\n\
-using any encryption software, please check the country's laws,\n\
-regulations and policies concerning the import, possession, or use, and\n\
-re-export of encryption software, to see if this is permitted.\n\
-\n\
-Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.\n
-########### end of license property ##########################################
diff --git a/jsf/features/org.eclipse.jsf_sdk.feature/feature.xml b/jsf/features/org.eclipse.jsf_sdk.feature/feature.xml
deleted file mode 100644
index a551cb4..0000000
--- a/jsf/features/org.eclipse.jsf_sdk.feature/feature.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<feature
-      id="org.eclipse.jsf_sdk.feature"
-      label="%name"
-      version="3.2.1.qualifier"
-      provider-name="%provider"
-      image="eclipse_update_120.jpg">
-
-   <description>
-      %description
-   </description>
-
-   <copyright>
-      %copyright
-   </copyright>
-
-   <license url="license.html">
-      %license
-   </license>
-
-   <includes
-         id="org.eclipse.jsf.feature"
-         version="0.0.0"/>
-
-   <includes
-         id="org.eclipse.jsf.feature.source"
-         version="0.0.0"/>
-
-</feature>
diff --git a/jsf/features/org.eclipse.jsf_sdk.feature/license.html b/jsf/features/org.eclipse.jsf_sdk.feature/license.html
deleted file mode 100644
index 5644598..0000000
--- a/jsf/features/org.eclipse.jsf_sdk.feature/license.html
+++ /dev/null
@@ -1,98 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3c.org/TR/1999/REC-html401-19991224/loose.dtd">
-<!-- saved from url=(0044)http://www.eclipse.org/legal/epl/notice.html -->
-<HTML><HEAD><TITLE>Eclipse.org Software User Agreement</TITLE>
-<META http-equiv=Content-Type content="text/html; charset=iso-8859-1">
-<META content="MSHTML 6.00.2800.1479" name=GENERATOR></HEAD>
-<BODY lang=EN-US vLink=purple link=blue>
-<H2>Eclipse Foundation Software User Agreement</H2>
-<P>June 06, 2007</P>
-<H3>Usage Of Content</H3>
-<P>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION 
-AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS (COLLECTIVELY "CONTENT"). USE OF 
-THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE 
-TERMS AND CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED 
-BELOW. BY USING THE CONTENT, YOU AGREE THAT YOUR USE OF THE CONTENT IS GOVERNED 
-BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE 
-AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW. IF YOU DO NOT AGREE TO THE 
-TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND CONDITIONS OF ANY 
-APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU 
-MAY NOT USE THE CONTENT.</P>
-<H3>Applicable Licenses</H3>
-<P>Unless otherwise indicated, all Content made available by the Eclipse 
-Foundation is provided to you under the terms and conditions of the Eclipse 
-Public License Version 1.0 ("EPL"). A copy of the EPL is provided with this 
-Content and is also available at <A 
-href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</A>. 
-For purposes of the EPL, "Program" will mean the Content.</P>
-<P>Content includes, but is not limited to, source code, object code, 
-documentation and other files maintained in the Eclipse.org CVS repository 
-("Repository") in CVS modules ("Modules") and made available as downloadable 
-archives ("Downloads").</P>
-<P>Content may be apportioned into plug-ins ("Plug-ins"), plug-in fragments 
-("Fragments"), and features ("Features"). A Feature is a bundle of one or more 
-Plug-ins and/or Fragments and associated material. Files named "feature.xml" may 
-contain a list of the names and version numbers of the Plug-ins and/or Fragments 
-associated with a Feature. Plug-ins and Fragments are located in directories 
-named "plugins" and Features are located in directories named "features".</P>
-<P>Features may also include other Features ("Included Features"). Files named 
-"feature.xml" may contain a list of the names and version numbers of Included 
-Features.</P>
-<P>The terms and conditions governing Plug-ins and Fragments should be contained 
-in files named "about.html" ("Abouts"). The terms and conditions governing 
-Features and Included Features should be contained in files named "license.html" 
-("Feature Licenses"). Abouts and Feature Licenses may be located in any 
-directory of a Download or Module including, but not limited to the following 
-locations:</P>
-<UL>
-  <LI>The top-level (root) directory 
-  <LI>Plug-in and Fragment directories 
-  <LI>Subdirectories of the directory named "src" of certain Plug-ins 
-  <LI>Feature directories </LI></UL>
-<P>Note: if a Feature made available by the Eclipse Foundation is installed 
-using the Eclipse Update Manager, you must agree to a license ("Feature Update 
-License") during the installation process. If the Feature contains Included 
-Features, the Feature Update License should either provide you with the terms 
-and conditions governing the Included Features or inform you where you can 
-locate them. Feature Update Licenses may be found in the "license" property of 
-files named "feature.properties". Such Abouts, Feature Licenses and Feature 
-Update Licenses contain the terms and conditions (or references to such terms 
-and conditions) that govern your use of the associated Content in that 
-directory.</P>
-<P>THE ABOUTS, FEATURE LICENSES AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL 
-OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS. SOME OF THESE 
-OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):</P>
-<UL>
-  <LI>Common Public License Version 1.0 (available at <A 
-  href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</A>) 
-
-  <LI>Apache Software License 1.1 (available at <A 
-  href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</A>) 
-
-  <LI>Apache Software License 2.0 (available at <A 
-  href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</A>) 
-
-  <LI>IBM Public License 1.0 (available at <A 
-  href="http://oss.software.ibm.com/developerworks/opensource/license10.html">http://oss.software.ibm.com/developerworks/opensource/license10.html</A>) 
-
-  <LI>Metro Link Public License 1.00 (available at <A 
-  href="http://www.opengroup.org/openmotif/supporters/metrolink/license.html">http://www.opengroup.org/openmotif/supporters/metrolink/license.html</A>) 
-
-  <LI>Mozilla Public License Version 1.1 (available at <A 
-  href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</A>) 
-  </LI>
-    
-  <LI>Common Development and Distribution License (CDDL) Version 1.0 (available at <A 
-  href="http://www.sun.com/cddl/cddl.html">http://www.sun.com/cddl/cddl.html)</A>
-  </LI>
-</UL>
-<P>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR 
-TO USE OF THE CONTENT. If no About, Feature License or Feature Update License is 
-provided, please contact the Eclipse Foundation to determine what terms and 
-conditions govern that particular Content.</P>
-<H3>Cryptography</H3>
-<P>Content may contain encryption software. The country in which you are 
-currently may have restrictions on the import, possession, and use, and/or 
-re-export to another country, of encryption software. BEFORE using any 
-encryption software, please check the country's laws, regulations and policies 
-concerning the import, possession, or use, and re-export of encryption software, 
-to see if this is permitted.</P></BODY></HTML>
diff --git a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/.cvsignore b/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/.cvsignore
deleted file mode 100644
index c14487c..0000000
--- a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-build.xml
diff --git a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/.project b/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/.project
deleted file mode 100644
index a1d8502..0000000
--- a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/.project
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.pde.FeatureBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.FeatureNature</nature>
-	</natures>
-</projectDescription>
diff --git a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/build.properties b/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/build.properties
deleted file mode 100644
index 4576d22..0000000
--- a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/build.properties
+++ /dev/null
@@ -1,15 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2008 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-bin.includes = feature.xml,\
-               license.html,\
-               feature.properties,\
-               epl-v10.html,\
-               eclipse_update_120.jpg
diff --git a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/eclipse_update_120.jpg b/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/eclipse_update_120.jpg
deleted file mode 100644
index bfdf708..0000000
--- a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/eclipse_update_120.jpg
+++ /dev/null
Binary files differ
diff --git a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/epl-v10.html b/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/epl-v10.html
deleted file mode 100644
index ed4b196..0000000
--- a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/epl-v10.html
+++ /dev/null
@@ -1,328 +0,0 @@
-<html xmlns:o="urn:schemas-microsoft-com:office:office"
-xmlns:w="urn:schemas-microsoft-com:office:word"
-xmlns="http://www.w3.org/TR/REC-html40">
-
-<head>
-<meta http-equiv=Content-Type content="text/html; charset=windows-1252">
-<meta name=ProgId content=Word.Document>
-<meta name=Generator content="Microsoft Word 9">
-<meta name=Originator content="Microsoft Word 9">
-<link rel=File-List
-href="./Eclipse%20EPL%202003_11_10%20Final_files/filelist.xml">
-<title>Eclipse Public License - Version 1.0</title>
-<!--[if gte mso 9]><xml>
- <o:DocumentProperties>
-  <o:Revision>2</o:Revision>
-  <o:TotalTime>3</o:TotalTime>
-  <o:Created>2004-03-05T23:03:00Z</o:Created>
-  <o:LastSaved>2004-03-05T23:03:00Z</o:LastSaved>
-  <o:Pages>4</o:Pages>
-  <o:Words>1626</o:Words>
-  <o:Characters>9270</o:Characters>
-   <o:Lines>77</o:Lines>
-  <o:Paragraphs>18</o:Paragraphs>
-  <o:CharactersWithSpaces>11384</o:CharactersWithSpaces>
-  <o:Version>9.4402</o:Version>
- </o:DocumentProperties>
-</xml><![endif]--><!--[if gte mso 9]><xml>
- <w:WordDocument>
-  <w:TrackRevisions/>
- </w:WordDocument>
-</xml><![endif]-->
-<style>
-<!--
- /* Font Definitions */
-@font-face
-	{font-family:Tahoma;
-	panose-1:2 11 6 4 3 5 4 4 2 4;
-	mso-font-charset:0;
-	mso-generic-font-family:swiss;
-	mso-font-pitch:variable;
-	mso-font-signature:553679495 -2147483648 8 0 66047 0;}
- /* Style Definitions */
-p.MsoNormal, li.MsoNormal, div.MsoNormal
-	{mso-style-parent:"";
-	margin:0in;
-	margin-bottom:.0001pt;
-	mso-pagination:widow-orphan;
-	font-size:12.0pt;
-	font-family:"Times New Roman";
-	mso-fareast-font-family:"Times New Roman";}
-p
-	{margin-right:0in;
-	mso-margin-top-alt:auto;
-	mso-margin-bottom-alt:auto;
-	margin-left:0in;
-	mso-pagination:widow-orphan;
-	font-size:12.0pt;
-	font-family:"Times New Roman";
-	mso-fareast-font-family:"Times New Roman";}
-p.BalloonText, li.BalloonText, div.BalloonText
-	{mso-style-name:"Balloon Text";
-	margin:0in;
-	margin-bottom:.0001pt;
-	mso-pagination:widow-orphan;
-	font-size:8.0pt;
-	font-family:Tahoma;
-	mso-fareast-font-family:"Times New Roman";}
-@page Section1
-	{size:8.5in 11.0in;
-	margin:1.0in 1.25in 1.0in 1.25in;
-	mso-header-margin:.5in;
-	mso-footer-margin:.5in;
-	mso-paper-source:0;}
-div.Section1
-	{page:Section1;}
--->
-</style>
-</head>
-
-<body lang=EN-US style='tab-interval:.5in'>
-
-<div class=Section1>
-
-<p align=center style='text-align:center'><b>Eclipse Public License - v 1.0</b>
-</p>
-
-<p><span style='font-size:10.0pt'>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER
-THE TERMS OF THIS ECLIPSE PUBLIC LICENSE (&quot;AGREEMENT&quot;). ANY USE,
-REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE
-OF THIS AGREEMENT.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>1. DEFINITIONS</span></b> </p>
-
-<p><span style='font-size:10.0pt'>&quot;Contribution&quot; means:</span> </p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-in the case of the initial Contributor, the initial code and documentation
-distributed under this Agreement, and<br clear=left>
-b) in the case of each subsequent Contributor:</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>i)
-changes to the Program, and</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>ii)
-additions to the Program;</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>where
-such changes and/or additions to the Program originate from and are distributed
-by that particular Contributor. A Contribution 'originates' from a Contributor
-if it was added to the Program by such Contributor itself or anyone acting on
-such Contributor's behalf. Contributions do not include additions to the
-Program which: (i) are separate modules of software distributed in conjunction
-with the Program under their own license agreement, and (ii) are not derivative
-works of the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>&quot;Contributor&quot; means any person or
-entity that distributes the Program.</span> </p>
-
-<p><span style='font-size:10.0pt'>&quot;Licensed Patents &quot; mean patent
-claims licensable by a Contributor which are necessarily infringed by the use
-or sale of its Contribution alone or when combined with the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>&quot;Program&quot; means the Contributions
-distributed in accordance with this Agreement.</span> </p>
-
-<p><span style='font-size:10.0pt'>&quot;Recipient&quot; means anyone who
-receives the Program under this Agreement, including all Contributors.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>2. GRANT OF RIGHTS</span></b> </p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-Subject to the terms of this Agreement, each Contributor hereby grants Recipient
-a non-exclusive, worldwide, royalty-free copyright license to<span
-style='color:red'> </span>reproduce, prepare derivative works of, publicly
-display, publicly perform, distribute and sublicense the Contribution of such
-Contributor, if any, and such derivative works, in source code and object code
-form.</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b)
-Subject to the terms of this Agreement, each Contributor hereby grants
-Recipient a non-exclusive, worldwide,<span style='color:green'> </span>royalty-free
-patent license under Licensed Patents to make, use, sell, offer to sell, import
-and otherwise transfer the Contribution of such Contributor, if any, in source
-code and object code form. This patent license shall apply to the combination
-of the Contribution and the Program if, at the time the Contribution is added
-by the Contributor, such addition of the Contribution causes such combination
-to be covered by the Licensed Patents. The patent license shall not apply to
-any other combinations which include the Contribution. No hardware per se is
-licensed hereunder. </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>c)
-Recipient understands that although each Contributor grants the licenses to its
-Contributions set forth herein, no assurances are provided by any Contributor
-that the Program does not infringe the patent or other intellectual property
-rights of any other entity. Each Contributor disclaims any liability to Recipient
-for claims brought by any other entity based on infringement of intellectual
-property rights or otherwise. As a condition to exercising the rights and
-licenses granted hereunder, each Recipient hereby assumes sole responsibility
-to secure any other intellectual property rights needed, if any. For example,
-if a third party patent license is required to allow Recipient to distribute
-the Program, it is Recipient's responsibility to acquire that license before
-distributing the Program.</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>d)
-Each Contributor represents that to its knowledge it has sufficient copyright
-rights in its Contribution, if any, to grant the copyright license set forth in
-this Agreement. </span></p>
-
-<p><b><span style='font-size:10.0pt'>3. REQUIREMENTS</span></b> </p>
-
-<p><span style='font-size:10.0pt'>A Contributor may choose to distribute the
-Program in object code form under its own license agreement, provided that:</span>
-</p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-it complies with the terms and conditions of this Agreement; and</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b)
-its license agreement:</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>i)
-effectively disclaims on behalf of all Contributors all warranties and
-conditions, express and implied, including warranties or conditions of title
-and non-infringement, and implied warranties or conditions of merchantability
-and fitness for a particular purpose; </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>ii)
-effectively excludes on behalf of all Contributors all liability for damages,
-including direct, indirect, special, incidental and consequential damages, such
-as lost profits; </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>iii)
-states that any provisions which differ from this Agreement are offered by that
-Contributor alone and not by any other party; and</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>iv)
-states that source code for the Program is available from such Contributor, and
-informs licensees how to obtain it in a reasonable manner on or through a
-medium customarily used for software exchange.<span style='color:blue'> </span></span></p>
-
-<p><span style='font-size:10.0pt'>When the Program is made available in source
-code form:</span> </p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-it must be made available under this Agreement; and </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b) a
-copy of this Agreement must be included with each copy of the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>Contributors may not remove or alter any
-copyright notices contained within the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>Each Contributor must identify itself as the
-originator of its Contribution, if any, in a manner that reasonably allows
-subsequent Recipients to identify the originator of the Contribution. </span></p>
-
-<p><b><span style='font-size:10.0pt'>4. COMMERCIAL DISTRIBUTION</span></b> </p>
-
-<p><span style='font-size:10.0pt'>Commercial distributors of software may
-accept certain responsibilities with respect to end users, business partners
-and the like. While this license is intended to facilitate the commercial use
-of the Program, the Contributor who includes the Program in a commercial
-product offering should do so in a manner which does not create potential
-liability for other Contributors. Therefore, if a Contributor includes the
-Program in a commercial product offering, such Contributor (&quot;Commercial
-Contributor&quot;) hereby agrees to defend and indemnify every other
-Contributor (&quot;Indemnified Contributor&quot;) against any losses, damages and
-costs (collectively &quot;Losses&quot;) arising from claims, lawsuits and other
-legal actions brought by a third party against the Indemnified Contributor to
-the extent caused by the acts or omissions of such Commercial Contributor in
-connection with its distribution of the Program in a commercial product
-offering. The obligations in this section do not apply to any claims or Losses
-relating to any actual or alleged intellectual property infringement. In order
-to qualify, an Indemnified Contributor must: a) promptly notify the Commercial
-Contributor in writing of such claim, and b) allow the Commercial Contributor
-to control, and cooperate with the Commercial Contributor in, the defense and
-any related settlement negotiations. The Indemnified Contributor may participate
-in any such claim at its own expense.</span> </p>
-
-<p><span style='font-size:10.0pt'>For example, a Contributor might include the
-Program in a commercial product offering, Product X. That Contributor is then a
-Commercial Contributor. If that Commercial Contributor then makes performance
-claims, or offers warranties related to Product X, those performance claims and
-warranties are such Commercial Contributor's responsibility alone. Under this
-section, the Commercial Contributor would have to defend claims against the
-other Contributors related to those performance claims and warranties, and if a
-court requires any other Contributor to pay any damages as a result, the
-Commercial Contributor must pay those damages.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>5. NO WARRANTY</span></b> </p>
-
-<p><span style='font-size:10.0pt'>EXCEPT AS EXPRESSLY SET FORTH IN THIS
-AGREEMENT, THE PROGRAM IS PROVIDED ON AN &quot;AS IS&quot; 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. Each Recipient is solely
-responsible for determining the appropriateness of using and distributing the
-Program and assumes all risks associated with its exercise of rights under this
-Agreement , including but not limited to the risks and costs of program errors,
-compliance with applicable laws, damage to or loss of data, programs or
-equipment, and unavailability or interruption of operations. </span></p>
-
-<p><b><span style='font-size:10.0pt'>6. DISCLAIMER OF LIABILITY</span></b> </p>
-
-<p><span style='font-size:10.0pt'>EXCEPT AS EXPRESSLY SET FORTH IN THIS
-AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY
-OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF
-THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF
-THE POSSIBILITY OF SUCH DAMAGES.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>7. GENERAL</span></b> </p>
-
-<p><span style='font-size:10.0pt'>If any provision of this Agreement is invalid
-or unenforceable under applicable law, it shall not affect the validity or
-enforceability of the remainder of the terms of this Agreement, and without
-further action by the parties hereto, such provision shall be reformed to the
-minimum extent necessary to make such provision valid and enforceable.</span> </p>
-
-<p><span style='font-size:10.0pt'>If Recipient institutes patent litigation
-against any entity (including a cross-claim or counterclaim in a lawsuit)
-alleging that the Program itself (excluding combinations of the Program with
-other software or hardware) infringes such Recipient's patent(s), then such
-Recipient's rights granted under Section 2(b) shall terminate as of the date
-such litigation is filed. </span></p>
-
-<p><span style='font-size:10.0pt'>All Recipient's rights under this Agreement
-shall terminate if it fails to comply with any of the material terms or
-conditions of this Agreement and does not cure such failure in a reasonable
-period of time after becoming aware of such noncompliance. If all Recipient's
-rights under this Agreement terminate, Recipient agrees to cease use and
-distribution of the Program as soon as reasonably practicable. However,
-Recipient's obligations under this Agreement and any licenses granted by
-Recipient relating to the Program shall continue and survive. </span></p>
-
-<p><span style='font-size:10.0pt'>Everyone is permitted to copy and distribute
-copies of this Agreement, but in order to avoid inconsistency the Agreement is
-copyrighted and may only be modified in the following manner. The Agreement
-Steward reserves the right to publish new versions (including revisions) of
-this Agreement from time to time. No one other than the Agreement Steward has
-the right to modify this Agreement. The Eclipse Foundation is the initial
-Agreement Steward. The Eclipse Foundation may assign the responsibility to
-serve as the Agreement Steward to a suitable separate entity. Each new version
-of the Agreement will be given a distinguishing version number. The Program
-(including Contributions) may always be distributed subject to the version of
-the Agreement under which it was received. In addition, after a new version of
-the Agreement is published, Contributor may elect to distribute the Program
-(including its Contributions) under the new version. Except as expressly stated
-in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to
-the intellectual property of any Contributor under this Agreement, whether
-expressly, by implication, estoppel or otherwise. All rights in the Program not
-expressly granted under this Agreement are reserved.</span> </p>
-
-<p><span style='font-size:10.0pt'>This Agreement is governed by the laws of the
-State of New York and the intellectual property laws of the United States of
-America. No party to this Agreement will bring a legal action under this
-Agreement more than one year after the cause of action arose. Each party waives
-its rights to a jury trial in any resulting litigation.</span> </p>
-
-<p class=MsoNormal><![if !supportEmptyParas]>&nbsp;<![endif]><o:p></o:p></p>
-
-</div>
-
-</body>
-
-</html>
\ No newline at end of file
diff --git a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/feature.properties b/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/feature.properties
deleted file mode 100644
index a9fe0c3..0000000
--- a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/feature.properties
+++ /dev/null
@@ -1,168 +0,0 @@
-###############################################################################
-# Copyright (c) 2005, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#    Oracle Corporation - initial API and implementation
-###############################################################################
-# feature.properties
-# contains externalized strings for feature.xml
-# "%foo" in feature.xml corresponds to the key "foo" in this file
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# This file should be translated.
-
-# "featureName" property - name of the feature
-featureName=Apache MyFaces Trinidad Tag Support (Optional)
-
-# "providerName" property - name of the company that provides the feature
-providerName=Eclipse.org
-
-
-# "description" property - description of the feature
-description=Apache MyFaces Trinidad Tag Support (Optional)
-
-# "copyright" property - text of the "Feature Update Copyright"
-copyright=\
-Copyright (c) 2007 Oracle Corporation.\
-All rights reserved. This program and the accompanying materials\
-are made available under the terms of the Eclipse Public License v1.0\
-which accompanies this distribution, and is available at\
-http://www.eclipse.org/legal/epl-v10.html\
-\n\
-Contributors:\n\
-    Oracle Corporation - initial API and implementation\n
-################ end of copyright property ####################################
-
-# "licenseURL" property - URL of the "Feature License"
-# do not translate value - just change to point to a locale-specific HTML page
-licenseURL=license.html
-
-# "license" property - text of the "Feature Update License"
-# should be plain text version of license agreement pointed to be "licenseURL"
-license=\
-Eclipse Foundation Software User Agreement\n\
-April 14, 2010\n\
-\n\
-Usage Of Content\n\
-\n\
-THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR\n\
-OTHER MATERIALS FOR OPEN SOURCE PROJECTS (COLLECTIVELY "CONTENT").\n\
-USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS\n\
-AGREEMENT AND/OR THE TERMS AND CONDITIONS OF LICENSE AGREEMENTS OR\n\
-NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU\n\
-AGREE THAT YOUR USE OF THE CONTENT IS GOVERNED BY THIS AGREEMENT\n\
-AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS\n\
-OR NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE\n\
-TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND CONDITIONS\n\
-OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED\n\
-BELOW, THEN YOU MAY NOT USE THE CONTENT.\n\
-\n\
-Applicable Licenses\n\
-\n\
-Unless otherwise indicated, all Content made available by the\n\
-Eclipse Foundation is provided to you under the terms and conditions of\n\
-the Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is\n\
-provided with this Content and is also available at http://www.eclipse.org/legal/epl-v10.html.\n\
-For purposes of the EPL, "Program" will mean the Content.\n\
-\n\
-Content includes, but is not limited to, source code, object code,\n\
-documentation and other files maintained in the Eclipse Foundation source code\n\
-repository ("Repository") in software modules ("Modules") and made available\n\
-as downloadable archives ("Downloads").\n\
-\n\
-       - Content may be structured and packaged into modules to facilitate delivering,\n\
-         extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"),\n\
-         plug-in fragments ("Fragments"), and features ("Features").\n\
-       - Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java(TM) ARchive)\n\
-         in a directory named "plugins".\n\
-       - A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.\n\
-         Each Feature may be packaged as a sub-directory in a directory named "features".\n\
-         Within a Feature, files named "feature.xml" may contain a list of the names and version\n\
-         numbers of the Plug-ins and/or Fragments associated with that Feature.\n\
-       - Features may also include other Features ("Included Features"). Within a Feature, files\n\
-         named "feature.xml" may contain a list of the names and version numbers of Included Features.\n\
-\n\
-The terms and conditions governing Plug-ins and Fragments should be\n\
-contained in files named "about.html" ("Abouts"). The terms and\n\
-conditions governing Features and Included Features should be contained\n\
-in files named "license.html" ("Feature Licenses"). Abouts and Feature\n\
-Licenses may be located in any directory of a Download or Module\n\
-including, but not limited to the following locations:\n\
-\n\
-       - The top-level (root) directory\n\
-       - Plug-in and Fragment directories\n\
-       - Inside Plug-ins and Fragments packaged as JARs\n\
-       - Sub-directories of the directory named "src" of certain Plug-ins\n\
-       - Feature directories\n\
-\n\
-Note: if a Feature made available by the Eclipse Foundation is installed using the\n\
-Provisioning Technology (as defined below), you must agree to a license ("Feature \n\
-Update License") during the installation process. If the Feature contains\n\
-Included Features, the Feature Update License should either provide you\n\
-with the terms and conditions governing the Included Features or inform\n\
-you where you can locate them. Feature Update Licenses may be found in\n\
-the "license" property of files named "feature.properties" found within a Feature.\n\
-Such Abouts, Feature Licenses, and Feature Update Licenses contain the\n\
-terms and conditions (or references to such terms and conditions) that\n\
-govern your use of the associated Content in that directory.\n\
-\n\
-THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER\n\
-TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.\n\
-SOME OF THESE OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):\n\
-\n\
-       - Common Public License Version 1.0 (available at http://www.eclipse.org/legal/cpl-v10.html)\n\
-       - Apache Software License 1.1 (available at http://www.apache.org/licenses/LICENSE)\n\
-       - Apache Software License 2.0 (available at http://www.apache.org/licenses/LICENSE-2.0)\n\
-       - Metro Link Public License 1.00 (available at http://www.opengroup.org/openmotif/supporters/metrolink/license.html)\n\
-       - Mozilla Public License Version 1.1 (available at http://www.mozilla.org/MPL/MPL-1.1.html)\n\
-\n\
-IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR\n\
-TO USE OF THE CONTENT. If no About, Feature License, or Feature Update License\n\
-is provided, please contact the Eclipse Foundation to determine what terms and conditions\n\
-govern that particular Content.\n\
-\n\
-\n\Use of Provisioning Technology\n\
-\n\
-The Eclipse Foundation makes available provisioning software, examples of which include,\n\
-but are not limited to, p2 and the Eclipse Update Manager ("Provisioning Technology") for\n\
-the purpose of allowing users to install software, documentation, information and/or\n\
-other materials (collectively "Installable Software"). This capability is provided with\n\
-the intent of allowing such users to install, extend and update Eclipse-based products.\n\
-Information about packaging Installable Software is available at\n\
-http://eclipse.org/equinox/p2/repository_packaging.html ("Specification").\n\
-\n\
-You may use Provisioning Technology to allow other parties to install Installable Software.\n\
-You shall be responsible for enabling the applicable license agreements relating to the\n\
-Installable Software to be presented to, and accepted by, the users of the Provisioning Technology\n\
-in accordance with the Specification. By using Provisioning Technology in such a manner and\n\
-making it available in accordance with the Specification, you further acknowledge your\n\
-agreement to, and the acquisition of all necessary rights to permit the following:\n\
-\n\
-       1. A series of actions may occur ("Provisioning Process") in which a user may execute\n\
-          the Provisioning Technology on a machine ("Target Machine") with the intent of installing,\n\
-          extending or updating the functionality of an Eclipse-based product.\n\
-       2. During the Provisioning Process, the Provisioning Technology may cause third party\n\
-          Installable Software or a portion thereof to be accessed and copied to the Target Machine.\n\
-       3. Pursuant to the Specification, you will provide to the user the terms and conditions that\n\
-          govern the use of the Installable Software ("Installable Software Agreement") and such\n\
-          Installable Software Agreement shall be accessed from the Target Machine in accordance\n\
-          with the Specification. Such Installable Software Agreement must inform the user of the\n\
-          terms and conditions that govern the Installable Software and must solicit acceptance by\n\
-          the end user in the manner prescribed in such Installable Software Agreement. Upon such\n\
-          indication of agreement by the user, the provisioning Technology will complete installation\n\
-          of the Installable Software.\n\
-\n\
-Cryptography\n\
-\n\
-Content may contain encryption software. The country in which you are\n\
-currently may have restrictions on the import, possession, and use,\n\
-and/or re-export to another country, of encryption software. BEFORE\n\
-using any encryption software, please check the country's laws,\n\
-regulations and policies concerning the import, possession, or use, and\n\
-re-export of encryption software, to see if this is permitted.\n\
-\n\
-Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.\n
-########### end of license property ##########################################
diff --git a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/feature.xml b/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/feature.xml
deleted file mode 100644
index e56e5ad..0000000
--- a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/feature.xml
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<feature
-      id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature"
-      label="%featureName"
-      version="2.2.100.qualifier"
-      provider-name="%providerName">
-
-   <description>
-      %description
-   </description>
-
-   <copyright>
-      %copyright
-   </copyright>
-
-   <license url="license.html">
-      %license
-   </license>
-
-
-   <requires>
-      <import plugin="org.eclipse.ui" version="3.2.0" match="compatible"/>
-      <import plugin="org.eclipse.core.runtime" version="3.2.0" match="compatible"/>
-      <import plugin="org.eclipse.emf.ecore.xmi" version="2.2.0" match="compatible"/>
-      <import plugin="org.eclipse.gef" version="3.2.0" match="compatible"/>
-      <import plugin="org.eclipse.wst.sse.core" version="1.1.0" match="equivalent"/>
-      <import plugin="org.eclipse.jst.jsf.common" version="1.1.0" match="compatible"/>
-      <import plugin="org.eclipse.jst.pagedesigner" version="1.1.0" match="compatible"/>
-      <import plugin="org.eclipse.jst.jsf.core" version="1.1.0" match="compatible"/>
-      <import plugin="org.eclipse.jdt.core" version="3.4.0" match="compatible"/>
-      <import plugin="org.eclipse.core.resources" version="3.4.0" match="compatible"/>
-   </requires>
-
-   <plugin
-         id="org.eclipse.jst.jsf.apache.trinidad.tagsupport"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-</feature>
diff --git a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/license.html b/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/license.html
deleted file mode 100644
index c184ca3..0000000
--- a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/license.html
+++ /dev/null
@@ -1,107 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1" ?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
-<title>Eclipse Foundation Software User Agreement</title>
-</head>
-
-<body lang="EN-US">
-<h2>Eclipse Foundation Software User Agreement</h2>
-<p>April 14, 2010</p>
-
-<h3>Usage Of Content</h3>
-
-<p>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS
-   (COLLECTIVELY &quot;CONTENT&quot;).  USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND
-   CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU AGREE THAT YOUR USE
-   OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR
-   NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND
-   CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.</p>
-
-<h3>Applicable Licenses</h3>
-
-<p>Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0
-   (&quot;EPL&quot;).  A copy of the EPL is provided with this Content and is also available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-   For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse Foundation source code
-   repository (&quot;Repository&quot;) in software modules (&quot;Modules&quot;) and made available as downloadable archives (&quot;Downloads&quot;).</p>
-
-<ul>
-       <li>Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content.  Typical modules may include plug-ins (&quot;Plug-ins&quot;), plug-in fragments (&quot;Fragments&quot;), and features (&quot;Features&quot;).</li>
-       <li>Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java&trade; ARchive) in a directory named &quot;plugins&quot;.</li>
-       <li>A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.  Each Feature may be packaged as a sub-directory in a directory named &quot;features&quot;.  Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of the Plug-ins
-      and/or Fragments associated with that Feature.</li>
-       <li>Features may also include other Features (&quot;Included Features&quot;). Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of Included Features.</li>
-</ul>
-
-<p>The terms and conditions governing Plug-ins and Fragments should be contained in files named &quot;about.html&quot; (&quot;Abouts&quot;). The terms and conditions governing Features and
-Included Features should be contained in files named &quot;license.html&quot; (&quot;Feature Licenses&quot;).  Abouts and Feature Licenses may be located in any directory of a Download or Module
-including, but not limited to the following locations:</p>
-
-<ul>
-       <li>The top-level (root) directory</li>
-       <li>Plug-in and Fragment directories</li>
-       <li>Inside Plug-ins and Fragments packaged as JARs</li>
-       <li>Sub-directories of the directory named &quot;src&quot; of certain Plug-ins</li>
-       <li>Feature directories</li>
-</ul>
-
-<p>Note: if a Feature made available by the Eclipse Foundation is installed using the Provisioning Technology (as defined below), you must agree to a license (&quot;Feature Update License&quot;) during the
-installation process.  If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or
-inform you where you can locate them.  Feature Update Licenses may be found in the &quot;license&quot; property of files named &quot;feature.properties&quot; found within a Feature.
-Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in
-that directory.</p>
-
-<p>THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.  SOME OF THESE
-OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):</p>
-
-<ul>
-       <li>Common Public License Version 1.0 (available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>)</li>
-       <li>Apache Software License 1.1 (available at <a href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</a>)</li>
-       <li>Apache Software License 2.0 (available at <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>)</li>
-       <li>Metro Link Public License 1.00 (available at <a href="http://www.opengroup.org/openmotif/supporters/metrolink/license.html">http://www.opengroup.org/openmotif/supporters/metrolink/license.html</a>)</li>
-       <li>Mozilla Public License Version 1.1 (available at <a href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</a>)</li>
-</ul>
-
-<p>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT.  If no About, Feature License, or Feature Update License is provided, please
-contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.</p>
-
-
-<h3>Use of Provisioning Technology</h3>
-
-<p>The Eclipse Foundation makes available provisioning software, examples of which include, but are not limited to, p2 and the Eclipse
-   Update Manager (&quot;Provisioning Technology&quot;) for the purpose of allowing users to install software, documentation, information and/or
-   other materials (collectively &quot;Installable Software&quot;). This capability is provided with the intent of allowing such users to
-   install, extend and update Eclipse-based products. Information about packaging Installable Software is available at <a
-       href="http://eclipse.org/equinox/p2/repository_packaging.html">http://eclipse.org/equinox/p2/repository_packaging.html</a>
-   (&quot;Specification&quot;).</p>
-
-<p>You may use Provisioning Technology to allow other parties to install Installable Software. You shall be responsible for enabling the
-   applicable license agreements relating to the Installable Software to be presented to, and accepted by, the users of the Provisioning Technology
-   in accordance with the Specification. By using Provisioning Technology in such a manner and making it available in accordance with the
-   Specification, you further acknowledge your agreement to, and the acquisition of all necessary rights to permit the following:</p>
-
-<ol>
-       <li>A series of actions may occur (&quot;Provisioning Process&quot;) in which a user may execute the Provisioning Technology
-       on a machine (&quot;Target Machine&quot;) with the intent of installing, extending or updating the functionality of an Eclipse-based
-       product.</li>
-       <li>During the Provisioning Process, the Provisioning Technology may cause third party Installable Software or a portion thereof to be
-       accessed and copied to the Target Machine.</li>
-       <li>Pursuant to the Specification, you will provide to the user the terms and conditions that govern the use of the Installable
-       Software (&quot;Installable Software Agreement&quot;) and such Installable Software Agreement shall be accessed from the Target
-       Machine in accordance with the Specification. Such Installable Software Agreement must inform the user of the terms and conditions that govern
-       the Installable Software and must solicit acceptance by the end user in the manner prescribed in such Installable Software Agreement. Upon such
-       indication of agreement by the user, the provisioning Technology will complete installation of the Installable Software.</li>
-</ol>
-
-<h3>Cryptography</h3>
-
-<p>Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to
-   another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import,
-   possession, or use, and re-export of encryption software, to see if this is permitted.</p>
-
-<p><small>Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.</small></p>
-</body>
-</html>
diff --git a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplateBundle/about.html b/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplateBundle/about.html
deleted file mode 100644
index fe81d46..0000000
--- a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplateBundle/about.html
+++ /dev/null
@@ -1,27 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<head>
-<title>About</title>
-<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
-
-<P>June, 2008</P>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise indicated below, the Content is provided to you under the terms and conditions of the
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content.</p>
-
-<h3>Source Code</h3>
-<p>This plug-in contains source code zip files (&quot;Source Zips&quot;) that correspond to binary content in other plug-ins. These Source Zips may be distributed under different license
-agreements and/or notices. Details about these license agreements and notices are contained in &quot;about.html&quot; files (&quot;Abouts&quot;) located in sub-directories in the
-src/ directory of this plug-in. Such Abouts govern your use of the Source Zips in that directory, not the EPL.</p>
-
-</body>
-</html>
diff --git a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplateBundle/about.ini b/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplateBundle/about.ini
deleted file mode 100644
index 2dee36a..0000000
--- a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplateBundle/about.ini
+++ /dev/null
@@ -1,31 +0,0 @@
-# about.ini
-# contains information about a feature
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# "%key" are externalized strings defined in about.properties
-# This file does not need to be translated.
-
-# Property "aboutText" contains blurb for "About" dialog (translated)
-aboutText=%blurb
-
-# Property "windowImage" contains path to window icon (16x16)
-# needed for primary features only
-
-# Property "featureImage" contains path to feature image (32x32)
-featureImage=eclipse32.gif
-
-# Property "aboutImage" contains path to product image (500x330 or 115x164)
-# needed for primary features only
-
-# Property "appName" contains name of the application (not translated)
-# needed for primary features only
-
-# Property "welcomePage" contains path to welcome page (special XML-based format)
-# optional
-
-# Property "welcomePerspective" contains the id of the perspective in which the
-# welcome page is to be opened.
-# optional
-
-
-
-
diff --git a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplateBundle/about.mappings b/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplateBundle/about.mappings
deleted file mode 100644
index a28390a..0000000
--- a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplateBundle/about.mappings
+++ /dev/null
@@ -1,6 +0,0 @@
-# about.mappings
-# contains fill-ins for about.properties
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# This file does not need to be translated.
-
-0=@build@
diff --git a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplateBundle/about.properties b/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplateBundle/about.properties
deleted file mode 100644
index c315cf8..0000000
--- a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplateBundle/about.properties
+++ /dev/null
@@ -1,27 +0,0 @@
-###############################################################################
-# Copyright (c) 2005, 2008 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#    Oracle Corporation - initial API and implementation
-###############################################################################
-# This file should be translated.
-# about.properties
-# contains externalized strings for about.ini
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# fill-ins are supplied by about.mappings
-# This file should be translated.
-#
-# Do not translate any values surrounded by {}
-
-blurb=WTP Web Page Editor Apache MyFaces Trinidad Tag Support Source\n\
-\n\
-Version: {featureVersion}\n\
-Build id: {0}\n\
-\n\
-(c) Copyright Eclipse contributors and others 2007.  All rights reserved.\n\
-Visit http://www.eclipse.org/webtools
-
diff --git a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplateBundle/build.properties b/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplateBundle/build.properties
deleted file mode 100644
index 85ef5b7..0000000
--- a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplateBundle/build.properties
+++ /dev/null
@@ -1,13 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2008 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-
-bin.includes = about.html, about.ini, about.mappings, about.properties, eclipse32.gif, plugin.properties, plugin.xml, src/**, META-INF/
-sourcePlugin = true
diff --git a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplateBundle/eclipse32.gif b/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplateBundle/eclipse32.gif
deleted file mode 100644
index e6ad7cc..0000000
--- a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplateBundle/eclipse32.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplateBundle/eclipse32.png b/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplateBundle/eclipse32.png
deleted file mode 100644
index 50ae49d..0000000
--- a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplateBundle/eclipse32.png
+++ /dev/null
Binary files differ
diff --git a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplateBundle/plugin.properties b/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplateBundle/plugin.properties
deleted file mode 100644
index 09fcddc..0000000
--- a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplateBundle/plugin.properties
+++ /dev/null
@@ -1,20 +0,0 @@
-###############################################################################
-# Copyright (c) 2005, 2008 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#    Oracle Corporation - initial API and implementation
-###############################################################################
-# This file should be translated.
-# plugin.properties
-# contains externalized strings for manifest.mf
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# fill-ins are supplied by about.mappings
-# This file should be translated.
-#
-# Do not translate any values surrounded by {}
-pluginName=WTP Web Page Editor Apache MyFaces Trinidad Tag Support Source
-providerName=Eclipse.org
diff --git a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplateFeature/build.properties b/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplateFeature/build.properties
deleted file mode 100644
index a52b18c..0000000
--- a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplateFeature/build.properties
+++ /dev/null
@@ -1,19 +0,0 @@
-###############################################################################
-# Copyright (c) 2005, 2008 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#    Oracle Corporation - initial API and implementation
-###############################################################################
-# This file should be NOT be translated.
-bin.includes =\
-epl-v10.html,\
-eclipse_update_120.jpg,\
-feature.xml,\
-feature.properties,\
-license.html
-
-
diff --git a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplateFeature/eclipse_update_120.jpg b/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplateFeature/eclipse_update_120.jpg
deleted file mode 100644
index bfdf708..0000000
--- a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplateFeature/eclipse_update_120.jpg
+++ /dev/null
Binary files differ
diff --git a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplateFeature/epl-v10.html b/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplateFeature/epl-v10.html
deleted file mode 100644
index 022ad29..0000000
--- a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplateFeature/epl-v10.html
+++ /dev/null
@@ -1,328 +0,0 @@
-<html xmlns:o="urn:schemas-microsoft-com:office:office"
-xmlns:w="urn:schemas-microsoft-com:office:word"
-xmlns="http://www.w3.org/TR/REC-html40">
-
-<head>
-<meta http-equiv=Content-Type content="text/html; charset=windows-1252">
-<meta name=ProgId content=Word.Document>
-<meta name=Generator content="Microsoft Word 9">
-<meta name=Originator content="Microsoft Word 9">
-<link rel=File-List
-href="./Eclipse%20EPL%202003_11_10%20Final_files/filelist.xml">
-<title>Eclipse Public License - Version 1.0</title>
-<!--[if gte mso 9]><xml>
- <o:DocumentProperties>
-  <o:Revision>2</o:Revision>
-  <o:TotalTime>3</o:TotalTime>
-  <o:Created>2004-03-05T23:03:00Z</o:Created>
-  <o:LastSaved>2004-03-05T23:03:00Z</o:LastSaved>
-  <o:Pages>4</o:Pages>
-  <o:Words>1626</o:Words>
-  <o:Characters>9270</o:Characters>
-   <o:Lines>77</o:Lines>
-  <o:Paragraphs>18</o:Paragraphs>
-  <o:CharactersWithSpaces>11384</o:CharactersWithSpaces>
-  <o:Version>9.4402</o:Version>
- </o:DocumentProperties>
-</xml><![endif]--><!--[if gte mso 9]><xml>
- <w:WordDocument>
-  <w:TrackRevisions/>
- </w:WordDocument>
-</xml><![endif]-->
-<style>
-<!--
- /* Font Definitions */
-@font-face
-	{font-family:Tahoma;
-	panose-1:2 11 6 4 3 5 4 4 2 4;
-	mso-font-charset:0;
-	mso-generic-font-family:swiss;
-	mso-font-pitch:variable;
-	mso-font-signature:553679495 -2147483648 8 0 66047 0;}
- /* Style Definitions */
-p.MsoNormal, li.MsoNormal, div.MsoNormal
-	{mso-style-parent:"";
-	margin:0in;
-	margin-bottom:.0001pt;
-	mso-pagination:widow-orphan;
-	font-size:12.0pt;
-	font-family:"Times New Roman";
-	mso-fareast-font-family:"Times New Roman";}
-p
-	{margin-right:0in;
-	mso-margin-top-alt:auto;
-	mso-margin-bottom-alt:auto;
-	margin-left:0in;
-	mso-pagination:widow-orphan;
-	font-size:12.0pt;
-	font-family:"Times New Roman";
-	mso-fareast-font-family:"Times New Roman";}
-p.BalloonText, li.BalloonText, div.BalloonText
-	{mso-style-name:"Balloon Text";
-	margin:0in;
-	margin-bottom:.0001pt;
-	mso-pagination:widow-orphan;
-	font-size:8.0pt;
-	font-family:Tahoma;
-	mso-fareast-font-family:"Times New Roman";}
-@page Section1
-	{size:8.5in 11.0in;
-	margin:1.0in 1.25in 1.0in 1.25in;
-	mso-header-margin:.5in;
-	mso-footer-margin:.5in;
-	mso-paper-source:0;}
-div.Section1
-	{page:Section1;}
--->
-</style>
-</head>
-
-<body lang=EN-US style='tab-interval:.5in'>
-
-<div class=Section1>
-
-<p align=center style='text-align:center'><b>Eclipse Public License - v 1.0</b>
-</p>
-
-<p><span style='font-size:10.0pt'>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER
-THE TERMS OF THIS ECLIPSE PUBLIC LICENSE (&quot;AGREEMENT&quot;). ANY USE,
-REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE
-OF THIS AGREEMENT.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>1. DEFINITIONS</span></b> </p>
-
-<p><span style='font-size:10.0pt'>&quot;Contribution&quot; means:</span> </p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-in the case of the initial Contributor, the initial code and documentation
-distributed under this Agreement, and<br clear=left>
-b) in the case of each subsequent Contributor:</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>i)
-changes to the Program, and</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>ii)
-additions to the Program;</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>where
-such changes and/or additions to the Program originate from and are distributed
-by that particular Contributor. A Contribution 'originates' from a Contributor
-if it was added to the Program by such Contributor itself or anyone acting on
-such Contributor's behalf. Contributions do not include additions to the
-Program which: (i) are separate modules of software distributed in conjunction
-with the Program under their own license agreement, and (ii) are not derivative
-works of the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>&quot;Contributor&quot; means any person or
-entity that distributes the Program.</span> </p>
-
-<p><span style='font-size:10.0pt'>&quot;Licensed Patents &quot; mean patent
-claims licensable by a Contributor which are necessarily infringed by the use
-or sale of its Contribution alone or when combined with the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>&quot;Program&quot; means the Contributions
-distributed in accordance with this Agreement.</span> </p>
-
-<p><span style='font-size:10.0pt'>&quot;Recipient&quot; means anyone who
-receives the Program under this Agreement, including all Contributors.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>2. GRANT OF RIGHTS</span></b> </p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-Subject to the terms of this Agreement, each Contributor hereby grants Recipient
-a non-exclusive, worldwide, royalty-free copyright license to<span
-style='color:red'> </span>reproduce, prepare derivative works of, publicly
-display, publicly perform, distribute and sublicense the Contribution of such
-Contributor, if any, and such derivative works, in source code and object code
-form.</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b)
-Subject to the terms of this Agreement, each Contributor hereby grants
-Recipient a non-exclusive, worldwide,<span style='color:green'> </span>royalty-free
-patent license under Licensed Patents to make, use, sell, offer to sell, import
-and otherwise transfer the Contribution of such Contributor, if any, in source
-code and object code form. This patent license shall apply to the combination
-of the Contribution and the Program if, at the time the Contribution is added
-by the Contributor, such addition of the Contribution causes such combination
-to be covered by the Licensed Patents. The patent license shall not apply to
-any other combinations which include the Contribution. No hardware per se is
-licensed hereunder. </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>c)
-Recipient understands that although each Contributor grants the licenses to its
-Contributions set forth herein, no assurances are provided by any Contributor
-that the Program does not infringe the patent or other intellectual property
-rights of any other entity. Each Contributor disclaims any liability to Recipient
-for claims brought by any other entity based on infringement of intellectual
-property rights or otherwise. As a condition to exercising the rights and
-licenses granted hereunder, each Recipient hereby assumes sole responsibility
-to secure any other intellectual property rights needed, if any. For example,
-if a third party patent license is required to allow Recipient to distribute
-the Program, it is Recipient's responsibility to acquire that license before
-distributing the Program.</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>d)
-Each Contributor represents that to its knowledge it has sufficient copyright
-rights in its Contribution, if any, to grant the copyright license set forth in
-this Agreement. </span></p>
-
-<p><b><span style='font-size:10.0pt'>3. REQUIREMENTS</span></b> </p>
-
-<p><span style='font-size:10.0pt'>A Contributor may choose to distribute the
-Program in object code form under its own license agreement, provided that:</span>
-</p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-it complies with the terms and conditions of this Agreement; and</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b)
-its license agreement:</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>i)
-effectively disclaims on behalf of all Contributors all warranties and
-conditions, express and implied, including warranties or conditions of title
-and non-infringement, and implied warranties or conditions of merchantability
-and fitness for a particular purpose; </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>ii)
-effectively excludes on behalf of all Contributors all liability for damages,
-including direct, indirect, special, incidental and consequential damages, such
-as lost profits; </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>iii)
-states that any provisions which differ from this Agreement are offered by that
-Contributor alone and not by any other party; and</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>iv)
-states that source code for the Program is available from such Contributor, and
-informs licensees how to obtain it in a reasonable manner on or through a
-medium customarily used for software exchange.<span style='color:blue'> </span></span></p>
-
-<p><span style='font-size:10.0pt'>When the Program is made available in source
-code form:</span> </p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-it must be made available under this Agreement; and </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b) a
-copy of this Agreement must be included with each copy of the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>Contributors may not remove or alter any
-copyright notices contained within the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>Each Contributor must identify itself as the
-originator of its Contribution, if any, in a manner that reasonably allows
-subsequent Recipients to identify the originator of the Contribution. </span></p>
-
-<p><b><span style='font-size:10.0pt'>4. COMMERCIAL DISTRIBUTION</span></b> </p>
-
-<p><span style='font-size:10.0pt'>Commercial distributors of software may
-accept certain responsibilities with respect to end users, business partners
-and the like. While this license is intended to facilitate the commercial use
-of the Program, the Contributor who includes the Program in a commercial
-product offering should do so in a manner which does not create potential
-liability for other Contributors. Therefore, if a Contributor includes the
-Program in a commercial product offering, such Contributor (&quot;Commercial
-Contributor&quot;) hereby agrees to defend and indemnify every other
-Contributor (&quot;Indemnified Contributor&quot;) against any losses, damages and
-costs (collectively &quot;Losses&quot;) arising from claims, lawsuits and other
-legal actions brought by a third party against the Indemnified Contributor to
-the extent caused by the acts or omissions of such Commercial Contributor in
-connection with its distribution of the Program in a commercial product
-offering. The obligations in this section do not apply to any claims or Losses
-relating to any actual or alleged intellectual property infringement. In order
-to qualify, an Indemnified Contributor must: a) promptly notify the Commercial
-Contributor in writing of such claim, and b) allow the Commercial Contributor
-to control, and cooperate with the Commercial Contributor in, the defense and
-any related settlement negotiations. The Indemnified Contributor may participate
-in any such claim at its own expense.</span> </p>
-
-<p><span style='font-size:10.0pt'>For example, a Contributor might include the
-Program in a commercial product offering, Product X. That Contributor is then a
-Commercial Contributor. If that Commercial Contributor then makes performance
-claims, or offers warranties related to Product X, those performance claims and
-warranties are such Commercial Contributor's responsibility alone. Under this
-section, the Commercial Contributor would have to defend claims against the
-other Contributors related to those performance claims and warranties, and if a
-court requires any other Contributor to pay any damages as a result, the
-Commercial Contributor must pay those damages.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>5. NO WARRANTY</span></b> </p>
-
-<p><span style='font-size:10.0pt'>EXCEPT AS EXPRESSLY SET FORTH IN THIS
-AGREEMENT, THE PROGRAM IS PROVIDED ON AN &quot;AS IS&quot; 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. Each Recipient is solely
-responsible for determining the appropriateness of using and distributing the
-Program and assumes all risks associated with its exercise of rights under this
-Agreement , including but not limited to the risks and costs of program errors,
-compliance with applicable laws, damage to or loss of data, programs or
-equipment, and unavailability or interruption of operations. </span></p>
-
-<p><b><span style='font-size:10.0pt'>6. DISCLAIMER OF LIABILITY</span></b> </p>
-
-<p><span style='font-size:10.0pt'>EXCEPT AS EXPRESSLY SET FORTH IN THIS
-AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY
-OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF
-THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF
-THE POSSIBILITY OF SUCH DAMAGES.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>7. GENERAL</span></b> </p>
-
-<p><span style='font-size:10.0pt'>If any provision of this Agreement is invalid
-or unenforceable under applicable law, it shall not affect the validity or
-enforceability of the remainder of the terms of this Agreement, and without
-further action by the parties hereto, such provision shall be reformed to the
-minimum extent necessary to make such provision valid and enforceable.</span> </p>
-
-<p><span style='font-size:10.0pt'>If Recipient institutes patent litigation
-against any entity (including a cross-claim or counterclaim in a lawsuit)
-alleging that the Program itself (excluding combinations of the Program with
-other software or hardware) infringes such Recipient's patent(s), then such
-Recipient's rights granted under Section 2(b) shall terminate as of the date
-such litigation is filed. </span></p>
-
-<p><span style='font-size:10.0pt'>All Recipient's rights under this Agreement
-shall terminate if it fails to comply with any of the material terms or
-conditions of this Agreement and does not cure such failure in a reasonable
-period of time after becoming aware of such noncompliance. If all Recipient's
-rights under this Agreement terminate, Recipient agrees to cease use and
-distribution of the Program as soon as reasonably practicable. However,
-Recipient's obligations under this Agreement and any licenses granted by
-Recipient relating to the Program shall continue and survive. </span></p>
-
-<p><span style='font-size:10.0pt'>Everyone is permitted to copy and distribute
-copies of this Agreement, but in order to avoid inconsistency the Agreement is
-copyrighted and may only be modified in the following manner. The Agreement
-Steward reserves the right to publish new versions (including revisions) of
-this Agreement from time to time. No one other than the Agreement Steward has
-the right to modify this Agreement. The Eclipse Foundation is the initial
-Agreement Steward. The Eclipse Foundation may assign the responsibility to
-serve as the Agreement Steward to a suitable separate entity. Each new version
-of the Agreement will be given a distinguishing version number. The Program
-(including Contributions) may always be distributed subject to the version of
-the Agreement under which it was received. In addition, after a new version of
-the Agreement is published, Contributor may elect to distribute the Program
-(including its Contributions) under the new version. Except as expressly stated
-in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to
-the intellectual property of any Contributor under this Agreement, whether
-expressly, by implication, estoppel or otherwise. All rights in the Program not
-expressly granted under this Agreement are reserved.</span> </p>
-
-<p><span style='font-size:10.0pt'>This Agreement is governed by the laws of the
-State of New York and the intellectual property laws of the United States of
-America. No party to this Agreement will bring a legal action under this
-Agreement more than one year after the cause of action arose. Each party waives
-its rights to a jury trial in any resulting litigation.</span> </p>
-
-<p class=MsoNormal><![if !supportEmptyParas]>&nbsp;<![endif]><o:p></o:p></p>
-
-</div>
-
-</body>
-
-</html>
diff --git a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplateFeature/feature.properties b/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplateFeature/feature.properties
deleted file mode 100644
index bc2ad8e..0000000
--- a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplateFeature/feature.properties
+++ /dev/null
@@ -1,170 +0,0 @@
-###############################################################################
-# Copyright (c) 2005, 2008 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#    Oracle Corporation - initial API and implementation
-###############################################################################
-# This file should be translated.
-# feature.properties
-# contains externalized strings for feature.xml
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# This file should be translated.
-#
-# Do not translate any values surrounded by {}
-#
-# "featureName" property - name of the feature
-featureName=WTP Web Page Editor Apache MyFaces Trinidad Tag Support Source
-
-# "providerName" property - name of the company that provides the feature
-providerName=Eclipse.org
-
-
-# "description" property - description of the feature
-description=Source code zips for WTP Web Page Editor Apache MyFaces Trinidad Tag Support.
-
-# "copyright" property - text of the "Feature Update Copyright"
-copyright=\
-Copyright (c) 2007 Oracle Corporation and others.\
-All rights reserved. This program and the accompanying materials\
-are made available under the terms of the Eclipse Public License v1.0\
-which accompanies this distribution, and is available at\
-http://www.eclipse.org/legal/epl-v10.html\
-\n\
-Contributors:\n\
-    Oracle Corporation - initial API and implementation\n
-################ end of copyright property ####################################
-
-# "licenseURL" property - URL of the "Feature License"
-# do not translate value - just change to point to a locale-specific HTML page
-licenseURL=license.html
-
-# "license" property - text of the "Feature Update License"
-# should be plain text version of license agreement pointed to be "licenseURL"
-license=\
-Eclipse Foundation Software User Agreement\n\
-April 14, 2010\n\
-\n\
-Usage Of Content\n\
-\n\
-THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR\n\
-OTHER MATERIALS FOR OPEN SOURCE PROJECTS (COLLECTIVELY "CONTENT").\n\
-USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS\n\
-AGREEMENT AND/OR THE TERMS AND CONDITIONS OF LICENSE AGREEMENTS OR\n\
-NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU\n\
-AGREE THAT YOUR USE OF THE CONTENT IS GOVERNED BY THIS AGREEMENT\n\
-AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS\n\
-OR NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE\n\
-TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND CONDITIONS\n\
-OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED\n\
-BELOW, THEN YOU MAY NOT USE THE CONTENT.\n\
-\n\
-Applicable Licenses\n\
-\n\
-Unless otherwise indicated, all Content made available by the\n\
-Eclipse Foundation is provided to you under the terms and conditions of\n\
-the Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is\n\
-provided with this Content and is also available at http://www.eclipse.org/legal/epl-v10.html.\n\
-For purposes of the EPL, "Program" will mean the Content.\n\
-\n\
-Content includes, but is not limited to, source code, object code,\n\
-documentation and other files maintained in the Eclipse Foundation source code\n\
-repository ("Repository") in software modules ("Modules") and made available\n\
-as downloadable archives ("Downloads").\n\
-\n\
-       - Content may be structured and packaged into modules to facilitate delivering,\n\
-         extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"),\n\
-         plug-in fragments ("Fragments"), and features ("Features").\n\
-       - Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java(TM) ARchive)\n\
-         in a directory named "plugins".\n\
-       - A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.\n\
-         Each Feature may be packaged as a sub-directory in a directory named "features".\n\
-         Within a Feature, files named "feature.xml" may contain a list of the names and version\n\
-         numbers of the Plug-ins and/or Fragments associated with that Feature.\n\
-       - Features may also include other Features ("Included Features"). Within a Feature, files\n\
-         named "feature.xml" may contain a list of the names and version numbers of Included Features.\n\
-\n\
-The terms and conditions governing Plug-ins and Fragments should be\n\
-contained in files named "about.html" ("Abouts"). The terms and\n\
-conditions governing Features and Included Features should be contained\n\
-in files named "license.html" ("Feature Licenses"). Abouts and Feature\n\
-Licenses may be located in any directory of a Download or Module\n\
-including, but not limited to the following locations:\n\
-\n\
-       - The top-level (root) directory\n\
-       - Plug-in and Fragment directories\n\
-       - Inside Plug-ins and Fragments packaged as JARs\n\
-       - Sub-directories of the directory named "src" of certain Plug-ins\n\
-       - Feature directories\n\
-\n\
-Note: if a Feature made available by the Eclipse Foundation is installed using the\n\
-Provisioning Technology (as defined below), you must agree to a license ("Feature \n\
-Update License") during the installation process. If the Feature contains\n\
-Included Features, the Feature Update License should either provide you\n\
-with the terms and conditions governing the Included Features or inform\n\
-you where you can locate them. Feature Update Licenses may be found in\n\
-the "license" property of files named "feature.properties" found within a Feature.\n\
-Such Abouts, Feature Licenses, and Feature Update Licenses contain the\n\
-terms and conditions (or references to such terms and conditions) that\n\
-govern your use of the associated Content in that directory.\n\
-\n\
-THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER\n\
-TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.\n\
-SOME OF THESE OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):\n\
-\n\
-       - Common Public License Version 1.0 (available at http://www.eclipse.org/legal/cpl-v10.html)\n\
-       - Apache Software License 1.1 (available at http://www.apache.org/licenses/LICENSE)\n\
-       - Apache Software License 2.0 (available at http://www.apache.org/licenses/LICENSE-2.0)\n\
-       - Metro Link Public License 1.00 (available at http://www.opengroup.org/openmotif/supporters/metrolink/license.html)\n\
-       - Mozilla Public License Version 1.1 (available at http://www.mozilla.org/MPL/MPL-1.1.html)\n\
-\n\
-IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR\n\
-TO USE OF THE CONTENT. If no About, Feature License, or Feature Update License\n\
-is provided, please contact the Eclipse Foundation to determine what terms and conditions\n\
-govern that particular Content.\n\
-\n\
-\n\Use of Provisioning Technology\n\
-\n\
-The Eclipse Foundation makes available provisioning software, examples of which include,\n\
-but are not limited to, p2 and the Eclipse Update Manager ("Provisioning Technology") for\n\
-the purpose of allowing users to install software, documentation, information and/or\n\
-other materials (collectively "Installable Software"). This capability is provided with\n\
-the intent of allowing such users to install, extend and update Eclipse-based products.\n\
-Information about packaging Installable Software is available at\n\
-http://eclipse.org/equinox/p2/repository_packaging.html ("Specification").\n\
-\n\
-You may use Provisioning Technology to allow other parties to install Installable Software.\n\
-You shall be responsible for enabling the applicable license agreements relating to the\n\
-Installable Software to be presented to, and accepted by, the users of the Provisioning Technology\n\
-in accordance with the Specification. By using Provisioning Technology in such a manner and\n\
-making it available in accordance with the Specification, you further acknowledge your\n\
-agreement to, and the acquisition of all necessary rights to permit the following:\n\
-\n\
-       1. A series of actions may occur ("Provisioning Process") in which a user may execute\n\
-          the Provisioning Technology on a machine ("Target Machine") with the intent of installing,\n\
-          extending or updating the functionality of an Eclipse-based product.\n\
-       2. During the Provisioning Process, the Provisioning Technology may cause third party\n\
-          Installable Software or a portion thereof to be accessed and copied to the Target Machine.\n\
-       3. Pursuant to the Specification, you will provide to the user the terms and conditions that\n\
-          govern the use of the Installable Software ("Installable Software Agreement") and such\n\
-          Installable Software Agreement shall be accessed from the Target Machine in accordance\n\
-          with the Specification. Such Installable Software Agreement must inform the user of the\n\
-          terms and conditions that govern the Installable Software and must solicit acceptance by\n\
-          the end user in the manner prescribed in such Installable Software Agreement. Upon such\n\
-          indication of agreement by the user, the provisioning Technology will complete installation\n\
-          of the Installable Software.\n\
-\n\
-Cryptography\n\
-\n\
-Content may contain encryption software. The country in which you are\n\
-currently may have restrictions on the import, possession, and use,\n\
-and/or re-export to another country, of encryption software. BEFORE\n\
-using any encryption software, please check the country's laws,\n\
-regulations and policies concerning the import, possession, or use, and\n\
-re-export of encryption software, to see if this is permitted.\n\
-\n\
-Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.\n
-########### end of license property ##########################################
diff --git a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplateFeature/license.html b/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplateFeature/license.html
deleted file mode 100644
index c184ca3..0000000
--- a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplateFeature/license.html
+++ /dev/null
@@ -1,107 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1" ?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
-<title>Eclipse Foundation Software User Agreement</title>
-</head>
-
-<body lang="EN-US">
-<h2>Eclipse Foundation Software User Agreement</h2>
-<p>April 14, 2010</p>
-
-<h3>Usage Of Content</h3>
-
-<p>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS
-   (COLLECTIVELY &quot;CONTENT&quot;).  USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND
-   CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU AGREE THAT YOUR USE
-   OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR
-   NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND
-   CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.</p>
-
-<h3>Applicable Licenses</h3>
-
-<p>Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0
-   (&quot;EPL&quot;).  A copy of the EPL is provided with this Content and is also available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-   For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse Foundation source code
-   repository (&quot;Repository&quot;) in software modules (&quot;Modules&quot;) and made available as downloadable archives (&quot;Downloads&quot;).</p>
-
-<ul>
-       <li>Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content.  Typical modules may include plug-ins (&quot;Plug-ins&quot;), plug-in fragments (&quot;Fragments&quot;), and features (&quot;Features&quot;).</li>
-       <li>Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java&trade; ARchive) in a directory named &quot;plugins&quot;.</li>
-       <li>A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.  Each Feature may be packaged as a sub-directory in a directory named &quot;features&quot;.  Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of the Plug-ins
-      and/or Fragments associated with that Feature.</li>
-       <li>Features may also include other Features (&quot;Included Features&quot;). Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of Included Features.</li>
-</ul>
-
-<p>The terms and conditions governing Plug-ins and Fragments should be contained in files named &quot;about.html&quot; (&quot;Abouts&quot;). The terms and conditions governing Features and
-Included Features should be contained in files named &quot;license.html&quot; (&quot;Feature Licenses&quot;).  Abouts and Feature Licenses may be located in any directory of a Download or Module
-including, but not limited to the following locations:</p>
-
-<ul>
-       <li>The top-level (root) directory</li>
-       <li>Plug-in and Fragment directories</li>
-       <li>Inside Plug-ins and Fragments packaged as JARs</li>
-       <li>Sub-directories of the directory named &quot;src&quot; of certain Plug-ins</li>
-       <li>Feature directories</li>
-</ul>
-
-<p>Note: if a Feature made available by the Eclipse Foundation is installed using the Provisioning Technology (as defined below), you must agree to a license (&quot;Feature Update License&quot;) during the
-installation process.  If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or
-inform you where you can locate them.  Feature Update Licenses may be found in the &quot;license&quot; property of files named &quot;feature.properties&quot; found within a Feature.
-Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in
-that directory.</p>
-
-<p>THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.  SOME OF THESE
-OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):</p>
-
-<ul>
-       <li>Common Public License Version 1.0 (available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>)</li>
-       <li>Apache Software License 1.1 (available at <a href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</a>)</li>
-       <li>Apache Software License 2.0 (available at <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>)</li>
-       <li>Metro Link Public License 1.00 (available at <a href="http://www.opengroup.org/openmotif/supporters/metrolink/license.html">http://www.opengroup.org/openmotif/supporters/metrolink/license.html</a>)</li>
-       <li>Mozilla Public License Version 1.1 (available at <a href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</a>)</li>
-</ul>
-
-<p>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT.  If no About, Feature License, or Feature Update License is provided, please
-contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.</p>
-
-
-<h3>Use of Provisioning Technology</h3>
-
-<p>The Eclipse Foundation makes available provisioning software, examples of which include, but are not limited to, p2 and the Eclipse
-   Update Manager (&quot;Provisioning Technology&quot;) for the purpose of allowing users to install software, documentation, information and/or
-   other materials (collectively &quot;Installable Software&quot;). This capability is provided with the intent of allowing such users to
-   install, extend and update Eclipse-based products. Information about packaging Installable Software is available at <a
-       href="http://eclipse.org/equinox/p2/repository_packaging.html">http://eclipse.org/equinox/p2/repository_packaging.html</a>
-   (&quot;Specification&quot;).</p>
-
-<p>You may use Provisioning Technology to allow other parties to install Installable Software. You shall be responsible for enabling the
-   applicable license agreements relating to the Installable Software to be presented to, and accepted by, the users of the Provisioning Technology
-   in accordance with the Specification. By using Provisioning Technology in such a manner and making it available in accordance with the
-   Specification, you further acknowledge your agreement to, and the acquisition of all necessary rights to permit the following:</p>
-
-<ol>
-       <li>A series of actions may occur (&quot;Provisioning Process&quot;) in which a user may execute the Provisioning Technology
-       on a machine (&quot;Target Machine&quot;) with the intent of installing, extending or updating the functionality of an Eclipse-based
-       product.</li>
-       <li>During the Provisioning Process, the Provisioning Technology may cause third party Installable Software or a portion thereof to be
-       accessed and copied to the Target Machine.</li>
-       <li>Pursuant to the Specification, you will provide to the user the terms and conditions that govern the use of the Installable
-       Software (&quot;Installable Software Agreement&quot;) and such Installable Software Agreement shall be accessed from the Target
-       Machine in accordance with the Specification. Such Installable Software Agreement must inform the user of the terms and conditions that govern
-       the Installable Software and must solicit acceptance by the end user in the manner prescribed in such Installable Software Agreement. Upon such
-       indication of agreement by the user, the provisioning Technology will complete installation of the Installable Software.</li>
-</ol>
-
-<h3>Cryptography</h3>
-
-<p>Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to
-   another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import,
-   possession, or use, and re-export of encryption software, to see if this is permitted.</p>
-
-<p><small>Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.</small></p>
-</body>
-</html>
diff --git a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplatePlugin/about.html b/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplatePlugin/about.html
deleted file mode 100644
index fe81d46..0000000
--- a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplatePlugin/about.html
+++ /dev/null
@@ -1,27 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<head>
-<title>About</title>
-<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
-
-<P>June, 2008</P>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise indicated below, the Content is provided to you under the terms and conditions of the
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content.</p>
-
-<h3>Source Code</h3>
-<p>This plug-in contains source code zip files (&quot;Source Zips&quot;) that correspond to binary content in other plug-ins. These Source Zips may be distributed under different license
-agreements and/or notices. Details about these license agreements and notices are contained in &quot;about.html&quot; files (&quot;Abouts&quot;) located in sub-directories in the
-src/ directory of this plug-in. Such Abouts govern your use of the Source Zips in that directory, not the EPL.</p>
-
-</body>
-</html>
diff --git a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplatePlugin/about.ini b/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplatePlugin/about.ini
deleted file mode 100644
index 2dee36a..0000000
--- a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplatePlugin/about.ini
+++ /dev/null
@@ -1,31 +0,0 @@
-# about.ini
-# contains information about a feature
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# "%key" are externalized strings defined in about.properties
-# This file does not need to be translated.
-
-# Property "aboutText" contains blurb for "About" dialog (translated)
-aboutText=%blurb
-
-# Property "windowImage" contains path to window icon (16x16)
-# needed for primary features only
-
-# Property "featureImage" contains path to feature image (32x32)
-featureImage=eclipse32.gif
-
-# Property "aboutImage" contains path to product image (500x330 or 115x164)
-# needed for primary features only
-
-# Property "appName" contains name of the application (not translated)
-# needed for primary features only
-
-# Property "welcomePage" contains path to welcome page (special XML-based format)
-# optional
-
-# Property "welcomePerspective" contains the id of the perspective in which the
-# welcome page is to be opened.
-# optional
-
-
-
-
diff --git a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplatePlugin/about.mappings b/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplatePlugin/about.mappings
deleted file mode 100644
index a28390a..0000000
--- a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplatePlugin/about.mappings
+++ /dev/null
@@ -1,6 +0,0 @@
-# about.mappings
-# contains fill-ins for about.properties
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# This file does not need to be translated.
-
-0=@build@
diff --git a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplatePlugin/about.properties b/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplatePlugin/about.properties
deleted file mode 100644
index c315cf8..0000000
--- a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplatePlugin/about.properties
+++ /dev/null
@@ -1,27 +0,0 @@
-###############################################################################
-# Copyright (c) 2005, 2008 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#    Oracle Corporation - initial API and implementation
-###############################################################################
-# This file should be translated.
-# about.properties
-# contains externalized strings for about.ini
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# fill-ins are supplied by about.mappings
-# This file should be translated.
-#
-# Do not translate any values surrounded by {}
-
-blurb=WTP Web Page Editor Apache MyFaces Trinidad Tag Support Source\n\
-\n\
-Version: {featureVersion}\n\
-Build id: {0}\n\
-\n\
-(c) Copyright Eclipse contributors and others 2007.  All rights reserved.\n\
-Visit http://www.eclipse.org/webtools
-
diff --git a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplatePlugin/build.properties b/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplatePlugin/build.properties
deleted file mode 100644
index 85ef5b7..0000000
--- a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplatePlugin/build.properties
+++ /dev/null
@@ -1,13 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2008 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-
-bin.includes = about.html, about.ini, about.mappings, about.properties, eclipse32.gif, plugin.properties, plugin.xml, src/**, META-INF/
-sourcePlugin = true
diff --git a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplatePlugin/eclipse32.gif b/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplatePlugin/eclipse32.gif
deleted file mode 100644
index e6ad7cc..0000000
--- a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplatePlugin/eclipse32.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplatePlugin/eclipse32.png b/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplatePlugin/eclipse32.png
deleted file mode 100644
index 50ae49d..0000000
--- a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplatePlugin/eclipse32.png
+++ /dev/null
Binary files differ
diff --git a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplatePlugin/plugin.properties b/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplatePlugin/plugin.properties
deleted file mode 100644
index 09fcddc..0000000
--- a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplatePlugin/plugin.properties
+++ /dev/null
@@ -1,20 +0,0 @@
-###############################################################################
-# Copyright (c) 2005, 2008 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#    Oracle Corporation - initial API and implementation
-###############################################################################
-# This file should be translated.
-# plugin.properties
-# contains externalized strings for manifest.mf
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# fill-ins are supplied by about.mappings
-# This file should be translated.
-#
-# Do not translate any values surrounded by {}
-pluginName=WTP Web Page Editor Apache MyFaces Trinidad Tag Support Source
-providerName=Eclipse.org
diff --git a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport_sdk.feature/.project b/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport_sdk.feature/.project
deleted file mode 100644
index 8ff0421..0000000
--- a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport_sdk.feature/.project
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.jst.jsf.apache.trinidad.tagsupport_sdk.feature</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.pde.FeatureBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.FeatureNature</nature>
-	</natures>
-</projectDescription>
diff --git a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport_sdk.feature/build.properties b/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport_sdk.feature/build.properties
deleted file mode 100644
index bea9927..0000000
--- a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport_sdk.feature/build.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-###############################################################################
-# Copyright (c)  2008 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-bin.includes = feature.xml,\
-               eclipse_update_120.jpg,\
-               epl-v10.html,\
-               feature.properties,\
-               license.html
-
-generate.feature@org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature.source = org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature
\ No newline at end of file
diff --git a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport_sdk.feature/eclipse_update_120.jpg b/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport_sdk.feature/eclipse_update_120.jpg
deleted file mode 100644
index bfdf708..0000000
--- a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport_sdk.feature/eclipse_update_120.jpg
+++ /dev/null
Binary files differ
diff --git a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport_sdk.feature/epl-v10.html b/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport_sdk.feature/epl-v10.html
deleted file mode 100644
index ed4b196..0000000
--- a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport_sdk.feature/epl-v10.html
+++ /dev/null
@@ -1,328 +0,0 @@
-<html xmlns:o="urn:schemas-microsoft-com:office:office"
-xmlns:w="urn:schemas-microsoft-com:office:word"
-xmlns="http://www.w3.org/TR/REC-html40">
-
-<head>
-<meta http-equiv=Content-Type content="text/html; charset=windows-1252">
-<meta name=ProgId content=Word.Document>
-<meta name=Generator content="Microsoft Word 9">
-<meta name=Originator content="Microsoft Word 9">
-<link rel=File-List
-href="./Eclipse%20EPL%202003_11_10%20Final_files/filelist.xml">
-<title>Eclipse Public License - Version 1.0</title>
-<!--[if gte mso 9]><xml>
- <o:DocumentProperties>
-  <o:Revision>2</o:Revision>
-  <o:TotalTime>3</o:TotalTime>
-  <o:Created>2004-03-05T23:03:00Z</o:Created>
-  <o:LastSaved>2004-03-05T23:03:00Z</o:LastSaved>
-  <o:Pages>4</o:Pages>
-  <o:Words>1626</o:Words>
-  <o:Characters>9270</o:Characters>
-   <o:Lines>77</o:Lines>
-  <o:Paragraphs>18</o:Paragraphs>
-  <o:CharactersWithSpaces>11384</o:CharactersWithSpaces>
-  <o:Version>9.4402</o:Version>
- </o:DocumentProperties>
-</xml><![endif]--><!--[if gte mso 9]><xml>
- <w:WordDocument>
-  <w:TrackRevisions/>
- </w:WordDocument>
-</xml><![endif]-->
-<style>
-<!--
- /* Font Definitions */
-@font-face
-	{font-family:Tahoma;
-	panose-1:2 11 6 4 3 5 4 4 2 4;
-	mso-font-charset:0;
-	mso-generic-font-family:swiss;
-	mso-font-pitch:variable;
-	mso-font-signature:553679495 -2147483648 8 0 66047 0;}
- /* Style Definitions */
-p.MsoNormal, li.MsoNormal, div.MsoNormal
-	{mso-style-parent:"";
-	margin:0in;
-	margin-bottom:.0001pt;
-	mso-pagination:widow-orphan;
-	font-size:12.0pt;
-	font-family:"Times New Roman";
-	mso-fareast-font-family:"Times New Roman";}
-p
-	{margin-right:0in;
-	mso-margin-top-alt:auto;
-	mso-margin-bottom-alt:auto;
-	margin-left:0in;
-	mso-pagination:widow-orphan;
-	font-size:12.0pt;
-	font-family:"Times New Roman";
-	mso-fareast-font-family:"Times New Roman";}
-p.BalloonText, li.BalloonText, div.BalloonText
-	{mso-style-name:"Balloon Text";
-	margin:0in;
-	margin-bottom:.0001pt;
-	mso-pagination:widow-orphan;
-	font-size:8.0pt;
-	font-family:Tahoma;
-	mso-fareast-font-family:"Times New Roman";}
-@page Section1
-	{size:8.5in 11.0in;
-	margin:1.0in 1.25in 1.0in 1.25in;
-	mso-header-margin:.5in;
-	mso-footer-margin:.5in;
-	mso-paper-source:0;}
-div.Section1
-	{page:Section1;}
--->
-</style>
-</head>
-
-<body lang=EN-US style='tab-interval:.5in'>
-
-<div class=Section1>
-
-<p align=center style='text-align:center'><b>Eclipse Public License - v 1.0</b>
-</p>
-
-<p><span style='font-size:10.0pt'>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER
-THE TERMS OF THIS ECLIPSE PUBLIC LICENSE (&quot;AGREEMENT&quot;). ANY USE,
-REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE
-OF THIS AGREEMENT.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>1. DEFINITIONS</span></b> </p>
-
-<p><span style='font-size:10.0pt'>&quot;Contribution&quot; means:</span> </p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-in the case of the initial Contributor, the initial code and documentation
-distributed under this Agreement, and<br clear=left>
-b) in the case of each subsequent Contributor:</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>i)
-changes to the Program, and</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>ii)
-additions to the Program;</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>where
-such changes and/or additions to the Program originate from and are distributed
-by that particular Contributor. A Contribution 'originates' from a Contributor
-if it was added to the Program by such Contributor itself or anyone acting on
-such Contributor's behalf. Contributions do not include additions to the
-Program which: (i) are separate modules of software distributed in conjunction
-with the Program under their own license agreement, and (ii) are not derivative
-works of the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>&quot;Contributor&quot; means any person or
-entity that distributes the Program.</span> </p>
-
-<p><span style='font-size:10.0pt'>&quot;Licensed Patents &quot; mean patent
-claims licensable by a Contributor which are necessarily infringed by the use
-or sale of its Contribution alone or when combined with the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>&quot;Program&quot; means the Contributions
-distributed in accordance with this Agreement.</span> </p>
-
-<p><span style='font-size:10.0pt'>&quot;Recipient&quot; means anyone who
-receives the Program under this Agreement, including all Contributors.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>2. GRANT OF RIGHTS</span></b> </p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-Subject to the terms of this Agreement, each Contributor hereby grants Recipient
-a non-exclusive, worldwide, royalty-free copyright license to<span
-style='color:red'> </span>reproduce, prepare derivative works of, publicly
-display, publicly perform, distribute and sublicense the Contribution of such
-Contributor, if any, and such derivative works, in source code and object code
-form.</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b)
-Subject to the terms of this Agreement, each Contributor hereby grants
-Recipient a non-exclusive, worldwide,<span style='color:green'> </span>royalty-free
-patent license under Licensed Patents to make, use, sell, offer to sell, import
-and otherwise transfer the Contribution of such Contributor, if any, in source
-code and object code form. This patent license shall apply to the combination
-of the Contribution and the Program if, at the time the Contribution is added
-by the Contributor, such addition of the Contribution causes such combination
-to be covered by the Licensed Patents. The patent license shall not apply to
-any other combinations which include the Contribution. No hardware per se is
-licensed hereunder. </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>c)
-Recipient understands that although each Contributor grants the licenses to its
-Contributions set forth herein, no assurances are provided by any Contributor
-that the Program does not infringe the patent or other intellectual property
-rights of any other entity. Each Contributor disclaims any liability to Recipient
-for claims brought by any other entity based on infringement of intellectual
-property rights or otherwise. As a condition to exercising the rights and
-licenses granted hereunder, each Recipient hereby assumes sole responsibility
-to secure any other intellectual property rights needed, if any. For example,
-if a third party patent license is required to allow Recipient to distribute
-the Program, it is Recipient's responsibility to acquire that license before
-distributing the Program.</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>d)
-Each Contributor represents that to its knowledge it has sufficient copyright
-rights in its Contribution, if any, to grant the copyright license set forth in
-this Agreement. </span></p>
-
-<p><b><span style='font-size:10.0pt'>3. REQUIREMENTS</span></b> </p>
-
-<p><span style='font-size:10.0pt'>A Contributor may choose to distribute the
-Program in object code form under its own license agreement, provided that:</span>
-</p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-it complies with the terms and conditions of this Agreement; and</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b)
-its license agreement:</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>i)
-effectively disclaims on behalf of all Contributors all warranties and
-conditions, express and implied, including warranties or conditions of title
-and non-infringement, and implied warranties or conditions of merchantability
-and fitness for a particular purpose; </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>ii)
-effectively excludes on behalf of all Contributors all liability for damages,
-including direct, indirect, special, incidental and consequential damages, such
-as lost profits; </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>iii)
-states that any provisions which differ from this Agreement are offered by that
-Contributor alone and not by any other party; and</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>iv)
-states that source code for the Program is available from such Contributor, and
-informs licensees how to obtain it in a reasonable manner on or through a
-medium customarily used for software exchange.<span style='color:blue'> </span></span></p>
-
-<p><span style='font-size:10.0pt'>When the Program is made available in source
-code form:</span> </p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-it must be made available under this Agreement; and </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b) a
-copy of this Agreement must be included with each copy of the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>Contributors may not remove or alter any
-copyright notices contained within the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>Each Contributor must identify itself as the
-originator of its Contribution, if any, in a manner that reasonably allows
-subsequent Recipients to identify the originator of the Contribution. </span></p>
-
-<p><b><span style='font-size:10.0pt'>4. COMMERCIAL DISTRIBUTION</span></b> </p>
-
-<p><span style='font-size:10.0pt'>Commercial distributors of software may
-accept certain responsibilities with respect to end users, business partners
-and the like. While this license is intended to facilitate the commercial use
-of the Program, the Contributor who includes the Program in a commercial
-product offering should do so in a manner which does not create potential
-liability for other Contributors. Therefore, if a Contributor includes the
-Program in a commercial product offering, such Contributor (&quot;Commercial
-Contributor&quot;) hereby agrees to defend and indemnify every other
-Contributor (&quot;Indemnified Contributor&quot;) against any losses, damages and
-costs (collectively &quot;Losses&quot;) arising from claims, lawsuits and other
-legal actions brought by a third party against the Indemnified Contributor to
-the extent caused by the acts or omissions of such Commercial Contributor in
-connection with its distribution of the Program in a commercial product
-offering. The obligations in this section do not apply to any claims or Losses
-relating to any actual or alleged intellectual property infringement. In order
-to qualify, an Indemnified Contributor must: a) promptly notify the Commercial
-Contributor in writing of such claim, and b) allow the Commercial Contributor
-to control, and cooperate with the Commercial Contributor in, the defense and
-any related settlement negotiations. The Indemnified Contributor may participate
-in any such claim at its own expense.</span> </p>
-
-<p><span style='font-size:10.0pt'>For example, a Contributor might include the
-Program in a commercial product offering, Product X. That Contributor is then a
-Commercial Contributor. If that Commercial Contributor then makes performance
-claims, or offers warranties related to Product X, those performance claims and
-warranties are such Commercial Contributor's responsibility alone. Under this
-section, the Commercial Contributor would have to defend claims against the
-other Contributors related to those performance claims and warranties, and if a
-court requires any other Contributor to pay any damages as a result, the
-Commercial Contributor must pay those damages.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>5. NO WARRANTY</span></b> </p>
-
-<p><span style='font-size:10.0pt'>EXCEPT AS EXPRESSLY SET FORTH IN THIS
-AGREEMENT, THE PROGRAM IS PROVIDED ON AN &quot;AS IS&quot; 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. Each Recipient is solely
-responsible for determining the appropriateness of using and distributing the
-Program and assumes all risks associated with its exercise of rights under this
-Agreement , including but not limited to the risks and costs of program errors,
-compliance with applicable laws, damage to or loss of data, programs or
-equipment, and unavailability or interruption of operations. </span></p>
-
-<p><b><span style='font-size:10.0pt'>6. DISCLAIMER OF LIABILITY</span></b> </p>
-
-<p><span style='font-size:10.0pt'>EXCEPT AS EXPRESSLY SET FORTH IN THIS
-AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY
-OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF
-THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF
-THE POSSIBILITY OF SUCH DAMAGES.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>7. GENERAL</span></b> </p>
-
-<p><span style='font-size:10.0pt'>If any provision of this Agreement is invalid
-or unenforceable under applicable law, it shall not affect the validity or
-enforceability of the remainder of the terms of this Agreement, and without
-further action by the parties hereto, such provision shall be reformed to the
-minimum extent necessary to make such provision valid and enforceable.</span> </p>
-
-<p><span style='font-size:10.0pt'>If Recipient institutes patent litigation
-against any entity (including a cross-claim or counterclaim in a lawsuit)
-alleging that the Program itself (excluding combinations of the Program with
-other software or hardware) infringes such Recipient's patent(s), then such
-Recipient's rights granted under Section 2(b) shall terminate as of the date
-such litigation is filed. </span></p>
-
-<p><span style='font-size:10.0pt'>All Recipient's rights under this Agreement
-shall terminate if it fails to comply with any of the material terms or
-conditions of this Agreement and does not cure such failure in a reasonable
-period of time after becoming aware of such noncompliance. If all Recipient's
-rights under this Agreement terminate, Recipient agrees to cease use and
-distribution of the Program as soon as reasonably practicable. However,
-Recipient's obligations under this Agreement and any licenses granted by
-Recipient relating to the Program shall continue and survive. </span></p>
-
-<p><span style='font-size:10.0pt'>Everyone is permitted to copy and distribute
-copies of this Agreement, but in order to avoid inconsistency the Agreement is
-copyrighted and may only be modified in the following manner. The Agreement
-Steward reserves the right to publish new versions (including revisions) of
-this Agreement from time to time. No one other than the Agreement Steward has
-the right to modify this Agreement. The Eclipse Foundation is the initial
-Agreement Steward. The Eclipse Foundation may assign the responsibility to
-serve as the Agreement Steward to a suitable separate entity. Each new version
-of the Agreement will be given a distinguishing version number. The Program
-(including Contributions) may always be distributed subject to the version of
-the Agreement under which it was received. In addition, after a new version of
-the Agreement is published, Contributor may elect to distribute the Program
-(including its Contributions) under the new version. Except as expressly stated
-in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to
-the intellectual property of any Contributor under this Agreement, whether
-expressly, by implication, estoppel or otherwise. All rights in the Program not
-expressly granted under this Agreement are reserved.</span> </p>
-
-<p><span style='font-size:10.0pt'>This Agreement is governed by the laws of the
-State of New York and the intellectual property laws of the United States of
-America. No party to this Agreement will bring a legal action under this
-Agreement more than one year after the cause of action arose. Each party waives
-its rights to a jury trial in any resulting litigation.</span> </p>
-
-<p class=MsoNormal><![if !supportEmptyParas]>&nbsp;<![endif]><o:p></o:p></p>
-
-</div>
-
-</body>
-
-</html>
\ No newline at end of file
diff --git a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport_sdk.feature/feature.properties b/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport_sdk.feature/feature.properties
deleted file mode 100644
index c76aea4..0000000
--- a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport_sdk.feature/feature.properties
+++ /dev/null
@@ -1,168 +0,0 @@
-###############################################################################
-# Copyright (c) 2008 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#    Oracle Corporation - initial API and implementation
-###############################################################################
-# feature.properties
-# contains externalized strings for feature.xml
-# "%foo" in feature.xml corresponds to the key "foo" in this file
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# This file should be translated.
-
-# "featureName" property - name of the feature
-featureName=Apache MyFaces Trinidad Tag Support (Optional) SDK
-
-# "providerName" property - name of the company that provides the feature
-providerName=Eclipse.org
-
-
-# "description" property - description of the feature
-description=Apache MyFaces Trinidad Tag Support (Optional) SDK
-
-# "copyright" property - text of the "Feature Update Copyright"
-copyright=\
-Copyright (c) 2008 Oracle Corporation.\n\
-All rights reserved. This program and the accompanying materials\n\
-are made available under the terms of the Eclipse Public License v1.0\n\
-which accompanies this distribution, and is available at\n\
-http://www.eclipse.org/legal/epl-v10.html\n\
-\n\
-Contributors:\n\
-    Oracle Corporation - initial API and implementation\n
-################ end of copyright property ####################################
-
-# "licenseURL" property - URL of the "Feature License"
-# do not translate value - just change to point to a locale-specific HTML page
-licenseURL=license.html
-
-# "license" property - text of the "Feature Update License"
-# should be plain text version of license agreement pointed to be "licenseURL"
-license=\
-Eclipse Foundation Software User Agreement\n\
-April 14, 2010\n\
-\n\
-Usage Of Content\n\
-\n\
-THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR\n\
-OTHER MATERIALS FOR OPEN SOURCE PROJECTS (COLLECTIVELY "CONTENT").\n\
-USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS\n\
-AGREEMENT AND/OR THE TERMS AND CONDITIONS OF LICENSE AGREEMENTS OR\n\
-NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU\n\
-AGREE THAT YOUR USE OF THE CONTENT IS GOVERNED BY THIS AGREEMENT\n\
-AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS\n\
-OR NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE\n\
-TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND CONDITIONS\n\
-OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED\n\
-BELOW, THEN YOU MAY NOT USE THE CONTENT.\n\
-\n\
-Applicable Licenses\n\
-\n\
-Unless otherwise indicated, all Content made available by the\n\
-Eclipse Foundation is provided to you under the terms and conditions of\n\
-the Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is\n\
-provided with this Content and is also available at http://www.eclipse.org/legal/epl-v10.html.\n\
-For purposes of the EPL, "Program" will mean the Content.\n\
-\n\
-Content includes, but is not limited to, source code, object code,\n\
-documentation and other files maintained in the Eclipse Foundation source code\n\
-repository ("Repository") in software modules ("Modules") and made available\n\
-as downloadable archives ("Downloads").\n\
-\n\
-       - Content may be structured and packaged into modules to facilitate delivering,\n\
-         extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"),\n\
-         plug-in fragments ("Fragments"), and features ("Features").\n\
-       - Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java(TM) ARchive)\n\
-         in a directory named "plugins".\n\
-       - A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.\n\
-         Each Feature may be packaged as a sub-directory in a directory named "features".\n\
-         Within a Feature, files named "feature.xml" may contain a list of the names and version\n\
-         numbers of the Plug-ins and/or Fragments associated with that Feature.\n\
-       - Features may also include other Features ("Included Features"). Within a Feature, files\n\
-         named "feature.xml" may contain a list of the names and version numbers of Included Features.\n\
-\n\
-The terms and conditions governing Plug-ins and Fragments should be\n\
-contained in files named "about.html" ("Abouts"). The terms and\n\
-conditions governing Features and Included Features should be contained\n\
-in files named "license.html" ("Feature Licenses"). Abouts and Feature\n\
-Licenses may be located in any directory of a Download or Module\n\
-including, but not limited to the following locations:\n\
-\n\
-       - The top-level (root) directory\n\
-       - Plug-in and Fragment directories\n\
-       - Inside Plug-ins and Fragments packaged as JARs\n\
-       - Sub-directories of the directory named "src" of certain Plug-ins\n\
-       - Feature directories\n\
-\n\
-Note: if a Feature made available by the Eclipse Foundation is installed using the\n\
-Provisioning Technology (as defined below), you must agree to a license ("Feature \n\
-Update License") during the installation process. If the Feature contains\n\
-Included Features, the Feature Update License should either provide you\n\
-with the terms and conditions governing the Included Features or inform\n\
-you where you can locate them. Feature Update Licenses may be found in\n\
-the "license" property of files named "feature.properties" found within a Feature.\n\
-Such Abouts, Feature Licenses, and Feature Update Licenses contain the\n\
-terms and conditions (or references to such terms and conditions) that\n\
-govern your use of the associated Content in that directory.\n\
-\n\
-THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER\n\
-TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.\n\
-SOME OF THESE OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):\n\
-\n\
-       - Common Public License Version 1.0 (available at http://www.eclipse.org/legal/cpl-v10.html)\n\
-       - Apache Software License 1.1 (available at http://www.apache.org/licenses/LICENSE)\n\
-       - Apache Software License 2.0 (available at http://www.apache.org/licenses/LICENSE-2.0)\n\
-       - Metro Link Public License 1.00 (available at http://www.opengroup.org/openmotif/supporters/metrolink/license.html)\n\
-       - Mozilla Public License Version 1.1 (available at http://www.mozilla.org/MPL/MPL-1.1.html)\n\
-\n\
-IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR\n\
-TO USE OF THE CONTENT. If no About, Feature License, or Feature Update License\n\
-is provided, please contact the Eclipse Foundation to determine what terms and conditions\n\
-govern that particular Content.\n\
-\n\
-\n\Use of Provisioning Technology\n\
-\n\
-The Eclipse Foundation makes available provisioning software, examples of which include,\n\
-but are not limited to, p2 and the Eclipse Update Manager ("Provisioning Technology") for\n\
-the purpose of allowing users to install software, documentation, information and/or\n\
-other materials (collectively "Installable Software"). This capability is provided with\n\
-the intent of allowing such users to install, extend and update Eclipse-based products.\n\
-Information about packaging Installable Software is available at\n\
-http://eclipse.org/equinox/p2/repository_packaging.html ("Specification").\n\
-\n\
-You may use Provisioning Technology to allow other parties to install Installable Software.\n\
-You shall be responsible for enabling the applicable license agreements relating to the\n\
-Installable Software to be presented to, and accepted by, the users of the Provisioning Technology\n\
-in accordance with the Specification. By using Provisioning Technology in such a manner and\n\
-making it available in accordance with the Specification, you further acknowledge your\n\
-agreement to, and the acquisition of all necessary rights to permit the following:\n\
-\n\
-       1. A series of actions may occur ("Provisioning Process") in which a user may execute\n\
-          the Provisioning Technology on a machine ("Target Machine") with the intent of installing,\n\
-          extending or updating the functionality of an Eclipse-based product.\n\
-       2. During the Provisioning Process, the Provisioning Technology may cause third party\n\
-          Installable Software or a portion thereof to be accessed and copied to the Target Machine.\n\
-       3. Pursuant to the Specification, you will provide to the user the terms and conditions that\n\
-          govern the use of the Installable Software ("Installable Software Agreement") and such\n\
-          Installable Software Agreement shall be accessed from the Target Machine in accordance\n\
-          with the Specification. Such Installable Software Agreement must inform the user of the\n\
-          terms and conditions that govern the Installable Software and must solicit acceptance by\n\
-          the end user in the manner prescribed in such Installable Software Agreement. Upon such\n\
-          indication of agreement by the user, the provisioning Technology will complete installation\n\
-          of the Installable Software.\n\
-\n\
-Cryptography\n\
-\n\
-Content may contain encryption software. The country in which you are\n\
-currently may have restrictions on the import, possession, and use,\n\
-and/or re-export to another country, of encryption software. BEFORE\n\
-using any encryption software, please check the country's laws,\n\
-regulations and policies concerning the import, possession, or use, and\n\
-re-export of encryption software, to see if this is permitted.\n\
-\n\
-Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.\n
-########### end of license property ##########################################
diff --git a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport_sdk.feature/feature.xml b/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport_sdk.feature/feature.xml
deleted file mode 100644
index 826ba0d..0000000
--- a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport_sdk.feature/feature.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<feature
-      id="org.eclipse.jst.jsf.apache.trinidad.tagsupport_sdk.feature"
-      label="%featureName"
-      version="2.2.100.qualifier"
-      provider-name="%providerName">
-
-   <description>
-      %description
-   </description>
-
-   <copyright>
-      %copyright
-   </copyright>
-
-   <license url="license.html">
-      %license
-   </license>
-
-
-   <includes
-         id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature"
-         version="0.0.0"/>
-
-   <includes
-         id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature.source"
-         version="0.0.0"/>
-
-</feature>
diff --git a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport_sdk.feature/license.html b/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport_sdk.feature/license.html
deleted file mode 100644
index a450af9..0000000
--- a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport_sdk.feature/license.html
+++ /dev/null
@@ -1,97 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3c.org/TR/1999/REC-html401-19991224/loose.dtd">
-<!-- saved from url=(0044)http://www.eclipse.org/legal/epl/notice.html -->
-<HTML><HEAD><TITLE>Eclipse.org Software User Agreement</TITLE>
-<META http-equiv=Content-Type content="text/html; charset=iso-8859-1">
-<META content="MSHTML 6.00.2800.1479" name=GENERATOR></HEAD>
-<BODY lang=EN-US vLink=purple link=blue>
-<H2>Eclipse Foundation Software User Agreement</H2>
-
-<H3>Usage Of Content</H3>
-<P>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION 
-AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS (COLLECTIVELY "CONTENT"). USE OF 
-THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE 
-TERMS AND CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED 
-BELOW. BY USING THE CONTENT, YOU AGREE THAT YOUR USE OF THE CONTENT IS GOVERNED 
-BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE 
-AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW. IF YOU DO NOT AGREE TO THE 
-TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND CONDITIONS OF ANY 
-APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU 
-MAY NOT USE THE CONTENT.</P>
-<H3>Applicable Licenses</H3>
-<P>Unless otherwise indicated, all Content made available by the Eclipse 
-Foundation is provided to you under the terms and conditions of the Eclipse 
-Public License Version 1.0 ("EPL"). A copy of the EPL is provided with this 
-Content and is also available at <A 
-href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</A>. 
-For purposes of the EPL, "Program" will mean the Content.</P>
-<P>Content includes, but is not limited to, source code, object code, 
-documentation and other files maintained in the Eclipse.org CVS repository 
-("Repository") in CVS modules ("Modules") and made available as downloadable 
-archives ("Downloads").</P>
-<P>Content may be apportioned into plug-ins ("Plug-ins"), plug-in fragments 
-("Fragments"), and features ("Features"). A Feature is a bundle of one or more 
-Plug-ins and/or Fragments and associated material. Files named "feature.xml" may 
-contain a list of the names and version numbers of the Plug-ins and/or Fragments 
-associated with a Feature. Plug-ins and Fragments are located in directories 
-named "plugins" and Features are located in directories named "features".</P>
-<P>Features may also include other Features ("Included Features"). Files named 
-"feature.xml" may contain a list of the names and version numbers of Included 
-Features.</P>
-<P>The terms and conditions governing Plug-ins and Fragments should be contained 
-in files named "about.html" ("Abouts"). The terms and conditions governing 
-Features and Included Features should be contained in files named "license.html" 
-("Feature Licenses"). Abouts and Feature Licenses may be located in any 
-directory of a Download or Module including, but not limited to the following 
-locations:</P>
-<UL>
-  <LI>The top-level (root) directory 
-  <LI>Plug-in and Fragment directories 
-  <LI>Subdirectories of the directory named "src" of certain Plug-ins 
-  <LI>Feature directories </LI></UL>
-<P>Note: if a Feature made available by the Eclipse Foundation is installed 
-using the Eclipse Update Manager, you must agree to a license ("Feature Update 
-License") during the installation process. If the Feature contains Included 
-Features, the Feature Update License should either provide you with the terms 
-and conditions governing the Included Features or inform you where you can 
-locate them. Feature Update Licenses may be found in the "license" property of 
-files named "feature.properties". Such Abouts, Feature Licenses and Feature 
-Update Licenses contain the terms and conditions (or references to such terms 
-and conditions) that govern your use of the associated Content in that 
-directory.</P>
-<P>THE ABOUTS, FEATURE LICENSES AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL 
-OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS. SOME OF THESE 
-OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):</P>
-<UL>
-  <LI>Common Public License Version 1.0 (available at <A 
-  href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</A>) 
-
-  <LI>Apache Software License 1.1 (available at <A 
-  href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</A>) 
-
-  <LI>Apache Software License 2.0 (available at <A 
-  href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</A>) 
-
-  <LI>IBM Public License 1.0 (available at <A 
-  href="http://oss.software.ibm.com/developerworks/opensource/license10.html">http://oss.software.ibm.com/developerworks/opensource/license10.html</A>) 
-
-  <LI>Metro Link Public License 1.00 (available at <A 
-  href="http://www.opengroup.org/openmotif/supporters/metrolink/license.html">http://www.opengroup.org/openmotif/supporters/metrolink/license.html</A>) 
-
-  <LI>Mozilla Public License Version 1.1 (available at <A 
-  href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</A>)
-  
-    <li>Common Development and Distribution License (CDDL) Version 1.0 (available at <A 
-  href="http://www.sun.com/cddl/cddl.html">http://www.sun.com/cddl/cddl.html)</A>
-  </LI> 
-  </LI></UL>
-<P>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR 
-TO USE OF THE CONTENT. If no About, Feature License or Feature Update License is 
-provided, please contact the Eclipse Foundation to determine what terms and 
-conditions govern that particular Content.</P>
-<H3>Cryptography</H3>
-<P>Content may contain encryption software. The country in which you are 
-currently may have restrictions on the import, possession, and use, and/or 
-re-export to another country, of encryption software. BEFORE using any 
-encryption software, please check the country's laws, regulations and policies 
-concerning the import, possession, or use, and re-export of encryption software, 
-to see if this is permitted.</P></BODY></HTML>
diff --git a/jsf/features/org.eclipse.jst.webpageeditor.feature/.cvsignore b/jsf/features/org.eclipse.jst.webpageeditor.feature/.cvsignore
deleted file mode 100644
index c14487c..0000000
--- a/jsf/features/org.eclipse.jst.webpageeditor.feature/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-build.xml
diff --git a/jsf/features/org.eclipse.jst.webpageeditor.feature/.project b/jsf/features/org.eclipse.jst.webpageeditor.feature/.project
deleted file mode 100644
index e089155..0000000
--- a/jsf/features/org.eclipse.jst.webpageeditor.feature/.project
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.jst.webpageeditor.feature</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.pde.FeatureBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.FeatureNature</nature>
-	</natures>
-</projectDescription>
diff --git a/jsf/features/org.eclipse.jst.webpageeditor.feature/build.properties b/jsf/features/org.eclipse.jst.webpageeditor.feature/build.properties
deleted file mode 100644
index 4469d34..0000000
--- a/jsf/features/org.eclipse.jst.webpageeditor.feature/build.properties
+++ /dev/null
@@ -1,15 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-bin.includes = feature.xml,\
-               license.html,\
-               feature.properties,\
-               epl-v10.html,\
-               eclipse_update_120.jpg
diff --git a/jsf/features/org.eclipse.jst.webpageeditor.feature/eclipse_update_120.jpg b/jsf/features/org.eclipse.jst.webpageeditor.feature/eclipse_update_120.jpg
deleted file mode 100644
index bfdf708..0000000
--- a/jsf/features/org.eclipse.jst.webpageeditor.feature/eclipse_update_120.jpg
+++ /dev/null
Binary files differ
diff --git a/jsf/features/org.eclipse.jst.webpageeditor.feature/epl-v10.html b/jsf/features/org.eclipse.jst.webpageeditor.feature/epl-v10.html
deleted file mode 100644
index ed4b196..0000000
--- a/jsf/features/org.eclipse.jst.webpageeditor.feature/epl-v10.html
+++ /dev/null
@@ -1,328 +0,0 @@
-<html xmlns:o="urn:schemas-microsoft-com:office:office"
-xmlns:w="urn:schemas-microsoft-com:office:word"
-xmlns="http://www.w3.org/TR/REC-html40">
-
-<head>
-<meta http-equiv=Content-Type content="text/html; charset=windows-1252">
-<meta name=ProgId content=Word.Document>
-<meta name=Generator content="Microsoft Word 9">
-<meta name=Originator content="Microsoft Word 9">
-<link rel=File-List
-href="./Eclipse%20EPL%202003_11_10%20Final_files/filelist.xml">
-<title>Eclipse Public License - Version 1.0</title>
-<!--[if gte mso 9]><xml>
- <o:DocumentProperties>
-  <o:Revision>2</o:Revision>
-  <o:TotalTime>3</o:TotalTime>
-  <o:Created>2004-03-05T23:03:00Z</o:Created>
-  <o:LastSaved>2004-03-05T23:03:00Z</o:LastSaved>
-  <o:Pages>4</o:Pages>
-  <o:Words>1626</o:Words>
-  <o:Characters>9270</o:Characters>
-   <o:Lines>77</o:Lines>
-  <o:Paragraphs>18</o:Paragraphs>
-  <o:CharactersWithSpaces>11384</o:CharactersWithSpaces>
-  <o:Version>9.4402</o:Version>
- </o:DocumentProperties>
-</xml><![endif]--><!--[if gte mso 9]><xml>
- <w:WordDocument>
-  <w:TrackRevisions/>
- </w:WordDocument>
-</xml><![endif]-->
-<style>
-<!--
- /* Font Definitions */
-@font-face
-	{font-family:Tahoma;
-	panose-1:2 11 6 4 3 5 4 4 2 4;
-	mso-font-charset:0;
-	mso-generic-font-family:swiss;
-	mso-font-pitch:variable;
-	mso-font-signature:553679495 -2147483648 8 0 66047 0;}
- /* Style Definitions */
-p.MsoNormal, li.MsoNormal, div.MsoNormal
-	{mso-style-parent:"";
-	margin:0in;
-	margin-bottom:.0001pt;
-	mso-pagination:widow-orphan;
-	font-size:12.0pt;
-	font-family:"Times New Roman";
-	mso-fareast-font-family:"Times New Roman";}
-p
-	{margin-right:0in;
-	mso-margin-top-alt:auto;
-	mso-margin-bottom-alt:auto;
-	margin-left:0in;
-	mso-pagination:widow-orphan;
-	font-size:12.0pt;
-	font-family:"Times New Roman";
-	mso-fareast-font-family:"Times New Roman";}
-p.BalloonText, li.BalloonText, div.BalloonText
-	{mso-style-name:"Balloon Text";
-	margin:0in;
-	margin-bottom:.0001pt;
-	mso-pagination:widow-orphan;
-	font-size:8.0pt;
-	font-family:Tahoma;
-	mso-fareast-font-family:"Times New Roman";}
-@page Section1
-	{size:8.5in 11.0in;
-	margin:1.0in 1.25in 1.0in 1.25in;
-	mso-header-margin:.5in;
-	mso-footer-margin:.5in;
-	mso-paper-source:0;}
-div.Section1
-	{page:Section1;}
--->
-</style>
-</head>
-
-<body lang=EN-US style='tab-interval:.5in'>
-
-<div class=Section1>
-
-<p align=center style='text-align:center'><b>Eclipse Public License - v 1.0</b>
-</p>
-
-<p><span style='font-size:10.0pt'>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER
-THE TERMS OF THIS ECLIPSE PUBLIC LICENSE (&quot;AGREEMENT&quot;). ANY USE,
-REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE
-OF THIS AGREEMENT.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>1. DEFINITIONS</span></b> </p>
-
-<p><span style='font-size:10.0pt'>&quot;Contribution&quot; means:</span> </p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-in the case of the initial Contributor, the initial code and documentation
-distributed under this Agreement, and<br clear=left>
-b) in the case of each subsequent Contributor:</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>i)
-changes to the Program, and</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>ii)
-additions to the Program;</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>where
-such changes and/or additions to the Program originate from and are distributed
-by that particular Contributor. A Contribution 'originates' from a Contributor
-if it was added to the Program by such Contributor itself or anyone acting on
-such Contributor's behalf. Contributions do not include additions to the
-Program which: (i) are separate modules of software distributed in conjunction
-with the Program under their own license agreement, and (ii) are not derivative
-works of the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>&quot;Contributor&quot; means any person or
-entity that distributes the Program.</span> </p>
-
-<p><span style='font-size:10.0pt'>&quot;Licensed Patents &quot; mean patent
-claims licensable by a Contributor which are necessarily infringed by the use
-or sale of its Contribution alone or when combined with the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>&quot;Program&quot; means the Contributions
-distributed in accordance with this Agreement.</span> </p>
-
-<p><span style='font-size:10.0pt'>&quot;Recipient&quot; means anyone who
-receives the Program under this Agreement, including all Contributors.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>2. GRANT OF RIGHTS</span></b> </p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-Subject to the terms of this Agreement, each Contributor hereby grants Recipient
-a non-exclusive, worldwide, royalty-free copyright license to<span
-style='color:red'> </span>reproduce, prepare derivative works of, publicly
-display, publicly perform, distribute and sublicense the Contribution of such
-Contributor, if any, and such derivative works, in source code and object code
-form.</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b)
-Subject to the terms of this Agreement, each Contributor hereby grants
-Recipient a non-exclusive, worldwide,<span style='color:green'> </span>royalty-free
-patent license under Licensed Patents to make, use, sell, offer to sell, import
-and otherwise transfer the Contribution of such Contributor, if any, in source
-code and object code form. This patent license shall apply to the combination
-of the Contribution and the Program if, at the time the Contribution is added
-by the Contributor, such addition of the Contribution causes such combination
-to be covered by the Licensed Patents. The patent license shall not apply to
-any other combinations which include the Contribution. No hardware per se is
-licensed hereunder. </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>c)
-Recipient understands that although each Contributor grants the licenses to its
-Contributions set forth herein, no assurances are provided by any Contributor
-that the Program does not infringe the patent or other intellectual property
-rights of any other entity. Each Contributor disclaims any liability to Recipient
-for claims brought by any other entity based on infringement of intellectual
-property rights or otherwise. As a condition to exercising the rights and
-licenses granted hereunder, each Recipient hereby assumes sole responsibility
-to secure any other intellectual property rights needed, if any. For example,
-if a third party patent license is required to allow Recipient to distribute
-the Program, it is Recipient's responsibility to acquire that license before
-distributing the Program.</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>d)
-Each Contributor represents that to its knowledge it has sufficient copyright
-rights in its Contribution, if any, to grant the copyright license set forth in
-this Agreement. </span></p>
-
-<p><b><span style='font-size:10.0pt'>3. REQUIREMENTS</span></b> </p>
-
-<p><span style='font-size:10.0pt'>A Contributor may choose to distribute the
-Program in object code form under its own license agreement, provided that:</span>
-</p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-it complies with the terms and conditions of this Agreement; and</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b)
-its license agreement:</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>i)
-effectively disclaims on behalf of all Contributors all warranties and
-conditions, express and implied, including warranties or conditions of title
-and non-infringement, and implied warranties or conditions of merchantability
-and fitness for a particular purpose; </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>ii)
-effectively excludes on behalf of all Contributors all liability for damages,
-including direct, indirect, special, incidental and consequential damages, such
-as lost profits; </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>iii)
-states that any provisions which differ from this Agreement are offered by that
-Contributor alone and not by any other party; and</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>iv)
-states that source code for the Program is available from such Contributor, and
-informs licensees how to obtain it in a reasonable manner on or through a
-medium customarily used for software exchange.<span style='color:blue'> </span></span></p>
-
-<p><span style='font-size:10.0pt'>When the Program is made available in source
-code form:</span> </p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-it must be made available under this Agreement; and </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b) a
-copy of this Agreement must be included with each copy of the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>Contributors may not remove or alter any
-copyright notices contained within the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>Each Contributor must identify itself as the
-originator of its Contribution, if any, in a manner that reasonably allows
-subsequent Recipients to identify the originator of the Contribution. </span></p>
-
-<p><b><span style='font-size:10.0pt'>4. COMMERCIAL DISTRIBUTION</span></b> </p>
-
-<p><span style='font-size:10.0pt'>Commercial distributors of software may
-accept certain responsibilities with respect to end users, business partners
-and the like. While this license is intended to facilitate the commercial use
-of the Program, the Contributor who includes the Program in a commercial
-product offering should do so in a manner which does not create potential
-liability for other Contributors. Therefore, if a Contributor includes the
-Program in a commercial product offering, such Contributor (&quot;Commercial
-Contributor&quot;) hereby agrees to defend and indemnify every other
-Contributor (&quot;Indemnified Contributor&quot;) against any losses, damages and
-costs (collectively &quot;Losses&quot;) arising from claims, lawsuits and other
-legal actions brought by a third party against the Indemnified Contributor to
-the extent caused by the acts or omissions of such Commercial Contributor in
-connection with its distribution of the Program in a commercial product
-offering. The obligations in this section do not apply to any claims or Losses
-relating to any actual or alleged intellectual property infringement. In order
-to qualify, an Indemnified Contributor must: a) promptly notify the Commercial
-Contributor in writing of such claim, and b) allow the Commercial Contributor
-to control, and cooperate with the Commercial Contributor in, the defense and
-any related settlement negotiations. The Indemnified Contributor may participate
-in any such claim at its own expense.</span> </p>
-
-<p><span style='font-size:10.0pt'>For example, a Contributor might include the
-Program in a commercial product offering, Product X. That Contributor is then a
-Commercial Contributor. If that Commercial Contributor then makes performance
-claims, or offers warranties related to Product X, those performance claims and
-warranties are such Commercial Contributor's responsibility alone. Under this
-section, the Commercial Contributor would have to defend claims against the
-other Contributors related to those performance claims and warranties, and if a
-court requires any other Contributor to pay any damages as a result, the
-Commercial Contributor must pay those damages.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>5. NO WARRANTY</span></b> </p>
-
-<p><span style='font-size:10.0pt'>EXCEPT AS EXPRESSLY SET FORTH IN THIS
-AGREEMENT, THE PROGRAM IS PROVIDED ON AN &quot;AS IS&quot; 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. Each Recipient is solely
-responsible for determining the appropriateness of using and distributing the
-Program and assumes all risks associated with its exercise of rights under this
-Agreement , including but not limited to the risks and costs of program errors,
-compliance with applicable laws, damage to or loss of data, programs or
-equipment, and unavailability or interruption of operations. </span></p>
-
-<p><b><span style='font-size:10.0pt'>6. DISCLAIMER OF LIABILITY</span></b> </p>
-
-<p><span style='font-size:10.0pt'>EXCEPT AS EXPRESSLY SET FORTH IN THIS
-AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY
-OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF
-THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF
-THE POSSIBILITY OF SUCH DAMAGES.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>7. GENERAL</span></b> </p>
-
-<p><span style='font-size:10.0pt'>If any provision of this Agreement is invalid
-or unenforceable under applicable law, it shall not affect the validity or
-enforceability of the remainder of the terms of this Agreement, and without
-further action by the parties hereto, such provision shall be reformed to the
-minimum extent necessary to make such provision valid and enforceable.</span> </p>
-
-<p><span style='font-size:10.0pt'>If Recipient institutes patent litigation
-against any entity (including a cross-claim or counterclaim in a lawsuit)
-alleging that the Program itself (excluding combinations of the Program with
-other software or hardware) infringes such Recipient's patent(s), then such
-Recipient's rights granted under Section 2(b) shall terminate as of the date
-such litigation is filed. </span></p>
-
-<p><span style='font-size:10.0pt'>All Recipient's rights under this Agreement
-shall terminate if it fails to comply with any of the material terms or
-conditions of this Agreement and does not cure such failure in a reasonable
-period of time after becoming aware of such noncompliance. If all Recipient's
-rights under this Agreement terminate, Recipient agrees to cease use and
-distribution of the Program as soon as reasonably practicable. However,
-Recipient's obligations under this Agreement and any licenses granted by
-Recipient relating to the Program shall continue and survive. </span></p>
-
-<p><span style='font-size:10.0pt'>Everyone is permitted to copy and distribute
-copies of this Agreement, but in order to avoid inconsistency the Agreement is
-copyrighted and may only be modified in the following manner. The Agreement
-Steward reserves the right to publish new versions (including revisions) of
-this Agreement from time to time. No one other than the Agreement Steward has
-the right to modify this Agreement. The Eclipse Foundation is the initial
-Agreement Steward. The Eclipse Foundation may assign the responsibility to
-serve as the Agreement Steward to a suitable separate entity. Each new version
-of the Agreement will be given a distinguishing version number. The Program
-(including Contributions) may always be distributed subject to the version of
-the Agreement under which it was received. In addition, after a new version of
-the Agreement is published, Contributor may elect to distribute the Program
-(including its Contributions) under the new version. Except as expressly stated
-in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to
-the intellectual property of any Contributor under this Agreement, whether
-expressly, by implication, estoppel or otherwise. All rights in the Program not
-expressly granted under this Agreement are reserved.</span> </p>
-
-<p><span style='font-size:10.0pt'>This Agreement is governed by the laws of the
-State of New York and the intellectual property laws of the United States of
-America. No party to this Agreement will bring a legal action under this
-Agreement more than one year after the cause of action arose. Each party waives
-its rights to a jury trial in any resulting litigation.</span> </p>
-
-<p class=MsoNormal><![if !supportEmptyParas]>&nbsp;<![endif]><o:p></o:p></p>
-
-</div>
-
-</body>
-
-</html>
\ No newline at end of file
diff --git a/jsf/features/org.eclipse.jst.webpageeditor.feature/feature.properties b/jsf/features/org.eclipse.jst.webpageeditor.feature/feature.properties
deleted file mode 100644
index 6880cac..0000000
--- a/jsf/features/org.eclipse.jst.webpageeditor.feature/feature.properties
+++ /dev/null
@@ -1,168 +0,0 @@
-###############################################################################
-# Copyright (c) 2005, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-# feature.properties
-# contains externalized strings for feature.xml
-# "%foo" in feature.xml corresponds to the key "foo" in this file
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# This file should be translated.
-
-# "featureName" property - name of the feature
-featureName=Web Page Editor (Optional)
-
-# "providerName" property - name of the company that provides the feature
-providerName=Eclipse.org
-
-
-# "description" property - description of the feature
-description=Web Page Editor (Optional)
-
-# "copyright" property - text of the "Feature Update Copyright"
-copyright=\
-Copyright (c) 2007 Oracle Corporation.\
-All rights reserved. This program and the accompanying materials\
-are made available under the terms of the Eclipse Public License v1.0\
-which accompanies this distribution, and is available at\
-http://www.eclipse.org/legal/epl-v10.html\
-\n\
-Contributors:\n\
-    Oracle Corporation - initial API and implementation\n
-################ end of copyright property ####################################
-
-# "licenseURL" property - URL of the "Feature License"
-# do not translate value - just change to point to a locale-specific HTML page
-licenseURL=license.html
-
-# "license" property - text of the "Feature Update License"
-# should be plain text version of license agreement pointed to be "licenseURL"
-license=\
-Eclipse Foundation Software User Agreement\n\
-April 14, 2010\n\
-\n\
-Usage Of Content\n\
-\n\
-THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR\n\
-OTHER MATERIALS FOR OPEN SOURCE PROJECTS (COLLECTIVELY "CONTENT").\n\
-USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS\n\
-AGREEMENT AND/OR THE TERMS AND CONDITIONS OF LICENSE AGREEMENTS OR\n\
-NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU\n\
-AGREE THAT YOUR USE OF THE CONTENT IS GOVERNED BY THIS AGREEMENT\n\
-AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS\n\
-OR NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE\n\
-TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND CONDITIONS\n\
-OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED\n\
-BELOW, THEN YOU MAY NOT USE THE CONTENT.\n\
-\n\
-Applicable Licenses\n\
-\n\
-Unless otherwise indicated, all Content made available by the\n\
-Eclipse Foundation is provided to you under the terms and conditions of\n\
-the Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is\n\
-provided with this Content and is also available at http://www.eclipse.org/legal/epl-v10.html.\n\
-For purposes of the EPL, "Program" will mean the Content.\n\
-\n\
-Content includes, but is not limited to, source code, object code,\n\
-documentation and other files maintained in the Eclipse Foundation source code\n\
-repository ("Repository") in software modules ("Modules") and made available\n\
-as downloadable archives ("Downloads").\n\
-\n\
-       - Content may be structured and packaged into modules to facilitate delivering,\n\
-         extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"),\n\
-         plug-in fragments ("Fragments"), and features ("Features").\n\
-       - Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java(TM) ARchive)\n\
-         in a directory named "plugins".\n\
-       - A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.\n\
-         Each Feature may be packaged as a sub-directory in a directory named "features".\n\
-         Within a Feature, files named "feature.xml" may contain a list of the names and version\n\
-         numbers of the Plug-ins and/or Fragments associated with that Feature.\n\
-       - Features may also include other Features ("Included Features"). Within a Feature, files\n\
-         named "feature.xml" may contain a list of the names and version numbers of Included Features.\n\
-\n\
-The terms and conditions governing Plug-ins and Fragments should be\n\
-contained in files named "about.html" ("Abouts"). The terms and\n\
-conditions governing Features and Included Features should be contained\n\
-in files named "license.html" ("Feature Licenses"). Abouts and Feature\n\
-Licenses may be located in any directory of a Download or Module\n\
-including, but not limited to the following locations:\n\
-\n\
-       - The top-level (root) directory\n\
-       - Plug-in and Fragment directories\n\
-       - Inside Plug-ins and Fragments packaged as JARs\n\
-       - Sub-directories of the directory named "src" of certain Plug-ins\n\
-       - Feature directories\n\
-\n\
-Note: if a Feature made available by the Eclipse Foundation is installed using the\n\
-Provisioning Technology (as defined below), you must agree to a license ("Feature \n\
-Update License") during the installation process. If the Feature contains\n\
-Included Features, the Feature Update License should either provide you\n\
-with the terms and conditions governing the Included Features or inform\n\
-you where you can locate them. Feature Update Licenses may be found in\n\
-the "license" property of files named "feature.properties" found within a Feature.\n\
-Such Abouts, Feature Licenses, and Feature Update Licenses contain the\n\
-terms and conditions (or references to such terms and conditions) that\n\
-govern your use of the associated Content in that directory.\n\
-\n\
-THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER\n\
-TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.\n\
-SOME OF THESE OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):\n\
-\n\
-       - Common Public License Version 1.0 (available at http://www.eclipse.org/legal/cpl-v10.html)\n\
-       - Apache Software License 1.1 (available at http://www.apache.org/licenses/LICENSE)\n\
-       - Apache Software License 2.0 (available at http://www.apache.org/licenses/LICENSE-2.0)\n\
-       - Metro Link Public License 1.00 (available at http://www.opengroup.org/openmotif/supporters/metrolink/license.html)\n\
-       - Mozilla Public License Version 1.1 (available at http://www.mozilla.org/MPL/MPL-1.1.html)\n\
-\n\
-IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR\n\
-TO USE OF THE CONTENT. If no About, Feature License, or Feature Update License\n\
-is provided, please contact the Eclipse Foundation to determine what terms and conditions\n\
-govern that particular Content.\n\
-\n\
-\n\Use of Provisioning Technology\n\
-\n\
-The Eclipse Foundation makes available provisioning software, examples of which include,\n\
-but are not limited to, p2 and the Eclipse Update Manager ("Provisioning Technology") for\n\
-the purpose of allowing users to install software, documentation, information and/or\n\
-other materials (collectively "Installable Software"). This capability is provided with\n\
-the intent of allowing such users to install, extend and update Eclipse-based products.\n\
-Information about packaging Installable Software is available at\n\
-http://eclipse.org/equinox/p2/repository_packaging.html ("Specification").\n\
-\n\
-You may use Provisioning Technology to allow other parties to install Installable Software.\n\
-You shall be responsible for enabling the applicable license agreements relating to the\n\
-Installable Software to be presented to, and accepted by, the users of the Provisioning Technology\n\
-in accordance with the Specification. By using Provisioning Technology in such a manner and\n\
-making it available in accordance with the Specification, you further acknowledge your\n\
-agreement to, and the acquisition of all necessary rights to permit the following:\n\
-\n\
-       1. A series of actions may occur ("Provisioning Process") in which a user may execute\n\
-          the Provisioning Technology on a machine ("Target Machine") with the intent of installing,\n\
-          extending or updating the functionality of an Eclipse-based product.\n\
-       2. During the Provisioning Process, the Provisioning Technology may cause third party\n\
-          Installable Software or a portion thereof to be accessed and copied to the Target Machine.\n\
-       3. Pursuant to the Specification, you will provide to the user the terms and conditions that\n\
-          govern the use of the Installable Software ("Installable Software Agreement") and such\n\
-          Installable Software Agreement shall be accessed from the Target Machine in accordance\n\
-          with the Specification. Such Installable Software Agreement must inform the user of the\n\
-          terms and conditions that govern the Installable Software and must solicit acceptance by\n\
-          the end user in the manner prescribed in such Installable Software Agreement. Upon such\n\
-          indication of agreement by the user, the provisioning Technology will complete installation\n\
-          of the Installable Software.\n\
-\n\
-Cryptography\n\
-\n\
-Content may contain encryption software. The country in which you are\n\
-currently may have restrictions on the import, possession, and use,\n\
-and/or re-export to another country, of encryption software. BEFORE\n\
-using any encryption software, please check the country's laws,\n\
-regulations and policies concerning the import, possession, or use, and\n\
-re-export of encryption software, to see if this is permitted.\n\
-\n\
-Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.\n
-########### end of license property ##########################################
diff --git a/jsf/features/org.eclipse.jst.webpageeditor.feature/feature.xml b/jsf/features/org.eclipse.jst.webpageeditor.feature/feature.xml
deleted file mode 100644
index ba952ec..0000000
--- a/jsf/features/org.eclipse.jst.webpageeditor.feature/feature.xml
+++ /dev/null
@@ -1,43 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<feature
-      id="org.eclipse.jst.webpageeditor.feature"
-      label="%featureName"
-      version="2.3.0.qualifier"
-      provider-name="%providerName"
-      image="eclipse_update_120.jpg">
-
-   <description>
-      %description
-   </description>
-
-   <copyright>
-      %copyright
-   </copyright>
-
-   <license url="license.html">
-      %license
-   </license>
-
-
-   <plugin
-         id="org.eclipse.jst.pagedesigner"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.jst.pagedesigner.jsf.ui"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.jst.pagedesigner.jsp.core"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-</feature>
diff --git a/jsf/features/org.eclipse.jst.webpageeditor.feature/license.html b/jsf/features/org.eclipse.jst.webpageeditor.feature/license.html
deleted file mode 100644
index c184ca3..0000000
--- a/jsf/features/org.eclipse.jst.webpageeditor.feature/license.html
+++ /dev/null
@@ -1,107 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1" ?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
-<title>Eclipse Foundation Software User Agreement</title>
-</head>
-
-<body lang="EN-US">
-<h2>Eclipse Foundation Software User Agreement</h2>
-<p>April 14, 2010</p>
-
-<h3>Usage Of Content</h3>
-
-<p>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS
-   (COLLECTIVELY &quot;CONTENT&quot;).  USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND
-   CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU AGREE THAT YOUR USE
-   OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR
-   NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND
-   CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.</p>
-
-<h3>Applicable Licenses</h3>
-
-<p>Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0
-   (&quot;EPL&quot;).  A copy of the EPL is provided with this Content and is also available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-   For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse Foundation source code
-   repository (&quot;Repository&quot;) in software modules (&quot;Modules&quot;) and made available as downloadable archives (&quot;Downloads&quot;).</p>
-
-<ul>
-       <li>Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content.  Typical modules may include plug-ins (&quot;Plug-ins&quot;), plug-in fragments (&quot;Fragments&quot;), and features (&quot;Features&quot;).</li>
-       <li>Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java&trade; ARchive) in a directory named &quot;plugins&quot;.</li>
-       <li>A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.  Each Feature may be packaged as a sub-directory in a directory named &quot;features&quot;.  Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of the Plug-ins
-      and/or Fragments associated with that Feature.</li>
-       <li>Features may also include other Features (&quot;Included Features&quot;). Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of Included Features.</li>
-</ul>
-
-<p>The terms and conditions governing Plug-ins and Fragments should be contained in files named &quot;about.html&quot; (&quot;Abouts&quot;). The terms and conditions governing Features and
-Included Features should be contained in files named &quot;license.html&quot; (&quot;Feature Licenses&quot;).  Abouts and Feature Licenses may be located in any directory of a Download or Module
-including, but not limited to the following locations:</p>
-
-<ul>
-       <li>The top-level (root) directory</li>
-       <li>Plug-in and Fragment directories</li>
-       <li>Inside Plug-ins and Fragments packaged as JARs</li>
-       <li>Sub-directories of the directory named &quot;src&quot; of certain Plug-ins</li>
-       <li>Feature directories</li>
-</ul>
-
-<p>Note: if a Feature made available by the Eclipse Foundation is installed using the Provisioning Technology (as defined below), you must agree to a license (&quot;Feature Update License&quot;) during the
-installation process.  If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or
-inform you where you can locate them.  Feature Update Licenses may be found in the &quot;license&quot; property of files named &quot;feature.properties&quot; found within a Feature.
-Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in
-that directory.</p>
-
-<p>THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.  SOME OF THESE
-OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):</p>
-
-<ul>
-       <li>Common Public License Version 1.0 (available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>)</li>
-       <li>Apache Software License 1.1 (available at <a href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</a>)</li>
-       <li>Apache Software License 2.0 (available at <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>)</li>
-       <li>Metro Link Public License 1.00 (available at <a href="http://www.opengroup.org/openmotif/supporters/metrolink/license.html">http://www.opengroup.org/openmotif/supporters/metrolink/license.html</a>)</li>
-       <li>Mozilla Public License Version 1.1 (available at <a href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</a>)</li>
-</ul>
-
-<p>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT.  If no About, Feature License, or Feature Update License is provided, please
-contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.</p>
-
-
-<h3>Use of Provisioning Technology</h3>
-
-<p>The Eclipse Foundation makes available provisioning software, examples of which include, but are not limited to, p2 and the Eclipse
-   Update Manager (&quot;Provisioning Technology&quot;) for the purpose of allowing users to install software, documentation, information and/or
-   other materials (collectively &quot;Installable Software&quot;). This capability is provided with the intent of allowing such users to
-   install, extend and update Eclipse-based products. Information about packaging Installable Software is available at <a
-       href="http://eclipse.org/equinox/p2/repository_packaging.html">http://eclipse.org/equinox/p2/repository_packaging.html</a>
-   (&quot;Specification&quot;).</p>
-
-<p>You may use Provisioning Technology to allow other parties to install Installable Software. You shall be responsible for enabling the
-   applicable license agreements relating to the Installable Software to be presented to, and accepted by, the users of the Provisioning Technology
-   in accordance with the Specification. By using Provisioning Technology in such a manner and making it available in accordance with the
-   Specification, you further acknowledge your agreement to, and the acquisition of all necessary rights to permit the following:</p>
-
-<ol>
-       <li>A series of actions may occur (&quot;Provisioning Process&quot;) in which a user may execute the Provisioning Technology
-       on a machine (&quot;Target Machine&quot;) with the intent of installing, extending or updating the functionality of an Eclipse-based
-       product.</li>
-       <li>During the Provisioning Process, the Provisioning Technology may cause third party Installable Software or a portion thereof to be
-       accessed and copied to the Target Machine.</li>
-       <li>Pursuant to the Specification, you will provide to the user the terms and conditions that govern the use of the Installable
-       Software (&quot;Installable Software Agreement&quot;) and such Installable Software Agreement shall be accessed from the Target
-       Machine in accordance with the Specification. Such Installable Software Agreement must inform the user of the terms and conditions that govern
-       the Installable Software and must solicit acceptance by the end user in the manner prescribed in such Installable Software Agreement. Upon such
-       indication of agreement by the user, the provisioning Technology will complete installation of the Installable Software.</li>
-</ol>
-
-<h3>Cryptography</h3>
-
-<p>Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to
-   another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import,
-   possession, or use, and re-export of encryption software, to see if this is permitted.</p>
-
-<p><small>Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.</small></p>
-</body>
-</html>
diff --git a/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplateBundle/about.html b/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplateBundle/about.html
deleted file mode 100644
index fe81d46..0000000
--- a/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplateBundle/about.html
+++ /dev/null
@@ -1,27 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<head>
-<title>About</title>
-<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
-
-<P>June, 2008</P>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise indicated below, the Content is provided to you under the terms and conditions of the
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content.</p>
-
-<h3>Source Code</h3>
-<p>This plug-in contains source code zip files (&quot;Source Zips&quot;) that correspond to binary content in other plug-ins. These Source Zips may be distributed under different license
-agreements and/or notices. Details about these license agreements and notices are contained in &quot;about.html&quot; files (&quot;Abouts&quot;) located in sub-directories in the
-src/ directory of this plug-in. Such Abouts govern your use of the Source Zips in that directory, not the EPL.</p>
-
-</body>
-</html>
diff --git a/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplateBundle/about.ini b/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplateBundle/about.ini
deleted file mode 100644
index 2dee36a..0000000
--- a/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplateBundle/about.ini
+++ /dev/null
@@ -1,31 +0,0 @@
-# about.ini
-# contains information about a feature
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# "%key" are externalized strings defined in about.properties
-# This file does not need to be translated.
-
-# Property "aboutText" contains blurb for "About" dialog (translated)
-aboutText=%blurb
-
-# Property "windowImage" contains path to window icon (16x16)
-# needed for primary features only
-
-# Property "featureImage" contains path to feature image (32x32)
-featureImage=eclipse32.gif
-
-# Property "aboutImage" contains path to product image (500x330 or 115x164)
-# needed for primary features only
-
-# Property "appName" contains name of the application (not translated)
-# needed for primary features only
-
-# Property "welcomePage" contains path to welcome page (special XML-based format)
-# optional
-
-# Property "welcomePerspective" contains the id of the perspective in which the
-# welcome page is to be opened.
-# optional
-
-
-
-
diff --git a/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplateBundle/about.mappings b/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplateBundle/about.mappings
deleted file mode 100644
index a28390a..0000000
--- a/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplateBundle/about.mappings
+++ /dev/null
@@ -1,6 +0,0 @@
-# about.mappings
-# contains fill-ins for about.properties
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# This file does not need to be translated.
-
-0=@build@
diff --git a/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplateBundle/about.properties b/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplateBundle/about.properties
deleted file mode 100644
index e3cbbc3..0000000
--- a/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplateBundle/about.properties
+++ /dev/null
@@ -1,27 +0,0 @@
-###############################################################################
-# Copyright (c) 2005, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#    Gerry Kessler - initial API and implementation
-###############################################################################
-# This file should be translated.
-# about.properties
-# contains externalized strings for about.ini
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# fill-ins are supplied by about.mappings
-# This file should be translated.
-#
-# Do not translate any values surrounded by {}
-
-blurb=Web Page Editor Source\n\
-\n\
-Version: {featureVersion}\n\
-Build id: {0}\n\
-\n\
-(c) Copyright Eclipse contributors and others 2007.  All rights reserved.\n\
-Visit http://www.eclipse.org/webtools
-
diff --git a/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplateBundle/build.properties b/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplateBundle/build.properties
deleted file mode 100644
index 43309f0..0000000
--- a/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplateBundle/build.properties
+++ /dev/null
@@ -1,13 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-
-bin.includes = about.html, about.ini, about.mappings, about.properties, eclipse32.gif, plugin.properties, plugin.xml, src/**, META-INF/
-sourcePlugin = true
diff --git a/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplateBundle/eclipse32.gif b/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplateBundle/eclipse32.gif
deleted file mode 100644
index e6ad7cc..0000000
--- a/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplateBundle/eclipse32.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplateBundle/eclipse32.png b/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplateBundle/eclipse32.png
deleted file mode 100644
index 50ae49d..0000000
--- a/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplateBundle/eclipse32.png
+++ /dev/null
Binary files differ
diff --git a/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplateBundle/plugin.properties b/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplateBundle/plugin.properties
deleted file mode 100644
index 46b3449..0000000
--- a/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplateBundle/plugin.properties
+++ /dev/null
@@ -1,20 +0,0 @@
-###############################################################################
-# Copyright (c) 2005, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#    Gerry Kessler - initial API and implementation
-###############################################################################
-# This file should be translated.
-# plugin.properties
-# contains externalized strings for manifest.mf
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# fill-ins are supplied by about.mappings
-# This file should be translated.
-#
-# Do not translate any values surrounded by {}
-pluginName=Web Page Editor Source
-providerName=Eclipse.org
diff --git a/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplateFeature/build.properties b/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplateFeature/build.properties
deleted file mode 100644
index 657ba1b..0000000
--- a/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplateFeature/build.properties
+++ /dev/null
@@ -1,19 +0,0 @@
-###############################################################################
-# Copyright (c) 2005, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#    Gerry Kessler - initial API and implementation
-###############################################################################
-# This file should be NOT be translated.
-bin.includes =\
-epl-v10.html,\
-eclipse_update_120.jpg,\
-feature.xml,\
-feature.properties,\
-license.html
-
-
diff --git a/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplateFeature/eclipse_update_120.jpg b/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplateFeature/eclipse_update_120.jpg
deleted file mode 100644
index bfdf708..0000000
--- a/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplateFeature/eclipse_update_120.jpg
+++ /dev/null
Binary files differ
diff --git a/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplateFeature/epl-v10.html b/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplateFeature/epl-v10.html
deleted file mode 100644
index 022ad29..0000000
--- a/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplateFeature/epl-v10.html
+++ /dev/null
@@ -1,328 +0,0 @@
-<html xmlns:o="urn:schemas-microsoft-com:office:office"
-xmlns:w="urn:schemas-microsoft-com:office:word"
-xmlns="http://www.w3.org/TR/REC-html40">
-
-<head>
-<meta http-equiv=Content-Type content="text/html; charset=windows-1252">
-<meta name=ProgId content=Word.Document>
-<meta name=Generator content="Microsoft Word 9">
-<meta name=Originator content="Microsoft Word 9">
-<link rel=File-List
-href="./Eclipse%20EPL%202003_11_10%20Final_files/filelist.xml">
-<title>Eclipse Public License - Version 1.0</title>
-<!--[if gte mso 9]><xml>
- <o:DocumentProperties>
-  <o:Revision>2</o:Revision>
-  <o:TotalTime>3</o:TotalTime>
-  <o:Created>2004-03-05T23:03:00Z</o:Created>
-  <o:LastSaved>2004-03-05T23:03:00Z</o:LastSaved>
-  <o:Pages>4</o:Pages>
-  <o:Words>1626</o:Words>
-  <o:Characters>9270</o:Characters>
-   <o:Lines>77</o:Lines>
-  <o:Paragraphs>18</o:Paragraphs>
-  <o:CharactersWithSpaces>11384</o:CharactersWithSpaces>
-  <o:Version>9.4402</o:Version>
- </o:DocumentProperties>
-</xml><![endif]--><!--[if gte mso 9]><xml>
- <w:WordDocument>
-  <w:TrackRevisions/>
- </w:WordDocument>
-</xml><![endif]-->
-<style>
-<!--
- /* Font Definitions */
-@font-face
-	{font-family:Tahoma;
-	panose-1:2 11 6 4 3 5 4 4 2 4;
-	mso-font-charset:0;
-	mso-generic-font-family:swiss;
-	mso-font-pitch:variable;
-	mso-font-signature:553679495 -2147483648 8 0 66047 0;}
- /* Style Definitions */
-p.MsoNormal, li.MsoNormal, div.MsoNormal
-	{mso-style-parent:"";
-	margin:0in;
-	margin-bottom:.0001pt;
-	mso-pagination:widow-orphan;
-	font-size:12.0pt;
-	font-family:"Times New Roman";
-	mso-fareast-font-family:"Times New Roman";}
-p
-	{margin-right:0in;
-	mso-margin-top-alt:auto;
-	mso-margin-bottom-alt:auto;
-	margin-left:0in;
-	mso-pagination:widow-orphan;
-	font-size:12.0pt;
-	font-family:"Times New Roman";
-	mso-fareast-font-family:"Times New Roman";}
-p.BalloonText, li.BalloonText, div.BalloonText
-	{mso-style-name:"Balloon Text";
-	margin:0in;
-	margin-bottom:.0001pt;
-	mso-pagination:widow-orphan;
-	font-size:8.0pt;
-	font-family:Tahoma;
-	mso-fareast-font-family:"Times New Roman";}
-@page Section1
-	{size:8.5in 11.0in;
-	margin:1.0in 1.25in 1.0in 1.25in;
-	mso-header-margin:.5in;
-	mso-footer-margin:.5in;
-	mso-paper-source:0;}
-div.Section1
-	{page:Section1;}
--->
-</style>
-</head>
-
-<body lang=EN-US style='tab-interval:.5in'>
-
-<div class=Section1>
-
-<p align=center style='text-align:center'><b>Eclipse Public License - v 1.0</b>
-</p>
-
-<p><span style='font-size:10.0pt'>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER
-THE TERMS OF THIS ECLIPSE PUBLIC LICENSE (&quot;AGREEMENT&quot;). ANY USE,
-REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE
-OF THIS AGREEMENT.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>1. DEFINITIONS</span></b> </p>
-
-<p><span style='font-size:10.0pt'>&quot;Contribution&quot; means:</span> </p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-in the case of the initial Contributor, the initial code and documentation
-distributed under this Agreement, and<br clear=left>
-b) in the case of each subsequent Contributor:</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>i)
-changes to the Program, and</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>ii)
-additions to the Program;</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>where
-such changes and/or additions to the Program originate from and are distributed
-by that particular Contributor. A Contribution 'originates' from a Contributor
-if it was added to the Program by such Contributor itself or anyone acting on
-such Contributor's behalf. Contributions do not include additions to the
-Program which: (i) are separate modules of software distributed in conjunction
-with the Program under their own license agreement, and (ii) are not derivative
-works of the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>&quot;Contributor&quot; means any person or
-entity that distributes the Program.</span> </p>
-
-<p><span style='font-size:10.0pt'>&quot;Licensed Patents &quot; mean patent
-claims licensable by a Contributor which are necessarily infringed by the use
-or sale of its Contribution alone or when combined with the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>&quot;Program&quot; means the Contributions
-distributed in accordance with this Agreement.</span> </p>
-
-<p><span style='font-size:10.0pt'>&quot;Recipient&quot; means anyone who
-receives the Program under this Agreement, including all Contributors.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>2. GRANT OF RIGHTS</span></b> </p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-Subject to the terms of this Agreement, each Contributor hereby grants Recipient
-a non-exclusive, worldwide, royalty-free copyright license to<span
-style='color:red'> </span>reproduce, prepare derivative works of, publicly
-display, publicly perform, distribute and sublicense the Contribution of such
-Contributor, if any, and such derivative works, in source code and object code
-form.</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b)
-Subject to the terms of this Agreement, each Contributor hereby grants
-Recipient a non-exclusive, worldwide,<span style='color:green'> </span>royalty-free
-patent license under Licensed Patents to make, use, sell, offer to sell, import
-and otherwise transfer the Contribution of such Contributor, if any, in source
-code and object code form. This patent license shall apply to the combination
-of the Contribution and the Program if, at the time the Contribution is added
-by the Contributor, such addition of the Contribution causes such combination
-to be covered by the Licensed Patents. The patent license shall not apply to
-any other combinations which include the Contribution. No hardware per se is
-licensed hereunder. </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>c)
-Recipient understands that although each Contributor grants the licenses to its
-Contributions set forth herein, no assurances are provided by any Contributor
-that the Program does not infringe the patent or other intellectual property
-rights of any other entity. Each Contributor disclaims any liability to Recipient
-for claims brought by any other entity based on infringement of intellectual
-property rights or otherwise. As a condition to exercising the rights and
-licenses granted hereunder, each Recipient hereby assumes sole responsibility
-to secure any other intellectual property rights needed, if any. For example,
-if a third party patent license is required to allow Recipient to distribute
-the Program, it is Recipient's responsibility to acquire that license before
-distributing the Program.</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>d)
-Each Contributor represents that to its knowledge it has sufficient copyright
-rights in its Contribution, if any, to grant the copyright license set forth in
-this Agreement. </span></p>
-
-<p><b><span style='font-size:10.0pt'>3. REQUIREMENTS</span></b> </p>
-
-<p><span style='font-size:10.0pt'>A Contributor may choose to distribute the
-Program in object code form under its own license agreement, provided that:</span>
-</p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-it complies with the terms and conditions of this Agreement; and</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b)
-its license agreement:</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>i)
-effectively disclaims on behalf of all Contributors all warranties and
-conditions, express and implied, including warranties or conditions of title
-and non-infringement, and implied warranties or conditions of merchantability
-and fitness for a particular purpose; </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>ii)
-effectively excludes on behalf of all Contributors all liability for damages,
-including direct, indirect, special, incidental and consequential damages, such
-as lost profits; </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>iii)
-states that any provisions which differ from this Agreement are offered by that
-Contributor alone and not by any other party; and</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>iv)
-states that source code for the Program is available from such Contributor, and
-informs licensees how to obtain it in a reasonable manner on or through a
-medium customarily used for software exchange.<span style='color:blue'> </span></span></p>
-
-<p><span style='font-size:10.0pt'>When the Program is made available in source
-code form:</span> </p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-it must be made available under this Agreement; and </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b) a
-copy of this Agreement must be included with each copy of the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>Contributors may not remove or alter any
-copyright notices contained within the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>Each Contributor must identify itself as the
-originator of its Contribution, if any, in a manner that reasonably allows
-subsequent Recipients to identify the originator of the Contribution. </span></p>
-
-<p><b><span style='font-size:10.0pt'>4. COMMERCIAL DISTRIBUTION</span></b> </p>
-
-<p><span style='font-size:10.0pt'>Commercial distributors of software may
-accept certain responsibilities with respect to end users, business partners
-and the like. While this license is intended to facilitate the commercial use
-of the Program, the Contributor who includes the Program in a commercial
-product offering should do so in a manner which does not create potential
-liability for other Contributors. Therefore, if a Contributor includes the
-Program in a commercial product offering, such Contributor (&quot;Commercial
-Contributor&quot;) hereby agrees to defend and indemnify every other
-Contributor (&quot;Indemnified Contributor&quot;) against any losses, damages and
-costs (collectively &quot;Losses&quot;) arising from claims, lawsuits and other
-legal actions brought by a third party against the Indemnified Contributor to
-the extent caused by the acts or omissions of such Commercial Contributor in
-connection with its distribution of the Program in a commercial product
-offering. The obligations in this section do not apply to any claims or Losses
-relating to any actual or alleged intellectual property infringement. In order
-to qualify, an Indemnified Contributor must: a) promptly notify the Commercial
-Contributor in writing of such claim, and b) allow the Commercial Contributor
-to control, and cooperate with the Commercial Contributor in, the defense and
-any related settlement negotiations. The Indemnified Contributor may participate
-in any such claim at its own expense.</span> </p>
-
-<p><span style='font-size:10.0pt'>For example, a Contributor might include the
-Program in a commercial product offering, Product X. That Contributor is then a
-Commercial Contributor. If that Commercial Contributor then makes performance
-claims, or offers warranties related to Product X, those performance claims and
-warranties are such Commercial Contributor's responsibility alone. Under this
-section, the Commercial Contributor would have to defend claims against the
-other Contributors related to those performance claims and warranties, and if a
-court requires any other Contributor to pay any damages as a result, the
-Commercial Contributor must pay those damages.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>5. NO WARRANTY</span></b> </p>
-
-<p><span style='font-size:10.0pt'>EXCEPT AS EXPRESSLY SET FORTH IN THIS
-AGREEMENT, THE PROGRAM IS PROVIDED ON AN &quot;AS IS&quot; 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. Each Recipient is solely
-responsible for determining the appropriateness of using and distributing the
-Program and assumes all risks associated with its exercise of rights under this
-Agreement , including but not limited to the risks and costs of program errors,
-compliance with applicable laws, damage to or loss of data, programs or
-equipment, and unavailability or interruption of operations. </span></p>
-
-<p><b><span style='font-size:10.0pt'>6. DISCLAIMER OF LIABILITY</span></b> </p>
-
-<p><span style='font-size:10.0pt'>EXCEPT AS EXPRESSLY SET FORTH IN THIS
-AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY
-OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF
-THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF
-THE POSSIBILITY OF SUCH DAMAGES.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>7. GENERAL</span></b> </p>
-
-<p><span style='font-size:10.0pt'>If any provision of this Agreement is invalid
-or unenforceable under applicable law, it shall not affect the validity or
-enforceability of the remainder of the terms of this Agreement, and without
-further action by the parties hereto, such provision shall be reformed to the
-minimum extent necessary to make such provision valid and enforceable.</span> </p>
-
-<p><span style='font-size:10.0pt'>If Recipient institutes patent litigation
-against any entity (including a cross-claim or counterclaim in a lawsuit)
-alleging that the Program itself (excluding combinations of the Program with
-other software or hardware) infringes such Recipient's patent(s), then such
-Recipient's rights granted under Section 2(b) shall terminate as of the date
-such litigation is filed. </span></p>
-
-<p><span style='font-size:10.0pt'>All Recipient's rights under this Agreement
-shall terminate if it fails to comply with any of the material terms or
-conditions of this Agreement and does not cure such failure in a reasonable
-period of time after becoming aware of such noncompliance. If all Recipient's
-rights under this Agreement terminate, Recipient agrees to cease use and
-distribution of the Program as soon as reasonably practicable. However,
-Recipient's obligations under this Agreement and any licenses granted by
-Recipient relating to the Program shall continue and survive. </span></p>
-
-<p><span style='font-size:10.0pt'>Everyone is permitted to copy and distribute
-copies of this Agreement, but in order to avoid inconsistency the Agreement is
-copyrighted and may only be modified in the following manner. The Agreement
-Steward reserves the right to publish new versions (including revisions) of
-this Agreement from time to time. No one other than the Agreement Steward has
-the right to modify this Agreement. The Eclipse Foundation is the initial
-Agreement Steward. The Eclipse Foundation may assign the responsibility to
-serve as the Agreement Steward to a suitable separate entity. Each new version
-of the Agreement will be given a distinguishing version number. The Program
-(including Contributions) may always be distributed subject to the version of
-the Agreement under which it was received. In addition, after a new version of
-the Agreement is published, Contributor may elect to distribute the Program
-(including its Contributions) under the new version. Except as expressly stated
-in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to
-the intellectual property of any Contributor under this Agreement, whether
-expressly, by implication, estoppel or otherwise. All rights in the Program not
-expressly granted under this Agreement are reserved.</span> </p>
-
-<p><span style='font-size:10.0pt'>This Agreement is governed by the laws of the
-State of New York and the intellectual property laws of the United States of
-America. No party to this Agreement will bring a legal action under this
-Agreement more than one year after the cause of action arose. Each party waives
-its rights to a jury trial in any resulting litigation.</span> </p>
-
-<p class=MsoNormal><![if !supportEmptyParas]>&nbsp;<![endif]><o:p></o:p></p>
-
-</div>
-
-</body>
-
-</html>
diff --git a/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplateFeature/feature.properties b/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplateFeature/feature.properties
deleted file mode 100644
index 187e431..0000000
--- a/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplateFeature/feature.properties
+++ /dev/null
@@ -1,170 +0,0 @@
-###############################################################################
-# Copyright (c) 2005, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#    Gerry Kessler - initial API and implementation
-###############################################################################
-# This file should be translated.
-# feature.properties
-# contains externalized strings for feature.xml
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# This file should be translated.
-#
-# Do not translate any values surrounded by {}
-#
-# "featureName" property - name of the feature
-featureName=Web Page Editor Source
-
-# "providerName" property - name of the company that provides the feature
-providerName=Eclipse Web Tools Platform
-
-
-# "description" property - description of the feature
-description=Source code zips for Web Page Editor.
-
-# "copyright" property - text of the "Feature Update Copyright"
-copyright=\
-Copyright (c) 2007 Oracle Corporation and others.\
-All rights reserved. This program and the accompanying materials\
-are made available under the terms of the Eclipse Public License v1.0\
-which accompanies this distribution, and is available at\
-http://www.eclipse.org/legal/epl-v10.html\
-\n\
-Contributors:\n\
-    Oracle Corporation - initial API and implementation\n
-################ end of copyright property ####################################
-
-# "licenseURL" property - URL of the "Feature License"
-# do not translate value - just change to point to a locale-specific HTML page
-licenseURL=license.html
-
-# "license" property - text of the "Feature Update License"
-# should be plain text version of license agreement pointed to be "licenseURL"
-license=\
-Eclipse Foundation Software User Agreement\n\
-April 14, 2010\n\
-\n\
-Usage Of Content\n\
-\n\
-THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR\n\
-OTHER MATERIALS FOR OPEN SOURCE PROJECTS (COLLECTIVELY "CONTENT").\n\
-USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS\n\
-AGREEMENT AND/OR THE TERMS AND CONDITIONS OF LICENSE AGREEMENTS OR\n\
-NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU\n\
-AGREE THAT YOUR USE OF THE CONTENT IS GOVERNED BY THIS AGREEMENT\n\
-AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS\n\
-OR NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE\n\
-TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND CONDITIONS\n\
-OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED\n\
-BELOW, THEN YOU MAY NOT USE THE CONTENT.\n\
-\n\
-Applicable Licenses\n\
-\n\
-Unless otherwise indicated, all Content made available by the\n\
-Eclipse Foundation is provided to you under the terms and conditions of\n\
-the Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is\n\
-provided with this Content and is also available at http://www.eclipse.org/legal/epl-v10.html.\n\
-For purposes of the EPL, "Program" will mean the Content.\n\
-\n\
-Content includes, but is not limited to, source code, object code,\n\
-documentation and other files maintained in the Eclipse Foundation source code\n\
-repository ("Repository") in software modules ("Modules") and made available\n\
-as downloadable archives ("Downloads").\n\
-\n\
-       - Content may be structured and packaged into modules to facilitate delivering,\n\
-         extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"),\n\
-         plug-in fragments ("Fragments"), and features ("Features").\n\
-       - Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java(TM) ARchive)\n\
-         in a directory named "plugins".\n\
-       - A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.\n\
-         Each Feature may be packaged as a sub-directory in a directory named "features".\n\
-         Within a Feature, files named "feature.xml" may contain a list of the names and version\n\
-         numbers of the Plug-ins and/or Fragments associated with that Feature.\n\
-       - Features may also include other Features ("Included Features"). Within a Feature, files\n\
-         named "feature.xml" may contain a list of the names and version numbers of Included Features.\n\
-\n\
-The terms and conditions governing Plug-ins and Fragments should be\n\
-contained in files named "about.html" ("Abouts"). The terms and\n\
-conditions governing Features and Included Features should be contained\n\
-in files named "license.html" ("Feature Licenses"). Abouts and Feature\n\
-Licenses may be located in any directory of a Download or Module\n\
-including, but not limited to the following locations:\n\
-\n\
-       - The top-level (root) directory\n\
-       - Plug-in and Fragment directories\n\
-       - Inside Plug-ins and Fragments packaged as JARs\n\
-       - Sub-directories of the directory named "src" of certain Plug-ins\n\
-       - Feature directories\n\
-\n\
-Note: if a Feature made available by the Eclipse Foundation is installed using the\n\
-Provisioning Technology (as defined below), you must agree to a license ("Feature \n\
-Update License") during the installation process. If the Feature contains\n\
-Included Features, the Feature Update License should either provide you\n\
-with the terms and conditions governing the Included Features or inform\n\
-you where you can locate them. Feature Update Licenses may be found in\n\
-the "license" property of files named "feature.properties" found within a Feature.\n\
-Such Abouts, Feature Licenses, and Feature Update Licenses contain the\n\
-terms and conditions (or references to such terms and conditions) that\n\
-govern your use of the associated Content in that directory.\n\
-\n\
-THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER\n\
-TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.\n\
-SOME OF THESE OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):\n\
-\n\
-       - Common Public License Version 1.0 (available at http://www.eclipse.org/legal/cpl-v10.html)\n\
-       - Apache Software License 1.1 (available at http://www.apache.org/licenses/LICENSE)\n\
-       - Apache Software License 2.0 (available at http://www.apache.org/licenses/LICENSE-2.0)\n\
-       - Metro Link Public License 1.00 (available at http://www.opengroup.org/openmotif/supporters/metrolink/license.html)\n\
-       - Mozilla Public License Version 1.1 (available at http://www.mozilla.org/MPL/MPL-1.1.html)\n\
-\n\
-IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR\n\
-TO USE OF THE CONTENT. If no About, Feature License, or Feature Update License\n\
-is provided, please contact the Eclipse Foundation to determine what terms and conditions\n\
-govern that particular Content.\n\
-\n\
-\n\Use of Provisioning Technology\n\
-\n\
-The Eclipse Foundation makes available provisioning software, examples of which include,\n\
-but are not limited to, p2 and the Eclipse Update Manager ("Provisioning Technology") for\n\
-the purpose of allowing users to install software, documentation, information and/or\n\
-other materials (collectively "Installable Software"). This capability is provided with\n\
-the intent of allowing such users to install, extend and update Eclipse-based products.\n\
-Information about packaging Installable Software is available at\n\
-http://eclipse.org/equinox/p2/repository_packaging.html ("Specification").\n\
-\n\
-You may use Provisioning Technology to allow other parties to install Installable Software.\n\
-You shall be responsible for enabling the applicable license agreements relating to the\n\
-Installable Software to be presented to, and accepted by, the users of the Provisioning Technology\n\
-in accordance with the Specification. By using Provisioning Technology in such a manner and\n\
-making it available in accordance with the Specification, you further acknowledge your\n\
-agreement to, and the acquisition of all necessary rights to permit the following:\n\
-\n\
-       1. A series of actions may occur ("Provisioning Process") in which a user may execute\n\
-          the Provisioning Technology on a machine ("Target Machine") with the intent of installing,\n\
-          extending or updating the functionality of an Eclipse-based product.\n\
-       2. During the Provisioning Process, the Provisioning Technology may cause third party\n\
-          Installable Software or a portion thereof to be accessed and copied to the Target Machine.\n\
-       3. Pursuant to the Specification, you will provide to the user the terms and conditions that\n\
-          govern the use of the Installable Software ("Installable Software Agreement") and such\n\
-          Installable Software Agreement shall be accessed from the Target Machine in accordance\n\
-          with the Specification. Such Installable Software Agreement must inform the user of the\n\
-          terms and conditions that govern the Installable Software and must solicit acceptance by\n\
-          the end user in the manner prescribed in such Installable Software Agreement. Upon such\n\
-          indication of agreement by the user, the provisioning Technology will complete installation\n\
-          of the Installable Software.\n\
-\n\
-Cryptography\n\
-\n\
-Content may contain encryption software. The country in which you are\n\
-currently may have restrictions on the import, possession, and use,\n\
-and/or re-export to another country, of encryption software. BEFORE\n\
-using any encryption software, please check the country's laws,\n\
-regulations and policies concerning the import, possession, or use, and\n\
-re-export of encryption software, to see if this is permitted.\n\
-\n\
-Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.\n
-########### end of license property ##########################################
diff --git a/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplateFeature/license.html b/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplateFeature/license.html
deleted file mode 100644
index c184ca3..0000000
--- a/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplateFeature/license.html
+++ /dev/null
@@ -1,107 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1" ?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
-<title>Eclipse Foundation Software User Agreement</title>
-</head>
-
-<body lang="EN-US">
-<h2>Eclipse Foundation Software User Agreement</h2>
-<p>April 14, 2010</p>
-
-<h3>Usage Of Content</h3>
-
-<p>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS
-   (COLLECTIVELY &quot;CONTENT&quot;).  USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND
-   CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU AGREE THAT YOUR USE
-   OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR
-   NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND
-   CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.</p>
-
-<h3>Applicable Licenses</h3>
-
-<p>Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0
-   (&quot;EPL&quot;).  A copy of the EPL is provided with this Content and is also available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-   For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse Foundation source code
-   repository (&quot;Repository&quot;) in software modules (&quot;Modules&quot;) and made available as downloadable archives (&quot;Downloads&quot;).</p>
-
-<ul>
-       <li>Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content.  Typical modules may include plug-ins (&quot;Plug-ins&quot;), plug-in fragments (&quot;Fragments&quot;), and features (&quot;Features&quot;).</li>
-       <li>Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java&trade; ARchive) in a directory named &quot;plugins&quot;.</li>
-       <li>A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.  Each Feature may be packaged as a sub-directory in a directory named &quot;features&quot;.  Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of the Plug-ins
-      and/or Fragments associated with that Feature.</li>
-       <li>Features may also include other Features (&quot;Included Features&quot;). Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of Included Features.</li>
-</ul>
-
-<p>The terms and conditions governing Plug-ins and Fragments should be contained in files named &quot;about.html&quot; (&quot;Abouts&quot;). The terms and conditions governing Features and
-Included Features should be contained in files named &quot;license.html&quot; (&quot;Feature Licenses&quot;).  Abouts and Feature Licenses may be located in any directory of a Download or Module
-including, but not limited to the following locations:</p>
-
-<ul>
-       <li>The top-level (root) directory</li>
-       <li>Plug-in and Fragment directories</li>
-       <li>Inside Plug-ins and Fragments packaged as JARs</li>
-       <li>Sub-directories of the directory named &quot;src&quot; of certain Plug-ins</li>
-       <li>Feature directories</li>
-</ul>
-
-<p>Note: if a Feature made available by the Eclipse Foundation is installed using the Provisioning Technology (as defined below), you must agree to a license (&quot;Feature Update License&quot;) during the
-installation process.  If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or
-inform you where you can locate them.  Feature Update Licenses may be found in the &quot;license&quot; property of files named &quot;feature.properties&quot; found within a Feature.
-Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in
-that directory.</p>
-
-<p>THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.  SOME OF THESE
-OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):</p>
-
-<ul>
-       <li>Common Public License Version 1.0 (available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>)</li>
-       <li>Apache Software License 1.1 (available at <a href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</a>)</li>
-       <li>Apache Software License 2.0 (available at <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>)</li>
-       <li>Metro Link Public License 1.00 (available at <a href="http://www.opengroup.org/openmotif/supporters/metrolink/license.html">http://www.opengroup.org/openmotif/supporters/metrolink/license.html</a>)</li>
-       <li>Mozilla Public License Version 1.1 (available at <a href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</a>)</li>
-</ul>
-
-<p>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT.  If no About, Feature License, or Feature Update License is provided, please
-contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.</p>
-
-
-<h3>Use of Provisioning Technology</h3>
-
-<p>The Eclipse Foundation makes available provisioning software, examples of which include, but are not limited to, p2 and the Eclipse
-   Update Manager (&quot;Provisioning Technology&quot;) for the purpose of allowing users to install software, documentation, information and/or
-   other materials (collectively &quot;Installable Software&quot;). This capability is provided with the intent of allowing such users to
-   install, extend and update Eclipse-based products. Information about packaging Installable Software is available at <a
-       href="http://eclipse.org/equinox/p2/repository_packaging.html">http://eclipse.org/equinox/p2/repository_packaging.html</a>
-   (&quot;Specification&quot;).</p>
-
-<p>You may use Provisioning Technology to allow other parties to install Installable Software. You shall be responsible for enabling the
-   applicable license agreements relating to the Installable Software to be presented to, and accepted by, the users of the Provisioning Technology
-   in accordance with the Specification. By using Provisioning Technology in such a manner and making it available in accordance with the
-   Specification, you further acknowledge your agreement to, and the acquisition of all necessary rights to permit the following:</p>
-
-<ol>
-       <li>A series of actions may occur (&quot;Provisioning Process&quot;) in which a user may execute the Provisioning Technology
-       on a machine (&quot;Target Machine&quot;) with the intent of installing, extending or updating the functionality of an Eclipse-based
-       product.</li>
-       <li>During the Provisioning Process, the Provisioning Technology may cause third party Installable Software or a portion thereof to be
-       accessed and copied to the Target Machine.</li>
-       <li>Pursuant to the Specification, you will provide to the user the terms and conditions that govern the use of the Installable
-       Software (&quot;Installable Software Agreement&quot;) and such Installable Software Agreement shall be accessed from the Target
-       Machine in accordance with the Specification. Such Installable Software Agreement must inform the user of the terms and conditions that govern
-       the Installable Software and must solicit acceptance by the end user in the manner prescribed in such Installable Software Agreement. Upon such
-       indication of agreement by the user, the provisioning Technology will complete installation of the Installable Software.</li>
-</ol>
-
-<h3>Cryptography</h3>
-
-<p>Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to
-   another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import,
-   possession, or use, and re-export of encryption software, to see if this is permitted.</p>
-
-<p><small>Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.</small></p>
-</body>
-</html>
diff --git a/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplatePlugin/about.html b/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplatePlugin/about.html
deleted file mode 100644
index fe81d46..0000000
--- a/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplatePlugin/about.html
+++ /dev/null
@@ -1,27 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<head>
-<title>About</title>
-<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
-
-<P>June, 2008</P>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise indicated below, the Content is provided to you under the terms and conditions of the
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content.</p>
-
-<h3>Source Code</h3>
-<p>This plug-in contains source code zip files (&quot;Source Zips&quot;) that correspond to binary content in other plug-ins. These Source Zips may be distributed under different license
-agreements and/or notices. Details about these license agreements and notices are contained in &quot;about.html&quot; files (&quot;Abouts&quot;) located in sub-directories in the
-src/ directory of this plug-in. Such Abouts govern your use of the Source Zips in that directory, not the EPL.</p>
-
-</body>
-</html>
diff --git a/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplatePlugin/about.ini b/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplatePlugin/about.ini
deleted file mode 100644
index 2dee36a..0000000
--- a/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplatePlugin/about.ini
+++ /dev/null
@@ -1,31 +0,0 @@
-# about.ini
-# contains information about a feature
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# "%key" are externalized strings defined in about.properties
-# This file does not need to be translated.
-
-# Property "aboutText" contains blurb for "About" dialog (translated)
-aboutText=%blurb
-
-# Property "windowImage" contains path to window icon (16x16)
-# needed for primary features only
-
-# Property "featureImage" contains path to feature image (32x32)
-featureImage=eclipse32.gif
-
-# Property "aboutImage" contains path to product image (500x330 or 115x164)
-# needed for primary features only
-
-# Property "appName" contains name of the application (not translated)
-# needed for primary features only
-
-# Property "welcomePage" contains path to welcome page (special XML-based format)
-# optional
-
-# Property "welcomePerspective" contains the id of the perspective in which the
-# welcome page is to be opened.
-# optional
-
-
-
-
diff --git a/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplatePlugin/about.mappings b/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplatePlugin/about.mappings
deleted file mode 100644
index a28390a..0000000
--- a/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplatePlugin/about.mappings
+++ /dev/null
@@ -1,6 +0,0 @@
-# about.mappings
-# contains fill-ins for about.properties
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# This file does not need to be translated.
-
-0=@build@
diff --git a/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplatePlugin/about.properties b/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplatePlugin/about.properties
deleted file mode 100644
index e3cbbc3..0000000
--- a/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplatePlugin/about.properties
+++ /dev/null
@@ -1,27 +0,0 @@
-###############################################################################
-# Copyright (c) 2005, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#    Gerry Kessler - initial API and implementation
-###############################################################################
-# This file should be translated.
-# about.properties
-# contains externalized strings for about.ini
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# fill-ins are supplied by about.mappings
-# This file should be translated.
-#
-# Do not translate any values surrounded by {}
-
-blurb=Web Page Editor Source\n\
-\n\
-Version: {featureVersion}\n\
-Build id: {0}\n\
-\n\
-(c) Copyright Eclipse contributors and others 2007.  All rights reserved.\n\
-Visit http://www.eclipse.org/webtools
-
diff --git a/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplatePlugin/build.properties b/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplatePlugin/build.properties
deleted file mode 100644
index 43309f0..0000000
--- a/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplatePlugin/build.properties
+++ /dev/null
@@ -1,13 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-
-bin.includes = about.html, about.ini, about.mappings, about.properties, eclipse32.gif, plugin.properties, plugin.xml, src/**, META-INF/
-sourcePlugin = true
diff --git a/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplatePlugin/eclipse32.gif b/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplatePlugin/eclipse32.gif
deleted file mode 100644
index e6ad7cc..0000000
--- a/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplatePlugin/eclipse32.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplatePlugin/eclipse32.png b/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplatePlugin/eclipse32.png
deleted file mode 100644
index 50ae49d..0000000
--- a/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplatePlugin/eclipse32.png
+++ /dev/null
Binary files differ
diff --git a/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplatePlugin/plugin.properties b/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplatePlugin/plugin.properties
deleted file mode 100644
index 46b3449..0000000
--- a/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplatePlugin/plugin.properties
+++ /dev/null
@@ -1,20 +0,0 @@
-###############################################################################
-# Copyright (c) 2005, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#    Gerry Kessler - initial API and implementation
-###############################################################################
-# This file should be translated.
-# plugin.properties
-# contains externalized strings for manifest.mf
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# fill-ins are supplied by about.mappings
-# This file should be translated.
-#
-# Do not translate any values surrounded by {}
-pluginName=Web Page Editor Source
-providerName=Eclipse.org
diff --git a/jsf/features/org.eclipse.jst.webpageeditor_sdk.feature/.cvsignore b/jsf/features/org.eclipse.jst.webpageeditor_sdk.feature/.cvsignore
deleted file mode 100644
index c14487c..0000000
--- a/jsf/features/org.eclipse.jst.webpageeditor_sdk.feature/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-build.xml
diff --git a/jsf/features/org.eclipse.jst.webpageeditor_sdk.feature/.project b/jsf/features/org.eclipse.jst.webpageeditor_sdk.feature/.project
deleted file mode 100644
index 1e4ee00..0000000
--- a/jsf/features/org.eclipse.jst.webpageeditor_sdk.feature/.project
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.jst.webpageeditor_sdk.feature</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.pde.FeatureBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.FeatureNature</nature>
-	</natures>
-</projectDescription>
diff --git a/jsf/features/org.eclipse.jst.webpageeditor_sdk.feature/build.properties b/jsf/features/org.eclipse.jst.webpageeditor_sdk.feature/build.properties
deleted file mode 100644
index 9c94285..0000000
--- a/jsf/features/org.eclipse.jst.webpageeditor_sdk.feature/build.properties
+++ /dev/null
@@ -1,18 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-bin.includes = feature.xml,\
-               license.html,\
-               feature.properties,\
-               epl-v10.html,\
-               eclipse_update_120.jpg
-
-generate.feature@org.eclipse.jst.webpageeditor.feature.source = org.eclipse.jst.webpageeditor.feature
-               
\ No newline at end of file
diff --git a/jsf/features/org.eclipse.jst.webpageeditor_sdk.feature/eclipse_update_120.jpg b/jsf/features/org.eclipse.jst.webpageeditor_sdk.feature/eclipse_update_120.jpg
deleted file mode 100644
index bfdf708..0000000
--- a/jsf/features/org.eclipse.jst.webpageeditor_sdk.feature/eclipse_update_120.jpg
+++ /dev/null
Binary files differ
diff --git a/jsf/features/org.eclipse.jst.webpageeditor_sdk.feature/epl-v10.html b/jsf/features/org.eclipse.jst.webpageeditor_sdk.feature/epl-v10.html
deleted file mode 100644
index ed4b196..0000000
--- a/jsf/features/org.eclipse.jst.webpageeditor_sdk.feature/epl-v10.html
+++ /dev/null
@@ -1,328 +0,0 @@
-<html xmlns:o="urn:schemas-microsoft-com:office:office"
-xmlns:w="urn:schemas-microsoft-com:office:word"
-xmlns="http://www.w3.org/TR/REC-html40">
-
-<head>
-<meta http-equiv=Content-Type content="text/html; charset=windows-1252">
-<meta name=ProgId content=Word.Document>
-<meta name=Generator content="Microsoft Word 9">
-<meta name=Originator content="Microsoft Word 9">
-<link rel=File-List
-href="./Eclipse%20EPL%202003_11_10%20Final_files/filelist.xml">
-<title>Eclipse Public License - Version 1.0</title>
-<!--[if gte mso 9]><xml>
- <o:DocumentProperties>
-  <o:Revision>2</o:Revision>
-  <o:TotalTime>3</o:TotalTime>
-  <o:Created>2004-03-05T23:03:00Z</o:Created>
-  <o:LastSaved>2004-03-05T23:03:00Z</o:LastSaved>
-  <o:Pages>4</o:Pages>
-  <o:Words>1626</o:Words>
-  <o:Characters>9270</o:Characters>
-   <o:Lines>77</o:Lines>
-  <o:Paragraphs>18</o:Paragraphs>
-  <o:CharactersWithSpaces>11384</o:CharactersWithSpaces>
-  <o:Version>9.4402</o:Version>
- </o:DocumentProperties>
-</xml><![endif]--><!--[if gte mso 9]><xml>
- <w:WordDocument>
-  <w:TrackRevisions/>
- </w:WordDocument>
-</xml><![endif]-->
-<style>
-<!--
- /* Font Definitions */
-@font-face
-	{font-family:Tahoma;
-	panose-1:2 11 6 4 3 5 4 4 2 4;
-	mso-font-charset:0;
-	mso-generic-font-family:swiss;
-	mso-font-pitch:variable;
-	mso-font-signature:553679495 -2147483648 8 0 66047 0;}
- /* Style Definitions */
-p.MsoNormal, li.MsoNormal, div.MsoNormal
-	{mso-style-parent:"";
-	margin:0in;
-	margin-bottom:.0001pt;
-	mso-pagination:widow-orphan;
-	font-size:12.0pt;
-	font-family:"Times New Roman";
-	mso-fareast-font-family:"Times New Roman";}
-p
-	{margin-right:0in;
-	mso-margin-top-alt:auto;
-	mso-margin-bottom-alt:auto;
-	margin-left:0in;
-	mso-pagination:widow-orphan;
-	font-size:12.0pt;
-	font-family:"Times New Roman";
-	mso-fareast-font-family:"Times New Roman";}
-p.BalloonText, li.BalloonText, div.BalloonText
-	{mso-style-name:"Balloon Text";
-	margin:0in;
-	margin-bottom:.0001pt;
-	mso-pagination:widow-orphan;
-	font-size:8.0pt;
-	font-family:Tahoma;
-	mso-fareast-font-family:"Times New Roman";}
-@page Section1
-	{size:8.5in 11.0in;
-	margin:1.0in 1.25in 1.0in 1.25in;
-	mso-header-margin:.5in;
-	mso-footer-margin:.5in;
-	mso-paper-source:0;}
-div.Section1
-	{page:Section1;}
--->
-</style>
-</head>
-
-<body lang=EN-US style='tab-interval:.5in'>
-
-<div class=Section1>
-
-<p align=center style='text-align:center'><b>Eclipse Public License - v 1.0</b>
-</p>
-
-<p><span style='font-size:10.0pt'>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER
-THE TERMS OF THIS ECLIPSE PUBLIC LICENSE (&quot;AGREEMENT&quot;). ANY USE,
-REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE
-OF THIS AGREEMENT.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>1. DEFINITIONS</span></b> </p>
-
-<p><span style='font-size:10.0pt'>&quot;Contribution&quot; means:</span> </p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-in the case of the initial Contributor, the initial code and documentation
-distributed under this Agreement, and<br clear=left>
-b) in the case of each subsequent Contributor:</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>i)
-changes to the Program, and</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>ii)
-additions to the Program;</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>where
-such changes and/or additions to the Program originate from and are distributed
-by that particular Contributor. A Contribution 'originates' from a Contributor
-if it was added to the Program by such Contributor itself or anyone acting on
-such Contributor's behalf. Contributions do not include additions to the
-Program which: (i) are separate modules of software distributed in conjunction
-with the Program under their own license agreement, and (ii) are not derivative
-works of the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>&quot;Contributor&quot; means any person or
-entity that distributes the Program.</span> </p>
-
-<p><span style='font-size:10.0pt'>&quot;Licensed Patents &quot; mean patent
-claims licensable by a Contributor which are necessarily infringed by the use
-or sale of its Contribution alone or when combined with the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>&quot;Program&quot; means the Contributions
-distributed in accordance with this Agreement.</span> </p>
-
-<p><span style='font-size:10.0pt'>&quot;Recipient&quot; means anyone who
-receives the Program under this Agreement, including all Contributors.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>2. GRANT OF RIGHTS</span></b> </p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-Subject to the terms of this Agreement, each Contributor hereby grants Recipient
-a non-exclusive, worldwide, royalty-free copyright license to<span
-style='color:red'> </span>reproduce, prepare derivative works of, publicly
-display, publicly perform, distribute and sublicense the Contribution of such
-Contributor, if any, and such derivative works, in source code and object code
-form.</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b)
-Subject to the terms of this Agreement, each Contributor hereby grants
-Recipient a non-exclusive, worldwide,<span style='color:green'> </span>royalty-free
-patent license under Licensed Patents to make, use, sell, offer to sell, import
-and otherwise transfer the Contribution of such Contributor, if any, in source
-code and object code form. This patent license shall apply to the combination
-of the Contribution and the Program if, at the time the Contribution is added
-by the Contributor, such addition of the Contribution causes such combination
-to be covered by the Licensed Patents. The patent license shall not apply to
-any other combinations which include the Contribution. No hardware per se is
-licensed hereunder. </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>c)
-Recipient understands that although each Contributor grants the licenses to its
-Contributions set forth herein, no assurances are provided by any Contributor
-that the Program does not infringe the patent or other intellectual property
-rights of any other entity. Each Contributor disclaims any liability to Recipient
-for claims brought by any other entity based on infringement of intellectual
-property rights or otherwise. As a condition to exercising the rights and
-licenses granted hereunder, each Recipient hereby assumes sole responsibility
-to secure any other intellectual property rights needed, if any. For example,
-if a third party patent license is required to allow Recipient to distribute
-the Program, it is Recipient's responsibility to acquire that license before
-distributing the Program.</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>d)
-Each Contributor represents that to its knowledge it has sufficient copyright
-rights in its Contribution, if any, to grant the copyright license set forth in
-this Agreement. </span></p>
-
-<p><b><span style='font-size:10.0pt'>3. REQUIREMENTS</span></b> </p>
-
-<p><span style='font-size:10.0pt'>A Contributor may choose to distribute the
-Program in object code form under its own license agreement, provided that:</span>
-</p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-it complies with the terms and conditions of this Agreement; and</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b)
-its license agreement:</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>i)
-effectively disclaims on behalf of all Contributors all warranties and
-conditions, express and implied, including warranties or conditions of title
-and non-infringement, and implied warranties or conditions of merchantability
-and fitness for a particular purpose; </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>ii)
-effectively excludes on behalf of all Contributors all liability for damages,
-including direct, indirect, special, incidental and consequential damages, such
-as lost profits; </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>iii)
-states that any provisions which differ from this Agreement are offered by that
-Contributor alone and not by any other party; and</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>iv)
-states that source code for the Program is available from such Contributor, and
-informs licensees how to obtain it in a reasonable manner on or through a
-medium customarily used for software exchange.<span style='color:blue'> </span></span></p>
-
-<p><span style='font-size:10.0pt'>When the Program is made available in source
-code form:</span> </p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-it must be made available under this Agreement; and </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b) a
-copy of this Agreement must be included with each copy of the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>Contributors may not remove or alter any
-copyright notices contained within the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>Each Contributor must identify itself as the
-originator of its Contribution, if any, in a manner that reasonably allows
-subsequent Recipients to identify the originator of the Contribution. </span></p>
-
-<p><b><span style='font-size:10.0pt'>4. COMMERCIAL DISTRIBUTION</span></b> </p>
-
-<p><span style='font-size:10.0pt'>Commercial distributors of software may
-accept certain responsibilities with respect to end users, business partners
-and the like. While this license is intended to facilitate the commercial use
-of the Program, the Contributor who includes the Program in a commercial
-product offering should do so in a manner which does not create potential
-liability for other Contributors. Therefore, if a Contributor includes the
-Program in a commercial product offering, such Contributor (&quot;Commercial
-Contributor&quot;) hereby agrees to defend and indemnify every other
-Contributor (&quot;Indemnified Contributor&quot;) against any losses, damages and
-costs (collectively &quot;Losses&quot;) arising from claims, lawsuits and other
-legal actions brought by a third party against the Indemnified Contributor to
-the extent caused by the acts or omissions of such Commercial Contributor in
-connection with its distribution of the Program in a commercial product
-offering. The obligations in this section do not apply to any claims or Losses
-relating to any actual or alleged intellectual property infringement. In order
-to qualify, an Indemnified Contributor must: a) promptly notify the Commercial
-Contributor in writing of such claim, and b) allow the Commercial Contributor
-to control, and cooperate with the Commercial Contributor in, the defense and
-any related settlement negotiations. The Indemnified Contributor may participate
-in any such claim at its own expense.</span> </p>
-
-<p><span style='font-size:10.0pt'>For example, a Contributor might include the
-Program in a commercial product offering, Product X. That Contributor is then a
-Commercial Contributor. If that Commercial Contributor then makes performance
-claims, or offers warranties related to Product X, those performance claims and
-warranties are such Commercial Contributor's responsibility alone. Under this
-section, the Commercial Contributor would have to defend claims against the
-other Contributors related to those performance claims and warranties, and if a
-court requires any other Contributor to pay any damages as a result, the
-Commercial Contributor must pay those damages.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>5. NO WARRANTY</span></b> </p>
-
-<p><span style='font-size:10.0pt'>EXCEPT AS EXPRESSLY SET FORTH IN THIS
-AGREEMENT, THE PROGRAM IS PROVIDED ON AN &quot;AS IS&quot; 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. Each Recipient is solely
-responsible for determining the appropriateness of using and distributing the
-Program and assumes all risks associated with its exercise of rights under this
-Agreement , including but not limited to the risks and costs of program errors,
-compliance with applicable laws, damage to or loss of data, programs or
-equipment, and unavailability or interruption of operations. </span></p>
-
-<p><b><span style='font-size:10.0pt'>6. DISCLAIMER OF LIABILITY</span></b> </p>
-
-<p><span style='font-size:10.0pt'>EXCEPT AS EXPRESSLY SET FORTH IN THIS
-AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY
-OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF
-THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF
-THE POSSIBILITY OF SUCH DAMAGES.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>7. GENERAL</span></b> </p>
-
-<p><span style='font-size:10.0pt'>If any provision of this Agreement is invalid
-or unenforceable under applicable law, it shall not affect the validity or
-enforceability of the remainder of the terms of this Agreement, and without
-further action by the parties hereto, such provision shall be reformed to the
-minimum extent necessary to make such provision valid and enforceable.</span> </p>
-
-<p><span style='font-size:10.0pt'>If Recipient institutes patent litigation
-against any entity (including a cross-claim or counterclaim in a lawsuit)
-alleging that the Program itself (excluding combinations of the Program with
-other software or hardware) infringes such Recipient's patent(s), then such
-Recipient's rights granted under Section 2(b) shall terminate as of the date
-such litigation is filed. </span></p>
-
-<p><span style='font-size:10.0pt'>All Recipient's rights under this Agreement
-shall terminate if it fails to comply with any of the material terms or
-conditions of this Agreement and does not cure such failure in a reasonable
-period of time after becoming aware of such noncompliance. If all Recipient's
-rights under this Agreement terminate, Recipient agrees to cease use and
-distribution of the Program as soon as reasonably practicable. However,
-Recipient's obligations under this Agreement and any licenses granted by
-Recipient relating to the Program shall continue and survive. </span></p>
-
-<p><span style='font-size:10.0pt'>Everyone is permitted to copy and distribute
-copies of this Agreement, but in order to avoid inconsistency the Agreement is
-copyrighted and may only be modified in the following manner. The Agreement
-Steward reserves the right to publish new versions (including revisions) of
-this Agreement from time to time. No one other than the Agreement Steward has
-the right to modify this Agreement. The Eclipse Foundation is the initial
-Agreement Steward. The Eclipse Foundation may assign the responsibility to
-serve as the Agreement Steward to a suitable separate entity. Each new version
-of the Agreement will be given a distinguishing version number. The Program
-(including Contributions) may always be distributed subject to the version of
-the Agreement under which it was received. In addition, after a new version of
-the Agreement is published, Contributor may elect to distribute the Program
-(including its Contributions) under the new version. Except as expressly stated
-in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to
-the intellectual property of any Contributor under this Agreement, whether
-expressly, by implication, estoppel or otherwise. All rights in the Program not
-expressly granted under this Agreement are reserved.</span> </p>
-
-<p><span style='font-size:10.0pt'>This Agreement is governed by the laws of the
-State of New York and the intellectual property laws of the United States of
-America. No party to this Agreement will bring a legal action under this
-Agreement more than one year after the cause of action arose. Each party waives
-its rights to a jury trial in any resulting litigation.</span> </p>
-
-<p class=MsoNormal><![if !supportEmptyParas]>&nbsp;<![endif]><o:p></o:p></p>
-
-</div>
-
-</body>
-
-</html>
\ No newline at end of file
diff --git a/jsf/features/org.eclipse.jst.webpageeditor_sdk.feature/feature.properties b/jsf/features/org.eclipse.jst.webpageeditor_sdk.feature/feature.properties
deleted file mode 100644
index 9bcac77..0000000
--- a/jsf/features/org.eclipse.jst.webpageeditor_sdk.feature/feature.properties
+++ /dev/null
@@ -1,168 +0,0 @@
-###############################################################################
-# Copyright (c) 2005, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-# feature.properties
-# contains externalized strings for feature.xml
-# "%foo" in feature.xml corresponds to the key "foo" in this file
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# This file should be translated.
-
-# "featureName" property - name of the feature
-featureName=Web Page Editor (Optional) SDK
-
-# "providerName" property - name of the company that provides the feature
-providerName=Eclipse.org
-
-
-# "description" property - description of the feature
-description=Web Page Editor (Optional) SDK
-
-# "copyright" property - text of the "Feature Update Copyright"
-copyright=\
-Copyright (c) 2007 Oracle Corporation.\
-All rights reserved. This program and the accompanying materials\
-are made available under the terms of the Eclipse Public License v1.0\
-which accompanies this distribution, and is available at\
-http://www.eclipse.org/legal/epl-v10.html\
-\n\
-Contributors:\n\
-    Oracle Corporation - initial API and implementation\n
-################ end of copyright property ####################################
-
-# "licenseURL" property - URL of the "Feature License"
-# do not translate value - just change to point to a locale-specific HTML page
-licenseURL=license.html
-
-# "license" property - text of the "Feature Update License"
-# should be plain text version of license agreement pointed to be "licenseURL"
-license=\
-Eclipse Foundation Software User Agreement\n\
-April 14, 2010\n\
-\n\
-Usage Of Content\n\
-\n\
-THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR\n\
-OTHER MATERIALS FOR OPEN SOURCE PROJECTS (COLLECTIVELY "CONTENT").\n\
-USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS\n\
-AGREEMENT AND/OR THE TERMS AND CONDITIONS OF LICENSE AGREEMENTS OR\n\
-NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU\n\
-AGREE THAT YOUR USE OF THE CONTENT IS GOVERNED BY THIS AGREEMENT\n\
-AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS\n\
-OR NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE\n\
-TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND CONDITIONS\n\
-OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED\n\
-BELOW, THEN YOU MAY NOT USE THE CONTENT.\n\
-\n\
-Applicable Licenses\n\
-\n\
-Unless otherwise indicated, all Content made available by the\n\
-Eclipse Foundation is provided to you under the terms and conditions of\n\
-the Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is\n\
-provided with this Content and is also available at http://www.eclipse.org/legal/epl-v10.html.\n\
-For purposes of the EPL, "Program" will mean the Content.\n\
-\n\
-Content includes, but is not limited to, source code, object code,\n\
-documentation and other files maintained in the Eclipse Foundation source code\n\
-repository ("Repository") in software modules ("Modules") and made available\n\
-as downloadable archives ("Downloads").\n\
-\n\
-       - Content may be structured and packaged into modules to facilitate delivering,\n\
-         extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"),\n\
-         plug-in fragments ("Fragments"), and features ("Features").\n\
-       - Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java(TM) ARchive)\n\
-         in a directory named "plugins".\n\
-       - A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.\n\
-         Each Feature may be packaged as a sub-directory in a directory named "features".\n\
-         Within a Feature, files named "feature.xml" may contain a list of the names and version\n\
-         numbers of the Plug-ins and/or Fragments associated with that Feature.\n\
-       - Features may also include other Features ("Included Features"). Within a Feature, files\n\
-         named "feature.xml" may contain a list of the names and version numbers of Included Features.\n\
-\n\
-The terms and conditions governing Plug-ins and Fragments should be\n\
-contained in files named "about.html" ("Abouts"). The terms and\n\
-conditions governing Features and Included Features should be contained\n\
-in files named "license.html" ("Feature Licenses"). Abouts and Feature\n\
-Licenses may be located in any directory of a Download or Module\n\
-including, but not limited to the following locations:\n\
-\n\
-       - The top-level (root) directory\n\
-       - Plug-in and Fragment directories\n\
-       - Inside Plug-ins and Fragments packaged as JARs\n\
-       - Sub-directories of the directory named "src" of certain Plug-ins\n\
-       - Feature directories\n\
-\n\
-Note: if a Feature made available by the Eclipse Foundation is installed using the\n\
-Provisioning Technology (as defined below), you must agree to a license ("Feature \n\
-Update License") during the installation process. If the Feature contains\n\
-Included Features, the Feature Update License should either provide you\n\
-with the terms and conditions governing the Included Features or inform\n\
-you where you can locate them. Feature Update Licenses may be found in\n\
-the "license" property of files named "feature.properties" found within a Feature.\n\
-Such Abouts, Feature Licenses, and Feature Update Licenses contain the\n\
-terms and conditions (or references to such terms and conditions) that\n\
-govern your use of the associated Content in that directory.\n\
-\n\
-THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER\n\
-TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.\n\
-SOME OF THESE OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):\n\
-\n\
-       - Common Public License Version 1.0 (available at http://www.eclipse.org/legal/cpl-v10.html)\n\
-       - Apache Software License 1.1 (available at http://www.apache.org/licenses/LICENSE)\n\
-       - Apache Software License 2.0 (available at http://www.apache.org/licenses/LICENSE-2.0)\n\
-       - Metro Link Public License 1.00 (available at http://www.opengroup.org/openmotif/supporters/metrolink/license.html)\n\
-       - Mozilla Public License Version 1.1 (available at http://www.mozilla.org/MPL/MPL-1.1.html)\n\
-\n\
-IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR\n\
-TO USE OF THE CONTENT. If no About, Feature License, or Feature Update License\n\
-is provided, please contact the Eclipse Foundation to determine what terms and conditions\n\
-govern that particular Content.\n\
-\n\
-\n\Use of Provisioning Technology\n\
-\n\
-The Eclipse Foundation makes available provisioning software, examples of which include,\n\
-but are not limited to, p2 and the Eclipse Update Manager ("Provisioning Technology") for\n\
-the purpose of allowing users to install software, documentation, information and/or\n\
-other materials (collectively "Installable Software"). This capability is provided with\n\
-the intent of allowing such users to install, extend and update Eclipse-based products.\n\
-Information about packaging Installable Software is available at\n\
-http://eclipse.org/equinox/p2/repository_packaging.html ("Specification").\n\
-\n\
-You may use Provisioning Technology to allow other parties to install Installable Software.\n\
-You shall be responsible for enabling the applicable license agreements relating to the\n\
-Installable Software to be presented to, and accepted by, the users of the Provisioning Technology\n\
-in accordance with the Specification. By using Provisioning Technology in such a manner and\n\
-making it available in accordance with the Specification, you further acknowledge your\n\
-agreement to, and the acquisition of all necessary rights to permit the following:\n\
-\n\
-       1. A series of actions may occur ("Provisioning Process") in which a user may execute\n\
-          the Provisioning Technology on a machine ("Target Machine") with the intent of installing,\n\
-          extending or updating the functionality of an Eclipse-based product.\n\
-       2. During the Provisioning Process, the Provisioning Technology may cause third party\n\
-          Installable Software or a portion thereof to be accessed and copied to the Target Machine.\n\
-       3. Pursuant to the Specification, you will provide to the user the terms and conditions that\n\
-          govern the use of the Installable Software ("Installable Software Agreement") and such\n\
-          Installable Software Agreement shall be accessed from the Target Machine in accordance\n\
-          with the Specification. Such Installable Software Agreement must inform the user of the\n\
-          terms and conditions that govern the Installable Software and must solicit acceptance by\n\
-          the end user in the manner prescribed in such Installable Software Agreement. Upon such\n\
-          indication of agreement by the user, the provisioning Technology will complete installation\n\
-          of the Installable Software.\n\
-\n\
-Cryptography\n\
-\n\
-Content may contain encryption software. The country in which you are\n\
-currently may have restrictions on the import, possession, and use,\n\
-and/or re-export to another country, of encryption software. BEFORE\n\
-using any encryption software, please check the country's laws,\n\
-regulations and policies concerning the import, possession, or use, and\n\
-re-export of encryption software, to see if this is permitted.\n\
-\n\
-Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.\n
-########### end of license property ##########################################
diff --git a/jsf/features/org.eclipse.jst.webpageeditor_sdk.feature/feature.xml b/jsf/features/org.eclipse.jst.webpageeditor_sdk.feature/feature.xml
deleted file mode 100644
index bce4f30..0000000
--- a/jsf/features/org.eclipse.jst.webpageeditor_sdk.feature/feature.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<feature
-      id="org.eclipse.jst.webpageeditor_sdk.feature"
-      label="%featureName"
-      version="2.3.0.qualifier"
-      provider-name="%providerName">
-
-   <description>
-      %description
-   </description>
-
-   <copyright>
-      %copyright
-   </copyright>
-
-   <license url="license.html">
-      %license
-   </license>
-
-
-   <includes
-         id="org.eclipse.jst.webpageeditor.feature"
-         version="0.0.0"/>
-
-   <includes
-         id="org.eclipse.jst.webpageeditor.feature.source"
-         version="0.0.0"/>
-
-</feature>
diff --git a/jsf/features/org.eclipse.jst.webpageeditor_sdk.feature/license.html b/jsf/features/org.eclipse.jst.webpageeditor_sdk.feature/license.html
deleted file mode 100644
index c184ca3..0000000
--- a/jsf/features/org.eclipse.jst.webpageeditor_sdk.feature/license.html
+++ /dev/null
@@ -1,107 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1" ?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
-<title>Eclipse Foundation Software User Agreement</title>
-</head>
-
-<body lang="EN-US">
-<h2>Eclipse Foundation Software User Agreement</h2>
-<p>April 14, 2010</p>
-
-<h3>Usage Of Content</h3>
-
-<p>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS
-   (COLLECTIVELY &quot;CONTENT&quot;).  USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND
-   CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU AGREE THAT YOUR USE
-   OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR
-   NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND
-   CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.</p>
-
-<h3>Applicable Licenses</h3>
-
-<p>Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0
-   (&quot;EPL&quot;).  A copy of the EPL is provided with this Content and is also available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-   For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse Foundation source code
-   repository (&quot;Repository&quot;) in software modules (&quot;Modules&quot;) and made available as downloadable archives (&quot;Downloads&quot;).</p>
-
-<ul>
-       <li>Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content.  Typical modules may include plug-ins (&quot;Plug-ins&quot;), plug-in fragments (&quot;Fragments&quot;), and features (&quot;Features&quot;).</li>
-       <li>Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java&trade; ARchive) in a directory named &quot;plugins&quot;.</li>
-       <li>A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.  Each Feature may be packaged as a sub-directory in a directory named &quot;features&quot;.  Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of the Plug-ins
-      and/or Fragments associated with that Feature.</li>
-       <li>Features may also include other Features (&quot;Included Features&quot;). Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of Included Features.</li>
-</ul>
-
-<p>The terms and conditions governing Plug-ins and Fragments should be contained in files named &quot;about.html&quot; (&quot;Abouts&quot;). The terms and conditions governing Features and
-Included Features should be contained in files named &quot;license.html&quot; (&quot;Feature Licenses&quot;).  Abouts and Feature Licenses may be located in any directory of a Download or Module
-including, but not limited to the following locations:</p>
-
-<ul>
-       <li>The top-level (root) directory</li>
-       <li>Plug-in and Fragment directories</li>
-       <li>Inside Plug-ins and Fragments packaged as JARs</li>
-       <li>Sub-directories of the directory named &quot;src&quot; of certain Plug-ins</li>
-       <li>Feature directories</li>
-</ul>
-
-<p>Note: if a Feature made available by the Eclipse Foundation is installed using the Provisioning Technology (as defined below), you must agree to a license (&quot;Feature Update License&quot;) during the
-installation process.  If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or
-inform you where you can locate them.  Feature Update Licenses may be found in the &quot;license&quot; property of files named &quot;feature.properties&quot; found within a Feature.
-Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in
-that directory.</p>
-
-<p>THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.  SOME OF THESE
-OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):</p>
-
-<ul>
-       <li>Common Public License Version 1.0 (available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>)</li>
-       <li>Apache Software License 1.1 (available at <a href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</a>)</li>
-       <li>Apache Software License 2.0 (available at <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>)</li>
-       <li>Metro Link Public License 1.00 (available at <a href="http://www.opengroup.org/openmotif/supporters/metrolink/license.html">http://www.opengroup.org/openmotif/supporters/metrolink/license.html</a>)</li>
-       <li>Mozilla Public License Version 1.1 (available at <a href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</a>)</li>
-</ul>
-
-<p>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT.  If no About, Feature License, or Feature Update License is provided, please
-contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.</p>
-
-
-<h3>Use of Provisioning Technology</h3>
-
-<p>The Eclipse Foundation makes available provisioning software, examples of which include, but are not limited to, p2 and the Eclipse
-   Update Manager (&quot;Provisioning Technology&quot;) for the purpose of allowing users to install software, documentation, information and/or
-   other materials (collectively &quot;Installable Software&quot;). This capability is provided with the intent of allowing such users to
-   install, extend and update Eclipse-based products. Information about packaging Installable Software is available at <a
-       href="http://eclipse.org/equinox/p2/repository_packaging.html">http://eclipse.org/equinox/p2/repository_packaging.html</a>
-   (&quot;Specification&quot;).</p>
-
-<p>You may use Provisioning Technology to allow other parties to install Installable Software. You shall be responsible for enabling the
-   applicable license agreements relating to the Installable Software to be presented to, and accepted by, the users of the Provisioning Technology
-   in accordance with the Specification. By using Provisioning Technology in such a manner and making it available in accordance with the
-   Specification, you further acknowledge your agreement to, and the acquisition of all necessary rights to permit the following:</p>
-
-<ol>
-       <li>A series of actions may occur (&quot;Provisioning Process&quot;) in which a user may execute the Provisioning Technology
-       on a machine (&quot;Target Machine&quot;) with the intent of installing, extending or updating the functionality of an Eclipse-based
-       product.</li>
-       <li>During the Provisioning Process, the Provisioning Technology may cause third party Installable Software or a portion thereof to be
-       accessed and copied to the Target Machine.</li>
-       <li>Pursuant to the Specification, you will provide to the user the terms and conditions that govern the use of the Installable
-       Software (&quot;Installable Software Agreement&quot;) and such Installable Software Agreement shall be accessed from the Target
-       Machine in accordance with the Specification. Such Installable Software Agreement must inform the user of the terms and conditions that govern
-       the Installable Software and must solicit acceptance by the end user in the manner prescribed in such Installable Software Agreement. Upon such
-       indication of agreement by the user, the provisioning Technology will complete installation of the Installable Software.</li>
-</ol>
-
-<h3>Cryptography</h3>
-
-<p>Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to
-   another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import,
-   possession, or use, and re-export of encryption software, to see if this is permitted.</p>
-
-<p><small>Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.</small></p>
-</body>
-</html>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/.classpath b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/.classpath
deleted file mode 100644
index 304e861..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/.cvsignore b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/.cvsignore
deleted file mode 100644
index 6577ed9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/.cvsignore
+++ /dev/null
@@ -1,2 +0,0 @@
-javaCompiler...args
-build.xml
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/.project b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/.project
deleted file mode 100644
index a17f881..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.jst.jsf.apache.trinidad.tagsupport</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/.settings/org.eclipse.jdt.core.prefs b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index bff1737..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,65 +0,0 @@
-#Mon Jun 30 15:50:06 PDT 2008
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
-org.eclipse.jdt.core.compiler.compliance=1.5
-org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
-org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
-org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
-org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=error
-org.eclipse.jdt.core.compiler.problem.nullReference=warning
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
-org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=warning
-org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
-org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
-org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
-org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
-org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.5
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/.settings/org.eclipse.pde.prefs b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/.settings/org.eclipse.pde.prefs
deleted file mode 100644
index 12f045f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/.settings/org.eclipse.pde.prefs
+++ /dev/null
@@ -1,22 +0,0 @@
-#Fri May 30 12:01:04 PDT 2008
-compilers.f.unresolved-features=1
-compilers.f.unresolved-plugins=1
-compilers.incompatible-environment=1
-compilers.p.build=1
-compilers.p.deprecated=1
-compilers.p.discouraged-class=1
-compilers.p.internal=1
-compilers.p.missing-packages=0
-compilers.p.no-required-att=0
-compilers.p.not-externalized-att=0
-compilers.p.unknown-attribute=1
-compilers.p.unknown-class=1
-compilers.p.unknown-element=1
-compilers.p.unknown-identifier=1
-compilers.p.unknown-resource=1
-compilers.p.unresolved-ex-points=0
-compilers.p.unresolved-import=0
-compilers.s.create-docs=false
-compilers.s.doc-folder=doc
-compilers.s.open-tags=1
-eclipse.preferences.version=1
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/META-INF/MANIFEST.MF b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/META-INF/MANIFEST.MF
deleted file mode 100644
index e2f05f8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,27 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %pluginName
-Bundle-SymbolicName: org.eclipse.jst.jsf.apache.trinidad.tagsupport;singleton:=true
-Bundle-Version: 1.1.100.qualifier
-Bundle-Localization: plugin
-Bundle-Activator: org.eclipse.jst.jsf.apache.trinidad.tagsupport.TrinidadTagSupportActivator
-Bundle-Vendor: %pluginProvider
-Require-Bundle: org.eclipse.ui;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.core.runtime;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.emf.ecore.xmi;bundle-version="[2.2.0,3.0.0)",
- org.eclipse.gef;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.wst.sse.core;bundle-version="[1.1.0,1.2.0)",
- org.eclipse.jst.jsf.common;bundle-version="[1.1.0,2.0.0)",
- org.eclipse.jst.pagedesigner;bundle-version="[1.1.0,2.0.0)",
- org.eclipse.jst.jsf.core;bundle-version="[1.1.0,2.0.0)",
- org.eclipse.jdt.core;bundle-version="[3.4.0,4.0.0)",
- org.eclipse.core.resources;bundle-version="[3.4.0,4.0.0)",
- org.eclipse.jst.jsf.common.ui;bundle-version="[1.1.0,1.3.0)"
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
-Bundle-ActivationPolicy: lazy
-Export-Package: org.eclipse.jst.jsf.apache.trinidad.tagsupport;x-internal:=true,
- org.eclipse.jst.jsf.apache.trinidad.tagsupport.converter.operations;x-internal:=true,
- org.eclipse.jst.jsf.apache.trinidad.tagsupport.dtresourceprovider;x-internal:=true,
- org.eclipse.jst.jsf.apache.trinidad.tagsupport.el;x-internal:=true,
- org.eclipse.jst.jsf.apache.trinidad.tagsupport.elementedit;x-internal:=true,
- org.eclipse.jst.jsf.apache.trinidad.tagsupport.model;x-internal:=true
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/about.html b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/about.html
deleted file mode 100644
index 8e56059..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/about.html
+++ /dev/null
@@ -1,22 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<head>
-<title>About</title>
-<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>June, 2008</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise indicated below, the Content is provided to you under the terms and conditions of the
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content.</p>
-
-</body>
-</html>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/build.properties b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/build.properties
deleted file mode 100644
index a7ed816..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/build.properties
+++ /dev/null
@@ -1,22 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2008 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               .,\
-               plugin.xml,\
-               metadata/,\
-               plugin.properties,\
-               about.html,\
-               icons/,\
-               skinning/
-javacSource=1.5
-javacTarget=1.5
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/icons/large/chart.gif b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/icons/large/chart.gif
deleted file mode 100644
index 08a36db..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/icons/large/chart.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/icons/large/chooseColor.gif b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/icons/large/chooseColor.gif
deleted file mode 100644
index d20f760..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/icons/large/chooseColor.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/icons/large/chooseDate.gif b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/icons/large/chooseDate.gif
deleted file mode 100644
index ca3b962..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/icons/large/chooseDate.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/icons/small/chart.gif b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/icons/small/chart.gif
deleted file mode 100644
index d37d0d3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/icons/small/chart.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/icons/small/icon_inputColor.gif b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/icons/small/icon_inputColor.gif
deleted file mode 100644
index eb59712..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/icons/small/icon_inputColor.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/icons/small/icon_inputDate.gif b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/icons/small/icon_inputDate.gif
deleted file mode 100644
index df5eceb..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/icons/small/icon_inputDate.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/icons/small/icon_inputListOfValues.gif b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/icons/small/icon_inputListOfValues.gif
deleted file mode 100644
index 890e68e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/icons/small/icon_inputListOfValues.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/icons/small/icon_inputNumberSpinbox.gif b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/icons/small/icon_inputNumberSpinbox.gif
deleted file mode 100644
index 2504705..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/icons/small/icon_inputNumberSpinbox.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/icons/small/importScript.gif b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/icons/small/importScript.gif
deleted file mode 100644
index 7478ce7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/icons/small/importScript.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/icons/small/inputHidden.gif b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/icons/small/inputHidden.gif
deleted file mode 100644
index f18865b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/icons/small/inputHidden.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/icons/small/message.gif b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/icons/small/message.gif
deleted file mode 100644
index 7d0c261..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/icons/small/message.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/icons/small/messages.gif b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/icons/small/messages.gif
deleted file mode 100644
index 6f43980..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/icons/small/messages.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/icons/small/poll.gif b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/icons/small/poll.gif
deleted file mode 100644
index 35ba6f4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/icons/small/poll.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/icons/small/selectItem.gif b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/icons/small/selectItem.gif
deleted file mode 100644
index 247efe0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/icons/small/selectItem.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/icons/small/spacer.gif b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/icons/small/spacer.gif
deleted file mode 100644
index 3c1b4b4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/icons/small/spacer.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/icons/small/styleSheet.gif b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/icons/small/styleSheet.gif
deleted file mode 100644
index d8fde00..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/icons/small/styleSheet.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/metadata/trinidad.properties b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/metadata/trinidad.properties
deleted file mode 100644
index 56cc502..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/metadata/trinidad.properties
+++ /dev/null
@@ -1,13 +0,0 @@
-###############################################################################
-# Copyright (c) 2008 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-property.category.event=Event
-property.category.core=Core
-property.category.css=CSS
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/metadata/trinidad.xml b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/metadata/trinidad.xml
deleted file mode 100644
index 0bb2dd1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/metadata/trinidad.xml
+++ /dev/null
@@ -1,4192 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<md:metadatamodel id="http://myfaces.apache.org/trinidad" type="tagFile"
-    xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore"
-    xmlns:md="http://org.eclipse.jst.jsf.common.metadata/metadata.ecore"
-    xmlns:mdt="http://org.eclipse.jst.jsf.common.metadata/metadataTraitTypes.ecore" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xmlns:qe="http://org.eclipse.jsf.pagedesigner/QuickEditTabSections.ecore"
-    xmlns:cnst="http://org.eclipse.jst.jsf.core/constraints.ecore"
- 	>
-    <entity id="forEach" type="tag">
-    	<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="items"/>
-				<section id="var"/>
-				<section id="begin"/>
-				<section id="end"/>
-				<section id="step"/>							
-			</value>
-		</trait>
-        <entity id="items"/>
-        <entity id="var"/>
-        <entity id="varStatus"/>
-        <entity id="begin">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>
-        </entity>
-        <entity id="end">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>
-        </entity>
-        <entity id="step">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>
-        </entity>
-    </entity>
-    <entity id="setActionListener" type="tag">
-       <trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="to"/>
-				<section id="from"/>			
-			</value>
-		</trait>
-        <entity id="to"/>
-        <entity id="from"/>
-    </entity>
-    <entity id="fileDownloadActionListener" type="tag">
-    	<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="method"/>				
-				<section id="filename"/>
-				<section id="contentType"/>
-			</value>
-		</trait>    
-        <entity id="contentType">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.ContentType</value>
-            </trait>
-        </entity>
-        <entity id="filename"/>
-        <entity id="method">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.MethodBindingType</value>
-            </trait>
-            <trait id="runtime-param-types">
-				<value xsi:type="mdt:ListOfValues">
-					<item>javax.faces.context.FacesContext</item>
-					<item>java.io.OutputStream</item>
-				</value>	
-            </trait>
-        </entity>
-    </entity>
-    <entity id="returnActionListener" type="tag">
-    	<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="value"/>
-			</value>
-		</trait>        
-        <entity id="value">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.ValueBindingType</value>
-            </trait>
-            <trait id="runtime-return-type">
-                <value>java.lang.String</value>
-            </trait>
-			<trait id="runtime-type-setter-required">
-				<value>true</value>
-			</trait>            
-        </entity>
-    </entity>
-    <entity id="resetActionListener" type="tag"/>
-    <entity id="componentRef" type="tag">
-        <trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="componentType"/>
-			</value>
-		</trait>    
-        <entity id="componentType"/>
-        <entity id="id">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.ComponentIDType</value>
-            </trait>
-        </entity>
-        <entity id="value">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.ValueBindingType</value>
-            </trait>
-            <trait id="runtime-return-type">
-                <value>java.lang.String</value>
-            </trait>
-        </entity>
-        <entity id="rendered">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-    </entity>
-    <entity id="componentDef" type="tag">
-        <trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="var"/>				
-			</value>
-		</trait>   
-        <entity id="var">
-            <trait id="contributes-value-binding">
-                <value>true</value>
-            </trait>
-            <trait id="value-binding-scope">
-                <value>request</value>
-            </trait>
-            <trait id="value-binding-symbol-factory">
-                <value>org.eclipse.jst.jsf.common.unknownTypeSymbolFactory</value>
-            </trait>
-        </entity>
-    </entity>
-    <entity id="facetRef" type="tag">
-        <trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="facetName"/>				
-			</value>
-		</trait>       
-        <entity id="facetName"/>
-    </entity>
-    <entity id="breadCrumbs" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<!-- <trait id="supported-facets">			
-			<value xsi:type="mdt:ListOfValues">
-				<item>nodeStamp</item>					
-			</value> 	
-   		</trait> -->
-   		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="orientation"/>
-			</value>
-		</trait>      		   	
-        <entity id="var"/>
-        <entity id="value">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.ValueBindingType</value>
-            </trait>
-            <trait id="runtime-return-type">
-                <value>org.apache.myfaces.trinidad.model.MenuModel</value>
-            </trait>
-        </entity>
-        <entity id="varStatus"/>
-        <entity id="orientation">
-        	<trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-            </trait>        	
-        	<trait id="valid-values">
-				<value xsi:type="mdt:ListOfValues">
-					<item>horizontal</item>
-					<item>vertical</item>					
-				</value>
-			</trait>
-		</entity>
-    </entity>
-    <entity id="chart" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="type"/>
-			</value>
-		</trait>     	
-        <entity id="value">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.ValueBindingType</value>
-            </trait>
-            <trait id="runtime-return-type">
-                <value>org.apache.myfaces.trinidad.model.ChartModel</value>
-            </trait>
-        </entity>
-        <entity id="chartDrillDownListener">
-        	<trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.MethodBindingType</value>
-            </trait>
-           	<trait id="runtime-return-type">
-                <value>void</value>
-            </trait>
-            <trait id="runtime-param-types">
-                <value>org.apache.myfaces.trinidad.event.ChartDrillDownEvent</value>
-            </trait>
-        </entity>
-        <entity id="type">
-			<trait id="valid-values">
-				<value xsi:type="mdt:ListOfValues">
-					<item>verticalBar</item>
-					<item>horizontalBar</item>
-					<item>stackedVerticalBar</item>
-					<item>stackedHorizontalBar</item>	
-					<item>pie</item>
-					<item>area</item>
-					<item>stackedArea</item>
-					<item>line</item>
-					<item>barLine</item>
-					<item>XYLine</item>	
-					<item>scatterPlot</item>
-					<item>radar</item>
-					<item>radarArea</item>
-					<item>funnel</item>
-					<item>circularGauge</item>
-					<item>semiCircularGauge</item>							
-				</value>
-			</trait>
-		</entity>
-        <entity id="templateSource"/>
-        <entity id="perspective">
-             <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-        <entity id="legendPosition">
-        	<trait id="valid-values">
-				<value xsi:type="mdt:ListOfValues">
-					<item>none</item>
-					<item>bottom</item>					
-					<item>top</item>
-					<item>start</item>	
-				</value>
-			</trait>
-		</entity>
-        <entity id="animationDuration">
-             <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>
-        </entity>
-        <entity id="YMajorGridLineCount">
-             <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>
-        </entity>
-        <entity id="YMinorGridLineCount">
-             <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>
-        </entity>
-        <entity id="XMajorGridLineCount">
-             <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>
-        </entity>
-        <entity id="maxPrecision">
-             <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>
-        </entity>
-        <entity id="gradientsUsed">
-             <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-        <entity id="tooltipsVisible">
-             <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-    </entity>
-    <entity id="chooseColor" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="colorData"/>
-			</value>
-		</trait>     	
-        <entity id="colorData"/>
-        <entity id="customColorData"/>
-        <entity id="width">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>
-            <trait id="valid-minimum">
-                <value>0</value>
-            </trait>
-        </entity>
-    </entity>
-    <entity id="chooseDate" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="shortDesc"/>
-			</value>
-		</trait>     	
-        <entity id="minValue"/>
-        <entity id="maxValue"/>
-    </entity>
-    <entity id="column" type="tag">
-     	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<!-- <trait id="supported-facets">			
-			<value xsi:type="mdt:ListOfValues">
-				<item>header</item>
-				<item>footer</item>					
-			</value> 	
-   		</trait> -->   	
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="sortable"/>
-				<section id="align"/>
-				<section id="separateRows"/>
-				<section id="headerNoWrap"/>
-			</value>
-		</trait>    		
-        <entity id="sortProperty"/>
-        <entity id="align">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-            </trait>
-            <trait id="valid-values">
-                <value xsi:type="mdt:ListOfValues">
-                    <item>left</item>
-                    <item>center</item>
-                    <item>right</item>
-                </value>
-            </trait>
-        </entity>
-        <entity id="defaultSortOrder">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-            </trait>
-            <trait id="valid-values">
-                <value xsi:type="mdt:ListOfValues">
-                    <item>ascending</item>
-                    <item>descending</item>                    
-                </value>
-            </trait>        
-        </entity>
-        <entity id="width">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.LengthType</value>
-            </trait>
-        </entity>
-        <entity id="headerText"/>
-        <entity id="noWrap">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>        
-        </entity>
-        <entity id="headerNoWrap">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>   
-        </entity>
-        <entity id="sortable">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>   
-        </entity>
-        
-        <entity id="separateRows">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>   
-        </entity>
-        <entity id="rowHeader"/>
-    </entity>
-    <entity id="commandButton" type="tag">
-     	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<include-entity-group id="common-command-attributes"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="text"/>
-				<section id="action"/>
-				<section id="accessKey"/>
-				<section id="immediate"/>
-			</value>
-		</trait>     	
-        <entity id="blocking">
-             <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-        <entity id="icon"/>
-
-    </entity>
-    <entity id="commandLink" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-		<include-entity-group id="common-command-attributes"/>   
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="text"/>				
-				<section id="action"/>
-				<section id="immediate"/>
-			</value>
-		</trait> 		 	
-        <entity id="blocking">
-             <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-    </entity>
-    <entity id="commandNavigationItem" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-		<include-entity-group id="common-command-attributes"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="text"/>				
-				<section id="action"/>
-				<section id="immediate"/>
-			</value>
-		</trait> 		
-        <entity id="destination"/>
-        <entity id="icon"/>   
-    	<entity id="selected">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-    	</entity>
-        <entity id="visited">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>        
-        </entity>
-        <entity id="targetFrame"/>
-    </entity>
-    <entity id="document" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<!-- <trait id="supported-facets">			
-			<value xsi:type="mdt:ListOfValues">
-				<item>metaContainer</item>					
-			</value> 	
-   		</trait> -->
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="mode"/>
-				<section id="initialFocusId"/>				
-			</value>
-		</trait>    		
-        <entity id="title">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-            </trait>
-        </entity>
-        <entity id="mode">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-            </trait>
-            <trait id="valid-values">
-				<value xsi:type="mdt:ListOfValues">
-					<item>default</item>
-					<item>strict</item>
-					<item>quirks</item>
-				</value>            
-            </trait>
-           	<trait id="default-value">
-           		<value>default</value>
-           	</trait>
-        </entity>        	
-        <entity id="onload">
-        	<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.ScriptType</value>
-			</trait>
-        	<trait id="category">
-           		<value>%property.category.event</value>
-           	</trait>
-        </entity>
-        <entity id="onunload">
-        	<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.ScriptType</value>
-			</trait>
-        	<trait id="category">
-           		<value>%property.category.event</value>
-           	</trait>
-        </entity>
-        <entity id="initialFocusId"/>
-    </entity>
-    <entity id="form" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="defaultCommand"/>				
-			</value>
-		</trait>     	
-        <entity id="targetFrame"/>
-        <entity id="usesUpload">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>        
-        </entity>
-        <entity id="defaultCommand"/>
-        <entity id="onsubmit">
-                	<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.ScriptType</value>
-			</trait>
-        	<trait id="category">
-           		<value>%property.category.event</value>
-           	</trait>
-        </entity>
-    </entity>
-    <entity id="goButton" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="text"/>	
-				<section id="textAndAccessKey"/>	
-				<section id="destination"/>								
-			</value>
-		</trait>       	
-        <entity id="destination"/>
-        <entity id="text"/>
-        <entity id="disabled">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-        <entity id="textAndAccessKey"/>
-        <entity id="accessKey">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.CharacterType</value>
-            </trait>
-        </entity>
-        <entity id="targetFrame"/>
-        <entity id="icon"/>
-    </entity>
-    <entity id="goLink" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="text"/>	
-				<section id="textAndAccessKey"/>	
-				<section id="destination"/>								
-			</value>
-		</trait>      	
-        <entity id="destination"/>
-        <entity id="text"/>
-        <entity id="disabled">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-        <entity id="textAndAccessKey"/>
-        <entity id="accessKey">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.CharacterType</value>
-            </trait>
-        </entity>
-        <entity id="targetFrame"/>
-    </entity>
-    <entity id="icon" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="name"/>								
-			</value>
-		</trait>  
-        <entity id="name"/>
-    </entity>
-    <entity id="image" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="source"/>		
-				<section id="shortDesc"/>						
-			</value>
-		</trait>      	
-        <entity id="source"/>
-        <entity id="longDescURL"/>
-        <entity id="imageMapType">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-            </trait>
-            <trait id="valid-values">
-				<value xsi:type="mdt:ListOfValues">
-					<item>none</item>
-					<item>server</item>
-				</value>            
-            </trait>
-        </entity>
-    </entity>
-    <entity id="importScript" type="tag">
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="names"/>								
-			</value>
-		</trait>      	
-        <entity id="names"/>
-    </entity>
-    <entity id="inputColor" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<include-entity-group id="common-value-holder-attributes"/>
-    	<include-entity-group id="common-input-tag-attributes"/>
-    	<include-entity-group id="common-text-attributes"/>
-    	<include-entity-group id="common-label-attributes"/>  
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="value"/>
-				<section id="label"/>								
-			</value>
-		</trait>      	
-    	<!-- <trait id="supported-facets">			
-			<value xsi:type="mdt:ListOfValues">
-				<item>help</item>					
-			</value> 	
-   		</trait>   -->             
-        <entity id="action">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.ActionType</value>
-            </trait>
-            <trait id="runtime-return-type">
-                <value>java.lang.String</value>
-            </trait>
-        </entity>
-        <entity id="actionListener">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.MethodBindingType</value>
-            </trait>
-            <trait id="runtime-return-type">
-                <value>void</value>
-            </trait>           
-            <trait id="runtime-param-types">
-                <value>javax.faces.event.ActionEvent</value>
-            </trait>
-        </entity>
-        <entity id="returnListener">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.MethodBindingType</value>
-            </trait>
-            <trait id="runtime-param-types">
-                <value>org.apache.myfaces.trinidad.event.ReturnEvent</value>
-            </trait>        
-        </entity>
-        <entity id="contentStyle">
-        	<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.pagedesigner.attributevalues.CSSStyleType</value>
-			</trait>
-			<trait id="category">
-				<value>%property.category.css</value>
-			</trait>	      
-        </entity>
-        <entity id="compact">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-        <entity id="chooseId">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.ComponentIDType</value>
-            </trait>
-        </entity>
-        <entity id="columns">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>
-        </entity>
-    </entity>
-    <entity id="inputDate" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<include-entity-group id="common-value-holder-attributes"/>
-    	<include-entity-group id="common-input-tag-attributes"/>    
-    	<include-entity-group id="common-text-attributes"/>
-    	<include-entity-group id="common-label-attributes"/>	
-    	<!-- <trait id="supported-facets">			
-			<value xsi:type="mdt:ListOfValues">
-				<item>help</item>					
-			</value> 	
-   		</trait> -->
-   		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="value"/>
-				<section id="label"/>									
-			</value>
-		</trait>  
-        <entity id="action">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.ActionType</value>
-            </trait>
-            <trait id="runtime-return-type">
-                <value>java.lang.String</value>
-            </trait>
-        </entity>
-        <entity id="actionListener">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.MethodBindingType</value>
-            </trait>
-            <trait id="runtime-return-type">
-                <value>void</value>
-            </trait>           
-            <trait id="runtime-param-types">
-                <value>javax.faces.event.ActionEvent</value>
-            </trait>
-        </entity>
-        <entity id="returnListener">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.MethodBindingType</value>
-            </trait>
-            <trait id="runtime-param-types">
-                <value>org.apache.myfaces.trinidad.event.ReturnEvent</value>
-            </trait>        
-        </entity>
-	    <entity id="contentStyle">
-	     	<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.pagedesigner.attributevalues.CSSStyleType</value>
-			</trait>
-			<trait id="category">
-				<value>%property.category.css</value>
-			</trait>	       
-	    </entity>
-        <entity id="chooseId"/>
-        <entity id="columns">
-	     	<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-			</trait>        
-        </entity>
-        <entity id="maximumLength">
-	     	<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-			</trait>        
-        </entity>
-    </entity>
-    <entity id="inputFile" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<include-entity-group id="common-value-holder-attributes"/>
-    	<include-entity-group id="common-input-tag-attributes"/>    
-    	<include-entity-group id="common-text-attributes"/>
-    	<include-entity-group id="common-label-attributes"/>	
-    	<!-- <trait id="supported-facets">			
-			<value xsi:type="mdt:ListOfValues">
-				<item>help</item>					
-			</value> 	
-   		</trait> -->
-   		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="value"/>
-				<section id="label"/>									
-			</value>
-		</trait>    		    	
-        <entity id="contentStyle">
-        	<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.pagedesigner.attributevalues.CSSStyleType</value>
-			</trait>
-			<trait id="category">
-				<value>%property.category.css</value>
-			</trait>	       
-        </entity>
-        <entity id="columns">
-	     	<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-			</trait>        
-        </entity>
-    </entity>
-    <entity id="inputHidden" type="tag">
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<include-entity-group id="common-value-holder-attributes"/>
-    	<include-entity-group id="common-input-tag-attributes"/>   
-   		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="value"/>											
-			</value>
-		</trait>     	 	
-    </entity>
-    <entity id="inputListOfValues" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<include-entity-group id="common-value-holder-attributes"/>
-    	<include-entity-group id="common-input-tag-attributes"/> 
-    	<include-entity-group id="common-text-attributes"/>
-    	<include-entity-group id="common-label-attributes"/>
-    	<!-- <trait id="supported-facets">			
-			<value xsi:type="mdt:ListOfValues">
-				<item>help</item>					
-			</value> 	
-   		</trait> -->
-   		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="value"/>
-				<section id="label"/>
-				<section id="action"/>
-				<section id="searchDesc"/>
-				<section id="columns"/>									
-			</value>
-		</trait>      	
-        <entity id="action">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.ActionType</value>
-            </trait>
-            <trait id="runtime-return-type">
-                <value>java.lang.String</value>
-            </trait>
-        </entity>
-        <entity id="actionListener">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.MethodBindingType</value>
-            </trait>
-            <trait id="runtime-param-types">
-                <value>javax.faces.event.ActionEvent</value>
-            </trait>
-        </entity>
-        <entity id="returnListener">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.MethodBindingType</value>
-            </trait>
-            <trait id="runtime-param-types">
-                <value>org.apache.myfaces.trinidad.event.ReturnEvent</value>
-            </trait>        
-        </entity>
-       <entity id="contentStyle">
-        	<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.pagedesigner.attributevalues.CSSStyleType</value>
-			</trait>
-			<trait id="category">
-				<value>%property.category.css</value>
-			</trait>	       
-       </entity>
-        <entity id="searchDesc"/>
-        <entity id="icon"/>
-        <entity id="columns">
-	     	<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-			</trait>        
-        </entity>
-        <entity id="maximumLength">
-	     	<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-			</trait>        
-        </entity>
-        <entity id="windowWidth">
-	     	<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-			</trait>        
-        </entity>
-        <entity id="windowHeight">
-	     	<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-			</trait>        
-        </entity>
-    </entity>
-    <entity id="inputNumberSpinbox" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<include-entity-group id="common-value-holder-attributes"/>
-    	<include-entity-group id="common-input-tag-attributes"/>  
-    	<include-entity-group id="common-text-attributes"/>
-    	<include-entity-group id="common-label-attributes"/>    	 
-    	<!-- <trait id="supported-facets">			
-			<value xsi:type="mdt:ListOfValues">
-				<item>help</item>					
-			</value> 			
-   		</trait>  	-->
-   		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="value"/>
-				<section id="label"/>
-				<section id="minimum"/>
-				<section id="maximum"/>
-				<section id="stepSize"/>
-				<section id="onclick"/>									
-			</value>
-		</trait>      	   		
-        <entity id="contentStyle">
-        	<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.pagedesigner.attributevalues.CSSStyleType</value>
-			</trait>
-			<trait id="category">
-				<value>%property.category.css</value>
-			</trait>	       
-        </entity>
-        <entity id="columns">
-	     	<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-			</trait>        
-        </entity>
-        <entity id="maximum">
-	     	<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-			</trait>        
-        </entity>
-        <entity id="minimum">
-	     	<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-			</trait>        
-        </entity>
-        <entity id="stepSize">
-	     	<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-			</trait>        
-        </entity>
-        <entity id="styleClass">
-	     	<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-			</trait>        
-			<trait id="valid-values">
-			 	<value xsi:type="mdt:ListOfValues">
-					<item>AFFieldTextMarker</item>
-					<item>AFFieldTextLTRMarker</item>
-					<item>AFFieldNumberMarker</item>							
-				</value>
-			</trait>
-        </entity>        
-    </entity>
-    <entity id="inputText" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<include-entity-group id="common-value-holder-attributes"/>
-    	<include-entity-group id="common-input-tag-attributes"/>
-    	<include-entity-group id="common-text-attributes"/>
-    	<include-entity-group id="common-label-attributes"/>
-    	<!-- <trait id="supported-facets">			
-			<value xsi:type="mdt:ListOfValues">
-				<item>help</item>					
-			</value> 	
-   		</trait> -->
-   		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="value"/>
-				<section id="label"/>
-				<section id="showRequired"/>
-				<section id="secret"/>				
-				<section id="autoSubmit"/>
-				<section id="immediate"/>
-			</value>
-		</trait>   		    	    	
-       	<entity id="contentStyle">
-        	<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.pagedesigner.attributevalues.CSSStyleType</value>
-			</trait>
-			<trait id="category">
-				<value>%property.category.css</value>
-			</trait>	       
-       	</entity>
-        <entity id="rows">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>
-            <trait id="valid-minimum">
-                <value>1</value>
-            </trait>
-        </entity>
-        <entity id="wrap">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-            </trait> 
-             <trait id="valid-values">
-				<value xsi:type="mdt:ListOfValues">
-					<item>off</item>
-					<item>soft</item>
-					<item>hard</item>							
-				</value>
-			</trait>    
-		    <trait id="default-value">
-                <value>soft</value>
-            </trait> 
-        </entity>
-        <entity id="secret">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>        
-        </entity>
-        <entity id="columns">
-	     	<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-			</trait>        
-        </entity>
-        <entity id="maximumLength">
-	     	<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-			</trait>        
-        </entity>
-        <entity id="styleClass">
-	     	<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-			</trait>        
-			<trait id="valid-values">
-			 	<value xsi:type="mdt:ListOfValues">
-			 		<item>AFDataText</item>
-					<item>AFFieldTextMarker</item>
-					<item>AFFieldTextLTRMarker</item>
-					<item>AFPhoneFieldTextMarker</item>							
-					<item>AFPostalCodeFieldTextMarker</item>
-					<item>AFAddressFieldTextMarker</item>
-					<item>AFFieldNumberMarker</item>	
-				</value>
-			</trait>
-        </entity> 
-    </entity>
-    <entity id="legend" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="name"/>
-			</value>
-		</trait>  
-        <entity id="name">
-        	<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-			</trait>        
-			<trait id="valid-values">
-			 	<value xsi:type="mdt:ListOfValues">
-					<item>required</item>
-				</value>
-			</trait>
-			<trait id="default-value">
-			 	<value>required</value>
-			</trait>
-		</entity>			
-    </entity>
-    <entity id="media" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="source"/>
-				<section id="shortDesc"/>
-				<section id="innerWidth"/>
-				<section id="innerHeight"/>				
-				<section id="autoStart"/>
-				<section id="controls"/>
-				<section id="player"/>
-			</value>
-		</trait>  
-        <entity id="width">
-            <trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-			</trait>   
-		</entity>
-        <entity id="height">
-            <trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-			</trait>   
-		</entity>
-        <entity id="innerWidth">
-            <trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-			</trait>   
-		</entity>
-        <entity id="innerHeight">
-            <trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-			</trait>   
-		</entity>
-        <entity id="source"/>
-        <entity id="autostart">
-            <trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-			</trait>   
-		</entity>
-        <entity id="playCount">
-            <trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-			</trait>   
-		</entity>
-        <entity id="contentType">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.ContentType</value>
-            </trait>
-        </entity>
-        <entity id="standbyText"/>
-        <entity id="player">
-        	<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-			</trait>           
-			<trait id="valid-values">
-			 	<value xsi:type="mdt:ListOfValues">			
-					<item>windows</item>
-					<item>quicktime</item>
-					<item>link</item>
-					<item>real</item>
-				</value>
-			</trait>        
-        </entity>
-        <entity id="controls">
-        	<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-			</trait>           
-			<trait id="valid-values">
-			 	<value xsi:type="mdt:ListOfValues">			
-					<item>none</item>
-					<item>noneVisible</item>
-					<item>minimal</item>
-					<item>typical</item>
-					<item>all</item>
-				</value>
-			</trait>    
-			<trait id="default-value">
-				<value>typical</value>
-			</trait>    
-        </entity>
-    </entity>
-    <entity id="message" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<!-- <trait id="supported-facets">			
-			<value xsi:type="mdt:ListOfValues">
-				<item>help</item>					
-			</value> 	
-   		</trait>   -->
-     	<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="for"/>
-				<section id="binding"/>
-				<section id="messageType"/>
-				<section id="inlineStyle"/>		
-			</value>
-		</trait>   		    	
-        <entity id="for"/>
-        <entity id="message"/>
-        <entity id="messageType">
-        	<trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-            </trait>
-			<trait id="valid-values">
-			 	<value xsi:type="mdt:ListOfValues">
-					<item>info</item>
-					<item>confirmation</item>
-					<item>warning</item>
-					<item>none</item>
-					<item>error</item>					
-				</value>
-			</trait>
-        </entity>
-
-    </entity>
-    <entity id="messages" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>				
-				<section id="inlineStyle"/>
-				<section id="layout"/>			
-			</value>
-		</trait>  
-        <entity id="message"/>
-        <entity id="text"/>
-        <entity id="globalOnly">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>		
-    </entity>
-    <entity id="navigationPane" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<!-- <trait id="supported-facets">			
-			<value xsi:type="mdt:ListOfValues">
-				<item>nodeStamp</item>					
-			</value> 	
-   		</trait> -->
-    	<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>				
-				<section id="hint"/>		
-			</value>
-		</trait>     		    	
-        <entity id="var"/>
-        <entity id="value">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.ValueBindingType</value>
-            </trait>
-            <trait id="runtime-return-type">
-                <value>org.apache.myfaces.trinidad.model.MenuModel</value>
-            </trait>
-        </entity>
-        <entity id="level">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>
-            <trait id="valid-minimum">
-            	<value>0</value>
-            </trait>
-        </entity>
-        <entity id="varStatus"/>
-        <entity id="disabled">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-        <entity id="hint">
-        	<trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-            </trait>
-			<trait id="valid-values">
-			 	<value xsi:type="mdt:ListOfValues">			
-					<item>bar</item>
-					<item>buttons</item>
-					<item>choice</item>
-					<item>list</item>
-					<item>tabs</item>
-				</value>
-			</trait>           
-        </entity>
-        <entity id="title"/>
-    </entity>
-    <entity id="navigationTree" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<!-- <trait id="supported-facets">			
-			<value xsi:type="mdt:ListOfValues">
-				<item>nodeStamp</item>					
-			</value> 	
-   		</trait> -->
-   		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>				
-				<section id="value"/>
-				<section id="var"/>			
-			</value>
-		</trait>       	
-        <entity id="var"/>
-        <entity id="rowDisclosureListener">            
-        	<trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.MethodBindingType</value>
-            </trait>
-            <trait id="runtime-param-types">
-                <value>org.apache.myfaces.trinidad.event.RowDisclosureEvent</value>
-            </trait>
-        </entity>
-        <entity id="disclosedRowKeys"/>
-        <entity id="value">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.ValueBindingType</value>
-            </trait>
-            <trait id="runtime-return-type">
-                <value>org.apache.myfaces.trinidad.model.MenuModel</value>
-            </trait>
-        </entity>
-        <entity id="startLevel">
-           <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>
-            <trait id="valid-minimum">
-            	<value>0</value>
-            </trait>
-        </entity>        
-        <entity id="varStatus"/>
-        <entity id="immediate">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-    </entity>
-    <entity id="outputDocument" type="tag">
-    	<include-entity-group id="common-event-attributes"/>        
-    	<include-entity-group id="common-value-holder-attributes"/>
-    	<!-- <trait id="supported-facets">			
-			<value xsi:type="mdt:ListOfValues">
-				<item>nodeStamp</item>					
-			</value> 	
-   		</trait> -->
-    	<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>				
-				<section id="value"/>				
-			</value>
-		</trait>     		      	
-        <entity id="titleClass">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.pagedesigner.attributevalues.CSSStyleType</value>
-            </trait>
-        </entity>
-        <entity id="separatorClass">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.pagedesigner.attributevalues.CSSStyleType</value>
-            </trait>
-        </entity>
-    </entity>
-    <entity id="outputFormatted" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<include-entity-group id="common-value-holder-attributes"/>
-    	<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>				
-				<section id="value"/>
-				<section id="styleUsage"/>			
-			</value>
-		</trait>      	
-        <entity id="styleUsage">        	
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-			</trait>
-			<trait id="valid-values">
-				<value xsi:type="mdt:ListOfValues">
-					<item>pageStamp</item>
-					<item>instruction</item>
-					<item>inContextBranding</item>
-				</value>
-			</trait>
-			<trait id="category">
-				<value>%property.category.css</value>
-			</trait>					
-        </entity>
-    </entity>
-    <entity id="outputLabel" type="tag">
-		<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<include-entity-group id="common-value-holder-attributes"/>
-    	<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>				
-				<section id="value"/>
-				<section id="for"/>			
-			</value>
-		</trait>      	
-        <entity id="accessKey">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.CharacterType</value>
-            </trait>
-        </entity>
-        <entity id="showRequired">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-        <entity id="valueAndAccessKey"/>
-        <entity id="for"/>
-    </entity>
-    <entity id="outputText" type="tag">
-		<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<include-entity-group id="common-value-holder-attributes"/>
-    	<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>				
-				<section id="value"/>					
-			</value>
-		</trait>      	
-        <entity id="truncateAt"/>
-        <entity id="description"/>
-        <entity id="escape">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-    </entity>
-    <entity id="page" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<!-- <trait id="supported-facets">			
-			<value xsi:type="mdt:ListOfValues">
-				<item>actions</item>
-				<item>appAbout</item>
-				<item>appCopyright</item>
-				<item>appPrivacy</item>
-				<item>branding</item>
-				<item>brandingApp</item>
-				<item>brandingAppContextual</item>
-				<item>contextSwitcher</item>
-				<item>infoFootnote</item>
-				<item>infoReturn</item>
-				<item>infoStatus</item>
-				<item>infoSupplemental</item>
-				<item>infoUser</item>
-				<item>location</item>
-				<item>menuSwitch</item>
-				<item>messages</item>
-				<item>nodeStamp</item>
-				<item>search</item>	
-			</value> 	
-   		</trait>  -->
-    	<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>				
-				<section id="value"/>
-				<section id="var"/>			
-			</value>
-		</trait>     		     	
-        <entity id="var"/>
-        <entity id="rowDisclosureListener">            
-        	<trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.MethodBindingType</value>
-            </trait>
-            <trait id="runtime-param-types">
-                <value>org.apache.myfaces.trinidad.event.RowDisclosureEvent</value>
-            </trait>
-        </entity>
-        <entity id="disclosedRowKeys"/>
-        <entity id="value">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.ValueBindingType</value>
-            </trait>
-            <trait id="runtime-return-type">
-                <value>org.apache.myfaces.trinidad.model.MenuModel</value>
-            </trait>
-        </entity>
-        <entity id="varStatus"/>
-        <entity id="immediate">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-        <entity id="chromeType">
-         	<trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-            </trait>
-			<trait id="valid-values">
-			 	<value xsi:type="mdt:ListOfValues">
-					<item>compact</item>
-					<item>expanded</item>
-				</value>
-			</trait>
-        </entity>
-    </entity>
-    <entity id="panelAccordion" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>				
-				<section id="discloseNone"/>
-				<section id="discloseMany"/>
-			</value>
-		</trait>      	
-        <entity id="discloseNone">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-        <entity id="discloseMany">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-    </entity>
-    <entity id="panelBorderLayout" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<!-- <trait id="supported-facets">			
-			<value xsi:type="mdt:ListOfValues">
-				<item>bottom</item>
-				<item>end</item>
-				<item>innerBottom</item>
-				<item>innerEnd</item>
-				<item>innerLeft</item>
-				<item>innerRight</item>
-				<item>innerStart</item>
-				<item>innerTop</item>
-				<item>left</item>
-				<item>right</item>
-				<item>start</item>
-				<item>top</item>
-			</value> 	
-   		</trait>   -->
-    	<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>						
-			</value>
-		</trait>     		  	        
-    </entity>
-    <entity id="panelBox" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>				
-				<section id="text"/>
-				<section id="background"/>			
-			</value>
-		</trait>      	
-        <entity id="text"/>
-        <entity id="background">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-            </trait>
-			<trait id="valid-values">
-			 	<value xsi:type="mdt:ListOfValues">
-					<item>light</item>
-					<item>medium</item>
-					<item>dark</item>
-					<item>transparent</item>							
-				</value>
-			</trait>
-        </entity>
-        <entity id="icon"/>
-       	<entity id="contentStyle">
-        	<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.pagedesigner.attributevalues.CSSStyleType</value>
-			</trait>
-			<trait id="category">
-				<value>%property.category.css</value>
-			</trait>	       
-       	</entity>
-    </entity>
-    <entity id="panelButtonBar" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>								
-				<section id="halign"/>			
-			</value>
-		</trait>      	
-        <entity id="halign">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-            </trait>
-			<trait id="valid-values">
-			 	<value xsi:type="mdt:ListOfValues">
-					<item>right</item>
-					<item>left</item>
-					<item>start</item>
-					<item>end</item>
-					<item>center</item>					
-				</value>
-			</trait>
-        </entity>
-    </entity>
-    <entity id="panelCaptionGroup" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<!-- <trait id="supported-facets">			
-			<value xsi:type="mdt:ListOfValues">
-				<item>caption</item>
-			</value>
-		</trait>     	-->
-    	<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>				
-				<section id="captionText"/>						
-			</value>
-		</trait>  		
-        <entity id="captionText"/>
-    </entity>
-    <entity id="panelChoice" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>				
-				<section id="label"/>
-				<section id="labelAndAccessKey"/>
-				<section id="position"/>			
-			</value>
-		</trait>     
-        <entity id="label"/>
-        <entity id="accessKey">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.CharacterType</value>
-            </trait>
-        </entity>
-        <entity id="labelAndAccessKey"/>
-        <entity id="position">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-            </trait>
-			<trait id="valid-values">
-			 	<value xsi:type="mdt:ListOfValues">
-					<item>top</item>
-					<item>start</item>				
-				</value>
-			</trait>
-			<trait id="default-value">
-				<value>start</value>
-			</trait>
-        </entity>
-        <entity id="alignment">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-            </trait>
-			<trait id="valid-values">
-			 	<value xsi:type="mdt:ListOfValues">
-					<item>top</item>
-					<item>bottom</item>
-					<item>start</item>
-					<item>end</item>
-					<item>center</item>					
-				</value>
-			</trait>
-			<trait id="default-value">
-				<value>center</value>
-			</trait>
-        </entity>
-    </entity>
-    <entity id="panelFormLayout" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<!-- <trait id="supported-facets">			
-			<value xsi:type="mdt:ListOfValues">
-				<item>footer</item>
-			</value>
-		</trait> -->
-    	<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>								
-				<section id="labelWidth"/>		
-				<section id="fieldWidth"/>
-				<section id="rows"/>	
-			</value>
-		</trait>  		     	
-        <entity id="fieldWidth">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.LengthType</value>
-            </trait>
-        </entity>
-        <entity id="labelWidth">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.LengthType</value>
-            </trait>
-        </entity>
-        <entity id="maxColumns">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>
-        </entity>
-        <entity id="rows">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>
-        </entity>
-    </entity>
-    <entity id="panelGroupLayout" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<!-- <trait id="supported-facets">			
-			<value xsi:type="mdt:ListOfValues">
-				<item>separator</item>
-			</value>
-		</trait>        -->	
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>				
-				<section id="layout"/>
-			</value>
-		</trait>
-        <entity id="layout">
-        	<trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-            </trait>
-			<trait id="valid-values">
-			 	<value xsi:type="mdt:ListOfValues">
-					<item>default</item>
-					<item>horizontal</item>
-					<item>vertical</item>				
-				</value>
-			</trait>
-        </entity>
-    </entity>
-    <entity id="panelHeader" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>				
-				<section id="text"/>
-			</value>
-		</trait>    	
-        <entity id="text"/>
-        <entity id="icon"/>
-        <entity id="messageType">
-        	<trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-            </trait>
-			<trait id="valid-values">
-			 	<value xsi:type="mdt:ListOfValues">
-					<item>info</item>
-					<item>confirmation</item>
-					<item>warning</item>
-					<item>none</item>
-					<item>error</item>					
-				</value>
-			</trait>
-        </entity>
-        <entity id="size">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>
-            <trait id="default-value">
-            	<value>-1</value>
-            </trait>
-        </entity>
-    </entity>
-    <entity id="panelHorizontalLayout" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<!-- <trait id="supported-facets">			
-			<value xsi:type="mdt:ListOfValues">
-				<item>separator</item>
-			</value>
-		</trait> -->
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>				
-				<section id="halign"/>
-				<section id="valign"/>
-			</value>
-		</trait>       	
-        <entity id="valign">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-            </trait>
-            <trait id="valid-values">
-                <value xsi:type="mdt:ListOfValues">
-                    <item>top</item>
-                    <item>middle</item>
-                    <item>bottom</item>
-                    <item>baseline</item>
-                </value>
-            </trait>
-        </entity>
-        <entity id="halign">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-            </trait>
-            <trait id="valid-values">
-                <value xsi:type="mdt:ListOfValues">
-                    <item>right</item>
-                    <item>left</item>
-                    <item>start</item>
-                    <item>end</item>
-                    <item>center</item>
-                </value>
-            </trait>
-        </entity>
-    </entity>
-    <entity id="panelLabelAndMessage" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<!-- <trait id="supported-facets">			
-			<value xsi:type="mdt:ListOfValues">
-				<item>end</item>
-				<item>help</item>
-			</value>
-		</trait> -->
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>			
-				<section id="for"/>	
-				<section id="label"/>
-				<section id="message"/>
-			</value>
-		</trait>     	
-        <entity id="showRequired">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>        
-        </entity>
-        <entity id="label"/>
-        <entity id="labelStyle">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.pagedesigner.attributevalues.CSSStyleType</value>
-            </trait>        
-        </entity>
-        <entity id="accessKey">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.CharacterType</value>
-            </trait>        
-        </entity>
-        <entity id="labelAndAccessKey"/>
-        <entity id="for"/>
-    </entity>
-    <entity id="panelList" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-     	<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>				
-				<section id="rows"/>
-				<section id="maxColumns"/>		
-			</value>
-		</trait>      	
-        <entity id="listStyle"/>
-        <entity id="rows">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>
-        </entity>
-        <entity id="maxColumns">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>
-        </entity>
-    </entity>
-    <entity id="panelPage" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<!-- <trait id="supported-facets">			
-			<value xsi:type="mdt:ListOfValues">
-				<item>appAbout</item>
-				<item>appCopyright</item>
-				<item>appPrivacy</item>
-				<item>auxiliary1</item>
-				<item>auxiliary2</item>
-				<item>auxiliaryGlobal</item>
-				<item>branding</item>
-				<item>contextGlobal</item>
-				<item>contextLocal</item>
-				<item>infoFootnote</item>
-				<item>infoReturn</item>
-				<item>infoStatus</item>
-				<item>infoUser</item>
-				<item>location</item>
-				<item>navigation1</item>
-				<item>navigation2</item>
-				<item>navigation3</item>
-				<item>navigationGlobal</item>
-				<item>search</item>	
-				<item>toolbar1</item>
-				<item>toolbar2</item>
-				<item>toolbarGlobal</item>
-			</value> 	
-   		</trait> -->
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-			</value>
-		</trait>  
-        <entity id="auxiliary1Size">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>        
-        </entity>
-        <entity id="auxiliary2Size">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>        
-        </entity>
-        <entity id="auxiliaryGlobalSize">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>        
-        </entity>
-    </entity>
-    <entity id="panelPageHeader" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<!-- <trait id="supported-facets">			
-			<value xsi:type="mdt:ListOfValues">
-				<item>branding</item>
-				<item>brandingApp</item>
-				<item>brandingAppContextual</item>
-				<item>menuSwitch</item>
-				<item>navigation1</item>
-				<item>navigation2</item>
-				<item>navigationGlobal</item>
-				<item>search</item>	
-			</value> 	
-   		</trait> -->
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="chromeType"/>				
-			</value>
-		</trait>     		    	 	
-        <entity id="chromeType">
-         	<trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-            </trait>
-			<trait id="valid-values">
-			 	<value xsi:type="mdt:ListOfValues">
-					<item>compact</item>
-					<item>expanded</item>
-				</value>
-			</trait>
-        </entity>
-    </entity>
-    <entity id="panelPopup" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<!-- <trait id="supported-facets">			
-			<value xsi:type="mdt:ListOfValues">
-				<item>trigger</item>
-			</value>
-		</trait>   -->
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="text"/>
-				<section id="triggerType"/>	
-				<section id="position"/>
-				<section id="modal"/>	
-				<section id="height"/>
-				<section id="width"/>	
-			</value>
-		</trait>  	
-        <entity id="triggerType">
-         	<trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-            </trait>
-			<trait id="valid-values">
-			 	<value xsi:type="mdt:ListOfValues">
-					<item>click</item>
-					<item>hover</item>
-				</value>
-			</trait>
-        </entity>
-        <entity id="icon"/>
-        <entity id="text"/>
-        <entity id="title"/>
-        <entity id="modal">
-         	<trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>        
-        </entity>
-        <entity id="position">
-         	<trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-            </trait>
-			<trait id="valid-values">
-			 	<value xsi:type="mdt:ListOfValues">
-					<item>relative</item>
-					<item>centered</item>
-				</value>
-			</trait>
-        </entity>
-        <entity id="xoffset">
-         	<trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>        
-        </entity>
-        <entity id="yoffset">
-         	<trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>        
-        </entity>
-       <entity id="contentStyle">
-        	<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.pagedesigner.attributevalues.CSSStyleType</value>
-			</trait>
-			<trait id="category">
-				<value>%property.category.css</value>
-			</trait>	       
-       </entity>
-        <entity id="width">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>
-        </entity>
-        <entity id="height">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>
-        </entity>
-    </entity>
-    <entity id="panelRadio" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="label"/>
-				<section id="alignment"/>	
-				<section id="position"/>	
-			</value>
-		</trait>      	
-        <entity id="position">
-         	<trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-            </trait>
-			<trait id="valid-values">
-			 	<value xsi:type="mdt:ListOfValues">
-					<item>top</item>
-					<item>start</item>
-				</value>
-			</trait>
-        </entity>
-        <entity id="alignment">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-            </trait>
-			<trait id="valid-values">
-			 	<value xsi:type="mdt:ListOfValues">
-					<item>top</item>
-					<item>bottom</item>
-					<item>start</item>
-					<item>end</item>
-					<item>center</item>					
-				</value>
-			</trait>
-			<trait id="default-value">
-				<value>center</value>
-			</trait>
-        </entity>
-    </entity>
-    <entity id="panelSideBar" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<!-- <trait id="supported-facets">			
-			<value xsi:type="mdt:ListOfValues">
-				<item>filter</item>
-			</value> 	
-   		</trait> -->
-   		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="width"/>	
-			</value>
-		</trait>  
-        <entity id="width">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.LengthType</value>
-            </trait>
-        </entity>
-    </entity>
-    <entity id="panelTabbed" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="position"/>
-			</value>
-		</trait>
-        <entity id="position">
-         	<trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-            </trait>
-			<trait id="valid-values">
-			 	<value xsi:type="mdt:ListOfValues">
-					<item>above</item>
-					<item>below</item>
-					<item>both</item>
-				</value>
-			</trait>
-			<trait id="default-value">
-				<value>both</value>
-			</trait>
-        </entity>
-    </entity>
-    <entity id="panelTip" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-			</value>
-		</trait>  
-    </entity>
-    <entity id="poll" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="interval"/>
-				<section id="pollListener"/>						
-			</value>
-		</trait>      	
-        <entity id="immediate">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-        <entity id="pollListener">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.MethodBindingType</value>
-            </trait>
-            <trait id="runtime-return-type">
-                <value>void</value>
-            </trait>           
-            <trait id="runtime-param-types">
-                <value>org.apache.myfaces.trinidad.event.PollEvent</value>
-            </trait>        
-        </entity>
-        <entity id="interval">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>
-            <trait id="value-minimum">
-            	<value>1</value>
-            </trait>
-        </entity>
-    </entity>
-    <entity id="processChoiceBar" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<!-- <trait id="supported-facets">			
-			<value xsi:type="mdt:ListOfValues">
-				<item>nodeStamp</item>					
-			</value> 	
-   		</trait> -->
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="value"/>
-				<section id="var"/>	
-				<section id="shortDesc"/>	
-			</value>
-		</trait>     		    	
-        <entity id="var"/>
-        <entity id="value">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.ValueBindingType</value>
-            </trait>
-            <trait id="runtime-return-type">
-                <value>org.apache.myfaces.trinidad.model.MenuModel</value>
-            </trait>
-        </entity>
-        <entity id="varStatus"/>
-    </entity>
-    <entity id="progressIndicator" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="value"/>
-				<section id="action"/>					
-			</value>
-		</trait>      	
-        <entity id="value">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.ValueBindingType</value>
-            </trait>
-            <trait id="runtime-return-type">
-                <value>org.apache.myfaces.trinidad.model.BoundedRangeModel</value>
-            </trait>
-        </entity>
-        <entity id="action">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.ActionType</value>
-            </trait>
-            <trait id="runtime-return-type">
-                <value>java.lang.String</value>
-            </trait>
-        </entity>
-        <entity id="actionListener">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.MethodBindingType</value>
-            </trait>
-            <trait id="runtime-return-type">
-                <value>void</value>
-            </trait>           
-            <trait id="runtime-param-types">
-                <value>javax.faces.event.ActionEvent</value>
-            </trait>
-        </entity>
-        <entity id="immediate">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-    </entity>
-    <entity id="resetButton" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="text"/>
-				<section id="accessKey"/>	
-				<section id="disabled"/>	
-			</value>
-		</trait>      	
-        <entity id="text"/>
-        <entity id="disabled">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-        <entity id="textAndAccessKey"/>
-        <entity id="accessKey">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.CharacterType</value>
-            </trait>
-        </entity>
-    </entity>
-    <entity id="selectBooleanCheckbox" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<include-entity-group id="common-value-holder-attributes"/>
-    	<include-entity-group id="common-input-tag-attributes"/>
-    	<include-entity-group id="common-select-tag-attributes"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="value"/>
-				<section id="text"/>	
-				<section id="label"/>	
-			</value>
-		</trait>      	
-    	<!-- <trait id="supported-facets">			
-			<value xsi:type="mdt:ListOfValues">
-				<item>help</item>
-			</value> 	
-   		</trait>   -->   	
-    	<entity id="selected">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-    	</entity>
-     </entity>
-    <entity id="selectBooleanRadio" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<include-entity-group id="common-value-holder-attributes"/>
-    	<include-entity-group id="common-input-tag-attributes"/>
-    	<include-entity-group id="common-select-tag-attributes"/>
-    	<trait id="supported-facets">			
-			<value xsi:type="mdt:ListOfValues">
-				<item>help</item>
-			</value> 	
-   		</trait> 
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="value"/>
-				<section id="text"/>	
-				<section id="label"/>	
-				<section id="selected"/>
-				<section id="group"/>
-			</value>
-		</trait>    		      	
-    	<entity id="selected">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-    	</entity>
-        <entity id="group"/>
-    </entity>
-    <entity id="selectItem" type="tag">
-    	<include-entity-group id="common-core-attributes"/>  
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="value"/>
-				<section id="label"/>					
-			</value>
-		</trait>     	  	
-        <entity id="value">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.ValueBindingType</value>
-            </trait>
-            <trait id="runtime-return-type">
-                <value>java.lang.Object</value>
-            </trait>
-        </entity>
-        <entity id="label"/>
-        <entity id="disabled">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-        <entity id="longDesc"/>
-        <entity id="shortDesc"/>
-    </entity>
-    <entity id="selectManyCheckbox" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<include-entity-group id="common-value-holder-attributes"/>
-    	<include-entity-group id="common-input-tag-attributes"/>
-    	<include-entity-group id="common-select-tag-attributes"/>
-    	<include-entity-group id="common-label-attributes"/>
-    	<!-- <trait id="supported-facets">			
-			<value xsi:type="mdt:ListOfValues">
-				<item>help</item>
-			</value> 	
-   		</trait> -->
-   		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="value"/>
-				<section id="label"/>	
-				<section id="valueChangeListener"/>	
-			</value>
-		</trait>       	
-        <entity id="layout">
-        	<trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-            </trait>        	
-        	<trait id="valid-values">
-				<value xsi:type="mdt:ListOfValues">
-					<item>horizontal</item>
-					<item>vertical</item>					
-				</value>
-			</trait>
-		</entity>
-    </entity>
-    <entity id="selectManyListbox" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<include-entity-group id="common-value-holder-attributes"/>
-    	<include-entity-group id="common-input-tag-attributes"/>
-    	<include-entity-group id="common-select-tag-attributes"/>
-    	<include-entity-group id="common-label-attributes"/>
-    	<!-- <trait id="supported-facets">			
-			<value xsi:type="mdt:ListOfValues">
-				<item>help</item>
-			</value> 	
-   		</trait> -->
-   		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="value"/>
-				<section id="label"/>	
-				<section id="valueChangeListener"/>	
-			</value>
-		</trait>       	
-        <entity id="size">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>
-            <trait id="valid-minimum">
-                <value>1</value>
-            </trait>
-        </entity>                  
-    </entity>
-    <entity id="selectManyShuttle" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<include-entity-group id="common-value-holder-attributes"/>
-    	<include-entity-group id="common-input-tag-attributes"/>
-    	<include-entity-group id="common-select-tag-attributes"/>
-    	<include-entity-group id="common-label-attributes"/>
-    	<!-- <trait id="supported-facets">			
-			<value xsi:type="mdt:ListOfValues">
-				<item>filter</item>
-				<item>leadingFooter</item>
-				<item>trailingFooter</item>
-			</value> 	
-   		</trait> -->
-   		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="value"/>
-				<section id="label"/>
-				<section id="leadingHeader"/>
-				<section id="trailingHeader"/>		
-				<section id="valueChangeListener"/>	
-			</value>
-		</trait>       	     	
-        <entity id="size">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>
-            <trait id="valid-minimum">
-                <value>10</value>
-            </trait>
-            <trait id="valid-maximum">
-                <value>20</value>
-            </trait>            
-        </entity>
-        <entity id="leadingHeader"/>
-        <entity id="trailingHeader"/>
-        <entity id="leadingDescShown">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-        <entity id="trailingDescShown">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-    </entity>
-    <entity id="selectOneChoice" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<include-entity-group id="common-value-holder-attributes"/>
-    	<include-entity-group id="common-input-tag-attributes"/>
-    	<include-entity-group id="common-select-tag-attributes"/>       
-    	<include-entity-group id="common-label-attributes"/>
-    	<!-- <trait id="supported-facets">			
-			<value xsi:type="mdt:ListOfValues">
-				<item>help</item>
-			</value> 	
-   		</trait> -->
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="label"/>
-				<section id="unselectedLabel"/>	
-				<section id="valueChangeListener"/>	
-			</value>
-		</trait>    		     	
-    </entity>
-    <entity id="selectOneListbox" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-     	<include-entity-group id="common-value-holder-attributes"/>
-    	<include-entity-group id="common-input-tag-attributes"/>
-    	<include-entity-group id="common-select-tag-attributes"/>
-    	<include-entity-group id="common-text-attributes"/>
-    	<include-entity-group id="common-label-attributes"/>   
-    	<!-- <trait id="supported-facets">			
-			<value xsi:type="mdt:ListOfValues">
-				<item>help</item>
-			</value> 	
-   		</trait> -->
-   		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="label"/>
-				<section id="unselectedLabel"/>	
-				<section id="valueChangeListener"/>	
-			</value>
-		</trait>      	     
-    </entity>
-    <entity id="selectOneRadio" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<include-entity-group id="common-value-holder-attributes"/>
-    	<include-entity-group id="common-input-tag-attributes"/>
-    	<include-entity-group id="common-select-tag-attributes"/>
-    	<include-entity-group id="common-text-attributes"/>
-    	<include-entity-group id="common-label-attributes"/>     
-    	<!-- <trait id="supported-facets">			
-			<value xsi:type="mdt:ListOfValues">
-				<item>help</item>
-			</value> 	
-   		</trait> -->
-   		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="label"/>
-				<section id="unselectedLabel"/>	
-				<section id="valueChangeListener"/>	
-			</value>
-		</trait>   
-        <entity id="layout">
-        	<trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-            </trait>        	
-        	<trait id="valid-values">
-				<value xsi:type="mdt:ListOfValues">
-					<item>horizontal</item>
-					<item>vertical</item>					
-				</value>
-			</trait>
-		</entity>
-    </entity>
-    <entity id="selectOrderShuttle" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<include-entity-group id="common-value-holder-attributes"/>
-    	<include-entity-group id="common-input-tag-attributes"/>
-    	<include-entity-group id="common-select-tag-attributes"/>
-    	<include-entity-group id="common-label-attributes"/>
-    	<!-- <trait id="supported-facets">			
-			<value xsi:type="mdt:ListOfValues">
-				<item>filter</item>
-				<item>leadingFooter</item>
-				<item>trailingFooter</item>
-			</value> 	
-   		</trait> -->
-   		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="value"/>
-				<section id="label"/>
-				<section id="leadingHeader"/>
-				<section id="trailingHeader"/>		
-				<section id="valueChangeListener"/>	
-			</value>
-		</trait>       	     	
-
-    	<entity id="reorderOnly">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-		</entity>    	
-        <entity id="size">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>
-            <trait id="valid-minimum">
-                <value>0</value>
-            </trait>
-        </entity>
-        <entity id="leadingHeader"/>
-        <entity id="trailingHeader"/>
-        <entity id="leadingDescShown">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-		</entity>  
-        <entity id="trailingDescShown">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-		</entity>  
-    </entity>
-    <entity id="selectRangeChoiceBar" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<!-- <trait id="supported-facets">			
-			<value xsi:type="mdt:ListOfValues">
-				<item>rangeLabel</item>
-			</value> 	
-   		</trait> -->
-   		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="value"/>
-				<section id="label"/>
-				<section id="first"/>
-				<section id="rows"/>		
-				<section id="var"/>	
-			</value>
-		</trait>       	     	   		      	
-        <entity id="var"/>
-        <entity id="immediate">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-        <entity id="rangeChangeListener">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.MethodBindingType</value>
-            </trait>  
-            <trait id="runtime-return-type">
-                <value>void</value>
-            </trait>
-            <trait id="runtime-param-types">
-                <value xsi:type="mdt:ListOfValues">
-                    <item>org.apache.myfaces.trinidad.event.RangeChangeEvent</item>
-                </value>
-            </trait>
-        </entity>
-        <entity id="value">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.ValueBindingType</value>
-            </trait>
-            <trait id="runtime-return-type">
-                <value>java.lang.Object</value>
-            </trait>
-        </entity>
-        <entity id="rows">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>
-            <trait id="valid-minimum">
-                <value>0</value>
-            </trait>
-        </entity>
-        <entity id="first">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>
-            <trait id="valid-minimum">
-                <value>0</value>
-            </trait>
-        </entity>
-    </entity>
-    <entity id="separator" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-			</value>
-		</trait>       	     	    	
-    </entity>
-    <entity id="showDetail" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-		<include-entity-group id="common-show-tag-attributes"/>
-    	<!-- <trait id="supported-facets">			
-			<value xsi:type="mdt:ListOfValues">
-				<item>prompt</item>
-			</value> 	
-   		</trait> -->
-   		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>				
-				<section id="disclosedText"/>
-				<section id="undisclosedText"/>
-				<section id="discloseListener"/>
-				<section id="partialTriggers"/>				
-			</value>
-		</trait>       	     	   		   		
-        <entity id="disclosedText"/>
-        <entity id="undisclosedText"/>
-    </entity>
-    <entity id="showDetailHeader" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-		<include-entity-group id="common-show-tag-attributes"/>	
-   		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>				
-				<section id="text"/>
-				<section id="discloseListener"/>
-				<section id="partialTriggers"/>				
-			</value>
-		</trait>      	     				
-        <entity id="text"/>
-        <entity id="icon"/>
-        <entity id="messageType">
-        	<trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-            </trait>
-			<trait id="valid-values">
-			 	<value xsi:type="mdt:ListOfValues">
-					<item>info</item>
-					<item>confirmation</item>
-					<item>warning</item>
-					<item>none</item>
-					<item>error</item>					
-				</value>
-			</trait>
-        </entity>
-        <entity id="size">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>
-        </entity>
-    </entity>
-    <entity id="showDetailItem" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<include-entity-group id="common-show-tag-attributes"/>
-    	<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="text"/>
-				<section id="textAndAccessKey"/>
-				<section id="disclosed"/>
-				<section id="disabled"/>
-			</value>
-		</trait>
-    	<!-- <trait id="supported-facets">			
-			<value xsi:type="mdt:ListOfValues">
-				<item>toolbar</item>
-			</value> 	
-   		</trait>  -->    	
-        <entity id="disabled">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-        <entity id="text">
-        	<trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-            </trait>
-        </entity>
-        <entity id="textAndAccessKey">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-            </trait>
-        </entity>
-        <entity id="accessKey">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.CharacterType</value>
-            </trait>
-        </entity>
-        <entity id="flex">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>
-        </entity>
-    </entity>
-    <entity id="singleStepButtonBar" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>				
-				<section id="selectedStep"/>
-				<section id="maxStep"/>
-				<section id="nextAction"/>
-				<section id="previousAction"/>					
-			</value>
-		</trait>    	
-        <entity id="selectedStep">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>
-            <trait id="valid-minimum">
-            	<value>1</value>
-            </trait>
-        </entity>
-        <entity id="maxStep">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>
-        </entity>
-        <entity id="previousActionListener">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.MethodBindingType</value>
-            </trait>
-            <trait id="runtime-param-types">
-                <value>javax.faces.event.ActionEvent</value>
-            </trait>
-        </entity>
-        <entity id="nextActionListener">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.MethodBindingType</value>
-            </trait>
-            <trait id="runtime-param-types">
-                <value>javax.faces.event.ActionEvent</value>
-            </trait>
-        </entity>
-        <entity id="nextAction">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.ActionType</value>
-            </trait>
-            <trait id="runtime-return-type">
-                <value>java.lang.String</value>
-            </trait>
-        </entity>
-        <entity id="previousAction">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.ActionType</value>
-            </trait>
-            <trait id="runtime-return-type">
-                <value>java.lang.String</value>
-            </trait>
-        </entity>
-        <entity id="text"/>
-    </entity>
-    <entity id="spacer" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="height"/>
-				<section id="width"/>
-			</value>
-		</trait>
-       <entity id="width">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.LengthType</value>
-            </trait>        
-        </entity>
-        <entity id="height">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.LengthType</value>
-            </trait>        
-        </entity>  
-    </entity>
-    <entity id="statusIndicator" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<!-- <trait id="supported-facets">			
-			<value xsi:type="mdt:ListOfValues">
-				<item>busy</item>
-				<item>ready</item>
-			</value> 	
-   		</trait> -->
-   		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-			</value>
-		</trait>    	
-    </entity>
-    <entity id="subform" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="default"/>				
-			</value>
-		</trait>         
-        <entity id="default">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>        
-        </entity>       
-    </entity>
-    <entity id="switcher" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="defaultFacet"/>
-				<section id="facetName"/>				
-			</value>
-		</trait>     	
-    	<entity id="defaultFacet"/>
-    	<entity id="facetName"/>
-    </entity>
-    <entity id="table" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<!-- <trait id="supported-facets">
-			<value xsi:type="mdt:ListOfValues">
-				<item>actions</item>
-				<item>detailStamp</item>
-				<item>footer</item>
-				<item>header</item>				
-			</value> 	
-   		</trait> -->
-   		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="value"/>
-				<section id="var"/>
-				<section id="rows"/>
-				<section id="rowBandingInterval"/>
-				<section id="emptyText"/>
-				<section id="summary"/>
-				<section id="allDetailsEnabled"/>					
-			</value>
-		</trait>        	    	
-        <entity id="var">
-            <trait id="contributes-value-binding">
-                <value>true</value>
-            </trait>
-            <trait id="value-binding-scope">
-                <value>request</value>
-            </trait>
-            <trait id="value-binding-symbol-factory">
-                <value>org.eclipse.jst.jsf.common.unknownTypeSymbolFactory</value>
-            </trait>
-        </entity>
-        <entity id="varStatus"/>
-        <entity id="value">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.MultiSignatureValueBindingType</value>
-            </trait>
-            <trait id="runtime-return-types">
-            	<value xsi:type="mdt:ListOfValues">					
-	                <item>org.apache.myfaces.trinidad.model.CollectionModel</item>
-	                <item>java.util.List</item>
-	                <item>java.util.Set</item>
-	                <item>java.util.Map</item>
-	                <item>javax.faces.model.DataModel</item>
-	                <item>java.lang.Object[]</item>
-                </value>
-            </trait>
-        </entity>
-        <entity id="rows">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>
-            <trait id="valid-minimum">
-                <value>0</value>
-            </trait>
-        </entity>
-        <entity id="first">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>
-            <trait id="valid-minimum">
-                <value>0</value>
-            </trait>
-        </entity>
-        <entity id="rowDisclosureListener">            
-        	<trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.MethodBindingType</value>
-            </trait>
-            <trait id="runtime-param-types">
-                <value>org.apache.myfaces.trinidad.event.RowDisclosureEvent</value>
-            </trait>
-        </entity>
-        <entity id="disclosedRowKeys"/>
-        <entity id="selectionListener">        
-        	<trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.MethodBindingType</value>
-            </trait>
-            <trait id="runtime-param-types">
-                <value>org.apache.myfaces.trinidad.event.SelectionEvent</value>
-            </trait>
-        </entity>        
-        <entity id="selectedRowKeys"/>
-        <entity id="immediate">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-        <entity id="sortListener">        
-        	<trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.MethodBindingType</value>
-            </trait>
-            <trait id="runtime-param-types">
-                <value>org.apache.myfaces.trinidad.event.SortEvent</value>
-            </trait>
-        </entity>        
-        <entity id="rangeChangeListener">        
-        	<trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.MethodBindingType</value>
-            </trait>
-            <trait id="runtime-param-types">
-                <value>org.apache.myfaces.trinidad.event.RangeChangeEvent</value>
-            </trait>
-        </entity>        
-        <entity id="horizontalGridVisible">
-        	<trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-        <entity id="verticalGridVisible">
-        	<trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-        <entity id="emptyText"/>
-        <entity id="columnBandingInterval">
-        	<trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>
-            <trait id="valid-minimum">
-            	<value>0</value>
-            </trait>
-        </entity>
-        <entity id="rowBandingInterval">
-        	<trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>
-            <trait id="valid-minimum">
-            	<value>0</value>
-            </trait>
-        </entity>
-        <entity id="rowSelection">
-        	<trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-            </trait>
-			<trait id="valid-values">
-			 	<value xsi:type="mdt:ListOfValues">
-					<item>none</item>
-					<item>single</item>
-					<item>multiple</item>				
-				</value>
-			</trait>
-        </entity>
-        <entity id="autoSubmit">
-        	<trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-        <entity id="width">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.LengthType</value>
-            </trait>
-        </entity>
-        <entity id="summary"/>
-        <entity id="allDetailsEnabled">
-        	<trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-    </entity>
-    <entity id="train" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<!-- <trait id="supported-facets">			
-			<value xsi:type="mdt:ListOfValues">				
-				<item>nodeStamp</item>
-			</value> 	
-   		</trait> -->
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="value"/>
-				<section id="var"/>					
-			</value>
-		</trait>   		     	
-        <entity id="var"/>
-        <entity id="value">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.ValueBindingType</value>
-            </trait>
-            <trait id="runtime-return-type">
-                <value>org.apache.myfaces.trinidad.model.MenuModel</value>
-            </trait>
-        </entity>
-        <entity id="varStatus"/>
-    </entity>
-    <entity id="tree" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<!-- <trait id="supported-facets">			
-			<value xsi:type="mdt:ListOfValues">				
-				<item>nodeStamp</item>
-			</value> 	
-   		</trait> -->
-   		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="value"/>
-				<section id="var"/>
-				<section id="initiallyExpanded"/>					
-			</value>
-		</trait>       	
-        <entity id="var"/>
-        <entity id="selectedRowKeys"/>
-        <entity id="immediate">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-        <entity id="rowDisclosureListener">            
-        	<trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.MethodBindingType</value>
-            </trait>
-            <trait id="runtime-param-types">
-                <value>org.apache.myfaces.trinidad.event.RowDisclosureEvent</value>
-            </trait>
-        </entity>
-        <entity id="disclosedRowKeys"/>
-        <entity id="selectionListener">        
-        	<trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.MethodBindingType</value>
-            </trait>
-            <trait id="runtime-param-types">
-                <value>org.apache.myfaces.trinidad.event.SelectionEvent</value>
-            </trait>
-        </entity> 
-        <entity id="varStatus"/>
-        <entity id="value">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.ValueBindingType</value>
-            </trait>
-            <trait id="runtime-return-type">
-            	<value>org.apache.myfaces.trinidad.model.TreeModel</value>
-            </trait>
-        </entity>
-        <entity id="focusRowKey"/>
-        <entity id="focusListener">        
-        	<trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.MethodBindingType</value>
-            </trait>
-            <trait id="runtime-param-types">
-                <value>org.apache.myfaces.trinidad.event.FocusEvent</value>
-            </trait>
-        </entity> 
-        <entity id="initiallyExpanded">
-        	<trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-    </entity>
-    <entity id="treeTable" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<!-- <trait id="supported-facets">			
-			<value xsi:type="mdt:ListOfValues">				
-				<item>actions</item>
-				<item>footer</item>
-				<item>header</item>
-				<item>nodeStamp</item>
-				<item>pathStamp</item>				
-			</value> 	
-   		</trait> -->
-   		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="value"/>
-				<section id="summary"/>
-				<section id="emptyText"/>
-				<section id="rowByDepth"/>					
-			</value>
-		</trait>       	
-        <entity id="var"/>
-        <entity id="selectedRowKeys"/>
-        <entity id="immediate">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-        <entity id="rowDisclosureListener">            
-        	<trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.MethodBindingType</value>
-            </trait>
-            <trait id="runtime-param-types">
-                <value>org.apache.myfaces.trinidad.event.RowDisclosureEvent</value>
-            </trait>
-        </entity>
-        <entity id="disclosedRowKeys"/>
-        <entity id="selectionListener">        
-        	<trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.MethodBindingType</value>
-            </trait>
-            <trait id="runtime-param-types">
-                <value>org.apache.myfaces.trinidad.event.SelectionEvent</value>
-            </trait>
-        </entity> 
-        <entity id="varStatus"/>
-        <entity id="value">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.ValueBindingType</value>
-            </trait>
-            <trait id="runtime-return-type">
-                <value>org.apache.myfaces.trinidad.model.TreeModel</value>
-            </trait>
-        </entity>
-        <entity id="focusRowKey"/>
-        <entity id="focusListener">        
-        	<trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.MethodBindingType</value>
-            </trait>
-            <trait id="runtime-param-types">
-                <value>org.apache.myfaces.trinidad.event.FocusEvent</value>
-            </trait>
-        </entity> 
-        <entity id="initiallyExpanded">
-        	<trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-        <entity id="rootNodeRendered">
-        	<trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-        <entity id="rowsByDepth"/>
-        <entity id="rangeChangeListener">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.MethodBindingType</value>
-            </trait>  
-            <trait id="runtime-return-type">
-                <value>void</value>
-            </trait>
-            <trait id="runtime-param-types">
-                <value xsi:type="mdt:ListOfValues">
-                    <item>org.apache.myfaces.trinidad.event.RangeChangeEvent</item>
-                </value>
-            </trait>
-        </entity>
-        <entity id="horizontalGridVisible">
-        	<trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-        <entity id="verticalGridVisible">
-        	<trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-        <entity id="emptyText"/>
-        <entity id="columnBandingInterval">
-        	<trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>
-        </entity>
-        <entity id="rowBandingInterval">
-        	<trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>
-        </entity>
-        <entity id="rowSelection">			
-        	<trait id="attribute-value-runtime-type">
-        		<value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-        	</trait>
-        	<trait id="valid-values">
-	        	<value xsi:type="mdt:ListOfValues">				
-					<item>none</item>
-					<item>single</item>
-					<item>multiple</item>
-				</value> 
-			</trait>
-		</entity>
-        <entity id="autoSubmit">
-        	<trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-        <entity id="width">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.LengthType</value>
-            </trait>
-        </entity>
-        <entity id="summary"/>
-        <entity id="expandAllEnabled">
-        	<trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-    </entity>
-    <entity id="group" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>					
-			</value>
-		</trait>
-    </entity>
-    <entity id="iterator" type="tag">
-		<include-entity-group id="common-core-attributes"/>    	
-   		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="value"/>
-				<section id="var"/>
-				<section id="varStat"/>
-				<section id="first"/>				
-				<section id="rows"/>				
-			</value>
-		</trait>  		
-        <entity id="var"/>
-        <entity id="varStatus"/>
-        <entity id="value">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.MultiSignatureValueBindingType</value>
-            </trait>
-            <trait id="runtime-return-types">
-            	<value xsi:type="mdt:ListOfValues">					
-	                <item>org.apache.myfaces.trinidad.model.CollectionModel</item>
-	                <item>java.util.List</item>
-	                <item>java.util.Set</item>
-	                <item>java.util.Map</item>
-	                <item>javax.faces.model.DataModel</item>
-	                <item>java.lang.Object[]</item>
-                </value>
-            </trait>
-        </entity>
-        <entity id="rows">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>
-            <trait id="valid-minimum">
-                <value>0</value>
-            </trait>
-        </entity>
-        <entity id="first">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>
-            <trait id="valid-minimum">
-                <value>0</value>
-            </trait>
-        </entity>
-    </entity>
-    <entity id="convertColor" type="tag">
-   	 	<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="patterns"/>
-				<section id="messageDetailConvert"/>
-				<section id="transparentAllowed"/>					
-			</value>
-		</trait>
-        <entity id="id">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.ComponentIDType</value>
-            </trait>
-        </entity>
-        <entity id="patterns"/>
-        <entity id="transparentAllowed">            
-        	<trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-        <entity id="messageDetailConvert"/>
-    </entity>
-    <entity id="convertDateTime" type="tag">
-    	<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="section.general.convertDateTime" type="SECTION"/>
-			</value>
-		</trait>	
-        <entity id="id">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.ComponentIDType</value>
-            </trait>
-        </entity>
-        <entity id="messageDetailConvertDate"/>
-        <entity id="messageDetailConvertTime"/>
-        <entity id="messageDetailConvertBoth"/>
-        <entity id="dateStyle">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-			</trait>
-			<trait id="valid-values">
-				<value xsi:type="mdt:ListOfValues">
-					<item>default</item>
-					<item>short</item>
-					<item>medium</item>
-					<item>long</item>
-					<item>full</item>
-				</value>
-			</trait>
-			<trait id="default-value">
-				<value>default</value>
-			</trait>
-		</entity>
-        <entity id="locale">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.LocaleType</value>
-            </trait>        
-        </entity>
-		<entity id="pattern">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.DateTimePatternType</value>
-			</trait>
-		</entity>
-        <entity id="secondaryPattern">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.DateTimePatternType</value>
-			</trait>
-		</entity>
-        <entity id="timeStyle">			
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-			</trait>
-			<trait id="valid-values">
-				<value xsi:type="mdt:ListOfValues">
-					<item>default</item>
-					<item>short</item>
-					<item>medium</item>
-					<item>long</item>
-					<item>full</item>
-				</value>
-			</trait>
-			<trait id="default-value">
-				<value>default</value>
-			</trait>
-		</entity>
-        <entity id="timeZone"/>
-		<entity id="type">			
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-			</trait>
-			<trait id="valid-values">
-				<value xsi:type="mdt:ListOfValues">
-					<item>date</item>
-					<item>time</item>
-					<item>both</item>
-				</value>
-			</trait>
-			<trait id="default-value">
-				<value>both</value>
-			</trait>
-		</entity>
-    </entity>
-    <entity id="convertNumber" type="tag">
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="section.general.convertNumber" type="SECTION"/>
-			</value>
-		</trait>		    
-        <entity id="id">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.ComponentIDType</value>
-            </trait>
-        </entity>
-		<entity id="currencyCode">
-			<trait id="attribute-value-runtime-type">
-				<value>
-					org.eclipse.jst.jsf.core.attributevalues.CurrencyCodeType
-				</value>
-			</trait>
-		</entity>
-        <entity id="messageDetailConvertCurrency"/>
-        <entity id="messageDetailConvertNumber"/>
-        <entity id="messageDetailConvertPattern"/>
-        <entity id="messageDetailConvertPercent"/>
-        <entity id="currencySymbol"/>
-		<entity id="groupingUsed">
-			<trait id="attribute-value-runtime-type">
-				<value>
-					org.eclipse.jst.jsf.core.attributevalues.BooleanType
-				</value>
-			</trait>
-			<trait id="default-value">
-				<value>true</value>
-			</trait>
-		</entity>
-		<entity id="integerOnly">
-			<trait id="attribute-value-runtime-type">
-				<value>
-					org.eclipse.jst.jsf.core.attributevalues.BooleanType
-				</value>
-			</trait>
-			<trait id="default-value">
-				<value>false</value>
-			</trait>
-		</entity>
-		<entity id="locale">
-			<trait id="attribute-value-runtime-type">
-				<value>
-					org.eclipse.jst.jsf.core.attributevalues.LocaleType
-				</value>
-			</trait>
-		</entity>
-		<entity id="maxFractionDigits">
-			<trait id="attribute-value-runtime-type">
-				<value>
-					org.eclipse.jst.jsf.core.attributevalues.IntegerType
-				</value>
-			</trait>
-			<trait id="valid-minimum"><value>0</value></trait>
-		</entity>
-        <entity id="maxIntegerDigits">
-			<trait id="attribute-value-runtime-type">
-				<value>
-					org.eclipse.jst.jsf.core.attributevalues.IntegerType
-				</value>
-			</trait>
-			<trait id="valid-minimum"><value>0</value></trait>
-		</entity>
-        <entity id="minFractionDigits">
-			<trait id="attribute-value-runtime-type">
-				<value>
-					org.eclipse.jst.jsf.core.attributevalues.IntegerType
-				</value>
-			</trait>
-			<trait id="valid-minimum"><value>0</value></trait>
-		</entity>
-        <entity id="minIntegerDigits">
-			<trait id="attribute-value-runtime-type">
-				<value>
-					org.eclipse.jst.jsf.core.attributevalues.IntegerType
-				</value>
-			</trait>
-			<trait id="valid-minimum"><value>0</value></trait>
-		</entity>
-		<entity id="pattern">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.NumberPatternType</value>
-			</trait>
-		</entity>	
-		<entity id="type">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-			</trait>
-			<trait id="valid-values">
-				<value xsi:type="mdt:ListOfValues">
-					<item>number</item>
-					<item>currency</item>
-					<item>percentage</item>
-				</value>
-			</trait>
-			<trait id="default-value">
-				<value>number</value>
-			</trait>
-		</entity>
-    </entity>
-    <entity id="validateByteLength" type="tag">
-    	<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="maximum"/>
-				<section id="messageDetailMaximum"/>							
-			</value>
-		</trait>
-        <entity id="id">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.ComponentIDType</value>
-            </trait>
-        </entity>
-        <entity id="maximum">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>
-            <trait id="valid-minimum">
-            	<value>1</value>
-            </trait>
-        </entity>
-        <entity id="encoding"/>
-        <entity id="messageDetailMaximum"/>
-    </entity>
-    <entity id="validateDateRestriction" type="tag">
-    	<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>					
-			</value>
-		</trait>
-        <entity id="id">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.ComponentIDType</value>
-            </trait>
-        </entity>
-        <entity id="invalidMonths"/>
-        <entity id="invalidDaysOfWeek"/>
-        <entity id="invalidDays"/>
-        <entity id="messageDetailInvalidMonths"/>
-        <entity id="messageDetailInvalidDaysOfWeek"/>
-        <entity id="messageDetailInvalidDays"/>
-    </entity>
-    <entity id="validateDateTimeRange" type="tag">
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="minimum"/>
-				<section id="messageDetailMinimum"/>
-				<section id="maximum"/>
-				<section id="messageDetailMaximum"/>							
-			</value>
-		</trait>    
-        <entity id="id">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.ComponentIDType</value>
-            </trait>
-        </entity>
-        <entity id="maximum"/>
-        <entity id="minimum"/>
-        <entity id="messageDetailMaximum"/>
-        <entity id="messageDetailMinimum"/>
-        <entity id="messageDetailNotInRange"/>
-    </entity>
-    <entity id="validateDoubleRange" type="tag">
-    	<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="minimum"/>
-				<section id="messageDetailMinimum"/>
-				<section id="maximum"/>
-				<section id="messageDetailMaximum"/>							
-			</value>
-		</trait>
-        <entity id="id">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.ComponentIDType</value>
-            </trait>
-        </entity>
-        <entity id="maximum">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.DoubleType</value>
-            </trait>
-        </entity>
-        <entity id="minimum">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.DoubleType</value>
-            </trait>
-        </entity>
-        <entity id="messageDetailMaximum"/>
-        <entity id="messageDetailMinimum"/>
-        <entity id="messageDetailNotInRange"/>
-    </entity>
-    <entity id="validateLength" type="tag">
-    	<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="minimum"/>
-				<section id="messageDetailMinimum"/>
-				<section id="maximum"/>
-				<section id="messageDetailMaximum"/>							
-			</value>
-		</trait>
-        <entity id="id">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.ComponentIDType</value>
-            </trait>
-        </entity>
-        <entity id="maximum">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>
-        </entity>
-        <entity id="minimum">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>
-        </entity>
-        <entity id="messageDetailMaximum"/>
-        <entity id="messageDetailMinimum"/>
-        <entity id="messageDetailNotInRange"/>
-        <entity id="messageDetailExact"/>
-    </entity>
-    <entity id="validateLongRange" type="tag">
-    	<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="minimum"/>
-				<section id="messageDetailMinimum"/>
-				<section id="maximum"/>
-				<section id="messageDetailMaximum"/>							
-			</value>
-		</trait>
-        <entity id="id">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.ComponentIDType</value>
-            </trait>
-        </entity>
-        <entity id="maximum">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.LongType</value>
-            </trait>
-        </entity>
-        <entity id="minimum">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.LongType</value>
-            </trait>
-        </entity>
-        <entity id="messageDetailMaximum"/>
-        <entity id="messageDetailMinimum"/>
-        <entity id="messageDetailNotInRange"/>
-    </entity>
-    <entity id="validateRegExp" type="tag">
-    	<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="pattern"/>
-				<section id="messageDetailNoMatch"/>							
-			</value>
-		</trait>
-        <entity id="id">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.ComponentIDType</value>
-            </trait>
-        </entity>
-        <entity id="pattern"/>
-        <entity id="messageDetailNoMatch"/>
-    </entity>
-    <entityGroup id="common-core-attributes">
-        <entity id="id">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.ComponentIDType</value>
-            </trait>
-            <trait id="category">
-				<value>%property.category.core</value>
-			</trait>	
-        </entity>
-        <entity id="rendered">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-            <trait id="category">
-				<value>%property.category.core</value>
-			</trait>	
-        </entity>
-        <entity id="binding">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.ComponentBindingType</value>
-            </trait>
-            <trait id="runtime-return-type">
-                <value>javax.faces.component.UIComponent</value>
-            </trait><trait id="category">
-				<value>%property.category.core</value>
-			</trait>	
-        </entity>
-        <entity id="attributeChangeListener">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.MethodBindingType</value>
-            </trait>  
-            <trait id="runtime-return-type">
-                <value>void</value>
-            </trait>
-            <trait id="runtime-param-types">
-                <value xsi:type="mdt:ListOfValues">
-                    <item>org.apache.myfaces.trinidad.event.AttributeChangeEvent</item>
-                </value>
-            </trait>    
-            <trait id="category">
-				<value>%property.category.core</value>
-			</trait>	    
-        </entity>
-    </entityGroup>
-    <entityGroup id="common-trinidad-attributes">
-        <entity id="inlineStyle">
-        	<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.pagedesigner.attributevalues.CSSStyleType</value>
-			</trait>
-			<trait id="category">
-				<value>%property.category.core</value>
-			</trait>			
-		</entity>
-        <entity id="styleClass">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.pagedesigner.attributevalues.CSSClassType</value>
-			</trait>
-			<trait id="category">
-				<value>%property.category.core</value>
-			</trait>				
-        </entity>
-        <entity id="shortDesc">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.ScriptType</value>
-			</trait>        
-        	<trait id="category">
-				<value>%property.category.core</value>
-			</trait>	
-        </entity>
-        <entity id="partialTriggers">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.ScriptType</value>
-			</trait>        
-        	<trait id="category">
-				<value>%property.category.core</value>
-			</trait>	
-        </entity>
-    </entityGroup>
-	<entityGroup id="common-event-attributes"> 
-		<entity id="onclick">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.ScriptType</value>
-			</trait>
-			<trait id="category">
-				<value>%property.category.event</value>
-			</trait>			
-		</entity>
-		<entity id="ondblclick">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.ScriptType</value>
-			</trait>
-			<trait id="category">
-				<value>%property.category.event</value>
-			</trait>			
-		</entity>
-		<entity id="onmousedown">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.ScriptType</value>
-			</trait>
-			<trait id="category">
-				<value>%property.category.event</value>
-			</trait>			
-		</entity>
-		<entity id="onmouseup">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.ScriptType</value>
-			</trait>
-			<trait id="category">
-				<value>%property.category.event</value>
-			</trait>			
-		</entity>
-		<entity id="onmouseover">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.ScriptType</value>
-			</trait>
-			<trait id="category">
-				<value>%property.category.event</value>
-			</trait>			
-		</entity>
-		<entity id="onmousemove">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.ScriptType</value>
-			</trait>
-			<trait id="category">
-				<value>%property.category.event</value>
-			</trait>			
-		</entity>
-		<entity id="onmouseout">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.ScriptType</value>
-			</trait>
-			<trait id="category">
-				<value>%property.category.event</value>
-			</trait>			
-		</entity>
-		<entity id="onkeypress">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.ScriptType</value>
-			</trait>
-			<trait id="category">
-				<value>%property.category.event</value>
-			</trait>			
-		</entity>
-		<entity id="onkeydown">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.ScriptType</value>
-			</trait>
-			<trait id="category">
-				<value>%property.category.event</value>
-			</trait>			
-		</entity>
-		<entity id="onkeyup">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.ScriptType</value>
-			</trait>
-			<trait id="category">
-				<value>%property.category.event</value>
-			</trait>			
-		</entity>
-		<!--almost common events - should be refactored-->
-		<entity id="onblur">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.ScriptType</value>
-			</trait>
-			<trait id="category">
-				<value>%property.category.event</value>
-			</trait>			
-		</entity>
-		<entity id="onchange">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.ScriptType</value>
-			</trait>
-			<trait id="category">
-				<value>%property.category.event</value>
-			</trait>			
-		</entity>
-		<entity id="onfocus">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.ScriptType</value>
-			</trait>
-			<trait id="category">
-				<value>%property.category.event</value>
-			</trait>			
-		</entity>
-		<entity id="onselect">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.ScriptType</value>
-			</trait>
-			<trait id="category">
-				<value>%property.category.event</value>
-			</trait>			
-		</entity>					
-	</entityGroup>
-    <entityGroup id="common-show-tag-attributes">
-        <entity id="disclosed">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>        
-        </entity>
-        <entity id="disclosedTransient">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-        <entity id="immediate">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-        <entity id="disclosureListener">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.MethodBindingType</value>
-            </trait>  
-            <trait id="runtime-return-type">
-                <value>void</value>
-            </trait>
-            <trait id="runtime-param-types">
-                <value xsi:type="mdt:ListOfValues">
-                    <item>org.apache.myfaces.trinidad.event.DisclosureEvent</item>
-                </value>
-            </trait>
-        </entity>
-    </entityGroup>
-    <entityGroup id="common-value-holder-attributes">
-        <entity id="value">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.ValueBindingType</value>
-            </trait>
-            <trait id="runtime-return-type">
-                <value>java.lang.String</value>
-            </trait>
-        </entity>
-        <entity id="converter">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.FacesConfigConverterIDType</value>
-            </trait>
-        </entity>
-    </entityGroup>
-    <entityGroup id="common-input-tag-attributes">
-        <entity id="immediate">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-        <entity id="required">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-        <entity id="validator">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.MethodBindingType</value>
-            </trait>
-            <trait id="runtime-return-type">
-                <value>void</value>
-            </trait>
-            <trait id="runtime-param-types">
-                <value xsi:type="mdt:ListOfValues">
-                    <item>javax.faces.context.FacesContext</item>
-                    <item>javax.faces.component.UIComponent</item>
-                    <item>java.lang.Object</item>
-                </value>
-            </trait>
-        </entity>
-        <entity id="valueChangeListener">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.MethodBindingType</value>
-            </trait>
-            <trait id="runtime-return-type">
-                <value>void</value>
-            </trait>
-            <trait id="runtime-param-types">
-                <value>javax.faces.event.ValueChangeEvent</value>
-            </trait>
-        </entity>
-        <entity id="requiredMessageDetail"/>
-    </entityGroup>
-    <entityGroup id="common-command-attributes">
-        <entity id="action">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.ActionType</value>
-            </trait>
-            <trait id="runtime-return-type">
-                <value>java.lang.String</value>
-            </trait>
-        </entity>
-        <entity id="actionListener">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.MethodBindingType</value>
-            </trait>
-            <trait id="runtime-param-types">
-                <value>javax.faces.event.ActionEvent</value>
-            </trait>
-        </entity>
-        <entity id="returnListener">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.MethodBindingType</value>
-            </trait>
-            <trait id="runtime-param-types">
-                <value>org.apache.myfaces.trinidad.event.ReturnEvent</value>
-            </trait>        
-        </entity>
-        <entity id="launchListener">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.MethodBindingType</value>
-            </trait>
-            <trait id="runtime-param-types">
-                <value>org.apache.myfaces.trinidad.event.LaunchEvent</value>
-            </trait>
-        </entity>
-        <entity id="immediate">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-        <entity id="useWindow">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-        <entity id="windowHeight">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>
-        </entity>
-        <entity id="windowWidth">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>
-        </entity>        
-        <entity id="accessKey">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.CharacterType</value>
-            </trait>  
-        </entity>      
-        <entity id="text"/>
-        <entity id="disabled">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-        <entity id="textAndAccessKey"/>       
-        <entity id="partialSubmit">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-    </entityGroup>
-    <entityGroup id="common-select-tag-attributes">
-       <entity id="contentStyle">
-        	<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.pagedesigner.attributevalues.CSSStyleType</value>
-			</trait>
-			<trait id="category">
-				<value>%property.category.css</value>
-			</trait>	       
-       </entity>
-       <entity id="valuePassThru">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-       <entity id="unselectedLabel"/>
-    </entityGroup>
-    <entityGroup id="common-text-attributes">
-        <entity id="autoSubmit">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-        <entity id="readOnly">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-        <entity id="disabled">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-        <entity id="text"/>
-        <entity id="textAndAccessKey"/>    
-	</entityGroup>   
-    <entityGroup id="common-label-attributes">
-        <entity id="label"/>
-        <entity id="accessKey">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.CharacterType</value>
-            </trait>
-        </entity>
-        <entity id="labelAndAccessKey"/>
-        <entity id="simple">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-        <entity id="showRequired">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>    
-        <entity id="readOnly">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-        <entity id="disabled">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-    </entityGroup>
-</md:metadatamodel>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/metadata/trinidad_dti.xml b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/metadata/trinidad_dti.xml
deleted file mode 100644
index 323e432..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/metadata/trinidad_dti.xml
+++ /dev/null
@@ -1,1453 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<md:metadatamodel xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" 
-	xmlns:md="http://org.eclipse.jst.jsf.common.metadata/metadata.ecore"
-	xmlns:dti="http://org.eclipse.jsf.pagedesigner/dtinfo.ecore"
-	id="http://myfaces.apache.org/trinidad"
-	type="tagFile">
-
-	<entity id="breadCrumbs" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.BreadCrumbsOperation"/>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					needBorderDecorator="true"					
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="chart" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.pagedesigner.CreateElementOperation">
-						<parameter value="div"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyAttributeWithRenameOperation">
-						<parameter value="styleClass"/>
-						<parameter value="class"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CreateAttributeFromXPathOperation">
-						<parameter value="style"/>
-						<parameter value="concat('border:1px solid silver;padding:2px;',@inlineStyle)"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.AppendChildElementOperation">
-						<parameter value="span"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-						<parameter value="style"/>
-						<parameter value="color:#999999; font-size:8pt; vertical-align:middle;"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.AppendChildElementOperation">
-						<parameter value="img"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-						<parameter value="src"/>
-						<parameter value="$metadata-plugin-location$/icons/large/chart.gif"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-						<parameter value="style"/>
-						<parameter value="vertical-align:middle; margin:0px 3px 0px 0px;"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.MakeParentElementCurrentOperation"/>
-					<operation id="org.eclipse.jst.pagedesigner.AppendChildTextOperation">
-						<parameter value="chart"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.MakeParentElementCurrentOperation"/>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					needBorderDecorator="true"
-					multiLevel="true"
-					widget="true"
-				>
-					<resolve-attribute-value attributeName="span/img/src"/>
-				</tag-decorate-info>
-				<tag-decorate-info id="vpd-decorate-preview">
-					<resolve-attribute-value attributeName="span/img/src"/>
-				</tag-decorate-info>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="chooseColor" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.pagedesigner.CreateElementOperation">
-						<parameter value="div"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyAttributeWithRenameOperation">
-						<parameter value="styleClass"/>
-						<parameter value="class"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CreateAttributeFromXPathOperation">
-						<parameter value="style"/>
-						<parameter value="concat('border:1px solid silver;padding:2px;width:72px;height:72px;',@inlineStyle)"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.AppendChildElementOperation">
-						<parameter value="span"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-						<parameter value="style"/>
-						<parameter value="color:#999999; font-size:8pt; vertical-align:middle;"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.AppendChildElementOperation">
-						<parameter value="img"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-						<parameter value="src"/>
-						<parameter value="$metadata-plugin-location$/icons/large/chooseColor.gif"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-						<parameter value="style"/>
-						<parameter value="vertical-align:middle; margin:0px 3px 0px 0px;"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.MakeParentElementCurrentOperation"/>
-					<operation id="org.eclipse.jst.pagedesigner.AppendChildTextOperation">
-						<parameter value="chooseColor"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.MakeParentElementCurrentOperation"/>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					needBorderDecorator="true"
-					multiLevel="true"
-					widget="true"
-				>
-					<resolve-attribute-value attributeName="span/img/src"/>
-				</tag-decorate-info>
-				<tag-decorate-info id="vpd-decorate-preview">
-					<resolve-attribute-value attributeName="span/img/src"/>
-				</tag-decorate-info>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="chooseDate" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.pagedesigner.CreateElementOperation">
-						<parameter value="div"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyAttributeWithRenameOperation">
-						<parameter value="styleClass"/>
-						<parameter value="class"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CreateAttributeFromXPathOperation">
-						<parameter value="style"/>
-						<parameter value="concat('border:1px solid silver;padding:2px;width:224px;height:152px;',@inlineStyle)"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.AppendChildElementOperation">
-						<parameter value="span"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-						<parameter value="style"/>
-						<parameter value="color:#999999; font-size:8pt; vertical-align:middle;"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.AppendChildElementOperation">
-						<parameter value="img"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-						<parameter value="src"/>
-						<parameter value="$metadata-plugin-location$/icons/large/chooseDate.gif"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-						<parameter value="style"/>
-						<parameter value="vertical-align:middle; margin:0px 3px 0px 0px;"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.MakeParentElementCurrentOperation"/>
-					<operation id="org.eclipse.jst.pagedesigner.AppendChildTextOperation">
-						<parameter value="chooseDate"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.MakeParentElementCurrentOperation"/>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					needBorderDecorator="true"
-					multiLevel="true"
-					widget="true"
-				>
-					<resolve-attribute-value attributeName="span/img/src"/>
-				</tag-decorate-info>
-				<tag-decorate-info id="vpd-decorate-preview">
-					<resolve-attribute-value attributeName="span/img/src"/>
-				</tag-decorate-info>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="commandButton" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.pagedesigner.CreateElementOperation">
-						<parameter value="button"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-						<parameter value="type"/>
-						<parameter value="button"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.IfOperation">
-						<parameter value="@disabled='true'"/>
-						<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-							<parameter value="disabled"/>
-							<parameter value=""/>
-						</operation>
-						<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.CreateClassAttributeOperation">
-							<parameter value="af_commandButton p_AFDisabled"/>
-						</operation>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.IfNotOperation">
-						<parameter value="@disabled='true'"/>
-						<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.CreateClassAttributeOperation">
-							<parameter value="af_commandButton"/>
-						</operation>
-					</operation>
-					<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.CreateStyleAttributeOperation"/>
-					<operation id="org.eclipse.jst.pagedesigner.IfOperation">
-						<parameter value="@textAndAccessKey"/>
-						<operation id="org.eclipse.jst.pagedesigner.ConvertAttributeToTextOperation">
-							<parameter value="textAndAccessKey"/>
-						</operation>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.IfNotOperation">
-						<parameter value="@textAndAccessKey"/>
-						<operation id="org.eclipse.jst.pagedesigner.ConvertAttributeToTextOperation">
-							<parameter value="text"/>
-						</operation>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.IfOperation">
-						<parameter value="@icon"/>
-						<operation id="org.eclipse.jst.pagedesigner.AppendChildElementOperation">
-							<parameter value="img"/>
-						</operation>
-						<operation id="org.eclipse.jst.pagedesigner.CopyAttributeWithRenameOperation">
-							<parameter value="icon"/>
-							<parameter value="src"/>
-						</operation>
-						<operation id="org.eclipse.jst.pagedesigner.MakeParentElementCurrentOperation"/>
-					</operation>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					multiLevel="true"
-					widget="true"
-					setNonVisualChildElements="true"
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					resolveChildText="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="commandLink" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.pagedesigner.CreateElementOperation">
-						<parameter value="a"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-						<parameter value="href"/>
-						<parameter value="#"/>
-					</operation>
-					<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.CreateClassAttributeOperation">
-						<parameter value="OraLinkText"/>
-					</operation>
-					<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.CreateStyleAttributeOperation"/>
-					<operation id="org.eclipse.jst.pagedesigner.IfOperation">
-						<parameter value="@textAndAccessKey"/>
-						<operation id="org.eclipse.jst.pagedesigner.ConvertAttributeToTextOperation">
-							<parameter value="textAndAccessKey"/>
-						</operation>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.IfNotOperation">
-						<parameter value="@textAndAccessKey"/>
-						<operation id="org.eclipse.jst.pagedesigner.ConvertAttributeToTextOperation">
-							<parameter value="text"/>
-						</operation>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyChildrenOperation"/>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					multiLevel="true"
-					needBorderDecorator="true"
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					resolveChildText="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="commandNavigationItem" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.CommandNavigationItemOperation"/>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					needBorderDecorator="true"
-					multiLevel="true"
-					widget="true"
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					resolveChildText="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="document" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.pagedesigner.CreateElementOperation">
-						<parameter value="html"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.AppendChildElementOperation">
-						<parameter value="head"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.IfOperation">
-						<parameter value="@title"/>
-						<operation id="org.eclipse.jst.pagedesigner.AppendChildElementOperation">
-							<parameter value="title"/>
-						</operation>
-						<operation id="org.eclipse.jst.pagedesigner.AppendChildTextFromXPathOperation">
-							<parameter value="@title"/>
-						</operation>
-						<operation id="org.eclipse.jst.pagedesigner.MakeParentElementCurrentOperation"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.MakeParentElementCurrentOperation"/>
-					<operation id="org.eclipse.jst.pagedesigner.AppendChildElementOperation">
-						<parameter value="body"/>
-					</operation>
-					<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.CreateClassAttributeOperation"/>
-					<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.CreateStyleAttributeOperation"/>
-					<operation id="org.eclipse.jst.pagedesigner.CopyChildrenOperation"/>
-					<operation id="org.eclipse.jst.pagedesigner.MakeParentElementCurrentOperation"/>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					needBorderDecorator="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="form" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.pagedesigner.CreateElementOperation">
-						<parameter value="form"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyAttributeWithRenameOperation">
-						<parameter value="inlineStyle"/>
-						<parameter value="style"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyAttributeWithRenameOperation">
-						<parameter value="styleClass"/>
-						<parameter value="class"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyChildrenOperation"/>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					needBorderDecorator="true"					
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="goButton" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.pagedesigner.CreateElementOperation">
-						<parameter value="button"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-						<parameter value="type"/>
-						<parameter value="button"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.IfOperation">
-						<parameter value="@disabled='true'"/>
-						<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-							<parameter value="disabled"/>
-							<parameter value=""/>
-						</operation>
-					</operation>
-					<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.CreateClassAttributeOperation">
-						<parameter value="af_goButton"/>
-					</operation>
-					<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.CreateStyleAttributeOperation"/>
-					<operation id="org.eclipse.jst.pagedesigner.IfOperation">
-						<parameter value="@textAndAccessKey"/>
-						<operation id="org.eclipse.jst.pagedesigner.ConvertAttributeToTextOperation">
-							<parameter value="textAndAccessKey"/>
-						</operation>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.IfNotOperation">
-						<parameter value="@textAndAccessKey"/>
-						<operation id="org.eclipse.jst.pagedesigner.ConvertAttributeToTextOperation">
-							<parameter value="text"/>
-						</operation>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.IfOperation">
-						<parameter value="@icon"/>
-						<operation id="org.eclipse.jst.pagedesigner.AppendChildElementOperation">
-							<parameter value="img"/>
-						</operation>
-						<operation id="org.eclipse.jst.pagedesigner.CopyAttributeWithRenameOperation">
-							<parameter value="icon"/>
-							<parameter value="src"/>
-						</operation>
-						<operation id="org.eclipse.jst.pagedesigner.MakeParentElementCurrentOperation"/>
-					</operation>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					multiLevel="true"
-					widget="true"
-					setNonVisualChildElements="true"
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					resolveChildText="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="goLink" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.pagedesigner.CreateElementOperation">
-						<parameter value="a"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-						<parameter value="href"/>
-						<parameter value="#"/>
-					</operation>
-					<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.CreateClassAttributeOperation">
-						<parameter value="OraLinkText"/>
-					</operation>
-					<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.CreateStyleAttributeOperation"/>
-					<operation id="org.eclipse.jst.pagedesigner.IfOperation">
-						<parameter value="@textAndAccessKey"/>
-						<operation id="org.eclipse.jst.pagedesigner.ConvertAttributeToTextOperation">
-							<parameter value="textAndAccessKey"/>
-						</operation>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.IfNotOperation">
-						<parameter value="@textAndAccessKey"/>
-						<operation id="org.eclipse.jst.pagedesigner.ConvertAttributeToTextOperation">
-							<parameter value="text"/>
-						</operation>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyChildrenOperation"/>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					multiLevel="true"
-					needBorderDecorator="true"
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					resolveChildText="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="group" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.pagedesigner.CreateElementOperation">
-						<parameter value="span"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyChildrenOperation"/>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					needBorderDecorator="true"					
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="icon" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.pagedesigner.CreateElementOperation">
-						<parameter value="span"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.IfOperation">
-						<parameter value="@name='required' or @name='AFRequiredIcon'"/>
-						<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.CreateClassAttributeOperation">
-							<parameter value="AFRequiredIconStyle"/>
-						</operation>
-						<operation id="org.eclipse.jst.pagedesigner.AppendChildTextOperation">
-							<parameter value="*"/>
-						</operation>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.IfOperation">
-						<parameter value="@name='info' or @name='AFInfoIcon'"/>
-						<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.CreateClassAttributeOperation">
-							<parameter value="AFInfoIconStyle"/>
-						</operation>
-						<operation id="org.eclipse.jst.pagedesigner.AppendChildTextOperation">
-							<parameter value="i"/>
-						</operation>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.IfOperation">
-						<parameter value="@name='warning' or @name='AFWarningIcon'"/>
-						<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.CreateClassAttributeOperation">
-							<parameter value="AFWarningIconStyle"/>
-						</operation>
-						<operation id="org.eclipse.jst.pagedesigner.AppendChildTextOperation">
-							<parameter value="!"/>
-						</operation>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.IfOperation">
-						<parameter value="@name='error' or @name='AFErrorIcon'"/>
-						<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.CreateClassAttributeOperation">
-							<parameter value="AFErrorIconStyle"/>
-						</operation>
-						<operation id="org.eclipse.jst.pagedesigner.AppendChildTextOperation">
-							<parameter value="X"/>
-						</operation>
-					</operation>
-					<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.CreateStyleAttributeOperation"/>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					widget="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="image" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.pagedesigner.CreateElementOperation">
-						<parameter value="img"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyAttributeWithRenameOperation">
-						<parameter value="styleClass"/>
-						<parameter value="class"/>
-					</operation>
-					<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.CreateStyleAttributeOperation"/>
-					<operation id="org.eclipse.jst.pagedesigner.CopyAttributeWithRenameOperation">
-						<parameter value="source"/>
-						<parameter value="src"/>
-					</operation>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					widget="true"
-				>
-					<resolve-attribute-value attributeName="src"/>
-				</tag-decorate-info>
-				<tag-decorate-info id="vpd-decorate-preview">
-					<resolve-attribute-value attributeName="src"/>
-				</tag-decorate-info>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="importScript" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-decorate-info id="vpd-decorate-design"
-					nonVisual="true"
-					nonVisualImagePath="icons/small/importScript.gif"
-					widget="true"
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					nonVisual="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="inputColor" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.InputTextWithIconOperation">
-						<parameter value="$metadata-plugin-location$/icons/small/icon_inputColor.gif"/>
-					</operation>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					multiLevel="true"
-					widget="true"
-					setNonVisualChildElements="true"
-				>
-					<resolve-attribute-value attributeName=".//a/img/src"/>
-				</tag-decorate-info>
-				<tag-decorate-info id="vpd-decorate-preview">
-					<resolve-attribute-value attributeName=".//a/img/src"/>
-				</tag-decorate-info>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="inputDate" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.InputTextWithIconOperation">
-						<parameter value="$metadata-plugin-location$/icons/small/icon_inputDate.gif"/>
-					</operation>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					multiLevel="true"
-					widget="true"
-					setNonVisualChildElements="true"
-				>
-					<resolve-attribute-value attributeName=".//a/img/src"/>
-				</tag-decorate-info>
-				<tag-decorate-info id="vpd-decorate-preview">
-					<resolve-attribute-value attributeName=".//a/img/src"/>
-				</tag-decorate-info>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="inputFile" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.InputFileOperation">
-					</operation>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					multiLevel="true"
-					widget="true"
-					setNonVisualChildElements="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="inputHidden" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-decorate-info id="vpd-decorate-design"
-					nonVisual="true"
-					nonVisualImagePath="icons/small/inputHidden.gif"
-					widget="true"
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					nonVisual="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="inputListOfValues" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.InputTextWithIconOperation">
-						<parameter value="$metadata-plugin-location$/icons/small/icon_inputListOfValues.gif"/>
-					</operation>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					multiLevel="true"
-					widget="true"
-					setNonVisualChildElements="true"
-				>
-					<resolve-attribute-value attributeName=".//a/img/src"/>
-				</tag-decorate-info>
-				<tag-decorate-info id="vpd-decorate-preview">
-					<resolve-attribute-value attributeName=".//a/img/src"/>
-				</tag-decorate-info>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="inputNumberSpinbox" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.InputTextWithIconOperation">
-						<parameter value="$metadata-plugin-location$/icons/small/icon_inputNumberSpinbox.gif"/>
-					</operation>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					multiLevel="true"
-					widget="true"
-					setNonVisualChildElements="true"
-				>
-					<resolve-attribute-value attributeName=".//a/img/src"/>
-				</tag-decorate-info>
-				<tag-decorate-info id="vpd-decorate-preview">
-					<resolve-attribute-value attributeName=".//a/img/src"/>
-				</tag-decorate-info>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="inputText" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.InputTextOperation">
-					</operation>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					multiLevel="true"
-					widget="true"
-					setNonVisualChildElements="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="message" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-decorate-info id="vpd-decorate-design"
-					nonVisual="true"
-					nonVisualImagePath="icons/small/message.gif"
-					widget="true"
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					nonVisual="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="messages" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-decorate-info id="vpd-decorate-design"
-					nonVisual="true"
-					nonVisualImagePath="icons/small/messages.gif"
-					widget="true"
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					nonVisual="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="navigationPane" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.NavigationPaneOperation"/>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					needBorderDecorator="true"					
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="outputFormatted" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.OutputFormattedOperation">
-					</operation>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					needBorderDecorator="true"
-					multiLevel="true"
-					widget="true"
-					setNonVisualChildElements="true"
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					resolveChildText="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="outputLabel" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.pagedesigner.CreateElementOperation">
-						<parameter value="label"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyAttributeOperation">
-						<parameter value="for"/>
-					</operation>
-					<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.CreateClassAttributeOperation">
-						<parameter value="af_outputLabel"/>
-					</operation>
-					<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.CreateStyleAttributeOperation"/>
-					<operation id="org.eclipse.jst.pagedesigner.IfOperation">
-						<parameter value="@valueAndAccessKey"/>
-						<operation id="org.eclipse.jst.pagedesigner.ConvertAttributeToTextOperation">
-							<parameter value="valueAndAccessKey"/>
-						</operation>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.IfNotOperation">
-						<parameter value="@valueAndAccessKey"/>
-						<operation id="org.eclipse.jst.pagedesigner.ConvertAttributeToTextOperation">
-							<parameter value="value"/>
-						</operation>
-					</operation>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					needBorderDecorator="true"
-					multiLevel="true"
-					widget="true"
-					setNonVisualChildElements="true"
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					resolveChildText="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="outputText" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.pagedesigner.CreateElementOperation">
-						<parameter value="span"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyAttributeWithRenameOperation">
-						<parameter value="styleClass"/>
-						<parameter value="class"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyAttributeWithRenameOperation">
-						<parameter value="inlineStyle"/>
-						<parameter value="style"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.ConvertAttributeToTextOperation">
-						<parameter value="value"/>
-					</operation>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					needBorderDecorator="true"
-					multiLevel="true"
-					widget="true"
-					setNonVisualChildElements="true"
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					resolveChildText="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="panelFormLayout" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.PanelFormLayoutOperation"/>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					multiLevel="true"
-					needBorderDecorator="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="panelGroupLayout" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.PanelGroupLayoutOperation"/>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					multiLevel="true"
-					needBorderDecorator="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="panelLabelAndMessage" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.PanelLabelAndMessageOperation">
-					</operation>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					multiLevel="true"
-					needBorderDecorator="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="panelTabbed" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.PanelTabbedOperation"/>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					multiLevel="true"
-					needBorderDecorator="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="panelTip" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.pagedesigner.CreateElementOperation">
-						<parameter value="div"/>
-					</operation>
-					<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.CreateClassAttributeOperation">
-						<parameter value="af_panelTip"/>
-					</operation>
-					<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.CreateStyleAttributeOperation"/>
-					<operation id="org.eclipse.jst.pagedesigner.AppendChildElementOperation">
-						<parameter value="span"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-						<parameter value="class"/>
-						<parameter value="af_panelTip_label"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.AppendChildTextOperation">
-						<parameter value="TIP "/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.MakeParentElementCurrentOperation"/>
-					<operation id="org.eclipse.jst.pagedesigner.AppendChildElementOperation">
-						<parameter value="span"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyChildrenOperation"/>
-					<operation id="org.eclipse.jst.pagedesigner.MakeParentElementCurrentOperation"/>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					multiLevel="true"
-					needBorderDecorator="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="poll" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-decorate-info id="vpd-decorate-design"
-					nonVisual="true"
-					nonVisualImagePath="icons/small/poll.gif"
-					widget="true"
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					nonVisual="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="progressIndicator" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.pagedesigner.CreateElementOperation">
-						<parameter value="table"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-						<parameter value="cellpadding"/>
-						<parameter value="0"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-						<parameter value="cellspacing"/>
-						<parameter value="0"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-						<parameter value="border"/>
-						<parameter value="0"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-						<parameter value="align"/>
-						<parameter value="center"/>
-					</operation>
-					<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.CreateClassAttributeOperation"/>
-					<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.CreateStyleAttributeOperation"/>
-					<operation id="org.eclipse.jst.pagedesigner.AppendChildElementOperation">
-						<parameter value="tr"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.AppendChildElementOperation">
-						<parameter value="td"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-						<parameter value="align"/>
-						<parameter value="center"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.AppendChildElementOperation">
-						<parameter value="div"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-						<parameter value="class"/>
-						<parameter value="p_OraProcessingStatus"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.AppendChildTextOperation">
-						<parameter value="Processing"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.MakeParentElementCurrentOperation"/>
-					<operation id="org.eclipse.jst.pagedesigner.MakeParentElementCurrentOperation"/>
-					<operation id="org.eclipse.jst.pagedesigner.MakeParentElementCurrentOperation"/>
-					<operation id="org.eclipse.jst.pagedesigner.AppendChildElementOperation">
-						<parameter value="tr"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.AppendChildElementOperation">
-						<parameter value="td"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-						<parameter value="align"/>
-						<parameter value="center"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyChildrenOperation"/>
-					<operation id="org.eclipse.jst.pagedesigner.MakeParentElementCurrentOperation"/>
-					<operation id="org.eclipse.jst.pagedesigner.MakeParentElementCurrentOperation"/>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					multiLevel="true"
-					widget="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="resetButton" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.pagedesigner.CreateElementOperation">
-						<parameter value="button"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-						<parameter value="type"/>
-						<parameter value="reset"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.IfOperation">
-						<parameter value="@disabled='true'"/>
-						<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-							<parameter value="disabled"/>
-							<parameter value=""/>
-						</operation>
-						<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.CreateClassAttributeOperation">
-							<parameter value="af_resetButton p_AFDisabled"/>
-						</operation>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.IfNotOperation">
-						<parameter value="@disabled='true'"/>
-						<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.CreateClassAttributeOperation">
-							<parameter value="af_resetButton"/>
-						</operation>
-					</operation>
-					<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.CreateStyleAttributeOperation"/>
-					<operation id="org.eclipse.jst.pagedesigner.IfOperation">
-						<parameter value="@textAndAccessKey"/>
-						<operation id="org.eclipse.jst.pagedesigner.ConvertAttributeToTextOperation">
-							<parameter value="textAndAccessKey"/>
-						</operation>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.IfNotOperation">
-						<parameter value="@textAndAccessKey"/>
-						<operation id="org.eclipse.jst.pagedesigner.ConvertAttributeToTextOperation">
-							<parameter value="text"/>
-						</operation>
-					</operation>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					multiLevel="true"
-					widget="true"
-					setNonVisualChildElements="true"
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					resolveChildText="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="selectBooleanCheckbox" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.SelectBooleanOperation">
-						<parameter value="checkbox"/>
-					</operation>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					multiLevel="true"
-					widget="true"
-					setNonVisualChildElements="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="selectBooleanRadio" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.SelectBooleanOperation">
-						<parameter value="radio"/>
-					</operation>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					multiLevel="true"
-					widget="true"
-					setNonVisualChildElements="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="selectItem" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-decorate-info id="vpd-decorate-design"
-					nonVisual="true"
-					nonVisualImagePath="icons/small/selectItem.gif"
-					widget="true"
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					nonVisual="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="selectManyCheckbox" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.SelectManyCheckboxOneRadioOperation">
-						<parameter value="checkbox"/>
-					</operation>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					multiLevel="true"
-					widget="true"
-					setNonVisualChildElements="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="selectManyListbox" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.SelectListboxChoiceOperation">
-						<parameter value="true"/>
-						<parameter value="true"/>
-					</operation>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					multiLevel="true"
-					widget="true"
-					setNonVisualChildElements="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="selectManyShuttle" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.SelectShuttleOperation">
-						<parameter value="false"/>
-					</operation>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					multiLevel="true"
-					widget="true"
-					setNonVisualChildElements="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="selectOneChoice" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.SelectListboxChoiceOperation">
-						<parameter value="false"/>
-						<parameter value="false"/>
-					</operation>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					multiLevel="true"
-					widget="true"
-					setNonVisualChildElements="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="selectOneListbox" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.SelectListboxChoiceOperation">
-						<parameter value="false"/>
-						<parameter value="true"/>
-					</operation>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					multiLevel="true"
-					widget="true"
-					setNonVisualChildElements="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="selectOneRadio" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.SelectManyCheckboxOneRadioOperation">
-						<parameter value="radio"/>
-					</operation>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					multiLevel="true"
-					widget="true"
-					setNonVisualChildElements="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="selectOrderShuttle" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.SelectShuttleOperation">
-						<parameter value="true"/>
-					</operation>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					multiLevel="true"
-					widget="true"
-					setNonVisualChildElements="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="selectRangeChoiceBar" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.pagedesigner.CreateElementOperation">
-						<parameter value="table"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyAttributeWithRenameOperation">
-						<parameter value="styleClass"/>
-						<parameter value="class"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyAttributeWithRenameOperation">
-						<parameter value="inlineStyle"/>
-						<parameter value="style"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-						<parameter value="cellpadding"/>
-						<parameter value="0"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-						<parameter value="cellspacing"/>
-						<parameter value="0"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-						<parameter value="border"/>
-						<parameter value="0"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.AppendChildElementOperation">
-						<parameter value="tr"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.AppendChildElementOperation">
-						<parameter value="td"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-						<parameter value="valign"/>
-						<parameter value="middle"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-						<parameter value="nowrap"/>
-						<parameter value=""/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.AppendChildElementOperation">
-						<parameter value="a"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-						<parameter value="href"/>
-						<parameter value="#"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-						<parameter value="class"/>
-						<parameter value="OraNavBarActiveLink"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.AppendChildTextFromXPathOperation">
-						<parameter value="concat('Previous ',@rows)"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.MakeParentElementCurrentOperation"/>
-					<operation id="org.eclipse.jst.pagedesigner.MakeParentElementCurrentOperation"/>
-					<operation id="org.eclipse.jst.pagedesigner.AppendChildElementOperation">
-						<parameter value="td"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-						<parameter value="valign"/>
-						<parameter value="middle"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-						<parameter value="nowrap"/>
-						<parameter value=""/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.AppendChildElementOperation">
-						<parameter value="select"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-						<parameter value="class"/>
-						<parameter value="AFFieldText"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.AppendChildElementOperation">
-						<parameter value="option"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.AppendChildTextOperation">
-						<parameter value="Show All n"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.MakeParentElementCurrentOperation"/>
-					<operation id="org.eclipse.jst.pagedesigner.AppendChildElementOperation">
-						<parameter value="option"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.AppendChildTextFromXPathOperation">
-						<parameter value="concat('1 - ',@rows,' of n')"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.MakeParentElementCurrentOperation"/>
-					<operation id="org.eclipse.jst.pagedesigner.AppendChildElementOperation">
-						<parameter value="option"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.AppendChildTextFromXPathOperation">
-						<parameter value="concat(@rows + 1,' - ',@rows * 2,' of n')"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.MakeParentElementCurrentOperation"/>
-					<operation id="org.eclipse.jst.pagedesigner.MakeParentElementCurrentOperation"/>
-					<operation id="org.eclipse.jst.pagedesigner.MakeParentElementCurrentOperation"/>
-					<operation id="org.eclipse.jst.pagedesigner.AppendChildElementOperation">
-						<parameter value="td"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-						<parameter value="valign"/>
-						<parameter value="middle"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-						<parameter value="nowrap"/>
-						<parameter value=""/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.AppendChildElementOperation">
-						<parameter value="a"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-						<parameter value="href"/>
-						<parameter value="#"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-						<parameter value="class"/>
-						<parameter value="OraNavBarActiveLink"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.AppendChildTextFromXPathOperation">
-						<parameter value="concat('Next ',@rows)"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.MakeParentElementCurrentOperation"/>
-					<operation id="org.eclipse.jst.pagedesigner.MakeParentElementCurrentOperation"/>
-					<operation id="org.eclipse.jst.pagedesigner.MakeParentElementCurrentOperation"/>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					multiLevel="true"
-					widget="true"
-					setNonVisualChildElements="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="separator" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.pagedesigner.CreateElementOperation">
-						<parameter value="hr"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyAttributeWithRenameOperation">
-						<parameter value="styleClass"/>
-						<parameter value="class"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyAttributeWithRenameOperation">
-						<parameter value="inlineStyle"/>
-						<parameter value="style"/>
-					</operation>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					widget="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="showDetailItem" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.ShowDetailItemOperation"/>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					needBorderDecorator="true"					
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="spacer" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.pagedesigner.CreateElementOperation">
-						<parameter value="img"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-						<parameter value="src"/>
-						<parameter value="$metadata-plugin-location$/icons/small/spacer.gif"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-						<parameter value="alt"/>
-						<parameter value=""/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyAttributeOperation">
-						<parameter value="width"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyAttributeOperation">
-						<parameter value="height"/>
-					</operation>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					needBorderDecorator="true"
-					multiLevel="true"
-					widget="true"
-				>
-					<resolve-attribute-value attributeName="src"/>
-				</tag-decorate-info>
-				<tag-decorate-info id="vpd-decorate-preview">
-					<resolve-attribute-value attributeName="src"/>
-				</tag-decorate-info>
-			</value>
-		</trait>
-	</entity>
-
-</md:metadatamodel>
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/metadata/trinidad_html.properties b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/metadata/trinidad_html.properties
deleted file mode 100644
index fd5e7d1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/metadata/trinidad_html.properties
+++ /dev/null
@@ -1,14 +0,0 @@
-
-###############################################################################
-# Copyright (c) 2008 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-property.category.event=Event
-property.category.core=Core
-property.category.css=CSS
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/metadata/trinidad_html.xml b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/metadata/trinidad_html.xml
deleted file mode 100644
index b6d4f6a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/metadata/trinidad_html.xml
+++ /dev/null
@@ -1,408 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<md:metadatamodel id="http://myfaces.apache.org/trinidad/html"
-    type="tagFile"
-    xmlns:cnst="http://org.eclipse.jst.jsf.core/constraints.ecore"
-    xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore"
-    xmlns:md="http://org.eclipse.jst.jsf.common.metadata/metadata.ecore"
-    xmlns:mdt="http://org.eclipse.jst.jsf.common.metadata/metadataTraitTypes.ecore" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xmlns:qe="http://org.eclipse.jsf.pagedesigner/QuickEditTabSections.ecore">
-    <entity id="body" type="tag">
- 		<include-entity-group id="common-core-attributes" uri="http://myfaces.apache.org/trinidad"/>
- 		<include-entity-group id="common-trinidadh-attributes"/> 
- 		<include-entity-group id="common-partialTrigger-attribute"/>
- 		<include-entity-group id="common-event-attributes" uri="http://myfaces.apache.org/trinidad"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="initialFocusId"/>						
-			</value>
-		</trait>
-        <entity id="firstClickPassed">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-        <entity id="initialFocusId"/>
-    </entity>
-    <entity id="cellFormat" type="tag">
-		<include-entity-group id="common-core-attributes" uri="http://myfaces.apache.org/trinidad"/>
-		<include-entity-group id="common-trinidadh-attributes"/> 
-		<include-entity-group id="common-partialTrigger-attribute"/>
-		<include-entity-group id="common-event-attributes" uri="http://myfaces.apache.org/trinidad"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="columnSpan"/>
-				<section id="width"/>
-				<section id="height"/>							
-			</value>
-		</trait>
-        <entity id="shortText"/>
-        <entity id="halign">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-            </trait>
-			<trait id="valid-values">
-			 	<value xsi:type="mdt:ListOfValues">
-					<item>right</item>
-					<item>left</item>
-					<item>start</item>
-					<item>end</item>
-					<item>center</item>					
-				</value>
-			</trait>
-        </entity>
-        <entity id="valign">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-            </trait>
-            <trait id="valid-values">
-                <value xsi:type="mdt:ListOfValues">
-                    <item>top</item>
-                    <item>middle</item>
-                    <item>bottom</item>
-                </value>
-            </trait>
-        </entity>
-        <entity id="width">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.LengthType</value>
-            </trait>
-        </entity>
-        <entity id="height">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.LengthType</value>
-            </trait>
-        </entity>
-        <entity id="columnSpan">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>
-        </entity>
-        <entity id="rowSpan">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>
-        </entity>
-        <entity id="wrappingDisabled">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-        <entity id="headers"/>
-        <entity id="header">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>        
-    </entity>
-    <entity id="frame" type="tag">
-		<include-entity-group id="common-core-attributes" uri="http://myfaces.apache.org/trinidad"/>
-		<include-entity-group id="common-trinidadh-attributes"/> 
-		<include-entity-group id="common-partialTrigger-attribute"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="source"/>
-				<section id="name"/>								
-			</value>
-		</trait>
-        <entity id="source"/>
-        <entity id="longDescURL"/>
-        <entity id="name"/>
-        <entity id="width">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.LengthType</value>
-            </trait>
-        </entity>
-        <entity id="height">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.LengthType</value>
-            </trait>
-        </entity>
-        <entity id="marginWidth">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>
-            <trait id="valid-minimum">
-            	<value>1</value>
-            </trait>
-        </entity>
-        <entity id="marginHeight">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>
-            <trait id="valid-minimum">
-            	<value>1</value>
-            </trait>
-        </entity>
-        <entity id="scrolling">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-            </trait>
-			<trait id="valid-values">
-			 	<value xsi:type="mdt:ListOfValues">
-					<item>auto</item>
-					<item>yes</item>
-					<item>no</item>>					
-				</value>
-			</trait>
-			<trait id="default-value">
-				<value>auto</value>
-			</trait>
-        </entity>
-    </entity>
-    <entity id="frameBorderLayout" type="tag">
-        <include-entity-group id="common-core-attributes" uri="http://myfaces.apache.org/trinidad"/>
-        <include-entity-group id="common-trinidadh-attributes"/> 
-        <include-entity-group id="common-partialTrigger-attribute"/>
-    	<trait id="supported-facets">			
-			<value xsi:type="mdt:ListOfValues">
-				<item>alternateContent</item>
-				<item>bottom</item>
-				<item>center</item>
-				<item>end</item>
-				<item>innerEnd</item>
-				<item>innerLeft</item>
-				<item>innerRight</item>
-				<item>innerStart</item>
-				<item>left</item>
-				<item>right</item>
-				<item>start</item>
-				<item>top</item>
-			</value> 	
-   		</trait>  
-   		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>			
-				<section id="width"/>
-				<section id="height"/>							
-			</value>
-		</trait>
-        <entity id="onload">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.ScriptType</value>
-			</trait>
-			<trait id="category">
-				<value>%property.category.event</value>
-			</trait>			
-		</entity>
-        <entity id="onunload">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.ScriptType</value>
-			</trait>
-			<trait id="category">
-				<value>%property.category.event</value>
-			</trait>			
-		</entity>
-        <entity id="width">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.LengthType</value>
-            </trait>
-        </entity>
-        <entity id="height">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.LengthType</value>
-            </trait>
-        </entity>
-        <entity id="frameSpacing">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>
-        </entity>
-        <entity id="borderWidth">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>
-        </entity>
-        <entity id="frameBorderWidth">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>
-        </entity>
-    </entity>
-    <entity id="head" type="tag">
-        <include-entity-group id="common-core-attributes" uri="http://myfaces.apache.org/trinidad"/>
-        <include-entity-group id="common-partialTrigger-attribute"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>							
-			</value>
-		</trait>
-        <entity id="title"/>
-    </entity>
-    <entity id="html" type="tag">
-        <include-entity-group id="common-core-attributes" uri="http://myfaces.apache.org/trinidad"/>
-        <trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="mode"/>							
-			</value>
-		</trait>
-        <entity id="mode">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-            </trait>
-			<trait id="valid-values">
-			 	<value xsi:type="mdt:ListOfValues">
-					<item>default</item>
-					<item>strict</item>
-					<item>quirks</item>>					
-				</value>
-			</trait>
-			<trait id="default-value">
-				<value>default</value>
-			</trait>
-        </entity>
-    </entity>
-    <entity id="rowLayout" type="tag">
-        <include-entity-group id="common-core-attributes" uri="http://myfaces.apache.org/trinidad"/>
-        <include-entity-group id="common-trinidadh-attributes"/>
-        <include-entity-group id="common-partialTrigger-attribute"/>
-        <include-entity-group id="common-event-attributes" uri="http://myfaces.apache.org/trinidad"/>
-        <trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="width"/>
-				<section id="halign"/>
-				<section id="valign"/>										
-			</value>
-		</trait>
-        <entity id="halign">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-            </trait>
-			<trait id="valid-values">
-			 	<value xsi:type="mdt:ListOfValues">
-					<item>right</item>
-					<item>left</item>
-					<item>start</item>
-					<item>end</item>
-					<item>center</item>					
-				</value>
-			</trait>
-        </entity>
-        <entity id="valign">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-            </trait>
-            <trait id="valid-values">
-                <value xsi:type="mdt:ListOfValues">
-                    <item>top</item>
-                    <item>middle</item>
-                    <item>bottom</item>
-                </value>
-            </trait>
-        </entity>
-        <entity id="width">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.LengthType</value>
-            </trait>
-        </entity>              
-    </entity>
-    <entity id="script" type="tag">
-        <include-entity-group id="common-core-attributes" uri="http://myfaces.apache.org/trinidad"/>
-        <include-entity-group id="common-partialTrigger-attribute"/>
-        <trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="source"/>													
-			</value>
-		</trait>
-        <entity id="text" />
-        <entity id="source" />
-        <entity id="generatesContent" />        
-    </entity>
-    <entity id="styleSheet" type="tag">
-		<include-entity-group id="common-core-attributes" uri="http://myfaces.apache.org/trinidad"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>										
-			</value>
-		</trait>
-    </entity> 
-    <entity id="tableLayout" type="tag">
- 		<include-entity-group id="common-core-attributes" uri="http://myfaces.apache.org/trinidad"/>
- 		<include-entity-group id="common-trinidadh-attributes"/> 
- 		<include-entity-group id="common-partialTrigger-attribute"/>
- 		<include-entity-group id="common-event-attributes" uri="http://myfaces.apache.org/trinidad"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="width"/>
-				<section id="halign"/>													
-			</value>
-		</trait>
-        <entity id="width">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.LengthType</value>
-            </trait>
-        </entity>
-        <entity id="halign">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-            </trait>
-			<trait id="valid-values">
-			 	<value xsi:type="mdt:ListOfValues">
-					<item>right</item>
-					<item>left</item>
-					<item>start</item>
-					<item>end</item>
-					<item>center</item>					
-				</value>
-			</trait>
-        </entity>
-        <entity id="cellSpacing">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>
-        </entity>
-        <entity id="cellPadding">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>
-        </entity>
-        <entity id="borderWidth">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>
-        </entity>
-        <entity id="summary"/>      
-    </entity>
-    <entityGroup id="common-trinidadh-attributes">
-        <entity id="inlineStyle">
-        	<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.pagedesigner.attributevalues.CSSStyleType</value>
-			</trait>
-			<trait id="category">
-				<value>%property.category.core</value>
-			</trait>			
-		</entity>
-        <entity id="styleClass">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.pagedesigner.attributevalues.CSSClassType</value>
-			</trait>
-			<trait id="category">
-				<value>%property.category.core</value>
-			</trait>				
-        </entity>
-        <entity id="shortDesc"/>
-    </entityGroup>
-    <entityGroup id="common-partialTrigger-attribute">
-    	<entity id="partialTriggers">
-    		<trait id="category">
-				<value>%property.category.core</value>
-			</trait>
-    	</entity>
-    </entityGroup>
-</md:metadatamodel>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/metadata/trinidad_html_dti.xml b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/metadata/trinidad_html_dti.xml
deleted file mode 100644
index aea52f5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/metadata/trinidad_html_dti.xml
+++ /dev/null
@@ -1,90 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<md:metadatamodel xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" 
-	xmlns:md="http://org.eclipse.jst.jsf.common.metadata/metadata.ecore"
-	xmlns:dti="http://org.eclipse.jsf.pagedesigner/dtinfo.ecore"
-	id="http://myfaces.apache.org/trinidad/html"
-	type="tagFile">
-
-	<entity id="body" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.pagedesigner.CreateElementOperation">
-						<parameter value="body"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyAttributeWithRenameOperation">
-						<parameter value="styleClass"/>
-						<parameter value="class"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyAttributeWithRenameOperation">
-						<parameter value="inlineStyle"/>
-						<parameter value="style"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyChildrenOperation"/>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					needBorderDecorator="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="head" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.pagedesigner.CreateElementOperation">
-						<parameter value="head"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.IfOperation">
-						<parameter value="@title"/>
-						<operation id="org.eclipse.jst.pagedesigner.AppendChildElementOperation">
-							<parameter value="title"/>
-						</operation>
-						<operation id="org.eclipse.jst.pagedesigner.AppendChildTextFromXPathOperation">
-							<parameter value="@title"/>
-						</operation>
-						<operation id="org.eclipse.jst.pagedesigner.MakeParentElementCurrentOperation"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyChildrenOperation"/>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					needBorderDecorator="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="html" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.pagedesigner.CreateElementOperation">
-						<parameter value="html"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyChildrenOperation"/>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					needBorderDecorator="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="styleSheet" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-decorate-info id="vpd-decorate-design"
-					nonVisual="true"
-					nonVisualImagePath="icons/small/styleSheet.gif"
-					widget="true"
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					nonVisual="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-</md:metadatamodel>
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/metadata/trinidad_html_pi.xml b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/metadata/trinidad_html_pi.xml
deleted file mode 100644
index ac1e508..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/metadata/trinidad_html_pi.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<md:metadatamodel id="http://myfaces.apache.org/trinidad/html"
-    type="tagFile"
-	xmlns:pi="http://org.eclipse.jsf.pagedesigner/paletteInfos.ecore"
-    xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore"
-    xmlns:md="http://org.eclipse.jst.jsf.common.metadata/metadata.ecore"
-    xmlns:mdt="http://org.eclipse.jst.jsf.common.metadata/metadataTraitTypes.ecore" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-    
-    <trait id="is-jsf-component-library">
-		<value>true</value>
-	</trait>
-    
-    <entity id="styleSheet" type="tag"/>
-    <entity id="body" type="tag"/>
-    <entity id="cellFormat" type="tag"/>
-    <entity id="frame" type="tag"/>
-    <entity id="frameBorderLayout" type="tag"/>
-    <entity id="head" type="tag"/>
-    <entity id="html" type="tag"/>
-    <entity id="rowLayout" type="tag"/>
-    <entity id="script" type="tag"/>
-    <entity id="tableLayout" type="tag"/>
-    
-</md:metadatamodel>
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/metadata/trinidad_pi.xml b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/metadata/trinidad_pi.xml
deleted file mode 100644
index fc42ca6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/metadata/trinidad_pi.xml
+++ /dev/null
@@ -1,133 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<md:metadatamodel id="http://myfaces.apache.org/trinidad"
-    type="tagFile"
-	xmlns:pi="http://org.eclipse.jsf.pagedesigner/paletteInfos.ecore"
-    xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore"
-    xmlns:md="http://org.eclipse.jst.jsf.common.metadata/metadata.ecore"
-    xmlns:mdt="http://org.eclipse.jst.jsf.common.metadata/metadataTraitTypes.ecore" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-    
-    <trait id="is-jsf-component-library">
-		<value>true</value>
-	</trait>
-    
-    <entity id="forEach" type="tag"/>
-    <entity id="setActionListener" type="tag"/>
-    <entity id="fileDownloadActionListener" type="tag"/>
-    <entity id="returnActionListener" type="tag"/>
-    <entity id="resetActionListener" type="tag"/>
-    <entity id="componentRef" type="tag"/>
-    <entity id="componentDef" type="tag"/>
-    <entity id="facetRef" type="tag"/>
-    <entity id="breadCrumbs" type="tag"/>
-    <entity id="chart" type="tag"/>
-    <entity id="chooseColor" type="tag"/>
-    <entity id="chooseDate" type="tag"/>
-    <entity id="column" type="tag"/>
-    <entity id="commandButton" type="tag"/>
-    <entity id="commandLink" type="tag"/>
-    <entity id="commandNavigationItem" type="tag"/>
-    <entity id="document" type="tag"/>
-    <entity id="form" type="tag"/>
-    <entity id="goButton" type="tag"/>
-    <entity id="goLink" type="tag"/>
-    <entity id="icon" type="tag"/>
-    <entity id="image" type="tag"/>
-    <entity id="importScript" type="tag"/>
-    <entity id="inputColor" type="tag"/>
-    <entity id="inputDate" type="tag"/>
-    <entity id="inputFile" type="tag"/>
-    <entity id="inputHidden" type="tag"/>
-    <entity id="inputListOfValues" type="tag"/>
-    <entity id="inputNumberSpinbox" type="tag"/>
-    <entity id="inputText" type="tag"/>
-    <entity id="legend" type="tag"/>
-    <entity id="media" type="tag"/>
-    <entity id="message" type="tag"/>
-    <entity id="messages" type="tag"/>
-    <entity id="navigationPane" type="tag"/>
-    <entity id="navigationTree" type="tag"/>
-    <entity id="outputDocument" type="tag"/>
-    <entity id="outputFormatted" type="tag"/>
-    <entity id="outputLabel" type="tag"/>
-    <entity id="outputText" type="tag"/>
-    <entity id="page" type="tag"/>
-    <entity id="panelAccordion" type="tag"/>
-    <entity id="panelBorderLayout" type="tag"/>
-    <entity id="panelBox" type="tag"/>
-    <entity id="panelButtonBar" type="tag"/>
-    <entity id="panelCaptionGroup" type="tag"/>
-    <entity id="panelChoice" type="tag"/>
-    <entity id="panelFormLayout" type="tag"/>
-    <entity id="panelGroupLayout" type="tag"/>
-    <entity id="panelHeader" type="tag"/>
-    <entity id="panelHorizontalLayout" type="tag"/>
-    <entity id="panelLabelAndMessage" type="tag"/>
-    <entity id="panelList" type="tag"/>
-    <entity id="panelPage" type="tag"/>
-    <entity id="panelPageHeader" type="tag"/>
-    <entity id="panelPopup" type="tag"/>
-    <entity id="panelRadio" type="tag"/>
-    <entity id="panelSideBar" type="tag"/>
-    <entity id="panelTabbed" type="tag">
-		<trait id="tag-create">
-			<value xsi:type="pi:TagCreationInfo">
-				<template><![CDATA[ 
-				<showDetailItem text="Tab 1" 
-					_uri_="http://myfaces.apache.org/trinidad"
-				/>
-				<showDetailItem text="Tab 2" 
-					_uri_="http://myfaces.apache.org/trinidad"
-				/>
-				]]></template>				
-			</value>
-		</trait>
-	</entity>
-    <entity id="panelTip" type="tag"/>
-    <entity id="poll" type="tag"/>
-    <entity id="processChoiceBar" type="tag"/>
-    <entity id="progressIndicator" type="tag"/>
-    <entity id="resetButton" type="tag"/>
-    <entity id="selectBooleanCheckbox" type="tag"/>
-    <entity id="selectBooleanRadio" type="tag"/>
-    <entity id="selectItem" type="tag"/>
-    <entity id="selectManyCheckbox" type="tag"/>
-    <entity id="selectManyListbox" type="tag"/>
-    <entity id="selectManyShuttle" type="tag"/>
-    <entity id="selectOneChoice" type="tag"/>
-    <entity id="selectOneListbox" type="tag"/>
-    <entity id="selectOneRadio" type="tag"/>
-    <entity id="selectOrderShuttle" type="tag"/>
-    <entity id="selectRangeChoiceBar" type="tag"/>
-    <entity id="separator" type="tag"/>
-    <entity id="showDetail" type="tag"/>
-    <entity id="showDetailHeader" type="tag"/>
-    <entity id="showDetailItem" type="tag">
- 		<trait id="tag-create">
- 			<value xsi:type="pi:TagCreationInfo">
-				<attribute id="text" value="Tab" />
- 			</value>
- 		</trait>
-    </entity>
-    <entity id="singleStepButtonBar" type="tag"/>
-    <entity id="spacer" type="tag"/>
-    <entity id="statusIndicator" type="tag"/>
-    <entity id="subform" type="tag"/>
-    <entity id="table" type="tag"/>
-    <entity id="train" type="tag"/>
-    <entity id="tree" type="tag"/>
-    <entity id="treeTable" type="tag"/>
-    <entity id="group" type="tag"/>
-    <entity id="iterator" type="tag"/>
-    <entity id="switcher" type="tag"/>
-    <entity id="convertColor" type="tag"/>
-    <entity id="convertDateTime" type="tag"/>
-    <entity id="convertNumber" type="tag"/>
-    <entity id="validateByteLength" type="tag"/>
-    <entity id="validateDateRestriction" type="tag"/>
-    <entity id="validateDateTimeRange" type="tag"/>
-    <entity id="validateDoubleRange" type="tag"/>
-    <entity id="validateLength" type="tag"/>
-    <entity id="validateLongRange" type="tag"/>
-    <entity id="validateRegExp" type="tag"/>
-    
-</md:metadatamodel>
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/metadata/viewMapping_trinidad.xml b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/metadata/viewMapping_trinidad.xml
deleted file mode 100644
index f030ebb..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/metadata/viewMapping_trinidad.xml
+++ /dev/null
@@ -1,1913 +0,0 @@
-<?xml version="1.0" encoding="ASCII"?>
-<md:metadatamodel xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:viewMap="http://org.eclipse.jst.jsf.core/componentMapping.ecore" xsi:noNamespaceSchemaLocation="http://org.eclipse.jst.jsf.core/componentMapping.ecore" xmlns:md="http://org.eclipse.jst.jsf.common.metadata/metadata.ecore" id="http://myfaces.apache.org/trinidad" type="tagFile">
-  <entity id="panelList" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.layout.CorePanelList</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXPanel</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CorePanelList</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Panel</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.List</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="selectManyListbox" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.input.CoreSelectManyListbox</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXSelectMany</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXEditableValue</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXValue</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <interfaces>javax.faces.component.ValueHolder</interfaces>
-            <interfaces>javax.faces.component.EditableValueHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreSelectManyListbox</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.SelectMany</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Listbox</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="tree" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.data.CoreTree</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXTree</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXHierarchy</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXCollection</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <interfaces>org.apache.myfaces.trinidad.model.RowKeyIndex</interfaces>
-            <interfaces>org.apache.myfaces.trinidad.component.CollectionComponent</interfaces>
-            <interfaces>javax.faces.component.NamingContainer</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreTree</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Tree</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Tree</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="validateDateTimeRange" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ValidatorTypeInfo_">
-            <className>org.apache.myfaces.trinidadinternal.validator.DateTimeRangeValidator</className>
-            <validatorId>org.apache.myfaces.trinidad.DateTimeRange</validatorId>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="showDetailItem" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.layout.CoreShowDetailItem</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXShowDetail</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreShowDetailItem</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.ShowDetail</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Item</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="panelTabbed" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.layout.CorePanelTabbed</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXShowOne</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CorePanelTabbed</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.ShowOne</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Tab</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="selectItem" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.input.CoreSelectItem</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXSelectItem</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreSelectItem</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.SelectItem</componentFamily>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="panelPopup" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.layout.CorePanelPopup</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXPanel</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CorePanelPopup</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Panel</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Popup</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="singleStepButtonBar" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.nav.CoreSingleStepButtonBar</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXSingleStep</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <interfaces>javax.faces.component.ActionSource</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreSingleStepButtonBar</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.SingleStep</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.ButtonBar</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="componentRef" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.UIXComponentRef</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <interfaces>javax.faces.component.NamingContainer</interfaces>
-            <componentType>org.apache.myfaces.trinidad.ComponentRef</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.ComponentRef</componentFamily>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="panelChoice" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.layout.CorePanelChoice</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXShowOne</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CorePanelChoice</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.ShowOne</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Choice</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="showDetail" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.layout.CoreShowDetail</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXShowDetail</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreShowDetail</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.ShowDetail</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.ShowDetail</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="processChoiceBar" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.nav.CoreProcessChoiceBar</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXProcess</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXNavigationHierarchy</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXHierarchy</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXCollection</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <interfaces>org.apache.myfaces.trinidad.model.RowKeyIndex</interfaces>
-            <interfaces>javax.faces.component.NamingContainer</interfaces>
-            <interfaces>org.apache.myfaces.trinidad.component.CollectionComponent</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreProcessChoiceBar</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Process</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.ChoiceBar</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="treeTable" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.data.CoreTreeTable</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXTreeTable</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXTree</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXHierarchy</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXCollection</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <interfaces>org.apache.myfaces.trinidad.model.RowKeyIndex</interfaces>
-            <interfaces>org.apache.myfaces.trinidad.component.CollectionComponent</interfaces>
-            <interfaces>javax.faces.component.NamingContainer</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreTreeTable</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.TreeTable</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.TreeTable</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="subform" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.CoreSubform</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXSubform</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <interfaces>javax.faces.component.NamingContainer</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreSubform</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Subform</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Subform</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="panelPage" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.layout.CorePanelPage</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXPanel</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CorePanelPage</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Panel</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Page</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="page" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.nav.CorePage</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXPage</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXNavigationHierarchy</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXHierarchy</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXCollection</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <interfaces>org.apache.myfaces.trinidad.model.RowKeyIndex</interfaces>
-            <interfaces>javax.faces.component.NamingContainer</interfaces>
-            <interfaces>org.apache.myfaces.trinidad.component.CollectionComponent</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CorePage</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Page</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Page</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="messages" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.output.CoreMessages</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXMessages</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreMessages</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Messages</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Messages</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="convertNumber" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ConverterTypeInfo_">
-            <className>org.apache.myfaces.trinidadinternal.convert.NumberConverter</className>
-            <converterId>org.apache.myfaces.trinidad.Number</converterId>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="message" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.output.CoreMessage</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXMessage</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreMessage</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Message</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Message</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="showDetailHeader" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.layout.CoreShowDetailHeader</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXShowDetail</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreShowDetailHeader</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.ShowDetail</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Header</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="chart" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.data.CoreChart</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXChart</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreChart</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Chart</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Chart</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="validateRegExp" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ValidatorTypeInfo_">
-            <className>org.apache.myfaces.trinidadinternal.validator.RegExpValidator</className>
-            <validatorId>org.apache.myfaces.trinidad.RegExp</validatorId>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="outputDocument" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.output.CoreOutputDocument</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXOutput</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXValue</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <interfaces>javax.faces.component.ValueHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreOutputDocument</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Output</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Document</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="convertColor" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ConverterTypeInfo_">
-            <className>org.apache.myfaces.trinidadinternal.convert.ColorConverter</className>
-            <converterId>org.apache.myfaces.trinidad.Color</converterId>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="icon" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.output.CoreIcon</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXObject</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreIcon</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Object</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Icon</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="image" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.output.CoreImage</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXObject</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreImage</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Object</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Image</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="inputText" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.input.CoreInputText</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXInput</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXEditableValue</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXValue</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <interfaces>javax.faces.component.ValueHolder</interfaces>
-            <interfaces>javax.faces.component.EditableValueHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreInputText</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Input</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Text</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="poll" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.CorePoll</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXPoll</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CorePoll</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Poll</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Poll</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="goButton" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.nav.CoreGoButton</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXGo</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreGoButton</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Go</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Button</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="validateDoubleRange" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ValidatorTypeInfo_">
-            <className>org.apache.myfaces.trinidadinternal.validator.DoubleRangeValidator</className>
-            <validatorId>org.apache.myfaces.trinidad.DoubleRange</validatorId>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="media" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.output.CoreMedia</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXObject</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreMedia</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Object</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Media</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="outputText" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.output.CoreOutputText</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXOutput</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXValue</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <interfaces>javax.faces.component.ValueHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreOutputText</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Output</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Text</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="selectRangeChoiceBar" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.data.CoreSelectRangeChoiceBar</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXSelectRange</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreSelectRangeChoiceBar</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.SelectRange</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.ChoiceBar</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="panelHorizontalLayout" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.layout.CorePanelHorizontalLayout</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXPanel</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CorePanelHorizontalLayout</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Panel</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.HorizontalLayout</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="resetButton" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.input.CoreResetButton</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXReset</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreResetButton</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.ResetButton</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Button</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="inputHidden" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.input.CoreInputHidden</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXInput</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXEditableValue</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXValue</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <interfaces>javax.faces.component.ValueHolder</interfaces>
-            <interfaces>javax.faces.component.EditableValueHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreInputHidden</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Input</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Hidden</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="spacer" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.output.CoreSpacer</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXObject</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreSpacer</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Object</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Spacer</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="selectOneChoice" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.input.CoreSelectOneChoice</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXSelectOne</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXEditableValue</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXValue</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <interfaces>javax.faces.component.ValueHolder</interfaces>
-            <interfaces>javax.faces.component.EditableValueHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreSelectOneChoice</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.SelectOne</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Choice</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="table" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.data.CoreTable</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXTable</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXIterator</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXCollection</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <interfaces>javax.faces.component.NamingContainer</interfaces>
-            <interfaces>org.apache.myfaces.trinidad.model.RowKeyIndex</interfaces>
-            <interfaces>org.apache.myfaces.trinidad.component.CollectionComponent</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreTable</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Table</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Table</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="switcher" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.UIXSwitcher</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.Switcher</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Switcher</componentFamily>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="panelGroupLayout" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.layout.CorePanelGroupLayout</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXPanel</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CorePanelGroupLayout</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Panel</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.GroupLayout</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="panelHeader" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.layout.CorePanelHeader</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXPanel</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CorePanelHeader</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Panel</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Header</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="panelTip" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.layout.CorePanelTip</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXPanel</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CorePanelTip</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Panel</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Tip</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="selectManyShuttle" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.input.CoreSelectManyShuttle</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXSelectMany</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXEditableValue</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXValue</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <interfaces>javax.faces.component.ValueHolder</interfaces>
-            <interfaces>javax.faces.component.EditableValueHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreSelectManyShuttle</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.SelectMany</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Shuttle</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="panelCaptionGroup" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.layout.CorePanelCaptionGroup</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXPanel</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CorePanelCaptionGroup</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Panel</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.PanelCaptionGroup</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="panelPageHeader" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.layout.CorePanelPageHeader</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXPanel</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CorePanelPageHeader</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Panel</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.PageHeader</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="selectOneRadio" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.input.CoreSelectOneRadio</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXSelectOne</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXEditableValue</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXValue</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <interfaces>javax.faces.component.ValueHolder</interfaces>
-            <interfaces>javax.faces.component.EditableValueHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreSelectOneRadio</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.SelectOne</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Radio</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="selectOneListbox" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.input.CoreSelectOneListbox</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXSelectOne</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXEditableValue</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXValue</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <interfaces>javax.faces.component.ValueHolder</interfaces>
-            <interfaces>javax.faces.component.EditableValueHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreSelectOneListbox</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.SelectOne</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Listbox</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="selectBooleanRadio" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.input.CoreSelectBooleanRadio</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXSelectBoolean</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXEditableValue</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXValue</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <interfaces>javax.faces.component.ValueHolder</interfaces>
-            <interfaces>javax.faces.component.EditableValueHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreSelectBooleanRadio</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.SelectBoolean</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Radio</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="commandButton" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.nav.CoreCommandButton</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXCommand</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <interfaces>javax.faces.component.ActionSource</interfaces>
-            <interfaces>org.apache.myfaces.trinidad.component.DialogSource</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreCommandButton</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Command</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Button</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="inputListOfValues" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.input.CoreInputListOfValues</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXSelectInput</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXEditableValue</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXValue</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <interfaces>javax.faces.component.ValueHolder</interfaces>
-            <interfaces>javax.faces.component.EditableValueHolder</interfaces>
-            <interfaces>javax.faces.component.ActionSource</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreInputListOfValues</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.SelectInput</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Text</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="goLink" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.nav.CoreGoLink</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXGo</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreGoLink</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Go</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Link</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="importScript" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.CoreImportScript</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreImportScript</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.ImportScript</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.ImportScript</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="group" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.UIXGroup</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.Group</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Group</componentFamily>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="train" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.nav.CoreTrain</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXProcess</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXNavigationHierarchy</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXHierarchy</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXCollection</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <interfaces>org.apache.myfaces.trinidad.model.RowKeyIndex</interfaces>
-            <interfaces>javax.faces.component.NamingContainer</interfaces>
-            <interfaces>org.apache.myfaces.trinidad.component.CollectionComponent</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreTrain</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Process</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Train</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="chooseColor" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.input.CoreChooseColor</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXChoose</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreChooseColor</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Choose</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Color</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="commandNavigationItem" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.nav.CoreCommandNavigationItem</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXCommand</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <interfaces>javax.faces.component.ActionSource</interfaces>
-            <interfaces>org.apache.myfaces.trinidad.component.DialogSource</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreCommandNavigationItem</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Command</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.NavigationItem</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="chooseDate" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.input.CoreChooseDate</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXChoose</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreChooseDate</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Choose</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Date</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="panelButtonBar" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.layout.CorePanelButtonBar</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXPanel</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CorePanelButtonBar</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Panel</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.ButtonBar</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="legend" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.output.CoreLegend</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXObject</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreLegend</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Object</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Legend</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="inputColor" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.input.CoreInputColor</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXSelectInput</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXEditableValue</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXValue</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <interfaces>javax.faces.component.ValueHolder</interfaces>
-            <interfaces>javax.faces.component.EditableValueHolder</interfaces>
-            <interfaces>javax.faces.component.ActionSource</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreInputColor</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.SelectInput</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Color</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="outputLabel" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.output.CoreOutputLabel</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXOutput</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXValue</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <interfaces>javax.faces.component.ValueHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreOutputLabel</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Output</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Label</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="inputFile" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.input.CoreInputFile</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXInput</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXEditableValue</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXValue</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <interfaces>javax.faces.component.ValueHolder</interfaces>
-            <interfaces>javax.faces.component.EditableValueHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreInputFile</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Input</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.File</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="panelFormLayout" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.layout.CorePanelFormLayout</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXPanel</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CorePanelFormLayout</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Panel</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.FormLayout</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="form" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.CoreForm</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXForm</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreForm</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Form</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Form</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="validateLongRange" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ValidatorTypeInfo_">
-            <className>org.apache.myfaces.trinidadinternal.validator.LongRangeValidator</className>
-            <validatorId>org.apache.myfaces.trinidad.LongRange</validatorId>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="column" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.data.CoreColumn</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXColumn</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreColumn</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Column</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Column</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="inputDate" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.input.CoreInputDate</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXSelectInput</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXEditableValue</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXValue</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <interfaces>javax.faces.component.ValueHolder</interfaces>
-            <interfaces>javax.faces.component.EditableValueHolder</interfaces>
-            <interfaces>javax.faces.component.ActionSource</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreInputDate</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.SelectInput</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Date</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="validateLength" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ValidatorTypeInfo_">
-            <className>org.apache.myfaces.trinidadinternal.validator.LengthValidator</className>
-            <validatorId>org.apache.myfaces.trinidad.Length</validatorId>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="progressIndicator" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.output.CoreProgressIndicator</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXProgress</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <interfaces>javax.faces.component.ActionSource</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreProgressIndicator</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Progress</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Indicator</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="validateDateRestriction" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ValidatorTypeInfo_">
-            <className>org.apache.myfaces.trinidadinternal.validator.DateRestrictionValidator</className>
-            <validatorId>org.apache.myfaces.trinidad.DateRestriction</validatorId>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="panelSideBar" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.layout.CorePanelSideBar</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXPanel</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CorePanelSideBar</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Panel</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.SideBar</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="convertDateTime" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ConverterTypeInfo_">
-            <className>org.apache.myfaces.trinidadinternal.convert.DateTimeConverter</className>
-            <converterId>org.apache.myfaces.trinidad.DateTime</converterId>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="separator" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.output.CoreSeparator</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXObject</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreSeparator</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Object</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Separator</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="document" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.CoreDocument</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXDocument</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreDocument</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Document</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Document</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="inputNumberSpinbox" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.input.CoreInputNumberSpinbox</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXInput</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXEditableValue</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXValue</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <interfaces>javax.faces.component.ValueHolder</interfaces>
-            <interfaces>javax.faces.component.EditableValueHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreInputNumberSpinbox</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Input</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.NumberSpinbox</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="validateByteLength" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ValidatorTypeInfo_">
-            <className>org.apache.myfaces.trinidadinternal.validator.ByteLengthValidator</className>
-            <validatorId>org.apache.myfaces.trinidad.ByteLength</validatorId>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="navigationTree" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.nav.CoreNavigationTree</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXNavigationTree</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXNavigationHierarchy</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXHierarchy</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXCollection</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <interfaces>org.apache.myfaces.trinidad.model.RowKeyIndex</interfaces>
-            <interfaces>javax.faces.component.NamingContainer</interfaces>
-            <interfaces>org.apache.myfaces.trinidad.component.CollectionComponent</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreNavigationTree</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.NavigationTree</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.NavigationTree</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="selectBooleanCheckbox" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.input.CoreSelectBooleanCheckbox</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXSelectBoolean</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXEditableValue</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXValue</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <interfaces>javax.faces.component.ValueHolder</interfaces>
-            <interfaces>javax.faces.component.EditableValueHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreSelectBooleanCheckbox</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.SelectBoolean</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Checkbox</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="navigationPane" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.nav.CoreNavigationPane</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXNavigationLevel</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXNavigationHierarchy</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXHierarchy</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXCollection</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <interfaces>org.apache.myfaces.trinidad.model.RowKeyIndex</interfaces>
-            <interfaces>org.apache.myfaces.trinidad.component.CollectionComponent</interfaces>
-            <interfaces>javax.faces.component.NamingContainer</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreNavigationPane</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.NavigationLevel</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Pane</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="selectManyCheckbox" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.input.CoreSelectManyCheckbox</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXSelectMany</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXEditableValue</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXValue</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <interfaces>javax.faces.component.ValueHolder</interfaces>
-            <interfaces>javax.faces.component.EditableValueHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreSelectManyCheckbox</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.SelectMany</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Checkbox</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="statusIndicator" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.output.CoreStatusIndicator</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXObject</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreStatusIndicator</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Object</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.StatusIndicator</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="panelRadio" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.layout.CorePanelRadio</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXShowOne</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CorePanelRadio</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.ShowOne</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Radio</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="panelBox" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.layout.CorePanelBox</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXPanel</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CorePanelBox</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Panel</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Box</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="iterator" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.UIXIterator</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXCollection</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <interfaces>javax.faces.component.NamingContainer</interfaces>
-            <componentType>org.apache.myfaces.trinidad.Iterator</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Iterator</componentFamily>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="panelBorderLayout" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.layout.CorePanelBorderLayout</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXPanel</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CorePanelBorderLayout</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Panel</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.BorderLayout</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="panelAccordion" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.layout.CorePanelAccordion</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXPanel</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CorePanelAccordion</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Panel</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Accordion</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="commandLink" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.nav.CoreCommandLink</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXCommand</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <interfaces>javax.faces.component.ActionSource</interfaces>
-            <interfaces>org.apache.myfaces.trinidad.component.DialogSource</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreCommandLink</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Command</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Link</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="panelLabelAndMessage" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.layout.CorePanelLabelAndMessage</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXPanel</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CorePanelLabelAndMessage</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Panel</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.LabelAndMessage</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="selectOrderShuttle" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.input.CoreSelectOrderShuttle</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXSelectOrder</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXSelectMany</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXEditableValue</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXValue</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <interfaces>javax.faces.component.ValueHolder</interfaces>
-            <interfaces>javax.faces.component.EditableValueHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreSelectOrderShuttle</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.SelectOrder</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Shuttle</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="outputFormatted" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.output.CoreOutputFormatted</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXOutput</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXValue</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <interfaces>javax.faces.component.ValueHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreOutputFormatted</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Output</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Formatted</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="breadCrumbs" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.nav.CoreBreadCrumbs</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXNavigationPath</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXNavigationHierarchy</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXHierarchy</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXCollection</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <interfaces>org.apache.myfaces.trinidad.model.RowKeyIndex</interfaces>
-            <interfaces>org.apache.myfaces.trinidad.component.CollectionComponent</interfaces>
-            <interfaces>javax.faces.component.NamingContainer</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreBreadCrumbs</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.NavigationPath</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.BreadCrumbs</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-</md:metadatamodel>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/metadata/viewMapping_trinidad_html.xml b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/metadata/viewMapping_trinidad_html.xml
deleted file mode 100644
index c1423b7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/metadata/viewMapping_trinidad_html.xml
+++ /dev/null
@@ -1,193 +0,0 @@
-<?xml version="1.0" encoding="ASCII"?>
-<md:metadatamodel xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:viewMap="http://org.eclipse.jst.jsf.core/componentMapping.ecore" xsi:noNamespaceSchemaLocation="http://org.eclipse.jst.jsf.core/componentMapping.ecore" xmlns:md="http://org.eclipse.jst.jsf.common.metadata/metadata.ecore" id="http://myfaces.apache.org/trinidad/html" type="tagFile">
-  <entity id="frame" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.html.HtmlFrame</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.HtmlFrame</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Frame</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Frame</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="html" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.html.HtmlHtml</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.HtmlHtml</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Html</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Html</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="script" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.html.HtmlScript</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.HtmlScript</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Script</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Script</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="head" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.html.HtmlHead</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.HtmlHead</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Head</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Head</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="rowLayout" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.html.HtmlRowLayout</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.HtmlRowLayout</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.RowLayout</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.RowLayout</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="frameBorderLayout" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.html.HtmlFrameBorderLayout</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.HtmlFrameBorderLayout</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.FrameBorderLayout</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.FrameBorderLayout</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="styleSheet" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.CoreStyleSheet</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreStyleSheet</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.StyleSheet</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.StyleSheet</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="cellFormat" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.html.HtmlCellFormat</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.HtmlCellFormat</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.CellFormat</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.CellFormat</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="tableLayout" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.html.HtmlTableLayout</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.HtmlTableLayout</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.TableLayout</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.TableLayout</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="body" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.html.HtmlBody</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.HtmlBody</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Body</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Body</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-</md:metadatamodel>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/plugin.properties b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/plugin.properties
deleted file mode 100644
index 8a7fa94..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/plugin.properties
+++ /dev/null
@@ -1,27 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2008 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-
-
-# ====================================================================
-# To code developer:
-#   Do NOT change the properties between this line and the
-#   "%%% END OF TRANSLATED PROPERTIES %%%" line.
-#   Make a new property name, append to the end of the file and change
-#   the code to use the new property.
-# ====================================================================
-
-# ====================================================================
-# %%% END OF TRANSLATED PROPERTIES %%%
-# ====================================================================
-
-pluginName = JavaServer Faces Tools - Taglibrary Metadata (Apache Trinidad)
-pluginProvider = Eclipse.org
-
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/plugin.xml b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/plugin.xml
deleted file mode 100644
index a0a4833..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/plugin.xml
+++ /dev/null
@@ -1,130 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.2"?>
-<plugin>
-   <extension
-         point="org.eclipse.jst.jsf.common.standardMetaDataFiles">
-      <standardMetaDataFile
-            location="$nl$/metadata/trinidad.xml"
-            uri="http://myfaces.apache.org/trinidad">
-      </standardMetaDataFile>  
-      <standardMetaDataFile
-            location="$nl$/metadata/trinidad_pi.xml"
-            uri="http://myfaces.apache.org/trinidad">
-      </standardMetaDataFile>    
-      <standardMetaDataFile
-            location="$nl$/metadata/trinidad_dti.xml"
-            uri="http://myfaces.apache.org/trinidad">
-      </standardMetaDataFile>
-      <standardMetaDataFile
-            location="$nl$/metadata/trinidad_html.xml"
-            uri="http://myfaces.apache.org/trinidad/html">
-      </standardMetaDataFile>
-      <standardMetaDataFile
-            location="$nl$/metadata/trinidad_html_pi.xml"
-            uri="http://myfaces.apache.org/trinidad/html">
-      </standardMetaDataFile> 
-      <standardMetaDataFile
-            location="$nl$/metadata/trinidad_html_dti.xml"
-            uri="http://myfaces.apache.org/trinidad/html">
-      </standardMetaDataFile>
-      <standardMetaDataFile
-            location="$nl$/metadata/viewMapping_trinidad.xml"
-            uri="http://myfaces.apache.org/trinidad">
-      </standardMetaDataFile>
-      <standardMetaDataFile
-            location="$nl$/metadata/viewMapping_trinidad_html.xml"
-            uri="http://myfaces.apache.org/trinidad/html">
-      </standardMetaDataFile>
-   </extension>
-   <extension
-         point="org.eclipse.jst.pagedesigner.pageDesignerExtension">
-      <elementEditFactory
-            class="org.eclipse.jst.jsf.apache.trinidad.tagsupport.elementedit.TrinidadCoreElementEditFactory">
-      </elementEditFactory>
-      <tagTransformOperation
-            class="org.eclipse.jst.jsf.apache.trinidad.tagsupport.converter.operations.BreadCrumbsOperation"
-            id="BreadCrumbsOperation">
-      </tagTransformOperation>
-      <tagTransformOperation
-            class="org.eclipse.jst.jsf.apache.trinidad.tagsupport.converter.operations.CommandNavigationItemOperation"
-            id="CommandNavigationItemOperation">
-      </tagTransformOperation>
-      <tagTransformOperation
-            class="org.eclipse.jst.jsf.apache.trinidad.tagsupport.converter.operations.CreateClassAttributeOperation"
-            id="CreateClassAttributeOperation">
-      </tagTransformOperation>
-      <tagTransformOperation
-            class="org.eclipse.jst.jsf.apache.trinidad.tagsupport.converter.operations.CreateStyleAttributeOperation"
-            id="CreateStyleAttributeOperation">
-      </tagTransformOperation>
-      <tagTransformOperation
-            class="org.eclipse.jst.jsf.apache.trinidad.tagsupport.converter.operations.InputFileOperation"
-            id="InputFileOperation">
-      </tagTransformOperation>
-      <tagTransformOperation
-            class="org.eclipse.jst.jsf.apache.trinidad.tagsupport.converter.operations.InputTextOperation"
-            id="InputTextOperation">
-      </tagTransformOperation>
-      <tagTransformOperation
-            class="org.eclipse.jst.jsf.apache.trinidad.tagsupport.converter.operations.InputTextWithIconOperation"
-            id="InputTextWithIconOperation">
-      </tagTransformOperation>
-      <tagTransformOperation
-            class="org.eclipse.jst.jsf.apache.trinidad.tagsupport.converter.operations.NavigationPaneOperation"
-            id="NavigationPaneOperation">
-      </tagTransformOperation>
-      <tagTransformOperation
-            class="org.eclipse.jst.jsf.apache.trinidad.tagsupport.converter.operations.OutputFormattedOperation"
-            id="OutputFormattedOperation">
-      </tagTransformOperation>
-      <tagTransformOperation
-            class="org.eclipse.jst.jsf.apache.trinidad.tagsupport.converter.operations.PanelFormLayoutOperation"
-            id="PanelFormLayoutOperation">
-      </tagTransformOperation>
-      <tagTransformOperation
-            class="org.eclipse.jst.jsf.apache.trinidad.tagsupport.converter.operations.PanelGroupLayoutOperation"
-            id="PanelGroupLayoutOperation">
-      </tagTransformOperation>
-      <tagTransformOperation
-            class="org.eclipse.jst.jsf.apache.trinidad.tagsupport.converter.operations.PanelLabelAndMessageOperation"
-            id="PanelLabelAndMessageOperation">
-      </tagTransformOperation>
-      <tagTransformOperation
-            class="org.eclipse.jst.jsf.apache.trinidad.tagsupport.converter.operations.PanelTabbedOperation"
-            id="PanelTabbedOperation">
-      </tagTransformOperation>
-      <tagTransformOperation
-            class="org.eclipse.jst.jsf.apache.trinidad.tagsupport.converter.operations.SelectBooleanOperation"
-            id="SelectBooleanOperation">
-      </tagTransformOperation>
-      <tagTransformOperation
-            class="org.eclipse.jst.jsf.apache.trinidad.tagsupport.converter.operations.SelectListboxChoiceOperation"
-            id="SelectListboxChoiceOperation">
-      </tagTransformOperation>
-      <tagTransformOperation
-            class="org.eclipse.jst.jsf.apache.trinidad.tagsupport.converter.operations.SelectManyCheckboxOneRadioOperation"
-            id="SelectManyCheckboxOneRadioOperation">
-      </tagTransformOperation>
-      <tagTransformOperation
-            class="org.eclipse.jst.jsf.apache.trinidad.tagsupport.converter.operations.SelectShuttleOperation"
-            id="SelectShuttleOperation">
-      </tagTransformOperation>
-      <tagTransformOperation
-            class="org.eclipse.jst.jsf.apache.trinidad.tagsupport.converter.operations.ShowDetailItemOperation"
-            id="ShowDetailItemOperation">
-      </tagTransformOperation>
-      <dtResourceProvider
-            class="org.eclipse.jst.jsf.apache.trinidad.tagsupport.dtresourceprovider.TrinidadDTResourceProvider"
-            id="http://myfaces.apache.org/trinidad">
-      </dtResourceProvider>
-   </extension>
-   <extension
-         point="org.eclipse.jst.jsf.core.variableresolver">
-      <variableresolver
-            class="org.eclipse.jst.jsf.apache.trinidad.tagsupport.el.TrinidadDecorativeVariableResolver"
-            forRuntimeClass="org.apache.myfaces.trinidadinternal.el.TrinidadVariableResolver"
-            id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.variableresolver1">
-      </variableresolver>
-   </extension>
-
-</plugin>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/images/close.gif b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/images/close.gif
deleted file mode 100644
index e792e28..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/images/close.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/images/list-bullet.gif b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/images/list-bullet.gif
deleted file mode 100644
index 8c0cf4f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/images/list-bullet.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/images/logo-dark.gif b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/images/logo-dark.gif
deleted file mode 100644
index 8f450e1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/images/logo-dark.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/images/tab3-bot-deselected.gif b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/images/tab3-bot-deselected.gif
deleted file mode 100644
index e0ec834..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/images/tab3-bot-deselected.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/images/tab3-bot-end-selected.gif b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/images/tab3-bot-end-selected.gif
deleted file mode 100644
index adc9eea..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/images/tab3-bot-end-selected.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/images/tab3-bot-mid-selected.gif b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/images/tab3-bot-mid-selected.gif
deleted file mode 100644
index 0db0c96..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/images/tab3-bot-mid-selected.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/images/tab3-bot-start-selected.gif b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/images/tab3-bot-start-selected.gif
deleted file mode 100644
index 72463ce..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/images/tab3-bot-start-selected.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/images/tab3-end-deselected.gif b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/images/tab3-end-deselected.gif
deleted file mode 100644
index d7417e1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/images/tab3-end-deselected.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/images/tab3-end-join-deselected-to-deselected.gif b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/images/tab3-end-join-deselected-to-deselected.gif
deleted file mode 100644
index 5416299..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/images/tab3-end-join-deselected-to-deselected.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/images/tab3-end-join-selected-to-deselected.gif b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/images/tab3-end-join-selected-to-deselected.gif
deleted file mode 100644
index 29f33e0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/images/tab3-end-join-selected-to-deselected.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/images/tab3-end-selected.gif b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/images/tab3-end-selected.gif
deleted file mode 100644
index d36b395..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/images/tab3-end-selected.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/images/tab3-mid-deselected.gif b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/images/tab3-mid-deselected.gif
deleted file mode 100644
index 2639558..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/images/tab3-mid-deselected.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/images/tab3-mid-selected.gif b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/images/tab3-mid-selected.gif
deleted file mode 100644
index 248de98..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/images/tab3-mid-selected.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/images/tab3-start-deselected.gif b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/images/tab3-start-deselected.gif
deleted file mode 100644
index 2c904c3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/images/tab3-start-deselected.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/images/tab3-start-join-deselected-to-deselected.gif b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/images/tab3-start-join-deselected-to-deselected.gif
deleted file mode 100644
index 1ec2d3f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/images/tab3-start-join-deselected-to-deselected.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/images/tab3-start-join-selected-to-deselected.gif b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/images/tab3-start-join-selected-to-deselected.gif
deleted file mode 100644
index 1ec2d3f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/images/tab3-start-join-selected-to-deselected.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/images/tab3-start-join-selected.gif b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/images/tab3-start-join-selected.gif
deleted file mode 100644
index f8ebc72..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/images/tab3-start-join-selected.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/images/tab3-start-selected.gif b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/images/tab3-start-selected.gif
deleted file mode 100644
index f4a260b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/images/tab3-start-selected.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/minimal.css b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/minimal.css
deleted file mode 100644
index 2bfe7cd..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/minimal.css
+++ /dev/null
@@ -1,243 +0,0 @@
-/* This CSS file generated on Thu Apr 02 15:47:44 PDT 2009 */
-.AFInstructionText,.AFFieldText,.af_outputText,.af_outputFormatted,.af_outputDocument,.af_inputChoice_content,.af_inputChoice_content-input,.af_inputText_content,.af_inputNumberSpinbox_content,.af_inputColor_content,.af_inputDate_content,.af_inputListOfValues_content,.af_selectManyCheckbox_content,.af_selectManyListbox_content,.af_selectOneChoice_content,.af_selectOneListbox_content,.af_selectOneRadio_content,.af_inputText.AFFieldTextMarker .af_inputText_content,.af_inputText.p_AFDisabled.AFFieldTextMarker .af_inputText_content,.af_inputText.AFFieldTextLTRMarker .af_inputText_content,.af_inputText.AFPhoneFieldTextMarker .af_inputText_content,.af_inputText.AFPostalCodeFieldTextMarker .af_inputText_content,.af_inputText.AFAddressFieldTextMarker .af_inputText_content,.af_inputChoice.AFFieldTextMarker .af_inputChoice_content-input,.af_inputChoice.p_AFDisabled.AFFieldTextMarker .af_inputChoice_content-input,.af_inputChoice.AFFieldTextLTRMarker .af_inputChoice_content-input,.af_inputChoice.AFPhoneFieldTextMarker .af_inputChoice_content-input,.af_inputChoice.AFPostalCodeFieldTextMarker .af_inputChoice_content-input,.af_inputChoice.AFAddressFieldTextMarker .af_inputChoice_content-input,.af_inputNumberSpinbox.AFFieldTextMarker .af_inputNumberSpinbox_content,.af_inputNumberSpinbox.p_AFDisabled.AFFieldTextMarker .af_inputNumberSpinbox_content,.af_inputNumberSpinbox.AFFieldTextLTRMarker .af_inputNumberSpinbox_content,.AFFieldTextLTR,.AFPhoneFieldText,.AFPostalCodeFieldText,.AFAddressFieldText,.PortletText1,.PortletText2,.PortletText3,.PortletText4,.portlet-form-input-field,.portlet-form-field {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;color:#000000}
-.AFInstructionTextDisabled,.AFFieldTextDisabled,.af_inputText.p_AFDisabled.AFFieldTextLTRMarker .af_inputText_content,.af_inputText.p_AFDisabled.AFPhoneFieldTextMarker .af_inputText_content,.af_inputText.p_AFDisabled.AFPostalCodeFieldTextMarker .af_inputText_content,.af_inputText.p_AFDisabled.AFAddressFieldTextMarker .af_inputText_content,.af_inputChoice.p_AFDisabled.AFFieldTextLTRMarker .af_inputChoice_content-input,.af_inputChoice.p_AFDisabled.AFPhoneFieldTextMarker .af_inputChoice_content-input,.af_inputChoice.p_AFDisabled.AFPostalCodeFieldTextMarker .af_inputChoice_content-input,.af_inputChoice.p_AFDisabled.AFAddressFieldTextMarker .af_inputChoice_content-input,.af_inputNumberSpinbox.p_AFDisabled.AFFieldTextLTRMarker .af_inputNumberSpinbox_content,.p_InContextBrandingText,.AFFieldTextLTRDisabled,.AFPhoneFieldTextDisabled,.AFPostalCodeFieldTextDisabled,.AFAddressFieldTextDisabled,.OraHGridNavRowInactiveLink,.OraNavBarInactiveLink,.portlet-font-dim {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;color:#999999}
-.AFDataText {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:bold;color:#000000}
-.AFDataTextDisabled {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:bold;color:#999999}
-.AFDataNumber {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:bold;color:#000000;text-align:right}
-.AFDataNumberDisabled {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:bold;color:#999999;text-align:right}
-.AFFieldNumber,.af_inputText.AFFieldNumberMarker .af_inputText_content,.af_inputChoice.AFFieldNumberMarker .af_inputChoice_content-input,.af_inputNumberSpinbox.AFFieldNumberMarker .af_inputNumberSpinbox_content {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;text-align:right;color:#000000}
-.AFFieldNumberDisabled,.af_inputText.p_AFDisabled.AFFieldNumberMarker .af_inputText_content,.af_inputChoice.p_AFDisabled.AFFieldNumberMarker .af_inputChoice_content-input,.af_inputNumberSpinbox.p_AFDisabled.AFFieldNumberMarker .af_inputNumberSpinbox_content {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;text-align:right;color:#999999}
-.AFLabelText,.af_outputLabel,.af_inputChoice_label,.af_inputFile_label,.af_inputNumberSpinbox_label,.af_inputText_label,.af_selectBooleanCheckbox_label,.af_selectBooleanRadio_label,.af_inputColor_label,.af_inputDate_label,.af_inputListOfValues_label,.af_selectManyCheckbox_label,.af_selectManyListbox_label,.af_selectOneChoice_label,.af_selectOneListbox_label,.af_selectOneRadio_label,.af_panelLabelAndMessage_label,.af_panelFormLayout_label-cell,.portlet-form-label,.portlet-icon-label,.portlet-dlg-icon-label,.portlet-form-field-label {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;text-align:right;color:#000000;padding:0px 8px 0px 0px;font-weight:normal}
-.AFLabelCell {padding:0px 8px 0px 0px}
-.AFErrorIconStyle {color:#cc0000;font-family:monospace;font-weight:bold}
-.AFInfoIconStyle,.AFWarningIconStyle,.AFQuickSelectIconStyle {color:#669966;font-family:monospace;font-weight:bold}
-.AFRequiredIconStyle {color:#669966;font-family:Courier,sans-serif}
-.AFQuickSelectDisabledIconStyle {color:#999999;font-family:monospace;font-weight:bold}
-.OraLink:link,.af_treeTable_path,.af_menuPath,.af_panelList A,.af_panelPopup_link,.OraLinkText,.OraHGridNavRowActiveLink,.OraNavBarActiveLink {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;color:#003333}
-.OraLink:active,.OraALinkText {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;color:#006666}
-.OraLink:visited,.OraVLinkText {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;color:#336666}
-.OraLinkDisabled,.af_outputLabel_required-icon-style,.af_inputChoice_required-icon-style,.af_inputNumberSpinbox_required-icon-style,.af_inputText_required-icon-style,.af_selectBooleanCheckbox_required-icon-style,.af_selectBooleanRadio_required-icon-style,.af_inputDate_required-icon-style,.af_selectManyCheckbox_required-icon-style,.af_selectManyListbox_required-icon-style,.af_selectOneChoice_required-icon-style,.af_selectOneListbox_required-icon-style,.af_selectOneRadio_required-icon-style,.af_outputLabel_group-icon-style,.af_inputChoice_group-icon-style,.af_inputNumberSpinbox_group-icon-style,.af_inputText_group-icon-style,.af_selectBooleanCheckbox_group-icon-style,.af_selectBooleanRadio_group-icon-style,.af_inputDate_group-icon-style,.af_selectManyCheckbox_group-icon-style,.af_selectManyListbox_group-icon-style,.af_selectOneChoice_group-icon-style,.af_selectOneListbox_group-icon-style,.af_selectOneRadio_group-icon-style,.af_menuList,.af_navigationPane_choice-label,.af_navigationPane_choice-options,.af_navigationPane_choice-button,.af_breadCrumbs,.af_selectManyShuttle_box-content,.af_selectOrderShuttle_box-content,.af_menuTabs,.af_commandButton,.af_goButton,.af_resetButton,.p_OraDisabled,.OraNav3,.p_OraTreeRow,.portlet-form-button {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal}
-.af_outputDocument_title,.AFHeaderLevelOne,H1.af_panelHeader,H1.af_showDetailHeader,.PortletHeaderText,.PortletHeading1,.PortletSubHeaderText,.portlet-section-header,.portlet-section-subheader,.portlet-table-header,.portlet-table-subheader {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:13pt;color:#669966;font-weight:bold;padding:0px;margin:0px}
-.af_outputDocument_paragraph {text-align:justify;padding:0px;margin:0px}
-.af_outputDocument_separator {text-align:center;padding:0px;margin:0px}
-.af_panelTip,.OraPageStampText,.af_singleStepButtonBar_label,.OraNavBarViewOnly {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;color:#669966}
-.af_panelTip_label {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:bold}
-.af_panelAccordion_toolbar,.p_OraContentFooterChildren {float:right}
-.af_dialog_container,.af_panelPopup_container {border-color:#336633;border:1px solid;background-color:white}
-.af_dialog_title-bar,.af_panelPopup_title-bar {background-color:#CCCCCC;border-color:#336633;border-bottom:1px solid;padding:2px 2px 2px 2px}
-.af_dialog_title-text,.af_panelPopup_title-text {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:11pt;font-weight:normal;white-space:nowrap;overflow:hidden}
-.af_dialog_close-icon {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:11pt;font-weight:normal;margin-left:5px;background-image:url(images/close.gif);background-position:center;background-repeat:no-repeat;height:13px;width:13px}
-.af_dialog_content,.af_panelPopup_content {background-color:#e9e8e8;border:0px}
-.af_inputChoice.p_AFDisabled .af_inputChoice_label,.af_inputNumberSpinbox.p_AFDisabled .af_inputNumberSpinbox_label,.af_inputText.p_AFDisabled .af_inputText_label,.af_selectBooleanCheckbox.p_AFDisabled .af_selectBooleanCheckbox_label,.af_selectBooleanRadio.p_AFDisabled .af_selectBooleanRadio_label,.af_inputColor.p_AFDisabled .af_inputColor_label,.af_inputDate.p_AFDisabled .af_inputDate_label,.af_inputListOfValues.p_AFDisabled .af_inputListOfValues_label,.af_selectManyCheckbox.p_AFDisabled .af_selectManyCheckbox_label,.af_selectManyListbox.p_AFDisabled .af_selectManyListbox_label,.af_selectOneChoice.p_AFDisabled .af_selectOneChoice_label,.af_selectOneListbox.p_AFDisabled .af_selectOneListbox_label,.af_selectOneRadio.p_AFDisabled .af_selectOneRadio_label,.af_navigationPane_bar-inactive-enabled .af_navigationPane_bar-content,.af_navigationPane_bar-active-enabled .af_navigationPane_bar-content a,.af_navigationPane_bar-inactive-enabled .af_navigationPane_bar-content a,.af_navigationPane_tabs-inactive .af_navigationPane_tabs-mid A {color:#000000}
-.af_inputNumberSpinbox_increment-cell,.af_inputNumberSpinbox_decrement-cell {background-color:#e9e8e8;border-color:#999999;border-width:1px;border-style:solid;width:11px;height:8px}
-.af_inputNumberSpinbox_spinbox-cell {padding-left:1px}
-.af_menuList_selected,.OraNav3Selected {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:bold;background-color:#ccffcc}
-.af_menuChoice_label,.portlet-font {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:8pt;font-weight:normal}
-BODY,.portlet-section-body,.portlet-table-body {background-color:#ffffff;font-family:Arial,Helvetica,Geneva,sans-serif}
-.af_treeTable_path-step,.af_menuPath_step,.af_menuPath_selected-step {color:#003333;font-size:9pt}
-.af_treeTable_path-selected-step {font-size:9pt;color:#000000}
-.af_panelList UL {margin-top:4px;margin-bottom:4px}
-button {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;background-color:#e9e8e8;padding:0px;margin:1px}
-.af_inputColor_swatch-overlay {position:relative;left:-7px;top:5px}
-.af_navigationPane_bar {background-color:#EFEFEF;padding-left:6px;padding-right:6px}
-.af_navigationPane_bar-active-disabled,.af_navigationPane_bar-inactive-disabled,.af_navigationPane_buttons-active-disabled,.af_navigationPane_buttons-inactive-disabled,.af_navigationPane_list-active-disabled,.af_navigationPane_list-inactive-disabled {cursor:default}
-.af_navigationPane_bar-active-enabled,.af_navigationPane_bar-inactive-enabled,.af_navigationPane_buttons-active-enabled,.af_navigationPane_buttons-inactive-enabled,.af_navigationPane_list-active-enabled,.af_navigationPane_list-inactive-enabled,.af_navigationPane_tabs-active,.af_navigationPane_tabs-inactive {cursor:pointer}
-.af_navigationPane_bar-active-enabled .af_navigationPane_bar-content {color:#000000;font-weight:bold}
-.af_navigationPane_bar-active-enabled .af_navigationPane_bar-content a:hover,.af_navigationPane_bar-inactive-enabled .af_navigationPane_bar-content a:hover,.af_navigationPane_buttons-active-enabled .af_navigationPane_buttons-content a:hover,.af_navigationPane_buttons-inactive-enabled .af_navigationPane_buttons-content a:hover,.af_navigationPane_list-active-enabled .af_navigationPane_list-content a:hover,.af_navigationPane_list-inactive-enabled .af_navigationPane_list-content a:hover,.AFAccessKeyStyle {text-decoration:underline}
-.af_navigationPane_bar-active-disabled .af_navigationPane_bar-content,.af_navigationPane_buttons-active-disabled .af_navigationPane_buttons-content,.af_navigationPane_list-active-disabled .af_navigationPane_list-content {color:gray;font-weight:bold}
-.af_navigationPane_bar-inactive-disabled .af_navigationPane_bar-content,.af_navigationPane_bar-active-disabled .af_navigationPane_bar-content a,.af_navigationPane_bar-inactive-disabled .af_navigationPane_bar-content a,.af_navigationPane_buttons-inactive-disabled .af_navigationPane_buttons-content,.af_navigationPane_buttons-active-disabled .af_navigationPane_buttons-content a,.af_navigationPane_buttons-inactive-disabled .af_navigationPane_buttons-content a,.af_navigationPane_list-inactive-disabled .af_navigationPane_list-content,.af_navigationPane_list-active-disabled .af_navigationPane_list-content a,.af_navigationPane_list-inactive-disabled .af_navigationPane_list-content a,.af_navigationPane_tabs-active.p_AFDisabled .af_navigationPane_tabs-mid,.af_navigationPane_tabs-inactive.p_AFDisabled .af_navigationPane_tabs-mid {color:gray}
-.af_navigationPane_bar-content,.af_navigationPane_buttons-content,.af_navigationPane_list-content {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;padding-top:3px;padding-bottom:3px}
-.af_navigationPane_bar-content a,.af_navigationPane_buttons-content a,.af_navigationPane_list-content a {text-decoration:none}
-.af_navigationPane_bar-separator {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;padding-left:6px;padding-right:6px;color:gray}
-.af_navigationPane_buttons-active-enabled .af_navigationPane_buttons-content,.af_navigationPane_list-active-enabled .af_navigationPane_list-content,.af_navigationPane_tabs-active .af_navigationPane_tabs-mid A,.AFLinkAccessKeyStyle,.af_inputDate_selected,.af_chooseDate_selected {font-weight:bold}
-.af_navigationPane_buttons-separator {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;padding-left:6px;padding-right:6px}
-.af_navigationPane_list-bullet {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;vertical-align:middle;width:17px;background-image:url(images/list-bullet.gif);background-position:center;background-repeat:no-repeat}
-.af_navigationPane_tabs {height:26px;overflow:hidden}
-.af_navigationPane_tabs-active.p_AFDisabled,.af_navigationPane_tabs-inactive.p_AFDisabled {cursor:default;color:gray}
-.af_navigationPane_tabs-start,.af_navigationPane_tabs-start-join {height:22px;width:26px;background-position:top right}
-.af_navigationPane_tabs-start-join-from-active,.af_navigationPane_tabs-start-join-from-inactive {height:22px;width:14px;background-repeat:no-repeat}
-.af_navigationPane_tabs-mid {height:22px;font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;color:#000000;padding-left:3px;white-space:nowrap}
-.af_navigationPane_tabs-end-join-to-inactive {height:22px;width:12px;background-repeat:no-repeat}
-.af_navigationPane_tabs-end {height:22px;width:15px}
-.af_navigationPane_tabs-bottom-start,.af_navigationPane_tabs-bottom-mid,.af_navigationPane_tabs-bottom-end {height:4px;background-repeat:repeat-x}
-.af_navigationPane_tabs-bottom-start-content {height:4px;width:17px;background-repeat:no-repeat}
-.af_navigationPane_tabs-bottom-mid-content {height:4px}
-.af_navigationPane_tabs-bottom-end-content {height:4px;width:100%;background-repeat:no-repeat}
-.af_navigationPane_tabs-mid A {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;color:#000000;text-decoration:none}
-.af_navigationPane_tabs-bottom-end-join {background-repeat:repeat-x}
-.af_navigationPane_tabs-active .af_navigationPane_tabs-start {background-image:url(images/tab3-start-selected.gif)}
-.af_navigationPane_tabs-active .af_navigationPane_tabs-start-join {background-image:url(images/tab3-start-join-selected.gif)}
-.af_navigationPane_tabs-active .af_navigationPane_tabs-bottom-start,.af_navigationPane_tabs-active .af_navigationPane_tabs-bottom-mid,.af_navigationPane_tabs-active .af_navigationPane_tabs-bottom-end {background-image:url(images/tab3-bot-mid-selected.gif)}
-.af_navigationPane_tabs-active .af_navigationPane_tabs-bottom-start-content {background-image:url(images/tab3-bot-start-selected.gif)}
-.af_navigationPane_tabs-active .af_navigationPane_tabs-mid {background-image:url(images/tab3-mid-selected.gif);font-weight:bold}
-.af_navigationPane_tabs-active .af_navigationPane_tabs-end-join-to-inactive {background-image:url(images/tab3-end-join-selected-to-deselected.gif)}
-.af_navigationPane_tabs-active .af_navigationPane_tabs-end {background-image:url(images/tab3-end-selected.gif)}
-.af_navigationPane_tabs-active .af_navigationPane_tabs-bottom-end-join,.af_navigationPane_tabs-inactive .af_navigationPane_tabs-bottom-start,.af_navigationPane_tabs-inactive .af_navigationPane_tabs-bottom-mid,.af_navigationPane_tabs-inactive .af_navigationPane_tabs-bottom-end,.af_navigationPane_tabs-inactive .af_navigationPane_tabs-bottom-end-join {background-image:url(images/tab3-bot-deselected.gif)}
-.af_navigationPane_tabs-active .af_navigationPane_tabs-bottom-end-content {background-image:url(images/tab3-bot-end-selected.gif)}
-.af_navigationPane_tabs-inactive .af_navigationPane_tabs-start {background-image:url(images/tab3-start-deselected.gif)}
-.af_navigationPane_tabs-inactive .af_navigationPane_tabs-bottom-start-content,.af_navigationPane_tabs-inactive .af_navigationPane_tabs-bottom-end-content {background-image:none}
-.af_navigationPane_tabs-inactive .af_navigationPane_tabs-start-join-from-active {background-image:url(images/tab3-start-join-selected-to-deselected.gif)}
-.af_navigationPane_tabs-inactive .af_navigationPane_tabs-start-join-from-inactive {background-image:url(images/tab3-start-join-deselected-to-deselected.gif)}
-.af_navigationPane_tabs-inactive .af_navigationPane_tabs-mid {color:#000000;background-image:url(images/tab3-mid-deselected.gif)}
-.af_navigationPane_tabs-inactive .af_navigationPane_tabs-end-join-to-inactive {background-image:url(images/tab3-end-join-deselected-to-deselected.gif)}
-.af_navigationPane_tabs-inactive .af_navigationPane_tabs-end {background-image:url(images/tab3-end-deselected.gif)}
-.af_panelFormLayout_column,.p_OraTreeIcon {vertical-align:top}
-.af_panelFormLayout_separator {background-color:gray;height:1px;font-size:1px;margin-top:3px;margin-bottom:3px}
-.af_panelFormLayout_cell,.af_panelFormLayout_content-cell,.af_panelFormLayout_message-cell {padding:1px 0px}
-.af_panelFormLayout_label-stacked-cell {padding:1px 0px;text-align:left}
-.af_panelBox_transparent,.af_panelBox_light,.af_panelBox_medium {border-color:#99cc99;border-style:solid;border-width:1px;margin:2px}
-.af_panelBox_dark {border-style:solid;border-width:1px;margin:2px;border-color:#669966}
-.af_panelBox_transparent img,.af_panelBox_light img,.af_panelBox_medium img,.af_panelBox_dark img,.af_selectManyShuttle_box-content img,.af_selectOrderShuttle_box-content img,.af_menuBar img,.af_messages img,.af_menuTabs img {vertical-align:bottom}
-.af_panelBox_body {padding:5px;height:20px}
-.af_panelBox_light .af_panelBox_body,.af_selectManyShuttle_box-content .af_selectManyShuttle_box-body,.af_selectOrderShuttle_box-content .af_selectOrderShuttle_box-body,.af_panelSideBar_body,.OraBGAccentLight,.PortletBodyColor,.PortletSubHeaderColor,.af_messages_body {background-color:#e9e8e8}
-.af_panelBox_medium .af_panelBox_body,.OraBGAccentMedium {background-color:#ffffcc}
-.af_panelBox_dark .af_panelBox_body,.OraBGAccentDark {background-color:#CCCCCC}
-.af_panelBox_header,.PortletHeaderColor {width:100%;background-repeat:repeat-x;font-family:Arial,Helvetica,Geneva,sans-serif;font-size:11pt;padding:0px 3px;font-weight:bold}
-.af_panelBox_light .af_panelBox_header {background-color:#99cc99;color:#ffffff}
-.af_panelPage_copyright,.af_panelPage_privacy,.af_panelPage_about {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:8pt;font-weight:normal;color:#000000;white-space:nowrap;padding:5px}
-.af_panelPage_copyright A,.af_panelPage_privacy A,.af_panelPage_about A,.af_train_link,.af_panelTabbed_tab A,.p_OraTreeRow A:link,.p_OraTreeRow A:active,.p_OraTreeRow A:visited {color:#003333}
-.af_panelCaptionGroup {border-color:#e9e8e8}
-.af_panelCaptionGroup_caption,.OraPageStampLabel,.OraTableControlBarText,.p_OraTreeRowSelected {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:bold;color:#669966}
-.af_panelPopup_trigger {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;color:#003333;text-decoration:none;white-space:nowrap}
-.af_panelPopup_close-icon {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:11pt;font-weight:normal;text-align:right;padding-left:5px}
-.af_menuButtons_text {color:#003333;font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;padding:0px 2px 2px 2px}
-.af_menuButtons_text-selected {color:#669966;font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;padding:0px 2px 2px 2px}
-.af_menuButtons_text-disabled {color:#999999;font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;padding:0px 2px 2px 2px}
-.af_menuBar {background-color:#669966;color:#ffffff;font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;min-height:4px;padding:0px}
-.af_menuBar_enabled,.af_menuBar_selected {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;padding:0px 0px 0px 5px;white-space:nowrap}
-.af_menuBar_enabled A,.af_menuBar_selected A,.PortletHeaderLink,.PortletSubHeaderLink {color:#ffffff;text-decoration:none}
-.af_menuBar_separator {color:#ffffff;font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal}
-.af_treeTable_expansion {color:#669966;position:absolute;top:0px;left:-18px;text-decoration:none}
-.af_treeTable_focus {font-size:10pt;font-weight:normal;color:#669966;font-family:monospace;text-decoration:none}
-.af_treeTable_locator {font-size:10pt;font-weight:normal;color:#999999;font-family:monospace}
-.af_showOnePanel_container {border-color:#999999;border-width:0px 1px 1px 1px;border-style:solid}
-.af_showOnePanel_header-collapsed {border-color:#999999;height:21px;text-decoration:none;white-space:nowrap;padding-right:5px;border-width:1px 0px 0px 0px;border-style:solid;cursor:pointer;padding-left:5px}
-.af_showOnePanel_header-expanded {border-color:#999999;height:21px;text-decoration:none;white-space:nowrap;padding-right:5px;border-style:solid;border-width:1px 0px 1px 0px;padding-left:2px}
-.af_showOnePanel_header-disabled {border-color:#999999;height:21px;text-decoration:none;white-space:nowrap;padding-right:5px;border-style:solid;border-width:1px 0px 0px 0px;padding-left:18px}
-.af_showOnePanel_content {vertical-align:top;margin:5px}
-.af_showOnePanel_title-link {background:transparent;color:#669966;display:block;padding-top:2px;text-decoration:none;font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:bold}
-.af_showOnePanel_title-disabled-link {color:#999999;display:block;padding-top:2px;text-decoration:none;font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:bold}
-.AFHeaderLevelTwo,H2.af_panelHeader,H2.af_showDetailHeader,.PortletHeading2 {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:11pt;color:#669966;font-weight:bold;padding:0px;margin:0px}
-.AFHeaderLevelThreePlus,H3.af_panelHeader,H4.af_panelHeader,H5.af_panelHeader,H6.af_panelHeader,H3.af_showDetailHeader,H4.af_showDetailHeader,H5.af_showDetailHeader,H6.af_showDetailHeader,.PortletHeading3,.PortletHeading4 {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;color:#669966;font-weight:bold;padding:0px;margin:0px}
-.af_panelHeader_error,.af_messages_error,.portlet-msg-error {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:13pt;font-weight:bold;padding:0px;margin:0px;color:#cc0000}
-.af_messages_header {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:13pt;color:#669966;font-weight:bold;margin:0px;border-color:#CCCCCC;border-width:0px 0px 1px 0px;border-style:solid;vertical-align:bottom;margin-bottom:3px;padding:0px 3px}
-.af_messages {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;color:#336633;width:100%;border-color:#999999;background-color:#ffffcc;border-style:solid;border-width:1px;padding:0px;margin:5px 0px 0px}
-.af_messages_message-text,.af_messages_list,.portlet-msg-info {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;color:#669966;margin:0px 0px 0px 0px;padding:5px 30px 5px 30px}
-.af_panelSideBar {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;color:#336633;border-color:#999999;border-width:0px 1px 1px;border-style:solid;padding:0px;margin:0px 5px 0px 0px}
-.AFSortableHeaderSortIcon {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:9pt;font-weight:normal;color:#669966;padding-left:4px;text-decoration:none}
-.af_menuTabs_enabled {background-color:#e9e8e8;white-space:nowrap;border-color:#999999;border-style:solid;border-width:1px 1px 0px 1px;padding:2px 6px}
-.af_menuTabs_selected {background-color:#669966;white-space:nowrap;border-color:#999999;border-style:solid;border-width:1px 1px 0px 1px;padding:2px 6px}
-.af_menuTabs_disabled {background-color:#e9e8e8;color:#999999;white-space:nowrap;border-color:#999999;border-style:solid;border-width:1px 1px 0px 1px;padding:2px 6px}
-.af_menuTabs_enabled A {text-decoration:none;color:#336633}
-.af_menuTabs_selected A {text-decoration:none;color:#ccffcc;font-weight:bold}
-.af_menuTabs_separator {width:0px}
-.af_table_content,.af_treeTable_content {border-collapse:collapse;border-color:#999999;border-style:solid;border-width:1px}
-.af_table_control-bar-top,.af_treeTable_control-bar-top {background-color:#e9e8e8;border-color:#999999;border-style:solid;border-width:1px 1px 0px;padding:1px 2px}
-.af_table_control-bar-bottom,.af_treeTable_control-bar-bottom {background-color:#e9e8e8;border-color:#999999;border-style:solid;border-width:0px 1px 1px;padding:1px 2px}
-.af_table_sub-control-bar,.af_treeTable_sub-control-bar {border-color:#999999;border-style:solid;border-width:1px 1px 0px;padding:1px 2px}
-.af_column_cell-text,.portlet-section-selected,.portlet-table-selected {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;color:#000000;vertical-align:baseline;background-color:#e9e8e8;border-color:#999999}
-.af_column_cell-text-band,.portlet-section-alternate,.portlet-table-alternate {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;color:#000000;vertical-align:baseline;background-color:#ffffff;border-color:#999999}
-.af_column_cell-number {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;color:#000000;vertical-align:baseline;background-color:#e9e8e8;border-color:#999999;text-align:right;padding-right:2px}
-.af_column_cell-number-band {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;color:#000000;vertical-align:baseline;background-color:#ffffff;border-color:#999999;text-align:right;padding-right:2px}
-.af_column_cell-icon-format,.af_tableSelectOne_cell-icon-format,.af_tableSelectMany_cell-icon-format,.OraTableCellSelect,.portlet-section-text,.portlet-table-text {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;color:#000000;vertical-align:baseline;background-color:#e9e8e8;border-color:#999999;text-align:center}
-.af_column_cell-icon-format-band,.af_tableSelectOne_cell-icon-format-band,.af_tableSelectMany_cell-icon-format-band,.OraTableCellSelectBand {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;color:#000000;vertical-align:baseline;background-color:#ffffff;border-color:#999999;text-align:center}
-.af_column_header-text {border-color:#999999;font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:bold;text-align:left;background-color:#CCCCCC;color:#669966;vertical-align:bottom}
-.af_column_header-number {border-color:#999999;font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:bold;background-color:#CCCCCC;color:#669966;vertical-align:bottom;text-align:right}
-.af_column_header-icon-format {border-color:#999999;font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:bold;background-color:#CCCCCC;color:#669966;vertical-align:bottom;text-align:center}
-.af_column_row-header-text {border-color:#999999;font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:bold;text-align:right;background-color:#CCCCCC;color:#669966}
-.af_table_detail {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;color:#000000;border-color:#999999;background-color:#ffffff}
-.af_table_column-footer,.portlet-section-footer,.portlet-table-footer {border-color:#999999;font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:bold;text-align:left;background-color:#CCCCCC;color:#669966}
-.OraTableTotal {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:bold;text-align:right;background-color:#CCCCCC;color:#669966}
-.af_column_total-number {border-color:#999999;font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:bold;text-align:right;background-color:#CCCCCC;color:#000000;vertical-align:baseline}
-.af_column_total-text {border-color:#999999;font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:bold;text-align:left;background-color:#CCCCCC;color:#000000;vertical-align:baseline}
-.af_column_sortable-header-text {border-color:#999999;font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:bold;text-align:left;background-color:#CCCCCC;color:#669966;vertical-align:bottom;cursor:pointer;border-width:2px;border-style:outset}
-.af_column_sortable-header-number {border-color:#999999;font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:bold;background-color:#CCCCCC;color:#669966;vertical-align:bottom;cursor:pointer;border-width:2px;border-style:outset;text-align:right}
-.af_column_sortable-header-icon-format {border-color:#999999;font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:bold;background-color:#CCCCCC;color:#669966;vertical-align:bottom;cursor:pointer;border-width:2px;border-style:outset;text-align:center}
-.af_train_stop-content,.af_train_overflow-start-content,.af_train_overflow-end-content,.af_train_parent-start-content,.af_train_parent-end-content {border-top-style:solid;border-top-width:2px;}
-.af_train_stop.p_AFSelected {color:#669966;font-weight:bold;border-color:#669966}
-.af_train_stop:visited,.af_train_stop:visited .af_train_link {color:#666666}
-.af_train_stop.p_AFDisabled {color:#999999;border-color:#cccccc}
-.af_train_stop.p_AFUnvisited {color:#669966;border-color:#669966}
-.af_train_stop.p_AFDisabled .af_train_link {color:#669999}
-.OraBGColorVeryDark {background-color:#336633}
-.OraBGColorDark,.af_menuBar_body,.af_menuBar_title,.af_menuBar_empty {background-color:#669966}
-.OraBGColorMedium {background-color:#99cc99}
-.OraBGColorLight {background-color:#ccffcc}
-.OraBGGrayVeryDark {background-color:#333333}
-.OraBGGrayDark {background-color:#666666}
-.OraBGGrayMedium,.OraBGAccentVeryDark,.OraTable {background-color:#999999}
-.OraBGGrayLight {background-color:#cccccc}
-.OraInlineInfoText {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:8pt;font-weight:normal;color:#669966}
-.OraTextInline {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:8pt;font-weight:normal;color:#99cc99}
-.OraMessageBoxErrorText,.AFErrorText {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;color:#cc0000}
-.OraErrorNameText {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:bold;color:#cc0000}
-.OraInlineErrorText {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:8pt;font-weight:normal;color:#cc0000}
-.OraGlobalPageTitle {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:13pt;color:#ffffff;font-weight:bold}
-.p_OraSelected {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:bold;background-color:#ccffcc;text-decoration:none}
-.p_OraHiddenLabel {position:absolute;top:-999px;left:0px;font-size:0px}
-.p_OraColorFieldSwatch {border-color:#000000;border-style:solid;border-width:1px}
-.p_OraColorPalette {background-color:#000000}
-.p_OraColorPaletteEmptyCell {background-color:#ffffff}
-.af_inputDate_nav A,.af_chooseDate_nav A {color:#003333;text-decoration:none}
-.af_inputDate_title,.af_chooseDate_title {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:13pt;font-weight:normal;text-align:center;background-color:#ffffff;color:#669966;padding:2px}
-.af_inputDate_header,.af_chooseDate_header {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:bold;text-align:center;color:#669966;padding:2px}
-.af_inputDate_content A,.af_chooseDate_content A {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;text-align:center;color:#003333}
-.af_chooseDate_content {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;text-align:center;color:#999999;text-decoration:none;border-width:1px;border-style:solid;padding:2px}
-.p_OraContentFooterRule {color:#669966}
-.p_OraContentFooterStart {float:left}
-.p_OraContentFooterBottom {clear:both;margin-bottom:5px}
-.p_OraFooter {text-align:center}
-.p_OraFooterBottom {padding-top:5px}
-.p_OraHeaderNest {margin:5px 0px 0px 12px}
-.OraHGridLocatorHeader {border-color:#999999;background-color:#e9e8e8}
-.p_OraHideShowDisclosedSymbol,.af_panelTabbed_tab-selected A,.p_OraTreeDisclosedSymbol A:link,.p_OraTreeDisclosedSymbol A:active,.p_OraTreeDisclosedSymbol A:visited,.p_OraTreeRowSelected A:link,.p_OraTreeRowSelected A:active,.p_OraTreeRowSelected A:visited {color:#669966;text-decoration:none}
-.af_messages_list-single {list-style-type:none}
-.p_OraQuickSearchBox {background-color:#e9e8e8;border-color:#CCCCCC;border-style:solid;padding:0pt 5pt 5pt 5pt;border-width:0px 0px 1px 1px}
-.p_OraGlobalQuick {border-color:#CCCCCC;border-style:solid;border-width:0px 0px 0px 1px}
-.p_OraProcessingStatus {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:bold;color:#669966;border-color:#99cc99;border-style:solid;border-width:1px}
-.p_OraProductBrandingText {color:#669966;position:relative;font-family:Garamond, Times, Times New Roman, Serif;font-weight:normal;font-size:24pt;line-height:28.8pt;top:-4.8pt}
-.p_OraProductBrandingCompactText {color:#669966;font-family:Arial,Helvetica,Geneva,sans-serif;font-size:13pt;margin-bottom:0px;margin-top:0px;font-weight:bold}
-.OraShuttleHeader {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:9pt;color:#669966;font-weight:bold;padding:0px 0px 0px 18px}
-.OraShuttleLinkText {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:9pt;font-weight:normal;color:#003333}
-.p_OraSideBarMinWidth {width:140px}
-.OraStyledList {list-style-position:inside;padding:0px;margin:0px}
-.OraStyledList .OraStyledList {padding:0pt 0pt 0pt 10pt}
-.af_panelTabbed_orientation-top {background-color:#e9e8e8;border-color:#99cc99;text-align:center;border-style:solid;padding:2px 0px;margin:4px 0px;border-width:1px 0px 0px}
-.af_panelTabbed_orientation-bottom {background-color:#e9e8e8;border-color:#99cc99;text-align:center;border-style:solid;padding:2px 0px;margin:4px 0px;border-width:0px 0px 1px}
-.af_panelTabbed_tab {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;padding:0px 8px}
-.af_panelTabbed_tab .p_OraDisabled {color:#999999}
-.af_panelTabbed_tab-selected {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:bold;padding:0px 8px}
-.af_panelTabbed_cell-start {width:0%}
-.af_panelTabbed_cell-end {width:100%}
-.OraTableBorder0001 {border-style:solid;border-width:0px 0px 0px 1px}
-.OraTableBorder0010 {border-style:solid;border-width:0px 0px 1px}
-.OraTableBorder0011 {border-style:solid;border-width:0px 0px 1px 1px}
-.OraTableBorder0100 {border-style:solid;border-width:0px 1px 0px 0px}
-.OraTableBorder0101 {border-style:solid;border-width:0px 1px}
-.OraTableBorder0110 {border-style:solid;border-width:0px 1px 1px 0px}
-.OraTableBorder0111 {border-style:solid;border-width:0px 1px 1px}
-.OraTableBorder1000 {border-style:solid;border-width:1px 0px 0px}
-.OraTableBorder1001 {border-style:solid;border-width:1px 0px 0px 1px}
-.OraTableBorder1010 {border-style:solid;border-width:1px 0px}
-.OraTableBorder1011 {border-style:solid;border-width:1px 0px 1px 1px}
-.OraTableBorder1100 {border-style:solid;border-width:1px 1px 0px 0px}
-.OraTableBorder1101 {border-style:solid;border-width:1px 1px 0px}
-.OraTableBorder1110 {border-style:solid;border-width:1px 1px 1px 0px}
-.OraTableBorder1111 {border-style:solid;border-width:1px}
-.OraTableTitle {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:13pt;font-weight:normal;background-color:#ffffff;color:#669966}
-.p_OraTreeDisclosedSymbol {color:#669966;font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;text-align:right}
-.p_OraTreeNodeAdjust {padding-bottom:2px}
-.af_chart {width:400px;height:300px;background-color:white}
-.p_OraOnePixelLine {background-color:#CCCCCC;font-size:0pt;overflow:hidden;height:1px;width:100%}
-.p_OraDisplayBlock {display:block}
-.p_OraHideSkipNaviText {font-size:0pt;margin-top:0px;margin-left:-999px}
-.AFLogo {width:103px;height:13px;background-repeat:no-repeat;background-position:center;vertical-align:middle;background-image:url(images/logo-dark.gif)}
-.af_panelBox_content-dark {border-color:#669966}
-.af_train_stop.p_AFVisited {border-color:#999999}
-.af_panelHeader,.af_showDetailHeader {border-color:#CCCCCC;border-width:0px 0px 1px 0px;border-style:solid;vertical-align:bottom;margin-bottom:3px;padding:0px 3px}
-.af_panelHeader_icon-style {margin-right:3px}
-.af_objectSeparator {border-color:#669966;border-style:dashed none none;border-width:1px 0px 0px;height:1px;margin:-3px 0px -3px 0px;padding:0px}
-body {margin-top:8px}
-.p_OraNav2 {border-color:#99cc99}
-.af_navigationPane {height:25px}
-/* The number of CSS selectors in this file is 566 */
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/simple.css b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/simple.css
deleted file mode 100644
index 38fd694..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/simple.css
+++ /dev/null
@@ -1,226 +0,0 @@
-/* This CSS file generated on Thu Apr 02 15:52:46 PDT 2009 */
-.AFInstructionText,.AFFieldText,.af_outputText,.af_outputFormatted,.af_outputDocument,.af_inputChoice_content,.af_inputChoice_content-input,.af_inputText_content,.af_inputNumberSpinbox_content,.af_inputColor_content,.af_inputDate_content,.af_inputListOfValues_content,.af_selectManyCheckbox_content,.af_selectManyListbox_content,.af_selectOneChoice_content,.af_selectOneListbox_content,.af_selectOneRadio_content,.af_inputText.AFFieldTextMarker .af_inputText_content,.af_inputText.p_AFDisabled.AFFieldTextMarker .af_inputText_content,.af_inputText.AFFieldTextLTRMarker .af_inputText_content,.af_inputText.AFPhoneFieldTextMarker .af_inputText_content,.af_inputText.AFPostalCodeFieldTextMarker .af_inputText_content,.af_inputText.AFAddressFieldTextMarker .af_inputText_content,.af_inputChoice.AFFieldTextMarker .af_inputChoice_content-input,.af_inputChoice.p_AFDisabled.AFFieldTextMarker .af_inputChoice_content-input,.af_inputChoice.AFFieldTextLTRMarker .af_inputChoice_content-input,.af_inputChoice.AFPhoneFieldTextMarker .af_inputChoice_content-input,.af_inputChoice.AFPostalCodeFieldTextMarker .af_inputChoice_content-input,.af_inputChoice.AFAddressFieldTextMarker .af_inputChoice_content-input,.af_inputNumberSpinbox.AFFieldTextMarker .af_inputNumberSpinbox_content,.af_inputNumberSpinbox.p_AFDisabled.AFFieldTextMarker .af_inputNumberSpinbox_content,.af_inputNumberSpinbox.AFFieldTextLTRMarker .af_inputNumberSpinbox_content,.AFFieldTextLTR,.AFPhoneFieldText,.AFPostalCodeFieldText,.AFAddressFieldText,.PortletText1,.PortletText2,.PortletText3,.PortletText4,.portlet-form-input-field,.portlet-form-field {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;color:#000000}
-.AFInstructionTextDisabled,.AFFieldTextDisabled,.af_inputText.p_AFDisabled.AFFieldTextLTRMarker .af_inputText_content,.af_inputText.p_AFDisabled.AFPhoneFieldTextMarker .af_inputText_content,.af_inputText.p_AFDisabled.AFPostalCodeFieldTextMarker .af_inputText_content,.af_inputText.p_AFDisabled.AFAddressFieldTextMarker .af_inputText_content,.af_inputChoice.p_AFDisabled.AFFieldTextLTRMarker .af_inputChoice_content-input,.af_inputChoice.p_AFDisabled.AFPhoneFieldTextMarker .af_inputChoice_content-input,.af_inputChoice.p_AFDisabled.AFPostalCodeFieldTextMarker .af_inputChoice_content-input,.af_inputChoice.p_AFDisabled.AFAddressFieldTextMarker .af_inputChoice_content-input,.af_inputNumberSpinbox.p_AFDisabled.AFFieldTextLTRMarker .af_inputNumberSpinbox_content,.af_menuButtons_text-disabled,.p_InContextBrandingText,.AFFieldTextLTRDisabled,.AFPhoneFieldTextDisabled,.AFPostalCodeFieldTextDisabled,.AFAddressFieldTextDisabled,.OraHGridNavRowInactiveLink,.OraNavBarInactiveLink,.portlet-font-dim {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;color:#999999}
-.AFDataText {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:bold;color:#000000}
-.AFDataTextDisabled {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:bold;color:#999999}
-.AFDataNumber {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:bold;color:#000000;text-align:right}
-.AFDataNumberDisabled {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:bold;color:#999999;text-align:right}
-.AFFieldNumber,.af_inputText.AFFieldNumberMarker .af_inputText_content,.af_inputChoice.AFFieldNumberMarker .af_inputChoice_content-input,.af_inputNumberSpinbox.AFFieldNumberMarker .af_inputNumberSpinbox_content {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;text-align:right;color:#000000}
-.AFFieldNumberDisabled,.af_inputText.p_AFDisabled.AFFieldNumberMarker .af_inputText_content,.af_inputChoice.p_AFDisabled.AFFieldNumberMarker .af_inputChoice_content-input,.af_inputNumberSpinbox.p_AFDisabled.AFFieldNumberMarker .af_inputNumberSpinbox_content {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;text-align:right;color:#999999}
-.AFLabelText,.af_outputLabel,.af_inputChoice_label,.af_inputFile_label,.af_inputNumberSpinbox_label,.af_inputText_label,.af_selectBooleanCheckbox_label,.af_selectBooleanRadio_label,.af_inputColor_label,.af_inputDate_label,.af_inputListOfValues_label,.af_selectManyCheckbox_label,.af_selectManyListbox_label,.af_selectOneChoice_label,.af_selectOneListbox_label,.af_selectOneRadio_label,.af_panelLabelAndMessage_label,.af_panelFormLayout_label-cell,.portlet-form-label,.portlet-icon-label,.portlet-dlg-icon-label,.portlet-form-field-label {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;text-align:right;color:#000000;padding:0px 8px 0px 0px;font-weight:normal}
-.AFLabelCell {padding:0px 8px 0px 0px}
-.AFErrorIconStyle {color:#cc0000;font-family:monospace;font-weight:bold}
-.AFInfoIconStyle,.AFWarningIconStyle,.AFQuickSelectIconStyle {color:#669966;font-family:monospace;font-weight:bold}
-.AFRequiredIconStyle {color:#669966;font-family:Courier,sans-serif}
-.AFQuickSelectDisabledIconStyle {color:#999999;font-family:monospace;font-weight:bold}
-.OraLink:link,.af_treeTable_path,.af_menuPath,.af_panelList A,.af_panelPopup_link,.af_menuButtons_text,.OraLinkText,.OraHGridNavRowActiveLink,.OraNavBarActiveLink {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;color:#003333}
-.OraLink:active,.OraALinkText {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;color:#006666}
-.OraLink:visited,.OraVLinkText {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;color:#336666}
-.OraLinkDisabled,.af_outputLabel_required-icon-style,.af_inputChoice_required-icon-style,.af_inputNumberSpinbox_required-icon-style,.af_inputText_required-icon-style,.af_selectBooleanCheckbox_required-icon-style,.af_selectBooleanRadio_required-icon-style,.af_inputDate_required-icon-style,.af_selectManyCheckbox_required-icon-style,.af_selectManyListbox_required-icon-style,.af_selectOneChoice_required-icon-style,.af_selectOneListbox_required-icon-style,.af_selectOneRadio_required-icon-style,.af_outputLabel_group-icon-style,.af_inputChoice_group-icon-style,.af_inputNumberSpinbox_group-icon-style,.af_inputText_group-icon-style,.af_selectBooleanCheckbox_group-icon-style,.af_selectBooleanRadio_group-icon-style,.af_inputDate_group-icon-style,.af_selectManyCheckbox_group-icon-style,.af_selectManyListbox_group-icon-style,.af_selectOneChoice_group-icon-style,.af_selectOneListbox_group-icon-style,.af_selectOneRadio_group-icon-style,.af_menuList,button,.af_navigationPane_choice-label,.af_navigationPane_choice-options,.af_navigationPane_choice-button,.af_breadCrumbs,.af_selectManyShuttle_box-content,.af_selectOrderShuttle_box-content,.af_menuTabs,.af_commandButton,.af_goButton,.af_resetButton,.p_OraDisabled,.OraNav3,.p_OraTreeRow,.portlet-form-button {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal}
-.af_outputDocument_title {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:13pt;font-weight:normal;color:#669966;padding:0px;margin:0px}
-.af_outputDocument_paragraph {text-align:justify;padding:0px;margin:0px}
-.af_outputDocument_separator {text-align:center;padding:0px;margin:0px}
-.af_panelTip,.af_menuButtons_text-selected,.AFHeaderLevelThreePlus,H3.af_panelHeader,H4.af_panelHeader,H5.af_panelHeader,H6.af_panelHeader,H3.af_showDetailHeader,H4.af_showDetailHeader,H5.af_showDetailHeader,H6.af_showDetailHeader,.OraPageStampText,.af_singleStepButtonBar_label,.OraNavBarViewOnly,.PortletHeading3,.PortletHeading4 {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;color:#669966}
-.af_panelTip_label {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:bold}
-.af_panelAccordion_toolbar,.p_OraContentFooterChildren {float:right}
-.af_dialog_container,.af_panelPopup_container {border-color:#336633;border:1px solid;background-color:white}
-.af_dialog_title-bar,.af_panelPopup_title-bar {background-color:#CCCCCC;border-color:#336633;border-bottom:1px solid;padding:2px 2px 2px 2px}
-.af_dialog_title-text,.af_panelPopup_title-text {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:11pt;font-weight:normal;white-space:nowrap;overflow:hidden}
-.af_dialog_close-icon {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:11pt;font-weight:normal;margin-left:5px;background-image:url(images/close.gif);background-position:center;background-repeat:no-repeat;height:13px;width:13px}
-.af_dialog_content,.af_panelPopup_content {background-color:#e9e8e8;border:0px}
-.af_inputChoice.p_AFDisabled .af_inputChoice_label,.af_inputNumberSpinbox.p_AFDisabled .af_inputNumberSpinbox_label,.af_inputText.p_AFDisabled .af_inputText_label,.af_selectBooleanCheckbox.p_AFDisabled .af_selectBooleanCheckbox_label,.af_selectBooleanRadio.p_AFDisabled .af_selectBooleanRadio_label,.af_inputColor.p_AFDisabled .af_inputColor_label,.af_inputDate.p_AFDisabled .af_inputDate_label,.af_inputListOfValues.p_AFDisabled .af_inputListOfValues_label,.af_selectManyCheckbox.p_AFDisabled .af_selectManyCheckbox_label,.af_selectManyListbox.p_AFDisabled .af_selectManyListbox_label,.af_selectOneChoice.p_AFDisabled .af_selectOneChoice_label,.af_selectOneListbox.p_AFDisabled .af_selectOneListbox_label,.af_selectOneRadio.p_AFDisabled .af_selectOneRadio_label,.af_navigationPane_bar-inactive-enabled .af_navigationPane_bar-content,.af_navigationPane_bar-active-enabled .af_navigationPane_bar-content a,.af_navigationPane_bar-inactive-enabled .af_navigationPane_bar-content a,.af_navigationPane_tabs-inactive .af_navigationPane_tabs-mid A {color:#000000}
-.af_inputNumberSpinbox_increment-cell,.af_inputNumberSpinbox_decrement-cell {background-color:#e9e8e8;border-color:#999999;border-width:1px;border-style:solid;width:11px;height:8px}
-.af_inputNumberSpinbox_spinbox-cell {padding-left:1px}
-.af_menuList_selected,.OraNav3Selected {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:bold;background-color:#ccffcc}
-.af_menuChoice_label,.portlet-font {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:8pt;font-weight:normal}
-BODY,.portlet-section-body,.portlet-table-body {background-color:#ffffff;font-family:Arial,Helvetica,Geneva,sans-serif}
-.af_treeTable_path-step,.af_menuPath_step,.af_menuPath_selected-step {color:#003333;font-size:9pt}
-.af_treeTable_path-selected-step {font-size:9pt;color:#000000}
-.af_panelList UL {margin-top:4px;margin-bottom:4px}
-.af_inputColor_swatch-overlay {position:relative;left:-7px;top:5px}
-.af_navigationPane_bar {background-color:#EFEFEF;padding-left:6px;padding-right:6px}
-.af_navigationPane_bar-active-disabled,.af_navigationPane_bar-inactive-disabled,.af_navigationPane_buttons-active-disabled,.af_navigationPane_buttons-inactive-disabled,.af_navigationPane_list-active-disabled,.af_navigationPane_list-inactive-disabled {cursor:default}
-.af_navigationPane_bar-active-enabled,.af_navigationPane_bar-inactive-enabled,.af_navigationPane_buttons-active-enabled,.af_navigationPane_buttons-inactive-enabled,.af_navigationPane_list-active-enabled,.af_navigationPane_list-inactive-enabled,.af_navigationPane_tabs-active,.af_navigationPane_tabs-inactive {cursor:pointer}
-.af_navigationPane_bar-active-enabled .af_navigationPane_bar-content {color:#000000;font-weight:bold}
-.af_navigationPane_bar-active-enabled .af_navigationPane_bar-content a:hover,.af_navigationPane_bar-inactive-enabled .af_navigationPane_bar-content a:hover,.af_navigationPane_buttons-active-enabled .af_navigationPane_buttons-content a:hover,.af_navigationPane_buttons-inactive-enabled .af_navigationPane_buttons-content a:hover,.af_navigationPane_list-active-enabled .af_navigationPane_list-content a:hover,.af_navigationPane_list-inactive-enabled .af_navigationPane_list-content a:hover,.AFAccessKeyStyle {text-decoration:underline}
-.af_navigationPane_bar-active-disabled .af_navigationPane_bar-content,.af_navigationPane_buttons-active-disabled .af_navigationPane_buttons-content,.af_navigationPane_list-active-disabled .af_navigationPane_list-content {color:gray;font-weight:bold}
-.af_navigationPane_bar-inactive-disabled .af_navigationPane_bar-content,.af_navigationPane_bar-active-disabled .af_navigationPane_bar-content a,.af_navigationPane_bar-inactive-disabled .af_navigationPane_bar-content a,.af_navigationPane_buttons-inactive-disabled .af_navigationPane_buttons-content,.af_navigationPane_buttons-active-disabled .af_navigationPane_buttons-content a,.af_navigationPane_buttons-inactive-disabled .af_navigationPane_buttons-content a,.af_navigationPane_list-inactive-disabled .af_navigationPane_list-content,.af_navigationPane_list-active-disabled .af_navigationPane_list-content a,.af_navigationPane_list-inactive-disabled .af_navigationPane_list-content a,.af_navigationPane_tabs-active.p_AFDisabled .af_navigationPane_tabs-mid,.af_navigationPane_tabs-inactive.p_AFDisabled .af_navigationPane_tabs-mid {color:gray}
-.af_navigationPane_bar-content,.af_navigationPane_buttons-content,.af_navigationPane_list-content {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;padding-top:3px;padding-bottom:3px}
-.af_navigationPane_bar-content a,.af_navigationPane_buttons-content a,.af_navigationPane_list-content a {text-decoration:none}
-.af_navigationPane_bar-separator {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;padding-left:6px;padding-right:6px;color:gray}
-.af_navigationPane_buttons-active-enabled .af_navigationPane_buttons-content,.af_navigationPane_list-active-enabled .af_navigationPane_list-content,.af_navigationPane_tabs-active .af_navigationPane_tabs-mid A,.AFLinkAccessKeyStyle,.af_inputDate_selected,.af_chooseDate_selected {font-weight:bold}
-.af_navigationPane_buttons-separator {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;padding-left:6px;padding-right:6px}
-.af_navigationPane_list-bullet {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;vertical-align:middle;width:17px;background-image:url(images/list-bullet.gif);background-position:center;background-repeat:no-repeat}
-.af_navigationPane_tabs {height:26px;overflow:hidden}
-.af_navigationPane_tabs-active.p_AFDisabled,.af_navigationPane_tabs-inactive.p_AFDisabled {cursor:default;color:gray}
-.af_navigationPane_tabs-start,.af_navigationPane_tabs-start-join {height:22px;width:26px;background-position:top right}
-.af_navigationPane_tabs-start-join-from-active,.af_navigationPane_tabs-start-join-from-inactive {height:22px;width:14px;background-repeat:no-repeat}
-.af_navigationPane_tabs-mid {height:22px;font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;color:#000000;padding-left:3px;white-space:nowrap}
-.af_navigationPane_tabs-end-join-to-inactive {height:22px;width:12px;background-repeat:no-repeat}
-.af_navigationPane_tabs-end {height:22px;width:15px}
-.af_navigationPane_tabs-bottom-start,.af_navigationPane_tabs-bottom-mid,.af_navigationPane_tabs-bottom-end {height:4px;background-repeat:repeat-x}
-.af_navigationPane_tabs-bottom-start-content {height:4px;width:17px;background-repeat:no-repeat}
-.af_navigationPane_tabs-bottom-mid-content {height:4px}
-.af_navigationPane_tabs-bottom-end-content {height:4px;width:100%;background-repeat:no-repeat}
-.af_navigationPane_tabs-mid A {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;color:#000000;text-decoration:none}
-.af_navigationPane_tabs-bottom-end-join {background-repeat:repeat-x}
-.af_navigationPane_tabs-active .af_navigationPane_tabs-start {background-image:url(images/tab3-start-selected.gif)}
-.af_navigationPane_tabs-active .af_navigationPane_tabs-start-join {background-image:url(images/tab3-start-join-selected.gif)}
-.af_navigationPane_tabs-active .af_navigationPane_tabs-bottom-start,.af_navigationPane_tabs-active .af_navigationPane_tabs-bottom-mid,.af_navigationPane_tabs-active .af_navigationPane_tabs-bottom-end {background-image:url(images/tab3-bot-mid-selected.gif)}
-.af_navigationPane_tabs-active .af_navigationPane_tabs-bottom-start-content {background-image:url(images/tab3-bot-start-selected.gif)}
-.af_navigationPane_tabs-active .af_navigationPane_tabs-mid {background-image:url(images/tab3-mid-selected.gif);font-weight:bold}
-.af_navigationPane_tabs-active .af_navigationPane_tabs-end-join-to-inactive {background-image:url(images/tab3-end-join-selected-to-deselected.gif)}
-.af_navigationPane_tabs-active .af_navigationPane_tabs-end {background-image:url(images/tab3-end-selected.gif)}
-.af_navigationPane_tabs-active .af_navigationPane_tabs-bottom-end-join,.af_navigationPane_tabs-inactive .af_navigationPane_tabs-bottom-start,.af_navigationPane_tabs-inactive .af_navigationPane_tabs-bottom-mid,.af_navigationPane_tabs-inactive .af_navigationPane_tabs-bottom-end,.af_navigationPane_tabs-inactive .af_navigationPane_tabs-bottom-end-join {background-image:url(images/tab3-bot-deselected.gif)}
-.af_navigationPane_tabs-active .af_navigationPane_tabs-bottom-end-content {background-image:url(images/tab3-bot-end-selected.gif)}
-.af_navigationPane_tabs-inactive .af_navigationPane_tabs-start {background-image:url(images/tab3-start-deselected.gif)}
-.af_navigationPane_tabs-inactive .af_navigationPane_tabs-bottom-start-content,.af_navigationPane_tabs-inactive .af_navigationPane_tabs-bottom-end-content {background-image:none}
-.af_navigationPane_tabs-inactive .af_navigationPane_tabs-start-join-from-active {background-image:url(images/tab3-start-join-selected-to-deselected.gif)}
-.af_navigationPane_tabs-inactive .af_navigationPane_tabs-start-join-from-inactive {background-image:url(images/tab3-start-join-deselected-to-deselected.gif)}
-.af_navigationPane_tabs-inactive .af_navigationPane_tabs-mid {color:#000000;background-image:url(images/tab3-mid-deselected.gif)}
-.af_navigationPane_tabs-inactive .af_navigationPane_tabs-end-join-to-inactive {background-image:url(images/tab3-end-join-deselected-to-deselected.gif)}
-.af_navigationPane_tabs-inactive .af_navigationPane_tabs-end {background-image:url(images/tab3-end-deselected.gif)}
-.af_panelFormLayout_column,.p_OraTreeIcon {vertical-align:top}
-.af_panelFormLayout_separator {background-color:gray;height:1px;font-size:1px;margin-top:3px;margin-bottom:3px}
-.af_panelFormLayout_cell,.af_panelFormLayout_content-cell,.af_panelFormLayout_message-cell {padding:0px}
-.af_panelFormLayout_label-stacked-cell {padding:0px;text-align:left}
-.af_panelBox_transparent img,.af_panelBox_light img,.af_panelBox_medium img,.af_panelBox_dark img,.af_selectManyShuttle_box-content img,.af_selectOrderShuttle_box-content img,.af_menuBar img,.af_messages img,.af_menuTabs img {vertical-align:bottom}
-.af_panelBox_light .af_panelBox_body,.af_selectManyShuttle_box-content .af_selectManyShuttle_box-body,.af_selectOrderShuttle_box-content .af_selectOrderShuttle_box-body,.af_panelSideBar_body,.OraBGAccentLight,.PortletBodyColor,.PortletSubHeaderColor,.af_messages_body {background-color:#e9e8e8}
-.af_panelBox_medium .af_panelBox_body,.OraBGAccentMedium {background-color:#ffffcc}
-.af_panelBox_dark .af_panelBox_body,.OraBGAccentDark {background-color:#CCCCCC}
-.af_panelBox_header,.PortletHeaderColor {width:100%;background-repeat:repeat-x}
-.af_panelBox_light .af_panelBox_header {background-color:#99cc99;color:#ffffff}
-.af_panelPage_copyright,.af_panelPage_privacy,.af_panelPage_about {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:8pt;font-weight:normal;color:#000000;white-space:nowrap}
-.af_panelPage_copyright A,.af_panelPage_privacy A,.af_panelPage_about A,.af_train_link,.af_panelTabbed_tab A,.p_OraTreeRow A:link,.p_OraTreeRow A:active,.p_OraTreeRow A:visited {color:#003333}
-.af_panelCaptionGroup {border-color:#e9e8e8}
-.af_panelCaptionGroup_caption,.OraPageStampLabel,.OraTableControlBarText,.p_OraTreeRowSelected {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:bold;color:#669966}
-.af_panelPopup_trigger {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;color:#003333;text-decoration:none;white-space:nowrap}
-.af_panelPopup_close-icon {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:11pt;font-weight:normal;text-align:right;padding-left:5px}
-.af_menuBar {background-color:#669966;color:#ffffff;font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;min-height:4px}
-.af_menuBar_enabled,.af_menuBar_selected {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;white-space:nowrap}
-.af_menuBar_enabled A,.af_menuBar_selected A {color:#ffffff}
-.af_menuBar_separator {color:#ffffff;font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal}
-.af_treeTable_expansion {color:#669966;position:absolute;top:0px;left:-18px}
-.af_treeTable_focus {font-size:10pt;font-weight:normal;color:#669966;font-family:monospace}
-.af_treeTable_locator {font-size:10pt;font-weight:normal;color:#999999;font-family:monospace}
-.af_showOnePanel_container {border-color:#999999;border-width:0px 1px 1px 1px;border-style:solid}
-.af_showOnePanel_header-collapsed {border-color:#999999;height:21px;text-decoration:none;white-space:nowrap;padding-right:5px;border-width:1px 0px 0px 0px;border-style:solid;cursor:pointer;padding-left:5px}
-.af_showOnePanel_header-expanded {border-color:#999999;height:21px;text-decoration:none;white-space:nowrap;padding-right:5px;border-style:solid;border-width:1px 0px 1px 0px;padding-left:2px}
-.af_showOnePanel_header-disabled {border-color:#999999;height:21px;text-decoration:none;white-space:nowrap;padding-right:5px;border-style:solid;border-width:1px 0px 0px 0px;padding-left:18px}
-.af_showOnePanel_content {vertical-align:top;margin:5px}
-.af_showOnePanel_title-link {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;background:transparent;color:#669966;display:block;padding-top:2px;text-decoration:none}
-.af_showOnePanel_title-disabled-link {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;color:#999999;display:block;padding-top:2px;text-decoration:none}
-.AFHeaderLevelOne,H1.af_panelHeader,H1.af_showDetailHeader,.af_messages_header,.PortletHeaderText,.PortletHeading1,.PortletSubHeaderText,.portlet-section-header,.portlet-section-subheader,.portlet-table-header,.portlet-table-subheader {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:13pt;font-weight:normal;color:#669966}
-.AFHeaderLevelTwo,H2.af_panelHeader,H2.af_showDetailHeader,.PortletHeading2 {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:11pt;font-weight:normal;color:#669966}
-.af_panelHeader_error,.af_messages_error,.portlet-msg-error {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:13pt;font-weight:normal;color:#cc0000}
-.af_messages {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;color:#336633;width:100%}
-.af_messages_message-text,.af_messages_list,.portlet-msg-info {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;color:#669966;margin:0px 0px 0px 0px;padding:5px 30px 5px 30px}
-.af_panelSideBar {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;color:#336633;border-color:#999999}
-.AFSortableHeaderSortIcon {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:9pt;font-weight:normal;color:#669966}
-.af_menuTabs_enabled {background-color:#e9e8e8;white-space:nowrap}
-.af_menuTabs_selected {background-color:#669966;white-space:nowrap}
-.af_menuTabs_disabled {background-color:#e9e8e8;color:#999999;white-space:nowrap}
-.af_menuTabs_enabled A {color:#336633}
-.af_menuTabs_selected A {color:#ccffcc}
-.af_menuTabs_separator {width:0px}
-.af_table_content,.af_treeTable_content {border-collapse:collapse;border-color:#999999;border-style:solid;border-width:1px}
-.af_table_control-bar-top,.af_treeTable_control-bar-top {background-color:#e9e8e8;border-color:#999999;border-style:solid;border-width:1px 1px 0px;padding:1px 2px}
-.af_table_control-bar-bottom,.af_treeTable_control-bar-bottom {background-color:#e9e8e8;border-color:#999999;border-style:solid;border-width:0px 1px 1px;padding:1px 2px}
-.af_table_sub-control-bar,.af_treeTable_sub-control-bar {border-color:#999999;border-style:solid;border-width:1px 1px 0px;padding:1px 2px}
-.af_column_cell-text,.portlet-section-selected,.portlet-table-selected {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;color:#000000;vertical-align:baseline;background-color:#e9e8e8;border-color:#999999}
-.af_column_cell-text-band,.portlet-section-alternate,.portlet-table-alternate {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;color:#000000;vertical-align:baseline;background-color:#ffffff;border-color:#999999}
-.af_column_cell-number {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;color:#000000;vertical-align:baseline;background-color:#e9e8e8;border-color:#999999;text-align:right;padding-right:2px}
-.af_column_cell-number-band {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;color:#000000;vertical-align:baseline;background-color:#ffffff;border-color:#999999;text-align:right;padding-right:2px}
-.af_column_cell-icon-format,.af_tableSelectOne_cell-icon-format,.af_tableSelectMany_cell-icon-format,.OraTableCellSelect,.portlet-section-text,.portlet-table-text {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;color:#000000;vertical-align:baseline;background-color:#e9e8e8;border-color:#999999;text-align:center}
-.af_column_cell-icon-format-band,.af_tableSelectOne_cell-icon-format-band,.af_tableSelectMany_cell-icon-format-band,.OraTableCellSelectBand {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;color:#000000;vertical-align:baseline;background-color:#ffffff;border-color:#999999;text-align:center}
-.af_column_header-text {border-color:#999999;font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:bold;text-align:left;background-color:#CCCCCC;color:#669966;vertical-align:bottom}
-.af_column_header-number {border-color:#999999;font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:bold;background-color:#CCCCCC;color:#669966;vertical-align:bottom;text-align:right}
-.af_column_header-icon-format {border-color:#999999;font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:bold;background-color:#CCCCCC;color:#669966;vertical-align:bottom;text-align:center}
-.af_column_row-header-text {border-color:#999999;font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:bold;text-align:right;background-color:#CCCCCC;color:#669966}
-.af_table_detail {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;color:#000000;border-color:#999999;background-color:#ffffff}
-.af_table_column-footer,.portlet-section-footer,.portlet-table-footer {border-color:#999999;font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:bold;text-align:left;background-color:#CCCCCC;color:#669966}
-.OraTableTotal {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:bold;text-align:right;background-color:#CCCCCC;color:#669966}
-.af_column_total-number {border-color:#999999;font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:bold;text-align:right;background-color:#CCCCCC;color:#000000;vertical-align:baseline}
-.af_column_total-text {border-color:#999999;font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:bold;text-align:left;background-color:#CCCCCC;color:#000000;vertical-align:baseline}
-.af_column_sortable-header-text {border-color:#999999;font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:bold;text-align:left;background-color:#CCCCCC;color:#669966;vertical-align:bottom;cursor:pointer;border-width:2px;border-style:outset}
-.af_column_sortable-header-number {border-color:#999999;font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:bold;background-color:#CCCCCC;color:#669966;vertical-align:bottom;cursor:pointer;border-width:2px;border-style:outset;text-align:right}
-.af_column_sortable-header-icon-format {border-color:#999999;font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:bold;background-color:#CCCCCC;color:#669966;vertical-align:bottom;cursor:pointer;border-width:2px;border-style:outset;text-align:center}
-.af_train_stop.p_AFSelected {color:#669966;font-weight:bold}
-.af_train_stop:visited,.af_train_stop:visited .af_train_link {color:#666666}
-.af_train_stop.p_AFDisabled,.af_panelTabbed_tab .p_OraDisabled {color:#999999}
-.af_train_stop.p_AFUnvisited,.p_OraContentFooterRule {color:#669966}
-.af_train_stop.p_AFDisabled .af_train_link {color:#669999}
-.OraBGColorVeryDark {background-color:#336633}
-.OraBGColorDark,.af_menuBar_body,.af_menuBar_title,.af_menuBar_empty {background-color:#669966}
-.OraBGColorMedium {background-color:#99cc99}
-.OraBGColorLight {background-color:#ccffcc}
-.OraBGGrayVeryDark {background-color:#333333}
-.OraBGGrayDark {background-color:#666666}
-.OraBGGrayMedium,.OraBGAccentVeryDark,.OraTable {background-color:#999999}
-.OraBGGrayLight {background-color:#cccccc}
-.OraInlineInfoText {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:8pt;font-weight:normal;color:#669966}
-.OraTextInline {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:8pt;font-weight:normal;color:#99cc99}
-.OraMessageBoxErrorText,.AFErrorText {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;color:#cc0000}
-.OraErrorNameText {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:bold;color:#cc0000}
-.OraInlineErrorText {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:8pt;font-weight:normal;color:#cc0000}
-.OraGlobalPageTitle {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:13pt;color:#ffffff;font-weight:bold}
-.p_OraSelected {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:bold;background-color:#ccffcc;text-decoration:none}
-.p_OraHiddenLabel {position:absolute;top:-999px;left:0px;font-size:0px}
-.p_OraColorFieldSwatch {border-color:#000000;border-style:solid;border-width:1px}
-.p_OraColorPalette {background-color:#000000}
-.p_OraColorPaletteEmptyCell {background-color:#ffffff}
-.af_inputDate_nav A,.af_chooseDate_nav A {color:#003333;text-decoration:none}
-.af_inputDate_title,.af_chooseDate_title {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:13pt;font-weight:normal;text-align:center;background-color:#ffffff;color:#669966;padding:2px}
-.af_inputDate_header,.af_chooseDate_header {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:bold;text-align:center;color:#669966;padding:2px}
-.af_inputDate_content A,.af_chooseDate_content A {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;text-align:center;color:#003333}
-.af_chooseDate_content {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;text-align:center;color:#999999;text-decoration:none;border-width:1px;border-style:solid;padding:2px}
-.p_OraContentFooterStart {float:left}
-.p_OraContentFooterBottom {clear:both;margin-bottom:5px}
-.p_OraFooter {text-align:center}
-.p_OraFooterBottom {padding-top:5px}
-.p_OraHeaderNest {margin:5px 0px 0px 12px}
-.OraHGridLocatorHeader {border-color:#999999;background-color:#e9e8e8}
-.p_OraHideShowDisclosedSymbol,.af_panelTabbed_tab-selected A,.p_OraTreeDisclosedSymbol A:link,.p_OraTreeDisclosedSymbol A:active,.p_OraTreeDisclosedSymbol A:visited,.p_OraTreeRowSelected A:link,.p_OraTreeRowSelected A:active,.p_OraTreeRowSelected A:visited {color:#669966;text-decoration:none}
-.af_messages_list-single {list-style-type:none}
-.p_OraQuickSearchBox {background-color:#e9e8e8;border-color:#CCCCCC;border-style:solid;padding:0pt 5pt 5pt 5pt;border-width:0px 0px 1px 1px}
-.p_OraGlobalQuick {border-color:#CCCCCC;border-style:solid;border-width:0px 0px 0px 1px}
-.p_OraProcessingStatus {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:bold;color:#669966;border-color:#99cc99;border-style:solid;border-width:1px}
-.p_OraProductBrandingText {color:#669966;position:relative;font-family:Garamond, Times, Times New Roman, Serif;font-weight:normal;font-size:24pt;line-height:28.8pt;top:-4.8pt}
-.p_OraProductBrandingCompactText {color:#669966;font-family:Arial,Helvetica,Geneva,sans-serif;font-size:13pt;margin-bottom:0px;margin-top:0px;font-weight:bold}
-.OraShuttleHeader {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:9pt;color:#669966;font-weight:bold;padding:0px 0px 0px 18px}
-.OraShuttleLinkText {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:9pt;font-weight:normal;color:#003333}
-.p_OraSideBarMinWidth {width:140px}
-.OraStyledList {list-style-position:inside;padding:0px;margin:0px}
-.OraStyledList .OraStyledList {padding:0pt 0pt 0pt 10pt}
-.af_panelTabbed_tab {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;padding:0px 8px}
-.af_panelTabbed_tab-selected {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:bold;padding:0px 8px}
-.af_panelTabbed_cell-start {width:0%}
-.af_panelTabbed_cell-end {width:100%}
-.OraTableBorder0001 {border-style:solid;border-width:0px 0px 0px 1px}
-.OraTableBorder0010 {border-style:solid;border-width:0px 0px 1px}
-.OraTableBorder0011 {border-style:solid;border-width:0px 0px 1px 1px}
-.OraTableBorder0100 {border-style:solid;border-width:0px 1px 0px 0px}
-.OraTableBorder0101 {border-style:solid;border-width:0px 1px}
-.OraTableBorder0110 {border-style:solid;border-width:0px 1px 1px 0px}
-.OraTableBorder0111 {border-style:solid;border-width:0px 1px 1px}
-.OraTableBorder1000 {border-style:solid;border-width:1px 0px 0px}
-.OraTableBorder1001 {border-style:solid;border-width:1px 0px 0px 1px}
-.OraTableBorder1010 {border-style:solid;border-width:1px 0px}
-.OraTableBorder1011 {border-style:solid;border-width:1px 0px 1px 1px}
-.OraTableBorder1100 {border-style:solid;border-width:1px 1px 0px 0px}
-.OraTableBorder1101 {border-style:solid;border-width:1px 1px 0px}
-.OraTableBorder1110 {border-style:solid;border-width:1px 1px 1px 0px}
-.OraTableBorder1111 {border-style:solid;border-width:1px}
-.OraTableTitle {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:13pt;font-weight:normal;background-color:#ffffff;color:#669966}
-.p_OraTreeDisclosedSymbol {color:#669966;font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;text-align:right}
-.p_OraTreeNodeAdjust {padding-bottom:2px}
-.af_chart {width:400px;height:300px;background-color:white}
-.p_OraOnePixelLine {background-color:#CCCCCC;font-size:0pt;overflow:hidden;height:1px;width:100%}
-.p_OraDisplayBlock {display:block}
-.p_OraHideSkipNaviText {font-size:0pt;margin-top:0px;margin-left:-999px}
-.PortletHeaderLink,.PortletSubHeaderLink {color:#ffffff;text-decoration:none}
-.AFLogo {width:103px;height:13px;background-repeat:no-repeat;background-position:center;vertical-align:middle;background-image:url(images/logo-dark.gif)}
-body {margin-top:8px}
-.p_OraNav2 {border-color:#99cc99}
-.af_navigationPane {height:25px}
-/* The number of CSS selectors in this file is 548 */
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/ITrinidadConstants.java b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/ITrinidadConstants.java
deleted file mode 100644
index cbb8d88..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/ITrinidadConstants.java
+++ /dev/null
@@ -1,2557 +0,0 @@
-/**
- * Copyright (c) 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle Corporation - initial API and implementation
- */
-package org.eclipse.jst.jsf.apache.trinidad.tagsupport;
-
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.jsf.core.internal.tld.TagIdentifierFactory;
-
-/**
- * Trinidad-related constants.
- * 
- * @author Ian Trimble - Oracle
- */
-public interface ITrinidadConstants {
-
-	/**
-	 * Trinidad "core" URI.
-	 */
-	public static final String URI_CORE = "http://myfaces.apache.org/trinidad"; //$NON-NLS-1$
-
-	/**
-	 * Trinidad "html" URI.
-	 */
-	public static final String URI_HTML = "http://myfaces.apache.org/trinidad/html"; //$NON-NLS-1$
-
-	// "Core" tags
-	/**
-	 * Tag name for "tr:forEach"
-	 */
-	public static final String TAG_FOREACH = "forEach"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:forEach"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_FOREACH = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_FOREACH);
-
-	/**
-	 * Tag name for "tr:setActionListener"
-	 */
-	public static final String TAG_SETACTIONLISTENER = "setActionListener"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:setActionListener"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_SETACTIONLISTENER = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_SETACTIONLISTENER);
-
-	/**
-	 * Tag name for "tr:fileDownloadActionListener"
-	 */
-	public static final String TAG_FILEDOWNLOADACTIONLISTENER = "fileDownloadActionListener"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:fileDownloadActionListener"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_FILEDOWNLOADACTIONLISTENER = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_FILEDOWNLOADACTIONLISTENER);
-
-	/**
-	 * Tag name for "tr:returnActionListener"
-	 */
-	public static final String TAG_RETURNACTIONLISTENER = "returnActionListener"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:returnActionListener"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_RETURNACTIONLISTENER = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_RETURNACTIONLISTENER);
-
-	/**
-	 * Tag name for "tr:resetActionListener"
-	 */
-	public static final String TAG_RESETACTIONLISTENER = "resetActionListener"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:resetActionListener"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_RESETACTIONLISTENER = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_RESETACTIONLISTENER);
-
-	/**
-	 * Tag name for "tr:componentRef"
-	 */
-	public static final String TAG_COMPONENTREF = "componentRef"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:componentRef"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_COMPONENTREF = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_COMPONENTREF);
-
-	/**
-	 * Tag name for "tr:componentDef"
-	 */
-	public static final String TAG_COMPONENTDEF = "componentDef"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:componentDef"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_COMPONENTDEF = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_COMPONENTDEF);
-
-	/**
-	 * Tag name for "tr:facetRef"
-	 */
-	public static final String TAG_FACETREF = "facetRef"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:facetRef"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_FACETREF = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_FACETREF);
-
-	/**
-	 * Tag name for "tr:breadCrumbs"
-	 */
-	public static final String TAG_BREADCRUMBS = "breadCrumbs"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:breadCrumbs"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_BREADCRUMBS = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_BREADCRUMBS);
-
-	/**
-	 * Tag name for "tr:chart"
-	 */
-	public static final String TAG_CHART = "chart"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:chart"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_CHART = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_CHART);
-
-	/**
-	 * Tag name for "tr:chooseColor"
-	 */
-	public static final String TAG_CHOOSECOLOR = "chooseColor"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:chooseColor"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_CHOOSECOLOR = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_CHOOSECOLOR);
-
-	/**
-	 * Tag name for "tr:chooseDate"
-	 */
-	public static final String TAG_CHOOSEDATE = "chooseDate"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:chooseDate"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_CHOOSEDATE = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_CHOOSEDATE);
-
-	/**
-	 * Tag name for "tr:column"
-	 */
-	public static final String TAG_COLUMN = "column"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:column"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_COLUMN = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_COLUMN);
-
-	/**
-	 * Tag name for "tr:commandButton"
-	 */
-	public static final String TAG_COMMANDBUTTON = "commandButton"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:commandButton"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_COMMANDBUTTON = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_COMMANDBUTTON);
-
-	/**
-	 * Tag name for "tr:commandLink"
-	 */
-	public static final String TAG_COMMANDLINK = "commandLink"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:commandLink"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_COMMANDLINK = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_COMMANDLINK);
-
-	/**
-	 * Tag name for "tr:commandNavigationItem"
-	 */
-	public static final String TAG_COMMANDNAVIGATIONITEM = "commandNavigationItem"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:commandNavigationItem"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_COMMANDNAVIGATIONITEM = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_COMMANDNAVIGATIONITEM);
-
-	/**
-	 * Tag name for "tr:document"
-	 */
-	public static final String TAG_DOCUMENT = "document"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:document"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_DOCUMENT = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_DOCUMENT);
-
-	/**
-	 * Tag name for "tr:form"
-	 */
-	public static final String TAG_FORM = "form"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:form"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_FORM = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_FORM);
-
-	/**
-	 * Tag name for "tr:goButton"
-	 */
-	public static final String TAG_GOBUTTON = "goButton"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:goButton"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_GOBUTTON = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_GOBUTTON);
-
-	/**
-	 * Tag name for "tr:goLink"
-	 */
-	public static final String TAG_GOLINK = "goLink"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:goLink"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_GOLINK = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_GOLINK);
-
-	/**
-	 * Tag name for "tr:icon"
-	 */
-	public static final String TAG_ICON = "icon"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:icon"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_ICON = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_ICON);
-
-	/**
-	 * Tag name for "tr:image"
-	 */
-	public static final String TAG_IMAGE = "image"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:image"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_IMAGE = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_IMAGE);
-
-	/**
-	 * Tag name for "tr:importScript"
-	 */
-	public static final String TAG_IMPORTSCRIPT = "importScript"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:importScript"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_IMPORTSCRIPT = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_IMPORTSCRIPT);
-
-	/**
-	 * Tag name for "tr:inputColor"
-	 */
-	public static final String TAG_INPUTCOLOR = "inputColor"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:inputColor"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_INPUTCOLOR = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_INPUTCOLOR);
-
-	/**
-	 * Tag name for "tr:inputDate"
-	 */
-	public static final String TAG_INPUTDATE = "inputDate"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:inputDate"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_INPUTDATE = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_INPUTDATE);
-
-	/**
-	 * Tag name for "tr:inputFile"
-	 */
-	public static final String TAG_INPUTFILE = "inputFile"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:inputFile"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_INPUTFILE = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_INPUTFILE);
-
-	/**
-	 * Tag name for "tr:inputHidden"
-	 */
-	public static final String TAG_INPUTHIDDEN = "inputHidden"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:inputHidden"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_INPUTHIDDEN = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_INPUTHIDDEN);
-
-	/**
-	 * Tag name for "tr:inputListOfValues"
-	 */
-	public static final String TAG_INPUTLISTOFVALUES = "inputListOfValues"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:inputListOfValues"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_INPUTLISTOFVALUES = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_INPUTLISTOFVALUES);
-
-	/**
-	 * Tag name for "tr:inputNumberSpinbox"
-	 */
-	public static final String TAG_INPUTNUMBERSPINBOX = "inputNumberSpinbox"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:inputNumberSpinbox"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_INPUTNUMBERSPINBOX = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_INPUTNUMBERSPINBOX);
-
-	/**
-	 * Tag name for "tr:inputText"
-	 */
-	public static final String TAG_INPUTTEXT = "inputText"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:inputText"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_INPUTTEXT = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_INPUTTEXT);
-
-	/**
-	 * Tag name for "tr:legend"
-	 */
-	public static final String TAG_LEGEND = "legend"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:legend"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_LEGEND = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_LEGEND);
-
-	/**
-	 * Tag name for "tr:media"
-	 */
-	public static final String TAG_MEDIA = "media"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:media"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_MEDIA = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_MEDIA);
-
-	/**
-	 * Tag name for "tr:message"
-	 */
-	public static final String TAG_MESSAGE = "message"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:message"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_MESSAGE = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_MESSAGE);
-
-	/**
-	 * Tag name for "tr:messages"
-	 */
-	public static final String TAG_MESSAGES = "messages"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:messages"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_MESSAGES = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_MESSAGES);
-
-	/**
-	 * Tag name for "tr:navigationPane"
-	 */
-	public static final String TAG_NAVIGATIONPANE = "navigationPane"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:navigationPane"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_NAVIGATIONPANE = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_NAVIGATIONPANE);
-
-	/**
-	 * Tag name for "tr:navigationTree"
-	 */
-	public static final String TAG_NAVIGATIONTREE = "navigationTree"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:navigationTree"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_NAVIGATIONTREE = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_NAVIGATIONTREE);
-
-	/**
-	 * Tag name for "tr:outputDocument"
-	 */
-	public static final String TAG_OUTPUTDOCUMENT = "outputDocument"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:outputDocument"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_OUTPUTDOCUMENT = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_OUTPUTDOCUMENT);
-
-	/**
-	 * Tag name for "tr:outputFormatted"
-	 */
-	public static final String TAG_OUTPUTFORMATTED = "outputFormatted"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:outputFormatted"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_OUTPUTFORMATTED = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_OUTPUTFORMATTED);
-
-	/**
-	 * Tag name for "tr:outputLabel"
-	 */
-	public static final String TAG_OUTPUTLABEL = "outputLabel"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:outputLabel"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_OUTPUTLABEL = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_OUTPUTLABEL);
-
-	/**
-	 * Tag name for "tr:outputText"
-	 */
-	public static final String TAG_OUTPUTTEXT = "outputText"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:outputText"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_OUTPUTTEXT = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_OUTPUTTEXT);
-
-	/**
-	 * Tag name for "tr:page"
-	 */
-	public static final String TAG_PAGE = "page"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:page"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_PAGE = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_PAGE);
-
-	/**
-	 * Tag name for "tr:panelAccordion"
-	 */
-	public static final String TAG_PANELACCORDION = "panelAccordion"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:panelAccordion"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_PANELACCORDION = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_PANELACCORDION);
-
-	/**
-	 * Tag name for "tr:panelBorderLayout"
-	 */
-	public static final String TAG_PANELBORDERLAYOUT = "panelBorderLayout"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:panelBorderLayout"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_PANELBORDERLAYOUT = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_PANELBORDERLAYOUT);
-
-	/**
-	 * Tag name for "tr:panelBox"
-	 */
-	public static final String TAG_PANELBOX = "panelBox"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:panelBox"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_PANELBOX = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_PANELBOX);
-
-	/**
-	 * Tag name for "tr:panelButtonBar"
-	 */
-	public static final String TAG_PANELBUTTONBAR = "panelButtonBar"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:panelButtonBar"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_PANELBUTTONBAR = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_PANELBUTTONBAR);
-
-	/**
-	 * Tag name for "tr:panelCaptionGroup"
-	 */
-	public static final String TAG_PANELCAPTIONGROUP = "panelCaptionGroup"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:panelCaptionGroup"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_PANELCAPTIONGROUP = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_PANELCAPTIONGROUP);
-
-	/**
-	 * Tag name for "tr:panelChoice"
-	 */
-	public static final String TAG_PANELCHOICE = "panelChoice"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:panelChoice"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_PANELCHOICE = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_PANELCHOICE);
-
-	/**
-	 * Tag name for "tr:panelFormLayout"
-	 */
-	public static final String TAG_PANELFORMLAYOUT = "panelFormLayout"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:panelFormLayout"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_PANELFORMLAYOUT = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_PANELFORMLAYOUT);
-
-	/**
-	 * Tag name for "tr:panelGroupLayout"
-	 */
-	public static final String TAG_PANELGROUPLAYOUT = "panelGroupLayout"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:panelGroupLayout"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_PANELGROUPLAYOUT = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_PANELGROUPLAYOUT);
-
-	/**
-	 * Tag name for "tr:panelHeader"
-	 */
-	public static final String TAG_PANELHEADER = "panelHeader"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:panelHeader"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_PANELHEADER = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_PANELHEADER);
-
-	/**
-	 * Tag name for "tr:panelHorizontalLayout"
-	 */
-	public static final String TAG_PANELHORIZONTALLAYOUT = "panelHorizontalLayout"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:panelHorizontalLayout"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_PANELHORIZONTALLAYOUT = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_PANELHORIZONTALLAYOUT);
-
-	/**
-	 * Tag name for "tr:panelLabelAndMessage"
-	 */
-	public static final String TAG_PANELLABELANDMESSAGE = "panelLabelAndMessage"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:panelLabelAndMessage"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_PANELLABELANDMESSAGE = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_PANELLABELANDMESSAGE);
-
-	/**
-	 * Tag name for "tr:panelList"
-	 */
-	public static final String TAG_PANELLIST = "panelList"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:panelList"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_PANELLIST = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_PANELLIST);
-
-	/**
-	 * Tag name for "tr:panelPage"
-	 */
-	public static final String TAG_PANELPAGE = "panelPage"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:panelPage"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_PANELPAGE = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_PANELPAGE);
-
-	/**
-	 * Tag name for "tr:panelPageHeader"
-	 */
-	public static final String TAG_PANELPAGEHEADER = "panelPageHeader"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:panelPageHeader"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_PANELPAGEHEADER = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_PANELPAGEHEADER);
-
-	/**
-	 * Tag name for "tr:panelPopup"
-	 */
-	public static final String TAG_PANELPOPUP = "panelPopup"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:panelPopup"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_PANELPOPUP = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_PANELPOPUP);
-
-	/**
-	 * Tag name for "tr:panelRadio"
-	 */
-	public static final String TAG_PANELRADIO = "panelRadio"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:panelRadio"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_PANELRADIO = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_PANELRADIO);
-
-	/**
-	 * Tag name for "tr:panelSideBar"
-	 */
-	public static final String TAG_PANELSIDEBAR = "panelSideBar"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:panelSideBar"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_PANELSIDEBAR = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_PANELSIDEBAR);
-
-	/**
-	 * Tag name for "tr:panelTabbed"
-	 */
-	public static final String TAG_PANELTABBED = "panelTabbed"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:panelTabbed"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_PANELTABBED = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_PANELTABBED);
-
-	/**
-	 * Tag name for "tr:panelTip"
-	 */
-	public static final String TAG_PANELTIP = "panelTip"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:panelTip"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_PANELTIP = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_PANELTIP);
-
-	/**
-	 * Tag name for "tr:poll"
-	 */
-	public static final String TAG_POLL = "poll"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:poll"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_POLL = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_POLL);
-
-	/**
-	 * Tag name for "tr:processChoiceBar"
-	 */
-	public static final String TAG_PROCESSCHOICEBAR = "processChoiceBar"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:processChoiceBar"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_PROCESSCHOICEBAR = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_PROCESSCHOICEBAR);
-
-	/**
-	 * Tag name for "tr:progressIndicator"
-	 */
-	public static final String TAG_PROGRESSINDICATOR = "progressIndicator"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:progressIndicator"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_PROGRESSINDICATOR = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_PROGRESSINDICATOR);
-
-	/**
-	 * Tag name for "tr:resetButton"
-	 */
-	public static final String TAG_RESETBUTTON = "resetButton"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:resetButton"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_RESETBUTTON = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_RESETBUTTON);
-
-	/**
-	 * Tag name for "tr:selectBooleanCheckbox"
-	 */
-	public static final String TAG_SELECTBOOLEANCHECKBOX = "selectBooleanCheckbox"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:selectBooleanCheckbox"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_SELECTBOOLEANCHECKBOX = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_SELECTBOOLEANCHECKBOX);
-
-	/**
-	 * Tag name for "tr:selectBooleanRadio"
-	 */
-	public static final String TAG_SELECTBOOLEANRADIO = "selectBooleanRadio"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:selectBooleanRadio"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_SELECTBOOLEANRADIO = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_SELECTBOOLEANRADIO);
-
-	/**
-	 * Tag name for "tr:selectItem"
-	 */
-	public static final String TAG_SELECTITEM = "selectItem"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:selectItem"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_SELECTITEM = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_SELECTITEM);
-
-	/**
-	 * Tag name for "tr:selectManyCheckbox"
-	 */
-	public static final String TAG_SELECTMANYCHECKBOX = "selectManyCheckbox"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:selectManyCheckbox"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_SELECTMANYCHECKBOX = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_SELECTMANYCHECKBOX);
-
-	/**
-	 * Tag name for "tr:selectManyListbox"
-	 */
-	public static final String TAG_SELECTMANYLISTBOX = "selectManyListbox"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:selectManyListbox"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_SELECTMANYLISTBOX = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_SELECTMANYLISTBOX);
-
-	/**
-	 * Tag name for "tr:selectManyShuttle"
-	 */
-	public static final String TAG_SELECTMANYSHUTTLE = "selectManyShuttle"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:selectManyShuttle"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_SELECTMANYSHUTTLE = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_SELECTMANYSHUTTLE);
-
-	/**
-	 * Tag name for "tr:selectOneChoice"
-	 */
-	public static final String TAG_SELECTONECHOICE = "selectOneChoice"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:selectOneChoice"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_SELECTONECHOICE = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_SELECTONECHOICE);
-
-	/**
-	 * Tag name for "tr:selectOneListbox"
-	 */
-	public static final String TAG_SELECTONELISTBOX = "selectOneListbox"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:selectOneListbox"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_SELECTONELISTBOX = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_SELECTONELISTBOX);
-
-	/**
-	 * Tag name for "tr:selectOneRadio"
-	 */
-	public static final String TAG_SELECTONERADIO = "selectOneRadio"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:selectOneRadio"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_SELECTONERADIO = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_SELECTONERADIO);
-
-	/**
-	 * Tag name for "tr:selectOrderShuttle"
-	 */
-	public static final String TAG_SELECTORDERSHUTTLE = "selectOrderShuttle"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:selectOrderShuttle"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_SELECTORDERSHUTTLE = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_SELECTORDERSHUTTLE);
-
-	/**
-	 * Tag name for "tr:selectRangeChoiceBar"
-	 */
-	public static final String TAG_SELECTRANGECHOICEBAR = "selectRangeChoiceBar"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:selectRangeChoiceBar"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_SELECTRANGECHOICEBAR = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_SELECTRANGECHOICEBAR);
-
-	/**
-	 * Tag name for "tr:separator"
-	 */
-	public static final String TAG_SEPARATOR = "separator"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:separator"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_SEPARATOR = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_SEPARATOR);
-
-	/**
-	 * Tag name for "tr:showDetail"
-	 */
-	public static final String TAG_SHOWDETAIL = "showDetail"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:showDetail"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_SHOWDETAIL = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_SHOWDETAIL);
-
-	/**
-	 * Tag name for "tr:showDetailHeader"
-	 */
-	public static final String TAG_SHOWDETAILHEADER = "showDetailHeader"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:showDetailHeader"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_SHOWDETAILHEADER = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_SHOWDETAILHEADER);
-
-	/**
-	 * Tag name for "tr:showDetailItem"
-	 */
-	public static final String TAG_SHOWDETAILITEM = "showDetailItem"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:showDetailItem"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_SHOWDETAILITEM = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_SHOWDETAILITEM);
-
-	/**
-	 * Tag name for "tr:singleStepButtonBar"
-	 */
-	public static final String TAG_SINGLESTEPBUTTONBAR = "singleStepButtonBar"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:singleStepButtonBar"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_SINGLESTEPBUTTONBAR = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_SINGLESTEPBUTTONBAR);
-
-	/**
-	 * Tag name for "tr:spacer"
-	 */
-	public static final String TAG_SPACER = "spacer"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:spacer"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_SPACER = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_SPACER);
-
-	/**
-	 * Tag name for "tr:statusIndicator"
-	 */
-	public static final String TAG_STATUSINDICATOR = "statusIndicator"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:statusIndicator"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_STATUSINDICATOR = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_STATUSINDICATOR);
-
-	/**
-	 * Tag name for "tr:subform"
-	 */
-	public static final String TAG_SUBFORM = "subform"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:subform"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_SUBFORM = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_SUBFORM);
-
-	/**
-	 * Tag name for "tr:table"
-	 */
-	public static final String TAG_TABLE = "table"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:table"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_TABLE = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_TABLE);
-
-	/**
-	 * Tag name for "tr:train"
-	 */
-	public static final String TAG_TRAIN = "train"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:train"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_TRAIN = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_TRAIN);
-
-	/**
-	 * Tag name for "tr:tree"
-	 */
-	public static final String TAG_TREE = "tree"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:tree"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_TREE = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_TREE);
-
-	/**
-	 * Tag name for "tr:treeTable"
-	 */
-	public static final String TAG_TREETABLE = "treeTable"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:treeTable"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_TREETABLE = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_TREETABLE);
-
-	/**
-	 * Tag name for "tr:group"
-	 */
-	public static final String TAG_GROUP = "group"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:group"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_GROUP = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_GROUP);
-
-	/**
-	 * Tag name for "tr:iterator"
-	 */
-	public static final String TAG_ITERATOR = "iterator"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:iterator"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_ITERATOR = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_ITERATOR);
-
-	/**
-	 * Tag name for "tr:switcher"
-	 */
-	public static final String TAG_SWITCHER = "switcher"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:switcher"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_SWITCHER = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_SWITCHER);
-
-	/**
-	 * Tag name for "tr:convertColor"
-	 */
-	public static final String TAG_CONVERTCOLOR = "convertColor"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:convertColor"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_CONVERTCOLOR = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_CONVERTCOLOR);
-
-	/**
-	 * Tag name for "tr:convertDateTime"
-	 */
-	public static final String TAG_CONVERTDATETIME = "convertDateTime"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:convertDateTime"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_CONVERTDATETIME = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_CONVERTDATETIME);
-
-	/**
-	 * Tag name for "tr:convertNumber"
-	 */
-	public static final String TAG_CONVERTNUMBER = "convertNumber"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:convertNumber"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_CONVERTNUMBER = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_CONVERTNUMBER);
-
-	/**
-	 * Tag name for "tr:validateByteLength"
-	 */
-	public static final String TAG_VALIDATEBYTELENGTH = "validateByteLength"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:validateByteLength"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_VALIDATEBYTELENGTH = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_VALIDATEBYTELENGTH);
-
-	/**
-	 * Tag name for "tr:validateDateRestriction"
-	 */
-	public static final String TAG_VALIDATEDATERESTRICTION = "validateDateRestriction"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:validateDateRestriction"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_VALIDATEDATERESTRICTION = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_VALIDATEDATERESTRICTION);
-
-	/**
-	 * Tag name for "tr:validateDateTimeRange"
-	 */
-	public static final String TAG_VALIDATEDATETIMERANGE = "validateDateTimeRange"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:validateDateTimeRange"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_VALIDATEDATETIMERANGE = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_VALIDATEDATETIMERANGE);
-
-	/**
-	 * Tag name for "tr:validateDoubleRange"
-	 */
-	public static final String TAG_VALIDATEDOUBLERANGE = "validateDoubleRange"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:validateDoubleRange"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_VALIDATEDOUBLERANGE = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_VALIDATEDOUBLERANGE);
-
-	/**
-	 * Tag name for "tr:validateLength"
-	 */
-	public static final String TAG_VALIDATELENGTH = "validateLength"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:validateLength"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_VALIDATELENGTH = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_VALIDATELENGTH);
-
-	/**
-	 * Tag name for "tr:validateLongRange"
-	 */
-	public static final String TAG_VALIDATELONGRANGE = "validateLongRange"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:validateLongRange"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_VALIDATELONGRANGE = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_VALIDATELONGRANGE);
-
-	/**
-	 * Tag name for "tr:validateRegExp"
-	 */
-	public static final String TAG_VALIDATEREGEXP = "validateRegExp"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:validateRegExp"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_VALIDATEREGEXP = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_VALIDATEREGEXP);
-
-	// "HTML" tags
-	/**
-	 * Tag name for "trh:styleSheet"
-	 */
-	public static final String TAG_STYLESHEET = "styleSheet"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "trh:styleSheet"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_STYLESHEET = TagIdentifierFactory
-			.createJSPTagWrapper(URI_HTML, TAG_STYLESHEET);
-
-	/**
-	 * Tag name for "trh:body"
-	 */
-	public static final String TAG_BODY = "body"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "trh:body"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_BODY = TagIdentifierFactory
-			.createJSPTagWrapper(URI_HTML, TAG_BODY);
-
-	/**
-	 * Tag name for "trh:cellFormat"
-	 */
-	public static final String TAG_CELLFORMAT = "cellFormat"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "trh:cellFormat"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_CELLFORMAT = TagIdentifierFactory
-			.createJSPTagWrapper(URI_HTML, TAG_CELLFORMAT);
-
-	/**
-	 * Tag name for "trh:frame"
-	 */
-	public static final String TAG_FRAME = "frame"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "trh:frame"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_FRAME = TagIdentifierFactory
-			.createJSPTagWrapper(URI_HTML, TAG_FRAME);
-
-	/**
-	 * Tag name for "trh:frameBorderLayout"
-	 */
-	public static final String TAG_FRAMEBORDERLAYOUT = "frameBorderLayout"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "trh:frameBorderLayout"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_FRAMEBORDERLAYOUT = TagIdentifierFactory
-			.createJSPTagWrapper(URI_HTML, TAG_FRAMEBORDERLAYOUT);
-
-	/**
-	 * Tag name for "trh:head"
-	 */
-	public static final String TAG_HEAD = "head"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "trh:head"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_HEAD = TagIdentifierFactory
-			.createJSPTagWrapper(URI_HTML, TAG_HEAD);
-
-	/**
-	 * Tag name for "trh:html"
-	 */
-	public static final String TAG_HTML = "html"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "trh:html"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_HTML = TagIdentifierFactory
-			.createJSPTagWrapper(URI_HTML, TAG_HTML);
-
-	/**
-	 * Tag name for "trh:rowLayout"
-	 */
-	public static final String TAG_ROWLAYOUT = "rowLayout"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "trh:rowLayout"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_ROWLAYOUT = TagIdentifierFactory
-			.createJSPTagWrapper(URI_HTML, TAG_ROWLAYOUT);
-
-	/**
-	 * Tag name for "trh:script"
-	 */
-	public static final String TAG_SCRIPT = "script"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "trh:script"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_SCRIPT = TagIdentifierFactory
-			.createJSPTagWrapper(URI_HTML, TAG_SCRIPT);
-
-	/**
-	 * Tag name for "trh:tableLayout"
-	 */
-	public static final String TAG_TABLELAYOUT = "tableLayout"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "trh:tableLayout"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_TABLELAYOUT = TagIdentifierFactory
-			.createJSPTagWrapper(URI_HTML, TAG_TABLELAYOUT);
-
-//Attributes
-	/**
-	* "summary" tag attribute name
-	*/
-	public static final String ATTR_SUMMARY = "summary"; //$NON-NLS-1$
-
-	/**
-	* "initialFocusId" tag attribute name
-	*/
-	public static final String ATTR_INITIALFOCUSID = "initialFocusId"; //$NON-NLS-1$
-
-	/**
-	* "accessKey" tag attribute name
-	*/
-	public static final String ATTR_ACCESSKEY = "accessKey"; //$NON-NLS-1$
-
-	/**
-	* "colorData" tag attribute name
-	*/
-	public static final String ATTR_COLORDATA = "colorData"; //$NON-NLS-1$
-
-	/**
-	* "messageDetailConvertBoth" tag attribute name
-	*/
-	public static final String ATTR_MESSAGEDETAILCONVERTBOTH = "messageDetailConvertBoth"; //$NON-NLS-1$
-
-	/**
-	* "defaultSortOrder" tag attribute name
-	*/
-	public static final String ATTR_DEFAULTSORTORDER = "defaultSortOrder"; //$NON-NLS-1$
-
-	/**
-	* "columns" tag attribute name
-	*/
-	public static final String ATTR_COLUMNS = "columns"; //$NON-NLS-1$
-
-	/**
-	* "chromeType" tag attribute name
-	*/
-	public static final String ATTR_CHROMETYPE = "chromeType"; //$NON-NLS-1$
-
-	/**
-	* "rowHeader" tag attribute name
-	*/
-	public static final String ATTR_ROWHEADER = "rowHeader"; //$NON-NLS-1$
-
-	/**
-	* "transparentAllowed" tag attribute name
-	*/
-	public static final String ATTR_TRANSPARENTALLOWED = "transparentAllowed"; //$NON-NLS-1$
-
-	/**
-	* "rootNodeRendered" tag attribute name
-	*/
-	public static final String ATTR_ROOTNODERENDERED = "rootNodeRendered"; //$NON-NLS-1$
-
-	/**
-	* "rangeChangeListener" tag attribute name
-	*/
-	public static final String ATTR_RANGECHANGELISTENER = "rangeChangeListener"; //$NON-NLS-1$
-
-	/**
-	* "messageDetailConvertCurrency" tag attribute name
-	*/
-	public static final String ATTR_MESSAGEDETAILCONVERTCURRENCY = "messageDetailConvertCurrency"; //$NON-NLS-1$
-
-	/**
-	* "patterns" tag attribute name
-	*/
-	public static final String ATTR_PATTERNS = "patterns"; //$NON-NLS-1$
-
-	/**
-	* "disclosedRowKeys" tag attribute name
-	*/
-	public static final String ATTR_DISCLOSEDROWKEYS = "disclosedRowKeys"; //$NON-NLS-1$
-
-	/**
-	* "ondblclick" tag attribute name
-	*/
-	public static final String ATTR_ONDBLCLICK = "ondblclick"; //$NON-NLS-1$
-
-	/**
-	* "windowWidth" tag attribute name
-	*/
-	public static final String ATTR_WINDOWWIDTH = "windowWidth"; //$NON-NLS-1$
-
-	/**
-	* "rendered" tag attribute name
-	*/
-	public static final String ATTR_RENDERED = "rendered"; //$NON-NLS-1$
-
-	/**
-	* "invalidDays" tag attribute name
-	*/
-	public static final String ATTR_INVALIDDAYS = "invalidDays"; //$NON-NLS-1$
-
-	/**
-	* "styleUsage" tag attribute name
-	*/
-	public static final String ATTR_STYLEUSAGE = "styleUsage"; //$NON-NLS-1$
-
-	/**
-	* "blocking" tag attribute name
-	*/
-	public static final String ATTR_BLOCKING = "blocking"; //$NON-NLS-1$
-
-	/**
-	* "gradientsUsed" tag attribute name
-	*/
-	public static final String ATTR_GRADIENTSUSED = "gradientsUsed"; //$NON-NLS-1$
-
-	/**
-	* "legendPosition" tag attribute name
-	*/
-	public static final String ATTR_LEGENDPOSITION = "legendPosition"; //$NON-NLS-1$
-
-	/**
-	* "rowDisclosureListener" tag attribute name
-	*/
-	public static final String ATTR_ROWDISCLOSURELISTENER = "rowDisclosureListener"; //$NON-NLS-1$
-
-	/**
-	* "binding" tag attribute name
-	*/
-	public static final String ATTR_BINDING = "binding"; //$NON-NLS-1$
-
-	/**
-	* "disclosureListener" tag attribute name
-	*/
-	public static final String ATTR_DISCLOSURELISTENER = "disclosureListener"; //$NON-NLS-1$
-
-	/**
-	* "separatorClass" tag attribute name
-	*/
-	public static final String ATTR_SEPARATORCLASS = "separatorClass"; //$NON-NLS-1$
-
-	/**
-	* "showRequired" tag attribute name
-	*/
-	public static final String ATTR_SHOWREQUIRED = "showRequired"; //$NON-NLS-1$
-
-	/**
-	* "messageDetailInvalidDaysOfWeek" tag attribute name
-	*/
-	public static final String ATTR_MESSAGEDETAILINVALIDDAYSOFWEEK = "messageDetailInvalidDaysOfWeek"; //$NON-NLS-1$
-
-	/**
-	* "minimum" tag attribute name
-	*/
-	public static final String ATTR_MINIMUM = "minimum"; //$NON-NLS-1$
-
-	/**
-	* "simple" tag attribute name
-	*/
-	public static final String ATTR_SIMPLE = "simple"; //$NON-NLS-1$
-
-	/**
-	* "sortable" tag attribute name
-	*/
-	public static final String ATTR_SORTABLE = "sortable"; //$NON-NLS-1$
-
-	/**
-	* "discloseMany" tag attribute name
-	*/
-	public static final String ATTR_DISCLOSEMANY = "discloseMany"; //$NON-NLS-1$
-
-	/**
-	* "maximumLength" tag attribute name
-	*/
-	public static final String ATTR_MAXIMUMLENGTH = "maximumLength"; //$NON-NLS-1$
-
-	/**
-	* "visited" tag attribute name
-	*/
-	public static final String ATTR_VISITED = "visited"; //$NON-NLS-1$
-
-	/**
-	* "truncateAt" tag attribute name
-	*/
-	public static final String ATTR_TRUNCATEAT = "truncateAt"; //$NON-NLS-1$
-
-	/**
-	* "auxiliary1Size" tag attribute name
-	*/
-	public static final String ATTR_AUXILIARY1SIZE = "auxiliary1Size"; //$NON-NLS-1$
-
-	/**
-	* "converter" tag attribute name
-	*/
-	public static final String ATTR_CONVERTER = "converter"; //$NON-NLS-1$
-
-	/**
-	* "reorderOnly" tag attribute name
-	*/
-	public static final String ATTR_REORDERONLY = "reorderOnly"; //$NON-NLS-1$
-
-	/**
-	* "maxValue" tag attribute name
-	*/
-	public static final String ATTR_MAXVALUE = "maxValue"; //$NON-NLS-1$
-
-	/**
-	* "rowSelection" tag attribute name
-	*/
-	public static final String ATTR_ROWSELECTION = "rowSelection"; //$NON-NLS-1$
-
-	/**
-	* "tooltipsVisible" tag attribute name
-	*/
-	public static final String ATTR_TOOLTIPSVISIBLE = "tooltipsVisible"; //$NON-NLS-1$
-
-	/**
-	* "sortProperty" tag attribute name
-	*/
-	public static final String ATTR_SORTPROPERTY = "sortProperty"; //$NON-NLS-1$
-
-	/**
-	* "YMajorGridLineCount" tag attribute name
-	*/
-	public static final String ATTR_YMAJORGRIDLINECOUNT = "YMajorGridLineCount"; //$NON-NLS-1$
-
-	/**
-	* "yoffset" tag attribute name
-	*/
-	public static final String ATTR_YOFFSET = "yoffset"; //$NON-NLS-1$
-
-	/**
-	* "shortDesc" tag attribute name
-	*/
-	public static final String ATTR_SHORTDESC = "shortDesc"; //$NON-NLS-1$
-
-	/**
-	* "messageDetailConvertNumber" tag attribute name
-	*/
-	public static final String ATTR_MESSAGEDETAILCONVERTNUMBER = "messageDetailConvertNumber"; //$NON-NLS-1$
-
-	/**
-	* "listStyle" tag attribute name
-	*/
-	public static final String ATTR_LISTSTYLE = "listStyle"; //$NON-NLS-1$
-
-	/**
-	* "readOnly" tag attribute name
-	*/
-	public static final String ATTR_READONLY = "readOnly"; //$NON-NLS-1$
-
-	/**
-	* "pattern" tag attribute name
-	*/
-	public static final String ATTR_PATTERN = "pattern"; //$NON-NLS-1$
-
-	/**
-	* "background" tag attribute name
-	*/
-	public static final String ATTR_BACKGROUND = "background"; //$NON-NLS-1$
-
-	/**
-	* "animationDuration" tag attribute name
-	*/
-	public static final String ATTR_ANIMATIONDURATION = "animationDuration"; //$NON-NLS-1$
-
-	/**
-	* "labelAndAccessKey" tag attribute name
-	*/
-	public static final String ATTR_LABELANDACCESSKEY = "labelAndAccessKey"; //$NON-NLS-1$
-
-	/**
-	* "titleClass" tag attribute name
-	*/
-	public static final String ATTR_TITLECLASS = "titleClass"; //$NON-NLS-1$
-
-	/**
-	* "minFractionDigits" tag attribute name
-	*/
-	public static final String ATTR_MINFRACTIONDIGITS = "minFractionDigits"; //$NON-NLS-1$
-
-	/**
-	* "to" tag attribute name
-	*/
-	public static final String ATTR_TO = "to"; //$NON-NLS-1$
-
-	/**
-	* "player" tag attribute name
-	*/
-	public static final String ATTR_PLAYER = "player"; //$NON-NLS-1$
-
-	/**
-	* "globalOnly" tag attribute name
-	*/
-	public static final String ATTR_GLOBALONLY = "globalOnly"; //$NON-NLS-1$
-
-	/**
-	* "messageDetailInvalidMonths" tag attribute name
-	*/
-	public static final String ATTR_MESSAGEDETAILINVALIDMONTHS = "messageDetailInvalidMonths"; //$NON-NLS-1$
-
-	/**
-	* "secondaryPattern" tag attribute name
-	*/
-	public static final String ATTR_SECONDARYPATTERN = "secondaryPattern"; //$NON-NLS-1$
-
-	/**
-	* "previousAction" tag attribute name
-	*/
-	public static final String ATTR_PREVIOUSACTION = "previousAction"; //$NON-NLS-1$
-
-	/**
-	* "columnBandingInterval" tag attribute name
-	*/
-	public static final String ATTR_COLUMNBANDINGINTERVAL = "columnBandingInterval"; //$NON-NLS-1$
-
-	/**
-	* "noWrap" tag attribute name
-	*/
-	public static final String ATTR_NOWRAP = "noWrap"; //$NON-NLS-1$
-
-	/**
-	* "startLevel" tag attribute name
-	*/
-	public static final String ATTR_STARTLEVEL = "startLevel"; //$NON-NLS-1$
-
-	/**
-	* "valueChangeListener" tag attribute name
-	*/
-	public static final String ATTR_VALUECHANGELISTENER = "valueChangeListener"; //$NON-NLS-1$
-
-	/**
-	* "compact" tag attribute name
-	*/
-	public static final String ATTR_COMPACT = "compact"; //$NON-NLS-1$
-
-	/**
-	* "autoSubmit" tag attribute name
-	*/
-	public static final String ATTR_AUTOSUBMIT = "autoSubmit"; //$NON-NLS-1$
-
-	/**
-	* "height" tag attribute name
-	*/
-	public static final String ATTR_HEIGHT = "height"; //$NON-NLS-1$
-
-	/**
-	* "horizontalGridVisible" tag attribute name
-	*/
-	public static final String ATTR_HORIZONTALGRIDVISIBLE = "horizontalGridVisible"; //$NON-NLS-1$
-
-	/**
-	* "YMinorGridLineCount" tag attribute name
-	*/
-	public static final String ATTR_YMINORGRIDLINECOUNT = "YMinorGridLineCount"; //$NON-NLS-1$
-
-	/**
-	* "description" tag attribute name
-	*/
-	public static final String ATTR_DESCRIPTION = "description"; //$NON-NLS-1$
-
-	/**
-	* "onblur" tag attribute name
-	*/
-	public static final String ATTR_ONBLUR = "onblur"; //$NON-NLS-1$
-
-	/**
-	* "longDesc" tag attribute name
-	*/
-	public static final String ATTR_LONGDESC = "longDesc"; //$NON-NLS-1$
-
-	/**
-	* "perspective" tag attribute name
-	*/
-	public static final String ATTR_PERSPECTIVE = "perspective"; //$NON-NLS-1$
-
-	/**
-	* "trailingHeader" tag attribute name
-	*/
-	public static final String ATTR_TRAILINGHEADER = "trailingHeader"; //$NON-NLS-1$
-
-	/**
-	* "text" tag attribute name
-	*/
-	public static final String ATTR_TEXT = "text"; //$NON-NLS-1$
-
-	/**
-	* "messageDetailConvert" tag attribute name
-	*/
-	public static final String ATTR_MESSAGEDETAILCONVERT = "messageDetailConvert"; //$NON-NLS-1$
-
-	/**
-	* "onmouseout" tag attribute name
-	*/
-	public static final String ATTR_ONMOUSEOUT = "onmouseout"; //$NON-NLS-1$
-
-	/**
-	* "partialSubmit" tag attribute name
-	*/
-	public static final String ATTR_PARTIALSUBMIT = "partialSubmit"; //$NON-NLS-1$
-
-	/**
-	* "align" tag attribute name
-	*/
-	public static final String ATTR_ALIGN = "align"; //$NON-NLS-1$
-
-	/**
-	* "width" tag attribute name
-	*/
-	public static final String ATTR_WIDTH = "width"; //$NON-NLS-1$
-
-	/**
-	* "onkeyup" tag attribute name
-	*/
-	public static final String ATTR_ONKEYUP = "onkeyup"; //$NON-NLS-1$
-
-	/**
-	* "onfocus" tag attribute name
-	*/
-	public static final String ATTR_ONFOCUS = "onfocus"; //$NON-NLS-1$
-
-	/**
-	* "label" tag attribute name
-	*/
-	public static final String ATTR_LABEL = "label"; //$NON-NLS-1$
-
-	/**
-	* "componentType" tag attribute name
-	*/
-	public static final String ATTR_COMPONENTTYPE = "componentType"; //$NON-NLS-1$
-
-	/**
-	* "autostart" tag attribute name
-	*/
-	public static final String ATTR_AUTOSTART = "autostart"; //$NON-NLS-1$
-
-	/**
-	* "discloseNone" tag attribute name
-	*/
-	public static final String ATTR_DISCLOSENONE = "discloseNone"; //$NON-NLS-1$
-
-	/**
-	* "size" tag attribute name
-	*/
-	public static final String ATTR_SIZE = "size"; //$NON-NLS-1$
-
-	/**
-	* "standbyText" tag attribute name
-	*/
-	public static final String ATTR_STANDBYTEXT = "standbyText"; //$NON-NLS-1$
-
-	/**
-	* "onselect" tag attribute name
-	*/
-	public static final String ATTR_ONSELECT = "onselect"; //$NON-NLS-1$
-
-	/**
-	* "items" tag attribute name
-	*/
-	public static final String ATTR_ITEMS = "items"; //$NON-NLS-1$
-
-	/**
-	* "names" tag attribute name
-	*/
-	public static final String ATTR_NAMES = "names"; //$NON-NLS-1$
-
-	/**
-	* "maximum" tag attribute name
-	*/
-	public static final String ATTR_MAXIMUM = "maximum"; //$NON-NLS-1$
-
-	/**
-	* "disclosed" tag attribute name
-	*/
-	public static final String ATTR_DISCLOSED = "disclosed"; //$NON-NLS-1$
-
-	/**
-	* "rowsByDepth" tag attribute name
-	*/
-	public static final String ATTR_ROWSBYDEPTH = "rowsByDepth"; //$NON-NLS-1$
-
-	/**
-	* "maxStep" tag attribute name
-	*/
-	public static final String ATTR_MAXSTEP = "maxStep"; //$NON-NLS-1$
-
-	/**
-	* "var" tag attribute name
-	*/
-	public static final String ATTR_VAR = "var"; //$NON-NLS-1$
-
-	/**
-	* "focusRowKey" tag attribute name
-	*/
-	public static final String ATTR_FOCUSROWKEY = "focusRowKey"; //$NON-NLS-1$
-
-	/**
-	* "unselectedLabel" tag attribute name
-	*/
-	public static final String ATTR_UNSELECTEDLABEL = "unselectedLabel"; //$NON-NLS-1$
-
-	/**
-	* "searchDesc" tag attribute name
-	*/
-	public static final String ATTR_SEARCHDESC = "searchDesc"; //$NON-NLS-1$
-
-	/**
-	* "pollListener" tag attribute name
-	*/
-	public static final String ATTR_POLLLISTENER = "pollListener"; //$NON-NLS-1$
-
-	/**
-	* "name" tag attribute name
-	*/
-	public static final String ATTR_NAME = "name"; //$NON-NLS-1$
-
-	/**
-	* "valueAndAccessKey" tag attribute name
-	*/
-	public static final String ATTR_VALUEANDACCESSKEY = "valueAndAccessKey"; //$NON-NLS-1$
-
-	/**
-	* "XMajorGridLineCount" tag attribute name
-	*/
-	public static final String ATTR_XMAJORGRIDLINECOUNT = "XMajorGridLineCount"; //$NON-NLS-1$
-
-	/**
-	* "nextActionListener" tag attribute name
-	*/
-	public static final String ATTR_NEXTACTIONLISTENER = "nextActionListener"; //$NON-NLS-1$
-
-	/**
-	* "maxIntegerDigits" tag attribute name
-	*/
-	public static final String ATTR_MAXINTEGERDIGITS = "maxIntegerDigits"; //$NON-NLS-1$
-
-	/**
-	* "messageDetailConvertTime" tag attribute name
-	*/
-	public static final String ATTR_MESSAGEDETAILCONVERTTIME = "messageDetailConvertTime"; //$NON-NLS-1$
-
-	/**
-	* "icon" tag attribute name
-	*/
-	public static final String ATTR_ICON = "icon"; //$NON-NLS-1$
-
-	/**
-	* "undisclosedText" tag attribute name
-	*/
-	public static final String ATTR_UNDISCLOSEDTEXT = "undisclosedText"; //$NON-NLS-1$
-
-	/**
-	* "disclosedText" tag attribute name
-	*/
-	public static final String ATTR_DISCLOSEDTEXT = "disclosedText"; //$NON-NLS-1$
-
-	/**
-	* "onmouseover" tag attribute name
-	*/
-	public static final String ATTR_ONMOUSEOVER = "onmouseover"; //$NON-NLS-1$
-
-	/**
-	* "messageDetailConvertPattern" tag attribute name
-	*/
-	public static final String ATTR_MESSAGEDETAILCONVERTPATTERN = "messageDetailConvertPattern"; //$NON-NLS-1$
-
-	/**
-	* "message" tag attribute name
-	*/
-	public static final String ATTR_MESSAGE = "message"; //$NON-NLS-1$
-
-	/**
-	* "immediate" tag attribute name
-	*/
-	public static final String ATTR_IMMEDIATE = "immediate"; //$NON-NLS-1$
-
-	/**
-	* "messageDetailNoMatch" tag attribute name
-	*/
-	public static final String ATTR_MESSAGEDETAILNOMATCH = "messageDetailNoMatch"; //$NON-NLS-1$
-
-	/**
-	* "source" tag attribute name
-	*/
-	public static final String ATTR_SOURCE = "source"; //$NON-NLS-1$
-
-	/**
-	* "usesUpload" tag attribute name
-	*/
-	public static final String ATTR_USESUPLOAD = "usesUpload"; //$NON-NLS-1$
-
-	/**
-	* "onclick" tag attribute name
-	*/
-	public static final String ATTR_ONCLICK = "onclick"; //$NON-NLS-1$
-
-	/**
-	* "valign" tag attribute name
-	*/
-	public static final String ATTR_VALIGN = "valign"; //$NON-NLS-1$
-
-	/**
-	* "disabled" tag attribute name
-	*/
-	public static final String ATTR_DISABLED = "disabled"; //$NON-NLS-1$
-
-	/**
-	* "nextAction" tag attribute name
-	*/
-	public static final String ATTR_NEXTACTION = "nextAction"; //$NON-NLS-1$
-
-	/**
-	* "facetName" tag attribute name
-	*/
-	public static final String ATTR_FACETNAME = "facetName"; //$NON-NLS-1$
-
-	/**
-	* "for" tag attribute name
-	*/
-	public static final String ATTR_FOR = "for"; //$NON-NLS-1$
-
-	/**
-	* "defaultFacet" tag attribute name
-	*/
-	public static final String ATTR_DEFAULTFACET = "defaultFacet"; //$NON-NLS-1$
-
-	/**
-	* "defaultCommand" tag attribute name
-	*/
-	public static final String ATTR_DEFAULTCOMMAND = "defaultCommand"; //$NON-NLS-1$
-
-	/**
-	* "minValue" tag attribute name
-	*/
-	public static final String ATTR_MINVALUE = "minValue"; //$NON-NLS-1$
-
-	/**
-	* "labelStyle" tag attribute name
-	*/
-	public static final String ATTR_LABELSTYLE = "labelStyle"; //$NON-NLS-1$
-
-	/**
-	* "textAndAccessKey" tag attribute name
-	*/
-	public static final String ATTR_TEXTANDACCESSKEY = "textAndAccessKey"; //$NON-NLS-1$
-
-	/**
-	* "messageDetailConvertPercent" tag attribute name
-	*/
-	public static final String ATTR_MESSAGEDETAILCONVERTPERCENT = "messageDetailConvertPercent"; //$NON-NLS-1$
-
-	/**
-	* "valuePassThru" tag attribute name
-	*/
-	public static final String ATTR_VALUEPASSTHRU = "valuePassThru"; //$NON-NLS-1$
-
-	/**
-	* "imageMapType" tag attribute name
-	*/
-	public static final String ATTR_IMAGEMAPTYPE = "imageMapType"; //$NON-NLS-1$
-
-	/**
-	* "chartDrillDownListener" tag attribute name
-	*/
-	public static final String ATTR_CHARTDRILLDOWNLISTENER = "chartDrillDownListener"; //$NON-NLS-1$
-
-	/**
-	* "fieldWidth" tag attribute name
-	*/
-	public static final String ATTR_FIELDWIDTH = "fieldWidth"; //$NON-NLS-1$
-
-	/**
-	* "auxiliaryGlobalSize" tag attribute name
-	*/
-	public static final String ATTR_AUXILIARYGLOBALSIZE = "auxiliaryGlobalSize"; //$NON-NLS-1$
-
-	/**
-	* "triggerType" tag attribute name
-	*/
-	public static final String ATTR_TRIGGERTYPE = "triggerType"; //$NON-NLS-1$
-
-	/**
-	* "orientation" tag attribute name
-	*/
-	public static final String ATTR_ORIENTATION = "orientation"; //$NON-NLS-1$
-
-	/**
-	* "inlineStyle" tag attribute name
-	*/
-	public static final String ATTR_INLINESTYLE = "inlineStyle"; //$NON-NLS-1$
-
-	/**
-	* "timeStyle" tag attribute name
-	*/
-	public static final String ATTR_TIMESTYLE = "timeStyle"; //$NON-NLS-1$
-
-	/**
-	* "flex" tag attribute name
-	*/
-	public static final String ATTR_FLEX = "flex"; //$NON-NLS-1$
-
-	/**
-	* "destination" tag attribute name
-	*/
-	public static final String ATTR_DESTINATION = "destination"; //$NON-NLS-1$
-
-	/**
-	* "innerWidth" tag attribute name
-	*/
-	public static final String ATTR_INNERWIDTH = "innerWidth"; //$NON-NLS-1$
-
-	/**
-	* "useWindow" tag attribute name
-	*/
-	public static final String ATTR_USEWINDOW = "useWindow"; //$NON-NLS-1$
-
-	/**
-	* "verticalGridVisible" tag attribute name
-	*/
-	public static final String ATTR_VERTICALGRIDVISIBLE = "verticalGridVisible"; //$NON-NLS-1$
-
-	/**
-	* "onmousedown" tag attribute name
-	*/
-	public static final String ATTR_ONMOUSEDOWN = "onmousedown"; //$NON-NLS-1$
-
-	/**
-	* "invalidDaysOfWeek" tag attribute name
-	*/
-	public static final String ATTR_INVALIDDAYSOFWEEK = "invalidDaysOfWeek"; //$NON-NLS-1$
-
-	/**
-	* "headerNoWrap" tag attribute name
-	*/
-	public static final String ATTR_HEADERNOWRAP = "headerNoWrap"; //$NON-NLS-1$
-
-	/**
-	* "invalidMonths" tag attribute name
-	*/
-	public static final String ATTR_INVALIDMONTHS = "invalidMonths"; //$NON-NLS-1$
-
-	/**
-	* "headerText" tag attribute name
-	*/
-	public static final String ATTR_HEADERTEXT = "headerText"; //$NON-NLS-1$
-
-	/**
-	* "actionListener" tag attribute name
-	*/
-	public static final String ATTR_ACTIONLISTENER = "actionListener"; //$NON-NLS-1$
-
-	/**
-	* "attributeChangeListener" tag attribute name
-	*/
-	public static final String ATTR_ATTRIBUTECHANGELISTENER = "attributeChangeListener"; //$NON-NLS-1$
-
-	/**
-	* "position" tag attribute name
-	*/
-	public static final String ATTR_POSITION = "position"; //$NON-NLS-1$
-
-	/**
-	* "previousActionListener" tag attribute name
-	*/
-	public static final String ATTR_PREVIOUSACTIONLISTENER = "previousActionListener"; //$NON-NLS-1$
-
-	/**
-	* "interval" tag attribute name
-	*/
-	public static final String ATTR_INTERVAL = "interval"; //$NON-NLS-1$
-
-	/**
-	* "allDetailsEnabled" tag attribute name
-	*/
-	public static final String ATTR_ALLDETAILSENABLED = "allDetailsEnabled"; //$NON-NLS-1$
-
-	/**
-	* "validator" tag attribute name
-	*/
-	public static final String ATTR_VALIDATOR = "validator"; //$NON-NLS-1$
-
-	/**
-	* "onunload" tag attribute name
-	*/
-	public static final String ATTR_ONUNLOAD = "onunload"; //$NON-NLS-1$
-
-	/**
-	* "maxFractionDigits" tag attribute name
-	*/
-	public static final String ATTR_MAXFRACTIONDIGITS = "maxFractionDigits"; //$NON-NLS-1$
-
-	/**
-	* "leadingDescShown" tag attribute name
-	*/
-	public static final String ATTR_LEADINGDESCSHOWN = "leadingDescShown"; //$NON-NLS-1$
-
-	/**
-	* "emptyText" tag attribute name
-	*/
-	public static final String ATTR_EMPTYTEXT = "emptyText"; //$NON-NLS-1$
-
-	/**
-	* "trailingDescShown" tag attribute name
-	*/
-	public static final String ATTR_TRAILINGDESCSHOWN = "trailingDescShown"; //$NON-NLS-1$
-
-	/**
-	* "escape" tag attribute name
-	*/
-	public static final String ATTR_ESCAPE = "escape"; //$NON-NLS-1$
-
-	/**
-	* "mode" tag attribute name
-	*/
-	public static final String ATTR_MODE = "mode"; //$NON-NLS-1$
-
-	/**
-	* "messageDetailInvalidDays" tag attribute name
-	*/
-	public static final String ATTR_MESSAGEDETAILINVALIDDAYS = "messageDetailInvalidDays"; //$NON-NLS-1$
-
-	/**
-	* "title" tag attribute name
-	*/
-	public static final String ATTR_TITLE = "title"; //$NON-NLS-1$
-
-	/**
-	* "captionText" tag attribute name
-	*/
-	public static final String ATTR_CAPTIONTEXT = "captionText"; //$NON-NLS-1$
-
-	/**
-	* "stepSize" tag attribute name
-	*/
-	public static final String ATTR_STEPSIZE = "stepSize"; //$NON-NLS-1$
-
-	/**
-	* "encoding" tag attribute name
-	*/
-	public static final String ATTR_ENCODING = "encoding"; //$NON-NLS-1$
-
-	/**
-	* "modal" tag attribute name
-	*/
-	public static final String ATTR_MODAL = "modal"; //$NON-NLS-1$
-
-	/**
-	* "end" tag attribute name
-	*/
-	public static final String ATTR_END = "end"; //$NON-NLS-1$
-
-	/**
-	* "onkeypress" tag attribute name
-	*/
-	public static final String ATTR_ONKEYPRESS = "onkeypress"; //$NON-NLS-1$
-
-	/**
-	* "onkeydown" tag attribute name
-	*/
-	public static final String ATTR_ONKEYDOWN = "onkeydown"; //$NON-NLS-1$
-
-	/**
-	* "innerHeight" tag attribute name
-	*/
-	public static final String ATTR_INNERHEIGHT = "innerHeight"; //$NON-NLS-1$
-
-	/**
-	* "messageType" tag attribute name
-	*/
-	public static final String ATTR_MESSAGETYPE = "messageType"; //$NON-NLS-1$
-
-	/**
-	* "onsubmit" tag attribute name
-	*/
-	public static final String ATTR_ONSUBMIT = "onsubmit"; //$NON-NLS-1$
-
-	/**
-	* "selectedStep" tag attribute name
-	*/
-	public static final String ATTR_SELECTEDSTEP = "selectedStep"; //$NON-NLS-1$
-
-	/**
-	* "rowBandingInterval" tag attribute name
-	*/
-	public static final String ATTR_ROWBANDINGINTERVAL = "rowBandingInterval"; //$NON-NLS-1$
-
-	/**
-	* "varStatus" tag attribute name
-	*/
-	public static final String ATTR_VARSTATUS = "varStatus"; //$NON-NLS-1$
-
-	/**
-	* "xoffset" tag attribute name
-	*/
-	public static final String ATTR_XOFFSET = "xoffset"; //$NON-NLS-1$
-
-	/**
-	* "currencySymbol" tag attribute name
-	*/
-	public static final String ATTR_CURRENCYSYMBOL = "currencySymbol"; //$NON-NLS-1$
-
-	/**
-	* "selectedRowKeys" tag attribute name
-	*/
-	public static final String ATTR_SELECTEDROWKEYS = "selectedRowKeys"; //$NON-NLS-1$
-
-	/**
-	* "method" tag attribute name
-	*/
-	public static final String ATTR_METHOD = "method"; //$NON-NLS-1$
-
-	/**
-	* "messageDetailExact" tag attribute name
-	*/
-	public static final String ATTR_MESSAGEDETAILEXACT = "messageDetailExact"; //$NON-NLS-1$
-
-	/**
-	* "messageDetailNotInRange" tag attribute name
-	*/
-	public static final String ATTR_MESSAGEDETAILNOTINRANGE = "messageDetailNotInRange"; //$NON-NLS-1$
-
-	/**
-	* "launchListener" tag attribute name
-	*/
-	public static final String ATTR_LAUNCHLISTENER = "launchListener"; //$NON-NLS-1$
-
-	/**
-	* "templateSource" tag attribute name
-	*/
-	public static final String ATTR_TEMPLATESOURCE = "templateSource"; //$NON-NLS-1$
-
-	/**
-	* "maxPrecision" tag attribute name
-	*/
-	public static final String ATTR_MAXPRECISION = "maxPrecision"; //$NON-NLS-1$
-
-	/**
-	* "targetFrame" tag attribute name
-	*/
-	public static final String ATTR_TARGETFRAME = "targetFrame"; //$NON-NLS-1$
-
-	/**
-	* "messageDetailConvertDate" tag attribute name
-	*/
-	public static final String ATTR_MESSAGEDETAILCONVERTDATE = "messageDetailConvertDate"; //$NON-NLS-1$
-
-	/**
-	* "focusListener" tag attribute name
-	*/
-	public static final String ATTR_FOCUSLISTENER = "focusListener"; //$NON-NLS-1$
-
-	/**
-	* "contentType" tag attribute name
-	*/
-	public static final String ATTR_CONTENTTYPE = "contentType"; //$NON-NLS-1$
-
-	/**
-	* "type" tag attribute name
-	*/
-	public static final String ATTR_TYPE = "type"; //$NON-NLS-1$
-
-	/**
-	* "initiallyExpanded" tag attribute name
-	*/
-	public static final String ATTR_INITIALLYEXPANDED = "initiallyExpanded"; //$NON-NLS-1$
-
-	/**
-	* "selectionListener" tag attribute name
-	*/
-	public static final String ATTR_SELECTIONLISTENER = "selectionListener"; //$NON-NLS-1$
-
-	/**
-	* "level" tag attribute name
-	*/
-	public static final String ATTR_LEVEL = "level"; //$NON-NLS-1$
-
-	/**
-	* "action" tag attribute name
-	*/
-	public static final String ATTR_ACTION = "action"; //$NON-NLS-1$
-
-	/**
-	* "value" tag attribute name
-	*/
-	public static final String ATTR_VALUE = "value"; //$NON-NLS-1$
-
-	/**
-	* "auxiliary2Size" tag attribute name
-	*/
-	public static final String ATTR_AUXILIARY2SIZE = "auxiliary2Size"; //$NON-NLS-1$
-
-	/**
-	* "required" tag attribute name
-	*/
-	public static final String ATTR_REQUIRED = "required"; //$NON-NLS-1$
-
-	/**
-	* "integerOnly" tag attribute name
-	*/
-	public static final String ATTR_INTEGERONLY = "integerOnly"; //$NON-NLS-1$
-
-	/**
-	* "wrap" tag attribute name
-	*/
-	public static final String ATTR_WRAP = "wrap"; //$NON-NLS-1$
-
-	/**
-	* "chooseId" tag attribute name
-	*/
-	public static final String ATTR_CHOOSEID = "chooseId"; //$NON-NLS-1$
-
-	/**
-	* "requiredMessageDetail" tag attribute name
-	*/
-	public static final String ATTR_REQUIREDMESSAGEDETAIL = "requiredMessageDetail"; //$NON-NLS-1$
-
-	/**
-	* "styleClass" tag attribute name
-	*/
-	public static final String ATTR_STYLECLASS = "styleClass"; //$NON-NLS-1$
-
-	/**
-	* "customColorData" tag attribute name
-	*/
-	public static final String ATTR_CUSTOMCOLORDATA = "customColorData"; //$NON-NLS-1$
-
-	/**
-	* "rows" tag attribute name
-	*/
-	public static final String ATTR_ROWS = "rows"; //$NON-NLS-1$
-
-	/**
-	* "groupingUsed" tag attribute name
-	*/
-	public static final String ATTR_GROUPINGUSED = "groupingUsed"; //$NON-NLS-1$
-
-	/**
-	* "playCount" tag attribute name
-	*/
-	public static final String ATTR_PLAYCOUNT = "playCount"; //$NON-NLS-1$
-
-	/**
-	* "default" tag attribute name
-	*/
-	public static final String ATTR_DEFAULT = "default"; //$NON-NLS-1$
-
-	/**
-	* "contentStyle" tag attribute name
-	*/
-	public static final String ATTR_CONTENTSTYLE = "contentStyle"; //$NON-NLS-1$
-
-	/**
-	* "maxColumns" tag attribute name
-	*/
-	public static final String ATTR_MAXCOLUMNS = "maxColumns"; //$NON-NLS-1$
-
-	/**
-	* "alignment" tag attribute name
-	*/
-	public static final String ATTR_ALIGNMENT = "alignment"; //$NON-NLS-1$
-
-	/**
-	* "leadingHeader" tag attribute name
-	*/
-	public static final String ATTR_LEADINGHEADER = "leadingHeader"; //$NON-NLS-1$
-
-	/**
-	* "locale" tag attribute name
-	*/
-	public static final String ATTR_LOCALE = "locale"; //$NON-NLS-1$
-
-	/**
-	* "messageDetailMaximum" tag attribute name
-	*/
-	public static final String ATTR_MESSAGEDETAILMAXIMUM = "messageDetailMaximum"; //$NON-NLS-1$
-
-	/**
-	* "windowHeight" tag attribute name
-	*/
-	public static final String ATTR_WINDOWHEIGHT = "windowHeight"; //$NON-NLS-1$
-
-	/**
-	* "timeZone" tag attribute name
-	*/
-	public static final String ATTR_TIMEZONE = "timeZone"; //$NON-NLS-1$
-
-	/**
-	* "from" tag attribute name
-	*/
-	public static final String ATTR_FROM = "from"; //$NON-NLS-1$
-
-	/**
-	* "messageDetailMinimum" tag attribute name
-	*/
-	public static final String ATTR_MESSAGEDETAILMINIMUM = "messageDetailMinimum"; //$NON-NLS-1$
-
-	/**
-	* "id" tag attribute name
-	*/
-	public static final String ATTR_ID = "id"; //$NON-NLS-1$
-
-	/**
-	* "returnListener" tag attribute name
-	*/
-	public static final String ATTR_RETURNLISTENER = "returnListener"; //$NON-NLS-1$
-
-	/**
-	* "controls" tag attribute name
-	*/
-	public static final String ATTR_CONTROLS = "controls"; //$NON-NLS-1$
-
-	/**
-	* "disclosedTransient" tag attribute name
-	*/
-	public static final String ATTR_DISCLOSEDTRANSIENT = "disclosedTransient"; //$NON-NLS-1$
-
-	/**
-	* "selected" tag attribute name
-	*/
-	public static final String ATTR_SELECTED = "selected"; //$NON-NLS-1$
-
-	/**
-	* "dateStyle" tag attribute name
-	*/
-	public static final String ATTR_DATESTYLE = "dateStyle"; //$NON-NLS-1$
-
-	/**
-	* "minIntegerDigits" tag attribute name
-	*/
-	public static final String ATTR_MININTEGERDIGITS = "minIntegerDigits"; //$NON-NLS-1$
-
-	/**
-	* "onmouseup" tag attribute name
-	*/
-	public static final String ATTR_ONMOUSEUP = "onmouseup"; //$NON-NLS-1$
-
-	/**
-	* "layout" tag attribute name
-	*/
-	public static final String ATTR_LAYOUT = "layout"; //$NON-NLS-1$
-
-	/**
-	* "expandAllEnabled" tag attribute name
-	*/
-	public static final String ATTR_EXPANDALLENABLED = "expandAllEnabled"; //$NON-NLS-1$
-
-	/**
-	* "onmousemove" tag attribute name
-	*/
-	public static final String ATTR_ONMOUSEMOVE = "onmousemove"; //$NON-NLS-1$
-
-	/**
-	* "halign" tag attribute name
-	*/
-	public static final String ATTR_HALIGN = "halign"; //$NON-NLS-1$
-
-	/**
-	* "labelWidth" tag attribute name
-	*/
-	public static final String ATTR_LABELWIDTH = "labelWidth"; //$NON-NLS-1$
-
-	/**
-	* "currencyCode" tag attribute name
-	*/
-	public static final String ATTR_CURRENCYCODE = "currencyCode"; //$NON-NLS-1$
-
-	/**
-	* "partialTriggers" tag attribute name
-	*/
-	public static final String ATTR_PARTIALTRIGGERS = "partialTriggers"; //$NON-NLS-1$
-
-	/**
-	* "separateRows" tag attribute name
-	*/
-	public static final String ATTR_SEPARATEROWS = "separateRows"; //$NON-NLS-1$
-
-	/**
-	* "hint" tag attribute name
-	*/
-	public static final String ATTR_HINT = "hint"; //$NON-NLS-1$
-
-	/**
-	* "onchange" tag attribute name
-	*/
-	public static final String ATTR_ONCHANGE = "onchange"; //$NON-NLS-1$
-
-	/**
-	* "begin" tag attribute name
-	*/
-	public static final String ATTR_BEGIN = "begin"; //$NON-NLS-1$
-
-	/**
-	* "longDescURL" tag attribute name
-	*/
-	public static final String ATTR_LONGDESCURL = "longDescURL"; //$NON-NLS-1$
-
-	/**
-	* "onload" tag attribute name
-	*/
-	public static final String ATTR_ONLOAD = "onload"; //$NON-NLS-1$
-
-	/**
-	* "sortListener" tag attribute name
-	*/
-	public static final String ATTR_SORTLISTENER = "sortListener"; //$NON-NLS-1$
-
-	/**
-	* "filename" tag attribute name
-	*/
-	public static final String ATTR_FILENAME = "filename"; //$NON-NLS-1$
-
-	/**
-	* "secret" tag attribute name
-	*/
-	public static final String ATTR_SECRET = "secret"; //$NON-NLS-1$
-
-	/**
-	* "group" tag attribute name
-	*/
-	public static final String ATTR_GROUP = "group"; //$NON-NLS-1$
-
-	/**
-	* "first" tag attribute name
-	*/
-	public static final String ATTR_FIRST = "first"; //$NON-NLS-1$
-
-	/**
-	* "step" tag attribute name
-	*/
-	public static final String ATTR_STEP = "step"; //$NON-NLS-1$
-
-	/**
-	* "headers" tag attribute name
-	*/
-	public static final String ATTR_HEADERS = "headers"; //$NON-NLS-1$
-
-	/**
-	* "generatesContent" tag attribute name
-	*/
-	public static final String ATTR_GENERATESCONTENT = "generatesContent"; //$NON-NLS-1$
-
-	/**
-	* "marginHeight" tag attribute name
-	*/
-	public static final String ATTR_MARGINHEIGHT = "marginHeight"; //$NON-NLS-1$
-
-	/**
-	* "cellPadding" tag attribute name
-	*/
-	public static final String ATTR_CELLPADDING = "cellPadding"; //$NON-NLS-1$
-
-	/**
-	* "wrappingDisabled" tag attribute name
-	*/
-	public static final String ATTR_WRAPPINGDISABLED = "wrappingDisabled"; //$NON-NLS-1$
-
-	/**
-	* "rowSpan" tag attribute name
-	*/
-	public static final String ATTR_ROWSPAN = "rowSpan"; //$NON-NLS-1$
-
-	/**
-	* "columnSpan" tag attribute name
-	*/
-	public static final String ATTR_COLUMNSPAN = "columnSpan"; //$NON-NLS-1$
-
-	/**
-	* "frameSpacing" tag attribute name
-	*/
-	public static final String ATTR_FRAMESPACING = "frameSpacing"; //$NON-NLS-1$
-
-	/**
-	* "cellSpacing" tag attribute name
-	*/
-	public static final String ATTR_CELLSPACING = "cellSpacing"; //$NON-NLS-1$
-
-	/**
-	* "header" tag attribute name
-	*/
-	public static final String ATTR_HEADER = "header"; //$NON-NLS-1$
-
-	/**
-	* "scrolling" tag attribute name
-	*/
-	public static final String ATTR_SCROLLING = "scrolling"; //$NON-NLS-1$
-
-	/**
-	* "borderWidth" tag attribute name
-	*/
-	public static final String ATTR_BORDERWIDTH = "borderWidth"; //$NON-NLS-1$
-
-	/**
-	* "frameBorderWidth" tag attribute name
-	*/
-	public static final String ATTR_FRAMEBORDERWIDTH = "frameBorderWidth"; //$NON-NLS-1$
-
-	/**
-	* "shortText" tag attribute name
-	*/
-	public static final String ATTR_SHORTTEXT = "shortText"; //$NON-NLS-1$
-
-	/**
-	* "marginWidth" tag attribute name
-	*/
-	public static final String ATTR_MARGINWIDTH = "marginWidth"; //$NON-NLS-1$
-
-	/**
-	* "firstClickPassed" tag attribute name
-	*/
-	public static final String ATTR_FIRSTCLICKPASSED = "firstClickPassed"; //$NON-NLS-1$
-
-	/**
-	 * Value for "style" attribute on elements used to indicate an empty source
-	 * element.
-	 */
-	public static final String STYLE_EMPTYELEMENT = "color:silver;font-family:Arial,Helvetica,Geneva,sans-serif;font-size:8pt;"; //$NON-NLS-1$
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/Messages.java b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/Messages.java
deleted file mode 100644
index 75e5d75..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/Messages.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/**
- * Copyright (c) 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle Corporation - initial API and implementation
- */
-package org.eclipse.jst.jsf.apache.trinidad.tagsupport;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * String resource handler.
- * 
- * @author Ian Trimble - Oracle
- */
-public class Messages extends NLS {
-
-	private static final String BUNDLE_NAME =
-		"org.eclipse.jst.jsf.apache.trinidad.tagsupport.messages"; //$NON-NLS-1$
-
-	static {
-		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-	}
-
-	/**
-	 * See messages.properties.
-	 */
-	public static String BreadCrumbsOperation_EmptyBreadCrumbsTag;
-
-	/**
-	 * See messages.properties.
-	 */
-	public static String NavigationPaneOperation_EmptyNavigationPaneTag;
-
-	/**
-	 * See messages.properties.
-	 */
-	public static String PanelTabbedOperation_EmptyPanelTabbedTag;
-
-	/**
-	 * See messages.properties.
-	 */
-	public static String ShowDetailItemOperation_EmptyShowDetailItemTag;
-
-	/**
-	 * See messages.properties.
-	 */
-	public static String SelectItemModel_SampleItem1Label;
-
-	/**
-	 * See messages.properties.
-	 */
-	public static String SelectItemModel_SampleItem1Value;
-
-	/**
-	 * See messages.properties.
-	 */
-	public static String SelectItemModel_SampleItem2Label;
-
-	/**
-	 * See messages.properties.
-	 */
-	public static String SelectItemModel_SampleItem2Value;
-
-	/**
-	 * See messages.properties.
-	 */
-	public static String SelectItemModel_SampleItem3Label;
-
-	/**
-	 * See messages.properties.
-	 */
-	public static String SelectItemModel_SampleItem3Value;
-
-	/**
-	 * See messages.properties.
-	 */
-	public static String SelectShuttleOperation_Description;
-
-	/**
-	 * See messages.properties.
-	 */
-	public static String SelectShuttleOperation_LinkMove;
-
-	/**
-	 * See messages.properties.
-	 */
-	public static String SelectShuttleOperation_LinkMoveAll;
-
-	/**
-	 * See messages.properties.
-	 */
-	public static String SelectShuttleOperation_LinkRemove;
-
-	/**
-	 * See messages.properties.
-	 */
-	public static String SelectShuttleOperation_LinkRemoveAll;
-
-	/**
-	 * See messages.properties.
-	 */
-	public static String SelectShuttleOperation_LinkTop;
-
-	/**
-	 * See messages.properties.
-	 */
-	public static String SelectShuttleOperation_LinkUp;
-
-	/**
-	 * See messages.properties.
-	 */
-	public static String SelectShuttleOperation_LinkDown;
-
-	/**
-	 * See messages.properties.
-	 */
-	public static String SelectShuttleOperation_LinkBottom;
-
-	/**
-	 * See messages.properties.
-	 */
-	public static String TrinidadDTResourceProvider_StyleSheetNotLocated;
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/TrinidadTagSupportActivator.java b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/TrinidadTagSupportActivator.java
deleted file mode 100644
index 35aa533..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/TrinidadTagSupportActivator.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.apache.trinidad.tagsupport;
-
-import org.eclipse.core.runtime.ILog;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jst.jsf.apache.trinidad.tagsupport.dtresourceprovider.TrinidadDTResourceProvider;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.osgi.framework.BundleContext;
-
-/**
- * The activator class controls the plug-in life cycle
- */
-public class TrinidadTagSupportActivator extends AbstractUIPlugin {
-
-	/**
-	 * the plugin id
-	 */
-	public static final String PLUGIN_ID = "org.eclipse.jst.jsf.apache.trinidad.tagsupport"; //$NON-NLS-1$
-
-	// The shared instance
-	private static TrinidadTagSupportActivator plugin;
-	
-	/**
-	 * The constructor
-	 */
-	public TrinidadTagSupportActivator() {
-        // do nothing
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
-	 */
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-		plugin = this;
-		TrinidadDTResourceProvider.init();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
-	 */
-	public void stop(BundleContext context) throws Exception {
-		plugin = null;
-		super.stop(context);
-	}
-
-	/**
-	 * Returns the shared instance
-	 *
-	 * @return the shared instance
-	 */
-	public static TrinidadTagSupportActivator getDefault() {
-		return plugin;
-	}
-
-	/**
-	 * Writes an informational message to this plug-in's log.
-	 * 
-	 * @param message Informational message to be written.
-	 */
-	public static void logInfo(String message) {
-		ILog log = getDefault().getLog();
-		log.log(new Status(IStatus.INFO, PLUGIN_ID, message));
-	}
-
-	/**
-	 * Writes an error message to this plug-in's log.
-	 * 
-	 * @param message Error message to be written.
-	 * @param ex Throwable instance.
-	 */
-	public static void logError(String message, Throwable ex) {
-		ILog log = getDefault().getLog();
-		IStatus status;
-		if (ex != null) {
-			status = new Status(IStatus.ERROR, PLUGIN_ID, message, ex);
-		} else {
-			status = new Status(IStatus.ERROR, PLUGIN_ID, message);
-		}
-		log.log(status);
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/TrinidadUtils.java b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/TrinidadUtils.java
deleted file mode 100644
index 97991e4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/TrinidadUtils.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/**
- * Copyright (c) 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle Corporation - initial API and implementation
- */
-package org.eclipse.jst.jsf.apache.trinidad.tagsupport;
-
-import org.w3c.dom.Node;
-
-/**
- * Utility class for the Trinidad Tag Support plug-in.
- *
- * @author Ian Trimble - Oracle
- */
-public class TrinidadUtils {
-
-	private static final String KEY_CURRENT_CHILD_INDEX =
-		"KEY_CURRENT_CHILD_INDEX"; //$NON-NLS-1$
-
-	/**
-	 * Sets the index of the Node instance's "current" child as user data on
-	 * the Node instance.
-	 * 
-	 * @param node Node instance on which to set index.
-	 * @param index Index of node's "current" child.
-	 * @return true if index has changed, else false.
-	 */
-	public static boolean setCurrentChildIndex(Node node, int index) {
-		boolean indexChanged = false;
-		if (node != null) {
-			int currentIndex = getCurrentChildIndex(node);
-			if (currentIndex != index) {
-				node.setUserData(
-						KEY_CURRENT_CHILD_INDEX,
-						new Integer(index),
-						null);
-				indexChanged = true;
-			}
-		}
-		return indexChanged;
-	}
-
-	/**
-	 * Gets the index of the Node instance's "current" child from user data on
-	 * the Node instance.
-	 * 
-	 * @param node Node instance from which to get index.
-	 * @return Index of node's "current" child. A value of -1 indicates
-	 * inability to get index from node.
-	 */
-	public static int getCurrentChildIndex(Node node) {
-		int index = -1;
-		if (node != null) {
-			Object obj = node.getUserData(KEY_CURRENT_CHILD_INDEX);
-			if (obj instanceof Integer) {
-				index = ((Integer)obj).intValue();
-			}
-		}
-		return index;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/AbstractLabelAndHelpOperation.java b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/AbstractLabelAndHelpOperation.java
deleted file mode 100644
index d9f2113..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/AbstractLabelAndHelpOperation.java
+++ /dev/null
@@ -1,268 +0,0 @@
-/**
- * Copyright (c) 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle Corporation - initial API and implementation
- */
-package org.eclipse.jst.jsf.apache.trinidad.tagsupport.converter.operations;
-
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.jst.jsf.apache.trinidad.tagsupport.ITrinidadConstants;
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.jsf.core.internal.tld.TagIdentifierFactory;
-import org.eclipse.jst.pagedesigner.converter.ConvertPosition;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.Text;
-
-/**
- * Abstract ITransformOperation implementation for tags which may be preceded by
- * a label and may have a "help" facet.
- * 
- * <br><b>Note:</b> requires ITransformOperation.setTagConverterContext(...) to
- * have been called to provide a valid ITagConverterContext instance prior to
- * a call to the transform(...) method.
- * 
- * @author Ian Trimble - Oracle
- */
-public abstract class AbstractLabelAndHelpOperation extends AbstractTrinidadTransformOperation {
-
-	private static final String STYLECLASS_OUTERELEMENT = "af_inputText p_AFRequired"; //$NON-NLS-1$
-	private static final String STYLECLASS_LABELTD = "af_inputText_label"; //$NON-NLS-1$
-	private static final String STYLECLASS_REQUIREDSPAN = "AFRequiredIconStyle"; //$NON-NLS-1$
-	private static final String STYLECLASS_CONTROLTD = "AFContentCell"; //$NON-NLS-1$
-	protected static final String STYLECLASS_CONTROLELEMENT = "af_inputText_content"; //$NON-NLS-1$
-	private static final String STYLECLASS_HELPTD = "AFComponentMessageCell"; //$NON-NLS-1$
-	private static final String STYLECLASS_HELPSPAN = "OraInlineInfoText"; //$NON-NLS-1$
-	
-	/**
-	 * Subclasses must implement this method to append the desired DOM structure
-	 * that represents the HTML control(s) to parentElement.
-	 * 
-	 * @param srcElement Source Element representing source document tag.
-	 * @param parentElement Parent Element to which structure is appended.
-	 */
-	protected abstract void appendControl(Element srcElement, Element parentElement);
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.operations.AbstractTransformOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	@Override
-	public Element transform(Element srcElement, Element curElement) {
-		Element outerElement;
-
-		//create outer Element
-		String simple = srcElement.getAttribute("simple"); //$NON-NLS-1$
-		if (Boolean.valueOf(simple)) {
-			outerElement = createElement("span"); //$NON-NLS-1$
-		} else {
-			outerElement = createElement("table"); //$NON-NLS-1$
-			//append table-specific attributes
-			appendAttribute(outerElement, "cellpadding", "0"); //$NON-NLS-1$ //$NON-NLS-2$
-			appendAttribute(outerElement, "cellspacing", "0"); //$NON-NLS-1$ //$NON-NLS-2$
-			appendAttribute(outerElement, "border", "0"); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-
-		//append common attributes
-		appendAttribute(outerElement, "class", //$NON-NLS-1$
-				calculateStyleClass(STYLECLASS_OUTERELEMENT, srcElement, "styleClass")); //$NON-NLS-1$
-		String inlineStyle = calculateStyle(null, srcElement, "inlineStyle"); //$NON-NLS-1$
-		if (inlineStyle != null) {
-			appendAttribute(outerElement, "style", inlineStyle); //$NON-NLS-1$
-		}		
-
-		if (Boolean.valueOf(simple)) {
-			//continue building simple variant
-			appendControl(srcElement, outerElement);
-		} else {
-			//continue building non-simple variant
-			Element trElement = appendChildElement("tr", outerElement); //$NON-NLS-1$
-
-			if (isRequired(srcElement) || getLabel(srcElement) != null) {
-				//if either required or has label, build top-left table cell
-				Element tdElement = appendChildElement("td", trElement); //$NON-NLS-1$
-				appendAttribute(tdElement, "class", STYLECLASS_LABELTD); //$NON-NLS-1$
-				appendAttribute(tdElement, "valign", "top"); //$NON-NLS-1$ //$NON-NLS-2$
-				appendAttribute(tdElement, "nowrap", ""); //$NON-NLS-1$ //$NON-NLS-2$
-
-				if (isRequired(srcElement)) {
-					Element spanElement = appendChildElement("span", tdElement); //$NON-NLS-1$
-					appendAttribute(spanElement, "title", "Required"); //$NON-NLS-1$ //$NON-NLS-2$
-					appendAttribute(spanElement, "class", STYLECLASS_REQUIREDSPAN); //$NON-NLS-1$
-					appendChildText("* ", spanElement); //$NON-NLS-1$
-				}
-
-				if (getLabel(srcElement) != null) {
-					Element labelElement = appendChildElement("label", tdElement); //$NON-NLS-1$
-					appendChildText(getLabel(srcElement), labelElement);
-				}
-			}
-
-			//build content table cell
-			Element tdElement = appendChildElement("td", trElement); //$NON-NLS-1$
-			appendAttribute(tdElement, "class", STYLECLASS_CONTROLTD); //$NON-NLS-1$
-			appendAttribute(tdElement, "valign", "top"); //$NON-NLS-1$ //$NON-NLS-2$
-			appendAttribute(tdElement, "nowrap", ""); //$NON-NLS-1$ //$NON-NLS-2$
-			appendControl(srcElement, tdElement);
-
-			List<Node> helpFacetChildNodes = getHelpFacetChildNodes(srcElement);
-			if (helpFacetChildNodes.size() > 0) {
-				//build help table row
-				trElement = appendChildElement("tr", outerElement); //$NON-NLS-1$
-				if (isRequired(srcElement) || getLabel(srcElement) != null) {
-					tdElement = appendChildElement("td", trElement); //$NON-NLS-1$
-				}
-				tdElement = appendChildElement("td", trElement); //$NON-NLS-1$
-				appendAttribute(tdElement, "class", STYLECLASS_HELPTD); //$NON-NLS-1$
-				Element spanElement = appendChildElement("span", tdElement); //$NON-NLS-1$
-				appendAttribute(spanElement, "class", //$NON-NLS-1$
-						calculateStyle(STYLECLASS_HELPSPAN, srcElement, "styleClass")); //$NON-NLS-1$
-				if (inlineStyle != null) {
-					appendAttribute(spanElement, "style", inlineStyle); //$NON-NLS-1$
-				}
-				Iterator<Node> itHelpFacetChildNodes = helpFacetChildNodes.iterator();
-				int curPos = 0;
-				while (itHelpFacetChildNodes.hasNext()) {
-					Node curNode = itHelpFacetChildNodes.next();
-					if (curNode instanceof Text) {
-						if (curNode.getNodeValue() != null && curNode.getNodeValue().length() > 0) {
-							tagConverterContext.addChild(
-									curNode,
-									new ConvertPosition(spanElement, curPos));
-						}
-					} else {
-						tagConverterContext.addChild(
-								curNode,
-								new ConvertPosition(spanElement, curPos));
-					}
-					curPos++;
-				}
-			}
-		}
-
-		return outerElement;
-	}
-
-	protected String calculateStyle(
-			String baseStyle, Element srcElement, String styleAttributeName) {
-		String style = baseStyle;
-		if (srcElement != null && styleAttributeName != null) {
-			String srcElementStyle = srcElement.getAttribute(styleAttributeName);
-			if (srcElementStyle != null && srcElementStyle.length() > 0) {
-				if (style != null) {
-					if (!style.endsWith(";")) { //$NON-NLS-1$
-						style += ";"; //$NON-NLS-1$
-					}
-					style += srcElementStyle;
-				} else {
-					style = srcElementStyle;
-				}
-			}
-		}
-		return style;
-	}
-
-	protected String calculateStyleClass(
-			String baseStyleClass, Element srcElement, String styleClassAttributeName) {
-		String styleClass = baseStyleClass;
-		if (srcElement != null && styleClassAttributeName != null) {
-			String srcElementStyleClass = srcElement.getAttribute(styleClassAttributeName);
-			if (srcElementStyleClass != null && srcElementStyleClass.length() > 0) {
-				if (styleClass != null) {
-					if (!styleClass.endsWith(",")) { //$NON-NLS-1$
-						styleClass += ","; //$NON-NLS-1$
-					}
-					styleClass += srcElementStyleClass;
-				} else {
-					styleClass = srcElementStyleClass;
-				}
-			}
-		}
-		return styleClass;
-	}
-
-	protected boolean isRequired(Element srcElement) {
-		boolean required = false;
-		if (!isChildOfPanelFormLayout(srcElement)) {
-			if (srcElement != null) {
-				String requiredVal = srcElement.getAttribute("required"); //$NON-NLS-1$
-				String showRequiredVal = srcElement.getAttribute("showRequired"); //$NON-NLS-1$
-				//if either are true, for the purposes of tag conversion, consider required to be true
-				required =
-					Boolean.parseBoolean(requiredVal) ||
-					Boolean.parseBoolean(showRequiredVal);
-			}
-		}
-		return required;
-	}
-
-	protected String getLabel(Element srcElement) {
-		String label = null;
-		if (!isChildOfPanelFormLayout(srcElement)) {
-			if (srcElement != null) {
-				String labelAndAccessKeyVal = srcElement.getAttribute("labelAndAccessKey"); //$NON-NLS-1$
-				if (labelAndAccessKeyVal != null && labelAndAccessKeyVal.length() > 0) {
-					label = labelAndAccessKeyVal;
-				} else {
-					String labelVal = srcElement.getAttribute("label"); //$NON-NLS-1$
-					if (labelVal != null && labelVal.length() > 0) {
-						label = labelVal;
-					}
-				}
-			}
-		}
-		return label;
-	}
-
-	protected List<Node> getHelpFacetChildNodes(Element srcElement) {
-		@SuppressWarnings("unchecked")
-		List<Node> children = Collections.EMPTY_LIST;
-		Element helpFacet = getChildFacetByName(srcElement, "help"); //$NON-NLS-1$
-		if (helpFacet != null) {
-			children = getCopyChildrenNodes(helpFacet);
-		}
-		return children;
-	}
-
-	protected int getColumns(Element srcElement) {
-		int columns = 30;
-		if (srcElement != null) {
-			String columnsValue = srcElement.getAttribute("columns"); //$NON-NLS-1$
-			if (columnsValue != null && columnsValue.length() > 0) {
-				try {
-					columns = Integer.parseInt(columnsValue);
-				} catch(NumberFormatException nfe) {
-					//ignore; default value will be returned
-				}
-			}
-		}
-		return columns;
-	}
-
-	protected boolean isChildOfPanelFormLayout(Element srcElement) {
-		boolean isChild = false;
-		if (srcElement != null) {
-			Node parent = srcElement.getParentNode();
-			if (parent instanceof Element) {
-				TagIdentifier tagID = TagIdentifierFactory.createDocumentTagWrapper((Element)parent);
-				if (ITrinidadConstants.TAG_IDENTIFIER_PANELFORMLAYOUT.isSameTagType(tagID)) {
-					isChild = true;
-				} else if (ITrinidadConstants.TAG_IDENTIFIER_GROUP.isSameTagType(tagID)) {
-					isChild = isChildOfPanelFormLayout((Element)parent);
-				} else if (IJSFConstants.TAG_IDENTIFIER_FACET.isSameTagType(tagID)) {
-					isChild = isChildOfPanelFormLayout((Element)parent);
-				}
-			}
-		}
-		return isChild;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/AbstractTrinidadTransformOperation.java b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/AbstractTrinidadTransformOperation.java
deleted file mode 100644
index ca8e9ea..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/AbstractTrinidadTransformOperation.java
+++ /dev/null
@@ -1,150 +0,0 @@
-/**
- * Copyright (c) 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle Corporation - initial API and implementation
- */
-package org.eclipse.jst.jsf.apache.trinidad.tagsupport.converter.operations;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.jst.pagedesigner.dtmanager.converter.ITransformOperation;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.AbstractTransformOperation;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.TransformOperationFactory;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-/**
- * Extends AbstractTransformOperation to supply extra convenience methods.
- * 
- * @author Ian Trimble - Oracle
- */
-public abstract class AbstractTrinidadTransformOperation extends AbstractTransformOperation {
-
-	/**
-	 * Appends the specified attribute with the specified value to the specified
-	 * Element instance.
-	 * 
-	 * @param element Element instance to append attribute to.
-	 * @param attributeName Name of attribute to be appended.
-	 * @param attributeValue Value of attribute to be appended.
-	 */
-	protected void appendAttribute(
-			Element element, String attributeName, String attributeValue) {
-		ITransformOperation operation =
-			TransformOperationFactory.getInstance().getTransformOperation(
-					TransformOperationFactory.OP_CreateAttributeOperation,
-					new String[]{attributeName, attributeValue});
-		operation.transform(null, element);
-	}
-
-	/**
-	 * Gets a child Element of the specified parent Element that has the node
-	 * name "facet" and the specified value of the "name" attribute.
-	 * 
-	 * @param srcElement Parent Element instance.
-	 * @param facetName Name of the facet Element for which to search.
-	 * @return Child Element that is a facet with the specified name.
-	 */
-	protected Element getChildFacetByName(Element srcElement, String facetName) {
-		Element element = null;
-		@SuppressWarnings("unchecked")
-		List facets = getChildElements(srcElement, "facet"); //$NON-NLS-1$
-		@SuppressWarnings("unchecked")
-		Iterator itFacets = facets.iterator();
-		while (itFacets.hasNext()) {
-			Element facet = (Element)itFacets.next();
-			String facetAttrName = facet.getAttribute("name"); //$NON-NLS-1$
-			if (facetAttrName != null && facetAttrName.equals(facetName)) {
-				element = facet;
-				break;
-			}
-		}
-		return element;
-	}
-
-	/**
-	 * Gets a list of child Elements of the specified parent Element, skipping
-	 * any "facet" Elements.
-	 * 
-	 * @param srcElement Parent Element instance.
-	 * @return List of child Elements of the specified parent Element that does
-	 * not include any child "facet" Elements.
-	 */
-	protected List<Element> getChildElementsSkipFacets(Element srcElement) {
-		List<Element> childElementsList = new ArrayList<Element>();
-		NodeList childNodes = srcElement.getChildNodes();
-		for (int i = 0; i < childNodes.getLength(); i++) {
-			Node childNode = childNodes.item(i);
-			if (childNode.getNodeType() == Node.ELEMENT_NODE) {
-				if (!childNode.getLocalName().equals("facet")) { //$NON-NLS-1$
-					childElementsList.add((Element)childNode);
-				}
-			}
-		}
-		return childElementsList;
-	}
-
-	/**
-	 * Returns a List of child Node instances that will be added by the
-	 * "CopyChildrenOperation" ITransformOperation. This can be useful in
-	 * determining if any Node instances will, in fact, be copied. 
-	 * 
-	 * @param srcElement Source Element instance to query for child Node
-	 * instances.
-	 * @return A List of child Node instances that will be added by the
-	 * "CopyChildrenOperation" ITransformOperation.
-	 */
-	protected List<Node> getCopyChildrenNodes(Element srcElement) {
-		List<Node> children = new ArrayList<Node>();
-		if (srcElement != null) {
-			NodeList childNodes = srcElement.getChildNodes();
-			for (int i = 0; i < childNodes.getLength(); i++) {
-				Node childNode = childNodes.item(i);
-				short childNodeType = childNode.getNodeType();
-				if (childNodeType == Node.ELEMENT_NODE ||
-						childNodeType == Node.TEXT_NODE ||
-						childNodeType == Node.CDATA_SECTION_NODE) {
-					children.add(childNode);
-				}
-			}
-		}
-		return children;
-	}
-
-	/**
-	 * Calculates required style class value, based on a specified base style
-	 * class and the value of the source Element instance's "styleClass"
-	 * attribute.
-	 * 
-	 * @param baseClass Specified base style class (may be null).
-	 * @param srcElement Source Element instance (may be null).
-	 * @return Required style class value, to be set as "class" attribute (may
-	 * be null).
-	 */
-	protected String calculateStyleClass(String baseClass, Element srcElement) {
-		String styleClass = null;
-		if (baseClass != null) {
-			styleClass = baseClass;
-		}
-		if (srcElement != null) {
-			String srcStyleClass = srcElement.getAttribute("styleClass"); //$NON-NLS-1$
-			if (srcStyleClass != null && srcStyleClass.length() > 0) {
-				if (styleClass.length() > 0) {
-					styleClass += "," + srcStyleClass; //$NON-NLS-1$
-				} else {
-					styleClass = srcStyleClass;
-				}
-			}
-		}
-		return styleClass;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/BreadCrumbsOperation.java b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/BreadCrumbsOperation.java
deleted file mode 100644
index 6d91e14..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/BreadCrumbsOperation.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/**
- * Copyright (c) 2009 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle Corporation - initial API and implementation
- */
-package org.eclipse.jst.jsf.apache.trinidad.tagsupport.converter.operations;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jst.jsf.apache.trinidad.tagsupport.ITrinidadConstants;
-import org.eclipse.jst.jsf.apache.trinidad.tagsupport.Messages;
-import org.eclipse.jst.pagedesigner.converter.ConvertPosition;
-import org.w3c.dom.Element;
-import org.w3c.dom.NodeList;
-
-/**
- * ITransformOperation implementation specifically for the "breadCrumbs" JSF
- * Element.
- * 
- * <br><b>Note:</b> requires ITransformOperation.setTagConverterContext(...) to
- * have been called to provide a valid ITagConverterContext instance prior to
- * a call to the transform(...) method.
- * 
- * @author Ian Trimble - Oracle
- */
-public class BreadCrumbsOperation extends AbstractTrinidadTransformOperation {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.operations.AbstractTransformOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	@Override
-	public Element transform(Element srcElement, Element curElement) {
-		Element outerSpan = createElement("span"); //$NON-NLS-1$
-		String styleClass = calculateStyleClass("af_breadCrumbs", srcElement); //$NON-NLS-1$
-		if (styleClass != null) {
-			appendAttribute(outerSpan, "class", styleClass); //$NON-NLS-1$
-		}
-		String style = srcElement.getAttribute("inlineStyle"); //$NON-NLS-1$
-		if (style != null) {
-			appendAttribute(outerSpan, "style", style); //$NON-NLS-1$
-		}
-		List<Element> childCmdNavItems = getChildCmdNavItems(srcElement);
-		int currentChildIndex = 0;
-		int numChildren = childCmdNavItems.size();
-		if (numChildren > 0) {
-			for (Element childCmdNavItem: childCmdNavItems) {
-				Element nobr;
-				if (isVertical(srcElement)) {
-					Element div = appendChildElement("div", outerSpan); //$NON-NLS-1$
-					nobr = appendChildElement("nobr", div); //$NON-NLS-1$
-					appendChildText(getIndentationString(currentChildIndex), nobr);
-				} else {
-					nobr = appendChildElement("nobr", outerSpan); //$NON-NLS-1$
-				}
-				Element innerSpan = appendChildElement("span", nobr); //$NON-NLS-1$
-				tagConverterContext.addChild(
-						childCmdNavItem, new ConvertPosition(innerSpan, 0));
-				if (currentChildIndex < numChildren - 1) {
-					//appendChildText("&nbsp;&nbsp;&gt;&nbsp;&nbsp;", nobr); //$NON-NLS-1$
-					appendChildText("\u00A0 \u003E \u00A0", nobr); //$NON-NLS-1$
-				}
-				currentChildIndex++;
-			}
-		} else {
-			appendAttribute(outerSpan, "style", ITrinidadConstants.STYLE_EMPTYELEMENT); //$NON-NLS-1$
-			appendChildText(Messages.BreadCrumbsOperation_EmptyBreadCrumbsTag, outerSpan);
-		}
-		return outerSpan;
-	}
-
-	private List<Element> getChildCmdNavItems(Element srcElement) {
-		List<Element> childCmdNavItems = new ArrayList<Element>();
-		NodeList childElements = srcElement.getElementsByTagNameNS(ITrinidadConstants.URI_CORE, "commandNavigationItem"); //$NON-NLS-1$$
-		if (childElements != null && childElements.getLength() > 0) {
-			for (int i = 0, len = childElements.getLength(); i < len; i++) {
-				childCmdNavItems.add((Element)childElements.item(i));
-			}
-		} else {
-			Element nodeStampFacet = getChildFacetByName(srcElement, "nodeStamp"); //$NON-NLS-1$
-			if (nodeStampFacet != null) {
-				childElements = nodeStampFacet.getElementsByTagNameNS(ITrinidadConstants.URI_CORE, "commandNavigationItem"); //$NON-NLS-1$
-				if (childElements != null && childElements.getLength() > 0) {
-					for (int i = 0, len = childElements.getLength(); i < len; i++) {
-						childCmdNavItems.add((Element)childElements.item(i));
-					}
-				}
-			}
-		}
-		return childCmdNavItems;
-	}
-
-	private boolean isVertical(Element srcElement) {
-		String orientationAttr = srcElement.getAttribute(ITrinidadConstants.ATTR_ORIENTATION);
-		return "vertical".equalsIgnoreCase(orientationAttr); //$NON-NLS-1$
-	}
-
-	private String getIndentationString(int indentationLevel) {
-		StringBuffer indentation = new StringBuffer(""); //$NON-NLS-1$
-		for (int i = 0; i < indentationLevel; i++) {
-			//indentation.append("&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"); //$NON-NLS-1$
-			indentation.append(" \u00A0 \u00A0 \u00A0 \u00A0 \u00A0"); //$NON-NLS-1$
-		}
-		return indentation.toString();
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/CommandNavigationItemOperation.java b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/CommandNavigationItemOperation.java
deleted file mode 100644
index 7dc4030..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/CommandNavigationItemOperation.java
+++ /dev/null
@@ -1,197 +0,0 @@
-/**
- * Copyright (c) 2009 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle Corporation - initial API and implementation
- */
-package org.eclipse.jst.jsf.apache.trinidad.tagsupport.converter.operations;
-
-import org.eclipse.jst.jsf.apache.trinidad.tagsupport.ITrinidadConstants;
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.jsf.core.internal.tld.TagIdentifierFactory;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * ITransformOperation implementation specifically for the
- * "commandNavigationItem" JSF Element.
- * 
- * <br><b>Note:</b> requires ITransformOperation.setTagConverterContext(...) to
- * have been called to provide a valid ITagConverterContext instance prior to
- * a call to the transform(...) method.
- * 
- * @author Ian Trimble - Oracle
- */
-public class CommandNavigationItemOperation extends AbstractTrinidadTransformOperation {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.operations.AbstractTransformOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	@Override
-	public Element transform(Element srcElement, Element curElement) {
-		Element topElement = null;
-		if (isDescendentOf(ITrinidadConstants.TAG_IDENTIFIER_BREADCRUMBS, srcElement)) {
-			topElement = transformForBreadCrumbs(srcElement);
-		} else if (isDescendentOf(ITrinidadConstants.TAG_IDENTIFIER_NAVIGATIONPANE, srcElement)) {
-			Element navPane = getAncestor(ITrinidadConstants.TAG_IDENTIFIER_NAVIGATIONPANE, srcElement);
-			if (navPane != null) {
-				String navPaneHint = navPane.getAttribute("hint"); //$NON-NLS-1$
-				if ("choice".equalsIgnoreCase(navPaneHint)) { //$NON-NLS-1$
-					topElement = transformForNavigationPane_Choice(srcElement);
-				} else {
-					topElement = doDefaultTransform(srcElement);
-				}
-			}
-		} else {
-			topElement = doDefaultTransform(srcElement);
-		}
-		return topElement;
-	}
-
-	private Element transformForBreadCrumbs(Element srcElement) {
-		Element anchor = createElement("a"); //$NON-NLS-1$
-		if (!isDisabledOrLastCmdNavItem(srcElement)) {
-			appendAttribute(anchor, "href", "#"); //$NON-NLS-1$ //$NON-NLS-2$
-			appendAttribute(anchor, "class", "af_breadCrumbs_step"); //$NON-NLS-1$ //$NON-NLS-2$
-		} else {
-			appendAttribute(anchor, "class", "af_breadCrumbs_selected-step"); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-		appendChildText(getText(srcElement), anchor);
-		return anchor;
-	}
-
-	private Element transformForNavigationPane_Choice(Element srcElement) {
-		Element option = createElement("option"); //$NON-NLS-1$
-		if (isSelected(srcElement)) {
-			appendAttribute(option, "selected", "selected"); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-		appendChildText(getText(srcElement), option);
-		return option;
-	}
-
-	private Element doDefaultTransform(Element srcElement) {
-		Element anchor = createElement("a"); //$NON-NLS-1$
-		if (!isDisabled(srcElement)) {
-			appendAttribute(anchor, "href", "#"); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-		appendChildText(getText(srcElement), anchor);
-		return anchor;
-	}
-
-	private boolean isDescendentOf(TagIdentifier tagIdentifier, Element srcElement) {
-		boolean isDescendent = false;
-		if (tagIdentifier != null && srcElement != null) {
-			Node parentNode = srcElement.getParentNode();
-			if (parentNode instanceof Element) {
-				if (tagIdentifier.isSameTagType(
-						TagIdentifierFactory.createDocumentTagWrapper((Element)parentNode))) {
-					isDescendent = true;
-				} else if (IJSFConstants.TAG_IDENTIFIER_FACET.isSameTagType(
-						TagIdentifierFactory.createDocumentTagWrapper((Element)parentNode))) {
-					parentNode = parentNode.getParentNode();
-					if (parentNode instanceof Element) {
-						if (tagIdentifier.isSameTagType(
-								TagIdentifierFactory.createDocumentTagWrapper((Element)parentNode))) {
-							isDescendent = true;
-						}
-					}
-				}
-			}
-		}
-		return isDescendent;
-	}
-
-	private Element getAncestor(TagIdentifier tagIdentifier, Element srcElement) {
-		Element ancestor = null;
-		if (tagIdentifier != null && srcElement != null) {
-			Node parentNode = srcElement.getParentNode();
-			if (parentNode instanceof Element) {
-				if (tagIdentifier.isSameTagType(
-						TagIdentifierFactory.createDocumentTagWrapper((Element)parentNode))) {
-					ancestor = (Element)parentNode;
-				} else if (IJSFConstants.TAG_IDENTIFIER_FACET.isSameTagType(
-						TagIdentifierFactory.createDocumentTagWrapper((Element)parentNode))) {
-					parentNode = parentNode.getParentNode();
-					if (parentNode instanceof Element) {
-						if (tagIdentifier.isSameTagType(
-								TagIdentifierFactory.createDocumentTagWrapper((Element)parentNode))) {
-							ancestor = (Element)parentNode;
-						}
-					}
-				}
-			}
-		}
-		return ancestor;
-	}
-
-	/**
-	 * Gets display text from a commandNavigationItem Element.
-	 * 
-	 * @param srcElement A commmandNavigationItem Element instance.
-	 * @return Display text from a commandNavigationItem Element.
-	 */
-	public static String getText(Element srcElement) {
-		String text = "commandNavigationItem"; //$NON-NLS-1$
-		if (srcElement != null) {
-			String newText = srcElement.getAttribute(ITrinidadConstants.ATTR_TEXTANDACCESSKEY);
-			if (newText != null && newText.length() > 0) {
-				text = newText;
-			} else {
-				newText = srcElement.getAttribute(ITrinidadConstants.ATTR_TEXT);
-				if (newText != null && newText.length() > 0) {
-					text = newText;
-				} else {
-					newText = srcElement.getAttribute(ITrinidadConstants.ATTR_ACTION);
-					if (newText != null && newText.length() > 0) {
-						text = newText;
-					} else {
-						newText = srcElement.getAttribute(ITrinidadConstants.ATTR_DESTINATION);
-						if (newText != null && newText.length() > 0) {
-							text = newText;
-						}
-					}
-				}
-			}
-		}
-		return text;
-	}
-
-	public static boolean isDisabled(Element srcElement) {
-		String disabledAttr = srcElement.getAttribute(ITrinidadConstants.ATTR_DISABLED);
-		return Boolean.TRUE.toString().equalsIgnoreCase(disabledAttr);
-	}
-
-	private boolean isDisabledOrLastCmdNavItem(Element srcElement) {
-		boolean ret = false;
-		String disabledAttr = srcElement.getAttribute(ITrinidadConstants.ATTR_DISABLED);
-		if (Boolean.TRUE.toString().equalsIgnoreCase(disabledAttr)) {
-			ret = true;
-		} else {
-			Node nextSibling = srcElement;
-			while (nextSibling != null) {
-				nextSibling = nextSibling.getNextSibling();
-				if (nextSibling == null) {
-					ret = true;
-				} else {
-					if (nextSibling instanceof Element) {
-						if (TagIdentifierFactory.createDocumentTagWrapper((Element)nextSibling).isSameTagType(ITrinidadConstants.TAG_IDENTIFIER_COMMANDNAVIGATIONITEM)) {
-							break;
-						}
-					}
-				}
-			}
-		}
-		return ret;
-	}
-
-	public static boolean isSelected(Element srcElement) {
-		String selectedAttr = srcElement.getAttribute(ITrinidadConstants.ATTR_SELECTED);
-		return Boolean.TRUE.toString().equalsIgnoreCase(selectedAttr);
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/CreateClassAttributeOperation.java b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/CreateClassAttributeOperation.java
deleted file mode 100644
index 66f6baa..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/CreateClassAttributeOperation.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/**
- * Copyright (c) 2009 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle Corporation - initial API and implementation
- */
-package org.eclipse.jst.jsf.apache.trinidad.tagsupport.converter.operations;
-
-import org.w3c.dom.Element;
-
-/**
- * ITransformOperation implementation to handle merging of an Element's optional
- * default style class with a specified "styleClass" as the current Element's
- * "class" attribute.
- * 
- * @author Ian Trimble - Oracle
- */
-public class CreateClassAttributeOperation extends AbstractTrinidadTransformOperation {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.operations.AbstractTransformOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	@Override
-	public Element transform(Element srcElement, Element curElement) {
-		String classValue = null;
-		if (getParameters().length > 0) {
-			classValue = getParameters()[0];
-		}
-		String styleClass = srcElement.getAttribute("styleClass"); //$NON-NLS-1$
-		if (styleClass != null && styleClass.length() > 0) {
-			if (classValue == null) {
-				classValue = styleClass;
-			} else {
-				classValue = styleClass + " " + classValue; //$NON-NLS-1$
-			}
-		}
-		if (classValue != null && curElement != null) {
-			curElement.setAttribute("class", classValue); //$NON-NLS-1$
-		}
-		return curElement;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/CreateStyleAttributeOperation.java b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/CreateStyleAttributeOperation.java
deleted file mode 100644
index b0baffa..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/CreateStyleAttributeOperation.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/**
- * Copyright (c) 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle Corporation - initial API and implementation
- */
-package org.eclipse.jst.jsf.apache.trinidad.tagsupport.converter.operations;
-
-import org.w3c.dom.Element;
-
-/**
- * ITransformOperation implementation to handle merging of an Element's optional
- * default style with a specified "inlineStyle" as the current Element's "style"
- * attribute.
- * 
- * @author Ian Trimble - Oracle
- */
-public class CreateStyleAttributeOperation extends AbstractTrinidadTransformOperation {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.operations.AbstractTransformOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	@Override
-	public Element transform(Element srcElement, Element curElement) {
-		String styleValue = null;
-		if (getParameters().length > 0) {
-			styleValue = getParameters()[0];
-		}
-		String inlineStyle = srcElement.getAttribute("inlineStyle"); //$NON-NLS-1$
-		if (inlineStyle != null && inlineStyle.length() > 0) {
-			if (styleValue == null) {
-				styleValue = inlineStyle;
-			} else {
-				if (styleValue.length() > 0 && !styleValue.endsWith(";")) { //$NON-NLS-1$
-					styleValue += ";"; //$NON-NLS-1$
-				}
-				styleValue += inlineStyle;
-			}
-		}
-		if (styleValue != null && curElement != null) {
-			curElement.setAttribute("style", styleValue); //$NON-NLS-1$
-		}
-		return curElement;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/InputFileOperation.java b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/InputFileOperation.java
deleted file mode 100644
index f3e2e97..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/InputFileOperation.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/**
- * Copyright (c) 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle Corporation - initial API and implementation
- */
-package org.eclipse.jst.jsf.apache.trinidad.tagsupport.converter.operations;
-
-import org.w3c.dom.Element;
-
-/**
- * ITransformOperation implementation specifically for the "inputFile" JSF
- * Element.
- * 
- * <br><b>Note:</b> requires ITransformOperation.setTagConverterContext(...) to
- * have been called to provide a valid ITagConverterContext instance prior to
- * a call to the transform(...) method.
- * 
- * @author Ian Trimble - Oracle
- */
-public class InputFileOperation extends AbstractLabelAndHelpOperation {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.apache.trinidad.tagsupport.converter.operations.AbstractLabelAndHelpOperation#appendControl(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	@Override
-	protected void appendControl(Element srcElement, Element parentElement) {
-		Element controlElement = appendChildElement("input", parentElement); //$NON-NLS-1$
-		appendAttribute(controlElement, "size", //$NON-NLS-1$
-				String.valueOf(getColumns(srcElement)));
-		appendAttribute(controlElement, "type", "file"); //$NON-NLS-1$ //$NON-NLS-2$
-		String value = srcElement.getAttribute("value"); //$NON-NLS-1$
-		if (value != null) {
-			appendAttribute(controlElement, "value", value); //$NON-NLS-1$
-		}
-		//append common attributes
-		appendAttribute(controlElement, "class", STYLECLASS_CONTROLELEMENT); //$NON-NLS-1$
-		String contentStyle = calculateStyle(null, srcElement, "contentStyle"); //$NON-NLS-1$
-		if (contentStyle != null) {
-			appendAttribute(controlElement, "style", contentStyle); //$NON-NLS-1$
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/InputTextOperation.java b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/InputTextOperation.java
deleted file mode 100644
index 47f7ab4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/InputTextOperation.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/**
- * Copyright (c) 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle Corporation - initial API and implementation
- */
-package org.eclipse.jst.jsf.apache.trinidad.tagsupport.converter.operations;
-
-import org.w3c.dom.Element;
-
-/**
- * ITransformOperation implementation specifically for the "inputText" JSF
- * Element.
- * 
- * <br><b>Note:</b> requires ITransformOperation.setTagConverterContext(...) to
- * have been called to provide a valid ITagConverterContext instance prior to
- * a call to the transform(...) method.
- * 
- * @author Ian Trimble - Oracle
- */
-public class InputTextOperation extends AbstractLabelAndHelpOperation {
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.apache.trinidad.tagsupport.converter.operations.AbstractLabelAndHelpOperation#appendControl(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	@Override
-	protected void appendControl(Element srcElement, Element parentElement) {
-		int rows = getRows(srcElement);
-		Element controlElement;
-		if (rows < 2) {
-			controlElement = appendChildElement("input", parentElement); //$NON-NLS-1$
-			appendAttribute(controlElement, "size", //$NON-NLS-1$
-					String.valueOf(getColumns(srcElement)));
-			appendAttribute(controlElement, "type", getType(srcElement)); //$NON-NLS-1$
-			String value = srcElement.getAttribute("value"); //$NON-NLS-1$
-			if (value != null) {
-				appendAttribute(controlElement, "value", value); //$NON-NLS-1$
-			}
-		} else {
-			controlElement = appendChildElement("textarea", parentElement); //$NON-NLS-1$
-			appendAttribute(controlElement, "cols", //$NON-NLS-1$
-					String.valueOf(getColumns(srcElement)));
-			appendAttribute(controlElement, "rows", //$NON-NLS-1$
-					String.valueOf(getRows(srcElement)));
-			appendAttribute(controlElement, "wrap", getWrap(srcElement)); //$NON-NLS-1$
-			String value = srcElement.getAttribute("value"); //$NON-NLS-1$
-			if (value != null) {
-				appendChildText(value, controlElement);
-			}
-		}
-		//append common attributes
-		appendAttribute(controlElement, "class", STYLECLASS_CONTROLELEMENT); //$NON-NLS-1$
-		String contentStyle = calculateStyle(null, srcElement, "contentStyle"); //$NON-NLS-1$
-		if (contentStyle != null) {
-			appendAttribute(controlElement, "style", contentStyle); //$NON-NLS-1$
-		}
-	}
-
-	private int getRows(Element srcElement) {
-		int rows = 1;
-		if (srcElement != null) {
-			String rowsValue = srcElement.getAttribute("rows"); //$NON-NLS-1$
-			if (rowsValue != null && rowsValue.length() > 0) {
-				try {
-					rows = Integer.parseInt(rowsValue);
-				} catch(NumberFormatException nfe) {
-					//ignore; default value will be returned
-				}
-			}
-		}
-		return rows;
-	}
-
-	private String getWrap(Element srcElement) {
-		String wrap = "soft"; //$NON-NLS-1$
-		if (srcElement != null) {
-			String wrapValue = srcElement.getAttribute("wrap"); //$NON-NLS-1$
-			if (wrapValue != null && wrapValue.length() > 0) {
-				wrap = wrapValue;
-			}
-		}
-		return wrap;
-	}
-
-	private String getType(Element srcElement) {
-		String type = "text"; //$NON-NLS-1$
-		if (srcElement != null) {
-			String secret = srcElement.getAttribute("secret"); //$NON-NLS-1$
-			if (Boolean.valueOf(secret)) {
-				type = "password"; //$NON-NLS-1$
-			}
-		}
-		return type;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/InputTextWithIconOperation.java b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/InputTextWithIconOperation.java
deleted file mode 100644
index d425db0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/InputTextWithIconOperation.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/**
- * Copyright (c) 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle Corporation - initial API and implementation
- */
-package org.eclipse.jst.jsf.apache.trinidad.tagsupport.converter.operations;
-
-import org.w3c.dom.Element;
-
-/**
- * ITransformOperation implementation specifically for any "input..." JSF
- * Elements that are basically comprised of an inputText followed by an icon.
- * 
- * <br><b>Note:</b> requires ITransformOperation.setTagConverterContext(...) to
- * have been called to provide a valid ITagConverterContext instance prior to
- * a call to the transform(...) method.
- * 
- * @author Ian Trimble - Oracle
- */
-public class InputTextWithIconOperation extends AbstractLabelAndHelpOperation {
-
-	private String imageFilename;
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.apache.trinidad.tagsupport.converter.operations.AbstractLabelAndHelpOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	@Override
-	public Element transform(Element srcElement, Element curElement) {
-		if (getParameters().length < 1) {
-			getLog().error("Warning.TransformOperationFactory.TooFewParameters", getTransformOperationID()); //$NON-NLS-1$
-			return null;
-		} else {
-			imageFilename = getParameters()[0];
-		}
-		return super.transform(srcElement, curElement);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.apache.trinidad.tagsupport.converter.operations.AbstractLabelAndHelpOperation#appendControl(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	@Override
-	protected void appendControl(Element srcElement, Element parentElement) {
-		//append input
-		Element inputElement = appendChildElement("input", parentElement); //$NON-NLS-1$
-		appendAttribute(inputElement, "size", //$NON-NLS-1$
-				String.valueOf(getColumns(srcElement)));
-		appendAttribute(inputElement, "type", "text"); //$NON-NLS-1$ //$NON-NLS-2$
-		String value = srcElement.getAttribute("value"); //$NON-NLS-1$
-		if (value != null) {
-			appendAttribute(inputElement, "value", value); //$NON-NLS-1$
-		}
-		//append common attributes
-		appendAttribute(inputElement, "class", STYLECLASS_CONTROLELEMENT); //$NON-NLS-1$
-		String contentStyle = calculateStyle(null, srcElement, "contentStyle"); //$NON-NLS-1$
-		if (contentStyle != null) {
-			appendAttribute(inputElement, "style", contentStyle); //$NON-NLS-1$
-		}
-
-		//append anchor with child image
-		Element aElement = appendChildElement("a", parentElement); //$NON-NLS-1$
-		appendAttribute(aElement, "href", "#"); //$NON-NLS-1$ //$NON-NLS-2$
-		Element imgElement = appendChildElement("img", aElement); //$NON-NLS-1$
-		appendAttribute(imgElement, "align", "absmiddle"); //$NON-NLS-1$ //$NON-NLS-2$
-		appendAttribute(imgElement, "border", "0"); //$NON-NLS-1$ //$NON-NLS-2$
-		appendAttribute(imgElement, "src", imageFilename); //$NON-NLS-1$
-		appendAttribute(imgElement, "style", "margin-left:4px;"); //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/NavigationPaneOperation.java b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/NavigationPaneOperation.java
deleted file mode 100644
index 8a010ae..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/NavigationPaneOperation.java
+++ /dev/null
@@ -1,430 +0,0 @@
-/**
- * Copyright (c) 2009 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle Corporation - initial API and implementation
- */
-package org.eclipse.jst.jsf.apache.trinidad.tagsupport.converter.operations;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jst.jsf.apache.trinidad.tagsupport.ITrinidadConstants;
-import org.eclipse.jst.jsf.apache.trinidad.tagsupport.Messages;
-import org.eclipse.jst.pagedesigner.converter.ConvertPosition;
-import org.w3c.dom.Element;
-import org.w3c.dom.NodeList;
-
-/**
- * ITransformOperation implementation specifically for the "navigationPane"
- * JSF Element.
- * 
- * <br><b>Note:</b> requires ITransformOperation.setTagConverterContext(...) to
- * have been called to provide a valid ITagConverterContext instance prior to
- * a call to the transform(...) method.
- * 
- * @author Ian Trimble - Oracle
- */
-public class NavigationPaneOperation extends AbstractTrinidadTransformOperation {
-
-	private static final String STYLECLASS_OUTERDIV = "af_navigationPane"; //$NON-NLS-1$
-
-	private static final String STYLECLASS_BAR_OUTERDIV = "af_navigationPane_bar"; //$NON-NLS-1$
-	private static final String STYLECLASS_BAR_TABLE_INACTIVE_ENABLED = "af_navigationPane_bar-inactive-enabled"; //$NON-NLS-1$
-	private static final String STYLECLASS_BAR_TABLE_ACTIVE_ENABLED = "af_navigationPane_bar-active-enabled"; //$NON-NLS-1$
-	private static final String STYLECLASS_BAR_TABLE_INACTIVE_DISABLED = "af_navigationPane_bar-inactive-disabled"; //$NON-NLS-1$
-	private static final String STYLECLASS_BAR_TABLE_ACTIVE_DISABLED = "af_navigationPane_bar-active-disabled"; //$NON-NLS-1$
-	private static final String STYLECLASS_BAR_DIV_CONTENT = "af_navigationPane_bar-content"; //$NON-NLS-1$
-	private static final String STYLECLASS_BAR_DIV_SEPARATOR = "af_navigationPane_bar-separator"; //$NON-NLS-1$
-
-	private static final String STYLECLASS_BUTTONS_TABLE_INACTIVE_ENABLED = "af_navigationPane_buttons-inactive-enabled"; //$NON-NLS-1$
-	private static final String STYLECLASS_BUTTONS_TABLE_ACTIVE_ENABLED = "af_navigationPane_buttons-active-enabled"; //$NON-NLS-1$
-	private static final String STYLECLASS_BUTTONS_TABLE_INACTIVE_DISABLED = "af_navigationPane_buttons-inactive-disabled"; //$NON-NLS-1$
-	private static final String STYLECLASS_BUTTONS_TABLE_ACTIVE_DISABLED = "af_navigationPane_buttons-active-disabled"; //$NON-NLS-1$
-	private static final String STYLECLASS_BUTTONS_DIV_CONTENT = "af_navigationPane_buttons-content"; //$NON-NLS-1$
-	private static final String STYLECLASS_BUTTONS_DIV_SEPARATOR = "af_navigationPane_buttons-separator"; //$NON-NLS-1$
-
-	private static final String STYLECLASS_CHOICE_SELECT = "af_navigationPane_choice-options"; //$NON-NLS-1$
-	private static final String STYLECLASS_CHOICE_BUTTON = "af_navigationPane_choice-button"; //$NON-NLS-1$
-
-	private static final String STYLECLASS_LIST_TABLE_INACTIVE_ENABLED = "af_navigationPane_list-inactive-enabled"; //$NON-NLS-1$
-	private static final String STYLECLASS_LIST_TABLE_ACTIVE_ENABLED = "af_navigationPane_list-active-enabled"; //$NON-NLS-1$
-	private static final String STYLECLASS_LIST_TABLE_INACTIVE_DISABLED = "af_navigationPane_list-inactive-disabled"; //$NON-NLS-1$
-	private static final String STYLECLASS_LIST_TABLE_ACTIVE_DISABLED = "af_navigationPane_list-active-disabled"; //$NON-NLS-1$
-	private static final String STYLECLASS_LIST_TD_BULLET = "af_navigationPane_list-bullet"; //$NON-NLS-1$
-	private static final String STYLECLASS_LIST_DIV_CONTENT = "af_navigationPane_list-content"; //$NON-NLS-1$
-
-	private static final String STYLECLASS_TABS_TABLE_INACTIVE_ENABLED = "af_navigationPane_tabs-inactive"; //$NON-NLS-1$
-	private static final String STYLECLASS_TABS_TABLE_ACTIVE_ENABLED = "af_navigationPane_tabs-active"; //$NON-NLS-1$
-	private static final String STYLECLASS_TABS_TABLE_INACTIVE_DISABLED = "af_navigationPane_tabs-inactive p_AFDisabled"; //$NON-NLS-1$
-	private static final String STYLECLASS_TABS_TABLE_ACTIVE_DISABLED = "af_navigationPane_tabs-active p_AFDisabled"; //$NON-NLS-1$
-	private static final String STYLECLASS_TABS_TD_START = "af_navigationPane_tabs-start"; //$NON-NLS-1$
-	private static final String STYLECLASS_TABS_TD_START_JOIN = "af_navigationPane_tabs-start-join"; //$NON-NLS-1$
-	private static final String STYLECLASS_TABS_TD_START_JOINFROMACTIVE = "af_navigationPane_tabs-start-join-from-active"; //$NON-NLS-1$
-	private static final String STYLECLASS_TABS_TD_START_JOINFROMINACTIVE = "af_navigationPane_tabs-start-join-from-inactive"; //$NON-NLS-1$
-	private static final String STYLECLASS_TABS_TD_BOTTOM_START = "af_navigationPane_tabs-bottom-start"; //$NON-NLS-1$
-	private static final String STYLECLASS_TABS_TD_MID = "af_navigationPane_tabs-mid"; //$NON-NLS-1$
-	private static final String STYLECLASS_TABS_TD_BOTTOM_MID = "af_navigationPane_tabs-bottom-mid"; //$NON-NLS-1$
-	private static final String STYLECLASS_TABS_TD_END = "af_navigationPane_tabs-end"; //$NON-NLS-1$
-	private static final String STYLECLASS_TABS_TD_END_JOINTOINACTIVE = "af_navigationPane_tabs-end-join-to-inactive"; //$NON-NLS-1$
-	private static final String STYLECLASS_TABS_TD_BOTTOM_END = "af_navigationPane_tabs-bottom-end"; //$NON-NLS-1$
-	private static final String STYLECLASS_TABS_TD_BOTTOM_END_JOIN = "af_navigationPane_tabs-bottom-end-join"; //$NON-NLS-1$
-	private static final String STYLECLASS_TABS_DIV_BOTTOM_START_CONTENT = "af_navigationPane_tabs-bottom-start-content"; //$NON-NLS-1$
-	private static final String STYLECLASS_TABS_DIV_BOTTOM_MID_CONTENT = "af_navigationPane_tabs-bottom-mid-content"; //$NON-NLS-1$
-	private static final String STYLECLASS_TABS_DIV_BOTTOM_END_CONTENT = "af_navigationPane_tabs-bottom-end-content"; //$NON-NLS-1$
-	
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.operations.AbstractTransformOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	@Override
-	public Element transform(Element srcElement, Element curElement) {
-		Element div = null;
-		String hint = getHint(srcElement);
-		if (hint.equalsIgnoreCase("bar")) { //$NON-NLS-1$
-			div = transformAsBar(srcElement);
-		} else if (hint.equalsIgnoreCase("buttons")) { //$NON-NLS-1$
-			div = transformAsButtons(srcElement);
-		} else if (hint.equalsIgnoreCase("choice")) { //$NON-NLS-1$
-			div = transformAsChoice(srcElement);
-		} else if (hint.equalsIgnoreCase("list")) { //$NON-NLS-1$
-			div = transformAsList(srcElement);
-		} else if (hint.equalsIgnoreCase("tabs")) { //$NON-NLS-1$
-			div = transformAsTabs(srcElement);
-		} else {
-			div = transformAsBar(srcElement);
-		}
-		return div;
-	}
-
-	private Element transformAsBar(Element srcElement) {
-		return transformAsBarOrButtons(srcElement, true);
-	}
-
-	private Element transformAsButtons(Element srcElement) {
-		return transformAsBarOrButtons(srcElement, false);
-	}
-
-	private Element transformAsBarOrButtons(Element srcElement, boolean isBar) {
-		Element div = null;
-		String styleClass_outerDiv;
-		String styleClass_tableInactiveEnabled;
-		String styleClass_tableActiveEnabled;
-		String styleClass_tableInactiveDisabled;
-		String styleClass_tableActiveDisabled;
-		String styleClass_divContent;
-		String styleClass_divSeparator;
-		if (isBar) {
-			styleClass_outerDiv = STYLECLASS_BAR_OUTERDIV;
-			styleClass_tableInactiveEnabled = STYLECLASS_BAR_TABLE_INACTIVE_ENABLED;
-			styleClass_tableActiveEnabled = STYLECLASS_BAR_TABLE_ACTIVE_ENABLED;
-			styleClass_tableInactiveDisabled = STYLECLASS_BAR_TABLE_INACTIVE_DISABLED;
-			styleClass_tableActiveDisabled = STYLECLASS_BAR_TABLE_ACTIVE_DISABLED;
-			styleClass_divContent = STYLECLASS_BAR_DIV_CONTENT;
-			styleClass_divSeparator = STYLECLASS_BAR_DIV_SEPARATOR;
-		} else {
-			styleClass_outerDiv = STYLECLASS_OUTERDIV;
-			styleClass_tableInactiveEnabled = STYLECLASS_BUTTONS_TABLE_INACTIVE_ENABLED;
-			styleClass_tableActiveEnabled = STYLECLASS_BUTTONS_TABLE_ACTIVE_ENABLED;
-			styleClass_tableInactiveDisabled = STYLECLASS_BUTTONS_TABLE_INACTIVE_DISABLED;
-			styleClass_tableActiveDisabled = STYLECLASS_BUTTONS_TABLE_ACTIVE_DISABLED;
-			styleClass_divContent = STYLECLASS_BUTTONS_DIV_CONTENT;
-			styleClass_divSeparator = STYLECLASS_BUTTONS_DIV_SEPARATOR;
-		}
-		div = createElement("div"); //$NON-NLS-1$
-		setClassAndStyleAttributes(srcElement, styleClass_outerDiv, div);
-		List<Element> childCmdNavItems = getChildCmdNavItems(srcElement);
-		int index = 0;
-		int numChildCmdNavItems = childCmdNavItems.size();
-		if (numChildCmdNavItems > 0) {
-			for (Element childCmdNavItem: childCmdNavItems) {
-				String styleClass =
-					determineStyleClass(
-							childCmdNavItem,
-							styleClass_tableActiveEnabled,
-							styleClass_tableActiveDisabled,
-							styleClass_tableInactiveEnabled,
-							styleClass_tableInactiveDisabled);
-				Element tbody = appendTableAndTBody(div, true, styleClass);
-				Element tr = appendChildElement("tr", tbody); //$NON-NLS-1$
-				Element contentTD = appendChildElement("td", tr); //$NON-NLS-1$
-				Element contentDiv = appendChildElement("div", contentTD); //$NON-NLS-1$
-				appendAttribute(contentDiv, "class", styleClass_divContent); //$NON-NLS-1$
-				tagConverterContext.addChild(
-						childCmdNavItem,
-						new ConvertPosition(contentDiv, 0));
-				if (index++ < numChildCmdNavItems - 1) {
-					Element separatorTD = appendChildElement("td", tr); //$NON-NLS-1$
-					Element separatorDiv = appendChildElement("div", separatorTD); //$NON-NLS-1$
-					appendAttribute(separatorDiv, "class", styleClass_divSeparator); //$NON-NLS-1$
-					appendChildText("|", separatorDiv); //$NON-NLS-1$
-				}
-			}
-		} else {
-			setEmptyNavPaneMessage(div);
-		}
-		return div;
-	}
-
-	private Element transformAsChoice(Element srcElement) {
-		Element div = null;
-		div = createElement("div"); //$NON-NLS-1$
-		setClassAndStyleAttributes(srcElement, STYLECLASS_OUTERDIV, div);
-		List<Element> childCmdNavItems = getChildCmdNavItems(srcElement);
-		if (childCmdNavItems.size() > 0) {
-			Element select = appendChildElement("select", div); //$NON-NLS-1$
-			appendAttribute(select, "class", STYLECLASS_CHOICE_SELECT); //$NON-NLS-1$
-			for (Element childCmdNavItem: childCmdNavItems) {
-				if (!CommandNavigationItemOperation.isDisabled(childCmdNavItem)) {
-					Element option = appendChildElement("option", select); //$NON-NLS-1$
-					if (CommandNavigationItemOperation.isSelected(childCmdNavItem)) {
-						appendAttribute(option, "selected", "selected"); //$NON-NLS-1$ //$NON-NLS-2$
-					}
-					appendChildText(CommandNavigationItemOperation.getText(childCmdNavItem), option);
-				}
-			}
-			Element span = appendChildElement("span", div); //$NON-NLS-1$
-			appendAttribute(span, "style", "width: 5px;"); //$NON-NLS-1$ //$NON-NLS-2$
-			appendChildText(" ", span); //$NON-NLS-1$
-			Element button = appendChildElement("button", div); //$NON-NLS-1$
-			appendAttribute(button, "class", STYLECLASS_CHOICE_BUTTON); //$NON-NLS-1$
-			appendAttribute(button, "type", "button"); //$NON-NLS-1$ //$NON-NLS-2$
-			appendChildText("Go", button); //$NON-NLS-1$
-		} else {
-			setEmptyNavPaneMessage(div);
-		}
-		return div;
-	}
-
-	private Element transformAsList(Element srcElement) {
-		Element div = null;
-		div = createElement("div"); //$NON-NLS-1$
-		setClassAndStyleAttributes(srcElement, STYLECLASS_OUTERDIV, div);
-		List<Element> childCmdNavItems = getChildCmdNavItems(srcElement);
-		if (childCmdNavItems.size() > 0) {
-			for (Element childCmdNavItem: childCmdNavItems) {
-				String styleClass =
-					determineStyleClass(
-							childCmdNavItem,
-							STYLECLASS_LIST_TABLE_ACTIVE_ENABLED,
-							STYLECLASS_LIST_TABLE_ACTIVE_DISABLED,
-							STYLECLASS_LIST_TABLE_INACTIVE_ENABLED,
-							STYLECLASS_LIST_TABLE_INACTIVE_DISABLED);
-				Element tbody = appendTableAndTBody(div, false, styleClass);
-				Element tr = appendChildElement("tr", tbody); //$NON-NLS-1$
-				Element bulletTD = appendChildElement("td", tr); //$NON-NLS-1$
-				appendAttribute(bulletTD, "class", STYLECLASS_LIST_TD_BULLET); //$NON-NLS-1$
-				Element bulletDiv = appendChildElement("div", bulletTD); //$NON-NLS-1$
-				appendChildText(" ", bulletDiv); //$NON-NLS-1$
-				Element contentTD = appendChildElement("td", tr); //$NON-NLS-1$
-				Element contentDiv = appendChildElement("div", contentTD); //$NON-NLS-1$
-				appendAttribute(contentDiv, "class", STYLECLASS_LIST_DIV_CONTENT); //$NON-NLS-1$
-				tagConverterContext.addChild(
-						childCmdNavItem,
-						new ConvertPosition(contentDiv, 0));
-			}
-		} else {
-			setEmptyNavPaneMessage(div);
-		}
-		return div;
-	}
-
-	private Element transformAsTabs(Element srcElement) {
-		Element div = null;
-		div = createElement("div"); //$NON-NLS-1$
-		setClassAndStyleAttributes(srcElement, STYLECLASS_OUTERDIV, div);
-		List<Element> childCmdNavItems = getChildCmdNavItems(srcElement);
-		int index = 0;
-		int numChildCmdNavItems = childCmdNavItems.size();
-		int selectedTabIndex = determineSelectedTabIndex(childCmdNavItems);
-		if (numChildCmdNavItems > 0) {
-			for (Element childCmdNavItem: childCmdNavItems) {
-				String tableStyleClass =
-					determineStyleClass(
-							childCmdNavItem,
-							STYLECLASS_TABS_TABLE_ACTIVE_ENABLED,
-							STYLECLASS_TABS_TABLE_ACTIVE_DISABLED,
-							STYLECLASS_TABS_TABLE_INACTIVE_ENABLED,
-							STYLECLASS_TABS_TABLE_INACTIVE_DISABLED);
-				Element outerTBody = appendTableAndTBody(div, true, ""); //$NON-NLS-1$
-				Element outerTR = appendChildElement("tr", outerTBody); //$NON-NLS-1$
-				Element outerTD = appendChildElement("td", outerTR); //$NON-NLS-1$
-				Element innerTBody = appendTableAndTBody(outerTD, false, tableStyleClass);
-				appendStartColumn(innerTBody, index, selectedTabIndex);
-				outerTD = appendChildElement("td", outerTR); //$NON-NLS-1$
-				innerTBody = appendTableAndTBody(outerTD, false, tableStyleClass);
-				appendMidColumn(innerTBody, childCmdNavItem);
-				if (index + 1 != selectedTabIndex) {
-					outerTD = appendChildElement("td", outerTR); //$NON-NLS-1$
-					innerTBody = appendTableAndTBody(outerTD, false, tableStyleClass);
-					appendEndColumn(innerTBody, index, numChildCmdNavItems);
-				}
-				index++;
-			}
-		} else {
-			setEmptyNavPaneMessage(div);
-		}
-		return div;
-	}
-
-	private List<Element> getChildCmdNavItems(Element srcElement) {
-		List<Element> childCmdNavItems = new ArrayList<Element>();
-		NodeList childElements = srcElement.getElementsByTagNameNS(ITrinidadConstants.URI_CORE, "commandNavigationItem"); //$NON-NLS-1$$
-		if (childElements != null && childElements.getLength() > 0) {
-			for (int i = 0, len = childElements.getLength(); i < len; i++) {
-				childCmdNavItems.add((Element)childElements.item(i));
-			}
-		} else {
-			Element nodeStampFacet = getChildFacetByName(srcElement, "nodeStamp"); //$NON-NLS-1$
-			if (nodeStampFacet != null) {
-				childElements = nodeStampFacet.getElementsByTagNameNS(ITrinidadConstants.URI_CORE, "commandNavigationItem"); //$NON-NLS-1$
-				if (childElements != null && childElements.getLength() > 0) {
-					for (int i = 0, len = childElements.getLength(); i < len; i++) {
-						childCmdNavItems.add((Element)childElements.item(i));
-					}
-				}
-			}
-		}
-		return childCmdNavItems;
-	}
-
-	private String getHint(Element srcElement) {
-		String hint = srcElement.getAttribute("hint"); //$NON-NLS-1$
-		return hint != null ? hint : "bar"; //$NON-NLS-1$
-	}
-
-	private void setClassAndStyleAttributes(Element srcElement, String baseStyleClass, Element curElement) {
-		String styleClass = calculateStyleClass(baseStyleClass, srcElement);
-		if (styleClass != null) {
-			appendAttribute(curElement, "class", styleClass); //$NON-NLS-1$
-		}
-		String style = srcElement.getAttribute("inlineStyle"); //$NON-NLS-1$
-		if (style != null) {
-			appendAttribute(curElement, "style", style); //$NON-NLS-1$
-		}
-	}
-
-	private void setEmptyNavPaneMessage(Element curElement) {
-		appendAttribute(curElement, "style", ITrinidadConstants.STYLE_EMPTYELEMENT); //$NON-NLS-1$
-		appendChildText(Messages.NavigationPaneOperation_EmptyNavigationPaneTag, curElement);
-	}
-
-	private Element appendTableAndTBody(Element parentElement, boolean isInline, String styleClass) {
-		Element table = appendChildElement("table", parentElement); //$NON-NLS-1$
-		appendAttribute(table, "cellpadding", "0"); //$NON-NLS-1$ //$NON-NLS-2$
-		appendAttribute(table, "cellspacing", "0"); //$NON-NLS-1$ //$NON-NLS-2$
-		appendAttribute(table, "border", "0"); //$NON-NLS-1$ //$NON-NLS-2$
-		if (isInline) {
-			appendAttribute(table, "style", "display: inline;"); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-		appendAttribute(table, "class", styleClass); //$NON-NLS-1$
-		Element tbody = appendChildElement("tbody", table); //$NON-NLS-1$
-		return tbody;
-	}
-
-	private String determineStyleClass(
-			Element cmdNavItem,
-			String styleClass_ActiveEnabled,
-			String styleClass_ActiveDisabled,
-			String styleClass_InactiveEnabled,
-			String styleClass_InactiveDisabled) {
-		String styleClass;
-		if (CommandNavigationItemOperation.isSelected(cmdNavItem)) {
-			if (!CommandNavigationItemOperation.isDisabled(cmdNavItem)) {
-				styleClass = styleClass_ActiveEnabled;
-			} else {
-				styleClass = styleClass_ActiveDisabled;
-			}
-		} else {
-			if (!CommandNavigationItemOperation.isDisabled(cmdNavItem)) {
-				styleClass = styleClass_InactiveEnabled;
-			} else {
-				styleClass = styleClass_InactiveDisabled;
-			}
-		}
-		return styleClass;
-	}
-
-	private int determineSelectedTabIndex(List<Element> childCmdNavItems) {
-		int selectedTabIndex = -2;
-		int curTabIndex = 0;
-		for (Element childCmdNavItem: childCmdNavItems) {
-			if (CommandNavigationItemOperation.isSelected(childCmdNavItem)) {
-				selectedTabIndex = curTabIndex;
-				break;
-			}
-			curTabIndex++;
-		}
-		return selectedTabIndex;
-	}
-
-	private void appendStartColumn(Element parentTBody, int curTabIndex, int selectedTabIndex) {
-		String topTDStyleClass;
-		String bottomTDStyleClass;
-		String divStyleClass;
-		if (curTabIndex == 0) {
-			topTDStyleClass = STYLECLASS_TABS_TD_START;
-			bottomTDStyleClass = STYLECLASS_TABS_TD_BOTTOM_START;
-			divStyleClass = STYLECLASS_TABS_DIV_BOTTOM_START_CONTENT;
-		} else {
-			if (curTabIndex == selectedTabIndex) {
-				topTDStyleClass = STYLECLASS_TABS_TD_START_JOIN;
-				bottomTDStyleClass = STYLECLASS_TABS_TD_BOTTOM_START;
-				divStyleClass = STYLECLASS_TABS_DIV_BOTTOM_START_CONTENT;
-			} else {
-				if (curTabIndex == selectedTabIndex + 1) {
-					topTDStyleClass = STYLECLASS_TABS_TD_START_JOINFROMACTIVE;
-				} else {
-					topTDStyleClass = STYLECLASS_TABS_TD_START_JOINFROMINACTIVE;
-				}
-				bottomTDStyleClass = STYLECLASS_TABS_TD_BOTTOM_END;
-				divStyleClass = STYLECLASS_TABS_DIV_BOTTOM_MID_CONTENT;
-			}
-		}
-		Element topTR = appendChildElement("tr", parentTBody); //$NON-NLS-1$
-		Element topTD = appendChildElement("td", topTR); //$NON-NLS-1$
-		appendAttribute(topTD, "class", topTDStyleClass); //$NON-NLS-1$
-		Element bottomTR = appendChildElement("tr", parentTBody); //$NON-NLS-1$
-		Element bottomTD = appendChildElement("td", bottomTR); //$NON-NLS-1$
-		appendAttribute(bottomTD, "class", bottomTDStyleClass); //$NON-NLS-1$
-		Element div = appendChildElement("div", bottomTD); //$NON-NLS-1$
-		appendAttribute(div, "class", divStyleClass); //$NON-NLS-1$
-	}
-
-	private void appendMidColumn(Element parentTBody, Element cmdNavItem) {
-		Element topTR = appendChildElement("tr", parentTBody); //$NON-NLS-1$
-		Element topTD = appendChildElement("td", topTR); //$NON-NLS-1$
-		appendAttribute(topTD, "class", STYLECLASS_TABS_TD_MID); //$NON-NLS-1$
-		tagConverterContext.addChild(cmdNavItem, new ConvertPosition(topTD, 0));
-		Element bottomTR = appendChildElement("tr", parentTBody); //$NON-NLS-1$
-		Element bottomTD = appendChildElement("td", bottomTR); //$NON-NLS-1$
-		appendAttribute(bottomTD, "class", STYLECLASS_TABS_TD_BOTTOM_MID); //$NON-NLS-1$
-		Element div = appendChildElement("div", bottomTD); //$NON-NLS-1$
-		appendAttribute(div, "class", STYLECLASS_TABS_DIV_BOTTOM_MID_CONTENT); //$NON-NLS-1$
-	}
-
-	private void appendEndColumn(Element parentTBody, int curTabIndex, int numTabs) {
-		String topTDStyleClass;
-		String bottomTDStyleClass;
-		if (curTabIndex < numTabs - 1) {
-			topTDStyleClass = STYLECLASS_TABS_TD_END_JOINTOINACTIVE;
-			bottomTDStyleClass = STYLECLASS_TABS_TD_BOTTOM_END_JOIN;
-		} else {
-			topTDStyleClass = STYLECLASS_TABS_TD_END;
-			bottomTDStyleClass = STYLECLASS_TABS_TD_BOTTOM_END;
-		}
-		Element topTR = appendChildElement("tr", parentTBody); //$NON-NLS-1$
-		Element topTD = appendChildElement("td", topTR); //$NON-NLS-1$
-		appendAttribute(topTD, "class", topTDStyleClass); //$NON-NLS-1$
-		Element bottomTR = appendChildElement("tr", parentTBody); //$NON-NLS-1$
-		Element bottomTD = appendChildElement("td", bottomTR); //$NON-NLS-1$
-		appendAttribute(bottomTD, "class", bottomTDStyleClass); //$NON-NLS-1$
-		Element div = appendChildElement("div", bottomTD); //$NON-NLS-1$
-		appendAttribute(div, "class", STYLECLASS_TABS_DIV_BOTTOM_END_CONTENT); //$NON-NLS-1$
-	}
-
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/OutputFormattedOperation.java b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/OutputFormattedOperation.java
deleted file mode 100644
index d29e92e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/OutputFormattedOperation.java
+++ /dev/null
@@ -1,160 +0,0 @@
-/**
- * Copyright (c) 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle Corporation - initial API and implementation
- */
-package org.eclipse.jst.jsf.apache.trinidad.tagsupport.converter.operations;
-
-import java.io.ByteArrayInputStream;
-import java.io.InputStream;
-
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-
-import org.eclipse.jst.pagedesigner.dtmanager.converter.ITransformOperation;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.TransformOperationFactory;
-import org.w3c.dom.Attr;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.NamedNodeMap;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.w3c.dom.Text;
-
-/**
- * ITransformOperation implementation specifically for the "outputFormatted" JSF
- * Element.
- * 
- * <br><b>Note:</b> requires ITransformOperation.setTagConverterContext(...) to
- * have been called to provide a valid ITagConverterContext instance prior to
- * a call to the transform(...) method.
- * 
- * @author Ian Trimble - Oracle
- */
-public class OutputFormattedOperation extends AbstractTrinidadTransformOperation {
-
-	/*
-	 * NOTICE (especially if looking for missing whitespace):
-	 * Because this operation can potentially return a mix of child Element
-	 * and Text nodes inside a span Element, it can suffer from bug #221629
-	 * (see https://bugs.eclipse.org/bugs/show_bug.cgi?id=221629).
-	 * This operation is not the cause of the above-mentioned bug.
-	 */
-
-	private static final String STYLECLASS_INSTRUCTION = "AFInstructionText"; //$NON-NLS-1$
-	private static final String STYLECLASS_PAGESTAMP = "OraPageStampText"; //$NON-NLS-1$
-	private static final String STYLECLASS_INCONTEXTBRANDING = "p_InContextBrandingText"; //$NON-NLS-1$
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.operations.AbstractTransformOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	@Override
-	public Element transform(Element srcElement, Element curElement) {
-		//create outer span element and set class attribute
-		Element spanElement = createElement("span"); //$NON-NLS-1$
-		ITransformOperation operation =
-			TransformOperationFactory.getInstance().getTransformOperation(
-					TransformOperationFactory.OP_CopyAttributeWithRenameOperation,
-					new String[]{"inlineStyle", "style"}); //$NON-NLS-1$  //$NON-NLS-2$
-		operation.transform(srcElement, spanElement);
-
-		String styleClass = srcElement.getAttribute("styleClass"); //$NON-NLS-1$
-		if (styleClass == null || styleClass.length() < 1) {
-			String styleUsage = srcElement.getAttribute("styleUsage"); //$NON-NLS-1$
-			if (styleUsage != null && styleUsage.length() > 8) {
-				if (styleUsage.equals("instruction")) { //$NON-NLS-1$
-					styleClass = STYLECLASS_INSTRUCTION;
-				} else if (styleUsage.equals("pageStamp")) { //$NON-NLS-1$
-					styleClass = STYLECLASS_PAGESTAMP;
-				} else if (styleUsage.equals("inContextBranding")) { //$NON-NLS-1$
-					styleClass = STYLECLASS_INCONTEXTBRANDING;
-				}
-			}
-		}
-		if (styleClass != null && styleClass.length() > 0) {
-			appendAttribute(spanElement, "class", styleClass); //$NON-NLS-1$
-		}
-
-		//deal with value
-		String value = srcElement.getAttribute("value"); //$NON-NLS-1$
-		if (value != null && value.length() > 0) {
-			StringBuffer wrappedValue = new StringBuffer();
-			wrappedValue.append("<?xml version=\"1.0\"?><value>"); //$NON-NLS-1$
-			wrappedValue.append(value);
-			wrappedValue.append("</value>"); //$NON-NLS-1$
-			InputStream inputStream = new ByteArrayInputStream(wrappedValue.toString().getBytes());
-			Element valueElement = getValueDocumentElement(inputStream);
-			if (valueElement != null) {
-				if (!appendValueNodes(spanElement, valueElement)) {
-					//remove any children added before appendValueNodes failed
-					NodeList childNodes = spanElement.getChildNodes();
-					for (int i = 0; i < childNodes.getLength(); i++) {
-						spanElement.removeChild(childNodes.item(i));
-					}
-					//set as simple text
-					appendChildText(value, spanElement);
-				}
-			} else {
-				//set as simple text
-				appendChildText(value, spanElement);
-			}
-		}
-
-		return spanElement;
-	}
-
-	private Element getValueDocumentElement(InputStream inputStream) {
-		Element element = null;
-		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
-		//TODO: entity expansion should be set to false for ".jsp", true for ".jspx"
-		factory.setExpandEntityReferences(true);
-		try {
-			DocumentBuilder builder = factory.newDocumentBuilder();
-			Document document = builder.parse(inputStream);
-			element = document.getDocumentElement();
-		} catch(Exception e) {
-			//fail on any exception - text with markup will be rendered instead
-		}
-		return element;
-	}
-
-	private boolean appendValueNodes(Node parentNode, Node currentNode) {
-		boolean success = true;
-		try {
-			NodeList childNodes = currentNode.getChildNodes();
-			for (int i = 0; i < childNodes.getLength(); i++) {
-				Node childNode = childNodes.item(i);
-				if (childNode instanceof Element) {
-					//TODO: elements should be filtered to only create elements specified for this tag
-					Element newElement = (Element)parentNode.appendChild(
-						parentNode.getOwnerDocument().createElement(
-								childNode.getNodeName()));
-					NamedNodeMap attrMap = childNode.getAttributes();
-					if (attrMap != null) {
-						for (int j = 0; j < attrMap.getLength(); j++) {
-							Attr attr = (Attr)attrMap.item(j);
-							//TODO: attributes should be filtered to only create attributes specified for this tag
-							newElement.setAttribute(
-									attr.getName(), attr.getValue());
-						}
-					}
-					success &= appendValueNodes(newElement, childNode);
-				} else if (childNode instanceof Text) {
-					parentNode.appendChild(
-							parentNode.getOwnerDocument().createTextNode(
-									childNode.getTextContent()));
-				}
-			}
-		} catch(Exception e) {
-			//fail on any exception - text with markup will be rendered instead
-			success = false;
-		}
-		return success;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/PanelFormLayoutOperation.java b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/PanelFormLayoutOperation.java
deleted file mode 100644
index 761893e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/PanelFormLayoutOperation.java
+++ /dev/null
@@ -1,427 +0,0 @@
-/**
- * Copyright (c) 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle Corporation - initial API and implementation
- */
-package org.eclipse.jst.jsf.apache.trinidad.tagsupport.converter.operations;
-
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.jst.jsf.apache.trinidad.tagsupport.ITrinidadConstants;
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.jsf.core.internal.tld.TagIdentifierFactory;
-import org.eclipse.jst.pagedesigner.converter.ConvertPosition;
-import org.w3c.dom.Element;
-
-/**
- * ITransformOperation implementation specifically for the "panelFormLayout"
- * JSF Element.
- * 
- * <br><b>Note:</b> requires ITransformOperation.setTagConverterContext(...) to
- * have been called to provide a valid ITagConverterContext instance prior to
- * a call to the transform(...) method.
- * 
- * @author Ian Trimble - Oracle
- */
-public class PanelFormLayoutOperation extends AbstractTrinidadTransformOperation {
-
-	private static final String STYLECLASS_REQUIREDSPAN = "AFRequiredIconStyle"; //$NON-NLS-1$
-	private static final String STYLECLASS_GROUPSEPARATOR = "af_panelFormLayout_separator"; //$NON-NLS-1$
-	private static final String STYLECLASS_LABELCELL = "af_inputText_label af_panelFormLayout_label-cell"; //$NON-NLS-1$
-	private static final String STYLECLASS_FIELDCELL = "af_panelFormLayout_content-cell"; //$NON-NLS-1$
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.operations.AbstractTransformOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	@Override
-	public Element transform(Element srcElement, Element curElement) {
-		//calculate required values
-		int columnCount = calculateColumnCount(srcElement);
-		int rowCount = calculateRowCount(srcElement);
-		String fieldWidth = calculateFieldWidth(srcElement);
-		String labelWidth = calculateLabelWidth(srcElement);
-
-		//initialize current column/row variables
-		int currentColumn = 1;
-		int currentRow = 1;
-		
-		//build outer table
-		Element outerTableElement = createElement("table"); //$NON-NLS-1$
-		String styleClass = srcElement.getAttribute("styleClass"); //$NON-NLS-1$
-		if (styleClass != null && styleClass.length() > 0) {
-			appendAttribute(outerTableElement, "class", styleClass); //$NON-NLS-1$
-		}
-		String inlineStyle = srcElement.getAttribute("inlineStyle"); //$NON-NLS-1$
-		if (inlineStyle != null && inlineStyle.length() > 0) {
-			appendAttribute(outerTableElement, "style", inlineStyle + ";width:100%;"); //$NON-NLS-1$ //$NON-NLS-2$
-		} else {
-			appendAttribute(outerTableElement, "style", "width:100%;"); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-		appendAttribute(outerTableElement, "cellpadding", "0"); //$NON-NLS-1$ //$NON-NLS-2$
-		appendAttribute(outerTableElement, "cellspacing", "0"); //$NON-NLS-1$ //$NON-NLS-2$
-		appendAttribute(outerTableElement, "border", "0"); //$NON-NLS-1$ //$NON-NLS-2$
-		Element outerTBodyElement = appendChildElement("tbody", outerTableElement); //$NON-NLS-1$
-		Element outerTopTRElement = appendChildElement("tr", outerTBodyElement); //$NON-NLS-1$
-
-		//build start of column
-		Element currentTBodyElement = buildColumnStart(outerTopTRElement, columnCount, currentColumn, labelWidth, fieldWidth);
-
-		//build controls
-		List<Element> childElements = getChildElementsSkipFacets(srcElement);
-		Iterator<Element> itChildElements = childElements.iterator();
-		while (itChildElements.hasNext()) {
-			Element childElement = itChildElements.next();
-			if (ITrinidadConstants.TAG_IDENTIFIER_GROUP.isSameTagType(
-					TagIdentifierFactory.createDocumentTagWrapper(childElement))) {
-				if (currentRow > 1) {
-					buildGroupSeparatorRow(currentTBodyElement);
-				}
-				List<Element> groupChildElements = getChildElementsSkipFacets(childElement);
-				Iterator<Element> itGroupChildElements = groupChildElements.iterator();
-				while (itGroupChildElements.hasNext()) {
-					Element groupChildElement = itGroupChildElements.next();
-					buildControlRow(groupChildElement, currentTBodyElement);
-				}
-				currentRow += groupChildElements.size();
-				if (currentRow <= rowCount) {
-					buildGroupSeparatorRow(currentTBodyElement);
-				}
-				if (currentRow > rowCount && currentColumn < columnCount) {
-					currentRow = 1;
-					currentColumn++;
-					currentTBodyElement = buildColumnStart(
-							outerTopTRElement, columnCount, currentColumn, labelWidth, fieldWidth);
-				}
-			} else {
-				buildControlRow(childElement, currentTBodyElement);
-				currentRow++;
-				if (currentRow > rowCount && currentColumn < columnCount) {
-					currentRow = 1;
-					currentColumn++;
-					currentTBodyElement = buildColumnStart(
-							outerTopTRElement, columnCount, currentColumn, labelWidth, fieldWidth);
-				}
-			}
-		}
-
-		//handle "footer" facet
-		Element footerElement = getChildFacetByName(srcElement, "footer"); //$NON-NLS-1$
-		if (footerElement != null) {
-			List<Element> footerChildElements = getChildElementsSkipFacets(footerElement);
-			if (footerChildElements.size() > 0) {
-				Element outerBottomTRElement = appendChildElement("tr", outerTBodyElement); //$NON-NLS-1$
-				currentTBodyElement = buildFooterStart(
-						outerBottomTRElement, columnCount, labelWidth);
-				rowCount = countChildElements(footerElement);
-				currentRow = 1;
-				Iterator<Element> itFooterChildElements = footerChildElements.iterator();
-				while (itFooterChildElements.hasNext()) {
-					Element footerChildElement = itFooterChildElements.next();
-					if (ITrinidadConstants.TAG_IDENTIFIER_GROUP.isSameTagType(
-							TagIdentifierFactory.createDocumentTagWrapper(footerChildElement))) {
-						if (currentRow > 1) {
-							buildGroupSeparatorRow(currentTBodyElement);
-						}
-						List<Element> groupFooterChildElements = getChildElementsSkipFacets(footerChildElement);
-						Iterator<Element> itGroupFooterChildElements = groupFooterChildElements.iterator();
-						while (itGroupFooterChildElements.hasNext()) {
-							Element groupFooterChildElement = itGroupFooterChildElements.next();
-							if (ITrinidadConstants.TAG_IDENTIFIER_GROUP.isSameTagType(
-									TagIdentifierFactory.createDocumentTagWrapper(groupFooterChildElement))) {
-								if (currentRow > 1) {
-									buildGroupSeparatorRow(currentTBodyElement);
-								}
-								List<Element> subGroupFooterChildElements = getChildElementsSkipFacets(groupFooterChildElement);
-								Iterator<Element> itSubGroupFooterChildElements = subGroupFooterChildElements.iterator();
-								while (itSubGroupFooterChildElements.hasNext()) {
-									Element subGroupFooterChildElement = itSubGroupFooterChildElements.next();
-									buildControlRow(subGroupFooterChildElement, currentTBodyElement, true);
-									currentRow++;
-								}
-								if (currentRow <= rowCount) {
-									buildGroupSeparatorRow(currentTBodyElement);
-								}
-							} else {
-								buildControlRow(groupFooterChildElement, currentTBodyElement, true);
-								currentRow++;
-							}
-						}
-						if (currentRow <= rowCount) {
-							buildGroupSeparatorRow(currentTBodyElement);
-						}
-					} else {
-						buildControlRow(footerChildElement, currentTBodyElement, true);
-						currentRow++;
-					}
-				}
-			}
-		}
-
-		return outerTableElement;
-	}
-
-	private int calculateRowCount(Element srcElement) {
-		int rowCount = Integer.MAX_VALUE;
-		int specifiedRows = Integer.MAX_VALUE;
-		String rows = srcElement.getAttribute("rows"); //$NON-NLS-1$
-		if (rows != null && rows.length() > 0) {
-			try {
-				//not spec'ed, but observed that setting rows < 5 is ignored
-				specifiedRows = Math.max(5, Integer.parseInt(rows));
-			} catch(NumberFormatException nfe) {
-				//ignore - specifiedRows will default to Integer.MAX_VALUE
-			}
-		}
-		int specifiedMaxColumns = Integer.MAX_VALUE;
-		String maxColumns = srcElement.getAttribute("maxColumns"); //$NON-NLS-1$
-		if (maxColumns != null && maxColumns.length() > 0) {
-			try {
-				specifiedMaxColumns = Integer.parseInt(maxColumns);
-			} catch(NumberFormatException nfe) {
-				//ignore - specifiedMaxColumns will default to Integer.MAX_VALUE
-			}
-		}
-		int childElementCount = countChildElements(srcElement);
-		int calculatedColumns = childElementCount / specifiedRows;
-		if (childElementCount % specifiedRows > 0) {
-			calculatedColumns++;
-		}
-		if (calculatedColumns > specifiedMaxColumns) {
-			rowCount = childElementCount / specifiedMaxColumns;
-		} else {
-			rowCount = specifiedRows;
-		}
-		return rowCount;
-	}
-
-	private int calculateColumnCount(Element srcElement) {
-		int columnCount = Integer.MAX_VALUE;
-		int specifiedRows = Integer.MAX_VALUE;
-		String rows = srcElement.getAttribute("rows"); //$NON-NLS-1$
-		if (rows != null && rows.length() > 0) {
-			try {
-				//not spec'ed, but observed that setting rows < 5 is ignored
-				specifiedRows = Math.max(5, Integer.parseInt(rows));
-			} catch(NumberFormatException nfe) {
-				//ignore - specifiedRows will default to Integer.MAX_VALUE
-			}
-		}
-		int specifiedMaxColumns = Integer.MAX_VALUE;
-		String maxColumns = srcElement.getAttribute("maxColumns"); //$NON-NLS-1$
-		if (maxColumns != null && maxColumns.length() > 0) {
-			try {
-				specifiedMaxColumns = Integer.parseInt(maxColumns);
-			} catch(NumberFormatException nfe) {
-				//ignore - specifiedMaxColumns will default to Integer.MAX_VALUE
-			}
-		}
-		int childElementCount = countChildElements(srcElement);
-		int calculatedColumns = childElementCount / specifiedRows;
-		if (childElementCount % specifiedRows > 0) {
-			calculatedColumns++;
-		}
-		columnCount = Math.min(specifiedMaxColumns, calculatedColumns);
-		return columnCount;
-	}
-
-	private int countChildElements(Element srcElement) {
-		int count = 0;
-		List<Element> childElements = getChildElementsSkipFacets(srcElement);
-		Iterator<Element> itChildElements = childElements.iterator();
-		while (itChildElements.hasNext()) {
-			Element childElement = itChildElements.next();
-			if (ITrinidadConstants.TAG_IDENTIFIER_GROUP.isSameTagType(
-					TagIdentifierFactory.createDocumentTagWrapper(childElement))) {
-				count += countChildElements(childElement);
-			} else {
-				count++;
-			}
-		}
-		return count;
-	}
-
-	private String calculateFieldWidth(Element srcElement) {
-		String width = null;
-		String fieldWidth = srcElement.getAttribute("fieldWidth"); //$NON-NLS-1$
-		if (fieldWidth != null && fieldWidth.length() > 0) {
-			width = fieldWidth;
-		} else {
-			String labelWidth = srcElement.getAttribute("labelWidth"); //$NON-NLS-1$
-			if (labelWidth != null && labelWidth.length() > 1) {
-				if (labelWidth.endsWith("%")) { //$NON-NLS-1$
-					try {
-						int iLabelWidth = Integer.parseInt(labelWidth.substring(0, labelWidth.length() - 1));
-						if (iLabelWidth <= 100) {
-							width = String.valueOf(100 - iLabelWidth) + "%"; //$NON-NLS-1$
-						}
-					} catch(NumberFormatException nfe) {
-						//ignore - cannot calculate and so will return null
-					}
-				}
-			}
-		}
-		return width;
-	}
-
-	private String calculateLabelWidth(Element srcElement) {
-		String width = null;
-		String labelWidth = srcElement.getAttribute("labelWidth"); //$NON-NLS-1$
-		if (labelWidth != null && labelWidth.length() > 0) {
-			width = labelWidth;
-		} else {
-			String fieldWidth = srcElement.getAttribute("fieldWidth"); //$NON-NLS-1$
-			if (fieldWidth != null && fieldWidth.length() > 1) {
-				if (fieldWidth.endsWith("%")) { //$NON-NLS-1$
-					try {
-						int iFieldWidth = Integer.parseInt(fieldWidth.substring(0, fieldWidth.length() - 1));
-						if (iFieldWidth <= 100) {
-							width = String.valueOf(100 - iFieldWidth) + "%"; //$NON-NLS-1$
-						}
-					} catch(NumberFormatException nfe) {
-						//ignore - cannot calculate and so will return null
-					}
-				}
-			}
-		}
-		return width;
-	}
-
-	private Element buildColumnStart(
-			Element parentElement, int columnCount, int currentColumn,
-			String labelWidth, String fieldWidth) {
-		Element tdElement = appendChildElement("td", parentElement); //$NON-NLS-1$
-		appendAttribute(tdElement, "style", "vertical-align:top;"); //$NON-NLS-1$ //$NON-NLS-2$
-		if (currentColumn < columnCount) {
-			String width = String.valueOf(100 / columnCount) + "%"; //$NON-NLS-1$
-			appendAttribute(tdElement, "width", width); //$NON-NLS-1$
-		}
-		Element tableElement = appendChildElement("table", tdElement); //$NON-NLS-1$
-		appendAttribute(tableElement, "cellpadding", "0"); //$NON-NLS-1$ //$NON-NLS-2$
-		appendAttribute(tableElement, "cellspacing", "0"); //$NON-NLS-1$ //$NON-NLS-2$
-		appendAttribute(tableElement, "border", "0"); //$NON-NLS-1$ //$NON-NLS-2$
-		appendAttribute(tableElement, "width", "100%"); //$NON-NLS-1$ //$NON-NLS-2$
-		Element tBodyElement = appendChildElement("tbody", tableElement); //$NON-NLS-1$
-		Element trElement = appendChildElement("tr", tBodyElement); //$NON-NLS-1$
-		Element tdLabelElement = appendChildElement("td", trElement); //$NON-NLS-1$
-		if (labelWidth != null && labelWidth.length() > 0) {
-			appendAttribute(tdLabelElement, "style", "width:" + labelWidth); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-		Element tdFieldElement = appendChildElement("td", trElement); //$NON-NLS-1$
-		if (fieldWidth != null && fieldWidth.length() > 0) {
-			appendAttribute(tdFieldElement, "style", "width:" + fieldWidth); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-		return tBodyElement;
-	}
-
-	private void buildControlRow(Element srcElement, Element parentElement, boolean alignLabelsTop) {
-		Element trElement = appendChildElement("tr", parentElement); //$NON-NLS-1$
-		Element tdLabelElement = appendChildElement("td", trElement); //$NON-NLS-1$
-		appendAttribute(tdLabelElement, "class", STYLECLASS_LABELCELL); //$NON-NLS-1$
-		if (alignLabelsTop) {
-			appendAttribute(tdLabelElement, "valign", "top"); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-		appendAttribute(tdLabelElement, "nowrap", ""); //$NON-NLS-1$ //$NON-NLS-2$
-		buildLabel(srcElement, tdLabelElement);
-		Element tdFieldElement = appendChildElement("td", trElement); //$NON-NLS-1$
-		appendAttribute(tdFieldElement, "class", STYLECLASS_FIELDCELL); //$NON-NLS-1$
-		appendAttribute(tdFieldElement, "valign", "top"); //$NON-NLS-1$ //$NON-NLS-2$
-		appendAttribute(tdFieldElement, "nowrap", ""); //$NON-NLS-1$ //$NON-NLS-2$
-		tagConverterContext.addChild(srcElement, new ConvertPosition(tdFieldElement, 0));
-	}
-
-	private void buildControlRow(Element srcElement, Element parentElement) {
-		buildControlRow(srcElement, parentElement, false);
-	}
-
-	private void buildLabel(Element srcElement, Element parentElement) {
-		TagIdentifier tagID = TagIdentifierFactory.createDocumentTagWrapper(srcElement);
-		if (
-				tagID.isSameTagType(ITrinidadConstants.TAG_IDENTIFIER_INPUTCOLOR) ||
-				tagID.isSameTagType(ITrinidadConstants.TAG_IDENTIFIER_INPUTDATE) ||
-				tagID.isSameTagType(ITrinidadConstants.TAG_IDENTIFIER_INPUTFILE) ||
-				tagID.isSameTagType(ITrinidadConstants.TAG_IDENTIFIER_INPUTLISTOFVALUES) ||
-				tagID.isSameTagType(ITrinidadConstants.TAG_IDENTIFIER_INPUTNUMBERSPINBOX) ||
-				tagID.isSameTagType(ITrinidadConstants.TAG_IDENTIFIER_INPUTTEXT) ||
-				tagID.isSameTagType(ITrinidadConstants.TAG_IDENTIFIER_SELECTBOOLEANCHECKBOX) ||
-				tagID.isSameTagType(ITrinidadConstants.TAG_IDENTIFIER_SELECTBOOLEANRADIO) ||
-				tagID.isSameTagType(ITrinidadConstants.TAG_IDENTIFIER_SELECTMANYCHECKBOX) ||
-				tagID.isSameTagType(ITrinidadConstants.TAG_IDENTIFIER_SELECTMANYLISTBOX) ||
-				tagID.isSameTagType(ITrinidadConstants.TAG_IDENTIFIER_SELECTONECHOICE) ||
-				tagID.isSameTagType(ITrinidadConstants.TAG_IDENTIFIER_SELECTONELISTBOX) ||
-				tagID.isSameTagType(ITrinidadConstants.TAG_IDENTIFIER_SELECTONERADIO) ||
-				tagID.isSameTagType(ITrinidadConstants.TAG_IDENTIFIER_PANELLABELANDMESSAGE)) {
-			String required = srcElement.getAttribute("required"); //$NON-NLS-1$
-			String showRequired = srcElement.getAttribute("showRequired"); //$NON-NLS-1$
-			if (Boolean.parseBoolean(required) || Boolean.parseBoolean(showRequired)) {
-				Element spanElement = appendChildElement("span", parentElement); //$NON-NLS-1$
-				appendAttribute(spanElement, "title", "Required"); //$NON-NLS-1$ //$NON-NLS-2$
-				appendAttribute(spanElement, "class", STYLECLASS_REQUIREDSPAN); //$NON-NLS-1$
-				appendChildText("* ", spanElement); //$NON-NLS-1$
-			}
-			String label = srcElement.getAttribute("labelAndAccessKey"); //$NON-NLS-1$
-			if (label == null || label.length() < 1) {
-				label = srcElement.getAttribute("label"); //$NON-NLS-1$
-			}
-			if (label != null && label.length() > 0) {
-				Element labelElement = appendChildElement("label", parentElement); //$NON-NLS-1$
-				appendChildText(label, labelElement);
-			}
-		}
-	}
-
-	private void buildGroupSeparatorRow(Element parentElement) {
-		Element trElement = appendChildElement("tr", parentElement); //$NON-NLS-1$
-		Element tdElement = appendChildElement("td", trElement); //$NON-NLS-1$
-		appendAttribute(tdElement, "colspan", "2"); //$NON-NLS-1$ //$NON-NLS-2$
-		Element divElement = appendChildElement("div", tdElement); //$NON-NLS-1$
-		appendAttribute(divElement, "class", STYLECLASS_GROUPSEPARATOR); //$NON-NLS-1$
-	}
-
-	private Element buildFooterStart(
-			Element parentElement, int columnCount, String labelWidth) {
-		Element tdElement = appendChildElement("td", parentElement); //$NON-NLS-1$
-		appendAttribute(tdElement, "style", "vertical-align:top;"); //$NON-NLS-1$ //$NON-NLS-2$
-		appendAttribute(tdElement, "colspan", String.valueOf(columnCount)); //$NON-NLS-1$
-		Element tableElement = appendChildElement("table", tdElement); //$NON-NLS-1$
-		appendAttribute(tableElement, "cellpadding", "0"); //$NON-NLS-1$ //$NON-NLS-2$
-		appendAttribute(tableElement, "cellspacing", "0"); //$NON-NLS-1$ //$NON-NLS-2$
-		appendAttribute(tableElement, "border", "0"); //$NON-NLS-1$ //$NON-NLS-2$
-		appendAttribute(tableElement, "width", "100%"); //$NON-NLS-1$ //$NON-NLS-2$
-		Element tBodyElement = appendChildElement("tbody", tableElement); //$NON-NLS-1$
-		Element trElement = appendChildElement("tr", tBodyElement); //$NON-NLS-1$
-		String footerLabelWidth = null;
-		String footerFieldWidth = null;
-		if (labelWidth != null && labelWidth.length() > 0) {
-			if (labelWidth.endsWith("%")) { //$NON-NLS-1$
-				try {
-					int iLabelWidth = Integer.parseInt(labelWidth.substring(0, labelWidth.length() - 1));
-					iLabelWidth = iLabelWidth / columnCount;
-					footerLabelWidth = String.valueOf(iLabelWidth) + "%"; //$NON-NLS-1$
-					footerFieldWidth = String.valueOf(100 - iLabelWidth) + "%"; //$NON-NLS-1$
-				} catch(NumberFormatException nfe) {
-					//ignore - cannot calculate, widths remain null
-				}
-			} else {
-				footerLabelWidth = labelWidth;
-			}
-		}
-		Element tdLabelElement = appendChildElement("td", trElement); //$NON-NLS-1$
-		if (footerLabelWidth != null && footerLabelWidth.length() > 0) {
-			//appendAttribute(tdLabelElement, "style", "width:" + footerLabelWidth); //$NON-NLS-1$ //$NON-NLS-2$
-			appendAttribute(tdLabelElement, "width", footerLabelWidth); //$NON-NLS-1$
-		}
-		Element tdFieldElement = appendChildElement("td", trElement); //$NON-NLS-1$
-		if (footerFieldWidth != null && footerFieldWidth.length() > 0) {
-			//appendAttribute(tdFieldElement, "style", "width:" + footerFieldWidth); //$NON-NLS-1$ //$NON-NLS-2$
-			appendAttribute(tdFieldElement, "width", footerFieldWidth); //$NON-NLS-1$
-		}
-		return tBodyElement;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/PanelGroupLayoutOperation.java b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/PanelGroupLayoutOperation.java
deleted file mode 100644
index cc303c7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/PanelGroupLayoutOperation.java
+++ /dev/null
@@ -1,164 +0,0 @@
-/**
- * Copyright (c) 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle Corporation - initial API and implementation
- */
-package org.eclipse.jst.jsf.apache.trinidad.tagsupport.converter.operations;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.jsf.core.internal.tld.TagIdentifierFactory;
-import org.eclipse.jst.pagedesigner.converter.ConvertPosition;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.w3c.dom.Text;
-
-/**
- * ITransformOperation implementation specifically for the "panelGroupLayout"
- * JSF Element.
- * 
- * <br><b>Note:</b> requires ITransformOperation.setTagConverterContext(...) to
- * have been called to provide a valid ITagConverterContext instance prior to
- * a call to the transform(...) method.
- * 
- * @author Ian Trimble - Oracle
- */
-public class PanelGroupLayoutOperation extends AbstractTrinidadTransformOperation {
-
-	private static final int LAYOUT_DEFAULT = 0;
-	private static final int LAYOUT_HORIZONTAL = 1;
-	private static final int LAYOUT_VERTICAL = 2;
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.operations.AbstractTransformOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	@Override
-	public Element transform(Element srcElement, Element curElement) {
-		Element outerElement;
-
-		//create outer element and set element-specific attributes
-		final int layout = getLayout(srcElement);
-		Element containerElement;
-		switch (layout) {
-		case LAYOUT_HORIZONTAL:
-			outerElement = createElement("table"); //$NON-NLS-1$
-			outerElement.setAttribute("cellpadding", "0"); //$NON-NLS-1$ //$NON-NLS-2$
-			outerElement.setAttribute("cellspacing", "0"); //$NON-NLS-1$ //$NON-NLS-2$
-			outerElement.setAttribute("border", "0"); //$NON-NLS-1$ //$NON-NLS-2$
-			containerElement = appendChildElement("tr", outerElement); //$NON-NLS-1$
-			break;
-		case LAYOUT_VERTICAL:
-			outerElement = createElement("div"); //$NON-NLS-1$
-			containerElement = outerElement;
-			break;
-		default:
-			outerElement = createElement("span"); //$NON-NLS-1$
-			containerElement = outerElement;
-			break;
-		}
-
-		//set common attributes on outer element
-		final String styleClass = srcElement.getAttribute("styleClass"); //$NON-NLS-1$
-		if (styleClass != null && styleClass.length() > 0) {
-			outerElement.setAttribute("class", styleClass); //$NON-NLS-1$
-		}
-		final String inlineStyle = srcElement.getAttribute("inlineStyle"); //$NON-NLS-1$
-		if (inlineStyle != null && inlineStyle.length() > 0) {
-			outerElement.setAttribute("style", inlineStyle); //$NON-NLS-1$
-		}
-
-		//get child nodes, skipping "facet" elements and empty Text nodes
-		List<Node> childNodes = new ArrayList<Node>();
-		Iterator<Node> itCopyChildrenNodes = getCopyChildrenNodes(srcElement).iterator();
-		while (itCopyChildrenNodes.hasNext()) {
-			Node copyChildrenNode = itCopyChildrenNodes.next();
-			if (!(copyChildrenNode instanceof Element && TagIdentifierFactory.createDocumentTagWrapper((Element)copyChildrenNode).isSameTagType(IJSFConstants.TAG_IDENTIFIER_FACET))) {
-				if (!(copyChildrenNode instanceof Text && copyChildrenNode.getNodeValue().trim().length() < 1)) {
-					childNodes.add(copyChildrenNode);
-				}
-			}
-		}
-
-		//get "separator" facet's first child Element (only one used at runtime)
-		Element separatorElement = null;
-		final Element facetElement = getChildFacetByName(srcElement, "separator"); //$NON-NLS-1$
-		if (facetElement != null) {
-			NodeList facetChildNodes = facetElement.getChildNodes();
-			for (int i = 0; i < facetChildNodes.getLength(); i++) {
-				Node curChildNode = facetChildNodes.item(i);
-				if (curChildNode instanceof Element) {
-					separatorElement = (Element)curChildNode;
-					break;
-				}
-			}
-		}
-
-		//iterate over child nodes, interspersing separator(s) as required
-		int curChildNodeIndex = 0;
-		int curIndex = 0;
-		Iterator<Node> itChildNodes = childNodes.iterator();
-		switch (layout) {
-		case LAYOUT_HORIZONTAL:
-			while (itChildNodes.hasNext()) {
-				final Element childTDElement = appendChildElement("td", containerElement); //$NON-NLS-1$
-				tagConverterContext.addChild(itChildNodes.next(), new ConvertPosition(childTDElement, 0));
-				if (++curChildNodeIndex < childNodes.size()) {
-					if (separatorElement != null) {
-						final Element sepTDElement = appendChildElement("td", containerElement); //$NON-NLS-1$
-						tagConverterContext.addChild(separatorElement, new ConvertPosition(sepTDElement, 0));
-					}
-				}
-			}
-			break;
-		case LAYOUT_VERTICAL:
-			while (itChildNodes.hasNext()) {
-				tagConverterContext.addChild(itChildNodes.next(), new ConvertPosition(containerElement, curIndex++));
-				if (++curChildNodeIndex < childNodes.size()) {
-					final Element divElement = appendChildElement("div", containerElement); //$NON-NLS-1$
-					curIndex++;
-					if (separatorElement != null) {
-						tagConverterContext.addChild(separatorElement, new ConvertPosition(divElement, 0));
-					}
-				}
-			}
-			break;
-		default:
-			while (itChildNodes.hasNext()) {
-				tagConverterContext.addChild(itChildNodes.next(), new ConvertPosition(containerElement, curIndex++));
-				if (++curChildNodeIndex < childNodes.size()) {
-					if (separatorElement != null) {
-						tagConverterContext.addChild(separatorElement, new ConvertPosition(containerElement, curIndex++));
-					}
-				}
-			}
-			break;
-		}
-
-		return outerElement;
-	}
-
-	private int getLayout(Element srcElement) {
-		int layout = LAYOUT_DEFAULT;
-		if (srcElement != null) {
-			String layoutValue = srcElement.getAttribute("layout"); //$NON-NLS-1$
-			if (layoutValue != null) {
-				if (layoutValue.equals("horizontal")) { //$NON-NLS-1$
-					layout = LAYOUT_HORIZONTAL;
-				} else if (layoutValue.equals("vertical")) { //$NON-NLS-1$
-					layout = LAYOUT_VERTICAL;
-				}
-			}
-		}
-		return layout;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/PanelLabelAndMessageOperation.java b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/PanelLabelAndMessageOperation.java
deleted file mode 100644
index 93d9f7a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/PanelLabelAndMessageOperation.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/**
- * Copyright (c) 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle Corporation - initial API and implementation
- */
-package org.eclipse.jst.jsf.apache.trinidad.tagsupport.converter.operations;
-
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.jsf.core.internal.tld.TagIdentifierFactory;
-import org.eclipse.jst.pagedesigner.converter.ConvertPosition;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * ITransformOperation implementation specifically for the "panelLabelAndMessage"
- * JSF Element.
- * 
- * <br><b>Note:</b> requires ITransformOperation.setTagConverterContext(...) to
- * have been called to provide a valid ITagConverterContext instance prior to
- * a call to the transform(...) method.
- * 
- * @author Ian Trimble - Oracle
- */
-public class PanelLabelAndMessageOperation extends
-		AbstractLabelAndHelpOperation {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.apache.trinidad.tagsupport.converter.operations.AbstractLabelAndHelpOperation#appendControl(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	@Override
-	protected void appendControl(Element srcElement, Element parentElement) {
-		handleLabelStyle(srcElement, parentElement);
-		Element tableElement = appendChildElement("table", parentElement); //$NON-NLS-1$
-		appendAttribute(tableElement, "cellpadding", "0"); //$NON-NLS-1$ //$NON-NLS-2$
-		appendAttribute(tableElement, "cellspacing", "0"); //$NON-NLS-1$ //$NON-NLS-2$
-		appendAttribute(tableElement, "border", "0"); //$NON-NLS-1$ //$NON-NLS-2$
-		Element trElement = appendChildElement("tr", tableElement); //$NON-NLS-1$
-		Element tdElementLeft = appendChildElement("td", trElement); //$NON-NLS-1$
-		List<Node> childNodes = getCopyChildrenNodes(srcElement);
-		Iterator<Node> itChildNodes = childNodes.iterator();
-		int curIndex = 0;
-		while (itChildNodes.hasNext()) {
-			Node childNode = itChildNodes.next();
-			if (!(childNode instanceof Element &&
-					IJSFConstants.TAG_IDENTIFIER_FACET.isSameTagType(
-							TagIdentifierFactory.createDocumentTagWrapper((Element)childNode)))) {
-				tagConverterContext.addChild(
-						childNode, new ConvertPosition(tdElementLeft, curIndex++));
-			}
-		}
-		Element tdElementRight = appendChildElement("td", trElement); //$NON-NLS-1$
-		Element endFacetElement = getChildFacetByName(srcElement, "end"); //$NON-NLS-1$
-		if (endFacetElement != null) {
-			tagConverterContext.addChild(
-					endFacetElement, new ConvertPosition(tdElementRight, 0));
-		}
-	}
-
-	private void handleLabelStyle(Element srcElement, Element parentElement) {
-		String labelStyle = srcElement.getAttribute("labelStyle"); //$NON-NLS-1$
-		if (labelStyle != null && labelStyle.length() > 0) {
-			if (parentElement.getPreviousSibling() instanceof Element) {
-				Element labelTDElement = (Element)parentElement.getPreviousSibling();
-				labelTDElement.removeAttribute("valign"); //$NON-NLS-1$
-				String style = labelTDElement.getAttribute("style"); //$NON-NLS-1$
-				if (style != null && style.length() > 0) {
-					if (!style.endsWith(";")) { //$NON-NLS-1$
-						style += ";"; //$NON-NLS-1$
-					}
-					style += labelStyle;
-					appendAttribute(labelTDElement, "style", style); //$NON-NLS-1$
-				} else {
-					appendAttribute(labelTDElement, "style", labelStyle); //$NON-NLS-1$
-				}
-			}
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/PanelTabbedOperation.java b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/PanelTabbedOperation.java
deleted file mode 100644
index d270153..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/PanelTabbedOperation.java
+++ /dev/null
@@ -1,297 +0,0 @@
-/**
- * Copyright (c) 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle Corporation - initial API and implementation
- */
-package org.eclipse.jst.jsf.apache.trinidad.tagsupport.converter.operations;
-
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.jst.jsf.apache.trinidad.tagsupport.ITrinidadConstants;
-import org.eclipse.jst.jsf.apache.trinidad.tagsupport.Messages;
-import org.eclipse.jst.jsf.apache.trinidad.tagsupport.TrinidadUtils;
-import org.eclipse.jst.pagedesigner.converter.ConvertPosition;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.ITransformOperation;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.TransformOperationFactory;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * ITransformOperation implementation specifically for the "panelTabbed" JSF
- * Element.
- * 
- * <br><b>Note:</b> requires ITransformOperation.setTagConverterContext(...) to
- * have been called to provide a valid ITagConverterContext instance prior to
- * a call to the transform(...) method.
- * 
- * @author Ian Trimble - Oracle
- */
-public class PanelTabbedOperation extends AbstractTrinidadTransformOperation {
-
-	private static final int SEP_POS_BETWEEN = -1;
-	private static final int SEP_POS_START = 0;
-	private static final int SEP_POS_END = 1;
-
-	private static final String STYLECLASS_TABLE_ABOVE = "af_panelTabbed_orientation-top"; //$NON-NLS-1$
-	private static final String STYLECLASS_TABLE_BELOW = "af_panelTabbed_orientation-bottom"; //$NON-NLS-1$
-	private static final String STYLECLASS_SEPARATOR_START = "af_panelTabbed_cell-start"; //$NON-NLS-1$
-	private static final String STYLECLASS_SEPARATOR_END = "af_panelTabbed_cell-end"; //$NON-NLS-1$
-	private static final String STYLECLASS_CELL = "af_panelTabbed_tab-selected"; //$NON-NLS-1$
-	private static final String STYLECLASS_CELL_NOTDISCLOSED_OR_DISABLED = "af_panelTabbed_tab"; //$NON-NLS-1$
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.operations.AbstractTransformOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	@Override
-	public Element transform(Element srcElement, Element curElement) {
-		//create outer span element and set style and class attributes
-		Element spanElement = createElement("span"); //$NON-NLS-1$
-		ITransformOperation operation =
-			TransformOperationFactory.getInstance().getTransformOperation(
-					TransformOperationFactory.OP_CopyAttributeWithRenameOperation,
-					new String[]{"styleClass", "class"}); //$NON-NLS-1$  //$NON-NLS-2$
-		operation.transform(srcElement, spanElement);
-		operation =
-			TransformOperationFactory.getInstance().getTransformOperation(
-					TransformOperationFactory.OP_CopyAttributeWithRenameOperation,
-					new String[]{"inlineStyle", "style"}); //$NON-NLS-1$  //$NON-NLS-2$
-		operation.transform(srcElement, spanElement);
-
-		//get child showDetailItem elements
-		@SuppressWarnings("unchecked")
-		List<Node> showDetailItems = getChildElements(
-				srcElement, "showDetailItem"); //$NON-NLS-1$
-		if (showDetailItems.size() > 0) {
-
-			//determine tabs position ("both", "above", or "below" - default "both")
-			String tabsPosition = srcElement.getAttribute("position"); //$NON-NLS-1$
-			if (tabsPosition == null ||
-					!(tabsPosition.equalsIgnoreCase("above") || //$NON-NLS-1$
-					tabsPosition.equalsIgnoreCase("below"))) { //$NON-NLS-1$
-				tabsPosition = "both"; //$NON-NLS-1$
-			}
-
-			//need to track where showDetailItem is in relation to "tabs"
-			int showDetailItemConvertPosition = 0;
-
-			//write tabs "above" if specified
-			if ("above".equalsIgnoreCase(tabsPosition) || //$NON-NLS-1$
-					"both".equalsIgnoreCase(tabsPosition)) { //$NON-NLS-1$
-				appendTabs(srcElement, showDetailItems, spanElement, true);
-				showDetailItemConvertPosition++;
-			}
-
-			//copy current child showDetailItem
-			int currentEditorItem =
-				getCurrentShowDetailItem(srcElement, showDetailItems);
-			int curItem = 0;
-			Iterator<Node> itItems = showDetailItems.iterator();
-			while (itItems.hasNext()) {
-				Node nodeItem = itItems.next();
-				if (currentEditorItem == curItem) {
-					if (nodeItem instanceof Element) {
-						Element elemItem = (Element)nodeItem;
-						tagConverterContext.addChild(
-								elemItem,
-								new ConvertPosition(
-										spanElement,
-										showDetailItemConvertPosition));
-						break;
-					}
-				}
-				curItem++;
-			}
-
-			//write tabs "below" if specified
-			if ("below".equalsIgnoreCase(tabsPosition) || //$NON-NLS-1$
-					"both".equalsIgnoreCase(tabsPosition)) { //$NON-NLS-1$
-				appendTabs(srcElement, showDetailItems, spanElement, false);
-			}
-		} else {
-			appendAttribute(
-					spanElement,
-					"style", //$NON-NLS-1$
-					ITrinidadConstants.STYLE_EMPTYELEMENT);
-			appendChildText(
-					Messages.PanelTabbedOperation_EmptyPanelTabbedTag,
-					spanElement);
-		}
-			
-		return spanElement;
-	}
-
-	private void appendTabs(Element srcElement, List<Node> showDetailItems, Element spanElement, boolean above) {
-		Element tableElement = appendChildElement("table", spanElement); //$NON-NLS-1$
-		String tableStyleClass;
-		if (above) {
-			tableStyleClass = STYLECLASS_TABLE_ABOVE;
-		} else {
-			tableStyleClass = STYLECLASS_TABLE_BELOW;
-		}
-		appendAttribute(tableElement, "class", tableStyleClass); //$NON-NLS-1$
-		appendAttribute(tableElement, "cellpadding", "0"); //$NON-NLS-1$ //$NON-NLS-2$
-		appendAttribute(tableElement, "cellspacing", "0"); //$NON-NLS-1$ //$NON-NLS-2$
-		appendAttribute(tableElement, "border", "0"); //$NON-NLS-1$ //$NON-NLS-2$
-		appendAttribute(tableElement, "width", "100%"); //$NON-NLS-1$ //$NON-NLS-2$
-		appendAttribute(tableElement, "summary", ""); //$NON-NLS-1$ //$NON-NLS-2$
-		Element trElement = appendChildElement("tr", tableElement); //$NON-NLS-1$
-
-		//append first separator
-		appendSeparatorTD(trElement, SEP_POS_START);
-
-		int currentItem = getCurrentShowDetailItem(srcElement, showDetailItems);
-		int disclosedItem = calculateDisclosedShowDetailItem(showDetailItems);
-		int curItem = 0;
-
-		//iterate over showDetailItem elements
-		Iterator<Node> itItems = showDetailItems.iterator();
-		while (itItems.hasNext()) {
-			Node nodeItem = itItems.next();
-			if (nodeItem instanceof Element) {
-				Element elemItem = (Element)nodeItem;
-				appendShowDetailItemTD(
-						trElement,
-						elemItem,
-						currentItem == curItem,
-						disclosedItem == curItem);
-				if (curItem < showDetailItems.size() - 1) {
-					appendSeparatorTD(trElement);
-				}
-				curItem++;
-			}
-		}
-
-		//append last separator
-		appendSeparatorTD(trElement, SEP_POS_END);
-	}
-
-	private void appendSeparatorTD(Element trElement, int sepPosition) {
-		Element tdElement = appendChildElement("td", trElement); //$NON-NLS-1$
-		if (sepPosition == SEP_POS_START) {
-			appendAttribute(tdElement, "class", STYLECLASS_SEPARATOR_START); //$NON-NLS-1$
-		} else if (sepPosition == SEP_POS_END) {
-			appendAttribute(tdElement, "class", STYLECLASS_SEPARATOR_END); //$NON-NLS-1$
-		}
-		Element bElement = appendChildElement("b", tdElement); //$NON-NLS-1$
-		appendAttribute(bElement, "style", "margin-left:0px;"); //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	private void appendSeparatorTD(Element trElement) {
-		appendSeparatorTD(trElement, SEP_POS_BETWEEN);
-	}
-
-	private void appendShowDetailItemTD(Element trElement, Element showDetailItem, boolean isCurrent, boolean isDisclosed) {
-		boolean isDisabled = false;
-		String attrShowDetailItemDisabled = showDetailItem.getAttribute("disabled"); //$NON-NLS-1$
-		if (Boolean.TRUE.toString().equalsIgnoreCase(attrShowDetailItemDisabled)) {
-			isDisabled = true;
-		}
-		Element tdElement = appendChildElement("td", trElement); //$NON-NLS-1$
-		appendAttribute(tdElement, "height", "1"); //$NON-NLS-1$ //$NON-NLS-2$
-		appendAttribute(tdElement, "nowrap", "nowrap"); //$NON-NLS-1$ //$NON-NLS-2$
-		String tdStyleClass;
-		if (isDisclosed && !isDisabled) {
-			tdStyleClass = STYLECLASS_CELL;
-		} else {
-			tdStyleClass = STYLECLASS_CELL_NOTDISCLOSED_OR_DISABLED;
-		}
-		appendAttribute(tdElement, "class", tdStyleClass); //$NON-NLS-1$
-		Element aElement = appendChildElement("a", tdElement); //$NON-NLS-1$
-		String aStyle;
-		if (isDisabled) {
-			appendAttribute(aElement, "name", "name"); //$NON-NLS-1$ //$NON-NLS-2$
-			aStyle = "color:#999999;"; //$NON-NLS-1$
-		} else {
-			appendAttribute(aElement, "href", "#"); //$NON-NLS-1$ //$NON-NLS-2$
-			if (isDisclosed) {
-				aStyle = "color:#669966;text-decoration:none;"; //$NON-NLS-1$
-			} else {
-				aStyle = "color:#003333;"; //$NON-NLS-1$
-			}
-		}
-		if (isCurrent) {
-			aStyle += "border:1px solid #99cc99;padding:2px;"; //$NON-NLS-1$
-		}
-		String attrShowDetailItemInlineStyle = showDetailItem.getAttribute("inlineStyle"); //$NON-NLS-1$
-		if (attrShowDetailItemInlineStyle != null &&
-				attrShowDetailItemInlineStyle.length() > 0) {
-			aStyle += attrShowDetailItemInlineStyle;
-		}
-		if (aStyle.length() > 0) {
-			appendAttribute(aElement, "style", aStyle); //$NON-NLS-1$
-		}
-		ITransformOperation operation =
-			TransformOperationFactory.getInstance().getTransformOperation(
-					TransformOperationFactory.OP_CopyAttributeWithRenameOperation,
-					new String[]{"styleClass", "class"}); //$NON-NLS-1$ //$NON-NLS-2$
-		operation.transform(showDetailItem, aElement);
-		String attrShowDetailItemTextAndAccessKey = showDetailItem.getAttribute("textAndAccessKey"); //$NON-NLS-1$
-		if (attrShowDetailItemTextAndAccessKey != null &&
-				attrShowDetailItemTextAndAccessKey.length() > 0) {
-			appendChildText(attrShowDetailItemTextAndAccessKey, aElement);
-		} else {
-			String attrShowDetailItemText = showDetailItem.getAttribute("text"); //$NON-NLS-1$
-			if (attrShowDetailItemText != null && attrShowDetailItemText.length() > 0) {
-				appendChildText(attrShowDetailItemText, aElement);
-			}
-		}
-	}
-
-	private int getCurrentShowDetailItem(
-			Element srcElement, List<Node> showDetailItems) {
-		int disclosedItem = TrinidadUtils.getCurrentChildIndex(srcElement);
-		if (disclosedItem == -1) {
-			disclosedItem = calculateDisclosedShowDetailItem(showDetailItems);
-			TrinidadUtils.setCurrentChildIndex(srcElement, disclosedItem);
-		}
-		return disclosedItem;
-	}
-
-	private int calculateDisclosedShowDetailItem(List<Node> showDetailItems) {
-		int disclosedItem = -1;
-		int curItem = 0;
-		Iterator<Node> itItems = showDetailItems.iterator();
-		while (itItems.hasNext()) {
-			Node item = itItems.next();
-			if (item instanceof Element) {
-				Element elemItem = (Element)item;
-				String attrDisclosedVal = elemItem.getAttribute("disclosed"); //$NON-NLS-1$
-				if (Boolean.TRUE.toString().equalsIgnoreCase(
-						attrDisclosedVal)) {
-					disclosedItem = curItem;
-					break;
-				}
-			}
-			curItem++;
-		}
-		//if none explicitly disclosed, consider first non-disabled tab disclosed
-		if (disclosedItem == -1) {
-			curItem = 0;
-			itItems = showDetailItems.iterator();
-			while (itItems.hasNext()) {
-				Node item = itItems.next();
-				if (item instanceof Element) {
-					Element elemItem = (Element)item;
-					String attrDisabledVal = elemItem.getAttribute("disabled"); //$NON-NLS-1$
-					if (!(Boolean.TRUE.toString().equalsIgnoreCase(attrDisabledVal))) {
-						disclosedItem = curItem;
-						break;
-					}
-				}
-				curItem++;
-			}
-		}
-		//if none explicitly disclosed and all disabled, consider first tab disclosed
-		if (disclosedItem == -1) {
-			disclosedItem = 0;
-		}
-		return disclosedItem;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/SelectBooleanOperation.java b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/SelectBooleanOperation.java
deleted file mode 100644
index 55ee08e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/SelectBooleanOperation.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/**
- * Copyright (c) 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle Corporation - initial API and implementation
- */
-package org.eclipse.jst.jsf.apache.trinidad.tagsupport.converter.operations;
-
-import org.w3c.dom.Element;
-
-/**
- * ITransformOperation implementation specifically for any "selectBoolean..."
- * JSF Elements.
- * 
- * <br><b>Note:</b> requires ITransformOperation.setTagConverterContext(...) to
- * have been called to provide a valid ITagConverterContext instance prior to
- * a call to the transform(...) method.
- * 
- * @author Ian Trimble - Oracle
- */
-public class SelectBooleanOperation extends AbstractLabelAndHelpOperation {
-
-	private String inputType;
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.apache.trinidad.tagsupport.converter.operations.AbstractLabelAndHelpOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	@Override
-	public Element transform(Element srcElement, Element curElement) {
-		if (getParameters().length < 1) {
-			getLog().error("Warning.TransformOperationFactory.TooFewParameters", getTransformOperationID()); //$NON-NLS-1$
-			return null;
-		} else {
-			inputType = getParameters()[0];
-		}
-		return super.transform(srcElement, curElement);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.apache.trinidad.tagsupport.converter.operations.AbstractLabelAndHelpOperation#appendControl(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	@Override
-	protected void appendControl(Element srcElement, Element parentElement) {
-		Element spanElement = appendChildElement("span", parentElement); //$NON-NLS-1$
-		Element inputElement = appendChildElement("input", spanElement); //$NON-NLS-1$
-		appendAttribute(inputElement, "type", inputType); //$NON-NLS-1$
-		Element labelElement = appendChildElement("label", spanElement); //$NON-NLS-1$
-		String textAndAccessKey = srcElement.getAttribute("textAndAccessKey"); //$NON-NLS-1$
-		if (textAndAccessKey != null && textAndAccessKey.length() > 0) {
-			appendChildText(textAndAccessKey, labelElement);
-		} else {
-			String text = srcElement.getAttribute("text"); //$NON-NLS-1$
-			if (text != null) {
-				appendChildText(text, labelElement);
-			}
-		}
-		//append common attributes
-		appendAttribute(inputElement, "class", STYLECLASS_CONTROLELEMENT); //$NON-NLS-1$
-		String contentStyle = calculateStyle(null, srcElement, "contentStyle"); //$NON-NLS-1$
-		if (contentStyle != null) {
-			appendAttribute(inputElement, "style", contentStyle); //$NON-NLS-1$
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/SelectListboxChoiceOperation.java b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/SelectListboxChoiceOperation.java
deleted file mode 100644
index 1e50769..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/SelectListboxChoiceOperation.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/**
- * Copyright (c) 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle Corporation - initial API and implementation
- */
-package org.eclipse.jst.jsf.apache.trinidad.tagsupport.converter.operations;
-
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.jst.jsf.apache.trinidad.tagsupport.model.SelectItem;
-import org.eclipse.jst.jsf.apache.trinidad.tagsupport.model.SelectItemModel;
-import org.w3c.dom.Element;
-
-/**
- * ITransformOperation implementation specifically for "selectManyListbox",
- * "selectOneListbox", and "selectOneChoice" JSF Elements.
- * 
- * <br><b>Note:</b> requires ITransformOperation.setTagConverterContext(...) to
- * have been called to provide a valid ITagConverterContext instance prior to
- * a call to the transform(...) method.
- * 
- * @author Ian Trimble - Oracle
- */
-public class SelectListboxChoiceOperation extends AbstractLabelAndHelpOperation {
-
-	private boolean isMultiple;
-	private boolean showSize;
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.apache.trinidad.tagsupport.converter.operations.AbstractLabelAndHelpOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	@Override
-	public Element transform(Element srcElement, Element curElement) {
-		if (getParameters().length < 2) {
-			getLog().error("Warning.TransformOperationFactory.TooFewParameters", getTransformOperationID()); //$NON-NLS-1$
-			return null;
-		} else {
-			isMultiple = Boolean.parseBoolean(getParameters()[0]);
-			showSize = Boolean.parseBoolean(getParameters()[1]);
-		}
-		return super.transform(srcElement, curElement);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.apache.trinidad.tagsupport.converter.operations.AbstractLabelAndHelpOperation#appendControl(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	@Override
-	protected void appendControl(Element srcElement, Element parentElement) {
-		Element selectElement = appendChildElement("select", parentElement); //$NON-NLS-1$
-		if (isMultiple) {
-			appendAttribute(selectElement, "multiple", ""); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-		List<SelectItem> selectItems = SelectItemModel.getModel(srcElement);
-		if (showSize) {
-			int size;
-			String attrSize = srcElement.getAttribute("size"); //$NON-NLS-1$
-			if (attrSize != null && attrSize.length() > 0) {
-				try {
-					size = Integer.parseInt(attrSize);
-				} catch(NumberFormatException nfe) {
-					size = 1;
-				}
-			} else {
-				size = 1;
-			}
-			size = Math.max(size, selectItems.size());
-			appendAttribute(selectElement, "size", String.valueOf(size)); //$NON-NLS-1$
-		}
-		boolean isFirstSelectItem = !isMultiple;
-		Iterator<SelectItem> itSelectItems = selectItems.iterator();
-		while (itSelectItems.hasNext()) {
-			SelectItem selectItem = itSelectItems.next();
-			Element optionElement = appendChildElement("option", selectElement); //$NON-NLS-1$
-			if (isFirstSelectItem) {
-				appendAttribute(optionElement, "selected", ""); //$NON-NLS-1$ //$NON-NLS-2$
-				isFirstSelectItem = false;
-			}
-			appendChildText(selectItem.getLabel(), optionElement);
-		}
-		//append common attributes
-		appendAttribute(selectElement, "class", STYLECLASS_CONTROLELEMENT); //$NON-NLS-1$
-		String contentStyle = calculateStyle(null, srcElement, "contentStyle"); //$NON-NLS-1$
-		if (contentStyle != null) {
-			appendAttribute(selectElement, "style", contentStyle); //$NON-NLS-1$
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/SelectManyCheckboxOneRadioOperation.java b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/SelectManyCheckboxOneRadioOperation.java
deleted file mode 100644
index a06a48c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/SelectManyCheckboxOneRadioOperation.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/**
- * Copyright (c) 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle Corporation - initial API and implementation
- */
-package org.eclipse.jst.jsf.apache.trinidad.tagsupport.converter.operations;
-
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.jst.jsf.apache.trinidad.tagsupport.model.SelectItem;
-import org.eclipse.jst.jsf.apache.trinidad.tagsupport.model.SelectItemModel;
-import org.w3c.dom.Element;
-
-/**
- * ITransformOperation implementation specifically for "selectManyCheckbox" and
- * "selectOneRadio" JSF Elements.
- * 
- * <br><b>Note:</b> requires ITransformOperation.setTagConverterContext(...) to
- * have been called to provide a valid ITagConverterContext instance prior to
- * a call to the transform(...) method.
- * 
- * @author Ian Trimble - Oracle
- */
-public class SelectManyCheckboxOneRadioOperation extends AbstractLabelAndHelpOperation {
-
-	private String inputType;
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.apache.trinidad.tagsupport.converter.operations.AbstractLabelAndHelpOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	@Override
-	public Element transform(Element srcElement, Element curElement) {
-		if (getParameters().length < 1) {
-			getLog().error("Warning.TransformOperationFactory.TooFewParameters", getTransformOperationID()); //$NON-NLS-1$
-			return null;
-		} else {
-			inputType = getParameters()[0];
-		}
-		return super.transform(srcElement, curElement);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.apache.trinidad.tagsupport.converter.operations.AbstractLabelAndHelpOperation#appendControl(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	@Override
-	protected void appendControl(Element srcElement, Element parentElement) {
-		Element spanElement = appendChildElement("span", parentElement); //$NON-NLS-1$
-		String layout = srcElement.getAttribute("layout"); //$NON-NLS-1$
-		List<SelectItem> selectItems = SelectItemModel.getModel(srcElement);
-		Iterator<SelectItem> itSelectItems = selectItems.iterator();
-		while (itSelectItems.hasNext()) {
-			SelectItem selectItem = itSelectItems.next();
-			Element inputElement = appendChildElement("input", spanElement); //$NON-NLS-1$
-			appendAttribute(inputElement, "type", inputType); //$NON-NLS-1$
-			Element labelElement = appendChildElement("label", spanElement); //$NON-NLS-1$
-			appendChildText(selectItem.getLabel(), labelElement);
-			if (layout == null || !layout.equals("horizontal")) { //$NON-NLS-1$
-				if (itSelectItems.hasNext()) {
-					appendChildElement("br", spanElement); //$NON-NLS-1$
-				}
-			}
-		}
-		//append common attributes
-		appendAttribute(spanElement, "class", STYLECLASS_CONTROLELEMENT); //$NON-NLS-1$
-		String contentStyle = calculateStyle(null, srcElement, "contentStyle"); //$NON-NLS-1$
-		if (contentStyle != null) {
-			appendAttribute(spanElement, "style", contentStyle); //$NON-NLS-1$
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/SelectShuttleOperation.java b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/SelectShuttleOperation.java
deleted file mode 100644
index aa71833..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/SelectShuttleOperation.java
+++ /dev/null
@@ -1,260 +0,0 @@
-/**
- * Copyright (c) 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle Corporation - initial API and implementation
- */
-package org.eclipse.jst.jsf.apache.trinidad.tagsupport.converter.operations;
-
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.jst.jsf.apache.trinidad.tagsupport.Messages;
-import org.eclipse.jst.jsf.apache.trinidad.tagsupport.model.SelectItem;
-import org.eclipse.jst.jsf.apache.trinidad.tagsupport.model.SelectItemModel;
-import org.eclipse.jst.pagedesigner.converter.ConvertPosition;
-import org.w3c.dom.Element;
-
-/**
- * ITransformOperation implementation specifically for "selectManyShuttle" and
- * "selectOrderShuttle" JSF Elements.
- * 
- * <br><b>Note:</b> requires ITransformOperation.setTagConverterContext(...) to
- * have been called to provide a valid ITagConverterContext instance prior to
- * a call to the transform(...) method.
- * 
- * @author Ian Trimble - Oracle
- */
-public class SelectShuttleOperation extends AbstractTrinidadTransformOperation {
-
-	private static final String STYLECLASS_OUTERTABLE = "af_selectManyShuttle p_AFRequired"; //$NON-NLS-1$
-	private static final String STYLECLASS_HEADER = "OraShuttleHeader"; //$NON-NLS-1$
-	private static final String STYLECLASS_REQUIRED = "AFRequiredIconStyle"; //$NON-NLS-1$
-	private static final String STYLECLASS_LISTCOLUMN = "af_selectManyShuttle_box-content"; //$NON-NLS-1$
-	private static final String STYLECLASS_SELECT = "af_selectManyListbox_content"; //$NON-NLS-1$
-	private static final String STYLECLASS_DESCRIPTION = "AFInstructionText"; //$NON-NLS-1$
-	private static final String STYLECLASS_LINK = "OraLinkText"; //$NON-NLS-1$
-	private static final String DEFAULT_SIZE = "10"; //$NON-NLS-1$
-
-	private static final String[] LINKS_MOVE = new String[]{
-		Messages.SelectShuttleOperation_LinkMove,
-		Messages.SelectShuttleOperation_LinkMoveAll,
-		Messages.SelectShuttleOperation_LinkRemove,
-		Messages.SelectShuttleOperation_LinkRemoveAll
-	};
-	private static final String[] LINKS_ORDER = new String[]{
-		Messages.SelectShuttleOperation_LinkTop,
-		Messages.SelectShuttleOperation_LinkUp,
-		Messages.SelectShuttleOperation_LinkDown,
-		Messages.SelectShuttleOperation_LinkBottom
-	};
-
-	private boolean showOrderLinks;
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.operations.AbstractTransformOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	@Override
-	public Element transform(Element srcElement, Element curElement) {
-		//get parameter
-		if (getParameters().length < 1) {
-			getLog().error("Warning.TransformOperationFactory.TooFewParameters", getTransformOperationID()); //$NON-NLS-1$
-			return null;
-		} else {
-			showOrderLinks = Boolean.parseBoolean(getParameters()[0]);
-		}
-		
-		//build outer table element
-		Element outerTableElement = createElement("table"); //$NON-NLS-1$
-		appendAttribute(outerTableElement, "cellpadding", "0"); //$NON-NLS-1$ //$NON-NLS-2$
-		appendAttribute(outerTableElement, "cellspacing", "0"); //$NON-NLS-1$ //$NON-NLS-2$
-		appendAttribute(outerTableElement, "border", "0"); //$NON-NLS-1$ //$NON-NLS-2$
-		appendAttribute(outerTableElement, "width", "10%"); //$NON-NLS-1$ //$NON-NLS-2$
-		String inlineStyle = srcElement.getAttribute("inlineStyle"); //$NON-NLS-1$
-		if (inlineStyle != null && inlineStyle.length() > 0) {
-			appendAttribute(outerTableElement, "style", inlineStyle); //$NON-NLS-1$
-		}
-		String styleClass = srcElement.getAttribute("styleClass"); //$NON-NLS-1$
-		if (styleClass != null && styleClass.length() > 0) {
-			appendAttribute(outerTableElement, "class", styleClass + " " + STYLECLASS_OUTERTABLE); //$NON-NLS-1$ //$NON-NLS-2$
-		} else {
-			appendAttribute(outerTableElement, "class", STYLECLASS_OUTERTABLE); //$NON-NLS-1$
-		}
-
-		//build header row
-		Element trHeaderElement = appendChildElement("tr", outerTableElement); //$NON-NLS-1$
-		Element tdLeadingHeaderElement = appendChildElement("td", trHeaderElement); //$NON-NLS-1$
-		String leadingHeader = srcElement.getAttribute("leadingHeader"); //$NON-NLS-1$
-		if (leadingHeader != null && leadingHeader.length() > 0) {
-			appendAttribute(tdLeadingHeaderElement, "class", STYLECLASS_HEADER); //$NON-NLS-1$
-			appendAttribute(tdLeadingHeaderElement, "valign", "bottom"); //$NON-NLS-1$ //$NON-NLS-2$
-			appendChildText(leadingHeader, tdLeadingHeaderElement);
-		}
-		appendChildElement("td", trHeaderElement); //$NON-NLS-1$
-		Element tdTrailingHeaderElement = appendChildElement("td", trHeaderElement); //$NON-NLS-1$
-		String required = srcElement.getAttribute("required"); //$NON-NLS-1$
-		String trailingHeader = srcElement.getAttribute("trailingHeader"); //$NON-NLS-1$
-		if ((required != null && Boolean.parseBoolean(required)) || (trailingHeader != null && trailingHeader.length() > 0)) {
-			appendAttribute(tdTrailingHeaderElement, "class", STYLECLASS_HEADER); //$NON-NLS-1$
-			appendAttribute(tdTrailingHeaderElement, "valign", "bottom"); //$NON-NLS-1$ //$NON-NLS-2$
-			if (required != null && Boolean.parseBoolean(required)) {
-				Element spanRequiredElement = appendChildElement("span", tdTrailingHeaderElement); //$NON-NLS-1$
-				appendAttribute(spanRequiredElement, "class", STYLECLASS_REQUIRED); //$NON-NLS-1$
-				appendChildText("*", spanRequiredElement); //$NON-NLS-1$
-			}
-			if (trailingHeader != null && trailingHeader.length() > 0) {
-				appendChildText(trailingHeader, tdTrailingHeaderElement);
-			}
-		}
-
-		//build content row
-		Element trContentElement = appendChildElement("tr", outerTableElement); //$NON-NLS-1$
-		buildListColumn(srcElement, trContentElement, true);
-		buildLinkColumn(trContentElement, LINKS_MOVE);
-		buildListColumn(srcElement, trContentElement, false);
-
-		return outerTableElement;
-	}
-
-	private void buildListColumn(Element srcElement, Element parentElement, boolean isLeadingColumn) {
-		//build outer structure
-		Element tdElement0 = appendChildElement("td", parentElement); //$NON-NLS-1$
-		Element tableElement0 = appendChildElement("table", tdElement0); //$NON-NLS-1$
-		appendAttribute(tableElement0, "style", "width:100%;"); //$NON-NLS-1$ //$NON-NLS-2$
-		appendAttribute(tableElement0, "cellpadding", "0"); //$NON-NLS-1$ //$NON-NLS-2$
-		appendAttribute(tableElement0, "cellspacing", "0"); //$NON-NLS-1$ //$NON-NLS-2$
-		appendAttribute(tableElement0, "border", "0"); //$NON-NLS-1$ //$NON-NLS-2$
-		Element tbodyElement0 = appendChildElement("tbody", tableElement0); //$NON-NLS-1$
-		Element trElement0 = appendChildElement("tr", tbodyElement0); //$NON-NLS-1$
-		Element tdElement1 = appendChildElement("td", trElement0); //$NON-NLS-1$
-		Element divElement0 = appendChildElement("div", tdElement1); //$NON-NLS-1$
-		appendAttribute(divElement0, "class", STYLECLASS_LISTCOLUMN); //$NON-NLS-1$
-		Element tableElement1 = appendChildElement("table", divElement0); //$NON-NLS-1$
-		appendAttribute(tableElement1, "cellpadding", "0"); //$NON-NLS-1$ //$NON-NLS-2$
-		appendAttribute(tableElement1, "border", "0"); //$NON-NLS-1$ //$NON-NLS-2$
-
-		//build filter structure
-		if (isLeadingColumn) {
-			Element filterFacet = getChildFacetByName(srcElement, "filter"); //$NON-NLS-1$
-			if (filterFacet != null) {
-				Element trFilterElement = appendChildElement("tr", tableElement1); //$NON-NLS-1$
-				Element tdFilterElement = appendChildElement("td", trFilterElement); //$NON-NLS-1$
-				appendAttribute(tdFilterElement, "nowrap", ""); //$NON-NLS-1$ //$NON-NLS-2$
-				appendAttribute(tdFilterElement, "valign", "middle"); //$NON-NLS-1$ //$NON-NLS-2$
-				appendAttribute(tdFilterElement, "colspan", "3"); //$NON-NLS-1$ //$NON-NLS-2$
-				tagConverterContext.addChild(filterFacet, new ConvertPosition(tdFilterElement, 0));
-			}
-		}
-
-		//build select element structure
-		Element trSelectElement = appendChildElement("tr", tableElement1); //$NON-NLS-1$
-		Element tdSelectElement = appendChildElement("td", trSelectElement); //$NON-NLS-1$
-		appendAttribute(tdSelectElement, "nowrap", ""); //$NON-NLS-1$ //$NON-NLS-2$
-		appendAttribute(tdSelectElement, "valign", "middle"); //$NON-NLS-1$ //$NON-NLS-2$
-		Element spanSelectElement = appendChildElement("span", tdSelectElement); //$NON-NLS-1$
-		Element selectElement = appendChildElement("select", spanSelectElement); //$NON-NLS-1$
-		appendAttribute(selectElement, "multiple", ""); //$NON-NLS-1$ //$NON-NLS-2$
-		appendAttribute(selectElement, "class", STYLECLASS_SELECT); //$NON-NLS-1$
-		appendAttribute(selectElement, "size", getSizeString(srcElement)); //$NON-NLS-1$
-
-		if (isLeadingColumn) {
-			List<SelectItem> selectItems = SelectItemModel.getModel(srcElement);
-			Iterator<SelectItem> itSelectItems = selectItems.iterator();
-			while (itSelectItems.hasNext()) {
-				SelectItem selectItem = itSelectItems.next();
-				Element optionElement = appendChildElement("option", selectElement); //$NON-NLS-1$
-				appendChildText(selectItem.getLabel(), optionElement);
-			}
-		}
-		Element optionElement = appendChildElement("option", selectElement); //$NON-NLS-1$
-		appendChildText("_______________", optionElement); //$NON-NLS-1$
-
-		//build order links
-		if (!isLeadingColumn && showOrderLinks) {
-			buildLinkColumn(trSelectElement, LINKS_ORDER);
-		}
-
-		//build description structure
-		boolean showDesc = false;
-		String showDescAttrName;
-		if (isLeadingColumn) {
-			showDescAttrName = "leadingDescShown"; //$NON-NLS-1$
-		} else {
-			showDescAttrName = "trailingDescShown"; //$NON-NLS-1$
-		}
-		String showDescAttr = srcElement.getAttribute(showDescAttrName);
-		if (showDescAttr != null && showDescAttr.length() > 0) {
-			showDesc = Boolean.parseBoolean(showDescAttr);
-		}
-		if (showDesc) {
-			Element trDescElement = appendChildElement("tr", tableElement1); //$NON-NLS-1$
-			Element tdDescElement = appendChildElement("td", trDescElement); //$NON-NLS-1$
-			appendAttribute(tdDescElement, "nowrap", ""); //$NON-NLS-1$ //$NON-NLS-2$
-			appendAttribute(tdDescElement, "valign", "middle"); //$NON-NLS-1$ //$NON-NLS-2$
-			appendAttribute(tdDescElement, "colspan", "3"); //$NON-NLS-1$ //$NON-NLS-2$
-			Element spanDescElement = appendChildElement("span", tdDescElement); //$NON-NLS-1$
-			appendAttribute(spanDescElement, "class", STYLECLASS_DESCRIPTION); //$NON-NLS-1$
-			appendChildText(Messages.SelectShuttleOperation_Description, spanDescElement);
-			appendChildElement("div", tdDescElement); //$NON-NLS-1$
-			Element textareaElement = appendChildElement("textarea", tdDescElement); //$NON-NLS-1$
-			appendAttribute(textareaElement, "rows", "2"); //$NON-NLS-1$ //$NON-NLS-2$
-			appendAttribute(textareaElement, "cols", "18"); //$NON-NLS-1$ //$NON-NLS-2$
-			appendAttribute(textareaElement, "readonly", ""); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-
-		//build footer structure
-		String footerFacetName;
-		if (isLeadingColumn) {
-			footerFacetName = "leadingFooter"; //$NON-NLS-1$
-		} else {
-			footerFacetName = "trailingFooter"; //$NON-NLS-1$
-		}
-		Element footerFacet = getChildFacetByName(srcElement, footerFacetName); 
-		if (footerFacet != null) {
-			Element trFooterElement = appendChildElement("tr", tableElement1); //$NON-NLS-1$
-			Element tdFooterElement = appendChildElement("td", trFooterElement); //$NON-NLS-1$
-			appendAttribute(tdFooterElement, "nowrap", ""); //$NON-NLS-1$ //$NON-NLS-2$
-			appendAttribute(tdFooterElement, "valign", "middle"); //$NON-NLS-1$ //$NON-NLS-2$
-			appendAttribute(tdFooterElement, "colspan", "3"); //$NON-NLS-1$ //$NON-NLS-2$
-			tagConverterContext.addChild(footerFacet, new ConvertPosition(tdFooterElement, 0));
-		}
-	}
-
-	private void buildLinkColumn(Element parentElement, String[] linkText) {
-		Element tdElement = appendChildElement("td", parentElement); //$NON-NLS-1$
-		appendAttribute(tdElement, "align", "center"); //$NON-NLS-1$ //$NON-NLS-2$
-		appendAttribute(tdElement, "valign", "middle"); //$NON-NLS-1$ //$NON-NLS-2$
-		appendAttribute(tdElement, "nowrap", ""); //$NON-NLS-1$ //$NON-NLS-2$
-		appendAttribute(tdElement, "style", "padding:5px;"); //$NON-NLS-1$ //$NON-NLS-2$
-		for (int i = 0; i < linkText.length; i++) {
-			Element aElement = appendChildElement("a", tdElement); //$NON-NLS-1$
-			appendAttribute(aElement, "href", "#"); //$NON-NLS-1$ //$NON-NLS-2$
-			appendAttribute(aElement, "class", STYLECLASS_LINK); //$NON-NLS-1$
-			appendChildText(linkText[i], aElement);
-			if (i < linkText.length - 1) {
-				appendChildElement("br", tdElement); //$NON-NLS-1$
-			}
-		}
-	}
-
-	private String getSizeString(Element srcElement) {
-		String size = DEFAULT_SIZE;
-		String sizeAttr = srcElement.getAttribute("size"); //$NON-NLS-1$
-		if (sizeAttr != null && sizeAttr.length() > 0) {
-			try {
-				int iSize = Integer.parseInt(sizeAttr);
-				iSize = Math.max(iSize, 10);
-				iSize = Math.min(iSize, 20);
-				size = String.valueOf(iSize);
-			} catch(NumberFormatException nfe) {
-				//ignore - default of "10" will be returned
-			}
-		}
-		return size;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/ShowDetailItemOperation.java b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/ShowDetailItemOperation.java
deleted file mode 100644
index 4cc3952..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/ShowDetailItemOperation.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/**
- * Copyright (c) 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle Corporation - initial API and implementation
- */
-package org.eclipse.jst.jsf.apache.trinidad.tagsupport.converter.operations;
-
-import org.eclipse.jst.jsf.apache.trinidad.tagsupport.ITrinidadConstants;
-import org.eclipse.jst.jsf.apache.trinidad.tagsupport.Messages;
-import org.eclipse.jst.jsf.core.internal.tld.TagIdentifierFactory;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * ITransformOperation implementation specifically for the "showDetailItem" JSF
- * Element.
- * 
- * <br><b>Note:</b> requires ITransformOperation.setTagConverterContext(...) to
- * have been called to provide a valid ITagConverterContext instance prior to
- * a call to the transform(...) method.
- * 
- * @author Ian Trimble - Oracle
- */
-public class ShowDetailItemOperation extends AbstractTrinidadTransformOperation {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.operations.AbstractTransformOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	@Override
-	public Element transform(Element srcElement, Element curElement) {
-
-		/*
-		 * We need to represent showDetailItem as a container on the design
-		 * canvas, so we need to return a top-level element to contain converted
-		 * child elements. However, at runtime, it is the parent that renders
-		 * the container element for showDetailItem's children. Therefore, we
-		 * need to determine the parent element in order to know what top-level
-		 * element it will render at runtime. There's no obvious way to do this
-		 * using generic operations alone; hence, we need this specialization.
-		 */
-
-		Element topElement = null;
-
-		/*
-		 * create top-level element type, which may differ depending on parent
-		 * element
-		 */
-		Element parentSrcElement = getParentElement(srcElement);
-		if (ITrinidadConstants.TAG_IDENTIFIER_PANELTABBED.isSameTagType(
-				TagIdentifierFactory.createDocumentTagWrapper(parentSrcElement))) {
-			topElement = createElement("div"); //$NON-NLS-1$
-		} else {
-			//default to div element
-			topElement = createElement("div"); //$NON-NLS-1$
-		}
-
-		if (getCopyChildrenNodes(srcElement).size() > 0) {
-			//copy all children
-			tagConverterContext.copyChildren(srcElement, topElement);
-		} else {
-			appendAttribute(
-					topElement,
-					"style", //$NON-NLS-1$
-					ITrinidadConstants.STYLE_EMPTYELEMENT);
-			appendChildText(
-					Messages.ShowDetailItemOperation_EmptyShowDetailItemTag,
-					topElement);
-		}
-		return topElement;
-	}
-
-	private Element getParentElement(Node node) {
-		Element parentElement = null;
-		Node curNode = node;
-		while (curNode != null) {
-			curNode = curNode.getParentNode();
-			if (curNode instanceof Element) {
-				parentElement = (Element)curNode;
-				break;
-			}
-		}
-		return parentElement;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/dtresourceprovider/TrinidadDTResourceProvider.java b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/dtresourceprovider/TrinidadDTResourceProvider.java
deleted file mode 100644
index 5664642..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/dtresourceprovider/TrinidadDTResourceProvider.java
+++ /dev/null
@@ -1,163 +0,0 @@
-/**
- * Copyright (c) 2009 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- */
-package org.eclipse.jst.jsf.apache.trinidad.tagsupport.dtresourceprovider;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.net.URL;
-import java.util.Collections;
-import java.util.jar.JarEntry;
-import java.util.jar.JarInputStream;
-
-import org.eclipse.core.runtime.FileLocator;
-import org.eclipse.jst.jsf.apache.trinidad.tagsupport.Messages;
-import org.eclipse.jst.jsf.apache.trinidad.tagsupport.TrinidadTagSupportActivator;
-import org.eclipse.jst.pagedesigner.dtresourceprovider.DefaultDTResourceProvider;
-import org.eclipse.jst.pagedesigner.dtresourceprovider.DefaultDTSkin;
-
-public class TrinidadDTResourceProvider extends DefaultDTResourceProvider {
-
-	private static final String ID = "http://myfaces.apache.org/trinidad"; //$NON-NLS-1$
-
-	private static final String SKIN_MINIMAL = "minimal"; //$NON-NLS-1$
-	private static final String SKIN_SIMPLE = "simple"; //$NON-NLS-1$
-
-	private static final String STYLESHEET_MINIMAL = "/skinning/minimal.css"; //$NON-NLS-1$
-	private static final String STYLESHEET_SIMPLE = "/skinning/simple.css"; //$NON-NLS-1$
-
-	/**
-	 * Constructs an instance.
-	 */
-	public TrinidadDTResourceProvider() {
-		super(ID);
-		addSkin(createSkin(SKIN_MINIMAL, STYLESHEET_MINIMAL_URL, true));
-		addSkin(createSkin(SKIN_SIMPLE, STYLESHEET_SIMPLE_URL, false));
-	}
-
-	private DefaultDTSkin createSkin(String name, URL stylesheetURL, boolean isDefault) {
-		DefaultDTSkin skin = null;
-		if (stylesheetURL != null) {
-			skin = new DefaultDTSkin(name, Collections.singletonList(stylesheetURL));
-			skin.setDefault(isDefault);
-		} else {
-			TrinidadTagSupportActivator.logError(
-					Messages.TrinidadDTResourceProvider_StyleSheetNotLocated,
-					null);
-		}
-		return skin;
-	}
-
-	//here we try to ensure we can access stylesheets and referenced resources even when JARed
-	private static URL STYLESHEET_MINIMAL_URL;
-	private static URL STYLESHEET_SIMPLE_URL;
-	private static final String DTREZPROV_CACHE_DIRNAME = "dtRezProvCache"; //$NON-NLS-1$
-	private static final String URI_DIRNAME = "myfaces.apache.org_trinidad"; //$NON-NLS-1$
-	private static final String DIR_TO_COPY = "skinning/"; //$NON-NLS-1$
-	/**
-	 * Initializes the class.
-	 */
-	public static void init() {
-		//worst case - we get the stylesheets but no referenced resources (if plug-in is JARed)
-		try {
-			STYLESHEET_MINIMAL_URL = FileLocator.toFileURL(
-					TrinidadDTResourceProvider.class.getResource(STYLESHEET_MINIMAL));
-			STYLESHEET_SIMPLE_URL = FileLocator.toFileURL(
-					TrinidadDTResourceProvider.class.getResource(STYLESHEET_SIMPLE));
-		} catch(IOException ioe) {
-			//nothing to be done
-		}
-		try {
-			File bundleFile = FileLocator.getBundleFile(TrinidadTagSupportActivator.getDefault().getBundle());
-			if (bundleFile.isFile()) {
-				//plug-in is JARed
-				try {
-					File stateLocation = TrinidadTagSupportActivator.getDefault().getStateLocation().toFile();
-					File dtRezProvCacheDir = new File(stateLocation, DTREZPROV_CACHE_DIRNAME);
-					File targetDir = new File(dtRezProvCacheDir, URI_DIRNAME);
-					wipeDir(targetDir);
-					if (targetDir.mkdirs()) {
-						FileInputStream fis = null;
-						JarInputStream jis = null;
-						FileOutputStream fos = null;
-						try {
-							fis = new FileInputStream(bundleFile);
-							jis = new JarInputStream(fis, false);
-							JarEntry jarEntry = jis.getNextJarEntry();
-							while (jarEntry != null) {
-								String name = jarEntry.getName();
-								if (name != null && name.startsWith(DIR_TO_COPY)) {
-									File targetFile = new File(targetDir, name);
-									if (!jarEntry.isDirectory()) {
-										File parentDir = targetFile.getParentFile();
-										if (parentDir != null && !parentDir.exists()) {
-											parentDir.mkdirs();
-										}
-										if (targetFile.createNewFile()) {
-											fos = new FileOutputStream(targetFile);
-											byte[] buf = new byte[1024];
-											int bytesRead = jis.read(buf, 0, 1024);
-											while (bytesRead > 0) {
-												fos.write(buf, 0, bytesRead);
-												bytesRead = jis.read(buf, 0, 1024);
-											}
-										}
-									}
-								}
-								jarEntry = jis.getNextJarEntry();
-							}
-						} catch(IOException ioe) {
-							//do nothing, we fall back on stylesheet without referenced resources
-						} finally {
-							if (fos != null) {
-								fos.close();
-							}
-							if (jis != null) {
-								jis.close();
-							}
-							if (fis != null) {
-								fis.close();
-							}
-						}
-					}
-					File minimalStylesheet = new File(targetDir, STYLESHEET_MINIMAL);
-					if (minimalStylesheet.exists()) {
-						STYLESHEET_MINIMAL_URL = minimalStylesheet.toURL();
-					}
-					File simpleStylesheet = new File(targetDir, STYLESHEET_SIMPLE);
-					if (simpleStylesheet.exists()) {
-						STYLESHEET_SIMPLE_URL = simpleStylesheet.toURL();
-					}
-				} catch(IllegalStateException ise) {
-					//do nothing, we fall back on stylesheet without referenced resources
-				}
-			}
-		} catch(IOException ioe) {
-			//do nothing, we fall back on stylesheet without referenced resources
-		}
-	}
-
-	private static void wipeDir(File targetDir) {
-		if (targetDir != null && targetDir.exists()) {
-			File[] files = targetDir.listFiles();
-			for (File file: files) {
-				if (file.isFile()) {
-					file.delete();
-				} else {
-					wipeDir(file);
-				}
-			}
-			targetDir.delete();
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/el/TrinidadDecorativeVariableResolver.java b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/el/TrinidadDecorativeVariableResolver.java
deleted file mode 100644
index d9c6c29..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/el/TrinidadDecorativeVariableResolver.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.apache.trinidad.tagsupport.el;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jst.jsf.context.symbol.ERuntimeSource;
-import org.eclipse.jst.jsf.context.symbol.ISymbol;
-import org.eclipse.jst.jsf.designtime.context.DTFacesContext;
-import org.eclipse.jst.jsf.designtime.el.AbstractDTVariableResolver;
-import org.eclipse.jst.jsf.designtime.el.IDecorativeResolver;
-import org.eclipse.jst.jsf.designtime.symbols.JSFSymbolFactory;
-
-/**
- * A decorative dt variable resolver that shadows Trinidad's runtime resolver.
- * 
- * @author cbateman
- * 
- */
-public class TrinidadDecorativeVariableResolver extends
-        AbstractDTVariableResolver implements IDecorativeResolver
-{
-    private final static JSFSymbolFactory _symbolFactory                = new JSFSymbolFactory();
-
-    public final static String            PAGE_FLOW_SCOPE_VARIABLE_NAME = "pageFlowScope"; //$NON-NLS-1$
-    public final static String            PROCESS_SCOPE_VARIABLE_NAME   = "processScope"; //$NON-NLS-1$
-
-    public final static String            REQUEST_CONTEXT_VARIABLE_NAME = "requestContext"; //$NON-NLS-1$
-    public final static String            REQUEST_CONTEXT_CLASS_NAME    = "org.apache.myfaces.trinidad.context.RequestContext"; //$NON-NLS-1$
-
-    @Override
-    public ISymbol[] getAllVariables(final DTFacesContext facesContext,
-            final IAdaptable externalContextKey)
-    {
-        final Map<String, ISymbol> symbols = createSymbols(facesContext);
-        return symbols.values().toArray(ISymbol.EMPTY_SYMBOL_ARRAY);
-    }
-
-    @Override
-    public ISymbol resolveVariable(final DTFacesContext context,
-            final String name, final IAdaptable externalContextKey)
-    {
-        return createSymbols(context).get(name);
-    }
-
-    private Map<String, ISymbol> createSymbols(final DTFacesContext context)
-    {
-        final IResource res = context.adaptContextObject();
-
-        if (res != null)
-        {
-            final IProject project = res.getProject();
-            if (project != null)
-            {
-                final Map<String, ISymbol> symbols = new HashMap<String, ISymbol>();
-
-                final ISymbol requestContextVar = _symbolFactory
-                        .createBeanOrUnknownInstanceSymbol(project,
-                                REQUEST_CONTEXT_CLASS_NAME,
-                                PAGE_FLOW_SCOPE_VARIABLE_NAME,
-                                ERuntimeSource.OTHER_LITERAL);
-                symbols.put(REQUEST_CONTEXT_VARIABLE_NAME, requestContextVar);
-                
-                // both pageFlowScope and processScope return the same variable
-                // TODO: we may be able to populate this map
-                final ISymbol pageFlowVar = _symbolFactory
-                        .createUnknownInstanceSymbol(
-                                PAGE_FLOW_SCOPE_VARIABLE_NAME,
-                                ERuntimeSource.OTHER_LITERAL);
-                symbols.put(PAGE_FLOW_SCOPE_VARIABLE_NAME, pageFlowVar);
-                final ISymbol processScopeVar = _symbolFactory
-                .createUnknownInstanceSymbol(
-                        PROCESS_SCOPE_VARIABLE_NAME,
-                        ERuntimeSource.OTHER_LITERAL);
-                symbols.put(PROCESS_SCOPE_VARIABLE_NAME, processScopeVar);
-                return symbols;
-            }
-        }
-        return Collections.emptyMap(); 
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/elementedit/DefaultTrinidadCoreElementEdit.java b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/elementedit/DefaultTrinidadCoreElementEdit.java
deleted file mode 100644
index a12ea8e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/elementedit/DefaultTrinidadCoreElementEdit.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/**
- * Copyright (c) 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle Corporation - initial API and implementation
- */
-package org.eclipse.jst.jsf.apache.trinidad.tagsupport.elementedit;
-
-import org.eclipse.jst.pagedesigner.elementedit.AbstractElementEdit;
-
-/**
- * Default IElementEdit implementation for Trinidad core tag library.
- * 
- * @author Ian Trimble - Oracle
- */
-public class DefaultTrinidadCoreElementEdit extends AbstractElementEdit {
-
-	/*
-	 * Currently no default behaviour, but likely we will add some.
-	 * Delete this comment when functionality added.
-	 */
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/elementedit/PanelFormLayoutChildElementEdit.java b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/elementedit/PanelFormLayoutChildElementEdit.java
deleted file mode 100644
index 47b376f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/elementedit/PanelFormLayoutChildElementEdit.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/**
- * Copyright (c) 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle Corporation - initial API and implementation
- */
-package org.eclipse.jst.jsf.apache.trinidad.tagsupport.elementedit;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.jst.jsf.apache.trinidad.tagsupport.ITrinidadConstants;
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.parts.ElementEditPart;
-import org.w3c.dom.Element;
-
-/**
- * IElementEdit implementation for Trinidad tags that are potentially children
- * of the panelFormLayout tag, and therefore may need to refresh panelFormLayout
- * on model change.
- * 
- * @author Ian Trimble - Oracle
- */
-public class PanelFormLayoutChildElementEdit extends
-		DefaultTrinidadCoreElementEdit {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.elementedit.AbstractElementEdit#handleModelChange(org.w3c.dom.Element, org.eclipse.jst.pagedesigner.parts.ElementEditPart, boolean)
-	 */
-	@Override
-	public boolean handleModelChange(Element ele, ElementEditPart part,
-			boolean recursive) {
-		boolean handled = false;
-		EditPart parentPart = part.getParent();
-		while (parentPart instanceof ElementEditPart) {
-			ElementEditPart parentElementEditPart = (ElementEditPart)parentPart;
-			TagIdentifier tagID = parentElementEditPart.getTagIdentifier();
-			if (tagID != null) {
-				if (ITrinidadConstants.TAG_IDENTIFIER_PANELFORMLAYOUT.isSameTagType(tagID)) {
-					parentElementEditPart.refreshModelChange(recursive);
-					handled = true;
-					break;
-				} else if (
-						ITrinidadConstants.TAG_IDENTIFIER_GROUP.isSameTagType(tagID) ||
-						IJSFConstants.TAG_IDENTIFIER_FACET.isSameTagType(tagID)) {
-					parentPart = parentPart.getParent();
-				} else {
-					break;
-				}
-			}
-		}
-		return handled;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/elementedit/PanelTabbedElementEdit.java b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/elementedit/PanelTabbedElementEdit.java
deleted file mode 100644
index dc086aa..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/elementedit/PanelTabbedElementEdit.java
+++ /dev/null
@@ -1,248 +0,0 @@
-/**
- * Copyright (c) 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle Corporation - initial API and implementation
- */
-package org.eclipse.jst.jsf.apache.trinidad.tagsupport.elementedit;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.gef.DragTracker;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPolicy;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.requests.DropRequest;
-import org.eclipse.gef.requests.LocationRequest;
-import org.eclipse.jst.jsf.apache.trinidad.tagsupport.ITrinidadConstants;
-import org.eclipse.jst.jsf.apache.trinidad.tagsupport.TrinidadUtils;
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.jsf.core.internal.tld.TagIdentifierFactory;
-import org.eclipse.jst.pagedesigner.editpolicies.DragMoveEditPolicy;
-import org.eclipse.jst.pagedesigner.editpolicies.ElementResizableEditPolicy;
-import org.eclipse.jst.pagedesigner.itemcreation.ItemCreationEditPolicy;
-import org.eclipse.jst.pagedesigner.itemcreation.ItemCreationRequest;
-import org.eclipse.jst.pagedesigner.parts.ElementEditPart;
-import org.eclipse.jst.pagedesigner.parts.NodeEditPart;
-import org.eclipse.jst.pagedesigner.tools.ObjectModeDragTracker;
-import org.eclipse.jst.pagedesigner.validation.caret.ActionData;
-import org.eclipse.jst.pagedesigner.validation.caret.DefaultPositionRule;
-import org.eclipse.jst.pagedesigner.validation.caret.DnDPositionValidator;
-import org.eclipse.jst.pagedesigner.validation.caret.DropActionData;
-import org.eclipse.jst.pagedesigner.validation.caret.IPositionMediator;
-import org.eclipse.jst.pagedesigner.validation.caret.Target;
-import org.eclipse.jst.pagedesigner.validation.caret.DropActionData.DropData;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-/**
- * IElementEdit implementation for Trinidad's panelTabbed tag.
- * 
- * @author Ian Trimble - Oracle
- */
-public class PanelTabbedElementEdit extends DefaultTrinidadCoreElementEdit {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.elementedit.AbstractElementEdit#createEditPolicies(org.eclipse.jst.pagedesigner.parts.ElementEditPart)
-	 */
-	@Override
-	public void createEditPolicies(ElementEditPart part) {
-		part.installEditPolicy(
-				EditPolicy.SELECTION_FEEDBACK_ROLE,
-				new PanelTabbedElementResizableEditPolicy());
-		part.installEditPolicy(
-				EditPolicy.PRIMARY_DRAG_ROLE,
-				new PanelTabbedDragMoveEditPolicy());
-		part.installEditPolicy(
-				ItemCreationRequest.REQ_ITEM_CREATION,
-				new PanelTabbedItemCreationEditPolicy());
-	}
-
-	/**
-	 * Extends ElementResizableEditPolicy to determine if tab is clicked and
-	 * respond accordingly.
-	 * 
-	 * @author Ian Trimble - Oracle
-	 */
-	public static class PanelTabbedElementResizableEditPolicy extends ElementResizableEditPolicy {
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jst.pagedesigner.editpolicies.ElementResizableEditPolicy#getSelectionDragTracker(org.eclipse.gef.requests.LocationRequest)
-		 */
-		@Override
-		public DragTracker getSelectionDragTracker(LocationRequest request) {
-			return getSelectionTracker(request);
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jst.pagedesigner.editpolicies.ElementResizableEditPolicy#getSelectionTracker(org.eclipse.gef.requests.LocationRequest)
-		 */
-		@Override
-		protected DragTracker getSelectionTracker(LocationRequest request) {
-			final GraphicalEditPart part = (GraphicalEditPart)getHost();
-			if (part instanceof NodeEditPart) {
-				final Node node = ((NodeEditPart)part).getDOMNode();
-				if (getShowDetailItemCount(node) > 0) {
-					ObjectModeDragTracker dragTracker = new ObjectModeDragTracker(getHost()) {
-						protected boolean handleButtonDown(int button) {
-							if (button == 1) {
-								final int tabIndex = getTabIndex(getLocation());
-								final EditPart editPart = getSourceEditPart();
-								if (editPart instanceof ElementEditPart) {
-									final Node node = ((ElementEditPart)editPart).getDOMNode();
-									if (TrinidadUtils.setCurrentChildIndex(node, tabIndex)) {
-										((ElementEditPart)editPart).refresh(true);
-									}
-								}
-							}
-							return super.handleButtonDown(button);
-						}
-					};
-					return dragTracker;
-				}
-			}
-			return new ObjectModeDragTracker(getHost());
-		}
-
-		private int getTabIndex(Point location) {
-			int tabIndex = -1;
-			final GraphicalEditPart part = (GraphicalEditPart)getHost();
-			if (part instanceof NodeEditPart) {
-				final Node node = ((NodeEditPart)part).getDOMNode();
-				final IFigure figure = part.getFigure();
-				Point relLocation = location.getCopy();
-				figure.translateToRelative(relLocation);
-				final int showDetailItemCount = getShowDetailItemCount(node);
-				if (showDetailItemCount > 0) {
-					final int tabWidth = figure.getBounds().width / showDetailItemCount;
-					tabIndex = relLocation.x / tabWidth;
-					if (tabIndex > showDetailItemCount - 1) {
-						tabIndex = showDetailItemCount - 1;
-					}
-				}
-			}
-			return tabIndex;
-		}
-
-		private int getShowDetailItemCount(Node node) {
-			int count = 0;
-			if (node != null) {
-				NodeList childNodes = node.getChildNodes();
-				for (int i = 0; i < childNodes.getLength(); i++) {
-					Node childNode = childNodes.item(i);
-					if (childNode instanceof Element) {
-						if (ITrinidadConstants.TAG_IDENTIFIER_SHOWDETAILITEM.isSameTagType(
-								TagIdentifierFactory.createDocumentTagWrapper((Element)childNode))) {
-							count++;
-						}
-					}
-				}
-			}
-			return count;
-		}
-
-	}
-
-	/**
-	 * Extends DragMoveEditPolicy to add OnlyShowDetailItemsRule as a rule.
-	 * 
-	 * @author Ian Trimble - Oracle
-	 */
-	public static class PanelTabbedDragMoveEditPolicy extends DragMoveEditPolicy {
-
-		/*
-		 * (non-Javadoc)
-		 * @see org.eclipse.jst.pagedesigner.editpolicies.DropEditPolicy#createDropChildValidator(org.eclipse.gef.requests.DropRequest)
-		 */
-		@Override
-		protected IPositionMediator createDropChildValidator(DropRequest r) {
-			DropData dropData = createDropData(r);
-			if (dropData != null) {
-				DnDPositionValidator validator = 
-					new DnDPositionValidator(new DropActionData(
-							ActionData.COMPONENT_MOVE, dropData));
-				validator.addRule(new OnlyShowDetailItemsRule(validator.getActionData()));
-				return validator;
-			}
-			return null;
-		}
-
-	}
-
-	/**
-	 * Extends ItemCreationEditPolicy to add OnlyShowDetailItemsRule as a rule.
-	 * 
-	 * @author Ian Trimble - Oracle
-	 */
-	public static class PanelTabbedItemCreationEditPolicy extends ItemCreationEditPolicy {
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jst.pagedesigner.editpolicies.DropEditPolicy#createDropChildValidator(org.eclipse.gef.requests.DropRequest)
-		 */
-		@Override
-		protected IPositionMediator createDropChildValidator(DropRequest r) {
-			DropData dropData = createDropData(r);
-			if (dropData != null) {
-				DnDPositionValidator validator = 
-					new DnDPositionValidator(new DropActionData(
-							ActionData.PALETTE_DND, dropData));
-				validator.addRule(new OnlyShowDetailItemsRule(validator.getActionData()));
-				return validator;
-			}
-			return null;
-		}
-
-	}
-
-	/**
-	 * Extends DefaultPositionRule to only allow showDetailItem tags to be
-	 * dropped on panelTabbed tag.
-	 * 
-	 * @author Ian Trimble - Oracle
-	 */
-	private static class OnlyShowDetailItemsRule extends DefaultPositionRule {
-
-		/**
-		 * Instantiates an instance.
-		 * 
-		 * @param actionData ActionData instance.
-		 */
-		public OnlyShowDetailItemsRule(ActionData actionData) {
-			super(actionData);
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * @see org.eclipse.jst.pagedesigner.validation.caret.DefaultPositionRule#isEditable(org.eclipse.jst.pagedesigner.validation.caret.Target)
-		 */
-		@Override
-		public boolean isEditable(Target target) {
-			if (ITrinidadConstants.TAG_IDENTIFIER_PANELTABBED.isSameTagType(
-					target.getTagWrapper())) {
-				return isDataDroppable();
-			}
-			return true;
-		}
-
-		private boolean isDataDroppable() {
-			ActionData actionData = getActionData();
-			if (actionData instanceof DropActionData) {
-				DropActionData dropActionData = (DropActionData)actionData;
-				TagIdentifier tagIdentifier = 
-					(TagIdentifier)dropActionData.getDropData().getTagIdentifiers().get(0);
-				if (ITrinidadConstants.TAG_IDENTIFIER_SHOWDETAILITEM.isSameTagType(
-						tagIdentifier)) {
-					return true;
-				}
-			}
-			return false;
-		}
-
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/elementedit/ShowDetailItemElementEdit.java b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/elementedit/ShowDetailItemElementEdit.java
deleted file mode 100644
index f0ba5bd..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/elementedit/ShowDetailItemElementEdit.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/**
- * Copyright (c) 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle Corporation - initial API and implementation
- */
-package org.eclipse.jst.jsf.apache.trinidad.tagsupport.elementedit;
-
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPartViewer;
-import org.eclipse.jst.jsf.apache.trinidad.tagsupport.ITrinidadConstants;
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.pagedesigner.parts.ElementEditPart;
-import org.eclipse.jst.pagedesigner.validation.caret.IPositionMediator;
-import org.eclipse.jst.pagedesigner.validation.caret.Target;
-import org.eclipse.jst.pagedesigner.viewer.DefaultDropLocationStrategy;
-import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
-import org.eclipse.jst.pagedesigner.viewer.IDropLocationStrategy;
-import org.w3c.dom.Element;
-
-/**
- * IElementEdit implementation for Trinidad's showDetailItem tag.
- * 
- * @author Ian Trimble - Oracle
- */
-public class ShowDetailItemElementEdit extends DefaultTrinidadCoreElementEdit {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.elementedit.AbstractElementEdit#handleModelChange(org.w3c.dom.Element, org.eclipse.jst.pagedesigner.parts.ElementEditPart, boolean)
-	 */
-	@Override
-	public boolean handleModelChange(
-			Element ele, ElementEditPart part, boolean recursive) {
-		boolean handled = false;
-		EditPart parentPart = part.getParent();
-		if (parentPart instanceof ElementEditPart) {
-			((ElementEditPart)parentPart).refreshModelChange(recursive);
-			handled = true;
-		}
-		return handled;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.elementedit.AbstractElementEdit#getDropRequestorLocationStrategy(org.eclipse.jst.jsf.common.dom.TagIdentifier, org.eclipse.gef.EditPartViewer)
-	 */
-	@Override
-	public IDropLocationStrategy getDropRequestorLocationStrategy(
-			TagIdentifier tag, EditPartViewer viewer) {
-		return new ShowDetailItemDropLocationStrategy(viewer);
-	}
-
-	/**
-	 * Extends DefaultDropLocationStrategy.
-	 * 
-	 * @author Ian Trimble - Oracle
-	 */
-	private static class ShowDetailItemDropLocationStrategy extends DefaultDropLocationStrategy {
-
-		/**
-		 * Instantiates an instance.
-		 * 
-		 * @param viewer EditPartViewer instance.
-		 */
-		public ShowDetailItemDropLocationStrategy(EditPartViewer viewer) {
-			super(viewer);
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jst.pagedesigner.viewer.DefaultDropLocationStrategy#calculateDesignPosition(org.eclipse.gef.EditPart, org.eclipse.draw2d.geometry.Point, org.eclipse.jst.pagedesigner.validation.caret.IPositionMediator)
-		 */
-		@Override
-		public DesignPosition calculateDesignPosition(
-				EditPart host, Point p, IPositionMediator validator) {
-			DesignPosition position = null;
-			//check if host is editable or get nearest editable ancestor
-			host = validator.getEditableContainer(new Target(host));
-			if (host instanceof ElementEditPart) {
-				final TagIdentifier hostTagId =
-					((ElementEditPart)host).getTagIdentifier();
-				if (ITrinidadConstants.TAG_IDENTIFIER_PANELTABBED.isSameTagType(hostTagId)) {
-					final int showDetailItemCount = host.getChildren().size();
-					position = new DesignPosition(host, showDetailItemCount);
-					if (!validator.isValidPosition(position)) {
-						position = null;
-					}
-				}
-			}
-			return position;
-		}
-
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/elementedit/TrinidadCoreElementEditFactory.java b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/elementedit/TrinidadCoreElementEditFactory.java
deleted file mode 100644
index 3a1d3c6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/elementedit/TrinidadCoreElementEditFactory.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/**
- * Copyright (c) 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle Corporation - initial API and implementation
- */
-package org.eclipse.jst.jsf.apache.trinidad.tagsupport.elementedit;
-
-import org.eclipse.jst.jsf.apache.trinidad.tagsupport.ITrinidadConstants;
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.pagedesigner.elementedit.AbstractElementEditFactory;
-import org.eclipse.jst.pagedesigner.elementedit.IElementEdit;
-
-/**
- * AbstractElementEditFactory extension for Trinidad core tag library.
- * 
- * @author Ian Trimble - Oracle
- */
-public class TrinidadCoreElementEditFactory extends AbstractElementEditFactory {
-
-	/**
-	 * Instantiates an instance, with ITrinidadConstants.URI_CORE as the
-	 * supported URI.
-	 */
-	public TrinidadCoreElementEditFactory() {
-		super(ITrinidadConstants.URI_CORE);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.elementedit.AbstractElementEditFactory#createElementEdit(org.eclipse.jst.jsf.common.dom.TagIdentifier)
-	 */
-	public IElementEdit createElementEdit(final TagIdentifier tagIdentifier) {
-		if (ITrinidadConstants.TAG_IDENTIFIER_PANELTABBED.isSameTagType(tagIdentifier)) {
-			return new PanelTabbedElementEdit();
-		} else if (ITrinidadConstants.TAG_IDENTIFIER_SHOWDETAILITEM.isSameTagType(tagIdentifier)) {
-			return new ShowDetailItemElementEdit();
-		} else if (
-				ITrinidadConstants.TAG_IDENTIFIER_INPUTCOLOR.isSameTagType(tagIdentifier) ||
-				ITrinidadConstants.TAG_IDENTIFIER_INPUTDATE.isSameTagType(tagIdentifier) ||
-				ITrinidadConstants.TAG_IDENTIFIER_INPUTFILE.isSameTagType(tagIdentifier) ||
-				ITrinidadConstants.TAG_IDENTIFIER_INPUTLISTOFVALUES.isSameTagType(tagIdentifier) ||
-				ITrinidadConstants.TAG_IDENTIFIER_INPUTNUMBERSPINBOX.isSameTagType(tagIdentifier) ||
-				ITrinidadConstants.TAG_IDENTIFIER_INPUTTEXT.isSameTagType(tagIdentifier) ||
-				ITrinidadConstants.TAG_IDENTIFIER_SELECTBOOLEANCHECKBOX.isSameTagType(tagIdentifier) ||
-				ITrinidadConstants.TAG_IDENTIFIER_SELECTBOOLEANRADIO.isSameTagType(tagIdentifier) ||
-				ITrinidadConstants.TAG_IDENTIFIER_SELECTMANYCHECKBOX.isSameTagType(tagIdentifier) ||
-				ITrinidadConstants.TAG_IDENTIFIER_SELECTMANYLISTBOX.isSameTagType(tagIdentifier) ||
-				ITrinidadConstants.TAG_IDENTIFIER_SELECTONECHOICE.isSameTagType(tagIdentifier) ||
-				ITrinidadConstants.TAG_IDENTIFIER_SELECTONELISTBOX.isSameTagType(tagIdentifier) ||
-				ITrinidadConstants.TAG_IDENTIFIER_SELECTONERADIO.isSameTagType(tagIdentifier) ||
-				ITrinidadConstants.TAG_IDENTIFIER_PANELLABELANDMESSAGE.isSameTagType(tagIdentifier)
-				) {
-			return new PanelFormLayoutChildElementEdit();
-		} else {
-			return new DefaultTrinidadCoreElementEdit();
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/messages.properties b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/messages.properties
deleted file mode 100644
index 28fafc3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/messages.properties
+++ /dev/null
@@ -1,31 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2008 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-#
-###############################################################################
-BreadCrumbsOperation_EmptyBreadCrumbsTag=Empty breadCrumbs tag - add child commandNavigationItem tags or set nodeStamp facet
-NavigationPaneOperation_EmptyNavigationPaneTag=Empty navigationPane tag - add child commandNavigationItem tags or set nodeStamp facet
-PanelTabbedOperation_EmptyPanelTabbedTag=Empty panelTabbed tag - add child showDetailItem tags
-ShowDetailItemOperation_EmptyShowDetailItemTag=Empty showDetailItem tag - add children
-SelectItemModel_SampleItem1Label=Sample Label 1
-SelectItemModel_SampleItem1Value=Sample Value 1
-SelectItemModel_SampleItem2Label=Sample Label 2 
-SelectItemModel_SampleItem2Value=Sample Value 2
-SelectItemModel_SampleItem3Label=Sample Label 3
-SelectItemModel_SampleItem3Value=Sample Value 3
-SelectShuttleOperation_Description=Description
-SelectShuttleOperation_LinkMove=Move
-SelectShuttleOperation_LinkMoveAll=Move All
-SelectShuttleOperation_LinkRemove=Remove
-SelectShuttleOperation_LinkRemoveAll=Remove All
-SelectShuttleOperation_LinkTop=Top
-SelectShuttleOperation_LinkUp=Up
-SelectShuttleOperation_LinkDown=Down
-SelectShuttleOperation_LinkBottom=Bottom
-TrinidadDTResourceProvider_StyleSheetNotLocated=StyleSheet could not be located
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/model/SelectItem.java b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/model/SelectItem.java
deleted file mode 100644
index f6a06bb..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/model/SelectItem.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/**
- * Copyright (c) 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle Corporation - initial API and implementation
- */
-package org.eclipse.jst.jsf.apache.trinidad.tagsupport.model;
-
-/**
- * A simplified representation of a "selectItem" tag's most useful properties.
- * 
- * @author Ian Trimble - Oracle
- */
-public class SelectItem {
-
-	private String label;
-	private String value;
-
-	/**
-	 * Creates an instance.
-	 * 
-	 * @param label The label.
-	 * @param value The value.
-	 */
-	public SelectItem(String label, String value) {
-		setLabel(label);
-		setValue(value);
-	}
-
-	/**
-	 * Sets the label of this instance.
-	 * 
-	 * @param label The new label.
-	 */
-	public void setLabel(String label) {
-		if (label != null) {
-			this.label = label;
-		} else {
-			this.label = ""; //$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * Gets the label of this instance.
-	 * 
-	 * @return The current label.
-	 */
-	public String getLabel() {
-		return label;
-	}
-
-	/**
-	 * Sets the value of this instance.
-	 * 
-	 * @param value The new value.
-	 */
-	public void setValue(String value) {
-		if (value != null) {
-			this.value = value;
-		} else {
-			this.value = ""; //$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * Gets the value of this instance.
-	 * 
-	 * @return The current value.
-	 */
-	public String getValue() {
-		return value;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/model/SelectItemModel.java b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/model/SelectItemModel.java
deleted file mode 100644
index 74d802e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/model/SelectItemModel.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/**
- * Copyright (c) 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle Corporation - initial API and implementation
- */
-package org.eclipse.jst.jsf.apache.trinidad.tagsupport.model;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jst.jsf.apache.trinidad.tagsupport.ITrinidadConstants;
-import org.eclipse.jst.jsf.apache.trinidad.tagsupport.Messages;
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.jsf.core.internal.tld.TagIdentifierFactory;
-import org.w3c.dom.Element;
-import org.w3c.dom.NodeList;
-
-/**
- * Provides a simple "selectItem"-like model to facilitate handling of both
- * standard JSF core selectItem tags and Trinidad selectItem tags, or a sample
- * model in the absence of either.  
- * 
- * @author Ian Trimble - Oracle
- */
-public class SelectItemModel {
-
-	private static final List<SelectItem> SAMPLE_MODEL = new ArrayList<SelectItem>();
-	static {
-		SAMPLE_MODEL.add(new SelectItem(
-				Messages.SelectItemModel_SampleItem1Label,
-				Messages.SelectItemModel_SampleItem1Value));
-		SAMPLE_MODEL.add(new SelectItem(
-				Messages.SelectItemModel_SampleItem2Label,
-				Messages.SelectItemModel_SampleItem2Value));
-		SAMPLE_MODEL.add(new SelectItem(
-				Messages.SelectItemModel_SampleItem3Label,
-				Messages.SelectItemModel_SampleItem3Value));
-	}
-
-	/**
-	 * Gets a model as a List of SelectItem instances, derived from child
-	 * selectItem Elements, or a sample model if no suitable child Elements are
-	 * found.
-	 * 
-	 * @param parentElement Parent Element instance to scan for child selectItem
-	 * Elements.
-	 * @return List of SelectItem instances.
-	 */
-	public static final List<SelectItem> getModel(Element parentElement) {
-		return getModel(parentElement, true);
-	}
-
-	/**
-	 * Gets a model as a List of SelectItem instances, derived from child
-	 * selectItem Elements, or (optionally) a sample model if no suitable
-	 * child Elements are found.
-	 * 
-	 * @param parentElement Parent Element instance to scan for child selectItem
-	 * Elements.
-	 * @param fallbackOnSampleModel If true and no suitable child Elements are
-	 * found, return sample model.
-	 * @return List of SelectItem instances (may be empty, but not null).
-	 */
-	public static final List<SelectItem> getModel(
-			Element parentElement, boolean fallbackOnSampleModel) {
-		List<SelectItem> selectItems = new ArrayList<SelectItem>();
-		if (parentElement != null) {
-			NodeList childNodes = parentElement.getChildNodes();
-			for (int i = 0; i < childNodes.getLength(); i++) {
-				if (childNodes.item(i) instanceof Element) {
-					Element childElement = (Element)childNodes.item(i);
-					TagIdentifier tagID =
-						TagIdentifierFactory.createDocumentTagWrapper(childElement);
-					if (tagID.isSameTagType(ITrinidadConstants.TAG_IDENTIFIER_SELECTITEM)) {
-						String label = childElement.getAttribute("label"); //$NON-NLS-1$
-						if (label == null || label.length() < 1) {
-							label = childElement.getAttribute("value"); //$NON-NLS-1$
-						}
-						selectItems.add(new SelectItem(
-								label, childElement.getAttribute("value"))); //$NON-NLS-1$
-					} else if (tagID.isSameTagType(IJSFConstants.TAG_IDENTIFIER_SELECTITEM)) {
-						String value = childElement.getAttribute("value"); //$NON-NLS-1$
-						if (value == null || value.length() < 1) {
-							value = childElement.getAttribute("itemValue"); //$NON-NLS-1$
-						}
-						String label = childElement.getAttribute("itemLabel"); //$NON-NLS-1$
-						if (label == null || label.length() < 1) {
-							label = value;
-						}
-						selectItems.add(new SelectItem(label, value));
-					}
-				}
-			}
-		}
-		if (selectItems.size() > 0 || !fallbackOnSampleModel) {
-			return selectItems;
-		} else {
-			return getSampleModel();
-		}
-	}
-
-	/**
-	 * Gets a sample model as a List of SelectItem instances.
-	 * 
-	 * @return Sample model as a List of SelectItem instances.
-	 */
-	public static final List<SelectItem> getSampleModel() {
-		return SAMPLE_MODEL;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/.classpath b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/.classpath
deleted file mode 100644
index 64c5e31..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/.cvsignore b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/.cvsignore
deleted file mode 100644
index a179f16..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/.cvsignore
+++ /dev/null
@@ -1,3 +0,0 @@
-@dot
-build.xml
-javaCompiler...args
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/.project b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/.project
deleted file mode 100644
index 4fe172b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.jst.jsf.common.runtime</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/.settings/org.eclipse.jdt.core.prefs b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 0df408f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,82 +0,0 @@
-#Tue Mar 02 08:23:18 PST 2010
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.5
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.doc.comment.support=enabled
-org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.autoboxing=warning
-org.eclipse.jdt.core.compiler.problem.deprecation=error
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=ignore
-org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
-org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
-org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
-org.eclipse.jdt.core.compiler.problem.invalidJavadoc=error
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocComments=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.missingJavadocTags=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=error
-org.eclipse.jdt.core.compiler.problem.nullReference=ignore
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
-org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore
-org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=ignore
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=ignore
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=error
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=error
-org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
-org.eclipse.jdt.core.compiler.problem.unusedLocal=error
-org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
-org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
-org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.5
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/.settings/org.eclipse.pde.prefs b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/.settings/org.eclipse.pde.prefs
deleted file mode 100644
index 997a930..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/.settings/org.eclipse.pde.prefs
+++ /dev/null
@@ -1,22 +0,0 @@
-#Fri May 30 11:44:25 PDT 2008
-compilers.f.unresolved-features=1
-compilers.f.unresolved-plugins=1
-compilers.incompatible-environment=1
-compilers.p.build=1
-compilers.p.deprecated=1
-compilers.p.discouraged-class=1
-compilers.p.internal=1
-compilers.p.missing-packages=0
-compilers.p.no-required-att=0
-compilers.p.not-externalized-att=0
-compilers.p.unknown-attribute=1
-compilers.p.unknown-class=1
-compilers.p.unknown-element=1
-compilers.p.unknown-identifier=1
-compilers.p.unknown-resource=1
-compilers.p.unresolved-ex-points=0
-compilers.p.unresolved-import=0
-compilers.s.create-docs=false
-compilers.s.doc-folder=doc
-compilers.s.open-tags=1
-eclipse.preferences.version=1
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/META-INF/MANIFEST.MF b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/META-INF/MANIFEST.MF
deleted file mode 100644
index e04c87f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,22 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %Bundle-Name.0
-Bundle-SymbolicName: org.eclipse.jst.jsf.common.runtime
-Bundle-Version: 1.1.0.qualifier
-Bundle-Activator: org.eclipse.jst.jsf.common.runtime.internal.JSFCommonRuntimePlugin
-Require-Bundle: org.eclipse.core.runtime
-Bundle-ActivationPolicy: lazy
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
-Export-Package: org.eclipse.jst.jsf.common.runtime.internal;x-internal:=true,
- org.eclipse.jst.jsf.common.runtime.internal.debug;x-friends:="org.eclipse.jst.jsf.common.runtime.tests",
- org.eclipse.jst.jsf.common.runtime.internal.model;x-friends:="org.eclipse.jst.jsf.common.runtime.tests",
- org.eclipse.jst.jsf.common.runtime.internal.model.bean;x-friends:="org.eclipse.jst.jsf.common.runtime.tests",
- org.eclipse.jst.jsf.common.runtime.internal.model.behavioural;x-friends:="org.eclipse.jst.jsf.common.runtime.tests",
- org.eclipse.jst.jsf.common.runtime.internal.model.component;x-friends:="org.eclipse.jst.jsf.common.runtime.tests",
- org.eclipse.jst.jsf.common.runtime.internal.model.datatypes;x-friends:="org.eclipse.jst.jsf.common.runtime.tests",
- org.eclipse.jst.jsf.common.runtime.internal.model.decorator;x-friends:="org.eclipse.jst.jsf.common.runtime.tests",
- org.eclipse.jst.jsf.common.runtime.internal.model.event;x-friends:="org.eclipse.jst.jsf.common.runtime.tests",
- org.eclipse.jst.jsf.common.runtime.internal.model.types;x-friends:="org.eclipse.jst.jsf.common.runtime.tests",
- org.eclipse.jst.jsf.common.runtime.internal.view.model.common;x-friends:="org.eclipse.jst.jsf.common.runtime.tests"
-Bundle-Vendor: %Bundle-Vendor.0
-Bundle-Localization: plugin
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/about.html b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/about.html
deleted file mode 100644
index 8e56059..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/about.html
+++ /dev/null
@@ -1,22 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<head>
-<title>About</title>
-<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>June, 2008</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise indicated below, the Content is provided to you under the terms and conditions of the
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content.</p>
-
-</body>
-</html>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/build.properties b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/build.properties
deleted file mode 100644
index ce7a0fa..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/build.properties
+++ /dev/null
@@ -1,16 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2008 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               .,\
-               plugin.properties,\
-               about.html
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/instrumentation/WebContent/WEB-INF/faces-config.xml b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/instrumentation/WebContent/WEB-INF/faces-config.xml
deleted file mode 100644
index 15eef3b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/instrumentation/WebContent/WEB-INF/faces-config.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<!DOCTYPE faces-config PUBLIC
-    "-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.1//EN"
-    "http://java.sun.com/dtd/web-facesconfig_1_1.dtd">
-
-<faces-config>
-	<lifecycle>
-		<phase-listener>
-		instrument.PhaseListener1</phase-listener>
-	</lifecycle>
-</faces-config>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/instrumentation/jar/jsfrt.jar b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/instrumentation/jar/jsfrt.jar
deleted file mode 100644
index 5093673..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/instrumentation/jar/jsfrt.jar
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/instrumentation/src/instrument/MyMonitorMessageFactory.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/instrumentation/src/instrument/MyMonitorMessageFactory.java
deleted file mode 100644
index 3f06d6d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/instrumentation/src/instrument/MyMonitorMessageFactory.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package instrument;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.ObjectInputStream;
-import java.util.Iterator;
-
-import javax.faces.component.UIComponent;
-import javax.faces.component.UIInput;
-import javax.faces.component.UIOutput;
-
-import org.eclipse.jst.jsf.common.runtime.internal.debug.JSFMonitorMessage;
-import org.eclipse.jst.jsf.common.runtime.internal.model.component.ComponentFactory;
-import org.eclipse.jst.jsf.common.runtime.internal.model.component.ComponentInfo;
-import org.eclipse.jst.jsf.common.runtime.internal.model.component.FacetInfo;
-import org.eclipse.jst.jsf.common.runtime.internal.model.component.UIInputInfo;
-import org.eclipse.jst.jsf.common.runtime.internal.model.component.UIOutputInfo;
-
-public class MyMonitorMessageFactory 
-{
-    public static JSFMonitorMessage  createJSFMonitorMessage(InputStream inStream) throws IOException, ClassCastException, ClassNotFoundException
-    {
-        ObjectInputStream objectStream = new ObjectInputStream(inStream);
-        Object nextObject = objectStream.readObject();
-        return (JSFMonitorMessage) nextObject;
-    }
-   
-    static ComponentInfo buildComponentTree(UIComponent component, boolean isFacet)
-    {
-        final ComponentInfo componentInfo = getComponentData(component, isFacet);
-        
-        for (Iterator it = component.getChildren().iterator(); it.hasNext();)
-        {
-            UIComponent child = (UIComponent) it.next();
-            componentInfo.getChildren().add(buildComponentTree(child, false));
-        }
-
-        for (Iterator it = component.getFacets().values().iterator(); it.hasNext();)
-        {
-            UIComponent facet = (UIComponent) it.next();
-            componentInfo.getChildren().add(buildComponentTree(facet, true));
-        }
-        
-        return componentInfo;
-    }
-    
-    private static ComponentInfo getComponentData(final UIComponent component, boolean isFacet)
-    {
-        if (isFacet)
-        {
-            return calculateFacetInfo(component);
-        }
-        else if (component instanceof UIInput)
-        {
-            return calculateUIInput((UIInput)component);
-        }
-        else if (component instanceof UIOutput)
-        {
-            return calculateUIOutput((UIOutput)component);
-        }
-        
-        // default; just make a component
-        return calculateComponentInfo(component);
-    }
-
-    private static ComponentInfo calculateComponentInfo(UIComponent component)
-    {
-        final String id = component.getId();
-        final String parentId = component.getParent() == null ? null : component.getParent().getId();
-        final String componentFamily = component.getFamily();
-        final String renderFamily = component.getRendererType();
-        final String componentType = null;
-        final String componentClass = component.getClass().getCanonicalName();
-        
-        return ComponentFactory.createComponentInfo
-            (id, parentId, componentFamily, renderFamily, componentType, componentClass);
-    }
-    
-    private static FacetInfo calculateFacetInfo(UIComponent component)
-    {
-        final String id = component.getId();
-        final String parentId = component.getParent() == null ? null : component.getParent().getId();
-        final String componentFamily = component.getFamily();
-        final String renderFamily = component.getRendererType();
-        final String componentType = null;
-        final String componentClass = component.getClass().getCanonicalName();
-
-        return ComponentFactory.createFacetInfo
-            (id, parentId, componentFamily, renderFamily, componentType, componentClass);
-    }
-    
-    private static UIInputInfo calculateUIInput(UIInput  uiInput)
-    {
-        final String id = uiInput.getId();
-        final String parentId = uiInput.getParent() == null ? null : uiInput.getParent().getId();
-        final String componentFamily = uiInput.getFamily();
-        final String renderFamily = uiInput.getRendererType();
-        final String componentType = null;
-        final String componentClass = uiInput.getClass().getCanonicalName();
-        final String isValid = Boolean.toString(uiInput.isValid());
-        final String isImmediate = Boolean.toString(uiInput.isImmediate());
-        final String isRequired = Boolean.toString(uiInput.isRequired());
-        final String isRendered = Boolean.toString(uiInput.isRendered());
-
-        return ComponentFactory.createUIInputInfo
-            (id, parentId, componentFamily, renderFamily, isValid, isImmediate, isRequired, isRendered, componentType, componentClass);
-    }
-
-    private static UIOutputInfo calculateUIOutput(UIOutput uiOutput)
-    {
-        final String id = uiOutput.getId();
-        final String parentId = uiOutput.getParent() == null ? null : uiOutput.getParent().getId();
-        final String componentFamily = uiOutput.getFamily();
-        final String renderFamily = uiOutput.getRendererType();
-        final String componentType = null;
-        final String componentClass = uiOutput.getClass().getCanonicalName();
-        final String isRendered = Boolean.toString(uiOutput.isRendered());
-
-        return ComponentFactory.createUIOutputInfo
-            (id, parentId, componentFamily, renderFamily, isRendered, componentType, componentClass);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/instrumentation/src/instrument/PhaseListener1.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/instrumentation/src/instrument/PhaseListener1.java
deleted file mode 100644
index e93e028..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/instrumentation/src/instrument/PhaseListener1.java
+++ /dev/null
@@ -1,342 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package instrument;
-
-import java.io.IOException;
-import java.io.ObjectOutputStream;
-import java.io.Writer;
-import java.net.Socket;
-import java.net.UnknownHostException;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Stack;
-import java.util.concurrent.LinkedBlockingQueue;
-
-import javax.faces.FactoryFinder;
-import javax.faces.component.UIComponent;
-import javax.faces.component.UIViewRoot;
-import javax.faces.context.FacesContext;
-import javax.faces.context.ResponseWriter;
-import javax.faces.event.PhaseEvent;
-import javax.faces.event.PhaseId;
-import javax.faces.event.PhaseListener;
-import javax.faces.render.RenderKit;
-import javax.faces.render.RenderKitFactory;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
-
-import org.eclipse.jst.jsf.common.runtime.internal.debug.ComponentTreeMessage;
-import org.eclipse.jst.jsf.common.runtime.internal.debug.JSFMonitorMessage;
-import org.eclipse.jst.jsf.common.runtime.internal.debug.MonitorMessageFactory;
-import org.eclipse.jst.jsf.common.runtime.internal.debug.RenderAttribute;
-import org.eclipse.jst.jsf.common.runtime.internal.debug.RenderNode;
-import org.eclipse.jst.jsf.common.runtime.internal.model.component.ComponentInfo;
-
-/**
- * @author cbateman
- *
- */
-public class PhaseListener1 implements PhaseListener 
-{
-	SocketClient		_socketClient;
-	ResponseWriter		_savedRW;
-	LoggingResponseWriter  _injectRW;
-	
-	/**
-	 * 
-	 */
-	private static final long serialVersionUID = 6564874625827591775L;
-
-	public PhaseListener1()
-	{
-		System.out.println("Initialized PhaseListener: "+this);
-		_socketClient = new SocketClient(3702);
-		Thread thread = new Thread(_socketClient);
-		thread.start();
-		
-	}
-	
-	public void afterPhase(PhaseEvent event) {
-		if(PhaseId.RENDER_RESPONSE.equals(event.getPhaseId()))
-		{
-			System.out.printf("afterPhase: %s, for view id: %s\n",event.getPhaseId(),event.getFacesContext().getViewRoot().getViewId());
-			dumpComponentTree(event.getFacesContext());
-			
-			if (_savedRW != null)
-			{
-				event.getFacesContext().setResponseWriter(_savedRW);
-			}
-			
-			if (_injectRW != null)
-			{
-				dumpNode(_injectRW._rootComponentNode, "");
-			}
-		}
-	}
-
-	private void dumpNode(RenderNode node, String prefix)
-	{
-		System.out.printf("%s%s for component %s\n", prefix, node.getRenderedNodeName(), node.getComponentId());
-
-		for (final Iterator it = node.getChildren().iterator();it.hasNext();)
-		{
-			RenderNode child = (RenderNode) it.next();
-			dumpNode(child, prefix+"\t");
-		}
-	}
-
-	public void beforePhase(PhaseEvent event) {
-		if (PhaseId.RENDER_RESPONSE.equals(event.getPhaseId()))
-		{
-			FacesContext facesContext = event.getFacesContext();
-            RenderKitFactory renderFactory = 
-            	(RenderKitFactory)FactoryFinder.getFactory(FactoryFinder.RENDER_KIT_FACTORY);
-            RenderKit renderKit = renderFactory.getRenderKit(facesContext,
-                                                             facesContext.getViewRoot().getRenderKitId());
-
-            _savedRW = facesContext.getResponseWriter();
-
-            try
-            {
-	            Writer writer = ((ServletResponse) facesContext.getExternalContext().getResponse()).getWriter();
-	            String charEncoding = ((ServletRequest)facesContext.getExternalContext().getRequest()).getCharacterEncoding();
-	            ResponseWriter responseWriter = renderKit.createResponseWriter
-	            	(writer,
-	                                           null /*Default: get the allowed content-types from the accept-header*/,
-	                                           charEncoding);
-	            _injectRW = new LoggingResponseWriter(responseWriter);
-	            facesContext.setResponseWriter(_injectRW);
-            }
-            catch (IOException ioe)
-            {
-            	ioe.printStackTrace();
-            }
-		}
-//		System.out.printf("beforePhase: %s, for view id: %s\n",event.getPhaseId(),event.getFacesContext().getViewRoot().getViewId());
-//		dumpComponentTree(event.getFacesContext());
-	}
-
-	public PhaseId getPhaseId() {
-		return PhaseId.ANY_PHASE;
-	}
-
-	private void dumpComponentTree(final FacesContext facesContext)
-	{
-		final UIViewRoot root = facesContext.getViewRoot();
-		
-		if (root != null)
-		{
-			final String viewId = root.getViewId();
-			final ComponentInfo rootComponent = MyMonitorMessageFactory.buildComponentTree(root,false);
-			ComponentTreeMessage message = 
-				MonitorMessageFactory.createTreeMessage(viewId, rootComponent, _injectRW._rootComponentNode);
-			_socketClient.put(message);
-		}
-	}
-	
-	
-	private static class SocketClient implements Runnable
-	{
-		private final int					_port;
-		
-		private LinkedBlockingQueue<JSFMonitorMessage>  _queue = 
-			new LinkedBlockingQueue<JSFMonitorMessage>();
-		
-		SocketClient(final int port)
-		{
-			_port = port;
-		}
-		
-		public void run()
-		{
-			JSFMonitorMessage buffer = null;
-			
-			try
-			{
-				while ((buffer = _queue.take()) != null)
-				{
-			        Socket socket = null;
-			        
-			        try
-			        {
-			        	socket = new Socket("127.0.0.1", _port);
-			        	ObjectOutputStream  stream = new ObjectOutputStream(socket.getOutputStream());
-			        	stream.writeObject(buffer);
-//						PrintWriter writer = new PrintWriter(socket.getOutputStream(), true);
-//						writer.println(buffer);
-//						writer.flush();
-			        } catch (UnknownHostException e) {
-						e.printStackTrace();
-					} catch (IOException e) {
-						e.printStackTrace();
-					}
-			        finally
-			        {
-			        	if (socket != null && !socket.isClosed())
-			        	{
-			        		try {
-								socket.close();
-							} catch (IOException e) {
-								e.printStackTrace();
-							}
-			        	}
-			        }
-				}
-			}
-			catch (InterruptedException e)
-			{
-				e.printStackTrace();
-			}
-		}
-		
-		public void put(JSFMonitorMessage  message)
-		{
-			_queue.add(message);
-		}
-	}
-	
-	private static class LoggingResponseWriter extends ResponseWriter
-	{
-		private final ResponseWriter		_wrapWriter;
-		private final Stack/*<RenderNode>*/	_parentStack;
-		private RenderNode					_curNode;
-		private RenderNode					_rootComponentNode;
-
-		// map component id to the root rendernode rendered for it
-		private Map							_componentToHtml;
-		
-		LoggingResponseWriter(ResponseWriter  wrapWriter)
-		{
-			_wrapWriter = wrapWriter;
-			_parentStack = new Stack();
-			
-			_componentToHtml = new HashMap/*<String,RenderNode>*/();
-		}
-		
-		public ResponseWriter cloneWithWriter(Writer writer) {
-			return _wrapWriter.cloneWithWriter(writer);
-		}
-
-		public void endDocument() throws IOException {
-			_wrapWriter.endDocument();
-		}
-
-		public void endElement(String element) throws IOException {
-			_curNode = (RenderNode) _parentStack.pop();
-			_wrapWriter.endElement(element);
-		}
-
-		public void flush() throws IOException {
-			_wrapWriter.flush();
-		}
-
-		public String getCharacterEncoding() {
-			return _wrapWriter.getCharacterEncoding();
-		}
-
-		public String getContentType() {
-			return _wrapWriter.getContentType();
-		}
-
-		public void startDocument() throws IOException {
-			_rootComponentNode = new RenderNode(null, null);
-			_wrapWriter.startDocument();
-		}
-
-		public void startElement(String elementName, UIComponent component)
-				throws IOException 
-		{
-			String componentId = null;
-			
-			if (component != null)
-			{
-				componentId = component.getId();
-			}
-			
-			RenderNode oldNode = _curNode;
-			// push the curNode.  Pushing null indicates the root of the document
-			_parentStack.push(oldNode);
-
-			_curNode = new RenderNode(componentId, elementName);
-			
-			// note that assumption here is that the first html element
-			// we see corresponding to a component is the root of its
-			// html tree.  This may not be true if a component renders
-			// more than one root element or if the output is generated
-			// any thing but pre-order (parent first) tranversal of the 
-			// component tree.  TODO: this algorithm needs refining
-			if (!_componentToHtml.containsKey(componentId))
-			{
-				_componentToHtml.put(componentId, _curNode);
-			}
-			
-			// if the current node isn't null, then append this new element
-			if (oldNode != null)
-			{
-				oldNode.getChildren().add(_curNode);
-			}
-			// otherwise, we are at the doc root, so append there instead
-			else
-			{
-				_rootComponentNode.getChildren().add(_curNode);
-			}
-
-			
-			// do the normal write
-			_wrapWriter.startElement(elementName, component);
-		}
-
-		public void writeAttribute(String name, Object value, String componentPropertyName)
-				throws IOException {
-			
-			System.out.printf("%s: [%s,%s]\n", name, value.toString(), componentPropertyName);
-			final RenderAttribute  attribute = 
-				new RenderAttribute(name, value.toString(), componentPropertyName);
-			
-			if (_curNode != null)
-			{
-				_curNode.getRenderedAttributes().add(attribute);
-			}
-			_wrapWriter.writeAttribute(name, value, componentPropertyName);
-		}
-
-		public void writeComment(Object obj) throws IOException {
-			_wrapWriter.writeComment(obj);
-		}
-
-		public void writeText(Object arg0, String arg1) throws IOException {
-			_wrapWriter.writeText(arg0, arg1);
-		}
-
-		public void writeText(char[] arg0, int arg1, int arg2)
-				throws IOException {
-			_wrapWriter.writeText(arg0, arg1, arg2);
-		}
-
-		public void writeURIAttribute(String arg0, Object arg1, String arg2)
-				throws IOException {
-			_wrapWriter.writeURIAttribute(arg0, arg1, arg2);
-		}
-
-		public void close() throws IOException {
-			_wrapWriter.close();
-		}
-
-		public void write(char[] cbuf, int off, int len) throws IOException {
-			_wrapWriter.write(cbuf, off, len);
-		}
-
-		public ResponseWriter getWrapWriter() {
-			return _wrapWriter;
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/plugin.properties b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/plugin.properties
deleted file mode 100644
index 2279dd9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/plugin.properties
+++ /dev/null
@@ -1,11 +0,0 @@
-###############################################################################
-# Copyright (c) 2008 Oracle Corporation.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-###############################################################################
-#Properties file for org.eclipse.jst.jsf.common.runtime
-Bundle-Vendor.0 = Eclipse.org
-Bundle-Name.0 = JavaServer Faces Tools - Common Runtime
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/JSFCommonRuntimePlugin.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/JSFCommonRuntimePlugin.java
deleted file mode 100644
index 6f9d5f1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/JSFCommonRuntimePlugin.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal;
-
-import org.eclipse.core.runtime.ILog;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Plugin;
-import org.eclipse.core.runtime.Status;
-import org.osgi.framework.BundleContext;
-
-/**
- * The activator class controls the plug-in life cycle
- */
-public class JSFCommonRuntimePlugin extends Plugin {
-
-    /**
-     *  The plug-in ID
-     */
-    public static final String PLUGIN_ID = "CommonComponentPlugin"; //$NON-NLS-1$
-
-    // The shared instance
-    private static JSFCommonRuntimePlugin plugin;
-
-    /**
-     * The constructor
-     */
-    public JSFCommonRuntimePlugin() {
-        // empty constructor
-    }
-
-    /*
-     * (non-Javadoc)
-     * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
-     */
-    public void start(final BundleContext context) throws Exception {
-        super.start(context);
-        plugin = this;
-    }
-
-    /*
-     * (non-Javadoc)
-     * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
-     */
-    public void stop(final BundleContext context) throws Exception {
-        plugin = null;
-        super.stop(context);
-    }
-
-    /**
-     * Returns the shared instance
-     *
-     * @return the shared instance
-     */
-    public static JSFCommonRuntimePlugin getDefault() {
-        return plugin;
-    }
-
-    /**
-     * @param message
-     * @param t
-     */
-    public static void log(final String message, final Throwable t)
-    {
-        final ILog log = getDefault().getLog();
-        final IStatus status = new Status(IStatus.ERROR, PLUGIN_ID, message, t);
-        log.log(status);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/debug/ComponentTreeMessage.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/debug/ComponentTreeMessage.java
deleted file mode 100644
index f6687f4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/debug/ComponentTreeMessage.java
+++ /dev/null
@@ -1,246 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.debug;
-
-import org.eclipse.jst.jsf.common.runtime.internal.model.component.ComponentInfo;
-
-
-/**
- * Represents a component tree in message for that can be serialized.
- * 
- * @author cbateman
- *
- */
-public class ComponentTreeMessage extends JSFMonitorMessage 
-{
-    /**
-     * 
-     */
-    private static final long serialVersionUID = -6282344329821994209L;
-    private String                              _viewId;
-    private ComponentInfo                       _treeRoot;
-    private RenderNode                          _renderRoot;
-   // private HashMap<String, ComponentInfo>      _idIndex;
-    
-    /**
-     * default constructor
-     */
-    public ComponentTreeMessage()
-    {
-        //_idIndex = new HashMap<String, ComponentInfo>();
-    }
-    
-    /**
-     * @return the view id
-     */
-    public final String getViewId() {
-        return _viewId;
-    }
-
-    /**
-     * @return the componentinfo at the root of the component tree
-     */
-    public final ComponentInfo getTreeRoot() {
-        return _treeRoot;
-    }
-
-    /**
-     * @return the rendered root node
-     */
-    public final RenderNode getRenderRoot() {
-        return _renderRoot;
-    }
-
-    final void setRenderRoot(RenderNode renderRoot) {
-        _renderRoot = renderRoot;
-    }
-
-    final void setTreeRoot(ComponentInfo treeRoot)
-    {
-        _treeRoot = treeRoot;
-    }
-    
-    final void setViewId(final String viewId)
-    {
-        _viewId = viewId;
-    }
-    
-//    @Override
-//    protected void deserialize(InputStream inStream) throws IOException, ClassNotFoundException
-//    {
-//        ObjectInputStream  objectInputStream = new ObjectInputStream(inStream);
-//        
-//        Object obj = objectInputStream.readObject();
-//        int bytesRead = super.deserialize(inStream);
-//        
-//        // first line must be startView
-//        final BufferedReader reader = 
-//            new BufferedReader(new InputStreamReader(inStream));
-//        
-//        String line = reader.readLine();
-//        
-//        if (line != null
-//                && line.startsWith(START_VIEW))
-//        {
-//            _viewId = line.substring(START_VIEW.length()).trim();
-//            bytesRead += line.length()+1;
-//        }
-//        
-//        // loop until EOF
-//        while ((line = reader.readLine())!=null)
-//        {
-//            bytesRead += line.length()+1;
-//            
-//            if (line.startsWith("component:"))
-//            {
-//                parseComponent(line.substring("component:".length()).trim());
-//            }
-//            else if (line.startsWith("facet:"))
-//            {
-//                parseFacet(line.substring("facet:".length()).trim());
-//            }
-//            else if (line.startsWith("uiInput:"))
-//            {
-//                parseUIInput(line.substring("uiInput:".length()).trim());
-//            }
-//            else if (line.startsWith("uiOutput:"))
-//            {
-//                parseUIOutput(line.substring("uiOutput:".length()).trim());
-//            }
-//            else if (line.startsWith("endView"))
-//            {
-//                //
-//            }
-//        }
-//        return bytesRead;
-//    }
-
-//    private ComponentInfo  parseComponent(final String line)
-//    {
-//        final String[]  fields = line.split(",");
-//        if (fields.length >= 4)
-//        {
-//            String parentId = "!".equals(fields[0]) ? null : fields[0];
-//            String id = "!".equals(fields[1]) ? null : fields[1];
-//            String componentFamily = fields[2];
-//            String renderFamily = fields[3];
-//            
-//            ComponentInfo componentInfo = 
-//                ComponentFactory.createComponentInfo
-//                    (id, parentId, componentFamily, renderFamily);
-//
-//            if (id == null)
-//            {
-//                _treeRoot = componentInfo;
-//                _idIndex.put(null, componentInfo);
-//            }
-//            else
-//            {
-//                _idIndex.put(id, componentInfo);
-//                
-//                ComponentInfo parent = 
-//                    (ComponentInfo)_idIndex.get(parentId);
-//                
-//                if (parent != null)
-//                {
-//                    parent.getChildren().add(componentInfo);
-//                }
-//                else
-//                {
-//                    _treeRoot.getChildren().add(componentInfo);
-//                }
-//            }
-//        }
-//        return null;
-//    }
-//    
-//    private FacetInfo parseFacet(final String line)
-//    {
-//        final String[]  fields = line.split(",");
-//
-//        if (fields.length >= 4)
-//        {
-//            String parentId = "!".equals(fields[0]) ? null : fields[0];
-//            String id = "!".equals(fields[1]) ? null : fields[1];
-//            String componentFamily = fields[2];
-//            String renderFamily = fields[3];
-//
-//            FacetInfo facetInfo = 
-//                ComponentFactory.createFacetInfo(id, parentId, componentFamily, renderFamily);
-//            ComponentInfo  parent = _idIndex.get(parentId);
-//            
-//            if (parent != null)
-//            {
-//                parent.getChildren().add(facetInfo);
-//            }
-//            
-//            return facetInfo;
-//        }
-//        return null;
-//    }
-//    
-//    private UIInputInfo parseUIInput(final String line)
-//    {
-//        final String[]  fields = line.split(",");
-//
-//        if (fields.length >= 7)
-//        {
-//            String parentId = "!".equals(fields[0]) ? null : fields[0];
-//            String id = "!".equals(fields[1]) ? null : fields[1];
-//            String componentFamily = fields[2];
-//            String renderFamily = fields[3];
-//            String isValid = fields[4];
-//            String isImmediate = fields[5];
-//            String isRequired = fields[6];
-//            String isRendered = fields[7];
-//            
-//            UIInputInfo uiInputInfo = 
-//                ComponentFactory.createUIInputInfo
-//                    (id, parentId, componentFamily, renderFamily, isValid, isImmediate, isRequired, isRendered);
-//            ComponentInfo  parent = _idIndex.get(parentId);
-//            
-//            if (parent != null)
-//            {
-//                parent.getChildren().add(uiInputInfo);
-//            }
-//            
-//            return uiInputInfo;
-//        }            
-//        return null;
-//    }
-//    
-//    private UIOutputInfo parseUIOutput(final String line)
-//    {
-//        final String[]  fields = line.split(",");
-//
-//        if (fields.length >= 4)
-//        {
-//            String parentId = "!".equals(fields[0]) ? null : fields[0];
-//            String id = "!".equals(fields[1]) ? null : fields[1];
-//            String componentFamily = fields[2];
-//            String renderFamily = fields[3];
-//            String isRendered = fields[4];
-//            
-//            UIOutputInfo uiOutputInfo = 
-//                ComponentFactory.createUIOutputInfo(id, parentId, componentFamily, renderFamily, isRendered);
-//            
-//            ComponentInfo  parent = _idIndex.get(parentId);
-//            
-//            if (parent != null)
-//            {
-//                parent.getChildren().add(uiOutputInfo);
-//            }
-//            
-//            return uiOutputInfo;
-//        }            
-//        return null;
-//    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/debug/JSFMonitorMessage.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/debug/JSFMonitorMessage.java
deleted file mode 100644
index 4b2be53..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/debug/JSFMonitorMessage.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.debug;
-
-import java.io.Serializable;
-
-/**
- * Super of all messages that are sent by the JSF debug monitor
- * @author cbateman
- *
- */
-public abstract class JSFMonitorMessage implements Serializable
-{
-    /**
-     * 
-     */
-    private static final long serialVersionUID = -5417558019077000040L;
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/debug/MonitorMessageFactory.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/debug/MonitorMessageFactory.java
deleted file mode 100644
index eb57677..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/debug/MonitorMessageFactory.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.debug;
-
-import org.eclipse.jst.jsf.common.runtime.internal.model.component.ComponentInfo;
-
-/**
- * Creates JSF remote monitor messages.
- * 
- * @author cbateman
- *
- */
-public class MonitorMessageFactory 
-{
-    /**
-     * @param viewId
-     * @param root
-     * @param renderRoot
-     * @return a new component tree message for the parameters
-     */
-    public static ComponentTreeMessage createTreeMessage(final String viewId, final ComponentInfo root, final RenderNode renderRoot)
-    {
-        ComponentTreeMessage message = new ComponentTreeMessage();
-        message.setViewId(viewId);
-        message.setTreeRoot(root);
-        message.setRenderRoot(renderRoot);
-        return message;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/debug/RenderAttribute.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/debug/RenderAttribute.java
deleted file mode 100644
index e0c1b91..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/debug/RenderAttribute.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.debug;
-
-/**
- * Information about a rendered XML attribute
- * 
- * @author cbateman
- *
- */
-public class RenderAttribute extends JSFMonitorMessage {
-
-    /**
-     * 
-     */
-    private static final long serialVersionUID = -4601065346261130623L;
-
-    private final String  _name;        // the name of the attribute.  TODO: local vs. namespace?
-    private final String  _value;       // the rendered value of the  node
-    private final String  _propertyName;  // the property name on the corresponding component
-                                          // may be null
-    /**
-     * @param name
-     * @param value
-     * @param propertyName
-     */
-    public RenderAttribute(String name, String value, String propertyName) {
-        super();
-        _name = name;
-        _propertyName = propertyName;
-        _value = value;
-    }
-    /**
-     * @return the name of the attribute
-     */
-    public final String getName() {
-        return _name;
-    }
-    /**
-     * @return the attribute's value
-     */
-    public final String getValue() {
-        return _value;
-    }
-    /**
-     * @return the name of the corresponding component property if any.
-     */
-    public final String getPropertyName() {
-        return _propertyName;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/debug/RenderNode.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/debug/RenderNode.java
deleted file mode 100644
index 2679c62..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/debug/RenderNode.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.debug;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-/**
- * A rendered XML node.
- * 
- * @author cbateman
- *
- */
-public class RenderNode extends JSFMonitorMessage 
-{
-    /**
-     * 
-     */
-    private static final long serialVersionUID = -2843929405836710015L;
-
-    private final String      _componentId;       // the id of the component id that caused the node to render
-    private final String      _renderedNodeName;  // the node
-    private final List/*<RenderedAttribute>*/        _renderedAttributes; // attributes
-    private final List        _children;          // the rendered children of renderedNode based
-                                                  // on the output document hiearchy
-    /**
-     * @param componentId
-     * @param renderedNodeName
-     */
-    public RenderNode(String componentId, String renderedNodeName) {
-        super();
-        _componentId = componentId;
-        _renderedNodeName = renderedNodeName;
-        
-        _children = new ArrayList();
-        _renderedAttributes = new ArrayList();
-    }
-    /**
-     * @return the corresponding component's id
-     */
-    public final String getComponentId() {
-        return _componentId;
-    }
-    /**
-     * @return the node's children
-     */
-    public final List getChildren() {
-        return _children;
-    }
-    /**
-     * @return the name of the rendered node (element)
-     */
-    public final String getRenderedNodeName() {
-        return _renderedNodeName;
-    }
-    /**
-     * @return the attributes of this node as rendered.
-     */
-    public final List getRenderedAttributes() {
-        return _renderedAttributes;
-    }
-    public String toString()
-    {
-        String toString = "Root node: "+_renderedNodeName+", attributes: ["; //$NON-NLS-1$ //$NON-NLS-2$
-        
-        for (Iterator it = _renderedAttributes.iterator(); it.hasNext();)
-        {
-            final RenderAttribute attribute = (RenderAttribute) it.next();
-            toString+=attribute.getName() + "=" + attribute.getValue(); //$NON-NLS-1$
-            
-            toString+=it.hasNext() ? ", " : "]"; //$NON-NLS-1$ //$NON-NLS-2$
-        }
-        
-        return toString;
-    }
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/IDesigntimeAdapter.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/IDesigntimeAdapter.java
deleted file mode 100644
index bd427e6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/IDesigntimeAdapter.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.model;
-
-/**
- * Implemented by design time adapters that represent runtime interfaces.
- * 
- * @author cbateman
- *
- */
-public interface IDesigntimeAdapter
-{
-    /**
-     * @return the list of runtime interfaces that this runtime adapter 
-     * represents.
-     */
-    String[]  getInterfaces();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/ViewObject.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/ViewObject.java
deleted file mode 100644
index 9c36f72..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/ViewObject.java
+++ /dev/null
@@ -1,542 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.model;
-
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.jst.jsf.common.runtime.internal.model.decorator.Decorator;
-
-/**
- * The base type of all objects that participate in the lifecycle of a view.
- * This may be used to hold either design time or runtime information.
- * 
- * @author cbateman
- * 
- */
-public abstract class ViewObject implements Serializable /* IAdaptable? */
-{
-    private final ViewObjectData    _data;
-
-    /**
-     * 
-     */
-    private static final long serialVersionUID = 1592205691642453075L;
-
-    /**
-     * 
-     */
-    protected ViewObject()
-    {
-        this(new ViewObjectData(false));
-    }
-
-    /**
-     * @param delegate
-     */
-    protected ViewObject(final ViewObjectData delegate)
-    {
-        _data = delegate;
-        _data.setOwner(this);
-    }
-
-    /**
-     * @return the object containing all this view object's data
-     */
-    protected ViewObjectData getData()
-    {
-        return _data;
-    }
-
-    /**
-     * IMPORTANT: if this method returns false, then calling a mutator method
-     * (basically anything that is not a get/isX() will throw any
-     * IllegalStateException).
-     * 
-     * @return if the object can still be modified.
-     */
-    public final boolean isModifiable()
-    {
-        return !getData().isProtected();
-    }
-
-    /**
-     * Calling this method sets the state to not modifiable
-     */
-    public final void setProtected()
-    {
-        getData().setLocked();
-    }
-
-    /**
-     * This call may be create a new data structure and should be considered of
-     * much higher cost than most calls.
-     * 
-     * @return all decorators of this object. List should be assumed by clients
-     *         to be unmodifiable and may throw mutation exceptions
-     */
-    public List getAllDecorators()
-    {
-        final int size = getDecoratorMap().size();
-
-        if (size == 0)
-        {
-            return Collections.EMPTY_LIST;
-        }
-
-        final List allDecorators = new ArrayList();
-        for (final Iterator entryIt = getDecoratorMap().entrySet().iterator(); entryIt
-        .hasNext();)
-        {
-            final Map.Entry entry = (Map.Entry) entryIt.next();
-            final List decorators = (List) entry.getValue();
-            allDecorators.addAll(decorators);
-        }
-
-        return Collections.unmodifiableList(allDecorators);
-    }
-
-    /**
-     * @param decoratorType
-     * @return all decorators of this object associated with the class type. The
-     *         returned list should be assumed to be unmodifiable. Returns an
-     *         empty list if no decorators are associated with decoratorType
-     */
-    public List getDecorators(final Class decoratorType)
-    {
-        final List decorators = (List) getDecoratorMap().get(decoratorType);
-
-        if (decorators == null)
-        {
-            return Collections.EMPTY_LIST;
-        }
-        return Collections.unmodifiableList(decorators);
-    }
-
-    /**
-     * Add the decorator using decorator.getClass to associate the type. Must be
-     * equivalent to addDecorator(decorator, decorator.getClass());
-     * 
-     * @param decorator
-     *            the decorator to add. <b>Must NOT be null.</b>
-     * @throws IllegalArgumentException
-     *             if decorator is null.
-     */
-    public void addDecorator(final Decorator decorator)
-    {
-        _data.addDecorator(decorator);
-    }
-
-    /**
-     * Add the decorator using the associatedType. Normally you should call
-     * {@link #addDecorator(Decorator)} however in some cases you may wish to
-     * associated a decorator with a class type other than its own. For example,
-     * sub-classes of ValidatorDecorator will want to associated with
-     * ValidatorDecorator.getClass() in most cases so that it is included in any
-     * common examination of component validators.
-     * 
-     * @param decorator
-     *            to add. <b>Must NOT be null.</b>
-     * @param associatedType
-     *            the key to store decorator <b>Must NOT be null</b>
-     * @throws IllegalArgumentException
-     *             if decorator or associatedType is null
-     */
-    public void addDecorator(final Decorator decorator,
-            final Class associatedType)
-    {
-        _data.addDecorator(decorator, associatedType);
-    }
-
-    /**
-     * Removes decorator if it is associated to associatedType on this view
-     * object.
-     * 
-     * @param decorator
-     * @param associatedType
-     * @return true if the decorator was found and removed.
-     * @throws IllegalArgumentException
-     *             if decorator or associatedType is null
-     */
-    public boolean removeDecorator(final Decorator decorator,
-            final Class associatedType)
-    {
-        return _data.removeDecorator(decorator, associatedType);
-    }
-
-    /**
-     * <p>
-     * Get the adapter associated the class key.
-     * </p>
-     * 
-     * <p>
-     * If addAdapter has been called with adapterType, then this adapter object
-     * should always be called. In the default implementation, if there is no
-     * explicit adapter, "this" is returned if (this instanceof adapterType).
-     * 
-     * @param adapterType
-     * @return the interface adapter associated with the class key or null if
-     *         not found
-     */
-    public Object getAdapter(final Class adapterType)
-    {
-        if (adapterType == null)
-        {
-            return null;
-        }
-
-        Object adapter = getAdapterMap().get(adapterType);
-
-        if (adapter == null)
-        {
-            if (adapterType.isInstance(this))
-            {
-                adapter = this;
-            }
-        }
-
-        return adapter;
-    }
-
-    /**
-     * Adds the interface adapter object under adapterType key. There can be at
-     * most one adapter registered for each class key.
-     * 
-     * It is an error (throws exception) to try to add an adapter for
-     * adapterType which this is already instance. This restriction is necessary
-     * because otherwise local getters/setters would need to be aware of the
-     * adapter mechanism and verify inheritance hierarchies on every calls. This
-     * mechanism is intended only for adding interfaces to view object impls
-     * that don't already have them.
-     * 
-     * @param adapterType
-     * @param adapter
-     * @throws IllegalArgumentException
-     *             if adapterType or adapter is null or if casting adapter to
-     *             adapterType would * cause a ClassCastException (i.e. if
-     *             !(adapter instanceof adapterType)) OR if this is already an
-     *             instance of adapterType.
-     */
-    public void addAdapter(final Class adapterType, final Object adapter)
-    {
-        _data.addAdapter(adapterType, adapter);
-    }
-
-    /**
-     * Note that {@link #getAdapter(Class)} may still return non-null after this
-     * is called if (this instanceof adapterType).
-     * 
-     * @param adapterType
-     * @return the adapter for adapterType that was just removed or null if not
-     *         found
-     */
-    public Object removeAdapter(final Class adapterType)
-    {
-        return getAdapterMap().remove(adapterType);
-    }
-
-    /**
-     * Note that this only returns those adapters added using
-     * {@link #addAdapter(Class, Object)}. It does not return any implicit
-     * adapters resulting from (this instanceof type).
-     * 
-     * @return the map of all adapters. Maps is immutable and may throw
-     *         exceptions on attempts to mutate.
-     */
-    public Map getAllAdapters()
-    {
-        if (getAdapterMap().size() == 0)
-        {
-            return Collections.EMPTY_MAP;
-        }
-        return Collections.unmodifiableMap(getAdapterMap());
-    }
-
-    /**
-     * <p>
-     * The contract for this method is that it must always return a usable Map
-     * and that map must be the same on every call. Lazy construction may be
-     * used (as it is by default). The default map size is 4 and load factor is
-     * 3 meaning that there should be decent tradeoff between wasted table size
-     * and overhead used to increase it should the number of decorators exceed
-     * 3. <b>Must never return null.</b>
-     * </p>
-     * 
-     * <p>
-     * Generally, the method should not need to be overridden, however it is
-     * provided to allow sub-classes to change the way the decorators map is
-     * constructed.
-     * </p>
-     * 
-     * @return the map containing lists of decorators keyed by class.
-     * 
-     */
-    protected Map getDecoratorMap()
-    {
-        return _data.getDecoratorMap();
-    }
-
-    /**
-     * <p>
-     * The contract for this method is that it must always return a usable Map
-     * and that map must be the same on every call. Lazy construction may be
-     * used (as it is by default). The default map size is 4 and load factor is
-     * 3 meaning that there should be decent tradeoff between wasted table size
-     * and overhead used to increase it should the number of decorators exceed
-     * 3. <b>Must never return null.</b>
-     * </p>
-     * 
-     * <p>
-     * Generally, the method should not need to be overridden, however it is
-     * provided to allow sub-classes to change the way the decorators map is
-     * constructed.
-     * </p>
-     * 
-     * @return the map containing lists of adapters keyed by class.
-     * 
-     */
-    protected Map getAdapterMap()
-    {
-        return _data.getAdapterMap();
-    }
-
-    // ALL ViewObject's must use reference equals
-    public final boolean equals(final Object obj)
-    {
-        return super.equals(obj);
-    }
-
-    public final int hashCode()
-    {
-        return super.hashCode();
-    }
-
-    /**
-     * The protectable view object data.
-     * 
-     */
-    public static class ViewObjectData extends ProtectedDataObject
-    {
-        /**
-         * 
-         */
-        private static final long serialVersionUID = -4216980607447926035L;
-        private Map _decorators;
-        private Map _adapters;
-        private Object _owner;
-
-        /**
-         * @param isProtected
-         */
-        public ViewObjectData(final boolean isProtected)
-        {
-            super(isProtected);
-        }
-
-        private void setOwner(final ViewObject viewObject)
-        {
-            _owner = viewObject;
-        }
-
-        /**
-         * For serialization only.
-         */
-        //        public ViewObjectData()
-        //        {
-        //            // for serializability
-        //            super(false);
-        //        }
-
-        /**
-         * @param decorator
-         * @param associatedType
-         * @return true if the decorator was removed.
-         */
-        public boolean removeDecorator(final Decorator decorator, final Class associatedType)
-        {
-            enforceProtection();
-
-            if (decorator == null || associatedType == null)
-            {
-                throw new IllegalArgumentException("Arguments must not be null"); //$NON-NLS-1$
-            }
-
-            final List decoratorsByType = (List) getDecoratorMap().get(
-                    associatedType);
-
-            if (decoratorsByType != null)
-            {
-                return decoratorsByType.remove(decorator);
-            }
-
-            return false;
-        }
-
-        /**
-         * @param adapterType
-         * @param adapter
-         */
-        public void addAdapter(final Class adapterType, final Object adapter)
-        {
-            enforceProtection();
-
-            if (adapterType == null || adapter == null)
-            {
-                throw new IllegalArgumentException("Arguments must not be null"); //$NON-NLS-1$
-            }
-
-            if (!adapterType.isInstance(adapter))
-            {
-                throw new IllegalArgumentException("adapter: " + adapter //$NON-NLS-1$
-                        + " must be cast compatible to class: " + adapterType); //$NON-NLS-1$
-            }
-            else if (adapterType.isInstance(_owner))
-            {
-                throw new IllegalArgumentException("this: " + _owner //$NON-NLS-1$
-                        + " must not already be an instance of class: " //$NON-NLS-1$
-                        + adapterType);
-            }
-            getAdapterMap().put(adapterType, adapter);
-        }
-
-        /**
-         * @param decorator
-         */
-        public void addDecorator(final Decorator decorator)
-        {
-            enforceProtection();
-
-            if (decorator == null)
-            {
-                throw new IllegalArgumentException("Arguments must not be null"); //$NON-NLS-1$
-            }
-            final Class associationType = decorator.getClass();
-            addDecorator(decorator, associationType);
-        }
-
-        /**
-         * @param decorator
-         * @param associatedType
-         */
-        public void addDecorator(final Decorator decorator, final Class associatedType)
-        {
-            enforceProtection();
-
-            if (decorator == null || associatedType == null)
-            {
-                throw new IllegalArgumentException("Arguments must not be null"); //$NON-NLS-1$
-            }
-
-            List decoratorsByType = (List) getDecoratorMap().get(associatedType);
-
-            if (decoratorsByType == null)
-            {
-                decoratorsByType = new ArrayList(2);
-                getDecoratorMap().put(associatedType, decoratorsByType);
-            }
-
-            decoratorsByType.add(decorator);
-        }
-
-        /**
-         * @return the decorator map, creating it if necessary
-         */
-        protected synchronized Map getDecoratorMap()
-        {
-            if (_decorators == null)
-            {
-                if (isProtected())
-                {
-                    _decorators = Collections.EMPTY_MAP;
-                }
-                _decorators = new HashMap(4);
-            }
-            return _decorators;
-        }
-
-        /**
-         * @return the adapter map, creating if necessary.
-         */
-        protected synchronized Map getAdapterMap()
-        {
-            if (_adapters == null)
-            {
-                _adapters = new HashMap(4);
-            }
-
-            return _adapters;
-        }
-    }
-
-    /**
-     * An object that enforces that mutation can only happen up to point where
-     * the object is designated protected at which point is it is forever
-     * immutable.
-     * 
-     */
-    public static abstract class ProtectedDataObject implements Serializable
-    {
-        /**
-         * 
-         */
-        private static final long serialVersionUID = 4470279408370430399L;
-        private boolean _isProtected;
-
-        /**
-         * @param isProtected
-         */
-        public ProtectedDataObject(final boolean isProtected)
-        {
-            _isProtected = isProtected;
-        }
-
-        /**
-         * @throws UnsupportedOperationException
-         */
-        protected final synchronized void enforceProtection() throws UnsupportedOperationException
-        {
-            if (isProtected())
-            {
-                throw new UnsupportedOperationException("Object "+this.toString()+ " is locked for modification"); //$NON-NLS-1$ //$NON-NLS-2$
-            }
-        }
-
-        /**
-         * @return true if this object is protected and irrevocablly immutable.
-         */
-        public final synchronized boolean isProtected()
-        {
-            return _isProtected;
-        }
-
-        /**
-         * Executed right before setProtected irrevocably sets the protection
-         * flag. Does nothing by default
-         */
-        protected void doBeforeProtecting()
-        {
-            // do nothing by default
-        }
-        /**
-         * Makes this object irrevocably immutable.
-         */
-        public final synchronized void setLocked()
-        {
-            doBeforeProtecting();
-            _isProtected = true;
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/bean/DataModelInfo.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/bean/DataModelInfo.java
deleted file mode 100644
index e7c2e93..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/bean/DataModelInfo.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.model.bean;
-
-import java.io.Serializable;
-
-/**
- * Design time analog of runtime DataModel bean
- * 
- * @author cbateman
- *
- */
-public class DataModelInfo implements Serializable 
-{
-    /**
-     * serializable id
-     */
-    private static final long serialVersionUID = 6461056497382677871L;
-
-    private final boolean               _rowAvailable;
-    private final int                   _rowCount;
-    private final SerializableObject    _rowData;
-    private final int                   _rowIndex;
-    private final SerializableObject    _wrappedData;
-
-    /**
-     * @param rowAvailable
-     * @param rowCount
-     * @param rowData
-     * @param rowIndex
-     * @param wrappedData
-     */
-    public DataModelInfo(boolean rowAvailable, int rowCount, Object rowData,
-            int rowIndex, Object wrappedData) {
-        super();
-        _rowAvailable = rowAvailable;
-        _rowCount = rowCount;
-        _rowData = new SerializableObject(rowData);
-        _rowIndex = rowIndex;
-        _wrappedData = new SerializableObject(wrappedData);
-    }
-
-    /**
-     * @return true if the current row is available
-     */
-    public final boolean isRowAvailable() {
-        return _rowAvailable;
-    }
-    /**
-     * @return the row count of this model
-     */
-    public final int getRowCount() {
-        return _rowCount;
-    }
-    /**
-     * @return the row data
-     */
-    public final Object getRowData() {
-        return _rowData.getMaybeSerializable();
-    }
-    /**
-     * @return the row index
-     */
-    public final int getRowIndex() {
-        return _rowIndex;
-    }
-    /**
-     * @return the wrapped data.  may be null if wrapped object was not
-     * serializable.
-     */
-    public final Object getWrappedData() {
-        return _wrappedData.getMaybeSerializable();
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/bean/SerializableObject.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/bean/SerializableObject.java
deleted file mode 100644
index e3b066a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/bean/SerializableObject.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.model.bean;
-
-import java.io.IOException;
-import java.io.NotSerializableException;
-import java.io.Serializable;
-
-/**
- * A special object used in place of Object to ensure that when an interface
- * requires a generic #{@link java.lang.Object}, it won't throw serialization
- * exception when a containing object is serialized.
- * 
- * @author cbateman
- * 
- */
-public class SerializableObject implements Serializable
-{
-    /**
-     * 
-     */
-    private static final long serialVersionUID = 9133733048469500692L;
-    private Object      _maybeSerializable;
-    
-    /**
-     * @param maybeSerializable
-     */
-    public SerializableObject(Object maybeSerializable)
-    {
-        _maybeSerializable = maybeSerializable;
-    }
-    
-    
-//    /**
-//     * Provided to support serialization.  Should not be used by sub-classes
-//     * or clients except in this regard.
-//     */
-//    protected SerializableObject()
-//    {
-//        _maybeSerializable = null;
-//    }
-    
-    /**
-     * @return the actual value
-     */
-    public final Object getMaybeSerializable() {
-        return _maybeSerializable;
-    }
-
-
-    private void writeObject(java.io.ObjectOutputStream out)
-        throws IOException
-    {
-        try
-        {
-            out.writeObject(_maybeSerializable);
-        }
-        catch (NotSerializableException nse)
-        {
-            // do nothing, the object isn't guaranteed to be serializable,
-            // but we don't want this be an error
-            out.writeObject(null);
-        }
-    }
-    
-    private void readObject(java.io.ObjectInputStream in)
-        throws IOException, ClassNotFoundException
-    {
-        _maybeSerializable = in.readObject();
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/behavioural/ActionSourceInfo.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/behavioural/ActionSourceInfo.java
deleted file mode 100644
index 6e7348d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/behavioural/ActionSourceInfo.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.model.behavioural;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.jst.jsf.common.runtime.internal.model.IDesigntimeAdapter;
-import org.eclipse.jst.jsf.common.runtime.internal.model.component.ComponentFactory;
-import org.eclipse.jst.jsf.common.runtime.internal.model.decorator.ActionListenerDecorator;
-
-/**
- * Implementation of the ActionSourceInfo.
- * 
- * @author cbateman
- *
- */
-public class ActionSourceInfo implements IActionSourceInfo, IDesigntimeAdapter
-{
-    /**
-     * serializable id
-     */
-    private static final long serialVersionUID = 6531166406473466685L;
-    private static final String[]                INTERFACE = new String[]{ComponentFactory.INTERFACE_ACTIONSOURCE};
-    private final String                                    _action;
-    private final String                                    _actionListener;
-    private final boolean                                   _immediate;
-    private List/*<ActionListenerDecorator>*/               _actionListeners;
-    
-    /**
-     * @param action
-     * @param actionListener
-     * @param immediate
-     */
-    public ActionSourceInfo(final String action, final String actionListener,
-            final boolean immediate) 
-    {
-        super();
-        _action = action;
-        _actionListener = actionListener;
-        _immediate = immediate;
-    }
-
-    public void addActionListener(final ActionListenerDecorator actionListener) {
-        if (_actionListeners == null)
-        {
-            _actionListeners = new ArrayList(2);
-        }
-        _actionListeners.add(actionListener);
-    }
-
-    public String getAction() {
-        return _action;
-    }
-
-    public String getActionListener() {
-        return _actionListener;
-    }
-
-    public List getActionListeners() {
-        if (_actionListeners == null)
-        {
-            return Collections.EMPTY_LIST;
-        }
-        return Collections.unmodifiableList(_actionListeners);
-    }
-
-    public boolean isImmediate() {
-        return _immediate;
-    }
-
-    public String[] getInterfaces()
-    {
-        return INTERFACE;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/behavioural/ActionSourceInfo2.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/behavioural/ActionSourceInfo2.java
deleted file mode 100644
index d36b95b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/behavioural/ActionSourceInfo2.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.model.behavioural;
-
-import org.eclipse.jst.jsf.common.runtime.internal.model.IDesigntimeAdapter;
-import org.eclipse.jst.jsf.common.runtime.internal.model.component.ComponentFactory;
-
-/**
- * Implementation of the IActionSource2Info
- * 
- * @author cbateman
- *
- */
-public class ActionSourceInfo2 extends ActionSourceInfo implements
-        IActionSource2Info, IDesigntimeAdapter
-{
-    /**
-     * serializable id
-     */
-    private static final long serialVersionUID = 5811194815559772378L;
-    private static final String[]                INTERFACE = new String[]{ComponentFactory.INTERFACE_ACTIONSOURCE2};
-
-    private final String        _actionExpression;
-    
-    /**
-     * @param action
-     * @param actionListener
-     * @param immediate
-     * @param actionExpression
-     */
-    public ActionSourceInfo2(final String action, final String actionListener,
-            final boolean immediate, final String actionExpression) {
-        super(action, actionListener, immediate);
-        _actionExpression = actionExpression;
-    }
-
-    public String getActionExpression() {
-        return _actionExpression;
-    }
-
-    public String[] getInterfaces()
-    {
-        return INTERFACE;
-    }
-    
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/behavioural/EditableValueHolderInfo.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/behavioural/EditableValueHolderInfo.java
deleted file mode 100644
index 8b07c45..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/behavioural/EditableValueHolderInfo.java
+++ /dev/null
@@ -1,144 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.model.behavioural;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.jst.jsf.common.runtime.internal.model.IDesigntimeAdapter;
-import org.eclipse.jst.jsf.common.runtime.internal.model.component.ComponentFactory;
-import org.eclipse.jst.jsf.common.runtime.internal.model.decorator.ConverterDecorator;
-import org.eclipse.jst.jsf.common.runtime.internal.model.decorator.ValidatorDecorator;
-import org.eclipse.jst.jsf.common.runtime.internal.model.decorator.ValueChangeListenerDecorator;
-
-/**
- * Implementation of the IEditableValueHolderInfo
- * 
- * @author cbateman
- *
- */
-public class EditableValueHolderInfo extends ValueHolderInfo implements
-        IEditableValueHolderInfo, IDesigntimeAdapter
-{
-    /**
-     * 
-     */
-    private static final long serialVersionUID = -2115990809157328451L;
-    private static final String[]  INTERFACE = new String[] {ComponentFactory.INTERFACE_EDITABLEVALUEHOLDER};
-    
-    private final boolean       _localSetValue;
-    private final Object        _submittedValue;
-    private final String        _validator;
-    private final String        _valueChangeListener;
-    private final boolean       _isImmediate;
-    private final boolean       _isRequired;
-    private final boolean       _isValid;
-    private List                _validators;
-    private List                _valueChangeListeners;
-    
-    /**
-     * @param converterDecorator
-     * @param localValue
-     * @param value
-     * @param isImmediate
-     * @param isRequired
-     * @param isValid
-     * @param localSetValue
-     * @param submittedValue
-     * @param validator
-     * @param valueChangeListener
-     */
-    public EditableValueHolderInfo(final ConverterDecorator converterDecorator,
-            final Object localValue, final Object value, final boolean isImmediate,
-            final boolean isRequired, final boolean isValid, final boolean localSetValue,
-            final Object submittedValue, final String validator, final String valueChangeListener) 
-    {
-        super(converterDecorator, localValue, value);
-        _isImmediate = isImmediate;
-        _isRequired = isRequired;
-        _isValid = isValid;
-        _localSetValue = localSetValue;
-        _submittedValue = submittedValue;
-        _validator = validator;
-        _valueChangeListener = valueChangeListener;
-    }
-
-    public final boolean isLocalSetValue() {
-        return _localSetValue;
-    }
-
-    public final Object getSubmittedValue() {
-        return _submittedValue;
-    }
-
-    public final String getValidator() {
-        return _validator;
-    }
-
-    public final String getValueChangeListener() {
-        return _valueChangeListener;
-    }
-
-    public final boolean isImmediate() {
-        return _isImmediate;
-    }
-
-    public final boolean isRequired() {
-        return _isRequired;
-    }
-
-    public final boolean isValid() {
-        return _isValid;
-    }
-
-    public void addValidator(final ValidatorDecorator validator) 
-    {
-        if (_validators == null)
-        {
-            _validators = new ArrayList(2);
-        }
-        _validators.add(validator);
-    }
-
-    public void addValueChangeListener(
-            final ValueChangeListenerDecorator valueChangeListenerInfo) 
-    {
-        if (_valueChangeListeners == null)
-        {
-            _valueChangeListeners = new ArrayList(2);
-        }
-        _valueChangeListeners.add(valueChangeListenerInfo);
-    }
-
-    public List getValidators() {
-        if (_validators == null)
-        {
-            return Collections.EMPTY_LIST;
-        }
-        
-        return Collections.unmodifiableList(_validators);
-    }
-
-    public List getValueChangeListeners() {
-        if (_valueChangeListeners == null)
-        {
-            return Collections.EMPTY_LIST;
-        }
-        
-        return Collections.unmodifiableList(_valueChangeListeners);
-    }
-
-    public String[] getInterfaces()
-    {
-        return INTERFACE;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/behavioural/IActionSource2Info.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/behavioural/IActionSource2Info.java
deleted file mode 100644
index 21966e1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/behavioural/IActionSource2Info.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.model.behavioural;
-
-/**
- * Design-time analog for the ActionSource2 interface.
- * 
- * @author cbateman
- *
- */
-public interface IActionSource2Info extends IActionSourceInfo 
-{
-    /**
-     * TODO: this method is similar to getAction on ActionSource from
-     * our perspective since the actual string rep of the EL is basically
-     * the same...
-     * 
-     * @return an EL method expression that represents a call to 
-     * an action method.
-     */
-    String getActionExpression();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/behavioural/IActionSourceInfo.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/behavioural/IActionSourceInfo.java
deleted file mode 100644
index 3d2dd2e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/behavioural/IActionSourceInfo.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.model.behavioural;
-
-import java.io.Serializable;
-import java.util.List;
-
-import org.eclipse.jst.jsf.common.runtime.internal.model.decorator.ActionListenerDecorator;
-
-/**
- * A design time analog for the runtime ActionSource interface.
- * 
- * @author cbateman
- *
- */
-public interface IActionSourceInfo extends Serializable
-{
-    /**
-     * @return true if action listener associated with this action source
-     * should be executed immediately after the apply request values phase.
-     * Default is false.
-     */
-    boolean isImmediate();
-    
-    
-    /**
-     * Add the action listener to the list
-     * 
-     * @param actionListener
-     */
-    void addActionListener(ActionListenerDecorator  actionListener);
-    
-    /**
-     * @return all action listeners registered.  List should be considered
-     * immutable and may throw exceptions if modified.
-     */
-    List/*<ActionListenerDecorator>*/ getActionListeners();
-    
-    /**
-     * <b> NOTE: this method is deprecated in the runtime spec and exists for
-     * backward compatibility with JSF 1.1. You should avoid using it except in
-     * conjunction with JSF 1.1 tooling support. This method will be deprecated
-     * once the runtime spec removes the underlying API</b>
-
-     * @return a method binding expression describing an action handler
-     */
-    String  getAction();
-    
-    /**
-     * <b> NOTE: this method is deprecated in the runtime spec and exists for
-     * backward compatibility with JSF 1.1. You should avoid using it except in
-     * conjunction with JSF 1.1 tooling support. This method will be deprecated
-     * once the runtime spec removes the underlying API</b>
-     * 
-     * @return a method binding expression describing an action listener
-     */
-    String  getActionListener();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/behavioural/IEditableValueHolderInfo.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/behavioural/IEditableValueHolderInfo.java
deleted file mode 100644
index 53403d1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/behavioural/IEditableValueHolderInfo.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.model.behavioural;
-
-import java.util.List;
-
-import org.eclipse.jst.jsf.common.runtime.internal.model.decorator.ValidatorDecorator;
-import org.eclipse.jst.jsf.common.runtime.internal.model.decorator.ValueChangeListenerDecorator;
-
-/**
- * A design time analog for the JSF runtime EditableValueHolder interface.
- * 
- * @author cbateman
- * 
- */
-public interface IEditableValueHolderInfo extends IValueHolderInfo {
-    /**
-     * @return the flag indicating whether the value of the value holder should
-     *         be evaluated in the apply request values phase instead of the
-     *         process validations phase
-     */
-    boolean isImmediate();
-
-    /**
-     * @return true if the value has been set
-     */
-    boolean isLocalSetValue();
-
-    /**
-     * @return true if validation should consider this field required (must be
-     *         non-empty).
-     */
-    boolean isRequired();
-
-    /**
-     * @return the submitted, unconverted value of the component.
-     */
-    Object getSubmittedValue();
-
-    /**
-     * @return false if validation has determined that the value property of
-     *         this component is not valid.
-     */
-    boolean isValid();
-
-    /**
-     * <b> NOTE: this method is deprecated in the runtime spec and exists for
-     * backward compatibility with JSF 1.1. You should avoid using it except in
-     * conjunction with JSF 1.1 tooling support. This method will be deprecated
-     * once the runtime spec removes the underlying API</b>
-     * 
-     * @return a method binding expression that refers to a validator method
-     */
-    String getValidator();
-
-    /**
-     * <b> NOTE: this method is deprecated in the runtime spec and exists for
-     * backward compatibility with JSF 1.1. You should avoid using it except in
-     * conjunction with JSF 1.1 tooling support. This method will be deprecated
-     * once the runtime spec removes the underlying API</b>
-     * 
-     * @return a method binding expression that refers to a value change
-     *         listener
-     */
-    String getValueChangeListener();
-
-    /**
-     * Add validator to the list of validators for this component. Should be
-     * equivalent to
-     * {@link org.eclipse.jst.jsf.common.runtime.internal.model.ViewObject#addDecorator(org.eclipse.jst.jsf.common.runtime.internal.model.decorator.Decorator, Class)}.
-     * 
-     * @param validator
-     */
-    void addValidator(ValidatorDecorator validator);
-
-    /**
-     * @return the list of validators for this component. Should be considered
-     *         unmodifiable (may throw exception).
-     */
-    List/* <ValidatorDecorator> */getValidators();
-
-    /**
-     * Add the value change listener to this component.
-     * 
-     * @param valueChangeListenerInfo
-     */
-    void addValueChangeListener(
-            ValueChangeListenerDecorator valueChangeListenerInfo);
-
-    /**
-     * @return the list of value change listeners. Should be considered
-     *         unmodifiable (may throw exception).
-     */
-    List/* <ValueChangeListenerDecorator> */getValueChangeListeners();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/behavioural/INamingContainerInfo.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/behavioural/INamingContainerInfo.java
deleted file mode 100644
index aeb1e98..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/behavioural/INamingContainerInfo.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.model.behavioural;
-
-import java.io.Serializable;
-
-import org.eclipse.jst.jsf.common.runtime.internal.model.IDesigntimeAdapter;
-import org.eclipse.jst.jsf.common.runtime.internal.model.component.ComponentFactory;
-
-/**
- * Design time analog for the NamingContainer interface.
- * 
- * @author cbateman
- * 
- */
-public interface INamingContainerInfo extends Serializable
-{
-    // tagging interface
-
-    /**
-     * Used as an adapter impl
-     */
-    public final static INamingContainerInfo ADAPTER = new NamingContainerInfo();
-    
-    /**
-     * A default naming container info
-     * @author cbateman
-     *
-     */
-    public static class NamingContainerInfo implements INamingContainerInfo, IDesigntimeAdapter
-    {
-        /**
-         * 
-         */
-        private static final long serialVersionUID = 7214529928361444126L;
-
-        public String[] getInterfaces()
-        {
-            return new String[] {ComponentFactory.INTERFACE_NAMINGCONTAINER};
-        }
-        
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/behavioural/IValueHolderInfo.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/behavioural/IValueHolderInfo.java
deleted file mode 100644
index 661dd81..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/behavioural/IValueHolderInfo.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.model.behavioural;
-
-import java.io.Serializable;
-
-import org.eclipse.jst.jsf.common.runtime.internal.model.decorator.ConverterDecorator;
-
-/**
- * Represents design time information about the ValueHolder behavioural
- * interface.
- * 
- * @author cbateman
- *
- */
-public interface IValueHolderInfo extends Serializable
-{
-    /**
-     * @return the value, may be null
-     */
-    Object getValue();
-    
-    /**
-     * @return the raw value without expression value evaluation.  Note that 
-     * {@link #getValue()} may return the same value in cases where this value
-     * holder is derived at design time without EL expression evaluation. May be null.
-     */
-    Object getLocalValue();
-    
-    /**
-     * @return the converter for this value holder or null if none.
-     */
-    ConverterDecorator getConverter();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/behavioural/ValueHolderInfo.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/behavioural/ValueHolderInfo.java
deleted file mode 100644
index 25c8e2e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/behavioural/ValueHolderInfo.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.model.behavioural;
-
-import org.eclipse.jst.jsf.common.runtime.internal.model.IDesigntimeAdapter;
-import org.eclipse.jst.jsf.common.runtime.internal.model.component.ComponentFactory;
-import org.eclipse.jst.jsf.common.runtime.internal.model.decorator.ConverterDecorator;
-
-/**
- * Implementation of the IValueHolderInfo.
- * 
- * @author cbateman
- *
- */
-public class ValueHolderInfo implements IValueHolderInfo, IDesigntimeAdapter
-{
-    /**
-     * 
-     */
-    private static final long serialVersionUID = 5000699728360703727L;
-
-    /**
-     * the value (may include EL evaluation)
-     */
-    protected final Object                  _value;
-    /**
-     * the raw value  before EL evaluation.
-     */
-    protected final Object                  _localValue;
-    /**
-     * the converter or null if none.
-     */
-    protected final ConverterDecorator      _converterDecorator;
-    
-    /**
-     * @param converterDecorator
-     * @param localValue
-     * @param value
-     */
-    public ValueHolderInfo(final ConverterDecorator converterDecorator,
-            final Object localValue, final Object value) {
-        super();
-        _converterDecorator = converterDecorator;
-        _localValue = localValue;
-        _value = value;
-    }
-    public final Object getValue() {
-        return _value;
-    }
-    public final Object getLocalValue() {
-        return _localValue;
-    }
-    public final ConverterDecorator getConverter() {
-        return _converterDecorator;
-    }
-    public String[] getInterfaces()
-    {
-        return new String[] {ComponentFactory.INTERFACE_VALUEHOLDER};
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/component/AbstractVisitor.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/component/AbstractVisitor.java
deleted file mode 100644
index a18b04f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/component/AbstractVisitor.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.model.component;
-
-/**
- * Implemented by visitors
- * 
- * @author cbateman
- * 
- */
-public abstract class AbstractVisitor
-{
-    /**
-     * A policy to control visitation
-     */
-    protected final VisitationPolicy _policy;
-
-    /**
-     * @param policy
-     */
-    protected AbstractVisitor(final VisitationPolicy policy)
-    {
-        super();
-        _policy = policy;
-    }
-
-    /**
-     * @param object
-     */
-    public abstract void visit(Object object);
-
-    /**
-     * @return the visitation policy
-     */
-    public VisitationPolicy getPolicy()
-    {
-        return _policy;
-    }
-
-    /**
-     * A policy that allows a visitor to configure how it will visit a tree.
-     * 
-     */
-    public static final class VisitationPolicy
-    {
-        /**
-         * indicates pre-order, parent first traversal (root visited first)
-         */
-        public static final int              VISIT_PARENT_FIRST   = 0;                          // pre-order
-        // tree
-        // visit
-        /**
-         * indicates post-order, children first traveral (root visited last)
-         */
-        public static final int              VISIT_CHILDREN_FIRST = 1;                          // post-order
-        // tree
-        // visit
-        /**
-         * A default parent first policy
-         */
-        public final static VisitationPolicy ParentFirstPolicy    = new VisitationPolicy(
-                VISIT_PARENT_FIRST);
-        /**
-         * A default children first policy
-         */
-        public final static VisitationPolicy ChildrenFirstPolicy  = new VisitationPolicy(
-                VISIT_CHILDREN_FIRST);
-
-        private final int                    _ordering;
-
-        /**
-         * @param ordering
-         */
-        public VisitationPolicy(final int ordering)
-        {
-            _ordering = ordering;
-        }
-
-        /**
-         * @return the ordering
-         */
-        public final int getOrdering()
-        {
-            return _ordering;
-        }
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/component/ComponentFactory.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/component/ComponentFactory.java
deleted file mode 100644
index a3c3762..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/component/ComponentFactory.java
+++ /dev/null
@@ -1,399 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.model.component;
-
-import java.util.Map;
-
-import org.eclipse.jst.jsf.common.runtime.internal.model.bean.DataModelInfo;
-import org.eclipse.jst.jsf.common.runtime.internal.model.behavioural.IActionSource2Info;
-import org.eclipse.jst.jsf.common.runtime.internal.model.behavioural.IActionSourceInfo;
-import org.eclipse.jst.jsf.common.runtime.internal.model.behavioural.IEditableValueHolderInfo;
-import org.eclipse.jst.jsf.common.runtime.internal.model.behavioural.INamingContainerInfo;
-import org.eclipse.jst.jsf.common.runtime.internal.model.behavioural.IValueHolderInfo;
-import org.eclipse.jst.jsf.common.runtime.internal.model.decorator.ConverterDecorator;
-import org.eclipse.jst.jsf.common.runtime.internal.model.decorator.FacetDecorator;
-import org.eclipse.jst.jsf.common.runtime.internal.model.decorator.ValidatorDecorator;
-import org.eclipse.jst.jsf.common.runtime.internal.model.event.IActionListenerInfo;
-import org.eclipse.jst.jsf.common.runtime.internal.model.event.IValueChangeListenerInfo;
-
-/**
- * Factory for creating component related objects.
- * 
- * @author cbateman
- * 
- */
-public class ComponentFactory
-{
-
-    /**
-     * The key for the standard ValueHolder adapter interface
-     */
-    public final static Class VALUE_HOLDER = IValueHolderInfo.class;
-    /**
-     * The key for the standard EditableValueHolder adapter interface
-     */
-    public final static Class EDITABLE_VALUE_HOLDER = IEditableValueHolderInfo.class;
-    /**
-     * The key for the standard ActionSource adapter interface
-     */
-    public final static Class ACTION_SOURCE = IActionSourceInfo.class;
-    /**
-     * The key for the standard ActionSource2 adapter interface
-     */
-    public final static Class ACTION_SOURCE2 = IActionSource2Info.class;
-    /**
-     * The key for the standard NamingContainer adapter interface
-     */
-    public final static Class NAMING_CONTAINER = INamingContainerInfo.class;
-
-    /**
-     * The key for the standard Converter decorator
-     */
-    public final static Class CONVERTER = ConverterDecorator.class;
-    /**
-     * The key for the standard Facet decorator
-     */
-    public final static Class FACET = FacetDecorator.class;
-    /**
-     * The key for the standard Validator decorator
-     */
-    public final static Class VALIDATOR = ValidatorDecorator.class;
-    /**
-     * The key for the standard ValueChangeListener decorator
-     */
-    public final static Class VALUE_CHANGE_LISTENER = IValueChangeListenerInfo.class;
-    /**
-     * The key for the standard ActionListener decorator
-     */
-    public final static Class ACTION_LISTENER = IActionListenerInfo.class;
-
-    /**
-     * Base class name for UIInput's
-     */
-    public final static String BASE_CLASS_UIINPUT = "javax.faces.component.UIInput"; //$NON-NLS-1$
-    /**
-     * Base class name for UIOutput's
-     */
-    public final static String BASE_CLASS_UIOUTPUT = "javax.faces.component.UIOutput"; //$NON-NLS-1$
-    /**
-     * Base class name for UICommand's
-     */
-    public final static String BASE_CLASS_UICOMMAND = "javax.faces.component.UICommand"; //$NON-NLS-1$
-    /**
-     * Base class name for UIData's
-     */
-    public final static String BASE_CLASS_UIDATA = "javax.faces.component.UIData"; //$NON-NLS-1$
-    /**
-     * Base class name for UIForm's
-     */
-    public final static String BASE_CLASS_UIFORM = "javax.faces.component.UIForm"; //$NON-NLS-1$
-
-    /**
-     * Interface name for ValueHolder's
-     */
-    public final static String INTERFACE_VALUEHOLDER = "javax.faces.component.ValueHolder"; //$NON-NLS-1$
-    /**
-     * Interface name for EditableValueHolder's
-     */
-    public final static String INTERFACE_EDITABLEVALUEHOLDER = "javax.faces.component.EditableValueHolder"; //$NON-NLS-1$
-    /**
-     * Interface name for ActionSource's
-     */
-    public final static String INTERFACE_ACTIONSOURCE = "javax.faces.component.ActionSource"; //$NON-NLS-1$
-    /**
-     * Interface name for ActionSource2's
-     */
-    public final static String INTERFACE_ACTIONSOURCE2 = "javax.faces.component.ActionSource2"; //$NON-NLS-1$
-    /**
-     * Interface name for NamingContainer's
-     */
-    public final static String INTERFACE_NAMINGCONTAINER = "javax.faces.component.NamingContainer"; //$NON-NLS-1$
-
-    /**
-     * @param id
-     * @param parent
-     * @param typeInfo
-     * @param isRendered
-     * @return a new component info
-     */
-    public static ComponentInfo createComponentInfo(final String id,
-            final ComponentInfo parent, final ComponentTypeInfo typeInfo,
-            final boolean isRendered)
-    {
-        return new ComponentInfo(id, parent, typeInfo, isRendered);
-    }
-
-    /**
-     * If the rendered attribute isn't set, defaults it.
-     * 
-     * @param attributes
-     */
-    public static void maybeDefaultRendered(final Map attributes)
-    {
-        if (!(attributes.get("rendered") instanceof Boolean)) //$NON-NLS-1$
-        {
-            attributes.put("rendered", Boolean.TRUE); //$NON-NLS-1$
-        }
-    }
-
-    /**
-     * @param parent
-     * @param componentTypeInfo
-     * @param attributes
-     * @return a new component info
-     */
-    public static ComponentInfo createComponentInfo(final ComponentInfo parent,
-            final ComponentTypeInfo componentTypeInfo, final Map attributes)
-    {
-        maybeDefaultRendered(attributes);
-        return new ComponentInfo(parent, componentTypeInfo, attributes);
-    }
-
-    /**
-     * @param id
-     * @param parent
-     * @param typeInfo
-     * @param editableValueHolder
-     * @param isRendered
-     * @return a new UIInputInfo
-     */
-    public static UIInputInfo createUIInputInfo(final String id,
-            final ComponentInfo parent, final ComponentTypeInfo typeInfo,
-            final IEditableValueHolderInfo editableValueHolder,
-            final boolean isRendered)
-    {
-        return new UIInputInfo(id, parent, typeInfo, editableValueHolder,
-                isRendered);
-    }
-
-    /**
-     * @param parent
-     * @param typeInfo
-     * @param attributes
-     * @return a new UIInputInfo
-     */
-    public static UIInputInfo createUIInputInfo(final ComponentInfo parent,
-            final ComponentTypeInfo typeInfo, final Map attributes)
-    {
-        maybeDefaultRendered(attributes);
-        return new UIInputInfo(parent, typeInfo, attributes);
-    }
-
-    /**
-     * @param id
-     * @param parent
-     * @param typeInfo
-     * @param valueHolderInfo
-     * @param isRendered
-     * @return a new UIOutputInfo
-     */
-    public static UIOutputInfo createUIOutputInfo(final String id,
-            final ComponentInfo parent, final ComponentTypeInfo typeInfo,
-            final IValueHolderInfo valueHolderInfo, final boolean isRendered)
-    {
-        return new UIOutputInfo(id, parent, typeInfo, valueHolderInfo,
-                isRendered);
-    }
-
-    /**
-     * @param parent
-     * @param typeInfo
-     * @param attributes
-     * @return a new UIOutputInfo
-     */
-    public static UIOutputInfo createUIOutputInfo(final ComponentInfo parent,
-            final ComponentTypeInfo typeInfo, final Map attributes)
-    {
-        maybeDefaultRendered(attributes);
-        return new UIOutputInfo(parent, typeInfo, attributes);
-    }
-
-    /**
-     * @param id
-     * @param parent
-     * @param typeInfo
-     * @param actionSourceInfo
-     * @param isRendered
-     * @return a new UICommandInfo
-     */
-    public static UICommandInfo createUICommandInfo(final String id,
-            final ComponentInfo parent, final ComponentTypeInfo typeInfo,
-            final IActionSourceInfo actionSourceInfo, final boolean isRendered)
-    {
-        return new UICommandInfo(id, parent, typeInfo, isRendered,
-                actionSourceInfo);
-    }
-
-    /**
-     * @param parent
-     * @param typeInfo
-     * @param attributes
-     * @return a new UICommandInfo
-     */
-    public static UICommandInfo createUICommandInfo(final ComponentInfo parent,
-            final ComponentTypeInfo typeInfo, final Map attributes)
-    {
-        maybeDefaultRendered(attributes);
-        return new UICommandInfo(parent, typeInfo, attributes);
-    }
-
-    /**
-     * @param id
-     * @param parent
-     * @param typeInfo
-     * @param isRendered
-     * @param prependId
-     * @param submitted
-     * @return a new UIFormInfo
-     */
-    public static UIFormInfo createUIFormInfo(final String id,
-            final ComponentInfo parent, final ComponentTypeInfo typeInfo,
-            final boolean isRendered, final boolean prependId,
-            final boolean submitted)
-    {
-        return new UIFormInfo(id, parent, typeInfo, isRendered, prependId,
-                submitted);
-    }
-
-    /**
-     * @param parent
-     * @param typeInfo
-     * @param attributes
-     * @return a new UIFormInfo
-     */
-    public static UIFormInfo createUIFormInfo(final ComponentInfo parent,
-            final ComponentTypeInfo typeInfo, final Map attributes)
-    {
-        maybeDefaultRendered(attributes);
-        maybeDefaultPrependId(attributes);
-        maybeDefaultSubmitted(attributes);
-        return new UIFormInfo(parent, typeInfo, attributes);
-    }
-
-    private static void maybeDefaultSubmitted(Map attributes)
-    {
-        if (!(attributes.get("submitted") instanceof Boolean)) //$NON-NLS-1$
-        {
-            attributes.put("submitted", Boolean.FALSE); //$NON-NLS-1$
-        }
-    }
-
-    private static void maybeDefaultPrependId(Map attributes)
-    {
-        if (!(attributes.get("prependId") instanceof Boolean)) //$NON-NLS-1$
-        {
-            attributes.put("prependId", Boolean.FALSE); //$NON-NLS-1$
-        }
-    }
-
-    /**
-     * @param id
-     * @param parent
-     * @param typeInfo
-     * @param isRendered
-     * @param dataModel
-     * @param first
-     * @param footer
-     * @param header
-     * @param rowCount
-     * @param rowAvailable
-     * @param rowData
-     * @param rowIndex
-     * @param rows
-     * @param value
-     * @param var
-     * @return a new UIDataInfo
-     */
-    public static UIDataInfo createUIDataInfo(final String id,
-            final ComponentInfo parent, final ComponentTypeInfo typeInfo,
-            final boolean isRendered, final DataModelInfo dataModel,
-            final int first, final ComponentInfo footer,
-            final ComponentInfo header, final int rowCount,
-            final boolean rowAvailable, final Object rowData,
-            final int rowIndex, final int rows, final Object value,
-            final String var)
-    {
-        return new UIDataInfo(id, parent, typeInfo, isRendered, dataModel,
-                first, footer, header, rowCount, rowAvailable, rowData,
-                rowIndex, rows, value, var);
-    }
-
-    /**
-     * @param parent
-     * @param typeInfo
-     * @param attributes
-     * @return the UIDataInfo
-     */
-    public static UIDataInfo createUIDataInfo(final ComponentInfo parent,
-            final ComponentTypeInfo typeInfo, final Map attributes)
-    {
-        maybeDefaultRendered(attributes);
-        maybeDefaultFirst(attributes);
-        maybeDefaultRowCount(attributes);
-        maybeDefaultRowAvailable(attributes);
-        maybeDefaultRowIndex(attributes);
-        maybeDefaultRows(attributes);
-        maybeDefaultVar(attributes);
-        return new UIDataInfo(parent, typeInfo, attributes);
-    }
-
-
-    private static final Integer ZERO = new Integer(0);
-    private static final Integer MINUS_ONE = new Integer(-1);
-
-    private static void maybeDefaultFirst(Map attributes)
-    {
-        if (!(attributes.get("first") instanceof Integer)) //$NON-NLS-1$
-        {
-            attributes.put("first", ZERO); //$NON-NLS-1$
-        }
-    }
-
-    private static void maybeDefaultRowCount(Map attributes)
-    {
-        if (!(attributes.get("rowCount") instanceof Integer)) //$NON-NLS-1$
-        {
-            attributes.put("rowCount", MINUS_ONE); //$NON-NLS-1$
-        }
-    }
-
-    private static void maybeDefaultRowAvailable(Map attributes)
-    {
-        if (! (attributes.get("rowAvailable") instanceof Boolean)) //$NON-NLS-1$
-        {
-            attributes.put("rowAvailable", Boolean.FALSE); //$NON-NLS-1$
-        }
-    }
-
-    private static void maybeDefaultRowIndex(Map attributes)
-    {
-        if (! (attributes.get("rowIndex") instanceof Integer)) //$NON-NLS-1$
-        {
-            attributes.put("rowIndex", MINUS_ONE); //$NON-NLS-1$
-        }
-    }
-
-    private static void maybeDefaultRows(Map attributes)
-    {
-        if (! (attributes.get("rows") instanceof Integer)) //$NON-NLS-1$
-        {
-            attributes.put("rows", ZERO); //$NON-NLS-1$
-        }
-    }
-
-    private static void maybeDefaultVar(Map attributes)
-    {
-        if (! (attributes.get("var") instanceof String)) //$NON-NLS-1$
-        {
-            attributes.put("var", "** default variable **"); //$NON-NLS-1$ //$NON-NLS-2$
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/component/ComponentInfo.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/component/ComponentInfo.java
deleted file mode 100644
index 6bb4629..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/component/ComponentInfo.java
+++ /dev/null
@@ -1,930 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.model.component;
-
-import java.beans.BeanInfo;
-import java.beans.IntrospectionException;
-import java.beans.Introspector;
-import java.beans.PropertyDescriptor;
-import java.io.Serializable;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.Map.Entry;
-
-import org.eclipse.jst.jsf.common.runtime.internal.model.ViewObject;
-import org.eclipse.jst.jsf.common.runtime.internal.model.component.AbstractVisitor.VisitationPolicy;
-import org.eclipse.jst.jsf.common.runtime.internal.model.decorator.FacetDecorator;
-
-/**
- * Models a basic UI component instance
- * 
- * TODO: should implement a visitor pattern to traverse component trees
- * 
- * @author cbateman
- * 
- */
-public class ComponentInfo extends ViewObject implements Serializable,
-        IVisitable
-{
-    /**
-     * serializable id
-     */
-    private static final long             serialVersionUID     = 2517204356825585699L;
-
-    private final static int              DEFAULT_ARRAY_SIZE   = 4;
-
-    private transient BeanPropertyManager _beanPropertyManager;
-    /**
-     * Encapsulates all of the data for the view object
-     */
-    protected final ComponentInfoData     _data;
-
-    // initialized
-    // by
-    // getBeanProperties
-
-    /**
-     * @param id
-     * @param parent
-     * @param componentTypeInfo
-     * @param isRendered
-     */
-    protected ComponentInfo(final String id, final ComponentInfo parent,
-            final ComponentTypeInfo componentTypeInfo, final boolean isRendered)
-    {
-        super(new ComponentInfoData(id, parent, componentTypeInfo, isRendered));
-        _data = (ComponentInfoData) super.getData();
-        
-        final Set propExclude = new HashSet();
-        propExclude.add("attributeNames"); //$NON-NLS-1$
-        propExclude.add("componentTypeInfo"); //$NON-NLS-1$
-        propExclude.add("valueChangeListeners"); //$NON-NLS-1$
-        propExclude.add("visitableChildren"); //$NON-NLS-1$
-
-        _beanPropertyManager = new BeanPropertyManager(this, propExclude);
-    }
-
-    /**
-     * @param data
-     */
-    protected ComponentInfo(final ComponentInfoData data)
-    {
-        super(data);
-        _data = data;
-    }
-
-    /**
-     * Construct a new component info using the attributes keyed by name in
-     * attributes to set values. The names must match the corresponding bean
-     * property names. Primitives should be wrapped in their corresponding
-     * object types. Exceptions will be thrown if there is a type mismatch on an
-     * expected type. Number will be used for all numeric primitive wrappers an
-     * the corresponding "to" will be called.
-     * 
-     * @param parent
-     * @param componentTypeInfo
-     * @param attributes
-     * @throws ClassCastException
-     *             if an attribute's value doesn't match the expected type
-     * @throws NullPointerException
-     *             if an attribute value is null for a value whose type is
-     *             expected to be primitive
-     * @throws IllegalArgumentException
-     *             if attributes does not contain a required key.
-     */
-    protected ComponentInfo(final ComponentInfo parent,
-            final ComponentTypeInfo componentTypeInfo, final Map attributes)
-    {
-        this(getStringProperty("id", attributes, false), parent, //$NON-NLS-1$
-                componentTypeInfo, getBooleanProperty("rendered", attributes, false)); //$NON-NLS-1$
-    }
-
-    /**
-     * @param key
-     * @param attributes
-     * @param mandatory
-     * @return the value in attributes at location key, forcing a
-     *         ClassCastException if it turns out not to be a String.
-     * @throws ClassCastException
-     *             if the attribute for key is not a String
-     * @throws IllegalArgumentException
-     *             if the attribute for key is null but mandatory is true.
-     */
-    protected static String getStringProperty(final String key,
-            final Map attributes, final boolean mandatory)
-    {
-        final Object value = attributes.get(key);
-
-        if (mandatory && value == null)
-        {
-            throw new IllegalArgumentException(key
-                    + " is a mandatory attribute"); //$NON-NLS-1$
-        }
-        return (String) value;
-    }
-
-    /**
-     * @param key
-     * @param attributes
-     * @param mandatory 
-     * 
-     * @return the value in attributes at location, forcing a ClassCastExceptio
-     *         if it is not a Boolean and mandatory.  returns false if no value
-     *         and not mandatory
-     * @throws IllegalArgumentException
-     *             if key is not found and value is mandatory
-     */
-    protected static boolean getBooleanProperty(final String key,
-            final Map attributes, final boolean mandatory)
-    {
-        final Boolean value = (Boolean) attributes.get(key);
-
-        if (value == null)
-        {
-            if (mandatory)
-            {
-                throw new IllegalArgumentException(key + "is mandatory"); //$NON-NLS-1$
-            }
-            return false;
-        }
-
-        return value.booleanValue();
-    }
-
-    /**
-     * @param key
-     * @param attributes
-     * @return the integer property for key. Casts the value to Number and calls
-     *         Number.intValue().  0 if no value.
-     */
-    protected static int getIntegerProperty(final String key,
-            final Map attributes)
-    {
-        final Number value = (Number) attributes.get(key);
-
-        if (value == null)
-        {
-            return 0;
-        }
-
-        return value.intValue();
-    }
-
-    /**
-     * @param key
-     * @param attributes
-     * @return the component info value from attributes
-     */
-    protected static ComponentInfo getComponentProperty(final String key,
-            final Map attributes)
-    {
-        return (ComponentInfo) attributes.get(key);
-    }
-
-    /**
-     * @return the id
-     */
-    public final String getId()
-    {
-        return _data.getId();
-    }
-
-    /**
-     * @return the component type info
-     */
-    public final ComponentTypeInfo getComponentTypeInfo()
-    {
-        return _data.getComponentTypeInfo();
-    }
-
-    /**
-     * Pre-condition: isModifiable() == true Post-condition: getChildren() will
-     * return an empty list.
-     */
-    protected final void clearChildren()
-    {
-        _data.getChildren().clear();
-    }
-
-    /**
-     * @return the children. List is unmodifiable. List contains all children
-     *         including facets.
-     */
-    public final List/* <ComponentInfo> */getChildren()
-    {
-        if (_data.isProtected())
-        {
-            return _data.getChildren();
-        }
-        return Collections.unmodifiableList(_data.getChildren());
-    }
-
-    /**
-     * Get the sub-set of {@link #getChildren()} that are facets. This is a
-     * convenience method for {@link #getDecorators(Class)}
-     * 
-     * @return all component children that are facets
-     */
-    public final List getFacets()
-    {
-        return getDecorators(ComponentFactory.FACET);
-    }
-
-    /**
-     * @param childComponent
-     */
-    public final void addChild(final ComponentInfo childComponent)
-    {
-        if (childComponent == this)
-        {
-            throw new IllegalArgumentException(
-                    "A component cannot be its own child"); //$NON-NLS-1$
-        }
-        _data.addChild(childComponent);
-        // we need to reset the child's parent to me
-        childComponent.setParent(this);
-    }
-
-    /**
-     * @param parent
-     */
-    public final void setParent(ComponentInfo parent)
-    {
-        _data.setParent(parent);
-    }
-
-    /**
-     * @param name
-     * @param facetComponent
-     */
-    public final void addFacet(final String name,
-            final ComponentInfo facetComponent)
-    {
-        addChild(facetComponent);
-        addDecorator(new FacetDecorator(name, facetComponent));
-    }
-
-    /**
-     * @param component
-     * @return if component corresponds to a facet of this component, returns
-     *         the name of that facet. Returns null if not found.
-     */
-    public final String getFacetName(final ComponentInfo component)
-    {
-        if (component == null)
-        {
-            return null;
-        }
-
-        final List facets = getDecorators(ComponentFactory.FACET);
-
-        for (final Iterator it = facets.iterator(); it.hasNext();)
-        {
-            final FacetDecorator facet = (FacetDecorator) it.next();
-            if (component == facet.getDecorates())
-            {
-                return facet.getName();
-            }
-        }
-
-        // component is not a facet
-        return null;
-    }
-
-    /**
-     * @param name
-     * @return if this has a facet called name, then returns it's single root
-     *         component.
-     */
-    public final ComponentInfo getFacet(final String name)
-    {
-        if (name == null)
-        {
-            return null;
-        }
-
-        final List facets = getDecorators(ComponentFactory.FACET);
-
-        for (final Iterator it = facets.iterator(); it.hasNext();)
-        {
-            final FacetDecorator facet = (FacetDecorator) it.next();
-            if (name.equals(facet.getName()))
-            {
-                return facet.getDecorates();
-            }
-        }
-
-        // not found
-        return null;
-    }
-
-    public String toString()
-    {
-        final String parentId = getParent() != null ? getParent().getId()
-                : "null"; //$NON-NLS-1$
-        String toString = getMostSpecificComponentName() + ": id=" //$NON-NLS-1$
-                + _data.getId() + ", parentId: " + parentId + ", family=" //$NON-NLS-1$ //$NON-NLS-2$
-                + getComponentTypeInfo().getComponentFamily() + ", render=" //$NON-NLS-1$
-                + getComponentTypeInfo().getRenderFamily() + ", rendered=" //$NON-NLS-1$
-                + isRendered();
-
-        // use bean introspection to dump child properties
-        if (this.getClass() != ComponentInfo.class)
-        {
-            toString += dumpProperties();
-        }
-
-        return toString;
-    }
-
-    private String dumpProperties()
-    {
-        String properties = ""; //$NON-NLS-1$
-        try
-        {
-            final BeanInfo beanInfo = Introspector.getBeanInfo(this.getClass(),
-                    ComponentInfo.class);
-
-            final PropertyDescriptor[] descriptors = beanInfo
-                    .getPropertyDescriptors();
-            for (int i = 0; i < descriptors.length; i++)
-            {
-                final PropertyDescriptor desc = descriptors[i];
-                final String name = desc.getName();
-                final Object valueObj = desc.getValue(name);
-                final String value = valueObj != null ? valueObj.toString()
-                        : "null"; //$NON-NLS-1$
-                properties += ", " + name + "=" + value; //$NON-NLS-1$ //$NON-NLS-2$
-            }
-        }
-        catch (final IntrospectionException e)
-        {
-            return "Error introspecting bean: " + e.getLocalizedMessage(); //$NON-NLS-1$
-        }
-
-        return properties;
-    }
-
-    /**
-     * @return used for toString. Clients should not use.
-     */
-    protected String getMostSpecificComponentName()
-    {
-        return "UIComponent"; //$NON-NLS-1$
-    }
-
-    /**
-     * @return the parent of this component or null.
-     */
-    public final ComponentInfo getParent()
-    {
-        return _data.getParent();
-    }
-
-    /**
-     * @return the rendered flag
-     */
-    public final boolean isRendered()
-    {
-        return _data.isRendered();
-    }
-
-    public synchronized void addAdapter(final Class adapterType,
-            final Object adapter)
-    {
-        super.addAdapter(adapterType, adapter);
-
-        // force an update on the next call to getBeanProperties
-        _beanPropertyManager.reset();
-    }
-
-    public synchronized Object removeAdapter(final Class adapterType)
-    {
-        final Object removed = super.removeAdapter(adapterType);
-
-        _beanPropertyManager.reset();
-
-        return removed;
-    }
-
-    /**
-     * @return the set of all bean property names for this component. The set is
-     *         unmodifiable and will throw exceptions if modification is
-     *         attempted.
-     */
-    protected final Map/* <String, ComponentBeanProperty> */getBeanProperties()
-    {
-        return Collections.unmodifiableMap(_beanPropertyManager
-                .getBeanProperties());
-    }
-
-    /**
-     * @author cbateman
-     * 
-     */
-    public static class ComponentInfoData extends ViewObjectData
-    {
-        /**
-         * 
-         */
-        private static final long         serialVersionUID                = 5052732412917986062L;
-        /**
-         * the component id
-         */
-        private final String              _id;
-        /**
-         * the component's parent or null if none
-         */
-        private ComponentInfo             _parent;
-
-        /**
-         * the type info for this component
-         */
-        protected final ComponentTypeInfo _componentTypeInfo;
-        /**
-         * the rendered flage
-         */
-        protected final boolean           _isRendered;
-
-        private List                     /* <ComponentInfo> */_children = new ArrayList(
-                                                                                  DEFAULT_ARRAY_SIZE);
-
-        /**
-         * @param id
-         * @param parent
-         * @param componentTypeInfo
-         * @param isRendered
-         */
-        public ComponentInfoData(final String id, ComponentInfo parent,
-                ComponentTypeInfo componentTypeInfo, boolean isRendered)
-        {
-            super(false);
-            _id = id;
-            _parent = parent;
-            _componentTypeInfo = componentTypeInfo;
-            _isRendered = isRendered;
-        }
-
-        /**
-         * @param childComponent
-         */
-        protected void addChild(ComponentInfo childComponent)
-        {
-            enforceProtection();
-
-            getChildren().add(childComponent);
-        }
-
-        /**
-         * @return the modifiable list of children
-         */
-        protected final List/* <ComponentInfo> */getChildren()
-        {
-            return _children;
-        }
-
-        protected void doBeforeProtecting()
-        {
-            super.doBeforeProtecting();
-            // compact the children array list
-            if (_children.size() > 0)
-            {
-                _children = Collections.unmodifiableList(_children);
-            }
-            else
-            {
-                _children = Collections.EMPTY_LIST;
-            }
-        }
-
-        /**
-         * @return the isRendered flag
-         */
-        protected final boolean isRendered()
-        {
-            return _isRendered;
-        }
-
-        /**
-         * @return the component type info flag
-         */
-        protected final ComponentTypeInfo getComponentTypeInfo()
-        {
-            return _componentTypeInfo;
-        }
-
-        /**
-         * @return the parent or null if no parent
-         */
-        protected final ComponentInfo getParent()
-        {
-            return _parent;
-        }
-
-        /**
-         * @param parent
-         */
-        protected final void setParent(ComponentInfo parent)
-        {
-            enforceProtection();
-            _parent = parent;
-        }
-
-        /**
-         * @return the component id
-         */
-        protected final String getId()
-        {
-            return _id;
-        }
-    }
-
-    /**
-     * This is similar to the runtime getAttributes().get(name) call. The reason
-     * we don't implement a Map of all attribute values is that the implicit
-     * property structure can change at any time due to add/removeAdapter. To
-     * get all attributes known for a component, instead use:
-     * 
-     * The synchronized block is advised to protect against concurrent
-     * modification exceptions on the keySet iterator.
-     * 
-     * @param name
-     * 
-     * @return the value of the attribute or null if none.
-     * 
-     */
-    public synchronized ComponentBeanProperty getAttribute(final String name)
-    {
-        return (ComponentBeanProperty) getBeanProperties().get(name);
-    }
-
-    /**
-     * @return the set of valid attribute names. The Set is not modifiable.
-     */
-    public synchronized Set/* <String> */getAttributeNames()
-    {
-        return getBeanProperties().keySet();
-    }
-
-    /**
-     * Stores a bean property descriptor along information about which
-     * implementation class declares it and what key to pass to getAdapter() in
-     * order to get it.
-     * 
-     */
-    public final static class ComponentBeanProperty
-    {
-        private final PropertyDescriptor _propertyDescriptor;
-        private final Object             _declaringImplementation;
-        private final Class              _adapterKeyClass;
-
-        // only instantiable locally
-        private ComponentBeanProperty(Class adapterKeyClass,
-                Object declaringImplementationClass,
-                PropertyDescriptor propertyDescriptor)
-        {
-            super();
-            _adapterKeyClass = adapterKeyClass;
-            _declaringImplementation = declaringImplementationClass;
-            _propertyDescriptor = propertyDescriptor;
-        }
-
-        /**
-         * @return the value of property
-         */
-        public final Object getValue()
-        {
-            final Method method = _propertyDescriptor.getReadMethod();
-            if (method != null)
-            {
-                try
-                {
-                    method.setAccessible(true);
-                    return method.invoke(_declaringImplementation,
-                            new Object[0]);
-                }
-                catch (IllegalArgumentException e)
-                {
-                    e.printStackTrace();
-                }
-                catch (IllegalAccessException e)
-                {
-                    e.printStackTrace();
-                }
-                catch (InvocationTargetException e)
-                {
-                    e.printStackTrace();
-                }
-            }
-            // if any step fails, return null
-            return null;
-        }
-
-        /**
-         * @return the property descriptor
-         */
-        public final PropertyDescriptor getPropertyDescriptor()
-        {
-            return _propertyDescriptor;
-        }
-
-        /**
-         * @return the implemenation
-         */
-        public final Object getDeclaringImplementationClass()
-        {
-            return _declaringImplementation;
-        }
-
-        /**
-         * @return the adapter class for the interface that the declaring
-         *         implementation is providing the impl for
-         */
-        public final Class getAdapterKeyClass()
-        {
-            return _adapterKeyClass;
-        }
-    }
-
-    /**
-     * Manages bean property information for a component
-     * 
-     * @author cbateman
-     * 
-     */
-    protected final static class BeanPropertyManager
-    {
-        /**
-         * a map of the bean property names exposed by this component including
-         * all those added by addAdapter().
-         * 
-         * this is synthetic based the class definition and installed adapters
-         * so as long that info is available, no need to serialize.
-         */
-        protected transient Map              /*
-                                                 * <String,
-                                                 * ComponentBeanProperty>
-                                                 */_beanProperties; // lazily
-        private final transient ComponentInfo _component;
-        private final transient Set _excludeNames;
-
-        /**
-         * @param component
-         * @param excludeNames 
-         */
-        protected BeanPropertyManager(final ComponentInfo component,
-                final Set excludeNames)
-        {
-            _component = component;
-            _excludeNames = excludeNames;
-        }
-
-        /**
-         * Will throw exception of the calling thread already holds the "this"
-         * monitor lock. This is to ensure that caller always acquires locks in
-         * appropriate order to prevent deadlock.
-         * 
-         * @return the internal set of bean properties. This Set may be modified
-         *         internally.
-         */
-        public Map getBeanProperties()
-        {
-            if (Thread.holdsLock(this))
-            {
-                throw new IllegalStateException(
-                        "Must not already own this lock"); //$NON-NLS-1$
-            }
-
-            // must always acquire component lock first to prevent deadlock
-            synchronized (_component)
-            {
-                synchronized (this)
-                {
-                    if (_beanProperties == null)
-                    {
-                        _beanProperties = calculateAllBeanPropNames(ViewObject.class);
-                    }
-
-                    return _beanProperties;
-                }
-            }
-        }
-
-        /**
-         * Will throw exception if the calling thread already holds the "this"
-         * monitor lock. This is to ensure that caller always acquires locks in
-         * appropriate order to prevent deadlock.
-         * 
-         * Clears the internal map and sets to null. This will force it to be
-         * completely new built on the next call to getBeanProperties
-         */
-        public void reset()
-        {
-            if (Thread.holdsLock(this))
-            {
-                throw new IllegalStateException(
-                        "Must not already own this lock"); //$NON-NLS-1$
-            }
-
-            // must always acquire component lock first to prevent deadlock
-            synchronized (_component)
-            {
-                synchronized (this)
-                {
-                    if (_beanProperties != null)
-                    {
-                        _beanProperties.clear();
-                        _beanProperties = null;
-                    }
-                }
-            }
-        }
-
-        /**
-         * @param stopClass
-         * @return a synchronized map of all bean property names on this class
-         *         up to stopClass, as well as all adapter property names (as
-         *         though this really implemented them).
-         */
-        private Map calculateAllBeanPropNames(final Class stopClass)
-        {
-            // use a set to prevents the duplicates
-            final Map allProperties = new HashMap();
-
-            {
-                final Class myClass = _component.getClass();
-                final List myProperties = getOrCreateBeanProperties(myClass,
-                        stopClass);
-
-                addToMap(myProperties, _component, myClass, allProperties, _excludeNames);
-            }
-
-            {
-                for (final Iterator it = _component.getAdapterMap().entrySet()
-                        .iterator(); it.hasNext();)
-                {
-                    Map.Entry entry = (Entry) it.next();
-
-                    final Class adapterClass = (Class) entry.getKey();
-                    final Object declaringClass = entry.getValue();
-                    // get all props, excluding the ones on Object.
-                    final List props = getOrCreateBeanProperties(adapterClass,
-                            null);
-                    addToMap(props, declaringClass, adapterClass, allProperties,
-                            _excludeNames);
-                }
-            }
-
-            return Collections.synchronizedMap(allProperties);
-        }
-
-        private static void addToMap(
-                final List/* <ComponentBeanProperty> */addThese,
-                final Object declaringObject, final Class declaringAdapter,
-                final Map toMe,
-                Set excludeNames)
-        {
-            for (final Iterator it = addThese.iterator(); it.hasNext();)
-            {
-                final PropertyDescriptor desc = (PropertyDescriptor) it.next();
-
-                if (!toMe.containsKey(desc.getName())
-                    && !excludeNames.contains(desc.getName()))
-                {
-                    toMe.put(desc.getName(), new ComponentBeanProperty(
-                            declaringAdapter, declaringObject, desc));
-                }
-            }
-        }
-
-        /**
-         * lazily loaded with the local properties (those not defined using
-         * adapters)
-         * 
-         * MUST INITIALIZE early so can synchronize on it
-         */
-        private transient static Map /* <Class, List<PropertyDescriptor> */PROPERTY_MAP = new HashMap();
-
-        /**
-         * @param startClass
-         * @param stopClass
-         * @return a unmodifiable list of properties starting from startClass.
-         *         stopClass is only used if an entry doesn't already exist in
-         *         PROPERTY_MAP for startClass. The method is synchronized on
-         *         the PROPERTY_MAP it updates.
-         */
-        protected static List/* <PropertyDescriptor */getOrCreateBeanProperties(
-                final Class startClass, final Class stopClass)
-        {
-            synchronized (PROPERTY_MAP)
-            {
-                List localBeanProps = (List) PROPERTY_MAP.get(startClass);
-
-                if (localBeanProps == null)
-                {
-                    localBeanProps = calculateBeanProperties(startClass,
-                            stopClass);
-                    PROPERTY_MAP.put(startClass, Collections
-                            .unmodifiableList(localBeanProps));
-                }
-
-                return localBeanProps;
-            }
-        }
-
-        /**
-         * @param startClass
-         * @param stopClass
-         * @return a List<String> containing all of the bean names between
-         *         startClass and stopClass. Start class must be a descendant
-         *         (sub-class, sub-sub-class etc.) of stopClass. The properties
-         *         on stopClass are excluded from analysis.
-         */
-        private static List/* <PropertyDescriptor> */calculateBeanProperties(
-                final Class startClass, final Class stopClass)
-        {
-            BeanInfo beanInfo;
-            List names = new ArrayList();
-
-            try
-            {
-                beanInfo = Introspector.getBeanInfo(startClass, stopClass);
-                final PropertyDescriptor[] descriptors = beanInfo
-                        .getPropertyDescriptors();
-
-                if (descriptors != null)
-                {
-                    names = Arrays.asList(descriptors);
-                }
-            }
-            catch (final IntrospectionException e)
-            {
-                e.printStackTrace();
-            }
-            return names;
-        }
-
-    }
-
-    /**
-     * Visits this node and it's entire tree and makes all nodes protected.
-     */
-    public final void setSubtreeProtected()
-    {
-        // lock children first
-        final ComponentTreeVisitor protectionVisitor = new ComponentTreeVisitor(VisitationPolicy.ChildrenFirstPolicy)
-        {
-            public void visit(ComponentInfo component)
-            {
-                component.setProtected();
-            }
-        };
-        
-        accept(protectionVisitor);
-    }
-
-    public void accept(AbstractVisitor visitor)
-    {
-        // check policy ordering
-        if (visitor.getPolicy().getOrdering() == VisitationPolicy.VISIT_PARENT_FIRST)
-        {
-            visitor.visit(this);
-            visitChildren(visitor);
-        }
-        else
-        {
-            visitChildren(visitor);
-            visitor.visit(this);
-        }
-    }
-
-    private void visitChildren(AbstractVisitor visitor)
-    {
-        for (final Iterator it = getVisitableChildren(); it.hasNext();)
-        {
-            visitor.visit(it.next());
-        }
-    }
-
-    public Iterator getVisitableChildren()
-    {
-        return getChildren().iterator();
-    }
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/component/ComponentTreeVisitor.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/component/ComponentTreeVisitor.java
deleted file mode 100644
index 4bedc7c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/component/ComponentTreeVisitor.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.model.component;
-
-/**
- * An abstract class sub-classed by objects that wish to apply a Visitor pattern
- * type visitation to a component tree.
- * 
- * @author cbateman
- * 
- */
-public abstract class ComponentTreeVisitor extends AbstractVisitor
-{
-    /**
-     * @param policy
-     */
-    public ComponentTreeVisitor(final VisitationPolicy policy)
-    {
-        super(policy);
-    }
-
-    /**
-     * @param component
-     */
-    public abstract void visit(final ComponentInfo component);
-
-    public final void visit(final Object object)
-    {
-        visit((ComponentInfo) object);
-    }
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/component/ComponentTypeInfo.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/component/ComponentTypeInfo.java
deleted file mode 100644
index 74c7c9b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/component/ComponentTypeInfo.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.model.component;
-
-import org.eclipse.jst.jsf.common.runtime.internal.model.types.ClassTypeInfo;
-
-/**
- * Type information about a UIComponent
- * 
- * @author cbateman
- * 
- */
-public class ComponentTypeInfo extends ClassTypeInfo
-{
-    /**
-     * serializable uid
-     */
-    private static final long serialVersionUID = -311156682935177206L;
-    /**
-     * the ComponentType (see JSF spec for definition)
-     */
-    protected final String _componentType; // may be null, since may not be
-    // known at runtime
-    /**
-     * the component family (see JSF spec)
-     */
-    protected final String _componentFamily;
-    /**
-     * the render family (see JSF spec)
-     */
-    protected final String _renderFamily;
-    
-    /**
-     * @param componentType
-     * @param componentClass
-     * @param componentFamily
-     * @param renderFamily
-     */
-    public ComponentTypeInfo(final String componentType,
-            final String componentClass, final String componentFamily,
-            final String renderFamily)
-    {
-        super(componentClass, new String[0], new String[0]);
-        _componentType = componentType;
-        _componentFamily = componentFamily;
-        _renderFamily = renderFamily;
-    }
-
-    /**
-     * @param componentType
-     * @param superClasses
-     * @param interfaces
-     * @param componentClass
-     * @param componentFamily
-     * @param renderFamily
-     */
-    public ComponentTypeInfo(final String componentType,
-            final String componentClass, 
-            final String[] superClasses, final String[] interfaces,
-            final String componentFamily,
-            final String renderFamily)
-    {
-        super(componentClass, superClasses, interfaces);
-        _componentType = componentType;
-        _componentFamily = componentFamily;
-        _renderFamily = renderFamily;
-    }
-
-    /**
-     * @return the component type or null if unknown (may not be at runtime)
-     */
-    public final String getComponentType()
-    {
-        return _componentType;
-    }
-
-    /**
-     * @return the component family
-     */
-    public final String getComponentFamily()
-    {
-        return _componentFamily;
-    }
-
-    /**
-     * @return the render family
-     */
-    public final String getRenderFamily()
-    {
-        return _renderFamily;
-    }
-
-    public String toString()
-    {
-        return "Component Type Info: type = " + _componentType + " family=" + _componentFamily //$NON-NLS-1$ //$NON-NLS-2$
-                + " renderer=" + _renderFamily + ", "+super.toString(); //$NON-NLS-1$ //$NON-NLS-2$
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/component/IVisitable.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/component/IVisitable.java
deleted file mode 100644
index 6ddd83b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/component/IVisitable.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.model.component;
-
-import java.util.Iterator;
-
-/**
- * Implemented by a class that can accept visitors
- *
- */
-interface IVisitable
-{
-    /**
-     * Called on a visitable to accept a visitor
-     * 
-     * @param visitor
-     */
-    void accept(AbstractVisitor visitor);
-    
-    /**
-     * @return an iterator that returns IVisitable children.
-     */
-    Iterator getVisitableChildren();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/component/UICommandInfo.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/component/UICommandInfo.java
deleted file mode 100644
index 9ff50f4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/component/UICommandInfo.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.model.component;
-
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.jst.jsf.common.runtime.internal.model.behavioural.IActionSource2Info;
-import org.eclipse.jst.jsf.common.runtime.internal.model.behavioural.IActionSourceInfo;
-import org.eclipse.jst.jsf.common.runtime.internal.model.decorator.ActionListenerDecorator;
-
-/**
- * An design time analog of the standard UICommand.
- * @author cbateman
- *
- */
-public class UICommandInfo extends ComponentInfo implements IActionSource2Info {
-    private final String _actionExpression;
-    private final String _actionListener;
-    private final boolean _isImmediate;
-
-    /**
-     * serialization id
-     */
-    private static final long serialVersionUID = -9025172832535840949L;
-
-    /**
-     * @param id
-     * @param parent
-     * @param componentTypeInfo
-     * @param isRendered
-     * @param actionSourceInfo
-     */
-    protected UICommandInfo(final String id, final ComponentInfo parent,
-            final ComponentTypeInfo componentTypeInfo,
-            final boolean isRendered, final IActionSourceInfo actionSourceInfo) {
-        super(id, parent, componentTypeInfo, isRendered);
-
-        if (actionSourceInfo == null) {
-            _actionExpression = null;
-            _actionListener = null;
-            _isImmediate = false;
-        } else {
-            // TODO: having action and actionExpression will come back to
-            // to bite us.
-            _actionExpression = actionSourceInfo.getAction();
-            _actionListener = actionSourceInfo.getActionListener();
-            _isImmediate = actionSourceInfo.isImmediate();
-
-            for (final Iterator it = actionSourceInfo.getActionListeners()
-                    .iterator(); it.hasNext();) {
-                final ActionListenerDecorator actionListener = 
-                    (ActionListenerDecorator) it.next();
-                addActionListener(actionListener);
-            }
-        }
-    }
-
-    /**
-     * @param parent
-     * @param componentTypeInfo
-     * @param attributes
-     */
-    protected UICommandInfo(final ComponentInfo parent, final ComponentTypeInfo componentTypeInfo,
-            Map attributes)
-    {
-        this(getStringProperty("id", attributes, true), //$NON-NLS-1$
-                parent, componentTypeInfo,
-                getBooleanProperty("rendered", attributes, false), //$NON-NLS-1$
-                getActionSourceInfo("$actionSourceInfo", attributes) //$NON-NLS-1$
-                );
-    }
-    
-    private static IActionSourceInfo getActionSourceInfo(String key,
-            Map attributes)
-    {
-        return (IActionSourceInfo) attributes.get(key);
-    }
-
-    public String getActionExpression() {
-        return _actionExpression;
-    }
-
-    public final void addActionListener(final ActionListenerDecorator actionListener) {
-        addDecorator(actionListener, ComponentFactory.ACTION_LISTENER);
-    }
-
-    public final String getAction() {
-        return _actionExpression;
-    }
-
-    public final String getActionListener() {
-        return _actionListener;
-    }
-
-    public final List getActionListeners() {
-        return getDecorators(ComponentFactory.ACTION_LISTENER);
-    }
-
-    public final boolean isImmediate() {
-        return _isImmediate;
-    }
-
-    protected String getMostSpecificComponentName()
-    {
-        return "UICommand"; //$NON-NLS-1$
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/component/UIDataInfo.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/component/UIDataInfo.java
deleted file mode 100644
index 56981af..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/component/UIDataInfo.java
+++ /dev/null
@@ -1,219 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.model.component;
-
-import java.util.Map;
-
-import org.eclipse.jst.jsf.common.runtime.internal.model.bean.DataModelInfo;
-import org.eclipse.jst.jsf.common.runtime.internal.model.bean.SerializableObject;
-import org.eclipse.jst.jsf.common.runtime.internal.model.behavioural.INamingContainerInfo;
-
-/**
- * Design time analog to UIData.
- * 
- * @author cbateman
- * 
- */
-public class UIDataInfo extends ComponentInfo implements INamingContainerInfo
-{
-    /**
-     * the standard name for the footer facet
-     */
-    public final static String FACET_NAME_FOOTER = "footer"; //$NON-NLS-1$
-    /**
-     * the standard name for the header facet.
-     */
-    public final static String FACET_NAME_HEADER = "header"; //$NON-NLS-1$
-    /**
-     * serialization id
-     */
-    private static final long serialVersionUID = 3473288390914978784L;
-
-    private final DataModelInfo _dataModel;
-    private final int _first;
-    private final int _rowCount;
-    private final boolean _rowAvailable;
-    private final SerializableObject _rowData;
-    private final int _rowIndex;
-    private final int _rows;
-    private final SerializableObject _value;
-    private final String _var;
-
-    /**
-     * @param id
-     * @param parent
-     * @param componentTypeInfo
-     * @param isRendered
-     * @param dataModel
-     * @param first
-     * @param footer
-     * @param header
-     * @param rowCount
-     * @param rowAvailable
-     * @param rowData
-     * @param rowIndex
-     * @param rows
-     * @param value
-     * @param var
-     */
-    public UIDataInfo(final String id, final ComponentInfo parent,
-            final ComponentTypeInfo componentTypeInfo,
-            final boolean isRendered, final DataModelInfo dataModel,
-            final int first, final ComponentInfo footer,
-            final ComponentInfo header, final int rowCount,
-            final boolean rowAvailable, final Object rowData,
-            final int rowIndex, final int rows, final Object value,
-            final String var)
-    {
-        super(id, parent, componentTypeInfo, isRendered);
-        _dataModel = dataModel;
-        _first = first;
-        _rowCount = rowCount;
-        _rowAvailable = rowAvailable;
-        _rowData = new SerializableObject(rowData);
-        _rowIndex = rowIndex;
-        _rows = rows;
-        _value = new SerializableObject(value);
-        _var = var;
-
-        if (footer != null)
-        {
-            addFacet(FACET_NAME_FOOTER, footer);
-        }
-
-        if (header != null)
-        {
-            addFacet(FACET_NAME_HEADER, header);
-        }
-    }
-
-    /**
-     * @param parent
-     * @param componentTypeInfo
-     * @param attributes
-     */
-    public UIDataInfo(final ComponentInfo parent,
-            final ComponentTypeInfo componentTypeInfo, Map attributes)
-    {
-        this(getStringProperty("id", attributes, true), parent, //$NON-NLS-1$
-                componentTypeInfo, 
-                getBooleanProperty("rendered", attributes, false), //$NON-NLS-1$
-                getDataModelInfo("$dataModel", attributes),  //$NON-NLS-1$
-                getIntegerProperty("first", attributes),  //$NON-NLS-1$
-                getComponentProperty("footer", attributes), //$NON-NLS-1$
-                getComponentProperty("header", attributes),  //$NON-NLS-1$
-                getIntegerProperty("rowCount", attributes),  //$NON-NLS-1$
-                getBooleanProperty("rowAvailable", attributes, false),  //$NON-NLS-1$
-                attributes.get("rowData"), //$NON-NLS-1$
-                getIntegerProperty("rowIndex", attributes),  //$NON-NLS-1$
-                getIntegerProperty("rows", attributes),  //$NON-NLS-1$
-                attributes.get("value"), //$NON-NLS-1$
-                getStringProperty("var", attributes, false)); //$NON-NLS-1$
-    }
-
-    private static DataModelInfo getDataModelInfo(String key, Map attributes)
-    {
-        return (DataModelInfo) attributes.get(key);
-    }
-
-    /**
-     * @return the data model
-     */
-    public final DataModelInfo getDataModel()
-    {
-        return _dataModel;
-    }
-
-    /**
-     * @return the first row
-     */
-    public final int getFirst()
-    {
-        return _first;
-    }
-
-    /**
-     * @return the row count
-     */
-    public final int getRowCount()
-    {
-        return _rowCount;
-    }
-
-    /**
-     * @return true if the row is available
-     */
-    public final boolean isRowAvailable()
-    {
-        return _rowAvailable;
-    }
-
-    /**
-     * @return the row data (may be null if not serialiable)
-     */
-    public final Object getRowData()
-    {
-        return _rowData.getMaybeSerializable();
-    }
-
-    /**
-     * @return the row index
-     */
-    public final int getRowIndex()
-    {
-        return _rowIndex;
-    }
-
-    /**
-     * @return the rows
-     */
-    public final int getRows()
-    {
-        return _rows;
-    }
-
-    /**
-     * @return the value of the model (may be null if not serialiable)
-     */
-    public final Object getValue()
-    {
-        return _value.getMaybeSerializable();
-    }
-
-    /**
-     * @return the name used to define the EL row variable
-     */
-    public final String getVar()
-    {
-        return _var;
-    }
-
-    /**
-     * @return the header facet or null.
-     */
-    public final ComponentInfo getHeader()
-    {
-        return getFacet(FACET_NAME_HEADER);
-    }
-
-    /**
-     * @return the footer facet or null.
-     */
-    public final ComponentInfo getFooter()
-    {
-        return getFacet(FACET_NAME_FOOTER);
-    }
-
-    protected String getMostSpecificComponentName()
-    {
-        return "UIData"; //$NON-NLS-1$
-    }
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/component/UIFormInfo.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/component/UIFormInfo.java
deleted file mode 100644
index 2b82330..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/component/UIFormInfo.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.model.component;
-
-import java.util.Map;
-
-import org.eclipse.jst.jsf.common.runtime.internal.model.behavioural.INamingContainerInfo;
-
-/**
- * A design-time analog for the UIForm.
- * 
- * @author cbateman
- */
-public class UIFormInfo extends ComponentInfo implements INamingContainerInfo 
-{
-    /**
-     * serializable id
-     */
-    private static final long serialVersionUID = 6961034911873576644L;
-
-    private final boolean _prependId;
-    private final boolean _submitted;
-    
-    /**
-     * @param id
-     * @param parent
-     * @param componentTypeInfo
-     * @param isRendered
-     * @param prependId
-     * @param submitted
-     */
-    protected UIFormInfo(final String id, final ComponentInfo parent,
-            final ComponentTypeInfo componentTypeInfo, final boolean isRendered
-            , final boolean prependId, final boolean submitted) {
-        super(id, parent, componentTypeInfo, isRendered);
-        _prependId = prependId;
-        _submitted = submitted;
-    }
-    
-    /**
-     * @param parent
-     * @param componentTypeInfo
-     * @param attributes
-     */
-    protected UIFormInfo(final ComponentInfo parent, ComponentTypeInfo componentTypeInfo,
-            Map attributes)
-    {
-        this(getStringProperty("id", attributes, true), //$NON-NLS-1$
-                parent,
-                componentTypeInfo,
-                getBooleanProperty("rendered", attributes, false), //$NON-NLS-1$
-                getBooleanProperty("prependId", attributes, false), //$NON-NLS-1$
-                getBooleanProperty("submitted", attributes, false)); //$NON-NLS-1$
-    }
-    
-    /**
-     * JSF 1.2 only
-     * 
-     * @return true if the form allows its id to be prepended to its 
-     * descendent's ids.
-     */
-    public final boolean isPrependId()
-    {
-        return _prependId;
-    }
-
-    /**
-     * @return true if the form is submitted.
-     */
-    public final boolean isSubmitted() {
-        return _submitted;
-    }
-
-    protected String getMostSpecificComponentName()
-    {
-        return "UIForm"; //$NON-NLS-1$
-    } 
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/component/UIInputInfo.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/component/UIInputInfo.java
deleted file mode 100644
index 14a6131..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/component/UIInputInfo.java
+++ /dev/null
@@ -1,182 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.model.component;
-
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.jst.jsf.common.runtime.internal.model.behavioural.IEditableValueHolderInfo;
-import org.eclipse.jst.jsf.common.runtime.internal.model.decorator.ValidatorDecorator;
-import org.eclipse.jst.jsf.common.runtime.internal.model.decorator.ValueChangeListenerDecorator;
-
-/**
- * A design-time analog of the standard UIInput.
- * 
- * @author cbateman
- * 
- */
-public class UIInputInfo extends UIOutputInfo implements
-        IEditableValueHolderInfo
-{
-    /**
-     * serializable uid
-     */
-    private static final long serialVersionUID = -6055473902554910848L;
-    private final boolean _isValid;
-    private final boolean _isImmediate;
-    private final boolean _isRequired;
-    private final Object _submittedValue;
-    private final String _validator;
-    private final String _valueChangeListener;
-    private final boolean _localSetValue;
-
-    /**
-     * @param id
-     * @param parent
-     * @param typeInfo
-     * @param editableValueHolderInfo
-     * @param isRendered
-     */
-    protected UIInputInfo(final String id, final ComponentInfo parent,
-            final ComponentTypeInfo typeInfo,
-            final IEditableValueHolderInfo editableValueHolderInfo,
-            final boolean isRendered)
-    {
-        super(id, parent, typeInfo, editableValueHolderInfo, isRendered);
-
-        if (editableValueHolderInfo == null)
-        {
-            _isValid = true;
-            _isImmediate = false;
-            _isRequired = false;
-            _localSetValue = false;
-            _submittedValue = null;
-            _validator = null;
-            _valueChangeListener = null;
-        }
-        else
-        {
-            _isValid = editableValueHolderInfo.isValid();
-            _isImmediate = editableValueHolderInfo.isImmediate();
-            _isRequired = editableValueHolderInfo.isRequired();
-            _localSetValue = editableValueHolderInfo.isLocalSetValue();
-            _submittedValue = editableValueHolderInfo.getSubmittedValue();
-            _validator = editableValueHolderInfo.getValidator();
-            _valueChangeListener = editableValueHolderInfo
-                    .getValueChangeListener();
-
-            for (final Iterator it = editableValueHolderInfo.getValidators()
-                    .iterator(); it.hasNext();)
-            {
-                final ValidatorDecorator validator = (ValidatorDecorator) it
-                        .next();
-                addValidator(validator);
-            }
-
-            for (final Iterator it = editableValueHolderInfo
-                    .getValueChangeListeners().iterator(); it.hasNext();)
-            {
-                final ValueChangeListenerDecorator valueChangeListener = (ValueChangeListenerDecorator) it
-                        .next();
-                addValueChangeListener(valueChangeListener);
-            }
-        }
-    }
-
-    /**
-     * @param parent
-     * @param typeInfo
-     * @param attributes
-     */
-    protected UIInputInfo(final ComponentInfo parent,
-            final ComponentTypeInfo typeInfo, Map attributes)
-    {
-        this(getStringProperty("id", attributes, true), parent, typeInfo, //$NON-NLS-1$
-                getEditableValueHolderInfo("$editableValueHolderInfo", //$NON-NLS-1$
-                        attributes), getBooleanProperty("rendered", attributes, false)); //$NON-NLS-1$
-    }
-
-    private static IEditableValueHolderInfo getEditableValueHolderInfo(
-            String key, Map attributes)
-    {
-        return (IEditableValueHolderInfo) attributes.get(key);
-    }
-
-    // public String toString() {
-    // final String toString = super.toString();
-    // return toString + ", isValid=" + _isValid + ", isImmediate="
-    // + _isImmediate + ", isRequired=" + _isRequired;
-    // }
-
-    // @Override
-    protected String getMostSpecificComponentName()
-    {
-        return "UIInput"; //$NON-NLS-1$
-    }
-
-    public final boolean isValid()
-    {
-        return _isValid;
-    }
-
-    public final boolean isImmediate()
-    {
-        return _isImmediate;
-    }
-
-    public final boolean isRequired()
-    {
-        return _isRequired;
-    }
-
-    public final Object getSubmittedValue()
-    {
-        return _submittedValue;
-    }
-
-    public final String getValidator()
-    {
-        return _validator;
-    }
-
-    public final String getValueChangeListener()
-    {
-        return _valueChangeListener;
-    }
-
-    public final boolean isLocalSetValue()
-    {
-        return _localSetValue;
-    }
-
-    public final void addValidator(final ValidatorDecorator validator)
-    {
-        addDecorator(validator, ComponentFactory.VALIDATOR);
-    }
-
-    public final void addValueChangeListener(
-            final ValueChangeListenerDecorator valueChangeListenerInfo)
-    {
-        addDecorator(valueChangeListenerInfo,
-                ComponentFactory.VALUE_CHANGE_LISTENER);
-    }
-
-    public final List getValidators()
-    {
-        return getDecorators(ComponentFactory.VALIDATOR);
-    }
-
-    public final List getValueChangeListeners()
-    {
-        return getDecorators(ComponentFactory.VALUE_CHANGE_LISTENER);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/component/UIOutputInfo.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/component/UIOutputInfo.java
deleted file mode 100644
index 990028a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/component/UIOutputInfo.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.model.component;
-
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.jst.jsf.common.runtime.internal.model.behavioural.IValueHolderInfo;
-import org.eclipse.jst.jsf.common.runtime.internal.model.behavioural.ValueHolderInfo;
-import org.eclipse.jst.jsf.common.runtime.internal.model.decorator.ConverterDecorator;
-
-/**
- * A design-time analog for the UIOutput
- * 
- * @author cbateman
- *
- */
-public class UIOutputInfo extends ComponentInfo implements IValueHolderInfo {
-    /**
-     * serializable uid
-     */
-    private static final long serialVersionUID = 9096297578991706150L;
-
-    /**
-     * the value
-     */
-    protected final Object _value;
-    /**
-     * the value before any EL evaluation
-     */
-    protected final Object _localValue;
-
-    /**
-     * @param id
-     * @param parent
-     * @param typeInfo
-     * @param valueHolderInfo
-     * @param isRendered
-     */
-    protected UIOutputInfo(final String id, final ComponentInfo parent,
-            final ComponentTypeInfo typeInfo,
-            final IValueHolderInfo valueHolderInfo, final boolean isRendered) {
-        super(id, parent, typeInfo, isRendered);
-
-        if (valueHolderInfo == null) {
-            _value = null;
-            _localValue = null;
-        } else {
-            _value = valueHolderInfo.getValue();
-            _localValue = valueHolderInfo.getLocalValue();
-
-            final ConverterDecorator converter = valueHolderInfo.getConverter();
-            if (converter != null) {
-                addDecorator(converter, ComponentFactory.CONVERTER);
-            }
-        }
-    }
-
-    /**
-     * @param parent
-     * @param typeInfo
-     * @param attributes
-     */
-    protected UIOutputInfo(final ComponentInfo parent, final ComponentTypeInfo typeInfo,
-            final Map attributes)
-    {
-        this(getStringProperty("id", attributes, true), //$NON-NLS-1$
-                parent,
-                typeInfo,
-                getValueHolderInfo("$valueHolderInfo", attributes), //$NON-NLS-1$
-                getBooleanProperty("rendered", attributes, false)); //$NON-NLS-1$
-    }
-    
-    /**
-     * @param key
-     * @param attributes
-     * @return the non-standard value holder info that encapsulates the
-     * ValueHolder properties.  This is never mandatory.
-     */
-    protected static IValueHolderInfo getValueHolderInfo(String key, Map attributes)
-    {
-        IValueHolderInfo info =  (IValueHolderInfo) attributes.get(key);
-        
-        if (info != null)
-        {
-            return info;
-        }
-        Object value = attributes.get("value"); //$NON-NLS-1$
-        if (value != null)
-        {
-            Object converter = attributes.get("converter"); //$NON-NLS-1$
-            Object localValue = attributes.get("localValue"); //$NON-NLS-1$
-            
-            return new ValueHolderInfo((ConverterDecorator) converter, localValue, value);
-        }
-        return null;
-    }
-    
-    // @Override
-    protected String getMostSpecificComponentName() {
-        return "UIOutput"; //$NON-NLS-1$
-    }
-
-    public final ConverterDecorator getConverter() {
-        // should only be a single converter decorator...
-        // so on this interface we'll return the first one if present.
-        // to do things like error checking, use the getDecorator
-        final List converters = getDecorators(ComponentFactory.CONVERTER);
-
-        if (converters.size() > 0) {
-            return (ConverterDecorator) converters.get(0);
-        }
-
-        return null;
-    }
-
-    public final Object getLocalValue() {
-        return _localValue;
-    }
-
-    public final Object getValue() {
-        return _value;
-    }
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/datatypes/ELExpression.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/datatypes/ELExpression.java
deleted file mode 100644
index b14f68d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/datatypes/ELExpression.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.model.datatypes;
-
-/**
- * An abstraction for an EL expression.
- * 
- * @author cbateman
- * 
- */
-public abstract class ELExpression
-{
-    /**
-     * @return the original text of EL expression
-     */
-    public abstract String getText();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/decorator/ActionListenerDecorator.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/decorator/ActionListenerDecorator.java
deleted file mode 100644
index 6c7993e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/decorator/ActionListenerDecorator.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.model.decorator;
-
-import org.eclipse.jst.jsf.common.runtime.internal.model.component.ComponentInfo;
-
-/**
- * Design time ActionListener decorator
- * 
- * @author cbateman
- *
- */
-public class ActionListenerDecorator extends ComponentDecorator {
-
-    /**
-     * 
-     */
-    private static final long serialVersionUID = 3806862878381550874L;
-
-    /**
-     * @param decorates
-     */
-    public ActionListenerDecorator(final ComponentInfo decorates) {
-        super(decorates);
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/decorator/ComponentDecorator.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/decorator/ComponentDecorator.java
deleted file mode 100644
index b700073..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/decorator/ComponentDecorator.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.model.decorator;
-
-import org.eclipse.jst.jsf.common.runtime.internal.model.component.ComponentInfo;
-
-/**
- * @author cbateman
- *
- */
-public abstract class ComponentDecorator extends Decorator 
-{
-    /**
-     * 
-     */
-    private static final long serialVersionUID = 4378142984217256364L;
-    
-    private final ComponentInfo     _decorates;
-    
-    /**
-     * @param decorates
-     */
-    public ComponentDecorator(final ComponentInfo decorates)
-    {
-        _decorates = decorates;
-    }
-
-    /**
-     * @return the component that this decorator decorates.
-     */
-    public final ComponentInfo getDecorates() {
-        return _decorates;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/decorator/ConverterDecorator.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/decorator/ConverterDecorator.java
deleted file mode 100644
index 692ec3b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/decorator/ConverterDecorator.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.model.decorator;
-
-import org.eclipse.jst.jsf.common.runtime.internal.model.component.ComponentInfo;
-
-/**
- * A converter decorator.
- * 
- * @author cbateman
- *
- */
-public class ConverterDecorator extends ComponentDecorator {
-
-    private final ConverterTypeInfo     _typeInfo;
-    
-    /**
-     * serializable id
-     */
-    private static final long serialVersionUID = 3838224353030247227L;
-    
-    
-    /**
-     * @param decorates
-     * @param typeInfo
-     */
-    public ConverterDecorator(final ComponentInfo decorates, final ConverterTypeInfo typeInfo)
-    {
-        super(decorates);
-        _typeInfo = typeInfo;
-    }
-
-    /**
-     * @return the converter's type info.
-     */
-    public final ConverterTypeInfo getTypeInfo()
-    {
-        return _typeInfo;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/decorator/ConverterTypeInfo.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/decorator/ConverterTypeInfo.java
deleted file mode 100644
index f013d3c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/decorator/ConverterTypeInfo.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.model.decorator;
-
-import org.eclipse.jst.jsf.common.runtime.internal.model.types.ClassTypeInfo;
-
-/**
- * Type information about a converter.
- * 
- * @author cbateman
- * 
- */
-public class ConverterTypeInfo extends ClassTypeInfo
-{
-    /**
-     * serializable id
-     */
-    private static final long serialVersionUID = -7238952424045449907L;
-    private static final String[]  NO_FOR_CLASS = new  String[0];
-    private final String        _converterId;
-    private final String[]      _forClasses;
-
-    /**
-     * For unknown converters, use the UNKNOWN constant.
-     * 
-     * @param className
-     * @param converterId
-     * @throws java.lang.IllegalArgumentException
-     *             if both className and converterId are null.
-     * 
-     */
-    public ConverterTypeInfo(String className, String converterId)
-    {
-        super(className, new String[0], new String[0]);
-        if (className == null && converterId == null)
-        {
-            throw new IllegalArgumentException(
-                    "converterClass and converterId must not both be null.  For unknown validator use the UNKNOWN constant"); //$NON-NLS-1$
-        }
-
-        _converterId = converterId;
-        _forClasses = NO_FOR_CLASS;
-    }
-
-    /**
-     * For unknown converters, use the UNKNOWN constant.
-     * 
-     * @param className
-     * @param superClasses 
-     * @param interfaces 
-     * @param converterId
-     * @param forClass 
-     * @throws java.lang.IllegalArgumentException
-     *             if both className and converterId are null.
-     * 
-     */
-    public ConverterTypeInfo(String className, String[] superClasses,
-            String[] interfaces, String converterId, String[] forClass)
-    {
-        super(className, superClasses, interfaces);
-        if (className == null && converterId == null)
-        {
-            throw new IllegalArgumentException(
-                    "converterClass and converterId must not both be null.  For unknown validator use the UNKNOWN constant"); //$NON-NLS-1$
-        }
-
-        _converterId = converterId;
-        if (forClass == null)
-        {
-            _forClasses = NO_FOR_CLASS;
-        }
-        else
-        {
-            _forClasses = forClass;
-        }
-    }
-
-    /**
-     * Use when the converter's information unknown such as occurs when using
-     * the f:converter tag.
-     */
-    public static final ConverterTypeInfo UNKNOWN = new ConverterTypeInfo(
-            (Object) null);
-
-    /**
-     * A private constructor used to create the UNRESOLVED constant. We use an
-     * Object arg here (which is discarded) rather than using the zero-arg
-     * constructor so as not mess up anything like Serializable that may depend
-     * on how zero-arg constructors are defined.
-     * 
-     * @param unresolved
-     */
-    private ConverterTypeInfo(Object unresolved)
-    {
-        super(null, new String[0], new String[0]);
-        _converterId = null;
-        _forClasses = NO_FOR_CLASS;
-    }
-
-    /**
-     * @return the converter's id.
-     */
-    public final String getConverterId()
-    {
-        return _converterId;
-    }
-
-    /**
-     * @return a copy of the listof classes that this type converters to.  May
-     * be empty.  Never null.
-     */
-    public final String[] getForClass()
-    {
-        final String[]  returnArray = new String[_forClasses.length];
-        System.arraycopy(_forClasses, 0, returnArray, 0, _forClasses.length);
-        return returnArray;
-    }
-
-    public String toString()
-    {
-        String toString = ""; //$NON-NLS-1$
-
-        if (_forClasses.length  > 0)
-        {
-            toString = "For-Classes: ["; //$NON-NLS-1$
-            for (int i = 0; i < _forClasses.length; i++)
-            {
-                toString += _forClasses[i];
-                if (i < _forClasses.length-1)
-                {
-                    toString += ", "; //$NON-NLS-1$
-                }
-            }
-            toString += "], "; //$NON-NLS-1$
-        }
-        return toString + "Converter Type Info: type = " + _converterId + ", "+super.toString(); //$NON-NLS-1$ //$NON-NLS-2$
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/decorator/Decorator.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/decorator/Decorator.java
deleted file mode 100644
index ceaae4e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/decorator/Decorator.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.model.decorator;
-
-import java.io.Serializable;
-
-import org.eclipse.jst.jsf.common.runtime.internal.model.ViewObject;
-
-/**
- * The abstract super-class of all view object decorators.
- * 
- * @author cbateman
- * 
- */
-public abstract class Decorator extends ViewObject implements Serializable
-{
-
-    /**
-     * serializable id
-     */
-    private static final long serialVersionUID = -3138829736243154022L;
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/decorator/FacetDecorator.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/decorator/FacetDecorator.java
deleted file mode 100644
index 32e7f0d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/decorator/FacetDecorator.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.model.decorator;
-
-import org.eclipse.jst.jsf.common.runtime.internal.model.component.ComponentInfo;
-
-/**
- * Component decorator for facets.
- * 
- * @author cbateman
- *
- */
-public class FacetDecorator extends ComponentDecorator 
-{
-    /**
-     * 
-     */
-    private static final long serialVersionUID = 94806944978127012L;
-
-    private final String _name;
-
-    /**
-     * @param name
-     * @param component
-     */
-    public FacetDecorator(final String name, final ComponentInfo component) {
-        super(component);
-        _name = name;
-    }
-
-    /**
-     * @return the name of the facet.
-     */
-    public final String getName() {
-        return _name;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/decorator/ValidatorDecorator.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/decorator/ValidatorDecorator.java
deleted file mode 100644
index b7e33d0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/decorator/ValidatorDecorator.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.model.decorator;
-
-import org.eclipse.jst.jsf.common.runtime.internal.model.component.ComponentInfo;
-
-/**
- * Validator decorator.
- * 
- * @author cbateman
- *
- */
-public class ValidatorDecorator extends ComponentDecorator {
-    /**
-     * 
-     */
-    private static final long serialVersionUID = -2898015711621314782L;
-
-    private final ValidatorTypeInfo     _typeInfo;
-
-    /**
-     * @param decorates
-     * @param typeInfo
-     */
-    public ValidatorDecorator(final ComponentInfo decorates, final ValidatorTypeInfo typeInfo) {
-        super(decorates);
-        _typeInfo = typeInfo;
-    }
-
-    /**
-     * @return the validator's type info
-     */
-    public final ValidatorTypeInfo getTypeInfo()
-    {
-        return _typeInfo;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/decorator/ValidatorTypeInfo.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/decorator/ValidatorTypeInfo.java
deleted file mode 100644
index 7e4a6fc..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/decorator/ValidatorTypeInfo.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.model.decorator;
-
-import org.eclipse.jst.jsf.common.runtime.internal.model.types.ClassTypeInfo;
-
-/**
- * Type information about validator decorator.
- * @author cbateman
- *
- */
-public class ValidatorTypeInfo extends ClassTypeInfo
-{
-    /**
-     * 
-     */
-    private static final long serialVersionUID = 7512992316792276160L;
-    private final String    _validatorId;
-
-    /**
-     * For unknown validators, use the UNKNOWN constant.
-     * 
-     * @param validatorClass
-     * @param validatorId
-     * @throws java.lang.IllegalArgumentException if both className and
-     * converterId are null.
-     * 
-     */
-    public ValidatorTypeInfo(String validatorClass, String validatorId)
-    {
-        super(validatorClass, new String[0], new String[0]);
-        
-        if (validatorClass == null && validatorId == null)
-        {
-            throw new IllegalArgumentException("validatorClass and validatorId must not both be null.  For unknown validator use the UNKNOWN constant"); //$NON-NLS-1$
-        }
-        _validatorId = validatorId;
-    }
-
-    /**
-     * For unknown validators, use the UNKNOWN constant.
-     * 
-     * @param validatorClass
-     * @param superClasses 
-     * @param interfaces 
-     * @param validatorId
-     * @throws java.lang.IllegalArgumentException if both className and
-     * converterId are null.
-     * 
-     */
-    public ValidatorTypeInfo(String validatorClass, String[] superClasses, String[] interfaces, String validatorId)
-    {
-        super(validatorClass, superClasses, interfaces);
-        
-        if (validatorClass == null && validatorId == null)
-        {
-            throw new IllegalArgumentException("validatorClass and validatorId must not both be null.  For unknown validator use the UNKNOWN constant"); //$NON-NLS-1$
-        }
-        _validatorId = validatorId;
-    }
-
-    /**
-     * Use when a validator's type info information is unknown.
-     */
-    public static final ValidatorTypeInfo  UNKNOWN = 
-        new ValidatorTypeInfo((Object)null);
-    
-    /**
-     * A private constructor used to create the UNRESOLVED constant.
-     * We use an Object arg here (which is discarded) rather than using
-     * the zero-arg constructor so as not mess up anything like Serializable
-     * that may depend on how zero-arg constructors are defined.
-     * 
-     * @param unresolved
-     */
-    private ValidatorTypeInfo(Object unresolved)
-    {
-        super(null, new String[0], new String[0]);
-        _validatorId = null;
-    }
-
-    /**
-     * @return the validator id (may be null if unknown).
-     */
-    public final String getValidatorId()
-    {
-        return _validatorId;
-    }
-    
-    public String toString()
-    {
-        return "Validator Type Info: type = " + _validatorId + ", "+super.toString(); //$NON-NLS-1$ //$NON-NLS-2$
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/decorator/ValueChangeListenerDecorator.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/decorator/ValueChangeListenerDecorator.java
deleted file mode 100644
index e344c1e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/decorator/ValueChangeListenerDecorator.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.model.decorator;
-
-import org.eclipse.jst.jsf.common.runtime.internal.model.component.ComponentInfo;
-import org.eclipse.jst.jsf.common.runtime.internal.model.event.IValueChangeListenerInfo;
-
-/**
- * ValueChangeListener component decorator.
- * 
- * @author cbateman
- *
- */
-public class ValueChangeListenerDecorator extends ComponentDecorator implements
-        IValueChangeListenerInfo 
-{
-    /**
-     * serializable id
-     */
-    private static final long serialVersionUID = 9045831927898936727L;
-
-    /**
-     * @param decorates
-     */
-    public ValueChangeListenerDecorator(ComponentInfo decorates) {
-        super(decorates);
-    }    
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/event/IActionListenerInfo.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/event/IActionListenerInfo.java
deleted file mode 100644
index a26b3a1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/event/IActionListenerInfo.java
+++ /dev/null
@@ -1,21 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.model.event;
-
-/**
- * A design time analog for the ActionListener
- * @author cbateman
- *
- */
-public interface IActionListenerInfo extends IFacesListenerInfo 
-{
-    // TODO:
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/event/IFacesListenerInfo.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/event/IFacesListenerInfo.java
deleted file mode 100644
index b8996d4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/event/IFacesListenerInfo.java
+++ /dev/null
@@ -1,21 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.model.event;
-
-/**
- * A design-time analog for the runtime Faces Listener.
- * @author cbateman
- *
- */
-public interface IFacesListenerInfo 
-{
-    // no methods
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/event/IValueChangeListenerInfo.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/event/IValueChangeListenerInfo.java
deleted file mode 100644
index 3d21a7a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/event/IValueChangeListenerInfo.java
+++ /dev/null
@@ -1,21 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.model.event;
-
-/**
- * A design time analog for the runtime ValueChangeListener interface.
- * 
- * @author cbateman
- *
- */
-public interface IValueChangeListenerInfo extends IFacesListenerInfo {
-    // TODO:
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/types/ClassTypeInfo.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/types/ClassTypeInfo.java
deleted file mode 100644
index 4a39bc0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/types/ClassTypeInfo.java
+++ /dev/null
@@ -1,137 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.model.types;
-
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Set;
-
-/**
- * A type info that has class information.
- * 
- * @author cbateman
- *
- */
-public abstract class ClassTypeInfo extends TypeInfo implements IClassTypeInfo
-{
-    /**
-     * serializable id
-     */
-    private static final long serialVersionUID = -5046230589012357680L;
-
-    /**
-     * the fully qualified class name of the implementation class for this
-     * type.
-     */
-    protected final String _className;
-
-    /**
-     * known super classes of the component class
-     */
-    protected final String[] _superClasses;
-    
-    /**
-     * known interfaces implemented by the component class
-     */
-    protected final String[] _interfaces;
-    
-    /**
-     * used internally by isInstanceOf
-     */
-    private Set            _superTypes; // may be lazily constructed
-    
-
-    /**
-     * @param className 
-     * @param superClasses
-     * @param interfaces
-     */
-    protected ClassTypeInfo(final String className, final String[] superClasses, final String[] interfaces)
-    {
-        _className = className;
-        _superClasses = superClasses != null ? superClasses : new String[0];
-        _interfaces = interfaces != null ? interfaces : new String[0];
-        
-        if (_superClasses.length + _interfaces.length == 0)
-        {
-            // there are no super-types known
-            _superTypes = Collections.EMPTY_SET;
-        }
-    }
-    
-    public final String[] getInterfaces()
-    {
-        if (_interfaces.length > 0)
-        {
-            final String[]  copy =  new String[_interfaces.length];
-            System.arraycopy(_interfaces, 0, copy, 0, _interfaces.length);
-            return copy;
-        }
-        return new String[0];
-    }
-
-    public final String[] getSuperClasses()
-    {
-        if (_superClasses.length > 0)
-        {
-            final String[]  copy =  new String[_superClasses.length];
-            System.arraycopy(_superClasses, 0, copy, 0, _superClasses.length);
-            return copy;
-        }
-        return new String[0];
-    }
-
-    public final boolean isInstanceOf(String checkType)
-    {
-        if (_superTypes == null)
-        {
-            _superTypes = new HashSet();
-            _superTypes.addAll(Arrays.asList(_superClasses));
-            _superTypes.addAll(Arrays.asList(_interfaces));
-        }
-        
-        return _superTypes.contains(checkType);
-    }
-
-    public final String getClassName()
-    {
-        return _className;
-    }
-
-    public String toString()
-    {
-        String supers = "["; //$NON-NLS-1$
-        
-        for (int i = 0; i < _superClasses.length; i++)
-        {
-            supers += _superClasses[i];
-            
-            if (i < _superClasses.length)
-            {
-                supers += ","; //$NON-NLS-1$
-            }
-        }
-        
-        for (int i = 0; i < _interfaces.length; i++)
-        {
-            supers += _interfaces[i];
-            
-            if (i < _interfaces.length-1)
-            {
-                supers += ","; //$NON-NLS-1$
-            }
-        }
-        supers +="]"; //$NON-NLS-1$
-        
-        return "class= "+getClassName()+ ", supers="+ supers; //$NON-NLS-1$ //$NON-NLS-2$
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/types/IAttributeValueProxy.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/types/IAttributeValueProxy.java
deleted file mode 100644
index 95b83db..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/types/IAttributeValueProxy.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.model.types;
-
-import java.io.Serializable;
-
-/**
- * Wraps 
- * @author cbateman
- *
- */
-public interface IAttributeValueProxy extends Serializable
-{
-//
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/types/IClassTypeInfo.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/types/IClassTypeInfo.java
deleted file mode 100644
index 7b43252..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/types/IClassTypeInfo.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.model.types;
-
-/**
- * A type info that has an associate Java class.
- * @author cbateman
- *
- */
-public interface IClassTypeInfo
-{
-    /**
-     * The fully qualified class name, i.e. java.lang.String
-     * 
-     * @return the fully qualified class name in dot notation
-     * 
-     */
-    String getClassName();
-    
-    /**
-     * Should never return null.  Return empty array if none.
-     * 
-     * @return the list of fully-qualified super class names.  List is as 
-     * calculated at IClassTypeInfo construction and no guarantee is made
-     * (although an implementer may do so) that it will be updated if the
-     * definition of className changes.
-     */
-    String[]  getSuperClasses();
-    
-    /**
-     * Should never return null.  Return empty array if none.
-     * 
-     * @return the list of fully-qualified interface names.  List is as 
-     * calculated at IClassTypeInfo construction and no guarantee is made
-     * (although an implementer may do so) that it will be updated if the
-     * definition of className changes.
-     */
-    String[]  getInterfaces();
-    
-    /**
-     * @param checkType
-     * @return true if checkType is in the set comprised of getSuperClasses()+getInterfaces()
-     */
-    boolean isInstanceOf(final String checkType);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/types/TypeInfo.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/types/TypeInfo.java
deleted file mode 100644
index 4061f4a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/types/TypeInfo.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.model.types;
-
-import java.io.Serializable;
-
-/**
- * Abstract super-class of all view object type information objects.
- * 
- * @author cbateman
- *
- */
-public abstract class TypeInfo implements Serializable
-{
-    /**
-     * serializable id
-     */
-    private static final long serialVersionUID = -3653573923653759724L;
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/view/model/common/AbstractTagAttribute.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/view/model/common/AbstractTagAttribute.java
deleted file mode 100644
index 696113a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/view/model/common/AbstractTagAttribute.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package org.eclipse.jst.jsf.common.runtime.internal.view.model.common;
-
-/**
- * Super-class of all ITagAttribute concrete implementations.
- * 
- * @author cbateman
- *
- */
-public abstract class AbstractTagAttribute implements ITagAttribute
-{
-    /**
-     * 
-     */
-    private static final long serialVersionUID = 6364594863141579928L;
-
-    public abstract String getName();
-
-    public abstract String getTargetNamespace();
-
-    public abstract String getDescription();
-
-    public abstract String getDisplayName();
-
-    public abstract boolean isRequired();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/view/model/common/ComponentPropertyHandler.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/view/model/common/ComponentPropertyHandler.java
deleted file mode 100644
index aa50545..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/view/model/common/ComponentPropertyHandler.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.view.model.common;
-
-/**
- * Default implementation of IComponentPropertyHandler.
- * 
- * @author cbateman
- * 
- */
-public class ComponentPropertyHandler extends TagAttributeHandler implements
-        IComponentPropertyHandler
-{
-    /**
-     * 
-     */
-    private static final long serialVersionUID = 8614562842401106572L;
-    private final String  _propertyName;
-
-    /**
-     * @param customHandler
-     * @param name
-     * @param elAllowed
-     * @param propertyName
-     */
-    public ComponentPropertyHandler(final String customHandler,
-            final String name, final boolean elAllowed,
-            final String propertyName)
-    {
-        super(customHandler, name, elAllowed);
-        _propertyName = propertyName;
-    }
-
-    public String getPropertyName()
-    {
-        return _propertyName;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/view/model/common/IComponentPropertyHandler.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/view/model/common/IComponentPropertyHandler.java
deleted file mode 100644
index dfcaf79..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/view/model/common/IComponentPropertyHandler.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*******************************************************************************
- * Copyright (c) ${year} Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.common.runtime.internal.view.model.common;
-
-/**
- * Maps tag attributes to component properties.
- * 
- * @author cbateman
- *
- */
-public interface IComponentPropertyHandler extends ITagAttributeHandler
-{
-    /**
-     * @return the property name that this handler maps to.
-     */
-    String getPropertyName();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/view/model/common/IComponentTagElement.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/view/model/common/IComponentTagElement.java
deleted file mode 100644
index d34cb2f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/view/model/common/IComponentTagElement.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.view.model.common;
-
-import org.eclipse.jst.jsf.common.runtime.internal.model.component.ComponentTypeInfo;
-
-/**
- * A JSF tag element that maps one-to-one to a JSF UIComponent
- * 
- * @author cbateman
- *
- */
-public interface IComponentTagElement extends IJSFTagElement 
-{
-    /**
-     * @return the comopnent's type info.
-     */
-    ComponentTypeInfo getComponent();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/view/model/common/IConverterTagElement.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/view/model/common/IConverterTagElement.java
deleted file mode 100644
index 63e43ad..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/view/model/common/IConverterTagElement.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.view.model.common;
-
-import org.eclipse.jst.jsf.common.runtime.internal.model.decorator.ConverterTypeInfo;
-
-/**
- * A tag element that causes the construction registration of a converter on
- * a parent object.
- * 
- * @author cbateman
- *
- */
-public interface IConverterTagElement extends IJSFTagElement
-{
-    /**
-     * @return the type info for the converter represented by this
-     * element
-     */
-    ConverterTypeInfo getConverter();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/view/model/common/IHandlerTagElement.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/view/model/common/IHandlerTagElement.java
deleted file mode 100644
index 43e6828..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/view/model/common/IHandlerTagElement.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.view.model.common;
-
-import java.io.Serializable;
-
-import org.eclipse.jst.jsf.common.runtime.internal.model.types.TypeInfo;
-
-/**
- * Generic tag handler that has effect when processed by the JSF ViewHandler.
- * 
- * @author cbateman
- *
- */
-public interface IHandlerTagElement extends IJSFTagElement
-{
-    /**
-     * Enumerates known types of built-in tag handlers.
-     * 
-     * @author cbateman
-     *
-     */
-    static class TagHandlerType extends TypeInfo implements Serializable
-    {
-        /**
-         * serializable id
-         */
-        private static final long serialVersionUID = 5062853948108253861L;
-        
-        private final static int HANDLER_TYPE_FACET = 0;
-        private final static int HANDLER_TYPE_ACTIONLISTENER = 1;
-        private final static int HANDLER_TYPE_VALUECHANGELISTENER = 2;
-        private final static int HANDLER_TYPE_ATTRIBUTE = 3;
-
-        private final static String[]  strValues =
-            {"facet", "actionListener", "valueChangeListener"}; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-
-        private final int _intValue;
-        
-        public TagHandlerType(int intValue)
-        {
-            _intValue = intValue;
-        }
-
-        public String toString()
-        {
-            return strValues[_intValue];
-        }
-
-        protected final int intValue()
-        {
-            return _intValue;
-        }
-       
-        public final static TagHandlerType FACET = 
-            new TagHandlerType(HANDLER_TYPE_FACET);
-        public final static TagHandlerType ACTIONLISTENER = 
-            new TagHandlerType(HANDLER_TYPE_ACTIONLISTENER);
-        public final static TagHandlerType VALUECHANGELISTENER = 
-            new TagHandlerType(HANDLER_TYPE_VALUECHANGELISTENER);
-        public final static TagHandlerType ATTRIBUTE = 
-            new TagHandlerType(HANDLER_TYPE_ATTRIBUTE);
-        
-    }
-    
-    /**
-     * @return the tag handler type as defined by standard known types of 
-     * tags that do not (necessarily) translate into standard objects at 
-     * runtime but may modify the view in some way.
-     */
-    TagHandlerType getTagHandlerType();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/view/model/common/IJSFTagElement.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/view/model/common/IJSFTagElement.java
deleted file mode 100644
index 435c08a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/view/model/common/IJSFTagElement.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.view.model.common;
-
-import java.io.Serializable;
-
-/**
- * An abstraction of a tag element that maps to a JSF artifact (i.e. component, validator)
- *
- * @author cbateman
- *
- */
-public interface IJSFTagElement extends ITagElement
-{
-    /**
-     * An enumeration of different kinds of tags.
-     * 
-     * @author cbateman
-     *
-     */
-    static class TagType implements Serializable
-    {
-        /**
-         * serializable id
-         */
-        private static final long serialVersionUID = -2845327764902349963L;
-        private final static int TYPE_COMPONENT = 0;
-        private final static int TYPE_CONVERTER = 1;
-        private final static int TYPE_VALIDATOR = 2;
-        private final static int TYPE_HANDLER = 3;
-        //private final static int TYPE_UNKNOWN = 4;
-
-        private final static String[]  strValues =
-            {"component", "converter", "validator", "handler"}; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
-
-        private final int _intValue;
-        
-        public TagType(int intValue)
-        {
-            _intValue = intValue;
-        }
-
-        public String toString()
-        {
-            return strValues[_intValue];
-        }
-
-        protected final int intValue()
-        {
-            return _intValue;
-        }
-       
-        public final static TagType COMPONENT = 
-            new TagType(TYPE_COMPONENT);
-        public final static TagType CONVERTER = 
-            new TagType(TYPE_CONVERTER);
-        public final static TagType VALIDATOR = 
-            new TagType(TYPE_VALIDATOR);
-        public final static TagType HANDLER = 
-            new TagType(TYPE_HANDLER);
-    }
-    
-    /**
-     * @return the type of tag as distinguished by how it may affect the
-     * view at runtime.
-     */
-    TagType getType();
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/view/model/common/ITagAttribute.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/view/model/common/ITagAttribute.java
deleted file mode 100644
index 52fd6c2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/view/model/common/ITagAttribute.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package org.eclipse.jst.jsf.common.runtime.internal.view.model.common;
-
-import java.io.Serializable;
-
-/**
- * Information about a tags attribute
- * @author cbateman
- *
- */
-public interface ITagAttribute extends Serializable
-{
-    /**
-     * @return the name of the attribute.  In XML this is the "local" name of
-     * the attribute: that is, it's name without any namespace qualification.
-     */
-    String getName();
-    
-    /**
-     * @return the unique namespace of the attribute or null if it is always the
-     * same as it's owner (the typical case in JSF).
-     */
-    String getTargetNamespace();
-    
-    /**
-     * @return a long-form piece of text, intended for end-user consumption,
-     * that describes the attribute
-     */
-    String getDescription();
-    
-    /**
-     * @return a short, user visible label text for the attribute.
-     */
-    String getDisplayName();
-    
-    /**
-     * @return true if the attribute is required to be populated on the 
-     * element.
-     */
-    boolean isRequired();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/view/model/common/ITagAttributeHandler.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/view/model/common/ITagAttributeHandler.java
deleted file mode 100644
index f6d15c9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/view/model/common/ITagAttributeHandler.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*******************************************************************************
- * Copyright (c) ${year} Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.common.runtime.internal.view.model.common;
-
-import java.io.Serializable;
-
-/**
- * Basic information on attributes.
- * TODO C.B: some question exists in my mind as to how/whether this should merge
- * with meta-data enabled type descriptors.
- * 
- * @author cbateman
- *
- */
-public interface ITagAttributeHandler extends Serializable
-{
-    /**
-     * @return the name of the attribute
-     */
-    String      getName();
-    /**
-     * @return the name of an extension point used to perform custom handling
-     * of the attribute.
-     */
-    String      getCustomHandler();
-    
-    /**
-     * @return true if the property allows EL expressions
-     */
-    boolean isELAllowed();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/view/model/common/ITagElement.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/view/model/common/ITagElement.java
deleted file mode 100644
index e4d8298..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/view/model/common/ITagElement.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.view.model.common;
-
-import java.io.Serializable;
-import java.util.Map;
-
-/**
- * Super-interface of all JSF tag elements.
- * 
- * @author cbateman
- *
- */
-public interface ITagElement extends Serializable
-{
-
-    /**
-     * @return the name of the tag
-     */
-    public abstract String getName();
-
-    /**
-     * @return the namespace uri for this tag
-     */
-    public abstract String getUri();
-    
-    /**
-     * @return the fully qualified class name in dot separated format
-     * (i.e. javax.faces.webapp.ConverterTag)
-     */
-    public abstract String getTagHandlerClassName();
-    
-    /**
-     * @return an unmodifiable map, indexed by name, of all the attribute
-     * handlers available for this tag element.  Each value in the Map
-     * must be a ITagAttributeHandler.
-     */
-    public abstract Map    getAttributeHandlers();
-
-    /**
-     * @return the attributes for the tag.
-     */
-    public abstract Map<String, ? extends ITagAttribute> getAttributes();
-    /**
-     * Signals that the tag element should  make any mutable data immutable
-     * and throw exceptions if attempts are made to implement.  Flag must
-     * latch and become irrevocable.
-     */
-//    public abstract void setLocked();
-    
-    /**
-     * @return true if setLocked has been called.
-     */
-//    public abstract boolean isLocked();
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/view/model/common/IValidatorTagElement.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/view/model/common/IValidatorTagElement.java
deleted file mode 100644
index 9474902..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/view/model/common/IValidatorTagElement.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.view.model.common;
-
-import org.eclipse.jst.jsf.common.runtime.internal.model.decorator.ValidatorTypeInfo;
-
-/**
- * Represents a tag element for a JSF validator.
- * 
- * @author cbateman
- *
- */
-public interface IValidatorTagElement extends IJSFTagElement
-{
-    /**
-     * @return the type info about the validator.
-     */
-    ValidatorTypeInfo getValidator();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/view/model/common/Namespace.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/view/model/common/Namespace.java
deleted file mode 100644
index ee0259f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/view/model/common/Namespace.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.view.model.common;
-
-import java.io.Serializable;
-import java.util.Collection;
-
-/**
- * Abstracts an xml namespace used to define a set of view tags
- * 
- */
-public abstract class Namespace implements Serializable
-{
-    /**
-     * 
-     */
-    private static final long serialVersionUID = 6386464282396970948L;
-
-    /**
-     * @return the namespace uri. MUST NOT BE NULL
-     */
-    public abstract String getNSUri();
-
-    /**
-     * This call may be long running.  Call isInitialized to determine if all 
-     * information is already cached, or if calling this method is likely
-     * to take a long time.
-     * 
-     * @return the view elements in this namespace. May be empty but MUST NOT BE
-     *         NULL.
-     */
-    public abstract Collection<? extends ITagElement> getViewElements();
-    
-    /**
-     * This method should be light weight if possible.  Unlike calling
-     * getViewElements().isEmpty, this call should not require that all
-     * view element children of this namespace be analyzed and constructed in
-     * order to succeed.
-     * 
-     * @return true if this name space has view element children
-     */
-    public abstract boolean hasViewElements();
-
-    /**
-     * If calculating all view elements is expensive, a Namespace implementation
-     * may defer calculation until a specific element is requested.  A caller of
-     * getViewElements (such as a UI that shows all tags), may wish to know if
-     * the entire namespace has been initialized before calling it, since it may
-     * be long running.
-     * 
-     * @return true if the namespace's elements have been fully initialized.  If this
-     * method returns false, care should be taken in calling getViewElements() and
-     * getViewElement() since they may be very long running.
-     */
-    public abstract boolean isInitialized();
-    
-    /**
-     * @param name
-     * @return the tag element called 'name' or null if none.
-     */
-    public abstract ITagElement getViewElement(final String name);
-
-    /**
-     * @return a user readable display name for this namespace or null if none.
-     */
-    public abstract String getDisplayName();
-
-    public String toString()
-    {
-        return getNSUri();
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/view/model/common/TagAttributeHandler.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/view/model/common/TagAttributeHandler.java
deleted file mode 100644
index b293495..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/view/model/common/TagAttributeHandler.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*******************************************************************************
- * Copyright (c) ${year} Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.view.model.common;
-
-/**
- * Default implementation of ITagAttributeHandler.
- * 
- * @author cbateman
- * 
- */
-public class TagAttributeHandler implements ITagAttributeHandler
-{
-    /**
-     * 
-     */
-    private static final long serialVersionUID = 8153903018703133004L;
-    private final String      _customHandler;
-    private final String      _name;
-    private final boolean     _elAllowed;
-
-    /**
-     * @param customHandler
-     * @param name
-     * @param elAllowed
-     */
-    public TagAttributeHandler(final String customHandler, final String name,
-            final boolean elAllowed)
-    {
-        super();
-        _customHandler = customHandler;
-        _elAllowed = elAllowed;
-        _name = name;
-    }
-
-    public String getCustomHandler()
-    {
-        return _customHandler;
-    }
-
-    public String getName()
-    {
-        return _name;
-    }
-
-    public boolean isELAllowed()
-    {
-        return _elAllowed;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/view/model/common/TagElement.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/view/model/common/TagElement.java
deleted file mode 100644
index fb04e6f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/view/model/common/TagElement.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.view.model.common;
-
-import java.util.Map;
-
-/**
- * Abstract a tag element used to construct a view element
- * 
- * @author cbateman
- *
- */
-public abstract class TagElement implements ITagElement 
-{
-    /**
-     * 
-     */
-    private static final long serialVersionUID = 7885641652240047924L;
-
-    /* (non-Javadoc)
-     * @see viewhandlerprototype.model.ITagElement#getName()
-     */
-    public abstract String getName();
-
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.jsf.common.runtime.internal.view.model.common.ITagElement#getUri()
-     */
-    public abstract String getUri();
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.jsf.common.runtime.internal.view.model.common.ITagElement#getTagHandlerClassName()
-     */
-    public abstract String getTagHandlerClassName();
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.jsf.common.runtime.internal.view.model.common.ITagElement#getAttributeHandlers()
-     */
-    public abstract Map getAttributeHandlers();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/.classpath b/jsf/plugins/org.eclipse.jst.jsf.common.ui/.classpath
deleted file mode 100644
index 304e861..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/.cvsignore b/jsf/plugins/org.eclipse.jst.jsf.common.ui/.cvsignore
deleted file mode 100644
index 2a89e4b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/.cvsignore
+++ /dev/null
@@ -1,4 +0,0 @@
-bin
-@dot
-build.xml
-javaCompiler...args
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/.project b/jsf/plugins/org.eclipse.jst.jsf.common.ui/.project
deleted file mode 100644
index 9615dd9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.jst.jsf.common.ui</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/.settings/org.eclipse.jdt.core.prefs b/jsf/plugins/org.eclipse.jst.jsf.common.ui/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 9334e13..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,82 +0,0 @@
-#Mon Jun 30 15:55:16 PDT 2008
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=disabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.5
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.doc.comment.support=enabled
-org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.autoboxing=warning
-org.eclipse.jdt.core.compiler.problem.deprecation=error
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=ignore
-org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
-org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
-org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
-org.eclipse.jdt.core.compiler.problem.invalidJavadoc=error
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocComments=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.missingJavadocTags=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=error
-org.eclipse.jdt.core.compiler.problem.nullReference=ignore
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
-org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore
-org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=ignore
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=ignore
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=error
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=error
-org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
-org.eclipse.jdt.core.compiler.problem.unusedLocal=error
-org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
-org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
-org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.5
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/.settings/org.eclipse.jdt.ui.prefs b/jsf/plugins/org.eclipse.jst.jsf.common.ui/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644
index 82eb6c1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,3 +0,0 @@
-#Fri Apr 06 18:25:15 PDT 2007
-eclipse.preferences.version=1
-org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8"?><templates/>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/.settings/org.eclipse.pde.prefs b/jsf/plugins/org.eclipse.jst.jsf.common.ui/.settings/org.eclipse.pde.prefs
deleted file mode 100644
index d9b486b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/.settings/org.eclipse.pde.prefs
+++ /dev/null
@@ -1,22 +0,0 @@
-#Fri May 30 11:46:32 PDT 2008
-compilers.f.unresolved-features=1
-compilers.f.unresolved-plugins=1
-compilers.incompatible-environment=1
-compilers.p.build=1
-compilers.p.deprecated=1
-compilers.p.discouraged-class=1
-compilers.p.internal=1
-compilers.p.missing-packages=0
-compilers.p.no-required-att=0
-compilers.p.not-externalized-att=0
-compilers.p.unknown-attribute=1
-compilers.p.unknown-class=1
-compilers.p.unknown-element=1
-compilers.p.unknown-identifier=1
-compilers.p.unknown-resource=1
-compilers.p.unresolved-ex-points=0
-compilers.p.unresolved-import=0
-compilers.s.create-docs=false
-compilers.s.doc-folder=doc
-compilers.s.open-tags=1
-eclipse.preferences.version=1
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/META-INF/MANIFEST.MF b/jsf/plugins/org.eclipse.jst.jsf.common.ui/META-INF/MANIFEST.MF
deleted file mode 100644
index 075c0da..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,36 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %pluginName
-Bundle-SymbolicName: org.eclipse.jst.jsf.common.ui;singleton:=true
-Bundle-Version: 1.2.0.qualifier
-Bundle-Activator: org.eclipse.jst.jsf.common.ui.JSFUICommonPlugin
-Bundle-Localization: plugin
-Require-Bundle: org.eclipse.ui;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.core.runtime;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.ui.cheatsheets;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.help;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.jdt.core;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.core.resources;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.ui.forms;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.jdt.ui;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.ui.ide;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.draw2d;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.jface.text;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.jst.j2ee;bundle-version="[1.1.0,1.2.0)",
- org.eclipse.wst.common.emf;bundle-version="[1.1.103,2.0.0)",
- org.eclipse.wst.common.project.facet.core;bundle-version="[1.2.0,2.0.0)",
- org.eclipse.emf;bundle-version="[2.2.0,3.0.0)",
- org.eclipse.emf.common;bundle-version="[2.2.0,3.0.0)",
- org.eclipse.jst.jsf.common;bundle-version="[1.0.1,2.0.0)"
-Export-Package: org.eclipse.jst.jsf.common.ui;x-friends:="org.eclipse.jst.pagedesigner,org.eclipse.jst.pagedesigner.jsf.ui",
- org.eclipse.jst.jsf.common.ui.internal.actions;x-friends:="org.eclipse.jst.jsf.facesconfig.ui",
- org.eclipse.jst.jsf.common.ui.internal.dialogfield;x-friends:="org.eclipse.jst.pagedesigner,org.eclipse.jst.pagedesigner.jsf.ui",
- org.eclipse.jst.jsf.common.ui.internal.dialogs;x-friends:="org.eclipse.jst.pagedesigner",
- org.eclipse.jst.jsf.common.ui.internal.form;x-internal=true,
- org.eclipse.jst.jsf.common.ui.internal.guiutils;x-friends:="org.eclipse.jst.pagedesigner",
- org.eclipse.jst.jsf.common.ui.internal.logging;x-friends:="org.eclipse.jst.pagedesigner,org.eclipse.jst.pagedesigner.jsf.ui",
- org.eclipse.jst.jsf.common.ui.internal.preferences;x-internal=true,
- org.eclipse.jst.jsf.common.ui.internal.utils;x-friends:="org.eclipse.jst.pagedesigner,org.eclipse.jst.jsf.facesconfig.ui,org.eclipse.jst.pagedesigner.jsf.ui"
-Bundle-ActivationPolicy: lazy
-Bundle-Vendor: %pluginProvider
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/about.html b/jsf/plugins/org.eclipse.jst.jsf.common.ui/about.html
deleted file mode 100644
index 3b20a36..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/about.html
+++ /dev/null
@@ -1,22 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<head>
-<title>About</title>
-<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>June, 2008</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise indicated below, the Content is provided to you under the terms and conditions of the
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content.</p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/about.ini b/jsf/plugins/org.eclipse.jst.jsf.common.ui/about.ini
deleted file mode 100644
index a21a3ec..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/about.ini
+++ /dev/null
@@ -1,29 +0,0 @@
-# about.ini
-# contains information about a feature
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# "%key" are externalized strings defined in about.properties
-# This file does not need to be translated.
-
-# Property "aboutText" contains blurb for "About" dialog (translated)
-aboutText=%blurb
-
-# Property "windowImage" contains path to window icon (16x16)
-# needed for primary features only
-
-# Property "featureImage" contains path to feature image (32x32)
-featureImage=eclipse32.gif
-
-# Property "aboutImage" contains path to product image (500x330 or 115x164)
-# needed for primary features only
-
-# Property "appName" contains name of the application (translated)
-# needed for primary features only
-
-# Property "welcomePage" contains path to welcome page (special XML-based format)
-# optional
-
-# Property "welcomePerspective" contains the id of the perspective in which the
-# welcome page is to be opened.
-# optional
-
-
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/about.mappings b/jsf/plugins/org.eclipse.jst.jsf.common.ui/about.mappings
deleted file mode 100644
index 29ddddb..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/about.mappings
+++ /dev/null
@@ -1,6 +0,0 @@
-# about.mappings
-# contains fill-ins for about.properties
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# This file does not need to be translated.
-
-0=200509071822
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/about.properties b/jsf/plugins/org.eclipse.jst.jsf.common.ui/about.properties
deleted file mode 100644
index d7849b8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/about.properties
+++ /dev/null
@@ -1,27 +0,0 @@
-###############################################################################
-# Copyright (c) 2004, 2005 Sybase, Inc. and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Sybase, Inc. - initial API and implementation
-###############################################################################
-#
-#
-
-
-# about.properties
-# contains externalized strings for about.ini
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# fill-ins are supplied by about.mappings
-# This file should be translated.
-
-blurb=JSF Faces Config Editor \n\
-\n\
-Version: {featureVersion}\n\
-Build id: {0}\n\
-\n\
-(c) Copyright Eclipse contributors and others. 2000, 2004.  All rights reserved.\n\
-Visit http://www.eclipse.org/webtools/jsf
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/build.properties b/jsf/plugins/org.eclipse.jst.jsf.common.ui/build.properties
deleted file mode 100644
index 2524004..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/build.properties
+++ /dev/null
@@ -1,28 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               .,\
-               plugin.xml,\
-               about.html,\
-               about.ini,\
-               about.mappings,\
-               about.properties,\
-               bin/,\
-               build.properties,\
-               default.properties,\
-               eclipse32.gif,\
-               icons/,\
-               plugin.properties,\
-               schema/
-javacSource=1.5
-javacTarget=1.5
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/default.properties b/jsf/plugins/org.eclipse.jst.jsf.common.ui/default.properties
deleted file mode 100644
index 82c5358..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/default.properties
+++ /dev/null
@@ -1,52 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-# This file contains all the Default Preference Settings
-
-####################################################
-# Logging Preference Settings
-####################################################
-
-# Enable/Disable console logging.  
-# Valid values: TRUE, FALSE
-console.logging.on=true
-
-# Maximum log level of console logging.  
-# Valid values: DEBUG, INFO, WARN, ERROR, FATAL
-console.logging.max.level=INFO
-
-# Enable/Disable eclipse logging.  
-# Valid values: TRUE, FALSE
-eclipse.logging.on=true
-
-# Maximum log level of eclipse logging.  
-# Valid values: DEBUG, INFO, WARN, ERROR, FATAL
-eclipse.logging.max.level=INFO
-
-eclipse.pattern=%m
-
-# Enable/Disable file logging.  
-# Valid values: TRUE, FALSE
-file.logging.on=true
-
-# Maximum log level of file logging.  
-# Valid values: DEBUG, INFO, WARN, ERROR, FATAL
-file.logging.max.level=DEBUG
-
-# Clear log file when eclipse restarts.  
-# Valid values: TRUE, FALSE
-file.logging.startup.clear=true
-
-# Location of log file
-file.logging.path=facesconfigeditor.log
-
-# Rollover frequency of log file.  
-# Valid values: DAILY, WEEKLY, MONTHLY
-file.logging.rollover.frequency=DAILY
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/eclipse32.gif b/jsf/plugins/org.eclipse.jst.jsf.common.ui/eclipse32.gif
deleted file mode 100644
index e6ad7cc..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/eclipse32.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/icons/Editor_Help.gif b/jsf/plugins/org.eclipse.jst.jsf.common.ui/icons/Editor_Help.gif
deleted file mode 100644
index 03f656f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/icons/Editor_Help.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/icons/FacesConfig_GotoEditor.gif b/jsf/plugins/org.eclipse.jst.jsf.common.ui/icons/FacesConfig_GotoEditor.gif
deleted file mode 100644
index 0e5bcf6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/icons/FacesConfig_GotoEditor.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/icons/FacesConfig_Introduction.gif b/jsf/plugins/org.eclipse.jst.jsf.common.ui/icons/FacesConfig_Introduction.gif
deleted file mode 100644
index 44cd044..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/icons/FacesConfig_Introduction.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/icons/FacesConfig_Tutorial.gif b/jsf/plugins/org.eclipse.jst.jsf.common.ui/icons/FacesConfig_Tutorial.gif
deleted file mode 100644
index ad8e5b6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/icons/FacesConfig_Tutorial.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/icons/PD_Palette_Default.gif b/jsf/plugins/org.eclipse.jst.jsf.common.ui/icons/PD_Palette_Default.gif
deleted file mode 100644
index 5e7fb33..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/icons/PD_Palette_Default.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/icons/back_nav_16.gif b/jsf/plugins/org.eclipse.jst.jsf.common.ui/icons/back_nav_16.gif
deleted file mode 100644
index 740419b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/icons/back_nav_16.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/icons/configs.gif b/jsf/plugins/org.eclipse.jst.jsf.common.ui/icons/configs.gif
deleted file mode 100644
index c984fba..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/icons/configs.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/icons/form_banner.gif b/jsf/plugins/org.eclipse.jst.jsf.common.ui/icons/form_banner.gif
deleted file mode 100644
index aebc0b2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/icons/form_banner.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/icons/forward_nav_16.gif b/jsf/plugins/org.eclipse.jst.jsf.common.ui/icons/forward_nav_16.gif
deleted file mode 100644
index 7a1511d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/icons/forward_nav_16.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/icons/help.gif b/jsf/plugins/org.eclipse.jst.jsf.common.ui/icons/help.gif
deleted file mode 100644
index 9d70301..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/icons/help.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/icons/jsf_converter.gif b/jsf/plugins/org.eclipse.jst.jsf.common.ui/icons/jsf_converter.gif
deleted file mode 100644
index 16466ed..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/icons/jsf_converter.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/icons/jsf_validator.gif b/jsf/plugins/org.eclipse.jst.jsf.common.ui/icons/jsf_validator.gif
deleted file mode 100644
index 86196e9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/icons/jsf_validator.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/icons/jsf_view.gif b/jsf/plugins/org.eclipse.jst.jsf.common.ui/icons/jsf_view.gif
deleted file mode 100644
index c81630a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/icons/jsf_view.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/icons/object.gif b/jsf/plugins/org.eclipse.jst.jsf.common.ui/icons/object.gif
deleted file mode 100644
index 061161a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/icons/object.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/icons/overview_obj.gif b/jsf/plugins/org.eclipse.jst.jsf.common.ui/icons/overview_obj.gif
deleted file mode 100644
index 03f656f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/icons/overview_obj.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/icons/refresh_nav_16.gif b/jsf/plugins/org.eclipse.jst.jsf.common.ui/icons/refresh_nav_16.gif
deleted file mode 100644
index a063c23..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/icons/refresh_nav_16.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/icons/reload_nav_16.gif b/jsf/plugins/org.eclipse.jst.jsf.common.ui/icons/reload_nav_16.gif
deleted file mode 100644
index d71dfff..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/icons/reload_nav_16.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/icons/stop_nav_16.gif b/jsf/plugins/org.eclipse.jst.jsf.common.ui/icons/stop_nav_16.gif
deleted file mode 100644
index 4eb53ec..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/icons/stop_nav_16.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/plugin.properties b/jsf/plugins/org.eclipse.jst.jsf.common.ui/plugin.properties
deleted file mode 100644
index 3549ea3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/plugin.properties
+++ /dev/null
@@ -1,16 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-
-pluginName=JavaServer Faces Tools - Common UI
-pluginProvider=Eclipse.org
-
-extension-point.name.0 = Introduction Page
-extension-point.name.1 = OverviewPage
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/plugin.xml b/jsf/plugins/org.eclipse.jst.jsf.common.ui/plugin.xml
deleted file mode 100644
index 435be3a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/plugin.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.2"?>
-<plugin>
-   <extension-point id="introductionPage" name="%extension-point.name.0" schema="schema/introductionPage.exsd"/>
-   <extension-point id="overviewPage" name="%extension-point.name.1" schema="schema/overviewPage.exsd"/>
-</plugin>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/schema/introductionPage.exsd b/jsf/plugins/org.eclipse.jst.jsf.common.ui/schema/introductionPage.exsd
deleted file mode 100644
index d147b34..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/schema/introductionPage.exsd
+++ /dev/null
@@ -1,213 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.jst.jsf.common.ui">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.jst.jsf.common.ui" id="introductionPage" name="Introduction Page"/>
-      </appInfo>
-      <documentation>
-         The purpose of this extension point is to allow plug-ins to describe the contents and links on a introduction page of an editor.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="introductionpage"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a fully qualified identifier of the target extension point.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  identifier of the extension instance, this should be the same as the editor id.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  an optional name of the extension instance. Normally this is the editor name.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="introductionpage">
-      <annotation>
-         <documentation>
-            The details for an introduction page for a specific plugins editor
-         </documentation>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="introductionelement" minOccurs="1" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="name" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The name of the page.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="description" type="string">
-            <annotation>
-               <documentation>
-                  A description for the page.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="introductionelement">
-      <annotation>
-         <documentation>
-            An element that make up a section of the page. Elements can contain Headers, Hyperlinks, Icons and text.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="icon" type="string">
-            <annotation>
-               <documentation>
-                  An icon to display in the element. The icon should be 72x72 and will appear to the left of the headers, hyperlinks and text
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="resource"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="heading" type="string">
-            <annotation>
-               <documentation>
-                  A short heading for the element (optional)
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="text" type="string">
-            <annotation>
-               <documentation>
-                  The text description for the element
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="hyperlink" type="string">
-            <annotation>
-               <documentation>
-                  A hyperlink associated with the element. The hyperlink would normally execute the hyperlinkaction action
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="hyperlinkaction" type="string">
-            <annotation>
-               <documentation>
-                  The action associated with the hyperlink. This is an action that will be executed when the hyperlink is selected
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="actionparameters" type="string">
-            <annotation>
-               <documentation>
-                  Can be used to pass one or more parameters to the hyperlink action. Parameter must be space separated (optional)
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         1.0.0
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         &lt;extension
-         id=&quot;org.eclipse.jst.jsf.facesconfig.ui.pageflow.PageflowEditor&quot;
-         name=&quot;%pageflow.editor.intro.name&quot;
-         point=&quot;org.eclipse.jst.jsf.facesconfig.ui.page.introductionPage&quot;&gt;
-      &lt;introductionpage
-            name=&quot;%pageflow.editor.intro.name&quot;
-            description=&quot;%port.editor.intro.description&quot;&gt;
-         &lt;introductionelement
-               icon=&quot;icons/pageflow_72.gif&quot;
-               heading=&quot;%pageflow.editor.intro.heading&quot;
-               text=&quot;%pageflow.editor.intro.description&quot;&gt;
-         &lt;/introductionelement&gt;
-         &lt;introductionelement
-               actionparameters=&quot;Pageflow.designerCheatSheet&quot;
-               icon=&quot;icons/tutorials_72.gif&quot;
-               hyperlinkaction=&quot;org.eclipse.jst.jsf.common.ui.actions.LoadCheatSheetAction&quot;
-               text=&quot;%pageflow.editor.intro.cheatsheets.text&quot;
-               hyperlink=&quot;%pageflow.editor.intro.cheatsheets.link&quot;&gt;
-         &lt;/introductionelement&gt;
-         &lt;introductionelement
-               actionparameters=&quot;http://www.eclipse.org&quot;
-               icon=&quot;icons/overview_72.gif&quot;
-               hyperlinkaction=&quot;org.eclipse.jst.jsf.common.ui.actions.LoadHelpAction&quot;
-               text=&quot;%pageflow.editor.intro.help.text&quot;
-               hyperlink=&quot;%pageflow.editor.intro.help.link&quot;&gt;
-         &lt;/introductionelement&gt;
-         &lt;introductionelement
-               actionparameters=&quot;overview&quot;
-               icon=&quot;icons/gotoeditor_72.gif&quot;
-               hyperlinkaction=&quot;org.eclipse.jst.jsf.common.ui.actions.OpenPageAction&quot;
-               text=&quot;%pageflow.editor.intro.start.text&quot;
-               hyperlink=&quot;%pageflow.editor.intro.start.link&quot;&gt;
-         &lt;/introductionelement&gt;
-      &lt;/introductionpage&gt;
-   &lt;/extension&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         Copyright (c) 2004, 2006 Sybase, Inc. and others. &lt;br&gt;
- All rights reserved. This program and the accompanying materials &lt;br&gt;
- are made available under the terms of the Eclipse Public License v1.0 &lt;br&gt;
- which accompanies this distribution, and is available at &lt;br&gt;
- http://www.eclipse.org/legal/epl-v10.html &lt;br&gt;
- 
-  Contributors: &lt;br&gt;
-      Sybase, Inc. - initial API and implementation &lt;br&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/schema/overviewPage.exsd b/jsf/plugins/org.eclipse.jst.jsf.common.ui/schema/overviewPage.exsd
deleted file mode 100644
index c55436b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/schema/overviewPage.exsd
+++ /dev/null
@@ -1,213 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.jst.jsf.common.ui">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.jst.jsf.common.ui" id="overviewPage" name="Overview Page"/>
-      </appInfo>
-      <documentation>
-         The purpose of this extension point is to allow plug-ins to describe the contents and links on a overview page of an editor.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="overviewpage"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a fully qualified identifier of the target extension point.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  identifier of the extension instance, this should be the same as the editor id.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  an optional name of the extension instance. Normally this is the editor name.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="overviewpage">
-      <annotation>
-         <documentation>
-            The details for an overview page for a specific plugins editor
-         </documentation>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="overviewelement" minOccurs="1" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="name" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The name of the page.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="description" type="string">
-            <annotation>
-               <documentation>
-                  A description for the page.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="overviewelement">
-      <annotation>
-         <documentation>
-            An element that make up a section of the page. Elements can contain Headers, Hyperlinks, Icons and text.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="icon" type="string">
-            <annotation>
-               <documentation>
-                  An icon to display in the element. The icon should be 72x72 and will appear to the left of the headers, hyperlinks and text
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="resource"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="heading" type="string">
-            <annotation>
-               <documentation>
-                  A short heading for the element (optional)
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="text" type="string">
-            <annotation>
-               <documentation>
-                  The text description for the element
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="hyperlink" type="string">
-            <annotation>
-               <documentation>
-                  A hyperlink associated with the element. The hyperlink would normally execute the hyperlinkaction action
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="hyperlinkaction" type="string">
-            <annotation>
-               <documentation>
-                  The action associated with the hyperlink. This is an action that will be executed when the hyperlink is selected
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="actionparameters" type="string">
-            <annotation>
-               <documentation>
-                  Can be used to pass one or more parameters to the hyperlink action. Parameter must be space separated (optional)
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         1.0.0
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         &lt;extension
-         id=&quot;org.eclipse.jst.jsf.facesconfig.ui.pageflow.PageflowEditor&quot;
-         name=&quot;%pageflow.editor.intro.name&quot;
-         point=&quot;org.eclipse.jst.jsf.facesconfig.ui.page.overviewPage&quot;&gt;
-      &lt;overviewpage
-            name=&quot;%pageflow.editor.intro.name&quot;
-            description=&quot;%port.editor.intro.description&quot;&gt;
-         &lt;overviewelement
-               icon=&quot;icons/pageflow_72.gif&quot;
-               heading=&quot;%pageflow.editor.intro.heading&quot;
-               text=&quot;%pageflow.editor.intro.description&quot;&gt;
-         &lt;/overviewelement&gt;
-         &lt;overviewelement
-               actionparameters=&quot;Pageflow.designerCheatSheet&quot;
-               icon=&quot;icons/tutorials_72.gif&quot;
-               hyperlinkaction=&quot;org.eclipse.jst.jsf.common.ui.actions.LoadCheatSheetAction&quot;
-               text=&quot;%pageflow.editor.intro.cheatsheets.text&quot;
-               hyperlink=&quot;%pageflow.editor.intro.cheatsheets.link&quot;&gt;
-         &lt;/overviewelement&gt;
-         &lt;overviewelement
-               actionparameters=&quot;http://www.eclipse.org&quot;
-               icon=&quot;icons/overview_72.gif&quot;
-               hyperlinkaction=&quot;org.eclipse.jst.jsf.common.ui.actions.LoadHelpAction&quot;
-               text=&quot;%pageflow.editor.intro.help.text&quot;
-               hyperlink=&quot;%pageflow.editor.intro.help.link&quot;&gt;
-         &lt;/overviewelement&gt;
-         &lt;overviewelement
-               actionparameters=&quot;overview&quot;
-               icon=&quot;icons/gotoeditor_72.gif&quot;
-               hyperlinkaction=&quot;org.eclipse.jst.jsf.common.ui.actions.OpenPageAction&quot;
-               text=&quot;%pageflow.editor.intro.start.text&quot;
-               hyperlink=&quot;%pageflow.editor.intro.start.link&quot;&gt;
-         &lt;/overviewelement&gt;
-      &lt;/overviewpage&gt;
-   &lt;/extension&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         Copyright (c) 2004, 2006 Sybase, Inc. and others. &lt;br&gt;
- All rights reserved. This program and the accompanying materials &lt;br&gt;
- are made available under the terms of the Eclipse Public License v1.0 &lt;br&gt;
- which accompanies this distribution, and is available at &lt;br&gt;
- http://www.eclipse.org/legal/epl-v10.html &lt;br&gt;
- 
-  Contributors: &lt;br&gt;
-      Sybase, Inc. - initial API and implementation &lt;br&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/CommonResources.properties b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/CommonResources.properties
deleted file mode 100644
index b9527d1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/CommonResources.properties
+++ /dev/null
@@ -1,113 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-####################################################
-# Generic Strings for UI
-####################################################
-
-pluginName=Web Application Development Common
-button.save=&Save
-button.remove=&Remove
-
-####################################################
-# Resource message for Logging
-####################################################
-
-log.msg={0}
-
-log.ResourceUtils=Missing Resource Bundle "{0}".
-log.CommonPlugin=Web Application Development Common Plugin initialized on eclipse version {0}.
-log.FavoriteConfigurations.save.error=Failed to save {0} favorites. File={1}
-log.FavoriteConfigurations.read.error=Failed to read {0} favorites. File={1}
-log.CommonPlugin.image.error=Image {0} not found.
-
-log.IntroductionSection.action.error = Failed to launch the link {0}
-
-####################################################
-# Resource message for Alerts
-####################################################
-
-alert.msg={0}
-
-####################################################
-# Resource messages for FavoriteSection
-####################################################
-favorites.group.label=Favorite Configurations
-favorites.label=&Name:
-favorites.tooltip=Construct common setting favorites for this page.
-favorites.save.tooltip=Save the current options on this page as the favorites.
-favorites.remove.tooltip=Remove the current favorite.
-favorites.default=default
-
-####################################################
-# Resource messages for Preference Pages
-####################################################
-JMTPreferencePage.Description=Expand the tree to edit Web Application preferences.
-
-LoggingPreferencePage.Log.Level.label=Log Level:
-LoggingPreferencePage.Log.Level.tooltip=Select the logging level to output to the selected source.
-LoggingPreferencePage.Log.Level.debug=Debug
-LoggingPreferencePage.Log.Level.info=Info
-LoggingPreferencePage.Log.Level.warn=Warn
-LoggingPreferencePage.Log.Level.error=Error
-LoggingPreferencePage.Log.Level.fatal=Fatal
-LoggingPreferencePage.Console.Group.label=Console
-LoggingPreferencePage.Console.Logging.label=Enable &Console Logging
-LoggingPreferencePage.Console.Logging.tooltip=Receive log message in the Eclipse Console view.
-LoggingPreferencePage.Eclipse.Group.label=Eclipse
-LoggingPreferencePage.Eclipse.Logging.label=Enable &Eclipse Logging
-LoggingPreferencePage.Eclipse.Logging.tooltip=Receive log message in the Eclipse Error Log view.
-LoggingPreferencePage.File.Group.label=File
-LoggingPreferencePage.File.Logging.label=Enable &File Logging
-LoggingPreferencePage.File.Logging.tooltip=Write log message to an external file.
-LoggingPreferencePage.File.clearing.label=Clear log file on &startup
-LoggingPreferencePage.File.clearing.tooltip=Each time Eclipse starts, clear the log file.
-LoggingPreferencePage.File.path.label=&Log file:
-LoggingPreferencePage.File.path.tooltip=Where should the log file go? Partial paths are \n based from: /workspace/.metadata/.plugins/org.eclipse.jst.jsf.common.ui.internal/.
-LoggingPreferencePage.File.button.label=B&rowse
-LoggingPreferencePage.File.button.tooltip=Select a location and file name for file logging.
-LoggingPreferencePage.File.select.label=Select a log file
-LoggingPreferencePage.File.Rollover.Frequency.label=Rollover Fre&quency:
-LoggingPreferencePage.File.Rollover.Frequency.tooltip=Select the frequency of how often to generate a new log file. \n The original log file is appended with a timestamp.
-LoggingPreferencePage.File.Rollover.Frequency.daily=Daily
-LoggingPreferencePage.File.Rollover.Frequency.weekly=Weekly
-LoggingPreferencePage.File.Rollover.Frequency.monthly=Monthly
-
-####################################################
-# Resource messages for BrowserWindow
-####################################################
-BrowserWindow.back.tooltip=Navigate back in the browser
-BrowserWindow.forward.tooltip=Navigate forward in the browser
-BrowserWindow.stop.tooltip=Stop browser navigation
-BrowserWindow.refresh.tooltip=Refresh the browser
-BrowserWindow.reload.tooltip=Reload the browser
-
-####################################################
-# Resource messages for Commmon DialogField
-####################################################
-DialogField.JavaClassWizard.NewClass=New Java Class
-DialogField.ClassButton.SelectType=Select Type
-DialogField.Browse=Browse...
-DialogField.ResourceButton.SelectFile=Select File
-
-####################################################
-# Resource messages for Commmon Dialog
-####################################################
-Dialog.ResourceOnClasspathDialog.StatusMessage=Select a properties file
-Dialog.CommonResourceDialog.StatusMessage0=Select
-Dialog.TreeViewerSelectionDialog.DefaultTitle=Select a File
-
-Wizards.NewPage.Error.InvalidProject=Invalid Web project.
-Error.FileFilter.title=File selection
-Error.ImgFileFilter.error=File selection error:
-Error.ProjectFileDialogContentProvider=Project file dialog error: {0}
-Error.RefreshingLocal=Refreshing local
-
-Service.NoResourceError=Unable to determine Service Model file.
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/IFileFolderConstants.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/IFileFolderConstants.java
deleted file mode 100644
index e74e90a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/IFileFolderConstants.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public interface IFileFolderConstants {
-
-	/**
-	 * the dot character
-	 */
-	public static final String DOT = "."; //$NON-NLS-1$
-
-	/**
-	 * the path separator
-	 */
-	public static final String PATH_SEPARATOR = "/"; //$NON-NLS-1$
-
-	/** file extensions */
-	/**
-	 * class file extension
-	 */
-	public static final String EXT_CLASS = "class"; //$NON-NLS-1$
-
-	/**
-	 * jar file extension
-	 */
-	public static final String EXT_JAR = "jar"; //$NON-NLS-1$
-
-	/**
-	 * java file extension
-	 */
-	public static final String EXT_JAVA = "java"; //$NON-NLS-1$
-
-
-	/**
-	 * jsp file extension
-	 */
-	public static final String EXT_JSP = "jsp"; //$NON-NLS-1$
-
-	/**
-	 * properties file extension
-	 */
-	public static final String EXT_PROPERTIES = "properties"; //$NON-NLS-1$
-
-	/**
-	 * taglib file extension
-	 */
-	public static final String EXT_TAGLIB = "tld"; //$NON-NLS-1$
-
-	/**
-	 * standard web.xml file name
-	 */
-	public static final String FILE_WEB_XML = "web.xml"; //$NON-NLS-1$
-
-	/** folders */
-
-	/**
-	 * classes folder name
-	 */
-	public static final String FOLDER_CLASS = "classes"; //$NON-NLS-1$
-
-	/**
-	 * icons folder name
-	 */
-	public static final String FOLDER_ICONS = "icons"; //$NON-NLS-1$
-
-	/**
-	 * the meta-inf folder name
-	 */
-	public static final String FOLDER_METAINF = "META-INF"; //$NON-NLS-1$
-
-	/**
-	 * the src folder name
-	 */
-	public static final String FOLDER_SOURCE = "src"; //$NON-NLS-1$
-
-	/**
-	 * the web-inf folder name
-	 */
-	public static final String FOLDER_WEBINF = "WEB-INF"; //$NON-NLS-1$
-
-	/** the webroot folder depth relative to the project */
-	public static final int WEBROOT_FOLDER_DEPTH = 2;
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/JSFUICommonPlugin.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/JSFUICommonPlugin.java
deleted file mode 100644
index b4a1f00..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/JSFUICommonPlugin.java
+++ /dev/null
@@ -1,418 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.MissingResourceException;
-import java.util.Properties;
-import java.util.ResourceBundle;
-
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.resource.ImageRegistry;
-import org.eclipse.jst.jsf.common.ui.internal.guiutils.Alerts;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.Version;
-
-/**
- * The main plugin class to be used in the desktop.
- */
-public class JSFUICommonPlugin extends AbstractUIPlugin {
-	// Properties contains general properties and defaults to preferences.
-	private static final String PROPERTIES = "default.properties"; //$NON-NLS-1$
-	// preferences will
-	// contain this string
-	// in the key.
-
-	private static final String P_CONSOLE_LOGGING = "console.logging.on"; //$NON-NLS-1$
-
-	private static final String P_CONSOLE_LOG_LEVEL = "console.logging.max.level"; //$NON-NLS-1$
-
-	private static final String P_ECLIPSE_LOGGING = "eclipse.logging.on"; //$NON-NLS-1$
-
-	private static final String P_ECLIPSE_LOG_LEVEL = "eclipse.logging.max.level"; //$NON-NLS-1$
-
-	private static final String P_FILE_LOGGING = "file.logging.on"; //$NON-NLS-1$
-
-	private static final String P_FILE_LOG_LEVEL = "file.logging.max.level"; //$NON-NLS-1$
-
-	private static final String P_FILE_PATH = "file.logging.path"; //$NON-NLS-1$
-
-	private static final String P_FILE_CLEAR = "file.logging.startup.clear"; //$NON-NLS-1$
-
-	private static final String P_FILE_ROLLOVER_FREQUENCY = "file.logging.rollover.frequency"; //$NON-NLS-1$
-
-	private static final int DEBUG_LEVEL = 0;
-
-	private static final int INFO_LEVEL = 1;
-
-	private static final int WARN_LEVEL = 2;
-
-	private static final int ERROR_LEVEL = 3;
-
-	private static final int FATAL_LEVEL = 4;
-	
-	// What version of the platform are we on.
-	private static boolean TWO_DOT_ONE;
-
-	private static boolean THREE_DOT;
-
-	private static String _version;
-
-	// The shared instance.
-	private static JSFUICommonPlugin _plugin;
-
-	private Logger _log;
-
-	private ResourceBundle _resourceBundle;
-
-	private Properties _properties;
-
-	private URL _pluginBase;
-
-	private static Alerts _alerts;
-
-	/**
-	 * The constructor.
-	 */
-	public JSFUICommonPlugin() {
-		super();
-		_plugin = this;
-		versionCheck();
-	}
-
-	private void versionCheck() {
-		String version = (String) ResourcesPlugin.getPlugin().getBundle()
-				.getHeaders().get(org.osgi.framework.Constants.BUNDLE_VERSION);
-		Version identifier = new Version(version);
-
-		TWO_DOT_ONE = ((identifier.getMajor() == 2) && (identifier
-				.getMinor() == 1));
-		THREE_DOT = (identifier.getMajor() == 3);
-		_version = identifier.toString();
-	}
-
-	/**
-	 * This method is called upon plug-in activation
-	 */
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-
-		// This plugin is for 3.0 only, do a version check.
-		if (isThreeDot() == false) {
-			throw new CoreException(new Status(IStatus.ERROR, getBundle()
-					.getSymbolicName(), IStatus.OK,
-					"Requires eclipse version 3.x", null)); //$NON-NLS-1$
-		}
-
-		try {
-			// get resource bundle.
-			_resourceBundle = ResourceBundle
-					.getBundle("org.eclipse.jst.jsf.common.ui.CommonResources"); //$NON-NLS-1$
-			_alerts = new Alerts(this, _resourceBundle);
-
-			// get properties.
-			_properties = new Properties();
-			InputStream input = null;
-			_pluginBase = getBundle().getEntry("/"); //$NON-NLS-1$
-			try {
-				input = (new URL(_pluginBase, PROPERTIES)).openStream();
-				_properties.load(input);
-			} finally {
-				try {
-					input.close();
-				} catch (IOException ee)// NOPMD
-				{
-					// nothing to do when IOException throwed in closing files.
-				}
-			}
-
-			// set up logging for this plugin and everthing under it.
-			_log = new Logger(this.getBundle(), _resourceBundle);
-
-			// NOTE: add in any other plugin code statup HERE!!!!
-
-			// log.CommonPlugin=Web Application Development Common Plugin
-			// initialized on eclipse version {0}.
-
-			// log.info("log.CommonPlugin", version);
-
-		} catch (Exception ee) {
-			// only log if the logger was configured correctly.
-			if (_log != null) {
-				_log
-						.error(
-								"log.msg", //$NON-NLS-1$
-								"Problems starting plug-in Web Application Development Common.", //$NON-NLS-1$
-								ee);
-			}
-
-			throw new CoreException(
-					new Status(
-							IStatus.ERROR,
-							getBundle().getSymbolicName(),
-							IStatus.OK,
-							"Problems starting plug-in Web Application Development Common", //$NON-NLS-1$
-							ee));
-		}
-	}
-
-	/**
-	 * Returns the shared instance.
-	 * @return the plugin instance
-	 */
-	public static JSFUICommonPlugin getDefault() {
-		return _plugin;
-	}
-
-	/**
-	 * get the alerts objects associated with this plugin for alerting the user.
-	 * 
-	 * @return the alerts object
-	 */
-	public static Alerts getAlerts() {
-		return _alerts;
-	}
-
-	/**
-	 * Returns a logger for the new class using this plugin for reference.
-	 * @param theClass 
-	 * @return the logger
-	 */
-    // TODO: theClass is never used!!
-	public static Logger getLogger(Class theClass) {
-		return getDefault().getRootLogger();
-	}
-
-	/**
-	 * Returns the plugin's root logger
-	 * @return the root logger
-	 */
-	public Logger getRootLogger() {
-		return _log;
-	}
-
-	/**
-	 * Returns this plugin's unique identifier
-	 * 
-	 * @return this plugin's unique identifier
-	 * 
-	 */
-	public static String getPluginId() {
-		return getDefault().getBundle().getSymbolicName();
-	}
-
-	/**
-	 * Returns the plugin's resource bundle,
-	 * @return the resource bundle
-	 */
-	public ResourceBundle getResourceBundle() {
-		return _resourceBundle;
-	}
-
-	/**
-	 * Returns the string from the plugin's resource bundle, or 'key' if not
-	 * found.
-	 * @param key 
-	 * @return the resource string
-	 */
-	public static String getResourceString(String key) {
-		ResourceBundle bundle = JSFUICommonPlugin.getDefault().getResourceBundle();
-		try {
-			return (bundle != null) ? bundle.getString(key) : key;
-		} catch (MissingResourceException e) {
-			return key;
-		}
-	}
-
-	/**
-	 * Returns the plugin's descriptor's resource bundle,
-	 * @return the bundle
-	 */
-	public ResourceBundle getPluginDecriptorBundle() {
-		return Platform.getResourceBundle(getDefault().getBundle());
-	}
-
-	/**
-	 * Returns the plugin's default properties. These are normally used for
-	 * default preferences.
-	 * @return the properties
-	 */
-	public Properties getProperties() {
-		return _properties;
-	}
-
-	/**
-	 * Returns a shared image for the given name
-	 * <p>
-	 * Note: Images returned from this method will be automitically disposed of
-	 * when this plug-in shuts down. Callers must not dispose of these images
-	 * themselves.
-	 * </p>
-	 * 
-	 * @param name
-	 *            the image name found in /icons (with extension)
-	 * @return the image, null on error or not found.
-	 */
-	public Image getImage(String name) {
-		if (name == null) {
-			return null;
-		}
-
-		ImageRegistry images = getImageRegistry();
-		Image image = images.get(name);
-		if (image == null) {
-			try {
-				ImageDescriptor id = ImageDescriptor.createFromURL(new URL(
-						_pluginBase, "icons/" + name)); //$NON-NLS-1$
-				images.put(name, id);
-
-				image = images.get(name);
-			} catch (MalformedURLException ee) {
-				// log.CommonPlugin.image.error=Image {0} not found.
-				_log.error("log.msg", "log.CommonPlugin.image.error", name, ee); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-		}
-		return image;
-	}
-
-	/**
-	 * Returns a shared ImageDescriptor for the given name
-	 * <p>
-	 * Note: ImageDescriptor returned from this method will be automitically
-	 * disposed of when this plug-in shuts down. Callers must not dispose of
-	 * these ImageDescriptor themselves.
-	 * </p>
-	 * 
-	 * @param name
-	 *            the ImageDescriptor name found in /icons (with extension)
-	 * @return the ImageDescriptor, null on error or not found.
-	 */
-	public ImageDescriptor getImageDescriptor(String name) {
-		if (name == null) {
-			return null;
-		}
-
-		ImageRegistry images = getImageRegistry();
-		ImageDescriptor id = images.getDescriptor(name);
-		if (id == null) {
-			try {
-				id = ImageDescriptor.createFromURL(new URL(_pluginBase,
-						"icons/" + name)); //$NON-NLS-1$
-				images.put(name, id);
-			} catch (MalformedURLException ee) {
-				// log.CommonPlugin.image.error=Image {0} not found.
-				_log.error("log.msg", "log.CommonPlugin.image.error", name, ee); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-		}
-		return id;
-	}
-
-	/**
-	 * Is this eclipse version 2.1
-	 * 
-	 * @return true if version is 2.1
-	 */
-	public static boolean isTwoDotOne() {
-		return TWO_DOT_ONE;
-	}
-
-	/**
-	 * Is this eclipse version 3.x
-	 * 
-	 * @return true if version is 3.x
-	 */
-	public static boolean isThreeDot() {
-		return THREE_DOT;
-	}
-
-	/**
-	 * get the eclipse version
-	 * 
-	 * @return version string.
-	 */
-	public static String getVersion() {
-		return _version;
-	}
-
-
-
-	/**
-	 * Initializes the preference controls to the default values. These values
-	 * are used the first time the preference page is displayed or when the user
-	 * presses the Defaults button in the preferences page.
-	 */
-	protected void initializeDefaultPreferences(IPreferenceStore store) {
-		// NOTE: no logging can happen here since we haven't initialized logging
-		// yet because it
-		// depends on preferences!!!!
-
-		store.setDefault(P_CONSOLE_LOGGING, _properties.getProperty(
-				P_CONSOLE_LOGGING, Boolean.TRUE.toString()));
-		store.setDefault(P_CONSOLE_LOG_LEVEL, strToIntLogLevel(_properties
-				.getProperty(P_CONSOLE_LOG_LEVEL, "ERROR"))); //$NON-NLS-1$
-
-		store.setDefault(P_ECLIPSE_LOGGING, _properties.getProperty(
-				P_ECLIPSE_LOGGING, Boolean.TRUE.toString()));
-		store.setDefault(P_ECLIPSE_LOG_LEVEL, strToIntLogLevel(_properties
-				.getProperty(P_ECLIPSE_LOG_LEVEL, "ERROR"))); //$NON-NLS-1$
-
-		store.setDefault(P_FILE_LOGGING, _properties.getProperty(
-				P_FILE_LOGGING, Boolean.FALSE.toString()));
-		store.setDefault(P_FILE_LOG_LEVEL, strToIntLogLevel(_properties
-				.getProperty(P_FILE_LOG_LEVEL, "ERROR"))); //$NON-NLS-1$
-		store.setDefault(P_FILE_PATH, _properties.getProperty(P_FILE_PATH, "")); //$NON-NLS-1$
-		store.setDefault(P_FILE_CLEAR, _properties.getProperty(P_FILE_CLEAR,
-				Boolean.TRUE.toString()));
-		store.setDefault(P_FILE_ROLLOVER_FREQUENCY, _properties.getProperty(
-				P_FILE_ROLLOVER_FREQUENCY, "DAILY")); //$NON-NLS-1$
-	}
-
-	/**
-	 * Converts the log level from string to int. The level defaults to
-	 * ERROR_LEVEL.
-	 * 
-	 * @param str
-	 *            String representation of log level
-	 * @return integer representation of log level
-	 */
-	private int strToIntLogLevel(String str) {
-		if (str == null) {
-			return ERROR_LEVEL;
-		}
-		if (str.equalsIgnoreCase("DEBUG")) { //$NON-NLS-1$
-			return DEBUG_LEVEL;
-		}
-		if (str.equalsIgnoreCase("INFO")) { //$NON-NLS-1$
-			return INFO_LEVEL;
-		}
-		if (str.equalsIgnoreCase("WARN")) { //$NON-NLS-1$
-			return WARN_LEVEL;
-		}
-		if (str.equalsIgnoreCase("FATAL")) { //$NON-NLS-1$
-			return FATAL_LEVEL;
-		}
-		return ERROR_LEVEL;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/actions/IOpenPage.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/actions/IOpenPage.java
deleted file mode 100644
index 8456083..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/actions/IOpenPage.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.actions;
-
-/**
- * Editors should implement this if they can handle reseting to a page based on
- * the class defined for that page.
- * 
- * @author collinsc,jchoi
- */
-public interface IOpenPage {
-	/**
-	 * Sets the currently active page from the id of the page.
-	 * 
-	 * @param pageID
-	 */
-	public void setActiveEditorPage(String pageID);
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/actions/LoadCheatSheetAction.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/actions/LoadCheatSheetAction.java
deleted file mode 100644
index de7406f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/actions/LoadCheatSheetAction.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.actions;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExecutableExtension;
-import org.eclipse.jface.action.Action;
-import org.eclipse.ui.cheatsheets.OpenCheatSheetAction;
-
-/**
- * This class is used to open the cheat sheet based on the configuration
- * parameter.
- * 
- * @author mengbo
- */
-public class LoadCheatSheetAction extends Action implements
-		IExecutableExtension {
-	private String _cheatSheetName = null;
-
-	/**
-	 * 
-	 */
-	public LoadCheatSheetAction() {
-		super();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.action.IAction#run()
-	 */
-	public void run() {
-		if (_cheatSheetName != null) {
-			OpenCheatSheetAction action = new OpenCheatSheetAction(
-					_cheatSheetName);
-			action.run();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.runtime.IExecutableExtension#setInitializationData(org.eclipse.core.runtime.IConfigurationElement,
-	 *      java.lang.String, java.lang.Object)
-	 */
-	public void setInitializationData(IConfigurationElement config,
-			String propertyName, Object data) throws CoreException {
-		_cheatSheetName = config.getAttribute("actionparameters"); //$NON-NLS-1$
-	}
-
-	/**
-	 * set the cheatSheetName name to open.
-	 * 
-	 * @param cheatSheetName
-	 */
-	public void setCheatSheetName(String cheatSheetName) {
-		_cheatSheetName = cheatSheetName;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/actions/LoadHelpAction.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/actions/LoadHelpAction.java
deleted file mode 100644
index 18b927d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/actions/LoadHelpAction.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.actions;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExecutableExtension;
-import org.eclipse.help.HelpSystem;
-import org.eclipse.help.IContext;
-import org.eclipse.help.IHelpResource;
-import org.eclipse.jface.action.Action;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * This class is used to open the help page for a configuration param.
- * 
- * @author mengbo
- */
-public class LoadHelpAction extends Action implements IExecutableExtension {
-	private String _helpContextId = null;
-
-	/**
-	 * 
-	 */
-	public LoadHelpAction() {
-		super();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.action.IAction#run()
-	 */
-	public void run() {
-		IContext context = HelpSystem.getContext(_helpContextId);
-		if (context != null) {
-			IHelpResource[] topics = context.getRelatedTopics();
-			if (topics != null && topics.length == 1) {
-				PlatformUI.getWorkbench().getHelpSystem().displayHelpResource(
-						topics[0].getHref());
-			} else {
-				PlatformUI.getWorkbench().getHelpSystem().displayHelp(
-						_helpContextId);
-			}
-		}
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.runtime.IExecutableExtension#setInitializationData(org.eclipse.core.runtime.IConfigurationElement,
-	 *      java.lang.String, java.lang.Object)
-	 */
-	public void setInitializationData(IConfigurationElement config,
-			String propertyName, Object data) throws CoreException {
-		_helpContextId = config.getAttribute("actionparameters"); //$NON-NLS-1$
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/actions/OpenPageAction.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/actions/OpenPageAction.java
deleted file mode 100644
index 252e44c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/actions/OpenPageAction.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.actions;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExecutableExtension;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.forms.editor.FormEditor;
-
-/**
- * This class is used to open a page in the editor based on the configuration
- * parameter.
- * 
- * @author collinsc,jchoi
- */
-public class OpenPageAction extends Action implements IExecutableExtension {
-	private String pageID = null;
-
-	private ISelection selection;
-
-	/**
-	 * 
-	 */
-	public OpenPageAction() {
-		super();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.action.IAction#run()
-	 */
-	public void run() {
-		if (pageID != null) {
-			// get the active editor
-			IEditorPart editor = getActiveEditor();
-			IOpenPage openPage = (IOpenPage)editor.getAdapter(IOpenPage.class);
-			if(openPage != null){
-				openPage.setActiveEditorPage(pageID);
-				if (selection != null && editor instanceof FormEditor) {
-					IEditorPart activePage = ((FormEditor) editor)
-							.getActiveEditor();
-					if (activePage instanceof ISelectionProvider) {
-						((ISelectionProvider) activePage)
-								.setSelection(selection);
-					}
-				}
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.runtime.IExecutableExtension#setInitializationData(org.eclipse.core.runtime.IConfigurationElement,
-	 *      java.lang.String, java.lang.Object)
-	 */
-	public void setInitializationData(IConfigurationElement config,
-			String propertyName, Object data) throws CoreException {
-		pageID = config.getAttribute("actionparameters"); //$NON-NLS-1$
-	}
-
-	/**
-	 * set the class name to open.
-	 * @param className 
-	 */
-	public void setPageName(String className) {
-		this.pageID = className;
-	}
-
-	/**
-	 * get the current active editor
-	 * 
-	 * @return the active editor part
-	 */
-	public static IEditorPart getActiveEditor() {
-		IEditorPart editor = null;
-		IWorkbenchWindow win = PlatformUI.getWorkbench()
-				.getActiveWorkbenchWindow();
-		if (win != null) {
-			IWorkbenchPage page = win.getActivePage();
-			if (page != null) {
-				editor = page.getActiveEditor();
-			}
-		}
-		return editor;
-	}
-
-	/**
-	 * @return stored selection
-	 */
-	public ISelection getSelection() {
-		return selection;
-	}
-
-	/**
-	 * @param selection
-	 */
-	public void setSelection(ISelection selection) {
-		this.selection = selection;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/AbstractClassButtonDialogField.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/AbstractClassButtonDialogField.java
deleted file mode 100644
index 165846a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/AbstractClassButtonDialogField.java
+++ /dev/null
@@ -1,238 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.dialogfield;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.ResourceBundle;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.search.IJavaSearchScope;
-import org.eclipse.jdt.ui.IJavaElementSearchConstants;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.wizard.WizardDialog;
-import org.eclipse.jst.jsf.common.ui.JSFUICommonPlugin;
-import org.eclipse.jst.jsf.common.ui.internal.guiutils.Alerts;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.dialogs.SelectionDialog;
-import org.eclipse.ui.forms.events.HyperlinkAdapter;
-import org.eclipse.ui.forms.events.HyperlinkEvent;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-/*package*/ abstract class AbstractClassButtonDialogField extends
-		StringButtonDialogField {
-	private IProject _project;
-
-	private String _superClass;
-
-	private List _interfacesList;
-
-	private IType _type;
-
-	private int _typeFlag = IJavaElementSearchConstants.CONSIDER_ALL_TYPES;
-
-	private boolean _autoOpenResource = true;
-
-	/**
-	 * @param autoOpenResource
-	 */
-	public void setAutoOpenResource(boolean autoOpenResource) {
-		_autoOpenResource = autoOpenResource;
-	}
-
-	/**
-	 * @param project
-	 */
-	public AbstractClassButtonDialogField(IProject project) {
-		super(null);
-		this._project = project;
-
-		setHyperLink(new HyperlinkAdapter() {
-			public void linkActivated(HyperlinkEvent e) {
-				activeLink();
-			}
-		});
-
-		setStringButtonAdapter(new IStringButtonAdapter() {
-			public void changeControlPressed(DialogField field) {
-				browseButtonPressed();
-			}
-		});
-	}
-
-	private void activeLink() {
-		String className = getText();
-		className = trimNonAlphaChars(className);
-		if (className.length() > 0
-				&& JavaUIHelper.doesClassExist(_project, className)) {
-			JavaUIHelper.doOpenClass(_project, className);
-		} else {
-			try {
-				if (_project == null || !_project.hasNature(JavaCore.NATURE_ID)) {
-					ResourceBundle rb = ResourceBundle
-							.getBundle("org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogFieldResources"); //$NON-NLS-1$
-					Alerts alerts = new Alerts(JSFUICommonPlugin.getDefault(), rb);
-					alerts.error("ClassButtonDialogField.Alert.Title", //$NON-NLS-1$
-							"ClassButtonDialogField.Alert.Msg"); //$NON-NLS-1$
-					return;
-				}
-			} catch (CoreException e) {
-				e.printStackTrace();
-				return;
-			}
-			JavaClassWizard wizard = new JavaClassWizard(_project, className,
-					_superClass, getImplementInterfaces());
-			wizard.setAutoOpenResource(_autoOpenResource);
-			WizardDialog dialog = new WizardDialog(getShell(), wizard);
-			dialog.create();
-
-			setDialogSize(dialog, 400, 500);
-			if (dialog.open() == WizardDialog.OK) {
-				String newValue = wizard.getClassNameWithArgs();
-				if (!newValue.equals(className)) {
-					setText(newValue);
-				}
-			}
-		}
-	}
-
-	/**
-	 * @return the interfaces 
-	 * TODO: the contract seems inconsistent
-	 * as whether to return null or empty list when none
-	 */
-	protected abstract List getImplementInterfaces();
-
-	/**
-	 * @return the java search scope to be used.  Must not be null
-	 */
-	protected abstract IJavaSearchScope getJavaSearchScope();
-
-	private void browseButtonPressed() {
-		Shell shell = getShell();
-		SelectionDialog dialog = JavaUIHelper.openSelectionDialog(shell,
-				getJavaSearchScope(), _typeFlag);
-		dialog.setTitle(JSFUICommonPlugin
-				.getResourceString("DialogField.ClassButton.SelectType"));//$NON-NLS-1$
-
-		if (dialog.open() == SelectionDialog.OK) {
-			String oldClassName = getText();
-			if (dialog.getResult() != null) {
-				_type = (IType) dialog.getResult()[0];
-				String newClassName = _type.getFullyQualifiedName();
-				if (!oldClassName.equals(newClassName)) {
-					setText(newClassName);
-				}
-			}
-		}
-	}
-
-	private void setDialogSize(Dialog dialog, int width, int height) {
-		Point computedSize = dialog.getShell().computeSize(SWT.DEFAULT,
-				SWT.DEFAULT);
-		width = Math.max(computedSize.x, width);
-		height = Math.max(computedSize.y, height);
-		dialog.getShell().setSize(width, height);
-	}
-
-	private String trimNonAlphaChars(String className) {
-		className = className.trim();
-		while (className.length() > 0
-				&& !Character.isLetter(className.charAt(0))) {
-			className = className.substring(1, className.length());
-		}
-		int loc = className.indexOf(":"); //$NON-NLS-1$
-		if (loc != -1 && loc > 0) {
-			className = className.substring(0, loc);
-		} else if (loc == 0) {
-			className = ""; //$NON-NLS-1$
-		}
-		return className;
-	}
-
-	/**
-	 * @return Returns the project.
-	 */
-	public IProject getProject() {
-		return _project;
-	}
-
-	/**
-	 * @param project
-	 *            The project to set.
-	 */
-	public void setProject(IProject project) {
-		this._project = project;
-	}
-
-	/**
-	 * @return Returns the superClassName.
-	 */
-	public String getSuperClassName() {
-		return _superClass;
-	}
-
-	/**
-	 * @param superClassName
-	 *            The superClassName to set.
-	 */
-	public void setSuperClassName(String superClassName) {
-		this._superClass = superClassName;
-	}
-
-	/**
-	 * @return Returns the interfacesList.
-	 */
-	protected List getInterfacesList() {
-		return _interfacesList;
-	}
-
-	/**
-	 * Sets (replaces) the interface list
-	 * TODO: this list can have at most one element
-	 * @param interfaceName
-	 */
-	public void setInterface(String interfaceName) {
-		_interfacesList = new ArrayList();
-		_interfacesList.add(interfaceName);
-	}
-
-	/**
-	 * @return Returns the _type.
-	 */
-	public IType getType() {
-		return _type;
-	}
-
-	/**
-	 * @return Returns the typeFalg.
-	 */
-	public int getTypeFlag() {
-		return _typeFlag;
-	}
-
-	/**
-	 * @param typeFalg
-	 *            The typeFalg to set.
-	 */
-	public void setTypeFlag(int typeFalg) {
-		this._typeFlag = typeFalg;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/ClassButtonDialogField.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/ClassButtonDialogField.java
deleted file mode 100644
index baed42b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/ClassButtonDialogField.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.dialogfield;
-
-import java.util.List;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.search.IJavaSearchScope;
-import org.eclipse.jdt.core.search.SearchEngine;
-
-/**
- * @author mengbo
- */
-public class ClassButtonDialogField extends AbstractClassButtonDialogField {
-	/**
-	 * @param project
-	 */
-	public ClassButtonDialogField(IProject project) {
-		super(project);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.AbstractClassButtonDialogField#getImplementInterfaces()
-	 */
-	protected List getImplementInterfaces() {
-		return getInterfacesList();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.AbstractClassButtonDialogField#getJavaSearchScope()
-	 */
-	protected IJavaSearchScope getJavaSearchScope() {
-		IJavaSearchScope scope;
-		String superType = getSuperClassName();
-		List interfaceList = getInterfacesList();
-		if (superType == null && interfaceList != null
-				&& interfaceList.size() > 0) {
-			superType = interfaceList.get(0).toString();
-		}
-		if (getSuperClassName() != null && interfaceList != null
-				&& interfaceList.size() > 0) {
-			superType = null;
-		}
-		if (superType == null) {
-			scope = SearchEngine
-					.createJavaSearchScope(new IJavaProject[] { JavaCore
-							.create(getProject()) });
-		} else {
-			scope = JavaUIHelper.findSearchScope(getProject(), superType);
-		}
-		return scope;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/ColorButtonDialogField.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/ColorButtonDialogField.java
deleted file mode 100644
index 8228414..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/ColorButtonDialogField.java
+++ /dev/null
@@ -1,339 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.dialogfield;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.jst.jsf.common.ui.internal.utils.StyleCombo;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
-import org.eclipse.swt.events.FocusAdapter;
-import org.eclipse.swt.events.FocusEvent;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.ImageData;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.RGB;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.ColorDialog;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * This class provides a common color choice DialogFiled.
- * 
- * @author mengbo
- */
-public class ColorButtonDialogField extends StyleComboDialogField {
-	// color selection button
-	private Button _button;
-
-	// the button enable flag
-	private boolean _buttonEnabled;
-
-	// the current color
-	private Color _color;
-
-	// the current color RGB
-	private RGB _colorValue;
-
-	// the combo control
-	private StyleCombo _combo;
-
-	// when no color is set or selected, using the empty image
-	private Image _emptyImage;
-
-	// size of color image
-	private Point _extent;
-
-	// the color image
-	private Image _image;
-    
-    private ColorPalette    _colorPalette;
-
-	/**
-	 * @param flags
-	 * @param colorPalette
-	 */
-	public ColorButtonDialogField(int flags, ColorPalette colorPalette) {
-		super(flags);
-		_buttonEnabled = true;
-        _colorPalette = colorPalette;
-	}
-
-	private void buttonPressed() {
-		ColorDialog colorDialog = new ColorDialog(_button.getShell());
-		colorDialog.setRGB(_colorValue);
-		RGB newColor = colorDialog.open();
-		if (newColor != null && !newColor.equals(_colorValue)) {
-			_colorValue = newColor;
-			setText(ColorPalette.getStringColor(newColor));
-			updateColorImage();
-		}
-	}
-
-	/**
-	 * Compute the size of the image to be displayed.
-	 * 
-	 * @param window -
-	 *            the window used to calculate
-	 * @return <code>Point</code>
-	 */
-	private Point computeImageSize(Control window) {
-		GC gc = new GC(window);
-		Font f = _button.getFont();
-		gc.setFont(f);
-		int height = gc.getFontMetrics().getHeight();
-
-		Point p = new Point(height * 3 - 6, height - 2);
-		gc.dispose();
-		return p;
-	}
-
-	private void disposeResources() {
-		if (_image != null) {
-			_image.dispose();
-			_image = null;
-		}
-		if (_emptyImage != null) {
-			_emptyImage.dispose();
-			_emptyImage = null;
-		}
-		if (_color != null) {
-			_color.dispose();
-			_color = null;
-		}
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField#doFillIntoGrid(org.eclipse.ui.forms.widgets.FormToolkit,
-	 *      org.eclipse.swt.widgets.Composite, int)
-	 */
-	public Control[] doFillIntoGrid(FormToolkit toolkit, Composite parent,
-			int nColumns) {
-		assertEnoughColumns(nColumns);
-
-		Control requiredLabel = getRequiredLabelControl(toolkit, parent);
-		requiredLabel.setLayoutData(gridDataForLabel(1));
-
-		Control label = getLabelControl(toolkit, parent);
-		label.setLayoutData(gridDataForLabel(1));
-
-		StyleCombo combo = getComboControl(toolkit, parent);
-		combo.setLayoutData(gridDataForCombo(nColumns - 3));
-
-		_button = getChangeControl(toolkit, parent);
-		_button.setLayoutData(gridDataForButton(1));
-
-		return new Control[] { requiredLabel, label, combo, _button };
-	}
-
-	/**
-	 * Sets the enable state of the button.
-	 * @param enable 
-	 */
-	public void enableButton(boolean enable) {
-		if (isOkToUse(_button)) {
-			_button.setEnabled(isEnabled() && enable);
-		}
-		_buttonEnabled = enable;
-	}
-
-	/**
-	 * Creates or returns the created buttom widget.
-	 * @param toolkit 
-	 * 
-	 * @param parent
-	 *            The parent composite or <code>null</code> if the widget has
-	 *            already been created.
-	 * @return  the button widget
-	 */
-	public Button getChangeControl(FormToolkit toolkit, Composite parent) {
-		if (_button == null) {
-			assertCompositeNotNull(parent);
-			if (toolkit != null) {
-				_button = toolkit.createButton(parent, "", SWT.PUSH); //$NON-NLS-1$
-			} else {
-				_button = new Button(parent, SWT.PUSH);
-			}
-			_button.setEnabled(isEnabled() && _buttonEnabled);
-
-			_button.addSelectionListener(new SelectionListener() {
-				public void widgetDefaultSelected(SelectionEvent e) {
-					buttonPressed();
-				}
-
-				public void widgetSelected(SelectionEvent e) {
-					buttonPressed();
-				}
-			});
-
-			_button.addDisposeListener(new DisposeListener() {
-				public void widgetDisposed(DisposeEvent event) {
-					disposeResources();
-				}
-			});
-
-			_extent = computeImageSize(parent);
-			_image = new Image(parent.getDisplay(), _extent.x, _extent.y);
-			_emptyImage = new Image(parent.getDisplay(), _extent.x, _extent.y);
-			initEmptyImage(_button);
-			updateColorImage();
-		}
-
-		return _button;
-	}
-
-	private String[] getColorList() {
-		Map map = _colorPalette.getExtendedColorMap();
-		List list = new ArrayList(map.keySet());
-		Collections.sort(list);
-		return (String[]) list.toArray(new String[list.size()]);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.StringDialogField#getTextControl(org.eclipse.ui.forms.widgets.FormToolkit,
-	 *      org.eclipse.swt.widgets.Composite)
-	 */
-	public StyleCombo getComboControl(FormToolkit toolkit, Composite parent) {
-
-		if (_combo == null) {
-			_combo = super.getComboControl(toolkit, parent);
-
-			_combo.addSelectionListener(new SelectionListener() {
-
-				public void widgetDefaultSelected(SelectionEvent e) {
-					updateImageAfterChanged();
-				}
-
-				public void widgetSelected(SelectionEvent e) {
-					updateImageAfterChanged();
-				}
-			});
-			_combo.addFocusListener(new FocusAdapter() {
-				public void focusLost(FocusEvent e) {
-					updateImageAfterChanged();
-				}
-			});
-			_combo.setItems(getColorList());
-		}
-		return _combo;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField#getNumberOfControls()
-	 */
-	public int getNumberOfControls() {
-		return 4;
-	}
-	private GridData gridDataForButton(int span) {
-		GridData gd = new GridData();
-		gd.horizontalAlignment = GridData.FILL;
-		gd.grabExcessHorizontalSpace = false;
-		gd.horizontalSpan = span;
-		gd.widthHint = LayoutUtil.getButtonWidthHint(_button);
-		gd.heightHint = _combo.computeSize(SWT.DEFAULT, SWT.DEFAULT).y;
-		return gd;
-	}
-
-	private void initEmptyImage(Control parent) {
-		Color transparentColor = parent.getForeground();
-		ImageData imageData = _emptyImage.getImageData();
-		imageData.transparentPixel = 0;
-		GC gc = new GC(_emptyImage);
-		gc.setBackground(transparentColor);
-		gc.fillRectangle(0, 0, _emptyImage.getBounds().width, _emptyImage
-				.getBounds().height);
-	}
-
-	/**
-	 * Set the current color value and update the control.
-	 * 
-	 * @param rgb
-	 *            The new color.
-	 */
-	public void setColorValue(RGB rgb) {
-		_colorValue = rgb;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.ComboDialogField#setTextWithoutUpdate(java.lang.String)
-	 */
-	public void setTextWithoutUpdate(String text) {
-		super.setTextWithoutUpdate(text);
-		updateImageAfterChanged();
-	}
-
-	/**
-	 * Update the image being displayed on the button using the current color
-	 * setting.
-	 */
-	protected void updateColorImage() {
-		if (_button.isDisposed()) {
-			return;
-		}
-
-		if (_colorValue == null) {
-			_button.setImage(_emptyImage);
-			return;
-		}
-
-		Display display = _button.getDisplay();
-		GC gc = new GC(_image);
-		gc.setForeground(display.getSystemColor(SWT.COLOR_BLACK));
-		gc.drawRectangle(0, 0, _extent.x - 1, _extent.y - 1);
-		if (_color != null) {
-			_color.dispose();
-		}
-		_color = new Color(display, _colorValue);
-		gc.setBackground(_color);
-		gc.fillRectangle(1, 1, _extent.x - 2, _extent.y - 2);
-		gc.dispose();
-		_button.setImage(_image);
-	}
-
-	/*
-	 * @see DialogField#updateEnableState
-	 */
-	protected void updateEnableState() {
-		super.updateEnableState();
-		if (isOkToUse(_button)) {
-			_button.setEnabled(isEnabled() && _buttonEnabled);
-		}
-	}
-
-	private void updateImageAfterChanged() {
-		String newColor = getText().trim();
-		setColorValue(_colorPalette.getExtendedColorRGB(newColor));
-		updateColorImage();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/ColorPalette.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/ColorPalette.java
deleted file mode 100644
index 454a4c0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/ColorPalette.java
+++ /dev/null
@@ -1,125 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.dialogfield;
-
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.RGB;
-
-/**
- * Defines a two sets: one of basic and one of extended colors.  Clients extending
- * this class must provide the two maps
- * 
- * @author cbateman
- *
- */
-public abstract class ColorPalette 
-{
-    /**
-     * @param cssText
-     * @return the basic color matching the cssText key or null if color doesn't exist
-     */
-    public final Color getBasicColor(String cssText) {
-        return (Color) getBasicColorMap().get(cssText.toLowerCase());
-    }
-
-    /**
-     * @param cssText
-     * @return the extended color matching the cssText key or null if color doesn't exist
-     */
-    public final Color getExtendedColor(String cssText) {
-        Set keys = getExtendedColorMap().keySet();
-        for (Iterator iterator = keys.iterator(); iterator.hasNext();) {
-            String key = (String) iterator.next();
-            if (key.equalsIgnoreCase(cssText)) {
-                return (Color) getExtendedColorMap().get(key);
-            }
-        }
-        return null;
-    }
-
-    /**
-     * @return the map of basic colors where the key is the color name (a string)
-     * and the value is an RGB object
-     */
-    public abstract Map getBasicColorMap();
-
-    /**
-     * @return the map of extended colors where the key is the color name (a string)
-     * and the value is an Color object
-     */
-    public abstract Map getExtendedColorMap();
-
-    /**
-     * @param textColor
-     * @return same as getExtendedColor but returns value as an RGB object
-     */
-    public final RGB getExtendedColorRGB(String textColor) {
-        if (textColor == null || textColor.length() == 0) {
-            return null;
-        }
-
-        Color color = getExtendedColor(textColor);
-        if (color != null) {
-            return color.getRGB();
-        }
-
-        if (textColor.charAt(0) == '#' && textColor.length() == 4) {
-            char[] rgbChars = textColor.toCharArray();
-            char[] fullChars = { rgbChars[0], rgbChars[1], rgbChars[1],
-                    rgbChars[2], rgbChars[2], rgbChars[3], rgbChars[3] };
-
-            textColor = String.valueOf(fullChars);
-        }
-
-        if (textColor.charAt(0) == '#' && textColor.length() == 7) {
-            try {
-                int intColor = Integer.decode(textColor).intValue();
-
-                if (intColor > 0xFFFFFF || intColor < 0) {
-                    return null;
-                }
-                int r = intColor >> 16;
-                int g = (intColor >> 8) & 0xFF;
-                int b = intColor & 0xFF;
-                return new RGB(r, g, b);
-
-            } catch (NumberFormatException e) {
-                return null;
-            }
-        }
-        return null;
-    }
-
-    /**
-     * @param rgb
-     * @return the hex string for equivalent of the rgb color
-     */
-    public static String getStringColor(RGB rgb) {
-        if (rgb == null) {
-            return ""; //$NON-NLS-1$
-        }
-
-        StringBuffer buffer = new StringBuffer("#"); //$NON-NLS-1$
-        int[] intRGBs = new int[] { rgb.red, rgb.green, rgb.blue };
-        for (int i = 0; i < 3; i++) {
-            if (intRGBs[i] < 16) {
-                buffer.append("0"); //$NON-NLS-1$
-            }
-            buffer.append(Integer.toHexString(intRGBs[i]).toUpperCase());
-        }
-        return buffer.toString();
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/ComboDialogField.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/ComboDialogField.java
deleted file mode 100644
index 582634e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/ComboDialogField.java
+++ /dev/null
@@ -1,320 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.dialogfield;
-
-import java.util.Map;
-import java.util.Map.Entry;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.CCombo;
-import org.eclipse.swt.events.FocusAdapter;
-import org.eclipse.swt.events.FocusEvent;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * Dialog field containing a label and a combo control.
- * 
- * If the combo control is editable, then when user type in the field, will only
- * fire dialogFieldChanged, without dialogFieldApplied just as text control. But
- * when user change selection using the drop down, will fire both
- * dialogFieldChanged and dialogFieldApplied
- * 
- * @author mengbo
- */
-public class ComboDialogField extends DialogFieldBase implements
-		ISupportTextValue {
-	final static private int WIDTH_HINT = 10;
-
-	private String _text;
-
-	private int _selectionIndex;
-
-	private String[] _items;
-
-	private CCombo _comboControl;
-
-	private ModifyListener _modifyListener;
-
-	private int _flags;
-
-	private boolean _pending = false;
-
-	private Map _entryMap;
-
-	/**
-	 * @param flags
-	 */
-	public ComboDialogField(int flags) {
-		super();
-		_text = ""; //$NON-NLS-1$
-		_items = new String[0];
-		_flags = flags;
-		_selectionIndex = -1;
-	}
-
-	// ------- layout helpers
-
-	/*
-	 * @see DialogField#doFillIntoGrid
-	 */
-	public Control[] doFillIntoGrid(FormToolkit toolkit, Composite parent,
-			int nColumns) {
-		assertEnoughColumns(nColumns);
-
-		Control requiredLabel = getRequiredLabelControl(toolkit, parent);
-		requiredLabel.setLayoutData(gridDataForLabel(1));
-
-		Control label = getLabelControl(toolkit, parent);
-		label.setLayoutData(gridDataForLabel(1));
-
-		CCombo combo = getComboControl(toolkit, parent);
-		combo.setLayoutData(gridDataForCombo(nColumns - 2));
-
-		return new Control[] { requiredLabel, label, combo };
-	}
-
-	/*
-	 * @see DialogField#getNumberOfControls
-	 */
-	public int getNumberOfControls() {
-		return 3;
-	}
-
-	private static GridData gridDataForCombo(int span) {
-		GridData gd = new GridData();
-		gd.horizontalAlignment = GridData.FILL;
-		gd.grabExcessHorizontalSpace = false;
-		gd.horizontalSpan = span;
-		gd.widthHint = WIDTH_HINT;
-		return gd;
-	}
-
-	// ------- focus methods
-
-	/*
-	 * @see DialogField#setFocus
-	 */
-	public boolean setFocus() {
-		if (isOkToUse(_comboControl)) {
-			_comboControl.setFocus();
-		}
-		return true;
-	}
-
-	// ------- ui creation
-
-	/**
-	 * Creates or returns the created combo control.
-	 * @param toolkit 
-	 * 
-	 * @param parent
-	 *            The parent composite or <code>null</code> when the widget
-	 *            has already been created.
-	 * @return the custom combo control
-	 */
-	public CCombo getComboControl(FormToolkit toolkit, Composite parent) {
-		if (_comboControl == null || _comboControl.isDisposed()) {
-			assertCompositeNotNull(parent);
-			_modifyListener = new ModifyListener() {
-				public void modifyText(ModifyEvent e) {
-					doModifyText(e);
-				}
-			};
-			SelectionListener selectionListener = new SelectionListener() {
-				public void widgetSelected(SelectionEvent e) {
-					doSelectionChanged(e);
-				}
-
-				public void widgetDefaultSelected(SelectionEvent e) {
-					handleDefaultSelection(e);
-				}
-			};
-
-			if (toolkit != null) {
-				_comboControl = new CCombo(parent, _flags);
-				toolkit.adapt(_comboControl);
-			} else {
-				_comboControl = new CCombo(parent, _flags | SWT.BORDER);
-				_comboControl.setBackground(Display.getCurrent()
-						.getSystemColor(SWT.COLOR_LIST_BACKGROUND));
-			}
-
-			// moved up due to 1GEUNW2
-			_comboControl.setItems(_items);
-			if (_selectionIndex != -1) {
-				_comboControl.select(_selectionIndex);
-			} else {
-				_comboControl.setText(_text);
-			}
-			_comboControl.setFont(parent.getFont());
-			_comboControl.addModifyListener(_modifyListener);
-			_comboControl.addSelectionListener(selectionListener);
-			_comboControl.addFocusListener(new FocusAdapter() {
-				public void focusLost(FocusEvent e) {
-					doFocusLost(e);
-				}
-			});
-			_comboControl.setEnabled(isEnabled());
-			_comboControl.setToolTipText(getToolTip());
-		}
-		return _comboControl;
-	}
-
-	private void handleDefaultSelection(SelectionEvent e) {
-		// commit value
-		if (_pending) {
-			_pending = false;
-			dialogFieldApplied();
-		}
-	}
-
-	private void doFocusLost(FocusEvent e) {
-		if (_pending) {
-			_pending = false;
-			dialogFieldApplied();
-		}
-	}
-
-	private void doModifyText(ModifyEvent e) {
-		if (isOkToUse(_comboControl)) {
-			_text = getEntryKey(_comboControl.getText());
-			_selectionIndex = _comboControl.getSelectionIndex();
-		}
-		_pending = true;
-		dialogFieldChanged();
-	}
-
-	private void doSelectionChanged(SelectionEvent e) {
-		if (isOkToUse(_comboControl)) {
-			_items = _comboControl.getItems();
-			_text = getEntryKey(_comboControl.getText());
-			_selectionIndex = _comboControl.getSelectionIndex();
-		}
-		_pending = false;
-		dialogFieldChangedAndApplied();
-	}
-
-	// ------ enable / disable management
-
-	/*
-	 * @see DialogField#updateEnableState
-	 */
-	protected void updateEnableState() {
-		super.updateEnableState();
-		if (isOkToUse(_comboControl)) {
-			_comboControl.setEnabled(isEnabled());
-		}
-	}
-
-	// ------ text access
-
-
-	/**
-	 * Sets the combo items. Triggers a dialog-changed event.
-	 * @param items 
-	 */
-	public void setItems(String[] items) {
-		_items = items;
-		if (isOkToUse(_comboControl)) {
-			_comboControl.setItems(items);
-		}
-		_pending = false;
-		// dialogFieldChangedAndApplied();
-	}
-
-	/**
-	 * Gets the text.
-	 */
-	public String getText() {
-		return _text;
-	}
-
-	/**
-	 * Sets the text. Triggers a dialog-changed event.
-	 */
-	public void setText(String text) {
-		setTextWithoutUpdate(text);
-		_pending = false;
-		dialogFieldChangedAndApplied();
-	}
-
-	/**
-	 * Selects an item.
-	 * @param index 
-	 */
-	public void selectItem(int index) {
-		if (isOkToUse(_comboControl)) {
-			_comboControl.select(index);
-		} else {
-			if (index >= 0 && index < _items.length) {
-				_text = getEntryKey(_items[index]);
-				_selectionIndex = index;
-			}
-		}
-		dialogFieldChangedAndApplied();
-	}
-
-	/**
-	 * Sets the text without triggering a dialog-changed event.
-	 */
-	public void setTextWithoutUpdate(String text) {
-		_pending = false;
-		if (text == null) {
-			text = "";//$NON-NLS-1$
-		}
-		_text = text;
-		if (isOkToUse(_comboControl)) {
-			_comboControl.removeModifyListener(_modifyListener);
-			_comboControl.setText(getEntryValue(text));
-			_comboControl.addModifyListener(_modifyListener);
-		}
-	}
-
-	private String getEntryValue(String key) {
-		if (_entryMap == null || !_entryMap.containsKey(key)) {
-			return key;
-		}
-		return _entryMap.get(key).toString();
-	}
-
-	private String getEntryKey(String value) {
-		if (_entryMap == null || !_entryMap.containsValue(value)) {
-			return value;
-		}
-
-		Entry[] entries = (Entry[]) _entryMap.entrySet().toArray(new Entry[0]);
-		for (int i = 0; i < entries.length; i++) {
-			if (entries[i].getValue() == value
-					|| (value != null && value.equals(entries[i].getValue()))) {
-				return entries[i].getKey().toString();
-			}
-		}
-		return value;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField#handleGrabHorizontal()
-	 */
-	public void handleGrabHorizontal() {
-		LayoutUtil.setGrabHorizontal(_comboControl, true);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/DialogField.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/DialogField.java
deleted file mode 100644
index 0ff86f7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/DialogField.java
+++ /dev/null
@@ -1,149 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.dialogfield;
-
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.forms.events.IHyperlinkListener;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public interface DialogField {
-	/**
-	 * this method must be called directly after constructor, in this case,
-	 * system will create a hyper link label, and when the hyper link is
-	 * clicked, the corresponding method on the listener will be called. A
-	 * RuntimeException will throw out if this method is called after the label
-	 * has been created.
-	 * 
-	 * @param listener
-	 *            can't be null
-	 */
-	public abstract void setHyperLink(IHyperlinkListener listener);
-
-	/**
-	 * Sets the label of the dialog field.
-	 * @param labeltext 
-	 */
-	public abstract void setLabelText(String labeltext);
-
-	// ------ change listener
-	/**
-	 * Listener that is notified on a field change
-	 * @param listener
-	 */
-	public abstract void setDialogFieldChangeListener(
-			IDialogFieldChangeListener listener);
-
-	/**
-	 * Listener  that is notified on a field apply
-	 * @param listener
-	 */
-	public abstract void setDialogFieldApplyListener(
-			IDialogFieldApplyListener listener);
-
-	// ------- focus management
-	/**
-	 * Tries to set the focus to the dialog field. Returns <code>true</code>
-	 * if the dialog field can take focus. To be re-implemented by dialog field
-	 * implementors.
-	 * @return true if dialog field can take focus
-	 */
-	public abstract boolean setFocus();
-
-	/**
-	 * Creates all controls of the dialog field and fills it to a composite. The
-	 * composite is assumed to have <code>MGridLayout</code> as layout. The
-	 * dialog field will adjust its controls' spans to the number of columns
-	 * given. To be reimplemented by dialog field implementors.
-	 * @param toolkit 
-	 * @param parent 
-	 * @param nColumns 
-	 * @return the controls
-	 */
-	public abstract Control[] doFillIntoGrid(FormToolkit toolkit,
-			Composite parent, int nColumns);
-
-	/**
-	 * Returns the number of columns of the dialog field. To be reimplemented by
-	 * dialog field implementors.
-	 * @return the number of columns
-	 */
-	public abstract int getNumberOfControls();
-
-	// ------- ui creation
-	/**
-	 * @param _formToolkit
-	 * @param parent
-	 * @return the label control
-	 */
-	public abstract Control getLabelControl(FormToolkit _formToolkit,
-			Composite parent);
-
-	// --------- enable / disable management
-	/**
-	 * @param enabled
-	 */
-	public abstract void setEnabled(boolean enabled);
-
-	/**
-	 * Gets the enable state of the dialog field.
-	 * @return true if enabled is set
-	 */
-	public abstract boolean isEnabled();
-
-	/**
-	 * Get attached data by key.
-	 * 
-	 * @param key
-	 * @return the attached data object for key
-	 */
-	public abstract Object getAttachedData(Object key);
-
-	/**
-	 * You can attach any data to the DialogField, and get it using the
-	 * <code>getAttachedData</code> method.
-	 * 
-	 * @param key
-	 * @param value
-	 */
-	public abstract void putAttachedData(Object key, Object value);
-
-	/**
-	 * this method give the DialogField a chance to set the correct column to
-	 * grab horizontal space. In the implementation of this method, should only
-	 * change the GridData of control, should not do anything else.
-	 * 
-	 * The caller is responsible to make sure the controls for the dialog field
-	 * has been created before calling this method.
-	 */
-	public abstract void handleGrabHorizontal();
-
-	/**
-	 * @return true if is required field
-	 */
-	public abstract boolean isRequired();
-
-	/**
-	 * @param toolTip
-	 */
-	public abstract void setToolTip(String toolTip);
-	
-	/**
-	 * @return the field's enclosing shell or null if none
-	 */
-	public Shell getShell();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/DialogFieldBase.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/DialogFieldBase.java
deleted file mode 100644
index 7d61f49..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/DialogFieldBase.java
+++ /dev/null
@@ -1,559 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.dialogfield;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.MouseTrackAdapter;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.FontMetrics;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.forms.events.IHyperlinkListener;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.forms.widgets.Hyperlink;
-
-/**
- * Base class of all Dialog fields. Dialog fields manage controls together with
- * the model, independed from the creation time of the widgets. - support for
- * automated layouting. - enable / disable, set focus a concept of the base
- * class. DialogField have a label.
- * 
- * DialogField may be used in two different context:
- * <ol>
- * <li> In side dialog. In this case, whenever there is anything change in the
- * dialog field, such as user type anything, the dialog should listen to the
- * dialogFieldChanged() events and do things like validation. When user press
- * the "OK" button, dialog should call getXXX to get the value from the dialog
- * field and apply them.
- * <li> In side form based editor or properties view. In this case, whenever
- * there is anything change in the dialog field, such as user type anything, the
- * editor/view should listen to the dialogFieldChanged() events and do things
- * like validation. When user press "Enter" or move the focus out of the control
- * (finish editing), the dialog field will fire out dialogFieldApplied() events,
- * and the editor/view should listen to this event and apply the value to the
- * underlying model.
- * </ol>
- * 
- * The basic idea of the DialogField framework is comming from
- * <code>org.eclipse.jface.preference.FieldEditor</code> and
- * <code>org.eclipse.jdt.internal.ui.wizards.dialogfields.DialogField</code>
- * 
- * @author mengbo
- */
-public class DialogFieldBase implements DialogField {
-	private Label _label;
-
-	private Label _requiredLabel;
-
-	private String _labelText;
-
-	private IDialogFieldChangeListener _dialogFieldChangeListener;
-
-	private IDialogFieldApplyListener _dialogFieldApplyListener;
-
-	private boolean _enabled;
-
-	private FontMetrics _fontMetrics;
-
-	private IHyperlinkListener _listener;
-
-	private Hyperlink _hyperlink;
-
-	private Map _attachedData;
-
-	private boolean _isRequired;
-
-	private String toolTip;
-
-	/**
-	 * default constructor
-	 */
-	public DialogFieldBase() {
-		_enabled = true;
-		_label = null;
-		_requiredLabel = null;
-		_hyperlink = null;
-		_labelText = ""; //$NON-NLS-1$
-	}
-
-	/**
-	 * this method must be called directly after constructor, in this case,
-	 * system will create a hyper link label, and when the hyper link is
-	 * clicked, the corresponding method on the listene will be called. A
-	 * RuntimeException will throw out if this method is called after the label
-	 * has been created.
-	 * 
-	 * @param listener
-	 *            can't be null
-	 */
-	public void setHyperLink(IHyperlinkListener listener) {
-		if (_label != null) {
-			throw new RuntimeException(
-					"The Label instance does not support the listener"); //$NON-NLS-1$
-		}
-        this._listener = listener;
-	}
-
-	/**
-	 * Sets the label of the dialog field.
-	 */
-	public void setLabelText(String labeltext) {
-		_labelText = labeltext == null ? "" : labeltext; //$NON-NLS-1$
-		// if (_isRequired)
-		// {
-		// _labelText = "* " + _labelText;
-		// }
-		// else
-		// {
-		// _labelText = " " + _labelText;
-		// }
-		if (_label != null && !_label.isDisposed()) {
-			_label.setText(_labelText);
-		} else if (_hyperlink != null && !_hyperlink.isDisposed()) {
-			_hyperlink.setText(_labelText);
-		}
-	}
-
-	/**
-	 * @return return the enclosing Shell or null if one cannot be determined
-	 */
-	public Shell getShell() {
-		if (_label != null && !_label.isDisposed()) {
-			return _label.getShell();
-		} else if (_hyperlink != null && !_hyperlink.isDisposed()) {
-			return _hyperlink.getShell();
-		}
-		return null;
-	}
-
-	// ------ change listener
-
-	/**
-	 * Defines the listener for this dialog field.
-	 */
-	public final void setDialogFieldChangeListener(
-			IDialogFieldChangeListener listener) {
-		_dialogFieldChangeListener = listener;
-	}
-
-	public final void setDialogFieldApplyListener(
-			IDialogFieldApplyListener listener) {
-		_dialogFieldApplyListener = listener;
-	}
-
-	/**
-	 * fire both dialogFieldChanged and dialogFieldApplied events.
-	 */
-	public void dialogFieldChangedAndApplied() {
-		if (_dialogFieldChangeListener != null) {
-			_dialogFieldChangeListener.dialogFieldChanged(this);
-		}
-		if (_dialogFieldApplyListener != null) {
-			_dialogFieldApplyListener.dialogFieldApplied(this);
-		}
-	}
-
-	/**
-	 * fire dialogFieldChanged event.
-	 * 
-	 */
-	public void dialogFieldChanged() {
-		if (_dialogFieldChangeListener != null) {
-			_dialogFieldChangeListener.dialogFieldChanged(this);
-		}
-	}
-
-	/**
-	 * fire dialogFieldApplied event.
-	 * 
-	 */
-	public void dialogFieldApplied() {
-		if (_dialogFieldApplyListener != null) {
-			_dialogFieldApplyListener.dialogFieldApplied(this);
-		}
-	}
-
-	// ------- focus management
-
-
-	public boolean setFocus() {
-		return false;
-	}
-
-	//
-	// /**
-	// * Posts <code>setFocus</code> to the display event queue.
-	// */
-	// public void postSetFocusOnDialogField(Display display)
-	// {
-	// if (display != null)
-	// {
-	// display.asyncExec(new Runnable()
-	// {
-	// public void run()
-	// {
-	// setFocus();
-	// }
-	// }
-	// );
-	// }
-	// }
-
-	// ------- layout helpers
-
-	public Control[] doFillIntoGrid(FormToolkit toolkit, Composite parent,
-			int nColumns) {
-		assertEnoughColumns(nColumns);
-
-		Control label = getLabelControl(toolkit, parent);
-		label.setLayoutData(gridDataForLabel(nColumns));
-
-		return new Control[] { label };
-	}
-
-	/**
-	 * Initializes the computation of horizontal and vertical dialog units based
-	 * on the size of current font.
-	 * <p>
-	 * This method must be called before any of the dialog unit based conversion
-	 * methods are called.
-	 * </p>
-	 * 
-	 * @param control
-	 *            a control from which to obtain the current font
-	 * @return the font metrics for control
-	 */
-	protected FontMetrics getDialogUnits(Control control) {
-		if (_fontMetrics == null) {
-			// Compute and store a font metric
-			GC gc = new GC(control);
-			gc.setFont(control.getFont());
-			_fontMetrics = gc.getFontMetrics();
-			gc.dispose();
-		}
-		return _fontMetrics;
-	}
-
-	/**
-	 * Returns the number of columns of the dialog field. To be reimplemented by
-	 * dialog field implementors.
-	 */
-	public int getNumberOfControls() {
-		return 1;
-	}
-
-	/**
-	 * @param span
-	 * @return a new GridData for the horizontal 'span' value
-	 */
-	protected static GridData gridDataForLabel(int span) {
-		GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
-		gd.horizontalSpan = span;
-		return gd;
-	}
-
-	// ------- ui creation
-
-	/**
-	 * Creates or returns the created label widget.
-	 * 
-	 * @param parent
-	 *            The parent composite or <code>null</code> if the widget has
-	 *            already been created.
-	 */
-	public Control getLabelControl(FormToolkit _formToolkit, Composite parent) {
-		Control control = null;
-		if ((_label == null || _label.isDisposed()) && (_hyperlink == null  || _hyperlink.isDisposed())) {
-			assertCompositeNotNull(parent);
-
-			String label = null;
-			if (_labelText != null && !"".equals(_labelText)) { //$NON-NLS-1$
-				//$NON-NLS-1$
-				label = _labelText;
-			} else {
-				label = "."; //$NON-NLS-1$
-			}
-
-			if (_listener == null) {
-				control = createLabel(_formToolkit, parent, label);
-			} else {
-				control = createHyperlink(_formToolkit, parent, label);
-			}
-			/**
-			 * if(isRequired) { FontData[] fontData =
-			 * parent.getFont().getFontData(); FontData[] newFontData = new
-			 * FontData[fontData.length]; for(int i=0; i<fontData.length; i++) {
-			 * newFontData[i] = new FontData(fontData[i].getName(),
-			 * fontData[i].getHeight(), fontData[i].getStyle() | SWT.BOLD); }
-			 * final Font font = new Font(control.getDisplay(),newFontData);
-			 * control.setFont(font); control.addDisposeListener(new
-			 * DisposeListener() {
-			 * 
-			 * public void widgetDisposed(DisposeEvent e) { font.dispose(); }
-			 * }); } else { control.setFont(parent.getFont()); }
-			 */
-			control.setFont(parent.getFont());
-			control.setEnabled(_enabled);
-		} else {
-			if (_label != null) {
-				control = _label;
-			} else {
-				control = _hyperlink;
-			}
-		}
-		return control;
-	}
-
-	/**
-	 * @param _formToolkit
-	 * @param parent
-	 * @return get the Label control for required
-	 */
-	public Control getRequiredLabelControl(FormToolkit _formToolkit,
-			Composite parent) {
-		if (_requiredLabel == null || _requiredLabel.isDisposed()) {
-			if (_formToolkit == null) {
-				_requiredLabel = new Label(parent, SWT.LEFT | SWT.WRAP);
-			} else {
-				_requiredLabel = _formToolkit.createLabel(parent, "", SWT.LEFT //$NON-NLS-1$
-						| SWT.WRAP);
-				_requiredLabel.setForeground(getLabelColor());
-			}
-			if (_isRequired) {
-				_requiredLabel.setText(DialogFieldResources.getInstance()
-						.getString("DialogFieldBase.Label.RequiredSymbol")); //$NON-NLS-1$
-			}
-		}
-		return _requiredLabel;
-	}
-
-	private Control createLabel(FormToolkit _formToolkit, Composite parent,
-			String labelString) {
-		if (_formToolkit == null) {
-			_label = new Label(parent, SWT.LEFT | SWT.WRAP);
-			_label.setText(labelString);
-		} else {
-			_label = _formToolkit.createLabel(parent, labelString, SWT.LEFT
-					| SWT.WRAP);
-			_label.setForeground(getLabelColor());
-		}
-		return _label;
-	}
-
-	/**
-	 * get color for label
-	 */
-	private Color getLabelColor() {
-		String osname = System.getProperty("os.name").toLowerCase(); //$NON-NLS-1$
-		if (osname.startsWith("mac os")) { //$NON-NLS-1$
-			return Display.getCurrent().getSystemColor(
-					SWT.COLOR_LIST_FOREGROUND);
-		}
-        return Display.getCurrent()
-                .getSystemColor(SWT.COLOR_LIST_SELECTION);
-	}
-
-	private Control createHyperlink(FormToolkit _formToolkit, Composite parent,
-			String label) {
-		if (_formToolkit == null) {
-			_hyperlink = new Hyperlink(parent, SWT.LEFT | SWT.WRAP);
-			_hyperlink.setForeground(getLabelColor());
-			_hyperlink.setUnderlined(true);
-			_hyperlink.addMouseTrackListener(new MouseTrackAdapter() {
-
-				public void mouseEnter(MouseEvent e) {
-					_hyperlink.setForeground(Display.getCurrent()
-							.getSystemColor(SWT.COLOR_BLUE));
-				}
-
-				public void mouseExit(MouseEvent e) {
-					_hyperlink.setForeground(getLabelColor());
-				}
-			});
-			_hyperlink.setText(label);
-		} else {
-			_hyperlink = _formToolkit.createHyperlink(parent, label, SWT.LEFT
-					| SWT.WRAP);
-		}
-		_hyperlink.addHyperlinkListener(_listener);
-		return _hyperlink;
-	}
-
-	/**
-	 * Creates a spacer control.
-	 * @param toolkit 
-	 * 
-	 * @param parent
-	 *            The parent composite
-	 * @return a spacer control
-	 */
-	public Control createEmptySpace(FormToolkit toolkit, Composite parent) {
-		return createEmptySpace(toolkit, parent, 1);
-	}
-
-	/**
-	 * Creates a spacer control with the given span. The composite is assumed to
-	 * have <code>MGridLayout</code> as layout.
-	 * @param toolkit 
-	 * 
-	 * @param parent
-	 *            The parent composite
-	 * @param span 
-	 * @return a label that creates empty space
-	 */
-	public Control createEmptySpace(FormToolkit toolkit, Composite parent,
-			int span) {
-		Label label;
-		if (toolkit != null) {
-			label = toolkit.createLabel(parent, ""); //$NON-NLS-1$
-		} else {
-			label = new Label(parent, SWT.LEFT);
-		}
-		GridData gd = new GridData();
-		gd.horizontalAlignment = GridData.BEGINNING;
-		gd.grabExcessHorizontalSpace = false;
-		gd.horizontalSpan = span;
-		gd.horizontalIndent = 0;
-		gd.widthHint = 0;
-		gd.heightHint = 0;
-		label.setLayoutData(gd);
-		return label;
-	}
-
-	/**
-	 * Tests is the control is not <code>null</code> and not disposed.
-	 * @param control 
-	 * @return true if the control is valid for use
-	 */
-	protected final boolean isOkToUse(Control control) {
-		return (control != null) && !(control.isDisposed());
-	}
-
-	// --------- enable / disable management
-
-	/**
-	 * Sets the enable state of the dialog field.
-	 */
-	public final void setEnabled(boolean enabled) {
-		if (enabled != _enabled) {
-			_enabled = enabled;
-			updateEnableState();
-		}
-	}
-
-	/**
-	 * Called when the enable state changed. To be extended by dialog field
-	 * implementors.
-	 */
-	protected void updateEnableState() {
-		if (_label != null && !_label.isDisposed()) {
-			_label.setEnabled(_enabled);
-		}
-		if (_hyperlink != null && !_hyperlink.isDisposed()) {
-			_hyperlink.setEnabled(_enabled);
-		}
-	}
-
-	/**
-	 * Gets the enable state of the dialog field.
-	 */
-	public final boolean isEnabled() {
-		return _enabled;
-	}
-
-	/**
-	 * @param comp
-	 */
-	protected final void assertCompositeNotNull(Composite comp) {
-		Assert.isNotNull(comp,
-				"uncreated control requested with composite null"); //$NON-NLS-1$
-	}
-
-	/**
-	 * @param nColumns
-	 */
-	protected final void assertEnoughColumns(int nColumns) {
-		Assert.isTrue(nColumns >= getNumberOfControls(),
-				"given number of columns is too small"); //$NON-NLS-1$
-	}
-
-	/**
-	 * Get attached data by key.
-	 * 
-	 * @param key
-	 * @return the attached data object for key
-	 */
-	public Object getAttachedData(Object key) {
-		if (_attachedData != null) {
-			return _attachedData.get(key);
-		}
-        return null;
-	}
-
-	/**
-	 * You can attach any data to the DialogField, and get it using the
-	 * <code>getAttachedData</code> method.
-	 * 
-	 * @param key
-	 * @param value
-	 */
-	public void putAttachedData(Object key, Object value) {
-		if (_attachedData == null) {
-			_attachedData = new HashMap();
-		}
-		_attachedData.put(key, value);
-	}
-
-	/**
-	 * this method give the DialogField a chance to set the correct column to
-	 * grab horizontal space. In the implementation of this method, should only
-	 * change the GridData of control, should not do anything else.
-	 * 
-	 * The caller is responsible to make sure the controls for the dialog field
-	 * has been created before calling this method.
-	 */
-	public void handleGrabHorizontal() {
-		// do nothing.
-	}
-
-	public boolean isRequired() {
-		return _isRequired;
-	}
-
-	/**
-	 * @param isRequired
-	 */
-	public void setRequired(boolean isRequired) {
-		this._isRequired = isRequired;
-	}
-
-	/**
-	 * @return gthe tool tip text
-	 */
-	protected String getToolTip() {
-		return toolTip;
-	}
-
-	public void setToolTip(String toolTip) {
-		this.toolTip = toolTip;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/DialogFieldGroup.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/DialogFieldGroup.java
deleted file mode 100644
index 0ed7b3a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/DialogFieldGroup.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.dialogfield;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * This class represents a group of dialog fields, following the normal dialog
- * field's lifecycle.
- * 
- * The design of this class is to make a section could be reused in both dialog
- * environment and form based editor environment.
- * 
- * @author mengbo
- */
-public abstract class DialogFieldGroup {
-	private IDialogFieldChangeListener _defaultChangeListener;
-
-	private IDialogFieldApplyListener _defaultApplyListener;
-
-	/**
-	 * set default handler, should be called before <code>initialize()</code>
-	 * @param changelistener 
-	 * 
-	 */
-	public void setDefaultChangeListener(
-			IDialogFieldChangeListener changelistener) {
-		_defaultChangeListener = changelistener;
-	}
-
-	/**
-	 * Normally, the client should call this method in <code>initialize()</code>
-	 * for those field that wants to use the default event handler.
-	 * 
-	 * @return could be null
-	 */
-	public IDialogFieldChangeListener getDefaultChangeListener() {
-		return _defaultChangeListener;
-	}
-
-	/**
-	 * set default handler, should be called before <code>initialize()</code>
-	 * 
-	 * @param applylistener
-	 */
-	public void setDefaultApplyListener(IDialogFieldApplyListener applylistener) {
-		_defaultApplyListener = applylistener;
-	}
-
-	/**
-	 * Normally, the client should call this method in <code>initialize()</code>
-	 * for those field that wants to use the default event handler.
-	 * 
-	 * @return could be null
-	 */
-	public IDialogFieldApplyListener getDefaultApplyListener() {
-		return _defaultApplyListener;
-	}
-
-	/**
-	 * it is supposed to create all dialog fields and setup event listeners in
-	 * this method.
-	 * 
-	 * Normally client will create DialogFieldSection first, then
-	 * setDefaultChangeListener()/setDefaultApplyListener(), then call
-	 * initialize().
-	 */
-	public abstract void initialize();
-
-	/**
-	 * reload data from underlying model and set them into the dialog fields.
-	 * 
-	 */
-	public abstract void refreshData();
-
-	/**
-	 * layout the dialog fields.
-	 * 
-	 * @param toolkit
-	 *            could be null
-	 * @param parent
-	 * 
-	 */
-	public abstract void layoutDialogFields(FormToolkit toolkit,
-			Composite parent);
-
-	/**
-	 * validate whether the values in the dialog fields are valid. This method
-	 * should also enable/disable dialog fields based on their current value and
-	 * relationship
-	 * 
-	 * @return could return null. or an array containing null elements.
-	 */
-	public abstract IStatus[] validateDialogFields();
-	
-	/**
-	 * Intended to allow subclasses to recreate controls.  Default implementation does nothing.
-	 */
-	public void reset(){
-		//do nothing by default	
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/DialogFieldGroupPage.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/DialogFieldGroupPage.java
deleted file mode 100644
index 2e10f45..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/DialogFieldGroupPage.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.dialogfield;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jface.wizard.WizardPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-
-/**
- * @author mengbo
- */
-public class DialogFieldGroupPage extends WizardPage {
-	private DialogFieldGroup _group;
-
-	private IDialogFieldChangeListener _defaultChangeListener = new IDialogFieldChangeListener() {
-		public void dialogFieldChanged(DialogField field) {
-			validate();
-		}
-	};
-
-	/**
-	 * @param pageName
-	 * @param section
-	 */
-	public DialogFieldGroupPage(String pageName, DialogFieldGroup section) {
-		super(pageName);
-		_group = section;
-		initializeGroup(_group);
-	}
-
-	/**
-	 * child class could override this method.
-	 * 
-	 * @param group
-	 */
-	protected void initializeGroup(DialogFieldGroup group) {
-		group.setDefaultChangeListener(_defaultChangeListener);
-		group.initialize();
-	}
-
-	public void createControl(Composite parent) {
-		Composite container = new Composite(parent, SWT.NONE);
-		_group.layoutDialogFields(null, container);
-		_group.refreshData();
-		validate();
-		this.setControl(container);
-	}
-
-	/**
-	 * @return the dialog field group
-	 */
-	public DialogFieldGroup getDialogFieldGroup() {
-		return _group;
-	}
-
-	/**
-	 * validate all the dialog fields.  Updates
-	 * status line and sets page completion if there are no errors
-	 */
-	private void validate() {
-		IStatus[] statuses = _group.validateDialogFields();
-		IStatus status = StatusUtil.getMostSevere(statuses);
-		StatusUtil.applyToStatusLine(this, status);
-		setPageComplete(status == null || status.getSeverity() != IStatus.ERROR);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/DialogFieldResources.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/DialogFieldResources.java
deleted file mode 100644
index 30828e6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/DialogFieldResources.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.dialogfield;
-
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-import org.eclipse.jst.jsf.common.ui.JSFUICommonPlugin;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.jsf.common.ui.internal.utils.ResourceUtils;
-
-/**
- * Resource bundle class for datastore wizard and it's pages
- * 
- * @author mengbo
- */
-/*package*/ class DialogFieldResources extends ResourceUtils {
-	/** Create the logger for this class */
-	private static Logger _log = JSFUICommonPlugin
-			.getLogger(DialogFieldResources.class);
-
-	private static DialogFieldResources _resource; // singleton
-
-	private static final String BUNDLE = DialogFieldResources.class.getName();
-
-	/**
-	 * Empty Constructor.
-	 * 
-	 * @return WizardsResources
-	 */
-
-	public static DialogFieldResources getInstance() {
-		if (_resource == null) {
-			_resource = new DialogFieldResources();
-		}
-		return _resource;
-	}
-
-	/**
-	 * The constructor create a resource bundle
-	 */
-	protected DialogFieldResources() {
-		try {
-			_resources = ResourceBundle.getBundle(BUNDLE);
-			// NOTE: this throws a runtime "MissingResourceException".
-		} catch (MissingResourceException ee) {
-			// Wizards.WizardResource.Error.ResourceNotFound = Unable to locate
-			// resource.
-			_log.error("Wizards.WizardResource.Error.ResourceNotFound", ee); //$NON-NLS-1$
-		}
-		setBundle(_resources, BUNDLE);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/DialogFieldResources.properties b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/DialogFieldResources.properties
deleted file mode 100644
index ad34404..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/DialogFieldResources.properties
+++ /dev/null
@@ -1,48 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-##################################################################
-# Resource message for SourceFolderButtonDialogField.
-##################################################################
-SourceFolderButtonDialogField.container.label = Source Folder:
-SourceFolderButtonDialogField.container.button = Browse...
-
-SourceFolderButtonDialogField.ChooseSourceContainerDialog.Title = Folder Selection
-SourceFolderButtonDialogField.ChooseSourceContainerDialog.Description = Choose a folder:
-
-SourceFolderButtonDialogField.error.EnterContainerName = Folder name is empty.
-SourceFolderButtonDialogField.error.NotSameProject = The project should be \''{0}\''.
-SourceFolderButtonDialogField.error.ContainerIsBinary=''{0}'' is a JAR archive.
-SourceFolderButtonDialogField.error.ContainerDoesNotExist=Folder ''{0}'' does not exist.
-SourceFolderButtonDialogField.error.NotAFolder=''{0}'' must be a project or folder.
-SourceFolderButtonDialogField.error.ProjectClosed=Project ''{0}'' must be accessible.
-SourceFolderButtonDialogField.warning.NotAJavaProject=Folder ''{0}'' is not a Java project.
-SourceFolderButtonDialogField.warning.NotInAJavaProject=Folder ''{0}'' is not in a Java project.
-SourceFolderButtonDialogField.warning.NotOnClassPath=Folder ''{0}'' is not on the Java build class path.
-
-
-##################################################################
-# Resource message for PackageButtonDialogField.
-##################################################################
-PackageButtonDialogField.package.label=Pac&kage:
-PackageButtonDialogField.package.button=Bro&wse...
-
-PackageButtonDialogField.error.InvalidPackageName=Package name  ''{0}'' is not valid.
-PackageButtonDialogField.error.ClashOutputLocation=Package clashes with project output folder.
-PackageButtonDialogField.warning.DiscouragedPackageName=This package name ''{0}'' is discouraged. 
-PackageButtonDialogField.warning.DefaultPackageDiscouraged=The use of the default package is discouraged.
-
-PackageButtonDialogField.ChoosePackageDialog.title=Package Selection
-PackageButtonDialogField.ChoosePackageDialog.description=&Choose a folder:
-PackageButtonDialogField.ChoosePackageDialog.empty=Cannot find packages to select.
-
-ClassButtonDialogField.Alert.Title=Error Open Type
-ClassButtonDialogField.Alert.Msg=The project does not have Java Nature.
-DialogFieldBase.Label.RequiredSymbol=*
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/IDialogFieldApplyListener.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/IDialogFieldApplyListener.java
deleted file mode 100644
index e8be7b8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/IDialogFieldApplyListener.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.dialogfield;
-
-
-/**
- * @author mengbo
- */
-public interface IDialogFieldApplyListener {
-	/**
-	 * when the DialogField believe it should apply its value in UI, will fire
-	 * this event.
-	 * 
-	 * Normally, for text input, when user is typing, will only fire
-	 * dialogFieldChanged(), when lose focus will fire dialogFieldApplied().
-	 * 
-	 * For other control, such as readonly combo box, whenever user change
-	 * selection, will fire both dialogFieldChanged() and dialogFieldApplied()
-	 * 
-	 * @param field
-	 */
-	void dialogFieldApplied(DialogField field);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/IDialogFieldChangeListener.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/IDialogFieldChangeListener.java
deleted file mode 100644
index b5ead67..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/IDialogFieldChangeListener.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.dialogfield;
-
-
-/**
- * Change listener used by <code>DialogField</code>
- * 
- * @author mengbo
- */
-public interface IDialogFieldChangeListener {
-
-	/**
-	 * The dialog field has changed.
-	 * @param field
-	 */
-	void dialogFieldChanged(DialogField field);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/IStringButtonAdapter.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/IStringButtonAdapter.java
deleted file mode 100644
index 466e355..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/IStringButtonAdapter.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.dialogfield;
-
-
-/**
- * Change listener used by <code>StringButtonDialogField</code>
- */
-public interface IStringButtonAdapter {
-
-	/**
-	 * @param field
-	 */
-	void changeControlPressed(DialogField field);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/ISupportTextValue.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/ISupportTextValue.java
deleted file mode 100644
index 014752d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/ISupportTextValue.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.dialogfield;
-
-/**
- * DialogField can choose to also implement this interface. The purpose of this
- * interface is to make DialogFields to be more easily used to edit element
- * attributes, since attributes are all of string type.
- * 
- * @author mengbo
- * @version 1.5
- */
-public interface ISupportTextValue {
-	/**
-	 * @param value
-	 */
-	public void setTextWithoutUpdate(String value);
-
-	/**
-	 * @return the text
-	 */
-	public String getText();
-
-	/**
-	 * @param value
-	 */
-	public void setText(String value);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/JavaClassWizard.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/JavaClassWizard.java
deleted file mode 100644
index 7458740..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/JavaClassWizard.java
+++ /dev/null
@@ -1,186 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.dialogfield;
-
-import java.lang.reflect.InvocationTargetException;
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.ui.JavaUI;
-import org.eclipse.jface.dialogs.IDialogSettings;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.jface.wizard.Wizard;
-import org.eclipse.jst.jsf.common.ui.JSFUICommonPlugin;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.actions.WorkspaceModifyOperation;
-import org.eclipse.ui.ide.IDE;
-import org.eclipse.ui.wizards.newresource.BasicNewResourceWizard;
-
-/**
- * @author mengbo
- */
-/*package*/ class JavaClassWizard extends Wizard {
-	private static String STORE_SECTION = "JavaClassWizard"; //$NON-NLS-1$
-
-	private JavaClassWizardPage _mainPage;
-
-	private String _className, _classArgs;
-
-	private IProject _project;
-
-	private String _superClass;
-
-	private List _interfaceList;
-
-	private boolean _autoOpenResource = true;
-
-	/**
-	 * @param autoOpenResource
-	 */
-	public void setAutoOpenResource(boolean autoOpenResource) {
-		_autoOpenResource = autoOpenResource;
-	}
-
-	/**
-	 * @param project
-	 * @param className
-	 */
-	public JavaClassWizard(IProject project, String className) {
-		this(project, className, null, null);
-	}
-
-	/**
-	 * @param project
-	 * @param className
-	 * @param superClass
-	 * @param superInterfaces
-	 */
-	public JavaClassWizard(IProject project, String className,
-			String superClass, List superInterfaces) {
-		this._project = project;
-		this._className = className;
-		this._superClass = superClass;
-		this._interfaceList = superInterfaces;
-		IDialogSettings masterSettings = JSFUICommonPlugin.getDefault()
-				.getDialogSettings();
-		setDialogSettings(getSettingsSection(masterSettings));
-		setWindowTitle(JSFUICommonPlugin
-				.getResourceString("DialogField.JavaClassWizard.NewClass"));//$NON-NLS-1$
-		setNeedsProgressMonitor(true);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.wizard.IWizard#addPages()
-	 */
-	public void addPages() {
-		_mainPage = new JavaClassWizardPage(_project, _className, _superClass,
-				_interfaceList);
-		addPage(_mainPage);
-		_mainPage.init();
-	}
-
-	private IDialogSettings getSettingsSection(IDialogSettings master) {
-		IDialogSettings setting = master.getSection(STORE_SECTION);
-		if (setting == null) {
-			setting = master.addNewSection(STORE_SECTION);
-		}
-		return setting;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.wizard.IWizard#performFinish()
-	 */
-	public boolean performFinish() {
-		if (_mainPage.getPackageText() != null
-				&& _mainPage.getPackageText().length() > 0) {
-			StringBuffer buffer = new StringBuffer(_mainPage.getPackageText());
-			buffer.append(".");//$NON-NLS-1$
-			buffer.append(_mainPage.getTypeName());
-			_className = buffer.toString();
-		} else {
-			_className = _mainPage.getTypeName();
-		}
-		_classArgs = _mainPage.getClassArgs();
-		IRunnableWithProgress op = new WorkspaceModifyOperation() {
-			protected void execute(IProgressMonitor monitor)
-					throws CoreException, InvocationTargetException,
-					InterruptedException {
-				_mainPage.createType(monitor);
-				IResource resource = _mainPage.getModifiedResource();
-				if (resource != null && _autoOpenResource) {
-					selectAndReveal(resource);
-					if (_project.hasNature(JavaCore.NATURE_ID)) {
-						IJavaProject jProject = JavaCore.create(_project);
-						IJavaElement jElement = jProject.findElement(resource
-								.getProjectRelativePath()
-								.removeFirstSegments(1));
-						if (jElement != null) {
-							JavaUI.openInEditor(jElement);
-						}
-					} else if (resource instanceof IFile) {
-						IWorkbenchPage page = PlatformUI.getWorkbench()
-								.getActiveWorkbenchWindow().getActivePage();
-						IDE.openEditor(page, (IFile) resource, true);
-					}
-				}
-			}
-
-		};
-		try {
-			getContainer().run(false, true, op);
-		} catch (InvocationTargetException e) {
-			e.printStackTrace(); // PDEPlugin.logException(e);
-		} catch (InterruptedException e) {
-			e.printStackTrace();// PDEPlugin.logException(e);
-		}
-		return true;
-	}
-
-	private void selectAndReveal(IResource newResource) {
-		BasicNewResourceWizard.selectAndReveal(newResource,
-				getWorkbenchWindow());
-	}
-
-	private IWorkbenchWindow getWorkbenchWindow() {
-		return PlatformUI.getWorkbench().getActiveWorkbenchWindow();
-	}
-
-	private String getClassName() {
-		return _className;
-	}
-
-	/**
-	 * @return the class name including args
-	 */
-	public String getClassNameWithArgs() {
-		if (_classArgs != null && _classArgs.length() > 0) {
-			StringBuffer buffer = new StringBuffer(_className);
-			buffer.append(":");//$NON-NLS-1$
-			buffer.append(_classArgs);
-			return buffer.toString();
-		}
-		return getClassName();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/JavaClassWizardPage.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/JavaClassWizardPage.java
deleted file mode 100644
index b445c60..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/JavaClassWizardPage.java
+++ /dev/null
@@ -1,249 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.dialogfield;
-
-import java.util.List;
-
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.IPackageFragmentRoot;
-import org.eclipse.jdt.core.JavaConventions;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jdt.ui.wizards.NewClassWizardPage;
-
-/**
- * @author mengbo
- */
-/*package*/ class JavaClassWizardPage extends NewClassWizardPage {
-	private String _className;
-
-	private final IProject _project;
-
-	private final InitialClassProperties _initialValues;
-
-	private IJavaProject _javaProject;
-
-	private IStatus _fClassNameStatus, _fPackageNameStatus;
-
-	private final static String  SOURCE_COMPLIANCE_1_3 = JavaCore.VERSION_1_3;
-	
-	static class InitialClassProperties {
-		// populate new wizard page
-		private String superClassName;
-
-		private List interfacesName;
-
-		private String className;
-
-		private String classArgs;
-
-		private String packageName;
-
-		private IPackageFragmentRoot packageFragmentRoot;
-
-		private IPackageFragment packageFragment;
-
-		InitialClassProperties() {
-			this.superClassName = ""; //$NON-NLS-1$
-			this.interfacesName = null;
-			this.className = null;
-			this.classArgs = null;
-			this.packageName = null;
-			this.packageFragment = null;
-			this.packageFragmentRoot = null;
-		}
-	}
-
-	/**
-	 * @param project
-	 * @param className
-	 * @param superClassName
-	 * @param interfacesName
-	 */
-	public JavaClassWizardPage(IProject project, String className,
-			String superClassName, List interfacesName) {
-		super();
-		this._className = className;
-		this._project = project;
-		try {
-			if (project != null && project.hasNature(JavaCore.NATURE_ID)) {
-				this._javaProject = JavaCore.create(project);
-			} else {
-				this._javaProject = null;
-			}
-		} catch (CoreException e) {
-			e.printStackTrace();// PDEPlugin.logException(e);
-		}
-		_initialValues = new InitialClassProperties();
-		_initialValues.className = className;
-		_initialValues.superClassName = superClassName;
-		_initialValues.interfacesName = interfacesName;
-	}
-
-	/**
-	 * @param project
-	 * @param className
-	 */
-	public JavaClassWizardPage(IProject project, String className) {
-		this(project, className, null, null);
-	}
-
-	/**
-	 * Call when page is added to wizard to initialize
-	 */
-	public void init() {
-		initializeExpectedValues();
-		initializeWizardPage();
-	}
-
-	private void initializeExpectedValues() {
-		// source folder name, package name, class name
-		int loc = _className.indexOf(":"); //$NON-NLS-1$
-		if (loc != -1) {
-			if (loc < _className.length()) {
-				_initialValues.classArgs = _className.substring(loc + 1,
-						_className.length());
-				_className = _className.substring(0, loc);
-			}
-			if (loc > 0) {
-				_initialValues.className = _className.substring(0, loc);
-			} else if (loc == 0) {
-				_initialValues.className = ""; //$NON-NLS-1$
-			}
-		}
-		_fClassNameStatus = JavaConventions
-		    .validateJavaTypeName(_initialValues.className, SOURCE_COMPLIANCE_1_3,SOURCE_COMPLIANCE_1_3);
-
-		loc = _className.lastIndexOf('.');
-		if (loc != -1) {
-			_initialValues.packageName = _className.substring(0, loc);
-			_initialValues.className = _className.substring(loc + 1);
-			_fPackageNameStatus = JavaConventions
-                    .validateJavaTypeName(_initialValues.packageName, SOURCE_COMPLIANCE_1_3,SOURCE_COMPLIANCE_1_3);
-			_fClassNameStatus = JavaConventions
-                    .validateJavaTypeName(_initialValues.className, SOURCE_COMPLIANCE_1_3,SOURCE_COMPLIANCE_1_3);
-		}
-		if (_javaProject == null) {
-			return;
-		}
-		try {
-			if (_initialValues.packageFragmentRoot == null) {
-				IPackageFragmentRoot srcEntryDft = null;
-				IPackageFragmentRoot[] roots = _javaProject
-						.getPackageFragmentRoots();
-				for (int i = 0; i < roots.length; i++) {
-					if (roots[i].getKind() == IPackageFragmentRoot.K_SOURCE) {
-						srcEntryDft = roots[i];
-						break;
-					}
-				}
-				if (srcEntryDft != null) {
-					_initialValues.packageFragmentRoot = srcEntryDft;
-				} else {
-					_initialValues.packageFragmentRoot = _javaProject
-							.getPackageFragmentRoot(_javaProject.getResource());
-				}
-				if (_initialValues.packageFragment == null
-						&& _initialValues.packageFragmentRoot != null
-						&& _initialValues.packageName != null
-						&& _initialValues.packageName.length() > 0) {
-					IFolder packageFolder = _project
-							.getFolder(_initialValues.packageName);
-					_initialValues.packageFragment = _initialValues.packageFragmentRoot
-							.getPackageFragment(packageFolder
-									.getProjectRelativePath().toOSString());
-				}
-			}
-			// superclass and interface
-			if (_initialValues.superClassName == null) {
-				_initialValues.superClassName = "java.lang.Object"; //$NON-NLS-1$
-			}
-//			_initialValues.superClassType = findTypeForName(_initialValues.superClassName);
-		} catch (JavaModelException e) {
-			e.printStackTrace();// PDEPlugin.logException(e);
-		}
-	}
-
-	/**
-	 * initialize the wizard page
-	 */
-	protected void initializeWizardPage() {
-		setPackageFragmentRoot(_initialValues.packageFragmentRoot, true);
-		setPackageFragment(_initialValues.packageFragment, true);
-		setEnclosingType(null, true);
-		setEnclosingTypeSelection(false, true);
-		setTypeName(_initialValues.className, true);
-		setSuperClass(_initialValues.superClassName, true);
-		if (_initialValues.interfacesName != null) {
-			setSuperInterfaces(_initialValues.interfacesName, true);
-		}
-		boolean hasSuperClass = _initialValues.superClassName != null
-				&& _initialValues.superClassName.length() > 0;
-		boolean hasInterface = _initialValues.interfacesName != null
-				&& _initialValues.interfacesName.size() > 0;
-		setMethodStubSelection(false, hasSuperClass, hasInterface
-				|| hasSuperClass, true);
-	}
-
-//	private IType findTypeForName(String typeName) throws JavaModelException {
-//		if (typeName == null || typeName.length() == 0) {
-//			return null;
-//		}
-//		IType type = null;
-//		String fileName = typeName.replace('.', '/') + ".java"; //$NON-NLS-1$
-//		IJavaElement element = _javaProject.findElement(new Path(fileName));
-//		if (element == null) {
-//			return null;
-//		}
-//		if (element instanceof IClassFile) {
-//			type = ((IClassFile) element).getType();
-//		} else if (element instanceof ICompilationUnit) {
-//			IType[] types = ((ICompilationUnit) element).getTypes();
-//			type = types[0];
-//		}
-//		return type;
-//	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jdt.ui.wizards.NewClassWizardPage#setVisible(boolean)
-	 */
-	public void setVisible(boolean visible) {
-		super.setVisible(visible);
-		// policy: wizards are not allowed to come up with an error message;
-		// in this wizard, some fields may need initial validation and thus,
-		// potentially start with an error message.
-		if (_fClassNameStatus != null && !_fClassNameStatus.isOK()) {
-			updateStatus(_fClassNameStatus);
-		}
-		if (_fPackageNameStatus != null && !_fPackageNameStatus.isOK()) {
-			updateStatus(_fPackageNameStatus);
-		}
-	}
-
-	/**
-	 * @return the class arguments or "" if not set
-	 */
-	public String getClassArgs() {
-		if (_initialValues.classArgs == null) {
-			return ""; //$NON-NLS-1$
-		}
-		return _initialValues.classArgs;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/JavaSearchScope.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/JavaSearchScope.java
deleted file mode 100644
index 8ac5807..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/JavaSearchScope.java
+++ /dev/null
@@ -1,221 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.dialogfield;
-
-import java.util.ArrayList;
-import java.util.HashSet;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.jdt.core.IClasspathEntry;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.ITypeHierarchy;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jdt.core.search.IJavaSearchScope;
-import org.eclipse.jst.jsf.common.ui.IFileFolderConstants;
-
-/**
- * @author mengbo
- */
-/*package*/ class JavaSearchScope implements IJavaSearchScope {
-	private final IProject _project;
-
-	private final String _superType;
-
-	private HashSet _allowedTypeSet;
-
-	private IPath[] _enclosingProjectsAndJars;
-
-	private IProject[] _relativeProjects;
-
-	/**
-	 * @param project
-	 * @param superType
-	 */
-	public JavaSearchScope(IProject project, String superType) {
-		this._project = project;
-		this._superType = superType;
-		computeRelativeProjects();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jdt.core.search.IJavaSearchScope#enclosingProjectsAndJars()
-	 */
-	public IPath[] enclosingProjectsAndJars() {
-		if (_enclosingProjectsAndJars == null) {
-			ArrayList list = new ArrayList();
-			for (int i = 0; i < _relativeProjects.length; i++) {
-				try {
-					if (_relativeProjects[i].hasNature(JavaCore.NATURE_ID)) {
-						IJavaProject javaProject = JavaCore
-								.create(_relativeProjects[i]);
-						IClasspathEntry[] classpath = javaProject
-								.getResolvedClasspath(true);
-						for (int j = 0; j < classpath.length; j++) {
-							list.add(classpath[j].getPath());
-						}
-						list.add(javaProject.getPath());
-					}
-				} catch (CoreException e)// NOPMD
-				{
-					// skip the project.
-				}
-			}
-			_enclosingProjectsAndJars = (IPath[]) list.toArray(new IPath[(list
-					.size())]);
-		}
-		return _enclosingProjectsAndJars;
-	}
-
-	private void computeRelativeProjects() {
-		try {
-			IProject[] referencedProjects = _project.getReferencedProjects();
-			_relativeProjects = new IProject[referencedProjects.length + 1];
-			System.arraycopy(referencedProjects, 0, _relativeProjects, 1,
-					referencedProjects.length);
-			_relativeProjects[0] = _project;
-		} catch (CoreException e) {
-			_relativeProjects = new IProject[] { _project };
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jdt.core.search.IJavaSearchScope#encloses(java.lang.String)
-	 */
-	public boolean encloses(String resourcePath) {
-		if (_allowedTypeSet == null) {
-			try {
-				_allowedTypeSet = findAllowedTypes(_superType);
-			} catch (CoreException e) {
-				e.printStackTrace();
-			}
-		}
-		if (_allowedTypeSet == null) {
-			_allowedTypeSet = new HashSet();
-		}
-		int separatorIndex = resourcePath.indexOf(JAR_FILE_ENTRY_SEPARATOR);
-		if (separatorIndex != -1) {
-			String className = resourcePath.substring(separatorIndex + 1,
-					resourcePath.length() - 6).replace('/', '.');
-			if (_allowedTypeSet.contains(className)) {
-				return true;
-			}
-		} else if (_allowedTypeSet.contains(resourcePath)) {
-			return true;
-		}
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jdt.core.search.IJavaSearchScope#encloses(org.eclipse.jdt.core.IJavaElement)
-	 */
-	public boolean encloses(IJavaElement element) {
-		return encloses(element.getPath().toString());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jdt.core.search.IJavaSearchScope#includesBinaries()
-	 */
-	public boolean includesBinaries() {
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jdt.core.search.IJavaSearchScope#includesClasspaths()
-	 */
-	public boolean includesClasspaths() {
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jdt.core.search.IJavaSearchScope#setIncludesBinaries(boolean)
-	 */
-	public void setIncludesBinaries(boolean includesBinaries) {
-	    //    do nothing, includeBinaries always true
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jdt.core.search.IJavaSearchScope#setIncludesClasspaths(boolean)
-	 */
-	public void setIncludesClasspaths(boolean includesClasspaths) {
-        // do nothing, includeClasspaths always trues
-	}
-
-	private HashSet findAllowedTypes(String superType) throws CoreException {
-		HashSet set = new HashSet();
-
-		IProject[] projects = _relativeProjects;
-
-		for (int i = 0; i < projects.length; i++) {
-			IType type = null;
-			if (projects[i].hasNature(JavaCore.NATURE_ID)) {
-				IJavaProject javaProject = JavaCore.create(projects[i]);
-				if (superType != null) {
-					try {
-						type = javaProject.findType(superType);
-						if (type != null) {
-							ITypeHierarchy typeHierarchy = type
-									.newTypeHierarchy(javaProject, null);
-							IType[] subtypes = typeHierarchy
-									.getAllSubtypes(type);
-							for (int j = 0; j < subtypes.length; j++) {
-								if (!subtypes[j].isBinary()) {
-									set.add(subtypes[j].getPath().toString());
-								} else {
-									String path = subtypes[j].getPath()
-											.toString();
-									if (path != null
-											&& path
-													.endsWith(IFileFolderConstants.DOT
-															+ IFileFolderConstants.EXT_JAR)) {
-										set.add(subtypes[j]
-												.getFullyQualifiedName());
-									} else {
-										set.add(path);
-									}
-								}
-							}
-						}
-					} catch (JavaModelException e) {
-						e.printStackTrace();
-					}
-				}
-			}
-		}
-		return set;
-	}
-
-	/**
-	 * @return Returns the superType.
-	 */
-	public String getSuperType() {
-		return _superType;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/JavaSearchScopeDecorator.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/JavaSearchScopeDecorator.java
deleted file mode 100644
index 94cd55c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/JavaSearchScopeDecorator.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.dialogfield;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.search.IJavaSearchScope;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-/*package*/ class JavaSearchScopeDecorator implements IJavaSearchScope {
-	JavaSearchScope[] _scopes = new JavaSearchScope[0];
-
-	/**
-	 * @param project
-	 * @param superTypes
-	 */
-	public JavaSearchScopeDecorator(IProject project, List superTypes) {
-		List scopeList = new ArrayList();
-		if (superTypes != null) {
-			for (int i = 0; i < superTypes.size(); i++) {
-				scopeList.add(new JavaSearchScope(project, superTypes.get(i)
-						.toString()));
-			}
-		}
-		_scopes = (JavaSearchScope[]) scopeList
-				.toArray(new JavaSearchScope[scopeList.size()]);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jdt.core.search.IJavaSearchScope#encloses(java.lang.String)
-	 */
-	public boolean encloses(String resourcePath) {
-		for (int i = 0; i < _scopes.length; i++) {
-			if (_scopes[i].encloses(resourcePath) == true) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jdt.core.search.IJavaSearchScope#encloses(org.eclipse.jdt.core.IJavaElement)
-	 */
-	public boolean encloses(IJavaElement element) {
-		for (int i = 0; i < _scopes.length; i++) {
-			if (_scopes[i].encloses(element) == true) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jdt.core.search.IJavaSearchScope#enclosingProjectsAndJars()
-	 */
-	public IPath[] enclosingProjectsAndJars() {
-		Set set = new HashSet();
-		for (int i = 0; i < _scopes.length; i++) {
-			set.addAll(Arrays.asList(_scopes[i].enclosingProjectsAndJars()));
-		}
-		return (IPath[]) set.toArray(new IPath[set.size()]);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jdt.core.search.IJavaSearchScope#includesBinaries()
-	 */
-	public boolean includesBinaries() {
-		for (int i = 0; i < _scopes.length; i++) {
-			if (_scopes[i].includesBinaries() == true) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jdt.core.search.IJavaSearchScope#includesClasspaths()
-	 */
-	public boolean includesClasspaths() {
-		for (int i = 0; i < _scopes.length; i++) {
-			if (_scopes[i].includesClasspaths() == true) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jdt.core.search.IJavaSearchScope#setIncludesBinaries(boolean)
-	 */
-	public void setIncludesBinaries(boolean includesBinaries) {
-		for (int i = 0; i < _scopes.length; i++) {
-			_scopes[i].setIncludesBinaries(includesBinaries);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jdt.core.search.IJavaSearchScope#setIncludesClasspaths(boolean)
-	 */
-	public void setIncludesClasspaths(boolean includesClasspaths) {
-		for (int i = 0; i < _scopes.length; i++) {
-			_scopes[i].setIncludesClasspaths(includesClasspaths);
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/JavaUIHelper.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/JavaUIHelper.java
deleted file mode 100644
index 8bee860..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/JavaUIHelper.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.dialogfield;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jdt.core.search.IJavaSearchScope;
-import org.eclipse.jdt.core.search.SearchEngine;
-import org.eclipse.jdt.ui.JavaUI;
-import org.eclipse.jface.dialogs.ProgressMonitorDialog;
-import org.eclipse.jst.jsf.common.ui.JSFUICommonPlugin;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.dialogs.SelectionDialog;
-import org.eclipse.ui.ide.IDE;
-
-/**
- * @author mengbo
- */
-public final class JavaUIHelper {
-	/**
-	 * @param project
-	 * @param className
-	 */
-	static void doOpenClass(IProject project, String className) {
-		String path = className.replace('.', '/') + ".java"; //$NON-NLS-1$
-		try {
-			if (project.hasNature(JavaCore.NATURE_ID)) {
-				IJavaProject javaProject = JavaCore.create(project);
-				IJavaElement result = javaProject.findElement(new Path(path));
-				JavaUI.openInEditor(result);
-			} else {
-				IResource resource = project.findMember(new Path(path));
-				if (resource instanceof IFile) {
-					IWorkbenchPage page = PlatformUI.getWorkbench()
-							.getActiveWorkbenchWindow().getActivePage();
-					IDE.openEditor(page, (IFile) resource, true);
-				}
-			}
-		} catch (PartInitException e) {
-			e.printStackTrace();// PDEPlugin.logException(e);
-		} catch (JavaModelException e) {
-			e.printStackTrace();// Display.getCurrent().beep();
-		} catch (CoreException e) {
-			e.printStackTrace();// PDEPlugin.logException(e);
-		}
-	}
-
-	/**
-	 * @param project
-	 * @param className
-	 * @return true if the class exists in project
-	 */
-	static boolean doesClassExist(IProject project, String className) {
-		String path = className.replace('.', '/') + ".java"; //$NON-NLS-1$
-		try {
-			if (project.hasNature(JavaCore.NATURE_ID)) {
-				IJavaProject javaProject = JavaCore.create(project);
-
-				IJavaElement result = javaProject.findElement(new Path(path));
-				return result != null;
-			}
-            IResource resource = project.findMember(new Path(path));
-            return resource != null;
-		} catch (JavaModelException e) {
-			return false;
-		} catch (CoreException e) {
-			return false;
-		}
-	}
-
-	/**
-	 * @param shell
-	 * @param searchScope
-	 * @param typeFlag
-	 * @return the selection dialog
-	 */
-	static SelectionDialog openSelectionDialog(Shell shell,
-			IJavaSearchScope searchScope, int typeFlag) {
-		try {
-			return JavaUI.createTypeDialog(shell, new ProgressMonitorDialog(
-					shell), searchScope, typeFlag, false);
-		} catch (JavaModelException e) {
-            JSFUICommonPlugin.getLogger(JavaUIHelper.class).error(e);
-			return null;
-		}
-	}
-
-	/**
-	 * @param shell
-	 * @param project
-	 * @param superType
-	 * @param typeFlag
-	 * @return the selection  dialog
-	 */
-	public static SelectionDialog openSelectionDialog(Shell shell,
-			IProject project, String superType, int typeFlag) {
-		IJavaSearchScope searchScope = findSearchScope(project, superType);
-		return openSelectionDialog(shell, searchScope, typeFlag);
-	}
-
-	/**
-	 * @param project
-	 * @param superType
-	 * @return the search scope
-	 */
-	static IJavaSearchScope findSearchScope(IProject project,
-			String superType) {
-		if (project != null) {
-			if (superType == null || "".equals(superType)) { //$NON-NLS-1$
-				superType = "java.lang.Object";//$NON-NLS-1$
-			}
-			return new JavaSearchScope(project, superType);
-		}
-		return SearchEngine.createWorkspaceScope();
-	}
-	
-	private JavaUIHelper()
-	{
-		// static helper, no instantiation
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/LayoutUtil.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/LayoutUtil.java
deleted file mode 100644
index 2457cd1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/LayoutUtil.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.dialogfield;
-
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.FontMetrics;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * A layout utility class
- *
- */
-public final class LayoutUtil {
-	// The Text control looks higher then Button control when they have the same
-	// height,
-	// Increasing the height of 5 pixels will make them looks the same height.
-	private final static int BUTTON_HEIGHT_ADJUSTMENT = 5;
-
-
-	/**
-	 * @param control
-	 * @param grab
-	 */
-	public static void setGrabHorizontal(Control control, boolean grab) {
-		Object ld = control.getLayoutData();
-		if (ld instanceof GridData) {
-			((GridData) ld).grabExcessHorizontalSpace = grab;
-		}
-	}
-
-	/**
-	 * Sets the width hint of a control. Assumes that GridData is used.
-	 * @param control 
-	 * @param widthHint 
-	 */
-	public static void setWidthHint(Control control, int widthHint) {
-		Object ld = control.getLayoutData();
-		if (ld instanceof GridData) {
-			((GridData) ld).widthHint = widthHint;
-		}
-	}
-
-
-	/**
-	 * Sets the horizontal indent of a control. Assumes that GridData is used.
-	 * @param control 
-	 * @param horizontalIndent 
-	 */
-	static void setHorizontalIndent(Control control, int horizontalIndent) {
-		Object ld = control.getLayoutData();
-		if (ld instanceof GridData) {
-			((GridData) ld).horizontalIndent = horizontalIndent;
-		}
-	}
-
-	/**
-	 * Sets the horizontal indent of a control. Assumes that GridData is used.
-	 * @param control 
-	 */
-	public static void setHorizontalGrabbing(Control control) {
-		Object ld = control.getLayoutData();
-		if (ld instanceof GridData) {
-			((GridData) ld).grabExcessHorizontalSpace = true;
-		}
-	}
-
-	/**
-	 * Returns a width hint for a button control.
-	 * @param button 
-	 * @return the hint value
-	 */
-	static int getButtonWidthHint(Button button) {
-		if (button.getFont().equals(JFaceResources.getDefaultFont()))
-			button.setFont(JFaceResources.getDialogFont());
-
-		GC gc = new GC(button);
-		gc.setFont(button.getFont());
-		FontMetrics fontMetrics = gc.getFontMetrics();
-		gc.dispose();
-
-		int length = button.getText().length();
-		int widthHint = Dialog.convertWidthInCharsToPixels(fontMetrics,
-				length < 2 ? 2 : length);
-		return Math.max(widthHint, button.computeSize(SWT.DEFAULT, SWT.DEFAULT,
-				true).x);
-	}
-
-	static int getButtonHeightHint(FormToolkit toolkit, Text text) {
-		if (toolkit != null) {
-			return text.computeSize(SWT.DEFAULT, SWT.DEFAULT, true).y
-					+ BUTTON_HEIGHT_ADJUSTMENT;
-		}
-        return text.computeSize(SWT.DEFAULT, SWT.DEFAULT, true).y;
-	}
-	
-	private LayoutUtil()
-	{
-		// static utility class; no instantiation
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/RadiosDialogField.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/RadiosDialogField.java
deleted file mode 100644
index 7db537b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/RadiosDialogField.java
+++ /dev/null
@@ -1,233 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.dialogfield;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.RowLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * This will display a labal and a group of radio buttons. The group of radio
- * buttons will be layed out horizontally use a RowLayout, and them as a group
- * will use one cell in the GridLayout.
- * 
- * Whenever the radios selection change will fire both dialogFieldChanged() and
- * dialogFieldApplied() event.
- * 
- * @author mengbo
- */
-public class RadiosDialogField extends DialogFieldBase {
-	final static private String INDEXKEY = "INDEX"; //$NON-NLS-1$
-
-	private Composite _group;
-
-	private String[] _items;
-
-	private Button[] _button;
-
-	private int _selectIndex = -1;
-
-	private boolean _fireEvent = true;
-
-	/**
-	 * Default constructor
-	 */
-	public RadiosDialogField() {
-		super();
-	}
-
-	/**
-	 * this method must be called before create control
-	 * 
-	 * @param items
-	 */
-	public void setItems(String[] items) {
-		_items = items;
-		_button = new Button[_items.length];
-	}
-
-	// ------- layout helpers
-
-	/*
-	 * @see DialogField#doFillIntoGrid
-	 */
-	public Control[] doFillIntoGrid(FormToolkit toolkit, Composite parent,
-			int nColumns) {
-		assertEnoughColumns(nColumns);
-
-		Control requiredLabel = getRequiredLabelControl(toolkit, parent);
-		requiredLabel.setLayoutData(gridDataForLabel(1));
-
-		Control label = getLabelControl(toolkit, parent);
-		label.setLayoutData(gridDataForLabel(1));
-
-		_group = getGroup(toolkit, parent);
-		_group.setLayoutData(gridDataForGroup(nColumns - 2));
-
-		return new Control[] { requiredLabel, label, _group };
-	}
-
-	/*
-	 * @see DialogField#getNumberOfControls
-	 */
-	public int getNumberOfControls() {
-		return 3;
-	}
-
-	/**
-	 * @param span
-	 * @return the grid data
-	 */
-	protected static GridData gridDataForGroup(int span) {
-		GridData gd = new GridData();
-		gd.horizontalAlignment = GridData.FILL;
-		gd.grabExcessHorizontalSpace = false;
-		gd.horizontalSpan = span;
-		return gd;
-	}
-
-	// ------- focus methods
-
-	/*
-	 * @see DialogField#setFocus
-	 */
-	public boolean setFocus() {
-		if (isOkToUse(_group)) {
-			_group.setFocus();
-		}
-		return true;
-	}
-
-	// ------- ui creation
-
-	/**
-	 * @param toolkit
-	 * @param parent
-	 * @return the group composite
-	 */
-	public Composite getGroup(FormToolkit toolkit, Composite parent) {
-		if (_group == null || _group.isDisposed()) {
-			assertCompositeNotNull(parent);
-			if (toolkit != null) {
-				_group = toolkit.createComposite(parent);
-			} else {
-				_group = new Composite(parent, SWT.NONE);
-			}
-			RowLayout layout = new RowLayout();
-			layout.marginBottom = 0;
-			_group.setLayout(layout);
-			for (int i = 0; i < _items.length; i++) {
-				if (toolkit != null) {
-					_button[i] = toolkit.createButton(_group, _items[i],
-							SWT.RADIO);
-				} else {
-					_button[i] = new Button(_group, SWT.RADIO);
-					_button[i].setText(_items[i]);
-				}
-				_button[i].setData(INDEXKEY, new Integer(i));
-				_button[i].addSelectionListener(new SelectionAdapter() {
-					public void widgetSelected(SelectionEvent e) {
-						if (_fireEvent) {
-							_selectIndex = ((Integer) e.widget
-									.getData(INDEXKEY)).intValue();
-							// FIXME: seemed will fire widgetSelected twice, one
-							// for the deselect one,
-							// one for the newly selected one. Need investigate.
-							if (((Button) e.widget).getSelection()) {
-								dialogFieldChangedAndApplied();
-							}
-						}
-					}
-
-				});
-			}
-		}
-		return _group;
-	}
-
-	// ------ enable / disable management
-
-	/*
-	 * @see DialogField#updateEnableState
-	 */
-	protected void updateEnableState() {
-		super.updateEnableState();
-		if (isOkToUse(_group)) {
-			_group.setEnabled(isEnabled());
-		}
-	}
-
-	// ------ text access
-
-	/**
-	 * Sets the text. Triggers a dialog-changed event.
-	 * @param index 
-	 */
-	public void setSelectedIndex(int index) {
-		_selectIndex = index;
-		if (isOkToUse(_group)) {
-			if (_selectIndex >= 0 && _selectIndex < _items.length) {
-				_button[_selectIndex].setSelection(true);
-			} else {
-				for (int i = 0; i < _items.length; i++) {
-					if (_button[i].getSelection()) {
-						_button[i].setSelection(false);
-					}
-				}
-			}
-		}
-		dialogFieldChangedAndApplied();
-	}
-
-	/**
-	 * Sets the text without triggering a dialog-changed event.
-	 * @param index 
-	 */
-	public void setSelectedIndexWithoutUpdate(int index) {
-		_selectIndex = index;
-		if (isOkToUse(_group)) {
-			_fireEvent = false;
-			if (_selectIndex >= 0 && _selectIndex < _items.length) {
-				_button[_selectIndex].setSelection(true);
-			} else {
-				for (int i = 0; i < _items.length; i++) {
-					if (_button[i].getSelection()) {
-						_button[i].setSelection(false);
-					}
-				}
-			}
-			_fireEvent = true;
-		}
-	}
-
-	/**
-	 * @return the index selected
-	 */
-	public int getSelectedIndex() {
-		return _selectIndex;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField#handleGrabHorizontal()
-	 */
-	public void handleGrabHorizontal() {
-		LayoutUtil.setGrabHorizontal(this._group, true);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/ResourceButtonDialogField.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/ResourceButtonDialogField.java
deleted file mode 100644
index 8ab30f0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/ResourceButtonDialogField.java
+++ /dev/null
@@ -1,231 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.dialogfield;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.jface.window.Window;
-import org.eclipse.jst.jsf.common.ui.JSFUICommonPlugin;
-import org.eclipse.jst.jsf.common.ui.internal.dialogs.CommonResourceDialog;
-import org.eclipse.jst.jsf.common.ui.internal.utils.PathUtil;
-import org.eclipse.jst.jsf.common.ui.internal.utils.WebrootUtil;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * This class provides a common resource choice DialogFiled. You must set a
- * no-null IProject instance to enable it working. You should give it a suffix
- * list if you want to choose files ended with specific file extensions. The
- * selection result will be a relative path based on the _referredFile's value
- * if it is set, or else based on the _project path.
- * 
- * The usage: Shell shell = new Shell(); IProject project = getProject();
- * ResourceButtonDialogField localeField = new
- * ResourceButtonDialogField(project);
- * localeField.setResourceDescription("image"); localeField.setSuffixs(new
- * String[]{"bmp","jpg","gif"});
- * localeField.setReferredFile(StructuredModelUtil.getFileFor(_element.getModel()));
- * 
- * @author mengbo
- */
-public class ResourceButtonDialogField extends StringButtonDialogField {
-	private IProject _project;
-
-	private String[] _suffixs;
-
-	private String _resourceDescription;
-
-	private IFile _referredFile;
-
-	private boolean _isWebPath = false;
-
-	private IFolder _folder;
-
-	private String _separator = ""; //$NON-NLS-1$
-
-	/**
-	 * @param project
-	 */
-	public ResourceButtonDialogField(IProject project) {
-		this(null, project);
-		setStringButtonAdapter(new IStringButtonAdapter() {
-			public void changeControlPressed(DialogField field) {
-				String oldValue = getText();
-				String newValue = browseButtonPressed();
-				if (newValue != null && !newValue.equals(oldValue)) {
-					setText(newValue);
-				}
-			}
-		});
-	}
-
-	/**
-	 * @param adapter
-	 * @param project
-	 */
-	public ResourceButtonDialogField(IStringButtonAdapter adapter,
-			IProject project) {
-		super(adapter);
-		this._project = project;
-	}
-
-	/**
-	 * @return the string
-	 */
-	protected String browseButtonPressed() {
-		Shell shell = getShell();
-		CommonResourceDialog dialog = null;
-		int style = "".equals(_separator) ? SWT.NONE : SWT.MULTI | SWT.H_SCROLL //$NON-NLS-1$
-				| SWT.V_SCROLL;
-		if (_folder != null) {
-			dialog = new CommonResourceDialog(shell, _folder.getProject(), style);
-		} else {
-			dialog = new CommonResourceDialog(shell, _project, style);
-		}
-		dialog.setTitle(JSFUICommonPlugin
-				.getResourceString("DialogField.ResourceButton.SelectFile"));//$NON-NLS-1$
-		dialog.setSuffixs(_suffixs);
-		dialog.setResourceDescription(_resourceDescription);
-
-		if (dialog.open() == Window.OK) {
-			Object[] result = dialog.getResult();
-			StringBuffer buffer = new StringBuffer();
-			for (int i = 0; i < result.length; i++) {
-				String newValue = null;
-				IPath path = ((IFile) result[i]).getLocation();
-
-				IPath referredPath = null;
-				if (_referredFile != null) {
-					referredPath = _referredFile.getLocation();
-				} else {
-					referredPath = _project.getLocation();
-				}
-				if (this._isWebPath) {
-					IFile selectedFile = ((IFile) result[i]);
-					newValue = WebrootUtil.getWebPath(selectedFile
-							.getFullPath());
-				} else {
-					newValue = PathUtil.convertToRelativePath(path.toString(),
-							referredPath.toString());
-				}
-				buffer.append(newValue);
-				buffer.append(_separator);
-			}
-			if (buffer.length() > 0) {
-				return buffer.substring(0, buffer.length()
-						- _separator.length());
-			}
-
-		}
-		return null;
-	}
-
-	/**
-	 * @return Returns the project.
-	 */
-	public IProject getProject() {
-		return _project;
-	}
-
-	/**
-	 * @param project
-	 *            The project to set.
-	 */
-	public void setProject(IProject project) {
-		this._project = project;
-	}
-
-	/**
-	 * @return Returns the relative folder.
-	 */
-	public IFolder getFolder() {
-		return _folder;
-	}
-
-	/**
-	 * @param folder
-	 *            The relative folder to set.
-	 */
-	public void setFolder(IFolder folder) {
-		this._folder = folder;
-	}
-
-	/**
-	 * @return Returns the referredFile.
-	 */
-	public IFile getReferredFile() {
-		return _referredFile;
-	}
-
-	/**
-	 * @param referredFile
-	 *            The referredFile to set.
-	 */
-	public void setReferredFile(IFile referredFile) {
-		this._referredFile = referredFile;
-	}
-
-	/**
-	 * @return Returns the resourceDescription.
-	 */
-	public String getResourceDescription() {
-		return _resourceDescription;
-	}
-
-	/**
-	 * @param resourceDescription
-	 *            The resourceDescription to set.
-	 */
-	public void setResourceDescription(String resourceDescription) {
-		this._resourceDescription = resourceDescription;
-	}
-
-	/**
-	 * @return Returns the suffixs.
-	 */
-	public String[] getSuffixs() {
-		return _suffixs;
-	}
-
-	/**
-	 * @param suffixs
-	 *            The suffixs to set.
-	 */
-	public void setSuffixs(String[] suffixs) {
-		this._suffixs = suffixs;
-	}
-
-	/**
-	 * set some special path to web path instead of relative path
-	 * 
-	 * @param isWebPath
-	 */
-	public void setWebPath(boolean isWebPath) {
-		this._isWebPath = isWebPath;
-	}
-
-	/**
-	 * @return the separator string
-	 */
-	public String getSeparator() {
-		return _separator;
-	}
-
-	/**
-	 * @param separator
-	 */
-	public void setSeparator(String separator) {
-		this._separator = separator;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/Separator.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/Separator.java
deleted file mode 100644
index f54722a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/Separator.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.dialogfield;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * Dialog field describing a separator.
- */
-public class Separator extends DialogFieldBase {
-
-	private Label _separator;
-
-	private int _style;
-
-	/**
-	 * Default constructor
-	 */
-	public Separator() {
-		this(SWT.NONE);
-	}
-
-	/**
-	 * @param style
-	 *            of the separator. See <code>Label</code> for possible
-	 *            styles.
-	 */
-	public Separator(int style) {
-		_style = style;
-	}
-
-	// ------- layout helpers
-
-	/**
-	 * Creates the separator and fills it in a MGridLayout.
-	 * @param toolkit 
-	 * @param parent 
-	 * @param nColumns 
-	 * 
-	 * @param height
-	 *            The heigth of the separator
-	 * @return the controls or empty array
-	 */
-	public Control[] doFillIntoGrid(FormToolkit toolkit, Composite parent,
-			int nColumns, int height) {
-		assertEnoughColumns(nColumns);
-
-		Control separator = getSeparator(toolkit, parent);
-		separator.setLayoutData(gridDataForSeperator(nColumns, height));
-
-		return new Control[] { separator };
-	}
-
-	/*
-	 * @see DialogField#doFillIntoGrid
-	 */
-	public Control[] doFillIntoGrid(FormToolkit toolkit, Composite parent,
-			int nColumns) {
-		return doFillIntoGrid(toolkit, parent, nColumns, 4);
-	}
-
-	/*
-	 * @see DialogField#getNumberOfControls
-	 */
-	public int getNumberOfControls() {
-		return 1;
-	}
-
-	/**
-	 * @param span
-	 * @param height
-	 * @return the grid data
-	 */
-	protected static GridData gridDataForSeperator(int span, int height) {
-		GridData gd = new GridData();
-		gd.horizontalAlignment = GridData.FILL;
-		gd.verticalAlignment = GridData.BEGINNING;
-		gd.heightHint = height;
-		gd.horizontalSpan = span;
-		return gd;
-	}
-
-	// ------- ui creation
-
-	/**
-	 * Creates or returns the created separator.
-	 * @param toolkit 
-	 * 
-	 * @param parent
-	 *            The parent composite or <code>null</code> if the widget has
-	 *            already been created.
-	 * @return  the separator
-	 */
-	private Control getSeparator(FormToolkit toolkit, Composite parent) {
-		if (_separator == null || _separator.isDisposed()) {
-			assertCompositeNotNull(parent);
-			if (toolkit != null) {
-				_separator = toolkit.createSeparator(parent, _style);
-			} else {
-				_separator = new Label(parent, _style);
-			}
-		}
-		return _separator;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField#handleGrabHorizontal()
-	 */
-	public void handleGrabHorizontal() {
-		// do nothing.
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/SourceFolderButtonDialogField.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/SourceFolderButtonDialogField.java
deleted file mode 100644
index 420a950..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/SourceFolderButtonDialogField.java
+++ /dev/null
@@ -1,340 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.dialogfield;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IJavaModel;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IPackageFragmentRoot;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jdt.ui.JavaElementComparator;
-import org.eclipse.jdt.ui.JavaElementLabelProvider;
-import org.eclipse.jdt.ui.StandardJavaElementContentProvider;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.jface.window.Window;
-import org.eclipse.jst.jsf.common.ui.JSFUICommonPlugin;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.ui.dialogs.ElementTreeSelectionDialog;
-
-/**
- * This class provides a source folder selection DialogFiled. There are two
- * conditions: 1. If you set the IProject instance, the source folder selection
- * will only be limited in the specified project 2. If you set null, the source
- * folder selection is allowed in all workspaces
- * 
- * 
- * @author mengbo
- * @version 1.5
- */
-public class SourceFolderButtonDialogField extends StringButtonDialogField {
-	/** Create the logger for this class */
-	private static Logger _log = JSFUICommonPlugin
-			.getLogger(SourceFolderButtonDialogField.class);
-
-	/**
-	 * package fragment root corresponding to the input type (can be null)
-	 */
-	private IPackageFragmentRoot _fCurrRoot;
-
-	private IProject _project;
-
-	/**
-	 * @param project 
-	 */
-	public SourceFolderButtonDialogField(IProject project) {
-		super(null);
-
-		_project = project;
-
-		setLabelText(DialogFieldResources.getInstance().getString(
-				"SourceFolderButtonDialogField.container.label")); //$NON-NLS-1$
-
-		setButtonLabel(DialogFieldResources.getInstance().getString(
-				"SourceFolderButtonDialogField.container.button")); //$NON-NLS-1$
-
-		setStringButtonAdapter(new IStringButtonAdapter() {
-			public void changeControlPressed(DialogField field) {
-				containerChangeControlPressed(field);
-			}
-
-		});
-	}
-
-	/**
-	 * @return Returns the project.
-	 */
-	public IProject getProject() {
-		return _project;
-	}
-
-	/**
-	 * @param project
-	 *            The project to set.
-	 */
-	public void setProject(IProject project) {
-		this._project = project;
-	}
-
-	/**
-	 * @param field
-	 */
-	protected void containerChangeControlPressed(DialogField field) {
-		// take the current jproject as init element of the dialog
-		IPackageFragmentRoot root = getPackageFragmentRoot();
-		root = chooseSourceContainer(root);
-		if (root != null) {
-			setPackageFragmentRoot(root, true);
-		}
-	}
-
-	/**
-	 * Sets the current source folder (model and text field) to the given
-	 * package fragment root.
-	 * 
-	 * @param root
-	 *            The new root.
-	 * @param canBeModified
-	 *            if <code>false</code> the source folder field can not be
-	 *            changed by the user. If <code>true</code> the field is
-	 *            editable
-	 */
-	public void setPackageFragmentRoot(IPackageFragmentRoot root,
-			boolean canBeModified) {
-		_fCurrRoot = root;
-		String str = (root == null) ? "" : root.getPath().makeRelative().toString(); //$NON-NLS-1$
-		setText(str);
-		setEnabled(canBeModified);
-	}
-
-	/**
-	 * Returns the <code>IPackageFragmentRoot</code> that corresponds to the
-	 * current value of the source folder field.
-	 * 
-	 * @return the IPackageFragmentRoot or <code>null</code> if the current
-	 *         source folder value is not a valid package fragment root
-	 * 
-	 */
-	public IPackageFragmentRoot getPackageFragmentRoot() {
-		return _fCurrRoot;
-	}
-
-	/**
-	 * Returns the current text of source folder text field.
-	 * 
-	 * @return the text of the source folder text field
-	 */
-	public String getPackageFragmentRootText() {
-		return getText();
-	}
-
-	/**
-	 * choose source container dialog
-	 * 
-	 * @param initElement
-	 * @return
-	 */
-	private IPackageFragmentRoot chooseSourceContainer(IJavaElement initElement) {
-		Class[] acceptedClasses = new Class[] { IPackageFragmentRoot.class,
-				IJavaProject.class, };
-
-		TypedElementSelectionValidator validator = new TypedElementSelectionValidator(
-				acceptedClasses, false) {
-            // TODO: never used
-//			public boolean isSelectedValid(Object element) {
-//				try {
-//					if (element instanceof IJavaProject) {
-//						IJavaProject jproject = (IJavaProject) element;
-//						IPath path = jproject.getProject().getFullPath();
-//						return (jproject.findPackageFragmentRoot(path) != null);
-//					} else if (element instanceof IPackageFragmentRoot) {
-//						return (((IPackageFragmentRoot) element).getKind() == IPackageFragmentRoot.K_SOURCE);
-//					}
-//					return true;
-//				} catch (JavaModelException e) {
-//					_log.error("JavaModelException"); // just log, no ui in
-//					// validation
-//				}
-//				return false;
-//			}
-		};
-
-		acceptedClasses = new Class[] { IJavaModel.class,
-				IPackageFragmentRoot.class, IJavaProject.class, };
-		ViewerFilter filter = new TypedViewerFilter(acceptedClasses) {
-			public boolean select(Viewer viewer, Object parent, Object element) {
-				if (element instanceof IPackageFragmentRoot) {
-					try {
-						return (((IPackageFragmentRoot) element).getKind() == IPackageFragmentRoot.K_SOURCE);
-					} catch (JavaModelException e) {
-						_log.error(e); // just log, no ui
-						// in validation
-						return false;
-					}
-				}
-				return super.select(viewer, parent, element);
-			}
-		};
-
-		StandardJavaElementContentProvider provider = new StandardJavaElementContentProvider();
-		ILabelProvider labelProvider = new JavaElementLabelProvider(
-				JavaElementLabelProvider.SHOW_DEFAULT);
-		ElementTreeSelectionDialog dialog = new ElementTreeSelectionDialog(
-				getShell(), labelProvider, provider);
-		dialog.setValidator(validator);
-		dialog.setComparator(new JavaElementComparator());
-		// HibernateWizardPage.ChooseSourceContainerDialog.Title = Folder
-		// Selection
-		dialog
-				.setTitle(DialogFieldResources
-						.getInstance()
-						.getString(
-								"SourceFolderButtonDialogField.ChooseSourceContainerDialog.Title")); //$NON-NLS-1$
-		// HibernateWizardPage.ChooseSourceContainerDialog.Description = Choose
-		// a folder:
-		dialog
-				.setMessage(DialogFieldResources
-						.getInstance()
-						.getString(
-								"SourceFolderButtonDialogField.ChooseSourceContainerDialog.Description")); //$NON-NLS-1$
-		dialog.addFilter(filter);
-		if (_project != null) {
-			dialog.setInput(JavaCore.create(_project));
-		} else {
-			dialog.setInput(JavaCore.create(ResourcesPlugin.getWorkspace()
-					.getRoot()));
-		}
-		dialog.setInitialSelection(initElement);
-
-		if (dialog.open() == Window.OK) {
-			Object element = dialog.getFirstResult();
-			if (element instanceof IJavaProject) {
-				IJavaProject jproject = (IJavaProject) element;
-				return jproject.getPackageFragmentRoot(jproject.getProject());
-			} else if (element instanceof IPackageFragmentRoot) {
-				return (IPackageFragmentRoot) element;
-			}
-			return null;
-		}
-		return null;
-	}
-
-	/**
-	 * This method updates the model and returns an error status. The underlying
-	 * model is only valid if the returned status is OK.
-	 * 
-	 * @return the model's error status
-	 */
-	public IStatus getChangedStatus() {
-		StatusInfo status = new StatusInfo();
-
-		_fCurrRoot = null;
-		String str = getPackageFragmentRootText();
-		if (str.length() == 0) {
-			// SourceFolderButtonDialogField.error.EnterContainerName = Folder
-			// name is empty.
-			status.setError(DialogFieldResources.getInstance().getString(
-					"SourceFolderButtonDialogField.error.EnterContainerName")); //$NON-NLS-1$
-			return status;
-		}
-		IPath path = new Path(str);
-		IResource res = ResourcesPlugin.getWorkspace().getRoot().findMember(
-				path);
-		if (res != null) {
-			int resType = res.getType();
-			if (resType == IResource.PROJECT || resType == IResource.FOLDER) {
-				IProject proj = res.getProject();
-				if (!proj.isOpen()) {
-					status
-							.setError(DialogFieldResources
-									.getInstance()
-									.getString(
-											"SourceFolderButtonDialogField.error.ProjectClosed", proj.getFullPath().toString())); //$NON-NLS-1$
-					return status;
-				}
-				if (_project != null && proj != _project) {
-					// HibernateWizardPage.error.NotSameProject = The project
-					// should be \''{0}\''.
-					status
-							.setError(DialogFieldResources
-									.getInstance()
-									.getString(
-											"SourceFolderButtonDialogField.error.NotSameProject", _project.getName())); //$NON-NLS-1$
-					return status;
-				}
-				IJavaProject jproject = JavaCore.create(proj);
-				_fCurrRoot = jproject.getPackageFragmentRoot(res);
-				if (res.exists()) {
-					try {
-						if (!proj.hasNature(JavaCore.NATURE_ID)) {
-							if (resType == IResource.PROJECT) {
-								status
-										.setError(DialogFieldResources
-												.getInstance()
-												.getString(
-														"SourceFolderButtonDialogField.warning.NotAJavaProject", proj.getName())); //$NON-NLS-1$
-							} else {
-								status
-										.setWarning(DialogFieldResources
-												.getInstance()
-												.getString(
-														"SourceFolderButtonDialogField.warning.NotInAJavaProject", proj.getName())); //$NON-NLS-1$
-							}
-							return status;
-						}
-					} catch (CoreException e) {
-						status
-								.setWarning(DialogFieldResources
-										.getInstance()
-										.getString(
-												"SourceFolderButtonDialogField.warning.NotAJavaProject", proj.getName())); //$NON-NLS-1$
-					}
-					if (!jproject.isOnClasspath(_fCurrRoot)) {
-						status
-								.setWarning(DialogFieldResources
-										.getInstance()
-										.getString(
-												"SourceFolderButtonDialogField.warning.NotOnClassPath", str)); //$NON-NLS-1$
-					}
-					if (_fCurrRoot.isArchive()) {
-						status
-								.setError(DialogFieldResources
-										.getInstance()
-										.getString(
-												"SourceFolderButtonDialogField.error.ContainerIsBinary", str)); //$NON-NLS-1$
-						return status;
-					}
-				}
-				return status;
-			}
-            status.setError(DialogFieldResources.getInstance().getString(
-                    "SourceFolderButtonDialogField.error.NotAFolder", str)); //$NON-NLS-1$
-            return status;
-		}
-        status
-                 .setError(DialogFieldResources
-                        .getInstance()
-                        .getString(
-                                "SourceFolderButtonDialogField.error.ContainerDoesNotExist", str)); //$NON-NLS-1$
-        return status;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/StatusInfo.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/StatusInfo.java
deleted file mode 100644
index 8a8c9b7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/StatusInfo.java
+++ /dev/null
@@ -1,198 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.dialogfield;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jst.jsf.common.ui.JSFUICommonPlugin;
-
-/**
- * A settable IStatus. Can be an error, warning, info or ok. For error, info and
- * warning states, a message describes the problem.
- * 
- * TODO: couldn't have sub-classed Status?
- * 
- * @author mengbo
- * @version 1.5
- */
-/*package*/ class StatusInfo implements IStatus {
-
-	/**
-	 * a default status info for IStatus.OK
-	 */
-	public static final IStatus OK_STATUS = new StatusInfo();
-
-	private String fStatusMessage;
-
-	private int fSeverity;
-
-	/**
-	 * Creates a status set to OK (no message)
-	 */
-	public StatusInfo() {
-		this(OK, null);
-	}
-
-	/**
-	 * Creates a status .
-	 * 
-	 * @param severity
-	 *            The status severity: ERROR, WARNING, INFO and OK.
-	 * @param message
-	 *            The message of the status. Applies only for ERROR, WARNING and
-	 *            INFO.
-	 */
-	public StatusInfo(int severity, String message) {
-		fStatusMessage = message;
-		fSeverity = severity;
-	}
-
-	/**
-	 * Returns if the status' severity is OK.
-	 */
-	public boolean isOK() {
-		return fSeverity == IStatus.OK;
-	}
-
-	/**
-	 * Returns if the status' severity is WARNING.
-	 * @return true if severity is IStatus.WARNING
-	 */
-	public boolean isWarning() {
-		return fSeverity == IStatus.WARNING;
-	}
-
-	/**
-	 * Returns if the status' severity is INFO.
-	 * @return true if severity is INFO
-	 */
-	public boolean isInfo() {
-		return fSeverity == IStatus.INFO;
-	}
-
-	/**
-	 * Returns if the status' severity is ERROR.
-	 * @return true if severity is error
-	 */
-	public boolean isError() {
-		return fSeverity == IStatus.ERROR;
-	}
-
-	/**
-	 * @see IStatus#getMessage
-	 */
-	public String getMessage() {
-		return fStatusMessage;
-	}
-
-	/**
-	 * Sets the status to ERROR.
-	 * 
-	 * @param errorMessage
-	 *            The error message (can be empty, but not null)
-	 */
-	public void setError(String errorMessage) {
-		Assert.isNotNull(errorMessage);
-		fStatusMessage = errorMessage;
-		fSeverity = IStatus.ERROR;
-	}
-
-	/**
-	 * Sets the status to WARNING.
-	 * 
-	 * @param warningMessage
-	 *            The warning message (can be empty, but not null)
-	 */
-	public void setWarning(String warningMessage) {
-		Assert.isNotNull(warningMessage);
-		fStatusMessage = warningMessage;
-		fSeverity = IStatus.WARNING;
-	}
-
-	/**
-	 * Sets the status to INFO.
-	 * 
-	 * @param infoMessage
-	 *            The info message (can be empty, but not null)
-	 */
-	public void setInfo(String infoMessage) {
-		Assert.isNotNull(infoMessage);
-		fStatusMessage = infoMessage;
-		fSeverity = IStatus.INFO;
-	}
-
-	/**
-	 * Sets the status to OK.
-	 */
-	public void setOK() {
-		fStatusMessage = null;
-		fSeverity = IStatus.OK;
-	}
-
-	/*
-	 * @see IStatus#matches(int)
-	 */
-	public boolean matches(int severityMask) {
-		return (fSeverity & severityMask) != 0;
-	}
-
-	/**
-	 * Returns always <code>false</code>.
-	 * 
-	 * @see IStatus#isMultiStatus()
-	 */
-	public boolean isMultiStatus() {
-		return false;
-	}
-
-	/*
-	 * @see IStatus#getSeverity()
-	 */
-	public int getSeverity() {
-		return fSeverity;
-	}
-
-	/*
-	 * @see IStatus#getPlugin()
-	 */
-	public String getPlugin() {
-		return JSFUICommonPlugin.getPluginId();
-	}
-
-	/**
-	 * Returns always <code>null</code>.
-	 * 
-	 * @see IStatus#getException()
-	 */
-	public Throwable getException() {
-		return null;
-	}
-
-	/**
-	 * Returns always the error severity.
-	 * 
-	 * @see IStatus#getCode()
-	 */
-	public int getCode() {
-		return fSeverity;
-	}
-
-	/**
-	 * Returns always <code>null</code>.
-	 * 
-	 * @see IStatus#getChildren()
-	 */
-	public IStatus[] getChildren() {
-		return new IStatus[0];
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/StatusUtil.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/StatusUtil.java
deleted file mode 100644
index 22fe6d8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/StatusUtil.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.dialogfield;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jface.dialogs.DialogPage;
-
-/**
- * copied from org.eclipse.jdt.internal.dialogs. Enhanced to support null status
- * as parameter
- * 
- * A utility class to work with IStatus.
- */
-public class StatusUtil {
-
-	/**
-	 * Compares two instances of <code>IStatus</code>. The more severe is
-	 * returned: An error is more severe than a warning, and a warning is more
-	 * severe than ok. If the two stati have the same severity, the second is
-	 * returned.
-	 * @param s1 
-	 * @param s2 
-	 * 
-	 * @return Could be null.
-	 */
-	public static IStatus getMoreSevere(IStatus s1, IStatus s2) {
-		if (s1 == null && s2 == null) {
-			return null;
-		} else if (s1 == null) {
-			return s2;
-		} else if (s2 == null) {
-			return s1;
-		} else if (s1.getSeverity() > s2.getSeverity()) {
-			return s1;
-		} else {
-			return s2;
-		}
-	}
-
-	/**
-	 * Finds the most severe status from a array of stati. An error is more
-	 * severe than a warning, and a warning is more severe than ok.
-	 * @param status 
-	 * 
-	 * @return could be null
-	 */
-	public static IStatus getMostSevere(IStatus[] status) {
-		if (status == null)
-			return null;
-		IStatus max = null;
-		for (int i = 0; i < status.length; i++) {
-			IStatus curr = status[i];
-			if (curr == null)
-				continue;
-
-			if (curr.matches(IStatus.ERROR)) {
-				return curr;
-			}
-			if (max == null || curr.getSeverity() > max.getSeverity()) {
-				max = curr;
-			}
-		}
-		if (max != null)
-        {
-			return max;
-        }
-
-        return null;
-	}
-
-	/**
-	 * Applies the status to the status line of a dialog page.
-	 * @param page 
-	 * @param status 
-	 */
-	public static void applyToStatusLine(DialogPage page, IStatus status) {
-		if (status == null) {
-			page.setMessage(null);
-			page.setErrorMessage(null);
-		} else {
-			String message = status.getMessage();
-			switch (status.getSeverity()) {
-			case IStatus.OK:
-				page.setMessage(message, DialogPage.NONE);
-				page.setErrorMessage(null);
-				break;
-			case IStatus.WARNING:
-				page.setMessage(message, DialogPage.WARNING);
-				page.setErrorMessage(null);
-				break;
-			case IStatus.INFO:
-				page.setMessage(message, DialogPage.INFORMATION);
-				page.setErrorMessage(null);
-				break;
-			default:
-				if (message.length() == 0) {
-					message = null;
-				}
-				page.setMessage(null);
-				page.setErrorMessage(message);
-				break;
-			}
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/StringButtonDialogField.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/StringButtonDialogField.java
deleted file mode 100644
index eebc9e5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/StringButtonDialogField.java
+++ /dev/null
@@ -1,186 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.dialogfield;
-
-import org.eclipse.jst.jsf.common.ui.JSFUICommonPlugin;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * Dialog field containing a label, text control and a button control.
- */
-public class StringButtonDialogField extends StringDialogField {
-	private Button _browseButton;
-
-	private String _browseButtonLabel;
-
-	private IStringButtonAdapter _stringButtonAdapter;
-
-	private boolean _buttonEnabled;
-
-	/**
-	 * @param adapter
-	 */
-	public StringButtonDialogField(IStringButtonAdapter adapter) {
-		_stringButtonAdapter = adapter;
-		_browseButtonLabel = JSFUICommonPlugin
-				.getResourceString("DialogField.Browse"); //$NON-NLS-1$
-		_buttonEnabled = true;
-	}
-
-	/**
-	 * Sets the label of the button.
-	 * @param label 
-	 */
-	public void setButtonLabel(String label) {
-		_browseButtonLabel = label;
-	}
-
-	// ------ adapter communication
-
-	/**
-	 * Programmatical pressing of the button
-	 */
-	public void changeControlPressed() {
-		_stringButtonAdapter.changeControlPressed(this);
-	}
-
-	// ------- layout helpers
-
-	/*
-	 * @see DialogField#doFillIntoGrid
-	 */
-	public Control[] doFillIntoGrid(FormToolkit toolkit, Composite parent,
-			int nColumns) {
-		assertEnoughColumns(nColumns);
-
-		Control requiredLabel = getRequiredLabelControl(toolkit, parent);
-		requiredLabel.setLayoutData(gridDataForLabel(1));
-
-		Control label = getLabelControl(toolkit, parent);
-		label.setLayoutData(gridDataForLabel(1));
-
-		Text text = getTextControl(toolkit, parent);
-		text.setLayoutData(gridDataForText(nColumns - 3));
-		Button button = getChangeControl(toolkit, parent);
-		button.setLayoutData(gridDataForButton(toolkit, button, text, 1));
-
-		return new Control[] { requiredLabel, label, text, button };
-	}
-
-	/*
-	 * @see DialogField#getNumberOfControls
-	 */
-	public int getNumberOfControls() {
-		return 4;
-	}
-
-	/**
-	 * @param toolkit
-	 * @param button
-	 * @param text
-	 * @param span
-	 * @return the grid data for the button
-	 */
-	protected static GridData gridDataForButton(FormToolkit toolkit,
-			Button button, Text text, int span) {
-		GridData gd = new GridData();
-		gd.horizontalAlignment = GridData.FILL;
-		gd.grabExcessHorizontalSpace = false;
-		gd.horizontalSpan = span;
-		// gd.heightHint = SWTUtil.getButtonHeightHint(button);
-		gd.widthHint = LayoutUtil.getButtonWidthHint(button);
-		gd.heightHint = LayoutUtil.getButtonHeightHint(toolkit, text);
-		return gd;
-	}
-
-	// ------- ui creation
-
-	/**
-	 * Creates or returns the created buttom widget.
-	 * @param toolkit 
-	 * 
-	 * @param parent
-	 *            The parent composite or <code>null</code> if the widget has
-	 *            already been created.
-	 * @return the button
-	 */
-	public Button getChangeControl(FormToolkit toolkit, Composite parent) {
-		if (_browseButton == null || _browseButton.isDisposed()) {
-			assertCompositeNotNull(parent);
-			if (toolkit != null) {
-				_browseButton = toolkit.createButton(parent,
-						_browseButtonLabel, SWT.PUSH);
-			} else {
-				_browseButton = new Button(parent, SWT.PUSH);
-				_browseButton.setText(_browseButtonLabel);
-			}
-			_browseButton.setEnabled(isEnabled() && _buttonEnabled);
-			_browseButton.addSelectionListener(new SelectionListener() {
-				public void widgetDefaultSelected(SelectionEvent e) {
-					changeControlPressed();
-				}
-
-				public void widgetSelected(SelectionEvent e) {
-					changeControlPressed();
-				}
-			});
-
-		}
-		return _browseButton;
-	}
-
-	// ------ enable / disable management
-
-	/**
-	 * Sets the enable state of the button.
-	 * @param enable 
-	 */
-	public void enableButton(boolean enable) {
-		if (isOkToUse(_browseButton)) {
-			_browseButton.setEnabled(isEnabled() && enable);
-		}
-		_buttonEnabled = enable;
-	}
-
-	/*
-	 * @see DialogField#updateEnableState
-	 */
-	protected void updateEnableState() {
-		super.updateEnableState();
-		if (isOkToUse(_browseButton)) {
-			_browseButton.setEnabled(isEnabled() && _buttonEnabled);
-		}
-	}
-
-	/**
-	 * @return Returns the _stringButtonAdapter.
-	 */
-	public IStringButtonAdapter getStringButtonAdapter() {
-		return _stringButtonAdapter;
-	}
-
-	/**
-	 * @param buttonAdapter
-	 *            The _stringButtonAdapter to set.
-	 */
-	public void setStringButtonAdapter(IStringButtonAdapter buttonAdapter) {
-		_stringButtonAdapter = buttonAdapter;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/StringDialogField.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/StringDialogField.java
deleted file mode 100644
index bf334a5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/StringDialogField.java
+++ /dev/null
@@ -1,291 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.dialogfield;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.FocusAdapter;
-import org.eclipse.swt.events.FocusEvent;
-import org.eclipse.swt.events.KeyAdapter;
-import org.eclipse.swt.events.KeyEvent;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * Dialog field containing a label and a text control.
- */
-public class StringDialogField extends DialogFieldBase implements
-		ISupportTextValue {
-	final static private int TEXT_WIDTH_HINT = 10;
-
-	private String _text;
-
-	private Text _textControl;
-
-	private ModifyListener _modifyListener;
-
-	private int _numRows;
-
-	/**
-	 * whether there is change in the UI but not fire applied event yet.
-	 */
-	private boolean _pending = false;
-
-	/**
-	 * default constructor
-	 * numRows == 1
-	 */
-	public StringDialogField() {
-		this(1);
-		_text = ""; //$NON-NLS-1$
-	}
-
-	/**
-	 * @param numRows
-	 */
-	public StringDialogField(int numRows) {
-		super();
-		_text = ""; //$NON-NLS-1$
-		_numRows = numRows;
-	}
-
-	// ------- layout helpers
-
-	/*
-	 * @see DialogField#doFillIntoGrid
-	 */
-	public Control[] doFillIntoGrid(FormToolkit kit, Composite parent,
-			int nColumns) {
-		assertEnoughColumns(nColumns);
-
-		Control requiredLabel = getRequiredLabelControl(kit, parent);
-		requiredLabel.setLayoutData(gridDataForLabel(1));
-
-		Control label = getLabelControl(kit, parent);
-		label.setLayoutData(gridDataForLabel(1));
-
-		Text text = getTextControl(kit, parent);
-		int heightHint = -1;
-		if (_numRows > 1) {
-			heightHint = getDialogUnits(parent).getHeight() * _numRows;
-		}
-		text.setLayoutData(gridDataForText(nColumns - 2, heightHint));
-
-		return new Control[] { requiredLabel, label, text };
-	}
-
-	/*
-	 * @see DialogField#getNumberOfControls
-	 */
-	public int getNumberOfControls() {
-		return 3;
-	}
-
-	protected static GridData gridDataForLabel(int span) {
-		GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
-		gd.horizontalSpan = span;
-		return gd;
-	}
-
-	/**
-	 * @param span
-	 * @param heightHint
-	 * @return the grid data for text
-	 */
-	protected static GridData gridDataForText(int span, int heightHint) {
-		GridData gd = new GridData();
-		gd.horizontalAlignment = GridData.FILL;
-		gd.grabExcessHorizontalSpace = false;
-		gd.heightHint = heightHint;
-		gd.horizontalSpan = span;
-		gd.widthHint = TEXT_WIDTH_HINT;
-		return gd;
-	}
-
-	/**
-	 * @param span
-	 * @return the grid data for text
-	 */
-	protected static GridData gridDataForText(int span) {
-		GridData gd = gridDataForText(span, -1);
-		return gd;
-	}
-
-	// ------- focus methods
-
-	/*
-	 * @see DialogField#setFocus
-	 */
-	public boolean setFocus() {
-		if (isOkToUse(_textControl)) {
-			_textControl.setFocus();
-			_textControl.setSelection(0, _textControl.getText().length());
-		}
-		return true;
-	}
-
-	// ------- ui creation
-
-	/**
-	 * Creates or returns the created text control.
-	 * @param toolkit 
-	 * 
-	 * @param parent
-	 *            The parent composite or <code>null</code> when the widget
-	 *            has already been created.
-	 * @return the text control
-	 */
-	public Text getTextControl(FormToolkit toolkit, Composite parent) {
-		if (_textControl == null || _textControl.isDisposed()) {
-			assertCompositeNotNull(parent);
-			_modifyListener = new ModifyListener() {
-				public void modifyText(ModifyEvent e) {
-					doModifyText(e);
-				}
-			};
-
-			if (toolkit != null) {
-				if (_numRows <= 1) {
-					_textControl = toolkit.createText(parent, ""); //$NON-NLS-1$
-				} else {
-					_textControl = toolkit.createText(parent, "", SWT.V_SCROLL); //$NON-NLS-1$
-				}
-			} else {
-				if (_numRows <= 1) {
-
-					_textControl = new Text(parent, SWT.SINGLE | SWT.BORDER);
-				} else {
-					_textControl = new Text(parent, SWT.V_SCROLL | SWT.WRAP
-							| SWT.BORDER);
-				}
-			}
-
-			_textControl.setText(_text);
-			_textControl.setFont(parent.getFont());
-			_textControl.addModifyListener(_modifyListener);
-			_textControl.addFocusListener(new FocusAdapter() {
-
-				public void focusLost(FocusEvent e) {
-					doFocusLost(e);
-				}
-
-			});
-			_textControl.addKeyListener(new KeyAdapter() {
-				public void keyReleased(KeyEvent e) {
-					doKeyReleased(e);
-				}
-			});
-
-			_textControl.setEnabled(isEnabled());
-
-			_textControl.setToolTipText(getToolTip());
-		}
-		return _textControl;
-	}
-
-	/**
-	 * @param e
-	 */
-	protected void doKeyReleased(KeyEvent e) {
-		if (e.character == '\r') {
-			// commit value
-			if (_pending) {
-				_pending = false;
-				dialogFieldApplied();
-			}
-		}
-	}
-
-	/**
-	 * @param e
-	 */
-	protected void doFocusLost(FocusEvent e) {
-		if (_pending) {
-			_pending = false;
-			dialogFieldApplied();
-		}
-	}
-
-	/**
-	 * some get changed in the Text. As in <code>setText</code> and
-	 * <code>setTextWithoutUpdate</code> we removed the listener, so this must
-	 * be user typing in the text field.
-	 * 
-	 * @param e
-	 */
-	private void doModifyText(ModifyEvent e) {
-		if (isOkToUse(_textControl)) {
-			_text = _textControl.getText();
-		}
-		_pending = true;
-		dialogFieldChanged();
-	}
-
-	// ------ enable / disable management
-
-	/*
-	 * @see DialogField#updateEnableState
-	 */
-	protected void updateEnableState() {
-		super.updateEnableState();
-		if (isOkToUse(_textControl)) {
-			_textControl.setEnabled(isEnabled());
-		}
-	}
-
-	// ------ text access
-
-	/**
-	 * Gets the text. Can not be <code>null</code>
-	 */
-	public String getText() {
-		return _text;
-	}
-
-	/**
-	 * Sets the text. Triggers a dialog-changed event.
-	 */
-	public void setText(String text) {
-		setTextWithoutUpdate(text);
-		dialogFieldChangedAndApplied();
-	}
-
-	/**
-	 * Sets the text without triggering a dialog-changed event.
-	 */
-	public void setTextWithoutUpdate(String text) {
-		// reset _pending state.
-		_pending = false;
-
-		if (text == null)
-			text = ""; //$NON-NLS-1$
-		_text = text;
-		if (isOkToUse(_textControl)) {
-			_textControl.removeModifyListener(_modifyListener);
-			_textControl.setText(text);
-			_textControl.addModifyListener(_modifyListener);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField#handleGrabHorizontal()
-	 */
-	public void handleGrabHorizontal() {
-		LayoutUtil.setGrabHorizontal(_textControl, true);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/StyleComboDialogField.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/StyleComboDialogField.java
deleted file mode 100644
index 93c9332..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/StyleComboDialogField.java
+++ /dev/null
@@ -1,398 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.dialogfield;
-
-import java.util.Map;
-import java.util.TreeMap;
-import java.util.Map.Entry;
-
-import org.eclipse.jst.jsf.common.ui.internal.utils.StyleCombo;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
-import org.eclipse.swt.events.FocusAdapter;
-import org.eclipse.swt.events.FocusEvent;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.PaintEvent;
-import org.eclipse.swt.events.PaintListener;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.forms.FormColors;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * A dialog field for style combos
- *
- */
-public class StyleComboDialogField extends DialogFieldBase implements
-		ISupportTextValue {
-	final static private int WIDTH_HINT = 10;
-
-	private String _text;
-
-	private int _selectionIndex;
-
-	private String[] _items;
-
-	private StyleCombo _comboControl;
-
-	private ModifyListener _modifyListener;
-
-	private int _flags;
-
-	private boolean _pending = false;
-
-	private Map _entryMap;
-
-	private String _defaultValue;
-
-
-	/**
-	 * @param defaultValue
-	 */
-	public void setDefaultValue(String defaultValue) {
-		this._defaultValue = defaultValue;
-		if (_comboControl != null && ! _comboControl.isDisposed())
-			_comboControl.setDefaultValue(_defaultValue);
-	}
-
-	/**
-	 * @param flags
-	 */
-	public StyleComboDialogField(int flags) {
-		super();
-		_text = ""; //$NON-NLS-1$
-		_items = new String[0];
-		_flags = flags;
-		_selectionIndex = -1;
-	}
-
-	// ------- layout helpers
-
-
-	/*
-	 * @see DialogField#doFillIntoGrid
-	 */
-	public Control[] doFillIntoGrid(FormToolkit toolkit, Composite parent,
-			int nColumns) {
-		assertEnoughColumns(nColumns);
-
-		Control requiredLabel = getRequiredLabelControl(toolkit, parent);
-		requiredLabel.setLayoutData(gridDataForLabel(1));
-
-		Control label = getLabelControl(toolkit, parent);
-		label.setLayoutData(gridDataForLabel(1));
-
-		StyleCombo combo = getComboControl(toolkit, parent);
-		combo.setLayoutData(gridDataForCombo(nColumns - 2));
-
-		return new Control[] { requiredLabel, label, combo };
-	}
-
-	/*
-	 * @see DialogField#getNumberOfControls
-	 */
-	public int getNumberOfControls() {
-		return 3;
-	}
-
-	/**
-	 * @param span
-	 * @return the grid data for the combo
-	 */
-	protected static GridData gridDataForCombo(int span) {
-		GridData gd = new GridData();
-		gd.horizontalAlignment = GridData.FILL;
-		gd.grabExcessHorizontalSpace = false;
-		gd.horizontalSpan = span;
-		gd.widthHint = WIDTH_HINT;
-		return gd;
-	}
-
-	// ------- focus methods
-
-	/*
-	 * @see DialogField#setFocus
-	 */
-	public boolean setFocus() {
-		if (isOkToUse(_comboControl)) {
-			_comboControl.setFocus();
-		}
-		return true;
-	}
-
-	// ------- ui creation
-
-	/**
-	 * Creates or returns the created combo control.
-	 * @param toolkit 
-	 * 
-	 * @param parent
-	 *            The parent composite or <code>null</code> when the widget
-	 *            has already been created.
-	 * @return the combo control
-	 */
-	public StyleCombo getComboControl(FormToolkit toolkit,
-			final Composite parent) {
-		if (_comboControl == null || _comboControl.isDisposed()) {
-			assertCompositeNotNull(parent);
-			_modifyListener = new ModifyListener() {
-				public void modifyText(ModifyEvent e) {
-					doModifyText(e);
-				}
-			};
-			SelectionListener selectionListener = new SelectionListener() {
-				public void widgetSelected(SelectionEvent e) {
-					doSelectionChanged(e);
-				}
-
-				public void widgetDefaultSelected(SelectionEvent e) {
-					handleDefaultSelection(e);
-				}
-			};
-
-			if (toolkit != null) {
-				_comboControl = new StyleCombo(parent, _flags);
-                final FormColors colors = new FormColors(parent.getDisplay());
-				parent.addPaintListener(new PaintListener() {
-
-					public void paintControl(PaintEvent event) {
-						Composite composite = (Composite) event.widget;
-						Control[] children = composite.getChildren();
-						for (int i = 0; i < children.length; i++) {
-							Control c = children[i];
-							if (!(c instanceof StyleCombo) || !c.isVisible()) {
-								continue;
-							}
-							Rectangle b = c.getBounds();
-							GC gc = event.gc;
-							gc.setForeground(colors.getBorderColor());
-							gc.drawRectangle(b.x - 1, b.y - 1, b.width + 1,
-									b.height + 1);
-						}
-					}
-				});
-                
-                // when the parent is disposed, the colors should no
-                // no longer be needed.
-                parent.addDisposeListener(new DisposeListener()
-                {
-                    public void widgetDisposed(DisposeEvent e) {
-                        colors.dispose();
-                    }
-                }
-                );
-				toolkit.adapt(_comboControl);
-			} else {
-				_comboControl = new StyleCombo(parent, _flags | SWT.BORDER);
-				_comboControl.setBackground(Display.getCurrent()
-						.getSystemColor(SWT.COLOR_LIST_BACKGROUND));
-			}
-
-			// moved up due to 1GEUNW2
-			_comboControl.setItems(_items);
-			_comboControl.setDefaultValue(_defaultValue);
-			if (_selectionIndex != -1) {
-				_comboControl.select(_selectionIndex);
-			} else {
-				_comboControl.setText(_text);
-			}
-			_comboControl.setFont(parent.getFont());
-			_comboControl.addModifyListener(_modifyListener);
-			_comboControl.addSelectionListener(selectionListener);
-			_comboControl.addFocusListener(new FocusAdapter() {
-				public void focusLost(FocusEvent e) {
-					doFocusLost(e);
-				}
-			});
-			_comboControl.setEnabled(isEnabled());
-			_comboControl.setToolTipText(getToolTip());
-		}
-		return _comboControl;
-	}
-
-	/**
-	 * @param e
-	 */
-	protected void handleDefaultSelection(SelectionEvent e) {
-		// commit value
-		if (_pending) {
-			_pending = false;
-			dialogFieldApplied();
-		}
-	}
-
-	/**
-	 * @param e
-	 */
-	protected void doFocusLost(FocusEvent e) {
-		if (_pending) {
-			_pending = false;
-			dialogFieldApplied();
-		}
-	}
-
-	private void doModifyText(ModifyEvent e) {
-		if (isOkToUse(_comboControl)) {
-			_text = getEntryKey(_comboControl.getText());
-			_selectionIndex = _comboControl.getSelectionIndex();
-		}
-		_pending = true;
-		dialogFieldChanged();
-	}
-
-	private void doSelectionChanged(SelectionEvent e) {
-		if (isOkToUse(_comboControl)) {
-			_items = _comboControl.getItems();
-			_text = getEntryKey(_comboControl.getText());
-			_selectionIndex = _comboControl.getSelectionIndex();
-		}
-		_pending = false;
-		dialogFieldChangedAndApplied();
-	}
-
-	// ------ enable / disable management
-
-	/*
-	 * @see DialogField#updateEnableState
-	 */
-	protected void updateEnableState() {
-		super.updateEnableState();
-		if (isOkToUse(_comboControl)) {
-			_comboControl.setEnabled(isEnabled());
-		}
-	}
-
-	// ------ text access
-
-	/**
-	 * Sets the combo items. Triggers a dialog-changed event.
-	 * @param items 
-	 */
-	public void setItems(String[] items) {
-		_items = items;
-		if (isOkToUse(_comboControl)) {
-			_comboControl.setItems(items);
-		}
-		_pending = false;
-		// dialogFieldChangedAndApplied();
-	}
-
-	/**
-	 * @param map
-	 */
-	public void setEntryMap(Map map) {
-		this._entryMap = map;
-		if (_entryMap == null) {
-			_entryMap = new TreeMap();
-		}
-		Entry[] entries = (Entry[]) _entryMap.entrySet().toArray(new Entry[0]);
-		String[] items = new String[entries.length];
-		for (int i = 0; i < entries.length; i++) {
-			items[i] = entries[i].getValue().toString();
-		}
-		setItems(items);
-	}
-
-	/**
-	 * Gets the text.
-	 */
-	public String getText() {
-		return _text;
-	}
-
-	/**
-	 * Sets the text. Triggers a dialog-changed event.
-	 */
-	public void setText(String text) {
-		setTextWithoutUpdate(text);
-		_pending = false;
-		dialogFieldChangedAndApplied();
-	}
-
-	/**
-	 * Selects an item.
-	 * @param index 
-	 */
-	public void selectItem(int index) {
-		if (isOkToUse(_comboControl)) {
-			_comboControl.select(index);
-		} else {
-			if (index >= 0 && index < _items.length) {
-				_text = getEntryKey(_items[index]);
-				_selectionIndex = index;
-			}
-		}
-		dialogFieldChangedAndApplied();
-	}
-
-	/**
-	 * @return the selection index
-	 */
-	public int getSelectionIndex() {
-		return _selectionIndex;
-	}
-
-	/**
-	 * Sets the text without triggering a dialog-changed event.
-	 */
-	public void setTextWithoutUpdate(String text) {
-		_pending = false;
-		if (text == null) {
-			text = "";//$NON-NLS-1$
-		}
-		_text = text;
-		if (isOkToUse(_comboControl)) {
-			_comboControl.removeModifyListener(_modifyListener);
-			_comboControl.setText(getEntryValue(text));
-			_comboControl.addModifyListener(_modifyListener);
-		}
-	}
-
-	private String getEntryValue(String key) {
-		if (_entryMap == null || !_entryMap.containsKey(key)) {
-			return key;
-		}
-		return _entryMap.get(key).toString();
-	}
-
-	private String getEntryKey(String value) {
-		if (_entryMap == null || !_entryMap.containsValue(value)) {
-			return value;
-		}
-
-		Entry[] entries = (Entry[]) _entryMap.entrySet().toArray(new Entry[0]);
-		for (int i = 0; i < entries.length; i++) {
-			if (entries[i].getValue() == value
-					|| (value != null && value.equals(entries[i].getValue()))) {
-				return entries[i].getKey().toString();
-			}
-		}
-		return value;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField#handleGrabHorizontal()
-	 */
-	public void handleGrabHorizontal() {
-		LayoutUtil.setGrabHorizontal(_comboControl, true);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/TypedElementSelectionValidator.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/TypedElementSelectionValidator.java
deleted file mode 100644
index 8d0e091..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/TypedElementSelectionValidator.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.dialogfield;
-
-import java.util.Collection;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.ui.dialogs.ISelectionStatusValidator;
-
-/**
- * Implementation of a <code>ISelectionValidator</code> to validate the type
- * of an element. Empty selections are not accepted.
- * 
- * @author mengbo
- * @version 1.5
- */
-/*package*/ class TypedElementSelectionValidator implements
-		ISelectionStatusValidator {
-
-	private IStatus _fgErrorStatus = new StatusInfo(IStatus.ERROR, ""); //$NON-NLS-1$
-
-	private IStatus _fgOKStatus = new StatusInfo();
-
-	private Class[] _fAcceptedTypes;
-
-	private boolean _fAllowMultipleSelection;
-
-	private Collection _fRejectedElements;
-
-	/**
-	 * @param acceptedTypes
-	 *            The types accepted by the validator
-	 * @param allowMultipleSelection
-	 *            If set to <code>true</code>, the validator allows multiple
-	 *            selection.
-	 */
-	public TypedElementSelectionValidator(Class[] acceptedTypes,
-			boolean allowMultipleSelection) {
-		this(acceptedTypes, allowMultipleSelection, null);
-	}
-
-	/**
-	 * @param acceptedTypes
-	 *            The types accepted by the validator
-	 * @param allowMultipleSelection
-	 *            If set to <code>true</code>, the validator allows multiple
-	 *            selection.
-	 * @param rejectedElements
-	 *            A list of elements that are not accepted
-	 */
-	public TypedElementSelectionValidator(Class[] acceptedTypes,
-			boolean allowMultipleSelection, Collection rejectedElements) {
-		Assert.isNotNull(acceptedTypes);
-		_fAcceptedTypes = acceptedTypes;
-		_fAllowMultipleSelection = allowMultipleSelection;
-		_fRejectedElements = rejectedElements;
-	}
-
-	/*
-	 * @see org.eclipse.ui.dialogs.ISelectionValidator#isValid(java.lang.Object)
-	 */
-	public IStatus validate(Object[] elements) {
-		if (isValid(elements)) {
-			return _fgOKStatus;
-		}
-		return _fgErrorStatus;
-	}
-
-	private boolean isOfAcceptedType(Object o) {
-		for (int i = 0; i < _fAcceptedTypes.length; i++) {
-			if (_fAcceptedTypes[i].isInstance(o)) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	private boolean isRejectedElement(Object elem) {
-		return (_fRejectedElements != null)
-				&& _fRejectedElements.contains(elem);
-	}
-
-	private boolean isValid(Object[] selection) {
-		if (selection.length == 0) {
-			return false;
-		}
-
-		if (!_fAllowMultipleSelection && selection.length != 1) {
-			return false;
-		}
-
-		for (int i = 0; i < selection.length; i++) {
-			Object o = selection[i];
-			if (!isOfAcceptedType(o) || isRejectedElement(o)) {
-				return false;
-			}
-		}
-		return true;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/TypedViewerFilter.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/TypedViewerFilter.java
deleted file mode 100644
index 52ecb6a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/TypedViewerFilter.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.dialogfield;
-
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-
-/**
- * Viewer filter used in selection dialogs.
- * 
- * @author mengbo
- * @version 1.5
- */
-/*package*/ class TypedViewerFilter extends ViewerFilter {
-
-	private Class[] _fAcceptedTypes;
-
-	private Object[] _fRejectedElements;
-
-	/**
-	 * Creates a filter that only allows elements of gives types.
-	 * 
-	 * @param acceptedTypes
-	 *            The types of accepted elements
-	 */
-	public TypedViewerFilter(Class[] acceptedTypes) {
-		this(acceptedTypes, null);
-	}
-
-	/**
-	 * Creates a filter that only allows elements of gives types, but not from a
-	 * list of rejected elements.
-	 * 
-	 * @param acceptedTypes
-	 *            Accepted elements must be of this types
-	 * @param rejectedElements
-	 *            Element equals to the rejected elements are filtered out
-	 */
-	public TypedViewerFilter(Class[] acceptedTypes, Object[] rejectedElements) {
-		Assert.isNotNull(acceptedTypes);
-		_fAcceptedTypes = acceptedTypes;
-		_fRejectedElements = rejectedElements;
-	}
-
-	/**
-	 * @see ViewerFilter#select(org.eclipse.jface.viewers.Viewer,
-	 *      java.lang.Object, java.lang.Object)
-	 */
-	public boolean select(Viewer viewer, Object parentElement, Object element) {
-		if (_fRejectedElements != null) {
-			for (int i = 0; i < _fRejectedElements.length; i++) {
-				if (element.equals(_fRejectedElements[i])) {
-					return false;
-				}
-			}
-		}
-		for (int i = 0; i < _fAcceptedTypes.length; i++) {
-			if (_fAcceptedTypes[i].isInstance(element)) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogs/CommonResourceDialog.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogs/CommonResourceDialog.java
deleted file mode 100644
index debc2f9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogs/CommonResourceDialog.java
+++ /dev/null
@@ -1,368 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.dialogs;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.jst.jsf.common.ui.JSFUICommonPlugin;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.jsf.common.ui.internal.utils.WebrootUtil;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.model.WorkbenchLabelProvider;
-import org.eclipse.ui.views.navigator.ResourceComparator;
-
-/**
- * This dialog shows IFile type resources within a IProject domain for
- * selection. The client can prvide the suffixs of files to filter when
- * candidates are shown on the tree.
- * 
- * The usage: Shell shell = new Shell(); IProject project = getProject();
- * CommonResourceDialog dlg = new CommonResourceDialog(shell, project);
- * dlg.setResourceDescription("image"); dlg.setSuffixs(new
- * String[]{"bmp","jpg","gif"}); if(dlg.open() == Window.OK) { IFile
- * selectedFile = (IFile)dlg.getResult()[0]; }
- * 
- * Note: In code above, what you get is an absolute resource path. You can use
- * <code>org.eclipse.wst.sse.core.util.PathHelper.convertToRelative(String input, String base)</code>
- * to convert a absolute resource path to a relative path based on one path.
- * 
- * @author mengbo
- */
-public class CommonResourceDialog extends TreeViewerSelectionDialog {
-	private static Logger _log = JSFUICommonPlugin
-			.getLogger(CommonResourceDialog.class);
-
-	// private static final String STATUS_MESSAGE_0 = CommonPlugin
-	// .getResourceString("Dialog.CommonResourceDialog.StatusMessage0");
-	// //$NON-NLS-1$
-
-	private IProject _project = null;
-
-	private String _suffixs[] = null;
-
-	private CommonResourceFilter _filter = null;
-
-	// The resource type resourceDescription, such as "image", "jsp", "java
-	// class" etc.
-	private String _resourceDescription = null;
-
-	private IFolder _folder;
-
-	// The content provider
-	class ProjectFileDialogContentProvider implements ITreeContentProvider {
-		/**
-		 * The visual part that is using this content provider is about to be
-		 * disposed. Deallocate all allocated SWT resources.
-		 */
-		public void dispose() {
-            // nothing to dispose
-		}
-
-		/**
-		 * @see ITreeContentProvider#getChildren
-		 */
-		public Object[] getChildren(Object element) {
-			if (element instanceof Object[]) {
-				return (Object[]) element;
-			} else if (element instanceof IContainer) {
-				IContainer container = (IContainer) element;
-				if (container.isAccessible()) {
-					try {
-						return container.members();
-					} catch (CoreException e) {
-						_log.error(
-								"Error.ProjectFileDialogContentProvider.0", e); //$NON-NLS-1$
-					}
-				}
-
-			}
-			return new Object[0];
-		}
-
-		/**
-		 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(Object)
-		 */
-		public Object[] getElements(Object element) {
-			return getChildren(element);
-		}
-
-		/**
-		 * @see ITreeContentProvider#getParent
-		 */
-		public Object getParent(Object element) {
-			if (element instanceof IResource) {
-				return ((IResource) element).getParent();
-			}
-			return null;
-		}
-
-		/**
-		 * @see ITreeContentProvider#hasChildren
-		 */
-		public boolean hasChildren(Object element) {
-			return getChildren(element).length > 0;
-		}
-
-		/**
-		 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(Viewer, Object, Object)
-		 */
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-            // no viewer change support required
-		}
-
-	}
-
-	// The default resource filter
-	class CommonResourceFilter extends ViewerFilter {
-		private String _filterSuffixs[] = null;
-
-		/**
-		 * @return Returns the _suffixs.
-		 */
-		public String[] getSuffixs() {
-			return _filterSuffixs;
-		}
-
-		/**
-		 * @param _suffixs
-		 *            The _suffixs to set.
-		 */
-		public void setSuffixs(String[] _suffixs) {
-			this._filterSuffixs = _suffixs;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.ViewerFilter#select(org.eclipse.jface.viewers.Viewer,
-		 *      java.lang.Object, java.lang.Object)
-		 */
-		public boolean select(Viewer viewer, Object parentElement,
-				Object element) {
-			if (element instanceof IFile) {
-				IFile file = (IFile) element;
-				if (!WebrootUtil.isUnderWebContentFolder(file)) {
-					return false;
-				}
-				if (isSuffixBlank()) {
-					return true;
-				}
-				if (file.getFileExtension() != null) {
-					if (Arrays.asList(_filterSuffixs).contains(
-							file.getFileExtension().toLowerCase())) {
-						return true;
-					}
-				}
-			} else if (element instanceof IContainer) {
-				if (!((IContainer) element).isAccessible()) {
-					return false;
-				}
-				if (element instanceof IProject) {
-					return true;
-				} else if (element instanceof IFolder) {
-					IContainer container = (IContainer) element;
-					try {
-						IResource[] members = container.members();
-						for (int i = 0; i < members.length; i++) {
-							if (select(viewer, members[i].getParent(),
-									members[i])) {
-								return true;
-							}
-						}
-					} catch (CoreException e) {
-						_log.error(
-								"Error.ProjectFileDialogContentProvider.0", e); //$NON-NLS-1$
-						return false;
-					}
-				}
-			}
-			return false;
-		}
-
-	}
-
-	/**
-	 * This is a dialog for common resource selection, the resouce supported
-	 * include IFolder, IProject, IFile, user can provide
-	 * 
-	 * @param parentShell
-	 * @param project
-	 * @param style 
-	 */
-	public CommonResourceDialog(Shell parentShell, IProject project, int style) {
-		super(parentShell, "", style); //$NON-NLS-1$
-		if (project == null) {
-			throw new IllegalArgumentException(
-					"Argument(project) cannot be null"); //$NON-NLS-1$
-		}
-		_project = project;
-		setContentProvider(new ProjectFileDialogContentProvider());
-		setLabelProvider(WorkbenchLabelProvider
-				.getDecoratingWorkbenchLabelProvider());
-		_filter = new CommonResourceFilter();
-		setFilter(_filter);
-		setViewerComparator(new ResourceComparator(ResourceComparator.TYPE));
-		_project = project;
-		setStatusMessage(getStatusMessage());
-	}
-
-	/**
-	 * Same as CommonResourceDialog(parentShell, project, SWT.NONE)
-	 * 
-	 * @param parentShell
-	 * @param project
-	 */
-	public CommonResourceDialog(Shell parentShell, IProject project) {
-		this(parentShell, project, SWT.NONE);
-	}
-
-	private String getStatusMessage() {
-		if (_resourceDescription == null) {
-			return ""; //$NON-NLS-1$
-		}
-		return _resourceDescription;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.ui.common.SelectionTreeViewerDialog#findInputElement()
-	 */
-	protected Object findInputElement() {
-		if (_folder != null) {
-			return new Object[] { _folder, };
-		}
-		return new Object[] { _project, };
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.ui.common.SelectionTreeViewerDialog#isValidSelection(java.lang.Object)
-	 */
-	protected boolean isValidSelection(Object selection) {
-		if (selection instanceof Object[]) {
-			for (int i = 0, n = ((Object[]) selection).length; i < n; i++) {
-				if (isValidElement(((Object[]) selection)[i]) == true) {
-					return true;
-				}
-			}
-			return false;
-		}
-        return isValidElement(selection);
-	}
-
-	private boolean isValidElement(Object selection) {
-		if ((selection instanceof IFile)) {
-			// Null means no filter is set
-			if (isSuffixBlank()) {
-				return true;
-			}
-			// The extension is supported?
-			else if (_suffixs != null
-					&& Arrays.asList(_suffixs).contains(
-							((IFile) selection).getFileExtension()
-									.toLowerCase())) {
-				return true;
-			}
-		}
-		// None of above conditions, invalid.
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.dialogs.SelectionDialog#getResult()
-	 */
-	public Object[] getResult() {
-		Object[] objects = super.getResult();
-		if (objects == null || objects.length == 0) {
-			return null;
-		}
-		List list = new ArrayList();
-		for (int i = 0; i < objects.length; i++) {
-			if (objects[i] instanceof IFile) {
-				list.add(objects[i]);
-			}
-		}
-		return list.toArray();
-	}
-
-	/**
-	 * @param suffixs
-	 *            The suffixs to set.
-	 */
-	public void setSuffixs(String[] suffixs) {
-		this._suffixs = convertTolowercase(suffixs);
-		_filter.setSuffixs(_suffixs);
-		setStatusMessage(getStatusMessage());
-	}
-
-	private String[] convertTolowercase(String[] suffixs) {
-		if (suffixs != null) {
-			String[] newSuffixs = new String[suffixs.length];
-			for (int i = 0; i < suffixs.length; i++) {
-				newSuffixs[i] = suffixs[i].toLowerCase();
-			}
-			return newSuffixs;
-		}
-		return null;
-	}
-
-	/**
-	 * @return Returns the sourceDescription.
-	 */
-	public String getResourceDescription() {
-		return _resourceDescription;
-	}
-
-	/**
-	 * @param sourceDescription
-	 *            The sourceDescription to set.
-	 */
-	public void setResourceDescription(String sourceDescription) {
-		this._resourceDescription = sourceDescription;
-		setStatusMessage(getStatusMessage());
-	}
-
-	private boolean isSuffixBlank() {
-		boolean isSuffixBlank = false;
-		if (_suffixs == null) {
-			isSuffixBlank = true;
-		} else {
-			int count = 0;
-			for (int i = 0, size = _suffixs.length; i < size; i++) {
-				if (_suffixs[i] != null && !"".equals(_suffixs[i])) { //$NON-NLS-1$
-					count++;
-					break;
-				}
-			}
-			if (count == 0) {
-				isSuffixBlank = true;
-			}
-		}
-		return isSuffixBlank;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogs/CommonWizardDialog.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogs/CommonWizardDialog.java
deleted file mode 100644
index 3fd719c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogs/CommonWizardDialog.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.dialogs;
-
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.wizard.IWizard;
-import org.eclipse.jface.wizard.WizardDialog;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * Wizard Dialog with a Finish set to OK if no previous
- * or next buttons are needed
- *
- */
-public class CommonWizardDialog extends WizardDialog {
-
-	/**
-	 * @param parentShell
-	 * @param newWizard
-	 */
-	public CommonWizardDialog(Shell parentShell, IWizard newWizard) {
-		super(parentShell, newWizard);
-	}
-
-	protected void createButtonsForButtonBar(Composite parent) {
-		super.createButtonsForButtonBar(parent);
-
-		IWizard wizard = getWizard();
-		if (!wizard.needsPreviousAndNextButtons()) {
-			getButton(IDialogConstants.FINISH_ID).setText(
-					IDialogConstants.OK_LABEL);
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogs/ResourceOnClasspathDialog.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogs/ResourceOnClasspathDialog.java
deleted file mode 100644
index 934957d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogs/ResourceOnClasspathDialog.java
+++ /dev/null
@@ -1,254 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.dialogs;
-
-import java.io.File;
-import java.util.Arrays;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.jdt.core.IJarEntryResource;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.ui.JavaElementLabelProvider;
-import org.eclipse.jdt.ui.StandardJavaElementContentProvider;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.jst.jsf.common.ui.IFileFolderConstants;
-import org.eclipse.jst.jsf.common.ui.JSFUICommonPlugin;
-import org.eclipse.jst.jsf.common.ui.internal.utils.PathUtil;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * This dialog will let client to select resources that located on a
- * IJavaProject classpath, the client can provide a list of files suffixs to
- * filter.
- * 
- * @author mengbo
- */
-// TODO: Since many jar files might do nothing to do with client's selection, we
-// may need to provides more filter choice
-// to clients to exclude unnecessary jar files, such as that are located in JDK
-// dir.
-public class ResourceOnClasspathDialog extends TreeViewerSelectionDialog {
-	// ResourcesOnClasspathDialog.statusMessage = Please select a property file
-	private static final String STATUS_MESSAGE = JSFUICommonPlugin
-			.getResourceString("Dialog.ResourceOnClasspathDialog.StatusMessage"); //$NON-NLS-1$
-
-	private IJavaProject _javaProject;
-
-	// the suffixs of files that can be selected
-	private String _suffixs[];
-
-	// IJMTConstants.DEFAULT_SUFFIX;
-
-	private ResourceOnClasspathFilter _filter;
-
-	// Client doesn't need to know it.
-	class ResourceOnClasspathFilter extends ViewerFilter {
-		StandardJavaElementContentProvider _javaContentProvider;
-
-		/**
-		 * @param contentProvider
-		 */
-		public ResourceOnClasspathFilter(
-				StandardJavaElementContentProvider contentProvider) {
-			_javaContentProvider = contentProvider;
-		}
-
-		/**
-		 * Set the suffixs of files need to be selected.
-		 * 
-		 * @param suffixs
-		 */
-		public void setSuffixs(String suffixs[]) {
-			_suffixs = suffixs;
-		}
-
-		/**
-		 * @param contentProvider
-		 *            The _javaContentProvider to set.
-		 */
-		public void setJavaContentProvider(
-				StandardJavaElementContentProvider contentProvider) {
-			_javaContentProvider = contentProvider;
-		}
-
-		/**
-		 * @param project
-		 *            The _javaProject to set.
-		 */
-		public void setJavaProject(IJavaProject project) {
-			_javaProject = project;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.ViewerFilter#select(org.eclipse.jface.viewers.Viewer,
-		 *      java.lang.Object, java.lang.Object)
-		 */
-		public boolean select(Viewer viewer, Object parentElement,
-				Object element) {
-			// TODO: This logic can be improved by add caching mechanism
-			if (element instanceof IJavaProject) {
-				String currentProjectName = ((IJavaProject) element)
-						.getProject().getFullPath().toString().trim();
-				String projectName = _javaProject.getProject().getFullPath()
-						.toString().trim();
-				if (projectName.equalsIgnoreCase(currentProjectName)) {
-					return true;
-				}
-                return false;
-			} else if (element instanceof IResource) {
-				if (((_javaProject != null) && !_javaProject
-						.isOnClasspath((IResource) element))) {
-					return false;
-				}
-				if (element instanceof IFile) {
-					if (Arrays.asList(_suffixs).contains(
-							((IFile) element).getFileExtension())) {
-						return true;
-					}
-				}
-				return false;
-			}
-
-			if (element instanceof IJarEntryResource) {
-				String ext = ((IJarEntryResource) element).getFullPath()
-						.getFileExtension();
-				if (ext != null && Arrays.asList(_suffixs).contains(ext)) {
-					return true;
-				}
-                return false;
-			}
-			if (!(element instanceof IJavaElement)) {
-				return false;
-			}
-			if (((_javaProject != null) && !_javaProject
-					.isOnClasspath((IJavaElement) element))) {
-				return false;
-			}
-			IJavaElement javaElement = (IJavaElement) element;
-			Object[] children = null;
-			switch (javaElement.getElementType()) {
-			case IJavaElement.PACKAGE_FRAGMENT_ROOT:
-				children = _javaContentProvider.getChildren(javaElement);
-				break;
-			case IJavaElement.IMPORT_CONTAINER:
-				return true;
-			case IJavaElement.PACKAGE_FRAGMENT:
-				children = _javaContentProvider.getChildren(javaElement);
-				break;
-			case IJavaElement.CLASS_FILE:
-				if (Arrays.asList(_suffixs).contains(
-						IFileFolderConstants.EXT_CLASS)) {
-					return true;
-				} 
-                return false;
-			case IJavaElement.COMPILATION_UNIT:
-				String ext = javaElement.getPath().getFileExtension();
-				if (ext != null && Arrays.asList(_suffixs).contains(ext)) {
-					return true;
-				} 
-                return false;
-			default:
-				return false;
-			}
-
-			for (int i = 0; i < children.length; i++) {
-				if (select(viewer, javaElement, children[i])) {
-					return true;
-				}
-			}
-			// Either the resouce or its children are not for displaying.
-			return false;
-		}
-	}
-
-	/**
-	 * Set the suffixs of files need to be selected.
-	 * 
-	 * @param suffixs
-	 */
-	public void setSuffixs(String suffixs[]) {
-		_suffixs = suffixs;
-		_filter.setSuffixs(suffixs);
-	}
-
-	/**
-	 * @param parentShell
-	 * @param project
-	 */
-	public ResourceOnClasspathDialog(Shell parentShell, IJavaProject project) {
-		super(parentShell, STATUS_MESSAGE);
-		// set provider and filter
-		StandardJavaElementContentProvider contentProvider = new StandardJavaElementContentProvider();
-		setContentProvider(contentProvider);
-		setLabelProvider(new JavaElementLabelProvider());
-		_filter = new ResourceOnClasspathFilter(contentProvider);
-		setFilter(_filter);
-		// store the project
-		_javaProject = project;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.dialogs.SelectionDialog#getResult()
-	 */
-	public Object[] getResult() {
-		Object[] objects = super.getResult();
-		if (objects == null || objects.length == 0) {
-			return null;
-		}
-		IPath path = PathUtil.getPathOnClasspath(_javaProject, objects[0]);
-		String result = null;
-		if (path.segmentCount() == 0) {
-			return new Object[] { "" }; //$NON-NLS-1$
-		}
-		path = path.removeFileExtension();
-		result = path.toOSString();
-		result = result.replace(File.separatorChar, '.');
-		return new Object[] { result };
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.ui.common.SelectionTreeViewerDialog#isValidSelection()
-	 */
-	protected boolean isValidSelection(Object selection) {
-		String extension = PathUtil.getPathOnClasspath(_javaProject, selection)
-				.getFileExtension();
-		return (extension != null && Arrays.asList(_suffixs).contains(extension));
-	}
-
-	protected Object findInputElement() {
-		Object input = ResourcesPlugin.getWorkspace();
-		if (input instanceof IWorkspace) {
-			return JavaCore.create(((IWorkspace) input).getRoot());
-		} else if (input instanceof IContainer) {
-			IJavaElement element = JavaCore.create((IContainer) input);
-			if (element != null && element.exists()) {
-				return element;
-			}
-			return input;
-		}
-        return JavaCore.create(ResourcesPlugin.getWorkspace().getRoot());
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogs/TreeViewerSelectionDialog.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogs/TreeViewerSelectionDialog.java
deleted file mode 100644
index 3214dbd..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogs/TreeViewerSelectionDialog.java
+++ /dev/null
@@ -1,393 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.dialogs;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.jface.viewers.DoubleClickEvent;
-import org.eclipse.jface.viewers.IDoubleClickListener;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.viewers.ViewerComparator;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.jface.viewers.ViewerSorter;
-import org.eclipse.jst.jsf.common.ui.JSFUICommonPlugin;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.dialogs.SelectionDialog;
-import org.eclipse.ui.part.DrillDownComposite;
-
-/**
- * This is a base dialog that uses TreeViewer to show selections, subclass needs
- * to provide IContentProvider, ILabelProvider and ViewerFilter for the
- * TreeViewer. Subclass needs to implement isValidSelection(), which valids the
- * selection, and findInputElement() which provides the root element of the
- * tree. Besides, subclass might need to implement getResult() to return a
- * customized result.
- * 
- * @author mengbo
- * 
- */
-public abstract class TreeViewerSelectionDialog extends SelectionDialog {
-	private static final String DEFAULT_TITLE = JSFUICommonPlugin
-			.getResourceString("Dialog.TreeViewerSelectionDialog.DefaultTitle"); //$NON-NLS-1$
-
-	/** Used to tag the image type */
-	public static final int STYLE_NONE = 0;
-
-	private static final int STYLE_INFORMATION = 1;
-
-	private static final int STYLE_ERROR = 2;
-
-	private static final int STYLE_WARNING = 3;
-
-	/** Sizi of the TreeViewer composite */
-	private static final int SIZING_SELECTION_PANE_HEIGHT = 300;
-
-	private static final int SIZING_SELECTION_PANE_WIDTH = 320;
-
-	private String _title = DEFAULT_TITLE;
-
-	// the seleciton on the treeviewer.
-	private static Object[] _selection;
-
-	// providers
-	private ITreeContentProvider _contentProvider;
-
-	private ILabelProvider _labelProvider;
-
-	private ViewerFilter _filter;
-
-	/** The validation image */
-	private Label _statusImage;
-
-	/** The validation message */
-	private Label _statusLabel;
-
-	private String _statusMessage;
-
-	/** The selection tree */
-	private TreeViewer _treeViewer;
-
-	private int _style;
-
-	private ViewerSorter _viewerSorter = null;
-	private ViewerComparator _viewerComparator = null;
-	/**
-	 * @param parentShell
-	 * @param statusMessage 
-	 * @param style 
-	 */
-	public TreeViewerSelectionDialog(Shell parentShell, String statusMessage,
-			int style) {
-		super(parentShell);
-		_statusMessage = statusMessage;
-		_style = style;
-		setShellStyle(SWT.CLOSE | SWT.TITLE | SWT.BORDER
-				| SWT.APPLICATION_MODAL | SWT.RESIZE);
-	}
-
-	/**
-	 * Convenience for TreeViewerSelectionDialog(parentShell, statusMessage, SWT.NONE)
-	 * 
-	 * @param parentShell
-	 * @param statusMessage
-	 */
-	public TreeViewerSelectionDialog(Shell parentShell, String statusMessage) {
-		this(parentShell, statusMessage, SWT.NONE);
-	}
-
-	public void setTitle(String title) {
-		super.setTitle(title);
-		_title = title;
-	}
-
-	/**
-	 * Returns a new drill down viewer for this dialog.
-	 * @param parent 
-	 */
-	protected void createTreeViewer(Composite parent) {
-		// Create drill down
-		DrillDownComposite drillDown = new DrillDownComposite(parent,
-				SWT.BORDER);
-		GridData spec = new GridData(GridData.FILL_BOTH);
-		spec.widthHint = SIZING_SELECTION_PANE_WIDTH;
-		spec.heightHint = SIZING_SELECTION_PANE_HEIGHT;
-		drillDown.setLayoutData(spec);
-		_treeViewer = new TreeViewer(drillDown, _style);
-		drillDown.setChildTree(_treeViewer);
-	}
-
-	private void setTreeViewerProviders() {
-		_treeViewer.setContentProvider(_contentProvider);
-		_treeViewer.setLabelProvider(_labelProvider);
-		if (_viewerSorter == null) {
-			_viewerSorter = new ViewerSorter();
-		}
-		_treeViewer.setSorter(_viewerSorter);
-		
-		// override if not null.. setSorter is discouraged.
-		if (_viewerComparator != null)
-		{
-		    _treeViewer.setComparator(_viewerComparator);
-		}
-		_treeViewer.addSelectionChangedListener(new ISelectionChangedListener() {
-					public void selectionChanged(SelectionChangedEvent event) {
-						_selection = getSelectedElements((IStructuredSelection) event
-								.getSelection());
-						updateStatus();
-					}
-				});
-		_treeViewer.addDoubleClickListener(new IDoubleClickListener() {
-			public void doubleClick(DoubleClickEvent event) {
-				ISelection selection = event.getSelection();
-				if (selection instanceof IStructuredSelection) {
-					Object item = ((IStructuredSelection) selection)
-							.getFirstElement();
-					if (item instanceof IFile) {
-						okPressed();
-					} else if (_treeViewer.getExpandedState(item)) {
-						_treeViewer.collapseToLevel(item, 1);
-					} else {
-						_treeViewer.expandToLevel(item, 1);
-					}
-				}
-			}
-		});
-		_treeViewer.setInput(findInputElement());
-
-		if (_filter != null) {
-			_treeViewer.addFilter(_filter);
-		}
-	}
-
-	/**
-	 * Creates the contents of the composite.
-	 * @param parent 
-	 */
-	protected void createTreeViewerComposite(Composite parent) {
-		Composite treeViewerComposite = new Composite(parent, SWT.NONE);
-		GridLayout layout = new GridLayout();
-		layout.marginWidth = 0;
-		treeViewerComposite.setLayout(layout);
-
-		GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
-		gridData.horizontalSpan = 2;
-		treeViewerComposite.setLayoutData(gridData);
-		Label label = new Label(treeViewerComposite, SWT.WRAP);
-		label.setText(_title);
-		label.setFont(treeViewerComposite.getFont());
-		createTreeViewer(treeViewerComposite);
-		Dialog.applyDialogFont(treeViewerComposite);
-	}
-
-	/**
-	 * Sets the selected existing container.
-	 * @param selection 
-	 */
-	public void setSelectedElement(Object[] selection) {
-		// Expand to and select the specified container
-		if (selection == null) {
-			return;
-		}
-
-		for (int i = 0; i < selection.length; i++) {
-			if (_selection[i] != null) {
-				_treeViewer.expandToLevel(_selection[i], 1);
-
-			}
-		}
-		_treeViewer.setSelection(new StructuredSelection(selection), true);
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on Dialog.
-	 */
-	protected Control createDialogArea(Composite parent) {
-		Composite area = (Composite) super.createDialogArea(parent);
-		GridLayout gridLayout = new GridLayout();
-		gridLayout.numColumns = 2;
-		area.setLayout(gridLayout);
-
-		// Container treeviewer composite
-		createTreeViewerComposite(area);
-
-		_statusImage = createLabel(area);
-		_statusImage.setImage(getMessageImage(STYLE_ERROR));
-		_statusLabel = createLabel(area);
-		// Link to model
-		setTreeViewerProviders();
-
-		return dialogArea;
-	}
-
-	private Label createLabel(Composite parent) {
-		Label label = new Label(parent, SWT.LEFT);
-		GridData data = new GridData();
-		data.horizontalSpan = 1;
-		data.horizontalAlignment = GridData.FILL;
-		label.setLayoutData(data);
-		label.setText(_statusMessage == null ? "" : _statusMessage); //$NON-NLS-1$
-		return label;
-	}
-
-	private Object[] getSelectedElements(IStructuredSelection selection) {
-		return selection.toArray();
-	}
-
-	/**
-	 * @param provider
-	 *            The _contentProvider to set.
-	 */
-	public void setContentProvider(ITreeContentProvider provider) {
-		_contentProvider = provider;
-	}
-
-	/**
-	 * @param provider
-	 *            The _labelProvider to set.
-	 */
-	public void setLabelProvider(ILabelProvider provider) {
-		_labelProvider = provider;
-	}
-
-	/**
-	 * @param filter
-	 *            The _filter to set.
-	 */
-	public void setFilter(ViewerFilter filter) {
-		this._filter = filter;
-	}
-
-	/**
-	 * @param sorter
-	 *            The _viewerSorter to set.
-	 */
-	public void setViewerSorter(ViewerSorter sorter) {
-		_viewerSorter = sorter;
-	}
-
-	/**
-	 * Set the viewer comparator.  If not null, it's set after after the
-	 * viewer sorter and thus overrides it.
-	 * 
-	 * @param viewerComparator
-	 */
-	public void setViewerComparator(ViewerComparator viewerComparator)
-    {
-        _viewerComparator = viewerComparator;
-    }
-
-    /**
-	 * @param message
-	 */
-	public void setStatusMessage(String message) {
-		_statusMessage = message;
-	}
-
-	/**
-	 * Update the status message
-	 */
-	private void updateStatus() {
-		Object selection = _selection;
-		if (_selection != null && _selection.length == 1) {
-			selection = _selection[0];
-		}
-		if (isValidSelection(selection)) {
-			_statusImage.setVisible(false);
-			_statusLabel.setText(""); //$NON-NLS-1$
-			getOkButton().setEnabled(true);
-		} else {
-			_statusImage.setVisible(true);
-			_statusImage.setImage(getMessageImage(STYLE_ERROR));
-			_statusImage.redraw();
-			_statusLabel.setText(_statusMessage);
-			getOkButton().setEnabled(false);
-		}
-
-	}
-
-	/**
-	 * Get the different message according the message type.
-	 * @param imageType 
-	 * 
-	 * @return Image - the message image
-	 */
-	protected Image getMessageImage(int imageType) {
-		switch (imageType) {
-		case STYLE_ERROR:
-			return JFaceResources.getImage(Dialog.DLG_IMG_MESSAGE_ERROR);
-		case STYLE_WARNING:
-			return JFaceResources.getImage(Dialog.DLG_IMG_MESSAGE_WARNING);
-		case STYLE_INFORMATION:
-			return JFaceResources.getImage(Dialog.DLG_IMG_MESSAGE_INFO);
-		default:
-			return null;
-		}
-	}
-
-	/**
-	 * The <code>ContainerSelectionDialog</code> implementation of this
-	 * <code>Dialog</code> method builds a list of the selected resource
-	 * containers for later retrieval by the client and closes this dialog.
-	 */
-	protected void okPressed() {
-		List chosenContainerPathList = new ArrayList();
-		if (_selection != null) {
-			chosenContainerPathList.addAll(Arrays.asList(_selection));
-		}
-		setResult(chosenContainerPathList);
-		super.okPressed();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.window.Window#createContents(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Control createContents(Composite parent) {
-		Control control = super.createContents(parent);
-		if (_selection != null) {
-			this.setSelectedElement(_selection);
-		}
-		return control;
-	}
-
-	/**
-	 * @param selection
-	 * @return true if selection is valid
-	 */
-	protected abstract boolean isValidSelection(Object selection);
-
-	/**
-	 * Used to set the input element on the tree viewer
-	 * @return the input element
-	 */
-	protected abstract Object findInputElement();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/form/AbstractDetailsForm.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/form/AbstractDetailsForm.java
deleted file mode 100644
index 887d57f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/form/AbstractDetailsForm.java
+++ /dev/null
@@ -1,147 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.form;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * The parent of all detail forms.
- * 
- * @author cbateman
- *
- */
-public abstract class AbstractDetailsForm
-{
-    private FormToolkit _toolkit;
-
-    /**
-     * 
-     */
-    protected AbstractDetailsForm()
-    {
-        super();
-    }
-
-    /**
-     * Called to refresh model if stale
-     */
-    public void refresh()
-    {
-        // do nothing by default
-    }
-
-    /**
-     * Called before createContents.
-     * 
-     * @param toolkit
-     */
-    public final void initialize(final FormToolkit toolkit)
-    {
-        _toolkit = toolkit;
-        doInitialize();
-    }
-    
-    /**
-     * Override to customize initialization.  getToolkit() is safe to call
-     * from this method.  You should not make other state assumptions.
-     */
-    protected void doInitialize()
-    {
-        // do nothing by default; 
-    }
-    
-    /**
-     * Callled by MasterDetailBlock during it's dispose
-     */
-    public abstract void dispose();
-
-    /**
-     * @param onSave
-     */
-    public abstract void commit(boolean onSave);
-
-    /**
-     * Called on this details form before it is shown, when it becomes active
-     * due to a matching selection change in the master form.  Implementer
-     * should use newSelection as the new instance of their model and 
-     * reinitialize UI as appropriate.
-     * @param newSelection
-     */
-    protected abstract void doUpdateSelection(final Object newSelection);
-
-    /**
-     * @return the contents control.  Must not be called before createContents.
-     */
-    public abstract Control getControl();
-
-    /**
-     * Fired to indicate that this detail form is now selected based on the
-     * master form selected.
-     * 
-     * @param selection
-     */
-    public void selectionChanged(final ISelection selection)
-    {
-        // by default, get the first element of the selection if there is
-        // one and call doUpdateSelection on it.  Sub-classes may change
-        // this behaviour
-        if (selection instanceof IStructuredSelection)
-        {
-            final Object selectionObj = ((IStructuredSelection) selection)
-                    .getFirstElement();
-            doUpdateSelection(selectionObj);
-        }
-    }
-
-    /**
-     * Create the contents of the detail form using 'parent'.  Should not be
-     * called before initialize.
-     * 
-     * @param parent
-     */
-    public abstract void createContents(Composite parent);
-
-    /**
-     * @return the form toolkit in use.  Should not be called before 
-     * initialize.
-     */
-    protected final FormToolkit getToolkit()
-    {
-        return _toolkit;
-    }
-
-    /**
-     * @return true if the form is dirty
-     */
-    public boolean isDirty()
-    {
-        // never dirty by default
-        return false;
-    }
-
-    /**
-     * @return true if form is stale
-     */
-    public boolean isStale()
-    {
-        // always stale by default
-        return true;
-    }
-
-    /**
-     * Called to set focus on the detail form's control
-     */
-    public abstract void setFocus();
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/form/AbstractMasterDetailBlock.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/form/AbstractMasterDetailBlock.java
deleted file mode 100644
index 7141dcb..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/form/AbstractMasterDetailBlock.java
+++ /dev/null
@@ -1,206 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.form;
-
-import java.util.List;
-
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.BusyIndicator;
-import org.eclipse.swt.custom.SashForm;
-import org.eclipse.swt.custom.StackLayout;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.forms.widgets.Form;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * An alternative to MasterDetailBlock that doesn't use the ScrolledForm
- * that causes problems as described here:
- * 
- * http://dev.eclipse.org/newslists/news.eclipse.platform/msg73145.html
-
- * @author cbateman
- *
- */
-public abstract class AbstractMasterDetailBlock implements
-        ISelectionChangedListener
-{
-    private AbstractMasterForm        _masterForm;
-    private Composite                 _detailsPanel;
-    private AbstractDetailsForm       _curPage;
-    private FormToolkit               _toolkit;
-    private StackLayout               _detailLayout;
-    private List<AbstractDetailsForm> _detailForms;
-    private BlankDetailsForm          _blankDetails;
-
-    /**
-     * 
-     */
-    protected AbstractMasterDetailBlock()
-    {
-        super();
-    }
-
-    /**
-     * Disposes the master detail form
-     */
-    public final void dispose()
-    {
-        _masterForm.dispose();
-
-        for (final AbstractDetailsForm detailsForm : _detailForms)
-        {
-            detailsForm.dispose();
-        }
-
-        doDispose();
-    }
-
-    /**
-     * Override to get custom dispose logic. Do not use this to dispose of
-     * master or details forms. This is done automatically for you before
-     * doDispose is called.
-     */
-    protected void doDispose()
-    {
-        // do nothing by default
-    }
-
-    /**
-     * @param toolkit
-     * @param form
-     */
-    public final void createContent(final FormToolkit toolkit, final Form form)
-    {
-        _toolkit = toolkit;
-
-        final GridLayout layout = new GridLayout();
-        layout.marginWidth = 5;
-        layout.marginHeight = 5;
-        form.getBody().setLayout(layout);
-        final SashForm sashForm = new SashForm(form.getBody(), SWT.NULL);
-        // sashForm.setData("form", managedForm); //$NON-NLS-1$
-        _toolkit.adapt(sashForm, false, false);
-        sashForm.setMenu(form.getBody().getMenu());
-        sashForm.setLayoutData(new GridData(GridData.FILL_BOTH));
-        initializeMasterPart(_toolkit, sashForm);
-        createDetailsPart(sashForm);
-
-        _masterForm.createHead(form);
-        createToolBarActions(form);
-        form.updateToolBar();
-    }
-
-    /**
-     * @param toolkit
-     * @return the master form.
-     */
-    protected abstract AbstractMasterForm createMasterPart(
-            final FormToolkit toolkit);
-
-    private void initializeMasterPart(final FormToolkit toolkit,
-            final Composite parent)
-    {
-        _masterForm = createMasterPart(toolkit);
-        _masterForm.initialize(this);
-        _masterForm.createClientArea(parent);
-    }
-
-    private void createToolBarActions(final Form form)
-    {
-        _masterForm.contributeActions(form.getToolBarManager());
-    }
-
-    private void createDetailsPart(final Composite parent)
-    {
-        _detailsPanel = new Composite(parent, SWT.NONE);
-        _detailLayout = new StackLayout();
-        _detailsPanel.setLayout(_detailLayout);
-
-        _detailForms = createDetailPages();
-
-        for (final AbstractDetailsForm detailForm : _detailForms)
-        {
-            detailForm.initialize(_toolkit);
-            detailForm.createContents(_detailsPanel);
-        }
-
-        // create default blank page
-        _blankDetails = new BlankDetailsForm();
-        _blankDetails.initialize(_toolkit);
-        _blankDetails.createContents(_detailsPanel);
-
-        _curPage = _blankDetails;
-        _detailLayout.topControl = _curPage.getControl();
-        _detailsPanel.layout();
-    }
-
-    public final void selectionChanged(final SelectionChangedEvent event)
-    {
-        final Object selectedObj = ((IStructuredSelection) event.getSelection())
-                .getFirstElement();
-        final AbstractDetailsForm page = selectPage(selectedObj);
-        if (page != null)
-        {
-            final AbstractDetailsForm fpage = page;
-            BusyIndicator.showWhile(_detailsPanel.getDisplay(), new Runnable()
-            {
-                public void run()
-                {
-                    final AbstractDetailsForm oldPage = _curPage;
-                    _curPage = fpage;
-                    // commit the current page
-                    if (oldPage != null && oldPage.isDirty())
-                    {
-                        oldPage.commit(false);
-                    }
-                    // refresh the new page
-                    if (fpage.isStale())
-                    {
-                        fpage.refresh();
-                    }
-                    _curPage.selectionChanged(event.getSelection());
-                    // _pageBook.showPage(_curPage.getTextSection().getControl());
-                    _detailLayout.topControl = _curPage.getControl();
-                    _detailsPanel.layout();
-                }
-            });
-        }
-    }
-
-    /**
-     * @return a list of detail forms
-     */
-    protected abstract List<AbstractDetailsForm> createDetailPages();
-
-    /**
-     * @param forModel
-     * @return the details form for 'forModel'. If implementer returns null,
-     *         then a blank page will be provided
-     */
-    protected abstract AbstractDetailsForm doSelectPage(final Object forModel);
-
-    private AbstractDetailsForm selectPage(final Object forModel)
-    {
-        final AbstractDetailsForm clientForm = doSelectPage(forModel);
-
-        if (clientForm != null)
-        {
-            return clientForm;
-        }
-        return _blankDetails;
-    }
-
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/form/AbstractMasterForm.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/form/AbstractMasterForm.java
deleted file mode 100644
index 46ec864..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/form/AbstractMasterForm.java
+++ /dev/null
@@ -1,165 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.form;
-
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.jface.action.ToolBarManager;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
-import org.eclipse.swt.layout.RowLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.ToolBar;
-import org.eclipse.ui.forms.widgets.Form;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * 
- * @author cbateman
- * 
- */
-public abstract class AbstractMasterForm
-{
-
-    private final FormToolkit         _toolkit;
-    private ISelectionChangedListener _listener;
-    private ToolBarManager            _toolBarManager;
-
-    /**
-     * @param toolkit
-     */
-    protected AbstractMasterForm(FormToolkit toolkit)
-    {
-        super();
-        _toolkit = toolkit;
-    }
-
-    /**
-     * @param listener
-     *            the selection listener that is signalled to indicate the
-     *            selection in the master has changed and the detail should be
-     *            updated.
-     */
-    public final void initialize(final ISelectionChangedListener listener)
-    {
-        _listener = listener;
-        doInitialize();
-    }
-
-    /**
-     * It is safe to call getListener() and get getToolkit() in this method. All
-     * other methods should be considered unavailable.
-     */
-    protected void doInitialize()
-    {
-        // do nothing by default; override to do customize init
-    }
-
-    /**
-     * @param parent
-     * @return the client area for the master form, using parent is the parent
-     * control.
-     */
-    public abstract Control createClientArea(final Composite parent);
-
-    /**
-     * @param form
-     */
-    public final void createHead(final Form form)
-    {
-        final Composite head = form.getHead();
-        final Composite container = getToolkit().createComposite(head);
-        container.setLayout(new RowLayout());
-
-        // sub-class contribution
-        contributeToHeadArea(getToolkit(), container);
-
-        _toolBarManager = new ToolBarManager(SWT.FLAT);
-        ToolBar toolbar = _toolBarManager.createControl(container);
-        // _toolkit.adapt(toolbar, false, false);
-
-        toolbar.setBackground(form.getHead().getBackground());
-        toolbar.setForeground(form.getHead().getForeground());
-        //toolbar.setCursor(FormsResources.getHandCursor());
-        container.addDisposeListener(new DisposeListener()
-        {
-            public void widgetDisposed(DisposeEvent e)
-            {
-                if (_toolBarManager != null)
-                {
-                    _toolBarManager.dispose();
-                    _toolBarManager = null;
-                }
-            }
-        });
-
-        form.setHeadClient(container);
-
-    }
-
-    /**
-     * Override to add client area before the toolbar.
-     * 
-     * @param toolkit
-     * @param container
-     */
-    protected void contributeToHeadArea(FormToolkit toolkit, Composite container)
-    {
-        // do nothing by default
-    }
-
-    /**
-     * @param formManager
-     */
-    public final void contributeActions(final IToolBarManager formManager)
-    {
-        contributeActions(formManager, _toolBarManager);
-    }
-
-    /**
-     * @param formManager
-     *            adds to the toolkit's toolbar
-     * @param localManager
-     *            adds to AbstractMasterForm's toolbar.
-     */
-    protected void contributeActions(final IToolBarManager formManager,
-            final IToolBarManager localManager)
-    {
-        // do nothing by default. Override to add actions.
-    }
-
-    /**
-     * Should be called at any time after initialize and createContents when the
-     * owner is finished with the master-detail form block.
-     */
-    public void dispose()
-    {
-        // do nothing by default;
-    }
-
-    /**
-     * @return the tool kit in use.
-     */
-    protected final FormToolkit getToolkit()
-    {
-        return _toolkit;
-    }
-
-    /**
-     * @return the selection listener
-     */
-    protected final ISelectionChangedListener getListener()
-    {
-        return _listener;
-    }
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/form/AbstractXMLSectionsDetailsForm.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/form/AbstractXMLSectionsDetailsForm.java
deleted file mode 100644
index 902ec7e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/form/AbstractXMLSectionsDetailsForm.java
+++ /dev/null
@@ -1,186 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.form;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.RowData;
-import org.eclipse.swt.layout.RowLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.ui.forms.widgets.ExpandableComposite;
-import org.eclipse.ui.forms.widgets.FormText;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.forms.widgets.Section;
-
-/**
- * A detail form that uses XML text sections.
- * 
- * @author cbateman
- * 
- */
-public abstract class AbstractXMLSectionsDetailsForm extends
-        AbstractDetailsForm
-{
-    private Map<Object, XMLTextSection> _textSections;
-    private Composite                   _detailFormComposite;
-
-    /**
-     * @param parent
-     */
-    @Override
-    public final void createContents(final Composite parent)
-    {
-        _detailFormComposite = getToolkit().createComposite(parent, SWT.NONE);
-        final RowLayout rowLayout = new RowLayout(SWT.VERTICAL);
-        rowLayout.fill = true;
-        _detailFormComposite.setLayout(rowLayout);
-        // take a copy of what's returned so the sub-class can't control
-        // the map reference
-        _textSections = Collections
-                .unmodifiableMap(new HashMap<Object, XMLTextSection>(
-                        createXMLTextSections(_detailFormComposite)));
-
-        final Set<XMLTextSection> expandedSections = getInitiallyExpanded(_textSections);
-        for (final Map.Entry<? extends Object, XMLTextSection> entry : _textSections
-                .entrySet())
-        {
-            final XMLTextSection section = entry.getValue();
-            if (expandedSections.contains(section))
-            {
-                section._section.setExpanded(true);
-            }
-        }
-    }
-
-    /**
-     * @param parent
-     *            the parent that should be used for all XMLTextSections
-     * @return a map keyed by an object type understood by the sub-class
-     *         containing as values the XMLTextSections
-     */
-    protected abstract Map<? extends Object, XMLTextSection> createXMLTextSections(
-            final Composite parent);
-
-    /**
-     * @param sections
-     * @return the subset of XMLTextSections in the provided map that are to be
-     *         expanded. NOTE: all elements in the returned set must be in
-     *         sections.getValues.
-     */
-    protected abstract Set<XMLTextSection> getInitiallyExpanded(
-            final Map<Object, XMLTextSection> sections);
-
-    /**
-     * @return the control for this form
-     */
-    @Override
-    public Control getControl()
-    {
-        return _detailFormComposite;
-    }
-
-    /**
-     * @param selection
-     */
-    public final void selectionChanged(final ISelection selection)
-    {
-        if (selection instanceof IStructuredSelection)
-        {
-            final Object selectionObj = ((IStructuredSelection) selection)
-                    .getFirstElement();
-            doUpdateSelection(selectionObj);
-        }
-    }
-
-    @Override
-    public void commit(final boolean onSave)
-    {
-        // do nothing
-    }
-
-    @Override
-    public void dispose()
-    {
-        // do nothing
-    }
-
-    @Override
-    public void setFocus()
-    {
-        // do nothing; sub-classes should override to pick an XMLTextSection
-        // where they want focus.
-    }
-
-    /**
-     * An XML text section
-     * 
-     */
-    protected final static class XMLTextSection
-    {
-        private final Section _section;
-        private FormText      _formText;
-
-        /**
-         * @param toolkit
-         * @param parent
-         * @param title
-         */
-        public XMLTextSection(final FormToolkit toolkit,
-                final Composite parent, final String title)
-        {
-            _section = toolkit.createSection(parent,
-                    ExpandableComposite.TREE_NODE
-                            | ExpandableComposite.CLIENT_INDENT);
-            _section.setLayoutData(new RowData());
-            _section.setText(title);
-
-            _formText = toolkit.createFormText(_section, true);
-            _formText.setText("", false, false); //$NON-NLS-1$
-
-            _section.setClient(_formText);
-        }
-
-        /**
-         * @param text
-         * @param parseTags
-         * @param expandURLs
-         */
-        public void setText(final String text, final boolean parseTags,
-                final boolean expandURLs)
-        {
-            _formText.setText(text, parseTags, expandURLs);
-        }
-
-        /**
-         * @return the parent control.
-         */
-        public Control getControl()
-        {
-            return _section;
-        }
-
-        /**
-         * Force a visual relayout and update.
-         */
-        public void refresh()
-        {
-            _section.getParent().layout(true, true);
-        }
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/form/BlankDetailsForm.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/form/BlankDetailsForm.java
deleted file mode 100644
index 7678b03..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/form/BlankDetailsForm.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.form;
-
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-
-/**
- * A blank details form.
- * 
- * @author cbateman
- * 
- */
-public final class BlankDetailsForm extends AbstractDetailsForm
-{
-    private Composite _emptyPanel;
-
-    @Override
-    public void createContents(Composite parent)
-    {
-        _emptyPanel = getToolkit().createComposite(parent);
-    }
-
-    @Override
-    public Control getControl()
-    {
-        return _emptyPanel;
-    }
-
-    @Override
-    protected void doUpdateSelection(Object newSelection)
-    {
-        // do nothing
-    }
-
-    @Override
-    public void commit(boolean onSave)
-    {
-        // nothing to commit
-    }
-
-    @Override
-    public void dispose()
-    {
-       // nothing to dispose
-    }
-
-    @Override
-    public void setFocus()
-    {
-        // don't bother changing focus
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/guiutils/Alerts.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/guiutils/Alerts.java
deleted file mode 100644
index 54c3a27..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/guiutils/Alerts.java
+++ /dev/null
@@ -1,837 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.guiutils;
-
-import java.lang.reflect.InvocationTargetException;
-import java.text.MessageFormat;
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.MultiStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.dialogs.ErrorDialog;
-import org.eclipse.jface.dialogs.IInputValidator;
-import org.eclipse.jface.dialogs.InputDialog;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-
-/**
- * This class will provide UI alert dialogs to the user. These will
- * automatically get the message from the plugin's resource bundle.
- * 
- * NOTE: there are some generic exception methods included in this file. They
- * need resource bundles also, and they make the alerts bettern when the
- * exception is caught at a later stage.
- * 
- * @author mengbo
- */
-public class Alerts {
-	// this is used for junit testing to turn off all alerts and return the
-	// default on yes/no dialogs.
-	private static boolean _noAlerts = false;
-
-	private ResourceBundle _rb;
-
-	private String _pluginId;
-
-	/**
-	 * Construct a alerts with the provided attributes. This constructor should
-	 * be used from the root plugin that has access to the resource bundle for
-	 * this plugin.
-	 * 
-	 * @param plugin 
-	 * @param rb
-	 *            the resource bundle to use.
-	 */
-	public Alerts(AbstractUIPlugin plugin, ResourceBundle rb) {
-		_rb = rb;
-		if (_rb == null) {
-			throw new NullPointerException(
-					"No resource bundle was provided to the Alerts."); //$NON-NLS-1$
-		}
-		if (plugin == null) {
-			throw new NullPointerException(
-					"No plugin was provided to the Alerts."); //$NON-NLS-1$
-		}
-		_pluginId = plugin.getBundle().getSymbolicName();
-	}
-
-	/**
-	 * Returns the text entered by a user in a simple request dialog.
-	 * 
-	 * @param titleKey -
-	 *            the title resource bundle key for the message
-	 * @param msgKey -
-	 *            message resource bundle key for the message displayed to the
-	 *            user
-	 * @param initialValue -
-	 *            initial value in the text area.
-	 * @param validator -
-	 *            something that checks for validity on the name.
-	 * @return null is returned if the user hits cancel, otherwise it is the
-	 *         text they entered.
-	 */
-	public String getInput(String titleKey, String msgKey, String initialValue,
-			IInputValidator validator) {
-		if (_noAlerts) {
-			return null;
-		}
-
-		InputDialog inDialog = new InputDialog(PlatformUI.getWorkbench()
-				.getActiveWorkbenchWindow().getShell(),
-				getResourceString(titleKey), getResourceString(msgKey),
-				initialValue, validator);
-		inDialog.open();
-		return inDialog.getValue();
-	}
-
-	/**
-	 * Displays an Error message to the user.
-	 * 
-	 * @param titleKey -
-	 *            the title resource bundle key for the message
-	 * @param msgKey -
-	 *            message resource bundle key for the message displayed to the
-	 *            user
-	 */
-	public void error(String titleKey, String msgKey) {
-		if (_noAlerts) {
-			return;
-		}
-
-		MessageDialog.openError(PlatformUI.getWorkbench()
-				.getActiveWorkbenchWindow().getShell(),
-				getResourceString(titleKey), getResourceString(msgKey));
-	}
-
-	/**
-	 * Displays an Error message to the user.
-	 * 
-	 * @param titleKey -
-	 *            the title resource bundle key for the message
-	 * @param msgKey -
-	 *            message resource bundle key for the message displayed to the
-	 *            user
-	 * @param arg0 -
-	 *            arg to place into the resource bundle message.
-	 */
-	public void error(String titleKey, String msgKey, Object arg0) {
-		if (_noAlerts) {
-			return;
-		}
-
-		Object[] args = new Object[1];
-		args[0] = arg0;
-
-		MessageFormat formatter = new MessageFormat(getResourceString(msgKey));
-
-		MessageDialog.openError(PlatformUI.getWorkbench()
-				.getActiveWorkbenchWindow().getShell(),
-				getResourceString(titleKey), formatter.format(args));
-	}
-
-	/**
-	 * Displays an Error message to the user.
-	 * 
-	 * @param titleKey -
-	 *            the title resource bundle key for the message
-	 * @param msgKey -
-	 *            message resource bundle key for the message displayed to the
-	 *            user
-	 * @param arg0 -
-	 *            arg to place into the resource bundle message.
-	 * @param arg1 -
-	 *            arg to place into the resource bundle message.
-	 */
-	public void error(String titleKey, String msgKey, Object arg0, Object arg1) {
-		if (_noAlerts) {
-			return;
-		}
-
-		Object[] args = new Object[2];
-		args[0] = arg0;
-		args[1] = arg1;
-
-		MessageFormat formatter = new MessageFormat(getResourceString(msgKey));
-
-		MessageDialog.openError(PlatformUI.getWorkbench()
-				.getActiveWorkbenchWindow().getShell(),
-				getResourceString(titleKey), formatter.format(args));
-	}
-
-	/**
-	 * Displays an Error message to the user.
-	 * 
-	 * @param titleKey -
-	 *            the title resource bundle key for the message
-	 * @param msgKey -
-	 *            message resource bundle key for the message displayed to the
-	 *            user
-	 * @param arg0 -
-	 *            arg to place into the resource bundle message.
-	 * @param arg1 -
-	 *            arg to place into the resource bundle message.
-	 * @param arg2 -
-	 *            arg to place into the resource bundle message.
-	 */
-	public void error(String titleKey, String msgKey, Object arg0, Object arg1,
-			Object arg2) {
-		if (_noAlerts) {
-			return;
-		}
-
-		Object[] args = new Object[3];
-		args[0] = arg0;
-		args[1] = arg1;
-		args[2] = arg2;
-
-		MessageFormat formatter = new MessageFormat(getResourceString(msgKey));
-
-		MessageDialog.openError(PlatformUI.getWorkbench()
-				.getActiveWorkbenchWindow().getShell(),
-				getResourceString(titleKey), formatter.format(args));
-	}
-
-	/**
-	 * Displays an Error message to the user.
-	 * 
-	 * @param titleKey -
-	 *            the title resource bundle key for the message
-	 * @param msgKey -
-	 *            message resource bundle key for the message displayed to the
-	 *            user
-	 * @param arg0 -
-	 *            arg to place into the resource bundle message.
-	 * @param arg1 -
-	 *            arg to place into the resource bundle message.
-	 * @param arg2 -
-	 *            arg to place into the resource bundle message.
-	 * @param arg3 -
-	 *            arg to place into the resource bundle message.
-	 */
-	public void error(String titleKey, String msgKey, Object arg0, Object arg1,
-			Object arg2, Object arg3) {
-		if (_noAlerts) {
-			return;
-		}
-
-		Object[] args = new Object[4];
-		args[0] = arg0;
-		args[1] = arg1;
-		args[2] = arg2;
-		args[3] = arg3;
-
-		MessageFormat formatter = new MessageFormat(getResourceString(msgKey));
-
-		MessageDialog.openError(PlatformUI.getWorkbench()
-				.getActiveWorkbenchWindow().getShell(),
-				getResourceString(titleKey), formatter.format(args));
-	}
-
-	/**
-	 * Displays an Error message to the user.
-	 * 
-	 * @param shell -
-	 *            the shell for the error dialog
-	 * @param titleKey -
-	 *            the title resource bundle key for the message
-	 * @param msgKey -
-	 *            message resource bundle key for the message displayed to the
-	 *            user
-	 */
-	public void error(Shell shell, String titleKey, String msgKey) {
-		if (_noAlerts) {
-			return;
-		}
-
-		MessageDialog.openError(shell, getResourceString(titleKey),
-				getResourceString(msgKey));
-	}
-
-	/**
-	 * Displays an Error message to the user with a status using the Display
-	 * background thread.
-	 * 
-	 * @param titleKey -
-	 *            the title resource bundle key for the message
-	 * @param msgKey -
-	 *            message resource bundle key for the message displayed to the
-	 *            user
-	 */
-	public void detailError(String titleKey, String msgKey) {
-		if (_noAlerts) {
-			return;
-		}
-
-		final IStatus fstatus = new Status(IStatus.ERROR, _pluginId,
-				IStatus.OK, getResourceString(msgKey), null);
-		final String ftitle = getResourceString(titleKey);
-
-		Display display = getStandardDisplay();
-		display.asyncExec(new Runnable() {
-			public void run() {
-				ErrorDialog.openError(null, ftitle, null, fstatus);
-			}
-		});
-	}
-
-	/**
-	 * Displays an Error message to the user with a status using the Display
-	 * background thread. This will give the details button.
-	 * 
-	 * @param titleKey -
-	 *            the title resource bundle key for the message
-	 * @param msgKey -
-	 *            message resource bundle key for the message displayed to the
-	 *            user
-	 * @param tt -
-	 *            exception to place in the details.
-	 */
-	public void detailError(String titleKey, String msgKey, Throwable tt) {
-		if (_noAlerts) {
-			return;
-		}
-
-		internalDetailError(getResourceString(titleKey),
-				getResourceString(msgKey), tt);
-	}
-
-	/**
-	 * Displays an Error message to the user with a status using the Display
-	 * background thread. This will give the details button.
-	 * 
-	 * @param titleKey -
-	 *            the title resource bundle key for the message
-	 * @param msgKey -
-	 *            message resource bundle key for the message displayed to the
-	 *            user
-	 * @param arg0 -
-	 *            arg to place into the resource bundle message.
-	 * @param tt -
-	 *            exception to place in the details.
-	 */
-	public void detailError(String titleKey, String msgKey, Object arg0,
-			Throwable tt) {
-		if (_noAlerts) {
-			return;
-		}
-
-		Object[] args = new Object[1];
-		args[0] = arg0;
-
-		MessageFormat formatter = new MessageFormat(getResourceString(msgKey));
-
-		internalDetailError(getResourceString(titleKey),
-				formatter.format(args), tt);
-	}
-
-	/**
-	 * Displays an Error message to the user with a status using the Display
-	 * background thread. This will give the details button.
-	 * 
-	 * @param titleKey -
-	 *            the title resource bundle key for the message
-	 * @param msgKey -
-	 *            message resource bundle key for the message displayed to the
-	 *            user
-	 * @param arg0 -
-	 *            arg to place into the resource bundle message.
-	 * @param arg1 -
-	 *            arg to place into the resource bundle message.
-	 * @param tt -
-	 *            exception to place in the details.
-	 */
-	public void detailError(String titleKey, String msgKey, Object arg0,
-			Object arg1, Throwable tt) {
-		if (_noAlerts) {
-			return;
-		}
-
-		Object[] args = new Object[1];
-		args[0] = arg0;
-		args[1] = arg1;
-
-		MessageFormat formatter = new MessageFormat(getResourceString(msgKey));
-
-		internalDetailError(getResourceString(titleKey),
-				formatter.format(args), tt);
-	}
-
-	/**
-	 * Displays an Error message to the user with a status using the Display
-	 * background thread. This will give the details button.
-	 * 
-	 * @param title -
-	 *            the title message
-	 * @param message -
-	 *            message displayed to the user
-	 */
-	private void internalDetailError(String title, String msg, Throwable tt) {
-		if (_noAlerts) {
-			return;
-		}
-
-		if (tt instanceof InvocationTargetException) {
-			tt = ((InvocationTargetException) tt).getTargetException();
-		}
-
-		IStatus status = null;
-		if (tt instanceof CoreException) {
-			status = ((CoreException) tt).getStatus();
-
-			if ((status instanceof MultiStatus) == false) {
-				// convert to a multistatus to show the exception details.
-
-				Throwable th = status.getException();
-				if (th == null) {
-					th = tt;
-				}
-
-				status = buildStackTraceStatus(IStatus.ERROR, status
-						.getPlugin(), status.getMessage(), th);
-			}
-		} else {
-			status = buildStackTraceStatus(IStatus.ERROR, _pluginId, tt
-					.getMessage(), tt);
-		}
-
-		final String ftitle = title;
-		final IStatus fstatus = status;
-		final String fmsg = msg;
-		Display display = getStandardDisplay();
-		display.asyncExec(new Runnable() {
-			public void run() {
-				ErrorDialog.openError(null, ftitle, fmsg, fstatus);
-			}
-		});
-	}
-
-	/**
-	 * Builds a multistatus, so that the stack trace shows up in the alery
-	 * message for detailed alerts.
-	 * 
-	 * @param code
-	 * @param pluginId
-	 * @param message
-	 * @param tt
-	 * @return the result of the operation
-	 */
-	public IStatus buildStackTraceStatus(int code, String pluginId,
-			String message, Throwable tt) {
-		if (tt == null) {
-			return new Status(code, pluginId, IStatus.OK, message, tt);
-		}
-
-		MultiStatus mstat = new MultiStatus(pluginId, code, message, tt);
-
-		StackTraceElement[] trace = tt.getStackTrace();
-
-		mstat.add(new Status(code, pluginId, IStatus.OK, tt.toString(), null));
-		for (int ii = 0; ii < trace.length; ii++) {
-			mstat.add(new Status(code, pluginId, IStatus.OK, trace[ii]
-					.toString(), null));
-		}
-		return mstat;
-	}
-
-	/**
-	 * Displays an Error message to the user with a status using the Display
-	 * background thread. This will give the details button.
-	 * 
-	 * @param status -
-	 *            the status
-	 * @param title -
-	 *            the title of the message
-	 */
-	public void detailError(String title, IStatus status) {
-		if (_noAlerts) {
-			return;
-		}
-
-		final IStatus fstatus = status;
-		final String ftitle = title;
-		Display display = getStandardDisplay();
-		display.asyncExec(new Runnable() {
-			public void run() {
-				ErrorDialog.openError(null, ftitle, null, fstatus);
-			}
-		});
-	}
-
-	/**
-	 * Displays an information message to the user.
-	 * 
-	 * @param titleKey -
-	 *            the title resource bundle key for the message
-	 * @param msgKey -
-	 *            message resource bundle key for the message displayed to the
-	 *            user
-	 */
-	public void info(String titleKey, String msgKey) {
-		if (_noAlerts) {
-			return;
-		}
-
-		MessageDialog.openInformation(PlatformUI.getWorkbench()
-				.getActiveWorkbenchWindow().getShell(),
-				getResourceString(titleKey), getResourceString(msgKey));
-	}
-
-	/**
-	 * Displays an information message to the user.
-	 * 
-	 * @param titleKey -
-	 *            the title resource bundle key for the message
-	 * @param msgKey -
-	 *            message resource bundle key for the message displayed to the
-	 *            user
-	 * @param arg0 -
-	 *            arg to place into the resource bundle message.
-	 */
-	public void info(String titleKey, String msgKey, Object arg0) {
-		if (_noAlerts) {
-			return;
-		}
-
-		Object[] args = new Object[1];
-		args[0] = arg0;
-
-		MessageFormat formatter = new MessageFormat(getResourceString(msgKey));
-
-		MessageDialog.openInformation(PlatformUI.getWorkbench()
-				.getActiveWorkbenchWindow().getShell(),
-				getResourceString(titleKey), formatter.format(args));
-	}
-
-	/**
-	 * Displays an confirmation message to the user.
-	 * 
-	 * @param titleKey -
-	 *            the title resource bundle key for the message
-	 * @param msgKey -
-	 *            message resource bundle key for the message displayed to the
-	 *            user
-	 * @return true if the user presses the OK button, false otherwise
-	 */
-	public boolean confirm(String titleKey, String msgKey) {
-		if (_noAlerts) {
-			return true;
-		}
-
-		return MessageDialog.openConfirm(PlatformUI.getWorkbench()
-				.getActiveWorkbenchWindow().getShell(),
-				getResourceString(titleKey), getResourceString(msgKey));
-	}
-
-	/**
-	 * Displays an confirmation message to the user.
-	 * 
-	 * @param titleKey -
-	 *            the title resource bundle key for the message
-	 * @param msgKey -
-	 *            message resource bundle key for the message displayed to the
-	 *            user
-	 * @param arg0 -
-	 *            arg to place into the resource bundle message.
-	 * @return true if the user presses the OK button, false otherwise
-	 */
-	public boolean confirm(String titleKey, String msgKey, Object arg0) {
-		if (_noAlerts) {
-			return true;
-		}
-
-		Object[] args = new Object[1];
-		args[0] = arg0;
-
-		MessageFormat formatter = new MessageFormat(getResourceString(msgKey));
-
-		return MessageDialog.openConfirm(PlatformUI.getWorkbench()
-				.getActiveWorkbenchWindow().getShell(),
-				getResourceString(titleKey), formatter.format(args));
-	}
-
-	/**
-	 * Displays an question message to the user.
-	 * 
-	 * @param titleKey -
-	 *            the title resource bundle key for the message
-	 * @param msgKey -
-	 *            message resource bundle key for the message displayed to the
-	 *            user
-	 * @return true if the user presses the "yes" button, false otherwise
-	 */
-	public boolean question(String titleKey, String msgKey) {
-		if (_noAlerts) {
-			return true;
-		}
-
-		return MessageDialog.openQuestion(PlatformUI.getWorkbench()
-				.getActiveWorkbenchWindow().getShell(),
-				getResourceString(titleKey), getResourceString(msgKey));
-	}
-
-	/**
-	 * Displays an question message to the user.
-	 * 
-	 * @param titleKey -
-	 *            the title resource bundle key for the message
-	 * @param msgKey -
-	 *            message resource bundle key for the message displayed to the
-	 *            user
-	 * @param arg0 -
-	 *            arg to place into the resource bundle message.
-	 * @return true if the user presses the "yes" button, false otherwise
-	 */
-	public boolean question(String titleKey, String msgKey, Object arg0) {
-		if (_noAlerts) {
-			return true;
-		}
-
-		Object[] args = new Object[1];
-		args[0] = arg0;
-
-		MessageFormat formatter = new MessageFormat(getResourceString(msgKey));
-
-		return MessageDialog.openQuestion(PlatformUI.getWorkbench()
-				.getActiveWorkbenchWindow().getShell(),
-				getResourceString(titleKey), formatter.format(args));
-	}
-
-	/**
-	 * Displays an warning message to the user.
-	 * 
-	 * @param titleKey -
-	 *            the title resource bundle key for the message
-	 * @param msgKey -
-	 *            message resource bundle key for the message displayed to the
-	 *            user
-	 */
-	public void warning(String titleKey, String msgKey) {
-		if (_noAlerts) {
-			return;
-		}
-
-		MessageDialog.openWarning(PlatformUI.getWorkbench()
-				.getActiveWorkbenchWindow().getShell(),
-				getResourceString(titleKey), getResourceString(msgKey));
-	}
-
-	/**
-	 * Displays an warning message to the user.
-	 * 
-	 * @param titleKey -
-	 *            the title resource bundle key for the message
-	 * @param msgKey -
-	 *            message resource bundle key for the message displayed to the
-	 *            user
-	 * @param arg0 -
-	 *            arg to place into the resource bundle message.
-	 */
-	public void warning(String titleKey, String msgKey, Object arg0) {
-		if (_noAlerts) {
-			return;
-		}
-
-		Object[] args = new Object[1];
-		args[0] = arg0;
-
-		MessageFormat formatter = new MessageFormat(getResourceString(msgKey));
-
-		MessageDialog.openWarning(PlatformUI.getWorkbench()
-				.getActiveWorkbenchWindow().getShell(),
-				getResourceString(titleKey), formatter.format(args));
-	}
-
-	/**
-	 * Returns the standard display to be used. The method first checks, if the
-	 * thread calling this method has an associated dispaly. If so, this display
-	 * is returned. Otherwise the method returns the default display.
-	 * 
-	 * TODO: should probably use the workbench display
-	 */
-	private Display getStandardDisplay() {
-		Display display = Display.getCurrent();
-		if (display == null) {
-			display = Display.getDefault();
-		}
-		return display;
-	}
-
-	/**
-	 * Returns the string from the resource bundle, or 'key' if not found.
-	 */
-	private String getResourceString(String key) {
-		if (key == null) {
-			return null;
-		}
-
-		try {
-			return _rb.getString(key);
-		} catch (MissingResourceException ee) {
-			return key;
-		}
-	}
-
-	/**
-	 * Throw a core exception built around the message with the correct plugin
-	 * id and resource bundle string.
-	 * 
-	 * @param msgKey -
-	 *            message resource bundle key for the message displayed to the
-	 *            user
-	 * @throws CoreException
-	 */
-	public void throwCoreException(String msgKey) throws CoreException {
-		IStatus status = new Status(IStatus.ERROR, _pluginId, IStatus.OK,
-				getResourceString(msgKey), null);
-		throw new CoreException(status);
-	}
-
-	/**
-	 * Throw a core exception built around the message with the correct plugin
-	 * id and resource bundle string.
-	 * 
-	 * @param ee -
-	 *            the real exception.
-	 * @throws CoreException
-	 */
-	public void throwCoreException(Throwable ee) throws CoreException {
-		IStatus status = new Status(IStatus.ERROR, _pluginId, IStatus.OK, ee
-				.getMessage(), ee);
-		throw new CoreException(status);
-	}
-
-	/**
-	 * Throw a core exception built around the message with the correct plugin
-	 * id and resource bundle string.
-	 * 
-	 * @param msgKey -
-	 *            message resource bundle key for the message displayed to the
-	 *            user
-	 * @param ee -
-	 *            the real exception.
-	 * @throws CoreException
-	 */
-	public void throwCoreException(String msgKey, Throwable ee)
-			throws CoreException {
-		IStatus status = new Status(IStatus.ERROR, _pluginId, IStatus.OK,
-				getResourceString(msgKey), ee);
-		throw new CoreException(status);
-	}
-
-	/**
-	 * Throw a core exception built around the message with the correct plugin
-	 * id and resource bundle string.
-	 * 
-	 * @param msgKey -
-	 *            message resource bundle key for the message displayed to the
-	 *            user
-	 * @param arg0 -
-	 *            arg to place into the resource bundle message.
-	 * @throws CoreException
-	 */
-	public void throwCoreException(String msgKey, Object arg0)
-			throws CoreException {
-		Object[] args = new Object[1];
-		args[0] = arg0;
-
-		MessageFormat formatter = new MessageFormat(getResourceString(msgKey));
-
-		IStatus status = new Status(IStatus.ERROR, _pluginId, IStatus.OK,
-				formatter.format(args), null);
-		throw new CoreException(status);
-	}
-
-	/**
-	 * Throw a core exception built around the message with the correct plugin
-	 * id and resource bundle string.
-	 * 
-	 * @param msgKey -
-	 *            message resource bundle key for the message displayed to the
-	 *            user
-	 * @param arg0 -
-	 *            arg to place into the resource bundle message.
-	 * @param ee -
-	 *            the real exception.
-	 * @throws CoreException
-	 */
-	public void throwCoreException(String msgKey, Object arg0, Throwable ee)
-			throws CoreException {
-		Object[] args = new Object[1];
-		args[0] = arg0;
-
-		MessageFormat formatter = new MessageFormat(getResourceString(msgKey));
-
-		IStatus status = new Status(IStatus.ERROR, _pluginId, IStatus.OK,
-				formatter.format(args), ee);
-		throw new CoreException(status);
-	}
-
-	/**
-	 * Throw a core exception built around the message with the correct plugin
-	 * id and resource bundle string.
-	 * 
-	 * @param msgKey -
-	 *            message resource bundle key for the message displayed to the
-	 *            user
-	 * @param arg0 -
-	 *            arg to place into the resource bundle message.
-	 * @param arg1 -
-	 *            arg to place into the resource bundle message.
-	 * @throws CoreException
-	 */
-	public void throwCoreException(String msgKey, Object arg0, Object arg1)
-			throws CoreException {
-		Object[] args = new Object[2];
-		args[0] = arg0;
-		args[1] = arg1;
-
-		MessageFormat formatter = new MessageFormat(getResourceString(msgKey));
-
-		IStatus status = new Status(IStatus.ERROR, _pluginId, IStatus.OK,
-				formatter.format(args), null);
-		throw new CoreException(status);
-	}
-
-	/**
-	 * Throw a core exception built around the message with the correct plugin
-	 * id and resource bundle string.
-	 * 
-	 * @param msgKey -
-	 *            message resource bundle key for the message displayed to the
-	 *            user
-	 * @param arg0 -
-	 *            arg to place into the resource bundle message.
-	 * @param arg1 -
-	 *            arg to place into the resource bundle message.
-	 * @param ee -
-	 *            the real exception.
-	 * @throws CoreException
-	 */
-	public void throwCoreException(String msgKey, Object arg0, Object arg1,
-			Throwable ee) throws CoreException {
-		Object[] args = new Object[2];
-		args[0] = arg0;
-		args[1] = arg1;
-
-		MessageFormat formatter = new MessageFormat(getResourceString(msgKey));
-
-		IStatus status = new Status(IStatus.ERROR, _pluginId, IStatus.OK,
-				formatter.format(args), ee);
-		throw new CoreException(status);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/guiutils/BrowserWindow.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/guiutils/BrowserWindow.java
deleted file mode 100644
index 33ce9fa..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/guiutils/BrowserWindow.java
+++ /dev/null
@@ -1,391 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.guiutils;
-
-import org.eclipse.jface.window.ApplicationWindow;
-import org.eclipse.jst.jsf.common.ui.JSFUICommonPlugin;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.browser.Browser;
-import org.eclipse.swt.browser.LocationAdapter;
-import org.eclipse.swt.browser.LocationEvent;
-import org.eclipse.swt.browser.OpenWindowListener;
-import org.eclipse.swt.browser.StatusTextEvent;
-import org.eclipse.swt.browser.StatusTextListener;
-import org.eclipse.swt.browser.WindowEvent;
-import org.eclipse.swt.custom.ScrolledComposite;
-import org.eclipse.swt.events.ControlAdapter;
-import org.eclipse.swt.events.ControlEvent;
-import org.eclipse.swt.events.ControlListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.ToolBar;
-import org.eclipse.swt.widgets.ToolItem;
-
-/**
- * Brings up a browser into a separate window.
- * 
- * @author mengbo.  
- * 
- * Unused???
- */
-public class BrowserWindow extends ApplicationWindow {
-
-	private static final String RELOAD_ITEM_IMAGE_FILE = "reload_nav_16.gif"; //$NON-NLS-1$
-
-	private static final String REFRESH_ITEM_IMAGE_FILE = "refresh_nav_16.gif"; //$NON-NLS-1$
-
-	private static final String STOP_ITEM_IMAGE_FILE = "stop_nav_16.gif"; //$NON-NLS-1$
-
-	private static final String FORWARD_ITEM_IMAGE_FILE = "forward_nav_16.gif"; //$NON-NLS-1$
-
-	private static final String BACK_ITEM_IMAGE_FILE = "back_nav_16.gif"; //$NON-NLS-1$
-
-	
-	/**
-	 * Command to send to the browser.
-	 */
-	private static final int BROWSER_CMD_BACK = 1;
-
-	private static final int BROWSER_CMD_FORWARD = 2;
-
-	private static final int BROWSER_CMD_STOP = 3;
-
-	private static final int BROWSER_CMD_REFRESH = 4;
-
-	private static final int BROWSER_CMD_RELOAD = 5;
-
-	private boolean _bIncludeToolbar;
-
-	private boolean _bPopups;
-
-	private String _title;
-
-	private ScrolledComposite _scomp;
-
-	private Composite _browserComposite;
-
-	private Browser _browser;
-
-	private String _startLocation;
-
-	private String _startContent;
-
-	// these items are browser context sensitive.
-	private ToolItem _backItem;
-
-	private ToolItem _forwardItem;
-
-	/**
-	 * @param parentShell
-	 *            owner of this window.
-	 */
-	public BrowserWindow(Shell parentShell) {
-		this(parentShell, false, null, false);
-	}
-
-	/**
-	 * @param parentShell
-	 *            owner of this window.
-	 * @param bPopups
-	 *            allow popup windows?
-	 * @param title
-	 *            Tittle on window.
-	 */
-	public BrowserWindow(Shell parentShell, boolean bPopups, String title) {
-		this(parentShell, bPopups, title, false);
-	}
-
-	/**
-	 * @param parentShell
-	 *            owner of this window.
-	 * @param bPopups
-	 *            allow popup windows?
-	 * @param title
-	 *            Tittle on window.
-	 * @param bModal
-	 *            pretend to a be a dialog?
-	 */
-	public BrowserWindow(Shell parentShell, boolean bPopups, String title,
-			boolean bModal) {
-		super(parentShell);
-		addStatusLine();
-		_bPopups = bPopups;
-		_title = title;
-		includeToolbar(true);
-
-		if (bModal && (parentShell != null)) {
-			// APPLICATION_MODAL, MODELESS, PRIMARY_MODAL, SYSTEM_MODAL
-			setShellStyle(getShellStyle() | SWT.APPLICATION_MODAL);
-			setBlockOnOpen(true);
-		}
-	}
-
-	/**
-	 * Default is true, set whether to include the toolbar at the top. This must
-	 * be called before the window is opened.
-	 * 
-	 * @param bIncludeToolbar
-	 */
-	public void includeToolbar(boolean bIncludeToolbar) {
-		_bIncludeToolbar = bIncludeToolbar;
-	}
-
-	/**
-	 * @param title
-	 */
-	public void setTitle(String title) {
-		if ((title != null) && (super.getShell() != null)) {
-			super.getShell().setText(title);
-		}
-	}
-
-	/**
-	 * @param startLocation
-	 */
-	/**
-	 * @param startLocation
-	 */
-	public void setStartLocation(String startLocation) {
-		_startLocation = startLocation;
-	}
-
-	/**
-	 * @param startContent
-	 */
-	public void setStartContent(String startContent) {
-		_startContent = startContent;
-	}
-
-	/**
-	 * @return the browser object
-	 */
-	public Browser getBrowser() {
-		return _browser;
-	}
-
-	protected Control createContents(Composite parent) {
-		// Create the scroll composite as the one inside the parent.
-		_scomp = new ScrolledComposite(parent, SWT.V_SCROLL | SWT.H_SCROLL);
-
-		// Create the composite that goes inside the scroller. We will use this
-		// for
-		// everything else from here.
-		Composite innerComposite = SWTUtils.createComposite(_scomp, 1, 10, -1);
-		_scomp.setContent(innerComposite);
-		ControlListener listener = new ControlAdapter() {
-			// this will handle resizing the browser when the window is resized.
-			public void controlResized(ControlEvent e) {
-				Point pt = _scomp.getParent().getSize();
-				Rectangle rect = _browserComposite.getBounds();
-
-				pt.x -= rect.x;
-				pt.y -= rect.y;
-
-				// spacing offsets in the composites.
-				pt.x -= 10;
-				pt.y -= 60; // need status bar at bottom...30 more than normal.
-
-				// do the sanity check here since it prevents further checks.
-				if ((pt.x <= 0) || (pt.y <= 0)) {
-					return;
-				}
-
-				Rectangle innerRect = _scomp.getContent().getBounds();
-				Rectangle outerRect = _scomp.getBounds();
-
-				// substract if the scroll bars are visible.
-				if (innerRect.width > outerRect.width) {
-					pt.y -= _scomp.getHorizontalBar().getSize().y;
-				}
-				if (innerRect.height > outerRect.height) {
-					pt.x -= _scomp.getVerticalBar().getSize().x;
-				}
-
-				_browserComposite.setSize(pt);
-				_browserComposite.getParent().layout(true);
-			}
-		};
-		_scomp.addControlListener(listener);
-
-		if (_bIncludeToolbar) {
-			// ////////////////////////////////////////
-			// toobar
-			// ////////////////////////////////////////
-			ToolBar tb = new ToolBar(innerComposite, SWT.HORIZONTAL | SWT.FLAT);
-			fillToolbar(tb);
-		}
-
-		// ////////////////////////////////////////
-		// browser
-		// ////////////////////////////////////////
-		_browserComposite = new Composite(innerComposite, SWT.NULL);
-		_browserComposite.setLayout(new FillLayout());
-
-		_browser = new Browser(_browserComposite, SWT.NULL);
-
-		if (_startLocation != null) {
-			_browser.setUrl(_startLocation);
-		} else if (_startContent != null) {
-			_browser.setText(_startContent);
-		} else {
-			_browser.setText(Messages.BrowserWindow_loading);
-		}
-
-		// send the browser status messages to eclipse.
-		_browser.addStatusTextListener(new StatusTextListener() {
-			public void changed(StatusTextEvent event) {
-				setStatus(event.text);
-			}
-		});
-
-		if (_bIncludeToolbar) {
-			// check for change in location so we can enable the back/forward
-			// buttons.
-			_browser.addLocationListener(new LocationAdapter() {
-				public void changed(LocationEvent event) {
-					// check if there is something in the forward or back queue.
-					_backItem.setEnabled(_browser.isBackEnabled());
-					_forwardItem.setEnabled(_browser.isForwardEnabled());
-				}
-			});
-		}
-
-		// check is we need to open a new window.
-		_browser.addOpenWindowListener(new OpenWindowListener() {
-			public void open(WindowEvent event) {
-				if (_bPopups) {
-					BrowserWindow window = new BrowserWindow(getShell());
-					window.open();
-					event.browser = window.getBrowser();
-				} else {
-					event.browser = getBrowser();
-				}
-			}
-		});
-
-		setTitle(_title);
-		SWTUtils.computeScrollArea(_scomp, innerComposite);
-		return _scomp;
-	}
-
-	/**
-	 * Fill the toolbar for this window. This method can be overwritten to place
-	 * other toolbar controls in the bar.
-	 * 
-	 * @param tb
-	 */
-	protected void fillToolbar(ToolBar tb) {
-		// Back browser
-		_backItem = new ToolItem(tb, SWT.PUSH);
-		_backItem.setImage(JSFUICommonPlugin.getDefault()
-				.getImage(BACK_ITEM_IMAGE_FILE));
-		_backItem.setToolTipText(JSFUICommonPlugin
-				.getResourceString("BrowserWindow.back.tooltip")); //$NON-NLS-1$
-		SelectionListener backSelectionListener = new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent event) {
-				browserCmd(BROWSER_CMD_BACK);
-			}
-		};
-		_backItem.addSelectionListener(backSelectionListener);
-
-		// Forward Browser
-		_forwardItem = new ToolItem(tb, SWT.PUSH);
-		_forwardItem.setImage(JSFUICommonPlugin.getDefault().getImage(
-				FORWARD_ITEM_IMAGE_FILE));
-		_forwardItem.setToolTipText(JSFUICommonPlugin
-				.getResourceString("BrowserWindow.forward.tooltip")); //$NON-NLS-1$
-		SelectionListener forwardSelectionListener = new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent event) {
-				browserCmd(BROWSER_CMD_FORWARD);
-			}
-		};
-		_forwardItem.addSelectionListener(forwardSelectionListener);
-
-		// Stop Browser
-		ToolItem stopItem = new ToolItem(tb, SWT.PUSH);
-		stopItem
-				.setImage(JSFUICommonPlugin.getDefault().getImage(STOP_ITEM_IMAGE_FILE));
-		stopItem.setToolTipText(JSFUICommonPlugin
-				.getResourceString("BrowserWindow.stop.tooltip")); //$NON-NLS-1$
-		SelectionListener stopSelectionListener = new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent event) {
-				browserCmd(BROWSER_CMD_STOP);
-			}
-		};
-		stopItem.addSelectionListener(stopSelectionListener);
-
-		// Refresh Browser
-		ToolItem refreshItem = new ToolItem(tb, SWT.PUSH);
-		refreshItem.setImage(JSFUICommonPlugin.getDefault().getImage(
-				REFRESH_ITEM_IMAGE_FILE));
-		refreshItem.setToolTipText(JSFUICommonPlugin
-				.getResourceString("BrowserWindow.refresh.tooltip")); //$NON-NLS-1$
-		SelectionListener refreshServiceSelectionListener = new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent event) {
-				browserCmd(BROWSER_CMD_REFRESH);
-			}
-		};
-		refreshItem.addSelectionListener(refreshServiceSelectionListener);
-
-		if ((_startLocation != null) || (_startContent != null)) {
-			// Reload Browser.
-			ToolItem reloadItem = new ToolItem(tb, SWT.PUSH);
-			reloadItem.setImage(JSFUICommonPlugin.getDefault().getImage(
-					RELOAD_ITEM_IMAGE_FILE));
-			reloadItem.setToolTipText(JSFUICommonPlugin
-					.getResourceString("BrowserWindow.reload.tooltip")); //$NON-NLS-1$
-			SelectionListener reloadSelectionListener = new SelectionAdapter() {
-				public void widgetSelected(SelectionEvent event) {
-					browserCmd(BROWSER_CMD_RELOAD);
-				}
-			};
-			reloadItem.addSelectionListener(reloadSelectionListener);
-		}
-	}
-
-	/**
-	 * send the browser widget a command as defined by the cmd constant defines.
-	 * @param cmd
-	 * 
-	 * @return true if the command was successful.
-	 */
-	public boolean browserCmd(int cmd) {
-		switch (cmd) {
-		case BROWSER_CMD_BACK:
-			return _browser.back();
-		case BROWSER_CMD_FORWARD:
-			return _browser.forward();
-		case BROWSER_CMD_STOP:
-			_browser.stop();
-			return true;
-		case BROWSER_CMD_REFRESH:
-			_browser.refresh();
-			return true;
-		case BROWSER_CMD_RELOAD:
-			if (_startLocation != null) {
-				_browser.setUrl(_startLocation);
-			} else if (_startContent != null) {
-				_browser.setText(_startContent);
-			}
-			return true;
-
-		}
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/guiutils/CollapsableSection.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/guiutils/CollapsableSection.java
deleted file mode 100644
index f787c22..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/guiutils/CollapsableSection.java
+++ /dev/null
@@ -1,148 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.guiutils;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.ScrolledComposite;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.ui.forms.events.ExpansionAdapter;
-import org.eclipse.ui.forms.events.ExpansionEvent;
-import org.eclipse.ui.forms.widgets.ExpandableComposite;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.forms.widgets.Section;
-
-/**
- * Creates a class to be used to build a control for a collapseable area inside
- * a scrollable composite. This will take care of scrollbar resize.
- * 
- * Example use:
- * 
- * CollapsableSection cs = new CollapsableSection(toolkit, scomp, "General",
- * true) { public void setCollapsableContent(Composite composite) { // place
- * your content on this composite.... } }); cs.createControl(composite,
- * horizontalSpan);
- * 
- * @author mengbo
- * 
- */
-public abstract class CollapsableSection {
-	// internal fields needed for doing the section and computing the scrollbar
-	// on a collapse.
-	private FormToolkit _toolkit;
-
-	private Section _section;
-
-	private ScrolledComposite _scomp;
-
-	private String _title;
-
-	private int _expansionStyle;
-
-	/**
-	 * Creates a class to be used to build the control for a collapseable area.
-	 * 
-	 * @param toolkit 
-	 * 
-	 * @param scomp
-	 *            the scrollable composite used inside the container. This is
-	 *            used to force resizing of the bars on dinking the control.
-	 * @param title
-	 *            the string to place next to the collapsable icon.
-	 * @param bCollapsed
-	 *            should this area start collapsed?
-	 */
-	public CollapsableSection(FormToolkit toolkit, ScrolledComposite scomp,
-			String title, boolean bCollapsed) {
-		_toolkit = toolkit;
-		_scomp = scomp;
-		_title = title;
-		_expansionStyle = ExpandableComposite.TWISTIE
-				| ExpandableComposite.FOCUS_TITLE;
-		if (bCollapsed) {
-			_expansionStyle |= ExpandableComposite.COMPACT;
-		} else {
-			_expansionStyle |= ExpandableComposite.EXPANDED;
-		}
-	}
-
-	/**
-	 * Build the GUI parts of the Collapsable area into the given composite.
-	 * NOTE: you must set the layout on this composite before adding swt
-	 * widgets.
-	 * 
-	 * @param composite
-	 */
-	abstract public void setCollapsableContent(Composite composite);
-
-	/**
-	 * A convient way to build the widget into a control and place it on the
-	 * page. NOTE: this method will build the Section and call
-	 * setCollapsableContent with a composite to fill in the inner area.
-	 * 
-	 * @param parent
-	 * @param horizontalSpan
-	 *            how many columns should this control span.
-	 * @return Control that was added to the composite.
-	 */
-	public Control createControl(Composite parent, int horizontalSpan) {
-		_section = _toolkit.createSection(parent, _expansionStyle);
-		_section.clientVerticalSpacing = 5; // space between the dink and the
-		// controls in when opened.
-		// _section.marginHeight = 5; // indents the entire section.
-		// _section.marginWidth = 5; // indents the entire section.
-		_section.setText(_title);
-		_toolkit.createCompositeSeparator(_section);
-		_section.addExpansionListener(new ExpansionAdapter() {
-			public void expansionStateChanged(ExpansionEvent event) {
-				SWTUtils.computeScrollArea(_scomp, (Composite) _scomp
-						.getContent());
-			}
-		});
-
-		Composite content = new Composite(_section, SWT.NULL);
-		setCollapsableContent(content);
-
-		_section.setClient(content);
-		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-		gd.horizontalSpan = horizontalSpan;
-		_section.setLayoutData(gd);
-
-		return _section;
-	}
-
-	/**
-	 * Programmatically changes expanded state.
-	 * 
-	 * @param expanded
-	 *            the new expanded state
-	 */
-	public void setExpanded(boolean expanded) {
-		if (_section != null) {
-			_section.setExpanded(expanded);
-
-			// NOTE: internal calling of expanding doesn't fire
-			// the event to resize. We do it here.
-			SWTUtils.computeScrollArea(_scomp, (Composite) _scomp.getContent());
-		}
-	}
-
-	/**
-	 * Return the internal Section control for more advanced things.
-	 * 
-	 * @return Section
-	 */
-	public Section getSection() {
-		return _section;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/guiutils/FavoriteSection.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/guiutils/FavoriteSection.java
deleted file mode 100644
index be9882c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/guiutils/FavoriteSection.java
+++ /dev/null
@@ -1,152 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.guiutils;
-
-import java.util.Properties;
-
-import org.eclipse.jst.jsf.common.ui.JSFUICommonPlugin;
-import org.eclipse.jst.jsf.common.ui.internal.utils.FavoriteConfigurations;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-
-/**
- * Builds a favorites with the given name in the plugins resources. This build a
- * generic looking favorites section.
- * 
- * @author mengbo
- */
-public abstract class FavoriteSection {
-	private FavoriteConfigurations _favorites;
-
-	private Combo _favoriteCombo;
-
-	/**
-	 * @param plugin
-	 * @param favoriteName
-	 */
-	public FavoriteSection(AbstractUIPlugin plugin, String favoriteName) {
-		_favorites = new FavoriteConfigurations(plugin, favoriteName);
-	}
-
-	/**
-	 * @param parent
-	 * @param horizontalSpan
-	 * @param comboMinWidth
-	 * @return the combo
-	 */
-	public Combo createFavoriteGroup(Composite parent, int horizontalSpan,
-			int comboMinWidth) {
-		Group favGroup = SWTUtils.createGroup(parent, JSFUICommonPlugin
-				.getResourceString("favorites.group.label"), 4, horizontalSpan, //$NON-NLS-1$
-				GridData.BEGINNING | GridData.CENTER);
-
-		// Add favorite text field
-		SWTUtils.createLabel(favGroup, JSFUICommonPlugin
-				.getResourceString("favorites.label"), 1); //$NON-NLS-1$
-		_favoriteCombo = SWTUtils.createCombo(favGroup, _favorites
-				.getFavoritesList(), 1, comboMinWidth, true);
-		_favoriteCombo.setToolTipText(JSFUICommonPlugin
-				.getResourceString("favorites.tooltip")); //$NON-NLS-1$
-		_favoriteCombo.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent event) {
-				String favName = _favoriteCombo.getText().trim();
-				if (favName.length() > 0) {
-					Properties favProp = _favorites.getFavorite(_favoriteCombo
-							.getText().trim());
-					if (favProp != null) {
-						setFavorites(favProp);
-					}
-				}
-			}
-		});
-
-		// Add Save button
-		Button saveButton = SWTUtils.createPushButton(favGroup, JSFUICommonPlugin
-				.getResourceString("button.save")); //$NON-NLS-1$
-		saveButton.setToolTipText(JSFUICommonPlugin
-				.getResourceString("favorites.save.tooltip")); //$NON-NLS-1$
-		saveButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent event) {
-				String favName = _favoriteCombo.getText().trim();
-				if (favName.length() == 0) {
-					favName = JSFUICommonPlugin
-							.getResourceString("favorites.default"); //$NON-NLS-1$
-				}
-				Properties favProp = new Properties();
-				saveFavorites(favProp);
-
-				_favorites.addFavorite(favName, favProp);
-				_favorites.saveFavorites();
-
-				_favoriteCombo.removeAll();
-				String[] names = _favorites.getFavoritesList();
-
-				_favoriteCombo.setItems(names);
-				_favoriteCombo.setText(favName);
-			}
-		});
-
-		// Add Remove button
-		Button removeButton = SWTUtils.createPushButton(favGroup, JSFUICommonPlugin
-				.getResourceString("button.remove")); //$NON-NLS-1$
-		removeButton.setToolTipText(JSFUICommonPlugin
-				.getResourceString("favorites.remove.tooltip")); //$NON-NLS-1$
-		removeButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent event) {
-				String favName = _favoriteCombo.getText().trim();
-				if (favName.length() > 0) {
-					_favorites.removeFavorite(favName);
-					_favorites.saveFavorites();
-
-					removeFavorites();
-
-					_favoriteCombo.removeAll();
-					String[] names = _favorites.getFavoritesList();
-					_favoriteCombo.setItems(names);
-				}
-			}
-		});
-
-		return _favoriteCombo;
-	}
-
-	/**
-	 * This method will be called when a new favorite is set. This allows the
-	 * caller to set their values from the properties supplied.
-	 * 
-	 * @param prop
-	 */
-	public abstract void setFavorites(Properties prop);
-
-	/**
-	 * This method will be called when a new favorite is saved. This allows the
-	 * caller to save their values into the properties supplied.
-	 * 
-	 * @param prop
-	 */
-	public abstract void saveFavorites(Properties prop);
-
-	/**
-	 * This method will be called when the active favorite is removed. It allows
-	 * for clearing fields.
-	 */
-	public void removeFavorites() {
-		// do nothing.
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/guiutils/ImageContainer.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/guiutils/ImageContainer.java
deleted file mode 100644
index 8f697d1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/guiutils/ImageContainer.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.guiutils;
-
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ControlAdapter;
-import org.eclipse.swt.events.ControlEvent;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
-import org.eclipse.swt.events.PaintEvent;
-import org.eclipse.swt.events.PaintListener;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Composite;
-
-/**
- * A general purpose class for displying an image in a composite. There is no
- * eclipse tool for doing this other than CLabl which is bulkly.
- * 
- * This was original written by Karl Reti.
- * 
- * @author mengbo
- */
-public class ImageContainer extends Composite {
-	private Image _image = null;
-
-	private boolean _bCleanupImage;
-
-	/**
-	 * @param parent
-	 */
-	public ImageContainer(Composite parent) {
-		super(parent, SWT.NONE);// SWT.NO_BACKGROUND );//|
-		// SWT.NO_REDRAW_RESIZE);
-		setBackground(ColorConstants.white);
-		// paint the image
-		addPaintListener(new PaintListener() {
-			public void paintControl(PaintEvent e) {
-				if (_image != null) {
-					e.gc.drawImage(_image, 0, 0);
-				}
-			}
-
-		});
-
-		addControlListener(new ControlAdapter() {
-			public void controlResized(ControlEvent e) {
-				setSize(_image.getBounds().width, _image.getBounds().height);
-			}
-		});
-
-		// tidy up
-		addDisposeListener(new DisposeListener() {
-			public void widgetDisposed(DisposeEvent e) {
-				if (_bCleanupImage && _image != null && !_image.isDisposed()) {
-					_image.dispose();
-				}
-			}
-		});
-	}
-
-	/**
-	 * @return Returns the image.
-	 */
-	public Image getImage() {
-		return _image;
-	}
-
-	/**
-	 * @return should the image be disposed of on cleanup. Set false if the
-	 *         image is cached.
-	 */
-	public boolean isCleanupImage() {
-		return _bCleanupImage;
-	}
-
-	/**
-	 * @param image
-	 *            The image to set.
-	 */
-	public void setImage(Image image) {
-		setImage(image, false);
-	}
-
-	/**
-	 * @param image
-	 *            The image to set.
-	 * @param bCleanupImage 
-	 */
-	public void setImage(Image image, boolean bCleanupImage) {
-		_image = image;
-		_bCleanupImage = bCleanupImage;
-		setSize(image.getBounds().width, image.getBounds().height);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/guiutils/IntroductionSection.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/guiutils/IntroductionSection.java
deleted file mode 100644
index a022c1b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/guiutils/IntroductionSection.java
+++ /dev/null
@@ -1,351 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.common.ui.internal.guiutils;
-
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.help.HelpSystem;
-import org.eclipse.help.IContext;
-import org.eclipse.help.IHelpResource;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.resource.ImageRegistry;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.jst.jsf.common.ui.JSFUICommonPlugin;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.RowLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.SectionPart;
-import org.eclipse.ui.forms.events.HyperlinkAdapter;
-import org.eclipse.ui.forms.events.HyperlinkEvent;
-import org.eclipse.ui.forms.widgets.ExpandableComposite;
-import org.eclipse.ui.forms.widgets.FormText;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.forms.widgets.Hyperlink;
-import org.eclipse.ui.forms.widgets.ImageHyperlink;
-import org.eclipse.ui.forms.widgets.Section;
-import org.eclipse.ui.forms.widgets.TableWrapData;
-import org.eclipse.ui.forms.widgets.TableWrapLayout;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-
-/**
- * Provides a standard looking introduction section for a intro page for the
- * editors. This was taken and is suppose to look like the standard Sybase
- * workspace service editors intro page.
- * 
- * this was original written by Collinsc
- * 
- * TODO: Should this be moved into the facesconfig ui plugin since it is only
- * really used there?
- * 
- * @author collinsc,jchoi
- */
-public class IntroductionSection extends SectionPart {
-
-	private static final String HELP_IMAGE_FILE = "help.gif"; //$NON-NLS-1$
-
-	private static Logger _log = JSFUICommonPlugin
-			.getLogger(IntroductionSection.class);
-
-	private String _editorId;
-
-	private FormToolkit _toolkit;
-
-	// private ImageHyperlink _helpImage;
-	private Composite _textClient;
-
-	private String _helpContextId;
-
-	private String _helpTooltip;
-
-	/**
-	 * Basic constructor - no help with this one.
-	 * 
-	 * @param editorId
-	 *            id of the editor this page is for.
-	 * @param managedForm
-	 * @param toolkit
-	 */
-	public IntroductionSection(String editorId, IManagedForm managedForm,
-			FormToolkit toolkit) {
-		this(editorId, managedForm, toolkit, null, null);
-	}
-
-	/**
-	 * Constructor with help option.
-	 * 
-	 * @param editorId
-	 *            id of the editor this page is for.
-	 * @param managedForm
-	 * @param toolkit
-	 * @param contextId 
-	 * @param helpTooltip
-	 */
-	public IntroductionSection(String editorId, IManagedForm managedForm,
-			FormToolkit toolkit, final String contextId, String helpTooltip) {
-		super(managedForm.getForm().getBody(), toolkit,
-				ExpandableComposite.TITLE_BAR | Section.DESCRIPTION);
-		super.initialize(managedForm);
-		this._editorId = editorId;
-		this._toolkit = toolkit;
-		this._helpContextId = contextId;
-		this._helpTooltip = helpTooltip;
-
-		this._textClient = this._toolkit.createComposite(getSection(), SWT.NONE);
-		this._textClient.setSize(32, 16);
-
-		RowLayout rowLayout = new RowLayout();
-		rowLayout.wrap = false;
-		rowLayout.pack = false;
-		rowLayout.justify = true;
-		rowLayout.type = SWT.HORIZONTAL;
-		rowLayout.marginLeft = 0;
-		rowLayout.marginTop = 0;
-		rowLayout.marginRight = 0;
-		rowLayout.marginBottom = 0;
-		rowLayout.spacing = 0;
-		this._textClient.setLayout(rowLayout);
-
-		this._toolkit.adapt(this._textClient, true, true);
-		getSection().setTextClient(this._textClient);
-
-		if (this._helpContextId != null) {
-			// setup the help image.
-			ImageHyperlink helpImage = new ImageHyperlink(this._textClient,
-					SWT.NONE);
-			this._toolkit.adapt(helpImage, true, true);
-			helpImage.setImage(JSFUICommonPlugin.getDefault().getImage(HELP_IMAGE_FILE));
-			if (this._helpTooltip != null) {
-				helpImage.setToolTipText(this._helpTooltip);
-			}
-			helpImage.setBackground(getSection()
-					.getTitleBarGradientBackground());
-			helpImage.addHyperlinkListener(new HyperlinkAdapter() {
-				public void linkActivated(HyperlinkEvent e) {
-					IContext context = HelpSystem.getContext(_helpContextId);
-					if (context != null) {
-						IHelpResource[] topics = context.getRelatedTopics();
-						if (topics != null && topics.length == 1) {
-                            PlatformUI.getWorkbench().getHelpSystem().displayHelpResource(topics[0]
-									.getHref());
-						} else {
-                            PlatformUI.getWorkbench().getHelpSystem().displayHelp(_helpContextId);
-						}
-					}
-				}
-			});
-		}
-
-		Composite client = this._toolkit.createComposite(getSection());
-		createClient(client, this._toolkit);
-		getSection().setClient(client);
-	}
-
-	private Composite createClient(Composite container, FormToolkit factory) {
-		TableWrapLayout layout = new TableWrapLayout();
-		layout.numColumns = 2;
-		layout.makeColumnsEqualWidth = false;
-		layout.horizontalSpacing = 20;
-		layout.verticalSpacing = 20;
-		container.setLayout(layout);
-
-		IConfigurationElement element = getExtensions();
-
-		if (element != null) {
-			setPageDetails(element);
-
-			IConfigurationElement[] children = element.getChildren();
-			for (int ii = 0; ii < children.length; ii++) {
-				processItems(container, factory, children[ii]);
-			}
-		} else {
-			setText(Messages.IntroductionSection_noIntroTitle);
-
-			setDescription(Messages.IntroductionSection_noIntroDescription);
-		}
-
-		factory.paintBordersFor(container);
-        PlatformUI.getWorkbench().getHelpSystem().setHelp(container, _helpContextId);
-		return container;
-	}
-
-	/**
-	 * set the page details from the extensionpoint
-	 * 
-	 * @param element
-	 */
-	private void setPageDetails(IConfigurationElement element) {
-		setText(element.getAttribute("name")); //$NON-NLS-1$
-		setDescription(element.getAttribute("description")); //$NON-NLS-1$
-	}
-
-	/**
-	 * add the extension elements to the page
-	 * 
-	 * @param parent
-	 * @param toolkit_
-	 * @param element
-	 */
-	private void processItems(Composite parent, FormToolkit toolkit_,
-			IConfigurationElement element) {
-		String hyperlink = element.getAttribute("hyperlink"); //$NON-NLS-1$
-		String iconPath = element.getAttribute("icon"); //$NON-NLS-1$
-		String text = element.getAttribute("text"); //$NON-NLS-1$
-		String heading = element.getAttribute("heading"); //$NON-NLS-1$
-		String action = element.getAttribute("hyperlinkaction"); //$NON-NLS-1$
-		//String actionparameters = element.getAttribute("actionparameters"); //$NON-NLS-1$
-
-		if (iconPath != null && iconPath.length() > 0) {
-			// add an icon to the page
-			String iconName;
-			if (iconPath.indexOf(IPath.SEPARATOR) != -1) {
-				iconName = new Path(iconPath).lastSegment();
-			} else {
-				iconName = iconPath;
-			}
-
-			ImageDescriptor imageDescriptor = AbstractUIPlugin
-					.imageDescriptorFromPlugin(
-							element.getDeclaringExtension()
-									.getContributor().getName(), iconPath);
-			
-			if (imageDescriptor != null)
-			{
-				ImageRegistry imageRegistry =
-					JSFUICommonPlugin.getDefault().getImageRegistry();
-				
-				
-				Image image = imageRegistry.get(iconName);
-				
-				if (image == null)
-				{
-					image = imageDescriptor.createImage();
-					
-					if (image != null)
-					{
-						imageRegistry.put(iconName, image);
-					}
-					else
-					{
-						image = ImageDescriptor.getMissingImageDescriptor().createImage();
-					}
-				}
-				
-				if (image != null)
-				{
-					ImageContainer img = new ImageContainer(parent);
-					img.setImage(image);
-					TableWrapData td = new TableWrapData();
-					td.rowspan = 2;
-					img.setLayoutData(td);
-				}
-				else
-				{
-					JSFUICommonPlugin.getLogger(this.getClass()).error(new Throwable("Image not created for "+element)); //$NON-NLS-1$
-				}
-			}
-			else
-			{
-				JSFUICommonPlugin.getLogger(this.getClass()).error(new Throwable("Image Descriptor not found for "+element)); //$NON-NLS-1$
-			}
-		}
-
-		if (heading != null && heading.length() > 0) {
-			// add a header
-			Label lbl = toolkit_.createLabel(parent, heading);
-			lbl.setFont(JFaceResources.getHeaderFont());
-		}
-
-		if (hyperlink != null && hyperlink.length() > 0) {
-			Hyperlink hypr = toolkit_.createHyperlink(parent, hyperlink,
-					SWT.NONE);
-			if (action != null && action.length() > 0) {
-				try {
-					final IAction thisAction = (IAction) element
-							.createExecutableExtension("hyperlinkaction"); //$NON-NLS-1$
-					hypr.addHyperlinkListener(new HyperlinkAdapter() {
-						public void linkActivated(HyperlinkEvent e) {
-							thisAction.run();
-						}
-					});
-				} catch (Exception ee) {
-					// log.IntroductionSection.action.error=Failed to launch the
-					// link {0}.
-					_log.error("log.IntroductionSection.action.error", //$NON-NLS-1$
-							hyperlink, ee);
-					JSFUICommonPlugin.getAlerts().detailError(hyperlink,
-							"log.IntroductionSection.action.error", hyperlink, //$NON-NLS-1$
-							ee);
-				}
-			}
-		}
-
-		if (text != null && text.length() > 0) {
-			FormText form = toolkit_.createFormText(parent, false);
-			form.setText(text, false, false);
-		}
-	}
-
-	/**
-	 * Get the extension elements for the Introduction pages
-	 */
-	private IConfigurationElement getExtensions() {
-		// find all service editor page extensions
-		IConfigurationElement element = null;
-
-		// find all service editor parameter dialog extensions
-		IConfigurationElement[] elements = Platform
-				.getExtensionRegistry()
-				.getConfigurationElementsFor(
-						"org.eclipse.jst.jsf.common.ui.introductionPage"); //$NON-NLS-1$
-		if (elements.length > 0) {
-			for (int ii = 0; ii < elements.length; ii++) {
-				// get extensions for this dialog
-				// String extPluginId =
-				// elements[ii].getDeclaringExtension().getNamespace();
-				String editorId1 = elements[ii].getDeclaringExtension()
-						.getSimpleIdentifier();
-
-				// see if we have any contributuins of dialogs
-				if (this._editorId.equals(editorId1)) {
-					element = elements[ii];
-					break;
-				}
-			}
-		}
-		return element;
-	}
-
-	private void setText(String text) {
-		getSection().setText(text);
-	}
-
-	private void setDescription(String text) {
-		getSection().setDescription(text);
-	}
-
-	/**
-	 * Set this section's layout data
-	 * @param layoutData
-	 */
-	public void setLayoutData(Object layoutData) {
-		getSection().setLayoutData(layoutData);
-	}
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/guiutils/Messages.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/guiutils/Messages.java
deleted file mode 100644
index b877236..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/guiutils/Messages.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package org.eclipse.jst.jsf.common.ui.internal.guiutils;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * String resource handler.
- * 
- * @author Debajit Adhikary - Oracle
- */
-
-public class Messages extends NLS {
-
-	private static final String BUNDLE_NAME = "org.eclipse.jst.jsf.common.ui.internal.guiutils.messages"; //$NON-NLS-1$
-	
-	/**
-	 * See messages.properties.
-	 */
-	public static String IntroductionSection_noIntroDescription;
-	
-	/**
-	 * See messages.properties.
-	 */
-	public static String IntroductionSection_noIntroTitle;
-	
-	/**
-	 * See messages.properties.
-	 */
-	public static String BrowserWindow_loading;
-
-	
-	static {
-		// initialize resource bundle
-		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/guiutils/OverviewSection.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/guiutils/OverviewSection.java
deleted file mode 100644
index 4654c40..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/guiutils/OverviewSection.java
+++ /dev/null
@@ -1,287 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.guiutils;
-
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.help.HelpSystem;
-import org.eclipse.help.IContext;
-import org.eclipse.help.IHelpResource;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jst.jsf.common.ui.JSFUICommonPlugin;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.RowLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.SectionPart;
-import org.eclipse.ui.forms.editor.FormEditor;
-import org.eclipse.ui.forms.events.HyperlinkAdapter;
-import org.eclipse.ui.forms.events.HyperlinkEvent;
-import org.eclipse.ui.forms.widgets.ExpandableComposite;
-import org.eclipse.ui.forms.widgets.FormText;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.forms.widgets.Hyperlink;
-import org.eclipse.ui.forms.widgets.ImageHyperlink;
-import org.eclipse.ui.forms.widgets.Section;
-
-
-/**
- * @author jchoi
- * @version
- */
-public class OverviewSection extends SectionPart {
-
-	private static final String HELP_IMAGE_FILE = "help.gif"; //$NON-NLS-1$
-
-	private static Logger log = JSFUICommonPlugin.getLogger(OverviewSection.class);
-
-	private String editorId;
-
-	private FormToolkit toolkit;
-
-	private ImageHyperlink helpImage;
-
-	private Composite textClient;
-
-	private String helpContextId;
-
-	private String helpTooltip;
-
-	/**
-	 * @param editorId 
-	 * @param managedForm 
-	 * @param toolkit
-	 */
-	public OverviewSection(String editorId, IManagedForm managedForm,
-			FormToolkit toolkit) {
-		this(editorId, managedForm, toolkit, null, null);
-
-	}
-
-	/**
-	 * Constructor with help option.
-	 * 
-	 * @param editorId
-	 *            id of the editor this page is for.
-	 * @param managedForm
-	 * @param toolkit
-	 * @param helpContextId
-	 * @param helpTooltip
-	 */
-	public OverviewSection(String editorId, IManagedForm managedForm,
-			FormToolkit toolkit, String helpContextId, String helpTooltip) {
-		super(managedForm.getForm().getBody(), toolkit,
-				ExpandableComposite.TITLE_BAR | Section.DESCRIPTION);
-		super.initialize(managedForm);
-		this.editorId = editorId;
-		this.toolkit = toolkit;
-		this.helpContextId = helpContextId;
-		this.helpTooltip = helpTooltip;
-
-		this.textClient = this.toolkit.createComposite(getSection(), SWT.NONE);
-		this.textClient.setSize(32, 16);
-
-		init();
-
-		Composite client = this.toolkit.createComposite(getSection());
-		//createClient(client, this.toolkit);
-		getSection().setClient(client);
-	}
-
-	/**
-	 * @param editor 
-	 * @param managedForm 
-	 * @param toolkit
-	 * @param style
-	 */
-	public OverviewSection(FormEditor editor, IManagedForm managedForm,
-			FormToolkit toolkit, int style) {
-		super(managedForm.getForm().getBody(), toolkit,
-				ExpandableComposite.TITLE_BAR | style);
-		super.initialize(managedForm);
-		this.toolkit = toolkit;
-
-		this.textClient = this.toolkit.createComposite(getSection(), SWT.NONE);
-		this.textClient.setSize(32, 16);
-
-		init();
-	}
-
-	/**
-	 * @param editor
-	 * @param managedForm
-	 * @param toolkit
-	 * @param style
-	 * @param helpContextId
-	 * @param helpTooltip
-	 */
-	public OverviewSection(FormEditor editor, IManagedForm managedForm,
-			FormToolkit toolkit, int style, String helpContextId,
-			String helpTooltip) {
-		super(managedForm.getForm().getBody(), toolkit,
-				ExpandableComposite.TITLE_BAR | style);
-		super.initialize(managedForm);
-		this.toolkit = toolkit;
-
-		this.textClient = toolkit.createComposite(getSection(), SWT.NONE);
-		this.textClient.setSize(32, 16);
-		this.helpContextId = helpContextId;
-		this.helpTooltip = helpTooltip;
-		init();
-	}
-
-	/**
-	 * 
-	 */
-	public void initialize() {
-		Composite client = toolkit.createComposite(getSection());
-		//createClient(client, toolkit);
-		getSection().setClient(client);
-	}
-
-	private void init() {
-		RowLayout rowLayout = new RowLayout();
-		rowLayout.wrap = false;
-		rowLayout.pack = false;
-		rowLayout.justify = true;
-		rowLayout.type = SWT.HORIZONTAL;
-		rowLayout.marginLeft = 0;
-		rowLayout.marginTop = 0;
-		rowLayout.marginRight = 0;
-		rowLayout.marginBottom = 0;
-		rowLayout.spacing = 0;
-		textClient.setLayout(rowLayout);
-
-		helpImage = new ImageHyperlink(textClient, SWT.NONE);
-		toolkit.adapt(helpImage, true, true);
-		toolkit.adapt(textClient, true, true);
-		helpImage.setImage(JSFUICommonPlugin.getDefault().getImage(HELP_IMAGE_FILE)); 
-		getSection().setTextClient(textClient);
-		if (helpTooltip != null) {
-			helpImage.setToolTipText(helpTooltip);
-		}
-		helpImage.setBackground(getSection().getTitleBarGradientBackground());
-		helpImage.addHyperlinkListener(new HyperlinkAdapter() {
-			public void linkActivated(HyperlinkEvent e) {
-				IContext context = HelpSystem.getContext(helpContextId);
-				if (context != null) {
-					IHelpResource[] topics = context.getRelatedTopics();
-					if (topics != null && topics.length == 1) {
-                        PlatformUI.getWorkbench().getHelpSystem().displayHelpResource(topics[0].getHref());
-					} else {
-                        PlatformUI.getWorkbench().getHelpSystem().displayHelp(helpContextId);
-					}
-				}
-			}
-		});
-
-		/*
-		 * Composite client = _toolkit.createComposite(getSection());
-		 * createClient(client, _toolkit); getSection().setClient(client);
-		 */
-	}
-
-	/**
-	 * set the page details from the extensionpoint
-	 * 
-	 * @param element
-	 */
-	protected void setPageDetails(IConfigurationElement element) {
-		setText(element.getAttribute("name")); //$NON-NLS-1$
-		setDescription(element.getAttribute("description")); //$NON-NLS-1$
-	}
-
-	/**
-	 * add the extension elements to the page
-	 * 
-	 * @param parent
-	 * @param toolkit_
-	 * @param element
-	 */
-	public void processItems(Composite parent, FormToolkit toolkit_,
-			IConfigurationElement element) {
-		String hyperlink = element.getAttribute("hyperlink"); //$NON-NLS-1$      
-		String text = element.getAttribute("text"); //$NON-NLS-1$
-		String action = element.getAttribute("hyperlinkaction"); //$NON-NLS-1$
-		//String actionparameters = element.getAttribute("actionparameters"); //$NON-NLS-1$
-
-		if (hyperlink != null && hyperlink.length() > 0) {
-			Hyperlink hypr = toolkit_.createHyperlink(parent, hyperlink,
-					SWT.NONE);
-			if (action != null && action.length() > 0) {
-				try {
-					final IAction thisAction = (IAction) element
-							.createExecutableExtension("hyperlinkaction"); //$NON-NLS-1$
-					hypr.addHyperlinkListener(new HyperlinkAdapter() {
-						public void linkActivated(HyperlinkEvent e) {
-							thisAction.run();
-						}
-					});
-				} catch (Exception ee) {
-					// log.IntroductionSection.action.error=Failed to launch the
-					// link {0}.
-					log
-							.error("log.OverviewSection.action.error", //$NON-NLS-1$
-									hyperlink, ee);
-					JSFUICommonPlugin.getAlerts().detailError(hyperlink,
-							"log.OverviewSection.action.error", hyperlink, ee); //$NON-NLS-1$
-				}
-			}
-		}
-
-		if (text != null && text.length() > 0) {
-			FormText form = toolkit_.createFormText(parent, false);
-			form.setText(text, false, false);
-		}
-	}
-
-	/**
-	 * Get the extension elements for the Introduction pages
-	 * @param extensionPoint 
-	 * @return the configuration element
-	 */
-	public IConfigurationElement getExtensions(String extensionPoint) {
-		// find all service editor page extensions
-		IConfigurationElement element = null;
-
-		// find all service editor parameter dialog extensions
-		IConfigurationElement[] elements = Platform.getExtensionRegistry()
-				.getConfigurationElementsFor(extensionPoint);
-		if (elements.length > 0) {
-			for (int ii = 0; ii < elements.length; ii++) {
-				// get extensions for this dialog
-				// String extPluginId =
-				// elements[ii].getDeclaringExtension().getNamespace();
-				String anEditorId = elements[ii].getDeclaringExtension()
-						.getSimpleIdentifier();
-
-				// see if we have any contributuins of dialogs
-				if (this.editorId.equals(anEditorId)) {
-					element = elements[ii];
-					break;
-				}
-			}
-		}
-		return element;
-	}
-
-	private void setText(String text) {
-		getSection().setText(text);
-	}
-
-	private void setDescription(String text) {
-		getSection().setDescription(text);
-
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/guiutils/SWTUtils.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/guiutils/SWTUtils.java
deleted file mode 100644
index 862b26b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/guiutils/SWTUtils.java
+++ /dev/null
@@ -1,1032 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.guiutils;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.ScrolledComposite;
-import org.eclipse.swt.events.ControlEvent;
-import org.eclipse.swt.events.ControlListener;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.List;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * This utility class provides convenience methods in creating controls on
- * preference pages.
- * 
- * @author mengbo
- */
-public class SWTUtils {
-	// Defaults of controls
-	private static final int DEFAULT_BUTTON_WIDTH = 70;
-
-	private static final int DEFAULT_COMBO_WIDTH = 100;
-
-	private static final int DEFAULT_TEXTBOX_WIDTH = 100;
-
-	private static final int DEFAULT_RADIO_FILL = GridData.HORIZONTAL_ALIGN_BEGINNING
-			| GridData.VERTICAL_ALIGN_CENTER;
-
-	/**
-	 * Creates a new checkbox and sets the default layout data.
-	 * 
-	 * @param parent
-	 *            the composite in which to create the checkbox
-	 * @return the new checkbox
-	 */
-	public static Button createCheckBox(Composite parent) {
-		return createCheckBox(parent, null, 1, 0);
-	}
-
-	/**
-	 * Creates a new checkbox and sets the default layout data.
-	 * 
-	 * @param parent
-	 *            the composite in which to create the checkbox
-	 * @param label
-	 *            the string to set into the checkbox
-	 * @param numColumns
-	 *            the number of columns the new checkbox is to occupy
-	 * @return the new checkbox
-	 */
-	public static Button createCheckBox(Composite parent, String label,
-			int numColumns) {
-		return createCheckBox(parent, label, numColumns, 0);
-	}
-
-	/**
-	 * Creates a new checkbox and sets the default layout data.
-	 * 
-	 * @param parent
-	 *            the composite in which to create the checkbox
-	 * @param label
-	 *            the string to set into the checkbox
-	 * @param numColumns
-	 *            the number of columns the new checkbox is to occupy
-	 * @param indent
-	 *            the number of pixels to indent from the left
-	 * @return the new checkbox
-	 */
-	public static Button createCheckBox(Composite parent, String label,
-			int numColumns, int indent) {
-		Button button = new Button(parent, SWT.CHECK | SWT.LEFT);
-		if (label == null) {
-			button.setAlignment(SWT.CENTER);
-		}
-		GridData data = new GridData(GridData.FILL);
-		data.horizontalSpan = numColumns;
-		data.horizontalIndent = indent;
-		button.setLayoutData(data);
-		if (label != null) {
-			button.setText(label);
-		}
-		return button;
-	}
-
-	/**
-	 * Creates a combo box and sets the default layout data.
-	 * 
-	 * @param parent
-	 *            the composite in which to create the combo
-	 * @param items
-	 *            the items in the combo
-	 * @param numColumns
-	 *            the number of columns the new combo is to occupy
-	 * @return the new combo box
-	 */
-	public static Combo createCombo(Composite parent, String[] items,
-			int numColumns) {
-		return createCombo(parent, items, numColumns, DEFAULT_COMBO_WIDTH);
-	}
-
-	/**
-	 * Creates a combo box and sets the default layout data.
-	 * 
-	 * @param parent
-	 *            the composite in which to create the combo
-	 * @param tokenString
-	 *            a tokenized string that will be split into the fields.
-	 * @param numColumns
-	 *            the number of columns the new combo is to occupy
-	 * @return the new combo box
-	 */
-	public static Combo createCombo(Composite parent, String tokenString,
-			int numColumns) {
-		return createCombo(parent, getTokenNames(tokenString), numColumns,
-				DEFAULT_COMBO_WIDTH);
-	}
-
-	/**
-	 * Creates a combo box and sets the default layout data.
-	 * 
-	 * @param parent
-	 *            the composite in which to create the combo
-	 * @param tokenString
-	 *            a tokenized string that will be split into the fields.
-	 * @param numColumns
-	 *            the number of columns the new combo is to occupy
-	 * @param minWidth
-	 *            minimum width of combo box in pixels
-	 * @return the new combo box
-	 */
-	public static Combo createCombo(Composite parent, String tokenString,
-			int numColumns, int minWidth) {
-		return createCombo(parent, getTokenNames(tokenString), numColumns,
-				minWidth);
-	}
-
-	/**
-	 * Creates a combo box and sets the default layout data.
-	 * 
-	 * @param parent
-	 *            the composite in which to create the combo
-	 * @param items
-	 *            the items in the combo
-	 * @param numColumns
-	 *            the number of columns the new combo is to occupy
-	 * @param minWidth
-	 *            minimum width of combo box in pixels
-	 * @return the new combo box
-	 */
-	public static Combo createCombo(Composite parent, String[] items,
-			int numColumns, int minWidth) {
-		return createCombo(parent, items, numColumns, minWidth, false);
-	}
-
-	/**
-	 * Creates a combo box and sets the default layout data.
-	 * 
-	 * @param parent
-	 *            the composite in which to create the combo
-	 * @param tokenString 
-	 * @param numColumns
-	 *            the number of columns the new combo is to occupy
-	 * @param minWidth
-	 *            minimum width of combo box in pixels
-	 * @param editable
-	 *            whether the items in the combo is editable
-	 * @return the new combo box
-	 */
-	public static Combo createCombo(Composite parent, String tokenString,
-			int numColumns, int minWidth, boolean editable) {
-		return createCombo(parent, getTokenNames(tokenString), numColumns,
-				minWidth, editable);
-	}
-
-	/**
-	 * Creates a combo box and sets the default layout data.
-	 * 
-	 * @param parent
-	 *            the composite in which to create the combo
-	 * @param items
-	 *            the items in the combo
-	 * @param numColumns
-	 *            the number of columns the new combo is to occupy
-	 * @param minWidth
-	 *            minimum width of combo box in pixels
-	 * @param editable
-	 *            whether the items in the combo is editable
-	 * @return the new combo box
-	 */
-	public static Combo createCombo(Composite parent, String[] items,
-			int numColumns, int minWidth, boolean editable) {
-		Combo combo;
-		GridData data;
-		if (editable) {
-			combo = new Combo(parent, SWT.DROP_DOWN);
-			data = new GridData(GridData.FILL_HORIZONTAL);
-		} else {
-			combo = new Combo(parent, SWT.DROP_DOWN | SWT.READ_ONLY);
-			data = new GridData(GridData.FILL);
-		}
-		data.horizontalSpan = numColumns;
-		data.widthHint = minWidth;
-		combo.setLayoutData(data);
-		combo.setItems(items);
-		return combo;
-	}
-
-	/**
-	 * Creates composite control and sets the default layout data.
-	 * 
-	 * @param parent
-	 *            the parent of the new composite
-	 * @param numColumns
-	 *            the number of columns for the new composite
-	 * @return the newly-created coposite
-	 */
-	public static Composite createComposite(Composite parent, int numColumns) {
-		return createComposite(parent, numColumns, -1, -1,
-				GridData.FILL_HORIZONTAL, -1, -1, -1);
-	}
-
-	/**
-	 * Creates composite control and sets the default layout data.
-	 * 
-	 * @param parent
-	 *            the parent of the new composite
-	 * @param numColumns
-	 *            the number of columns for the new composite
-	 * @param verticalSpacing
-	 *            the spacing between rows.
-	 * @param horizontalSpan
-	 *            the span for this new composite over the original composite.
-	 * @return the newly-created coposite
-	 */
-	public static Composite createComposite(Composite parent, int numColumns,
-			int verticalSpacing, int horizontalSpan) {
-		return createComposite(parent, numColumns, verticalSpacing,
-				horizontalSpan, GridData.FILL_HORIZONTAL, -1, -1, -1);
-	}
-
-	/**
-	 * Creates composite control and sets the default layout data.
-	 * 
-	 * @param parent
-	 *            the parent of the new composite
-	 * @param numColumns
-	 *            the number of columns for the new composite
-	 * @param verticalSpacing
-	 *            the spacing between rows.
-	 * @param horizontalSpan
-	 *            the span for this new composite over the original composite.
-	 * @param gridDataFill
-	 *            the fill to use for this composite.
-	 * @return the newly-created coposite
-	 */
-	public static Composite createComposite(Composite parent, int numColumns,
-			int verticalSpacing, int horizontalSpan, int gridDataFill) {
-		return createComposite(parent, numColumns, verticalSpacing,
-				horizontalSpan, gridDataFill, -1, -1, -1);
-	}
-
-	/**
-	 * Creates composite control and sets the default layout data.
-	 * 
-	 * @param parent
-	 *            the parent of the new composite
-	 * @param numColumns
-	 *            the number of columns for the new composite
-	 * @param verticalSpacing
-	 *            the spacing between rows.
-	 * @param horizontalSpan
-	 *            the span for this new composite over the original composite.
-	 * @param gridDataFill
-	 *            the fill to use for this composite.
-	 * @param horizontalSpacing
-	 *            the spacing between objects.
-	 * @param marginWidth
-	 *            the spacing at start and end of composite.
-	 * @param marginHeight
-	 *            the spacing above and below composite.
-	 * @return the newly-created coposite
-	 */
-	public static Composite createComposite(Composite parent, int numColumns,
-			int verticalSpacing, int horizontalSpan, int gridDataFill,
-			int horizontalSpacing, int marginWidth, int marginHeight) {
-		Composite composite = new Composite(parent, SWT.NULL);
-		GridLayout layout = new GridLayout();
-		layout.numColumns = numColumns;
-		if (verticalSpacing >= 0) {
-			layout.verticalSpacing = verticalSpacing;
-		}
-		if (horizontalSpacing >= 0) {
-			layout.horizontalSpacing = horizontalSpacing;
-		}
-		if (marginWidth >= 0) {
-			layout.marginWidth = marginWidth;
-		}
-		if (marginHeight >= 0) {
-			layout.marginHeight = marginHeight;
-		}
-		composite.setLayout(layout);
-		GridData gd = new GridData(gridDataFill);
-		if (horizontalSpan > 0) {
-			gd.horizontalSpan = horizontalSpan;
-		}
-		composite.setLayoutData(gd);
-
-		return composite;
-	}
-
-	/**
-	 * Utility method that creates a group and sets the default layout data.
-	 * 
-	 * @param parent
-	 *            the parent for the new group
-	 * @param title
-	 *            the label for the new group
-	 * @param numColumns
-	 *            the number of columns for the new group
-	 * @return the newly created group
-	 */
-	public static Group createGroup(Composite parent, String title,
-			int numColumns) {
-		return createGroup(parent, title, numColumns, -1,
-				GridData.FILL_HORIZONTAL);
-	}
-
-	/**
-	 * Utility method that creates a group and sets the default layout data.
-	 * 
-	 * @param parent
-	 *            the parent for the new group
-	 * @param title
-	 *            the label for the new group
-	 * @param numColumns
-	 *            the number of columns for the new group
-	 * @param horizontalSpan
-	 *            the number of columns this group should span on the parent
-	 *            composite.
-	 * @param gridDataFill
-	 *            the fill style of the new group -- set to for filling just
-	 *            around the object: GridData.BEGINNING | GridData.CENTER
-	 * @return the newly created group
-	 */
-	public static Group createGroup(Composite parent, String title,
-			int numColumns, int horizontalSpan, int gridDataFill) {
-		Group group = new Group(parent, SWT.SHADOW_ETCHED_IN);
-		GridLayout layout = new GridLayout();
-		layout.numColumns = numColumns;
-		group.setLayout(layout);
-		GridData data = new GridData(gridDataFill);
-
-		if (horizontalSpan > 0) {
-			data.horizontalSpan = horizontalSpan;
-		}
-		group.setLayoutData(data);
-		group.setText(title);
-		return group;
-	}
-
-	/**
-	 * Utility method that creates a label instance and sets the default layout
-	 * data.
-	 * 
-	 * @param parent
-	 *            the parent for the new label
-	 * @param text
-	 *            the text for the new label
-	 * @param numColumns
-	 *            the number of columns for the new composite
-	 * @return the new label
-	 */
-	public static Label createLabel(Composite parent, String text,
-			int numColumns) {
-		return createLabel(parent, text, numColumns, 0);
-	}
-
-	/**
-	 * Utility method that creates a label instance and sets the default layout
-	 * data.
-	 * 
-	 * @param parent
-	 *            the parent for the new label
-	 * @param text
-	 *            the text for the new label
-	 * @param numColumns
-	 *            the number of columns for the new composite
-	 * @param indent
-	 *            number of pixels to indent from the left
-	 * @return the new label
-	 */
-	public static Label createLabel(Composite parent, String text,
-			int numColumns, int indent) {
-		Label label = new Label(parent, SWT.LEFT);
-		GridData data = new GridData();
-		data.horizontalSpan = numColumns;
-		data.horizontalAlignment = GridData.FILL;
-		data.horizontalIndent = indent;
-		label.setLayoutData(data);
-		label.setText(text);
-		return label;
-	}
-
-	/**
-	 * Create a image label for sticking in a composite. The backgroud color is
-	 * optional. Because images can have "transparent" natures, you might want
-	 * to say the background is something other than the defaults composites
-	 * background.
-	 * 
-	 * NOTE: the caller is responsible for cleanup of the image and color
-	 * objects.
-	 * 
-	 * @param parent
-	 *            the parent for the new label
-	 * @param theImage
-	 *            the image for the new label
-	 * @param numColumns
-	 *            the number of columns for the new composite
-	 * @param background
-	 *            pass null to use the composites background.
-	 * @return the new label
-	 */
-	public static Label createLabelImage(Composite parent, Image theImage,
-			int numColumns, Color background) {
-		Label label = new Label(parent, SWT.LEFT);
-		GridData data = new GridData();
-		data.horizontalSpan = numColumns;
-		data.horizontalAlignment = GridData.FILL;
-		label.setLayoutData(data);
-		if (background != null) {
-			label.setBackground(background);
-		}
-		label.setImage(theImage);
-		return label;
-	}
-
-	/**
-	 * Utility method that creates a push button instance and sets the default
-	 * layout data.
-	 * 
-	 * @param parent
-	 *            the parent for the new button
-	 * @param label
-	 *            the label for the new button
-	 * @return the newly-created button
-	 */
-	public static Button createPushButton(Composite parent, String label) {
-		return createPushButton(parent, label, DEFAULT_BUTTON_WIDTH);
-	}
-
-	/**
-	 * Utility method that creates a push button instance and sets the default
-	 * layout data.
-	 * 
-	 * @param parent
-	 *            the parent for the new button
-	 * @param label
-	 *            the label for the new button
-	 * @param widthHint
-	 *            use this width for the button.
-	 * @return the newly-created button
-	 */
-	public static Button createPushButton(Composite parent, String label,
-			int widthHint) {
-		Button button = new Button(parent, SWT.PUSH);
-		GridData data = new GridData();
-		data.horizontalAlignment = GridData.FILL_HORIZONTAL;
-		data.widthHint = widthHint;
-		button.setLayoutData(data);
-		button.setText(label);
-		return button;
-	}
-
-	/**
-	 * Utility method that creates a push button instance and sets the default
-	 * layout data.
-	 * 
-	 * @param parent
-	 *            the parent for the new button
-	 * @param theImage
-	 *            the label for the new button
-	 * @param widthHint
-	 *            use this width for the button.
-	 * @return the newly-created button
-	 */
-	public static Button createPushButton(Composite parent, Image theImage,
-			int widthHint) {
-		Button button = new Button(parent, SWT.PUSH);
-		GridData data = new GridData();
-		data.horizontalAlignment = GridData.FILL_HORIZONTAL;
-		data.widthHint = widthHint;
-		button.setLayoutData(data);
-		button.setImage(theImage);
-		button.setAlignment(SWT.CENTER);
-		return button;
-	}
-
-	/**
-	 * Utility method that creates a radio button instance and sets the default
-	 * layout data.
-	 * 
-	 * @param parent
-	 *            the parent for the new button
-	 * @param label
-	 *            the label for the new button
-	 * @return the newly-created button
-	 */
-	public static Button createRadioButton(Composite parent, String label) {
-		return createRadioButton(parent, label, DEFAULT_RADIO_FILL);
-	}
-
-	/**
-	 * Utility method that creates a radio button instance and sets the default
-	 * layout data.
-	 * 
-	 * @param parent
-	 *            the parent for the new button
-	 * @param label
-	 *            the label for the new button
-	 * @param gridDataFill 
-	 * @return the newly-created button
-	 */
-	public static Button createRadioButton(Composite parent, String label,
-			int gridDataFill) {
-		return createRadioButton(parent, label, gridDataFill, 1);
-	}
-
-	/**
-	 * Utility method that creates a radio button instance and sets the default
-	 * layout data.
-	 * 
-	 * @param parent
-	 *            the parent for the new button
-	 * @param label
-	 *            the label for the new button
-	 * @param gridDataFill 
-	 * @param horizontalSpan
-	 *            number of columns occupied by button
-	 * @return the newly-created button
-	 */
-	public static Button createRadioButton(Composite parent, String label,
-			int gridDataFill, int horizontalSpan) {
-		Button button = new Button(parent, SWT.RADIO | SWT.LEFT);
-		GridData data = new GridData(gridDataFill);
-		data.horizontalSpan = horizontalSpan;
-		button.setLayoutData(data);
-		button.setText(label);
-		return button;
-	}
-
-	/**
-	 * Utility method that creates an empty line
-	 * 
-	 * @param parent
-	 *            the parent for the new label
-	 * @param numColumns
-	 *            the number of columns for the new composite
-	 */
-	public static void createSpacer(Composite parent, int numColumns) {
-		createSpacer(parent, numColumns, 0);
-	}
-
-	/**
-	 * Utility method that creates an empty line
-	 * 
-	 * @param parent
-	 *            the parent for the new label
-	 * @param numColumns
-	 *            the number of columns for the new composite
-	 * @param minWidth
-	 *            minimum width of spacer
-	 */
-	public static void createSpacer(Composite parent, int numColumns,
-			int minWidth) {
-		Label label = new Label(parent, SWT.NONE);
-		GridData data = new GridData();
-		data.horizontalSpan = numColumns;
-		data.widthHint = minWidth;
-		label.setLayoutData(data);
-	}
-
-	/**
-	 * Create a separator that goes across the entire page
-	 * 
-	 * @param parent
-	 *            the parent for the new label
-	 * @param numColumns
-	 *            the number of columns for the new composite
-	 */
-	public static void createSeparator(Composite parent, int numColumns) {
-		Label separator = new Label(parent, SWT.SEPARATOR | SWT.HORIZONTAL);
-		GridData data = new GridData();
-		data.horizontalSpan = numColumns;
-		data.horizontalAlignment = GridData.FILL;
-		data.grabExcessHorizontalSpace = true;
-		separator.setLayoutData(data);
-	}
-
-	/**
-	 * Create a table from a Composite object
-	 * 
-	 * @param composite
-	 *            the Composite this table is to be created from
-	 * @param tokenString
-	 *            A string containing names of the columns in the order that
-	 *            they should be displayed in the table with each column
-	 *            separated by a comma(',') or null if no columns need to be
-	 *            created.
-	 * @param tablewidth
-	 *            the minimum width for the table
-	 * @param tableHeight 
-	 * @return the new table
-	 */
-	public static Table createTable(Composite composite, String tokenString,
-			int tablewidth, int tableHeight) {
-		// SINGLE, MULTI, CHECK, FULL_SELECTION, HIDE_SELECTION
-		int style = SWT.V_SCROLL | SWT.H_SCROLL | SWT.SINGLE | SWT.BORDER
-				| SWT.FULL_SELECTION;
-		Table table = new Table(composite, style);
-		GridData gridData = new GridData(GridData.FILL_BOTH);
-		if (tablewidth > 0) {
-			gridData.widthHint = tablewidth;
-		}
-		if (tableHeight > 0) {
-			gridData.heightHint = tableHeight;
-		}
-		table.setLayoutData(gridData);
-		table.setHeaderVisible(true);
-		table.setLinesVisible(true);
-
-		if (tokenString != null) {
-			String[] columns = getTokenNames(tokenString);
-
-			int columnSize = 50;
-			if (tablewidth > 0) {
-				columnSize = tablewidth / columns.length;
-			}
-			for (int ii = 0; ii < columns.length; ii++) {
-				/*(void)*/ createTableColumn(table, columns[ii], ii,
-						columnSize);
-			}
-		}
-
-		return table;
-	}
-
-	/**
-	 * Create a table from a Composite object
-	 * 
-	 * @param composite
-	 *            the Composite this table is to be created from
-	 * @param columns
-	 *            A string array containing names of the columns in the order
-	 *            that they should be displayed in the table, or null if no
-	 *            columns need to be created.
-	 * @param tablewidth
-	 *            the minimum width for the table
-	 * @return the new table
-	 */
-	public static Table createTable(Composite composite, String[] columns,
-			int tablewidth) {
-		int style = SWT.BORDER | SWT.FULL_SELECTION;
-		Table table = new Table(composite, style);
-		GridData gridData = new GridData(GridData.FILL_BOTH);
-		gridData.widthHint = tablewidth;
-		table.setLayoutData(gridData);
-		table.setHeaderVisible(true);
-		table.setLinesVisible(true);
-
-		if (columns != null) {
-			for (int i = 0; i < columns.length; i++) {
-				/*(void)*/ createTableColumn(table, columns[i], i);
-			}
-		}
-
-		return table;
-	}
-
-	/**
-	 * Create a table column
-	 * 
-	 * @param parent
-	 *            the table that contains this column
-	 * @param name
-	 *            name of this column
-	 * @param index
-	 *            the column within the parent composite
-	 * @return the new table column
-	 */
-	public static TableColumn createTableColumn(Table parent, String name,
-			int index) {
-		TableColumn column = new TableColumn(parent, SWT.LEFT, index);
-		column.setText(name);
-		return column;
-	}
-
-	/**
-	 * Create a table column with the image and the width of the column is set
-	 * to the image width.
-	 * 
-	 * @param parent
-	 *            the table that contains this column
-	 * @param image
-	 *            iamge for this column
-	 * @param index 
-	 * @return the new table column
-	 */
-	public static TableColumn createTableColumn(Table parent, Image image,
-			int index) {
-		TableColumn column = new TableColumn(parent, SWT.LEFT, index);
-		column.setImage(image);
-		column.setWidth(image.getBounds().width);
-		column.setResizable(false);
-		return column;
-	}
-
-	/**
-	 * Create a table column
-	 * 
-	 * @param parent
-	 *            the table that contains this column
-	 * @param name
-	 *            name of this column
-	 * @param index
-	 *            the column within the parent composite
-	 * @param tablewidth
-	 *            the width for the column
-	 * @return the new table column
-	 */
-	public static TableColumn createTableColumn(Table parent, String name,
-			int index, int tablewidth) {
-		TableColumn column = new TableColumn(parent, SWT.LEFT, index);
-		column.setText(name);
-		column.setWidth(tablewidth);
-		return column;
-	}
-
-	/**
-	 * Create a text field
-	 * 
-	 * @param parent
-	 *            the parent of the new text field
-	 * @return the new text field
-	 */
-	public static Text createTextBox(Composite parent) {
-		return createTextBox(parent, 1, DEFAULT_TEXTBOX_WIDTH);
-	}
-
-	/**
-	 * Create a text field
-	 * 
-	 * @param parent
-	 *            the parent of the new text field
-	 * @param text 
-	 * @return the new text field
-	 */
-	public static Text createTextBox(Composite parent, String text) {
-		Text textbox = createTextBox(parent, 1);
-		textbox.setText(text);
-		return textbox;
-	}
-
-	/**
-	 * Create a text field
-	 * 
-	 * @param parent
-	 *            the parent of the new text field
-	 * @param numColumns
-	 *            number of columns the text box is to occupy
-	 * @return the new text field
-	 */
-	public static Text createTextBox(Composite parent, int numColumns) {
-		return createTextBox(parent, numColumns, DEFAULT_TEXTBOX_WIDTH);
-	}
-
-	/**
-	 * Create a text field
-	 * 
-	 * @param parent
-	 *            the parent of the new text field
-	 * @param numColumns
-	 *            number of columns the text box is to occupy
-	 * @param minWidth
-	 *            minimum width of text field
-	 * @return the new text field
-	 */
-	public static Text createTextBox(Composite parent, int numColumns,
-			int minWidth) {
-		return createTextBox(parent, numColumns, minWidth, SWT.DEFAULT);
-	}
-
-	/**
-	 * Create a text field
-	 * 
-	 * @param parent
-	 *            the parent of the new text field
-	 * @param numColumns
-	 *            number of columns the text box is to occupy
-	 * @param minWidth
-	 *            minimum width of text field
-	 * @param minHeight 
-	 * @return the new text field
-	 */
-	public static Text createTextBox(Composite parent, int numColumns,
-			int minWidth, int minHeight) {
-		Text text = new Text(parent, SWT.SINGLE | SWT.BORDER);
-		GridData data = new GridData(GridData.FILL);
-		data.horizontalSpan = numColumns;
-		data.widthHint = minWidth;
-		data.heightHint = minHeight;
-		text.setLayoutData(data);
-		return text;
-	}
-
-	/**
-	 * Create a text field that is scrollable.
-	 * 
-	 * @param parent
-	 *            the parent of the new text field
-	 * @param numColumns
-	 *            number of columns the text box is to occupy
-	 * @param minWidth
-	 *            minimum width of text field
-	 * @param minHeight
-	 *            minimum height of text field
-	 * @return the new text field
-	 */
-	public static Text createTextBoxScrollable(Composite parent,
-			int numColumns, int minWidth, int minHeight) {
-		Text text = new Text(parent, SWT.BORDER | SWT.V_SCROLL | SWT.WRAP);
-		GridData data = new GridData((minWidth > 0) ? GridData.FILL
-				: GridData.FILL_HORIZONTAL);
-		data.horizontalSpan = numColumns;
-		if (minWidth > 0) {
-			data.widthHint = minWidth;
-		}
-		data.heightHint = minHeight;
-
-		text.setLayoutData(data);
-		return text;
-	}
-
-	/**
-	 * Create a list with the items listed in it.
-	 * 
-	 * @param parent
-	 *            the parent of the new text field
-	 * @param numColumns
-	 *            number of columns the text box is to occupy
-	 * @param minWidth
-	 *            minimum width of text field
-	 * @param minHeight
-	 *            minimum height of text field
-	 * @param items
-	 *            the items in the list
-	 * @return the new list
-	 */
-	public static List createList(Composite parent, int numColumns,
-			int minWidth, int minHeight, String[] items) {
-		return createList(parent, numColumns, minWidth, minHeight, items, true);
-	}
-
-	/**
-	 * Create a list with the items listed in it.
-	 * 
-	 * @param parent
-	 *            the parent of the new list box
-	 * @param numColumns
-	 *            number of columns the list box is to occupy
-	 * @param minWidth
-	 *            minimum width of list box
-	 * @param minHeight
-	 *            minimum height of list box
-	 * @param items
-	 *            the items in the list
-	 * @param bmulti
-	 *            whether multiple item selection is allowed
-	 * @return the new list
-	 */
-	public static List createList(Composite parent, int numColumns,
-			int minWidth, int minHeight, String[] items, boolean bmulti) {
-		return createList(parent, numColumns, minWidth, minHeight, items,
-				bmulti, 1);
-	}
-
-	/**
-	 * Create a list with the items listed in it.
-	 * 
-	 * @param parent
-	 *            the parent of the new list box
-	 * @param numColumns
-	 *            number of columns the list box is to occupy
-	 * @param minWidth
-	 *            minimum width of list box
-	 * @param minHeight
-	 *            minimum height of list box
-	 * @param items
-	 *            the items in the list
-	 * @param bmulti
-	 *            whether multiple item selection is allowed
-	 * @param verticalSpan
-	 *            the number of rows the list box is to occupy
-	 * @return the new list
-	 */
-	public static List createList(Composite parent, int numColumns,
-			int minWidth, int minHeight, String[] items, boolean bmulti,
-			int verticalSpan) {
-		List theList;
-		if (bmulti)
-			theList = new List(parent, SWT.V_SCROLL | SWT.H_SCROLL | SWT.MULTI
-					| SWT.BORDER);
-		else
-			theList = new List(parent, SWT.V_SCROLL | SWT.H_SCROLL | SWT.SINGLE
-					| SWT.BORDER);
-		GridData data = new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING | GridData.FILL_VERTICAL);
-		data.horizontalSpan = numColumns;
-		data.widthHint = minWidth;
-		data.heightHint = minHeight;
-		data.verticalSpan = verticalSpan;
-		theList.setLayoutData(data);
-		if (items != null) {
-			theList.setItems(items);
-		}
-
-		return theList;
-	}
-
-	/**
-	 * Computes the size of the composite inside the scroll area so that scroll
-	 * bars show up correctly.
-	 * 
-	 * @param parentComposite
-	 * @param childComposite
-	 */
-	public static void computeScrollArea(ScrolledComposite parentComposite,
-			Composite childComposite) {
-		// Point pt = childComposite.computeSize(SWT.DEFAULT, SWT.DEFAULT);
-		// childComposite.setSize(pt);
-
-		Point pt = childComposite.computeSize(SWT.DEFAULT, SWT.DEFAULT);
-		parentComposite.setExpandHorizontal(true);
-		parentComposite.setExpandVertical(true);
-		parentComposite.setMinWidth(pt.x);
-		parentComposite.setMinHeight(pt.y);
-	}
-
-	/**
-	 * Builds an array of strings from a token list string. The token separator
-	 * is a comma (',').
-	 * 
-	 * @param tokenString
-	 * @return String[]
-	 */
-	public static String[] getTokenNames(String tokenString) {
-		if (tokenString == null) {
-			return new String[0];
-		}
-
-		return tokenString.split(","); //$NON-NLS-1$
-	}
-
-	/**
-	 * Enable/Disable the widget and all its children.
-	 * 
-	 * @param widget
-	 *            The widget to be enabled/disabled.
-	 * @param state
-	 *            Enable widget if true. Disable otherwise.
-	 */
-	public static void setWidgetState(Control widget, boolean state) {
-		if (widget instanceof Composite) {
-			Control widgets[] = ((Composite) widget).getChildren();
-			for (int i = 0; i < widgets.length; i++) {
-				setWidgetState(widgets[i], state);
-			}
-		}
-		widget.setEnabled(state);
-	}
-
-	// ---------------------------------------------------------------------------
-	// following is for workaround eclipse problem
-	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=40281
-	static ControlListener _listener = new ControlListener() {
-		public void controlResized(ControlEvent e) {
-			final Composite c = (Composite) e.widget;
-			c.getDisplay().asyncExec(new Runnable() {
-				public void run() {
-					if (!c.isDisposed()) {
-						// XXX: in 3.0, should use c.layout(true)
-						// in 3.1, should use c.layout(true, true)
-						c.layout(true);
-						c.redraw();
-					}
-				}
-			});
-		}
-
-		public void controlMoved(ControlEvent e) {
-		    // nothing for move
-		}
-	};
-
-	/**
-	 * @param composite
-	 */
-	public static void workaroundResize(Composite composite) {
-		composite.addControlListener(_listener);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/guiutils/TextWindow.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/guiutils/TextWindow.java
deleted file mode 100644
index b829cd2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/guiutils/TextWindow.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.guiutils;
-
-import org.eclipse.jface.text.Document;
-import org.eclipse.jface.text.TextViewer;
-import org.eclipse.jface.window.ApplicationWindow;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * Brings up a simple text window.
- * 
- * @author mengbo
- */
-public class TextWindow extends ApplicationWindow {
-	private String _content;
-
-	private Point _size = new Point(600, 600);
-
-	/**
-	 * empty for passing from events.
-	 * @param parentShell 
-	 * @param content 
-	 */
-	public TextWindow(Shell parentShell, String content) {
-		super(parentShell);
-		// addStatusLine();
-		_content = content;
-		// addCoolBar(SWT.BORDER);
-		// addMenuBar();
-		// addToolBar(SWT.BORDER);
-	}
-
-	protected Control createContents(Composite parent) {
-		// _text = new Text(parent, SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL);
-		// _text.setText(_content);
-		// return _text;
-
-		TextViewer tview = new TextViewer(parent, SWT.BORDER | SWT.V_SCROLL
-				| SWT.H_SCROLL);
-		tview.setDocument(new Document(_content));
-
-		return tview.getControl();
-	}
-
-
-	protected Point getInitialSize() {
-		return _size;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/guiutils/messages.properties b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/guiutils/messages.properties
deleted file mode 100644
index 6291ec0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/guiutils/messages.properties
+++ /dev/null
@@ -1,3 +0,0 @@
-IntroductionSection_noIntroDescription=No Introduction page configuration found in the plugin.xml
-IntroductionSection_noIntroTitle=No Introduction
-BrowserWindow_loading=<b>Loading...</b>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/logging/Logger.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/logging/Logger.java
deleted file mode 100644
index 3b71b83..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/logging/Logger.java
+++ /dev/null
@@ -1,215 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.logging;
-
-import java.text.MessageFormat;
-import java.util.ResourceBundle;
-
-import org.eclipse.core.runtime.ILog;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.Status;
-import org.osgi.framework.Bundle;
-
-/**
- * A resource bundle driven logger
- *
- */
-public class Logger {
-	private ResourceBundle resourceBundle;
-
-	private ILog log;
-
-	private String bundleId;
-
-	/**
-	 * @param bundle
-	 * @param resourceBundle
-	 */
-	public Logger(Bundle bundle, ResourceBundle resourceBundle) {
-		log = Platform.getLog(bundle);
-		this.resourceBundle = resourceBundle;
-		bundleId = bundle.getSymbolicName();
-		if (resourceBundle == null) {
-			IStatus status = new Status(IStatus.ERROR, bundleId, IStatus.OK,
-					"The resource Bundle for logger could not be null!", null); //$NON-NLS-1$
-			log.log(status);
-		}
-	}
-	/**
-	 * @param key
-	 * @param arg0
-	 */
-	public void info(String key, String arg0) {
-		Object[] args = new Object[1];
-		args[0] = arg0;
-
-		MessageFormat formatter = new MessageFormat(getString(key));
-		String message = formatter.format(args);
-		IStatus status = new Status(IStatus.INFO, bundleId, IStatus.OK,
-				message, null);
-		log.log(status);
-	}
-
-	/**
-	 * @param message
-	 */
-	public void info(String message) {
-		IStatus status = new Status(IStatus.INFO, bundleId, IStatus.OK,
-				message, null);
-		log.log(status);
-	}
-
-	/**
-	 * @param key
-	 * @param e
-	 */
-	public void info(String key, Throwable e) {
-		String message = getString(key);
-		IStatus status = new Status(IStatus.INFO, bundleId, IStatus.OK,
-				message, e);
-		log.log(status);
-	}
-
-	/**
-	 * @param key
-	 * @param arg0
-	 * @param e
-	 */
-	public void info(String key, String arg0, Throwable e) {
-		Object[] args = new Object[1];
-		args[0] = arg0;
-
-		MessageFormat formatter = new MessageFormat(getString(key));
-		String message = formatter.format(args);
-		IStatus status = new Status(IStatus.INFO, bundleId, IStatus.OK,
-				message, null);
-		log.log(status);
-	}
-	
-	/**
-	 * @param key
-	 * @param arg0
-	 * @param arg1
-	 * @param e
-	 */
-	public void info(String key, String arg0, String arg1, Throwable e) {
-		Object[] args = new Object[1];
-		args[0] = arg0;
-		args[1] = arg1;
-
-		MessageFormat formatter = new MessageFormat(getString(key));
-		String message = formatter.format(args);
-		IStatus status = new Status(IStatus.INFO, bundleId, IStatus.OK,
-				message, e);
-		log.log(status);
-	}
-
-    /**
-     * @param key
-     */
-    public void error(String key) {
-        
-        String message = getString(key);
-        IStatus status = new Status(IStatus.ERROR, bundleId, IStatus.OK,
-                message, null);
-        log.log(status);
-    }
-
-	/**
-	 * @param e
-	 */
-	public void error(Throwable e) {
-		IStatus status = new Status(IStatus.ERROR, bundleId, IStatus.OK, "", e); //$NON-NLS-1$
-		log.log(status);
-	}
-
-	/**
-	 * @param key
-	 * @param e
-	 */
-	public void error(String key, Throwable e) {
-		String message = getString(key);
-		IStatus status = new Status(IStatus.ERROR, bundleId, IStatus.OK,
-				message, e);
-		log.log(status);
-	}
-	
-	/**
-	 * @param key
-	 * @param arg0
-	 */
-	public void error(String key, String arg0) {
-		Object[] args = new Object[1];
-		args[0] = arg0;
-
-		MessageFormat formatter = new MessageFormat(getString(key));
-		String message = formatter.format(args);
-		IStatus status = new Status(IStatus.ERROR, bundleId, IStatus.OK,
-				message, null);
-		log.log(status);
-	}
-
-	/**
-	 * @param key
-	 * @param arg
-	 * @param e
-	 */
-	public void error(String key, String arg, Throwable e) {
-		Object[] args = new Object[1];
-		args[0] = arg;
-
-		MessageFormat formatter = new MessageFormat(getString(key));
-		String message = formatter.format(args);
-		IStatus status = new Status(IStatus.ERROR, bundleId, IStatus.OK,
-				message, e);
-		log.log(status);
-	}
-
-	/**
-	 * @param key
-	 * @param arg0
-	 * @param arg1
-	 * @param e
-	 */
-	public void error(String key, String arg0, String arg1, Throwable e) {
-		Object[] args = new Object[1];
-		args[0] = arg0;
-		args[1] = arg1;
-
-		MessageFormat formatter = new MessageFormat(getString(key));
-		String message = formatter.format(args);
-		IStatus status = new Status(IStatus.ERROR, bundleId, IStatus.OK,
-				message, e);
-		log.log(status);
-	}
-    
-    /**
-     * @param key
-     * @return the resource for the key, or an error message if
-     * resourceBundle.getString(key) throws an Exception
-     */
-    private String getString(String key)
-    {
-        try
-        {
-            return resourceBundle.getString(key);
-        }
-        // suppress non-error exceptions so that the logging operation
-        // itself (usually called in response to an exception) does not
-        // throw a new exception
-        catch(Exception e)
-        {
-            return "!!missing resource: " + key + "!!"; //$NON-NLS-1$ //$NON-NLS-2$
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/preferences/OrderingMessages.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/preferences/OrderingMessages.java
deleted file mode 100644
index 8202245..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/preferences/OrderingMessages.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.preferences;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * @author cbateman
- *
- */
-public class OrderingMessages extends NLS
-{
-    private static final String BUNDLE_NAME= "org.eclipse.jst.jsf.common.ui.internal.preferences.OrderingMessages";//$NON-NLS-1$
-
-    private OrderingMessages() {
-        // Do not instantiate
-    }
-
-    /**
-     * see OrderMessages.properties
-     */
-    public static String Ordering_Up;
-    /**
-     * see OrderMessages.properties
-     */
-    public static String Ordering_Down;
-    
-    static {
-        NLS.initializeMessages(BUNDLE_NAME, OrderingMessages.class);
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/preferences/OrderingMessages.properties b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/preferences/OrderingMessages.properties
deleted file mode 100644
index 282ee23..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/preferences/OrderingMessages.properties
+++ /dev/null
@@ -1,12 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2008 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-Ordering_Up=Up
-Ordering_Down=Down
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/preferences/StrategyOrderingPanel.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/preferences/StrategyOrderingPanel.java
deleted file mode 100644
index c438b96..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/preferences/StrategyOrderingPanel.java
+++ /dev/null
@@ -1,322 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.preferences;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.jface.viewers.CheckStateChangedEvent;
-import org.eclipse.jface.viewers.CheckboxTableViewer;
-import org.eclipse.jface.viewers.ICheckStateListener;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.ITableLabelProvider;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jst.jsf.common.internal.policy.OrderedListProvider;
-import org.eclipse.jst.jsf.common.internal.policy.OrderedListProvider.OrderableObject;
-import org.eclipse.jst.jsf.common.ui.internal.utils.PixelConverter;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-
-/**
- * Creates a composite with a checked table viewer and up/down buttons that
- * allow ordering and enablement of a list of items in the table.
- * 
- * Largely derived from
- * org.eclipse.jdt.internal.ui.preferences.CodeAssistAdvancedConfigurationBlock
- * 
- * @author cbateman
- * 
- */
-public class StrategyOrderingPanel
-{
-    private CheckboxTableViewer       _viewer;
-    private Button                    fUpButton;
-    private Button                    fDownButton;
-
-    private final OrderedListProvider _provider;
-    private final ITableLabelProvider _labelProvider;
-    private final String              _title;
-
-    /**
-     * @param provider
-     * @param labelProvider
-     * @param title 
-     */
-    public StrategyOrderingPanel(final OrderedListProvider provider,
-            final ITableLabelProvider labelProvider, final String title)
-    {
-        _provider = provider;
-        _labelProvider = labelProvider;
-        _title = title;
-    }
-
-    /**
-     * @param parent
-     * @return the control
-     */
-    public Control createContents(final Composite parent)
-    {
-        final Composite panel = new Composite(parent, SWT.NONE);
-        final GridLayout layout = new GridLayout(2, false);
-        layout.marginWidth = 0;
-        layout.marginHeight = 0;
-        panel.setLayout(layout);
-
-        final Label titleLabel = new Label(panel, SWT.NONE);
-        titleLabel.setText(_title);
-        final GridData gridData = new GridData(GridData.FILL,
-                GridData.BEGINNING, true, false, 2, 1);
-        titleLabel.setLayoutData(gridData);
-
-        createTableViewer(panel);
-        createButtonList(panel);
-
-        return panel;
-    }
-
-    /**
-     * Refresh the UI from model. Must not be called before createContents
-     */
-    public void refresh()
-    {
-        _provider.resetOrderedObjects();
-        _viewer.refresh();
-        for (final OrderableObject object : _provider.getOrderedObjects())
-        {
-            _viewer.setChecked(object, object.isEnabled());
-        }
-    }
-
-    private void createTableViewer(final Composite parent)
-    {
-        _viewer = CheckboxTableViewer.newCheckList(parent, SWT.SINGLE
-                | SWT.BORDER);
-        final Table table = _viewer.getTable();
-        table.setHeaderVisible(false);
-        table.setLinesVisible(false);
-        table.setLayoutData(new GridData(GridData.FILL, GridData.BEGINNING,
-                true, false, 1, 1));
-
-        final TableColumn nameColumn = new TableColumn(table, SWT.NONE);
-        // nameColumn
-        // .setText(PreferencesMessages.CodeAssistAdvancedConfigurationBlock_separate_table_category_column_title);
-        nameColumn.setResizable(false);
-
-        _viewer.setContentProvider(new ContentProvider());
-
-        _viewer.setLabelProvider(_labelProvider);
-        _viewer.setInput(_provider);
-
-        final int ICON_AND_CHECKBOX_WITH = 50;
-        final int HEADER_MARGIN = 20;
-        int minNameWidth = computeWidth(table, nameColumn.getText())
-                + HEADER_MARGIN;
-        for (int i = 0; i < _provider.getOrderedObjects().size(); i++)
-        {
-            minNameWidth = Math.max(minNameWidth, computeWidth(table,
-                    _labelProvider.getColumnText(_provider.getOrderedObjects()
-                            .get(i), 0))
-                    + ICON_AND_CHECKBOX_WITH);
-        }
-
-        nameColumn.setWidth(minNameWidth);
-
-        _viewer.addCheckStateListener(new ICheckStateListener()
-        {
-            public void checkStateChanged(final CheckStateChangedEvent event)
-            {
-                final boolean checked = event.getChecked();
-                final OrderableObject element = (OrderableObject) event
-                        .getElement();
-                element.setEnabled(checked);
-            }
-        });
-
-        table.addSelectionListener(new SelectionAdapter()
-        {
-            @Override
-            public void widgetSelected(final SelectionEvent e)
-            {
-                handleTableSelection();
-            }
-        });
-
-    }
-
-    private void createButtonList(final Composite parent)
-    {
-        final Composite composite = new Composite(parent, SWT.NONE);
-        composite.setLayoutData(new GridData(SWT.BEGINNING, SWT.BEGINNING,
-                false, false));
-
-        final GridLayout layout = new GridLayout();
-        layout.marginWidth = 0;
-        layout.marginHeight = 0;
-        composite.setLayout(layout);
-
-        fUpButton = new Button(composite, SWT.PUSH | SWT.CENTER);
-        fUpButton.setText(OrderingMessages.Ordering_Up);
-        fUpButton.addSelectionListener(new SelectionAdapter()
-        {
-            @Override
-            public void widgetSelected(final SelectionEvent e)
-            {
-                final int index = getSelectionIndex();
-                if (index != -1)
-                {
-                    final OrderableObject object = _provider
-                            .getOrderedObjects().get(index);
-                    _provider.moveUp(object);
-                    _viewer.refresh();
-                    handleTableSelection();
-                }
-            }
-        });
-        fUpButton.setLayoutData(new GridData());
-        setButtonDimensionHint(fUpButton);
-
-        fDownButton = new Button(composite, SWT.PUSH | SWT.CENTER);
-        fDownButton.setText(OrderingMessages.Ordering_Down);
-        fDownButton.addSelectionListener(new SelectionAdapter()
-        {
-            @Override
-            public void widgetSelected(final SelectionEvent e)
-            {
-                final int index = getSelectionIndex();
-                if (index != -1)
-                {
-                    final OrderableObject object = _provider
-                            .getOrderedObjects().get(index);
-                    _provider.moveDown(object);
-                    _viewer.refresh();
-                    handleTableSelection();
-                }
-            }
-        });
-        fDownButton.setLayoutData(new GridData());
-        setButtonDimensionHint(fDownButton);
-    }
-
-    private int computeWidth(final Control control, final String name)
-    {
-        if (name == null)
-        {
-            return 0;
-        }
-        final GC gc = new GC(control);
-        try
-        {
-            gc.setFont(JFaceResources.getDialogFont());
-            return gc.stringExtent(name).x + 10;
-        }
-        finally
-        {
-            gc.dispose();
-        }
-    }
-
-    private void handleTableSelection()
-    {
-        final OrderableObject item = getSelectedItem();
-        if (item != null)
-        {
-            final int index = getSelectionIndex();
-            fUpButton.setEnabled(index > 0);
-            fDownButton
-                    .setEnabled(index < _provider.getOrderedObjects().size() - 1);
-        }
-        else
-        {
-            fUpButton.setEnabled(false);
-            fDownButton.setEnabled(false);
-        }
-    }
-
-    private OrderableObject getSelectedItem()
-    {
-        return (OrderableObject) ((IStructuredSelection) _viewer.getSelection())
-                .getFirstElement();
-    }
-
-    private int getSelectionIndex()
-    {
-        return _viewer.getTable().getSelectionIndex();
-    }
-
-    /**
-     * Returns a width hint for a button control.
-     */
-    private static int getButtonWidthHint(final Button button)
-    {
-        button.setFont(JFaceResources.getDialogFont());
-        PixelConverter converter = new PixelConverter(button);
-        final int widthHint = converter
-                .convertHorizontalDLUsToPixels(IDialogConstants.BUTTON_WIDTH);
-        return Math.max(widthHint, button.computeSize(SWT.DEFAULT, SWT.DEFAULT,
-                true).x);
-    }
-
-    /**
-     * Sets width and height hint for the button control. <b>Note:</b> This is
-     * a NOP if the button's layout data is not an instance of
-     * <code>GridData</code>.
-     * 
-     * @param button
-     *            the button for which to set the dimension hint
-     */
-    private static void setButtonDimensionHint(final Button button)
-    {
-        Assert.isNotNull(button);
-        final Object gd = button.getLayoutData();
-        if (gd instanceof GridData)
-        {
-            ((GridData) gd).widthHint = getButtonWidthHint(button);
-            ((GridData) gd).horizontalAlignment = GridData.FILL;
-        }
-    }
-
-    private static class ContentProvider implements IStructuredContentProvider
-    {
-
-        public Object[] getElements(final Object inputElement)
-        {
-            if (inputElement instanceof OrderedListProvider)
-            {
-                return ((OrderedListProvider) inputElement).getOrderedObjects()
-                        .toArray();
-            }
-            return new Object[0];
-        }
-
-        public void dispose()
-        {
-            // do nothing
-        }
-
-        public void inputChanged(final Viewer viewer, final Object oldInput,
-                final Object newInput)
-        {
-            // do nothing
-        }
-
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/utils/FavoriteConfigurations.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/utils/FavoriteConfigurations.java
deleted file mode 100644
index aa7744b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/utils/FavoriteConfigurations.java
+++ /dev/null
@@ -1,257 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.utils;
-
-import java.io.FileNotFoundException;
-import java.io.FileReader;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Properties;
-
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.jst.jsf.common.ui.JSFUICommonPlugin;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.ui.IMemento;
-import org.eclipse.ui.XMLMemento;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-
-/**
- * This provides a means to store common properties for pages.
- * 
- * Holds a <code>List</code> of <code>Properties</code> which can be
- * manipulated by the user.
- * 
- * @author mengbo
- */
-public class FavoriteConfigurations {
-	private static Logger _log = JSFUICommonPlugin
-			.getLogger(FavoriteConfigurations.class);
-
-	private final static String FAV_EXTENSIONS = ".xml"; //$NON-NLS-1$
-
-	private final static String ELEMENT_ROOT = "favorite"; //$NON-NLS-1$
-
-	private final static String ELEMENT_CONFIG = "config"; //$NON-NLS-1$
-
-	private final static String ELEMENT_NAME = "name"; //$NON-NLS-1$
-
-	private final static String ELEMENT_PROPERTY = "property"; //$NON-NLS-1$
-
-	private final static String ELEMENT_VALUE = "value"; //$NON-NLS-1$
-
-	private Map _favorites;
-
-	private IPath _favoriteFile;
-
-	private String _favoriteName;
-
-	/**
-	 * Constructor
-	 * 
-	 * @param plugin
-	 *            used for location of favorite file.
-	 * @param favoriteName
-	 *            used for name of file and for mapping the properties of this
-	 *            favorite.
-	 */
-	public FavoriteConfigurations(AbstractUIPlugin plugin, String favoriteName) {
-		super();
-		_favoriteFile = plugin.getStateLocation().append(
-				scanFileName(favoriteName) + FAV_EXTENSIONS);
-		readFavorites();
-	}
-
-	/**
-	 * Returns the favorite entry that is mapped under the given name.
-	 * 
-	 * @param name
-	 *            the favorite
-	 * @return <code>Properties</code> config entry for the favorite.
-	 */
-	public Properties getFavorite(String name) {
-		return (Properties) _favorites.get(name);
-	}
-
-	/**
-	 * Stores the Favorites into the plugin directory.
-	 */
-	public void saveFavorites() {
-		FileWriter fw = null;
-		try {
-			XMLMemento memento = XMLMemento.createWriteRoot(ELEMENT_ROOT);
-			for (Iterator it = _favorites.keySet().iterator(); it.hasNext();) {
-				String favName = (String) it.next();
-				Map props = new HashMap((Properties) _favorites.get(favName));
-
-				IMemento config = memento.createChild(ELEMENT_CONFIG);
-				config.putString(ELEMENT_NAME, favName);
-
-				for (Iterator it1 = props.keySet().iterator(); it1.hasNext();) {
-					IMemento entry = config.createChild(ELEMENT_PROPERTY);
-					String name = (String) it1.next();
-					entry.putString(ELEMENT_NAME, name);
-					entry.putString(ELEMENT_VALUE, (String) props.get(name));
-				}
-			}
-			fw = new FileWriter(_favoriteFile.toFile());
-			memento.save(fw);
-		} catch (Exception ee) {
-			// log.FavoriteConfigurations.save.error=Failed to save {0}
-			// favorites. File={1}
-			_log.info("log.FavoriteConfigurations.save.error", _favoriteName, //$NON-NLS-1$
-					_favoriteFile.toOSString(), ee);
-		} finally {
-			if (fw != null) {
-				try {
-					fw.close();
-				} catch (IOException ee)// NOPMD
-				{
-					// nothing to do when IOException throwed in closing files.
-				}
-			}
-		}
-	}
-
-	/**
-	 * Add the favorite into the internal structure but don't save until
-	 * saveFavorites() is called.
-	 * 
-	 * @param name
-	 * @param config
-	 */
-	public void addFavorite(String name, Properties config) {
-		_favorites.put(name, config);
-	}
-
-	/**
-	 * Removes the Favorite that is mapped under the given name.
-	 * 
-	 * @param name
-	 *            the name of the configuration
-	 */
-	public void removeFavorite(String name) {
-		_favorites.remove(name);
-	}
-
-	/**
-	 * Read the favorites from the disk into the memory structure.
-	 */
-	protected void readFavorites() {
-		_favorites = new HashMap();
-		FileReader fr = null;
-		try {
-			try {
-				fr = new FileReader(_favoriteFile.toFile());
-			} catch (FileNotFoundException ee)// NOPMD
-			{
-				// no error here since they don't have to have a favorites...
-			}
-			if (fr != null) {
-				XMLMemento memento = XMLMemento.createReadRoot(fr);
-				IMemento[] children = memento.getChildren(ELEMENT_CONFIG);
-				for (int ii = 0; ii < children.length; ii++) {
-					Properties props = new Properties();
-					IMemento config = children[ii];
-					String name = config.getString(ELEMENT_NAME);
-
-					IMemento[] configProperties = config
-							.getChildren(ELEMENT_PROPERTY);
-					for (int jj = 0; jj < configProperties.length; jj++) {
-						IMemento entry = configProperties[jj];
-						setProperty(props, entry.getString(ELEMENT_NAME), entry
-								.getString(ELEMENT_VALUE));
-					}
-					_favorites.put(name, props);
-				}
-			}
-		} catch (Exception ee) {
-			// log.FavoriteConfigurations.read.error=Failed to save {0}
-			// favorites. File={1}
-			_log.error("log.FavoriteConfigurations.read.error", _favoriteName, //$NON-NLS-1$
-					_favoriteFile.toOSString(), ee);
-		} finally {
-			if (fr != null) {
-				try {
-					fr.close();
-				} catch (IOException ee)// NOPMD
-				{
-					// nothing to do when IOException throwed in closing files.
-				}
-			}
-		}
-	}
-
-	/**
-	 * Set the value in the properties object.
-	 * 
-	 * @param props
-	 * @param name
-	 * @param value
-	 */
-	private void setProperty(Properties props, String name, String value) {
-		if (name != null && value != null) {
-			props.setProperty(name, value);
-		}
-	}
-
-	/**
-	 * Get a list of all the favorites stored in this file.
-	 * 
-	 * @return list of favorites
-	 */
-	public String[] getFavoritesList() {
-		Object[] objs = _favorites.keySet().toArray();
-		String[] names = new String[objs.length];
-
-		for (int ii = 0; ii < objs.length; ii++) {
-			names[ii] = (String) objs[ii];
-		}
-		Arrays.sort(names);
-
-		return names;
-	}
-
-	/**
-	 * scan the file name for any bad character that would fail when trying to
-	 * create the file. We replace bad characters with '_'
-	 */
-	private static String scanFileName(String filename) {
-		StringBuffer strBuf = new StringBuffer();
-		char[] chars = filename.toCharArray();
-
-		for (int ii = 0; ii < chars.length; ii++) {
-			switch (chars[ii]) {
-			case '&':
-			case '\\':
-			case '/':
-			case ' ':
-			case '\t':
-			case ':':
-			case '.':
-			case '\"':
-			case '\'':
-			case '@':
-				strBuf.append('_');
-				break;
-			default:
-				strBuf.append(chars[ii]);
-				break;
-			}
-		}
-
-		return strBuf.toString();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/utils/JSFSharedImages.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/utils/JSFSharedImages.java
deleted file mode 100644
index 2b67a67..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/utils/JSFSharedImages.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.utils;
-
-/**
- * Constants that can be passed to JSFUICommonPlugin.getImageDescriptor and
- * getImage to obtain common images.
- * 
- * @author cbateman
- *
- */
-public interface JSFSharedImages
-{
-    /**
-     * The icon use for default/unknown tags.  Consists of blue open/close
-     * angled braces on a neutral background. 
-     * 
-     * Size: 16x16
-     */
-    public final static String DEFAULT_PALETTE_TAG_IMG = "PD_Palette_Default.gif"; //$NON-NLS-1$
-    
-    /**
-     * A yellow cube on a white background.  Suitable for representing 
-     * generic objects and components.
-     * 
-     * Size: 16x16
-     */
-    public final static String GENERIC_OBJECT_IMG = "object.gif"; //$NON-NLS-1$
-    
-    /**
-     * A generic image suitable for representing JSF validators.  Consists of
-     * a white box with a blue check mark.
-     * 
-     * Size: 16x16
-     */
-    public final static String GENERIC_VALIDATOR_IMG = "jsf_validator.gif"; //$NON-NLS-1$
-
-    /**
-     * A generic image suitable for representing JSF converter.  Consists of
-     * yellow blob being "converted".
-     * 
-     * Size: 16x16
-     */
-    public final static String GENERIC_CONVERTER_IMG = "jsf_converter.gif"; //$NON-NLS-1$
-
-    /**
-     * A generic image suitable for representing a view root.  Same as the
-     * default image generally associated with f:view.
-     * 
-     * Size: 16x16.
-     */
-    public static final String GENERIC_VIEWROOT_IMG = "jsf_view.gif"; //$NON-NLS-1$
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/utils/JavaModelUtil.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/utils/JavaModelUtil.java
deleted file mode 100644
index c4086ed..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/utils/JavaModelUtil.java
+++ /dev/null
@@ -1,1032 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.utils;
-
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.Set;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jdt.core.ClasspathContainerInitializer;
-import org.eclipse.jdt.core.Flags;
-import org.eclipse.jdt.core.IClasspathContainer;
-import org.eclipse.jdt.core.IClasspathEntry;
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IField;
-import org.eclipse.jdt.core.IImportDeclaration;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IMember;
-import org.eclipse.jdt.core.IMethod;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.IPackageFragmentRoot;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.ITypeHierarchy;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jdt.core.Signature;
-import org.eclipse.jdt.core.compiler.CharOperation;
-
-/**
- * Original code is from JDT Utility methods for the Java Model.
- */
-public final class JavaModelUtil {
-
-	/**
-	 * Finds a type by its qualified type name (dot separated).
-	 * 
-	 * @param jproject
-	 *            The java project to search in
-	 * @param fullyQualifiedName
-	 *            The fully qualified name (type name with enclosing type names
-	 *            and package (all separated by dots))
-	 * @return The type found, or null if not existing
-	 * @throws JavaModelException 
-	 */
-	public static IType findType(IJavaProject jproject,
-			String fullyQualifiedName) throws JavaModelException {
-		// workaround for bug 22883
-		IType type = jproject.findType(fullyQualifiedName);
-		if (type != null) {
-			return type;
-		}
-		IPackageFragmentRoot[] roots = jproject.getPackageFragmentRoots();
-		for (int i = 0; i < roots.length; i++) {
-			IPackageFragmentRoot root = roots[i];
-			type = findType(root, fullyQualifiedName);
-			if (type != null && type.exists()) {
-				return type;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Returns <code>true</code> if the given package fragment root is
-	 * referenced. This means it is own by a different project but is referenced
-	 * by the root's parent. Returns <code>false</code> if the given root
-	 * doesn't have an underlying resource.
-	 * @param root 
-	 * @return true if root is referenced
-	 */
-	public static boolean isReferenced(IPackageFragmentRoot root) {
-		IResource resource = root.getResource();
-		if (resource != null) {
-			IProject jarProject = resource.getProject();
-			IProject container = root.getJavaProject().getProject();
-			return !container.equals(jarProject);
-		}
-		return false;
-	}
-
-	private static IType findType(IPackageFragmentRoot root,
-			String fullyQualifiedName) throws JavaModelException {
-		IJavaElement[] children = root.getChildren();
-		for (int i = 0; i < children.length; i++) {
-			IJavaElement element = children[i];
-			if (element.getElementType() == IJavaElement.PACKAGE_FRAGMENT) {
-				IPackageFragment pack = (IPackageFragment) element;
-				if (!fullyQualifiedName.startsWith(pack.getElementName())) {
-					continue;
-				}
-				IType type = findType(pack, fullyQualifiedName);
-				if (type != null && type.exists()) {
-					return type;
-				}
-			}
-		}
-		return null;
-	}
-
-	private static IType findType(IPackageFragment pack,
-			String fullyQualifiedName) throws JavaModelException {
-		ICompilationUnit[] cus = pack.getCompilationUnits();
-		for (int i = 0; i < cus.length; i++) {
-			ICompilationUnit unit = cus[i];
-			IType type = findType(unit, fullyQualifiedName);
-			if (type != null && type.exists()) {
-				return type;
-			}
-		}
-		return null;
-	}
-
-	private static IType findType(ICompilationUnit cu, String fullyQualifiedName)
-			throws JavaModelException {
-		IType[] types = cu.getAllTypes();
-		for (int i = 0; i < types.length; i++) {
-			IType type = types[i];
-			if (getFullyQualifiedName(type).equals(fullyQualifiedName)) {
-				return type;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Finds a type by package and type name.
-	 * 
-	 * @param jproject
-	 *            the java project to search in
-	 * @param pack
-	 *            The package name
-	 * @param typeQualifiedName
-	 *            the type qualified name (type name with enclosing type names
-	 *            (separated by dots))
-	 * @return the type found, or null if not existing
-	 * @throws JavaModelException 
-	 * @deprecated Use IJavaProject.findType(String, String) instead
-	 */
-	public static IType findType(IJavaProject jproject, String pack,
-			String typeQualifiedName) throws JavaModelException {
-		return jproject.findType(pack, typeQualifiedName);
-	}
-
-	/**
-	 * Finds a type container by container name. The returned element will be of
-	 * type <code>IType</code> or a <code>IPackageFragment</code>.
-	 * <code>null</code> is returned if the type container could not be found.
-	 * 
-	 * @param jproject
-	 *            The Java project defining the context to search
-	 * @param typeContainerName
-	 *            A dot separarted name of the type container
-	 * @return the java element
-	 * @throws JavaModelException 
-	 * @see #getTypeContainerName(IType)
-	 */
-	public static IJavaElement findTypeContainer(IJavaProject jproject,
-			String typeContainerName) throws JavaModelException {
-		// try to find it as type
-		IJavaElement result = jproject.findType(typeContainerName);
-		if (result == null) {
-			// find it as package
-			IPath path = new Path(typeContainerName.replace('.', '/'));
-			result = jproject.findElement(path);
-			if (!(result instanceof IPackageFragment)) {
-				result = null;
-			}
-
-		}
-		return result;
-	}
-
-	/**
-	 * Finds a type in a compilation unit. Typical usage is to find the
-	 * corresponding type in a working copy.
-	 * 
-	 * @param cu
-	 *            the compilation unit to search in
-	 * @param typeQualifiedName
-	 *            the type qualified name (type name with enclosing type names
-	 *            (separated by dots))
-	 * @return the type found, or null if not existing
-	 * @throws JavaModelException 
-	 */
-	public static IType findTypeInCompilationUnit(ICompilationUnit cu,
-			String typeQualifiedName) throws JavaModelException {
-		IType[] types = cu.getAllTypes();
-		for (int i = 0; i < types.length; i++) {
-			String currName = getTypeQualifiedName(types[i]);
-			if (typeQualifiedName.equals(currName)) {
-				return types[i];
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Finds a a member in a compilation unit. Typical usage is to find the
-	 * corresponding member in a working copy.
-	 * 
-	 * @param cu
-	 *            the compilation unit (eg. working copy) to search in
-	 * @param member
-	 *            the member (eg. from the original)
-	 * @return the member found, or null if not existing
-	 */
-	public static IMember findMemberInCompilationUnit(ICompilationUnit cu,
-			IMember member) {
-		IJavaElement[] elements = cu.findElements(member);
-		if (elements != null && elements.length > 0) {
-			return (IMember) elements[0];
-		}
-		return null;
-	}
-
-	/**
-	 * Returns the element of the given compilation unit which is "equal" to the
-	 * given element. Note that the given element usually has a parent different
-	 * from the given compilation unit.
-	 * 
-	 * @param cu
-	 *            the cu to search in
-	 * @param element
-	 *            the element to look for
-	 * @return an element of the given cu "equal" to the given element
-	 */
-	public static IJavaElement findInCompilationUnit(ICompilationUnit cu,
-			IJavaElement element) {
-		IJavaElement[] elements = cu.findElements(element);
-		if (elements != null && elements.length > 0) {
-			return elements[0];
-		}
-		return null;
-	}
-
-	/**
-	 * Returns the qualified type name of the given type using '.' as
-	 * separators. This is a replace for IType.getTypeQualifiedName() which uses
-	 * '$' as separators. As '$' is also a valid character in an id this is
-	 * ambiguous. JavaCore PR: 1GCFUNT
-	 * @param type 
-	 * @return the type qualified name
-	 */
-	public static String getTypeQualifiedName(IType type) {
-		return type.getTypeQualifiedName('.');
-	}
-
-	/**
-	 * Returns the fully qualified name of the given type using '.' as
-	 * separators. This is a replace for IType.getFullyQualifiedTypeName which
-	 * uses '$' as separators. As '$' is also a valid character in an id this is
-	 * ambiguous. JavaCore PR: 1GCFUNT
-	 * @param type 
-	 * @return the fully qualified name using . as the separator
-	 */
-	public static String getFullyQualifiedName(IType type) {
-		return type.getFullyQualifiedName('.');
-	}
-
-	/**
-	 * Returns the fully qualified name of a type's container. (package name or
-	 * enclosing type name)
-	 * @param type 
-	 * @return the container name
-	 */
-	public static String getTypeContainerName(IType type) {
-		IType outerType = type.getDeclaringType();
-		if (outerType != null) {
-			return outerType.getFullyQualifiedName('.');
-		}
-        return type.getPackageFragment().getElementName();
-	}
-
-	/**
-	 * Concatenates two names. Uses a dot for separation. Both strings can be
-	 * empty or <code>null</code>.
-	 * @param name1 
-	 * @param name2 
-	 * @return name1 + name2
-	 */
-	public static String concatenateName(String name1, String name2) {
-		StringBuffer buf = new StringBuffer();
-		if (name1 != null && name1.length() > 0) {
-			buf.append(name1);
-		}
-		if (name2 != null && name2.length() > 0) {
-			if (buf.length() > 0) {
-				buf.append('.');
-			}
-			buf.append(name2);
-		}
-		return buf.toString();
-	}
-
-	/**
-	 * Concatenates two names. Uses a dot for separation. Both strings can be
-	 * empty or <code>null</code>.
-	 * @param name1 
-	 * @param name2 
-	 * @return name1 + name2
-	 */
-	public static String concatenateName(char[] name1, char[] name2) {
-		StringBuffer buf = new StringBuffer();
-		if (name1 != null && name1.length > 0) {
-			buf.append(name1);
-		}
-		if (name2 != null && name2.length > 0) {
-			if (buf.length() > 0) {
-				buf.append('.');
-			}
-			buf.append(name2);
-		}
-		return buf.toString();
-	}
-
-	/**
-	 * Evaluates if a member (possible from another package) is visible from
-	 * elements in a package.
-	 * 
-	 * @param member
-	 *            The member to test the visibility for
-	 * @param pack
-	 *            The package in focus
-	 * @return true if visible
-	 * @throws JavaModelException 
-	 */
-	public static boolean isVisible(IMember member, IPackageFragment pack)
-			throws JavaModelException {
-
-		int type = member.getElementType();
-		if (type == IJavaElement.INITIALIZER
-				|| (type == IJavaElement.METHOD && member.getElementName()
-						.startsWith("<"))) { //$NON-NLS-1$
-			//$NON-NLS-1$
-			return false;
-		}
-
-		int otherflags = member.getFlags();
-		IType declaringType = member.getDeclaringType();
-		if (Flags.isPublic(otherflags)
-				|| (declaringType != null && declaringType.isInterface())) {
-			return true;
-		} else if (Flags.isPrivate(otherflags)) {
-			return false;
-		}
-
-		IPackageFragment otherpack = (IPackageFragment) findParentOfKind(
-				member, IJavaElement.PACKAGE_FRAGMENT);
-		return (pack != null && otherpack != null && isSamePackage(pack,
-				otherpack));
-	}
-
-	/**
-	 * Evaluates if a member in the focus' element hierarchy is visible from
-	 * elements in a package.
-	 * 
-	 * @param member
-	 *            The member to test the visibility for
-	 * @param pack
-	 *            The package of the focus element focus
-	 * @return true if is visible in hiearchy
-	 * @throws JavaModelException 
-	 */
-	public static boolean isVisibleInHierarchy(IMember member,
-			IPackageFragment pack) throws JavaModelException {
-		int type = member.getElementType();
-		if (type == IJavaElement.INITIALIZER
-				|| (type == IJavaElement.METHOD && member.getElementName()
-						.startsWith("<"))) { //$NON-NLS-1$
-			//$NON-NLS-1$
-			return false;
-		}
-
-		int otherflags = member.getFlags();
-
-		IType declaringType = member.getDeclaringType();
-		if (Flags.isPublic(otherflags) || Flags.isProtected(otherflags)
-				|| (declaringType != null && declaringType.isInterface())) {
-			return true;
-		} else if (Flags.isPrivate(otherflags)) {
-			return false;
-		}
-
-		IPackageFragment otherpack = (IPackageFragment) findParentOfKind(
-				member, IJavaElement.PACKAGE_FRAGMENT);
-		return (pack != null && pack.equals(otherpack));
-	}
-
-	/**
-	 * Returns the package fragment root of <code>IJavaElement</code>. If the
-	 * given element is already a package fragment root, the element itself is
-	 * returned.
-	 * @param element 
-	 * @return the package fragment root
-	 */
-	public static IPackageFragmentRoot getPackageFragmentRoot(
-			IJavaElement element) {
-		return (IPackageFragmentRoot) element
-				.getAncestor(IJavaElement.PACKAGE_FRAGMENT_ROOT);
-	}
-
-	/**
-	 * Returns the parent of the supplied java element that conforms to the
-	 * given parent type or <code>null</code>, if such a parent doesn't exit.
-	 * 
-	 * @deprecated Use element.getParent().getAncestor(kind);
-	 */
-	private static IJavaElement findParentOfKind(IJavaElement element, int kind) {
-		if (element != null && element.getParent() != null) {
-			return element.getParent().getAncestor(kind);
-		}
-		return null;
-	}
-
-	/**
-	 * Finds a method in a type. This searches for a method with the same name
-	 * and signature. Parameter types are only compared by the simple name, no
-	 * resolving for the fully qualified type name is done. Constructors are
-	 * only compared by parameters, not the name.
-	 * 
-	 * @param name
-	 *            The name of the method to find
-	 * @param paramTypes
-	 *            The type signatures of the parameters e.g.
-	 *            <code>{"QString;","I"}</code>
-	 * @param isConstructor
-	 *            If the method is a constructor
-	 * @param type 
-	 * @return The first found method or <code>null</code>, if nothing found
-	 * @throws JavaModelException 
-	 */
-	public static IMethod findMethod(String name, String[] paramTypes,
-			boolean isConstructor, IType type) throws JavaModelException {
-		return findMethod(name, paramTypes, isConstructor, type.getMethods());
-	}
-
-	/**
-	 * Finds a method by name. This searches for a method with a name and
-	 * signature. Parameter types are only compared by the simple name, no
-	 * resolving for the fully qualified type name is done. Constructors are
-	 * only compared by parameters, not the name.
-	 * 
-	 * @param name
-	 *            The name of the method to find
-	 * @param paramTypes
-	 *            The type signatures of the parameters e.g.
-	 *            <code>{"QString;","I"}</code>
-	 * @param isConstructor
-	 *            If the method is a constructor
-	 * @param methods
-	 *            The methods to search in
-	 * @return The found method or <code>null</code>, if nothing found
-	 * @throws JavaModelException 
-	 */
-	public static IMethod findMethod(String name, String[] paramTypes,
-			boolean isConstructor, IMethod[] methods) throws JavaModelException {
-		for (int i = methods.length - 1; i >= 0; i--) {
-			if (isSameMethodSignature(name, paramTypes, isConstructor,
-					methods[i])) {
-				return methods[i];
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Finds a method declararion in a type's hierarchy. The search is top down,
-	 * so this returns the first declaration of the method in the hierarchy.
-	 * This searches for a method with a name and signature. Parameter types are
-	 * only compared by the simple name, no resolving for the fully qualified
-	 * type name is done. Constructors are only compared by parameters, not the
-	 * name.
-	 * @param hierarchy 
-	 * 
-	 * @param type
-	 *            Searches in this type's supertypes.
-	 * @param name
-	 *            The name of the method to find
-	 * @param paramTypes
-	 *            The type signatures of the parameters e.g.
-	 *            <code>{"QString;","I"}</code>
-	 * @param isConstructor
-	 *            If the method is a constructor
-	 * @return The first method found or null, if nothing found
-	 * @throws JavaModelException 
-	 */
-	public static IMethod findMethodDeclarationInHierarchy(
-			ITypeHierarchy hierarchy, IType type, String name,
-			String[] paramTypes, boolean isConstructor)
-			throws JavaModelException {
-		IType[] superTypes = hierarchy.getAllSupertypes(type);
-		for (int i = superTypes.length - 1; i >= 0; i--) {
-			IMethod first = findMethod(name, paramTypes, isConstructor,
-					superTypes[i]);
-			if (first != null && !Flags.isPrivate(first.getFlags())) {
-				// the order getAllSupertypes does make assumptions of the order
-				// of inner elements -> search recursivly
-				IMethod res = findMethodDeclarationInHierarchy(hierarchy, first
-						.getDeclaringType(), name, paramTypes, isConstructor);
-				if (res != null) {
-					return res;
-				}
-				return first;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Finds a method implementation in a type's classhierarchy. The search is
-	 * bottom-up, so this returns the nearest overridden method. Does not find
-	 * methods in interfaces or abstract methods. This searches for a method
-	 * with a name and signature. Parameter types are only compared by the
-	 * simple name, no resolving for the fully qualified type name is done.
-	 * Constructors are only compared by parameters, not the name.
-	 * @param hierarchy 
-	 * 
-	 * @param type
-	 *            Type to search the superclasses
-	 * @param name
-	 *            The name of the method to find
-	 * @param paramTypes
-	 *            The type signatures of the parameters e.g.
-	 *            <code>{"QString;","I"}</code>
-	 * @param isConstructor
-	 *            If the method is a constructor
-	 * @return The first method found or null, if nothing found
-	 * @throws JavaModelException 
-	 */
-	public static IMethod findMethodImplementationInHierarchy(
-			ITypeHierarchy hierarchy, IType type, String name,
-			String[] paramTypes, boolean isConstructor)
-			throws JavaModelException {
-		IType[] superTypes = hierarchy.getAllSuperclasses(type);
-		for (int i = 0; i < superTypes.length; i++) {
-			IMethod found = findMethod(name, paramTypes, isConstructor,
-					superTypes[i]);
-			if (found != null) {
-				if (Flags.isAbstract(found.getFlags())) {
-					return null;
-				}
-				return found;
-			}
-		}
-		return null;
-	}
-
-	private static IMethod findMethodInHierarchy(ITypeHierarchy hierarchy,
-			IType type, String name, String[] paramTypes, boolean isConstructor)
-			throws JavaModelException {
-		IMethod method = findMethod(name, paramTypes, isConstructor, type);
-		if (method != null) {
-			return method;
-		}
-		IType superClass = hierarchy.getSuperclass(type);
-		if (superClass != null) {
-			IMethod res = findMethodInHierarchy(hierarchy, superClass, name,
-					paramTypes, isConstructor);
-			if (res != null) {
-				return res;
-			}
-		}
-		if (!isConstructor) {
-			IType[] superInterfaces = hierarchy.getSuperInterfaces(type);
-			for (int i = 0; i < superInterfaces.length; i++) {
-				IMethod res = findMethodInHierarchy(hierarchy,
-						superInterfaces[i], name, paramTypes, false);
-				if (res != null) {
-					return res;
-				}
-			}
-		}
-		return method;
-	}
-
-	/**
-	 * Finds the method that is defines/declares the given method. The search is
-	 * bottom-up, so this returns the nearest defining/declaring method.
-	 * @param typeHierarchy 
-	 * @param type 
-	 * @param methodName 
-	 * @param paramTypes 
-	 * @param isConstructor 
-	 * 
-	 * @param testVisibility
-	 *            If true the result is tested on visibility. Null is returned
-	 *            if the method is not visible.
-	 * @return the method or null
-	 * @throws JavaModelException
-	 */
-	public static IMethod findMethodDefininition(ITypeHierarchy typeHierarchy,
-			IType type, String methodName, String[] paramTypes,
-			boolean isConstructor, boolean testVisibility)
-			throws JavaModelException {
-		IType superClass = typeHierarchy.getSuperclass(type);
-		if (superClass != null) {
-			IMethod res = findMethodInHierarchy(typeHierarchy, superClass,
-					methodName, paramTypes, isConstructor);
-			if (res != null && !Flags.isPrivate(res.getFlags())) {
-				if (!testVisibility
-						|| isVisibleInHierarchy(res, type.getPackageFragment())) {
-					return res;
-				}
-			}
-		}
-		if (!isConstructor) {
-			IType[] interfaces = typeHierarchy.getSuperInterfaces(type);
-			for (int i = 0; i < interfaces.length; i++) {
-				IMethod res = findMethodInHierarchy(typeHierarchy,
-						interfaces[i], methodName, paramTypes, false);
-				if (res != null) {
-					return res; // methods from interfaces are always public and
-					// therefore visible
-				}
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Tests if a method equals to the given signature. Parameter types are only
-	 * compared by the simple name, no resolving for the fully qualified type
-	 * name is done. Constructors are only compared by parameters, not the name.
-	 * 
-	 * @param name
-	 *            Name of the method
-	 * @param paramTypes
-	 *            The type signatures of the parameters e.g.
-	 *            <code>{"QString;","I"}</code>
-	 * @param isConstructor
-	 *            Specifies if the method is a constructor
-	 * @param curr 
-	 * @return Returns <code>true</code> if the method has the given name and
-	 *         parameter types and constructor state.
-	 * @throws JavaModelException 
-	 */
-	public static boolean isSameMethodSignature(String name,
-			String[] paramTypes, boolean isConstructor, IMethod curr)
-			throws JavaModelException {
-		if (isConstructor || name.equals(curr.getElementName())) {
-			if (isConstructor == curr.isConstructor()) {
-				String[] currParamTypes = curr.getParameterTypes();
-				if (paramTypes.length == currParamTypes.length) {
-					for (int i = 0; i < paramTypes.length; i++) {
-						String t1 = Signature.getSimpleName(Signature
-								.toString(paramTypes[i]));
-						String t2 = Signature.getSimpleName(Signature
-								.toString(currParamTypes[i]));
-						if (!t1.equals(t2)) {
-							return false;
-						}
-					}
-					return true;
-				}
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * Tests if two <code>IPackageFragment</code>s represent the same logical
-	 * java package.
-	 * @param pack1 
-	 * @param pack2 
-	 * 
-	 * @return <code>true</code> if the package fragments' names are equal.
-	 */
-	public static boolean isSamePackage(IPackageFragment pack1,
-			IPackageFragment pack2) {
-		return pack1.getElementName().equals(pack2.getElementName());
-	}
-
-	/**
-	 * Checks whether the given type has a valid main method or not.
-	 * @param type 
-	 * @return true if type has a main method
-	 * @throws JavaModelException 
-	 */
-	public static boolean hasMainMethod(IType type) throws JavaModelException {
-		IMethod[] methods = type.getMethods();
-		for (int i = 0; i < methods.length; i++) {
-			if (methods[i].isMainMethod()) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * Checks if the field is boolean.
-	 * @param field 
-	 * @return true if the file is of primitive boolean type
-	 * @throws JavaModelException 
-	 */
-	public static boolean isBoolean(IField field) throws JavaModelException {
-		return field.getTypeSignature().equals(Signature.SIG_BOOLEAN);
-	}
-
-	/**
-	 * Tests if the given element is on the class path of its containing
-	 * project. Handles the case that the containing project isn't a Java
-	 * project.
-	 * @param element 
-	 * @return true if element in on the class path?
-	 */
-	public static boolean isOnClasspath(IJavaElement element) {
-		IJavaProject project = element.getJavaProject();
-		if (!project.exists())
-			return false;
-		return project.isOnClasspath(element);
-	}
-
-	/**
-	 * Resolves a type name in the context of the declaring type.
-	 * 
-	 * @param refTypeSig
-	 *            the type name in signature notation (for example 'QVector')
-	 *            this can also be an array type, but dimensions will be
-	 *            ignored.
-	 * @param declaringType
-	 *            the context for resolving (type where the reference was made
-	 *            in)
-	 * @return returns the fully qualified type name or build-in-type name. if a
-	 *         unresoved type couldn't be resolved null is returned
-	 * @throws JavaModelException 
-	 */
-	public static String getResolvedTypeName(String refTypeSig,
-			IType declaringType) throws JavaModelException {
-		int arrayCount = Signature.getArrayCount(refTypeSig);
-		char type = refTypeSig.charAt(arrayCount);
-		if (type == Signature.C_UNRESOLVED) {
-			int semi = refTypeSig
-					.indexOf(Signature.C_SEMICOLON, arrayCount + 1);
-			if (semi == -1) {
-				throw new IllegalArgumentException();
-			}
-			String name = refTypeSig.substring(arrayCount + 1, semi);
-
-			String[][] resolvedNames = declaringType.resolveType(name);
-			if (resolvedNames != null && resolvedNames.length > 0) {
-				return JavaModelUtil.concatenateName(resolvedNames[0][0],
-						resolvedNames[0][1]);
-			}
-			return null;
-		}
-        return Signature.toString(refTypeSig.substring(arrayCount));
-	}
-
-	/**
-	 * Returns if a CU can be edited.
-	 * @param cu 
-	 * @return true if cu is editable
-	 */
-	public static boolean isEditable(ICompilationUnit cu) {
-		IResource resource = toOriginal(cu).getResource();
-		return (resource.exists() && !resource.getResourceAttributes()
-				.isReadOnly());
-	}
-
-	/**
-	 * Finds a qualified import for a type name.
-	 * @param cu 
-	 * @param simpleName 
-	 * @return the import declaration or null
-	 * @throws JavaModelException 
-	 */
-	public static IImportDeclaration findImport(ICompilationUnit cu,
-			String simpleName) throws JavaModelException {
-		IImportDeclaration[] existing = cu.getImports();
-		for (int i = 0; i < existing.length; i++) {
-			String curr = existing[i].getElementName();
-			if (curr.endsWith(simpleName)) {
-				int dotPos = curr.length() - simpleName.length() - 1;
-				if ((dotPos == -1)
-						|| (dotPos > 0 && curr.charAt(dotPos) == '.')) {
-					return existing[i];
-				}
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Returns the original if the given member. If the member is already an
-	 * original the input is returned. The returned member might not exist
-	 * @param member 
-	 * @return the original IMember
-	 */
-	public static IMember toOriginal(IMember member) {
-		if (member instanceof IMethod) {
-			return toOriginalMethod((IMethod) member);
-		}
-
-		return (IMember) member.getPrimaryElement();
-		/*
-		 * ICompilationUnit cu= member.getCompilationUnit(); if (cu != null &&
-		 * cu.isWorkingCopy()) return (IMember)cu.getOriginal(member); return
-		 * member;
-		 */
-	}
-
-	/*
-	 * XXX workaround for bug 18568
-	 * http://bugs.eclipse.org/bugs/show_bug.cgi?id=18568 to be removed once the
-	 * bug is fixed
-	 */
-	private static IMethod toOriginalMethod(IMethod method) {
-		ICompilationUnit cu = method.getCompilationUnit();
-		if (cu == null || isPrimary(cu)) {
-			return method;
-		}
-		try {
-			// use the workaround only if needed
-			if (!method.getElementName().equals(
-					method.getDeclaringType().getElementName()))
-				return (IMethod) method.getPrimaryElement();
-
-			IType originalType = (IType) toOriginal(method.getDeclaringType());
-			IMethod[] methods = originalType.findMethods(method);
-			boolean isConstructor = method.isConstructor();
-			for (int i = 0; i < methods.length; i++) {
-				if (methods[i].isConstructor() == isConstructor)
-					return methods[i];
-			}
-			return null;
-		} catch (JavaModelException e) {
-			return null;
-		}
-	}
-
-	// private static boolean PRIMARY_ONLY = false;
-
-	/**
-	 * Returns the original cu if the given cu is a working copy. If the cu is
-	 * already an original the input cu is returned. The returned cu might not
-	 * exist
-	 * @param cu 
-	 * @return the original compiliation unit
-	 */
-	public static ICompilationUnit toOriginal(ICompilationUnit cu) {
-		// To stay compatible with old version returned null
-		// if cu is null
-		if (cu == null)
-			return cu;
-		return cu.getPrimary();
-	}
-
-	/**
-	 * Returns the original element if the given element is a working copy. If
-	 * the cu is already an original the input element is returned. The returned
-	 * element might not exist
-	 * @param element 
-	 * @return element's primary element
-	 */
-	public static IJavaElement toOriginal(IJavaElement element) {
-		return element.getPrimaryElement();
-	}
-
-	/**
-	 * Returns true if a cu is a primary cu (original or shared working copy)
-	 * @param cu 
-	 * @return true if cu  is primary
-	 */
-	public static boolean isPrimary(ICompilationUnit cu) {
-		return cu.getOwner() == null;
-	}
-
-	/**
-	 * http://bugs.eclipse.org/bugs/show_bug.cgi?id=19253
-	 * 
-	 * Reconciling happens in a separate thread. This can cause a situation
-	 * where the Java element gets disposed after an exists test has been done.
-	 * So we should not log not present exceptions when they happen in working
-	 * copies.
-	 * @param exception 
-	 * @return true if filter not present
-	 */
-	public static boolean filterNotPresentException(CoreException exception) {
-		if (!(exception instanceof JavaModelException)) {
-			return true;
-		}
-		JavaModelException je = (JavaModelException) exception;
-		if (!je.isDoesNotExist()) {
-			return true;
-		}
-		IJavaElement[] elements = je.getJavaModelStatus().getElements();
-		for (int i = 0; i < elements.length; i++) {
-			IJavaElement element = elements[i];
-			ICompilationUnit unit = (ICompilationUnit) element
-					.getAncestor(IJavaElement.COMPILATION_UNIT);
-			if (unit == null) {
-				return true;
-			}
-			if (!unit.isWorkingCopy()) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * @param type
-	 * @param pm
-	 * @return all supertypes of type
-	 * @throws JavaModelException
-	 */
-	public static IType[] getAllSuperTypes(IType type, IProgressMonitor pm)
-			throws JavaModelException {
-		// workaround for 23656
-		Set types = new HashSet(Arrays.asList(type.newSupertypeHierarchy(pm)
-				.getAllSupertypes(type)));
-		IType objekt = type.getJavaProject().findType("java.lang.Object");//$NON-NLS-1$
-		if (objekt != null) {
-			types.add(objekt);
-		}
-		return (IType[]) types.toArray(new IType[types.size()]);
-	}
-
-	/**
-	 * @param resourcePath
-	 * @param exclusionPatterns
-	 * @return true if resourcePath is excluded by exclusion patterns
-	 */
-	public static boolean isExcludedPath(IPath resourcePath,
-			IPath[] exclusionPatterns) {
-		char[] path = resourcePath.toString().toCharArray();
-		for (int i = 0, length = exclusionPatterns.length; i < length; i++) {
-			char[] pattern = exclusionPatterns[i].toString().toCharArray();
-			if (CharOperation.pathMatch(pattern, path, true, '/')) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/*
-
-	 * @see IClasspathEntry#getExclusionPatterns
-	 */
-	/**
-	 * Returns whether the given resource path matches one of the exclusion
-	 * patterns.
-	 * 
-	 * @param resourcePath
-	 * @param exclusionPatterns
-	 * @return true if resourcePath is excluded
-	 */
-	public static boolean isExcluded(IPath resourcePath,
-			char[][] exclusionPatterns) {
-		if (exclusionPatterns == null) {
-			return false;
-		}
-		char[] path = resourcePath.toString().toCharArray();
-		for (int i = 0, length = exclusionPatterns.length; i < length; i++) {
-			if (CharOperation.pathMatch(exclusionPatterns[i], path, true, '/')) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	private static Boolean fgIsJDTCore_1_5 = null;
-
-	/**
-	 * @return true if JRE 1.5 in enabled.
-	 */
-	public static boolean isJDTCore_1_5() {
-		if (fgIsJDTCore_1_5 == null) {
-			fgIsJDTCore_1_5 = JavaCore
-					.getDefaultOptions()
-					.containsKey(
-							"org.eclipse.jdt.core.compiler.problem.unsafeTypeOperation") ? Boolean.TRUE //$NON-NLS-1$
-					: Boolean.FALSE;
-		}
-		return fgIsJDTCore_1_5.booleanValue();
-	}
-
-	/**
-	 * Helper method that tests if an classpath entry can be found in a
-	 * container. <code>null</code> is returned if the entry can not be found
-	 * or if the container does not allows the configuration of source
-	 * attachments
-	 * 
-	 * @param jproject
-	 *            The container's parent project
-	 * @param containerPath
-	 *            The path of the container
-	 * @param libPath
-	 *            The path of the library to be found
-	 * @return IClasspathEntry A classpath entry from the container of
-	 *         <code>null</code> if the container can not be modified.
-	 * @throws JavaModelException 
-	 */
-	public static IClasspathEntry getClasspathEntryToEdit(
-			IJavaProject jproject, IPath containerPath, IPath libPath)
-			throws JavaModelException {
-		IClasspathContainer container = JavaCore.getClasspathContainer(
-				containerPath, jproject);
-		ClasspathContainerInitializer initializer = JavaCore
-				.getClasspathContainerInitializer(containerPath.segment(0));
-		if (container != null
-				&& initializer != null
-				&& initializer.canUpdateClasspathContainer(containerPath,
-						jproject)) {
-			IClasspathEntry[] entries = container.getClasspathEntries();
-			for (int i = 0; i < entries.length; i++) {
-				IClasspathEntry curr = entries[i];
-				IClasspathEntry resolved = JavaCore
-						.getResolvedClasspathEntry(curr);
-				if (resolved != null && libPath.equals(resolved.getPath())) {
-					return curr; // return the real entry
-				}
-			}
-		}
-		return null; // attachment not possible
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/utils/PathUtil.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/utils/PathUtil.java
deleted file mode 100644
index 8eebe90..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/utils/PathUtil.java
+++ /dev/null
@@ -1,307 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.utils;
-
-import java.io.File;
-import java.util.StringTokenizer;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jdt.core.IClasspathEntry;
-import org.eclipse.jdt.core.IJarEntryResource;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jst.jsf.common.ui.IFileFolderConstants;
-import org.eclipse.ui.IFileEditorInput;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * Collection of helper methods to manage and convert links Originally part of
- * the LinksManager (com.ibm.iwt.parser.util)
- */
-public final class PathUtil {
-	private static final String FORWARD_SLASH = "/"; //$NON-NLS-1$
-
-	private static final String RELATIVE_PATH_SIGNAL = IFileFolderConstants.DOT
-			+ IFileFolderConstants.DOT + IFileFolderConstants.PATH_SEPARATOR;
-
-	/**
-	 * adjust relative path isside the absolute path
-	 * @param path 
-	 * @return the adjusted path
-	 */
-	public static String adjustPath(String path) {
-		int i = 0;
-		while ((i = path.indexOf(RELATIVE_PATH_SIGNAL)) > 0) {
-			// split the string into two
-			String part1 = path.substring(0, i - 1);
-			String part2 = path
-					.substring(i + RELATIVE_PATH_SIGNAL.length() - 1);
-			// strip one path seg from part1
-			int j = part1.lastIndexOf(FORWARD_SLASH);
-			if (j == -1) {
-				return "";//$NON-NLS-1$
-			}
-			part1 = part1.substring(0, j);
-			path = part1 + part2;
-		}
-		return path;
-	}
-
-	/**
-	 * Append trailing url slash if needed
-	 * @param input 
-	 * @return the string
-	 */
-	public static String appendTrailingURLSlash(String input) {
-		// check to see already a slash
-		if (!input.endsWith(FORWARD_SLASH)) {
-			input += FORWARD_SLASH;
-		}
-		return input;
-	}
-
-	/**
-	 * Convert to relative url based on base
-	 * @param input 
-	 * @param base 
-	 * @return the string
-	 */
-	public static String convertToRelativePath(String input, String base) {
-		// tokenize the strings
-		StringTokenizer inputTokenizer = new StringTokenizer(input,
-				FORWARD_SLASH);
-		StringTokenizer baseTokenizer = new StringTokenizer(base, FORWARD_SLASH);
-		String token1 = "", token2 = "";//$NON-NLS-2$//$NON-NLS-1$
-		//
-		// Go through until equls
-		while (true) {
-			if (!inputTokenizer.hasMoreTokens()
-					|| !baseTokenizer.hasMoreTokens()) {
-				break;
-			}
-			token1 = baseTokenizer.nextToken();
-			token2 = inputTokenizer.nextToken();
-			if (!token1.equals(token2)) {
-				break;
-			}
-		}
-		// now generate the backs
-		String output = "";//$NON-NLS-1$
-		while (baseTokenizer.hasMoreTokens()) {
-			baseTokenizer.nextToken();
-			output += RELATIVE_PATH_SIGNAL;
-		}
-		output += token2;
-		// generate the rest
-		while (inputTokenizer.hasMoreTokens()) {
-			output = output + FORWARD_SLASH + inputTokenizer.nextToken();
-		}
-		return output;
-	}
-
-	/**
-	 * @param projectName
-	 * @param path
-	 * @return the path in the project converted to a path relative to the
-	 * web folder
-	 */
-	public static String convertToWebPath(String projectName, String path) {
-		String name = ""; //$NON-NLS-1$
-		IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(
-				projectName);
-		String webrootName = WebrootUtil.getWebContentFolder(project).getName();
-
-		if (path.indexOf(webrootName) != -1) {
-			name = projectName + IFileFolderConstants.PATH_SEPARATOR
-					+ webrootName;
-		} else {
-			name = projectName;
-		}
-		int index = path.indexOf(projectName);
-
-		return path.substring(index + name.length());
-	}
-
-	/**
-	 * convert path relative to current active file to absolute path in
-	 * filesystem
-	 * 
-	 * @param uri
-	 *            the relative path
-	 * @param curFile 
-	 * @return absolute path in file system
-	 */
-	public static String convertToAbsolutePath(String uri, IFile curFile) {
-		if (uri == null || uri.trim().equals("")) { //$NON-NLS-1$
-			return uri;
-		}
-		String webroot = ""; //$NON-NLS-1$
-		IFile jsp = curFile;
-		try {
-			if (jsp == null) {
-				jsp = ((IFileEditorInput) getActivePage()
-						.getActiveEditor().getEditorInput()).getFile();
-			}
-			if (jsp != null) {
-				String webrootName = WebrootUtil.getWebContentFolder(
-						jsp.getProject()).getName();
-				webroot = jsp.getProject().getFolder(webrootName).getLocation()
-						.toString();
-			}
-		} catch (NullPointerException e) {
-			return uri;
-		}
-		if (uri.startsWith(IFileFolderConstants.PATH_SEPARATOR))
-		{
-			return webroot + uri;
-		}
-		if (jsp != null) {
-			IContainer con = jsp.getParent();
-			if (con != null) {
-				IPath path = con.getLocation();
-				if (path != null) {
-					String aPath = path.toString() + File.separator + uri;
-					aPath = aPath.replace('/', File.separatorChar);
-					aPath = aPath.replace('\\', File.separatorChar);
-					if (aPath.endsWith(File.separator)) {
-						aPath += IFileFolderConstants.PATH_SEPARATOR;
-					}
-					File file = new File(aPath);
-					if (file.exists() && file.isFile()) {
-						return file.getAbsolutePath();
-					}
-                    return uri;
-				}
-			}
-		}
-		return uri;
-	}
-
-	/**
-	 * Returns the active workbench window.
-	 * 
-	 * @return the active workbench window. this can be null but I've never seen
-	 *         it.
-	 */
-	private static IWorkbenchWindow getActiveWorkbenchWindow() {
-		if (PlatformUI.getWorkbench() == null) {
-			return null;
-		}
-        return PlatformUI.getWorkbench().getActiveWorkbenchWindow();
-	}
-
-	/**
-	 * Returns the active workbench page. Note that the active page may not be
-	 * the one that the user perceives as active in some situations so this
-	 * method of obtaining the activate page should only be used if no other
-	 * method is available.
-	 * 
-	 * @return the active workbench page
-	 */
-	private static IWorkbenchPage getActivePage() {
-		IWorkbenchWindow window = getActiveWorkbenchWindow();
-		if (window == null) {
-			return null;
-		}
-		return window.getActivePage();
-	}
-	/**
-	 * @param javaProject
-	 * @param parent
-	 * @return the IPath for a a classpath object (?)
-	 */
-	public static IPath getPathOnClasspath(IJavaProject javaProject,
-			Object parent) {
-		IPath result = null;
-		if (javaProject == null || parent == null) {
-			return new Path(""); //$NON-NLS-1$
-		}
-		IClasspathEntry[] entries = javaProject.readRawClasspath();
-		IPath classPath = null;
-		if (parent instanceof IResource) {
-			if (((javaProject != null) && !javaProject
-					.isOnClasspath((IResource) parent))) {
-				return new Path(""); //$NON-NLS-1$
-			}
-			if (parent instanceof IFile) {
-				IPath elementPath = ((IFile) parent).getFullPath();
-				if (((IFile) parent).getFileExtension().equalsIgnoreCase(
-						IFileFolderConstants.EXT_PROPERTIES)) {
-					int machings = 0;
-					try {
-						for (int i = 0; i < entries.length; i++) {
-							// Determine whether on this classentry's path
-							int n = entries[i].getPath().matchingFirstSegments(
-									elementPath);
-							if (n > machings) {
-								// Get package name
-								machings = n;
-								classPath = elementPath.removeFirstSegments(
-										machings).removeLastSegments(1);
-							}
-						}
-
-						// Not on the classpath?
-						if (classPath == null) {
-							return null;
-						} else if (classPath.segmentCount() > 0) {
-							IJavaElement element = javaProject
-									.findElement(classPath);
-							if (element != null) {
-								IPath path = element.getPath();
-								if (path != null) {
-									IPath path1 = path
-											.removeFirstSegments(machings);
-
-									String fileName = ((IFile) parent)
-											.getName();
-									if (fileName != null) {
-										result = path1.append(fileName);
-									}
-								}
-							}
-
-						} else {
-							result = ((IFile) parent).getFullPath()
-									.removeFirstSegments(machings);
-						}
-					} catch (Exception e) {
-						return null;
-					}
-				}
-			}
-		} else if (parent instanceof IJarEntryResource) {
-			IPath elementPath = ((IJarEntryResource) parent).getFullPath();
-			if (elementPath.getFileExtension().equalsIgnoreCase(
-					IFileFolderConstants.EXT_PROPERTIES)) {
-				result = elementPath;
-			}
-		}
-		if (result != null) {
-			return result;
-		}
-		return new Path(""); //$NON-NLS-1$
-	}
-	
-	private PathUtil()
-	{
-		// utility class, no instantiation
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/utils/PixelConverter.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/utils/PixelConverter.java
deleted file mode 100644
index 48d5b37..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/utils/PixelConverter.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Oracle -- copied into common ui codebase for JSF use
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.utils;
-
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.FontMetrics;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.widgets.Control;
-
-import org.eclipse.jface.dialogs.Dialog;
-
-/**
- * @author cbateman
- *
- */
-public class PixelConverter {
-    
-    private final FontMetrics fFontMetrics;
-    
-    /**
-     * @param control
-     */
-    public PixelConverter(Control control) {
-        this(control.getFont());
-    }
-    
-    /**
-     * @param font
-     */
-    public PixelConverter(Font font) {
-        GC gc = new GC(font.getDevice());
-        gc.setFont(font);
-        fFontMetrics= gc.getFontMetrics();
-        gc.dispose();
-    }
-    
-
-    /**
-     * @param chars
-     * @return the convert height in  pixels
-     */
-    public int convertHeightInCharsToPixels(int chars) {
-        return Dialog.convertHeightInCharsToPixels(fFontMetrics, chars);
-    }
-
-    /**
-     * @param dlus
-     * @return the pixel
-     */ 
-    public int convertHorizontalDLUsToPixels(int dlus) {
-        return Dialog.convertHorizontalDLUsToPixels(fFontMetrics, dlus);
-    }
-
-    /**
-     * @param dlus
-     * @return the vertical pixels
-     */
-    public int convertVerticalDLUsToPixels(int dlus) {
-        return Dialog.convertVerticalDLUsToPixels(fFontMetrics, dlus);
-    }
-    
-
-    /**
-     * @param chars
-     * @return the pixel value
-     */
-    public int convertWidthInCharsToPixels(int chars) {
-        return Dialog.convertWidthInCharsToPixels(fFontMetrics, chars);
-    }   
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/utils/PluginImageHelper.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/utils/PluginImageHelper.java
deleted file mode 100644
index 8ebcd03..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/utils/PluginImageHelper.java
+++ /dev/null
@@ -1,213 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.utils;
-
-import java.util.HashMap;
-
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.resource.ImageRegistry;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-
-/**
- * @author mengbo
- */
-public class PluginImageHelper {
-	private static PluginImageHelper _instance = null;
-
-	/**
-	 * Gets the instance.
-	 * 
-	 * @return Returns a TaglibPluginImageHelper
-	 */
-	public synchronized static PluginImageHelper getInstance() {
-		if (_instance == null) {
-			_instance = new PluginImageHelper();
-		}
-		return _instance;
-	}
-
-	// save a descriptor for each image
-	private HashMap _imageDescRegistry = null;
-
-	private final String PLUGIN_SEPARATOR = "^"; //$NON-NLS-1$
-
-	/**
-	 * Creates an image from the given resource and adds the image to the image
-	 * registry.
-	 * 
-	 * @param resource
-	 * @param pluginId
-	 * @return Image
-	 */
-	private Image createImage(String resource, String pluginId) {
-		ImageDescriptor desc = getImageDescriptor(resource, pluginId);
-		Image image = null;
-
-		if (desc != null) {
-			image = desc.createImage();
-
-			// dont add the missing image descriptor image to the image
-			// registry
-			if (!desc.equals(ImageDescriptor.getMissingImageDescriptor())) {
-				String thePluginId = pluginId;
-				if (thePluginId == null) {
-					return null;
-				}
-				String key = thePluginId + PLUGIN_SEPARATOR + resource;
-				getImageRegistry().put(key, image);
-			}
-		}
-		return image;
-	}
-
-	/**
-	 * Creates an image descriptor from the given imageFilePath in the given
-	 * pluginId and adds the image descriptor to the image descriptor registry.
-	 * If an image descriptor could not be created, the default "missing" image
-	 * descriptor is returned but not added to the image descriptor registry.
-	 * 
-	 * @param imageFilePath
-	 * @param pluginId
-	 *            if null, look in this plugin
-	 * @return ImageDescriptor image descriptor for imageFilePath or default
-	 *         "missing" image descriptor if resource could not be found
-	 */
-	private ImageDescriptor createImageDescriptor(String imageFilePath,
-			String pluginId) {
-		String thePluginId = pluginId;
-		if (thePluginId == null) {
-			return null;
-		}
-
-		ImageDescriptor imageDescriptor = AbstractUIPlugin
-				.imageDescriptorFromPlugin(thePluginId, imageFilePath);
-		if (imageDescriptor != null) {
-			String key = thePluginId + PLUGIN_SEPARATOR + imageFilePath;
-			getImageDescriptorRegistry().put(key, imageDescriptor);
-		} else {
-			imageDescriptor = ImageDescriptor.getMissingImageDescriptor();
-		}
-
-		return imageDescriptor;
-	}
-
-	/**
-	 * Retrieves the image associated with resource from the image registry. If
-	 * the image cannot be retrieved, attempt to find and load the image at the
-	 * location specified in resource.
-	 * 
-	 * @param resource
-	 *            the image to retrieve
-	 * @return Image the image associated with resource or null if one could not
-	 *         be found
-	 */
-	public Image getImage(String resource) {
-		return getImage(resource, null);
-	}
-
-	/**
-	 * Retrieves the image associated with resource from the image registry. If
-	 * the image cannot be retrieved, attempt to find and load the image at the
-	 * location specified in resource.
-	 * 
-	 * @param resource
-	 *            the image to retrieve
-	 * @param pluginId
-	 * @return Image the image associated with resource or null if one could not
-	 *         be found
-	 */
-	public Image getImage(String resource, String pluginId) {
-		String thePluginId = pluginId;
-		if (thePluginId == null) {
-			return null;
-		}
-
-		String key = thePluginId + PLUGIN_SEPARATOR + resource;
-
-		Image image = getImageRegistry().get(key);
-		if (image == null) {
-			// create an image
-			image = createImage(resource, pluginId);
-		}
-		return image;
-	}
-
-	/**
-	 * Retrieves the image descriptor associated with resource from the image
-	 * descriptor registry. If the image descriptor cannot be retrieved, attempt
-	 * to find and load the image descriptor at the location specified in
-	 * resource.
-	 * 
-	 * @param resource
-	 *            the image descriptor to retrieve
-	 * @return ImageDescriptor the image descriptor assocated with resource or
-	 *         the default "missing" image descriptor if one could not be found
-	 */
-	public ImageDescriptor getImageDescriptor(String resource) {
-		return getImageDescriptor(resource, null);
-	}
-
-	/**
-	 * Retrieves the image descriptor associated with resource in pluginId from
-	 * the image descriptor registry. If the image descriptor cannot be
-	 * retrieved, attempt to find and load the image descriptor at the location
-	 * specified in resource in pluginId.
-	 * 
-	 * @param resource
-	 *            the image descriptor to retrieve
-	 * @param pluginId
-	 *            the plugin the resource is located. if null, use look in this
-	 *            plugin
-	 * @return ImageDescriptor the image descriptor assocated with resource or
-	 *         the default "missing" image descriptor if one could not be found
-	 */
-	public ImageDescriptor getImageDescriptor(String resource, String pluginId) {
-		ImageDescriptor imageDescriptor = null;
-		String thePluginId = pluginId;
-		if (thePluginId == null) {
-			return null;
-		}
-
-		String key = thePluginId + PLUGIN_SEPARATOR + resource;
-		Object o = getImageDescriptorRegistry().get(key);
-		if (o == null) {
-			// create a descriptor
-			imageDescriptor = createImageDescriptor(resource, pluginId);
-		} else {
-			imageDescriptor = (ImageDescriptor) o;
-		}
-		return imageDescriptor;
-	}
-
-	/**
-	 * Returns the image descriptor registry for this plugin.
-	 * 
-	 * @return HashMap - image descriptor registry for this plugin
-	 */
-	private HashMap getImageDescriptorRegistry() {
-		if (_imageDescRegistry == null) {
-			_imageDescRegistry = new HashMap();
-		}
-		return _imageDescRegistry;
-	}
-
-	/**
-	 * Returns the image registry for this plugin.
-	 * 
-	 * @return ImageRegistry - image registry for this plugin
-	 */
-	private ImageRegistry getImageRegistry() {
-		return JFaceResources.getImageRegistry();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/utils/PropertyUtils.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/utils/PropertyUtils.java
deleted file mode 100644
index 47bded0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/utils/PropertyUtils.java
+++ /dev/null
@@ -1,789 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.utils;
-
-import java.awt.Component;
-import java.awt.Dimension;
-import java.awt.Point;
-import java.awt.Rectangle;
-import java.awt.Toolkit;
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.MissingResourceException;
-import java.util.Properties;
-import java.util.ResourceBundle;
-import java.util.StringTokenizer;
-
-import org.eclipse.jst.jsf.common.ui.JSFUICommonPlugin;
-
-/**
- * The main purpose of this class is to give better access methods for property
- * and resource bundle access.
- * 
- * @author mengbo
- */
-public final class PropertyUtils {
-
-	private static final String ENCODED_CHAR_PERCENT = "%25"; //$NON-NLS-1$
-	private static final String ENCODED_CHAR_CARRIAGE_RETURN = "%0d"; //$NON-NLS-1$
-	private static final String ENCODED_CHAR_TAB = "%09"; //$NON-NLS-1$
-	private static final String ENCODED_CHAR_NEWLINE = "%0a"; //$NON-NLS-1$
-	private static final String ENCODED_CHAR_SPACE = "%20"; //$NON-NLS-1$
-	private static final String ENCODED_CHAR_COLON = "%3a"; //$NON-NLS-1$
-	private static final String ENCODED_CHAR_EQUALS = "%3d"; //$NON-NLS-1$
-
-	
-	// WARNING: There can be NO static logging line here since the logger uses
-	// this class to figure out the preferences
-	// for the logging system. "Logging" an error here would be useless since
-	// you might be setting up the logging system
-	// via a call to PropertyUtils.getServerProperty() instead it uses
-	// "System.err.println".
-
-	// This is the name for the properties file.
-	// The prop-name will be prepended to this string....
-	private static final String NAME_PROPERTIES = ".props"; //$NON-NLS-1$
-
-	private static final String STR_BOUNDS_END = ".bounds"; // assumes the //$NON-NLS-1$
-
-	// window name or
-	// name list is
-	// prepended
-
-	// //////////////////////////////////////////////////////////////////////////
-	// Property get methods.
-	// //////////////////////////////////////////////////////////////////////////
-	/**
-	 * @param props
-	 * @param key
-	 * @param theDefault
-	 * @return the property
-	 */
-	public static String getProperty(Properties props, String key,
-			String theDefault) {
-		try {
-			String value = props.getProperty(key, theDefault);
-			if ((value != null) && (value.length() == 0)) {
-				value = null;
-			}
-			// check again for null, since some versions of the jdk ignore the
-			// default
-			// if an empty property exists.
-			if (value == null) {
-				value = theDefault;
-			}
-			return value;
-		} catch (Exception ee) {
-			return theDefault;
-		}
-	}
-
-	/**
-	 * @param props
-	 * @param key
-	 * @return the value for key in props, may return null
-	 */
-	public static String getProperty(Properties props, String key) {
-		try {
-			String value = props.getProperty(key);
-			if ((value != null) && (value.length() == 0)) {
-				value = null;
-			}
-			return value;
-		} catch (Exception ee) {
-			return null;
-		}
-	}
-
-	/**
-	 * @param props
-	 * @param key
-	 * @param defaultValue
-	 * @param minimumValue
-	 * @return the integer property value for key, or defaultValue
-	 * if none.  Enforces minimumValue in all cases
-	 */
-	public static int getPropertyValue(Properties props, String key,
-			int defaultValue, int minimumValue) {
-		int theValue = getPropertyValue(props, key, defaultValue);
-
-		if (theValue < minimumValue) {
-			theValue = minimumValue;
-		}
-		return theValue;
-	}
-
-	/**
-	 * @param props
-	 * @param key
-	 * @param defaultValue
-	 * @return the integer value for key in props or defaultValue if none
-	 */
-	public static int getPropertyValue(Properties props, String key,
-			int defaultValue) {
-		String stringValue = getProperty(props, key);
-		if (stringValue != null) {
-			try {
-				return Integer.parseInt(stringValue);
-			} catch (NumberFormatException ee)// NOPMD
-			{
-				// the property value maybe an invalid value, the editor should
-				// show these to user.
-			}
-		}
-		return defaultValue;
-	}
-
-	/**
-	 * @param props
-	 * @param key
-	 * @param defaultValue
-	 * @return the long value for key props or defaultValue if none
-	 */
-	public static long getPropertyLongValue(Properties props, String key,
-			long defaultValue) {
-		String stringValue = getProperty(props, key);
-		if (stringValue != null) {
-			try {
-				return Long.parseLong(stringValue);
-			} catch (NumberFormatException ee)// NOPMD
-			{
-				// the property value maybe an invalid value, the editor should
-				// show these to user.
-			}
-		}
-		return defaultValue;
-	}
-
-	/**
-	 * @param props
-	 * @param key
-	 * @param bDefault
-	 * @return true if props has a value for key
-	 */
-	public static boolean isProperty(Properties props, String key,
-			boolean bDefault) {
-		return getProperty(props, key, "" + bDefault).equals("" + true); //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * @param props
-	 * @param key
-	 * @return the string values in props for key tokenized from
-	 * a comma-separated string
-	 */
-	public static String[] getPropertyStrings(Properties props, String key) {
-		String tokenString = getProperty(props, key);
-
-		if (tokenString == null) {
-			return new String[0];
-		}
-        StringTokenizer tokenizer = new StringTokenizer(tokenString, ","); //$NON-NLS-1$
-        String[] pNames = new String[tokenizer.countTokens()];
-
-        for (int ii = 0; ii < pNames.length; ii++) {
-        	pNames[ii] = ((String) tokenizer.nextElement()).trim();
-        }
-        return pNames;
-	}
-
-	// //////////////////////////////////////////////////////////////////////////
-	// Resource bundle get methods.
-	// //////////////////////////////////////////////////////////////////////////
-	/**
-	 * @param bundle
-	 * @param key
-	 * @param theDefault
-	 * @return the string value from bundle for key or default if none
-	 */
-	public static String getResourceProperty(ResourceBundle bundle, String key,
-			String theDefault) {
-		try {
-			String value = bundle.getString(key);
-			if ((value == null) || (value.length() == 0)) {
-				value = theDefault;
-			}
-			return value;
-		} 
-		catch(NullPointerException npe)
-		{
-			return theDefault;
-		}
-		catch (MissingResourceException mre)
-		{
-			return theDefault;
-		}
-		catch (ClassCastException cce)
-		{
-			return theDefault;
-		}
-	}
-
-	/**
-	 * @param bundle
-	 * @param key
-	 * @return the value for key in bundle or null if none
-	 */
-	public static String getResourceProperty(ResourceBundle bundle, String key) {
-		try 
-		{
-			String value = bundle.getString(key);
-			if ((value != null) && (value.length() == 0)) 
-			{
-				value = null;
-			}
-				return value;
-		}
-		catch(NullPointerException npe)
-		{
-			return null;
-		}
-		catch (MissingResourceException mre)
-		{
-			return null;
-		}
-		catch (ClassCastException cce)
-		{
-			return null;
-		}
-	}
-
-	/**
-	 * @param bundle
-	 * @param key
-	 * @param defaultValue
-	 * @param minimumValue
-	 * @return the integer value for key in bundle or defaultValue if none
-	 * Enforces minimum value in all cases
-	 */
-	public static int getResourcePropertyValue(ResourceBundle bundle,
-			String key, int defaultValue, int minimumValue) {
-		int theValue = getResourcePropertyValue(bundle, key, defaultValue);
-
-		if (theValue < minimumValue) {
-			theValue = minimumValue;
-		}
-		return theValue;
-	}
-
-	/**
-	 * @param bundle
-	 * @param key
-	 * @param defaultValue
-	 * @return the integer value for key in bundle or defaultValue if  none
-	 */
-	public static int getResourcePropertyValue(ResourceBundle bundle,
-			String key, int defaultValue) {
-		String stringValue = getResourceProperty(bundle, key);
-		if (stringValue != null) {
-			try {
-				return Integer.parseInt(stringValue);
-			} catch (NumberFormatException ee)// NOPMD
-			{
-				// the property value maybe an invalid value, the editor should
-				// show these to user.
-			}
-		}
-		return defaultValue;
-	}
-
-	/**
-	 * @param bundle
-	 * @param key
-	 * @param defaultValue
-	 * @return the long value for key in bundle or default value if none
-	 */
-	public static long getResourcePropertyLongValue(ResourceBundle bundle,
-			String key, long defaultValue) {
-		String stringValue = getResourceProperty(bundle, key);
-		if (stringValue != null) {
-			try {
-				return Long.parseLong(stringValue);
-			} catch (NumberFormatException ee)// NOPMD
-			{
-				// the property value maybe an invalid value, the editor should
-				// show these to user.
-			}
-		}
-		return defaultValue;
-	}
-
-	/**
-	 * @param bundle
-	 * @param key
-	 * @param bDefault
-	 * @return true if bundle has a value for key
-	 */
-	public static boolean isResourceProperty(ResourceBundle bundle, String key,
-			boolean bDefault) {
-		return getResourceProperty(bundle, key, "" + bDefault) //$NON-NLS-1$
-				.equals("" + true); //$NON-NLS-1$
-	}
-
-	// ///////////////////////////////////////////////////////////////////////
-	// Property misc routines
-	// ///////////////////////////////////////////////////////////////////////
-	/**
-	 * @param theName
-	 * @return the encoded name
-	 */
-	public static String encodeName(String theName) {
-		int theSize = theName.length();
-		StringBuffer encoded = new StringBuffer(theSize);
-		char ch;
-
-		for (int ii = 0; ii < theSize; ii++) {
-			ch = theName.charAt(ii);
-			switch (ch) {
-			// these are the set of illegal characters in a Property name
-			case '=': // %3d
-				encoded.append(ENCODED_CHAR_EQUALS);
-				break;
-			case ':': // %3a
-				encoded.append(ENCODED_CHAR_COLON);
-				break;
-			case ' ': // %20
-				encoded.append(ENCODED_CHAR_SPACE);
-				break;
-			case '\n': // %0a
-				encoded.append(ENCODED_CHAR_NEWLINE);
-				break;
-			case '\t': // %09
-				encoded.append(ENCODED_CHAR_TAB);
-				break;
-			case '\r': // %0d
-				encoded.append(ENCODED_CHAR_CARRIAGE_RETURN);
-				break;
-			case '%': // %25
-				// added because its our encoding flag
-				encoded.append(ENCODED_CHAR_PERCENT);
-				break;
-			default:
-				encoded.append(ch);
-				break;
-			}
-		}
-
-		return encoded.toString();
-	}
-
-	/**
-	 * @param theName
-	 * @return the decoded name
-	 */
-	public static String decodeName(String theName) {
-		int theSize = theName.length();
-		int kk;
-		StringBuffer decoded = new StringBuffer(theSize);
-		char ch;
-
-		for (int ii = 0; ii < theSize; ii++) {
-			ch = theName.charAt(ii);
-			if (ch == '%') {
-				ch = theName.charAt(++ii);
-				kk = Character.digit(ch, 16);
-				kk *= 16;
-				ch = theName.charAt(++ii);
-				kk += Character.digit(ch, 16);
-				decoded.append((char) kk);
-			} else {
-				decoded.append(ch);
-			}
-		}
-
-		return decoded.toString();
-	}
-
-	/**
-	 * @param propName
-	 * @return the properties
-	 * @throws IOException
-	 * @throws FileNotFoundException
-	 */
-	public static Properties openProperties(String propName)
-			throws IOException, FileNotFoundException {
-		return openProperties(propName, null, true);
-	}
-
-	/**
-	 * @param propName
-	 * @param propDefaults
-	 * @return the properties
-	 * @throws IOException
-	 * @throws FileNotFoundException
-	 */
-	public static Properties openProperties(String propName,
-			Properties propDefaults) throws IOException, FileNotFoundException {
-		return openProperties(propName, propDefaults, true);
-	}
-
-	/**
-	 * @param propName
-	 * @param propDefaults
-	 * @param bCreatePropertiesPathname
-	 * @return the properties
-	 * @throws IOException
-	 * @throws FileNotFoundException
-	 */
-	public static Properties openProperties(String propName,
-			Properties propDefaults, boolean bCreatePropertiesPathname)
-			throws IOException, FileNotFoundException {
-		Properties theProperties = new Properties(propDefaults);
-
-		try {
-			String propertiesFilename = bCreatePropertiesPathname ? getPropertiesPathname(propName)
-					: propName;
-			InputStream theStream = new FileInputStream(propertiesFilename);
-			theProperties.load(theStream);
-			theStream.close();
-		} catch (FileNotFoundException ee) {
-			if (propDefaults == null) {
-				throw ee;
-			}
-		} catch (IOException ee) {
-			if (propDefaults == null) {
-				throw ee;
-			}
-		}
-
-		return theProperties;
-	}
-
-	/**
-	 * Combines two properties objects, with the second one as the default
-	 * properties
-	 * 
-	 * @param localProperties
-	 * @param defaultProperties
-	 * @return the combined properties
-	 * @throws IOException
-	 */
-	public static Properties combineProperties(Properties localProperties,
-			Properties defaultProperties) throws IOException {
-		Properties theNewProperties = new Properties();
-
-		ByteArrayOutputStream os = new ByteArrayOutputStream();
-		defaultProperties.store(os, ""); //$NON-NLS-1$
-		localProperties.store(os, ""); //$NON-NLS-1$
-		byte[] theData = os.toByteArray();
-		ByteArrayInputStream is = new ByteArrayInputStream(theData);
-		theNewProperties.load(is);
-
-		return theNewProperties;
-	}
-
-	/**
-	 * @param theFilename
-	 * @return the encoded file name
-	 */ 
-	public static String encodeFilename(String theFilename) {
-		// make theFilename legal on the local system....
-		String theSeparator = System.getProperty("file.separator"); //$NON-NLS-1$
-		// replace all occurrances of the file separator with a ' '
-		for (int ii = 0; ii < theSeparator.length(); ii++) {
-			char theChar = theSeparator.charAt(ii);
-			theFilename = theFilename.replace(theChar, ' ');
-		}
-
-		return theFilename;
-	}
-
-	/**
-	 * @param baseName
-	 * @return the properties path
-	 */
-	public static String getPropertiesPathname(String baseName) {
-		if (baseName.endsWith(NAME_PROPERTIES)) {
-			return System.getProperty("user.dir") //$NON-NLS-1$
-					+ System.getProperty("file.separator") //$NON-NLS-1$
-					+ encodeFilename(baseName);
-		}
-        return System.getProperty("user.dir") //$NON-NLS-1$
-        		+ System.getProperty("file.separator") //$NON-NLS-1$
-        		+ encodeFilename(baseName) + NAME_PROPERTIES;
-	}
-
-	// /////////////////////////////////////////////////////////////////////////
-	// These are generic routines that are used to get/set/save window bounds
-
-	private static final int INSET = 40;
-
-	/**
-	 * Set the initial bounds (size & location) of a component. This will get
-	 * the location from the preferences file based on the values of the "names"
-	 * parameter. These values will be encoded to make a legal properties name,
-	 * joined togther with ".", and the value STR_BOUNDS_END will be appended.
-	 * The resulting name will be used to obtain the intial bounds value from
-	 * the properties file, which will be decoded and the specified component
-	 * will then be set to that value.
-	 * @param props 
-	 * @param theComponent 
-	 * @param names 
-	 * @param defaultValue 
-	 */
-	public static void setComponentBounds(Properties props,
-			Component theComponent, String names[], String defaultValue) {
-		setComponentBounds(props, theComponent, names, defaultValue, false);
-	}
-
-	/**
-	 * @param props
-	 * @param theComponent
-	 * @param names
-	 * @param defaultValue
-	 * @param bEnsureDesktopVisibility
-	 */
-	public static void setComponentBounds(Properties props,
-			Component theComponent, String names[], String defaultValue,
-			boolean bEnsureDesktopVisibility) {
-		String tmpString = getComponentPropertyName(names, STR_BOUNDS_END);
-		setComponentBounds(props, theComponent, tmpString, defaultValue,
-				bEnsureDesktopVisibility);
-	}
-
-	/**
-	 * @param props
-	 * @param theComponent
-	 * @param thePropertyName
-	 * @param defaultValue
-	 */
-	public static void setComponentBounds(Properties props,
-			Component theComponent, String thePropertyName, String defaultValue) {
-		setComponentBounds(props, theComponent, thePropertyName, defaultValue,
-				false);
-	}
-
-	/**
-	 * @param props
-	 * @param theComponent
-	 * @param thePropertyName
-	 * @param defaultValue
-	 * @param bEnsureDesktopVisibility
-	 */
-	public static void setComponentBounds(Properties props,
-			Component theComponent, String thePropertyName,
-			String defaultValue, boolean bEnsureDesktopVisibility) {
-		String tmpString = props.getProperty(thePropertyName, defaultValue);
-		Rectangle theValue = decodeBounds(tmpString);
-		theComponent.setBounds(theValue);
-		if (bEnsureDesktopVisibility) {
-			// make sure that this component is visible on the desktop...
-			// verify that this window is visible...
-			Point theLoc = theComponent.getLocation();
-			// get width/height of desktop....
-			Dimension portSize = new Dimension(Toolkit.getDefaultToolkit()
-					.getScreenSize());
-			if (theLoc.x > portSize.width) // move it to top
-				theLoc.x = INSET;
-			if (theLoc.y > portSize.height) // move it to left
-				theLoc.y = INSET;
-			theComponent.setLocation(theLoc);
-		}
-	}
-
-	/**
-	 * @param props
-	 * @param theComponent
-	 * @param names
-	 */
-	public static void saveComponentBounds(Properties props,
-			Component theComponent, String names[]) {
-		String tmpString = getComponentPropertyName(names, STR_BOUNDS_END);
-		saveComponentBounds(props, theComponent, tmpString);
-	}
-
-	/**
-	 * @param props
-	 * @param theComponent
-	 * @param thePropertyName
-	 */
-	public static void saveComponentBounds(Properties props,
-			Component theComponent, String thePropertyName) {
-		Rectangle theBounds = theComponent.getBounds();
-		String theValue = encodeBounds(theBounds);
-		props.put(thePropertyName, theValue);
-	}
-
-	/**
-	 * @param names
-	 * @param subsystemName
-	 * @return the component property name or ""
-	 */
-	public static String getComponentPropertyName(String names[],
-			String subsystemName) {
-		String tmpString = ""; //$NON-NLS-1$
-
-		for (int ii = 0; ii < names.length; ii++) {
-			tmpString = tmpString + (ii > 0 ? "." : "") //$NON-NLS-1$ //$NON-NLS-2$
-					+ PropertyUtils.encodeName(names[ii]);
-		}
-		if (subsystemName.startsWith(".") == false) //$NON-NLS-1$
-			tmpString += "."; //$NON-NLS-1$
-		tmpString = tmpString + subsystemName;
-		return tmpString;
-	}
-
-	/**
-	 * Decode the comma separated values stored in sBounds. This method is
-	 * normally called to decode the location/size of a component which has been
-	 * saved into a Properties object. See encodeBounds(); Order of items in the
-	 * string is (x, y, w, h)
-	 * @param sBounds 
-	 * @return the rectangle
-	 */
-	public static Rectangle decodeBounds(String sBounds) {
-		int index;
-		int ii;
-		int theValue[] = new int[4];
-		String tmpString;
-		String restString = sBounds;
-
-		for (ii = 0; ii < 4; ii++) {
-			theValue[ii] = 0;
-		}
-		try {
-			for (ii = 0; ii < 4; ii++) {
-				index = restString.indexOf(","); //$NON-NLS-1$
-				if (index > 0) {
-					tmpString = restString.substring(0, index);
-					restString = restString.substring(index + 1);
-				} else {
-					tmpString = restString; // should only happen on the last
-					// one....
-					restString = null; // will cause an exception if not last
-					// one...
-				}
-				theValue[ii] = Integer.valueOf(tmpString).intValue();
-			}
-		} catch (Exception ee)// NOPMD
-		{
-			// the property value maybe an invalid value, the editor should show
-			// these to user.
-		}
-
-		return new Rectangle(theValue[0], theValue[1], theValue[2], theValue[3]);
-	}
-
-	/**
-	 * * Encode the bounds of a component into a comma separated list * that is
-	 * appropriate for storing in a Properties object. * See decodeBounds();
-	 * @param rBounds 
-	 * @return the encoded bounds
-	 */
-	public static String encodeBounds(Rectangle rBounds) {
-		return "" + rBounds.x + "," + rBounds.y + "," + rBounds.width + "," //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
-				+ rBounds.height;
-	}
-
-	/**
-	 * Methods for creating Properties objects from strings.
-	 * 
-	 * Then "Encoded" versions are used on values that are stored into a
-	 * properties file (think of them as sub-properties). They do the encoding
-	 * necessary to turn a properties object into a string that has legal
-	 * "value" syntax (they actually do more than they need to, but its all
-	 * non-destructive).
-	 * @param thePropertyString 
-	 * @return the properties from the string
-	 * @throws IOException 
-	 */
-	public static Properties getPropertiesFromString(String thePropertyString)
-			throws IOException {
-		if (thePropertyString == null)
-			return null;
-		ByteArrayInputStream in = new ByteArrayInputStream(thePropertyString
-				.getBytes());
-
-		Properties props = new Properties();
-		props.load(in); // throws IOException
-		in = null;
-		return props;
-	}
-
-	/**
-	 * @param theEncodedPropertyString
-	 * @return the properties
-	 * @throws IOException
-	 */
-	public static Properties getPropertiesFromEncodedString(
-			String theEncodedPropertyString) throws IOException {
-		if (theEncodedPropertyString == null)
-			return null;
-		return (getPropertiesFromString(decodeName(theEncodedPropertyString)));
-	}
-
-	/**
-	 * @param theEncodedPropertyString
-	 * @return the properties
-	 */
-	public static Properties encodedStringToProperties(
-			String theEncodedPropertyString) {
-		try {
-			return getPropertiesFromEncodedString(theEncodedPropertyString);
-		} catch (IOException ee) {
-			return null;
-		}
-	}
-
-	/**
-	 * @param props
-	 * @param comment
-	 * @return the string
-	 * @throws IOException
-	 */
-	public static String savePropertiesToString(Properties props, String comment)
-			throws IOException {
-		if (props == null)
-			return null;
-		ByteArrayOutputStream out = new ByteArrayOutputStream();
-		props.store(out, comment);
-		String tmpString = out.toString();
-		out = null;
-		return tmpString;
-	}
-
-	/**
-	 * @param props
-	 * @param comment
-	 * @return the encoded string
-	 * @throws IOException
-	 */
-	public static String savePropertiesToEncodedString(Properties props,
-			String comment) throws IOException {
-		if (props == null)
-			return null;
-		return encodeName(savePropertiesToString(props, comment));
-	}
-
-	/**
-	 * @param props
-	 * @return the encoded string
-	 */
-	public static String propertiesToEncodedString(Properties props) {
-		try {
-			return savePropertiesToEncodedString(props, ""); //$NON-NLS-1$
-		} catch (IOException ee)// NOPMD
-		{
-            JSFUICommonPlugin.getLogger(PropertyUtils.class).error("saving properties", ee); //$NON-NLS-1$
-		}
-		return null;
-	}
-	
-	private PropertyUtils()
-	{
-		// no instantiation
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/utils/ResourceUtils.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/utils/ResourceUtils.java
deleted file mode 100644
index e35ee83..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/utils/ResourceUtils.java
+++ /dev/null
@@ -1,286 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.utils;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.text.MessageFormat;
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-import org.eclipse.jst.jsf.common.ui.JSFUICommonPlugin;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-
-/**
- * Give easy access to a resource bundle.
- * 
- * @author mengbo
- */
-public abstract class ResourceUtils {
-	private static final String LOG_RESOURCE_UTILS_MSG_KEY = "log.ResourceUtils"; //$NON-NLS-1$
-	private static Logger _log = JSFUICommonPlugin.getLogger(ResourceUtils.class);
-	/**
-	 * the resource bundle accessible by all children
-	 */
-	protected ResourceBundle _resources;
-
-	/**
-	 * Empty Constructor.
-	 */
-	protected ResourceUtils() {
-        // restrict instantiation
-	}
-
-	/**
-	 * Easy way to set the bundle and get a fatal log messages and an alert if
-	 * the resource bundle is not found.
-	 * 
-	 * @param resource
-	 * @param bundleLocation
-	 */
-	protected void setBundle(ResourceBundle resource, String bundleLocation) {
-		_resources = resource;
-		if (_resources == null) {
-			// log.ResourceUtils=Missing Resource Bundle "{0}".
-			_log.error(LOG_RESOURCE_UTILS_MSG_KEY, bundleLocation);
-			// pluginName=Web Application Development Common
-			JSFUICommonPlugin.getAlerts().error("pluginName", LOG_RESOURCE_UTILS_MSG_KEY, //$NON-NLS-1$
-					bundleLocation);
-		}
-	}
-
-	/**
-	 * Get the property defined in the resource bundle for the given key. This
-	 * property should be an integer. If none is defined
-	 * (MissingResourceException), return the default.
-	 * 
-	 * @param key
-	 *            the key in the resource bundle.
-	 * @param defaultValue
-	 *            default int to return if no value is found for the key.
-	 * @return the integer value for key or defaultValue if none
-	 */
-	public int getValue(String key, int defaultValue) {
-		String stringValue = getString(key);
-		if (stringValue != null) {
-			try {
-				return Integer.parseInt(stringValue);
-			} catch (NumberFormatException ee)// NOPMD
-			{
-				// the property value maybe an invalid value, the editor should
-				// show these to user.
-			}
-		}
-		return defaultValue;
-	}
-
-	/**
-	 * Get the property defined in the resource bundle for the given key. This
-	 * property should be an long. If none is defined
-	 * (MissingResourceException), return the default.
-	 * 
-	 * @param key
-	 *            the key in the resource bundle.
-	 * @param defaultValue
-	 *            default long to return if no value is found for the key.
-	 * @return the long value for key or defaultValue if none
-	 */
-	public long getValue(String key, long defaultValue) {
-		String stringValue = getString(key);
-		if (stringValue != null) {
-			try {
-				return Long.parseLong(stringValue);
-			} catch (NumberFormatException ee)// NOPMD
-			{
-				// the property value maybe an invalid value, the editor should
-				// show these to user.
-			}
-		}
-		return defaultValue;
-	}
-
-	/**
-	 * Get the property defined in the resource bundle for the given key. This
-	 * property should be boolean ("true" of "false"). If none is defined
-	 * (MissingResourceException), return the default.
-	 * 
-	 * @param key
-	 *            the key in the resource bundle.
-	 * @return true if there is a resource corresponding to key
-	 */
-	public boolean isResource(String key) {
-		return getString(key).equals("" + true); //$NON-NLS-1$
-	}
-
-	/**
-	 * Get the property defined in the resource bundle for the given key. If
-	 * none is defined (MissingResourceException), return null.
-	 * 
-	 * @param key
-	 *            the key in the resource bundle.
-	 * @return the string value for key or key if not found
-	 */
-	public String getString(String key) {
-		try {
-			return _resources.getString(key);
-		} catch (MissingResourceException ee) {
-			return key;
-		}
-	}
-
-	/**
-	 * Build a formated string from the resource bundle.
-	 * 
-	 * @param key
-	 *            the key into the resource bundle that has the formated string.
-	 * @param arg0
-	 *            the first argument.
-	 * @return the formated string with the argument inline.
-	 */
-	public String getString(String key, Object arg0) {
-		Object[] args = new Object[1];
-		args[0] = arg0;
-
-		MessageFormat formatter = new MessageFormat(getString(key));
-		return formatter.format(args);
-	}
-
-	/**
-	 * Build a formated string from the resource bundle.
-	 * 
-	 * @param key
-	 *            the key into the resource bundle that has the formated string.
-	 * @param arg0
-	 *            the first argument.
-	 * @param arg1
-	 *            the second argument.
-	 * @return the formated string with the argument inline.
-	 */
-	public String getString(String key, Object arg0, Object arg1) {
-		Object[] args = new Object[2];
-		args[0] = arg0;
-		args[1] = arg1;
-
-		MessageFormat formatter = new MessageFormat(getString(key));
-		return formatter.format(args);
-	}
-
-	/**
-	 * Build a formated string from the resource bundle.
-	 * 
-	 * @param key
-	 *            the key into the resource bundle that has the formated string.
-	 * @param arg0
-	 *            the first argument.
-	 * @param arg1
-	 *            the second argument.
-	 * @param arg2
-	 *            the third argument.
-	 * @return the formated string with the argument inline.
-	 */
-	public String getString(String key, Object arg0, Object arg1, Object arg2) {
-		Object[] args = new Object[3];
-		args[0] = arg0;
-		args[1] = arg1;
-		args[2] = arg2;
-
-		MessageFormat formatter = new MessageFormat(getString(key));
-		return formatter.format(args);
-	}
-
-	/**
-	 * Build a formated string from the resource bundle.
-	 * 
-	 * @param key
-	 *            the key into the resource bundle that has the formated string.
-	 * @param arg0
-	 *            the first argument.
-	 * @param arg1
-	 *            the second argument.
-	 * @param arg2
-	 *            the third argument.
-	 * @param arg3
-	 *            the forth argument.
-	 * @return the formated string with the argument inline.
-	 */
-	public String getString(String key, Object arg0, Object arg1, Object arg2,
-			Object arg3) {
-		Object[] args = new Object[4];
-		args[0] = arg0;
-		args[1] = arg1;
-		args[2] = arg2;
-		args[3] = arg3;
-
-		MessageFormat formatter = new MessageFormat(getString(key));
-		return formatter.format(args);
-	}
-
-	/**
-	 * Build a formated string from the resource bundle.
-	 * 
-	 * @param key
-	 *            the key into the resource bundle that has the formated string.
-	 * @param arg0
-	 *            the first argument.
-	 * @param arg1
-	 *            the second argument.
-	 * @param arg2
-	 *            the third argument.
-	 * @param arg3
-	 *            the forth argument.
-	 * @param arg4
-	 *            the forth argument.
-	 * @return the formated string with the argument inline.
-	 */
-	public String getString(String key, Object arg0, Object arg1, Object arg2,
-			Object arg3, Object arg4) {
-		Object[] args = new Object[5];
-		args[0] = arg0;
-		args[1] = arg1;
-		args[2] = arg2;
-		args[3] = arg3;
-		args[4] = arg4;
-
-		MessageFormat formatter = new MessageFormat(getString(key));
-		return formatter.format(args);
-	}
-
-	/**
-	 * Build a formated string from the resource bundle.
-	 * 
-	 * @param key
-	 *            the key into the resource bundle that has the formated string.
-	 * @param args
-	 *            an array of arguments
-	 * @return the formated string with the argument inline.
-	 */
-	public String getString(String key, Object[] args) {
-		MessageFormat formatter = new MessageFormat(getString(key));
-		return formatter.format(args);
-	}
-
-	/**
-	 * Use in the try-finally idiom for inputStream to ensure close
-	 * and suppress exceptions on close
-	 * @param inputStream
-	 */
-	public static void ensureClosed(InputStream inputStream) {
-		if (inputStream != null) {
-			try {
-				inputStream.close();
-			} catch (IOException e) {
-				// Ignore
-			}
-		}
-
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/utils/StringUtil.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/utils/StringUtil.java
deleted file mode 100644
index e914b60..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/utils/StringUtil.java
+++ /dev/null
@@ -1,157 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.utils;
-
-import java.util.regex.Pattern;
-
-/**
- * This is tool class for String processing.
- * 
- * @author mengbo
- */
-public class StringUtil {
-    
-    // pattern to find all end-of-paragraph and end-of-line html tags
-    // so they can be converted to newlines
-    final private static Pattern htmlToNewline = Pattern.compile("</p>|<br>"); //$NON-NLS-1$
-    
-    // pattern to strip all <x> and </x> HTML tags
-    final private static Pattern removeHTMLTags = Pattern.compile("<[/?\\w\\s=\"\\.\\#]+>"); //$NON-NLS-1$
-    
-    // pattern to find all runs of spaces longer than one
-    final private static Pattern trimInteriorWhitespace = Pattern.compile("[ ]+"); //$NON-NLS-1$
-    
-	/**
-	 * Split a java variable name into words For example, "_aJavaVariable" will
-	 * split to "A Java Variable", "_aWTPPackageImplementation" will be "A WTP
-	 * Package Implementation"
-	 * 
-	 * @param variable
-	 * @return String
-	 */
-	public static String splitVariable(String variable) {
-		StringBuffer output = new StringBuffer(""); //$NON-NLS-1$
-		boolean isCapitalLeading = false;
-		boolean isLastSpace = false;
-
-		for (int i = 0, n = variable.length(); i < n; i++) {
-			char letter = variable.charAt(i);
-
-			if (letter == '_' || letter == '$') {
-				output.append(" "); //$NON-NLS-1$
-				isCapitalLeading = false;
-				isLastSpace = true;
-				continue;
-			}
-
-			if (Character.isLowerCase(letter)) {
-				int nextIndex = i + 1;
-				if (nextIndex < n) {
-					char nextLetter = variable.charAt(nextIndex);
-					if (Character.isUpperCase(nextLetter)) {
-						if (isCapitalLeading) {
-							output.append(letter);
-							isLastSpace = false;
-						} else {
-							output.append(Character.toUpperCase(letter));
-							isLastSpace = false;
-						}
-						if (!isLastSpace) {
-							output.append(' ');
-							isLastSpace = true;
-						}
-						isCapitalLeading = false;
-						continue;
-					}
-				}
-			}
-			if (Character.isUpperCase(letter)) {
-				int nextIndex = i + 1;
-				if (nextIndex < n) {
-					char nextLetter = variable.charAt(nextIndex);
-					if (Character.isLowerCase(nextLetter)) {
-						if (!isLastSpace) {
-							output.append(' ');
-							isLastSpace = true;
-						}
-						output.append(letter);
-						isCapitalLeading = true;
-						isLastSpace = false;
-						continue;
-					}
-				}
-			}
-			if (isCapitalLeading) {
-				output.append(letter);
-				isLastSpace = false;
-			} else {
-				output.append(Character.toUpperCase(letter));
-				isCapitalLeading = true;
-				isLastSpace = false;
-			}
-		}
-
-		return output.toString().trim();
-	}
-
-	/**
-	 * @param str1
-	 * @param str2
-	 * @return boolean
-	 * 
-	 * Check if two strings match or not if str1=null and str2=null, it will
-	 * return true
-	 */
-	public static boolean isSameString(String str1, String str2) {
-		if (str1 == null) {
-			return str2 == null;
-		}
-        return str1.equals(str2);
-	}
-
-	/**
-	 * 
-	 * @param text
-	 * @return String Filter and convert a string, or normalize a string For
-	 *         example,
-	 *         <p>
-	 *         test
-	 *         </p>
-	 *         test1<a/> will be converted to: test\ntest1
-	 * 
-	 */
-	public static String filterConvertString(String text) {
-		if (text == null) {
-			return ""; //$NON-NLS-1$
-		}
-        
-		String result = htmlToNewline.matcher(text).replaceAll("\n");  //$NON-NLS-1$
-        result = removeHTMLTags.matcher(result).replaceAll(""); //$NON-NLS-1$
-        result = trimInteriorWhitespace.matcher(result).replaceAll(" "); //$NON-NLS-1$
-
-		return result;
-	}
-
-	/**
-	 * Determine whether a string is empty or not Example: null string -> return
-	 * true; Example: "" string -> return true; Otherwise, will return false;
-	 * @param str 
-	 * 
-	 * @return true if str is null or empty
-	 */
-	public static boolean isEmptyString(String str) {
-		if (str == null || str.length() == 0) {
-			return true;
-		}
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/utils/StyleCombo.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/utils/StyleCombo.java
deleted file mode 100644
index 4eccfa6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/utils/StyleCombo.java
+++ /dev/null
@@ -1,1877 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.utils;
-
-import java.util.Arrays;
-
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.accessibility.ACC;
-import org.eclipse.swt.accessibility.AccessibleAdapter;
-import org.eclipse.swt.accessibility.AccessibleControlAdapter;
-import org.eclipse.swt.accessibility.AccessibleControlEvent;
-import org.eclipse.swt.accessibility.AccessibleEvent;
-import org.eclipse.swt.accessibility.AccessibleTextAdapter;
-import org.eclipse.swt.accessibility.AccessibleTextEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Layout;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.swt.widgets.TableItem;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.swt.widgets.TypedListener;
-
-/**
- * The CCombo class represents a selectable user interface object that combines
- * a text field and a list and issues notification when an item is selected from
- * the list.
- * <p>
- * Note that although this class is a subclass of <code>Composite</code>, it
- * does not make sense to add children to it, or set a layout on it.
- * </p>
- * <dl>
- * <dt><b>Styles:</b>
- * <dd>BORDER, READ_ONLY, FLAT</dd>
- * <dt><b>Events:</b>
- * <dd>Selection</dd>
- * </dl>
- */
-public final class StyleCombo extends Composite {
-
-	Text text;
-
-	Table table;
-
-	int visibleItemCount = 4;
-
-	Shell popup;
-
-	Button arrow;
-
-	boolean hasFocus;
-
-	Listener listener, filter;
-
-	Color foreground, background;
-
-	Font font;
-
-	String defaultValue;
-
-	/**
-	 * Constructs a new instance of this class given its parent and a style
-	 * value describing its behavior and appearance.
-	 * <p>
-	 * The style value is either one of the style constants defined in class
-	 * <code>SWT</code> which is applicable to instances of this class, or
-	 * must be built by <em>bitwise OR</em>'ing together (that is, using the
-	 * <code>int</code> "|" operator) two or more of those <code>SWT</code>
-	 * style constants. The class description lists the style constants that are
-	 * applicable to the class. Style bits are also inherited from superclasses.
-	 * </p>
-	 * 
-	 * @param parent
-	 *            a widget which will be the parent of the new instance (cannot
-	 *            be null)
-	 * @param style
-	 *            the style of widget to construct
-	 * 
-	 * @exception IllegalArgumentException
-	 *                <ul>
-	 *                <li>ERROR_NULL_ARGUMENT - if the parent is null</li>
-	 *                </ul>
-	 * @exception org.eclipse.swt.SWTException
-	 *                <ul>
-	 *                <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
-	 *                thread that created the parent</li>
-	 *                </ul>
-	 * 
-	 * @see SWT#BORDER
-	 * @see SWT#READ_ONLY
-	 * @see SWT#FLAT
-	 */
-	public StyleCombo(Composite parent, int style) {
-		super(parent, style = checkStyle(style));
-
-		listener = new Listener() {
-			public void handleEvent(Event event) {
-				if (popup == event.widget) {
-					popupEvent(event);
-					return;
-				}
-				if (text == event.widget) {
-					textEvent(event);
-					return;
-				}
-				if (table == event.widget) {
-					tableEvent(event);
-					return;
-				}
-				if (arrow == event.widget) {
-					arrowEvent(event);
-					return;
-				}
-				if (StyleCombo.this == event.widget) {
-					comboEvent(event);
-					return;
-				}
-				if (getShell() == event.widget) {
-					handleFocus(SWT.FocusOut);
-				}
-			}
-		};
-
-		filter = new Listener() {
-			public void handleEvent(Event event) {
-				Shell shell = ((Control) event.widget).getShell();
-				if (shell == StyleCombo.this.getShell()) {
-					handleFocus(SWT.FocusOut);
-				}
-			}
-		};
-
-		int[] comboEvents = { SWT.Dispose, SWT.Move, SWT.Resize };
-		for (int i = 0; i < comboEvents.length; i++)
-			this.addListener(comboEvents[i], listener);
-
-		createText(style);
-		createArrow(style);
-
-		createPopup(null, -1);
-		initAccessible();
-	}
-
-	/**
-	 * @param style
-	 */
-	private void createArrow(int style) {
-		int arrowStyle = SWT.ARROW | SWT.DOWN;
-		if ((style & SWT.FLAT) != 0) {
-			arrowStyle |= SWT.FLAT;
-		}
-		arrow = new Button(this, arrowStyle);
-		int[] arrowEvents = { SWT.Selection, SWT.FocusIn };
-		for (int i = 0; i < arrowEvents.length; i++) {
-			arrow.addListener(arrowEvents[i], listener);
-		}
-	}
-
-	/**
-	 * @param style
-	 */
-	private void createText(int style) {
-		int textStyle = SWT.SINGLE;
-		if ((style & SWT.READ_ONLY) != 0) {
-			textStyle |= SWT.READ_ONLY;
-		}
-		if ((style & SWT.FLAT) != 0) {
-			textStyle |= SWT.FLAT;
-		}
-		text = new Text(this, textStyle);
-		int[] textEvents = { SWT.KeyDown, SWT.KeyUp, SWT.Modify, SWT.MouseDown,
-				SWT.MouseUp, SWT.Traverse, SWT.FocusIn };
-		for (int i = 0; i < textEvents.length; i++) {
-			text.addListener(textEvents[i], listener);
-		}
-	}
-
-	static int checkStyle(int style) {
-		int mask = SWT.BORDER | SWT.READ_ONLY | SWT.FLAT | SWT.LEFT_TO_RIGHT
-				| SWT.RIGHT_TO_LEFT;
-		return style & mask;
-	}
-
-	/**
-	 * Adds the argument to the end of the receiver's list.
-	 * 
-	 * @param string
-	 *            the new item
-	 * 
-	 * @exception IllegalArgumentException
-	 *                <ul>
-	 *                <li>ERROR_NULL_ARGUMENT - if the string is null</li>
-	 *                </ul>
-	 * @exception org.eclipse.swt.SWTException
-	 *                <ul>
-	 *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
-	 *                disposed</li>
-	 *                <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
-	 *                thread that created the receiver</li>
-	 *                </ul>
-	 * 
-	 * @see #add(String,int)
-	 */
-	public void add(String string) {
-		checkWidget();
-		if (string == null) {
-			SWT.error(SWT.ERROR_NULL_ARGUMENT);
-		}
-		TableItem item = new TableItem(table, SWT.NONE);
-		item.setText(0, string);
-	}
-
-	/**
-	 * Adds the argument to the receiver's list at the given zero-relative
-	 * index.
-	 * <p>
-	 * Note: To add an item at the end of the list, use the result of calling
-	 * <code>getItemCount()</code> as the index or use
-	 * <code>add(String)</code>.
-	 * </p>
-	 * 
-	 * @param string
-	 *            the new item
-	 * @param index
-	 *            the index for the item
-	 * 
-	 * @exception IllegalArgumentException
-	 *                <ul>
-	 *                <li>ERROR_NULL_ARGUMENT - if the string is null</li>
-	 *                <li>ERROR_INVALID_RANGE - if the index is not between 0
-	 *                and the number of elements in the list (inclusive)</li>
-	 *                </ul>
-	 * @exception org.eclipse.swt.SWTException
-	 *                <ul>
-	 *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
-	 *                disposed</li>
-	 *                <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
-	 *                thread that created the receiver</li>
-	 *                </ul>
-	 * 
-	 * @see #add(String)
-	 */
-	public void add(String string, int index) {
-		checkWidget();
-		if (string == null) {
-			SWT.error(SWT.ERROR_NULL_ARGUMENT);
-		}
-		TableItem item = new TableItem(table, SWT.NONE, index);
-		item.setText(0, string);
-	}
-
-	/**
-	 * Adds the listener to the collection of listeners who will be notified
-	 * when the receiver's text is modified, by sending it one of the messages
-	 * defined in the <code>ModifyListener</code> interface.
-	 * 
-	 * @param listener1
-	 *            the listener which should be notified
-	 * 
-	 * @exception IllegalArgumentException
-	 *                <ul>
-	 *                <li>ERROR_NULL_ARGUMENT - if the listener is null</li>
-	 *                </ul>
-	 * @exception org.eclipse.swt.SWTException
-	 *                <ul>
-	 *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
-	 *                disposed</li>
-	 *                <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
-	 *                thread that created the receiver</li>
-	 *                </ul>
-	 * 
-	 * @see ModifyListener
-	 * @see #removeModifyListener
-	 */
-	public void addModifyListener(ModifyListener listener1) {
-		checkWidget();
-		if (listener1 == null) {
-			SWT.error(SWT.ERROR_NULL_ARGUMENT);
-		}
-		TypedListener typedListener = new TypedListener(listener1);
-		addListener(SWT.Modify, typedListener);
-	}
-
-	/**
-	 * Adds the listener to the collection of listeners who will be notified
-	 * when the receiver's selection changes, by sending it one of the messages
-	 * defined in the <code>SelectionListener</code> interface.
-	 * <p>
-	 * <code>widgetSelected</code> is called when the combo's list selection
-	 * changes. <code>widgetDefaultSelected</code> is typically called when
-	 * ENTER is pressed the combo's text area.
-	 * </p>
-	 * 
-	 * @param listener1
-	 *            the listener which should be notified
-	 * 
-	 * @exception IllegalArgumentException
-	 *                <ul>
-	 *                <li>ERROR_NULL_ARGUMENT - if the listener is null</li>
-	 *                </ul>
-	 * @exception org.eclipse.swt.SWTException
-	 *                <ul>
-	 *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
-	 *                disposed</li>
-	 *                <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
-	 *                thread that created the receiver</li>
-	 *                </ul>
-	 * 
-	 * @see SelectionListener
-	 * @see #removeSelectionListener
-	 */
-	public void addSelectionListener(SelectionListener listener1) {
-		checkWidget();
-		if (listener1 == null) {
-			SWT.error(SWT.ERROR_NULL_ARGUMENT);
-		}
-		TypedListener typedListener = new TypedListener(listener1);
-		addListener(SWT.Selection, typedListener);
-		addListener(SWT.DefaultSelection, typedListener);
-	}
-
-	void arrowEvent(Event event) {
-		switch (event.type) {
-		case SWT.FocusIn: {
-			handleFocus(SWT.FocusIn);
-			break;
-		}
-		case SWT.Selection: {
-			dropDown(!isDropped());
-			break;
-		}
-		}
-	}
-
-	/**
-	 * Sets the selection in the receiver's text field to an empty selection
-	 * starting just before the first character. If the text field is editable,
-	 * this has the effect of placing the i-beam at the start of the text.
-	 * <p>
-	 * Note: To clear the selected items in the receiver's list, use
-	 * <code>deselectAll()</code>.
-	 * </p>
-	 * 
-	 * @exception org.eclipse.swt.SWTException
-	 *                <ul>
-	 *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
-	 *                disposed</li>
-	 *                <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
-	 *                thread that created the receiver</li>
-	 *                </ul>
-	 * 
-	 * @see #deselectAll
-	 */
-	public void clearSelection() {
-		checkWidget();
-		text.clearSelection();
-		table.deselectAll();
-	}
-
-	void comboEvent(Event event) {
-		switch (event.type) {
-		case SWT.Dispose:
-			if (popup != null && !popup.isDisposed()) {
-				table.removeListener(SWT.Dispose, listener);
-				popup.dispose();
-			}
-			Shell shell = getShell();
-			shell.removeListener(SWT.Deactivate, listener);
-			Display display = getDisplay();
-			display.removeFilter(SWT.FocusIn, filter);
-			popup = null;
-			text = null;
-			table = null;
-			arrow = null;
-			break;
-		case SWT.Move:
-			dropDown(false);
-			break;
-		case SWT.Resize:
-			internalLayout(false);
-			break;
-		}
-	}
-
-	private String[] getTableItems() {
-		TableItem[] items = table.getItems();
-		String[] values = new String[items.length];
-		for (int i = 0; i < items.length; i++) {
-			values[i] = items[i].getText(0);
-		}
-		return values;
-	}
-
-	public Point computeSize(int wHint, int hHint, boolean changed) {
-		checkWidget();
-		int width = 0, height = 0;
-		String[] items = getTableItems();
-		int textWidth = 0;
-		GC gc = new GC(text);
-		int spacer = gc.stringExtent(" ").x; //$NON-NLS-1$
-		for (int i = 0; i < items.length; i++) {
-			textWidth = Math.max(gc.stringExtent(items[i]).x, textWidth);
-		}
-		gc.dispose();
-		Point textSize = text.computeSize(SWT.DEFAULT, SWT.DEFAULT, changed);
-		Point arrowSize = arrow.computeSize(SWT.DEFAULT, SWT.DEFAULT, changed);
-		Point listSize = table.computeSize(wHint, SWT.DEFAULT, changed);
-		int borderWidth = getBorderWidth();
-
-		height = Math.max(hHint, Math.max(textSize.y, arrowSize.y) + 2
-				* borderWidth);
-		width = Math.max(wHint, Math.max(textWidth + 2 * spacer + arrowSize.x
-				+ 2 * borderWidth, listSize.x));
-		return new Point(width, height);
-	}
-
-	void createPopup(String[] items, int selectionIndex) {
-		// create shell and list
-		popup = new Shell(getShell(), SWT.NO_TRIM | SWT.ON_TOP);
-		table = new Table(popup, SWT.SINGLE | SWT.V_SCROLL | SWT.FULL_SELECTION);
-		new TableColumn(table, SWT.LEFT);
-		if (font != null) {
-			table.setFont(font);
-		}
-		if (foreground != null) {
-			table.setForeground(foreground);
-		}
-		if (background != null) {
-			table.setBackground(background);
-		}
-
-		int[] popupEvents = { SWT.Close, SWT.Paint, SWT.Deactivate };
-		for (int i = 0; i < popupEvents.length; i++) {
-			popup.addListener(popupEvents[i], listener);
-		}
-		int[] listEvents = { SWT.MouseUp, SWT.Selection, SWT.Traverse,
-				SWT.KeyDown, SWT.KeyUp, SWT.FocusIn, SWT.FocusOut, SWT.Dispose };
-		for (int i = 0; i < listEvents.length; i++) {
-			table.addListener(listEvents[i], listener);
-		}
-		if (items != null) {
-			setItems(items);
-		}
-		if (selectionIndex != -1) {
-			select(selectionIndex);
-		}
-	}
-
-	/**
-	 * Deselects the item at the given zero-relative index in the receiver's
-	 * list. If the item at the index was already deselected, it remains
-	 * deselected. Indices that are out of range are ignored.
-	 * 
-	 * @param index
-	 *            the index of the item to deselect
-	 * 
-	 * @exception org.eclipse.swt.SWTException
-	 *                <ul>
-	 *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
-	 *                disposed</li>
-	 *                <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
-	 *                thread that created the receiver</li>
-	 *                </ul>
-	 */
-	public void deselect(int index) {
-		checkWidget();
-		table.deselect(index);
-	}
-
-	/**
-	 * Deselects all selected items in the receiver's list.
-	 * <p>
-	 * Note: To clear the selection in the receiver's text field, use
-	 * <code>clearSelection()</code>.
-	 * </p>
-	 * 
-	 * @exception org.eclipse.swt.SWTException
-	 *                <ul>
-	 *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
-	 *                disposed</li>
-	 *                <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
-	 *                thread that created the receiver</li>
-	 *                </ul>
-	 * 
-	 * @see #clearSelection
-	 */
-	public void deselectAll() {
-		checkWidget();
-		table.deselectAll();
-	}
-
-	void dropDown(boolean drop) {
-		if (drop == isDropped()) {
-			return;
-		}
-		if (!drop) {
-			popup.setVisible(false);
-			table.getColumns()[0].setWidth(0);
-			if (!isDisposed() && arrow.isFocusControl()) {
-				text.setFocus();
-			}
-			return;
-		}
-
-		if (getShell() != popup.getParent()) {
-			String[] items = getTableItems();
-			int selectionIndex = table.getSelectionIndex();
-			table.removeListener(SWT.Dispose, listener);
-			popup.dispose();
-			popup = null;
-			table = null;
-			createPopup(items, selectionIndex);
-		}
-
-		Point size = getSize();
-		int itemCount = table.getItemCount();
-		itemCount = (itemCount == 0) ? visibleItemCount : Math.min(
-				visibleItemCount, itemCount);
-		int itemHeight = table.getItemHeight() * itemCount;
-		Point tableSize = table.computeSize(SWT.DEFAULT, itemHeight, false);
-		// int tableWidth = this.getClientArea()
-		table.setBounds(1, 1, Math.max(size.x - 2, tableSize.x), tableSize.y
-				- table.getHorizontalBar().getSize().y + 2);
-
-		int index = table.getSelectionIndex();
-		if (index != -1) {
-			table.setTopIndex(index);
-		}
-		Display display = getDisplay();
-		Rectangle tableRect = table.getBounds();
-		Rectangle parentRect = display.map(getParent(), null, getBounds());
-		Point comboSize = getSize();
-		Rectangle displayRect = getMonitor().getClientArea();
-		int width = Math.max(comboSize.x, tableRect.width + 2);
-		int height = tableRect.height + 2;
-		int x = parentRect.x;
-		int y = parentRect.y + comboSize.y;
-		if (y + height > displayRect.y + displayRect.height) {
-			y = parentRect.y - height;
-		}
-		popup.setBounds(x, y, width, height);
-		popup.setVisible(true);
-
-		if (table.getItemCount() > visibleItemCount) {
-			table.getColumns()[0].setWidth(text.getSize().x - 2);
-		} else {
-			table.getColumns()[0].setWidth(table.getClientArea().width);
-		}
-		table.setFocus();
-	}
-
-	/*
-	 * Return the Label immediately preceding the receiver in the z-order, or
-	 * null if none.
-	 */
-	Label getAssociatedLabel() {
-		Control[] siblings = getParent().getChildren();
-		for (int i = 0; i < siblings.length; i++) {
-			if (siblings[i] == StyleCombo.this) {
-				if (i > 0 && siblings[i - 1] instanceof Label) {
-					return (Label) siblings[i - 1];
-				}
-			}
-		}
-		return null;
-	}
-
-	public Control[] getChildren() {
-		checkWidget();
-		return new Control[0];
-	}
-
-	/**
-	 * Gets the editable state.
-	 * 
-	 * @return whether or not the reciever is editable
-	 * 
-	 * @exception org.eclipse.swt.SWTException
-	 *                <ul>
-	 *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
-	 *                disposed</li>
-	 *                <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
-	 *                thread that created the receiver</li>
-	 *                </ul>
-	 * 
-	 * @since 3.0
-	 */
-	public boolean getEditable() {
-		checkWidget();
-		return text.getEditable();
-	}
-
-	/**
-	 * Returns the item at the given, zero-relative index in the receiver's
-	 * list. Throws an exception if the index is out of range.
-	 * 
-	 * @param index
-	 *            the index of the item to return
-	 * @return the item at the given index
-	 * 
-	 * @exception IllegalArgumentException
-	 *                <ul>
-	 *                <li>ERROR_INVALID_RANGE - if the index is not between 0
-	 *                and the number of elements in the list minus 1 (inclusive)</li>
-	 *                </ul>
-	 * @exception org.eclipse.swt.SWTException
-	 *                <ul>
-	 *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
-	 *                disposed</li>
-	 *                <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
-	 *                thread that created the receiver</li>
-	 *                </ul>
-	 */
-	public String getItem(int index) {
-		checkWidget();
-		return table.getItem(index).getText(0);
-	}
-
-	/**
-	 * Returns the number of items contained in the receiver's list.
-	 * 
-	 * @return the number of items
-	 * 
-	 * @exception org.eclipse.swt.SWTException
-	 *                <ul>
-	 *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
-	 *                disposed</li>
-	 *                <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
-	 *                thread that created the receiver</li>
-	 *                </ul>
-	 */
-	public int getItemCount() {
-		checkWidget();
-		return table.getItemCount();
-	}
-
-	/**
-	 * Returns the height of the area which would be used to display
-	 * <em>one</em> of the items in the receiver's list.
-	 * 
-	 * @return the height of one item
-	 * 
-	 * @exception org.eclipse.swt.SWTException
-	 *                <ul>
-	 *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
-	 *                disposed</li>
-	 *                <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
-	 *                thread that created the receiver</li>
-	 *                </ul>
-	 */
-	public int getItemHeight() {
-		checkWidget();
-		return table.getItemHeight();
-	}
-
-	/**
-	 * Returns an array of <code>String</code>s which are the items in the
-	 * receiver's list.
-	 * <p>
-	 * Note: This is not the actual structure used by the receiver to maintain
-	 * its list of items, so modifying the array will not affect the receiver.
-	 * </p>
-	 * 
-	 * @return the items in the receiver's list
-	 * 
-	 * @exception org.eclipse.swt.SWTException
-	 *                <ul>
-	 *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
-	 *                disposed</li>
-	 *                <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
-	 *                thread that created the receiver</li>
-	 *                </ul>
-	 */
-	public String[] getItems() {
-		checkWidget();
-		return getTableItems();
-	}
-
-	char getMnemonic(String string) {
-		int index = 0;
-		int length = string.length();
-		do {
-			while ((index < length) && (string.charAt(index) != '&')) {
-				index++;
-			}
-			if (++index >= length) {
-				return '\0';
-			}
-			if (string.charAt(index) != '&') {
-				return string.charAt(index);
-			}
-			index++;
-		} while (index < length);
-		return '\0';
-	}
-
-	/**
-	 * Returns a <code>Point</code> whose x coordinate is the start of the
-	 * selection in the receiver's text field, and whose y coordinate is the end
-	 * of the selection. The returned values are zero-relative. An "empty"
-	 * selection as indicated by the the x and y coordinates having the same
-	 * value.
-	 * 
-	 * @return a point representing the selection start and end
-	 * 
-	 * @exception org.eclipse.swt.SWTException
-	 *                <ul>
-	 *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
-	 *                disposed</li>
-	 *                <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
-	 *                thread that created the receiver</li>
-	 *                </ul>
-	 */
-	public Point getSelection() {
-		checkWidget();
-		return text.getSelection();
-	}
-
-	/**
-	 * Returns the zero-relative index of the item which is currently selected
-	 * in the receiver's list, or -1 if no item is selected.
-	 * 
-	 * @return the index of the selected item
-	 * 
-	 * @exception org.eclipse.swt.SWTException
-	 *                <ul>
-	 *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
-	 *                disposed</li>
-	 *                <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
-	 *                thread that created the receiver</li>
-	 *                </ul>
-	 */
-	public int getSelectionIndex() {
-		checkWidget();
-		return table.getSelectionIndex();
-	}
-
-	public int getStyle() {
-		int style = super.getStyle();
-		style &= ~SWT.READ_ONLY;
-		if (!text.getEditable()) {
-			style |= SWT.READ_ONLY;
-		}
-		return style;
-	}
-
-	/**
-	 * Returns a string containing a copy of the contents of the receiver's text
-	 * field.
-	 * 
-	 * @return the receiver's text
-	 * 
-	 * @exception org.eclipse.swt.SWTException
-	 *                <ul>
-	 *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
-	 *                disposed</li>
-	 *                <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
-	 *                thread that created the receiver</li>
-	 *                </ul>
-	 */
-	public String getText() {
-		checkWidget();
-		return text.getText();
-	}
-
-	/**
-	 * Returns the height of the receivers's text field.
-	 * 
-	 * @return the text height
-	 * 
-	 * @exception org.eclipse.swt.SWTException
-	 *                <ul>
-	 *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
-	 *                disposed</li>
-	 *                <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
-	 *                thread that created the receiver</li>
-	 *                </ul>
-	 */
-	public int getTextHeight() {
-		checkWidget();
-		return text.getLineHeight();
-	}
-
-	/**
-	 * Returns the maximum number of characters that the receiver's text field
-	 * is capable of holding. If this has not been changed by
-	 * <code>setTextLimit()</code>, it will be the constant
-	 * <code>Combo.LIMIT</code>.
-	 * 
-	 * @return the text limit
-	 * 
-	 * @exception org.eclipse.swt.SWTException
-	 *                <ul>
-	 *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
-	 *                disposed</li>
-	 *                <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
-	 *                thread that created the receiver</li>
-	 *                </ul>
-	 */
-	public int getTextLimit() {
-		checkWidget();
-		return text.getTextLimit();
-	}
-
-	/**
-	 * Gets the number of items that are visible in the drop down portion of the
-	 * receiver's list.
-	 * 
-	 * @return the number of items that are visible
-	 * 
-	 * @exception org.eclipse.swt.SWTException
-	 *                <ul>
-	 *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
-	 *                disposed</li>
-	 *                <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
-	 *                thread that created the receiver</li>
-	 *                </ul>
-	 * 
-	 * @since 3.0
-	 */
-	public int getVisibleItemCount() {
-		checkWidget();
-		return visibleItemCount;
-	}
-
-	void handleFocus(int type) {
-		if (isDisposed()) {
-			return;
-		}
-		switch (type) {
-		case SWT.FocusIn: {
-			if (hasFocus) {
-				return;
-			}
-			if (getEditable()) {
-				text.selectAll();
-			}
-			hasFocus = true;
-			Shell shell = getShell();
-			shell.removeListener(SWT.Deactivate, listener);
-			shell.addListener(SWT.Deactivate, listener);
-			Display display = getDisplay();
-			display.removeFilter(SWT.FocusIn, filter);
-			display.addFilter(SWT.FocusIn, filter);
-			Event e = new Event();
-			notifyListeners(SWT.FocusIn, e);
-			break;
-		}
-		case SWT.FocusOut: {
-			if (!hasFocus) {
-				return;
-			}
-			Control focusControl = getDisplay().getFocusControl();
-			if (focusControl == arrow || focusControl == table
-					|| focusControl == text) {
-				return;
-			}
-			hasFocus = false;
-			Shell shell = getShell();
-			shell.removeListener(SWT.Deactivate, listener);
-			Display display = getDisplay();
-			display.removeFilter(SWT.FocusIn, filter);
-			Event e = new Event();
-			notifyListeners(SWT.FocusOut, e);
-			break;
-		}
-		}
-	}
-
-	/**
-	 * Searches the receiver's list starting at the first item (index 0) until
-	 * an item is found that is equal to the argument, and returns the index of
-	 * that item. If no item is found, returns -1.
-	 * 
-	 * @param string
-	 *            the search item
-	 * @return the index of the item
-	 * 
-	 * @exception IllegalArgumentException
-	 *                <ul>
-	 *                <li>ERROR_NULL_ARGUMENT - if the string is null</li>
-	 *                </ul>
-	 * @exception org.eclipse.swt.SWTException
-	 *                <ul>
-	 *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
-	 *                disposed</li>
-	 *                <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
-	 *                thread that created the receiver</li>
-	 *                </ul>
-	 */
-	public int indexOf(String string) {
-		checkWidget();
-		if (string == null) {
-			SWT.error(SWT.ERROR_NULL_ARGUMENT);
-		}
-		return Arrays.asList(getTableItems()).indexOf(string);
-	}
-
-	/**
-	 * Searches the receiver's list starting at the given, zero-relative index
-	 * until an item is found that is equal to the argument, and returns the
-	 * index of that item. If no item is found or the starting index is out of
-	 * range, returns -1.
-	 * 
-	 * @param string
-	 *            the search item
-	 * @param start
-	 *            the zero-relative index at which to begin the search
-	 * @return the index of the item
-	 * 
-	 * @exception IllegalArgumentException
-	 *                <ul>
-	 *                <li>ERROR_NULL_ARGUMENT - if the string is null</li>
-	 *                </ul>
-	 * @exception org.eclipse.swt.SWTException
-	 *                <ul>
-	 *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
-	 *                disposed</li>
-	 *                <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
-	 *                thread that created the receiver</li>
-	 *                </ul>
-	 */
-	public int indexOf(String string, int start) {
-		checkWidget();
-		if (string == null) {
-			SWT.error(SWT.ERROR_NULL_ARGUMENT);
-		}
-		String[] items = getTableItems();
-		for (int i = start; i < items.length; i++) {
-			if (items[i].equals(string)) {
-				return i;
-			}
-		}
-		return -1;
-	}
-
-	void initAccessible() {
-		AccessibleAdapter accessibleAdapter = new AccessibleAdapter() {
-			public void getName(AccessibleEvent e) {
-				String name = null;
-				Label label = getAssociatedLabel();
-				if (label != null) {
-					name = stripMnemonic(label.getText());
-				}
-				e.result = name;
-			}
-
-			public void getKeyboardShortcut(AccessibleEvent e) {
-				String shortcut = null;
-				Label label = getAssociatedLabel();
-				if (label != null) {
-					String text1 = label.getText();
-					if (text1 != null) {
-						char mnemonic = getMnemonic(text1);
-						if (mnemonic != '\0') {
-							shortcut = "Alt+" + mnemonic; //$NON-NLS-1$
-						}
-					}
-				}
-				e.result = shortcut;
-			}
-
-			public void getHelp(AccessibleEvent e) {
-				e.result = getToolTipText();
-			}
-		};
-		getAccessible().addAccessibleListener(accessibleAdapter);
-		text.getAccessible().addAccessibleListener(accessibleAdapter);
-		table.getAccessible().addAccessibleListener(accessibleAdapter);
-
-		arrow.getAccessible().addAccessibleListener(new AccessibleAdapter() {
-			public void getName(AccessibleEvent e) {
-				e.result = isDropped() ? SWT.getMessage("SWT_Close") : SWT.getMessage("SWT_Open"); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-
-			public void getKeyboardShortcut(AccessibleEvent e) {
-				e.result = "Alt+Down Arrow"; //$NON-NLS-1$
-			}
-
-			public void getHelp(AccessibleEvent e) {
-				e.result = getToolTipText();
-			}
-		});
-
-		getAccessible().addAccessibleTextListener(new AccessibleTextAdapter() {
-			public void getCaretOffset(AccessibleTextEvent e) {
-				e.offset = text.getCaretPosition();
-			}
-		});
-
-		getAccessible().addAccessibleControlListener(
-				new AccessibleControlAdapter() {
-					public void getChildAtPoint(AccessibleControlEvent e) {
-						Point testPoint = toControl(e.x, e.y);
-						if (getBounds().contains(testPoint)) {
-							e.childID = ACC.CHILDID_SELF;
-						}
-					}
-
-					public void getLocation(AccessibleControlEvent e) {
-						Rectangle location = getBounds();
-						Point pt = toDisplay(location.x, location.y);
-						e.x = pt.x;
-						e.y = pt.y;
-						e.width = location.width;
-						e.height = location.height;
-					}
-
-					public void getChildCount(AccessibleControlEvent e) {
-						e.detail = 0;
-					}
-
-					public void getRole(AccessibleControlEvent e) {
-						e.detail = ACC.ROLE_COMBOBOX;
-					}
-
-					public void getState(AccessibleControlEvent e) {
-						e.detail = ACC.STATE_NORMAL;
-					}
-
-					public void getValue(AccessibleControlEvent e) {
-						e.result = getText();
-					}
-				});
-
-		text.getAccessible().addAccessibleControlListener(
-				new AccessibleControlAdapter() {
-					public void getRole(AccessibleControlEvent e) {
-						e.detail = text.getEditable() ? ACC.ROLE_TEXT
-								: ACC.ROLE_LABEL;
-					}
-				});
-
-		arrow.getAccessible().addAccessibleControlListener(
-				new AccessibleControlAdapter() {
-					public void getDefaultAction(AccessibleControlEvent e) {
-						e.result = isDropped() ? SWT.getMessage("SWT_Close") : SWT.getMessage("SWT_Open"); //$NON-NLS-1$ //$NON-NLS-2$
-					}
-				});
-	}
-
-	boolean isDropped() {
-		return popup.getVisible();
-	}
-
-	public boolean isFocusControl() {
-		checkWidget();
-		if (text.isFocusControl() || arrow.isFocusControl()
-				|| table.isFocusControl() || popup.isFocusControl()) {
-			return true;
-		}
-		return super.isFocusControl();
-	}
-
-	void internalLayout(boolean changed) {
-		if (isDropped()) {
-			dropDown(false);
-		}
-		Rectangle rect = getClientArea();
-		int width = rect.width;
-		int height = rect.height;
-		Point arrowSize = arrow.computeSize(SWT.DEFAULT, height, changed);
-		text.setBounds(0, 0, width - arrowSize.x, height);
-		arrow.setBounds(width - arrowSize.x, 0, arrowSize.x, arrowSize.y);
-	}
-
-	void tableEvent(Event event) {
-		switch (event.type) {
-		case SWT.Dispose:
-			if (getShell() != popup.getParent()) {
-				String[] items = getTableItems();
-				int selectionIndex = table.getSelectionIndex();
-				popup = null;
-				table = null;
-				createPopup(items, selectionIndex);
-			}
-			break;
-		case SWT.FocusIn: {
-			handleFocus(SWT.FocusIn);
-			break;
-		}
-		case SWT.MouseUp: {
-			if (event.button != 1) {
-				return;
-			}
-			dropDown(false);
-			break;
-		}
-		case SWT.Selection: {
-			int index = table.getSelectionIndex();
-			if (index == -1)
-				return;
-			text.setText(table.getItem(index).getText());
-			text.selectAll();
-			table.setSelection(index);
-			Event e = new Event();
-			e.time = event.time;
-			e.stateMask = event.stateMask;
-			e.doit = event.doit;
-			notifyListeners(SWT.Selection, e);
-			event.doit = e.doit;
-			break;
-		}
-		case SWT.Traverse: {
-			switch (event.detail) {
-			case SWT.TRAVERSE_RETURN:
-			case SWT.TRAVERSE_ESCAPE:
-			case SWT.TRAVERSE_ARROW_PREVIOUS:
-			case SWT.TRAVERSE_ARROW_NEXT:
-				event.doit = false;
-				break;
-			}
-			Event e = new Event();
-			e.time = event.time;
-			e.detail = event.detail;
-			e.doit = event.doit;
-			e.character = event.character;
-			e.keyCode = event.keyCode;
-			notifyListeners(SWT.Traverse, e);
-			event.doit = e.doit;
-			event.detail = e.detail;
-			break;
-		}
-		case SWT.KeyUp: {
-			Event e = new Event();
-			e.time = event.time;
-			e.character = event.character;
-			e.keyCode = event.keyCode;
-			e.stateMask = event.stateMask;
-			notifyListeners(SWT.KeyUp, e);
-			break;
-		}
-		case SWT.KeyDown: {
-			if (event.character == SWT.ESC) {
-				// Escape key cancels popup list
-				dropDown(false);
-			}
-			if ((event.stateMask & SWT.ALT) != 0
-					&& (event.keyCode == SWT.ARROW_UP || event.keyCode == SWT.ARROW_DOWN)) {
-				dropDown(false);
-			}
-			if (event.character == SWT.CR) {
-				// Enter causes default selection
-				dropDown(false);
-				Event e = new Event();
-				e.time = event.time;
-				e.stateMask = event.stateMask;
-				notifyListeners(SWT.DefaultSelection, e);
-			}
-			// At this point the widget may have been disposed.
-			// If so, do not continue.
-			if (isDisposed()) {
-				break;
-			}
-			Event e = new Event();
-			e.time = event.time;
-			e.character = event.character;
-			e.keyCode = event.keyCode;
-			e.stateMask = event.stateMask;
-			notifyListeners(SWT.KeyDown, e);
-			break;
-
-		}
-		}
-	}
-
-	void popupEvent(Event event) {
-		switch (event.type) {
-		case SWT.Paint:
-			// draw black rectangle around list
-			Rectangle listRect = table.getBounds();
-			Color black = getDisplay().getSystemColor(SWT.COLOR_BLACK);
-			event.gc.setForeground(black);
-			event.gc.drawRectangle(0, 0, listRect.width + 1,
-					listRect.height + 1);
-			break;
-		case SWT.Close:
-			event.doit = false;
-			dropDown(false);
-			break;
-		case SWT.Deactivate:
-			dropDown(false);
-			break;
-		}
-	}
-
-	public void redraw() {
-		super.redraw();
-		text.redraw();
-		arrow.redraw();
-		if (popup.isVisible()) {
-			table.redraw();
-		}
-	}
-
-	public void redraw(int x, int y, int width, int height, boolean all) {
-		super.redraw(x, y, width, height, true);
-	}
-
-	/**
-	 * Removes the item from the receiver's list at the given zero-relative
-	 * index.
-	 * 
-	 * @param index
-	 *            the index for the item
-	 * 
-	 * @exception IllegalArgumentException
-	 *                <ul>
-	 *                <li>ERROR_INVALID_RANGE - if the index is not between 0
-	 *                and the number of elements in the list minus 1 (inclusive)</li>
-	 *                </ul>
-	 * @exception org.eclipse.swt.SWTException
-	 *                <ul>
-	 *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
-	 *                disposed</li>
-	 *                <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
-	 *                thread that created the receiver</li>
-	 *                </ul>
-	 */
-	public void remove(int index) {
-		checkWidget();
-		table.remove(index);
-	}
-
-	/**
-	 * Removes the items from the receiver's list which are between the given
-	 * zero-relative start and end indices (inclusive).
-	 * 
-	 * @param start
-	 *            the start of the range
-	 * @param end
-	 *            the end of the range
-	 * 
-	 * @exception IllegalArgumentException
-	 *                <ul>
-	 *                <li>ERROR_INVALID_RANGE - if either the start or end are
-	 *                not between 0 and the number of elements in the list minus
-	 *                1 (inclusive)</li>
-	 *                </ul>
-	 * @exception org.eclipse.swt.SWTException
-	 *                <ul>
-	 *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
-	 *                disposed</li>
-	 *                <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
-	 *                thread that created the receiver</li>
-	 *                </ul>
-	 */
-	public void remove(int start, int end) {
-		checkWidget();
-		table.remove(start, end);
-	}
-
-	/**
-	 * Searches the receiver's list starting at the first item until an item is
-	 * found that is equal to the argument, and removes that item from the list.
-	 * 
-	 * @param string
-	 *            the item to remove
-	 * 
-	 * @exception IllegalArgumentException
-	 *                <ul>
-	 *                <li>ERROR_NULL_ARGUMENT - if the string is null</li>
-	 *                <li>ERROR_INVALID_ARGUMENT - if the string is not found
-	 *                in the list</li>
-	 *                </ul>
-	 * @exception org.eclipse.swt.SWTException
-	 *                <ul>
-	 *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
-	 *                disposed</li>
-	 *                <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
-	 *                thread that created the receiver</li>
-	 *                </ul>
-	 */
-	public void remove(String string) {
-		checkWidget();
-		if (string == null) {
-			SWT.error(SWT.ERROR_NULL_ARGUMENT);
-		}
-		int index = Arrays.asList(getTableItems()).indexOf(string);
-		table.remove(index);
-	}
-
-	/**
-	 * Removes all of the items from the receiver's list and clear the contents
-	 * of receiver's text field.
-	 * <p>
-	 * 
-	 * @exception org.eclipse.swt.SWTException
-	 *                <ul>
-	 *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
-	 *                disposed</li>
-	 *                <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
-	 *                thread that created the receiver</li>
-	 *                </ul>
-	 */
-	public void removeAll() {
-		checkWidget();
-		text.setText(""); //$NON-NLS-1$
-		table.removeAll();
-	}
-
-	/**
-	 * Removes the listener from the collection of listeners who will be
-	 * notified when the receiver's text is modified.
-	 * 
-	 * @param listener1
-	 *            the listener which should no longer be notified
-	 * 
-	 * @exception IllegalArgumentException
-	 *                <ul>
-	 *                <li>ERROR_NULL_ARGUMENT - if the listener is null</li>
-	 *                </ul>
-	 * @exception org.eclipse.swt.SWTException
-	 *                <ul>
-	 *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
-	 *                disposed</li>
-	 *                <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
-	 *                thread that created the receiver</li>
-	 *                </ul>
-	 * 
-	 * @see ModifyListener
-	 * @see #addModifyListener
-	 */
-	public void removeModifyListener(ModifyListener listener1) {
-		checkWidget();
-		if (listener1 == null) {
-			SWT.error(SWT.ERROR_NULL_ARGUMENT);
-		}
-		removeListener(SWT.Modify, listener1);
-	}
-
-	/**
-	 * Removes the listener from the collection of listeners who will be
-	 * notified when the receiver's selection changes.
-	 * 
-	 * @param listener1
-	 *            the listener which should no longer be notified
-	 * 
-	 * @exception IllegalArgumentException
-	 *                <ul>
-	 *                <li>ERROR_NULL_ARGUMENT - if the listener is null</li>
-	 *                </ul>
-	 * @exception org.eclipse.swt.SWTException
-	 *                <ul>
-	 *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
-	 *                disposed</li>
-	 *                <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
-	 *                thread that created the receiver</li>
-	 *                </ul>
-	 * 
-	 * @see SelectionListener
-	 * @see #addSelectionListener
-	 */
-	public void removeSelectionListener(SelectionListener listener1) {
-		checkWidget();
-		if (listener1 == null) {
-			SWT.error(SWT.ERROR_NULL_ARGUMENT);
-		}
-		removeListener(SWT.Selection, listener1);
-		removeListener(SWT.DefaultSelection, listener1);
-	}
-
-	/**
-	 * Selects the item at the given zero-relative index in the receiver's list.
-	 * If the item at the index was already selected, it remains selected.
-	 * Indices that are out of range are ignored.
-	 * 
-	 * @param index
-	 *            the index of the item to select
-	 * 
-	 * @exception org.eclipse.swt.SWTException
-	 *                <ul>
-	 *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
-	 *                disposed</li>
-	 *                <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
-	 *                thread that created the receiver</li>
-	 *                </ul>
-	 */
-	public void select(int index) {
-		checkWidget();
-		if (index == -1) {
-			table.deselectAll();
-			text.setText(""); //$NON-NLS-1$
-			return;
-		}
-		if (0 <= index && index < table.getItemCount()) {
-			if (index != getSelectionIndex()) {
-				text.setText(table.getItem(index).getText());
-				text.selectAll();
-				table.select(index);
-				table.showSelection();
-			}
-		}
-	}
-
-	public void setBackground(Color color) {
-		super.setBackground(color);
-		background = color;
-		if (text != null) {
-			text.setBackground(color);
-		}
-		if (table != null) {
-			table.setBackground(color);
-		}
-		if (arrow != null) {
-			arrow.setBackground(color);
-		}
-	}
-
-	/**
-	 * Sets the editable state.
-	 * 
-	 * @param editable
-	 *            the new editable state
-	 * 
-	 * @exception org.eclipse.swt.SWTException
-	 *                <ul>
-	 *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
-	 *                disposed</li>
-	 *                <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
-	 *                thread that created the receiver</li>
-	 *                </ul>
-	 * 
-	 * @since 3.0
-	 */
-	public void setEditable(boolean editable) {
-		checkWidget();
-		text.setEditable(editable);
-	}
-
-	public void setEnabled(boolean enabled) {
-		super.setEnabled(enabled);
-		if (popup != null) {
-			popup.setVisible(false);
-		}
-		if (text != null) {
-			text.setEnabled(enabled);
-		}
-		if (arrow != null) {
-			arrow.setEnabled(enabled);
-		}
-	}
-
-	public boolean setFocus() {
-		checkWidget();
-		return text.setFocus();
-	}
-
-	public void setFont(Font font) {
-		super.setFont(font);
-		this.font = font;
-		text.setFont(font);
-		table.setFont(font);
-		internalLayout(true);
-	}
-
-	public void setForeground(Color color) {
-		super.setForeground(color);
-		foreground = color;
-		if (text != null) {
-			text.setForeground(color);
-		}
-		if (table != null) {
-			table.setForeground(color);
-		}
-		if (arrow != null) {
-			arrow.setForeground(color);
-		}
-	}
-
-	/**
-	 * Sets the text of the item in the receiver's list at the given
-	 * zero-relative index to the string argument. This is equivalent to
-	 * <code>remove</code>'ing the old item at the index, and then
-	 * <code>add</code>'ing the new item at that index.
-	 * 
-	 * @param index
-	 *            the index for the item
-	 * @param string
-	 *            the new text for the item
-	 * 
-	 * @exception IllegalArgumentException
-	 *                <ul>
-	 *                <li>ERROR_INVALID_RANGE - if the index is not between 0
-	 *                and the number of elements in the list minus 1 (inclusive)</li>
-	 *                <li>ERROR_NULL_ARGUMENT - if the string is null</li>
-	 *                </ul>
-	 * @exception org.eclipse.swt.SWTException
-	 *                <ul>
-	 *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
-	 *                disposed</li>
-	 *                <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
-	 *                thread that created the receiver</li>
-	 *                </ul>
-	 */
-	public void setItem(int index, String string) {
-		checkWidget();
-		table.getItem(index).setText(0, string);
-	}
-
-	/**
-	 * Sets the receiver's list to be the given array of items.
-	 * 
-	 * @param items
-	 *            the array of items
-	 * 
-	 * @exception IllegalArgumentException
-	 *                <ul>
-	 *                <li>ERROR_NULL_ARGUMENT - if the items array is null</li>
-	 *                <li>ERROR_INVALID_ARGUMENT - if an item in the items
-	 *                array is null</li>
-	 *                </ul>
-	 * @exception org.eclipse.swt.SWTException
-	 *                <ul>
-	 *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
-	 *                disposed</li>
-	 *                <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
-	 *                thread that created the receiver</li>
-	 *                </ul>
-	 */
-	public void setItems(String[] items) {
-		checkWidget();
-		if (items == null) {
-			SWT.error(SWT.ERROR_NULL_ARGUMENT);
-		}
-
-		for (int i = 0; i < items.length; i++) {
-			TableItem item = new TableItem(table, SWT.NONE);
-			if (items[i].equals(defaultValue)) {
-				item.setFont(JFaceResources.getFontRegistry().getBold(
-						JFaceResources.DEFAULT_FONT));
-			}
-			item.setText(0, items[i]);
-		}
-	}
-
-	/**
-	 * Sets the layout which is associated with the receiver to be the argument
-	 * which may be null.
-	 * <p>
-	 * Note : No Layout can be set on this Control because it already manages
-	 * the size and position of its children.
-	 * </p>
-	 * 
-	 * @param layout
-	 *            the receiver's new layout or null
-	 * 
-	 * @exception org.eclipse.swt.SWTException
-	 *                <ul>
-	 *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
-	 *                disposed</li>
-	 *                <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
-	 *                thread that created the receiver</li>
-	 *                </ul>
-	 */
-	public void setLayout(Layout layout) {
-		checkWidget();
-		return;
-	}
-
-	/**
-	 * Sets the selection in the receiver's text field to the range specified by
-	 * the argument whose x coordinate is the start of the selection and whose y
-	 * coordinate is the end of the selection.
-	 * 
-	 * @param selection
-	 *            a point representing the new selection start and end
-	 * 
-	 * @exception IllegalArgumentException
-	 *                <ul>
-	 *                <li>ERROR_NULL_ARGUMENT - if the point is null</li>
-	 *                </ul>
-	 * @exception org.eclipse.swt.SWTException
-	 *                <ul>
-	 *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
-	 *                disposed</li>
-	 *                <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
-	 *                thread that created the receiver</li>
-	 *                </ul>
-	 */
-	public void setSelection(Point selection) {
-		checkWidget();
-		if (selection == null) {
-			SWT.error(SWT.ERROR_NULL_ARGUMENT);
-		}
-		text.setSelection(selection.x, selection.y);
-	}
-
-	/**
-	 * Sets the contents of the receiver's text field to the given string.
-	 * <p>
-	 * Note: The text field in a <code>Combo</code> is typically only capable
-	 * of displaying a single line of text. Thus, setting the text to a string
-	 * containing line breaks or other special characters will probably cause it
-	 * to display incorrectly.
-	 * </p>
-	 * 
-	 * @param string
-	 *            the new text
-	 * 
-	 * @exception IllegalArgumentException
-	 *                <ul>
-	 *                <li>ERROR_NULL_ARGUMENT - if the string is null</li>
-	 *                </ul>
-	 * @exception org.eclipse.swt.SWTException
-	 *                <ul>
-	 *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
-	 *                disposed</li>
-	 *                <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
-	 *                thread that created the receiver</li>
-	 *                </ul>
-	 */
-	public void setText(String string) {
-		checkWidget();
-		if (string == null) {
-			SWT.error(SWT.ERROR_NULL_ARGUMENT);
-		}
-		int index = Arrays.asList(getTableItems()).indexOf(string);
-		if (index == -1) {
-			table.deselectAll();
-			text.setText(string);
-			return;
-		}
-		text.setText(string);
-		text.selectAll();
-		table.setSelection(index);
-		table.showSelection();
-	}
-
-	/**
-	 * Sets the maximum number of characters that the receiver's text field is
-	 * capable of holding to be the argument.
-	 * 
-	 * @param limit
-	 *            new text limit
-	 * 
-	 * @exception IllegalArgumentException
-	 *                <ul>
-	 *                <li>ERROR_CANNOT_BE_ZERO - if the limit is zero</li>
-	 *                </ul>
-	 * @exception org.eclipse.swt.SWTException
-	 *                <ul>
-	 *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
-	 *                disposed</li>
-	 *                <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
-	 *                thread that created the receiver</li>
-	 *                </ul>
-	 */
-	public void setTextLimit(int limit) {
-		checkWidget();
-		text.setTextLimit(limit);
-	}
-
-	public void setToolTipText(String string) {
-		checkWidget();
-		super.setToolTipText(string);
-		arrow.setToolTipText(string);
-		text.setToolTipText(string);
-	}
-
-	public void setVisible(boolean visible) {
-		super.setVisible(visible);
-		if (!visible) {
-			popup.setVisible(false);
-		}
-	}
-
-	/**
-	 * Sets the number of items that are visible in the drop down portion of the
-	 * receiver's list.
-	 * 
-	 * @param count
-	 *            the new number of items to be visible
-	 * 
-	 * @exception org.eclipse.swt.SWTException
-	 *                <ul>
-	 *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
-	 *                disposed</li>
-	 *                <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
-	 *                thread that created the receiver</li>
-	 *                </ul>
-	 * 
-	 * @since 3.0
-	 */
-	public void setVisibleItemCount(int count) {
-		checkWidget();
-		if (count < 0) {
-			return;
-		}
-		visibleItemCount = count;
-	}
-
-	String stripMnemonic(String string) {
-		int index = 0;
-		int length = string.length();
-		do {
-			while ((index < length) && (string.charAt(index) != '&')) {
-				index++;
-			}
-			if (++index >= length) {
-				return string;
-			}
-			if (string.charAt(index) != '&') {
-				return string.substring(0, index - 1)
-						+ string.substring(index, length);
-			}
-			index++;
-		} while (index < length);
-		return string;
-	}
-
-	void textEvent(Event event) {
-		switch (event.type) {
-		case SWT.FocusIn: {
-			handleFocus(SWT.FocusIn);
-			break;
-		}
-		case SWT.KeyDown: {
-			if (event.character == SWT.CR) {
-				dropDown(false);
-				Event e = new Event();
-				e.time = event.time;
-				e.stateMask = event.stateMask;
-				notifyListeners(SWT.DefaultSelection, e);
-			}
-			// At this point the widget may have been disposed.
-			// If so, do not continue.
-			if (isDisposed()) {
-				break;
-			}
-
-			if (event.keyCode == SWT.ARROW_UP
-					|| event.keyCode == SWT.ARROW_DOWN) {
-				event.doit = false;
-				if ((event.stateMask & SWT.ALT) != 0) {
-					boolean dropped = isDropped();
-					text.selectAll();
-					if (!dropped) {
-						setFocus();
-					}
-					dropDown(!dropped);
-					break;
-				}
-
-				int oldIndex = getSelectionIndex();
-				if (event.keyCode == SWT.ARROW_UP) {
-					select(Math.max(oldIndex - 1, 0));
-				} else {
-					select(Math.min(oldIndex + 1, getItemCount() - 1));
-				}
-				if (oldIndex != getSelectionIndex()) {
-					Event e = new Event();
-					e.time = event.time;
-					e.stateMask = event.stateMask;
-					notifyListeners(SWT.Selection, e);
-				}
-				// At this point the widget may have been disposed.
-				// If so, do not continue.
-				if (isDisposed()) {
-					break;
-				}
-			}
-
-			// Further work : Need to add support for incremental search in
-			// pop up list as characters typed in text widget
-
-			Event e = new Event();
-			e.time = event.time;
-			e.character = event.character;
-			e.keyCode = event.keyCode;
-			e.stateMask = event.stateMask;
-			notifyListeners(SWT.KeyDown, e);
-			break;
-		}
-		case SWT.KeyUp: {
-			Event e = new Event();
-			e.time = event.time;
-			e.character = event.character;
-			e.keyCode = event.keyCode;
-			e.stateMask = event.stateMask;
-			notifyListeners(SWT.KeyUp, e);
-			break;
-		}
-		case SWT.Modify: {
-			table.deselectAll();
-			Event e = new Event();
-			e.time = event.time;
-			notifyListeners(SWT.Modify, e);
-			break;
-		}
-		case SWT.MouseDown: {
-			if (event.button != 1) {
-				return;
-			}
-			if (text.getEditable()) {
-				return;
-			}
-			boolean dropped = isDropped();
-			text.selectAll();
-			if (!dropped) {
-				setFocus();
-			}
-			dropDown(!dropped);
-			break;
-		}
-		case SWT.MouseUp: {
-			if (event.button != 1) {
-				return;
-			}
-			if (text.getEditable()) {
-				return;
-			}
-			text.selectAll();
-			break;
-		}
-		case SWT.Traverse: {
-			switch (event.detail) {
-			case SWT.TRAVERSE_RETURN:
-			case SWT.TRAVERSE_ARROW_PREVIOUS:
-			case SWT.TRAVERSE_ARROW_NEXT:
-				// The enter causes default selection and
-				// the arrow keys are used to manipulate the list contents so
-				// do not use them for traversal.
-				event.doit = false;
-				break;
-			}
-
-			Event e = new Event();
-			e.time = event.time;
-			e.detail = event.detail;
-			e.doit = event.doit;
-			e.character = event.character;
-			e.keyCode = event.keyCode;
-			notifyListeners(SWT.Traverse, e);
-			event.doit = e.doit;
-			event.detail = e.detail;
-			break;
-		}
-		}
-	}
-
-	/**
-	 * @param defaultValue
-	 */
-	public void setDefaultValue(String defaultValue) {
-		this.defaultValue = defaultValue;
-		int index = Arrays.asList(getTableItems()).indexOf(defaultValue);
-		if (index != -1) {
-			table.getItem(index).setFont(
-					JFaceResources.getFontRegistry().getBold(
-							JFaceResources.DEFAULT_FONT));
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/utils/UTF8Util.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/utils/UTF8Util.java
deleted file mode 100644
index 31aac19..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/utils/UTF8Util.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.utils;
-
-/**
- * TODO: this class doesn't seem to be in use
- * @author mengbo
- * @version 1.5
- */
-public final class UTF8Util {
-	private static final char[] HEX_DIGITS = { '0', '1', '2', '3', '4', '5',
-			'6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
-
-	/**
-	 * @param s
-	 * @return the unwound string
-	 */
-	public static String unwindEscapeChars(String s) {
-		StringBuffer sb = new StringBuffer(s.length());
-		int length = s.length();
-		for (int i = 0; i < length; i++) {
-			char c = s.charAt(i);
-			sb.append(getUnwoundString(c));
-		}
-		return sb.toString();
-	}
-
-	private static String getUnwoundString(char c) {
-		switch (c) {
-		case '\b':
-			return "\\b";//$NON-NLS-1$
-		case '\t':
-			return "\\t";//$NON-NLS-1$
-		case '\n':
-			return "\\n";//$NON-NLS-1$
-		case '\f':
-			return "\\f";//$NON-NLS-1$	
-		case '\r':
-			return "\\r";//$NON-NLS-1$
-
-			// These can be used unescaped in properties file:
-		case '\"':
-			return "\\\"";//$NON-NLS-1$
-		case '\'':
-			return "\\\'";//$NON-NLS-1$
-
-		case '\\':
-			return "\\\\";//$NON-NLS-1$
-
-		case '=':
-			return "\\=";//$NON-NLS-1$
-
-			// This is only done when writing to the .properties file in
-			// #unwindValue(String)
-			// case '!':
-			// return "\\!";//$NON-NLS-1$
-			// case '#':
-			// return "\\#";//$NON-NLS-1$
-
-		default:
-			if (((c < 0x0020) || (c > 0x007e))) {
-				return new StringBuffer().append('\\').append('u').append(
-						toHex((c >> 12) & 0xF)).append(toHex((c >> 8) & 0xF))
-						.append(toHex((c >> 4) & 0xF)).append(toHex(c & 0xF))
-						.toString();
-
-			}
-			return String.valueOf(c);
-		}
-	}
-
-	private static char toHex(int halfByte) {
-		return HEX_DIGITS[(halfByte & 0xF)];
-	}
-
-	private UTF8Util()
-	{
-		// no instantiation
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/utils/WebrootUtil.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/utils/WebrootUtil.java
deleted file mode 100644
index 3a99bf3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/utils/WebrootUtil.java
+++ /dev/null
@@ -1,268 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.utils;
-
-import java.util.Arrays;
-import java.util.Iterator;
-import java.util.Set;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.content.IContentType;
-import org.eclipse.core.runtime.content.IContentTypeManager;
-import org.eclipse.jst.jsf.common.ui.IFileFolderConstants;
-import org.eclipse.jst.jsf.common.ui.JSFUICommonPlugin;
-import org.eclipse.wst.common.componentcore.ComponentCore;
-import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
-import org.eclipse.wst.common.componentcore.resources.IVirtualFolder;
-import org.eclipse.wst.common.project.facet.core.IFacetedProject;
-import org.eclipse.wst.common.project.facet.core.IProjectFacet;
-import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
-import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
-
-/**
- * Web app utility methods
- */
-public class WebrootUtil {
-
-	/**
-	 * get the webpath for the project path. The project path is something like
-	 * "/projectname/webroot/filename.jsp", or "/projectname/webroot/folder".
-	 * The project information should be removed from project path, e.g,
-	 * "/filename.jsp" or "/folder/*";
-	 * 
-	 * @param path
-	 * @return the web path
-	 */
-	public static String getWebPath(IPath path) {
-		String strWebrootPath = ""; //$NON-NLS-1$
-		IProject project = WorkspaceUtil.getProjectFor(path);
-		IPath webContentPath = getWebContentPath(project);
-		if (webContentPath != null && webContentPath.isPrefixOf(path)) {
-			int start = path.matchingFirstSegments(webContentPath);
-			String[] segments = path.segments();
-			for (int i = start, n = path.segmentCount(); i < n; i++) {
-				strWebrootPath = strWebrootPath
-						+ IFileFolderConstants.PATH_SEPARATOR + segments[i];
-			}
-		}
-		return strWebrootPath;
-	}
-
-	/**
-	 * To see if a resource is under the webcontent folder.
-	 * 
-	 * @param resource
-	 * @return true if resource is within the web content folder hierarchy
-	 */
-	public static boolean isUnderWebContentFolder(IResource resource) {
-		IPath webContentPath = getWebContentPath(resource.getProject());
-		if (webContentPath != null) {
-			return webContentPath.isPrefixOf(resource.getFullPath());
-		}
-		return true;
-	}
-
-	/**
-	 * @param project
-	 * @return full path to web content folder
-	 */
-	public static IPath getWebContentPath(IProject project) {
-		if (project != null) {
-			IVirtualComponent component = ComponentCore.createComponent(project);
-			if (component != null) {
-				IVirtualFolder rootFolder = component.getRootFolder();
-				if (rootFolder != null) {
-					IContainer underlyingFolder = rootFolder.getUnderlyingFolder();
-					if (underlyingFolder != null) {
-						return underlyingFolder.getFullPath();
-					}
-				}
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Return the name of the web content folder. i.e, "WebContent"
-	 * 
-	 * @param project
-	 * @return the web content folder name
-	 */
-	public static String getWebContentFolderName(IProject project) {
-		IPath webContentPath = getWebContentPath(project);
-		if (webContentPath != null)
-			return webContentPath.lastSegment();
-		return null;
-	}
-
-	/**
-	 * @param project
-	 * @return folder where for web content
-	 */
-	public static IFolder getWebContentFolder(IProject project) {
-		IPath webContentPath = getWebContentPath(project);
-		IFolder folder = null;
-		if (webContentPath != null) {
-			folder = project.getFolder(webContentPath.removeFirstSegments(1));
-		}
-		return folder;
-	}
-
-	/**
-	 * return the depth of webcontent folder. For example, if the webcontent
-	 * folder path is /projectname/webContent, then return 2, if it's
-	 * /projectname/a/webContent, then return 3.
-	 * 
-	 * @param project
-	 * @return the depth of webcontent folder
-	 */
-	public static int getWebContentFolderDepth(IProject project) {
-		if (project != null) {
-			IPath webContentPath = getWebContentPath(project);
-			if (webContentPath != null) {
-				return webContentPath.segmentCount();
-			}
-		}
-		// default to 2
-		return 2;
-	}
-
-	/**
-	 * determine the path of web file is valid or not
-	 * 
-	 * @param path -
-	 *            the path of web file
-	 * @return - true - valid web file
-	 */
-	public static boolean isValidWebFile(IPath path) {
-		String[] jspExtensions = getJSPFileExtensions();
-
-		String extension = path.getFileExtension();
-		if (extension != null
-				&& Arrays.asList(jspExtensions).contains(extension))
-		{
-				return true;
-		}
-
-		return false;
-	}
-
-	/**
-	 * get the webpath for the project path. The project path is something like
-	 * "/projectname/webroot/filename.jsp", or "/projectname/webroot/folder".
-	 * The project information should be removed from project path, e.g,
-	 * "/filename.jsp" or "/folder/*";
-	 * 
-	 * @param strPath -
-	 *            the project path
-	 * @return - web path remove from "/projectname/webroot"
-	 * @deprecated use getWebPath(IPath path) instead.
-	 */
-	public static String getWebPath(String strPath) {
-		String strWebrootPath = ""; //$NON-NLS-1$
-		if (strPath != null) {
-			IPath path = new Path(strPath);
-			return getWebPath(path);
-		}
-		return strWebrootPath;
-	}
-
-	/**
-	 * @param strWebPath
-	 * @return the page name
-	 */
-	public static String getPageNameFromWebPath(String strWebPath) {
-		String pageName = strWebPath;
-
-		if (pageName.startsWith(IFileFolderConstants.PATH_SEPARATOR)) {
-			pageName = pageName.substring(1);
-		}
-
-		String[] jspExtensions = getJSPFileExtensions();
-		for (int i = 0, n = jspExtensions.length; i < n; i++) {
-			String extension = IFileFolderConstants.DOT + jspExtensions[i];
-			if (pageName.endsWith(extension)) {
-			pageName = pageName.substring(0, pageName.length()
-						- extension.length());
-				break;
-		}
-		}
-
-		return pageName;
-	}
-	/**
-	 * Get the JSP file extension from Eclipse preference
-	 * Windows->Preferences->General->Content Types
-	 * 
-	 * @return String Array for JSP file extensions
-	 */
-	public static String[] getJSPFileExtensions() {
-		IContentTypeManager typeManager = Platform.getContentTypeManager();
-		IContentType jspContentType = typeManager
-				.getContentType("org.eclipse.jst.jsp.core.jspsource"); //$NON-NLS-1$
-		if (jspContentType != null) {
-			return jspContentType
-					.getFileSpecs(IContentType.FILE_EXTENSION_SPEC);
-		}
-		return null;
-	}
-
-	/**
-	 * Tests if the passed IProject instance is a valid JSF project in the
-	 * following ways:
-	 * <ul>
-	 * <li>project is not null and is accessible, </li>
-	 * <li>project has the "jst.web" facet set on it.</li> 
-	 * </ul>
-	 * 
-	 * @param project
-	 *            IProject instance to be tested.
-	 * @return true if the IProject instance is a valid JSF project, else false.
-	 */
-	public static boolean isValidWebProject(IProject project) {
-		boolean isValid = false;
-		// check for null or inaccessible project
-		if (project != null && project.isAccessible()) {
-            // TODO: this was jst.jsf before, but we are checking for jst.web
-            // the javadoc seems out of sync with the method name
-			// check for "jst.web" facet on project
-			try {
-				IFacetedProject facetedProject = ProjectFacetsManager
-						.create(project);
-				if (facetedProject != null) {
-					Set projectFacets = facetedProject.getProjectFacets();
-					Iterator itProjectFacets = projectFacets.iterator();
-					while (itProjectFacets.hasNext()) {
-						IProjectFacetVersion projectFacetVersion = (IProjectFacetVersion) itProjectFacets
-								.next();
-						IProjectFacet projectFacet = projectFacetVersion
-								.getProjectFacet();
-						if ("jst.web".equals(projectFacet.getId())) { //$NON-NLS-1$
-							isValid = true;
-							break;
-						}
-					}
-				}
-			} catch (CoreException ce) {
-                JSFUICommonPlugin.getLogger(WebrootUtil.class).error("checking web project", ce); //$NON-NLS-1$
-			}
-		}
-		return isValid;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/utils/WorkspaceUtil.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/utils/WorkspaceUtil.java
deleted file mode 100644
index 6c5dcba..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/utils/WorkspaceUtil.java
+++ /dev/null
@@ -1,283 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.utils;
-
-import java.io.ByteArrayInputStream;
-import java.io.File;
-import java.io.InputStream;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspaceRunnable;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jst.jsf.common.ui.IFileFolderConstants;
-import org.eclipse.jst.jsf.common.ui.JSFUICommonPlugin;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-
-/**
- * TODO: This class should be abstract to common utility.
- * 
- * This class implements management of resource in a workspace.
- */
-public final class WorkspaceUtil {
-	/** log instance */
-	private static final Logger log = JSFUICommonPlugin
-			.getLogger(WorkspaceUtil.class);
-
-	private WorkspaceUtil() {
-	    // no external instantiation
-	}
-
-	/**
-	 * Create the given file in the workspace resource info tree.
-	 * @param resource 
-	 * @param contents 
-	 */
-	public static void ensureExistsInWorkspace(final IFile resource,
-			final InputStream contents) {
-		if (resource == null) {
-			return;
-		}
-		IWorkspaceRunnable body = new IWorkspaceRunnable() {
-			public void run(IProgressMonitor monitor) throws CoreException {
-				if (resource.exists()) {
-					resource.setContents(contents, true, false, null);
-				} else {
-					ensureExistsInWorkspace(resource.getParent(), true);
-					resource.create(contents, true, null);
-				}
-			}
-		};
-		try {
-			ResourcesPlugin.getWorkspace().run(body, null);
-		} catch (CoreException e) {
-			// Test.EclipseWorkspaceTest.Error.FileCreationInWorkspace = Fail in
-			// creating file:{0} in the workspace resource info tree.
-			log
-					.error(
-							"Test.EclipseWorkspaceTest.Error.FileCreationInWorkspace", resource.getName(), e);//$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * Create the given file in the workspace resource info tree.
-	 * @param resource 
-	 * @param contents 
-	 */
-	public static void ensureExistsInWorkspace(IFile resource, String contents) {
-		// FIXME: We'll need some way for handing file encoding.
-		ensureExistsInWorkspace(resource, new ByteArrayInputStream(contents
-				.getBytes()));
-	}
-
-	/**
-	 * Create the given resource in the workspace resource info tree.
-	 * @param resource 
-	 * @param local 
-	 */
-	public static void ensureExistsInWorkspace(final IResource resource,
-			final boolean local) {
-		IWorkspaceRunnable body = new IWorkspaceRunnable() {
-			public void run(IProgressMonitor monitor) throws CoreException {
-				create(resource, local);
-			}
-		};
-		try {
-			ResourcesPlugin.getWorkspace().run(body, null);
-		} catch (CoreException e) {
-			// Test.EclipseWorkspaceTest.Error.ResourceCreationInWorkspace =
-			// Fail in creating resource:{0} in the workspace resource info
-			// tree.
-			log
-					.error(
-							"Test.EclipseWorkspaceTest.Error.ResourceCreationInWorkspace", resource.getName(), e);//$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * crate the resource if the resource is not existed, create a new one.
-	 * 
-	 * @param resource -
-	 *            resource instance
-	 * @param local -
-	 *            a flag controlling whether or not the folder will be local
-	 *            after the creation
-	 * @throws CoreException
-	 */
-	protected static void create(final IResource resource, boolean local)
-			throws CoreException {
-		if (resource == null || resource.exists()) {
-			return;
-		}
-		if (!resource.getParent().exists()) {
-			create(resource.getParent(), local);
-		}
-		switch (resource.getType()) {
-		case IResource.FILE:
-			((IFile) resource).create(local ? new ByteArrayInputStream(
-					new byte[0]) : null, true, getMonitor());
-			break;
-		case IResource.FOLDER:
-			((IFolder) resource).create(true, local, getMonitor());
-			break;
-		case IResource.PROJECT:
-			((IProject) resource).create(getMonitor());
-			((IProject) resource).open(getMonitor());
-			break;
-		}
-	}
-
-	/**
-	 * create and return a NullProgressMonitor
-	 * 
-	 * @return - NullProgressMonitor
-	 */
-	public static IProgressMonitor getMonitor() {
-		return new NullProgressMonitor();
-	}
-
-	/**
-	 * Get the project reference for a given path
-	 * 
-	 * @param path -
-	 *            the path
-	 * @return IProject - the project reference
-	 */
-	public static IProject getProjectFor(IPath path) {
-		String[] segs = path.segments();
-		String projectPath = new String();
-		IProject[] projects = ResourcesPlugin.getWorkspace().getRoot()
-				.getProjects();
-		IProject project = null;
-		for (int p = 0; p < projects.length; p++) {
-			if (projects[p].isOpen()) {
-				for (int s = 0; s < segs.length; s++) {
-					if (segs[s].equalsIgnoreCase(projects[p].getName())) {
-						// Once we have a match on the project name, then
-						// the remainder of the segments equals the project path
-						for (int s2 = s + 1; s2 < segs.length; s2++) {
-							projectPath = projectPath
-									+ IFileFolderConstants.PATH_SEPARATOR
-									+ segs[s2];
-						}
-						project = projects[p];
-						break;
-					}
-				}
-			}
-		}
-		if (project == null) {
-			return null;
-		}
-
-		// TODO: still don't understand why this refreshLocal is necessary
-		// for now, going to only allow it if this method is called 
-		// when the tree isn't locked.  This shouldn't cause a regression, since
-		// when the call fails currently things keep on going due to the catch
-		if (!project.getWorkspace().isTreeLocked())
-		{
-    		try {
-    			project.refreshLocal(IResource.DEPTH_INFINITE, null);
-    		} catch (CoreException e) {
-                // TODO C.B.:pushing this down to a warning because it creates really
-                // spurious output.  Don't know why we are calling refreshLocal at all.
-                JSFUICommonPlugin.getLogger(WorkspaceUtil.class).info("Error.RefreshingLocal", e); //$NON-NLS-1$
-    		}
-		}
-		
-		IResource res = project.findMember(new Path(projectPath));
-		if ((res != null) && (res.exists())) {
-			return project;
-		}
-		return null;
-	}
-
-	/**
-	 * Get the project reference for a given file
-	 * 
-	 * @param file -
-	 *            the IFile file reference
-	 * @return IProject - the project reference
-	 */
-	public static IProject getProjectFor(IFile file) {
-		IPath testPath = new Path(file.getFullPath().toOSString());
-		return getProjectFor(testPath);
-	}
-
-	/**
-	 * Get the project reference for a given file
-	 * 
-	 * @param file -
-	 *            the File file reference
-	 * @return IProject - the project reference
-	 */
-	public static IProject getProjectFor(File file) {
-		IPath testPath = new Path(file.getAbsolutePath());
-		return getProjectFor(testPath);
-	}
-
-	/**
-	 * Get the project-relative resource reference for a given path
-	 * 
-	 * @param path -
-	 *            the path
-	 * @return IResource - the project-relative resource
-	 */
-	public static IResource getProjectRelativeResource(IPath path) {
-		String[] segs = path.segments();
-		String projectPath = new String();
-		IProject[] projects = ResourcesPlugin.getWorkspace().getRoot()
-				.getProjects();
-		IProject project = null;
-		for (int p = 0; p < projects.length; p++) {
-			if (projects[p].isOpen()) {
-				for (int s = 0; s < segs.length; s++) {
-					if (segs[s].equalsIgnoreCase(projects[p].getName())) {
-						// Once we have a match on the project name, then
-						// the remainder of the segments equals the project path
-						for (int s2 = s + 1; s2 < segs.length; s2++) {
-							projectPath = projectPath
-									+ IFileFolderConstants.PATH_SEPARATOR
-									+ segs[s2];
-						}
-						project = projects[p];
-						break;
-					}
-				}
-			}
-		}
-		if (project == null) {
-			return null;
-		}
-
-		return project.getFile(projectPath);
-	}
-
-	/**
-	 * Get the project-relative resource reference for a given file
-	 * 
-	 * @param file -
-	 *            the File file reference
-	 * @return IResource - the project-relative resource
-	 */
-	public static IResource getProjectRelativeResource(File file) {
-		IPath testPath = new Path(file.getAbsolutePath());
-		return getProjectRelativeResource(testPath);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/.classpath b/jsf/plugins/org.eclipse.jst.jsf.core/.classpath
deleted file mode 100644
index 304e861..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/.cvsignore b/jsf/plugins/org.eclipse.jst.jsf.core/.cvsignore
deleted file mode 100644
index 117a1fe..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/.cvsignore
+++ /dev/null
@@ -1,5 +0,0 @@
-bin
-@dot*
-temp.folder
-build.xml
-javaCompiler...args
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/.options b/jsf/plugins/org.eclipse.jst.jsf.core/.options
deleted file mode 100644
index 9f678f4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/.options
+++ /dev/null
@@ -1,15 +0,0 @@
-# Debugging options for the org.eclipse.jst.jsf.core
-
-# Turn on general debugging for the org.eclipse.jsf.core plugin.
-org.eclipse.jst.jsf.core/debug=false
-
-org.eclipse.jst.jsf.core/designtime/view/jsptagregistry=false
-org.eclipse.jst.jsf.core/designtime/view/jsptagregistry/changes=false
-org.eclipse.jst.jsf.core/designtime/view/jsptagregistry/perf=false
-
-org.eclipse.jst.jsf.core/designtime/view/tldregistrymanager=false
-
-org.eclipse.jst.jsf.core/designtime/view/jsptagpersistence=false
-
-org.eclipse.jst.jsf.core/designtime/view/jsptagintrospection=false
-org.eclipse.jst.jsf.core/designtime/view/jsptagintrospection/perf=false
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/.project b/jsf/plugins/org.eclipse.jst.jsf.core/.project
deleted file mode 100644
index 0cd3e27..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.jst.jsf.core</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/.settings/org.eclipse.core.resources.prefs b/jsf/plugins/org.eclipse.jst.jsf.core/.settings/org.eclipse.core.resources.prefs
deleted file mode 100644
index 7a97ba4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/.settings/org.eclipse.core.resources.prefs
+++ /dev/null
@@ -1,4 +0,0 @@
-#Mon Jun 04 13:52:01 PDT 2007
-eclipse.preferences.version=1
-encoding/<project>=ISO-8859-1
-instance/org.eclipse.core.net/org.eclipse.core.net.hasMigrated=true
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/.settings/org.eclipse.jdt.core.prefs b/jsf/plugins/org.eclipse.jst.jsf.core/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 546cb48..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,82 +0,0 @@
-#Mon Jun 30 15:55:38 PDT 2008
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=disabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.5
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.doc.comment.support=enabled
-org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.autoboxing=warning
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=ignore
-org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
-org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
-org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
-org.eclipse.jdt.core.compiler.problem.invalidJavadoc=error
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocComments=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.missingJavadocTags=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=error
-org.eclipse.jdt.core.compiler.problem.nullReference=ignore
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
-org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore
-org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=ignore
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=ignore
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=error
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=error
-org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
-org.eclipse.jdt.core.compiler.problem.unusedLocal=error
-org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
-org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
-org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.5
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/.settings/org.eclipse.jdt.ui.prefs b/jsf/plugins/org.eclipse.jst.jsf.core/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644
index 82eb6c1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,3 +0,0 @@
-#Fri Apr 06 18:25:15 PDT 2007
-eclipse.preferences.version=1
-org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8"?><templates/>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/.settings/org.eclipse.pde.prefs b/jsf/plugins/org.eclipse.jst.jsf.core/.settings/org.eclipse.pde.prefs
deleted file mode 100644
index b6d2441..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/.settings/org.eclipse.pde.prefs
+++ /dev/null
@@ -1,22 +0,0 @@
-#Fri May 30 11:46:47 PDT 2008
-compilers.f.unresolved-features=1
-compilers.f.unresolved-plugins=1
-compilers.incompatible-environment=1
-compilers.p.build=1
-compilers.p.deprecated=1
-compilers.p.discouraged-class=1
-compilers.p.internal=1
-compilers.p.missing-packages=0
-compilers.p.no-required-att=0
-compilers.p.not-externalized-att=0
-compilers.p.unknown-attribute=1
-compilers.p.unknown-class=1
-compilers.p.unknown-element=1
-compilers.p.unknown-identifier=1
-compilers.p.unknown-resource=1
-compilers.p.unresolved-ex-points=0
-compilers.p.unresolved-import=0
-compilers.s.create-docs=false
-compilers.s.doc-folder=doc
-compilers.s.open-tags=1
-eclipse.preferences.version=1
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/META-INF/MANIFEST.MF b/jsf/plugins/org.eclipse.jst.jsf.core/META-INF/MANIFEST.MF
deleted file mode 100644
index e818a0c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,123 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %plugin.name
-Bundle-SymbolicName: org.eclipse.jst.jsf.core; singleton:=true
-Bundle-Version: 1.3.1.qualifier
-Bundle-Activator: org.eclipse.jst.jsf.core.internal.JSFCorePlugin
-Bundle-Vendor: %plugin.provider
-Bundle-Localization: plugin
-Require-Bundle: org.eclipse.core.runtime;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.core.resources;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.wst.common.project.facet.core;bundle-version="[1.2.0,2.0.0)",
- org.eclipse.jst.j2ee.web;bundle-version="[1.1.0,1.2.0)",
- org.eclipse.jst.jsf.facesconfig;bundle-version="[1.0.0,2.0.0)",
- org.eclipse.jdt.core;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.jst.j2ee;bundle-version="[1.1.0,1.2.0)",
- org.eclipse.jst.j2ee.core;bundle-version="[1.1.0,1.3.0)",
- org.eclipse.wst.xml.core;bundle-version="[1.1.0,1.2.0)",
- org.eclipse.wst.common.frameworks.ui;bundle-version="[1.1.0,2.0.0)",
- org.eclipse.jst.jsp.core;bundle-version="[1.1.0,1.3.0)",
- org.eclipse.jst.jsf.common;bundle-version="[1.0.0,2.0.0)",
- org.eclipse.jface.text;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.wst.sse.core;bundle-version="[1.1.0,1.2.0)",
- org.eclipse.wst.html.core;bundle-version="[1.1.0,1.2.0)",
- org.eclipse.wst.validation;bundle-version="[1.1.0,2.0.0)",
- org.eclipse.wst.common.emf;bundle-version="[1.1.103,2.0.0)",
- org.eclipse.jem.util;bundle-version="[2.0.0,3.0.0)",
- org.eclipse.emf.common;bundle-version="[2.2.0,3.0.0)",
- org.eclipse.emf.ecore;bundle-version="[2.2.0,3.0.0)",
- org.eclipse.core.commands;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.emf.ecore.xmi;bundle-version="[2.2.0,3.0.0)",
- org.eclipse.emf.edit;bundle-version="[2.2.0,3.0.0)",
- org.eclipse.jst.common.project.facet.core;bundle-version="[1.1.0,2.0.0)",
- org.eclipse.jst.jsf.common.runtime;bundle-version="[1.0.0,2.0.0)",
- org.eclipse.jem.proxy;bundle-version="[2.0.0,3.0.0)",
- javax.servlet;bundle-version="[2.4.0,3.0.0)",
- javax.servlet.jsp;bundle-version="[2.0.0,3.0.0)",
- org.eclipse.jst.common.frameworks;bundle-version="[1.1.102,1.2.0)",
- org.eclipse.wst.css.core;bundle-version="[1.1.200,1.2.0)",
- org.eclipse.debug.core;bundle-version="[3.5.0,4.0.0)",
- org.eclipse.ui;bundle-version="3.6.0"
-Bundle-ActivationPolicy: lazy;exclude:="org.eclipse.jst.jsf.core.internal.contenttype"
-Export-Package: org.eclipse.jst.jsf.core,
- org.eclipse.jst.jsf.core.internal;x-friends:="org.eclipse.jst.jsf.core.tests,org.eclipse.jst.jsf.ui,org.eclipse.jst.jsf.ui.tests",
- org.eclipse.jst.jsf.core.internal.contentassist.el;x-friends:="org.eclipse.jst.jsf.contentassist.tests",
- org.eclipse.jst.jsf.core.internal.contenttype;x-internal:=true,
- org.eclipse.jst.jsf.core.internal.jem;x-internal:=true,
- org.eclipse.jst.jsf.core.internal.jsflibraryconfig;x-friends:="org.eclipse.jst.jsf.core.tests,org.eclipse.jst.jsf.ui.tests,org.eclipse.jst.pagedesigner.tests",
- org.eclipse.jst.jsf.core.internal.jsflibraryregistry;
-  x-friends:="org.eclipse.jst.jsf.core.tests,
-   org.eclipse.jst.jsf.ui,
-   org.eclipse.jst.jsf.ui.tests,
-   org.eclipse.jst.pagedesigner.tests",
- org.eclipse.jst.jsf.core.internal.jsflibraryregistry.adapter;x-friends:="org.eclipse.jst.jsf.core.tests,org.eclipse.jst.jsf.ui,org.eclipse.jst.jsf.ui.tests",
- org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl;x-friends:="org.eclipse.jst.jsf.core.tests,org.eclipse.jst.jsf.ui,org.eclipse.jst.jsf.ui.tests",
- org.eclipse.jst.jsf.core.internal.jsflibraryregistry.util;x-friends:="org.eclipse.jst.jsf.core.tests,org.eclipse.jst.jsf.ui,org.eclipse.jst.jsf.ui.tests",
- org.eclipse.jst.jsf.core.internal.launch;x-internal:=true,
- org.eclipse.jst.jsf.core.internal.project.facet;x-friends:="org.eclipse.jst.jsf.core.tests,org.eclipse.jst.jsf.ui,org.eclipse.jst.jsf.ui.tests",
- org.eclipse.jst.jsf.core.internal.region;x-internal:=true,
- org.eclipse.jst.jsf.core.internal.tld;x-friends:="org.eclipse.jst.pagedesigner,org.eclipse.jst.jsf.core.tests",
- org.eclipse.jst.jsf.core.jsfappconfig,
- org.eclipse.jst.jsf.core.jsfappconfig.internal;x-internal:=true,
- org.eclipse.jst.jsf.core.jsflibraryconfiguration,
- org.eclipse.jst.jsf.core.jsflibraryconfiguration.internal;x-friends:="org.eclipse.jst.jsf.core.tests",
- org.eclipse.jst.jsf.core.jsflibraryregistry,
- org.eclipse.jst.jsf.core.jsflibraryregistry.internal;x-friends:="org.eclipse.jst.jsf.core.tests",
- org.eclipse.jst.jsf.core.metadata.internal;x-internal:=true,
- org.eclipse.jst.jsf.core.set.constraint,
- org.eclipse.jst.jsf.core.set.mapping,
- org.eclipse.jst.jsf.core.tagmatcher,
- org.eclipse.jst.jsf.designtime,
- org.eclipse.jst.jsf.designtime.context,
- org.eclipse.jst.jsf.designtime.el,
- org.eclipse.jst.jsf.designtime.internal;x-internal:=true,
- org.eclipse.jst.jsf.designtime.internal.jsp;x-internal:=true,
- org.eclipse.jst.jsf.designtime.internal.resolver;x-internal:=true,
- org.eclipse.jst.jsf.designtime.internal.resources;x-internal:=true,
- org.eclipse.jst.jsf.designtime.internal.symbols;x-friends:="org.eclipse.jst.jsf.designtime.tests",
- org.eclipse.jst.jsf.designtime.internal.view;x-internal:=true,
- org.eclipse.jst.jsf.designtime.internal.view.mapping;x-internal:=true,
- org.eclipse.jst.jsf.designtime.internal.view.mapping.mappers;x-internal:=true,
- org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping;x-internal:=true,
- org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.impl;x-internal:=true,
- org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.util;x-internal:=true,
- org.eclipse.jst.jsf.designtime.internal.view.model;x-internal:=true,
- org.eclipse.jst.jsf.designtime.internal.view.model.jsp;x-internal:=true,
- org.eclipse.jst.jsf.designtime.internal.view.model.jsp.analyzer;x-friends:="org.eclipse.jst.jsf.designtime.tests",
- org.eclipse.jst.jsf.designtime.internal.view.model.jsp.persistence;x-internal:=true,
- org.eclipse.jst.jsf.designtime.internal.view.model.jsp.registry;x-friends:="org.eclipse.jst.jsf.designtime.tests",
- org.eclipse.jst.jsf.designtime.resolver,
- org.eclipse.jst.jsf.designtime.symbols,
- org.eclipse.jst.jsf.metadataprocessors,
- org.eclipse.jst.jsf.metadataprocessors.features,
- org.eclipse.jst.jsf.metadataprocessors.internal;x-friends:="org.eclipse.jst.jsf.metadata.tests",
- org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos;
-  x-friends:="org.eclipse.jst.pagedesigner,
-   org.eclipse.jst.pagedesigner.tests,
-   org.eclipse.jst.jsf.metadata.tests,
-   org.eclipse.jst.jsf.facelet.core,
-   org.eclipse.jst.jsf.facelet.ui",
- org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.impl;
-  x-friends:="org.eclipse.jst.pagedesigner,
-   org.eclipse.jst.pagedesigner.tests,
-   org.eclipse.jst.jsf.metadata.tests,
-   org.eclipse.jst.jsf.facelet.core,
-   org.eclipse.jst.jsf.facelet.ui",
- org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.util;
-  x-friends:="org.eclipse.jst.pagedesigner,
-   org.eclipse.jst.pagedesigner.tests,
-   org.eclipse.jst.jsf.metadata.tests,
-   org.eclipse.jst.jsf.facelet.core,
-   org.eclipse.jst.jsf.facelet.ui",
- org.eclipse.jst.jsf.taglibprocessing.attributevalues,
- org.eclipse.jst.jsf.validation.internal;x-friends:="org.eclipse.jst.jsf.ui",
- org.eclipse.jst.jsf.validation.internal.appconfig;x-friends:="org.eclipse.jst.jsf.ui,org.eclipse.jst.jsf.core.tests",
- org.eclipse.jst.jsf.validation.internal.constraints;x-internal:=true,
- org.eclipse.jst.jsf.validation.internal.constraints.impl;x-internal:=true,
- org.eclipse.jst.jsf.validation.internal.constraints.util;x-internal:=true,
- org.eclipse.jst.jsf.validation.internal.el;x-friends:="org.eclipse.jst.jsf.ui,org.eclipse.jst.jsf.validation.el.tests",
- org.eclipse.jst.jsf.validation.internal.el.diagnostics;x-friends:="org.eclipse.jst.jsf.validation.el.tests",
- org.eclipse.jst.jsf.validation.internal.el.operators;x-internal:=true,
- org.eclipse.jst.jsf.validation.internal.facelet,
- org.eclipse.jst.jsf.validation.internal.strategy;x-internal:=true
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/about.html b/jsf/plugins/org.eclipse.jst.jsf.core/about.html
deleted file mode 100644
index 90bd74d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/about.html
+++ /dev/null
@@ -1,22 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<head>
-<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
-<title>About</title>
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>June, 2008</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise indicated below, the Content is provided to you under the terms and conditions of the
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content.</p>
-
-</body>
-</html>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/build.properties b/jsf/plugins/org.eclipse.jst.jsf.core/build.properties
deleted file mode 100644
index d277249..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/build.properties
+++ /dev/null
@@ -1,22 +0,0 @@
-###############################################################################
-# Copyright (c) 2005 Oracle Corporation.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#    Gerry Kessler - initial API and implementation
-###############################################################################
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               .,\
-               plugin.xml,\
-               plugin.properties,\
-               schema/,\
-               about.html,\
-               .options,\
-               jars/
-javacSource=1.5
-javacTarget=1.5
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/jars/fake_el.jar b/jsf/plugins/org.eclipse.jst.jsf.core/jars/fake_el.jar
deleted file mode 100644
index 78b04b1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/jars/fake_el.jar
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/jars/fake_jsp_21.jar b/jsf/plugins/org.eclipse.jst.jsf.core/jars/fake_jsp_21.jar
deleted file mode 100644
index 66ce8d0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/jars/fake_jsp_21.jar
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/model/PaletteInfos.ecore b/jsf/plugins/org.eclipse.jst.jsf.core/model/PaletteInfos.ecore
deleted file mode 100644
index ab8633b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/model/PaletteInfos.ecore
+++ /dev/null
@@ -1,81 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ecore:EPackage xmi:version="2.0"
-    xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="paletteinfos"
-    nsURI="http://org.eclipse.jsf.pagedesigner/paletteInfos.ecore" nsPrefix="pi">
-  <eClassifiers xsi:type="ecore:EClass" name="PaletteInfos">
-    <eOperations name="findPaletteInfoById" eType="#//PaletteInfo">
-      <eParameters name="id" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    </eOperations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="infos" upperBound="-1"
-        eType="#//PaletteInfo" containment="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="item"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="PaletteInfo">
-    <eOperations name="isExpert" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-    <eOperations name="isHidden" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="tag" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="displayLabel" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="display-label"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="description" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="expert" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBooleanObject">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="hidden" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBooleanObject">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="smallIcon" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="small-icon"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="largeIcon" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="large-icon"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="tagCreation" eType="#//TagCreationInfo">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="tag-create"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="TagCreationInfo">
-    <eStructuralFeatures xsi:type="ecore:EReference" name="attributes" upperBound="-1"
-        eType="#//TagCreationAttribute" containment="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="attribute"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="template" eType="ecore:EDataType ../../../plugin/org.eclipse.emf.ecore/model/XMLType.ecore#//AnySimpleType"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="TagCreationTemplate">
-    <eStructuralFeatures xsi:type="ecore:EReference" name="template" eType="ecore:EClass http://www.eclipse.org/emf/2002/Ecore#//EObject"
-        containment="true"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="TagCreationAttribute">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="value" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-  </eClassifiers>
-</ecore:EPackage>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/model/PaletteInfos.genmodel b/jsf/plugins/org.eclipse.jst.jsf.core/model/PaletteInfos.genmodel
deleted file mode 100644
index 44d5d22..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/model/PaletteInfos.genmodel
+++ /dev/null
@@ -1,46 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<genmodel:GenModel xmi:version="2.0"
-    xmlns:xmi="http://www.omg.org/XMI" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore"
-    xmlns:genmodel="http://www.eclipse.org/emf/2002/GenModel" copyrightText="Copyright (c) 2007 Oracle Corporation"
-    modelDirectory="/org.eclipse.jst.jsf.core/src" editDirectory="/org.eclipse.jst.jsf.core/src"
-    editorDirectory="/org.eclipse.jst.jsf.core/src" modelPluginID="org.eclipse.jst.jsf.core"
-    modelName="PaletteInfos" editPluginClass="org.eclipse.jst.jsf.core.internal.JSFCorePlugin"
-    editorPluginClass="org.eclipse.jst.jsf.core.internal.JSFCorePlugin" testsDirectory="/org.eclipse.jst.jsf.core/src"
-    testSuiteClass="org.eclipse.jst.jsf.core.internal.JSFCorePlugin" importerID="org.eclipse.emf.importer.ecore"
-    editPluginID="org.eclipse.jst.jsf.core" usedGenPackages="platform:/plugin/org.eclipse.emf.ecore/model/XMLType.genmodel#//type">
-  <foreignModel>PaletteInfos.ecore</foreignModel>
-  <genPackages prefix="PaletteInfos" basePackage="org.eclipse.jst.jsf.tagdisplay.internal"
-      disposableProviderFactory="true" generateExampleClass="false" multipleEditorPages="false"
-      generateModelWizard="false" ecorePackage="PaletteInfos.ecore#/">
-    <genClasses ecoreClass="PaletteInfos.ecore#//PaletteInfos">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference PaletteInfos.ecore#//PaletteInfos/infos"/>
-      <genOperations ecoreOperation="PaletteInfos.ecore#//PaletteInfos/findPaletteInfoById">
-        <genParameters ecoreParameter="PaletteInfos.ecore#//PaletteInfos/findPaletteInfoById/id"/>
-      </genOperations>
-    </genClasses>
-    <genClasses ecoreClass="PaletteInfos.ecore#//PaletteInfo">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute PaletteInfos.ecore#//PaletteInfo/id"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute PaletteInfos.ecore#//PaletteInfo/tag"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute PaletteInfos.ecore#//PaletteInfo/displayLabel"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute PaletteInfos.ecore#//PaletteInfo/description"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute PaletteInfos.ecore#//PaletteInfo/expert"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute PaletteInfos.ecore#//PaletteInfo/hidden"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute PaletteInfos.ecore#//PaletteInfo/smallIcon"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute PaletteInfos.ecore#//PaletteInfo/largeIcon"/>
-      <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference PaletteInfos.ecore#//PaletteInfo/tagCreation"/>
-      <genOperations ecoreOperation="PaletteInfos.ecore#//PaletteInfo/isExpert"/>
-      <genOperations ecoreOperation="PaletteInfos.ecore#//PaletteInfo/isHidden"/>
-    </genClasses>
-    <genClasses ecoreClass="PaletteInfos.ecore#//TagCreationInfo">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference PaletteInfos.ecore#//TagCreationInfo/attributes"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute PaletteInfos.ecore#//TagCreationInfo/template"/>
-    </genClasses>
-    <genClasses ecoreClass="PaletteInfos.ecore#//TagCreationTemplate">
-      <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference PaletteInfos.ecore#//TagCreationTemplate/template"/>
-    </genClasses>
-    <genClasses ecoreClass="PaletteInfos.ecore#//TagCreationAttribute">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute PaletteInfos.ecore#//TagCreationAttribute/id"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute PaletteInfos.ecore#//TagCreationAttribute/value"/>
-    </genClasses>
-  </genPackages>
-</genmodel:GenModel>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/model/componentMapping.ecore b/jsf/plugins/org.eclipse.jst.jsf.core/model/componentMapping.ecore
deleted file mode 100644
index 1c882cf..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/model/componentMapping.ecore
+++ /dev/null
@@ -1,143 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ecore:EPackage xmi:version="2.0"
-    xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="viewmapping"
-    nsURI="http://org.eclipse.jst.jsf.core/componentMapping.ecore" nsPrefix="viewMap">
-  <eClassifiers xsi:type="ecore:EClass" name="TagMapping">
-    <eOperations name="findBestMapping">
-      <eParameters name="jsfVersion" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-      <eParameters name="libVersion" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    </eOperations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="versionedTagToViewMappings"
-        upperBound="-1" eType="#//TagToViewObjectMapping" containment="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="versionedTagToViewMappings"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="customConversionFactoryId"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="customConversionFactoryId"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="beanMappedProperties" upperBound="-1"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString" defaultValueLiteral="">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="beanMappedProperties"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="TagToViewObjectMapping">
-    <eStructuralFeatures xsi:type="ecore:EReference" name="typeInfo" eType="#//ClassTypeInfo_"
-        containment="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="typeInfo"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="minJSFVersion" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"
-        defaultValueLiteral="1.1">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="minVersion"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="minLibraryVersion" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"
-        defaultValueLiteral="">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="minLibraryVersion"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ClassTypeInfo_">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="className" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="className"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="superClasses" upperBound="-1"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="superClasses"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="interfaces" upperBound="-1"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="interfaces"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ComponentTypeInfo_" eSuperTypes="#//ClassTypeInfo_">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="componentType" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="componentType"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="componentFamily" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="componentFamily"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="renderType" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="renderType"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ConverterTypeInfo_" eSuperTypes="#//ClassTypeInfo_">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="converterId" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="converterId"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="forClasses" upperBound="-1"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="forClass"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ValidatorTypeInfo_" eSuperTypes="#//ClassTypeInfo_">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="validatorId" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="validatorId"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="AttributeToPropertyMapping">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="propertyName" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="propertyName"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="elAllowed" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"
-        defaultValueLiteral="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="elAllowed"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="customConversionFactoryId"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="customConversionFactoryId"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-</ecore:EPackage>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/model/componentMapping.genmodel b/jsf/plugins/org.eclipse.jst.jsf.core/model/componentMapping.genmodel
deleted file mode 100644
index 19135f6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/model/componentMapping.genmodel
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<genmodel:GenModel xmi:version="2.0"
-    xmlns:xmi="http://www.omg.org/XMI" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore"
-    xmlns:genmodel="http://www.eclipse.org/emf/2002/GenModel" modelDirectory="/org.eclipse.jst.jsf.core/src"
-    modelPluginID="org.eclipse.jst.jsf.core" modelName="ComponentMapping" importerID="org.eclipse.emf.importer.ecore"
-    complianceLevel="5.0" language="">
-  <foreignModel>componentMapping.ecore</foreignModel>
-  <genPackages prefix="ComponentMapping" basePackage="org.eclipse.jst.jsf.designtime.internal.view.mapping"
-      resource="XML" disposableProviderFactory="true" ecorePackage="componentMapping.ecore#/">
-    <genClasses ecoreClass="componentMapping.ecore#//TagComponentMapping">
-      <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference componentMapping.ecore#//TagComponentMapping/typeInfo"/>
-    </genClasses>
-    <genClasses ecoreClass="componentMapping.ecore#//ClassTypeInfo_">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute componentMapping.ecore#//ClassTypeInfo_/className"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute componentMapping.ecore#//ClassTypeInfo_/superClasses"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute componentMapping.ecore#//ClassTypeInfo_/interfaces"/>
-    </genClasses>
-    <genClasses ecoreClass="componentMapping.ecore#//ComponentTypeInfo_">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute componentMapping.ecore#//ComponentTypeInfo_/componentType"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute componentMapping.ecore#//ComponentTypeInfo_/componentFamily"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute componentMapping.ecore#//ComponentTypeInfo_/renderType"/>
-    </genClasses>
-    <genClasses ecoreClass="componentMapping.ecore#//ConverterTypeInfo_">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute componentMapping.ecore#//ConverterTypeInfo_/converterId"/>
-    </genClasses>
-    <genClasses ecoreClass="componentMapping.ecore#//ValidatorTypeInfo_">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute componentMapping.ecore#//ValidatorTypeInfo_/validatorId"/>
-    </genClasses>
-  </genPackages>
-</genmodel:GenModel>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/model/constraints.ecore b/jsf/plugins/org.eclipse.jst.jsf.core/model/constraints.ecore
deleted file mode 100644
index de5a6ff..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/model/constraints.ecore
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ecore:EPackage xmi:version="2.0"
-    xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="constraints"
-    nsURI="http://org.eclipse.jst.jsf.core/constraints.ecore" nsPrefix="cnst">
-  <eClassifiers xsi:type="ecore:EClass" name="TagId">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="uri" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="uri"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="name" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="name"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="TagSet">
-    <eStructuralFeatures xsi:type="ecore:EReference" name="tags" upperBound="-1" eType="#//TagId">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="tagId"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ContainsTagConstraint">
-    <eStructuralFeatures xsi:type="ecore:EReference" name="setGenerator" eType="ecore:EClass ../../org.eclipse.jst.jsf.common/model/metadataTraitTypes.ecore#//SetGenerator">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="set-generator"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="satisfiesSet" eType="#//TagSet">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="satisfies-set"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-</ecore:EPackage>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/model/constraints.genmodel b/jsf/plugins/org.eclipse.jst.jsf.core/model/constraints.genmodel
deleted file mode 100644
index e7ae676..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/model/constraints.genmodel
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<genmodel:GenModel xmi:version="2.0"
-    xmlns:xmi="http://www.omg.org/XMI" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore"
-    xmlns:genmodel="http://www.eclipse.org/emf/2002/GenModel" modelDirectory="/org.eclipse.jst.jsf.core/src"
-    modelPluginID="org.eclipse.jst.jsf.core" modelName="Constraints" importerID="org.eclipse.emf.importer.ecore"
-    usedGenPackages="../../org.eclipse.jst.jsf.common/model/metadataTraitTypes.genmodel#//traittypes">
-  <foreignModel>constraints.ecore</foreignModel>
-  <genPackages prefix="Constraints" basePackage="org.eclipse.jst.jsf.validation.internal"
-      resource="XML" disposableProviderFactory="true" ecorePackage="constraints.ecore#/">
-    <genClasses ecoreClass="constraints.ecore#//TagId">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute constraints.ecore#//TagId/uri"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute constraints.ecore#//TagId/name"/>
-    </genClasses>
-    <genClasses ecoreClass="constraints.ecore#//TagSet">
-      <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference constraints.ecore#//TagSet/tags"/>
-    </genClasses>
-    <genClasses ecoreClass="constraints.ecore#//ContainsTagConstraint">
-      <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference constraints.ecore#//ContainsTagConstraint/setGenerator"/>
-      <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference constraints.ecore#//ContainsTagConstraint/satisfiesSet"/>
-    </genClasses>
-  </genPackages>
-</genmodel:GenModel>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/model/jsflibraryregistry.ecore b/jsf/plugins/org.eclipse.jst.jsf.core/model/jsflibraryregistry.ecore
deleted file mode 100644
index dfbc002..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/model/jsflibraryregistry.ecore
+++ /dev/null
@@ -1,88 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ecore:EPackage xmi:version="2.0"
-    xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="jsflibraryregistry"
-    nsURI="http://www.eclipse.org/webtools/jsf/schema/jsflibraryregistry.xsd" nsPrefix="jsflibreg">
-  <eClassifiers xsi:type="ecore:EClass" name="JSFLibraryRegistry">
-    <eOperations name="getJSFLibraryByID" lowerBound="1" eType="#//JSFLibrary">
-      <eParameters name="ID" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    </eOperations>
-    <eOperations name="getJSFLibrariesByName" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EEList">
-      <eParameters name="name" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    </eOperations>
-    <eOperations name="getImplJSFLibraries" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EEList"/>
-    <eOperations name="getNonImplJSFLibraries" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EEList"/>
-    <eOperations name="getAllJSFLibraries" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EEList"/>
-    <eOperations name="addJSFLibrary" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
-      <eParameters name="library" lowerBound="1" eType="#//JSFLibrary"/>
-    </eOperations>
-    <eOperations name="removeJSFLibrary" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
-      <eParameters name="library" lowerBound="1" eType="#//JSFLibrary"/>
-    </eOperations>
-    <eOperations name="getDefaultImplementation" lowerBound="1" eType="#//JSFLibrary"/>
-    <eOperations name="setDefaultImplementation" lowerBound="1">
-      <eParameters name="implementation" lowerBound="1" eType="#//JSFLibrary"/>
-    </eOperations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="DefaultImplementationID"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString" defaultValueLiteral=""/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="JSFLibraries" upperBound="-1"
-        eType="#//JSFLibrary" containment="true"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="PluginProvidedJSFLibraries"
-        upperBound="-1" eType="#//PluginProvidedJSFLibrary" transient="true" containment="true"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="JSFLibrary">
-    <eOperations name="containsArchiveFile" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
-      <eParameters name="fullPath" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    </eOperations>
-    <eOperations name="getWorkingCopy" lowerBound="1" eType="#//JSFLibrary"/>
-    <eOperations name="updateValues" lowerBound="1">
-      <eParameters name="otherLibrary" lowerBound="1" eType="#//JSFLibrary"/>
-    </eOperations>
-    <eOperations name="copyTo" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
-      <eParameters name="baseDestLocation" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    </eOperations>
-    <eOperations name="getLabel" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="ID" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"
-        changeable="false" transient="true" defaultValueLiteral="" derived="true"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="Name" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="JSFVersion" lowerBound="1"
-        eType="#//JSFVersion" defaultValueLiteral="UNKNOWN"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="Deployed" lowerBound="1"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean" defaultValueLiteral="true"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="Implementation" lowerBound="1"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean" defaultValueLiteral="false"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="ArchiveFiles" upperBound="-1"
-        eType="#//ArchiveFile" containment="true" eOpposite="#//ArchiveFile/JSFLibrary"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="PluginProvidedJSFLibrary" eSuperTypes="#//JSFLibrary">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="pluginID" lowerBound="1"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="Label" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ArchiveFile">
-    <eOperations name="getName" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    <eOperations name="getPath" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    <eOperations name="exists" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-    <eOperations name="equals" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
-      <eParameters name="object" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
-    </eOperations>
-    <eOperations name="hashCode" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EInt"/>
-    <eOperations name="copyTo" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
-      <eParameters name="baseDestLocation" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    </eOperations>
-    <eOperations name="getResolvedSourceLocation" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="RelativeToWorkspace" lowerBound="1"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean" defaultValueLiteral="true"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="SourceLocation" lowerBound="1"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="RelativeDestLocation" lowerBound="1"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="JSFLibrary" lowerBound="1"
-        eType="#//JSFLibrary" eOpposite="#//JSFLibrary/ArchiveFiles"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EEnum" name="JSFVersion">
-    <eLiterals name="UNKNOWN" value="-1"/>
-    <eLiterals name="v1_1" value="1"/>
-    <eLiterals name="v1_2" value="2"/>
-  </eClassifiers>
-</ecore:EPackage>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/model/jsflibraryregistry.genmodel b/jsf/plugins/org.eclipse.jst.jsf.core/model/jsflibraryregistry.genmodel
deleted file mode 100644
index 2c7c455..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/model/jsflibraryregistry.genmodel
+++ /dev/null
@@ -1,82 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<genmodel:GenModel xmi:version="2.0"
-    xmlns:xmi="http://www.omg.org/XMI" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore"
-    xmlns:genmodel="http://www.eclipse.org/emf/2002/GenModel" copyrightText="Copyright (c) 2005 Oracle Corporation"
-    modelDirectory="/org.eclipse.jst.jsf.core/src" editDirectory="/org.eclipse.jst.jsf.core.edit/src"
-    editorDirectory="/org.eclipse.jst.jsf.core.editor/src" modelPluginID="org.eclipse.jst.jsf.core"
-    templateDirectory="templates" dynamicTemplates="true" modelName="JSFLibraryRegistry"
-    importerID="org.eclipse.emf.importer.ecore">
-  <foreignModel>jsflibraryregistry.ecore</foreignModel>
-  <genPackages prefix="JSFLibraryRegistry" basePackage="org.eclipse.jst.jsf.core.internal"
-      resource="XML" disposableProviderFactory="true" ecorePackage="jsflibraryregistry.ecore#/">
-    <genEnums ecoreEnum="jsflibraryregistry.ecore#//JSFVersion">
-      <genEnumLiterals ecoreEnumLiteral="jsflibraryregistry.ecore#//JSFVersion/UNKNOWN"/>
-      <genEnumLiterals ecoreEnumLiteral="jsflibraryregistry.ecore#//JSFVersion/v1_1"/>
-      <genEnumLiterals ecoreEnumLiteral="jsflibraryregistry.ecore#//JSFVersion/v1_2"/>
-    </genEnums>
-    <genClasses ecoreClass="jsflibraryregistry.ecore#//JSFLibraryRegistry">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute jsflibraryregistry.ecore#//JSFLibraryRegistry/DefaultImplementationID"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference jsflibraryregistry.ecore#//JSFLibraryRegistry/JSFLibraries"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference jsflibraryregistry.ecore#//JSFLibraryRegistry/PluginProvidedJSFLibraries"/>
-      <genOperations ecoreOperation="jsflibraryregistry.ecore#//JSFLibraryRegistry/getJSFLibraryByID">
-        <genParameters ecoreParameter="jsflibraryregistry.ecore#//JSFLibraryRegistry/getJSFLibraryByID/ID"/>
-      </genOperations>
-      <genOperations ecoreOperation="jsflibraryregistry.ecore#//JSFLibraryRegistry/getJSFLibrariesByName">
-        <genParameters ecoreParameter="jsflibraryregistry.ecore#//JSFLibraryRegistry/getJSFLibrariesByName/name"/>
-      </genOperations>
-      <genOperations ecoreOperation="jsflibraryregistry.ecore#//JSFLibraryRegistry/getImplJSFLibraries"/>
-      <genOperations ecoreOperation="jsflibraryregistry.ecore#//JSFLibraryRegistry/getNonImplJSFLibraries"/>
-      <genOperations ecoreOperation="jsflibraryregistry.ecore#//JSFLibraryRegistry/getAllJSFLibraries"/>
-      <genOperations ecoreOperation="jsflibraryregistry.ecore#//JSFLibraryRegistry/addJSFLibrary">
-        <genParameters ecoreParameter="jsflibraryregistry.ecore#//JSFLibraryRegistry/addJSFLibrary/library"/>
-      </genOperations>
-      <genOperations ecoreOperation="jsflibraryregistry.ecore#//JSFLibraryRegistry/removeJSFLibrary">
-        <genParameters ecoreParameter="jsflibraryregistry.ecore#//JSFLibraryRegistry/removeJSFLibrary/library"/>
-      </genOperations>
-      <genOperations ecoreOperation="jsflibraryregistry.ecore#//JSFLibraryRegistry/getDefaultImplementation"/>
-      <genOperations ecoreOperation="jsflibraryregistry.ecore#//JSFLibraryRegistry/setDefaultImplementation">
-        <genParameters ecoreParameter="jsflibraryregistry.ecore#//JSFLibraryRegistry/setDefaultImplementation/implementation"/>
-      </genOperations>
-    </genClasses>
-    <genClasses ecoreClass="jsflibraryregistry.ecore#//JSFLibrary">
-      <genFeatures property="Readonly" createChild="false" ecoreFeature="ecore:EAttribute jsflibraryregistry.ecore#//JSFLibrary/ID"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute jsflibraryregistry.ecore#//JSFLibrary/Name"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute jsflibraryregistry.ecore#//JSFLibrary/JSFVersion"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute jsflibraryregistry.ecore#//JSFLibrary/Deployed"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute jsflibraryregistry.ecore#//JSFLibrary/Implementation"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference jsflibraryregistry.ecore#//JSFLibrary/ArchiveFiles"/>
-      <genOperations ecoreOperation="jsflibraryregistry.ecore#//JSFLibrary/containsArchiveFile">
-        <genParameters ecoreParameter="jsflibraryregistry.ecore#//JSFLibrary/containsArchiveFile/fullPath"/>
-      </genOperations>
-      <genOperations ecoreOperation="jsflibraryregistry.ecore#//JSFLibrary/getWorkingCopy"/>
-      <genOperations ecoreOperation="jsflibraryregistry.ecore#//JSFLibrary/updateValues">
-        <genParameters ecoreParameter="jsflibraryregistry.ecore#//JSFLibrary/updateValues/otherLibrary"/>
-      </genOperations>
-      <genOperations ecoreOperation="jsflibraryregistry.ecore#//JSFLibrary/copyTo">
-        <genParameters ecoreParameter="jsflibraryregistry.ecore#//JSFLibrary/copyTo/baseDestLocation"/>
-      </genOperations>
-      <genOperations ecoreOperation="jsflibraryregistry.ecore#//JSFLibrary/getLabel"/>
-    </genClasses>
-    <genClasses ecoreClass="jsflibraryregistry.ecore#//PluginProvidedJSFLibrary">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute jsflibraryregistry.ecore#//PluginProvidedJSFLibrary/pluginID"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute jsflibraryregistry.ecore#//PluginProvidedJSFLibrary/Label"/>
-    </genClasses>
-    <genClasses ecoreClass="jsflibraryregistry.ecore#//ArchiveFile">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute jsflibraryregistry.ecore#//ArchiveFile/RelativeToWorkspace"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute jsflibraryregistry.ecore#//ArchiveFile/SourceLocation"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute jsflibraryregistry.ecore#//ArchiveFile/RelativeDestLocation"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference jsflibraryregistry.ecore#//ArchiveFile/JSFLibrary"/>
-      <genOperations ecoreOperation="jsflibraryregistry.ecore#//ArchiveFile/getName"/>
-      <genOperations ecoreOperation="jsflibraryregistry.ecore#//ArchiveFile/getPath"/>
-      <genOperations ecoreOperation="jsflibraryregistry.ecore#//ArchiveFile/exists"/>
-      <genOperations ecoreOperation="jsflibraryregistry.ecore#//ArchiveFile/equals">
-        <genParameters ecoreParameter="jsflibraryregistry.ecore#//ArchiveFile/equals/object"/>
-      </genOperations>
-      <genOperations ecoreOperation="jsflibraryregistry.ecore#//ArchiveFile/hashCode"/>
-      <genOperations ecoreOperation="jsflibraryregistry.ecore#//ArchiveFile/copyTo">
-        <genParameters ecoreParameter="jsflibraryregistry.ecore#//ArchiveFile/copyTo/baseDestLocation"/>
-      </genOperations>
-      <genOperations ecoreOperation="jsflibraryregistry.ecore#//ArchiveFile/getResolvedSourceLocation"/>
-    </genClasses>
-  </genPackages>
-</genmodel:GenModel>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/model/templates/Header.javajetinc b/jsf/plugins/org.eclipse.jst.jsf.core/model/templates/Header.javajetinc
deleted file mode 100644
index aadfb40..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/model/templates/Header.javajetinc
+++ /dev/null
@@ -1,10 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/plugin.properties b/jsf/plugins/org.eclipse.jst.jsf.core/plugin.properties
deleted file mode 100644
index 4ecb50c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/plugin.properties
+++ /dev/null
@@ -1,58 +0,0 @@
-###############################################################################
-# Copyright (c) 2005 Oracle Corporation.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#    Gerry Kessler - initial API and implementation
-###############################################################################
-plugin.name=JavaServer Faces Tools - Core
-plugin.provider=Eclipse.org
-plugin.facet.name=JavaServer Faces
-plugin.facet.description=Enables the project to be deployed with JSF capabilities.
-
-JSFELValidator=JSP JSF EL Validator
-
-JSFv11Project=JavaServer Faces v1.1 Project
-JSFv11PresetDesc=Configures a Dynamic Web application to use JSF v1.1
-
-JSFv12Project=JavaServer Faces v1.2 Project
-JSFv12PresetDesc=Configures a Dynamic Web application to use JSF v1.2
-
-JSFv20Project=JavaServer Faces v2.0 Project
-JSFv20PresetDesc=Configures a Dynamic Web application to use JSF v2.0
-# ====================================================================
-
-pluginName = Constraints Model
-providerName = www.example.org
-
-#=================================
-jsp.tag.registry=JSP Tag Registry
-
-plugin.facet.extension.name=JavaServer Faces
-
-JSP_TAG_REGISTRY_DESCRIPTION = JSP tag registry
-extension-point.name.0 = jsfLibraries
-extension-point.name.1 = pluginProvidedJsfLibraries
-extension-point.name.2 = Property Resolver Ext Point
-extension-point.name.3 = Method Resolver Ext Point
-extension-point.name.4 = External Context Ext Point
-extension-point.name.5 = MetaDataEnabledFeatures
-extension-point.name.6 = JSF View Handler Extension
-extension-point.name.7 = customViewMapper
-extension-point.name.8 = Variable Resolver Ext Point
-extension-point.name.9 = AttributeValueRuntimeTypes
-extension-point.name.10 = JSF Tag Library Registry
-extension-point.name.11 = JSF Facet Configuration
-
-noOpLibraryProviderWarning = Library configuration is disabled. Further classpath changes may be required later.
-noOpLibraryProviderMessage = This facet requires JSF implementation library to be present on project classpath. By disabling library configuration, user takes on responsibility of configuring classpath appropriately via alternate means.
-
-extension-point.name.12 = Symbol Context Resolver Factory Delegate
-extension-point.name.13 = Tag Registry Factory
-extension-point.name.14 = JSF AppConfig Locator Provider Factory (internal)
-extension-point.name.15 = JSF AppConfig Manager Factory (internal)
-Facelet.name=Facelet
-FaceletComposite.name=Facelet Composite Component
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/plugin.xml b/jsf/plugins/org.eclipse.jst.jsf.core/plugin.xml
deleted file mode 100644
index 506509b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/plugin.xml
+++ /dev/null
@@ -1,528 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin>
-   <extension-point id="jsfLibraries" name="%extension-point.name.0" schema="schema/jsfLibraries.exsd"/>
-   <extension-point id="pluginProvidedJsfLibraries" name="%extension-point.name.1" schema="schema/pluginProvidedJsfLibraries.exsd"/>
-   <extension-point id="variableresolver" name="%extension-point.name.8" schema="schema/variableresolver.exsd"/>
-   <extension-point id="propertyresolver" name="%extension-point.name.2" schema="schema/propertyresolver.exsd"/>
-   <extension-point id="methodresolver" name="%extension-point.name.3" schema="schema/methodresolver.exsd"/>
-   <extension-point id="externalcontext" name="%extension-point.name.4" schema="schema/externalcontext.exsd"/>
-   <extension-point id="AttributeValueRuntimeTypes" name="%extension-point.name.9" schema="schema/AttributeValueRuntimeTypes.exsd"/>
-   <extension-point id="MetaDataEnabledFeatures" name="%extension-point.name.5" schema="schema/MetaDataEnabledFeatures.exsd"/>
-   <extension-point id="tagregistry" name="%extension-point.name.10" schema="schema/tagregistry.exsd"/>
-   <extension-point id="viewhandler" name="%extension-point.name.6" schema="schema/viewhandler.exsd"/>
-   <extension-point id="customViewMapper" name="%extension-point.name.7" schema="schema/customViewMapper.exsd"/>
-   <extension-point id="jsfFacetConfiguration" name="%extension-point.name.11" schema="schema/jsfFacetConfiguration.exsd"/>
-   <extension-point id="symbolContextResolverFactory" name="%extension-point.name.12" schema="schema/symbolContextResolverFactory.exsd"/>
-   <extension-point id="tagRegistryFactory" name="%extension-point.name.13" schema="schema/tagRegistryFactory.exsd"/>
-   <extension-point id="jsfAppConfigLocatorProviderFactory" name="%extension-point.name.14" schema="schema/jsfAppConfigLocatorProviderFactory.exsd"/>
-   <extension-point id="jsfAppConfigManagerFactory" name="%extension-point.name.15" schema="schema/jsfAppConfigManagerFactory.exsd"/>
-   <extension point="org.eclipse.emf.ecore.generated_package">
-        <package 
-            uri = "http://org.eclipse.jst.jsf.core/constraints.ecore" 
-            class = "org.eclipse.jst.jsf.validation.internal.constraints.ConstraintsPackage"
-            genModel = "model/constraints.genmodel" /> 
-         <package 
-           uri = "http://org.eclipse.jsf.pagedesigner/paletteInfos.ecore" 
-           class = "org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfosPackage"
-           genModel = "model/paletteInfos.genmodel" />
-         <package 
-           uri = "http://org.eclipse.jst.jsf.core/componentMapping.ecore" 
-           class = "org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ComponentMappingPackage"
-           genModel = "model/componentMapping.genmodel" />
-   </extension> 
-  <!-- JSF Project Facets -->
-	<extension
-       id="org.eclipse.jst.jsf.project.facet"
-       name="%plugin.facet.extension.name"
-       point="org.eclipse.wst.common.project.facet.core.facets">
-
-    <project-facet id="jst.jsf">
-      <label>%plugin.facet.name</label>
-      <description>%plugin.facet.description</description>
-    </project-facet>
-
-    <project-facet-version facet="jst.jsf" version="1.1">
-       <constraint>
-        <and>
-          <requires facet="jst.web" version="[2.3"/>
-        </and>
-      </constraint>
-    </project-facet-version> 
-
-    <project-facet-version facet="jst.jsf" version="1.2">
-       <constraint>
-        <and>
-          <requires facet="jst.web" version="[2.5"/>
-        </and>
-      </constraint>
-    </project-facet-version> 
-
-    <project-facet-version facet="jst.jsf" version="2.0">
-       <constraint>
-        <and>
-          <requires facet="jst.web" version="[2.5"/>
-        </and>
-      </constraint>
-    </project-facet-version> 
-
-    <action id="jst.jsf.v11.install" facet="jst.jsf" type="INSTALL" version="1.1">
-      	<delegate class="org.eclipse.jst.jsf.core.internal.project.facet.JSFFacetInstallDelegate"/>
-        <config-factory class="org.eclipse.jst.jsf.core.internal.project.facet.JSFFacetInstallDataModelProvider"/>
-    </action>  
-      
-    <action id="jst.jsf.v11.uninstall" facet="jst.jsf" type="UNINSTALL" version="1.1" >
-        <config-factory class="org.eclipse.jst.jsf.core.internal.project.facet.JSFFacetUninstallConfig$Factory"/>
-	 	<delegate class="org.eclipse.jst.jsf.core.internal.project.facet.JSFFacetUninstallDelegate"/>
- 	</action>
-	
- 	<action id="jst.jsf.v12.install" facet="jst.jsf" type="INSTALL" version="1.2">
-      	<delegate class="org.eclipse.jst.jsf.core.internal.project.facet.JSFFacetInstallDelegate"/>
-        <config-factory class="org.eclipse.jst.jsf.core.internal.project.facet.JSFFacetInstallDataModelProvider"/>
-    </action>  
-      
-    <action id="jst.jsf.v12.uninstall" facet="jst.jsf" version="1.2" type="UNINSTALL">
-        <config-factory class="org.eclipse.jst.jsf.core.internal.project.facet.JSFFacetUninstallConfig$Factory"/>
-	 	<delegate class="org.eclipse.jst.jsf.core.internal.project.facet.JSFFacetUninstallDelegate"/>
- 	</action>  
-
- 	<action id="jst.jsf.v20.install" facet="jst.jsf" type="INSTALL" version="2.0">
-      	<delegate class="org.eclipse.jst.jsf.core.internal.project.facet.JSFFacetInstallDelegate"/>
-        <config-factory class="org.eclipse.jst.jsf.core.internal.project.facet.JSFFacetInstallDataModelProvider"/>
-    </action>  
-      
-    <action id="jst.jsf.v20.uninstall" facet="jst.jsf" version="2.0" type="UNINSTALL">
-        <config-factory class="org.eclipse.jst.jsf.core.internal.project.facet.JSFFacetUninstallConfig$Factory"/>
-	 	<delegate class="org.eclipse.jst.jsf.core.internal.project.facet.JSFFacetUninstallDelegate"/>
- 	</action>  
-	      	
-  </extension> 
-  
-  <extension
-        point="org.eclipse.wst.common.project.facet.core.listeners">
-     <listener
-           class="org.eclipse.jst.jsf.core.internal.project.facet.JSFFacetPrimaryRuntimeChangedListener"
-           eventTypes="PRIMARY_RUNTIME_CHANGED">
-     </listener>
-  </extension>
-  
-  <extension
-        point="org.eclipse.wst.common.project.facet.core.presets">
-     <static-preset
-           id="preset.jst.jsf.v1_1" extends="default.configuration">
-        <label>%JSFv11Project</label>
-        <facet id="jst.java" version="1.4" />
-        <facet id="jst.web" version="2.4"/>
-        <facet id="jst.jsf" version="1.1" />
-        <description>%JSFv11PresetDesc</description>
-     </static-preset>
-     <static-preset
-           id="preset.jst.jsf.v1_2" extends="default.configuration">
-	    <label>%JSFv12Project</label>
-	    <facet id="jst.java" version="1.5" />
-	    <facet id="jst.web" version="2.5"/>
-	    <facet id="jst.jsf" version="1.2" />
-     <description>
-        %JSFv12PresetDesc
-     </description>
-     </static-preset>
-     <static-preset
-           id="preset.jst.jsf.v2_0" extends="default.configuration">
-        <label>
-           %JSFv20Project
-        </label>
-        <facet
-              id="jst.java"
-              version="1.6">
-        </facet>
-        <facet
-              id="jst.web"
-              version="3.0">
-        </facet>
-        <facet
-              id="jst.jsf"
-              version="2.0">
-        </facet>
-        <description>
-           %JSFv20PresetDesc
-        </description>
-     </static-preset>
-  </extension>
-
-  <extension point="org.eclipse.wst.common.project.facet.core.runtimes">
-    <supported>
-		<runtime-component any="true"/>
-        	<facet id="jst.jsf" version="1.1,1.2,2.0"/> 
-    </supported>
-  </extension>
-    
-  <extension
-     name="JSF JSP File URL"
-     point="org.eclipse.jst.j2ee.web.fileURL">
-     <fileURL id="jsfPage"><run class="org.eclipse.jst.jsf.core.internal.launch.JSFFileURL"/></fileURL>
-  </extension>
-  
-      <extension
-         point="org.eclipse.jst.jsf.common.symbolSourceProvider">
-      <symbolSourceId factory="org.eclipse.jst.jsf.designtime.internal.symbols.JSPTagVariableSymbolSourceProvider"/>
-   </extension>
-   <extension
-         point="org.eclipse.jst.jsf.common.contextSymbolFactory">
-      <contextSymbolFactory
-            factory="org.eclipse.jst.jsf.designtime.internal.jsp.JSPDefaultSymbolFactory"
-            factoryId="org.eclipse.jst.jsf.designtime.core.loadBundle"/>
-   </extension>
-   <extension
-         point="org.eclipse.jst.jsf.core.variableresolver">
-      <variableresolver
-            class="org.eclipse.jst.jsf.designtime.internal.symbols.ConfigBasedDTVariableResolver"
-            id="org.eclipse.jst.jsf.core.variableresolver.default.decorative"/>
-   </extension>
-    <extension
-         point="org.eclipse.jst.jsf.core.variableresolver">
-        <variableresolver
-            class="org.eclipse.jst.jsf.designtime.el.DefaultDTVariableResolver"
-            id="org.eclipse.jst.jsf.core.variableresolver.default"/>
-    </extension>
-   <extension
-         point="org.eclipse.jst.jsf.core.propertyresolver">
-      <propertyresolver
-            class="org.eclipse.jst.jsf.designtime.el.DefaultDTPropertyResolver"
-            id="org.eclipse.jst.jsf.core.propertyresolver.default"/>
-   </extension>
-   <extension
-         point="org.eclipse.jst.jsf.core.propertyresolver">
-      <propertyresolver
-            class="org.eclipse.jst.jsf.designtime.internal.symbols.ConfigBasedDTPropertyResolver"
-            id="org.eclipse.jst.jsf.core.propertyresolver.default.decorative"
-            instancePerProject="true">
-      </propertyresolver>
-   </extension>
-   <extension
-         point="org.eclipse.jst.jsf.core.methodresolver">
-      <methodresolver
-            class="org.eclipse.jst.jsf.designtime.el.DefaultDTMethodResolver"
-            id="org.eclipse.jst.jsf.core.methodresolver.default"/>
-   </extension>
-   <extension
-         point="org.eclipse.jst.jsf.core.externalcontext">
-      <externalcontext
-            class="org.eclipse.jst.jsf.designtime.context.DefaultDTExternalContextFactory"
-            id="org.eclipse.jst.jsf.core.externalcontext.default"/>
-   </extension>
-   
-   <extension
-         point="org.eclipse.jst.jsf.core.AttributeValueRuntimeTypes">
-
-      <attributeValueRuntimeType
-            class="org.eclipse.jst.jsf.metadataprocessors.AbstractRootTypeDescriptor"
-            id="attributevalues.BaseType"/>
-      <attributeValueRuntimeType
-            class="org.eclipse.jst.jsf.taglibprocessing.attributevalues.StringType"
-            id="attributevalues.StringType"/>
-      <attributeValueRuntimeType
-            class="org.eclipse.jst.jsf.taglibprocessing.attributevalues.BooleanType"
-            id="attributevalues.BooleanType"/>
-      <attributeValueRuntimeType
-            class="org.eclipse.jst.jsf.taglibprocessing.attributevalues.LongType"
-            id="attributevalues.LongType"/>
-      <attributeValueRuntimeType
-            class="org.eclipse.jst.jsf.taglibprocessing.attributevalues.IntegerType"
-            id="attributevalues.IntegerType"/>
-      <attributeValueRuntimeType
-            class="org.eclipse.jst.jsf.taglibprocessing.attributevalues.DoubleType"
-            id="attributevalues.DoubleType"/>
-      <attributeValueRuntimeType
-            class="org.eclipse.jst.jsf.taglibprocessing.attributevalues.JavaClassType"
-            id="attributevalues.JavaClassType"/>                                                
-      <attributeValueRuntimeType
-            class="org.eclipse.jst.jsf.taglibprocessing.attributevalues.MethodBindingType"
-            id="attributevalues.MethodBindingType"/>
-      <attributeValueRuntimeType
-            class="org.eclipse.jst.jsf.taglibprocessing.attributevalues.ActionType"
-            id="attributevalues.ActionType"/>
-      <attributeValueRuntimeType
-            class="org.eclipse.jst.jsf.taglibprocessing.attributevalues.ValueBindingType"
-            id="attributevalues.ValueBindingType"/>
-      <attributeValueRuntimeType
-            class="org.eclipse.jst.jsf.taglibprocessing.attributevalues.ValueType"
-            id="attributevalues.ValueType"/>
-      <attributeValueRuntimeType
-            class="org.eclipse.jst.jsf.taglibprocessing.attributevalues.FacesConfigIdentifierType"
-            id="attributevalues.FacesConfigIdentifierType"/>
-      <attributeValueRuntimeType
-            class="org.eclipse.jst.jsf.taglibprocessing.attributevalues.FacesConfigValidatorIDType"
-            id="attributevalues.FacesConfigValidatorIDType"/>           
-      <attributeValueRuntimeType
-            class="org.eclipse.jst.jsf.taglibprocessing.attributevalues.FacesConfigConverterIDType"
-            id="attributevalues.FacesConfigConverterIDType"/>
-      <attributeValueRuntimeType
-            class="org.eclipse.jst.jsf.taglibprocessing.attributevalues.ComponentBindingType"
-            id="attributevalues.ComponentBindingType"/>            
-      <attributeValueRuntimeType
-            class="org.eclipse.jst.jsf.taglibprocessing.attributevalues.ComponentIDType"
-            id="attributevalues.ComponentIDType"/>
-      <attributeValueRuntimeType
-            class="org.eclipse.jst.jsf.taglibprocessing.attributevalues.LengthType"
-            id="attributevalues.LengthType"/>           
-      <attributeValueRuntimeType
-            class="org.eclipse.jst.jsf.taglibprocessing.attributevalues.ColorType"
-            id="attributevalues.ColorType"/>
-      <attributeValueRuntimeType
-            class="org.eclipse.jst.jsf.taglibprocessing.attributevalues.ResourceBundleType"
-            id="attributevalues.ResourceBundleType"/>         
-      <attributeValueRuntimeType
-            class="org.eclipse.jst.jsf.taglibprocessing.attributevalues.LanguageCodeType"
-            id="attributevalues.LanguageCodeType"/>
-      <attributeValueRuntimeType
-            class="org.eclipse.jst.jsf.taglibprocessing.attributevalues.RelativePathType"
-            id="attributevalues.RelativePathType"/>    
-      <attributeValueRuntimeType
-            class="org.eclipse.jst.jsf.taglibprocessing.attributevalues.WebPathType"
-            id="attributevalues.WebPathType"/>                                    
-      <attributeValueRuntimeType
-            class="org.eclipse.jst.jsf.taglibprocessing.attributevalues.CurrencyCodeType"
-            id="attributevalues.CurrencyCodeType"/>
-      <attributeValueRuntimeType
-            class="org.eclipse.jst.jsf.taglibprocessing.attributevalues.LocaleType"
-            id="attributevalues.LocaleType"/>                                         
-      <attributeValueRuntimeType
-            class="org.eclipse.jst.jsf.taglibprocessing.attributevalues.TimeZoneType"
-            id="attributevalues.TimeZoneType"/>
-      <attributeValueRuntimeType
-            class="org.eclipse.jst.jsf.taglibprocessing.attributevalues.DateTimePatternType"
-            id="attributevalues.DateTimePatternType"/>  
-      <attributeValueRuntimeType
-            class="org.eclipse.jst.jsf.taglibprocessing.attributevalues.NumberPatternType"
-            id="attributevalues.NumberPatternType"/>                 
-      <attributeValueRuntimeType
-            class="org.eclipse.jst.jsf.taglibprocessing.attributevalues.ScriptType"
-            id="attributevalues.ScriptType"/>  
-      <attributeValueRuntimeType
-            class="org.eclipse.jst.jsf.taglibprocessing.attributevalues.CharacterType"
-            id="attributevalues.CharacterType"/>        
-      <attributeValueRuntimeType
-            class="org.eclipse.jst.jsf.taglibprocessing.attributevalues.LinkType"
-            id="attributevalues.LinkType"/> 
-      <attributeValueRuntimeType
-            class="org.eclipse.jst.jsf.taglibprocessing.attributevalues.ContentType"
-            id="attributevalues.ContentType"/>                  
-      <attributeValueRuntimeType
-            class="org.eclipse.jst.jsf.taglibprocessing.attributevalues.URIType"
-            id="attributevalues.URIType"/>  
-     <attributeValueRuntimeType
-            class="org.eclipse.jst.jsf.taglibprocessing.attributevalues.CSSClassType"
-            id="attributevalues.CSSClassType"/> 
-      <attributeValueRuntimeType
-            class="org.eclipse.jst.jsf.taglibprocessing.attributevalues.CSSIdType"
-            id="attributevalues.CSSIdType"/>    
-      <attributeValueRuntimeType
-            class="org.eclipse.jst.jsf.taglibprocessing.attributevalues.CSSStyleType"
-            id="attributevalues.CSSStyleType"/>                                
-   </extension>
-   
-   <extension
-         point="org.eclipse.jst.jsf.core.MetaDataEnabledFeatures">       
-      <MetaDataEnabledFeature
-            class="org.eclipse.jst.jsf.taglibprocessing.attributevalues.FacesConfigValidatorIDFeatures"
-            typeid="org.eclipse.jst.jsf.core.attributevalues.FacesConfigValidatorIDType"/>
-     <MetaDataEnabledFeature
-            class="org.eclipse.jst.jsf.taglibprocessing.attributevalues.FacesConfigConverterIDFeatures"
-            typeid="org.eclipse.jst.jsf.core.attributevalues.FacesConfigConverterIDType"/>            
-   </extension>
-
-   <extension
-       point="org.eclipse.jst.jsf.common.symbolSourceProvider">
-    <symbolSourceId
-          factory="org.eclipse.jst.jsf.designtime.internal.symbols.ResourceBundleSymbolSourceProvider">
-   </symbolSourceId>
-  </extension>
-   <extension
-         point="org.eclipse.jst.jsf.common.domainSourceModelTypes">
-      <domainSourceModelTypes
-            domainId="TagLibraryDomain"
-            domainSourceModelTypeId="TaglibContentModelHandler"
-            locator="org.eclipse.jst.jsf.core.metadata.internal.TaglibMetaDataLocator"
-            ordinal="5">
-      </domainSourceModelTypes>
-   </extension> 
-   
-  <extension
-       point="org.eclipse.jst.jsf.common.domainSourceModelTypeTranslators">
-    <domainSourceModelTypeTranslator
-          domainSourceModelTypeId="TaglibContentModelHandler"
-          translatorClass="org.eclipse.jst.jsf.core.metadata.internal.HTMLContentModelMetaDataTranslator">
-    </domainSourceModelTypeTranslator>
-    <domainSourceModelTypeTranslator
-          domainSourceModelTypeId="TaglibContentModelHandler"
-          translatorClass="org.eclipse.jst.jsf.core.metadata.internal.JSPContentModelMetaDataTranslator">
-    </domainSourceModelTypeTranslator>
-    <domainSourceModelTypeTranslator
-          domainSourceModelTypeId="TaglibContentModelHandler"
-          translatorClass="org.eclipse.jst.jsf.core.metadata.internal.TaglibMetaDataTLDTranslator">
-    </domainSourceModelTypeTranslator>      
- </extension>
-
-  <extension point="org.eclipse.jdt.core.classpathContainerInitializer">
-    <classpathContainerInitializer
-      class="org.eclipse.jst.jsf.core.internal.JSFLibrariesContainerInitializer"
-      id="org.eclipse.jst.jsf.core.internal.jsflibrarycontainer"/>
-  </extension>
-  <extension
-        point="org.eclipse.jst.jsf.core.tagregistry">
-     <tagRegistry
-           class="org.eclipse.jst.jsf.designtime.internal.view.model.jsp.registry.TLDRegistryManager$MyRegistryFactory"
-           description="%JSP_TAG_REGISTRY_DESCRIPTION"
-           id="default.jsp">
-        <content-type
-              contentTypeId="org.eclipse.jst.jsp.core.jspsource">
-        </content-type>
-        <content-type
-              contentTypeId="org.eclipse.jst.jsp.core.jspfragmentsource">
-        </content-type>
-     </tagRegistry>
-  </extension>
-  <extension
-        point="org.eclipse.jst.jsf.core.viewhandler">
-     <viewhandler
-           class="org.eclipse.jst.jsf.designtime.internal.view.DefaultDTViewHandler"
-           id="org.eclipse.jst.jsf.designtime.view.jspviewhandler">
-     </viewhandler>
-  </extension>
-  <extension
-        point="org.eclipse.jst.jsf.common.contextSymbolFactory">
-     <contextSymbolFactory
-           factory="org.eclipse.jst.jsf.designtime.internal.symbols.StaticJavaTypeSymbolFactory"
-           factoryId="org.eclipse.jst.jsf.core.staticJavaTypeSymbol">
-     </contextSymbolFactory>
-  </extension>
-  <extension
-        point="org.eclipse.jst.jsf.common.contextSymbolFactory">
-     <contextSymbolFactory
-           factory="org.eclipse.jst.jsf.designtime.internal.symbols.ValueExpressionSymbolFactory"
-           factoryId="org.eclipse.jst.jsf.core.valueExpressionSymbolFactory">
-     </contextSymbolFactory>
-  </extension>
-  <extension
-        point="org.eclipse.jst.jsf.core.customViewMapper">
-     <customViewMapper
-           class="org.eclipse.jst.jsf.designtime.internal.view.mapping.mappers.ValueHolderAttributeMapper"
-           id="valueHolderAttributeMapper">
-     </customViewMapper>
-  </extension>
-  
-  <!--
-    ******************************************
-    * Library Provider Framework Integration *
-    ******************************************
-  -->
-  
-  <extension point="org.eclipse.jst.common.project.facet.core.libraryProviders">
-    <provider id="jsf-user-library-provider" extends="wtp-user-library-provider">
-      <param name="validator" value="org.eclipse.jst.jsf.core.internal.project.facet.JSFLibraryValidator"/>
-      <param name="validator.param.0" value="javax.faces.FactoryFinder"/>
-      <enablement>
-        <with variable="requestingProjectFacet">
-          <test property="org.eclipse.wst.common.project.facet.core.projectFacet" value="jst.jsf" forcePluginActivation="true"/>
-        </with>
-      </enablement>
-    </provider>
-  </extension>
-  
-  <extension point="org.eclipse.jst.common.project.facet.core.libraryProviders">
-    <provider id="jsf-no-op-library-provider" extends="no-op-library-provider">
-      <param name="message" value="%noOpLibraryProviderMessage"/>
-      <param name="warning" value="%noOpLibraryProviderWarning"/>
-      <enablement>
-        <with variable="requestingProjectFacet">
-          <test property="org.eclipse.wst.common.project.facet.core.projectFacet" value="jst.jsf" forcePluginActivation="true"/>
-        </with>
-      </enablement>
-    </provider>
-  </extension>
-
-  <extension point="org.eclipse.jst.common.project.facet.core.libraryProviders">
-    <provider id="legacy-jsf-library-provider" extends="legacy-library-provider" hidden="true">
-      <action type="UNINSTALL">
-        <operation class="org.eclipse.jst.jsf.core.internal.project.facet.LegacyJSFLibraryProviderUninstallOperation"/>
-      </action>
-    </provider>
-  </extension>
-
-  <extension point="org.eclipse.jst.common.project.facet.core.legacyLibraryProviderDetectors">
-    <detector class="org.eclipse.jst.jsf.core.internal.project.facet.LegacyJSFLibraryProviderDetector"/>
-  </extension>
-
-    <!-- JSF 2.0 Downloadable library provider -->
-    <extension point="org.eclipse.jst.common.project.facet.core.downloadableLibraries">
-        <import-definitions url="http://www.eclipse.org/webtools/jsf/jsf-library/jsf-2.0-downloadable-libraries.xml">
-            <enablement>
-                <with variable="requestingProjectFacet">
-                    <test property="org.eclipse.wst.common.project.facet.core.projectFacet" value="jst.jsf:2.0" forcePluginActivation="true"/>
-                </with>
-            </enablement>
-        </import-definitions>
-    </extension>
-
-    <!-- JSF 1.2 Downloadable library provider -->
-    <extension point="org.eclipse.jst.common.project.facet.core.downloadableLibraries">
-        <import-definitions url="http://www.eclipse.org/webtools/jsf/jsf-library/jsf-1.2-downloadable-libraries.xml">
-            <enablement>
-                <with variable="requestingProjectFacet">
-                    <test property="org.eclipse.wst.common.project.facet.core.projectFacet" value="jst.jsf:1.2" forcePluginActivation="true"/>
-                </with>
-            </enablement>
-        </import-definitions>
-    </extension>
-
-    <!-- JSF 1.1 Downloadable library provider -->
-    <extension point="org.eclipse.jst.common.project.facet.core.downloadableLibraries">
-        <import-definitions url="http://www.eclipse.org/webtools/jsf/jsf-library/jsf-1.1-downloadable-libraries.xml">
-            <enablement>
-                <with variable="requestingProjectFacet">
-                    <test property="org.eclipse.wst.common.project.facet.core.projectFacet" value="jst.jsf:1.1" forcePluginActivation="true"/>
-                </with>
-            </enablement>
-        </import-definitions>
-    </extension>
-
-   <!-- Facelet Content Types -->
-   <extension
-         point="org.eclipse.core.contenttype.contentTypes">
-      <content-type
-            base-type="org.eclipse.wst.html.core.htmlsource"
-            default-charset="UTF-8"
-            file-extensions="xhtml"
-            id="jsf.facelet"
-            name="%Facelet.name"
-            priority="high">
-         <describer
-               class="org.eclipse.jst.jsf.core.internal.contenttype.XMLDocumentElementAttributeContentDescriber">
-            <parameter
-                  name="xmlns:.*"
-                  value=".*jsf.*">
-            </parameter>
-            <parameter
-                  name="xmlns:.*"
-                  value=".*faces.*">
-            </parameter>
-         </describer>
-      </content-type>
-      <content-type
-            base-type="jsf.facelet"
-            default-charset="UTF-8"
-            file-extensions="xhtml"
-            id="jsf.facelet.composite"
-            name="%FaceletComposite.name"
-            priority="high">
-         <describer
-               class="org.eclipse.jst.jsf.core.internal.contenttype.XMLDocumentElementAttributeContentDescriber">
-            <parameter
-                  name="xmlns:.*"
-                  value="http://java.sun.com/jsf/composite">
-            </parameter>
-         </describer>
-      </content-type>
-   </extension>
-
-</plugin>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/schema/AttributeValueRuntimeTypes.exsd b/jsf/plugins/org.eclipse.jst.jsf.core/schema/AttributeValueRuntimeTypes.exsd
deleted file mode 100644
index c06c1d4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/schema/AttributeValueRuntimeTypes.exsd
+++ /dev/null
@@ -1,126 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.jst.jsf.core">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.jst.jsf.core" id="AttributeValueRuntimeTypes" name="AttributeValueRuntimeTypes"/>
-      </appInfo>
-      <documentation>
-         Defines a mapping between an implementing class and an AttributeValue Runtime type.   By categorizing attribute values types in an CMAnnotation file, we can assign types and therefore processing of those types using the CMAnnotation file metadata and context information.
-
-&lt;p&gt;&lt;b&gt;This extension point is provisional and subject to change&lt;/b&gt;&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="attributeValueRuntimeType" minOccurs="1" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="attributeValueRuntimeType">
-      <annotation>
-         <documentation>
-            The MetaDataEnabledRuntimeTypeProcessing framework will use the value found on the attribute-value-runtime-value property of a cm-attribute annoation to bind to a class that implements the type.   That type may be able to provide processing for ContentAssist, Validation, Quick Fix/Quick Assist, or other context sensitive operations.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  unique id for the type within the extending plugin
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="class" type="string">
-            <annotation>
-               <documentation>
-                  Class that will be used to implement the type.  It must implement &lt;code&gt;org.eclipse.jst.jsf.metadataprocessors.IMetaDataEnabledFeature&lt;/code&gt; and it is recommended that the user extend the &lt;code&gt;org.eclipse.jst.jsf.metadataprocessors.AbstractRootTypeDescriptor&lt;/code&gt; or one of its subclasses.
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.jst.jsf.metadataprocessors.AbstractRootTypeDescriptor:org.eclipse.jst.jsf.metadataprocessors.IMetaDataEnabledFeature"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         1.5
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         see org.eclipse.jst.jsf.taglibprocessing plugin for examples of usage
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         cm-attribute annotation elements can have an &quot;attribute-value-runtime-type&quot; property that maps to the id of this ext-pt.  The property must be fully qualified with the extender&apos;s plugin id.   i.e.  if type is FooType, the property value must be com.foo.bar.FooType.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         Copyright (c) 2006 Oracle Corporation.
-All rights reserved. This program and the accompanying materials
-are made available under the terms of the Eclipse Public License v1.0
-which accompanies this distribution, and is available at
-http://www.eclipse.org/legal/epl-v10.html
- 
-Contributors:
-    Gerry Kessler/Oracle - initial API and implementation
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/schema/MetaDataEnabledFeatures.exsd b/jsf/plugins/org.eclipse.jst.jsf.core/schema/MetaDataEnabledFeatures.exsd
deleted file mode 100644
index f0b6717..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/schema/MetaDataEnabledFeatures.exsd
+++ /dev/null
@@ -1,126 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.jst.jsf.core">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.jst.jsf.core" id="MetaDataEnabledFeatures" name="MetaData Enabled Features"/>
-      </appInfo>
-      <documentation>
-         Defines a mapping between a runtime type defined by a different plugin and an implementing class in the extenders plugin.   This allows a provider to provide additional processing on an element or attribute instance that can be in addition to existing processing or a means to provide a new kind of processing of existing runtime types.
-
-&lt;p&gt;&lt;b&gt;This extension point is provisional and subject to change&lt;/b&gt;&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="MetaDataEnabledFeature" minOccurs="1" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="MetaDataEnabledFeature">
-      <annotation>
-         <documentation>
-            mapping between an different extenders runtime type id, and a processing class from the extenders plugin
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="typeid" type="string" use="required">
-            <annotation>
-               <documentation>
-                  Fully qualified runtime type id
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  Fully qualified implementing class that must implement &lt;code&gt;org.eclipse.jst.jsf.metadataprocessors.IMetaDataEnabledFeature&lt;/code&gt;.
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.jst.jsf.metadataprocessors.AbstractMetaDataEnabledFeature:org.eclipse.jst.jsf.metadataprocessors.IMetaDataEnabledFeature"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         1.5
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         Copyright (c) 2006 Oracle Corporation.
-All rights reserved. This program and the accompanying materials
-are made available under the terms of the Eclipse Public License v1.0
-which accompanies this distribution, and is available at
-http://www.eclipse.org/legal/epl-v10.html
- 
-Contributors:
-    Gerry Kessler/Oracle - initial API and implementation
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/schema/customViewMapper.exsd b/jsf/plugins/org.eclipse.jst.jsf.core/schema/customViewMapper.exsd
deleted file mode 100644
index 19cea3f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/schema/customViewMapper.exsd
+++ /dev/null
@@ -1,104 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.jst.jsf.core" xmlns="http://www.w3.org/2001/XMLSchema">
-<annotation>
-      <appinfo>
-         <meta.schema plugin="org.eclipse.jst.jsf.core" id="customViewMapper" name="customViewMapper"/>
-      </appinfo>
-      <documentation>
-         NOT API.  CLIENTS SHOULD NOT USE.  FUTURE COMPATABILITY IS EXPLICITLY NOT GUARANTEED.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="customViewMapper"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="customViewMapper">
-      <complexType>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  Relative to the bundle name (actual id will be PLUGIN_ID + &quot;.&quot; + $id).
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.jst.jsf.designtime.internal.view.mapping.AbstractCustomViewMapper:"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="since"/>
-      </appinfo>
-      <documentation>
-         [Enter the first release in which this extension point appears.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="examples"/>
-      </appinfo>
-      <documentation>
-         [Enter extension point usage example here.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="apiinfo"/>
-      </appinfo>
-      <documentation>
-         [Enter API information here.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="implementation"/>
-      </appinfo>
-      <documentation>
-         [Enter information about supplied implementation of this extension point.]
-      </documentation>
-   </annotation>
-
-
-</schema>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/schema/externalcontext.exsd b/jsf/plugins/org.eclipse.jst.jsf.core/schema/externalcontext.exsd
deleted file mode 100644
index cea6bd2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/schema/externalcontext.exsd
+++ /dev/null
@@ -1,113 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.jst.jsf.core">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.jst.jsf.core" id="externalcontext" name="External Context"/>
-      </appInfo>
-      <documentation>
-         Contributes a new factory to create IDTExternalContext&apos;s.  The id can then be set on a project to indicate that this factory should be used by DTFacesContext whenever an IDTExternalContext is requested.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="externalcontext"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="externalcontext">
-      <complexType>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The unique id of this external context provider.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The factory class to be used to instantiate new IDTExternalContext instances.
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.jst.jsf.designtime.context.AbstractDTExternalContextFactory"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         1.5
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         [Enter extension point usage example here.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         Copyright 2006 Oracle
-All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse Public License v1.0 which accompanies this distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/schema/grammar-annotations.xsd b/jsf/plugins/org.eclipse.jst.jsf.core/schema/grammar-annotations.xsd
deleted file mode 100644
index 8b4a47e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/schema/grammar-annotations.xsd
+++ /dev/null
@@ -1,43 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<xsd:schema
-	targetNamespace="http://org.eclipse.jst.jsf.core/grammarAnnotationSchema" 
-	version="1.0"
-	attributeFormDefault="unqualified"
-	elementFormDefault="unqualified" 
-	xmlns="http://org.eclipse.jst.jsf.core/grammarAnnotationSchema"
-	xmlns:xsd="http://www.w3.org/2001/XMLSchema">
-	
-	<xsd:element name="grammar-annotations"
-		type="grammar-annotationType" />
-		
-	<xsd:complexType name="grammar-annotationType">
-		<xsd:sequence>
-			<xsd:element name="cm-element"
-				type="cm-elementType" minOccurs="1" maxOccurs="unbounded" />
-		</xsd:sequence>
-		<xsd:attribute name="caseSensitive" type="xsd:boolean" use="optional" default="true"/>
-	</xsd:complexType>
-	<xsd:complexType name="cm-elementType">
-		<xsd:sequence>
-			<xsd:element name="cm-attribute" type="cm-attributeType" minOccurs="0" maxOccurs="unbounded"/>
-			<xsd:element name="property" type="propertyType" minOccurs="0" maxOccurs="unbounded"/>
-		</xsd:sequence>
-		<xsd:attribute name="name" type="xsd:string" use="required"/>
-	</xsd:complexType>
-	<xsd:complexType name="cm-attributeType">
-		<xsd:sequence>
-			<xsd:element name="property"
-				type="propertyType" minOccurs="0" maxOccurs="unbounded"/>
-		</xsd:sequence>
-		<xsd:attribute name="name" type="xsd:string" use="required"/>
-	</xsd:complexType>
-	<xsd:complexType name="propertyType">
-		<xsd:sequence>
-			<xsd:element name="value" type="propertyValue" minOccurs="1" maxOccurs="unbounded"/>
-		</xsd:sequence>		
-		<xsd:attribute name="name" type="xsd:string" use="required"/>		
-	</xsd:complexType>
-	<xsd:complexType name="propertyValue">
-		<xsd:all></xsd:all>
-	</xsd:complexType>
-</xsd:schema>
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/schema/jsfAppConfigLocatorProviderFactory.exsd b/jsf/plugins/org.eclipse.jst.jsf.core/schema/jsfAppConfigLocatorProviderFactory.exsd
deleted file mode 100644
index 83a247e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/schema/jsfAppConfigLocatorProviderFactory.exsd
+++ /dev/null
@@ -1,102 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.jst.jsf.core" xmlns="http://www.w3.org/2001/XMLSchema">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.jst.jsf.core" id="jsfAppConfigLocatorProviderFactory" name="jsfAppConfigLocatorProviderFactory"/>
-      </appInfo>
-      <documentation>
-         internal... not provisional API
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <annotation>
-         <appInfo>
-            <meta.element />
-         </appInfo>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="locatorProvider" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="locatorProvider">
-      <complexType>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn=":org.eclipse.jst.jsf.core.jsfappconfig.internal.IJSFAppConfigLocatorProvider"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         [Enter the first release in which this extension point appears.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         [Enter extension point usage example here.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiinfo"/>
-      </appInfo>
-      <documentation>
-         [Enter API information here.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         [Enter information about supplied implementation of this extension point.]
-      </documentation>
-   </annotation>
-
-
-</schema>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/schema/jsfAppConfigManagerFactory.exsd b/jsf/plugins/org.eclipse.jst.jsf.core/schema/jsfAppConfigManagerFactory.exsd
deleted file mode 100644
index c263ee0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/schema/jsfAppConfigManagerFactory.exsd
+++ /dev/null
@@ -1,102 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.jst.jsf.core" xmlns="http://www.w3.org/2001/XMLSchema">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.jst.jsf.core" id="jsfAppConfigManagerFactory" name="JSF App Config Manager Factory"/>
-      </appInfo>
-      <documentation>
-         internal... not provisional API
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <annotation>
-         <appInfo>
-            <meta.element />
-         </appInfo>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="factory"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="factory">
-      <complexType>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn=":org.eclipse.jst.jsf.core.jsfappconfig.internal.IJSFAppConfigManagerFactory"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         [Enter the first release in which this extension point appears.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         [Enter extension point usage example here.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiinfo"/>
-      </appInfo>
-      <documentation>
-         [Enter API information here.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         [Enter information about supplied implementation of this extension point.]
-      </documentation>
-   </annotation>
-
-
-</schema>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/schema/jsfFacetConfiguration.exsd b/jsf/plugins/org.eclipse.jst.jsf.core/schema/jsfFacetConfiguration.exsd
deleted file mode 100644
index a8989ab..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/schema/jsfFacetConfiguration.exsd
+++ /dev/null
@@ -1,117 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.jst.jsf.core" xmlns="http://www.w3.org/2001/XMLSchema">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.jst.jsf.core" id="jsfFacetConfiguration" name="jsfFacetConfiguration"/>
-      </appInfo>
-      <documentation>
-         This extension point is for adopter products wishing to disable the default configuration options on the JSF facet install page.   The extender becomes responsible for all configuration of the JSF facet.
-&lt;p&gt;
-When this extension is present and disabled is set:
-&lt;ol&gt;
-    &lt;li&gt;No configuration will occur:&lt;/li&gt;
-&lt;ul&gt;
-    &lt;li&gt;faces configuration file will not be created or modified&lt;/li&gt;
-    &lt;li&gt;web application (web.xml) will not be updated&lt;/li&gt;
-&lt;/ul&gt;
-&lt;li&gt; The JSF Facet installation page will NOT display UI for, and the underlying data model will not contain: &lt;/li&gt;
-&lt;ul&gt;
-    &lt;li&gt;JSF Configuration File&lt;/li&gt;
-    &lt;li&gt;JSF Servlet Name&lt;/li&gt;
-    &lt;li&gt;JSF Servlet Classname&lt;/li&gt;
-    &lt;li&gt;URL Mapping Patterns&lt;/li&gt;   
-&lt;/ul&gt;
-&lt;/ol&gt;
-&lt;p&gt;
-&lt;b&gt;Important:&lt;/b&gt; It will be necessary for any adopter using this mechanism to handle all faces-config creation/modification and web.xml updates for the JSF facet using a facet install listener.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <annotation>
-         <appInfo>
-            <meta.element />
-         </appInfo>
-      </annotation>
-      <complexType>
-         <sequence minOccurs="0" maxOccurs="1">
-            <element ref="jsfFacetConfiguration"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="jsfFacetConfiguration">
-      <complexType>
-         <attribute name="disabled" type="boolean" use="required">
-            <annotation>
-               <documentation>
-                  if set true, the JSF Facet configuration UI will not display, and the configuration will not execute for either INSTALL or UNINSTALL operations.   This does not affect the library provider in any way.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         Galileo M7
-      </documentation>
-   </annotation>
-
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiinfo"/>
-      </appInfo>
-      <documentation>
-         &lt;b&gt;Provisional API&lt;/b&gt;
-      </documentation>
-   </annotation>
-
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         /*******************************************************************************
- * Copyright (c) 2009 Oracle. All rights reserved.
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0, which accompanies this distribution
- * and is available at http://www.eclipse.org/legal/epl-v10.html.
- *
- * Contributors:
- *     Oracle - initial API and implementation
- ******************************************************************************/
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/schema/jsfLibraries.exsd b/jsf/plugins/org.eclipse.jst.jsf.core/schema/jsfLibraries.exsd
deleted file mode 100644
index cfb5f58..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/schema/jsfLibraries.exsd
+++ /dev/null
@@ -1,161 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.jst.jsf.core">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.jst.jsf.core" id="jsfLibraries" name="JSF Libraries"/>
-      </appInfo>
-      <documentation>
-         This extension point allows clients to create named sets of jars for use with JavaServer Faces Applications.
-&lt;b&gt;Deprecated&lt;/b&gt; - adopters should now use &lt;code&gt;org.eclipse.jst.jsf.core.pluginProvidedJsfLibraries&lt;/code&gt;
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="jsfLibrary" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="jsfLibrary">
-      <annotation>
-         <documentation>
-            A named collection of jars that will be added to the classpath as a classpath container to a project that references it.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="name" type="string" use="required">
-            <annotation>
-               <documentation>
-                  A unique name for the library.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="isImplementation" type="boolean" use="required">
-            <annotation>
-               <documentation>
-                  Flag indicating that this libary is declared to be a JSF implementation and not just a JSF component library.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="maxVersionSupported">
-            <annotation>
-               <documentation>
-                  Used to declare which JSF specification this library will support.
-               </documentation>
-            </annotation>
-            <simpleType>
-               <restriction base="string">
-                  <enumeration value="v1_1">
-                  </enumeration>
-                  <enumeration value="v1_2">
-                  </enumeration>
-                  <enumeration value="UNKNOWN">
-                  </enumeration>
-               </restriction>
-            </simpleType>
-         </attribute>
-         <attribute name="archiveFilesDelegate" type="string" use="required">
-            <annotation>
-               <documentation>
-                  class that must extend org.eclipse.jst.jsf.core.jsflibraryregistry.JSFLibraryArchiveFilesDelegate to supply a collection of ArchiveFiles for the library
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.jst.jsf.core.jsflibraryregistry.JSFLibraryArchiveFilesDelegate"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         1.5
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         The following is an example of usage of pluginProvidedJsfLibraries extension point:
-
-&lt;p&gt;
-&lt;pre&gt;
-  &lt;extension point=&quot;org.eclipse.jst.jsf.core.jsfLibraries&quot;&gt;
-    &lt;jsfLibrary       
-       name=&quot;MyComponentLib1&quot;
-       isImplementation=&quot;false&quot;
-       maxVersionSupported=&quot;v1_1&quot;
-       archiveFilesDelegate=&quot;com.acme.jsf.libraries.MyComponentLibraryFiles&quot;/&gt;
-  &lt;/extension&gt;
-&lt;/pre&gt;
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         Value of the attribute class must be a fully qualified name of a Java class that extends the abstract class &lt;code&gt;org.eclipse.jst.jsf.core.jsflibraryregistry.JSFLibraryArchiveFilesDelegate&lt;/code&gt; and has a public 0-arg constructor.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         none
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         Copyright (c) 2005, 2007 Oracle Corporation.
-All rights reserved. This program and the accompanying materials
-are made available under the terms of the Eclipse Public License v1.0
-which accompanies this distribution, and is available at
-http://www.eclipse.org/legal/epl-v10.html
-
-Contributors:
-Gerry Kessler - initial API and implementation
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/schema/methodresolver.exsd b/jsf/plugins/org.eclipse.jst.jsf.core/schema/methodresolver.exsd
deleted file mode 100644
index 57b83d5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/schema/methodresolver.exsd
+++ /dev/null
@@ -1,124 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.jst.jsf.core">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.jst.jsf.core" id="methodresolver" name="Method Resolver"/>
-      </appInfo>
-      <documentation>
-         Allows a third-party to define an alternative instance of the design time method resolver.  This id can then be set on a project using DesignTimeApplicationManager.setMethodResolverProvider.  Once set on a project this id will be used to load the active design time method resolver.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="methodresolver"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="methodresolver">
-      <complexType>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The id to be used to identify this method resolver.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The class implementing the method resolver.
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.jst.jsf.designtime.el.AbstractDTMethodResolver"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         1.5
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         &lt;p&gt;The following example defines a new method resolver implemented by CustomDTMethodResolver&lt;/p&gt;
-
-&lt;p&gt;
-&lt;pre&gt;
-   &lt;extension
-         point=&quot;org.eclipse.jst.jsf.designtime.methodresolver&quot;&gt;
-      &lt;methodresolver
-            class=&quot;org.eclipse.jst.jsf.dtresolver.test.resolvers.CustomDTMethodResolver&quot;
-            id=&quot;org.eclipse.jst.jsf.dtresolver.test.methodresolver2&quot;/&gt;
-   &lt;/extension&gt;
-&lt;/pre&gt;
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         Copyright 2006 Oracle
-All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse Public License v1.0 which accompanies this distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/schema/pluginProvidedJsfLibraries.exsd b/jsf/plugins/org.eclipse.jst.jsf.core/schema/pluginProvidedJsfLibraries.exsd
deleted file mode 100644
index 030929d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/schema/pluginProvidedJsfLibraries.exsd
+++ /dev/null
@@ -1,200 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="extension" xmlns="http://www.w3.org/2001/XMLSchema">
-<annotation>
-      <appinfo>
-         <meta.schema plugin="extension" id="pluginProvidedJsfLibraries" name="JSF Libraries"/>
-      </appinfo>
-      <documentation>
-         This extension point allows clients to create named sets of jars for use with JavaServer Faces Applications.
-
-&lt;p&gt;&lt;b&gt;This extension point is provisional and subject to change&lt;/b&gt;&lt;/p&gt;
-
-&lt;b&gt;Deprecated&lt;/b&gt; Use org.eclipse.jst.common.project.facet.libraryProviders ext-pt
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <annotation>
-         <appinfo>
-            <meta.element deprecated="true" replacement="org.eclipse.jst.common.project.facet.libraryProviders" />
-         </appinfo>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="jsfLibrary" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appinfo>
-                  <meta.attribute deprecated="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appinfo>
-                  <meta.attribute deprecated="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true" deprecated="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="jsfLibrary">
-      <annotation>
-         <appinfo>
-            <meta.element labelAttribute="name" deprecated="true"/>
-         </appinfo>
-         <documentation>
-            A named collection of jars that will be added to the classpath as a classpath container to a project that references it.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="name" type="string" use="required">
-            <annotation>
-               <documentation>
-                  A unique, non-translatable, name for the library.  The plugin developer is responsible for ensuring uniqueness within the plugin.  This name, in combination with the plugin id, is used to identify the classpath container reference.
-               </documentation>
-               <appinfo>
-                  <meta.attribute deprecated="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="label" type="string">
-            <annotation>
-               <documentation>
-                  Translatable string for displaying the library name.
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true" deprecated="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="isImplementation" type="boolean" use="required">
-            <annotation>
-               <documentation>
-                  Flag indicating that this libary is declared to be a JSF implementation and not just a JSF component library.
-               </documentation>
-               <appinfo>
-                  <meta.attribute deprecated="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="maxVersionSupported">
-            <annotation>
-               <documentation>
-                  Used to declare which JSF specification this library will support.
-               </documentation>
-               <appinfo>
-                  <meta.attribute deprecated="true"/>
-               </appinfo>
-            </annotation>
-            <simpleType>
-               <restriction base="string">
-                  <enumeration value="v1_1">
-                  </enumeration>
-                  <enumeration value="v1_2">
-                  </enumeration>
-                  <enumeration value="UNKNOWN">
-                  </enumeration>
-               </restriction>
-            </simpleType>
-         </attribute>
-         <attribute name="archiveFilesDelegate" type="string" use="required">
-            <annotation>
-               <documentation>
-                  class that must extend org.eclipse.jst.jsf.core.jsflibraryregistry.JSFLibraryArchiveFilesDelegate to supply a collection of IPaths to jars in the library
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.jst.jsf.core.jsflibraryregistry.PluginProvidedJSFLibraryArchiveFilesDelegate" deprecated="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="since"/>
-      </appinfo>
-      <documentation>
-         2.0
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="examples"/>
-      </appinfo>
-      <documentation>
-         The following is an example of usage of pluginProvidedJsfLibraries extension point:
-
-&lt;p&gt;
-&lt;pre&gt;
-  &lt;extension point=&quot;org.eclipse.jst.jsf.core.pluginProvidedJsfLibraries&quot;&gt;
-    &lt;jsfLibrary       
-       name=&quot;MyComponentLib1&quot;
-       label=&quot;%MyComponentLib1.translatableLabel&quot;
-       isImplementation=&quot;false&quot;
-       maxVersionSupported=&quot;v1_1&quot;
-       archiveFilesDelegate=&quot;com.acme.jsf.libraries.MyComponentLibraryFiles&quot;/&gt;
-  &lt;/extension&gt;
-&lt;/pre&gt;
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="apiInfo"/>
-      </appinfo>
-      <documentation>
-         This extension point is deprecated.
-
-Value of the attribute class must be a fully qualified name of a Java class that extends the abstract class &lt;code&gt;org.eclipse.jst.jsf.core.jsflibraryregistry.PluginProvidedJSFLibraryJarFilesDelegate&lt;/code&gt; and has a public 0-arg constructor.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="implementation"/>
-      </appinfo>
-      <documentation>
-         none
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="copyright"/>
-      </appinfo>
-      <documentation>
-         Copyright (c) 2007 Oracle Corporation.
-All rights reserved. This program and the accompanying materials
-are made available under the terms of the Eclipse Public License v1.0
-which accompanies this distribution, and is available at
-http://www.eclipse.org/legal/epl-v10.html
-
-Contributors:
-Gerry Kessler - initial API and implementation
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/schema/propertyresolver.exsd b/jsf/plugins/org.eclipse.jst.jsf.core/schema/propertyresolver.exsd
deleted file mode 100644
index 2e51b28..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/schema/propertyresolver.exsd
+++ /dev/null
@@ -1,128 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.jst.jsf.core" xmlns="http://www.w3.org/2001/XMLSchema">
-<annotation>
-      <appinfo>
-         <meta.schema plugin="org.eclipse.jst.jsf.core" id="propertyresolver" name="Property Resolver"/>
-      </appinfo>
-      <documentation>
-         Allows a third-party to define an alternative instance of the design time property resolver.  This id can then be set on a project using DesignTimeApplicationManager.setPropertyResolverProvider.  Once set on a project this id will be used to load the active design time property resolver.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="propertyresolver"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="propertyresolver">
-      <complexType>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The id to be used to identify this property resolver.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The class implementing the property resolver.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.jst.jsf.designtime.el.AbstractDTPropertyResolver"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="forRuntimeClass" type="string">
-            <annotation>
-               <documentation>
-                  Names a class (it need not be on the class path at designtime) that this designtime property resolver is intended to shadow.
-
-The instance of AbstractDTPropertyResolver provided by the &apos;class&apos; attribute _must_ implement the IDecorativeResolver tagging interface in order to be used in this way.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="instancePerProject" type="boolean">
-            <annotation>
-               <documentation>
-                  Default if not specified is false.  This is backward compatible with pre-3.0 behaviour for the propertyresolver extension point.
-
-If set to false (or not set) a single instance of the property resolver will be used for all design time managers in the workspace.  If set to true, a new instance will be created on every time this property resolver becomes the active one on a design time application manager.
-
-If &apos;class&apos; specifies a type that implements org.eclipse.jst.jsf.designtime.el.IInstancePerProjectResolver, then setProject will be called with the host project.  Implementing this interface is optional.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="since"/>
-      </appinfo>
-      <documentation>
-         1.5
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="examples"/>
-      </appinfo>
-      <documentation>
-         &lt;p&gt;The following example defines a new property resolver implemented by CustomDTPropertyResolver&lt;/p&gt;
-
-&lt;p&gt;
-&lt;pre&gt;
-   &lt;extension
-         point=&quot;org.eclipse.jst.jsf.designtime.propertyresolver&quot;&gt;
-      &lt;propertyresolver
-            class=&quot;org.eclipse.jst.jsf.dtresolver.test.resolvers.CustomDTPropertyResolver&quot;
-            id=&quot;org.eclipse.jst.jsf.dtresolver.test.propertyresolver2&quot;/&gt;
-   &lt;/extension&gt;
-&lt;/pre&gt;
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-
-
-   <annotation>
-      <appinfo>
-         <meta.section type="copyright"/>
-      </appinfo>
-      <documentation>
-         Copyright 2006 Oracle
-All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse Public License v1.0 which accompanies this distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/schema/symbolContextResolverFactory.exsd b/jsf/plugins/org.eclipse.jst.jsf.core/schema/symbolContextResolverFactory.exsd
deleted file mode 100644
index 1a15270..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/schema/symbolContextResolverFactory.exsd
+++ /dev/null
@@ -1,104 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.jst.jsf.core" xmlns="http://www.w3.org/2001/XMLSchema">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.jst.jsf.core" id="symbolContextResolverFactory" name="Symbol Context Resolver Factory Delegate"/>
-      </appInfo>
-      <documentation>
-         [Enter description of this extension point.]
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <annotation>
-         <appInfo>
-            <meta.element />
-         </appInfo>
-      </annotation>
-      <complexType>
-         <choice>
-            <element ref="symbolFactoryDelegate"/>
-         </choice>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="symbolFactoryDelegate">
-      <complexType>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  PROVISIONAL API  -- Subject to change
-
-Use to add symbol factory delegates that get called before the SymbolContextResolver.
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.jst.jsf.designtime.resolver.AbstractStructuredDocumentSymbolResolverFactory:org.eclipse.core.runtime.IAdaptable"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         [Enter the first release in which this extension point appears.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         [Enter extension point usage example here.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiinfo"/>
-      </appInfo>
-      <documentation>
-         [Enter API information here.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         [Enter information about supplied implementation of this extension point.]
-      </documentation>
-   </annotation>
-
-
-</schema>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/schema/tagRegistryFactory.exsd b/jsf/plugins/org.eclipse.jst.jsf.core/schema/tagRegistryFactory.exsd
deleted file mode 100644
index 5ed79d7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/schema/tagRegistryFactory.exsd
+++ /dev/null
@@ -1,106 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.jst.jsf.core" xmlns="http://www.w3.org/2001/XMLSchema">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.jst.jsf.core" id="tagRegistryFactoryProvider" name="Tag Registry Factory Provider"/>
-      </appInfo>
-      <documentation>
-         Internal use only. Do not use.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <annotation>
-         <appInfo>
-            <meta.element />
-         </appInfo>
-      </annotation>
-      <complexType>
-         <sequence>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="factoryProvider">
-      <annotation>
-         <documentation>
-            Define the factory used to create all available tag registries.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  A provider used to override the default creation of tag registries by the CompositeTagRegistry.
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.jst.jsf.core.internal.AbstractTagRegistryFactory:"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         [Enter the first release in which this extension point appears.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         [Enter extension point usage example here.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiinfo"/>
-      </appInfo>
-      <documentation>
-         [Enter API information here.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         [Enter information about supplied implementation of this extension point.]
-      </documentation>
-   </annotation>
-
-
-</schema>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/schema/tagregistry.exsd b/jsf/plugins/org.eclipse.jst.jsf.core/schema/tagregistry.exsd
deleted file mode 100644
index c343236..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/schema/tagregistry.exsd
+++ /dev/null
@@ -1,129 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.jst.jsf.core" xmlns="http://www.w3.org/2001/XMLSchema">
-<annotation>
-      <appinfo>
-         <meta.schema plugin="org.eclipse.jst.jsf.core" id="tagregistry" name="JSF Tag Library Registry"/>
-      </appinfo>
-      <documentation>
-         Internal.  Not for external use.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="tagRegistry"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="tagRegistry">
-      <complexType>
-         <choice>
-            <element ref="content-type" minOccurs="1" maxOccurs="unbounded"/>
-         </choice>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The class implementing the registry.  Must extend org.eclipse.jst.jsf.designtime.internal.view.model.AbstractTagRegistry.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.jst.jsf.designtime.internal.view.model.TagRegistryFactory:"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  An identifier that is unique within the defining plugin for tagRegistries.  The id will be prepended with the id of the defining plugin to ensure system uniqueness.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="description" type="string">
-            <annotation>
-               <documentation>
-                  Used as user viewable short name for this tag registry in the tag registry view, preference pages and other UI.
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="content-type">
-      <complexType>
-         <attribute name="contentTypeId" type="string" use="required">
-            <annotation>
-               <documentation>
-                  Content type identifier. This is an ID defined by the &apos;org.eclipse.core.runtime.contentTypes&apos; extension point.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="since"/>
-      </appinfo>
-      <documentation>
-         3.0
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="examples"/>
-      </appinfo>
-      <documentation>
-         [Enter extension point usage example here.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="apiinfo"/>
-      </appinfo>
-      <documentation>
-         [Enter API information here.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="implementation"/>
-      </appinfo>
-      <documentation>
-         [Enter information about supplied implementation of this extension point.]
-      </documentation>
-   </annotation>
-
-
-</schema>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/schema/variableresolver.exsd b/jsf/plugins/org.eclipse.jst.jsf.core/schema/variableresolver.exsd
deleted file mode 100644
index 4fe690d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/schema/variableresolver.exsd
+++ /dev/null
@@ -1,128 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.jst.jsf.core" xmlns="http://www.w3.org/2001/XMLSchema">
-<annotation>
-      <appinfo>
-         <meta.schema plugin="org.eclipse.jst.jsf.core" id="variableresolver" name="Variable Resolver"/>
-      </appinfo>
-      <documentation>
-         Allows a third-party to define an alternative instance of the design time variable resolver.  This id can then be set on a project using DesignTimeApplicationManager.setVariableResolverProvider.  Once set on a project this id will be used to load the active design time variable resolver.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="variableresolver"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="variableresolver">
-      <complexType>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The id to be used to identify this property resolver.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The class implementing the property resolver.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.jst.jsf.designtime.el.AbstractDTVariableResolver"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="forRuntimeClass" type="string">
-            <annotation>
-               <documentation>
-                  Names a class (it need not be on the class path at designtime) that this designtime variable resolver is intended to shadow.
-
-The instance of AbstractDTVariableResolver provided by the &apos;class&apos; attribute _must_ implement the IDecorativeResolver tagging interface in order to be used in this way.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="instancePerProject" type="boolean">
-            <annotation>
-               <documentation>
-                  Default if not specified is false.  This is backward compatible with pre-3.0 behaviour for the variableresolver extension point.
-
-If set to false (or not set) a single instance of the variable resolver will be used for all design time managers in the workspace.  If set to true, a new instance will be created on every time this variable resolver becomes the active one on a design time application manager.
-
-If &apos;class&apos; specifies a type that implements org.eclipse.jst.jsf.designtime.el.IInstancePerProjectResolver, then setProject will be called with the host project.  Implementing this interface is optional.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="since"/>
-      </appinfo>
-      <documentation>
-         1.5
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="examples"/>
-      </appinfo>
-      <documentation>
-         &lt;p&gt;The following example defines a new variable resolver implemented by CustomDTVariableResolver&lt;/p&gt;
-
-&lt;p&gt;
-&lt;pre&gt;
-   &lt;extension
-         point=&quot;org.eclipse.jst.jsf.designtime.variableresolver&quot;&gt;
-      &lt;variableresolver
-            class=&quot;org.eclipse.jst.jsf.dtresolver.test.resolvers.CustomDTVariableResolver&quot;
-            id=&quot;org.eclipse.jst.jsf.dtresolver.test.variableresolver1&quot;/&gt;
-   &lt;/extension&gt;
-&lt;/pre&gt;
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-
-
-   <annotation>
-      <appinfo>
-         <meta.section type="copyright"/>
-      </appinfo>
-      <documentation>
-         Copyright 2006 Oracle
-All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse Public License v1.0 which accompanies this distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/schema/viewhandler.exsd b/jsf/plugins/org.eclipse.jst.jsf.core/schema/viewhandler.exsd
deleted file mode 100644
index 999dfef..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/schema/viewhandler.exsd
+++ /dev/null
@@ -1,104 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.jst.jsf.core" xmlns="http://www.w3.org/2001/XMLSchema">
-<annotation>
-      <appinfo>
-         <meta.schema plugin="org.eclipse.jst.jsf.core" id="viewhandler" name="viewhandler"/>
-      </appinfo>
-      <documentation>
-         Internal.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="viewhandler"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="viewhandler">
-      <complexType>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The view handler class.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.jst.jsf.designtime.internal.view.AbstractDTViewHandler:"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  Idenifies the view handler.  Value must be unique for view handlers defined within the scope of the defining plugin.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="since"/>
-      </appinfo>
-      <documentation>
-         3.4
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="examples"/>
-      </appinfo>
-      <documentation>
-         [Enter extension point usage example here.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="apiinfo"/>
-      </appinfo>
-      <documentation>
-         Not API.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="implementation"/>
-      </appinfo>
-      <documentation>
-         [Enter information about supplied implementation of this extension point.]
-      </documentation>
-   </annotation>
-
-
-</schema>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/IJSFCoreConstants.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/IJSFCoreConstants.java
deleted file mode 100644
index 0e8ff1a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/IJSFCoreConstants.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.core;
-
-import org.eclipse.wst.common.project.facet.core.IProjectFacet;
-
-/**
- * JSF Core framework constants
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author cbateman
- *
- */
-public final class IJSFCoreConstants 
-{
-    /**
-     * The global id for the JSF facet
-     * TODO: align with extensioin point through plugin.properties
-     */
-    public static final String JSF_CORE_FACET_ID = "jst.jsf"; //$NON-NLS-1$
-    /**
-     * The facet version for a JSF 1.0 project
-     * TODO: align with extensioin point through plugin.properties
-     */
-    public final static String                  FACET_VERSION_1_0 = "1.0"; //$NON-NLS-1$
-    /**
-     * The constant id for a JSF 1.0 project
-     */
-    public final static String                  JSF_VERSION_1_0 = FACET_VERSION_1_0;
-    /**
-     * The facet version for a JSF 1.1 project
-     * TODO: align with extensioin point through plugin.properties
-     */
-    public final static String                  FACET_VERSION_1_1 = "1.1"; //$NON-NLS-1$
-    /**
-     * The constant id for a JSF 1.1 project
-     */
-    public final static String                  JSF_VERSION_1_1 = FACET_VERSION_1_1;
-    /**
-     * The facet version for a JSF 1.2 project
-     * TODO: align with extensioin point through plugin.properties
-     */
-    public final static String                  FACET_VERSION_1_2 = "1.2";//$NON-NLS-1$
-    /**
-     * The constant id for a JSF 1.2 project
-     */
-    public final static String                  JSF_VERSION_1_2 = FACET_VERSION_1_2;
-
-    /**
-     * The facet version for a JSF 2.0 project
-     */
-    public static final String                  FACET_VERSION_2_0 = "2.0"; //$NON-NLS-1$
-    /**
-     * The version string for a JSF 2.0 project
-     */
-    public static final String JSF_VERSION_2_0 = FACET_VERSION_2_0;
-    
-    /**
-     * @param facet
-     * @return true if the facet is a jsf facet.
-     * 
-     */
-    public static boolean isJSFFacet(final IProjectFacet facet)
-    {
-        return JSF_CORE_FACET_ID.equals(facet.getId());
-    }
-    private IJSFCoreConstants()
-    {
-        // no instantiation
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/JSFVersion.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/JSFVersion.java
deleted file mode 100644
index a76ab54..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/JSFVersion.java
+++ /dev/null
@@ -1,149 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.core;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.wst.common.project.facet.core.FacetedProjectFramework;
-import org.eclipse.wst.common.project.facet.core.IFacetedProject;
-import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
-import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
-
-/** 
- * @author gekessle
- *
- */
-public enum JSFVersion {
-	
-	/**
-	 * Unknown version support
-	 */
-	UNKNOWN,
-	/**
-	 * Supports JSF Version 1.0
-	 */
-	V1_0,
-	/**
-	 * Supports JSF Version 1.1
-	 */
-	V1_1,
-	/**
-	 * Supports JSF Version 1.1
-	 */
-	V1_2,
-	/**
-	 * Supports JSF Version 2.0
-	 */
-	V2_0;
-	
-	// WARNING: you MUST add newer versions to the end; the ordinal value of
-	// of the version is used in compareTo.
-    @Override
-    public String toString() {
-        switch(this)
-        {
-            case V1_0:
-                return IJSFCoreConstants.JSF_VERSION_1_0;
-            case V1_1:
-                return IJSFCoreConstants.JSF_VERSION_1_1;
-            case V1_2:
-                return IJSFCoreConstants.JSF_VERSION_1_2;
-            case V2_0:
-                return IJSFCoreConstants.JSF_VERSION_2_0;
-            case UNKNOWN:
-                return "unknown"; //$NON-NLS-1$
-            default:
-                throw new IllegalStateException("Missing string conversion: "+this.name()); //$NON-NLS-1$
-        }
-    }
-
-    /**
-     * @param valueAsString
-     * @return the reverse mapping to an enum from toString() returns
-     */
-    public static JSFVersion valueOfString(String  valueAsString)
-    {
-        if (IJSFCoreConstants.JSF_VERSION_1_0.equals(valueAsString))
-        {
-            return V1_0;
-        }
-        else if (IJSFCoreConstants.JSF_VERSION_1_1.equals(valueAsString))
-        {
-            return V1_1;
-        }
-        else if (IJSFCoreConstants.JSF_VERSION_1_2.equals(valueAsString))
-        {
-            return V1_2;
-        }
-        else if (IJSFCoreConstants.FACET_VERSION_2_0.equals(valueAsString))
-        {
-            return V2_0;
-        }
-        else if ("unknown".equals(valueAsString)) //$NON-NLS-1$
-        {
-            return UNKNOWN;
-        }
-        else
-        {
-            return null;
-        }
-    }
-    
-    /**
-     * @param facetVersion
-     * @return the jsf version for the facet version
-     * @throw IllegalArgumentException if the underlying facet is not a JSF facet.
-     */
-    public static JSFVersion valueOfFacetVersion(final IProjectFacetVersion facetVersion)
-    {
-        if (!IJSFCoreConstants.isJSFFacet(facetVersion.getProjectFacet()))
-        {
-            throw new IllegalArgumentException("Not a JSF facet: "+facetVersion.getProjectFacet().toString()); //$NON-NLS-1$
-        }
-        
-        String versionString = facetVersion.getVersionString();
-        if (versionString != null)
-        {
-            return valueOfString(versionString);
-        }
-        return null;
-    }
-    
-    /**
-     * @param project
-     * @return the project version of the project.
-     */
-    public static JSFVersion valueOfProject(final IProject project)
-    {
-        try
-        {
-            if (project != null && FacetedProjectFramework.isFacetedProject(project))
-            {
-                IFacetedProject fProj = ProjectFacetsManager.create(project);
-                if (fProj != null)
-                {
-                    IProjectFacetVersion projectFacetVersion = fProj.getProjectFacetVersion(
-                            ProjectFacetsManager.getProjectFacet(IJSFCoreConstants.JSF_CORE_FACET_ID));
-                    if (projectFacetVersion != null)
-                    {
-                        return valueOfFacetVersion(projectFacetVersion);
-                    }
-                }
-            }
-        }
-        catch(final CoreException ce)
-        {
-            // ignore and fall-through
-            // TODO: is this worth logging?
-        }
-        return null;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/AbstractTagRegistryFactoryProvider.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/AbstractTagRegistryFactoryProvider.java
deleted file mode 100644
index 5e2c01c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/AbstractTagRegistryFactoryProvider.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package org.eclipse.jst.jsf.core.internal;
-
-import java.util.Set;
-
-/**
- * Sub-classed by all tag registry factories
- * @author cbateman
- *
- */
-public abstract class AbstractTagRegistryFactoryProvider implements ITagRegistryFactoryProvider
-{
-    public abstract Set<ITagRegistryFactoryInfo> getTagRegistryFactories();
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/CompositeJSFPreferenceModel.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/CompositeJSFPreferenceModel.java
deleted file mode 100644
index 08dabf9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/CompositeJSFPreferenceModel.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.core.internal;
-
-import java.util.List;
-
-import org.eclipse.core.runtime.preferences.IScopeContext;
-import org.eclipse.jface.preference.IPreferenceStore;
-
-/**
- * Composite of preference models
- * 
- * @author cbateman
- *
- */
-public class CompositeJSFPreferenceModel implements IJSFPreferenceModel
-{
-    private final List<IJSFPreferenceModel> _models;
-
-    /**
-     * @param models
-     */
-    public CompositeJSFPreferenceModel(final List<IJSFPreferenceModel> models)
-    {
-        _models = models;
-    }
-
-    /* 
-     * Commits all child instances
-     */
-    public void commit(final IPreferenceStore prefStore)
-    {
-        for (final IJSFPreferenceModel model : _models)
-        {
-            model.commit(prefStore);
-        }
-    }
-
-    /**
-     * Searches each child until it finds the value associated with key.
-     * @return null if not found.
-     */
-    public Object getStoredValueByKey(final IScopeContext context, final String key)
-    {
-        Object value = null;
-        
-        SEARCH: for (final IJSFPreferenceModel model : _models)
-        {
-            value = model.getStoredValueByKey(context, key);
-            if (value != null)
-            {
-                break SEARCH;
-            }
-        }
-        return value;
-    }
-
-    /**
-     * Same as getStoredValueByKey but using getValueByKey instead
-     */
-    public Object getValueByKey(final IScopeContext context, final String key)
-    {
-        Object value = null;
-        
-        SEARCH: for (final IJSFPreferenceModel model : _models)
-        {
-            value = model.getValueByKey(context, key);
-            if (value != null)
-            {
-                break SEARCH;
-            }
-        }
-        return value;
-    }
-
-    /**
-     * Calls load on all children with prefStore
-     */
-    public void load(final IPreferenceStore prefStore)
-    {
-        for (final IJSFPreferenceModel model : _models)
-        {
-            model.load(prefStore);
-        }
-    }
-
-    /**
-     * Calls set defaults on all children
-     */
-    public void setDefaults()
-    {
-        for (final IJSFPreferenceModel model : _models)
-        {
-            model.setDefaults();
-        }
-    }
-
-    public Object setValueByKey(final IScopeContext context, final String key, final Object value)
-    {
-        for (final IJSFPreferenceModel model : _models)
-        {
-            if (model.getValueByKey(context, key) != null)
-            {
-                return model.setValueByKey(context, key, value);
-            }
-        }
-        return null;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/CompositeTagRegistryFactory.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/CompositeTagRegistryFactory.java
deleted file mode 100644
index a3abf88..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/CompositeTagRegistryFactory.java
+++ /dev/null
@@ -1,309 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.core.internal;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.content.IContentType;
-import org.eclipse.jst.jsf.common.internal.policy.CanonicallyOrderedIteratorPolicy;
-import org.eclipse.jst.jsf.common.internal.policy.IIteratorPolicy;
-import org.eclipse.jst.jsf.common.internal.policy.IdentifierOrderedIteratorPolicy;
-import org.eclipse.jst.jsf.common.internal.strategy.AbstractIdentifiableStrategy;
-import org.eclipse.jst.jsf.common.internal.strategy.IIdentifiableStrategy;
-import org.eclipse.jst.jsf.common.internal.strategy.IteratorPolicyBasedStrategyComposite;
-import org.eclipse.jst.jsf.designtime.internal.view.model.ITagRegistry;
-import org.eclipse.jst.jsf.designtime.internal.view.model.TagRegistryFactory.TagRegistryFactoryException;
-
-/**
- * Employs a policy-based strategy to construct a TagRegistry for a particular
- * content-type in a particular project.
- * 
- * @author cbateman
- * 
- */
-public final class CompositeTagRegistryFactory
-{
-    private static CompositeTagRegistryFactory INSTANCE;
-
-    private static ITagRegistryFactoryProvider   TEST_PROVIDER;
-    /**
-     * For JUNIT TEST ONLY!!!!!
-     * @param factoryProvider
-     */
-    public synchronized void setTestInjectedProvider(final ITagRegistryFactoryProvider factoryProvider)
-    {
-        TEST_PROVIDER = factoryProvider;
-        // TODO: this is risky
-//        _cachedExtensionsByType.clear();
-    }
-
-    /**
-     * @return the single instance of the registry factory
-     */
-    public static synchronized CompositeTagRegistryFactory getInstance()
-    {
-        if (INSTANCE == null)
-        {
-            INSTANCE = new CompositeTagRegistryFactory();
-        }
-        return INSTANCE;
-    }
-
-//    private final Map<TagRegistryIdentifier, Set<ITagRegistryFactoryInfo>> _cachedExtensionsByType =
-//        new HashMap<TagRegistryIdentifier, Set<ITagRegistryFactoryInfo>>(4);
-
-    private CompositeTagRegistryFactory()
-    {
-        // singleton: no external instantiation
-    }
-
-    
-    /**
-     * @param id
-     * @return a tag registry for the id or null if there isn't one.
-     */
-    public final ITagRegistry getRegistry(final TagRegistryIdentifier id)
-    {
-        final Set<ITagRegistryFactoryInfo> handlers = getAllTagRegistryFactories();
-
-        final Set<ITagRegistryFactoryInfo> matchingHandlers = findMatchingExtensions(
-                id, handlers);
-
-        if (matchingHandlers.size() > 0)
-        {
-            // optimize: if there is only one handler, no need for strategy
-            if (matchingHandlers.size() == 1)
-            {
-                try
-                {
-                    return matchingHandlers.iterator().next().getTagRegistryFactory()
-                            .createTagRegistry(id.getProject());
-                }
-                catch (TagRegistryFactoryException e)
-                {
-                    JSFCorePlugin.log(e, "While trying to acquire a registry"); //$NON-NLS-1$
-                }
-            }
-            else
-            {
-                // for now, we will order by the canonical name of the extension
-                // id in ascending order. Later, we may make this preference
-                // based.
-                final TagRegistrySelectionStrategy selectionStrategy = new TagRegistrySelectionStrategy(
-                        new CanonicallyOrderedIteratorPolicy<String>());
-
-                for (final Iterator<ITagRegistryFactoryInfo> it = matchingHandlers
-                        .iterator(); it.hasNext();)
-                {
-                    selectionStrategy.addStrategy(it.next().getTagRegistryFactory());
-                }
-                return selectionStrategy.perform(id.getProject());
-            }
-        }
-
-        return null;
-    }
-
-    /**
-     * @return get all tag registry factories
-     */
-    public Set<ITagRegistryFactoryInfo> getAllTagRegistryFactories()
-    {
-        List<String>  selectionOrder = new ArrayList<String>();
-        selectionOrder.add("testInjection"); //$NON-NLS-1$
-        selectionOrder.add("extensionPointInjection"); //$NON-NLS-1$
-        selectionOrder.add("platformDefault"); //$NON-NLS-1$
-
-        IdentifierOrderedIteratorPolicy<String> policy = new IdentifierOrderedIteratorPolicy<String>(selectionOrder);
-        // ignore iterator values that don't exist in the list of possible selections.
-        policy.setExcludeNonExplicitValues(true);
-        final TagRegistryFactoryProviderSelectionStrategy providerSelector
-            = new TagRegistryFactoryProviderSelectionStrategy(policy);
-        providerSelector.addStrategy(
-          new AbstractIdentifiableStrategy<IProject, ITagRegistryFactoryProvider, String>("testInjection", "FIXME: not for display", null) //$NON-NLS-1$ //$NON-NLS-2$
-        {
-            @Override
-            public ITagRegistryFactoryProvider perform(IProject input)
-                    throws Exception
-            {
-                ITagRegistryFactoryProvider injectedProvider = null;
-                synchronized(CompositeTagRegistryFactory.class)
-                {
-                     injectedProvider = TEST_PROVIDER;
-                }
-                if (injectedProvider != null)
-                {
-                    final ITagRegistryFactoryProvider useMe = injectedProvider;
-                    return new AbstractTagRegistryFactoryProvider()
-                    {
-                        @Override
-                        public Set<ITagRegistryFactoryInfo> getTagRegistryFactories()
-                        {
-                            return useMe.getTagRegistryFactories();
-                        }
-                    };
-                }
-                return null;
-            }
-            });
-        providerSelector.addStrategy(
-                new AbstractIdentifiableStrategy<IProject, ITagRegistryFactoryProvider, String>("platformDefault", "FIXME: not for display", null) //$NON-NLS-1$ //$NON-NLS-2$
-              {
-                  @Override
-                  public ITagRegistryFactoryProvider perform(IProject input)
-                          throws Exception
-                  {
-                      return new AbstractTagRegistryFactoryProvider()
-                      {
-                          @Override
-                          public Set<ITagRegistryFactoryInfo> getTagRegistryFactories()
-                          {
-                              return TagLibraryRegistryLoader.getAllHandlers();
-                          }
-                      };
-                  }
-              });
-
-        ITagRegistryFactoryProvider provider = providerSelector.perform(null);
-        if (provider != null)
-        {
-            return provider.getTagRegistryFactories();
-        }
-        return Collections.emptySet();
-    }
-
-	private Set<ITagRegistryFactoryInfo> findMatchingExtensions(
-			TagRegistryIdentifier id, Set<ITagRegistryFactoryInfo> handlers) 
-	{
-		Set<ITagRegistryFactoryInfo> matching = new HashSet<ITagRegistryFactoryInfo>(
-				4);
-
-		for (final ITagRegistryFactoryInfo handler : handlers) {
-			if (handler.getContentTypes().contains(id.getContentType())
-					&& handler.getTagRegistryFactory().projectIsValid(
-							id.getProject())) {
-				matching.add(handler);
-			}
-		}
-
-		// // if there is nothing matching, just store the empty set and
-		// // discard the extra memory
-		// if (matching.size() > 0)
-		// {
-		// _cachedExtensionsByType.put(id, matching);
-		// }
-		// else
-		// {
-		// _cachedExtensionsByType.put(id, Collections.EMPTY_SET);
-		// }
-		return matching;
-	}
-
-    /**
-     * Identifies a content type/project context in which to request a tag
-     * registry.
-     * 
-     * @author cbateman
-     * 
-     */
-    public final static class TagRegistryIdentifier
-    {
-        private final IProject     _project;
-        private final IContentType _contentType;
-
-        /**
-         * @param project
-         * @param contentType
-         */
-        public TagRegistryIdentifier(final IProject project,
-                final IContentType contentType)
-        {
-            _project = project;
-            _contentType = contentType;
-        }
-
-        /**
-         * @return project
-         */
-        public IProject getProject()
-        {
-            return _project;
-        }
-
-        /**
-         * @return content type
-         */
-        public IContentType getContentType()
-        {
-            return _contentType;
-        }
-        
-        public boolean equals(final Object o) {
-        	if (o instanceof TagRegistryIdentifier) {        	
-	        	final TagRegistryIdentifier other = (TagRegistryIdentifier)o;
-	        	final int otherProjectHash = other.getProject() != null ? other.getProject().hashCode() : 0;
-	        	final int thisProjectHash = getProject() != null ? getProject().hashCode() : 0;
-	        	if (otherProjectHash == thisProjectHash &&
-	        			other.getContentType().equals(this.getContentType()))
-	        		return true;
-        	}
-        	return false;
-        }
-        
-        public int hashCode() {
-        	return (getProject() != null ? getProject().hashCode() : 0) + 7*_contentType.hashCode();
-        }
-
-    }
-
-    private static class TagRegistrySelectionStrategy
-            extends
-            IteratorPolicyBasedStrategyComposite<IProject, ITagRegistry, ITagRegistry, String, IIdentifiableStrategy<IProject, ITagRegistry, String>>
-    {
-        private static final ITagRegistry NO_RESULT = null;
-
-        protected TagRegistrySelectionStrategy(IIteratorPolicy<String> policy)
-        {
-            super(policy);
-        }
-
-        @Override
-        public ITagRegistry getNoResult()
-        {
-            return NO_RESULT;
-        }
-    }
-    
-    private static class TagRegistryFactoryProviderSelectionStrategy
-            extends
-            IteratorPolicyBasedStrategyComposite<IProject, ITagRegistryFactoryProvider, ITagRegistryFactoryProvider, String, IIdentifiableStrategy<IProject, ITagRegistryFactoryProvider, String>>
-    {
-        protected TagRegistryFactoryProviderSelectionStrategy(
-                IIteratorPolicy<String> policy)
-        {
-            super(policy);
-        }
-
-        private static final ITagRegistryFactoryProvider NO_RESULT = null;
-
-        @Override
-        public ITagRegistryFactoryProvider getNoResult()
-        {
-            return NO_RESULT;
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/IJSFPreferenceModel.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/IJSFPreferenceModel.java
deleted file mode 100644
index 13af43b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/IJSFPreferenceModel.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman - initial implementation
- *******************************************************************************/ 
-
-package org.eclipse.jst.jsf.core.internal;
-
-import org.eclipse.core.runtime.preferences.IScopeContext;
-import org.eclipse.jface.preference.IPreferenceStore;
-
-/**
- * Defines a generic JSF preferences model
- * 
- * @author cbateman
- *
- */
-public interface IJSFPreferenceModel 
-{
-    /**
-     * Loads the object from the preference store provided
-     * 
-     * @param prefStore
-     */
-    public void load(IPreferenceStore  prefStore);
-    
-    /**
-     * Copies the object into the preference store but DOES NOT SAVE IT
-     * 
-     * @param prefStore
-     */
-    public void commit(IPreferenceStore prefStore);
-    
-    /**
-     * Reverts the model to it's defaults.  Does not commit to pref store. 
-     */
-    public void setDefaults();
-
-    /**
-     * @param context
-     * @param key
-     * @return the preference value in context with using key as the id
-     */
-    public Object getValueByKey(final IScopeContext context, final String key);
-
-    /**
-     * @param context
-     * @param key
-     * @return the preference value in context using key as the id and drawing
-     * it directly from the preference store
-     */
-    public Object getStoredValueByKey(final IScopeContext context, final String key);
-    
-    /**
-     * Set the preference value indicated by key in context to value.  May
-     * throw ClassCastException if value is not the type expected for the key
-     * @param context
-     * @param key
-     * @param value
-     * @return the old value
-     */
-    public Object setValueByKey(final IScopeContext context, final String key, final Object value);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/ITagRegistryFactoryInfo.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/ITagRegistryFactoryInfo.java
deleted file mode 100644
index 8af6236..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/ITagRegistryFactoryInfo.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package org.eclipse.jst.jsf.core.internal;
-
-import java.util.Set;
-
-import org.eclipse.core.runtime.content.IContentType;
-import org.eclipse.jst.jsf.designtime.internal.view.model.TagRegistryFactory;
-
-/**
- * @author cbateman
- * @noimplement
- */
-public interface ITagRegistryFactoryInfo
-{
-    /**
-     * @return the content types that the tag registry supports.
-     */
-    public abstract Set<IContentType> getContentTypes();
-
-    /**
-     * @return the tag registry factory.
-     */
-    public abstract TagRegistryFactory getTagRegistryFactory();
-
-    /**
-     * @return the unique id of the factory.
-     */
-    public abstract String getId();
-
-    /**
-     * @return the description of the tag registry factory.
-     */
-    public abstract String getDescription();
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/ITagRegistryFactoryProvider.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/ITagRegistryFactoryProvider.java
deleted file mode 100644
index 95ddab7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/ITagRegistryFactoryProvider.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package org.eclipse.jst.jsf.core.internal;
-
-import java.util.Set;
-
-/**
- * The factory provider interface for tag registries.
- *
- */
-public interface ITagRegistryFactoryProvider
-{
-    /**
-     * @return the set of tag registry factories to be used to construct
-     * tag registries.
-     */
-    Set<ITagRegistryFactoryInfo>  getTagRegistryFactories();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/JSFCorePlugin.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/JSFCorePlugin.java
deleted file mode 100644
index 5d0aeea..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/JSFCorePlugin.java
+++ /dev/null
@@ -1,375 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler - initial API and implementation
- *    Ian Trimble - JSFLibraryRegistry work
- *******************************************************************************/
-package org.eclipse.jst.jsf.core.internal;
-
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.ILog;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.preferences.InstanceScope;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jst.jsf.context.IDelegatingFactory;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.internal.IStructuredDocumentContextResolverFactory2;
-import org.eclipse.jst.jsf.designtime.context.AbstractDTExternalContextFactory;
-import org.eclipse.jst.jsf.designtime.el.AbstractDTMethodResolver;
-import org.eclipse.jst.jsf.designtime.el.AbstractDTPropertyResolver;
-import org.eclipse.jst.jsf.designtime.el.AbstractDTVariableResolver;
-import org.eclipse.jst.jsf.designtime.internal.BasicExtensionFactory;
-import org.eclipse.jst.jsf.designtime.internal.DecoratableExtensionFactory;
-import org.eclipse.jst.jsf.designtime.internal.BasicExtensionFactory.ExtensionData;
-import org.eclipse.jst.jsf.designtime.internal.resolver.ViewBasedTaglibResolverFactory;
-import org.eclipse.jst.jsf.designtime.internal.view.AbstractDTViewHandler;
-import org.eclipse.ui.preferences.ScopedPreferenceStore;
-import org.eclipse.wst.common.frameworks.internal.WTPPlugin;
-import org.osgi.framework.BundleContext;
-
-/**
- * JSF Core plugin.
- * 
- * @author Gerry Kessler - Oracle, Ian Trimble - Oracle
- */
-public class JSFCorePlugin extends WTPPlugin
-{
-    /**
-     * The plugin id
-     */
-    public static final String             PLUGIN_ID = "org.eclipse.jst.jsf.core"; // org.eclipse.jst.jsf.core.internal.JSFCorePlugin"; //$NON-NLS-1$
-    // //$NON-NLS-1$
-
-    /**
-     * The extension point id (plugin relative) for the tag registry factory provider.
-     */
-    public static final String             TAG_REGISTRY_FACTORY_PROVIDER_ID = "tagRegistryFactory"; //$NON-NLS-1$
-
-    // The shared instance.
-    private static JSFCorePlugin           plugin;
-
-    private IPreferenceStore               preferenceStore;
-
-    private ViewBasedTaglibResolverFactory _tagLibResolverFactory;
-
-    /**
-     * The constructor.
-     */
-    public JSFCorePlugin()
-    {
-        plugin = this;
-    }
-
-    /**
-     * This method is called upon plug-in activation
-     * 
-     * @param context
-     * @throws Exception
-     */
-    @Override
-    public void start(final BundleContext context) throws Exception
-    {
-        super.start(context);
-        final IStructuredDocumentContextResolverFactory2 factory = IStructuredDocumentContextResolverFactory2.INSTANCE;
-        if (factory instanceof IDelegatingFactory)
-        {
-            _tagLibResolverFactory = new ViewBasedTaglibResolverFactory();
-            ((IDelegatingFactory) factory)
-            .addFactoryDelegate(_tagLibResolverFactory);
-        }
-        else
-        {
-            log("Error adding tag resolver delegate", new Throwable()); //$NON-NLS-1$
-        }
-    }
-
-    /**
-     * This method is called when the plug-in is stopped
-     * 
-     * @param context
-     * @throws Exception
-     */
-    @Override
-    public void stop(final BundleContext context) throws Exception
-    {
-        super.stop(context);
-
-        final IStructuredDocumentContextResolverFactory2 factory = IStructuredDocumentContextResolverFactory2.INSTANCE;
-
-        if (factory instanceof IDelegatingFactory
-                && _tagLibResolverFactory != null)
-        {
-            ((IDelegatingFactory) factory)
-            .removeFactoryDelegate(_tagLibResolverFactory);
-        }
-        plugin = null;
-    }
-
-    /**
-     * Returns the shared instance.
-     * 
-     * @return the shared instance
-     */
-    public static JSFCorePlugin getDefault()
-    {
-        return plugin;
-    }
-
-    /**
-     * @param e
-     * @param msg
-     */
-    public static void log(final Exception e, final String msg)
-    {
-        final ILog log = getDefault().getLog();
-
-        log.log(new Status(IStatus.ERROR, PLUGIN_ID, IStatus.OK, msg, e));
-    }
-
-    /**
-     * Logs using the default ILog implementation provided by getLog().
-     * 
-     * @param severity
-     *            Severity (IStatus constant) of log entry
-     * @param message
-     *            Human-readable message describing log entry
-     * @param ex
-     *            Throwable instance (can be null)
-     */
-    public static void log(final int severity, final String message,
-            final Throwable ex)
-    {
-        getDefault().getLog().log(
-                new Status(severity, PLUGIN_ID, IStatus.OK, message, ex));
-    }
-
-    /**
-     * Logs using the default ILog implementation provided by getLog().
-     * 
-     * @param severity
-     *            Severity (IStatus constant) of log entry
-     * @param message
-     *            Human-readable message describing log entry
-     */
-    public static void log(final int severity, final String message)
-    {
-        log(severity, message, null);
-    }
-
-    /**
-     * Logs a message for this plugin
-     * 
-     * @param message
-     * @param t
-     */
-    public static void log(final String message, final Throwable t)
-    {
-        final ILog log = plugin.getLog();
-        log.log(new Status(IStatus.ERROR, plugin.getBundle().getSymbolicName(),
-                0, message, t));
-    }
-
-    @Override
-    public String getPluginID()
-    {
-        return PLUGIN_ID;
-    }
-
-    /**
-     * @param id 
-     * @return all registered symbol source providers
-     */
-    public synchronized static ExtensionData<AbstractDTVariableResolver> getVariableResolvers(final String id)
-    {
-        checkAndInitVariableResolverFactory();
-        return _variableResolverFactory.getExtensions().get(id);
-    }
-
-    /**
-     * @param forName
-     * @return the ids of variable resolvers for 'forName'.
-     */
-    public synchronized static List<String> getVariableResolversForName(
-            final String forName)
-    {
-        checkAndInitVariableResolverFactory();
-        return Collections.unmodifiableList(_variableResolverFactory
-                .getIdsForName(forName));
-    }
-
-    /**
-     * @return true if there any decorative resolvers in the system.  This
-     * is provided so that decorative variable resolvers can avoid expensive
-     * calculations looking for these resolvers when there are none.
-     */
-    public synchronized static boolean hasDecorativeVariableResolvers()
-    {
-        checkAndInitVariableResolverFactory();
-        return _variableResolverFactory.getNumDecorativeResolvers() > 0;
-    }
-    
-    private synchronized static void checkAndInitVariableResolverFactory()
-    {
-        if (_variableResolverFactory == null)
-        {
-            _variableResolverFactory = new DecoratableExtensionFactory<AbstractDTVariableResolver>(
-                    getDefault().getBundle(), VARIABLE_RESOLVER_EXT_POINT_NAME,
-                    VARIABLE_RESOLVER_ELEMENT_NAME, false);
-        }
-    }
-
-    private static DecoratableExtensionFactory<AbstractDTVariableResolver> _variableResolverFactory;
-    private final static String                                            VARIABLE_RESOLVER_EXT_POINT_NAME = "variableresolver"; //$NON-NLS-1$
-    private final static String                                            VARIABLE_RESOLVER_ELEMENT_NAME   = "variableresolver"; //$NON-NLS-1$
-
-    /**
-     * @param id 
-     * @return a map of all registered property resolvers by id
-     */
-    public synchronized static ExtensionData<AbstractDTPropertyResolver> getPropertyResolver(final String id)
-    {
-        checkAndInitPropertyFactory();
-        return _propertyResolverFactory.getExtensions().get(id);
-    }
-
-    private synchronized static void checkAndInitPropertyFactory()
-    {
-        if (_propertyResolverFactory == null)
-        {
-            _propertyResolverFactory = new DecoratableExtensionFactory<AbstractDTPropertyResolver>(
-                    getDefault().getBundle(), PROPERTY_RESOLVER_EXT_POINT_NAME,
-                    PROPERTY_RESOLVER_ELEMENT_NAME, false);
-        }
-    }
-
-    /**
-     * @param forName
-     * @return the ids of variable resolvers for 'forName'.
-     */
-    public synchronized static List<String> getPropertyResolversForName(
-            final String forName)
-    {
-        checkAndInitVariableResolverFactory();
-        return Collections.unmodifiableList(_propertyResolverFactory
-                .getIdsForName(forName));
-    }
-
-    /**
-     * @return true if there an decorating resolvers
-     */
-    public synchronized static boolean hasDecorativePropertyResolvers()
-    {
-        checkAndInitVariableResolverFactory();
-        return _propertyResolverFactory.getNumDecorativeResolvers() > 0;
-    }
-    
-    private static DecoratableExtensionFactory<AbstractDTPropertyResolver> _propertyResolverFactory;
-    private final static String                                     PROPERTY_RESOLVER_EXT_POINT_NAME = "propertyresolver"; //$NON-NLS-1$
-    private final static String                                     PROPERTY_RESOLVER_ELEMENT_NAME   = "propertyresolver"; //$NON-NLS-1$
-
-    /**
-     * @param id 
-     * @return a map of all registered method resolvers by id
-     */
-    public synchronized static ExtensionData<AbstractDTMethodResolver> getMethodResolvers(final String id)
-    {
-        checkAndInitMethodResolverFactory();
-        return _methodResolverFactory.getExtensions().get(id);
-    }
-
-    private synchronized static void checkAndInitMethodResolverFactory()
-    {
-        if (_methodResolverFactory == null)
-        {
-            _methodResolverFactory = new BasicExtensionFactory<AbstractDTMethodResolver>(
-                    getDefault().getBundle(), METHOD_RESOLVER_EXT_POINT_NAME,
-                    METHOD_RESOLVER_ELEMENT_NAME, false);
-        }
-    }
-    private static BasicExtensionFactory<AbstractDTMethodResolver> _methodResolverFactory;
-    private final static String                                   METHOD_RESOLVER_EXT_POINT_NAME = "methodresolver"; //$NON-NLS-1$
-    private final static String                                   METHOD_RESOLVER_ELEMENT_NAME   = "methodresolver"; //$NON-NLS-1$
-
-    /**
-     * @param id 
-     * @return a map of all registered external context providers by id
-     */
-    public synchronized static ExtensionData<AbstractDTExternalContextFactory> getExternalContextProviders(final String id)
-    {
-        checkAndInitExternalContextFactory();
-        return _externalContextResolverFactory.getExtensions().get(id);
-    }
-
-    private synchronized static void checkAndInitExternalContextFactory()
-    {
-        if (_externalContextResolverFactory == null)
-        {
-            _externalContextResolverFactory = new BasicExtensionFactory<AbstractDTExternalContextFactory>(
-                    getDefault().getBundle(), EXTERNAL_CONTEXT_EXT_POINT_NAME,
-                    EXTERNAL_CONTEXT_ELEMENT_NAME, false);
-        }
-    }
-    
-    private static BasicExtensionFactory<AbstractDTExternalContextFactory> _externalContextResolverFactory;
-    private final static String                                           EXTERNAL_CONTEXT_EXT_POINT_NAME = "externalcontext"; //$NON-NLS-1$
-    private final static String                                           EXTERNAL_CONTEXT_ELEMENT_NAME   = "externalcontext"; //$NON-NLS-1$
-
-    /**
-     * @param id 
-     * @return a map of all registered external context providers by id
-     */
-    public synchronized static ExtensionData<AbstractDTViewHandler> getViewHandlers(final String id)
-    {
-        checkAndInitViewHandler();
-        return _viewHandlerFactory.getExtensions().get(id);
-    }
-
-    private synchronized static void checkAndInitViewHandler()
-    {
-        if (_viewHandlerFactory == null)
-        {
-            _viewHandlerFactory = new BasicExtensionFactory<AbstractDTViewHandler>(
-                    getDefault().getBundle(), VIEWHANDLER_EXT_POINT_NAME,
-                    VIEWHANDLER_ELEMENT_NAME, true);
-        }
-    }
-
-    private static BasicExtensionFactory<AbstractDTViewHandler> _viewHandlerFactory;
-    private final static String                                VIEWHANDLER_EXT_POINT_NAME = "viewhandler"; //$NON-NLS-1$
-    private final static String                                VIEWHANDLER_ELEMENT_NAME   = "viewhandler"; //$NON-NLS-1$
-
-    /**
-     * @return the preference store for this bundle TODO: this is copied from
-     *         AbstractUIPlugin; need to upgrade to new IPreferencesService
-     */
-    public synchronized IPreferenceStore getPreferenceStore()
-    {
-        // Create the preference store lazily.
-        if (this.preferenceStore == null)
-        {
-            this.preferenceStore = new ScopedPreferenceStore(
-                    new InstanceScope(), getBundle().getSymbolicName());
-
-        }
-        return this.preferenceStore;
-    }
-
-    /**
-     * @param name
-     * @return the extension point called name for this bundle
-     */
-    public IExtensionPoint getExtension(final String name)
-    {
-        return Platform.getExtensionRegistry().getExtensionPoint(
-                plugin.getBundle().getSymbolicName(), name);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/JSFCoreTraceOptions.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/JSFCoreTraceOptions.java
deleted file mode 100644
index 4beb9e3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/JSFCoreTraceOptions.java
+++ /dev/null
@@ -1,145 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.core.internal;
-
-import org.eclipse.osgi.framework.debug.FrameworkDebugOptions;
-import org.eclipse.osgi.service.debug.DebugOptions;
-
-/**
- * Defines that standard runtime trace options for debugging. See .options file
- * for definitions.
- * 
- * @author cbateman
- * 
- */
-public final class JSFCoreTraceOptions
-{
-    /**
-     * True if debug tracing is enabled. Other tracing cannot be enabled unless
-     * this is enabled.
-     */
-    public static final boolean ENABLED;
-
-    /**
-     * True if tag introspector tracing is enabled
-     */
-    public static final boolean TRACE_JSPTAGINTROSPECTOR;
-    /**
-     * True if tag introspector performance tracing is enabled
-     */
-    public static final boolean TRACE_JSPTAGINTROSPECTOR_PERF;
-
-    /**
-     * True if the JSP tag registry tracing is enabled
-     */
-    public static final boolean TRACE_JSPTAGREGISTRY;
-    
-    /**
-     * True if handling of JSP TagIndex changes are being traced
-     */
-    public static final boolean TRACE_JSPTAGREGISTRY_CHANGES;
-
-    /**
-     * True if the JSP persistent jsp tag resolver strategy is being traced.
-     */
-    public static final boolean TRACE_JSPTAGPERSISTENCE;
-
-    /**
-     * True if the TLD registry manager tracing is enabled
-     */
-    public static final boolean TRACE_TLDREGISTRYMANAGER;
-    
-    
-    /**
-     * True if the TLD registry performance tracing is enabled
-     */
-    public static final boolean TRACE_JSPTAGREGISTRY_PERF;
-
-    private static final String KEY_DEBUG_ENABLED = "/debug"; //$NON-NLS-1$
-    private static final String KEY_DESIGNTIME = "/designtime"; //$NON-NLS-1$
-    private static final String KEY_DESIGNTIME_VIEW = KEY_DESIGNTIME + "/view"; //$NON-NLS-1$
-    private static final String KEY_VIEW_JSPTAGINTROSPECTOR = KEY_DESIGNTIME_VIEW
-            + "/jsptagintrospection"; //$NON-NLS-1$
-    private static final String KEY_VIEW_JSPTAGINTROSPECTOR_PERF = 
-        KEY_VIEW_JSPTAGINTROSPECTOR + "/perf"; //$NON-NLS-1$
-    private static final String KEY_VIEW_JSPTAGREGISTRY = KEY_DESIGNTIME_VIEW
-            + "/jsptagregistry"; //$NON-NLS-1$
-    private static final String KEY_VIEW_JSPTAGPERSISTENCE = KEY_DESIGNTIME_VIEW
-            + "/jsptagpersistence"; //$NON-NLS-1$
-    private static final String KEY_VIEW_JSPTAGREGISTRY_CHANGES =
-        KEY_VIEW_JSPTAGREGISTRY + "/changes"; //$NON-NLS-1$
-    private static final String KEY_VIEW_JSPTAGREGISTRY_PERF =
-        KEY_VIEW_JSPTAGREGISTRY + "/perf"; //$NON-NLS-1$
-    private static final String KEY_VIEW_TLDREGISTRYMANAGER =
-        KEY_DESIGNTIME_VIEW + "/tldregistrymanager"; //$NON-NLS-1$
-
-    
-    static
-    {
-        final DebugOptions debugOptions = FrameworkDebugOptions.getDefault();
-
-        ENABLED = debugOptions != null
-                && debugOptions.getBooleanOption(JSFCorePlugin.PLUGIN_ID
-                        + KEY_DEBUG_ENABLED, false);
-
-        if (ENABLED)
-        {
-            TRACE_JSPTAGINTROSPECTOR = debugOptions.getBooleanOption(
-                    JSFCorePlugin.PLUGIN_ID + KEY_VIEW_JSPTAGINTROSPECTOR, false);
-            TRACE_JSPTAGREGISTRY = debugOptions.getBooleanOption(
-                    JSFCorePlugin.PLUGIN_ID + KEY_VIEW_JSPTAGREGISTRY, false);
-            TRACE_JSPTAGREGISTRY_CHANGES = debugOptions.getBooleanOption(
-                    JSFCorePlugin.PLUGIN_ID + KEY_VIEW_JSPTAGREGISTRY_CHANGES, false);
-            TRACE_TLDREGISTRYMANAGER = debugOptions.getBooleanOption(
-                    JSFCorePlugin.PLUGIN_ID + KEY_VIEW_TLDREGISTRYMANAGER, false);
-            TRACE_JSPTAGREGISTRY_PERF = debugOptions.getBooleanOption(
-                    JSFCorePlugin.PLUGIN_ID + KEY_VIEW_JSPTAGREGISTRY_PERF, false);
-            TRACE_JSPTAGINTROSPECTOR_PERF = debugOptions.getBooleanOption(
-                    JSFCorePlugin.PLUGIN_ID + KEY_VIEW_JSPTAGINTROSPECTOR_PERF, false);
-            TRACE_JSPTAGPERSISTENCE = debugOptions.getBooleanOption(
-                    JSFCorePlugin.PLUGIN_ID + KEY_VIEW_JSPTAGPERSISTENCE, false);
-        }
-        else
-        {
-            TRACE_JSPTAGINTROSPECTOR = false;
-            TRACE_JSPTAGREGISTRY = false;
-            TRACE_JSPTAGREGISTRY_CHANGES = false;
-            TRACE_TLDREGISTRYMANAGER = false;
-            TRACE_JSPTAGREGISTRY_PERF = false;
-            TRACE_JSPTAGINTROSPECTOR_PERF = false;
-            TRACE_JSPTAGPERSISTENCE = false;
-        }
-    }
-
-    /**
-     * @param message
-     */
-    public static void log(final String message)
-    {
-        System.out.println(message);
-    }
-    
-    /**
-     * @param msg A short label placed before the trace of t to show the source
-     * @param t
-     */
-    public static void log(final String msg, final Throwable t)
-    {
-        System.out.printf("%s: Exception Trace:\n\n",msg); //$NON-NLS-1$
-        t.printStackTrace(System.out);
-        System.out.print("\n\n\n"); //$NON-NLS-1$
-    }
-
-    private JSFCoreTraceOptions()
-    {
-        // no instantiation
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/JSFLibrariesContainerInitializer.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/JSFLibrariesContainerInitializer.java
deleted file mode 100644
index 9884d9d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/JSFLibrariesContainerInitializer.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.core.internal;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.jdt.core.ClasspathContainerInitializer;
-import org.eclipse.jdt.core.IClasspathContainer;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jst.jsf.core.internal.jsflibraryconfig.JSFLibraryRegistryUtil;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary;
-import org.eclipse.jst.jsf.core.jsflibraryconfiguration.JSFLibraryConfigurationHelper;
-
-/**
- * Initialize JSF Libraries as classpath containers
- */
-@SuppressWarnings("deprecation")
-public class JSFLibrariesContainerInitializer extends
-		ClasspathContainerInitializer {
-
-	private static final String MISSING_LIBRARY = Messages.JSFLibrariesContainerInitializer_missing_library;
-
-	/**
-	 * Constructor
-	 */
-	public JSFLibrariesContainerInitializer() {
-		super();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jdt.core.ClasspathContainerInitializer#initialize(org.eclipse.core.runtime.IPath, org.eclipse.jdt.core.IJavaProject)
-	 */
-	public void initialize(IPath containerPath, IJavaProject project) throws CoreException {
-		if (isJSFLibraryContainer(containerPath)) {
-			String libId= containerPath.lastSegment();
-						
-			JSFLibrary ref= JSFLibraryRegistryUtil.getInstance().getJSFLibraryRegistry().getJSFLibraryByID(libId);
-			if (ref != null) {
-				JSFLibraryClasspathContainer container= new JSFLibraryClasspathContainer(ref);
-				JavaCore.setClasspathContainer(containerPath, new IJavaProject[] { project }, 	new IClasspathContainer[] { container }, null);
-			}
-		}
-	}
-	
-	private boolean isJSFLibraryContainer(IPath path) {
-		return path != null && path.segmentCount() == 2 && JSFLibraryConfigurationHelper.JSF_LIBRARY_CP_CONTAINER_ID.equals(path.segment(0));
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jdt.core.ClasspathContainerInitializer#canUpdateClasspathContainer(org.eclipse.core.runtime.IPath, org.eclipse.jdt.core.IJavaProject)
-	 */
-	public boolean canUpdateClasspathContainer(IPath containerPath, IJavaProject project) {
-		return isJSFLibraryContainer(containerPath); 
-	}
-
-	/**
-	 * @see org.eclipse.jdt.core.ClasspathContainerInitializer#getDescription(org.eclipse.core.runtime.IPath, org.eclipse.jdt.core.IJavaProject)
-	 */
-	public String getDescription(IPath containerPath, IJavaProject project) {
-		if (isJSFLibraryContainer(containerPath)) {
-			String id = containerPath.lastSegment();
-			JSFLibrary libref = JSFLibraryRegistryUtil.getInstance().getJSFLibraryRegistry().getJSFLibraryByID(id);
-			String displayText = id;
-
-			if (libref == null){
-				displayText = displayText + " " + MISSING_LIBRARY; //$NON-NLS-1$
-			}
-			
-			return displayText;
-		}
-		return super.getDescription(containerPath, project);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jdt.core.ClasspathContainerInitializer#getComparisonID(org.eclipse.core.runtime.IPath, org.eclipse.jdt.core.IJavaProject)
-	 */
-	public Object getComparisonID(IPath containerPath, IJavaProject project) {
-		return containerPath;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/JSFLibraryClasspathContainer.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/JSFLibraryClasspathContainer.java
deleted file mode 100644
index 3d03bf4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/JSFLibraryClasspathContainer.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.core.internal;
-
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jdt.core.IClasspathContainer;
-import org.eclipse.jdt.core.IClasspathEntry;
-import org.eclipse.jst.jsf.core.internal.jsflibraryconfig.JSFLibraryRegistryUtil;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary;
-import org.eclipse.jst.jsf.core.jsflibraryconfiguration.JSFLibraryConfigurationHelper;
-
-
-/**
- * JSF Library classpath container
- */
-@SuppressWarnings("deprecation")
-public class JSFLibraryClasspathContainer implements IClasspathContainer {
-	private static final String NON_IMPL_DESC = Messages.JSFLibraryClasspathContainer_NON_IMPL_LIBRARY;
-	private static final String IMPL_DESC = Messages.JSFLibraryClasspathContainer_IMPL_LIBRARY;
-	
-	private JSFLibrary lib;
-	
-	/**
-	 * @param lib 
-	 */
-	public JSFLibraryClasspathContainer(JSFLibrary lib) {
-		this.lib = lib;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jdt.core.IClasspathContainer#getClasspathEntries()
-	 */
-	public IClasspathEntry[] getClasspathEntries() {
-		return JSFLibraryRegistryUtil.getInstance().getClasspathEntries(lib);		
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jdt.core.IClasspathContainer#getDescription()
-	 */
-	public String getDescription() {
-		StringBuffer buf = new StringBuffer(lib.getLabel());
-		buf.append(" "); //$NON-NLS-1$
-		if (lib.isImplementation())
-			buf.append(IMPL_DESC);
-		else
-			buf.append(NON_IMPL_DESC);
-		
-		return buf.toString();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jdt.core.IClasspathContainer#getKind()
-	 */
-	public int getKind() {
-		return IClasspathContainer.K_APPLICATION;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jdt.core.IClasspathContainer#getPath()
-	 */
-	public IPath getPath() {		
-		return new Path(JSFLibraryConfigurationHelper.JSF_LIBRARY_CP_CONTAINER_ID).append(this.lib.getID());
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/JSFRegistryVersionInfo.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/JSFRegistryVersionInfo.java
deleted file mode 100644
index 19fa696..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/JSFRegistryVersionInfo.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.core.internal;
-
-import org.osgi.framework.Version;
-
-/**
- * A value object the describes the current and expected state of the JSF Library
- * Registry
- * 
- * @author cbateman
- *
- */
-final class JSFRegistryVersionInfo 
-{
-    private Version     _curVersion;        // the version of the current registry on disk
-    private Version     _expectedVersion;   // the expected or required version of the registry
-    
-    JSFRegistryVersionInfo(Version oldVersion, Version expectedVersion) 
-    {
-        super();
-        _curVersion = oldVersion;
-        _expectedVersion = expectedVersion;
-    }
-
-    /**
-     * @return the version of the registry found in the current workspace
-     */
-    public Version getCurVersion() {
-        return _curVersion;
-    }
-
-    /**
-     * @return the version of the registry that is expected
-     */
-    public Version getExpectedVersion() {
-        return _expectedVersion;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/Messages.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/Messages.java
deleted file mode 100644
index 9f92eec..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/Messages.java
+++ /dev/null
@@ -1,311 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler - initial API and implementation
- *    Ian Trimble - changed to work correctly with org.eclipse.osgi.util.NLS
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.internal;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * String resource handler.
- * 
- * @author Gerry Kessler - Oracle, Ian Trimble - Oracle
- */
-public class Messages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.jst.jsf.core.internal.messages"; //$NON-NLS-1$
-
-    /**
-     * see messages.properties
-     */
-    public static String Could_Not_GetJSFVersion;
-
-	/**
-	 * see messages.properties
-	 */
-	public static String JSFFacetInstallDataModelProvider_DupeJarValidation;
-
-	/**
-	 * see messages.properties
-	 */
-	public static String JSFFacetInstallDataModelProvider_INITIAL_VALIDATION_IMPL_TYPE;
-
-    /**
-     * see messages.properties
-     */
-    public static String JSFFacetInstallDataModelProvider_INVALID_JSF_CONFIG_FILE_NAME;
-
-
-	/**
-	 * see messages.properties
-	 */
-	public static String JSFLibCfgDialogSettingData_Sticky_Component_Lib_Not_Exist;
-
-	/**
-	 * see messages.properties
-	 */
-	public static String JSFLibrariesContainerInitializer_missing_library;
-
-	/**
-	 * see messages.properties
-	 */
-	public static String JSFLibraryClasspathContainer_IMPL_LIBRARY;
-
-	/**
-	 * see messages.properties
-	 */
-	public static String JSFLibraryClasspathContainer_NON_IMPL_LIBRARY;
-
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryConfigModel_Null_Data_Source;
-
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryConfigPersistData_SAVED_COMPLIB_NOT_FOUND;
-
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryConfigPersistData_SAVED_IMPLLIB_NOT_FOUND;
-
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryRegistry_ErrorCreatingURL;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryRegistry_NoLoadCreatingNew;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryRegistry_ErrorSaving;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryRegistry_DEFAULT_IMPL_LABEL;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryRegistry_ErrorLoadingFromExtPt;
-
-    /**
-     * see messages.properties
-     */
-	public static String JSFFacetInstallDataModelProvider_ValidateServletName;
-    /**
-     * see messages.properties
-     */
-	public static String JSFFacetInstallDataModelProvider_ValidateConfigFileEmpty;
-    /**
-     * see messages.properties
-     */
-	public static String JSFFacetInstallDataModelProvider_ValidateConfigFilePath;
-    /**
-     * see messages.properties
-     */
-	public static String JSFFacetInstallDataModelProvider_ValidateConfigFileRelative1;
-    /**
-     * see messages.properties
-     */
-	public static String JSFFacetInstallDataModelProvider_ValidateConfigFileRelative2;
-    /**
-     * see messages.properties
-     */
-	public static String JSFFacetInstallDataModelProvider_ValidateConfigFileXML;
-    /**
-     * see messages.properties
-     */
-	public static String JSFFacetInstallDataModelProvider_ValidateConfigFileSlashes;
-
-    /**
-     * see messages.properties
-     */
-	public static String ArchiveFileImpl_CannotCopyFile;
-    /**
-     * see messages.properties
-     */
-	public static String ArchiveFileImpl_CannotCloseFile;
-    /**
-     * see messages.properties
-     */
-	public static String ArchiveFileImpl_CannotLocatePluginRelativeFile;
-
-    /**
-     * see messages.properties
-     */
-	public static String JSFUtils_MissingJAR;
-
-    /**
-     * see messages.properties
-     */
-	public static String PluginProvidedJSFLibraryCreationHelper_ErrorCreating;
-    /**
-     * see messages.properties
-     */
-	public static String PluginProvidedJSFLibraryCreationHelper_ErrorMultipleDefinition;
-
-    /**
-     * see messages.properties
-     */
-	public static String JSFUtils_ErrorCreatingConfigFile;
-    /**
-     * see messages.properties
-     */
-	public static String JSFUtils_ErrorClosingConfigFile;
-
-    /**
-     * see messages.properties
-     */
-	public static String JSFAppConfigUtils_ErrorOpeningJarFile;
-
-    /**
-     * see messages.properties
-     */
-	public static String JARFileJSFAppConfigProvider_ErrorLoadingModel;
-
-    /**
-     * see messages.properties
-     */
-	public static String J2EEModuleDependencyDelegate_UpdatingJ2EEModuleDependencies;
-    /**
-     * see messages.properties
-     */
-	public static String J2EEModuleDependencyDelegate_UpdatingJ2EEModuleDependenciesForProject;
-
-    /**
-     * see messages.properties
-     */
-	public static String JSFRegistryMigration05_to_10_title;
-    /**
-     * see messages.properties
-     */
-	public static String JSFRegistryMigration05_to_10_message;
-
-    /**
-     * see messages.properties
-     */
-    public static String JSFRegistryMigration05_to_10_customMessage;
-    
-
-    /**
-     * see messages.properties
-     */
-	public static String JSFRegistryMigrationCannot05_to_10_title;
-    /**
-     * see messages.properties
-     */
-	public static String JSFRegistryMigrationCannot05_to_10_message;
-
-    /**
-     * see messages.properties
-     */
-    public static String JSFRegistryMigrationCannot05_to_10_customMessage;
-
-
-	/**
-	 * see messages.properties
-	 */
-	public static String RegistryMigrationStartupHandler_Dialog_Abort_And_Exit_Migration;
-
-    /**
-     * see messages.properties
-     */
-	public static String RegistryMigrationStartupHandler_Dialog_Confirm_Migration;
-
-    /**
-     * see messages.properties
-     */
-	public static String RegistryMigrationStartupHandler_Error_committing_migration;
-
-    /**
-     * see messages.properties
-     */
-	public static String RegistryMigrationStartupHandler_Error_Rolling_Back_Migration;
-
-    /**
-     * see messages.properties
-     */
-	public static String RegistryMigrationStartupHandler_Launch_Migration_Doc_On_Confirm;
-	/**
-	 * see messages.properties
-	 */
-    public static String RegistryUpgradeCommitHandler_Text;
-	/**
-	 * see messages.properties
-	 */
-	public static String RegistryUpgradeCommitHandler_Title;
-
-	/**
-     * see messages.properties
-     */
-	public static String JSFFacet11_presetLabel;
-	
-    /**
-     * see messages.properties
-     */
-	public static String JSFFacet11_presetDescription;
-	
-	/**
-	 * see messages.properties
-	 */
-	public static String JSFFacetInstallDelegate_AllowJavascriptDescription;
-
-    /**
-     * see messages.properties
-     */
-    public static String JSFFacetInstallDelegate_AutoScrollDescription;
-
-    /**
-	 * see messages.properties
-	 */
-	public static String JSFFacetInstallDelegate_InternalErr;
-	/**
-	 * see messages.properties
-	 */
-	public static String JSFFacetInstallDelegate_ConfigErr;
-
-    /**
-     * see messages.properties
-     */
-    public static String JSFFacetInstallDelegate_MaxFileSizeDescription;
-	/**
-	 * see messages.properties
-	 */
-	public static String JSFFacetInstallDelegate_NonUpdateableWebXML;
-
-    /**
-     * see messages.properties
-     */
-    public static String JSFFacetInstallDelegate_PrettyHtmlDescription;
-
-    /**
-     * see messages.properties
-     */
-    public static String JSFFacetInstallDelegate_StateSavingMethod;
-	/**
-	 * see messages.properties
-	 */
-	public static String JSFFacetUninstallDelegate_ConfigErr;
-	/**
-	 * see messages.properties
-	 */
-	public static String JSFFacetUninstallDelegate_NonUpdateableWebXML;	
-	/**
-	 * see messages.properties
-	 */
-	public static String JSFLibraryValidator_MISSING_JSF_IMPLEMENTATION_CLASSES;
-
-	static {
-		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/RegistryUpgradeCommitHandler.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/RegistryUpgradeCommitHandler.java
deleted file mode 100644
index 80b7e73..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/RegistryUpgradeCommitHandler.java
+++ /dev/null
@@ -1,171 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.core.internal;
-
-import java.net.MalformedURLException;
-import java.net.URL;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.util.JSFLibraryRegistryUpgradeUtil;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.util.UpgradeStatus;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.browser.IWorkbenchBrowserSupport;
-
-/**
- * Commits registry migration
- * @author cbateman
- *
- */
-@SuppressWarnings("deprecation")
-public class RegistryUpgradeCommitHandler
-{
-
-    /**
-     * handle migration
-     */
-	public static void commitMigrationIfNecessary()
-    {
-        JSFLibraryRegistryUpgradeUtil upgradeUtil =
-            JSFLibraryRegistryUpgradeUtil.getInstance();
-
-        UpgradeStatus status = upgradeUtil.getUpgradeStatus();
-
-        if (status.getSeverity() == IStatus.OK)
-        {
-        	if (status.isUpgradeOccurred())
-        	{
-        		handle05_to_10(status);
-        	}
-        }
-        else
-        {
-        	handleErrorInMigration(status);
-        }
-    }
-
-    private static void handle05_to_10(UpgradeStatus status)
-    {
-        PlatformUI.getWorkbench().getDisplay().asyncExec(new Handle05_to_10_migration(status));
-    }
-
-    private static void handleErrorInMigration(UpgradeStatus status)
-    {
-    	PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable()
-    	{
-    		public void run()
-    		{
-    			final Shell shell = PlatformUI.getWorkbench().getDisplay().getActiveShell();
-    			MessageDialog.openError(shell, Messages.RegistryUpgradeCommitHandler_Title, Messages.RegistryUpgradeCommitHandler_Text);
-    		}
-    	});
-    }
-    
-    private static class Handle05_to_10_migration implements Runnable
-    {
-        private final UpgradeStatus     _status;
-
-        Handle05_to_10_migration(UpgradeStatus status)
-        {
-            _status = status;
-        }
-
-        public void run()
-        {
-            // no prompting necessary.  just commit.
-       		doConfirmed(false);
-        }
-        
-    	private void doConfirmed(boolean userWantsMigrationDocLaunch) {
-    		// delete V1 registry, leave backup file
-    		IStatus result = _status.commit();
-    		
-    		if (result.getSeverity() != IStatus.OK)
-    		{
-    			final Shell  shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
-    			MessageDialog.openError(shell, Messages.RegistryMigrationStartupHandler_Error_committing_migration, result.getMessage());
-    		}
-    		
-    		// if user confirmed, launch migration doc
-    		if (userWantsMigrationDocLaunch)
-				try {
-					IWorkbenchBrowserSupport browserSupport = 
-						PlatformUI.getWorkbench().getBrowserSupport();
-					URL url = new URL("http://wiki.eclipse.org/index.php/JSF_Library_Migration"); //$NON-NLS-1$
-					browserSupport.createBrowser("JSFMigrationDoc").openURL(url); //$NON-NLS-1$
-				} catch (PartInitException e) {
-					JSFCorePlugin.log(e,"Error handling migration"); //$NON-NLS-1$
-				} catch (MalformedURLException e) {
-					JSFCorePlugin.log(e,"Error handling migration"); //$NON-NLS-1$
-				}
-    	}
-    	
-//    	private void doAbortAndExit()
-//    	{
-//    		// rollback
-//    		IStatus result = _status.rollback();
-//    		
-//    		if (result.getSeverity() != IStatus.OK)
-//    		{
-//    			final Shell  shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
-//    			MessageDialog.openError(shell, Messages.RegistryMigrationStartupHandler_Error_Rolling_Back_Migration, result.getMessage());
-//    		}
-//    		// close workbench
-//    		PlatformUI.getWorkbench().close();
-//    	}
-//    }
-//    
-//    private static class ConfirmDialog extends MessageDialogWithToggle
-//    {
-//    	final static int	CONFIRMED = 0;
-//    	final static int	ABORT_AND_EXIT = 1;
-//    	
-//		/**
-//		 * @param parentShell
-//		 * @param dialogTitle
-//		 * @param dialogMessage
-//		 */
-//		public ConfirmDialog(Shell parentShell, String dialogTitle,
-//				String dialogMessage) {
-//			super(parentShell
-//					, dialogTitle
-//					, null
-//					, dialogMessage
-//					, WARNING
-//					, new String[] { Messages.RegistryMigrationStartupHandler_Dialog_Confirm_Migration, Messages.RegistryMigrationStartupHandler_Dialog_Abort_And_Exit_Migration }
-//					, ABORT_AND_EXIT
-//					, Messages.RegistryMigrationStartupHandler_Launch_Migration_Doc_On_Confirm, true);
-//		}
-//
-//		/**
-//		 * Override so that the button ids line up with the constants
-//		 * expected
-//		 * @param parent 
-//		 */
-//		protected void createButtonsForButtonBar(Composite parent) {
-//	        final String[] buttonLabels = getButtonLabels();
-//	        final Button[] buttons = new Button[buttonLabels.length];
-//	        final int defaultButtonIndex = getDefaultButtonIndex();
-//
-//	        for (int i = 0; i < buttonLabels.length; i++) {
-//	            String label = buttonLabels[i];
-//	            Button button = createButton(parent, i, label,
-//	                    defaultButtonIndex == i);
-//	            buttons[i] = button;
-//	 
-//	        }
-//	        setButtons(buttons);
-//		}
-//		
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/TagLibraryRegistryLoader.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/TagLibraryRegistryLoader.java
deleted file mode 100644
index 2bf72df..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/TagLibraryRegistryLoader.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.core.internal;
-
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Set;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtension;
-import org.eclipse.core.runtime.IExtensionPoint;
-
-/**
- * Loads and caches extension for the tagRegistry extension point.
- * 
- * @author cbateman
- * 
- */
-/* package */class TagLibraryRegistryLoader
-{
-    private final static String              EXTENSION_ID = "tagregistry"; //$NON-NLS-1$
-    private final static String              ELEMENT_NAME = "tagRegistry"; //$NON-NLS-1$
-
-    private static Set<ITagRegistryFactoryInfo> _extensions;
-
-    /**
-     * @return the list of handlers. The list is not modifiable and will throw
-     *         exceptions if it is attempted.
-     */
-    public static synchronized Set<ITagRegistryFactoryInfo> getAllHandlers()
-    {
-        if (_extensions == null)
-        {
-            _extensions = readAllHandlers();
-        }
-        return Collections.unmodifiableSet(_extensions);
-
-    }
-
-    private static Set<ITagRegistryFactoryInfo> readAllHandlers()
-    {
-        Set<ITagRegistryFactoryInfo> result = new HashSet<ITagRegistryFactoryInfo>();
-        IExtensionPoint extensionPoint = JSFCorePlugin.getDefault()
-                .getExtension(EXTENSION_ID);
-        IExtension[] extensions = extensionPoint.getExtensions();
-
-        for (int i = 0; i < extensions.length; i++)
-        {
-            IExtension ext = extensions[i];
-            IConfigurationElement[] configElements = ext
-                    .getConfigurationElements();
-
-            for (int j = 0; j < configElements.length; j++)
-            {
-                final IConfigurationElement element = configElements[j];
-                if (ELEMENT_NAME.equals(element.getName()))
-                {
-                    try
-                    {
-                        final TagRegistryFactoryInfo extension = new TagRegistryFactoryInfo(
-                                element);
-                        result.add(extension);
-                    }
-                    catch (CoreException e)
-                    {
-                        JSFCorePlugin.log(e,
-                                "Error loading tag registry extension: " //$NON-NLS-1$
-                                        + element.getContributor().getName()
-                                        + "." + element.getAttribute("id")); //$NON-NLS-1$ //$NON-NLS-2$
-                    }
-                }
-            }
-        }
-        return result;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/TagRegistryFactoryInfo.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/TagRegistryFactoryInfo.java
deleted file mode 100644
index 8e581ef..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/TagRegistryFactoryInfo.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.core.internal;
-
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Set;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.content.IContentType;
-import org.eclipse.core.runtime.content.IContentTypeManager;
-import org.eclipse.jst.jsf.designtime.internal.view.model.TagRegistryFactory;
-
-/**
- * Encapsulates information about tag registry extensions
- * 
- */
-public final class TagRegistryFactoryInfo implements ITagRegistryFactoryInfo
-{
-    private final String             _description;
-    private final String             _id;
-    private final TagRegistryFactory _tagRegistry;
-    private final Set<IContentType>  _contentTypes;
-
-    /**
-     * @param element
-     * @throws CoreException
-     */
-    TagRegistryFactoryInfo(IConfigurationElement element)
-            throws CoreException
-    {
-        // do this first since it has highest potential to fail
-        _tagRegistry = (TagRegistryFactory) element
-                .createExecutableExtension("class"); //$NON-NLS-1$
-
-        final String localId = element.getAttribute("id"); //$NON-NLS-1$
-        _id = element.getContributor().getName() + "." + localId; //$NON-NLS-1$
-
-        _description = element.getAttribute("description"); //$NON-NLS-1$
-
-        final IConfigurationElement[] contentTypes = element
-                .getChildren("content-type"); //$NON-NLS-1$
-
-        final IContentTypeManager typeManager = Platform
-                .getContentTypeManager();
-        _contentTypes = new HashSet<IContentType>();
-        for (IConfigurationElement contentTypeElement : contentTypes)
-        {
-            final String contentTypeId = contentTypeElement
-                    .getAttribute("contentTypeId"); //$NON-NLS-1$
-
-            final IContentType contentType = typeManager
-                    .getContentType(contentTypeId);
-            _contentTypes.add(contentType);
-        }
-    }
-
-    /**
-     * @return the user displyable description
-     */
-    public String getDescription()
-    {
-        return _description;
-    }
-
-    /**
-     * @return the unique of the extension
-     */
-    public String getId()
-    {
-        return _id;
-    }
-
-    /**
-     * @return the registry
-     */
-    public TagRegistryFactory getTagRegistryFactory()
-    {
-        return _tagRegistry;
-    }
-
-    /**
-     * Set is immutable.
-     * 
-     * @return the content types this registry is registered against.
-     */
-    public Set<IContentType> getContentTypes()
-    {
-        return Collections.unmodifiableSet(_contentTypes);
-    }
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/TagRegistryFactoryProviderLoader.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/TagRegistryFactoryProviderLoader.java
deleted file mode 100644
index 62217da..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/TagRegistryFactoryProviderLoader.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package org.eclipse.jst.jsf.core.internal;
-
-import static org.eclipse.jst.jsf.core.internal.JSFCorePlugin.PLUGIN_ID;
-import static org.eclipse.jst.jsf.core.internal.JSFCorePlugin.TAG_REGISTRY_FACTORY_PROVIDER_ID;
-
-import java.util.Comparator;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jst.jsf.common.internal.pde.AbstractSimpleClassExtensionRegistryReader;
-
-/**
- * Loader class for the tag registry factory provider extension point.
- *
- */
-public class TagRegistryFactoryProviderLoader extends
-        AbstractSimpleClassExtensionRegistryReader<ITagRegistryFactoryProvider>
-{
-
-    /**
-     * @param listComparator
-     */
-    protected TagRegistryFactoryProviderLoader(
-            Comparator<org.eclipse.jst.jsf.common.internal.pde.AbstractSimpleClassExtensionRegistryReader.SortableExecutableExtension<ITagRegistryFactoryProvider>> listComparator)
-    {
-        super(PLUGIN_ID, TAG_REGISTRY_FACTORY_PROVIDER_ID, "factoryProvider", "class", NO_SORT); //$NON-NLS-1$ //$NON-NLS-2$
-    }
-
-    @Override
-    protected void handleLoadFailure(CoreException ce)
-    {
-        JSFCorePlugin.log(ce, "Loading tag registry factory provider extension points"); //$NON-NLS-1$
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/contentassist/el/ContentAssistParser.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/contentassist/el/ContentAssistParser.java
deleted file mode 100644
index c13b0e8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/contentassist/el/ContentAssistParser.java
+++ /dev/null
@@ -1,378 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.core.internal.contentassist.el;
-
-import org.eclipse.jface.text.Region;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.jst.jsf.context.symbol.ISymbol;
-import org.eclipse.jst.jsp.core.internal.java.jspel.ASTAddExpression;
-import org.eclipse.jst.jsp.core.internal.java.jspel.ASTAndExpression;
-import org.eclipse.jst.jsp.core.internal.java.jspel.ASTChoiceExpression;
-import org.eclipse.jst.jsp.core.internal.java.jspel.ASTEqualityExpression;
-import org.eclipse.jst.jsp.core.internal.java.jspel.ASTExpression;
-import org.eclipse.jst.jsp.core.internal.java.jspel.ASTFunctionInvocation;
-import org.eclipse.jst.jsp.core.internal.java.jspel.ASTLiteral;
-import org.eclipse.jst.jsp.core.internal.java.jspel.ASTMultiplyExpression;
-import org.eclipse.jst.jsp.core.internal.java.jspel.ASTOrExpression;
-import org.eclipse.jst.jsp.core.internal.java.jspel.ASTRelationalExpression;
-import org.eclipse.jst.jsp.core.internal.java.jspel.ASTUnaryExpression;
-import org.eclipse.jst.jsp.core.internal.java.jspel.ASTValue;
-import org.eclipse.jst.jsp.core.internal.java.jspel.ASTValuePrefix;
-import org.eclipse.jst.jsp.core.internal.java.jspel.ASTValueSuffix;
-import org.eclipse.jst.jsp.core.internal.java.jspel.JSPELParser;
-import org.eclipse.jst.jsp.core.internal.java.jspel.JSPELParserConstants;
-import org.eclipse.jst.jsp.core.internal.java.jspel.JSPELParserVisitor;
-import org.eclipse.jst.jsp.core.internal.java.jspel.ParseException;
-import org.eclipse.jst.jsp.core.internal.java.jspel.SimpleNode;
-import org.eclipse.jst.jsp.core.internal.java.jspel.Token;
-
-/**
- * Consumes an EL expression and converts into a completion prefix
- * 
- * @author cbateman
- *
- */
-public final class ContentAssistParser 
-{
-    /**
-     * @param relativePosition -- 1-based position in elText (first position is 1)
-     * @param elText
-     * @return a content assist strategy for the given position and el expression
-     * or null if one cannot be determined
-     */
-    public static ContentAssistStrategy getPrefix(final int relativePosition, final String elText)
-    {
-        if (elText == null)
-        {
-            return null;
-        }
-        else if ("".equals(elText.trim())) //$NON-NLS-1$
-        {
-            return new IdCompletionStrategy("", "");  //$NON-NLS-1$//$NON-NLS-2$
-        }
-        
-        PrefixVisitor visitor = getVisitorForPosition(relativePosition, elText);
-        return visitor != null? visitor.getPrefix() : null;
-    }
-    
-    /**
-     * Get symbol and symbol region at given position in el string
-     * @param context - IStructuredDocumentContext
-     * @param relativePosition - position in el string
-     * @param elText - el string
-     * @return SymbolInfo. May be null.
-     */
-    public static SymbolInfo getSymbolInfo(IStructuredDocumentContext context, final int relativePosition, final String elText) {
-        if (elText == null || "".equals(elText.trim())) //$NON-NLS-1$
-        {
-            return null;
-        }
-        PrefixVisitor visitor = getVisitorForPosition(relativePosition, elText);
-        if (visitor != null) {
-            SymbolInfo symbolInfo = visitor.getSymbolInfo(context);
-            if (symbolInfo != null) {
-                Region r = symbolInfo.getRelativeRegion();
-                if (relativePosition > r.getOffset() && relativePosition <= r.getOffset() + r.getLength()) {
-                    return symbolInfo;
-                }
-            }
-        }
-        return null;
-    }
-
-	private static PrefixVisitor getVisitorForPosition(final int relativePosition,
-			final String elText) {
-		final java.io.StringReader reader = new java.io.StringReader(elText);
-        final JSPELParser  parser = new JSPELParser(reader);
-        
-        try
-        {
-            final ASTExpression expr = parser.Expression();
-            final PrefixVisitor visitor = new PrefixVisitor(relativePosition, elText);
-            expr.jjtAccept(visitor, null);
-            return visitor;
-        }
-        catch (ParseException pe)
-        {
-            // TODO: handle parser by using current and expected tokens
-        	return null;
-        }
-	}
-    
-    private static String substring(String s, Region r) {
-        return s.substring(r.getOffset(), r.getOffset() + r.getLength());
-    }
-    
-    private static class PrefixVisitor implements JSPELParserVisitor
-    {
-        private final int       _relativePos;
-        private final String    _fullText;
-        
-        private String          _symbolPrefix; // = null; initialized as tree is visited
-        private int             _prefixType;
-        private boolean         _prefixResolved;  // = false; set to true when the prefix is resolved
-        private int             _symbolStartPos = 1; // first char has position 1
-        private int             _symbolEndPos = 0;
-        
-        PrefixVisitor(final int relativePos, final String fullText)
-        {
-            _relativePos = relativePos;
-            _fullText = fullText;
-        }
-        
-        /**
-         * @return the prefix if resolved or null if not resolved
-         */
-        public ContentAssistStrategy getPrefix()
-        {
-            if (_prefixResolved)
-            {
-                switch(_prefixType)
-                {
-                    case ContentAssistStrategy.PREFIX_TYPE_DOT_COMPLETION:
-                        return new FunctionCompletionStrategy(_symbolPrefix, getProposalStart());
-                    
-                    case ContentAssistStrategy.PREFIX_TYPE_ID_COMPLETION:
-                        return new IdCompletionStrategy(_symbolPrefix, getProposalStart());
-                    
-                    case ContentAssistStrategy.PREFIX_TYPE_EMPTY_EXPRESSION:
-                        return new IdCompletionStrategy("", getProposalStart()); //$NON-NLS-1$
-                        
-                    default:
-                        // do nothing; fall-through to return null
-                }
-            }
-
-            return null;
-        }
-        
-        /**
-         * @param context - IStructuredDocumentContext
-         * @return symbol and symbol region if resolved, null otherwise
-         */
-        public SymbolInfo getSymbolInfo(IStructuredDocumentContext context) {
-        	if (_prefixResolved && _symbolStartPos < _symbolEndPos) {
-        		Region region = new Region(_symbolStartPos - 1, _symbolEndPos - _symbolStartPos + 1);
-                ISymbol symbol = null;
-                switch (_prefixType) {
-                case ContentAssistStrategy.PREFIX_TYPE_ID_COMPLETION:
-                    symbol = SymbolResolveUtil.getSymbolForVariable(context, substring(_fullText, region));
-                    break;
-                case ContentAssistStrategy.PREFIX_TYPE_DOT_COMPLETION:
-                    symbol = SymbolResolveUtil.getSymbolForVariableSuffixExpr(context, _symbolPrefix + "." + substring(_fullText, region), _symbolEndPos == _fullText.length()); //$NON-NLS-1$
-                    break;
-                }
-                if (symbol != null) {
-                    return new SymbolInfo(symbol, region);
-                }
-        	}
-        	return null;
-        }
-
-		private String getProposalStart() {
-            if (_symbolStartPos <= _relativePos) {
-                return _fullText.substring(_symbolStartPos - 1, _relativePos - 1);
-            }
-            return ""; //$NON-NLS-1$
-		}
-        
-        public Object visit(ASTAddExpression node, Object data) 
-        {
-            return node.childrenAccept(this, data);
-        }
-
-		public Object visit(ASTAndExpression node, Object data) 
-        {
-            return node.childrenAccept(this, data);
-        }
-
-        public Object visit(ASTChoiceExpression node, Object data) 
-        {
-            return node.childrenAccept(this, data);
-        }
-
-        public Object visit(ASTEqualityExpression node, Object data) 
-        {
-            return node.childrenAccept(this, data);
-        }
-
-        public Object visit(ASTExpression node, Object data) 
-        {
-            return node.childrenAccept(this, data);
-        }
-
-        public Object visit(ASTFunctionInvocation node, Object data) 
-        {
-            return node.childrenAccept(this, data);
-        }
-
-        public Object visit(ASTLiteral node, Object data) 
-        {
-            return node.childrenAccept(this, data);
-        }
-
-        public Object visit(ASTMultiplyExpression node, Object data) 
-        {
-            return node.childrenAccept(this, data);
-        }
-
-        public Object visit(ASTOrExpression node, Object data) 
-        {
-            return node.childrenAccept(this, data);
-        }
-
-        public Object visit(ASTRelationalExpression node, Object data) 
-        {
-            return node.childrenAccept(this, data);
-        }
-
-        public Object visit(ASTUnaryExpression node, Object data) 
-        {
-            return node.childrenAccept(this, data);
-        }
-
-        public Object visit(ASTValue node, Object data) 
-        {
-            // we're only in this value expr if it contains the cursor
-            if (testContainsCursor(node))
-            {
-                return node.childrenAccept(this, data);
-            }
-            
-            return null;
-        }
-
-        public Object visit(ASTValuePrefix node, Object data) 
-        {
-            // for now, only concern ourselves with simple (identifier) prefixes
-            if (!_prefixResolved
-                    && node.jjtGetNumChildren() == 0
-                    && node.getFirstToken().kind == JSPELParserConstants.IDENTIFIER)
-            {
-                _symbolPrefix = node.getFirstToken().image;
-                
-                if (testContainsCursor(node))
-                {
-                    // if the cursor is on this id, we don't need to visit
-                    // further since we know both the prefix -- the id -- and
-                    // the type -- it's an id completion
-                    _prefixType = ContentAssistStrategy.PREFIX_TYPE_ID_COMPLETION;
-                    _symbolStartPos = node.getFirstToken().beginColumn;
-                    _symbolEndPos = node.getFirstToken().endColumn;
-                    _prefixResolved = true;
-                }
-            }
-            return node.childrenAccept(this, data);
-        }
-
-        public Object visit(ASTValueSuffix node, Object data) 
-        {
-            // for now, only deal with the simple .id suffix
-            Token lastToken = node.getLastToken();
-			if (node.jjtGetNumChildren() == 0)
-            {
-                if (!_prefixResolved
-                      && node.getFirstToken().kind == JSPELParserConstants.DOT)
-                {
-                    if (lastToken.kind == JSPELParserConstants.IDENTIFIER)
-                    {
-                        if (testContainsCursor(node))
-                        {
-                            _prefixType = ContentAssistStrategy.PREFIX_TYPE_DOT_COMPLETION;
-                            int proposalStartLength = _relativePos - lastToken.beginColumn;
-                            if (proposalStartLength < 0) { // Cursor after firstToken start but before lastToken start?
-                            	proposalStartLength = 0;
-                            }
-                            _symbolStartPos = lastToken.beginColumn;
-                            _symbolEndPos = lastToken.endColumn;
-                            _prefixResolved = true;
-                        }
-                        // only include this suffix on the path if the cursor is 
-                        // further to the right.  Thus for x.^y we get a prefix "x"
-                        // and for x.y.^z we get "x.y" since this the part we must
-                        // resolve the prefix for
-                        else
-                        {
-                            _symbolPrefix += node.getFirstToken().image + lastToken.image;
-                        }
-                    }
-                    else if (lastToken == node.getFirstToken())
-                    {
-                        if (testCursorImmediatelyAfter(node))
-                        {
-                            _prefixType = ContentAssistStrategy.PREFIX_TYPE_DOT_COMPLETION;
-                            _symbolStartPos = lastToken.endColumn + 1;
-                            _symbolEndPos = lastToken.endColumn;
-                            _prefixResolved = true;
-                        }
-                    }
-                }
-
-                return null;                
-            }
-            
-            if (node.getFirstToken().kind == JSPELParserConstants.LBRACKET)
-            {
-                // try to support ca inside the brackets
-                node.childrenAccept(this, data);
-            }
-
-            Object retValue =  node.childrenAccept(this, data);
-                
-            if (!_prefixResolved)
-            {
-                // if we haven't resolved the prefix yet, then we need
-                // to append this suffix value
-                _symbolPrefix += _fullText.substring(node.getFirstToken().beginColumn-1, node.getLastToken().endColumn);
-            }
-            
-            return retValue;
-        }
-
-        public Object visit(SimpleNode node, Object data) 
-        {
-            return node.childrenAccept(this, data);
-        }
-        
-        private boolean testCursorImmediatelyAfter(SimpleNode node)
-        {
-            return node.getLastToken().endColumn == _relativePos-1;
-        }
-        
-        /**
-         * "Containing a cursor" here is deemed to mean that current cursor
-         * position as indicated by _relativePos, is either directly before, on or
-         * directly after an expression.  For example, in a Value expression like
-         * 
-         *          x x x . y y y . z z z
-         *         ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^
-         *         1 2 3 4 5 6 7 8 9 0 1 2
-         *         
-         * Position's 1-4 are on xxx, 5-8 are on yyy and 9-12 are on zzz
-         * 
-         * @param node
-         * @return true if the node "contains the cursor" (see above)
-         */
-        private boolean testContainsCursor(SimpleNode node)
-        {
-            return (node.getFirstToken().beginColumn <= _relativePos
-                    && node.getLastToken().endColumn+1 >= _relativePos);
-                
-        }
-    }
-    
-    private ContentAssistParser()
-    {
-        // utility class; not instantiable
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/contentassist/el/ContentAssistStrategy.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/contentassist/el/ContentAssistStrategy.java
deleted file mode 100644
index 1e7d43c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/contentassist/el/ContentAssistStrategy.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.core.internal.contentassist.el;
-
-import java.util.List;
-
-import org.eclipse.jface.text.contentassist.ICompletionProposal;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-
-/**
- * Encapsulates an EL content assist completion prefix
- * 
- * @author cbateman
- *
- */
-public abstract class ContentAssistStrategy
-{
-	/**
-	 * ContentAssistStrategy type for a dot content assist completion
-	 */
-	public final static int  PREFIX_TYPE_DOT_COMPLETION = 0;
-	/**
-	 * ContentAssistStrategy type for an id content assist completion
-	 */
-	public final static int  PREFIX_TYPE_ID_COMPLETION = 1;
-    /**
-     * Completions for an empty expression
-     */
-    public final static int  PREFIX_TYPE_EMPTY_EXPRESSION = 2;
-	
-	private final int type;
-	private final String value;
-	private final String proposalStart;
-	
-	/**
-	 * @param type
-	 * @param value
-	 * @param proposalStart 
-	 */
-	public ContentAssistStrategy(final int type, final String value, final String proposalStart) 
-	{
-		super();
-		this.type = type;
-		this.value = value;
-		this.proposalStart = proposalStart;
-	}
-    
-	/**
-	 * @return the type of this completion prefix as defined by
-	 * one of the PREFIX_TYPE constants
-	 */
-	public final int getType() 
-	{
-		return type;
-	}
-    
-	/**
-	 * @return the token which this prefix is for
-	 */
-	public final String getValue() 
-	{
-		return value;
-	}
-    
-    /**
-     * @param context
-     * @return the list of proposals for this strategy.  Contents of the list
-     * must be of type ICompletionProposal.  List should be considered immutable.
-     */
-    public abstract List<ICompletionProposal> getProposals(IStructuredDocumentContext context);
-
-	/**
-	 * @return the part of the proposal which was already typed when user invoked autocomplete
-	 */
-	public String getProposalStart() {
-		return proposalStart;
-	}
-
-	/**
-	 * @param completionList
-	 * @param proposal
-	 */
-	protected void addProposalsMatchingProposalStart(final List completionList, final ICompletionProposal[] proposal) {
-		final String start = getProposalStart();
-		for (int j = 0; j < proposal.length; j++) {
-            final String proposalString = proposal[j].getDisplayString();
-			//TODO Should use "real" proposal replacement instead of displayString:
-			if (proposalString.length() >= start.length() &&
-                    proposalString.substring(0, start.length()).equalsIgnoreCase(start))
-            {
-				completionList.add(proposal[j]);
-			}
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/contentassist/el/FunctionCompletionStrategy.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/contentassist/el/FunctionCompletionStrategy.java
deleted file mode 100644
index ff58d1b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/contentassist/el/FunctionCompletionStrategy.java
+++ /dev/null
@@ -1,239 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *
- ********************************************************************************/
-package org.eclipse.jst.jsf.core.internal.contentassist.el;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
-import org.eclipse.jface.text.contentassist.ICompletionProposal;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IStructuredDocumentContextResolverFactory;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.internal.ITextRegionContextResolver;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.jst.jsf.context.symbol.IMethodSymbol;
-import org.eclipse.jst.jsf.context.symbol.IObjectSymbol;
-import org.eclipse.jst.jsf.context.symbol.ISymbol;
-import org.eclipse.jst.jsf.context.symbol.provider.IContentProposalProvider;
-import org.eclipse.jst.jsf.context.symbol.provider.ProposalCreationFactoryAdapter;
-import org.eclipse.jst.jsf.context.symbol.provider.IContentProposalProvider.IProposalCreationFactory;
-import org.eclipse.jst.jsf.designtime.resolver.ISymbolContextResolver;
-import org.eclipse.jst.jsf.designtime.resolver.StructuredDocumentSymbolResolverFactory;
-import org.eclipse.jst.jsp.core.internal.regions.DOMJSPRegionContexts;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * A completion strategy for function completions like:
- *
- * v a r .
- *        ^
- *
- * @author cbateman
- *
- */
-public class FunctionCompletionStrategy extends ContentAssistStrategy
-{
-    /**
-     * @param value
-     * @param proposalStart
-     */
-    public FunctionCompletionStrategy(final String value, final String proposalStart)
-    {
-        super(ContentAssistStrategy.PREFIX_TYPE_DOT_COMPLETION, value, proposalStart);
-    }
-
-    @Override
-	public List<ICompletionProposal> getProposals(final IStructuredDocumentContext context)
-    {
-        List<ICompletionProposal> completionList = Collections.EMPTY_LIST;
-        final ISymbolContextResolver  symbolResolver =
-            StructuredDocumentSymbolResolverFactory.getInstance().
-                getSymbolContextResolver(context);
-
-        final ISymbol symbol = SymbolResolveUtil.getSymbolForVariableSuffixExpr(context, getValue(), false);
-
-        // if we get a completion symbol, get it's proposals
-        if (symbol instanceof IObjectSymbol)
-        {
-            final List expectedMethodBindings = new ArrayList();
-            final ISymbol[] suffixes = getSymbols((IObjectSymbol) symbol,
-                                             context,
-                                             symbolResolver,
-                                             expectedMethodBindings);
-
-            final ComposedAdapterFactory factory =
-                new ComposedAdapterFactory(
-                       ComposedAdapterFactory.Descriptor.Registry.INSTANCE);
-            final IProposalCreationFactory  creationInfo =
-                new MyProposalFactory(context, getProposalStart().length(),
-                                        expectedMethodBindings);
-            
-            completionList = new ArrayList<ICompletionProposal>();
-            for (final ISymbol propSymbol : suffixes) {
-                final Object  provider =
-                  factory.adapt(propSymbol, IContentProposalProvider.class);
-
-                if (provider instanceof IContentProposalProvider)
-                {
-                    final ICompletionProposal[] proposal  =
-                        ((IContentProposalProvider) provider).
-                            getProposals(propSymbol, creationInfo);
-                    if (proposal != null)
-                    {
-                    	addProposalsMatchingProposalStart(completionList,
-								proposal);
-                    }
-                }
-            }
-        }
-
-        return Collections.unmodifiableList(completionList);
-    }
-
-	private ISymbol[] getSymbols(final IObjectSymbol symbol,
-                                 final IStructuredDocumentContext context,
-                                 final ISymbolContextResolver  symbolResolver,
-                                 final List   expectedMethodBindings)
-    {
-        final List symbols = new ArrayList();
-
-        if (SymbolResolveUtil.isMethodBindingExpected(context, expectedMethodBindings))
-        {
-            symbols.addAll(Arrays.asList(
-                          symbolResolver.getMethods(symbol)));
-        }
-
-        symbols.addAll(Arrays.asList(symbolResolver.getProperties(symbol)));
-
-        return (ISymbol[]) symbols.toArray(ISymbol.EMPTY_SYMBOL_ARRAY);
-    }
-
-    private static class MyProposalFactory extends ProposalCreationFactoryAdapter
-    {
-        private final static int   DEFAULT_RELEVANCE = 1;
-
-        private final static int   HIGH_RELEVANCE = 2;
-        private final static int   NORMAL_RELEVANCE = 1;
-        private final static int   LOW_RELEVANCE = 0;
-
-        private final List                         _expectedMethodBindings;
-        private final IStructuredDocumentContext   _context;
-
-        /**
-         * @param context
-         * @param replacementLength
-         * @param expectedMethodBindings
-         */
-        public MyProposalFactory(final IStructuredDocumentContext context, final int replacementLength,
-                                    final List expectedMethodBindings) {
-            super(context.getDocumentPosition() - replacementLength, replacementLength);
-            _context = context;
-            _expectedMethodBindings = expectedMethodBindings;
-        }
-
-        @Override
-		public ICompletionProposal createProposal(final String replacementText,
-                                                  final String displayText,
-                                                  final String additionalText,
-                                                  final Image displayImage,
-                                                  final Object target)
-        {
-            int replacementOffset = _replacementOffset;
-            int replacementLength = _replacementLength;
-
-            // TODO: I regard this as a bit of hack, but until we write our
-            // proposal implementation, it's basically the only way I can
-            // see to do this
-            // if it's an array, we must check if we need to replace a
-            // preceding '.'
-            if (replacementText.startsWith("[")) //$NON-NLS-1$
-            {
-                ITextRegionContextResolver textResolver =
-                    IStructuredDocumentContextResolverFactory.INSTANCE.getTextRegionResolver(_context);
-
-                if (textResolver.getRegionType().equals(DOMJSPRegionContexts.JSP_VBL_CLOSE))
-                {
-                    textResolver =
-                        IStructuredDocumentContextResolverFactory.
-                            INSTANCE.getTextRegionResolver(textResolver.getPreviousContext());
-                }
-
-                final String regionText = textResolver.getRegionText();
-                final int regionStart = textResolver.getStartOffset();
-
-                if (DOMJSPRegionContexts.JSP_VBL_CONTENT.equals(textResolver.getRegionType())
-                        && regionText != null
-                        && regionStart != -1
-                        && regionStart < _context.getDocumentPosition())
-                {
-                    final int  relativeOffset = _context.getDocumentPosition() - regionStart - 1;
-
-                    if (regionText.charAt(relativeOffset) == '.')
-                    {
-                        // we must replace a length of 1 (the dot)
-                        // at an offset on prior
-                        replacementOffset--;
-                        replacementLength = 1;
-                    }
-                }
-            }
-
-            return createDefaultProposal(replacementText,
-                                         replacementOffset,
-                                         replacementLength,
-                                         replacementText.length(),
-                                         displayImage,
-                                         displayText,
-                                         null,
-                                         additionalText,
-                                         getRelevance(target, DEFAULT_RELEVANCE));
-        }
-
-        private int getRelevance(final Object target, final int defaultRelevance)
-        {
-            // if method bindings are expected, then list exact signature
-            // matches top most.  Still list non-matching methods, but put
-            // them at the bottom
-            if (_expectedMethodBindings.size() > 0)
-            {
-                if (target instanceof IMethodSymbol)
-                {
-                    final IMethodSymbol methodSymbol = (IMethodSymbol) target;
-
-                    for (final Iterator it = _expectedMethodBindings.iterator();
-                            it.hasNext();)
-                    {
-                        final String methodType = (String) it.next();
-
-                        // we have a match, so push to the top
-                        if (methodType.equals(methodSymbol.getSignature()))
-                        {
-                            return HIGH_RELEVANCE;
-                        }
-                    }
-
-                    // if we get out of the loop, then this method doesn't
-                    // match the expected signature
-                    return LOW_RELEVANCE;
-                }
-
-                // non-method targets have normal relevance when mb expected
-                return NORMAL_RELEVANCE;
-            }
-
-            // otherwise, simply return the default for all
-            return defaultRelevance;
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/contentassist/el/IdCompletionStrategy.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/contentassist/el/IdCompletionStrategy.java
deleted file mode 100644
index f965d8c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/contentassist/el/IdCompletionStrategy.java
+++ /dev/null
@@ -1,169 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.core.internal.contentassist.el;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
-import org.eclipse.jface.text.contentassist.ICompletionProposal;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IStructuredDocumentContextResolverFactory;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IWorkspaceContextResolver;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.jst.jsf.context.symbol.ERuntimeSource;
-import org.eclipse.jst.jsf.context.symbol.IInstanceSymbol;
-import org.eclipse.jst.jsf.context.symbol.ISymbol;
-import org.eclipse.jst.jsf.context.symbol.provider.IContentProposalProvider;
-import org.eclipse.jst.jsf.context.symbol.provider.ProposalCreationFactoryAdapter;
-import org.eclipse.jst.jsf.context.symbol.provider.IContentProposalProvider.IProposalCreationFactory;
-import org.eclipse.jst.jsf.designtime.resolver.ISymbolContextResolver;
-import org.eclipse.jst.jsf.designtime.resolver.StructuredDocumentSymbolResolverFactory;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * A strategy for getting completions for EL id completions like:
- * 
- *     var
- *     ^
- *     
- * @author cbateman
- *
- */
-class IdCompletionStrategy extends ContentAssistStrategy 
-{
-
-    /**
-     * Construct a strategy for completing an ID completion
-     * 
-     * @param prefixValue
-     * @param proposalStart - the part of the proposal which was already typed when user invoked autocomplete
-     */
-    public IdCompletionStrategy(final String prefixValue, String proposalStart) 
-    {
-        super(ContentAssistStrategy.PREFIX_TYPE_ID_COMPLETION, prefixValue, proposalStart);
-    }
-
-    /**
-     * @see org.eclipse.jst.jsf.core.internal.contentassist.el.ContentAssistStrategy#getProposals(org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext)
-     */
-    public List<ICompletionProposal> getProposals(IStructuredDocumentContext context) 
-    {
-        final List<ICompletionProposal> completionList = new ArrayList<ICompletionProposal>();
-        final IWorkspaceContextResolver workspaceResolver = 
-            IStructuredDocumentContextResolverFactory.INSTANCE.
-                getWorkspaceContextResolver(context);
-
-        final IFile  iFile = (IFile) workspaceResolver.getResource();
-
-        ISymbol[]       symbols = null;
-
-        if (iFile != null)
-        {
-            final ISymbolContextResolver  symbolResolver =
-                StructuredDocumentSymbolResolverFactory.getInstance().
-                    getSymbolContextResolver(context);
-            
-            symbols = symbolResolver.getAllVariables();
-        }
-
-        final ComposedAdapterFactory factory =
-            new ComposedAdapterFactory(ComposedAdapterFactory.
-                                                  Descriptor.Registry.INSTANCE);
-
-        final IProposalCreationFactory  creationInfo =
-           new MyProposalFactory(context.getDocumentPosition(), getProposalStart().length());
-
-        for (int i = 0; symbols != null && i < symbols.length; i++)
-        {
-            final ISymbol  symbol = symbols[i];
-
-            final Object  adapter =  
-                factory.adapt(symbol, IContentProposalProvider.class);
-                
-            if (adapter instanceof IContentProposalProvider)
-            {
-                final IContentProposalProvider  provider = 
-                    (IContentProposalProvider) adapter;
-                final ICompletionProposal[] proposal  = 
-                    provider.getProposals(symbol, creationInfo);
-                if (proposal != null)
-                {
-                	addProposalsMatchingProposalStart(completionList, proposal);
-                }
-            }
-        }
-
-        return Collections.unmodifiableList(completionList);
-    }
-    
-    private static class MyProposalFactory extends ProposalCreationFactoryAdapter
-    {
-        private final static int   HIGH_RELEVANCE = 2;
-        private final static int   NORMAL_RELEVANCE = 1;
-        private final static int   LOW_RELEVANCE = 0;
-
-        /**
-         * @param replacementOffset
-         * @param replacementLength
-         */
-        public MyProposalFactory(int replacementOffset, int replacementLength) 
-        {
-        	/*TODO I changed the meaning of "replacementLength" from "number of chars AFTER cursor to be
-        	 * replaced" to "number of chars BEFORE cursor to be replaced. Since "replacementLength"
-        	 * has always been 0 (constructor is only called by IdCompletionStrategy.getProposals()),
-        	 * this should not change anything, but I don't know if there have been different plans
-        	 * for "replacementLength".
-        	 * TODO Maybe this change should be done in the super class instead?
-        	 */
-            super(replacementOffset - replacementLength, replacementLength);
-        }
-
-        public ICompletionProposal createProposal(final String replacementText, 
-                                                  final String displayText, 
-                                                  final String additionalText, 
-                                                  final Image displayImage, 
-                                                  final Object targetObject) 
-        {
-            return createDefaultProposal(replacementText, _replacementOffset, 
-                                         _replacementLength, 
-                                         replacementText.length(), displayImage, 
-                                         displayText, null, additionalText, 
-                                         getRelevance(targetObject));
-        }
-        
-        private int getRelevance(Object target)
-        {
-            // put tag vars at top, followed by beans, then implicits and other
-            if (target instanceof IInstanceSymbol)
-            {
-                final IInstanceSymbol symbol = (IInstanceSymbol) target;
-                
-                switch (symbol.getRuntimeSource().getValue())
-                {
-                    case ERuntimeSource.TAG_INSTANTIATED_SYMBOL:
-                        return HIGH_RELEVANCE;
-                    case ERuntimeSource.MANAGED_BEAN_SYMBOL:
-                        return NORMAL_RELEVANCE;
-                    case ERuntimeSource.BUILT_IN_SYMBOL:
-                    case ERuntimeSource.OTHER:
-                        return LOW_RELEVANCE;
-                }
-            }
-            
-            // if none of the above, return low relevance
-            return LOW_RELEVANCE;
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/contentassist/el/SymbolInfo.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/contentassist/el/SymbolInfo.java
deleted file mode 100644
index dc7652b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/contentassist/el/SymbolInfo.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.core.internal.contentassist.el;
-
-import org.eclipse.jface.text.Region;
-import org.eclipse.jst.jsf.context.symbol.ISymbol;
-
-/**
- * class contains a symbol and it's region
- *
- */
-public class SymbolInfo {
-    
-    private final ISymbol symbol;
-    private final Region relativeRegion;
-    
-    /**
-     * @param symbol
-     * @param relativeRegion
-     */
-    public SymbolInfo(ISymbol symbol, Region relativeRegion) {
-        super();
-        this.symbol = symbol;
-        this.relativeRegion = relativeRegion;
-    }
-
-	/**
-	 * @return the symbol
-	 */
-	public ISymbol getSymbol() {
-		return symbol;
-	}
-
-	/**
-	 * @return the relative region
-	 */
-	public Region getRelativeRegion() {
-		return relativeRegion;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/contentassist/el/SymbolResolveUtil.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/contentassist/el/SymbolResolveUtil.java
deleted file mode 100644
index 29b1518..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/contentassist/el/SymbolResolveUtil.java
+++ /dev/null
@@ -1,189 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.core.internal.contentassist.el;
-
-import java.util.Arrays;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.jst.jsf.common.internal.types.CompositeType;
-import org.eclipse.jst.jsf.common.internal.types.IAssignable;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IDOMContextResolver;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IStructuredDocumentContextResolverFactory;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.ITaglibContextResolver;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.jst.jsf.context.symbol.IInstanceSymbol;
-import org.eclipse.jst.jsf.context.symbol.IObjectSymbol;
-import org.eclipse.jst.jsf.context.symbol.ISymbol;
-import org.eclipse.jst.jsf.designtime.resolver.ISymbolContextResolver;
-import org.eclipse.jst.jsf.designtime.resolver.StructuredDocumentSymbolResolverFactory;
-import org.eclipse.jst.jsf.metadataprocessors.MetaDataEnabledProcessingFactory;
-import org.eclipse.jst.jsf.metadataprocessors.features.ELIsNotValidException;
-import org.eclipse.jst.jsf.metadataprocessors.features.IValidELValues;
-import org.w3c.dom.Attr;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * Utility class for resolving symbols for a IStructuredDocumentContext.
- */
-public class SymbolResolveUtil {
-
-	private SymbolResolveUtil() {
-		// utility class; not instantiable
-	}
-
-	/**
-	 * Get symbol for a variable (managed bean name, bundle name)
-	 * 
-	 * @param context
-	 * @param name
-	 * @return ISymbol
-	 */
-	public static ISymbol getSymbolForVariable(
-			final IStructuredDocumentContext context, final String name) {
-		final ISymbolContextResolver symbolResolver = StructuredDocumentSymbolResolverFactory
-				.getInstance().getSymbolContextResolver(context);
-
-		return symbolResolver.getVariable(name);
-	}
-
-	/**
-	 * Get symbol for a variable suffix (e. g. bean property/method, bundle
-	 * property). Takes into account whether method bindings are expected for
-	 * the given context.
-	 * 
-	 * @param context -
-	 *            the IStructuredDocumentContext
-	 * @param fullName -
-	 *            full name of the suffix (e. g. bean.property1.property2)
-	 * @param isLastSuffix -
-	 *            set true if there follows no other suffix. Method names will
-	 *            only be considered if true
-	 * @return ISymbol. May be null.
-	 */
-	public static ISymbol getSymbolForVariableSuffixExpr(
-			final IStructuredDocumentContext context, final String fullName,
-			final boolean isLastSuffix) {
-		String[] ids = fullName.split("\\."); //$NON-NLS-1$
-
-		// if no suffixes, only one id
-		if (ids.length < 1) {
-			ids = new String[] { fullName };
-		}
-
-		final ISymbolContextResolver symbolResolver = StructuredDocumentSymbolResolverFactory
-				.getInstance().getSymbolContextResolver(context);
-		if (symbolResolver != null) {
-			ISymbol symbol = symbolResolver.getVariable(ids[0]);
-			if (symbol instanceof IInstanceSymbol
-					&& ((IInstanceSymbol) symbol).isTypeResolved()) {
-				for (int curSuffixIdx = 1; curSuffixIdx < ids.length; curSuffixIdx++) {
-					if (isLastSuffix && curSuffixIdx == ids.length - 1
-							&& isMethodBindingExpected(context)) {
-						/*
-						 * TODO Take into acount required method signature,
-						 * since there may be different methods with the same
-						 * name
-						 */
-						return symbolResolver.getMethod((IObjectSymbol) symbol,
-								ids[curSuffixIdx]);
-					}
-
-					final ISymbol property = symbolResolver.getProperty(symbol,
-							ids[curSuffixIdx]);
-
-					if (property == null) {
-						return null;
-					}
-					symbol = property;
-				}
-				return symbol;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Tells whether method bindings are expected for the given context.
-	 * 
-	 * @param context -
-	 *            the IStructuredDocumentContext
-	 * @return true, if method bindings expected
-	 */
-	public static boolean isMethodBindingExpected(
-			final IStructuredDocumentContext context) {
-		return isMethodBindingExpected(context, null);
-	}
-
-	/**
-	 * Tells whether method bindings are expected for the given context. Will
-	 * add signatures of expected method bindings to a given list.
-	 * 
-	 * @param context -
-	 *            the IStructuredDocumentContext
-	 * @param expectedBindings -
-	 *            a list. If not null, signatures of expected method bindings
-	 *            will be appended to this list.
-	 * @return true, if method bindings expected
-	 */
-	public static boolean isMethodBindingExpected(
-			final IStructuredDocumentContext context,
-			final List expectedBindings) {
-		final IDOMContextResolver domResolver = IStructuredDocumentContextResolverFactory.INSTANCE
-				.getDOMContextResolver(context);
-
-		final Node curNode = domResolver.getNode();
-
-		if (curNode instanceof Attr) {
-			final Attr attr = (Attr) curNode;
-			final Element element = attr.getOwnerElement();
-
-			final ITaglibContextResolver taglibResolver = IStructuredDocumentContextResolverFactory.INSTANCE
-					.getTaglibContextResolver(context);
-
-			final String uri = taglibResolver.getTagURIForNodeName(element);
-
-			final List elVals = MetaDataEnabledProcessingFactory.getInstance()
-					.getAttributeValueRuntimeTypeFeatureProcessors(
-							IValidELValues.class, context, uri,
-							element.getLocalName(), attr.getLocalName());
-
-			boolean methodBindingExpected = false;
-			for (final Iterator it = elVals.iterator(); it.hasNext();) {
-				final IValidELValues validValues = (IValidELValues) it.next();
-
-				try {
-					final CompositeType type = validValues
-							.getExpectedRuntimeType();
-					if (type != null
-							&& type.getAssignmentTypeMask() == IAssignable.ASSIGNMENT_TYPE_NONE) {
-						methodBindingExpected = true;
-						if (expectedBindings != null) {
-							expectedBindings.addAll(Arrays.asList(validValues
-									.getExpectedRuntimeType().getSignatures()));
-						} else {
-							// if we don't need the method signatures, *one*
-							// expected method binding is sufficient.
-							return true;
-						}
-					}
-				} catch (final ELIsNotValidException e) {
-					// do nothing
-				}
-			}
-			return methodBindingExpected;
-		}
-		// default condition is no method binding
-		return false;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/contenttype/XMLDocumentElementAttributeContentDescriber.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/contenttype/XMLDocumentElementAttributeContentDescriber.java
deleted file mode 100644
index cd38062..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/contenttype/XMLDocumentElementAttributeContentDescriber.java
+++ /dev/null
@@ -1,208 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.core.internal.contenttype;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.Reader;
-import java.nio.charset.Charset;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Hashtable;
-import java.util.List;
-import java.util.regex.Pattern;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExecutableExtension;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.QualifiedName;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.content.IContentDescription;
-import org.eclipse.core.runtime.content.ITextContentDescriber;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.wst.sse.core.utils.StringUtils;
-import org.eclipse.wst.xml.core.internal.parser.XMLTokenizer;
-import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext;
-
-/**
- * Matches the first tag of the content using attribute/value regex pairs.
- * <br/>
- * <br/>
- * Example:<br/>
- * &lt;describer class="XMLDocumentElementAttributeContentDescriber"&gt;<br/>
- * &nbsp;&nbsp;&nbsp;&nbsp;&lt;parameter name="xmlns:ns1" value="http://example.com/ns1" /&gt;<br/>
- * &nbsp;&nbsp;&nbsp;&nbsp;&lt;parameter name="xmlns:.*" value="http://example.com/ns2" /&gt;<br/>
- * &lt;/describer&gt;
- */
-public final class XMLDocumentElementAttributeContentDescriber
-	implements ITextContentDescriber, IExecutableExtension {
-
-	private static class AttributeValuePatternPair {
-		Pattern attribute;
-		Pattern value;
-
-		public AttributeValuePatternPair(Pattern attribute, Pattern value) {
-			super();
-			this.attribute = attribute;
-			this.value = value;
-		}
-
-		public String toString() {
-			return attribute + " : " + value; //$NON-NLS-1$
-		}
-	}
-
-	private static final String ATTRIBUTE_NAME = "name"; //$NON-NLS-1$
-	private static final String ATTRIBUTE_VALUE = "value"; //$NON-NLS-1$
-
-	// TODO: support all of the options of the standard HTML content describer?
-	private final static QualifiedName[] SUPPORTED_OPTIONS = {IContentDescription.BYTE_ORDER_MARK};
-
-	/*
-	 * Reads from from the stream. Note that the stream will not be repositioned when the method
-	 * returns. Copied from org.eclipse.core.internal.content.Util
-	 */
-	private static byte[] getByteOrderMark(InputStream input) throws IOException {
-		int first = input.read();
-		if (first == 0xEF) {
-			// look for the UTF-8 Byte Order Mark (BOM)
-			int second = input.read();
-			int third = input.read();
-			if (second == 0xBB && third == 0xBF)
-				return IContentDescription.BOM_UTF_8;
-		}
-		else if (first == 0xFE) {
-			// look for the UTF-16 BOM
-			if (input.read() == 0xFF)
-				return IContentDescription.BOM_UTF_16BE;
-		}
-		else if (first == 0xFF) {
-			if (input.read() == 0xFE)
-				return IContentDescription.BOM_UTF_16LE;
-		}
-		return null;
-	}
-
-	private AttributeValuePatternPair[] fPairs = null;
-
-	/**
-	 * Create an instance.
-	 */
-	public XMLDocumentElementAttributeContentDescriber() {
-		super();
-	}
-
-	private int checkCriteria(Reader contents) throws IOException {
-		if (fPairs == null || fPairs.length == 0)
-			return INVALID;
-
-		String attributeName = null;
-		String attributeValue = null;
-
-		XMLTokenizer tokenizer = new XMLTokenizer(contents);
-
-		String token = tokenizer.primGetNextToken();
-		while (token != null &&
-				!DOMRegionContext.XML_TAG_CLOSE.equals(token) &&
-				!DOMRegionContext.XML_EMPTY_TAG_CLOSE.equals(token)) {
-
-			if (DOMRegionContext.XML_TAG_ATTRIBUTE_NAME.equals(token)) {
-				attributeName = tokenizer.yytext();
-			}
-			else if (DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE.equals(token)) {
-				attributeValue = StringUtils.strip(tokenizer.yytext());
-				for (int i = 0; i < fPairs.length; i++) {
-					boolean nameMatched = fPairs[i].attribute.matcher(attributeName).matches();
-					if(nameMatched) {
-						boolean valueMatched = fPairs[i].value.matcher(attributeValue).matches();
-						if(valueMatched) {
-							return VALID;
-						}
-					}
-				}
-			}
-			token = tokenizer.primGetNextToken();
-		}
-		return INVALID;
-	}
-
-	public int describe(InputStream contents, IContentDescription description) throws IOException {
-		contents.reset();
-		byte[] bom = getByteOrderMark(contents);
-		if (bom != null && description != null)
-			description.setProperty(IContentDescription.BYTE_ORDER_MARK, bom);
-
-		Object value =
-			description != null ? description.getProperty(IContentDescription.CHARSET) : null;
-		String charsetName = null;
-		if (value != null) {
-			charsetName = value.toString();
-		}
-		else {
-			if (Arrays.equals(IContentDescription.BOM_UTF_16BE, bom)) {
-				charsetName = "UTF-16BE"; //$NON-NLS-1$
-			}
-			else if (Arrays.equals(IContentDescription.BOM_UTF_16LE, bom)) {
-				charsetName = "UTF-16LE"; //$NON-NLS-1$
-			}
-			else {
-				charsetName = "UTF-8"; //$NON-NLS-1$
-			}
-		}
-		contents.reset();
-		// Check to see if we matched our criteria.
-		return checkCriteria(new InputStreamReader(contents, Charset.forName(charsetName)));
-	}
-
-	public int describe(Reader contents, IContentDescription description) throws IOException {
-		contents.reset();
-		// Check to see if we matched our criteria.
-		return checkCriteria(contents);
-	}
-
-	public QualifiedName[] getSupportedOptions() {
-		return SUPPORTED_OPTIONS;
-	}
-
-	@SuppressWarnings("unchecked")
-	public void setInitializationData(
-			final IConfigurationElement config,
-			final String propertyName,
-			final Object data) throws CoreException {
-
-		if (data instanceof String) {
-			// TODO: why is this here? (imported verbatim from bug attachment)
-		}
-		else if (data instanceof Hashtable) {
-			IConfigurationElement describerElement = config.getChildren("describer")[0]; //$NON-NLS-1$
-			IConfigurationElement[] params = describerElement.getChildren("parameter"); //$NON-NLS-1$
-			List<AttributeValuePatternPair> pairs = new ArrayList<AttributeValuePatternPair>();
-			for (int i = 0; i < params.length; i++) {
-				String rawName = params[i].getAttribute(ATTRIBUTE_NAME);
-				String rawValue = params[i].getAttribute(ATTRIBUTE_VALUE);
-				if (rawName == null || rawValue == null)
-					continue;
-				Pattern attributeName = Pattern.compile(rawName);
-				Pattern attributeValue = Pattern.compile(rawValue);
-				pairs.add(new AttributeValuePatternPair(attributeName, attributeValue));
-			}
-			fPairs = pairs.toArray(new AttributeValuePatternPair[pairs.size()]);
-		}
-
-		if (fPairs == null || fPairs.length == 0) {
-			throw new CoreException(
-					new Status(IStatus.ERROR, JSFCorePlugin.PLUGIN_ID, 0,
-							"Attributes not specified", null)); //$NON-NLS-1$
-		}
-	}
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jem/BeanProxyUtil.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jem/BeanProxyUtil.java
deleted file mode 100644
index ac189b3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jem/BeanProxyUtil.java
+++ /dev/null
@@ -1,509 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.core.internal.jem;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jdt.core.IField;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jem.internal.proxy.core.IBeanProxy;
-import org.eclipse.jem.internal.proxy.core.IBeanTypeProxy;
-import org.eclipse.jem.internal.proxy.core.IFieldProxy;
-import org.eclipse.jem.internal.proxy.core.IIntegerBeanProxy;
-import org.eclipse.jem.internal.proxy.core.IMethodProxy;
-import org.eclipse.jem.internal.proxy.core.IStringBeanProxy;
-import org.eclipse.jem.internal.proxy.core.ThrowableProxy;
-import org.eclipse.jst.jsf.common.util.TypeUtil;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-
-/**
- * Convenience methods for using bean proxies
- * 
- * @author cbateman
- * 
- */
-public final class BeanProxyUtil
-{
-
-    /**
-     * A convenience wrapper for manipulating JEM proxy types
-     * 
-     */
-    public static class BeanProxyWrapper
-    {
-        private final static IBeanProxy[] NO_ARGS = new IBeanProxy[0];
-        private final static IBeanTypeProxy[] NO_ARG_TYPES = new IBeanTypeProxy[0];
-
-        private final IBeanTypeProxy _typeProxy;
-        private final IProject       _project;
-        private IBeanProxy _instance;
-
-        /**
-         * @param project 
-         * @param typeProxy
-         */
-        public BeanProxyWrapper(final IProject project, final IBeanTypeProxy typeProxy)
-        {
-            super();
-            _typeProxy = typeProxy;
-            _project = project;
-        }
-
-        /**
-         * Initialize a proxied instance of the type referred to by typeProxy.
-         * 
-         * @throws ProxyException
-         */
-        public void init() throws ProxyException
-        {
-            if (_instance == null)
-            {
-                try
-                {
-                    _instance = _typeProxy.newInstance();
-                }
-                catch (final ThrowableProxy e)
-                {
-                    throw new ProxyException(e);
-                }
-                catch (final NoClassDefFoundError ndfe)
-                {
-                    throw new ProxyException(ndfe);
-                }
-                catch (final ExceptionInInitializerError e)
-                {
-                    throw new ProxyException(e);
-                }
-            }
-        }
-
-        /**
-         * Re-initialize the proxied instance of typeProxy.
-         * 
-         * @throws ProxyException
-         */
-        public void reinit() throws ProxyException
-        {
-            _instance = null;
-            init();
-        }
-
-        /**
-         * @return the instance proxy
-         */
-        public IBeanProxy getInstance()
-        {
-            return _instance;
-        }
-
-        /**
-         * <p>
-         * Call the method called methodName on the proxied instance. If
-         * args.length is 0 then the zero-argument method is found and called.
-         * </p>
-         * 
-         * @param methodName
-         * @param args
-         * @param argTypes
-         * @return the result of calling the method or null if there is no such
-         *         method.
-         * @throws ProxyException
-         */
-        public IBeanProxy call(final String methodName,
-                final IBeanProxy[] args, final IBeanTypeProxy[] argTypes)
-                throws ProxyException
-        {
-            try
-            {
-                final IMethodProxy method = getMethodProxy(methodName, argTypes);
-                    /*(argTypes.length == 0) ? _typeProxy
-                        .getMethodProxy(methodName) : _typeProxy
-                        .getMethodProxy(methodName, argTypes);*/
-
-                if (method != null)
-                {
-                    method.setAccessible(true);
-                    return method.invoke(_instance, args);
-                }
-            }
-            catch (final ThrowableProxy tp)
-            {
-                throw new ProxyException(tp);
-            }
-            catch (final NoClassDefFoundError ndfe)
-            {
-                throw new ProxyException(ndfe);
-            }
-
-            return null;
-        }
-
-        /**
-         * Convenience method for call(methodName, new {@link IBeanProxy}[0],
-         * new {@link IBeanTypeProxy}[0])
-         * 
-         * @param methodName
-         * @return the proxied return value
-         * @throws ProxyException
-         */
-        public IBeanProxy call(final String methodName) throws ProxyException
-        {
-            return call(methodName, NO_ARGS, NO_ARG_TYPES);
-        }
-
-        /**
-         * <p>
-         * Calls the zero-argument method called 'methodName' on the proxied
-         * instance and if it results in a String return value, returns it. If
-         * the method does not return a String value, then null is returned.
-         * </p>
-         * 
-         * @param methodName
-         * @return the string value or null.
-         * @throws ProxyException
-         */
-        public String callStringMethod(final String methodName)
-                throws ProxyException
-        {
-            final IBeanProxy result = call(methodName);
-
-            if (result instanceof IStringBeanProxy)
-            {
-                return ((IStringBeanProxy) result).stringValue();
-            }
-
-            return null;
-        }
-
-        /**
-         * <p>
-         * Calls the zero-argument method called 'methodName' on the proxied
-         * instance and if it results in an Integer value, returns it. If the
-         * method does not return an integer value, then null is returned.
-         * </p>
-         * 
-         * @param methodName
-         * @return the integer value or null.
-         * @throws ProxyException
-         */
-        public Integer callIntMethod(final String methodName)
-                throws ProxyException
-        {
-            final IBeanProxy result = call(methodName, NO_ARGS, NO_ARG_TYPES);
-
-            if (result instanceof IIntegerBeanProxy)
-            {
-                return Integer.valueOf(((IIntegerBeanProxy) result).intValue());
-            }
-
-            return null;
-        }
-
-        /**
-         * Use the typeProxy for the proxied instance to try to acquire the
-         * field called fieldName of type String. Note that this won't find
-         * private fields on supertypes.
-         * 
-         * Equivalent to getStringFieldValue(fieldName, _typeProxy);
-         * 
-         * @param fieldName
-         * @return the String value of fieldName on the proxied instance or
-         *         null.
-         * @throws ProxyException
-         */
-        public String getStringFieldValue(final String fieldName)
-                throws ProxyException
-        {
-            return getStringFieldValue(fieldName, _typeProxy);
-        }
-
-        /**
-         * Use the provided typeProxy to acquire the field proxy for the field
-         * proxy called fieldName. Normally, you would use the type proxy of the
-         * instance bean, however there are cases such as acquiring the value a
-         * private field on a supertype where you need the type proxy for the
-         * super type.
-         * 
-         * @param fieldName
-         * @param typeProxy
-         * @return the string value or null.
-         * @throws ProxyException
-         */
-        public String getStringFieldValue(final String fieldName,
-                final IBeanTypeProxy typeProxy) throws ProxyException
-        {
-            final IBeanProxy value = getFieldValue(fieldName, typeProxy);
-
-            if (value instanceof IStringBeanProxy)
-            {
-                return ((IStringBeanProxy) value).stringValue();
-            }
-
-            return null;
-        }
-
-        /**
-         * @param fieldName
-         * @param typeProxy
-         * @return the declared field value on the proxied instance called
-         *         fieldName or null.
-         * @throws ProxyException
-         */
-        public IBeanProxy getFieldValue(final String fieldName,
-                final IBeanTypeProxy typeProxy) throws ProxyException
-        {
-            // avoid having JEM log a warning if we can prove the call to find
-            // the field will fail
-            if (!hasField(fieldName))
-            {
-                return null;
-            }
-
-            try
-            {
-                final IFieldProxy fieldProxy = typeProxy
-                        .getDeclaredFieldProxy(fieldName);
-
-                if (fieldProxy != null)
-                {
-                    fieldProxy.setAccessible(true);
-                    return fieldProxy.get(_instance);
-                }
-            }
-            catch (final ThrowableProxy e)
-            {
-                throw new ProxyException(e);
-            }
-            catch (final NoClassDefFoundError ndfe)
-            {
-                throw new ProxyException(ndfe);
-            }
-            
-            return null;
-        }
-
-        /**
-         * Same as {@link #getFieldValue(String, IBeanTypeProxy)} except it will
-         * climb the parent hierarchy looking for the first field called
-         * fieldName.
-         * 
-         * @param fieldName
-         * @param typeProxy
-         * @return the proxied value or null
-         * @throws ProxyException
-         */
-        public IBeanProxy getFieldValueIncludeParents(final String fieldName,
-                final IBeanTypeProxy typeProxy) throws ProxyException
-        {
-            IBeanTypeProxy curType = typeProxy;
-
-            PARENT_LOOP: while (curType != null)
-            {
-                final IBeanProxy field = getFieldValue(fieldName, curType);
-                if (field != null)
-                {
-                    return field;
-                }
-
-                try
-                {
-                    IBeanTypeProxy oldType = curType;
-                    curType = curType.getSuperBeanTypeProxy();
-                    // avoid infinite loop: if the parent of curType can't 
-                    // be resolved, JEM returns the same type, so curType
-                    // never becomes null
-                    if (oldType == curType)
-                    {
-                        break PARENT_LOOP;
-                    }
-                }
-                catch (final NullPointerException npe)
-                {
-                    // suppress npe caused by getSuperBeanTypeProxy
-                    // not doing a null check on getSuperType()
-                    curType = null;
-                }
-            }
-
-            // have got to the top of hierarchy and not found the field
-            return null;
-        }
-
-        /**
-         * @return the proxied instance
-         */
-        public final IBeanProxy getBeanProxy()
-        {
-            return _instance;
-        }
-
-        private IMethodProxy getMethodProxy(final String methodName, final IBeanTypeProxy[] argTypes)
-        {
-            IBeanTypeProxy curType = _typeProxy;
-
-            PARENT_LOOP: while (curType != null)
-            {
-                final IMethodProxy[] declaredMethods = curType.getDeclaredMethods();
-                if (declaredMethods != null)
-                {
-                    final IMethodProxy foundMethod = findMethodInList(methodName, argTypes, declaredMethods);
-                    if (foundMethod != null)
-                    {
-                        return foundMethod;
-                    }
-                }
-
-                // avoid infinite loop: if the parent of curType can't 
-                // be resolved, JEM returns the same type, so curType
-                // never becomes null
-                IBeanTypeProxy oldType = curType;
-                curType = _typeProxy.getSuperBeanTypeProxy();
-                if (oldType == curType)
-                {
-                    break PARENT_LOOP;
-                }
-            }
-            return null;
-        }
-
-        private IMethodProxy findMethodInList(final String methodName, final IBeanTypeProxy[] argTypes,
-                final IMethodProxy[] listOfMethods)
-        {
-            METHODS_LOOP: for (final IMethodProxy methodProxy : listOfMethods)
-            {
-                if (methodName.equals(methodProxy.getName()))
-                {
-                    final IBeanTypeProxy[] parameterTypes = 
-                        methodProxy.getParameterTypes();
-                    if (argTypes.length == parameterTypes.length)
-                    {
-                        for (int i = 0; i < argTypes.length; i++)
-                        {
-                            if (!argTypes[i].getTypeName().equals(parameterTypes[i].getTypeName()))
-                            {
-                                // if we find a parameter type mismatch, then
-                                // skip this method; it's not it
-                                continue METHODS_LOOP;
-                            }
-                        }
-                        // if we get to here, we have a method with right name
-                        // and parameters
-                        return methodProxy;
-                    }
-                }
-            }
-            return null;
-        }
-
-        private boolean hasField(final String fieldName)
-        {
-            final IType type = lazilyCalculateType();
-            if (type != null)
-            {
-                final IField field = type.getField(fieldName);
-                return field.exists();
-            }
-            return false;
-        }
-
-        private IType _type;
-        private boolean _checkedType;
-        private IType lazilyCalculateType()
-        {
-            if (!_checkedType)
-            {
-                _checkedType = true;
-                final String typeName = _typeProxy.getTypeName();
-                final IJavaProject javaProject = JavaCore.create(_project);
-                if (typeName != null && typeName.startsWith("L")) //$NON-NLS-1$
-                {
-                    _type = TypeUtil.resolveType(javaProject, typeName);
-                }
-                else
-                {
-                    try 
-                    {
-                        _type = javaProject.findType(typeName);
-                    } 
-                    catch (JavaModelException e) 
-                    {
-                        JSFCorePlugin.log(e, "While loading type: "+typeName); //$NON-NLS-1$
-                    }
-                }
-            }
-            return _type;
-        }
-
-//        private Map<String, List<IMethod>>   _methods;
-//        
-//        private Map<String, List<IMethod>> lazilyCalculateMethods(final IType type)
-//        {
-//            if (_methods == null)
-//            {
-//                _methods = new HashMap<String, List<IMethod>>();
-//                final JDTBeanIntrospector introspector = new JDTBeanIntrospector(type);
-//                final IMethod[] methods = introspector.getAllMethods();
-//                
-//                for (final IMethod method : methods)
-//                {
-//                    List<IMethod> byName = _methods.get(method.getElementName());
-//                    if (byName == null)
-//                    {
-//                        byName = new ArrayList<IMethod>();
-//                        _methods.put(method.getElementName(), byName);
-//                    }
-//                    
-//                    try {
-//                        if (method.exists()
-//                                && Flags.isPublic(method.getFlags()))
-//                        {
-//                            byName.add(method);
-//                        }
-//                    } catch (JavaModelException e) {
-//                        JSFCorePlugin.log(e, "While getting flags on method: "+method.getElementName());
-//                    }
-//                }
-//            }
-//            return _methods;
-//        }
-        
-    }
-
-    /**
-     * Checked exception the wraps problems thrown by JEM proxying into a single
-     * exception
-     * 
-     */
-    public static class ProxyException extends Exception
-    {
-        private static final long serialVersionUID = -1526057761795574331L;
-
-        /**
-         * @param message
-         * @param cause
-         */
-        public ProxyException(final String message, final Throwable cause)
-        {
-            super(message, cause);
-        }
-
-        /**
-         * @param cause
-         */
-        public ProxyException(final Throwable cause)
-        {
-            super(cause);
-        }
-
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryconfig/JSFLibraryConfigDialogSettingData.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryconfig/JSFLibraryConfigDialogSettingData.java
deleted file mode 100644
index 2b7f263..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryconfig/JSFLibraryConfigDialogSettingData.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Justin Chen
- *******************************************************************************/
-package org.eclipse.jst.jsf.core.internal.jsflibraryconfig;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * To construct implementation library and component libraries from sticky values 
- * in DialogSettings as saved libraries.  
- * 
- * @author Justin Chen - Oracle
- * @deprecated
- */
-public class JSFLibraryConfigDialogSettingData {
-	/**
-	 * Delimintor for parsing a persistent property string.
-	 */
-	final protected static String SEPARATOR =":";	//$NON-NLS-1$
-
-    /**
-     * Parsing delimnitor for elements in a tuple.
-     */
-    final protected static String SPTR_TUPLE = ":"; //$NON-NLS-1$
-    /**
-     * Parsing delimintor for tuples in a persistent property string.
-     */
-    final protected static String EO_TUPLE = ";";   //$NON-NLS-1$
-    
-	final private JSFLibraryRegistryUtil jsfLibReg;
-	private String[] savedCompLibs;
-	private List selJSFLibComp;							// lazy initialized
-	
-	
-	/**
-	 * Constructor where implementation type was chosen to be USER_SPECIFIED.  Created for backwards compatibilty when server supplied was not an option.
-	 * @param compLibs
-	 */
-	public JSFLibraryConfigDialogSettingData( String[] compLibs) {
-		this.jsfLibReg = JSFLibraryRegistryUtil.getInstance();
-		this.savedCompLibs = compLibs;
-		
-		// Verify and log a message if a saved component library no longer exists. 
-		verifySavedLibAvailability();
-	}	
-	
-	/**
-	 * Return the list of saved component libraries and their deployment settings.
-	 * 
-	 * @return selJSFLibComp List 
-	 */
-	public List getJSFComponentLibraries() {
-		if (selJSFLibComp == null) {
-			selJSFLibComp = new ArrayList();		
-			
-			if (savedCompLibs != null && savedCompLibs.length > 0) {
-				JSFLibraryInternalReference lib = null;
-				String item;
-				String[] attributes;
-				String id;
-				boolean deploy = false;
-				
-				for (int i = 0; i < savedCompLibs.length; i++) {
-					item = savedCompLibs[i];
-					attributes = item.split(SEPARATOR);
-					
-					id = attributes[0];				
-					deploy = Boolean.valueOf(attributes[1]).booleanValue();
-					
-					lib = jsfLibReg.getJSFLibraryReferencebyID(id);
-					if (lib != null) {
-						selJSFLibComp.add(new JSFLibraryInternalReference(lib.getLibrary(), true, deploy));
-					} /*else {
-						// already logged if a saved component library is no longer available.
-					}*/
-				}
-			}
-		}
-		return selJSFLibComp;
-	}
-
-	/**
-	 * Only need to verify component library availability from sticky settings.
-	 */
- 	private void verifySavedLibAvailability() {
- 		List validLibs = new ArrayList();
-		if (savedCompLibs != null && savedCompLibs.length > 0) {
-			String item = null;
-			String[] attributes;
-			boolean invalidRefs = false;
-			for (int i = 0; i < savedCompLibs.length; i++) {
-				item = savedCompLibs[i];
-				attributes = item.split(SEPARATOR);
-													
-				if (jsfLibReg.getJSFLibraryReferencebyID(attributes[0]) != null) {
-					validLibs.add(item);
-				} else {
-					invalidRefs = true;
-//					JSFCorePlugin.log(IStatus.INFO, Messages.JSFLibCfgDialogSettingData_Sticky_Component_Lib_Not_Exist);
-				}
-			}  				
-			if (invalidRefs){
-				String [] validCompLibs = (String[])validLibs.toArray(new String[validLibs.size()]);
-				if (validCompLibs.length > 0)
-					System.arraycopy(validCompLibs, 0, savedCompLibs, 0, validCompLibs.length);
-				else
-					savedCompLibs = new String[]{};
-			}
-		}	
-		
-
- 	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryconfig/JSFLibraryConfigModel.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryconfig/JSFLibraryConfigModel.java
deleted file mode 100644
index 3d1e7e6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryconfig/JSFLibraryConfigModel.java
+++ /dev/null
@@ -1,161 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:  Oracle
- *******************************************************************************/
-package org.eclipse.jst.jsf.core.internal.jsflibraryconfig;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.jst.jsf.core.internal.Messages;
-
-/**
- * Model for the custom control <b>JSFLibraryConfigControl</b>.
- * A JSFLibraryConfigModel object is initialized from a source and updated with 
- * selected implementation and component libraries when selections are changed.
- * 
- * @author Justin Chen - Oracle
- * @deprecated
- */
-public class JSFLibraryConfigModel {
-	final private JSFLibraryConfigDialogSettingData data;
-	final private JSFLibraryRegistryUtil jsfLibReg;
-	private List colJSFCompLib;	
-	
-	/**
-	 * Private constructor.  
-	 * @param data
-	 */
-	private JSFLibraryConfigModel(JSFLibraryConfigDialogSettingData data) {
-		this.data = data;
-		this.jsfLibReg = JSFLibraryRegistryUtil.getInstance();
-	}
-		
-	/**
-	 * Return JSF component libraries.
-	 * 
-	 * This list is initialized from JSF library registry and updated with persistent 
-	 * configuration data.  
-	 * 
-	 * @return List
-	 * see also org.eclipse.jst.jsf.ui.properties.IJSFLibraryDecoratorProvider#getProjectJSFComponentLibraries()
-	 */	
-	public List getJSFComponentLibraries() {
-		if (colJSFCompLib == null) {
-			/* To initialize a component library list from registry and then 
-			 * update list with saved component libraries.
-			 */
-			colJSFCompLib = jsfLibReg.getJSFComponentLibraries();			
-			Iterator it = data.getJSFComponentLibraries().iterator();
-			JSFLibraryInternalReference targetItem = null;
-			JSFLibraryInternalReference srcItem = null;
-			while (it.hasNext()) {
-				targetItem = (JSFLibraryInternalReference) it.next();
-				srcItem = jsfLibReg.getJSFLibraryReferencebyID(targetItem.getID());
-				if (srcItem != null) {
-					srcItem.setSelected(true);
-					srcItem.setToBeDeployed(targetItem.isCheckedToBeDeployed());
-				}
-			}
-		}
-		return colJSFCompLib;
-	}
-
-	/**
-	 * Return the selected JSF component libraries currently.
-	 * An empty list is returned when no component libraries are selected.
-	 * 
-	 * @return list List
-	 */
-	public List getCurrentJSFComponentLibrarySelection() {
-		List list = new ArrayList();
-
-		Iterator it = getJSFComponentLibraries().iterator();
-		JSFLibraryInternalReference crtItem = null;
-		while (it.hasNext()) {
-			crtItem = (JSFLibraryInternalReference) it.next();
-			if (crtItem.isSelected()) {
-				list.add(crtItem);
-			}
-		}
-		return list;
-	}	
-	
-	/**
-	 * Returned saved component libraries which were persisted as 
-	 * DialogSettings or project persistent properties.
-	 *  
-	 * @return List
-	 */
-	public List getSavedJSFComponentLibraries() {
-		return data.getJSFComponentLibraries();
-	}
-	
-	/**
-	 * Update the JSF library component libraries selection.
-	 * 
-	 * @param libraries List
-	 */
-	public void setCurrentJSFComponentLibrarySelection(final List libraries) {
-		if (libraries != null) {
-			/* Reset all item in component library list to unselect first.
-			 * Then, update each item in cmponent libraries to the provided list.
-			 */
-			setJSFLibrariesSelection(getJSFComponentLibraries(), false);
-	
-			Iterator it = libraries.iterator();
-			JSFLibraryInternalReference crtItem;
-			JSFLibraryInternalReference srcItem = null;
-			while (it.hasNext()) {
-				crtItem = (JSFLibraryInternalReference) it.next();
-				srcItem = jsfLibReg.getJSFLibraryReferencebyID(crtItem.getID());
-				
-				if (srcItem != null) {
-					srcItem.setSelected(true);
-					srcItem.setToBeDeployed(crtItem.isCheckedToBeDeployed());
-				}
-			}		
-		}
-	}
-		
-	/**
-	 * Set selection state to given state to each libray in the collection.
-	 * 
-	 * @param libs List
-	 * @param state boolean
-	 */
-	private void setJSFLibrariesSelection(final List libs, final boolean state) {
-		Iterator it = libs.iterator();
-		JSFLibraryInternalReference crtjsflib;
-		while (it.hasNext()) {
-			crtjsflib = (JSFLibraryInternalReference) it.next();
-			crtjsflib.setSelected(state);
-		}		
-	}	
-	
-	/**
-	 * Factory class to create new JSFLibraryConfigModel instances
-	 */
-	public static final class JSFLibraryConfigModelFactory {
-	    /** 
-	     * To create a new instance of JSFLibraryConfigModel object.  
-		 * A NullPointerException is raised if source is null.
-		 * 
-		 * @param source JSFLibraryConfiglModelSource 
-		 * @return JSFLibraryConfigModel 
-		 */
-		public static JSFLibraryConfigModel createInstance(final JSFLibraryConfigDialogSettingData source) {
-			if (source == null) {
-				throw new NullPointerException(Messages.JSFLibraryConfigModel_Null_Data_Source);
-			}
-			return new JSFLibraryConfigModel(source);
-		}
-	}
-	
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryconfig/JSFLibraryInternalReference.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryconfig/JSFLibraryInternalReference.java
deleted file mode 100644
index 8c8481b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryconfig/JSFLibraryInternalReference.java
+++ /dev/null
@@ -1,148 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:  Oracle
- *******************************************************************************/
-package org.eclipse.jst.jsf.core.internal.jsflibraryconfig;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary;
-
-/**
- * Attach additonal attributes such as selection and deployment 
- * to a JSF library when it is referenced by a project.  
- * 
- * @author Justin Chen - Oracle
- * @deprecated
- */
-public class JSFLibraryInternalReference {
-	final private JSFLibrary jsfLib;
-	private boolean check4Deploy;			// Initialized from default in workspace
-	private boolean selected; 				// selected for project
-	
-	/**
-	 * Constructor
-	 * @param jsfLib JSFLibrary  instance embedded inside.
-	 * @param selected boolean  true if selected, otherwise, not selected.
-	 * @param deploy boolean  true if needs to be deployed, otherwise, won't be deployed.
-	 */
-	public JSFLibraryInternalReference(JSFLibrary jsfLib, boolean selected, boolean deploy) {
-		this.jsfLib = jsfLib;
-		this.selected = selected;
-		this.check4Deploy = deploy;		
-	}
-	
-	/**
-	 * Return the embedded JSFLibrary instance.
-	 *  
-	 * @return jsfLib JSFLibrary
-	 */	 
-	public JSFLibrary getLibrary() {
-		return jsfLib;
-	}
-
-	/**
-	 * Set the to be deployed flag.
-	 * 
-	 * @param deploy boolean
-	 */
-	public void setToBeDeployed(final boolean deploy) {
-		check4Deploy = deploy;
-	}	
-	
-	/**
-	 * Return true if the JSF library needs to be deployed.
-	 * Otheriwse, return false.
-	 * 
-	 * @return boolean
-	 */
-	public boolean isCheckedToBeDeployed() {
-		return check4Deploy;
-	}
-
-	/**
-	 * Set the selected attribute to a JSFLibraryLibraryReference object.
-	 * 
-	 * @param selected boolean
-	 */
-	public void setSelected(final boolean selected) {
-		this.selected = selected;
-	}
-	
-	/**
-	 * Return true if the JSF library is referenced by a project.  
-	 * Otherwise, return false.
-	 * 
-	 * @return selected boolean
-	 */
-	public boolean isSelected() {
-		return selected;
-	}	
-	
-	/**
-	 * To generate a string that represents the JSFLibraryLibraryReference 
-	 * object for persistence. 
-	 * 
-	 * @return String
-	 */
-	protected String generatePersistString() {
-		return (getID() + JSFLibraryConfigDialogSettingData.SPTR_TUPLE + 
-				String.valueOf(isSelected()) + JSFLibraryConfigDialogSettingData.SPTR_TUPLE + 
-				String.valueOf(isCheckedToBeDeployed())); 
-	}
-
-	/**
-	 * Helper method to return the library ID from the embedded 
-	 * JSFLibrary instance. 
-	 * 
-	 * @return id String
-	 */
-	public String getID() {
-		return jsfLib.getID();
-	}
-
-	/**
-	 * Helper method to return the library name from the embedded 
-	 * JSFLibrary instance. 
-	 * 
-	 * @return name String
-	 */
-	public String getName() {
-		return jsfLib.getName();
-	}
-
-	/**
-	 * Helper method to return the label for the library from the embedded 
-	 * JSFLibrary instance. 
-	 * 
-	 * @return name String
-	 */
-	public String getLabel() {
-		return jsfLib.getLabel();
-	}
-	
-	/**
-	 * Return true if the embedded JSF library instance i implementation. 
-	 * Otherwise, return false.
-	 * 
-	 * @return boolean
-	 */
-	public boolean isImplementation() {
-		return jsfLib.isImplementation();
-	}
-
-	/**
-	 *  Help method to return a list of Archive files from 
-	 *  the embedded JSFLibrary instance.
-	 * 
-	 * @return boolean
-	 */	
-	public EList getArchiveFiles() {
-		return jsfLib.getArchiveFiles();
-	}
-	
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryconfig/JSFLibraryRegistryUtil.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryconfig/JSFLibraryRegistryUtil.java
deleted file mode 100644
index ac56b9b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryconfig/JSFLibraryRegistryUtil.java
+++ /dev/null
@@ -1,548 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:  Oracle
- *******************************************************************************/
-package org.eclipse.jst.jsf.core.internal.jsflibraryconfig;
-
-import java.io.IOException;
-import java.net.MalformedURLException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IExtension;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.InvalidRegistryObjectException;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.xmi.XMLResource;
-import org.eclipse.jdt.core.IClasspathContainer;
-import org.eclipse.jdt.core.IClasspathEntry;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.core.internal.JSFLibraryClasspathContainer;
-import org.eclipse.jst.jsf.core.internal.Messages;
-import org.eclipse.jst.jsf.core.internal.RegistryUpgradeCommitHandler;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistry;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryFactory;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.adapter.MaintainDefaultImplementationAdapter;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.JSFLibraryRegistryPackageImpl;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.util.JSFLibraryRegistryResourceFactoryImpl;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.util.JSFLibraryRegistryResourceImpl;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.util.JSFLibraryRegistryUpgradeUtil;
-import org.eclipse.jst.jsf.core.jsflibraryconfiguration.JSFLibraryConfigurationHelper;
-import org.eclipse.jst.jsf.core.jsflibraryregistry.PluginProvidedJSFLibraryCreationHelper;
-import org.eclipse.jst.jsf.core.jsflibraryregistry.internal.PluginProvidedJSFLibraryCreationHelper2;
-
-/**
- * A singleton maintains lists of implementation and component libraries 
- * in registry.
- *   
- * Each item in the lists contains a workingcopy of a JSF library and 
- * decorates with usage information such selection and deployment.  
- * 
- * The lists are updated when there are changes in JSF library registry.
- * 
- * @author Justin Chen, etc. - Oracle
- * @deprecated
- */
-public class JSFLibraryRegistryUtil {
-	private static JSFLibraryRegistryUtil instance = null;	
-	
-	private List implLibs = null;
-	private List compLibs = null;
-	
-
-	// The NS URI of the JSF Library Registry's Ecore package. (Must match
-	// setting on package in Ecore model.)
-	private static final String JSF_LIBRARY_REGISTRY_NSURI = "http://www.eclipse.org/webtools/jsf/schema/jsflibraryregistry.xsd"; //$NON-NLS-1$
-
-	private static final String LIB_EXT_PT 		= "pluginProvidedJsfLibraries"; //$NON-NLS-1$
-	//deprecated ext-pt
-	private static final String OLD_LIB_EXT_PT 	= "jsfLibraries"; //$NON-NLS-1$
-
-	// The JSF Library Registry EMF resource instance.
-	private static JSFLibraryRegistryResourceImpl jsfLibraryRegistryResource = null;
-	
-	//JSFLibraryRegistry singleton
-	private JSFLibraryRegistry jsfLibraryRegistry;
-	
-	/**
-	 * Private constructor
-	 */
-	private JSFLibraryRegistryUtil() {
-	    //nothing to do
-	}
-	
-	/**
-	 * Return the singleton instance of JSFLibraryRegistryUtil.
-	 *   
-	 * @return JSFLibraryRegistryUtil
-	 */
-	public synchronized static JSFLibraryRegistryUtil getInstance() {
-		if ( instance == null ) {
-			instance = new JSFLibraryRegistryUtil();
-			instance.loadJSFLibraryRegistry();
-		}
-		return instance;
-	}
-
-	/**
-	 * Convenience method to return the JSFLibraryRegistry instance.
-	 * 
-	 * @return jsfLibReg JSFLibraryRegistry
-	 */
-	public JSFLibraryRegistry getJSFLibraryRegistry() {
-		return jsfLibraryRegistry;
-	}
-	
-	/**
-	 * Get the default JSF implementation library instance.
-	 * A null is returned when there is no libraries in the registry.
-	 * 
-	 * @return JSFLibraryInternalReference
-	 */
-	public JSFLibraryInternalReference getDefaultJSFImplementationLibrary() {
-		JSFLibrary dftImplLib = getJSFLibraryRegistry().getDefaultImplementation();
-		
-		return ((dftImplLib != null) ? 
-				getJSFLibraryReferencebyID(dftImplLib.getID()) :
-				null);
-	}
-	
-	/**
-	 * Get the working copy of JSF implementation libraries.
-	 * The list is updated when there are changes in registry.
-	 * 
-	 * @return List
-	 */
-	List getJSFImplementationLibraries() {
-		if (implLibs == null) {
-			implLibs = wrapJSFLibraries(getJSFLibraryRegistry().getImplJSFLibraries());
-		} else {
-			if (implLibs.size() != getJSFLibraryRegistry().getImplJSFLibraries().size() || 
-					isAnyLibraryChanged(implLibs)) {
-				implLibs.clear();
-				implLibs = wrapJSFLibraries(getJSFLibraryRegistry().getImplJSFLibraries());
-			}
-		}
-		return implLibs;
-	}
-		
-	/**
-	 * Get the working copy of JSF component libraries.
-	 * The list is updated when there are changes in registry.
-	 * 
-	 * @return List
-	 */
-	List getJSFComponentLibraries() {
-		if (compLibs == null) {
-			compLibs = wrapJSFLibraries(getJSFLibraryRegistry().getNonImplJSFLibraries());
-		} else {
-			if (compLibs.size() != getJSFLibraryRegistry().getNonImplJSFLibraries().size() || 
-					isAnyLibraryChanged(compLibs)) {
-				compLibs.clear();
-				compLibs = wrapJSFLibraries(getJSFLibraryRegistry().getNonImplJSFLibraries());
-			}			
-		}
-		return compLibs;
-	}
-	
-	/**
-	 * Get the JSFLibraryDecorator object from the provided ID. 
-	 * A null is returned no library matches the ID.
-	 * 
-	 * @param id String
-	 * @return JSFLibraryDecorator
-	 */
-	public JSFLibraryInternalReference getJSFLibraryReferencebyID(final String id) {
-		Iterator it = getJSFImplementationLibraries().iterator();
-		JSFLibraryInternalReference crtItem = null;
-		
-		// search implementation libraries
-		while(it.hasNext()) {
-			crtItem = (JSFLibraryInternalReference)it.next();
-			if (id.equals(crtItem.getID())) {
-				return crtItem;
-			}
-		}
-		// search component libraries
-		it = getJSFComponentLibraries().iterator();
-		while(it.hasNext()) {
-			crtItem = (JSFLibraryInternalReference)it.next();
-			if (id.equals(crtItem.getID())) {
-				return crtItem;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Add a JSF Library into collection for either 
-	 * JSF implementation libraries or component libraries.  
-	 * The decision is based on if a JSF library is an implementation.
-	 * 
-	 * @param library JSFLibraryLibraryReference
-	 */
-	public void addJSFLibrary(final JSFLibraryInternalReference library) {
-		 // Library is added only if it does not exist in registry 
-		if (library != null && getJSFLibraryRegistry().getJSFLibraryByID(library.getID()) == null) {
-			// Add the library working copy into workspace registry.
-			JSFLibrary jsfLib = library.getLibrary();
-			getJSFLibraryRegistry().addJSFLibrary(jsfLib.getWorkingCopy());
-			
-			// Add library into the collection depends on its type.
-			List list = (library.isImplementation() ? 
-							getJSFImplementationLibraries() :
-							getJSFComponentLibraries());
-			list.add(library);
-		}
-	}	
-	
-	private List wrapJSFLibraries(final EList libs) {
-		List list = new ArrayList();
-		if (libs != null) {
-			JSFLibrary jsfLib;
-			JSFLibraryInternalReference jsfLibDctr;
-			
-			Iterator it = libs.iterator();
-			while (it.hasNext()) {
-				jsfLib = (JSFLibrary) it.next();
-				 // Set unselected and undeployed initially.
-				jsfLibDctr = new JSFLibraryInternalReference(jsfLib, //.getWorkingCopy(), 
-								false, 
-								false);
-				list.add(jsfLibDctr);
-			}
-		}	
-		return list;		
-	}
-
-	private boolean isAnyLibraryChanged(final List list) {
-		Iterator it = list.iterator();
-		JSFLibraryInternalReference wclib = null;		// working copy library
-		JSFLibrary lib = null;
-		
-		while(it.hasNext()) {
-			wclib = (JSFLibraryInternalReference)it.next();
-			lib = getJSFLibraryRegistry().getJSFLibraryByID(wclib.getID());
-			if (lib == null) {					// removed. Hence, changed.
-				return true;
-			}
-			if (wclib.getArchiveFiles().size() != 
-				lib.getArchiveFiles().size()) { // Archives changed..
-				return true;
-			}
-			if (isAnyArchiveFileChanged(wclib.getArchiveFiles(), 
-					lib.getArchiveFiles())) {   // Check archive file changes.  I.e., name and location
-				return true;
-			}
-		}
-		return false;
-	}
-
-	private boolean isAnyArchiveFileChanged(final EList source, EList target) {		
-		ArchiveFile arSrc = null;
-		Iterator it = source.iterator();
-		while (it.hasNext()) {
-			arSrc = (ArchiveFile) it.next();
-			if (!findMatchedArchive(arSrc, target)) {
-				return true;
-			}
-		}
-		return false;
-	}
-	
-	private boolean findMatchedArchive(ArchiveFile source, EList list) {
-		ArchiveFile target = null;
-		Iterator it = list.iterator();
-		while (it.hasNext()) {
-			target = (ArchiveFile) it.next();
-			if (target.equals(source)) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * Get the classpath entries for a JSF Library
-	 * @param lib
-	 * @return IClasspathEntry[]
-	 */
-	public IClasspathEntry[] getClasspathEntries(JSFLibrary lib){		
-		//TODO: cache to optimize.   probably belongs inside JSFLibrary model.
-		ArrayList res= new ArrayList(lib.getArchiveFiles().size());
-		for (Iterator it=lib.getArchiveFiles().iterator();it.hasNext();) {
-			ArchiveFile jar= (ArchiveFile)it.next();			
-			if (jar != null && jar.exists()) {
-				IClasspathEntry entry = getClasspathEntry(jar);
-				if (entry != null)
-					res.add(entry);
-			}
-		}
-		IClasspathEntry[] entries= (IClasspathEntry[]) res.toArray(new IClasspathEntry[res.size()]);
-		return entries;
-	}
-	
-	/**
-	 * Create IClasspathEntry for ArchiveFile
-	 * @param jar
-	 * @return IClasspathEntry
-	 */
-	public IClasspathEntry getClasspathEntry(ArchiveFile jar){
-		IClasspathEntry entry = null;
-		if (jar !=null && jar.exists()){
-			entry = JavaCore.newLibraryEntry(new Path(jar.getResolvedSourceLocation()), null, null);//, nu, sourceAttachRoot, accessRules, extraAttributes, false/*not exported*/);
-		}
-		return entry;
-	}
-	
-	/**
-	 * Binds JSF Libraries to classpath containers when the library changes.
-	 * 
-	 * This method will deal with library/cp container renames by removing the old classpath container and then adding.
-	 * 
-	 * @param oldId
-	 * @param newId
-	 * @param monitor
-	 * @throws JavaModelException
-	 */
-	public static void rebindClasspathContainerEntries(String oldId, String newId, IProgressMonitor monitor) throws JavaModelException {
-		IWorkspaceRoot root= ResourcesPlugin.getWorkspace().getRoot();
-		IJavaProject[] projects= JavaCore.create(root).getJavaProjects();
-		IPath containerPath= new Path(JSFLibraryConfigurationHelper.JSF_LIBRARY_CP_CONTAINER_ID).append(newId);
-		IPath oldContainerPath = new Path(JSFLibraryConfigurationHelper.JSF_LIBRARY_CP_CONTAINER_ID).append(oldId);
-		
-		JSFLibrary lib = JSFLibraryRegistryUtil.getInstance().getJSFLibraryRegistry().getJSFLibraryByID(newId);
-		List affectedProjects= new ArrayList();
-		boolean removeAndAddBecauseOfRename = (!oldId.equals(newId));
-		// find all projects using the old container name...
-		for (int i= 0; i < projects.length; i++) {
-			IJavaProject project= projects[i];
-			IClasspathEntry[] entries= project.getRawClasspath();
-			for (int k= 0; k < entries.length; k++) {
-				IClasspathEntry curr= entries[k];
-				if (curr.getEntryKind() == IClasspathEntry.CPE_CONTAINER) {
-					if (oldContainerPath.equals(curr.getPath())) {
-						affectedProjects.add(project);
-						break;
-					}				
-				}
-			}
-		}
-		
-		if (!affectedProjects.isEmpty()) {
-			IJavaProject[] affected= (IJavaProject[]) affectedProjects.toArray(new IJavaProject[affectedProjects.size()]);
-			IClasspathContainer[] containers= new IClasspathContainer[affected.length];
-			removeAndAddBecauseOfRename = (!oldId.equals(newId));
-			if (removeAndAddBecauseOfRename){//not very pretty... remove and add new container				
-				IClasspathEntry newEntry = JavaCore.newContainerEntry(containerPath);
-				for (int i= 0; i < affected.length; i++) {
-					IJavaProject project= affected[i];
-					IClasspathEntry[] entries= project.getRawClasspath();
-					List keptEntries = new ArrayList();
-					//keep all entries except the old one
-					for (int k= 0; k < entries.length; k++) {
-						IClasspathEntry curr= entries[k];
-						if (curr.getEntryKind() == IClasspathEntry.CPE_CONTAINER){
-								if( ! oldContainerPath.equals(curr.getPath())) 
-							keptEntries.add(curr);						
-						}
-						else {
-							keptEntries.add(curr);
-						}						
-					}
-					// add new container entry
-					keptEntries.add(newEntry);
-					setRawClasspath(project, keptEntries, monitor);
-				}
-				
-			}
-			else {//rebind
-
-				JSFLibraryClasspathContainer container= new JSFLibraryClasspathContainer(lib);
-				containers[0] = container;
-	
-				JavaCore.setClasspathContainer(containerPath, affected, containers, monitor);
-			}
-		} else {
-			if (monitor != null) {
-				monitor.done();
-			}
-		}
-	}
-
-	/**
-	 * Sets the raw classpath on a project and logs an error if it when a JavaModelException occurs
-	 * @param project
-	 * @param cpEntries
-	 * @param monitor
-	 */
-	public static void setRawClasspath(IJavaProject project, List cpEntries, IProgressMonitor monitor) {
-		IClasspathEntry[] entries = (IClasspathEntry[])cpEntries.toArray(new IClasspathEntry[0]);
-		try {
-			project.setRawClasspath(entries, monitor);
-		} catch (JavaModelException e) {
-			JSFCorePlugin.log(e, "Unable to set classpath for: "+project.getProject().getName()); //$NON-NLS-1$
-		}
-	}
-	
-	/**
-	 * Loads the JSFLibraryRegistry EMF object from plugin-specfic workspace
-	 * settings location.
-	 */
-	private void loadJSFLibraryRegistry() {
-		try {
-			
-			EPackage.Registry.INSTANCE.put(JSF_LIBRARY_REGISTRY_NSURI, JSFLibraryRegistryPackageImpl.init());
-			URI jsfLibRegURI = JSFLibraryRegistryUpgradeUtil.getRegistryURI(JSFLibraryRegistryUpgradeUtil.JSF_LIBRARY_REGISTRY_LATESTVERSION_URL);			
-			JSFLibraryRegistryUpgradeUtil.getInstance().upgradeRegistryIfNecessary(JSFLibraryRegistryUpgradeUtil.LATESTVERSION);
-
-			JSFLibraryRegistryResourceFactoryImpl resourceFactory = new JSFLibraryRegistryResourceFactoryImpl();
-			jsfLibraryRegistryResource = (JSFLibraryRegistryResourceImpl)resourceFactory.createResource(jsfLibRegURI);
-			try {
-				Map options = new HashMap();
-				//disable notifications during load to avoid changing stored default implementation
-				options.put(XMLResource.OPTION_DISABLE_NOTIFY, Boolean.TRUE);
-				jsfLibraryRegistryResource.load(options);
-				jsfLibraryRegistry = (JSFLibraryRegistry)jsfLibraryRegistryResource.getContents().get(0);
-			 	
-				loadJSFLibraryExtensions();
-				loadDeprecatedJSFLibraryExtensions();//to be removed 
-				
-			} catch(IOException ioe) {
-				//Create a new Registry instance
-				jsfLibraryRegistry = JSFLibraryRegistryFactory.eINSTANCE.createJSFLibraryRegistry();
-				jsfLibraryRegistryResource = (JSFLibraryRegistryResourceImpl)resourceFactory.createResource(jsfLibRegURI);
-				jsfLibraryRegistryResource.getContents().add(jsfLibraryRegistry);
-				loadJSFLibraryExtensions();
-				loadDeprecatedJSFLibraryExtensions();//to be removed 
-				saveJSFLibraryRegistry();
-			}
-			//add adapter to maintain default implementation
-			if (jsfLibraryRegistry != null) {				
-				//check that a default impl is set.   if not pick first one if available.
-				JSFLibrary defLib = jsfLibraryRegistry.getDefaultImplementation();
-				if (defLib == null && jsfLibraryRegistry.getImplJSFLibraries().size() > 0){
-					jsfLibraryRegistry.setDefaultImplementation((JSFLibrary)jsfLibraryRegistry.getImplJSFLibraries().get(0));
-					saveJSFLibraryRegistry();
-				}
-				jsfLibraryRegistry.eAdapters().add(MaintainDefaultImplementationAdapter.getInstance());
-				
-				//commit 
-				RegistryUpgradeCommitHandler.commitMigrationIfNecessary();
-			}
-		} catch(MalformedURLException mue) {
-			JSFCorePlugin.log(IStatus.ERROR, Messages.JSFLibraryRegistry_ErrorCreatingURL, mue);
-		}
-	}
-/////////////////////////////////   Load and Save JSF Library Registry ////////////////////////////////////////////////
-	
-	/**
-	 * Creates library registry items from extension points.
-	 */
-	private void loadJSFLibraryExtensions() {
-		try {
-			IExtensionPoint point = Platform.getExtensionRegistry().getExtensionPoint(JSFCorePlugin.PLUGIN_ID, LIB_EXT_PT);
-			IExtension[] extensions = point.getExtensions();
-			for (int i=0;i < extensions.length;i++){
-				IExtension ext = extensions[i];
-				for (int j=0;j < ext.getConfigurationElements().length;j++){
-					PluginProvidedJSFLibraryCreationHelper2 newLibCreator = new PluginProvidedJSFLibraryCreationHelper2(ext.getConfigurationElements()[j]);						
-					JSFLibrary newLib = newLibCreator.create();
-					
-					/**
-					 * Additional check on if a plug-in contributes jsflibraries is an expanded folder.
-					 * Fix related to bug 144954.  
-					 * 
-					 * It would be ideal to check if a plug-in is distributed as a JAR 
-					 * before a JSFLibrary is created.
-					 * 
-					 * This is a temporary solution since JARs in a JAR case is not 
-					 * supported in this release.  Bug 14496.
-					 */
-					if (newLib != null) //&& isJSFLibinExpandedFolder(newLib))
-						jsfLibraryRegistry.addJSFLibrary(newLib);
-				}
-			}
-		} catch (InvalidRegistryObjectException e) {
-			JSFCorePlugin.log(IStatus.ERROR, Messages.JSFLibraryRegistry_ErrorLoadingFromExtPt, e);
-		}
-	}
-	
-	/**
-	 * Creates deprecated library registry items from extension points.
-	 * TO BE REMOVED
-	 */
-	private void loadDeprecatedJSFLibraryExtensions() {
-		try {
-			IExtensionPoint point = Platform.getExtensionRegistry().getExtensionPoint(JSFCorePlugin.PLUGIN_ID, OLD_LIB_EXT_PT);
-			IExtension[] extensions = point.getExtensions();
-			for (int i=0;i < extensions.length;i++){
-				IExtension ext = extensions[i];
-				for (int j=0;j < ext.getConfigurationElements().length;j++){
-					PluginProvidedJSFLibraryCreationHelper newLibCreator = new PluginProvidedJSFLibraryCreationHelper(ext.getConfigurationElements()[j]);						
-					JSFLibrary newLib = newLibCreator.create();
-					
-					/**
-					 * Additional check on if a plug-in contributes jsflibraries is an expanded folder.
-					 * Fix related to bug 144954.  
-					 * 
-					 * It would be ideal to check if a plug-in is distributed as a JAR 
-					 * before a JSFLibrary is created.
-					 * 
-					 * This is a temporary solution since JARs in a JAR case is not 
-					 * supported in this release.  Bug 14496.
-					 */
-					if (newLib != null ) //&& isJSFLibinExpandedFolder(newLib))
-						jsfLibraryRegistry.addJSFLibrary(newLib);
-				}
-			}
-		} catch (InvalidRegistryObjectException e) {
-			JSFCorePlugin.log(IStatus.ERROR, Messages.JSFLibraryRegistry_ErrorLoadingFromExtPt, e);
-		}
-	}
-	
-	/**
-	 * Saves the JSFLibraryRegistry EMF object from plugin-specfic workspace
-	 * settings location. (Called from stop(BundleContext).)
-	 * @return true if save is successful
-	 */
-	public boolean saveJSFLibraryRegistry() {
-		boolean saved = false;
-		if (jsfLibraryRegistryResource != null) {
-			try {
-				jsfLibraryRegistryResource.save(Collections.EMPTY_MAP);
-				saved = true;
-			} catch(IOException ioe) {
-				JSFCorePlugin.log(IStatus.ERROR, Messages.JSFLibraryRegistry_ErrorSaving, ioe);
-			}
-		} else {
-			JSFCorePlugin.log(IStatus.ERROR, Messages.JSFLibraryRegistry_ErrorSaving);
-		}
-		return saved;
-	}
-
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/ArchiveFile.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/ArchiveFile.java
deleted file mode 100644
index f09420f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/ArchiveFile.java
+++ /dev/null
@@ -1,222 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.internal.jsflibraryregistry;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Archive File</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile#isRelativeToWorkspace <em>Relative To Workspace</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile#getSourceLocation <em>Source Location</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile#getRelativeDestLocation <em>Relative Dest Location</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile#getJSFLibrary <em>JSF Library</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryPackage#getArchiveFile()
- * @model
- * @generated
- * @deprecated
- */
-public interface ArchiveFile extends EObject{
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005 Oracle Corporation"; //$NON-NLS-1$
-
-	/**
-	 * Returns the value of the '<em><b>Source Location</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Source Location</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Source Location</em>' attribute.
-	 * @see #setSourceLocation(String)
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryPackage#getArchiveFile_SourceLocation()
-	 * @model required="true"
-	 * @generated
-	 */
-	String getSourceLocation();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile#getSourceLocation <em>Source Location</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * If the value passed is found to be relative to the workspace, a
-	 * workspace-relative location is stored; to prevent this behaviour, call
-	 * isRelativeToWorkspace(false) before calling this method.
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Source Location</em>' attribute.
-	 * @see #getSourceLocation()
-	 * @generated
-	 */
-	void setSourceLocation(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Relative To Workspace</b></em>' attribute.
-	 * The default value is <code>"true"</code>.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Relative To Workspace</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Relative To Workspace</em>' attribute.
-	 * @see #setRelativeToWorkspace(boolean)
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryPackage#getArchiveFile_RelativeToWorkspace()
-	 * @model default="true" required="true"
-	 * @generated
-	 */
-	boolean isRelativeToWorkspace();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile#isRelativeToWorkspace <em>Relative To Workspace</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Relative To Workspace</em>' attribute.
-	 * @see #isRelativeToWorkspace()
-	 * @generated
-	 */
-	void setRelativeToWorkspace(boolean value);
-
-	/**
-	 * Returns the value of the '<em><b>Relative Dest Location</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Relative Dest Location</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Relative Dest Location</em>' attribute.
-	 * @see #setRelativeDestLocation(String)
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryPackage#getArchiveFile_RelativeDestLocation()
-	 * @model required="true"
-	 * @generated
-	 */
-	String getRelativeDestLocation();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile#getRelativeDestLocation <em>Relative Dest Location</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Relative Dest Location</em>' attribute.
-	 * @see #getRelativeDestLocation()
-	 * @generated
-	 */
-	void setRelativeDestLocation(String value);
-
-	/**
-	 * Returns the value of the '<em><b>JSF Library</b></em>' container reference.
-	 * It is bidirectional and its opposite is '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary#getArchiveFiles <em>Archive Files</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>JSF Library</em>' container reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>JSF Library</em>' container reference.
-	 * @see #setJSFLibrary(JSFLibrary)
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryPackage#getArchiveFile_JSFLibrary()
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary#getArchiveFiles
-	 * @model opposite="ArchiveFiles" required="true"
-	 * @generated
-	 */
-	JSFLibrary getJSFLibrary();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile#getJSFLibrary <em>JSF Library</em>}' container reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>JSF Library</em>' container reference.
-	 * @see #getJSFLibrary()
-	 * @generated
-	 */
-	void setJSFLibrary(JSFLibrary value);
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Path</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * @return the path
-	 * <!-- end-user-doc -->
-	 * @model kind="operation" required="true"
-	 * @generated
-	 */
-	String getPath();
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @return the name 
-	 * <!-- end-user-doc -->
-	 * @model kind="operation" required="true"
-	 * @generated
-	 */
-	String getName();
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @return true if exists 
-	 * <!-- end-user-doc -->
-	 * @model required="true"
-	 * @generated
-	 */
-	boolean exists();
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @param object 
-	 * @return true if equal 
-	 * <!-- end-user-doc -->
-	 * @model required="true" objectRequired="true"
-	 * @generated
-	 */
-	boolean equals(Object object);
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @return the hashCode 
-	 * <!-- end-user-doc -->
-	 * @model required="true"
-	 * @generated
-	 */
-	int hashCode();
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @param baseDestLocation 
-	 * @return true if copied succeeds 
-	 * <!-- end-user-doc -->
-	 * @model required="true" baseDestLocationRequired="true"
-	 * @generated
-	 */
-	boolean copyTo(String baseDestLocation);
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @return the resolved source location 
-	 * <!-- end-user-doc -->
-	 * @model kind="operation" required="true"
-	 * @generated
-	 */
-	String getResolvedSourceLocation();
-
-} // ArchiveFile
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/JSFLibrary.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/JSFLibrary.java
deleted file mode 100644
index bb6a7d1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/JSFLibrary.java
+++ /dev/null
@@ -1,237 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.internal.jsflibraryregistry;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>JSF Library</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary#getID <em>ID</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary#getName <em>Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary#getJSFVersion <em>JSF Version</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary#isDeployed <em>Deployed</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary#isImplementation <em>Implementation</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary#getArchiveFiles <em>Archive Files</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryPackage#getJSFLibrary()
- * @model
- * @generated
- * @deprecated
- */
-public interface JSFLibrary extends EObject{
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005 Oracle Corporation"; //$NON-NLS-1$
-
-	/**
-	 * Returns the value of the '<em><b>ID</b></em>' attribute.
-	 * The default value is <code>""</code>.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>ID</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>ID</em>' attribute.
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryPackage#getJSFLibrary_ID()
-	 * @model default="" transient="true" changeable="false" derived="true"
-	 * @generated
-	 */
-	String getID();
-
-	/**
-	 * Returns the value of the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Name</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Name</em>' attribute.
-	 * @see #setName(String)
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryPackage#getJSFLibrary_Name()
-	 * @model required="true"
-	 * @generated
-	 */
-	String getName();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary#getName <em>Name</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Name</em>' attribute.
-	 * @see #getName()
-	 * @generated
-	 */
-	void setName(String value);
-
-	/**
-	 * Returns the value of the '<em><b>JSF Version</b></em>' attribute.
-	 * The default value is <code>"UNKNOWN"</code>.
-	 * The literals are from the enumeration {@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFVersion}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>JSF Version</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>JSF Version</em>' attribute.
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFVersion
-	 * @see #setJSFVersion(JSFVersion)
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryPackage#getJSFLibrary_JSFVersion()
-	 * @model default="UNKNOWN" required="true"
-	 * @generated
-	 */
-	JSFVersion getJSFVersion();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary#getJSFVersion <em>JSF Version</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>JSF Version</em>' attribute.
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFVersion
-	 * @see #getJSFVersion()
-	 * @generated
-	 */
-	void setJSFVersion(JSFVersion value);
-
-	/**
-	 * Returns the value of the '<em><b>Deployed</b></em>' attribute.
-	 * The default value is <code>"true"</code>.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Deployed</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Deployed</em>' attribute.
-	 * @see #setDeployed(boolean)
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryPackage#getJSFLibrary_Deployed()
-	 * @model default="true" required="true"
-	 * @generated
-	 */
-	boolean isDeployed();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary#isDeployed <em>Deployed</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Deployed</em>' attribute.
-	 * @see #isDeployed()
-	 * @generated
-	 */
-	void setDeployed(boolean value);
-
-	/**
-	 * Returns the value of the '<em><b>Implementation</b></em>' attribute.
-	 * The default value is <code>"false"</code>.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Implementation</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Implementation</em>' attribute.
-	 * @see #setImplementation(boolean)
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryPackage#getJSFLibrary_Implementation()
-	 * @model default="false" required="true"
-	 * @generated
-	 */
-	boolean isImplementation();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary#isImplementation <em>Implementation</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Implementation</em>' attribute.
-	 * @see #isImplementation()
-	 * @generated
-	 */
-	void setImplementation(boolean value);
-
-	/**
-	 * Returns the value of the '<em><b>Archive Files</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile}.
-	 * It is bidirectional and its opposite is '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile#getJSFLibrary <em>JSF Library</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Archive Files</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Archive Files</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryPackage#getJSFLibrary_ArchiveFiles()
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile#getJSFLibrary
-	 * @model type="org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile" opposite="JSFLibrary" containment="true"
-	 * @generated
-	 */
-	EList getArchiveFiles();
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @param fullPath 
-	 * @return true if fullPath contains archive file 
-	 * <!-- end-user-doc -->
-	 * @model required="true" fullPathRequired="true"
-	 * @generated
-	 */
-	boolean containsArchiveFile(String fullPath);
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @return the working copy 
-	 * <!-- end-user-doc -->
-	 * @model kind="operation" required="true"
-	 * @generated
-	 */
-	JSFLibrary getWorkingCopy();
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @param otherLibrary 
-	 * <!-- end-user-doc -->
-	 * @model otherLibraryRequired="true"
-	 * @generated
-	 */
-	void updateValues(JSFLibrary otherLibrary);
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @param baseDestLocation 
-	 * @return true if copy succeeds 
-	 * <!-- end-user-doc -->
-	 * @model required="true" baseDestLocationRequired="true"
-	 * @generated
-	 */
-	boolean copyTo(String baseDestLocation);
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @return label
-	 * <!-- end-user-doc -->
-	 * @model kind="operation" required="true"
-	 * @generated
-	 */
-	String getLabel();
-
-} // JSFLibrary
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/JSFLibraryRegistry.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/JSFLibraryRegistry.java
deleted file mode 100644
index 1b6b25f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/JSFLibraryRegistry.java
+++ /dev/null
@@ -1,197 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.internal.jsflibraryregistry;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.jst.jsf.core.internal.Messages;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>JSF Library Registry</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistry#getDefaultImplementationID <em>Default Implementation ID</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistry#getJSFLibraries <em>JSF Libraries</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistry#getPluginProvidedJSFLibraries <em>Plugin Provided JSF Libraries</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryPackage#getJSFLibraryRegistry()
- * @model
- * @generated
- * @deprecated
- */
-public interface JSFLibraryRegistry extends EObject{
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005 Oracle Corporation"; //$NON-NLS-1$
-
-	/**
-	 * Returns the value of the '<em><b>Default Implementation ID</b></em>' attribute.
-	 * The default value is <code>""</code>.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Default Implementation ID</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Default Implementation ID</em>' attribute.
-	 * @see #setDefaultImplementationID(String)
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryPackage#getJSFLibraryRegistry_DefaultImplementationID()
-	 * @model default=""
-	 * @generated
-	 */
-	String getDefaultImplementationID();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistry#getDefaultImplementationID <em>Default Implementation ID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Default Implementation ID</em>' attribute.
-	 * @see #getDefaultImplementationID()
-	 * @generated
-	 */
-	void setDefaultImplementationID(String value);
-
-	/**
-	 *The default implementation message string
-	 */
-	public static final String DEFAULT_IMPL_LABEL = Messages.JSFLibraryRegistry_DEFAULT_IMPL_LABEL;
-
-	/**
-	 * Returns the value of the '<em><b>JSF Libraries</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>JSF Libraries</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>JSF Libraries</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryPackage#getJSFLibraryRegistry_JSFLibraries()
-	 * @model type="org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary" containment="true"
-	 * @generated
-	 */
-	EList getJSFLibraries();
-
-	/**
-	 * Returns the value of the '<em><b>Plugin Provided JSF Libraries</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.PluginProvidedJSFLibrary}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Plugin Provided JSF Libraries</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Plugin Provided JSF Libraries</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryPackage#getJSFLibraryRegistry_PluginProvidedJSFLibraries()
-	 * @model type="org.eclipse.jst.jsf.core.internal.jsflibraryregistry.PluginProvidedJSFLibrary" containment="true" transient="true"
-	 * @generated
-	 */
-	EList getPluginProvidedJSFLibraries();
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Default Implementation</em>' reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * @return the default implementation 
-	 * <!-- end-user-doc -->
-	 * @model kind="operation" required="true"
-	 * @generated
-	 */
-	JSFLibrary getDefaultImplementation();
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @param implementation 
-	 * <!-- end-user-doc -->
-	 * @model implementationRequired="true"
-	 * @generated
-	 */
-	void setDefaultImplementation(JSFLibrary implementation);
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @param ID 
-	 * @return the jsf library 
-	 * <!-- end-user-doc -->
-	 * @model required="true" IDRequired="true"
-	 * @generated
-	 */
-	JSFLibrary getJSFLibraryByID(String ID);
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @param name 
-	 * @return the jsf libraries matching name 
-	 * <!-- end-user-doc -->
-	 * @model required="true" many="false" nameRequired="true"
-	 * @generated
-	 */
-	EList getJSFLibrariesByName(String name);
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @return the implementation JSF libraries 
-	 * <!-- end-user-doc -->
-	 * @model kind="operation" required="true" many="false"
-	 * @generated
-	 */
-	EList getImplJSFLibraries();
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @return the non-implementation JSF libraries 
-	 * <!-- end-user-doc -->
-	 * @model kind="operation" required="true" many="false"
-	 * @generated
-	 */
-	EList getNonImplJSFLibraries();
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @return all the JSF libraries 
-	 * <!-- end-user-doc -->
-	 * @model kind="operation" required="true" many="false"
-	 * @generated
-	 */
-	EList getAllJSFLibraries();
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @param library 
-	 * @return true if add succeeds 
-	 * <!-- end-user-doc -->
-	 * @model required="true" libraryRequired="true"
-	 * @generated
-	 */
-	boolean addJSFLibrary(JSFLibrary library);
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @param library 
-	 * @return true if remove succeeds 
-	 * <!-- end-user-doc -->
-	 * @model required="true" libraryRequired="true"
-	 * @generated
-	 */
-	boolean removeJSFLibrary(JSFLibrary library);
-
-} // JSFLibraryRegistry
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/JSFLibraryRegistryFactory.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/JSFLibraryRegistryFactory.java
deleted file mode 100644
index 1a988e7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/JSFLibraryRegistryFactory.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.internal.jsflibraryregistry;
-
-import org.eclipse.emf.ecore.EFactory;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Factory</b> for the model.
- * It provides a create method for each non-abstract class of the model.
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryPackage
- * @generated
- * @deprecated
- */
-public interface JSFLibraryRegistryFactory extends EFactory{
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005 Oracle Corporation"; //$NON-NLS-1$
-
-	/**
-	 * The singleton instance of the factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	JSFLibraryRegistryFactory eINSTANCE = org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.JSFLibraryRegistryFactoryImpl.init();
-
-	/**
-	 * Returns a new object of class '<em>JSF Library Registry</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>JSF Library Registry</em>'.
-	 * @generated
-	 */
-	JSFLibraryRegistry createJSFLibraryRegistry();
-
-	/**
-	 * Returns a new object of class '<em>JSF Library</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>JSF Library</em>'.
-	 * @generated
-	 */
-	JSFLibrary createJSFLibrary();
-
-	/**
-	 * Returns a new object of class '<em>Archive File</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Archive File</em>'.
-	 * @generated
-	 */
-	ArchiveFile createArchiveFile();
-
-	/**
-	 * Returns a new object of class '<em>Plugin Provided JSF Library</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Plugin Provided JSF Library</em>'.
-	 * @generated
-	 */
-	PluginProvidedJSFLibrary createPluginProvidedJSFLibrary();
-
-	/**
-	 * Returns the package supported by this factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the package supported by this factory.
-	 * @generated
-	 */
-	JSFLibraryRegistryPackage getJSFLibraryRegistryPackage();
-
-} //JSFLibraryRegistryFactory
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/JSFLibraryRegistryPackage.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/JSFLibraryRegistryPackage.java
deleted file mode 100644
index 4acf3f8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/JSFLibraryRegistryPackage.java
+++ /dev/null
@@ -1,781 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.internal.jsflibraryregistry;
-
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EEnum;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.EReference;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Package</b> for the model.
- * It contains accessors for the meta objects to represent
- * <ul>
- *   <li>each class,</li>
- *   <li>each feature of each class,</li>
- *   <li>each enum,</li>
- *   <li>and each data type</li>
- * </ul>
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryFactory
- * @model kind="package"
- * @generated
- * @deprecated
- */
-@SuppressWarnings("hiding")
-public interface JSFLibraryRegistryPackage extends EPackage{
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005 Oracle Corporation"; //$NON-NLS-1$
-
-	/**
-	 * The package name.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String eNAME = "jsflibraryregistry"; //$NON-NLS-1$
-
-	/**
-	 * The package namespace URI.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String eNS_URI = "http://www.eclipse.org/webtools/jsf/schema/jsflibraryregistry.xsd"; //$NON-NLS-1$
-
-	/**
-	 * The package namespace name.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String eNS_PREFIX = "jsflibreg"; //$NON-NLS-1$
-
-	/**
-	 * The singleton instance of the package.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	JSFLibraryRegistryPackage eINSTANCE = org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.JSFLibraryRegistryPackageImpl.init();
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.JSFLibraryRegistryImpl <em>JSF Library Registry</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.JSFLibraryRegistryImpl
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.JSFLibraryRegistryPackageImpl#getJSFLibraryRegistry()
-	 * @generated
-	 */
-	int JSF_LIBRARY_REGISTRY = 0;
-
-	/**
-	 * The feature id for the '<em><b>Default Implementation ID</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int JSF_LIBRARY_REGISTRY__DEFAULT_IMPLEMENTATION_ID = 0;
-
-	/**
-	 * The feature id for the '<em><b>JSF Libraries</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int JSF_LIBRARY_REGISTRY__JSF_LIBRARIES = 1;
-
-	/**
-	 * The feature id for the '<em><b>Plugin Provided JSF Libraries</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int JSF_LIBRARY_REGISTRY__PLUGIN_PROVIDED_JSF_LIBRARIES = 2;
-
-	/**
-	 * The number of structural features of the '<em>JSF Library Registry</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int JSF_LIBRARY_REGISTRY_FEATURE_COUNT = 3;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.JSFLibraryImpl <em>JSF Library</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.JSFLibraryImpl
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.JSFLibraryRegistryPackageImpl#getJSFLibrary()
-	 * @generated
-	 */
-	int JSF_LIBRARY = 1;
-
-	/**
-	 * The feature id for the '<em><b>ID</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int JSF_LIBRARY__ID = 0;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int JSF_LIBRARY__NAME = 1;
-
-	/**
-	 * The feature id for the '<em><b>JSF Version</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int JSF_LIBRARY__JSF_VERSION = 2;
-
-	/**
-	 * The feature id for the '<em><b>Deployed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int JSF_LIBRARY__DEPLOYED = 3;
-
-	/**
-	 * The feature id for the '<em><b>Implementation</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int JSF_LIBRARY__IMPLEMENTATION = 4;
-
-	/**
-	 * The feature id for the '<em><b>Archive Files</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int JSF_LIBRARY__ARCHIVE_FILES = 5;
-
-	/**
-	 * The number of structural features of the '<em>JSF Library</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int JSF_LIBRARY_FEATURE_COUNT = 6;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.ArchiveFileImpl <em>Archive File</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.ArchiveFileImpl
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.JSFLibraryRegistryPackageImpl#getArchiveFile()
-	 * @generated
-	 */
-	int ARCHIVE_FILE = 3;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.PluginProvidedJSFLibraryImpl <em>Plugin Provided JSF Library</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.PluginProvidedJSFLibraryImpl
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.JSFLibraryRegistryPackageImpl#getPluginProvidedJSFLibrary()
-	 * @generated
-	 */
-	int PLUGIN_PROVIDED_JSF_LIBRARY = 2;
-
-	/**
-	 * The feature id for the '<em><b>ID</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PLUGIN_PROVIDED_JSF_LIBRARY__ID = JSF_LIBRARY__ID;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PLUGIN_PROVIDED_JSF_LIBRARY__NAME = JSF_LIBRARY__NAME;
-
-	/**
-	 * The feature id for the '<em><b>JSF Version</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PLUGIN_PROVIDED_JSF_LIBRARY__JSF_VERSION = JSF_LIBRARY__JSF_VERSION;
-
-	/**
-	 * The feature id for the '<em><b>Deployed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PLUGIN_PROVIDED_JSF_LIBRARY__DEPLOYED = JSF_LIBRARY__DEPLOYED;
-
-	/**
-	 * The feature id for the '<em><b>Implementation</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PLUGIN_PROVIDED_JSF_LIBRARY__IMPLEMENTATION = JSF_LIBRARY__IMPLEMENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Archive Files</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PLUGIN_PROVIDED_JSF_LIBRARY__ARCHIVE_FILES = JSF_LIBRARY__ARCHIVE_FILES;
-
-	/**
-	 * The feature id for the '<em><b>Plugin ID</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PLUGIN_PROVIDED_JSF_LIBRARY__PLUGIN_ID = JSF_LIBRARY_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Label</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PLUGIN_PROVIDED_JSF_LIBRARY__LABEL = JSF_LIBRARY_FEATURE_COUNT + 1;
-
-	/**
-	 * The number of structural features of the '<em>Plugin Provided JSF Library</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PLUGIN_PROVIDED_JSF_LIBRARY_FEATURE_COUNT = JSF_LIBRARY_FEATURE_COUNT + 2;
-
-	/**
-	 * The feature id for the '<em><b>Relative To Workspace</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARCHIVE_FILE__RELATIVE_TO_WORKSPACE = 0;
-
-	/**
-	 * The feature id for the '<em><b>Source Location</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARCHIVE_FILE__SOURCE_LOCATION = 1;
-
-	/**
-	 * The feature id for the '<em><b>Relative Dest Location</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARCHIVE_FILE__RELATIVE_DEST_LOCATION = 2;
-
-	/**
-	 * The feature id for the '<em><b>JSF Library</b></em>' container reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARCHIVE_FILE__JSF_LIBRARY = 3;
-
-	/**
-	 * The number of structural features of the '<em>Archive File</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARCHIVE_FILE_FEATURE_COUNT = 4;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFVersion <em>JSF Version</em>}' enum.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFVersion
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.JSFLibraryRegistryPackageImpl#getJSFVersion()
-	 * @generated
-	 */
-	int JSF_VERSION = 4;
-
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistry <em>JSF Library Registry</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>JSF Library Registry</em>'.
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistry
-	 * @generated
-	 */
-	EClass getJSFLibraryRegistry();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistry#getDefaultImplementationID <em>Default Implementation ID</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Default Implementation ID</em>'.
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistry#getDefaultImplementationID()
-	 * @see #getJSFLibraryRegistry()
-	 * @generated
-	 */
-	EAttribute getJSFLibraryRegistry_DefaultImplementationID();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistry#getJSFLibraries <em>JSF Libraries</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>JSF Libraries</em>'.
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistry#getJSFLibraries()
-	 * @see #getJSFLibraryRegistry()
-	 * @generated
-	 */
-	EReference getJSFLibraryRegistry_JSFLibraries();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistry#getPluginProvidedJSFLibraries <em>Plugin Provided JSF Libraries</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Plugin Provided JSF Libraries</em>'.
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistry#getPluginProvidedJSFLibraries()
-	 * @see #getJSFLibraryRegistry()
-	 * @generated
-	 */
-	EReference getJSFLibraryRegistry_PluginProvidedJSFLibraries();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary <em>JSF Library</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>JSF Library</em>'.
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary
-	 * @generated
-	 */
-	EClass getJSFLibrary();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary#getID <em>ID</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>ID</em>'.
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary#getID()
-	 * @see #getJSFLibrary()
-	 * @generated
-	 */
-	EAttribute getJSFLibrary_ID();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary#getName <em>Name</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Name</em>'.
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary#getName()
-	 * @see #getJSFLibrary()
-	 * @generated
-	 */
-	EAttribute getJSFLibrary_Name();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary#getJSFVersion <em>JSF Version</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>JSF Version</em>'.
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary#getJSFVersion()
-	 * @see #getJSFLibrary()
-	 * @generated
-	 */
-	EAttribute getJSFLibrary_JSFVersion();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary#isDeployed <em>Deployed</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Deployed</em>'.
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary#isDeployed()
-	 * @see #getJSFLibrary()
-	 * @generated
-	 */
-	EAttribute getJSFLibrary_Deployed();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary#isImplementation <em>Implementation</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Implementation</em>'.
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary#isImplementation()
-	 * @see #getJSFLibrary()
-	 * @generated
-	 */
-	EAttribute getJSFLibrary_Implementation();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary#getArchiveFiles <em>Archive Files</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Archive Files</em>'.
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary#getArchiveFiles()
-	 * @see #getJSFLibrary()
-	 * @generated
-	 */
-	EReference getJSFLibrary_ArchiveFiles();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile <em>Archive File</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Archive File</em>'.
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile
-	 * @generated
-	 */
-	EClass getArchiveFile();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile#getSourceLocation <em>Source Location</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Source Location</em>'.
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile#getSourceLocation()
-	 * @see #getArchiveFile()
-	 * @generated
-	 */
-	EAttribute getArchiveFile_SourceLocation();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile#isRelativeToWorkspace <em>Relative To Workspace</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Relative To Workspace</em>'.
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile#isRelativeToWorkspace()
-	 * @see #getArchiveFile()
-	 * @generated
-	 */
-	EAttribute getArchiveFile_RelativeToWorkspace();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile#getRelativeDestLocation <em>Relative Dest Location</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Relative Dest Location</em>'.
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile#getRelativeDestLocation()
-	 * @see #getArchiveFile()
-	 * @generated
-	 */
-	EAttribute getArchiveFile_RelativeDestLocation();
-
-	/**
-	 * Returns the meta object for the container reference '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile#getJSFLibrary <em>JSF Library</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the container reference '<em>JSF Library</em>'.
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile#getJSFLibrary()
-	 * @see #getArchiveFile()
-	 * @generated
-	 */
-	EReference getArchiveFile_JSFLibrary();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.PluginProvidedJSFLibrary <em>Plugin Provided JSF Library</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Plugin Provided JSF Library</em>'.
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.PluginProvidedJSFLibrary
-	 * @generated
-	 */
-	EClass getPluginProvidedJSFLibrary();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.PluginProvidedJSFLibrary#getPluginID <em>Plugin ID</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Plugin ID</em>'.
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.PluginProvidedJSFLibrary#getPluginID()
-	 * @see #getPluginProvidedJSFLibrary()
-	 * @generated
-	 */
-	EAttribute getPluginProvidedJSFLibrary_PluginID();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.PluginProvidedJSFLibrary#getLabel <em>Label</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Label</em>'.
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.PluginProvidedJSFLibrary#getLabel()
-	 * @see #getPluginProvidedJSFLibrary()
-	 * @generated
-	 */
-	EAttribute getPluginProvidedJSFLibrary_Label();
-
-	/**
-	 * Returns the meta object for enum '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFVersion <em>JSF Version</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for enum '<em>JSF Version</em>'.
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFVersion
-	 * @generated
-	 */
-	EEnum getJSFVersion();
-
-	/**
-	 * Returns the factory that creates the instances of the model.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the factory that creates the instances of the model.
-	 * @generated
-	 */
-	JSFLibraryRegistryFactory getJSFLibraryRegistryFactory();
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * Defines literals for the meta objects that represent
-	 * <ul>
-	 *   <li>each class,</li>
-	 *   <li>each feature of each class,</li>
-	 *   <li>each enum,</li>
-	 *   <li>and each data type</li>
-	 * </ul>
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	interface Literals {
-		/**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.JSFLibraryRegistryImpl <em>JSF Library Registry</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.JSFLibraryRegistryImpl
-		 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.JSFLibraryRegistryPackageImpl#getJSFLibraryRegistry()
-		 * @generated
-		 */
-//        @SuppressWarnings("hiding")
-		EClass JSF_LIBRARY_REGISTRY = eINSTANCE.getJSFLibraryRegistry();
-
-		/**
-		 * The meta object literal for the '<em><b>Default Implementation ID</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-//        @SuppressWarnings("hiding")
-        EAttribute JSF_LIBRARY_REGISTRY__DEFAULT_IMPLEMENTATION_ID = eINSTANCE.getJSFLibraryRegistry_DefaultImplementationID();
-
-		/**
-		 * The meta object literal for the '<em><b>JSF Libraries</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-//        @SuppressWarnings("hiding")
-		EReference JSF_LIBRARY_REGISTRY__JSF_LIBRARIES = eINSTANCE.getJSFLibraryRegistry_JSFLibraries();
-
-		/**
-		 * The meta object literal for the '<em><b>Plugin Provided JSF Libraries</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-//        @SuppressWarnings("hiding")
-		EReference JSF_LIBRARY_REGISTRY__PLUGIN_PROVIDED_JSF_LIBRARIES = eINSTANCE.getJSFLibraryRegistry_PluginProvidedJSFLibraries();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.JSFLibraryImpl <em>JSF Library</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.JSFLibraryImpl
-		 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.JSFLibraryRegistryPackageImpl#getJSFLibrary()
-		 * @generated
-		 */
-//        @SuppressWarnings("hiding")
-		EClass JSF_LIBRARY = eINSTANCE.getJSFLibrary();
-
-		/**
-		 * The meta object literal for the '<em><b>ID</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-//        @SuppressWarnings("hiding")
-		EAttribute JSF_LIBRARY__ID = eINSTANCE.getJSFLibrary_ID();
-
-		/**
-		 * The meta object literal for the '<em><b>Name</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-//        @SuppressWarnings("hiding")
-		EAttribute JSF_LIBRARY__NAME = eINSTANCE.getJSFLibrary_Name();
-
-		/**
-		 * The meta object literal for the '<em><b>JSF Version</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-//        @SuppressWarnings("hiding")
-		EAttribute JSF_LIBRARY__JSF_VERSION = eINSTANCE.getJSFLibrary_JSFVersion();
-
-		/**
-		 * The meta object literal for the '<em><b>Deployed</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-//        @SuppressWarnings("hiding")
-		EAttribute JSF_LIBRARY__DEPLOYED = eINSTANCE.getJSFLibrary_Deployed();
-
-		/**
-		 * The meta object literal for the '<em><b>Implementation</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-//        @SuppressWarnings("hiding")
-		EAttribute JSF_LIBRARY__IMPLEMENTATION = eINSTANCE.getJSFLibrary_Implementation();
-
-		/**
-		 * The meta object literal for the '<em><b>Archive Files</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-//        @SuppressWarnings("hiding")
-		EReference JSF_LIBRARY__ARCHIVE_FILES = eINSTANCE.getJSFLibrary_ArchiveFiles();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.ArchiveFileImpl <em>Archive File</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.ArchiveFileImpl
-		 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.JSFLibraryRegistryPackageImpl#getArchiveFile()
-		 * @generated
-		 */
-//        @SuppressWarnings("hiding")
-		EClass ARCHIVE_FILE = eINSTANCE.getArchiveFile();
-
-		/**
-		 * The meta object literal for the '<em><b>Relative To Workspace</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-//        @SuppressWarnings("hiding")
-		EAttribute ARCHIVE_FILE__RELATIVE_TO_WORKSPACE = eINSTANCE.getArchiveFile_RelativeToWorkspace();
-
-		/**
-		 * The meta object literal for the '<em><b>Source Location</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-//        @SuppressWarnings("hiding")
-		EAttribute ARCHIVE_FILE__SOURCE_LOCATION = eINSTANCE.getArchiveFile_SourceLocation();
-
-		/**
-		 * The meta object literal for the '<em><b>Relative Dest Location</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-//        @SuppressWarnings("hiding")
-		EAttribute ARCHIVE_FILE__RELATIVE_DEST_LOCATION = eINSTANCE.getArchiveFile_RelativeDestLocation();
-
-		/**
-		 * The meta object literal for the '<em><b>JSF Library</b></em>' container reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-//        @SuppressWarnings("hiding")
-		EReference ARCHIVE_FILE__JSF_LIBRARY = eINSTANCE.getArchiveFile_JSFLibrary();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.PluginProvidedJSFLibraryImpl <em>Plugin Provided JSF Library</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.PluginProvidedJSFLibraryImpl
-		 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.JSFLibraryRegistryPackageImpl#getPluginProvidedJSFLibrary()
-		 * @generated
-		 */
-//        @SuppressWarnings("hiding")
-		EClass PLUGIN_PROVIDED_JSF_LIBRARY = eINSTANCE.getPluginProvidedJSFLibrary();
-
-		/**
-		 * The meta object literal for the '<em><b>Plugin ID</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-//        @SuppressWarnings("hiding")
-		EAttribute PLUGIN_PROVIDED_JSF_LIBRARY__PLUGIN_ID = eINSTANCE.getPluginProvidedJSFLibrary_PluginID();
-
-		/**
-		 * The meta object literal for the '<em><b>Label</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-//		@SuppressWarnings("hiding")
-		EAttribute PLUGIN_PROVIDED_JSF_LIBRARY__LABEL = eINSTANCE.getPluginProvidedJSFLibrary_Label();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFVersion <em>JSF Version</em>}' enum.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFVersion
-		 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.JSFLibraryRegistryPackageImpl#getJSFVersion()
-		 * @generated
-		 */
-//        @SuppressWarnings("hiding")
-		EEnum JSF_VERSION = eINSTANCE.getJSFVersion();
-
-	}
-
-} //JSFLibraryRegistryPackage
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/JSFVersion.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/JSFVersion.java
deleted file mode 100644
index 6954088..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/JSFVersion.java
+++ /dev/null
@@ -1,214 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.internal.jsflibraryregistry;
-
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.emf.common.util.AbstractEnumerator;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the literals of the enumeration '<em><b>JSF Version</b></em>',
- * and utility methods for working with them.
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryPackage#getJSFVersion()
- * @model
- * @generated
- * @deprecated
- */
-public final class JSFVersion extends AbstractEnumerator {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005 Oracle Corporation"; //$NON-NLS-1$
-
-	/**
-	 * The '<em><b>UNKNOWN</b></em>' literal value.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of '<em><b>UNKNOWN</b></em>' literal object isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @see #UNKNOWN_LITERAL
-	 * @model
-	 * @generated
-	 * @ordered
-	 */
-	public static final int UNKNOWN = -1;
-
-	/**
-	 * The '<em><b>V1 1</b></em>' literal value.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of '<em><b>V1 1</b></em>' literal object isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @see #V1_1_LITERAL
-	 * @model name="v1_1"
-	 * @generated
-	 * @ordered
-	 */
-	public static final int V1_1 = 1;
-
-	/**
-	 * The '<em><b>V1 2</b></em>' literal value.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of '<em><b>V1 2</b></em>' literal object isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @see #V1_2_LITERAL
-	 * @model name="v1_2"
-	 * @generated
-	 * @ordered
-	 */
-	public static final int V1_2 = 2;
-
-	/**
-	 * The '<em><b>UNKNOWN</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #UNKNOWN
-	 * @generated
-	 * @ordered
-	 */
-	public static final JSFVersion UNKNOWN_LITERAL = new JSFVersion(UNKNOWN, "UNKNOWN", "UNKNOWN"); //$NON-NLS-1$ //$NON-NLS-2$
-
-	/**
-	 * The '<em><b>V1 1</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #V1_1
-	 * @generated
-	 * @ordered
-	 */
-	public static final JSFVersion V1_1_LITERAL = new JSFVersion(V1_1, "v1_1", "v1_1"); //$NON-NLS-1$ //$NON-NLS-2$
-
-	/**
-	 * The '<em><b>V1 2</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #V1_2
-	 * @generated
-	 * @ordered
-	 */
-	public static final JSFVersion V1_2_LITERAL = new JSFVersion(V1_2, "v1_2", "v1_2"); //$NON-NLS-1$ //$NON-NLS-2$
-
-	/**
-	 * An array of all the '<em><b>JSF Version</b></em>' enumerators.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final JSFVersion[] VALUES_ARRAY =
-		new JSFVersion[] {
-			UNKNOWN_LITERAL,
-			V1_1_LITERAL,
-			V1_2_LITERAL,
-		};
-
-	/**
-	 * A public read-only list of all the '<em><b>JSF Version</b></em>' enumerators.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final List VALUES = Collections.unmodifiableList(Arrays.asList(VALUES_ARRAY));
-
-	/**
-	 * Returns the '<em><b>JSF Version</b></em>' literal with the specified literal value.
-	 * <!-- begin-user-doc -->
-	 * @param literal value
-	 * @return the JSF version for name value 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static JSFVersion get(String literal) {
-		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
-			JSFVersion result = VALUES_ARRAY[i];
-			if (result.toString().equals(literal)) {
-				return result;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Returns the '<em><b>JSF Version</b></em>' literal with the specified name.
-	 * <!-- begin-user-doc -->
-	 * @param name 
-	 * @return JSFVersion
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static JSFVersion getByName(String name) {
-		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
-			JSFVersion result = VALUES_ARRAY[i];
-			if (result.getName().equals(name)) {
-				return result;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Returns the '<em><b>JSF Version</b></em>' literal with the specified integer value.
-	 * <!-- begin-user-doc -->
-	 * @param value 
-	 * @return the JSFVersion for the integer 'value' 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static JSFVersion get(int value) {
-		switch (value) {
-			case UNKNOWN: return UNKNOWN_LITERAL;
-			case V1_1: return V1_1_LITERAL;
-			case V1_2: return V1_2_LITERAL;
-		}
-		return null;
-	}
-
-	/**
-	 * Only this class can construct instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private JSFVersion(int value, String name, String literal) {
-		super(value, name, literal);
-	}
-
-	/**
-	 * Returns the '<em><b>JSF Version</b></em>' literal with the specified
-	 * name like the get(String) method does, but will return UNKNOWN instead
-	 * of null if the name is not recognized.
-	 * <!-- begin-user-doc -->
-	 * @param name 
-	 * @return the JSFVersion
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public static JSFVersion getJSFVersion(String name) {
-		JSFVersion version = get(name);
-		if (version == null) {
-			version = UNKNOWN_LITERAL;
-		}
-		return version;
-	}
-
-} //JSFVersion
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/PluginProvidedJSFLibrary.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/PluginProvidedJSFLibrary.java
deleted file mode 100644
index 9ec7a53..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/PluginProvidedJSFLibrary.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.internal.jsflibraryregistry;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Plugin Provided JSF Library</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.PluginProvidedJSFLibrary#getPluginID <em>Plugin ID</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.PluginProvidedJSFLibrary#getLabel <em>Label</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryPackage#getPluginProvidedJSFLibrary()
- * @model
- * @generated
- * @deprecated
- */
-public interface PluginProvidedJSFLibrary extends JSFLibrary{
-	/**
-	 * Separator between plugin id and JSF Library name
-	 */
-	public static final String ID_SEPARATOR = "$$"; //$NON-NLS-1$
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005 Oracle Corporation"; //$NON-NLS-1$
-
-	/**
-	 * Returns the value of the '<em><b>Plugin ID</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Plugin ID</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Plugin ID</em>' attribute.
-	 * @see #setPluginID(String)
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryPackage#getPluginProvidedJSFLibrary_PluginID()
-	 * @model required="true"
-	 * @generated
-	 */
-	String getPluginID();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.PluginProvidedJSFLibrary#getPluginID <em>Plugin ID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Plugin ID</em>' attribute.
-	 * @see #getPluginID()
-	 * @generated
-	 */
-	void setPluginID(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Label</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Label</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Label</em>' attribute.
-	 * @see #setLabel(String)
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryPackage#getPluginProvidedJSFLibrary_Label()
-	 * @model required="true"
-	 * @generated
-	 */
-	String getLabel();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.PluginProvidedJSFLibrary#getLabel <em>Label</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Label</em>' attribute.
-	 * @see #getLabel()
-	 * @generated
-	 */
-	void setLabel(String value);
-
-} // PluginProvidedJSFLibrary
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/adapter/MaintainDefaultImplementationAdapter.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/adapter/MaintainDefaultImplementationAdapter.java
deleted file mode 100644
index eb3ff11..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/adapter/MaintainDefaultImplementationAdapter.java
+++ /dev/null
@@ -1,148 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.internal.jsflibraryregistry.adapter;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.impl.AdapterImpl;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.jst.jsf.core.internal.jsflibraryconfig.JSFLibraryRegistryUtil;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistry;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryPackage;
-
-/**
- * EMF adapter that attempts to always maintain a default implementation
- * JSFLibrary upon addition and removal of JSFLibrary instances and upon
- * changing of a JSFLibrary instance's implementation property.
- * 
- * @author Ian Trimble - Oracle
- * @deprecated
- */
-public class MaintainDefaultImplementationAdapter extends AdapterImpl {
-
-	private static MaintainDefaultImplementationAdapter INSTANCE =
-		new MaintainDefaultImplementationAdapter();
-
-	/**
-	 * Gets the single instance of this adapter.
-	 * 
-	 * @return The single instance of this adapter.
-	 */
-	public static MaintainDefaultImplementationAdapter getInstance() {
-		return INSTANCE;
-	}
-
-	/**
-	 * Called to notify this adapter that a change has occured.
-	 * 
-	 * @param notification EMF Notification instance
-	 */
-	public void notifyChanged(Notification notification) {
-		Object objNotifier = notification.getNotifier();
-		if (objNotifier instanceof JSFLibraryRegistry) {
-			int eventType = notification.getEventType();
-			switch (eventType) {
-				case Notification.ADD:
-					Object objNewValue = notification.getNewValue();
-					if (objNewValue instanceof JSFLibrary) {
-						libraryAdded((JSFLibrary)objNewValue);
-					}
-					break;
-				case Notification.REMOVE:
-					Object objOldValue = notification.getOldValue();
-					if (objOldValue instanceof JSFLibrary) {
-						libraryRemoved((JSFLibrary)objOldValue);
-					}
-					break;
-			}
-		} else if (objNotifier instanceof JSFLibrary) {
-			if (notification.getFeatureID(JSFLibrary.class) == JSFLibraryRegistryPackage.JSF_LIBRARY__IMPLEMENTATION) {
-				implementationFlagSet((JSFLibrary)objNotifier);
-			}
-		}
-	}
-
-	/**
-	 * Checks if the library added is an implementation and, if so, makes it
-	 * the default implementation if it is the only implementation.
-	 * 
-	 * @param library JSFLibrary instance
-	 */
-	protected void libraryAdded(JSFLibrary library) {
-		if (library != null && library.isImplementation()) {
-			JSFLibraryRegistry jsfLibReg = JSFLibraryRegistryUtil.getInstance().getJSFLibraryRegistry();
-			EList impls = jsfLibReg.getImplJSFLibraries();
-			if (impls.size() == 1) {
-				jsfLibReg.setDefaultImplementation(library);
-			}
-		}
-	}
-
-	/**
-	 * Checks if the library removed is the default implementation and, if so,
-	 * makes the first remaining implementation the new default or nulls out
-	 * the default implementation if no other implementation remains. 
-	 * 
-	 * @param library JSFLibrary instance
-	 */
-	protected void libraryRemoved(JSFLibrary library) {
-		if (library != null && library.isImplementation()) {
-			JSFLibraryRegistry jsfLibReg = JSFLibraryRegistryUtil.getInstance().getJSFLibraryRegistry();
-			JSFLibrary defaultImpl = jsfLibReg.getDefaultImplementation(); 
-			if (defaultImpl == null || library.getID().equals(defaultImpl.getID())) { 
-				setNewDefaultImplementation();
-			}
-		}
-	}
-
-	/**
-	 * Checks if the implementation flag of the JSFLibrary has been changed
-	 * such that it is now eligible to become the default implementation or
-	 * such that it is no longer eligible as the default implementation and
-	 * sets the default implementation appropriately. Note that the passed
-	 * JSFLibrary instance must have been added to the model before calling
-	 * this method for it to have any effect.
-	 * 
-	 * @param library JSFLibrary instance
-	 */
-	private void implementationFlagSet(JSFLibrary library) {
-		JSFLibraryRegistry jsfLibReg = JSFLibraryRegistryUtil.getInstance().getJSFLibraryRegistry();
-		if (jsfLibReg != null) {
-			JSFLibrary defaultImpl = jsfLibReg.getDefaultImplementation();
-			if (
-					library.isImplementation() &&
-					defaultImpl == null
-			) {
-				jsfLibReg.setDefaultImplementation(library);
-			} else if (
-					!library.isImplementation() &&
-					(defaultImpl != null && library.getID().equals(defaultImpl.getID())))
-			{
-				setNewDefaultImplementation();
-			}
-		}
-	}
-
-	/**
-	 * Sets the first available JSFLibrary marked as an implementation as the
-	 * default implementation or sets the default implementation to null if no
-	 * JSFLibrary is marked as an implementation.
-	 */
-	protected void setNewDefaultImplementation() {
-		JSFLibraryRegistry jsfLibReg = JSFLibraryRegistryUtil.getInstance().getJSFLibraryRegistry();
-		EList impls = jsfLibReg.getImplJSFLibraries();
-		if (impls.size() > 0) {
-			jsfLibReg.setDefaultImplementation((JSFLibrary)impls.get(0));
-		} else {
-			jsfLibReg.setDefaultImplementation(null);
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/impl/ArchiveFileImpl.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/impl/ArchiveFileImpl.java
deleted file mode 100644
index 9583787..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/impl/ArchiveFileImpl.java
+++ /dev/null
@@ -1,706 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.net.URL;
-
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.FileLocator;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.core.internal.Messages;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryPackage;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.PluginProvidedJSFLibrary;
-import org.eclipse.osgi.util.NLS;
-import org.osgi.framework.Bundle;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Archive File</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.ArchiveFileImpl#isRelativeToWorkspace <em>Relative To Workspace</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.ArchiveFileImpl#getSourceLocation <em>Source Location</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.ArchiveFileImpl#getRelativeDestLocation <em>Relative Dest Location</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.ArchiveFileImpl#getJSFLibrary <em>JSF Library</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- * @deprecated
- */
-public class ArchiveFileImpl extends EObjectImpl implements ArchiveFile {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005 Oracle Corporation"; //$NON-NLS-1$
-
-	/**
-	 * The default value of the '{@link #isRelativeToWorkspace() <em>Relative To Workspace</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isRelativeToWorkspace()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean RELATIVE_TO_WORKSPACE_EDEFAULT = true;
-
-	/**
-	 * The cached value of the '{@link #isRelativeToWorkspace() <em>Relative To Workspace</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isRelativeToWorkspace()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean relativeToWorkspace = RELATIVE_TO_WORKSPACE_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getSourceLocation() <em>Source Location</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getSourceLocation()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String SOURCE_LOCATION_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getSourceLocation() <em>Source Location</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getSourceLocation()
-	 * @generated
-	 * @ordered
-	 */
-	protected String sourceLocation = SOURCE_LOCATION_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getRelativeDestLocation() <em>Relative Dest Location</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRelativeDestLocation()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String RELATIVE_DEST_LOCATION_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getRelativeDestLocation() <em>Relative Dest Location</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRelativeDestLocation()
-	 * @generated
-	 * @ordered
-	 */
-	protected String relativeDestLocation = RELATIVE_DEST_LOCATION_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ArchiveFileImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @return the static eClass 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return JSFLibraryRegistryPackage.Literals.ARCHIVE_FILE;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @return the source location
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getSourceLocation() {
-		return sourceLocation;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * Enhanced to not only set the location but also to attempt to determine
-	 * if the location passed is relative to the current workspace. If so, only
-	 * the relative location is stored. If not, the full location as passed is
-	 * stored and the relativeToWorkspace property is set to false. To override
-	 * this behaviour and set the absolute location as passed regardless, call
-	 * setRelativeToWorkspace(false) BEFORE calling this method.
-	 * 
-	 * @param newSourceLocation 
-	 *  
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public void setSourceLocation(String newSourceLocation) {
-		String oldSourceLocation = sourceLocation;
-		if (relativeToWorkspace) {
-			IWorkspaceRoot workspaceRoot = getWorkspaceRoot();
-			if (workspaceRoot != null) {
-				IPath wsRootPath = workspaceRoot.getLocation();
-				IPath srcPath = new Path(newSourceLocation);
-				if (workspaceRoot.findMember(srcPath) != null) {
-					sourceLocation = newSourceLocation;
-				} else if (wsRootPath.isPrefixOf(srcPath)) {
-					int segmentsMatched = wsRootPath.matchingFirstSegments(srcPath);
-					srcPath = srcPath.removeFirstSegments(segmentsMatched).setDevice(null);
-					sourceLocation = srcPath.toOSString();
-				} else {
-					sourceLocation = newSourceLocation;
-					relativeToWorkspace = false;
-				}
-			}
-		} else {
-			sourceLocation = newSourceLocation;
-		}
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, JSFLibraryRegistryPackage.ARCHIVE_FILE__SOURCE_LOCATION, oldSourceLocation, sourceLocation));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @return true if file is relative to workspace 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isRelativeToWorkspace() {
-		return relativeToWorkspace;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * To override workspace-relative recognition behaviour, be sure to call
-	 * this method with a false value BEFORE calling setLocation(String).
-	 * @param newRelativeToWorkspace 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setRelativeToWorkspace(boolean newRelativeToWorkspace) {
-		boolean oldRelativeToWorkspace = relativeToWorkspace;
-		relativeToWorkspace = newRelativeToWorkspace;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, JSFLibraryRegistryPackage.ARCHIVE_FILE__RELATIVE_TO_WORKSPACE, oldRelativeToWorkspace, relativeToWorkspace));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @return  the relative destination location 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getRelativeDestLocation() {
-		return relativeDestLocation;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @param newRelativeDestLocation 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setRelativeDestLocation(String newRelativeDestLocation) {
-		String oldRelativeDestLocation = relativeDestLocation;
-		relativeDestLocation = newRelativeDestLocation;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, JSFLibraryRegistryPackage.ARCHIVE_FILE__RELATIVE_DEST_LOCATION, oldRelativeDestLocation, relativeDestLocation));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @return the jsf library instance 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public JSFLibrary getJSFLibrary() {
-		if (eContainerFeatureID != JSFLibraryRegistryPackage.ARCHIVE_FILE__JSF_LIBRARY) return null;
-		return (JSFLibrary)eContainer();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @param newJSFLibrary 
-	 * @param msgs 
-	 * @return NotificationChain
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetJSFLibrary(JSFLibrary newJSFLibrary, NotificationChain msgs) {
-		msgs = eBasicSetContainer((InternalEObject)newJSFLibrary, JSFLibraryRegistryPackage.ARCHIVE_FILE__JSF_LIBRARY, msgs);
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @param newJSFLibrary 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setJSFLibrary(JSFLibrary newJSFLibrary) {
-		if (newJSFLibrary != eInternalContainer() || (eContainerFeatureID != JSFLibraryRegistryPackage.ARCHIVE_FILE__JSF_LIBRARY && newJSFLibrary != null)) {
-			if (EcoreUtil.isAncestor(this, newJSFLibrary))
-				throw new IllegalArgumentException("Recursive containment not allowed for " + toString()); //$NON-NLS-1$
-			NotificationChain msgs = null;
-			if (eInternalContainer() != null)
-				msgs = eBasicRemoveFromContainer(msgs);
-			if (newJSFLibrary != null)
-				msgs = ((InternalEObject)newJSFLibrary).eInverseAdd(this, JSFLibraryRegistryPackage.JSF_LIBRARY__ARCHIVE_FILES, JSFLibrary.class, msgs);
-			msgs = basicSetJSFLibrary(newJSFLibrary, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, JSFLibraryRegistryPackage.ARCHIVE_FILE__JSF_LIBRARY, newJSFLibrary, newJSFLibrary));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @return the path 
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String getPath() {
-		String path = null;
-		String resolvedSourceLocation = getResolvedSourceLocation();
-		if (resolvedSourceLocation != null) {
-			int iPos = resolvedSourceLocation.lastIndexOf('/');
-			if (iPos < 0) {
-				iPos = resolvedSourceLocation.lastIndexOf('\\');
-			}
-			if (iPos < 1) {
-				path = ""; //$NON-NLS-1$
-			} else {
-				path = resolvedSourceLocation.substring(0, iPos);
-			}
-		}
-		return path;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @return the name 
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String getName() {
-		String name = null;
-		String resolvedSourceLocation = getResolvedSourceLocation();
-		if (resolvedSourceLocation != null) {
-			int iPos = resolvedSourceLocation.lastIndexOf('/');
-			if (iPos < 0) {
-				iPos = resolvedSourceLocation.lastIndexOf('\\');
-			}
-			if (iPos < 0 || iPos == resolvedSourceLocation.length() - 1) {
-				name = resolvedSourceLocation;
-			} else {
-				name = resolvedSourceLocation.substring(iPos + 1);
-			}
-		}
-		return name;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @return true if the archive file exists in the bundle 
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public boolean exists() {
-		boolean exists = false;
-		if (getJSFLibrary() instanceof PluginProvidedJSFLibrary) {
-			Bundle bundle = getBundle();
-			if (bundle != null) {
-				exists = bundle.getEntry(sourceLocation) != null;
-			}
-		} else {
-			String resolvedSourceLocation = getResolvedSourceLocation();
-			if (resolvedSourceLocation != null) {
-				exists = new File(resolvedSourceLocation).exists();
-			}
-		}
-		return exists;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @param object 
-	 * @return true if equal 
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public boolean equals(Object object) {
-		boolean equal = false;
-		if (object instanceof ArchiveFile) {
-			String resolvedSourceLocation = getResolvedSourceLocation();
-			String objResolvedSourceLocation = ((ArchiveFile)object).getResolvedSourceLocation();
-			if (resolvedSourceLocation == null && objResolvedSourceLocation == null) {
-				equal = true;
-			} else if (resolvedSourceLocation != null) {
-				equal = resolvedSourceLocation.equals(objResolvedSourceLocation);
-			}
-		}
-		return equal;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @return a the resolved source location hash or 0 if it is null 
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public int hashCode() {
-		return getResolvedSourceLocation() != null ? getResolvedSourceLocation().hashCode() : 0;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @param baseDestLocation 
-	 * @return true if the copy is successful
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public boolean copyTo(String baseDestLocation) {
-		boolean copied = false;
-		InputStream in = null;
-		OutputStream out = null;
-		IPath outPath = new Path(baseDestLocation);
-		if (relativeDestLocation != null) {
-			outPath = outPath.append(relativeDestLocation);
-		}
-		outPath = outPath.append(getName());
-		try {
-			if (!outPath.toFile().exists()) {
-				out = new FileOutputStream(outPath.toOSString());
-			} else {
-				return copied;
-			}
-			if (getJSFLibrary() instanceof PluginProvidedJSFLibrary) {
-				Bundle bundle = getBundle();
-				URL inURL = bundle.getEntry(sourceLocation);
-				if (inURL != null) {
-					in = inURL.openStream();
-				} else {
-					JSFCorePlugin.log(
-							IStatus.ERROR,
-							NLS.bind(Messages.ArchiveFileImpl_CannotLocatePluginRelativeFile,
-									sourceLocation));
-					return copied;
-				}
-			} else {
-				in = new FileInputStream(getResolvedSourceLocation());
-			}
-			byte[] buf = new byte[1024];
-			int len = 0;
-			while ((len = in.read(buf)) > 0) {
-				out.write(buf, 0, len);
-			}
-			copied = true;
-		} catch(FileNotFoundException fnfe) {
-			JSFCorePlugin.log(IStatus.ERROR, Messages.ArchiveFileImpl_CannotCopyFile, fnfe);
-		} catch(IOException ioe) {
-			JSFCorePlugin.log(IStatus.ERROR, Messages.ArchiveFileImpl_CannotCopyFile, ioe);
-		} finally {
-			try {
-				if (in != null) {
-					in.close();
-				}
-				if (out != null) {
-					out.close();
-				}
-			} catch(IOException ioe) {
-				JSFCorePlugin.log(IStatus.WARNING, Messages.ArchiveFileImpl_CannotCloseFile, ioe);
-			}
-		}
-		return copied;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @return the resolved source location 
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String getResolvedSourceLocation() {
-		String resolvedSourceLocation = null;
-		/**
-		 * The implementation to support PluginProvidedJSFLibrary assume the following.
-		 * 1. Plugin provided JSF library needs to be distributed as an expanded folder.
-		 * 2. JARs for plugin provided JSF library need to reside inside the folder mentioned in item 1 above.
-		 * 3. Each JAR needs to specify a relative path for the folder mentioned in item 1 above.
-		 * 
-		 * Fix for bug 144954.
-		 */
-		if (getJSFLibrary() instanceof PluginProvidedJSFLibrary) {
-			Bundle bundle = getBundle();
-			if (bundle != null) {
-				//resolvedSourceLocation = appendSeparator(bundleLocation) + sourceLocation;
-				try {
-					Path srcPath = new Path(sourceLocation);
-					URL fileURL = FileLocator.find(bundle, srcPath, null);
-					if (fileURL != null){
-						URL url = FileLocator.resolve(fileURL);
-						resolvedSourceLocation = url.getPath();
-					}
-					else 
-						resolvedSourceLocation = sourceLocation;
-				} catch (IOException e) {
-					resolvedSourceLocation = sourceLocation;
-				}
-			} else {
-				resolvedSourceLocation = sourceLocation;
-			}
-		} else {
-			if (isRelativeToWorkspace()) {
-				IWorkspaceRoot workspaceRoot = getWorkspaceRoot();
-				if (workspaceRoot != null) {
-					String workspaceLocation = workspaceRoot.getLocation().toOSString();
-					if (workspaceLocation != null) {
-						resolvedSourceLocation = appendSeparator(workspaceLocation) + sourceLocation;
-					} else {
-						resolvedSourceLocation = sourceLocation;
-					}
-				} else {
-					resolvedSourceLocation = sourceLocation;
-				}
-			} else {
-				resolvedSourceLocation = sourceLocation;
-			}
-		}
-		return resolvedSourceLocation;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseAdd(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case JSFLibraryRegistryPackage.ARCHIVE_FILE__JSF_LIBRARY:
-				if (eInternalContainer() != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return basicSetJSFLibrary((JSFLibrary)otherEnd, msgs);
-		}
-		return super.eInverseAdd(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case JSFLibraryRegistryPackage.ARCHIVE_FILE__JSF_LIBRARY:
-				return basicSetJSFLibrary(null, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @param msgs 
-	 * @return NotificationChain
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eBasicRemoveFromContainerFeature(NotificationChain msgs) {
-		switch (eContainerFeatureID) {
-			case JSFLibraryRegistryPackage.ARCHIVE_FILE__JSF_LIBRARY:
-				return eInternalContainer().eInverseRemove(this, JSFLibraryRegistryPackage.JSF_LIBRARY__ARCHIVE_FILES, JSFLibrary.class, msgs);
-		}
-		return super.eBasicRemoveFromContainerFeature(msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @param featureID 
-	 * @param resolve 
-	 * @param coreType 
-	 * @return 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case JSFLibraryRegistryPackage.ARCHIVE_FILE__RELATIVE_TO_WORKSPACE:
-				return isRelativeToWorkspace() ? Boolean.TRUE : Boolean.FALSE;
-			case JSFLibraryRegistryPackage.ARCHIVE_FILE__SOURCE_LOCATION:
-				return getSourceLocation();
-			case JSFLibraryRegistryPackage.ARCHIVE_FILE__RELATIVE_DEST_LOCATION:
-				return getRelativeDestLocation();
-			case JSFLibraryRegistryPackage.ARCHIVE_FILE__JSF_LIBRARY:
-				return getJSFLibrary();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @param featureID 
-	 * @param newValue 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case JSFLibraryRegistryPackage.ARCHIVE_FILE__RELATIVE_TO_WORKSPACE:
-				setRelativeToWorkspace(((Boolean)newValue).booleanValue());
-				return;
-			case JSFLibraryRegistryPackage.ARCHIVE_FILE__SOURCE_LOCATION:
-				setSourceLocation((String)newValue);
-				return;
-			case JSFLibraryRegistryPackage.ARCHIVE_FILE__RELATIVE_DEST_LOCATION:
-				setRelativeDestLocation((String)newValue);
-				return;
-			case JSFLibraryRegistryPackage.ARCHIVE_FILE__JSF_LIBRARY:
-				setJSFLibrary((JSFLibrary)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case JSFLibraryRegistryPackage.ARCHIVE_FILE__RELATIVE_TO_WORKSPACE:
-				setRelativeToWorkspace(RELATIVE_TO_WORKSPACE_EDEFAULT);
-				return;
-			case JSFLibraryRegistryPackage.ARCHIVE_FILE__SOURCE_LOCATION:
-				setSourceLocation(SOURCE_LOCATION_EDEFAULT);
-				return;
-			case JSFLibraryRegistryPackage.ARCHIVE_FILE__RELATIVE_DEST_LOCATION:
-				setRelativeDestLocation(RELATIVE_DEST_LOCATION_EDEFAULT);
-				return;
-			case JSFLibraryRegistryPackage.ARCHIVE_FILE__JSF_LIBRARY:
-				setJSFLibrary((JSFLibrary)null);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case JSFLibraryRegistryPackage.ARCHIVE_FILE__RELATIVE_TO_WORKSPACE:
-				return relativeToWorkspace != RELATIVE_TO_WORKSPACE_EDEFAULT;
-			case JSFLibraryRegistryPackage.ARCHIVE_FILE__SOURCE_LOCATION:
-				return SOURCE_LOCATION_EDEFAULT == null ? sourceLocation != null : !SOURCE_LOCATION_EDEFAULT.equals(sourceLocation);
-			case JSFLibraryRegistryPackage.ARCHIVE_FILE__RELATIVE_DEST_LOCATION:
-				return RELATIVE_DEST_LOCATION_EDEFAULT == null ? relativeDestLocation != null : !RELATIVE_DEST_LOCATION_EDEFAULT.equals(relativeDestLocation);
-			case JSFLibraryRegistryPackage.ARCHIVE_FILE__JSF_LIBRARY:
-				return getJSFLibrary() != null;
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * Gets the Bundle instance by parent PluginProvidedJSFLibrary instance's
-	 * pluginID property, if and only if the parent JSFLibrary instance IS a
-	 * PluginProvidedJSFLibrary, else returns null.
-	 * @return Bundle instance, or null if not located or applicable
-	 */
-	protected Bundle getBundle() {
-		Bundle bundle = null;
-		if (getJSFLibrary() instanceof PluginProvidedJSFLibrary) {
-			String pluginID = ((PluginProvidedJSFLibrary)getJSFLibrary()).getPluginID();
-			if (pluginID != null) {
-				bundle = Platform.getBundle(pluginID);
-			}
-		}
-		return bundle;
-	}
-
-	/**
-	 * Gets the IWorkspaceRoot instance. 
-	 * @return IWorkspaceRoot instance
-	 */
-	protected IWorkspaceRoot getWorkspaceRoot() {
-		IWorkspaceRoot workspaceRoot = null;
-		IWorkspace workspace = ResourcesPlugin.getWorkspace();
-		if (workspace != null) {
-			workspaceRoot = workspace.getRoot();
-		}
-		return workspaceRoot;
-	}
-
-	/**
-	 * @param path
-	 * @return the the path string with invalid path separators correctly fixed
-	 */
-	protected String appendSeparator(String path) {
-		String newPath = null;
-		if (!path.endsWith("\\") && !path.endsWith("/")) { //$NON-NLS-1$ //$NON-NLS-2$
-			newPath = path + System.getProperty("file.separator"); //$NON-NLS-1$
-		} else {
-			newPath = path;
-		}
-		return newPath;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @return the string representation of this archive file 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (RelativeToWorkspace: "); //$NON-NLS-1$
-		result.append(relativeToWorkspace);
-		result.append(", SourceLocation: "); //$NON-NLS-1$
-		result.append(sourceLocation);
-		result.append(", RelativeDestLocation: "); //$NON-NLS-1$
-		result.append(relativeDestLocation);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ArchiveFileImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/impl/JSFLibraryImpl.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/impl/JSFLibraryImpl.java
deleted file mode 100644
index 40c29b1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/impl/JSFLibraryImpl.java
+++ /dev/null
@@ -1,558 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl;
-
-import java.util.Collection;
-import java.util.Iterator;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentWithInverseEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryFactory;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryPackage;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFVersion;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.adapter.MaintainDefaultImplementationAdapter;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>JSF Library</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.JSFLibraryImpl#getID <em>ID</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.JSFLibraryImpl#getName <em>Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.JSFLibraryImpl#getJSFVersion <em>JSF Version</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.JSFLibraryImpl#isDeployed <em>Deployed</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.JSFLibraryImpl#isImplementation <em>Implementation</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.JSFLibraryImpl#getArchiveFiles <em>Archive Files</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- * @deprecated
- */
-public class JSFLibraryImpl extends EObjectImpl implements JSFLibrary {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005 Oracle Corporation"; //$NON-NLS-1$
-
-	/**
-	 * The default value of the '{@link #getID() <em>ID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getID()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = ""; //$NON-NLS-1$
-
-	/**
-	 * The cached value of the '{@link #getID() <em>ID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getID()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getName() <em>Name</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getName()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String NAME_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getName() <em>Name</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getName()
-	 * @generated
-	 * @ordered
-	 */
-	protected String name = NAME_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getJSFVersion() <em>JSF Version</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getJSFVersion()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final JSFVersion JSF_VERSION_EDEFAULT = JSFVersion.UNKNOWN_LITERAL;
-
-	/**
-	 * The cached value of the '{@link #getJSFVersion() <em>JSF Version</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getJSFVersion()
-	 * @generated
-	 * @ordered
-	 */
-	protected JSFVersion jsfVersion = JSF_VERSION_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #isDeployed() <em>Deployed</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isDeployed()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean DEPLOYED_EDEFAULT = true;
-
-	/**
-	 * The cached value of the '{@link #isDeployed() <em>Deployed</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isDeployed()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean deployed = DEPLOYED_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #isImplementation() <em>Implementation</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isImplementation()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean IMPLEMENTATION_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isImplementation() <em>Implementation</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isImplementation()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean implementation = IMPLEMENTATION_EDEFAULT;
-
-	/**
-	 * The cached value of the '{@link #getArchiveFiles() <em>Archive Files</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getArchiveFiles()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList archiveFiles;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * Enhanced to not only create an instance but also to set an initial ID
-	 * (which can be reset later) and to add the
-	 * MaintainDefaultImplementationAdapter to the list of adapters.
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	protected JSFLibraryImpl() {
-		super();
-//		//set initial ID; will be overwritten from XML if already persisted
-//		setID(String.valueOf(System.currentTimeMillis()));
-		//add adapter to maintain a default implementation
-		eAdapters().add(MaintainDefaultImplementationAdapter.getInstance());
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @return the static eClass 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return JSFLibraryRegistryPackage.Literals.JSF_LIBRARY;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String getID() {
-		return getName();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @return the name 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getName() {
-		return name;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @param newName 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setName(String newName) {
-		String oldName = name;
-		name = newName;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, JSFLibraryRegistryPackage.JSF_LIBRARY__NAME, oldName, name));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @return the jsf version 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public JSFVersion getJSFVersion() {
-		return jsfVersion;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @param newJSFVersion 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setJSFVersion(JSFVersion newJSFVersion) {
-		JSFVersion oldJSFVersion = jsfVersion;
-		jsfVersion = newJSFVersion == null ? JSF_VERSION_EDEFAULT : newJSFVersion;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, JSFLibraryRegistryPackage.JSF_LIBRARY__JSF_VERSION, oldJSFVersion, jsfVersion));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @return true if library is to be deployed 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isDeployed() {
-		return deployed;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @param newDeployed 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setDeployed(boolean newDeployed) {
-		boolean oldDeployed = deployed;
-		deployed = newDeployed;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, JSFLibraryRegistryPackage.JSF_LIBRARY__DEPLOYED, oldDeployed, deployed));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @return true if implementation 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isImplementation() {
-		return implementation;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @param newImplementation 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setImplementation(boolean newImplementation) {
-		boolean oldImplementation = implementation;
-		implementation = newImplementation;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, JSFLibraryRegistryPackage.JSF_LIBRARY__IMPLEMENTATION, oldImplementation, implementation));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @return the list of archive files 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getArchiveFiles() {
-		if (archiveFiles == null) {
-			archiveFiles = new EObjectContainmentWithInverseEList(ArchiveFile.class, this, JSFLibraryRegistryPackage.JSF_LIBRARY__ARCHIVE_FILES, JSFLibraryRegistryPackage.ARCHIVE_FILE__JSF_LIBRARY);
-		}
-		return archiveFiles;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @param fullPath 
-	 * @return the true if the fullPath contains an archive file 
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public boolean containsArchiveFile(String fullPath) {
-		boolean contains = false;
-		if (fullPath != null) {
-			Iterator itArchiveFiles = getArchiveFiles().iterator();
-			while (itArchiveFiles.hasNext()) {
-				ArchiveFile archiveFile = (ArchiveFile)itArchiveFiles.next();
-				if (fullPath.equals(archiveFile.getResolvedSourceLocation())) {
-					contains = true;
-					break;
-				}
-			}
-		}
-		return contains;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @return the working copy 
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public JSFLibrary getWorkingCopy() {
-		JSFLibrary workingCopyLib = JSFLibraryRegistryFactory.eINSTANCE.createJSFLibrary();
-//		workingCopyLib.setID(getID());
-		workingCopyLib.setName(getName());
-		workingCopyLib.setJSFVersion(getJSFVersion());
-		workingCopyLib.setDeployed(isDeployed());
-		workingCopyLib.setImplementation(isImplementation());
-		Iterator itArchiveFiles = getArchiveFiles().iterator();
-		while (itArchiveFiles.hasNext()) {
-			ArchiveFile srcArchiveFile = (ArchiveFile)itArchiveFiles.next();
-			ArchiveFile destArchiveFile = JSFLibraryRegistryFactory.eINSTANCE.createArchiveFile();
-			destArchiveFile.setRelativeToWorkspace(srcArchiveFile.isRelativeToWorkspace());
-			destArchiveFile.setSourceLocation(srcArchiveFile.getSourceLocation());
-			destArchiveFile.setRelativeDestLocation(srcArchiveFile.getRelativeDestLocation());
-			workingCopyLib.getArchiveFiles().add(destArchiveFile);
-		}
-		return workingCopyLib;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @param otherLibrary 
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public void updateValues(JSFLibrary otherLibrary) {
-		if (otherLibrary != null) {
-//			setID(otherLibrary.getID());
-			setName(otherLibrary.getName());
-			setJSFVersion(otherLibrary.getJSFVersion());
-			setDeployed(otherLibrary.isDeployed());
-			setImplementation(otherLibrary.isImplementation());
-			Iterator itArchiveFiles = otherLibrary.getArchiveFiles().iterator();
-			getArchiveFiles().clear();
-			while (itArchiveFiles.hasNext()) {
-				ArchiveFile srcArchiveFile = (ArchiveFile)itArchiveFiles.next();
-				ArchiveFile destArchiveFile = JSFLibraryRegistryFactory.eINSTANCE.createArchiveFile();
-				destArchiveFile.setRelativeToWorkspace(srcArchiveFile.isRelativeToWorkspace());
-				destArchiveFile.setSourceLocation(srcArchiveFile.getSourceLocation());
-				destArchiveFile.setRelativeDestLocation(srcArchiveFile.getRelativeDestLocation());
-				getArchiveFiles().add(destArchiveFile);
-			}
-		}
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @param baseDestLocation 
-	 * @return the base destination location 
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public boolean copyTo(String baseDestLocation) {
-		boolean allCopied = true;
-		Iterator itFiles = getArchiveFiles().iterator();
-		while (itFiles.hasNext()) {
-			ArchiveFile archiveFile = (ArchiveFile)itFiles.next();
-			boolean copied = archiveFile.copyTo(baseDestLocation);
-			allCopied = allCopied && copied;
-		}
-		return allCopied;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String getLabel() {
-		return getName();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseAdd(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case JSFLibraryRegistryPackage.JSF_LIBRARY__ARCHIVE_FILES:
-				return ((InternalEList)getArchiveFiles()).basicAdd(otherEnd, msgs);
-		}
-		return super.eInverseAdd(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case JSFLibraryRegistryPackage.JSF_LIBRARY__ARCHIVE_FILES:
-				return ((InternalEList)getArchiveFiles()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case JSFLibraryRegistryPackage.JSF_LIBRARY__ID:
-				return getID();
-			case JSFLibraryRegistryPackage.JSF_LIBRARY__NAME:
-				return getName();
-			case JSFLibraryRegistryPackage.JSF_LIBRARY__JSF_VERSION:
-				return getJSFVersion();
-			case JSFLibraryRegistryPackage.JSF_LIBRARY__DEPLOYED:
-				return isDeployed() ? Boolean.TRUE : Boolean.FALSE;
-			case JSFLibraryRegistryPackage.JSF_LIBRARY__IMPLEMENTATION:
-				return isImplementation() ? Boolean.TRUE : Boolean.FALSE;
-			case JSFLibraryRegistryPackage.JSF_LIBRARY__ARCHIVE_FILES:
-				return getArchiveFiles();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case JSFLibraryRegistryPackage.JSF_LIBRARY__NAME:
-				setName((String)newValue);
-				return;
-			case JSFLibraryRegistryPackage.JSF_LIBRARY__JSF_VERSION:
-				setJSFVersion((JSFVersion)newValue);
-				return;
-			case JSFLibraryRegistryPackage.JSF_LIBRARY__DEPLOYED:
-				setDeployed(((Boolean)newValue).booleanValue());
-				return;
-			case JSFLibraryRegistryPackage.JSF_LIBRARY__IMPLEMENTATION:
-				setImplementation(((Boolean)newValue).booleanValue());
-				return;
-			case JSFLibraryRegistryPackage.JSF_LIBRARY__ARCHIVE_FILES:
-				getArchiveFiles().clear();
-				getArchiveFiles().addAll((Collection)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case JSFLibraryRegistryPackage.JSF_LIBRARY__NAME:
-				setName(NAME_EDEFAULT);
-				return;
-			case JSFLibraryRegistryPackage.JSF_LIBRARY__JSF_VERSION:
-				setJSFVersion(JSF_VERSION_EDEFAULT);
-				return;
-			case JSFLibraryRegistryPackage.JSF_LIBRARY__DEPLOYED:
-				setDeployed(DEPLOYED_EDEFAULT);
-				return;
-			case JSFLibraryRegistryPackage.JSF_LIBRARY__IMPLEMENTATION:
-				setImplementation(IMPLEMENTATION_EDEFAULT);
-				return;
-			case JSFLibraryRegistryPackage.JSF_LIBRARY__ARCHIVE_FILES:
-				getArchiveFiles().clear();
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case JSFLibraryRegistryPackage.JSF_LIBRARY__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-			case JSFLibraryRegistryPackage.JSF_LIBRARY__NAME:
-				return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT.equals(name);
-			case JSFLibraryRegistryPackage.JSF_LIBRARY__JSF_VERSION:
-				return jsfVersion != JSF_VERSION_EDEFAULT;
-			case JSFLibraryRegistryPackage.JSF_LIBRARY__DEPLOYED:
-				return deployed != DEPLOYED_EDEFAULT;
-			case JSFLibraryRegistryPackage.JSF_LIBRARY__IMPLEMENTATION:
-				return implementation != IMPLEMENTATION_EDEFAULT;
-			case JSFLibraryRegistryPackage.JSF_LIBRARY__ARCHIVE_FILES:
-				return archiveFiles != null && !archiveFiles.isEmpty();
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @return the string representation 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (ID: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(", Name: "); //$NON-NLS-1$
-		result.append(name);
-		result.append(", JSFVersion: "); //$NON-NLS-1$
-		result.append(jsfVersion);
-		result.append(", Deployed: "); //$NON-NLS-1$
-		result.append(deployed);
-		result.append(", Implementation: "); //$NON-NLS-1$
-		result.append(implementation);
-		result.append(')');
-		return result.toString();
-	}
-
-} //JSFLibraryImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/impl/JSFLibraryRegistryFactoryImpl.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/impl/JSFLibraryRegistryFactoryImpl.java
deleted file mode 100644
index 14b1ff6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/impl/JSFLibraryRegistryFactoryImpl.java
+++ /dev/null
@@ -1,215 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EDataType;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.impl.EFactoryImpl;
-import org.eclipse.emf.ecore.plugin.EcorePlugin;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistry;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryFactory;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryPackage;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFVersion;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.PluginProvidedJSFLibrary;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model <b>Factory</b>.
- * <!-- end-user-doc -->
- * @generated
- * @deprecated
- */
-public class JSFLibraryRegistryFactoryImpl extends EFactoryImpl implements JSFLibraryRegistryFactory {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005 Oracle Corporation"; //$NON-NLS-1$
-
-	/**
-	 * Creates the default factory implementation.
-	 * <!-- begin-user-doc -->
-     * @return the initialized factory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static JSFLibraryRegistryFactory init() {
-		try {
-			JSFLibraryRegistryFactory theJSFLibraryRegistryFactory = (JSFLibraryRegistryFactory)EPackage.Registry.INSTANCE.getEFactory("http://www.eclipse.org/webtools/jsf/schema/jsflibraryregistry.xsd");  //$NON-NLS-1$
-			if (theJSFLibraryRegistryFactory != null) {
-				return theJSFLibraryRegistryFactory;
-			}
-		}
-		catch (Exception exception) {
-			EcorePlugin.INSTANCE.log(exception);
-		}
-		return new JSFLibraryRegistryFactoryImpl();
-	}
-
-	/**
-	 * Creates an instance of the factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public JSFLibraryRegistryFactoryImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @param eClass 
-	 * @return the static eclass 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EObject create(EClass eClass) {
-		switch (eClass.getClassifierID()) {
-			case JSFLibraryRegistryPackage.JSF_LIBRARY_REGISTRY: return createJSFLibraryRegistry();
-			case JSFLibraryRegistryPackage.JSF_LIBRARY: return createJSFLibrary();
-			case JSFLibraryRegistryPackage.PLUGIN_PROVIDED_JSF_LIBRARY: return createPluginProvidedJSFLibrary();
-			case JSFLibraryRegistryPackage.ARCHIVE_FILE: return createArchiveFile();
-			default:
-				throw new IllegalArgumentException("The class '" + eClass.getName() + "' is not a valid classifier"); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @param eDataType 
-	 * @param initialValue 
-	 * @return an instance of eDataType for initialValue
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object createFromString(EDataType eDataType, String initialValue) {
-		switch (eDataType.getClassifierID()) {
-			case JSFLibraryRegistryPackage.JSF_VERSION:
-				return createJSFVersionFromString(eDataType, initialValue);
-			default:
-				throw new IllegalArgumentException("The datatype '" + eDataType.getName() + "' is not a valid classifier"); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @param eDataType 
-	 * @param instanceValue 
-	 * @return the string created from instanceValue from eDataType 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertToString(EDataType eDataType, Object instanceValue) {
-		switch (eDataType.getClassifierID()) {
-			case JSFLibraryRegistryPackage.JSF_VERSION:
-				return convertJSFVersionToString(eDataType, instanceValue);
-			default:
-				throw new IllegalArgumentException("The datatype '" + eDataType.getName() + "' is not a valid classifier"); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @return the jsf library registry
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public JSFLibraryRegistry createJSFLibraryRegistry() {
-		JSFLibraryRegistryImpl jsfLibraryRegistry = new JSFLibraryRegistryImpl();
-		return jsfLibraryRegistry;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @return the jsf library 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public JSFLibrary createJSFLibrary() {
-		JSFLibraryImpl jsfLibrary = new JSFLibraryImpl();
-		return jsfLibrary;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @return the archive file 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ArchiveFile createArchiveFile() {
-		ArchiveFileImpl archiveFile = new ArchiveFileImpl();
-		return archiveFile;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @return the plugin provided JSF library 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public PluginProvidedJSFLibrary createPluginProvidedJSFLibrary() {
-		PluginProvidedJSFLibraryImpl pluginProvidedJSFLibrary = new PluginProvidedJSFLibraryImpl();
-		return pluginProvidedJSFLibrary;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-     * @param eDataType 
-     * @param initialValue 
-     * @return the jsfVersion the dataType 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public JSFVersion createJSFVersionFromString(EDataType eDataType, String initialValue) {
-		JSFVersion result = JSFVersion.get(initialValue);
-		if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-		return result;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-     * @param eDataType 
-     * @param instanceValue 
-     * @return the string version of the data type 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertJSFVersionToString(EDataType eDataType, Object instanceValue) {
-		return instanceValue == null ? null : instanceValue.toString();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @return the registry package 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public JSFLibraryRegistryPackage getJSFLibraryRegistryPackage() {
-		return (JSFLibraryRegistryPackage)getEPackage();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @return the package 
-	 * <!-- end-user-doc -->
-	 * @deprecated
-	 * @generated
-	 */
-	public static JSFLibraryRegistryPackage getPackage() {
-		return JSFLibraryRegistryPackage.eINSTANCE;
-	}
-
-} //JSFLibraryRegistryFactoryImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/impl/JSFLibraryRegistryImpl.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/impl/JSFLibraryRegistryImpl.java
deleted file mode 100644
index 8e26263..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/impl/JSFLibraryRegistryImpl.java
+++ /dev/null
@@ -1,434 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl;
-
-import java.util.Collection;
-import java.util.Iterator;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.BasicEList;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistry;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryPackage;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.PluginProvidedJSFLibrary;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>JSF Library Registry</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.JSFLibraryRegistryImpl#getDefaultImplementationID <em>Default Implementation ID</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.JSFLibraryRegistryImpl#getJSFLibraries <em>JSF Libraries</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.JSFLibraryRegistryImpl#getPluginProvidedJSFLibraries <em>Plugin Provided JSF Libraries</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- * @deprecated
- */
-public class JSFLibraryRegistryImpl extends EObjectImpl implements JSFLibraryRegistry {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005 Oracle Corporation"; //$NON-NLS-1$
-
-	/**
-	 * The default value of the '{@link #getDefaultImplementationID() <em>Default Implementation ID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDefaultImplementationID()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String DEFAULT_IMPLEMENTATION_ID_EDEFAULT = ""; //$NON-NLS-1$
-
-	/**
-	 * The cached value of the '{@link #getDefaultImplementationID() <em>Default Implementation ID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDefaultImplementationID()
-	 * @generated
-	 * @ordered
-	 */
-	protected String defaultImplementationID = DEFAULT_IMPLEMENTATION_ID_EDEFAULT;
-
-	/**
-	 * The cached value of the '{@link #getJSFLibraries() <em>JSF Libraries</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getJSFLibraries()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList jsfLibraries;
-
-	/**
-	 * The cached value of the '{@link #getPluginProvidedJSFLibraries() <em>Plugin Provided JSF Libraries</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPluginProvidedJSFLibraries()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList pluginProvidedJSFLibraries;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected JSFLibraryRegistryImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @return the static eClass 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return JSFLibraryRegistryPackage.Literals.JSF_LIBRARY_REGISTRY;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @return the default implementation id 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getDefaultImplementationID() {
-		return defaultImplementationID;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @param newDefaultImplementationID 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setDefaultImplementationID(String newDefaultImplementationID) {
-		String oldDefaultImplementationID = defaultImplementationID;
-		defaultImplementationID = newDefaultImplementationID;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, JSFLibraryRegistryPackage.JSF_LIBRARY_REGISTRY__DEFAULT_IMPLEMENTATION_ID, oldDefaultImplementationID, defaultImplementationID));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @return the list of jsf libraries
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getJSFLibraries() {
-		if (jsfLibraries == null) {
-			jsfLibraries = new EObjectContainmentEList(JSFLibrary.class, this, JSFLibraryRegistryPackage.JSF_LIBRARY_REGISTRY__JSF_LIBRARIES);
-		}
-		return jsfLibraries;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @return the list of plugin provided JSF libraries 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getPluginProvidedJSFLibraries() {
-		if (pluginProvidedJSFLibraries == null) {
-			pluginProvidedJSFLibraries = new EObjectContainmentEList(PluginProvidedJSFLibrary.class, this, JSFLibraryRegistryPackage.JSF_LIBRARY_REGISTRY__PLUGIN_PROVIDED_JSF_LIBRARIES);
-		}
-		return pluginProvidedJSFLibraries;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @return the default implemention JSF library 
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public JSFLibrary getDefaultImplementation() {
-		return getJSFLibraryByID(getDefaultImplementationID());
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @param implementation 
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public void setDefaultImplementation(JSFLibrary implementation) {
-		if (implementation != null) {
-			setDefaultImplementationID(implementation.getID());
-		} else {
-			setDefaultImplementationID(null);
-		}
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case JSFLibraryRegistryPackage.JSF_LIBRARY_REGISTRY__JSF_LIBRARIES:
-				return ((InternalEList)getJSFLibraries()).basicRemove(otherEnd, msgs);
-			case JSFLibraryRegistryPackage.JSF_LIBRARY_REGISTRY__PLUGIN_PROVIDED_JSF_LIBRARIES:
-				return ((InternalEList)getPluginProvidedJSFLibraries()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case JSFLibraryRegistryPackage.JSF_LIBRARY_REGISTRY__DEFAULT_IMPLEMENTATION_ID:
-				return getDefaultImplementationID();
-			case JSFLibraryRegistryPackage.JSF_LIBRARY_REGISTRY__JSF_LIBRARIES:
-				return getJSFLibraries();
-			case JSFLibraryRegistryPackage.JSF_LIBRARY_REGISTRY__PLUGIN_PROVIDED_JSF_LIBRARIES:
-				return getPluginProvidedJSFLibraries();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case JSFLibraryRegistryPackage.JSF_LIBRARY_REGISTRY__DEFAULT_IMPLEMENTATION_ID:
-				setDefaultImplementationID((String)newValue);
-				return;
-			case JSFLibraryRegistryPackage.JSF_LIBRARY_REGISTRY__JSF_LIBRARIES:
-				getJSFLibraries().clear();
-				getJSFLibraries().addAll((Collection)newValue);
-				return;
-			case JSFLibraryRegistryPackage.JSF_LIBRARY_REGISTRY__PLUGIN_PROVIDED_JSF_LIBRARIES:
-				getPluginProvidedJSFLibraries().clear();
-				getPluginProvidedJSFLibraries().addAll((Collection)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case JSFLibraryRegistryPackage.JSF_LIBRARY_REGISTRY__DEFAULT_IMPLEMENTATION_ID:
-				setDefaultImplementationID(DEFAULT_IMPLEMENTATION_ID_EDEFAULT);
-				return;
-			case JSFLibraryRegistryPackage.JSF_LIBRARY_REGISTRY__JSF_LIBRARIES:
-				getJSFLibraries().clear();
-				return;
-			case JSFLibraryRegistryPackage.JSF_LIBRARY_REGISTRY__PLUGIN_PROVIDED_JSF_LIBRARIES:
-				getPluginProvidedJSFLibraries().clear();
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case JSFLibraryRegistryPackage.JSF_LIBRARY_REGISTRY__DEFAULT_IMPLEMENTATION_ID:
-				return DEFAULT_IMPLEMENTATION_ID_EDEFAULT == null ? defaultImplementationID != null : !DEFAULT_IMPLEMENTATION_ID_EDEFAULT.equals(defaultImplementationID);
-			case JSFLibraryRegistryPackage.JSF_LIBRARY_REGISTRY__JSF_LIBRARIES:
-				return jsfLibraries != null && !jsfLibraries.isEmpty();
-			case JSFLibraryRegistryPackage.JSF_LIBRARY_REGISTRY__PLUGIN_PROVIDED_JSF_LIBRARIES:
-				return pluginProvidedJSFLibraries != null && !pluginProvidedJSFLibraries.isEmpty();
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @param ID 
-	 * @return the jsf library of ID or null if none 
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public JSFLibrary getJSFLibraryByID(String ID) {
-		JSFLibrary library = null;
-		if (ID != null) {
-			Iterator itLibs = getAllJSFLibraries().iterator();
-			while (itLibs.hasNext()) {
-				JSFLibrary curLib = (JSFLibrary)itLibs.next();
-				if (ID.equals(curLib.getID())) {
-					library = curLib;
-					break;
-				}
-			}
-		}
-		return library;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @param name 
-	 * @return the list of libraries named 'name' 
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public EList getJSFLibrariesByName(String name) {
-		EList libraries = new BasicEList();
-		if (name != null) {
-			Iterator itLibs = getAllJSFLibraries().iterator();
-			while(itLibs.hasNext()) {
-				JSFLibrary curLib = (JSFLibrary)itLibs.next();
-				if (name.equals(curLib.getName())) {
-					libraries.add(curLib);
-				}
-			}
-		}
-		return libraries;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * This is a convenience method to return an EList of JSFLibrary instances
-	 * that are marked as JSF implementations; while all instances are valid
-	 * references, the returned EList should not be used for additions and/or
-	 * removals of instances (use the EList returned by getJSFLibraries()).
-	 * @return the list of implemention jsf libraries 
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public EList getImplJSFLibraries() {
-		EList implementations = new BasicEList();
-		Iterator itLibs = getAllJSFLibraries().iterator();
-		while (itLibs.hasNext()) {
-			JSFLibrary lib = (JSFLibrary)itLibs.next();
-			if (lib.isImplementation()) {
-				implementations.add(lib);
-			}
-		}
-		return implementations;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * This is a convenience method to return an EList of JSFLibrary instances
-	 * that are not marked as JSF implementations; while all instances are
-	 * valid references, the returned EList should not be used for additions
-	 * and/or removals of instances (use the EList returned by
-	 * getJSFLibraries()).
-	 * @return the non-implemention JSF libraries
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public EList getNonImplJSFLibraries() {
-		EList nonImplementations = new BasicEList();
-		Iterator itLibs = getAllJSFLibraries().iterator();
-		while (itLibs.hasNext()) {
-			JSFLibrary lib = (JSFLibrary)itLibs.next();
-			if (!lib.isImplementation()) {
-				nonImplementations.add(lib);
-			}
-		}
-		return nonImplementations;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * This is a convenience method to return an EList of JSFLibrary instances
-	 * and PluginProvidedJSFLibrary instances; while all instances are valid
-	 * references, the returned EList should not be used for additions and/or
-	 * removals of instances (use the EList returned by getJSFLibraries()).
-	 * @return all JSF libraries 
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public EList getAllJSFLibraries() {
-		EList allLibs = new BasicEList();
-		allLibs.addAll(getJSFLibraries());
-		allLibs.addAll(getPluginProvidedJSFLibraries());
-		return allLibs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @param library 
-	 * @return true if library is successfully added 
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public boolean addJSFLibrary(JSFLibrary library) {
-		boolean added = false;
-		if (library instanceof PluginProvidedJSFLibrary) {
-			added = getPluginProvidedJSFLibraries().add(library);
-		} else {
-			added = getJSFLibraries().add(library);
-		}
-		return added;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @param library 
-	 * @return true if library is successfully removed
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public boolean removeJSFLibrary(JSFLibrary library) {
-		boolean removed = false;
-		if (library instanceof PluginProvidedJSFLibrary) {
-			removed = getPluginProvidedJSFLibraries().remove(library);
-		} else {
-			removed = getJSFLibraries().remove(library);
-		}
-		return removed;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @return the string representation 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (DefaultImplementationID: "); //$NON-NLS-1$
-		result.append(defaultImplementationID);
-		result.append(')');
-		return result.toString();
-	}
-	
-
-} //JSFLibraryRegistryImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/impl/JSFLibraryRegistryPackageImpl.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/impl/JSFLibraryRegistryPackageImpl.java
deleted file mode 100644
index 514777c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/impl/JSFLibraryRegistryPackageImpl.java
+++ /dev/null
@@ -1,515 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl;
-
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EEnum;
-import org.eclipse.emf.ecore.EOperation;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.EReference;
-import org.eclipse.emf.ecore.impl.EPackageImpl;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistry;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryFactory;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryPackage;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFVersion;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.PluginProvidedJSFLibrary;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model <b>Package</b>.
- * <!-- end-user-doc -->
- * @generated
- * @deprecated
- */
-public class JSFLibraryRegistryPackageImpl extends EPackageImpl implements JSFLibraryRegistryPackage {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005 Oracle Corporation"; //$NON-NLS-1$
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass jsfLibraryRegistryEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass jsfLibraryEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass archiveFileEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass pluginProvidedJSFLibraryEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EEnum jsfVersionEEnum = null;
-
-	/**
-	 * Creates an instance of the model <b>Package</b>, registered with
-	 * {@link org.eclipse.emf.ecore.EPackage.Registry EPackage.Registry} by the package
-	 * package URI value.
-	 * <p>Note: the correct way to create the package is via the static
-	 * factory method {@link #init init()}, which also performs
-	 * initialization of the package, or returns the registered package,
-	 * if one already exists.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.emf.ecore.EPackage.Registry
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryPackage#eNS_URI
-	 * @see #init()
-	 * @generated
-	 */
-	private JSFLibraryRegistryPackageImpl() {
-		super(eNS_URI, JSFLibraryRegistryFactory.eINSTANCE);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static boolean isInited = false;
-
-	/**
-	 * Creates, registers, and initializes the <b>Package</b> for this
-	 * model, and for any others upon which it depends.  Simple
-	 * dependencies are satisfied by calling this method on all
-	 * dependent packages before doing anything else.  This method drives
-	 * initialization for interdependent packages directly, in parallel
-	 * with this package, itself.
-	 * <p>Of this package and its interdependencies, all packages which
-	 * have not yet been registered by their URI values are first created
-	 * and registered.  The packages are then initialized in two steps:
-	 * meta-model objects for all of the packages are created before any
-	 * are initialized, since one package's meta-model objects may refer to
-	 * those of another.
-	 * <p>Invocation of this method will not affect any packages that have
-	 * already been initialized.
-	 * <!-- begin-user-doc -->
-	 * @return the JSF library registry package
-	 * <!-- end-user-doc -->
-	 * @see #eNS_URI
-	 * @see #createPackageContents()
-	 * @see #initializePackageContents()
-	 * @generated
-	 */
-	public static JSFLibraryRegistryPackage init() {
-		if (isInited) return (JSFLibraryRegistryPackage)EPackage.Registry.INSTANCE.getEPackage(JSFLibraryRegistryPackage.eNS_URI);
-
-		// Obtain or create and register package
-		JSFLibraryRegistryPackageImpl theJSFLibraryRegistryPackage = (JSFLibraryRegistryPackageImpl)(EPackage.Registry.INSTANCE.getEPackage(eNS_URI) instanceof JSFLibraryRegistryPackageImpl ? EPackage.Registry.INSTANCE.getEPackage(eNS_URI) : new JSFLibraryRegistryPackageImpl());
-
-		isInited = true;
-
-		// Create package meta-data objects
-		theJSFLibraryRegistryPackage.createPackageContents();
-
-		// Initialize created meta-data
-		theJSFLibraryRegistryPackage.initializePackageContents();
-
-		// Mark meta-data to indicate it can't be changed
-		theJSFLibraryRegistryPackage.freeze();
-
-		return theJSFLibraryRegistryPackage;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-     * @return the eclass 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getJSFLibraryRegistry() {
-		return jsfLibraryRegistryEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-     * @return the eattribute 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getJSFLibraryRegistry_DefaultImplementationID() {
-		return (EAttribute)jsfLibraryRegistryEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-     * @return the ereference
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getJSFLibraryRegistry_JSFLibraries() {
-		return (EReference)jsfLibraryRegistryEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-     * @return the ereference 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getJSFLibraryRegistry_PluginProvidedJSFLibraries() {
-		return (EReference)jsfLibraryRegistryEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-     * @return the eclass 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getJSFLibrary() {
-		return jsfLibraryEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-     * @return the eattribute 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getJSFLibrary_ID() {
-		return (EAttribute)jsfLibraryEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-     * @return the eattribute 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getJSFLibrary_Name() {
-		return (EAttribute)jsfLibraryEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-     * @return the eattribute
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getJSFLibrary_JSFVersion() {
-		return (EAttribute)jsfLibraryEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-     * @return the eattribute 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getJSFLibrary_Deployed() {
-		return (EAttribute)jsfLibraryEClass.getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-     * @return the eattribute 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getJSFLibrary_Implementation() {
-		return (EAttribute)jsfLibraryEClass.getEStructuralFeatures().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-     * @return the ereference 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getJSFLibrary_ArchiveFiles() {
-		return (EReference)jsfLibraryEClass.getEStructuralFeatures().get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-     * @return the eclass 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getArchiveFile() {
-		return archiveFileEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-     * @return the eattribute 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getArchiveFile_SourceLocation() {
-		return (EAttribute)archiveFileEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-     * @return the eattribute 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getArchiveFile_RelativeToWorkspace() {
-		return (EAttribute)archiveFileEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-     * @return the eattribute
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getArchiveFile_RelativeDestLocation() {
-		return (EAttribute)archiveFileEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-     * @return the ereference 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getArchiveFile_JSFLibrary() {
-		return (EReference)archiveFileEClass.getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-     * @return the eclass 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getPluginProvidedJSFLibrary() {
-		return pluginProvidedJSFLibraryEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-     * @return the eattribute 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getPluginProvidedJSFLibrary_PluginID() {
-		return (EAttribute)pluginProvidedJSFLibraryEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getPluginProvidedJSFLibrary_Label() {
-		return (EAttribute)pluginProvidedJSFLibraryEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-     * @return the eenum 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EEnum getJSFVersion() {
-		return jsfVersionEEnum;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-     * @return the jsf library registry factory
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public JSFLibraryRegistryFactory getJSFLibraryRegistryFactory() {
-		return (JSFLibraryRegistryFactory)getEFactoryInstance();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private boolean isCreated = false;
-
-	/**
-	 * Creates the meta-model objects for the package.  This method is
-	 * guarded to have no affect on any invocation but its first.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void createPackageContents() {
-		if (isCreated) return;
-		isCreated = true;
-
-		// Create classes and their features
-		jsfLibraryRegistryEClass = createEClass(JSF_LIBRARY_REGISTRY);
-		createEAttribute(jsfLibraryRegistryEClass, JSF_LIBRARY_REGISTRY__DEFAULT_IMPLEMENTATION_ID);
-		createEReference(jsfLibraryRegistryEClass, JSF_LIBRARY_REGISTRY__JSF_LIBRARIES);
-		createEReference(jsfLibraryRegistryEClass, JSF_LIBRARY_REGISTRY__PLUGIN_PROVIDED_JSF_LIBRARIES);
-
-		jsfLibraryEClass = createEClass(JSF_LIBRARY);
-		createEAttribute(jsfLibraryEClass, JSF_LIBRARY__ID);
-		createEAttribute(jsfLibraryEClass, JSF_LIBRARY__NAME);
-		createEAttribute(jsfLibraryEClass, JSF_LIBRARY__JSF_VERSION);
-		createEAttribute(jsfLibraryEClass, JSF_LIBRARY__DEPLOYED);
-		createEAttribute(jsfLibraryEClass, JSF_LIBRARY__IMPLEMENTATION);
-		createEReference(jsfLibraryEClass, JSF_LIBRARY__ARCHIVE_FILES);
-
-		pluginProvidedJSFLibraryEClass = createEClass(PLUGIN_PROVIDED_JSF_LIBRARY);
-		createEAttribute(pluginProvidedJSFLibraryEClass, PLUGIN_PROVIDED_JSF_LIBRARY__PLUGIN_ID);
-		createEAttribute(pluginProvidedJSFLibraryEClass, PLUGIN_PROVIDED_JSF_LIBRARY__LABEL);
-
-		archiveFileEClass = createEClass(ARCHIVE_FILE);
-		createEAttribute(archiveFileEClass, ARCHIVE_FILE__RELATIVE_TO_WORKSPACE);
-		createEAttribute(archiveFileEClass, ARCHIVE_FILE__SOURCE_LOCATION);
-		createEAttribute(archiveFileEClass, ARCHIVE_FILE__RELATIVE_DEST_LOCATION);
-		createEReference(archiveFileEClass, ARCHIVE_FILE__JSF_LIBRARY);
-
-		// Create enums
-		jsfVersionEEnum = createEEnum(JSF_VERSION);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private boolean isInitialized = false;
-
-	/**
-	 * Complete the initialization of the package and its meta-model.  This
-	 * method is guarded to have no affect on any invocation but its first.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void initializePackageContents() {
-		if (isInitialized) return;
-		isInitialized = true;
-
-		// Initialize package
-		setName(eNAME);
-		setNsPrefix(eNS_PREFIX);
-		setNsURI(eNS_URI);
-
-		// Add supertypes to classes
-		pluginProvidedJSFLibraryEClass.getESuperTypes().add(this.getJSFLibrary());
-
-		// Initialize classes and features; add operations and parameters
-		initEClass(jsfLibraryRegistryEClass, JSFLibraryRegistry.class, "JSFLibraryRegistry", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEAttribute(getJSFLibraryRegistry_DefaultImplementationID(), ecorePackage.getEString(), "DefaultImplementationID", "", 0, 1, JSFLibraryRegistry.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$
-		initEReference(getJSFLibraryRegistry_JSFLibraries(), this.getJSFLibrary(), null, "JSFLibraries", null, 0, -1, JSFLibraryRegistry.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEReference(getJSFLibraryRegistry_PluginProvidedJSFLibraries(), this.getPluginProvidedJSFLibrary(), null, "PluginProvidedJSFLibraries", null, 0, -1, JSFLibraryRegistry.class, IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-		EOperation op = addEOperation(jsfLibraryRegistryEClass, this.getJSFLibrary(), "getJSFLibraryByID", 1, 1); //$NON-NLS-1$
-		addEParameter(op, ecorePackage.getEString(), "ID", 1, 1); //$NON-NLS-1$
-
-		op = addEOperation(jsfLibraryRegistryEClass, ecorePackage.getEEList(), "getJSFLibrariesByName", 1, 1); //$NON-NLS-1$
-		addEParameter(op, ecorePackage.getEString(), "name", 1, 1); //$NON-NLS-1$
-
-		addEOperation(jsfLibraryRegistryEClass, ecorePackage.getEEList(), "getImplJSFLibraries", 1, 1); //$NON-NLS-1$
-
-		addEOperation(jsfLibraryRegistryEClass, ecorePackage.getEEList(), "getNonImplJSFLibraries", 1, 1); //$NON-NLS-1$
-
-		addEOperation(jsfLibraryRegistryEClass, ecorePackage.getEEList(), "getAllJSFLibraries", 1, 1); //$NON-NLS-1$
-
-		op = addEOperation(jsfLibraryRegistryEClass, ecorePackage.getEBoolean(), "addJSFLibrary", 1, 1); //$NON-NLS-1$
-		addEParameter(op, this.getJSFLibrary(), "library", 1, 1); //$NON-NLS-1$
-
-		op = addEOperation(jsfLibraryRegistryEClass, ecorePackage.getEBoolean(), "removeJSFLibrary", 1, 1); //$NON-NLS-1$
-		addEParameter(op, this.getJSFLibrary(), "library", 1, 1); //$NON-NLS-1$
-
-		addEOperation(jsfLibraryRegistryEClass, this.getJSFLibrary(), "getDefaultImplementation", 1, 1); //$NON-NLS-1$
-
-		op = addEOperation(jsfLibraryRegistryEClass, null, "setDefaultImplementation"); //$NON-NLS-1$
-		addEParameter(op, this.getJSFLibrary(), "implementation", 1, 1); //$NON-NLS-1$
-
-		initEClass(jsfLibraryEClass, JSFLibrary.class, "JSFLibrary", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEAttribute(getJSFLibrary_ID(), ecorePackage.getEString(), "ID", "", 0, 1, JSFLibrary.class, IS_TRANSIENT, !IS_VOLATILE, !IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$
-		initEAttribute(getJSFLibrary_Name(), ecorePackage.getEString(), "Name", null, 1, 1, JSFLibrary.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEAttribute(getJSFLibrary_JSFVersion(), this.getJSFVersion(), "JSFVersion", "UNKNOWN", 1, 1, JSFLibrary.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$
-		initEAttribute(getJSFLibrary_Deployed(), ecorePackage.getEBoolean(), "Deployed", "true", 1, 1, JSFLibrary.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$
-		initEAttribute(getJSFLibrary_Implementation(), ecorePackage.getEBoolean(), "Implementation", "false", 1, 1, JSFLibrary.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$
-		initEReference(getJSFLibrary_ArchiveFiles(), this.getArchiveFile(), this.getArchiveFile_JSFLibrary(), "ArchiveFiles", null, 0, -1, JSFLibrary.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-		op = addEOperation(jsfLibraryEClass, ecorePackage.getEBoolean(), "containsArchiveFile", 1, 1); //$NON-NLS-1$
-		addEParameter(op, ecorePackage.getEString(), "fullPath", 1, 1); //$NON-NLS-1$
-
-		addEOperation(jsfLibraryEClass, this.getJSFLibrary(), "getWorkingCopy", 1, 1); //$NON-NLS-1$
-
-		op = addEOperation(jsfLibraryEClass, null, "updateValues"); //$NON-NLS-1$
-		addEParameter(op, this.getJSFLibrary(), "otherLibrary", 1, 1); //$NON-NLS-1$
-
-		op = addEOperation(jsfLibraryEClass, ecorePackage.getEBoolean(), "copyTo", 1, 1); //$NON-NLS-1$
-		addEParameter(op, ecorePackage.getEString(), "baseDestLocation", 1, 1); //$NON-NLS-1$
-
-		addEOperation(jsfLibraryEClass, ecorePackage.getEString(), "getLabel", 1, 1); //$NON-NLS-1$
-
-		initEClass(pluginProvidedJSFLibraryEClass, PluginProvidedJSFLibrary.class, "PluginProvidedJSFLibrary", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEAttribute(getPluginProvidedJSFLibrary_PluginID(), ecorePackage.getEString(), "pluginID", null, 1, 1, PluginProvidedJSFLibrary.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEAttribute(getPluginProvidedJSFLibrary_Label(), ecorePackage.getEString(), "Label", null, 1, 1, PluginProvidedJSFLibrary.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-		initEClass(archiveFileEClass, ArchiveFile.class, "ArchiveFile", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEAttribute(getArchiveFile_RelativeToWorkspace(), ecorePackage.getEBoolean(), "RelativeToWorkspace", "true", 1, 1, ArchiveFile.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$
-		initEAttribute(getArchiveFile_SourceLocation(), ecorePackage.getEString(), "SourceLocation", null, 1, 1, ArchiveFile.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEAttribute(getArchiveFile_RelativeDestLocation(), ecorePackage.getEString(), "RelativeDestLocation", null, 1, 1, ArchiveFile.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEReference(getArchiveFile_JSFLibrary(), this.getJSFLibrary(), this.getJSFLibrary_ArchiveFiles(), "JSFLibrary", null, 1, 1, ArchiveFile.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-		addEOperation(archiveFileEClass, ecorePackage.getEString(), "getName", 1, 1); //$NON-NLS-1$
-
-		addEOperation(archiveFileEClass, ecorePackage.getEString(), "getPath", 1, 1); //$NON-NLS-1$
-
-		addEOperation(archiveFileEClass, ecorePackage.getEBoolean(), "exists", 1, 1); //$NON-NLS-1$
-
-		op = addEOperation(archiveFileEClass, ecorePackage.getEBoolean(), "equals", 1, 1); //$NON-NLS-1$
-		addEParameter(op, ecorePackage.getEJavaObject(), "object", 1, 1); //$NON-NLS-1$
-
-		addEOperation(archiveFileEClass, ecorePackage.getEInt(), "hashCode", 1, 1); //$NON-NLS-1$
-
-		op = addEOperation(archiveFileEClass, ecorePackage.getEBoolean(), "copyTo", 1, 1); //$NON-NLS-1$
-		addEParameter(op, ecorePackage.getEString(), "baseDestLocation", 1, 1); //$NON-NLS-1$
-
-		addEOperation(archiveFileEClass, ecorePackage.getEString(), "getResolvedSourceLocation", 1, 1); //$NON-NLS-1$
-
-		// Initialize enums and add enum literals
-		initEEnum(jsfVersionEEnum, JSFVersion.class, "JSFVersion"); //$NON-NLS-1$
-		addEEnumLiteral(jsfVersionEEnum, JSFVersion.UNKNOWN_LITERAL);
-		addEEnumLiteral(jsfVersionEEnum, JSFVersion.V1_1_LITERAL);
-		addEEnumLiteral(jsfVersionEEnum, JSFVersion.V1_2_LITERAL);
-
-		// Create resource
-		createResource(eNS_URI);
-	}
-
-} //JSFLibraryRegistryPackageImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/impl/PluginProvidedJSFLibraryImpl.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/impl/PluginProvidedJSFLibraryImpl.java
deleted file mode 100644
index f4ed957..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/impl/PluginProvidedJSFLibraryImpl.java
+++ /dev/null
@@ -1,272 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl;
-
-import java.util.Iterator;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryFactory;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryPackage;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.PluginProvidedJSFLibrary;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Plugin Provided JSF Library</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.PluginProvidedJSFLibraryImpl#getPluginID <em>Plugin ID</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.PluginProvidedJSFLibraryImpl#getLabel <em>Label</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- * @deprecated
- */
-public class PluginProvidedJSFLibraryImpl extends JSFLibraryImpl implements PluginProvidedJSFLibrary {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-    @SuppressWarnings("hiding")
-	public static final String copyright = "Copyright (c) 2005 Oracle Corporation"; //$NON-NLS-1$
-
-	/**
-	 * The default value of the '{@link #getPluginID() <em>Plugin ID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPluginID()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String PLUGIN_ID_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getPluginID() <em>Plugin ID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPluginID()
-	 * @generated
-	 * @ordered
-	 */
-	protected String pluginID = PLUGIN_ID_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getLabel() <em>Label</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getLabel()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String LABEL_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getLabel() <em>Label</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getLabel()
-	 * @generated
-	 * @ordered
-	 */
-	protected String label = LABEL_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected PluginProvidedJSFLibraryImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-     * @return the static eclass 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return JSFLibraryRegistryPackage.Literals.PLUGIN_PROVIDED_JSF_LIBRARY;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-     * @return the plugin id 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getPluginID() {
-		return pluginID;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-     * @param newPluginID 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setPluginID(String newPluginID) {
-		String oldPluginID = pluginID;
-		pluginID = newPluginID;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, JSFLibraryRegistryPackage.PLUGIN_PROVIDED_JSF_LIBRARY__PLUGIN_ID, oldPluginID, pluginID));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @return translatable label
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String getLabel() {
-		if (label == null)
-			return super.getLabel();
-		return label;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setLabel(String newLabel) {
-		String oldLabel = label;
-		label = newLabel;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, JSFLibraryRegistryPackage.PLUGIN_PROVIDED_JSF_LIBRARY__LABEL, oldLabel, label));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case JSFLibraryRegistryPackage.PLUGIN_PROVIDED_JSF_LIBRARY__PLUGIN_ID:
-				return getPluginID();
-			case JSFLibraryRegistryPackage.PLUGIN_PROVIDED_JSF_LIBRARY__LABEL:
-				return getLabel();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case JSFLibraryRegistryPackage.PLUGIN_PROVIDED_JSF_LIBRARY__PLUGIN_ID:
-				setPluginID((String)newValue);
-				return;
-			case JSFLibraryRegistryPackage.PLUGIN_PROVIDED_JSF_LIBRARY__LABEL:
-				setLabel((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case JSFLibraryRegistryPackage.PLUGIN_PROVIDED_JSF_LIBRARY__PLUGIN_ID:
-				setPluginID(PLUGIN_ID_EDEFAULT);
-				return;
-			case JSFLibraryRegistryPackage.PLUGIN_PROVIDED_JSF_LIBRARY__LABEL:
-				setLabel(LABEL_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case JSFLibraryRegistryPackage.PLUGIN_PROVIDED_JSF_LIBRARY__PLUGIN_ID:
-				return PLUGIN_ID_EDEFAULT == null ? pluginID != null : !PLUGIN_ID_EDEFAULT.equals(pluginID);
-			case JSFLibraryRegistryPackage.PLUGIN_PROVIDED_JSF_LIBRARY__LABEL:
-				return LABEL_EDEFAULT == null ? label != null : !LABEL_EDEFAULT.equals(label);
-		}
-		return super.eIsSet(featureID);
-	}
-	
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String getID() {
-		return getPluginID() + ID_SEPARATOR + getName();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @return the working copy 
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public JSFLibrary getWorkingCopy() {
-		PluginProvidedJSFLibrary workingCopyLib = JSFLibraryRegistryFactory.eINSTANCE.createPluginProvidedJSFLibrary();
-//		workingCopyLib.setID(getID());
-		workingCopyLib.setName(getName());
-		if (label != null) workingCopyLib.setLabel(getLabel());
-		workingCopyLib.setJSFVersion(getJSFVersion());
-		workingCopyLib.setDeployed(isDeployed());
-		workingCopyLib.setImplementation(isImplementation());
-		workingCopyLib.setPluginID(getPluginID());
-		Iterator itArchiveFiles = getArchiveFiles().iterator();
-		while (itArchiveFiles.hasNext()) {
-			ArchiveFile srcArchiveFile = (ArchiveFile)itArchiveFiles.next();
-			ArchiveFile destArchiveFile = JSFLibraryRegistryFactory.eINSTANCE.createArchiveFile();
-			destArchiveFile.setRelativeToWorkspace(srcArchiveFile.isRelativeToWorkspace());
-			destArchiveFile.setSourceLocation(srcArchiveFile.getSourceLocation());
-			destArchiveFile.setRelativeDestLocation(srcArchiveFile.getRelativeDestLocation());
-			workingCopyLib.getArchiveFiles().add(destArchiveFile);
-		}
-		return workingCopyLib;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-     * @return the string representation 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (pluginID: "); //$NON-NLS-1$
-		result.append(pluginID);
-		result.append(", Label: "); //$NON-NLS-1$
-		result.append(label);
-		result.append(')');
-		return result.toString();
-	}
-
-} //PluginProvidedJSFLibraryImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/util/JSFLibraryRegistryAdapterFactory.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/util/JSFLibraryRegistryAdapterFactory.java
deleted file mode 100644
index 5a89728..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/util/JSFLibraryRegistryAdapterFactory.java
+++ /dev/null
@@ -1,186 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.internal.jsflibraryregistry.util;
-
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.common.notify.Notifier;
-import org.eclipse.emf.common.notify.impl.AdapterFactoryImpl;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistry;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryPackage;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.PluginProvidedJSFLibrary;
-
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Adapter Factory</b> for the model.
- * It provides an adapter <code>createXXX</code> method for each class of the model.
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryPackage
- * @generated
- * @deprecated
- */
-public class JSFLibraryRegistryAdapterFactory extends AdapterFactoryImpl {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005 Oracle Corporation"; //$NON-NLS-1$
-
-	/**
-	 * The cached model package.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected static JSFLibraryRegistryPackage modelPackage;
-
-	/**
-	 * Creates an instance of the adapter factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public JSFLibraryRegistryAdapterFactory() {
-		if (modelPackage == null) {
-			modelPackage = JSFLibraryRegistryPackage.eINSTANCE;
-		}
-	}
-
-	/**
-	 * Returns whether this factory is applicable for the type of the object.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns <code>true</code> if the object is either the model's package or is an instance object of the model.
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @return whether this factory is applicable for the type of the object.
-	 * @generated
-	 */
-	public boolean isFactoryForType(Object object) {
-		if (object == modelPackage) {
-			return true;
-		}
-		if (object instanceof EObject) {
-			return ((EObject)object).eClass().getEPackage() == modelPackage;
-		}
-		return false;
-	}
-
-	/**
-	 * The switch the delegates to the <code>createXXX</code> methods.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected JSFLibraryRegistrySwitch modelSwitch =
-		new JSFLibraryRegistrySwitch() {
-			public Object caseJSFLibraryRegistry(JSFLibraryRegistry object) {
-				return createJSFLibraryRegistryAdapter();
-			}
-			public Object caseJSFLibrary(JSFLibrary object) {
-				return createJSFLibraryAdapter();
-			}
-			public Object casePluginProvidedJSFLibrary(PluginProvidedJSFLibrary object) {
-				return createPluginProvidedJSFLibraryAdapter();
-			}
-			public Object caseArchiveFile(ArchiveFile object) {
-				return createArchiveFileAdapter();
-			}
-			public Object defaultCase(EObject object) {
-				return createEObjectAdapter();
-			}
-		};
-
-	/**
-	 * Creates an adapter for the <code>target</code>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param target the object to adapt.
-	 * @return the adapter for the <code>target</code>.
-	 * @generated
-	 */
-	public Adapter createAdapter(Notifier target) {
-		return (Adapter)modelSwitch.doSwitch((EObject)target);
-	}
-
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistry <em>JSF Library Registry</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistry
-	 * @generated
-	 */
-	public Adapter createJSFLibraryRegistryAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary <em>JSF Library</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary
-	 * @generated
-	 */
-	public Adapter createJSFLibraryAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile <em>Archive File</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile
-	 * @generated
-	 */
-	public Adapter createArchiveFileAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.PluginProvidedJSFLibrary <em>Plugin Provided JSF Library</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.PluginProvidedJSFLibrary
-	 * @generated
-	 */
-	public Adapter createPluginProvidedJSFLibraryAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for the default case.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @generated
-	 */
-	public Adapter createEObjectAdapter() {
-		return null;
-	}
-
-} //JSFLibraryRegistryAdapterFactory
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/util/JSFLibraryRegistryResourceFactoryImpl.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/util/JSFLibraryRegistryResourceFactoryImpl.java
deleted file mode 100644
index 321c2b7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/util/JSFLibraryRegistryResourceFactoryImpl.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.internal.jsflibraryregistry.util;
-
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.resource.impl.ResourceFactoryImpl;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Resource Factory</b> associated with the package.
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.util.JSFLibraryRegistryResourceImpl
- * @generated
- * @deprecated
- */
-public class JSFLibraryRegistryResourceFactoryImpl extends ResourceFactoryImpl {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005 Oracle Corporation"; //$NON-NLS-1$
-
-	/**
-	 * Creates an instance of the resource factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public JSFLibraryRegistryResourceFactoryImpl() {
-		super();
-	}
-
-	/**
-	 * Creates an instance of the resource.
-	 * <!-- begin-user-doc -->
-     * @param uri 
-     * @return the Resource
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Resource createResource(URI uri) {
-		Resource result = new JSFLibraryRegistryResourceImpl(uri);
-		return result;
-	}
-
-} //JSFLibraryRegistryResourceFactoryImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/util/JSFLibraryRegistryResourceImpl.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/util/JSFLibraryRegistryResourceImpl.java
deleted file mode 100644
index 21ab701..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/util/JSFLibraryRegistryResourceImpl.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.internal.jsflibraryregistry.util;
-
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.xmi.impl.XMLResourceImpl;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Resource </b> associated with the package.
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.util.JSFLibraryRegistryResourceFactoryImpl
- * @generated
- * @deprecated
- */
-public class JSFLibraryRegistryResourceImpl extends XMLResourceImpl {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005 Oracle Corporation"; //$NON-NLS-1$
-
-	/**
-	 * Creates an instance of the resource.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param uri the URI of the new resource.
-	 * @generated
-	 */
-	public JSFLibraryRegistryResourceImpl(URI uri) {
-		super(uri);
-	}
-
-} //JSFLibraryRegistryResourceImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/util/JSFLibraryRegistrySwitch.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/util/JSFLibraryRegistrySwitch.java
deleted file mode 100644
index acda869..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/util/JSFLibraryRegistrySwitch.java
+++ /dev/null
@@ -1,213 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.internal.jsflibraryregistry.util;
-
-import java.util.List;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistry;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryPackage;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.PluginProvidedJSFLibrary;
-
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Switch</b> for the model's inheritance hierarchy.
- * It supports the call {@link #doSwitch(EObject) doSwitch(object)}
- * to invoke the <code>caseXXX</code> method for each class of the model,
- * starting with the actual class of the object
- * and proceeding up the inheritance hierarchy
- * until a non-null result is returned,
- * which is the result of the switch.
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryPackage
- * @generated
- * @deprecated
- */
-public class JSFLibraryRegistrySwitch {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005 Oracle Corporation"; //$NON-NLS-1$
-
-	/**
-	 * The cached model package
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected static JSFLibraryRegistryPackage modelPackage;
-
-	/**
-	 * Creates an instance of the switch.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public JSFLibraryRegistrySwitch() {
-		if (modelPackage == null) {
-			modelPackage = JSFLibraryRegistryPackage.eINSTANCE;
-		}
-	}
-
-	/**
-	 * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
-	 * <!-- begin-user-doc -->
-     * @param theEObject 
- 	 * <!-- end-user-doc -->
-	 * @return the first non-null result returned by a <code>caseXXX</code> call.
-	 * @generated
-	 */
-	public Object doSwitch(EObject theEObject) {
-		return doSwitch(theEObject.eClass(), theEObject);
-	}
-
-	/**
-	 * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
-	 * <!-- begin-user-doc -->
-     * @param theEClass 
-     * @param theEObject 
- 	 * <!-- end-user-doc -->
-	 * @return the first non-null result returned by a <code>caseXXX</code> call.
-	 * @generated
-	 */
-	protected Object doSwitch(EClass theEClass, EObject theEObject) {
-		if (theEClass.eContainer() == modelPackage) {
-			return doSwitch(theEClass.getClassifierID(), theEObject);
-		}
-        List eSuperTypes = theEClass.getESuperTypes();
-        return
-        	eSuperTypes.isEmpty() ?
-        		defaultCase(theEObject) :
-        		doSwitch((EClass)eSuperTypes.get(0), theEObject);
-	}
-
-	/**
-	 * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
-	 * <!-- begin-user-doc -->
-     * @param classifierID 
-     * @param theEObject 
- 	 * <!-- end-user-doc -->
-	 * @return the first non-null result returned by a <code>caseXXX</code> call.
-	 * @generated
-	 */
-	protected Object doSwitch(int classifierID, EObject theEObject) {
-		switch (classifierID) {
-			case JSFLibraryRegistryPackage.JSF_LIBRARY_REGISTRY: {
-				JSFLibraryRegistry jsfLibraryRegistry = (JSFLibraryRegistry)theEObject;
-				Object result = caseJSFLibraryRegistry(jsfLibraryRegistry);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case JSFLibraryRegistryPackage.JSF_LIBRARY: {
-				JSFLibrary jsfLibrary = (JSFLibrary)theEObject;
-				Object result = caseJSFLibrary(jsfLibrary);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case JSFLibraryRegistryPackage.PLUGIN_PROVIDED_JSF_LIBRARY: {
-				PluginProvidedJSFLibrary pluginProvidedJSFLibrary = (PluginProvidedJSFLibrary)theEObject;
-				Object result = casePluginProvidedJSFLibrary(pluginProvidedJSFLibrary);
-				if (result == null) result = caseJSFLibrary(pluginProvidedJSFLibrary);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case JSFLibraryRegistryPackage.ARCHIVE_FILE: {
-				ArchiveFile archiveFile = (ArchiveFile)theEObject;
-				Object result = caseArchiveFile(archiveFile);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			default: return defaultCase(theEObject);
-		}
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>JSF Library Registry</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpretting the object as an instance of '<em>JSF Library Registry</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseJSFLibraryRegistry(JSFLibraryRegistry object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>JSF Library</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpretting the object as an instance of '<em>JSF Library</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseJSFLibrary(JSFLibrary object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Archive File</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpretting the object as an instance of '<em>Archive File</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseArchiveFile(ArchiveFile object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Plugin Provided JSF Library</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpretting the object as an instance of '<em>Plugin Provided JSF Library</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object casePluginProvidedJSFLibrary(PluginProvidedJSFLibrary object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>EObject</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch, but this is the last case anyway.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpretting the object as an instance of '<em>EObject</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject)
-	 * @generated
-	 */
-	public Object defaultCase(EObject object) {
-		return null;
-	}
-
-} //JSFLibraryRegistrySwitch
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/util/JSFLibraryRegistryUpgradeUtil.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/util/JSFLibraryRegistryUpgradeUtil.java
deleted file mode 100644
index a46aa59..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/util/JSFLibraryRegistryUpgradeUtil.java
+++ /dev/null
@@ -1,235 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.core.internal.jsflibraryregistry.util;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.net.MalformedURLException;
-import java.net.URL;
-
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-
-/**
- * Utility for checking for, and upgrading the JSF Library Registry when the EMF model changes.
- * @deprecated
- */
-public class JSFLibraryRegistryUpgradeUtil {	
-	static String v1Tov2UpgradeURL = "http://www.eclipse.org/JSFxxxxxxxxxxxxxxxxxxxxxx"; //$NON-NLS-1$
-	
-	/**
-	 * default state is OK, no upgrade
-	 */
-	private UpgradeStatus	upgradeStatus;
-
-	/**
-	 * The workspace-relative part of the URL of the JSF Library Registry 
-	 * persistence store. (version 1)
-	 */
-	public static final String JSF_LIBRARY_REGISTRY_V1_URL = ".metadata/.plugins/org.eclipse.jst.jsf.core/JSFLibraryRegistry.xml"; //$NON-NLS-1$
-
-	/**
-	 * The workspace-relative part of the URL of the JSF Library Registry 
-	 * persistence store. (version 2)
-	 */
-	public static final String JSF_LIBRARY_REGISTRY_V2_URL = ".metadata/.plugins/org.eclipse.jst.jsf.core/JSFLibraryRegistryV2.xml"; //$NON-NLS-1$
-
-	/**
-	 * The LATEST VERSION of the workspace-relative part of the URL of the JSF Library Registry 
-	 * persistence store. 
-	 */
-	public static final String JSF_LIBRARY_REGISTRY_LATESTVERSION_URL = JSF_LIBRARY_REGISTRY_V2_URL;
-	/**
-	 * The latest version value.
-	 */
-	public static final int	   LATESTVERSION = 2;
-
-	private static final int NO_VERSION = 0;
-	
-	private static JSFLibraryRegistryUpgradeUtil INSTANCE;
-		
-	/**
-	 * @return the stateful runtime singleton
-	 */
-	public static synchronized JSFLibraryRegistryUpgradeUtil getInstance(){
-		if (INSTANCE == null){
-			INSTANCE = new JSFLibraryRegistryUpgradeUtil();
-		}
-		return INSTANCE;
-	}
-	
-	/**
-	 * Return the URI for the specified JSF Library Registry
-	 * @param registryVersion
-	 * @return URI 
-	 * @throws MalformedURLException
-	 */
-	public static URI getRegistryURI(String registryVersion) throws MalformedURLException {
-		URL jsfLibRegURL = new URL(Platform.getInstanceLocation().getURL(), registryVersion);
-		return URI.createURI(jsfLibRegURL.toString());
-	}
-	
-	/**
-	 * @param originalFile
-	 * @return the backup file name for a file
-	 */
-	public static String getBackupFileName(final String originalFile)
-	{
-	    return originalFile.concat(".bkp"); //$NON-NLS-1$
-	}
-	
-	/**
-	 * Upgrades the JSF Library registry from oldest to newest
-	 * @param expectedVersion 
-	 */
-	public void upgradeRegistryIfNecessary(int expectedVersion) {
-		//when adding upgrades, the upgrades should progress from oldest to newest
-		try
-		{
-			int curVersion = getCurVersion();
-			
-			if (curVersion < expectedVersion && curVersion != NO_VERSION)
-			{
-				UpgradeOperation op = getUpgradeOperation(curVersion);
-				
-				if (op.canExecute())
-				{
-					try
-					{
-						// TODO: when move to Java 5, use co-variant return
-						upgradeStatus = (UpgradeStatus)
-							op.execute(new NullProgressMonitor(), null);
-						upgradeStatus.setUpgradeOperation(op);
-					}
-					catch (ExecutionException e)
-					{
-						// should never happen since we control the URL's
-						JSFCorePlugin.log(IStatus.ERROR, "Error during loading JSF Library registry", e); //$NON-NLS-1$
-						//TODO: flag failure in status
-						upgradeStatus = 
-							new UpgradeStatus(IStatus.ERROR, true, Messages.JSFLibraryRegistryUpgradeUtil_Error); 
-					}
-				}
-				else
-				{
-    				// TODO: what if can't execute?
-                    upgradeStatus = 
-                        new UpgradeStatus(IStatus.ERROR, false, Messages.JSFLibraryRegistryUpgradeUtil_Error); 				}
-			}
-			else
-			{
-			    // everything ok, not upgrade
-			    upgradeStatus = new UpgradeStatus();
-			}
-		}
-	    catch (MalformedURLException e) {	
-			// should never happen since we control the URL's
-			JSFCorePlugin.log(IStatus.ERROR, "Error during loading JSF Library registry", e); //$NON-NLS-1$
-		}
-	}
-
-	private int getCurVersion() throws MalformedURLException
-	{
-		// TODO: need generalized algorithm here
-		URI v2File = getRegistryURI(JSF_LIBRARY_REGISTRY_V2_URL);
-		File file = new File(v2File.toFileString());
-		if (file.exists())
-		{
-			return 2;
-		}
-		
-		URI v1File = getRegistryURI(JSF_LIBRARY_REGISTRY_V1_URL);
-		file = new File(v1File.toFileString());
-		if (file.exists())
-		{
-			return 1;
-		}
-		return NO_VERSION;
-	}
-	
-	/**
-	 * @param curVersion
-	 * @return the upgrade operation to move from curVersion to the latest
-	 * @throws MalformedURLException
-	 */
-	protected UpgradeOperation getUpgradeOperation(int curVersion) throws MalformedURLException
-	{
-		UpgradeOperation  op = new UpgradeOperation(Messages.JSFLibraryRegistryUpgradeUtil_Operation); 
-		switch(curVersion)
-		{
-			case 1:
-				op.addVersionUpgrade(
-						new MigrateV1toV2Operation(Messages.JSFLibraryRegistryUpgradeUtil_v1Tov2Operation 
-								,getRegistryURI(JSF_LIBRARY_REGISTRY_V1_URL)
-								, getRegistryURI(JSF_LIBRARY_REGISTRY_V2_URL)));
-		}
-		
-		return op;
-	}
-	
-	
-	/**
-	 * @return array of {@link UpgradeStatus}s.  There can be more than one if the registry has been upgraded by more than one version.
-	 * Will not be null.   
-	 */
-	public UpgradeStatus getUpgradeStatus(){
-		return this.upgradeStatus;
-	}
-
-	static void deleteFile(String fileName) {
-		File f = new File(fileName);
-		if (f.exists()){
-			f.delete();
-			if (f.exists())
-				f.deleteOnExit();
-		}
-	}
-
-	static void copyFile(String srcFileName, String destFileName) {
-	
-		File srcFile = new File(srcFileName);
-		File destFile = new File(destFileName);
-		FileInputStream from = null;
-		FileOutputStream to = null;
-		try {
-			from = new FileInputStream(srcFile);
-			to = new FileOutputStream(destFile);
-			byte[] buffer = new byte[4096];
-			int bytesRead;
-
-			while ((bytesRead = from.read(buffer)) != -1)
-				to.write(buffer, 0, bytesRead); // write
-		} catch (IOException ioe){
-			JSFCorePlugin.log(ioe, "Error during file copy"); //$NON-NLS-1$
-		} finally {
-			if (from != null)
-				try {
-					from.close();
-				} catch (IOException e) {
-		            JSFCorePlugin.log(e, "Error during file close"); //$NON-NLS-1$
-				}
-			if (to != null)
-				try {
-					to.close();
-				} catch (IOException e) {
-                    JSFCorePlugin.log(e, "Error during file close"); //$NON-NLS-1$
-				}
-		}
-
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/util/JSFLibraryRegistryXMLProcessor.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/util/JSFLibraryRegistryXMLProcessor.java
deleted file mode 100644
index f2b268b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/util/JSFLibraryRegistryXMLProcessor.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: JSFLibraryRegistryXMLProcessor.java,v 1.4 2008/11/18 22:23:53 gkessler Exp $
- */
-package org.eclipse.jst.jsf.core.internal.jsflibraryregistry.util;
-
-import java.util.Map;
-
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.xmi.util.XMLProcessor;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryPackage;
-
-/**
- * This class contains helper methods to serialize and deserialize XML documents
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- * @deprecated
- */
-public class JSFLibraryRegistryXMLProcessor extends XMLProcessor {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005 Oracle Corporation"; //$NON-NLS-1$
-
-
-	/**
-	 * Public constructor to instantiate the helper.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public JSFLibraryRegistryXMLProcessor() {
-		super((EPackage.Registry.INSTANCE));
-		JSFLibraryRegistryPackage.eINSTANCE.eClass();
-	}
-	
-	/**
-	 * Register for "*" and "xml" file extensions the JSFLibraryRegistryResourceFactoryImpl factory.
-	 * <!-- begin-user-doc -->
-	 * @return Map of registrations 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected Map getRegistrations() {
-		if (registrations == null) {
-			super.getRegistrations();
-			registrations.put(XML_EXTENSION, new JSFLibraryRegistryResourceFactoryImpl());
-			registrations.put(STAR_EXTENSION, new JSFLibraryRegistryResourceFactoryImpl());
-		}
-		return registrations;
-	}
-
-} //JSFLibraryRegistryXMLProcessor
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/util/Messages.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/util/Messages.java
deleted file mode 100644
index a06c4f4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/util/Messages.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.core.internal.jsflibraryregistry.util;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- *  String resource handler.
- *
- */
-public class Messages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.jst.jsf.core.internal.jsflibraryregistry.util.messages"; //$NON-NLS-1$
-	/**
-	 * see messages.properties
-	 */
-	public static String JSFLibraryRegistryUpgradeUtil_Error;
-	/**
-	 * see messages.properties
-	 */
-	public static String JSFLibraryRegistryUpgradeUtil_Operation;
-	/**
-	 * see messages.properties
-	 */
-	public static String JSFLibraryRegistryUpgradeUtil_v1Tov2Operation;
-	/**
-	 * see messages.properties
-	 */
-	public static String UpgradeOperation_Success;
-	/**
-	 * see messages.properties
-	 */
-	public static String UpgradeStatus_Error;
-	/**
-	 * see messages.properties
-	 */
-	public static String UpgradeStatus_OK;
-	static {
-		// initialize resource bundle
-		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-	}
-
-	private Messages() {
-		//
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/util/MigrateV1toV2Operation.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/util/MigrateV1toV2Operation.java
deleted file mode 100644
index 1b1ace2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/util/MigrateV1toV2Operation.java
+++ /dev/null
@@ -1,125 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.core.internal.jsflibraryregistry.util;
-
-import java.io.IOException;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.xmi.XMLResource;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.core.internal.Messages;
-import org.eclipse.jst.jsf.core.internal.jsflibraryconfig.JSFLibraryRegistryUtil;
-
-/**
- * @deprecated
- */
-class MigrateV1toV2Operation extends VersionUpgradeOperation {
-
-	private final URI		_v1Registry;
-	private final URI		_v2Registry;
-	
-	/**
-	 * @param label
-	 * @param v1Registry
-	 * @param v2Registry 
-	 */
-	public MigrateV1toV2Operation(String label, URI v1Registry, URI v2Registry) {
-		super(label, 1, 2);
-		_v1Registry = v1Registry;
-		_v2Registry = v2Registry;
-	}
-
-	public IStatus doCommit() {
-		JSFLibraryRegistryUpgradeUtil.deleteFile(_v1Registry.toFileString());
-		return Status.OK_STATUS;
-	}
-
-	public IStatus doExecute(IProgressMonitor monitor, IAdaptable info)
-	{
-		JSFLibraryRegistryUpgradeUtil.copyFile
-			(_v1Registry.toFileString(), JSFLibraryRegistryUpgradeUtil.getBackupFileName(_v1Registry.toFileString()));
-		JSFLibraryRegistryResourceFactoryImpl resourceFactory = new JSFLibraryRegistryResourceFactoryImpl();
-		JSFLibraryRegistryResourceImpl res = (JSFLibraryRegistryResourceImpl)resourceFactory.createResource(_v1Registry);
-		try {
-			URI newRegURI = 
-				JSFLibraryRegistryUpgradeUtil.getRegistryURI
-					(JSFLibraryRegistryUpgradeUtil.JSF_LIBRARY_REGISTRY_V2_URL);
-			Map options = new HashMap();
-			//disable notifications during load to avoid changing stored default implementation
-			options.put(XMLResource.OPTION_DISABLE_NOTIFY, Boolean.TRUE);
-			res.load(options);
-			//if we got this far then the registry was empty
-			//"upgrade" to v2 and then delete old.   no point in upgrade status being sent
-			JSFLibraryRegistryUtil.getInstance().saveJSFLibraryRegistry();
-			JSFLibraryRegistryUpgradeUtil.copyFile(_v1Registry.toFileString(), newRegURI.toFileString());//save as v2 file	
-			JSFLibraryRegistryUpgradeUtil.deleteFile(_v1Registry.toFileString());
-
-			return new UpgradeStatus();//all is ok and no need to alert user
-			
-		} catch(IOException ioe) {
-			//this was expected... if there was actual v1 contents in the regsistry... upgrade by saving
-			//perform save which will lose the ID
-			try {
-				res.save(Collections.EMPTY_MAP);
-				//create v2 xml file
-				URI newRegURI = 
-					JSFLibraryRegistryUpgradeUtil.getRegistryURI
-						(JSFLibraryRegistryUpgradeUtil.JSF_LIBRARY_REGISTRY_V2_URL);
-				JSFLibraryRegistryUpgradeUtil.copyFile(_v1Registry.toFileString(), newRegURI.toFileString());
-				//delete upgraded v1
-				JSFLibraryRegistryUpgradeUtil.deleteFile(_v1Registry.toFileString());
-				//restore backup to v1 name
-				JSFLibraryRegistryUpgradeUtil.copyFile(_v1Registry.toFileString().concat(".bkp"), _v1Registry.toFileString()); //$NON-NLS-1$
-				//Alert end user
-				return new UpgradeStatus(IStatus.OK, true, Messages.JSFRegistryMigration05_to_10_customMessage);
-			} catch(IOException e) {
-				JSFCorePlugin.log(IStatus.ERROR, "Error during repository upgrade from v1 to v2", e); //$NON-NLS-1$
-				return new UpgradeStatus(IStatus.ERROR, false, 	
-						Messages.JSFRegistryMigrationCannot05_to_10_customMessage);
-			}
-		}
-		//return ;
-	}
-
-	public IStatus doRedo(IProgressMonitor monitor, IAdaptable info)
-			throws ExecutionException {
-		return doExecute(monitor, info);
-	}
-
-	
-	public boolean canUndo() {
-		// commit is undoable for this operation
-		return super.canUndo() && !hasCommitted();
-	}
-
-	public IStatus doUndo(IProgressMonitor monitor, IAdaptable info)
-			throws ExecutionException 
-	{
-		//restore backup to v1 name
-		JSFLibraryRegistryUpgradeUtil.copyFile(_v1Registry.toFileString().concat(".bkp"), _v1Registry.toFileString()); //$NON-NLS-1$
-
-		// delete the new registry 
-		JSFLibraryRegistryUpgradeUtil.deleteFile(_v2Registry.toFileString());
-		
-		//and the backup
-		JSFLibraryRegistryUpgradeUtil.deleteFile(_v1Registry.toFileString().concat(".bkp")); //$NON-NLS-1$
-		
-		return Status.OK_STATUS;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/util/UpgradeOperation.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/util/UpgradeOperation.java
deleted file mode 100644
index 205f3b8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/util/UpgradeOperation.java
+++ /dev/null
@@ -1,217 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.core.internal.jsflibraryregistry.util;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.commands.operations.AbstractOperation;
-import org.eclipse.core.commands.operations.IUndoableOperation;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-
-/**
- * Encapsulates a chain of one or more version steps into a full upgrade.
- * 
- * @author cbateman
- * @deprecated
- */
-public class UpgradeOperation extends AbstractOperation {
-
-	private final List/*<VersionUpgradeOperation*/ _stepOperations;
-
-	/**
-	 * @param label
-	 */
-	public UpgradeOperation(String label) {
-		super(label);
-		_stepOperations = new ArrayList();
-	}
-
-	/**
-	 * Add upgrade operation to the list of operations.
-	 * Execute, undo and redo call each operation's corresponding
-	 * method in the order they are added to the list.
-	 * @param operation
-	 */
-	public void addVersionUpgrade(VersionUpgradeOperation operation)
-	{
-		_stepOperations.add(operation);
-	}
-	
-	/**
-	 * @param monitor 
-	 * @param info 
-	 * @return an OK status if all goes well.  The status for the first op
-	 * that fails otherwise.
-	 * @throws ExecutionException 
-	 */
-	public IStatus execute(IProgressMonitor monitor, IAdaptable info)
-			throws ExecutionException {
-	    
-	    boolean upgraded = false;
-	    
-		for (final Iterator it = _stepOperations.iterator(); it.hasNext();)
-		{
-			VersionUpgradeOperation op = (VersionUpgradeOperation) it.next();
-			// TODO: move to covariant
-			UpgradeStatus status = (UpgradeStatus) op.execute(monitor, info);
-			
-			// fail fast
-			if (status.getSeverity() != IStatus.OK)
-			{
-				return status;
-			}
-			
-			// once an upgrade is flagged, set flag
-			if (status.isUpgradeOccurred())
-			{
-			    upgraded = true;
-			}
-		}
-
-		return new UpgradeStatus(IStatus.OK, upgraded, Messages.UpgradeOperation_Success); 
-	}
-
-	/**
-	 * @param monitor 
-	 * @param info 
-	 * @return an OK status if all goes well.  The status for the first op
-	 * that fails otherwise.
-	 * @throws ExecutionException 
-	 */
-	public IStatus redo(IProgressMonitor monitor, IAdaptable info)
-			throws ExecutionException {
-		for (final Iterator it = _stepOperations.iterator(); it.hasNext();)
-		{
-			VersionUpgradeOperation op = (VersionUpgradeOperation) it.next();
-			IStatus status = op.redo(monitor, info);
-			
-			// fail fast
-			if (status.getSeverity() != IStatus.OK)
-			{
-				return status;
-			}
-		}
-		
-		return new UpgradeStatus(IStatus.OK, true, Messages.UpgradeOperation_Success); 
-	}
-
-	/**
-	 * @param monitor 
-	 * @param info 
-	 * @return an OK status if all goes well.  The status for the first op
-	 * that fails otherwise.
-	 * @throws ExecutionException 
-	 */
-	public IStatus undo(IProgressMonitor monitor, IAdaptable info)
-			throws ExecutionException {
-		for (final Iterator it = _stepOperations.iterator(); it.hasNext();)
-		{
-			VersionUpgradeOperation op = (VersionUpgradeOperation) it.next();
-			IStatus status = op.undo(monitor, info);
-			
-			// fail fast
-			if (status.getSeverity() != IStatus.OK)
-			{
-				return status;
-			}
-		}
-		
-		return Status.OK_STATUS;
-	}
-
-	/**
-	 * @return an OK status if all goes well.  The status for the first op
-	 * that fails otherwise.
-	 * @throws ExecutionException 
-	 */
-	public IStatus commit() throws ExecutionException
-	{
-		for (final Iterator it = _stepOperations.iterator(); it.hasNext();)
-		{
-			VersionUpgradeOperation op = (VersionUpgradeOperation) it.next();
-			
-			if (op.canCommit())
-			{
-				IStatus status = op.commit();
-				
-				// fail fast
-				if (status.getSeverity() != IStatus.OK)
-				{
-					return status;
-				}
-			}
-		}
-		
-		return Status.OK_STATUS;
-	}
-
-	public boolean canExecute()
-	{
-		for (final Iterator it = _stepOperations.iterator(); it.hasNext();)
-		{
-			IUndoableOperation op = (IUndoableOperation) it.next();
-			
-			// fail fast
-			if (!op.canExecute())
-			{
-				return false;
-			}
-		}
-		
-		return true;
-	}
-
-	public boolean canRedo() {
-		for (final Iterator it = _stepOperations.iterator(); it.hasNext();)
-		{
-			IUndoableOperation op = (IUndoableOperation) it.next();
-			
-			// fail fast
-			if (!op.canRedo())
-			{
-				return false;
-			}
-		}
-		
-		return true;
-	}
-
-	public boolean canUndo() {
-		for (final Iterator it = _stepOperations.iterator(); it.hasNext();)
-		{
-			IUndoableOperation op = (IUndoableOperation) it.next();
-			
-			// fail fast
-			if (!op.canUndo())
-			{
-				return false;
-			}
-		}
-		
-		return true;
-	}
-
-	public void dispose() 
-	{
-		for (final Iterator it = _stepOperations.iterator(); it.hasNext();)
-		{
-			IUndoableOperation op = (IUndoableOperation) it.next();
-			op.dispose();
-		}
-	}
-	
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/util/UpgradeStatus.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/util/UpgradeStatus.java
deleted file mode 100644
index 30a42e1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/util/UpgradeStatus.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.core.internal.jsflibraryregistry.util;
-
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-
-/**
- * Communicates the status of the JSF Library Registry
- * @deprecated
- */
-public class UpgradeStatus extends Status
-{
-	private final boolean upgradeOccurred;
-	private UpgradeOperation  upgradeOperation;
-	
-	/**
-	 * All-is-well UpgradeStatus constructor 
-	 */
-	public UpgradeStatus(){		
-		super(IStatus.OK, JSFCorePlugin.getDefault().getPluginID(), Messages.UpgradeStatus_OK); 
-		this.upgradeOccurred = false;
-	}
-	
-	/**
-	 * Constructor when registry upgrade has occured or there is a problem during upgrade
-	 * @param severity 
-	 * @param upgradeOccurred flag
-	 * @param message 
-	 * 
-	 */
-	public UpgradeStatus(int severity, boolean upgradeOccurred, String message){	
-		super(severity, JSFCorePlugin.getDefault().getPluginID(), message);
-		this.upgradeOccurred = upgradeOccurred;
-	}
-
-	/**
-	 * @return true if a registry upgrade occurred
-	 */
-	public boolean isUpgradeOccurred() {
-		return upgradeOccurred;
-	}
-
-	/**
-	 * @return the operation used to do the upgrade.
-	 */
-	protected UpgradeOperation getUpgradeOperation() {
-		return upgradeOperation;
-	}
-	
-	void setUpgradeOperation(UpgradeOperation upgradeOperation)
-	{
-		this.upgradeOperation = upgradeOperation;
-	}
-	
-	/**
-	 * Commits any upgrade that has occurred
-	 * @return the result of the commit
-	 */
-	public IStatus commit()
-	{
-		if (upgradeOperation != null)
-		{
-			try
-			{
-				return upgradeOperation.commit();
-			}
-			catch (ExecutionException e)
-			{
-				return new Status(IStatus.ERROR, JSFCorePlugin.getDefault().getPluginID(), Messages.UpgradeStatus_Error, e);
-			}
-		}
-		return Status.OK_STATUS;
-	}
-	
-	/**
-	 * @return the result of rolling back any changes
-	 */
-	public IStatus rollback()
-	{
-		if (upgradeOperation != null)
-		{
-			try
-			{
-				return upgradeOperation.undo(new NullProgressMonitor(), null);
-			}
-			catch (ExecutionException e)
-			{
-				return new Status(IStatus.ERROR, JSFCorePlugin.getDefault().getPluginID(), Messages.UpgradeStatus_Error, e); 
-			}
-		}
-		return Status.OK_STATUS;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/util/VersionUpgradeOperation.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/util/VersionUpgradeOperation.java
deleted file mode 100644
index 48f5b40..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/util/VersionUpgradeOperation.java
+++ /dev/null
@@ -1,236 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.core.internal.jsflibraryregistry.util;
-
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.commands.operations.AbstractOperation;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-
-/**
- * Implements a single step (vX -> v(X+1)) version upgrade as an
- * Eclipse operation.  Adds an additional  "commit" abstract method.  This
- * can be called after execute in situations where further actions require
- * user approval etc.  See the javadocs for the method, it contains important
- * API rules
- * 
- * @author cbateman
- * @deprecated
- */
-public abstract class VersionUpgradeOperation extends AbstractOperation 
-{
-	/**
-	 * the version being upgraded from
-	 */
-	protected final int		_oldVersion;
-	/**
-	 * the version being upgraded to
-	 */
-	protected final int		_newVersion;
-	
-	private boolean				_hasExecuted;
-	private boolean				_hasCommitted;
-	private boolean				_hasCleanState = true;
-	
-	/**
-	 * @param label
-	 * @param oldVersion 
-	 * @param newVersion 
-	 */
-	public VersionUpgradeOperation(String label, int oldVersion, int newVersion) {
-		super(label);
-		_oldVersion = oldVersion;
-		_newVersion = newVersion;
-	}
-	
-	/**
-	 * Allows selected functionality to be called after execute is called.
-	 * Commit must conform to following contract:
-	 * 
-	 *  1) should do nothing if execute() has not been called.
-	 *  2) must do nothing if canCommit == false
-	 *  3) once executed, undo should undo commit() first, then execute()
-	 *  4) once undone, redo should call commit only if it was called before undo()
-	 * @return must conform to same contract as execute() 
-	 * @throws ExecutionException 
-	 *  
-	 */
-	public final IStatus commit() throws ExecutionException
-	{
-		if (canCommit())
-		{
-			IStatus result =  doCommit();
-			if (result.getSeverity() == IStatus.OK)
-			{
-				_hasCommitted = true;
-			}
-			else
-			{
-				_hasCommitted = false;
-				_hasCleanState = false;
-			}
-			return result;
-		}
-		throw new ExecutionException("Cannot execute"); //$NON-NLS-1$
-	}
-
-	/**
-	 * @return the result of the actual commit
-	 * @throws ExecutionException
-	 */
-	protected abstract IStatus doCommit() throws ExecutionException;
-
-	/**
-	 * @return true if the operation can be committed
-	 */
-	public boolean canCommit() 
-	{
-		return _hasExecuted && !_hasCommitted && _hasCleanState;
-	}
-
-	public final IStatus execute(IProgressMonitor monitor, IAdaptable info)
-			throws ExecutionException 
-	{
-		if (canExecute())
-		{
-			IStatus result = doExecute(monitor, info);
-			if (result.getSeverity() == IStatus.OK)
-			{
-				_hasExecuted = true;
-			}
-			else
-			{
-				_hasExecuted = false;
-				_hasCleanState = false;
-			}
-			return result;
-		}
-		throw new ExecutionException("Cannot execute"); //$NON-NLS-1$
-	}
-
-	/**
-	 * @param monitor
-	 * @param info
-	 * @return the status of the real execution
-	 * @throws ExecutionException 
-	 */
-	protected abstract IStatus doExecute(IProgressMonitor monitor, IAdaptable info)throws ExecutionException;
-
-	public final IStatus redo(IProgressMonitor monitor, IAdaptable info)
-			throws ExecutionException {
-		if (canRedo())
-		{
-			IStatus result = doRedo(monitor, info);
-			if (result.getSeverity() == IStatus.OK)
-			{
-				_hasExecuted = true;
-			}
-			else
-			{
-				_hasExecuted = false;
-				_hasCleanState = false;
-			}
-			return result;
-		}
-		throw new ExecutionException("Cannot redo"); //$NON-NLS-1$
-	}
-
-	/**
-	 * @param monitor
-	 * @param info
-	 * @return the status of the real redo
-	 * @throws ExecutionException 
-	 */
-	protected abstract IStatus doRedo(IProgressMonitor monitor, IAdaptable info) throws ExecutionException;
-
-	public final IStatus undo(IProgressMonitor monitor, IAdaptable info)
-			throws ExecutionException {
-		if (canUndo())
-		{
-			IStatus result = doUndo(monitor, info);
-			if (result.getSeverity() == IStatus.OK)
-			{
-				_hasExecuted = false;
-			}
-			else
-			{
-				_hasExecuted = true;
-				_hasCleanState = false;
-			}
-			return result;
-		}
-		throw new ExecutionException("Cannot redo"); //$NON-NLS-1$
-	}
-
-	/**
-	 * @param monitor
-	 * @param info
-	 * @return the status of the real redo
-	 * @throws ExecutionException 
-	 */
-	protected abstract IStatus doUndo(IProgressMonitor monitor, IAdaptable info) throws ExecutionException;
-
-	public boolean canExecute() {
-		return !_hasExecuted && _hasCleanState;
-	}
-
-	public boolean canRedo() {
-		return canExecute();
-	}
-
-	public boolean canUndo() {
-		return _hasExecuted && _hasCleanState;
-	}
-
-	/**
-	 * @param executed
-	 */
-	protected void setHasExecuted(boolean executed) {
-		_hasExecuted = executed;
-	}
-
-	/**
-	 * @param committed
-	 */
-	protected void setHasCommitted(boolean committed) {
-		_hasCommitted = committed;
-	}
-
-	/**
-	 * @param cleanState
-	 */
-	protected void setHasCleanState(boolean cleanState) {
-		_hasCleanState = cleanState;
-	}
-
-	/**
-	 * @return true if has executed
-	 */
-	protected boolean hasExecuted() {
-		return _hasExecuted;
-	}
-
-	/**
-	 * @return true if has committed
-	 */
-	protected boolean hasCommitted() {
-		return _hasCommitted;
-	}
-
-	/**
-	 * @return true if has clean state
-	 */
-	protected boolean hasCleanState() {
-		return _hasCleanState;
-	}
-	
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/util/messages.properties b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/util/messages.properties
deleted file mode 100644
index 8595e85..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/util/messages.properties
+++ /dev/null
@@ -1,6 +0,0 @@
-JSFLibraryRegistryUpgradeUtil_Error=Error detected during upgrade\!
-JSFLibraryRegistryUpgradeUtil_Operation=JSF Registry Upgrade
-JSFLibraryRegistryUpgradeUtil_v1Tov2Operation=Upgrade v1 to v2
-UpgradeOperation_Success=Upgrade successful.
-UpgradeStatus_Error=Error committing status
-UpgradeStatus_OK=OK
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/launch/JSFFileURL.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/launch/JSFFileURL.java
deleted file mode 100644
index 3bfc32e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/launch/JSFFileURL.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler - initial API and implementation
- *******************************************************************************/ 
-
-package org.eclipse.jst.jsf.core.internal.launch;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.jst.j2ee.internal.web.jfaces.extension.FileURL;
-import org.eclipse.jst.j2ee.model.IModelProvider;
-import org.eclipse.jst.j2ee.model.ModelProviderManager;
-import org.eclipse.jst.jsf.core.internal.project.facet.JSFUtilFactory;
-import org.eclipse.jst.jsf.core.internal.project.facet.JSFUtils;
-
-/**
- * Extends the FileURL extension-point so that a JSF JSP page
- * can have it's URL mapped to the Faces Servlet using the servlet-mapping 
- * specified in the web.xml file
- * 
- * @author Gerry Kessler - Oracle
- *
- */
-public class JSFFileURL implements FileURL 
-{
-
-	/**
-	 * If this is a JSP page, this will return a URL using the first valid servlet-mapping to the Faces Servlet
-	 * if found.   If the faces servlet is not defined in the web.xml or there is no servlet-mapping, this will return null.
-	 * 
-	 * The resource's file extension is compared with the javax.faces.DEFAULT_SUFFIX context-param if set.   If the same, then 
-	 * extension mapping will be used if found in the web.xml.  If not set, "jsp" default is assumed.   If resource does not have the default
-	 * file extension, then it must have either: jsp,jspx, or jsf file extensions in order to be considered for launch.
-	 * 
-	 * This will not guarentee a page to be run.  The user will still need a properly configured server with valid URL mappings and
-	 * context-params.
-	 * 
-	 * TODO: We could detect and insert or just warn for context-params and url mappings to run.  However, this would better detected during a JSF App validation step.
-	 * 
-	 * @see org.eclipse.jst.j2ee.internal.web.jfaces.extension.FileURL#getFileURL(org.eclipse.core.resources.IResource, org.eclipse.core.runtime.IPath)
-	 */
-	public IPath getFileURL(IResource resource, IPath existingURL) {
-		
-		//is this is a Faces Project with a Faces Servlet?
-		//we will not check to see if facet is installed.  
-		// check to see if this resource is a JSF page (currently always true) and then,
-		//if servlet is present, we will change the url based on first mapping found 
-		IModelProvider provider = ModelProviderManager.getModelProvider(resource.getProject());
-		Object webAppObj = provider.getModelObject();
-		final JSFUtils jsfUtil = new JSFUtilFactory().create(resource.getProject());
-		if (webAppObj != null && jsfUtil != null){
-			//methods below returning the path are identical except for the APIs required
-		    return jsfUtil.getFileUrlPath(webAppObj, resource, existingURL);
-		}
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/messages.properties b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/messages.properties
deleted file mode 100644
index 57bad76..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/messages.properties
+++ /dev/null
@@ -1,94 +0,0 @@
-###############################################################################
-# Copyright (c) 2005 Oracle Corporation.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#    Gerry Kessler - initial API and implementation
-#    Ian Trimble - change key names for use with org.eclipse.osgi.util.NLS
-###############################################################################
-JSFLibraryRegistry_ErrorCreatingURL=Error creating URL for JSF Library Registry
-JSFLibraryRegistry_NoLoadCreatingNew=Could not load JSF Library Registry; creating new registry
-JSFLibraryRegistry_ErrorSaving=Error saving JSF Library Registry
-JSFLibraryRegistry_DEFAULT_IMPL_LABEL=<Default>
-JSFLibraryConfigModel_Null_Data_Source=Data Source is not provided.
-JSFLibraryRegistry_ErrorLoadingFromExtPt=Error while loading JSF Libraries from extension points
-JSFLibraryClasspathContainer_IMPL_LIBRARY=[JSF Library - implementation]
-
-JSFLibraryValidator_MISSING_JSF_IMPLEMENTATION_CLASSES=Selected libraries are missing key JSF implementation classes (javax.faces.*)
-
-JSFFacetInstallDataModelProvider_ValidateServletName=Specify a servlet name to use
-JSFLibraryConfigPersistData_SAVED_IMPLLIB_NOT_FOUND=Saved JSF implementation library in {0} is unavailable in JSF Library Registry
-JSFLibraryConfigPersistData_SAVED_COMPLIB_NOT_FOUND=Saved JSF component library in {0} is unavailable in JSF Library Registry
-JSFLibraryClasspathContainer_NON_IMPL_LIBRARY=[JSF Library]
-JSFLibrariesContainerInitializer_missing_library=[missing JSF Library]
-JSFFacetInstallDataModelProvider_DupeJarValidation=Duplicated jar on classpath: {0}
-JSFFacetInstallDataModelProvider_ValidateConfigFilePath=The configuration file path is not valid
-JSFFacetInstallDataModelProvider_ValidateConfigFileEmpty=Specify a valid name and location for JSF configuration file
-JSFFacetInstallDataModelProvider_ValidateConfigFileRelative1=Configuration file must be specified relative to the project''s {0} folder
-JSFFacetInstallDataModelProvider_ValidateConfigFileRelative2=Configuration file must be located in the project''s {0} folder
-JSFFacetInstallDataModelProvider_INITIAL_VALIDATION_IMPL_TYPE=Select an implementation library.   If a server supplied library is chosen , the chosen server adapter must be capable of providing the JSF Implementation jars, or the application will not validate or compile.
-JSFFacetInstallDataModelProvider_INVALID_JSF_CONFIG_FILE_NAME=Not a valid JSF configuration file name
-JSFFacetInstallDataModelProvider_ValidateConfigFileXML=JSF configuration file must be an XML file
-JSFFacetInstallDataModelProvider_ValidateConfigFileSlashes=Configuration file path must not contain "\\"s.   Use "/" instead.
-JSFLibCfgDialogSettingData_Sticky_Component_Lib_Not_Exist=A sticky component library selection no longer exists.
-
-JSFFacetInstallDelegate_AllowJavascriptDescription=\n\tThis parameter tells MyFaces if javascript code should be allowed in\n\tthe rendered HTML output.\n\tIf javascript is allowed, command_link anchors will have javascript code\n\tthat submits the corresponding form.\n\tIf javascript is not allowed, the state saving info and nested parameters\n\twill be added as url parameters.\n\tDefault is 'true'
-JSFFacetInstallDelegate_AutoScrollDescription=\n\tIf true, a javascript function will be rendered that is able to restore the\n\tformer vertical scroll on every request. Convenient feature if you have pages\n\twith long lists and you do not want the browser page to always jump to the top\n\tif you trigger a link or button action that stays on the same page.\n\tDefault is 'false'\n
-JSFFacetInstallDelegate_InternalErr=Internal Error creating JSF Facet.  Missing configuration.
-JSFFacetInstallDelegate_ConfigErr=''{0}'' : unable to configure web module for JavaServer Faces
-JSFFacetInstallDelegate_MaxFileSizeDescription=\n\tSet the size limit for uploaded files. Format: 10 - 10 bytes\n\t10k - 10 KB 10m - 10 MB 1g - 1 GB
-JSFFacetInstallDelegate_NonUpdateableWebXML=JSF Facet was not installed on ''{0}''.  The web.xml file needs to be updateable.
-JSFFacetInstallDelegate_PrettyHtmlDescription=\n\tIf true, rendered HTML code will be formatted, so that it is 'human-readable'\n\ti.e. additional line separators and whitespace will be written, that do not\n\tinfluence the HTML code.\n\tDefault is 'true'
-JSFFacetInstallDelegate_StateSavingMethod=State saving method: 'client' or 'server' (=default). See JSF Specification 2.5.2
-JSFFacetUninstallDelegate_ConfigErr=''{0}'' : unable to de-configure web module for JavaServer Faces
-JSFFacetUninstallDelegate_NonUpdateableWebXML=JSF Facet was not un-installed from ''{0}''.  The web.xml file needs to be updateable.
-
-ArchiveFileImpl_CannotCopyFile=Cannot copy file
-ArchiveFileImpl_CannotCloseFile=Cannot close file
-ArchiveFileImpl_CannotLocatePluginRelativeFile=Cannot locate plugin-relative file "{0}"
-
-PluginProvidedJSFLibraryCreationHelper_ErrorCreating=Unable to create JSF Library: {0}
-PluginProvidedJSFLibraryCreationHelper_ErrorMultipleDefinition={0} defined multiple times in {1}
-
-JSFUtils_ErrorCreatingConfigFile=Error creating config file
-JSFUtils_ErrorClosingConfigFile=Error closing config file
-
-JSFAppConfigUtils_ErrorOpeningJarFile=Error opening JarFile "{0}"
-
-JARFileJSFAppConfigProvider_ErrorLoadingModel=Error loading model for file "{0}"
-JSFUtils_MissingJAR= Missing JSF Library Jar: {0} in {1}
-Could_Not_GetJSFVersion=Could not get valid JSF version from facet {0}
-
-J2EEModuleDependencyDelegate_UpdatingJ2EEModuleDependencies=Updating J2EE Module Dependencies
-J2EEModuleDependencyDelegate_UpdatingJ2EEModuleDependenciesForProject=Updating J2EE Module Dependencies for project "{0}"
-
-JSFRegistryMigration05_to_10_title=User Intervention Required
-JSFRegistryMigration05_to_10_message=IMPORTANT! Please read below:
-JSFRegistryMigration05_to_10_customMessage=You have loaded a workspace created with a previous \
-version of JSF Tools.\nYour JSF Library Registry is out of date and needs to be migrated forward to continue.\n\
-If you choose to proceed, be aware of the following consequences:\n\
-\n\
-1) Projects in this workspace will need to be manually migrated by you to work in this version of JSF Tools.\n\
-2) Once migrated, this workspace will no longer work in older versions of JSF Tools.\n\
-\n\
-If this is not what you want, exit immediately and your workspace will still load in older versions.
-
-JSFRegistryMigrationCannot05_to_10_title=Error During Registry Upgrade
-JSFRegistryMigrationCannot05_to_10_message=IMPORTANT! Please read below:
-JSFRegistryMigrationCannot05_to_10_customMessage=You a loaded a workspace created with a previous \
-version of JSF Tools.\nYour JSF Library Registry is out of date and needs to be migrated forward to continue.\n\
-However, the existing registry has a problem and cannot be upgraded. 
-RegistryMigrationStartupHandler_Error_committing_migration=Error committing migration\!
-RegistryMigrationStartupHandler_Error_Rolling_Back_Migration=Error rolling back migration\!
-RegistryMigrationStartupHandler_Dialog_Confirm_Migration=Confirm
-RegistryMigrationStartupHandler_Dialog_Abort_And_Exit_Migration=Abort and Exit
-RegistryMigrationStartupHandler_Launch_Migration_Doc_On_Confirm=Launch Migration Doc on Confirm
-RegistryUpgradeCommitHandler_Text=An unrecoverable error occurred while trying to migrate your JSF Library Registry to a newer version.  This may cause your library references to be broken in your JSF projects.
-RegistryUpgradeCommitHandler_Title=Serious Error Encountered\!
-
-JSFFacet11_presetLabel = JavaServer Faces v1.1 Project
-JSFFacet11_presetDescription = Configures a Dynamic Web application to use JSF v1.1
-
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/IJSFFacetInstallDataModelProperties.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/IJSFFacetInstallDataModelProperties.java
deleted file mode 100644
index da030b7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/IJSFFacetInstallDataModelProperties.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.core.internal.project.facet;
-
-import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetInstallDataModelProperties;
-
-/**
- * Defines properties used by the JSF facet install data model.
- * 
- * @author Gerry Kessler - Oracle
- */
-public interface IJSFFacetInstallDataModelProperties extends
-        IFacetInstallDataModelProperties {
-	
-    /**
-     * Refers to the path where the faces config file will be created.
-     * Expects a string that can be interpreted as a web root relative path.
-     */
-    public static final String CONFIG_PATH = "IJSFFacetInstallDataModelProperties.CONFIG_PATH"; //$NON-NLS-1$
-
-    /**
-     * TODO:
-     */
-    public static final String SERVLET_NAME = "IJSFFacetInstallDataModelProperties.SERVLET_NAME"; //$NON-NLS-1$
-
-    /**
-     * TODO:
-     */
-    public static final String SERVLET_CLASSNAME = "IJSFFacetInstallDataModelProperties.SERVLET_CLASSNAME"; //$NON-NLS-1$
-
-    /**
-     * Refers to configuration information about servlet url patterns to add on install
-     * The model value must be a String[].
-     */
-    public static final String SERVLET_URL_PATTERNS = "IJSFFacetInstallDataModelProperties.SERVLET_URL_PATTERNS"; //$NON-NLS-1$
-
-    /**
-     * TODO:
-     */
-    public static final String WEBCONTENT_DIR = "IJSFFacetInstallDataModelProperties.WEBCONTENT_DIR"; //$NON-NLS-1$
-
-    /**
-     * TODO:
-     */
-    public static final String LIBRARY_PROVIDER_DELEGATE = "IJSFFacetInstallDataModelProperties.LIBRARY_PROVIDER_DELEGATE"; //$NON-NLS-1$    
-
-    /**
-     * TODO:
-     */
-    public static final String COMPONENT_LIBRARIES = "IJSFFacetInstallDataModelProperties.COMPONENT_LIBRARIES"; //$NON-NLS-1$	 
-    
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/J2EEUtils.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/J2EEUtils.java
deleted file mode 100644
index 80087ae..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/J2EEUtils.java
+++ /dev/null
@@ -1,461 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle Corporation - initial API and implementation and/or initial documentation
- *******************************************************************************/ 
-
-package org.eclipse.jst.jsf.core.internal.project.facet;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jst.j2ee.common.CommonFactory;
-import org.eclipse.jst.j2ee.common.ParamValue;
-import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
-import org.eclipse.jst.j2ee.webapplication.ContextParam;
-import org.eclipse.jst.j2ee.webapplication.Servlet;
-import org.eclipse.jst.j2ee.webapplication.ServletMapping;
-import org.eclipse.jst.j2ee.webapplication.ServletType;
-import org.eclipse.jst.j2ee.webapplication.WebApp;
-import org.eclipse.jst.j2ee.webapplication.WebapplicationFactory;
-
-/**
- * Web.xml access for J2EE applications (web version 2.3 and 2.4)
- */
-public class J2EEUtils {
-
-	/**
-	 * Finds and returns a Servlet definition, or null if servlet is not defined.
-	 * 
-	 * @param webApp
-	 * @param servletName
-	 * @return Servlet or null
-	 */
-    public static Servlet findServlet(final WebApp webApp, String servletName)
-    {
-        if (webApp == null)
-        {
-            return null;
-        }
-
-        final Iterator it = webApp.getServlets().iterator();
-
-        while (it.hasNext())
-        {
-            final Servlet servlet = (Servlet) it.next();
-            if (servlet != null && servlet.getWebType() != null)
-            {
-                if (servlet.getWebType().isServletType())
-                {
-                    if (((ServletType) servlet.getWebType()).getClassName() != null
-                            && ((ServletType) servlet.getWebType())
-                                    .getClassName().trim().equals(servletName))
-                    {
-                        return servlet;
-                    }
-                } 
-            }
-        }
-
-        // if we get to here then we have finished the loop
-        // without finding the servlet we're looking for
-        return null;
-    }
-
-    /**
-     * Creates servlet reference in WebApp if not present or updates servlet
-     * name if found using the passed configuration.
-     * 
-     * @param webApp
-     * @param displayName
-     * @param className
-     * @param servlet
-     * @return Servlet servlet - if passed servlet was null, will return created
-     *         servlet
-     */
-    public static Servlet createOrUpdateServletRef(final WebApp webApp,
-            String displayName, String className, Servlet servlet)
-    {
-        if (servlet == null)
-        {
-            // Create the servlet instance and set up the parameters from data
-            // model
-            servlet = WebapplicationFactory.eINSTANCE.createServlet();
-            servlet.setServletName(displayName);
-
-            ServletType servletType = WebapplicationFactory.eINSTANCE
-                    .createServletType();
-            servletType.setClassName(className);
-            servlet.setWebType(servletType);
-            servlet.setLoadOnStartup(Integer.valueOf(1));
-            // Add the servlet to the web application model
-            webApp.getServlets().add(servlet);
-        } 
-        else
-        {
-            // update
-            updateServletMappings(webApp, servlet, displayName);
-            servlet.setServletName(displayName);
-            servlet.setLoadOnStartup(Integer.valueOf(1));
-        }
-        return servlet;
-    }
-    
-    /**
-     * Updates servlet mapping
-     * 
-     * @param webApp
-     * @param servlet
-     * @param displayName
-     */
-    public static void updateServletMappings(final WebApp webApp,
-            final Servlet servlet, final String displayName)
-    {
-        List<ServletMapping> mappings = findServletMappings(webApp, servlet);
-        for (ServletMapping map : mappings)
-        {
-            map.setName(displayName);
-        }
-
-    }
-    
-    /**
-     * Finds mapping for given servlet
-     * 
-     * @param webApp
-     * @param servlet
-     * @return List of mappings
-     */
-	public static List<ServletMapping> findServletMappings(final WebApp webApp, final Servlet servlet) {
-	    String servletName = servlet.getServletName();
-	    servletName = servletName != null ? servletName.trim() : servletName;
-	    final List<ServletMapping> mappings = new ArrayList<ServletMapping>();
-		final List<ServletMapping> allMappings = webApp.getServletMappings();
-		for (int i=allMappings.size()-1;i>=0;--i){
-			ServletMapping mapping = allMappings.get(i);
-			if (mapping != null && 
-					mapping.getServlet() != null && 
-					mapping.getServlet().getServletName() != null &&
-					mapping.getServlet().getServletName().trim().equals(servletName))
-				mappings.add(mapping);
-		}
-		return mappings;
-	}
-
-	/**
-	 * Creates servlet-mappings for the servlet
-	 * 
-	 * @param webApp
-	 * @param urlMappingList - list of string values to  be used in url-pattern for servlet-mapping
-	 * @param servlet
-	 */
-	public static void setUpURLMappings(final WebApp webApp, final List urlMappingList,
-			final Servlet servlet) {
-		// Add mappings
-		Iterator it = urlMappingList.iterator();
-		while (it.hasNext()) {
-			String pattern = (String) it.next();
-			if (!(doesServletMappingExist(webApp, servlet, pattern))){
-				ServletMapping mapping = WebapplicationFactory.eINSTANCE
-						.createServletMapping();
-				mapping.setServlet(servlet);
-				mapping.setName(servlet.getServletName());
-				mapping.setUrlPattern(pattern);
-				webApp.getServletMappings().add(mapping);
-			}
-		}
-	}
-
-	/**
-	 * Checks whether given mapping exists for the given servlet
-	 * @param webApp
-	 * @param servlet
-	 * @param pattern
-	 * @return true or false
-	 */
-	public static boolean doesServletMappingExist(final WebApp webApp, final Servlet servlet,
-			final String pattern) {	
-		
-		List mappings = webApp.getServletMappings();
-		String servletName = servlet.getServletName();
-		if (servletName != null) 
-		{
-		    final Iterator it = mappings.iterator();
-			while(it.hasNext())
-			{
-				ServletMapping mapping = (ServletMapping) it.next();
-				if (mapping != null && 
-						mapping.getServlet() != null && 
-						mapping.getServlet().getServletName() != null &&
-						mapping.getServlet().getServletName().trim().equals(servletName) &&
-						mapping.getUrlPattern() != null && 
-						mapping.getUrlPattern().trim().equals(pattern)) {
-					return true;
-				}
-			}
-		}
-		return false;
-	}
-	
-	/**
-	 * Removes servlet-mappings for servlet using servlet-name.
-	 * @param webApp
-	 * @param servlet
-	 */
-	public static void removeURLMappings(final WebApp webApp, final Servlet servlet) {
-		List mappings = webApp.getServletMappings();
-		String servletName = servlet.getServletName();
-		if (servletName != null) {
-			for (int i=mappings.size()-1;i>=0;--i){
-				ServletMapping mapping = (ServletMapping)mappings.get(i);
-				if (mapping != null && 
-						mapping.getServlet() != null && 
-						mapping.getServlet().getServletName() != null &&
-						mapping.getServlet().getServletName().trim()
-							.equals(servletName)) {
-					mappings.remove(mapping);
-				}
-			}
-		}
-	}
-	
-	/**
-	 * Removes servlet definition
-	 * @param webApp
-	 * @param servlet
-	 */
-    public static void removeServlet(final WebApp webApp, final Servlet servlet) {
-        webApp.getServlets().remove(servlet);
-    }
-
-    /**
-     * Removes context-param
-     * @param webApp
-     * @param paramName
-     */
-    public static void removeContextParam(final WebApp webApp, String paramName) {
-        if ("2.3".equals(webApp.getVersion())) //$NON-NLS-1$
-        {
-            Iterator it = webApp.getContexts().iterator();
-            while (it.hasNext()) 
-            {
-                final ContextParam cp = (ContextParam) it.next();
-                if (cp.getParamName().equals(paramName)) 
-                {
-                    webApp.getContexts().remove(cp);
-                    break;
-                }
-            }
-        }
-        else if ("2.4".equals(webApp.getVersion())) //$NON-NLS-1$
-        {
-            Iterator it = webApp.getContextParams().iterator();
-            while (it.hasNext()) 
-            {
-                ParamValue cp = (ParamValue) it.next();
-                if (cp.getName().equals(paramName)) {
-                    webApp.getContextParams().remove(cp);
-                    break;
-                }
-            }
-        }
-    }
-    
-    
-	/**
-	 * Creates or updates context-param in v 2.3 WebApp
-	 * @param webApp
-	 * @param paramName
-	 * @param paramValue
-	 */
-	public static void setupContextParamForV2_3(final WebApp webApp, String paramName, String paramValue) {
-			
-		// if not default name and location, then add context param
-		ContextParam cp = null;
-		ContextParam foundCP = null;
-		boolean found = false;
-		// check to see if present
-		Iterator it = webApp.getContexts().iterator();
-		while (it.hasNext()) {
-			cp = (ContextParam) it.next();
-			if (cp != null &&
-					cp.getParamName() != null &&
-					cp.getParamName().equals(paramName)) {
-				foundCP = cp;
-				found = true;
-			}
-		}
-		if (!found) {
-			cp = WebapplicationFactory.eINSTANCE.createContextParam();
-			cp.setParamName(paramName);
-			cp.setParamValue(paramValue);
-			webApp.getContexts().add(cp);
-		} else {
-			cp = foundCP;
-			if (cp.getParamValue().indexOf(paramValue) < 0) {
-				String curVal = cp.getParamValue();
-				String val = paramValue;
-				if (curVal != null && !"".equals(curVal.trim())) { //$NON-NLS-1$
-					val = curVal + ",\n" + val; //$NON-NLS-1$
-				}
-				cp.setParamValue(val);
-			}
-		}
-	}
-	
-	
-	/**
-	 * Creates or updates context-param in v 2.4 WebApp
-	 * @param webApp
-	 * @param paramName
-	 * @param paramValue
-	 */
-	public static void setupContextParamForV2_4(final WebApp webApp, String paramName, String paramValue) {
-		// if not default name and location, then add context param
-		ParamValue foundCP = null;
-		ParamValue cp = null;
-		boolean found = false;
-		// check to see if present
-		Iterator it = webApp.getContextParams().iterator();
-		while (it.hasNext()) {
-			cp = (ParamValue) it.next();
-			if (cp != null && 
-					cp.getName() != null &&
-					cp.getName().trim().equals(paramName)) {
-				foundCP = cp;
-				found = true;
-			}
-		}
-		if (!found) {
-			ParamValue pv = CommonFactory.eINSTANCE.createParamValue();
-			pv.setName(paramName);
-			pv.setValue(paramValue);
-			webApp.getContextParams().add(pv);
-		} else {
-			cp = foundCP;
-			if (cp.getValue().indexOf(paramValue) < 0) {
-				String curVal = cp.getValue();
-				String val = paramValue;
-				if (curVal != null && !"".equals(curVal.trim())) { //$NON-NLS-1$
-					val = curVal + ",\n" + val; //$NON-NLS-1$
-				}
-				cp.setValue(val);
-			}
-		}
-	}
-
-	/**
-	 * Creates or updates context-param
-	 * @param webApp
-	 * @param paramName
-	 * @param paramValue
-	 */
-	public static void setupContextParam(final WebApp webApp, String paramName, String paramValue) {
-        if (webApp.getVersionID() == J2EEVersionConstants.WEB_2_3_ID)//shouldn't have to do it this way, but that's the way it goes 119442
-        {
-            setupContextParamForV2_3(webApp, paramName, paramValue);
-        }
-        else if (webApp.getVersionID() == J2EEVersionConstants.WEB_2_4_ID)
-        {
-            setupContextParamForV2_4(webApp, paramName, paramValue);
-        }
-        else
-        {
-            throw new IllegalArgumentException("Invalid argument: "+webApp.getVersionID()); //$NON-NLS-1$
-        }
-	}
-	
-    /**
-     * @param webApp
-     * @param paramName
-     * @return context-param value or null if context-param is not found
-     */
-    public static String getContextParam(final WebApp webApp, String paramName)
-    {
-        if ("2.3".equals(webApp.getVersion())) //$NON-NLS-1$
-        {
-            for (Iterator it = webApp.getContexts().iterator(); it.hasNext();)
-            {
-                ContextParam cp = (ContextParam) it.next();
-    			if (cp != null &&
-    					cp.getParamName() != null &&
-    					cp.getParamName().trim().equals(paramName)) {
-                        return cp.getParamValue();
-                }
-            }
-        }
-        else if ("2.4".equals(webApp.getVersion())) //$NON-NLS-1$
-        {
-            for (Iterator it = webApp.getContextParams().iterator(); it.hasNext();)
-            {
-                ParamValue cp = (ParamValue) it.next();
-    			if (cp != null && 
-    					cp.getName() != null &&
-    					cp.getName().trim().equals(paramName)) {
-                    return cp.getValue();
-                }
-            }
-        }
-        return null;
-    }
-    
-    /**
-     * @param map
-     * @return extension from map. Will return null if file extension not found
-     *         in url patterns.
-     */
-    public static String getFileExtensionFromMap(final ServletMapping map)
-    {
-        final String urlPattern = map.getUrlPattern();
-        if (urlPattern != null
-                && urlPattern.trim().length() != 0)
-        {
-            IPath extPath = new Path(map.getUrlPattern());
-            if (extPath != null)
-            {
-                String ext = extPath.getFileExtension();
-                if (ext != null && ext.trim().length() != 0)
-                {
-                    return ext;
-                }
-            }
-        }
-        return null;
-    }
-    
-    /**
-     * @param map
-     * @return prefix mapping. may return null.
-     */
-    public static String getPrefixMapping(final ServletMapping map)
-    {
-        final String urlPattern = map.getUrlPattern();
-        if (urlPattern != null && urlPattern.trim().length() != 0)
-        {
-            IPath extPath = new Path(urlPattern);
-            if (extPath != null)
-            {
-                String ext = extPath.getFileExtension();
-                if (ext == null)
-                {
-                    String lastSeg = extPath.lastSegment();
-                    if (lastSeg != null && lastSeg.equals("*")) //$NON-NLS-1$
-                    {
-                        return extPath.removeLastSegments(1).toString();
-                    }
-
-                    return extPath.toString();
-                }
-            }
-        }
-        return null;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JEEUtils.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JEEUtils.java
deleted file mode 100644
index d3d20f6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JEEUtils.java
+++ /dev/null
@@ -1,344 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle Corporation - initial API and implementation and/or initial documentation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.core.internal.project.facet;
-
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jst.javaee.core.JavaeeFactory;
-import org.eclipse.jst.javaee.core.ParamValue;
-import org.eclipse.jst.javaee.core.UrlPatternType;
-import org.eclipse.jst.javaee.web.Servlet;
-import org.eclipse.jst.javaee.web.ServletMapping;
-import org.eclipse.jst.javaee.web.WebApp;
-import org.eclipse.jst.javaee.web.WebFactory;
-
-/**
- * Web.xml access for JEE applications (web version 2.5 and above)
- */
-public class JEEUtils {
-	/**
-	 * Finds and returns a Servlet definition, or null if servlet is not defined.
-	 * 
-	 * @param webApp
-	 * @param servletName
-	 * @return Servlet or null
-	 */
-    public static Servlet findServlet(final WebApp webApp, String servletName)
-    {
-        if (webApp == null)
-        {
-            return null;
-        }
-
-        for (final Servlet servlet : webApp.getServlets())
-        {
-            if (servlet != null &&
-                    servlet.getServletClass() != null
-                    && servlet.getServletClass().trim().equals(servletName))
-            {
-                return servlet;
-            }
-        }
-
-        // if we get to here then we have finished the loop
-        // without finding the servlet we're looking for
-        return null;
-    }
-    
-	/**
-	 * Creates servlet reference in WebApp if not present or updates servlet name if found
-	 * using the passed configuration.
-	 * 
-	 * @param webApp
-	 * @param displayName
-	 * @param className
-	 * @param servlet
-	 * @return Servlet servlet - if passed servlet was null, will return created servlet
-	 */
-	public static Servlet createOrUpdateServletRef(final WebApp webApp,
-			String displayName, String className, Servlet servlet) {
-		
-		if (servlet == null){			
-			// Create the servlet instance and set up the parameters from data
-			// model
-			servlet = WebFactory.eINSTANCE.createServlet();
-			servlet.setServletName(displayName);
-			servlet.setServletClass(className);
-			servlet.setLoadOnStartup(Integer.valueOf(1));
-			// Add the servlet to the web application model
-			webApp.getServlets().add(servlet);
-
-		} else {
-			updateServletMappings(webApp, servlet, displayName);
-			servlet.setServletName(displayName);
-			servlet.setLoadOnStartup(Integer.valueOf(1));
-		}
-		return servlet;
-	}
-
-    /**
-     * Updates servlet mapping
-     * 
-     * @param webApp
-     * @param servlet
-     * @param displayName
-     */
-    public static void updateServletMappings(final WebApp webApp,
-            final Servlet servlet, final String displayName)
-    {
-        // update mappings for new name
-        ServletMapping mapping = findServletMapping(webApp, servlet);
-        if (mapping != null)
-        {
-            mapping.setServletName(displayName);
-        }
-    }
-    
-    /**
-     * Finds mapping for given servlet
-     * 
-     * @param webApp
-     * @param servlet
-     * @return List of mappings
-     */
-    public static ServletMapping findServletMapping(final WebApp webApp, final Servlet servlet) {
-		for (Iterator it=webApp.getServletMappings().iterator();it.hasNext();){
-			ServletMapping mapping = (ServletMapping)it.next();
-			if (mapping.getServletName() != null && 
-					servlet.getServletName() != null &&
-					mapping.getServletName().trim().equals(servlet.getServletName().trim()))
-				return mapping;
-        }
-		return null;
-    }
-    
-    /**
-     * Creates servlet-mappings for the servlet for 2.5 WebModules or greated
-     * 
-     * @param webApp
-     * @param urlMappingList
-     *            - list of string values to be used in url-pattern for
-     *            servlet-mapping
-     * @param servlet
-     */
-    public static void setUpURLMappings(final WebApp webApp,
-            final List<String> urlMappingList, final Servlet servlet)
-    {
-
-        if (urlMappingList.size() > 0)
-        {
-            ServletMapping mapping = findServletMapping(webApp, servlet);
-            if (mapping == null)
-            {
-                mapping = WebFactory.eINSTANCE
-                        .createServletMapping();
-                mapping.setServletName(servlet.getServletName());
-                webApp.getServletMappings().add(mapping);
-            }
-            // Add patterns
-            for (final String pattern : urlMappingList)
-            {
-                if (!(doesServletMappingPatternExist(webApp, servlet, pattern)))
-                {
-                    UrlPatternType urlPattern = JavaeeFactory.eINSTANCE
-                            .createUrlPatternType();
-                    urlPattern.setValue(pattern);
-                    mapping.getUrlPatterns().add(urlPattern);
-                }
-            }
-        }
-    }
-
-	/**
-	 * Checks whether given mapping exists for the given servlet
-	 * @param webApp
-	 * @param servlet
-	 * @param pattern
-	 * @return true or false
-	 */
-    public static boolean doesServletMappingPatternExist(final WebApp webApp,
-            final Servlet servlet, final String pattern)
-    {
-        List<ServletMapping> mappings = webApp.getServletMappings();
-        String servletName = servlet.getServletName();
-        if (servletName != null)
-        {
-            servletName = servletName.trim();
-            for (final ServletMapping mapping : mappings)
-            {
-                if (mapping != null && 
-                        mapping.getServletName() != null && 
-                        servletName.equals(mapping.getServletName().trim()))
-                {
-                    for (final UrlPatternType urlPattern : mapping.getUrlPatterns())
-                    {
-                        String patternTypeValue = urlPattern.getValue();
-                        if (patternTypeValue != null
-                                && pattern.equals(patternTypeValue.trim()))
-                            return true;
-                    }
-                }
-            }
-        }
-        return false;
-    }
-
-	/**
-	 * Removes servlet-mappings for servlet using servlet-name for >= 2.5 WebModules.
-	 * @param webApp
-	 * @param servlet
-	 */
-	public static void removeURLMappings(final  WebApp webApp, final Servlet servlet) {
-		List mappings = webApp.getServletMappings();
-		String servletName = servlet.getServletName();
-		if (servletName != null) {
-			servletName = servletName.trim();
-			for (int i=mappings.size()-1;i>=0;--i){
-				ServletMapping mapping = (ServletMapping)mappings.get(i);
-				if (mapping != null && 
-						mapping.getServletName() != null && 
-						mapping.getServletName().trim()
-						.equals(servletName)) {
-					mappings.remove(mapping);
-				}
-			}
-		}
-	}
-
-	/**
-	 * Removes servlet definition
-	 * @param webApp
-	 * @param servlet
-	 */
-    public static void removeServlet(final WebApp webApp, final Servlet servlet) {     
-        webApp.getServlets().remove(servlet);
-    }
-    
-    /**
-     * Removes context-param
-     * @param webApp
-     * @param paramName
-     */
-    public static void removeContextParam(final WebApp webApp, String paramName) {
-        Iterator it = webApp.getContextParams().iterator();
-        while (it.hasNext()) {
-            ParamValue cp = (ParamValue) it.next();
-            if (cp.getParamName().equals(paramName)) {
-                webApp.getContextParams().remove(cp);
-                break;
-            }
-        }
-    }
-    
-	/**
-	 * Creates or updates context-param
-	 * @param webApp
-	 * @param paramName
-	 * @param paramValue
-	 */
-	public static void setupContextParam(final WebApp webApp, String paramName, String paramValue) {
-		// if not default name and location, then add context param
-		ParamValue foundCP = null;
-		ParamValue cp = null;
-		boolean found = false;
-		// check to see if present
-		Iterator it = webApp.getContextParams().iterator();
-		while (it.hasNext()) {
-			cp = (org.eclipse.jst.javaee.core.ParamValue) it.next();
-			if (cp != null && 
-					cp.getParamName()!= null &&
-					cp.getParamName().trim().equals(paramName)) {
-				foundCP = cp;
-				found = true;
-			}
-		}
-		if (!found) {
-			ParamValue pv = JavaeeFactory.eINSTANCE.createParamValue();
-			pv.setParamName(paramName);
-			pv.setParamValue(paramValue);
-			webApp.getContextParams().add(pv);
-		} else {
-			cp = foundCP;
-			if (cp.getParamValue().indexOf(paramValue) < 0) {
-				String curVal = cp.getParamValue();
-				String val = paramValue;
-				if (curVal != null && !"".equals(curVal.trim())) { //$NON-NLS-1$
-					val = curVal + ",\n" + val; //$NON-NLS-1$
-				}
-				cp.setParamValue(val);
-			}
-		}
-	}
-
-    /**
-     * @param webApp
-     * @param paramName
-     * @return context-param value or null if context-param is not found
-     */
-    public static String getContextParam(final WebApp webApp, String paramName)
-    {
-        for (Iterator it = webApp.getContextParams().iterator(); it.hasNext();)
-        {
-            ParamValue cp = (ParamValue) it.next();
-			if (cp != null && 
-					cp.getParamName()!= null &&
-					cp.getParamName().trim().equals(paramName)) {
-				return cp.getParamValue();
-            }
-        }
-        return null;
-    }
-    
-	/**
-	 * @param map
-	 * @return extension from map.  Will return null if file extension not found in url patterns.
-	 */
-	public static String getFileExtensionFromMap(final ServletMapping map) {
-		List urls = map.getUrlPatterns();
-		for (Iterator it=urls.iterator();it.hasNext();){
-			IPath extPath = new Path(((UrlPatternType)it.next()).getValue());
-			if (extPath != null){
-				String ext = extPath.getFileExtension();
-				if (ext != null && !ext.equals("")) //$NON-NLS-1$
-					return ext;
-			}
-		}
-		return null;
-	}
-	
-	/**
-	 * @param map
-	 * @return prefix mapping 
-	 */
-	public static String getPrefixMapping(final ServletMapping map) {
-		List urls = map.getUrlPatterns();
-		for (Iterator it=urls.iterator();it.hasNext();){
-			IPath extPath = new Path(((UrlPatternType)it.next()).getValue());
-			if (extPath != null){
-				String ext = extPath.getFileExtension();
-				if (ext == null){
-					String lastSeg = extPath.lastSegment();
-					if (lastSeg.equals("*")) //$NON-NLS-1$
-					{
-						return extPath.removeLastSegments(1).toString();
-					}
-					
-					return extPath.toString();				
-				}
-			}
-		}
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFConfigurationPresetFactory11.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFConfigurationPresetFactory11.java
deleted file mode 100644
index 5a318ce..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFConfigurationPresetFactory11.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/******************************************************************************
- * Copyright (c) 2008 BEA Systems, Inc. and others
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Konstantin Komissarchik
- ******************************************************************************/
-
-package org.eclipse.jst.jsf.core.internal.project.facet;
-
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jst.common.project.facet.core.JavaFacet;
-import org.eclipse.jst.j2ee.web.project.facet.WebFacetUtils;
-import org.eclipse.jst.jsf.core.IJSFCoreConstants;
-import org.eclipse.jst.jsf.core.internal.Messages;
-import org.eclipse.wst.common.project.facet.core.IDynamicPreset;
-import org.eclipse.wst.common.project.facet.core.IFacetedProjectBase;
-import org.eclipse.wst.common.project.facet.core.IPresetFactory;
-import org.eclipse.wst.common.project.facet.core.IProjectFacet;
-import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
-import org.eclipse.wst.common.project.facet.core.PresetDefinition;
-import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
-
-/**
- * @author <a href="mailto:kosta@bea.com">Konstantin Komissarchik</a>
- */
-
-public final class JSFConfigurationPresetFactory11
-
-    implements IPresetFactory
-    
-{
-    public PresetDefinition createPreset( final String presetId,
-                                          final Map<String,Object> context ) 
-    
-        throws CoreException
-        
-    {
-        final IFacetedProjectBase fproj
-            = (IFacetedProjectBase) context.get( IDynamicPreset.CONTEXT_KEY_FACETED_PROJECT );
-        
-        final IProjectFacetVersion webFacetVersion
-            = fproj.getProjectFacetVersion( WebFacetUtils.WEB_FACET );
-        
-        if( webFacetVersion != null && webFacetVersion.compareTo( WebFacetUtils.WEB_23 ) >= 0 )
-        {
-            final Set<IProjectFacetVersion> facets = new HashSet<IProjectFacetVersion>();
-            
-            final IProjectFacet jsfFacet
-                = ProjectFacetsManager.getProjectFacet( IJSFCoreConstants.JSF_CORE_FACET_ID );
-            
-            final IProjectFacetVersion jsfFacetVersion11
-                = jsfFacet.getVersion( IJSFCoreConstants.JSF_VERSION_1_1 );
-            
-            facets.add( jsfFacetVersion11 );
-            facets.add( webFacetVersion );
-            
-            if( webFacetVersion == WebFacetUtils.WEB_23 )
-            {
-                facets.add( JavaFacet.VERSION_1_3 );
-            }
-            else if( webFacetVersion == WebFacetUtils.WEB_24 )
-            {
-                facets.add( JavaFacet.VERSION_1_4 );
-            }
-            else
-            {
-                facets.add( JavaFacet.VERSION_1_5 );
-            }
-            
-            return new PresetDefinition( Messages.JSFFacet11_presetLabel, Messages.JSFFacet11_presetDescription, facets );
-        }
-        
-        return null;
-    }
-    
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFFacetException.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFFacetException.java
deleted file mode 100644
index d2878b3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFFacetException.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.internal.project.facet;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-
-/**
- * Exception for use during JSF Facet installation/un-installation
- *
- */
-public class JSFFacetException extends CoreException {
-
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * Constructor
-	 * @param msg
-	 */
-	public JSFFacetException(String msg) {
-		super(new Status(IStatus.ERROR, JSFCorePlugin.PLUGIN_ID, msg));
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFFacetInstallDataModelProvider.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFFacetInstallDataModelProvider.java
deleted file mode 100644
index 9fc0b6d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFFacetInstallDataModelProvider.java
+++ /dev/null
@@ -1,402 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler - initial API and implementation
- *    Debajit Adhikary - Fixes for bug 255097 ("Request to remove input fields 
- *                       from facet install page")
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.internal.project.facet;
-
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Set;
-import java.util.regex.Pattern;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jdt.core.IClasspathEntry;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jst.common.project.facet.core.libprov.IPropertyChangeListener;
-import org.eclipse.jst.common.project.facet.core.libprov.LibraryInstallDelegate;
-import org.eclipse.jst.j2ee.project.facet.IJ2EEModuleFacetInstallDataModelProperties;
-import org.eclipse.jst.jsf.core.IJSFCoreConstants;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.core.internal.Messages;
-import org.eclipse.jst.jsf.core.internal.jsflibraryconfig.JSFLibraryInternalReference;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.wst.common.componentcore.ComponentCore;
-import org.eclipse.wst.common.componentcore.datamodel.FacetInstallDataModelProvider;
-import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetDataModelProperties;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
-import org.eclipse.wst.common.project.facet.core.IFacetedProjectWorkingCopy;
-import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
-import org.eclipse.wst.common.project.facet.core.IFacetedProject.Action;
-
-/**
- * Provides a data model used by the JSF facet install.
- * 
- * @author Gerry Kessler - Oracle
- */
-@SuppressWarnings("deprecation")
-public class JSFFacetInstallDataModelProvider extends
-		FacetInstallDataModelProvider implements
-		IJSFFacetInstallDataModelProperties {
-
-    private static final String REGEX_FOR_VALID_CONFIG_FILE_NAME = "^(?!.*/{2,}.*$)[-\\w/.]+$"; //$NON-NLS-1$
-    private static final Pattern PATTERN_FOR_VALID_CONFIG_FILE_NAME = Pattern.compile(REGEX_FOR_VALID_CONFIG_FILE_NAME);
-
-    private final boolean jsfFacetConfigurationEnabled = JsfFacetConfigurationUtil.isJsfFacetConfigurationEnabled();
-
-    private LibraryInstallDelegate libraryInstallDelegate = null;
-    
-    private void initLibraryInstallDelegate()
-    {
-        final IFacetedProjectWorkingCopy fpjwc = (IFacetedProjectWorkingCopy) getProperty( FACETED_PROJECT_WORKING_COPY );
-        final IProjectFacetVersion fv = (IProjectFacetVersion) getProperty( FACET_VERSION );
-        
-        if( this.libraryInstallDelegate == null && fpjwc != null && fv != null )
-        {
-            this.libraryInstallDelegate = new LibraryInstallDelegate( fpjwc, fv );
-            
-            this.libraryInstallDelegate.addListener
-            ( 
-                new IPropertyChangeListener()
-                {
-                    public void propertyChanged( final String property,
-                                                 final Object oldValue,
-                                                 final Object newValue )
-                    {
-                        final IDataModel dm = getDataModel();
-    
-                        if( dm != null )
-                        {
-                            dm.notifyPropertyChange( LIBRARY_PROVIDER_DELEGATE, IDataModel.VALUE_CHG );
-                        }
-                    }
-                }
-            );
-        }
-    }
-    
-	private String 	errorMessage;
-
-	
-	public Set getPropertyNames() {
-		Set names = super.getPropertyNames();
-		
-		if (jsfFacetConfigurationEnabled)
-		{
-    		names.add(CONFIG_PATH);
-    		names.add(SERVLET_NAME);
-    		names.add(SERVLET_CLASSNAME);
-    		names.add(SERVLET_URL_PATTERNS);
-    		names.add(COMPONENT_LIBRARIES);
-    		names.add(WEBCONTENT_DIR);
-    		
-		}
-
-		names.add(LIBRARY_PROVIDER_DELEGATE);
-
-        return names;
-	}
-
-	public Object getDefaultProperty(String propertyName) {
-		if (propertyName.equals(CONFIG_PATH)) {
-			return JSFUtils.JSF_DEFAULT_CONFIG_PATH; 
-		} else if (propertyName.equals(SERVLET_NAME)) {
-			return JSFUtils.JSF_DEFAULT_SERVLET_NAME;
-		} else if (propertyName.equals(SERVLET_CLASSNAME)) {
-			return JSFUtils.JSF_SERVLET_CLASS;	
-		} else if (propertyName.equals(SERVLET_URL_PATTERNS)) {
-			return new String[] {JSFUtils.JSF_DEFAULT_URL_MAPPING };
-		} else if (propertyName.equals(FACET_ID)) {
-			return IJSFCoreConstants.JSF_CORE_FACET_ID;
-		} else if (propertyName.equals(WEBCONTENT_DIR)){
-			return "WebContent";  //not sure I need this //$NON-NLS-1$
-        } else if (propertyName.equals(LIBRARY_PROVIDER_DELEGATE)) {
-            return this.libraryInstallDelegate;
-		} else if (propertyName.equals(COMPONENT_LIBRARIES)) {
-			return new JSFLibraryInternalReference[0];
-		}
-		return super.getDefaultProperty(propertyName);
-	}
-	
-	@Override
-    public boolean propertySet( final String propertyName,
-                                final Object propertyValue )
-    {
-	    if( propertyName.equals( FACETED_PROJECT_WORKING_COPY ) || propertyName.equals( FACET_VERSION ) )
-	    {
-	        initLibraryInstallDelegate();
-	        
-	        if( this.libraryInstallDelegate != null && propertyName.equals( FACET_VERSION ) )
-	        {
-	            final IProjectFacetVersion fv = (IProjectFacetVersion) getProperty( FACET_VERSION );
-	            this.libraryInstallDelegate.setProjectFacetVersion( fv );
-	        }
-	    }
-
-        return super.propertySet( propertyName, propertyValue );
-    }
-
-    public IStatus validate(String name) {
-		errorMessage = null;
-		
-		if (jsfFacetConfigurationEnabled)
-		{
-    		if (name.equals(CONFIG_PATH)) {
-    			return validateConfigLocation(getStringProperty(CONFIG_PATH));
-    		} else if (name.equals(SERVLET_NAME)) {			
-    			return validateServletName(getStringProperty(SERVLET_NAME));
-    		}
-    		else if (name.equals(COMPONENT_LIBRARIES)) {
-    			return validateClasspath();
-    		}
-   		}
-
-		if (name.equals(LIBRARY_PROVIDER_DELEGATE)) 
-		{
-            return ((LibraryInstallDelegate) getProperty(LIBRARY_PROVIDER_DELEGATE)).validate();
-        }
-		
-		return super.validate(name);
-	}
-	
-	private IStatus createErrorStatus(String msg) {		
-		return new Status(IStatus.ERROR, JSFCorePlugin.PLUGIN_ID, msg);
-	}
-	
-	private IStatus validateServletName(String servletName) {
-		if (servletName == null || servletName.trim().length() == 0) {
-			errorMessage = Messages.JSFFacetInstallDataModelProvider_ValidateServletName;
-			return createErrorStatus(errorMessage);				
-		}
-		
-		return OK_STATUS;
-	}
-
-	private IStatus validateConfigLocation(String text) {
-		if (text == null || text.trim().equals("")) { //$NON-NLS-1$
-			errorMessage = Messages.JSFFacetInstallDataModelProvider_ValidateConfigFileEmpty;
-			return createErrorStatus(errorMessage);
-		}
-		text = text.trim();
-		
-		if (getProjectPath() == null) //this circumstance occurs on page init
-			return OK_STATUS;
-		
-		IPath fullPath = getProjectPath().append(text);
-		IPath passedPath = new Path(text);
-		if (!fullPath.isValidPath(text)){
-			errorMessage = Messages.JSFFacetInstallDataModelProvider_ValidateConfigFilePath;
-			return createErrorStatus(errorMessage);
-		}
-		
-		//FIXME:  check for valid file path also [passedPath.toFile().isFile()] 
-		if (text.toLowerCase().lastIndexOf(".xml") != text.length() - 4) { //$NON-NLS-1$
-			errorMessage = Messages.JSFFacetInstallDataModelProvider_ValidateConfigFileXML;
-			return createErrorStatus(errorMessage);
-		}
-		
-		// Configuration path must not contain backslashes.
-		// Must use forward slashes instead.
-		if (text.lastIndexOf("\\") >= 0){ //$NON-NLS-1$
-			errorMessage = Messages.JSFFacetInstallDataModelProvider_ValidateConfigFileSlashes;
-			return createErrorStatus(errorMessage);
-		} 
-
-		// Configuration file must NOT be absolute path.
-		// It must be specified relative to project.
-		if (passedPath.getDevice() != null) {
-			errorMessage = NLS.bind(
-					Messages.JSFFacetInstallDataModelProvider_ValidateConfigFileRelative1,
-					getWebContentFolderName());
-			return createErrorStatus(errorMessage);
-		}
-
-		// Configuration file must be located in the project's folder
-		IPath webContentFolder = getWebContentFolder();
-		IPath setPath = webContentFolder.append(passedPath);
-		if (!getWebContentFolder().isPrefixOf(setPath)) {
-			errorMessage = NLS.bind(
-					Messages.JSFFacetInstallDataModelProvider_ValidateConfigFileRelative2,
-					getWebContentFolderName());
-			return createErrorStatus(errorMessage);
-		}
-
-        // Check for other general invalid characters
-        if (!isValidConfigFileName(text))
-        {
-            errorMessage = Messages.JSFFacetInstallDataModelProvider_INVALID_JSF_CONFIG_FILE_NAME;
-            return createErrorStatus(errorMessage);
-        }
-
-		return OK_STATUS;
-	}
-
-
-    /**
-     * (This method had been made protected to enable JUnit testing.)
-     * 
-     * @param configFileName
-     * @return True if the argument config file name does not have any invalid
-     *         characters.
-     */
-    public static boolean isValidConfigFileName (final String configFileName)
-    {
-        return PATTERN_FOR_VALID_CONFIG_FILE_NAME.matcher(configFileName).matches(); 
-    }
-
-
-	private IStatus validateClasspath(){
-		Set jars = new HashSet();
-		if (doesProjectExist()){
-			//validate actual classpath by loading jars from cp
-			try {
-				IClasspathEntry[] entries = getJavaProject().getResolvedClasspath(true);
-				for (int i=0;i<entries.length;i++){
-					IClasspathEntry entry = entries[i];
-					if (entry.getEntryKind() == IClasspathEntry.CPE_LIBRARY){
-						jars.add(entry.getPath().makeAbsolute().toString());
-					}
-				}
-			} catch (JavaModelException e) {
-			    // FIXME: what should we do in this case?
-			    JSFCorePlugin.log(e, "Error searching class path"); //$NON-NLS-1$
-			}			
-		}
-		//else as we do not have a javaProject yet, all we can do is validate that there is no duplicate jars (absolute path)
-		
-		IStatus status = null;
-		
-		JSFLibraryInternalReference[] compLibs = (JSFLibraryInternalReference[]) getProperty(IJSFFacetInstallDataModelProperties.COMPONENT_LIBRARIES);
-		if (compLibs != null){
-			for (int i=0;i<compLibs.length;i++){
-				JSFLibrary lib = compLibs[i].getLibrary();
-				status = checkForDupeArchiveFiles(jars, lib);
-					if (!OK_STATUS.equals(status)){
-						return status;
-					}
-			}		
-		}
-		return OK_STATUS;
-	}
-
-	private IJavaProject getJavaProject() {
-		IProject proj = getProject();
-		if (proj != null)
-			return JavaCore.create(proj); 
-		return null;
-	}
-
-	private IProject getProject(){
-		String projName = (String)getProperty(FACET_PROJECT_NAME);
-		if (projName == null || "".equals(projName)) //$NON-NLS-1$
-			return null;
-		
-		IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(projName);
-		return project;
-	}
-	
-	private boolean doesProjectExist() {
-		IProject project = getProject();
-		return (project != null) && project.exists();
-	}
-
-	private IStatus checkForDupeArchiveFiles(Set jars,
-			JSFLibrary aJSFLib) {
-		if (aJSFLib == null)
-			return OK_STATUS;
-		
-		for (Iterator it=aJSFLib.getArchiveFiles().iterator();it.hasNext();){
-			ArchiveFile jar = (ArchiveFile)it.next();
-			if (jars.contains(jar.getResolvedSourceLocation())){
-				return createErrorStatus(NLS.bind(Messages.JSFFacetInstallDataModelProvider_DupeJarValidation,jar.getResolvedSourceLocation()));				
-			}
-            jars.add(jar.getResolvedSourceLocation());
-		}
-		return OK_STATUS;
-	}
-	
-	private IPath getProjectPath() {		
-		IProject project = getProject();
-		if (project == null)
-			return null;
-		else if (project.exists())
-			return project.getLocation();
-		
-		String projName = (String)getProperty(FACET_PROJECT_NAME);
-		IFacetedProjectWorkingCopy projModel = (IFacetedProjectWorkingCopy)getProperty(FACETED_PROJECT_WORKING_COPY );
-		
-		if (projModel.getProjectLocation() != null)
-			return projModel.getProjectLocation().append(projName);
-
-		return ResourcesPlugin.getWorkspace().getRoot().getRawLocation().append(projName);
-		
-	}
-
-	private IPath getWebContentFolder() {
-		//One can get here 2 ways:
-		//if web app exists and user is adding a facet, or
-		// if creating a new web app.
-
-		IPath webContentPath = null;
-		String projName = model.getStringProperty(IFacetDataModelProperties.FACET_PROJECT_NAME);
-		IProject proj = ResourcesPlugin.getWorkspace().getRoot()
-				.getProject(projName);
-		
-		String webFolder = getWebContentFolderName();
-		if (proj.exists()) {
-			
-			webContentPath = ComponentCore.createComponent(proj).getRootFolder()
-						.getUnderlyingFolder().getRawLocation();
-		}
-		else {			
-
-			if (webFolder == null){
-				//we got problems... should not happen
-				return proj.getFullPath();
-			}
-			webContentPath = proj.getFullPath().append(webFolder);
-
-		}
-		return webContentPath;
-	}
-	
-	private String getWebContentFolderName() {
-		String projName = (String)getProperty(FACET_PROJECT_NAME);
-		IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(projName);
-		if (project.exists()){
-			IPath webContentPath = ComponentCore.createComponent(project).getRootFolder()
-			.getUnderlyingFolder().getProjectRelativePath();
-
-			return webContentPath.toString();
-		}
-		
-		IFacetedProjectWorkingCopy projWC = (IFacetedProjectWorkingCopy)getProperty(FACETED_PROJECT_WORKING_COPY);
-		Set<Action> pfas = projWC.getProjectFacetActions();
-		for (Action action : pfas){
-			if (action.getProjectFacetVersion().getProjectFacet().getId().equals("jst.web")){ //$NON-NLS-1$
-				IDataModel webFacet = (IDataModel) action.getConfig();
-				return webFacet.getStringProperty(IJ2EEModuleFacetInstallDataModelProperties.CONFIG_FOLDER );
-			}
-		}
-		
-		//should not get here.   
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFFacetInstallDelegate.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFFacetInstallDelegate.java
deleted file mode 100644
index 3b5789d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFFacetInstallDelegate.java
+++ /dev/null
@@ -1,400 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler - initial API and implementation
- *    Debajit Adhikary - Fixes for bug 255097 ("Request to remove input fields 
- *                       from facet install page")
- *                     - MyFaces and SunRI-specific configuration
- *******************************************************************************/ 
-
-package org.eclipse.jst.jsf.core.internal.project.facet;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspaceRunnable;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jst.common.project.facet.core.libprov.LibraryInstallDelegate;
-import org.eclipse.jst.common.project.facet.core.libprov.LibraryProviderOperationConfig;
-import org.eclipse.jst.common.project.facet.core.libprov.user.UserLibraryProviderInstallOperationConfig;
-import org.eclipse.jst.j2ee.model.IModelProvider;
-import org.eclipse.jst.j2ee.model.ModelProviderManager;
-import org.eclipse.jst.javaee.web.WebApp;
-import org.eclipse.jst.jsf.common.facet.libraryprovider.jsf.JsfLibraryUtil;
-import org.eclipse.jst.jsf.common.webxml.WebXmlUpdater;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.core.internal.Messages;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.wst.common.componentcore.ComponentCore;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
-import org.eclipse.wst.common.project.facet.core.IDelegate;
-import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
-
-/**
- * JSF Facet Install Delegate for WTP faceted web projects.  Deals with 2.3, 2.4 and 2.5 web app models.
- * 
- * Uses <code>com.eclispe.jst.jsf.core.internal.project.facet.JSFFacetInstallDataModelProvider<code> for model
- * 	 <li> creates JSF configuration file if not already present.  It will not attempt to upgrade or downgrade the version if there is a mismatch.
- * 	 <li> updates web.xml for: servlet, servlet-mapping and context-param
- * 	 <li> adds implementation jars to WEB-INF/lib if user requests
- * 
- * @see org.eclipse.jst.jsf.core.internal.project.facet.JSFFacetInstallDataModelProvider
- * @since 1.0
- */
-public final class JSFFacetInstallDelegate implements IDelegate {
-
-    private final boolean jsfFacetConfigurationEnabled = JsfFacetConfigurationUtil.isJsfFacetConfigurationEnabled();
-    
-    
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.project.facet.core.IDelegate#execute(org.eclipse.core.resources.IProject, org.eclipse.wst.common.project.facet.core.IProjectFacetVersion, java.lang.Object, org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public void execute(final IProject project, final IProjectFacetVersion fv,
-			final Object cfg, final IProgressMonitor monitor)
-			throws CoreException
-
-	{
-
-		if (monitor != null) {
-			monitor.beginTask("", 1); //$NON-NLS-1$
-		}
-
-		try {
-			IDataModel config = null;
-
-			if (cfg != null) {
-				config = (IDataModel) cfg;
-			} else {
-				throw new JSFFacetException(						
-								Messages.JSFFacetInstallDelegate_InternalErr);
-			}
-
-            final JSFUtils jsfUtil = new JSFUtilFactory().create(fv, ModelProviderManager.getModelProvider(project));
-            if (jsfUtil == null)
-            {
-                throw new JSFFacetException(NLS.bind(
-                        Messages.Could_Not_GetJSFVersion, fv.toString()));
-            }
-
-            if (jsfFacetConfigurationEnabled)
-            {
-                // Before we do any configuration, verify that web.xml is                    // available for update
-                final IModelProvider provider = jsfUtil
-                        .getModelProvider();
-                if (provider == null)
-                {
-                    throw new JSFFacetException(NLS.bind(
-                            Messages.JSFFacetInstallDelegate_ConfigErr,
-                            project.getName()));
-                } 
-                else if (!(provider.validateEdit(null, null).isOK()))
-                {
-                    if (!(provider.validateEdit(null, null).isOK()))
-                    {// checks for web.xml file being read-only and allows
-                     // user to set writeable
-                        throw new JSFFacetException(
-                                NLS.bind(
-                                        Messages.JSFFacetInstallDelegate_NonUpdateableWebXML,
-                                        project.getName()));
-                    }
-                }
-            }
-			
-//			// Create JSF Libs as classpath containers and set WTP dependencies
-//			// as required
-//			createClasspathEntries(project, fv, config, monitor);
-			
-			//Configure libraries
-			( (LibraryInstallDelegate) config.getProperty( IJSFFacetInstallDataModelProperties.LIBRARY_PROVIDER_DELEGATE ) ).execute( new NullProgressMonitor() );
-
-	        final LibraryInstallDelegate libDelegate = (LibraryInstallDelegate) (config.getProperty( IJSFFacetInstallDataModelProperties.LIBRARY_PROVIDER_DELEGATE));
-	        final LibraryProviderOperationConfig libConfig = libDelegate.getLibraryProviderOperationConfig();
-
-			if (jsfFacetConfigurationEnabled)
-            {
-    			// Create config file
-    			createConfigFile(project, fv, config, monitor, jsfUtil);
-
-    			// Update web model
-    			createServletAndModifyWebXML(project, config, monitor, jsfUtil);
-                updateWebXmlByJsfVendor(libConfig, project, monitor);
-            }
-            
-			if (monitor != null) {
-				monitor.worked(1);
-			}
-
-		} finally {
-			if (monitor != null) {
-				monitor.done();
-			}
-		}
-	}
-
-
-    /**
-     * Configures web.xml for MyFaces or Sun-RI when a user-library is used.
-     * Does no special configuration when a third party library provider is used
-     * (e.g. WebLogic shared library)
-     * 
-     * @param libConfig
-     *            Library install delegate
-     * @param project
-     *            IProject to update
-     * @param monitor
-     *            IProgressMonitor
-     */
-    private void updateWebXmlByJsfVendor (final LibraryProviderOperationConfig libConfig, 
-                                          final IProject project, 
-                                          final IProgressMonitor monitor)
-    {
-        final UserLibraryProviderInstallOperationConfig userLibConfig = getUserLibConfig(libConfig);
-        if (userLibConfig == null) // Not a user lib provider (e.g. shared lib provider)
-            return;  // Any special configuration will be done by third party lib provider.
-
-
-        switch (JsfLibraryUtil.getJsfLibraryVendorType(userLibConfig))
-        {
-        case MYFACES:
-            updateWebXmlForMyfaces(project, monitor);
-            break;
-        case SUN_RI:
-            updateWebXmlForSunRi(project, monitor);
-            break;
-        case UNKNOWN:
-            break;
-        }
-    }
-
-
-    /**
-     * (Refactored into a protected method for JUnit testing)
-     * 
-     * @param libConfig LibraryProviderOperationConfig object
-     * 
-     * @return WtpUserLibraryProviderInstallOperationConfig object if the
-     *         argument object has the same runtime type. Returns null
-     *         otherwise e.g. if the libConfig is of the runtime type 
-     *         SharedLibraryProviderInstallOperationConfig.
-     */
-    public static UserLibraryProviderInstallOperationConfig getUserLibConfig (final LibraryProviderOperationConfig libConfig)
-    {
-        if (!(libConfig instanceof UserLibraryProviderInstallOperationConfig)) // Third-party shared library providers etc.
-            return null;
-
-        return (UserLibraryProviderInstallOperationConfig) libConfig;
-    }
-
-
-    /**
-     * Updates web.xml for the given project with MyFaces-specific parameters.
-     * (This method is public static so that it may be called by other third
-     * party library providers for consistent MyFaces configuration across
-     * different JSF library providers)
-     * 
-     * @param project
-     *            IProject whose web.xml is to be updated.
-     * 
-     * @param monitor
-     *            IProgressMonitor
-     */
-    public static void updateWebXmlForMyfaces (final IProject project, 
-                                               final IProgressMonitor monitor)
-    {
-        final WebXmlUpdater updater = new WebXmlUpdater(project, monitor);
-        
-        updater.addContextParam("javax.servlet.jsp.jstl.fmt.localizationContext", "resources.application", null);  //$NON-NLS-1$//$NON-NLS-2$
-        updater.addContextParam("javax.faces.STATE_SAVING_METHOD", "client", Messages.JSFFacetInstallDelegate_StateSavingMethod); //$NON-NLS-1$ //$NON-NLS-2$
-        updater.addContextParam("org.apache.myfaces.ALLOW_JAVASCRIPT", "true", Messages.JSFFacetInstallDelegate_AllowJavascriptDescription); //$NON-NLS-1$ //$NON-NLS-2$
-        updater.addContextParam("org.apache.myfaces.PRETTY_HTML", "true", Messages.JSFFacetInstallDelegate_PrettyHtmlDescription); //$NON-NLS-1$ //$NON-NLS-2$
-        updater.addContextParam("org.apache.myfaces.DETECT_JAVASCRIPT", "false", null);  //$NON-NLS-1$//$NON-NLS-2$
-        updater.addContextParam("org.apache.myfaces.AUTO_SCROLL", "true", Messages.JSFFacetInstallDelegate_AutoScrollDescription); //$NON-NLS-1$ //$NON-NLS-2$
-
-// Following 3 lines disabled for https://bugs.eclipse.org/bugs/show_bug.cgi?id=317865         
-//        updater.addServlet("faces", "org.apache.myfaces.webapp.MyFacesServlet", "1"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-//        updater.addServletMapping("faces", "org.apache.myfaces.webapp.MyFacesServlet", "*.jsf");  //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$
-//        updater.addServletMapping("faces", "org.apache.myfaces.webapp.MyFacesServlet", "*.faces");  //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$
-        
-        updater.addListener("org.apache.myfaces.webapp.StartupServletContextListener"); //$NON-NLS-1$
-        
-//        // Additional, more complex updates
-//        if (updater.isJavaEEWebapp())
-//        {
-//            updater.getProvider().modify(new UpdateWebXmlForMyfacesJavaEE(project, monitor), WebXmlUtils.WEB_XML_PATH);
-//        }
-//        else if (updater.isJ2EEWebapp())
-//        {
-//            updater.getProvider().modify(new UpdateWebXmlForMyfacesJ2EE(project, monitor), WebXmlUtils.WEB_XML_PATH);
-//        }
-    }
-
-
-    /**
-     * Updates web.xml for the given project with SunRI-specific parameters.
-     * (This method is public static so that it may be called by other third
-     * party library providers for consistent Sun-RI configuration across
-     * different JSF library providers)
-     *
-     * @param project
-     *            IProject whose web.xml is to be updated.
-     *
-     * @param monitor
-     *            IProgressMonitor
-     */
-    public static void updateWebXmlForSunRi (final IProject project,
-                                             final IProgressMonitor monitor)
-    {
-        final WebXmlUpdater updater = new WebXmlUpdater(project, monitor);
-        
-        updater.addContextParam("javax.faces.STATE_SAVING_METHOD", "client", Messages.JSFFacetInstallDelegate_StateSavingMethod);  //$NON-NLS-1$//$NON-NLS-2$
-        updater.addContextParam("javax.servlet.jsp.jstl.fmt.localizationContext", "resources.application", null); //$NON-NLS-1$ //$NON-NLS-2$
-        updater.addListener("com.sun.faces.config.ConfigureListener"); //$NON-NLS-1$
-
-//Following 3 lines disabled for https://bugs.eclipse.org/bugs/show_bug.cgi?id=317865 and https://bugs.eclipse.org/bugs/show_bug.cgi?id=317868        
-//        updater.addServlet("Faces Servlet", "javax.faces.webapp.FacesServlet", "1");   //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$
-//        updater.addServletMapping("Faces Servlet", "javax.faces.webapp.FacesServlet", "*.jsf");   //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$
-//        updater.addServletMapping("Faces Servlet", "javax.faces.webapp.FacesServlet", "*.faces");   //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$
-    }
-
-
-//	/**
-//	 * @param path
-//	 * @param lib
-//	 * @return creates new IClasspathEntry with WTP dependency attribute set, if required
-//	 */
-//	private IClasspathEntry getNewCPEntry(final IPath path, final JSFLibraryInternalReference lib) {
-//		
-//		IClasspathEntry entry = null;
-//		if (lib.isCheckedToBeDeployed()){
-//			IClasspathAttribute depAttrib = JavaCore.newClasspathAttribute(IClasspathDependencyConstants.CLASSPATH_COMPONENT_DEPENDENCY,
-//					 ClasspathDependencyUtil.getDefaultRuntimePath(true).toString());
-//			entry = JavaCore.newContainerEntry(path,null, new IClasspathAttribute[]{depAttrib}, true);
-//		}
-//		else {
-//			entry = JavaCore.newContainerEntry(path);
-//		}
-//		
-//		return entry;
-//	}		
-
-
-	/**
-	 * @param project
-	 * @param jsfConfigPath
-	 * @return absolute IPath to jsfConfig
-	 */
-	private IPath resolveConfigPath(final IProject project, final String jsfConfigPath) {
-		return ComponentCore.createComponent(project).getRootFolder()
-				.getUnderlyingFolder().getRawLocation().append(
-						new Path(jsfConfigPath));
-
-	}
-
-	/**
-	 * Create the faces configuration file.  If the file already exist, then the file is left alone.
-	 * @param project
-	 * @param fv
-	 * @param config
-	 * @param monitor
-	 */
-	private void createConfigFile(final IProject project,
-			final IProjectFacetVersion fv, final IDataModel config,
-			final IProgressMonitor monitor, final JSFUtils jsfUtil) {
-
-
-		final IPath configPath = resolveConfigPath(project, config.getStringProperty(IJSFFacetInstallDataModelProperties.CONFIG_PATH));
-		try {
-			// do not overwrite if the file exists
-			if (!configPath.toFile().exists()) {
-				final IWorkspaceRunnable op = new IWorkspaceRunnable(){
-					public void run(final IProgressMonitor monitor_inner) throws CoreException{
-						    jsfUtil.createConfigFile(configPath);
-						project.refreshLocal(IResource.DEPTH_INFINITE, monitor_inner);
-					}
-				};
-				op.run(monitor);
-			}
-		} catch (final CoreException e) {
-			JSFCorePlugin.log(e, "Exception occured while creating faces-config.xml");//$NON-NLS-1$
-		}
-
-	}
-
-    /**
-     * Create servlet and URL mappings and update the webapp
-     * 
-     * @param project
-     * @param config
-     * @param monitor
-     */
-    private void createServletAndModifyWebXML(final IProject project,
-            final IDataModel config, final IProgressMonitor monitor,
-            final JSFUtils jsfUtil)
-    {
-
-        final IModelProvider provider = jsfUtil.getModelProvider();
-        final IPath webXMLPath = new Path("WEB-INF").append("web.xml"); //$NON-NLS-1$ //$NON-NLS-2$
-        if (jsfUtil.isJavaEE(provider.getModelObject()))
-        {
-            provider.modify(new UpdateWebXMLForJavaEE(project, config, jsfUtil),
-                    doesDDFileExist(project, webXMLPath) ? webXMLPath
-                            : IModelProvider.FORCESAVE);
-        } else
-        {// must be 2.3 or 2.4
-            provider.modify(new UpdateWebXMLForJ2EE(project, config, jsfUtil),
-                    webXMLPath);
-        }
-        // TODO: is the MyFaces check a todo?
-        // Check if runtime is MyFaces or Sun-RI
-    }
-
-	private boolean doesDDFileExist(final IProject project, final IPath webXMLPath) {
-		return project.getProjectRelativePath().append(webXMLPath).toFile().exists();		
-	}
-
-	private class UpdateWebXMLForJavaEE implements Runnable {
-		private final IProject project;
-		private final IDataModel config;
-        private final JSFUtils jsfUtil;
-		
-		UpdateWebXMLForJavaEE(final IProject project, final IDataModel config, final JSFUtils jsfUtil){
-			this.project = project;
-			this.config = config;
-			this.jsfUtil = jsfUtil;
-		}
-		
-		public void run() {
-			final WebApp webApp = (WebApp) ModelProviderManager.getModelProvider(project).getModelObject();
-			jsfUtil.updateWebApp(webApp, config);
-		}
-	}
-	
-	private class UpdateWebXMLForJ2EE implements Runnable {		
-		private final IProject project;
-		private final IDataModel config;
-        private final JSFUtils jsfUtil;
-		
-		UpdateWebXMLForJ2EE(final IProject project, final IDataModel config, final JSFUtils jsfUtil){
-			this.project = project ;
-			this.config = config;
-			this.jsfUtil = jsfUtil;
-		}
-		
-		public void run() {
-			final org.eclipse.jst.j2ee.webapplication.WebApp webApp = (org.eclipse.jst.j2ee.webapplication.WebApp)ModelProviderManager.getModelProvider(project).getModelObject();
-			jsfUtil.updateWebApp(webApp, config);
-		}
-		
-	}
-
-
-	
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFFacetPrimaryRuntimeChangedListener.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFFacetPrimaryRuntimeChangedListener.java
deleted file mode 100644
index 7a36602..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFFacetPrimaryRuntimeChangedListener.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.internal.project.facet;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jst.common.project.facet.core.ClasspathHelper;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.core.jsfappconfig.JSFAppConfigUtils;
-import org.eclipse.jst.jsf.core.jsflibraryconfiguration.JSFLibraryConfigurationHelper;
-import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
-import org.eclipse.wst.common.project.facet.core.events.IFacetedProjectEvent;
-import org.eclipse.wst.common.project.facet.core.events.IFacetedProjectListener;
-import org.eclipse.wst.common.project.facet.core.events.IPrimaryRuntimeChangedEvent;
-
-/**
- * Handles primary runtime changed events when the JSF Facet is installed
- * 
- * @since JSF 1.0.1
- */
-@SuppressWarnings("deprecation")
-public class JSFFacetPrimaryRuntimeChangedListener implements IFacetedProjectListener {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.project.facet.core.events.IFacetedProjectListener#handleEvent(org.eclipse.wst.common.project.facet.core.events.IFacetedProjectEvent)
-	 */
-	public void handleEvent(IFacetedProjectEvent event) {
-		if (event instanceof IPrimaryRuntimeChangedEvent &&
-				getJSFFacetedVersion(event.getProject().getProject()) != null && //must be a JSF faceted project
-				JSFLibraryConfigurationHelper.isConfiguredForSystemSuppliedImplementation(event.getProject().getProject())){
-			
-			try {				
-				IProject project = event.getProject().getProject();
-				IProjectFacetVersion fv = getJSFFacetedVersion(project);
-				ClasspathHelper.removeClasspathEntries(project, fv);
-				ClasspathHelper.addClasspathEntries(project, fv);
-			} catch (CoreException e) {
-				JSFCorePlugin.log(IStatus.ERROR, "Unable to replace server supplied implementation when runtime changed.", e);//$NON-NLS-1$
-			}
-		}
-		
-	}
-
-	/**
-	 * @param project
-	 * @return IProjectFacetVersion and null if not JSF faceted
-	 */
-	private IProjectFacetVersion getJSFFacetedVersion(IProject project) {
-		return JSFAppConfigUtils.getProjectFacet(project);		
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFFacetUninstallConfig.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFFacetUninstallConfig.java
deleted file mode 100644
index 1c1245a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFFacetUninstallConfig.java
+++ /dev/null
@@ -1,68 +0,0 @@
-package org.eclipse.jst.jsf.core.internal.project.facet;
-
-import org.eclipse.jst.common.project.facet.core.libprov.LibraryUninstallDelegate;
-import org.eclipse.wst.common.project.facet.core.ActionConfig;
-import org.eclipse.wst.common.project.facet.core.IActionConfigFactory;
-import org.eclipse.wst.common.project.facet.core.IFacetedProjectWorkingCopy;
-import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
-
-/**
- * Configuration for JSF facet uninstall
- *
- */
-public class JSFFacetUninstallConfig
-
-    extends ActionConfig
-    
-{
-    private LibraryUninstallDelegate librariesUninstallDelegate = null;
-    
-    /**
-     * @return the library uninstall delegate
-     */
-    public LibraryUninstallDelegate getLibrariesUninstallDelegate()
-    {
-        return this.librariesUninstallDelegate;
-    }
-
-    @Override
-    public void setFacetedProjectWorkingCopy( final IFacetedProjectWorkingCopy fpjwc )
-    {
-        super.setFacetedProjectWorkingCopy( fpjwc );
-        init();
-    }
-
-    @Override
-    public void setProjectFacetVersion( final IProjectFacetVersion fv )
-    {
-        super.setProjectFacetVersion( fv );
-        init();
-    }
-    
-    private void init()
-    {
-        final IFacetedProjectWorkingCopy fpjwc = getFacetedProjectWorkingCopy();
-        final IProjectFacetVersion fv = getProjectFacetVersion();
-        
-        if( this.librariesUninstallDelegate == null && fpjwc != null && fv != null )
-        {
-            this.librariesUninstallDelegate = new LibraryUninstallDelegate( fpjwc, fv );
-        }
-    }
-    
-    /**
-     * The action configuration factory for the JSF facet uninstall config
-     *
-     */
-    public static final class Factory
-        
-        implements IActionConfigFactory
-        
-    {
-        public Object create()
-        {
-            return new JSFFacetUninstallConfig();
-        }
-    }
-    
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFFacetUninstallDelegate.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFFacetUninstallDelegate.java
deleted file mode 100644
index 29406fb..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFFacetUninstallDelegate.java
+++ /dev/null
@@ -1,152 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    Debajit Adhikary - Fixes for bug 255097 ("Request to remove input fields 
- *                       from facet install page")
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.internal.project.facet;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jst.j2ee.model.IModelProvider;
-import org.eclipse.jst.j2ee.model.ModelProviderManager;
-import org.eclipse.jst.javaee.web.WebApp;
-import org.eclipse.jst.jsf.core.internal.Messages;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.wst.common.project.facet.core.IDelegate;
-import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
-
-/**
- * JSF Facet Un-install Delegate for WTP faceted projects.
- *	
- *	<li> removes JSF servlet, servlet-mappings and context-params
- *	<li> leaves JSF configuration files on disk
- *  <li> removes JSF classpath containers
- *  
- */
-public final class JSFFacetUninstallDelegate implements IDelegate {
-
-    private final boolean jsfFacetConfigurationEnabled = JsfFacetConfigurationUtil.isJsfFacetConfigurationEnabled();
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.project.facet.core.IDelegate#execute(org.eclipse.core.resources.IProject, org.eclipse.wst.common.project.facet.core.IProjectFacetVersion, java.lang.Object, org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public void execute(final IProject project, final IProjectFacetVersion fv,
-			final Object config, final IProgressMonitor monitor) throws CoreException {
-		{
-
-			if (monitor != null) {
-				monitor.beginTask("", 1); //$NON-NLS-1$
-			}
-
-			try 
-			{
-	            final JSFUtils jsfUtil = new JSFUtilFactory().create(fv, ModelProviderManager.getModelProvider(project));
-	            if (jsfUtil == null)
-	            {
-	                throw new JSFFacetException(NLS.bind(
-	                        Messages.Could_Not_GetJSFVersion, fv.toString()));
-	            }
-
-			    if (jsfFacetConfigurationEnabled)
-			    {
-    				//Before we do any de-configuration, verify that web.xml is available for update
-    				IModelProvider provider = jsfUtil.getModelProvider();
-    				if (provider == null ) {				
-    					throw new JSFFacetException(NLS.bind(Messages.JSFFacetUninstallDelegate_ConfigErr, project.getName())); 
-    				} else if (!(provider.validateEdit(null, null).isOK())){					
-    					throw new JSFFacetException(NLS.bind(Messages.JSFFacetUninstallDelegate_NonUpdateableWebXML, project.getName())); 
-    				}
-			    }
-			    
-				// Remove JSF Libraries
-				( (JSFFacetUninstallConfig) config ).getLibrariesUninstallDelegate().execute( null );
-				
-                if (jsfFacetConfigurationEnabled)
-                {
-    				// remove servlet stuff from web.xml
-    				uninstallJSFReferencesFromWebApp(project, monitor, jsfUtil);
-                }
-				if (monitor != null) {
-					monitor.worked(1);
-				}
-				
-			} finally {
-				if (monitor != null) {
-					monitor.done();
-				}
-			}
-		}
-	}
-	
-	private void uninstallJSFReferencesFromWebApp(final IProject project,
-			final IProgressMonitor monitor, final JSFUtils jsfUtil) {
-		
-		IModelProvider provider = jsfUtil.getModelProvider();
-		Object webAppObj = provider.getModelObject();
-        if (webAppObj != null)
-        {
-            IPath ddPath = new Path("WEB-INF").append("web.xml"); //$NON-NLS-1$ //$NON-NLS-2$
-            if (isJavaEEWebApp(webAppObj))
-            {
-                provider.modify(new RemoveJSFFromJavaEEWebAppOperation(project,
-                        jsfUtil), ddPath);
-            } else
-            {// 2.3 or 2.4 web app
-                provider.modify(new RemoveJSFFromJ2EEWebAppOperation(project,
-                        jsfUtil), ddPath);
-            }
-        }
-	}
-
-	private boolean isJavaEEWebApp(final Object webAppObj) {
-		if (webAppObj instanceof WebApp) 
-			return true;
-
-		return false;
-		
-	}
-
-	static class RemoveJSFFromJavaEEWebAppOperation implements Runnable {
-		private IProject _project;
-        private JSFUtils _jsfUtil;
-		
-		RemoveJSFFromJavaEEWebAppOperation(final IProject project, JSFUtils jsfUtil){
-			this._project = project;
-			this._jsfUtil = jsfUtil;
-		}
-		
-        public void run()
-        {
-            WebApp webApp = (WebApp) ModelProviderManager.getModelProvider(
-                    _project).getModelObject();
-            _jsfUtil.rollbackWebApp(webApp);
-        }
-		
-	}
-	
-	static class RemoveJSFFromJ2EEWebAppOperation implements Runnable {
-		private IProject _project;
-        private JSFUtils _jsfUtil;		
-		
-		RemoveJSFFromJ2EEWebAppOperation(final IProject project, JSFUtils jsfUtil){
-			this._project = project;
-			this._jsfUtil = jsfUtil;
-		}
-		
-		public void run() {
-			org.eclipse.jst.j2ee.webapplication.WebApp webApp = (org.eclipse.jst.j2ee.webapplication.WebApp) ModelProviderManager.getModelProvider(_project).getModelObject();
-			_jsfUtil.rollbackWebApp(webApp);
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFLibraryValidator.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFLibraryValidator.java
deleted file mode 100644
index e862a65..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFLibraryValidator.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2009 Oracle Corporation and others. All rights reserved.
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: Oracle Corporation - initial API and implementation
- *******************************************************************************/
-
-
-package org.eclipse.jst.jsf.core.internal.project.facet;
-
-import org.eclipse.jst.jsf.common.facet.libraryprovider.UserLibraryVersionValidator;
-
-
-/**
- * Checks that the JSF user library is version-compatible with the JSF facet.
- * 
- * @author Debajit Adhikary
- * 
- */
-public class JSFLibraryValidator extends UserLibraryVersionValidator
-{
-    private static final String CLASS_NAME_IDENTIFYING_IMPLEMENTATION_JAR = "javax/faces/render/RenderKit.class"; //$NON-NLS-1$
-
-
-    /**
-     * Construct a validator for the JSF facet.
-     */
-    public JSFLibraryValidator ()
-    {
-        super(CLASS_NAME_IDENTIFYING_IMPLEMENTATION_JAR);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFUtilFactory.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFUtilFactory.java
deleted file mode 100644
index 7e9bcd2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFUtilFactory.java
+++ /dev/null
@@ -1,68 +0,0 @@
-package org.eclipse.jst.jsf.core.internal.project.facet;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jst.j2ee.model.IModelProvider;
-import org.eclipse.jst.j2ee.model.ModelProviderManager;
-import org.eclipse.jst.jsf.core.JSFVersion;
-import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
-
-/**
- * Creates a new JSFUtil for a particular JSF project version.
- * 
- * @author cbateman
- *
- */
-public class JSFUtilFactory
-{
-    /**
-     * @param project
-     * @return the jsf version of the project if it is valid JSF faceted
-     * project or null otherwise.
-     */
-    public JSFUtils create(final IProject project)
-    {
-        final JSFVersion jsfVersion = JSFVersion.valueOfProject(project);
-        if (jsfVersion != null)
-        {
-            return create(jsfVersion, ModelProviderManager.getModelProvider(project));
-        }
-        return null;
-    }
-    /**
-     * @param version
-     * @param modelProvider 
-     * @return the JSF utils object for the version or null if none.
-     * @throw {@link IllegalArgumentException} if version is not related
-     * to a JSF facet.
-     */
-    public JSFUtils create(final IProjectFacetVersion version, final IModelProvider modelProvider)
-    {
-        final JSFVersion jsfVersion = JSFVersion.valueOfFacetVersion(version);
-        if (jsfVersion != null)
-        {
-            return create(jsfVersion, modelProvider);
-        }
-        return null;
-    }
-
-    /**
-     * @param version
-     * @param modelProvider 
-     * @return the JSF utils object for the version or null if none.
-     */
-    public JSFUtils create(final JSFVersion version, final IModelProvider modelProvider)
-    {
-        switch (version)
-        {
-        case V1_0:
-        case V1_1:
-            return new JSFUtils11(modelProvider);
-        case V1_2:
-            return new JSFUtils12(modelProvider);
-        case V2_0:
-            return new JSFUtils20(modelProvider);
-        default:
-            throw new IllegalArgumentException("Unknown version: "+version); //$NON-NLS-1$
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFUtils.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFUtils.java
deleted file mode 100644
index 933acf7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFUtils.java
+++ /dev/null
@@ -1,649 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler - initial API and implementation
- *******************************************************************************/ 
-
-package org.eclipse.jst.jsf.core.internal.project.facet;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.io.PrintWriter;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.jst.j2ee.model.IModelProvider;
-import org.eclipse.jst.javaee.web.WebAppVersionType;
-import org.eclipse.jst.jsf.core.JSFVersion;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.core.internal.Messages;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
-
-
-/**
- * 
- */
-@SuppressWarnings("deprecation")
-public abstract class JSFUtils {
-    /**
-	 * The default name for the Faces servlet
-	 */
-	public static final String JSF_DEFAULT_SERVLET_NAME = "Faces Servlet"; //$NON-NLS-1$
-	/**
-	 * The default name of the Faces servlet class
-	 */
-	public static final String JSF_SERVLET_CLASS = "javax.faces.webapp.FacesServlet"; //$NON-NLS-1$
-	/**
-	 * The name of the context parameter used for JSF configuration files
-	 */
-	public static final String JSF_CONFIG_CONTEXT_PARAM = "javax.faces.CONFIG_FILES"; //$NON-NLS-1$
-	
-	/**
-	 * The name of the context parameter used for defining the default JSP file extension
-	 */
-	public static final String JSF_DEFAULT_SUFFIX_CONTEXT_PARAM = "javax.faces.DEFAULT_SUFFIX"; //$NON-NLS-1$
-	
-	/**
-	 * The path to the default application configuration file
-	 */
-	public static final String JSF_DEFAULT_CONFIG_PATH = "/WEB-INF/faces-config.xml";  //$NON-NLS-1$
-
-	/**
-	 * Default URL mapping to faces servlet
-	 */
-	public static final String JSF_DEFAULT_URL_MAPPING = "/faces/*"; //$NON-NLS-1$
-
-	/**
-	 * the key for implementation libraries in persistent properties
-	 */
-	public static final String PP_JSF_IMPLEMENTATION_LIBRARIES = "jsf.implementation.libraries"; //$NON-NLS-1$
-	/**
-	 * the key for component libraries in persistent properties
-	 */
-	public static final String PP_JSF_COMPONENT_LIBRARIES = "jsf.component.libraries"; //$NON-NLS-1$
-	/**
-	 * the key for implementation type in persistent properties
-	 */
-	public static final String PP_JSF_IMPLEMENTATION_TYPE = "jsf.implementation.type"; //$NON-NLS-1$
-
-	private static final String DEFAULT_DEFAULT_MAPPING_SUFFIX = "jsp"; //$NON-NLS-1$
-	
-	private final JSFVersion  _version;
-    private final IModelProvider _modelProvider;
-	
-	/**
-	 * @param version
-	 * @param modelProvider 
-	 */
-	protected JSFUtils(final JSFVersion version, final IModelProvider modelProvider)
-	{
-	    _version = version;
-	    _modelProvider = modelProvider;
-	}
-	
-	/**
-	 * @return the jsf version that this instance is for.
-	 */
-	public final JSFVersion getVersion()
-    {
-        return _version;
-    }
-
-	/**
-	 * @param config
-	 * @return servlet display name to use from wizard data model
-	 */
-	protected final String getDisplayName(IDataModel config) {
-		String displayName = config.getStringProperty(IJSFFacetInstallDataModelProperties.SERVLET_NAME);
-		if (displayName == null || displayName.trim().length() == 0)
-			displayName = JSF_DEFAULT_SERVLET_NAME;
-		return displayName.trim();
-	}
-	
-	/**
-	 * @param config
-	 * @return servlet display name to use from wizard data model
-	 */
-	protected final String getServletClassname(IDataModel config) {
-		String className = config.getStringProperty(IJSFFacetInstallDataModelProperties.SERVLET_CLASSNAME);
-		if (className == null || className.trim().equals("")) //$NON-NLS-1$
-			className = JSF_SERVLET_CLASS;
-		return className.trim();
-	}
-
-	/**
-	 * @return IModelProvider
-	 */
-	public final IModelProvider getModelProvider() {
-		Object webAppObj = _modelProvider.getModelObject();
-		if (webAppObj == null)
-		{
-			return null;
-		}
-		return _modelProvider;
-	}
-
-   /**
-     * @param configPath
-     */
-    public final void createConfigFile(IPath configPath)
-    {
-        FileOutputStream os = null;
-//        final String QUOTE = new String(new char[] { '"' });
-        try {
-            IPath dirPath = configPath.removeLastSegments(1);
-            dirPath.toFile().mkdirs();
-            File file = configPath.toFile();
-            file.createNewFile();
-            os = new FileOutputStream(file);
-            printConfigFile(os);
-        } catch (FileNotFoundException e) {
-            JSFCorePlugin.log(IStatus.ERROR, Messages.JSFUtils_ErrorCreatingConfigFile, e);
-        } catch (IOException e) {
-            JSFCorePlugin.log(IStatus.ERROR, Messages.JSFUtils_ErrorCreatingConfigFile, e);
-        } finally {
-            if (os != null) {
-                try {
-                    os.close();
-                } catch (IOException e) {
-                    JSFCorePlugin.log(IStatus.ERROR, Messages.JSFUtils_ErrorClosingConfigFile, e);
-                }
-            }
-        }
-    }
-    
-    /**
-     * @param out
-     */
-    protected final void printConfigFile(final OutputStream out)
-    {
-        PrintWriter pw = null;
-        try
-        {
-            pw = new PrintWriter(out);
-            doVersionSpecificConfigFile(pw);
-        }
-        finally
-        {
-            if (pw != null)
-            {
-                pw.close();
-            }
-        }
-    }
-    
-    /**
-     * @param pw
-     */
-    public abstract void doVersionSpecificConfigFile(final PrintWriter pw);
-    
-    
-    /**
-     * @param webAppObj 
-     * @return true if this going into a JavaEE (1.5 and later) or a J2EE (1.4 and earlier)
-     * configured application.
-     */
-    public boolean isJavaEE(final Object webAppObj)
-    {
-      if (webAppObj instanceof org.eclipse.jst.javaee.web.WebApp)
-      {
-          org.eclipse.jst.javaee.web.WebApp webApp = (org.eclipse.jst.javaee.web.WebApp)webAppObj;
-          return WebAppVersionType.VALUES.contains(webApp.getVersion());
-      }
-      return false;
-    }
-
-    /**
-     * @param config
-     * @return list of URL patterns from the datamodel
-     */
-    protected final List<String> getServletMappings(final IDataModel config) {
-        final List<String> mappings = new ArrayList<String>();
-        final String[] patterns = (String[])config.getProperty(IJSFFacetInstallDataModelProperties.SERVLET_URL_PATTERNS);
-        if (patterns != null)
-        {
-            for (final String pattern : patterns)
-            {
-                mappings.add(pattern);
-            }
-        }
-        return mappings;
-    }
-    /**
-     * Does an update of the web application's config file.
-     * 
-     * @param webApp must be WebApp of the appropriate type.
-     * @param config
-     * @throws ClassCastException if webApp is not the appropriate type.
-     */
-    public abstract void updateWebApp(Object webApp, IDataModel config);
-
-
-    /**
-     * Called on a facet uninstall to remove JSF related changes.
-     * @param webApp
-     */
-    public abstract void rollbackWebApp(Object webApp);
-    
-    /**
-     * @param fileExtension
-     * @return true if the file extension is deemed to be for a JSF.
-     */
-    protected boolean isValidKnownExtension(String fileExtension) {
-        if (fileExtension != null &&
-                (   fileExtension.equalsIgnoreCase(DEFAULT_DEFAULT_MAPPING_SUFFIX) ||  
-                fileExtension.equalsIgnoreCase("jspx") ||  //$NON-NLS-1$
-                fileExtension.equalsIgnoreCase("jsf") || //$NON-NLS-1$
-                fileExtension.equalsIgnoreCase("xhtml"))) //$NON-NLS-1$
-            return true;
-
-        return false;
-    }
-
-    
-    /**
-     * @param resource
-     * @return true if the resource is deemed to be a JSF page.
-     */
-    protected boolean isJSFPage(IResource resource) {
-        // currently always return true.
-        // need to find quick way of determining whether this is a JSF JSP Page
-        return true;
-    }
-    
-    /**
-     * @param webApp
-     * @return the default file extension from the context param. Default is
-     *         "jsp" if no context param.
-     */
-    protected String getDefaultSuffix(Object webApp) {
-    	String contextParam = null;
-    	if(isJavaEE(webApp)) {
-    		contextParam = JEEUtils.getContextParam((org.eclipse.jst.javaee.web.WebApp) webApp, JSF_DEFAULT_SUFFIX_CONTEXT_PARAM);
-    	}
-    	else {
-    		contextParam = J2EEUtils.getContextParam((org.eclipse.jst.j2ee.webapplication.WebApp) webApp, JSF_DEFAULT_SUFFIX_CONTEXT_PARAM);
-    	}
-    	if(contextParam == null) {
-    		return getDefaultDefaultSuffix();
-    	}
-   		return normalizeSuffix(contextParam);
-    }
-    
-    /**
-     * @return the default value for the default mapping suffix
-     */
-    protected String getDefaultDefaultSuffix()
-    {
-        return DEFAULT_DEFAULT_MAPPING_SUFFIX;
-    }
-
-    /**
-     * @param name 
-     * @param value 
-     * @return the 
-     */
-    protected final String calculateSuffix(final String name, final String value)
-    {
-        if (name != null
-                && JSF_DEFAULT_SUFFIX_CONTEXT_PARAM.equals(name
-                        .trim()))
-        {
-            return normalizeSuffix(value != null ? value.trim() : null);
-        }
-        return null;
-    }
-
-    /**
-     * @param defSuffix
-     * @return the suffix value with any leading dot removed
-     */
-    protected final String normalizeSuffix(String defSuffix)
-    {
-        if (defSuffix != null && defSuffix.startsWith(".")) //$NON-NLS-1$
-        {
-            defSuffix = defSuffix.substring(1);
-        }
-        return defSuffix;
-    }
-
-    /**
-     * Holds all the obsolete JSF Library stuff.  This will go away post-Helios.
-     * @author cbateman
-     *
-     */
-    public static class JSFLibraryHandler
-    {
-        /**
-         * Construct an array that hold paths for all JARs in a JSF library. 
-         * 
-         * @param jsfLib
-         * @param logMissingJar true to log an error for each invalid JAR.
-         * @return elements
-         */
-        public final IPath[] getJARPathforJSFLib(JSFLibrary jsfLib, boolean logMissingJar) {        
-            EList archiveFiles = jsfLib.getArchiveFiles();
-            int numJars = archiveFiles.size();
-            IPath[] elements = new IPath[numJars];
-            ArchiveFile ar = null;
-            for (int i= 0; i < numJars; i++) {
-                ar = (ArchiveFile)archiveFiles.get(i); 
-                if ( !ar.exists() && logMissingJar ) {
-                    logErroronMissingJAR(jsfLib, ar);
-                }
-                elements[i] = new Path(((ArchiveFile)archiveFiles.get(i)).getResolvedSourceLocation()).makeAbsolute();
-            }
-            return elements;
-        }   
-        
-        private int numberofValidJar(EList archiveFiles) {
-            int total = 0;
-            final Iterator it = archiveFiles.iterator();
-            ArchiveFile ar = null;
-            while(it.hasNext()) {
-                ar = (ArchiveFile) it.next();
-                if (ar.exists()) {
-                    total++;
-                }
-            }
-            return total;
-        }
-        
-        private void logErroronMissingJAR(JSFLibrary jsfLib, ArchiveFile ar) {
-            String msg = NLS.bind(Messages.JSFUtils_MissingJAR, 
-                            ar.getName(),
-                            jsfLib.getLabel());
-            JSFCorePlugin.log(IStatus.ERROR, msg);
-        }
-        
-        /**
-         * Construct an array that hold paths for all JARs in a JSF library. 
-         * However, archive files that no longer exist are filtered out.  
-         * 
-         * @param jsfLib
-         * @param logMissingJar true to log an error for each invalid JAR.
-         * @return elements
-         */
-        public final IPath[] getJARPathforJSFLibwFilterMissingJars(JSFLibrary jsfLib, boolean logMissingJar) {
-            EList archiveFiles = jsfLib.getArchiveFiles();
-            int numJars = numberofValidJar(archiveFiles);
-            IPath[] elements = new IPath[numJars];
-            ArchiveFile ar = null;
-            int idxValidJar = 0;
-            for (int i= 0; i < archiveFiles.size(); i++) {
-                ar = (ArchiveFile)archiveFiles.get(i); 
-                if ( !ar.exists() ) {
-                    if (logMissingJar) {
-                        logErroronMissingJAR(jsfLib, ar);
-                    }
-                } else {
-                    elements[idxValidJar] = new Path(((ArchiveFile)archiveFiles.get(i)).getResolvedSourceLocation()).makeAbsolute();
-                    idxValidJar++;
-                }
-            }
-            return elements;        
-        }
-
-    }
-    
-	/**
-	 * Finds and returns a JSF Servlet definition, or null if servlet is not defined.
-	 * 
-	 * @param webApp
-	 * @return Servlet or null
-	 */    
-    protected Object findJSFServlet(Object webApp) {
-    	if(isJavaEE(webApp)) {
-    		return JEEUtils.findServlet((org.eclipse.jst.javaee.web.WebApp) webApp, JSF_SERVLET_CLASS);
-    	}
-   		return J2EEUtils.findServlet((org.eclipse.jst.j2ee.webapplication.WebApp) webApp, JSF_SERVLET_CLASS);
-    }
-
-    /**
-     * Creates servlet reference in WebApp if not present or updates servlet
-     * name if found using the passed configuration.
-     * 
-     * @param webApp
-     * @param config
-     * @param servlet
-     * @return Servlet servlet - if passed servlet was null, will return created
-     *         servlet
-     */
-    protected Object createOrUpdateServletRef(final Object webApp,
-            final IDataModel config, Object servlet)
-    {
-        String displayName = getDisplayName(config);
-        String className = getServletClassname(config);
-    	if(isJavaEE(webApp)) {
-    		return JEEUtils.createOrUpdateServletRef((org.eclipse.jst.javaee.web.WebApp) webApp, displayName, className, (org.eclipse.jst.javaee.web.Servlet) servlet);
-    	}
-   		return J2EEUtils.createOrUpdateServletRef((org.eclipse.jst.j2ee.webapplication.WebApp) webApp, displayName, className, (org.eclipse.jst.j2ee.webapplication.Servlet) servlet);
-    }
-
-    /**
-     * Creates servlet-mappings for the servlet for 2.5 WebModules or greated
-     * 
-     * @param webApp
-     * @param urlMappingList
-     *            - list of string values to be used in url-pattern for
-     *            servlet-mapping
-     * @param servlet
-     */
-    protected void setUpURLMappings(final Object webApp,
-            final List<String> urlMappingList, final Object servlet)
-    {
-    	if(isJavaEE(webApp)) {
-    		JEEUtils.setUpURLMappings((org.eclipse.jst.javaee.web.WebApp) webApp, urlMappingList, (org.eclipse.jst.javaee.web.Servlet) servlet);
-    	}
-    	else {
-    		J2EEUtils.setUpURLMappings((org.eclipse.jst.j2ee.webapplication.WebApp) webApp, urlMappingList, (org.eclipse.jst.j2ee.webapplication.Servlet) servlet);
-    	}
-    }
-
-	/**
-	 * Removes servlet-mappings for servlet using servlet-name for >= 2.5 WebModules.
-	 * @param webApp
-	 * @param servlet
-	 */
-	protected void removeURLMappings(final Object webApp, final Object servlet) {
-    	if(isJavaEE(webApp)) {
-    		JEEUtils.removeURLMappings((org.eclipse.jst.javaee.web.WebApp) webApp, (org.eclipse.jst.javaee.web.Servlet) servlet);
-    	}
-    	else {
-    		J2EEUtils.removeURLMappings((org.eclipse.jst.j2ee.webapplication.WebApp) webApp, (org.eclipse.jst.j2ee.webapplication.Servlet) servlet);
-    	}
-	}
-	
-	/**
-	 * Removes servlet definition
-	 * @param webApp
-	 * @param servlet
-	 */
-	protected void removeJSFServlet(final Object webApp, final Object servlet) {
-    	if(isJavaEE(webApp)) {
-    		JEEUtils.removeServlet((org.eclipse.jst.javaee.web.WebApp) webApp, (org.eclipse.jst.javaee.web.Servlet) servlet);
-    	}
-    	else {
-    		J2EEUtils.removeServlet((org.eclipse.jst.j2ee.webapplication.WebApp) webApp, (org.eclipse.jst.j2ee.webapplication.Servlet) servlet);
-    	}
-	}
-	
-    /**
-     * Removes context-param
-     * @param webApp
-     */
-    protected void removeJSFContextParams(final Object webApp) {
-    	if(isJavaEE(webApp)) {
-    		JEEUtils.removeContextParam((org.eclipse.jst.javaee.web.WebApp) webApp, JSF_CONFIG_CONTEXT_PARAM);
-    	}
-    	else {
-    		J2EEUtils.removeContextParam((org.eclipse.jst.j2ee.webapplication.WebApp) webApp, JSF_CONFIG_CONTEXT_PARAM);
-    	}
-    }
-    
-	/**
-	 * Creates or updates context-params
-	 * @param webApp
-	 * @param config
-	 */
-	protected void setupContextParams(final Object webApp, final IDataModel config) {
-        final String paramValue = config.getStringProperty(IJSFFacetInstallDataModelProperties.CONFIG_PATH);
-        if (paramValue != null && !paramValue.equals(JSF_DEFAULT_CONFIG_PATH)) {
-        	if(isJavaEE(webApp)) {
-        		JEEUtils.setupContextParam((org.eclipse.jst.javaee.web.WebApp) webApp, JSF_CONFIG_CONTEXT_PARAM, paramValue);
-        	}
-        	else {
-        		J2EEUtils.setupContextParam((org.eclipse.jst.j2ee.webapplication.WebApp) webApp, JSF_CONFIG_CONTEXT_PARAM, paramValue);
-        	}
-        }
-
-	}
-	
-    /**
-     * @param map
-     * @param webApp
-     * @return extension from map. Will return null if file extension not found
-     *         in url patterns.
-     */
-    protected String getFileExtensionFromMap(final Object webApp, final Object map) {
-    	if(isJavaEE(webApp)) {
-    		return JEEUtils.getFileExtensionFromMap((org.eclipse.jst.javaee.web.ServletMapping) map);
-    	}
-   		return J2EEUtils.getFileExtensionFromMap((org.eclipse.jst.j2ee.webapplication.ServletMapping) map);
-    }
-
-    /**
-     * @param webApp 
-     * @param map
-     * @return prefix mapping. may return null.
-     */
-    protected String getPrefixMapping(final Object webApp, final Object map) {
-    	if(isJavaEE(webApp)) {
-    		return JEEUtils.getPrefixMapping((org.eclipse.jst.javaee.web.ServletMapping) map);
-    	}
-   		return J2EEUtils.getPrefixMapping((org.eclipse.jst.j2ee.webapplication.ServletMapping) map);
-    }
-    
-    /**
-     * @param webAppObj
-     * @param resource
-     * @param existingURL
-     * @return the modified url path for the (possibly) jsf resource.
-     */
-    public IPath getFileUrlPath(Object webAppObj, IResource resource,
-            IPath existingURL) {
-        // if not a JSF page, do nothing
-        if (!isJSFPage(resource))
-        {
-            return null;
-        }
-
-        Object servlet = findJSFServlet(webAppObj);
-        if (servlet == null)
-        {// if no faces servlet, do nothing
-            return null;
-        }
-
-        String defaultSuffix = getDefaultSuffix(webAppObj);
-        // is the resource using default_suffix
-        String fileExtension = resource.getFileExtension();
-        boolean canUseExtensionMapping = fileExtension != null && fileExtension.equalsIgnoreCase(defaultSuffix);
-        // if not using default extension and is not a known file extension,
-        // then we will abort
-        if (!canUseExtensionMapping
-                && !isValidKnownExtension(resource.getFileExtension()))
-            return null;
-
-    	if(isJavaEE(webAppObj)) {
-    		org.eclipse.jst.javaee.web.WebApp webApp =  (org.eclipse.jst.javaee.web.WebApp) webAppObj;
-
-            final String servletName = ((org.eclipse.jst.javaee.web.Servlet) servlet).getServletName();
-
-            String foundFileExtension = null;
-            for (final org.eclipse.jst.javaee.web.ServletMapping map : webApp.getServletMappings())
-            {
-                if (map != null &&
-                        map.getServletName() != null &&
-                        map.getServletName().trim().equals(servletName.trim()))
-                {
-                    foundFileExtension = getFileExtensionFromMap(webAppObj, map);
-                    if (foundFileExtension != null && canUseExtensionMapping)
-                    {
-                        return existingURL.removeFileExtension()
-                                .addFileExtension(foundFileExtension);
-                    }
-
-                    String foundPrefixMapping = getPrefixMapping(webAppObj, map);
-                    if (foundPrefixMapping != null)
-                    {
-                        return new Path(foundPrefixMapping).append(existingURL);
-                    }
-                }
-            }
-
-            if (!canUseExtensionMapping && foundFileExtension != null)
-            {
-                // we could prompt user that this may not work...
-                // for now we will return the extension mapping
-                return existingURL.removeFileExtension().addFileExtension(
-                        foundFileExtension);
-            }
-
-            // we could, at this point, add a url mapping to the faces servlet,
-            // or prompt user that it may be a good idea to add one... 
-
-    	}
-    	else {
-            Iterator mappings = ((org.eclipse.jst.j2ee.webapplication.Servlet)servlet).getMappings().iterator();
-            org.eclipse.jst.j2ee.webapplication.ServletMapping map = null;
-            String foundFileExtension = null;
-            String foundPrefixMapping = null;
-            while (mappings.hasNext())
-            {
-                map = (org.eclipse.jst.j2ee.webapplication.ServletMapping)mappings.next();
-
-                foundFileExtension = getFileExtensionFromMap(webAppObj, map);
-                if (foundFileExtension != null && canUseExtensionMapping) 
-                {
-                    return existingURL.removeFileExtension().addFileExtension(foundFileExtension);
-                }
-                
-                if (foundPrefixMapping == null)
-                {
-                    foundPrefixMapping = getPrefixMapping(webAppObj, map);
-                }
-            }
-            if (foundPrefixMapping != null)
-            {
-                return new Path(foundPrefixMapping).append(existingURL); 
-            }
-            if (! canUseExtensionMapping && foundFileExtension != null){
-                //we could prompt user that this may not work...
-                //for now we will return the extension mapping
-                return existingURL.removeFileExtension().addFileExtension(foundFileExtension);
-            }
-            
-            // we could, at this point, add a url mapping to the faces servlet, 
-            // or prompt user that it may be a good idea to add one...
-
-    	}
-    	return null;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFUtils11.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFUtils11.java
deleted file mode 100644
index 020d4fe..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFUtils11.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler - initial API and implementation
- *******************************************************************************/ 
-
-package org.eclipse.jst.jsf.core.internal.project.facet;
-
-import java.io.PrintWriter;
-import java.util.List;
-
-import org.eclipse.jst.j2ee.model.IModelProvider;
-import org.eclipse.jst.jsf.core.JSFVersion;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
-
-/**
- * Utility file for JSF model v1.1
- * 
- * @author Gerry Kessler - Oracle
- */
-/*package use JSFUtilFactory*/ class JSFUtils11 extends JSFUtils {	
-	
-	/**
-	 * @param modelProvider 
-	 */
-	protected JSFUtils11(final IModelProvider modelProvider)
-    {
-        super(JSFVersion.V1_1, modelProvider);
-    }
-
-
-    /**
-     * Creates a stubbed JSF configuration file for specified JSF version and
-     * path
-     */
-    @Override
-    public void doVersionSpecificConfigFile(final PrintWriter pw)
-    {
-        final String QUOTE = new String(new char[]
-        { '"' });
-        pw.write("<?xml version=" + QUOTE + "1.0" + QUOTE + " encoding=" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-                + QUOTE + "UTF-8" + QUOTE + "?>\n\n"); //$NON-NLS-1$ //$NON-NLS-2$
-
-        pw.write("<!DOCTYPE faces-config PUBLIC\n"); //$NON-NLS-1$
-        pw.write("    " //$NON-NLS-1$
-                + QUOTE
-                + "-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.1//EN" //$NON-NLS-1$
-                + QUOTE + "\n"); //$NON-NLS-1$
-        pw.write("    " + QUOTE //$NON-NLS-1$
-                + "http://java.sun.com/dtd/web-facesconfig_1_1.dtd" //$NON-NLS-1$
-                + QUOTE + ">\n\n"); //$NON-NLS-1$
-
-        pw.write("<faces-config>\n\n"); //$NON-NLS-1$
-        pw.write("</faces-config>\n"); //$NON-NLS-1$
-    }
-
-    @Override
-    public void updateWebApp(Object webApp, IDataModel config)
-    {
-        // create or update servlet ref
-        Object servlet = findJSFServlet(webApp);// check to see
-                                                            // if already
-                                                            // present
-        
-        
-        servlet = createOrUpdateServletRef(webApp, config, servlet);
-
-        // init mappings
-        final List listOfMappings = getServletMappings(config);
-        setUpURLMappings(webApp, listOfMappings, servlet);
-
-        // setup context params
-        setupContextParams(webApp, config);
-    }
-
-    @Override
-    public void rollbackWebApp(Object webApp)
-    {
-        Object servlet = findJSFServlet(webApp);
-        if (servlet == null)
-        {
-            return;
-        }
-        // remove faces url mappings
-        removeURLMappings(webApp, servlet);
-        // remove context params
-        removeJSFContextParams(webApp);
-        // remove servlet
-        removeJSFServlet(webApp, servlet);
-    }
-
- 
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFUtils12.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFUtils12.java
deleted file mode 100644
index bb3bd96..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFUtils12.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler - initial API and implementation
- *******************************************************************************/ 
-
-package org.eclipse.jst.jsf.core.internal.project.facet;
-
-import java.io.PrintWriter;
-import java.util.List;
-
-import org.eclipse.jst.j2ee.model.IModelProvider;
-import org.eclipse.jst.jsf.core.JSFVersion;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
-
-/**
- * Utility file for JSF v1.2 model
- * 
- * @author Gerry Kessler - Oracle
- */
-/*package: use JSFUtilFactory*/ class JSFUtils12 extends JSFUtils {
-
-	/**
-	 * @param modelProvider 
-	 * 
-	 */
-	protected JSFUtils12(final IModelProvider modelProvider)
-    {
-        this(JSFVersion.V1_2, modelProvider);
-    }
-
-    /**
-     * @param jsfVersion
-     * @param modelProvider 
-     */
-    protected JSFUtils12(final JSFVersion jsfVersion, final IModelProvider modelProvider)
-    {
-        super(jsfVersion, modelProvider);
-        if (jsfVersion.compareTo(JSFVersion.V1_2) < 0)
-        {
-            throw new IllegalArgumentException(
-                    "JsfVersion must be at least 1.2"); //$NON-NLS-1$
-        }
-    }
-
-    @Override
-    public void doVersionSpecificConfigFile(PrintWriter pw)
-    {
-        final String QUOTE = new String(new char[]
-        { '"' });
-        final String schemaVersionString = getVersion().toString().replaceAll("\\.", "_");  //$NON-NLS-1$//$NON-NLS-2$
-        pw.write("<?xml version=" + QUOTE + "1.0" + QUOTE + " encoding=" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-                + QUOTE + "UTF-8" + QUOTE + "?>\n\n"); //$NON-NLS-1$ //$NON-NLS-2$
-        pw.write("<faces-config\n"); //$NON-NLS-1$
-        pw.write("    " + "xmlns=" + QUOTE //$NON-NLS-1$ //$NON-NLS-2$
-                + "http://java.sun.com/xml/ns/javaee" + QUOTE + "\n"); //$NON-NLS-1$ //$NON-NLS-2$
-        pw.write("    " + "xmlns:xsi=" + QUOTE //$NON-NLS-1$ //$NON-NLS-2$
-                + "http://www.w3.org/2001/XMLSchema-instance" + QUOTE //$NON-NLS-1$
-                + "\n"); //$NON-NLS-1$
-        pw.write("    " //$NON-NLS-1$
-                + "xsi:schemaLocation=" //$NON-NLS-1$
-                + QUOTE
-                + String.format("http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_%s.xsd", schemaVersionString) //$NON-NLS-1$
-                + QUOTE + "\n"); //$NON-NLS-1$
-        pw.write("    " + "version=" + QUOTE + getVersion().toString() + QUOTE + ">\n\n"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-        pw.write("</faces-config>\n"); //$NON-NLS-1$
-    }
-	
-    @Override
-    public void updateWebApp(Object webApp, IDataModel config)
-    {
-        // create or update servlet ref
-        Object servlet = findJSFServlet(webApp);// check to see
-                                                            // if already
-        
-        servlet = createOrUpdateServletRef(webApp, config, servlet);
-
-        // init mappings
-        final List listOfMappings = getServletMappings(config);
-        setUpURLMappings(webApp, listOfMappings, servlet);
-
-        // setup context params
-        setupContextParams(webApp, config);
-    }
-
-    
-    @Override
-    public void rollbackWebApp(Object webApp)
-    {
-        Object servlet = findJSFServlet(webApp);
-        if (servlet == null)
-        {
-            return;
-        }
-        // remove faces url mappings
-        removeURLMappings(webApp, servlet);
-        // remove context params
-        removeJSFContextParams(webApp);
-        // remove servlet
-        removeJSFServlet(webApp, servlet);
-    }
-    
-    
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFUtils20.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFUtils20.java
deleted file mode 100644
index 28583ae..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFUtils20.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package org.eclipse.jst.jsf.core.internal.project.facet;
-
-import org.eclipse.jst.j2ee.model.IModelProvider;
-import org.eclipse.jst.jsf.core.JSFVersion;
-
-/**
- * JSF Utils instance for JSF 2.0.
- * 
- * @author cbateman
- * 
- */
-/* package: use JSFUtilFactory */class JSFUtils20 extends JSFUtils12
-{
-    private static final String DEFAULT_DEFAULT_MAPPING_SUFFIX = "xhtml"; //$NON-NLS-1$
-
-    /**
-     * @param modelProvider
-     */
-    protected JSFUtils20(final IModelProvider modelProvider)
-    {
-        super(JSFVersion.V2_0, modelProvider);
-    }
-
-    @Override
-    protected String getDefaultDefaultSuffix()
-    {
-        return DEFAULT_DEFAULT_MAPPING_SUFFIX;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JsfFacetConfigurationUtil.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JsfFacetConfigurationUtil.java
deleted file mode 100644
index 21f725f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JsfFacetConfigurationUtil.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Debajit Adhikary - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.internal.project.facet;
-
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtension;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-
-
-/**
- * Utility class to provide an easy way to read the jsfFacetConfiguration 
- * extension-point (org.eclipse.jst.jsf.core.jsfFacetConfiguration).
-
- * @author Debajit Adhikary (Oracle)
- *
- */
-public class JsfFacetConfigurationUtil
-{
-    private static final String JSF_FACES_CONFIG_EXTENSION_ID = "jsfFacetConfiguration"; //$NON-NLS-1$
-    private static final String DISABLED_ATTR_NAME = "disabled"; //$NON-NLS-1$
-    private static final String TRUE_STRING = "true"; //$NON-NLS-1$
-
-
-    /**
-     * @return True if the disabled attribute is not set to "true".
-     */
-    public static boolean isJsfFacetConfigurationEnabled ()
-    {
-        return !isJsfFacetConfigurationDisabled();
-    }
-
-    
-    /**
-     * @return True if disabled="true" is set in the extension point.
-     */
-    public static boolean isJsfFacetConfigurationDisabled ()
-    {
-        IExtensionPoint jsfFacetConfigExtensionPoint = JSFCorePlugin.getDefault().getExtension(JSF_FACES_CONFIG_EXTENSION_ID);
-        for (final IExtension extension : jsfFacetConfigExtensionPoint.getExtensions())
-        {
-            for (final IConfigurationElement configElement : extension.getConfigurationElements())
-            {
-                if (configElement != null && configElement.getName().equals(JSF_FACES_CONFIG_EXTENSION_ID))
-                {
-                    final String attrValue = configElement.getAttribute(DISABLED_ATTR_NAME);
-                    if(attrValue != null)
-                    {
-                        return attrValue.equalsIgnoreCase(TRUE_STRING);
-                    }
-                }
-            }
-        }
-
-        return false;
-    }
-
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/LegacyJSFLibraryProviderDetector.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/LegacyJSFLibraryProviderDetector.java
deleted file mode 100644
index 653d5c1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/LegacyJSFLibraryProviderDetector.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/******************************************************************************
- * Copyright (c) 2008 Oracle
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Konstantin Komissarchik - initial implementation and ongoing maintenance
- ******************************************************************************/
-
-package org.eclipse.jst.jsf.core.internal.project.facet;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.jdt.core.IClasspathEntry;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jst.common.project.facet.core.libprov.ILibraryProvider;
-import org.eclipse.jst.common.project.facet.core.libprov.LegacyLibraryProviderDetector;
-import org.eclipse.jst.common.project.facet.core.libprov.LibraryProviderFramework;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.core.internal.jsflibraryconfig.JSFLibraryRegistryUtil;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary;
-import org.eclipse.jst.jsf.core.jsflibraryconfiguration.JSFLibraryConfigurationHelper;
-import org.eclipse.wst.common.project.facet.core.IProjectFacet;
-
-/**
- * @author <a href="mailto:konstantin.komissarchik@oracle.com">Konstantin Komissarchik</a>
- */
-@SuppressWarnings("deprecation")
-public final class LegacyJSFLibraryProviderDetector
-
-    extends LegacyLibraryProviderDetector
-    
-{
-    private static final String LEGACY_JSF_LIBRARY_PROVIDER_ID 
-        = "legacy-jsf-library-provider"; //$NON-NLS-1$
-
-    @Override
-    public ILibraryProvider detect( final IProject project,
-                                    final IProjectFacet facet )
-    {
-        try
-        {
-            final IJavaProject jproj = JavaCore.create( project );
-            
-            for( IClasspathEntry cpe : jproj.getRawClasspath() )
-            {
-                if( detect( cpe ) )
-                {
-                    return LibraryProviderFramework.getProvider( LEGACY_JSF_LIBRARY_PROVIDER_ID );
-                }
-            }
-        }
-        catch( Exception e )
-        {
-            JSFCorePlugin.log( e, e.getMessage() );
-        }
-
-        return null;
-    }
-    
-    /**
-     * @param cpe
-     * @return true if the classpath entry is detected
-     */
-    public static boolean detect( final IClasspathEntry cpe )
-    {
-        if( cpe.getEntryKind() == IClasspathEntry.CPE_CONTAINER )
-        {
-            final IPath path = cpe.getPath();
-            
-            if( isJSFLibraryContainer( path ) ) 
-            {
-                String libId = path.lastSegment();
-                JSFLibrary ref = JSFLibraryRegistryUtil.getInstance().getJSFLibraryRegistry().getJSFLibraryByID(libId);
-                
-                if( ref != null && ref.isImplementation() )
-                {
-                    return true;
-                }
-            }
-        }
-        
-        return false;
-    }
-    
-    private static boolean isJSFLibraryContainer(IPath path) {
-        return path != null && path.segmentCount() == 2 && JSFLibraryConfigurationHelper.JSF_LIBRARY_CP_CONTAINER_ID.equals(path.segment(0));
-    }
-    
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/LegacyJSFLibraryProviderUninstallOperation.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/LegacyJSFLibraryProviderUninstallOperation.java
deleted file mode 100644
index daf009a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/LegacyJSFLibraryProviderUninstallOperation.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/******************************************************************************
- * Copyright (c) 2008 Oracle
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Konstantin Komissarchik - initial implementation and ongoing maintenance
- ******************************************************************************/
-
-package org.eclipse.jst.jsf.core.internal.project.facet;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.jdt.core.IClasspathEntry;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jst.common.project.facet.core.libprov.LibraryProviderOperation;
-import org.eclipse.jst.common.project.facet.core.libprov.LibraryProviderOperationConfig;
-
-/**
- * @author <a href="mailto:konstantin.komissarchik@oracle.com">Konstantin Komissarchik</a>
- */
-
-public final class LegacyJSFLibraryProviderUninstallOperation
-
-    extends LibraryProviderOperation
-    
-{
-    public void execute( final LibraryProviderOperationConfig config,
-                         final IProgressMonitor monitor )
-    
-        throws CoreException
-        
-    {
-        monitor.beginTask( "", 1 ); //$NON-NLS-1$
-        
-        try
-        {
-            final IProject project = config.getFacetedProject().getProject();
-            final IJavaProject jproj = JavaCore.create( project );
-            final List<IClasspathEntry> newcp = new ArrayList<IClasspathEntry>();
-            
-            for( IClasspathEntry cpe : jproj.getRawClasspath() )
-            {
-                if( ! LegacyJSFLibraryProviderDetector.detect( cpe ) )
-                {
-                    newcp.add( cpe );
-                }
-            }
-            
-            final IClasspathEntry[] array = newcp.toArray( new IClasspathEntry[ newcp.size() ] );
-            jproj.setRawClasspath( array, null );
-            
-            monitor.worked( 1 );
-        }
-        finally
-        {
-            monitor.done();
-        }
-    }
-    
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/region/Region2AttrAdapter.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/region/Region2AttrAdapter.java
deleted file mode 100644
index 6ac56a3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/region/Region2AttrAdapter.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-/**
- * 
- */
-package org.eclipse.jst.jsf.core.internal.region;
-
-import org.eclipse.jst.jsf.common.dom.AttrDOMAdapter;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContextFactory;
-import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMAttr;
-import org.w3c.dom.Node;
-
-/**
- * A AttrDOMAdapter that adapts from a ITextRegions. Instances of class can only
- * be obtained from and are always relative to, an owning Region2ElementAdapter
- * 
- * @author cbateman
- * 
- */
-public class Region2AttrAdapter extends AttrDOMAdapter
-{
-    private final Node _attr;
-
-    /**
-     * @param owner
-     * @param attr
-     */
-    Region2AttrAdapter(final Region2ElementAdapter owner, final Node attr)
-    {
-        super(owner);
-        _attr = attr;
-    }
-
-    @Override
-    public Region2ElementAdapter getOwningElement()
-    {
-        return (Region2ElementAdapter) super.getOwningElement();
-    }
-
-    @Override
-    public String getLocalName()
-    {
-        return _attr.getLocalName();
-    }
-
-    @Override
-    public String getNodeName()
-    {
-        return _attr.getNodeName();
-    }
-
-    @Override
-    public String getPrefix()
-    {
-        return _attr.getPrefix();
-    }
-
-    @Override
-    public String getValue()
-    {
-        return _attr.getNodeValue();
-    }
-
-    /**
-     * @return the structured document context
-     */
-    public IStructuredDocumentContext getDocumentContext()
-    {
-        return IStructuredDocumentContextFactory.INSTANCE.getContext
-            (getOwningElement().getDocumentContext().getStructuredDocument(),
-                getStartOffset());
-    }
-    
-    /**
-     * @return the absolute document offset where the attribute starts.
-     */
-    public int getStartOffset()
-    {
-        return getOwningElement().getTextRegion().getStartOffset()+getAttributeNameRegion().getStart();
-    }
-
-    /**
-     * Offsets in the region will be relative to the parent element, not the
-     * document
-     * 
-     * @return the ITextRegion for the attribute name of the attribute adapted
-     *         by attrAdapter
-     * @throws IllegalArgumentException
-     *             if attrAdapter.getOwningElement != this
-     */
-    // see https://bugs.eclipse.org/bugs/show_bug.cgi?id=217523 for deprecation
-    @SuppressWarnings("deprecation")
-    public ITextRegion getAttributeNameRegion()
-    {
-
-        return getDOMAttr(_attr).getNameRegion();
-    }
-
-    /**
-     * Offsets in the region will be relative to the parent element, not the
-     * document
-     * 
-     * @return the ITextRegion for the attribute value of the attribute adapted
-     *         by attrAdapter
-     * @throws IllegalArgumentException
-     *             if attrAdapter.getOwningElement != this
-     */
-    @SuppressWarnings("deprecation")
-    // see https://bugs.eclipse.org/bugs/show_bug.cgi?id=217523 for deprecation
-    public ITextRegion getAttributeValueRegion()
-    {
-        return getDOMAttr(_attr).getValueRegion();
-    }
-
-    private IDOMAttr getDOMAttr(final Node attrAsNode)
-    {
-        assert attrAsNode instanceof IDOMAttr;
-
-        return ((IDOMAttr) attrAsNode);
-    }
-
-    @Override
-    public String toString()
-    {
-        return String.format("Region2AttrAdapter: attr=%s, owningElement=%s" //$NON-NLS-1$
-                , _attr.getNodeName(), getOwningElement().getNodeName());
-        
-    }
-    
-    
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/region/Region2ElementAdapter.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/region/Region2ElementAdapter.java
deleted file mode 100644
index 2ed6410..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/region/Region2ElementAdapter.java
+++ /dev/null
@@ -1,242 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.core.internal.region;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.jst.jsf.common.dom.ElementDOMAdapter;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IDOMContextResolver;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IStructuredDocumentContextResolverFactory;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.ITaglibContextResolver;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.internal.IStructuredDocumentContextResolverFactory2;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContextFactory;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
-import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;
-import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionCollection;
-import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext;
-import org.w3c.dom.Element;
-import org.w3c.dom.NamedNodeMap;
-import org.w3c.dom.Node;
-
-/**
- * Adapt a region object for DOM element information. Does not implement entire
- * DOM interface. Object is lazily initialized and not thread-safe.
- * 
- * @author cbateman
- * 
- */
-public class Region2ElementAdapter extends ElementDOMAdapter
-{
-    private final RegionProcessorStrategy _regionParser;
-
-    /**
-     * Create a new adapter for this region. If the region does not contain
-     * enough information to construct a meaningful adapter, it will throw
-     * NoElementException. The adapter is lazily initialized and won't process
-     * the region until the first call to a get method is made.
-     * 
-     * @param region
-     * @throws NoElementException
-     */
-    public Region2ElementAdapter(final ITextRegion region)
-            throws NoElementException
-    {
-        _regionParser = new RegionProcessorStrategy(region);
-    }
-
-    @Override
-    public Map<String, Region2AttrAdapter> getAttributes()
-    {
-        return _regionParser.getAttributes();
-    }
-
-    @Override
-    public String getNamespace()
-    {
-        return _regionParser.getNamespace();
-    }
-
-    @Override
-    public String getLocalName()
-    {
-        return _regionParser.getLocalName();
-    }
-
-    @Override
-    public String getNodeName()
-    {
-        return _regionParser.getNodeName();
-    }
-
-    @Override
-    public String getPrefix()
-    {
-        return _regionParser.getPrefix();
-    }
-
-    /**
-     * @return the structured document context
-     */
-    public IStructuredDocumentContext getDocumentContext()
-    {
-        return _regionParser._context;
-    }
-
-    /**
-     * @return an ITextRegion containing absolute offset information for this element
-     */
-    public ITextRegionCollection getTextRegion()
-    {
-        return _regionParser._region;
-    }
-
-    /**
-     * @return the element
-     */
-    public Element getElement()
-    {
-        return (Element) _regionParser._node;
-    }
-
-    private class RegionProcessorStrategy
-    {
-        private final ITextRegionCollection _region;
-
-        private Map<String, Region2AttrAdapter> _attributes;
-        private Node                        _node;
-        private IStructuredDocumentContext  _context;
-
-        RegionProcessorStrategy(final ITextRegion region) throws NoElementException
-        {
-            if (!(region instanceof ITextRegionCollection)
-                    || ((ITextRegionCollection) region).getFirstRegion()
-                            .getType() != DOMRegionContext.XML_TAG_OPEN)
-            {
-                throw new NoElementException(
-                        "Region is not a collection with an open tag"); //$NON-NLS-1$
-            }
-
-            _region = (ITextRegionCollection) region;
-
-            _context =
-                       IStructuredDocumentContextFactory.INSTANCE.getContext(
-                               ((IStructuredDocumentRegion) _region)
-                                       .getParentDocument(), _region
-                                       .getStartOffset());
-
-            if (_context == null)
-            {
-                throw new NoElementException(
-                        "Couldn't acquire structured document context"); //$NON-NLS-1$
-            }
-
-            final IDOMContextResolver resolver =
-                                                 IStructuredDocumentContextResolverFactory.INSTANCE
-                                                         .getDOMContextResolver(_context);
-
-            if (resolver == null)
-            {
-                throw new NoElementException("Couldn't acquire dom resolver"); //$NON-NLS-1$
-            }
-
-            _node = resolver.getNode();
-
-            if (_node == null)
-            {
-                throw new NoElementException("Couldn't get Node from region"); //$NON-NLS-1$
-            }
-        }
-
-        public String getLocalName()
-        {
-            return _node.getLocalName();
-        }
-
-        public String getNodeName()
-        {
-            return _node.getNodeName();
-        }
-
-        public String getPrefix()
-        {
-            return _node.getPrefix();
-        }
-
-        public String getNamespace()
-        {
-            final ITaglibContextResolver tagLibResolver =
-                              IStructuredDocumentContextResolverFactory2.INSTANCE
-                                      .getTaglibContextResolverFromDelegates(_context);
-
-            if (tagLibResolver != null)
-            {
-                return tagLibResolver.getTagURIForNodeName(_node);
-            }
-
-            return null;
-        }
-
-        public Map<String, Region2AttrAdapter>  getAttributes()
-        {
-            mapAttributesOnlyOnce();
-            return Collections.unmodifiableMap(_attributes);
-        }
-
-        private void mapAttributesOnlyOnce()
-        {
-            // only once
-            if (_attributes != null)
-                return;
-
-            _attributes = Collections.EMPTY_MAP;
-
-            final NamedNodeMap attributes = _node.getAttributes();
-
-            if (attributes != null)
-            {
-                final int numAttrs = attributes.getLength();
-                _attributes = new HashMap<String, Region2AttrAdapter>(
-                        (int) (numAttrs / 0.75f) + 1, 0.75f);
-                for (int i = 0; i < numAttrs; i++)
-                {
-                    final Node nodeAttr = attributes.item(i);
-                    Region2AttrAdapter attr = new Region2AttrAdapter(
-                            Region2ElementAdapter.this, nodeAttr);
-                    _attributes.put(attr.getLocalName(), attr);
-                }
-            }
-        }
-    }
-    
-    /**
-     * Indicates that construction of this adapter failed because an IRegion
-     * didn't have sufficient information (or didn't represent an element at
-     * all)
-     * 
-     * @author cbateman
-     * 
-     */
-    public static class NoElementException extends Exception
-    {
-        /**
-         * serializable id
-         */
-        private static final long serialVersionUID = -4479154049727036580L;
-
-        private NoElementException(final String reason)
-        {
-            super(reason);
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/tld/AttributeIdentifierFactory.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/tld/AttributeIdentifierFactory.java
deleted file mode 100644
index 2d675ce..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/tld/AttributeIdentifierFactory.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.core.internal.tld;
-
-import org.eclipse.jst.jsf.common.dom.AttributeIdentifier;
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-
-/**
- * A factory for creating instances of AttributeIdentifier. Some results may be
- * cached or otherwise based on shared instances.
- * 
- * @author cbateman
- * 
- */
-public final class AttributeIdentifierFactory
-{
-    /**
-     * @param tagId
-     * @param attributeName
-     * @return an attribute id based on the tagid and attribute name provided.
-     */
-    public static AttributeIdentifier createAttributeIdentifier(
-            final TagIdentifier tagId, final String attributeName)
-    {
-        return new SimpleAttributeIdentifier(tagId, attributeName);
-    }
-
-    private final static class SimpleAttributeIdentifier extends
-            AttributeIdentifier
-    {
-        private final TagIdentifier _tagId;
-        private final String        _attributeName;
-
-        public SimpleAttributeIdentifier(final TagIdentifier tagId,
-                String attributeName)
-        {
-            _tagId = tagId;
-            _attributeName = attributeName;
-        }
-
-        @Override
-        public String getName()
-        {
-            return _attributeName;
-        }
-
-        @Override
-        public TagIdentifier getTagIdentifier()
-        {
-            return _tagId;
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/tld/CMUtil.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/tld/CMUtil.java
deleted file mode 100644
index 47e2064..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/tld/CMUtil.java
+++ /dev/null
@@ -1,374 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.core.internal.tld;
-
-import java.util.Iterator;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsp.core.internal.contentmodel.TaglibController;
-import org.eclipse.jst.jsp.core.internal.contentmodel.tld.CMDocumentFactoryTLD;
-import org.eclipse.jst.jsp.core.internal.contentmodel.tld.TLDCMDocumentManager;
-import org.eclipse.jst.jsp.core.internal.contentmodel.tld.TaglibTracker;
-import org.eclipse.jst.jsp.core.internal.contentmodel.tld.provisional.TLDDocument;
-import org.eclipse.jst.jsp.core.internal.contentmodel.tld.provisional.TLDElementDeclaration;
-import org.eclipse.jst.jsp.core.taglib.ITaglibRecord;
-import org.eclipse.wst.common.componentcore.ComponentCore;
-import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
-import org.eclipse.wst.common.componentcore.resources.IVirtualFolder;
-import org.eclipse.wst.html.core.internal.contentmodel.HTMLElementDeclaration;
-import org.eclipse.wst.html.core.internal.provisional.HTMLCMProperties;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMDocument;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
-import org.eclipse.wst.xml.core.internal.provisional.contentmodel.CMNodeWrapper;
-import org.eclipse.wst.xml.core.internal.ssemodelquery.ModelQueryAdapter;
-import org.w3c.dom.Element;
-
-/**
- * Utility class to content model related information.
- * 
- * @author mengbo
- */
-public final class CMUtil {
-	/**
-	 * If the element is a custom tag, get the URI of it. If the element is a
-	 * standard JSP tag, return null. If is not jsp tag, then return null
-	 * @param decl
-     *  
-	 * @return the tag uri as a string
-	 */
-	public static String getTagURI(CMElementDeclaration decl) {
-		if (decl instanceof CMNodeWrapper) {
-			decl = (CMElementDeclaration) ((CMNodeWrapper) decl)
-					.getOriginNode();
-		}
-		if (decl instanceof TLDElementDeclaration) {
-			CMDocument doc = ((TLDElementDeclaration) decl).getOwnerDocument();
-			if (doc instanceof TLDDocument) {
-				TLDDocument tldDoc = (TLDDocument)doc;
-				return getURIFromDoc(tldDoc , null);
-			}
-		}
-		return null;
-	}
- 
-	/**
-	 * @param doc
-	 * @param project - may be null in which case it is calculated as necessary from the doc baseLocation
-	 * @return valid string to use for the uri when given a TLD doc
-	 * 			Must <ul>not</ul> be called with HTML or JSP documents.
-	 * 			As there is no API on the doc for standalone or tagDir doc, it is possible that this could return an invalid string.  
-	 * 				However, if the code is consistent in it's usage, all should be well.
-	 *         or null if not found.
-	 */
-	public static String  getURIFromDoc(final TLDDocument doc, final IProject project) {
-		String uri = doc.getUri();
-		IProject proj = project;
-		if (uri == null) {//
-			Path baseLoc = new Path(doc.getBaseLocation());
-			if (proj == null) {
-				proj = getProjectFor(baseLoc);
-				if (proj == null) {//log error
-					return null;
-				}
-			}
-			
-			if (isTagDirDocument(doc, proj)) {
-				uri = getTagDirURI(doc, proj);
-			} else {
-				uri = getStandaloneTLDURI(doc, proj);
-			}
-		}
-		return uri;
-	}
-
-	/**
-	 * @param tldRec
-	 * @param project
-	 * @return valid string to use for the uri when given a ITaglibRecord
-	 * or null.
-	 */
-	public static String getURIFromTaglibRecord(ITaglibRecord tldRec, IProject project) {		
-		//similar code in PaletteHelper and above		
-		String uri = tldRec.getDescriptor().getURI();
-		if (uri == null || uri.trim().equals("")) {		 //$NON-NLS-1$
-			//need to construct valid string representing taglib identifier
-			CMDocumentFactoryTLD factory = new CMDocumentFactoryTLD();
-			TLDDocument doc = (TLDDocument)factory.createCMDocument(tldRec);
-			if (tldRec.getRecordType() == ITaglibRecord.TLD) {		
-				uri = getStandaloneTLDURI(doc, project);			
-			}
-			else if (tldRec.getRecordType() == ITaglibRecord.TAGDIR) {	
-				uri =  getTagDirURI(doc, project);				
-			}
-			
-		}
-		return uri;
-	}
-	
-	private static String getStandaloneTLDURI(TLDDocument doc, IProject project) {
-		Path p = new Path(doc.getBaseLocation());
-		IPath webContentPath = ComponentCore.createComponent(project).getRootFolder().getUnderlyingFolder().getLocation();
-		return getURIFromPath(p.makeAbsolute().makeRelativeTo(webContentPath.makeAbsolute()));		
-	}
-
-	private static String getTagDirURI(TLDDocument doc, IProject project) {
-		Path p = new Path(doc.getBaseLocation());
-		IVirtualComponent projectComp = ComponentCore.createComponent(project);
-		
-		if (projectComp != null)
-		{
-		    IVirtualFolder rootFolder = projectComp.getRootFolder();
-		    
-		    if (rootFolder != null)
-		    {
-		        IPath webContentPath = 
-		            rootFolder.getUnderlyingFolder().getFullPath();
-		        return getURIFromPath(p.makeRelativeTo(webContentPath));
-		    }
-		}
-		return null;
-	}
-
-	private static String getURIFromPath(IPath uriPath)
-	{
-		if (uriPath != null)
-			return "/"+uriPath.toString(); //$NON-NLS-1$ - do not remove "/" since is necessary for tagdir attr on taglib directive
-		
-		return null;
-	}
-
-	/**
-	 * @param tldDoc - must not be null
-	 * @param project - must not be null
-	 * @return true if this is a tag dir tldDocument
-	 */
-	public static boolean isTagDirDocument(final TLDDocument tldDoc, final IProject project) {
-		if (tldDoc.getUri() == null || tldDoc.getUri().equals("")) { //$NON-NLS-1$
-			IPath p = new Path(tldDoc.getBaseLocation());
-			IPath webContentPath = ComponentCore.createComponent(project).getRootFolder().getUnderlyingFolder().getFullPath();
-			if (p.matchingFirstSegments(webContentPath) == webContentPath.segmentCount()) {
-				p = p.removeFirstSegments(webContentPath.segmentCount());
-				if (p.matchingFirstSegments(new Path("WEB-INF/tags")) == 2) { //$NON-NLS-1$)  {
-					return true;
-				}
-			}
-		}
-		return false;
-	}
-	
-	//Code taken from jsf.common.ui.WorkspaceUtil
-	private static IProject getProjectFor(IPath path) {
-		String[] segs = path.segments();
-		String projectPath = new String();
-		IProject[] projects = ResourcesPlugin.getWorkspace().getRoot()
-				.getProjects();
-		IProject project = null;
-		for (int p = 0; p < projects.length; p++) {
-			if (projects[p].isOpen()) {
-				for (int s = 0; s < segs.length; s++) {
-					if (segs[s].equalsIgnoreCase(projects[p].getName())) {
-						// Once we have a match on the project name, then
-						// the remainder of the segments equals the project path
-						for (int s2 = s + 1; s2 < segs.length; s2++) {
-							projectPath = projectPath
-									+ "/" //$NON-NLS-1$
-									+ segs[s2];
-						}
-						project = projects[p];
-						break;
-					}
-				}
-			}
-		}
-		if (project == null) {
-			return null;
-		}
-
-		// TODO: still don't understand why this refreshLocal is necessary
-		// for now, going to only allow it if this method is called 
-		// when the tree isn't locked.  This shouldn't cause a regression, since
-		// when the call fails currently things keep on going due to the catch
-		if (!project.getWorkspace().isTreeLocked())
-		{
-    		try {
-    			project.refreshLocal(IResource.DEPTH_INFINITE, null);
-    		} catch (CoreException e) {
-//                 TODO C.B.:pushing this down to a warning because it creates really
-//                 spurious output.  Don't know why we are calling refreshLocal at all.
-                JSFCorePlugin.log(Status.WARNING, "Error.RefreshingLocal", e); //$NON-NLS-1$
-    		}
-		}
-		
-		IResource res = project.findMember(new Path(projectPath));
-		if ((res != null) && (res.exists())) {
-			return project;
-		}
-		return null;
-	}
-	
-	/**
-	 * Test whether this is the JSP core tag.
-	 * 
-	 * @param decl
-	 * @return true if decl is a jsp element declaration
-	 */
-	public static boolean isJSP(CMElementDeclaration decl) {
-		if (!decl.supports(HTMLCMProperties.IS_JSP)) {
-			return false;
-		}
-		Boolean b = (Boolean) decl.getProperty(HTMLCMProperties.IS_JSP);
-		return b.booleanValue();
-	}
-
-	/**
-	 * @param decl
-	 * @return true if the element declartion is a non-JSP html element
-	 */
-	public static boolean isHTML(CMElementDeclaration decl) {
-		if (!isJSP(decl) && (decl instanceof HTMLElementDeclaration)) {
-			return true;
-		}
-		return false;
-	}
-
-	/**
-	 * get element declaration of specified element
-	 * 
-	 * @param element
-	 * @return null if can't get it.
-	 */
-	public static CMElementDeclaration getElementDeclaration(Element element) {
-		if (element == null) {
-			return null;
-		}
-		INodeNotifier notifier = (INodeNotifier) element.getOwnerDocument();
-		if (notifier == null) {
-			return null;
-		}
-		ModelQueryAdapter mqa = (ModelQueryAdapter) notifier
-				.getAdapterFor(ModelQueryAdapter.class);
-		if (mqa == null) {
-			return null;
-		}
-		return mqa.getModelQuery().getCMElementDeclaration(element);
-	}
-
-	/**
-	 * @param element
-	 * @return the TLDElementDeclaration for element or null if not found
-	 */
-	public static TLDElementDeclaration getTLDElementDeclaration(Element element) {
-		CMNode decl = getElementDeclaration(element);
-		if (decl instanceof CMNodeWrapper) {
-			decl = ((CMNodeWrapper) decl).getOriginNode();
-		}
-		if (decl instanceof TLDElementDeclaration) {
-			return (TLDElementDeclaration) decl;
-		}
-        return null;
-	}
-	
-	/**
-	 * !!! NOTE: this function is intended to work around the problem that if your element
-	 * has not yet been added to an  IDOMModel, getElementDeclaration won't be able to find
-	 * it.  This method does nothing (unlike the ModelQuery-based approach in getElementDeclaration)
-	 * to ensure that the namespace "uri" provided is valid in the structured document provided.  It is
-	 * therefore only advisable to use this method in cases where your node is not already a member of a 
-	 * IDOMModel.
-	 * 
-	 * @param uri
-	 * @param elementName
-	 * @param document 
-	 * @return the TLDElementDeclaration for this required tag or null if there  is nothing appropriate
-	 */
-	public static CMElementDeclaration getTLDElementDeclaration(final String uri, final String elementName, IDocument document)
-	{
-	    TLDCMDocumentManager tldmgr = TaglibController.getTLDCMDocumentManager(document);
-	    
-	    if (tldmgr != null)
-	    {
-            for (Iterator it = tldmgr.getTaglibTrackers().iterator();it.hasNext();)
-            {
-                TaglibTracker  tracker = (TaglibTracker) it.next();
-                
-                if (tracker.getURI().equals(uri))
-                {
-                    return (CMElementDeclaration) tracker.getElements().getNamedItem(tracker.getPrefix()+":"+elementName); //$NON-NLS-1$
-                }
-            }
-	    }
-        // fallthrough
-        return null;
-	}
-
-	/**
-	 * give an element, get its namespace URI.
-	 * 
-	 * @param element
-	 * @return the namespace URI
-	 */
-	public static String getElementNamespaceURI(Element element) {
-	    //System.out.printf("uri for %s is %s\n", element.toString(), element.getNamespaceURI());
-
-	    CMElementDeclaration decl = getElementDeclaration(element);
-		if (decl == null) {
-		    
-		    // if the content model has nothing, see if the element 
-		    // itself has an xml namespace
-		    // TODO: should only apply this if the source document
-		    // is a valid XML doc?
-		    final String uri = element.getNamespaceURI();
-		    
-		    // may be null which the default state
-			return uri;
-		}
-
-		if (isJSP(decl)) {
-			return ITLDConstants.URI_JSP;
-		} else if (isHTML(decl)) {
-			return ITLDConstants.URI_HTML;
-		}
-
-		return getTagURI(decl);
-	}
-
-	/**
-	 * @param element
-	 * @return true if the element can have children
-	 */
-	public static boolean canHaveDirectTextChild(Element element) {
-		CMElementDeclaration decl = getElementDeclaration(element);
-		if (decl == null) {
-			return true;
-		}
-		int contentType = decl.getContentType();
-		return contentType != CMElementDeclaration.ELEMENT
-				&& contentType != CMElementDeclaration.EMPTY;
-
-	}
-    
-    private CMUtil()
-    {
-        // util class, no external instantiation
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/tld/DocumentTagIdentifier.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/tld/DocumentTagIdentifier.java
deleted file mode 100644
index 1af913f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/tld/DocumentTagIdentifier.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.core.internal.tld;
-
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
-import org.w3c.dom.Element;
-
-/**
- * A tag wrapper for a DOM element.  This element may or may not be a JSP tag,
- * but must be contained in a DOM tree.
- * 
- * @author cbateman
- *
- */
-/*package*/ class DocumentTagIdentifier extends TagIdentifier 
-{
-    private final Element  _element;
-    
-    /**
-     * @param element
-     */
-    public DocumentTagIdentifier(Element element)
-    {
-        _element = element;
-    }
-    
-    public String getTagName() 
-    {
-        return _element.getLocalName();
-    }
-
-    public String getUri() {
-        String uri = CMUtil.getElementNamespaceURI(_element);
-        
-        // give the content model priority
-        if (uri == null)
-        {
-            uri = _element.getNamespaceURI();
-        }
-        
-        return uri;
-    }
-
-    public boolean isJSPTag() {
-        CMElementDeclaration elemDecl = getElementDeclaration();
-        
-        if (elemDecl != null)
-        {
-            return CMUtil.isJSP(elemDecl);
-        }
-        
-        return false;
-    }
-
-    /**
-     * @return the element declaration for this tag
-     */
-    protected final CMElementDeclaration getElementDeclaration()
-    {
-        return CMUtil.getElementDeclaration(_element);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/tld/IFaceletConstants.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/tld/IFaceletConstants.java
deleted file mode 100644
index a79c106..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/tld/IFaceletConstants.java
+++ /dev/null
@@ -1,49 +0,0 @@
-package org.eclipse.jst.jsf.core.internal.tld;
-
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Set;
-
-/**
- * Adds facelet-specific constants.*
- * 
- * @author cbateman
- * 
- */
-public final class IFaceletConstants implements ITLDConstants
-{
-    /**
-     * The set of all standard Facelet tag libraries.
-     */
-    public static final Set<String> ALL_FACELET_TAGLIBS;
-    /**
-     * The uri for the composite taglib (Facelets only)
-     */
-    public static final String URI_JSF_COMPOSITE = "http://java.sun.com/jsf/composite"; //$NON-NLS-1$
-    /**
-     * The uri for the ui taglib (Facelets only)
-     */
-    public static final String URI_JSF_UI = "http://java.sun.com/jsf/facelets"; //$NON-NLS-1$
-    /**
-     * The uri for the jsf implementation of JSTL core tags (Facelets only)
-     */
-    public static final String URI_JSF_JSTL_CORE = "http://java.sun.com/jsp/jstl/core"; //$NON-NLS-1$
-    /**
-     * The uri for the jsf implementation of JSTL function tags (Facelets only)
-     */
-    public static final String URI_JSF_JSTL_FUNCTIONS = "http://java.sun.com/jsp/jstl/functions"; //$NON-NLS-1$
-    
-    static
-    {
-        Set<String>  taglibs = new HashSet<String>();
-        taglibs.add(URI_JSF_HTML);
-        taglibs.add(URI_JSF_CORE);
-        taglibs.add(URI_JSF_COMPOSITE);
-        taglibs.add(URI_JSF_UI);
-        taglibs.add(URI_JSF_JSTL_CORE);
-        taglibs.add(URI_JSF_JSTL_FUNCTIONS);
-        
-        ALL_FACELET_TAGLIBS = Collections.unmodifiableSet(taglibs);
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/tld/IJSFConstants.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/tld/IJSFConstants.java
deleted file mode 100644
index 1a069de..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/tld/IJSFConstants.java
+++ /dev/null
@@ -1,979 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.core.internal.tld;
-
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-
-/**
- * Constants covering the JSF Core and JSF HTML tag and tag attribute names
- */
-public interface IJSFConstants 
-{
-
-	/**
-	 * actionListener tagname
-	 */
-	final static public String TAG_ACTIONLISTENER = "actionListener"; //$NON-NLS-1$
-
-	/**
-	 * attribute tagname
-	 */
-	final static public String TAG_ATTRIBUTE = "attribute"; //$NON-NLS-1$
-
-	/**
-	 * convertDateTime tagname
-	 */
-	final static public String TAG_CONVERTDATETIME = "convertDateTime"; //$NON-NLS-1$
-
-	/**
-	 * converter tagname
-	 */
-	final static public String TAG_CONVERTER = "converter"; //$NON-NLS-1$
-
-	/**
-	 * convertNumber tagname
-	 */
-	final static public String TAG_CONVERTNUMBER = "convertNumber"; //$NON-NLS-1$
-
-	/**
-	 * facet tagname
-	 */
-	final static public String TAG_FACET = "facet"; //$NON-NLS-1$
-
-	/**
-	 * loadBundle tagname
-	 */
-	final static public String TAG_LOADBUNDLE = "loadBundle"; //$NON-NLS-1$
-
-	/**
-	 * param tagname
-	 */
-	final static public String TAG_PARAM = "param"; //$NON-NLS-1$
-
-    /**
-     * phaseListener tagname
-     */
-	final static public String TAG_PHASELISTENER = "phaseListener"; //$NON-NLS-1$
-	
-	/**
-	 * selectItem tagname
-	 */
-	final static public String TAG_SELECTITEM = "selectItem"; //$NON-NLS-1$
-
-	/**
-	 * selectItems tagname
-	 */
-	final static public String TAG_SELECTITEMS = "selectItems"; //$NON-NLS-1$
-
-	/**
-	 * setPropertyActionListener tagname
-	 */
-	final static public String TAG_SETPROPERTYACTIONLISTENER = "setPropertyActionListener"; //$NON-NLS-1$
-	
-	/**
-	 * subview tagname
-	 */
-	final static public String TAG_SUBVIEW = "subview"; //$NON-NLS-1$
-
-	/**
-	 * validateDoubleRange tagname
-	 */
-	final static public String TAG_VALIDATEDOUBLERANGE = "validateDoubleRange"; //$NON-NLS-1$
-
-	/**
-	 * validateLength tagname
-	 */
-	final static public String TAG_VALIDATELENGTH = "validateLength"; //$NON-NLS-1$
-
-	/**
-	 * validateLongRange tagname
-	 */
-	final static public String TAG_VALIDATELONGRANGE = "validateLongRange"; //$NON-NLS-1$
-
-	/**
-	 * validator tagname
-	 */
-	final static public String TAG_VALIDATOR = "validator"; //$NON-NLS-1$
-
-	/**
-	 * valueChangeListener tagname
-	 */
-	final static public String TAG_VALUECHANGELISTENER = "valueChangeListener"; //$NON-NLS-1$
-
-	/**
-	 * verbatim tagname
-	 */
-	final static public String TAG_VERBATIM = "verbatim"; //$NON-NLS-1$
-
-	/**
-	 * view tagname
-	 */
-	final static public String TAG_VIEW = "view"; //$NON-NLS-1$
-
-	/**
-	 * column tagname
-	 */
-	final static public String TAG_COLUMN = "column"; //$NON-NLS-1$
-
-	/**
-	 * commandButton tagname
-	 */
-	final static public String TAG_COMMANDBUTTON = "commandButton"; //$NON-NLS-1$
-
-	/**
-	 * commandLink tagname
-	 */
-	final static public String TAG_COMMANDLINK = "commandLink"; //$NON-NLS-1$
-
-	/**
-	 * dataTable tagname
-	 */
-	final static public String TAG_DATATABLE = "dataTable"; //$NON-NLS-1$
-
-	/**
-	 * form tagname
-	 */
-	final static public String TAG_FORM = "form"; //$NON-NLS-1$
-
-	/**
-	 * graphicImage tagname
-	 */
-	final static public String TAG_GRAPHICIMAGE = "graphicImage"; //$NON-NLS-1$
-
-	/**
-	 * inputHidden tagname
-	 */
-	final static public String TAG_INPUTHIDDEN = "inputHidden"; //$NON-NLS-1$
-
-	/**
-	 * inputSecret tagname
-	 */
-	final static public String TAG_INPUTSECRET = "inputSecret"; //$NON-NLS-1$
-
-	/**
-	 * inputText tagname
-	 */
-	final static public String TAG_INPUTTEXT = "inputText"; //$NON-NLS-1$
-
-	/**
-	 * inputTextarea tagname
-	 */
-	final static public String TAG_INPUTTEXTAREA = "inputTextarea"; //$NON-NLS-1$
-
-	/**
-	 * message tagname
-	 */
-	final static public String TAG_MESSAGE = "message"; //$NON-NLS-1$
-
-	/**
-	 * messages tagname
-	 */
-	final static public String TAG_MESSAGES = "messages"; //$NON-NLS-1$
-
-	/**
-	 * outputFormat tagname
-	 */
-	final static public String TAG_OUTPUTFORMAT = "outputFormat"; //$NON-NLS-1$
-
-	/**
-	 * outputLabel tagname
-	 */
-	final static public String TAG_OUTPUTLABEL = "outputLabel"; //$NON-NLS-1$
-
-	/**
-	 * outputLink tagname
-	 */
-	final static public String TAG_OUTPUTLINK = "outputLink"; //$NON-NLS-1$
-
-	/**
-	 * outputText tagname
-	 */
-	final static public String TAG_OUTPUTTEXT = "outputText"; //$NON-NLS-1$
-
-	/**
-	 * panelGrid tagname
-	 */
-	final static public String TAG_PANELGRID = "panelGrid"; //$NON-NLS-1$
-
-	/**
-	 * panelGroup tagname
-	 */
-	final static public String TAG_PANELGROUP = "panelGroup"; //$NON-NLS-1$
-
-	/**
-	 * selectBooleanCheckbox tagname
-	 */
-	final static public String TAG_SELECTBOOLEANCHECKBOX = "selectBooleanCheckbox"; //$NON-NLS-1$
-
-	/**
-	 * selectManyCheckbox tagname
-	 */
-	final static public String TAG_SELECTMANYCHECKBOX = "selectManyCheckbox"; //$NON-NLS-1$
-
-	/**
-	 * selectManyListbox tagname
-	 */
-	final static public String TAG_SELECTMANYLISTBOX = "selectManyListbox"; //$NON-NLS-1$
-
-	/**
-	 * selectManyMenu tagname
-	 */
-	final static public String TAG_SELECTMANYMENU = "selectManyMenu"; //$NON-NLS-1$
-
-	/**
-	 * selectOneListbox tagname
-	 */
-	final static public String TAG_SELECTONELISTBOX = "selectOneListbox"; //$NON-NLS-1$
-
-	/**
-	 * selectOneMenu tagname
-	 */
-	final static public String TAG_SELECTONEMENU = "selectOneMenu"; //$NON-NLS-1$
-
-	/**
-	 * selectOneMenu tagname
-	 */
-	final static public String TAG_SELECTONERADIO = "selectOneRadio"; //$NON-NLS-1$
-
-    // tag identifiers
-    /**
-     * TagIdentifier for TAG_VIEW
-     */
-    final static TagIdentifier TAG_IDENTIFIER_VIEW =
-        TagIdentifierFactory.createJSPTagWrapper(ITLDConstants.URI_JSF_CORE, TAG_VIEW);
-
-    /**
-     * TagIdentifier for TAG_LOADBUNDLE
-     */
-    final static TagIdentifier TAG_IDENTIFIER_LOADBUNDLE =
-        TagIdentifierFactory.createJSPTagWrapper(ITLDConstants.URI_JSF_CORE, TAG_LOADBUNDLE);
-
-    /**
-     * TagIdentifier for TAG_FACET
-     */
-    final static TagIdentifier TAG_IDENTIFIER_FACET =
-        TagIdentifierFactory.createJSPTagWrapper(ITLDConstants.URI_JSF_CORE, TAG_FACET);
-    
-    /**
-     * TagIdentifier for TAG_VERBATIM
-     */
-    final static TagIdentifier TAG_IDENTIFIER_VERBATIM =
-        TagIdentifierFactory.createJSPTagWrapper(ITLDConstants.URI_JSF_CORE, TAG_VERBATIM);
-    
-    /**
-     * TagIdentifier for TAG_DATATABLE
-     */
-    final static TagIdentifier TAG_IDENTIFIER_DATA_TABLE = 
-        TagIdentifierFactory.createJSPTagWrapper(ITLDConstants.URI_JSF_HTML, TAG_DATATABLE);
-
-    /**
-     * TagIdentifier for TAG_PANELGRID
-     */
-    final static TagIdentifier TAG_IDENTIFIER_PANEL_GRID =
-       TagIdentifierFactory.createJSPTagWrapper(ITLDConstants.URI_JSF_HTML, TAG_PANELGRID);
-
-    /**
-     * TagIdentifier for TAG_COLUMN
-     */
-    final static TagIdentifier TAG_IDENTIFIER_COLUMN =
-       TagIdentifierFactory.createJSPTagWrapper(ITLDConstants.URI_JSF_HTML, TAG_COLUMN);
-
-    /**
-     * TagIdentifier for TAG_FORM
-     */
-    final static TagIdentifier TAG_IDENTIFIER_FORM =
-        TagIdentifierFactory.createJSPTagWrapper(ITLDConstants.URI_JSF_HTML, TAG_FORM);
-
-    /**
-     * TagIdentifier for TAG_INPUTTEXT
-     */
-    final static TagIdentifier TAG_IDENTIFIER_INPUTTEXT =
-        TagIdentifierFactory.createJSPTagWrapper(ITLDConstants.URI_JSF_HTML, TAG_INPUTTEXT);
-    
-    /**
-     * TagIdentifier for TAG_INPUTSECRET
-     */
-    final static TagIdentifier TAG_IDENTIFIER_INPUTSECRET =
-    	TagIdentifierFactory.createJSPTagWrapper(ITLDConstants.URI_JSF_HTML, TAG_INPUTSECRET);
-
-    /**
-     * TagIdentifier for TAG_INPUTTEXTAREA
-     */
-    final static TagIdentifier TAG_IDENTIFIER_INPUTTEXTAREA =
-    	TagIdentifierFactory.createJSPTagWrapper(ITLDConstants.URI_JSF_HTML, TAG_INPUTTEXTAREA);
-
-    /**
-     * TagIdentifier for TAG_OUTPUTTEXT
-     */
-    final static TagIdentifier TAG_IDENTIFIER_OUTPUTTEXT =
-        TagIdentifierFactory.createJSPTagWrapper(ITLDConstants.URI_JSF_HTML, TAG_OUTPUTTEXT);
-    
-    /**
-     * TagIdentifier for TAG_OUTPUTLABEL
-     */
-    final static TagIdentifier TAG_IDENTIFIER_OUTPUTLABEL =
-        TagIdentifierFactory.createJSPTagWrapper(ITLDConstants.URI_JSF_HTML, TAG_OUTPUTLABEL);
-    
-    /**
-     * TagIdentifier for TAG_GRAPHICIMAGE
-     */
-    final static TagIdentifier TAG_IDENTIFIER_GRAPHICIMAGE =
-    	TagIdentifierFactory.createJSPTagWrapper(ITLDConstants.URI_JSF_HTML, TAG_GRAPHICIMAGE);
-
-    /**
-     * TagIdentifier for TAG_COMMANDBUTTON
-     */
-    final static TagIdentifier TAG_IDENTIFIER_COMMANDBUTTON =
-        TagIdentifierFactory.createJSPTagWrapper(ITLDConstants.URI_JSF_HTML, TAG_COMMANDBUTTON);
-
-    /**
-     * TagIdentifier for TAG_COMMANDLINK
-     */
-    final static TagIdentifier TAG_IDENTIFIER_COMMANDLINK =
-        TagIdentifierFactory.createJSPTagWrapper(ITLDConstants.URI_JSF_HTML, TAG_COMMANDLINK);
-
-    /**
-     * TagIdentifier for TAG_INPUTHIDDEN
-     */
-    final static TagIdentifier TAG_IDENTIFIER_INPUTHIDDEN =
-        TagIdentifierFactory.createJSPTagWrapper(ITLDConstants.URI_JSF_HTML, TAG_INPUTHIDDEN);
-
-    /**
-     * TagIdentifier for TAG_MESSAGE
-     */
-    final static TagIdentifier TAG_IDENTIFIER_MESSAGE =
-        TagIdentifierFactory.createJSPTagWrapper(ITLDConstants.URI_JSF_HTML, TAG_MESSAGE);
-
-    /**
-     * TagIdentifier for TAG_MESSAGES
-     */
-    final static  TagIdentifier TAG_IDENTIFIER_MESSAGES =
-        TagIdentifierFactory.createJSPTagWrapper(ITLDConstants.URI_JSF_HTML, TAG_MESSAGES);
-
-    /**
-     * TagIdentifier for TAG_OUTPUTFORMAT
-     */
-    final static TagIdentifier TAG_IDENTIFIER_OUTPUTFORMAT =
-        TagIdentifierFactory.createJSPTagWrapper(ITLDConstants.URI_JSF_HTML, TAG_OUTPUTFORMAT);
-
-    /**
-     * TagIdentifier for TAG_OUTPUTLINK
-     */
-    final static TagIdentifier TAG_IDENTIFIER_OUTPUTLINK =
-        TagIdentifierFactory.createJSPTagWrapper(ITLDConstants.URI_JSF_HTML, TAG_OUTPUTLINK);
-
-    /**
-     * TagIdentifier for TAG_PANELGROUP
-     */
-    final static TagIdentifier TAG_IDENTIFIER_PANEL_GROUP =
-        TagIdentifierFactory.createJSPTagWrapper(ITLDConstants.URI_JSF_HTML, TAG_PANELGROUP);
-
-    /**
-     * TagIdentifier for TAG_SELECTBOOLEANCHECKBOX
-     */
-    final static TagIdentifier TAG_IDENTIFIER_SELECTBOOLEANCHECKBOX = 
-        TagIdentifierFactory.createJSPTagWrapper(ITLDConstants.URI_JSF_HTML, TAG_SELECTBOOLEANCHECKBOX);
-
-    /**
-     * TagIdentifier for TAG_SELECTMANYCHECKBOX
-     */
-    final static TagIdentifier TAG_IDENTIFIER_SELECTMANYCHECKBOX = 
-        TagIdentifierFactory.createJSPTagWrapper(ITLDConstants.URI_JSF_HTML, TAG_SELECTMANYCHECKBOX);
-
-    /**
-     * TagIdentifier for TAG_SELECTMANYLISTBOX
-     */
-    final static TagIdentifier TAG_IDENTIFIER_SELECTMANYLISTBOX = 
-        TagIdentifierFactory.createJSPTagWrapper(ITLDConstants.URI_JSF_HTML, TAG_SELECTMANYLISTBOX);
-
-    /**
-     * TagIdentifier for TAG_SELECTMANYMENU
-     */
-    final static  TagIdentifier TAG_IDENTIFIER_SELECTMANYMENU =
-        TagIdentifierFactory.createJSPTagWrapper(ITLDConstants.URI_JSF_HTML, TAG_SELECTMANYMENU);
-
-    /**
-     * TagIdentifier for TAG_SELECTONELISTBOX
-     */
-    final static TagIdentifier TAG_IDENTIFIER_SELECTONELISTBOX =
-        TagIdentifierFactory.createJSPTagWrapper(ITLDConstants.URI_JSF_HTML, TAG_SELECTONELISTBOX);
-    
-    /**
-     * TagIdentifier for TAG_SELECTONEMENU
-     */
-    final static TagIdentifier TAG_IDENTIFIER_SELECTONEMENU =
-        TagIdentifierFactory.createJSPTagWrapper(ITLDConstants.URI_JSF_HTML, TAG_SELECTONEMENU);
-
-    /**
-     * TagIdentifier for TAG_SELECTONERADIO
-     */
-    final static TagIdentifier TAG_IDENTIFIER_SELECTONERADIO =
-        TagIdentifierFactory.createJSPTagWrapper(ITLDConstants.URI_JSF_HTML, TAG_SELECTONERADIO);
-
-    /**
-     * TagIdentifier for TAG_ACTIONLISTENER
-     */
-    final static TagIdentifier TAG_IDENTIFIER_ACTIONLISTENER = 
-        TagIdentifierFactory.createJSPTagWrapper(ITLDConstants.URI_JSF_CORE, TAG_ACTIONLISTENER);
-
-    /**
-     * TagIdentifier for TAG_ATTRIBUTE
-     */
-    final static TagIdentifier TAG_IDENTIFIER_ATTRIBUTE = 
-        TagIdentifierFactory.createJSPTagWrapper(ITLDConstants.URI_JSF_CORE, TAG_ATTRIBUTE);
-
-    /**
-     * TagIdentifier for TAG_CONVERTDATETIME
-     */
-    final static TagIdentifier TAG_IDENTIFIER_CONVERTDATETIME = 
-        TagIdentifierFactory.createJSPTagWrapper(ITLDConstants.URI_JSF_CORE, TAG_CONVERTDATETIME);
-
-    /**
-     * TagIdentifier for TAG_CONVERTNUMBER
-     */
-    final static TagIdentifier TAG_IDENTIFIER_CONVERTNUMBER = 
-        TagIdentifierFactory.createJSPTagWrapper(ITLDConstants.URI_JSF_CORE, TAG_CONVERTNUMBER);
-
-    /**
-     * TagIdentifier for TAG_CONVERTER
-     */
-    final static TagIdentifier TAG_IDENTIFIER_CONVERTER = 
-        TagIdentifierFactory.createJSPTagWrapper(ITLDConstants.URI_JSF_CORE, TAG_CONVERTER);
-
-    /**
-     * TagIdentifier for TAG_PARAM
-     */
-    final static TagIdentifier TAG_IDENTIFIER_PARAM =
-        TagIdentifierFactory.createJSPTagWrapper(ITLDConstants.URI_JSF_CORE, TAG_PARAM);
-
-    /**
-     * TagIdentifier for TAG_PHASELISTENER
-     */
-    final static TagIdentifier TAG_IDENTIFIER_PHASELISTENER =
-        TagIdentifierFactory.createJSPTagWrapper(ITLDConstants.URI_JSF_CORE, TAG_PHASELISTENER);
-
-    /**
-     * TagIdentifier for TAG_SELECTITEM
-     */
-    final static TagIdentifier TAG_IDENTIFIER_SELECTITEM = 
-        TagIdentifierFactory.createJSPTagWrapper(ITLDConstants.URI_JSF_CORE, TAG_SELECTITEM);
-
-    /**
-     * TagIdentifier for TAG_SELECTITEMS
-     */
-    final static TagIdentifier TAG_IDENTIFIER_SELECTITEMS =
-        TagIdentifierFactory.createJSPTagWrapper(ITLDConstants.URI_JSF_CORE, TAG_SELECTITEMS);
-
-    /**
-     * TagIdentifier for TAG_SETPROPERTYACTIONLISTENER
-     */
-    final static TagIdentifier TAG_IDENTIFIER_SETPROPERTYACTIONLISTENER =
-        TagIdentifierFactory.createJSPTagWrapper(ITLDConstants.URI_JSF_CORE, TAG_SETPROPERTYACTIONLISTENER);
-
-    /**
-     * TagIdentifier for TAG_SUBVIEW
-     */
-    final static TagIdentifier TAG_IDENTIFIER_SUBVIEW =
-        TagIdentifierFactory.createJSPTagWrapper(ITLDConstants.URI_JSF_CORE, TAG_SUBVIEW);
-
-    /**
-     * TagIdentifier for TAG_VALIDATEDOUBLERANGE
-     */
-    final static TagIdentifier TAG_IDENTIFIER_VALIDATEDOUBLERANGE =
-        TagIdentifierFactory.createJSPTagWrapper(ITLDConstants.URI_JSF_CORE, TAG_VALIDATEDOUBLERANGE);
-
-    /**
-     * TagIdentifier for TAG_VALIDATELENGTH
-     */
-    final static TagIdentifier TAG_IDENTIFIER_VALIDATELENGTH =
-        TagIdentifierFactory.createJSPTagWrapper(ITLDConstants.URI_JSF_CORE, TAG_VALIDATELENGTH);
-
-    /**
-     * TagIdentifier for TAG_VALIDATELONGRANGE
-     */
-    final static TagIdentifier TAG_IDENTIFIER_VALIDATELONGRANGE =
-        TagIdentifierFactory.createJSPTagWrapper(ITLDConstants.URI_JSF_CORE, TAG_VALIDATELONGRANGE);
-
-    /**
-     * TagIdentifier for TAG_VALIDATOR
-     */
-    final static TagIdentifier TAG_IDENTIFIER_VALIDATOR =
-        TagIdentifierFactory.createJSPTagWrapper(ITLDConstants.URI_JSF_CORE, TAG_VALIDATOR);
-
-    /**
-     * TagIdentifier for TAG_VALUECHANGELISTENER
-     */
-    final static TagIdentifier TAG_IDENTIFIER_VALUECHANGELISTENER = 
-        TagIdentifierFactory.createJSPTagWrapper(ITLDConstants.URI_JSF_CORE, TAG_VALUECHANGELISTENER);
-
-    // attribute names
-	/**
-	 * accept tag attribute name
-	 */
-	final static public String ATTR_ACCEPT = "accept"; //$NON-NLS-1$
-
-	/**
-	 * acceptcharset tag attribute name
-	 */
-	final static public String ATTR_ACCEPTCHARSET = "acceptcharset"; //$NON-NLS-1$
-
-	/**
-	 * accesskey tag attribute name
-	 */
-	final static public String ATTR_ACCESSKEY = "accesskey"; //$NON-NLS-1$
-
-	/**
-	 * action tag attribute name
-	 */
-	final static public String ATTR_ACTION = "action"; //$NON-NLS-1$
-
-	/**
-	 * actionListener tag attribute name
-	 */
-	final static public String ATTR_ACTIONLISTENER = "actionListener"; //$NON-NLS-1$
-
-	/**
-	 * alt tag attribute name
-	 */
-	final static public String ATTR_ALT = "alt"; //$NON-NLS-1$
-
-	/**
-	 * basename tag attribute name
-	 */
-	final static public String ATTR_BASENAME = "basename"; //$NON-NLS-1$
-
-	/**
-	 * bgcolor tag attribute name
-	 */
-	final static public String ATTR_BGCOLOR = "bgcolor"; //$NON-NLS-1$
-
-	/**
-	 * binding tag attribute name
-	 */
-	final static public String ATTR_BINDING = "binding"; //$NON-NLS-1$
-
-	/**
-	 * border tag attribute name
-	 */
-	final static public String ATTR_BORDER = "border"; //$NON-NLS-1$
-
-	/**
-	 * cellpadding tag attribute name
-	 */
-	final static public String ATTR_CELLPADDING = "cellpadding"; //$NON-NLS-1$
-
-	/**
-	 * cellspacing tag attribute name
-	 */
-	final static public String ATTR_CELLSPACING = "cellspacing"; //$NON-NLS-1$
-
-	/**
-	 * charset tag attribute name
-	 */
-	final static public String ATTR_CHARSET = "charset"; //$NON-NLS-1$
-
-	/**
-	 * cols tag attribute name
-	 */
-	final static public String ATTR_COLS = "cols"; //$NON-NLS-1$
-
-	/**
-	 * columnClasses tag attribute name
-	 */
-	final static public String ATTR_COLUMNCLASSES = "columnClasses"; //$NON-NLS-1$
-
-	/**
-	 * columns tag attribute name
-	 */
-	final static public String ATTR_COLUMNS = "columns"; //$NON-NLS-1$
-
-	/**
-	 * converterId tag attribute name
-	 */
-	final static public String ATTR_CONVERTERID = "converterId"; //$NON-NLS-1$
-
-	/**
-	 * coords tag attribute name
-	 */
-	final static public String ATTR_COORDS = "coords"; //$NON-NLS-1$
-
-	/**
-	 * currencyCode tag attribute name
-	 */
-	final static public String ATTR_CURRENCYCODE = "currencyCode"; //$NON-NLS-1$
-
-	/**
-	 * currencySymbol tag attribute name
-	 */
-	final static public String ATTR_CURRENCYSYMBOL = "currencySymbol"; //$NON-NLS-1$
-
-	/**
-	 * dateStyle tag attribute name
-	 */
-	final static public String ATTR_DATESTYLE = "dateStyle"; //$NON-NLS-1$
-
-	/**
-	 * dir tag attribute name
-	 */
-	final static public String ATTR_DIR = "dir"; //$NON-NLS-1$
-
-	/**
-	 * disabled tag attribute name
-	 */
-	final static public String ATTR_DISABLED = "disabled"; //$NON-NLS-1$
-
-	/**
-	 * errorClass tag attribute name
-	 */
-	final static public String ATTR_ERRORCLASS = "errorClass"; //$NON-NLS-1$
-
-	/**
-	 * errorStyle tag attribute name
-	 */
-	final static public String ATTR_ERRORSTYLE = "errorStyle"; //$NON-NLS-1$
-
-	/**
-	 * escape tag attribute name
-	 */
-	final static public String ATTR_ESCAPE = "escape"; //$NON-NLS-1$
-
-	/**
-	 * fatalClass tag attribute name
-	 */
-	final static public String ATTR_FATALCLASS = "fatalClass"; //$NON-NLS-1$
-
-	/**
-	 * fatalStyle tag attribute name
-	 */
-	final static public String ATTR_FATALSTYLE = "fatalStyle"; //$NON-NLS-1$
-
-	/**
-	 * first tag attribute name
-	 */
-	final static public String ATTR_FIRST = "first"; //$NON-NLS-1$
-
-	/**
-	 * footerClass tag attribute name
-	 */
-	final static public String ATTR_FOOTERCLASS = "footerClass"; //$NON-NLS-1$
-
-	/**
-	 * for tag attribute name
-	 */
-	final static public String ATTR_FOR = "for"; //$NON-NLS-1$
-
-	/**
-	 * frame tag attribute name
-	 */
-	final static public String ATTR_FRAME = "frame"; //$NON-NLS-1$
-
-	/**
-	 * globalOnly tag attribute name
-	 */
-	final static public String ATTR_GLOBEONLY = "globalOnly"; //$NON-NLS-1$
-
-	/**
-	 * headerClass tag attribute name
-	 */
-	final static public String ATTR_HEADERCLASS = "headerClass"; //$NON-NLS-1$
-
-	/**
-	 * hreflang tag attribute name
-	 */
-	final static public String ATTR_HREFLANG = "hreflang"; //$NON-NLS-1$
-
-	/**
-	 * id tag attribute name
-	 */
-	final static public String ATTR_ID = "id"; //$NON-NLS-1$
-
-	/**
-	 * image tag attribute name
-	 */
-	final static public String ATTR_IMAGE = "image"; //$NON-NLS-1$
-
-	/**
-	 * immediate tag attribute name
-	 */
-	final static public String ATTR_IMMEDIATE = "immediate"; //$NON-NLS-1$
-
-	/**
-	 * infoClass tag attribute name
-	 */
-	final static public String ATTR_INFOCLASS = "infoClass"; //$NON-NLS-1$
-
-	/**
-	 * infoStyle tag attribute name
-	 */
-	final static public String ATTR_INFOSTYLE = "infoStyle"; //$NON-NLS-1$
-
-	/**
-	 * itemDescription tag attribute name
-	 */
-	final static public String ATTR_ITEMDESCRIPTION = "itemDescription"; //$NON-NLS-1$
-
-	/**
-	 * itemDisabled tag attribute name
-	 */
-	final static public String ATTR_ITEMDISABLED = "itemDisabled"; //$NON-NLS-1$
-
-	/**
-	 * itemLabel tag attribute name
-	 */
-	final static public String ATTR_ITEMLABEL = "itemLabel"; //$NON-NLS-1$
-
-	/**
-	 * itemValue tag attribute name
-	 */
-	final static public String ATTR_ITEMVALUE = "itemValue"; //$NON-NLS-1$
-
-	/**
-	 * lang tag attribute name
-	 */
-	final static public String ATTR_LANG = "lang"; //$NON-NLS-1$
-
-	/**
-	 * layout tag attribute name
-	 */
-	final static public String ATTR_LAYOUT = "layout"; //$NON-NLS-1$
-
-	/**
-	 * locale tag attribute name
-	 */
-	final static public String ATTR_LOCALE = "locale"; //$NON-NLS-1$
-
-	/**
-	 * maximum tag attribute name
-	 */
-	final static public String ATTR_MAXIMUM = "maximum"; //$NON-NLS-1$
-
-	/**
-	 * minimum tag attribute name
-	 */
-	final static public String ATTR_MINIMUM = "minimum"; //$NON-NLS-1$
-
-	/**
-	 * name tag attribute name
-	 */
-	final static public String ATTR_NAME = "name"; //$NON-NLS-1$
-
-	/**
-	 * onblur tag attribute name
-	 */
-	final static public String ATTR_ONBLUR = "onblur"; //$NON-NLS-1$
-
-	/**
-	 * onchange tag attribute name
-	 */
-	final static public String ATTR_ONCHANGE = "onchange"; //$NON-NLS-1$
-
-	/**
-	 * onclick tag attribute name
-	 */
-	final static public String ATTR_ONCLICK = "onclick"; //$NON-NLS-1$
-
-	/**
-	 * ondblclick tag attribute name
-	 */
-	final static public String ATTR_ONDBLCLICK = "ondblclick"; //$NON-NLS-1$
-
-	/**
-	 * onfocus tag attribute name
-	 */
-	final static public String ATTR_ONFOCUS = "onfocus"; //$NON-NLS-1$
-
-	/**
-	 * onkeydown tag attribute name
-	 */
-	final static public String ATTR_ONKEYDOWN = "onkeydown"; //$NON-NLS-1$
-
-	/**
-	 * onkeypress tag attribute name
-	 */
-	final static public String ATTR_ONKEYPRESS = "onkeypress"; //$NON-NLS-1$
-
-	/**
-	 * onkeyup tag attribute name
-	 */
-	final static public String ATTR_ONKEYUP = "onkeyup"; //$NON-NLS-1$
-
-	/**
-	 * onmousedown tag attribute name
-	 */
-	final static public String ATTR_ONMOUSEDOWN = "onmousedown"; //$NON-NLS-1$
-
-	/**
-	 * onmousemove tag attribute name
-	 */
-	final static public String ATTR_ONMOUSEMOVE = "onmousemove"; //$NON-NLS-1$
-
-	/**
-	 * onmouseout tag attribute name
-	 */
-	final static public String ATTR_ONMOUSEOUT = "onmouseout"; //$NON-NLS-1$
-
-	/**
-	 * onmouseover tag attribute name
-	 */
-	final static public String ATTR_ONMOUSEOVER = "onmouseover"; //$NON-NLS-1$
-
-	/**
-	 * onmouseup tag attribute name
-	 */
-	final static public String ATTR_ONMOUSEUP = "onmouseup"; //$NON-NLS-1$
-
-	/**
-	 * onselect tag attribute name
-	 */
-	final static public String ATTR_ONSELECT = "onselect"; //$NON-NLS-1$
-
-	/**
-	 * pattern tag attribute name
-	 */
-	final static public String ATTR_PATTERN = "pattern"; //$NON-NLS-1$
-
-	/**
-	 * readonly tag attribute name
-	 */
-	final static public String ATTR_READONLY = "readonly"; //$NON-NLS-1$
-
-	/**
-	 * rel tag attribute name
-	 */
-	final static public String ATTR_REL = "rel"; //$NON-NLS-1$
-
-	/**
-	 * rendered tag attribute name
-	 */
-	final static public String ATTR_RENDERED = "rendered"; //$NON-NLS-1$
-
-	/**
-	 * rev tag attribute name
-	 */
-	final static public String ATTR_REV = "rev"; //$NON-NLS-1$
-
-	/**
-	 * rowClasses tag attribute name
-	 */
-	final static public String ATTR_ROWCLASSES = "rowClasses"; //$NON-NLS-1$
-
-	/**
-	 * rows tag attribute name
-	 */
-	final static public String ATTR_ROWS = "rows"; //$NON-NLS-1$
-
-	/**
-	 * rules tag attribute name
-	 */
-	final static public String ATTR_RULES = "rules"; //$NON-NLS-1$
-
-	/**
-	 * shape tag attribute name
-	 */
-	final static public String ATTR_SHAPE = "shape"; //$NON-NLS-1$
-
-	/**
-	 *  showDetail tag attribute name
-	 */
-	final static public String ATTR_SHOWDETAIL = "showDetail"; //$NON-NLS-1$
-
-	/**
-	 * showSummary tag attribute name
-	 */
-	final static public String ATTR_SHOWSUMMARY = "showSummary"; //$NON-NLS-1$
-
-	/**
-	 * size tag attribute name
-	 */
-	final static public String ATTR_SIZE = "size"; //$NON-NLS-1$
-
-	/**
-	 * style tag attribute name
-	 */
-	final static public String ATTR_STYLE = "style"; //$NON-NLS-1$
-
-	/**
-	 * styleClass tag attribute name
-	 */
-	final static public String ATTR_STYLECLASS = "styleClass"; //$NON-NLS-1$
-
-	/**
-	 * summary tag attribute name
-	 */
-	final static public String ATTR_SUMMARY = "summary"; //$NON-NLS-1$
-
-	/**
-	 * tabindex tag attribute name
-	 */
-	final static public String ATTR_TABINDEX = "tabindex"; //$NON-NLS-1$
-
-	/**
-	 * target tag attribute name
-	 */
-	final static public String ATTR_TARGET = "target"; //$NON-NLS-1$
-
-	/**
-	 * timeStyle tag attribute name
-	 */
-	final static public String ATTR_TIMESTYLE = "timeStyle"; //$NON-NLS-1$
-
-	/**
-	 * title tag attribute name
-	 */
-	final static public String ATTR_TITLE = "title"; //$NON-NLS-1$
-
-	/**
-	 * tooltip tag attribute name
-	 */
-	final static public String ATTR_TOOLTIP = "tooltip"; //$NON-NLS-1$
-
-	/**
-	 * type tag attribute name
-	 */
-	final static public String ATTR_TYPE = "type"; //$NON-NLS-1$
-
-	/**
-	 * url tag attribute name
-	 */
-	final static public String ATTR_URL = "url"; //$NON-NLS-1$
-
-	/**
-	 * validatorId tag attribute name
-	 */
-	final static public String ATTR_VALIDATORID = "validatorId"; //$NON-NLS-1$
-
-	/**
-	 * value tag attribute name
-	 */
-	final static public String ATTR_VALUE = "value"; //$NON-NLS-1$
-
-	/**
-	 * var tag attribute name
-	 */
-	final static public String ATTR_VAR = "var"; //$NON-NLS-1$
-
-	/**
-	 * warnClass tag attribute name
-	 */
-	final static public String ATTR_WARNCLASS = "warnClass"; //$NON-NLS-1$
-
-	/**
-	 * warnStyle tag attribute name
-	 */
-	final static public String ATTR_WARNSTYLE = "warnStyle"; //$NON-NLS-1$
-
-	/**
-	 * width tag attribute name
-	 */
-	final static public String ATTR_WIDTH = "width"; //$NON-NLS-1$
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/tld/ITLDConstants.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/tld/ITLDConstants.java
deleted file mode 100644
index 3ec16f4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/tld/ITLDConstants.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.core.internal.tld;
-
-/**
- * Global tag library constants
- * 
- * @author cbateman
- *
- */
-public interface ITLDConstants {
-
-    /**
-     * The JSF core (f) component URI
-     */
-    public static final String URI_JSF_CORE = "http://java.sun.com/jsf/core"; //$NON-NLS-1$
-    /**
-     * The JSF html (h) component URI
-     */
-    public static final String URI_JSF_HTML = "http://java.sun.com/jsf/html"; //$NON-NLS-1$
-    /**
-     * The last component of the html uri
-     */
-    public static final String URI_HTML = "html"; //$NON-NLS-1$
-    /**
-     * The last component of the core uri
-     */
-    public static final String URI_JSP = "jsp"; //$NON-NLS-1$
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/tld/JSPTagIdentifier.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/tld/JSPTagIdentifier.java
deleted file mode 100644
index 8546c38..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/tld/JSPTagIdentifier.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.core.internal.tld;
-
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-
-/**
- * A tag wrapper for a JSP tag.
- * 
- * @author cbateman
- *
- */
-/*package*/ class JSPTagIdentifier extends TagIdentifier 
-{
-    private final String _uri;
-    private final String _tagName;
-    
-    /**
-     * @param uri
-     * @param tagName
-     */
-    public JSPTagIdentifier(final String uri, final String tagName)
-    {
-        _uri = uri;
-        _tagName = tagName;
-    }
-    public String getTagName() {
-        return _tagName;
-    }
-
-    public String getUri() {
-        return _uri;
-    }
-
-    public boolean isJSPTag() {
-        return true;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/tld/LoadBundleUtil.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/tld/LoadBundleUtil.java
deleted file mode 100644
index 0b7ed14..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/tld/LoadBundleUtil.java
+++ /dev/null
@@ -1,359 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.core.internal.tld;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Locale;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IStorage;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jdt.core.IClasspathContainer;
-import org.eclipse.jdt.core.IClasspathEntry;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.IPackageFragmentRoot;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.JavaModelException;
-
-/**
- * @author mengbo
- */
-public class LoadBundleUtil {
-
-	private LoadBundleUtil() {
-	    // no external instantiation
-	}
-
-
-	/**
-	 * @param project
-	 * @param baseName
-	 * @return an IStorage pointing to the request bundle or null if not found
-	 * @throws CoreException if the search for the file encounters a problem
-	 */
-	public static IStorage getLoadBundleResource(final IProject project,
-			final String baseName) throws CoreException {
-		if (project == null || baseName == null) {
-			return null;
-		}
-		IStorage loadBundleResource = null;
-		if (project.hasNature(JavaCore.NATURE_ID)) {
-			IJavaProject javaProject = JavaCore.create(project);
-			IFile sourceFile = getSourceFile(javaProject, baseName);
-			if (sourceFile == null || !sourceFile.exists()) {
-				loadBundleResource = getJarFile(javaProject, baseName);
-			} else {
-				loadBundleResource = sourceFile;
-			}
-		}
-
-		return loadBundleResource;
-	}
-
-	private static IFile getSourceFile(IJavaProject javaProject, String baseName)
-			throws JavaModelException {
-		IClasspathEntry[] classpathEntries = javaProject.getRawClasspath();
-		for (int i = 0; i < classpathEntries.length; i++) {
-			if (classpathEntries[i].getEntryKind() == IClasspathEntry.CPE_SOURCE) {
-				final IFile file = getFile(javaProject, baseName,
-						classpathEntries, i);
-				if (file.exists()) {
-					return file;
-				}
-			} else if (classpathEntries[i].getEntryKind() == IClasspathEntry.CPE_PROJECT) {
-				IProject project = ResourcesPlugin.getWorkspace().getRoot()
-						.getProject(classpathEntries[i].getPath().toString());
-				IJavaProject javaProject3 = JavaCore.create(project);
-				final IFile file = getSourceFile(javaProject3, baseName);
-				if (file != null && file.exists()) {
-					return file;
-				}
-			}
-			else if (classpathEntries[i].getEntryKind() == IClasspathEntry.CPE_CONTAINER && classpathEntries[i].getPath().equals(new Path("org.eclipse.jst.j2ee.internal.module.container")))  //$NON-NLS-1$
-			{ 
-				IClasspathContainer container = JavaCore.getClasspathContainer(classpathEntries[i].getPath(), javaProject);
-				IClasspathEntry[] classpathEntries2 = container.getClasspathEntries();
-				for (int j = 0; j < classpathEntries2.length; j++) 
-				{
-					if (classpathEntries2[j].getEntryKind() == IClasspathEntry.CPE_PROJECT) 
-					{
-						IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(classpathEntries2[j].getPath().toString());
-						IJavaProject javaProject3 = JavaCore.create(project);
-						final IFile file = getSourceFile(javaProject3, baseName);
-						if (file != null && file.exists())
-						{
-							return file;
-						}
-					}
-				}
-			}
-		}
-		return null;
-	}
-
-
-	private static IFile getFile(IJavaProject javaProject, String baseName,
-			IClasspathEntry[] classpathEntries, int i) {
-		IPath path = classpathEntries[i].getPath()
-				.append(getFilePath(baseName)).removeFirstSegments(1);
-		path = javaProject.getProject().getFullPath().append(path);
-		return ResourcesPlugin.getWorkspace().getRoot().getFile(path);
-	}
-
-	private static IPath getFilePath(String baseName) {
-		IPath path = new Path(baseName.replace('.', '/'));
-		path = path.addFileExtension("properties");//$NON-NLS-1$
-		return path;
-	}
-
-	private static IStorage getJarFile(IJavaProject javaProject, String baseName)
-			throws JavaModelException {
-		IClasspathEntry[] roots = javaProject.getRawClasspath();
-		return getJarFile(javaProject, baseName, roots);
-	}
-
-	private static IStorage getJarFile(IJavaProject javaProject, String baseName,
-			IClasspathEntry[] roots) throws JavaModelException
-	{
-		for (int i = 0; i < roots.length; i++) {
-			if (roots[i].getEntryKind() == IClasspathEntry.CPE_LIBRARY ||
-					roots[i].getEntryKind() == IClasspathEntry.CPE_CONTAINER)
-			{
-				IStorage storage = getResourceFromLibrary(
-						javaProject, baseName, roots[i]);
-				if (storage != null)
-				{
-					return storage;
-				}
-			}
-//			else if ( roots[i].getEntryKind() == IClasspathEntry.CPE_CONTAINER) 
-//			{
-//				IClasspathContainer classpathContainer = JavaCore.getClasspathContainer(roots[i].getPath(), javaProject);
-//				final IClasspathEntry[] classpathEntries = 
-//					classpathContainer.getClasspathEntries();
-//				IStorage storage = getJarFile(javaProject, baseName, classpathEntries);
-//				if (storage != null)
-//				{
-//					return storage;
-//				}
-//			}
-		}
-		return null;
-	}
-
-	private static IStorage getResourceFromLibrary(
-			IJavaProject javaProject, String baseName, IClasspathEntry entry) throws JavaModelException 
-	{
-		IPackageFragmentRoot[] packageFragmentRoots = javaProject
-				.findPackageFragmentRoots(entry);
-		for (int j = 0; j < packageFragmentRoots.length; j++) {
-			String packageName = getPackageName(baseName);
-			Object[] resources = null;
-			if (packageName.length() == 0) {
-				resources = packageFragmentRoots[j].getNonJavaResources();
-			} else {
-				IPackageFragment fragment = packageFragmentRoots[j]
-						.getPackageFragment(getPackageName(baseName));
-				if (fragment != null && fragment.exists()) {
-					resources = fragment.getNonJavaResources();
-				}
-			}
-
-			if (resources != null && resources.length > 0) {
-				for (int k = 0; k < resources.length; k++) {
-					if (resources[k] instanceof IStorage) {
-						IStorage storage = (IStorage) resources[k];
-						if (getFileName(baseName).equalsIgnoreCase(
-								storage.getName())) {
-							return storage;
-						}
-					}
-				}
-			}
-		}
-		return null;
-	}
-
-	private static String getPackageName(String baseName) {
-		int index = baseName.lastIndexOf('.');
-		if (index == -1) {
-			return "";//$NON-NLS-1$
-		}
-        return baseName.substring(0, index);
-	}
-
-	private static String getFileName(String baseName) {
-		int index = baseName.lastIndexOf('.');
-		if (index == -1) {
-			return baseName + ".properties"; //$NON-NLS-1$
-		}
-        return baseName.substring(index + 1).concat(".properties");//$NON-NLS-1$
-	}
-
-    /**
-     * Encapsulates the hiearchy of bundle data sources in the hierarchy
-     * for a ResourceBundle base name.  In practice this is often simply
-     * a single IFile for a 
-     * @author cbateman
-     *
-     */
-//    public static class BundleHierarchy
-//    {
-//        // list in order from most specific (first queried) to least,
-//        // front to back
-//        //private final List        _hierarchy; 
-//    
-//        /**
-//         * Takes the list *by reference*.  Does not take a copy.
-//         * @param hierarchy
-//         */
-//        public BundleHierarchy(List hierarchy)
-//        {
-//            _hierarchy = hierarchy;
-//        }
-//        
-//        public BundleHierarchy()
-//        {
-//            _hierarchy = new ArrayList();
-//        }
-//    }
-    
-    /**
-     * Used to describe the design time approximation of the locale lookup precendence
-     * that will be used by ResourceBundle to find a localized resource bundle.
-     * 
-     * See the official JavaDoc for java.util.ResourceBundle.getBundle for docs on search
-     * order.  
-     * 
-     * @author cbateman
-     *
-     */
-    public static class LocaleDescriptor
-    {
-        private Locale            _locale;
-        private List              _possibleSuffices;
-        
-        /**
-         * @param language -- must not be null
-         */
-        public LocaleDescriptor(String language)
-        {
-            _locale = new Locale(language);
-        }
-        
-        /**
-         * All arguments must be non-null.  To set a language only descriptor,
-         * see others.
-         * 
-         * @param language -- must not be null
-         * @param country -- must not be null
-         */
-        public LocaleDescriptor(String language,
-                String country)
-        {
-            _locale = new Locale(language, country);
-        }
-        
-        /**
-         * All arguments must be non-null. Null arguments will cause an exception.
-         * To create descriptor without variant and/or country set, see other constructors
-         * @param language -- must not be null
-         * @param country -- must not be null
-         * @param variant -- must not be null
-         */
-        public LocaleDescriptor(String language,
-                String country, String variant) 
-        {
-            _locale = new Locale(language, country, variant);
-        }
-        
-        /**
-         * @param baseName
-         * @return an iterator through all possible bundle names starting with the most
-         * specific and becoming more general for base name based on this locale.
-         * 
-         * i.e. if baseName is "bundle" and the local is en_US_1 then in order the 
-         * iterator will produce:
-         * 
-         * bundle_en_US_1
-         * bundle_en_US
-         * bundle_en
-         * bundle
-         * 
-         * per the ResourceBundle API
-         * 
-         */
-        public Iterator getBundleNameIterator(final String baseName)
-        {
-            
-            return new Iterator()
-            {
-                final Iterator  it = getPossibleBaseNameSuffices().iterator();
-                
-                public boolean hasNext() {
-                   return it.hasNext();
-                }
-
-                public Object next() {
-                    return baseName+it.next(); 
-                }
-
-                public void remove() {
-                    // delegate; should throw exception
-                    it.remove();
-                }
-            };
-        }
-
-        private synchronized List getPossibleBaseNameSuffices()
-        {
-            if (_possibleSuffices == null)
-            {
-                List possibleSuffices = new ArrayList(3);
-
-                final String language = _locale.getLanguage();
-                final String country = _locale.getCountry();
-                final String variant = _locale.getVariant();
-
-                possibleSuffices.add(""); //$NON-NLS-1$
-                possibleSuffices.add("_"+language); //$NON-NLS-1$
-                if (country != null)
-                {
-                    possibleSuffices.add(0, "_"+language + "_" + country); //$NON-NLS-1$ //$NON-NLS-2$
-                    if (variant != null)
-                    {
-                        possibleSuffices.add(0, "_"+language+"_"+country+"_"+variant); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-                    }
-                }
-                _possibleSuffices = Collections.unmodifiableList(possibleSuffices);
-            }
-
-            return _possibleSuffices;
-       }
-
-        /**
-         * @return the local information as a standard locale object
-         */
-        public Locale getLocale()
-        {
-            return _locale;
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/tld/TLDTagIdentifier.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/tld/TLDTagIdentifier.java
deleted file mode 100644
index 97f946a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/tld/TLDTagIdentifier.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.core.internal.tld;
-
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.jsp.core.internal.contentmodel.tld.provisional.TLDDocument;
-import org.eclipse.jst.jsp.core.internal.contentmodel.tld.provisional.TLDElementDeclaration;
-
-final class TLDTagIdentifier extends TagIdentifier
-{
-    private final TLDElementDeclaration _tldDecl;
-
-    public TLDTagIdentifier(final TLDElementDeclaration tldDecl)
-    {
-        _tldDecl = tldDecl;
-    }
-    
-    @Override
-    public String getTagName()
-    {
-        return _tldDecl.getElementName();
-    }
-
-    @Override
-    public String getUri()
-    {
-        return  ((TLDDocument)_tldDecl.getOwnerDocument()).getUri();
-    }
-
-    @Override
-    public boolean isJSPTag()
-    {
-        return true;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/tld/TagIdentifierFactory.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/tld/TagIdentifierFactory.java
deleted file mode 100644
index a95b978..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/tld/TagIdentifierFactory.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.core.internal.tld;
-
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.jsp.core.internal.contentmodel.tld.provisional.TLDDocument;
-import org.eclipse.jst.jsp.core.internal.contentmodel.tld.provisional.TLDElementDeclaration;
-import org.w3c.dom.Element;
-
-/**
- * Factory creating tag identifiers
- * 
- * @author cbateman
- *
- */
-public final class TagIdentifierFactory 
-{
-    /**
-     * Create a tag identifier based on a uri and tagName
-     * 
-     * @param uri
-     * @param tagName
-     * @return a new tag identifier for (uri, tagName)
-     */
-    public static TagIdentifier createJSPTagWrapper(final String uri, final String tagName)
-    {
-        return new JSPTagIdentifier(uri, tagName);
-    }
-    
-    /**
-     * @param element
-     * @return a tag identifier based on a DOM element
-     */
-    public static TagIdentifier createDocumentTagWrapper(final Element element)
-    {
-        return new DocumentTagIdentifier(element);
-    }
-    
-    /**
-     * @param elementDecl
-     * @return a tag identifier that bridges a TLDElementDeclaration
-     */
-    public static TagIdentifier createTLDTagWrapper(final TLDElementDeclaration elementDecl)
-    {
-        if (!(elementDecl.getOwnerDocument() instanceof TLDDocument))
-        {
-            throw new IllegalArgumentException("Element decl must have a tlddoc for a parent: "+elementDecl.toString()); //$NON-NLS-1$
-        }
-        return new TLDTagIdentifier(elementDecl);
-    }
-    
-    private TagIdentifierFactory()
-    {
-        // static class, no external instantiation
-    }
-}
-
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/AbstractJSFAppConfigLocater.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/AbstractJSFAppConfigLocater.java
deleted file mode 100644
index 883ee51..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/AbstractJSFAppConfigLocater.java
+++ /dev/null
@@ -1,163 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.jsfappconfig;
-
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.LinkedHashSet;
-import java.util.Set;
-
-import org.eclipse.jst.jsf.core.jsfappconfig.internal.IJSFAppConfigManager;
-
-/**
- * Abstract implementation of {@link IJSFAppConfigLocater} that provides common
- * locater functionality. {@link IJSFAppConfigLocater} implementations MUST
- * extend this class or provide similar functionality.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author Ian Trimble - Oracle
- */
-public abstract class AbstractJSFAppConfigLocater implements IJSFAppConfigLocater {
-
-	/**
-	 * {@link JSFAppConfigManager} instance to which this locater belongs.
-	 * @deprecated - DO NOT USE
-	 */
-	protected JSFAppConfigManager manager = null;
-	
-	/**
-	 * {@link IJSFAppConfigManager} instance to which this locater belongs.
-	 */
-	private IJSFAppConfigManager _manager;
-
-	/**
-	 * Set of known {@link IJSFAppConfigProvider} instances.
-	 */
-	protected Set configProviders = new LinkedHashSet();
-	
-	public void setJSFAppConfigManager(final IJSFAppConfigManager manager) {
-		this._manager = manager;
-	}
-	
-	public IJSFAppConfigManager getJSFAppConfigManager() {
-		return _manager;
-	}
-
-	public abstract void startLocating();
-
-	public abstract void stopLocating();
-
-	public Set<IJSFAppConfigProvider> getJSFAppConfigProviders() {
-		return configProviders;
-	}
-
-	/**
-	 * Adds an {@link IJSFAppConfigProvider} instance to the set of known
-	 * instances and notifies {@link JSFAppConfigManager} instance of the
-	 * addition if successful.
-	 * 
-	 * @param configProvider {@link IJSFAppConfigProvider} instance to be
-	 * added.
-	 * @return true if instance was added, else false.
-	 */
-	protected boolean addConfigProvider(final IJSFAppConfigProvider configProvider) {
-		final boolean added = configProviders.add(configProvider);
-		if (added && getJSFAppConfigManager() != null) {
-			configProvider.setJSFAppConfigLocater(this);
-			getJSFAppConfigManager().notifyJSFAppConfigProvidersChangeListeners(
-					configProvider,
-					JSFAppConfigProvidersChangeEvent.ADDED);
-		}
-		return added;
-	}
-
-	/**
-	 * Removes an {@link IJSFAppConfigProvider} instance from the set of known
-	 * instances and notifies {@link JSFAppConfigManager} instance of the
-	 * removal if successful.
-	 * 
-	 * @param configProvider {@link IJSFAppConfigProvider} instance to be
-	 * removed.
-	 * @return true if instance was removed, else false.
-	 */
-	protected boolean removeConfigProvider(final IJSFAppConfigProvider configProvider) {
-		if (configProvider != null) {
-			configProvider.releaseFacesConfigModel();
-		}
-		final boolean removed = configProviders.remove(configProvider);
-		if (removed && getJSFAppConfigManager() != null) {
-			getJSFAppConfigManager().notifyJSFAppConfigProvidersChangeListeners(
-					configProvider,
-					JSFAppConfigProvidersChangeEvent.REMOVED);
-		}
-		return removed;
-	}
-
-	/**
-	 * Updates known set of {@link IJSFAppConfigProvider} instances by removing
-	 * instances that are in the existing set but not in the passed set and
-	 * adding instances that are in the passed set but not in the existing set.
-	 * Instances that are in both the existing set and the passed set are left
-	 * unchanged. The {@link JSFAppConfigManager} is notified of removals and
-	 * additions, and no notification is sent for instances that are left
-	 * unchanged.
-	 * 
-	 * @param newConfigProviders New set of {@link IJSFAppConfigProvider}
-	 * instances. 
-	 */
-	protected void updateConfigProviders(final Set newConfigProviders) {
-		if (newConfigProviders != null) {
-			final LinkedHashSet oldConfigProviders = new LinkedHashSet();
-			//iterate over existing set
-			final Iterator itConfigProviders = configProviders.iterator();
-			while (itConfigProviders.hasNext()) {
-				final IJSFAppConfigProvider configProvider = (IJSFAppConfigProvider)itConfigProviders.next();
-				//remove provider from new set if it is already in existing set
-				if (!newConfigProviders.remove(configProvider)) {
-					//stage removal of existing provider that is not in new set
-					oldConfigProviders.add(configProvider);
-				}
-			}
-			//remove providers that are not in new set from existing set
-			final Iterator itOldConfigProviders = oldConfigProviders.iterator();
-			while (itOldConfigProviders.hasNext()) {
-				final IJSFAppConfigProvider configProvider = (IJSFAppConfigProvider)itOldConfigProviders.next();
-				//call removeConfigProvider(...) method so manager's listeners are notified
-				removeConfigProvider(configProvider);
-			}
-			//add providers that are still in new set to existing set
-			final Iterator itNewConfigProviders = newConfigProviders.iterator();
-			while (itNewConfigProviders.hasNext()) {
-				final IJSFAppConfigProvider configProvider = (IJSFAppConfigProvider)itNewConfigProviders.next();
-				//call addConfigProvider(...) method so manager's listeners are notified
-				addConfigProvider(configProvider);
-			}
-		}
-	}
-
-	/**
-	 * Removes all {@link IJSFAppConfigProvider} instances from the known set,
-	 * sending notification of all removals to the {@link JSFAppConfigManager}
-	 * instance.
-	 */
-	protected void removeAllConfigProviders() {
-		updateConfigProviders(Collections.EMPTY_SET);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.core.jsfappconfig.IJSFAppConfigLocater#dispose()
-	 */
-    public void dispose() {
-        removeAllConfigProviders();
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/AbstractJSFAppConfigProvider.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/AbstractJSFAppConfigProvider.java
deleted file mode 100644
index baaf9e1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/AbstractJSFAppConfigProvider.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.jsfappconfig;
-
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType;
-
-/**
- * Abstract implementation of {@link IJSFAppConfigProvider} that provides
- * common provider functionality. {@link IJSFAppConfigProvider} instances
- * should extend this class or provide similar functionality.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author Ian Trimble - Oracle
- */
-public abstract class AbstractJSFAppConfigProvider implements IJSFAppConfigProvider {
-
-	/**
-	 * {@link IJSFAppConfigLocater} instance that located this instance.
-	 */
-	protected IJSFAppConfigLocater jsfAppConfigLocater = null;
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.core.jsfappconfig.IJSFAppConfigProvider#setJSFAppConfigLocater(org.eclipse.jst.jsf.core.jsfappconfig.IJSFAppConfigLocater)
-	 */
-	public void setJSFAppConfigLocater(IJSFAppConfigLocater locater) {
-		this.jsfAppConfigLocater = locater;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.core.jsfappconfig.IJSFAppConfigProvider#getFacesConfigModel()
-	 */
-	public abstract FacesConfigType getFacesConfigModel();
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.core.jsfappconfig.IJSFAppConfigProvider#releaseFacesConfigModel()
-	 */
-	public abstract void releaseFacesConfigModel();
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/ArtifactEditJSFAppConfigProvider.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/ArtifactEditJSFAppConfigProvider.java
deleted file mode 100644
index 0c9ab39..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/ArtifactEditJSFAppConfigProvider.java
+++ /dev/null
@@ -1,142 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.jsfappconfig;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType;
-import org.eclipse.jst.jsf.facesconfig.util.FacesConfigArtifactEdit;
-
-/**
- * ArtifactEditJSFAppConfigProvider uses FacesConfigArtifactEdit to provide
- * the root element of an application configuration model.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author Ian Trimble - Oracle
- */
-public class ArtifactEditJSFAppConfigProvider extends AbstractJSFAppConfigProvider {
-
-	/**
-	 * IFile instance that represents an application configuration resource
-	 * file.
-	 */
-	protected IFile appConfigFile = null;
-
-	/**
-	 * FacesConfigArtifactEdit instance used to get the application
-	 * configuration model.
-	 */
-	protected FacesConfigArtifactEdit facesConfigArtifactEdit = null;
-
-	/**
-	 * Cached {@link FacesConfigType} instance.
-	 */
-	protected FacesConfigType facesConfig = null;
-
-	/**
-	 * Creates an instance, storing the passed IFile instance for subsequent
-	 * processing.
-	 * 
-	 * @param appConfigFile IFile instance that represents an application
-	 * configuration resource file
-	 */
-	public ArtifactEditJSFAppConfigProvider(IFile appConfigFile) {
-		this.appConfigFile = appConfigFile;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.core.jsfappconfig.IJSFAppConfigProvider#getFacesConfigModel()
-	 */
-	public FacesConfigType getFacesConfigModel() {
-		if (facesConfig == null) {
-			if (appConfigFile != null) {
-				IProject project = appConfigFile.getProject();
-				IPath appConfigFilePath = JSFAppConfigUtils.getWebContentFolderRelativePath(appConfigFile);
-				if (appConfigFilePath != null) {
-					facesConfigArtifactEdit = FacesConfigArtifactEdit.getFacesConfigArtifactEditForRead(project, appConfigFilePath.toString());
-					if (facesConfigArtifactEdit != null) {
-						facesConfig = facesConfigArtifactEdit.getFacesConfig();
-						if (facesConfig != null) {
-							jsfAppConfigLocater.getJSFAppConfigManager().addFacesConfigChangeAdapter(facesConfig);
-						}
-					}
-				}
-			}
-		}
-		return facesConfig;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.core.jsfappconfig.IJSFAppConfigProvider#releaseFacesConfigModel()
-	 */
-	public void releaseFacesConfigModel() {
-	    if (jsfAppConfigLocater != null)
-	    {
-	        jsfAppConfigLocater.getJSFAppConfigManager().removeFacesConfigChangeAdapter(facesConfig);
-	    }
-		if (facesConfigArtifactEdit != null) {
-			facesConfigArtifactEdit.dispose();
-			facesConfigArtifactEdit = null;
-		}
-		facesConfig = null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see java.lang.Object#equals(java.lang.Object)
-	 */
-	public boolean equals(Object otherObject) {
-		boolean equals = false;
-		if (otherObject instanceof ArtifactEditJSFAppConfigProvider) {
-			IFile otherAppConfigFile = ((ArtifactEditJSFAppConfigProvider)otherObject).appConfigFile;
-			if (appConfigFile != null) {
-				equals = appConfigFile.equals(otherAppConfigFile);
-			} else {
-				equals = otherAppConfigFile == null;
-			}
-		}
-		return equals;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see java.lang.Object#hashCode()
-	 */
-	public int hashCode() {
-		return appConfigFile != null ? appConfigFile.hashCode() : 0;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		StringBuffer sb = new StringBuffer("ArtifactEditJSFAppConfigProvider["); //$NON-NLS-1$
-		if (appConfigFile != null) {
-			sb.append(appConfigFile.toString());
-		} else {
-			sb.append("null"); //$NON-NLS-1$
-		}
-		sb.append("]"); //$NON-NLS-1$
-		return sb.toString();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see java.lang.Object#finalize()
-	 */
-	protected void finalize() {
-		releaseFacesConfigModel();
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/ContextParamSpecifiedJSFAppConfigLocater.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/ContextParamSpecifiedJSFAppConfigLocater.java
deleted file mode 100644
index 2ccf148..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/ContextParamSpecifiedJSFAppConfigLocater.java
+++ /dev/null
@@ -1,307 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.jsfappconfig;
-
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.impl.AdapterImpl;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.jst.j2ee.common.ParamValue;
-import org.eclipse.jst.j2ee.model.IModelProvider;
-import org.eclipse.jst.j2ee.model.ModelProviderManager;
-import org.eclipse.jst.j2ee.webapplication.ContextParam;
-import org.eclipse.jst.j2ee.webapplication.WebApp;
-
-/**
- * ContextParamSpecifiedJSFAppConfigLocater attempts to locate application
- * configuration files specified by the JSF CONFIG_FILES context parameter.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author Ian Trimble - Oracle
- * TODO:cleanup once JavaEE API's stabilize
- */
-public class ContextParamSpecifiedJSFAppConfigLocater extends WebContentRelativeJSFAppConfigLocater {
-
-	/**
-	 * Cached instance of ContextParamAdapter.
-	 */
-	protected ContextParamAdapter 	contextParamAdapter = null;
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.core.jsfappconfig.AbstractJSFAppConfigLocater#startLocating()
-	 */
-	public void startLocating() {
-		locateProviders();
-		Object webAppObj = getModelObject();
-		if (webAppObj != null){
-			contextParamAdapter = new ContextParamAdapter();
-			if (webAppObj instanceof WebApp) 
-				startLocatingJ2EEConfigs((WebApp)webAppObj);
-			else if (webAppObj instanceof org.eclipse.jst.javaee.web.WebApp)
-				startLocatingJEEConfigs((org.eclipse.jst.javaee.web.WebApp)webAppObj);
-		} else {
-			//TODO should never get here.  Log err?
-		}
-	}
-
-	private Object getModelObject() {
-		Object modelObject = null;
-		IModelProvider provider = ModelProviderManager.getModelProvider(getJSFAppConfigManager().getProject());
-		if (provider != null) {
-			modelObject = provider.getModelObject();
-		}
-		return modelObject;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.core.jsfappconfig.AbstractJSFAppConfigLocater#stopLocating()
-	 */
-	public void stopLocating() {
-		if (contextParamAdapter != null) {
-			Object webAppObj = getModelObject();
-			if (webAppObj != null){
-				if (webAppObj instanceof WebApp) 
-					stopLocatingJ2EEConfigs((WebApp)webAppObj);
-				else if (webAppObj instanceof org.eclipse.jst.javaee.web.WebApp)
-					stopLocatingJEEConfigs((org.eclipse.jst.javaee.web.WebApp)webAppObj);
-			} else {
-				//TODO should never get here.  Log err?
-			}
-			contextParamAdapter = null;
-		}
-	}
-
-	private void startLocatingJ2EEConfigs(WebApp webApp){
-		webApp.eAdapters().add(contextParamAdapter);
-		EList contexts = webApp.getContexts();
-		if (contexts != null) {
-			Iterator itContexts = contexts.iterator();
-			while (itContexts.hasNext()) {
-				ContextParam contextParam = (ContextParam)itContexts.next();
-				contextParam.eAdapters().add(contextParamAdapter);
-			}
-		}
-		EList contextParams = webApp.getContextParams();
-		if (contextParams != null) {
-			Iterator itContextParams = contextParams.iterator();
-			while (itContextParams.hasNext()) {
-				ParamValue paramValue = (ParamValue)itContextParams.next();
-				paramValue.eAdapters().add(contextParamAdapter);
-			}
-		}
-	}
-
-	private void startLocatingJEEConfigs(org.eclipse.jst.javaee.web.WebApp webApp) {
-		((EObject)webApp).eAdapters().add(contextParamAdapter);
-		List params = webApp.getContextParams();
-		if (params != null) {
-			Iterator itContexts = params.iterator();
-			while (itContexts.hasNext()) {
-				EObject contextParam = (EObject)itContexts.next();
-				contextParam.eAdapters().add(contextParamAdapter);
-			}
-		}
-	}
-
-	private void stopLocatingJ2EEConfigs(WebApp webApp) {
-		webApp.eAdapters().remove(contextParamAdapter);
-		EList contexts = webApp.getContexts();
-		if (contexts != null) {
-			Iterator itContexts = contexts.iterator();
-			while (itContexts.hasNext()) {
-				ContextParam contextParam = (ContextParam)itContexts.next();
-				contextParam.eAdapters().remove(contextParamAdapter);
-			}
-		}
-		EList contextParams = webApp.getContextParams();
-		if (contextParams != null) {
-			Iterator itContextParams = contextParams.iterator();
-			while (itContextParams.hasNext()) {
-				ParamValue paramValue = (ParamValue)itContextParams.next();
-				paramValue.eAdapters().remove(contextParamAdapter);
-			}
-		}
-	}
-	
-	private void stopLocatingJEEConfigs(org.eclipse.jst.javaee.web.WebApp webApp) {
-		((EObject)webApp).eAdapters().remove(contextParamAdapter);
-		List contextParams = webApp.getContextParams();
-		if (contextParams != null) {
-			Iterator itContextParams = contextParams.iterator();
-			while (itContextParams.hasNext()) {
-				EObject paramValue = (EObject)itContextParams.next();
-				paramValue.eAdapters().remove(contextParamAdapter);
-			}
-		}
-	}
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.core.jsfappconfig.WebContentRelativeJSFAppConfigLocater#getFilenames()
-	 */
-	protected List getFilenames() {
-		return JSFAppConfigUtils.getConfigFilesFromContextParam(getJSFAppConfigManager().getProject());
-	}
-
-	/**
-	 * Adapter implementation used to monitor addition/removal of context-param
-	 * nodes and change in name of existing nodes in order to respond to
-	 * changes to the JSF CONFIG_FILES context-param.
-	 * 
-	 * @author Ian Trimble - Oracle
-	 */
-	class ContextParamAdapter extends AdapterImpl {
-
-		/*
-		 * (non-Javadoc)
-		 * @see org.eclipse.emf.common.notify.impl.AdapterImpl#notifyChanged(org.eclipse.emf.common.notify.Notification)
-		 */
-		public void notifyChanged(Notification notification) {
-			Object objNotifier = notification.getNotifier();
-//			System.out.println(objNotifier.toString());
-			if (objNotifier instanceof WebApp ||
-					objNotifier instanceof org.eclipse.jst.javaee.web.WebApp) {
-				int eventType = notification.getEventType();
-				switch (eventType) {
-				case Notification.ADD:
-					Object objNewValue = notification.getNewValue();
-					if (objNewValue instanceof ContextParam ||
-							objNewValue instanceof org.eclipse.jst.javaee.core.ParamValue) {
-						contextParamAdded((EObject)objNewValue);
-					} else if (objNewValue instanceof ParamValue ) {		
-						paramValueAdded((EObject)objNewValue);
-					}
-					break;
-				case Notification.REMOVE:
-					Object objOldValue = notification.getOldValue();
-					if (objOldValue instanceof ContextParam ||
-							objOldValue instanceof org.eclipse.jst.javaee.core.ParamValue) {
-						contextParamRemoved((EObject)objOldValue);
-					} else if (objOldValue instanceof ParamValue) {
-						paramValueRemoved((EObject)objOldValue);
-					}
-					break;
-				}
-			} else if (objNotifier instanceof ContextParam ||
-					objNotifier instanceof org.eclipse.jst.javaee.core.ParamValue) {
-				if (notification.getEventType() != Notification.REMOVING_ADAPTER) {
-					locateProviders();
-				}
-			} else if (objNotifier instanceof ParamValue) {
-				if (notification.getEventType() != Notification.REMOVING_ADAPTER) {
-					locateProviders();
-				}
-			}
-		}
-
-		/**
-		 * Called when a new ContextParam instance is added.
-		 * 
-		 * @param contextParam ContextParam instance.
-		 */
-		protected void contextParamAdded(EObject contextParam) {
-			if (isConfigFilesContextParam(contextParam)) {
-				locateProviders();
-			}
-			contextParam.eAdapters().add(this);
-		}
-
-		/**
-		 * Called when a new ParamValue instance is added.
-		 * 
-		 * @param paramValue ParamValue instance.
-		 */
-		protected void paramValueAdded(EObject paramValue) {
-			if (isConfigFilesParamValue(paramValue)) {
-				locateProviders();
-			}
-			paramValue.eAdapters().add(this);
-		}
-
-		/**
-		 * Called when a ContextParam instance is removed.
-		 * 
-		 * @param contextParam ContextParam instance.
-		 */
-		protected void contextParamRemoved(EObject contextParam) {
-			if (isConfigFilesContextParam(contextParam)) {
-				locateProviders();
-			}
-			contextParam.eAdapters().remove(this);
-		}
-
-		/**
-		 * Called when a ParamValue instance is removed.
-		 * 
-		 * @param paramValue ParamValue instance.
-		 */
-		protected void paramValueRemoved(EObject paramValue) {
-			if (isConfigFilesParamValue(paramValue)) {
-				locateProviders();
-			}
-			paramValue.eAdapters().remove(this);
-		}
-
-		/**
-		 * Tests if the passed ContextParam instance is the JSF CONFIG_FILES
-		 * context parameter.
-		 * 
-		 * @param contextParam ContextParam instance.
-		 * @return true if the passed ContextParam instance is the JSF
-		 * CONFIG_FILES context parameter, else false
-		 */
-		protected boolean isConfigFilesContextParam(EObject contextParam) {
-			boolean isConfigFiles = false;
-			if (contextParam != null) {
-				String name = null;
-				if (contextParam instanceof ContextParam)
-					name = ((ContextParam)contextParam).getParamName();
-				else if (contextParam instanceof org.eclipse.jst.javaee.core.ParamValue)
-					name = ((org.eclipse.jst.javaee.core.ParamValue)contextParam).getParamName();
-
-				if (name != null && name.equals(JSFAppConfigUtils.CONFIG_FILES_CONTEXT_PARAM_NAME)) {
-					isConfigFiles = true;
-				}
-			}
-			return isConfigFiles;
-		}
-
-		/**
-		 * Tests if the passed ParamValue instance is the JSF CONFIG_FILES
-		 * context parameter.
-		 * 
-		 * @param paramVal as EObject ParamValue instance.
-		 * @return true if the passed ParamValue instance is the JSF
-		 * CONFIG_FILES context parameter, else false
-		 */
-		protected boolean isConfigFilesParamValue(EObject paramVal) {
-			boolean isConfigFiles = false;
-			if (paramVal != null) {
-				String name = null;
-				if (paramVal instanceof ParamValue)
-					name = ((ParamValue)paramVal).getName();
-				else if (paramVal instanceof org.eclipse.jst.javaee.core.ParamValue)
-					name = ((org.eclipse.jst.javaee.core.ParamValue)paramVal).getParamName();
-				
-				if (name != null && name.equals(JSFAppConfigUtils.CONFIG_FILES_CONTEXT_PARAM_NAME)) {
-					isConfigFiles = true;
-				}
-			}
-			return isConfigFiles;
-		}
-
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/DefaultJSFAppConfigLocater.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/DefaultJSFAppConfigLocater.java
deleted file mode 100644
index 3e3f014..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/DefaultJSFAppConfigLocater.java
+++ /dev/null
@@ -1,151 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.jsfappconfig;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResourceChangeEvent;
-import org.eclipse.core.resources.IResourceChangeListener;
-import org.eclipse.core.resources.IResourceDelta;
-import org.eclipse.core.resources.IResourceDeltaVisitor;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jst.jsf.common.internal.componentcore.AbstractVirtualComponentQuery.DefaultVirtualComponentQuery;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.wst.common.componentcore.resources.IVirtualFolder;
-import org.eclipse.wst.common.componentcore.resources.IVirtualResource;
-
-/**
- * DefaultJSFAppConfigLocater attempts to locate the default application
- * configuration file, located at "/WEB-INF/faces-config.xml".
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author Ian Trimble - Oracle
- */
-public class DefaultJSFAppConfigLocater extends WebContentRelativeJSFAppConfigLocater 
-	implements IResourceChangeListener {
-
-	/**
-	 * Web content folder-relative name of the default application
-	 * configuration resource file.
-	 */
-	public static final String DEF_APPCONFIGRESOURCE_FILENAME = "WEB-INF/faces-config.xml"; //$NON-NLS-1$
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.core.jsfappconfig.AbstractJSFAppConfigLocater#startLocating()
-	 */
-	public void startLocating() {
-		locateProviders();
-		IWorkspace workspace = ResourcesPlugin.getWorkspace();
-		workspace.addResourceChangeListener(this, IResourceChangeEvent.POST_BUILD);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.core.jsfappconfig.AbstractJSFAppConfigLocater#stopLocating()
-	 */
-	public void stopLocating() {
-		IWorkspace workspace = ResourcesPlugin.getWorkspace();
-		workspace.removeResourceChangeListener(this);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.core.jsfappconfig.WebContentRelativeJSFAppConfigLocater#getFilenames()
-	 */
-	protected List getFilenames() {
-		List filenames = new ArrayList();
-		filenames.add(DEF_APPCONFIGRESOURCE_FILENAME);
-		return filenames;
-	}
-
-	/**
-	 * Responds to resource change events.
-	 * 
-	 * @param event IResourceChangeEvent instance.
-	 */
-	public void resourceChanged(IResourceChangeEvent event) {
-		IResourceDelta delta = event.getDelta();
-		try {
-			delta.accept(new ResourceDeltaVisitor());
-		} catch (CoreException cex) {
-			JSFCorePlugin.log(
-					IStatus.WARNING,
-					cex.getLocalizedMessage(),
-					cex);
-		}
-	}
-
-	/**
-	 * ResourceDeltaVisitor is used to visit an IResourceDelta instance to
-	 * discover if the default application configuration resource file has
-	 * been added or removed.
-	 * 
-	 * @author Ian Trimble - Oracle
-	 */
-	class ResourceDeltaVisitor implements IResourceDeltaVisitor {
-
-		/**
-		 * Cached IPath instance for default configuration resource file.
-		 */
-		protected IPath defConfigPath = null;
-
-		/*
-		 * (non-Javadoc)
-		 * @see org.eclipse.core.resources.IResourceDeltaVisitor#visit(org.eclipse.core.resources.IResourceDelta)
-		 */
-		public boolean visit(IResourceDelta delta) {
-			boolean visitChildren = false;
-			initDefConfigPath();
-			if (defConfigPath != null) {
-				IPath deltaPath = delta.getFullPath();
-				if (deltaPath != null) {
-					if (defConfigPath.equals(deltaPath)) {
-						locateProviders();
-					} else if (deltaPath.isPrefixOf(defConfigPath)) {
-						visitChildren = true;
-					}
-				}
-			} else {
-				locateProviders();
-			}
-			return visitChildren;
-		}
-
-		/**
-		 * Determines IPath instance for default configuration resource file
-		 * and caches in class member.
-		 */
-		protected void initDefConfigPath() {
-			if (defConfigPath == null) {
-				IProject project = getJSFAppConfigManager().getProject();
-				if (project != null) {
-					IVirtualFolder webContentFolder = new DefaultVirtualComponentQuery().getWebContentFolder(project);
-					if (webContentFolder != null) {
-						IVirtualResource defConfigFile = webContentFolder.findMember(DEF_APPCONFIGRESOURCE_FILENAME);
-						if (defConfigFile != null) {
-							defConfigPath = defConfigFile.getWorkspaceRelativePath();
-						}
-					}
-				}
-			}
-		}
-
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/IFacesConfigChangeListener.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/IFacesConfigChangeListener.java
deleted file mode 100644
index 7f40db6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/IFacesConfigChangeListener.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.jsfappconfig;
-
-import org.eclipse.emf.common.notify.Notification;
-
-/**
- * IFacesConfigChangeListener is the interface that must be implemented by
- * objects interested in receiving notification of changes to application
- * configuration models.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author Ian Trimble - Oracle
- */
-public interface IFacesConfigChangeListener {
-
-	/**
-	 * Called when a change in an application configuration model for which
-	 * this listener has been registered occurs.
-	 * 
-	 * @param notification EMF {@link Notification} instance that describes the
-	 * model change.
-	 */
-	public void notifyChanged(Notification notification);
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/IJSFAppConfigLocater.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/IJSFAppConfigLocater.java
deleted file mode 100644
index c3a6d0a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/IJSFAppConfigLocater.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.jsfappconfig;
-
-import java.util.Set;
-
-import org.eclipse.jst.jsf.core.jsfappconfig.internal.IJSFAppConfigManager;
-
-/**
- * IJSFAppConfigLocater is the interface that Objects capable of locating
- * and providing JSF application configuration resources must implement.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @noimplement - users must extend {@link AbstractJSFAppConfigLocater}
- * @author Ian Trimble - Oracle
- */
-public interface IJSFAppConfigLocater {
-
-	/**
-	 * Sets the {@link IJSFAppConfigManager} instance to which this locater
-	 * belongs.
-	 * 
-	 * @param manager {@link IJSFAppConfigManager} instance to be set.
-	 */
-	public void setJSFAppConfigManager(IJSFAppConfigManager manager);
-
-	/**
-	 * Gets the {@link IJSFAppConfigManager} instance to which this locater
-	 * belongs.
-	 * 
-	 * @return {@link IJSFAppConfigManager} instance to which this locater
-	 * belongs.
-	 */
-	public IJSFAppConfigManager getJSFAppConfigManager();
-
-	/**
-	 * Starts locating JSF application configuration resources.
-	 */
-	public void startLocating();
-
-	/**
-	 * Stops locating JSF application configuration resources.
-	 */
-	public void stopLocating();
-
-	/**
-	 * Disposes of the instance.
-	 */
-    public void dispose();
-
-	/**
-	 * Gets the set of {@link IJSFAppConfigProvider} instances that this
-	 * locater has located.
-	 * 
-	 * @return set of {@link IJSFAppConfigProvider} instances.
-	 */
-	public Set<IJSFAppConfigProvider> getJSFAppConfigProviders();
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/IJSFAppConfigProvider.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/IJSFAppConfigProvider.java
deleted file mode 100644
index 51bba21..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/IJSFAppConfigProvider.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.jsfappconfig;
-
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType;
-
-/**
- * IJSFAppConfigProvider is the interface that Objects capable of providing
- * JSF application configuration models must implement.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @noimplement - should use {@link AbstractJSFAppConfigProvider} or {@link ArtifactEditJSFAppConfigProvider} if that config can be modified
- * @author Ian Trimble - Oracle
- * 
- */
-public interface IJSFAppConfigProvider {
-
-	/**
-	 * Sets the {@link IJSFAppConfigLocater} instance that located this
-	 * instance.
-	 * 
-	 * @param locater {@link IJSFAppConfigLocater} instance that located this
-	 * instance.
-	 */
-	public void setJSFAppConfigLocater(IJSFAppConfigLocater locater);
-
-	/**
-	 * Gets the root element of the application configuration model for read
-	 * access.
-	 * 
-	 * @return FacesConfigType instance, which is the root element of an
-	 * application configuration model.
-	 */
-	public FacesConfigType getFacesConfigModel();
-
-	/**
-	 * Releases resources associated with acquiring the application
-	 * configuration model (if any).
-	 */
-	public void releaseFacesConfigModel();
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/IJSFAppConfigProvidersChangeListener.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/IJSFAppConfigProvidersChangeListener.java
deleted file mode 100644
index d8282c9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/IJSFAppConfigProvidersChangeListener.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.jsfappconfig;
-
-/**
- * Interface that an Object wishing to be notified about changes to the Set of
- * IJSFAppConfigProvider instances implements.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author Ian Trimble - Oracle.
- */
-public interface IJSFAppConfigProvidersChangeListener {
-
-	/**
-	 * Callback method indicating a change in the Set of JSFAppConfigProvider
-	 * instances.
-	 * 
-	 * @param event JSFAppConfigProvidersChangeEvent instance.
-	 */
-	public void changedJSFAppConfigProviders(JSFAppConfigProvidersChangeEvent event);
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/ImplicitRuntimeJSFAppConfigLocater.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/ImplicitRuntimeJSFAppConfigLocater.java
deleted file mode 100644
index eddcfeb..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/ImplicitRuntimeJSFAppConfigLocater.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.jsfappconfig;
-
-import java.util.LinkedHashSet;
-import java.util.Set;
-
-/**
- * ImplicitRuntimeJSFAppConfigLocater creates an {@link IJSFAppConfigProvider}
- * instance that provides an application configuration model that contains
- * implicit configuration elements that are specified as required to be
- * provided by a JSF implementation.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author Ian Trimble - Oracle
- */
-public class ImplicitRuntimeJSFAppConfigLocater extends AbstractJSFAppConfigLocater {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.core.jsfappconfig.AbstractJSFAppConfigLocater#startLocating()
-	 */
-	public void startLocating() {
-		locateProviders();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.core.jsfappconfig.AbstractJSFAppConfigLocater#stopLocating()
-	 */
-	public void stopLocating() {
-		//nothing to do
-	}
-
-	/**
-	 * Adds an {@link IJSFAppConfigProvider} instance that provides an
-	 * application configuration model that contains implicit configuration
-	 * objects provided by a JSF implementation at runtime.
-	 */
-	public void locateProviders() {
-		Set newConfigProviders = new LinkedHashSet();
-		newConfigProviders.add(new ImplicitRuntimeJSFAppConfigProvider());
-		updateConfigProviders(newConfigProviders);
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/ImplicitRuntimeJSFAppConfigProvider.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/ImplicitRuntimeJSFAppConfigProvider.java
deleted file mode 100644
index 6100eb3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/ImplicitRuntimeJSFAppConfigProvider.java
+++ /dev/null
@@ -1,295 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.jsfappconfig;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.jst.jsf.facesconfig.emf.ComponentClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.ComponentType;
-import org.eclipse.jst.jsf.facesconfig.emf.ComponentTypeType;
-import org.eclipse.jst.jsf.facesconfig.emf.ConverterClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.ConverterForClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.ConverterIdType;
-import org.eclipse.jst.jsf.facesconfig.emf.ConverterType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType;
-import org.eclipse.jst.jsf.facesconfig.emf.ValidatorClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.ValidatorIdType;
-import org.eclipse.jst.jsf.facesconfig.emf.ValidatorType;
-
-/**
- * ImplicitRuntimeJSFAppConfigProvider provides an application configuration
- * model that contains implicit configuration objects provided by a JSF
- * implementation at runtime.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author Ian Trimble - Oracle
- */
-public class ImplicitRuntimeJSFAppConfigProvider extends AbstractJSFAppConfigProvider {
-
-	/**
-	 * Cached {@link FacesConfigType} instance.
-	 */
-	protected FacesConfigType facesConfig = null;
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.core.jsfappconfig.IJSFAppConfigProvider#getFacesConfigModel()
-	 */
-	public FacesConfigType getFacesConfigModel() {
-		if (facesConfig == null) {
-			createModel();
-			if (facesConfig != null) {
-				jsfAppConfigLocater.getJSFAppConfigManager().addFacesConfigChangeAdapter(facesConfig);
-			}
-		}
-		return facesConfig;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.core.jsfappconfig.IJSFAppConfigProvider#releaseFacesConfigModel()
-	 */
-	public void releaseFacesConfigModel() {
-		jsfAppConfigLocater.getJSFAppConfigManager().removeFacesConfigChangeAdapter(facesConfig);
-		facesConfig = null;
-	}
-
-	/**
-	 * Creates the application configuration model and assigns it to the
-	 * facesConfig property.
-	 */
-	protected void createModel() {
-		facesConfig = FacesConfigFactory.eINSTANCE.createFacesConfigType();
-		//create and add converters by id
-		EList converters = facesConfig.getConverter();
-		converters.add(createConverter("BigDecimal")); //$NON-NLS-1$
-		converters.add(createConverter("BigInteger")); //$NON-NLS-1$
-		converters.add(createConverter("Boolean")); //$NON-NLS-1$
-		converters.add(createConverter("Byte")); //$NON-NLS-1$
-		converters.add(createConverter("Character")); //$NON-NLS-1$
-		converters.add(createConverter("DateTime")); //$NON-NLS-1$
-		converters.add(createConverter("Double")); //$NON-NLS-1$
-		converters.add(createConverter("Float")); //$NON-NLS-1$
-		converters.add(createConverter("Integer")); //$NON-NLS-1$
-		converters.add(createConverter("Long")); //$NON-NLS-1$
-		converters.add(createConverter("Number")); //$NON-NLS-1$
-		converters.add(createConverter("Short")); //$NON-NLS-1$
-		// converters by for-class (see spec 3.3.3 -- Standard Converter Implementions
-		converters.add(createForClassConverter("java.lang.Boolean", "javax.faces.convert.BooleanConverter")); //$NON-NLS-1$ //$NON-NLS-2$
-        converters.add(createForClassConverter("java.lang.Byte", "javax.faces.convert.ByteConverter")); //$NON-NLS-1$ //$NON-NLS-2$
-        converters.add(createForClassConverter("java.lang.Character", "javax.faces.convert.CharacterConverter")); //$NON-NLS-1$ //$NON-NLS-2$
-        converters.add(createForClassConverter("java.lang.Double", "javax.faces.convert.DoubleConverter")); //$NON-NLS-1$ //$NON-NLS-2$
-        converters.add(createForClassConverter("java.lang.Float", "javax.faces.convert.FloatConverter")); //$NON-NLS-1$ //$NON-NLS-2$
-        converters.add(createForClassConverter("java.lang.Integer", "javax.faces.convert.IntegerConverter")); //$NON-NLS-1$ //$NON-NLS-2$
-        converters.add(createForClassConverter("java.lang.Long", "javax.faces.convert.LongConverter")); //$NON-NLS-1$ //$NON-NLS-2$
-        converters.add(createForClassConverter("java.lang.Short", "javax.faces.converter.ShortConverter")); //$NON-NLS-1$ //$NON-NLS-2$
-		//create and add validators
-		EList validators = facesConfig.getValidator();
-		validators.add(createValidator("DoubleRange")); //$NON-NLS-1$
-		validators.add(createValidator("Length")); //$NON-NLS-1$
-		validators.add(createValidator("LongRange")); //$NON-NLS-1$
-		//create and add UI components
-		EList components = facesConfig.getComponent();
-		components.add(createUIComponent("Column")); //$NON-NLS-1$
-		components.add(createUIComponent("Command")); //$NON-NLS-1$
-		components.add(createUIComponent("Data")); //$NON-NLS-1$
-		components.add(createUIComponent("Form")); //$NON-NLS-1$
-		components.add(createUIComponent("Graphic")); //$NON-NLS-1$
-		components.add(createUIComponent("Input")); //$NON-NLS-1$
-		components.add(createUIComponent("Message")); //$NON-NLS-1$
-		components.add(createUIComponent("Messages")); //$NON-NLS-1$
-        components.add(createUIComponent("NamingContainer")); //$NON-NLS-1$
-		components.add(createUIComponent("Output")); //$NON-NLS-1$
-		components.add(createUIComponent("Panel")); //$NON-NLS-1$
-		components.add(createUIComponent("Parameter")); //$NON-NLS-1$
-		components.add(createUIComponent("SelectBoolean")); //$NON-NLS-1$
-		components.add(createUIComponent("SelectItem")); //$NON-NLS-1$
-		components.add(createUIComponent("SelectItems")); //$NON-NLS-1$
-		components.add(createUIComponent("SelectMany")); //$NON-NLS-1$
-		components.add(createUIComponent("SelectOne")); //$NON-NLS-1$
-		components.add(createUIComponent("ViewRoot")); //$NON-NLS-1$
-		//create and add HTML components
-		components.add(createHTMLComponent("HtmlCommandButton")); //$NON-NLS-1$
-		components.add(createHTMLComponent("HtmlCommandLink")); //$NON-NLS-1$
-		components.add(createHTMLComponent("HtmlDataTable")); //$NON-NLS-1$
-		components.add(createHTMLComponent("HtmlForm")); //$NON-NLS-1$
-		components.add(createHTMLComponent("HtmlGraphicImage")); //$NON-NLS-1$
-		components.add(createHTMLComponent("HtmlInputHidden")); //$NON-NLS-1$
-		components.add(createHTMLComponent("HtmlInputSecret")); //$NON-NLS-1$
-		components.add(createHTMLComponent("HtmlInputText")); //$NON-NLS-1$
-		components.add(createHTMLComponent("HtmlInputTextarea")); //$NON-NLS-1$
-		components.add(createHTMLComponent("HtmlMessage")); //$NON-NLS-1$
-		components.add(createHTMLComponent("HtmlMessages")); //$NON-NLS-1$
-		components.add(createHTMLComponent("HtmlOutputFormat")); //$NON-NLS-1$
-		components.add(createHTMLComponent("HtmlOutputLabel")); //$NON-NLS-1$
-		components.add(createHTMLComponent("HtmlOutputLink")); //$NON-NLS-1$
-		components.add(createHTMLComponent("HtmlOutputText")); //$NON-NLS-1$
-		components.add(createHTMLComponent("HtmlPanelGrid")); //$NON-NLS-1$
-		components.add(createHTMLComponent("HtmlPanelGroup")); //$NON-NLS-1$
-		components.add(createHTMLComponent("HtmlSelectBooleanCheckbox")); //$NON-NLS-1$
-		components.add(createHTMLComponent("HtmlSelectManyCheckbox")); //$NON-NLS-1$
-		components.add(createHTMLComponent("HtmlSelectManyListbox")); //$NON-NLS-1$
-		components.add(createHTMLComponent("HtmlSelectManyMenu")); //$NON-NLS-1$
-		components.add(createHTMLComponent("HtmlSelectOneListbox")); //$NON-NLS-1$
-		components.add(createHTMLComponent("HtmlSelectOneMenu")); //$NON-NLS-1$
-		components.add(createHTMLComponent("HtmlSelectOneRadio")); //$NON-NLS-1$
-	}
-
-	/**
-	 * Creates a {@link ConverterType} instance.
-	 *
-	 * @param name Base name of converter from which converter-id and
-	 * converter-class are formed.
-	 * @return {@link ConverterType} instance.
-	 */
-	protected ConverterType createConverter(String name) {
-		ConverterType converterType = FacesConfigFactory.eINSTANCE.createConverterType();
-		//set converter-id
-		ConverterIdType converterIdType = FacesConfigFactory.eINSTANCE.createConverterIdType();
-		StringBuffer sb = new StringBuffer();
-		sb.append("javax.faces."); //$NON-NLS-1$
-		sb.append(name);
-		converterIdType.setTextContent(sb.toString());
-		converterType.setConverterId(converterIdType);
-		//set converter-class
-		ConverterClassType converterClassType = FacesConfigFactory.eINSTANCE.createConverterClassType();
-		sb = new StringBuffer();
-		sb.append("javax.faces.convert."); //$NON-NLS-1$
-		sb.append(name);
-		sb.append("Converter"); //$NON-NLS-1$
-		converterClassType.setTextContent(sb.toString());
-		converterType.setConverterClass(converterClassType);
-		return converterType;
-	}
-
-	private ConverterType createForClassConverter(String forClass, String converterClass)
-	{
-        ConverterType converterType = FacesConfigFactory.eINSTANCE.createConverterType();
-        //set converter-id
-        ConverterForClassType converterForClass = FacesConfigFactory.eINSTANCE.createConverterForClassType();
-        converterForClass.setTextContent(forClass);
-        converterType.setConverterForClass(converterForClass);
-        //set converter-class
-        ConverterClassType converterClassType = FacesConfigFactory.eINSTANCE.createConverterClassType();
-        converterClassType.setTextContent(converterClass);
-        converterType.setConverterClass(converterClassType);
-        return converterType;
-	}
-	
-	/**
-	 * Creates a {@link ValidatorType} instance.
-	 * 
-	 * @param name Base name of validator from which validator-id and
-	 * validator-class are formed.
-	 * @return {@link ValidatorType} instance.
-	 */
-	protected ValidatorType createValidator(String name) {
-		ValidatorType validatorType = FacesConfigFactory.eINSTANCE.createValidatorType();
-		//set validator-id
-		ValidatorIdType validatorIdType = FacesConfigFactory.eINSTANCE.createValidatorIdType();
-		StringBuffer sb = new StringBuffer();
-		sb.append("javax.faces."); //$NON-NLS-1$
-		sb.append(name);
-		validatorIdType.setTextContent(sb.toString());
-		validatorType.setValidatorId(validatorIdType);
-		//set validator-class
-		ValidatorClassType validatorClassType = FacesConfigFactory.eINSTANCE.createValidatorClassType();
-		sb = new StringBuffer();
-		sb.append("javax.faces.validator."); //$NON-NLS-1$
-		sb.append(name);
-		sb.append("Validator"); //$NON-NLS-1$
-		validatorClassType.setTextContent(sb.toString());
-		validatorType.setValidatorClass(validatorClassType);
-		return validatorType;
-	}
-
-	/**
-	 * Creates a {@link ComponentType} instance to represent a standard UI
-	 * component.
-	 * 
-	 * @param name Base name of component from which component-type and
-	 * component-class are formed.
-	 * @return {@link ComponentType} instance.
-	 */
-	protected ComponentType createUIComponent(String name) {
-		ComponentType componentType = FacesConfigFactory.eINSTANCE.createComponentType();
-		//set component-type
-		ComponentTypeType componentTypeType = FacesConfigFactory.eINSTANCE.createComponentTypeType();
-		StringBuffer sb = new StringBuffer();
-		sb.append("javax.faces."); //$NON-NLS-1$
-		sb.append(name);
-		componentTypeType.setTextContent(sb.toString());
-		componentType.setComponentType(componentTypeType);
-		//set component-class
-		ComponentClassType componentClassType = FacesConfigFactory.eINSTANCE.createComponentClassType();
-		sb = new StringBuffer();
-		sb.append("javax.faces.component.UI"); //$NON-NLS-1$
-		sb.append(name);
-		componentClassType.setTextContent(sb.toString());
-		componentType.setComponentClass(componentClassType);
-		return componentType;
-	}
-
-	/**
-	 * Creates a {@link ComponentType} instance to represent a concrete HTML
-	 * component.
-	 * 
-	 * @param name Base name of component from which component-type and
-	 * component-class are formed.
-	 * @return {@link ComponentType} instance.
-	 */
-	protected ComponentType createHTMLComponent(String name) {
-		ComponentType componentType = FacesConfigFactory.eINSTANCE.createComponentType();
-		//set component-type
-		ComponentTypeType componentTypeType = FacesConfigFactory.eINSTANCE.createComponentTypeType();
-		StringBuffer sb = new StringBuffer();
-		sb.append("javax.faces."); //$NON-NLS-1$
-		sb.append(name);
-		componentTypeType.setTextContent(sb.toString());
-		componentType.setComponentType(componentTypeType);
-		//set component-class
-		ComponentClassType componentClassType = FacesConfigFactory.eINSTANCE.createComponentClassType();
-		sb = new StringBuffer();
-		sb.append("javax.faces.component.html."); //$NON-NLS-1$
-		sb.append(name);
-		componentClassType.setTextContent(sb.toString());
-		componentType.setComponentClass(componentClassType);
-		return componentType;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see java.lang.Object#equals(java.lang.Object)
-	 */
-	public boolean equals(Object otherObject) {
-		boolean equals = false;
-		if (otherObject instanceof ImplicitRuntimeJSFAppConfigProvider) {
-			equals = true;
-		}
-		return equals;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see java.lang.Object#hashCode()
-	 */
-	public int hashCode() {
-		return ImplicitRuntimeJSFAppConfigProvider.class.getName().hashCode();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		return "ImplicitRuntimeJSFAppConfigProvider[]"; //$NON-NLS-1$
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/JARFileJSFAppConfigProvider.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/JARFileJSFAppConfigProvider.java
deleted file mode 100644
index 9f3bcb2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/JARFileJSFAppConfigProvider.java
+++ /dev/null
@@ -1,253 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.jsfappconfig;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.util.Collections;
-import java.util.jar.JarFile;
-import java.util.zip.ZipEntry;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.core.internal.Messages;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType;
-import org.eclipse.jst.jsf.facesconfig.util.FacesConfigResourceFactory;
-import org.eclipse.osgi.util.NLS;
-
-/**
- * JARFileJSFAppConfigProvider provides the root element of an application
- * configuration model by loading the model from a /META-INF/faces-config.xml
- * entry in a JAR file.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author Ian Trimble - Oracle
- */
-public class JARFileJSFAppConfigProvider extends AbstractJSFAppConfigProvider {
-
-	/**
-	 * Prefix required to turn filename into a JAR URI.
-	 */
-	public static final String JARFILE_URI_PREFIX = "jar:file:///"; //$NON-NLS-1$
-
-	/**
-	 * Suffix required to turn filename into a JAR URI.
-	 */
-	public static final String FACES_CONFIG_IN_JAR_SUFFIX = "!/META-INF/faces-config.xml"; //$NON-NLS-1$
-
-	/**
-	 * Name of a JAR file that contains a /META-INF/faces-config.xml entry.
-	 */
-	protected String filename = null;
-
-	/**
-	 * Cached {@link FacesConfigType} instance.
-	 */
-	protected FacesConfigType facesConfig = null;
-
-	/**
-	 * Flag to track if load error has been logged at least once.
-	 */
-	protected boolean loadErrorLogged = false;
-	
-	/**
-	 * Creates an instance, storing the passed IProject instance and file name
-	 * String to be used for subsequent processing.
-	 * 
-	 * @param filename Name of a JAR file that contains a
-	 * /META-INF/faces-config.xml entry.
-	 */
-	public JARFileJSFAppConfigProvider(String filename) {
-		this.filename = filename;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.core.jsfappconfig.IJSFAppConfigProvider#getFacesConfigModel()
-	 */
-	public FacesConfigType getFacesConfigModel() {
-	    // TODO: should this job be pushed into the model?
-		if (facesConfig == null && filename != null) 
-		{
-			facesConfig = getFacesConfig();
-			
-			if (facesConfig != null)
-			{
-				jsfAppConfigLocater.getJSFAppConfigManager().addFacesConfigChangeAdapter(facesConfig);
-			}
-		}
-		return facesConfig;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.core.jsfappconfig.IJSFAppConfigProvider#releaseFacesConfigModel()
-	 */
-	public void releaseFacesConfigModel() {
-		jsfAppConfigLocater.getJSFAppConfigManager().removeFacesConfigChangeAdapter(facesConfig);
-		facesConfig = null;
-	}
-
-	/**
-	 * Called to log a load error; load error will be logged once only per
-	 * instance, per VM session.
-	 * 
-	 * @param ex Throwable instance to be logged.
-	 */
-	protected void logLoadError(Throwable ex) {
-		if (!loadErrorLogged) {
-			JSFCorePlugin.log(
-					IStatus.ERROR,
-					NLS.bind(Messages.JARFileJSFAppConfigProvider_ErrorLoadingModel, JARFILE_URI_PREFIX + filename + FACES_CONFIG_IN_JAR_SUFFIX),
-					ex);
-			loadErrorLogged = true;
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see java.lang.Object#equals(java.lang.Object)
-	 */
-	public boolean equals(Object otherObject) {
-		boolean equals = false;
-		if (otherObject instanceof JARFileJSFAppConfigProvider) {
-			String otherFilename = ((JARFileJSFAppConfigProvider)otherObject).filename;
-			if (filename != null) {
-				equals = filename.equals(otherFilename);
-			} else {
-				equals = otherFilename == null;
-			}
-		}
-		return equals;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see java.lang.Object#hashCode()
-	 */
-	public int hashCode() {
-		return filename != null ? filename.hashCode() : 0;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		StringBuffer sb = new StringBuffer("JARFileJSFAppConfigProvider["); //$NON-NLS-1$
-		if (filename != null) {
-			sb.append(filename);
-		} else {
-			sb.append("null"); //$NON-NLS-1$
-		}
-		sb.append("]"); //$NON-NLS-1$
-		return sb.toString();
-	}
-
-	private FacesConfigType getFacesConfig()
-	{
-		FacesConfigType	result = null;
-		JarFile 		jarFile = null;
-		File    		tempFile = null;
-		OutputStream	tempFileStream = null;
-
-		try
-		{
-			jarFile = new JarFile(filename, false);
-			ZipEntry entry = jarFile.getEntry("META-INF/faces-config.xml"); //$NON-NLS-1$
-
-			if (entry != null)
-			{
-				InputStream stream = jarFile.getInputStream(entry);
-	
-				tempFile = File.createTempFile("tempfile", ".xml"); //$NON-NLS-1$ //$NON-NLS-2$
-				tempFileStream = new FileOutputStream(tempFile);
-	
-				int read = 0;
-				byte[]  buffer = new byte[4096];
-	
-				while ((read = stream.read(buffer)) != -1)
-				{
-					tempFileStream.write(buffer, 0, read);
-				}
-	
-				tempFileStream.close();
-				tempFileStream = null;
-	
-				FacesConfigResourceFactory factory = FacesConfigResourceFactory.createResourceFactoryForJar();
-				//FacesConfigResourceFactory.register(tempFile.toURI().toString());
-				Resource resource = factory.createResource(URI.createFileURI(tempFile.getAbsolutePath()));
-				
-				try {
-                    if (resource != null) {
-                        resource.load(Collections.EMPTY_MAP);
-						EList resourceContents = resource.getContents();
-						if (resourceContents != null && resourceContents.size() > 0) {
-						    result = (FacesConfigType)resourceContents.get(0);
-						}
-					}
-				} catch(IllegalStateException ise) {
-					//log error
-					logLoadError(ise);
-				} catch(IOException ioe) {
-					//log error
-					logLoadError(ioe);
-				}
-			}
-
-			return result;
-		}
-		catch (IOException ioe)
-		{
-			logLoadError(ioe);
-			return null;
-		}
-		finally
-		{
-			if (jarFile != null)
-			{
-				try
-				{
-					jarFile.close();
-				}
-				catch (IOException ioe)
-				{
-					logLoadError(ioe);
-				}
-			}
-
-			if (tempFileStream != null)
-			{
-				try
-				{
-					tempFileStream.close();
-				}
-				catch(IOException ioe)
-				{
-					logLoadError(ioe);
-				}
-			}
-
-			if (tempFile != null && tempFile.exists())
-			{
-				if (!tempFile.delete())
-				{
-					tempFile.deleteOnExit();
-				}
-			}
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/JSFAppConfigManager.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/JSFAppConfigManager.java
deleted file mode 100644
index 223357b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/JSFAppConfigManager.java
+++ /dev/null
@@ -1,142 +0,0 @@
-package org.eclipse.jst.jsf.core.jsfappconfig;
-
-import java.util.List;
-import java.util.Set;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.QualifiedName;
-import org.eclipse.jst.jsf.common.internal.managedobject.ObjectManager.ManagedObjectException;
-import org.eclipse.jst.jsf.common.internal.resource.ResourceSingletonObjectManager;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.core.jsfappconfig.internal.AbstractJSFAppConfigManager;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType;
-
-/**
- * Default JSF AppConfig Manager
- * <p>
- * Mostly represents a merged representation of the Faces Configuration that the runtime would see
- * <p>
- * @deprecated - Helios
- */
-public class JSFAppConfigManager 
-		extends AbstractJSFAppConfigManager{
-	
-	/**
-	 * UNUSED - here only for compatibility with original 
-	 */
-	public static final QualifiedName KEY_SESSIONPROPERTY =
-		new QualifiedName(JSFCorePlugin.PLUGIN_ID, "JSFAppConfigManager"); //$NON-NLS-1$
-
-	/**
-	 * Constructor
-	 * @param project
-	 * 
-	 */
-	private JSFAppConfigManager(final IProject project) {
-		super(project);	
-	}
-
-	private static JSFAppConfigManagerFactory FACTORY = new JSFAppConfigManagerFactory();
-
-	
-	/**
-	 * @param project
-	 * @return JSFAppConfigManager
-	 * @deprecated 
-	 */
-	public static JSFAppConfigManager getInstance(final IProject project) {
-		try {
-			return FACTORY.getInstance(project);
-		} catch (ManagedObjectException e) {
-			JSFCorePlugin.log(e, "Failed to get JSFAppConfigManager instance for "+project.getName()); //$NON-NLS-1$
-		}
-		return null;
-	}
-	
-	/**
-	 * @return Set of {@link IJSFAppConfigProvider}s
-	 * @deprecated - SHOULD NOT USE
-	 */
-	public Set getJSFAppConfigProviders() {
-		return super.getJSFAppConfigProviders();
-	}
-
-	/**
-	 * Gets all {@link FacesConfigType} instances from all
-	 * {@link IJSFAppConfigProvider} instances.
-	 * 
-	 * @return List of all {@link FacesConfigType} instances.
-	 * @deprecated - SHOULD NOT USE
-	 */
-	public List getFacesConfigModels() {
-		return super.getFacesConfigModels();
-	}
-
-	public List getManagedBeans() {
-		return super.getManagedBeans();
-	}
-
-	public List getValidators() {
-		return super.getValidators();
-	}
-
-	public List getConverters() {
-		return super.getConverters();
-	}
-
-	public List getNavigationRules() {
-		return super.getNavigationRules();
-	}
-
-	public List getNavigationRulesForPage(final IFile pageFile) {
-		return super.getNavigationRulesForPage(pageFile);
-	}
-
-	public List getApplications() {
-		return super.getApplications();
-	}
-
-	public List getFactories() {
-		return super.getFactories();
-	}
-
-	public List getComponents() {
-		return super.getComponents();
-	}
-
-	public List getReferencedBeans() {
-		return super.getReferencedBeans();
-	}
-
-	public List getRenderKits() {
-		return super.getRenderKits();
-	}
-
-	public List getLifecycles() {
-		return super.getLifecycles();
-	}
-
-	public List getResourceBundles() {
-		return super.getResourceBundles();
-	}
-	
-	public List getFacesConfigExtensions() {
-		return super.getFacesConfigExtensions();
-	}
-
-	private static class JSFAppConfigManagerFactory 
-		extends ResourceSingletonObjectManager<JSFAppConfigManager, IProject> {
-
-		protected JSFAppConfigManagerFactory() {
-			super(ResourcesPlugin.getWorkspace());			
-		}
-
-		@Override
-		protected JSFAppConfigManager createNewInstance(final IProject project) {			
-			return new JSFAppConfigManager(project);
-		}
-		
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/JSFAppConfigProvidersChangeEvent.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/JSFAppConfigProvidersChangeEvent.java
deleted file mode 100644
index a946e4c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/JSFAppConfigProvidersChangeEvent.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.jsfappconfig;
-
-/**
- * JSFAppConfigProvidersChangeEvent provides change information to instances of
- * IJSFAppConfigProvidersChangeListener.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author Ian Trimble - Oracle
- */
-public class JSFAppConfigProvidersChangeEvent {
-
-	/**
-	 * Event type; instance of IJSFAppConfigProvider was added (value == 1).
-	 */
-	public static final int ADDED = 1;
-
-	/**
-	 * Event type; instance of IJSFAppConfigProvider was removed (value == 2).
-	 */
-	public static final int REMOVED = 2;
-
-	/**
-	 * Instance of IJSFAppConfigProvider that was added or removed.
-	 */
-	protected IJSFAppConfigProvider configProvider = null;
-
-	/**
-	 * Event type.
-	 */
-	protected int eventType;
-
-	/**
-	 * Constructs an instance.
-	 * 
-	 * @param configProvider Instance of IJSFAppConfigProvider that was added
-	 * or removed
-	 * @param eventType Event type
-	 */
-	public JSFAppConfigProvidersChangeEvent(IJSFAppConfigProvider configProvider, int eventType) {
-		this.configProvider = configProvider;
-		this.eventType = eventType;
-	}
-
-	/**
-	 * Gets the instance of IJSFAppConfigProvider that was added or removed.
-	 * 
-	 * @return Instance of IJSFAppConfigProvider that was added or removed
-	 */
-	public IJSFAppConfigProvider getJSFAppConfigProvider() {
-		return configProvider;
-	}
-
-	/**
-	 * Gets the event type.
-	 * 
-	 * @return Event type
-	 */
-	public int getEventType() {
-		return eventType;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/JSFAppConfigUtils.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/JSFAppConfigUtils.java
deleted file mode 100644
index 38dd45a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/JSFAppConfigUtils.java
+++ /dev/null
@@ -1,367 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.jsfappconfig;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-import java.util.StringTokenizer;
-import java.util.jar.JarEntry;
-import java.util.jar.JarFile;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.jdt.core.IClasspathEntry;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jst.j2ee.common.ParamValue;
-import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
-import org.eclipse.jst.j2ee.model.IModelProvider;
-import org.eclipse.jst.j2ee.model.ModelProviderManager;
-import org.eclipse.jst.j2ee.web.componentcore.util.WebArtifactEdit;
-import org.eclipse.jst.j2ee.webapplication.ContextParam;
-import org.eclipse.jst.j2ee.webapplication.WebApp;
-import org.eclipse.jst.jsf.common.internal.componentcore.AbstractVirtualComponentQuery.DefaultVirtualComponentQuery;
-import org.eclipse.jst.jsf.core.IJSFCoreConstants;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.core.internal.Messages;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.wst.common.componentcore.resources.IVirtualFolder;
-import org.eclipse.wst.common.project.facet.core.IFacetedProject;
-import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
-import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
-
-/**
- * JSFAppConfigUtils provides utility methods useful in processing of a JSF
- * application configuration.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author Ian Trimble - Oracle
- */
-public class JSFAppConfigUtils {
-
-	/**
-	 * Name of JSF CONFIG_FILES context parameter ("javax.faces.CONFIG_FILES").
-	 */
-	public static final String CONFIG_FILES_CONTEXT_PARAM_NAME = "javax.faces.CONFIG_FILES"; //$NON-NLS-1$
-
-	/**
-	 * Location in JAR file of application configuration resource file
-	 * ("META-INF/faces-config.xml"). 
-	 */
-	public static final String FACES_CONFIG_IN_JAR_PATH = "META-INF/faces-config.xml"; //$NON-NLS-1$
-
-    
-    /**
-     * @param project
-     * @param minVersion
-     * @return true if project is a JSF facet project and the version of the project
-     * is at least minVersion.
-     */
-    public static boolean isValidJSFProject(IProject project, String minVersion)
-    {
-        boolean isValid = false;
-        
-        final IProjectFacetVersion projectFacetVersion = getProjectFacet(project);
-        
-        if (projectFacetVersion != null)
-        {
-            try
-            {
-                final String versionString = 
-                    projectFacetVersion.getVersionString();
-                final Comparator comparator = 
-                    projectFacetVersion.getProjectFacet().getVersionComparator();
-                final int compareToMin = 
-                    comparator.compare(versionString, minVersion);
-                
-                if (compareToMin >=0)
-                {
-                    return true;
-                }
-            }
-            catch (CoreException ce)
-            {
-                JSFCorePlugin.log(ce, "Error checking facet version"); //$NON-NLS-1$
-            }
-        }
-        return isValid;
-    }
-    
-	/**
-	 * Tests if the passed IProject instance is a valid JSF project in the
-	 * following ways:
-	 * <ul>
-	 * <li>project is not null and is accessible, </li>
-	 * <li>project has the JSF facet set on it.</li>
-	 * </ul>
-	 * 
-	 * @param project IProject instance to be tested.
-	 * @return true if the IProject instance is a valid JSF project, else
-	 * false.
-	 */
-	public static boolean isValidJSFProject(IProject project) {
-		boolean isValid = false;
-        IProjectFacetVersion projectFacet = getProjectFacet(project);
-        if (projectFacet != null)
-        {
-            isValid = true;
-        }
-		return isValid;
-	}
-    /**
-     * Get the facet version for the project 
-     * @param project
-     * @return the project facet version or null if could not be found or if
-     * project is not accessible
-     */
-    public static IProjectFacetVersion getProjectFacet(IProject project)
-    {
-        //check for null or inaccessible project
-        if (project != null && project.isAccessible()) {
-            //check for JSF facet on project
-            try {
-                IFacetedProject facetedProject = ProjectFacetsManager.create(project);
-                if (facetedProject != null) {
-                    Set projectFacets = facetedProject.getProjectFacets();
-                    Iterator itProjectFacets = projectFacets.iterator();
-                    while (itProjectFacets.hasNext()) {
-                        IProjectFacetVersion projectFacetVersion = (IProjectFacetVersion)itProjectFacets.next();
-                        if (IJSFCoreConstants.JSF_CORE_FACET_ID.equals(projectFacetVersion.getProjectFacet().getId()))
-                        {
-                            return projectFacetVersion;
-                        }
-                    }
-                }
-            } catch(CoreException ce) {
-                //log error
-                JSFCorePlugin.log(IStatus.ERROR, ce.getLocalizedMessage(), ce);
-            }
-        }
-        return null;
-    }
-    
-	/**
-	 * Gets an IVirtualFolder instance which represents the root context's
-	 * web content folder.
-	 * 
-	 * @param project IProject instance for which to get the folder.
-	 * @return IVirtualFolder instance which represents the root context's
-	 * web content folder.
-	 * @deprecated Call DefaultVirtualComponentQuery.getWebContentFolder instead
-	 */
-	public static IVirtualFolder getWebContentFolder(IProject project) {
-		return new DefaultVirtualComponentQuery().getWebContentFolder(project);
-	}
-
-	/**
-	 * Gets an IPath instance representing the path of the passed IFile
-	 * instance relative to the web content folder.
-	 * 
-	 * @param file IFile instance for which a path is required.
-	 * @return IPath instance representing the path relative to the web content
-	 * folder.
-	 */
-	public static IPath getWebContentFolderRelativePath(IFile file) {
-		IPath path = null;
-		if (file != null) {
-			IVirtualFolder webContentFolder = getWebContentFolder(file.getProject());
-			if (webContentFolder != null) {
-				IPath webContentPath = webContentFolder.getProjectRelativePath();
-				IPath filePath = file.getProjectRelativePath();
-				int matchingFirstSegments = webContentPath.matchingFirstSegments(filePath);
-				path = filePath.removeFirstSegments(matchingFirstSegments);
-			}
-		}
-		return path;
-	}
-
-	/**
-	 * Gets list of application configuration file names as listed in the JSF
-	 * CONFIG_FILES context parameter ("javax.faces.CONFIG_FILES"). Will return
-	 * an empty list if WebArtifactEdit is null, if WebApp is null, if context
-	 * parameter does not exist, or if trimmed context parameter's value is
-	 * an empty String.
-	 * 
-	 * @param project IProject instance for which to get the context
-	 * parameter's value.
-	 * @return List of application configuration file names as listed in the
-	 * JSF CONFIG_FILES context parameter ("javax.faces.CONFIG_FILES"); list
-	 * may be empty.
-	 */
-	public static List getConfigFilesFromContextParam(IProject project) {
-		List filesList = Collections.EMPTY_LIST;
-		if (isValidJSFProject(project)) {
-			IModelProvider provider = ModelProviderManager.getModelProvider(project);
-			Object webAppObj = provider.getModelObject();
-			if (webAppObj != null){
-				if (webAppObj instanceof WebApp)
-					filesList = getConfigFilesForJ2EEApp(project);
-				else if (webAppObj instanceof org.eclipse.jst.javaee.web.WebApp)
-					filesList = getConfigFilesForJEEApp((org.eclipse.jst.javaee.web.WebApp)webAppObj);
-			}
-			
-		}
-		return filesList;
-	}
-
-	private static List getConfigFilesForJEEApp(org.eclipse.jst.javaee.web.WebApp webApp) {
-		String filesString = null;
-		List contextParams = webApp.getContextParams();
-		Iterator itContextParams = contextParams.iterator();
-		while (itContextParams.hasNext()) {
-			org.eclipse.jst.javaee.core.ParamValue paramValue = (org.eclipse.jst.javaee.core.ParamValue)itContextParams.next();
-			if (paramValue.getParamName().equals(CONFIG_FILES_CONTEXT_PARAM_NAME)) {
-				filesString = paramValue.getParamValue();
-				break;
-			}
-		}		
-		return parseFilesString(filesString);	
-	}
-
-	private static List getConfigFilesForJ2EEApp(IProject project){
-		List filesList = new ArrayList();
-		WebArtifactEdit webArtifactEdit = WebArtifactEdit.getWebArtifactEditForRead(project);
-		if (webArtifactEdit != null) {
-			try {
-				WebApp webApp = null;
-				try {
-					webApp = webArtifactEdit.getWebApp();
-				} catch(ClassCastException cce) {
-					//occasionally thrown from WTP code in RC3 and possibly later
-					JSFCorePlugin.log(IStatus.ERROR, cce.getLocalizedMessage(), cce);
-					return filesList;
-				}
-				if (webApp != null) {
-					String filesString = null;
-					//need to branch here due to model version differences (BugZilla #119442)
-					if (webApp.getVersionID() == J2EEVersionConstants.WEB_2_3_ID) {
-						EList contexts = webApp.getContexts();
-						Iterator itContexts = contexts.iterator();
-						while (itContexts.hasNext()) {
-							ContextParam contextParam = (ContextParam)itContexts.next();
-							if (contextParam.getParamName().equals(CONFIG_FILES_CONTEXT_PARAM_NAME)) {
-								filesString = contextParam.getParamValue();
-								break;
-							}
-						}
-					} else {
-						EList contextParams = webApp.getContextParams();
-						Iterator itContextParams = contextParams.iterator();
-						while (itContextParams.hasNext()) {
-							ParamValue paramValue = (ParamValue)itContextParams.next();
-							if (paramValue.getName().equals(CONFIG_FILES_CONTEXT_PARAM_NAME)) {
-								filesString = paramValue.getValue();
-								break;
-							}
-						}
-					}					
-					filesList = parseFilesString(filesString);				
-				}
-			} finally {
-				webArtifactEdit.dispose();
-			}
-		}
-
-		return filesList;
-	}
-	
-	private static List parseFilesString(String filesString) {
-		List filesList = new ArrayList();
-		if (filesString != null && filesString.trim().length() > 0) {			
-			StringTokenizer stFilesString = new StringTokenizer(filesString, ","); //$NON-NLS-1$
-			while (stFilesString.hasMoreTokens()) {
-				String configFile = stFilesString.nextToken().trim();
-				filesList.add(configFile);
-			}
-		}
-		return filesList;
-	}
-
-	/**
-	 * Gets list of JAR file names, where each file name represents a JAR on
-	 * the classpath that contains a /META-INF/faces-config.xml entry. Will
-	 * return an empty list if no such JAR files are located.
-	 * 
-	 * @param project IProject instance for which to scan the classpath.
-	 * @return List of JAR file names, where each file name represents a JAR
-	 * on the classpath that contains a ...META-INF/faces-config.xml entry;
-	 * list may be empty.
-	 * @throws CoreException Thrown when underlying calls into JavaCore fail.
-	 * @throws IOException Thrown when attempt to open JAR to determine if it
-	 * contains a /META-INF/faces-config.xml entry fails.
-	 */
-	public static List getConfigFileJARsFromClasspath(IProject project) throws CoreException, IOException {
-		ArrayList JARsList = new ArrayList();
-		if (project.isAccessible()
-		        && project.hasNature(JavaCore.NATURE_ID)) {
-			IJavaProject javaProject = JavaCore.create(project);
-			if (javaProject != null) {
-				IClasspathEntry[] classpathEntries = javaProject.getResolvedClasspath(true);
-				if (classpathEntries != null && classpathEntries.length > 0) {
-					IWorkspaceRoot workspaceRoot = ResourcesPlugin.getWorkspace().getRoot();
-					for (int i = 0; i < classpathEntries.length; i++) {
-						IClasspathEntry classpathEntry = classpathEntries[i];
-						if (classpathEntry.getEntryKind() == IClasspathEntry.CPE_LIBRARY) {
-							IPath libraryPath = classpathEntry.getPath();
-							if (libraryPath.getFileExtension() != null && libraryPath.getFileExtension().length() > 0) {
-								if (libraryPath.getDevice() == null && workspaceRoot.getProject(libraryPath.segment(0)).exists()) {
-									libraryPath = workspaceRoot.getFile(libraryPath).getLocation();
-								}
-								String libraryPathString = libraryPath.toString();
-								JarFile jarFile = null;
-								try {
-									//check existence first [222249]
-									File file = new File(libraryPathString);
-									if (file.exists()) {
-										jarFile = new JarFile(file, false);
-										if (jarFile != null) {
-											JarEntry jarEntry = jarFile.getJarEntry(FACES_CONFIG_IN_JAR_PATH);
-											if (jarEntry != null) {
-												JARsList.add(libraryPathString);
-											}
-										}
-									}
-								} catch (FileNotFoundException fnfex) {
-									//should not get here, but eat error since this could only occur in under strange circumstances [222249]
-								} catch(IOException ioe) {
-									JSFCorePlugin.log(
-											IStatus.ERROR,
-											NLS.bind(Messages.JSFAppConfigUtils_ErrorOpeningJarFile, libraryPathString),
-											ioe);
-								} finally {
-									if (jarFile != null) {
-										jarFile.close();
-									}
-								}
-							}
-						}
-					}
-				}
-			}
-		}
-		return JARsList;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/RuntimeClasspathJSFAppConfigLocater.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/RuntimeClasspathJSFAppConfigLocater.java
deleted file mode 100644
index c8a6ce3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/RuntimeClasspathJSFAppConfigLocater.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.jsfappconfig;
-
-import java.io.IOException;
-import java.util.Iterator;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Set;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jdt.core.ElementChangedEvent;
-import org.eclipse.jdt.core.IElementChangedListener;
-import org.eclipse.jdt.core.IJavaElementDelta;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-
-/**
- * RuntimeClasspathJSFAppConfigLocater attempts to locate application
- * configuration files in JAR files on the runtime classpath. The runtime
- * classpath includes the server runtime classpath and the JAR files that will
- * be deployed to the web application's /WEB-INF/lib folder.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author Ian Trimble - Oracle
- */
-public class RuntimeClasspathJSFAppConfigLocater extends AbstractJSFAppConfigLocater
-	implements IElementChangedListener {
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.core.jsfappconfig.AbstractJSFAppConfigLocater#startLocating()
-	 */
-	public void startLocating() {
-		locateProviders();
-		JavaCore.addElementChangedListener(this);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.core.jsfappconfig.AbstractJSFAppConfigLocater#stopLocating()
-	 */
-	public void stopLocating() {
-		JavaCore.removeElementChangedListener(this);
-	}
-
-	/**
-	 * Locates application configuration resources specified in JAR files on
-	 * the runtime classpath, and updates the set of
-	 * {@link IJSFAppConfigProvider} instances accordingly.
-	 */
-	public void locateProviders() {
-		try {
-			List JARs = JSFAppConfigUtils.getConfigFileJARsFromClasspath(getJSFAppConfigManager().getProject());
-			Iterator itJARs = JARs.iterator();
-			Set newConfigProviders = new LinkedHashSet();
-			while (itJARs.hasNext()) {
-				String JARFilename = (String)itJARs.next();
-				JARFileJSFAppConfigProvider configProvider = new JARFileJSFAppConfigProvider(JARFilename);
-				newConfigProviders.add(configProvider);
-			}
-			updateConfigProviders(newConfigProviders);
-		} catch(CoreException ce) {
-			//log error
-			JSFCorePlugin.log(IStatus.ERROR, ce.getLocalizedMessage(), ce);
-		} catch(IOException ioe) {
-			//log error
-			JSFCorePlugin.log(IStatus.ERROR, ioe.getLocalizedMessage(), ioe);
-		}
-	}
-
-	/**
-	 * Called when a Java element has changed.
-	 * 
-	 * @param event ElementChangedEvent instance describing the change.
-	 */
-	public void elementChanged(ElementChangedEvent event) {
-		if (classpathChanged(event.getDelta())) {
-			locateProviders();
-		}
-	}
-
-	/**
-	 * Recursively tests if the passed IJavaElementDelta instance or any of its
-	 * descendents indicate a classpath change has occurred.
-	 * 
-	 * @param delta IJavaElement instance to be tested.
-	 * @return true if a claspath change has occurred, else false.
-	 */
-	protected boolean classpathChanged(IJavaElementDelta delta) {
-		int deltaFlags = delta.getFlags();
-		if (((deltaFlags & IJavaElementDelta.F_ADDED_TO_CLASSPATH) == IJavaElementDelta.F_ADDED_TO_CLASSPATH) ||
-				((deltaFlags & IJavaElementDelta.F_ARCHIVE_CONTENT_CHANGED) == IJavaElementDelta.F_ARCHIVE_CONTENT_CHANGED) ||
-				((deltaFlags & IJavaElementDelta.F_REMOVED_FROM_CLASSPATH) == IJavaElementDelta.F_REMOVED_FROM_CLASSPATH)) {
-			return true;
-		}  
-		boolean changed = false;
-		IJavaElementDelta[] childDeltas = delta.getAffectedChildren();
-		if (childDeltas != null) {
-			for (int i = 0; i < childDeltas.length; i++) {
-				if (classpathChanged(childDeltas[i])) {
-					changed = true;
-					break;
-				}
-			}
-		}
-		return changed;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/WebContentRelativeJSFAppConfigLocater.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/WebContentRelativeJSFAppConfigLocater.java
deleted file mode 100644
index 4b848a6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/WebContentRelativeJSFAppConfigLocater.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.jsfappconfig;
-
-import java.util.Iterator;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Set;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jst.jsf.common.internal.componentcore.AbstractVirtualComponentQuery.DefaultVirtualComponentQuery;
-import org.eclipse.wst.common.componentcore.resources.IVirtualFolder;
-import org.eclipse.wst.common.componentcore.resources.IVirtualResource;
-
-/**
- * WebContentRelativeJSFAppConfigLocater is an abstract base class that
- * attempts to locate specified application configuration files relative to a
- * web content folder. Subclasses must override the getFilenames() method to
- * return a list of filenames that the locateProviders() method will attempt to
- * locate, and call locateProviders().
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author Ian Trimble - Oracle
- */
-public abstract class WebContentRelativeJSFAppConfigLocater extends AbstractJSFAppConfigLocater {
-
-	/**
-	 * Locates application configuration resources specified by the filenames
-	 * (relative to the web content folder) returned by getFilenames(), and
-	 * updates the set of {@link IJSFAppConfigProvider} instances accordingly.
-	 */
-	public void locateProviders() {
-		IProject project = getJSFAppConfigManager().getProject();
-		IVirtualFolder webContentFolder = new DefaultVirtualComponentQuery().getWebContentFolder(project);
-		if (webContentFolder != null) {
-			List filenames = getFilenames();
-			Iterator itFilenames = filenames.iterator();
-			Set newConfigProviders = new LinkedHashSet();
-			while (itFilenames.hasNext()) {
-				String filename = (String)itFilenames.next();
-				IVirtualResource appConfigResource = webContentFolder.findMember(filename);
-				if (appConfigResource != null && appConfigResource.getType() == IVirtualResource.FILE) {
-					IFile file = (IFile)appConfigResource.getUnderlyingResource();
-					if (file != null && file.exists()) {
-						ArtifactEditJSFAppConfigProvider configProvider = new ArtifactEditJSFAppConfigProvider(file);
-						newConfigProviders.add(configProvider);
-					}
-				}
-			}
-			updateConfigProviders(newConfigProviders);
-		}
-	}
-
-	/**
-	 * Gets a list of Strings representing the filenames (relative to the web
-	 * content folder) that locateProviders() will attempt to locate.
-	 * 
-	 * @return A list of Strings representing the filenames (relative to the
-	 * web content folder) that locateProviders() will attempt to locate.
-	 */
-	protected abstract List getFilenames();
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/internal/AbstractJSFAppConfigManager.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/internal/AbstractJSFAppConfigManager.java
deleted file mode 100644
index 26ac525..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/internal/AbstractJSFAppConfigManager.java
+++ /dev/null
@@ -1,505 +0,0 @@
-package org.eclipse.jst.jsf.core.jsfappconfig.internal;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.util.EContentAdapter;
-import org.eclipse.jst.jsf.common.internal.managedobject.AbstractManagedObject;
-import org.eclipse.jst.jsf.core.jsfappconfig.IFacesConfigChangeListener;
-import org.eclipse.jst.jsf.core.jsfappconfig.IJSFAppConfigLocater;
-import org.eclipse.jst.jsf.core.jsfappconfig.IJSFAppConfigProvider;
-import org.eclipse.jst.jsf.core.jsfappconfig.IJSFAppConfigProvidersChangeListener;
-import org.eclipse.jst.jsf.core.jsfappconfig.JSFAppConfigProvidersChangeEvent;
-import org.eclipse.jst.jsf.core.jsfappconfig.JSFAppConfigUtils;
-import org.eclipse.jst.jsf.facesconfig.emf.ApplicationType;
-import org.eclipse.jst.jsf.facesconfig.emf.BehaviorType;
-import org.eclipse.jst.jsf.facesconfig.emf.ComponentType;
-import org.eclipse.jst.jsf.facesconfig.emf.ConverterType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigExtensionType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType;
-import org.eclipse.jst.jsf.facesconfig.emf.FactoryType;
-import org.eclipse.jst.jsf.facesconfig.emf.FromViewIdType;
-import org.eclipse.jst.jsf.facesconfig.emf.LifecycleType;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType;
-import org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType;
-import org.eclipse.jst.jsf.facesconfig.emf.PropertyResolverType;
-import org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanType;
-import org.eclipse.jst.jsf.facesconfig.emf.RenderKitType;
-import org.eclipse.jst.jsf.facesconfig.emf.ResourceBundleType;
-import org.eclipse.jst.jsf.facesconfig.emf.ValidatorType;
-import org.eclipse.jst.jsf.facesconfig.emf.VariableResolverType;
-
-/**
- * Abstract JSFAppConfigManager that implementers of {@link IJSFAppConfigManager} MUST
- * extend.
- * <p>
- * JSFAppConfigManager provides an entry point to an entire JSF application
- * configuration, which is defined in one or more application configuration
- * resource files.
- */
-public abstract class AbstractJSFAppConfigManager 
-	extends 	AbstractManagedObject 
-	implements 	IJSFAppConfigManager { 
-
-	/**
-	 * The IProject
-	 * @deprecated - use getProject()
-	 */
-	protected IProject _project;
-
-	/**
-	 * Collection of {@link IJSFAppConfigLocater} instances.
-	 */
-	protected List<IJSFAppConfigLocater> configLocaters;
-	
-	/**
-	 * Collection of {@link IJSFAppConfigProvidersChangeListener} instances.
-	 */
-	protected List<IJSFAppConfigProvidersChangeListener> configProvidersChangeListeners;
-
-	/**
-	 * Map of application configuration model EMF classes to
-	 * {@link IFacesConfigChangeListener} instances.
-	 */
-	protected Map<Class, IFacesConfigChangeListener> facesConfigChangeListeners;
-
-	/**
-	 * Single {@link FacesConfigChangeAdapter} instance.
-	 */
-	protected FacesConfigChangeAdapter facesConfigChangeAdapter;
-
-	/**
-	 * Constructor
-	 * @param project
-	 */
-	public AbstractJSFAppConfigManager(final IProject project) {
-		_project = project;
-		initialize();
-	}
-	
-	public IProject getProject() {
-		return _project;
-	}
-
-	/**
-	 * Initializes instance by:
-	 * <ul>
-	 *  <li>creating facesConfigChangeListeners collection, </li>
-	 * 	<li>creating configProvidersChangeListeners collection, </li>
-	 * 	<li>creating and populating configLocaters collection, </li>
-	 * 	<li>invoking the startLocating() method on all configLocaters, </li>
-	 * </ul>
-	 */
-	protected void initialize() {
-		//create collections
-		facesConfigChangeListeners = new HashMap<Class, IFacesConfigChangeListener>();
-		configProvidersChangeListeners = new ArrayList<IJSFAppConfigProvidersChangeListener>();
-		configLocaters = new ArrayList<IJSFAppConfigLocater>();
-		//populate initial set of locaters
-		populateConfigLocaters();
-		//instruct locaters to start locating
-		startConfigLocaters();
-	}
-	
-	/**
-	 * Populates configLocaters using @link IJSFAppConfigLocater} implementations
-	 * from CompositeLocatorProviderStrategy
-	 */
-	protected void populateConfigLocaters() {		
-		final CompositeJSFAppConfigLocatorProviderStrategy clps = new CompositeJSFAppConfigLocatorProviderStrategy(this.getProject());
-		for (final IJSFAppConfigLocater locator : clps.getLocators()) {
-			locator.setJSFAppConfigManager(this);
-			configLocaters.add(locator);
-		}		
-	}
-
-	/**
-	 * Instructs set of {@link IJSFAppConfigLocater} instances to start
-	 * locating JSF application configuration resources.
-	 */
-	protected void startConfigLocaters() {
-		for (final IJSFAppConfigLocater configLocater : configLocaters) {
-			configLocater.startLocating();
-		}
-	}
-	
-	/**
-	 * Instructs set of {@link IJSFAppConfigLocater} instances to stop
-	 * locating JSF application configuration resources.
-	 */
-	protected void stopConfigLocaters() {		
-		for (final IJSFAppConfigLocater configLocater : configLocaters) {
-			configLocater.stopLocating();
-			configLocater.dispose();
-		}
-	}
-
-	/**
-	 * Called to respond to a change in the IProject instance to which this
-	 * instance belongs. Changes the cached IProject instance, stops all config
-	 * locaters, starts all config locaters.
-	 * 
-	 * @param newProject New IProject instance to which this manager belongs.
-	 * @deprecated - SHOULD NOT USE
-	 */
-	protected void changeProject(final IProject newProject) {
-		_project = newProject;
-		stopConfigLocaters();
-		startConfigLocaters();
-	}
-
-	public boolean addJSFAppConfigProvidersChangeListener(final IJSFAppConfigProvidersChangeListener listener) {
-		return configProvidersChangeListeners.add(listener);
-	}
-
-	public boolean removeJSFAppConfigProvidersChangeListener(final IJSFAppConfigProvidersChangeListener listener) {
-		return configProvidersChangeListeners.remove(listener);
-	}
-
-	public void notifyJSFAppConfigProvidersChangeListeners(final IJSFAppConfigProvider configProvider, final int eventType) {
-		final JSFAppConfigProvidersChangeEvent event = new JSFAppConfigProvidersChangeEvent(configProvider, eventType);
-		for (final IJSFAppConfigProvidersChangeListener listener : configProvidersChangeListeners) {
-			listener.changedJSFAppConfigProviders(event);
-		}
-	}
-
-	public Object addFacesConfigChangeListener(Class emfClass, IFacesConfigChangeListener listener) {
-		/* 
-		 * Get all models, which will ensure that each one has had a
-		 * FacesConfigChangeAdapter added to it (if the model is updateable).
-		 */
-		getFacesConfigModels();
-		return facesConfigChangeListeners.put(emfClass, listener);
-	}
-
-	public Object removeFacesConfigChangeListener(Class emfClass) {
-		return facesConfigChangeListeners.remove(emfClass);
-	}
-
-	public void notifyFacesConfigChangeListeners(final Notification notification) {
-		final Object emfFeature = notification.getFeature();
-		if (emfFeature instanceof EStructuralFeature) {
-			final Class emfClass = ((EStructuralFeature)emfFeature).getEType().getInstanceClass();
-			final IFacesConfigChangeListener listener = facesConfigChangeListeners.get(emfClass);
-			if (listener != null) {
-				listener.notifyChanged(notification);
-			}
-		}
-	}
-
-	/**
-	 * @return Set of {@link IJSFAppConfigProvider}s
-	 */
-	protected Set<IJSFAppConfigProvider> getJSFAppConfigProviders() {
-		final Set<IJSFAppConfigProvider> allConfigProviders = new LinkedHashSet<IJSFAppConfigProvider>();
-		final Iterator itConfigLocaters = configLocaters.iterator();
-		while (itConfigLocaters.hasNext()) {
-			final IJSFAppConfigLocater configLocater = (IJSFAppConfigLocater)itConfigLocaters.next();
-			allConfigProviders.addAll(configLocater.getJSFAppConfigProviders());
-		}
-		return allConfigProviders;
-	}
-
-	/**
-	 * Gets all {@link FacesConfigType} instances from all
-	 * {@link IJSFAppConfigProvider} instances.
-	 * 
-	 * @return List of all {@link FacesConfigType} instances.
-	 */
-	protected List<FacesConfigType> getFacesConfigModels() {
-		final List<FacesConfigType> facesConfigModels = new ArrayList<FacesConfigType>();		
-		for(final IJSFAppConfigProvider configProvider : getJSFAppConfigProviders()) {			
-			final FacesConfigType facesConfig = configProvider.getFacesConfigModel();
-			if (facesConfig != null) {
-				facesConfigModels.add(facesConfig);
-			}
-		}
-		return facesConfigModels;
-	}
-
-//-----------------------  IManagedObject lifecycle methods ----------------------------//
-    /**
-     * Disposes of resources by:
-     * <ul>
-     *  <li>removing a resource change listener to the workspace</li>
-     *  <li>removing instance as a session property of the IProject instance</li>
-     *  <li>invoking the stopLocating() method on all configLocaters</li>
-     *  <li>clearing the configLocaters collection</li>
-     *  <li>clearing the configProvidersChangeListeners collection</li>
-     *  <li>clearing the facesConfigChangeListeners collection</li>
-     * </ul>
-     */
-    public void dispose() {
-        //instruct locaters to stop locating
-        stopConfigLocaters();
-        //clear collections
-        configLocaters.clear();
-        configProvidersChangeListeners.clear();
-        facesConfigChangeListeners.clear();
-    }
-    
-	public void destroy() {
-		// 		
-	}
-
-	public void checkpoint() {
-		//		
-	}
-//-------------------------------------------------------------------------------------------------//	
-
-	public List<ManagedBeanType> getManagedBeans() {
-		final List<ManagedBeanType> allManagedBeans = new ArrayList<ManagedBeanType>();
-		for (final FacesConfigType facesConfig : getFacesConfigModels()) {		
-			final EList managedBeans = facesConfig.getManagedBean();
-			allManagedBeans.addAll(managedBeans);
-		}
-		return allManagedBeans;
-    }
-
-    public final List<String> getPropertyResolvers()
-    {
-        final List<String> allPropertyResolvers = new ArrayList<String>();
-        final List<ApplicationType> applications = getApplications();
-        for (final ApplicationType  application : applications) 
-        {
-            for (final Iterator it = application.getPropertyResolver().iterator(); it.hasNext();)
-            {
-                final PropertyResolverType propRes = (PropertyResolverType) it.next();
-                String propClass = propRes.getTextContent();
-                if (propClass != null)
-                {
-                    propClass = propClass.trim();
-                    if (!"".equals(propClass)) //$NON-NLS-1$
-                    {
-                        allPropertyResolvers.add(propClass);
-                    }
-                }
-            }
-        }
-        return allPropertyResolvers;
-	}
-
-	public List<ValidatorType> getValidators() {
-		final List<ValidatorType> allValidators = new ArrayList<ValidatorType>();
-		for (final FacesConfigType facesConfig : getFacesConfigModels()) {	
-			final EList validators = facesConfig.getValidator();
-			allValidators.addAll(validators);
-		}
-		return allValidators;
-	}
-
-	public final List<String> getVariableResolvers()
-    {
-        final List<String> allVariableResolvers = new ArrayList<String>();
-        final List<ApplicationType> applications = getApplications();      
-        for ( final ApplicationType  application : applications)
-        {           
-            for (final Iterator it = application.getVariableResolver().iterator(); it.hasNext();)
-            {
-                final VariableResolverType varRes = (VariableResolverType) it.next();
-                String varClass = varRes.getTextContent();
-                if (varClass != null)
-                {
-                    varClass = varClass.trim();
-                    if (!"".equals(varClass)) //$NON-NLS-1$
-                    {
-                        allVariableResolvers.add(varClass);
-                    }
-                }
-            }
-        }
-        return allVariableResolvers;
-    }
-
-	public List<ConverterType> getConverters() {
-		final List<ConverterType> allConverters = new ArrayList<ConverterType>();
-		for (final FacesConfigType facesConfig : getFacesConfigModels()) {
-			final EList converters = facesConfig.getConverter();
-			allConverters.addAll(converters);
-		}
-		return allConverters;
-	}
-
-	public List<NavigationRuleType> getNavigationRules() {
-		final List<NavigationRuleType> allNavigationRules = new ArrayList<NavigationRuleType>();
-		for (final FacesConfigType facesConfig : getFacesConfigModels()) {
-			final EList navigationRules = facesConfig.getNavigationRule();
-			allNavigationRules.addAll(navigationRules);
-		}
-		return allNavigationRules;
-	}
-
-	public List<NavigationRuleType> getNavigationRulesForPage(final IFile pageFile) {
-		final List<NavigationRuleType> navigationRulesForPage = new ArrayList<NavigationRuleType>();
-		final IPath pageFilePath = JSFAppConfigUtils.getWebContentFolderRelativePath(pageFile);
-		if (pageFilePath != null) {
-			String pageFileString = pageFilePath.toString();
-			if (!pageFileString.startsWith("/")) { //$NON-NLS-1$
-				pageFileString = "/" + pageFileString; //$NON-NLS-1$
-			}
-			final List<NavigationRuleType> navigationRules = getNavigationRules();
-			for (final NavigationRuleType navigationRule : navigationRules) {				
-				FromViewIdType fromViewIdType = navigationRule.getFromViewId();
-				if (fromViewIdType != null) {
-					final String fromViewId = fromViewIdType.getTextContent();
-					if (fromViewId != null && fromViewId.length() > 0) {
-						if (!fromViewId.equals("*")) { //$NON-NLS-1$
-							if (fromViewId.equals(pageFileString)) {
-								//exact match
-								navigationRulesForPage.add(navigationRule);
-							} else if (fromViewId.endsWith("*")) { //$NON-NLS-1$
-								final String prefixFromViewId = fromViewId.substring(0, fromViewId.length() - 1);
-								if (pageFileString.startsWith(prefixFromViewId)) {
-									//prefix match
-									navigationRulesForPage.add(navigationRule);
-								}
-							}
-						} else {
-							//from-view-id == "*" - matches all pages
-							navigationRulesForPage.add(navigationRule);
-						}
-					}
-				} else {
-					//no from-view-id element - matches all pages
-					navigationRulesForPage.add(navigationRule);
-				}
-			}
-		}
-		return navigationRulesForPage;
-	}
-
-	public List<ApplicationType> getApplications() {
-		final List<ApplicationType> allApplications = new ArrayList<ApplicationType>();
-		for (final FacesConfigType facesConfig : getFacesConfigModels()) {
-			final EList applications = facesConfig.getApplication();
-			allApplications.addAll(applications);
-		}
-		return allApplications;
-	}
-
-	public List<FactoryType> getFactories() {
-		final List<FactoryType> allFactories = new ArrayList<FactoryType>();
-		for (final FacesConfigType facesConfig : getFacesConfigModels()) {
-			final EList factories = facesConfig.getFactory();
-			allFactories.addAll(factories);
-		}
-		return allFactories;
-	}
-
-	public List<ComponentType> getComponents() {
-		final List<ComponentType> allComponents = new ArrayList<ComponentType>();
-		for (final FacesConfigType facesConfig : getFacesConfigModels()) {
-			final EList components = facesConfig.getComponent();
-			allComponents.addAll(components);
-		}
-		return allComponents;
-	}
-
-	public List<ReferencedBeanType> getReferencedBeans() {
-		final List<ReferencedBeanType> allReferencedBeans = new ArrayList<ReferencedBeanType>();
-		for (final FacesConfigType facesConfig : getFacesConfigModels()) {	
-			final EList referencedBeans = facesConfig.getReferencedBean();
-			allReferencedBeans.addAll(referencedBeans);
-		}
-		return allReferencedBeans;
-	}
-
-	public List<RenderKitType> getRenderKits() {
-		final List<RenderKitType>  allRenderKits = new ArrayList<RenderKitType> ();
-		for (final FacesConfigType facesConfig : getFacesConfigModels()) {
-			final EList renderKits = facesConfig.getRenderKit();
-			allRenderKits.addAll(renderKits);
-		}
-		return allRenderKits;
-	}
-
-	public List<LifecycleType> getLifecycles() {
-		final List<LifecycleType> allLifecycles = new ArrayList<LifecycleType>();
-		for (final FacesConfigType facesConfig : getFacesConfigModels()) {
-			final EList lifecycles = facesConfig.getLifecycle();
-			allLifecycles.addAll(lifecycles);
-		}
-		return allLifecycles;
-	}
-
-    public List<ResourceBundleType> getResourceBundles()
-    {
-        final List<ResourceBundleType> allResourceBundles = new ArrayList<ResourceBundleType>();
-        for (final FacesConfigType facesConfig : getFacesConfigModels()) {
-            for (final Iterator applicationIt = facesConfig.getApplication().iterator(); applicationIt.hasNext();)
-            {
-                final ApplicationType appType = (ApplicationType) applicationIt.next();
-                allResourceBundles.addAll(appType.getResourceBundle());
-            }
-        }
-        return allResourceBundles;
-    }
-    
-    public List<BehaviorType> getBehaviors()
-    {
-		final List<BehaviorType> allBehaviors = new ArrayList<BehaviorType>();
-		for (final FacesConfigType facesConfig : getFacesConfigModels()) {
-			final EList behaviors = facesConfig.getBehavior();
-			allBehaviors.addAll(behaviors);
-		}
-		return allBehaviors;
-    }
-    
-    public List<FacesConfigExtensionType> getFacesConfigExtensions()
-    {
-		final List<FacesConfigExtensionType> allFCExts = new ArrayList<FacesConfigExtensionType>();
-		for (final FacesConfigType facesConfig : getFacesConfigModels()) {	
-			final EList fcExts = facesConfig.getFacesConfigExtension();
-			allFCExts.addAll(fcExts);
-		}
-		return allFCExts;
-    }
-
-	public void addFacesConfigChangeAdapter(final FacesConfigType facesConfig) {
-		if (facesConfig != null) {
-			if (facesConfigChangeAdapter == null) {
-				facesConfigChangeAdapter = new FacesConfigChangeAdapter();
-			}
-			facesConfig.eAdapters().add(facesConfigChangeAdapter);
-		}
-	}
-
-	public void removeFacesConfigChangeAdapter(final FacesConfigType facesConfig) {
-		if (facesConfig != null && facesConfigChangeAdapter != null) {
-			facesConfig.eAdapters().remove(facesConfigChangeAdapter);
-		}
-	}
-
-	/**
-	 * FacesConfigChangeAdapter is an EMF adapter which provides a mechanism
-	 * for notification of changes to features in any application configuration
-	 * model for which {@link IFacesConfigChangeListener} instances have
-	 * registered an interest.
-	 * 
-	 * @author Ian Trimble - Oracle
-	 */
-	class FacesConfigChangeAdapter extends EContentAdapter {
-		/*
-		 * (non-Javadoc)
-		 * @see org.eclipse.emf.ecore.util.EContentAdapter#notifyChanged(org.eclipse.emf.common.notify.Notification)
-		 */
-		public void notifyChanged(final Notification notification) {
-			super.notifyChanged(notification);
-			notifyFacesConfigChangeListeners(notification);
-		}
-	}
-
-
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/internal/AbstractJSFAppConfigManagerProviderStrategy.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/internal/AbstractJSFAppConfigManagerProviderStrategy.java
deleted file mode 100644
index fb1162d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/internal/AbstractJSFAppConfigManagerProviderStrategy.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package org.eclipse.jst.jsf.core.jsfappconfig.internal;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jst.jsf.common.internal.strategy.ISimpleStrategy;
-
-/**
- * Abstract provider strategy for {@link IJSFAppConfigManager}s
- *
- */
-public abstract class AbstractJSFAppConfigManagerProviderStrategy 
-	implements ISimpleStrategy<IProject, IJSFAppConfigManagerFactory> {
-	
-	public IJSFAppConfigManagerFactory getNoResult() {
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/internal/CompositeJSFAppConfigLocatorProviderStrategy.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/internal/CompositeJSFAppConfigLocatorProviderStrategy.java
deleted file mode 100644
index cab6c0c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/internal/CompositeJSFAppConfigLocatorProviderStrategy.java
+++ /dev/null
@@ -1,115 +0,0 @@
-package org.eclipse.jst.jsf.core.jsfappconfig.internal;
-
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.QualifiedName;
-import org.eclipse.jst.jsf.common.internal.pde.AbstractSimpleClassExtensionRegistryReader;
-import org.eclipse.jst.jsf.common.internal.strategy.AbstractTestableExtensibleDefaultProviderSelectionStrategy;
-import org.eclipse.jst.jsf.common.internal.strategy.TestableProjectFactoryStrategy;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.core.jsfappconfig.IJSFAppConfigLocater;
-
-/**
- * Composite strategy for providing {@link IJSFAppConfigLocatorProvider}s
- *
- */
-public class CompositeJSFAppConfigLocatorProviderStrategy
-		implements IJSFAppConfigLocatorProvider {
-
-	/**
-	 * Project property session key for testing.
-	 * Project value should hold the testable IJSFAppConfigLocatorProvider instance or null
-	 * NOT API - for testing purposes
-	 */
-	public static final QualifiedName TESTABLE_FACTORY_SESSION_KEY = new QualifiedName(JSFCorePlugin.PLUGIN_ID, "LocatorProviderStrategyFactory"); //$NON-NLS-1$
-	
-	private IProject _project;
-
-	/**
-	 * @param project - may be null
-	 */
-	public CompositeJSFAppConfigLocatorProviderStrategy(final IProject project) {
-		_project = project;
-	}
-
-	public List<IJSFAppConfigLocater> getLocators() {
-		final LocatorProviderSelectionStrategy providerSelector = new LocatorProviderSelectionStrategy();		
-        addLocatorProviderStrategies(providerSelector);
-        
-		final IJSFAppConfigLocatorProvider provider = providerSelector.perform(_project);
-        if (provider != providerSelector.getNoResult())
-        {
-            return Collections.unmodifiableList(provider.getLocators());
-        }
-        return Collections.emptyList();
-	}
-
-	private void addLocatorProviderStrategies(final LocatorProviderSelectionStrategy providerSelector) {
-		providerSelector.addDefaultStrategy(new DefaultJSFAppConfigLocatorProviderStrategy());
-		providerSelector.addExtensionStrategy(new ExtensionPointLocatorProviderStrategy());
-		providerSelector.addTestableStrategy(new TestableLocatorProviderStrategy());
-	}
-	
-	private static class TestableLocatorProviderStrategy extends
-			TestableProjectFactoryStrategy<IJSFAppConfigLocatorProvider> {
-
-		public TestableLocatorProviderStrategy() {
-			super(TESTABLE_FACTORY_SESSION_KEY);
-		}		
-
-	};
-
-	private static class ExtensionPointLocatorProviderStrategy extends
-			JSFAppConfigLocatorProviderStrategy {
-
-		public IJSFAppConfigLocatorProvider perform(final IProject input) throws Exception {
-			final JSFAppConfigLocatorProviderExtensionPointReader reader = new JSFAppConfigLocatorProviderExtensionPointReader();
-			final List<IJSFAppConfigLocatorProvider> res = reader.getExtensions();
-			if (res != null && res.size() > 0) {
-				return res.get(0);
-			}
-			return getNoResult();
-		}
-
-	}
-	
-	private static class LocatorProviderSelectionStrategy
-			extends
-				AbstractTestableExtensibleDefaultProviderSelectionStrategy<IProject, IJSFAppConfigLocatorProvider> {
-		
-		private static final IJSFAppConfigLocatorProvider NO_RESULT = null;
-
-		@Override
-		public IJSFAppConfigLocatorProvider getNoResult() {
-			return NO_RESULT;
-		}
-		
-	}
-	
-	private static class JSFAppConfigLocatorProviderExtensionPointReader extends
-		AbstractSimpleClassExtensionRegistryReader<IJSFAppConfigLocatorProvider> {
-	
-		private static final String EXT_PT_ID 		= "jsfAppConfigLocatorProviderFactory"; //$NON-NLS-1$
-		private static final String EXT_PT_ELEMENT 	= "locatorProvider"; //$NON-NLS-1$
-		private static final String EXT_PT_ATTR 	= "class"; //$NON-NLS-1$
-		
-		protected JSFAppConfigLocatorProviderExtensionPointReader() {
-			super(
-					org.eclipse.jst.jsf.core.internal.JSFCorePlugin.PLUGIN_ID,
-					EXT_PT_ID, EXT_PT_ELEMENT, EXT_PT_ATTR,
-					new CompareOrgEclipseJstContributorsLastComparator<IJSFAppConfigLocatorProvider>()
-			); 		
-		}
-		
-		@Override
-		protected void handleLoadFailure(final CoreException ce) {
-			org.eclipse.jst.jsf.core.internal.JSFCorePlugin.log(ce,
-					"Error loading JSFAppConfigLocatorProvider from extension"); //$NON-NLS-1$
-		
-		}
-
-	}
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/internal/DefaultJSFAppConfigLocatorProviderStrategy.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/internal/DefaultJSFAppConfigLocatorProviderStrategy.java
deleted file mode 100644
index b4a16dd..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/internal/DefaultJSFAppConfigLocatorProviderStrategy.java
+++ /dev/null
@@ -1,56 +0,0 @@
-package org.eclipse.jst.jsf.core.jsfappconfig.internal;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jst.jsf.core.jsfappconfig.ContextParamSpecifiedJSFAppConfigLocater;
-import org.eclipse.jst.jsf.core.jsfappconfig.DefaultJSFAppConfigLocater;
-import org.eclipse.jst.jsf.core.jsfappconfig.IJSFAppConfigLocater;
-import org.eclipse.jst.jsf.core.jsfappconfig.ImplicitRuntimeJSFAppConfigLocater;
-import org.eclipse.jst.jsf.core.jsfappconfig.RuntimeClasspathJSFAppConfigLocater;
-
-/**
- * The platforms default LocatorProviderStrategy.
- * <p>
- * Will return:
- * <ol>
- * <li>ImplicitRuntimeJSFAppConfigLocater</li>
- * <li>DefaultJSFAppConfigLocater</li>
- * <li>ContextParamSpecifiedJSFAppConfigLocater</li>
- * <li>RuntimeClasspathJSFAppConfigLocater</li>
- * <ol>
- *
- */
-public class DefaultJSFAppConfigLocatorProviderStrategy 
-		extends 	JSFAppConfigLocatorProviderStrategy 
-		implements 	IJSFAppConfigLocatorProvider {
-	
-	public IJSFAppConfigLocatorProvider perform(IProject project)  {
-		return this;
-	}
-
-	public List<IJSFAppConfigLocater> getLocators() {
-		List<IJSFAppConfigLocater> ret = new ArrayList<IJSFAppConfigLocater>();
-		
-		// implicit runtime-provided configuration
-		IJSFAppConfigLocater implicitRuntimeConfigLocater = new ImplicitRuntimeJSFAppConfigLocater();
-		ret.add(implicitRuntimeConfigLocater);
-		
-		// default ("/WEB-INF/faces-config.xml") locater
-		IJSFAppConfigLocater defaultConfigLocater = new DefaultJSFAppConfigLocater();
-		ret.add(defaultConfigLocater);
-		
-		// web.xml context-parameter specified locater
-		IJSFAppConfigLocater contextParamConfigLocater = new ContextParamSpecifiedJSFAppConfigLocater();
-		ret.add(contextParamConfigLocater);
-		
-		// runtime classpath locater
-		IJSFAppConfigLocater classpathConfigLocater = new RuntimeClasspathJSFAppConfigLocater();
-		ret.add(classpathConfigLocater);
-		
-		return Collections.unmodifiableList(ret);
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/internal/DefaultJSFAppConfigManagerProviderStrategy.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/internal/DefaultJSFAppConfigManagerProviderStrategy.java
deleted file mode 100644
index 445ee99..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/internal/DefaultJSFAppConfigManagerProviderStrategy.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package org.eclipse.jst.jsf.core.jsfappconfig.internal;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jst.jsf.core.jsfappconfig.JSFAppConfigManager;
-
-/**
- * Default strategy for returning {@link IJSFAppConfigManager}s
- *
- */
-@SuppressWarnings("deprecation")
-public class DefaultJSFAppConfigManagerProviderStrategy extends
-		AbstractJSFAppConfigManagerProviderStrategy {
-
-	public IJSFAppConfigManagerFactory perform(final IProject input) throws Exception {
-		return new DefaultProvider();
-	}
-
-	private static class DefaultProvider 
-		implements IJSFAppConfigManagerFactory {
-		
-		public IJSFAppConfigManager getInstance(final IProject project) {
-			//deprecated warning is to be expected here
-			return JSFAppConfigManager.getInstance(project);
-		}
-				
-	}
-	
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/internal/ExtensionBasedJSFAppConfigManagerProviderStrategy.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/internal/ExtensionBasedJSFAppConfigManagerProviderStrategy.java
deleted file mode 100644
index c68aabf..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/internal/ExtensionBasedJSFAppConfigManagerProviderStrategy.java
+++ /dev/null
@@ -1,53 +0,0 @@
-package org.eclipse.jst.jsf.core.jsfappconfig.internal;
-
-import java.util.List;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jst.jsf.common.internal.pde.AbstractSimpleClassExtensionRegistryReader;
-
-/**
- * Extension-based strategy for returning {@link IJSFAppConfigManager}s
- *
- */
-public class ExtensionBasedJSFAppConfigManagerProviderStrategy extends
-		AbstractJSFAppConfigManagerProviderStrategy {
-
-	private static IJSFAppConfigManagerFactory EXT_PT_BASED_FACTORY;
-	static {
-		final JSFAppConfigManagerFactoryExtensionPointReader reader = new JSFAppConfigManagerFactoryExtensionPointReader();
-		final List<IJSFAppConfigManagerFactory> res = reader.getExtensions();
-		if (res != null && res.size() > 0) {//return first
-			EXT_PT_BASED_FACTORY = res.get(0);
-		}
-	}
-	
-	public IJSFAppConfigManagerFactory perform(final IProject input) throws Exception {
-		return EXT_PT_BASED_FACTORY != null ? EXT_PT_BASED_FACTORY : getNoResult();
-	}
-	
-	private static class JSFAppConfigManagerFactoryExtensionPointReader extends
-			AbstractSimpleClassExtensionRegistryReader<IJSFAppConfigManagerFactory> {
-	
-		private static final String EXT_PT_ID 		= "jsfAppConfigManagerFactory"; //$NON-NLS-1$
-		private static final String EXT_PT_ELEMENT 	= "factory"; //$NON-NLS-1$
-		private static final String EXT_PT_ATTR 	= "class"; //$NON-NLS-1$
-		
-		protected JSFAppConfigManagerFactoryExtensionPointReader() {
-			super(
-					org.eclipse.jst.jsf.core.internal.JSFCorePlugin.PLUGIN_ID,
-					EXT_PT_ID, EXT_PT_ELEMENT, EXT_PT_ATTR, 
-					new CompareOrgEclipseJstContributorsLastComparator<IJSFAppConfigManagerFactory>()
-			); 		
-		}
-		
-		@Override
-		protected void handleLoadFailure(final CoreException ce) {
-			org.eclipse.jst.jsf.core.internal.JSFCorePlugin.log(ce,
-					"Error loading JSFAppConfigLocatorProvider from extension"); //$NON-NLS-1$
-		
-		}
-
-	}
-	
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/internal/IJSFAppConfigLocatorProvider.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/internal/IJSFAppConfigLocatorProvider.java
deleted file mode 100644
index 1f20003..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/internal/IJSFAppConfigLocatorProvider.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package org.eclipse.jst.jsf.core.jsfappconfig.internal;
-
-import java.util.List;
-
-import org.eclipse.jst.jsf.core.jsfappconfig.IJSFAppConfigLocater;
-
-/**
- * Provides list of {@link IJSFAppConfigLocater}s
- *
- */
-public interface IJSFAppConfigLocatorProvider {
-	/**
-	 * @return list of ILocators
-	 */
-	List<IJSFAppConfigLocater> getLocators();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/internal/IJSFAppConfigManager.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/internal/IJSFAppConfigManager.java
deleted file mode 100644
index 9420080..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/internal/IJSFAppConfigManager.java
+++ /dev/null
@@ -1,279 +0,0 @@
-package org.eclipse.jst.jsf.core.jsfappconfig.internal;
-
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.jst.jsf.common.internal.managedobject.IManagedObject;
-import org.eclipse.jst.jsf.core.jsfappconfig.IFacesConfigChangeListener;
-import org.eclipse.jst.jsf.core.jsfappconfig.IJSFAppConfigProvider;
-import org.eclipse.jst.jsf.core.jsfappconfig.IJSFAppConfigProvidersChangeListener;
-import org.eclipse.jst.jsf.facesconfig.emf.ApplicationType;
-import org.eclipse.jst.jsf.facesconfig.emf.BehaviorType;
-import org.eclipse.jst.jsf.facesconfig.emf.ComponentType;
-import org.eclipse.jst.jsf.facesconfig.emf.ConverterType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigExtensionType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType;
-import org.eclipse.jst.jsf.facesconfig.emf.FactoryType;
-import org.eclipse.jst.jsf.facesconfig.emf.LifecycleType;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType;
-import org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType;
-import org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanType;
-import org.eclipse.jst.jsf.facesconfig.emf.RenderKitType;
-import org.eclipse.jst.jsf.facesconfig.emf.ResourceBundleType;
-import org.eclipse.jst.jsf.facesconfig.emf.ValidatorType;
-
-/**
- * Mostly represents a web applications JSF configuration.
- * <p>
- * This is a merged view of all the faces-config elements.
- *
- * @noimplement - must extend {@link AbstractJSFAppConfigManager}
- */
-public interface IJSFAppConfigManager extends IManagedObject{
-
-	/**
-	 * Gets this instance's IProject instance.
-	 * 
-	 * @return This instance's IProject instance.
-	 */
-	public IProject getProject();
-
-	/**
-	 * Adds an instance of {@link IJSFAppConfigProvidersChangeListener}.
-	 * 
-	 * @param listener An instance of {@link IJSFAppConfigProvidersChangeListener}.
-	 * @return true if added, else false.
-	 */
-	public boolean addJSFAppConfigProvidersChangeListener(
-			IJSFAppConfigProvidersChangeListener listener);
-
-	/**
-	 * Removes an instance of {@link IJSFAppConfigProvidersChangeListener}.
-	 * 
-	 * @param listener an instance of {@link IJSFAppConfigProvidersChangeListener}.
-	 * @return true if removed, else false.
-	 */
-	public boolean removeJSFAppConfigProvidersChangeListener(
-			IJSFAppConfigProvidersChangeListener listener);
-
-	/**
-	 * Notifies all {@link IJSFAppConfigProvidersChangeListener} instances of
-	 * a change in the Set of {@link IJSFAppConfigProvider} instances.
-	 * 
-	 * @param configProvider {@link IJSFAppConfigProvider} instance that has
-	 * changed.
-	 * @param eventType Event type.
-	 */
-	public void notifyJSFAppConfigProvidersChangeListeners(
-			IJSFAppConfigProvider configProvider, int eventType);
-
-	/**
-	 * Adds an instance of {@link IFacesConfigChangeListener}. <br>
-	 * <br>
-	 * <b>NOTE:</b> Calling this method should cause all application
-	 * configuration models to be loaded, to ensure that a
-	 * FacesConfigChangeAdapter has been added to each model
-	 * if the model is updateable.
-	 * 
-	 * @param emfClass EMF class in which the listener is interested.
-	 * @param listener {@link IFacesConfigChangeListener} instance.
-	 * @return Previous {@link IFacesConfigChangeListener}, or null.
-	 */
-	public Object addFacesConfigChangeListener(Class emfClass,
-			IFacesConfigChangeListener listener);
-
-	/**
-	 * Removes an instance of {@link IFacesConfigChangeListener}.
-	 * 
-	 * @param emfClass EMF class in which the listener was interested.
-	 * @return Removed {@link IFacesConfigChangeListener}, or null.
-	 */
-	public Object removeFacesConfigChangeListener(Class emfClass);
-
-	/**
-	 * Notifies {@link IFacesConfigChangeListener} instances of model changes
-	 * in which they registered interest.
-	 * 
-	 * @param notification EMF {@link Notification} instance that describes the
-	 * model change.
-	 */
-	public void notifyFacesConfigChangeListeners(
-			Notification notification);
-
-//	/**
-//	 * Gets all {@link IJSFAppConfigProvider} instances from all
-//	 * {@link IJSFAppConfigLocater} instances.
-//	 * 
-//	 * @return Set of all {@link IJSFAppConfigProvider} instances.
-//	 */
-//	public Set<IJSFAppConfigProvider> getJSFAppConfigProviders();
-
-//	/**
-//	 * Gets all {@link FacesConfigType} instances from all
-//	 * {@link IJSFAppConfigProvider} instances.
-//	 * 
-//	 * @return List of all {@link FacesConfigType} instances.
-//	 */
-//	public List<FacesConfigType> getFacesConfigModels();
-
-	/**
-	 * Gets list of all ManagedBeanType instances from all known faces-config
-	 * models; list may be empty.
-	 * 
-	 * @return List of all ManagedBeanType instances from all known
-	 * faces-config models (list may be empty).
-	 */
-	public List<ManagedBeanType> getManagedBeans();
-
-	/**
-	 * @return List of all variable resolver class names registered. 
-	 */
-	public List<String> getPropertyResolvers();
-
-	/**
-	 * Gets list of all ValidatorType instances from all known faces-config
-	 * models; list may be empty.
-	 * 
-	 * @return List of all ValidatorType instances from all known faces-config
-	 * models (list may be empty).
-	 */
-	public List<ValidatorType> getValidators();
-
-	/**
-	 * @return List of all variable resolver class names registered. 
-	 */
-	public List<String> getVariableResolvers();
-
-	/**
-	 * Gets list of all ConverterType instances from all known faces-config
-	 * models; list may be empty.
-	 * 
-	 * @return List of all ConverterType instances from all known faces-config
-	 * models (list may be empty).
-	 */
-	public List<ConverterType> getConverters();
-
-	/**
-	 * Gets list of all NavigationRuleType instances from all known
-	 * faces-config models; list may be empty.
-	 * 
-	 * @return List of all NavigationRuleType instances from all known
-	 * faces-config models (list may be empty).
-	 */
-	public List<NavigationRuleType> getNavigationRules();
-
-	/**
-	 * Gets list of all NavigationRuleType instances from all known
-	 * faces-config models where the navigation-rule's from-view-id value
-	 * matches the web content folder-relative value of the passed IFile
-	 * instance; list may be empty. Matching is performed in the same manner
-	 * as for a JSF implementation's default NavigationHandler.
-	 * 
-	 * @param pageFile IFile instance to match against the from-view-id value
-	 * of all NavigationRuleType instances. File is assumed to be relative to
-	 * the web content folder, but may be expressed in a more complete form;
-	 * its path will be calculated relative to the web content folder.
-	 * @return List of all NavigationRuleType instances from all known
-	 * faces-config models where the navigation-rule's from-view-id value
-	 * matches the web content folder-relative value of the passed IFile
-	 * instance (list may be empty).
-	 */
-	public List<NavigationRuleType> getNavigationRulesForPage(IFile pageFile);
-
-	/**
-	 * Gets list of all ApplicationType instances from all known
-	 * faces-config models; list may be empty.
-	 * 
-	 * @return List of all ApplicationType instances from all known
-	 * faces-config models (list may be empty).
-	 */
-	public List<ApplicationType> getApplications();
-
-	/**
-	 * Gets list of all FactoryType instances from all known faces-config
-	 * models; list may be empty.
-	 * 
-	 * @return List of all FactoryType instances from all known faces-config
-	 * models (list may be empty).
-	 */
-	public List<FactoryType> getFactories();
-
-	/**
-	 * Gets list of all ComponentType instances from all known faces-config
-	 * models; list may be empty.
-	 * 
-	 * @return List of all ComponentType instances from all known faces-config
-	 * models (list may be empty).
-	 */
-	public List<ComponentType> getComponents();
-
-	/**
-	 * Gets list of all ReferencedBeanType instances from all known
-	 * faces-config models; list may be empty.
-	 * 
-	 * @return List of all ReferencedBeanType instances from all known
-	 * faces-config models (list may be empty).
-	 */
-	public List<ReferencedBeanType> getReferencedBeans();
-
-	/**
-	 * Gets list of all RenderKitType instances from all known faces-config
-	 * models; list may be empty.
-	 * 
-	 * @return List of all RenderKitType instances from all known faces-config
-	 * models (list may be empty).
-	 */
-	public List<RenderKitType> getRenderKits();
-
-	/**
-	 * Gets list of all LifecycleType instances from all known faces-config
-	 * models; list may be empty.
-	 * 
-	 * @return List of all LifecycleType instances from all known faces-config
-	 * models (list may be empty).
-	 */
-	public List<LifecycleType> getLifecycles();
-
-	/**
-	 * @return the list of all resource bundles declared in all the FacesConfig
-	 * configurations found.
-	 */
-	public List<ResourceBundleType> getResourceBundles();
-	
-	/**
-	 * @return the list of faces config extensions declared in all FacesConfig 
-	 * configurations found
-	 */
-	public List<FacesConfigExtensionType> getFacesConfigExtensions();
-	
-/* --------------------------  JSF 2.0 ---------------------------------------- */
-	
-	/**
-	 * @return the list of behaviors declared in all FacesConfig configurations found
-	 */
-	public List<BehaviorType> getBehaviors();
-	
-	//do we want ordering?
-	
-	
-/* ---------------------------------------------------------------------------- */
-	/**
-	 * Adds this instance's FacesConfigChangeAdapter instance to the
-	 * passed application configuration model's adapters collection.
-	 * 
-	 * @param facesConfig Application configuration model's root object.
-	 */
-	public void addFacesConfigChangeAdapter(FacesConfigType facesConfig);
-
-	/**
-	 * Removes this instance's FacesConfigChangeAdapter instance from
-	 * the passed application configuration model's adapters collection.
-	 * 
-	 * @param facesConfig Application configuration model's root object.
-	 */
-	public void removeFacesConfigChangeAdapter(
-			FacesConfigType facesConfig);
-
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/internal/IJSFAppConfigManagerFactory.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/internal/IJSFAppConfigManagerFactory.java
deleted file mode 100644
index 5336388..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/internal/IJSFAppConfigManagerFactory.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package org.eclipse.jst.jsf.core.jsfappconfig.internal;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jst.jsf.common.internal.managedobject.ObjectManager.ManagedObjectException;
-
-/**
- * Factory for creating {@link IJSFAppConfigManager} instances.
- * <p>
- * NOT API
- */
-public interface IJSFAppConfigManagerFactory {
-	/**
-	 * @param project - may be null
-	 * @return instance of an {@link IJSFAppConfigManager} for the project.
-	 * @throws ManagedObjectException 
-	 */
-	IJSFAppConfigManager getInstance(IProject project) throws ManagedObjectException;
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/internal/JSFAppConfigLocatorProviderStrategy.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/internal/JSFAppConfigLocatorProviderStrategy.java
deleted file mode 100644
index e625935..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/internal/JSFAppConfigLocatorProviderStrategy.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package org.eclipse.jst.jsf.core.jsfappconfig.internal;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jst.jsf.common.internal.strategy.ISimpleStrategy;
-
-/**
- * Abstract implementation of a JSFAppConfigLocatorProviderStrategy 
- * implementing {@link ISimpleStrategy}
- */
-public abstract class JSFAppConfigLocatorProviderStrategy 
-	implements ISimpleStrategy<IProject, IJSFAppConfigLocatorProvider>  {
-
-	public IJSFAppConfigLocatorProvider getNoResult() {
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/internal/JSFAppConfigManagerFactory.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/internal/JSFAppConfigManagerFactory.java
deleted file mode 100644
index 401dc48..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/internal/JSFAppConfigManagerFactory.java
+++ /dev/null
@@ -1,113 +0,0 @@
-package org.eclipse.jst.jsf.core.jsfappconfig.internal;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.QualifiedName;
-import org.eclipse.jst.jsf.common.internal.resource.ResourceSingletonObjectManager;
-import org.eclipse.jst.jsf.common.internal.strategy.AbstractTestableExtensibleDefaultProviderSelectionStrategy;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-
-/**
- * Responsible for producing and caching {@link IJSFAppConfigManager} instances by project.
- * <p>
- * This class will guarantee that he same instance of the {@link IJSFAppConfigManager} is returned for a given project
- *
- */
-public class JSFAppConfigManagerFactory 
-		extends 
-			ResourceSingletonObjectManager<IJSFAppConfigManager, IProject>{
-	
-	private static JSFAppConfigManagerFactory INSTANCE;
-
-	//private constructor
-	private JSFAppConfigManagerFactory(final IProject project) {
-		super(project.getWorkspace());
-	}
-	
-	/**
-	 * Project property session key for testing.
-	 * Project value should hold the testable IJSFAppConfigManagerFactory instance or null
-	 * NOT API - for testing purposes
-	 */
-	public static final QualifiedName TESTABLE_FACTORY_SESSION_KEY = new QualifiedName(JSFCorePlugin.PLUGIN_ID, "JSFAppConfigManagerFactoryInstance"); //$NON-NLS-1$
-	
-	/**
-	 * @param project
-	 * @return IJSFAppConfigManager
-	 */
-	public synchronized static IJSFAppConfigManager getJSFAppConfigManagerInstance(final IProject project) {
-		try {
-			return getJSFAppConfigManagerFactoryInstance(project).getInstance(project);			
-		} catch (ManagedObjectException e) {
-			JSFCorePlugin.log(e, "Cannot create IJSFAppConfigManager for "+project.getName()+ " (1)"); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-		return null;
-	}
-	
-	private static JSFAppConfigManagerFactory getJSFAppConfigManagerFactoryInstance(final IProject project) {
-		if (INSTANCE == null) {
-			INSTANCE = new JSFAppConfigManagerFactory(project);
-		}
-		return INSTANCE;
-	}
-
-	@Override
-	protected IJSFAppConfigManager createNewInstance(final IProject project) {
-		try {
-			final IJSFAppConfigManagerFactory factory = getJSFAppConfigManagerFactoryProviderInstance(project);
-			if (factory != null) {
-				IJSFAppConfigManager jsfAppConfigMgr = factory.getInstance(project);
-
-                // Make a call to ensure the underlying EMF models in
-				// the providers (from the locators) are initialized
-                // in this instance begin created. Helps avoid some
-                // potential concurrency issues as models are created.
-				jsfAppConfigMgr.getApplications();
-
-				return jsfAppConfigMgr;
-			}
-		} catch (ManagedObjectException e) {
-			JSFCorePlugin.log(e, "Cannot create IJSFAppConfigManager for "+project.getName()+ " (2)"); //$NON-NLS-1$ //$NON-NLS-2$
-		}			
-		return null;
-	}
-
-	private IJSFAppConfigManagerFactory getJSFAppConfigManagerFactoryProviderInstance(final IProject project) {
-		final CompositeFactorySelectionStrategyProvider factoryProvider = new CompositeFactorySelectionStrategyProvider();		
-		return factoryProvider != null ? factoryProvider.getFactoryToUse(project) : null;
-	}
-	
-	private static class CompositeFactorySelectionStrategyProvider
-	{
-		public IJSFAppConfigManagerFactory getFactoryToUse(final IProject project) {
-			final JSFAppConfigManagerProviderSelectionStrategy providerSelector = new JSFAppConfigManagerProviderSelectionStrategy();		
-	        addStrategies(providerSelector);
-	        
-			final IJSFAppConfigManagerFactory provider = providerSelector.perform(project);
-	        if (provider != providerSelector.getNoResult())
-	        {
-	            return provider;
-	        }
-	        return null;
-		}
-		
-		private void addStrategies(final JSFAppConfigManagerProviderSelectionStrategy providerSelector) {
-			providerSelector.addDefaultStrategy(new DefaultJSFAppConfigManagerProviderStrategy());
-			providerSelector.addExtensionStrategy(new ExtensionBasedJSFAppConfigManagerProviderStrategy());
-			providerSelector.addTestableStrategy(new TestableJSFAppConfigManagerProviderStrategy(TESTABLE_FACTORY_SESSION_KEY));				
-		}
-		
-	}
-	
-	private static class JSFAppConfigManagerProviderSelectionStrategy
-		extends
-			AbstractTestableExtensibleDefaultProviderSelectionStrategy<IProject, IJSFAppConfigManagerFactory> {
-		
-		private static final IJSFAppConfigManagerFactory NO_RESULT = null;
-		
-		@Override
-		public IJSFAppConfigManagerFactory getNoResult() {
-			return NO_RESULT;
-		}
-	}
-	
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/internal/TestableJSFAppConfigManagerProviderStrategy.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/internal/TestableJSFAppConfigManagerProviderStrategy.java
deleted file mode 100644
index 78ab773..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/internal/TestableJSFAppConfigManagerProviderStrategy.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package org.eclipse.jst.jsf.core.jsfappconfig.internal;
-
-import org.eclipse.core.runtime.QualifiedName;
-import org.eclipse.jst.jsf.common.internal.strategy.TestableProjectFactoryStrategy;
-
-/**
- * Injectable test factory provider strategy
- * @param <IJSFAppConfigManagerFactory> 
- *
- */
-public class TestableJSFAppConfigManagerProviderStrategy<IJSFAppConfigManagerFactory>
-	extends TestableProjectFactoryStrategy<IJSFAppConfigManagerFactory> {
-
-	/**
-	 * @param testableFactorySessionKey - project property session key for property value holding testable instance 
-	 */
-	public TestableJSFAppConfigManagerProviderStrategy(final QualifiedName testableFactorySessionKey) {
-		super(testableFactorySessionKey);
-	}	
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/package-info.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/package-info.java
deleted file mode 100644
index f1a3d13..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/package-info.java
+++ /dev/null
@@ -1,18 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-/**
- * Project-level support for JSF application configuration files. 
- * 
- * <p><b>Provisional API - subject to change</b></p>
- */
-package org.eclipse.jst.jsf.core.jsfappconfig;
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/JSFLibraryConfigurationHelper.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/JSFLibraryConfigurationHelper.java
deleted file mode 100644
index 2f677d7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/JSFLibraryConfigurationHelper.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.core.jsflibraryconfiguration;
-
-import java.util.Collection;
-import java.util.HashSet;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.jdt.core.IClasspathEntry;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.core.jsflibraryconfiguration.internal.JSFLibraryReferenceFacadeFactory;
-
-/**
- * Helper class for adopters needing to deal with JSF Library References
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * @since WTP JSF 1.0
- * @deprecated
- */
-public final class JSFLibraryConfigurationHelper {
-	/**
-	 * container id for JSF Library Classpath Containers 
-	 */
-	public static final String JSF_LIBRARY_CP_CONTAINER_ID="org.eclipse.jst.jsf.core.internal.jsflibrarycontainer"; //$NON-NLS-1$
-
-	/**
-	 * @param project 
-	 * @return collection of references
-	 */
-	public static Collection<JSFLibraryReference> getJSFLibraryReferences(IProject project) {
-		Collection<JSFLibraryReference> results = new HashSet<JSFLibraryReference>();
-		IJavaProject jproj = JavaCore.create(project);
-		try {
-			IClasspathEntry[] entries = jproj.getRawClasspath();
-			boolean foundImpl = false;
-			for (int i=0;i<entries.length;i++){
-				JSFLibraryReference ref = JSFLibraryReferenceFacadeFactory.create(entries[i]);
-				if (ref != null){
-					results.add(ref);
-					if (ref.isJSFImplementation())
-						foundImpl = true;
-				}
-			}
-			if (! foundImpl){
-				results.add(JSFLibraryReferenceFacadeFactory.createServerSuppliedJSFLibRef());
-			}
-		} catch (JavaModelException e) {
-			JSFCorePlugin.log(e, "Exception occurred calling getJSFLibraryReferences for "+project.getName()); //$NON-NLS-1$
-		}
-		return results;
-	}
-
-	/**
-	 * @param cpEntry
-	 * @return boolean indicating that the classpath entry is a JSF Libary Classpath Container
-	 */
-	public static boolean isJSFLibraryContainer(IClasspathEntry cpEntry) {
-		if (cpEntry.getEntryKind() != IClasspathEntry.CPE_CONTAINER)
-			return false;
-		
-		IPath path = cpEntry.getPath();
-		return path != null && path.segmentCount() == 2 && JSF_LIBRARY_CP_CONTAINER_ID.equals(path.segment(0));
-	}
-	
-	/**
-	 * @param project
-	 * @return true if the JSF Faceted project is configured to use system supplied implementation
-	 */
-	public static boolean isConfiguredForSystemSuppliedImplementation(IProject project) {
-		Collection<JSFLibraryReference> refs = getJSFLibraryReferences(project);
-		for(JSFLibraryReference ref : refs){			
-			if (ref instanceof JSFLibraryReferenceServerSupplied)
-				return true;
-		}
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/JSFLibraryReference.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/JSFLibraryReference.java
deleted file mode 100644
index 17fe475..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/JSFLibraryReference.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.core.jsflibraryconfiguration;
-
-import java.util.Collection;
-
-import org.eclipse.jdt.core.IClasspathEntry;
-
-/**
- * Represents a reference to a JSF Library on a project
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * @deprecated
- */
-public abstract interface JSFLibraryReference {
-	/**
-	 * @return id for the library
-	 */
-	public String getId();	
-	/**
-	 * @return name
-	 */
-	public String getName();
-	/**
-	 * @return collection of jars as {@link IClasspathEntry}s
-	 */
-	public Collection<IClasspathEntry> getJars();
-	/**
-	 * @return {@link JSFVersion} value
-	 */
-	public JSFVersion getMaxSupportedVersion();
-	/**
-	 * @return label user sees for this library
-	 */
-	public String getLabel();
-	/**
-	 * @return flag 
-	 */
-	public boolean isJSFImplementation();
-	/**
-	 * @return is deployed (marked as J2EE Module Dependency)
-	 */
-	public boolean isDeployed();	
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/JSFLibraryReferencePluginProvided.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/JSFLibraryReferencePluginProvided.java
deleted file mode 100644
index 8535cef..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/JSFLibraryReferencePluginProvided.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.core.jsflibraryconfiguration;
-
-/**
- * A reference to a plugin-defined JSF Library
- *
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @deprecated
- */
-public interface JSFLibraryReferencePluginProvided extends JSFLibraryReferenceUserSpecified, JSFLibraryReferenceUserDefined {
-	/**
-	 * @return plugin id.  May return null if plugin id cannot be determined.  
-	 */
-	public String getPluginId();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/JSFLibraryReferenceServerSupplied.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/JSFLibraryReferenceServerSupplied.java
deleted file mode 100644
index 2ee576b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/JSFLibraryReferenceServerSupplied.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.core.jsflibraryconfiguration;
-
-/**
- * A reference to a JSF Library where the implementation library is presumed to be coming from the 
- * server
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @deprecated
- */
-public interface JSFLibraryReferenceServerSupplied extends
-		JSFLibraryReference {
-	
-	/**
-	 * Constant used for server supplied virtual JSF Library referencew
-	 */
-	public static final String ID = "_ServerSupplied_"; //$NON-NLS-1$
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/JSFLibraryReferenceUserDefined.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/JSFLibraryReferenceUserDefined.java
deleted file mode 100644
index f5e69d3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/JSFLibraryReferenceUserDefined.java
+++ /dev/null
@@ -1,20 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.core.jsflibraryconfiguration;
-
-
-/**
- * Represents an reference to a user specified JSF Library
- * @deprecated use JSFLibraryReferenceUserSpecified 
- */
-public interface JSFLibraryReferenceUserDefined extends JSFLibraryReference {
-	//
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/JSFLibraryReferenceUserSpecified.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/JSFLibraryReferenceUserSpecified.java
deleted file mode 100644
index a65cbab..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/JSFLibraryReferenceUserSpecified.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.core.jsflibraryconfiguration;
-
-
-/**
- * Represents an reference to a user specified JSF Library
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @deprecated
- */
-public interface JSFLibraryReferenceUserSpecified extends JSFLibraryReference {
-	//
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/JSFVersion.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/JSFVersion.java
deleted file mode 100644
index 244f00c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/JSFVersion.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.core.jsflibraryconfiguration;
-
-/**
- * Enumeration of JavaServer Faces Versions
- *
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @deprecated
- */
-public enum JSFVersion {
-	
-	/**
-	 * Unknown version support
-	 */
-	UNKNOWN, 
-	/**
-	 * Supports JSF Version 1.0
-	 */
-	V1_0,
-	/**
-	 * Supports JSF Version 1.1
-	 */
-	V1_1,
-	/**
-	 * Supports JSF Version 1.1
-	 */
-	V1_2;
-	
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/internal/AbstractJSFLibraryReferenceImpl.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/internal/AbstractJSFLibraryReferenceImpl.java
deleted file mode 100644
index 7251d44..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/internal/AbstractJSFLibraryReferenceImpl.java
+++ /dev/null
@@ -1,158 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.core.jsflibraryconfiguration.internal;
-
-
-
-
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jdt.core.IClasspathEntry;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jst.jsf.core.internal.jsflibraryconfig.JSFLibraryInternalReference;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary;
-import org.eclipse.jst.jsf.core.jsflibraryconfiguration.JSFLibraryReference;
-import org.eclipse.jst.jsf.core.jsflibraryconfiguration.JSFVersion;
-/**
- * @author gekessle
- * @deprecated
- */
-public abstract class AbstractJSFLibraryReferenceImpl implements JSFLibraryReference {
-	
-	/**
-	 * The {@link org.eclipse.jst.jsf.core.internal.jsflibraryconfig.JSFLibraryInternalReference} being wrapped
-	 */
-	protected JSFLibraryInternalReference libRef;
-	private String _id;
-	private String _label;
-	private boolean _isImplementation;
-	private boolean _isDeloyed;
-
-	/**
-	 * Constructor for "virtual" JSF Library References like "ServerSupplied"
-	 * @param id
-	 * @param label 
-	 * @param isImplementation 
-	 */
-	public AbstractJSFLibraryReferenceImpl(String id, String label, boolean isImplementation){
-		_id = id;
-		_label = label;
-		_isImplementation = isImplementation;
-	}
-	
-	/**
-	 * Constructor non-virtual library references
-	 * @param libRef
-	 * @param isDeployed 
-	 */
-	public AbstractJSFLibraryReferenceImpl(JSFLibraryInternalReference libRef, boolean isDeployed){
-		this.libRef = libRef;
-		_isDeloyed = isDeployed;
-	}
-	
-	public String getId() {
-		if (libRef != null)
-			return libRef.getID();
-		
-		return _id;
-	}
-
-	public String getLabel() {
-		if (libRef != null)
-			return libRef.getLabel();
-
-		return _label;
-	}
-
-	public boolean isDeployed() {
-		return _isDeloyed;
-	}
-
-	public boolean isJSFImplementation() {
-		if (libRef != null)
-			return libRef.isImplementation();
-		
-		return _isImplementation;
-	}
-	
-	/**
-	 * @return the JSFLibrary underpinning the reference.  
-	 * May be null if the library is missing or cannot be resolved from the registry.
-	 */
-	protected JSFLibrary getLibrary(){
-		return libRef.getLibrary();
-	}
-	
-	public Collection<IClasspathEntry> getJars() {
-		Set<IClasspathEntry> results = new HashSet<IClasspathEntry>();
-		if (getLibrary() != null){
-			List jars = getLibrary().getArchiveFiles();
-			for (Iterator it= jars.iterator();it.hasNext();){
-				ArchiveFile jar = (ArchiveFile)it.next();
-				String path = jar.getResolvedSourceLocation();
-				results.add(JavaCore.newLibraryEntry(new Path(path), null, null));
-			}
-		}			
-		return results;
-	}
-
-	public JSFVersion getMaxSupportedVersion() {
-		if (getLibrary() != null)
-			return adaptVersion(getLibrary().getJSFVersion());
-		return null;
-	}
-
-	private JSFVersion adaptVersion(
-			org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFVersion version) {
-		
-		switch (version.getValue()){
-			case org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFVersion.V1_1:
-				return JSFVersion.V1_1;				
-			case org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFVersion.V1_2:
-				return JSFVersion.V1_2;		
-			default:
-				return JSFVersion.UNKNOWN;			
-				
-		}
-	}
-
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.core.jsflibraryconfiguration.JSFLibraryReference#getName()
-	 */
-	public String getName() {
-		if (getLibrary()!= null) {
-			return getLibrary().getName();
-		}
-		return getId();
-	}
-
-	public String toString(){
-		StringBuffer buf = new StringBuffer("id: "); //$NON-NLS-1$
-		buf.append(getId());
-		buf.append(", label: "); //$NON-NLS-1$
-		buf.append(getLabel());
-		buf.append(", isDeployed: "); //$NON-NLS-1$
-		buf.append(isDeployed());
-		buf.append(", isImpl: "); //$NON-NLS-1$
-		buf.append(isJSFImplementation());
-		buf.append(", version: "); //$NON-NLS-1$
-		buf.append(getMaxSupportedVersion().name());
-		
-		return buf.toString();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/internal/JSFLibraryReferenceFacadeFactory.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/internal/JSFLibraryReferenceFacadeFactory.java
deleted file mode 100644
index 5205610..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/internal/JSFLibraryReferenceFacadeFactory.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.core.jsflibraryconfiguration.internal;
-
-import org.eclipse.jdt.core.IClasspathAttribute;
-import org.eclipse.jdt.core.IClasspathEntry;
-import org.eclipse.jst.j2ee.classpathdep.IClasspathDependencyConstants;
-import org.eclipse.jst.jsf.core.internal.jsflibraryconfig.JSFLibraryRegistryUtil;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.PluginProvidedJSFLibrary;
-import org.eclipse.jst.jsf.core.jsflibraryconfiguration.JSFLibraryConfigurationHelper;
-import org.eclipse.jst.jsf.core.jsflibraryconfiguration.JSFLibraryReference;
-import org.eclipse.jst.jsf.core.jsflibraryconfiguration.JSFLibraryReferenceServerSupplied;
-
-/**
- * Factory for producing facade objects for references to the internal EMF JSF Library classes
- * @deprecated
- */
-public class JSFLibraryReferenceFacadeFactory {
-	/**
-	 * Returns a JSFLibraryReferenceUserSpecified (or JSFLibraryReferenceUserDefined})  or JSFLibraryReferencePluginProvided instance.
-	 * Will not create a JSFLibraryReferenceServerSupplied as there is no cp entry.   Use createServerSuppliedJSFLibRef instead.
-	 * @param classpathEntry
-	 * @return an instance of JSFLibraryInternalReference.  Null will be returned if the cpEntry is not a JSF Library reference.
-	 */
-	public static JSFLibraryReference create(final IClasspathEntry classpathEntry) {
-		if (JSFLibraryConfigurationHelper.isJSFLibraryContainer(classpathEntry)){
-			return createReference(classpathEntry);
-		}
-		return null;
-	}
-
-	/**
-	 * @return instance of {@link JSFLibraryReferenceServerSupplied}
-	 */
-	public static JSFLibraryReferenceServerSupplied createServerSuppliedJSFLibRef(){
-		return new JSFLibraryReferenceServerSuppliedImpl();
-	}
-
-
-	/**
-	 * @param classpathEntry
-	 * @return {@link JSFLibraryReference}
-	 */
-	private static JSFLibraryReference createReference(
-			final IClasspathEntry classpathEntry) {
-		
-		String libID = classpathEntry.getPath().segment(1);
-		org.eclipse.jst.jsf.core.internal.jsflibraryconfig.JSFLibraryInternalReference libRef = JSFLibraryRegistryUtil.getInstance().getJSFLibraryReferencebyID(libID);
-		if (libRef!= null){
-			boolean isDeployed = getJ2EEModuleDependency(classpathEntry);
-			if (libRef.getLibrary() instanceof PluginProvidedJSFLibrary)
-				return new JSFLibraryReferencePluginProvidedImpl(libRef, isDeployed);
-			
-			return new JSFLibraryReferenceUserSpecifiedImpl(libRef, isDeployed);
-		}
-		return null;
-	}
-
-	private static boolean getJ2EEModuleDependency(IClasspathEntry classpathEntry) {
-		IClasspathAttribute[] attrs = classpathEntry.getExtraAttributes();
-		for (int i=0;i<attrs.length;i++){
-			IClasspathAttribute attr = attrs[i];
-			if (attr.getName().equals(IClasspathDependencyConstants.CLASSPATH_COMPONENT_DEPENDENCY)){
-				return true;
-			}
-		}
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/internal/JSFLibraryReferencePluginProvidedImpl.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/internal/JSFLibraryReferencePluginProvidedImpl.java
deleted file mode 100644
index 426ad89..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/internal/JSFLibraryReferencePluginProvidedImpl.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.core.jsflibraryconfiguration.internal;
-
-import org.eclipse.jst.jsf.core.internal.jsflibraryconfig.JSFLibraryInternalReference;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.PluginProvidedJSFLibrary;
-import org.eclipse.jst.jsf.core.jsflibraryconfiguration.JSFLibraryReferencePluginProvided;
-
-/**
- * @deprecated
- */
-public class JSFLibraryReferencePluginProvidedImpl extends AbstractJSFLibraryReferenceImpl implements JSFLibraryReferencePluginProvided {
-
-	/**
-	 * Constructor
-	 * @param libRef
-	 * @param isDeployed 
-	 */
-	public JSFLibraryReferencePluginProvidedImpl(JSFLibraryInternalReference libRef, boolean isDeployed) {
-		super(libRef, isDeployed);
-	}
-
-	public String getPluginId() {
-		if (getLibrary() != null)
-			return ((PluginProvidedJSFLibrary) getLibrary()).getPluginID();
-		
-		return null;
-	}
-
-	public String toString() {
-		StringBuffer buf = new StringBuffer("PluginProvided: ("); //$NON-NLS-1$
-		buf.append(super.toString());
-		
-		return buf.toString();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/internal/JSFLibraryReferenceServerSuppliedImpl.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/internal/JSFLibraryReferenceServerSuppliedImpl.java
deleted file mode 100644
index a813bb9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/internal/JSFLibraryReferenceServerSuppliedImpl.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.core.jsflibraryconfiguration.internal;
-
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary;
-import org.eclipse.jst.jsf.core.jsflibraryconfiguration.JSFLibraryReferenceServerSupplied;
-import org.eclipse.jst.jsf.core.jsflibraryconfiguration.JSFVersion;
-
-/**
- * @author gekessle
- * @deprecated
- */
-public class JSFLibraryReferenceServerSuppliedImpl 
-	extends AbstractJSFLibraryReferenceImpl 
-	implements JSFLibraryReferenceServerSupplied {
-	
-	/**
-	 * Library display Label 
-	 */
-	public final static String SERVER_SUPPLIED = Messages.JSFLibraryReferenceServerSuppliedImpl_Label; 
-	/**
-	 * Constructor
-	 */
-	public JSFLibraryReferenceServerSuppliedImpl(){
-		//TODO: replace label with constant
-		super(JSFLibraryReferenceServerSupplied.ID, SERVER_SUPPLIED, true); 
-	}
-	
-	public String toString() {
-		StringBuffer buf = new StringBuffer("ServerSupplied: ("); //$NON-NLS-1$
-		buf.append(super.toString());
-		buf.append(")"); //$NON-NLS-1$
-		
-		return buf.toString();
-	}
-	
-	protected JSFLibrary getLibrary(){
-		return null;
-	}
-	
-	public JSFVersion getMaxSupportedVersion() {
-		return JSFVersion.UNKNOWN;
-	}
-//
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/internal/JSFLibraryReferenceUserSpecifiedImpl.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/internal/JSFLibraryReferenceUserSpecifiedImpl.java
deleted file mode 100644
index 4bb735f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/internal/JSFLibraryReferenceUserSpecifiedImpl.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.core.jsflibraryconfiguration.internal;
-
-import org.eclipse.jst.jsf.core.internal.jsflibraryconfig.JSFLibraryInternalReference;
-import org.eclipse.jst.jsf.core.jsflibraryconfiguration.JSFLibraryReferenceUserDefined;
-import org.eclipse.jst.jsf.core.jsflibraryconfiguration.JSFLibraryReferenceUserSpecified;
-
-/**
- * Implementation of a reference to a user specified JSF Library  
- * @deprecated
- */
-public class JSFLibraryReferenceUserSpecifiedImpl extends AbstractJSFLibraryReferenceImpl implements JSFLibraryReferenceUserSpecified, JSFLibraryReferenceUserDefined{
-	/**
-	 * @param libRef of type {@link JSFLibraryInternalReference}
-	 * @param isDeployed
-	 */
-	public JSFLibraryReferenceUserSpecifiedImpl(
-			JSFLibraryInternalReference libRef, boolean isDeployed) {
-
-		super(libRef, isDeployed);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.core.jsflibraryconfiguration.internal.AbstractJSFLibraryReferenceImpl#toString()
-	 */
-	public String toString() {
-		StringBuffer buf = new StringBuffer("UserSpecified: ("); //$NON-NLS-1$
-		buf.append(super.toString());
-		buf.append(")"); //$NON-NLS-1$
-		
-		return buf.toString();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/internal/Messages.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/internal/Messages.java
deleted file mode 100644
index bd5fbe5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/internal/Messages.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.core.jsflibraryconfiguration.internal;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * String resource handler.
- *
- */
-public class Messages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.jst.jsf.core.jsflibraryconfiguration.internal.messages"; //$NON-NLS-1$
-	/**
-	 * see messages.properties
-	 */
-	public static String JSFLibraryReferenceServerSuppliedImpl_Label;
-	static {
-		// initialize resource bundle
-		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-	}
-
-	private Messages() {
-		//
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/internal/messages.properties b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/internal/messages.properties
deleted file mode 100644
index 5e97f38..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/internal/messages.properties
+++ /dev/null
@@ -1 +0,0 @@
-JSFLibraryReferenceServerSuppliedImpl_Label=Server Supplied
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/package-info.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/package-info.java
deleted file mode 100644
index d17bacc..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/package-info.java
+++ /dev/null
@@ -1,18 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-/**
- * API for configuring JSF Library References. 
- * 
- * <p><b>Provisional API - subject to change</b></p>
- */
-package org.eclipse.jst.jsf.core.jsflibraryconfiguration;
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryregistry/InvalidArchiveFilesCreationException.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryregistry/InvalidArchiveFilesCreationException.java
deleted file mode 100644
index d76849c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryregistry/InvalidArchiveFilesCreationException.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.jsflibraryregistry;
-
-/**
- * Exception class thrown by PluginProvidedJSFLibraryCreationHelper.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @deprecated
- */
-public class InvalidArchiveFilesCreationException extends Exception {
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * Creates an instance with the specified message.
-	 * @param msg This instance's message
-	 */
-	public InvalidArchiveFilesCreationException(String msg) {
-		super(msg);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryregistry/JSFLibraryArchiveFilesDelegate.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryregistry/JSFLibraryArchiveFilesDelegate.java
deleted file mode 100644
index e4422b2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryregistry/JSFLibraryArchiveFilesDelegate.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.jsflibraryregistry;
-
-import java.util.Collection;
-
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryFactory;
-import org.osgi.framework.Bundle;
-
-/**
- * Abstract delegate class used by jsfLibraries ext-pt to return collection of 
- * ArchiveFiles to PluginProvidedJSFLibraryCreationHelper.
- * 
- * Caller must first setConfigurationElement(IConfigurationElement element)
- * before a call to getArchiveFiles().
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @deprecated along with the jsflibraries extension-point
- */
-public abstract class JSFLibraryArchiveFilesDelegate {
-	private IConfigurationElement extPtElement;
-	private String libID = null;
-	private IPath pluginPath = null;
-	private String pluginID;
-	private String relativeDestLocation = "WEB-INF/lib"; //$NON-NLS-1$
-
-	/**
-	 * Returns a Collection of <code>org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile</code>
-	 * instances.
-	 * 
-	 * @return A Collection of <code>org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile</code>
-	 * instances
-	 */
-	public abstract Collection getArchiveFiles();
-
-	/**
-	 * Sets the IConfigurationElement instance to be subsequently used to get
-	 * the plugin ID and the name defined for the JSF Library.
-	 * 
-	 * @param extPtElement IConfigurationElement instance
-	 */
-	public final void setConfigurationElement(IConfigurationElement extPtElement){
-		this.extPtElement = extPtElement;
-	}
-
-	/**
-	 * Constructs an instance.
-	 */
-	public JSFLibraryArchiveFilesDelegate() {
-		super();
-	}
-
-	/**
-	 * Sets the relative destination location subsequently used to set the
-	 * corresponding property on each created ArchiveFile.
-	 * 
-	 * @param relPath Relative destination location for ArchiveFile instances
-	 */
-	protected void setRelativeDestinationLocation(String relPath){
-		relativeDestLocation = relPath;
-	}
-	
-	/**
-	 * Returns ArchiveFile where the location is set relative to the plugin.   
-	 * As long as the ArchiveFile is on the local machine somewhere, it should
-	 * be locatable.
-	 *  
-	 * @param relativePathFileName Relative location of the ArchiveFile
-	 * @return ArchiveFile instance.
-	 */
-	protected ArchiveFile createArchiveFile(String relativePathFileName){
-		ArchiveFile file = JSFLibraryRegistryFactory.eINSTANCE.createArchiveFile();
-		file.setRelativeToWorkspace(false);
-		file.setSourceLocation(relativePathFileName);
-		file.setRelativeDestLocation(relativeDestLocation);
-		return file;
-	}
-	
-//	protected ArchiveFile createArchiveFileWithAbsolutePath(String fullPath){
-//		ArchiveFile file = JSFLibraryRegistryFactory.eINSTANCE.createArchiveFile();
-//		file.setRelativeToWorkspace(false);
-//		file.setSourceLocation(fullPath);
-//		file.setRelativeDestLocation(relativeDestLocation);
-//		return file;
-//	}
-
-	/**
-	 * Returns the JSFLibrary ID as set on the extension point.
-	 * 
-	 * @return JSFLibrary ID
-	 */
-	protected String getLibID(){
-		if (libID == null){
-			StringBuffer buf = new StringBuffer(getPluginID());
-			buf.append("/").append(extPtElement.getAttribute(PluginProvidedJSFLibraryCreationHelper.NAME)); //$NON-NLS-1$
-			libID = buf.toString();
-		}
-		return libID;
-	}
-
-	/**
-	 * Returns the plugin's path.
-	 * 
-	 * @return The plugin's path.
-	 */
-	protected IPath getPluginPath(){
-		if (pluginPath == null){
-			Bundle bundle = Platform.getBundle(getPluginID());
-			pluginPath = new Path(bundle.getLocation());
-		}
-		return pluginPath;
-	}
-
-	/**
-	 * Returns the plugin's ID.
-	 * 
-	 * @return The plugin's ID.
-	 */
-	private String getPluginID() {
-		if (pluginID == null){
-			pluginID = extPtElement.getDeclaringExtension().getContributor().getName();
-		}
-		return pluginID;
-	}
-	
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryregistry/PluginProvidedJSFLibraryArchiveFilesDelegate.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryregistry/PluginProvidedJSFLibraryArchiveFilesDelegate.java
deleted file mode 100644
index a298df4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryregistry/PluginProvidedJSFLibraryArchiveFilesDelegate.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.core.jsflibraryregistry;
-
-import org.eclipse.jst.jsf.core.jsflibraryregistry.internal.PluginProvidedJSFLibraryCreationHelper2;
-
-/**
- * Abstract class to be used for supplying the jar file names for a plugin provided jsf library.
- * <br>Adopters must implement getArchiveFiles() making use of the addArchiveFile(String pluginRootRelativePath) method.
- * <br><em>Note: A plugin providing jsf libraries cannot be jarred at this time. </em>
- * <br><br>ex.
- * <br>  <pre><code>public void getArchiveFiles() {
-						addArchiveFile("/lib/JAR1.jar");
-						addArchiveFile("/lib/JAR2.jar");
-					}
-		</code>
-		</pre>
- *
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @deprecated
- */
-public abstract class PluginProvidedJSFLibraryArchiveFilesDelegate {
-	private PluginProvidedJSFLibraryCreationHelper2 helper;
-	
-	/**
-	 * Constructs an instance.
-	 */
-	public PluginProvidedJSFLibraryArchiveFilesDelegate() {
-		super();	
-	}
-	
-	/**
-	 * Concrete delegate must implement this method to define jars in the library.
-	 * Use addJarFile(String pluginRootRelativePath) within this method to add jars to the library.
-	 */
-	public abstract void getArchiveFiles(); 
-	
-	/**
-	 * Adds jar file to the library.  Verification of file existence does not occur at this point.
-	 * 
-	 * Jar must be specified as being relative to the plugin.  
-	 * ex.  "/lib/MyJar.jar" where the lib directory is a child of the root.
-	 *  
-	 * @param pluginRootRelativePath
-	 */
-	protected void addArchiveFile(String pluginRootRelativePath) {
-		helper.addArchiveFile(pluginRootRelativePath);//getArchiveFiles().add(helper.createArchiveFile(pluginRootRelativePath));
-	}
-
-	/**
-	 * Not to be implemented by subclasses
-	 * @param helper
-	 */
-	public void setCreationHelper(
-			PluginProvidedJSFLibraryCreationHelper2 helper) {		
-		this.helper = helper;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryregistry/PluginProvidedJSFLibraryCreationHelper.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryregistry/PluginProvidedJSFLibraryCreationHelper.java
deleted file mode 100644
index cda0083..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryregistry/PluginProvidedJSFLibraryCreationHelper.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.jsflibraryregistry;
-
-import java.util.Collection;
-import java.util.Iterator;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.core.internal.Messages;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryFactory;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFVersion;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.PluginProvidedJSFLibrary;
-import org.eclipse.osgi.util.NLS;
-
-/**
- * Helper class used to create JSF Libraries from the
- * <code>org.eclipse.jst.jsf.core.jsflibraries</code> extension-point.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @deprecated - clients should not use
- */
-public final class PluginProvidedJSFLibraryCreationHelper {
-	private IConfigurationElement config_element;
-
-	/**
-	 * Key of the 'name' attribute of the extension point.
-	 */
-	public final static String NAME 		= "name"; //$NON-NLS-1$
-	/**
-	 * Key of the 'isImplementation' attribute of the extension point.
-	 */
-	public final static String IS_IMPL 		= "isImplementation"; //$NON-NLS-1$
-	/**
-	 * Key of the 'maxVersionSupported' attribute of the extension point.
-	 */
-	public final static String VERSION 		= "maxVersionSupported"; //$NON-NLS-1$
-	/**
-	 * Key of the 'archiveFilesDelegate' attribute of the extension point.
-	 */
-	public final static String DELEGATE 	= "archiveFilesDelegate"; //$NON-NLS-1$
-
-	/**
-	 * Creates an instance with the specified IConfigurationElement instance.
-	 * 
-	 * @param jsfLibrary IConfigurationElement instance
-	 */
-	public PluginProvidedJSFLibraryCreationHelper (IConfigurationElement jsfLibrary){
-		this.config_element = jsfLibrary;
-	}
-
-	/**
-	 * Creates a new PluginProvidedJSFLibrary from the JSFLibrary extension point.
-	 * 
-	 * @return PluginProvidedJSFLibrary instance.
-	 */
-	public JSFLibrary create(){
-		PluginProvidedJSFLibrary newLib = JSFLibraryRegistryFactory.eINSTANCE.createPluginProvidedJSFLibrary();
-//		newLib.setID(getLibID());
-		newLib.setPluginID(getPluginID());
-		newLib.setName(config_element.getAttribute(NAME));
-		newLib.setImplementation(config_element.getAttribute(IS_IMPL).equals("true") ? true : false); //$NON-NLS-1$		
-		newLib.setJSFVersion(JSFVersion.getJSFVersion(config_element.getAttribute(VERSION)));
-		
-		try {
-			addArchives(newLib);			
-			return newLib;
-		} catch (Exception e) {
-			JSFCorePlugin.log(
-					e,
-					NLS.bind(
-							Messages.PluginProvidedJSFLibraryCreationHelper_ErrorCreating,
-							newLib.getName()));
-		}
-		return null;
-	}
-
-	/**
-	 * Adds ArchiveFile instances to the specified JSFLibrary instance.
-	 * 
-	 * @param newLib JSFLibrary instance
-	 * @throws InvalidArchiveFilesCreationException on attempt to create
-	 * multiple instances at same location.
-	 * @throws CoreException on core failure.
-	 */
-	private void addArchives(JSFLibrary newLib) throws InvalidArchiveFilesCreationException, CoreException {
-		JSFLibraryArchiveFilesDelegate jarCol = null;
-		ArchiveFile jar = null;
-
-		jarCol = (JSFLibraryArchiveFilesDelegate)config_element.createExecutableExtension(DELEGATE);
-		if (jarCol != null){
-			jarCol.setConfigurationElement(config_element);
-			Collection jars = jarCol.getArchiveFiles();
-			if (jars == null)//TODO: better validation and error handling
-				return;
-			Iterator it = jars.iterator();
-			while (it.hasNext()){
-				Object aJar = it.next();
-				if (aJar instanceof ArchiveFile){//for now check to see ArchiveFiles were being returned
-					jar = (ArchiveFile)aJar;
-					if (!newLib.containsArchiveFile(jar.getSourceLocation()))
-						newLib.getArchiveFiles().add(jar);
-				}
-				else {
-					throw new InvalidArchiveFilesCreationException(
-							NLS.bind(
-									Messages.PluginProvidedJSFLibraryCreationHelper_ErrorMultipleDefinition,
-									jar.getSourceLocation(),
-									config_element.getName()));
-				}
-					
-			}
-		}
-	}
-	
-	/**
-	 * Returns the plugin's ID.
-	 * 
-	 * @return The plugin's ID
-	 */
-	private String getPluginID() {
-		return config_element.getDeclaringExtension().getContributor().getName();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryregistry/internal/PluginProvidedJSFLibraryCreationHelper2.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryregistry/internal/PluginProvidedJSFLibraryCreationHelper2.java
deleted file mode 100644
index 723f0cd..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryregistry/internal/PluginProvidedJSFLibraryCreationHelper2.java
+++ /dev/null
@@ -1,147 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.jsflibraryregistry.internal;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.core.internal.Messages;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryFactory;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFVersion;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.PluginProvidedJSFLibrary;
-import org.eclipse.jst.jsf.core.jsflibraryregistry.PluginProvidedJSFLibraryArchiveFilesDelegate;
-import org.eclipse.osgi.util.NLS;
-
-/**
- * Helper class used to create plugin-rovided JSF Libraries from the
- * <code>org.eclipse.jst.jsf.core.pluginProvidedJsfLibraries</code> extension-point.
- * <br>
- * 
- * @author Gerry Kessler - Oracle
- * @deprecated
- */
-public final class PluginProvidedJSFLibraryCreationHelper2 {
-	private PluginProvidedJSFLibrary newLib;
-	private IConfigurationElement config_element;
-	private String relativeDestLocation = "WEB-INF/lib"; //$NON-NLS-1$
-	
-	/**
-	 * Key of the 'name' attribute of the extension point.
-	 */
-	public final static String NAME 		= "name"; //$NON-NLS-1$
-	/**
-	 * Key of the 'isImplementation' attribute of the extension point.
-	 */
-	public final static String IS_IMPL 		= "isImplementation"; //$NON-NLS-1$
-	/**
-	 * Key of the 'maxVersionSupported' attribute of the extension point.
-	 */
-	public final static String VERSION 		= "maxVersionSupported"; //$NON-NLS-1$
-	/**
-	 * Key of the 'archiveFilesDelegate' attribute of the extension point.
-	 */
-	public final static String DELEGATE 	= "archiveFilesDelegate"; //$NON-NLS-1$
-	/**
-	 * Key of the 'label' attribute of the extension point.
-	 */
-	public final static String LABEL 		= "label"; //$NON-NLS-1$
-	
-	/**
-	 * Creates an instance with the specified IConfigurationElement instance.
-	 * 
-	 * @param jsfLibrary IConfigurationElement instance
-	 */
-	public PluginProvidedJSFLibraryCreationHelper2 (IConfigurationElement jsfLibrary){
-		this.config_element = jsfLibrary;
-	}
-	
-	/**
-	 * Add a jar file to the library
-	 * @param pluginRootRelativePath
-	 */
-	public void addArchiveFile(String pluginRootRelativePath) {
-		ArchiveFile jar = createArchiveFile(pluginRootRelativePath);
-		if (!newLib.containsArchiveFile(jar.getSourceLocation()))
-			newLib.getArchiveFiles().add(jar);
-	}
-	
-	/**
-	 * Creates a new PluginProvidedJSFLibrary from the JSFLibrary extension point.
-	 * 
-	 * @return PluginProvidedJSFLibrary instance.
-	 */
-	public JSFLibrary create(){
-		newLib = JSFLibraryRegistryFactory.eINSTANCE.createPluginProvidedJSFLibrary();
-		newLib.setPluginID(getPluginID());
-		newLib.setName(config_element.getAttribute(NAME));
-		String label = config_element.getAttribute(LABEL);
-		if (label != null && label.length() > 0){
-			newLib.setLabel(label);
-		}
-		newLib.setImplementation(config_element.getAttribute(IS_IMPL).equals("true") ? true : false); //$NON-NLS-1$		
-		newLib.setJSFVersion(JSFVersion.getJSFVersion(config_element.getAttribute(VERSION)));
-		
-		try {
-			addArchives();			
-			return newLib;
-		} catch (Exception e) {
-			JSFCorePlugin.log(
-					e,
-					NLS.bind(
-							Messages.PluginProvidedJSFLibraryCreationHelper_ErrorCreating,
-							newLib.getName()));
-		}
-		return null;
-	}
-
-	/**
-	 * Adds ArchiveFile instances to the specified JSFLibrary instance.
-	 * 
-	 * @param newLib JSFLibrary instance
-	 * @throws CoreException on core failure.
-	 */
-	private void addArchives() throws CoreException {
-		PluginProvidedJSFLibraryArchiveFilesDelegate jarCol = null;
-
-		jarCol = (PluginProvidedJSFLibraryArchiveFilesDelegate)config_element.createExecutableExtension(DELEGATE);
-		if (jarCol != null){
-			jarCol.setCreationHelper(this);
-			jarCol.getArchiveFiles();
-		}
-	}
-	/**
-	 * Returns ArchiveFile where the location is set relative to the plugin.   
-	 * As long as the ArchiveFile is on the local machine somewhere, it should
-	 * be locatable.
-	 *  
-	 * @param relativePathFileName Relative location of the ArchiveFile
-	 * @return ArchiveFile instance.
-	 */
-	private ArchiveFile createArchiveFile(String pluginRootRelativePath){
-		ArchiveFile file = JSFLibraryRegistryFactory.eINSTANCE.createArchiveFile();
-		file.setRelativeToWorkspace(false);
-		file.setSourceLocation(pluginRootRelativePath);
-		file.setRelativeDestLocation(relativeDestLocation);
-		return file;
-	}
-
-	/**
-	 * Returns the plugin's ID.
-	 * 
-	 * @return The plugin's ID
-	 */
-	private String getPluginID() {
-		return config_element.getDeclaringExtension().getContributor().getName();
-	}
-
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryregistry/package-info.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryregistry/package-info.java
deleted file mode 100644
index 3eb240d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryregistry/package-info.java
+++ /dev/null
@@ -1,18 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-/**
- * API for configuring JSF Library References. 
- * 
- * <p><b>Provisional API - subject to change</b></p>
- */
-package org.eclipse.jst.jsf.core.jsflibraryregistry;
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/metadata/internal/HTMLContentModelMetaDataTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/metadata/internal/HTMLContentModelMetaDataTranslator.java
deleted file mode 100644
index 758eeb1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/metadata/internal/HTMLContentModelMetaDataTranslator.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.core.metadata.internal;
-
-import org.eclipse.jst.jsf.common.metadata.internal.AbstractTagLibDomainContentModelMetaDataTranslator;
-import org.eclipse.jst.jsf.common.metadata.internal.IMetaDataModelMergeAssistant;
-import org.eclipse.jst.jsf.common.metadata.internal.IMetaDataSourceModelProvider;
-import org.eclipse.jst.jsf.common.metadata.internal.IMetaDataTranslator;
-import org.eclipse.wst.html.core.internal.contentmodel.HTMLCMDocument;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMDocument;
-
-/**
- * Translates the HTML CMDocument to standard metadata model entities and traits
- */
-public class HTMLContentModelMetaDataTranslator extends AbstractTagLibDomainContentModelMetaDataTranslator implements IMetaDataTranslator {
-
-	public boolean canTranslate(IMetaDataSourceModelProvider modelProvider) {		
-		if (modelProvider != null &&			
-				modelProvider.getSourceModel() instanceof HTMLCMDocument)
-			return true;
-		return false;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.common.metadata.internal.IMetaDataTranslator#translate(org.eclipse.jst.jsf.common.metadata.internal.IMetaDataModelMergeAssistant)
-	 */
-	public void translate(final IMetaDataModelMergeAssistant assistant) {
-		_assistant = assistant;
-		CMDocument doc = getSourceModel();
-		if (doc instanceof HTMLCMDocument){
-			doTranslate(doc);			
-		}
-	}
-
-	/**
-	 *  @return getURIDisplayLabel()
-	 */
-	protected String getURIDescription() {
-		return Messages.HTMLContentModelMetaDataTranslator_Desc;
-	}
-
-	/**
-	 * return "HTML 4.0"
-	 */
-	protected String getURIDisplayLabel() {
-		return Messages.HTMLContentModelMetaDataTranslator_Label;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/metadata/internal/INamespaceModelProvider.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/metadata/internal/INamespaceModelProvider.java
deleted file mode 100644
index c50ff5b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/metadata/internal/INamespaceModelProvider.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package org.eclipse.jst.jsf.core.metadata.internal;
-
-import org.eclipse.jst.jsf.common.metadata.internal.IMetaDataSourceModelProvider;
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.Namespace;
-
-/**
- * Provider of {@link Namespace} metadata
- *
- */
-public interface INamespaceModelProvider extends IMetaDataSourceModelProvider {
-	/**
-	 * @return the namespace provided.   May be null.
-	 */
-	public Namespace getNamespace();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/metadata/internal/JSPContentModelMetaDataTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/metadata/internal/JSPContentModelMetaDataTranslator.java
deleted file mode 100644
index e49712f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/metadata/internal/JSPContentModelMetaDataTranslator.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.core.metadata.internal;
-
-import org.eclipse.jst.jsf.common.metadata.internal.AbstractTagLibDomainContentModelMetaDataTranslator;
-import org.eclipse.jst.jsf.common.metadata.internal.IMetaDataModelMergeAssistant;
-import org.eclipse.jst.jsf.common.metadata.internal.IMetaDataSourceModelProvider;
-import org.eclipse.jst.jsf.common.metadata.internal.IMetaDataTranslator;
-import org.eclipse.wst.html.core.internal.contentmodel.JSPCMDocument;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMDocument;
-
-/**
- * Translates the JSP CMDocument to standard metadata model entities and traits
- */
-public class JSPContentModelMetaDataTranslator extends AbstractTagLibDomainContentModelMetaDataTranslator implements IMetaDataTranslator {
-
-	public boolean canTranslate(IMetaDataSourceModelProvider modelProvider) {		
-		if (modelProvider != null &&
-				modelProvider.getSourceModel() instanceof JSPCMDocument)
-			return true;
-		return false;
-	}
-	
-	public void translate(final IMetaDataModelMergeAssistant assistant) {
-		setAssistant(assistant);
-		CMDocument doc = getSourceModel();
-		if (doc instanceof JSPCMDocument){
-			doTranslate(doc);			
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.common.metadata.internal.AbstractTagLibDomainContentModelMetaDataTranslator#getURIDescription()
-	 */
-	protected String getURIDescription() {		
-		return Messages.JSPContentModelMetaDataTranslator_Desc; 
-	}
-
-	@Override
-	protected String getURIDisplayLabel() {		
-		return Messages.JSPContentModelMetaDataTranslator_Label;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/metadata/internal/Messages.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/metadata/internal/Messages.java
deleted file mode 100644
index 3c7e736..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/metadata/internal/Messages.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.core.metadata.internal;
-
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * String resource handler
- *
- */
-public class Messages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.jst.jsf.core.metadata.internal.messages"; //$NON-NLS-1$
-	/**
-	 * see messages.properties
-	 */
-	public static String HTMLContentModelMetaDataTranslator_Label;
-	/**
-	 * see messages.properties
-	 */
-	public static String HTMLContentModelMetaDataTranslator_Desc;
-	/**
-	 * see messages.properties
-	 */
-	public static String JSPContentModelMetaDataTranslator_Desc;
-	/**
-	 * see messages.properties
-	 */
-	public static String JSPContentModelMetaDataTranslator_Label;
-	static {
-		// initialize resource bundle
-		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-	}
-
-	private Messages() {
-		//
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/metadata/internal/NamespaceMetaDataTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/metadata/internal/NamespaceMetaDataTranslator.java
deleted file mode 100644
index 75a36e3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/metadata/internal/NamespaceMetaDataTranslator.java
+++ /dev/null
@@ -1,360 +0,0 @@
-package org.eclipse.jst.jsf.core.metadata.internal;
-
-import java.util.Iterator;
-
-import org.eclipse.jst.jsf.common.metadata.Entity;
-import org.eclipse.jst.jsf.common.metadata.MetadataFactory;
-import org.eclipse.jst.jsf.common.metadata.MetadataPackage;
-import org.eclipse.jst.jsf.common.metadata.Model;
-import org.eclipse.jst.jsf.common.metadata.Trait;
-import org.eclipse.jst.jsf.common.metadata.internal.IMetaDataModelMergeAssistant;
-import org.eclipse.jst.jsf.common.metadata.internal.IMetaDataSourceModelProvider;
-import org.eclipse.jst.jsf.common.metadata.internal.IMetaDataTranslator;
-import org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.BooleanValue;
-import org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.StringValue;
-import org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.TraitTypesFactory;
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.ITagAttribute;
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.ITagElement;
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.Namespace;
-
-/**
- * Translates some pieces of a {@link Namespace} metadata into standard {@link Entity} and {@link Trait} metadata
- *
- */
-public class NamespaceMetaDataTranslator  		
-		implements IMetaDataTranslator  {
-	/**
-	 * {@link IMetaDataModelMergeAssistant} to use
-	 */
-	private IMetaDataModelMergeAssistant _assistant;
-
-	public void translate(final IMetaDataModelMergeAssistant assistant) {
-		_assistant = assistant;
-		final Namespace ns = ((INamespaceModelProvider)_assistant.getSourceModelProvider()).getNamespace();
-		doTranslate(ns);
-	}
-
-	public boolean canTranslate(final IMetaDataSourceModelProvider modelProvider) {
-		if (modelProvider != null &&
-				modelProvider instanceof INamespaceModelProvider)
-			return true;
-		return false;
-	}
-
-	/**
-	 * Set the assistant to use during the translation.   Must be called prior to doTransalate(doc);
-	 * @param assistant
-	 */
-	protected void setAssistant(final IMetaDataModelMergeAssistant assistant){
-		_assistant = assistant;
-	}
-	
-	/**
-	 * Transforms the Namespace into entities and traits of a standard metadata model 
-	 * using the assistant that must be set before this call.
-	 * @param tagLib
-	 */
-	protected void doTranslate(final Namespace tagLib){
-		createTags(tagLib);
-		createTagfileTraits(tagLib);		
-	}
-	
-	/**
-	 * @param entity
-	 * @param key
-	 * @param value
-	 */
-	protected void createSimpleStringEntityTraitIfNecessary(final Entity entity, final String key,
-			final String value) {
-		Trait t = findTraitOnEntityById(entity, key);
-		if (t == null){
-			t = internalCreateTrait(entity, key);
-
-			StringValue val = TraitTypesFactory.eINSTANCE.createStringValue();			
-			val.setValue(value);
-			
-			t.setValue(val);
-		}
-	}
-
-	/**
-	 * @param entity
-	 * @param key
-	 * @param value
-	 */
-	protected void createSimpleBooleanObjectEntityTraitIfNecessary(final Entity entity,
-			String key, boolean value) {
-		
-		Trait t = findTraitOnEntityById(entity, key);
-		if (t == null){
-			t = internalCreateTrait(entity, key);
-
-			BooleanValue val = TraitTypesFactory.eINSTANCE.createBooleanValue();		
-			val.setTrue(value);
-			
-			t.setValue(val);
-		}
-		
-	}
-	
-	/**
-	 * @param entity
-	 * @param key
-	 * @return Trait
-	 */
-	protected Trait internalCreateTrait(final Entity entity, final String key) {
-		Trait t = MetadataFactory.eINSTANCE.createTrait();
-		t.setId(key);
-		t.setSourceModelProvider(_assistant.getSourceModelProvider());
-		entity.getTraits().add(t);
-		return t;
-	}
-	
-	/**
-	 * @param entity
-	 * @param key
-	 * @return Trait
-	 */
-	protected Trait findTraitOnEntityById(final Entity entity, final String key) {
-		for (Iterator it=entity.getTraits().iterator();it.hasNext();){
-			Trait t = (Trait)it.next();
-			if (key.equals(t.getId()))
-				return t;
-		}
-		return null;
-	}
-
-	/**
-	 * @param nodeName
-	 * @return Entity
-	 */
-	protected Entity findTagEntity(final String nodeName) {
-		for (Iterator it=getMergedModel().getChildEntities().iterator();it.hasNext();){
-			Entity entity = (Entity)it.next();
-			if (nodeName.equals(entity.getId()))
-				return entity;
-		}
-		return null;
-	}
-
-	/**
-	 * @param tag
-	 * @param attributeName
-	 * @return Attribute entity for supplied attribute name and given Tag entity.  Will return null if not found.
-	 */
-	protected Entity findAttributeEntityForTagEntity(final Entity tag, final String attributeName) {
-		for (Iterator it=tag.getChildEntities().iterator();it.hasNext();){
-			Entity attr = (Entity)it.next();
-			if (attributeName.equals(attr.getId()))
-				return attr;
-		}
-		return null;
-	}
-	/**
-	 * Create entities for tags
-	 * @param tagLib
-	 */
-	protected void createTags(final Namespace tagLib) {
-		for (final ITagElement tag : tagLib.getViewElements()){
-			Entity entity = findTagEntity(tag.getName());
-			if (entity == null){
-				entity = MetadataFactory.eINSTANCE.createEntity();
-				entity.setId(getTagNodeName(tag));
-				entity.setType("tag"); //$NON-NLS-1$
-				getMergedModel().getChildEntities().add(entity);
-			}
-			setTagEntityTraits(tag, entity);
-		}
-		
-	}
-	
-	/**
-	 * @param tag
-	 * @return tag node name
-	 */
-	protected String getTagNodeName(final ITagElement tag) {
-		return tag.getName();
-	}
-
-	/**
-	 * Sets the standard traits for a tag entity from the element declaration
-	 * @param tag
-	 * @param entity
-	 */
-	protected void setTagEntityTraits(final ITagElement tag, final Entity entity) {
-		createSimpleStringEntityTraitIfNecessary(entity, "display-label", getTagDisplayName(tag)); //$NON-NLS-1$
-		createSimpleStringEntityTraitIfNecessary(entity, "description", getTagDescription(tag));	 //$NON-NLS-1$
-		createSimpleStringEntityTraitIfNecessary(entity, "small-icon", getTagSmallIcon(tag)); //$NON-NLS-1$
-		createSimpleStringEntityTraitIfNecessary(entity, "large-icon", getTagLargeIcon(tag)); //$NON-NLS-1$
-		createSimpleBooleanObjectEntityTraitIfNecessary(entity, "expert", getTagIsExpert(tag)); //$NON-NLS-1$
-		createSimpleBooleanObjectEntityTraitIfNecessary(entity, "hidden", getTagIsHidden(tag)); //$NON-NLS-1$
-		
-		createAttributeEntities(entity, tag);
-	}
-	
-	/**
-	 * @param tagEntity
-	 * @param tag
-	 */
-	protected void createAttributeEntities(final Entity tagEntity, final 
-			ITagElement tag) {
-		
-		for (final ITagAttribute tagAttr : tag.getAttributes().values()){					
-			Entity attr = findAttributeEntityForTagEntity(tagEntity, tagAttr.getName());
-			if (attr == null) {
-				attr = MetadataFactory.eINSTANCE.createEntity();
-				attr.setId(tagAttr.getName());
-				tagEntity.getChildEntities().add(attr);
-			}
-			createAttributeTraits(attr, tagAttr);
-		}
-			
-		
-	}
-
-	/**
-	 * @param attr
-	 * @param tagAttr
-	 */
-	protected void createAttributeTraits(final Entity attr,
-			final ITagAttribute tagAttr) {
-		
-		createSimpleStringEntityTraitIfNecessary(attr, "description", getTagAttributeDescription(tagAttr));	 //$NON-NLS-1$
-		createSimpleBooleanObjectEntityTraitIfNecessary(attr, "required", getTagAttributeIsRequired(tagAttr)); //$NON-NLS-1$
-		createSimpleStringEntityTraitIfNecessary(attr, "default-value", getTagAttributeDefaultValue(tagAttr)); //$NON-NLS-1$
-	}
-	
-	/**
-	 * @param tagAttr
-	 * @return null.   subclass should override if ITagAttribute has the metadata.
-	 */
-	protected String getTagAttributeDescription(final ITagAttribute tagAttr) {return tagAttr.getDescription();}
-	
-	/**
-	 * @param tagAttr
-	 * @return false.   subclass should override if ITagAttribute has the metadata.
-	 */
-	protected boolean getTagAttributeIsRequired(final ITagAttribute tagAttr) {return tagAttr.isRequired();}
-
-	/**
-	 * @param tagAttr
-	 * @return null.   subclass should override if ITagAttribute has the metadata.
-	 */
-	protected String getTagAttributeDefaultValue(final ITagAttribute tagAttr) {return null;}
-
-	/**
-	 * @param tag
-	 * @return false.   subclass should override if ITagElement has the metadata.
-	 */
-	protected boolean getTagIsHidden(final ITagElement tag) {return false;}
-
-	/**
-	 * @param tag
-	 * @return false.   subclass should override if ITagElement has the metadata.
-	 */
-	protected boolean getTagIsExpert(final ITagElement tag) {return false;}
-
-	/**
-	 * @param tag
-	 * @return null.   subclass should override if ITagElement has the metadata.
-	 */
-	protected String getTagLargeIcon(final ITagElement tag) {return null;}
-
-	/**
-	 * @param tag
-	 * @return null.   subclass should override if ITagElement has the metadata.
-	 */
-	protected String getTagSmallIcon(ITagElement tag) {return null;}
-
-	/**
-	 * @param tag
-	 * @return null.   subclass should override if ITagElement has the metadata.
-	 */
-	protected String getTagDescription(final ITagElement tag) {return null;}
-
-	/**
-	 * @param tag
-	 * @return tag.getElementName()
-	 */
-	protected String getTagDisplayName(ITagElement tag) {return tag.getName();}
-
-	/**
-	 * Creates standard traits for tag file entity from CMDocument metadata
-	 * @param ns
-	 */
-	protected void createTagfileTraits(final Namespace ns) {
-		Model model = getMergedModel();
-
-		createSimpleStringEntityTraitIfNecessary(model, "display-label", getNamespaceDisplayLabel()); //$NON-NLS-1$
-		createSimpleStringEntityTraitIfNecessary(model, "description", getNamespaceDescription()); //$NON-NLS-1$
-		createSimpleStringEntityTraitIfNecessary(model, "default-prefix", getNamespaceDefaultPrefix()); //$NON-NLS-1$
-		createSimpleBooleanObjectEntityTraitIfNecessary(model, "expert", getNamespaceExpert()); //$NON-NLS-1$
-		createSimpleBooleanObjectEntityTraitIfNecessary(model, "hidden", getNamespaceHidden()); //$NON-NLS-1$
-		
-	}
-	
-	/**
-	 * @return the display label to use for this model.  Subclasses should override if model has the meta data.
-	 */
-	protected String getNamespaceDisplayLabel(){
-		return getMergedModel().getId();
-	}
-	
-	/**
-	 * @return default prefix to use for tags.  Returns null. Subclasses should override if model has the meta data.
-	 */
-	protected String getNamespaceDefaultPrefix(){
-		return null;
-	}
-
-	/**
-	 * @return description to use.  Default is the URI.  Subclasses should override if model has the meta data.
-	 */
-	protected String getNamespaceDescription(){
-		return getMergedModel().getId();
-	}
-
-	/**
-	 * @return false.  Subclasses should override if model has the meta data.
-	 */
-	protected boolean getNamespaceExpert() { return false;}
-
-	/**
-	 * @return false.  Subclasses should override if model has the meta data.
-	 */
-	protected boolean getNamespaceHidden() {
-//		Model model = (Model)_assistant.getMergedModel().getRoot();
-//		if (model != null) {
-//			return model.getChildEntities().size() == 0 ? true : false;
-//		}
-		return false;	
-	}
-
-	/**
-	 * @return a model of all entities and traits
-	 */
-	protected Model getMergedModel() {
-		Model model = (Model)_assistant.getMergedModel().getRoot();
-		if (model == null){
-			//need to create model key object
-			Model tld = createTLDModel();
-			_assistant.getMergedModel().setRoot(tld);
-			model = (Model)_assistant.getMergedModel().getRoot();
-		}
-		return model;
-	}
-
-	/**
-	 * @return new model 
-	 */
-	protected Model createTLDModel() {
-		final Model entity = getFactory().createModel();
-		entity.setId(_assistant.getMergedModel().getModelContext().getModelIdentifier());
-		return entity;
-	}	
-
-	private MetadataFactory getFactory(){
-		return (MetadataFactory) MetadataPackage.eINSTANCE.getEFactoryInstance(); 
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/metadata/internal/TaglibMetaDataLocator.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/metadata/internal/TaglibMetaDataLocator.java
deleted file mode 100644
index d735b7b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/metadata/internal/TaglibMetaDataLocator.java
+++ /dev/null
@@ -1,186 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.core.metadata.internal;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jst.jsf.common.metadata.internal.AbstractMetaDataLocator;
-import org.eclipse.jst.jsf.common.metadata.internal.IMetaDataLocator;
-import org.eclipse.jst.jsf.common.metadata.internal.IMetaDataSourceModelProvider;
-import org.eclipse.jst.jsf.common.metadata.internal.IPathSensitiveMetaDataLocator;
-import org.eclipse.jst.jsf.core.internal.tld.CMUtil;
-import org.eclipse.jst.jsp.core.internal.contentmodel.tld.CMDocumentFactoryTLD;
-import org.eclipse.jst.jsp.core.taglib.ITaglibRecord;
-import org.eclipse.jst.jsp.core.taglib.TaglibIndex;
-import org.eclipse.wst.html.core.internal.contentmodel.HTMLCMDocumentFactory;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMDocument;
-import org.eclipse.wst.xml.core.internal.provisional.contentmodel.CMDocType;
-
-/**
- * Locator of tag library meta data
- *
- */
-public class TaglibMetaDataLocator extends AbstractMetaDataLocator implements IPathSensitiveMetaDataLocator{
-	//project must be set to the current project context during locate only...  should not be used when noifying observers
-	private IProject _project;
-	private TaglibMetaDataSource _source;
-	
-//	private boolean _notificationEventOccuring;
-	
-	/**
-	 * Constructor
-	 */
-	public TaglibMetaDataLocator(){
-		super();
-	}
-	
-	public List/*<IMetaDataModelProvider>*/ locateMetaDataModelProviders(String uri) {
-		List ret = new ArrayList();
-		CMDocument doc = null;
-
-		if (uri == null){
-			return ret;
-		}
-		else if (uri.equalsIgnoreCase(CMDocType.HTML_DOC_TYPE)){
-			doc = HTMLCMDocumentFactory.getCMDocument(CMDocType.HTML_DOC_TYPE);
-		}
-		else if (uri.equalsIgnoreCase(CMDocType.JSP11_DOC_TYPE)){
-			doc = HTMLCMDocumentFactory.getCMDocument(CMDocType.JSP11_DOC_TYPE);
-		}
-		else if (uri.equalsIgnoreCase(CMDocType.JSP12_DOC_TYPE)){
-			doc = HTMLCMDocumentFactory.getCMDocument(CMDocType.JSP12_DOC_TYPE);
-		}
-		else if (uri.equalsIgnoreCase(CMDocType.JSP20_DOC_TYPE)){
-			doc = HTMLCMDocumentFactory.getCMDocument(CMDocType.JSP20_DOC_TYPE);
-		}
-		else if (_project != null ){//TLD
-			CMDocumentFactoryTLD factory = new CMDocumentFactoryTLD();
-			ITaglibRecord[] tldRecs = TaglibIndex.getAvailableTaglibRecords(_project.getFullPath());
-			ITaglibRecord tldRec = findTLD(tldRecs, uri);
-			if (tldRec != null)
-				doc = factory.createCMDocument(tldRec);
-		}
-		
-		if (doc != null){
-			_source = new TaglibMetaDataSource(doc);
-			ret.add(_source);
-		}
-				
-		return ret;
-	}
-
-	private ITaglibRecord findTLD(ITaglibRecord[] tldRecs, String uri) {
-		for (int i=0;i<tldRecs.length;i++){
-			ITaglibRecord tldRec = tldRecs[i];
-			String tldRecURI = CMUtil.getURIFromTaglibRecord(tldRec, _project);
-			if (uri.equals(tldRecURI))
-				return tldRec;
-		}
-		
-		return null;
-	}
-
-	public void startLocating() {
-//		TaglibIndex.addTaglibIndexListener(this);
-	}
-	public void stopLocating() {		
-//		TaglibIndex.removeTaglibIndexListener(this);//non-api call.... danger
-	}
-	
-	//not currently listening, so will not be called
-//	public void indexChanged(ITaglibIndexDelta delta) {
-////		System.out.println("-----------------------"); //$NON-NLS-1$
-//		if (delta.getProject() == _project) {
-//			for (ITaglibIndexDelta d : delta.getAffectedChildren()) {
-//				System.out.println(">>delta: "+d.getTaglibRecord()+"\n"+d.getKind()); //$NON-NLS-1$ //$NON-NLS-2$
-//				String eventURI = CMUtil.createURIFromTaglibRecord(d.getTaglibRecord(), _project);
-//				if (eventURI != null){
-////					System.out.println(">>>eventURI: "+eventURI); //$NON-NLS-1$
-//					if (!_notificationEventOccuring){
-//						try {
-//							_notificationEventOccuring = true;
-//							int type = adaptTagLibEvent(delta);
-//							IMetaDataChangeNotificationEvent mdEvent = new MetaDataChangeNotificationEvent(this, eventURI, type);
-//							fireEvent(mdEvent);
-//						} finally {
-//							_notificationEventOccuring = false;
-//						}
-//					}
-//				}
-//			}
-//		}
-//	}
-	
-//	private int adaptTagLibEvent(ITaglibIndexDelta event) {
-//		switch (event.getKind()){
-//		case ITaglibIndexDelta.ADDED:
-//			return IMetaDataChangeNotificationEvent.ADDED;
-//		case ITaglibIndexDelta.REMOVED:
-//			return IMetaDataChangeNotificationEvent.REMOVED;
-//		default:
-//			return IMetaDataChangeNotificationEvent.CHANGED;
-//		}		
-//	}
-//
-//	private void fireEvent(final IMetaDataChangeNotificationEvent event) {
-//		SafeRunnable.run(new ISafeRunnable(){
-//
-//			public void handleException(Throwable exception) {
-//				// TODO Auto-generated method stub				
-//			}
-//
-//			public void run() throws Exception {
-//				Iterator it = getObservers().iterator();
-//				while (it.hasNext()){
-//					IMetaDataObserver observer = (IMetaDataObserver)it.next();
-//					observer.notifyMetadataChanged(event);
-//				}
-//			}
-//
-//		});
-//		
-//	}
-
-	public void setProjectContext(IProject project) {
-		this._project = project;		
-	}
-	
-	private class TaglibMetaDataSource implements IMetaDataSourceModelProvider{
-
-		private CMDocument doc;
-		private IMetaDataLocator locator;
-
-		TaglibMetaDataSource(CMDocument doc){
-			super();
-			this.doc = doc;
-		}
-		
-		public Object getSourceModel() {
-			return doc;
-		}
-
-		public IMetaDataLocator getLocator() {
-			return locator;
-		}
-
-		public void setLocator(IMetaDataLocator locator) {
-			this.locator = locator;			
-		}
-
-		public Object getAdapter(Class klass) {
-			return null;
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/metadata/internal/TaglibMetaDataTLDTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/metadata/internal/TaglibMetaDataTLDTranslator.java
deleted file mode 100644
index fbc33c3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/metadata/internal/TaglibMetaDataTLDTranslator.java
+++ /dev/null
@@ -1,163 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.core.metadata.internal;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jst.jsf.common.metadata.Model;
-import org.eclipse.jst.jsf.common.metadata.internal.AbstractTagLibDomainContentModelMetaDataTranslator;
-import org.eclipse.jst.jsf.common.metadata.internal.IMetaDataModelMergeAssistant;
-import org.eclipse.jst.jsf.common.metadata.internal.IMetaDataSourceModelProvider;
-import org.eclipse.jst.jsf.common.metadata.internal.IMetaDataTranslator;
-import org.eclipse.jst.jsf.core.internal.tld.CMUtil;
-import org.eclipse.jst.jsp.core.internal.contentmodel.tld.provisional.TLDAttributeDeclaration;
-import org.eclipse.jst.jsp.core.internal.contentmodel.tld.provisional.TLDDocument;
-import org.eclipse.jst.jsp.core.internal.contentmodel.tld.provisional.TLDElementDeclaration;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMDocument;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
-
-/**
- * Translates a TLD CMDocument to standard metadata model entities and traits
- *
- */
-public class TaglibMetaDataTLDTranslator extends AbstractTagLibDomainContentModelMetaDataTranslator implements IMetaDataTranslator {
-
-	public boolean canTranslate(IMetaDataSourceModelProvider modelProvider) {		
-		if (modelProvider != null && 
-				modelProvider.getSourceModel() instanceof TLDDocument)
-			return true;
-		return false;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.common.metadata.internal.IMetaDataTranslator#translate(org.eclipse.jst.jsf.common.metadata.internal.IMetaDataModelMergeAssistant)
-	 */
-	public void translate(final IMetaDataModelMergeAssistant assistant) {
-		setAssistant(assistant);
-		CMDocument doc = getSourceModel();
-		if (doc instanceof TLDDocument){
-			doTranslate(doc);
-			
-		}
-	}
-
-	@Override
-	protected void createTagfileTraits(CMDocument doc) {		
-		super.createTagfileTraits(doc);
-		TLDDocument tldDoc = (TLDDocument)doc;
-		//add special model trait if this comes from a TagDir
-		if (CMUtil.isTagDirDocument(tldDoc, getProject())){ 
-			Model model = getMergedModel();
-			createSimpleBooleanObjectEntityTraitIfNecessary(model, "isTagDir", true); //$NON-NLS-1$
-		}
-	}
-
-
-	
-	private IProject getProject() {
-		return (IProject)_assistant.getMergedModel().getModelContext().getAdapter(IProject.class);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.common.metadata.internal.AbstractTagLibDomainContentModelMetaDataTranslator#getURIDefaultPrefix()
-	 */
-	protected String getURIDefaultPrefix(){
-		return getTLDDocument().getShortname();
-	}
-	
-	/**
-	 * @param tag
-	 * @return the tag.getDisplayName() if available
-	 */
-	protected String getTagDisplayLabel(CMElementDeclaration tag){
-		String label = ((TLDElementDeclaration)tag).getDisplayName();
-		if (label == null)
-			label = super.getTagDisplayName(tag);
-		return label;		
-	}
-	
-	/**
-	 * @param tag
-	 * @return the tag.getDescription() if available
-	 */
-	protected String getTagDescription(CMElementDeclaration tag){
-		String desc = ((TLDElementDeclaration)tag).getDescription();
-		if (desc == null)
-			desc = super.getTagDescription(tag);
-		return desc;		
-	}
-	
-	/**
-	 * @param tag
-	 * @return the tag.getSmallIcon() if available
-	 */
-	protected String getTagSmallIcon(CMElementDeclaration tag){
-		String smallIcon = ((TLDElementDeclaration)tag).getSmallIcon();
-		if (smallIcon == null)
-			smallIcon = super.getTagSmallIcon(tag);
-		return smallIcon;		
-	}
-	
-	/**
-	 * @param tag
-	 * @return the tag.getLargeIcon() if available
-	 */
-	protected String getTagLargeIcon(CMElementDeclaration tag){
-		String largeIcon = ((TLDElementDeclaration)tag).getLargeIcon();
-		if (largeIcon == null)
-			largeIcon = super.getTagLargeIcon(tag);
-		return largeIcon;		
-	}
-	
-	/**
-	 * @return the tag.getDescription() if available
-	 */
-	protected String getURIDescription() {		
-		return getTLDDocument().getDescription();
-	}
-
-	/**
-	 * @return the tag.getDisplayName()
-	 */
-	protected String getURIDisplayLabel() {		
-		return getTLDDocument().getDisplayName();
-	}
-	
-	/**
-	 * @return the tld document for the source model
-	 */
-	protected TLDDocument getTLDDocument(){
-		return (TLDDocument)getSourceModel();
-	}
-
-	@Override
-	protected String getTagAttributeDescription(CMAttributeDeclaration cmAttr) {
-		String desc = ((TLDAttributeDeclaration)cmAttr).getDescription();
-		if (desc == null)
-			desc = super.getTagAttributeDescription(cmAttr);
-		return desc;
-	}
-
-	@Override
-	protected boolean getTagAttributeIsRequired(CMAttributeDeclaration cmAttr) {
-		// TODO Auto-generated method stub
-		return super.getTagAttributeIsRequired(cmAttr);
-	}
-	
-	@Override
-	protected String getTagAttributeDefaultValue(CMAttributeDeclaration cmAttr) {
-		String val = ((TLDAttributeDeclaration)cmAttr).getAttrType().generateInstanceValue();
-		if (val == null)
-			val = super.getTagAttributeDefaultValue(cmAttr);
-		return val;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/metadata/internal/messages.properties b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/metadata/internal/messages.properties
deleted file mode 100644
index c8fd3eb..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/metadata/internal/messages.properties
+++ /dev/null
@@ -1,4 +0,0 @@
-HTMLContentModelMetaDataTranslator_Label=HTML 4.0
-HTMLContentModelMetaDataTranslator_Desc=HTML Tags
-JSPContentModelMetaDataTranslator_Desc=JSP Tags
-JSPContentModelMetaDataTranslator_Label=JSP
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/package-info.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/package-info.java
deleted file mode 100644
index d12392b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/package-info.java
+++ /dev/null
@@ -1,16 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-/**
- * JSF Core Framework API. 
- */
-package org.eclipse.jst.jsf.core;
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/set/constraint/MemberConstraint.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/set/constraint/MemberConstraint.java
deleted file mode 100644
index db1ff60..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/set/constraint/MemberConstraint.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.core.set.constraint;
-
-import org.eclipse.emf.common.util.BasicDiagnostic;
-import org.eclipse.emf.common.util.Diagnostic;
-import org.eclipse.jst.jsf.common.sets.AxiomaticSet;
-import org.eclipse.jst.jsf.common.sets.constraint.AbstractSetConstraint;
-
-/**
- * A set constraint that is satisfied if a test set contains all of the specified
- * mustBeMembers.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author cbateman
- *
- */
-public class MemberConstraint extends AbstractSetConstraint 
-{
-    private final AxiomaticSet      _mustBeMembers;
-    
-    /**
-     * @param mustBeMembers -- the set of objects that must occur in the
-     * input set for the constraint to satisfy.  
-     */
-    public MemberConstraint(AxiomaticSet  mustBeMembers)
-    {
-        _mustBeMembers = mustBeMembers;
-    }
-    
-    /**
-     * Members of set must be comparable with thos in mustBeMembers using equals()
-     * @param set 
-     * @return whether or not the constraint is satisfied.  If not satisfied, the
-     * diagnostic's data array will contain the objects that are missing.
-     */
-    public Diagnostic isSatisfied(AxiomaticSet set) 
-    {
-        // the constraint is satisfied iff _mustBeMembers is a subset
-        // of set.  In other words, if every member of _mustBeMembers
-        // is also in set.
-        
-        // we  want to take _mustBeMembers - set.  If the result is empty, then
-        // all of the required elements are members of set.  If the set is non-empty,
-        // this tells us what is missing
-        final AxiomaticSet complement = _mustBeMembers.subtract(set);
-        
-        if (complement.isEmpty())
-        {
-            return Diagnostic.OK_INSTANCE;
-        }
-
-        return new BasicDiagnostic(Diagnostic.ERROR, this.getClass().getName(),
-            0, Messages.MemberConstraint_Failure, complement.toArray());
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/set/constraint/Messages.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/set/constraint/Messages.java
deleted file mode 100644
index 5442a63..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/set/constraint/Messages.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.core.set.constraint;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * String resource handler
- *
- */
-public class Messages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.jst.jsf.core.set.constraint.messages"; //$NON-NLS-1$
-	/**
-	 * see messages.properties
-	 */
-	public static String MemberConstraint_Failure;
-	static {
-		// initialize resource bundle
-		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-	}
-
-	private Messages() {
-		//
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/set/constraint/messages.properties b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/set/constraint/messages.properties
deleted file mode 100644
index e2bf870..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/set/constraint/messages.properties
+++ /dev/null
@@ -1 +0,0 @@
-MemberConstraint_Failure=Failed membership constraint
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/set/constraint/package-info.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/set/constraint/package-info.java
deleted file mode 100644
index 27a3692..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/set/constraint/package-info.java
+++ /dev/null
@@ -1,18 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-/**
- * JSF Core Set Constraints. 
- * 
- * <p><b>Provisional API - subject to change</b></p>
- */
-package org.eclipse.jst.jsf.core.set.constraint;
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/set/mapping/ElementToTagIdentifierMapping.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/set/mapping/ElementToTagIdentifierMapping.java
deleted file mode 100644
index 5af60bf..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/set/mapping/ElementToTagIdentifierMapping.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.core.set.mapping;
-
-import org.eclipse.jst.jsf.common.sets.mapping.AbstractObjectInjectiveSetMapping;
-import org.eclipse.jst.jsf.core.internal.tld.TagIdentifierFactory;
-import org.w3c.dom.Element;
-
-/**
- * Converts a set of DOM element's to a set of (object) injective set
- * of TagIdentifiers.  If the element is a JSP tag, the tag uri will
- * be looked up.
- * 
- * IMPORTANT: the returned TagIdentifiers are wrapper objects, so they only
- * maintain immutability and idempotency as long as the input dom elements
- * do not change. 
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author cbateman
- *
- */
-public class ElementToTagIdentifierMapping extends
-        AbstractObjectInjectiveSetMapping 
-{
-    public Object map(Object element) {
-        Element domElement = (Element) element;
-        return TagIdentifierFactory.createDocumentTagWrapper(domElement);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/set/mapping/package-info.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/set/mapping/package-info.java
deleted file mode 100644
index 52c667a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/set/mapping/package-info.java
+++ /dev/null
@@ -1,18 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-/**
- * JSF Core Set Mapping.  
- * 
- * <p><b>Provisional API - subject to change</b></p>
- */
-package org.eclipse.jst.jsf.core.set.mapping;
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/tagmatcher/EvaluationException.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/tagmatcher/EvaluationException.java
deleted file mode 100644
index 0774212..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/tagmatcher/EvaluationException.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.core.tagmatcher;
-
-/**
- * Wraps an exception thrown during algorithm evaluation
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author cbateman
- *
- */
-public class EvaluationException extends RuntimeException {
-
-    /**
-     * 
-     */
-    private static final long serialVersionUID = -3250608181004283586L;
-
-    /**
-     * 
-     */
-    public EvaluationException() {
-        super();
-    }
-
-    /**
-     * @param message
-     */
-    public EvaluationException(String message) {
-        super(message);
-    }
-
-    /**
-     * @param cause
-     */
-    public EvaluationException(Throwable cause) {
-        super(cause);
-    }
-
-    /**
-     * @param message
-     * @param cause
-     */
-    public EvaluationException(String message, Throwable cause) {
-        super(message, cause);
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/tagmatcher/InvalidExpressionException.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/tagmatcher/InvalidExpressionException.java
deleted file mode 100644
index 2651db8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/tagmatcher/InvalidExpressionException.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.core.tagmatcher;
-
-/**
- * Indicates an exception trapped while compiling or evaluating an
- * expression.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author cbateman
- *
- */
-public class InvalidExpressionException extends RuntimeException {
-    /**
-     * 
-     */
-    private static final long serialVersionUID = 1445871263234840885L;
-
-    /**
-     * @see RuntimeException
-     */
-    public InvalidExpressionException() {
-        super();
-    }
-
-    /**
-     * @param message
-     * @param cause
-     */
-    public InvalidExpressionException(String message, Throwable cause) {
-        super(message, cause);
-    }
-
-    /**
-     * @param message
-     */
-    public InvalidExpressionException(String message) {
-        super(message);
-    }
-
-    /**
-     * @param cause
-     */
-    public InvalidExpressionException(Throwable cause) {
-        super(cause);
-    }
-    
-    
-    
-    
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/tagmatcher/TagMatchingAlgorithm.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/tagmatcher/TagMatchingAlgorithm.java
deleted file mode 100644
index 2a4a283..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/tagmatcher/TagMatchingAlgorithm.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.core.tagmatcher;
-
-import org.eclipse.jst.jsf.common.sets.AxiomaticSet;
-import org.w3c.dom.Node;
-
-/**
- * An algorithm that can be applied at a particular DOM node.  The result
- * may be expressed as a boolean or a set of matching nodes.  The following
- * are equivalent:
- * 
- *    false and empty set
- *    true and non-empty set
- * 
- * Concrete implementations must be idempotent on evaluate():
- * 
- * 1) evaluate(node) must always return the same set if called repeatedly on
- *    the same node in the same DOM tree.
- * 2) evaluate must be able to be called on any number of nodes in order and always
- * produce the same result independent of what was called before and in what order.
- *  
- * <p><b>Provisional API - subject to change</b></p>
- *
- * @author cbateman
- *
- */
-public abstract class TagMatchingAlgorithm 
-{
-    private boolean             _isInvalid; // = false;
-    
-    private boolean             _isInitialized;
-    /**
-     * The expression being passed to the algorithm
-     */
-    protected final String      _expression;
-    
-    /**
-     * Constructor.
-     * 
-     * @param expression
-     */
-    protected TagMatchingAlgorithm(String expression)
-    {
-        _expression = expression;
-    }
-    
-    /**
-     * Called exactly once to initialize any pre-evaluation setup for
-     * the expression set for the algorithm.  This is public to allow
-     * the client control when this initialization occurs in case it is expensive.
-     * evaluate() will call this method automatically if it has never been called
-     * @throws InvalidExpressionException if the underlying algorithm throws an 
-     * exception during init
-     * @throws IllegalStateException if it has already been determined that the
-     * expression is invalid.
-     */
-    public final void initialize() 
-    {
-        if (_isInvalid)
-        {
-            throw new IllegalStateException("Expression: "+_expression+" has already been determined to be invalid"); //$NON-NLS-1$ //$NON-NLS-2$
-        }
-        
-        if (!_isInitialized)
-        {
-            try
-            {
-                doInitialize();
-            }
-            catch (Exception e)
-            {
-                _isInvalid = true;
-                throw new InvalidExpressionException(e);
-            }
-            _isInitialized = true;
-        }
-    }
-    
-    /**
-     * @param applyTo
-     * @return the set matching the configured expression applied to applyTo
-     * using the algorithm represented by this instance.
-     * @throws InvalidExpressionException of a problem occurs initializing the expression
-     * @throws EvaluationException if the internal algorithm throws an exception while
-     * evaluating.
-     * @throws IllegalStateException if evaluate is called again once InvalidExpressionException
-     * has already been thrown.
-     */
-    public final AxiomaticSet evaluate(Node applyTo)
-    {
-        initialize();
-        return doEvaluate(applyTo);
-    }
-    
-    /**
-     * Implementers must override to the evaluation of the target,expression pair
-     * @param target
-     * @return the algorithm evaluated with
-     */
-    protected abstract AxiomaticSet doEvaluate(Node target);
-    
-    /**
-     * Do any initialization that is required before the algorithm is used
-     * to evaluate an expression on any node.  This will get called exactly once and
-     * is guaranteed to be called, at latest, immediately before doEvaluate
-     * 
-     * Method may throw runtime exceptions.  These will be repropagated as
-     * InvalidExpressionException's with the original exception wrapped.
-     * @throws Exception 
-     */
-    protected abstract void doInitialize() throws Exception;
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/tagmatcher/XPathMatchingAlgorithm.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/tagmatcher/XPathMatchingAlgorithm.java
deleted file mode 100644
index 9ce74dd..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/tagmatcher/XPathMatchingAlgorithm.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.core.tagmatcher;
-
-import javax.xml.xpath.XPath;
-import javax.xml.xpath.XPathConstants;
-import javax.xml.xpath.XPathExpression;
-import javax.xml.xpath.XPathExpressionException;
-import javax.xml.xpath.XPathFactory;
-
-import org.eclipse.jst.jsf.common.sets.AxiomaticSet;
-import org.eclipse.jst.jsf.common.sets.ConcreteAxiomaticSet;
-import org.eclipse.jst.jsf.common.sets.NodeSet;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-/**
- * A algorithm that uses an XPath expression to evaluate a result.  The
- * algorithm assumes (although cannot verify beforehand) that the expression
- * provided can be evaluated with a node set return type (see JAXP).  If the
- * algorithm's underlying XPath evaluator throws an exception indicating that
- * the return type cannot be coerced to a node set, the algorithm will return
- * an empty set (no match) unless the strictMatching flag is set to true, in which
- * case it will re-throw the exception wrapped as an unchecked EvaluationException.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author cbateman
- *
- */
-public class XPathMatchingAlgorithm extends TagMatchingAlgorithm 
-{
-    private final boolean  _isStrictMatching;
-    private final XPath    _xpath;
-    private XPathExpression _compiledExpr;
-    
-    /**
-     * @param expression
-     */
-    public XPathMatchingAlgorithm(String expression)
-    {
-        this(expression, false);
-    }
-
-    /**
-     * @param expression
-     * @param isStrictMatching 
-     */
-    public XPathMatchingAlgorithm(String expression, boolean isStrictMatching) 
-    {
-        super(expression);
-        _isStrictMatching = isStrictMatching;
-        _xpath = XPathFactory.newInstance().newXPath();
-    }
-
-    protected AxiomaticSet doEvaluate(Node target) 
-    {
-        try
-        {
-            NodeList nodeList = 
-                (NodeList) _compiledExpr.evaluate(target, XPathConstants.NODESET);
-            return new NodeSet(nodeList);
-        }
-        catch (XPathExpressionException  xpam)
-        {
-            if (_isStrictMatching)
-            {
-                throw new EvaluationException(xpam);
-            }
-            // if not strict checking, return empty set
-            return new ConcreteAxiomaticSet();
-        }
-    }
-
-    protected void doInitialize() throws XPathExpressionException {
-        // compile the xpath expr
-        _compiledExpr = _xpath.compile(_expression);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/tagmatcher/package-info.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/tagmatcher/package-info.java
deleted file mode 100644
index 6f1afd5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/tagmatcher/package-info.java
+++ /dev/null
@@ -1,18 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-/**
- * JSF Core Tag Matching Support. 
- * 
- * <p><b>Provisional API - subject to change</b></p>
- */
-package org.eclipse.jst.jsf.core.tagmatcher;
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/DTAppManagerUtil.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/DTAppManagerUtil.java
deleted file mode 100644
index 53ead62..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/DTAppManagerUtil.java
+++ /dev/null
@@ -1,183 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.designtime;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IStructuredDocumentContextResolverFactory;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IWorkspaceContextResolver;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.internal.IStructuredDocumentContextResolverFactory2;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.designtime.context.DTFacesContext;
-import org.eclipse.jst.jsf.designtime.internal.view.IDTViewHandler;
-import org.eclipse.jst.jsf.designtime.internal.view.IViewDefnAdapter;
-import org.eclipse.jst.jsf.designtime.internal.view.IViewDefnAdapterFactory;
-import org.eclipse.jst.jsf.designtime.internal.view.IViewRootHandle;
-import org.eclipse.jst.jsf.designtime.internal.view.XMLViewDefnAdapter;
-import org.eclipse.jst.jsf.designtime.internal.view.IDTViewHandler.ViewHandlerException;
-
-/**
- * Utility methods for dealing with {@link DesignTimeApplicationManager}
- * 
- * @author cbateman
- * 
- */
-public class DTAppManagerUtil
-{
-    /**
-     * @param context
-     * @return the view adapter for context or null if none.
-     */
-    public static XMLViewDefnAdapter getXMLViewDefnAdapter(
-            final IStructuredDocumentContext context)
-    {
-        final IWorkspaceContextResolver wkResolver =
-                IStructuredDocumentContextResolverFactory.INSTANCE
-                        .getWorkspaceContextResolver(context);
-
-        final IProject project = wkResolver.getProject();
-        final IResource res = wkResolver.getResource();
-
-        if (project != null && res instanceof IFile)
-        {
-            return getXMLViewDefnAdapter(project, (IFile) res);
-        }
-        // not found
-        return null;
-    }
-
-    /**
-     * Equivalent to getXMLViewDefnAdapter(file.getProject(), file)
-     * 
-     * @param file
-     * @return the XMLViewDefnAdapter or null
-     */
-    public static XMLViewDefnAdapter getXMLViewDefnAdapter(final IFile file)
-    {
-        return getXMLViewDefnAdapter(file.getProject(), file);
-    }
-
-    /**
-     * @param project
-     * @param file
-     * @return an XMLViewDefnAdapter for file in project or null if not
-     *         applicable
-     */
-    public static XMLViewDefnAdapter getXMLViewDefnAdapter(
-            final IProject project, final IFile file)
-    {
-        final DesignTimeApplicationManager manager =
-                DesignTimeApplicationManager.getInstance(project);
-
-        if (manager == null)
-        {
-            return null;
-        }
-        final IDTViewHandler viewHandler =
-                DesignTimeApplicationManager.getInstance(project)
-                        .getViewHandler();
-        try
-        {
-            final DTFacesContext facesContext = manager.getFacesContext(file);
-            
-            if (facesContext != null)
-            {
-                final IViewDefnAdapterFactory factory =
-                        viewHandler.getViewMetadataAdapterFactory(facesContext);
-                final IViewDefnAdapter adapter =
-                        factory.createAdapter(facesContext, viewHandler.getViewId(
-                                facesContext, file));
-    
-                if (adapter instanceof XMLViewDefnAdapter)
-                {
-                    return (XMLViewDefnAdapter) adapter;
-                }
-            }
-        }
-        catch (final ViewHandlerException e)
-        {
-            JSFCorePlugin.log(e, ""); //$NON-NLS-1$
-        }
-        return null;
-    }
-
-    /**
-     * @param project
-     * @return the view handler for project or null if none.
-     */
-    public static IDTViewHandler getViewHandler(final IProject project)
-    {
-        final DesignTimeApplicationManager manager =
-                DesignTimeApplicationManager.getInstance(project);
-
-        if (manager == null)
-        {
-            return null;
-        }
-        return DesignTimeApplicationManager.getInstance(project)
-                .getViewHandler();
-    }
-
-    /**
-     * @param context
-     * @return the view root handle from this context or null if can't get one.
-     *     
-     */
-    public static IViewRootHandle getViewRootHandle(final IStructuredDocumentContext context)
-    {
-        final IWorkspaceContextResolver resolver = IStructuredDocumentContextResolverFactory2.INSTANCE
-                .getWorkspaceContextResolver(context);
-
-        if (resolver == null)
-        {
-            return null;
-        }
-        IProject project = null;
-        project = resolver.getProject();
-
-        if (project == null)
-        {
-            return null;
-        }
-        final IResource resource = resolver.getResource();
-        if (resource != null)
-        {
-            return getViewRootHandle(resource);
-        }
-        return null;
-    }
-
-    /**
-     * @param res 
-     * @return the view root handle for the resource
-     */
-    public static IViewRootHandle getViewRootHandle(final IResource res)
-    {
-        final DesignTimeApplicationManager manager = DesignTimeApplicationManager
-                .getInstance(res.getProject());
-
-        if (manager != null)
-        {
-            if (res instanceof IFile)
-            {
-                final DTFacesContext facesContext = manager
-                        .getFacesContext((IFile) res);
-                if (facesContext != null)
-                {
-                    return facesContext.getViewRootHandle();
-                }
-            }
-        }
-        return null;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/DesignTimeApplicationManager.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/DesignTimeApplicationManager.java
deleted file mode 100644
index 097fbd6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/DesignTimeApplicationManager.java
+++ /dev/null
@@ -1,867 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- * 
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.designtime;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Properties;
-import java.util.concurrent.atomic.AtomicBoolean;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.IWorkspaceRunnable;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.QualifiedName;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jst.jsf.common.internal.resource.EventResult;
-import org.eclipse.jst.jsf.common.internal.resource.IResourceLifecycleListener;
-import org.eclipse.jst.jsf.common.internal.resource.LifecycleListener;
-import org.eclipse.jst.jsf.common.internal.resource.ResourceLifecycleEvent;
-import org.eclipse.jst.jsf.core.JSFVersion;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.core.jsfappconfig.JSFAppConfigUtils;
-import org.eclipse.jst.jsf.designtime.context.AbstractDTExternalContextFactory;
-import org.eclipse.jst.jsf.designtime.context.DTFacesContext;
-import org.eclipse.jst.jsf.designtime.context.IExternalContextFactoryLocator;
-import org.eclipse.jst.jsf.designtime.el.AbstractDTMethodResolver;
-import org.eclipse.jst.jsf.designtime.el.AbstractDTPropertyResolver;
-import org.eclipse.jst.jsf.designtime.el.AbstractDTVariableResolver;
-import org.eclipse.jst.jsf.designtime.internal.BasicExtensionFactory.ExtensionData;
-import org.eclipse.jst.jsf.designtime.internal.view.AbstractDTViewHandler;
-import org.eclipse.jst.jsf.designtime.internal.view.IDTViewHandler;
-import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
-
-/**
- * Per-web-application manager that manages design time information for a
- * corresponding project.
- * 
- * TODO: migrate to managed singleton
- * 
- * @author cbateman
- * 
- */
-public final class DesignTimeApplicationManager
-{
-    private static final String SETTINGS_DIR_NAME = ".settings"; //$NON-NLS-1$
-    private static final String ORG_ECLIPSE_JST_JSF_DESIGNTIME_APPMGR_PREFS = "org.eclipse.jst.jsf.designtime.appmgr.prefs"; //$NON-NLS-1$
-
-    private static final String        PROPERTY_QUALIFIER                               = "org.eclipse.jst.jsf.designtime.internal";                     //$NON-NLS-1$
-    private static final String        SESSION_PROPERTY_NAME_PROJECT                    = "DesignTimeApplicationManager";                                //$NON-NLS-1$
-    private static final QualifiedName SESSION_PROPERTY_KEY_PROJECT                     = new QualifiedName(
-                                                                                                PROPERTY_QUALIFIER,
-                                                                                                SESSION_PROPERTY_NAME_PROJECT);
-
-    private static final String        PERSIST_PROPERTY_NAME_EXTERNAL_CONTEXT_PROVIDER  = "ExternalContextProvider";                                     //$NON-NLS-1$
-    private static final QualifiedName PERSIST_PROPERTY_KEY_EXTERNAL_CONTEXT_PROVIDER   = new QualifiedName(
-                                                                                                PROPERTY_QUALIFIER,
-                                                                                                PERSIST_PROPERTY_NAME_EXTERNAL_CONTEXT_PROVIDER);
-
-    private static final String        PERSIST_PROPERTY_NAME_VARIABLE_RESOLVER_PROVIDER = "VariableResolverProvider";                                    //$NON-NLS-1$
-    private static final QualifiedName PERSIST_PROPERTY_KEY_VARIABLE_RESOLVER_PROVIDER  = new QualifiedName(
-                                                                                                PROPERTY_QUALIFIER,
-                                                                                                PERSIST_PROPERTY_NAME_VARIABLE_RESOLVER_PROVIDER);
-
-    private static final String        PERSIST_PROPERTY_NAME_PROPERTY_RESOLVER_PROVIDER = "PropertyResolverProvider";                                    //$NON-NLS-1$
-    private static final QualifiedName PERSIST_PROPERTY_KEY_PROPERTY_RESOLVER_PROVIDER  = new QualifiedName(
-                                                                                                PROPERTY_QUALIFIER,
-                                                                                                PERSIST_PROPERTY_NAME_PROPERTY_RESOLVER_PROVIDER);
-
-    private static final String        PERSIST_PROPERTY_NAME_METHOD_RESOLVER_PROVIDER   = "MethodResolverProvider";                                      //$NON-NLS-1$
-    private static final QualifiedName PERSIST_PROPERTY_KEY_METHOD_RESOLVER_PROVIDER    = new QualifiedName(
-                                                                                                PROPERTY_QUALIFIER,
-                                                                                                PERSIST_PROPERTY_NAME_METHOD_RESOLVER_PROVIDER);
-
-    private static final String        PERSIST_PROPERTY_NAME_VIEW_HANDLER               = "ViewHandler";                                                 //$NON-NLS-1$
-
-    private static final String        DEFAULT_EXTERNAL_CONTEXT_ID                      = "org.eclipse.jst.jsf.core.externalcontext.default";            //$NON-NLS-1$
-
-    private static final String        DEFAULT_VARIABLE_RESOLVER_ID                     = "org.eclipse.jst.jsf.core.variableresolver.default.decorative"; //$NON-NLS-1$
-
-    private static final String        DEFAULT_PROPERTY_RESOLVER_ID                     = "org.eclipse.jst.jsf.core.propertyresolver.default.decorative"; //$NON-NLS-1$
-
-    private static final String        DEFAULT_METHOD_RESOLVER_ID                       = "org.eclipse.jst.jsf.core.methodresolver.default";             //$NON-NLS-1$
-
-    private static final String        PRE_20_DEFAULT_VIEW_HANDLER_ID                          = "org.eclipse.jst.jsf.designtime.view.jspviewhandler";          //$NON-NLS-1$
-    private static final String        JSF_20_DEFAULT_VIEW_HANDLER_ID = "org.eclipse.jst.jsf.facelet.core.html.viewhandler"; //$NON-NLS-1$
-
-    private static final Object        GET_INSTANCE_LOCK = new Object();
-
-    /**
-     * @param project
-     * @return the app manager associated with project
-     */
-    public static DesignTimeApplicationManager getInstance(
-            final IProject project)
-    {
-        if (!hasJSFDesignTime(project))
-        {
-            return null;
-        }
-
-        try
-        {
-            synchronized (GET_INSTANCE_LOCK)
-            {
-                DesignTimeApplicationManager manager = (DesignTimeApplicationManager) project
-                        .getSessionProperty(SESSION_PROPERTY_KEY_PROJECT);
-
-                if (manager != null && !project.equals(manager._project))
-                {
-                    if (!manager._isDisposed.get())
-                    {
-                        manager.dispose();
-                    }
-                    // bug 147729: pretend we starting with a new project (we kind of are)
-                    manager = null;
-                }
-
-                if (manager == null)
-                {
-                    manager = new DesignTimeApplicationManager(project);
-                    project.setSessionProperty(SESSION_PROPERTY_KEY_PROJECT,
-                            manager);
-                }
-
-                return manager;
-            }
-        }
-        catch (final CoreException ce)
-        {
-            Platform
-                    .getLog(JSFCorePlugin.getDefault().getBundle())
-                    .log(
-                            new Status(
-                                    IStatus.ERROR,
-                                    JSFCorePlugin.getDefault().getBundle()
-                                            .getSymbolicName(),
-                                    0,
-                                    "Problem loading design time appmanager", new Exception(ce))); //$NON-NLS-1$
-        }
-
-        return null;
-    }
-
-//    private void checkAndMaybeUpdateProject(final IProject project)
-//    {
-//    	boolean needsPropertyStore = false;
-//
-//    	synchronized(this)
-//    	{
-//    		if (!project.equals(_project))
-//    		{
-//    			_lifecycleListener.removeResource(_project);
-//    			_project = project;
-//    			_lifecycleListener.addResource(_project);
-//    			_properties.setProject(project);
-//    			needsPropertyStore = true;
-//    		}
-//    	}
-//    	
-//    	if (needsPropertyStore)
-//    	{
-//    		_properties.store();
-//    	}
-//    }
-
-    private synchronized void dispose()
-    {
-        if (_isDisposed.compareAndSet(false, true))
-        {
-            // dispose viewhandler
-            removeViewHandler();
-            _lifecycleListener.dispose();
-            _facesContexts.clear();
-        }
-    }
-
-    /**
-     * <p>
-     * The criteria for a project having a JSF design time are:
-     * </p>
-     * 
-     * <ul>
-     * <li>project is non-null.</li>
-     * <li>project is accessible (project.isAccessible() == true)</li>
-     * <li>project has a JSF facet (this implies that it's dependent facets are
-     * also present).</li>
-     * </ul>
-     * 
-     * @param project
-     * @return true if project can have a JSF DesignTimeApplicationManager
-     *         associated with it. getInstance(project) uses this determine if
-     *         should construct an instance for a project.
-     */
-    public static boolean hasJSFDesignTime(final IProject project)
-    {
-        return project != null && project.isAccessible()
-                && JSFAppConfigUtils.isValidJSFProject(project);
-    }
-
-    // instance definition
-    // _project must be writable in case the manager needs to be retargetted
-    // after a rename/move etc.
-    private final IProject                       _project;
-    private final IExternalContextFactoryLocator _locator;
-    private final LifecycleListener              _lifecycleListener;
-    private final AtomicBoolean                  _isDisposed;
-    private final ViewHandlerManager             _viewHandlerManager;
-    private final Map<IFile, DTFacesContext>     _facesContexts;
-
-    private DesignTimeApplicationManager(final IProject project)
-    {
-        _project = project;
-        _locator = new MyExternalContextFactoryLocator();
-        _isDisposed = new AtomicBoolean();
-        _lifecycleListener = new LifecycleListener(_project, ResourcesPlugin.getWorkspace());
-        _lifecycleListener.addListener(new IResourceLifecycleListener()
-        {
-            public EventResult acceptEvent(final ResourceLifecycleEvent event)
-            {
-                if (event.getAffectedResource() == _project)
-                {
-                    if (event.getEventType() == ResourceLifecycleEvent.EventType.RESOURCE_INACCESSIBLE
-                            && event.getReasonType() == ResourceLifecycleEvent.ReasonType.RESOURCE_PROJECT_CLOSED)
-                    {
-                        dispose();
-                    }
-                }
-                return EventResult.getDefaultEventResult();
-            }
-        });
-
-        final PropertyFileManager properties = new PropertyFileManager(_project);
-
-        _viewHandlerManager = new ViewHandlerManager(properties);
-        _facesContexts = new HashMap<IFile, DTFacesContext>();
-    }
-
-    /**
-     * Method is thread-safe and may block the caller.
-     * 
-     * @param file
-     *            must not be null
-     * @return the faces context for the file or null if not found
-     */
-    public DTFacesContext getFacesContext(final IFile file)
-    {
-        checkIsDisposed();
-        if (!hasDTFacesContext(file))
-        {
-            return null;
-        }
-
-        synchronized (_facesContexts)
-        {
-            DTFacesContext context = _facesContexts.get(file);
-            if (context == null)
-            {
-                context = new DTFacesContext(file, _locator);
-                context.initialize(_lifecycleListener);
-                _facesContexts.put(file, context);
-            }
-            return context;
-        }
-    }
-
-    /**
-     * Method is thread-safe and may block the caller.
-     * 
-     * Only files for which a runtime request context will be generated have a
-     * corresponding design time context. This is generally confined to view
-     * definition files such as JSP's.
-     * 
-     * General criteria for a file to have a design time faces context are: -
-     * the file is non-null and isAccessible() - the file has designtime view
-     * handler (getViewHandler(file) != null) and it supports the content type
-     * of file.
-     * 
-     * getFacesContext uses this to decide whether to generate a context for an
-     * IFile.
-     * 
-     * @param file
-     * @return true if file has a design time faces context
-     */
-    public boolean hasDTFacesContext(final IFile file)
-    {
-        checkIsDisposed();
-        final IDTViewHandler viewHandler = getViewHandler();
-
-        if (file != null && file.isAccessible() && viewHandler != null
-                && viewHandler.supportsViewDefinition(file))
-        {
-            return true;
-        }
-        return false;
-    }
-
-    /**
-     * Method is thread-safe and may block the caller.
-     * 
-     * @return the design time view handler for this webapp (project).
-     */
-    public IDTViewHandler getViewHandler()
-    {
-    	checkIsDisposed();
-      /* NOTE: it is critical that view handler calls _NEVER_ take the 
-         DesignTimeApplicationManager lock.  let ViewHandlerManager manage it
-         instead.*/
-        return _viewHandlerManager.getViewHandler(_project, _lifecycleListener);
-    }
-
-    /**
-     * Remove and dispose of any currently registered view handler
-     */
-    private void removeViewHandler()
-    {
-        /* NOTE: it is critical that view handler calls _NEVER_ take the 
-        DesignTimeApplicationManager lock.  let ViewHandlerManager manage it
-        instead.*/
-        _viewHandlerManager.removeViewHandler(_project);
-    }
-
-    /**
-     * Method is thread-safe and may block the caller.
-     * 
-     * Sets the persistent id on this project that will be used to load the view
-     * handler.
-     * 
-     * @param viewHandlerId
-     */
-    public void setViewHandlerId(final String viewHandlerId)
-    {
-        checkIsDisposed();
-        /* NOTE: it is critical that view handler calls _NEVER_ take the 
-        DesignTimeApplicationManager lock.  let ViewHandlerManager manage it
-        instead.*/
-        _viewHandlerManager.setViewHandlerId(_project, viewHandlerId);
-    }
-
-    /**
-     * Method is thread-safe and may block the caller.
-     * 
-     * @param resolverPluginId
-     * @throws CoreException
-     */
-    public synchronized void setExternalContextProvider(
-            final String resolverPluginId) throws CoreException
-    {
-        checkIsDisposed();
-        _project.setPersistentProperty(
-                PERSIST_PROPERTY_KEY_EXTERNAL_CONTEXT_PROVIDER,
-                resolverPluginId);
-    }
-
-    /**
-     * Method is thread-safe and may block the caller.
-     * 
-     * @return the id of the active design time external context provider
-     */
-    public synchronized String getExternalContextProvider()
-    {
-    	checkIsDisposed();
-        return getResolverId(PERSIST_PROPERTY_KEY_EXTERNAL_CONTEXT_PROVIDER,
-                DEFAULT_EXTERNAL_CONTEXT_ID);
-    }
-
-    /**
-     * Method is thread-safe and may block the caller.
-     * 
-     * @return the designtime variable resolver for this application
-     */
-    public synchronized AbstractDTVariableResolver getVariableResolver()
-    {
-        checkIsDisposed();
-        ExtensionData<AbstractDTVariableResolver> extData = null;
-
-        final String id = getResolverId_OLD(PERSIST_PROPERTY_KEY_VARIABLE_RESOLVER_PROVIDER);
-        if (id != null)
-        {
-            extData = JSFCorePlugin.getVariableResolvers(id);
-        }
-
-        if (extData == null)
-        {
-            extData = JSFCorePlugin
-                    .getVariableResolvers(DEFAULT_VARIABLE_RESOLVER_ID);
-        }
-
-        return extData.getInstance(_project);
-    }
-
-    /**
-     * Method is thread-safe and may block the caller.
-     * 
-     * Sets the plugin used to determine the designtime variable resolver. To
-     * reset to the default, pass null.
-     * 
-     * @param resolverPluginId
-     * @throws CoreException --
-     *             if the setting the new value fails
-     */
-    public synchronized void setVariableResolverProvider(
-            final String resolverPluginId) throws CoreException
-    {
-        checkIsDisposed();
-        _project.setPersistentProperty(
-                PERSIST_PROPERTY_KEY_VARIABLE_RESOLVER_PROVIDER,
-                resolverPluginId);
-    }
-
-    /**
-     * Method is thread-safe and may block the caller.
-     * 
-     * @return the id of the active design time variable resolver
-     */
-    public synchronized String getVariableResolverProvider()
-    {
-    	checkIsDisposed();
-        return getResolverId(PERSIST_PROPERTY_KEY_VARIABLE_RESOLVER_PROVIDER,
-                DEFAULT_VARIABLE_RESOLVER_ID);
-    }
-
-    /**
-     * Method is thread-safe and may block the caller.
-     * 
-     * @return the default property resolver that will be used if no other is
-     *         provided. The default property resolver is intended to match the
-     *         similar resolver used by the runtime.
-     */
-    public synchronized AbstractDTPropertyResolver getDefaultPropertyResolver()
-    {
-        checkIsDisposed();
-        return JSFCorePlugin.getPropertyResolver(DEFAULT_PROPERTY_RESOLVER_ID)
-                .getInstance(_project);
-    }
-
-    /**
-     * Method is thread-safe and may block the caller.
-     * 
-     * @return the designtime property resolver for this application
-     */
-    public synchronized AbstractDTPropertyResolver getPropertyResolver()
-    {
-        checkIsDisposed();
-
-        ExtensionData<AbstractDTPropertyResolver> extData = null;
-
-        final String id = getResolverId_OLD(PERSIST_PROPERTY_KEY_PROPERTY_RESOLVER_PROVIDER);
-        if (id != null)
-        {
-            extData = JSFCorePlugin.getPropertyResolver(id);
-        }
-
-        if (extData == null)
-        {
-            extData = JSFCorePlugin
-                    .getPropertyResolver(DEFAULT_PROPERTY_RESOLVER_ID);
-        }
-
-        return extData.getInstance(_project);
-    }
-
-    /**
-     * Method is thread-safe and may block the caller.
-     * 
-     * @param resolverPluginId
-     * @throws CoreException --
-     *             if setting the provider fails
-     */
-    public synchronized void setPropertyResolverProvider(
-            final String resolverPluginId) throws CoreException
-    {
-        checkIsDisposed();
-        _project.setPersistentProperty(
-                PERSIST_PROPERTY_KEY_PROPERTY_RESOLVER_PROVIDER,
-                resolverPluginId);
-    }
-
-    /**
-     * Method is thread-safe and may block the caller.
-     * 
-     * @return the id of the active design time variable resolver
-     */
-    public synchronized String getPropertyResolverProvider()
-    {
-        checkIsDisposed();
-        return getResolverId(PERSIST_PROPERTY_KEY_PROPERTY_RESOLVER_PROVIDER,
-                DEFAULT_PROPERTY_RESOLVER_ID);
-    }
-
-    /**
-     * Method is thread-safe and may block the caller.
-     * 
-     * @return the designtime method resolver for this application
-     */
-    public synchronized AbstractDTMethodResolver getMethodResolver()
-    {
-    	checkIsDisposed();
-        ExtensionData<AbstractDTMethodResolver> extData = null;
-
-        final String id = getResolverId_OLD(PERSIST_PROPERTY_KEY_METHOD_RESOLVER_PROVIDER);
-        if (id != null)
-        {
-            extData = JSFCorePlugin.getMethodResolvers(id);
-        }
-
-        if (extData == null)
-        {
-            extData = JSFCorePlugin
-                    .getMethodResolvers(DEFAULT_METHOD_RESOLVER_ID);
-        }
-
-        return extData.getInstance(_project);
-    }
-
-    /**
-     * Method is thread-safe and may block the caller.
-     * 
-     * @param resolverPluginId
-     * @throws CoreException --
-     *             if setting the plugin fails
-     */
-    public synchronized void setMethodResolverProvider(
-            final String resolverPluginId) throws CoreException
-    {
-        checkIsDisposed();
-        _project
-                .setPersistentProperty(
-                        PERSIST_PROPERTY_KEY_METHOD_RESOLVER_PROVIDER,
-                        resolverPluginId);
-    }
-
-    /**
-     * Method is thread-safe and may block the caller.
-     * 
-     * @return the id of the active design time variable resolver
-     */
-    public synchronized String getMethodResolverProvider()
-    {
-        checkIsDisposed();
-        return getResolverId(PERSIST_PROPERTY_KEY_METHOD_RESOLVER_PROVIDER,
-                DEFAULT_METHOD_RESOLVER_ID);
-    }
-
-    private String getResolverId_OLD(final QualifiedName pluginKey)
-    {
-        String pluginId = null;
-
-        try
-        {
-            pluginId = _project.getPersistentProperty(pluginKey);
-        }
-        catch (final CoreException ce)
-        {
-            JSFCorePlugin.getDefault().getLog().log(
-                    new Status(IStatus.ERROR, JSFCorePlugin.PLUGIN_ID, 0,
-                            "Error getting plugin property", //$NON-NLS-1$
-                            ce));
-            pluginId = null;
-            // fall-through and use the default
-        }
-
-        return pluginId;
-    }
-
-    private String getResolverId(final QualifiedName key,
-            final String defaultValue)
-    {
-        String id = defaultValue;
-
-        try
-        {
-            final String userId = _project.getPersistentProperty(key);
-
-            if (userId != null)
-            {
-                id = userId;
-            }
-        }
-        catch (final CoreException ce)
-        {
-            // do nothing; fall through and return default
-        }
-
-        return id;
-    }
-
-    private class MyExternalContextFactoryLocator implements
-            IExternalContextFactoryLocator
-    {
-        public AbstractDTExternalContextFactory getFactory()
-        {
-            ExtensionData<AbstractDTExternalContextFactory> extData = null;
-
-            final String id = getResolverId_OLD(PERSIST_PROPERTY_KEY_EXTERNAL_CONTEXT_PROVIDER);
-            if (id != null)
-            {
-                extData = JSFCorePlugin.getExternalContextProviders(id);
-            }
-
-            if (extData == null)
-            {
-                extData = JSFCorePlugin
-                        .getExternalContextProviders(DEFAULT_EXTERNAL_CONTEXT_ID);
-            }
-
-            return extData.getInstance(_project);
-        }
-    }
-
-    private void checkIsDisposed()
-    {
-        // TODO: need to add isDisposed to this and throw an exception
-        // for now, we just log what's happening to aid debugging
-        if (_isDisposed.get())
-        {
-            JSFCorePlugin
-                    .log(
-                            "A call to a disposed DesignTimeApplicationManager was attempted", //$NON-NLS-1$
-                            new Throwable(
-                                    "This exception is only to record a stack trace")); //$NON-NLS-1$
-        }
-    }
-
-    private static class ViewHandlerManager
-    {
-        private final PropertyFileManager _propertyFileManager;
-
-        ViewHandlerManager(final PropertyFileManager properties)
-        {
-            _propertyFileManager = properties;
-        }
-
-        public synchronized void removeViewHandler(final IProject project)
-        {
-            final String viewHandlerId = getHandlerId(project);
-
-            if (viewHandlerId != null)
-            {
-                final ExtensionData<AbstractDTViewHandler> extData =
-                    JSFCorePlugin.getViewHandlers(viewHandlerId);
-                
-                if (extData != null)
-                {
-                    final AbstractDTViewHandler handler = extData.removeInstance(project);
-                    if (handler != null)
-                    {
-                        handler.dispose();
-                    }
-                }
-            }
-        }
-
-        protected String getHandlerId(final IProject project)
-        {
-            IProjectFacetVersion projectFacet = JSFAppConfigUtils.getProjectFacet(project);
-            if (projectFacet != null)
-            {
-                JSFVersion projectVersion = JSFVersion.valueOfFacetVersion(projectFacet);
-                
-                String defaultHandler = PRE_20_DEFAULT_VIEW_HANDLER_ID;
-                
-                // starting with JSF 2.0 a new view handler that first
-                // processes as Facelet and then delegates to JSP is
-                // used by default
-                // TODO: check the web.xml flag that reverts things to 1.2 defaults
-                if (projectVersion.compareTo(JSFVersion.V2_0) >= 0)
-                {
-                    defaultHandler = JSF_20_DEFAULT_VIEW_HANDLER_ID;
-                }
-                final String viewHandlerId = _propertyFileManager
-                        .getProperty(PERSIST_PROPERTY_NAME_VIEW_HANDLER,
-                               defaultHandler);
-                return viewHandlerId;
-            }
-            return null;
-        }
-        
-
-        public synchronized IDTViewHandler getViewHandler(
-                final IProject project, final LifecycleListener listener)
-        {
-            
-            final String viewHandlerId = getHandlerId(project);
-
-            if (viewHandlerId != null)
-            {
-                ExtensionData<AbstractDTViewHandler> viewHandlers = JSFCorePlugin
-                        .getViewHandlers(viewHandlerId);
-                if (viewHandlers == null)
-                {
-                    viewHandlers = JSFCorePlugin
-                            .getViewHandlers(PRE_20_DEFAULT_VIEW_HANDLER_ID);
-                }
-
-                final AbstractDTViewHandler viewHandler = viewHandlers
-                        .getInstance(project);
-                viewHandler.setLifecycleListener(listener);
-                return viewHandler;
-            }
-            return null;
-        }
-
-        public void setViewHandlerId(final IProject project,
-                final String viewHandlerId)
-        {
-            // remove any previous handler before the id is lost
-            removeViewHandler(project);
-            _propertyFileManager.setProperty(
-                    PERSIST_PROPERTY_NAME_VIEW_HANDLER, viewHandlerId);
-        }
-    }
-    
-    private static class PropertyFileManager
-    {
-        private final Properties                     _properties;
-        private IProject                             _project;
-
-        PropertyFileManager(final IProject project)
-        {
-            _project = project;
-            _properties = new Properties();
-            load(_project, _properties);
-        }
-
-        private synchronized IProject getProject()
-        {
-            return _project;
-        }
-
-        public void setProperty(final String key, final String value) {
-            _properties.setProperty(key, value);
-            store();
-        }
-
-        public String getProperty(final String key, final String defaultValue) {
-            return _properties.getProperty(key, defaultValue);
-        }
-
-        public void store()
-        {
-            final IWorkspaceRunnable storeJob = new IWorkspaceRunnable()
-            {
-                public void run(IProgressMonitor monitor) throws CoreException {
-                    IFile propFile;
-
-                    try {
-                        propFile = getPropsFile(getProject());
-                        if (propFile != null) {
-                            final ByteArrayOutputStream outstream = new ByteArrayOutputStream();
-                            // properties will thread-safe save to the array
-                            // stream
-                            // no further locking is needed since we have
-                            // already have a lock
-                            // on the workspace sub-tree for the settings file
-                            // if this job
-                            // is running.
-                            _properties.store(outstream, null);
-                            propFile.setContents(new ByteArrayInputStream(
-                                    outstream.toByteArray()), true, true, null);
-                        }
-                    } catch (final CoreException e) {
-                        JSFCorePlugin.log(e, "Problem storing properties"); //$NON-NLS-1$
-                    } catch (final IOException e) {
-                        JSFCorePlugin.log(e, "Problem storing properties"); //$NON-NLS-1$
-                    }
-                }
-            };
-
-            final IWorkspace workspace = ResourcesPlugin.getWorkspace();
-            
-            try
-            {
-                // need to lock the project tree, since may need to create
-                // .settings directory
-                workspace.run(storeJob, getProject(), IWorkspace.AVOID_UPDATE,
-                        null);
-            } catch (CoreException ce)
-            {
-                JSFCorePlugin.log(ce, "Problem storing properties"); //$NON-NLS-1$
-            }
-        }
-
-        private static void load(final IProject project,
-                final Properties properties)
-        {
-            try
-            {
-                final IFile propFile = getPropsFileHandle(project);
-
-                if (propFile != null && propFile.isAccessible())
-                {
-                    InputStream inStream = null;
-
-                    try
-                    {
-                        inStream = propFile.getContents();
-                        properties.load(inStream);
-                    } 
-                    finally
-                    {
-                        if (inStream != null)
-                        {
-                            inStream.close();
-                        }
-                    }
-                }
-            } 
-            catch (final CoreException ce)
-            {
-                JSFCorePlugin.log(ce, "Problem loading properties"); //$NON-NLS-1$
-            } 
-            catch (final IOException ce)
-            {
-                JSFCorePlugin.log(ce, "Problem loading properties"); //$NON-NLS-1$
-            }
-        }
-
-        private static IFile getPropsFile(final IProject project) throws CoreException
-        {
-            final IFolder folder = project.getFolder(new Path(SETTINGS_DIR_NAME));
-            if (!folder.exists())
-            {
-                folder.create(false, true, null);
-            }
-
-            final IFile file = folder.getFile(new Path(ORG_ECLIPSE_JST_JSF_DESIGNTIME_APPMGR_PREFS));
-
-            if (!file.exists())
-            {
-                file.create(new ByteArrayInputStream(new byte[0]), false, null);
-            }
-
-            return file;
-        }
-        
-        /**
-         * @param project
-         * @return the file handle for the properties file.  Doesn't create the
-         * resource if it doesn't exist
-         */
-        private static IFile getPropsFileHandle(final IProject project)
-        {
-            return project.getFile(new Path(SETTINGS_DIR_NAME).append(ORG_ECLIPSE_JST_JSF_DESIGNTIME_APPMGR_PREFS));
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/context/AbstractDTExternalContext.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/context/AbstractDTExternalContext.java
deleted file mode 100644
index b0bac6a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/context/AbstractDTExternalContext.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.designtime.context;
-
-import java.util.Collections;
-import java.util.Map;
-
-import org.eclipse.jst.jsf.context.symbol.ISymbol;
-import org.eclipse.jst.jsf.context.symbol.source.ISymbolConstants;
-
-/**
- * The parent of all IDTExternalContext implementations
- * 
- * Clients must sub-class to create IDTExternalContext implementations
- * 
- * @author cbateman
- *
- */
-public abstract class AbstractDTExternalContext implements IDTExternalContext 
-{
-    
-    /**
-     * Return a map of available symbols in each of the masked scopes
-     * indexed by symbol name
-     * 
-     * Called by {@link #getMapForScope(int)} to satify the interface.
-     * If null is returned {@link #getMapForScope(int)} will automatically
-     * return an EMPTY_MAP.
-     * 
-     * @param scopeMask
-     * @return the map of symbols
-     */
-    protected abstract Map<String, ISymbol> doGetMapForScope(int scopeMask);
-    
-    
-    public final  Map<String, ISymbol> getMapForScope(final int scopeMask)
-    {
-        Map<String, ISymbol> mapForScope = doGetMapForScope(scopeMask);
-        
-        if (mapForScope == null)
-        {
-            mapForScope = Collections.EMPTY_MAP;
-        }
-        else
-        {
-            mapForScope = Collections.unmodifiableMap(mapForScope);
-        }
-        return mapForScope;
-    }
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.jsf.designtime.context.IDTExternalContext#getRequestMap()
-     */
-    public final Map<String, ISymbol> getRequestMap()
-    {
-        return getMapForScope(ISymbolConstants.SYMBOL_SCOPE_REQUEST);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.jsf.designtime.context.IDTExternalContext#getSessionMap()
-     */
-    public final Map<String, ISymbol> getSessionMap()
-    {
-        return getMapForScope(ISymbolConstants.SYMBOL_SCOPE_SESSION);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.jsf.designtime.context.IDTExternalContext#getApplicationMap()
-     */
-    public final Map<String, ISymbol> getApplicationMap()
-    {
-        return getMapForScope(ISymbolConstants.SYMBOL_SCOPE_APPLICATION);
-    }
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.jsf.designtime.context.IDTExternalContext#getNoneMap()
-     */
-    public final Map<String, ISymbol> getNoneMap() 
-    {
-        return getMapForScope(ISymbolConstants.SYMBOL_SCOPE_NONE);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.jsf.designtime.context.IDTExternalContext#getRequestContextPath()
-     */
-    public String getRequestContextPath() 
-    {
-        // API: do we need to support default behaviour here?
-        return null;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/context/AbstractDTExternalContextFactory.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/context/AbstractDTExternalContextFactory.java
deleted file mode 100644
index b2fbbbf..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/context/AbstractDTExternalContextFactory.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.designtime.context;
-
-import org.eclipse.core.runtime.IAdaptable;
-
-/**
- * Super-class of all external context factories
- * 
- * @author cbateman
- *
- */
-public abstract class AbstractDTExternalContextFactory 
-{
-    /**
-     * @param containerContext
-     * @return a new IDTExternalContext for the containerContext refered 
-     * to by containerContext.
-     */
-    public abstract IDTExternalContext create(IAdaptable containerContext);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/context/AbstractExternalContextFactoryLocator.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/context/AbstractExternalContextFactoryLocator.java
deleted file mode 100644
index 77ae086..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/context/AbstractExternalContextFactoryLocator.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.designtime.context;
-
-/**
- * Parent of all implementers of IExternalContextFactoryLocator
- * @author cbateman
- *
- */
-public abstract class AbstractExternalContextFactoryLocator implements
-        IExternalContextFactoryLocator 
-{
-    /**
-     * @return the current external context factory
-     */
-    public abstract AbstractDTExternalContextFactory getFactory();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/context/DTFacesContext.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/context/DTFacesContext.java
deleted file mode 100644
index f4b0387..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/context/DTFacesContext.java
+++ /dev/null
@@ -1,207 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- * 
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.designtime.context;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jst.jsf.common.internal.resource.EventResult;
-import org.eclipse.jst.jsf.common.internal.resource.IResourceLifecycleListener;
-import org.eclipse.jst.jsf.common.internal.resource.LifecycleListener;
-import org.eclipse.jst.jsf.common.internal.resource.ResourceLifecycleEvent;
-import org.eclipse.jst.jsf.common.internal.resource.ResourceLifecycleEvent.EventType;
-import org.eclipse.jst.jsf.designtime.DesignTimeApplicationManager;
-import org.eclipse.jst.jsf.designtime.internal.view.IDTViewHandler;
-import org.eclipse.jst.jsf.designtime.internal.view.IViewRootHandle;
-
-/**
- * Represents a design-time version of the JSF FacesContext for a particular web
- * application.
- * 
- * Client may not sub-class.
- * 
- * @author cbateman
- * 
- */
-public final class DTFacesContext
-{
-    private final IExternalContextFactoryLocator _locator;
-    private final IAdaptable                     _contextObject;
-    private final ViewRootHolder                 _viewRootHolder;
-    private LifecycleListener                    _lifecycleListener;
-    private IResourceLifecycleListener           _listener;
-
-    /**
-     * @param contextObject
-     * @param locator
-     */
-    public DTFacesContext(final IAdaptable contextObject,
-            final IExternalContextFactoryLocator locator)
-    {
-        _contextObject = contextObject;
-        _locator = locator;
-
-        // init last -- NOTE: it is essential that the new Object be unique
-        _viewRootHolder = new ViewRootHolder(this, new Object());
-    }
-
-    /**
-     * @param locator
-     * @deprecated Use DTFacesContext(IAdaptable,
-     *             IExternalContextFactoryLocator)
-     */
-    @Deprecated
-    public DTFacesContext(final IExternalContextFactoryLocator locator)
-    {
-        _locator = locator;
-        _contextObject = null;
-
-        // init last -- NOTE: it is essential that the new Object be unique
-        _viewRootHolder = new ViewRootHolder(this, new Object());
-    }
-
-    /**
-     * THIS IS NOT AN API METHOD. External clients must not call.
-     * 
-     * initilaize the faces context.
-     * @param lifecycleListener 
-     */
-    public void initialize(final LifecycleListener lifecycleListener)
-    {
-        final IResource res = adaptContextObject();
-        _lifecycleListener = lifecycleListener;
-        
-        if (res != null && _lifecycleListener != null)
-        {
-            _listener = new IResourceLifecycleListener()
-            {
-                public EventResult acceptEvent(ResourceLifecycleEvent event)
-                {
-                    if (res.equals(event.getAffectedResource()))
-                    {
-                        if (event.getEventType() == EventType.RESOURCE_INACCESSIBLE)
-                        {
-                            _lifecycleListener.removeResource(res);
-                        }
-                    }
-                    return EventResult.getDefaultEventResult();
-                }
-            };
-
-            _lifecycleListener.addResource(res);
-            _lifecycleListener.addListener(_listener);
-        }
-    }
-
-    /**
-     * @param contextObject --
-     *            the object corresponding to the external context. Usually an
-     *            IFile point to a file containing the external context. It must
-     *            be adaptable to an IFile.
-     * 
-     * @return the designtime external context or null if one is not defined for
-     *         this contextObject
-     */
-    public IDTExternalContext getDTExternalContext(
-            final IAdaptable contextObject)
-    {
-        IDTExternalContext externalContext = null;
-
-        // if the context object is an IFile or can be adapted to one, create a
-        // new externalContext for it
-        if (contextObject instanceof IFile
-                || (contextObject != null && contextObject
-                        .getAdapter(IFile.class) != null))
-        {
-
-            final AbstractDTExternalContextFactory factory = _locator
-                    .getFactory();
-            externalContext = factory.create(contextObject);
-        }
-        return externalContext;
-    }
-
-    /**
-     * <p>
-     * Returns a new copy of the view root handle.
-     * </p>
-     * 
-     * return null if the value of the view root
-     * 
-     * @return the cached view root. May be null.
-     */
-    public IViewRootHandle getViewRootHandle()
-    {
-        return _viewRootHolder.clone();
-    }
-
-    /**
-     * @deprecated
-     */
-    @Deprecated
-    private String _localeString = ""; //$NON-NLS-1$
-
-    /**
-     * @return the current locale string
-     * @deprecated Use IDTViewHandler.calculateLocale instead
-     */
-    @Deprecated
-    public String getLocaleString()
-    {
-        return _localeString;
-    }
-
-    /**
-     * @param newLocaleString
-     * @deprecated Use IDTViewHandler.calculateLocale instead
-     */
-    @Deprecated
-    public void setLocaleString(final String newLocaleString)
-    {
-        _localeString = newLocaleString;
-    }
-
-    /**
-     * @return the resource correspondinng to context object or null if it
-     *         cannot be adapted to an IResource
-     */
-    public IResource adaptContextObject()
-    {
-        if (_contextObject instanceof IResource)
-        {
-            return (IResource) _contextObject;
-        }
-        else if (_contextObject != null
-                && _contextObject.getAdapter(IResource.class) != null)
-        {
-            return (IResource) _contextObject.getAdapter(IResource.class);
-        }
-        return null;
-    }
-
-    IDTViewHandler getViewHandler(final IResource res)
-    {
-        IDTViewHandler viewHandler = null;
-
-        if (res != null)
-        {
-            final DesignTimeApplicationManager manager = DesignTimeApplicationManager
-                    .getInstance(res.getProject());
-            if (manager != null)
-            {
-                viewHandler = manager.getViewHandler();
-            }
-        }
-        return viewHandler;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/context/DTJSPExternalContext.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/context/DTJSPExternalContext.java
deleted file mode 100644
index 8c870d1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/context/DTJSPExternalContext.java
+++ /dev/null
@@ -1,173 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.designtime.context;
-
-import java.io.PrintStream;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jst.j2ee.web.componentcore.util.WebArtifactEdit;
-import org.eclipse.jst.jsf.common.JSFCommonPlugin;
-import org.eclipse.jst.jsf.context.symbol.ISymbol;
-import org.eclipse.jst.jsf.context.symbol.source.ISymbolConstants;
-import org.eclipse.jst.jsf.context.symbol.source.ISymbolSourceProvider;
-import org.eclipse.jst.jsf.context.symbol.source.ISymbolSourceProviderFactory;
-
-
-/**
- * A designtime proxy for the Faces ExternalContext
- * 
- * Clients may sub-class.
- * 
- * @author cbateman
- *
- */
-public class DTJSPExternalContext extends AbstractDTExternalContext 
-{
-    /**
-     * 
-     */
-    private final IFile     _jspFile;
-
-    /**
-     * Construct a default external context
-     * 
-     * @param jspFile
-     */
-    protected DTJSPExternalContext(final IAdaptable  jspFile)
-    {
-        if (jspFile instanceof IFile)
-        {
-            _jspFile = (IFile) jspFile;
-        }
-        else if (jspFile != null)
-        {
-            IFile file = (IFile) jspFile.getAdapter(IFile.class);
-            
-            if (file != null)
-            {
-                _jspFile = file;
-            }
-            else
-            {
-                _jspFile = null;
-                throw new AssertionError("jspFile must be adapable to an IFile"); //$NON-NLS-1$
-            }
-        }
-        else
-        {
-            _jspFile = null;
-            throw new AssertionError("jspFile must be adapable to an IFile"); //$NON-NLS-1$
-        }
-    }
-
-    @Override
-    protected Map doGetMapForScope(final int scopeMask) 
-    {
-        final Map  map = new HashMap();
-        
-        for (final Iterator it = JSFCommonPlugin.getSymbolSourceProviders().iterator(); it.hasNext();)
-        {
-            final ISymbolSourceProviderFactory  factory = (ISymbolSourceProviderFactory) it.next();
-            final ISymbolSourceProvider provider = factory.createInstance(_jspFile.getProject());
-            
-            final ISymbol[] symbols = provider.getSymbols(_jspFile, scopeMask);
-            
-            for (int i = 0; i < symbols.length; i++)
-            {
-                map.put(symbols[i].getName(), symbols[i]);
-            }
-        }
-
-        return map;
-    }
-
-    /**
-     * @param stream
-     */
-    public final void trace(PrintStream stream)
-    {
-        String[]  scopeNames = {ISymbolConstants.SYMBOL_SCOPE_REQUEST_STRING, 
-                                ISymbolConstants.SYMBOL_SCOPE_SESSION_STRING, 
-                                ISymbolConstants.SYMBOL_SCOPE_APPLICATION_STRING,
-                                ISymbolConstants.SYMBOL_SCOPE_NONE_STRING
-                                };
-        Map[]     symbolMaps = {getRequestMap(), getSessionMap(), getApplicationMap(), getNoneMap()};
-
-        for (int i = 0; i < scopeNames.length; i++)
-        {
-            stream.println("--------------"); //$NON-NLS-1$
-            stream.println(scopeNames[i]+" Scope:"); //$NON-NLS-1$
-            stream.println("--------------"); //$NON-NLS-1$
-
-            for (final Iterator it = symbolMaps[i].values().iterator(); it.hasNext();)
-            {
-                ISymbol symbol = (ISymbol) it.next();
-                System.out.println(symbol.getName());
-            }
-        }
-    }
-
-    @Override
-    public String getRequestContextPath() 
-    {
-        WebArtifactEdit  artifactEdit = null;
-        String path = null;
-        
-        try
-        {
-            // TODO: EARs?
-            artifactEdit = 
-                WebArtifactEdit.getWebArtifactEditForRead(_jspFile.getProject());
-            path = artifactEdit.getServerContextRoot();
-        }
-        finally
-        {
-            if (artifactEdit != null)
-            {
-                artifactEdit.dispose();
-            }
-        }
-        return path;
-    }
-
-//    @Override
-//    public String getRequestPathInfo() {
-//        // TODO Auto-generated method stub
-//        return super.getRequestPathInfo();
-//    }
-//
-//    @Override
-//    public String getRequestServletPath() {
-//        // TODO Auto-generated method stub
-//        return super.getRequestServletPath();
-//    }
-
-//    private void getWebApp()
-//    {
-//        final IProject project = _jspFile.getProject();
-//
-//        final IModelProvider provider = 
-//            ModelProviderManager.getModelProvider(project);
-//        Object webAppObj = provider.getModelObject();
-//        
-//        if (webAppObj != null)
-//        {
-//            //
-//        }
-//        
-//    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/context/DefaultDTExternalContextFactory.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/context/DefaultDTExternalContextFactory.java
deleted file mode 100644
index 1d2af78..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/context/DefaultDTExternalContextFactory.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.designtime.context;
-
-import org.eclipse.core.runtime.IAdaptable;
-
-/**
- * Creates external contexts for JSPs
- * 
- * Clients may sub-class
- * 
- * @author cbateman
- *
- */
-public class DefaultDTExternalContextFactory extends
-        AbstractDTExternalContextFactory 
-{
-
-    /**
-     * @param containerContext -- must be adaptable to an IFile of content type
-     * JSP
-     *  
-     * @return a new DT external context
-     */
-    public IDTExternalContext create(final IAdaptable containerContext) 
-    {
-        return new DTJSPExternalContext(containerContext);
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/context/IDTExternalContext.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/context/IDTExternalContext.java
deleted file mode 100644
index 2b76cb8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/context/IDTExternalContext.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.designtime.context;
-
-import java.util.Map;
-
-import org.eclipse.jst.jsf.context.symbol.ISymbol;
-
-/**
- * Interface that must be implemented by all design time external contexts
- * 
- * Clients must not implement or sub-class.  Sub-class AbstractDTExternalContext instead.
- * 
- * @author cbateman
- *
- */
-public interface IDTExternalContext 
-{
-    /**
-     * @param scopeMask -- the scope for which to return the symbol map
-     * @return a map of ISymbols representing the currently available
-     * scope variables.  Never null, empty if no symbols
-     * 
-     * Map is unmodifiable (throws exception on mutation operations)
-     */
-    Map<String, ISymbol> getMapForScope(int scopeMask);
-
-    /**
-     * @return a map of ISymbols representing the currently available
-     * request scope variables.  Never null, empty if no symbols
-     * 
-     * Map is unmodifiable (throws exception on mutation operations)
-     */
-    Map<String, ISymbol> getRequestMap();
-
-    /**
-     * @return a map of ISymbols representing the currently available
-     * session scope variables.  Never null, empty if no symbols
-     * Map is unmodifiable (throws exception on mutation operations)
-     */
-    Map<String, ISymbol> getSessionMap();
-
-    /**
-     * @return a map of ISymbols representing the currently available
-     * application scope variables.  Never null, empty if no symbols
-     * Map is unmodifiable (throws exception on mutation operations)
-     */
-    Map<String, ISymbol> getApplicationMap();
-    
-    /**
-     * @return a map of ISymbols representing the currently available
-     * none scope variables.  Never null, empty if no symbols
-     * Map is unmodifiable (throws exception on mutation operations)
-     */
-    Map<String, ISymbol> getNoneMap();
-    
-    /**
-     * Servlet 2.3_SRV.4.4: The context path of the application. 
-     * 
-     * @return the request context path
-     */
-    String getRequestContextPath();
-
-    /**
-     * Find all of the possible url-pattern's in the container that 
-     * could match the underlying resource.  Normally this will be single
-     * element list.  It will only 
-     * 
-     * @return
-     */
-//    List<String> getAllContainerMappings();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/context/IExternalContextFactoryLocator.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/context/IExternalContextFactoryLocator.java
deleted file mode 100644
index 0842ed8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/context/IExternalContextFactoryLocator.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.designtime.context;
-
-/**
- * This interface is used to decouple the faces context from the 
- * DesignTimeApplicationManager
- * 
- * Client must NOT implement or subclass.
- * Extend AbstractExternalContextFactoryLocator instead
- * 
- * @author cbateman
- *
- */
-public interface IExternalContextFactoryLocator 
-{
-    /**
-     * @return the current external context factory
-     */
-    AbstractDTExternalContextFactory getFactory();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/context/ViewRootHolder.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/context/ViewRootHolder.java
deleted file mode 100644
index d333496..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/context/ViewRootHolder.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-/**
- * 
- */
-package org.eclipse.jst.jsf.designtime.context;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.designtime.internal.view.DTUIViewRoot;
-import org.eclipse.jst.jsf.designtime.internal.view.IDTViewHandler;
-import org.eclipse.jst.jsf.designtime.internal.view.IViewRootHandle;
-import org.eclipse.jst.jsf.designtime.internal.view.DTUIViewRoot.StalenessListener;
-import org.eclipse.jst.jsf.designtime.internal.view.IDTViewHandler.ViewHandlerException;
-
-/* package */ final class ViewRootHolder implements IViewRootHandle, Cloneable
-{
-    private final Object         _recalcViewRootExclusion;
-    private final DTFacesContext _facesContext;
-    private DTUIViewRoot         _viewRoot;
-    private final List<StalenessListener>  _waitingToAdd;
-    private final List<StalenessListener>  _waitingToRemove;
-
-    public ViewRootHolder(final DTFacesContext facesContext, final Object recalcViewRootExclusion)
-    {
-        _facesContext = facesContext;
-        _recalcViewRootExclusion = recalcViewRootExclusion;
-        _waitingToAdd = new ArrayList<StalenessListener>();
-        _waitingToRemove = new ArrayList<StalenessListener>();
-    }
-
-    private ViewRootHolder(ViewRootHolder cloneFrom)
-    {
-        _recalcViewRootExclusion = cloneFrom._recalcViewRootExclusion;
-        _facesContext = cloneFrom._facesContext;
-        _viewRoot = cloneFrom.getCachedViewRoot();
-
-        // create brand new copies
-        _waitingToAdd = new ArrayList<StalenessListener>();
-        _waitingToRemove = new ArrayList<StalenessListener>();
-    }
-
-    public synchronized DTUIViewRoot getCachedViewRoot()
-    {
-        return _viewRoot;
-    }
-
-    public DTUIViewRoot updateViewRoot()
-    {
-        DTUIViewRoot viewRoot = null;
-        final IResource contextResource = _facesContext.adaptContextObject();
-        
-        // we create this additional exclusion so that we avoid a
-        // situation
-        // where two threads enter and start recalculating the same view
-        // root in parallel. Only one thread may be working on creating
-        // a new view root for a particular view at any given time. Note
-        // that due to read/write lock on the value, there is nothing
-        // to stop readers from simultaneous getting the old value until
-        // the new value is ready and has been set.
-        synchronized (_recalcViewRootExclusion)
-        {
-            viewRoot = getCachedViewRoot();
-
-            if (viewRoot == null || viewRoot.isStale())
-            {
-                // if the view root hasn't been created, then do so
-                // and populate it
-                final IDTViewHandler viewHandler = _facesContext
-                        .getViewHandler(contextResource);
-
-                if (viewHandler != null)
-                {
-                    final String viewId = viewHandler.getViewId(
-                            _facesContext, contextResource);
-
-                    try
-                    {
-                        viewRoot = viewHandler.createView(_facesContext,
-                                viewId);
-                        if (viewRoot != null)
-                        {
-                            setCachedViewRoot(viewRoot);
-                        }
-                        
-                        // do adds first, let remove trump all
-                        for (final StalenessListener addListener : _waitingToAdd)
-                        {
-                            viewRoot.addListener(addListener);
-                        }
-                        
-                        for (final StalenessListener removeListener : _waitingToRemove)
-                        {
-                            viewRoot.removeListener(removeListener);
-                        }
-                    }
-                    catch (final ViewHandlerException e)
-                    {
-                        JSFCorePlugin.log(e,
-                                "While creating dt viewroot for viewId: " //$NON-NLS-1$
-                                        + viewId);
-                    }
-                }
-            }
-        }
-        // return the copy. NEVER return _viewRoot directly since we are not
-        // synchronized here.
-        return viewRoot;
-    }
-
-    private synchronized void setCachedViewRoot(
-            final DTUIViewRoot newViewRoot)
-    {
-        if (!Thread.holdsLock(_recalcViewRootExclusion))
-        {
-            throw new IllegalStateException(
-                    "Must hold _recalcViewRootExclusion to modify view root"); //$NON-NLS-1$
-        }
-        _viewRoot = newViewRoot;
-    }
-
-    @Override
-    protected synchronized IViewRootHandle clone()
-    {
-        return new ViewRootHolder(this);
-    }
-
-    public void addListener(StalenessListener listener)
-    {
-        if (_viewRoot != null)
-        {
-            synchronized(this)
-            {
-                _viewRoot.addListener(listener);
-            }
-        }
-        else
-        {
-            // ensure that if we calculating a new view root, then there isn't
-            // an issue.
-            synchronized(_recalcViewRootExclusion)
-            {
-                synchronized(this)
-                {
-                    _waitingToAdd.add(listener);
-                }
-            }
-        }
-    }
-
-    public void removeListener(StalenessListener listener)
-    {
-        DTUIViewRoot viewRoot = null;
-        
-        synchronized(this)
-        {
-            viewRoot = _viewRoot;
-        }
-
-        if (viewRoot != null)
-        {
-            synchronized(this)
-            {
-                viewRoot.removeListener(listener);
-            }
-        }
-        else
-        {
-            // ensure that if we calculating a new view root, then there isn't
-            // an issue.
-            // always acquire the recalcViewRootExclusion first
-            synchronized(_recalcViewRootExclusion)
-            {
-                synchronized(this)
-                {
-                    _waitingToAdd.add(listener);
-                }
-            }
-        }
-    }
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/context/package-info.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/context/package-info.java
deleted file mode 100644
index 82480ed..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/context/package-info.java
+++ /dev/null
@@ -1,16 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-/**
- * JSF Design Time Context Simulation Classes. 
- */
-package org.eclipse.jst.jsf.designtime.context;
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/el/AbstractDTMethodResolver.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/el/AbstractDTMethodResolver.java
deleted file mode 100644
index da11512..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/el/AbstractDTMethodResolver.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.designtime.el;
-
-import org.eclipse.jst.jsf.context.symbol.IMethodSymbol;
-import org.eclipse.jst.jsf.context.symbol.IObjectSymbol;
-import org.eclipse.jst.jsf.context.symbol.ISymbol;
-
-/**
- * Sub-class of all design time method resolvers
- * 
- * @author cbateman
- *
- */
-public abstract class AbstractDTMethodResolver 
-{
-    /**
-     * Returns a symbol encapsulating the method on base with the name
-     * methodId
-     * 
-     * @param base
-     * @param methodId
-     * @return the symbol for the named methodId or null if not found
-     */
-    public abstract IMethodSymbol getMethod(IObjectSymbol base, Object methodId);
-
-    
-    /**
-     * @param base
-     * @return all method binding symbols for base
-     */
-    public abstract ISymbol[] getMethods(IObjectSymbol base);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/el/AbstractDTPropertyResolver.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/el/AbstractDTPropertyResolver.java
deleted file mode 100644
index 33ab9bb..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/el/AbstractDTPropertyResolver.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.designtime.el;
-
-import org.eclipse.jst.jsf.context.symbol.ISymbol;
-
-/**
- * Super-class of all design time property resolvers
- * 
- * @author cbateman
- *
- */
-public abstract class AbstractDTPropertyResolver 
-{
-    /**
-     * Returns a symbol encapsulating the property on base with the name
-     * properyId.  Note that getProperty may return *more* property symbols
-     * for the same 'base' because some ISymbol's have unconstrained type
-     * descriptors.  For example, a bean that implements java.util.Map,
-     * may have any number of possible properties added at runtime that cannot
-     * be determined at design time.  It is up to implementers of this interface
-     * to decide how (whether) to return these objects at design time 
-     * 
-     * @param base
-     * @param propertyId
-     * @return the symbol for the named propertyId or null if not found
-     */
-    public abstract ISymbol getProperty(ISymbol base, Object propertyId);
-    
-    /**
-     * @param base
-     * @param offset
-     * @return the symbol for the property referred to by the offset 
-     * into base when it is treated as either an array or a list.
-     * The symbol returned is *not* found in the getAllProperties list.
-     */
-    public abstract ISymbol getProperty(ISymbol base, int offset);
-    
-    /**
-     * @param base
-     * @return all properties of base that can be determined concretely
-     * at designtime.  Note that getProperty(base, x) may return non-null
-     * for objects not found in the return from this method. @see getProperty
-     */
-    public abstract ISymbol[] getAllProperties(ISymbol base);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/el/AbstractDTVariableResolver.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/el/AbstractDTVariableResolver.java
deleted file mode 100644
index 532fc5d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/el/AbstractDTVariableResolver.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.designtime.el;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jst.jsf.context.symbol.ISymbol;
-import org.eclipse.jst.jsf.designtime.context.DTFacesContext;
-
-/**
- * Super-class of all design-time variable resolver.  A design time variable
- * resolver 
- * 
- * Clients may sub-class.
- * 
- * @author cbateman
- *
- */
-public abstract class AbstractDTVariableResolver 
-{
-    /**
-     * @param context
-     * @param name
-     * @param externalContextKey -- an adapter that identifies the external application
-     * context within which to resolve name.  For example, this could be an IFile
-     * representing a JavaServer Page in which we want to resolve the symbol name
-     * @return the symbol corresponding to name in the faces context or null
-     * if not found
-     */
-    public abstract ISymbol resolveVariable(DTFacesContext context, String name, IAdaptable externalContextKey);
-    
-    /**
-     * @param facesContext
-     * @param externalContextKey
-     * @return all variables
-     */
-    public abstract ISymbol[] getAllVariables(DTFacesContext facesContext, 
-            IAdaptable externalContextKey);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/el/DefaultDTMethodResolver.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/el/DefaultDTMethodResolver.java
deleted file mode 100644
index bc6814b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/el/DefaultDTMethodResolver.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.designtime.el;
-
-import java.util.Iterator;
-
-import org.eclipse.jst.jsf.context.symbol.IMethodSymbol;
-import org.eclipse.jst.jsf.context.symbol.IObjectSymbol;
-import org.eclipse.jst.jsf.context.symbol.ISymbol;
-
-/**
- * This resolver has no direct analogue at runtime.  JSF Components implement
- * method bindings at runtime in a runtime specific way.  But at design time
- * we have no direct DTComponent so instead we use this resolver to resolve
- * an IInstanceSymbol and method name to an IMethodSymbol (if one exists).
- * 
- * Clients may sub-class
- * 
- * @author cbateman
- *
- */
-public class DefaultDTMethodResolver extends AbstractDTMethodResolver
-{
-    /**
-     * Returns a symbol encapsulating the method on base with the name
-     * methodId
-     * 
-     * @param base
-     * @param methodId
-     * @return the symbol for the named methodId or null if not found
-     */
-    public IMethodSymbol getMethod(IObjectSymbol base, Object methodId)
-    {
-        for (final Iterator it = base.getTypeDescriptor().getMethods().iterator(); it.hasNext();)
-        {
-            IMethodSymbol element = (IMethodSymbol) it.next();
-            if (element.getName().equals(methodId))
-            {
-                return element;
-            }
-        }
-
-        return null;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.jsf.designtime.el.AbstractDTMethodResolver#getMethods(org.eclipse.jst.jsf.context.symbol.IInstanceSymbol)
-     */
-    public ISymbol[] getMethods(IObjectSymbol base) 
-    {
-        return (ISymbol[])
-            base.getTypeDescriptor().getMethods().
-                toArray(new ISymbol[0]);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/el/DefaultDTPropertyResolver.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/el/DefaultDTPropertyResolver.java
deleted file mode 100644
index b119625..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/el/DefaultDTPropertyResolver.java
+++ /dev/null
@@ -1,309 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.designtime.el;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.common.util.BasicEList;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.jdt.core.Signature;
-import org.eclipse.jst.jsf.common.internal.types.StringLiteralType;
-import org.eclipse.jst.jsf.common.internal.types.TypeConstants;
-import org.eclipse.jst.jsf.common.internal.types.ValueType;
-import org.eclipse.jst.jsf.context.symbol.ERuntimeSource;
-import org.eclipse.jst.jsf.context.symbol.IBoundedTypeDescriptor;
-import org.eclipse.jst.jsf.context.symbol.IObjectSymbol;
-import org.eclipse.jst.jsf.context.symbol.ISymbol;
-import org.eclipse.jst.jsf.context.symbol.ITypeDescriptor;
-import org.eclipse.jst.jsf.designtime.symbols.JSFSymbolFactory;
-
-/**
- * A design time proxy for the runtime PropertyResolver.  This is used to
- * resolve all but the first element of a var.prop.prop2 type of sub-expression in
- * a JSF EL expression. @see DefaultDTVariableResolver for how to resolve 'var' at
- * designtime
- *
- * Clients may implement
- * 
- * @author cbateman
- */
-public class DefaultDTPropertyResolver extends AbstractDTPropertyResolver
-{
-	private static final String UICOMPONENT_SYMBOL_SIGNATURE 	= "Ljavax.faces.component.UIComponent;"; //$NON-NLS-1$
-	private static final String ATTRS_SYMBOL_NAME 				= "attrs"; //$NON-NLS-1$
-	private JSFSymbolFactory 	_symbolFactory 					= new JSFSymbolFactory();
-	 
-    /**
-     * Returns a symbol encapsulating the property on base with the name
-     * properyId
-     * 
-     * @param base
-     * @param propertyId
-     * @return the symbol for the named propertyId or null if not found
-     */
-    public ISymbol getProperty(ISymbol base, Object propertyId)
-    {
-        ITypeDescriptor typeDesc = null;
-
-        Object[] factoredProperties = new Object[] {propertyId};
-
-        // check for expected interface types per JSP.2.3.4
-        if (base instanceof IObjectSymbol)
-        {
-            final IObjectSymbol objSymbol = (IObjectSymbol) base;
-            typeDesc = objSymbol.getTypeDescriptor();
-
-            // although not stated explicitly stated by the spec, in practice (based on Sun RI),
-            // a list cannot have non-numeric indexed properties
-            // note: due to remove(Object) having different return types
-            // an object can't be both a List and a Map!  So we can consider
-            // a List instanceof out of order
-            if (objSymbol.supportsCoercion(TypeConstants.TYPE_LIST))
-            {
-                typeDesc = null;
-            }
-            // per JSP.2.3.4, if instance of map (unconstrained in our terminology)
-            else if (objSymbol.supportsCoercion(TypeConstants.TYPE_MAP))
-            {
-                EList<ValueType>  args = new BasicEList<ValueType>();
-                args.add(new StringLiteralType(propertyId.toString()));
-                
-                ISymbol prop = objSymbol.call("get", args, propertyId.toString()); //$NON-NLS-1$
-                
-                if (prop != null)
-                {
-                    return prop;
-                }
-                
-                typeDesc = objSymbol.coerce(TypeConstants.TYPE_MAP);
-
-                // handle string keys into maps that contain dots.  Because type descriptor
-                // handle dotted property ids (i.e. 'x.y.z') as separate properties with
-                // intermediate parts, we need to handle this specially.
-                if (propertyId instanceof String && ((String)propertyId).indexOf('.')>-1)
-                {
-                    factoredProperties = factorKey(propertyId);
-                }
-            }
-            //if symbol is "attrs", add it if applicable
-            else if (propertyId instanceof String 
-            		&& ((String)propertyId).equals(ATTRS_SYMBOL_NAME)) {
-            	return getCCAttrsSymbolIfNecessary(typeDesc);
-            }
-
-            // check unconstrained type
-            if (typeDesc instanceof IBoundedTypeDescriptor)
-            {
-                // TODO: propertyId may need to change when supporting
-                // template types
-                if (((IBoundedTypeDescriptor)typeDesc).isUnboundedForType(TypeConstants.TYPE_JAVAOBJECT))
-                {
-                    // the most we know is that it could be an Object
-                    return ((IBoundedTypeDescriptor)typeDesc).getUnboundedProperty(propertyId, TypeConstants.TYPE_JAVAOBJECT);
-                }
-            }
-            
-        }
-
-        int i = 0;
-        ISymbol  matchedSymbol;
-
-        do
-        {
-            matchedSymbol = null; // always reset so if the for completes without setting, the
-                                  // while ends
-            SEARCH_SEGMENT: for (final Iterator it = getIterator(typeDesc); it.hasNext();)
-            {
-                final ISymbol element = (ISymbol) it.next();
-
-                if (element.getName().equals(factoredProperties[i])
-                        && element instanceof IObjectSymbol)
-                {
-                    matchedSymbol = element;
-                    typeDesc = ((IObjectSymbol)matchedSymbol).getTypeDescriptor();
-                    break SEARCH_SEGMENT;
-                }
-            }
-        } while(++i < factoredProperties.length && matchedSymbol != null);
-
-        // may be null if none matched
-        return matchedSymbol;
-    }
-    
-    /**
-     * @param base
-     * @return all properties of base
-     */
-    public ISymbol[] getAllProperties(ISymbol base)
-    {
-        // if nothing found, return an empty array
-        List  symbolsList =  Collections.EMPTY_LIST;
-        
-        if (base instanceof IObjectSymbol)
-        {
-            ITypeDescriptor typeDesc = null;
-            
-            // per JSP.2.3.4, if instance of map (unconstrained in our terminology)
-            if (((IObjectSymbol)base).supportsCoercion(TypeConstants.TYPE_MAP))
-            {
-                typeDesc = 
-                    ((IObjectSymbol)base).coerce(TypeConstants.TYPE_MAP);
-            }
-            // Lists have no properties, even if they are also beans
-            else if (((IObjectSymbol)base).supportsCoercion(TypeConstants.TYPE_LIST))
-            {
-                typeDesc = null;
-            }
-            else
-            {
-                typeDesc = ((IObjectSymbol)base).getTypeDescriptor();
-            
-            }
-            
-            if (typeDesc != null)
-            {
-                symbolsList =  typeDesc.getProperties();
-                addCCAttrsIfNecessary(typeDesc, symbolsList);
-            }
-        }
-
-        return (ISymbol[]) symbolsList.toArray(ISymbol.EMPTY_SYMBOL_ARRAY);
-    }
-
-    private ISymbol getCCAttrsSymbolIfNecessary(final ITypeDescriptor typeDesc) {
-    	ISymbol attrsSymbol = null;
-    	if (typeDesc.instanceOf(UICOMPONENT_SYMBOL_SIGNATURE)) {
-    		attrsSymbol = _symbolFactory.createUnknownInstanceSymbol(ATTRS_SYMBOL_NAME, ERuntimeSource.BUILT_IN_SYMBOL_LITERAL);    		
-    	}
-    	return attrsSymbol;
-    }
-    
-    private void addCCAttrsIfNecessary(final ITypeDescriptor typeDesc, final List symbolsList) {
-    	final ISymbol attrsSymbol = getCCAttrsSymbolIfNecessary(typeDesc);
-    	if (attrsSymbol != null) {    		
-    		symbolsList.add(attrsSymbol);
-    	}
-	}
-
-	/* (non-Javadoc)
-     * @see org.eclipse.jst.jsf.designtime.el.AbstractDTPropertyResolver#getProperty(org.eclipse.jst.jsf.context.symbol.ISymbol, int)
-     */
-    public ISymbol getProperty(ISymbol base, int offset) 
-    {
-        ITypeDescriptor typeDesc = null;
-
-        if (offset < 0)
-        {
-        	// should never be called with offset < 0
-        	throw new AssertionError("offsets must be >=0 to be valid"); //$NON-NLS-1$
-        }
-        
-        // check for expected interface types per JSP.2.3.4
-        if (base instanceof IObjectSymbol)
-        {
-
-        	final IObjectSymbol objSymbol = (IObjectSymbol) base;
-            typeDesc = objSymbol.getTypeDescriptor();
-
-            // per JSP.2.3.4, if instance of array (unconstrained in our terminology)
-            if (typeDesc.isArray())
-            {
-                ISymbol arrayElement = typeDesc.getArrayElement();
-                // reset the name
-                arrayElement.setName(base.getName()+"["+offset+"]"); //$NON-NLS-1$ //$NON-NLS-2$
-                return arrayElement;
-            }
-            
-            // per JSP.2.3.4, if instance of list (unbounded in our terminology)
-            if (objSymbol.supportsCoercion(TypeConstants.TYPE_LIST))
-            {
-                //typeDesc = objSymbol.coerce(TypeConstants.TYPE_LIST);
-                final EList<ValueType> args = new BasicEList<ValueType>();
-                args.add(new ValueType(Signature.SIG_INT, ValueType.ASSIGNMENT_TYPE_RHS));
-                return objSymbol.call("get", args, base.getName()+"["+offset+"]"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-            }
-
-            return getCCAttrsSymbolIfNecessary(typeDesc);
-            // check unconstrained type
-//            if (typeDesc instanceof IBoundedTypeDescriptor)
-//            {
-//                // TODO: propertyId may need to change when supporting
-//                // template types
-//                if (((IBoundedTypeDescriptor)typeDesc).isUnboundedForType(TypeConstants.TYPE_BOXED_INTEGER))
-//                {
-                    // the most we know is that it could be an Object
-//                    return ((IBoundedTypeDescriptor)typeDesc)
-//                        .getUnboundedProperty
-//                            (new Integer(offset), TypeConstants.TYPE_BOXED_INTEGER);
-//                    final EList<Object> args = new BasicEList<Object>();
-//                    args.add(offset);
-//                    return ((IBoundedTypeDescriptor)typeDesc)
-//                          .call("get", args, base.getName()+"["+offset+"]");
-//                }
-//            }
-        }
-        
-        return null;
-    }
-    
-    /**
-     * @param typeDesc
-     * @return the type descriptor's property iterator or empty list
-     * if null
-     */
-    protected final Iterator getIterator(ITypeDescriptor typeDesc)
-    {
-        if (typeDesc != null)
-        {
-            return typeDesc.getProperties().iterator();
-        }
-        return Collections.EMPTY_LIST.iterator();
-    }
-    
-    /**
-     * Takes a key expression and factors it down to into all property segments it contains.
-     * Property segments occur mainly when String keys contain '.' characters, indicating that
-     * more one than property actually must be traversed to evaluate the whole expr.
-     * @param key
-     * @return an array containing all property segments of the key.  If the key contains only
-     * one property, then this is returned a single element in the array
-     */
-    protected final Object[] factorKey(Object key)
-    {
-        if (key instanceof String)
-        {
-            List  segments = new ArrayList();
-            
-            String stringKey = (String) key;
-            int nextPos = -1;
-            
-            while ((nextPos = stringKey.indexOf('.')) > -1)
-            {
-                segments.add(stringKey.substring(0, nextPos));
-                stringKey = stringKey.substring(nextPos+1);
-            }
-            
-            if (stringKey != null && stringKey.length() > 0)
-            {
-                segments.add(stringKey);
-            }
-            
-            return segments.toArray();
-        }
-
-        return new Object[] {key};
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/el/DefaultDTVariableResolver.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/el/DefaultDTVariableResolver.java
deleted file mode 100644
index 44d53a2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/el/DefaultDTVariableResolver.java
+++ /dev/null
@@ -1,177 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.designtime.el;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jst.jsf.context.symbol.ISymbol;
-import org.eclipse.jst.jsf.context.symbol.source.ISymbolConstants;
-import org.eclipse.jst.jsf.designtime.context.DTFacesContext;
-import org.eclipse.jst.jsf.designtime.context.IDTExternalContext;
-import org.eclipse.jst.jsf.designtime.symbols.DefaultBeanSymbolSourceProvider;
-import org.eclipse.jst.jsf.designtime.symbols.DefaultBuiltInSymbolProvider;
-
-/**
- * A design time proxy for the runtime VariableResolver.  This is used to
- * resolve the first element of a var.prop.prop2 type of sub-expression in
- * a JSF EL expression
- * 
- * Clients may sub-class
- *  
- * @author cbateman
- *
- */
-public class DefaultDTVariableResolver extends AbstractDTVariableResolver
-{
-    /**
-     * Tries to mirror the JSF 1.1 runtime VariableResolver
-     * 
-     * @see org.eclipse.jst.jsf.designtime.el.AbstractDTVariableResolver#resolveVariable(org.eclipse.jst.jsf.designtime.context.DTFacesContext, java.lang.String, org.eclipse.core.runtime.IAdaptable)
-     */
-    public ISymbol resolveVariable(DTFacesContext context, String name, IAdaptable externalContextKey)
-    {
-        // check implicits first
-        final DefaultBuiltInSymbolProvider builtins =
-            DefaultBuiltInSymbolProvider.getInstance();
-
-        ISymbol  symbol = builtins.getSymbol(name, externalContextKey, ISymbolConstants.SYMBOL_SCOPE_ALL);
-
-        if (symbol != null)
-        {
-            return symbol;
-        }
-        
-        // next check the scope maps from request up to application
-        final IDTExternalContext externalContext = 
-            context.getDTExternalContext(externalContextKey);
-        
-        if (externalContext == null)
-        {
-            // TODO: try to find bean here?
-            return null;
-        }
-        
-        symbol = externalContext.getRequestMap().get(name);
-        
-        // check request scope
-        if (symbol == null)
-        {
-            symbol = externalContext.getSessionMap().get(name);
-            
-            // then check session scope
-            if (symbol == null)
-            {
-                symbol = externalContext.getApplicationMap().get(name);
-                
-                // if the symbol is not found at any scope, then look for a
-                // a bean.
-                if (symbol == null)
-                {
-                    final DefaultBeanSymbolSourceProvider beanProvider =
-                        DefaultBeanSymbolSourceProvider.getInstance();
-                    
-                    symbol = beanProvider.getSymbol(name, externalContextKey, 
-                                             ISymbolConstants.SYMBOL_SCOPE_ALL);
-                }
-            }
-        }
-        
-        return symbol;
-    }
-    
-    /**
-     * @param facesContext
-     * @param externalContextKey
-     * @return all variables
-     */
-    public ISymbol[] getAllVariables(DTFacesContext facesContext, 
-                                     IAdaptable externalContextKey)
-    {
-        final List  allSymbols = new ArrayList();
-
-        addBuiltins(allSymbols, externalContextKey);
-
-        final IDTExternalContext externalContext =  
-            facesContext.getDTExternalContext(externalContextKey);
-
-        if (externalContext != null)
-        {
-            addExternalContextSymbols(allSymbols, externalContext);
-        }
-
-        addBeanSymbols(allSymbols, externalContextKey);
-        
-        return (ISymbol[]) allSymbols.toArray(ISymbol.EMPTY_SYMBOL_ARRAY);
-    }
-        
-    /**
-     * Adds the built-in symbols to the list.  This behaviour is standarized and should
-     * not be overriden in general.  However, you may wish to change the default
-     * built-in symbol provider with your own.
-     * 
-     * @param list
-     * @param externalContextKey
-     */
-    protected  void addBuiltins(final List list, final IAdaptable externalContextKey)
-    {
-        // check implicits first
-        final DefaultBuiltInSymbolProvider builtins =
-            DefaultBuiltInSymbolProvider.getInstance();
-
-        list.addAll(Arrays.asList(builtins.getSymbols(externalContextKey, 
-                                     ISymbolConstants.SYMBOL_SCOPE_ALL)));
-    }
-    
-    /**
-     * Simulate resolution of symbols from the request, session, application and none
-     * scope maps.  Use a symbol provider instead if you simply want to add
-     * new symbols for a tag variable or other symbol source.
-     * 
-     * @param list
-     * @param externalContext
-     */
-    protected void addExternalContextSymbols(final List list, 
-                                           final IDTExternalContext externalContext)
-    {
-        if (externalContext != null)
-        {
-            final ISymbol[] externalContextSymbols =
-                    externalContext.getMapForScope
-                  (ISymbolConstants.SYMBOL_SCOPE_ALL).values().
-                                    toArray(ISymbol.EMPTY_SYMBOL_ARRAY);
-            list.addAll(Arrays.asList(externalContextSymbols));
-        }
-    }
-
-    /**
-     * Gets all the bean symbols.  If you wish to override it would be advisable
-     * to look at and/or sub-class the default bean symbol source provider
-     * 
-     * @param list
-     * @param externalContextKey
-     */
-    protected void addBeanSymbols(final List list, final IAdaptable externalContextKey)
-    {
-        final DefaultBeanSymbolSourceProvider beanProvider =
-            DefaultBeanSymbolSourceProvider.getInstance();
-
-        final ISymbol[] beanSymbols = 
-            beanProvider.getSymbols(externalContextKey, 
-                                    ISymbolConstants.SYMBOL_SCOPE_ALL);
-
-        list.addAll(Arrays.asList(beanSymbols));
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/el/IDecorativeResolver.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/el/IDecorativeResolver.java
deleted file mode 100644
index 2c50134..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/el/IDecorativeResolver.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- * 
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.designtime.el;
-
-/**
- * Tagging interface that must be implemented by all resolvers that want to participate
- * in result decoration (i.e. variable and property resolvers) via the 
- * forRuntimeClass extension.
- * 
- * Clients may implement.
- * 
- * @author cbateman
- *
- */
-public interface IDecorativeResolver
-{
-    // purposefully empty
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/el/IInstancePerProjectResolver.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/el/IInstancePerProjectResolver.java
deleted file mode 100644
index 41bcff8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/el/IInstancePerProjectResolver.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- * 
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.designtime.el;
-
-import org.eclipse.core.resources.IProject;
-
-/**
- * See the variable and properyresolver extension points attribute instancePerProject.
- * 
- * Clients may implement.
- * 
- * @author cbateman
- *
- */
-public interface IInstancePerProjectResolver
-{
-    /**
-     * Called by the design time application manager before using the 
-     * resolver with the project it associated with.  Resolvers need not 
-     * implement unless they wish to be instancePerProject resolvers.
-     * 
-     * @param project
-     */
-    void setProject(final IProject project);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/el/package-info.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/el/package-info.java
deleted file mode 100644
index f714337..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/el/package-info.java
+++ /dev/null
@@ -1,16 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-/**
- * JSF Design Time EL Resolvers. 
- */
-package org.eclipse.jst.jsf.designtime.el;
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/BasicExtensionFactory.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/BasicExtensionFactory.java
deleted file mode 100644
index fd0b823..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/BasicExtensionFactory.java
+++ /dev/null
@@ -1,309 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- * 
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.designtime.internal;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtension;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.designtime.el.IInstancePerProjectResolver;
-import org.osgi.framework.Bundle;
-
-/**
- * @author cbateman
- * @param <EXTENSIONTYPE>
- * 
- */
-public class BasicExtensionFactory<EXTENSIONTYPE>
-{
-    private final Bundle                              _bundle;
-    private final String                              _extName;
-    private Map<String, ExtensionData<EXTENSIONTYPE>> _registeredResolvers;
-    private final String                              _elementName;
-    private final ExtensionDataFactory                _extensionDataFactory;
-    private final boolean _alwaysPerProject;
-
-    /**
-     * @param bundle
-     * @param extName
-     * @param elementName
-     * @param alwaysPerProject 
-     */
-    public BasicExtensionFactory(final Bundle bundle, final String extName,
-            final String elementName, final boolean alwaysPerProject)
-    {
-        _bundle = bundle;
-        _extName = extName;
-        _elementName = elementName;
-        _extensionDataFactory = new ExtensionDataFactory<EXTENSIONTYPE>();
-        _alwaysPerProject = alwaysPerProject;
-    }
-
-    /**
-     * @return the resolvers. Lazily initialized.
-     */
-    public final Map<String, ExtensionData<EXTENSIONTYPE>> getExtensions()
-    {
-        if (_registeredResolvers == null)
-        {
-            _registeredResolvers = loadRegisteredExtensions();
-        }
-
-        return _registeredResolvers;
-    }
-
-    /**
-     * @return the map of extensions by id.
-     */
-    protected Map<String, ExtensionData<EXTENSIONTYPE>> loadRegisteredExtensions()
-    {
-        final Map<String, ExtensionData<EXTENSIONTYPE>> resolvers = new HashMap<String, ExtensionData<EXTENSIONTYPE>>();
-
-        final IExtensionPoint point = Platform.getExtensionRegistry()
-                .getExtensionPoint(_bundle.getSymbolicName(), _extName);
-
-        final IExtension[] extensions = point.getExtensions();
-
-        for (final IExtension extension : extensions)
-        {
-            final IConfigurationElement[] elements = extension
-                    .getConfigurationElements();
-
-            for (final IConfigurationElement element : elements)
-            {
-                if (_elementName.equals(element.getName())
-                        && element.getAttribute("class") != null //$NON-NLS-1$
-                        && element.getAttribute("id") != null) //$NON-NLS-1$
-                {
-                    final ExtensionData extData = processExtension(element, _alwaysPerProject);
-
-                    if (extData != null)
-                    {
-                        resolvers.put(extData.getId(), extData);
-                    }
-                }
-            }
-        }
-        return resolvers;
-    }
-
-    /**
-     * @param element
-     * @param alwaysPerProject 
-     * @return the extension data for the extension or null if can't be created
-     */
-    protected ExtensionData processExtension(final IConfigurationElement element, final boolean alwaysPerProject)
-    {
-        return _extensionDataFactory.createExtensionData(element, alwaysPerProject);
-    }
-
-    /**
-     * @author cbateman
-     * 
-     * @param <EXTENSIONTYPE>
-     */
-    protected static class ExtensionDataFactory<EXTENSIONTYPE>
-    {
-        ExtensionData createExtensionData(final IConfigurationElement element,
-                final boolean alwaysPerProject)
-        {
-            if (isPerProjectExtension(element, alwaysPerProject))
-            {
-                return new PerProjectExtensionData<EXTENSIONTYPE>(element);
-            }
-            return new SingleInstanceExtensionData<EXTENSIONTYPE>(element);
-        }
-
-        static boolean isPerProjectExtension(final IConfigurationElement element, final boolean alwaysPerProject)
-        {
-            if (alwaysPerProject)
-            {
-                return true;
-            }
-            final String flag = element.getAttribute("instancePerProject"); //$NON-NLS-1$
-            // must check for null for backward compatibility, since
-            // this attribute wasn't part of the original.
-            if (flag != null)
-            {
-                return Boolean.valueOf(flag).booleanValue();
-            }
-            return false;
-        }
-    }
-
-    /**
-     * @param <EXTENSIONTYPE>
-     */
-    protected static class PerProjectExtensionData<EXTENSIONTYPE> extends
-            ExtensionData<EXTENSIONTYPE>
-    {
-        private Map<IProject, EXTENSIONTYPE> _extensions;
-
-        /**
-         * @param element
-         */
-        protected PerProjectExtensionData(IConfigurationElement element)
-        {
-            super(element);
-        }
-
-        @Override
-        public EXTENSIONTYPE getInstance(final IProject project)
-        {
-            if (!project.isAccessible())
-            {
-                _extensions.remove(project);
-                return null;
-            }
-
-            if (_extensions == null)
-            {
-                _extensions = new HashMap<IProject, EXTENSIONTYPE>();
-            }
-
-            EXTENSIONTYPE instance = _extensions.get(project);
-
-            if (instance == null)
-            {
-                try
-                {
-                    instance = createInstance();
-                    if (instance instanceof IInstancePerProjectResolver)
-                    {
-                        ((IInstancePerProjectResolver) instance)
-                                .setProject(project);
-                    }
-                    _extensions.put(project, instance);
-                }
-                catch (Exception e)
-                {
-                    JSFCorePlugin.log(e,
-                            "Instantiating extension class for id: " + getId()); //$NON-NLS-1$
-                }
-            }
-            return instance;
-        }
-
-        @Override
-        public EXTENSIONTYPE removeInstance(IProject project)
-        {
-            if (_extensions != null)
-            {
-                return _extensions.remove(project);
-            }
-            return null;
-        }
-    }
-
-    /**
-     * @param <EXTENSIONTYPE>
-     * 
-     */
-    protected static class SingleInstanceExtensionData<EXTENSIONTYPE> extends
-            ExtensionData<EXTENSIONTYPE>
-    {
-        private EXTENSIONTYPE _instance;
-
-        /**
-         * @param element
-         */
-        protected SingleInstanceExtensionData(IConfigurationElement element)
-        {
-            super(element);
-        }
-
-        @Override
-        public EXTENSIONTYPE getInstance(final IProject project)
-        {
-            if (_instance == null)
-            {
-                try
-                {
-                    _instance = createInstance();
-                }
-                catch (CoreException e)
-                {
-                    JSFCorePlugin.log(e,
-                            "Instantiating extension class for id: " + getId()); //$NON-NLS-1$
-                }
-            }
-            return _instance;
-        }
-
-        @Override
-        public EXTENSIONTYPE removeInstance(IProject project)
-        {
-            final EXTENSIONTYPE removedItem = _instance;
-            _instance = null;
-            return removedItem;
-        }
-    }
-
-    /**
-     * Extension data
-     * 
-     * @param <EXTENSIONTYPE>
-     * 
-     */
-    public abstract static class ExtensionData<EXTENSIONTYPE>
-    {
-        private final IConfigurationElement _element;
-
-        /**
-         * @param element
-         */
-        protected ExtensionData(final IConfigurationElement element)
-        {
-            super();
-            _element = element;
-        }
-
-        /**
-         * @return the unique id of the variable resolver extension
-         */
-        public String getId()
-        {
-            return _element.getAttribute("id"); //$NON-NLS-1$
-        }
-
-        /**
-         * @param project
-         * @return the instance. project may be ignored if there is only one
-         *         global instance for this factory.
-         */
-        public abstract EXTENSIONTYPE getInstance(final IProject project);
-
-        /**
-         * @param project
-         * @return the extension for the project, removing from any internal
-         *         caching. May return null if getInstance was never called for
-         *         project.
-         */
-        public abstract EXTENSIONTYPE removeInstance(final IProject project);
-
-        /**
-         * @return the resolver
-         * @throws CoreException
-         */
-        protected EXTENSIONTYPE createInstance() throws CoreException
-        {
-            return (EXTENSIONTYPE) _element.createExecutableExtension("class"); //$NON-NLS-1$
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/DecoratableExtensionFactory.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/DecoratableExtensionFactory.java
deleted file mode 100644
index 249316f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/DecoratableExtensionFactory.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- * 
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.designtime.internal;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.osgi.framework.Bundle;
-
-/**
- * Factory for extensions that include a runtime class for which they decorate.
- * 
- * @author cbateman
- * 
- * @param <EXTENSIONTYPE>
- */
-public class DecoratableExtensionFactory<EXTENSIONTYPE> extends
-        BasicExtensionFactory<EXTENSIONTYPE>
-{
-    private static final String             DECORATOR_ATTRIBUTE_NAME = "forRuntimeClass"; //$NON-NLS-1$
-    private final Map<String, List<String>> _forNameToId;
-
-    /**
-     * @param bundle
-     * @param extName
-     * @param elementName
-     * @param alwaysPerProject 
-     */
-    public DecoratableExtensionFactory(final Bundle bundle,
-            final String extName, final String elementName, final boolean alwaysPerProject)
-    {
-        super(bundle, extName, elementName, alwaysPerProject);
-        _forNameToId = new HashMap<String, List<String>>();
-    }
-
-    /**
-     * @param name
-     * @return a canonically sorted list of ids of extensions registered by the
-     *         name.
-     */
-    public List<String> getIdsForName(final String name)
-    {
-        List<String> ids =  _forNameToId.get(name);
-        if (ids == null)
-        {
-            ids = Collections.EMPTY_LIST;
-        }
-        return ids;
-    }
-
-    /**
-     * @return the number of runtime resolvers for which there is at least one
-     *         declarative variable resolver registered.
-     */
-    public int getNumDecorativeResolvers()
-    {
-        return _forNameToId.size();
-    }
-
-    @Override
-    protected Map<String, ExtensionData<EXTENSIONTYPE>> loadRegisteredExtensions()
-    {
-        Map<String, ExtensionData<EXTENSIONTYPE>> extensions = super
-                .loadRegisteredExtensions();
-
-        // canonically sort forName's
-        for (final Map.Entry<String, List<String>> entry : _forNameToId
-                .entrySet())
-        {
-            Collections.sort(entry.getValue());
-        }
-
-        return extensions;
-    }
-
-    
-    @Override
-    protected ExtensionData processExtension(IConfigurationElement element, boolean alwaysPerProject)
-    {
-        final ExtensionData data = super.processExtension(element, alwaysPerProject);
-        final String forRuntimeClass = element
-                .getAttribute(DECORATOR_ATTRIBUTE_NAME);
-        if (forRuntimeClass != null && !"".equals(forRuntimeClass.trim())){ //$NON-NLS-1$
-            addRuntimeClassMapping(data.getId(), forRuntimeClass);
-        }
-        return data;
-    }
-
-    private void addRuntimeClassMapping(final String id,
-            final String forRuntimeClass)
-    {
-        List mappings = _forNameToId.get(forRuntimeClass);
-
-        if (mappings == null)
-        {
-            mappings = new ArrayList<String>(2);
-            _forNameToId.put(forRuntimeClass, mappings);
-        }
-        mappings.add(id);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/Messages.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/Messages.java
deleted file mode 100644
index 9b1a379..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/Messages.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.designtime.internal;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * NLS messages.
- * 
- * @author cbateman
- *
- */
-public class Messages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.jst.jsf.designtime.internal.messages"; //$NON-NLS-1$
-	/**
-	 * see messages.properties
-	 */
-	public static String CompositeTagResolvingStrategy_DisplayName;
-	/**
-	 * see messages.properties
-	 */
-	public static String DefaultJSPTagResolver_DisplayName;
-	/**
-	 * see messages.properties
-	 */
-	public static String PersistedDataTagStrategy_DisplayName;
-	/**
-	 * see messages.properties
-	 */
-	public static String TagIntrospectingStrategy_DisplayName;
-	/**
-	 * messages.properties
-	 */
-	public static String TLDRegistryManager_DisplayName;
-	/**
-	 * messages.properties
-	 */
-	public static String TLDTagRegistry_RefreshJob;
-	/**
-	 * messages.properties
-	 */
-	public static String TLDTagRegistry_UpdateJob;
-	/**
-	 * messages.properties
-	 */
-	public static String UnresolvedJSPTagResolvingStrategy_DisplayName;
-	static {
-		// initialize resource bundle
-		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/jsp/AdditionalContextSymbolInfo.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/jsp/AdditionalContextSymbolInfo.java
deleted file mode 100644
index 4755fa8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/jsp/AdditionalContextSymbolInfo.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- * 
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.designtime.internal.jsp;
-
-import org.eclipse.jst.jsf.context.symbol.source.IAdditionalContextSymbolInfo;
-
-/**
- * 
- * NOT API.  Use IAdditionalContextSymbolInfo.
- * 
- * @author cbateman
- *
- */
-/*package*/ final class AdditionalContextSymbolInfo implements IAdditionalContextSymbolInfo
-{
-    private final String    _symbolTypeSignature;
-    private final String    _valueExpressionAttributeName;
-
-    /**
-     * @param symbolTypeSignature
-     */
-    /*package*/ AdditionalContextSymbolInfo(final String symbolTypeSignature,
-            String valueExpressionAttributeName)
-    {
-        super();
-        this._symbolTypeSignature = symbolTypeSignature;
-        this._valueExpressionAttributeName = valueExpressionAttributeName;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.jsf.context.symbol.source.IAdditionalContextSymbolInfo#getSymbolTypeSignature()
-     */
-    public String getSymbolTypeSignature()
-    {
-        return _symbolTypeSignature;
-    }
-
-    public String getValueExpressionAttributeName()
-    {
-        return _valueExpressionAttributeName;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/jsp/DataModelVariableFactory.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/jsp/DataModelVariableFactory.java
deleted file mode 100644
index 95cde30..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/jsp/DataModelVariableFactory.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.designtime.internal.jsp;
-
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.jst.jsf.context.symbol.ISymbol;
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.jsf.designtime.symbols.AbstractDataModelVariableFactory;
-import org.eclipse.jst.jsf.designtime.symbols.DefaultDataTableSymbolFactory;
-import org.w3c.dom.Element;
-
-/**
- * Constructs an EL IObjectSymbol for a particular data table row access variable
- * based on the type of the bound data (the value attribute)
- *  
- * 
- * @author cbateman
- *
- */
-class DataModelVariableFactory extends DefaultDataTableSymbolFactory
-{
-    private static DataModelVariableFactory INSTANCE;
-    
-    /**
-     * @return an instance of the factory
-     */
-    public synchronized static DataModelVariableFactory getInstance()
-    {
-        if (INSTANCE == null)
-        {
-            INSTANCE = new DataModelVariableFactory();
-        }
-        
-        return INSTANCE;
-    }
-    
-    @Override
-    public ISymbol createSymbolForDataTableValue(String symbolName,
-            Element dataTableElement, IStructuredDocumentContext context) 
-    {
-        if (!IJSFConstants.TAG_DATATABLE.equals(dataTableElement.getLocalName()))
-        {
-            throw new AssertionError("dataTableElement must be a dataTable"); //$NON-NLS-1$
-        }
-
-        return super.createSymbolForDataTableValue(symbolName, dataTableElement, context);
-    }
-
-    //private String getELText(IStructuredDocumentConte)
-    private DataModelVariableFactory()
-    {
-        // no external instantiation
-        super(new MyDataModelVariableFactory());
-    }
-    
-    private static class MyDataModelVariableFactory extends AbstractDataModelVariableFactory
-    {
-        @Override
-        protected String getVariableSourceName() {
-            return "dataTable"; //$NON-NLS-1$
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/jsp/JSPDefaultSymbolFactory.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/jsp/JSPDefaultSymbolFactory.java
deleted file mode 100644
index 4e70942..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/jsp/JSPDefaultSymbolFactory.java
+++ /dev/null
@@ -1,217 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.designtime.internal.jsp;
-
-import java.io.IOException;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jst.jsf.common.internal.types.TypeConstants;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IDOMContextResolver;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IStructuredDocumentContextResolverFactory;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.ITaglibContextResolver;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IWorkspaceContextResolver;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.jst.jsf.context.symbol.IBoundedJavaTypeDescriptor;
-import org.eclipse.jst.jsf.context.symbol.IComponentSymbol;
-import org.eclipse.jst.jsf.context.symbol.IMapTypeDescriptor;
-import org.eclipse.jst.jsf.context.symbol.ISymbol;
-import org.eclipse.jst.jsf.context.symbol.SymbolFactory;
-import org.eclipse.jst.jsf.context.symbol.source.AbstractContextSymbolFactory;
-import org.eclipse.jst.jsf.context.symbol.source.IAdditionalContextSymbolInfo;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.jsf.designtime.internal.symbols.ResourceBundleMapSourceFactory;
-import org.w3c.dom.Attr;
-import org.w3c.dom.Element;
-import org.w3c.dom.NamedNodeMap;
-import org.w3c.dom.Node;
-
-/**
- * @author cbateman
- *
- */
-public class JSPDefaultSymbolFactory extends AbstractContextSymbolFactory 
-{
-    protected ISymbol internalCreate(String symbolName,int scope,IAdaptable context,List problems, IAdditionalContextSymbolInfo additionInfo) 
-    {
-        final IStructuredDocumentContext sContext =
-            (IStructuredDocumentContext) 
-                context.getAdapter(IStructuredDocumentContext.class);
-        
-        final IDOMContextResolver domResolver = 
-            IStructuredDocumentContextResolverFactory.INSTANCE.getDOMContextResolver(sContext);
-        
-        if (domResolver != null)
-        {
-            final Node curNode = domResolver.getNode();
-            
-            if (curNode instanceof Attr)
-            {
-                final Attr attr = (Attr) curNode;
-                final Node owningElement = attr.getOwnerElement();
-                
-                if (owningElement != null)
-                {
-                    return handleSymbolCreation(symbolName, sContext, attr, owningElement, problems);
-                }
-            }
-        }
-        
-        return null;
-    }
-
-    
-    private ISymbol handleSymbolCreation(final String symbolName, 
-                                         final IStructuredDocumentContext context,
-                                         final Attr attr, 
-                                         final Node owningElement,
-                                         final List problems)
-    {
-        final ITaglibContextResolver resolver = 
-            IStructuredDocumentContextResolverFactory.INSTANCE.getTaglibContextResolver(context);
-        
-        
-        if (resolver == null
-                || !resolver.canResolveContext(context))
-        {
-            return null;
-        }
-        
-        final String uri = resolver.getTagURIForNodeName(owningElement);
-        
-        // process core taglib
-        if (ITLDConstants.URI_JSF_CORE.equals(uri))
-        {
-            return handleCoreTags(symbolName, owningElement, attr, context, problems);
-        }
-        else if (ITLDConstants.URI_JSF_HTML.equals(uri))
-        {
-            return handleHtmlTags(symbolName, owningElement, attr, context, problems);
-        }
-        
-        return null;
-    }
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.jsf.context.symbol.source.AbstractContextSymbolFactory#supports(org.eclipse.core.runtime.IAdaptable)
-     */
-    public boolean supports(IAdaptable context) 
-    {
-        return context != null && 
-        	context.getAdapter(IStructuredDocumentContext.class) != null;
-    }
-    
-    private ISymbol handleHtmlTags(String symbolName, Node owningElement, Attr attr, IStructuredDocumentContext context, List problems)
-    {
-        final String elementName = owningElement.getLocalName();
-        final String attrName = attr.getName();
-        
-        if (IJSFConstants.TAG_DATATABLE.equals(elementName))
-        {
-            if (IJSFConstants.ATTR_VAR.equals(attrName))
-            {
-                return DataModelVariableFactory.getInstance()
-                    .createSymbolForDataTableValue(symbolName, (Element) owningElement, context);
-            }
-        }
-
-        return null;
-    }
-    
-    private ISymbol handleCoreTags(String symbolName, Node owningElement, Attr attr, IStructuredDocumentContext context, List problems)
-    {
-        final String elementName = owningElement.getLocalName();
-        
-        if (IJSFConstants.TAG_LOADBUNDLE.equals(elementName))
-        {
-//            long startTime = System.currentTimeMillis();
-            ISymbol symbol = handleLoadBundleTag(symbolName, owningElement, attr, context, problems);
-            
-//            long endTime = System.currentTimeMillis();
-//            long totalTime = endTime-startTime;
-            //System.out.println("Loadbundle resolution for symbol "+symbolName+" took: "+totalTime+"ms");
-            return symbol;
-        }
-        return null;
-    }
-    
-    private ISymbol handleLoadBundleTag(String symbolName, Node owningElement, Attr attr, IStructuredDocumentContext context, List problems)
-    {
-        final String attrName = attr.getName();
-        if (IJSFConstants.ATTR_VAR.equals(attrName))
-        {
-            final NamedNodeMap attrMap = owningElement.getAttributes();
-            final Node baseNameNode = attrMap.getNamedItem(IJSFConstants.ATTR_BASENAME);
-
-            
-            if (baseNameNode != null)
-            {
-                try
-                {
-                    final IWorkspaceContextResolver wkspaceResolver =
-                        IStructuredDocumentContextResolverFactory.INSTANCE.getWorkspaceContextResolver(context);
-                    IProject project = wkspaceResolver.getProject();
-                    
-                    if (project == null)
-                    {
-                        throw new RuntimeException("Error acquiring project"); //$NON-NLS-1$
-                    }
-                    
-                    final Map source = 
-                        ResourceBundleMapSourceFactory
-                            .getResourceBundleMapSource(project, baseNameNode.getNodeValue());
-                    final IMapTypeDescriptor typeDesc = 
-                        SymbolFactory.eINSTANCE.createIMapTypeDescriptor();
-                    typeDesc.setMapSource(source);
-                    final IComponentSymbol symbol = 
-                        SymbolFactory.eINSTANCE.createIComponentSymbol();
-                    symbol.setName(symbolName);
-                    symbol.setTypeDescriptor(typeDesc);
-                    symbol.setDetailedDescription(Messages.getString("JSPDefaultSymbolFactory.Resource.bundle.map.detailedDescription")+baseNameNode.getNodeValue()+"</i>"); //$NON-NLS-1$ //$NON-NLS-2$
-                    
-                    return symbol;
-                }
-                catch (IOException ioe)
-                {
-                    problems.add(new Status(IStatus.ERROR, JSFCorePlugin.PLUGIN_ID, 0,Messages.getString("JSPDefaultSymbolFactory.Problem.ErrorCreatingVariable"), ioe)); //$NON-NLS-1$
-                }
-                catch (JavaModelException jme)
-                {
-                    problems.add(new Status(IStatus.ERROR, JSFCorePlugin.PLUGIN_ID, 0,Messages.getString("JSPDefaultSymbolFactory.Problem.ErrorCreatingVariable"), jme)); //$NON-NLS-1$
-                }
-                catch (CoreException ce)
-                {
-                    problems.add(new Status(IStatus.ERROR, JSFCorePlugin.PLUGIN_ID, 0,Messages.getString("JSPDefaultSymbolFactory.Problem.ErrorCreatingVariable"), ce)); //$NON-NLS-1$
-                }
-                
-                final IBoundedJavaTypeDescriptor typeDesc = SymbolFactory.eINSTANCE.createIBoundedJavaTypeDescriptor();
-                typeDesc.setTypeSignatureDelegate( TypeConstants.TYPE_JAVAOBJECT );
-                final IComponentSymbol symbol = SymbolFactory.eINSTANCE.createIComponentSymbol();
-                symbol.setName(symbolName);
-                symbol.setTypeDescriptor(typeDesc);
-                symbol.setDetailedDescription(Messages.getString("JSPDefaultSymbolFactory.Resource.bundle.map.detailedDescription")+baseNameNode.getNodeValue()+"</i>"); //$NON-NLS-1$ //$NON-NLS-2$
-                
-                return symbol;
-            }
-        }
-        return null;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/jsp/JSPModelProcessor.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/jsp/JSPModelProcessor.java
deleted file mode 100644
index 0b6015c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/jsp/JSPModelProcessor.java
+++ /dev/null
@@ -1,930 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.designtime.internal.jsp;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.locks.ReentrantLock;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IWorkspaceRunnable;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.resources.WorkspaceJob;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.OperationCanceledException;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.IJobChangeEvent;
-import org.eclipse.core.runtime.jobs.ILock;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.core.runtime.jobs.JobChangeAdapter;
-import org.eclipse.jst.jsf.common.JSFCommonPlugin;
-import org.eclipse.jst.jsf.common.internal.resource.EventResult;
-import org.eclipse.jst.jsf.common.internal.resource.IResourceLifecycleListener;
-import org.eclipse.jst.jsf.common.internal.resource.LifecycleListener;
-import org.eclipse.jst.jsf.common.internal.resource.ResourceLifecycleEvent;
-import org.eclipse.jst.jsf.common.internal.resource.ResourceLifecycleEvent.EventType;
-import org.eclipse.jst.jsf.common.internal.resource.ResourceLifecycleEvent.ReasonType;
-import org.eclipse.jst.jsf.common.metadata.Trait;
-import org.eclipse.jst.jsf.common.metadata.internal.TraitValueHelper;
-import org.eclipse.jst.jsf.common.metadata.query.ITaglibDomainMetaDataModelContext;
-import org.eclipse.jst.jsf.common.metadata.query.TaglibDomainMetaDataQueryHelper;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IStructuredDocumentContextResolverFactory;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.ITaglibContextResolver;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContextFactory;
-import org.eclipse.jst.jsf.context.symbol.IComponentSymbol;
-import org.eclipse.jst.jsf.context.symbol.ISymbol;
-import org.eclipse.jst.jsf.context.symbol.SymbolFactory;
-import org.eclipse.jst.jsf.context.symbol.source.AbstractContextSymbolFactory;
-import org.eclipse.jst.jsf.context.symbol.source.ISymbolConstants;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.designtime.DesignTimeApplicationManager;
-import org.eclipse.jst.jsf.designtime.context.DTFacesContext;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.wst.sse.core.StructuredModelManager;
-import org.eclipse.wst.sse.core.internal.provisional.IModelManager;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-
-/**
- * Processes a JSP model to determine information of interest about it such
- * as what tags are currently in use.  Listens to the model and updates it's
- * information when the model changes.
- *
- * @author cbateman
- *
- */
-public class JSPModelProcessor
-{
-    /**
-     * Pass to force refresh arguments
-     */
-    public final static boolean FORCE_REFRESH = true;
-
-    /**
-     * Pass to runAfter argument of refresh to indicate there is nothing
-     * to run when the refresh job completes.
-     */
-    public final static Runnable NO_RUN_AFTER = null;
-
-    /**
-     * Pass to runAfter argument of refresh to indicate that the caller
-     * should be blocked until the job completes.
-     */
-    public final static Runnable RUN_ON_CURRENT_THREAD = new Runnable()
-    {
-        public void run()
-        {
-            // do nothing
-        }
-    };
-
-    /**
-     * An init-time setting that is used to stop the model processor from
-     * automatically refreshing when the file it is tracking changes. The can
-     * only be set once at init is permanent for the static life timpe of
-     * JSPModelProcessor.
-     *
-     * Note that it does not turn off listening for file delete events because
-     * the singleton management still needs to know if it can dispose of an
-     * instance.
-     */
-    private final static boolean                         DISABLE_WKSPACE_CHANGE_REFRESH = System
-                                                                                                .getProperty("org.eclipse.jst.jsf.jspmodelprocessor.disable.wkspace.change.refresh") != null; //$NON-NLS-1$
-    private final static Map<IFile, JSPModelProcessor>  RESOURCE_MAP =
-        new HashMap<IFile, JSPModelProcessor>();
-    private final static java.util.concurrent.locks.Lock CRITICAL_SECTION =
-        new  ReentrantLock();
-    private static LifecycleListener  LIFECYCLE_LISTENER;
-
-    /**
-     * @param file The file to get the model processor for
-     * @return the processor for a particular model, creating it if it does not
-     *         already exist
-     * @throws CoreException if an attempt to get the model associated with file
-     *         fails due to reasons other than I/O problems
-     */
-    public static JSPModelProcessor get(final IFile file) throws CoreException
-    {
-        CRITICAL_SECTION.lock();
-        try
-        {
-            if (!file.isAccessible())
-            {
-                throw new CoreException(new Status(IStatus.ERROR, JSFCorePlugin.PLUGIN_ID, "File must be accessible")); //$NON-NLS-1$
-            }
-
-            JSPModelProcessor processor = RESOURCE_MAP.get(file);
-
-            if (processor == null)
-            {
-                if (LIFECYCLE_LISTENER == null)
-                {
-                    LIFECYCLE_LISTENER = new LifecycleListener(file, ResourcesPlugin.getWorkspace());
-                }
-                else
-                {
-                    LIFECYCLE_LISTENER.addResource(file);
-                }
-
-                processor = new JSPModelProcessor(file,LIFECYCLE_LISTENER);
-                RESOURCE_MAP.put(file, processor);
-            }
-
-            return processor;
-        }
-        finally
-        {
-            CRITICAL_SECTION.unlock();
-        }
-    }
-
-    /**
-     * Disposes of the JSPModelProcessor associated with model
-     * @param file the model processor to be disposed
-     */
-    private static void dispose(final IFile file)
-    {
-        CRITICAL_SECTION.lock();
-        try
-        {
-            final JSPModelProcessor processor = RESOURCE_MAP.get(file);
-
-            if (processor != null)
-            {
-                RESOURCE_MAP.remove(file);
-
-                if (!processor.isDisposed())
-                {
-                    processor.dispose();
-                    LIFECYCLE_LISTENER.removeResource(file);
-                }
-
-            }
-
-            if (RESOURCE_MAP.isEmpty())
-            {
-                // if we no longer have any resources being tracked,
-                // then dispose the lifecycle listener
-                LIFECYCLE_LISTENER.dispose();
-                LIFECYCLE_LISTENER = null;
-            }
-        }
-        finally
-        {
-            CRITICAL_SECTION.unlock();
-        }
-    }
-
-    private final IFile             _file;
-    private LifecycleListener       _lifecycleListener;
-    private IResourceLifecycleListener  _resListener;
-    private volatile boolean                 _isDisposed;
-    private Map<Object, ISymbol>    _requestMap;
-    private Map<Object, ISymbol>    _sessionMap;
-    private Map<Object, ISymbol>    _applicationMap;
-    private Map<Object, ISymbol>    _noneMap;
-    private Map<Object, ISymbol>    _viewMap;
-    private Map<Object, ISymbol>    _flashMap;
-
-    // used to avoid infinite recursion in refresh.  Must never be null
-    private final CountingMutex     _lastModificationStampMonitor = new CountingMutex();
-
-    /**
-     * Construct a new JSPModelProcessor for model
-     *
-     * @param model
-     */
-    private JSPModelProcessor(final IFile  file, final LifecycleListener lifecycleListener)
-    {
-        _file = file;
-        _lifecycleListener = lifecycleListener;
-        _resListener = new IResourceLifecycleListener()
-        {
-            public EventResult acceptEvent(final ResourceLifecycleEvent event)
-            {
-                final EventResult result = EventResult.getDefaultEventResult();
-
-                // not interested
-                if (!_file.equals(event.getAffectedResource()))
-                {
-                    return result;
-                }
-
-                if (event.getEventType() == EventType.RESOURCE_INACCESSIBLE)
-                {
-                    dispose(_file);
-                }
-                else if (event.getEventType() == EventType.RESOURCE_CHANGED)
-                {
-                    // if the file has changed contents on disk, then
-                    // invoke an unforced refresh of the JSP file
-                    if (event.getReasonType() == ReasonType.RESOURCE_CHANGED_CONTENTS
-                            && !DISABLE_WKSPACE_CHANGE_REFRESH)
-                    {
-                        refresh(! FORCE_REFRESH, NO_RUN_AFTER);
-                    }
-                }
-
-                return result;
-            }
-        };
-
-        lifecycleListener.addListener(_resListener);
-    }
-
-    private IDOMModel getModelForFile(final IFile file)
-            throws CoreException, IOException
-    {
-        final IModelManager modelManager =
-            StructuredModelManager.getModelManager();
-
-        final IStructuredModel model = modelManager.getModelForRead(file);
-
-        if (model instanceof IDOMModel)
-        {
-            return (IDOMModel) model;
-        }
-        else if (model != null)
-        {
-            // only release from read if we don't find a DOMModelForJSP
-            // if the model is correct, it will be released in dispose
-            model.releaseFromRead();
-        }
-        
-        JSFCorePlugin.log("Couldn't get valid model for file: "+file.toString(), new Exception()); //$NON-NLS-1$
-        return null;
-    }
-
-    private void dispose()
-    {
-        if (!_isDisposed)
-        {
-            // ensure the resource listener is disposed
-            _lifecycleListener.removeListener(_resListener);
-            _resListener = null;
-            _lifecycleListener = null;
-
-            if (_requestMap != null)
-            {
-                _requestMap.clear();
-                _requestMap = null;
-            }
-
-            if (_sessionMap != null)
-            {
-                _sessionMap.clear();
-                _sessionMap = null;
-            }
-
-            if (_applicationMap != null)
-            {
-                _applicationMap.clear();
-                _applicationMap = null;
-            }
-
-            if (_noneMap != null)
-            {
-                _noneMap.clear();
-                _noneMap = null;
-            }
-
-            // mark as disposed
-            _isDisposed = true;
-        }
-    }
-
-    /**
-     * @return true if this model processor has been disposed.  Disposed
-     * processors should not be used.
-     */
-    public boolean isDisposed()
-    {
-        return _isDisposed;
-    }
-
-    /**
-     * If isModelDirty() returns true, then it means that a call
-     * to refresh(false) will trigger a reprocess of the underlying document.
-     *
-     * @return true if the underlying JSP model is considered to be dirty
-     */
-    public boolean isModelDirty()
-    {
-        final long currentModificationStamp = _file.getModificationStamp();
-        return _lastModificationStampMonitor.hasChanged(currentModificationStamp);
-    }
-
-
-
-    /**
-     * Refreshes the processor's cache of information from its associated
-     * JSP file.
-     *
-     * @param forceRefresh
-     * @param runAfter
-     */
-    public void refresh(final boolean forceRefresh, final Runnable runAfter)
-    {
-        if (isDisposed())
-        {
-            throw new IllegalStateException(
-                    "Processor is disposed for file: " + _file.toString()); //$NON-NLS-1$
-        }
-
-        if (runAfter == RUN_ON_CURRENT_THREAD)
-        {
-            try
-            {
-                runOnCurrentThread(forceRefresh);
-            } 
-            catch (final CoreException e)
-            {
-                JSFCorePlugin.log(e, "Running JSP model processor"); //$NON-NLS-1$
-            } 
-            catch (final OperationCanceledException e)
-            {
-                // ignore
-            } 
-        } 
-        else
-        {
-            runOnWorkspaceJob(forceRefresh, runAfter);
-        }
-
-    }
-    private void runOnWorkspaceJob(final boolean forceRefresh, final Runnable runAfter)
-    {
-    	WorkspaceJob refreshJob = new WorkspaceJob(NLS.bind(Messages
-                .getString("JSPModelProcessor.0"), _file)) { //$NON-NLS-1$
-            @Override
-            public IStatus runInWorkspace(IProgressMonitor monitor)
-                    throws CoreException
-            {
-                RefreshRunnable runnable = new RefreshRunnable(forceRefresh);
-                runnable.run(monitor);
-                return Status.OK_STATUS;
-            }
-        };
-        refreshJob.setSystem(true);
-        refreshJob.setRule(ResourcesPlugin.getWorkspace().getRoot());
-        if (runAfter != null)
-        {
-            refreshJob.addJobChangeListener(new JobChangeAdapter()
-            {
-                @Override
-                public void done(final IJobChangeEvent event)
-                {
-                    runAfter.run();
-                }
-            });
-        }
-        refreshJob.schedule();
-    }
-
-    private void runOnCurrentThread(final boolean forceRefresh) throws CoreException, OperationCanceledException
-    {
-        ResourcesPlugin.getWorkspace().run(new RefreshRunnable(forceRefresh), _file, 0, null);
-    }
-    
-    private final class RefreshRunnable implements IWorkspaceRunnable
-    {
-        private final boolean _forceRefresh;
-
-        public RefreshRunnable(final boolean forceRefresh)
-        {
-            _forceRefresh = forceRefresh;
-        }
-
-        public void run(final IProgressMonitor monitor)
-                throws CoreException
-        {
-            synchronized (_lastModificationStampMonitor)
-            {
-                if (!_lastModificationStampMonitor.compareAndSetSignalled(false, true))
-                {
-                    // if this calls succeeds, then this thread has obtained the
-                    // lock already and has called through here before.
-                    // return immediately to ensure that we don't recurse
-                    // infinitely
-                    return;
-                }
-                IDOMModel model = null;
-                try
-                {
-                    // only refresh if forced or if the underlying file has
-                    // changed
-                    // since the last run
-                    if (_forceRefresh || isModelDirty())
-                    {
-                        model = getModelForFile(_file);
-                        if (model != null)
-                        {
-                            refreshInternal(model);
-                        }
-                        _lastModificationStampMonitor.setModificationStamp(_file.getModificationStamp());
-                    }
-                }
-                catch (final IOException e)
-                {
-                    IStatus status = new Status(IStatus.ERROR, JSFCorePlugin.PLUGIN_ID,"Error refreshing internal model", e); //$NON-NLS-1$
-                    final CoreException e2 = new CoreException(status);
-                    throw e2;
-                }
-                // make sure that we unsignal the monitor before releasing the
-                // mutex
-                finally
-                {
-                    _lastModificationStampMonitor.setSignalled(false);
-                    if (model != null)
-                    {
-                        model.releaseFromRead();
-                    }
-                }
-            }
-        }
-    }
-
-
-
-    private void refreshInternal(final IDOMModel model)
-    {
-        final IStructuredDocumentContext context =
-            IStructuredDocumentContextFactory.INSTANCE.getContext(model.getStructuredDocument(), -1);
-        final ITaglibContextResolver taglibResolver =
-            IStructuredDocumentContextResolverFactory.INSTANCE.getTaglibContextResolver(context);
-        final IDOMDocument document = model.getDocument();
-        getApplicationMap().clear();
-        getRequestMap().clear();
-        getSessionMap().clear();
-
-        if (taglibResolver == null) {
-            // unusual, but protect against possible NPE
-            JSFCorePlugin.log(IStatus.ERROR, "Program Error: taglib resolver is null."); //$NON-NLS-1$
-            return;
-        }
-
-        //long curTime = System.currentTimeMillis();
-        recurseChildNodes(model, document.getChildNodes(), taglibResolver);
-        //long netTime = System.currentTimeMillis() - curTime;
-        //System.out.println("Net time to recurse document: "+netTime);
-    }
-
-    private void recurseChildNodes(final IDOMModel model,
-                                   final NodeList nodes,
-                                    final ITaglibContextResolver taglibResolver)
-    {
-        for (int i = 0; i < nodes.getLength(); i++)
-        {
-            final Node child = nodes.item(i);
-
-            // process attributes at this node before recursing
-            processAttributes(model, child, taglibResolver);
-            recurseChildNodes(model, child.getChildNodes(), taglibResolver);
-        }
-    }
-
-    private void processAttributes(final IDOMModel model, final Node node,
-                                    final ITaglibContextResolver taglibResolver)
-    {
-        if (taglibResolver.hasTag(node))
-        {
-            final String uri =
-                taglibResolver.getTagURIForNodeName(node);
-            final String elementName = node.getLocalName();
-
-            for (int i = 0; i < node.getAttributes().getLength(); i++)
-            {
-                final Node attribute = node.getAttributes().item(i);
-
-                processSymbolContrib(model, uri, elementName, attribute);
-                processSetsLocale(uri, elementName, attribute);
-            }
-        }
-    }
-
-    private void processSymbolContrib(final IDOMModel model, final String uri, final String elementName, final Node attribute)
-    {
-        final SymbolContribAggregator  aggregator =
-            SymbolContribAggregator.
-               create(_file.getProject(), uri, elementName, attribute.getLocalName());
-
-        if (aggregator != null)
-        {
-            final AbstractContextSymbolFactory factory = aggregator.getFactory();
-            final String symbolName = attribute.getNodeValue();
-
-            if (factory != null)
-            {
-//                long curTime = System.currentTimeMillis();
-                final IStructuredDocumentContext context =
-                    IStructuredDocumentContextFactory.INSTANCE.
-                        getContext(model.getStructuredDocument(),
-                           attribute);
-
-                if (factory.supports(context))
-                {
-                    final List problems = new ArrayList();
-                    final ISymbol symbol =
-                        factory.create(symbolName,
-                                      ISymbolConstants.SYMBOL_SCOPE_REQUEST, //TODO:
-                                      context,
-                                      problems,
-                                      // TODO: add meta-data for signature
-                                      new AdditionalContextSymbolInfo(aggregator.getStaticType(), aggregator.getValueExpressionAttr()));
-
-    //                long netTime = System.currentTimeMillis() - curTime;
-    //                System.out.println("Time to process loadBundle: "+netTime);
-
-                    if (symbol != null)
-                    {
-                        updateMap(symbol, aggregator.getScope());
-                    }
-                }
-            }
-            else
-            {
-                final IComponentSymbol componentSymbol =
-                    SymbolFactory.eINSTANCE.createIComponentSymbol();
-                componentSymbol.setName(symbolName);
-
-                updateMap(componentSymbol, aggregator.getScope());
-            }
-        }
-    }
-    
-    @SuppressWarnings("deprecation")
-    private void processSetsLocale(final String uri, final String elementName, Node attribute)
-    {
-        LocaleSetAggregator  aggregator = LocaleSetAggregator.create(_file.getProject(), uri, elementName, attribute.getLocalName());
-
-        if (aggregator != null)
-        {
-            DesignTimeApplicationManager  dtAppMgr =
-                DesignTimeApplicationManager.getInstance(_file.getProject());
-
-            if (dtAppMgr != null)
-            {
-                DTFacesContext facesContext = dtAppMgr.getFacesContext(_file);
-                
-                if (facesContext != null)
-                {
-                    facesContext.setLocaleString(attribute.getNodeValue());
-                }
-            }
-        }
-    }
-
-   /**
-     * @param scopeName - one of "request", "session" or "application" or "view" if JSF2.x
-     * @return an unmodifable map containing all known symbols for
-     * that scope.  If scopeName is not found, returns the empty map.
-     */
-    public Map<Object, ISymbol> getMapForScope(final String scopeName)
-    {
-        final Map<Object, ISymbol> map = getMapForScopeInternal(scopeName);
-
-        if (map != null)
-        {
-            return Collections.unmodifiableMap(map);
-        }
-
-        return Collections.EMPTY_MAP;
-    }
-
-    private void updateMap(final ISymbol symbol, final String  scopeName)
-    {
-        final Map<Object, ISymbol> map = getMapForScopeInternal(scopeName);
-
-        if (map != null)
-        {
-            map.put(symbol.getName(), symbol);
-        }
-        else
-        {
-            Platform.getLog(JSFCorePlugin.getDefault().getBundle()).log(new Status(IStatus.ERROR, JSFCorePlugin.PLUGIN_ID, 0, "Scope not found: "+scopeName, new Throwable())); //$NON-NLS-1$
-        }
-    }
-
-    private Map<Object, ISymbol> getMapForScopeInternal(final String scopeName)
-    {
-        if (ISymbolConstants.SYMBOL_SCOPE_REQUEST_STRING.equals(scopeName))
-        {
-            return getRequestMap();
-        }
-        else if (ISymbolConstants.SYMBOL_SCOPE_SESSION_STRING.equals(scopeName))
-        {
-            return getSessionMap();
-        }
-        else if (ISymbolConstants.SYMBOL_SCOPE_APPLICATION_STRING.equals(scopeName))
-        {
-            return getApplicationMap();
-        }
-        else if (ISymbolConstants.SYMBOL_SCOPE_NONE_STRING.equals(scopeName))
-        {
-            return getNoneMap();
-        }
-        else if (ISymbolConstants.SYMBOL_SCOPE_VIEW_STRING.equals(scopeName))
-        {
-            return getViewMap();
-        }
-        else if (ISymbolConstants.SYMBOL_SCOPE_FLASH_STRING.equals(scopeName))
-        {
-            return getFlashMap();
-        }
-
-        Platform.getLog(JSFCorePlugin.getDefault().getBundle()).log(new Status(IStatus.ERROR, JSFCorePlugin.PLUGIN_ID, 0, "Scope not found: "+scopeName, new Throwable())); //$NON-NLS-1$
-        return null;
-
-    }
-
-    private Map getRequestMap()
-    {
-        if (_requestMap == null)
-        {
-            _requestMap = new HashMap<Object, ISymbol>();
-        }
-
-        return _requestMap;
-    }
-
-    private Map<Object, ISymbol> getSessionMap()
-    {
-        if (_sessionMap == null)
-        {
-            _sessionMap = new HashMap<Object, ISymbol>();
-        }
-
-        return _sessionMap;
-    }
-
-    private Map<Object, ISymbol> getApplicationMap()
-    {
-        if (_applicationMap == null)
-        {
-            _applicationMap = new HashMap<Object, ISymbol>();
-        }
-
-        return _applicationMap;
-    }
-
-    private Map<Object, ISymbol> getNoneMap()
-    {
-        if (_noneMap == null)
-        {
-            _noneMap = new HashMap<Object, ISymbol>();
-        }
-
-        return _noneMap;
-    }
-    
-    private Map<Object, ISymbol> getViewMap()
-    {
-        if (_viewMap == null)
-        {
-        	_viewMap = new HashMap<Object, ISymbol>();
-        }
-
-        return _viewMap;
-    }
-    
-    private Map<Object, ISymbol> getFlashMap()
-    {
-        if (_flashMap == null)
-        {
-        	_flashMap = new HashMap<Object, ISymbol>();
-        }
-
-        return _flashMap;
-    }
-
-    /**
-     * Aggregates the sets-locale meta-data
-     *
-     * @author cbateman
-     */
-    private static class LocaleSetAggregator
-    {
-        private final static String SETS_LOCALE = "sets-locale"; //$NON-NLS-1$
-
-        private static LocaleSetAggregator create(final IProject project,
-                                              final String uri,
-                                              final String elementName, final String attributeName)
-        {
-            final ITaglibDomainMetaDataModelContext mdContext = TaglibDomainMetaDataQueryHelper.createMetaDataModelContext(project, uri);
-            final Trait trait = TaglibDomainMetaDataQueryHelper.getTrait(mdContext, elementName+"/"+attributeName, SETS_LOCALE); //$NON-NLS-1$
-
-            if (TraitValueHelper.getValueAsBoolean(trait))
-            {
-                return new LocaleSetAggregator();
-            }
-
-            return null;
-        }
-    }
-
-    /**
-     * Aggregates all the symbol contributor meta-data into a single object
-     *
-     * @author cbateman
-     *
-     */
-    private static class SymbolContribAggregator
-    {
-        private final static String CONTRIBUTES_VALUE_BINDING =
-            "contributes-value-binding"; //$NON-NLS-1$
-        private final static String VALUE_BINDING_SCOPE = "value-binding-scope"; //$NON-NLS-1$
-        private final static String VALUE_BINDING_SYMBOL_FACTORY =
-            "value-binding-symbol-factory"; //$NON-NLS-1$
-        private final static String STATIC_TYPE_KEY = "optional-value-binding-static-type"; //$NON-NLS-1$
-        private final static String VALUEEXPRESSION_ATTR_NAME_KEY = "optional-value-binding-valueexpr-attr"; //$NON-NLS-1$
-
-        /**
-         * @param attributeName
-         * @return a new instance only if attributeName is a symbol contributor
-         */
-        private static SymbolContribAggregator create(final IProject project,
-                                              final String uri,
-                                              final String elementName,
-                                              final String attributeName)
-        {
-            final String entityKey = elementName+"/"+attributeName; //$NON-NLS-1$
-            final ITaglibDomainMetaDataModelContext mdContext = TaglibDomainMetaDataQueryHelper.createMetaDataModelContext(project, uri);
-            Trait trait = TaglibDomainMetaDataQueryHelper.getTrait(mdContext, entityKey, CONTRIBUTES_VALUE_BINDING);
-
-            final boolean contribsValueBindings = TraitValueHelper.getValueAsBoolean(trait);
-
-            if (contribsValueBindings)
-            {
-                String scope = null;
-                String symbolFactory = null;
-
-                trait = TaglibDomainMetaDataQueryHelper.getTrait(mdContext, entityKey, VALUE_BINDING_SCOPE);
-                scope = TraitValueHelper.getValueAsString(trait);
-
-                if (scope != null && !scope.equals("")) //$NON-NLS-1$
-                {
-                    trait = TaglibDomainMetaDataQueryHelper.getTrait(mdContext, entityKey, VALUE_BINDING_SYMBOL_FACTORY);
-                    symbolFactory = TraitValueHelper.getValueAsString(trait);
-                }
-
-                trait = TaglibDomainMetaDataQueryHelper.getTrait(mdContext, entityKey, STATIC_TYPE_KEY);
-
-                String staticType = null;
-
-                if (trait != null)
-                {
-                    staticType = TraitValueHelper.getValueAsString(trait);
-                }
-
-                trait = TaglibDomainMetaDataQueryHelper.getTrait(mdContext, entityKey, VALUEEXPRESSION_ATTR_NAME_KEY);
-
-                String valueExprAttr = null;
-                if (trait != null)
-                {
-                    valueExprAttr = TraitValueHelper.getValueAsString(trait);
-                }
-
-                return new SymbolContribAggregator(scope, symbolFactory, staticType, valueExprAttr);
-            }
-
-            return null;
-        }
-
-        private final Map<String, String>   _metadata = new HashMap<String, String>(4);
-
-        SymbolContribAggregator(final String scope, final String factory, final String staticType, final String valueExprAttr)
-        {
-            _metadata.put("scope", scope); //$NON-NLS-1$
-            _metadata.put("factory", factory); //$NON-NLS-1$
-            _metadata.put("staticType", staticType); //$NON-NLS-1$
-            _metadata.put("valueExprAttr", valueExprAttr); //$NON-NLS-1$
-        }
-
-        /**
-         * @return the scope
-         */
-        public String getScope()
-        {
-            return _metadata.get("scope"); //$NON-NLS-1$
-        }
-
-        /**
-         * @return the factory
-         */
-        public AbstractContextSymbolFactory getFactory()
-        {
-            return JSFCommonPlugin.getSymbolFactories().get(_metadata.get("factory")); //$NON-NLS-1$
-        }
-
-        public String getStaticType()
-        {
-            return _metadata.get("staticType"); //$NON-NLS-1$
-        }
-
-        public String getValueExpressionAttr()
-        {
-            return _metadata.get("valueExprAttr"); //$NON-NLS-1$
-        }
-    }
-
-    private final static class CountingMutex extends Object
-    {
-        private long                    _lastModificationStamp = -1;
-        private boolean _signalled = false;
-        private final ILock _lock = Job.getJobManager().newLock();
-
-        /**
-         * Similar to AtomicBoolean.compareAndSet.  If the signalled flag
-         * is the same as expect then update is written to the flag.  Otherwise,
-         * nothing happens.
-         * @param expect the value of _signalled where update occurs
-         * @param update the value written to _signalled if _signalled == expect
-         * 
-         * @return true if the signalled flag was set to update
-         */
-        public boolean compareAndSetSignalled(final boolean expect, final boolean update) {
-            final boolean[] value = new boolean[1];
-            safeRun(new Runnable() {
-            public void run()
-            {
-                if (_signalled == expect)
-                {
-                    _signalled = update;
-                    value[0] = true;
-                }
-                else
-                {
-                    value[0] = false;
-                }
-            }});      
-            return value[0];
-        }
-
-        public boolean hasChanged(final long currentModificationStamp)
-        {
-            final boolean[] value = new boolean[1];
-            safeRun(new Runnable() {
-            public void run()
-            {
-                value[0] = (_lastModificationStamp != currentModificationStamp);
-            }});                
-            return value[0];
-        }
-
-        /**
-         * @param signalled
-         */
-        public void setSignalled(final boolean signalled) {
-            safeRun(new Runnable() {
-                public void run()
-                {
-                    _signalled = signalled;
-                }});
-        }
-
-        public void setModificationStamp(final long newValue)
-        {
-            safeRun(new Runnable() {
-                public void run()
-                {
-                    _lastModificationStamp = newValue;
-                }});
-        }
-        
-        private void safeRun(final Runnable runnable)
-        {
-            _lock.acquire();
-            try
-            {
-                runnable.run();
-            }
-            finally
-            {
-                _lock.release();
-            }
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/jsp/Messages.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/jsp/Messages.java
deleted file mode 100644
index de41104..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/jsp/Messages.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.designtime.internal.jsp;
-
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-/**
- * Message resource class
- * 
- * @author cbateman
- *
- */
-/*package*/ final class Messages {
-    private static final String BUNDLE_NAME = "org.eclipse.jst.jsf.designtime.messages"; //$NON-NLS-1$
-
-    private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle
-            .getBundle(BUNDLE_NAME);
-
-    private Messages() {
-        // no external instatiation
-    }
-
-    /**
-     * @param key
-     * @return the message string for key or  !key! if not found
-     */
-    public static String getString(String key) {
-        try {
-            return RESOURCE_BUNDLE.getString(key);
-        } catch (MissingResourceException e) {
-            return '!' + key + '!';
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/jsp/StartupHandler.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/jsp/StartupHandler.java
deleted file mode 100644
index 660e797..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/jsp/StartupHandler.java
+++ /dev/null
@@ -1,215 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.designtime.internal.jsp;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jst.jsf.common.internal.JSPUtil;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.core.jsfappconfig.JSFAppConfigUtils;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorReference;
-import org.eclipse.ui.IPartListener2;
-import org.eclipse.ui.IStartup;
-import org.eclipse.ui.IWindowListener;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPartReference;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * On workbench startup, registers a part listener that triggers when
- * a JSP editor opens.
- *
- * @author cbateman
- *
- */
-public class StartupHandler implements IStartup
-{
-    private final JSPEditorListener    _partListener = new JSPEditorListener();
-    private final static boolean    DISABLE_EDITOR_OPEN_REFRESH = System
-                                                                        .getProperty("org.eclipse.jst.jsf.jspmodelprocessor.disable.editor.open.refresh") != null; //$NON-NLS-1$
-
-    public void earlyStartup()
-    {
-        PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable()
-        {
-            public void run()
-            {
-                final IWorkbenchWindow  windows[] =
-                    PlatformUI.getWorkbench().getWorkbenchWindows();
-
-                for (final IWorkbenchWindow window : windows)
-                {
-                    final IWorkbenchPage pages[] = window.getPages();
-                    for (final IWorkbenchPage page : pages)
-                    {
-                        final IEditorReference[]  editorReferences =
-                            page.getEditorReferences();
-
-                        for (final IEditorReference editorReference : editorReferences)
-                        {
-                            if (_partListener.isValidJSPEditor(editorReference))
-                            {
-                                _partListener.setJSPModelListener(editorReference);
-                            }
-                        }
-                    }
-                    window.getPartService().addPartListener(_partListener);
-                }
-
-                // TODO: register with all windows?
-                PlatformUI.getWorkbench().addWindowListener(new IWindowListener()
-                {
-                    public void windowActivated(final IWorkbenchWindow window) {
-                        // do nothing
-                    }
-
-                    public void windowDeactivated(final IWorkbenchWindow window) {
-                        // do nothing
-                    }
-
-                    public void windowClosed(final IWorkbenchWindow window) {
-                        window.getPartService().removePartListener(_partListener);
-                    }
-
-                    public void windowOpened(final IWorkbenchWindow window) {
-                        window.getPartService().addPartListener(_partListener);
-                    }
-                });
-            }
-        });
-    }
-
-    private static class JSPEditorListener implements IPartListener2
-    {
-        private JSPModelProcessor         _processor;
-
-        public void partActivated(final IWorkbenchPartReference partRef) {
-            // do nothing
-        }
-
-        public void partBroughtToTop(final IWorkbenchPartReference partRef) {
-            // do nothing
-        }
-
-        public void partClosed(final IWorkbenchPartReference partRef) {
-            // do nothing
-        }
-
-        public void partDeactivated(final IWorkbenchPartReference partRef) {
-            // do nothing
-        }
-
-        public void partOpened(final IWorkbenchPartReference partRef) {
-            if (isValidJSPEditor(partRef))
-            {
-                setJSPModelListener((IEditorReference)partRef);
-            }
-        }
-
-        public void partHidden(final IWorkbenchPartReference partRef) {
-            // do nothing
-        }
-
-        public void partVisible(final IWorkbenchPartReference partRef) {
-            // do nothing
-        }
-
-        public void partInputChanged(final IWorkbenchPartReference partRef) {
-            // do nothing
-        }
-
-        private boolean isJSPEditor(final IEditorReference editorRef)
-        {
-            final IFile file = getIFile(editorRef);
-
-            if (file != null)
-            {
-                return JSPUtil.isJSPContentType(file);
-            }
-
-            return false;
-        }
-
-        /**
-         * @param editorRef
-         * @return true if the editor is editing the JSP content type and
-         * the owning project is a JSF project
-         */
-        boolean isValidJSPEditor(final IEditorReference editorRef)
-        {
-            final IFile file = getIFile(editorRef);
-
-            return file != null &&
-                    JSFAppConfigUtils.isValidJSFProject(file.getProject()) &&
-                        isJSPEditor(editorRef);
-        }
-
-        boolean isValidJSPEditor(final IWorkbenchPartReference partRef)
-        {
-            if (partRef instanceof IEditorReference)
-            {
-                return isValidJSPEditor((IEditorReference)partRef);
-            }
-
-            return false;
-        }
-
-        void setJSPModelListener(final IEditorReference editorRef)
-        {
-            final IFile file = getIFile(editorRef);
-
-            if (file != null && file.isAccessible())
-            {
-                try
-                {
-                    if (!DISABLE_EDITOR_OPEN_REFRESH)
-                    {
-                        // implicitly creates if not present
-                        _processor = JSPModelProcessor.get(file);
-                        _processor.refresh(!JSPModelProcessor.FORCE_REFRESH,
-                                JSPModelProcessor.RUN_ON_CURRENT_THREAD);
-                    }
-                } catch (final Exception e)
-                {
-                    JSFCorePlugin.getDefault().getLog().log(
-                            new Status(IStatus.ERROR, JSFCorePlugin.PLUGIN_ID,
-                                    0, "Error acquiring model processor", e)); //$NON-NLS-1$
-                }
-            }
-        }
-
-        IFile getIFile(final IEditorReference editorRef)
-        {
-            try
-            {
-                final IEditorInput editorInput = editorRef.getEditorInput();
-                final Object adapt = editorInput.getAdapter(IFile.class);
-
-                if (adapt instanceof IFile)
-                {
-                    return (IFile) adapt;
-                }
-            }
-            catch (final PartInitException excp)
-            {
-                JSFCorePlugin.getDefault().getLog().log(new Status(IStatus.ERROR, JSFCorePlugin.PLUGIN_ID, 0, "Error acquiring editor input",excp)); //$NON-NLS-1$
-            }
-
-            return null;
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/messages.properties b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/messages.properties
deleted file mode 100644
index 4ae3bd0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/messages.properties
+++ /dev/null
@@ -1,8 +0,0 @@
-CompositeTagResolvingStrategy_DisplayName=Composite Tag Resolving Strategies
-DefaultJSPTagResolver_DisplayName=Meta-data Driven Resolver
-PersistedDataTagStrategy_DisplayName=Cached Data Tag Resolver
-TagIntrospectingStrategy_DisplayName=Introspecting Tag Resolver
-TLDRegistryManager_DisplayName=JSP Registry Factory
-TLDTagRegistry_RefreshJob=Refreshing JSP tag registry for 
-TLDTagRegistry_UpdateJob=Update job for project 
-UnresolvedJSPTagResolvingStrategy_DisplayName=Unresolved Tag Resolver
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/resolver/ITagElementResolver.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/resolver/ITagElementResolver.java
deleted file mode 100644
index 62d497d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/resolver/ITagElementResolver.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package org.eclipse.jst.jsf.designtime.internal.resolver;
-
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.ITagElement;
-import org.eclipse.jst.jsf.context.IModelContext;
-import org.eclipse.jst.jsf.context.resolver.IDocumentContextResolver;
-import org.w3c.dom.Node;
-
-/**
- * Defines a resolver that can resolve the ITagElement information from the
- * structured document region context.
- *
- */
-public interface ITagElementResolver extends IDocumentContextResolver {
-	
-	/**
-	 * @param node
-	 * @return ITagElement 
-	 */
-	public ITagElement getTagElement(final Node node);
-	
-	public boolean canResolveContext(final IModelContext modelContext);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/resolver/ViewBasedTaglibResolverFactory.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/resolver/ViewBasedTaglibResolverFactory.java
deleted file mode 100644
index 472f762..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/resolver/ViewBasedTaglibResolverFactory.java
+++ /dev/null
@@ -1,248 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.designtime.internal.resolver;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.ITagElement;
-import org.eclipse.jst.jsf.context.IModelContext;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IDOMContextResolver;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IMetadataContextResolver;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.ITaglibContextResolver;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IWorkspaceContextResolver;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.internal.IStructuredDocumentContextResolverFactory2;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.internal.ITextRegionContextResolver;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.jst.jsf.designtime.DTAppManagerUtil;
-import org.eclipse.jst.jsf.designtime.internal.view.XMLViewDefnAdapter;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
-import org.w3c.dom.Attr;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-/**
- * A Taglib resolver that delegates to the design tieme view handler so that it
- * is independent of the tag definition type in use. Document must still be an
- * IStructuredDocument.
- * 
- */
-public class ViewBasedTaglibResolverFactory implements
-IStructuredDocumentContextResolverFactory2, IAdaptable
-{
-    public IDOMContextResolver getDOMContextResolver(
-            final IStructuredDocumentContext context)
-    {
-        // no dom resolver
-        return null;
-    }
-
-    public IMetadataContextResolver getMetadataContextResolver(
-            final IStructuredDocumentContext context)
-    {
-        // no metadata resolver
-        return null;
-    }
-
-    public ITaglibContextResolver getTaglibContextResolver(
-            final IStructuredDocumentContext context)
-    {
-        if (context.getStructuredDocument() instanceof IStructuredDocument)
-        {
-            final IWorkspaceContextResolver resolver = INSTANCE
-            .getWorkspaceContextResolver(context);
-            if (resolver != null)
-            {
-                final IProject project = resolver.getProject();
-                final IResource res = resolver.getResource();
-
-                if (project != null && res instanceof IFile)
-                {
-                    final IFile file = (IFile) res;
-
-                    try
-                    {
-                        return new ViewBasedTaglibResolver(context, file,
-                                project);
-                    }
-                    catch (final IllegalArgumentException e)
-                    {
-                        // the constructor will throw this if the view
-                        // definition
-                        // adapter for file is not of the base type it needs
-                        // just fall through, no need to log
-                    }
-                }
-            }
-        }
-
-        return null;
-    }
-    
-	public ITaglibContextResolver getTaglibContextResolverFromDelegates(
-			IStructuredDocumentContext context) {
-		throw new UnsupportedOperationException();
-	}
-
-	public <T> T getResolver(final IStructuredDocumentContext context, final Class<T> clazz) {
-		if (clazz.equals(ITagElementResolver.class) ||
-				clazz.equals(ITaglibContextResolver.class)) {
-			return (T)getTaglibContextResolver(context);
-		}
-		return null;
-	}
-    /**
-     * A taglib resolver that goes through the design time view handler to
-     * resolve tags. This allows us to abstract the definition format (XML) from
-     * the kind of tag handlers that process it (JSP vs. Facelets vs. others).
-     * 
-     */
-    private static class ViewBasedTaglibResolver implements
-    ITaglibContextResolver, ITagElementResolver
-    {
-        private final IProject                   _project;
-        private final IFile                      _file;
-        private final IStructuredDocumentContext _context;
-
-        /**
-         * @param context
-         * @param file
-         * @param project
-         */
-        private ViewBasedTaglibResolver(
-                final IStructuredDocumentContext context, final IFile file,
-                final IProject project)
-        {
-            super();
-            _context = context;
-            _file = file;
-            _project = project;
-
-            if (DTAppManagerUtil.getXMLViewDefnAdapter(project, file) == null)
-            {
-                throw new IllegalArgumentException(
-                "View definition adapter not found"); //$NON-NLS-1$
-            }
-        }
-
-        public String getTagPrefixForURI(final String uri)
-        {
-            final XMLViewDefnAdapter adapter = DTAppManagerUtil
-                    .getXMLViewDefnAdapter(_file);
-
-            if (adapter != null)
-            {
-                return adapter.getPrefix(uri, _context.getStructuredDocument());
-            }
-            return null;
-        }
-
-        public String getTagURIForNodeName(final Node node)
-        {
-            final XMLViewDefnAdapter adapter = DTAppManagerUtil
-            .getXMLViewDefnAdapter(_file);
-            final Element element = getElement(node);
-            if (element != null && adapter != null)
-            {
-                return adapter.getNamespace(element, _context.getStructuredDocument());
-            }
-            return null;
-        }
-
-        public NodeList getTagsByNamespaceURI(final String uri,
-                final String tagName)
-        {
-            // TODO: what is the purpose of this API? deprecate?
-            return null;
-        }
-
-        public boolean hasTag(final Node node)
-        {
-            // it is sufficient to check that the view adapter will give us
-            // a non-null tag element
-            return _getTagElement(node) != null;
-        }
-
-        public boolean canResolveContext(final IModelContext modelContext)
-        {
-            // must be a JSP page
-            final Object adapter = modelContext.getAdapter(IStructuredDocumentContext.class);
-
-            if (adapter instanceof IStructuredDocumentContext)
-            {
-                return ((IStructuredDocumentContext)adapter).getStructuredDocument() instanceof IStructuredDocument;
-            }
-            return false;
-        }
-
-        private Element getElement(final Node node)
-        {
-            Element checkNode = null;
-
-            if (node instanceof Element)
-            {
-                checkNode = (Element) node;
-            }
-            else if (node instanceof Attr)
-            {
-                checkNode = ((Attr) node).getOwnerElement();
-            }
-            return checkNode;
-        }
-
-        private ITagElement _getTagElement(final Node node)
-        {
-            final Element element = getElement(node);
-
-            final XMLViewDefnAdapter adapter =
-                DTAppManagerUtil.getXMLViewDefnAdapter(_project, _file);
-
-            if (element != null && adapter != null)
-            {
-                return adapter.mapToTagElement(element, _context
-                        .getStructuredDocument());
-            }
-            return null;
-        }
-        
-		public ITagElement getTagElement(final Node node) {			
-			return _getTagElement(node);
-		}
-
-    }
-
-
-    public ITextRegionContextResolver getTextRegionResolver(
-            final IStructuredDocumentContext context)
-    {
-        // no text region resolver
-        return null;
-    }
-
-    public IWorkspaceContextResolver getWorkspaceContextResolver(
-            final IStructuredDocumentContext context)
-    {
-        // no workspace resolver
-        return null;
-    }
-
-    public Object getAdapter(final Class adapter)
-    {
-        if (adapter.isInstance(this))
-        {
-            return this;
-        }
-        return null;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/resources/AbstractJSFResourceLocator.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/resources/AbstractJSFResourceLocator.java
deleted file mode 100644
index b0d5df8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/resources/AbstractJSFResourceLocator.java
+++ /dev/null
@@ -1,57 +0,0 @@
-package org.eclipse.jst.jsf.designtime.internal.resources;
-
-import java.util.List;
-import java.util.concurrent.CopyOnWriteArrayList;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jst.jsf.common.internal.locator.AbstractLocator;
-import org.eclipse.jst.jsf.common.internal.locator.ILocatorChangeListener;
-import org.eclipse.jst.jsf.designtime.internal.resources.JSFResourceChangeListener.JSFResourceChangedEvent;
-
-/**
- * A locator that finds JSF resources.
- * 
- * @author cbateman
- * 
- */
-public abstract class AbstractJSFResourceLocator extends
-        AbstractLocator<List<IJSFResourceFragment>, IProject, String> implements
-        IJSFResourceLocator
-{
-
-    /**
-     * @param id
-     * @param displayName
-     * @param noResultValue
-     * @param mutableListenerList
-     */
-    protected AbstractJSFResourceLocator(String id, String displayName,
-            List<IJSFResourceFragment> noResultValue,
-            CopyOnWriteArrayList<ILocatorChangeListener> mutableListenerList)
-    {
-        super(id, displayName, noResultValue, mutableListenerList);
-    }
-
-    protected abstract List<IJSFResourceFragment> doLocate(IProject context);
-
-    /**
-     * TODO: would be better to have a private interface to call fire.
-     * 
-     * @param event
-     */
-    protected void fireChangeEvent(final JSFResourceChangedEvent event)
-    {
-        super.fireChangeEvent(event);
-    }
-
-    public void addListener(JSFResourceChangeListener listener)
-    {
-        super.addListener(listener);
-    }
-
-    public void removeListener(JSFResourceChangeListener listener)
-    {
-        super.removeListener(listener);
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/resources/IJSFResource.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/resources/IJSFResource.java
deleted file mode 100644
index 7ece953..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/resources/IJSFResource.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package org.eclipse.jst.jsf.designtime.internal.resources;
-
-/**
- * Represents a JSF loadable resource (spec 2.6).
- * 
- * @author cbateman
- *
- */
-public interface IJSFResource extends IJSFResourceFragment
-{
-    /**
-     * @param contentTypeName
-     * @return true if the resources matches the content type indicated by the
-     *         contentTypeName.
-     */
-    public abstract boolean isContentType(final String contentTypeName);
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/resources/IJSFResourceContainer.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/resources/IJSFResourceContainer.java
deleted file mode 100644
index e65ff01..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/resources/IJSFResourceContainer.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package org.eclipse.jst.jsf.designtime.internal.resources;
-
-/**
- * A JSF Resource fragment that is a container for other fragments.
- * @author cbateman
- *
- */
-public interface IJSFResourceContainer extends IJSFResourceFragment
-{
-    // do nothing.  Tagging for now.
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/resources/IJSFResourceFragment.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/resources/IJSFResourceFragment.java
deleted file mode 100644
index 71d474c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/resources/IJSFResourceFragment.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package org.eclipse.jst.jsf.designtime.internal.resources;
-
-/**
- * An object that backs a fragment of a JSF resource. A fragment may be a full
- * fledged JSF resource or a may be another interesting related object such as
- * the library folder that holds a resource.
- * 
- * @author cbateman
- * 
- */
-public interface IJSFResourceFragment
-{
-
-    /**
-     * @return true if the fragment is accessible
-     */
-    public abstract boolean isAccessible();
-
-    /**
-     * @return the type of this fragment.
-     */
-    public abstract Type getType();
-
-    /**
-     * @return the id of the fragment
-     */
-    public ResourceFragmentIdentifier getId();
-
-    /**
-     * The type of a fragment
-     * 
-     */
-    public enum Type
-    {
-        /**
-         * A fragment of this type is a full-fledged JSF Resource. A fragment of
-         * this type can always be cast to IJSFResource.
-         */
-        RESOURCE,
-        /**
-         * A fragment of this type is a container for actual RESOURCE's or other
-         * fragments (or both). A fragment of this type can always be cast to
-         * IJSFResourceContainer.
-         */
-        CONTAINER;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/resources/IJSFResourceLocator.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/resources/IJSFResourceLocator.java
deleted file mode 100644
index c44673c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/resources/IJSFResourceLocator.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package org.eclipse.jst.jsf.designtime.internal.resources;
-
-import java.util.List;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jst.jsf.common.internal.locator.ILocator;
-
-/**
- * A JSF resource locator.
- * 
- * @author cbateman
- *
- */
-public interface IJSFResourceLocator extends ILocator<List<IJSFResourceFragment>, IProject, String>
-{
-    /**
-     * @param listener
-     */
-    public void addListener(final JSFResourceChangeListener listener);
-    /**
-     * @param listener
-     */
-    public void removeListener(final JSFResourceChangeListener listener);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/resources/IJarBasedJSFResource.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/resources/IJarBasedJSFResource.java
deleted file mode 100644
index 76bcf62..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/resources/IJarBasedJSFResource.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package org.eclipse.jst.jsf.designtime.internal.resources;
-
-import java.net.URL;
-
-/**
- * @author cbateman
- *
- */
-public interface IJarBasedJSFResource extends IJSFResource
-{
-    /**
-     * @return the uri of the jar where the resource lives
-     */
-    public abstract URL getJarURL();
-
-    /**
-     * @return the zipEntry into the jar where the resource is.
-     */
-    public abstract String getJarEntryName();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/resources/IWorkspaceJSFResourceFragment.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/resources/IWorkspaceJSFResourceFragment.java
deleted file mode 100644
index d0d4a8a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/resources/IWorkspaceJSFResourceFragment.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package org.eclipse.jst.jsf.designtime.internal.resources;
-
-import org.eclipse.core.resources.IResource;
-
-/**
- * A JSF fragment whose design time object(s) of interest are in the workspace
- * @author cbateman
- *
- */
-public interface IWorkspaceJSFResourceFragment extends IJSFResourceFragment
-{
-
-    /**
-     * @return the corresponding design time workspace resource.
-     */
-    public IResource getResource();
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/resources/JSFResource.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/resources/JSFResource.java
deleted file mode 100644
index ccd37fe..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/resources/JSFResource.java
+++ /dev/null
@@ -1,51 +0,0 @@
-package org.eclipse.jst.jsf.designtime.internal.resources;
-
-import org.eclipse.jst.jsf.common.internal.resource.ContentTypeResolver;
-
-/**
- * Represents a JSF loadable resource (spec 2.6).
- * 
- * @author cbateman
- * 
- */
-public abstract class JSFResource extends JSFResourceFragment implements IJSFResource
-{
-    private final ContentTypeResolver _contentTypeResolver;
-
-    /**
-     * @param id
-     * @param contentTypeResolver
-     */
-    public JSFResource(final ResourceIdentifier id,
-            final ContentTypeResolver contentTypeResolver)
-    {
-        super(id, Type.RESOURCE);
-        _contentTypeResolver = contentTypeResolver;
-    }
-
-    /**
-     * @return the identifier for this resource.
-     */
-    public final ResourceIdentifier getId()
-    {
-        return (ResourceIdentifier) super.getId();
-    }
-
-    /**
-     * @return true if this jsf resource is currently accessible.
-     */
-    @Override
-    public abstract boolean isAccessible();
-
-    public boolean isContentType(final String contentTypeName)
-    {
-        return _contentTypeResolver.matchesType(contentTypeName, getId()
-                .getResourceName());
-    }
-
-    @Override
-    public String toString()
-    {
-        return getId().toString();
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/resources/JSFResourceChangeListener.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/resources/JSFResourceChangeListener.java
deleted file mode 100644
index f7004c5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/resources/JSFResourceChangeListener.java
+++ /dev/null
@@ -1,110 +0,0 @@
-package org.eclipse.jst.jsf.designtime.internal.resources;
-
-import org.eclipse.jst.jsf.common.internal.locator.ILocatorChangeListener;
-
-/**
- * 
- * @author cbateman
- *
- */
-public abstract class JSFResourceChangeListener implements ILocatorChangeListener
-{
-
-   /**
-     * Indicates that a tag library has changed
-     * @author cbateman
-     *
-     */
-    public static class JSFResourceChangedEvent extends LocatorChangeEvent
-    {
-        /**
-         * 
-         */
-        private static final long serialVersionUID = -1546380081551499245L;
-
-        /**
-         * TODO: what happens if one locator has a namespace collision with
-         * another one?
-         */
-        public enum CHANGE_TYPE
-        {
-            /**
-             * Indicates that the resource is new
-             */
-            ADDED, 
-            
-            /**
-             * Indicates that the resource was removed.
-             */
-            REMOVED, 
-            
-            /**
-             * Indicates that the resource is not new, but it's content
-             * has changed
-             */
-            CHANGED
-        }
-
-        private final CHANGE_TYPE       _changeType;
-        private final IJSFResourceFragment _oldValue;
-        private final IJSFResourceFragment _newValue;
-
-        /**
-         * @param source
-         * @param oldValue 
-         * @param newValue 
-         * @param changeType
-         */
-        public JSFResourceChangedEvent(
-                final AbstractJSFResourceLocator source,
-                final IJSFResourceFragment oldValue, 
-                final IJSFResourceFragment newValue,
-                final CHANGE_TYPE changeType)
-        {
-            super(source);
-            _changeType = changeType;
-            _oldValue = oldValue;
-            _newValue = newValue;
-        }
-
-        @Override
-        public IJSFResourceLocator getSource()
-        {
-            return (IJSFResourceLocator) super.getSource();
-        }
-
-        /**
-         * @return the type of the change
-         */
-        public final CHANGE_TYPE getChangeType()
-        {
-            return _changeType;
-        }
-
-        /**
-         * @return the old value. This is null if the event is ADDED
-         */
-        public final IJSFResourceFragment getOldValue()
-        {
-            return _oldValue;
-        }
-        
-        /**
-         * @return the new value.  This is null if the event is REMOVED
-         */
-        public final IJSFResourceFragment getNewValue()
-        {
-            return _newValue;
-        }
-    }
-
-    public final void changed(final LocatorChangeEvent event)
-    {
-        changed((JSFResourceChangedEvent)event);
-    }
-
-    /**
-     * @param event
-     */
-    public abstract void changed(final JSFResourceChangedEvent event);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/resources/JSFResourceContainer.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/resources/JSFResourceContainer.java
deleted file mode 100644
index 3ffaf58..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/resources/JSFResourceContainer.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package org.eclipse.jst.jsf.designtime.internal.resources;
-
-/**
- * A container for JSFResource's.  This is a fragment in that it's identifier
- * may not point to a valid JSFResource but rather a portion of that nonetheless
- * maps to some interesting underlying contain object such as an IFolder.
- * 
- * @author cbateman
- *
- */
-public abstract class JSFResourceContainer extends JSFResourceFragment implements IJSFResourceContainer
-{
-
-    /**
-     * @param id
-     */
-    public JSFResourceContainer(ResourceFragmentIdentifier id)
-    {
-        super(id, Type.CONTAINER);
-    }
-
-    @Override
-    public abstract boolean isAccessible();
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/resources/JSFResourceFragment.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/resources/JSFResourceFragment.java
deleted file mode 100644
index 4de62ae..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/resources/JSFResourceFragment.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package org.eclipse.jst.jsf.designtime.internal.resources;
-
-/**
- * 
- * @author cbateman
- * 
- */
-public abstract class JSFResourceFragment implements IJSFResourceFragment
-{
-    private final ResourceFragmentIdentifier _id;
-    private final Type _type;
-
-    /**
-     * @param id
-     * @param type
-     */
-    public JSFResourceFragment(final ResourceFragmentIdentifier id,
-            final Type type)
-    {
-        _id = id;
-        _type = type;
-    }
-
-    public ResourceFragmentIdentifier getId()
-    {
-        return _id;
-    }
-
-    public final Type getType()
-    {
-        return _type;
-    }
-
-    public abstract boolean isAccessible();
-    
-    public String toString()
-    {
-        String toString = _id != null ? _id.toString() : "?"; //$NON-NLS-1$
-        return String.format("%s[%s]", toString, _type.toString()); //$NON-NLS-1$
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/resources/JarBasedJSFResource.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/resources/JarBasedJSFResource.java
deleted file mode 100644
index 0f2945d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/resources/JarBasedJSFResource.java
+++ /dev/null
@@ -1,107 +0,0 @@
-package org.eclipse.jst.jsf.designtime.internal.resources;
-
-import java.io.IOException;
-import java.net.JarURLConnection;
-import java.net.URL;
-import java.net.URLConnection;
-import java.util.jar.JarFile;
-import java.util.zip.ZipEntry;
-
-import org.eclipse.jst.jsf.common.internal.resource.ContentTypeResolver;
-
-/**
- * A JSF Resource that references an entry in the jar. Because of changes in the
- * underlying system since it was created, there is no guarantee that the jarURI
- * is still valid. Callers should call isAccessible to determine this.
- * 
- * @author cbateman
- * 
- */
-public class JarBasedJSFResource extends JSFResource implements IJarBasedJSFResource
-{
-
-    private final URL _jarURL;
-
-    /**
-     * @param id
-     * @param jarURL
-     * @param contentTypeResolver
-     */
-    public JarBasedJSFResource(final ResourceIdentifier id, final URL jarURL,
-            final ContentTypeResolver contentTypeResolver)
-    {
-        super(id, contentTypeResolver);
-        _jarURL = jarURL;
-    }
-
-    /**
-     * @return the uri pointing in the the jar where the resource lives.
-     */
-    public URL getJarURL()
-    {
-        return _jarURL;
-    }
-
-    /**
-     * @return the jar entry name for this resource.
-     */
-    public String getJarEntryName()
-    {
-        return String.format("META-INF/resources/%s", getId().toString()); //$NON-NLS-1$
-    }
-
-    private ZipEntry getZipEntry(final JarFile jarFile)
-    {
-        return jarFile.getEntry(getJarEntryName());
-    }
-
-    /**
-     * @return true if is accessible.
-     */
-    @Override
-    public boolean isAccessible()
-    {
-        JarFile jarFile = null;
-        try
-        {
-            jarFile = getJarFile();
-            if (jarFile != null)
-            {
-                final ZipEntry entry = getZipEntry(jarFile);
-                return entry != null;
-            }
-        } finally
-        {
-            if (jarFile != null)
-            {
-//                try
-//                {
-//                    // TODO
-////                    jarFile.close();
-//                } /*catch (IOException e)
-//                {
-//                    // fall-through.
-//                }*/
-            }
-        }
-        return false;
-    }
-
-    private JarFile getJarFile()
-    {
-        URLConnection connection;
-        try
-        {
-            connection = _jarURL.openConnection();
-            connection.connect();
-            if (connection instanceof JarURLConnection)
-            {
-                return ((JarURLConnection) connection).getJarFile();
-            }
-        } catch (IOException e)
-        {
-            // fall through
-        }
-        return null;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/resources/JarBasedJSFResourceLocator.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/resources/JarBasedJSFResourceLocator.java
deleted file mode 100644
index ef59c6f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/resources/JarBasedJSFResourceLocator.java
+++ /dev/null
@@ -1,172 +0,0 @@
-package org.eclipse.jst.jsf.designtime.internal.resources;
-
-import java.io.IOException;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-import java.util.concurrent.CopyOnWriteArrayList;
-import java.util.jar.JarEntry;
-import java.util.jar.JarFile;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jst.jsf.common.internal.finder.VisitorMatcher;
-import org.eclipse.jst.jsf.common.internal.finder.acceptor.JarEntryMatchingAcceptor;
-import org.eclipse.jst.jsf.common.internal.finder.matcher.TaglibJarEntryFinder;
-import org.eclipse.jst.jsf.common.internal.locator.ILocatorChangeListener;
-import org.eclipse.jst.jsf.common.internal.resource.ClasspathJarFile;
-import org.eclipse.jst.jsf.common.internal.resource.ContentTypeResolver;
-import org.eclipse.jst.jsf.common.internal.resource.IJarLocator;
-import org.eclipse.jst.jsf.common.internal.util.JarUtilities;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-
-/**
- * A JSF resource locator that finds resources in jars.
- * 
- * @author cbateman
- * 
- */
-public class JarBasedJSFResourceLocator extends AbstractJSFResourceLocator
-{
-    private final IJarLocator _provider;
-    private final ContentTypeResolver _contentTypeResolver;
-    private static final Pattern _resourcePathPattern = Pattern
-            .compile("META-INF/resources/(.*)"); //$NON-NLS-1$
-    private static final TaglibJarEntryFinder _resourceFinder = new TaglibJarEntryFinder(
-            _resourcePathPattern);
-
-    /**
-     * @param id
-     * @param displayName
-     * @param noResultValue
-     * @param mutableListenerList
-     * @param provider
-     * @param contentTypeResolver
-     */
-    public JarBasedJSFResourceLocator(
-            final String id,
-            final String displayName,
-            final List<IJSFResourceFragment> noResultValue,
-            final CopyOnWriteArrayList<ILocatorChangeListener> mutableListenerList,
-            final IJarLocator provider,
-            final ContentTypeResolver contentTypeResolver)
-    {
-        super(id, displayName, noResultValue, mutableListenerList);
-        _provider = provider;
-        _contentTypeResolver = contentTypeResolver;
-    }
-
-    /**
-     * @param noResultValue
-     * @param mutableListenerList
-     * @param provider
-     * @param contentTypeResolver
-     */
-    public JarBasedJSFResourceLocator(
-            final List<IJSFResourceFragment> noResultValue,
-            final CopyOnWriteArrayList<ILocatorChangeListener> mutableListenerList,
-            final IJarLocator provider,
-            final ContentTypeResolver contentTypeResolver)
-    {
-        this(
-                "", "", noResultValue, mutableListenerList, provider, contentTypeResolver); //$NON-NLS-1$//$NON-NLS-2$
-    }
-
-    @Override
-    public void start(final IProject initialContext)
-    {
-        _provider.start(initialContext);
-        super.start(initialContext);
-    }
-
-    @Override
-    public void stop()
-    {
-        _provider.stop();
-        super.stop();
-    }
-
-    @Override
-    protected List<IJSFResourceFragment> doLocate(final IProject project)
-    {
-        final List<IJSFResourceFragment> resourcesFound = new ArrayList<IJSFResourceFragment>();
-        final Collection<? extends ClasspathJarFile> jars = _provider
-                .getJars(project);
-        for (final ClasspathJarFile classpathJarFile : jars)
-        {
-            final JarFile jarFile = classpathJarFile.getJarFile();
-            if (jarFile != null)
-            {
-                resourcesFound.addAll(processJar(jarFile));
-            }
-        }
-        return resourcesFound;
-    }
-
-    /**
-     * @param entry
-     * @param defaultDtdStream
-     * @throws Exception
-     */
-    private List<JSFResource> processJar(final JarFile jarFile)
-    {
-        final List<JSFResource> tagLibsFound = new ArrayList<JSFResource>();
-        try
-        {
-            if (jarFile != null)
-            {
-                final JarEntryMatchingAcceptor acceptor = new JarEntryMatchingAcceptor();
-                final VisitorMatcher<JarFile, JarEntry, String> matcher = new VisitorMatcher<JarFile, JarEntry, String>(
-                        "", "", acceptor, Collections.singletonList(_resourceFinder)); //$NON-NLS-1$//$NON-NLS-2$
-                final Collection<? extends JarEntry> matchingEntries = matcher
-                        .find(jarFile);
-                for (final JarEntry jarEntry : matchingEntries)
-                {
-                    try
-                    {
-                        final Matcher patternMatcher = _resourcePathPattern
-                                .matcher(jarEntry.getName());
-                        if (patternMatcher.matches())
-                        {
-                            final String group = patternMatcher.group(1);
-                            if (group != null && group.trim().length() > 0)
-                            {
-                                final ResourceIdentifier libRes = new ResourceIdentifierFactory()
-                                        .createLibraryResource(group);
-                                final URL jarUrl = JarUtilities.INSTANCE
-                                        .createJarUrl(jarFile);
-                                tagLibsFound.add(new JarBasedJSFResource(
-                                        libRes, jarUrl, _contentTypeResolver));
-                            }
-                        }
-                    } catch (final Exception e)
-                    {
-                        JSFCorePlugin.log(
-                                "Error initializing facelet registry entry", //$NON-NLS-1$
-                                e);
-                    }
-                }
-            }
-        } catch (final Exception e)
-        {
-            JSFCorePlugin.log(e,
-                    "While locating jar based facelet tag libraries"); //$NON-NLS-1$
-        } finally
-        {
-            if (jarFile != null)
-            {
-                try
-                {
-                    jarFile.close();
-                } catch (final IOException ioe)
-                {
-                    JSFCorePlugin.log("Error closing jar file", ioe); //$NON-NLS-1$
-                }
-            }
-        }
-        return tagLibsFound;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/resources/LibraryResourceFragmentIdentifier.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/resources/LibraryResourceFragmentIdentifier.java
deleted file mode 100644
index 744f0b1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/resources/LibraryResourceFragmentIdentifier.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package org.eclipse.jst.jsf.designtime.internal.resources;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-
-/**
- * A fragment identifier for a library folder.
- * 
- * @author cbateman
- *
- */
-public class LibraryResourceFragmentIdentifier extends
-        ResourceFragmentIdentifier
-{
-    private final String _libraryName;
-
-    /**
-     * @param libraryName
-     */
-    public LibraryResourceFragmentIdentifier(final String libraryName)
-    {
-        super();
-        _libraryName = libraryName;
-    }
-
-    @Override
-    public String getLibraryName()
-    {
-        return _libraryName;
-    }
-    @Override
-    public IStatus validate()
-    {
-        return Status.OK_STATUS;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/resources/LibraryResourceIdentifier.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/resources/LibraryResourceIdentifier.java
deleted file mode 100644
index 8d78273..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/resources/LibraryResourceIdentifier.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package org.eclipse.jst.jsf.designtime.internal.resources;
-
-/**
- * A resource identifier for a library.
- * @author cbateman
- *
- */
-public class LibraryResourceIdentifier extends ResourceIdentifier
-{
-    private final String _libraryName;
-
-    /**
-     * @param resName 
-     * @param libraryName
-     */
-    public LibraryResourceIdentifier(final String resName, final String libraryName)
-    {
-        super(resName);
-        _libraryName = libraryName;
-    }
-
-    @Override
-    public String getLibraryName()
-    {
-        return _libraryName;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/resources/Messages.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/resources/Messages.java
deleted file mode 100644
index d08cae6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/resources/Messages.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package org.eclipse.jst.jsf.designtime.internal.resources;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * NLS for resource identifier messages.
- * @author cbateman
- *
- */
-public class Messages extends NLS
-{
-    private static final String BUNDLE_NAME = "org.eclipse.jst.jsf.designtime.internal.resources.messages"; //$NON-NLS-1$
-    /**
-     * see messages.properties
-     */
-    public static String ResourceIdentifier_0;
-    static
-    {
-        // initialize resource bundle
-        NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-    }
-
-    private Messages()
-    {
-        // no external instantiation
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/resources/ResourceFragmentIdentifier.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/resources/ResourceFragmentIdentifier.java
deleted file mode 100644
index db87d34..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/resources/ResourceFragmentIdentifier.java
+++ /dev/null
@@ -1,132 +0,0 @@
-package org.eclipse.jst.jsf.designtime.internal.resources;
-
-import org.eclipse.core.runtime.IStatus;
-
-/**
- * Represents a piece of a resource identifier.
- * 
- * [localePrefix/][libraryName/][libraryVersion/][resourceName][/resourceVersion]
- * 
- * @author cbateman
- *
- */
-public abstract class ResourceFragmentIdentifier
-{
-
-    /**
-     * @return true if validate().isOk
-     */
-    public boolean isValid()
-    {
-        return validate().isOK();
-    }
-
-    /**
-     * @return a validation status for the current value of this identifier
-     */
-    public abstract IStatus validate();
-
-    /**
-     * @return the resource name or null if none.
-     */
-    public String getResourceName()
-    {
-        return null;
-    }
-
-    /**
-     * @return the locale prefix or null if none.
-     */
-    public String getLocalePrefix()
-    {
-        return null;
-    }
-
-    /**
-     * @return the library name or null if none.
-     */
-    public String getLibraryName()
-    {
-        return null;
-    }
-
-    /**
-     * @return the library version or null if none.
-     */
-    public String getLibraryVersion()
-    {
-        return null;
-    }
-
-    /**
-     * @return the resource version or null if none.
-     */
-    public String getResourceVersion()
-    {
-        return null;
-    }
-
-    @Override
-    public boolean equals(Object obj)
-    {
-        if (super.equals(obj))
-        {
-            return true;
-        }
-    
-        if (obj instanceof ResourceIdentifier)
-        {
-            String meToString = toString();
-            String otherToString = obj.toString();
-            return meToString != null && meToString.equals(otherToString);
-        }
-        return false;
-    }
-
-    @Override
-    public int hashCode()
-    {
-        String toString = toString();
-        return toString != null ? toString.hashCode() : 0;
-    }
-
-    
-    @Override
-    public String toString()
-    {
-        String toString = ""; //$NON-NLS-1$
-        
-        toString = append(toString, getLocalePrefix());
-        toString = append(toString, getLibraryName());
-        toString = append(toString, getLibraryVersion());
-        toString = append(toString, getResourceName());
-        toString = append(toString, getResourceVersion());
-        return toString;
-    }
-
-    /**
-     * @param appendStr
-     * @param toAppend
-     * @return a string with to toAppend appended to appendStr if it is not null.
-     * If appendStr is not append, a '/' is added between the two concatenated strings.
-     */
-    protected String append(String appendStr, final String toAppend)
-    {
-        if (toAppend != null)
-        {
-            if (appendStr.length() > 0)
-            {
-                appendStr += "/"; //$NON-NLS-1$
-            }
-            appendStr += toAppend;
-        }
-        return appendStr;
-    }
-    /**
-     * @return true if this identifier represents only a fragment of an identifier.
-     */
-    public boolean isFragment()
-    {
-        return true;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/resources/ResourceIdentifier.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/resources/ResourceIdentifier.java
deleted file mode 100644
index 19f86ef..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/resources/ResourceIdentifier.java
+++ /dev/null
@@ -1,112 +0,0 @@
-package org.eclipse.jst.jsf.designtime.internal.resources;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.MultiStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-
-/**
- * Encapsulates the concept of a JSF (2.0+) resource identifier per 2.6.1 of the
- * specification. The class does not ensure validity of the identifier.
- * 
- * You can call validate to determine if the contents are correct.
- * 
- * @author cbateman
- * 
- */
-public class ResourceIdentifier extends ResourceFragmentIdentifier
-{
-    /**
-     * Resource name is not optional on identifiers.
-     */
-    public static final int RESOURCE_NAME_MUST_NOT_BE_EMPTY = 0;
-    /**
-     * The namespace for validation diagnositics created by validate.
-     */
-    public static final String ResourceIdentifierValidationNamespace = JSFCorePlugin.PLUGIN_ID
-            + "_JSFResourceIdentifier"; //$NON-NLS-1$
-    private final String _resName;
-
-    /**
-     * @param resName
-     */
-    public ResourceIdentifier(String resName)
-    {
-        super();
-        _resName = resName;
-    }
-
-    /**
-     * Allow fragments to be 
-     */
-    protected ResourceIdentifier()
-    {
-        super();
-        _resName = null;
-    }
-    /**
-     * @return the resource name or null if none.
-     */
-    @Override
-    public String getResourceName()
-    {
-        return _resName;
-    }
-
-    /**
-     * @return a status object multi-value that contains the results of
-     *         validating this resoure identifier.
-     */
-    @Override
-    public IStatus validate()
-    {
-        final String id = ResourceIdentifierValidationNamespace;
-        final MultiStatus status = new MultiStatus(id, 0,
-                "Resource identifier problems", null); //$NON-NLS-1$
-
-        if (getResourceName() == null)
-        {
-            status.add(new Status(IStatus.ERROR, id,
-                    RESOURCE_NAME_MUST_NOT_BE_EMPTY,
-                    Messages.ResourceIdentifier_0, null));
-        }
-
-        return status;
-    }
-
-    @Override
-    public String toString()
-    {
-        if (!validate().isOK())
-        {
-            throw new IllegalStateException();
-        }
-        String idString = getResourceName();
-        if (getResourceVersion() != null)
-        {
-            idString = String.format("%s/%s", getResourceVersion(), idString); //$NON-NLS-1$
-        }
-        if (getLibraryName() != null)
-        {
-            idString = String.format("%s/%s", getLibraryName(), idString); //$NON-NLS-1$
-        }
-    
-        if (getLocalePrefix() != null)
-        {
-            idString = String.format("%s/%s", getLocalePrefix(), idString); //$NON-NLS-1$
-        }
-    
-        if (getResourceVersion() != null)
-        {
-            idString += "/" + getResourceVersion(); //$NON-NLS-1$
-        }
-        return idString;
-    }
-
-    @Override
-    public final boolean isFragment()
-    {
-        return false;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/resources/ResourceIdentifierFactory.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/resources/ResourceIdentifierFactory.java
deleted file mode 100644
index 004083b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/resources/ResourceIdentifierFactory.java
+++ /dev/null
@@ -1,167 +0,0 @@
-package org.eclipse.jst.jsf.designtime.internal.resources;
-
-import java.util.regex.Pattern;
-
-/**
- * Creates a resource identifier from a string.  Because id strings are ambiguous,
- * the caller must used specific methods to resolve the ambiguity.
- * 
- * @author cbateman
- *
- */
-public class ResourceIdentifierFactory
-{
-    /**
-     * The regular expression for version matching
-     */
-    public static final String VersionRegex = "[0-9]+(_[0-9]+)*"; //$NON-NLS-1$
-    /**
-     * A precompiled regex pattern for matching resource version.
-     */
-    public static final Pattern VersionPattern = Pattern.compile(VersionRegex);
-
-    /**
-     * @param idString 
-     * @return a LibraryResourceIdentifier based on the string.  The call
-     * assumes that the identifier contains a library name.  If the idString
-     * can't be resolved for correctness, InvalidIdentifierException will be thrown.
-     * @throws InvalidIdentifierException 
-     */
-    public ResourceIdentifier createLibraryResource(final String idString) throws InvalidIdentifierException
-    {
-        final String[] parts = idString.split("/"); //$NON-NLS-1$
-        String resName = null;
-        String libraryName = null;
-        switch(parts.length)
-        {
-            case 1:
-                // The whole string is the resource name.  There is no library name.
-                resName = parts[0];
-                break;
-            case 2:
-                // the first part is the libraryName and the second is the res name
-                // TODO: this is ambiguous with locale/resourceName
-                resName = parts[1];
-                libraryName = parts[0];
-                break;
-            case 3:
-                // is it of form libraryName/libraryVersion/resourceName?
-                if (VersionPattern.matcher(parts[1]).matches())
-                {
-                    resName = parts[2];
-                    libraryName = parts[0];
-                    break;
-                }
-                // if no, then this is invalid
-                throw new InvalidIdentifierException(idString);
-            case 4:
-                // is it of the form locale/libraryName/libraryVersion/resourceName
-                if (VersionPattern.matcher(parts[2]).matches())
-                {
-                    resName = parts[3];
-                    libraryName = parts[1];
-                    break;
-                }
-                // no? then is it libraryName/libraryVersion/resourceName/resourceVersion
-                else if (VersionPattern.matcher(parts[1]).matches())
-                {
-                    resName = parts[2];
-                    libraryName = parts[0];
-                    break;
-                }
-                // no? then assume it is locale/libraryName/resourceName/resourceVersion
-                else
-                {
-                    resName = parts[2];
-                    libraryName = parts[1];
-                    break;
-                }
-            case 5:
-                // this is the full one: locale/libraryName/libraryVersion/resourceName/resourceVersion
-                resName = parts[3];
-                libraryName = parts[1];
-            break;
-        }
-        
-        if (resName == null)
-        {
-            throw new InvalidIdentifierException(idString);
-        }
-        
-        return new LibraryResourceIdentifier(resName, libraryName);
-    }
-
-    /**
-     * @param libraryName
-     * @return a new resource fragment identifier for a library folder.
-     */
-    public ResourceFragmentIdentifier createLibraryFragment(final String libraryName)
-    {
-        return new LibraryResourceFragmentIdentifier(libraryName);
-    }
-
-    /**
-     * Indicates an invalid id.
-     * 
-     * @author cbateman
-     *
-     */
-    public static class InvalidIdentifierException extends Exception
-    {
-        
-        private final String _id;
-
-        /**
-         * @param id
-         */
-        public InvalidIdentifierException(final String id)
-        {
-            super();
-            _id = id;
-       }
-
-        /**
-         * @param message
-         * @param cause
-         * @param id
-         */
-        public InvalidIdentifierException(final String message, final Throwable cause, final String id)
-        {
-            super(message, cause);
-            _id = id;
-        }
-
-        /**
-         * @param message
-         * @param id
-         */
-        public InvalidIdentifierException(final String message, final String id)
-        {
-            super(message);
-            _id = id;
-        }
-
-        /**
-         * @param cause
-         * @param id
-         */
-        public InvalidIdentifierException(final Throwable cause, final String id)
-        {
-            super(cause);
-            _id = id;
-        }
-
-        /**
-         * @return the id that was found to be invalid.
-         */
-        public final String getId()
-        {
-            return _id;
-        }
-
-        /**
-         * 
-         */
-        private static final long serialVersionUID = -8926293207447823901L;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/resources/WorkspaceJSFResource.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/resources/WorkspaceJSFResource.java
deleted file mode 100644
index c0d48e8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/resources/WorkspaceJSFResource.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package org.eclipse.jst.jsf.designtime.internal.resources;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.jst.jsf.common.internal.resource.ContentTypeResolver;
-
-/**
- * A JSF resource that corresponds to an object in the workspace.
- * @author cbateman
- *
- */
-public class WorkspaceJSFResource extends JSFResource implements IWorkspaceJSFResourceFragment
-{
-    private final IResource _res;
-
-    /**
-     * @param id
-     * @param res
-     * @param contentTypeResolver 
-     */
-    public WorkspaceJSFResource(final ResourceIdentifier id, final IResource res, final ContentTypeResolver contentTypeResolver)
-    {
-        super(id, contentTypeResolver);
-        _res = res;
-    }
-
-    public final IResource getResource()
-    {
-        return _res;
-    }
-
-    
-    public final boolean isAccessible()
-    {
-        return _res.isAccessible();
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/resources/WorkspaceJSFResourceContainer.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/resources/WorkspaceJSFResourceContainer.java
deleted file mode 100644
index aa9be84..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/resources/WorkspaceJSFResourceContainer.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package org.eclipse.jst.jsf.designtime.internal.resources;
-
-import org.eclipse.core.resources.IContainer;
-
-/**
- * A concrete JSFResourceContainer that maps to a container object in the
- * workspace.
- * 
- * @author cbateman
- *
- */
-public class WorkspaceJSFResourceContainer extends JSFResourceContainer implements IWorkspaceJSFResourceFragment
-{
-
-    private final IContainer _container;
-
-    /**
-     * @param id
-     * @param container
-     */
-    public WorkspaceJSFResourceContainer(final ResourceFragmentIdentifier id,
-            final IContainer container)
-    {
-        super(id);
-        _container = container;
-    }
-
-    @Override
-    public boolean isAccessible()
-    {
-        return _container.isAccessible();
-    }
-
-    /**
-     * @return the container resource
-     */
-    public IContainer getResource()
-    {
-        return _container;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/resources/WorkspaceJSFResourceLocator.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/resources/WorkspaceJSFResourceLocator.java
deleted file mode 100644
index 425e9e9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/resources/WorkspaceJSFResourceLocator.java
+++ /dev/null
@@ -1,78 +0,0 @@
-package org.eclipse.jst.jsf.designtime.internal.resources;
-
-import java.util.List;
-import java.util.concurrent.CopyOnWriteArrayList;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.jst.jsf.common.internal.componentcore.AbstractVirtualComponentQuery;
-import org.eclipse.jst.jsf.common.internal.locator.ILocatorChangeListener;
-import org.eclipse.jst.jsf.common.internal.resource.ContentTypeResolver;
-
-/**
- * @author cbateman
- * 
- */
-public class WorkspaceJSFResourceLocator extends AbstractJSFResourceLocator
-{
-    private final AbstractVirtualComponentQuery _vcQuery;
-    private final ContentTypeResolver _contentTypeResolver;
-    private WorkspaceResourceManager _workspaceResourceManager;
-
-    /**
-     * @param id
-     * @param displayName
-     * @param noResultValue
-     * @param mutableListenerList
-     * @param vcQuery
-     * @param contentTypeResolver
-     * @param workspace
-     */
-    public WorkspaceJSFResourceLocator(
-            final String id,
-            final String displayName,
-            final List<IJSFResourceFragment> noResultValue,
-            final CopyOnWriteArrayList<ILocatorChangeListener> mutableListenerList,
-            final AbstractVirtualComponentQuery vcQuery,
-            final ContentTypeResolver contentTypeResolver,
-            final IWorkspace workspace)
-    {
-        super(id, displayName, noResultValue, mutableListenerList);
-        _vcQuery = vcQuery;
-        _contentTypeResolver = contentTypeResolver;
-    }
-
-    /**
-     * @param noResultValue
-     * @param mutableListenerList
-     * @param vcQuery
-     * @param contentTypeResolver
-     * @param workspace
-     */
-    public WorkspaceJSFResourceLocator(
-            final List<IJSFResourceFragment> noResultValue,
-            final CopyOnWriteArrayList<ILocatorChangeListener> mutableListenerList,
-            final AbstractVirtualComponentQuery vcQuery,
-            final ContentTypeResolver contentTypeResolver,
-            final IWorkspace workspace)
-    {
-        this(
-                "", "", noResultValue, mutableListenerList, vcQuery, contentTypeResolver, workspace); //$NON-NLS-1$//$NON-NLS-2$
-    }
-
-    @Override
-    public void start(final IProject initialContext)
-    {
-        _workspaceResourceManager = new WorkspaceResourceManager(
-                initialContext, _vcQuery, this, _contentTypeResolver);
-        _workspaceResourceManager.initResources();
-        super.start(initialContext);
-    }
-
-    @Override
-    protected List<IJSFResourceFragment> doLocate(final IProject project)
-    {
-        return _workspaceResourceManager.getJSFResources();
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/resources/WorkspaceResourceManager.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/resources/WorkspaceResourceManager.java
deleted file mode 100644
index d43e83c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/resources/WorkspaceResourceManager.java
+++ /dev/null
@@ -1,383 +0,0 @@
-package org.eclipse.jst.jsf.designtime.internal.resources;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jst.jsf.common.internal.componentcore.AbstractVirtualComponentQuery;
-import org.eclipse.jst.jsf.common.internal.finder.AbstractMatcher.AlwaysMatcher;
-import org.eclipse.jst.jsf.common.internal.finder.VisitorMatcher;
-import org.eclipse.jst.jsf.common.internal.finder.acceptor.FileMatchingAcceptor;
-import org.eclipse.jst.jsf.common.internal.resource.ContentTypeResolver;
-import org.eclipse.jst.jsf.common.internal.resource.ResourceLifecycleEvent;
-import org.eclipse.jst.jsf.common.internal.resource.ResourceLifecycleEvent.ReasonType;
-import org.eclipse.jst.jsf.common.internal.resource.ResourceManager;
-import org.eclipse.jst.jsf.common.internal.resource.ResourceTracker;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.designtime.internal.resources.JSFResourceChangeListener.JSFResourceChangedEvent;
-import org.eclipse.jst.jsf.designtime.internal.resources.JSFResourceChangeListener.JSFResourceChangedEvent.CHANGE_TYPE;
-import org.eclipse.jst.jsf.designtime.internal.resources.ResourceIdentifierFactory.InvalidIdentifierException;
-import org.eclipse.wst.common.componentcore.resources.IVirtualFolder;
-
-/**
- * Resource Manager that tracks JSF resources in a workspace.
- * 
- * @author cbateman
- * 
- */
-public class WorkspaceResourceManager extends ResourceManager<IResource>
-{
-    private final AbstractVirtualComponentQuery _vcQuery;
-    private final IProject _project;
-    private final AbstractJSFResourceLocator _locator;
-    private final ContentTypeResolver _contentTypeResolver;
-    private final ResourceIdentifierFactory _factory;
-
-    /**
-     * @param project
-     * @param vcQuery
-     * @param locator
-     * @param contentTypeResolver
-     */
-    public WorkspaceResourceManager(final IProject project,
-            final AbstractVirtualComponentQuery vcQuery,
-            final AbstractJSFResourceLocator locator,
-            final ContentTypeResolver contentTypeResolver)
-    {
-        super(project.getWorkspace());
-        _project = project;
-        _vcQuery = vcQuery;
-        _locator = locator;
-        _contentTypeResolver = contentTypeResolver;
-        _factory = new ResourceIdentifierFactory();
-    }
-
-    @Override
-    protected JSFResourceTracker createNewInstance(final IResource resource)
-    {
-        final boolean isJSFResource = !getRootResourceFolder().getParent()
-                .equals(resource);
-        return new JSFResourceTracker(resource, isJSFResource);
-    }
-
-    @Override
-    public void initResources()
-    {
-        final IFolder folder = getRootResourceFolder();
-        if (folder != null)
-        {
-            try
-            {
-                track(folder.getParent());
-                track(folder);
-            } catch (final Exception e1)
-            {
-                JSFCorePlugin
-                        .log(e1,
-                                "While trying to locate JSF resources in the workspace"); //$NON-NLS-1$
-            }
-            if (folder.isAccessible())
-            {
-                trackAllInFolder(folder);
-            }
-        }
-    }
-
-    private List<IWorkspaceJSFResourceFragment> trackAllInFolder(
-            final IContainer folder)
-    {
-        final VisitorMatcher<IContainer, IResource, String> matcher = new VisitorMatcher<IContainer, IResource, String>(
-                "", "", //$NON-NLS-1$ //$NON-NLS-2$
-                new FileMatchingAcceptor(),
-                Collections.singletonList(new AlwaysMatcher()));
-        final List<IWorkspaceJSFResourceFragment> newFragments = new ArrayList<IWorkspaceJSFResourceFragment>();
-        try
-        {
-            final Collection<? extends IResource> foundResources = matcher
-                    .find(folder);
-            for (final IResource res : foundResources)
-            {
-                newFragments.add(track(res));
-            }
-        } catch (final Exception e)
-        {
-            JSFCorePlugin.log(e,
-                    "While trying to locate JSF resources in the workspace"); //$NON-NLS-1$
-        }
-        return newFragments;
-    }
-
-    private IWorkspaceJSFResourceFragment track(final IResource res)
-            throws ManagedObjectException, InvalidIdentifierException
-    {
-        final IPath fullPath = res.getFullPath().makeRelativeTo(
-                getRootResourceFolder().getFullPath());
-        // cause the resource to get tracked
-        final JSFResourceTracker tracker = (JSFResourceTracker) getInstance(res);
-        IWorkspaceJSFResourceFragment jsfRes = null;
-        if (res.getType() == IResource.FILE)
-        {
-            jsfRes = new WorkspaceJSFResource(
-                    _factory.createLibraryResource(fullPath.toString()), res,
-                    _contentTypeResolver);
-        } else
-        {
-            jsfRes = new WorkspaceJSFResourceContainer(
-                    _factory.createLibraryFragment(fullPath.toString()),
-                    (IContainer) res);
-        }
-        tracker.setJsfResource(jsfRes);
-        addLifecycleEventListener(tracker);
-        return jsfRes;
-    }
-
-    /**
-     * @return the root folder for resources in the workspace.
-     */
-    public IFolder getRootResourceFolder()
-    {
-        final IVirtualFolder webContentFolder = _vcQuery
-                .getWebContentFolder(_project);
-        if (webContentFolder != null
-                && webContentFolder.getUnderlyingFolder().isAccessible())
-        {
-            return webContentFolder.getUnderlyingFolder().getFolder(
-                    new Path("resources")); //$NON-NLS-1$
-        }
-        return null;
-    }
-
-    @Override
-    public List<IResource> getResources()
-    {
-        return new ArrayList(getManagedResources());
-    }
-
-    /**
-     * @return the jsf resource currently known. List is a copy but the
-     *         contained JSFResource references are not.
-     */
-    public List<IJSFResourceFragment> getJSFResources()
-    {
-        final List<IJSFResourceFragment> jsfResources = new ArrayList<IJSFResourceFragment>();
-        final Map<IResource, ManagedResourceObject<ResourceTracker<IResource>>> jsfResourceTrackers = getPerResourceObjects();
-        for (final Map.Entry<IResource, ManagedResourceObject<ResourceTracker<IResource>>> entry : jsfResourceTrackers
-                .entrySet())
-        {
-            final JSFResourceTracker jsfResourceTracker = (JSFResourceTracker) entry
-                    .getValue().getManagedObject();
-            if (jsfResourceTracker.isJSFResource())
-            {
-                jsfResources.add(jsfResourceTracker.getJsfResource());
-            }
-        }
-        return jsfResources;
-    }
-
-    private class JSFResourceTracker extends ResourceTracker<IResource>
-    {
-        private IWorkspaceJSFResourceFragment _jsfResource;
-        private final boolean _isJSFResource;
-
-        /**
-         * @param resource
-         * @param isJSFResource
-         *            if false, indicates that the resource being tracked is
-         *            related to JSF resources but not an actual JSF resource
-         *            (i.e. web root).
-         */
-        public JSFResourceTracker(final IResource resource,
-                final boolean isJSFResource)
-        {
-            super(resource);
-            _isJSFResource = isJSFResource;
-        }
-
-        public boolean isJSFResource()
-        {
-            return _isJSFResource;
-        }
-
-        @Override
-        protected void fireResourceInAccessible(
-                final IResource affectedResource, final ReasonType reasonType)
-        {
-            if (reasonType == ReasonType.RESOURCE_DELETED_FROM_CONTAINER
-                    || reasonType == ReasonType.RESOURCE_MOVED_CONTAINER)
-            {
-                try
-                {
-                    final List<JSFResourceTracker> trackers = getTrackers(affectedResource);
-                    for (final JSFResourceTracker tracker : trackers)
-                    {
-                        final IWorkspaceJSFResourceFragment jsfResource = tracker
-                                .getJsfResource();
-                        removeLifecycleEventListener(tracker);
-                        _locator.fireChangeEvent(new JSFResourceChangedEvent(
-                                _locator, jsfResource, null,
-                                CHANGE_TYPE.REMOVED));
-                    }
-                } catch (final ManagedObjectException e)
-                {
-                    JSFCorePlugin.log(e,
-                            "Processing an inaccessible resource event"); //$NON-NLS-1$
-                }
-            }
-        }
-
-        private List<JSFResourceTracker> getTrackers(final IResource res)
-                throws ManagedObjectException
-        {
-            final JSFResourceTracker tracker = (JSFResourceTracker) getInstance(res);
-            final List<JSFResourceTracker> allChildren = new ArrayList<JSFResourceTracker>();
-            allChildren.add(tracker);
-            if (res instanceof IContainer)
-            {
-                final IPath parentPath = res.getFullPath();
-                for (final Entry<IResource, ManagedResourceObject<ResourceTracker<IResource>>> trackerEntry : getPerResourceObjects()
-                        .entrySet())
-                {
-                    final IPath trackerPath = trackerEntry.getKey()
-                            .getFullPath();
-                    if (parentPath.isPrefixOf(trackerPath)
-                            && !parentPath.equals(trackerPath))
-                    {
-                        allChildren.add((JSFResourceTracker) trackerEntry
-                                .getValue().getManagedObject());
-                    }
-                }
-            }
-            return allChildren;
-        }
-
-        @Override
-        protected void fireResourceChanged(final IResource affectedResource,
-                final ReasonType reasonType)
-        {
-            _locator.fireChangeEvent(new JSFResourceChangedEvent(_locator,
-                    _jsfResource, _jsfResource, CHANGE_TYPE.CHANGED));
-        }
-
-        @Override
-        protected void fireResourceAdded(final IResource affectedResource,
-                final ReasonType reasonType)
-        {
-            if (reasonType == ReasonType.RESOURCE_ADDED_TO_CONTAINER
-                    || reasonType == ReasonType.RESOURCE_MOVED_CONTAINER)
-            {
-                final IContainer parent = affectedResource.getParent();
-                if (parent != null && parent.isAccessible())
-                {
-                    try
-                    {
-                        final IWorkspaceJSFResourceFragment newJsfRes = track(affectedResource);
-                        fireNewJSFResourceEvent(newJsfRes);
-                        if (reasonType == ReasonType.RESOURCE_MOVED_CONTAINER
-                                && affectedResource instanceof IContainer)
-                        {
-                            final List<IWorkspaceJSFResourceFragment> newFragments = trackAllInFolder((IContainer) affectedResource);
-                            for (final IWorkspaceJSFResourceFragment frag : newFragments)
-                            {
-                                fireNewJSFResourceEvent(frag);
-                            }
-                        }
-                    } catch (final ManagedObjectException e)
-                    {
-                        JSFCorePlugin
-                                .log(e,
-                                        "While adding new resource " + affectedResource); //$NON-NLS-1$
-                    } catch (final InvalidIdentifierException e)
-                    {
-                        JSFCorePlugin
-                                .log(e,
-                                        "While adding new resource " + affectedResource); //$NON-NLS-1$
-                    }
-                }
-            }
-        }
-
-        private void fireNewJSFResourceEvent(
-                final IWorkspaceJSFResourceFragment newJsfRes)
-        {
-            final JSFResourceChangedEvent event = new JSFResourceChangedEvent(
-                    _locator, null, newJsfRes, CHANGE_TYPE.ADDED);
-            _locator.fireChangeEvent(event);
-        }
-
-        @Override
-        protected boolean isInteresting(final ResourceLifecycleEvent event)
-        {
-            boolean isInteresting = false;
-            final ReasonType reasonType = event.getReasonType();
-            switch (event.getEventType())
-            {
-                case RESOURCE_ADDED:
-                {
-                    final IResource resource = getResource();
-                    isInteresting = (reasonType == ReasonType.RESOURCE_ADDED_TO_CONTAINER || reasonType == ReasonType.RESOURCE_MOVED_CONTAINER)
-                            && event.getAffectedResource().getParent()
-                                    .equals(resource);
-                    // ignore if my resource is web content and this is trying
-                    // to add something other than resources folder
-                    if (resource.equals(_vcQuery.getWebContentFolder(_project)
-                            .getUnderlyingFolder()))
-                    {
-                        isInteresting &= event.getAffectedResource().equals(
-                                getRootResourceFolder());
-                    }
-                }
-                break;
-                case RESOURCE_INACCESSIBLE:
-                {
-                    final IResource resource = getResource();
-                    // if the resource made inaccessible was deleted or moved
-                    // from its container
-                    // and it's parent is me, then it is interesting.
-                    isInteresting = (reasonType == ReasonType.RESOURCE_DELETED_FROM_CONTAINER || reasonType == ReasonType.RESOURCE_MOVED_CONTAINER)
-                            && event.getAffectedResource().getParent()
-                                    .equals(resource);
-                    // ignore if my resource is web content and this is trying
-                    // to add something other than resources folder
-                    if (resource.equals(_vcQuery.getWebContentFolder(_project)
-                            .getUnderlyingFolder()))
-                    {
-                        isInteresting &= event.getAffectedResource().equals(
-                                getRootResourceFolder());
-                    }
-//                    isInteresting &= (_isJSFResource || (resource.getType() == IResource.FOLDER && "resources".equals(resource.getName()))); //$NON-NLS-1$
-                    // or if the resource being delted or moved is the root
-                    // folder and that is my resource.
-                    // isInteresting |= (reasonType ==
-                    // ReasonType.RESOURCE_DELETED || reasonType ==
-                    // ReasonType.RESOURCE_MOVED_CONTAINER)
-                    // && (resource.equals(event.getAffectedResource()) &&
-                    // resource.equals(getRootResourceFolder()));
-                }
-                break;
-                default:
-                    isInteresting = super.isInteresting(event);
-            }
-            return isInteresting;
-        }
-
-        public final IWorkspaceJSFResourceFragment getJsfResource()
-        {
-            return _jsfResource;
-        }
-
-        public final void setJsfResource(
-                final IWorkspaceJSFResourceFragment jsfResource)
-        {
-            _jsfResource = jsfResource;
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/resources/messages.properties b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/resources/messages.properties
deleted file mode 100644
index 093c3b9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/resources/messages.properties
+++ /dev/null
@@ -1 +0,0 @@
-ResourceIdentifier_0=Resource name must not be empty
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/symbols/ConfigBasedDTPropertyResolver.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/symbols/ConfigBasedDTPropertyResolver.java
deleted file mode 100644
index 557706b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/symbols/ConfigBasedDTPropertyResolver.java
+++ /dev/null
@@ -1,232 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Xiaonan Jiang/IBM  -- extracted from https://bugs.eclipse.org/bugs/show_bug.cgi?id=206514
- *    Cameron Bateman/Oracle - integrated.
- * 
- ********************************************************************************/
-package org.eclipse.jst.jsf.designtime.internal.symbols;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jst.jsf.context.symbol.ISymbol;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.core.jsfappconfig.internal.IJSFAppConfigManager;
-import org.eclipse.jst.jsf.core.jsfappconfig.internal.JSFAppConfigManagerFactory;
-import org.eclipse.jst.jsf.designtime.el.AbstractDTPropertyResolver;
-import org.eclipse.jst.jsf.designtime.el.DefaultDTPropertyResolver;
-import org.eclipse.jst.jsf.designtime.el.IDecorativeResolver;
-import org.eclipse.jst.jsf.designtime.el.IInstancePerProjectResolver;
-
-/**
- * A design time proxy for the runtime ProperyResolver.
- * 
- * @author xnjiang
- * 
- */
-public class ConfigBasedDTPropertyResolver extends DefaultDTPropertyResolver
-        implements IInstancePerProjectResolver
-{
-    private IProject _project;
-
-    /**
-     * Constructor
-     * 
-     */
-    public ConfigBasedDTPropertyResolver()
-    {
-        super();
-    }
-
-    @Override
-    public ISymbol[] getAllProperties(final ISymbol base)
-    {
-        final Map<String, ISymbol> allSymbols = new HashMap<String, ISymbol>();
-        final ISymbol[] superSymbols = super.getAllProperties(base);
-        for (final ISymbol superSymbol : superSymbols)
-        {
-            allSymbols.put(superSymbol.getName(), superSymbol);
-        }
-
-        if (JSFCorePlugin.hasDecorativePropertyResolvers())
-        {
-            final List<AbstractDTPropertyResolver> resolvers = retrieveDecorativePropertyResolvers(_project);
-            for (final AbstractDTPropertyResolver resolver : resolvers)
-            {
-                final ISymbol[] otherSymbols = resolver.getAllProperties(base);
-                for (final ISymbol otherSymbol : otherSymbols)
-                {
-                    // allow subsequent resolvers to replace symbols by name
-                    // added previously
-                    allSymbols.put(otherSymbol.getName(), otherSymbol);
-                }
-            }
-        }
-        return allSymbols.values().toArray(ISymbol.EMPTY_SYMBOL_ARRAY);
-
-    }
-
-    @Override
-    public ISymbol getProperty(final ISymbol base, final int offset)
-    {
-        if (JSFCorePlugin.hasDecorativePropertyResolvers())
-        {
-            final List<AbstractDTPropertyResolver> resolvers = retrieveDecorativePropertyResolvers(_project);
-
-            // we need to iterate backwards through the resolvers, since
-            // the we take the first answer we receive.
-            for (int i = resolvers.size() - 1; i >= 0; i--)
-            {
-                final ISymbol symbol = resolvers.get(i).getProperty(base,
-                        offset);
-                if (symbol != null)
-                {
-                    return symbol;
-                }
-            }
-        }
-        return super.getProperty(base, offset);
-    }
-
-    @Override
-    public ISymbol getProperty(final ISymbol base, final Object propertyId)
-    {
-        if (JSFCorePlugin.hasDecorativePropertyResolvers())
-        {
-            final List<AbstractDTPropertyResolver> resolvers = retrieveDecorativePropertyResolvers(_project);
-
-            // we need to iterate backwards through the resolvers, since
-            // the we take the first answer we receive.
-            for (int i = resolvers.size() - 1; i >= 0; i--)
-            {
-                final ISymbol symbol = resolvers.get(i).getProperty(base,
-                        propertyId);
-                if (symbol != null)
-                {
-                    return symbol;
-                }
-            }
-        }
-        return super.getProperty(base, propertyId);
-    }
-
-    private List<AbstractDTPropertyResolver> retrieveDecorativePropertyResolvers(
-            final IProject project)
-    {
-        final IJSFAppConfigManager manager = JSFAppConfigManagerFactory
-                .getJSFAppConfigManagerInstance(project);
-        final List<String> propertyResolvers = manager.getPropertyResolvers();
-        final List<AbstractDTPropertyResolver> resolvers = new ArrayList<AbstractDTPropertyResolver>();
-        for (final String propertyResolver : propertyResolvers)
-        {
-            final List<String> ids = JSFCorePlugin
-                    .getPropertyResolversForName(propertyResolver);
-
-            for (final String id : ids)
-            {
-                final AbstractDTPropertyResolver resolver = JSFCorePlugin
-                        .getPropertyResolver(id).getInstance(_project);
-                if (resolver instanceof IDecorativeResolver)
-                {
-                    resolvers.add(resolver);
-                }
-                else
-                {
-                    JSFCorePlugin.log(new Exception(), String.format("resolver %s must implement the IDecorativeResolver interface to be used", id)); //$NON-NLS-1$
-                }
-            }
-        }
-        return resolvers;
-    }
-
-    public void setProject(final IProject project)
-    {
-        _project = project;
-    }
-
-    // private void retrievePropertyResolver() {
-    // try {
-    // String str =
-    // project.getPersistentProperty(PERSIST_PROPERTY_KEY_PROPERTY_RESOLVERS);
-    // if (str != null) {
-    // resolvers = new ArrayList<AbstractDTPropertyResolver>();
-    // StringTokenizer tokenizer = new StringTokenizer(str, ",");//$NON-NLS-1$
-    // while (tokenizer.hasMoreTokens()) {
-    // AbstractDTPropertyResolver resolver =
-    // JSFCorePlugin.getPropertyResolvers().get(tokenizer.nextToken());
-    // if (resolver != null) {
-    // resolvers.add(resolver);
-    // }
-    // }
-    // } else {
-    // checkFacesConfigForPropertyResolver();
-    // }
-    // } catch (CoreException e) {
-    // checkFacesConfigForPropertyResolver();
-    // }
-    // }
-    //
-    // private void checkFacesConfigForPropertyResolver() {
-    // resolvers = new ArrayList<AbstractDTPropertyResolver>();
-    // String str = "";//$NON-NLS-1$
-    // boolean bFirst = true;
-    // List facesConfigs =
-    // JSFAppConfigManager.getInstance(project).getFacesConfigModels();
-    // Iterator itFacesConfigs = facesConfigs.iterator();
-    // while (itFacesConfigs.hasNext()) {
-    // FacesConfigType facesConfig = (FacesConfigType)itFacesConfigs.next();
-    // EList applications = facesConfig.getApplication();
-    // for (int i=0;i<applications.size();i++) {
-    // EList resolvers2 =
-    // ((ApplicationType)applications.get(i)).getPropertyResolver();
-    // for (int j=0;j<resolvers2.size();j++) {
-    // PropertyResolverType resolverType =
-    // (PropertyResolverType)resolvers2.get(i);
-    // AbstractDTPropertyResolver resolver =
-    // JSFCorePlugin.getPropertyResolvers().get(resolverType.getTextContent());
-    // if (resolver != null) {
-    // resolvers.add(resolver);
-    // if (bFirst) {
-    // bFirst = false;
-    // } else {
-    // str += ",";//$NON-NLS-1$
-    // }
-    // str += resolverType.getTextContent();
-    // }
-    // }
-    // }
-    // }
-    // try {
-    // if (!str.equals("")) {//$NON-NLS-1$
-    // project.setPersistentProperty(PERSIST_PROPERTY_KEY_PROPERTY_RESOLVERS,
-    // str);
-    // } else {
-    // project.setPersistentProperty(PERSIST_PROPERTY_KEY_PROPERTY_RESOLVERS,
-    // null);
-    // }
-    // } catch (CoreException e) {
-    // e.printStackTrace();
-    // }
-    // }
-    //
-    // /**
-    // * Called when a change in an application configuration model for which
-    // * this listener has been registered occurs.
-    // *
-    // * @param notification EMF {@link Notification} instance that describes
-    // the
-    // * model change.
-    // */
-    // public void notifyChanged(Notification notification) {
-    // checkFacesConfigForPropertyResolver();
-    // }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/symbols/ConfigBasedDTVariableResolver.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/symbols/ConfigBasedDTVariableResolver.java
deleted file mode 100644
index 5acd168..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/symbols/ConfigBasedDTVariableResolver.java
+++ /dev/null
@@ -1,204 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Xiaonan Jiang/IBM  -- extracted from https://bugs.eclipse.org/bugs/show_bug.cgi?id=206514
- *    Cameron Bateman/Oracle - integrated.
- * 
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.designtime.internal.symbols;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jst.jsf.context.symbol.ISymbol;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.core.jsfappconfig.internal.IJSFAppConfigManager;
-import org.eclipse.jst.jsf.core.jsfappconfig.internal.JSFAppConfigManagerFactory;
-import org.eclipse.jst.jsf.designtime.context.DTFacesContext;
-import org.eclipse.jst.jsf.designtime.el.AbstractDTVariableResolver;
-import org.eclipse.jst.jsf.designtime.el.DefaultDTVariableResolver;
-import org.eclipse.jst.jsf.designtime.el.IDecorativeResolver;
-
-/**
- * A design time proxy for the runtime VariableResolver.
- * 
- * @author xnjiang
- * 
- */
-public class ConfigBasedDTVariableResolver extends DefaultDTVariableResolver
-// implements IFacesConfigChangeListener
-{
-    /**
-     * Constructor
-     */
-    public ConfigBasedDTVariableResolver()
-    {
-        super();
-
-    }
-
-    @Override
-    public ISymbol[] getAllVariables(final DTFacesContext facesContext,
-            final IAdaptable externalContextKey)
-    {
-        //final long curTime = System.nanoTime();
-        final Map<String, ISymbol> allSymbols = new HashMap<String, ISymbol>();
-        final ISymbol[] superSymbols = super.getAllVariables(facesContext,
-                externalContextKey);
-        for (final ISymbol superSymbol : superSymbols)
-        {
-            allSymbols.put(superSymbol.getName(), superSymbol);
-        }
-
-        if (JSFCorePlugin.hasDecorativeVariableResolvers())
-        {
-            final IProject project = getProject(facesContext);
-
-            final List<AbstractDTVariableResolver> resolvers = retrieveDecorativeVariableResolvers(project);
-            for (final AbstractDTVariableResolver resolver : resolvers)
-            {
-                final ISymbol[] otherSymbols = resolver.getAllVariables(
-                        facesContext, externalContextKey);
-                for (final ISymbol otherSymbol : otherSymbols)
-                {
-                    // allow subsequent resolvers to replace symbols by name
-                    // added previously
-                    allSymbols.put(otherSymbol.getName(), otherSymbol);
-                }
-            }
-        }
-        //System.out.printf("totalAllSymbols: %d\n", Long.valueOf(System.nanoTime()- curTime));
-        return allSymbols.values().toArray(ISymbol.EMPTY_SYMBOL_ARRAY);
-    }
-
-    @Override
-    public ISymbol resolveVariable(final DTFacesContext context,
-            final String name, final IAdaptable externalContextKey)
-    {
-        //long curTime = System.nanoTime();
-        if (JSFCorePlugin.hasDecorativeVariableResolvers())
-        {
-            final IProject project = getProject(context);
-
-            final List<AbstractDTVariableResolver> resolvers = retrieveDecorativeVariableResolvers(project);
-
-            // we need to iterate backwards through the resolvers, since
-            // the we take the first answer we receive.
-            for (int i = resolvers.size() - 1; i >= 0; i--)
-            {
-                final ISymbol symbol = resolvers.get(i).resolveVariable(
-                        context, name, externalContextKey);
-                if (symbol != null)
-                {
-                    return symbol;
-                }
-            }
-        }
-        ISymbol symbol = super.resolveVariable(context, name, externalContextKey);
-        //System.out.printf("totalSymbol: %d\n", Long.valueOf(System.nanoTime()- curTime));
-        return symbol;
-    }
-
-    private List<AbstractDTVariableResolver> retrieveDecorativeVariableResolvers(
-            final IProject project)
-    {
-        //final long  curTime = System.nanoTime();
-        final IJSFAppConfigManager manager = JSFAppConfigManagerFactory
-                .getJSFAppConfigManagerInstance(project);
-        final List<String> variableResolvers = manager.getVariableResolvers();
-        final List<AbstractDTVariableResolver> resolvers = new ArrayList<AbstractDTVariableResolver>();
-        for (final String variableResolver : variableResolvers)
-        {
-            final List<String> ids = JSFCorePlugin
-                    .getVariableResolversForName(variableResolver);
-
-            for (final String id : ids)
-            {
-                final AbstractDTVariableResolver resolver = JSFCorePlugin
-                        .getVariableResolvers(id).getInstance(project);
-                if (resolver instanceof IDecorativeResolver)
-                {
-                    resolvers.add(resolver);
-                }
-                else
-                {
-                    JSFCorePlugin.log(new Exception(), String.format("resolver %s must implement the IDecorativeResolver interface to be used", id)); //$NON-NLS-1$
-                }
-            }
-        }
-        //System.out.printf("retrieveDecorativeVariable: %d\n", Long.valueOf(System.nanoTime()- curTime));
-        return resolvers;
-    }
-
-    private IProject getProject(final DTFacesContext facesContext)
-    {
-        final IResource res = facesContext.adaptContextObject();
-
-        if (res != null)
-        {
-            return res.getProject();
-        }
-        return null;
-    }
-
-    // private void checkFacesConfigForVariableResolver(final IProject project)
-    // {
-    // resolvers = new ArrayList<AbstractDTVariableResolver>();
-    // String str = "";//$NON-NLS-1$
-    // boolean bFirst = true;
-    // final List facesConfigs =
-    // JSFAppConfigManager.getInstance(project).getFacesConfigModels();
-    // final Iterator itFacesConfigs = facesConfigs.iterator();
-    // while (itFacesConfigs.hasNext()) {
-    // final FacesConfigType facesConfig =
-    // (FacesConfigType)itFacesConfigs.next();
-    // final EList applications = facesConfig.getApplication();
-    // for (int i=0;i<applications.size();i++) {
-    // final EList resolvers2 =
-    // ((ApplicationType)applications.get(i)).getVariableResolver();
-    // for (int j=0;j<resolvers2.size();j++) {
-    // final VariableResolverType resolverType =
-    // (VariableResolverType)resolvers2.get(i);
-    // final AbstractDTVariableResolver resolver =
-    // JSFCorePlugin.getVariableResolvers().get(resolverType.getTextContent());
-    // if (resolver != null) {
-    // resolvers.add(resolver);
-    // if (bFirst) {
-    // bFirst = false;
-    // } else {
-    // str += ",";//$NON-NLS-1$
-    // }
-    // str += resolverType.getTextContent();
-    // }
-    // }
-    // }
-    // }
-    // try {
-    // if (!str.equals("")) {//$NON-NLS-1$
-    // project.setPersistentProperty(PERSIST_PROPERTY_KEY_VARIABLE_RESOLVERS,
-    // str);
-    // } else {
-    // project.setPersistentProperty(PERSIST_PROPERTY_KEY_VARIABLE_RESOLVERS,
-    // null);
-    // }
-    // } catch (final CoreException e) {
-    // e.printStackTrace();
-    // }
-    // }
-    //
-    // public void notifyChanged(final Notification notification) {
-    // checkFacesConfigForVariableResolver();
-    // }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/symbols/DataModelVariableTestFacade.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/symbols/DataModelVariableTestFacade.java
deleted file mode 100644
index 7dc1801..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/symbols/DataModelVariableTestFacade.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.designtime.internal.symbols;
-
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jst.jsf.common.internal.types.ValueType;
-import org.eclipse.jst.jsf.context.symbol.ERuntimeSource;
-import org.eclipse.jst.jsf.context.symbol.ISymbol;
-import org.eclipse.jst.jsf.designtime.symbols.AbstractDataModelVariableFactory;
-
-/**
- * Used to expose protected final members of AbstractDataModelVariableFactory
- * for testing purposes.  May change without notice, should *never* be used in
- * production code.
- * 
- * @author cbateman
- *
- */
-public final class DataModelVariableTestFacade extends AbstractDataModelVariableFactory 
-{
-    /**
-     * Test facade for createArraySymbol
-     * 
-     * @param symbolName
-     * @param signature
-     * @param javaProject
-     * @return super.createArraySymbol()
-     */
-    public final ISymbol testCreateArraySymbol(final String symbolName, final String signature, final IJavaProject javaProject)
-    {
-        return getSymbolFactory().createArraySymbol(symbolName, signature, ERuntimeSource.TAG_INSTANTIATED_SYMBOL_LITERAL, javaProject);
-    }
-    
-    /**
-     * Test facade for createFromList
-     * 
-     * @param symbolName
-     * @param valueType
-     * @param javaProject
-     * @return super.createFromList()
-     */
-    public final ISymbol testCreateFromList(String symbolName, ValueType valueType, IJavaProject javaProject)
-    {
-        return getSymbolFactory().createFromList(symbolName, valueType, ERuntimeSource.TAG_INSTANTIATED_SYMBOL_LITERAL, null, javaProject);
-    }
-    
-    /**
-     * @param symbolName
-     * @param signature
-     * @param javaProject
-     * @return a symbol assuming a scalar type wrapping
-     */
-    public ISymbol testCreateScalarSymbol(String symbolName, String signature, IJavaProject javaProject)
-    {
-        return getSymbolFactory().createScalarSymbol(symbolName, signature, ERuntimeSource.TAG_INSTANTIATED_SYMBOL_LITERAL, javaProject);
-    }
-
-    
-    /**
-     * @param symbolName
-     * @param valueType
-     * @param javaProject
-     * @return a symbol from a proxied call to  super.createFromType
-     */
-    public ISymbol testCreateFromType(String symbolName, ValueType valueType,
-            IJavaProject javaProject) {
-        return super.createFromType(symbolName, valueType, javaProject);
-    }
-
-    @Override
-    protected final String getVariableSourceName() 
-    {
-        return "testFacade -- SHOULD NOT BE USED IN PRODUCTION CODE"; //$NON-NLS-1$
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/symbols/JSPTagVariableSymbolSourceProvider.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/symbols/JSPTagVariableSymbolSourceProvider.java
deleted file mode 100644
index c84f6ca..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/symbols/JSPTagVariableSymbolSourceProvider.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.designtime.internal.symbols;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jst.jsf.context.symbol.ISymbol;
-import org.eclipse.jst.jsf.context.symbol.source.AbstractSymbolSourceProviderFactory;
-import org.eclipse.jst.jsf.context.symbol.source.ISymbolConstants;
-import org.eclipse.jst.jsf.context.symbol.source.ISymbolSourceProvider;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.designtime.internal.jsp.JSPModelProcessor;
-import org.eclipse.jst.jsf.designtime.symbols.FileContextUtil;
-import org.eclipse.jst.jsf.designtime.symbols.SymbolUtil;
-
-
-/**
- * Self-factory for a symbol provider that derives symbol information from
- * meta-data annotations on tag attributes that declare runtime EL variables
- * 
- * @author cbateman
- *
- */
-public class JSPTagVariableSymbolSourceProvider extends
-        AbstractSymbolSourceProviderFactory implements ISymbolSourceProvider 
-{
-    protected ISymbolSourceProvider create(IProject project) 
-    {
-        return this;
-    }
-
-    public ISymbol[] getSymbols(IAdaptable context, int symbolScopeMask) 
-    {
-        final IFile   fileContext = FileContextUtil.deriveIFileFromContext(context);
-        
-        if (isProvider(fileContext) &&  fileContext.isAccessible())
-        {
-        	JSPModelProcessor modelProcessor = null;
-        	
-            try
-            {
-                modelProcessor = JSPModelProcessor.get(fileContext);
-
-                // ensure internal model is sync'ed with document
-                // but don't force refresh
-                modelProcessor.refresh(!JSPModelProcessor.FORCE_REFRESH, JSPModelProcessor.RUN_ON_CURRENT_THREAD);
-                final List<ISymbol> symbols = new ArrayList();
-                
-                if ((symbolScopeMask & ISymbolConstants.SYMBOL_SCOPE_REQUEST) != 0)
-                {
-                    symbols.addAll(modelProcessor.getMapForScope(ISymbolConstants.SYMBOL_SCOPE_REQUEST_STRING).values());
-                }
-                if ((symbolScopeMask & ISymbolConstants.SYMBOL_SCOPE_SESSION) != 0)
-                {
-                    symbols.addAll(modelProcessor.getMapForScope(ISymbolConstants.SYMBOL_SCOPE_SESSION_STRING).values());
-                }
-                if ((symbolScopeMask & ISymbolConstants.SYMBOL_SCOPE_APPLICATION) != 0)
-                {
-                    symbols.addAll(modelProcessor.getMapForScope(ISymbolConstants.SYMBOL_SCOPE_APPLICATION_STRING).values());
-                }
-                if ((symbolScopeMask & ISymbolConstants.SYMBOL_SCOPE_NONE) != 0)
-                {
-                    symbols.addAll(modelProcessor.getMapForScope(ISymbolConstants.SYMBOL_SCOPE_NONE_STRING).values());
-                }
-                if ((symbolScopeMask & ISymbolConstants.SYMBOL_SCOPE_VIEW) != 0)
-                {
-                    symbols.addAll(modelProcessor.getMapForScope(ISymbolConstants.SYMBOL_SCOPE_VIEW_STRING).values());
-                }
-                if ((symbolScopeMask & ISymbolConstants.SYMBOL_SCOPE_FLASH) != 0)
-                {
-                    symbols.addAll(modelProcessor.getMapForScope(ISymbolConstants.SYMBOL_SCOPE_FLASH_STRING).values());
-                }  
-                return symbols.toArray(ISymbol.EMPTY_SYMBOL_ARRAY);
-            }
-            catch (Exception e)
-            {
-                JSFCorePlugin.getDefault().getLog().log(new Status(IStatus.ERROR, JSFCorePlugin.PLUGIN_ID, 0, "Error acquiring model processor",e)); //$NON-NLS-1$
-                // fall-through to empty symbol array
-            }
-        }
-        
-        return ISymbol.EMPTY_SYMBOL_ARRAY;
-    }
-
-    public ISymbol[] getSymbols(String prefix, IAdaptable context,
-            int symbolScopeMask) {
-        return SymbolUtil.
-            filterSymbolsByPrefix(getSymbols(context, symbolScopeMask), prefix);
-    }
-
-    public boolean isProvider(IAdaptable context) 
-    {
-        IFile file = FileContextUtil.deriveIFileFromContext(context);
-        
-        return (file != null
-                && file.getProject() == this.getProject());
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/symbols/Messages.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/symbols/Messages.java
deleted file mode 100644
index f555477..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/symbols/Messages.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.designtime.internal.symbols;
-
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-/**
- * Message resource class
- * 
- * @author cbateman
- *
- */
-/*package*/ final class Messages {
-    private static final String BUNDLE_NAME = "org.eclipse.jst.jsf.designtime.messages"; //$NON-NLS-1$
-
-    private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle
-            .getBundle(BUNDLE_NAME);
-
-    private Messages() {
-        // no external instatiation
-    }
-
-    /**
-     * @param key
-     * @return the message string for key or  !key! if not found
-     */
-    public static String getString(String key) {
-        try {
-            return RESOURCE_BUNDLE.getString(key);
-        } catch (MissingResourceException e) {
-            return '!' + key + '!';
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/symbols/ResourceBundleMapSource.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/symbols/ResourceBundleMapSource.java
deleted file mode 100644
index af1ca6a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/symbols/ResourceBundleMapSource.java
+++ /dev/null
@@ -1,387 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *
- ********************************************************************************/
-package org.eclipse.jst.jsf.designtime.internal.symbols;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.AbstractMap;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Properties;
-import java.util.Set;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IStorage;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.QualifiedName;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jst.jsf.common.internal.resource.EventResult;
-import org.eclipse.jst.jsf.common.internal.resource.IResourceLifecycleListener;
-import org.eclipse.jst.jsf.common.internal.resource.LifecycleListener;
-import org.eclipse.jst.jsf.common.internal.resource.ResourceLifecycleEvent;
-import org.eclipse.jst.jsf.common.internal.resource.ResourceLifecycleEvent.EventType;
-import org.eclipse.jst.jsf.context.symbol.internal.impl.IMapSourceInfo;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.core.internal.tld.LoadBundleUtil;
-
-class ResourceBundleMapSource extends AbstractMap implements IMapSourceInfo
-{
-    private static final String   PROPERTY_QUALIFIER =
-    	"org.eclipse.jst.jsf.designtime.internal.jsp"; //$NON-NLS-1$
-    private static final String   SESSION_PROPERTY_NAME_PROJECT =
-    	"ResourceBundleMapSource"; //$NON-NLS-1$
-    private static final QualifiedName  SESSION_PROPERTY_KEY_PROJECT =
-        new QualifiedName(PROPERTY_QUALIFIER, SESSION_PROPERTY_NAME_PROJECT);
-    private static final Object  STATIC_LOCK = new Object();
-
-    private static IFile    getCachedBundleFile(final IProject project, final String baseName)
-    {
-        if (project != null)
-        {
-            final Map<String, BundleFileCacheInfo> bundleFileCache = getBundleFileCache(project);
-
-            if (bundleFileCache != null)
-            {
-                final BundleFileCacheInfo info = bundleFileCache.get(baseName);
-                if (info != null)
-                {
-                    return info.getFile();
-                }
-            }
-        }
-
-        return null;
-    }
-
-    private static class BundleFileCacheInfo
-    {
-        private final IFile                 _file;
-        private final Map<Object,CachedDataItem>    _cachedData;
-        public BundleFileCacheInfo(final IFile file)
-        {
-            super();
-            _file = file;
-            _cachedData =
-                Collections.synchronizedMap(new HashMap<Object, CachedDataItem>());
-        }
-        public IFile getFile()
-        {
-            return _file;
-        }
-        public Object getCachedData(final Object key)
-        {
-            CachedDataItem item = _cachedData.get(key);
-            
-            if (item != null)
-            {
-                return item.getData();
-            }
-            return null;
-        }
-
-        public Object putCachedData(final Object key, final Object value, final long timestamp)
-        {
-            CachedDataItem item = new CachedDataItem(value, timestamp);
-            CachedDataItem oldItem = _cachedData.put(key, item);
-            if (oldItem != null)
-            {
-                return oldItem.getData();
-            }
-            return null;
-        }
-
-        public boolean hasChanged(final Object key, final long timestamp)
-        {
-            CachedDataItem item = _cachedData.get(key);
-            if (item != null)
-            {
-                return item.getTimestamp() != timestamp;
-            }
-            return false;
-        }
-
-        private static class CachedDataItem
-        {
-            private final Object        _data;
-            private final long          _timestamp;
-            public CachedDataItem(Object data, long timestamp)
-            {
-                super();
-                _data = data;
-                _timestamp = timestamp;
-            }
-            public final Object getData()
-            {
-                return _data;
-            }
-            public final long getTimestamp()
-            {
-                return _timestamp;
-            }
-        }
-    }
-
-    private static Map<String, BundleFileCacheInfo> getBundleFileCache(final IProject project)
-    {
-        synchronized(STATIC_LOCK)
-        {
-            Map<String, BundleFileCacheInfo> bundleFileCache = null;
-
-            try
-            {
-                bundleFileCache =
-                    (Map<String, BundleFileCacheInfo>) project.getSessionProperty(SESSION_PROPERTY_KEY_PROJECT);
-
-                if (bundleFileCache == null)
-                {
-                    bundleFileCache = new HashMap<String, BundleFileCacheInfo>();
-                    final LifecycleListener listener = new LifecycleListener(project, ResourcesPlugin.getWorkspace());
-                    listener.addListener(new IResourceLifecycleListener()
-                    {
-                        public EventResult acceptEvent(final ResourceLifecycleEvent event)
-                        {
-                            EventResult result = EventResult.getDefaultEventResult();
-
-                            if (event.getEventType() == EventType.RESOURCE_INACCESSIBLE)
-                            {
-                                try
-                                {
-                                	//Bug 283764: this listener may be called more than once - check project not already inaccessible
-                                	if (project.isAccessible())
-                                	{
-	                                    final Map<String, BundleFileCacheInfo> bundleCache =
-	                                        (Map<String, BundleFileCacheInfo>) project.getSessionProperty(SESSION_PROPERTY_KEY_PROJECT);
-	                                    //This listener may be called more than once - check session property not already nulled
-	                                    if (bundleCache != null)
-	                                    {
-	                                    	bundleCache.clear();
-	                                        project.setSessionProperty(SESSION_PROPERTY_KEY_PROJECT, null);
-	                                    }
-                                	}
-                                }
-                                catch (final CoreException ce)
-                                {
-                                    JSFCorePlugin.log("Error clearing bundle file cache", ce); //$NON-NLS-1$
-                                }
-                                result = EventResult.getDisposeAfterEventResult();
-                            }
-
-                            return result;
-                        }
-                    }
-                    );
-
-                    project.setSessionProperty(SESSION_PROPERTY_KEY_PROJECT, bundleFileCache);
-                }
-            }
-            catch (final CoreException ce)
-            {
-                JSFCorePlugin.log("Error creating bundle file cache", ce); //$NON-NLS-1$
-            }
-
-            return bundleFileCache;
-        }
-    }
-
-    private static IFile createCachedBundleFile(final IProject project,
-                                                   final String  resourcePathStr)
-                      throws IOException, CoreException
-    {
-        final IStorage storage =
-            LoadBundleUtil.getLoadBundleResource(project, resourcePathStr);
-
-        IFile bundleRes = null;
-
-        if (storage != null
-                && storage.getAdapter(IFile.class) != null)
-        {
-            bundleRes = (IFile) storage.getAdapter(IFile.class);
-            // if file is removed, clear the bundle from the store.
-            final LifecycleListener listener = new LifecycleListener(bundleRes, ResourcesPlugin.getWorkspace());
-            listener.addListener(new IResourceLifecycleListener()
-            {
-                public EventResult acceptEvent(final ResourceLifecycleEvent event)
-                {
-                    EventResult result = EventResult.getDefaultEventResult();
-
-                    if (event.getEventType() == EventType.RESOURCE_INACCESSIBLE)
-                    {
-                        Map<String, BundleFileCacheInfo> bundleFileCache = getBundleFileCache(project);
-                        bundleFileCache.remove(resourcePathStr);
-                        result = EventResult.getDisposeAfterEventResult();
-                    }
-                    return result;
-                }
-            }
-            );
-
-            getBundleFileCache(project).put(resourcePathStr, new BundleFileCacheInfo(bundleRes));
-            return bundleRes;
-        }
-
-        throw new IOException("Bundle "+resourcePathStr+" not found in classpath for project: "+project.getName()); //$NON-NLS-1$ //$NON-NLS-2$
-    }
-
-    private Properties                  _resourceBundle; // = null; set on first access or changes
-    private final IFile                 _bundleFile;   // the resource
-    private final String                _resourcePathStr; // the key used in the file cache
-    // as returned by IResource.getModificationStamp()
-    // the last time _resourceBundle was loaded
-    private long                        _lastModificationStamp;
-
-    ResourceBundleMapSource(final IProject context,
-                            final String  resourcePathStr)
-                                throws IOException, JavaModelException, CoreException
-    {
-        IFile cachedBundleFile = getCachedBundleFile(context, resourcePathStr);
-
-        if (cachedBundleFile == null)
-        {
-            cachedBundleFile = createCachedBundleFile(context, resourcePathStr);
-        }
-
-        _bundleFile = cachedBundleFile;
-        _resourcePathStr = resourcePathStr;
-    }
-
-    private void checkAndRefreshBundle()
-    {
-        if (_bundleFile.isAccessible())
-        {
-            if (_resourceBundle == null  // doesn't exist yet
-                    // exists but ws is out of sync
-                    || !_bundleFile.isSynchronized(IResource.DEPTH_ZERO)
-                    // exists but user has changed in workspace
-                    || _bundleFile.getModificationStamp() 
-                            != _lastModificationStamp)
-            {
-                InputStream  bundleStream = null;
-                try
-                {
-                    // force refresh if out of sync
-                    bundleStream = _bundleFile.getContents(true);
-                    _resourceBundle = new Properties();
-                    _resourceBundle.load(bundleStream);
-                    _lastModificationStamp = _bundleFile.getModificationStamp();
-                }
-                catch (final CoreException ce)
-                {
-                    JSFCorePlugin.log("Error refreshing bundle", ce); //$NON-NLS-1$
-                }
-                catch (final IOException ioe)
-                {
-                    JSFCorePlugin.log("Error refreshing bundle", ioe); //$NON-NLS-1$
-                }
-                finally
-                {
-                    if (bundleStream != null)
-                    {
-                        try
-                        {
-                            bundleStream.close();
-                        }
-                        catch (final IOException ioe)
-                        {
-                            JSFCorePlugin.log("Error closing bundle", ioe); //$NON-NLS-1$
-                        }
-                    }
-                }
-            }
-        }
-        else
-        {
-            // bundle no longer exists so remove it
-            final Map<String, BundleFileCacheInfo> bundleFileCache = getBundleFileCache(_bundleFile.getProject());
-
-            if (bundleFileCache != null &&
-                    bundleFileCache.containsKey(_resourcePathStr))
-            {
-                bundleFileCache.remove(_resourcePathStr);
-            }
-            // in either case, clear the bundle entry
-            if (_resourceBundle != null)
-            {
-                _resourceBundle.clear();
-                _resourceBundle = null;
-            }
-        }
-    }
-
-    @Override
-    public Set entrySet()
-    {
-        checkAndRefreshBundle();
-
-        if (_resourceBundle == null)
-        {
-        	return Collections.EMPTY_SET;
-        }
-        return _resourceBundle.entrySet();
-    }
-
-    /**
-     * @param key
-     * @return the value
-     * @see java.util.AbstractMap#get(java.lang.Object)
-     * @overrride to optimize for the fact that we are doing a hash get
-     */
-    //
-    @Override
-    public Object get(final Object key)
-    {
-        checkAndRefreshBundle();
-
-        if (_resourceBundle == null)
-        {
-        	return null;
-        }
-        return _resourceBundle.get(key);
-    }
-
-    public final boolean hasChanged(final Object key)
-    {
-        final BundleFileCacheInfo cache = getBundleFileCache(
-                _bundleFile.getProject()).get(_resourcePathStr);
-        if (cache != null)
-        {
-            return cache.hasChanged(key, _bundleFile.getModificationStamp());
-        }
-        // return true since if there is nothing cached, the caller will want 
-        // to react.
-        return true;
-    }
-
-    public Object getCachedValue(final Object key)
-    {
-        final BundleFileCacheInfo cache = getBundleFileCache(
-                _bundleFile.getProject()).get(_resourcePathStr);
-        if (cache != null)
-        {
-            return cache.getCachedData(key);
-        }
-        return null;
-    }
-
-    public void putCachedValue(final Object key, final Object value)
-    {
-        final BundleFileCacheInfo cache = getBundleFileCache(
-                _bundleFile.getProject()).get(_resourcePathStr);
-        if (cache != null)
-        {
-            cache.putCachedData(key, value, _lastModificationStamp);
-        }
-    }
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/symbols/ResourceBundleMapSourceFactory.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/symbols/ResourceBundleMapSourceFactory.java
deleted file mode 100644
index dc2209c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/symbols/ResourceBundleMapSourceFactory.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
- 
-package org.eclipse.jst.jsf.designtime.internal.symbols;
-
-import java.io.IOException;
-import java.util.Map;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jdt.core.JavaModelException;
-
-/**
- * Factory class for acquiring a ResourceBundleMapSourceFactory outside the local
- * package.   This is intended only for internal testing and related use and 
- * should not be used for normal feature development
- * 
- * @author cbateman
- *
- */
-public class ResourceBundleMapSourceFactory 
-{
-    /**
-     * @param project
-     * @param resourcePathStr
-     * @return a ResourceBundleMapSource
-     * @throws CoreException 
-     * @throws IOException 
-     * @throws JavaModelException 
-     */
-    public static Map getResourceBundleMapSource(final IProject project, 
-                                                 final String resourcePathStr) 
-            throws JavaModelException, IOException, CoreException 
-    {
-        return new ResourceBundleMapSource(project, resourcePathStr);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/symbols/ResourceBundleSymbolSourceProvider.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/symbols/ResourceBundleSymbolSourceProvider.java
deleted file mode 100644
index 1b39e94..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/symbols/ResourceBundleSymbolSourceProvider.java
+++ /dev/null
@@ -1,158 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.designtime.internal.symbols;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jst.jsf.context.symbol.IComponentSymbol;
-import org.eclipse.jst.jsf.context.symbol.IMapTypeDescriptor;
-import org.eclipse.jst.jsf.context.symbol.ISymbol;
-import org.eclipse.jst.jsf.context.symbol.SymbolFactory;
-import org.eclipse.jst.jsf.context.symbol.source.AbstractSymbolSourceProviderFactory;
-import org.eclipse.jst.jsf.context.symbol.source.ISymbolSourceProvider;
-import org.eclipse.jst.jsf.core.IJSFCoreConstants;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.core.jsfappconfig.JSFAppConfigUtils;
-import org.eclipse.jst.jsf.core.jsfappconfig.internal.IJSFAppConfigManager;
-import org.eclipse.jst.jsf.core.jsfappconfig.internal.JSFAppConfigManagerFactory;
-import org.eclipse.jst.jsf.designtime.symbols.FileContextUtil;
-import org.eclipse.jst.jsf.designtime.symbols.SymbolUtil;
-import org.eclipse.jst.jsf.facesconfig.emf.BaseNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.ResourceBundleType;
-import org.eclipse.jst.jsf.facesconfig.emf.VarType;
-
-/**
- * WARNING: this is an interim solution to supporting Faces 1.2 resource
- * bundle variables.  This class will become obsolete by design once
- * the dt framework for Unified EL symbol resolution is added
- * 
- * DO NOT USE THIS CLASS EXTERNALLY, IT WILL BE REMOVED WITHOUT WARNING IN THE FUTURE
- * WITH NO MIGRATION PATH
- * 
- * Self-factory for symbol source providers that contribute symbols for
- * the resource bundle variables declared in Faces 1.2 and greater 
- * app configuration files.
- * 
- * @author cbateman
- *
- */
-public final class ResourceBundleSymbolSourceProvider extends
-        AbstractSymbolSourceProviderFactory implements ISymbolSourceProvider {
-
-    protected final ISymbolSourceProvider create(IProject project) {
-        return this;
-    }
-
-    public final ISymbol[] getSymbols(IAdaptable context, int symbolScopeMask) 
-    {
-       if (isProvider(context))
-       {
-           final List symbols = new ArrayList();
-           final IFile   fileContext = FileContextUtil.deriveIFileFromContext(context);
-           final IProject project = fileContext.getProject();
-           
-           final IJSFAppConfigManager appconfigMgr = JSFAppConfigManagerFactory.getJSFAppConfigManagerInstance(project);
-           final List<ResourceBundleType> resourceBundles = appconfigMgr.getResourceBundles();
-           
-           for (final ResourceBundleType  resBundle : resourceBundles)
-           {            
-               final String  basename = getBaseName(resBundle);
-               final String  name = getVarName(resBundle);
-               
-               if (basename != null && name != null)
-               {
-                   try 
-                   {
-                       symbols.add(createSymbolForResourceBundle(project, name, basename));
-                   } catch (JavaModelException e) {
-                       JSFCorePlugin.log(e, "Error creating base name for: "+basename); //$NON-NLS-1$
-                    } catch (IOException e) {
-                        JSFCorePlugin.log(e, "Error creating base name for: "+basename); //$NON-NLS-1$
-                    } catch (CoreException e) {
-                        JSFCorePlugin.log(e, "Error creating base name for: "+basename); //$NON-NLS-1$
-                    }
-               }
-           }     
-           return (ISymbol[]) symbols.toArray(ISymbol.EMPTY_SYMBOL_ARRAY);
-       }
-       return ISymbol.EMPTY_SYMBOL_ARRAY;
-    }
-
-    private ISymbol createSymbolForResourceBundle(IProject project, 
-                                                  final String name,
-                                                  final String basename) throws JavaModelException, IOException, CoreException
-    {
-        // TODO: push down into ResourceBundleMapSourceFactory and share
-        // with loadBundle
-        final Map mapSource = ResourceBundleMapSourceFactory
-            .getResourceBundleMapSource(project, basename);
-        final IMapTypeDescriptor typeDesc = 
-            SymbolFactory.eINSTANCE.createIMapTypeDescriptor();
-        typeDesc.setMapSource(mapSource);
-        final IComponentSymbol symbol = 
-            SymbolFactory.eINSTANCE.createIComponentSymbol();
-        symbol.setName(name);
-        symbol.setTypeDescriptor(typeDesc);
-        symbol.setDetailedDescription(Messages.getString("ResourceBundleSymbolSourceProvider.DetailedDescription")+basename+"</i>");  //$NON-NLS-1$//$NON-NLS-2$
-        return symbol;
-    }
-
-    private String getBaseName(ResourceBundleType resBundle)
-    {
-        final BaseNameType  baseNameType = resBundle.getBaseName();
-        if (baseNameType != null)
-        {
-            return baseNameType.getTextContent();
-        }
-        return null;
-    }
-
-    private String getVarName(ResourceBundleType resBundle)
-    {
-        final VarType  varName = resBundle.getVar();
-        if (varName != null)
-        {
-            return varName.getTextContent();
-        }
-        return null;
-    }
-    
-    public final ISymbol[] getSymbols(String prefix, IAdaptable context,
-            int symbolScopeMask) {
-        return SymbolUtil.
-            filterSymbolsByPrefix(getSymbols(context, symbolScopeMask), prefix);
-    }
-
-    public final boolean isProvider(IAdaptable context) {
-        IFile file = FileContextUtil.deriveIFileFromContext(context);
-        
-        if (file != null)
-        {
-            final IProject project = file.getProject();
-            
-            if (project != null && project.isAccessible())
-            {
-                // to be valid, the jsf project must be at least version 1.2
-                return JSFAppConfigUtils.isValidJSFProject(project, IJSFCoreConstants.FACET_VERSION_1_2);
-            }
-        }
-        
-        return false;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/symbols/StaticJavaTypeSymbolFactory.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/symbols/StaticJavaTypeSymbolFactory.java
deleted file mode 100644
index 14d1c93..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/symbols/StaticJavaTypeSymbolFactory.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- * 
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.designtime.internal.symbols;
-
-import java.util.List;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.jst.jsf.context.symbol.IJavaTypeDescriptor2;
-import org.eclipse.jst.jsf.context.symbol.ISymbol;
-import org.eclipse.jst.jsf.context.symbol.source.AbstractContextSymbolFactory;
-import org.eclipse.jst.jsf.context.symbol.source.IAdditionalContextSymbolInfo;
-import org.eclipse.jst.jsf.designtime.symbols.FileContextUtil;
-import org.eclipse.jst.jsf.designtime.symbols.JSFSymbolFactory;
-
-/**
- * Creates symbols using a simple type.
- * 
- * @author cbateman
- * 
- */
-public class StaticJavaTypeSymbolFactory extends AbstractContextSymbolFactory
-{
-    private final JSFSymbolFactory _factory = new JSFSymbolFactory();
-
-    @Override
-    protected ISymbol internalCreate(String symbolName, int scope,
-            IAdaptable context, List problems,
-            IAdditionalContextSymbolInfo additionalInfo)
-    {
-        if (additionalInfo != null)
-        {
-            final String signature = additionalInfo.getSymbolTypeSignature();
-            if (signature != null)
-            {
-                final IJavaTypeDescriptor2 descriptor = _factory
-                        .createTypeDescriptorFromSignature(signature,
-                                getJavaProject(context));
-                return _factory.createJavaComponentSymbol(symbolName, descriptor, null);
-            }
-        }
-
-        // can't create
-        return null;
-    }
-
-    @Override
-    protected ISymbol internalCreate(String symbolName, int scope,
-            IAdaptable context, List problems)
-    {
-        // need additionInfo to create the symbol
-        return null;
-    }
-
-    @Override
-    public boolean supports(IAdaptable context)
-    {
-        return getJavaProject(context) != null;
-    }
-
-    private IJavaProject getJavaProject(final IAdaptable context)
-    {
-        if (context != null)
-        {
-            final IStructuredDocumentContext sContext = (IStructuredDocumentContext) context
-                    .getAdapter(IStructuredDocumentContext.class);
-            if (sContext != null)
-            {
-                final IProject project = FileContextUtil
-                        .getProject((IStructuredDocumentContext) context
-                                .getAdapter(IStructuredDocumentContext.class));
-                if (project != null)
-                {
-                    return JavaCore.create(project);
-                }
-            }
-        }
-        return null;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/symbols/ValueExpressionSymbolFactory.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/symbols/ValueExpressionSymbolFactory.java
deleted file mode 100644
index 724fd94..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/symbols/ValueExpressionSymbolFactory.java
+++ /dev/null
@@ -1,169 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- * 
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.designtime.internal.symbols;
-
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jst.jsf.common.internal.types.ValueType;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IDOMContextResolver;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IStructuredDocumentContextResolverFactory;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContextFactory;
-import org.eclipse.jst.jsf.context.symbol.ISymbol;
-import org.eclipse.jst.jsf.context.symbol.source.AbstractContextSymbolFactory;
-import org.eclipse.jst.jsf.context.symbol.source.IAdditionalContextSymbolInfo;
-import org.eclipse.jst.jsf.designtime.symbols.FileContextUtil;
-import org.eclipse.jst.jsf.designtime.symbols.JSFSymbolFactory;
-import org.eclipse.jst.jsf.validation.internal.appconfig.AppConfigValidationUtil;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMAttr;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.w3c.dom.Attr;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * 
- * @author cbateman
- * 
- */
-public class ValueExpressionSymbolFactory extends AbstractContextSymbolFactory
-{
-    private final JSFSymbolFactory _factory = new JSFSymbolFactory();
-
-    @Override
-    protected ISymbol internalCreate(final String symbolName, final int scope,
-            final IAdaptable context, final List problems,
-            final IAdditionalContextSymbolInfo additionalInfo)
-    {
-        final Node node = getNode(context);
-        final IStructuredDocumentContext sContext = getContext(context);
-
-        final String valueAttrName = additionalInfo
-                .getValueExpressionAttributeName();
-        if (node != null && valueAttrName != null)
-        {
-            Element element = null;
-
-            if (node instanceof Element)
-            {
-                element = (Element) node;
-            }
-            else
-            {
-                element = ((Attr) node).getOwnerElement();
-            }
-
-            return createSymbol(symbolName, sContext, valueAttrName, element);
-        }
-
-        return null;
-    }
-
-
-    private ISymbol createSymbol(final String name,
-            final IStructuredDocumentContext sContext,
-            final String valueAttrName, Element element)
-    {
-        if (element instanceof IDOMElement) // implicit null check.
-        {
-            final Attr attr = element.getAttributeNode(valueAttrName);
-
-            if (attr instanceof IDOMAttr && attr.getValue() != null)
-            {
-                // TODO: the extract expression method belongs in more
-                // generic code
-                final String elText = AppConfigValidationUtil
-                        .extractELExpression(attr.getValue()).getElText();
-                final IFile file = FileContextUtil
-                        .deriveIFileFromContext(sContext);
-                final IStructuredDocumentContext elContext = IStructuredDocumentContextFactory.INSTANCE
-                        .getContext(sContext.getStructuredDocument(), attr);
-                if (elText != null && file != null && elContext != null)
-                {
-                    final ValueType valueExpr = _factory
-                            .getValueTypeFromEL(elText, elContext, file);
-                    if (valueExpr != null)
-                    {
-                        final IJavaProject javaProject = getJavaProject(sContext);
-                        return _factory.createJavaComponentSymbol(name, valueExpr, null, javaProject);
-                    }
-                }
-            }
-        }
-        return null;
-    }
-
-    
-    @Override
-    protected ISymbol internalCreate(final String symbolName, final int scope,
-            final IAdaptable context, final List problems)
-    {
-        // need additionalInfo
-        return null;
-    }
-
-    @Override
-    public boolean supports(final IAdaptable context)
-    {
-        final Node node = getNode(context);
-        final IJavaProject javaProject = getJavaProject(context);
-        return javaProject != null && (node instanceof Element) || (node instanceof Attr);
-    }
-
-    private Node getNode(final IAdaptable context)
-    {
-        final IStructuredDocumentContext sContext = getContext(context);
-        if (sContext != null)
-        {
-            final IDOMContextResolver domResolver = IStructuredDocumentContextResolverFactory.INSTANCE
-                    .getDOMContextResolver(sContext);
-            if (domResolver != null)
-            {
-                return domResolver.getNode();
-            }
-        }
-        return null;
-    }
-
-    private IJavaProject getJavaProject(final IAdaptable context)
-    {
-        final IStructuredDocumentContext sContext = getContext(context);
-        
-        if (sContext != null)
-        {
-            final IProject project = FileContextUtil
-            .getProject((IStructuredDocumentContext) sContext
-                    .getAdapter(IStructuredDocumentContext.class));
-            if (project != null)
-            {
-                return JavaCore.create(project);
-            }
-        }
-        return null;
-    }
-    
-    private IStructuredDocumentContext getContext(final IAdaptable context)
-    {
-        if (context != null)
-        {
-            return (IStructuredDocumentContext) context
-                    .getAdapter(IStructuredDocumentContext.class);
-        }
-        return null;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/AbstractDTViewHandler.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/AbstractDTViewHandler.java
deleted file mode 100644
index bf38fe8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/AbstractDTViewHandler.java
+++ /dev/null
@@ -1,327 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.designtime.internal.view;
-
-import java.util.Collections;
-import java.util.Map;
-import java.util.concurrent.atomic.AtomicBoolean;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.jst.jsf.common.internal.resource.ImmutableLifecycleListener;
-import org.eclipse.jst.jsf.common.runtime.internal.model.component.ComponentTypeInfo;
-import org.eclipse.jst.jsf.context.symbol.ISymbol;
-import org.eclipse.jst.jsf.designtime.context.DTFacesContext;
-import org.eclipse.jst.jsf.designtime.internal.view.DTUIViewRoot.StalenessAdvisor;
-import org.eclipse.jst.jsf.designtime.internal.view.DTUIViewRoot.StalenessListener;
-import org.eclipse.jst.jsf.designtime.internal.view.DTUIViewRoot.VersionStamp;
-import org.eclipse.jst.jsf.designtime.internal.view.IDTViewHandler.ViewHandlerException.Cause;
-import org.eclipse.wst.common.componentcore.ComponentCore;
-
-/**
- * All IDTViewHandler's must sub-class this abstract class.
- * 
- * @author cbateman
- * 
- */
-public abstract class AbstractDTViewHandler implements IDTViewHandler
-{
-    private final AtomicBoolean _isDisposed    = new AtomicBoolean(false);
-
-    /**
-     * the path separator
-     */
-    public static final String  PATH_SEPARATOR = "/"; //$NON-NLS-1$
-
-    public abstract String calculateLocale(DTFacesContext context)
-            throws ViewHandlerException;
-
-    public final DTUIViewRoot createView(final DTFacesContext facesContext,
-            final String viewId) throws ViewHandlerException
-    {
-        if (_isDisposed.get())
-        {
-            throw new IllegalStateException("View handler is disposed"); //$NON-NLS-1$
-        }
-
-        final DTUIViewRoot viewRoot = internalCreateView(facesContext, viewId);
-        
-        if (viewRoot == null)
-        {
-            throw new ViewHandlerException("Problem in createView", Cause.UNABLE_TO_CREATE_VIEW); //$NON-NLS-1$
-        }
-        viewRoot.setViewId(viewId);
-        final VersionStamp versionStamp = createVersionStamp(facesContext,
-                viewId);
-        if (versionStamp == null)
-        {
-            throw new ViewHandlerException(new Throwable(
-                    "Bad version stamp detected"), Cause.BAD_VERSION_STAMP); //$NON-NLS-1$
-        }
-        viewRoot.setVersionStamp(versionStamp);
-
-        final StalenessAdvisor advisor = createStalenessAdvisor(viewRoot,
-                facesContext, viewId);
-
-        if (advisor == null)
-        {
-            throw new ViewHandlerException(new Throwable(
-                    "Bad staleness advisor"), Cause.BAD_STALENESS_ADVISOR); //$NON-NLS-1$
-        }
-        viewRoot.setStalenessAdvisor(advisor);
-
-        // lock down the tree
-        viewRoot.setSubtreeProtected();
-
-        registerView(viewRoot, facesContext, viewId);
-
-        return viewRoot;
-    }
-
-    /**
-     * @param facesContext
-     * @param viewId
-     * @return internal construction of the view root.
-     */
-    protected abstract DTUIViewRoot internalCreateView(
-            final DTFacesContext facesContext, final String viewId);
-
-    public abstract IResource getActionDefinition(DTFacesContext context,
-            String viewId) throws ViewHandlerException;
-
-    public abstract IPath getActionURL(DTFacesContext context,
-            IResource resource, IPath requestPath) throws ViewHandlerException;
-
-    public abstract IPath getRelativeActionPath(DTFacesContext context,
-            String relativeToViewId, String uri) throws ViewHandlerException;
-
-    public abstract IViewDefnAdapterFactory getViewMetadataAdapterFactory(
-            DTFacesContext context) throws ViewHandlerException;
-
-    public abstract boolean supportsViewDefinition(IFile file);
-
-    
-    public abstract void setLifecycleListener(ImmutableLifecycleListener listener);
-
-    public final void dispose()
-    {
-        if (_isDisposed.compareAndSet(false, true))
-        {
-            doDispose();
-        }
-    }
-
-    /**
-     * Sub-classes should override to add disposal tasks
-     */
-    protected void doDispose()
-    {
-        // do nothing by default
-    }
-
-    /**
-     * IMPORTANT: this method must not return null. All view creation will fail
-     * for this handler when createVersionStamp() returns null. create() will
-     * throw ViewHandlerException.
-     * 
-     * @param facesContext
-     * @param viewId
-     * @return a new version stamp for the facesContext/viewId. The version
-     *         stamp needs to be unique for all instances of viewId only, not
-     *         all instances of component trees everywhere in the system.
-     */
-    protected abstract VersionStamp createVersionStamp(
-            final DTFacesContext facesContext, final String viewId);
-
-    /**
-     * IMPORTANT: this method must not return null. All view creation will fail
-     * for this handler when createStalenessAdvisor returns null.
-     * 
-     * @param viewRoot
-     * @param facesContext
-     * @param viewId
-     * @return a new staleness advisor.
-     */
-    protected abstract StalenessAdvisor createStalenessAdvisor(
-            final DTUIViewRoot viewRoot, DTFacesContext facesContext,
-            String viewId);
-
-    /**
-     * Called by createView immediately before returning.  Provides sub-class
-     * a chance to register a fully initialized view root with any stateful
-     * activities such as automatic change tracking and caching.
-     * 
-     * @param viewRoot
-     * @param context
-     * @param viewId
-     */
-    protected void registerView(DTUIViewRoot viewRoot, final DTFacesContext context, final String viewId)
-    {
-        // do nothing by default
-    }
-
-    public String getViewId(final DTFacesContext context, final IResource res)
-    {
-        // TODO: sync with WebrootUtil?
-        String strWebrootPath = ""; //$NON-NLS-1$
-        final IProject project = res.getProject();
-        final IPath path = res.getFullPath();
-        final IPath webContentPath = getWebContentPath(project);
-        if (webContentPath != null && webContentPath.isPrefixOf(path))
-        {
-            final int start = path.matchingFirstSegments(webContentPath);
-            final String[] segments = path.segments();
-            for (int i = start, n = path.segmentCount(); i < n; i++)
-            {
-                strWebrootPath = strWebrootPath + PATH_SEPARATOR + segments[i];
-            }
-        }
-        return strWebrootPath;
-    }
-
-    private IPath getWebContentPath(final IProject project)
-    {
-        if (project != null)
-        {
-            return ComponentCore.createComponent(project).getRootFolder()
-                    .getUnderlyingFolder().getFullPath();
-        }
-        return null;
-    }
-
-    /**
-     * A default DTUIViewRoot that represents an uncreatable or uninitializable
-     * view root.
-     *
-     */
-    protected static final class NullViewRoot extends DTUIViewRoot
-    {
-        /**
-         * 
-         */
-        private static final long serialVersionUID = 1187035338610719171L;
-
-        /**
-         */
-        protected NullViewRoot()
-        {
-            super(null, null, new ComponentTypeInfo("", "", "","")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
-        }
-
-        @Override
-        public IAdaptable getServices()
-        {
-            return new IAdaptable()
-            {
-                public Object getAdapter(Class adapter)
-                {
-                    // no services
-                    return null;
-                }
-            };
-        }
-
-		@Override
-		protected Map<String, ISymbol> doGetMapForScope(int scopeMask) {			
-			return Collections.emptyMap();
-		}
-        
-    }
-
-    /**
-     * Provides a simple time-based stamp that makes almost impossible to create
-     * the same timestamp twice. To do so, two threads would need to get the
-     * same system simulataneously and get same number back from the same
-     * gaussian distribution.
-     * 
-     * @author cbateman
-     * 
-     */
-    protected static class TimeBasedVersionStamp extends VersionStamp
-    {
-        /**
-         * 
-         */
-        private static final long serialVersionUID = 5557828245936568977L;
-        private final long        timestamp;
-        private final long        randomStamp;
-
-        /**
-         * 
-         */
-        public TimeBasedVersionStamp()
-        {
-            super();
-            // use the millisecond time, since it is offset from a known
-            // point on all platform, whereas no guarantee is made about
-            // the nano time value.
-            this.timestamp = System.currentTimeMillis();
-            // this protects against two threads constructing two time
-            // stamp objects "simulataneously" and having the same time based
-            // stamp. Math.random is thread-safe.
-            this.randomStamp = (long) (Long.MAX_VALUE * Math.random());
-        }
-
-        @Override
-        public int hashCode()
-        {
-            return (int) (timestamp ^ randomStamp);
-        }
-
-        @Override
-        protected boolean isEqual(final VersionStamp other)
-        {
-            return other instanceof TimeBasedVersionStamp
-                    && (timestamp == ((TimeBasedVersionStamp) other).timestamp)
-                    && (randomStamp == ((TimeBasedVersionStamp) other).randomStamp);
-        }
-    }
-
-    /**
-     * Returns a default staleness advisor that always returns false.
-     * 
-     * @author cbateman
-     * 
-     */
-    protected static final class NullStalenessAdvisor extends StalenessAdvisor
-    {
-        /**
-         * 
-         */
-        private static final long serialVersionUID = 5946420948320047613L;
-
-        @Override
-        public boolean isStale()
-        {
-            return false;
-        }
-
-        @Override
-        public void addListener(final StalenessListener listener)
-        {
-            // do nothing
-        }
-
-        @Override
-        public void removeListener(final StalenessListener listener)
-        {
-            // do nothing
-        }
-        
-        public boolean isAccessible()
-        {
-            return true;
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/AbstractViewDefnAdapter.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/AbstractViewDefnAdapter.java
deleted file mode 100644
index a7e620d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/AbstractViewDefnAdapter.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.designtime.internal.view;
-
-import java.util.List;
-
-import org.eclipse.jst.jsf.common.runtime.internal.model.ViewObject;
-import org.eclipse.jst.jsf.common.runtime.internal.model.component.ComponentInfo;
-import org.eclipse.jst.jsf.common.runtime.internal.model.datatypes.ELExpression;
-import org.eclipse.jst.jsf.context.IModelContext;
-import org.eclipse.jst.jsf.designtime.context.DTFacesContext;
-import org.eclipse.jst.jsf.designtime.internal.view.IDTViewHandler.ViewHandlerException;
-
-/**
- * All view definition adapters must sub-class this abstract class.
- * 
- * @author cbateman
- * @param <VIEW_DEFN_BASE_TYPE>
- * @param <VIEW_CONTAINER_TYPE>
- * 
- */
-public abstract class AbstractViewDefnAdapter<VIEW_DEFN_BASE_TYPE, VIEW_CONTAINER_TYPE>
-        implements IViewDefnAdapter<VIEW_DEFN_BASE_TYPE, VIEW_CONTAINER_TYPE>
-{
-    public abstract ViewObject mapToViewObject(
-            VIEW_DEFN_BASE_TYPE viewDefnObject,
-            ViewObjectConstructionStrategy<? extends VIEW_DEFN_BASE_TYPE> constructionData,
-            VIEW_CONTAINER_TYPE viewContainer);
-
-    public abstract String getId(VIEW_DEFN_BASE_TYPE viewDefnObject)
-            throws IllegalArgumentException;
-
-    public abstract VIEW_CONTAINER_TYPE getContainer(DTFacesContext context,
-            String viewId);
-
-    public abstract List<VIEW_DEFN_BASE_TYPE> getViewDefnRoots(
-            VIEW_CONTAINER_TYPE container);
-
-    public abstract ELExpression getELExpression(final IModelContext context)
-            throws ViewHandlerException;
-
-    public abstract ViewObject findViewObject(VIEW_DEFN_BASE_TYPE viewDefnObject,
-            ComponentInfo root);
-
-    public abstract VIEW_DEFN_BASE_TYPE findViewDefn(ViewObject viewObject,
-            ComponentInfo root);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/AbstractViewDefnAdapterFactory.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/AbstractViewDefnAdapterFactory.java
deleted file mode 100644
index 5c5fdf2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/AbstractViewDefnAdapterFactory.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.designtime.internal.view;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.content.IContentType;
-import org.eclipse.core.runtime.content.IContentTypeManager;
-import org.eclipse.jst.jsf.core.internal.CompositeTagRegistryFactory;
-import org.eclipse.jst.jsf.core.internal.CompositeTagRegistryFactory.TagRegistryIdentifier;
-import org.eclipse.jst.jsf.designtime.context.DTFacesContext;
-import org.eclipse.jst.jsf.designtime.internal.view.model.ITagRegistry;
-
-/**
- * Factories that create view definition adapters must extend this
- * class.
- * 
- * @author cbateman
- *
- */
-public abstract class AbstractViewDefnAdapterFactory implements IViewDefnAdapterFactory 
-{
-    /**
-     * @param context
-     * @param viewId
-     * @return a view adapter for the viewid or null if this factory
-     * cannot produce an adapter for the underlying view definition.
-     */
-    public abstract IViewDefnAdapter createAdapter(DTFacesContext context, String viewId);
-    
-    /**
-     * TODO: since this implicitly, XML-specific, perhaps this belongs
-     * in a util class
-     * Sub-classes may use to locate a tag registry for their view adapter
-     * @param file
-     * @return a tag registry for the file (based on class path and
-     * content type) or null if none.
-     */
-    protected final ITagRegistry findTagRegistry(final IFile file)
-    {
-        final IContentTypeManager typeManager = Platform.getContentTypeManager();
-        final IContentType contentType = 
-            typeManager.findContentTypeFor(file.getName());
-        ITagRegistry tagRegistry = null;
-        if (contentType != null)
-        {
-            final TagRegistryIdentifier id =
-                new TagRegistryIdentifier(file.getProject(), contentType);
-            tagRegistry = CompositeTagRegistryFactory.getInstance().getRegistry(id);
-        }
-        return tagRegistry;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/ComponentConstructionData.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/ComponentConstructionData.java
deleted file mode 100644
index 914f7ef..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/ComponentConstructionData.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.designtime.internal.view;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jst.jsf.common.runtime.internal.model.component.ComponentInfo;
-
-/**
- * Encapsulates information required to construct a component
- * 
- * @author cbateman
- * 
- */
-public class ComponentConstructionData
-{
-    private ComponentInfo _parent;
-    private int _idCounter;
-    private final IProject _project;
-    private final IDocument _document;
-    /**
-     * @param idCounter
-     * @param parent
-     * @param project
-     * @param document
-     */
-    public ComponentConstructionData(final int idCounter,
-            final ComponentInfo parent, final IProject project, final IDocument document)
-    {
-        _parent = parent;
-        _idCounter = idCounter;
-        _project = project;
-        _document = document;
-    }
-
-    /**
-     * @return the parent id
-     */
-    public final ComponentInfo getParent()
-    {
-        return _parent;
-    }
-
-    /**
-     * @return the id counter
-     */
-    public final int getIdCounter()
-    {
-        return _idCounter;
-    }
-
-    /**
-     * Increment the counter by 1 and return the old value
-     * 
-     * @return the old value
-     */
-    public final int increment()
-    {
-        return _idCounter++;
-    }
-
-    /**
-     * @param parent
-     */
-    public final void setParent(final ComponentInfo parent)
-    {
-        _parent = parent;
-    }
-
-    /**
-     * @param idCounter
-     */
-    public final void setIdCounter(final int idCounter)
-    {
-        _idCounter = idCounter;
-    }
-
-    /**
-     * @return the project that this component construction is associated with
-     */
-    public final IProject getProject()
-    {
-        return _project;
-    }
-
-    /**
-     * @return the document context for the construction
-     */
-    public final IDocument getDocument()
-    {
-        return _document;
-    }
-    
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/ComponentTreeConstructionStrategy.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/ComponentTreeConstructionStrategy.java
deleted file mode 100644
index 53763da..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/ComponentTreeConstructionStrategy.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.designtime.internal.view;
-
-import org.eclipse.jst.jsf.common.runtime.internal.model.component.ComponentInfo;
-import org.eclipse.jst.jsf.designtime.context.DTFacesContext;
-
-/**
- * @author cbateman
- *
- * @param <VIEW_DEFN_BASE_TYPE>
- * @param <VIEW_CONTAINER_TYPE>
- */
-public abstract class ComponentTreeConstructionStrategy<VIEW_DEFN_BASE_TYPE, VIEW_CONTAINER_TYPE>
-{
-    /**
-     * @param context 
-     * @param viewRoot 
-     * @return a component tree rooted
-     * XXX: need to accommodate different cases of fragments, invalid multiple roots
-     * etc, perhaps with special surrogate root type
-     */
-    public abstract ComponentInfo createComponentTree(DTFacesContext context, DTUIViewRoot viewRoot);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/DTComponentIntrospector.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/DTComponentIntrospector.java
deleted file mode 100644
index 66763f4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/DTComponentIntrospector.java
+++ /dev/null
@@ -1,402 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.designtime.internal.view;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jem.internal.proxy.core.IBeanTypeProxy;
-import org.eclipse.jem.internal.proxy.core.IConfigurationContributor;
-import org.eclipse.jem.internal.proxy.core.IStandardBeanTypeProxyFactory;
-import org.eclipse.jem.internal.proxy.core.ProxyFactoryRegistry;
-import org.eclipse.jem.internal.proxy.ide.IDERegistration;
-import org.eclipse.jst.jsf.common.internal.types.TypeInfoCache;
-import org.eclipse.jst.jsf.common.runtime.internal.model.component.ComponentTypeInfo;
-import org.eclipse.jst.jsf.common.runtime.internal.model.decorator.ConverterTypeInfo;
-import org.eclipse.jst.jsf.common.runtime.internal.model.decorator.ValidatorTypeInfo;
-import org.eclipse.jst.jsf.common.util.JDTBeanIntrospector;
-import org.eclipse.jst.jsf.common.util.JDTBeanProperty;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.core.internal.JSFCoreTraceOptions;
-import org.eclipse.jst.jsf.core.internal.jem.BeanProxyUtil.BeanProxyWrapper;
-import org.eclipse.jst.jsf.core.internal.jem.BeanProxyUtil.ProxyException;
-import org.eclipse.jst.jsf.core.jsfappconfig.internal.IJSFAppConfigManager;
-import org.eclipse.jst.jsf.core.jsfappconfig.internal.JSFAppConfigManagerFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.ComponentType;
-import org.eclipse.jst.jsf.facesconfig.emf.ConverterType;
-import org.eclipse.jst.jsf.facesconfig.emf.ValidatorType;
-
-/**
- * Utility class for finding and bean introspecting component and related
- * classes.
- * 
- * @author cbateman
- * 
- */
-public final class DTComponentIntrospector
-{
-    /**
-     * A shared type cache for doing tag class introspection. The cache stores
-     * type hierarchies and updates them on detected changes to reduce the
-     * overhead of doing such lookups
-     */
-    private static TypeInfoCache TYPE_CACHE; // lazily created, don't access
-
-    // directly
-
-    /**
-     * @return the type cache used by all DTComponentIntrospector internally.
-     */
-    public static TypeInfoCache getSharedTypeCache()
-    {
-        if (TYPE_CACHE == null)
-        {
-            TYPE_CACHE = TypeInfoCache.createNewInstance();
-        }
-        return TYPE_CACHE;
-    }
-
-    /**
-     * @param classType
-     * @param className
-     * @param project
-     * @param contributors  may be null
-     * @return the component type info for the class type or null if none.  Adds
-     * contributors to the class path
-     */
-    public static ComponentTypeInfo getComponent(final String classType,
-            final String className, final IProject project,
-            final IConfigurationContributor[] contributors)
-    {
-        ProxyFactoryRegistry registry = null;
-        try
-        {
-            registry = getProxyFactoryRegistry(project,
-                    contributors);
-    
-            if (registry != null)
-            {
-                final IStandardBeanTypeProxyFactory factory = registry
-                        .getBeanTypeProxyFactory();
-                final IBeanTypeProxy classTypeProxy = factory
-                        .getBeanTypeProxy(className);
-                final BeanProxyWrapper classTypeWrapper = new BeanProxyWrapper(project,
-                        classTypeProxy);
-    
-                String family = null;
-                String renderer = null;
-                try
-                {
-                    classTypeWrapper.init();
-                    family = classTypeWrapper.callStringMethod("getFamily"); //$NON-NLS-1$
-                    renderer = classTypeWrapper.callStringMethod("getRendererType"); //$NON-NLS-1$
-                }
-                catch (ProxyException e1)
-                {
-                    // fall through
-                    if (JSFCoreTraceOptions.TRACE_JSPTAGINTROSPECTOR)
-                    {
-                        JSFCoreTraceOptions.log("DTComponentIntrospector.getComponent:", e1); //$NON-NLS-1$
-                    }
-                }
-    
-                IType type = null;
-    
-                try
-                {
-                    type = JavaCore.create(project).findType(className);
-                }
-                catch (JavaModelException e)
-                {
-                    // fall through;
-                }
-    
-                List<String> interfaces = new ArrayList<String>();
-                List<String> superClasses = new ArrayList<String>();
-    
-                if (type != null)
-                {
-                    TypeInfoCache typeCache = getSharedTypeCache();
-    
-                    IType[] interfaceTypes = typeCache.cacheInterfaceTypesFor(type);
-                    for (IType interfaze : interfaceTypes)
-                    {
-                        interfaces.add(interfaze.getFullyQualifiedName());
-                    }
-    
-                    IType[] superClassTypes = typeCache.cacheSupertypesFor(type);
-    
-                    for (IType superClass : superClassTypes)
-                    {
-                        superClasses.add(superClass.getFullyQualifiedName());
-                    }
-                }
-    
-                return new ComponentTypeInfo(classType, className, superClasses
-                        .toArray(new String[0]), interfaces.toArray(new String[0]),
-                        family, renderer);
-            }
-        }
-        finally
-        {
-            if (registry != null)
-            {
-                registry.terminateRegistry(true);
-            }
-        }
-        return null;
-    }
-
-    /**
-     * @param classType
-     * @param className
-     * @param project
-     * @return the component type info with no additional classpath
-     *         contributions. May return null;
-     */
-    public static ComponentTypeInfo getComponent(final String classType,
-            final String className, final IProject project)
-    {
-        return getComponent(classType, className, project, null);
-    }
-
-    /**
-     * @param converterId
-     * @param converterClass
-     * @return a new converter type info for the converter id.
-     */
-    public static ConverterTypeInfo getConverter(final String converterId,
-            final String converterClass)
-    {
-        return new ConverterTypeInfo(converterClass, converterId);
-    }
-
-    /**
-     * @param validatorId
-     * @param validatorClass
-     * @return a new validator type info for the validator id
-     */
-    public static ValidatorTypeInfo getValidator(final String validatorId,
-            final String validatorClass)
-    {
-        return new ValidatorTypeInfo(validatorClass, validatorId);
-    }
-
-    /**
-     * @param componentType
-     * @param project
-     * @return the configured class name for the JSF component type id or null
-     *         if not found.
-     */
-    public static String findComponentClass(final String componentType,
-            final IProject project)
-    {
-        final IJSFAppConfigManager manager = JSFAppConfigManagerFactory
-                .getJSFAppConfigManagerInstance(project);
-        final List<ComponentType> components = manager.getComponents();
-
-        for (final ComponentType component : components)
-        {
-            final String type = component.getComponentType().getTextContent()
-                    .trim();
-
-            if (componentType.equals(type))
-            {
-                return component.getComponentClass().getTextContent().trim();
-            }
-        }
-        return null;
-    }
-
-    /**
-     * @param converterId
-     * @param project
-     * @return a fully qualified class name corresponding to converterId or null
-     *         if none.
-     */
-    public static String findConverterClass(final String converterId,
-            final IProject project)
-    {
-        final IJSFAppConfigManager manager = JSFAppConfigManagerFactory
-                .getJSFAppConfigManagerInstance(project);
-        final List<ConverterType> converters = manager.getConverters();
-
-        for (final ConverterType converter : converters)
-        {
-            if (converter != null && converter.getConverterId() != null
-                    && converter.getConverterId().getTextContent() != null)
-            {
-                final String type = converter.getConverterId().getTextContent()
-                        .trim();
-
-                if (converterId.equals(type))
-                {
-                    if (converter.getConverterClass() != null && converter.getConverterClass().getTextContent()!=null)
-                    {
-                        return converter.getConverterClass().getTextContent()
-                                .trim();
-                    }
-                    return null;
-                }
-            }
-        }
-        return null;
-    }
-
-    /**
-     * @param validatorId
-     * @param project
-     * @return a fully qualified class name corresponding to the validatorId or
-     *         null if none.
-     */
-    public static String findValidatorClass(final String validatorId,
-            final IProject project)
-    {
-        final IJSFAppConfigManager manager = JSFAppConfigManagerFactory
-                .getJSFAppConfigManagerInstance(project);
-        final List<ValidatorType> validators = manager.getValidators();
-
-        for (final ValidatorType validatorType : validators)
-        {
-            if (validatorType != null && validatorType.getValidatorId() != null && 
-                    validatorType.getValidatorId().getTextContent() != null)
-            {
-                final String type = validatorType.getValidatorId().getTextContent()
-                        .trim();
-    
-                if (validatorId.equals(type))
-                {
-                    return validatorType.getValidatorClass().getTextContent()
-                            .trim();
-                }
-            }
-        }
-        return null;
-    }
-
-    /**
-     * @param type
-     * @param checkInstanceOf
-     * @return true if type resolves to a type that is an instance of one of the
-     *         types in checkInstanceOf.
-     */
-    public static boolean isTypeNameInstanceOfClass(final IType type,
-            final Set<String> checkInstanceOf)
-    {
-        if (checkInstanceOf == null)
-        {
-            throw new AssertionError();
-        }
-        if (type != null)
-        {
-            // first and foremost, are these exactly droids you're
-            // looking for and not just their predecessors?
-            if (checkInstanceOf.contains(type.getFullyQualifiedName()))
-            {
-                return true;
-            }
-
-            for (final IType supertype : getSharedTypeCache()
-                    .cacheSupertypesFor(type))
-            {
-                if (checkInstanceOf.contains(supertype.getFullyQualifiedName()))
-                {
-                    return true;
-                }
-            }
-
-            for (final IType interfaces : getSharedTypeCache()
-                    .cacheInterfaceTypesFor(type))
-            {
-                if (checkInstanceOf
-                        .contains(interfaces.getFullyQualifiedName()))
-                {
-                    return true;
-                }
-            }
-        }
-
-        return false;
-    }
-
-    /**
-     * @param typeInfo
-     * @param project
-     * @return a list of all bean properties (using the POJO method) on
-     *         typeInfo. List may be empty, never null.
-     */
-    public static Map<String, JDTBeanProperty> getBeanProperties(
-            final ComponentTypeInfo typeInfo, final IProject project)
-    {
-        Map<String, JDTBeanProperty> properties = new HashMap<String, JDTBeanProperty>();
-
-        IJavaProject javaProject = JavaCore.create(project);
-        try
-        {
-            IType type = javaProject.findType(typeInfo.getClassName());
-
-            if (type != null)
-            {
-                // TODO: should be able to use type cache for this
-                final JDTBeanIntrospector introspector = new JDTBeanIntrospector(
-                        type);
-                properties = introspector.getProperties();
-            }
-        }
-        catch (JavaModelException e)
-        {
-            JSFCorePlugin.log("Error finding component type", e); //$NON-NLS-1$
-        }
-
-        return properties;
-    }
-
-    /**
-     * @param project
-     * @return a new proxy factory registry or null;
-     * 
-     * TODO: caching?
-     */
-    private static ProxyFactoryRegistry getProxyFactoryRegistry(
-            final IProject project, final IConfigurationContributor[] contributors)
-    {
-        try
-        {
-            return IDERegistration.startAnImplementation(contributors, false, project,
-                    project.getName(), JSFCorePlugin.PLUGIN_ID,
-                    new NullProgressMonitor());
-        }
-        catch (final CoreException e)
-        {
-            JSFCorePlugin.log("Error starting vm for project: " //$NON-NLS-1$
-                    + project.getName(), e);
-        }
-
-        return null;
-    }
-
-    private DTComponentIntrospector()
-    {
-        // no external instantiation
-    }
-
-    // private static class
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/DTUIViewRoot.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/DTUIViewRoot.java
deleted file mode 100644
index 5d8b7ae..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/DTUIViewRoot.java
+++ /dev/null
@@ -1,335 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.designtime.internal.view;
-
-import java.io.Serializable;
-import java.util.Collections;
-import java.util.Map;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jst.jsf.common.runtime.internal.model.component.ComponentInfo;
-import org.eclipse.jst.jsf.common.runtime.internal.model.component.ComponentTypeInfo;
-import org.eclipse.jst.jsf.context.symbol.ISymbol;
-import org.eclipse.jst.jsf.context.symbol.source.ISymbolConstants;
-
-/**
- * The interface for all design view root objects.
- * 
- */
-public abstract class DTUIViewRoot extends ComponentInfo
-{
-    private StalenessAdvisor  _stalenessAdvisor;
-
-    private String            _viewId;
-    private VersionStamp      _versionStamp;
-
-    /**
-     * 
-     */
-    private static final long serialVersionUID = -6375907116774572269L;
-
-    /**
-     * @param id
-     * @param parent
-     * @param componentTypeInfo
-     */
-    protected DTUIViewRoot(final String id, final ComponentInfo parent,
-            final ComponentTypeInfo componentTypeInfo)
-    {
-        super(id, parent, componentTypeInfo, true);
-    }
-
-    /**
-     * @return the view id
-     */
-    public final String getViewId()
-    {
-        return _viewId;
-    }
-
-    /**
-     * @param viewId
-     * 
-     */
-    final void setViewId(final String viewId)
-    {
-        _viewId = viewId;
-    }
-
-    /**
-     * <p>
-     * Clients may use the version stamp to determine if their instance of a
-     * view root is out of date. For example, if a client has cached an instance
-     * of a view root and wants to quickly checked if there is a newer version,
-     * it may request a new copy and compare version stamps
-     * </p>
-     * 
-     * <p>
-     * The version stamp must be calculated so that given two instance of a view
-     * root for the same view id, v1 and v2:
-     * </p>
-     * 
-     * <p>
-     * if v1.getVersionStamp().equals(v2.getVersionStamp()) then v1 and v2 are
-     * the same even if v1 != v2. Note that this uniqueness must hold true
-     * across multiple sessions of the IDE, since v1 or v2 may have been
-     * restored from permanent storage. For this reason, running counts should
-     * are discouraged unless they too can be reliably stored. Better is
-     * something that relies on large random numbers combined with a time stamp
-     * or workspace modification stamp
-     * </p>
-     * 
-     * @return the unique version stamp of this view root. This may be used as
-     *         quick check as to whether to view roots are not equal.
-     */
-    public final VersionStamp getVersionStamp()
-    {
-        return delegateVersionStamp();
-    }
-
-    VersionStamp delegateVersionStamp()
-    {
-        return _versionStamp;
-    }
-
-    final void setVersionStamp(VersionStamp versionStamp)
-    {
-        _versionStamp = versionStamp;
-    }
-    
-    
-    /**
-     * @return a map of ISymbols representing the currently available
-     * view scope variables.  Never null, empty if no symbols
-     * Map is unmodifiable (throws exception on mutation operations)
-     */
-    public final Map<String, ISymbol> getViewMap() {
-    	return Collections.unmodifiableMap(doGetMapForScope(ISymbolConstants.SYMBOL_SCOPE_VIEW));
-    }
-    
-    /**
-     * @param scopeMask
-     * @return Map of symbols
-     */
-    protected abstract Map<String, ISymbol> doGetMapForScope(final int scopeMask);
-
-    /**
-     * @return true if the view root is out of sync with its view source.
-     */
-    public final boolean isStale()
-    {
-        return _stalenessAdvisor.isStale();
-    }
-
-    final void setStalenessAdvisor(final StalenessAdvisor stalenessAdvisor)
-    {
-        _stalenessAdvisor = stalenessAdvisor;
-    }
-
-    /**
-     * Implementations must ensure that listeners are only added if they are 
-     * not already present.
-     * 
-     * @param listener
-     */
-    public final void addListener(final StalenessListener listener)
-    {
-        _stalenessAdvisor.addListener(listener);
-    }
-
-    /**
-     * @param listener
-     */
-    public final void removeListener(final StalenessListener listener)
-    {
-        _stalenessAdvisor.removeListener(listener);
-    }
-
-    /**
-     * @return an adapter that can be used to request additional services from
-     *         the view root instance. This can be used to get services that are
-     *         not specific to all view roots such as mappings between view
-     *         definition artifacts and their view objects. Value may be null if
-     *         a view root chooses not to expose any services.
-     */
-    public abstract IAdaptable getServices();
-
-    /**
-     * An abstract versioning stamp that can be used to uniquely identify a
-     * version of a DTUIViewRoot.
-     * 
-     * @author cbateman
-     * 
-     */
-    public abstract static class VersionStamp implements Serializable
-    {
-        /**
-         * 
-         */
-        private static final long serialVersionUID = -7869336223178326584L;
-
-        /**
-         * Called by equals to determine absolute equality.
-         * 
-         * @param other
-         * @return true if and only if other represents the exact same version
-         *         as this. Hashcode must be reimplemented in a way to guarantee
-         *         that the equals() contract is respected.
-         */
-        protected abstract boolean isEqual(final VersionStamp other);
-
-        /**
-         * Must reimplement hashCode to match isEqual
-         */
-        public abstract int hashCode();
-
-        @Override
-        public final boolean equals(Object obj)
-        {
-            if (this == obj)
-            {
-                return true;
-            }
-
-            // NOTE: instanceof covers obj == null check.
-            if (obj instanceof VersionStamp)
-            {
-                return isEqual((VersionStamp) obj);
-            }
-            return false;
-        }
-    }
-
-    /**
-     * An advisor which allows a view root to bridge to its source to see if its
-     * out-of-sync, while keeping it decoupled from what specifically its source
-     * is.
-     * 
-     * @author cbateman
-     * 
-     */
-    public static abstract class StalenessAdvisor implements Serializable
-    {
-        /**
-         * 
-         */
-        private static final long serialVersionUID = 3449240686744169430L;
-
-        /**
-         * Implementations must ensure that listeners are only added if they are 
-         * not already present.
-         * @param listener
-         */
-        public abstract void addListener(StalenessListener listener);
-
-        /**
-         * @param listener
-         */
-        public abstract void removeListener(StalenessListener listener);
-
-        /**
-         * NOTE: it is very dangerous to have an advisor that always returns
-         * stale == true since many clients will rely on the staleness flag to
-         * determine if they should try to update the model.
-         * 
-         * @return true if we are out of sync with the source that this tree was
-         *         constructed from.
-         */
-        public abstract boolean isStale();
-
-        /**
-         * @return a flag similar to IResource.isAccessible that indicates if
-         *         the underlying view definition is no longer accessible either
-         *         due it being deleted or it's source file being unaccessible
-         *         due to project closure or other issues.
-         */
-        public abstract boolean isAccessible();
-    }
-
-    /**
-     * A listener that is informed of model staleness events
-     * 
-     */
-    public static abstract class StalenessListener
-    {
-        /**
-         * @param event
-         */
-        protected abstract void stalenessChanged(StalenessEvent event);
-    }
-
-    /**
-     * An event that is fied when a model's staleness changes.
-     * 
-     */
-    public final static class StalenessEvent
-    {
-        private final ChangeType _type;
-
-        /**
-         * @param type
-         */
-        protected StalenessEvent(final ChangeType type)
-        {
-            _type = type;
-        }
-
-        /**
-         * @return true if the event source is now stale.
-         */
-        public final ChangeType getChangeType()
-        {
-            return _type;
-        }
-
-        /**
-         * The type of staleness change
-         * 
-         */
-        /**
-         * @author cbateman
-         *
-         */
-        public enum ChangeType
-        {
-            /**
-             * Indicates that the view definition has been changed in a way that
-             * will make existing DTUIViewRoot's stale.
-             */
-            VIEW_DEFN_CHANGED,
-
-            /**
-             * Inidicates that the view definition has been deleted.
-             */
-            VIEW_DEFN_DELETED,
-
-            /**
-             * Indicates that the view definition's enclosing project will be
-             * closed, causing the definition to be made unavailable for an
-             * indeterminate amount of time.
-             */
-            VIEW_DEFN_PROJECT_CLOSED,
-
-            /**
-             * Indicates that a view root has been invalid due to a project 
-             * clean.  View root should generally be forcibly updated on
-             * a project clean even if other staleness preconditions haven't
-             * been met.
-             */
-            PROJECT_CLEANED
-        }
-
-        /**
-         * 
-         */
-        private static final long serialVersionUID = 6765346004772568514L;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/DefaultDTUIViewRoot.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/DefaultDTUIViewRoot.java
deleted file mode 100644
index 75985be..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/DefaultDTUIViewRoot.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.designtime.internal.view;
-
-import java.io.Serializable;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jst.jsf.common.JSFCommonPlugin;
-import org.eclipse.jst.jsf.common.runtime.internal.model.component.ComponentTypeInfo;
-import org.eclipse.jst.jsf.context.symbol.ISymbol;
-import org.eclipse.jst.jsf.context.symbol.source.ISymbolSourceProvider;
-import org.eclipse.jst.jsf.context.symbol.source.ISymbolSourceProviderFactory;
-import org.eclipse.jst.jsf.designtime.context.DTFacesContext;
-
-/**
- * The default view root implementation. Assumes an XML view definition.
- * 
- * @author cbateman
- * 
- */
-public class DefaultDTUIViewRoot extends DTUIViewRoot
-{
-    /**
-     * serializable
-     */
-    private static final long                    serialVersionUID = -6948413077931237435L;
-    private final DefaultServices                _defaultServices;
-	private DTFacesContext _facesContext;
-
-    /**
-     * @param facesContext 
-     */
-    public DefaultDTUIViewRoot(final DTFacesContext facesContext)
-    {
-        // TODO: refactor constants
-        super(null, null, new ComponentTypeInfo("javax.faces.ViewRoot", //$NON-NLS-1$
-                "javax.faces.component.UIViewRoot", "javax.faces.ViewRoot", //$NON-NLS-1$ //$NON-NLS-2$
-                null));
-        _defaultServices = new DefaultServices();
-    	_facesContext = facesContext;
-    }
-
-    @Override
-    public IAdaptable getServices()
-    {
-        return _defaultServices;
-    }
-
-    private class DefaultServices implements IAdaptable, Serializable
-    {
-        /**
-         * 
-         */
-        private static final long serialVersionUID = -5220371377352799212L;
-        private final XMLViewObjectMappingService   _xmlViewObjectMappingService;
-
-        private DefaultServices()
-        {
-            _xmlViewObjectMappingService = new XMLViewObjectMappingService();
-        }
-
-        public Object getAdapter(final Class adapter)
-        {
-            if (adapter.equals(XMLViewObjectMappingService.class))
-            {
-                return _xmlViewObjectMappingService;
-            }
-            return null;
-        }
-    }
-
-	@Override
-	protected Map<String, ISymbol> doGetMapForScope(final int scopeMask) {
-		final Map<String, ISymbol> map = new HashMap<String, ISymbol>();
-		
-		IProject project = _facesContext.adaptContextObject().getProject();
-		for (final Iterator it = JSFCommonPlugin.getSymbolSourceProviders().iterator(); it.hasNext();)
-        {
-		    final ISymbolSourceProviderFactory  factory = (ISymbolSourceProviderFactory) it.next();
-		    final ISymbolSourceProvider provider = factory.createInstance(project);
-		    
-		    final ISymbol[] symbols = provider.getSymbols(_facesContext.adaptContextObject(), scopeMask);
-		    
-		    for (int i = 0; i < symbols.length; i++)
-		    {
-		    	map.put(symbols[i].getName(), symbols[i]);
-		    }
-        }
-
-		return map;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/DefaultDTViewHandler.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/DefaultDTViewHandler.java
deleted file mode 100644
index 4f94b6c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/DefaultDTViewHandler.java
+++ /dev/null
@@ -1,614 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.designtime.internal.view;
-
-import java.io.Serializable;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.CopyOnWriteArrayList;
-import java.util.concurrent.atomic.AtomicBoolean;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IResourceChangeEvent;
-import org.eclipse.core.resources.IResourceChangeListener;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.IncrementalProjectBuilder;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jst.jsf.common.internal.JSPUtil;
-import org.eclipse.jst.jsf.common.internal.resource.EventResult;
-import org.eclipse.jst.jsf.common.internal.resource.IResourceLifecycleListener;
-import org.eclipse.jst.jsf.common.internal.resource.ImmutableLifecycleListener;
-import org.eclipse.jst.jsf.common.internal.resource.ResourceLifecycleEvent;
-import org.eclipse.jst.jsf.common.internal.resource.ResourceLifecycleEvent.ReasonType;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.designtime.context.DTFacesContext;
-import org.eclipse.jst.jsf.designtime.internal.view.DTUIViewRoot.StalenessAdvisor;
-import org.eclipse.jst.jsf.designtime.internal.view.DTUIViewRoot.StalenessEvent;
-import org.eclipse.jst.jsf.designtime.internal.view.DTUIViewRoot.StalenessEvent.ChangeType;
-import org.eclipse.jst.jsf.designtime.internal.view.DTUIViewRoot.StalenessListener;
-import org.eclipse.jst.jsf.designtime.internal.view.DTUIViewRoot.VersionStamp;
-import org.eclipse.jst.jsf.designtime.internal.view.model.ITagRegistry;
-import org.w3c.dom.Node;
-
-/**
- * A default implementation of the design time view handler meant to parallel
- * the default runtime ViewHandler required by the JSF spec.
- * 
- */
-public class DefaultDTViewHandler extends AbstractDTViewHandler
-{
-    private final MyLifecycleManager _lifecycleManager = new MyLifecycleManager();
-
-    @Override
-    public String calculateLocale(final DTFacesContext context)
-    throws ViewHandlerException
-    {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public IResource getActionDefinition(final DTFacesContext context,
-            final String viewId) throws ViewHandlerException
-            {
-        // TODO: this seems like a bit of a cop out...
-        return context.adaptContextObject();
-            }
-
-    @Override
-    public IPath getActionURL(final DTFacesContext context,
-            final IResource resource, final IPath requestPath)
-    throws ViewHandlerException
-    {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public IPath getRelativeActionPath(final DTFacesContext context,
-            final String relativeToViewId, final String uri)
-    throws ViewHandlerException
-    {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public IViewDefnAdapterFactory getViewMetadataAdapterFactory(
-            final DTFacesContext context) throws ViewHandlerException
-    {
-    	return internalGetViewMetadataAdapterFactory(context);
-    }
-    
-    /**
-     * @param context
-     * @return the DefaultViewDefnAdapterFactory
-     * 			
-     */
-    protected IViewDefnAdapterFactory getDefaultViewMetadataAdapterFactory(
-    		final DTFacesContext context) 
-    {
-    	return internalGetViewMetadataAdapterFactory(context);
-    }
-
-    private IViewDefnAdapterFactory internalGetViewMetadataAdapterFactory (final DTFacesContext context) {
-    	final IResource res = context.adaptContextObject();
-
-        if (res instanceof IFile)
-        {
-            return new DefaultViewDefnAdapterFactory(this);
-        }
-
-        return null;
-    }
-    
-    @Override
-    protected VersionStamp createVersionStamp(
-            final DTFacesContext facesContext, final String viewId)
-    {
-        return new TimeBasedVersionStamp();
-    }
-
-    static class DefaultViewDefnAdapterFactory extends
-    AbstractViewDefnAdapterFactory
-    {
-        private final DefaultDTViewHandler _myViewHandler;
-
-        DefaultViewDefnAdapterFactory(final DefaultDTViewHandler viewHandler)
-        {
-            _myViewHandler = viewHandler;
-        }
-
-        @Override
-        public IViewDefnAdapter<Node, IDocument> createAdapter(
-                final DTFacesContext context, final String viewId)
-                {
-            try
-            {
-                final IResource res = _myViewHandler.getActionDefinition(
-                        context, viewId);
-
-                if (res instanceof IFile)
-                {
-                    final IFile srcFile = (IFile) res;
-                    final ITagRegistry registry = findTagRegistry(srcFile);
-                    if (JSPUtil.isJSPContentType(srcFile) && registry != null)
-                    {
-                        // if we have a jsp file, then return the default
-                        // adapter
-                        return new JSPViewDefnAdapter(registry);
-                    }
-                }
-            }
-            catch (final ViewHandlerException vhe)
-            {
-                JSFCorePlugin.log(vhe, "While acquiring view adapter"); //$NON-NLS-1$
-            }
-
-            // not found or failed
-            return null;
-                }
-    }
-
-    @Override
-    protected DTUIViewRoot internalCreateView(
-            final DTFacesContext facesContext, final String viewId)
-    {
-        IViewDefnAdapterFactory factory;
-        try
-        {
-            factory = getViewMetadataAdapterFactory(facesContext);
-            if (factory != null)
-            {
-                final IViewDefnAdapter<?, ?> adapter = factory.createAdapter(
-                        facesContext, viewId);
-                if (adapter instanceof XMLViewDefnAdapter)
-                {
-                    final IResource res = facesContext.adaptContextObject();
-                    final DTUIViewRoot root = newView(facesContext, viewId);
-                    final XMLComponentTreeConstructionStrategy constructionStrategy = createTreeConstructionStrategy(
-                            (XMLViewDefnAdapter) adapter, res.getProject());
-
-                    constructionStrategy
-                    .createComponentTree(facesContext, root);
-                    return root;
-                }
-                JSFCorePlugin
-                .log(
-                        IStatus.WARNING,
-                        String
-                        .format(
-                                "Could not get view adapter to construct design time view root for %s", //$NON-NLS-1$
-                                viewId));
-            }
-            else
-            {
-                JSFCorePlugin
-                .log(
-                        IStatus.WARNING,
-                        String
-                        .format(
-                                "Could not get view adapter factory toconstruct design time view root for %s", //$NON-NLS-1$
-                                viewId));
-            }
-        }
-        catch (final ViewHandlerException e)
-        {
-            JSFCorePlugin.log(e, "While acquiring view defn adapter factory"); //$NON-NLS-1$
-            // fall-through
-        }
-
-        return new NullViewRoot();
-    }
-
-    /**
-     * By default, returns DefaultDTUIViewRoot.
-     * 
-     * @param facesContext
-     * @param viewId
-     * @return a new instance of a view. Override to change the implementation
-     *         or configuration of DTUIViewRoot that is used by
-     *         internalCreateView.
-     */
-    protected DTUIViewRoot newView(final DTFacesContext facesContext,
-            final String viewId)
-    {
-        return new DefaultDTUIViewRoot(facesContext);
-    }
-
-    @Override
-    protected void registerView(final DTUIViewRoot viewRoot,
-            final DTFacesContext facesContext, final String viewId)
-    {
-        final IResource res = facesContext.adaptContextObject();
-        _lifecycleManager.addViewInfo(viewId, res);
-    }
-
-    /**
-     * Sub-classes may override to provide a different strategy.
-     * 
-     * @param adapter
-     * @param project
-     * @return the construction strategy used to create this view's component
-     *         tree
-     */
-    protected XMLComponentTreeConstructionStrategy createTreeConstructionStrategy(
-            final XMLViewDefnAdapter adapter, final IProject project)
-    {
-        return new XMLComponentTreeConstructionStrategy(adapter, project);
-    }
-
-    @Override
-    public boolean supportsViewDefinition(final IFile file)
-    {
-        // currently only JSP content type is supported
-        return (JSPUtil.isJSPContentType(file));
-    }
-
-    @Override
-    protected StalenessAdvisor createStalenessAdvisor(
-            final DTUIViewRoot viewRoot, final DTFacesContext facesContext,
-            final String viewId)
-    {
-        final IResource res = facesContext.adaptContextObject();
-        // if the view root is null or the res is null fall through
-        // and use the null staleness advisor
-        if (!(viewRoot instanceof NullViewRoot) && res != null)
-        {
-            return new ResourceModStampStalenessAdvisor(viewRoot, res, viewId);
-        }
-        return new NullStalenessAdvisor();
-    }
-
-    /**
-     * Measures the staleness of a view by comparing the modification stamp on
-     * the resource at construction with the current value when isStale is
-     * called.
-     * 
-     * @author cbateman
-     * 
-     */
-    protected final class ResourceModStampStalenessAdvisor extends
-    StalenessAdvisor implements Serializable
-    {
-        /**
-         * version id
-         */
-        private static final long                                 serialVersionUID = -4982206388722638735L;
-        private final long                                        _modificationStamp;
-
-        private transient final IResource                         _res;
-        private transient final AtomicBoolean                     _forcedStale;
-        private transient final StalenessListener                 _myListener;
-
-        /**
-         * @param viewRoot
-         * @param file
-         * @param viewId 
-         */
-        public ResourceModStampStalenessAdvisor(final DTUIViewRoot viewRoot,
-                final IResource file, final String viewId)
-        {
-            _res = file;
-            _modificationStamp = file.getModificationStamp();
-            _forcedStale = new AtomicBoolean(false);
-            _myListener = new StalenessListener()
-            {
-                @Override
-                protected void stalenessChanged(final StalenessEvent event)
-                {
-                    if (event.getChangeType() == ChangeType.PROJECT_CLEANED)
-                    {
-                        if (_forcedStale.compareAndSet(false, true))
-                        {
-                            _lifecycleManager.removeListener(_res, _myListener);
-                        }
-                    }
-                }
-            };
-            _lifecycleManager.addViewInfo(viewId, _res);
-            _lifecycleManager.addListener(_res, _myListener);
-        }
-
-        @Override
-        public boolean isStale()
-        {
-            if (!_forcedStale.get())
-            {
-                final long curStamp = _res.getModificationStamp();
-                return curStamp != _modificationStamp;
-            }
-            // else forced stale
-            return true;
-        }
-
-        @Override
-        public void addListener(final StalenessListener listener)
-        {
-            _lifecycleManager.addListener(_res, listener);
-        }
-
-        @Override
-        public void removeListener(final StalenessListener listener)
-        {
-            _lifecycleManager.removeListener(_res, listener);
-        }
-
-        @Override
-        public boolean isAccessible()
-        {
-            return _res.isAccessible();
-        }
-    }
-
-    @Override
-    public final void setLifecycleListener(final ImmutableLifecycleListener listener)
-    {
-        _lifecycleManager.update(listener);
-    }
-
-    @Override
-    protected final void doDispose()
-    {
-        _lifecycleManager.dispose();
-    }
-
-    private class MyLifecycleManager implements IResourceLifecycleListener
-    {
-        private ImmutableLifecycleListener     _listener;
-        private final Map<IResource, ViewInfo> _stalenessListeners;
-        private final IResourceChangeListener  _buildListener;
-
-        public MyLifecycleManager()
-        {
-            _stalenessListeners = new HashMap<IResource, ViewInfo>();
-            _buildListener = new IResourceChangeListener()
-            {
-                // on a clean build request, fire staleness for all project-related
-                // resources.
-                public void resourceChanged(final IResourceChangeEvent event)
-                {
-                    if (event.getType() == IResourceChangeEvent.PRE_BUILD)
-                    {
-                        if (event.getBuildKind() == IncrementalProjectBuilder.CLEAN_BUILD)
-                        {
-                            if (event.getSource() instanceof IProject)
-                            {
-                                cleanProject((IProject) event.getSource());
-                            }
-                            else if (event.getSource() instanceof IWorkspace)
-                            {
-                                cleanAll();
-                            }
-                        }
-                    }
-                }
-            };
-            ResourcesPlugin.getWorkspace().addResourceChangeListener(_buildListener,
-                    IResourceChangeEvent.PRE_BUILD);
-        }
-
-        public void addListener(final IResource res, final StalenessListener listener)
-        {
-            final ViewInfo viewInfo = getViewInfo(res);
-            viewInfo.getListeners().addIfAbsent(listener);
-        }
-
-        public void removeListener(final IResource res, final StalenessListener listener)
-        {
-            final ViewInfo viewInfo = getViewInfo(res);
-            viewInfo.getListeners().remove(listener);
-        }
-
-        public EventResult acceptEvent(final ResourceLifecycleEvent event)
-        {
-            switch (event.getEventType())
-            {
-                case RESOURCE_CHANGED:
-                {
-                    return handleContentChangeEvent(event);
-                }
-
-                case RESOURCE_INACCESSIBLE:
-                {
-                    return handleInaccessibleChangeEvent(event);
-                }
-
-                default:
-                    // do nothing with other types
-            }
-
-            return EventResult.getDefaultEventResult();
-        }
-
-        private EventResult handleContentChangeEvent(
-                final ResourceLifecycleEvent event)
-        {
-            if (event.getReasonType() != ReasonType.RESOURCE_CHANGED_CONTENTS)
-            {
-                return EventResult.getDefaultEventResult();
-            }
-
-            final IResource res = event.getAffectedResource();
-            final List<StalenessListener> stalenessListeners = getListeners(res);
-
-            if (stalenessListeners != null)
-            {
-                for (final StalenessListener listener : stalenessListeners)
-                {
-                    listener.stalenessChanged(new StalenessEvent(
-                            ChangeType.VIEW_DEFN_CHANGED));
-                }
-            }
-            return EventResult.getDefaultEventResult();
-        }
-
-        private EventResult handleInaccessibleChangeEvent(
-                final ResourceLifecycleEvent event)
-        {
-            final IResource res = event.getAffectedResource();
-            final ReasonType reasonType = event.getReasonType();
-            ChangeType changeType = null;
-            if (reasonType == ReasonType.RESOURCE_PROJECT_CLOSED)
-            {
-                changeType = ChangeType.VIEW_DEFN_PROJECT_CLOSED;
-            }
-            else if (reasonType == ReasonType.RESOURCE_DELETED)
-            {
-                changeType = ChangeType.VIEW_DEFN_DELETED;
-            }
-            else
-            {
-                return EventResult.getDefaultEventResult();
-            }
-
-            final List<StalenessListener>  listeners = getListeners(res);
-
-            if (listeners != null)
-            {
-                for (final StalenessListener listener : listeners)
-                {
-                    listener.stalenessChanged(new StalenessEvent(
-                            changeType));
-                }
-            }
-            return EventResult.getDefaultEventResult();
-        }
-
-        private void cleanAll()
-        {
-            final StalenessEvent event = new StalenessEvent(ChangeType.PROJECT_CLEANED);
-            for (final Map.Entry<IResource, ViewInfo> entry : _stalenessListeners.entrySet())
-            {
-                final ViewInfo info = entry.getValue();
-                for (final StalenessListener listener : info.getListeners())
-                {
-                    listener.stalenessChanged(event);
-                }
-            }
-        }
-
-        private void cleanProject(final IProject project)
-        {
-            final StalenessEvent event = new StalenessEvent(ChangeType.PROJECT_CLEANED);
-            for (final Map.Entry<IResource, ViewInfo> entry : _stalenessListeners.entrySet())
-            {
-                final IResource res = entry.getKey();
-                
-                if (res.getProject().equals(project))
-                {
-                    final ViewInfo info = entry.getValue();
-                    for (final StalenessListener listener : info.getListeners())
-                    {
-                        listener.stalenessChanged(event);
-                    }
-                }
-            }
-        }
-
-        private List<StalenessListener> getListeners(final IResource res)
-        {
-            List<StalenessListener> stalenessListeners = null;
-
-            synchronized (this)
-            {
-                final ViewInfo viewInfo = _stalenessListeners.get(res);
-
-                if (viewInfo != null)
-                {
-                    stalenessListeners = viewInfo.getListeners();
-                }
-            }
-            return stalenessListeners;
-        }
-
-        public synchronized void addViewInfo(final String viewId,
-                final IResource res)
-        {
-            ViewInfo viewInfo = _stalenessListeners.get(res);
-
-            if (viewInfo == null)
-            {
-                viewInfo = new ViewInfo(viewId);
-                _stalenessListeners.put(res, viewInfo);
-            }
-        }
-
-        public synchronized ViewInfo getViewInfo(final IResource res)
-        {
-            return _stalenessListeners.get(res);
-        }
-
-        public synchronized void dispose()
-        {
-            // updating with null effectively deregisters any existing listener
-            // and doesn't register a new one.
-            ResourcesPlugin.getWorkspace().removeResourceChangeListener(_buildListener);
-            update(null);
-        }
-
-        public synchronized void update(
-                final ImmutableLifecycleListener listener)
-        {
-            if (listener == _listener)
-            {
-                return;
-            }
-
-            final ImmutableLifecycleListener oldListener = _listener;
-
-            if (oldListener != null)
-            {
-                oldListener.removeListener(this);
-            }
-
-            _listener = listener;
-
-            if (_listener != null)
-            {
-                _listener.addListener(this);
-            }
-        }
-    }
-
-    private static class ViewInfo
-    {
-        private final CopyOnWriteArrayList<StalenessListener> _listeners;
-//        private final String                  _viewId;
-
-        /**
-         * @param listeners
-         * @param res
-         */
-        private ViewInfo(final String viewId)
-        {
-            super();
-            _listeners = new CopyOnWriteArrayList<StalenessListener>();
-//            _viewId = viewId;
-        }
-
-        protected final CopyOnWriteArrayList<StalenessListener> getListeners()
-        {
-            return _listeners;
-        }
-
-//        protected final String getViewId()
-//        {
-//            return _viewId;
-//        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/IDTViewHandler.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/IDTViewHandler.java
deleted file mode 100644
index 81e4be6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/IDTViewHandler.java
+++ /dev/null
@@ -1,255 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.designtime.internal.view;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.jst.jsf.common.internal.resource.ImmutableLifecycleListener;
-import org.eclipse.jst.jsf.designtime.context.DTFacesContext;
-
-/**
- * <p>
- * Defines the basic interface for all design time view handlers that parallel
- * custom runtime view handlers (extenders of ViewHandler).
- * </p>
- * 
- * @author cbateman
- * 
- */
-public interface IDTViewHandler
-{
-    /**
-     * <p>
-     * Creates and returns the view root. This method <i>may</i> optionally
-     * intialize the view root with any data that need only be done once per
-     * instance. Generally, this will include providing the root access to
-     * itself or its IViewDefnAdapterFactory so that it can refresh itself.
-     * </p>
-     * 
-     * @param facesContext
-     * @param viewId
-     * @return a designtime view root instance of viewId under the given faces
-     *         context
-     * @throws ViewHandlerException
-     */
-    DTUIViewRoot createView(DTFacesContext facesContext, String viewId)
-            throws ViewHandlerException;
-
-    /**
-     * Calculate the locale for the current view context. The return string must
-     * conform to the standard format proscribed by java.util.Locale.
-     * 
-     * @param context
-     * @return the locale string for the view definition referred to by context
-     * @throws ViewHandlerException
-     */
-    String calculateLocale(DTFacesContext context) throws ViewHandlerException;
-
-    /**
-     * Given that resource is the view definition source and requestPath is the
-     * current servlet uri for a request relative to the web content root, map
-     * it to the actual request uri that would be required at runtime to invoke
-     * the view definition in resource. DTFacesContext will contain an external
-     * context that may be used to derive servlet mapping configuration.
-     * 
-     * @param context
-     * @param resource
-     * @param requestPath
-     * @return the IPath representing the newly mapped request path
-     * @throws ViewHandlerException
-     */
-    IPath getActionURL(DTFacesContext context, IResource resource,
-            IPath requestPath) throws ViewHandlerException;
-
-    /**
-     * TODO: if we already have context, must we already know what the source
-     * is?
-     * 
-     * The IResource need not exist.
-     * 
-     * @param context
-     * @param viewId
-     * @return the resource containing the view definition for viewId.
-     * @throws ViewHandlerException
-     */
-    IResource getActionDefinition(DTFacesContext context, String viewId)
-            throws ViewHandlerException;
-
-    /**
-     * Given that a request is made for uri from within the view named by
-     * relativeToViewId at runtime, return the path to the resource containing
-     * that view definition. The path need not point to a resource that
-     * currently exists.
-     * 
-     * @param context
-     * @param relativeToViewId
-     * @param uri
-     * @return the path to the resource named by uri relative to the view named
-     *         by relativeToViewId
-     * @throws ViewHandlerException
-     */
-    IPath getRelativeActionPath(DTFacesContext context,
-            String relativeToViewId, String uri) throws ViewHandlerException;
-
-    /**
-     * Translate a workspace resource to the view id it will have at runtime.
-     * 
-     * @param context
-     * @param res
-     * @return the view id for res or null if there is no meaningful value
-     */
-    String getViewId(DTFacesContext context, IResource res);
-
-    /**
-     * @param context
-     * @return a view definition adapter
-     * @throws ViewHandlerException
-     */
-    IViewDefnAdapterFactory getViewMetadataAdapterFactory(DTFacesContext context)
-            throws ViewHandlerException;
-
-    /**
-     * @param file
-     * @return true if the contents of the file is of a format that this view
-     *         handler supports. Generally, this is decided by a combination of
-     *         content type and, in the case of XML formats, schema.
-     */
-    boolean supportsViewDefinition(final IFile file);
-
-    /**
-     * Releases the handler's in-memory image.
-     */
-    void dispose();
-
-    /**
-     * Called by design time app manager to set a global resource listener
-     * for the view handler to use.  View handlers should generally use this
-     * listener to reduce the overhead of extra resouce change listeners.
-     * 
-     * @param listener
-     */
-    void setLifecycleListener(final ImmutableLifecycleListener listener);
-
-    /**
-     * General exception class for problems that a custom view handler wants to
-     * propagate to the framework in a well-defined way.
-     * 
-     */
-    public static final class ViewHandlerException extends Exception
-    {
-        private final Cause _causeCode;
-
-        /**
-         * Enumerates the known failure causes
-         * 
-         */
-        public enum Cause
-        {
-            /**
-             * thrown from getELExpression when the context passed does not
-             * refer to a parsable EL expression in the view definition
-             */
-            EL_NOT_FOUND,
-            /**
-             * thrown from getELExpression when an exception occurs during EL
-             * parsing. The ViewHandlerException should wrap the causing
-             * exception in this cause
-             */
-            EL_EXCEPTION_CAUGHT_WHILE_PARSING,
-            /**
-             * an undefined exception cause indicating something not foreseen by
-             * the framework.
-             */
-            UNDEFINED,
-
-            /**
-             * indicates that a bad or null version stamp was encountered. The
-             * wrapped exception may provide tracing information to the cause.
-             */
-            BAD_VERSION_STAMP,
-
-            /**
-             * indicates that a bad or null staleness advisor was encountered.
-             * The wrapped exception may provide tracing information to the
-             * cause.
-             */
-            BAD_STALENESS_ADVISOR, 
-            
-            /**
-             * a general failure by the view creation to create a new view root.
-             */
-            UNABLE_TO_CREATE_VIEW
-        }
-
-        /**
-         * 
-         */
-        private static final long serialVersionUID = 2109525340402345111L;
-
-        /**
-         * Construct an exception with an undefined cause
-         */
-        public ViewHandlerException()
-        {
-            this(Cause.UNDEFINED);
-        }
-
-        /**
-         * @param cause
-         */
-        public ViewHandlerException(final Cause cause)
-        {
-            super();
-            _causeCode = cause;
-        }
-
-        /**
-         * @param message
-         * @param caught
-         * @param cause
-         */
-        public ViewHandlerException(final String message,
-                final Throwable caught, final Cause cause)
-        {
-            super(message, caught);
-            _causeCode = cause;
-        }
-
-        /**
-         * @param message
-         * @param cause
-         */
-        public ViewHandlerException(final String message, final Cause cause)
-        {
-            super(message);
-            _causeCode = cause;
-        }
-
-        /**
-         * @param caught
-         * @param cause
-         */
-        public ViewHandlerException(final Throwable caught, final Cause cause)
-        {
-            super(caught);
-            _causeCode = cause;
-        }
-
-        /**
-         * @return the cause code
-         */
-        public final Cause getCauseCode()
-        {
-            return _causeCode;
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/IViewDefnAdapter.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/IViewDefnAdapter.java
deleted file mode 100644
index 676643a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/IViewDefnAdapter.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.designtime.internal.view;
-
-import java.util.List;
-
-import org.eclipse.jst.jsf.common.runtime.internal.model.ViewObject;
-import org.eclipse.jst.jsf.common.runtime.internal.model.component.ComponentInfo;
-import org.eclipse.jst.jsf.common.runtime.internal.model.datatypes.ELExpression;
-import org.eclipse.jst.jsf.context.IModelContext;
-import org.eclipse.jst.jsf.designtime.context.DTFacesContext;
-import org.eclipse.jst.jsf.designtime.internal.view.IDTViewHandler.ViewHandlerException;
-
-/**
- * <p>
- * A generic adapter used to adapt arbitrary view definitions to framework
- * objects.
- * </p>
- * 
- * @author cbateman
- * @param <VIEW_DEFN_BASE_TYPE>
- *            the base type of all view definition objects
- * @param <VIEW_CONTAINER_TYPE>
- *            the type of the container that is expeccted to hold the view defn
- * 
- */
-public interface IViewDefnAdapter<VIEW_DEFN_BASE_TYPE, VIEW_CONTAINER_TYPE>
-{
-    /**
-     * @param viewDefnObject
-     * @param constructionData
-     * @param viewContainer
-     * @return a view object corresponding to the viewDefnBaseType object or
-     *         null if none.
-     */
-    ViewObject mapToViewObject(
-            VIEW_DEFN_BASE_TYPE viewDefnObject,
-            ViewObjectConstructionStrategy<? extends VIEW_DEFN_BASE_TYPE> constructionData,
-                    VIEW_CONTAINER_TYPE viewContainer);
-
-    /**
-     * This method may be expensive.
-     * 
-     * @param viewDefnObject
-     * @param root
-     * @return the view object corresponding to viewDefnObject in the
-     * component sub-tree rooted at root.
-     * <b>May return null if isn't found or can't be found</b>
-     */
-    ViewObject findViewObject(VIEW_DEFN_BASE_TYPE viewDefnObject, ComponentInfo root);
-
-    /**
-     * @param viewObject
-     * @param root
-     * @return the view definition object that viewObject was derived from
-     * using root as the component sub-tree root to search in.
-     * <b>May return null if isn't found or can't be found</b>
-     */
-    VIEW_DEFN_BASE_TYPE findViewDefn(ViewObject viewObject, ComponentInfo root);
-
-    /**
-     * @param viewDefnObject
-     * @return the id for the viewDefnObject or null if none. Generally, null
-     *         should indicate that no id is present but could be. This is
-     *         distinct from the case where viewDefnObject can never define an
-     *         id, in which case IllegalArgumentException should be thrown.
-     * 
-     * @throws IllegalArgumentException
-     *             may be thrown to indicate that viewDefnObject does not
-     *             correspond to a ViewObject type that has an id.
-     * 
-     */
-    String getId(VIEW_DEFN_BASE_TYPE viewDefnObject)
-    throws IllegalArgumentException;
-
-    /**
-     * Normally this is a workspace resource (IFile) or higher level document
-     * type like an IDocument.
-     * 
-     * @param context
-     * @param viewId
-     * @return the container resource for the viewId in context.
-     */
-    VIEW_CONTAINER_TYPE getContainer(DTFacesContext context, String viewId);
-
-    /**
-     * @param container
-     * @return the view roots for the definition in container or empty if none.
-     *         MUST NOT BE NULL.
-     */
-    List<VIEW_DEFN_BASE_TYPE> getViewDefnRoots(VIEW_CONTAINER_TYPE container);
-
-    /**
-     * <p>
-     * The view definition adapter must be able to extract all EL expressions
-     * from a view definition. Given a model context that points into the view
-     * definition it must return the EL expression in that context.
-     * </p>
-     * 
-     * <p>
-     * If the model context provided does not refer to a valid view definition
-     * for this handler, then ViewHandlerException(EL_NOT_FOUND) should be
-     * thrown. If an exception occurs while trying to extract the EL expression
-     * at context, then ViewHandlerException(caughtException,
-     * EL_EXCEPTION_CAUGHT_WHILE_PARSING) should be thrown.
-     * </p>
-     * 
-     * <p>
-     * Note that any reference to parsing here means extraction from the
-     * document and not building an AST for the expression itself.</p>
-     * 
-     * @param context
-     * @return the text (stripped of any escaping such as #{} in JSP) of the EL
-     *         expression referred to by context or null if there is no valid EL
-     *         expression at context.
-     * @throws ViewHandlerException
-     */
-    ELExpression getELExpression(IModelContext context) throws ViewHandlerException;
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/IViewDefnAdapterFactory.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/IViewDefnAdapterFactory.java
deleted file mode 100644
index b0aa0f0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/IViewDefnAdapterFactory.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.designtime.internal.view;
-
-import org.eclipse.jst.jsf.designtime.context.DTFacesContext;
-
-/**
- * <p>Interface for a factory that creates view definition adapters.</p>
- * 
- * @author cbateman
- *
- */
-public interface IViewDefnAdapterFactory 
-{
-    /**
-     * @param context
-     * @param viewId
-     * @return a view adapter for the viewid or null if this factory
-     * cannot produce an adapter for the underlying view definition.
-     */
-    IViewDefnAdapter<?,?> createAdapter(DTFacesContext context, String viewId); 
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/IViewRootHandle.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/IViewRootHandle.java
deleted file mode 100644
index c8d3763..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/IViewRootHandle.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.designtime.internal.view;
-
-import org.eclipse.jst.jsf.designtime.internal.view.DTUIViewRoot.StalenessListener;
-
-/**
- * A handle to a view root.
- * 
- * @author cbateman
- * 
- */
-public interface IViewRootHandle
-{
-    /**
-     * <p>
-     * This returns the copy of the view root cached by the faces context. If
-     * updateViewRoot has never been called (or if it was called but never
-     * succeeded) it may return null.
-     * </p>
-     * 
-     * <p>
-     * This method should be cheap and avoid blocking
-     * </p>
-     * 
-     * return null if the value of the view root
-     * 
-     * @return the cached view root. May be null.
-     */
-    DTUIViewRoot getCachedViewRoot();
-
-    /**
-     * NOTE: this method may be long running. If you can tolerate a possibly
-     * stale value more quickly, use getCachedViewRoot(). NEVER run this method
-     * on the main UI thread.
-     * 
-     * A good strategy for invoking is as follows:
-     * 
-     * DTUIViewRoot viewRoot = handle.getCachedViewRoot();
-     * 
-     * <pre>
-     * if (viewRoot == null || viewRoot.isStale())
-     * {
-     *      spawnTread that calls updateViewRoot
-     * }
-     * 
-     * </pre>
-     * 
-     * @return the view root for the associated context object or null if there
-     *         is no context object.
-     */
-    DTUIViewRoot updateViewRoot();
-
-    /**
-     * Adds a staleness listener to the currently cached view root.  If there
-     * currently is no cached view root, then the listener will be stored
-     * until a updateViewRoot is successfully called.
-     * @param listener
-     */
-    void addListener(final StalenessListener listener);
-    
-    /**
-     * Removes a staleness listener from the currently cached view root.  If
-     * there  is no currently cached root, then the listener will be stored
-     * until one is found.  The call will then attempt to remove it.
-     * @param listener
-     */
-    void removeListener(final StalenessListener listener);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/JSPViewDefnAdapter.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/JSPViewDefnAdapter.java
deleted file mode 100644
index da8825c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/JSPViewDefnAdapter.java
+++ /dev/null
@@ -1,229 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.designtime.internal.view;
-
-import java.io.IOException;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jst.jsf.context.IModelContext;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IStructuredDocumentContextResolverFactory;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.internal.ITextRegionContextResolver;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContextFactory;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.designtime.context.DTFacesContext;
-import org.eclipse.jst.jsf.designtime.internal.view.IDTViewHandler.ViewHandlerException;
-import org.eclipse.jst.jsf.designtime.internal.view.IDTViewHandler.ViewHandlerException.Cause;
-import org.eclipse.jst.jsf.designtime.internal.view.model.ITagRegistry;
-import org.eclipse.jst.jsp.core.internal.contentmodel.TaglibController;
-import org.eclipse.jst.jsp.core.internal.contentmodel.tld.TLDCMDocumentManager;
-import org.eclipse.jst.jsp.core.internal.contentmodel.tld.TaglibTracker;
-import org.eclipse.jst.jsp.core.internal.contentmodel.tld.provisional.TLDDocument;
-import org.eclipse.jst.jsp.core.internal.domdocument.DOMModelForJSP;
-import org.eclipse.jst.jsp.core.internal.regions.DOMJSPRegionContexts;
-import org.eclipse.wst.sse.core.StructuredModelManager;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMDocument;
-import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext;
-import org.w3c.dom.Element;
-
-/**
- * <p>
- * A view definition adapter that adapts JSF view definitions based on the
- * standard JSP view description language.
- * </p>
- * 
- * @author cbateman
- * 
- */
-public class JSPViewDefnAdapter extends TaglibBasedViewDefnAdapter
-{
-    JSPViewDefnAdapter(final ITagRegistry tldTagRegistry)
-    {
-        super(tldTagRegistry);
-    }
-
-    @Override
-    public IDocument getContainer(final DTFacesContext context,
-            final String viewId)
-    {
-        final IResource viewDefn = context.adaptContextObject();
-
-        if (viewDefn instanceof IFile)
-        {
-            final IFile viewDefnFile = (IFile) viewDefn;
-            IStructuredModel model = null;
-            try
-            {
-                model =
-                    StructuredModelManager.getModelManager()
-                    .getModelForRead(viewDefnFile);
-
-                if (model instanceof DOMModelForJSP)
-                {
-                    return model.getStructuredDocument();
-                }
-            }
-            catch (final IOException e)
-            {
-                JSFCorePlugin.log(e, "Acquiring model for view root"); //$NON-NLS-1$
-            }
-            catch (final CoreException e)
-            {
-                JSFCorePlugin.log(e, "Acquiring model for view root"); //$NON-NLS-1$
-            }
-            finally
-            {
-                if (model != null)
-                {
-                    model.releaseFromRead();
-                }
-            }
-        }
-        return null;
-    }
-
-    @Override
-    public final String getNamespace(final Element element,
-            final IDocument doc)
-    {
-        final String prefix = element.getPrefix();
-
-        // TODO: merge back with JSPUtil.findUri()
-        final TLDCMDocumentManager m =
-            TaglibController.getTLDCMDocumentManager(doc);
-
-        if (prefix == null || m == null)
-        {
-            return null;
-        }
-        final List<?> trackers = m.getTaglibTrackers();
-        for (final Object name : trackers)
-        {
-            final TaglibTracker tracker = (TaglibTracker) name;
-            if (prefix.equals(tracker.getPrefix()))
-            {
-                return tracker.getURI();
-            }
-        }
-        return null;
-    }
-
-
-    @Override
-    public DTELExpression getELExpression(final IModelContext genericContext)
-    throws ViewHandlerException
-    {
-        final IStructuredDocumentContext context =
-            (IStructuredDocumentContext) genericContext
-            .getAdapter(IStructuredDocumentContext.class);
-
-        if (context == null)
-        {
-            throw new ViewHandlerException(Cause.EL_NOT_FOUND);
-        }
-
-        ITextRegionContextResolver resolver =
-            IStructuredDocumentContextResolverFactory.INSTANCE
-            .getTextRegionResolver(context);
-
-        String elText = null;
-
-        if (resolver != null)
-        {
-            final String regionType = resolver.getRegionType();
-
-            if (regionType != null && resolver.matchesRelative(new String[]
-                                                                          { DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE }))
-            {
-                // if we are in the EL content, then get the current region
-                // text
-                if (DOMJSPRegionContexts.JSP_VBL_CONTENT.equals(regionType))
-                {
-                    elText = resolver.getRegionText();
-                }
-                // otherwise, we may be at the end of a content region but
-                // at
-                // the beginning of a closing brace so check to see if the
-                // previous
-                // region was a VBL_CONTENT
-                else if (regionType.equals(DOMJSPRegionContexts.JSP_VBL_CLOSE))
-                {
-                    final IStructuredDocumentContext previousContext =
-                        resolver.getPreviousContext();
-
-                    final ITextRegionContextResolver prevResolver =
-                        IStructuredDocumentContextResolverFactory.INSTANCE
-                        .getTextRegionResolver(previousContext);
-
-                    if (prevResolver != null)
-                    {
-                        if (DOMJSPRegionContexts.JSP_VBL_CONTENT
-                                .equals(prevResolver.getRegionType()))
-                        {
-                            resolver = prevResolver;
-                            elText = prevResolver.getRegionText();
-                        }
-                        else if (DOMJSPRegionContexts.JSP_VBL_OPEN
-                                .equals(prevResolver.getRegionType()))
-                        {
-                            elText = ""; //$NON-NLS-1$
-                        }
-                    }
-                }
-            }
-        }
-
-        if (elText != null)
-        {
-            final IStructuredDocumentContext elContext =
-                IStructuredDocumentContextFactory.INSTANCE.getContext(
-                        context.getStructuredDocument(), resolver
-                        .getStartOffset());
-            return new DTELExpression(elContext, elText);
-        }
-        return null;
-    }
-
-    @Override
-    public String getGeneratedIdPrefix()
-    {
-        return "_idJsp"; //$NON-NLS-1$
-    }
-
-    @Override
-    public String getPrefix(String namespace, IDocument doc)
-    {
-        TLDCMDocumentManager m = TaglibController.getTLDCMDocumentManager(doc);
-        if (m == null)
-            return null;
-        List trackers = m.getTaglibTrackers();
-        for (Iterator iter = trackers.iterator(); iter.hasNext();) {
-            TaglibTracker tracker = (TaglibTracker) iter.next();
-            if (namespace.equals(tracker.getURI())) {
-                return tracker.getPrefix();
-            }
-            
-            CMDocument cmdoc = tracker.getDocument();
-            if (cmdoc instanceof TLDDocument
-                    && namespace.equals(((TLDDocument) cmdoc).getUri())) {
-                return tracker.getPrefix();
-            }
-        }
-        return null;
-
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/TaglibBasedViewDefnAdapter.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/TaglibBasedViewDefnAdapter.java
deleted file mode 100644
index f24c405..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/TaglibBasedViewDefnAdapter.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.designtime.internal.view;
-
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.ITagElement;
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.Namespace;
-import org.eclipse.jst.jsf.designtime.internal.view.model.ITagRegistry;
-import org.w3c.dom.Element;
-
-/**
- * A view defintion adapter for XML-based view definition formats that use 
- * a well defined tag library system, with associated ITagRegistry, to define
- * tag handlers.  Most common view handlers (JSP, Facelets) should use this.
- * 
- * @author cbateman
- *
- */
-public abstract class TaglibBasedViewDefnAdapter extends XMLViewDefnAdapter
-{
-    private final ITagRegistry        _tagRegistry;
-    
-    /**
-     * @param tagRegistry
-     */
-    protected TaglibBasedViewDefnAdapter(final ITagRegistry tagRegistry)
-    {
-        _tagRegistry = tagRegistry;
-    }
-    
-    /**
-     * @param node
-     * @param document
-     * @return the tag element for node or null if none.
-     */
-    @Override
-    protected ITagElement findTagElement(final Element node,
-            final IDocument document)
-    {
-        final String uri = getNamespace(node, document);
-        final String tagName = node.getLocalName();
-
-        if (uri != null)
-        {
-            final Namespace lib = getTagRegistry().getTagLibrary(uri);
-
-            if (lib != null)
-            {
-                return findTagElement(tagName, lib);
-            }
-        }
-        return null;
-    }
-
-    /**
-     * @return the tag registry
-     */
-    protected final ITagRegistry getTagRegistry()
-    {
-        return _tagRegistry;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/ViewObjectConstructionStrategy.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/ViewObjectConstructionStrategy.java
deleted file mode 100644
index ad3a7a2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/ViewObjectConstructionStrategy.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.designtime.internal.view;
-
-import org.eclipse.jst.jsf.common.runtime.internal.model.ViewObject;
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.ITagElement;
-
-/**
- * A strategy for constructing a new view object from a tag element
- * @author cbateman
- * @param <VIEW_DEFN_BASE_TYPE> 
- *
- */
-public abstract class ViewObjectConstructionStrategy<VIEW_DEFN_BASE_TYPE>
-{
-    /**
-     * For a tag element return the corresponding view object or null if
-     * there is no such object.  XMLViewObjectMappingService must be updated
-     * if not null with any attribute->property mappings.
-     * 
-     * @param viewBase the source object in the source
-     * @param tagElement
-     * @return a new view object or null if we can't do so
-     */
-    public abstract ViewObject createViewObject(VIEW_DEFN_BASE_TYPE viewBase, 
-            ITagElement tagElement); 
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/XMLComponentTreeConstructionStrategy.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/XMLComponentTreeConstructionStrategy.java
deleted file mode 100644
index 49737f5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/XMLComponentTreeConstructionStrategy.java
+++ /dev/null
@@ -1,193 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.designtime.internal.view;
-
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jst.jsf.common.runtime.internal.model.ViewObject;
-import org.eclipse.jst.jsf.common.runtime.internal.model.component.ComponentFactory;
-import org.eclipse.jst.jsf.common.runtime.internal.model.component.ComponentInfo;
-import org.eclipse.jst.jsf.designtime.context.DTFacesContext;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-/**
- * A component tree construction strategy based on XML view definition
- * 
- * @author cbateman
- * 
- */
-public class XMLComponentTreeConstructionStrategy extends
-        ComponentTreeConstructionStrategy<Node, IDocument>
-{
-    private final XMLViewDefnAdapter _adapter;
-    // private final XMLViewObjectConstructionStrategy
-    // _objectConstructionStrategy;
-    private final IProject           _project;
-
-    /**
-     * @param adapter
-     * @param project
-     */
-    public XMLComponentTreeConstructionStrategy(
-            final XMLViewDefnAdapter adapter, final IProject project)
-    {
-        _adapter = adapter;
-        _project = project;
-    }
-
-    @Override
-    public ComponentInfo createComponentTree(final DTFacesContext context,
-            final DTUIViewRoot viewRoot)
-    {
-        final IDocument container = _adapter.getContainer(context, viewRoot
-                .getViewId());
-        final List<Node> roots = _adapter.getViewDefnRoots(container);
-
-        if (roots.size() > 0)
-        {
-            final IAdaptable adaptable = viewRoot.getServices();
-
-            XMLViewObjectMappingService tagMappingService = null;
-            if (adaptable != null)
-            {
-                tagMappingService = (XMLViewObjectMappingService) adaptable
-                        .getAdapter(XMLViewObjectMappingService.class);
-            }
-            final XMLViewObjectConstructionStrategy objectConstructionStrategy = 
-                new XMLViewObjectConstructionStrategy(
-                    _adapter, new ComponentConstructionData(0, null, _project,
-                            container), tagMappingService);
-
-            objectConstructionStrategy.getConstructionData().setIdCounter(0);
-            // can only handle a single root for XML; should be the DOM root
-            return buildComponentTree(roots.get(0), viewRoot, container,
-                    objectConstructionStrategy);
-        }
-
-        return viewRoot;
-    }
-
-    private ComponentInfo buildComponentTree(final Node root,
-            final DTUIViewRoot viewRoot, final IDocument document,
-            final XMLViewObjectConstructionStrategy objectConstructionStrategy)
-    {
-        final ComponentInfo dummyRoot = ComponentFactory.createComponentInfo(
-                null, null, null, true);
-        // populate the dummy root
-        recurseDOMModel(root, dummyRoot, document, objectConstructionStrategy);
-
-        // try to extract the view defined root from the dummyRoot and update
-        // 'root' with its children.
-        populateViewRoot(viewRoot, dummyRoot.getChildren());
-        return viewRoot;
-    }
-
-    /**
-     * Tries to find the view defined view root in children and use it populate
-     * viewRoot. Children may sub-class to a different algorithm or, in some
-     * cases create an implicit (i.e. Facelets does this) view root if one is
-     * not explicitly created by the view definition.
-     * 
-     * Regardless of the strategy, the following post-conditions must be true
-     * 
-     * To the extend that children represent the top-level objects in the view
-     * under the presumed root, viewRoot must be populated with them either
-     * directly if the creation of a view root is implicit (i.e. Facelets) or
-     * through a valid view root declaration found in the view definition (i.e.
-     * f:view in JSP) found the children list.
-     * 
-     * The default behaviour assumes the JSP case.
-     * 
-     * TODO: add validation cases for missing view roots in JSP.
-     * 
-     * @param viewRoot
-     * @param children
-     */
-    protected void populateViewRoot(final DTUIViewRoot viewRoot,
-            final List children)
-    {
-        ComponentInfo foundRoot = null;
-        // TODO: additional cases:
-        // 1) Valid case: view is a fragment and has one or more non-view root
-        // children
-        // 2) Invalid case: not a fragment and has no view root
-        // 3) Invalid case: any definition and has more than one view root
-        // 4) Invalid case: any definition and has component siblings to the
-        // view root
-        FIND_VIEWROOT: for (final Iterator it = children.iterator(); it
-                .hasNext();)
-        {
-            final ComponentInfo topLevelChild = (ComponentInfo) it.next();
-
-            if ("javax.faces.ViewRoot".equals(topLevelChild //$NON-NLS-1$
-                    .getComponentTypeInfo().getComponentType()))
-            {
-                foundRoot = topLevelChild;
-                break FIND_VIEWROOT;
-            }
-        }
-
-        if (foundRoot != null)
-        {
-            for (final Iterator it = foundRoot.getChildren().iterator(); it
-                    .hasNext();)
-            {
-                final ComponentInfo child = (ComponentInfo) it.next();
-                final String facetName = foundRoot.getFacetName(child);
-
-                // if not a facet, add as a normal child
-                if (facetName == null)
-                {
-                    viewRoot.addChild(child);
-                }
-                // if it is a facet, add as a facet
-                else
-                {
-                    viewRoot.addFacet(facetName, child);
-                }
-            }
-        }
-    }
-
-    private void recurseDOMModel(final Node node, final ComponentInfo parent,
-            final IDocument document,
-            XMLViewObjectConstructionStrategy objectConstructionStrategy)
-    {
-        ViewObject mappedObject = null;
-
-        objectConstructionStrategy.getConstructionData().setParent(parent);
-
-        mappedObject = _adapter.mapToViewObject(node,
-                objectConstructionStrategy, document);
-
-        ComponentInfo newParent = parent;
-
-        if (mappedObject instanceof ComponentInfo)
-        {
-            parent.addChild((ComponentInfo) mappedObject);
-            newParent = (ComponentInfo) mappedObject;
-        }
-
-        final NodeList children = node.getChildNodes();
-        final int numChildren = children.getLength();
-
-        for (int i = 0; i < numChildren; i++)
-        {
-            recurseDOMModel(children.item(i), newParent, document,
-                    objectConstructionStrategy);
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/XMLViewDefnAdapter.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/XMLViewDefnAdapter.java
deleted file mode 100644
index c7e727b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/XMLViewDefnAdapter.java
+++ /dev/null
@@ -1,319 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.designtime.internal.view;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jst.jsf.common.runtime.internal.model.ViewObject;
-import org.eclipse.jst.jsf.common.runtime.internal.model.component.ComponentInfo;
-import org.eclipse.jst.jsf.common.runtime.internal.model.datatypes.ELExpression;
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.ITagElement;
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.Namespace;
-import org.eclipse.jst.jsf.context.IModelContext;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IDOMContextResolver;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IStructuredDocumentContextResolverFactory;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContextFactory;
-import org.eclipse.jst.jsf.designtime.context.DTFacesContext;
-import org.eclipse.jst.jsf.designtime.internal.view.IDTViewHandler.ViewHandlerException;
-import org.eclipse.jst.jsf.designtime.internal.view.XMLViewObjectMappingService.ElementData;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-import org.w3c.dom.Attr;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * A view definition adapter base class for view definition that use XML to
- * define the view.
- * 
- * @author cbateman
- * 
- */
-public abstract class XMLViewDefnAdapter extends
-        AbstractViewDefnAdapter<Node, IDocument>
-{
-    private static final String GENERATED_ID = "_generatedId"; //$NON-NLS-1$
-
-    @Override
-    public abstract IDocument getContainer(DTFacesContext context, String viewId);
-
-    @Override
-    public String getId(final Node viewDefnObject)
-            throws IllegalArgumentException
-    {
-        if (viewDefnObject instanceof Element)
-        {
-            return ((Element) viewDefnObject).getAttribute("id"); //$NON-NLS-1$
-        }
-        throw new IllegalArgumentException(
-                "Only Elements can define view object ids"); //$NON-NLS-1$
-    }
-
-    @Override
-    public ViewObject mapToViewObject(
-            final Node viewDefnObject,
-            final ViewObjectConstructionStrategy<? extends Node> constructionData,
-            final IDocument document)
-    {
-        switch (viewDefnObject.getNodeType())
-        {
-            case Node.ELEMENT_NODE:
-                return createFromElement(
-                        (Element) viewDefnObject,
-                        (ViewObjectConstructionStrategy<Element>) constructionData,
-                        document);
-        }
-
-        return null;
-    }
-
-    /**
-     * @param viewDefnObject
-     * @param viewContainer
-     * @return the tag element corresponding to viewDefnObject in the context of
-     *         viewContainer or null if not found. Node must be an Element in
-     *         order for this work.
-     */
-    public ITagElement mapToTagElement(final Node viewDefnObject,
-            final IDocument viewContainer)
-    {
-        if (viewDefnObject instanceof Element)
-        {
-            return findTagElement((Element) viewDefnObject, viewContainer);
-        }
-        return null;
-    }
-
-    @Override
-    public List<Node> getViewDefnRoots(final IDocument container)
-    {
-        final List<Node> roots = new ArrayList<Node>();
-
-        final IStructuredDocumentContext context = IStructuredDocumentContextFactory.INSTANCE
-                .getContext(container, -1);
-
-        if (context != null)
-        {
-            final IDOMContextResolver resolver = IStructuredDocumentContextResolverFactory.INSTANCE
-                    .getDOMContextResolver(context);
-
-            if (resolver != null)
-            {
-                final Document doc = resolver.getDOMDocument();
-
-                if (doc != null)
-                {
-                    roots.add(doc);
-                }
-            }
-        }
-
-        return roots;
-    }
-
-    @Override
-    public ViewObject findViewObject(final Node viewDefnObject,
-            final ComponentInfo root)
-    {
-        if (root instanceof DTUIViewRoot && viewDefnObject instanceof Element)
-        {
-            final IAdaptable services = ((DTUIViewRoot) root).getServices();
-            final Object serviceAdapter = services
-                    .getAdapter(XMLViewObjectMappingService.class);
-            if (serviceAdapter instanceof XMLViewObjectMappingService)
-            {
-                final IStructuredDocumentContext context = getContext(viewDefnObject);
-
-                if (context != null)
-                {
-                    final String uri = getNamespace((Element) viewDefnObject,
-                            context.getStructuredDocument());
-                    final ElementData elementData = XMLViewObjectMappingService
-                            .createElementData(uri, viewDefnObject
-                                    .getLocalName(), context,
-                                    Collections.EMPTY_MAP);
-                    return ((XMLViewObjectMappingService) serviceAdapter)
-                            .findViewObject(elementData);
-                }
-            }
-        }
-        return null;
-    }
-
-    private IStructuredDocumentContext getContext(final Node viewDefnObject)
-    {
-        if (viewDefnObject instanceof IDOMNode)
-        {
-            final IStructuredDocument sdoc = ((IDOMNode) viewDefnObject)
-                    .getStructuredDocument();
-            return IStructuredDocumentContextFactory.INSTANCE.getContext(sdoc,
-                    viewDefnObject);
-        }
-        return null;
-    }
-
-    @Override
-    public Node findViewDefn(final ViewObject viewObject,
-            final ComponentInfo root)
-    {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public abstract DTELExpression getELExpression(IModelContext context)
-            throws ViewHandlerException;
-
-    // TODO: need to extend to other objects
-    /**
-     * @param element
-     * @param constructionData
-     * @param document
-     * @return the component info for element
-     */
-    protected ViewObject createFromElement(final Element element,
-            final ViewObjectConstructionStrategy<Element> constructionData,
-            final IDocument document)
-    {
-        final ITagElement tagElement = findTagElement(element, document);
-        return constructionData.createViewObject(element, tagElement);
-    }
-
-    /**
-     * @param element
-     * @param doc
-     * @return the namespace uri for element in doc
-     */
-    public abstract String getNamespace(Element element, IDocument doc);
-
-    /**
-     * @param namespace
-     * @param doc
-     * @return the prefix in doc for namespace or null if none.
-     */
-    public abstract String getPrefix(final String namespace, IDocument doc);
-
-    /**
-     * @param node
-     * @param document
-     * @return the tag element for node in document or null if none
-     */
-    protected abstract ITagElement findTagElement(final Element node,
-            final IDocument document);
-
-    /**
-     * @param nodeName
-     * @param lib
-     * @return the tag element with local name nodeName in lib or null if none.
-     */
-    protected static ITagElement findTagElement(final String nodeName,
-            final Namespace lib)
-    {
-        return lib.getViewElement(nodeName);
-    }
-
-    /**
-     * @param namespaces
-     * @param uri
-     * @return the namespace object in namespaces with uri, 'uri', or null if
-     *         none.
-     */
-    protected static Namespace getTaglib(
-            final Collection<? extends Namespace> namespaces, final String uri)
-    {
-        for (final Namespace namespace : namespaces)
-        {
-            if (uri.equals(namespace.getNSUri()))
-            {
-                return namespace;
-            }
-        }
-        return null;
-    }
-
-    /**
-     * @return the prefix string to which a running count will be added to
-     *         produced the default generated id
-     */
-    public String getGeneratedIdPrefix()
-    {
-        return GENERATED_ID;
-    }
-
-    /**
-     * @param element
-     * @param componentAttrName
-     * @return the attribute on element matching the component attribute called
-     *         componentAttrName or null if not found (this may indicate either
-     *         no such attribute or that it simply not populated on element; no
-     *         guarantee is made as to which it is)
-     */
-    public Attr mapAttributeToComponent(final Element element,
-            final String componentAttrName)
-    {
-        // TODO: need to make meta-data type driven and validate bad conversion
-
-//        final boolean mapByBeanName = true; // TODO: getMetadata for mapping
-        // instead
-
-//        if (mapByBeanName)
-//        {
-            return element.getAttributeNode(componentAttrName);
-//        }
-
-//        return null;
-    }
-
-    /**
-     * A design time EL expression
-     * 
-     */
-    public static class DTELExpression extends ELExpression
-    {
-        private final IStructuredDocumentContext _documentContext;
-        private final String                     _originalText;
-
-        /**
-         * @param doc
-         * @param text
-         */
-        public DTELExpression(final IStructuredDocumentContext doc,
-                final String text)
-        {
-            _documentContext = doc;
-            _originalText = text;
-        }
-
-        @Override
-        public String getText()
-        {
-            return _originalText;
-        }
-
-        /**
-         * @return the document context. The document relative position of the
-         *         start of the EL expression is used
-         * 
-         */
-        public IStructuredDocumentContext getDocumentContext()
-        {
-            return _documentContext;
-        }
-
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/XMLViewObjectConstructionStrategy.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/XMLViewObjectConstructionStrategy.java
deleted file mode 100644
index fcff0ba..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/XMLViewObjectConstructionStrategy.java
+++ /dev/null
@@ -1,525 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.designtime.internal.view;
-
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.jdt.core.Signature;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jst.jsf.common.internal.types.TypeConstants;
-import org.eclipse.jst.jsf.common.runtime.internal.model.ViewObject;
-import org.eclipse.jst.jsf.common.runtime.internal.model.behavioural.ActionSourceInfo;
-import org.eclipse.jst.jsf.common.runtime.internal.model.behavioural.ActionSourceInfo2;
-import org.eclipse.jst.jsf.common.runtime.internal.model.behavioural.EditableValueHolderInfo;
-import org.eclipse.jst.jsf.common.runtime.internal.model.behavioural.INamingContainerInfo;
-import org.eclipse.jst.jsf.common.runtime.internal.model.behavioural.ValueHolderInfo;
-import org.eclipse.jst.jsf.common.runtime.internal.model.component.ComponentFactory;
-import org.eclipse.jst.jsf.common.runtime.internal.model.component.ComponentInfo;
-import org.eclipse.jst.jsf.common.runtime.internal.model.component.ComponentTypeInfo;
-import org.eclipse.jst.jsf.common.runtime.internal.model.decorator.ConverterDecorator;
-import org.eclipse.jst.jsf.common.runtime.internal.model.decorator.ConverterTypeInfo;
-import org.eclipse.jst.jsf.common.runtime.internal.model.decorator.ValidatorDecorator;
-import org.eclipse.jst.jsf.common.runtime.internal.model.decorator.ValidatorTypeInfo;
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.IComponentPropertyHandler;
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.IComponentTagElement;
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.IConverterTagElement;
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.ITagAttributeHandler;
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.ITagElement;
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.IValidatorTagElement;
-import org.eclipse.jst.jsf.common.util.JDTBeanProperty;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContextFactory;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.designtime.internal.view.XMLViewObjectMappingService.ElementData;
-import org.eclipse.jst.jsf.designtime.internal.view.mapping.ICustomViewMapper;
-import org.eclipse.jst.jsf.designtime.internal.view.mapping.ICustomViewMapper.PropertyMapping;
-import org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.CustomViewMapperExtensionLoader;
-import org.w3c.dom.Attr;
-import org.w3c.dom.Element;
-import org.w3c.dom.NamedNodeMap;
-
-/**
- * A strategy for constructing view objects.
- * 
- * @author cbateman
- * 
- */
-public class XMLViewObjectConstructionStrategy extends
-        ViewObjectConstructionStrategy<Element>
-{
-    private static final String               GENERATED_ID = "_generatedId"; //$NON-NLS-1$
-    private final ComponentConstructionData   _constructionData;
-    private final XMLViewDefnAdapter          _adapter;
-    private final XMLViewObjectMappingService _mappingService;
-
-    /**
-     * @param adapter
-     *            MUST NOT BE NULL
-     * @param constructionData
-     *            MUST NOT BE NULL
-     * @param mappingService
-     *            MAY BE NULL
-     */
-    public XMLViewObjectConstructionStrategy(final XMLViewDefnAdapter adapter,
-            final ComponentConstructionData constructionData,
-            final XMLViewObjectMappingService mappingService)
-    {
-        super();
-        if (adapter == null || constructionData == null)
-        {
-            throw new IllegalArgumentException(
-                    "adapter and constructionData must not be null"); //$NON-NLS-1$
-        }
-        _constructionData = constructionData;
-        _adapter = adapter;
-        _mappingService = mappingService;
-    }
-
-    @Override
-    public ViewObject createViewObject(final Element element,
-            final ITagElement tagElement)
-    {
-        try
-        {
-            if (tagElement instanceof IComponentTagElement)
-            {
-                String id = null;
-
-                // only generate ids for non-viewroot components. This will
-                // make the generated id's more faithful to runtime since the
-                // running count won't be incremented for view roots (as they
-                // won't at runtime).
-                final ComponentTypeInfo typeInfo = ((IComponentTagElement) tagElement)
-                        .getComponent();
-
-                if (!"javax.faces.ViewRoot".equals(typeInfo.getComponentType())) //$NON-NLS-1$
-                {
-                    id = calculateId(element, _constructionData);
-                }
-                return findBestComponent(tagElement.getUri(), element, id,
-                        (IComponentTagElement) tagElement);
-            }
-            else if (tagElement instanceof IConverterTagElement)
-            {
-                final ConverterTypeInfo typeInfo = ((IConverterTagElement) tagElement)
-                        .getConverter();
-                // TODO: validate when no parent
-                ComponentInfo parent = _constructionData.getParent();
-                parent = findFirstParent(
-                        ComponentFactory.INTERFACE_VALUEHOLDER, parent);
-                if (parent != null)
-                {
-                    parent.addDecorator(
-                            new ConverterDecorator(parent, typeInfo),
-                            ComponentFactory.CONVERTER);
-                }
-                // TODO: else validate problem
-            }
-            else if (tagElement instanceof IValidatorTagElement)
-            {
-                final ValidatorTypeInfo typeInfo = ((IValidatorTagElement) tagElement)
-                        .getValidator();
-                ComponentInfo parent = _constructionData.getParent();
-                parent = findFirstParent(
-                        ComponentFactory.INTERFACE_EDITABLEVALUEHOLDER, parent);
-                if (parent != null)
-                {
-                    parent.addDecorator(
-                            new ValidatorDecorator(parent, typeInfo),
-                            ComponentFactory.VALIDATOR);
-                }
-                // TODO :else validate problem
-            }
-        }
-        catch (final Exception e)
-        {
-            // log and ignore if an individual construction fails
-            JSFCorePlugin.log(e, "Error constructing view object"); //$NON-NLS-1$
-        }
-        return null;
-    }
-
-    private ComponentInfo findFirstParent(final String matchingType,
-            final ComponentInfo start)
-    {
-        ComponentInfo parent = start;
-
-        while (parent != null && parent.getComponentTypeInfo() != null
-                && !parent.getComponentTypeInfo().isInstanceOf(matchingType))
-        {
-            parent = parent.getParent();
-        }
-        return parent;
-    }
-
-    private ComponentInfo findBestComponent(final String uri,
-            final Element srcElement, final String id,
-            final IComponentTagElement tagElement)
-    {
-        ComponentInfo bestComponent = null;
-
-        final ComponentInfo parent = _constructionData.getParent();
-
-        final Map<String, Object> initMap = new HashMap<String, Object>();
-        final Map<String, String> attributeToPropertyMap = new HashMap<String, String>();
-        populateInitMap(uri, initMap, srcElement, tagElement,
-                attributeToPropertyMap);
-
-        if (initMap.get("id") == null) //$NON-NLS-1$
-        {
-            // id must be set
-            initMap.put("id", id); //$NON-NLS-1$
-        }
-
-        final ComponentTypeInfo typeInfo = tagElement.getComponent();
-
-        // if we have a well-established base type, try that first
-        // sub-classes must occur before superclasses to ensure most accurate
-        // detection.
-        if (typeInfo.isInstanceOf(ComponentFactory.BASE_CLASS_UIINPUT))
-        {
-            bestComponent = ComponentFactory.createUIInputInfo(parent,
-                    typeInfo, initMap);
-        }
-        else if (typeInfo.isInstanceOf(ComponentFactory.BASE_CLASS_UIOUTPUT))
-        {
-            bestComponent = ComponentFactory.createUIOutputInfo(parent,
-                    typeInfo, initMap);
-        }
-        else if (typeInfo.isInstanceOf(ComponentFactory.BASE_CLASS_UICOMMAND))
-        {
-            bestComponent = ComponentFactory.createUICommandInfo(parent,
-                    typeInfo, initMap);
-        }
-        else if (typeInfo.isInstanceOf(ComponentFactory.BASE_CLASS_UIDATA))
-        {
-            bestComponent = ComponentFactory.createUIDataInfo(parent, typeInfo,
-                    initMap);
-        }
-        else if (typeInfo.isInstanceOf(ComponentFactory.BASE_CLASS_UIFORM))
-        {
-            // TODO: how handle prepend ids?
-            bestComponent = ComponentFactory.createUIFormInfo(parent, typeInfo,
-                    initMap);
-        }
-        else
-        {
-            // default
-            bestComponent = ComponentFactory.createComponentInfo(
-                    _constructionData.getParent(), typeInfo, initMap);
-        }
-
-        addTypeAdapters(bestComponent);
-        maybeMapXMLToViewObjects(bestComponent, srcElement,
-                attributeToPropertyMap, _constructionData.getDocument());
-        maybeUpdateViewObject(bestComponent, srcElement, tagElement);
-        return bestComponent;
-    }
-
-    // TODO: move to view definition adapter?
-    private void populateInitMap(final String uri,
-            final Map<String, Object> initMap, final Element srcElement,
-            final IComponentTagElement tagElement,
-            final Map<String, String> attributeToPropertyMap)
-    {
-        final ComponentTypeInfo typeInfo = tagElement.getComponent();
-        final Map<String, ITagAttributeHandler> attributeHandlers = tagElement
-                .getAttributeHandlers();
-
-        final NamedNodeMap nodeMap = srcElement.getAttributes();
-
-        if (nodeMap != null && attributeHandlers != null)
-        {
-            Map<String, JDTBeanProperty> properties = null;
-
-            for (int i = 0; i < nodeMap.getLength(); i++)
-            {
-                final Attr attr = (Attr) nodeMap.item(i);
-                if (attr != null)
-                {
-                    final String name = attr.getLocalName();
-
-                    if (name != null)
-                    {
-                        final ITagAttributeHandler attrHandler = attributeHandlers
-                                .get(name);
-                        if (attrHandler instanceof IComponentPropertyHandler)
-                        {
-                            if (properties == null) 
-                            {
-                                properties = DTComponentIntrospector.getBeanProperties(typeInfo, _constructionData.getProject());
-                            }
-                            mapComponentProperty(uri, srcElement, properties,
-                                    (IComponentPropertyHandler) attrHandler,
-                                    attr, name, initMap, attributeHandlers,
-                                    attributeToPropertyMap);
-                        }
-                    }
-                }
-            }
-        }
-    }
-
-    private void mapComponentProperty(final String uri,
-            final Element srcElement,
-            final Map<String, JDTBeanProperty> properties,
-            final IComponentPropertyHandler attrHandler, final Attr attr,
-            final String attributeName, final Map initMap,
-            final Map<String, ITagAttributeHandler> attributeHandlers,
-            final Map<String, String> attributeToPropertyMap)
-    {
-        final String propertyName = attrHandler.getPropertyName();
-        if (properties.containsKey(propertyName))
-        {
-            final String id = attrHandler.getCustomHandler();
-
-            ICustomViewMapper mapper = null;
-
-            if (id != null)
-            {
-                mapper = CustomViewMapperExtensionLoader
-                        .getCustomViewMapper(id);
-                if (mapper != null)
-                {
-                    final PropertyMapping mapping = mapper
-                            .mapToComponentProperty(uri, srcElement, attr);
-                    if (mapping != null)
-                    {
-                        initMap.put(mapping.getName(), mapping.getProperty());
-                        attributeToPropertyMap.put(attributeName, mapping
-                                .getName());
-                        return;
-                    }
-                }
-            }
-
-            final String value = attr.getValue();
-            if (value != null)
-            {
-                final Object convertedValue = convertFromString(value,
-                        properties.get(propertyName));
-                initMap.put(propertyName, convertedValue);
-            }
-            attributeToPropertyMap.put(attributeName, propertyName);
-        }
-    }
-
-    private void maybeMapXMLToViewObjects(final ViewObject mappedObject,
-            final Element node,
-            final Map<String, String> attributeToProperties,
-            final IDocument document)
-    {
-        if (mappedObject != null && _mappingService != null)
-        {
-            final String uri = _adapter.getNamespace(node, document);
-            final IStructuredDocumentContext context = IStructuredDocumentContextFactory.INSTANCE
-                    .getContext(document, node);
-            final ElementData elementData = XMLViewObjectMappingService
-                    .createElementData(uri, node.getLocalName(), context,
-                            attributeToProperties);
-            //Bug 269050 - IllegalArgumentException in createMapping() method
-            if (elementData != null) {
-            	_mappingService.createMapping(elementData, mappedObject);
-            }
-        }
-    }
-
-    private void maybeUpdateViewObject(final ComponentInfo bestComponent,
-            final Element srcElement, final ITagElement tagElement)
-    {
-        if (srcElement.getAttributes() == null)
-            return;
-
-        for (int i = 0; i < srcElement.getAttributes().getLength(); i++)
-        {
-            final Attr attr = (Attr) srcElement.getAttributes().item(i);
-            final Map<String, ITagAttributeHandler> attributeHandlers = tagElement
-                    .getAttributeHandlers();
-
-            if (attributeHandlers != null)
-            {
-                final ITagAttributeHandler handler = attributeHandlers.get(attr
-                        .getLocalName());
-
-                if (handler != null)
-                {
-                    final String id = handler.getCustomHandler();
-
-                    ICustomViewMapper mapper = null;
-
-                    if (id != null)
-                    {
-                        mapper = CustomViewMapperExtensionLoader
-                                .getCustomViewMapper(id);
-                        if (mapper != null)
-                        {
-                            mapper.doAttributeActions(bestComponent,
-                                    srcElement, attr);
-                        }
-                    }
-                }
-            }
-        }
-    }
-
-    private Object convertFromString(final String convertValue,
-            final JDTBeanProperty ofThisType)
-    {
-        final String signature = ofThisType.getTypeSignature();
-
-        Object result = null;
-        switch (Signature.getTypeSignatureKind(signature))
-        {
-            case Signature.BASE_TYPE_SIGNATURE:
-                result = convertFromBaseType(convertValue, signature);
-            break;
-
-            case Signature.CLASS_TYPE_SIGNATURE:
-                if (TypeConstants.TYPE_STRING.equals(signature))
-                {
-                    result = convertValue;
-                }
-                else if (TypeConstants.TYPE_JAVAOBJECT.equals(signature))
-                {
-                    result = convertValue;
-                }
-            break;
-        }
-
-        return result;
-    }
-
-    // TODO: does this belong somewhere else?
-    private Object convertFromBaseType(final String convertValue,
-            final String signature)
-    {
-        if (Signature.SIG_BOOLEAN.equals(signature))
-        {
-            return Boolean.valueOf(convertValue);
-        }
-        else if (Signature.SIG_INT.equals(signature)
-                || Signature.SIG_BYTE.equals(signature)
-                || Signature.SIG_SHORT.equals(signature))
-        {
-            try
-            {
-                return Integer.valueOf(convertValue);
-            }
-            catch (final NumberFormatException nfe)
-            {
-                return null;
-            }
-        }
-        else if (Signature.SIG_LONG.equals(convertValue))
-        {
-            try
-            {
-                return Long.valueOf(convertValue);
-            }
-            catch (final NumberFormatException nfe)
-            {
-                return null;
-            }
-        }
-
-        return null;
-    }
-
-    private void addTypeAdapters(final ComponentInfo component)
-    {
-        final String[] interfaceNames = component.getComponentTypeInfo()
-                .getInterfaces();
-        final Set interfaceNameSets = new HashSet();
-
-        for (final String interfaceName : interfaceNames)
-        {
-            interfaceNameSets.add(interfaceName);
-        }
-
-        // don't replace intrinsic adapters
-        if (interfaceNameSets.contains(ComponentFactory.INTERFACE_ACTIONSOURCE))
-        {
-            // an ActionSource2 is-a ActionSource
-            if (interfaceNameSets
-                    .contains(ComponentFactory.INTERFACE_ACTIONSOURCE2)
-                    && component.getAdapter(ComponentFactory.ACTION_SOURCE2) == null)
-            {
-                component.addAdapter(ComponentFactory.ACTION_SOURCE2,
-                        new ActionSourceInfo2(null, null, false, null));
-            }
-
-            if (component.getAdapter(ComponentFactory.ACTION_SOURCE) == null)
-            {
-                component.addAdapter(ComponentFactory.ACTION_SOURCE,
-                        new ActionSourceInfo(null, null, false));
-            }
-        }
-
-        if (interfaceNameSets.contains(ComponentFactory.INTERFACE_VALUEHOLDER))
-        {
-            // a EditableValueHolder is-a ValueHolder
-            if (interfaceNameSets
-                    .contains(ComponentFactory.INTERFACE_EDITABLEVALUEHOLDER)
-                    && component
-                            .getAdapter(ComponentFactory.EDITABLE_VALUE_HOLDER) == null)
-            {
-                component.addAdapter(ComponentFactory.EDITABLE_VALUE_HOLDER,
-                        new EditableValueHolderInfo(null, null, null, false,
-                                false, true, false, null, null, null));
-            }
-
-            if (component.getAdapter(ComponentFactory.VALUE_HOLDER) == null)
-            {
-                component.addAdapter(ComponentFactory.VALUE_HOLDER,
-                        new ValueHolderInfo(null, null, null));
-            }
-        }
-
-        if (interfaceNameSets
-                .contains(ComponentFactory.INTERFACE_NAMINGCONTAINER)
-                && component.getAdapter(ComponentFactory.NAMING_CONTAINER) == null)
-        {
-            component.addAdapter(ComponentFactory.NAMING_CONTAINER,
-                    INamingContainerInfo.ADAPTER);
-        }
-    }
-
-    /**
-     * @param element
-     * @param constructionData
-     * @return the id for element either derived from the element using getId or
-     *         if not present, using a generation algorithm
-     */
-    protected String calculateId(final Element element,
-            final ComponentConstructionData constructionData)
-    {
-        final String id = _adapter.getId(element);
-        if (id != null)
-        {
-            return id;
-        }
-        // TODO: improve this
-        final String prefix = _adapter.getGeneratedIdPrefix();
-        return (prefix != null ? prefix : GENERATED_ID)
-                + constructionData.increment();
-    }
-
-    /**
-     * @return the construction data for this strategy
-     */
-    public final ComponentConstructionData getConstructionData()
-    {
-        return _constructionData;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/XMLViewObjectMappingService.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/XMLViewObjectMappingService.java
deleted file mode 100644
index 855aad4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/XMLViewObjectMappingService.java
+++ /dev/null
@@ -1,382 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.designtime.internal.view;
-
-import java.io.IOException;
-import java.io.Serializable;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.jsf.common.runtime.internal.model.ViewObject;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IStructuredDocumentContextResolverFactory;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IWorkspaceContextResolver;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.core.internal.region.Region2ElementAdapter;
-import org.eclipse.jst.jsf.core.internal.region.Region2ElementAdapter.NoElementException;
-import org.eclipse.jst.jsf.core.internal.tld.TagIdentifierFactory;
-import org.eclipse.wst.sse.core.StructuredModelManager;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
-import org.w3c.dom.Element;
-
-/**
- * @author cbateman
- * 
- */
-public final class XMLViewObjectMappingService implements Serializable
-{
-    /**
-     * 
-     */
-    private static final long serialVersionUID = -5371998199186683997L;
-    private final Map<ElementData, ViewObject> _elementToViewObjMap;
-    private final Map<ViewObject, ElementData> _viewObjToElementMap;
-
-    /**
-     * 
-     */
-    public XMLViewObjectMappingService()
-    {
-        _elementToViewObjMap = new HashMap<ElementData, ViewObject>();
-        _viewObjToElementMap = new HashMap<ViewObject, ElementData>();
-    }
-
-    /**
-     * @param elementData
-     * @param viewObject
-     */
-    public void createMapping(final ElementData elementData,
-            final ViewObject viewObject)
-    {
-        if (elementData == null)
-        {
-            throw new IllegalArgumentException("elementData cannot be null"); //$NON-NLS-1$
-        }
-        else if (viewObject == null)
-        {
-            throw new IllegalArgumentException("viewObject cannot be null"); //$NON-NLS-1$
-        }
-
-        synchronized(this)
-        {
-            _elementToViewObjMap.put(elementData, viewObject);
-            _viewObjToElementMap.put(viewObject, elementData);
-        }
-    }
-
-    /**
-     * Remove all mappings
-     */
-    public void clearMappings()
-    {
-        synchronized (this)
-        {
-            _elementToViewObjMap.clear();
-            _viewObjToElementMap.clear();
-        }
-    }
-
-    /**
-     * @param elementData
-     * @return the view object for which the mapping was removed
-     */
-    public ViewObject removeMapping(final ElementData elementData)
-    {
-        if (elementData == null)
-        {
-            throw new IllegalArgumentException("elementData mustn't be null"); //$NON-NLS-1$
-        }
-
-        ViewObject viewObject = null;
-        synchronized(this)
-        {
-            viewObject = _elementToViewObjMap.remove(elementData);
-            if (viewObject != null)
-            {
-                _viewObjToElementMap.remove(viewObject);
-            }
-        }
-        return viewObject;
-    }
-
-    /**
-     * @param viewObject
-     * @return the element data for which the mapping was removed
-     */
-    public ElementData removeMapping(final ViewObject viewObject)
-    {
-        if (viewObject == null)
-        {
-            throw new IllegalArgumentException("elementData mustn't be null"); //$NON-NLS-1$
-        }
-        
-        ElementData elementData = null;
-        synchronized(this)
-        {
-            elementData = _viewObjToElementMap.remove(viewObject);
-            if (elementData != null)
-            {
-                _elementToViewObjMap.remove(elementData);
-            }
-        }
-        return elementData;
-    }
-
-    /**
-     * @param viewObject
-     * @return the element data for the view object
-     */
-    public synchronized ElementData findElementData(final ViewObject viewObject)
-    {
-        return _viewObjToElementMap.get(viewObject);
-    }
-
-    /**
-     * @param viewObject
-     * @return the element for the viewObject
-     */
-    public Element findElement(final ViewObject viewObject)
-    {
-        final ElementData elementData = findElementData(viewObject);
-
-        if (elementData != null)
-        {
-            final IFile file = ResourcesPlugin.getWorkspace().getRoot()
-                    .getFile(new Path(elementData.getDocumentPath()));
-
-            if (file != null && file.isAccessible())
-            {
-                IStructuredModel model = null;
-                try
-                {
-                    model = StructuredModelManager.getModelManager()
-                            .getModelForRead(file);
-                    final IStructuredDocument sDoc = model
-                            .getStructuredDocument();
-                    final IStructuredDocumentRegion region = sDoc
-                            .getRegionAtCharacterOffset(elementData
-                                    .getStartOffset());
-                    final Region2ElementAdapter adapter = new Region2ElementAdapter(
-                            region);
-                    final TagIdentifier tagId = adapter.getTagId();
-                    if (tagId.equals(elementData.getTagId()))
-                    {
-                        return adapter.getElement();
-                    }
-                }
-                catch (CoreException ce)
-                {
-                    JSFCorePlugin.log(ce,
-                            "While finding element for viewObject: " //$NON-NLS-1$
-                                    + viewObject.toString() + " in " //$NON-NLS-1$
-                                    + file.getFullPath());
-                }
-                catch (IOException e)
-                {
-                    JSFCorePlugin.log(e,
-                            "While finding element for viewObject: " //$NON-NLS-1$
-                                    + viewObject.toString() + " in " //$NON-NLS-1$
-                                    + file.getFullPath());
-                }
-                catch (NoElementException e)
-                {
-                    JSFCorePlugin.log(e,
-                            "While finding element for viewObject: " //$NON-NLS-1$
-                                    + viewObject.toString() + " in " //$NON-NLS-1$
-                                    + file.getFullPath());
-                }
-                finally
-                {
-                    if (model != null)
-                    {
-                        model.releaseFromRead();
-                    }
-                }
-            }
-        }
-        return null;
-    }
-
-    /**
-     * @param elementData
-     * @return the mapped view object for elementData or null if not found.
-     */
-    public synchronized ViewObject findViewObject(final ElementData elementData)
-    {
-        return _elementToViewObjMap.get(elementData);
-    }
-
-    /**
-     * @param namespace
-     * @param tagName
-     * @param context
-     * @param attributeToPropertyMap 
-     * @return a new Element data for the namespace/element name in 'context'
-     */
-    public static ElementData createElementData(final String namespace,
-            final String tagName, final IStructuredDocumentContext context, 
-            final Map<String, String> attributeToPropertyMap)
-    {
-        final IFile file = getFile(context);
-        final int offset = context.getDocumentPosition();
-
-        if (file != null && file.isAccessible() && offset > -1
-                && tagName != null && namespace != null)
-        {
-            return new ElementData(offset, file.getFullPath().toString(),
-                    TagIdentifierFactory
-                            .createJSPTagWrapper(namespace, tagName),
-                     attributeToPropertyMap);
-        }
-        return null;
-    }
-
-    private static IFile getFile(final IStructuredDocumentContext context)
-    {
-        final IWorkspaceContextResolver resolver = IStructuredDocumentContextResolverFactory.INSTANCE
-                .getWorkspaceContextResolver(context);
-        IResource res = resolver.getResource();
-        if (res instanceof IFile)
-        {
-            return (IFile) res;
-        }
-        // fall through.
-        return null;
-    }
-
-    /**
-     * Describes enough information about an element instance to look it up
-     * again, without storing possibly transient references to it.
-     * 
-     * @author cbateman
-     * 
-     */
-    public final static class ElementData implements Serializable
-    {
-        /**
-         * serializable id
-         */
-        private static final long       serialVersionUID = 7937312530318827977L;
-
-        private transient TagIdentifier _tagId;
-        private Map<String, String>     _attributeToPropertyMap;
-        private String                  _documentPath;
-        private int                     _startOffset;
-
-        /**
-         * @param startOffset
-         * @param documentPath
-         * @param tagId
-         * @param attributeToPropertyMap constructor takes copy of map
-         */
-        private ElementData(final int startOffset, final String documentPath,
-                final TagIdentifier tagId, Map<String, String> attributeToPropertyMap)
-        {
-            super();
-            _startOffset = startOffset;
-            
-            _tagId = tagId;
-            _documentPath = documentPath;
-            _attributeToPropertyMap = Collections.unmodifiableMap(
-                    new HashMap<String,String>(attributeToPropertyMap));
-        }
-
-        /**
-         * Default constructor
-         */
-        protected ElementData()
-        {
-            // for serialization
-        }
-
-        /**
-         * @return the tag identifier for this element
-         */
-        public final TagIdentifier getTagId()
-        {
-            return _tagId;
-        }
-
-        /**
-         * @param forTagAttribute
-         * @return the name of the view object property that forTagAttribute
-         * maps to on this element or null if none.
-         */
-        public final String getPropertyName(final String forTagAttribute)
-        {
-            return _attributeToPropertyMap.get(forTagAttribute);
-        }
-
-        final int getStartOffset()
-        {
-            return _startOffset;
-        }
-
-        final String getDocumentPath()
-        {
-            return _documentPath;
-        }
-
-        private void writeObject(final java.io.ObjectOutputStream out)
-                throws IOException
-        {
-            out.defaultWriteObject();
-            out.writeObject(_tagId.getUri());
-            out.writeObject(_tagId.getTagName());
-        }
-
-        private void readObject(final java.io.ObjectInputStream in)
-                throws IOException, ClassNotFoundException
-        {
-            in.defaultReadObject();
-            final String uri = (String) in.readObject();
-            final String tagName = (String) in.readObject();
-            _tagId = TagIdentifierFactory.createJSPTagWrapper(uri, tagName);
-        }
-
-        @Override
-        public boolean equals(final Object obj)
-        {
-            if (this == obj)
-            {
-                return true;
-            }
-            if (obj instanceof ElementData)
-            {
-                final ElementData other = (ElementData) obj;
-                return _startOffset == other._startOffset
-                        && _documentPath.equals(other._documentPath)
-                        && _tagId.equals(other._tagId);
-            }
-            return false;
-        }
-
-        @Override
-        public int hashCode()
-        {
-            int hashCode = _tagId.hashCode();
-            hashCode ^= _documentPath.hashCode();
-            // startOffsets will generally fit in the first 10 bits, so mix
-            // it up a bit.
-            hashCode ^= ~(_startOffset * 104551);
-            return hashCode;
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/mapping/AbstractCustomViewMapper.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/mapping/AbstractCustomViewMapper.java
deleted file mode 100644
index f50a460..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/mapping/AbstractCustomViewMapper.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.designtime.internal.view.mapping;
-
-import org.eclipse.jst.jsf.common.runtime.internal.model.component.ComponentInfo;
-import org.w3c.dom.Attr;
-import org.w3c.dom.Element;
-
-/**
- * Must be sub-classed by all ICustomViewMapper's.
- * 
- * @author cbateman
- *
- */
-public abstract class AbstractCustomViewMapper implements ICustomViewMapper
-{
-    public abstract PropertyMapping mapToComponentProperty(final String uri,
-            final Element srcElement, final Attr attr);
-
-    public abstract void doAttributeActions(final ComponentInfo bestComponent,
-            final Element srcElement, final Attr attr);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/mapping/CustomViewMappingAdapter.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/mapping/CustomViewMappingAdapter.java
deleted file mode 100644
index 4d3830b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/mapping/CustomViewMappingAdapter.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.designtime.internal.view.mapping;
-
-import org.eclipse.jst.jsf.common.runtime.internal.model.component.ComponentInfo;
-import org.w3c.dom.Attr;
-import org.w3c.dom.Element;
-
-/**
- * A no-op implementation that sub-classes can selectively override.
- * 
- * @author cbateman
- *
- */
-public class CustomViewMappingAdapter extends AbstractCustomViewMapper
-{
-
-    @Override
-    public void doAttributeActions(ComponentInfo bestComponent,
-            Element srcElement, Attr attr)
-    {
-        // do nothing
-    }
-
-    @Override
-    public PropertyMapping mapToComponentProperty(String uri,
-            Element srcElement, Attr attr)
-    {
-        // no mappings
-        return null;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/mapping/ICustomViewMapper.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/mapping/ICustomViewMapper.java
deleted file mode 100644
index 954167e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/mapping/ICustomViewMapper.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.designtime.internal.view.mapping;
-
-import org.eclipse.jst.jsf.common.runtime.internal.model.component.ComponentInfo;
-import org.w3c.dom.Attr;
-import org.w3c.dom.Element;
-
-/**
- * A custom view mapper to map from elements and attributes to view objects and
- * properties.
- * 
- * @author cbateman
- * 
- */
-public interface ICustomViewMapper
-{
-    /**
-     * @param uri
-     * @param srcElement
-     * @param attr
-     * @return the name/value of the component property or null if no mapping.
-     */
-    PropertyMapping mapToComponentProperty(final String uri,
-            final Element srcElement, final Attr attr);
-
-    /**
-     * Allows a mapper to make updates to a component based on its attribute.
-     * May choose to do nothing.
-     * 
-     * @param bestComponent
-     * @param srcElement
-     * @param attr
-     */
-    void doAttributeActions(ComponentInfo bestComponent, Element srcElement,
-            Attr attr);
-
-    /**
-     * The name/value pair of a component property mapping.
-     * 
-     * @author cbateman
-     *
-     */
-    public static class PropertyMapping
-    {
-        private final String _name;
-        private final Object _property;
-
-        /**
-         * @param name
-         * @param property
-         */
-        public PropertyMapping(final String name, final Object property)
-        {
-            _name = name;
-            _property = property;
-        }
-
-        /**
-         * @return the property name
-         */
-        public final String getName()
-        {
-            return _name;
-        }
-
-        /**
-         * @return the property value
-         */
-        public final Object getProperty()
-        {
-            return _property;
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/mapping/ViewMetadataGenerator.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/mapping/ViewMetadataGenerator.java
deleted file mode 100644
index 975775f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/mapping/ViewMetadataGenerator.java
+++ /dev/null
@@ -1,202 +0,0 @@
-package org.eclipse.jst.jsf.designtime.internal.view.mapping;
-
-import java.io.IOException;
-import java.io.OutputStream;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.resource.ResourceSet;
-import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
-import org.eclipse.emf.ecore.util.BasicExtendedMetaData;
-import org.eclipse.emf.ecore.util.ExtendedMetaData;
-import org.eclipse.emf.ecore.xmi.XMLHelper;
-import org.eclipse.emf.ecore.xmi.XMLResource;
-import org.eclipse.emf.ecore.xmi.impl.XMLHelperImpl;
-import org.eclipse.emf.ecore.xmi.impl.XMLResourceFactoryImpl;
-import org.eclipse.emf.ecore.xmi.impl.XMLResourceImpl;
-import org.eclipse.jst.jsf.common.metadata.Entity;
-import org.eclipse.jst.jsf.common.metadata.MetadataFactory;
-import org.eclipse.jst.jsf.common.metadata.MetadataPackage;
-import org.eclipse.jst.jsf.common.metadata.Model;
-import org.eclipse.jst.jsf.common.metadata.Trait;
-import org.eclipse.jst.jsf.common.runtime.internal.model.types.ClassTypeInfo;
-import org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ClassTypeInfo_;
-import org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ComponentMappingFactory;
-import org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ComponentMappingPackage;
-import org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.TagMapping;
-import org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.TagToViewObjectMapping;
-
-/**
- * Generates View metadata from common.runtime objects.
- * 
- * @author cbateman
- * 
- */
-public class ViewMetadataGenerator
-{
-    private final ResourceSet      _resourceSet;
-    private final ExtendedMetaData _extendedMetadata;
-    private final Model            _root;
-    private final ViewMetadataMapper   _mapper;
-
-    /**
-     * @param uri
-     */
-    public ViewMetadataGenerator(final String uri)
-    {
-        _root = MetadataFactory.eINSTANCE.createModel();
-        _root.setId(uri);
-        _root.setType("tagFile"); //$NON-NLS-1$
-        _resourceSet = new ResourceSetImpl();
-        _mapper = new ViewMetadataMapper();
-        _extendedMetadata = new BasicExtendedMetaData(_resourceSet
-                .getPackageRegistry());
-
-        // Register the appropriate resource factory to handle all file
-        // extensions.
-        //
-        _resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap()
-                .put(Resource.Factory.Registry.DEFAULT_EXTENSION,
-                        new XMLResourceFactoryImpl());
-    }
-
-    /**
-     * The format of the strings should match OSGI version:
-     * 
-     * MAJOR . MINOR . BUILD . QUALIFIER
-     * 
-     * @param tagName
-     * @param typeInfo
-     * @param minJSFVersion
-     *            the minimum JSF version, null for DEFAULT.
-     * @param minLibVersion
-     *            the minimum library version, null for NONE.
-     */
-    public void addTagToViewObjectMapping(final String tagName,
-            final ClassTypeInfo typeInfo, final String minJSFVersion,
-            final String minLibVersion)
-    {
-        final ClassTypeInfo_ metadata = _mapper.mapToMetadata(typeInfo);
-
-        if (metadata != null)
-        {
-            final TagToViewObjectMapping viewMapping =
-                ComponentMappingFactory.eINSTANCE.createTagToViewObjectMapping();
-            if (minJSFVersion != null)
-            {
-                viewMapping.setMinJSFVersion(minJSFVersion);
-            }
-            viewMapping.setMinLibraryVersion(minLibVersion);
-            viewMapping.setTypeInfo(metadata);
-
-            final TagMapping tagMapping = findOrCreateTagMapping(tagName);
-            tagMapping.getVersionedTagToViewMappings().add(viewMapping);
-
-            final Trait trait = MetadataFactory.eINSTANCE.createTrait();
-            trait.setId(ViewMetadataMapper.DEFAULT_MAPPING_TRAIT_ID);
-            trait.setValue(tagMapping);
-
-            final Entity entity = MetadataFactory.eINSTANCE.createEntity();
-            entity.setId(tagName);
-            entity.setType("tag"); //$NON-NLS-1$
-            entity.getTraits().add(trait);
-
-            _root.getChildEntities().add(entity);
-        }
-    }
-
-    private TagMapping findOrCreateTagMapping(final String tagName)
-    {
-        for (final Entity entity : (List<Entity>)_root.getChildEntities())
-        {
-            if (entity.getId().equals(tagName))
-            {
-                for (final Trait trait : (List<Trait>)entity.getTraits())
-                {
-                    if (trait.getId().equals(ViewMetadataMapper.DEFAULT_MAPPING_TRAIT_ID))
-                    {
-                        return (TagMapping) trait.getValue();
-                    }
-                }
-            }
-        }
-        return ComponentMappingFactory.eINSTANCE.createTagMapping();
-    }
-
-    /**
-     * @param out
-     * @throws IOException
-     */
-    public void save(final OutputStream out) throws IOException
-    {
-        final Resource res = new XMLResourceImpl()
-        {
-            @Override
-            protected XMLHelper createXMLHelper()
-            {
-                return new XMLHelperImpl()
-                {
-                    public String getHREF(EObject obj)
-                    {
-                        return ComponentMappingPackage.eNS_URI;
-                    }
-
-                    @Override
-                    public EPackage getNoNamespacePackage()
-                    {
-                        return MetadataPackage.eINSTANCE;
-                    }
-                };
-            }
-        };// _resourceSet.createResource(URI.createURI("foo.xml"));
-        res.getContents().add(_root);
-        // res.setURI(uri);
-        // resourceSet.getResources().add(res);
-        // setLoadOptions(res);
-        Map options = new HashMap();
-        options.put(XMLResource.OPTION_SCHEMA_LOCATION, Boolean.TRUE);
-        options.put(XMLResource.OPTION_EXTENDED_META_DATA, _extendedMetadata);
-        // options.put(XMLResource.OPTION_RESOURCE_HANDLER, res);
-        options.put(XMLResource.OPTION_LAX_FEATURE_PROCESSING, Boolean.TRUE);
-        options.put(XMLResource.OPTION_RECORD_UNKNOWN_FEATURE, Boolean.FALSE);// turning
-        // this
-        // off
-        // so
-        // that
-        // res.getErrors()
-        // has
-        // values
-        // to
-        // check!
-        // bizarre
-        // that
-        // I
-        // should
-        // need
-        // to
-        // do
-        // this.
-        res.save(out, options);
-    }
-
-    // private void printHeader(final OutputStream out) throws IOException
-    // {
-    // final String header = "<md:metadatamodel \n"
-    // + "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\""
-    // + "xmlns:ecore=\"http://www.eclipse.org/emf/2002/Ecore\""
-    // +
-    // "xmlns:md=\"http://org.eclipse.jst.jsf.common.metadata/metadata.ecore\""
-    // +
-    // "xmlns:mdt=\"http://org.eclipse.jst.jsf.common.metadata/metadataTraitTypes.ecore\"
-    // "
-    // +
-    // "xmlns:viewMap=\"http://org.eclipse.jst.jsf.core/componentMapping.ecore\""
-    // + "id=\"http://java.sun.com/jsf/html\""
-    // + "type\"tagFile\">";
-    // out.write(header.getBytes());
-    // }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/mapping/ViewMetadataLoader.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/mapping/ViewMetadataLoader.java
deleted file mode 100644
index d892bdd..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/mapping/ViewMetadataLoader.java
+++ /dev/null
@@ -1,96 +0,0 @@
-package org.eclipse.jst.jsf.designtime.internal.view.mapping;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.jsf.common.metadata.Entity;
-import org.eclipse.jst.jsf.common.metadata.Trait;
-import org.eclipse.jst.jsf.common.metadata.query.ITaglibDomainMetaDataModelContext;
-import org.eclipse.jst.jsf.common.metadata.query.TaglibDomainMetaDataQueryHelper;
-import org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.AttributeToPropertyMapping;
-import org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.TagMapping;
-
-/**
- * Loader class for view metadata.
- * 
- * @author cbateman
- * 
- */
-public class ViewMetadataLoader
-{
-    private final IProject                                       _project;
-    private final Map<String, ITaglibDomainMetaDataModelContext> _metadataContexts;
-
-    /**
-     * @param project
-     */
-    public ViewMetadataLoader(final IProject project)
-    {
-        _project = project;
-        _metadataContexts = new HashMap<String, ITaglibDomainMetaDataModelContext>();
-    }
-
-    /**
-     * @param tagId
-     * @return the tag to view object mapping metadata for a tag in a particular
-     *         metadata context or null if not found.
-     */
-    public TagMapping getTagToViewMapping(final TagIdentifier tagId)
-    {
-        final ITaglibDomainMetaDataModelContext modelContext = createMetadataContext(tagId
-                .getUri());
-        final Entity entity = TaglibDomainMetaDataQueryHelper.getEntity(
-                modelContext, tagId.getTagName());
-        if (entity != null)
-        {
-            final Trait trait = TaglibDomainMetaDataQueryHelper.getTrait(
-                    entity, ViewMetadataMapper.DEFAULT_MAPPING_TRAIT_ID);
-            if (trait != null)
-            {
-                return (TagMapping) trait.getValue();
-            }
-        }
-        return null;
-    }
-
-    private ITaglibDomainMetaDataModelContext createMetadataContext(
-            final String uri)
-    {
-        ITaglibDomainMetaDataModelContext modelContext = _metadataContexts
-                .get(uri);
-
-        if (modelContext == null)
-        {
-            modelContext = TaglibDomainMetaDataQueryHelper
-                    .createMetaDataModelContext(_project, uri);
-            _metadataContexts.put(uri, modelContext);
-        }
-        return modelContext;
-    }
-
-    /**
-     * @param tagId
-     * @param name 
-     * @return the attribute mapping for name on tagId or null if known
-     */
-    public AttributeToPropertyMapping getAttributeMapping(
-            final TagIdentifier tagId, final String name)
-    {
-        final ITaglibDomainMetaDataModelContext modelContext = createMetadataContext(tagId
-                .getUri());
-        final Entity entity = TaglibDomainMetaDataQueryHelper.getEntity(
-                modelContext, tagId.getTagName()+"/"+name); //$NON-NLS-1$
-        if (entity != null)
-        {
-            final Trait trait = TaglibDomainMetaDataQueryHelper.getTrait(
-                    entity, ViewMetadataMapper.DEFAULT_ATTRIBUTE_TRAIT_ID);
-            if (trait != null)
-            {
-                return (AttributeToPropertyMapping) trait.getValue();
-            }
-        }
-        return null;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/mapping/ViewMetadataMapper.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/mapping/ViewMetadataMapper.java
deleted file mode 100644
index a4bb00f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/mapping/ViewMetadataMapper.java
+++ /dev/null
@@ -1,170 +0,0 @@
-package org.eclipse.jst.jsf.designtime.internal.view.mapping;
-
-import org.eclipse.jst.jsf.common.runtime.internal.model.component.ComponentTypeInfo;
-import org.eclipse.jst.jsf.common.runtime.internal.model.decorator.ConverterTypeInfo;
-import org.eclipse.jst.jsf.common.runtime.internal.model.decorator.ValidatorTypeInfo;
-import org.eclipse.jst.jsf.common.runtime.internal.model.types.ClassTypeInfo;
-import org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ClassTypeInfo_;
-import org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ComponentMappingFactory;
-import org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ComponentTypeInfo_;
-import org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ConverterTypeInfo_;
-import org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ValidatorTypeInfo_;
-
-/**
- * Maps meta-data to and from common.runtime data. In future, we may eliminate
- * this class by making the EMF meta-data structures into the common.runtime
- * data.
- * 
- * @author cbateman
- * 
- */
-public final class ViewMetadataMapper
-{
-
-    /**
-     * The default trait id where meta-data will annotated
-     */
-    public final static String DEFAULT_MAPPING_TRAIT_ID = "viewElementMapping"; //$NON-NLS-1$
-    /**
-     * The default trait id where meta-data will be annotated.
-     */
-    public final static String DEFAULT_ATTRIBUTE_TRAIT_ID = "attributeMapping"; //$NON-NLS-1$
-
-    /**
-     * @param classTypeInfo
-     * @return a framework ClassTypeInfo equivalent to classTypeInfo or null if
-     *         none.
-     */
-    public ClassTypeInfo mapToFrameworkData(final ClassTypeInfo_ classTypeInfo)
-    {
-        if (classTypeInfo instanceof ComponentTypeInfo_)
-        {
-            return createComponentTypeInfo_((ComponentTypeInfo_) classTypeInfo);
-        }
-        else if (classTypeInfo instanceof ConverterTypeInfo_)
-        {
-            return createConverterTypeInfo_((ConverterTypeInfo_) classTypeInfo);
-        }
-        else if (classTypeInfo instanceof ValidatorTypeInfo_)
-        {
-            return createValidatorTypeInfo_((ValidatorTypeInfo_) classTypeInfo);
-        }
-        return null;
-    }
-
-    private ClassTypeInfo createValidatorTypeInfo_(
-            ValidatorTypeInfo_ classTypeInfo)
-    {
-        final String[] superClasses = classTypeInfo.getSuperClasses().toArray(
-                new String[0]);
-        final String[] interfaces = classTypeInfo.getInterfaces().toArray(
-                new String[0]);
-        if (classTypeInfo.getClassName()==null && classTypeInfo.getValidatorId() == null)
-        {
-            return ValidatorTypeInfo.UNKNOWN;
-        }
-
-        return new ValidatorTypeInfo(classTypeInfo.getClassName(),
-                superClasses, interfaces, classTypeInfo.getValidatorId());
-    }
-
-    private ClassTypeInfo createConverterTypeInfo_(
-            ConverterTypeInfo_ classTypeInfo)
-    {
-        final String[] superClasses = classTypeInfo.getSuperClasses().toArray(
-                new String[0]);
-        final String[] interfaces = classTypeInfo.getInterfaces().toArray(
-                new String[0]);
-        if (classTypeInfo.getClassName() == null
-                && classTypeInfo.getConverterId() == null)
-        {
-            return ConverterTypeInfo.UNKNOWN;
-        }
-        final String[] forClasses = classTypeInfo.getForClasses().toArray(
-                new String[0]);
-        return new ConverterTypeInfo(classTypeInfo.getClassName(),
-                superClasses, interfaces, classTypeInfo.getConverterId(),
-                forClasses);
-    }
-
-    private ClassTypeInfo createComponentTypeInfo_(
-            ComponentTypeInfo_ classTypeInfo)
-    {
-        final String[] superClasses = classTypeInfo.getSuperClasses().toArray(
-                new String[0]);
-        final String[] interfaces = classTypeInfo.getInterfaces().toArray(
-                new String[0]);
-        return new ComponentTypeInfo(classTypeInfo.getComponentType(),
-                classTypeInfo.getClassName(), superClasses, interfaces,
-                classTypeInfo.getComponentFamily(), classTypeInfo
-                        .getRenderType());
-    }
-
-    /**
-     * @param classTypeInfo
-     * @return a metadata type info matching classTypeInfo or null if
-     *         classTypeInfo isn't of a supported concrete type.
-     */
-    public ClassTypeInfo_ mapToMetadata(final ClassTypeInfo classTypeInfo)
-    {
-        if (classTypeInfo instanceof ComponentTypeInfo)
-        {
-            return createComponentTypeInfo((ComponentTypeInfo) classTypeInfo);
-        }
-        else if (classTypeInfo instanceof ConverterTypeInfo)
-        {
-            return createConverterTypeInfo((ConverterTypeInfo) classTypeInfo);
-        }
-        else if (classTypeInfo instanceof ValidatorTypeInfo)
-        {
-            return createValidatorTypeInfo((ValidatorTypeInfo) classTypeInfo);
-        }
-        return null;
-    }
-
-    private ClassTypeInfo_ createComponentTypeInfo(
-            final ComponentTypeInfo typeInfo)
-    {
-        final ComponentTypeInfo_ metadata = ComponentMappingFactory.eINSTANCE
-                .createComponentTypeInfo_();
-        metadata.setComponentFamily(typeInfo.getComponentFamily());
-        metadata.setComponentType(typeInfo.getComponentType());
-        metadata.setRenderType(typeInfo.getRenderFamily());
-        copy(typeInfo, metadata);
-        return metadata;
-    }
-
-    private ClassTypeInfo_ createConverterTypeInfo(
-            final ConverterTypeInfo typeInfo)
-    {
-        final ConverterTypeInfo_ metadata = ComponentMappingFactory.eINSTANCE
-                .createConverterTypeInfo_();
-        copy(typeInfo, metadata);
-        metadata.setConverterId(typeInfo.getConverterId());
-        return metadata;
-    }
-
-    private ClassTypeInfo_ createValidatorTypeInfo(
-            final ValidatorTypeInfo typeInfo)
-    {
-        final ValidatorTypeInfo_ metadata = ComponentMappingFactory.eINSTANCE
-                .createValidatorTypeInfo_();
-        copy(typeInfo, metadata);
-        metadata.setValidatorId(typeInfo.getValidatorId());
-        return metadata;
-    }
-
-    private void copy(ClassTypeInfo source, ClassTypeInfo_ dest)
-    {
-        dest.setClassName(source.getClassName());
-        for (final String interfaze : source.getInterfaces())
-        {
-            dest.getInterfaces().add(interfaze);
-        }
-
-        for (final String superClass : source.getSuperClasses())
-        {
-            dest.getSuperClasses().add(superClass);
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/mapping/mappers/ValueHolderAttributeMapper.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/mapping/mappers/ValueHolderAttributeMapper.java
deleted file mode 100644
index 016b821..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/mapping/mappers/ValueHolderAttributeMapper.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.designtime.internal.view.mapping.mappers;
-
-import org.eclipse.jst.jsf.common.runtime.internal.model.component.ComponentFactory;
-import org.eclipse.jst.jsf.common.runtime.internal.model.component.ComponentInfo;
-import org.eclipse.jst.jsf.common.runtime.internal.model.decorator.ConverterDecorator;
-import org.eclipse.jst.jsf.common.runtime.internal.model.decorator.ConverterTypeInfo;
-import org.eclipse.jst.jsf.designtime.internal.view.mapping.CustomViewMappingAdapter;
-import org.w3c.dom.Attr;
-import org.w3c.dom.Element;
-
-/**
- * Default mapper for value holders.
- * 
- * @author cbateman
- * 
- */
-public class ValueHolderAttributeMapper extends CustomViewMappingAdapter
-{
-    @Override
-    public void doAttributeActions(ComponentInfo bestComponent,
-            Element srcElement, Attr attr)
-    {
-        final String name = attr.getNodeName();
-
-        if ("converter".equals(name) //$NON-NLS-1$
-                && bestComponent.getComponentTypeInfo().isInstanceOf(
-                        ComponentFactory.INTERFACE_VALUEHOLDER))
-        {
-            final String value = attr.getValue();
-
-            if (value != null)
-            {
-                ConverterTypeInfo typeInfo = null;
-
-                if (!value.startsWith("#{")) //$NON-NLS-1$
-                {
-                    typeInfo = new ConverterTypeInfo(null, value);
-
-                }
-                else
-                {
-                    typeInfo = ConverterTypeInfo.UNKNOWN;
-                }
-                ConverterDecorator decorator = new ConverterDecorator(
-                        bestComponent, typeInfo);
-                bestComponent.addDecorator(decorator,
-                        ComponentFactory.CONVERTER);
-            }
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/mapping/viewmapping/AttributeToPropertyMapping.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/mapping/viewmapping/AttributeToPropertyMapping.java
deleted file mode 100644
index a304915..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/mapping/viewmapping/AttributeToPropertyMapping.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: AttributeToPropertyMapping.java,v 1.1 2008/05/12 17:42:19 cbateman Exp $
- */
-package org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Attribute To Property Mapping</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.AttributeToPropertyMapping#getPropertyName <em>Property Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.AttributeToPropertyMapping#isElAllowed <em>El Allowed</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.AttributeToPropertyMapping#getCustomConversionFactoryId <em>Custom Conversion Factory Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ComponentMappingPackage#getAttributeToPropertyMapping()
- * @model
- * @generated
- */
-public interface AttributeToPropertyMapping extends EObject
-{
-    /**
-     * Returns the value of the '<em><b>Property Name</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Property Name</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Property Name</em>' attribute.
-     * @see #setPropertyName(String)
-     * @see org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ComponentMappingPackage#getAttributeToPropertyMapping_PropertyName()
-     * @model extendedMetaData="kind='element' name='propertyName'"
-     * @generated
-     */
-    String getPropertyName();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.AttributeToPropertyMapping#getPropertyName <em>Property Name</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Property Name</em>' attribute.
-     * @see #getPropertyName()
-     * @generated
-     */
-    void setPropertyName(String value);
-
-    /**
-     * Returns the value of the '<em><b>El Allowed</b></em>' attribute.
-     * The default value is <code>"true"</code>.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>El Allowed</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>El Allowed</em>' attribute.
-     * @see #setElAllowed(boolean)
-     * @see org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ComponentMappingPackage#getAttributeToPropertyMapping_ElAllowed()
-     * @model default="true"
-     *        extendedMetaData="kind='element' name='elAllowed'"
-     * @generated
-     */
-    boolean isElAllowed();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.AttributeToPropertyMapping#isElAllowed <em>El Allowed</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>El Allowed</em>' attribute.
-     * @see #isElAllowed()
-     * @generated
-     */
-    void setElAllowed(boolean value);
-
-    /**
-     * Returns the value of the '<em><b>Custom Conversion Factory Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Custom Conversion Factory Id</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Custom Conversion Factory Id</em>' attribute.
-     * @see #setCustomConversionFactoryId(String)
-     * @see org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ComponentMappingPackage#getAttributeToPropertyMapping_CustomConversionFactoryId()
-     * @model extendedMetaData="kind='element' name='customConversionFactoryId'"
-     * @generated
-     */
-    String getCustomConversionFactoryId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.AttributeToPropertyMapping#getCustomConversionFactoryId <em>Custom Conversion Factory Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Custom Conversion Factory Id</em>' attribute.
-     * @see #getCustomConversionFactoryId()
-     * @generated
-     */
-    void setCustomConversionFactoryId(String value);
-
-} // AttributeToPropertyMapping
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/mapping/viewmapping/ClassTypeInfo_.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/mapping/viewmapping/ClassTypeInfo_.java
deleted file mode 100644
index bad2651..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/mapping/viewmapping/ClassTypeInfo_.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ClassTypeInfo_.java,v 1.1 2008/05/12 17:42:19 cbateman Exp $
- */
-package org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping;
-
-import org.eclipse.emf.common.util.EList;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Class Type Info </b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ClassTypeInfo_#getClassName <em>Class Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ClassTypeInfo_#getSuperClasses <em>Super Classes</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ClassTypeInfo_#getInterfaces <em>Interfaces</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ComponentMappingPackage#getClassTypeInfo_()
- * @model
- * @generated
- */
-public interface ClassTypeInfo_ extends EObject
-{
-    /**
-     * Returns the value of the '<em><b>Class Name</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Class Name</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Class Name</em>' attribute.
-     * @see #setClassName(String)
-     * @see org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ComponentMappingPackage#getClassTypeInfo__ClassName()
-     * @model extendedMetaData="kind='element' name='className'"
-     * @generated
-     */
-    String getClassName();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ClassTypeInfo_#getClassName <em>Class Name</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Class Name</em>' attribute.
-     * @see #getClassName()
-     * @generated
-     */
-    void setClassName(String value);
-
-    /**
-     * Returns the value of the '<em><b>Super Classes</b></em>' attribute list.
-     * The list contents are of type {@link java.lang.String}.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Super Classes</em>' attribute list isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Super Classes</em>' attribute list.
-     * @see org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ComponentMappingPackage#getClassTypeInfo__SuperClasses()
-     * @model extendedMetaData="kind='element' name='superClasses'"
-     * @generated
-     */
-    EList<String> getSuperClasses();
-
-    /**
-     * Returns the value of the '<em><b>Interfaces</b></em>' attribute list.
-     * The list contents are of type {@link java.lang.String}.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Interfaces</em>' attribute list isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Interfaces</em>' attribute list.
-     * @see org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ComponentMappingPackage#getClassTypeInfo__Interfaces()
-     * @model extendedMetaData="kind='element' name='interfaces'"
-     * @generated
-     */
-    EList<String> getInterfaces();
-
-} // ClassTypeInfo_
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/mapping/viewmapping/ComponentMappingFactory.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/mapping/viewmapping/ComponentMappingFactory.java
deleted file mode 100644
index 9a45fa0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/mapping/viewmapping/ComponentMappingFactory.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ComponentMappingFactory.java,v 1.1 2008/05/12 17:42:19 cbateman Exp $
- */
-package org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping;
-
-import org.eclipse.emf.ecore.EFactory;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Factory</b> for the model.
- * It provides a create method for each non-abstract class of the model.
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ComponentMappingPackage
- * @generated
- */
-public interface ComponentMappingFactory extends EFactory
-{
-    /**
-     * The singleton instance of the factory.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    ComponentMappingFactory eINSTANCE = org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.impl.ComponentMappingFactoryImpl.init();
-
-    /**
-     * Returns a new object of class '<em>Tag Mapping</em>'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new object of class '<em>Tag Mapping</em>'.
-     * @generated
-     */
-    TagMapping createTagMapping();
-
-    /**
-     * Returns a new object of class '<em>Tag To View Object Mapping</em>'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new object of class '<em>Tag To View Object Mapping</em>'.
-     * @generated
-     */
-    TagToViewObjectMapping createTagToViewObjectMapping();
-
-    /**
-     * Returns a new object of class '<em>Class Type Info </em>'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new object of class '<em>Class Type Info </em>'.
-     * @generated
-     */
-    ClassTypeInfo_ createClassTypeInfo_();
-
-    /**
-     * Returns a new object of class '<em>Component Type Info </em>'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new object of class '<em>Component Type Info </em>'.
-     * @generated
-     */
-    ComponentTypeInfo_ createComponentTypeInfo_();
-
-    /**
-     * Returns a new object of class '<em>Converter Type Info </em>'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new object of class '<em>Converter Type Info </em>'.
-     * @generated
-     */
-    ConverterTypeInfo_ createConverterTypeInfo_();
-
-    /**
-     * Returns a new object of class '<em>Validator Type Info </em>'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new object of class '<em>Validator Type Info </em>'.
-     * @generated
-     */
-    ValidatorTypeInfo_ createValidatorTypeInfo_();
-
-    /**
-     * Returns a new object of class '<em>Attribute To Property Mapping</em>'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new object of class '<em>Attribute To Property Mapping</em>'.
-     * @generated
-     */
-    AttributeToPropertyMapping createAttributeToPropertyMapping();
-
-    /**
-     * Returns the package supported by this factory.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the package supported by this factory.
-     * @generated
-     */
-    ComponentMappingPackage getComponentMappingPackage();
-
-} //ComponentMappingFactory
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/mapping/viewmapping/ComponentMappingPackage.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/mapping/viewmapping/ComponentMappingPackage.java
deleted file mode 100644
index 8862507..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/mapping/viewmapping/ComponentMappingPackage.java
+++ /dev/null
@@ -1,949 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ComponentMappingPackage.java,v 1.2 2008/11/18 22:24:15 gkessler Exp $
- */
-package org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping;
-
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.EReference;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Package</b> for the model.
- * It contains accessors for the meta objects to represent
- * <ul>
- *   <li>each class,</li>
- *   <li>each feature of each class,</li>
- *   <li>each enum,</li>
- *   <li>and each data type</li>
- * </ul>
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ComponentMappingFactory
- * @model kind="package"
- * @generated
- */
-public interface ComponentMappingPackage extends EPackage
-{
-    /**
-     * The package name.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    String eNAME = "viewmapping"; //$NON-NLS-1$
-
-    /**
-     * The package namespace URI.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    String eNS_URI = "http://org.eclipse.jst.jsf.core/componentMapping.ecore"; //$NON-NLS-1$
-
-    /**
-     * The package namespace name.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    String eNS_PREFIX = "viewMap"; //$NON-NLS-1$
-
-    /**
-     * The singleton instance of the package.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    ComponentMappingPackage eINSTANCE = org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.impl.ComponentMappingPackageImpl.init();
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.impl.TagMappingImpl <em>Tag Mapping</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.impl.TagMappingImpl
-     * @see org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.impl.ComponentMappingPackageImpl#getTagMapping()
-     * @generated
-     */
-    int TAG_MAPPING = 0;
-
-    /**
-     * The feature id for the '<em><b>Versioned Tag To View Mappings</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int TAG_MAPPING__VERSIONED_TAG_TO_VIEW_MAPPINGS = 0;
-
-    /**
-     * The feature id for the '<em><b>Custom Conversion Factory Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int TAG_MAPPING__CUSTOM_CONVERSION_FACTORY_ID = 1;
-
-    /**
-     * The feature id for the '<em><b>Bean Mapped Properties</b></em>' attribute list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int TAG_MAPPING__BEAN_MAPPED_PROPERTIES = 2;
-
-    /**
-     * The number of structural features of the '<em>Tag Mapping</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int TAG_MAPPING_FEATURE_COUNT = 3;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.impl.TagToViewObjectMappingImpl <em>Tag To View Object Mapping</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.impl.TagToViewObjectMappingImpl
-     * @see org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.impl.ComponentMappingPackageImpl#getTagToViewObjectMapping()
-     * @generated
-     */
-    int TAG_TO_VIEW_OBJECT_MAPPING = 1;
-
-    /**
-     * The feature id for the '<em><b>Type Info</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int TAG_TO_VIEW_OBJECT_MAPPING__TYPE_INFO = 0;
-
-    /**
-     * The feature id for the '<em><b>Min JSF Version</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int TAG_TO_VIEW_OBJECT_MAPPING__MIN_JSF_VERSION = 1;
-
-    /**
-     * The feature id for the '<em><b>Min Library Version</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int TAG_TO_VIEW_OBJECT_MAPPING__MIN_LIBRARY_VERSION = 2;
-
-    /**
-     * The number of structural features of the '<em>Tag To View Object Mapping</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int TAG_TO_VIEW_OBJECT_MAPPING_FEATURE_COUNT = 3;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.impl.ClassTypeInfo_Impl <em>Class Type Info </em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.impl.ClassTypeInfo_Impl
-     * @see org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.impl.ComponentMappingPackageImpl#getClassTypeInfo_()
-     * @generated
-     */
-    int CLASS_TYPE_INFO_ = 2;
-
-    /**
-     * The feature id for the '<em><b>Class Name</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int CLASS_TYPE_INFO___CLASS_NAME = 0;
-
-    /**
-     * The feature id for the '<em><b>Super Classes</b></em>' attribute list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int CLASS_TYPE_INFO___SUPER_CLASSES = 1;
-
-    /**
-     * The feature id for the '<em><b>Interfaces</b></em>' attribute list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int CLASS_TYPE_INFO___INTERFACES = 2;
-
-    /**
-     * The number of structural features of the '<em>Class Type Info </em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int CLASS_TYPE_INFO__FEATURE_COUNT = 3;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.impl.ComponentTypeInfo_Impl <em>Component Type Info </em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.impl.ComponentTypeInfo_Impl
-     * @see org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.impl.ComponentMappingPackageImpl#getComponentTypeInfo_()
-     * @generated
-     */
-    int COMPONENT_TYPE_INFO_ = 3;
-
-    /**
-     * The feature id for the '<em><b>Class Name</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int COMPONENT_TYPE_INFO___CLASS_NAME = CLASS_TYPE_INFO___CLASS_NAME;
-
-    /**
-     * The feature id for the '<em><b>Super Classes</b></em>' attribute list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int COMPONENT_TYPE_INFO___SUPER_CLASSES = CLASS_TYPE_INFO___SUPER_CLASSES;
-
-    /**
-     * The feature id for the '<em><b>Interfaces</b></em>' attribute list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int COMPONENT_TYPE_INFO___INTERFACES = CLASS_TYPE_INFO___INTERFACES;
-
-    /**
-     * The feature id for the '<em><b>Component Type</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int COMPONENT_TYPE_INFO___COMPONENT_TYPE = CLASS_TYPE_INFO__FEATURE_COUNT + 0;
-
-    /**
-     * The feature id for the '<em><b>Component Family</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int COMPONENT_TYPE_INFO___COMPONENT_FAMILY = CLASS_TYPE_INFO__FEATURE_COUNT + 1;
-
-    /**
-     * The feature id for the '<em><b>Render Type</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int COMPONENT_TYPE_INFO___RENDER_TYPE = CLASS_TYPE_INFO__FEATURE_COUNT + 2;
-
-    /**
-     * The number of structural features of the '<em>Component Type Info </em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int COMPONENT_TYPE_INFO__FEATURE_COUNT = CLASS_TYPE_INFO__FEATURE_COUNT + 3;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.impl.ConverterTypeInfo_Impl <em>Converter Type Info </em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.impl.ConverterTypeInfo_Impl
-     * @see org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.impl.ComponentMappingPackageImpl#getConverterTypeInfo_()
-     * @generated
-     */
-    int CONVERTER_TYPE_INFO_ = 4;
-
-    /**
-     * The feature id for the '<em><b>Class Name</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int CONVERTER_TYPE_INFO___CLASS_NAME = CLASS_TYPE_INFO___CLASS_NAME;
-
-    /**
-     * The feature id for the '<em><b>Super Classes</b></em>' attribute list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int CONVERTER_TYPE_INFO___SUPER_CLASSES = CLASS_TYPE_INFO___SUPER_CLASSES;
-
-    /**
-     * The feature id for the '<em><b>Interfaces</b></em>' attribute list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int CONVERTER_TYPE_INFO___INTERFACES = CLASS_TYPE_INFO___INTERFACES;
-
-    /**
-     * The feature id for the '<em><b>Converter Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int CONVERTER_TYPE_INFO___CONVERTER_ID = CLASS_TYPE_INFO__FEATURE_COUNT + 0;
-
-    /**
-     * The feature id for the '<em><b>For Classes</b></em>' attribute list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int CONVERTER_TYPE_INFO___FOR_CLASSES = CLASS_TYPE_INFO__FEATURE_COUNT + 1;
-
-    /**
-     * The number of structural features of the '<em>Converter Type Info </em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int CONVERTER_TYPE_INFO__FEATURE_COUNT = CLASS_TYPE_INFO__FEATURE_COUNT + 2;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.impl.ValidatorTypeInfo_Impl <em>Validator Type Info </em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.impl.ValidatorTypeInfo_Impl
-     * @see org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.impl.ComponentMappingPackageImpl#getValidatorTypeInfo_()
-     * @generated
-     */
-    int VALIDATOR_TYPE_INFO_ = 5;
-
-    /**
-     * The feature id for the '<em><b>Class Name</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int VALIDATOR_TYPE_INFO___CLASS_NAME = CLASS_TYPE_INFO___CLASS_NAME;
-
-    /**
-     * The feature id for the '<em><b>Super Classes</b></em>' attribute list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int VALIDATOR_TYPE_INFO___SUPER_CLASSES = CLASS_TYPE_INFO___SUPER_CLASSES;
-
-    /**
-     * The feature id for the '<em><b>Interfaces</b></em>' attribute list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int VALIDATOR_TYPE_INFO___INTERFACES = CLASS_TYPE_INFO___INTERFACES;
-
-    /**
-     * The feature id for the '<em><b>Validator Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int VALIDATOR_TYPE_INFO___VALIDATOR_ID = CLASS_TYPE_INFO__FEATURE_COUNT + 0;
-
-    /**
-     * The number of structural features of the '<em>Validator Type Info </em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int VALIDATOR_TYPE_INFO__FEATURE_COUNT = CLASS_TYPE_INFO__FEATURE_COUNT + 1;
-
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.impl.AttributeToPropertyMappingImpl <em>Attribute To Property Mapping</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.impl.AttributeToPropertyMappingImpl
-     * @see org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.impl.ComponentMappingPackageImpl#getAttributeToPropertyMapping()
-     * @generated
-     */
-    int ATTRIBUTE_TO_PROPERTY_MAPPING = 6;
-
-    /**
-     * The feature id for the '<em><b>Property Name</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int ATTRIBUTE_TO_PROPERTY_MAPPING__PROPERTY_NAME = 0;
-
-    /**
-     * The feature id for the '<em><b>El Allowed</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int ATTRIBUTE_TO_PROPERTY_MAPPING__EL_ALLOWED = 1;
-
-    /**
-     * The feature id for the '<em><b>Custom Conversion Factory Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int ATTRIBUTE_TO_PROPERTY_MAPPING__CUSTOM_CONVERSION_FACTORY_ID = 2;
-
-    /**
-     * The number of structural features of the '<em>Attribute To Property Mapping</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int ATTRIBUTE_TO_PROPERTY_MAPPING_FEATURE_COUNT = 3;
-
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.TagMapping <em>Tag Mapping</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Tag Mapping</em>'.
-     * @see org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.TagMapping
-     * @generated
-     */
-    EClass getTagMapping();
-
-    /**
-     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.TagMapping#getVersionedTagToViewMappings <em>Versioned Tag To View Mappings</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the containment reference list '<em>Versioned Tag To View Mappings</em>'.
-     * @see org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.TagMapping#getVersionedTagToViewMappings()
-     * @see #getTagMapping()
-     * @generated
-     */
-    EReference getTagMapping_VersionedTagToViewMappings();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.TagMapping#getCustomConversionFactoryId <em>Custom Conversion Factory Id</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Custom Conversion Factory Id</em>'.
-     * @see org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.TagMapping#getCustomConversionFactoryId()
-     * @see #getTagMapping()
-     * @generated
-     */
-    EAttribute getTagMapping_CustomConversionFactoryId();
-
-    /**
-     * Returns the meta object for the attribute list '{@link org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.TagMapping#getBeanMappedProperties <em>Bean Mapped Properties</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute list '<em>Bean Mapped Properties</em>'.
-     * @see org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.TagMapping#getBeanMappedProperties()
-     * @see #getTagMapping()
-     * @generated
-     */
-    EAttribute getTagMapping_BeanMappedProperties();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.TagToViewObjectMapping <em>Tag To View Object Mapping</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Tag To View Object Mapping</em>'.
-     * @see org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.TagToViewObjectMapping
-     * @generated
-     */
-    EClass getTagToViewObjectMapping();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.TagToViewObjectMapping#getTypeInfo <em>Type Info</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Type Info</em>'.
-     * @see org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.TagToViewObjectMapping#getTypeInfo()
-     * @see #getTagToViewObjectMapping()
-     * @generated
-     */
-    EReference getTagToViewObjectMapping_TypeInfo();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.TagToViewObjectMapping#getMinJSFVersion <em>Min JSF Version</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Min JSF Version</em>'.
-     * @see org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.TagToViewObjectMapping#getMinJSFVersion()
-     * @see #getTagToViewObjectMapping()
-     * @generated
-     */
-    EAttribute getTagToViewObjectMapping_MinJSFVersion();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.TagToViewObjectMapping#getMinLibraryVersion <em>Min Library Version</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Min Library Version</em>'.
-     * @see org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.TagToViewObjectMapping#getMinLibraryVersion()
-     * @see #getTagToViewObjectMapping()
-     * @generated
-     */
-    EAttribute getTagToViewObjectMapping_MinLibraryVersion();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ClassTypeInfo_ <em>Class Type Info </em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Class Type Info </em>'.
-     * @see org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ClassTypeInfo_
-     * @generated
-     */
-    EClass getClassTypeInfo_();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ClassTypeInfo_#getClassName <em>Class Name</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Class Name</em>'.
-     * @see org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ClassTypeInfo_#getClassName()
-     * @see #getClassTypeInfo_()
-     * @generated
-     */
-    EAttribute getClassTypeInfo__ClassName();
-
-    /**
-     * Returns the meta object for the attribute list '{@link org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ClassTypeInfo_#getSuperClasses <em>Super Classes</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute list '<em>Super Classes</em>'.
-     * @see org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ClassTypeInfo_#getSuperClasses()
-     * @see #getClassTypeInfo_()
-     * @generated
-     */
-    EAttribute getClassTypeInfo__SuperClasses();
-
-    /**
-     * Returns the meta object for the attribute list '{@link org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ClassTypeInfo_#getInterfaces <em>Interfaces</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute list '<em>Interfaces</em>'.
-     * @see org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ClassTypeInfo_#getInterfaces()
-     * @see #getClassTypeInfo_()
-     * @generated
-     */
-    EAttribute getClassTypeInfo__Interfaces();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ComponentTypeInfo_ <em>Component Type Info </em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Component Type Info </em>'.
-     * @see org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ComponentTypeInfo_
-     * @generated
-     */
-    EClass getComponentTypeInfo_();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ComponentTypeInfo_#getComponentType <em>Component Type</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Component Type</em>'.
-     * @see org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ComponentTypeInfo_#getComponentType()
-     * @see #getComponentTypeInfo_()
-     * @generated
-     */
-    EAttribute getComponentTypeInfo__ComponentType();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ComponentTypeInfo_#getComponentFamily <em>Component Family</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Component Family</em>'.
-     * @see org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ComponentTypeInfo_#getComponentFamily()
-     * @see #getComponentTypeInfo_()
-     * @generated
-     */
-    EAttribute getComponentTypeInfo__ComponentFamily();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ComponentTypeInfo_#getRenderType <em>Render Type</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Render Type</em>'.
-     * @see org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ComponentTypeInfo_#getRenderType()
-     * @see #getComponentTypeInfo_()
-     * @generated
-     */
-    EAttribute getComponentTypeInfo__RenderType();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ConverterTypeInfo_ <em>Converter Type Info </em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Converter Type Info </em>'.
-     * @see org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ConverterTypeInfo_
-     * @generated
-     */
-    EClass getConverterTypeInfo_();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ConverterTypeInfo_#getConverterId <em>Converter Id</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Converter Id</em>'.
-     * @see org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ConverterTypeInfo_#getConverterId()
-     * @see #getConverterTypeInfo_()
-     * @generated
-     */
-    EAttribute getConverterTypeInfo__ConverterId();
-
-    /**
-     * Returns the meta object for the attribute list '{@link org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ConverterTypeInfo_#getForClasses <em>For Classes</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute list '<em>For Classes</em>'.
-     * @see org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ConverterTypeInfo_#getForClasses()
-     * @see #getConverterTypeInfo_()
-     * @generated
-     */
-    EAttribute getConverterTypeInfo__ForClasses();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ValidatorTypeInfo_ <em>Validator Type Info </em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Validator Type Info </em>'.
-     * @see org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ValidatorTypeInfo_
-     * @generated
-     */
-    EClass getValidatorTypeInfo_();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ValidatorTypeInfo_#getValidatorId <em>Validator Id</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Validator Id</em>'.
-     * @see org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ValidatorTypeInfo_#getValidatorId()
-     * @see #getValidatorTypeInfo_()
-     * @generated
-     */
-    EAttribute getValidatorTypeInfo__ValidatorId();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.AttributeToPropertyMapping <em>Attribute To Property Mapping</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Attribute To Property Mapping</em>'.
-     * @see org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.AttributeToPropertyMapping
-     * @generated
-     */
-    EClass getAttributeToPropertyMapping();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.AttributeToPropertyMapping#getPropertyName <em>Property Name</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Property Name</em>'.
-     * @see org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.AttributeToPropertyMapping#getPropertyName()
-     * @see #getAttributeToPropertyMapping()
-     * @generated
-     */
-    EAttribute getAttributeToPropertyMapping_PropertyName();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.AttributeToPropertyMapping#isElAllowed <em>El Allowed</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>El Allowed</em>'.
-     * @see org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.AttributeToPropertyMapping#isElAllowed()
-     * @see #getAttributeToPropertyMapping()
-     * @generated
-     */
-    EAttribute getAttributeToPropertyMapping_ElAllowed();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.AttributeToPropertyMapping#getCustomConversionFactoryId <em>Custom Conversion Factory Id</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Custom Conversion Factory Id</em>'.
-     * @see org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.AttributeToPropertyMapping#getCustomConversionFactoryId()
-     * @see #getAttributeToPropertyMapping()
-     * @generated
-     */
-    EAttribute getAttributeToPropertyMapping_CustomConversionFactoryId();
-
-    /**
-     * Returns the factory that creates the instances of the model.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the factory that creates the instances of the model.
-     * @generated
-     */
-    ComponentMappingFactory getComponentMappingFactory();
-
-    /**
-     * <!-- begin-user-doc -->
-     * Defines literals for the meta objects that represent
-     * <ul>
-     *   <li>each class,</li>
-     *   <li>each feature of each class,</li>
-     *   <li>each enum,</li>
-     *   <li>and each data type</li>
-     * </ul>
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @SuppressWarnings("hiding")
-    interface Literals
-    {
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.impl.TagMappingImpl <em>Tag Mapping</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.impl.TagMappingImpl
-         * @see org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.impl.ComponentMappingPackageImpl#getTagMapping()
-         * @generated
-         */
-        EClass TAG_MAPPING = eINSTANCE.getTagMapping();
-
-        /**
-         * The meta object literal for the '<em><b>Versioned Tag To View Mappings</b></em>' containment reference list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference TAG_MAPPING__VERSIONED_TAG_TO_VIEW_MAPPINGS = eINSTANCE.getTagMapping_VersionedTagToViewMappings();
-
-        /**
-         * The meta object literal for the '<em><b>Custom Conversion Factory Id</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute TAG_MAPPING__CUSTOM_CONVERSION_FACTORY_ID = eINSTANCE.getTagMapping_CustomConversionFactoryId();
-
-        /**
-         * The meta object literal for the '<em><b>Bean Mapped Properties</b></em>' attribute list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute TAG_MAPPING__BEAN_MAPPED_PROPERTIES = eINSTANCE.getTagMapping_BeanMappedProperties();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.impl.TagToViewObjectMappingImpl <em>Tag To View Object Mapping</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.impl.TagToViewObjectMappingImpl
-         * @see org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.impl.ComponentMappingPackageImpl#getTagToViewObjectMapping()
-         * @generated
-         */
-        EClass TAG_TO_VIEW_OBJECT_MAPPING = eINSTANCE.getTagToViewObjectMapping();
-
-        /**
-         * The meta object literal for the '<em><b>Type Info</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference TAG_TO_VIEW_OBJECT_MAPPING__TYPE_INFO = eINSTANCE.getTagToViewObjectMapping_TypeInfo();
-
-        /**
-         * The meta object literal for the '<em><b>Min JSF Version</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute TAG_TO_VIEW_OBJECT_MAPPING__MIN_JSF_VERSION = eINSTANCE.getTagToViewObjectMapping_MinJSFVersion();
-
-        /**
-         * The meta object literal for the '<em><b>Min Library Version</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute TAG_TO_VIEW_OBJECT_MAPPING__MIN_LIBRARY_VERSION = eINSTANCE.getTagToViewObjectMapping_MinLibraryVersion();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.impl.ClassTypeInfo_Impl <em>Class Type Info </em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.impl.ClassTypeInfo_Impl
-         * @see org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.impl.ComponentMappingPackageImpl#getClassTypeInfo_()
-         * @generated
-         */
-        EClass CLASS_TYPE_INFO_ = eINSTANCE.getClassTypeInfo_();
-
-        /**
-         * The meta object literal for the '<em><b>Class Name</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute CLASS_TYPE_INFO___CLASS_NAME = eINSTANCE.getClassTypeInfo__ClassName();
-
-        /**
-         * The meta object literal for the '<em><b>Super Classes</b></em>' attribute list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute CLASS_TYPE_INFO___SUPER_CLASSES = eINSTANCE.getClassTypeInfo__SuperClasses();
-
-        /**
-         * The meta object literal for the '<em><b>Interfaces</b></em>' attribute list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute CLASS_TYPE_INFO___INTERFACES = eINSTANCE.getClassTypeInfo__Interfaces();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.impl.ComponentTypeInfo_Impl <em>Component Type Info </em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.impl.ComponentTypeInfo_Impl
-         * @see org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.impl.ComponentMappingPackageImpl#getComponentTypeInfo_()
-         * @generated
-         */
-        EClass COMPONENT_TYPE_INFO_ = eINSTANCE.getComponentTypeInfo_();
-
-        /**
-         * The meta object literal for the '<em><b>Component Type</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute COMPONENT_TYPE_INFO___COMPONENT_TYPE = eINSTANCE.getComponentTypeInfo__ComponentType();
-
-        /**
-         * The meta object literal for the '<em><b>Component Family</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute COMPONENT_TYPE_INFO___COMPONENT_FAMILY = eINSTANCE.getComponentTypeInfo__ComponentFamily();
-
-        /**
-         * The meta object literal for the '<em><b>Render Type</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute COMPONENT_TYPE_INFO___RENDER_TYPE = eINSTANCE.getComponentTypeInfo__RenderType();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.impl.ConverterTypeInfo_Impl <em>Converter Type Info </em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.impl.ConverterTypeInfo_Impl
-         * @see org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.impl.ComponentMappingPackageImpl#getConverterTypeInfo_()
-         * @generated
-         */
-        EClass CONVERTER_TYPE_INFO_ = eINSTANCE.getConverterTypeInfo_();
-
-        /**
-         * The meta object literal for the '<em><b>Converter Id</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute CONVERTER_TYPE_INFO___CONVERTER_ID = eINSTANCE.getConverterTypeInfo__ConverterId();
-
-        /**
-         * The meta object literal for the '<em><b>For Classes</b></em>' attribute list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute CONVERTER_TYPE_INFO___FOR_CLASSES = eINSTANCE.getConverterTypeInfo__ForClasses();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.impl.ValidatorTypeInfo_Impl <em>Validator Type Info </em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.impl.ValidatorTypeInfo_Impl
-         * @see org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.impl.ComponentMappingPackageImpl#getValidatorTypeInfo_()
-         * @generated
-         */
-        EClass VALIDATOR_TYPE_INFO_ = eINSTANCE.getValidatorTypeInfo_();
-
-        /**
-         * The meta object literal for the '<em><b>Validator Id</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute VALIDATOR_TYPE_INFO___VALIDATOR_ID = eINSTANCE.getValidatorTypeInfo__ValidatorId();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.impl.AttributeToPropertyMappingImpl <em>Attribute To Property Mapping</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.impl.AttributeToPropertyMappingImpl
-         * @see org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.impl.ComponentMappingPackageImpl#getAttributeToPropertyMapping()
-         * @generated
-         */
-        EClass ATTRIBUTE_TO_PROPERTY_MAPPING = eINSTANCE.getAttributeToPropertyMapping();
-
-        /**
-         * The meta object literal for the '<em><b>Property Name</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute ATTRIBUTE_TO_PROPERTY_MAPPING__PROPERTY_NAME = eINSTANCE.getAttributeToPropertyMapping_PropertyName();
-
-        /**
-         * The meta object literal for the '<em><b>El Allowed</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute ATTRIBUTE_TO_PROPERTY_MAPPING__EL_ALLOWED = eINSTANCE.getAttributeToPropertyMapping_ElAllowed();
-
-        /**
-         * The meta object literal for the '<em><b>Custom Conversion Factory Id</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute ATTRIBUTE_TO_PROPERTY_MAPPING__CUSTOM_CONVERSION_FACTORY_ID = eINSTANCE.getAttributeToPropertyMapping_CustomConversionFactoryId();
-
-    }
-
-} //ComponentMappingPackage
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/mapping/viewmapping/ComponentTypeInfo_.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/mapping/viewmapping/ComponentTypeInfo_.java
deleted file mode 100644
index e537498..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/mapping/viewmapping/ComponentTypeInfo_.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ComponentTypeInfo_.java,v 1.1 2008/05/12 17:42:19 cbateman Exp $
- */
-package org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Component Type Info </b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ComponentTypeInfo_#getComponentType <em>Component Type</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ComponentTypeInfo_#getComponentFamily <em>Component Family</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ComponentTypeInfo_#getRenderType <em>Render Type</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ComponentMappingPackage#getComponentTypeInfo_()
- * @model
- * @generated
- */
-public interface ComponentTypeInfo_ extends ClassTypeInfo_
-{
-    /**
-     * Returns the value of the '<em><b>Component Type</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Component Type</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Component Type</em>' attribute.
-     * @see #setComponentType(String)
-     * @see org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ComponentMappingPackage#getComponentTypeInfo__ComponentType()
-     * @model extendedMetaData="kind='element' name='componentType'"
-     * @generated
-     */
-    String getComponentType();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ComponentTypeInfo_#getComponentType <em>Component Type</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Component Type</em>' attribute.
-     * @see #getComponentType()
-     * @generated
-     */
-    void setComponentType(String value);
-
-    /**
-     * Returns the value of the '<em><b>Component Family</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Component Family</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Component Family</em>' attribute.
-     * @see #setComponentFamily(String)
-     * @see org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ComponentMappingPackage#getComponentTypeInfo__ComponentFamily()
-     * @model extendedMetaData="kind='element' name='componentFamily'"
-     * @generated
-     */
-    String getComponentFamily();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ComponentTypeInfo_#getComponentFamily <em>Component Family</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Component Family</em>' attribute.
-     * @see #getComponentFamily()
-     * @generated
-     */
-    void setComponentFamily(String value);
-
-    /**
-     * Returns the value of the '<em><b>Render Type</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Render Type</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Render Type</em>' attribute.
-     * @see #setRenderType(String)
-     * @see org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ComponentMappingPackage#getComponentTypeInfo__RenderType()
-     * @model extendedMetaData="kind='element' name='renderType'"
-     * @generated
-     */
-    String getRenderType();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ComponentTypeInfo_#getRenderType <em>Render Type</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Render Type</em>' attribute.
-     * @see #getRenderType()
-     * @generated
-     */
-    void setRenderType(String value);
-
-} // ComponentTypeInfo_
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/mapping/viewmapping/ConverterTypeInfo_.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/mapping/viewmapping/ConverterTypeInfo_.java
deleted file mode 100644
index d7dbc54..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/mapping/viewmapping/ConverterTypeInfo_.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ConverterTypeInfo_.java,v 1.1 2008/05/12 17:42:19 cbateman Exp $
- */
-package org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping;
-
-import org.eclipse.emf.common.util.EList;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Converter Type Info </b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ConverterTypeInfo_#getConverterId <em>Converter Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ConverterTypeInfo_#getForClasses <em>For Classes</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ComponentMappingPackage#getConverterTypeInfo_()
- * @model
- * @generated
- */
-public interface ConverterTypeInfo_ extends ClassTypeInfo_
-{
-    /**
-     * Returns the value of the '<em><b>Converter Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Converter Id</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Converter Id</em>' attribute.
-     * @see #setConverterId(String)
-     * @see org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ComponentMappingPackage#getConverterTypeInfo__ConverterId()
-     * @model extendedMetaData="kind='element' name='converterId'"
-     * @generated
-     */
-    String getConverterId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ConverterTypeInfo_#getConverterId <em>Converter Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Converter Id</em>' attribute.
-     * @see #getConverterId()
-     * @generated
-     */
-    void setConverterId(String value);
-
-    /**
-     * Returns the value of the '<em><b>For Classes</b></em>' attribute list.
-     * The list contents are of type {@link java.lang.String}.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>For Classes</em>' attribute list isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>For Classes</em>' attribute list.
-     * @see org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ComponentMappingPackage#getConverterTypeInfo__ForClasses()
-     * @model extendedMetaData="kind='element' name='forClass'"
-     * @generated
-     */
-    EList<String> getForClasses();
-
-} // ConverterTypeInfo_
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/mapping/viewmapping/CustomViewMapperExtensionLoader.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/mapping/viewmapping/CustomViewMapperExtensionLoader.java
deleted file mode 100644
index 5e9de90..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/mapping/viewmapping/CustomViewMapperExtensionLoader.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtension;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.designtime.internal.view.mapping.ICustomViewMapper;
-
-/**
- * @author cbateman
- * 
- */
-public class CustomViewMapperExtensionLoader
-{
-    private final static String                   EXTENSION_ID = "customViewMapper"; //$NON-NLS-1$
-    private final static String                   ELEMENT_NAME = "customViewMapper"; //$NON-NLS-1$
-
-    private static Map<String, ICustomViewMapper> _extensions;
-
-    /**
-     * @param id
-     * @return the list of handlers. The list is not modifiable and will throw
-     *         exceptions if it is attempted.
-     */
-    public static synchronized ICustomViewMapper getCustomViewMapper(
-            final String id)
-    {
-        if (_extensions == null)
-        {
-            _extensions = Collections.unmodifiableMap(readAllHandlers());
-        }
-        return _extensions.get(id);
-    }
-
-    private static Map<String, ICustomViewMapper> readAllHandlers()
-    {
-        final Map<String, ICustomViewMapper> handlers = new HashMap<String, ICustomViewMapper>();
-        final IExtensionPoint extensionPoint = JSFCorePlugin.getDefault()
-                .getExtension(EXTENSION_ID);
-        final IExtension[] extensions = extensionPoint.getExtensions();
-
-        for (final IExtension ext : extensions)
-        {
-            final IConfigurationElement[] configElements = ext
-                    .getConfigurationElements();
-
-            for (final IConfigurationElement element : configElements)
-            {
-                if (ELEMENT_NAME.equals(element.getName()))
-                {
-                    try
-                    {
-                        final String pluginId = element.getContributor()
-                                .getName();
-                        final String name = element.getAttribute("id"); //$NON-NLS-1$
-                        final Object customHandler = element
-                                .createExecutableExtension("class"); //$NON-NLS-1$
-                        if (customHandler instanceof ICustomViewMapper
-                                && name != null)
-                        {
-                            handlers.put(pluginId + "." + name, //$NON-NLS-1$
-                                    (ICustomViewMapper) customHandler);
-                        }
-                        else
-                        {
-                            JSFCorePlugin.log(
-                                    "Error loading tag registry extension: " //$NON-NLS-1$
-                                            + element.getContributor().getName()
-                                            + "." + element.getAttribute("id") //$NON-NLS-1$ //$NON-NLS-2$
-                                      , new Throwable("No exception: stack trace only")); //$NON-NLS-1$
-                        }
-                    }
-                    catch (final CoreException e)
-                    {
-                        JSFCorePlugin.log(e,
-                                "Error loading tag registry extension: " //$NON-NLS-1$
-                                        + element.getContributor().getName()
-                                        + "." + element.getAttribute("id")); //$NON-NLS-1$ //$NON-NLS-2$
-                    }
-                }
-            }
-        }
-        return handlers;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/mapping/viewmapping/TagMapping.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/mapping/viewmapping/TagMapping.java
deleted file mode 100644
index 4f824a1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/mapping/viewmapping/TagMapping.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: TagMapping.java,v 1.1 2008/05/12 17:42:19 cbateman Exp $
- */
-package org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping;
-
-import org.eclipse.emf.common.util.EList;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Tag Mapping</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.TagMapping#getVersionedTagToViewMappings <em>Versioned Tag To View Mappings</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.TagMapping#getCustomConversionFactoryId <em>Custom Conversion Factory Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.TagMapping#getBeanMappedProperties <em>Bean Mapped Properties</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ComponentMappingPackage#getTagMapping()
- * @model
- * @generated
- */
-public interface TagMapping extends EObject
-{
-    /**
-     * Returns the value of the '<em><b>Versioned Tag To View Mappings</b></em>' containment reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.TagToViewObjectMapping}.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Versioned Tag To View Mappings</em>' containment reference list isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Versioned Tag To View Mappings</em>' containment reference list.
-     * @see org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ComponentMappingPackage#getTagMapping_VersionedTagToViewMappings()
-     * @model containment="true"
-     *        extendedMetaData="kind='element' name='versionedTagToViewMappings'"
-     * @generated
-     */
-    EList<TagToViewObjectMapping> getVersionedTagToViewMappings();
-
-    /**
-     * Returns the value of the '<em><b>Custom Conversion Factory Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Custom Conversion Factory Id</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Custom Conversion Factory Id</em>' attribute.
-     * @see #setCustomConversionFactoryId(String)
-     * @see org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ComponentMappingPackage#getTagMapping_CustomConversionFactoryId()
-     * @model extendedMetaData="kind='element' name='customConversionFactoryId'"
-     * @generated
-     */
-    String getCustomConversionFactoryId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.TagMapping#getCustomConversionFactoryId <em>Custom Conversion Factory Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Custom Conversion Factory Id</em>' attribute.
-     * @see #getCustomConversionFactoryId()
-     * @generated
-     */
-    void setCustomConversionFactoryId(String value);
-
-    /**
-     * Returns the value of the '<em><b>Bean Mapped Properties</b></em>' attribute list.
-     * The list contents are of type {@link java.lang.String}.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Bean Mapped Properties</em>' attribute list isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Bean Mapped Properties</em>' attribute list.
-     * @see org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ComponentMappingPackage#getTagMapping_BeanMappedProperties()
-     * @model default=""
-     *        extendedMetaData="kind='element' name='beanMappedProperties'"
-     * @generated
-     */
-    EList<String> getBeanMappedProperties();
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param jsfVersion 
-     * @param libVersion 
-     * <!-- end-user-doc -->
-     * @model
-     * @generated
-     */
-    void findBestMapping(String jsfVersion, String libVersion);
-
-} // TagMapping
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/mapping/viewmapping/TagToViewObjectMapping.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/mapping/viewmapping/TagToViewObjectMapping.java
deleted file mode 100644
index 608ba0f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/mapping/viewmapping/TagToViewObjectMapping.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: TagToViewObjectMapping.java,v 1.1 2008/05/12 17:42:19 cbateman Exp $
- */
-package org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Tag To View Object Mapping</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.TagToViewObjectMapping#getTypeInfo <em>Type Info</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.TagToViewObjectMapping#getMinJSFVersion <em>Min JSF Version</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.TagToViewObjectMapping#getMinLibraryVersion <em>Min Library Version</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ComponentMappingPackage#getTagToViewObjectMapping()
- * @model
- * @generated
- */
-public interface TagToViewObjectMapping extends EObject
-{
-    /**
-     * Returns the value of the '<em><b>Type Info</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Type Info</em>' reference isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Type Info</em>' containment reference.
-     * @see #setTypeInfo(ClassTypeInfo_)
-     * @see org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ComponentMappingPackage#getTagToViewObjectMapping_TypeInfo()
-     * @model containment="true"
-     *        extendedMetaData="kind='element' name='typeInfo'"
-     * @generated
-     */
-    ClassTypeInfo_ getTypeInfo();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.TagToViewObjectMapping#getTypeInfo <em>Type Info</em>}' containment reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Type Info</em>' containment reference.
-     * @see #getTypeInfo()
-     * @generated
-     */
-    void setTypeInfo(ClassTypeInfo_ value);
-
-    /**
-     * Returns the value of the '<em><b>Min JSF Version</b></em>' attribute.
-     * The default value is <code>"1.1"</code>.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Min JSF Version</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Min JSF Version</em>' attribute.
-     * @see #setMinJSFVersion(String)
-     * @see org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ComponentMappingPackage#getTagToViewObjectMapping_MinJSFVersion()
-     * @model default="1.1"
-     *        extendedMetaData="kind='element' name='minVersion'"
-     * @generated
-     */
-    String getMinJSFVersion();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.TagToViewObjectMapping#getMinJSFVersion <em>Min JSF Version</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Min JSF Version</em>' attribute.
-     * @see #getMinJSFVersion()
-     * @generated
-     */
-    void setMinJSFVersion(String value);
-
-    /**
-     * Returns the value of the '<em><b>Min Library Version</b></em>' attribute.
-     * The default value is <code>""</code>.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Min Library Version</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Min Library Version</em>' attribute.
-     * @see #setMinLibraryVersion(String)
-     * @see org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ComponentMappingPackage#getTagToViewObjectMapping_MinLibraryVersion()
-     * @model default=""
-     *        extendedMetaData="kind='element' name='minLibraryVersion'"
-     * @generated
-     */
-    String getMinLibraryVersion();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.TagToViewObjectMapping#getMinLibraryVersion <em>Min Library Version</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Min Library Version</em>' attribute.
-     * @see #getMinLibraryVersion()
-     * @generated
-     */
-    void setMinLibraryVersion(String value);
-
-} // TagToViewObjectMapping
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/mapping/viewmapping/ValidatorTypeInfo_.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/mapping/viewmapping/ValidatorTypeInfo_.java
deleted file mode 100644
index 6085684..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/mapping/viewmapping/ValidatorTypeInfo_.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ValidatorTypeInfo_.java,v 1.1 2008/05/12 17:42:19 cbateman Exp $
- */
-package org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Validator Type Info </b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ValidatorTypeInfo_#getValidatorId <em>Validator Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ComponentMappingPackage#getValidatorTypeInfo_()
- * @model
- * @generated
- */
-public interface ValidatorTypeInfo_ extends ClassTypeInfo_
-{
-    /**
-     * Returns the value of the '<em><b>Validator Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Validator Id</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Validator Id</em>' attribute.
-     * @see #setValidatorId(String)
-     * @see org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ComponentMappingPackage#getValidatorTypeInfo__ValidatorId()
-     * @model extendedMetaData="kind='element' name='validatorId'"
-     * @generated
-     */
-    String getValidatorId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ValidatorTypeInfo_#getValidatorId <em>Validator Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Validator Id</em>' attribute.
-     * @see #getValidatorId()
-     * @generated
-     */
-    void setValidatorId(String value);
-
-} // ValidatorTypeInfo_
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/mapping/viewmapping/impl/AttributeToPropertyMappingImpl.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/mapping/viewmapping/impl/AttributeToPropertyMappingImpl.java
deleted file mode 100644
index 9531099..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/mapping/viewmapping/impl/AttributeToPropertyMappingImpl.java
+++ /dev/null
@@ -1,293 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: AttributeToPropertyMappingImpl.java,v 1.2 2008/11/18 22:23:57 gkessler Exp $
- */
-package org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-
-import org.eclipse.emf.ecore.EClass;
-
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-
-import org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.AttributeToPropertyMapping;
-import org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ComponentMappingPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Attribute To Property Mapping</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.impl.AttributeToPropertyMappingImpl#getPropertyName <em>Property Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.impl.AttributeToPropertyMappingImpl#isElAllowed <em>El Allowed</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.impl.AttributeToPropertyMappingImpl#getCustomConversionFactoryId <em>Custom Conversion Factory Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class AttributeToPropertyMappingImpl extends EObjectImpl implements AttributeToPropertyMapping
-{
-    /**
-     * The default value of the '{@link #getPropertyName() <em>Property Name</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getPropertyName()
-     * @generated
-     * @ordered
-     */
-    protected static final String PROPERTY_NAME_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getPropertyName() <em>Property Name</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getPropertyName()
-     * @generated
-     * @ordered
-     */
-    protected String propertyName = PROPERTY_NAME_EDEFAULT;
-
-    /**
-     * The default value of the '{@link #isElAllowed() <em>El Allowed</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #isElAllowed()
-     * @generated
-     * @ordered
-     */
-    protected static final boolean EL_ALLOWED_EDEFAULT = true;
-
-    /**
-     * The cached value of the '{@link #isElAllowed() <em>El Allowed</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #isElAllowed()
-     * @generated
-     * @ordered
-     */
-    protected boolean elAllowed = EL_ALLOWED_EDEFAULT;
-
-    /**
-     * The default value of the '{@link #getCustomConversionFactoryId() <em>Custom Conversion Factory Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getCustomConversionFactoryId()
-     * @generated
-     * @ordered
-     */
-    protected static final String CUSTOM_CONVERSION_FACTORY_ID_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getCustomConversionFactoryId() <em>Custom Conversion Factory Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getCustomConversionFactoryId()
-     * @generated
-     * @ordered
-     */
-    protected String customConversionFactoryId = CUSTOM_CONVERSION_FACTORY_ID_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected AttributeToPropertyMappingImpl()
-    {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    protected EClass eStaticClass()
-    {
-        return ComponentMappingPackage.Literals.ATTRIBUTE_TO_PROPERTY_MAPPING;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String getPropertyName()
-    {
-        return propertyName;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setPropertyName(String newPropertyName)
-    {
-        String oldPropertyName = propertyName;
-        propertyName = newPropertyName;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, ComponentMappingPackage.ATTRIBUTE_TO_PROPERTY_MAPPING__PROPERTY_NAME, oldPropertyName, propertyName));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean isElAllowed()
-    {
-        return elAllowed;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setElAllowed(boolean newElAllowed)
-    {
-        boolean oldElAllowed = elAllowed;
-        elAllowed = newElAllowed;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, ComponentMappingPackage.ATTRIBUTE_TO_PROPERTY_MAPPING__EL_ALLOWED, oldElAllowed, elAllowed));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String getCustomConversionFactoryId()
-    {
-        return customConversionFactoryId;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setCustomConversionFactoryId(String newCustomConversionFactoryId)
-    {
-        String oldCustomConversionFactoryId = customConversionFactoryId;
-        customConversionFactoryId = newCustomConversionFactoryId;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, ComponentMappingPackage.ATTRIBUTE_TO_PROPERTY_MAPPING__CUSTOM_CONVERSION_FACTORY_ID, oldCustomConversionFactoryId, customConversionFactoryId));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public Object eGet(int featureID, boolean resolve, boolean coreType)
-    {
-        switch (featureID)
-        {
-            case ComponentMappingPackage.ATTRIBUTE_TO_PROPERTY_MAPPING__PROPERTY_NAME:
-                return getPropertyName();
-            case ComponentMappingPackage.ATTRIBUTE_TO_PROPERTY_MAPPING__EL_ALLOWED:
-                return isElAllowed() ? Boolean.TRUE : Boolean.FALSE;
-            case ComponentMappingPackage.ATTRIBUTE_TO_PROPERTY_MAPPING__CUSTOM_CONVERSION_FACTORY_ID:
-                return getCustomConversionFactoryId();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public void eSet(int featureID, Object newValue)
-    {
-        switch (featureID)
-        {
-            case ComponentMappingPackage.ATTRIBUTE_TO_PROPERTY_MAPPING__PROPERTY_NAME:
-                setPropertyName((String)newValue);
-                return;
-            case ComponentMappingPackage.ATTRIBUTE_TO_PROPERTY_MAPPING__EL_ALLOWED:
-                setElAllowed(((Boolean)newValue).booleanValue());
-                return;
-            case ComponentMappingPackage.ATTRIBUTE_TO_PROPERTY_MAPPING__CUSTOM_CONVERSION_FACTORY_ID:
-                setCustomConversionFactoryId((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public void eUnset(int featureID)
-    {
-        switch (featureID)
-        {
-            case ComponentMappingPackage.ATTRIBUTE_TO_PROPERTY_MAPPING__PROPERTY_NAME:
-                setPropertyName(PROPERTY_NAME_EDEFAULT);
-                return;
-            case ComponentMappingPackage.ATTRIBUTE_TO_PROPERTY_MAPPING__EL_ALLOWED:
-                setElAllowed(EL_ALLOWED_EDEFAULT);
-                return;
-            case ComponentMappingPackage.ATTRIBUTE_TO_PROPERTY_MAPPING__CUSTOM_CONVERSION_FACTORY_ID:
-                setCustomConversionFactoryId(CUSTOM_CONVERSION_FACTORY_ID_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public boolean eIsSet(int featureID)
-    {
-        switch (featureID)
-        {
-            case ComponentMappingPackage.ATTRIBUTE_TO_PROPERTY_MAPPING__PROPERTY_NAME:
-                return PROPERTY_NAME_EDEFAULT == null ? propertyName != null : !PROPERTY_NAME_EDEFAULT.equals(propertyName);
-            case ComponentMappingPackage.ATTRIBUTE_TO_PROPERTY_MAPPING__EL_ALLOWED:
-                return elAllowed != EL_ALLOWED_EDEFAULT;
-            case ComponentMappingPackage.ATTRIBUTE_TO_PROPERTY_MAPPING__CUSTOM_CONVERSION_FACTORY_ID:
-                return CUSTOM_CONVERSION_FACTORY_ID_EDEFAULT == null ? customConversionFactoryId != null : !CUSTOM_CONVERSION_FACTORY_ID_EDEFAULT.equals(customConversionFactoryId);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public String toString()
-    {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (propertyName: "); //$NON-NLS-1$
-        result.append(propertyName);
-        result.append(", elAllowed: "); //$NON-NLS-1$
-        result.append(elAllowed);
-        result.append(", customConversionFactoryId: "); //$NON-NLS-1$
-        result.append(customConversionFactoryId);
-        result.append(')');
-        return result.toString();
-    }
-
-} //AttributeToPropertyMappingImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/mapping/viewmapping/impl/ClassTypeInfo_Impl.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/mapping/viewmapping/impl/ClassTypeInfo_Impl.java
deleted file mode 100644
index c81344b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/mapping/viewmapping/impl/ClassTypeInfo_Impl.java
+++ /dev/null
@@ -1,264 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ClassTypeInfo_Impl.java,v 1.2 2008/11/18 22:23:57 gkessler Exp $
- */
-package org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-
-import org.eclipse.emf.common.util.EList;
-
-import org.eclipse.emf.ecore.EClass;
-
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-
-import org.eclipse.emf.ecore.util.EDataTypeUniqueEList;
-
-import org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ClassTypeInfo_;
-import org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ComponentMappingPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Class Type Info </b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.impl.ClassTypeInfo_Impl#getClassName <em>Class Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.impl.ClassTypeInfo_Impl#getSuperClasses <em>Super Classes</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.impl.ClassTypeInfo_Impl#getInterfaces <em>Interfaces</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ClassTypeInfo_Impl extends EObjectImpl implements ClassTypeInfo_
-{
-    /**
-     * The default value of the '{@link #getClassName() <em>Class Name</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getClassName()
-     * @generated
-     * @ordered
-     */
-    protected static final String CLASS_NAME_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getClassName() <em>Class Name</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getClassName()
-     * @generated
-     * @ordered
-     */
-    protected String className = CLASS_NAME_EDEFAULT;
-
-    /**
-     * The cached value of the '{@link #getSuperClasses() <em>Super Classes</em>}' attribute list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getSuperClasses()
-     * @generated
-     * @ordered
-     */
-    protected EList<String> superClasses;
-
-    /**
-     * The cached value of the '{@link #getInterfaces() <em>Interfaces</em>}' attribute list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getInterfaces()
-     * @generated
-     * @ordered
-     */
-    protected EList<String> interfaces;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected ClassTypeInfo_Impl()
-    {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    protected EClass eStaticClass()
-    {
-        return ComponentMappingPackage.Literals.CLASS_TYPE_INFO_;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String getClassName()
-    {
-        return className;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setClassName(String newClassName)
-    {
-        String oldClassName = className;
-        className = newClassName;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, ComponentMappingPackage.CLASS_TYPE_INFO___CLASS_NAME, oldClassName, className));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EList<String> getSuperClasses()
-    {
-        if (superClasses == null)
-        {
-            superClasses = new EDataTypeUniqueEList<String>(String.class, this, ComponentMappingPackage.CLASS_TYPE_INFO___SUPER_CLASSES);
-        }
-        return superClasses;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EList<String> getInterfaces()
-    {
-        if (interfaces == null)
-        {
-            interfaces = new EDataTypeUniqueEList<String>(String.class, this, ComponentMappingPackage.CLASS_TYPE_INFO___INTERFACES);
-        }
-        return interfaces;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public Object eGet(int featureID, boolean resolve, boolean coreType)
-    {
-        switch (featureID)
-        {
-            case ComponentMappingPackage.CLASS_TYPE_INFO___CLASS_NAME:
-                return getClassName();
-            case ComponentMappingPackage.CLASS_TYPE_INFO___SUPER_CLASSES:
-                return getSuperClasses();
-            case ComponentMappingPackage.CLASS_TYPE_INFO___INTERFACES:
-                return getInterfaces();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @SuppressWarnings("unchecked")
-    @Override
-    public void eSet(int featureID, Object newValue)
-    {
-        switch (featureID)
-        {
-            case ComponentMappingPackage.CLASS_TYPE_INFO___CLASS_NAME:
-                setClassName((String)newValue);
-                return;
-            case ComponentMappingPackage.CLASS_TYPE_INFO___SUPER_CLASSES:
-                getSuperClasses().clear();
-                getSuperClasses().addAll((Collection<? extends String>)newValue);
-                return;
-            case ComponentMappingPackage.CLASS_TYPE_INFO___INTERFACES:
-                getInterfaces().clear();
-                getInterfaces().addAll((Collection<? extends String>)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public void eUnset(int featureID)
-    {
-        switch (featureID)
-        {
-            case ComponentMappingPackage.CLASS_TYPE_INFO___CLASS_NAME:
-                setClassName(CLASS_NAME_EDEFAULT);
-                return;
-            case ComponentMappingPackage.CLASS_TYPE_INFO___SUPER_CLASSES:
-                getSuperClasses().clear();
-                return;
-            case ComponentMappingPackage.CLASS_TYPE_INFO___INTERFACES:
-                getInterfaces().clear();
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public boolean eIsSet(int featureID)
-    {
-        switch (featureID)
-        {
-            case ComponentMappingPackage.CLASS_TYPE_INFO___CLASS_NAME:
-                return CLASS_NAME_EDEFAULT == null ? className != null : !CLASS_NAME_EDEFAULT.equals(className);
-            case ComponentMappingPackage.CLASS_TYPE_INFO___SUPER_CLASSES:
-                return superClasses != null && !superClasses.isEmpty();
-            case ComponentMappingPackage.CLASS_TYPE_INFO___INTERFACES:
-                return interfaces != null && !interfaces.isEmpty();
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public String toString()
-    {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (className: "); //$NON-NLS-1$
-        result.append(className);
-        result.append(", superClasses: "); //$NON-NLS-1$
-        result.append(superClasses);
-        result.append(", interfaces: "); //$NON-NLS-1$
-        result.append(interfaces);
-        result.append(')');
-        return result.toString();
-    }
-
-} //ClassTypeInfo_Impl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/mapping/viewmapping/impl/ComponentMappingFactoryImpl.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/mapping/viewmapping/impl/ComponentMappingFactoryImpl.java
deleted file mode 100644
index 82bce6e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/mapping/viewmapping/impl/ComponentMappingFactoryImpl.java
+++ /dev/null
@@ -1,184 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ComponentMappingFactoryImpl.java,v 1.2 2008/11/18 22:23:57 gkessler Exp $
- */
-package org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EPackage;
-
-import org.eclipse.emf.ecore.impl.EFactoryImpl;
-
-import org.eclipse.emf.ecore.plugin.EcorePlugin;
-
-import org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.*;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model <b>Factory</b>.
- * <!-- end-user-doc -->
- * @generated
- */
-public class ComponentMappingFactoryImpl extends EFactoryImpl implements ComponentMappingFactory
-{
-    /**
-     * Creates the default factory implementation.
-     * <!-- begin-user-doc -->
-     * @return the factory
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public static ComponentMappingFactory init()
-    {
-        try
-        {
-            ComponentMappingFactory theComponentMappingFactory = (ComponentMappingFactory)EPackage.Registry.INSTANCE.getEFactory("http://org.eclipse.jst.jsf.core/componentMapping.ecore");  //$NON-NLS-1$
-            if (theComponentMappingFactory != null)
-            {
-                return theComponentMappingFactory;
-            }
-        }
-        catch (Exception exception)
-        {
-            EcorePlugin.INSTANCE.log(exception);
-        }
-        return new ComponentMappingFactoryImpl();
-    }
-
-    /**
-     * Creates an instance of the factory.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public ComponentMappingFactoryImpl()
-    {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public EObject create(EClass eClass)
-    {
-        switch (eClass.getClassifierID())
-        {
-            case ComponentMappingPackage.TAG_MAPPING: return createTagMapping();
-            case ComponentMappingPackage.TAG_TO_VIEW_OBJECT_MAPPING: return createTagToViewObjectMapping();
-            case ComponentMappingPackage.CLASS_TYPE_INFO_: return createClassTypeInfo_();
-            case ComponentMappingPackage.COMPONENT_TYPE_INFO_: return createComponentTypeInfo_();
-            case ComponentMappingPackage.CONVERTER_TYPE_INFO_: return createConverterTypeInfo_();
-            case ComponentMappingPackage.VALIDATOR_TYPE_INFO_: return createValidatorTypeInfo_();
-            case ComponentMappingPackage.ATTRIBUTE_TO_PROPERTY_MAPPING: return createAttributeToPropertyMapping();
-            default:
-                throw new IllegalArgumentException("The class '" + eClass.getName() + "' is not a valid classifier"); //$NON-NLS-1$ //$NON-NLS-2$
-        }
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public TagMapping createTagMapping()
-    {
-        TagMappingImpl tagMapping = new TagMappingImpl();
-        return tagMapping;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public TagToViewObjectMapping createTagToViewObjectMapping()
-    {
-        TagToViewObjectMappingImpl tagToViewObjectMapping = new TagToViewObjectMappingImpl();
-        return tagToViewObjectMapping;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public ClassTypeInfo_ createClassTypeInfo_()
-    {
-        ClassTypeInfo_Impl classTypeInfo_ = new ClassTypeInfo_Impl();
-        return classTypeInfo_;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public ComponentTypeInfo_ createComponentTypeInfo_()
-    {
-        ComponentTypeInfo_Impl componentTypeInfo_ = new ComponentTypeInfo_Impl();
-        return componentTypeInfo_;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public ConverterTypeInfo_ createConverterTypeInfo_()
-    {
-        ConverterTypeInfo_Impl converterTypeInfo_ = new ConverterTypeInfo_Impl();
-        return converterTypeInfo_;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public ValidatorTypeInfo_ createValidatorTypeInfo_()
-    {
-        ValidatorTypeInfo_Impl validatorTypeInfo_ = new ValidatorTypeInfo_Impl();
-        return validatorTypeInfo_;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public AttributeToPropertyMapping createAttributeToPropertyMapping()
-    {
-        AttributeToPropertyMappingImpl attributeToPropertyMapping = new AttributeToPropertyMappingImpl();
-        return attributeToPropertyMapping;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public ComponentMappingPackage getComponentMappingPackage()
-    {
-        return (ComponentMappingPackage)getEPackage();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return  the package
-     * <!-- end-user-doc -->
-     * @deprecated
-     * @generated
-     */
-    @Deprecated
-    public static ComponentMappingPackage getPackage()
-    {
-        return ComponentMappingPackage.eINSTANCE;
-    }
-
-} //ComponentMappingFactoryImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/mapping/viewmapping/impl/ComponentMappingPackageImpl.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/mapping/viewmapping/impl/ComponentMappingPackageImpl.java
deleted file mode 100644
index 3debd70..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/mapping/viewmapping/impl/ComponentMappingPackageImpl.java
+++ /dev/null
@@ -1,699 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ComponentMappingPackageImpl.java,v 1.2 2008/11/18 22:23:57 gkessler Exp $
- */
-package org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.impl;
-
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EOperation;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.EReference;
-import org.eclipse.emf.ecore.impl.EPackageImpl;
-import org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.AttributeToPropertyMapping;
-import org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ClassTypeInfo_;
-import org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ComponentMappingFactory;
-import org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ComponentMappingPackage;
-import org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ComponentTypeInfo_;
-import org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ConverterTypeInfo_;
-import org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.TagMapping;
-import org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.TagToViewObjectMapping;
-import org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ValidatorTypeInfo_;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model <b>Package</b>.
- * <!-- end-user-doc -->
- * @generated
- */
-public class ComponentMappingPackageImpl extends EPackageImpl implements ComponentMappingPackage
-{
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass tagMappingEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass tagToViewObjectMappingEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass classTypeInfo_EClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass componentTypeInfo_EClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass converterTypeInfo_EClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass validatorTypeInfo_EClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass attributeToPropertyMappingEClass = null;
-
-    /**
-     * Creates an instance of the model <b>Package</b>, registered with
-     * {@link org.eclipse.emf.ecore.EPackage.Registry EPackage.Registry} by the package
-     * package URI value.
-     * <p>Note: the correct way to create the package is via the static
-     * factory method {@link #init init()}, which also performs
-     * initialization of the package, or returns the registered package,
-     * if one already exists.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.emf.ecore.EPackage.Registry
-     * @see org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ComponentMappingPackage#eNS_URI
-     * @see #init()
-     * @generated
-     */
-    private ComponentMappingPackageImpl()
-    {
-        super(eNS_URI, ComponentMappingFactory.eINSTANCE);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private static boolean isInited = false;
-
-    /**
-     * Creates, registers, and initializes the <b>Package</b> for this
-     * model, and for any others upon which it depends.  Simple
-     * dependencies are satisfied by calling this method on all
-     * dependent packages before doing anything else.  This method drives
-     * initialization for interdependent packages directly, in parallel
-     * with this package, itself.
-     * <p>Of this package and its interdependencies, all packages which
-     * have not yet been registered by their URI values are first created
-     * and registered.  The packages are then initialized in two steps:
-     * meta-model objects for all of the packages are created before any
-     * are initialized, since one package's meta-model objects may refer to
-     * those of another.
-     * <p>Invocation of this method will not affect any packages that have
-     * already been initialized.
-     * <!-- begin-user-doc -->
-     * @return the initialized package 
-     * <!-- end-user-doc -->
-     * @see #eNS_URI
-     * @see #createPackageContents()
-     * @see #initializePackageContents()
-     * @generated
-     */
-    public static ComponentMappingPackage init()
-    {
-        if (isInited) return (ComponentMappingPackage)EPackage.Registry.INSTANCE.getEPackage(ComponentMappingPackage.eNS_URI);
-
-        // Obtain or create and register package
-        ComponentMappingPackageImpl theComponentMappingPackage = (ComponentMappingPackageImpl)(EPackage.Registry.INSTANCE.getEPackage(eNS_URI) instanceof ComponentMappingPackageImpl ? EPackage.Registry.INSTANCE.getEPackage(eNS_URI) : new ComponentMappingPackageImpl());
-
-        isInited = true;
-
-        // Create package meta-data objects
-        theComponentMappingPackage.createPackageContents();
-
-        // Initialize created meta-data
-        theComponentMappingPackage.initializePackageContents();
-
-        // Mark meta-data to indicate it can't be changed
-        theComponentMappingPackage.freeze();
-
-        return theComponentMappingPackage;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getTagMapping()
-    {
-        return tagMappingEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EReference getTagMapping_VersionedTagToViewMappings()
-    {
-        return (EReference)tagMappingEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getTagMapping_CustomConversionFactoryId()
-    {
-        return (EAttribute)tagMappingEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getTagMapping_BeanMappedProperties()
-    {
-        return (EAttribute)tagMappingEClass.getEStructuralFeatures().get(2);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getTagToViewObjectMapping()
-    {
-        return tagToViewObjectMappingEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EReference getTagToViewObjectMapping_TypeInfo()
-    {
-        return (EReference)tagToViewObjectMappingEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getTagToViewObjectMapping_MinJSFVersion()
-    {
-        return (EAttribute)tagToViewObjectMappingEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getTagToViewObjectMapping_MinLibraryVersion()
-    {
-        return (EAttribute)tagToViewObjectMappingEClass.getEStructuralFeatures().get(2);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getClassTypeInfo_()
-    {
-        return classTypeInfo_EClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getClassTypeInfo__ClassName()
-    {
-        return (EAttribute)classTypeInfo_EClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getClassTypeInfo__SuperClasses()
-    {
-        return (EAttribute)classTypeInfo_EClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getClassTypeInfo__Interfaces()
-    {
-        return (EAttribute)classTypeInfo_EClass.getEStructuralFeatures().get(2);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getComponentTypeInfo_()
-    {
-        return componentTypeInfo_EClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getComponentTypeInfo__ComponentType()
-    {
-        return (EAttribute)componentTypeInfo_EClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getComponentTypeInfo__ComponentFamily()
-    {
-        return (EAttribute)componentTypeInfo_EClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getComponentTypeInfo__RenderType()
-    {
-        return (EAttribute)componentTypeInfo_EClass.getEStructuralFeatures().get(2);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getConverterTypeInfo_()
-    {
-        return converterTypeInfo_EClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getConverterTypeInfo__ConverterId()
-    {
-        return (EAttribute)converterTypeInfo_EClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getConverterTypeInfo__ForClasses()
-    {
-        return (EAttribute)converterTypeInfo_EClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getValidatorTypeInfo_()
-    {
-        return validatorTypeInfo_EClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getValidatorTypeInfo__ValidatorId()
-    {
-        return (EAttribute)validatorTypeInfo_EClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getAttributeToPropertyMapping()
-    {
-        return attributeToPropertyMappingEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getAttributeToPropertyMapping_PropertyName()
-    {
-        return (EAttribute)attributeToPropertyMappingEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getAttributeToPropertyMapping_ElAllowed()
-    {
-        return (EAttribute)attributeToPropertyMappingEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getAttributeToPropertyMapping_CustomConversionFactoryId()
-    {
-        return (EAttribute)attributeToPropertyMappingEClass.getEStructuralFeatures().get(2);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public ComponentMappingFactory getComponentMappingFactory()
-    {
-        return (ComponentMappingFactory)getEFactoryInstance();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private boolean isCreated = false;
-
-    /**
-     * Creates the meta-model objects for the package.  This method is
-     * guarded to have no affect on any invocation but its first.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void createPackageContents()
-    {
-        if (isCreated) return;
-        isCreated = true;
-
-        // Create classes and their features
-        tagMappingEClass = createEClass(TAG_MAPPING);
-        createEReference(tagMappingEClass, TAG_MAPPING__VERSIONED_TAG_TO_VIEW_MAPPINGS);
-        createEAttribute(tagMappingEClass, TAG_MAPPING__CUSTOM_CONVERSION_FACTORY_ID);
-        createEAttribute(tagMappingEClass, TAG_MAPPING__BEAN_MAPPED_PROPERTIES);
-
-        tagToViewObjectMappingEClass = createEClass(TAG_TO_VIEW_OBJECT_MAPPING);
-        createEReference(tagToViewObjectMappingEClass, TAG_TO_VIEW_OBJECT_MAPPING__TYPE_INFO);
-        createEAttribute(tagToViewObjectMappingEClass, TAG_TO_VIEW_OBJECT_MAPPING__MIN_JSF_VERSION);
-        createEAttribute(tagToViewObjectMappingEClass, TAG_TO_VIEW_OBJECT_MAPPING__MIN_LIBRARY_VERSION);
-
-        classTypeInfo_EClass = createEClass(CLASS_TYPE_INFO_);
-        createEAttribute(classTypeInfo_EClass, CLASS_TYPE_INFO___CLASS_NAME);
-        createEAttribute(classTypeInfo_EClass, CLASS_TYPE_INFO___SUPER_CLASSES);
-        createEAttribute(classTypeInfo_EClass, CLASS_TYPE_INFO___INTERFACES);
-
-        componentTypeInfo_EClass = createEClass(COMPONENT_TYPE_INFO_);
-        createEAttribute(componentTypeInfo_EClass, COMPONENT_TYPE_INFO___COMPONENT_TYPE);
-        createEAttribute(componentTypeInfo_EClass, COMPONENT_TYPE_INFO___COMPONENT_FAMILY);
-        createEAttribute(componentTypeInfo_EClass, COMPONENT_TYPE_INFO___RENDER_TYPE);
-
-        converterTypeInfo_EClass = createEClass(CONVERTER_TYPE_INFO_);
-        createEAttribute(converterTypeInfo_EClass, CONVERTER_TYPE_INFO___CONVERTER_ID);
-        createEAttribute(converterTypeInfo_EClass, CONVERTER_TYPE_INFO___FOR_CLASSES);
-
-        validatorTypeInfo_EClass = createEClass(VALIDATOR_TYPE_INFO_);
-        createEAttribute(validatorTypeInfo_EClass, VALIDATOR_TYPE_INFO___VALIDATOR_ID);
-
-        attributeToPropertyMappingEClass = createEClass(ATTRIBUTE_TO_PROPERTY_MAPPING);
-        createEAttribute(attributeToPropertyMappingEClass, ATTRIBUTE_TO_PROPERTY_MAPPING__PROPERTY_NAME);
-        createEAttribute(attributeToPropertyMappingEClass, ATTRIBUTE_TO_PROPERTY_MAPPING__EL_ALLOWED);
-        createEAttribute(attributeToPropertyMappingEClass, ATTRIBUTE_TO_PROPERTY_MAPPING__CUSTOM_CONVERSION_FACTORY_ID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private boolean isInitialized = false;
-
-    /**
-     * Complete the initialization of the package and its meta-model.  This
-     * method is guarded to have no affect on any invocation but its first.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void initializePackageContents()
-    {
-        if (isInitialized) return;
-        isInitialized = true;
-
-        // Initialize package
-        setName(eNAME);
-        setNsPrefix(eNS_PREFIX);
-        setNsURI(eNS_URI);
-
-        // Create type parameters
-
-        // Set bounds for type parameters
-
-        // Add supertypes to classes
-        componentTypeInfo_EClass.getESuperTypes().add(this.getClassTypeInfo_());
-        converterTypeInfo_EClass.getESuperTypes().add(this.getClassTypeInfo_());
-        validatorTypeInfo_EClass.getESuperTypes().add(this.getClassTypeInfo_());
-
-        // Initialize classes and features; add operations and parameters
-        initEClass(tagMappingEClass, TagMapping.class, "TagMapping", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-        initEReference(getTagMapping_VersionedTagToViewMappings(), this.getTagToViewObjectMapping(), null, "versionedTagToViewMappings", null, 0, -1, TagMapping.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-        initEAttribute(getTagMapping_CustomConversionFactoryId(), ecorePackage.getEString(), "customConversionFactoryId", null, 0, 1, TagMapping.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-        initEAttribute(getTagMapping_BeanMappedProperties(), ecorePackage.getEString(), "beanMappedProperties", "", 0, -1, TagMapping.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$
-
-        EOperation op = addEOperation(tagMappingEClass, null, "findBestMapping", 0, 1, IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
-        addEParameter(op, ecorePackage.getEString(), "jsfVersion", 0, 1, IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
-        addEParameter(op, ecorePackage.getEString(), "libVersion", 0, 1, IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
-
-        initEClass(tagToViewObjectMappingEClass, TagToViewObjectMapping.class, "TagToViewObjectMapping", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-        initEReference(getTagToViewObjectMapping_TypeInfo(), this.getClassTypeInfo_(), null, "typeInfo", null, 0, 1, TagToViewObjectMapping.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-        initEAttribute(getTagToViewObjectMapping_MinJSFVersion(), ecorePackage.getEString(), "minJSFVersion", "1.1", 0, 1, TagToViewObjectMapping.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$
-        initEAttribute(getTagToViewObjectMapping_MinLibraryVersion(), ecorePackage.getEString(), "minLibraryVersion", "", 0, 1, TagToViewObjectMapping.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$
-
-        initEClass(classTypeInfo_EClass, ClassTypeInfo_.class, "ClassTypeInfo_", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-        initEAttribute(getClassTypeInfo__ClassName(), ecorePackage.getEString(), "className", null, 0, 1, ClassTypeInfo_.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-        initEAttribute(getClassTypeInfo__SuperClasses(), ecorePackage.getEString(), "superClasses", null, 0, -1, ClassTypeInfo_.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-        initEAttribute(getClassTypeInfo__Interfaces(), ecorePackage.getEString(), "interfaces", null, 0, -1, ClassTypeInfo_.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-        initEClass(componentTypeInfo_EClass, ComponentTypeInfo_.class, "ComponentTypeInfo_", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-        initEAttribute(getComponentTypeInfo__ComponentType(), ecorePackage.getEString(), "componentType", null, 0, 1, ComponentTypeInfo_.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-        initEAttribute(getComponentTypeInfo__ComponentFamily(), ecorePackage.getEString(), "componentFamily", null, 0, 1, ComponentTypeInfo_.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-        initEAttribute(getComponentTypeInfo__RenderType(), ecorePackage.getEString(), "renderType", null, 0, 1, ComponentTypeInfo_.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-        initEClass(converterTypeInfo_EClass, ConverterTypeInfo_.class, "ConverterTypeInfo_", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-        initEAttribute(getConverterTypeInfo__ConverterId(), ecorePackage.getEString(), "converterId", null, 0, 1, ConverterTypeInfo_.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-        initEAttribute(getConverterTypeInfo__ForClasses(), ecorePackage.getEString(), "forClasses", null, 0, -1, ConverterTypeInfo_.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-        initEClass(validatorTypeInfo_EClass, ValidatorTypeInfo_.class, "ValidatorTypeInfo_", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-        initEAttribute(getValidatorTypeInfo__ValidatorId(), ecorePackage.getEString(), "validatorId", null, 0, 1, ValidatorTypeInfo_.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-        initEClass(attributeToPropertyMappingEClass, AttributeToPropertyMapping.class, "AttributeToPropertyMapping", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-        initEAttribute(getAttributeToPropertyMapping_PropertyName(), ecorePackage.getEString(), "propertyName", null, 0, 1, AttributeToPropertyMapping.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-        initEAttribute(getAttributeToPropertyMapping_ElAllowed(), ecorePackage.getEBoolean(), "elAllowed", "true", 0, 1, AttributeToPropertyMapping.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$
-        initEAttribute(getAttributeToPropertyMapping_CustomConversionFactoryId(), ecorePackage.getEString(), "customConversionFactoryId", null, 0, 1, AttributeToPropertyMapping.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-        // Create resource
-        createResource(eNS_URI);
-
-        // Create annotations
-        // http:///org/eclipse/emf/ecore/util/ExtendedMetaData
-        createExtendedMetaDataAnnotations();
-    }
-
-    /**
-     * Initializes the annotations for <b>http:///org/eclipse/emf/ecore/util/ExtendedMetaData</b>.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected void createExtendedMetaDataAnnotations()
-    {
-        String source = "http:///org/eclipse/emf/ecore/util/ExtendedMetaData";		 //$NON-NLS-1$
-        addAnnotation
-          (getTagMapping_VersionedTagToViewMappings(), 
-           source, 
-           new String[] 
-           {
-             "kind", "element", //$NON-NLS-1$ //$NON-NLS-2$
-             "name", "versionedTagToViewMappings" //$NON-NLS-1$ //$NON-NLS-2$
-           });		
-        addAnnotation
-          (getTagMapping_CustomConversionFactoryId(), 
-           source, 
-           new String[] 
-           {
-             "kind", "element", //$NON-NLS-1$ //$NON-NLS-2$
-             "name", "customConversionFactoryId" //$NON-NLS-1$ //$NON-NLS-2$
-           });		
-        addAnnotation
-          (getTagMapping_BeanMappedProperties(), 
-           source, 
-           new String[] 
-           {
-             "kind", "element", //$NON-NLS-1$ //$NON-NLS-2$
-             "name", "beanMappedProperties" //$NON-NLS-1$ //$NON-NLS-2$
-           });		
-        addAnnotation
-          (getTagToViewObjectMapping_TypeInfo(), 
-           source, 
-           new String[] 
-           {
-             "kind", "element", //$NON-NLS-1$ //$NON-NLS-2$
-             "name", "typeInfo" //$NON-NLS-1$ //$NON-NLS-2$
-           });		
-        addAnnotation
-          (getTagToViewObjectMapping_MinJSFVersion(), 
-           source, 
-           new String[] 
-           {
-             "kind", "element", //$NON-NLS-1$ //$NON-NLS-2$
-             "name", "minVersion" //$NON-NLS-1$ //$NON-NLS-2$
-           });		
-        addAnnotation
-          (getTagToViewObjectMapping_MinLibraryVersion(), 
-           source, 
-           new String[] 
-           {
-             "kind", "element", //$NON-NLS-1$ //$NON-NLS-2$
-             "name", "minLibraryVersion" //$NON-NLS-1$ //$NON-NLS-2$
-           });		
-        addAnnotation
-          (getClassTypeInfo__ClassName(), 
-           source, 
-           new String[] 
-           {
-             "kind", "element", //$NON-NLS-1$ //$NON-NLS-2$
-             "name", "className" //$NON-NLS-1$ //$NON-NLS-2$
-           });		
-        addAnnotation
-          (getClassTypeInfo__SuperClasses(), 
-           source, 
-           new String[] 
-           {
-             "kind", "element", //$NON-NLS-1$ //$NON-NLS-2$
-             "name", "superClasses" //$NON-NLS-1$ //$NON-NLS-2$
-           });		
-        addAnnotation
-          (getClassTypeInfo__Interfaces(), 
-           source, 
-           new String[] 
-           {
-             "kind", "element", //$NON-NLS-1$ //$NON-NLS-2$
-             "name", "interfaces" //$NON-NLS-1$ //$NON-NLS-2$
-           });		
-        addAnnotation
-          (getComponentTypeInfo__ComponentType(), 
-           source, 
-           new String[] 
-           {
-             "kind", "element", //$NON-NLS-1$ //$NON-NLS-2$
-             "name", "componentType" //$NON-NLS-1$ //$NON-NLS-2$
-           });		
-        addAnnotation
-          (getComponentTypeInfo__ComponentFamily(), 
-           source, 
-           new String[] 
-           {
-             "kind", "element", //$NON-NLS-1$ //$NON-NLS-2$
-             "name", "componentFamily" //$NON-NLS-1$ //$NON-NLS-2$
-           });		
-        addAnnotation
-          (getComponentTypeInfo__RenderType(), 
-           source, 
-           new String[] 
-           {
-             "kind", "element", //$NON-NLS-1$ //$NON-NLS-2$
-             "name", "renderType" //$NON-NLS-1$ //$NON-NLS-2$
-           });		
-        addAnnotation
-          (getConverterTypeInfo__ConverterId(), 
-           source, 
-           new String[] 
-           {
-             "kind", "element", //$NON-NLS-1$ //$NON-NLS-2$
-             "name", "converterId" //$NON-NLS-1$ //$NON-NLS-2$
-           });		
-        addAnnotation
-          (getConverterTypeInfo__ForClasses(), 
-           source, 
-           new String[] 
-           {
-             "kind", "element", //$NON-NLS-1$ //$NON-NLS-2$
-             "name", "forClass" //$NON-NLS-1$ //$NON-NLS-2$
-           });		
-        addAnnotation
-          (getValidatorTypeInfo__ValidatorId(), 
-           source, 
-           new String[] 
-           {
-             "kind", "element", //$NON-NLS-1$ //$NON-NLS-2$
-             "name", "validatorId" //$NON-NLS-1$ //$NON-NLS-2$
-           });		
-        addAnnotation
-          (getAttributeToPropertyMapping_PropertyName(), 
-           source, 
-           new String[] 
-           {
-             "kind", "element", //$NON-NLS-1$ //$NON-NLS-2$
-             "name", "propertyName" //$NON-NLS-1$ //$NON-NLS-2$
-           });		
-        addAnnotation
-          (getAttributeToPropertyMapping_ElAllowed(), 
-           source, 
-           new String[] 
-           {
-             "kind", "element", //$NON-NLS-1$ //$NON-NLS-2$
-             "name", "elAllowed" //$NON-NLS-1$ //$NON-NLS-2$
-           });		
-        addAnnotation
-          (getAttributeToPropertyMapping_CustomConversionFactoryId(), 
-           source, 
-           new String[] 
-           {
-             "kind", "element", //$NON-NLS-1$ //$NON-NLS-2$
-             "name", "customConversionFactoryId" //$NON-NLS-1$ //$NON-NLS-2$
-           });
-    }
-
-} //ComponentMappingPackageImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/mapping/viewmapping/impl/ComponentTypeInfo_Impl.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/mapping/viewmapping/impl/ComponentTypeInfo_Impl.java
deleted file mode 100644
index ac318c8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/mapping/viewmapping/impl/ComponentTypeInfo_Impl.java
+++ /dev/null
@@ -1,292 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ComponentTypeInfo_Impl.java,v 1.2 2008/11/18 22:23:57 gkessler Exp $
- */
-package org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-
-import org.eclipse.emf.ecore.EClass;
-
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-
-import org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ComponentMappingPackage;
-import org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ComponentTypeInfo_;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Component Type Info </b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.impl.ComponentTypeInfo_Impl#getComponentType <em>Component Type</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.impl.ComponentTypeInfo_Impl#getComponentFamily <em>Component Family</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.impl.ComponentTypeInfo_Impl#getRenderType <em>Render Type</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ComponentTypeInfo_Impl extends ClassTypeInfo_Impl implements ComponentTypeInfo_
-{
-    /**
-     * The default value of the '{@link #getComponentType() <em>Component Type</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getComponentType()
-     * @generated
-     * @ordered
-     */
-    protected static final String COMPONENT_TYPE_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getComponentType() <em>Component Type</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getComponentType()
-     * @generated
-     * @ordered
-     */
-    protected String componentType = COMPONENT_TYPE_EDEFAULT;
-
-    /**
-     * The default value of the '{@link #getComponentFamily() <em>Component Family</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getComponentFamily()
-     * @generated
-     * @ordered
-     */
-    protected static final String COMPONENT_FAMILY_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getComponentFamily() <em>Component Family</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getComponentFamily()
-     * @generated
-     * @ordered
-     */
-    protected String componentFamily = COMPONENT_FAMILY_EDEFAULT;
-
-    /**
-     * The default value of the '{@link #getRenderType() <em>Render Type</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getRenderType()
-     * @generated
-     * @ordered
-     */
-    protected static final String RENDER_TYPE_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getRenderType() <em>Render Type</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getRenderType()
-     * @generated
-     * @ordered
-     */
-    protected String renderType = RENDER_TYPE_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected ComponentTypeInfo_Impl()
-    {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    protected EClass eStaticClass()
-    {
-        return ComponentMappingPackage.Literals.COMPONENT_TYPE_INFO_;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String getComponentType()
-    {
-        return componentType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setComponentType(String newComponentType)
-    {
-        String oldComponentType = componentType;
-        componentType = newComponentType;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, ComponentMappingPackage.COMPONENT_TYPE_INFO___COMPONENT_TYPE, oldComponentType, componentType));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String getComponentFamily()
-    {
-        return componentFamily;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setComponentFamily(String newComponentFamily)
-    {
-        String oldComponentFamily = componentFamily;
-        componentFamily = newComponentFamily;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, ComponentMappingPackage.COMPONENT_TYPE_INFO___COMPONENT_FAMILY, oldComponentFamily, componentFamily));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String getRenderType()
-    {
-        return renderType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setRenderType(String newRenderType)
-    {
-        String oldRenderType = renderType;
-        renderType = newRenderType;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, ComponentMappingPackage.COMPONENT_TYPE_INFO___RENDER_TYPE, oldRenderType, renderType));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public Object eGet(int featureID, boolean resolve, boolean coreType)
-    {
-        switch (featureID)
-        {
-            case ComponentMappingPackage.COMPONENT_TYPE_INFO___COMPONENT_TYPE:
-                return getComponentType();
-            case ComponentMappingPackage.COMPONENT_TYPE_INFO___COMPONENT_FAMILY:
-                return getComponentFamily();
-            case ComponentMappingPackage.COMPONENT_TYPE_INFO___RENDER_TYPE:
-                return getRenderType();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public void eSet(int featureID, Object newValue)
-    {
-        switch (featureID)
-        {
-            case ComponentMappingPackage.COMPONENT_TYPE_INFO___COMPONENT_TYPE:
-                setComponentType((String)newValue);
-                return;
-            case ComponentMappingPackage.COMPONENT_TYPE_INFO___COMPONENT_FAMILY:
-                setComponentFamily((String)newValue);
-                return;
-            case ComponentMappingPackage.COMPONENT_TYPE_INFO___RENDER_TYPE:
-                setRenderType((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public void eUnset(int featureID)
-    {
-        switch (featureID)
-        {
-            case ComponentMappingPackage.COMPONENT_TYPE_INFO___COMPONENT_TYPE:
-                setComponentType(COMPONENT_TYPE_EDEFAULT);
-                return;
-            case ComponentMappingPackage.COMPONENT_TYPE_INFO___COMPONENT_FAMILY:
-                setComponentFamily(COMPONENT_FAMILY_EDEFAULT);
-                return;
-            case ComponentMappingPackage.COMPONENT_TYPE_INFO___RENDER_TYPE:
-                setRenderType(RENDER_TYPE_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public boolean eIsSet(int featureID)
-    {
-        switch (featureID)
-        {
-            case ComponentMappingPackage.COMPONENT_TYPE_INFO___COMPONENT_TYPE:
-                return COMPONENT_TYPE_EDEFAULT == null ? componentType != null : !COMPONENT_TYPE_EDEFAULT.equals(componentType);
-            case ComponentMappingPackage.COMPONENT_TYPE_INFO___COMPONENT_FAMILY:
-                return COMPONENT_FAMILY_EDEFAULT == null ? componentFamily != null : !COMPONENT_FAMILY_EDEFAULT.equals(componentFamily);
-            case ComponentMappingPackage.COMPONENT_TYPE_INFO___RENDER_TYPE:
-                return RENDER_TYPE_EDEFAULT == null ? renderType != null : !RENDER_TYPE_EDEFAULT.equals(renderType);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public String toString()
-    {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (componentType: "); //$NON-NLS-1$
-        result.append(componentType);
-        result.append(", componentFamily: "); //$NON-NLS-1$
-        result.append(componentFamily);
-        result.append(", renderType: "); //$NON-NLS-1$
-        result.append(renderType);
-        result.append(')');
-        return result.toString();
-    }
-
-} //ComponentTypeInfo_Impl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/mapping/viewmapping/impl/ConverterTypeInfo_Impl.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/mapping/viewmapping/impl/ConverterTypeInfo_Impl.java
deleted file mode 100644
index 53387ea..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/mapping/viewmapping/impl/ConverterTypeInfo_Impl.java
+++ /dev/null
@@ -1,222 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ConverterTypeInfo_Impl.java,v 1.2 2008/11/18 22:23:57 gkessler Exp $
- */
-package org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.impl;
-
-import java.util.Collection;
-import org.eclipse.emf.common.notify.Notification;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-
-import org.eclipse.emf.ecore.util.EDataTypeUniqueEList;
-import org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ComponentMappingPackage;
-import org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ConverterTypeInfo_;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Converter Type Info </b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.impl.ConverterTypeInfo_Impl#getConverterId <em>Converter Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.impl.ConverterTypeInfo_Impl#getForClasses <em>For Classes</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ConverterTypeInfo_Impl extends ClassTypeInfo_Impl implements ConverterTypeInfo_
-{
-    /**
-     * The default value of the '{@link #getConverterId() <em>Converter Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getConverterId()
-     * @generated
-     * @ordered
-     */
-    protected static final String CONVERTER_ID_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getConverterId() <em>Converter Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getConverterId()
-     * @generated
-     * @ordered
-     */
-    protected String converterId = CONVERTER_ID_EDEFAULT;
-
-    /**
-     * The cached value of the '{@link #getForClasses() <em>For Classes</em>}' attribute list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getForClasses()
-     * @generated
-     * @ordered
-     */
-    protected EList<String> forClasses;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected ConverterTypeInfo_Impl()
-    {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    protected EClass eStaticClass()
-    {
-        return ComponentMappingPackage.Literals.CONVERTER_TYPE_INFO_;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String getConverterId()
-    {
-        return converterId;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setConverterId(String newConverterId)
-    {
-        String oldConverterId = converterId;
-        converterId = newConverterId;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, ComponentMappingPackage.CONVERTER_TYPE_INFO___CONVERTER_ID, oldConverterId, converterId));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EList<String> getForClasses()
-    {
-        if (forClasses == null)
-        {
-            forClasses = new EDataTypeUniqueEList<String>(String.class, this, ComponentMappingPackage.CONVERTER_TYPE_INFO___FOR_CLASSES);
-        }
-        return forClasses;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public Object eGet(int featureID, boolean resolve, boolean coreType)
-    {
-        switch (featureID)
-        {
-            case ComponentMappingPackage.CONVERTER_TYPE_INFO___CONVERTER_ID:
-                return getConverterId();
-            case ComponentMappingPackage.CONVERTER_TYPE_INFO___FOR_CLASSES:
-                return getForClasses();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @SuppressWarnings("unchecked")
-    @Override
-    public void eSet(int featureID, Object newValue)
-    {
-        switch (featureID)
-        {
-            case ComponentMappingPackage.CONVERTER_TYPE_INFO___CONVERTER_ID:
-                setConverterId((String)newValue);
-                return;
-            case ComponentMappingPackage.CONVERTER_TYPE_INFO___FOR_CLASSES:
-                getForClasses().clear();
-                getForClasses().addAll((Collection<? extends String>)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public void eUnset(int featureID)
-    {
-        switch (featureID)
-        {
-            case ComponentMappingPackage.CONVERTER_TYPE_INFO___CONVERTER_ID:
-                setConverterId(CONVERTER_ID_EDEFAULT);
-                return;
-            case ComponentMappingPackage.CONVERTER_TYPE_INFO___FOR_CLASSES:
-                getForClasses().clear();
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public boolean eIsSet(int featureID)
-    {
-        switch (featureID)
-        {
-            case ComponentMappingPackage.CONVERTER_TYPE_INFO___CONVERTER_ID:
-                return CONVERTER_ID_EDEFAULT == null ? converterId != null : !CONVERTER_ID_EDEFAULT.equals(converterId);
-            case ComponentMappingPackage.CONVERTER_TYPE_INFO___FOR_CLASSES:
-                return forClasses != null && !forClasses.isEmpty();
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public String toString()
-    {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (converterId: "); //$NON-NLS-1$
-        result.append(converterId);
-        result.append(", forClasses: "); //$NON-NLS-1$
-        result.append(forClasses);
-        result.append(')');
-        return result.toString();
-    }
-
-} //ConverterTypeInfo_Impl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/mapping/viewmapping/impl/TagMappingImpl.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/mapping/viewmapping/impl/TagMappingImpl.java
deleted file mode 100644
index 44f32b5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/mapping/viewmapping/impl/TagMappingImpl.java
+++ /dev/null
@@ -1,294 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: TagMappingImpl.java,v 1.2 2008/11/18 22:23:57 gkessler Exp $
- */
-package org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-
-import org.eclipse.emf.common.util.EList;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-
-import org.eclipse.emf.ecore.util.EDataTypeUniqueEList;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-
-import org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ComponentMappingPackage;
-import org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.TagMapping;
-import org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.TagToViewObjectMapping;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Tag Mapping</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.impl.TagMappingImpl#getVersionedTagToViewMappings <em>Versioned Tag To View Mappings</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.impl.TagMappingImpl#getCustomConversionFactoryId <em>Custom Conversion Factory Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.impl.TagMappingImpl#getBeanMappedProperties <em>Bean Mapped Properties</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class TagMappingImpl extends EObjectImpl implements TagMapping
-{
-    /**
-     * The cached value of the '{@link #getVersionedTagToViewMappings() <em>Versioned Tag To View Mappings</em>}' containment reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getVersionedTagToViewMappings()
-     * @generated
-     * @ordered
-     */
-    protected EList<TagToViewObjectMapping> versionedTagToViewMappings;
-
-    /**
-     * The default value of the '{@link #getCustomConversionFactoryId() <em>Custom Conversion Factory Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getCustomConversionFactoryId()
-     * @generated
-     * @ordered
-     */
-    protected static final String CUSTOM_CONVERSION_FACTORY_ID_EDEFAULT = null;
-    /**
-     * The cached value of the '{@link #getCustomConversionFactoryId() <em>Custom Conversion Factory Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getCustomConversionFactoryId()
-     * @generated
-     * @ordered
-     */
-    protected String customConversionFactoryId = CUSTOM_CONVERSION_FACTORY_ID_EDEFAULT;
-
-    /**
-     * The cached value of the '{@link #getBeanMappedProperties() <em>Bean Mapped Properties</em>}' attribute list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getBeanMappedProperties()
-     * @generated
-     * @ordered
-     */
-    protected EList<String> beanMappedProperties;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected TagMappingImpl()
-    {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    protected EClass eStaticClass()
-    {
-        return ComponentMappingPackage.Literals.TAG_MAPPING;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EList<TagToViewObjectMapping> getVersionedTagToViewMappings()
-    {
-        if (versionedTagToViewMappings == null)
-        {
-            versionedTagToViewMappings = new EObjectContainmentEList<TagToViewObjectMapping>(TagToViewObjectMapping.class, this, ComponentMappingPackage.TAG_MAPPING__VERSIONED_TAG_TO_VIEW_MAPPINGS);
-        }
-        return versionedTagToViewMappings;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String getCustomConversionFactoryId()
-    {
-        return customConversionFactoryId;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setCustomConversionFactoryId(String newCustomConversionFactoryId)
-    {
-        String oldCustomConversionFactoryId = customConversionFactoryId;
-        customConversionFactoryId = newCustomConversionFactoryId;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, ComponentMappingPackage.TAG_MAPPING__CUSTOM_CONVERSION_FACTORY_ID, oldCustomConversionFactoryId, customConversionFactoryId));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EList<String> getBeanMappedProperties()
-    {
-        if (beanMappedProperties == null)
-        {
-            beanMappedProperties = new EDataTypeUniqueEList<String>(String.class, this, ComponentMappingPackage.TAG_MAPPING__BEAN_MAPPED_PROPERTIES);
-        }
-        return beanMappedProperties;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void findBestMapping(String jsfVersion, String libVersion)
-    {
-        // TODO: implement this method
-        // Ensure that you remove @generated or mark it @generated NOT
-        throw new UnsupportedOperationException();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
-    {
-        switch (featureID)
-        {
-            case ComponentMappingPackage.TAG_MAPPING__VERSIONED_TAG_TO_VIEW_MAPPINGS:
-                return ((InternalEList<?>)getVersionedTagToViewMappings()).basicRemove(otherEnd, msgs);
-        }
-        return super.eInverseRemove(otherEnd, featureID, msgs);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public Object eGet(int featureID, boolean resolve, boolean coreType)
-    {
-        switch (featureID)
-        {
-            case ComponentMappingPackage.TAG_MAPPING__VERSIONED_TAG_TO_VIEW_MAPPINGS:
-                return getVersionedTagToViewMappings();
-            case ComponentMappingPackage.TAG_MAPPING__CUSTOM_CONVERSION_FACTORY_ID:
-                return getCustomConversionFactoryId();
-            case ComponentMappingPackage.TAG_MAPPING__BEAN_MAPPED_PROPERTIES:
-                return getBeanMappedProperties();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @SuppressWarnings("unchecked")
-    @Override
-    public void eSet(int featureID, Object newValue)
-    {
-        switch (featureID)
-        {
-            case ComponentMappingPackage.TAG_MAPPING__VERSIONED_TAG_TO_VIEW_MAPPINGS:
-                getVersionedTagToViewMappings().clear();
-                getVersionedTagToViewMappings().addAll((Collection<? extends TagToViewObjectMapping>)newValue);
-                return;
-            case ComponentMappingPackage.TAG_MAPPING__CUSTOM_CONVERSION_FACTORY_ID:
-                setCustomConversionFactoryId((String)newValue);
-                return;
-            case ComponentMappingPackage.TAG_MAPPING__BEAN_MAPPED_PROPERTIES:
-                getBeanMappedProperties().clear();
-                getBeanMappedProperties().addAll((Collection<? extends String>)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public void eUnset(int featureID)
-    {
-        switch (featureID)
-        {
-            case ComponentMappingPackage.TAG_MAPPING__VERSIONED_TAG_TO_VIEW_MAPPINGS:
-                getVersionedTagToViewMappings().clear();
-                return;
-            case ComponentMappingPackage.TAG_MAPPING__CUSTOM_CONVERSION_FACTORY_ID:
-                setCustomConversionFactoryId(CUSTOM_CONVERSION_FACTORY_ID_EDEFAULT);
-                return;
-            case ComponentMappingPackage.TAG_MAPPING__BEAN_MAPPED_PROPERTIES:
-                getBeanMappedProperties().clear();
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public boolean eIsSet(int featureID)
-    {
-        switch (featureID)
-        {
-            case ComponentMappingPackage.TAG_MAPPING__VERSIONED_TAG_TO_VIEW_MAPPINGS:
-                return versionedTagToViewMappings != null && !versionedTagToViewMappings.isEmpty();
-            case ComponentMappingPackage.TAG_MAPPING__CUSTOM_CONVERSION_FACTORY_ID:
-                return CUSTOM_CONVERSION_FACTORY_ID_EDEFAULT == null ? customConversionFactoryId != null : !CUSTOM_CONVERSION_FACTORY_ID_EDEFAULT.equals(customConversionFactoryId);
-            case ComponentMappingPackage.TAG_MAPPING__BEAN_MAPPED_PROPERTIES:
-                return beanMappedProperties != null && !beanMappedProperties.isEmpty();
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public String toString()
-    {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (customConversionFactoryId: "); //$NON-NLS-1$
-        result.append(customConversionFactoryId);
-        result.append(", beanMappedProperties: "); //$NON-NLS-1$
-        result.append(beanMappedProperties);
-        result.append(')');
-        return result.toString();
-    }
-
-} //TagMappingImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/mapping/viewmapping/impl/TagToViewObjectMappingImpl.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/mapping/viewmapping/impl/TagToViewObjectMappingImpl.java
deleted file mode 100644
index de7b332..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/mapping/viewmapping/impl/TagToViewObjectMappingImpl.java
+++ /dev/null
@@ -1,314 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: TagToViewObjectMappingImpl.java,v 1.2 2008/11/18 22:23:57 gkessler Exp $
- */
-package org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-
-import org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ClassTypeInfo_;
-import org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ComponentMappingPackage;
-import org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.TagToViewObjectMapping;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Tag To View Object Mapping</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.impl.TagToViewObjectMappingImpl#getTypeInfo <em>Type Info</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.impl.TagToViewObjectMappingImpl#getMinJSFVersion <em>Min JSF Version</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.impl.TagToViewObjectMappingImpl#getMinLibraryVersion <em>Min Library Version</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class TagToViewObjectMappingImpl extends EObjectImpl implements TagToViewObjectMapping
-{
-    /**
-     * The cached value of the '{@link #getTypeInfo() <em>Type Info</em>}' containment reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getTypeInfo()
-     * @generated
-     * @ordered
-     */
-    protected ClassTypeInfo_ typeInfo;
-
-    /**
-     * The default value of the '{@link #getMinJSFVersion() <em>Min JSF Version</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getMinJSFVersion()
-     * @generated
-     * @ordered
-     */
-    protected static final String MIN_JSF_VERSION_EDEFAULT = "1.1"; //$NON-NLS-1$
-
-    /**
-     * The cached value of the '{@link #getMinJSFVersion() <em>Min JSF Version</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getMinJSFVersion()
-     * @generated
-     * @ordered
-     */
-    protected String minJSFVersion = MIN_JSF_VERSION_EDEFAULT;
-
-    /**
-     * The default value of the '{@link #getMinLibraryVersion() <em>Min Library Version</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getMinLibraryVersion()
-     * @generated
-     * @ordered
-     */
-    protected static final String MIN_LIBRARY_VERSION_EDEFAULT = ""; //$NON-NLS-1$
-
-    /**
-     * The cached value of the '{@link #getMinLibraryVersion() <em>Min Library Version</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getMinLibraryVersion()
-     * @generated
-     * @ordered
-     */
-    protected String minLibraryVersion = MIN_LIBRARY_VERSION_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected TagToViewObjectMappingImpl()
-    {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    protected EClass eStaticClass()
-    {
-        return ComponentMappingPackage.Literals.TAG_TO_VIEW_OBJECT_MAPPING;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public ClassTypeInfo_ getTypeInfo()
-    {
-        return typeInfo;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param newTypeInfo 
-     * @param msgs 
-     * @return the notification chain
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public NotificationChain basicSetTypeInfo(ClassTypeInfo_ newTypeInfo, NotificationChain msgs)
-    {
-        ClassTypeInfo_ oldTypeInfo = typeInfo;
-        typeInfo = newTypeInfo;
-        if (eNotificationRequired())
-        {
-            ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, ComponentMappingPackage.TAG_TO_VIEW_OBJECT_MAPPING__TYPE_INFO, oldTypeInfo, newTypeInfo);
-            if (msgs == null) msgs = notification; else msgs.add(notification);
-        }
-        return msgs;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setTypeInfo(ClassTypeInfo_ newTypeInfo)
-    {
-        if (newTypeInfo != typeInfo)
-        {
-            NotificationChain msgs = null;
-            if (typeInfo != null)
-                msgs = ((InternalEObject)typeInfo).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - ComponentMappingPackage.TAG_TO_VIEW_OBJECT_MAPPING__TYPE_INFO, null, msgs);
-            if (newTypeInfo != null)
-                msgs = ((InternalEObject)newTypeInfo).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - ComponentMappingPackage.TAG_TO_VIEW_OBJECT_MAPPING__TYPE_INFO, null, msgs);
-            msgs = basicSetTypeInfo(newTypeInfo, msgs);
-            if (msgs != null) msgs.dispatch();
-        }
-        else if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, ComponentMappingPackage.TAG_TO_VIEW_OBJECT_MAPPING__TYPE_INFO, newTypeInfo, newTypeInfo));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String getMinJSFVersion()
-    {
-        return minJSFVersion;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setMinJSFVersion(String newMinJSFVersion)
-    {
-        String oldMinJSFVersion = minJSFVersion;
-        minJSFVersion = newMinJSFVersion;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, ComponentMappingPackage.TAG_TO_VIEW_OBJECT_MAPPING__MIN_JSF_VERSION, oldMinJSFVersion, minJSFVersion));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String getMinLibraryVersion()
-    {
-        return minLibraryVersion;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setMinLibraryVersion(String newMinLibraryVersion)
-    {
-        String oldMinLibraryVersion = minLibraryVersion;
-        minLibraryVersion = newMinLibraryVersion;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, ComponentMappingPackage.TAG_TO_VIEW_OBJECT_MAPPING__MIN_LIBRARY_VERSION, oldMinLibraryVersion, minLibraryVersion));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
-    {
-        switch (featureID)
-        {
-            case ComponentMappingPackage.TAG_TO_VIEW_OBJECT_MAPPING__TYPE_INFO:
-                return basicSetTypeInfo(null, msgs);
-        }
-        return super.eInverseRemove(otherEnd, featureID, msgs);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public Object eGet(int featureID, boolean resolve, boolean coreType)
-    {
-        switch (featureID)
-        {
-            case ComponentMappingPackage.TAG_TO_VIEW_OBJECT_MAPPING__TYPE_INFO:
-                return getTypeInfo();
-            case ComponentMappingPackage.TAG_TO_VIEW_OBJECT_MAPPING__MIN_JSF_VERSION:
-                return getMinJSFVersion();
-            case ComponentMappingPackage.TAG_TO_VIEW_OBJECT_MAPPING__MIN_LIBRARY_VERSION:
-                return getMinLibraryVersion();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public void eSet(int featureID, Object newValue)
-    {
-        switch (featureID)
-        {
-            case ComponentMappingPackage.TAG_TO_VIEW_OBJECT_MAPPING__TYPE_INFO:
-                setTypeInfo((ClassTypeInfo_)newValue);
-                return;
-            case ComponentMappingPackage.TAG_TO_VIEW_OBJECT_MAPPING__MIN_JSF_VERSION:
-                setMinJSFVersion((String)newValue);
-                return;
-            case ComponentMappingPackage.TAG_TO_VIEW_OBJECT_MAPPING__MIN_LIBRARY_VERSION:
-                setMinLibraryVersion((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public void eUnset(int featureID)
-    {
-        switch (featureID)
-        {
-            case ComponentMappingPackage.TAG_TO_VIEW_OBJECT_MAPPING__TYPE_INFO:
-                setTypeInfo((ClassTypeInfo_)null);
-                return;
-            case ComponentMappingPackage.TAG_TO_VIEW_OBJECT_MAPPING__MIN_JSF_VERSION:
-                setMinJSFVersion(MIN_JSF_VERSION_EDEFAULT);
-                return;
-            case ComponentMappingPackage.TAG_TO_VIEW_OBJECT_MAPPING__MIN_LIBRARY_VERSION:
-                setMinLibraryVersion(MIN_LIBRARY_VERSION_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public boolean eIsSet(int featureID)
-    {
-        switch (featureID)
-        {
-            case ComponentMappingPackage.TAG_TO_VIEW_OBJECT_MAPPING__TYPE_INFO:
-                return typeInfo != null;
-            case ComponentMappingPackage.TAG_TO_VIEW_OBJECT_MAPPING__MIN_JSF_VERSION:
-                return MIN_JSF_VERSION_EDEFAULT == null ? minJSFVersion != null : !MIN_JSF_VERSION_EDEFAULT.equals(minJSFVersion);
-            case ComponentMappingPackage.TAG_TO_VIEW_OBJECT_MAPPING__MIN_LIBRARY_VERSION:
-                return MIN_LIBRARY_VERSION_EDEFAULT == null ? minLibraryVersion != null : !MIN_LIBRARY_VERSION_EDEFAULT.equals(minLibraryVersion);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    @Override
-    public String toString()
-    {
-        return "TagToViewObjectMapping: typeInfo="+getTypeInfo(); //$NON-NLS-1$
-    }
-} //TagToViewObjectMappingImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/mapping/viewmapping/impl/ValidatorTypeInfo_Impl.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/mapping/viewmapping/impl/ValidatorTypeInfo_Impl.java
deleted file mode 100644
index 2aca754..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/mapping/viewmapping/impl/ValidatorTypeInfo_Impl.java
+++ /dev/null
@@ -1,180 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ValidatorTypeInfo_Impl.java,v 1.2 2008/11/18 22:23:57 gkessler Exp $
- */
-package org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-
-import org.eclipse.emf.ecore.EClass;
-
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-
-import org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ComponentMappingPackage;
-import org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ValidatorTypeInfo_;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Validator Type Info </b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.impl.ValidatorTypeInfo_Impl#getValidatorId <em>Validator Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ValidatorTypeInfo_Impl extends ClassTypeInfo_Impl implements ValidatorTypeInfo_
-{
-    /**
-     * The default value of the '{@link #getValidatorId() <em>Validator Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getValidatorId()
-     * @generated
-     * @ordered
-     */
-    protected static final String VALIDATOR_ID_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getValidatorId() <em>Validator Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getValidatorId()
-     * @generated
-     * @ordered
-     */
-    protected String validatorId = VALIDATOR_ID_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected ValidatorTypeInfo_Impl()
-    {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    protected EClass eStaticClass()
-    {
-        return ComponentMappingPackage.Literals.VALIDATOR_TYPE_INFO_;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String getValidatorId()
-    {
-        return validatorId;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setValidatorId(String newValidatorId)
-    {
-        String oldValidatorId = validatorId;
-        validatorId = newValidatorId;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, ComponentMappingPackage.VALIDATOR_TYPE_INFO___VALIDATOR_ID, oldValidatorId, validatorId));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public Object eGet(int featureID, boolean resolve, boolean coreType)
-    {
-        switch (featureID)
-        {
-            case ComponentMappingPackage.VALIDATOR_TYPE_INFO___VALIDATOR_ID:
-                return getValidatorId();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public void eSet(int featureID, Object newValue)
-    {
-        switch (featureID)
-        {
-            case ComponentMappingPackage.VALIDATOR_TYPE_INFO___VALIDATOR_ID:
-                setValidatorId((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public void eUnset(int featureID)
-    {
-        switch (featureID)
-        {
-            case ComponentMappingPackage.VALIDATOR_TYPE_INFO___VALIDATOR_ID:
-                setValidatorId(VALIDATOR_ID_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public boolean eIsSet(int featureID)
-    {
-        switch (featureID)
-        {
-            case ComponentMappingPackage.VALIDATOR_TYPE_INFO___VALIDATOR_ID:
-                return VALIDATOR_ID_EDEFAULT == null ? validatorId != null : !VALIDATOR_ID_EDEFAULT.equals(validatorId);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public String toString()
-    {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (validatorId: "); //$NON-NLS-1$
-        result.append(validatorId);
-        result.append(')');
-        return result.toString();
-    }
-
-} //ValidatorTypeInfo_Impl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/mapping/viewmapping/util/ComponentMappingAdapterFactory.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/mapping/viewmapping/util/ComponentMappingAdapterFactory.java
deleted file mode 100644
index 7676879..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/mapping/viewmapping/util/ComponentMappingAdapterFactory.java
+++ /dev/null
@@ -1,256 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ComponentMappingAdapterFactory.java,v 1.1 2008/05/12 17:42:21 cbateman Exp $
- */
-package org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.util;
-
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.common.notify.Notifier;
-
-import org.eclipse.emf.common.notify.impl.AdapterFactoryImpl;
-
-import org.eclipse.emf.ecore.EObject;
-
-import org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.*;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Adapter Factory</b> for the model.
- * It provides an adapter <code>createXXX</code> method for each class of the model.
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ComponentMappingPackage
- * @generated
- */
-public class ComponentMappingAdapterFactory extends AdapterFactoryImpl
-{
-    /**
-     * The cached model package.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected static ComponentMappingPackage modelPackage;
-
-    /**
-     * Creates an instance of the adapter factory.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public ComponentMappingAdapterFactory()
-    {
-        if (modelPackage == null)
-        {
-            modelPackage = ComponentMappingPackage.eINSTANCE;
-        }
-    }
-
-    /**
-     * Returns whether this factory is applicable for the type of the object.
-     * <!-- begin-user-doc -->
-     * This implementation returns <code>true</code> if the object is either the model's package or is an instance object of the model.
-     * <!-- end-user-doc -->
-     * @return whether this factory is applicable for the type of the object.
-     * @generated
-     */
-    @Override
-    public boolean isFactoryForType(Object object)
-    {
-        if (object == modelPackage)
-        {
-            return true;
-        }
-        if (object instanceof EObject)
-        {
-            return ((EObject)object).eClass().getEPackage() == modelPackage;
-        }
-        return false;
-    }
-
-    /**
-     * The switch that delegates to the <code>createXXX</code> methods.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected ComponentMappingSwitch<Adapter> modelSwitch =
-        new ComponentMappingSwitch<Adapter>()
-        {
-            @Override
-            public Adapter caseTagMapping(TagMapping object)
-            {
-                return createTagMappingAdapter();
-            }
-            @Override
-            public Adapter caseTagToViewObjectMapping(TagToViewObjectMapping object)
-            {
-                return createTagToViewObjectMappingAdapter();
-            }
-            @Override
-            public Adapter caseClassTypeInfo_(ClassTypeInfo_ object)
-            {
-                return createClassTypeInfo_Adapter();
-            }
-            @Override
-            public Adapter caseComponentTypeInfo_(ComponentTypeInfo_ object)
-            {
-                return createComponentTypeInfo_Adapter();
-            }
-            @Override
-            public Adapter caseConverterTypeInfo_(ConverterTypeInfo_ object)
-            {
-                return createConverterTypeInfo_Adapter();
-            }
-            @Override
-            public Adapter caseValidatorTypeInfo_(ValidatorTypeInfo_ object)
-            {
-                return createValidatorTypeInfo_Adapter();
-            }
-            @Override
-            public Adapter caseAttributeToPropertyMapping(AttributeToPropertyMapping object)
-            {
-                return createAttributeToPropertyMappingAdapter();
-            }
-            @Override
-            public Adapter defaultCase(EObject object)
-            {
-                return createEObjectAdapter();
-            }
-        };
-
-    /**
-     * Creates an adapter for the <code>target</code>.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param target the object to adapt.
-     * @return the adapter for the <code>target</code>.
-     * @generated
-     */
-    @Override
-    public Adapter createAdapter(Notifier target)
-    {
-        return modelSwitch.doSwitch((EObject)target);
-    }
-
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.TagMapping <em>Tag Mapping</em>}'.
-     * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.TagMapping
-     * @generated
-     */
-    public Adapter createTagMappingAdapter()
-    {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.TagToViewObjectMapping <em>Tag To View Object Mapping</em>}'.
-     * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.TagToViewObjectMapping
-     * @generated
-     */
-    public Adapter createTagToViewObjectMappingAdapter()
-    {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ClassTypeInfo_ <em>Class Type Info </em>}'.
-     * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ClassTypeInfo_
-     * @generated
-     */
-    public Adapter createClassTypeInfo_Adapter()
-    {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ComponentTypeInfo_ <em>Component Type Info </em>}'.
-     * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ComponentTypeInfo_
-     * @generated
-     */
-    public Adapter createComponentTypeInfo_Adapter()
-    {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ConverterTypeInfo_ <em>Converter Type Info </em>}'.
-     * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ConverterTypeInfo_
-     * @generated
-     */
-    public Adapter createConverterTypeInfo_Adapter()
-    {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ValidatorTypeInfo_ <em>Validator Type Info </em>}'.
-     * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ValidatorTypeInfo_
-     * @generated
-     */
-    public Adapter createValidatorTypeInfo_Adapter()
-    {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.AttributeToPropertyMapping <em>Attribute To Property Mapping</em>}'.
-     * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.AttributeToPropertyMapping
-     * @generated
-     */
-    public Adapter createAttributeToPropertyMappingAdapter()
-    {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for the default case.
-     * <!-- begin-user-doc -->
-     * This default implementation returns null.
-     * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @generated
-     */
-    public Adapter createEObjectAdapter()
-    {
-        return null;
-    }
-
-} //ComponentMappingAdapterFactory
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/mapping/viewmapping/util/ComponentMappingResourceFactoryImpl.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/mapping/viewmapping/util/ComponentMappingResourceFactoryImpl.java
deleted file mode 100644
index 08f2fbf..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/mapping/viewmapping/util/ComponentMappingResourceFactoryImpl.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ComponentMappingResourceFactoryImpl.java,v 1.1 2008/05/12 17:42:21 cbateman Exp $
- */
-package org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.util;
-
-import org.eclipse.emf.common.util.URI;
-
-import org.eclipse.emf.ecore.resource.Resource;
-
-import org.eclipse.emf.ecore.resource.impl.ResourceFactoryImpl;
-
-import org.eclipse.emf.ecore.xmi.XMLResource;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Resource Factory</b> associated with the package.
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.util.ComponentMappingResourceImpl
- * @generated
- */
-public class ComponentMappingResourceFactoryImpl extends ResourceFactoryImpl
-{
-    /**
-     * Creates an instance of the resource factory.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public ComponentMappingResourceFactoryImpl()
-    {
-        super();
-    }
-
-    /**
-     * Creates an instance of the resource.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public Resource createResource(URI uri)
-    {
-        XMLResource result = new ComponentMappingResourceImpl(uri);
-        result.getDefaultSaveOptions().put(XMLResource.OPTION_EXTENDED_META_DATA, Boolean.TRUE);
-        result.getDefaultLoadOptions().put(XMLResource.OPTION_EXTENDED_META_DATA, Boolean.TRUE);
-
-        result.getDefaultSaveOptions().put(XMLResource.OPTION_SCHEMA_LOCATION, Boolean.TRUE);
-
-        result.getDefaultLoadOptions().put(XMLResource.OPTION_USE_ENCODED_ATTRIBUTE_STYLE, Boolean.TRUE);
-        result.getDefaultSaveOptions().put(XMLResource.OPTION_USE_ENCODED_ATTRIBUTE_STYLE, Boolean.TRUE);
-
-        result.getDefaultLoadOptions().put(XMLResource.OPTION_USE_LEXICAL_HANDLER, Boolean.TRUE);
-        return result;
-    }
-
-} //ComponentMappingResourceFactoryImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/mapping/viewmapping/util/ComponentMappingResourceImpl.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/mapping/viewmapping/util/ComponentMappingResourceImpl.java
deleted file mode 100644
index 8d3c819..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/mapping/viewmapping/util/ComponentMappingResourceImpl.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ComponentMappingResourceImpl.java,v 1.1 2008/05/12 17:42:21 cbateman Exp $
- */
-package org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.util;
-
-import org.eclipse.emf.common.util.URI;
-
-import org.eclipse.emf.ecore.xmi.impl.XMLResourceImpl;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Resource </b> associated with the package.
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.util.ComponentMappingResourceFactoryImpl
- * @generated
- */
-public class ComponentMappingResourceImpl extends XMLResourceImpl
-{
-    /**
-     * Creates an instance of the resource.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param uri the URI of the new resource.
-     * @generated
-     */
-    public ComponentMappingResourceImpl(URI uri)
-    {
-        super(uri);
-    }
-
-} //ComponentMappingResourceImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/mapping/viewmapping/util/ComponentMappingSwitch.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/mapping/viewmapping/util/ComponentMappingSwitch.java
deleted file mode 100644
index 3de4106..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/mapping/viewmapping/util/ComponentMappingSwitch.java
+++ /dev/null
@@ -1,286 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ComponentMappingSwitch.java,v 1.1 2008/05/12 17:42:21 cbateman Exp $
- */
-package org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.util;
-
-import java.util.List;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-
-import org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.*;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Switch</b> for the model's inheritance hierarchy.
- * It supports the call {@link #doSwitch(EObject) doSwitch(object)}
- * to invoke the <code>caseXXX</code> method for each class of the model,
- * starting with the actual class of the object
- * and proceeding up the inheritance hierarchy
- * until a non-null result is returned,
- * which is the result of the switch.
- * @param <T> 
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ComponentMappingPackage
- * @generated
- */
-public class ComponentMappingSwitch<T>
-{
-    /**
-     * The cached model package
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected static ComponentMappingPackage modelPackage;
-
-    /**
-     * Creates an instance of the switch.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public ComponentMappingSwitch()
-    {
-        if (modelPackage == null)
-        {
-            modelPackage = ComponentMappingPackage.eINSTANCE;
-        }
-    }
-
-    /**
-     * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
-     * <!-- begin-user-doc -->
-     * @param theEObject 
-     * <!-- end-user-doc -->
-     * @return the first non-null result returned by a <code>caseXXX</code> call.
-     * @generated
-     */
-    public T doSwitch(EObject theEObject)
-    {
-        return doSwitch(theEObject.eClass(), theEObject);
-    }
-
-    /**
-     * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
-     * <!-- begin-user-doc -->
-     * @param theEClass 
-     * @param theEObject 
-     * <!-- end-user-doc -->
-     * @return the first non-null result returned by a <code>caseXXX</code> call.
-     * @generated
-     */
-    protected T doSwitch(EClass theEClass, EObject theEObject)
-    {
-        if (theEClass.eContainer() == modelPackage)
-        {
-            return doSwitch(theEClass.getClassifierID(), theEObject);
-        }
-        List<EClass> eSuperTypes = theEClass.getESuperTypes();
-        return
-            eSuperTypes.isEmpty() ?
-                defaultCase(theEObject) :
-                doSwitch(eSuperTypes.get(0), theEObject);
-    }
-
-    /**
-     * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
-     * <!-- begin-user-doc -->
-     * @param classifierID 
-     * @param theEObject 
-     * <!-- end-user-doc -->
-     * @return the first non-null result returned by a <code>caseXXX</code> call.
-     * @generated
-     */
-    protected T doSwitch(int classifierID, EObject theEObject)
-    {
-        switch (classifierID)
-        {
-            case ComponentMappingPackage.TAG_MAPPING:
-            {
-                TagMapping tagMapping = (TagMapping)theEObject;
-                T result = caseTagMapping(tagMapping);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case ComponentMappingPackage.TAG_TO_VIEW_OBJECT_MAPPING:
-            {
-                TagToViewObjectMapping tagToViewObjectMapping = (TagToViewObjectMapping)theEObject;
-                T result = caseTagToViewObjectMapping(tagToViewObjectMapping);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case ComponentMappingPackage.CLASS_TYPE_INFO_:
-            {
-                ClassTypeInfo_ classTypeInfo_ = (ClassTypeInfo_)theEObject;
-                T result = caseClassTypeInfo_(classTypeInfo_);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case ComponentMappingPackage.COMPONENT_TYPE_INFO_:
-            {
-                ComponentTypeInfo_ componentTypeInfo_ = (ComponentTypeInfo_)theEObject;
-                T result = caseComponentTypeInfo_(componentTypeInfo_);
-                if (result == null) result = caseClassTypeInfo_(componentTypeInfo_);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case ComponentMappingPackage.CONVERTER_TYPE_INFO_:
-            {
-                ConverterTypeInfo_ converterTypeInfo_ = (ConverterTypeInfo_)theEObject;
-                T result = caseConverterTypeInfo_(converterTypeInfo_);
-                if (result == null) result = caseClassTypeInfo_(converterTypeInfo_);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case ComponentMappingPackage.VALIDATOR_TYPE_INFO_:
-            {
-                ValidatorTypeInfo_ validatorTypeInfo_ = (ValidatorTypeInfo_)theEObject;
-                T result = caseValidatorTypeInfo_(validatorTypeInfo_);
-                if (result == null) result = caseClassTypeInfo_(validatorTypeInfo_);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case ComponentMappingPackage.ATTRIBUTE_TO_PROPERTY_MAPPING:
-            {
-                AttributeToPropertyMapping attributeToPropertyMapping = (AttributeToPropertyMapping)theEObject;
-                T result = caseAttributeToPropertyMapping(attributeToPropertyMapping);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            default: return defaultCase(theEObject);
-        }
-    }
-
-    /**
-     * Returns the result of interpreting the object as an instance of '<em>Tag Mapping</em>'.
-     * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpreting the object as an instance of '<em>Tag Mapping</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-    public T caseTagMapping(TagMapping object)
-    {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpreting the object as an instance of '<em>Tag To View Object Mapping</em>'.
-     * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpreting the object as an instance of '<em>Tag To View Object Mapping</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-    public T caseTagToViewObjectMapping(TagToViewObjectMapping object)
-    {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpreting the object as an instance of '<em>Class Type Info </em>'.
-     * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpreting the object as an instance of '<em>Class Type Info </em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-    public T caseClassTypeInfo_(ClassTypeInfo_ object)
-    {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpreting the object as an instance of '<em>Component Type Info </em>'.
-     * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpreting the object as an instance of '<em>Component Type Info </em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-    public T caseComponentTypeInfo_(ComponentTypeInfo_ object)
-    {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpreting the object as an instance of '<em>Converter Type Info </em>'.
-     * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpreting the object as an instance of '<em>Converter Type Info </em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-    public T caseConverterTypeInfo_(ConverterTypeInfo_ object)
-    {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpreting the object as an instance of '<em>Validator Type Info </em>'.
-     * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpreting the object as an instance of '<em>Validator Type Info </em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-    public T caseValidatorTypeInfo_(ValidatorTypeInfo_ object)
-    {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpreting the object as an instance of '<em>Attribute To Property Mapping</em>'.
-     * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpreting the object as an instance of '<em>Attribute To Property Mapping</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-    public T caseAttributeToPropertyMapping(AttributeToPropertyMapping object)
-    {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpreting the object as an instance of '<em>EObject</em>'.
-     * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch, but this is the last case anyway.
-     * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpreting the object as an instance of '<em>EObject</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject)
-     * @generated
-     */
-    public T defaultCase(EObject object)
-    {
-        return null;
-    }
-
-} //ComponentMappingSwitch
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/mapping/viewmapping/util/ComponentMappingXMLProcessor.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/mapping/viewmapping/util/ComponentMappingXMLProcessor.java
deleted file mode 100644
index 0280c4e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/mapping/viewmapping/util/ComponentMappingXMLProcessor.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ComponentMappingXMLProcessor.java,v 1.1 2008/05/12 17:42:21 cbateman Exp $
- */
-package org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.util;
-
-import java.util.Map;
-
-import org.eclipse.emf.ecore.EPackage;
-
-import org.eclipse.emf.ecore.resource.Resource;
-
-import org.eclipse.emf.ecore.xmi.util.XMLProcessor;
-
-import org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ComponentMappingPackage;
-
-/**
- * This class contains helper methods to serialize and deserialize XML documents
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class ComponentMappingXMLProcessor extends XMLProcessor
-{
-
-    /**
-     * Public constructor to instantiate the helper.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public ComponentMappingXMLProcessor()
-    {
-        super((EPackage.Registry.INSTANCE));
-        ComponentMappingPackage.eINSTANCE.eClass();
-    }
-    
-    /**
-     * Register for "*" and "xml" file extensions the ComponentMappingResourceFactoryImpl factory.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    protected Map<String, Resource.Factory> getRegistrations()
-    {
-        if (registrations == null)
-        {
-            super.getRegistrations();
-            registrations.put(XML_EXTENSION, new ComponentMappingResourceFactoryImpl());
-            registrations.put(STAR_EXTENSION, new ComponentMappingResourceFactoryImpl());
-        }
-        return registrations;
-    }
-
-} //ComponentMappingXMLProcessor
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/AbstractTagRegistry.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/AbstractTagRegistry.java
deleted file mode 100644
index 50d9328..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/AbstractTagRegistry.java
+++ /dev/null
@@ -1,149 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.designtime.internal.view.model;
-
-import java.util.Collection;
-import java.util.List;
-import java.util.concurrent.CopyOnWriteArrayList;
-import java.util.concurrent.atomic.AtomicBoolean;
-
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.jst.jsf.common.internal.RunOnCompletionPattern;
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.Namespace;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-
-/**
- * The abstract registry that all implementations of ITagRegistry should
- * sub-class.
- * 
- * @author cbateman
- * 
- */
-public abstract class AbstractTagRegistry implements ITagRegistry
-{
-    private final List<ITagRegistryListener> _listeners;
-    private final AtomicBoolean              _isDisposed = new AtomicBoolean(
-                                                                 false);
-
-    /**
-     * 
-     */
-    protected AbstractTagRegistry()
-    {
-        super();
-        _listeners = new CopyOnWriteArrayList<ITagRegistryListener>();
-    }
-
-    public final void addListener(final ITagRegistryListener listener)
-    {
-        if (!_listeners.contains(listener))
-        {
-            _listeners.add(listener);
-        }
-    }
-
-    public final void removeListener(final ITagRegistryListener listener)
-    {
-        _listeners.remove(listener);
-    }
-
-    /**
-     * @param event
-     */
-    protected final void fireEvent(final TagRegistryChangeEvent event)
-    {
-        for (final ITagRegistryListener listener : _listeners)
-        {
-            try
-            {
-                listener.registryChanged(event);
-            }
-            catch (final Exception e)
-            {
-                JSFCorePlugin.log(new Exception(e),
-                        "During change event notification"); //$NON-NLS-1$
-            }
-        }
-    }
-
-    public abstract Collection<? extends Namespace> getAllTagLibraries();
-
-    public abstract Namespace getTagLibrary(String uri);
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jst.jsf.designtime.internal.view.model.jsp.registry.ITagRegistry#isDisposed()
-     */
-    public final boolean isDisposed()
-    {
-        return _isDisposed.get();
-    }
-
-    /**
-     * 
-     */
-    public final void destroy()
-    {
-        cleanupPersistentState();
-        dispose();
-    }
-    
-    /**
-     * Called by destroy before it calls dispose.  Sub-class should
-     * invalidate, and ideally delete, any persistent state. 
-     * 
-     * NOTE: DO NOT call dispose functionality from this call.  The framework
-     * will call dispose() immediately after cleanupPersistentState.
-     */
-    protected abstract void cleanupPersistentState();
-
-    /**
-     * Must be factories or caches when disposing the registry.  Instances
-     * must implement doDispose to provide their specific disposal operations.
-     */
-    public final void dispose()
-    {
-        // latch on the isDisposed flag so this block can only ever
-        // execute once
-        if (_isDisposed.compareAndSet(false, true))
-        {
-            fireEvent(new TagRegistryChangeEvent(this,
-                TagRegistryChangeEvent.EventType.REGISTRY_DISPOSED));
-            doDispose();
-        }
-    }
-
-    /**
-     * Implement with instance specific disposal operations.  Do do not fire
-     * the REGISTRY_DISPOSED event from this method (it is done in dispose.
-     * 
-     * Implementer must assume that this method be called at most once and that
-     * it is error to access the registry instance after it is called 
-     */
-    protected abstract void doDispose();
-
-    public final void refresh(final Runnable runAfter, final boolean flushCaches)
-    {
-        final Job refreshJob = getRefreshJob(flushCaches);
-
-        final RunOnCompletionPattern runPattern = new RunOnCompletionPattern(
-                refreshJob, runAfter);
-        runPattern.run();
-    }
-
-    /**
-     * @param flushCaches 
-     * @return a job that, when run, will perform the registry refresh.  Job
-     * must do any necessary synchronizing of internal state.
-     */
-    protected abstract Job getRefreshJob(final boolean flushCaches);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/ITagRegistry.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/ITagRegistry.java
deleted file mode 100644
index 7bb3dde..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/ITagRegistry.java
+++ /dev/null
@@ -1,150 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.designtime.internal.view.model;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.EventListener;
-import java.util.EventObject;
-import java.util.List;
-
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.Namespace;
-
-/**
- * A registry for tags for a given context TODO: generally tied to project, but
- * may also need a tie to specific tag-in-use type. For example, if JSPs and
- * Facelets are used at the same time?
- * 
- * @author cbateman
- * 
- */
-public interface ITagRegistry
-{
-
-    /**
-     * @return true if this registry is disposed. It is an error to use a
-     *         disposed registry and behaviour of such a registry is not
-     *         guaranteed.
-     */
-    public abstract boolean isDisposed();
-
-    /**
-     * This method may cause long-running operations to be executed. If runAfter
-     * is non-null, any long running operations will schedule asynchronously on
-     * a separate thread and on successful completion, runAfter will be executed
-     * (no assumption should be made about what thread it is run on).
-     * 
-     * @param runAfter
-     * @param flushCaches true indicates that any cached data should be flushed.
-     * 
-     */
-    public abstract void refresh(final Runnable runAfter, final boolean flushCaches);
-
-    /**
-     * Callers should assume the collection is not modifiable.  Implementers
-     * may return a collection whose mutator operations throw exceptions.
-     * 
-     * @return all tag libraries for a project tag registry
-     */
-    public abstract Collection<? extends Namespace> getAllTagLibraries();
-
-    /**
-     * @param uri
-     * @return the tag library corresponding to uri or null if none.
-     */
-    public abstract Namespace getTagLibrary(final String uri);
-    
-    /**
-     * Adds the listener to the list of objects that receive change events
-     * from this tag registry instance.  If listener is already in the list,
-     * it will not be added again.
-     * 
-     * @param listener
-     */
-    public abstract void addListener(ITagRegistryListener listener);
-    
-    /**
-     * Remove listener from the list of objects that receive change events
-     * from this tag registry instance.
-     * 
-     * @param listener
-     */
-    public abstract void removeListener(ITagRegistryListener listener);
-    
-
-    /**
-     * Marks a listener that receives tag registry change events
-     *
-     */
-    interface ITagRegistryListener extends EventListener
-    {
-        /**
-         * @param changeEvent
-         */
-        void registryChanged(final TagRegistryChangeEvent changeEvent);
-    }
-    
-    /**
-     * A change event object that communicates a single type of change to
-     * a single tag registry
-     *
-     */
-    static class TagRegistryChangeEvent extends EventObject
-    {
-        public enum EventType
-        {
-            // if the type is any of these three, then getAffectedObjects()
-            // will return one or more Namespace objects that have changed.
-            ADDED_NAMESPACE,
-            REMOVED_NAMESPACE,
-            CHANGED_NAMESPACE,
-            
-            // if the type is is this one, then the event is being called
-            // before dispose operation on getSource().
-            REGISTRY_DISPOSED
-        }
-        /**
-         * 
-         */
-        private static final long serialVersionUID = 6559096306615373552L;
-        private final List<? extends Namespace> _affectedObjects;
-        private final EventType _type;
-
-        public TagRegistryChangeEvent(ITagRegistry source, EventType type)
-        {
-            this(source, type, Collections.EMPTY_LIST);
-        }
-        
-        public TagRegistryChangeEvent(ITagRegistry source, EventType type, 
-                List<? extends Namespace> affectedObjects)
-        {
-            super(source);
-            _affectedObjects = affectedObjects;
-            _type = type;
-        }
-
-        @Override
-        public ITagRegistry getSource()
-        {
-            return (ITagRegistry) super.getSource();
-        }
-
-        public List<? extends Namespace> getAffectedObjects()
-        {
-            return _affectedObjects;
-        }
-
-        public EventType getType()
-        {
-            return _type;
-        }
-    }
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/TagRegistryFactory.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/TagRegistryFactory.java
deleted file mode 100644
index ba0f74d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/TagRegistryFactory.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.designtime.internal.view.model;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jst.jsf.common.internal.strategy.IIdentifiableStrategy;
-
-/**
- * Creates a tag registry for the given project.  The factory may use 
- * whatever mechanism it chooses and the tag registry may or may not be a
- * single instance for project.
- * 
- * @author cbateman
- *
- */
-public abstract class TagRegistryFactory implements IIdentifiableStrategy<IProject, ITagRegistry, String>
-{
-    private static final ITagRegistry NO_RESULT = null;
-
-    private static final String ID = "org.eclipse.jst.jsf.designtime.view.model.TagRegistryFactory"; //$NON-NLS-1$
-
-    /**
-     * @param project
-     * @return a tag registry for project.  This instance may be a common
-     * shared per-project singleton.  The factory must ensure that the registry
-     * is cleaned up if the associated project becomes inaccessible (see IProject.isAccessible).
-     * Return null if none.
-     * 
-     * @throws TagRegistryFactoryException 
-     */
-    public abstract ITagRegistry createTagRegistry(final IProject project) throws TagRegistryFactoryException;
-
-    /**
-     * @param project
-     * @return determines whether a particular tag registry is appropriate for
-     * the project. If there is no valid tag registry for a project (i.e. due
-     * to lack of facet or bad facet version), return false.
-     */
-    public abstract boolean projectIsValid(final IProject project);
-
-    /**
-     * Allow 
-     * 
-     * @param project
-     * @return true if an instance of ITagRegistry already exists for project
-     */
-    public abstract boolean isInstance(final IProject project);
-
-    public final ITagRegistry getNoResult()
-    {
-        return NO_RESULT;
-    }
-
-    public final ITagRegistry perform(IProject project) throws Exception
-    {
-        return createTagRegistry(project);
-    }
-
-    public String getId()
-    {
-        return ID;
-    }
-
-    /**
-     * Wraps exceptions generated by trying to create a tag registry
-     */
-    public static class TagRegistryFactoryException extends Exception
-    {
-        /**
-         * serializable id
-         */
-        private static final long serialVersionUID = 1361229535611361339L;
-
-        /**
-         * @param cause
-         */
-        public TagRegistryFactoryException(Throwable cause)
-        {
-            super("Problem during tag registry construction", cause); //$NON-NLS-1$
-        }
-        
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/AbstractTagResolvingStrategy.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/AbstractTagResolvingStrategy.java
deleted file mode 100644
index 637ec96..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/AbstractTagResolvingStrategy.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.designtime.internal.view.model.jsp;
-
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.ITagElement;
-
-/**
- * Implements the tag resolving strategy.
- * 
- * @author cbateman
- * 
- * @param <TLDELEMENT>
- * @param <IDTYPE>
- */
-public abstract class AbstractTagResolvingStrategy<TLDELEMENT, IDTYPE>
-        implements ITagResolvingStrategy<TLDELEMENT, IDTYPE>
-{
-    private final static ITagElement        NOT_FOUND_INDICATOR = null;
-    
-    public ITagElement getNotFoundIndicator()
-    {
-        return NOT_FOUND_INDICATOR;
-    }
-
-    public abstract ITagElement resolve(TLDELEMENT element);
-
-    public abstract IDTYPE getId();
-
-    /**
-     * Must always be the same as resolve.
-     */
-    public final ITagElement perform(TLDELEMENT element)
-    {
-        return resolve(element);
-    }
-
-    /**
-     * Must always be the same as getNotFoundIndicator.
-     */
-    public final ITagElement getNoResult()
-    {
-        return getNotFoundIndicator();
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/CMNodeNamedMapAdapter.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/CMNodeNamedMapAdapter.java
deleted file mode 100644
index 1235398..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/CMNodeNamedMapAdapter.java
+++ /dev/null
@@ -1,163 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.designtime.internal.view.model.jsp;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.atomic.AtomicBoolean;
-
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.ITagAttributeHandler;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.designtime.internal.view.model.jsp.IAttributeAdvisor.UnknownAttributeException;
-import org.eclipse.jst.jsp.core.internal.contentmodel.tld.provisional.TLDElementDeclaration;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration;
-
-/**
- * Adapts TLDDocument attributes to a simple map of ITagAttributeHandler. Map is
- * unmodifiable.
- * 
- * @author cbateman
- * 
- */
-public class CMNodeNamedMapAdapter implements
-        Map<String, ITagAttributeHandler>
-{
-    /**
-     * serializable id
-     */
-    private static final long                       serialVersionUID = -4188412823197830484L;
-    private transient final TLDElementDeclaration   _tldElement;
-    private transient final IAttributeAdvisor       _advisor;
-    private transient final AtomicBoolean           _isInitialized = new AtomicBoolean(false);
-    private final Map<String, ITagAttributeHandler> _cache;
-
-    /**
-     * @param tldDoc
-     * @param advisor
-     */
-    public CMNodeNamedMapAdapter(final TLDElementDeclaration tldDoc,
-            final IAttributeAdvisor advisor)
-    {
-        _tldElement = tldDoc;
-        _advisor = advisor;
-        _cache = new HashMap<String, ITagAttributeHandler>();
-    }
-
-    public boolean containsKey(Object key)
-    {
-        ensureAllAttributes();
-        return _cache.containsKey(key);
-    }
-
-    public boolean containsValue(Object value)
-    {
-        ensureAllAttributes();
-        return _cache.containsValue(value);
-    }
-
-    public Set<java.util.Map.Entry<String, ITagAttributeHandler>> entrySet()
-    {
-        ensureAllAttributes();
-        return _cache.entrySet();
-    }
-
-
-    public ITagAttributeHandler get(Object key)
-    {
-        if (key instanceof String)
-        {
-            return getOrCreateAttribute((String) key);
-        }
-        return null;
-    }
-
-    public boolean isEmpty()
-    {
-        return size() == 0;
-    }
-
-    public Set<String> keySet()
-    {
-        ensureAllAttributes();
-        return Collections.unmodifiableSet(_cache.keySet());
-    }
-
-    public int size()
-    {
-        if (_tldElement != null)
-        {
-            return _tldElement.getAttributes().getLength();
-        }
-        return _cache.size();
-    }
-
-    public Collection<ITagAttributeHandler> values()
-    {
-        ensureAllAttributes();
-        return Collections.unmodifiableCollection(_cache.values());
-    }
-
-    private synchronized ITagAttributeHandler getOrCreateAttribute(final String name)
-    {
-        ITagAttributeHandler tagAttr = _cache.get(name);
-        
-        if (tagAttr == null)
-        {
-            try
-            {
-                tagAttr = _advisor.createAttributeHandler(name);
-                _cache.put(name, tagAttr);
-            }
-            catch (UnknownAttributeException e)
-            {
-                JSFCorePlugin.log(e, "Trying to get attribute for "+name); //$NON-NLS-1$
-            }
-        }
-        
-        return tagAttr;
-    }
-
-    private void ensureAllAttributes()
-    {
-        if (_isInitialized.compareAndSet(false, true))
-        {
-            for (final Iterator it = _tldElement.getAttributes().iterator(); it.hasNext();)
-            {
-                final CMAttributeDeclaration attrDecl = (CMAttributeDeclaration) it.next();
-                getOrCreateAttribute(attrDecl.getAttrName());
-            }
-        }
-    }
-
-    public void clear()
-    {
-        throw new UnsupportedOperationException("Cannot modify map"); //$NON-NLS-1$
-    }
-
-    public ITagAttributeHandler put(String key, ITagAttributeHandler value)
-    {
-        throw new UnsupportedOperationException("Cannot modify map"); //$NON-NLS-1$
-    }
-
-    public void putAll(Map<? extends String, ? extends ITagAttributeHandler> t)
-    {
-        throw new UnsupportedOperationException("Cannot modify map"); //$NON-NLS-1$
-    }
-
-    public ITagAttributeHandler remove(Object key)
-    {
-        throw new UnsupportedOperationException("Cannot modify map"); //$NON-NLS-1$
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/CompositeTagResolvingStrategy.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/CompositeTagResolvingStrategy.java
deleted file mode 100644
index 8037ff1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/CompositeTagResolvingStrategy.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.designtime.internal.view.model.jsp;
-
-import org.eclipse.jst.jsf.common.internal.policy.IIdentifiable;
-import org.eclipse.jst.jsf.common.internal.policy.IIteratorPolicy;
-import org.eclipse.jst.jsf.common.internal.strategy.IteratorPolicyBasedStrategyComposite;
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.ITagElement;
-import org.eclipse.jst.jsf.designtime.internal.Messages;
-
-/**
- * @author cbateman
- * 
- * @param <TLDELEMENT>
- */
-public class CompositeTagResolvingStrategy<TLDELEMENT>
-        extends
-        IteratorPolicyBasedStrategyComposite<TLDELEMENT, ITagElement, ITagElement, String, ITagResolvingStrategy<TLDELEMENT, String>>
-        implements IIdentifiable<String>,
-        ITagResolvingStrategy<TLDELEMENT, String>
-{
-    private static final String ID = "org.eclipse.jst.jsf.designtime.CompositeTagResolvingStrategy"; //$NON-NLS-1$
-
-    /**
-     * @param policy
-     * 
-     */
-    public CompositeTagResolvingStrategy(final IIteratorPolicy<String> policy)
-    {
-        super(policy);
-    }
-
-    public final String getId()
-    {
-        return ID;
-    }
-
-    public final String getDisplayName()
-    {
-        return Messages.CompositeTagResolvingStrategy_DisplayName;
-    }
-
-    @Override
-    public ITagElement getNoResult()
-    {
-        return null;
-    }
-
-    public final ITagElement getNotFoundIndicator()
-    {
-        return getNoResult();
-    }
-
-    public final ITagElement resolve(TLDELEMENT element)
-    {
-        return perform(element);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/DefaultJSPTagResolver.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/DefaultJSPTagResolver.java
deleted file mode 100644
index e34d56d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/DefaultJSPTagResolver.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.designtime.internal.view.model.jsp;
-
-import java.util.Iterator;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.jsf.common.runtime.internal.model.component.ComponentTypeInfo;
-import org.eclipse.jst.jsf.common.runtime.internal.model.decorator.ConverterTypeInfo;
-import org.eclipse.jst.jsf.common.runtime.internal.model.decorator.ValidatorTypeInfo;
-import org.eclipse.jst.jsf.common.runtime.internal.model.types.TypeInfo;
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.ITagElement;
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.IHandlerTagElement.TagHandlerType;
-import org.eclipse.jst.jsf.core.internal.tld.TagIdentifierFactory;
-import org.eclipse.jst.jsf.designtime.internal.Messages;
-import org.eclipse.jst.jsf.designtime.internal.view.mapping.ViewMetadataLoader;
-import org.eclipse.jst.jsf.designtime.internal.view.mapping.ViewMetadataMapper;
-import org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.TagMapping;
-import org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.TagToViewObjectMapping;
-import org.eclipse.jst.jsf.designtime.internal.view.model.jsp.IAttributeAdvisor.NullAttributeAdvisor;
-import org.eclipse.jst.jsp.core.internal.contentmodel.tld.provisional.TLDElementDeclaration;
-import org.osgi.framework.Version;
-
-/**
- * ** TEMPORARY CLASS UNTIL META-DATA STRATEGY IS AVAILABLE **
- * 
- * @author cbateman
- * 
- */
-public class DefaultJSPTagResolver extends JSPTagResolvingStrategy
-{
-    /**
-     * strategy id
-     */
-    public final static String                                   ID           = "org.eclipse.jst.jsf.metadata.DefaultJSPTagResolver"; //$NON-NLS-1$
-    /**
-     * displayable nameb
-     */
-    public final static String                                   DISPLAY_NAME = Messages.DefaultJSPTagResolver_DisplayName;
-
-    private final ViewMetadataLoader                                 _loader;
-    private final ViewMetadataMapper                                 _mapper;
-
-    /**
-     * @return the descriptor for this resolver strategy
-     */
-    public static StrategyDescriptor createDescriptor()
-    {
-        return new StrategyDescriptor(ID, DISPLAY_NAME);
-    }
-
-    /**
-     * @param project
-     */
-    public DefaultJSPTagResolver(final IProject project)
-    {
-        _loader = new ViewMetadataLoader(project);
-        _mapper = new ViewMetadataMapper();
-    }
-
-    @Override
-    public ITagElement resolve(final TLDElementDeclaration elementDecl)
-    {
-        //        final IProjectFacetVersion version = JSFAppConfigUtils
-        //                .getProjectFacet(_project);
-        //        final String versionAsString = version.getVersionString();
-        //        final JSFVersion jsfVersion = JSFVersion.valueOfString(versionAsString);
-
-        final TagIdentifier tagId = TagIdentifierFactory
-                                            .createTLDTagWrapper(elementDecl);
-        //        final DefaultTagTypeInfo defaultTagTypeInfo = new DefaultTagTypeInfo();
-        final TagMapping mapping =  _loader.getTagToViewMapping(tagId);
-
-        TypeInfo elementType = null;
-        if (mapping != null)
-        {
-            elementType = findTypeInfo(mapping, "1.1", null); //$NON-NLS-1$
-        }
-
-        if (elementType instanceof ComponentTypeInfo)
-        {
-            return new TLDComponentTagElement(elementDecl,
-                    (ComponentTypeInfo) elementType, 
-                    new MetadataAttributeAdvisor(tagId, _loader, elementDecl));
-        }
-        else if (elementType instanceof ConverterTypeInfo)
-        {
-            return new TLDConverterTagElement(elementDecl,
-                    (ConverterTypeInfo) elementType, 
-                    new MetadataAttributeAdvisor(tagId, _loader, elementDecl));
-        }
-        else if (elementType instanceof ValidatorTypeInfo)
-        {
-            return new TLDValidatorTagElement(elementDecl,
-                    (ValidatorTypeInfo) elementType, 
-                    new MetadataAttributeAdvisor(tagId, _loader, elementDecl));
-        }
-        else if (elementType instanceof TagHandlerType)
-        {
-            return new TLDTagHandlerElement(elementDecl,
-                    (TagHandlerType) elementType, 
-                    new MetadataAttributeAdvisor(tagId, _loader, elementDecl));
-        }
-        else if (DefaultTagTypeInfo.isDefaultLib(tagId.getUri()))
-        {
-            return new TLDTagElement(elementDecl, new NullAttributeAdvisor());
-        }
-
-        // not found
-        return null;
-    }
-
-    private TypeInfo findTypeInfo(final TagMapping mapping, final String jsfVersion,
-            final String libVersion)
-    {
-        final EList list = mapping.getVersionedTagToViewMappings();
-        
-        FIND_BY_VERSION : for (final Iterator<?> it = list.iterator(); it.hasNext();)
-        {
-            Object obj = it.next();
-            
-            if (obj instanceof TagToViewObjectMapping)
-            {
-                final TagToViewObjectMapping viewMapping = (TagToViewObjectMapping) obj;
-
-                final String minJsfVersionString = viewMapping.getMinJSFVersion();
-                if (minJsfVersionString != null)
-                {
-                    try
-                    {
-                        final Version version = new Version(jsfVersion);
-                        final Version minVersion = Version.parseVersion(minJsfVersionString);
-                        
-                        if (version.compareTo(minVersion) < 0)
-                        {
-                            // my version is less than the minimum specified
-                            // by this meta-data
-                            continue FIND_BY_VERSION;
-                        }
-                    }
-                    catch (final IllegalArgumentException iae)
-                    {
-                        continue FIND_BY_VERSION;
-                    }
-                }
-                final String minLibVersionString = viewMapping.getMinLibraryVersion();
-                if (libVersion != null && minLibVersionString != null)
-                {
-                    try
-                    {
-                        final Version version = new Version(libVersion);
-                        final Version minLibVersion = Version.parseVersion(minLibVersionString);
-                        
-                        if (version.compareTo(minLibVersion) < 0)
-                        {
-                            // my lib version is less than the minimum specified
-                            // by the meta-data
-                            continue FIND_BY_VERSION;
-                        }
-                    }
-                    catch (IllegalArgumentException iae)
-                    {
-                        continue FIND_BY_VERSION;
-                    }
-                }
-                return _mapper.mapToFrameworkData(viewMapping.getTypeInfo());
-            }
-        }
-        return null;
-    }
-
-    @Override
-    public String getId()
-    {
-        return ID;
-    }
-
-    public String getDisplayName()
-    {
-        return DISPLAY_NAME;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/DefaultTagTypeInfo.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/DefaultTagTypeInfo.java
deleted file mode 100644
index 6853c82..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/DefaultTagTypeInfo.java
+++ /dev/null
@@ -1,655 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.designtime.internal.view.model.jsp;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.jsf.common.runtime.internal.model.component.ComponentTypeInfo;
-import org.eclipse.jst.jsf.common.runtime.internal.model.decorator.ConverterTypeInfo;
-import org.eclipse.jst.jsf.common.runtime.internal.model.decorator.ValidatorTypeInfo;
-import org.eclipse.jst.jsf.common.runtime.internal.model.types.TypeInfo;
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.IHandlerTagElement.TagHandlerType;
-import org.eclipse.jst.jsf.core.JSFVersion;
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-
-/**
- * Hard-coded TypeInfo for default core and html JSF tags.
- * 
- * @author cbateman
- * 
- */
-public final class DefaultTagTypeInfo
-{
-    private final static Set<String> URI_IS_A_JSF_LIB;
-
-    static
-    {
-        final Set<String> libs = new HashSet<String>();
-        libs.add(ITLDConstants.URI_JSF_CORE);
-        libs.add(ITLDConstants.URI_JSF_HTML);
-        URI_IS_A_JSF_LIB = Collections.unmodifiableSet(libs);
-    }
-
-    /**
-     * @param tagId
-     * @param jsfVersion
-     * @return a type info for the tag id in jsf version or null if none.
-     */
-    public TypeInfo getTypeInfo(final TagIdentifier tagId,
-            final JSFVersion jsfVersion)
-    {
-
-        switch (jsfVersion)
-        {
-            case V1_0:
-            case V1_1:
-                return JSF11_ELEMENTS.get(tagId);
-
-            case V1_2:
-                return JSF12_ELEMENTS.get(tagId);
-
-            default:
-                return null;
-        }
-    }
-
-    /**
-     * @param uri
-     * @return true if uri is covered by this class
-     */
-    public static boolean isDefaultLib(final String uri)
-    {
-        return URI_IS_A_JSF_LIB.contains(uri);
-    }
-
-    private static final ComponentTypeInfo      COMPINFO_PARAM                 = new ComponentTypeInfo(
-                                                                                       "javax.faces.Parameter", //$NON-NLS-1$
-                                                                                       "javax.faces.component.UIParameter", //$NON-NLS-1$
-                                                                                       new String[]
-                                                                                       {
-            "javax.faces.component.UIComponentBase", //$NON-NLS-1$
-            "javax.faces.component.UIComponent", "java.lang.Object",                  }, //$NON-NLS-1$ //$NON-NLS-2$
-                                                                                       new String[]
-                                                                                       { "javax.faces.component.StateHolder", }, //$NON-NLS-1$
-                                                                                       "javax.faces.Parameter", //$NON-NLS-1$
-                                                                                       null);
-
-    private static final ComponentTypeInfo      COMPINFO_SELECTITEM            = new ComponentTypeInfo(
-                                                                                       "javax.faces.SelectItem", //$NON-NLS-1$
-                                                                                       "javax.faces.component.UISelectItem", //$NON-NLS-1$
-                                                                                       new String[]
-                                                                                       {
-            "javax.faces.component.UIComponentBase", //$NON-NLS-1$
-            "javax.faces.component.UIComponent", "java.lang.Object",                  }, //$NON-NLS-1$ //$NON-NLS-2$
-                                                                                       new String[]
-                                                                                       { "javax.faces.component.StateHolder", }, //$NON-NLS-1$
-                                                                                       "javax.faces.SelectItem", //$NON-NLS-1$
-                                                                                       null);
-
-    private static final ComponentTypeInfo      COMPINFO_SELECTITEMS           = new ComponentTypeInfo(
-                                                                                       "javax.faces.SelectItems", //$NON-NLS-1$
-                                                                                       "javax.faces.component.UISelectItems", //$NON-NLS-1$
-                                                                                       new String[]
-                                                                                       {
-            "javax.faces.component.UIComponentBase", //$NON-NLS-1$
-            "javax.faces.component.UIComponent", "java.lang.Object",                  }, //$NON-NLS-1$ //$NON-NLS-2$
-                                                                                       new String[]
-                                                                                       { "javax.faces.component.StateHolder", }, //$NON-NLS-1$
-                                                                                       "javax.faces.SelectItems", //$NON-NLS-1$
-                                                                                       null);
-
-    private static final ComponentTypeInfo      COMPINFO_SUBVIEW               = new ComponentTypeInfo(
-                                                                                       "javax.faces.NamingContainer", //$NON-NLS-1$
-                                                                                       "javax.faces.component.UINamingContainer", //$NON-NLS-1$
-                                                                                       new String[]
-                                                                                       {
-            "javax.faces.component.UIComponentBase", //$NON-NLS-1$
-            "javax.faces.component.UIComponent", "java.lang.Object",                  }, //$NON-NLS-1$ //$NON-NLS-2$
-                                                                                       new String[]
-                                                                                       {
-            "javax.faces.component.NamingContainer", //$NON-NLS-1$
-            "javax.faces.component.StateHolder",                                      }, //$NON-NLS-1$
-                                                                                       "javax.faces.NamingContainer", //$NON-NLS-1$
-                                                                                       null);
-
-    private static final ComponentTypeInfo      COMPINFO_VERBATIM              = new ComponentTypeInfo(
-                                                                                       "javax.faces.Output", //$NON-NLS-1$
-                                                                                       "javax.faces.component.UIOutput", //$NON-NLS-1$
-                                                                                       new String[]
-                                                                                       {
-            "javax.faces.component.UIComponentBase", //$NON-NLS-1$
-            "javax.faces.component.UIComponent", "java.lang.Object",                  }, //$NON-NLS-1$ //$NON-NLS-2$
-                                                                                       new String[]
-                                                                                       {
-            "javax.faces.component.ValueHolder", //$NON-NLS-1$
-            "javax.faces.component.StateHolder",                                      }, //$NON-NLS-1$
-                                                                                       "javax.faces.Output", //$NON-NLS-1$
-                                                                                       "javax.faces.Text"); //$NON-NLS-1$
-
-    private static final ComponentTypeInfo      COMPINFO_VIEW                  = new ComponentTypeInfo(
-                                                                                       "javax.faces.ViewRoot", //$NON-NLS-1$
-                                                                                       "javax.faces.component.UIViewRoot", //$NON-NLS-1$
-                                                                                       new String[]
-                                                                                       {
-            "javax.faces.component.UIComponentBase", //$NON-NLS-1$
-            "javax.faces.component.UIComponent", "java.lang.Object",                  }, //$NON-NLS-1$ //$NON-NLS-2$
-                                                                                       new String[]
-                                                                                       { "javax.faces.component.StateHolder", }, //$NON-NLS-1$
-                                                                                       "javax.faces.ViewRoot", //$NON-NLS-1$
-                                                                                       null);
-
-    // expected type info for jsf/html components
-    private static final ComponentTypeInfo      COMPINFO_COLUMN                = new ComponentTypeInfo(
-                                                                                       "javax.faces.Column", //$NON-NLS-1$
-                                                                                       "javax.faces.component.UIColumn", //$NON-NLS-1$
-                                                                                       new String[]
-                                                                                       {
-            "javax.faces.component.UIComponentBase", //$NON-NLS-1$
-            "javax.faces.component.UIComponent", "java.lang.Object"                   }, //$NON-NLS-1$ //$NON-NLS-2$
-                                                                                       new String[]
-                                                                                       { "javax.faces.component.StateHolder" }, //$NON-NLS-1$
-                                                                                       "javax.faces.Column", //$NON-NLS-1$
-                                                                                       null);
-    private static final ComponentTypeInfo      COMPINFO_COMMAND               = new ComponentTypeInfo(
-                                                                                       "javax.faces.HtmlCommandButton", //$NON-NLS-1$
-                                                                                       "javax.faces.component.html.HtmlCommandButton", //$NON-NLS-1$
-                                                                                       new String[]
-                                                                                       {
-            "javax.faces.component.UICommand", //$NON-NLS-1$
-            "javax.faces.component.UIComponentBase", //$NON-NLS-1$
-            "javax.faces.component.UIComponent", "java.lang.Object"                   }, //$NON-NLS-1$ //$NON-NLS-2$
-                                                                                       new String[]
-                                                                                       {
-            "javax.faces.component.ActionSource", //$NON-NLS-1$
-            "javax.faces.component.StateHolder"                                       }, //$NON-NLS-1$
-                                                                                       "javax.faces.Command", //$NON-NLS-1$
-                                                                                       "javax.faces.Button"); //$NON-NLS-1$
-    private static final ComponentTypeInfo      COMPINFO_COMMANDLINK           = new ComponentTypeInfo(
-                                                                                       "javax.faces.HtmlCommandLink", //$NON-NLS-1$
-                                                                                       "javax.faces.component.html.HtmlCommandLink", //$NON-NLS-1$
-                                                                                       new String[]
-                                                                                       {
-            "javax.faces.component.UICommand", //$NON-NLS-1$
-            "javax.faces.component.UIComponentBase", //$NON-NLS-1$
-            "javax.faces.component.UIComponent", "java.lang.Object"                   }, //$NON-NLS-1$ //$NON-NLS-2$
-                                                                                       new String[]
-                                                                                       {
-            "javax.faces.component.ActionSource", //$NON-NLS-1$
-            "javax.faces.component.StateHolder"                                       }, //$NON-NLS-1$
-                                                                                       "javax.faces.Command", //$NON-NLS-1$
-                                                                                       "javax.faces.Link"); //$NON-NLS-1$
-    private static final ComponentTypeInfo      COMPINFO_DATATABLE             = new ComponentTypeInfo(
-                                                                                       "javax.faces.HtmlDataTable", //$NON-NLS-1$
-                                                                                       "javax.faces.component.html.HtmlDataTable", //$NON-NLS-1$
-                                                                                       new String[]
-                                                                                       {
-            "javax.faces.component.UIData", //$NON-NLS-1$
-            "javax.faces.component.UIComponentBase", //$NON-NLS-1$
-            "javax.faces.component.UIComponent", "java.lang.Object"                   }, //$NON-NLS-1$ //$NON-NLS-2$
-                                                                                       new String[]
-                                                                                       {
-            "javax.faces.component.NamingContainer", //$NON-NLS-1$
-            "javax.faces.component.StateHolder"                                       }, //$NON-NLS-1$
-                                                                                       "javax.faces.Data", //$NON-NLS-1$
-                                                                                       "javax.faces.Table"); //$NON-NLS-1$
-    private static final ComponentTypeInfo      COMPINFO_FORM                  = new ComponentTypeInfo(
-                                                                                       "javax.faces.HtmlForm", //$NON-NLS-1$
-                                                                                       "javax.faces.component.html.HtmlForm", //$NON-NLS-1$
-                                                                                       new String[]
-                                                                                       {
-            "javax.faces.component.UIForm", //$NON-NLS-1$
-            "javax.faces.component.UIComponentBase", //$NON-NLS-1$
-            "javax.faces.component.UIComponent", "java.lang.Object"                   }, //$NON-NLS-1$ //$NON-NLS-2$
-                                                                                       new String[]
-                                                                                       {
-            "javax.faces.component.NamingContainer", //$NON-NLS-1$
-            "javax.faces.component.StateHolder"                                       }, //$NON-NLS-1$
-                                                                                       "javax.faces.Form", //$NON-NLS-1$
-                                                                                       "javax.faces.Form"); //$NON-NLS-1$
-    private static final ComponentTypeInfo      COMPINFO_GRAPHIC               = new ComponentTypeInfo(
-                                                                                       "javax.faces.HtmlGraphicImage", //$NON-NLS-1$
-                                                                                       "javax.faces.component.html.HtmlGraphicImage", //$NON-NLS-1$
-                                                                                       new String[]
-                                                                                       {
-            "javax.faces.component.UIGraphic", //$NON-NLS-1$
-            "javax.faces.component.UIComponentBase", //$NON-NLS-1$
-            "javax.faces.component.UIComponent", "java.lang.Object",                  }, //$NON-NLS-1$ //$NON-NLS-2$
-                                                                                       new String[]
-                                                                                       { "javax.faces.component.StateHolder", }, //$NON-NLS-1$
-                                                                                       "javax.faces.Graphic", //$NON-NLS-1$
-                                                                                       "javax.faces.Image"); //$NON-NLS-1$
-    private static final ComponentTypeInfo      COMPINFO_HIDDEN                = new ComponentTypeInfo(
-                                                                                       "javax.faces.HtmlInputHidden", //$NON-NLS-1$
-                                                                                       "javax.faces.component.html.HtmlInputHidden", //$NON-NLS-1$
-                                                                                       new String[]
-                                                                                       {
-            "javax.faces.component.UIInput", "javax.faces.component.UIOutput", //$NON-NLS-1$ //$NON-NLS-2$
-            "javax.faces.component.UIComponentBase", //$NON-NLS-1$
-            "javax.faces.component.UIComponent", "java.lang.Object",                  }, //$NON-NLS-1$ //$NON-NLS-2$
-                                                                                       new String[]
-                                                                                       {
-            "javax.faces.component.EditableValueHolder", //$NON-NLS-1$
-            "javax.faces.component.ValueHolder", //$NON-NLS-1$
-            "javax.faces.component.StateHolder",                                      }, //$NON-NLS-1$
-                                                                                       "javax.faces.Input", //$NON-NLS-1$
-                                                                                       "javax.faces.Hidden"); //$NON-NLS-1$
-    private static final ComponentTypeInfo      COMPINFO_SECRET                = new ComponentTypeInfo(
-                                                                                       "javax.faces.HtmlInputSecret", //$NON-NLS-1$
-                                                                                       "javax.faces.component.html.HtmlInputSecret", //$NON-NLS-1$
-                                                                                       new String[]
-                                                                                       {
-            "javax.faces.component.UIInput", "javax.faces.component.UIOutput", //$NON-NLS-1$ //$NON-NLS-2$
-            "javax.faces.component.UIComponentBase", //$NON-NLS-1$
-            "javax.faces.component.UIComponent", "java.lang.Object",                  }, //$NON-NLS-1$ //$NON-NLS-2$
-                                                                                       new String[]
-                                                                                       {
-            "javax.faces.component.EditableValueHolder", //$NON-NLS-1$
-            "javax.faces.component.ValueHolder", //$NON-NLS-1$
-            "javax.faces.component.StateHolder"                                       }, //$NON-NLS-1$
-                                                                                       "javax.faces.Input", //$NON-NLS-1$
-                                                                                       "javax.faces.Secret"); //$NON-NLS-1$
-    private static final ComponentTypeInfo      COMPINFO_INPUTTEXT             = new ComponentTypeInfo(
-                                                                                       "javax.faces.HtmlInputText", //$NON-NLS-1$
-                                                                                       "javax.faces.component.html.HtmlInputText", //$NON-NLS-1$
-                                                                                       new String[]
-                                                                                       {
-            "javax.faces.component.UIInput", "javax.faces.component.UIOutput", //$NON-NLS-1$ //$NON-NLS-2$
-            "javax.faces.component.UIComponentBase", //$NON-NLS-1$
-            "javax.faces.component.UIComponent", "java.lang.Object"                   }, //$NON-NLS-1$ //$NON-NLS-2$
-                                                                                       new String[]
-                                                                                       {
-            "javax.faces.component.EditableValueHolder", //$NON-NLS-1$
-            "javax.faces.component.ValueHolder", //$NON-NLS-1$
-            "javax.faces.component.StateHolder"                                       }, //$NON-NLS-1$
-                                                                                       "javax.faces.Input", //$NON-NLS-1$
-                                                                                       "javax.faces.Text"); //$NON-NLS-1$
-    private static final ComponentTypeInfo      COMPINFO_INPUTTEXTAREA         = new ComponentTypeInfo(
-                                                                                       "javax.faces.HtmlInputTextarea", //$NON-NLS-1$
-                                                                                       "javax.faces.component.html.HtmlInputTextarea", //$NON-NLS-1$
-                                                                                       new String[]
-                                                                                       {
-            "javax.faces.component.UIInput", "javax.faces.component.UIOutput", //$NON-NLS-1$ //$NON-NLS-2$
-            "javax.faces.component.UIComponentBase", //$NON-NLS-1$
-            "javax.faces.component.UIComponent", "java.lang.Object",                  }, //$NON-NLS-1$ //$NON-NLS-2$
-                                                                                       new String[]
-                                                                                       {
-            "javax.faces.component.EditableValueHolder", //$NON-NLS-1$
-            "javax.faces.component.ValueHolder", //$NON-NLS-1$
-            "javax.faces.component.StateHolder",                                      }, //$NON-NLS-1$
-                                                                                       "javax.faces.Input", //$NON-NLS-1$
-                                                                                       "javax.faces.Textarea"); //$NON-NLS-1$
-    private static final ComponentTypeInfo      COMPINFO_MESSAGE               = new ComponentTypeInfo(
-                                                                                       "javax.faces.HtmlMessage", //$NON-NLS-1$
-                                                                                       "javax.faces.component.html.HtmlMessage", //$NON-NLS-1$
-                                                                                       new String[]
-                                                                                       {
-            "javax.faces.component.UIMessage", //$NON-NLS-1$
-            "javax.faces.component.UIComponentBase", //$NON-NLS-1$
-            "javax.faces.component.UIComponent", "java.lang.Object",                  }, //$NON-NLS-1$ //$NON-NLS-2$
-                                                                                       new String[]
-                                                                                       { "javax.faces.component.StateHolder", }, //$NON-NLS-1$
-                                                                                       "javax.faces.Message", //$NON-NLS-1$
-                                                                                       "javax.faces.Message"); //$NON-NLS-1$
-    private static final ComponentTypeInfo      COMPINFO_MESSAGES              = new ComponentTypeInfo(
-                                                                                       "javax.faces.HtmlMessages", //$NON-NLS-1$
-                                                                                       "javax.faces.component.html.HtmlMessages", //$NON-NLS-1$
-                                                                                       new String[]
-                                                                                       {
-            "javax.faces.component.UIMessages", //$NON-NLS-1$
-            "javax.faces.component.UIComponentBase", //$NON-NLS-1$
-            "javax.faces.component.UIComponent", "java.lang.Object",                  }, //$NON-NLS-1$ //$NON-NLS-2$
-                                                                                       new String[]
-                                                                                       { "javax.faces.component.StateHolder", }, //$NON-NLS-1$
-                                                                                       "javax.faces.Messages", //$NON-NLS-1$
-                                                                                       "javax.faces.Messages"); //$NON-NLS-1$
-    private static final ComponentTypeInfo      COMPINFO_OUTPUTFORMAT          = new ComponentTypeInfo(
-                                                                                       "javax.faces.HtmlOutputFormat", //$NON-NLS-1$
-                                                                                       "javax.faces.component.html.HtmlOutputFormat", //$NON-NLS-1$
-                                                                                       new String[]
-                                                                                       {
-            "javax.faces.component.UIOutput", //$NON-NLS-1$
-            "javax.faces.component.UIComponentBase", //$NON-NLS-1$
-            "javax.faces.component.UIComponent", "java.lang.Object",                  }, //$NON-NLS-1$ //$NON-NLS-2$
-                                                                                       new String[]
-                                                                                       {
-            "javax.faces.component.ValueHolder", //$NON-NLS-1$
-            "javax.faces.component.StateHolder",                                      }, //$NON-NLS-1$
-                                                                                       "javax.faces.Output", //$NON-NLS-1$
-                                                                                       "javax.faces.Format"); //$NON-NLS-1$
-    private static final ComponentTypeInfo      COMPINFO_OUTPUTLABEL           = new ComponentTypeInfo(
-                                                                                       "javax.faces.HtmlOutputLabel", //$NON-NLS-1$
-                                                                                       "javax.faces.component.html.HtmlOutputLabel", //$NON-NLS-1$
-                                                                                       new String[]
-                                                                                       {
-            "javax.faces.component.UIOutput", //$NON-NLS-1$
-            "javax.faces.component.UIComponentBase", //$NON-NLS-1$
-            "javax.faces.component.UIComponent", "java.lang.Object",                  }, //$NON-NLS-1$ //$NON-NLS-2$
-                                                                                       new String[]
-                                                                                       {
-            "javax.faces.component.ValueHolder", //$NON-NLS-1$
-            "javax.faces.component.StateHolder",                                      }, //$NON-NLS-1$
-                                                                                       "javax.faces.Output", //$NON-NLS-1$
-                                                                                       "javax.faces.Label"); //$NON-NLS-1$
-    private static final ComponentTypeInfo      COMPINFO_OUTPUTLINK            = new ComponentTypeInfo(
-                                                                                       "javax.faces.HtmlOutputLink", //$NON-NLS-1$
-                                                                                       "javax.faces.component.html.HtmlOutputLink", //$NON-NLS-1$
-                                                                                       new String[]
-                                                                                       {
-            "javax.faces.component.UIOutput", //$NON-NLS-1$
-            "javax.faces.component.UIComponentBase", //$NON-NLS-1$
-            "javax.faces.component.UIComponent", "java.lang.Object",                  }, //$NON-NLS-1$ //$NON-NLS-2$
-                                                                                       new String[]
-                                                                                       {
-            "javax.faces.component.ValueHolder", //$NON-NLS-1$
-            "javax.faces.component.StateHolder",                                      }, //$NON-NLS-1$
-                                                                                       "javax.faces.Output", //$NON-NLS-1$
-                                                                                       "javax.faces.Link"); //$NON-NLS-1$
-    private static final ComponentTypeInfo      COMPINFO_OUTPUTTEXT            = new ComponentTypeInfo(
-                                                                                       "javax.faces.HtmlOutputText", //$NON-NLS-1$
-                                                                                       "javax.faces.component.html.HtmlOutputText", //$NON-NLS-1$
-                                                                                       new String[]
-                                                                                       {
-            "javax.faces.component.UIOutput", //$NON-NLS-1$
-            "javax.faces.component.UIComponentBase", //$NON-NLS-1$
-            "javax.faces.component.UIComponent", "java.lang.Object",                  }, //$NON-NLS-1$ //$NON-NLS-2$
-                                                                                       new String[]
-                                                                                       {
-            "javax.faces.component.ValueHolder", //$NON-NLS-1$
-            "javax.faces.component.StateHolder",                                      }, //$NON-NLS-1$
-                                                                                       "javax.faces.Output", //$NON-NLS-1$
-                                                                                       "javax.faces.Text"); //$NON-NLS-1$
-    private static final ComponentTypeInfo      COMPINFO_PANELGRID             = new ComponentTypeInfo(
-                                                                                       "javax.faces.HtmlPanelGrid", //$NON-NLS-1$
-                                                                                       "javax.faces.component.html.HtmlPanelGrid", //$NON-NLS-1$
-                                                                                       new String[]
-                                                                                       {
-            "javax.faces.component.UIPanel", //$NON-NLS-1$
-            "javax.faces.component.UIComponentBase", //$NON-NLS-1$
-            "javax.faces.component.UIComponent", "java.lang.Object",                  }, //$NON-NLS-1$ //$NON-NLS-2$
-                                                                                       new String[]
-                                                                                       { "javax.faces.component.StateHolder", }, //$NON-NLS-1$
-                                                                                       "javax.faces.Panel", //$NON-NLS-1$
-                                                                                       "javax.faces.Grid"); //$NON-NLS-1$
-    private static final ComponentTypeInfo      COMPINFO_PANELGROUP            = new ComponentTypeInfo(
-                                                                                       "javax.faces.HtmlPanelGroup", //$NON-NLS-1$
-                                                                                       "javax.faces.component.html.HtmlPanelGroup", //$NON-NLS-1$
-                                                                                       new String[]
-                                                                                       {
-            "javax.faces.component.UIPanel", //$NON-NLS-1$
-            "javax.faces.component.UIComponentBase", //$NON-NLS-1$
-            "javax.faces.component.UIComponent", "java.lang.Object",                  }, //$NON-NLS-1$ //$NON-NLS-2$
-                                                                                       new String[]
-                                                                                       { "javax.faces.component.StateHolder", }, //$NON-NLS-1$
-                                                                                       "javax.faces.Panel", //$NON-NLS-1$
-                                                                                       "javax.faces.Group"); //$NON-NLS-1$
-    private static final ComponentTypeInfo      COMPINFO_SELECTBOOLEANCHECKBOX = new ComponentTypeInfo(
-                                                                                       "javax.faces.HtmlSelectBooleanCheckbox", //$NON-NLS-1$
-                                                                                       "javax.faces.component.html.HtmlSelectBooleanCheckbox", //$NON-NLS-1$
-                                                                                       new String[]
-                                                                                       {
-            "javax.faces.component.UISelectBoolean", //$NON-NLS-1$
-            "javax.faces.component.UIInput", "javax.faces.component.UIOutput", //$NON-NLS-1$ //$NON-NLS-2$
-            "javax.faces.component.UIComponentBase", //$NON-NLS-1$
-            "javax.faces.component.UIComponent", "java.lang.Object",                  }, //$NON-NLS-1$ //$NON-NLS-2$
-                                                                                       new String[]
-                                                                                       {
-            "javax.faces.component.EditableValueHolder", //$NON-NLS-1$
-            "javax.faces.component.ValueHolder", //$NON-NLS-1$
-            "javax.faces.component.StateHolder",                                      }, //$NON-NLS-1$
-                                                                                       "javax.faces.SelectBoolean", //$NON-NLS-1$
-                                                                                       "javax.faces.Checkbox"); //$NON-NLS-1$
-    private static final ComponentTypeInfo      COMPINFO_SELECTMANYCHECKBOX    = new ComponentTypeInfo(
-                                                                                       "javax.faces.HtmlSelectManyCheckbox", //$NON-NLS-1$
-                                                                                       "javax.faces.component.html.HtmlSelectManyCheckbox", //$NON-NLS-1$
-                                                                                       new String[]
-                                                                                       {
-            "javax.faces.component.UISelectMany", //$NON-NLS-1$
-            "javax.faces.component.UIInput", "javax.faces.component.UIOutput", //$NON-NLS-1$ //$NON-NLS-2$
-            "javax.faces.component.UIComponentBase", //$NON-NLS-1$
-            "javax.faces.component.UIComponent", "java.lang.Object",                  }, //$NON-NLS-1$ //$NON-NLS-2$
-                                                                                       new String[]
-                                                                                       {
-            "javax.faces.component.EditableValueHolder", //$NON-NLS-1$
-            "javax.faces.component.ValueHolder", //$NON-NLS-1$
-            "javax.faces.component.StateHolder",                                      }, //$NON-NLS-1$
-                                                                                       "javax.faces.SelectMany", //$NON-NLS-1$
-                                                                                       "javax.faces.Checkbox"); //$NON-NLS-1$
-    private static final ComponentTypeInfo      COMPINFO_SELECTMANYLISTBOX     = new ComponentTypeInfo(
-                                                                                       "javax.faces.HtmlSelectManyListbox", //$NON-NLS-1$
-                                                                                       "javax.faces.component.html.HtmlSelectManyListbox", //$NON-NLS-1$
-                                                                                       new String[]
-                                                                                       {
-            "javax.faces.component.UISelectMany", //$NON-NLS-1$
-            "javax.faces.component.UIInput", "javax.faces.component.UIOutput", //$NON-NLS-1$ //$NON-NLS-2$
-            "javax.faces.component.UIComponentBase", //$NON-NLS-1$
-            "javax.faces.component.UIComponent", "java.lang.Object",                  }, //$NON-NLS-1$ //$NON-NLS-2$
-                                                                                       new String[]
-                                                                                       {
-            "javax.faces.component.EditableValueHolder", //$NON-NLS-1$
-            "javax.faces.component.ValueHolder", //$NON-NLS-1$
-            "javax.faces.component.StateHolder",                                      }, //$NON-NLS-1$
-                                                                                       "javax.faces.SelectMany", //$NON-NLS-1$
-                                                                                       "javax.faces.Listbox"); //$NON-NLS-1$
-    private static final ComponentTypeInfo      COMPINFO_SELECTMANYMENU        = new ComponentTypeInfo(
-                                                                                       "javax.faces.HtmlSelectManyMenu", //$NON-NLS-1$
-                                                                                       "javax.faces.component.html.HtmlSelectManyMenu", //$NON-NLS-1$
-                                                                                       new String[]
-                                                                                       {
-            "javax.faces.component.UISelectMany", //$NON-NLS-1$
-            "javax.faces.component.UIInput", "javax.faces.component.UIOutput", //$NON-NLS-1$ //$NON-NLS-2$
-            "javax.faces.component.UIComponentBase", //$NON-NLS-1$
-            "javax.faces.component.UIComponent", "java.lang.Object",                  }, //$NON-NLS-1$ //$NON-NLS-2$
-                                                                                       new String[]
-                                                                                       {
-            "javax.faces.component.EditableValueHolder", //$NON-NLS-1$
-            "javax.faces.component.ValueHolder", //$NON-NLS-1$
-            "javax.faces.component.StateHolder",                                      }, //$NON-NLS-1$
-                                                                                       "javax.faces.SelectMany", //$NON-NLS-1$
-                                                                                       "javax.faces.Menu"); //$NON-NLS-1$
-    private static final ComponentTypeInfo      COMPINFO_SELECTONELISTBOX      = new ComponentTypeInfo(
-                                                                                       "javax.faces.HtmlSelectOneListbox", //$NON-NLS-1$
-                                                                                       "javax.faces.component.html.HtmlSelectOneListbox", //$NON-NLS-1$
-                                                                                       new String[]
-                                                                                       {
-            "javax.faces.component.UISelectOne", //$NON-NLS-1$
-            "javax.faces.component.UIInput", "javax.faces.component.UIOutput", //$NON-NLS-1$ //$NON-NLS-2$
-            "javax.faces.component.UIComponentBase", //$NON-NLS-1$
-            "javax.faces.component.UIComponent", "java.lang.Object",                  }, //$NON-NLS-1$ //$NON-NLS-2$
-                                                                                       new String[]
-                                                                                       {
-            "javax.faces.component.EditableValueHolder", //$NON-NLS-1$
-            "javax.faces.component.ValueHolder", //$NON-NLS-1$
-            "javax.faces.component.StateHolder",                                      }, //$NON-NLS-1$
-                                                                                       "javax.faces.SelectOne", //$NON-NLS-1$
-                                                                                       "javax.faces.Listbox"); //$NON-NLS-1$
-    private static final ComponentTypeInfo      COMPINFO_SELECTONEMENU         = new ComponentTypeInfo(
-                                                                                       "javax.faces.HtmlSelectOneMenu", //$NON-NLS-1$
-                                                                                       "javax.faces.component.html.HtmlSelectOneMenu", //$NON-NLS-1$
-                                                                                       new String[]
-                                                                                       {
-            "javax.faces.component.UISelectOne", //$NON-NLS-1$
-            "javax.faces.component.UIInput", "javax.faces.component.UIOutput", //$NON-NLS-1$ //$NON-NLS-2$
-            "javax.faces.component.UIComponentBase", //$NON-NLS-1$
-            "javax.faces.component.UIComponent", "java.lang.Object",                  }, //$NON-NLS-1$ //$NON-NLS-2$
-                                                                                       new String[]
-                                                                                       {
-            "javax.faces.component.EditableValueHolder", //$NON-NLS-1$
-            "javax.faces.component.ValueHolder", //$NON-NLS-1$
-            "javax.faces.component.StateHolder",                                      }, //$NON-NLS-1$
-                                                                                       "javax.faces.SelectOne", //$NON-NLS-1$
-                                                                                       "javax.faces.Menu"); //$NON-NLS-1$
-    private static final ComponentTypeInfo      COMPINFO_SELECTONERADIO        = new ComponentTypeInfo(
-                                                                                       "javax.faces.HtmlSelectOneRadio", //$NON-NLS-1$
-                                                                                       "javax.faces.component.html.HtmlSelectOneRadio", //$NON-NLS-1$
-                                                                                       new String[]
-                                                                                       {
-            "javax.faces.component.UISelectOne", //$NON-NLS-1$
-            "javax.faces.component.UIInput", "javax.faces.component.UIOutput", //$NON-NLS-1$ //$NON-NLS-2$
-            "javax.faces.component.UIComponentBase", //$NON-NLS-1$
-            "javax.faces.component.UIComponent", "java.lang.Object",                  }, //$NON-NLS-1$ //$NON-NLS-2$
-                                                                                       new String[]
-                                                                                       {
-            "javax.faces.component.EditableValueHolder", //$NON-NLS-1$
-            "javax.faces.component.ValueHolder", //$NON-NLS-1$
-            "javax.faces.component.StateHolder",                                      }, //$NON-NLS-1$
-                                                                                       "javax.faces.SelectOne", //$NON-NLS-1$
-                                                                                       "javax.faces.Radio"); //$NON-NLS-1$
-
-    // default converters
-    private static final ConverterTypeInfo      CONVERTERINFO_DATETIME         = new ConverterTypeInfo(
-                                                                                       "javax.faces.convert.DateTimeConverter", //$NON-NLS-1$
-                                                                                       "javax.faces.DateTime"); //$NON-NLS-1$
-
-    private static final ConverterTypeInfo      CONVERTERINFO_NUMBER           = new ConverterTypeInfo(
-                                                                                       "javax.faces.convert.NumberConverter", //$NON-NLS-1$
-                                                                                       "javax.faces.Number"); //$NON-NLS-1$
-
-    // default validators
-    private static final ValidatorTypeInfo      VALIDATORINFO_DOUBLERANGE      = new ValidatorTypeInfo(
-                                                                                       "javax.faces.validator.DoubleRangeValidator", //$NON-NLS-1$
-                                                                                       "javax.faces.DoubleRange"); //$NON-NLS-1$
-
-    private static final ValidatorTypeInfo      VALIDATORINFO_LENGTH           = new ValidatorTypeInfo(
-                                                                                       "javax.faces.validator.LengthValidator", //$NON-NLS-1$
-                                                                                       "javax.faces.Length"); //$NON-NLS-1$
-
-    private static final ValidatorTypeInfo      VALIDATORINFO_LONGRANGE        = new ValidatorTypeInfo(
-                                                                                       "javax.faces.validator.LongRangeValidator", //$NON-NLS-1$
-                                                                                       "javax.faces.LongRange"); //$NON-NLS-1$
-
-    private static Map<TagIdentifier, TypeInfo> JSF11_ELEMENTS;
-    private static Map<TagIdentifier, TypeInfo> JSF12_ELEMENTS;
-
-    static
-    {
-        final Map<TagIdentifier, TypeInfo> commonElements = new HashMap<TagIdentifier, TypeInfo>();
-        // IJSFConstants.TAG_IDENTIFIER_PHASELISTENER);
-        // IJSFConstants.TAG_IDENTIFIER_SETPROPERTYACTIONLISTENER);
-
-        commonElements.put(IJSFConstants.TAG_IDENTIFIER_ACTIONLISTENER,
-                TagHandlerType.ACTIONLISTENER);
-        commonElements.put(IJSFConstants.TAG_IDENTIFIER_ATTRIBUTE,
-                TagHandlerType.ATTRIBUTE);
-        commonElements.put(IJSFConstants.TAG_IDENTIFIER_CONVERTDATETIME,
-                CONVERTERINFO_DATETIME);
-        commonElements.put(IJSFConstants.TAG_IDENTIFIER_CONVERTER,
-                ConverterTypeInfo.UNKNOWN);
-        commonElements.put(IJSFConstants.TAG_IDENTIFIER_CONVERTNUMBER,
-                CONVERTERINFO_NUMBER);
-        commonElements.put(IJSFConstants.TAG_IDENTIFIER_FACET, TagHandlerType.FACET);
-        // elements.put(IJSFConstants.TAG_IDENTIFIER_LOADBUNDLE,
-        // TagHandlerType.);
-        commonElements.put(IJSFConstants.TAG_IDENTIFIER_PARAM, COMPINFO_PARAM);
-        commonElements.put(IJSFConstants.TAG_IDENTIFIER_SELECTITEM,
-                COMPINFO_SELECTITEM);
-        commonElements.put(IJSFConstants.TAG_IDENTIFIER_SELECTITEMS,
-                COMPINFO_SELECTITEMS);
-        commonElements.put(IJSFConstants.TAG_IDENTIFIER_SUBVIEW, COMPINFO_SUBVIEW);
-        commonElements.put(IJSFConstants.TAG_IDENTIFIER_VALIDATEDOUBLERANGE,
-                VALIDATORINFO_DOUBLERANGE);
-        commonElements.put(IJSFConstants.TAG_IDENTIFIER_VALIDATELENGTH,
-                VALIDATORINFO_LENGTH);
-        commonElements.put(IJSFConstants.TAG_IDENTIFIER_VALIDATELONGRANGE,
-                VALIDATORINFO_LONGRANGE);
-        commonElements.put(IJSFConstants.TAG_IDENTIFIER_VALIDATOR,
-                ValidatorTypeInfo.UNKNOWN);
-        commonElements.put(IJSFConstants.TAG_IDENTIFIER_VALUECHANGELISTENER,
-                TagHandlerType.VALUECHANGELISTENER);
-        commonElements.put(IJSFConstants.TAG_IDENTIFIER_VERBATIM, COMPINFO_VERBATIM);
-        commonElements.put(IJSFConstants.TAG_IDENTIFIER_VIEW, COMPINFO_VIEW);
-
-        // JSF 1.2 core elements
-        // none currently...
-
-        // JSF 1.1/1.2 HTML tags
-        // html verifier
-        commonElements.put(IJSFConstants.TAG_IDENTIFIER_COLUMN, COMPINFO_COLUMN);
-
-        commonElements.put(IJSFConstants.TAG_IDENTIFIER_COMMANDBUTTON,
-                COMPINFO_COMMAND);
-
-        commonElements.put(IJSFConstants.TAG_IDENTIFIER_COMMANDLINK,
-                COMPINFO_COMMANDLINK);
-
-        commonElements.put(IJSFConstants.TAG_IDENTIFIER_DATA_TABLE,
-                COMPINFO_DATATABLE);
-
-        commonElements.put(IJSFConstants.TAG_IDENTIFIER_FORM, COMPINFO_FORM);
-
-        commonElements.put(IJSFConstants.TAG_IDENTIFIER_GRAPHICIMAGE,
-                COMPINFO_GRAPHIC);
-
-        commonElements.put(IJSFConstants.TAG_IDENTIFIER_INPUTHIDDEN, COMPINFO_HIDDEN);
-
-        commonElements.put(IJSFConstants.TAG_IDENTIFIER_INPUTSECRET, COMPINFO_SECRET);
-
-        commonElements
-                .put(IJSFConstants.TAG_IDENTIFIER_INPUTTEXT, COMPINFO_INPUTTEXT);
-
-        commonElements.put(IJSFConstants.TAG_IDENTIFIER_INPUTTEXTAREA,
-                COMPINFO_INPUTTEXTAREA);
-
-        commonElements.put(IJSFConstants.TAG_IDENTIFIER_MESSAGE, COMPINFO_MESSAGE);
-
-        commonElements.put(IJSFConstants.TAG_IDENTIFIER_MESSAGES, COMPINFO_MESSAGES);
-
-        commonElements.put(IJSFConstants.TAG_IDENTIFIER_OUTPUTFORMAT,
-                COMPINFO_OUTPUTFORMAT);
-
-        commonElements.put(IJSFConstants.TAG_IDENTIFIER_OUTPUTLABEL,
-                COMPINFO_OUTPUTLABEL);
-
-        commonElements.put(IJSFConstants.TAG_IDENTIFIER_OUTPUTLINK,
-                COMPINFO_OUTPUTLINK);
-
-        commonElements.put(IJSFConstants.TAG_IDENTIFIER_OUTPUTTEXT,
-                COMPINFO_OUTPUTTEXT);
-
-        commonElements.put(IJSFConstants.TAG_IDENTIFIER_PANEL_GRID,
-                COMPINFO_PANELGRID);
-
-        commonElements.put(IJSFConstants.TAG_IDENTIFIER_PANEL_GROUP,
-                COMPINFO_PANELGROUP);
-
-        commonElements.put(IJSFConstants.TAG_IDENTIFIER_SELECTBOOLEANCHECKBOX,
-                COMPINFO_SELECTBOOLEANCHECKBOX);
-
-        commonElements.put(IJSFConstants.TAG_IDENTIFIER_SELECTMANYCHECKBOX,
-                COMPINFO_SELECTMANYCHECKBOX);
-
-        commonElements.put(IJSFConstants.TAG_IDENTIFIER_SELECTMANYLISTBOX,
-                COMPINFO_SELECTMANYLISTBOX);
-
-        commonElements.put(IJSFConstants.TAG_IDENTIFIER_SELECTMANYMENU,
-                COMPINFO_SELECTMANYMENU);
-
-        commonElements.put(IJSFConstants.TAG_IDENTIFIER_SELECTONELISTBOX,
-                COMPINFO_SELECTONELISTBOX);
-
-        commonElements.put(IJSFConstants.TAG_IDENTIFIER_SELECTONEMENU,
-                COMPINFO_SELECTONEMENU);
-
-        commonElements.put(IJSFConstants.TAG_IDENTIFIER_SELECTONERADIO,
-                COMPINFO_SELECTONERADIO);
-
-        JSF11_ELEMENTS = Collections.unmodifiableMap(commonElements);
-
-        JSF12_ELEMENTS = Collections
-                .unmodifiableMap(new HashMap<TagIdentifier, TypeInfo>(commonElements));
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/IAttributeAdvisor.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/IAttributeAdvisor.java
deleted file mode 100644
index 37596b2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/IAttributeAdvisor.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.designtime.internal.view.model.jsp;
-
-import java.util.Collections;
-import java.util.Map;
-
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.ITagAttribute;
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.ITagAttributeHandler;
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.TagAttributeHandler;
-
-/**
- * @author cbateman
- *
- */
-public interface IAttributeAdvisor
-{
-
-    /**
-     * @param name
-     * @return a tag attribute handler for the name.
-     * @throws UnknownAttributeException if name does not match a known attribute.
-     */
-    ITagAttributeHandler createAttributeHandler(String name) throws UnknownAttributeException;
-
-    /**
-     * @return a map of attributes indexed by local name
-     */
-    Map<String, ? extends ITagAttribute> getAttributes();
-
-    /**
-     * @author cbateman
-     *
-     */
-    public static class NullAttributeAdvisor implements IAttributeAdvisor
-    {
-        public ITagAttributeHandler createAttributeHandler(String name)
-                throws UnknownAttributeException
-        {
-            return new TagAttributeHandler(null, name, false);
-        }
-
-        public Map<String, ? extends ITagAttribute> getAttributes()
-        {
-            return Collections.emptyMap();
-        }
-    }
-
-    /**
-     * Indicates an unknown attribute was requested or encountered
-     * @author cbateman
-     *
-     */
-    public static class UnknownAttributeException extends Exception
-    {
-        /**
-         * 
-         */
-        private static final long serialVersionUID = -988838913707929315L;
-
-        /**
-         * 
-         */
-        public UnknownAttributeException()
-        {
-            super();
-        }
-
-        /**
-         * @param message
-         * @param cause
-         */
-        public UnknownAttributeException(String message, Throwable cause)
-        {
-            super(message, cause);
-        }
-
-        /**
-         * @param message
-         */
-        public UnknownAttributeException(String message)
-        {
-            super(message);
-        }
-
-        /**
-         * @param cause
-         */
-        public UnknownAttributeException(Throwable cause)
-        {
-            super(cause);
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/ITagResolvingStrategy.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/ITagResolvingStrategy.java
deleted file mode 100644
index 4befb22..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/ITagResolvingStrategy.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.designtime.internal.view.model.jsp;
-
-import org.eclipse.jst.jsf.common.internal.strategy.IIdentifiableStrategy;
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.ITagElement;
-
-/**
- * Describes an algorithm that can produce ITagElements from <TLD> objects.
- * 
- * @author cbateman
- * @param <TLDELEMENT> the object type that describes a tag library.
- * @param <IDTYPE> 
- * 
- */
-public interface ITagResolvingStrategy<TLDELEMENT, IDTYPE> extends 
-    IIdentifiableStrategy<TLDELEMENT, ITagElement, IDTYPE>
-{
-    /**
-     * @param element
-     * @return a new tag element or {@link #getNotFoundIndicator()} if not found
-     */
-    ITagElement resolve(TLDELEMENT element);
-
-    /**
-     * @return the ITagElement (may be null) that indicates that
-     *         resolve(TLDELEMENT) could not resolve a tag.  The return
-     *         must be testable with standard "==" operator and not equals().
-     */
-    ITagElement getNotFoundIndicator();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/JSPTagResolvingStrategy.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/JSPTagResolvingStrategy.java
deleted file mode 100644
index 8f2235d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/JSPTagResolvingStrategy.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.designtime.internal.view.model.jsp;
-
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.ITagElement;
-import org.eclipse.jst.jsp.core.internal.contentmodel.tld.provisional.TLDElementDeclaration;
-
-/**
- * A strategy for resolving JSP TLDs.
- * 
- * @author cbateman
- *
- */
-public abstract class JSPTagResolvingStrategy extends
-        AbstractTagResolvingStrategy<TLDElementDeclaration, String>
-{
-    @Override
-    public abstract ITagElement resolve(TLDElementDeclaration element);
-
-    public abstract String getId();
-    
-    public abstract String getDisplayName();
-    
-    /**
-     * A descriptor for JSP tag resolving strategies
-     * 
-     * @author cbateman
-     *
-     */
-    public final static class StrategyDescriptor
-    {
-        private final String _id;
-        private final String _displayName;
-
-        /**
-         * @param id
-         * @param displayName
-         */
-        public StrategyDescriptor(final String id, final String displayName)
-        {
-            _id = id;
-            _displayName = displayName;
-        }
-        
-        /**
-         * @return the id of the strategy
-         */
-        public String getId()
-        {
-            return _id;
-        }
-        /**
-         * @return the human-readable displayable name of the strategy
-         */
-        public String getDisplayName()
-        {
-            return _displayName;
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/Messages.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/Messages.java
deleted file mode 100644
index 9d3dcee..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/Messages.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package org.eclipse.jst.jsf.designtime.internal.view.model.jsp;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * NLS message getter.
- * 
- * @author cbateman
- *
- */
-public class Messages extends NLS
-{
-    private static final String BUNDLE_NAME = "org.eclipse.jst.jsf.designtime.internal.view.model.jsp.messages"; //$NON-NLS-1$
-    /**
-     * see messages.properties
-     */
-    public static String UnresolvedJSPTagResolvingStrategy_1;
-    static
-    {
-        // initialize resource bundle
-        NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-    }
-
-    private Messages()
-    {
-        // no external instantiation
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/MetadataAttributeAdvisor.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/MetadataAttributeAdvisor.java
deleted file mode 100644
index df2c7ac..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/MetadataAttributeAdvisor.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.designtime.internal.view.model.jsp;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.ComponentPropertyHandler;
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.ITagAttribute;
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.ITagAttributeHandler;
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.TagAttributeHandler;
-import org.eclipse.jst.jsf.designtime.internal.view.mapping.ViewMetadataLoader;
-import org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.AttributeToPropertyMapping;
-import org.eclipse.jst.jsp.core.internal.contentmodel.tld.provisional.TLDAttributeDeclaration;
-import org.eclipse.jst.jsp.core.internal.contentmodel.tld.provisional.TLDElementDeclaration;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
-
-/* package */class MetadataAttributeAdvisor implements IAttributeAdvisor
-{
-    private final TagIdentifier      _tagId;
-    private final ViewMetadataLoader _loader;
-    private final TLDElementDeclaration _tldElement;
-
-    public MetadataAttributeAdvisor(final TagIdentifier tagId,
-            final ViewMetadataLoader loader, TLDElementDeclaration tldElement)
-    {
-        _tagId = tagId;
-        _loader = loader;
-        _tldElement = tldElement;
-    }
-
-    public ITagAttributeHandler createAttributeHandler(final String name)
-    throws UnknownAttributeException
-    {
-        final AttributeToPropertyMapping mapping = _loader.getAttributeMapping(
-                _tagId, name);
-        if (mapping != null)
-        {
-            final String customHandler = mapping.getCustomConversionFactoryId();
-            final boolean isELAllowed = mapping.isElAllowed();
-            final String propertyName = mapping.getPropertyName();
-            if (propertyName != null)
-            {
-                return new ComponentPropertyHandler(customHandler, name,
-                        isELAllowed, propertyName);
-            }
-            return new TagAttributeHandler(customHandler, name, isELAllowed);
-        }
-        return new TagAttributeHandler(null, name, false);
-    }
-
-    public Map<String, ? extends ITagAttribute> getAttributes()
-    {
-        final Map<String, TLDTagAttribute> attributes = new HashMap<String, TLDTagAttribute>();
-        
-        for (int i = 0; i < _tldElement.getAttributes().getLength(); i++)
-        {
-            CMNode item = _tldElement.getAttributes().item(i);
-            if (item instanceof TLDAttributeDeclaration)
-            {
-                TLDTagAttribute attr = new TLDTagAttribute((TLDAttributeDeclaration) item);
-                attributes.put(attr.getName(), attr);
-            }
-        }
-        return attributes;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/TLDComponentTagElement.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/TLDComponentTagElement.java
deleted file mode 100644
index 416bc16..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/TLDComponentTagElement.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.designtime.internal.view.model.jsp;
-
-import org.eclipse.jst.jsf.common.runtime.internal.model.component.ComponentTypeInfo;
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.IComponentTagElement;
-import org.eclipse.jst.jsp.core.internal.contentmodel.tld.provisional.TLDElementDeclaration;
-
-
-
-/**
- * A TLD-defined tag (i.e. JSP) that maps one-to-one with a JSF UIComponent
- * @author cbateman
- *
- */
-public class TLDComponentTagElement extends TLDJSFTagElement implements
-IComponentTagElement
-{
-    /**
-     * 
-     */
-    private static final long serialVersionUID = -6479445622102799425L;
-    private final ComponentTypeInfo     _componentTypeInfo;
-
-    /**
-     * @param elementDecl
-     * @param componentTypeInfo
-     * @param advisor 
-     */
-    public TLDComponentTagElement(final TLDElementDeclaration elementDecl
-            , final ComponentTypeInfo componentTypeInfo, final IAttributeAdvisor advisor)
-    {
-        super(elementDecl, advisor);
-        _componentTypeInfo = componentTypeInfo;
-    }
-
-    public ComponentTypeInfo getComponent()
-    {
-        return _componentTypeInfo;
-    }
-
-    @Override
-    public TagType getType()
-    {
-        return TagType.COMPONENT;
-    }
-
-    @Override
-    public String toString()
-    {
-        final String attributes = constructAttributesString();
-        return _componentTypeInfo.toString() +
-            (!"".equals(attributes) ? "\n" + attributes : ""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/TLDConverterTagElement.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/TLDConverterTagElement.java
deleted file mode 100644
index 257a6f4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/TLDConverterTagElement.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.designtime.internal.view.model.jsp;
-
-import org.eclipse.jst.jsf.common.runtime.internal.model.decorator.ConverterTypeInfo;
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.IConverterTagElement;
-import org.eclipse.jst.jsp.core.internal.contentmodel.tld.provisional.TLDElementDeclaration;
-
-/**
- * A TLD-defined tag (i.e. JSP) that maps one-to-one with a JSF Converter
- * 
- * @author cbateman
- *
- */
-public class TLDConverterTagElement extends TLDJSFTagElement implements IConverterTagElement
-{
-    /**
-     * 
-     */
-    private static final long serialVersionUID = 2854457220470229847L;
-    private final ConverterTypeInfo     _converterTypeInfo;
-
-    /**
-     * @param elementDecl
-     * @param converterTypeInfo
-     * @param advisor 
-     */
-    public TLDConverterTagElement(final TLDElementDeclaration elementDecl, final ConverterTypeInfo converterTypeInfo, final IAttributeAdvisor advisor)
-    {
-        super(elementDecl, advisor);
-        _converterTypeInfo = converterTypeInfo;
-    }
-
-    @Override
-    public TagType getType()
-    {
-        return TagType.CONVERTER;
-    }
-
-    /**
-     * @return the type info for this converter
-     */
-    public final ConverterTypeInfo getConverter()
-    {
-        return _converterTypeInfo;
-    }
-
-    @Override
-    public String toString()
-    {
-        return _converterTypeInfo.toString();
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/TLDJSFTagElement.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/TLDJSFTagElement.java
deleted file mode 100644
index 58f88a8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/TLDJSFTagElement.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.designtime.internal.view.model.jsp;
-
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.IJSFTagElement;
-import org.eclipse.jst.jsp.core.internal.contentmodel.tld.provisional.TLDElementDeclaration;
-
-/**
- * A JSF tag element.
- * 
- * @author cbateman
- * 
- */
-public abstract class TLDJSFTagElement extends TLDTagElement implements
-        IJSFTagElement
-{
-    /**
-     * 
-     */
-    private static final long serialVersionUID = -7629153104201317346L;
-
-    /**
-     * @param elementDecl
-     * @param advisor 
-     */
-    public TLDJSFTagElement(final TLDElementDeclaration elementDecl
-            , final IAttributeAdvisor advisor)
-    {
-        super(elementDecl, advisor);
-    }
-
-    public abstract TagType getType();
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/TLDNamespace.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/TLDNamespace.java
deleted file mode 100644
index 043ffe7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/TLDNamespace.java
+++ /dev/null
@@ -1,314 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.designtime.internal.view.model.jsp;
-
-import java.io.Serializable;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.core.runtime.jobs.ILock;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.ITagElement;
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.Namespace;
-import org.eclipse.jst.jsf.designtime.internal.view.model.jsp.persistence.SerializableTLDNamespace;
-import org.eclipse.jst.jsp.core.internal.contentmodel.tld.provisional.TLDDocument;
-import org.eclipse.jst.jsp.core.internal.contentmodel.tld.provisional.TLDElementDeclaration;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
-
-/**
- * Represents a JSP tag library namespace
- * 
- * @author cbateman
- * 
- */
-public class TLDNamespace extends Namespace
-{
-    /**
-     * 
-     */
-    private static final long          serialVersionUID = 9206460825737988441L;
-    private TLDNamespaceData _tldData;
-
-    /**
-     * @param tldDoc
-     * @param tagResolver
-     */
-    public TLDNamespace(
-            final TLDDocument tldDoc,
-            final ITagResolvingStrategy<TLDElementDeclaration, String> tagResolver)
-    {
-        _tldData = new DocumentTLDNamespaceData(tldDoc, tagResolver);
-    }
-
-    @Override
-    public final String getDisplayName()
-    {
-        return _tldData.getDisplayName();
-    }
-
-    @Override
-    public final String getNSUri()
-    {
-        return _tldData.getUri();
-    }
-
-    @Override
-    public boolean isInitialized()
-    {
-        return _tldData.isInitialized();
-    }
-
-    public final ITagElement getViewElement(final String name)
-    {
-        // // bias the table small if this creates it
-        // final Map<String, ITagElement> tags = getOrCreateMap(3);
-        //
-        // return _tldData.getOrCreateTagElement(name, tags);
-        return _tldData.getViewElement(name);
-    }
-
-    @Override
-    public final Collection<? extends ITagElement> getViewElements()
-    {
-        return Collections.unmodifiableCollection(_tldData.getAllViewElements().values());
-    }
-
-    /**
-     * Differs from getViewElements because it won't include those elements
-     * that haven't been lazily loaded.
-     * 
-     * @return an unmodifiable map of all elements currently calculated for
-     * this namespaces
-     */
-    public final Map<String, ITagElement> getCurrentElements()
-    {
-        return Collections.unmodifiableMap(_tldData.getCurrentElements());
-    }
-    
-    @Override
-    public final boolean hasViewElements()
-    {
-        return _tldData.getNumTags() > 0;
-    }
-    
-
-    private Object writeReplace()
-    {
-        return new SerializableTLDNamespace(this);
-    }
-
-    private static class DocumentTLDNamespaceData extends TLDNamespaceData
-    {
-        /**
-         * 
-         */
-        private static final long serialVersionUID = -1098872687238068584L;
-        private final transient TLDDocument                                          _tldDoc;
-        private final transient ITagResolvingStrategy<TLDElementDeclaration, String> _tagResolver;
-        private final transient ILock                                                _tagMapReadWriteLock;
-        // should only be accessed directly in getOrCreateMap;
-        private Map<String, ITagElement>                                             _tags; // lazy init in initializeTags
-
-        public DocumentTLDNamespaceData(
-                final TLDDocument tldDoc,
-                final ITagResolvingStrategy<TLDElementDeclaration, String> tagResolver)
-        {
-            _tldDoc = tldDoc;
-            _tagResolver = tagResolver;
-            _tagMapReadWriteLock = Job.getJobManager().newLock();
-        }
-
-        @Override
-        public String getDisplayName()
-        {
-            String displayName = _tldDoc.getDisplayName();
-            if (displayName == null || "".equals(displayName.trim())) //$NON-NLS-1$
-            {
-                displayName = getUri();
-            }
-            return displayName;
-        }
-
-        @Override
-        public String getUri()
-        {
-            return _tldDoc.getUri();
-        }
-
-        @Override
-        public int getNumTags()
-        {
-            return _tldDoc.getElements().getLength();
-        }
-
-        private ITagElement createTagElement(final String name)
-        {
-            CMNode cmNode = _tldDoc.getElements().getNamedItem(name);
-            ITagElement tagElement = null;
-            if (cmNode instanceof TLDElementDeclaration)
-            {
-                tagElement = _tagResolver
-                        .resolve((TLDElementDeclaration) cmNode);
-
-                if (tagElement == _tagResolver.getNotFoundIndicator())
-                {
-                    // the not-found indicator may not be null.
-                    tagElement = null;
-                }
-            }
-            return tagElement;
-        }
-
-        public final Map<String, ITagElement> getAllViewElements()
-        {
-            final CMNamedNodeMap elementMap = _tldDoc.getElements();
-            final Map<String, ITagElement> tags = getOrCreateMap(elementMap
-                    .getLength());
-            if (!isInitialized())
-            {
-                // if we create the table with this call, bias the table size
-                // to be 1 bigger than the number of tags, since we know if it's
-                // smaller, it'll cause at least one buffer resize
-                
-    
-                for (int i = 0; i < elementMap.getLength(); i++)
-                {
-                    final CMNode cmNode = elementMap.item(i);
-                    getViewElement(cmNode.getNodeName());
-                }
-            }
-            return tags;
-        }
-
-        public ITagElement getViewElement(final String name)
-        {
-            ITagElement tagElement = null;
-
-            _tagMapReadWriteLock.acquire();
-            final Map<String, ITagElement> tags = getOrCreateMap(_tldDoc.getElements().getLength());
-            try
-            {
-                tagElement = tags.get(name);
-
-                if (tagElement == null)
-                {
-                    tagElement = createTagElement(name);
-
-                    if (tagElement != null)
-                    {
-                        tags.put(tagElement.getName(), tagElement);
-                    }
-                }
-            }
-            finally
-            {
-                _tagMapReadWriteLock.release();
-            }
-
-            return tagElement;
-        }
-
-        /**
-         * mapSizeHint will be used
-         * 
-         * @param mapSizeHint
-         * @return the map
-         */
-        private synchronized Map<String, ITagElement> getOrCreateMap(
-                final int mapSizeHint)
-        {
-            if (_tags == null)
-            {
-                final float loadFactor = 0.75f;
-                final int initSize = ((int) (mapSizeHint / loadFactor)) + 1;
-                _tags = Collections
-                        .synchronizedMap(new HashMap<String, ITagElement>(
-                                initSize));
-            }
-            return _tags;
-        }
-
-        @Override
-        public boolean isInitialized()
-        {
-            int numTags = getNumTags();
-            int tagMapSize = getOrCreateMap(3).size();
-
-            // we are only initialized if the tag map is the equal in size
-            // to the number of tags in the tld.
-            return numTags == tagMapSize;
-        }
-
-        @Override
-        public Map<String, ITagElement> getCurrentElements()
-        {
-            return getOrCreateMap(3);
-        }
-    }
-
-    /**
-     * Encapsulates all the data for a TLDNamespace.  Allows the model
-     * to be separated from the Namespace interface for ease of serialization and 
-     * controlled subclassing.
-     *
-     */
-    public abstract static class TLDNamespaceData implements Serializable
-    {
-        /**
-         * 
-         */
-        private static final long serialVersionUID = -1284294636936289804L;
-
-        /**
-         * @return the displayb
-         */
-        public abstract String getDisplayName();
-
-//        public abstract ITagElement getOrCreateTagElement(String name,
-//                Map<String, ITagElement> tags);
-
-        /**
-         * @return the number of tags
-         */
-        public abstract int getNumTags();
-
-        /**
-         * @return the namespace uri
-         */
-        public abstract String getUri();
-
-        /**
-         * @param name
-         * @return the view element for name or null if not found.
-         */
-        public abstract ITagElement getViewElement(final String name);
-
-        /**
-         * May be long running since it will lazily calculate all unloaded
-         * tags.
-         * @return all view elements for this namespace
-         */
-        public abstract Map<String, ITagElement> getAllViewElements();
-
-        /**
-         * @return true if all elements have been lazily loaded
-         */
-        public abstract boolean isInitialized();
-        
-        /**
-         * @return just the currently loaded elements for this namespace.
-         */
-        public abstract Map<String, ITagElement>  getCurrentElements();
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/TLDTagAttribute.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/TLDTagAttribute.java
deleted file mode 100644
index 94ac599..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/TLDTagAttribute.java
+++ /dev/null
@@ -1,213 +0,0 @@
-package org.eclipse.jst.jsf.designtime.internal.view.model.jsp;
-
-import java.io.IOException;
-import java.io.Serializable;
-
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.AbstractTagAttribute;
-import org.eclipse.jst.jsp.core.internal.contentmodel.tld.provisional.TLDAttributeDeclaration;
-
-/**
- * Adapts a TLDAttributeDeclaration to the ITagAttribute interface.
- * 
- * @author cbateman
- *
- */
-public class TLDTagAttribute extends AbstractTagAttribute
-{
-
-    /**
-     * 
-     */
-    private static final long serialVersionUID = 4327701042556836452L;
-
-    private final TLDAttributeData _tldData;
-
-    /**
-     * @param decl 
-     */
-    public TLDTagAttribute(final TLDAttributeDeclaration decl)
-    {
-        _tldData = new DocumentAttributeData(decl);
-    }
-
-    @Override
-    public String getName()
-    {
-        return _tldData.getName();
-    }
-
-    @Override
-    public String getDisplayName()
-    {
-        return _tldData.getDisplayName();
-    }
-
-    @Override
-    public String getDescription() {
-        return _tldData.getDescription();
-    }
-
-    @Override
-    public String getTargetNamespace()
-    {
-        return _tldData.getTargetNamespace();
-    }
-
-    public boolean isRequired()
-    {
-        return _tldData.isRequired();
-    }
-
-    /**
-     * Diagnostic only.  For testing only. Should never be exposed on ITagAttribute.
-     * 
-     * @return true if this instance wraps a SerializedTLDAttributeData (the
-     * instance was created by readObject).  False if it is wrapping a 
-     * TLDAttributeDeclaration.
-     */
-    public boolean hasBeenDeserialized()
-    {
-       return _tldData instanceof SerializedTLDAttributeData; 
-    }
-    @Override
-    public String toString()
-    {
-        return String.format("Attribute: name=%s, displayName=%s, description=%s\n" //$NON-NLS-1$
-                , getName(), getDisplayName(), getDescription());
-    }
-
-    private static class DocumentAttributeData extends TLDAttributeData
-    {
-        /**
-         * 
-         */
-        private static final long serialVersionUID = -5974753636507938515L;
-        private final TLDAttributeDeclaration       _decl;
-        
-        
-        public DocumentAttributeData(TLDAttributeDeclaration decl)
-        {
-            super();
-            _decl = decl;
-        }
-
-        private Object writeReplace()
-        {
-            return new SerializedTLDAttributeData(getName(), getDisplayName(), getDescription()
-                    , getTargetNamespace(), isRequired());
-        }
-
-        @SuppressWarnings("unused")
-        private void readObject(java.io.ObjectInputStream in)
-                        throws IOException, ClassNotFoundException
-        {
-            throw new UnsupportedOperationException("This object should be serialized; writeReplace"); //$NON-NLS-1$
-        }
-
-        @Override
-        public String getName()
-        {
-            return _decl.getAttrName();
-        }
-
-        @Override
-        public String getTargetNamespace()
-        {
-            return null;
-        }
-
-        @Override
-        public String getDescription()
-        {
-            return _decl.getDescription();
-        }
-
-        @Override
-        public String getDisplayName()
-        {
-            return _decl.getAttrName();
-        }
-
-        @Override
-        public boolean isRequired()
-        {
-            return _decl.isRequired();
-        }
-
-    }
-
-    /**
-     * @author cbateman
-     *
-     */
-    private static class SerializedTLDAttributeData extends TLDAttributeData
-    {
-        /**
-         * 
-         */
-        private static final long serialVersionUID = -1094006883222087189L;
-
-        private final String _name;
-        private final String _displayName;
-        private final String _description;
-        private final String _targetNamespace;
-        private final boolean _isRequired;
-        
-        
-        
-        public SerializedTLDAttributeData(String name, String displayName,
-                String description, String targetNamespace, boolean isRequired)
-        {
-            super();
-            _name = name;
-            _displayName = displayName;
-            _description = description;
-            _targetNamespace = targetNamespace;
-            _isRequired = isRequired;
-        }
-
-        @Override
-        public String getName()
-        {
-            return _name;
-        }
-
-        @Override
-        public String getDisplayName()
-        {
-            return _displayName;
-        }
-
-        @Override
-        public String getDescription()
-        {
-            return _description;
-        }
-
-        @Override
-        public String getTargetNamespace()
-        {
-            return _targetNamespace;
-        }
-
-        @Override
-        public boolean isRequired()
-        {
-            return _isRequired;
-        }
-
-    }
-
-    private static abstract class TLDAttributeData implements Serializable
-    {
-        /**
-         * 
-         */
-        private static final long serialVersionUID = 8376571212994363562L;
-        public abstract String getName();
-        public abstract String getDisplayName();
-        public abstract String getDescription();
-        public abstract String getTargetNamespace();
-        public abstract boolean isRequired();
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/TLDTagElement.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/TLDTagElement.java
deleted file mode 100644
index 001e1ae..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/TLDTagElement.java
+++ /dev/null
@@ -1,258 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.designtime.internal.view.model.jsp;
-
-import java.io.IOException;
-import java.io.Serializable;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Map.Entry;
-
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.ITagAttribute;
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.ITagAttributeHandler;
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.TagElement;
-import org.eclipse.jst.jsp.core.internal.contentmodel.tld.provisional.TLDDocument;
-import org.eclipse.jst.jsp.core.internal.contentmodel.tld.provisional.TLDElementDeclaration;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMDocument;
-
-
-/**
- * A tag element for a JSP tag (TLD-defined)
- * 
- * @author cbateman
- *
- */
-public class TLDTagElement extends TagElement
-{
-    /**
-     * 
-     */
-    private static final long serialVersionUID = -874272538404837105L;
-    private final TLDElementData                  _tldData;
-
-    /**
-     * @param elementDecl
-     * @param advisor 
-     */
-    public TLDTagElement(final TLDElementDeclaration elementDecl
-            , final IAttributeAdvisor advisor)
-    {
-        _tldData = new DocumentElementData(elementDecl, advisor);
-    }
-
-    @Override
-    public String getName()
-    {
-        return _tldData.getName();
-    }
-
-    @Override
-    public String getUri()
-    {
-        return _tldData.getUri();
-    }
-
-    @Override
-    public String getTagHandlerClassName() {
-        return _tldData.getTagHandlerClassName();
-    }
-
-    @Override
-    public String toString()
-    {
-        return String.format("Tag: Tag Handler: name=%s, uri=%s, tagHandlerClassName=%s\n" //$NON-NLS-1$
-                , getName(), getUri(), getTagHandlerClassName())
-                + constructAttributesString();
-    }
-
-    /**
-     * @return a string representation of the attributes.
-     */
-    protected String constructAttributesString()
-    {
-        String attributes = ""; //$NON-NLS-1$
-
-        for (final Iterator it = getAttributeHandlers().entrySet().iterator(); it.hasNext();)
-        {
-            final Map.Entry entry = (Entry) it.next();
-            final String name = (String) entry.getKey();
-            final ITagAttributeHandler handler = (ITagAttributeHandler) entry.getValue();
-
-            attributes += String.format("\t\t\tAttribute: name=%s, customHandler=%s, propertyName=%s, isELAllowed=%b\n",  //$NON-NLS-1$
-                    name, handler.getCustomHandler(), handler.getName(),
-                    Boolean.valueOf(handler.isELAllowed()));
-        }
-        return attributes;
-    }
-
-    @Override
-    public Map getAttributeHandlers()
-    {
-        return _tldData.getAttributeHandlers();
-    }
-
-    public Map<String, ? extends ITagAttribute> getAttributes()
-    {
-        return _tldData.getAttributes();
-    }
-    
-    private static class DocumentElementData extends TLDElementData
-    {
-        /**
-         * serialization id
-         */
-        private static final long serialVersionUID = -6160324802818766058L;
-        private final TLDElementDeclaration _tldDoc;
-        private final CMNodeNamedMapAdapter _adapter;
-        private Map<String, ? extends ITagAttribute> _tldAttributes;
-
-        public DocumentElementData(final TLDElementDeclaration tldDoc,
-                final IAttributeAdvisor advisor)
-        {
-            _tldDoc = tldDoc;
-            _adapter = new CMNodeNamedMapAdapter(tldDoc, advisor);
-            _tldAttributes = advisor.getAttributes();
-        }
-
-        @Override
-        public String getName()
-        {
-            return _tldDoc.getElementName();
-        }
-
-        @Override
-        public String getTagHandlerClassName()
-        {
-            return _tldDoc.getTagclass();
-        }
-
-        @Override
-        public String getUri()
-        {
-            final CMDocument owner = _tldDoc.getOwnerDocument();
-
-            if (owner instanceof TLDDocument)
-            {
-                return ((TLDDocument)owner).getUri();
-            }
-            return null;
-        }
-
-        private Object writeReplace()
-        {
-            return new SerializedTLDElementData(getName(), getTagHandlerClassName(), getUri()
-                    , _adapter, _tldAttributes);
-        }
-
-        @SuppressWarnings("unused")
-        private void readObject(java.io.ObjectInputStream in)
-                        throws IOException, ClassNotFoundException
-        {
-            throw new UnsupportedOperationException("This object should be serialized; writeReplace"); //$NON-NLS-1$
-        }
-
-        @Override
-        public Map<String, ? extends ITagAttributeHandler> getAttributeHandlers()
-        {
-            return _adapter;
-        }
-
-        @Override
-        public Map<String, ? extends ITagAttribute> getAttributes()
-        {
-            return _tldAttributes;
-        }
-    }
-
-    /**
-     * @author cbateman
-     *
-     */
-    private static class SerializedTLDElementData extends TLDElementData
-    {
-        /**
-         * 
-         */
-        private static final long serialVersionUID = 4008084060638384114L;
-        private final String        _name;
-        private final String        _uri;
-        private final String        _tagHandlerClassName;
-        private final Map<String, ? extends ITagAttributeHandler>  _tagAttributes;
-        private final Map<String, ? extends ITagAttribute> _actualTagAttributes;
-
-        /**
-         * @param name
-         * @param tagHandlerClassName
-         * @param uri
-         * @param tagAttributes
-         */
-        private SerializedTLDElementData(final String name,
-                final String tagHandlerClassName, final String uri,
-                final Map<String, ? extends ITagAttributeHandler> tagAttributes,
-                final Map<String, ? extends ITagAttribute> actualTagAttributes)
-        {
-            super();
-            _name = name;
-            _tagHandlerClassName = tagHandlerClassName;
-            _uri = uri;
-            // copy the map, because we don't if it is simply delta
-            _tagAttributes = new HashMap(tagAttributes);
-            _actualTagAttributes = new HashMap(actualTagAttributes);
-        }
-
-        @Override
-        public String getName()
-        {
-            return _name;
-        }
-
-        @Override
-        public String getTagHandlerClassName()
-        {
-            return _tagHandlerClassName;
-        }
-
-        @Override
-        public String getUri()
-        {
-            return _uri;
-        }
-
-        @Override
-        public Map<String, ? extends ITagAttributeHandler> getAttributeHandlers()
-        {
-            return _tagAttributes;
-        }
-
-        @Override
-        public Map<String, ? extends ITagAttribute> getAttributes()
-        {
-            return _actualTagAttributes;
-        }
-    }
-
-    private static abstract class TLDElementData implements Serializable
-    {
-        /**
-         * 
-         */
-        private static final long serialVersionUID = -2494388738109839064L;
-        public abstract String getTagHandlerClassName();
-        public abstract String getName();
-        public abstract String getUri();
-        public abstract Map<String, ? extends ITagAttributeHandler>  getAttributeHandlers();
-        public abstract Map<String, ? extends ITagAttribute>         getAttributes();
-        
-    }
-
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/TLDTagHandlerElement.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/TLDTagHandlerElement.java
deleted file mode 100644
index d637f49..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/TLDTagHandlerElement.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.designtime.internal.view.model.jsp;
-
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.IHandlerTagElement;
-import org.eclipse.jst.jsp.core.internal.contentmodel.tld.provisional.TLDElementDeclaration;
-
-/**
- * A TLD-defined tag (i.e. JSP) that maps to a known tag handler.
- * 
- * @author cbateman
- *
- */
-public class TLDTagHandlerElement extends TLDJSFTagElement implements
-IHandlerTagElement
-{
-    /**
-     * 
-     */
-    private static final long serialVersionUID = 8984277085824995102L;
-    private final TagHandlerType      _tagHandlerType;
-
-    /**
-     * @param elementDecl
-     * @param tagHandlerType
-     * @param advisor 
-     */
-    public TLDTagHandlerElement(final TLDElementDeclaration elementDecl, final TagHandlerType tagHandlerType, final IAttributeAdvisor advisor)
-    {
-        super(elementDecl, advisor);
-        _tagHandlerType = tagHandlerType;
-    }
-
-    public TagHandlerType getTagHandlerType()
-    {
-        return _tagHandlerType;
-    }
-
-    @Override
-    public TagType getType()
-    {
-        return TagType.HANDLER;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/TLDValidatorTagElement.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/TLDValidatorTagElement.java
deleted file mode 100644
index e99d97b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/TLDValidatorTagElement.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.designtime.internal.view.model.jsp;
-
-import org.eclipse.jst.jsf.common.runtime.internal.model.decorator.ValidatorTypeInfo;
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.IValidatorTagElement;
-import org.eclipse.jst.jsp.core.internal.contentmodel.tld.provisional.TLDElementDeclaration;
-
-/**
- * A TLD-defined tag (i.e. JSP) that maps one-to-one with a JSF Converter
- * 
- * @author cbateman
- *
- */
-public class TLDValidatorTagElement extends TLDJSFTagElement implements IValidatorTagElement
-{
-    /**
-     * 
-     */
-    private static final long serialVersionUID = 4251223772554969477L;
-    private final ValidatorTypeInfo _validator;
-
-    /**
-     * @param elementDecl
-     * @param validatorTypeInfo
-     * @param advisor 
-     */
-    public TLDValidatorTagElement(final TLDElementDeclaration elementDecl, final ValidatorTypeInfo validatorTypeInfo, final IAttributeAdvisor advisor)
-    {
-        super(elementDecl, advisor);
-        _validator = validatorTypeInfo;
-    }
-
-    public final ValidatorTypeInfo getValidator()
-    {
-        return _validator;
-    }
-
-    @Override
-    public final TagType getType()
-    {
-        return TagType.VALIDATOR;
-    }
-
-    @Override
-    public String toString()
-    {
-        return _validator.toString();
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/TagIntrospectingStrategy.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/TagIntrospectingStrategy.java
deleted file mode 100644
index 6a5d97d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/TagIntrospectingStrategy.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.designtime.internal.view.model.jsp;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.ITagElement;
-import org.eclipse.jst.jsf.designtime.internal.Messages;
-import org.eclipse.jst.jsf.designtime.internal.view.model.jsp.analyzer.TagAnalyzer;
-import org.eclipse.jst.jsp.core.internal.contentmodel.tld.provisional.TLDElementDeclaration;
-
-/**
- * A resolving strategy that uses tag introspection.
- * 
- * @author cbateman
- * 
- */
-public final class TagIntrospectingStrategy extends JSPTagResolvingStrategy
-{
-    /**
-     * the identifier of this strategy
-     */
-    public final static String ID = "org.eclipse.jst.jsf.designtime.TagIntrospectingStrategy"; //$NON-NLS-1$
-    /**
-     * the display name
-     */
-    public final static String DISPLAY_NAME = Messages.TagIntrospectingStrategy_DisplayName;
-
-    private final IProject _project;
-
-    /**
-     * @return the descriptor for this resolver strategy
-     */
-    public static StrategyDescriptor createDescriptor()
-    {
-        return new StrategyDescriptor(ID, DISPLAY_NAME);
-    }
-
-    /**
-     * @param project
-     */
-    public TagIntrospectingStrategy(final IProject project)
-    {
-        // TODO: would it be better to have a model context on the resolve?
-        _project = project;
-    }
-
-    @Override
-    public String getId()
-    {
-        return ID;
-    }
-
-    public String getDisplayName()
-    {
-        return DISPLAY_NAME;
-    }
-
-    @Override
-    public ITagElement resolve(TLDElementDeclaration element)
-    {
-        return TagAnalyzer.createTLDTagElement(element, _project);
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/UnresolvedJSPTagResolvingStrategy.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/UnresolvedJSPTagResolvingStrategy.java
deleted file mode 100644
index 0a94f66..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/UnresolvedJSPTagResolvingStrategy.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.designtime.internal.view.model.jsp;
-
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.ITagElement;
-import org.eclipse.jst.jsf.designtime.internal.view.model.jsp.IAttributeAdvisor.NullAttributeAdvisor;
-import org.eclipse.jst.jsp.core.internal.contentmodel.tld.provisional.TLDElementDeclaration;
-
-/**
- * This a fallback strategy that always creates an element for a tld decl.  This
- * can be tacked to the end of a composite strategy (or used alone) to ensure
- * that a basic ITagElement is always created for a TLDElementDeclaration.
- * 
- * @author cbateman
- *
- */
-public class UnresolvedJSPTagResolvingStrategy extends JSPTagResolvingStrategy
-{
-    /**
-     * the identifier of this strategy
-     */
-    public final static String ID = "org.eclipse.jst.jsf.designtime.UnresolvedJSPTagResolvingStrategy"; //$NON-NLS-1$
-    /**
-     * the displayable name
-     */
-    public final static String DISPLAY_NAME = Messages.UnresolvedJSPTagResolvingStrategy_1;
-
-    /**
-     * @return the descriptor for this resolver strategy
-     */
-    public static StrategyDescriptor createDescriptor()
-    {
-        return new StrategyDescriptor(ID, DISPLAY_NAME);
-    }
-
-    @Override
-    public String getId()
-    {
-        return ID;
-    }
-
-    public String getDisplayName()
-    {
-        return DISPLAY_NAME;
-    }
-
-    @Override
-    public ITagElement resolve(TLDElementDeclaration element)
-    {
-        // just create a tag element
-        return new TLDTagElement(element, new NullAttributeAdvisor());
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/analyzer/ServletBeanProxyContributor.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/analyzer/ServletBeanProxyContributor.java
deleted file mode 100644
index 45d8d92..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/analyzer/ServletBeanProxyContributor.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-/**
- * 
- */
-package org.eclipse.jst.jsf.designtime.internal.view.model.jsp.analyzer;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jem.internal.proxy.core.ConfigurationContributorAdapter;
-import org.eclipse.jem.internal.proxy.core.IConfigurationContributionController;
-import org.eclipse.jst.jsf.core.JSFVersion;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.osgi.framework.Bundle;
-
-class ServletBeanProxyContributor extends ConfigurationContributorAdapter
-{
-    private final JSFVersion _jsfVersion;
-
-    public ServletBeanProxyContributor(final IProject project)
-    {
-        _jsfVersion = getProjectVersion(project);
-        if (_jsfVersion == null)
-        {
-            throw new IllegalArgumentException("jsfVersion must not be null"); //$NON-NLS-1$
-        }
-    }
-
-    @Override
-    public void contributeClasspaths(
-            final IConfigurationContributionController controller)
-            throws CoreException
-    {
-        if (_jsfVersion != null && _jsfVersion.compareTo(JSFVersion.V1_2) < 0)
-        {
-            final Bundle servletBundle = Platform.getBundle("javax.servlet"); //$NON-NLS-1$
-            controller.contributeClasspath(servletBundle, (IPath) null,
-                    IConfigurationContributionController.APPEND_USER_CLASSPATH,
-                    true);
-
-            final Bundle jspBundle = Platform.getBundle("javax.servlet.jsp"); //$NON-NLS-1$
-            controller.contributeClasspath(jspBundle, (IPath) null,
-                    IConfigurationContributionController.APPEND_USER_CLASSPATH,
-                    true);
-        }
-        else
-        {
-            final Bundle coreBundle = JSFCorePlugin.getDefault().getBundle();
-            controller.contributeClasspath(coreBundle,
-                    "/jars/fake_jsp_21.jar", //$NON-NLS-1$
-                    IConfigurationContributionController.APPEND_USER_CLASSPATH,
-                    false);
-            controller.contributeClasspath(coreBundle,
-                    "/jars/fake_el.jar", //$NON-NLS-1$
-                    IConfigurationContributionController.APPEND_USER_CLASSPATH,
-                    false);
-        }
-    }
-
-    static JSFVersion getProjectVersion(final IProject project)
-    {
-        return JSFVersion.valueOfProject(project);
-    }
-
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/analyzer/TagAnalyzer.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/analyzer/TagAnalyzer.java
deleted file mode 100644
index 150d160..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/analyzer/TagAnalyzer.java
+++ /dev/null
@@ -1,870 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.designtime.internal.view.model.jsp.analyzer;
-
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Set;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.JavaConventions;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jem.internal.proxy.core.IBeanProxy;
-import org.eclipse.jem.internal.proxy.core.IBeanTypeProxy;
-import org.eclipse.jem.internal.proxy.core.IConfigurationContributor;
-import org.eclipse.jem.internal.proxy.core.IStandardBeanTypeProxyFactory;
-import org.eclipse.jem.internal.proxy.core.ProxyFactoryRegistry;
-import org.eclipse.jem.internal.proxy.ide.IDERegistration;
-import org.eclipse.jst.jsf.common.runtime.internal.model.component.ComponentTypeInfo;
-import org.eclipse.jst.jsf.common.runtime.internal.model.decorator.ConverterTypeInfo;
-import org.eclipse.jst.jsf.common.runtime.internal.model.decorator.ValidatorTypeInfo;
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.IJSFTagElement;
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.IHandlerTagElement.TagHandlerType;
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.IJSFTagElement.TagType;
-import org.eclipse.jst.jsf.core.JSFVersion;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.core.internal.JSFCoreTraceOptions;
-import org.eclipse.jst.jsf.core.internal.jem.BeanProxyUtil.BeanProxyWrapper;
-import org.eclipse.jst.jsf.core.internal.jem.BeanProxyUtil.ProxyException;
-import org.eclipse.jst.jsf.designtime.internal.view.DTComponentIntrospector;
-import org.eclipse.jst.jsf.designtime.internal.view.model.jsp.TLDComponentTagElement;
-import org.eclipse.jst.jsf.designtime.internal.view.model.jsp.TLDConverterTagElement;
-import org.eclipse.jst.jsf.designtime.internal.view.model.jsp.TLDTagElement;
-import org.eclipse.jst.jsf.designtime.internal.view.model.jsp.TLDTagHandlerElement;
-import org.eclipse.jst.jsf.designtime.internal.view.model.jsp.TLDValidatorTagElement;
-import org.eclipse.jst.jsf.designtime.internal.view.model.jsp.IAttributeAdvisor.NullAttributeAdvisor;
-import org.eclipse.jst.jsp.core.internal.contentmodel.tld.provisional.TLDElementDeclaration;
-
-/**
- * Utility class supporting methods to derive information from JSP tag
- * definitions (TLD)
- * 
- * @author cbateman
- * 
- */
-public final class TagAnalyzer
-{
-    private static final String JAVAX_FACES_WEBAPP_CONVERTER_TAG = "javax.faces.webapp.ConverterTag"; //$NON-NLS-1$
-    private static final String JAVAX_FACES_WEBAPP_CONVERTER_ELTAG = "javax.faces.webapp.ConverterELTag"; //$NON-NLS-1$
-    private static final String JAVAX_FACES_WEBAPP_VALIDATOR_TAG = "javax.faces.webapp.ValidatorTag"; //$NON-NLS-1$
-    private static final String JAVAX_FACES_WEBAPP_VALIDATOR_ELTAG = "javax.faces.webapp.ValidatorELTag"; //$NON-NLS-1$
-    private static final String JAVAX_FACES_WEBAPP_FACET_TAG = "javax.faces.webapp.FacetTag"; //$NON-NLS-1$
-
-    // private static final String JAVAX_FACES_WEBAPP_ACTIONLISTENER_TAG =
-    // "javax.faces.webapp.ActionListenerTag";
-    // private static final String JAVAX_FACES_WEBAPP_VALUECHANGELISTENER_TAG =
-    // "javax.faces.webapp.ValueChangeListenerTag";
-    private static final String JAVAX_FACES_WEBAPP_ATTRIBUTE_TAG = "javax.faces.webapp.AttributeTag"; //$NON-NLS-1$
-
-    private final static Set<String> COMPONENT_TAG_HANDLER_TYPES_JSF11;
-    private final static Set<String> COMPONENT_TAG_HANDLER_TYPES_JSF12;
-
-    private final static Set<String> CONVERTER_TAG_HANDLER_TYPES_JSF11 = Collections
-            .singleton(JAVAX_FACES_WEBAPP_CONVERTER_TAG);
-    private final static Set<String> CONVERTER_TAG_HANDLER_TYPES_JSF12;
-
-    private final static Set<String> VALIDATOR_TAG_HANDLER_TYPES_JSF11 = Collections
-            .singleton(JAVAX_FACES_WEBAPP_VALIDATOR_TAG);
-    private final static Set<String> VALIDATOR_TAG_HANDLER_TYPES_JSF12;
-
-    private final static Set<String> FACET_TAG_HANDLER = Collections
-            .singleton(JAVAX_FACES_WEBAPP_FACET_TAG);
-    private final static Set<String> ATTRIBUTE_TAG_HANDLER = Collections
-            .singleton(JAVAX_FACES_WEBAPP_ATTRIBUTE_TAG);
-    // private final static Set<String> ACTIONLISTENER_TAG_HANDLER = Collections
-    // .singleton(JAVAX_FACES_WEBAPP_ACTIONLISTENER_TAG);
-    // private final static Set<String> VALUECHANGELISTENER_TAG_HANDLER =
-    // Collections
-    // .singleton(JAVAX_FACES_WEBAPP_VALUECHANGELISTENER_TAG);
-
-    private final static Set<String> ALL_HANDLER_TAGS;
-
-    static
-    {
-        // components
-        // JSF 1.1
-        Set<String> set = new HashSet<String>(8);
-        set.add("javax.faces.webapp.UIComponentTag"); //$NON-NLS-1$
-        set.add("javax.faces.webapp.UIComponentBodyTag"); //$NON-NLS-1$
-        COMPONENT_TAG_HANDLER_TYPES_JSF11 = Collections.unmodifiableSet(set);
-
-        // JSF 1.2+
-        set = new HashSet<String>(8);
-        set.addAll(COMPONENT_TAG_HANDLER_TYPES_JSF11);
-        set.add("javax.faces.webapp.UIComponentELTag"); //$NON-NLS-1$
-        COMPONENT_TAG_HANDLER_TYPES_JSF12 = Collections.unmodifiableSet(set);
-
-        // converters
-        set = new HashSet<String>(8);
-        set.add(JAVAX_FACES_WEBAPP_CONVERTER_TAG);
-        set.add(JAVAX_FACES_WEBAPP_CONVERTER_ELTAG);
-        CONVERTER_TAG_HANDLER_TYPES_JSF12 = Collections.unmodifiableSet(set);
-
-        // validators
-        set = new HashSet<String>(8);
-        set.add(JAVAX_FACES_WEBAPP_VALIDATOR_TAG);
-        set.add(JAVAX_FACES_WEBAPP_VALIDATOR_ELTAG);
-        VALIDATOR_TAG_HANDLER_TYPES_JSF12 = Collections.unmodifiableSet(set);
-
-        // tag handlers
-        ALL_HANDLER_TAGS = new HashSet<String>();
-        ALL_HANDLER_TAGS.addAll(FACET_TAG_HANDLER);
-        ALL_HANDLER_TAGS.addAll(ATTRIBUTE_TAG_HANDLER);
-        // ALL_HANDLER_TAGS.addAll(VALUECHANGELISTENER_TAG_HANDLER);
-        // ALL_HANDLER_TAGS.addAll(ACTIONLISTENER_TAG_HANDLER);
-    }
-
-    /**
-     * Tries to determine the component type of the component that corresponds
-     * to the JSP tag defined by tldDecl.
-     * 
-     * @param tldDecl
-     * @param project
-     * @return get the component type from the tag definition or null if none.
-     */
-    public static String findComponentType(final TLDElementDeclaration tldDecl,
-            final IProject project)
-    {
-        final String className = tldDecl.getTagclass();
-
-        final IConfigurationContributor[] contributor = new IConfigurationContributor[]
-        { new ServletBeanProxyContributor(project) };
-
-        ProxyFactoryRegistry registry = null;
-        try
-        {
-            registry = getProxyFactoryRegistry(contributor, project);
-    
-            if (registry != null)
-            {
-
-                final IStandardBeanTypeProxyFactory factory = registry
-                        .getBeanTypeProxyFactory();
-                final IBeanTypeProxy classTypeProxy = factory
-                        .getBeanTypeProxy(className);
-                final BeanProxyWrapper classTypeWrapper = new BeanProxyWrapper(project,
-                        classTypeProxy);
-    
-                try
-                {
-                    classTypeWrapper.init();
-                    return classTypeWrapper.callStringMethod("getComponentType"); //$NON-NLS-1$
-                }
-                catch (final ProxyException tp)
-                {
-                    if (JSFCoreTraceOptions.TRACE_JSPTAGINTROSPECTOR)
-                    {
-                        JSFCoreTraceOptions.log("TagAnalyzer.findComponentType", tp); //$NON-NLS-1$
-                    }
-                }
-            }
-        }
-        finally
-        {
-            if (registry != null)
-            {
-                registry.terminateRegistry(true);
-            }
-        }
-        return null;
-    }
-
-    /**
-     * Tries to introspect tldDecl's tag class to determine what the identifier
-     * of the underlying Converter that is used to register it in the app config
-     * 
-     * @param tldDecl
-     * @param project
-     * @return the converter type identifier for the tldDecl or null if not
-     *         found
-     */
-    public static String findConverterType(final TLDElementDeclaration tldDecl,
-            final IProject project)
-    {
-        // TODO: allow for pluggable resolver?
-
-        // This one is more hacky and less prone to success than the component
-        // type finder because the ConverterTag doesn't initialize its type
-        // field on construction. Instead, both MyFaces and RI seem to do it
-        // based on the doStartTag method. They also don't provide a standard
-        // interface for acquiring the id so instead we make some guess on
-        // the internal field name.
-        ProxyFactoryRegistry registry = null;
-        try
-        {
-            final String className = tldDecl.getTagclass();
-    
-            final IConfigurationContributor[] contributor = new IConfigurationContributor[]
-            { new ServletBeanProxyContributor(project) };
-            registry = getProxyFactoryRegistry(
-                    contributor, project);
-    
-            if (registry != null)
-            {
-                final IStandardBeanTypeProxyFactory factory = registry
-                        .getBeanTypeProxyFactory();
-                final IBeanTypeProxy classTypeProxy = factory
-                        .getBeanTypeProxy(className);
-    
-                try
-                {
-                    final IType type = JavaCore.create(project).findType(className);
-    
-                    if (type != null
-                            && DTComponentIntrospector
-                                    .isTypeNameInstanceOfClass(
-                                            type,
-                                            Collections
-                                                    .singleton(JAVAX_FACES_WEBAPP_CONVERTER_ELTAG)))
-                    {
-                        return findConverterType_InELTag(factory, classTypeProxy,project);
-                    }
-                    // the assumption is that this is a component tag, so we assume
-                    // it is one.
-                    else if (type != null
-                            && DTComponentIntrospector
-                                    .isTypeNameInstanceOfClass(
-                                            type,
-                                            Collections
-                                                    .singleton(JAVAX_FACES_WEBAPP_CONVERTER_TAG)))
-                    {
-                        return findConverterType_InTag(factory, classTypeProxy, project);
-                    }
-                }
-                catch (final JavaModelException jme)
-                {
-                    // suppress for now
-                }
-            }
-        }
-        finally
-        {
-            if (registry != null)
-            {
-                registry.terminateRegistry(true);
-            }
-        }
-        return null;
-    }
-
-    private static String findConverterType_InTag(
-            final IStandardBeanTypeProxyFactory factory,
-            final IBeanTypeProxy classTypeProxy, final IProject project)
-    {
-        final IBeanTypeProxy nullPageContextType = factory
-                .getBeanTypeProxy("javax.servlet.jsp.PageContext"); //$NON-NLS-1$
-        final BeanProxyWrapper classTypeWrapper = new BeanProxyWrapper(project,
-                classTypeProxy);
-
-        try
-        {
-            classTypeWrapper.init();
-
-            callSuppressExceptions(classTypeWrapper, "setPageContext", //$NON-NLS-1$
-                    new IBeanProxy[]
-                    { null }, new IBeanTypeProxy[]
-                    { nullPageContextType });
-            callSuppressExceptions(classTypeWrapper, "doStartTag"); //$NON-NLS-1$
-
-            final IBeanTypeProxy converterProxy = factory
-                    .getBeanTypeProxy(JAVAX_FACES_WEBAPP_CONVERTER_TAG);
-
-            // hopefully doStartTag set the converter field before it
-            // failed.
-            // now try to guess what it's called
-            String converterId = getStringField(classTypeWrapper,
-                    converterProxy, "converterId"); //$NON-NLS-1$
-
-            if (converterId != null)
-            {
-                return converterId;
-            }
-
-            converterId = getStringField(classTypeWrapper, converterProxy,
-                    "_converterId"); //$NON-NLS-1$
-
-            if (converterId != null)
-            {
-                return converterId;
-            }
-
-            // no? look for a CONVERTER_ID
-            converterId = getStringField(classTypeWrapper, classTypeProxy,
-                    "CONVERTER_ID"); //$NON-NLS-1$
-        }
-        catch (final ProxyException tp)
-        {
-            // fall through
-        }
-        return null;
-    }
-
-    private static String findConverterType_InELTag(
-            final IStandardBeanTypeProxyFactory factory,
-            final IBeanTypeProxy classTypeProxy, final IProject project)
-    {
-        final BeanProxyWrapper classTypeWrapper = new BeanProxyWrapper(project,
-                classTypeProxy);
-        final IBeanTypeProxy elExpressionType = factory
-                .getBeanTypeProxy("javax.el.ValueExpression"); //$NON-NLS-1$
-
-        if (elExpressionType == null)
-        {
-            return null;
-        }
-
-        try
-        {
-            classTypeWrapper.init();
-
-            callSuppressExceptions(classTypeWrapper, "doStartTag"); //$NON-NLS-1$
-
-            // no? look for a CONVERTER_ID
-            final IBeanProxy converterId = getFieldInParents(classTypeWrapper,
-                    classTypeProxy, "CONVERTER_ID_EXPR"); //$NON-NLS-1$
-
-            if (converterId != null)
-            {
-                converterId.getTypeProxy().isKindOf(elExpressionType);
-                final BeanProxyWrapper elExprValue = new BeanProxyWrapper(project,
-                        converterId.getTypeProxy());
-                final String value = elExprValue
-                        .callStringMethod("getExpressionString"); //$NON-NLS-1$
-                System.out.println("Expression string:" + value); //$NON-NLS-1$
-            }
-
-            //            
-            //
-            // final IBeanTypeProxy converterProxy = factory
-            // .getBeanTypeProxy(JAVAX_FACES_WEBAPP_CONVERTER_TAG);
-
-        }
-        catch (final ProxyException tp)
-        {
-            // fall through
-        }
-        return null;
-    }
-
-    /**
-     * @param tldDecl
-     * @param project
-     * @return the validator type identifier for the tldDecl or null if not
-     *         found
-     */
-    public static String findValidatorType(final TLDElementDeclaration tldDecl,
-            final IProject project)
-    {
-        // TODO: allow for pluggable resolver?
-
-        // This one is more hacky and less prone to success than the component
-        // type finder because the Validator doesn't initialize its type
-        // field on construction. Instead, both MyFaces and RI seem to do it
-        // based on the doStartTag method. They also don't provide a standard
-        // interface for acquiring the id so instead we make some guess on
-        // the internal field name.
-        final String className = tldDecl.getTagclass();
-
-        final IConfigurationContributor[] contributor = new IConfigurationContributor[]
-        { new ServletBeanProxyContributor(project) };
-
-        ProxyFactoryRegistry registry = null;
-
-        try
-        {
-            registry = getProxyFactoryRegistry(contributor, project);
-    
-            if (registry != null)
-            {
-                final IStandardBeanTypeProxyFactory factory = registry
-                        .getBeanTypeProxyFactory();
-                final IBeanTypeProxy classTypeProxy = factory
-                        .getBeanTypeProxy(className);
-                final BeanProxyWrapper classTypeWrapper = new BeanProxyWrapper(project,
-                        classTypeProxy);
-                final IBeanTypeProxy converterProxy = factory
-                        .getBeanTypeProxy(JAVAX_FACES_WEBAPP_VALIDATOR_TAG);
-                try
-                {
-                    classTypeWrapper.init();
-    
-                    callSuppressExceptions(classTypeWrapper, "doStartTag"); //$NON-NLS-1$
-                    callSuppressExceptions(classTypeWrapper, "createValidator"); //$NON-NLS-1$
-    
-                    // hopefully doStartTag set the converter field before it
-                    // failed.
-                    // now try to guess what it's called
-                    String validatorId = getStringField(classTypeWrapper,
-                            converterProxy, "validatorId"); //$NON-NLS-1$
-    
-                    if (validatorId != null)
-                    {
-                        return validatorId;
-                    }
-    
-                    validatorId = getStringField(classTypeWrapper, converterProxy,
-                            "_validatorId"); //$NON-NLS-1$
-    
-                    if (validatorId != null)
-                    {
-                        return validatorId;
-                    }
-    
-                    // no? then see if there's a VALIDATOR_ID field *on the tag*
-                    validatorId = getStringField(classTypeWrapper, classTypeProxy,
-                            "VALIDATOR_ID"); //$NON-NLS-1$
-    
-                    if (validatorId != null)
-                    {
-                        return validatorId;
-                    }
-                }
-                catch (final ProxyException tp)
-                {
-                    // fall through
-                }
-            }
-        }
-        finally
-        {
-            if (registry != null)
-            {
-                registry.terminateRegistry(true);
-            }
-        }
-        return null;
-
-    }
-
-    private static IBeanProxy getFieldInParents(
-            final BeanProxyWrapper classTypeWrapper,
-            final IBeanTypeProxy typeProxy, final String fieldName)
-    {
-        try
-        {
-            return classTypeWrapper.getFieldValueIncludeParents(fieldName,
-                    typeProxy);
-        }
-        catch (final ProxyException e)
-        {
-            // suppress
-        }
-
-        return null;
-    }
-
-    private static String getStringField(
-            final BeanProxyWrapper classTypeWrapper,
-            final IBeanTypeProxy typeProxy, final String fieldName)
-    {
-        try
-        {
-            return classTypeWrapper.getStringFieldValue(fieldName, typeProxy);
-        }
-        catch (final ProxyException e)
-        {
-            // suppress
-        }
-
-        return null;
-    }
-
-    private static void callSuppressExceptions(
-            final BeanProxyWrapper classTypeWrapper, final String methodName)
-    {
-        try
-        {
-            classTypeWrapper.call(methodName);
-        }
-        catch (final ProxyException tp)
-        {
-            // suppress this since it may well throw an exception
-            // depending on what assumptions the tag class is making
-            // that won't be true because we're not in a servlet
-        }
-    }
-
-    private static void callSuppressExceptions(
-            final BeanProxyWrapper classTypeWrapper, final String methodName,
-            final IBeanProxy[] args, final IBeanTypeProxy[] argTypes)
-    {
-        try
-        {
-            classTypeWrapper.call(methodName, args, argTypes);
-        }
-        catch (final ProxyException tp)
-        {
-            // suppress this since it may well throw an exception
-            // depending on what assumptions the tag class is making
-            // that won't be true because we're not in a servlet
-        }
-
-    }
-
-    /**
-     * @param project
-     * @return a new proxy factory registry or null;
-     * 
-     * TODO: caching?
-     */
-    private static ProxyFactoryRegistry getProxyFactoryRegistry(
-            final IConfigurationContributor[] configuration,
-            final IProject project)
-    {
-        try
-        {
-            return IDERegistration.startAnImplementation(configuration, false,
-                    project, project.getName(), JSFCorePlugin.PLUGIN_ID,
-                    new NullProgressMonitor());
-        }
-        catch (final CoreException e)
-        {
-            JSFCorePlugin.log("Error starting vm for project: " //$NON-NLS-1$
-                    + project.getName(), e);
-        }
-
-        return null;
-    }
-
-    /**
-     * @param tldDecl
-     * @param project
-     * @return the tag element for the tldDecl
-     */
-    public static TLDTagElement createTLDTagElement(
-            final TLDElementDeclaration tldDecl, final IProject project)
-    {
-        if (JSFCoreTraceOptions.TRACE_JSPTAGINTROSPECTOR)
-        {
-            JSFCoreTraceOptions
-                    .log(String
-                            .format(
-                                    "TagAnalyzer.createTLDTagElement: Start tld=%s, project=%s", //$NON-NLS-1$
-                                    tldDecl.getNodeName(), project.getName()));
-        }
-        long startTime = 0;
-        if (JSFCoreTraceOptions.TRACE_JSPTAGINTROSPECTOR_PERF)
-        {
-            startTime = System.nanoTime();
-        }
-
-        try
-        {
-            final IJavaProject javaProject = JavaCore.create(project);
-            final String typeName = tldDecl.getTagclass();
-
-            if (typeName == null
-                    || JavaConventions.validateJavaTypeName(typeName,
-                            JavaCore.VERSION_1_3,
-                            JavaCore.VERSION_1_3).getSeverity() == IStatus.ERROR)
-            {
-            	if (JSFCoreTraceOptions.TRACE_JSPTAGINTROSPECTOR)
-                {
-                    JSFCoreTraceOptions.log(
-                        "Bad tag class name in " + tldDecl.toString()); //$NON-NLS-1$
-                }
-                return null;
-            }
-
-            final IType type = javaProject.findType(typeName);
-            
-            if (type == null)
-            {
-                if (JSFCoreTraceOptions.TRACE_JSPTAGINTROSPECTOR)
-                {
-                    JSFCoreTraceOptions.log("Type not found for: "+typeName); //$NON-NLS-1$
-                }
-                return null;
-            }
-            final TagType tagType = getJSFComponentTagType(type, project);
-
-            if (JSFCoreTraceOptions.TRACE_JSPTAGINTROSPECTOR)
-            {
-                JSFCoreTraceOptions.log(String.format(
-                        "Tag class type=%s\nTag type=%s", type, tagType)); //$NON-NLS-1$
-            }
-
-            if (tagType == TagType.COMPONENT)
-            {
-                final TLDTagElement element = createComponentTagElement(tldDecl, project);
-                
-                if (JSFCoreTraceOptions.TRACE_JSPTAGINTROSPECTOR_PERF)
-                {
-                    String name = element != null ? element.toString()
-                            : "<none>"; //$NON-NLS-1$
-                    System.out.printf(
-                            "Time to create component tag element %s was %d\n", //$NON-NLS-1$
-                            name, Long.valueOf(System.nanoTime() - startTime));
-                }
-                return element;
-            }
-            else if (tagType == TagType.CONVERTER)
-            {
-                final TLDTagElement element =  createConverterTagElement(tldDecl, project);
-                if (JSFCoreTraceOptions.TRACE_JSPTAGINTROSPECTOR_PERF)
-                {
-                    String name = element != null ? element.toString()
-                            : "<none>"; //$NON-NLS-1$
-                    System.out.printf(
-                            "Time to create converter tag element %s was %d\n", //$NON-NLS-1$
-                            name, Long.valueOf(System.nanoTime() - startTime));
-                }
-                return element;
-            }
-            else if (tagType == TagType.VALIDATOR)
-            {
-                final TLDTagElement element =  createValidatorTagElement(tldDecl, project);
-                if (JSFCoreTraceOptions.TRACE_JSPTAGINTROSPECTOR_PERF)
-                {
-                    String name = element != null ? element.toString()
-                            : "<none>"; //$NON-NLS-1$
-                    System.out.printf(
-                            "Time to create validator tag element %s was %d\n", //$NON-NLS-1$
-                            name, Long.valueOf(System.nanoTime() - startTime));
-                }
-                return element;
-            }
-            else if (tagType == TagType.HANDLER)
-            {
-                final TLDTagElement element =  createHandlerTagElement(tldDecl, type);
-                if (JSFCoreTraceOptions.TRACE_JSPTAGINTROSPECTOR_PERF)
-                {
-                    String name = element != null ? element.toString()
-                            : "<none>"; //$NON-NLS-1$
-                    System.out.printf(
-                            "Time to create handler tag element %s was %d\n", //$NON-NLS-1$
-                            name, Long.valueOf(System.nanoTime() - startTime));
-                }
-                return element;
-            }
-        }
-        catch (final JavaModelException jme)
-        {
-            JSFCorePlugin.log(jme, "Trying to get type for TLD"); //$NON-NLS-1$
-        }
-
-        return null;
-    }
-
-    /**
-     * @param tldDecl
-     * @param project
-     * @return a component tag element for tldDecl
-     */
-    public static TLDTagElement createComponentTagElement(
-            final TLDElementDeclaration tldDecl, final IProject project)
-    {
-        final String componentType = findComponentType(tldDecl, project);
-
-        if (componentType != null)
-        {
-            final String componentClass = DTComponentIntrospector
-                    .findComponentClass(componentType, project);
-
-            if (componentClass != null && !"".equals(componentClass.trim())) //$NON-NLS-1$
-            {
-                final ComponentTypeInfo typeInfo = DTComponentIntrospector
-                        .getComponent(componentType, componentClass, project,
-                                new IConfigurationContributor[]
-                                {new ServletBeanProxyContributor(project)});
-
-                if (typeInfo != null)
-                {
-                    final TLDComponentTagElement tagElement = new TLDComponentTagElement(
-                            tldDecl, typeInfo, new NullAttributeAdvisor());
-                    return tagElement;
-                }
-            }
-        }
-
-        // TODO: really return null?
-        return null;
-    }
-
-    /**
-     * @param tldDecl
-     * @param project
-     * @return a converter tag element for tldDecl
-     */
-    public static TLDTagElement createConverterTagElement(
-            final TLDElementDeclaration tldDecl, final IProject project)
-    {
-        final String converterId = findConverterType(tldDecl, project);
-
-        if (converterId != null)
-        {
-            final String converterClass = DTComponentIntrospector
-                    .findConverterClass(converterId, project);
-
-            if (converterClass != null && !"".equals(converterClass.trim())) //$NON-NLS-1$
-            {
-                final ConverterTypeInfo typeInfo = DTComponentIntrospector
-                        .getConverter(converterId, converterClass);
-                final TLDConverterTagElement tagElement = new TLDConverterTagElement(
-                        tldDecl, typeInfo, new NullAttributeAdvisor());
-                return tagElement;
-            }
-        }
-
-        // we know (actually we assume by contract) that this a converter
-        // so create an unknown converter tag for it
-        return new TLDConverterTagElement(tldDecl, ConverterTypeInfo.UNKNOWN, new NullAttributeAdvisor());
-    }
-
-    /**
-     * @param tldDecl
-     * @param project
-     * @return a validator tag element for the tldDec
-     */
-    public static TLDTagElement createValidatorTagElement(
-            final TLDElementDeclaration tldDecl, final IProject project)
-    {
-        final String validatorId = findValidatorType(tldDecl, project);
-
-        if (validatorId != null)
-        {
-            final String validatorClass = DTComponentIntrospector
-                    .findValidatorClass(validatorId, project);
-
-            if (validatorClass != null && !"".equals(validatorClass.trim())) //$NON-NLS-1$
-            {
-                final ValidatorTypeInfo typeInfo = DTComponentIntrospector
-                        .getValidator(validatorId, validatorClass);
-                final TLDValidatorTagElement tagElement = new TLDValidatorTagElement(
-                        tldDecl, typeInfo, new NullAttributeAdvisor());
-                return tagElement;
-            }
-        }
-        // we know (actually we assume by contract) that this a validator
-        // so create an unknown converter tag for it
-        return new TLDValidatorTagElement(tldDecl, ValidatorTypeInfo.UNKNOWN, new NullAttributeAdvisor());
-    }
-
-    /**
-     * @param tldDecl
-     * @param type
-     * @return the tag element for a JSF handler
-     */
-    public static TLDTagElement createHandlerTagElement(
-            final TLDElementDeclaration tldDecl, final IType type)
-    {
-        if (DTComponentIntrospector.isTypeNameInstanceOfClass(type,
-                FACET_TAG_HANDLER))
-        {
-            return new TLDTagHandlerElement(tldDecl, TagHandlerType.FACET, new NullAttributeAdvisor());
-        }
-        else if (DTComponentIntrospector.isTypeNameInstanceOfClass(type,
-                ATTRIBUTE_TAG_HANDLER))
-        {
-            return new TLDTagHandlerElement(tldDecl, TagHandlerType.ATTRIBUTE, new NullAttributeAdvisor());
-        }
-        // else if (isTypeNameInstanceOfClass(type, ACTIONLISTENER_TAG_HANDLER))
-        // {
-        // return new TLDTagHandlerElement(tldDecl,
-        // TagHandlerType.ACTIONLISTENER);
-        // }
-        // else if (isTypeNameInstanceOfClass(type,
-        // VALUECHANGELISTENER_TAG_HANDLER))
-        // {
-        // return new TLDTagHandlerElement(tldDecl,
-        // TagHandlerType.VALUECHANGELISTENER);
-        // }
-        return null;
-    }
-
-    /**
-     * @param type
-     * @param project
-     * @return true if type represents a JSF component action class (spec 9.2.2)
-     */
-    public static IJSFTagElement.TagType getJSFComponentTagType(
-            final IType type, final IProject project)
-    {
-        if (JSFCoreTraceOptions.TRACE_JSPTAGINTROSPECTOR)
-        {
-            JSFCoreTraceOptions
-                    .log(String
-                            .format(
-                                    "TagAnalyzer.getJSFComponentTagType: Determining Tag Type for type %s on project %s", //$NON-NLS-1$
-                                    type.getFullyQualifiedName(), project
-                                            .toString()));
-        }
-
-        Set<String> componentTags = null;
-        Set<String> converterTags = null;
-        Set<String> validatorTags = null;
-
-        final JSFVersion jsfVersion = ServletBeanProxyContributor.getProjectVersion(project);
-
-        if (jsfVersion == null){
-        	return null;
-        }
-        // v1.1(9.2.2): JSF component tags must sub-class one of these
-        else if (jsfVersion == JSFVersion.V1_0 || jsfVersion == JSFVersion.V1_1)
-        {
-            componentTags = COMPONENT_TAG_HANDLER_TYPES_JSF11;
-            converterTags = CONVERTER_TAG_HANDLER_TYPES_JSF11;
-            validatorTags = VALIDATOR_TAG_HANDLER_TYPES_JSF11;
-        }
-        // v1.2(9.2.2): JSF component tags must sub-class UIComponentELTag
-        // the original two are included because we must be backward
-        // compatible
-        else if (jsfVersion == JSFVersion.V1_2 || jsfVersion == JSFVersion.V2_0)
-        {
-            componentTags = COMPONENT_TAG_HANDLER_TYPES_JSF12;
-            converterTags = CONVERTER_TAG_HANDLER_TYPES_JSF12;
-            validatorTags = VALIDATOR_TAG_HANDLER_TYPES_JSF12;
-        }
-        else 
-        {
-            throw new IllegalArgumentException();
-        }
-
-        TagType tagType = null;
-
-        if (DTComponentIntrospector.isTypeNameInstanceOfClass(type,
-                componentTags))
-        {
-            tagType = TagType.COMPONENT;
-        }
-        else if (DTComponentIntrospector.isTypeNameInstanceOfClass(type,
-                converterTags))
-        {
-            tagType = TagType.CONVERTER;
-        }
-        else if (DTComponentIntrospector.isTypeNameInstanceOfClass(type,
-                validatorTags))
-        {
-            tagType = TagType.VALIDATOR;
-        }
-        else if (DTComponentIntrospector.isTypeNameInstanceOfClass(type,
-                ALL_HANDLER_TAGS))
-        {
-            tagType = TagType.HANDLER;
-        }
-
-        if (JSFCoreTraceOptions.TRACE_JSPTAGINTROSPECTOR)
-        {
-            JSFCoreTraceOptions.log(String.format(
-                    "TagAnalyzer.getJSFComponentTagType: tag type is %s", //$NON-NLS-1$
-                    tagType != null ? tagType.toString() : "null")); //$NON-NLS-1$
-        }
-        return tagType;
-    }
-
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/messages.properties b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/messages.properties
deleted file mode 100644
index 15bf8c5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/messages.properties
+++ /dev/null
@@ -1 +0,0 @@
-UnresolvedJSPTagResolvingStrategy_1=Unresolved Tag Resolver
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/persistence/MasterIndex.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/persistence/MasterIndex.java
deleted file mode 100644
index 3f2799d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/persistence/MasterIndex.java
+++ /dev/null
@@ -1,442 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.designtime.internal.view.model.jsp.persistence;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.core.internal.JSFCoreTraceOptions;
-import org.osgi.framework.Version;
-
-/**
- * The definitive index of what projects are indexed for JSP tag registry
- * persistence.
- * 
- * @author cbateman
- * 
- */
-class MasterIndex implements Serializable
-{
-    public final static SerializableVersion CURRENT_VERSION  = new SerializableVersion(
-                                                                     1, 0, 0);
-
-    /**
-     * 
-     */
-    private static final long               serialVersionUID = -2725662604972649316L;
-
-    private final transient String          _repositoryPath;
-    private final transient File            _storageFile;
-
-    private IndexHeader                     _header;
-    private List<ProjectIndex>              _projectIndices;
-
-    public MasterIndex(final File storageFile, final String repositoryPath)
-    {
-        _storageFile = storageFile;
-        _repositoryPath = repositoryPath;
-    }
-
-    public synchronized void create(final SerializableVersion version)
-            throws IOException
-    {
-        if (JSFCoreTraceOptions.TRACE_JSPTAGPERSISTENCE)
-        {
-            JSFCoreTraceOptions.log("MasterIndex.create, version=:" //$NON-NLS-1$
-                    + version.toString());
-        }
-
-        _header = new IndexHeader(version);
-        _projectIndices = new ArrayList<ProjectIndex>();
-
-        save(_storageFile);
-    }
-
-    public synchronized void save(final File file) throws IOException
-    {
-        FileOutputStream out = null;
-
-        try
-        {
-            if (JSFCoreTraceOptions.TRACE_JSPTAGPERSISTENCE)
-            {
-                JSFCoreTraceOptions.log("Trying to save master index file: " //$NON-NLS-1$
-                        + file.getAbsolutePath());
-            }
-
-            out = new FileOutputStream(file);
-            final ObjectOutputStream objStream = new ObjectOutputStream(out);
-            objStream.writeObject(this);
-
-            if (JSFCoreTraceOptions.TRACE_JSPTAGPERSISTENCE)
-            {
-                JSFCoreTraceOptions
-                        .log("Master index file written successfully: " //$NON-NLS-1$
-                                + file.getAbsolutePath());
-            }
-        }
-        finally
-        {
-            if (out != null)
-            {
-                out.close();
-            }
-        }
-    }
-
-    public synchronized void load(final SerializableVersion expectedVersion)
-            throws IOException, ClassNotFoundException
-    {
-        FileInputStream in = null;
-
-        try
-        {
-            if (JSFCoreTraceOptions.TRACE_JSPTAGPERSISTENCE)
-            {
-                JSFCoreTraceOptions.log("Trying to load master index file: " //$NON-NLS-1$
-                        + _storageFile.getAbsolutePath());
-            }
-
-            in = new FileInputStream(_storageFile);
-            final ObjectInputStream objStream = new ObjectInputStream(in);
-            MasterIndex index = (MasterIndex) objStream.readObject();
-            _header = index._header;
-            _projectIndices = index._projectIndices;
-
-            if (JSFCoreTraceOptions.TRACE_JSPTAGPERSISTENCE)
-            {
-                JSFCoreTraceOptions
-                        .log("Loaded master index file successfully:" //$NON-NLS-1$
-                                + _storageFile.getAbsolutePath());
-                JSFCoreTraceOptions.log("Initial contents: "); //$NON-NLS-1$
-                System.out.println(index.toString());
-            }
-        }
-        finally
-        {
-            if (in != null)
-            {
-                in.close();
-            }
-        }
-    }
-
-    public synchronized String toString()
-    {
-        StringBuffer buffer = new StringBuffer();
-
-        buffer.append(String.format("Header: %s\n\n", _header.toString())); //$NON-NLS-1$
-
-        for (final ProjectIndex projIndex : _projectIndices)
-        {
-            buffer.append(String.format("\t%s\n", projIndex.toString())); //$NON-NLS-1$
-        }
-
-        return buffer.toString();
-    }
-
-    public synchronized ProjectIndex getProjectIndex(final IProject project)
-    {
-        ProjectIndex index = findIndex(project);
-
-        if (index != null)
-        {
-            return index;
-        }
-
-        // otherwise, create.
-        index = new ProjectIndex(0, project.getName(), _repositoryPath);
-        index.create();
-        _projectIndices.add(index);
-        try
-        {
-            save(_storageFile);
-        }
-        catch (IOException ioe)
-        {
-            JSFCorePlugin.log(ioe,
-                    "Failed to save master index.  Project Index for " //$NON-NLS-1$
-                            + project.toString() + " may not be saved"); //$NON-NLS-1$
-        }
-        return index;
-    }
-
-    public synchronized void removeProjectIndex(final IProject project) throws IOException
-    {
-        final ProjectIndex index = findIndex(project);
-        if (index != null)
-        {
-            _projectIndices.remove(index);
-            if (!index.remove())
-            {
-                throw new IOException("Failed to remove index file"); //$NON-NLS-1$
-            }
-        }
-    }
-
-    private ProjectIndex findIndex(final IProject project)
-    {
-        // check if the project already exists
-        for (final ProjectIndex index : _projectIndices)
-        {
-            if (index.getProjectName().equals(project.getName()))
-            {
-                return index;
-            }
-        }
-        return null;
-    }
-
-    private void writeObject(final java.io.ObjectOutputStream out)
-            throws IOException
-    {
-        out.writeObject(_header);
-        out.writeObject(_projectIndices);
-    }
-
-    private void readObject(final java.io.ObjectInputStream in)
-            throws IOException, ClassNotFoundException
-    {
-        _header = (IndexHeader) in.readObject();
-        _projectIndices = (List<ProjectIndex>) in.readObject();
-    }
-
-    private class IndexHeader implements Serializable
-    {
-        /**
-         * serializable
-         */
-        private static final long         serialVersionUID = 40851054201507727L;
-
-        private final SerializableVersion _version;
-//        private long                      _lastModifiedStamp;
-
-        public IndexHeader(final SerializableVersion version)
-        {
-            _version = version;
-//            _lastModifiedStamp = 0;
-        }
-
-//        protected final Version getVersion()
-//        {
-//            return _version.getVersion();
-//        }
-//
-//        protected final synchronized long modified()
-//        {
-//            return _lastModifiedStamp++;
-//        }
-//
-//        protected final synchronized long getLastModifiedStamp()
-//        {
-//            return _lastModifiedStamp;
-//        }
-
-        public String toString()
-        {
-            return "Version: " + _version.toString(); //$NON-NLS-1$
-        }
-    }
-
-    static class SerializableVersion implements Serializable
-    {
-        private Version           _version;
-        /**
-         * 
-         */
-        private static final long serialVersionUID = 5973410328814890568L;
-
-        public SerializableVersion(final int major, final int minor,
-                final int micro)
-        {
-            _version = new Version(major, minor, micro);
-        }
-
-        public SerializableVersion(final String versionString)
-        {
-            _version = new Version(versionString);
-        }
-
-        public Version getVersion()
-        {
-            return _version;
-        }
-
-        public String toString()
-        {
-            return _version.toString();
-        }
-
-        private void writeObject(ObjectOutputStream out) throws IOException
-        {
-            out.writeObject(_version.toString());
-        }
-
-        private void readObject(ObjectInputStream in) throws IOException,
-                ClassNotFoundException
-        {
-            final String versionString = (String) in.readObject();
-            _version = new Version(versionString);
-        }
-    }
-
-    static class ProjectIndex implements Serializable
-    {
-        /**
-         * 
-         */
-        private static final long serialVersionUID = 2864798175910805380L;
-
-        private final String      _projectName;
-        private final String      _relativePath;
-        private final long        _lastModStampOnProject;
-        private File              _file;
-
-        /**
-         * @param lastModStampOnProject
-         * @param projectName
-         * @param relativePath
-         */
-        public ProjectIndex(final long lastModStampOnProject,
-                final String projectName, final String relativePath)
-        {
-            super();
-            _lastModStampOnProject = lastModStampOnProject;
-            _projectName = projectName;
-            _relativePath = relativePath;
-        }
-
-        public boolean remove()
-        {
-            return _file.delete();
-        }
-
-        public synchronized void create()
-        {
-            final long uniqueCode = Math
-                    .round((Math.random() * Integer.MAX_VALUE));
-            final String fileName = String.format("Project_%s_%x.idx", //$NON-NLS-1$
-                    _projectName, Long.valueOf(uniqueCode));
-            _file = new File(new Path(_relativePath).append(fileName)
-                    .toOSString());
-        }
-
-        public synchronized Map<String, SerializableTLDNamespace> getNamespaces()
-                throws IOException, ClassNotFoundException
-        {
-            FileInputStream in = null;
-
-            try
-            {
-                in = new FileInputStream(_file);
-                final ObjectInputStream objStream = new ObjectInputStream(in);
-                final Map<String, SerializableTLDNamespace> namespaces = (Map<String, SerializableTLDNamespace>) objStream
-                        .readObject();
-                return namespaces;
-            }
-            catch (FileNotFoundException nfe)
-            {
-                return new HashMap<String, SerializableTLDNamespace>();
-            }
-            finally
-            {
-                if (in != null)
-                {
-                    in.close();
-                }
-            }
-        }
-
-        public synchronized void save(
-                final Map<String, SerializableTLDNamespace> namespaces)
-                throws IOException
-        {
-            FileOutputStream out = null;
-
-            try
-            {
-                out = new FileOutputStream(_file);
-                final ObjectOutputStream objStream = new ObjectOutputStream(out);
-                objStream.writeObject(namespaces);
-            }
-            finally
-            {
-                if (out != null)
-                {
-                    out.close();
-                }
-            }
-        }
-
-        public String toString()
-        {
-            return "project= " + _projectName + ", relativePath=" //$NON-NLS-1$ //$NON-NLS-2$
-                    + _relativePath + ", lastModified=" //$NON-NLS-1$
-                    + _lastModStampOnProject + ", saveFile=" + _file; //$NON-NLS-1$
-        }
-
-        // public synchronized void save()
-        // {
-        // if (_file != null)
-        // {
-        // doSave();
-        // }
-        // throw new NullPointerException("_file is null");
-        // }
-        //
-        // private void doSave() throws IOException
-        // {
-        // FileOutputStream out = null;
-        //            
-        // try
-        // {
-        // out = new FileOutputStream(_file);
-        // final ObjectOutputStream objStream = new ObjectOutputStream(out);
-        // objStream.writeObject(this);
-        // }
-        // finally
-        // {
-        // if (out != null)
-        // {
-        // out.close();
-        // }
-        // }
-        // }
-
-        protected final String getProjectName()
-        {
-            return _projectName;
-        }
-
-        protected final String getRelativePath()
-        {
-            return _relativePath;
-        }
-
-        protected final long getLastModStampOnProject()
-        {
-            return _lastModStampOnProject;
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/persistence/PersistedDataTagStrategy.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/persistence/PersistedDataTagStrategy.java
deleted file mode 100644
index 6c95f02..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/persistence/PersistedDataTagStrategy.java
+++ /dev/null
@@ -1,257 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.designtime.internal.view.model.jsp.persistence;
-
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.concurrent.atomic.AtomicBoolean;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.ITagElement;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.core.internal.JSFCoreTraceOptions;
-import org.eclipse.jst.jsf.designtime.internal.Messages;
-import org.eclipse.jst.jsf.designtime.internal.view.model.jsp.JSPTagResolvingStrategy;
-import org.eclipse.jst.jsf.designtime.internal.view.model.jsp.TLDNamespace;
-import org.eclipse.jst.jsf.designtime.internal.view.model.jsp.TLDTagElement;
-import org.eclipse.jst.jsp.core.internal.contentmodel.tld.provisional.TLDDocument;
-import org.eclipse.jst.jsp.core.internal.contentmodel.tld.provisional.TLDElementDeclaration;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMDocument;
-
-/**
- * @author cbateman
- * 
- */
-public class PersistedDataTagStrategy extends JSPTagResolvingStrategy
-{
-    /**
-     * the identifier of this strategy
-     */
-    public final static String                    ID              = "org.eclipse.jst.jsf.designtime.PersistedDataTagStrategy"; //$NON-NLS-1$
-    /**
-     * the display name
-     */
-    public final static String                    DISPLAY_NAME    = Messages.PersistedDataTagStrategy_DisplayName;
-
-    private final IProject                        _project;
-    private final TagRepository                   _repository;
-    private Map<String, SerializableTLDNamespace> _namespaces;
-    private final transient AtomicBoolean         _reentrancyFlag = new AtomicBoolean(
-                                                                          false);
-
-    /**
-     * @return the descriptor for this resolver strategy
-     */
-    public static StrategyDescriptor createDescriptor()
-    {
-        return new StrategyDescriptor(ID, DISPLAY_NAME);
-    }
-
-    /**
-     * @param project
-     */
-    public PersistedDataTagStrategy(final IProject project)
-    {
-        _project = project;
-        _repository = new TagRepository(_project);
-    }
-
-    /**
-     * 
-     */
-    public void init()
-    {
-        if (JSFCoreTraceOptions.TRACE_JSPTAGPERSISTENCE)
-        {
-            JSFCoreTraceOptions
-                    .log("Initializing PersistedDataTagStrategy for project: " //$NON-NLS-1$
-                            + _project.toString());
-        }
-        try
-        {
-            _namespaces = _repository.load();
-            return;
-        }
-        catch (final IOException e)
-        {
-            JSFCorePlugin
-                    .log(e,
-                            "JSP tag registry cached failed to load.  Strategy will not be used"); //$NON-NLS-1$
-        }
-        catch (final ClassNotFoundException e)
-        {
-            JSFCorePlugin
-                    .log(e,
-                            "JSP tag registry cached failed to load.  Strategy will not be used"); //$NON-NLS-1$
-        }
-        _namespaces = new HashMap<String, SerializableTLDNamespace>();
-    }
-
-    /**
-     * @param namespace
-     * @throws ClassNotFoundException
-     * @throws IOException
-     */
-    public void save(final Map<String, TLDNamespace> namespace)
-            throws IOException, ClassNotFoundException
-    {
-        if (JSFCoreTraceOptions.TRACE_JSPTAGPERSISTENCE)
-        {
-            JSFCoreTraceOptions
-                    .log("Saving PersistedDataTagStrategy for project: " //$NON-NLS-1$
-                            + _project.toString());
-        }
-
-        // namespace is considered authoritative for every key it contains
-        // so copy them all in. However, preserve anything in our own namespace
-        // map not found in namespace
-        for (final Map.Entry<String, TLDNamespace> namespaceEntry : namespace
-                .entrySet())
-        {
-            final TLDNamespace ns = namespaceEntry.getValue();
-            final String nsName = namespaceEntry.getKey();
-            final SerializableTLDNamespace myNs = _namespaces.get(nsName);
-
-            if (myNs == null)
-            {
-                if (JSFCoreTraceOptions.TRACE_JSPTAGPERSISTENCE)
-                {
-                    JSFCoreTraceOptions.log(String.format(
-                            "Adding namespace %s for project", ns.getNSUri(), //$NON-NLS-1$
-                            _project.toString()));
-                }
-
-                _namespaces.put(nsName, new SerializableTLDNamespace(ns));
-            }
-            else
-            {
-                if (JSFCoreTraceOptions.TRACE_JSPTAGPERSISTENCE)
-                {
-                    JSFCoreTraceOptions.log(String.format(
-                            "Updating namespace %s for project", ns.getNSUri(), //$NON-NLS-1$
-                            _project.toString()));
-                }
-
-                for (final Map.Entry<String, ITagElement> elementEntry : ns
-                        .getCurrentElements().entrySet())
-                {
-                    if (JSFCoreTraceOptions.TRACE_JSPTAGPERSISTENCE)
-                    {
-                        JSFCoreTraceOptions.log(String.format(
-                                "Putting element %s", elementEntry.getKey())); //$NON-NLS-1$
-                    }
-                    myNs.put(elementEntry.getKey(), elementEntry.getValue());
-                }
-            }
-        }
-
-        _repository.save(_namespaces);
-    }
-
-    @Override
-    public ITagElement resolve(final TLDElementDeclaration element)
-    {
-        if (JSFCoreTraceOptions.TRACE_JSPTAGPERSISTENCE)
-        {
-            JSFCoreTraceOptions.log(String.format(
-                    "Attempting to resolve element %s for project %s", element //$NON-NLS-1$
-                            .getElementName(), _project));
-        }
-
-        try
-        {
-            if (!_reentrancyFlag.compareAndSet(false, true))
-            {
-                throw new IllegalStateException("Reentrant call to resolve"); //$NON-NLS-1$
-            }
-
-            final String uri = getUri(element);
-            final String tagName = element.getElementName();
-
-            if (uri != null && tagName != null)
-            {
-                final SerializableTLDNamespace ns = _namespaces.get(uri);
-
-                if (ns != null)
-                {
-                    final ITagElement tagElement = ns.getViewElement(tagName);
-
-                    if (tagElement instanceof TLDTagElement)
-                    {
-                        if (JSFCoreTraceOptions.TRACE_JSPTAGPERSISTENCE)
-                        {
-                            JSFCoreTraceOptions.log(String.format(
-                                    "Resolved element %s for project %s", //$NON-NLS-1$
-                                    element.getElementName(), _project));
-                        }
-                        return tagElement;
-                    }
-                }
-            }
-            return getNotFoundIndicator();
-        }
-        finally
-        {
-            _reentrancyFlag.set(false);
-        }
-    }
-
-    /**
-     * Clears all cached data and removes it permanently from disk.
-     */
-    public void clear()
-    {
-        if (JSFCoreTraceOptions.TRACE_JSPTAGPERSISTENCE)
-        {
-            JSFCoreTraceOptions.log(String.format(
-                    "Flushing all data for project %s", _project)); //$NON-NLS-1$
-        }
-
-        try
-        {
-            _repository.clearAll();
-        }
-        catch (IOException e)
-        {
-            JSFCorePlugin.log(e, "Failure during cache flushing on project: " //$NON-NLS-1$
-                    + _project);
-        }
-        catch (ClassNotFoundException e)
-        {
-            JSFCorePlugin.log(e, "Failure during cache flushing on project: " //$NON-NLS-1$
-                    + _project);
-        }
-        _namespaces.clear();
-    }
-
-    public String getDisplayName()
-    {
-        return DISPLAY_NAME;
-    }
-
-    private static String getUri(final TLDElementDeclaration element)
-    {
-        final CMDocument owner = element.getOwnerDocument();
-
-        if (owner instanceof TLDDocument)
-        {
-            return ((TLDDocument) owner).getUri();
-        }
-        return null;
-    }
-
-    @Override
-    public String getId()
-    {
-        return ID;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/persistence/SerializableTLDNamespace.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/persistence/SerializableTLDNamespace.java
deleted file mode 100644
index b40878a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/persistence/SerializableTLDNamespace.java
+++ /dev/null
@@ -1,159 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.designtime.internal.view.model.jsp.persistence;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.ITagElement;
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.Namespace;
-import org.eclipse.jst.jsf.designtime.internal.view.model.jsp.TLDNamespace;
-import org.eclipse.jst.jsf.designtime.internal.view.model.jsp.TLDNamespace.TLDNamespaceData;
-
-/**
- * A serializable tld namespace. This is distinct from TLDNamespace in that it
- * takes a snapshot of a TLDNamespace at a point in time. Any elements not
- * lazily resolved by the TLDNamespace will not be resolved by this namespace.
- * 
- */
-public class SerializableTLDNamespace extends Namespace
-{
-    private final SerializedNamespaceData _data;
-
-    /**
-     * @param namespace
-     */
-    public SerializableTLDNamespace(final TLDNamespace namespace)
-    {
-        _data = new SerializedNamespaceData(namespace.getDisplayName(),
-                namespace.getCurrentElements(), namespace.getNSUri());
-    }
-
-    /**
-     * 
-     */
-    private static final long serialVersionUID = 5364814479459691353L;
-
-    @Override
-    public String getDisplayName()
-    {
-        return _data.getDisplayName();
-    }
-
-    @Override
-    public String getNSUri()
-    {
-        return _data.getUri();
-    }
-
-    @Override
-    public ITagElement getViewElement(String name)
-    {
-        return _data.getViewElement(name);
-    }
-
-    @Override
-    public Collection<? extends ITagElement> getViewElements()
-    {
-        return Collections.unmodifiableCollection(_data.getAllViewElements()
-                .values());
-    }
-
-    @Override
-    public boolean hasViewElements()
-    {
-        return _data.getNumTags() > 0;
-    }
-
-    @Override
-    public boolean isInitialized()
-    {
-        return _data.isInitialized();
-    }
-
-    /* package */void put(final String name, final ITagElement tagElement)
-    {
-        _data._tags.put(name, tagElement);
-    }
-
-    private static class SerializedNamespaceData extends TLDNamespaceData
-    {
-        /**
-         * serializable id
-         */
-        private static final long              serialVersionUID = -6723194339788215607L;
-        private final String                   _displayName;
-        private final String                   _uri;
-        private final Map<String, ITagElement> _tags;
-
-        /**
-         * @param displayName
-         * @param tags
-         * @param uri
-         */
-        private SerializedNamespaceData(String displayName,
-                Map<String, ITagElement> tags, String uri)
-        {
-            super();
-            _displayName = displayName;
-            _tags = new HashMap<String, ITagElement>();
-            for (final Map.Entry<String, ITagElement> tagEntry : tags.entrySet())
-            {
-                _tags.put(tagEntry.getKey(), tagEntry.getValue());
-            }
-            _uri = uri;
-        }
-
-        @Override
-        public String getDisplayName()
-        {
-            return _displayName;
-        }
-
-        @Override
-        public int getNumTags()
-        {
-            return _tags.size();
-        }
-
-        @Override
-        public ITagElement getViewElement(String name)
-        {
-            return _tags.get(name);
-        }
-
-        @Override
-        public String getUri()
-        {
-            return _uri;
-        }
-
-        @Override
-        public Map<String, ITagElement> getAllViewElements()
-        {
-            return _tags;
-        }
-
-        @Override
-        public boolean isInitialized()
-        {
-            return true;
-        }
-
-        @Override
-        public Map<String, ITagElement> getCurrentElements()
-        {
-            return _tags;
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/persistence/TagRepository.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/persistence/TagRepository.java
deleted file mode 100644
index 0d15744..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/persistence/TagRepository.java
+++ /dev/null
@@ -1,166 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-/**
- * 
- */
-package org.eclipse.jst.jsf.designtime.internal.view.model.jsp.persistence;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.Map;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.ITagElement;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.core.internal.JSFCoreTraceOptions;
-import org.eclipse.jst.jsf.designtime.internal.view.model.jsp.persistence.MasterIndex.ProjectIndex;
-import org.eclipse.jst.jsf.designtime.internal.view.model.jsp.persistence.MasterIndex.SerializableVersion;
-
-class TagRepository
-{
-    private final static Object       GLOBAL_MASTER_INDEX_LOCK = new Object();
-    private static MasterIndex        GLOBAL_MASTER_INDEX;
-    private final static String       PATH_TO_REPOSITORY       = "/.jsptagregistry"; //$NON-NLS-1$
-    private final static String       MASTER_INDEX_FILE_NAME   = "tagRegistryMasterIndex.idx"; //$NON-NLS-1$
-
-    private final IProject            _project;
-    //private Map<String, SerializableTLDNamespace> _namespaces;
-
-    public TagRepository(final IProject project)
-    {
-        _project = project;
-    }
-
-    public Map<String, SerializableTLDNamespace> load() throws IOException,
-            ClassNotFoundException
-    {
-        if (JSFCoreTraceOptions.TRACE_JSPTAGPERSISTENCE)
-        {
-            JSFCoreTraceOptions.log("Loading tag repository for: " //$NON-NLS-1$
-                    + _project.toString());
-        }
-
-        final MasterIndex index = getOrCreateMasterIndex();
-
-        final ProjectIndex projIndex = index.getProjectIndex(_project);
-        final Map<String, SerializableTLDNamespace> namespaces = projIndex.getNamespaces();
-
-        if (JSFCoreTraceOptions.TRACE_JSPTAGPERSISTENCE)
-        {
-            JSFCoreTraceOptions.log("Contents of repo for: " //$NON-NLS-1$
-                    + _project.toString());
-            
-            for (final Map.Entry<String, SerializableTLDNamespace> nsEntry : namespaces.entrySet())
-            {
-                JSFCoreTraceOptions.log("\tNamespace: "+nsEntry.getKey()); //$NON-NLS-1$
-                
-                SerializableTLDNamespace ns = nsEntry.getValue();
-                for (final ITagElement element : ns.getViewElements())
-                {
-                    JSFCoreTraceOptions.log("\t\tTag: "+element.toString()); //$NON-NLS-1$
-                }
-            }
-        }
-
-        return namespaces;
-    }
-
-    public void save(Map<String, SerializableTLDNamespace> namespaces) throws IOException,
-            ClassNotFoundException
-    {
-        final MasterIndex index = getOrCreateMasterIndex();
-        final ProjectIndex projectIndex = index.getProjectIndex(_project);
-        projectIndex.save(namespaces);
-    }
-
-    public void clearAll() throws IOException, ClassNotFoundException
-    {
-        final MasterIndex index = getOrCreateMasterIndex();
-        index.removeProjectIndex(_project);
-    }
-
-    private MasterIndex getOrCreateMasterIndex() throws IOException,
-            ClassNotFoundException
-    {
-        final IPath wkspacePath = JSFCorePlugin.getDefault().getStateLocation();
-        final IPath repoPath = wkspacePath.append(PATH_TO_REPOSITORY);
-        final File repoDir = new File(repoPath.toOSString());
-
-        synchronized (GLOBAL_MASTER_INDEX_LOCK)
-        {
-            if (GLOBAL_MASTER_INDEX != null)
-            {
-                if (JSFCoreTraceOptions.TRACE_JSPTAGPERSISTENCE)
-                {
-                    JSFCoreTraceOptions
-                            .log("GLOBAL_MASTER_INDEX already exists for: " //$NON-NLS-1$
-                                    + _project.toString());
-                }
-                return GLOBAL_MASTER_INDEX;
-            }
-
-            if (!repoDir.exists())
-            {
-                createNewRepo(repoDir);
-            }
-
-            final File masterIndexFile = new File(new Path(repoDir
-                    .getAbsolutePath()).append(MASTER_INDEX_FILE_NAME)
-                    .toOSString());
-            final MasterIndex index = new MasterIndex(masterIndexFile, repoDir.getAbsolutePath());
-
-            if (!masterIndexFile.exists())
-            {
-                if (!masterIndexFile.createNewFile())
-                {
-                    throw new IOException(
-                            "Could not create new master index file: " //$NON-NLS-1$
-                                    + masterIndexFile.toString());
-                }
-                if (JSFCoreTraceOptions.TRACE_JSPTAGPERSISTENCE)
-                {
-                    JSFCoreTraceOptions.log("Creating master index file for " //$NON-NLS-1$
-                            + _project.toString());
-                }
-                index.create(new SerializableVersion(1, 0, 0));
-            }
-            else
-            {
-                if (JSFCoreTraceOptions.TRACE_JSPTAGPERSISTENCE)
-                {
-                    JSFCoreTraceOptions.log("Loading master index file for " //$NON-NLS-1$
-                            + _project.toString());
-                }
-                index.load(new SerializableVersion(1, 0, 0));
-            }
-
-            GLOBAL_MASTER_INDEX = index;
-            return index;
-        }
-    }
-
-    private static void createNewRepo(final File repoDir) throws IOException
-    {
-        if (JSFCoreTraceOptions.TRACE_JSPTAGPERSISTENCE)
-        {
-            JSFCoreTraceOptions.log("Creating repo directory: " //$NON-NLS-1$
-                    + repoDir.getAbsolutePath());
-        }
-
-        if (!repoDir.mkdir())
-        {
-            throw new IOException("Failed to create repo directory: " //$NON-NLS-1$
-                    + repoDir.getAbsolutePath());
-        }
-    }
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/registry/LibraryOperation.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/registry/LibraryOperation.java
deleted file mode 100644
index 403fea9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/registry/LibraryOperation.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-/**
- * 
- */
-package org.eclipse.jst.jsf.designtime.internal.view.model.jsp.registry;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsp.core.taglib.ITaglibRecord;
-
-abstract class LibraryOperation implements Runnable
-{
-    protected final ITaglibRecord _changeRecord;
-    private IStatus               _result;
-
-    protected LibraryOperation(final ITaglibRecord changeRecord)
-    {
-        _changeRecord = changeRecord;
-    }
-
-    public final void run()
-    {
-        try
-        {
-            _result = doRun();
-        }
-        catch (final Exception e)
-        {
-            _result = new Status(IStatus.ERROR, JSFCorePlugin.PLUGIN_ID,
-                    "Problem during run", e); //$NON-NLS-1$
-        }
-    }
-
-    public IStatus getResult()
-    {
-        return _result;
-    }
-
-    protected abstract IStatus doRun();
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/registry/LibraryOperationFactory.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/registry/LibraryOperationFactory.java
deleted file mode 100644
index 70f5d3f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/registry/LibraryOperationFactory.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.designtime.internal.view.model.jsp.registry;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jst.jsp.core.taglib.ITaglibRecord;
-
-class LibraryOperationFactory
-{
-    private final TLDTagRegistry _tagRegistry;
-
-    public LibraryOperationFactory(final TLDTagRegistry tagRegistry)
-    {
-        _tagRegistry = tagRegistry;
-    }
-
-    LibraryOperation createAddOperation(final ITaglibRecord changeRecord)
-    {
-        return new AddTagLibrary(_tagRegistry, changeRecord);
-    }
-
-    LibraryOperation createRemoveOperation(final ITaglibRecord changeRecord)
-    {
-        return new RemoveTagLibrary(_tagRegistry, changeRecord);
-    }
-
-    LibraryOperation createChangeOperation(final ITaglibRecord changeRecord)
-    {
-        if (changeRecord == null)
-        {
-            throw new IllegalArgumentException();
-        }
-        return new ChangeTagLibrary(_tagRegistry, changeRecord);
-    }
-
-    private static class AddTagLibrary extends LibraryOperation
-    {
-        private final TLDTagRegistry _tagRegistry;
-
-        public AddTagLibrary(final TLDTagRegistry tagRegistry,
-                final ITaglibRecord newRecord)
-        {
-            super(newRecord);
-            _tagRegistry = tagRegistry;
-        }
-
-        @Override
-        protected IStatus doRun()
-        {
-            synchronized (_tagRegistry)
-            {
-                // fire change event if applicable
-                _tagRegistry.initialize(_changeRecord, true);
-                return Status.OK_STATUS;
-            }
-        }
-    }
-
-    private static class RemoveTagLibrary extends LibraryOperation
-    {
-        private final TLDTagRegistry _tagRegistry;
-
-        protected RemoveTagLibrary(final TLDTagRegistry tagRegistry,
-                final ITaglibRecord changeRecord)
-        {
-            super(changeRecord);
-            _tagRegistry = tagRegistry;
-        }
-
-        @Override
-        protected IStatus doRun()
-        {
-            _tagRegistry.remove(_changeRecord);
-            return Status.OK_STATUS;
-
-        }
-
-    }
-
-    private static class ChangeTagLibrary extends LibraryOperation
-    {
-        private final TLDTagRegistry _tagRegistry;
-
-        protected ChangeTagLibrary(final TLDTagRegistry tagRegistry,
-                final ITaglibRecord changeRecord)
-        {
-            super(changeRecord);
-            _tagRegistry = tagRegistry;
-        }
-
-        @Override
-        protected IStatus doRun()
-        {
-            IStatus result = null;
-
-            synchronized (_tagRegistry)
-            {
-                result = new RemoveTagLibrary(_tagRegistry, _changeRecord).doRun();
-
-                if (result.getSeverity() != IStatus.ERROR
-                        && result.getSeverity() != IStatus.CANCEL)
-                {
-                    result = new AddTagLibrary(_tagRegistry, _changeRecord)
-                            .doRun();
-                }
-            }
-
-            return result;
-        }
-
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/registry/TLDRegistryManager.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/registry/TLDRegistryManager.java
deleted file mode 100644
index 8bec065..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/registry/TLDRegistryManager.java
+++ /dev/null
@@ -1,251 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.designtime.internal.view.model.jsp.registry;
-
-import java.util.Collection;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.ISaveContext;
-import org.eclipse.core.resources.ISaveParticipant;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jst.jsf.common.internal.resource.ResourceSingletonObjectManager;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.core.internal.JSFCoreTraceOptions;
-import org.eclipse.jst.jsf.designtime.internal.Messages;
-import org.eclipse.jst.jsf.designtime.internal.view.model.ITagRegistry;
-import org.eclipse.jst.jsf.designtime.internal.view.model.TagRegistryFactory;
-import org.eclipse.wst.common.project.facet.core.IFacetedProject;
-import org.eclipse.wst.common.project.facet.core.IProjectFacet;
-import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
-
-/**
- * A per-resource singleton manager for TLDTagRegistry's.
- * 
- * @author cbateman
- * 
- */
-public final class TLDRegistryManager extends
-        ResourceSingletonObjectManager<TLDTagRegistry, IProject>
-{
-    // STATIC
-    private final static String JST_WEB_MODULE = "jst.web"; //$NON-NLS-1$
-    private static TLDRegistryManager INSTANCE;
-
-    /**
-     * @return the singleton instance
-     */
-    private static TLDRegistryManager getGlobalManager()
-    {
-        synchronized (TLDRegistryManager.class)
-        {
-            if (INSTANCE == null)
-            {
-                if (JSFCoreTraceOptions.TRACE_TLDREGISTRYMANAGER)
-                {
-                    JSFCoreTraceOptions
-                            .log("TLDRegistryManager: Initializing TLDRegistryManager singleton"); //$NON-NLS-1$
-                }
-                INSTANCE = new TLDRegistryManager();
-            }
-
-            return INSTANCE;
-        }
-    }
-
-    private TLDRegistryManager()
-    {
-        super(ResourcesPlugin.getWorkspace());
-        final ISaveParticipant participant = new MyWorkspaceSaveParticipant();
-        
-        try
-        {
-            ResourcesPlugin.getWorkspace().addSaveParticipant(JSFCorePlugin.getDefault().getPluginID()
-                    , participant);
-        }
-        catch (CoreException e)
-        {
-            JSFCorePlugin.log(e, "TLDRegistryManager failed to install save participant"); //$NON-NLS-1$
-        }
-    }
-
-    @Override
-    protected TLDTagRegistry createNewInstance(final IProject project)
-    {
-        if (JSFCoreTraceOptions.TRACE_TLDREGISTRYMANAGER)
-        {
-            JSFCoreTraceOptions
-                    .log("TLDRegistryManager: creating new instance for " //$NON-NLS-1$
-                            + project.toString());
-        }
-
-        return new TLDTagRegistry(project);
-    }
-
-    @Override
-    protected void runAfterGetInstance(final IProject resource)
-    {
-        if (JSFCoreTraceOptions.TRACE_TLDREGISTRYMANAGER)
-        {
-            JSFCoreTraceOptions
-                    .log("TLDRegistryManager: Acquired instance for " //$NON-NLS-1$
-                            + resource.toString());
-        }
-    }
-
-    @Override
-    protected void runBeforeGetInstance(final IProject resource)
-    {
-        if (JSFCoreTraceOptions.TRACE_TLDREGISTRYMANAGER)
-        {
-            JSFCoreTraceOptions.log("TLDRegistryManager: Getting registry for " //$NON-NLS-1$
-                    + resource.toString());
-        }
-    }
-
-    /**
-     * Adapter used to allow creation by extension point.
-     * 
-     * @author cbateman
-     * 
-     */
-    public static class MyRegistryFactory extends TagRegistryFactory
-    {
-        @Override
-        public ITagRegistry createTagRegistry(IProject project)
-                throws TagRegistryFactoryException
-        {
-            try
-            {
-                return getGlobalManager().getInstance(project);
-            }
-            catch (ManagedObjectException e)
-            {
-                throw new TagRegistryFactoryException(e);
-            }
-        }
-
-        @Override
-        public boolean isInstance(IProject project)
-        {
-           return getGlobalManager().isInstance(project);
-        }
-
-        public String getDisplayName()
-        {
-            return Messages.TLDRegistryManager_DisplayName;
-        }
-
-        @Override
-        public boolean projectIsValid(IProject project) {
-            if (project == null)
-            {
-                return false;
-            }
-
-            // Check that this is a dynamic web project
-            // (I.E. the JST Web facet is installed)
-            try
-            {
-                if (ProjectFacetsManager.isProjectFacetDefined(JST_WEB_MODULE))
-                {
-                    IFacetedProject faceted = ProjectFacetsManager.create(project);
-                    IProjectFacet webModuleFacet = ProjectFacetsManager.getProjectFacet(JST_WEB_MODULE);
-                    if (faceted != null && faceted.hasProjectFacet(webModuleFacet))
-                    {
-                        return true;
-                    }
-                }
-            }
-            catch (CoreException ce)
-            {
-            	JSFCorePlugin.log(ce, "TLDRegistryManager failed checking web project"); //$NON-NLS-1$
-            }
-
-            return false;
-        }
-    }
-
-    private class MyWorkspaceSaveParticipant implements ISaveParticipant
-    {
-        public void saving(ISaveContext context) throws CoreException
-        {
-            if (JSFCoreTraceOptions.TRACE_TLDREGISTRYMANAGER)
-            {
-                JSFCoreTraceOptions.log("MyWorkspaceSaveParticipant.saving: Kind="+context.getKind()); //$NON-NLS-1$
-            }
-            try
-            {
-                if (context.getKind() == ISaveContext.FULL_SAVE)
-                {
-                    final Collection<IProject> projects = TLDRegistryManager.this
-                            .getManagedResources();
-
-                    for (final IProject project : projects)
-                    {
-                        saveProject(project);
-                    }
-                }
-                else if (context.getKind() == ISaveContext.PROJECT_SAVE)
-                {
-                    saveProject(context.getProject());
-                }
-
-            }
-            catch (ManagedObjectException moe)
-            {
-                throw new CoreException(new Status(IStatus.ERROR,
-                        JSFCorePlugin.PLUGIN_ID, "Couldn't commit workspace", //$NON-NLS-1$
-                        moe));
-            }
-        }
-
-        private void saveProject(final IProject project)
-                throws ManagedObjectException
-        {
-            if (JSFCoreTraceOptions.TRACE_TLDREGISTRYMANAGER)
-            {
-                JSFCoreTraceOptions.log("MyWorkspaceSaveParticipant.saveProject: Project="+project.toString()); //$NON-NLS-1$
-            }
-
-            // check that there is already instance -- don't do anything if there
-            // isn't already an instance for project.
-            if (TLDRegistryManager.this.isInstance(project))
-            {
-                final TLDTagRegistry registry = TLDRegistryManager.this
-                        .getInstance(project);
-                if (JSFCoreTraceOptions.TRACE_TLDREGISTRYMANAGER)
-                {
-                    JSFCoreTraceOptions.log("MyWorkspaceSaveParticipant.saveProject: calling checkpoint on registry: "+registry.toString()); //$NON-NLS-1$
-                }
-
-                registry.checkpoint();
-            }
-        }
-
-        public void doneSaving(ISaveContext context)
-        {
-            // nothing to do
-        }
-
-        public void prepareToSave(ISaveContext context) throws CoreException
-        {
-            // nothing to do
-        }
-
-        public void rollback(ISaveContext context)
-        {
-            // nothing to do
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/registry/TLDRegistryPreferences.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/registry/TLDRegistryPreferences.java
deleted file mode 100644
index 594db8b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/registry/TLDRegistryPreferences.java
+++ /dev/null
@@ -1,394 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.designtime.internal.view.model.jsp.registry;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.CopyOnWriteArrayList;
-import java.util.concurrent.atomic.AtomicBoolean;
-
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.jst.jsf.common.internal.policy.OrderedListProvider;
-import org.eclipse.jst.jsf.common.internal.policy.OrderedListProvider.OrderableObject;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.designtime.internal.view.model.jsp.DefaultJSPTagResolver;
-import org.eclipse.jst.jsf.designtime.internal.view.model.jsp.TagIntrospectingStrategy;
-import org.eclipse.jst.jsf.designtime.internal.view.model.jsp.JSPTagResolvingStrategy.StrategyDescriptor;
-import org.eclipse.jst.jsf.designtime.internal.view.model.jsp.persistence.PersistedDataTagStrategy;
-
-/**
- * Preferences model for the TLD registry.  This class is not thread-safe and
- * a single instance should only be used by one owner.
- * 
- * @author cbateman
- * 
- */
-public class TLDRegistryPreferences
-{
-    private final static Map<String, StrategyDescriptor> ALL_KNOWN_STRATEGIES;
-
-    private final IPreferenceStore             _prefStore;
-    private final CopyOnWriteArrayList<PropertyListener> _listeners;
-    private final AtomicBoolean                _isDisposed = new AtomicBoolean(false);
-
-    private final static String                KEY_STRATEGY_ID_ORDER = "org.eclipse.jst.jsf.designtime.jsp.registry.StrategyIDOrder"; //$NON-NLS-1$
-
-    private final static List<OrderableObject> DEFAULT_STRATEGY_ORDER;
-
-    static
-    {
-        final List<OrderableObject> list = new ArrayList<OrderableObject>();
-
-        // NOTE !!! this ordering is important and effects the default order
-        // in which strategies will be consulted !!!
-        list.add(new OrderableObject(new StrategyIdentifier(PersistedDataTagStrategy.createDescriptor()), true));
-        list.add(new OrderableObject(new StrategyIdentifier(DefaultJSPTagResolver.createDescriptor()), true));
-        // Bug 312954 - temporarily disable the default preference for the
-        // TagIntrospectingStrategy. When bug 312936 and 240394 get resolved,
-        // roll back this change and re-enable.
-        list.add(new OrderableObject(new StrategyIdentifier(TagIntrospectingStrategy.createDescriptor()), false));
-        DEFAULT_STRATEGY_ORDER = Collections.unmodifiableList(list);
-        
-
-        final Map<String, StrategyDescriptor> knownDescriptors = new HashMap<String, StrategyDescriptor>();
-        for (final OrderableObject object : DEFAULT_STRATEGY_ORDER)
-        {
-            StrategyIdentifier strategyId = (StrategyIdentifier) object.getObject();
-            knownDescriptors.put(strategyId.getId(), strategyId._descriptor);
-        }
-        ALL_KNOWN_STRATEGIES = Collections.unmodifiableMap(knownDescriptors);
-    }
-
-    private List<OrderableObject>              _ids;
-    private List<OrderableObject>              _originalIds;
-    private IPropertyChangeListener            _propertyListener;
-
-    /**
-     * Constructor
-     * 
-     * @param prefStore
-     */
-    public TLDRegistryPreferences(final IPreferenceStore prefStore)
-    {
-        _prefStore = prefStore;
-        _ids = new ArrayList<OrderableObject>();
-        _listeners = new CopyOnWriteArrayList<PropertyListener>();
-    }
-
-    /**
-     * Dispose of this preferences object
-     */
-    public void dispose()
-    {
-        if (_isDisposed.compareAndSet(false, true))
-        {
-            if (_propertyListener != null)
-            {
-                _prefStore.removePropertyChangeListener(_propertyListener);
-            }
-        }
-    }
-
-    void addListener(final PropertyListener propListener)
-    {
-        if (!assertNotDisposed())
-        {
-            return;
-        }
-
-        if (_propertyListener == null)
-        {
-            _propertyListener = new IPropertyChangeListener()
-            {
-                public void propertyChange(PropertyChangeEvent event)
-                {
-                    if (KEY_STRATEGY_ID_ORDER.equals(event.getProperty()))
-                    {
-                        fireStrategyOrderChanged();
-                    }
-                }
-            };
-            
-            _prefStore.addPropertyChangeListener(_propertyListener);
-        }
-        _listeners.addIfAbsent(propListener);
-    }
-
-    void removeListener(final PropertyListener propListener)
-    {
-        if (!assertNotDisposed())
-        {
-            return;
-        }
-        _listeners.remove(propListener);
-
-        if (_listeners.isEmpty())
-        {
-            _prefStore.removePropertyChangeListener(_propertyListener);
-            _propertyListener = null;
-        }
-    }
-
-    private void fireStrategyOrderChanged()
-    {
-        if (!assertNotDisposed())
-        {
-            return;
-        }
-        for (final PropertyListener listener : _listeners)
-        {
-            listener.strategyOrderChanged();
-        }
-    }
-
-    /**
-     * @return false if the assertion fails
-     */
-    private boolean assertNotDisposed()
-    {
-        if (_isDisposed.get())
-        {
-            JSFCorePlugin.log(new Exception("Stack trace only"), "TLDRegistryPreferences is disposed"); //$NON-NLS-1$ //$NON-NLS-2$
-            return false;
-        }
-        return true;
-    }
-
-    /**
-     * IPreferenceStore The default preference loader
-     */
-    public void load()
-    {
-        load(_prefStore);
-    }
-
-    /**
-     * @return the ordered list provider for the strategy id ordering
-     */
-    public OrderedListProvider getOrderedListProvider()
-    {
-        return new MyOrderedListProvider();
-    }
-
-    /**
-     * @return the strategy id ordering
-     */
-    public List<OrderableObject> getStrategyIdOrdering()
-    {
-        return _ids;
-    }
-
-    /**
-     * @param ids
-     */
-    public void setStrategyIdOrdering(final List<OrderableObject> ids)
-    {
-        _ids = ids;
-    }
-
-    /**
-     * @return the list of strategy ids in the order they should be consulted
-     */
-    public List<String> getEnabledIds()
-    {
-        final List<String> strategies = new ArrayList<String>();
-
-        for (final OrderableObject id : _ids)
-        {
-            if (id.isEnabled())
-            {
-                StrategyIdentifier strategyId = (StrategyIdentifier) id.getObject();
-                strategies.add(strategyId.getId());
-            }
-        }
-        return strategies;
-    }
-
-    /**
-     * Loads preferences from prefStore
-     * 
-     * @param prefStore
-     */
-    private void load(final IPreferenceStore prefStore)
-    {
-        if (!prefStore.contains(KEY_STRATEGY_ID_ORDER))
-        {
-            prefStore.setDefault(KEY_STRATEGY_ID_ORDER,
-                    serialize(DEFAULT_STRATEGY_ORDER));
-        }
-        List<OrderableObject> ids = deserialize(prefStore
-                .getString(KEY_STRATEGY_ID_ORDER));
-        if (ids == null)
-        {
-            ids = deserialize(serialize(DEFAULT_STRATEGY_ORDER));
-        }
-        _ids = ids;
-        final List<OrderableObject> originalList = new ArrayList<OrderableObject>();
-        for (final OrderableObject id : _ids)
-        {
-            final OrderableObject copy = id.clone();
-            originalList.add(copy);
-        }
-        _originalIds = Collections.unmodifiableList(originalList);
-    }
-
-    private String serialize(final List<OrderableObject> ids)
-    {
-        final StringBuffer buffer = new StringBuffer();
-
-        for (final OrderableObject id : ids)
-        {
-            StrategyIdentifier strategyId = (StrategyIdentifier) id.getObject();
-            buffer.append("dummyValue"); //$NON-NLS-1$
-            buffer.append(","); //$NON-NLS-1$
-            buffer.append(strategyId.getId());
-            buffer.append(","); //$NON-NLS-1$
-            buffer.append(id.isEnabled());
-            buffer.append(","); //$NON-NLS-1$
-        }
-        return buffer.toString();
-    }
-
-    private List<OrderableObject> deserialize(final String serializedList)
-    {
-        final List<OrderableObject> list = new ArrayList<OrderableObject>();
-        final String[] ids = serializedList.split(","); //$NON-NLS-1$
-        if ((ids.length % 3) != 0)
-        {
-            return null;
-        }
-
-        for (int i = 0; i < ids.length; i += 3)
-        {
-            /// ingore the dummy value: final String displayName = ids[i];
-            String id = ids[i + 1];
-            final String enabled = ids[i + 2];
-
-            // fix old id for meta-data resolver
-            if ("org.eclipse.jst.jsf.THISISTEMPORARY".equals(id)) //$NON-NLS-1$
-            {
-                id = DefaultJSPTagResolver.ID;
-            }
-
-            final StrategyDescriptor desc = ALL_KNOWN_STRATEGIES.get(id);
-            
-            if (desc == null)
-            {
-                JSFCorePlugin.log(new Exception("Stack trace only"), "Error: unknown strategy id: "+id); //$NON-NLS-1$ //$NON-NLS-2$
-            }
-            else
-            {
-                final StrategyIdentifier strategyIdentifier = new StrategyIdentifier(desc);
-                list.add(new OrderableObject(strategyIdentifier
-                        , Boolean.valueOf(enabled).booleanValue()));
-            }
-        }
-        return list;
-    }
-
-    /**
-     * Commits but does not store the preferences
-     * 
-     * @param prefStore
-     */
-    public void commit(final IPreferenceStore prefStore)
-    {
-        prefStore.setValue(KEY_STRATEGY_ID_ORDER,
-                serialize(getStrategyIdOrdering()));
-        // refresh local copy of preferences
-        load();
-    }
-
-    /**
-     * Reverts the model to it's defaults. Does not commit to pref store.
-     */
-    public void setDefaults()
-    {
-         setStrategyIdOrdering(new ArrayList<OrderableObject>(
-                DEFAULT_STRATEGY_ORDER));
-    }
-
-    /**
-     * @return true if this preference object's properties have
-     * changed since load() was last called.
-     */
-    public boolean isDirty()
-    {
-        // dirty if the current list is not equal to the original list
-        // generated at load time.
-        return !(_ids.equals(_originalIds));
-    }
-
-    /**
-     * Used as the model for sorting and enabling strategy identifiers.
-     * 
-     */
-    public static class StrategyIdentifier
-    {
-        private final StrategyDescriptor _descriptor;
-
-        StrategyIdentifier(final StrategyDescriptor descriptor)
-        {
-            _descriptor = descriptor;
-        }
-
-        /**
-         * @return the id
-         */
-        public String getId()
-        {
-            return _descriptor.getId();
-        }
-
-        @Override
-        public boolean equals(Object obj)
-        {
-            if (obj instanceof StrategyIdentifier)
-            {
-                return getId().equals(((StrategyIdentifier)obj).getId());
-            }
-            return false;
-        }
-
-        @Override
-        public int hashCode()
-        {
-            return getId().hashCode();
-        }
-
-        /**
-         * @return the display name of the strategy
-         */
-        public String getDisplayName()
-        {
-            return _descriptor.getDisplayName();
-        }
-    }
-
-    private class MyOrderedListProvider extends OrderedListProvider
-    {
-        @Override
-        protected List<OrderableObject> createAndPopulateOrderedObjects()
-        {
-            return _ids;
-        }
-    }
-
-    static abstract class PropertyListener
-    {
-        public abstract void strategyOrderChanged();
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/registry/TLDTagRegistry.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/registry/TLDTagRegistry.java
deleted file mode 100644
index b224808..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/registry/TLDTagRegistry.java
+++ /dev/null
@@ -1,475 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.designtime.internal.view.model.jsp.registry;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.ConcurrentLinkedQueue;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.MultiStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.jst.jsf.common.internal.managedobject.IManagedObject;
-import org.eclipse.jst.jsf.common.internal.policy.IdentifierOrderedIteratorPolicy;
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.Namespace;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.core.internal.JSFCoreTraceOptions;
-import org.eclipse.jst.jsf.designtime.internal.Messages;
-import org.eclipse.jst.jsf.designtime.internal.view.model.AbstractTagRegistry;
-import org.eclipse.jst.jsf.designtime.internal.view.model.jsp.CompositeTagResolvingStrategy;
-import org.eclipse.jst.jsf.designtime.internal.view.model.jsp.DefaultJSPTagResolver;
-import org.eclipse.jst.jsf.designtime.internal.view.model.jsp.TLDNamespace;
-import org.eclipse.jst.jsf.designtime.internal.view.model.jsp.TagIntrospectingStrategy;
-import org.eclipse.jst.jsf.designtime.internal.view.model.jsp.UnresolvedJSPTagResolvingStrategy;
-import org.eclipse.jst.jsf.designtime.internal.view.model.jsp.persistence.PersistedDataTagStrategy;
-import org.eclipse.jst.jsp.core.internal.contentmodel.tld.CMDocumentFactoryTLD;
-import org.eclipse.jst.jsp.core.internal.contentmodel.tld.provisional.TLDDocument;
-import org.eclipse.jst.jsp.core.internal.contentmodel.tld.provisional.TLDElementDeclaration;
-import org.eclipse.jst.jsp.core.taglib.ITLDRecord;
-import org.eclipse.jst.jsp.core.taglib.ITaglibRecord;
-import org.eclipse.jst.jsp.core.taglib.TaglibIndex;
-
-/**
- * Registry of all tld-defined tags for a particular project classpath
- * 
- * @author cbateman
- * 
- */
-public final class TLDTagRegistry extends AbstractTagRegistry implements
-        IManagedObject
-{
-    // INSTANCE
-    private final IProject                                             _project;
-    private final Map<String, TLDNamespace>                            _nsResolved;
-    private final CompositeTagResolvingStrategy<TLDElementDeclaration> _resolver;
-    private boolean                                                    _hasBeenInitialized = false;
-    private final ConcurrentLinkedQueue<LibraryOperation>              _changeOperations   = new ConcurrentLinkedQueue<LibraryOperation>();
-    private final Job                                                  _changeJob;
-    private final PersistedDataTagStrategy                             _persistedTagStrategy;
-    private TagIndexListener                                           _tagIndexListener;
-    private final TLDRegistryPreferences                               _prefs;
-    private final MyPropertyListener                                   _myPropertyListener;
-
-    TLDTagRegistry(final IProject project)
-    {
-        _project = project;
-        _nsResolved = new HashMap<String, TLDNamespace>();
-
-        _prefs = new TLDRegistryPreferences(JSFCorePlugin.getDefault().getPreferenceStore());
-        _myPropertyListener = new MyPropertyListener();
-        _prefs.addListener(_myPropertyListener);
-        _prefs.load();
-        final IdentifierOrderedIteratorPolicy<String> policy =
-            getTagResolvingPolicy();
-
-        _resolver = new CompositeTagResolvingStrategy<TLDElementDeclaration>(
-                policy);
-
-        // add the strategies
-        _resolver.addStrategy(new TagIntrospectingStrategy(_project));
-        _resolver.addStrategy(new DefaultJSPTagResolver(_project));
-        // makes sure that a tag element will always be created for any
-        // given tag definition even if other methods fail
-        _resolver.addStrategy(new UnresolvedJSPTagResolvingStrategy());
-        _persistedTagStrategy = new PersistedDataTagStrategy(_project);
-        _persistedTagStrategy.init();
-        _resolver.addStrategy(_persistedTagStrategy);
-
-        _changeJob = new ChangeJob(project.getName());
-    }
-
-    private IdentifierOrderedIteratorPolicy<String>  getTagResolvingPolicy()
-    {
-        // strategy ordering
-        final List<String>  prefOrdering = _prefs.getEnabledIds();
-        final List<String> strategyOrdering = new ArrayList<String>(prefOrdering);
-        
-        // this strategy must always be here, always last
-        strategyOrdering.add(UnresolvedJSPTagResolvingStrategy.ID);
-
-        final IdentifierOrderedIteratorPolicy<String> policy = new IdentifierOrderedIteratorPolicy<String>(
-                strategyOrdering);
-        // exclude things that are not explicitly listed in the policy.  That
-        // way preference-based disablement will cause those strategies to
-        // be excluded.
-        policy.setExcludeNonExplicitValues(true);
-        return  policy;
-    }
-
-    protected final void doDispose()
-    {
-        if (JSFCoreTraceOptions.TRACE_JSPTAGREGISTRY)
-        {
-            JSFCoreTraceOptions.log("TLDTagRegistry: Disposing for project " //$NON-NLS-1$
-                    + _project.toString());
-        }
-
-        // call checkpoint to flush serializable data
-        checkpoint();
-        //_persistedTagStrategy.dispose();
-        
-        _nsResolved.clear();
-        _changeOperations.clear();
-
-        if (JSFCoreTraceOptions.TRACE_JSPTAGREGISTRY)
-        {
-            JSFCoreTraceOptions
-                    .log("TLDTagRegistry: Done disposing registry for " //$NON-NLS-1$
-                            + _project.toString());
-        }
-    }
-
-    @Override
-    protected void cleanupPersistentState()
-    {
-       // TODO
-    }
-
-    public synchronized void checkpoint()
-    {
-        try
-        {
-            _persistedTagStrategy.save(_nsResolved);
-        }
-        catch (IOException e)
-        {
-           JSFCorePlugin.log(e, "Checkpointing JSP tags failed"); //$NON-NLS-1$
-        }
-        catch (ClassNotFoundException e)
-        {
-            JSFCorePlugin.log(e, "Checkpointing JSP tags failed"); //$NON-NLS-1$
-        }
-    }
-
-    @Override
-    protected Job getRefreshJob(final boolean flushCaches)
-    {
-        return new Job(Messages.TLDTagRegistry_RefreshJob + _project.getName())
-        {
-            @Override
-            protected IStatus run(final IProgressMonitor monitor)
-            {
-                if (JSFCoreTraceOptions.TRACE_JSPTAGREGISTRY)
-                {
-                    JSFCoreTraceOptions.log("TLDTagRegistry.refresh: start"); //$NON-NLS-1$
-                }
-
-                synchronized (TLDTagRegistry.this)
-                {
-                    if (JSFCoreTraceOptions.TRACE_JSPTAGREGISTRY)
-                    {
-                        JSFCoreTraceOptions
-                                .log("TLDTagRegistry.refresh: start"); //$NON-NLS-1$
-                    }
-
-                    final List<Namespace> namespaces = new ArrayList(
-                            _nsResolved.values());
-
-                    if (flushCaches)
-                    {
-                        _persistedTagStrategy.clear();
-                    }
-                    // if we aren't flushing caches, then check point the
-                    // current namespace data, so it isn't lost when we clear
-                    // the namespaces
-                    else
-                    {
-                        checkpoint();
-                    }
-
-                    _nsResolved.clear();
-
-                    fireEvent(new TagRegistryChangeEvent(TLDTagRegistry.this,
-                            TagRegistryChangeEvent.EventType.REMOVED_NAMESPACE,
-                            namespaces));
-                    initialize(true);
-
-                    if (JSFCoreTraceOptions.TRACE_JSPTAGREGISTRY)
-                    {
-                        JSFCoreTraceOptions
-                                .log("TLDTagRegistry.refresh: finished"); //$NON-NLS-1$
-                    }
-                    return Status.OK_STATUS;
-                }
-            }
-        };
-    }
-
-    /**
-     */
-    private void initialize(boolean fireEvent)
-    {
-        if (JSFCoreTraceOptions.TRACE_JSPTAGREGISTRY)
-        {
-            JSFCoreTraceOptions.log("TLDTagRegistry.initialize: start"); //$NON-NLS-1$
-        }
-
-        final ITaglibRecord[] tldrecs = TaglibIndex
-                .getAvailableTaglibRecords(_project.getFullPath());
-        final List<Namespace> affectedObjects = new ArrayList<Namespace>();
-        for (final ITaglibRecord tldrec : tldrecs)
-        {
-            // defer the event
-            final Namespace ns = initialize(tldrec, fireEvent);
-
-            if (ns != null)
-            {
-                affectedObjects.add(ns);
-            }
-        }
-
-        _hasBeenInitialized = true;
-
-        // if tag index listener does exist, add it
-        if (_tagIndexListener == null)
-        {
-            if (JSFCoreTraceOptions.TRACE_TLDREGISTRYMANAGER)
-            {
-                JSFCoreTraceOptions
-                        .log("TLDRegistryManager: installing tag index listener due to create instance for " //$NON-NLS-1$
-                                + _project.toString());
-            }
-
-            _tagIndexListener = new TagIndexListener(this);
-            TaglibIndex.addTaglibIndexListener(_tagIndexListener);
-        }
-
-        // if (affectedObjects.size() > 0)
-        // {
-        // fireEvent(new TagRegistryChangeEvent(this,
-        // TagRegistryChangeEvent.EventType.ADDED_NAMESPACE,
-        // affectedObjects));
-        // }
-
-        if (JSFCoreTraceOptions.TRACE_JSPTAGREGISTRY)
-        {
-            JSFCoreTraceOptions.log("TLDTagRegistry.initialize: finished"); //$NON-NLS-1$
-        }
-    }
-
-    TLDNamespace initialize(final ITaglibRecord tagRecord,
-            final boolean fireEvent)
-    {
-        if (tagRecord.getRecordType() == ITLDRecord.URL)
-        {
-            if (JSFCoreTraceOptions.TRACE_JSPTAGREGISTRY_CHANGES)
-            {
-                JSFCoreTraceOptions.log("TLDTagRegistry.initialize_TagRecord: Initializing new tld record: "+tagRecord.toString()); //$NON-NLS-1$
-            }
-            long startTime = 0;
-            
-            if (JSFCoreTraceOptions.TRACE_JSPTAGREGISTRY_PERF)
-            {
-                startTime = System.nanoTime();
-            }
-            
-            final CMDocumentFactoryTLD factory = new CMDocumentFactoryTLD();
-            final TLDDocument doc = (TLDDocument) factory
-                    .createCMDocument(tagRecord);
-            if (doc != null)
-            {
-                final TLDNamespace ns = new TLDNamespace(doc, _resolver);
-                _nsResolved.put(doc.getUri(), ns);
-    
-                if (fireEvent)
-                {
-                    fireEvent(new TagRegistryChangeEvent(this,
-                            TagRegistryChangeEvent.EventType.ADDED_NAMESPACE,
-                            Collections.singletonList(ns)));
-                }
-
-                if (JSFCoreTraceOptions.TRACE_JSPTAGREGISTRY_PERF)
-                {
-                    System.out.printf("Time to update namespace %s was %d\n", //$NON-NLS-1$
-                            ns.getNSUri(), Long.valueOf(System.nanoTime()
-                                    - startTime));
-                }
-                return ns;
-            }
-        }
-        else 
-        {
-            if (JSFCoreTraceOptions.TRACE_JSPTAGREGISTRY_CHANGES)
-            {
-                JSFCoreTraceOptions.log("TLDTagRegistry.initialize_TagRecord: Skipping tag record for "+tagRecord.toString()); //$NON-NLS-1$
-            }
-
-        }
-        // no new namespace
-        return null;
-    }
-
-    void remove(final ITaglibRecord tagRecord)
-    {
-        // this is safer, since we likely fail to create a TLDDocument for
-        // a tagRecord that has been removed.
-        final String uri = tagRecord.getDescriptor().getURI();
-        final TLDNamespace ns = _nsResolved.remove(uri);
-
-        if (ns != null)
-        {
-            fireEvent(new TagRegistryChangeEvent(this,
-                    TagRegistryChangeEvent.EventType.REMOVED_NAMESPACE,
-                    Collections.singletonList(ns)));
-        }
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jst.jsf.designtime.internal.view.model.jsp.registry.ITagRegistry#getAllTagLibraries()
-     */
-    public final synchronized Collection<? extends Namespace> getAllTagLibraries()
-    {
-        if (JSFCoreTraceOptions.TRACE_JSPTAGREGISTRY)
-        {
-            JSFCoreTraceOptions.log("TLDTagRegistry.getAllTagLibraries: start"); //$NON-NLS-1$
-        }
-        long startTime = 0;
-        
-        if (JSFCoreTraceOptions.TRACE_JSPTAGREGISTRY_PERF)
-        {
-            startTime = System.nanoTime();
-        }
-        
-        if (!_hasBeenInitialized)
-        {
-            initialize(false);
-        }
-
-        final Set<TLDNamespace> allTagLibraries = new HashSet<TLDNamespace>();
-        allTagLibraries.addAll(_nsResolved.values());
-
-        if (JSFCoreTraceOptions.TRACE_JSPTAGREGISTRY_PERF)
-        {
-            System.out.println("Time to getAllTagLibraries for JSP: "+(System.nanoTime()-startTime)); //$NON-NLS-1$
-        }
-        if (JSFCoreTraceOptions.TRACE_JSPTAGREGISTRY)
-        {
-            JSFCoreTraceOptions
-                    .log("TLDTagRegistry.getAllTagLibraries: finished"); //$NON-NLS-1$
-        }
-        return allTagLibraries;
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jst.jsf.designtime.internal.view.model.jsp.registry.ITagRegistry#getTagLibrary(java.lang.String)
-     */
-    public final synchronized Namespace getTagLibrary(final String uri)
-    {
-        if (JSFCoreTraceOptions.TRACE_JSPTAGREGISTRY)
-        {
-            JSFCoreTraceOptions.log("TLDTagRegistry.getTagLibrary: start uri=" //$NON-NLS-1$
-                    + uri);
-        }
-
-        if (!_hasBeenInitialized)
-        {
-            initialize(false);
-        }
-
-        final Namespace ns = _nsResolved.get(uri);
-
-        if (JSFCoreTraceOptions.TRACE_JSPTAGREGISTRY)
-        {
-            JSFCoreTraceOptions
-                    .log("TLDTagRegistry.getTagLibrary: finished, result=" //$NON-NLS-1$
-                            + ns.toString());
-        }
-        return ns;
-    }
-
-    @Override
-    public String toString()
-    {
-        return String
-                .format(
-                        "TLDRegistry for project %s, isDisposed=%s, hasBeenInitialized=%s, numberOfNamespace=%d", //$NON-NLS-1$
-                        _project.toString(), Boolean.valueOf(isDisposed()),
-                        Boolean.valueOf(_hasBeenInitialized), Integer
-                                .valueOf(_nsResolved.size()));
-    }
-
-    void addLibraryOperation(final LibraryOperation operation)
-    {
-        _changeOperations.add(operation);
-        _changeJob.schedule();
-    }
-
-
-    private class ChangeJob extends Job
-    {
-        private int _rescheduleTime = -1;
-
-        public ChangeJob(final String projectName)
-        {
-            super(Messages.TLDTagRegistry_UpdateJob + projectName); 
-        }
-
-        @Override
-        protected IStatus run(final IProgressMonitor monitor)
-        {
-            synchronized (TLDTagRegistry.this)
-            {
-                _rescheduleTime = -1;
-
-                LibraryOperation operation = null;
-                final MultiStatus multiStatus = new MultiStatus(
-                        JSFCorePlugin.PLUGIN_ID, 0, "Result of change job", //$NON-NLS-1$
-                        new Throwable());
-                while ((operation = _changeOperations.poll()) != null)
-                {
-                    _rescheduleTime = 10000; // ms
-
-                    operation.run();
-                    multiStatus.add(operation.getResult());
-                }
-
-                if (_rescheduleTime >= 0 && !monitor.isCanceled())
-                {
-                    // if any operations were found on this run, reschedule
-                    // to run again in 10seconds based on the assumption that
-                    // events may be coming in bursts
-                    schedule(_rescheduleTime);
-                }
-
-                return multiStatus;
-            }
-        }
-    }
-    
-    private class MyPropertyListener extends TLDRegistryPreferences.PropertyListener
-    {
-        @Override
-        public void strategyOrderChanged()
-        {
-            synchronized(TLDTagRegistry.this)
-            {
-                _prefs.load();
-                final IdentifierOrderedIteratorPolicy<String> policy =
-                    getTagResolvingPolicy();
-                _resolver.setPolicy(policy);
-            }
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/registry/TagIndexListener.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/registry/TagIndexListener.java
deleted file mode 100644
index b360a27..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/registry/TagIndexListener.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-/**
- * 
- */
-package org.eclipse.jst.jsf.designtime.internal.view.model.jsp.registry;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jst.jsf.core.internal.JSFCoreTraceOptions;
-import org.eclipse.jst.jsp.core.taglib.ITaglibIndexDelta;
-import org.eclipse.jst.jsp.core.taglib.ITaglibIndexListener;
-
-class TagIndexListener implements ITaglibIndexListener
-{
-    private final TLDTagRegistry _registry;
-    private final LibraryOperationFactory  _factory;
-    
-    TagIndexListener(final TLDTagRegistry registry)
-    {
-        _registry = registry;
-        _factory = new LibraryOperationFactory(_registry);
-    }
-
-    public void indexChanged(final ITaglibIndexDelta delta)
-    {
-        if (JSFCoreTraceOptions.TRACE_JSPTAGREGISTRY_CHANGES)
-        {
-            JSFCoreTraceOptions.log("TagIndexListener.indexChanged: start"); //$NON-NLS-1$
-        }
-
-        visitDelta(delta);
-
-        if (JSFCoreTraceOptions.TRACE_JSPTAGREGISTRY_CHANGES)
-        {
-            JSFCoreTraceOptions.log("TagIndexListener.indexChanged: finish"); //$NON-NLS-1$
-        }
-    }
-
-    private void visitDelta(final ITaglibIndexDelta delta)
-    {
-        final IProject project = delta.getProject();
-
-        if (_registry != null && !_registry.isDisposed()
-                && delta.getTaglibRecord() != null)
-        {
-            switch (delta.getKind())
-            {
-                case ITaglibIndexDelta.ADDED:
-                {
-                    if (JSFCoreTraceOptions.TRACE_JSPTAGREGISTRY_CHANGES)
-                    {
-                        JSFCoreTraceOptions.log(String.format(
-                                "Processing add change: project=%s", project //$NON-NLS-1$
-                                        .getName()));
-                    }
-
-                    _registry.addLibraryOperation(_factory
-                            .createAddOperation(delta.getTaglibRecord()));
-                }
-                break;
-                case ITaglibIndexDelta.REMOVED:
-                {
-                    if (JSFCoreTraceOptions.TRACE_JSPTAGREGISTRY_CHANGES)
-                    {
-                        JSFCoreTraceOptions
-                                .log(String
-                                        .format(
-                                                "Processing remove change: project=%s, tagrecord=%s", //$NON-NLS-1$
-                                                project.getName()));
-                    }
-                    _registry.addLibraryOperation(_factory
-                            .createRemoveOperation(delta.getTaglibRecord()));
-                }
-                break;
-                case ITaglibIndexDelta.CHANGED:
-                {
-                    if (JSFCoreTraceOptions.TRACE_JSPTAGREGISTRY_CHANGES)
-                    {
-                        JSFCoreTraceOptions.log(String.format(
-                                "Processing change: project=%s, tagrecord=%s", //$NON-NLS-1$
-                                project.getName()));
-                    }
-                    _registry.addLibraryOperation(_factory
-                            .createChangeOperation(delta.getTaglibRecord()));
-                }
-                break;
-            }
-        }
-
-        // visit children
-        for (final ITaglibIndexDelta child : delta.getAffectedChildren())
-        {
-            visitDelta(child);
-        }
-    }
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/messages.properties b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/messages.properties
deleted file mode 100644
index 7110e26..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/messages.properties
+++ /dev/null
@@ -1,19 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-AbstractDataModelVariableFactory.DataModel.Symbol.RowVariable.DetailedDescription=Row variable for dataTable
-JSPDefaultSymbolFactory.Resource.bundle.map.detailedDescription=Resource bundle map for bundle <i>
-JSPDefaultSymbolFactory.Problem.ErrorCreatingVariable=Error creating loadBundle variable
-JSPModelProcessor.0=Refreshing JSF information about: {0}
-ResourceBundleSymbolSourceProvider.DetailedDescription=Resource bundle map for bundle <i>
-DefaultBeanSymbolSourceProvider.AdditionalInformation.Name=Name:
-DefaultBeanSymbolSourceProvider.AdditionalInformation.Type=Type:
-DefaultBeanSymbolSourceProvider.AdditionalInformation.Scope=Scope:
-DefaultBeanSymbolSourceProvider.AdditionalInformation.Description=Description:
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/package-info.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/package-info.java
deleted file mode 100644
index 9f687e3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/package-info.java
+++ /dev/null
@@ -1,16 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-/**
- * JSF Design Time Application Manager Framework.
- */
-package org.eclipse.jst.jsf.designtime;
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/resolver/AbstractStructuredDocumentSymbolResolverFactory.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/resolver/AbstractStructuredDocumentSymbolResolverFactory.java
deleted file mode 100644
index 3fb922c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/resolver/AbstractStructuredDocumentSymbolResolverFactory.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.designtime.resolver;
-
-import org.eclipse.jst.jsf.context.IModelContext;
-
-/**
- * A base class for symbol resolver factories.
- * 
- * @author cbateman
- *
- */
-public abstract class AbstractStructuredDocumentSymbolResolverFactory implements
-        IStructuredDocumentSymbolResolverFactory
-{
-    /**
-     * @see org.eclipse.jst.jsf.designtime.resolver.IStructuredDocumentSymbolResolverFactory#getSymbolContextResolver(org.eclipse.jst.jsf.context.IModelContext)
-     */
-    public abstract ISymbolContextResolver getSymbolContextResolver(IModelContext context);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/resolver/AbstractSymbolContextResolver.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/resolver/AbstractSymbolContextResolver.java
deleted file mode 100644
index aa766a7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/resolver/AbstractSymbolContextResolver.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.designtime.resolver;
-
-import org.eclipse.jst.jsf.context.IModelContext;
-import org.eclipse.jst.jsf.context.symbol.IMethodSymbol;
-import org.eclipse.jst.jsf.context.symbol.IObjectSymbol;
-import org.eclipse.jst.jsf.context.symbol.ISymbol;
-
-
-/**
- * An abstract that should sub-classed by clients wishing to implement
- * the ISymbolContextResolver interface
- * 
- * @author cbateman
- *
- */
-public abstract class AbstractSymbolContextResolver implements ISymbolContextResolver 
-{
-    public abstract ISymbol[] getAllVariables();
-
-    public abstract IMethodSymbol getMethod(IObjectSymbol base, Object methodName);
-
-    public abstract ISymbol[] getMethods(IObjectSymbol base);
-
-    public abstract ISymbol[] getProperties(ISymbol symbol);
-
-    public abstract ISymbol getProperty(ISymbol symbol, Object propertyName);
-    
-    public abstract ISymbol getVariable(String name);
-
-    public abstract boolean canResolveContext(IModelContext modelContext);
-
-    /**
-     * Default implementation
-     * 
-     * We should avoid returning true unless we are positive that changing
-     * to this context won't change the way symbols are resolved.
-     */
-    public boolean hasSameResolution(IModelContext modelContext)
-    {
-        return false;
-    }
-    
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/resolver/CachingSymbolContextResolver.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/resolver/CachingSymbolContextResolver.java
deleted file mode 100644
index 158d3cb..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/resolver/CachingSymbolContextResolver.java
+++ /dev/null
@@ -1,223 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.designtime.resolver;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.jst.jsf.context.IModelContext;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.jst.jsf.context.symbol.IMethodSymbol;
-import org.eclipse.jst.jsf.context.symbol.IObjectSymbol;
-import org.eclipse.jst.jsf.context.symbol.ISymbol;
-import org.eclipse.jst.jsf.context.symbol.SymbolFactory;
-
-/**
- * A symbol resolver that delegates to the default SymbolContextResolver, but
- * caches the results and returns those on subsequent calls.
- * 
- * WARNING: this resolver is suitable *only* in situations where the state
- * of dependent symbol sources won't change between calls.  This resolver makes
- * no attempt to ensure that cached data is in sync with changes to symbols
- * such addition, modification or removal of Java class underlying beans.
- * 
- * NOTE: this resolver is experimental and should NOT be considered API
- * 
- * Clients should not use this resolver directly.  Access it through the factory instead
- * @author cbateman
- *
- */
-public final class CachingSymbolContextResolver extends AbstractSymbolContextResolver
-{
-    private final static ISymbol SYMBOL_NOT_FOUND = SymbolFactory.eINSTANCE.createIComponentSymbol();
-    private final static ISymbol PROPERTY_NOT_FOUND = SymbolFactory.eINSTANCE.createIPropertySymbol();
-    private final static IMethodSymbol METHOD_SYMBOL_NOT_FOUND =
-        SymbolFactory.eINSTANCE.createIMethodSymbol();
-    
-    private final ISymbolContextResolver     _delegate;
-
-    private final Map<String, ISymbol>  _variablesByName = new HashMap<String, ISymbol>();
-    private ISymbol[]                   _allVariables;
-
-    private final Map<ISymbol, Map<Object, ISymbol>>    _propertiesByOwner =
-        new HashMap<ISymbol, Map<Object,ISymbol>>();
-    private ISymbol[]                   _allProperties;
-
-    private final Map<IObjectSymbol, Map<Object, IMethodSymbol>> _methodsByOwner =
-        new HashMap<IObjectSymbol, Map<Object,IMethodSymbol>>();
-    private ISymbol[]             _allMethods;
-    
-    /**
-     * @param context
-     */
-    public CachingSymbolContextResolver(final IStructuredDocumentContext context)
-    {
-        _delegate = new SymbolContextResolver(context);
-    }
-
-    /**
-     * @param delegate
-     */
-    public CachingSymbolContextResolver(final ISymbolContextResolver delegate)
-    {
-        _delegate = delegate;
-    }
-
-    @Override
-    public boolean canResolveContext(final IModelContext modelContext)
-    {
-        return _delegate.canResolveContext(modelContext);
-    }
-
-    @Override
-    public ISymbol[] getAllVariables()
-    {
-        if (_allVariables == null)
-        {
-            _allVariables = _delegate.getAllVariables();
-        }
-        return _allVariables;
-    }
-
-    @Override
-    public IMethodSymbol getMethod(final IObjectSymbol base, final Object methodName)
-    {
-        Map<Object, IMethodSymbol> methods = _methodsByOwner.get(base);
-        
-        if (methods == null)
-        {
-            methods = new HashMap<Object, IMethodSymbol>();
-            _methodsByOwner.put(base, methods);
-        }
-
-        IMethodSymbol method = methods.get(methodName);
-
-        if (method == METHOD_SYMBOL_NOT_FOUND)
-        {
-            method = null;
-        }
-        else
-        {
-            if (method == null)
-            {
-                method = _delegate.getMethod(base, methodName);
-                
-                if (method == null)
-                {
-                    // if the delegate couldn't find the property,
-                    // then mark this in case it is requested again
-                    methods.put(methodName, METHOD_SYMBOL_NOT_FOUND);
-                }
-                else
-                {
-                    methods.put(methodName, method);
-                }
-            }
-        }
-        return method;
-    }
-
-    @Override
-    public ISymbol[] getMethods(final IObjectSymbol base)
-    {
-        if (_allMethods == null)
-        {
-            _allMethods = _delegate.getMethods(base);
-        }
-        return _allMethods;
-    }
-
-    @Override
-    public ISymbol[] getProperties(final ISymbol symbol)
-    {
-        if (_allProperties == null)
-        {
-            _allProperties = _delegate.getProperties(symbol);
-        }
-        return _allProperties;
-    }
-
-    @Override
-    public ISymbol getProperty(final ISymbol symbol, final Object propertyName)
-    {
-        Map<Object, ISymbol> properties = _propertiesByOwner.get(symbol);
-        
-        if (properties == null)
-        {
-            properties = new HashMap<Object, ISymbol>();
-            _propertiesByOwner.put(symbol, properties);
-        }
-
-        ISymbol property = properties.get(propertyName);
-
-        if (property == PROPERTY_NOT_FOUND)
-        {
-            property = null;
-        }
-        else
-        {
-            if (property == null)
-            {
-                property = _delegate.getProperty(symbol, propertyName);
-                
-                if (property == null)
-                {
-                    // if the delegate couldn't find the property,
-                    // then mark this in case it is requested again
-                    properties.put(propertyName, PROPERTY_NOT_FOUND);
-                }
-                else
-                {
-                    properties.put(propertyName, property);
-                }
-            }
-        }
-        return property;
-    }
-
-    @Override
-    public ISymbol getVariable(final String name)
-    {
-        ISymbol variable = _variablesByName.get(name);
-
-        // if the symbol was not found, return null but avoid calling the
-        // delegate again
-        if (variable == SYMBOL_NOT_FOUND)
-        {
-            variable = null;
-        }
-        else
-        {
-            if (variable == null)
-            {
-                variable = _delegate.getVariable(name);
-                
-                if (variable == null)
-                {
-                    // if the delegate couldn't find the variable,
-                    // then mark this in case it is requested again
-                    _variablesByName.put(name, SYMBOL_NOT_FOUND);
-                }
-                else
-                {
-                    _variablesByName.put(name, variable);
-                }
-            }
-        }
-        return variable;
-    }
-
-    @Override
-    public boolean hasSameResolution(IModelContext modelContext)
-    {
-        return _delegate.hasSameResolution(modelContext);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/resolver/IStructuredDocumentSymbolResolverFactory.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/resolver/IStructuredDocumentSymbolResolverFactory.java
deleted file mode 100644
index cdc8b14..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/resolver/IStructuredDocumentSymbolResolverFactory.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.designtime.resolver;
-
-import org.eclipse.jst.jsf.context.IModelContext;
-
-/**
- * A factory for symbol context resolvers.
- * 
- * Clients may use but implement this interface.  To implement, sub-class
- * AbstractStructuredDocumentSymbolResolverFactory
- * 
- * @author cbateman
- *
- */
-public interface IStructuredDocumentSymbolResolverFactory
-{
-    /**
-     * @param context
-     * @return a new instance of symbol resolver for context
-     */
-    public ISymbolContextResolver getSymbolContextResolver(IModelContext context);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/resolver/ISymbolContextResolver.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/resolver/ISymbolContextResolver.java
deleted file mode 100644
index 6051043..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/resolver/ISymbolContextResolver.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- * 
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.designtime.resolver;
-
-import org.eclipse.jst.jsf.context.IModelContext;
-import org.eclipse.jst.jsf.context.resolver.IDocumentContextResolver;
-import org.eclipse.jst.jsf.context.symbol.IMethodSymbol;
-import org.eclipse.jst.jsf.context.symbol.IObjectSymbol;
-import org.eclipse.jst.jsf.context.symbol.ISymbol;
-
-/**
- * Resolves symbols and possible symbols in a given context
- * 
- * May NOT be sub-classed or implemented by clients.
- * Sub-class AbstractSymbolContextResolver to implement.
- * 
- * @author cbateman
- *
- */
-public interface ISymbolContextResolver extends IDocumentContextResolver
-{
-    /**
-     * Gets the most appropriate symbol in the current context
-     * based on name.  Most "appropriate" may take into account
-     * scoping and other rules.
-     * 
-     * @param name
-     * @return a symbol
-     */
-    ISymbol  getVariable(String name);
-
-    /**
-     * @return all valid symbols in the current context
-     */
-    ISymbol[] getAllVariables();
-
-    /**
-     * @param symbol
-     * @param propertyName
-     * @return the property symbol called propertyName or null if not found
-     */
-    ISymbol getProperty(ISymbol symbol, Object propertyName);
-
-    /**
-     * @param symbol
-     * @return all properties of symbol
-     */
-    ISymbol[]  getProperties(ISymbol symbol);
-
-    /**
-     * @param base
-     * @param methodName
-     * @return the method of base matching methodName or null if not found
-     */
-    IMethodSymbol getMethod(IObjectSymbol base, Object methodName);
-
-    /**
-     * @param base
-     * @return all methods belonging to base
-     */
-    ISymbol[] getMethods(IObjectSymbol base);
-    
-    /**
-     * This is meant to be used things like caching to determine if caches
-     * need to be flushed for different contexts.  If you are in doubt, always
-     * return false.
-     * 
-     * NOTE: this method should not be used to determine if symbols previously
-     * returned by this resolver have changed to do changes in the underlying
-     * application such as change to a managed bean.  This method only needs
-     * to check if what variable, properties and methods may have resolved
-     * different, because of the context itself.
-     * 
-     * @param modelContext
-     * @since 3.0
-     * @return true if the instance of this resolver would resolve everything
-     * exactly the same with this modelContext.  False otherwise.
-     */
-    boolean hasSameResolution(final IModelContext modelContext);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/resolver/StructuredDocumentSymbolResolverFactory.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/resolver/StructuredDocumentSymbolResolverFactory.java
deleted file mode 100644
index 3366413..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/resolver/StructuredDocumentSymbolResolverFactory.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.designtime.resolver;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jst.jsf.context.AbstractDelegatingFactory;
-import org.eclipse.jst.jsf.context.IModelContext;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
-
-/**
- * Factory create resolver capable of resolving symbols in a structured document
- * 
- * Clients may not sub-class.
- * 
- * @author cbateman
- * 
- */
-public final class StructuredDocumentSymbolResolverFactory extends
-        AbstractDelegatingFactory implements
-        IStructuredDocumentSymbolResolverFactory
-{
-    private static StructuredDocumentSymbolResolverFactory INSTANCE;
-
-    /**
-     * @return the singleton factory instance
-     */
-    public final static synchronized StructuredDocumentSymbolResolverFactory getInstance()
-    {
-        if (INSTANCE == null)
-        {
-            // no delegates supported
-            INSTANCE = new StructuredDocumentSymbolResolverFactory(new Class[]
-            { IStructuredDocumentSymbolResolverFactory.class });
-        }
-
-        return INSTANCE;
-    }
-
-    private StructuredDocumentSymbolResolverFactory(
-            Class[] supportedDelegateTypes)
-    {
-        super(supportedDelegateTypes);
-        for (final IAdaptable delegate : SymbolContextResolverReader
-                .getAllHandlers())
-        {
-            addFactoryDelegate(delegate);
-        }
-    }
-
-    /**
-     * @param context
-     * @return a new instance of symbol resolver for context
-     */
-    public ISymbolContextResolver getSymbolContextResolver(IModelContext context)
-    {
-        ISymbolContextResolver resolver = delegateGetSymbolContextResolver(context);
-
-        if (resolver == null)
-        {
-            resolver = internalGetSymbolContextResolver(context);
-        }
-
-        return resolver;
-    }
-
-    private ISymbolContextResolver internalGetSymbolContextResolver(
-            IModelContext context)
-    {
-        if (context instanceof IStructuredDocumentContext
-                && ((IStructuredDocumentContext) context)
-                        .getStructuredDocument() instanceof IStructuredDocument)
-        {
-            return new SymbolContextResolver(
-                    (IStructuredDocumentContext) context);
-        }
-
-        return null;
-    }
-
-    private ISymbolContextResolver delegateGetSymbolContextResolver(
-            IModelContext context)
-    {
-        for (final IAdaptable adaptable : _delegates)
-        {
-            final IStructuredDocumentSymbolResolverFactory delegateFactory = 
-                (IStructuredDocumentSymbolResolverFactory) adaptable
-                    .getAdapter(IStructuredDocumentSymbolResolverFactory.class);
-            ISymbolContextResolver symbolContextResolver = delegateFactory
-                    .getSymbolContextResolver(context);
-
-            if (symbolContextResolver != null)
-            {
-                return symbolContextResolver;
-            }
-        }
-        return null;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/resolver/SymbolContextResolver.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/resolver/SymbolContextResolver.java
deleted file mode 100644
index 3652db1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/resolver/SymbolContextResolver.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.designtime.resolver;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.jst.jsf.context.IModelContext;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IStructuredDocumentContextResolverFactory;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IWorkspaceContextResolver;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.jst.jsf.context.symbol.IMethodSymbol;
-import org.eclipse.jst.jsf.context.symbol.IObjectSymbol;
-import org.eclipse.jst.jsf.context.symbol.ISymbol;
-import org.eclipse.jst.jsf.designtime.DesignTimeApplicationManager;
-import org.eclipse.jst.jsf.designtime.context.DTFacesContext;
-
-/**
- * A symbol context resolver
- * Clients may NOT sub-class.
- * 
- * @author cbateman
- *
- */
-/*package*/ final class SymbolContextResolver extends AbstractSymbolContextResolver 
-{
-    private final IStructuredDocumentContext        _context;
-    private IWorkspaceContextResolver               _wkspResolver; // = null; lazy created through getWorkspaceResolver
-
-	/**
-     * @param context
-     */
-    /* package */SymbolContextResolver(IStructuredDocumentContext context)
-    {
-        _context = context;
-    }
-
-    public ISymbol getVariable(String name) 
-    {
-        final IFile file = getFile();
-        
-        if (file != null)
-        {
-            final DesignTimeApplicationManager manager =
-                DesignTimeApplicationManager.getInstance(file.getProject());
-            
-            if (manager != null)
-            {
-                final DTFacesContext facesContext = manager.getFacesContext(file);
-        
-                return manager.getVariableResolver().
-                    resolveVariable(facesContext, name, file);
-            }
-        }
-        
-        return null;
-    }
-
-    public ISymbol[] getAllVariables() 
-    {
-        final IFile file = getFile();
-        
-        if (file != null)
-        {
-            final DesignTimeApplicationManager manager =
-                DesignTimeApplicationManager.getInstance(file.getProject());
-            
-            if (manager != null)
-            {
-                final DTFacesContext facesContext = manager.getFacesContext(file);
-                
-                if (facesContext != null)
-                {
-                    return manager.getVariableResolver().
-                            getAllVariables(facesContext, file);
-                }
-            }
-        }
-        
-        return ISymbol.EMPTY_SYMBOL_ARRAY;
-    }
-    
-    public ISymbol getProperty(ISymbol symbol, Object propertyName) 
-    {
-        final IFile file = getFile();
-        
-        if (file != null)
-        {
-            final DesignTimeApplicationManager manager =
-                DesignTimeApplicationManager.getInstance(file.getProject());
-            
-            if (manager != null)
-            {
-                return manager.getPropertyResolver().getProperty(symbol, propertyName);
-            }
-        }
-        
-        return null;
-    }
-
-    public ISymbol[] getProperties(ISymbol symbol) 
-    {
-        final IFile file = getFile();
-        
-        if (file != null)
-        {
-            final DesignTimeApplicationManager manager =
-                DesignTimeApplicationManager.getInstance(file.getProject());
-            
-            if (manager != null)
-            {
-                return manager.getPropertyResolver().getAllProperties(symbol);
-            }
-        }
-        return ISymbol.EMPTY_SYMBOL_ARRAY;
-    }
-
-    public IMethodSymbol getMethod(IObjectSymbol base, Object methodName)
-    {
-        final IFile file = getFile();
-        
-        if (file != null)
-        {
-            final DesignTimeApplicationManager manager =
-                DesignTimeApplicationManager.getInstance(file.getProject());
-             
-            if (manager != null)
-            {
-                return manager.getMethodResolver().getMethod(base, methodName);
-            }
-        }
-        
-        return null;
-    }
-    
-    public ISymbol[] getMethods(IObjectSymbol base) 
-    {
-        final IFile file = getFile();
-        
-        if (file != null)
-        {
-            final DesignTimeApplicationManager manager =
-                DesignTimeApplicationManager.getInstance(file.getProject());
-            
-            if (manager != null)
-            {
-                return manager.getMethodResolver().getMethods(base);
-            }
-        }
-        
-        return new IMethodSymbol[0];
-    }
-
-    
-	public boolean canResolveContext(IModelContext modelContext)
-    {
-		return modelContext.getAdapter(IStructuredDocumentContext.class) != null;
-	}
-	
-    /**
-     * @return a lazily loaded workspace resolver for this resolver's context
-     */
-    protected final IWorkspaceContextResolver  getWorkspaceResolver()
-    {
-        if (_wkspResolver == null)
-        {
-            _wkspResolver = getWorkspaceResolver(_context);
-        }
-        
-        return _wkspResolver;
-    }
-    
-    private IWorkspaceContextResolver getWorkspaceResolver(final IStructuredDocumentContext context)
-    {
-        return IStructuredDocumentContextResolverFactory.INSTANCE
-                .getWorkspaceContextResolver(context);
-    }
-
-    /**
-     * @return the underlying IFile for my context or null if can't be determined
-     */
-    protected final IFile getFile()
-    {
-        return getFile(getWorkspaceResolver());
-    }
-
-    private IFile getFile(final IWorkspaceContextResolver  resolver)
-    {
-        
-        if (resolver != null)
-        {
-            IResource curRes = resolver.getResource();
-            
-            if (curRes instanceof IFile)
-            {
-                return (IFile) curRes;
-            }
-        }
-        
-        return null;
-        
-    }
-
-    @Override
-    public boolean hasSameResolution(IModelContext modelContext)
-    {
-        if (canResolveContext(modelContext))
-        {
-            return getFile().equals(getFile(getWorkspaceResolver((IStructuredDocumentContext) modelContext)));
-        }
-
-        // if we can't even resolve the context, then we certainly don't have
-        // the same resolution
-        return false;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/resolver/SymbolContextResolverReader.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/resolver/SymbolContextResolverReader.java
deleted file mode 100644
index a193fea..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/resolver/SymbolContextResolverReader.java
+++ /dev/null
@@ -1,68 +0,0 @@
-package org.eclipse.jst.jsf.designtime.resolver;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtension;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-
-/*package*/ class SymbolContextResolverReader
-{
-    private static List<IAdaptable> _handlers = null;
-
-    /**
-     * @return all available handers for the ext-pt.  List is not
-     * modifiable
-     */
-    public static synchronized List<IAdaptable> getAllHandlers() {
-        if (_handlers == null) {
-            _handlers = readAllHandlers();
-        }
-        return Collections.unmodifiableList(_handlers);
-    }
-
-    private static List<IAdaptable> readAllHandlers()
-    {
-        final List<IAdaptable> result = new ArrayList<IAdaptable>();
-        final IExtensionPoint extensionPoint = Platform.getExtensionRegistry()
-                .getExtensionPoint(JSFCorePlugin.PLUGIN_ID,
-                        "symbolContextResolverFactory"); //$NON-NLS-1$
-        final IExtension[] extensions = extensionPoint.getExtensions();
-
-        for (final IExtension ext : extensions)
-        {
-            final IConfigurationElement[] elementEditElement = ext
-                    .getConfigurationElements();
-
-            for (final IConfigurationElement configurationElement : elementEditElement)
-            {
-                final IConfigurationElement element = configurationElement;
-                if (element.getName().equals(
-                        "symbolFactoryDelegate")) //$NON-NLS-1$
-                {
-                    try
-                    {
-                        final IAdaptable factory = (IAdaptable) configurationElement
-                                .createExecutableExtension("class"); //$NON-NLS-1$
-                        if (factory != null)
-                        {
-                            result.add(factory);
-                        }
-                        
-                    } catch (final CoreException e)
-                    {
-                        JSFCorePlugin.log("Problem loading element edit extension for "+element.toString(), e); //$NON-NLS-1$
-                    }
-                }
-            }
-        }
-        return result;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/resolver/package-info.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/resolver/package-info.java
deleted file mode 100644
index 31457bb..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/resolver/package-info.java
+++ /dev/null
@@ -1,16 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-/**
- * Model Context Resolvers for EL symbols.
- */
-package org.eclipse.jst.jsf.designtime.resolver;
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/symbols/AbstractDataModelVariableFactory.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/symbols/AbstractDataModelVariableFactory.java
deleted file mode 100644
index af693a5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/symbols/AbstractDataModelVariableFactory.java
+++ /dev/null
@@ -1,255 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.designtime.symbols;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.Signature;
-import org.eclipse.jst.jsf.common.internal.types.TypeConstants;
-import org.eclipse.jst.jsf.common.internal.types.ValueType;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.jst.jsf.context.symbol.ERuntimeSource;
-import org.eclipse.jst.jsf.context.symbol.ISymbol;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.jsf.validation.internal.appconfig.AppConfigValidationUtil;
-import org.w3c.dom.Element;
-
-/**
- * A framework provided variable factory for EL model objects that are
- * constructed based on DataModel's dervied from an EL expression.
- * 
- * @author cbateman
- * 
- */
-public abstract class AbstractDataModelVariableFactory
-{
-    private final JSFSymbolFactory _symbolFactory = new JSFSymbolFactory();
-
-    /**
-     * @param elText
-     *            The EL expression text. Must not be null
-     * @param elContext
-     *            The document context pointing to elText in the source
-     *            document. Must not be null
-     * @param file
-     *            The workspace resource that contains elText. Must not be null.
-     * @return the value expression resolved from elText or null if it cannot be
-     *         resolved or elText doesn't resolve to value expression (i.e. is a
-     *         method expression)
-     * @deprecated use JSFSymbolFactory.getValueTypeFromEL instead.
-     */
-    public final ValueType createValueExpression(final String elText,
-            final IStructuredDocumentContext elContext, final IFile file)
-    {
-        return getSymbolFactory().getValueTypeFromEL(elText, elContext, file);
-    }
-
-    /**
-     * @return the symbol factory used by this variable factory
-     */
-    public final JSFSymbolFactory getSymbolFactory()
-    {
-        return _symbolFactory;
-    }
-
-    /**
-     * @param symbolName
-     *            The name of the symbol to be created. Must not be null
-     * @param signature
-     *            The type signature of the array type. Must not be null
-     * @param javaProject
-     *            must not be null
-     * @return a symbol based approximating an implicit DataModel wrapper for an
-     *         array
-     * @deprecated use JSFSymbolFactory.createArraySymbol instead
-     */
-    protected final ISymbol createArraySymbol(final String symbolName,
-            final String signature, final IJavaProject javaProject)
-    {
-        return getSymbolFactory().createArraySymbol(symbolName, signature,
-                ERuntimeSource.TAG_INSTANTIATED_SYMBOL_LITERAL, javaProject);
-    }
-
-    /**
-     * Implements default rules for taking an non-array value expression and
-     * resolving it to a ISymbol modelling a JSF DataModel
-     * 
-     * @param symbolName
-     * @param valueType
-     * @param javaProject
-     * @return a symbol where valueType is considered to be the base type upon
-     *         which a data model would be created. This combines the
-     *         possibility that the value expression is either an explicit
-     *         DataModel implementation or a non-DataModel type for which JSF be
-     *         default provides an implicit wrapper model.
-     * 
-     * List is treated as a special case here, since their are two subcases: 1)
-     * the list is a raw type, in which case it must be treated as implicit and
-     * opaque (as to the type of the variable created) 2) the list has Java 5
-     * type argument information that can be used to infer the type of the row
-     * variable
-     */
-    public ISymbol createFromType(String symbolName, ValueType valueType,
-            IJavaProject javaProject)
-    {
-        return internalCreateFromBaseType(symbolName, valueType, javaProject);
-    }
-
-    private ISymbol internalCreateFromBaseType(String symbolName,
-            ValueType valueType, IJavaProject javaProject)
-    {
-        // based on JSF 1.1 spec section 4.2.1.4 the data model
-        // value binding can be one of a number of object that will
-        // get an implicit DataModel wrapper at runtime
-
-        // could be an array
-        if (Signature.getArrayCount(valueType.getSignature()) > 0)
-        {
-            return getSymbolFactory()
-                    .createArraySymbol(symbolName, valueType.getSignature(),
-                            ERuntimeSource.TAG_INSTANTIATED_SYMBOL_LITERAL,
-                            javaProject);
-        }
-
-        // if is a list, then we have extra work to do if it
-        // is generic and has info about its contents
-        if (valueType.isInstanceOf(TypeConstants.TYPE_LIST))
-        {
-            return getSymbolFactory().createFromList(symbolName, valueType, ERuntimeSource.TAG_INSTANTIATED_SYMBOL_LITERAL, null, javaProject);
-        }
-        // if is JSTL ResultSet, java ResultSet or DataModel
-        // return the default symbol -- in the absence of definite
-        // template info, these row containers are opaque to us
-        else if (valueType
-                .isInstanceOf(TypeConstants.TYPE_JAVAX_SERVLET_JSP_JSTL_SQL_RESULT)
-                || valueType.isInstanceOf(TypeConstants.TYPE_RESULT_SET)
-                || valueType.isInstanceOf(TypeConstants.TYPE_DATA_MODEL))
-        {
-            return getSymbolFactory().createDefaultSymbol(symbolName, ERuntimeSource.TAG_INSTANTIATED_SYMBOL_LITERAL, Messages
-                    .getString("AbstractDataModelVariableFactory.DataModel.Symbol.RowVariable.DetailedDescription")); //$NON-NLS-1$
-        }
-
-        // in other cases, we assume that the value is an explicit single row
-        // scalar object
-        return getSymbolFactory().createScalarSymbol(symbolName, valueType.getSignature(),
-                ERuntimeSource.TAG_INSTANTIATED_SYMBOL_LITERAL, javaProject);
-    }
-
-    /**
-     * @param symbolName
-     *            The name of the symbol to create. Must not be null.
-     * @param valueType
-     *            The value expression representing the implicit list. The
-     *            signature on the valueType must be a list. Must not be null.
-     * @param javaProject
-     *            The JavaProject whose classpath will be used to resolve types.
-     *            Must not be null.
-     * 
-     * @return a symbol that approximates as best as possible an implicit
-     *         DataModel for java.util.List value expressions. If the List has
-     *         resolvable Java 5 type arguments, then a scalar symbol will be
-     *         created using this type information. If it is a raw type, then
-     *         createDefaultSymbol() is called
-     * @deprecated use JSFSymbolFactory.createFromList
-     */
-    protected final ISymbol createFromList(String symbolName,
-            ValueType valueType, IJavaProject javaProject)
-    {
-        return getSymbolFactory().createFromList(symbolName, valueType,
-                ERuntimeSource.TAG_INSTANTIATED_SYMBOL_LITERAL, null,
-                javaProject);
-    }
-
-    /**
-     * @param symbolName
-     *            The name of the symbol to create. Must not be null.
-     * @param signature
-     *            The fully resolved type signature of the scalar. Must not be
-     *            null.
-     * @param javaProject
-     *            The JavaProject whose classpath is to be used to resolve type
-     *            information for signture. Must not be null.
-     * @return a symbol approximating a scalar object DataModel wrapper. The row
-     *         variable for the data model becomes of type signature
-     * @deprecated use JSFSymbolFactory.createScalarSymbol instead.
-     */
-    protected final ISymbol createScalarSymbol(final String symbolName,
-            final String signature, final IJavaProject javaProject)
-    {
-        return getSymbolFactory().createScalarSymbol(symbolName, signature,
-                ERuntimeSource.TAG_INSTANTIATED_SYMBOL_LITERAL, javaProject);
-    }
-
-    /**
-     * @param symbolName
-     *            The name of the symbol to create. Must not be null
-     * @return a default symbol that eliminates bogus warnings for this
-     *         dataTable's row variable in cases where something better is
-     *         resolvable. Note that this is not ideal, since will result in any
-     *         property being accepted on the variable with this name.
-     * @deprecated use JSFSymbolFactory.createDefaultSymbol instead.
-     */
-    public final ISymbol createDefaultSymbol(final String symbolName)
-    {
-        return getSymbolFactory()
-                .createDefaultSymbol(
-                        symbolName,
-                        ERuntimeSource.TAG_INSTANTIATED_SYMBOL_LITERAL,
-                        Messages
-                                .getString("AbstractDataModelVariableFactory.DataModel.Symbol.RowVariable.DetailedDescription")); //$NON-NLS-1$
-    }
-
-    /**
-     * @param dataTableElement
-     *            the DOM element that has a "value" attribute. Must not be
-     *            null.
-     * @return the el text from the 'value attribute of a dataTable element or
-     *         null if not found
-     */
-    protected static String getELText(final Element dataTableElement)
-    {
-        assert dataTableElement != null;
-        String attrVal = dataTableElement
-                .getAttribute(IJSFConstants.ATTR_VALUE);
-
-        if (attrVal != null)
-        {
-            return AppConfigValidationUtil.extractELExpression(attrVal)
-                    .getElText();
-        }
-        return null;
-    }
-
-    /**
-     * @return the variable source name. Protects against null in the abstract
-     *         method
-     */
-    protected final String internalGetVariableSourceName()
-    {
-        String variableSourceName = getVariableSourceName();
-
-        if (variableSourceName == null)
-        {
-            JSFCorePlugin.log("Missing variableSourceName", new Throwable()); //$NON-NLS-1$
-            return "**missing variable source name**"; //$NON-NLS-1$
-        }
-
-        return variableSourceName;
-    }
-
-    /**
-     * @return a user displayable name for the source of variables created by
-     *         this factory Must not return null.
-     */
-    protected abstract String getVariableSourceName();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/symbols/DefaultBeanSymbolSourceProvider.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/symbols/DefaultBeanSymbolSourceProvider.java
deleted file mode 100644
index f5f1ee8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/symbols/DefaultBeanSymbolSourceProvider.java
+++ /dev/null
@@ -1,239 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.designtime.symbols;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jst.jsf.context.symbol.ERuntimeSource;
-import org.eclipse.jst.jsf.context.symbol.IBeanInstanceSymbol;
-import org.eclipse.jst.jsf.context.symbol.IJavaTypeDescriptor2;
-import org.eclipse.jst.jsf.context.symbol.ISymbol;
-import org.eclipse.jst.jsf.context.symbol.SymbolFactory;
-import org.eclipse.jst.jsf.context.symbol.source.ISymbolConstants;
-import org.eclipse.jst.jsf.core.jsfappconfig.internal.IJSFAppConfigManager;
-import org.eclipse.jst.jsf.core.jsfappconfig.internal.JSFAppConfigManagerFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.DescriptionType;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanScopeType;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType;
-
-/**
- * Self-factory provider of bean symbol information for a particular project.
- * 
- * Context is determined by querying all known managed beans declared in a 
- * web project.
- * 
- * Client may sub-class
- * 
- * @author cbateman
- *
- */
-public class DefaultBeanSymbolSourceProvider
-{
-    private static DefaultBeanSymbolSourceProvider  INSTANCE;
-
-    /**
-     * @return the singleton instance of the provider
-     */
-    public static DefaultBeanSymbolSourceProvider getInstance()
-    {
-        if (INSTANCE == null)
-        {
-            INSTANCE = new DefaultBeanSymbolSourceProvider();
-        }
-
-        return INSTANCE;
-    }
-
-    /**
-     * No external instantiation
-     * 
-     * Left protected to allow sub-classing
-     */
-    protected DefaultBeanSymbolSourceProvider() {/* empty */}
-    
-    /**
-     * @param context
-     * @param symbolScopeMask
-     * @return all bean symbols for the context at scopes matching symbolScopeMask
-     */
-    public ISymbol[] getSymbols(IAdaptable context, int symbolScopeMask) 
-    {
-        final IFile file = FileContextUtil.deriveIFileFromContext(context);
-        if (file != null)
-        {
-            final IProject  myProject = file.getProject();
-            List  managedBeans = getManagedBeanSymbols(myProject, symbolScopeMask);
-            return (ISymbol[]) managedBeans.toArray(ISymbol.EMPTY_SYMBOL_ARRAY);
-        }
-        
-        return ISymbol.EMPTY_SYMBOL_ARRAY;
-    }
-
-    /**
-     * @param name
-     * @param context
-     * @param symbolScopeMask
-     * @return the symbol called name, in context/symbolScope
-     */
-    public ISymbol getSymbol(final String name, final IAdaptable context, 
-                             final int symbolScopeMask)
-    {
-        return SymbolUtil.
-                findSymbolByName(getSymbols(context, symbolScopeMask), name);
-    }
-    
-    /**
-     * @param prefix
-     * @param context
-     * @param symbolScopeMask
-     * @return all symbols for context and symbolScopeMask that start with
-     * prefix
-     */
-    public ISymbol[] getSymbols(String prefix, IAdaptable context,
-            int symbolScopeMask) {
-        return SymbolUtil.
-            filterSymbolsByPrefix(getSymbols(context, symbolScopeMask), prefix);
-    }
-
-    private List getManagedBeanSymbols(IProject iProject, int symbolScopeMask)
-    {
-        List   symbols = new ArrayList();
-        
-        final IJSFAppConfigManager  configManager = JSFAppConfigManagerFactory.getJSFAppConfigManagerInstance(iProject);
-        
-
-        if (configManager != null)
-        {
-            for (final Iterator aIt = configManager.getManagedBeans().iterator(); aIt.hasNext();)
-            {
-                ManagedBeanType  bean = (ManagedBeanType) aIt.next();
-                
-                // only bother with all this if we care about the scope of this bean
-                if (isBeanScopeInMask(bean.getManagedBeanScope(), symbolScopeMask))
-                {
-                    final String name = bean.getManagedBeanName().getTextContent();
-                    final String detailedDescription = createAdditionalProposalInfo(bean);
-                    final IBeanInstanceSymbol symbol = SymbolFactory.eINSTANCE.createIBeanInstanceSymbol();
-                    symbol.setName(name);
-                    if (detailedDescription.length() > 0)
-                    symbol.setDetailedDescription(detailedDescription);
-                    symbol.setRuntimeSource(ERuntimeSource.MANAGED_BEAN_SYMBOL_LITERAL);
-                    try
-                    {
-                        IJavaProject javaProject = JavaCore.create(iProject);
-                        final String typeName = bean.getManagedBeanClass() != null?
-                            bean.getManagedBeanClass().getTextContent() : ""; //$NON-NLS-1$
-                        final IType type = javaProject.findType(typeName);
-
-                        // don't bother setting a type descriptor if we
-                        // can't find a type
-                        if (type != null)
-                        {
-                            IJavaTypeDescriptor2 javaTypeDescriptor = 
-                                SymbolFactory.eINSTANCE.createIJavaTypeDescriptor2();
-                            javaTypeDescriptor.setType(type);
-                            symbol.setJavaTypeDescriptor(javaTypeDescriptor);
-                        }
-                    }
-                    catch (JavaModelException t)
-                    {
-                        // do nothing; skip type info for this bean
-                    }
-                    symbols.add(symbol);
-                }
-            }
-        }
-            
-        return symbols;
-    }
-    
-    private String createAdditionalProposalInfo(ManagedBeanType beanType)
-    {
-        final String beanName = beanType.getManagedBeanName() != null ?
-                                    beanType.getManagedBeanName().getTextContent() : null;
-
-        StringBuffer additionalInfo = new StringBuffer();
-        if (beanName != null)
-        {
-            additionalInfo.append("<p><b>"+Messages.getString("DefaultBeanSymbolSourceProvider.AdditionalInformation.Name")); //$NON-NLS-1$ //$NON-NLS-2$
-            additionalInfo.append(" </b>"); //$NON-NLS-1$
-            additionalInfo.append(beanName);
-            additionalInfo.append("</p>"); //$NON-NLS-1$
-        }
-
-        final String beanClass = beanType.getManagedBeanClass() != null ?
-                beanType.getManagedBeanClass().getTextContent() : null;
-        if (beanClass != null)
-        {
-            additionalInfo.append("<p><b>"+Messages.getString("DefaultBeanSymbolSourceProvider.AdditionalInformation.Type")); //$NON-NLS-1$ //$NON-NLS-2$
-            additionalInfo.append(" </b>"); //$NON-NLS-1$
-            additionalInfo.append(beanClass);
-            additionalInfo.append("</p>"); //$NON-NLS-1$
-        }
-        
-        final String beanScope = beanType.getManagedBeanScope() != null ?
-                beanType.getManagedBeanScope().getTextContent() : null;
-        if (beanScope != null)
-        {
-            additionalInfo.append("<p><b>"+Messages.getString("DefaultBeanSymbolSourceProvider.AdditionalInformation.Scope")); //$NON-NLS-1$ //$NON-NLS-2$
-            additionalInfo.append(" </b>"); //$NON-NLS-1$
-            additionalInfo.append(beanScope);
-            additionalInfo.append("</p>"); //$NON-NLS-1$
-        }
-        StringBuffer descBuffer = new StringBuffer();
-        
-        for (final Iterator it = beanType.getDescription().iterator(); it.hasNext();)
-        {
-            final DescriptionType descType = (DescriptionType) it.next();
-            final String appendString = descType.getTextContent();
-            if (appendString != null)
-            {
-                descBuffer.append(appendString);
-            }
-        }
-        
-        if (descBuffer.length() > 0)
-        {
-            additionalInfo.append("<p><b>"); //$NON-NLS-1$
-            additionalInfo.append(Messages.getString("DefaultBeanSymbolSourceProvider.AdditionalInformation.Description")); //$NON-NLS-1$
-            additionalInfo.append("</b>"); //$NON-NLS-1$
-            additionalInfo.append(descBuffer);
-            additionalInfo.append("</p>"); //$NON-NLS-1$
-        }
-        
-        return additionalInfo.toString();
-    }
-
-   
-    private boolean isBeanScopeInMask(final ManagedBeanScopeType scope, final int scopeMask)
-    {
-        final int testScope = ISymbolConstants.getMaskForString(scope.getTextContent());
-        
-        if (testScope != -1)
-        {
-            return (scopeMask & testScope) != 0;
-        }
-        
-        // no other cases supported
-        return false;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/symbols/DefaultBuiltInSymbolProvider.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/symbols/DefaultBuiltInSymbolProvider.java
deleted file mode 100644
index b3740fc..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/symbols/DefaultBuiltInSymbolProvider.java
+++ /dev/null
@@ -1,414 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- * 
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.designtime.symbols;
-
-import java.util.AbstractMap;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jst.jsf.context.symbol.ERuntimeSource;
-import org.eclipse.jst.jsf.context.symbol.IInstanceSymbol;
-import org.eclipse.jst.jsf.context.symbol.IMapTypeDescriptor;
-import org.eclipse.jst.jsf.context.symbol.ISymbol;
-import org.eclipse.jst.jsf.context.symbol.SymbolFactory;
-import org.eclipse.jst.jsf.context.symbol.source.ISymbolConstants;
-import org.eclipse.jst.jsf.core.JSFVersion;
-import org.eclipse.jst.jsf.designtime.DesignTimeApplicationManager;
-import org.eclipse.jst.jsf.designtime.context.IDTExternalContext;
-import org.eclipse.jst.jsf.designtime.internal.view.DTUIViewRoot;
-
-/**
- * Provides the default built-in JSF symbols
- * 
- * Clients may sub-class
- * 
- * @author cbateman
- * 
- */
-public class DefaultBuiltInSymbolProvider
-{
-    private static DefaultBuiltInSymbolProvider INSTANCE;
-    private static final JSFSymbolFactory    _symbolFactory;
-
-    /**
-     * @return the singleton instance
-     */
-    public synchronized static DefaultBuiltInSymbolProvider getInstance()
-    {
-        if (INSTANCE == null)
-        {
-            INSTANCE = new DefaultBuiltInSymbolProvider();
-        }
-
-        return INSTANCE;
-    }
-
-    private static final String APPLICATION_SCOPE                   = "applicationScope";                //$NON-NLS-1$
-    private static final String SESSION_SCOPE                       = "sessionScope";                    //$NON-NLS-1$
-    private static final String REQUEST_SCOPE                       = "requestScope";                    //$NON-NLS-1$
-    private static final String COOKIE_IMPLICIT_OBJ                 = "cookie";                          //$NON-NLS-1$
-    private static final String FACES_CONTEXT_IMPLICIT_OBJ          = "facesContext";                    //$NON-NLS-1$
-    private static final String HEADER_IMPLICIT_OBJ                 = "header";                          //$NON-NLS-1$
-    private static final String HEADER_VALUES_IMPLICIT_OBJ          = "headerValues";                    //$NON-NLS-1$
-    private static final String INIT_PARAM_IMPLICIT_OBJ             = "initParam";                       //$NON-NLS-1$
-    private static final String PARAM_IMPLICIT_OBJ                  = "param";                           //$NON-NLS-1$
-    private static final String PARAM_VALUES_IMPLICIT_OBJ           = "paramValues";                     //$NON-NLS-1$
-    private static final String VIEW_IMPLICIT_OBJ                   = "view";                            //$NON-NLS-1$
-
-    private static final String FACES_CONTEXT_FULLY_QUALIFIED_CLASS = "javax.faces.context.FacesContext"; //$NON-NLS-1$
-    private static final String VIEW_FULLY_QUALIFIED_CLASS          = "javax.faces.component.UIViewRoot"; //$NON-NLS-1$
-    
-    private static final ISymbol SYMBOL_COOKIE_IMPLICIT_OBJ;
-    private static final ISymbol SYMBOL_HEADER_IMPLICIT_OBJ;
-    private static final ISymbol SYMBOL_HEADER_VALUES_IMPLICIT_OBJ;
-    private static final ISymbol SYMBOL_PARAM_IMPLICIT_OBJ;
-    private static final ISymbol SYMBOL_PARAM_VALUES_IMPLICIT_OBJ;
-    private static final ISymbol SYMBOL_INIT_PARAM_IMPLICIT_OBJ;
-    
-    //JSF2.0
-    private static final String VIEW_SCOPE                   		= "viewScope";                		//$NON-NLS-1$
-    private static final String FLASH_SCOPE                   		= "flash";                			//$NON-NLS-1$
-    private static final String CC_IMPLICIT_OBJ                		= "cc";      						//$NON-NLS-1$
-    private static final String COMPONENT_IMPLICIT_OBJ              = "component";     					//$NON-NLS-1$
-    private static final String RESOURCE_IMPLICIT_OBJ               = "resource";      					//$NON-NLS-1$
-    
-    private static final String UICOMPONENT_FULLY_QUALIFIED_CLASS   	= "javax.faces.component.UIComponent";//$NON-NLS-1$
-    
-    static
-    {
-        _symbolFactory = new JSFSymbolFactory();
-        // invariant request scope variables
-        SYMBOL_COOKIE_IMPLICIT_OBJ = _symbolFactory.createUnknownInstanceSymbol(COOKIE_IMPLICIT_OBJ, ERuntimeSource.BUILT_IN_SYMBOL_LITERAL);
-        SYMBOL_HEADER_IMPLICIT_OBJ = _symbolFactory.createUnknownInstanceSymbol(HEADER_IMPLICIT_OBJ, ERuntimeSource.BUILT_IN_SYMBOL_LITERAL);
-        SYMBOL_HEADER_VALUES_IMPLICIT_OBJ = _symbolFactory.createUnknownInstanceSymbol(HEADER_VALUES_IMPLICIT_OBJ, ERuntimeSource.BUILT_IN_SYMBOL_LITERAL);
-        SYMBOL_PARAM_IMPLICIT_OBJ = _symbolFactory.createUnknownInstanceSymbol(PARAM_IMPLICIT_OBJ, ERuntimeSource.BUILT_IN_SYMBOL_LITERAL);
-        SYMBOL_PARAM_VALUES_IMPLICIT_OBJ = _symbolFactory.createUnknownInstanceSymbol(PARAM_VALUES_IMPLICIT_OBJ, ERuntimeSource.BUILT_IN_SYMBOL_LITERAL); 
-        
-        // invariant application scope variables
-        SYMBOL_INIT_PARAM_IMPLICIT_OBJ = _symbolFactory.createUnknownInstanceSymbol(INIT_PARAM_IMPLICIT_OBJ, ERuntimeSource.BUILT_IN_SYMBOL_LITERAL);
-    }
-    
-
-    /**
-     * No direct instantiation -- use getInstance
-     * 
-     * Made protected to allow sub-classing
-     */
-    protected DefaultBuiltInSymbolProvider()
-    {
-        // nothing to do.
-    }
-
-    /**
-     * @param context
-     * @param symbolScopeMask
-     * @return all symbols for context in scopes matching symbolScopeMask
-     */
-    public ISymbol[] getSymbols(final IAdaptable context,
-            final int symbolScopeMask)
-    {
-        final IFile fileContext = FileContextUtil
-                .deriveIFileFromContext(context);
-        return (ISymbol[]) getSymbolsForScope(fileContext, symbolScopeMask)
-                .toArray(ISymbol.EMPTY_SYMBOL_ARRAY);
-    }
-
-    /**
-     * @param name
-     * @param context
-     * @param symbolScopeMask
-     * @return the symbol in context matching name or null if not found
-     */
-    public ISymbol getSymbol(final String name, final IAdaptable context,
-            final int symbolScopeMask)
-    {
-        final IFile file = FileContextUtil.deriveIFileFromContext(context);
-
-        ISymbol symbol = null;
-        if ((symbolScopeMask & ISymbolConstants.SYMBOL_SCOPE_REQUEST) != 0)
-        {
-            symbol = getRequestScopeSymbols(file).get(name);
-        }
-        if ((symbolScopeMask & ISymbolConstants.SYMBOL_SCOPE_SESSION) != 0
-                && symbol == null)
-        {
-            symbol = getSessionScopeSymbols(file).get(name);
-        }
-        if ((symbolScopeMask & ISymbolConstants.SYMBOL_SCOPE_APPLICATION) != 0
-                && symbol == null)
-        {
-            symbol = getApplicationScopeSymbols(file).get(name);
-        }
-        if ((symbolScopeMask & ISymbolConstants.SYMBOL_SCOPE_VIEW) != 0
-                && symbol == null)
-        {
-            symbol = getViewScopeSymbols(file).get(name);
-        }
-        if ((symbolScopeMask & ISymbolConstants.SYMBOL_SCOPE_FLASH) != 0
-                && symbol == null)
-        {
-            symbol = getFlashScopeSymbols(file).get(name);
-        }
-        
-
-        return symbol;
-    }
-
-    /**
-     * @param prefix
-     * @param context
-     * @param symbolScopeMask
-     * @return all implicit symbols for context starting with prefix in scopes
-     *         matching symbolScopeMask
-     */
-    public ISymbol[] getSymbols(final String prefix, final IAdaptable context,
-            final int symbolScopeMask)
-    {
-        final IFile file = FileContextUtil.deriveIFileFromContext(context);
-
-        final List<ISymbol> symbols = new ArrayList<ISymbol>();
-        if ((symbolScopeMask & ISymbolConstants.SYMBOL_SCOPE_REQUEST) != 0)
-        {
-            symbols.addAll(getRequestScopeSymbols(file).values());
-        }
-        if ((symbolScopeMask & ISymbolConstants.SYMBOL_SCOPE_SESSION) != 0)
-        {
-            symbols.addAll(getSessionScopeSymbols(file).values());
-        }
-        if ((symbolScopeMask & ISymbolConstants.SYMBOL_SCOPE_APPLICATION) != 0)
-        {
-            symbols.addAll(getApplicationScopeSymbols(file).values());
-        }
-        if ((symbolScopeMask & ISymbolConstants.SYMBOL_SCOPE_VIEW) != 0)
-        {
-        	 symbols.addAll(getViewScopeSymbols(file).values());
-        }     
-        if ((symbolScopeMask & ISymbolConstants.SYMBOL_SCOPE_FLASH) != 0)
-        {
-        	 symbols.addAll(getFlashScopeSymbols(file).values());
-        }         
-        return symbols.toArray(ISymbol.EMPTY_SYMBOL_ARRAY);
-    }
-
-    private List getSymbolsForScope(final IFile file, final int symbolScopeMask)
-    {
-        final List symbols = new ArrayList();
-        if ((symbolScopeMask & ISymbolConstants.SYMBOL_SCOPE_REQUEST) != 0)
-        {
-            symbols.addAll(getRequestScopeSymbols(file).values());
-        }
-        if ((symbolScopeMask & ISymbolConstants.SYMBOL_SCOPE_SESSION) != 0)
-        {
-            symbols.addAll(getSessionScopeSymbols(file).values());
-        }
-        if ((symbolScopeMask & ISymbolConstants.SYMBOL_SCOPE_APPLICATION) != 0)
-        {
-            symbols.addAll(getApplicationScopeSymbols(file).values());
-        }
-        if ((symbolScopeMask & ISymbolConstants.SYMBOL_SCOPE_VIEW) != 0)
-        {
-            symbols.addAll(getViewScopeSymbols(file).values());
-        }
-        if ((symbolScopeMask & ISymbolConstants.SYMBOL_SCOPE_FLASH) != 0)
-        {
-            symbols.addAll(getFlashScopeSymbols(file).values());
-        }
-
-        return symbols;
-    }
-
-    private Map<String, ISymbol> getRequestScopeSymbols(final IFile file)
-    {
-        final Map<String, ISymbol> requestSymbols = new HashMap<String, ISymbol>();
-
-        ISymbol symbol = createScopeSymbol(file,
-                ISymbolConstants.SYMBOL_SCOPE_REQUEST, REQUEST_SCOPE);
-        requestSymbols.put(symbol.getName(), symbol);
-        
-        requestSymbols.put(SYMBOL_COOKIE_IMPLICIT_OBJ.getName(), SYMBOL_COOKIE_IMPLICIT_OBJ);
-        requestSymbols.put(SYMBOL_HEADER_IMPLICIT_OBJ.getName(), SYMBOL_HEADER_IMPLICIT_OBJ);
-        requestSymbols.put(SYMBOL_HEADER_VALUES_IMPLICIT_OBJ.getName(), SYMBOL_HEADER_VALUES_IMPLICIT_OBJ);
-        requestSymbols.put(SYMBOL_PARAM_IMPLICIT_OBJ.getName(), SYMBOL_PARAM_IMPLICIT_OBJ);
-        requestSymbols.put(SYMBOL_PARAM_VALUES_IMPLICIT_OBJ.getName(), SYMBOL_PARAM_VALUES_IMPLICIT_OBJ);
-
-        // TODO: these aren't maps; need to find way to handle
-        symbol = _symbolFactory.createBeanOrUnknownInstanceSymbol(file
-                .getProject(), FACES_CONTEXT_FULLY_QUALIFIED_CLASS,
-                FACES_CONTEXT_IMPLICIT_OBJ,
-                ERuntimeSource.BUILT_IN_SYMBOL_LITERAL);
-        requestSymbols.put(symbol.getName(), symbol);
-
-        symbol = _symbolFactory.createBeanOrUnknownInstanceSymbol(file
-                .getProject(), VIEW_FULLY_QUALIFIED_CLASS, VIEW_IMPLICIT_OBJ,
-                ERuntimeSource.BUILT_IN_SYMBOL_LITERAL);
-        requestSymbols.put(symbol.getName(), symbol);
-        
-        //add jsf2.0 implicits
-        if (JSFVersion.valueOfProject(file.getProject()).compareTo(JSFVersion.V2_0) >=0) {
-        	symbol = _symbolFactory.createBeanOrUnknownInstanceSymbol(file
-                    .getProject(), UICOMPONENT_FULLY_QUALIFIED_CLASS,
-                    CC_IMPLICIT_OBJ,
-                    ERuntimeSource.BUILT_IN_SYMBOL_LITERAL);
-            requestSymbols.put(symbol.getName(), symbol);
-            
-
-//            _symbolFactory.createJavaComponentSymbol(CC_IMPLICIT_OBJ, typeDesc, ""); //$NON-NLS-1$
-        	symbol = _symbolFactory.createBeanOrUnknownInstanceSymbol(file
-                    .getProject(), UICOMPONENT_FULLY_QUALIFIED_CLASS,
-                    COMPONENT_IMPLICIT_OBJ,
-                    ERuntimeSource.BUILT_IN_SYMBOL_LITERAL);
-            requestSymbols.put(symbol.getName(), symbol);
-                       
-        }
-        
-        return Collections.unmodifiableMap(requestSymbols);
-    }
-
-    private Map<String,ISymbol> getSessionScopeSymbols(final IFile file)
-    {
-        ISymbol symbol = createScopeSymbol(file,
-                ISymbolConstants.SYMBOL_SCOPE_SESSION, SESSION_SCOPE);
-
-        return Collections.unmodifiableMap
-            (Collections.singletonMap(symbol.getName(), symbol));
-    }
-
-    private Map<String,ISymbol> getApplicationScopeSymbols(final IFile file)
-    {
-        final Map<String,ISymbol> symbols = new HashMap<String, ISymbol>();
-
-        // TODO: may be able to resolve this one based on web.xml
-        symbols.put(SYMBOL_INIT_PARAM_IMPLICIT_OBJ.getName(), SYMBOL_INIT_PARAM_IMPLICIT_OBJ);
-        
-        ISymbol symbol = createScopeSymbol(file,
-                ISymbolConstants.SYMBOL_SCOPE_APPLICATION, APPLICATION_SCOPE);
-        symbols.put(symbol.getName(), symbol);
-        
-        //add jsf2.0 implicits
-        if (JSFVersion.valueOfProject(file.getProject()).compareTo(JSFVersion.V2_0) >=0) {        	
-        	symbol = _symbolFactory.createUnknownInstanceSymbol(
-                    RESOURCE_IMPLICIT_OBJ,
-                    ERuntimeSource.BUILT_IN_SYMBOL_LITERAL);
-        	symbols.put(symbol.getName(), symbol);
-        }
-        
-        return Collections.unmodifiableMap(symbols);
-    }
-    
-    private Map<String,ISymbol> getViewScopeSymbols(final IFile file)
-    {
-    	if(JSFVersion.valueOfProject(file.getProject()).compareTo(JSFVersion.V2_0) >= 0) { 
-	    	
-	        ISymbol symbol = createScopeSymbol(file,
-	                ISymbolConstants.SYMBOL_SCOPE_VIEW, VIEW_SCOPE);
-	
-	        return Collections.unmodifiableMap
-	            (Collections.singletonMap(symbol.getName(), symbol));
-    	}
-    	return Collections.emptyMap();
-    }
-
-    private Map<String,ISymbol> getFlashScopeSymbols(final IFile file)
-    {
-    	if(JSFVersion.valueOfProject(file.getProject()).compareTo(JSFVersion.V2_0) >= 0) { 
-	    	
-	        ISymbol symbol = createScopeSymbol(file,
-	                ISymbolConstants.SYMBOL_SCOPE_FLASH, FLASH_SCOPE);
-	
-	        return Collections.unmodifiableMap
-	            (Collections.singletonMap(symbol.getName(), symbol));
-    	}
-    	return Collections.emptyMap();
-    }
-    
-    private ISymbol createScopeSymbol(final IFile file, final int scopeMask,
-            final String name)
-    {
-        final Map mapSource = new ScopeMap(file, scopeMask);
-        final IMapTypeDescriptor typeDesc = SymbolFactory.eINSTANCE
-                .createIBoundedMapTypeDescriptor();
-        typeDesc.setMapSource(mapSource);
-        typeDesc.setImmutable(false); // scope maps are mutable
-        final IInstanceSymbol symbol = SymbolFactory.eINSTANCE
-                .createIInstanceSymbol();
-        symbol.setName(name);
-        symbol.setRuntimeSource(ERuntimeSource.BUILT_IN_SYMBOL_LITERAL);
-        symbol.setTypeDescriptor(typeDesc);
-        // TODO:symbol.setDetailedDescription("A Map of the application scope
-        // attribute values, keyed by attribute name");
-
-        return symbol;
-    }
-
-    private static class ScopeMap extends AbstractMap
-    {
-        private final IFile _externalContextKey;
-        private final int   _scopeMask;
-
-        ScopeMap(final IFile externalContextKey, final int scopeMask)
-        {
-            _externalContextKey = externalContextKey;
-            _scopeMask = scopeMask;
-        }
-
-        @Override
-        public Set entrySet()
-        {
-            final Map scopeMap = new HashMap();
-            // do beans first so in case of name collision, beans are hidden
-            final DefaultBeanSymbolSourceProvider beanProvider = DefaultBeanSymbolSourceProvider
-                    .getInstance();
-
-            final ISymbol beanSymbols[] = beanProvider.getSymbols(
-                    _externalContextKey, _scopeMask);
-
-            for (final ISymbol beanSymbol : beanSymbols)
-            {
-                scopeMap.put(beanSymbol.getName(), beanSymbol);
-            }
-
-            final DesignTimeApplicationManager manager = DesignTimeApplicationManager
-                    .getInstance(_externalContextKey.getProject());
-
-            if (manager != null)
-            {
-
-                final IDTExternalContext externalContext = manager
-                        .getFacesContext(_externalContextKey)
-                        .getDTExternalContext(_externalContextKey);
-
-                scopeMap.putAll(externalContext.getMapForScope(_scopeMask));
-                
-                DTUIViewRoot viewRoot = manager
-                	.getFacesContext(_externalContextKey)
-                	.getViewRootHandle().getCachedViewRoot();
-
-                if (viewRoot == null) {
-                	viewRoot = manager
-                	.getFacesContext(_externalContextKey)
-                	.getViewRootHandle().updateViewRoot();
-                }
-                scopeMap.putAll(viewRoot.getViewMap());
-            }
-
-            return scopeMap.entrySet();
-
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/symbols/DefaultDataTableSymbolFactory.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/symbols/DefaultDataTableSymbolFactory.java
deleted file mode 100644
index 54111fe..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/symbols/DefaultDataTableSymbolFactory.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- * 
- ********************************************************************************/
-package org.eclipse.jst.jsf.designtime.symbols;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jst.jsf.common.internal.types.ValueType;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContextFactory;
-import org.eclipse.jst.jsf.context.symbol.ERuntimeSource;
-import org.eclipse.jst.jsf.context.symbol.ISymbol;
-import org.w3c.dom.Element;
-
-/**
- * The default factory for creating DataModel symbols based on an value
- * expression in a dataTable.
- * 
- * Clients may sub-class.
- * 
- * @author cbateman
- * 
- */
-public class DefaultDataTableSymbolFactory
-{
-    private final AbstractDataModelVariableFactory _dataModelSymbolFactory;
-
-    /**
-     * @param dataModelSymbolFactory
-     */
-    public DefaultDataTableSymbolFactory(
-            final AbstractDataModelVariableFactory dataModelSymbolFactory)
-    {
-        assert dataModelSymbolFactory != null;
-        _dataModelSymbolFactory = dataModelSymbolFactory;
-    }
-
-    /**
-     * @param symbolName
-     *            the name of the symbol to be created. Must not be null.
-     * @param dataTableElement
-     *            the DOM element representing the dataTable tag.
-     * @param context
-     *            the document context pointing to dataTableElement
-     * @return a symbol named symbolName based on the variable declared by
-     *         dataTableElement
-     */
-    public ISymbol createSymbolForDataTableValue(final String symbolName,
-            final Element dataTableElement,
-            final IStructuredDocumentContext context)
-    {
-        final String elText = AbstractDataModelVariableFactory
-        .getELText(dataTableElement);
-        final IFile file = FileContextUtil.deriveIFileFromContext(context);
-
-        if (elText != null && file != null)
-        {
-            final IStructuredDocumentContext elContext = IStructuredDocumentContextFactory.INSTANCE
-                .getContext(context.getStructuredDocument(),
-                    dataTableElement.getAttributeNode("value")); //$NON-NLS-1$
-
-            final IJavaProject javaProject = JavaCore.create(file.getProject());
-
-            final ValueType valueExpr = new JSFSymbolFactory()
-                    .getValueTypeFromEL(elText, elContext, file);
-
-            if (valueExpr != null)
-            {
-                // otherwise, we have to try to resolve the base type and see
-                // if it's an instanceof any of the supported implicit or
-                // explict types
-                return _dataModelSymbolFactory.createFromType(symbolName,
-                        valueExpr, javaProject);
-            }
-        }
-
-        // by default create a default
-        return _dataModelSymbolFactory.getSymbolFactory().createDefaultSymbol(
-                symbolName, ERuntimeSource.TAG_INSTANTIATED_SYMBOL_LITERAL,
-                null);
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/symbols/FileContextUtil.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/symbols/FileContextUtil.java
deleted file mode 100644
index 30e9e7b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/symbols/FileContextUtil.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.designtime.symbols;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IStructuredDocumentContextResolverFactory;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IWorkspaceContextResolver;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-
-/**
- * Utility for deriving an IFile from an IAdaptable
- * 
- * @author cbateman
- *
- */
-public final class FileContextUtil 
-{
-    /**
-     * @param context
-     * @return an IFile derived from context or null if not derivable
-     */
-    public static IFile deriveIFileFromContext(IAdaptable context)
-    {
-        // 
-        if (context instanceof IFile)
-        {
-            return (IFile) context;
-        }
-        else if (context.getAdapter(IFile.class) != null)
-        {
-            return (IFile) context.getAdapter(IFile.class);
-        }
-        else if (context instanceof IStructuredDocumentContext)
-        {
-            return deriveIFileFromContext((IStructuredDocumentContext)context);
-        }
-        else
-        {
-            IStructuredDocumentContext  sdContext = 
-                (IStructuredDocumentContext) context.getAdapter(IStructuredDocumentContext.class);
-            
-            if (sdContext != null)
-            {
-                return deriveIFileFromContext(sdContext);
-            }
-        }
- 
-        return null;
-    }
-    
-    private static IFile deriveIFileFromContext(IStructuredDocumentContext context)
-    {
-        IWorkspaceContextResolver resolver = 
-            IStructuredDocumentContextResolverFactory.
-                INSTANCE.
-                    getWorkspaceContextResolver(context);
-        
-        if (resolver != null)
-        {
-            IResource res = resolver.getResource();
-            
-            if (res instanceof IFile)
-            {
-                return (IFile) res;
-            }
-        }
-        
-        return null;
-    }
-    
-    /**
-     * Convenience method for getting the IProject for a document context.
-     * 
-     * @param context
-     * @return the project associated with context or null if can't be derived
-     */
-    public static IProject getProject(final IStructuredDocumentContext context)
-    {
-        final IWorkspaceContextResolver wkResolver = IStructuredDocumentContextResolverFactory.INSTANCE
-                .getWorkspaceContextResolver(context);
-
-        if (wkResolver != null)
-        {
-            return wkResolver.getProject();
-        }
-        return null;
-    }
-
-    private FileContextUtil()
-    {
-        // no instantiation
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/symbols/JSFSymbolFactory.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/symbols/JSFSymbolFactory.java
deleted file mode 100644
index 55c9309..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/symbols/JSFSymbolFactory.java
+++ /dev/null
@@ -1,420 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Matthias Fuessel -- extracted from https://bugs.eclipse.org/bugs/show_bug.cgi?id=215461
- *    Cameron Bateman/Oracle - integrated and moved data table code here.
- * 
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.designtime.symbols;
-
-import java.util.Arrays;
-import java.util.HashMap;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.emf.common.util.ECollections;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.Signature;
-import org.eclipse.jst.jsf.common.internal.types.TypeConstants;
-import org.eclipse.jst.jsf.common.internal.types.ValueType;
-import org.eclipse.jst.jsf.common.util.TypeUtil;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.jst.jsf.context.symbol.ERuntimeSource;
-import org.eclipse.jst.jsf.context.symbol.IBeanInstanceSymbol;
-import org.eclipse.jst.jsf.context.symbol.IComponentSymbol;
-import org.eclipse.jst.jsf.context.symbol.IInstanceSymbol;
-import org.eclipse.jst.jsf.context.symbol.IJavaTypeDescriptor2;
-import org.eclipse.jst.jsf.context.symbol.IMapTypeDescriptor;
-import org.eclipse.jst.jsf.context.symbol.IObjectSymbol;
-import org.eclipse.jst.jsf.context.symbol.ISymbol;
-import org.eclipse.jst.jsf.context.symbol.InitializedSymbolFactory;
-import org.eclipse.jst.jsf.context.symbol.SymbolFactory;
-import org.eclipse.jst.jsf.context.symbol.internal.util.IObjectSymbolBasedValueType;
-import org.eclipse.jst.jsf.designtime.resolver.IStructuredDocumentSymbolResolverFactory;
-import org.eclipse.jst.jsf.designtime.resolver.StructuredDocumentSymbolResolverFactory;
-import org.eclipse.jst.jsf.validation.internal.IJSFViewValidator.IValidationReporter;
-import org.eclipse.jst.jsf.validation.internal.IJSFViewValidator.ReporterAdapter;
-import org.eclipse.jst.jsf.validation.internal.el.ELExpressionValidator;
-import org.eclipse.jst.jsf.validation.internal.el.IExpressionSemanticValidator;
-
-/**
- * Factory for creating symbols for variables/message bundles that are
- * contributed by components/tags. This Factory can be used by descendants of
- * {@link org.eclipse.jst.jsf.context.symbol.source.AbstractContextSymbolFactory} in order to create the symbols they want
- * to contribute.
- * 
- * It provides also methods for getting the resulting {@link ValueType} from an
- * EL expression and the "row" type signature from an DataModel/Array/List
- * {@link ValueType}.
- * 
- * NOTE: C.B March 26, 2008 -- commented out portions are left for the future
- * because the rely on enhancements to the symbol model that could not be made
- * in the current release.  Other portions of the original ComponentSymbolFactory
- * have been moved to {@link org.eclipse.jst.jsf.context.symbol.InitializedSymbolFactory}
- * This reflects the split between things deemed to be generic EL (put in common
- * plugin) and things deemed to be JSF-specific (put here).
- * 
- */
-public final class JSFSymbolFactory extends InitializedSymbolFactory
-{
-    /**
-     * @param elText The EL expression text. Must not be null
-     * @param elContext The document context pointing to elText in the source document. Must not be null
-     * @param file The workspace resource that contains elText. Must not be null.
-     * @param symbolResolverFactory 
-    * @return the value expression resolved from elText or null if it cannot
-     * be resolved or elText doesn't resolve to value expression (i.e. is a method expression)
-      */
-    public ValueType getValueTypeFromEL(final String elText,
-            final IStructuredDocumentContext elContext, final IFile file, IStructuredDocumentSymbolResolverFactory symbolResolverFactory)
-    {
-        assert elText != null;
-        assert elContext != null;
-        assert file != null;
-
-        // TODO investigate if infinite recursion; use ASTResolver instead??
-        final IValidationReporter  reporter = new ReporterAdapter();
-        final ELExpressionValidator validator = 
-            new ELExpressionValidator(
-                elContext, elText, symbolResolverFactory, reporter);
-        validator.validateXMLNode();
-        final IExpressionSemanticValidator semValidator = validator
-                .getSemanticValidator();
-        if (semValidator != null
-                && semValidator.getExpressionType() instanceof ValueType)
-        {
-            return (ValueType) semValidator.getExpressionType();
-        }
-        return null;
-    }
-
-    /**
-     * Convenience for {@link JSFSymbolFactory#getValueTypeFromEL(String, IStructuredDocumentContext, IFile, IStructuredDocumentSymbolResolverFactory)}
-     * using StructuredDocumentSymbolResolverFactory.getInstance().
-     * 
-     * @param elText
-     * @param elContext
-     * @param file
-     * @return a ValueType or null
-     */
-    public ValueType getValueTypeFromEL(final String elText,
-            final IStructuredDocumentContext elContext, final IFile file)
-    {
-        return getValueTypeFromEL(elText, elContext, file, StructuredDocumentSymbolResolverFactory.getInstance());
-    }
-
-    /**
-     * @param type
-     * @return <code>true</code>, if the given {@link ValueType} represents
-     *         an instance of <code>javax.faces.model.DataModel</code>
-     */
-    private boolean isFacesDataModel(ValueType type)
-    {
-        return type.isInstanceOf(TypeConstants.TYPE_DATA_MODEL);
-    }
-
-    /**
-     * Tries to guess the row type of a <code>javax.faces.DataModel</code>
-     * instance. This will only work if <code>type</code> is a descendant that
-     * narrows down the return type of "getRowData()".
-     * 
-     * @param type
-     * @return the row type of the given DataModel. Will return
-     *         <code>null</code> if <code>type</code> is no DataModel or if
-     *         nothing more specific than <code>Object</code> can be
-     *         determined
-     */
-    public String getRowSignatureFromDataModel(ValueType type)
-    {
-        if (type instanceof IObjectSymbolBasedValueType)
-        {
-            ISymbol resSymbol = ((IObjectSymbolBasedValueType) type)
-                    .getSymbol().call(
-                            "getRowData", ECollections.emptyEList(), "res"); //$NON-NLS-1$ //$NON-NLS-2$
-            if (resSymbol != null && resSymbol instanceof IObjectSymbol)
-            {
-                // TODO full signature
-                final String signature = ((IObjectSymbol) resSymbol)
-                        .getTypeDescriptor().getTypeSignature();
-                if (!TypeConstants.TYPE_JAVAOBJECT.equals(signature))
-                {
-                    return signature;
-                }
-            }
-        }
-        return null;
-    }
-
-    /**
-     * @param type
-     * @return <code>true</code>, if <code>type</code> is a collection or
-     *         array
-     */
-    public boolean isContainerType(ValueType type)
-    {
-        return type.isArray()
-                || type.isInstanceOf(TypeConstants.TYPE_COLLECTION);
-    }
-
-    /**
-     * @param type -
-     *            the type of the <code>value</code> property
-     * @return the type signature of the row variable for every type that
-     *         <code>UIData</code> takes as <code>value</code> property.
-     *         Will return <code>null</code> if no type or nothing more
-     *         specific than <code>Object</code> can be determined
-     */
-    public String getRowSignatureFromValueType(ValueType type)
-    {
-        if (isContainerType(type))
-        {
-            return getElementSignatureFromContainerType(type);
-        }
-        if (isFacesDataModel(type))
-        {
-            return getRowSignatureFromDataModel(type);
-        }
-        // Otherwise, according to jsf spec, treat value as single row:
-        // TODO full signature
-        return type.getSignature();
-    }
-
-    /**
-     * @param symbolName The name of the symbol to be created. Must not be null
-     * @param signature The type signature of the array type. Must not be null
-     * @param source the runtime source
-     * @param javaProject must not be null
-     * @return a symbol based approximating an implicit DataModel wrapper for an array
-     */
-    public final ISymbol createArraySymbol(final String symbolName, final String signature, final ERuntimeSource source, final IJavaProject javaProject)
-    {
-        assert symbolName != null;
-        assert signature != null;
-        assert javaProject != null;
-        
-        final String arrayElementType = Signature.getElementType(signature);
-        final int arrayCount = Signature.getArrayCount(signature);
-        String  adjustedSignature = null;
-        
-        // if it is a single array nesting, then it will just be the element type,
-        // but if it is a multi-dim array, then the scalar element will be an array
-        // with one less nesting level.  It's a strange corner case to have an implicit
-        // array of something as a row type, but it is a valid case.  I suppose
-        // it may be happen if you want to have tables of tables in which the nested tables
-        // in turn use nested variables as their type...
-        if (arrayCount > 0)
-        {
-            adjustedSignature = Signature.createArraySignature(arrayElementType, arrayCount-1);
-        }
-        else
-        {
-            adjustedSignature = arrayElementType;
-        }
-        
-        return createScalarSymbol(symbolName, adjustedSignature, source, javaProject);
-    }
-
-    /**
-     * @param symbolName The name of the symbol to create. Must not be null.
-     * @param signature The fully resolved type signature of the scalar.  Must not be null.
-     * @param source 
-     * @param javaProject The JavaProject whose classpath is to be used to resolve type information for signture. Must not be null.
-     * @return a symbol approximating a scalar object DataModel wrapper.  The row variable for the
-     * data model becomes of type signature
-     */
-    public final ISymbol createScalarSymbol(final String symbolName, final String signature, final ERuntimeSource source, final IJavaProject javaProject)
-    {
-        assert symbolName != null;
-        assert signature != null;
-        assert javaProject != null;
-
-        final String elementType = Signature.getElementType(signature);
-        
-        IJavaTypeDescriptor2 desc = 
-            SymbolFactory.eINSTANCE.createIJavaTypeDescriptor2();
-        final int arrayCount = Signature.getArrayCount(signature);
-        if (arrayCount > 0)
-        {
-            desc.setArrayCount(arrayCount);
-        }
-        
-        IType type = TypeUtil.resolveType(javaProject, elementType);
-        if (type != null)
-        {
-            desc.setType(type);
-        }
-        else
-        {
-            desc.setTypeSignatureDelegate(Signature.getTypeErasure(signature));
-        }
-        desc.getTypeParameterSignatures().addAll(Arrays.asList(Signature.getTypeArguments(signature)));
-
-        IComponentSymbol symbol = SymbolFactory.eINSTANCE.createIComponentSymbol();
-        symbol.setName(symbolName);
-        symbol.setTypeDescriptor(desc);
-        symbol.setRuntimeSource(ERuntimeSource.TAG_INSTANTIATED_SYMBOL_LITERAL);
-        return symbol;
-    }
-
-    /**
-     * @param symbolName The name of the symbol to create. Must not be null.
-     * @param valueType The value expression representing the implicit list.  The signature
-     * on the valueType must be a list. Must not be null.
-     * @param source 
-     * @param description 
-     * @param javaProject The JavaProject whose classpath will be used to resolve types.  Must not be null.
-     * 
-     * @return a symbol that approximates as best as possible an implicit DataModel for java.util.List value expressions.  If the List has
-     * resolvable Java 5 type arguments, then a scalar symbol will be created
-     * using this type information.  If it is a raw type, then 
-     * createDefaultSymbol() is called
-     */
-    public final ISymbol createFromList(String symbolName, ValueType valueType, ERuntimeSource source, String description, IJavaProject javaProject) 
-    {
-        assert symbolName != null;
-        assert valueType != null;
-        assert javaProject != null;
-        assert TypeConstants.TYPE_LIST.equals(valueType.getSignature());
-        
-        final String[] typeArguments = valueType.getTypeArguments();
-        
-        if (typeArguments != null && typeArguments.length > 0)
-        {
-            // a list has a single type argument
-            final String typeArg = typeArguments[0];
-
-            if (Signature.getTypeSignatureKind(typeArg) == Signature.CLASS_TYPE_SIGNATURE)
-            {
-                return createScalarSymbol(symbolName, typeArg, source, javaProject);
-            }
-        }
-        
-        // if no resolvable type signatures, do the default thing
-        return createDefaultSymbol(symbolName, ERuntimeSource.TAG_INSTANTIATED_SYMBOL_LITERAL, description);
-    }
-
-    /**
-     * @param symbolName The name of the symbol to create.  Must not be null
-     * @param source 
-     * @param description 
-     * @return a default symbol that eliminates bogus warnings for this dataTable's
-     * row variable in cases where something better is resolvable.  Note that this is
-     * not ideal, since will result in any property being accepted on the variable with
-     * this name.
-     */
-    public final ISymbol createDefaultSymbol(final String symbolName, final ERuntimeSource source, final String description)
-    {
-        assert symbolName != null;
-        
-        final IMapTypeDescriptor typeDesc = 
-            SymbolFactory.eINSTANCE.createIBoundedMapTypeDescriptor();
-        // empty map source
-        typeDesc.setMapSource(new HashMap());
-        final IComponentSymbol symbol = 
-            SymbolFactory.eINSTANCE.createIComponentSymbol();
-        symbol.setName(symbolName);
-        symbol.setTypeDescriptor(typeDesc);
-        symbol.setDetailedDescription(description);
-        symbol.setRuntimeSource(source);
-        return symbol;
-    }
-
-    /**
-     * FUTURE use: added to support future API feature.  Should not be used.
-     * @param symbolName
-     * @param bundleName
-     * @param project
-     * @return an instance symbol for the message bundle
-     */
-    public IInstanceSymbol createMessageBundleSymbol(final String symbolName, final String bundleName, IJavaProject project)
-    {
-        // FUTURE USE
-        throw new UnsupportedOperationException("see https://bugs.eclipse.org/bugs/show_bug.cgi?id=215461"); //$NON-NLS-1$
-    }
-
-    /**
-     * FUTURE use: added to support future API feature.  Should not be used.
-     * @param symbolName
-     * @param fullyQualifiedName 
-     * @param source 
-     * @param description 
-     * @param javaProject 
-     * @return an instance symbol for the message bundle
-     */
-    public IBeanInstanceSymbol createManagedBeanSymbol(final String symbolName, final String fullyQualifiedName,
-            ERuntimeSource source, final String description, final IJavaProject javaProject)
-    {
-        // FUTURE USE
-        throw new UnsupportedOperationException("see https://bugs.eclipse.org/bugs/show_bug.cgi?id=215461"); //$NON-NLS-1$
-    }
-
-//    /  /**
-//  * @param symbolName
-//  * @param signature
-//  * @param javaProject
-//  * @return a symbol for a bean
-//  */
-// public IComponentBeanSymbol createBeanSymbolFromSignature(
-//         final String symbolName, final String signature,
-//         final IJavaProject javaProject)
-// {
-//     IJavaTypeDescriptor2 desc = createTypeDescriptorFromSignature(
-//             signature, javaProject);
-//
-//     IComponentBeanSymbol symbol = SymbolFactory.eINSTANCE
-//             .createIComponentBeanSymbol();
-//     symbol.setName(symbolName);
-//     symbol.setTypeDescriptor(desc);
-//     symbol.setRuntimeSource(ERuntimeSource.TAG_INSTANTIATED_SYMBOL_LITERAL);
-//     return symbol;
-// }
-
-// /**
-//  * @param symbolName
-//  * @param bundleName
-//  * @param project
-//  * @return a symbol for a message bundle
-//  */
-// public IMessageBundleSymbol createMessageBundleSymbolFromBundleName(final String symbolName, final String bundleName, IJavaProject project) {
-//     final IMessageBundleTypeDescriptor typeDesc = SymbolFactory.eINSTANCE.createIMessageBundleTypeDescriptor();
-//     try {
-//         Map mapSource = ResourceBundleMapSourceFactory.getResourceBundleMapSource(project.getProject(), bundleName);
-//         typeDesc.setMapSource(mapSource);
-//     } catch (JavaModelException e) {
-//         JSFCorePlugin.log(e, "Error creating resource map for bundle '"bundleName  "'"); //$NON-NLS-1$ //$NON-NLS-2$
-//     } catch (IOException e) {
-//         JSFCorePlugin.log(e, "Error creating resource map for bundle '"bundleName  "'"); //$NON-NLS-1$ //$NON-NLS-2$
-//     } catch (CoreException e) {
-//         JSFCorePlugin.log(e, "Error creating resource map for bundle '"bundleName  "'"); //$NON-NLS-1$ //$NON-NLS-2$
-//     }
-//     final IMessageBundleSymbol symbol = SymbolFactory.eINSTANCE.createIMessageBundleSymbol();
-//     symbol.setName(symbolName);
-//     symbol.setTypeDescriptor(typeDesc);
-//     symbol.setDetailedDescription(NLS.bind(Messages.getString("ComponentSymbolFactory.IMessageBundleSymbol.detailedDescription"), bundleName));  //$NON-NLS-1$
-//     return symbol;
-// }
-//    /**
-//     * Sets the symbol to be defined only inside the given element
-//     * 
-//     * @param symbol
-//     * @param slement
-//     */
-//    public void setDefinitionRange(final IComponentVar symbol,
-//            final Element slement)
-//    {
-//        if (slement instanceof IndexedRegion)
-//        {
-//            final IndexedRegion defRegion = (IndexedRegion) slement;
-//            final int defOffset = defRegion.getStartOffset();
-//            final int defLength = defRegion.getLength();
-//            symbol.setDefinitionRange(defOffset, defLength);
-//        }
-//    }
-
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/symbols/Messages.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/symbols/Messages.java
deleted file mode 100644
index e68910e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/symbols/Messages.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.designtime.symbols;
-
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-/*package*/ class Messages {
-    private static final String BUNDLE_NAME = "org.eclipse.jst.jsf.designtime.messages"; //$NON-NLS-1$
-
-    private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle
-            .getBundle(BUNDLE_NAME);
-
-    private Messages() {
-        // no external instantiation
-    }
-
-    /**
-     * @param key
-     * @return the resource or !key! if not found.
-     */
-    public static String getString(String key) {
-        try {
-            return RESOURCE_BUNDLE.getString(key);
-        } catch (MissingResourceException e) {
-            return '!' + key + '!';
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/symbols/SymbolUtil.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/symbols/SymbolUtil.java
deleted file mode 100644
index 18a8594..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/symbols/SymbolUtil.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.designtime.symbols;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jst.jsf.context.symbol.ISymbol;
-
-/**
- * Utilities for symbol handling
- * 
- * @author cbateman
- *
- */
-public final class SymbolUtil 
-{
-    /**
-     * @param symbols
-     * @param name
-     * @return the symbol in symbols matching name or null if not there
-     */
-    public static ISymbol  findSymbolByName(final ISymbol[] symbols, final String name)
-    {
-        for (int i = 0; i < symbols.length; i++)
-        {
-            if (name.equals(symbols[i].getName()))
-            {
-                return symbols[i];
-            }
-        }
-        
-        // if not found, return null
-        return null;
-    }
-    
-    /**
-     * @param allSymbols
-     * @param prefix
-     * @return an array of symbols filtered based on name.startsWith(prefix)
-     */
-    public static ISymbol[]  filterSymbolsByPrefix(final ISymbol[] allSymbols, final String prefix) 
-    {
-        List   filteredSymbols = new ArrayList(allSymbols.length);
-        for (int i = 0; i < allSymbols.length; i++)
-        {
-            if (allSymbols[i].getName().startsWith(prefix))
-            {
-                filteredSymbols.add(allSymbols[i]);
-            }
-        }
-        
-        return (ISymbol[]) filteredSymbols.toArray(ISymbol.EMPTY_SYMBOL_ARRAY);
-    }
-    
-    private SymbolUtil()
-    {
-        // no external instantiation
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/symbols/package-info.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/symbols/package-info.java
deleted file mode 100644
index 6ccfac9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/symbols/package-info.java
+++ /dev/null
@@ -1,16 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-/**
- * Design Time EL Symbol Contribution framework. 
- */
-package org.eclipse.jst.jsf.designtime.symbols;
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/AbstractMetaDataEnabledFeature.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/AbstractMetaDataEnabledFeature.java
deleted file mode 100644
index c022bd9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/AbstractMetaDataEnabledFeature.java
+++ /dev/null
@@ -1,156 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.metadataprocessors;
-
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jst.jsf.common.metadata.Entity;
-import org.eclipse.jst.jsf.common.metadata.Trait;
-import org.eclipse.jst.jsf.common.metadata.internal.IImageDescriptorProvider;
-import org.eclipse.jst.jsf.common.metadata.internal.IMetaDataSourceModelProvider;
-import org.eclipse.jst.jsf.common.metadata.internal.TraitValueHelper;
-import org.eclipse.jst.jsf.common.metadata.query.TaglibDomainMetaDataQueryHelper;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.jst.jsf.metadataprocessors.features.IPossibleValues;
-
-/**
- * Simple abstract class that implementers of {@link IMetaDataEnabledFeature} can subclass in the <b>TagLibDomain</b> of metadata
- * <p><b>Provisional API - subject to change</b></p>*
- */
-public abstract class AbstractMetaDataEnabledFeature implements IMetaDataEnabledFeature{
-	
-	private MetaDataContext mdContext;
-	private IStructuredDocumentContext sdContext;
-
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.metadataprocessors.IMetaDataEnabledFeature#setMetaDataContext(org.eclipse.jst.jsf.metadataprocessors.MetaDataContext)
-	 */
-	public void setMetaDataContext(final MetaDataContext context) {
-		this.mdContext = context;		
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.metadataprocessors.IMetaDataEnabledFeature#getMetaDataContext()
-	 */
-	public MetaDataContext getMetaDataContext() {
-		return mdContext;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.metadataprocessors.IMetaDataEnabledFeature#setStructuredDocumentContext(org.eclipse.wtp.jsf.context.structureddocument.IStructuredDocumentContext)
-	 */
-	public void setStructuredDocumentContext(final IStructuredDocumentContext context) {
-		this.sdContext = context;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.metadataprocessors.IMetaDataEnabledFeature#getStructuredDocumentContext()
-	 */
-	public IStructuredDocumentContext getStructuredDocumentContext() {
-		return sdContext;
-	}
-	
-//	private IProject getProject(){
-//		if (_project == null){
-//			_project = IStructuredDocumentContextResolverFactory.INSTANCE.getWorkspaceContextResolver(sdContext).getProject();
-//		}
-//		return _project;
-//	}
-
-	
-	//common metadata accessors
-	/**
-	 * Return the single expected String value for a given property.
-	 * 
-	 * @param traitName property name
-	 * @return String value
-	 */
-	protected String getTraitValueAsString(final String traitName){	
-		Trait t = getTraitForEntityUsingContext(traitName);
-		if (t != null){
-			return TraitValueHelper.getValueAsString(t);
-		}
-				
-		return null;
-
-	}
-	
-	/**
-	 * Return the List of values for a given property.
-	 * 
-	 * @param traitName trait name
-	 * @return List of String values
-	 */
-	protected List getTraitValueAsListOfStrings(final String traitName){
-		Trait t = getTraitForEntityUsingContext(traitName);
-		if (t != null){
-			return TraitValueHelper.getValueAsListOfStrings(t);
-		}
-			
-		return Collections.EMPTY_LIST;
-	}
-
-	/**
-	 * Return a boolean value for the given named trait .
-	 * 
-	 * @param traitName property name
-	 * @return boolean value.  Returns false if trait was not located.
-	 */
-	protected boolean getTraitValueAsBoolean(final String traitName){	
-		Trait t = getTraitForEntityUsingContext(traitName);
-		if (t != null){
-			return TraitValueHelper.getValueAsBoolean(t);
-		}
-				
-		return false;
-
-	}
-	private Trait getTraitForEntityUsingContext(final String traitName) {
-		//look for trait on given entity
-		final Entity entity = getMetaDataContext().getEntity();
-		return TaglibDomainMetaDataQueryHelper.getTrait(entity, traitName);
-	}
-
-	/**
-	 * @return small-icon name 
-	 */
-	protected String getSmallIcon() {
-		return getTraitValueAsString(IPossibleValues.POSSIBLE_VALUES_SMALL_ICON_PROP_NAME);
-	}
-	
-	/**
-	 * @return ImageDescriptor from the small-icon property for annotation from the same
-	 * source model provider as the trait
-	 */
-	protected ImageDescriptor getImage() {
-		final String smallIcon = getSmallIcon();
-		if (smallIcon == null)
-			return null;
-		
-		try {
-			Trait t = getMetaDataContext().getTrait();
-			IMetaDataSourceModelProvider provider = t.getSourceModelProvider();
-			IImageDescriptorProvider ip = (IImageDescriptorProvider)provider.getAdapter(IImageDescriptorProvider.class);
-			if (ip != null){
-				return ip.getImageDescriptor(smallIcon);
-			}
-		} catch (RuntimeException e) {		
-			//TODO: log error?
-
-		}
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/AbstractRootTypeDescriptor.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/AbstractRootTypeDescriptor.java
deleted file mode 100644
index 00b1ed8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/AbstractRootTypeDescriptor.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.metadataprocessors;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jst.jsf.metadataprocessors.internal.IMetaDataEnabledFeatureExtension;
-import org.eclipse.jst.jsf.metadataprocessors.internal.MetaDataEnabledFeatureAdapterFactory;
-import org.eclipse.jst.jsf.metadataprocessors.internal.MetaDataEnabledFeatureRegistry;
-
-
-/**
- * Default implementation that a metadata type should strongly consider for using as it's root.
- * This implementation allows for a class implementing {@link ITypeDescriptor} to also contain features so
- * that it is not necessary to declare the features using the MetaDataEnabledFeatures ext-pt 
- * <p><b>Provisional API - subject to change</b></p>
- * @author Gerry Kessler - Oracle
- */
-public abstract class AbstractRootTypeDescriptor extends AbstractMetaDataEnabledFeature
-		implements ITypeDescriptor {
-	
-	private IType type;
-	
-	/**
-	 * Default implementation that will return <code>this</code> if it supports the processing feature,
-	 * and all {@link IMetaDataEnabledFeature}s that also support this feature on this type.   The caller can determine
-	 * which one or more of the returned processors to use.
-	 *    
-	 * @param processingFeature class
-	 * @return List of <code>IMetaDataEnabledFeature</code>s that support the
-	 * specified featureType interface.  
-	 * 
-	 * @see org.eclipse.jst.jsf.metadataprocessors.ITypeDescriptor#getFeatureAdapters(java.lang.Class)
-	 */
-	public List getFeatureAdapters(Class processingFeature) {
-		Assert.isTrue(processingFeature.isInterface());
-		List ret = new ArrayList(3);
-		if (processingFeature.isInstance(this)) {
-//			((IMetaDataEnabledFeature)this).setBundleID(type.getBundleID());
-			ret.add(this);
-		}
-		
-		//add extensions here
-		ret.addAll(findMetaDataEnabledFeaturesForThisType(processingFeature));
-		return ret;
-
-	}
-	
-	/**
-	 * This implementation relies on the the feature implementor using a subclass of AbstractRootTypeDescriptor 
-	 * which implements {@link IMetaDataEnabledFeature}.
-	 * 
-	 * @param processingFeature
-	 * @return list of <code>IMetaDataEnabledFeature</code>s
-	 */
-	protected final List<IMetaDataEnabledFeature> findMetaDataEnabledFeaturesForThisType(Class processingFeature) {
-		Map <String, IMetaDataEnabledFeature> mapOfFeatures = new HashMap<String, IMetaDataEnabledFeature>(); 
-		List extensions = MetaDataEnabledFeatureRegistry.getInstance()
-							.getFeatures(getTypeExtension().getTypeID());
-
-		if (!extensions.isEmpty()){
-			for (int i=0;i<extensions.size();i++){
-				IMetaDataEnabledFeatureExtension aFeature = (IMetaDataEnabledFeatureExtension)extensions.get(i);
-				IMetaDataEnabledFeature feature = MetaDataEnabledFeatureAdapterFactory.getInstance().getFeatureAdapter(aFeature, processingFeature);
-				if (feature != null && processingFeature.isInstance(feature)
-						&& ! mapOfFeatures.containsKey(aFeature.getClassName())){
-					mapOfFeatures.put(aFeature.getClassName(),feature);				
-				}
-			}
-		} 
-		List<IMetaDataEnabledFeature> ret = new ArrayList<IMetaDataEnabledFeature>(mapOfFeatures.size());
-		for (IMetaDataEnabledFeature feature: mapOfFeatures.values()){
-			ret.add(feature);
-		}
-		return ret;
-	}	
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.metadataprocessors.ITypeDescriptor#getRuntimeType()
-	 */
-	public IType getTypeExtension() {
-		return type;
-	}
-
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.metadataprocessors.ITypeDescriptor#setRuntimeType(org.eclipse.jst.jsf.metadataprocessors.internal.AbstractMetaDataEnabledType)
-	 */
-	public void setTypeExtension(IType type) {
-		this.type = type;
-	}
-	
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/DefaultTypeDescriptor.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/DefaultTypeDescriptor.java
deleted file mode 100644
index 49b5ad9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/DefaultTypeDescriptor.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.metadataprocessors;
-
-
-/**
- * Type descriptor that is created if no class if provided for the implementation 
- * in the AttributeValueRuntimeTypes extension point.
- * <p><b>Provisional API - subject to change</b></p>
- * @author Gerry Kessler - Oracle
- *
- */
-public class DefaultTypeDescriptor extends AbstractRootTypeDescriptor {
-    // abstract super contains no abstract methods, so do nothing: automatic default
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/IMetaDataEnabledFeature.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/IMetaDataEnabledFeature.java
deleted file mode 100644
index f25054d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/IMetaDataEnabledFeature.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.metadataprocessors;
-
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-
-/**
- * Required interface used by the MetaData feature processing framework.
- * All features must extend this interface.
- * <p><b>Provisional API - subject to change</b></p>
- * @author Gerry Kessler - Oracle
- *
- */
-public abstract interface IMetaDataEnabledFeature {
-	
-	/**
-	 * Sets structured document context that this feature will operating on
-	 * @param context 
-	 */
-	public void setStructuredDocumentContext(IStructuredDocumentContext context);
-	
-	/**
-	 * Gets structured document context that this feature will operating on
-	 * @return IStructuredDocumentContext
-	 */
-	public IStructuredDocumentContext getStructuredDocumentContext();
-	
-	/**
-	 * Sets metadata model context that this feature will operating on
-	 * @param context 
-	 */
-	public void setMetaDataContext(MetaDataContext context);
-	
-	/**
-	 * Gets metadata model context that this feature will be operating on. 
-	 * @return MetaDataContext
-	 */
-	public MetaDataContext getMetaDataContext();
-	
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/IType.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/IType.java
deleted file mode 100644
index 7466b57..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/IType.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.metadataprocessors;
-
-
-/**
- * Interface representing the information contained by the type registries.
- * Encapsulates the IConfigurationElement information.
- * <p><b>Provisional API - subject to change</b></p>
- * @author Gerry Kessler - Oracle
- *
- */
-public interface IType {
-	/**
-	 * @return type id
-	 */
-	public String getTypeID();	
-	/**
-	 * @return bundle id where it is defined
-	 */
-	public String getBundleID();
-	/**
-	 * @return classname for the type that must be located within the bundle
-	 */
-	public String getClassName();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/ITypeDescriptor.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/ITypeDescriptor.java
deleted file mode 100644
index 0031ebb..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/ITypeDescriptor.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.metadataprocessors;
-
-import java.util.List;
-
-/**
- * Interface describing the runtime type of a metadata enabled annotation. 
- * The type descriptor will load the feature adapters for a certain kind of 
- * feature that it supports.  The type descriptor is registered by an extension point.
- * <p><b>Provisional API - subject to change</b></p>
- * @see IMetaDataEnabledFeature
- * @see AbstractRootTypeDescriptor
- * @see org.eclipse.jst.jsf.metadataprocessors.internal.AbstractMetaDataEnabledTypeFactory
- * @see IType
- * 
- * @author Gerry Kessler - Oracle
- *
- */
-public interface ITypeDescriptor {
-	/**
-	 * @param type 
-	 * The IType must be set after the ITypeDescriptor is constructed
-	 */
-	public void setTypeExtension(IType type);
-	/**
-	 * @return IType
-	 * Must not be null
-	 */
-	public IType getTypeExtension();
-
-	/**
-	 * @param processingFeature interface class
-	 * @return List of <code>IMetaDataEnabledFeature</code>s that support the
-	 * specified processingFeature interface.  
-	 */
-	public List<IMetaDataEnabledFeature> getFeatureAdapters(Class processingFeature);
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/MetaDataContext.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/MetaDataContext.java
deleted file mode 100644
index 5876340..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/MetaDataContext.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.metadataprocessors;
-
-import org.eclipse.jst.jsf.common.metadata.Entity;
-import org.eclipse.jst.jsf.common.metadata.Trait;
-
-
-/**
- * The current meta data model context being used for processing. 
- * <p><b>Provisional API - subject to change</b></p>
- *
- */
-public class MetaDataContext {
-	private Trait trait;
-	private Entity entity;
-	
-	/**
-	 * Constructor
-	 * @param entity
-	 * @param trait
-	 */
-	public MetaDataContext(Entity entity, Trait trait) {
-		this.entity = entity;
-		this.trait = trait;
-	}
-	
-	/**
-	 * @return Entity
-	 */
-	public Entity getEntity(){
-		return entity;
-	}
-	/**
-	 * @return Trait
-	 */
-	public Trait getTrait(){
-		return trait;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/MetaDataEnabledProcessingFactory.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/MetaDataEnabledProcessingFactory.java
deleted file mode 100644
index 12a448f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/MetaDataEnabledProcessingFactory.java
+++ /dev/null
@@ -1,177 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.metadataprocessors;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jst.jsf.common.dom.AttributeIdentifier;
-import org.eclipse.jst.jsf.common.metadata.Entity;
-import org.eclipse.jst.jsf.common.metadata.Trait;
-import org.eclipse.jst.jsf.common.metadata.internal.TraitValueHelper;
-import org.eclipse.jst.jsf.common.metadata.query.ITaglibDomainMetaDataModelContext;
-import org.eclipse.jst.jsf.common.metadata.query.TaglibDomainMetaDataQueryHelper;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IStructuredDocumentContextResolverFactory;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IWorkspaceContextResolver;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.jst.jsf.metadataprocessors.internal.AttributeValueRuntimeTypeFactory;
-
-/**
- * Singleton class that will produce <code>IMetaDataEnabledFeature</code>s
- * that the caller can use for processing.
- * <p>
- * <b>Provisional API - subject to change</b>
- * </p>
- * 
- * @author Gerry Kessler - Oracle
- * 
- */
-public final class MetaDataEnabledProcessingFactory {
-	private static MetaDataEnabledProcessingFactory INSTANCE;
-
-	/**
-	 * Name of property in annotation file to use when applying a runtime type
-	 * to an attribute value
-	 */
-	public static final String ATTRIBUTE_VALUE_RUNTIME_TYPE_PROP_NAME = "attribute-value-runtime-type"; //$NON-NLS-1$
-
-	/**
-	 * @return singleton instance
-	 */
-	public static MetaDataEnabledProcessingFactory getInstance() {
-		if (INSTANCE == null) {
-			INSTANCE = new MetaDataEnabledProcessingFactory();
-		}
-		return INSTANCE;
-	}
-
-	private MetaDataEnabledProcessingFactory() {
-		super();
-	}
-
-	/**
-	 * Returns list of <code>IMetaDataEnabledFeature</code> adapters for the
-	 * given Taglibrary attribute.
-	 * 
-	 * Adapters will be scanned for first by uri, element, attribute and if not
-	 * found, uri, "*", attribute and if still not found by "*", "*", attribute.
-	 * 
-	 * @param featureType
-	 *            feature type. eg. <code>IPossibleValues</code>,
-	 *            <code>IValidValues</code>, etc. Must be subclass of
-	 *            IMetaDataEnabledFeature.
-	 * @param sdContext
-	 * @param uri
-	 *            annotation file uri
-	 * @param elementName
-	 * @param attributeName
-	 * @return returns null - if the metadata was not found <br>
-	 *         returns empty list - if not a
-	 *         <code>IMetaDataEnabledFeature</code> processor or is not valid
-	 *         or does not support the specified feature
-	 * 
-	 * @see MetaDataEnabledProcessingFactory#ATTRIBUTE_VALUE_RUNTIME_TYPE_PROP_NAME
-	 */
-	public List<IMetaDataEnabledFeature> getAttributeValueRuntimeTypeFeatureProcessors(
-			Class featureType, IStructuredDocumentContext sdContext,
-			String uri, String elementName, String attributeName) {
-		
-		// look up the attribute's runtime type from MD
-		IProject _project = null;
-		if (sdContext != null) {
-			IWorkspaceContextResolver resolver = IStructuredDocumentContextResolverFactory.INSTANCE
-					.getWorkspaceContextResolver(sdContext);
-			_project = resolver != null ? resolver.getProject() : null;
-		}
-		String _elem = elementName + "/" + attributeName; //$NON-NLS-1$
-		String _uri = uri;
-		ITaglibDomainMetaDataModelContext modelContext = TaglibDomainMetaDataQueryHelper
-				.createMetaDataModelContext(_project, _uri);
-		Entity attrEntity = TaglibDomainMetaDataQueryHelper.getEntity(modelContext,
-				_elem);
-
-		if (attrEntity != null) 
-			return getAttributeValueRuntimeTypeFeatureProcessors(featureType, sdContext, attrEntity);
-		
-		return Collections.EMPTY_LIST;
-
-	}
-
-	/**
-	 * A convenience method fully equivalent to:
-	 * 
-	 *     getAttributeValueRuntimeTypeFeatureProcessors
-     *      (featureType, sdContext, attributeId.getTagIdentifier().getUri()
-     *           , attributeId.getTagIdentifier().getTagName(), 
-     *           attributeId.getName())
-	 * @param featureType
-	 * @param sdContext
-	 * @param attributeId
-	 * @return the meta-data enabled feature
-	 */
-	public List<IMetaDataEnabledFeature> getAttributeValueRuntimeTypeFeatureProcessors(
-            Class featureType, IStructuredDocumentContext sdContext,
-            AttributeIdentifier attributeId)
-    {
-	    return getAttributeValueRuntimeTypeFeatureProcessors
-	    (featureType, sdContext, attributeId.getTagIdentifier().getUri()
-	            , attributeId.getTagIdentifier().getTagName(), 
-	            attributeId.getName());
-    }
-	
-	/**
-	 * @param featureType
-	 * @param sdContext
-	 * @param attrEntity
-	 * @return returns null - if the meta data was not found <br>
-	 *         returns empty list - if not a
-	 *         <code>IMetaDataEnabledFeature</code> processor or is not valid
-	 *         or does not support the specified feature
-	 */
-	public List<IMetaDataEnabledFeature> getAttributeValueRuntimeTypeFeatureProcessors(
-			Class featureType, IStructuredDocumentContext sdContext,
-			Entity attrEntity) {
-
-		Trait trait = TaglibDomainMetaDataQueryHelper.getTrait(attrEntity,
-				ATTRIBUTE_VALUE_RUNTIME_TYPE_PROP_NAME);
-
-		if (trait == null) {
-			return Collections.EMPTY_LIST;
-		}
-		
-		List<IMetaDataEnabledFeature> retList = new ArrayList<IMetaDataEnabledFeature>(2);
-		String typeId = TraitValueHelper.getValueAsString(trait);
-
-		// get the implementing class for the type
-		ITypeDescriptor type = AttributeValueRuntimeTypeFactory.getInstance()
-				.getType(typeId);
-		if (type != null) {
-			MetaDataContext context = new MetaDataContext(attrEntity, trait);
-			// get all the feature adapters (IMetaDataEnabledFeature) for this
-			// type
-			List<IMetaDataEnabledFeature> featureAdapters = type.getFeatureAdapters(featureType);
-			for (int j = 0; j < featureAdapters.size(); j++) {
-				// set the context in the feature
-				featureAdapters.get(j).setMetaDataContext(context);
-				featureAdapters.get(j).setStructuredDocumentContext(sdContext);
-				retList.add(featureAdapters.get(j));
-			}
-
-		}
-		// return list of IMetaDataEnabledFeatures for this type
-		return Collections.unmodifiableList(retList);
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/TaglibMetadataContext.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/TaglibMetadataContext.java
deleted file mode 100644
index 82eb4cc..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/TaglibMetadataContext.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.metadataprocessors;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jst.jsf.common.metadata.Entity;
-import org.eclipse.jst.jsf.common.metadata.Trait;
-
-/**
- * Binds tag library context to the metadata context 
- * <p><b>Provisional API - subject to change</b></p>
- * @deprecated - should not have been public, and no reason anyone should be using this class
- */
-public class TaglibMetadataContext extends MetaDataContext {
-
-	private String uri;
-	private String tagName;
-	private String attributeName;
-
-	/**
-	 * Constructor 
-	 * 
-	 * @param uri - must not be null
-	 * @param tagName - must not be null
-	 * @param attributeName - may be null
-	 * @param entity - the metadata entity represented by the tag or attribute
-	 * @param trait - the metadata trait of interest
-	 */
-	public TaglibMetadataContext(String uri, String tagName, String attributeName, Entity entity, Trait trait){
-		super(entity, trait);
-		this.uri = uri;
-		this.tagName = tagName;
-		this.attributeName = attributeName;
-	}
-	
-	/**
-	 * Package-private Constructor
-	 * 
-	 * @param tagAttrEntity - must be tag attribute entity and not null
-	 * @param trait
-	 */
-	/*package*/ TaglibMetadataContext(Entity tagAttrEntity, Trait trait){
-		super(tagAttrEntity, trait);
-		Assert.isNotNull(tagAttrEntity);
-		this.uri = tagAttrEntity.getModel().getCurrentModelContext().getUri().toString();
-		if (!(tagAttrEntity.eContainer() instanceof Entity))
-		{
-		    throw new IllegalArgumentException("tagAttrEntity must be contained in a tag Entity to use this constructor"); //$NON-NLS-1$
-		}
-		this.tagName = ((Entity)tagAttrEntity.eContainer()).getId();
-		this.attributeName = tagAttrEntity.getId();
-	}
-
-	/**
-	 * @return URI
-	 */
-	public String getUri() {
-		return uri;
-	}
-
-	/**
-	 * @return Tag name - should not be null
-	 */
-	public String getTagName() {
-		return tagName;
-	}
-
-	/**
-	 * @return Attribute name  - may be null
-	 */
-	public String getAttributeName() {
-		return attributeName;
-	}
-	
-	
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/features/ELIsNotValidException.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/features/ELIsNotValidException.java
deleted file mode 100644
index f1b5b16..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/features/ELIsNotValidException.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.metadataprocessors.features;
-
-/**
- * Exception
- * 
- * <p><b>Provisional API - subject to change</b></p>
- */
-public class ELIsNotValidException extends Exception {
-	private static final long serialVersionUID = 1L;
-	
-	/**
-	 * Constructor
-	 * @param msg
-	 */
-	public ELIsNotValidException(String msg){
-		super(msg);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/features/ICreateValues.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/features/ICreateValues.java
deleted file mode 100644
index 6c25a65..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/features/ICreateValues.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.metadataprocessors.features;
-
-import org.eclipse.jst.jsf.metadataprocessors.IMetaDataEnabledFeature;
-
-/**
- * @author Gerry Kessler - Oracle
- * 
- * Experimental - not currently used
- * <p><b>Provisional API - subject to change</b></p>
- *
- */
-public interface ICreateValues extends IMetaDataEnabledFeature{
-	/**
-	 * @return object created
-	 */
-	public Object createValue();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/features/IDefaultValue.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/features/IDefaultValue.java
deleted file mode 100644
index 70b68aa..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/features/IDefaultValue.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.metadataprocessors.features;
-
-import org.eclipse.jst.jsf.metadataprocessors.IMetaDataEnabledFeature;
-
-/**
- * Interface providing a default value.
- * 
- * @author Gerry Kessler - Oracle
- * 
- * <p><b>Provisional API - subject to change</b></p>
- *
- */
-public interface IDefaultValue extends IMetaDataEnabledFeature {
-	/**
-	 * Default name of property in annotation file to use when supplying default values from meta-data 
-	 */
-	String DEFAULT_VALUE_PROP_NAME = "default-value";	 //$NON-NLS-1$
-	
-	/**
-	 * @return default value or null if one not defined
-	 */
-	public String getDefaultValue();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/features/IPossibleValue.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/features/IPossibleValue.java
deleted file mode 100644
index d4cdbf9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/features/IPossibleValue.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.metadataprocessors.features;
-
-import org.eclipse.jface.resource.ImageDescriptor;
-
-/**
- * Interface for providing lists of possible values
- * Values can be different than displayed values.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- *
- */
-public interface IPossibleValue {
-	/**
-	 * @return value to set.  should not return null.
-	 */
-	public String getValue();
-	/**
-	 * @return value to display in a proposal which can be different than what is set.  Must not return null.
-	 */
-	public String getDisplayValue();
-	/**
-	 * @return ImageDescriptor for image to be displayed in a proposal.   May be null.
-	 */
-	public ImageDescriptor getIcon();
-	/**
-	 * @return true if is known to be the default value.  
-	 */
-	public boolean isDefaultValue();
-	
-	/**
-	 * @return additional information that could be used for descriptive help
-	 * May be null
-	 */
-	public String getAdditionalInformation();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/features/IPossibleValues.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/features/IPossibleValues.java
deleted file mode 100644
index 165b662..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/features/IPossibleValues.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.metadataprocessors.features;
-
-import java.util.List;
-
-import org.eclipse.jst.jsf.metadataprocessors.IMetaDataEnabledFeature;
-
-/**
- * Interface for providing possible values.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * @author Gerry Kessler - Oracle
- *
- */
-public interface IPossibleValues extends IMetaDataEnabledFeature{
-	
-	/**
-	 * Default name of property in annotation file to use when supplying possible values from meta-data 
-	 */
-	public static final String POSSIBLE_VALUES_PROP_NAME = "valid-values";	 //$NON-NLS-1$
-	/**
-	 * Default name of property in annotation file to use when supplying possible displayed values from meta-data 
-	 */
-	public static final String POSSIBLE_VALUES_FOR_DISPLAY_PROP_NAME = "displayed-values";	 //$NON-NLS-1$
-	/**
-	 * Default name of property in annotation file to use when supplying icon displayed values from meta-data 
-	 */
-	public static final String POSSIBLE_VALUES_SMALL_ICON_PROP_NAME = "small-icon";	 //$NON-NLS-1$
-	/**
-	 * @return List of IPossibleValue instances representing possible values
-	 * Implementer must ensure that an empty rather than null list is returned if no values are posssible.
-	 */
-	public List getPossibleValues();
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/features/IValidELValues.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/features/IValidELValues.java
deleted file mode 100644
index ca0b8f6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/features/IValidELValues.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.metadataprocessors.features;
-
-import org.eclipse.jst.jsf.common.internal.types.CompositeType;
-import org.eclipse.jst.jsf.metadataprocessors.IMetaDataEnabledFeature;
-
-/**
- * An {@link IMetaDataEnabledFeature} for semantic validation of EL Values 
- * 
- * <p><b>Provisional API - subject to change</b></p>
- */
-public interface IValidELValues extends IMetaDataEnabledFeature {
-	/**
-	 * Expected runtime type for EL value
-	 * @return CompositeType
-	 * @throws ELIsNotValidException
-	 */
-	public CompositeType getExpectedRuntimeType() throws ELIsNotValidException;
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/features/IValidValues.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/features/IValidValues.java
deleted file mode 100644
index e989031..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/features/IValidValues.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.metadataprocessors.features;
-
-import java.util.List;
-
-import org.eclipse.jst.jsf.metadataprocessors.IMetaDataEnabledFeature;
-
-/**
- * An {@link IMetaDataEnabledFeature} for validating values using metadata
- * 
- * <p><b>Provisional API - subject to change</b></p>
- */
-public interface IValidValues extends IMetaDataEnabledFeature{
-	/**
-	 * Trait name for valid-values
-	 */
-	public static final String VALID_VALUES_PROP_NAME = "valid-values"; //$NON-NLS-1$
-	
-	/**
-	 * Trait name for valid-values-code
-	 */
-	public static final String VALID_VALUES_CODE_PROP_NAME = VALID_VALUES_PROP_NAME + "-code"; //$NON-NLS-1$
-	/**
-	 * Trait name for valid-values-severity
-	 */
-	public static final String VALID_VALUES_SEVERITY_PROP_NAME = VALID_VALUES_PROP_NAME + "-severity"; //$NON-NLS-1$
-	/**
-	 * Trait name for valid-values-message
-	 */
-	public static final String VALID_VALUES_MESSAGE_PROP_NAME = VALID_VALUES_PROP_NAME + "-message"; //$NON-NLS-1$
-	/**
-	 * Trait name for valid-maximum
-	 */
-	public static final String VALID_VALUES_MAX_PROP_NAME = "valid-maximum"; //$NON-NLS-1$
-	/**
-	 * Trait name for valid-minimum
-	 */
-	public static final String VALID_VALUES_MIN_PROP_NAME = "valid-minimum"; //$NON-NLS-1$
-	/**
-	 * @param value fully resolved value as String
-	 * @return true if is valid
-	 */
-	public boolean isValidValue(String value);
-	/**
-	 * @return List of IValidationMessage objects if invalid
-	 * Must return empty list rather than null
-	 * Call to isValidValue(String value) required before this should be called.
-	 */
-	public List getValidationMessages();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/features/IValidationMessage.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/features/IValidationMessage.java
deleted file mode 100644
index 4f29c78..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/features/IValidationMessage.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.metadataprocessors.features;
-
-/**
- * Interface for validation messages for metadata features
- * 
- * <p><b>Provisional API - subject to change</b></p>
- */
-public interface IValidationMessage {
-	/**
-	 * @return localized string desribing validation issue
-	 * Should not be null;
-	 */
-	public String getMessage();
-
-	/**
-	 * @return String representing a validation code associated with validation issue 
-	 * Can return null
-	 */
-	public String getCode();
-	
-	/**
-	 * @return integer value representing severity. 
-	 * Valid values are 0 (IStatus.INFO), 1 (IStatus.WARNING) and 4 (IStatus.ERROR)
-	 */
-	public int getSeverity();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/features/PossibleValue.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/features/PossibleValue.java
deleted file mode 100644
index dbbde06..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/features/PossibleValue.java
+++ /dev/null
@@ -1,135 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.metadataprocessors.features;
-
-import org.eclipse.jface.resource.ImageDescriptor;
-
-
-/**
- * Implements {@link IPossibleValues}
- * 
- * <p><b>Provisional API - subject to change</b></p>
- *
- */
-public class PossibleValue implements IPossibleValue {
-	private String value;
-	private String displayValue;
-	private ImageDescriptor smallIcon;
-	private boolean isDefault = false;
-	private String additionalInfo;
-
-	/**
-	 * Constructor when display value is same as stored value
-	 * @param value
-	 */
-	public PossibleValue(String value){
-		this.value = value;
-	}
-	
-	/**
-	 * Constructor when display-value may be different than stored value
-	 * @param value
-	 * @param displayValue
-	 */
-	public PossibleValue(String value, String displayValue){
-		this.value = value;
-		this.displayValue = displayValue;
-	}
-
-	/**
-	 * Constructor when display-value may be different than stored value 
-	 * and a default value is known
-	 * @param value
-	 * @param displayValue
-	 * @param isDefaultValue
-	 */
-	public PossibleValue(String value, String displayValue, boolean isDefaultValue) {
-		this.value = value;
-		this.displayValue = displayValue;
-		this.isDefault = isDefaultValue;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.metadataprocessors.features.IPossibleValue#getValue()
-	 */
-	public String getValue() { 
-		return value;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.metadataprocessors.features.IPossibleValue#getDisplayValue()
-	 */
-	public String getDisplayValue() {
-		if (displayValue == null)
-			return value;
-		return displayValue;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.metadataprocessors.features.IPossibleValue#getIcon()
-	 */
-	public ImageDescriptor getIcon() {		
-		return smallIcon;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.metadataprocessors.features.IPossibleValue#isDefaultValue()
-	 */
-	public boolean isDefaultValue() {
-		return isDefault;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.metadataprocessors.features.IPossibleValue#getAdditionalInformation()
-	 */
-	public String getAdditionalInformation() {
-		return additionalInfo;
-	}
-	
-	/**
-	 * @param value
-	 */
-	public void setValue(String value) {
-		this.value = value;
-	}
-
-	/**
-	 * @param displayValue
-	 */
-	public void setDisplayValue(String displayValue) {
-		this.displayValue = displayValue;
-	}
-
-	/**
-	 * @param smallIcon
-	 */
-	public void setIcon(ImageDescriptor smallIcon) {
-		this.smallIcon = smallIcon;
-	}
-
-	/**
-	 * @param isDefault
-	 */
-	public void setIsDefault(boolean isDefault) {
-		this.isDefault = isDefault;
-	}
-	
-	/**
-	 * @param additionalInfo
-	 */
-	public void setAdditionalInformation(String additionalInfo){
-		this.additionalInfo = additionalInfo;
-	}
-
-	
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/features/ValidationMessage.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/features/ValidationMessage.java
deleted file mode 100644
index 5aaf29e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/features/ValidationMessage.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.metadataprocessors.features;
-
-import org.eclipse.core.runtime.IStatus;
-
-/**
- * Metadata Validation Message implementation 
- * 
- * <p><b>Provisional API - subject to change</b></p>
- */
-public class ValidationMessage implements IValidationMessage {
-
-	private String code;
-	private String msg;
-	private int severity = IStatus.WARNING;
-
-	/**
-	 * Constructor
-	 * @param msg
-	 */
-	public ValidationMessage(String msg){
-		this.msg = msg;
-	}
-	
-	/**
-	 * Constructor
-	 * @param msg
-	 * @param code
-	 * @param severity
-	 */
-	public ValidationMessage(String msg, String code, int severity){
-		this.msg = msg;
-		this.code = code;
-		this.severity = severity;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.metadataprocessors.features.IValidationMessage#getMessage()
-	 */
-	public String getMessage() {
-		return msg;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.metadataprocessors.features.IValidationMessage#getCode()
-	 */
-	public String getCode() {
-		return code;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.metadataprocessors.features.IValidationMessage#getSeverity()
-	 */
-	public int getSeverity() {
-		return severity;
-	}
-
-	/**
-	 * @param msg
-	 */
-	public void setMessage(String msg) {
-		this.msg = msg;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/features/package-info.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/features/package-info.java
deleted file mode 100644
index 552ffe6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/features/package-info.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-/**
- * Provides tooling services for tag attribute values
- * based on the org.eclipse.jst.jsf.core.AttributeValueRuntimeTypes. 
- * <p>
- * New features can added to the system using the org.eclipse.jst.jsf.core.MetaDataEnabledFeatures 
- * extension-point.  This extension point provides the binding of a AttributeValueRuntimeTypes to a feature
- * so that new behaviors can be added to existing types. 
- * 
- * <p><b>Provisional API - subject to change</b></p>
- */
-package org.eclipse.jst.jsf.metadataprocessors.features;
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/internal/AbstractMetaDataEnabledType.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/internal/AbstractMetaDataEnabledType.java
deleted file mode 100644
index 04c6ebd..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/internal/AbstractMetaDataEnabledType.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.metadataprocessors.internal;
-
-import org.eclipse.jst.jsf.metadataprocessors.IType;
-
-
-/**
- * Class that encapuslates the information from the 
- * <code>AttributeValueRuntimeTypes</code> and 
- * <code>MetaDataEnabledFeatures</code>
- * extension points.
- * 
- * @author Gerry Kessler - Oracle
- *
- */
-public class AbstractMetaDataEnabledType implements IType{
-	String typeId;
-	String bundleId;
-	String klass;
-	
-	AbstractMetaDataEnabledType(String bundleID, String id, String klass){
-		this.bundleId = bundleID;
-		this.typeId = bundleId + "." + id; //$NON-NLS-1$
-		this.klass = klass;
-	}
-	
-	public String getTypeID(){		
-		return typeId;
-	}
-	
-	public String getBundleID(){
-		return bundleId;
-	}
-	
-	public String getClassName(){
-		return klass;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/internal/AbstractMetaDataEnabledTypeFactory.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/internal/AbstractMetaDataEnabledTypeFactory.java
deleted file mode 100644
index 8cc0fbd..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/internal/AbstractMetaDataEnabledTypeFactory.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.metadataprocessors.internal;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.metadataprocessors.IType;
-import org.eclipse.jst.jsf.metadataprocessors.ITypeDescriptor;
-import org.osgi.framework.Bundle;
-
-/**
- * Abstract factory producing <code>ITypeDescriptor</code>s 
- * from instances of <code>AbstractMetaDataEnabledType</code>s
- * 
- * @author Gerry Kessler - Oracle
- *
- */
-public abstract class AbstractMetaDataEnabledTypeFactory {
-	/**
-	 * The factory instance
-     * TODO: why is this defined here it is only used in sub-classes??
-	 */
-	protected static AbstractMetaDataEnabledTypeFactory INSTANCE;
-	
-	/**
-	 * No arg constructor
-	 */
-	protected AbstractMetaDataEnabledTypeFactory(){
-		super();
-	}
-	
-	/**
-	 * Concrete factory must pass instances of the it's types.
-	 * 
-	 * @param typeId
-	 * @return list of instances identified by the type id
-	 */
-	public abstract ITypeDescriptor getType(String typeId);
-	
-	/**
-	 * @param type 
-	 * @return instance of ITypeDescriptor identified by the type id
-	 */
-	public ITypeDescriptor getType(AbstractMetaDataEnabledType type){ 
-		
-		return createType(type);
-
-	}
-
-	/**
-	 * @param type 
-	 * @return class identified by the type id
-	 */
-	public Class getClassForType(IType type){ 
-		return createTypeClass(type);
-
-	}
-	
-	/**
-	 * Creates instances of <code>ITypeDescriptor</code>s from 
-	 * <code>AbstractMetaDataEnabledType</code>s
-	 * 
-	 * @param atype
-	 * @return the meta-data type descriptor
-	 */
-	protected ITypeDescriptor createType(IType atype){
-		if (atype != null){
-			ITypeDescriptor desc = createDescriptorInstance(atype);
-			if (desc != null){
-				desc.setTypeExtension(atype);
-				return desc;
-			}
-		}
-		return null;
-	}
-
-	
-	private Class createTypeClass(IType type){
-		String className = type.getClassName();
-		try {
-			Bundle bundle =Platform.getBundle(type.getBundleID());
-			if (bundle == null){
-				JSFCorePlugin.log(IStatus.ERROR, type.getBundleID() + " could not be created to load " + className); //$NON-NLS-1$
-				return null;
-			}
-			Class klass = bundle.loadClass(className);
-			if (klass != null){
-				//make sure the class can support the feature/extended interface
-				if (ITypeDescriptor.class.isAssignableFrom(klass))
-                {
-					return klass;
-                }
-                JSFCorePlugin.log(IStatus.INFO, className + " was not found in " + type.getBundleID() +" for " + type.getTypeID()); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-		} catch (ClassNotFoundException e) {
-			JSFCorePlugin.log(IStatus.ERROR, className + " was not found in " + type.getBundleID() +" for " + type.getTypeID()); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-		return null;
-	}
-	
-	private ITypeDescriptor createDescriptorInstance(IType type){
-		String className = type.getClassName();
-		try {
-			Class klass = createTypeClass(type);
-			if (klass != null){
-				return (ITypeDescriptor)klass.newInstance();
- 			}
-		} catch (InstantiationException e) {
-			JSFCorePlugin.log(IStatus.ERROR, "InstantiationException: " + className + " in " + type.getBundleID() +" for " + type.getTypeID()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-		} catch (IllegalAccessException e) {
-			JSFCorePlugin.log(IStatus.ERROR,  "IllegalAccessException: " + className + " in " + type.getBundleID() +" for " + type.getTypeID()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-		}
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/internal/AbstractMetaDataEnabledTypeRegistry.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/internal/AbstractMetaDataEnabledTypeRegistry.java
deleted file mode 100644
index 767ad7d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/internal/AbstractMetaDataEnabledTypeRegistry.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.metadataprocessors.internal;
-
-import java.util.HashMap;
-
-import org.eclipse.core.runtime.IExtension;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.InvalidRegistryObjectException;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-
-/**
- * Abstract registry of <code>AbstractMetaDataEnabledType<code>
- * mapped by type id.
- * 
- * @author Gerry Kessler - Oracle
- *
- */
-public abstract class AbstractMetaDataEnabledTypeRegistry {
-	private final HashMap typeMap;  //map of types keyed by id
-	private final String ext_pt_id; //type ext-pt id
-	
-	/**
-	 * @param extPtId
-	 */
-	public AbstractMetaDataEnabledTypeRegistry(String extPtId){
-		typeMap = new HashMap();		
-		ext_pt_id = extPtId;
-		
-		readRegistry();
-	}
-	
-	/**
-	 * @param bundleID
-	 * @param id
-	 * @param klass
-	 * @param runtimeType
-	 */
-	protected void registerType(String bundleID, String id, String klass, String runtimeType){
-		AbstractMetaDataEnabledType atype = new AbstractMetaDataEnabledType(bundleID, id, klass);
-		if (!typeMap.containsKey(atype.getTypeID())){
-			typeMap.put(atype.getTypeID(), atype);
-		}
-		else {
-			//is there any point in putting this more in the user's face?  this is really an internal error.
-			JSFCorePlugin.log(IStatus.ERROR, "Duplicate RuntimeTypeId being registered from " + ext_pt_id + ": " + atype.getTypeID()); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-	}
-	
-	/**
-	 * Return the metadata enabled type for the given id
-	 * @param id
-	 * @return type
-	 */
-	public AbstractMetaDataEnabledType getType(String id){
-		if (typeMap.containsKey(id))
-        {
-			return (AbstractMetaDataEnabledType)typeMap.get(id);
-        }
-        return null;
-	}
-
-	/**
-	 * Reads the extensions for a particular type id
-	 */
-	protected void readRegistry() {
-		try {
-			IExtensionPoint point = Platform.getExtensionRegistry().getExtensionPoint(JSFCorePlugin.PLUGIN_ID, ext_pt_id);
-			IExtension[] extensions = point.getExtensions();
-			for (int i=0;i < extensions.length;i++){
-				IExtension ext = extensions[i];
-				for (int j=0;j < ext.getConfigurationElements().length;j++){
-					final String bundleId = ext.getConfigurationElements()[j].getContributor().getName();
-					final String id = ext.getConfigurationElements()[j].getAttribute("id"); //$NON-NLS-1$
-					String klass = ext.getConfigurationElements()[j].getAttribute("class"); //$NON-NLS-1$
-					final String runtimeType = ext.getConfigurationElements()[j].getAttribute("runtime-type"); //$NON-NLS-1$
-					if (klass == null || klass.trim().equals("")){ //$NON-NLS-1$
-						klass = getDefaultClassName();
-					}
-					registerType(bundleId, id, klass, runtimeType);
-				}
-			}
-		} catch (InvalidRegistryObjectException e) {
-			JSFCorePlugin.log(e, "Unable to read " + JSFCorePlugin.PLUGIN_ID + ext_pt_id + " registry"); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-	}
-	
-	/**
-	 * @return default classname to use for the type
-	 */
-	protected abstract String getDefaultClassName();
-
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/internal/AttributeValueRuntimeTypeFactory.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/internal/AttributeValueRuntimeTypeFactory.java
deleted file mode 100644
index 78638e2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/internal/AttributeValueRuntimeTypeFactory.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.metadataprocessors.internal;
-
-import org.eclipse.jst.jsf.metadataprocessors.ITypeDescriptor;
-
-
-/**
- * Factory producing <code>IMetaDataEnabledFeature</code>s from 
- * <code>AttributeValueRuntimeType</code> objects
- * 
- * @author Gerry Kessler - Oracle
- *
- */
-public class AttributeValueRuntimeTypeFactory extends AbstractMetaDataEnabledTypeFactory{
-	
-	/**
-	 * @return the single instance... TODO: why is this allocated here if it is
-     * declared in super?
-	 */
-	public static AttributeValueRuntimeTypeFactory getInstance(){
-		if (INSTANCE == null){
-			INSTANCE = new AttributeValueRuntimeTypeFactory();	
-		}
-		return (AttributeValueRuntimeTypeFactory)INSTANCE;
-	}
-	
-	private AttributeValueRuntimeTypeFactory(){
-		super();
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.metadataprocessors.internal.AbstractMetaDataEnabledTypeFactory#getType(java.lang.String)
-	 */
-	public ITypeDescriptor getType(String typeId){ 
-		
-		return createType(AttributeValueRuntimeTypeRegistry.getInstance().getType(typeId));
-
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/internal/AttributeValueRuntimeTypeRegistry.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/internal/AttributeValueRuntimeTypeRegistry.java
deleted file mode 100644
index 93dd230..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/internal/AttributeValueRuntimeTypeRegistry.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.metadataprocessors.internal;
-
-/**
- * Registry of <code>AbstractMetaDataEnabledType</code>s that are loaded from 
- * the <code>AttributeValueRuntimeValueType</code> extension point
- * 
- * @author Gerry Kessler - Oracle
- *
- */
-public class AttributeValueRuntimeTypeRegistry extends AbstractMetaDataEnabledTypeRegistry {
-
-	private static final String EXTPTID = "AttributeValueRuntimeTypes"; //$NON-NLS-1$
-	private static final String DEFAULT_CLASS = "org.eclipse.jst.jsf.metadataprocessors.DefaultTypeDescriptor"; //$NON-NLS-1$
-	private static AttributeValueRuntimeTypeRegistry INSTANCE;
-	
-	/**
-	 * @return singleton instance
-	 */
-	public static AttributeValueRuntimeTypeRegistry getInstance(){
-		if (INSTANCE == null){
-			INSTANCE = new AttributeValueRuntimeTypeRegistry();	
-		}
-		return INSTANCE;
-	}
-	
-	private AttributeValueRuntimeTypeRegistry(){
-		super(EXTPTID);
-	}
-
-	protected String getDefaultClassName() {
-		return DEFAULT_CLASS;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/internal/IMetaDataEnabledFeatureExtension.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/internal/IMetaDataEnabledFeatureExtension.java
deleted file mode 100644
index bde9ca6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/internal/IMetaDataEnabledFeatureExtension.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.metadataprocessors.internal;
-
-/**
- * Interface used to bind feature extensions to metadata enabled types 
- *
- */
-public interface IMetaDataEnabledFeatureExtension {
-	/**
-	 * @return bundle id
-	 */
-	public String getBundleID();
-	/**
-	 * @return type id
-	 */
-	public String getTypeID();
-	/**
-	 * @return class name to use for type.   Must be located within the bundle.
-	 */
-	public String getClassName();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/internal/MetaDataEnabledFeatureAdapterFactory.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/internal/MetaDataEnabledFeatureAdapterFactory.java
deleted file mode 100644
index acf39ca..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/internal/MetaDataEnabledFeatureAdapterFactory.java
+++ /dev/null
@@ -1,158 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.metadataprocessors.internal;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.metadataprocessors.IMetaDataEnabledFeature;
-import org.eclipse.jst.jsf.metadataprocessors.IType;
-import org.eclipse.jst.jsf.metadataprocessors.ITypeDescriptor;
-import org.osgi.framework.Bundle;
-
-/**
- * Factory producing <code>IMetaDataEnabledFeature</code>s from 
- * <code>IType</code> objects that implement a specified feature
- * 
- * @author Gerry Kessler - Oracle
- *
- */
-public final class MetaDataEnabledFeatureAdapterFactory {
-	private static MetaDataEnabledFeatureAdapterFactory INSTANCE;
-	private Map<String, Class> typesCache;
-	/**
-	 * @return singleton instance
-	 */
-	public static MetaDataEnabledFeatureAdapterFactory getInstance(){
-		if (INSTANCE == null){
-			INSTANCE = new MetaDataEnabledFeatureAdapterFactory();	
-		}
-		return INSTANCE;
-	}
-	
-	private MetaDataEnabledFeatureAdapterFactory(){
-		super();
-		typesCache = new HashMap<String, Class>();
-	}
-	
-
-	/**
-	 * Given the feature extension, create and return the {@link IMetaDataEnabledFeature} for a given processing feature
-	 * @param feature
-	 * @param processingFeature class
-	 * @return IMetaDataEnabledFeature
-	 */
-	public IMetaDataEnabledFeature getFeatureAdapter(IMetaDataEnabledFeatureExtension feature, Class processingFeature){ 
-		if (feature != null){
-			return createFeature(feature, processingFeature);			
-		}
-		return null;
-	}
-
-	/**
-	 * Given the feature extension, create and return the {@link IMetaDataEnabledFeature} for a given processing feature if
-	 * that the type that the feature is bound to is a subclass of the the type
-	 * @param feature
-	 * @param processingFeature class
-	 * @param type
-	 * @return IMetaDataEnabledFeature.  <br>Will return null if the type that the feature extension is bound to, 
-	 * is not a subclass of the supplied type
-	 */
-	public IMetaDataEnabledFeature getFeatureAdapterForSubclass(IMetaDataEnabledFeatureExtension feature, Class processingFeature, IType type){ 
-		if (feature != null ){
-			ITypeDescriptor aType = AttributeValueRuntimeTypeFactory.getInstance().getType(feature.getTypeID());
-			Class klass = aType.getTypeExtension().getClass();
-			if (klass.asSubclass(type.getClass()) != null)
-				return createFeature(feature, processingFeature);			
-		}
-		return null;
-	}
-	
-//	private Class getOrCreateTypeClassFor(IMetaDataEnabledFeatureExtension featureExt){
-//		Class klass = null;
-//		String className;
-//		ITypeDescriptor type = AttributeValueRuntimeTypeFactory.getInstance().getType(featureExt.getTypeID());
-//		try {
-//			if (! typesCache.containsKey(featureExt.getTypeID())){
-//				Bundle bundle =Platform.getBundle(featureExt.getBundleID());
-//				if (bundle == null){
-//					JSFCorePlugin.log(IStatus.ERROR, featureExt.getBundleID() + " could not be created to load " + className);
-//					return null;
-//				}
-//				klass = bundle.loadClass(className);
-//				if (klass != null){
-//					typesCache.put(featureExt.getTypeID(), klass);
-//				}
-//			}
-//			else 
-//				klass = typesCache.get(featureExt.getTypeID());
-//			
-//			return klass;
-//			if (!IMetaDataEnabledFeature.class.isAssignableFrom(klass)){
-//				JSFCorePlugin.log(IStatus.INFO, className + " is not a IMetaDataEnabledFeature. " + featureExt.getBundleID() +" : " + featureExt.getTypeID());
-//			} 
-//			else if (klass != null && processingFeature.isAssignableFrom(klass)){
-//				IMetaDataEnabledFeature obj = (IMetaDataEnabledFeature)klass.newInstance();
-//				return obj;
-//			}
-//						
-//		} catch (ClassNotFoundException e) {
-//			JSFCorePlugin.log(IStatus.ERROR, className + " was not found in " + featureExt.getBundleID() +" for " + featureExt.getTypeID());
-//		} catch (InstantiationException e) {
-//			JSFCorePlugin.log(IStatus.ERROR, "InstantiationException: " + className + " in " + featureExt.getBundleID() +" for " + featureExt.getTypeID());
-//		} catch (IllegalAccessException e) {
-//			JSFCorePlugin.log(IStatus.ERROR,  "IllegalAccessException: " + className + " in " + featureExt.getBundleID() +" for " + featureExt.getTypeID());
-//		}
-//		return null;
-//	}
-	
-	private IMetaDataEnabledFeature createFeature(IMetaDataEnabledFeatureExtension featureExt, Class processingFeature){
-		String className = featureExt.getClassName();
-		Class klass = null;
-		try {
-			if (! typesCache.containsKey(featureExt.getTypeID())){
-				Bundle bundle =Platform.getBundle(featureExt.getBundleID());
-				if (bundle == null){
-					JSFCorePlugin.log(IStatus.ERROR, featureExt.getBundleID() + " could not be created to load " + className); //$NON-NLS-1$
-					return null;
-				}
-				klass = bundle.loadClass(className);
-				if (klass != null){
-					typesCache.put(featureExt.getTypeID(), klass);
-				}
-			}
-			else 
-				klass = typesCache.get(featureExt.getTypeID());
-			
-			if (!IMetaDataEnabledFeature.class.isAssignableFrom(klass)){
-				JSFCorePlugin.log(IStatus.INFO, className + " is not a IMetaDataEnabledFeature. " + featureExt.getBundleID() +" : " + featureExt.getTypeID()); //$NON-NLS-1$ //$NON-NLS-2$
-			} 
-			else if (klass != null && processingFeature.isAssignableFrom(klass)){
-				IMetaDataEnabledFeature obj = (IMetaDataEnabledFeature)klass.newInstance();
-				return obj;
-			}
-						
-		} catch (ClassNotFoundException e) {
-			JSFCorePlugin.log(IStatus.ERROR, className + " was not found in " + featureExt.getBundleID() +" for " + featureExt.getTypeID()); //$NON-NLS-1$ //$NON-NLS-2$
-		} catch (InstantiationException e) {
-			JSFCorePlugin.log(IStatus.ERROR, "InstantiationException: " + className + " in " + featureExt.getBundleID() +" for " + featureExt.getTypeID()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-		} catch (IllegalAccessException e) {
-			JSFCorePlugin.log(IStatus.ERROR,  "IllegalAccessException: " + className + " in " + featureExt.getBundleID() +" for " + featureExt.getTypeID()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-		}
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/internal/MetaDataEnabledFeatureExtension.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/internal/MetaDataEnabledFeatureExtension.java
deleted file mode 100644
index ae90a9a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/internal/MetaDataEnabledFeatureExtension.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.metadataprocessors.internal;
-
-
-/**
- * 
- * @author Gerry Kessler - Oracle
- *
- */
-public class MetaDataEnabledFeatureExtension implements IMetaDataEnabledFeatureExtension{
-
-	private String klass;
-	private String typeId;
-	private String bundleId;
-
-	MetaDataEnabledFeatureExtension(String bundleID, String typeId, String klass) {		
-		this.bundleId = bundleID;
-		this.typeId = typeId;
-		this.klass = klass;
-	}
-
-	public String getBundleID() {
-		return bundleId;
-	}
-
-	public String getClassName() {
-		return klass;
-	}
-
-	public String getTypeID() {
-		return typeId;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/internal/MetaDataEnabledFeatureRegistry.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/internal/MetaDataEnabledFeatureRegistry.java
deleted file mode 100644
index d67b537..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/internal/MetaDataEnabledFeatureRegistry.java
+++ /dev/null
@@ -1,177 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.metadataprocessors.internal;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.runtime.IExtension;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.InvalidRegistryObjectException;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.metadataprocessors.IType;
-
-/**
- * Registry of <code>AbstractMetaDataEnabledType</code>s loaded from 
- * the <code>MetaDataEnabledFeatures</code> extension point
- * 
- * A map of features keyed by type id
- *
- */
-public class MetaDataEnabledFeatureRegistry{
-	private static final String EXTPTID = "MetaDataEnabledFeatures"; //$NON-NLS-1$
-	private Map<String, List<IMetaDataEnabledFeatureExtension>> featuresMap;
-	private Map<String, Class> typeCacheMap;
-	private static MetaDataEnabledFeatureRegistry INSTANCE;
-	
-	/**
-	 * @return the singleton instance of the MetaDataEnabledFeatureRegistry
-	 */
-	public static synchronized MetaDataEnabledFeatureRegistry getInstance(){
-		if (INSTANCE == null){
-			INSTANCE = new MetaDataEnabledFeatureRegistry();	
-		}
-		return INSTANCE;
-	}
-	
-	private MetaDataEnabledFeatureRegistry(){
-		featuresMap = new HashMap<String, List<IMetaDataEnabledFeatureExtension>>();
-		typeCacheMap = new HashMap<String, Class>();
-		readRegistry();		
-	}
-	
-	/**
-	 * Reads the MetaDataEnabledFeatures extensions into a registry
-	 */
-	protected void readRegistry() {
-		try {
-			IExtensionPoint point = Platform.getExtensionRegistry().getExtensionPoint(JSFCorePlugin.PLUGIN_ID, EXTPTID);
-			IExtension[] extensions = point.getExtensions();
-			for (int i=0;i < extensions.length;i++){
-				IExtension ext = extensions[i];
-				for (int j=0;j < ext.getConfigurationElements().length;j++){
-					final String bundleId = ext.getConfigurationElements()[j].getContributor().getName();
-					final String id = ext.getConfigurationElements()[j].getAttribute("typeid"); //$NON-NLS-1$
-					final String klass = ext.getConfigurationElements()[j].getAttribute("class"); //$NON-NLS-1$
-					registerFeature(bundleId, id, klass);
-				}
-			}
-		} catch (InvalidRegistryObjectException e) {
-			JSFCorePlugin.log(e, "Unable to read " + JSFCorePlugin.PLUGIN_ID + EXTPTID + " registry"); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-	}
-	
-	/**
-	 * Create {@link IMetaDataEnabledFeatureExtension}s and add to registry
-	 * @param bundleID
-	 * @param typeId
-	 * @param klass
-	 */
-	protected void registerFeature(String bundleID, String typeId, String klass){
-		IMetaDataEnabledFeatureExtension aFeature = new MetaDataEnabledFeatureExtension(bundleID, typeId, klass);
-		if (canCreateTypeForFeatureExtension(aFeature)){
-			if (!featuresMap.containsKey(typeId)){
-				List list = new ArrayList();
-				list.add(aFeature);
-				featuresMap.put(typeId, list);
-			}
-			else {
-				List list = featuresMap.get(typeId);
-				list.add(aFeature);
-			}
-		}
-	}
-
-
-	private boolean canCreateTypeForFeatureExtension(IMetaDataEnabledFeatureExtension feature) {
-		if (! typeCacheMap.containsKey(feature.getTypeID())){
-			IType type = AttributeValueRuntimeTypeRegistry.getInstance().getType(feature.getTypeID());
-			if (type != null){
-				Class typeClass = AttributeValueRuntimeTypeFactory.getInstance().getClassForType(type);
-				typeCacheMap.put(feature.getTypeID(), typeClass);
-			}
-			else
-				return false;
-		}
-		return typeCacheMap.get(feature.getTypeID()) != null;
-	}
-
-	/**
-	 * @param typeId
-	 * @return List of <code>AbstractMetaDataEnabledRuntimeTypeExtensions</code>
-	 * for a given by type id
-	 * 
-	 * TODO: make more efficient... no need to keep calculating features for subtypes. 
-	 */
-	public List<IMetaDataEnabledFeatureExtension> getFeatures(String typeId) {
-		
-		if (!featuresMap.containsKey(typeId))
-			featuresMap.put(typeId,new ArrayList());
-		
-		//copy current featuresMapped to typeId into return list
-		List<IMetaDataEnabledFeatureExtension> srcList = featuresMap.get(typeId);
-		List<IMetaDataEnabledFeatureExtension> ret = new ArrayList<IMetaDataEnabledFeatureExtension>(srcList.size());
-		copy(ret, srcList);	
-		
-		List subs = getFeatureExtensionsForMatchingSubclass(typeId);
-		for (Iterator<IMetaDataEnabledFeatureExtension> it=subs.iterator();it.hasNext();){
-			IMetaDataEnabledFeatureExtension featureExt = it.next();
-			if (!ret.contains(featureExt))
-				ret.add(featureExt);
-		}
-		return ret;
-		
-	}
-	
-	private void copy(List<IMetaDataEnabledFeatureExtension> destList,
-			List<IMetaDataEnabledFeatureExtension> srcList) {
-		for (Iterator<IMetaDataEnabledFeatureExtension> it=srcList.iterator();it.hasNext();){
-			destList.add(it.next());
-		}
-	}
-
-	/**
-	 * If the feature adapter is mapped to a type which is a superclass of the type of interest, then the feature adapter is an extension of that type
-	 * @param typeId
-	 * @return list of IMetaDataEnabledFeatureExtension
-	 */
-	private List<IMetaDataEnabledFeatureExtension> getFeatureExtensionsForMatchingSubclass(String typeId) {	
-		IType type = AttributeValueRuntimeTypeRegistry.getInstance().getType(typeId);
-		Class typeClass = AttributeValueRuntimeTypeFactory.getInstance().getClassForType(type);
-
-		List<IMetaDataEnabledFeatureExtension> ret = new ArrayList<IMetaDataEnabledFeatureExtension>();
-		// loop thru all of the type classes mapped to feature adapters that are subclasses of the type
-		for (Iterator it=typeCacheMap.keySet().iterator();it.hasNext();){
-			String featureTypeId = (String)it.next();
-			Class featureTypeClass = typeCacheMap.get(featureTypeId);
-			try {
-//				if (featureTypeClass.equals(typeClass)){
-//					ret.add(featureTypeClass);
-//				}
-//				else 
-					if (typeClass.asSubclass(featureTypeClass) != null)	{	
-					ret.addAll(featuresMap.get(featureTypeId));
-				}						
-			} catch (ClassCastException e) {//
-			}
-			
-		}
-		return ret;
-	}
-	
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/package-info.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/package-info.java
deleted file mode 100644
index 44cf369..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/package-info.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-/**
- * Provides tooling support for taglibraries using the Design-time Metadata
- * feature (org.eclipse.jst.jsf.common.metadata).
- * <p>
- * The MetaDataEnabledProcessingFactory singleton instance is the entry point.   The tool requests
- * the IMetaDataEnabled feature for a particular tag attribute, and through metadata, will locate the 
- * "metadata processing" feature using the attribute value runtime type system.
- * <p><b>Provisional API - subject to change</b></p>
- */
-package org.eclipse.jst.jsf.metadataprocessors;
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/tagdisplay/internal/paletteinfos/PaletteInfo.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/tagdisplay/internal/paletteinfos/PaletteInfo.java
deleted file mode 100644
index d1a0597..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/tagdisplay/internal/paletteinfos/PaletteInfo.java
+++ /dev/null
@@ -1,323 +0,0 @@
-/**
- * Copyright (c) 2007 Oracle Corporation
- *
- * $Id: PaletteInfo.java,v 1.3 2008/11/18 22:23:54 gkessler Exp $
- */
-package org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Palette Info</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfo#getId <em>Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfo#getTag <em>Tag</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfo#getDisplayLabel <em>Display Label</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfo#getDescription <em>Description</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfo#getExpert <em>Expert</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfo#getHidden <em>Hidden</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfo#getSmallIcon <em>Small Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfo#getLargeIcon <em>Large Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfo#getTagCreation <em>Tag Creation</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfosPackage#getPaletteInfo()
- * @model
- * @generated
- */
-public interface PaletteInfo extends EObject {
-	/**
-	 * the trait id name
-	 */
-	public static final String TRAIT_ID				= "paletteInfo"; //$NON-NLS-1$
-	/**
-	 * the display label name
-	 */
-	public static final String TRAIT_DISPLAY_LABEL 	= "display-label"; //$NON-NLS-1$
-	/**
-	 * the trait description name
-	 */
-	public static final String TRAIT_DESCRIPTION 	= "description"; //$NON-NLS-1$
-	/**
-	 * the expert trait
-	 */
-	public static final String TRAIT_IS_EXPERT 		= "expert"; //$NON-NLS-1$
-	/**
-	 * the hiddent trait
-	 */
-	public static final String TRAIT_IS_HIDDEN 		= "hidden"; //$NON-NLS-1$
-	/**
-	 * the small icon trait
-	 */
-	public static final String TRAIT_SMALL_ICON 	= "small-icon"; //$NON-NLS-1$
-	/**
-	 * the large icon trait
-	 */
-	public static final String TRAIT_LARGE_ICON 	= "large-icon"; //$NON-NLS-1$
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2007 Oracle Corporation"; //$NON-NLS-1$
-
-	/**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfosPackage#getPaletteInfo_Id()
-	 * @model required="true"
-	 * @generated
-	 */
-	String getId();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfo#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Tag</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Tag</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Tag</em>' attribute.
-	 * @see #setTag(String)
-	 * @see org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfosPackage#getPaletteInfo_Tag()
-	 * @model
-	 * @generated
-	 */
-	String getTag();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfo#getTag <em>Tag</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Tag</em>' attribute.
-	 * @see #getTag()
-	 * @generated
-	 */
-	void setTag(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Display Label</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Display Label</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Display Label</em>' attribute.
-	 * @see #setDisplayLabel(String)
-	 * @see org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfosPackage#getPaletteInfo_DisplayLabel()
-	 * @model extendedMetaData="kind='element' name='display-label'"
-	 * @generated
-	 */
-	String getDisplayLabel();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfo#getDisplayLabel <em>Display Label</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Display Label</em>' attribute.
-	 * @see #getDisplayLabel()
-	 * @generated
-	 */
-	void setDisplayLabel(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Description</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Description</em>' attribute.
-	 * @see #setDescription(String)
-	 * @see org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfosPackage#getPaletteInfo_Description()
-	 * @model extendedMetaData="kind='element'"
-	 * @generated
-	 */
-	String getDescription();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfo#getDescription <em>Description</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Description</em>' attribute.
-	 * @see #getDescription()
-	 * @generated
-	 */
-	void setDescription(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Expert</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Expert</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Expert</em>' attribute.
-	 * @see #setExpert(Boolean)
-	 * @see org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfosPackage#getPaletteInfo_Expert()
-	 * @model extendedMetaData="kind='element'"
-	 * @generated
-	 */
-	Boolean getExpert();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfo#getExpert <em>Expert</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Expert</em>' attribute.
-	 * @see #getExpert()
-	 * @generated
-	 */
-	void setExpert(Boolean value);
-
-	/**
-	 * Returns the value of the '<em><b>Hidden</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Hidden</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Hidden</em>' attribute.
-	 * @see #setHidden(Boolean)
-	 * @see org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfosPackage#getPaletteInfo_Hidden()
-	 * @model extendedMetaData="kind='element'"
-	 * @generated
-	 */
-	Boolean getHidden();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfo#getHidden <em>Hidden</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Hidden</em>' attribute.
-	 * @see #getHidden()
-	 * @generated
-	 */
-	void setHidden(Boolean value);
-
-	/**
-	 * Returns the value of the '<em><b>Small Icon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Small Icon</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Small Icon</em>' attribute.
-	 * @see #setSmallIcon(String)
-	 * @see org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfosPackage#getPaletteInfo_SmallIcon()
-	 * @model extendedMetaData="kind='element' name='small-icon'"
-	 * @generated
-	 */
-	String getSmallIcon();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfo#getSmallIcon <em>Small Icon</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Small Icon</em>' attribute.
-	 * @see #getSmallIcon()
-	 * @generated
-	 */
-	void setSmallIcon(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Large Icon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Large Icon</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Large Icon</em>' attribute.
-	 * @see #setLargeIcon(String)
-	 * @see org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfosPackage#getPaletteInfo_LargeIcon()
-	 * @model extendedMetaData="kind='element' name='large-icon'"
-	 * @generated
-	 */
-	String getLargeIcon();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfo#getLargeIcon <em>Large Icon</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Large Icon</em>' attribute.
-	 * @see #getLargeIcon()
-	 * @generated
-	 */
-	void setLargeIcon(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Tag Creation</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Tag Creation</em>' reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Tag Creation</em>' reference.
-	 * @see #setTagCreation(TagCreationInfo)
-	 * @see org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfosPackage#getPaletteInfo_TagCreation()
-	 * @model extendedMetaData="kind='element' name='tag-create'"
-	 * @generated
-	 */
-	TagCreationInfo getTagCreation();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfo#getTagCreation <em>Tag Creation</em>}' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Tag Creation</em>' reference.
-	 * @see #getTagCreation()
-	 * @generated
-	 */
-	void setTagCreation(TagCreationInfo value);
-
-	/**
-	 * <!-- begin-user-doc -->
-     * @return true if is expert
-	 * <!-- end-user-doc -->
-	 * @model kind="operation"
-	 * @generated
-	 */
-	boolean isExpert();
-
-	/**
-	 * <!-- begin-user-doc -->
-     * @return true if is hidden 
-	 * <!-- end-user-doc -->
-	 * @model kind="operation"
-	 * @generated
-	 */
-	boolean isHidden();
-
-} // PaletteInfo
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/tagdisplay/internal/paletteinfos/PaletteInfos.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/tagdisplay/internal/paletteinfos/PaletteInfos.java
deleted file mode 100644
index 8422bf3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/tagdisplay/internal/paletteinfos/PaletteInfos.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/**
- * Copyright (c) 2007 Oracle Corporation
- *
- * $Id: PaletteInfos.java,v 1.3 2008/11/18 22:23:54 gkessler Exp $
- */
-package org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos;
-
-import org.eclipse.emf.common.util.EList;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Palette Infos</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfos#getInfos <em>Infos</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfosPackage#getPaletteInfos()
- * @model
- * @generated
- */
-public interface PaletteInfos extends EObject {
-	/**
-	 * the palette infos trait id
-	 */
-	public static final String TRAIT_ID				= "paletteInfos"; //$NON-NLS-1$
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2007 Oracle Corporation"; //$NON-NLS-1$
-
-	/**
-	 * Returns the value of the '<em><b>Infos</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfo}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Infos</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Infos</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfosPackage#getPaletteInfos_Infos()
-	 * @model type="org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfo" containment="true"
-	 *        extendedMetaData="kind='element' name='item'"
-	 * @generated
-	 */
-	EList getInfos();
-
-	/**
-	 * <!-- begin-user-doc -->
-     * @param id 
-     * @return the pallette info corresponding to id. 
-	 * <!-- end-user-doc -->
-	 * @model idRequired="true"
-	 * @generated
-	 */
-	PaletteInfo findPaletteInfoById(String id);
-
-} // PaletteInfos
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/tagdisplay/internal/paletteinfos/PaletteInfosFactory.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/tagdisplay/internal/paletteinfos/PaletteInfosFactory.java
deleted file mode 100644
index d1c9cc7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/tagdisplay/internal/paletteinfos/PaletteInfosFactory.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/**
- * Copyright (c) 2007 Oracle Corporation
- *
- * $Id: PaletteInfosFactory.java,v 1.2 2008/11/18 22:23:54 gkessler Exp $
- */
-package org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos;
-
-import org.eclipse.emf.ecore.EFactory;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Factory</b> for the model.
- * It provides a create method for each non-abstract class of the model.
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfosPackage
- * @generated
- */
-public interface PaletteInfosFactory extends EFactory {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2007 Oracle Corporation"; //$NON-NLS-1$
-
-	/**
-	 * The singleton instance of the factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	PaletteInfosFactory eINSTANCE = org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.impl.PaletteInfosFactoryImpl.init();
-
-	/**
-	 * Returns a new object of class '<em>Palette Infos</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Palette Infos</em>'.
-	 * @generated
-	 */
-	PaletteInfos createPaletteInfos();
-
-	/**
-	 * Returns a new object of class '<em>Palette Info</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Palette Info</em>'.
-	 * @generated
-	 */
-	PaletteInfo createPaletteInfo();
-
-	/**
-	 * Returns a new object of class '<em>Tag Creation Info</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Tag Creation Info</em>'.
-	 * @generated
-	 */
-	TagCreationInfo createTagCreationInfo();
-
-	/**
-	 * Returns a new object of class '<em>Tag Creation Template</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Tag Creation Template</em>'.
-	 * @generated
-	 */
-	TagCreationTemplate createTagCreationTemplate();
-
-	/**
-	 * Returns a new object of class '<em>Tag Creation Attribute</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Tag Creation Attribute</em>'.
-	 * @generated
-	 */
-	TagCreationAttribute createTagCreationAttribute();
-
-	/**
-	 * Returns the package supported by this factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the package supported by this factory.
-	 * @generated
-	 */
-	PaletteInfosPackage getPaletteInfosPackage();
-
-} //PaletteInfosFactory
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/tagdisplay/internal/paletteinfos/PaletteInfosPackage.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/tagdisplay/internal/paletteinfos/PaletteInfosPackage.java
deleted file mode 100644
index 41cb41a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/tagdisplay/internal/paletteinfos/PaletteInfosPackage.java
+++ /dev/null
@@ -1,709 +0,0 @@
-/**
- * Copyright (c) 2007 Oracle Corporation
- *
- * $Id: PaletteInfosPackage.java,v 1.2 2008/11/18 22:23:54 gkessler Exp $
- */
-package org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos;
-
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.EReference;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Package</b> for the model.
- * It contains accessors for the meta objects to represent
- * <ul>
- *   <li>each class,</li>
- *   <li>each feature of each class,</li>
- *   <li>each enum,</li>
- *   <li>and each data type</li>
- * </ul>
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfosFactory
- * @model kind="package"
- * @generated
- */
-@SuppressWarnings("hiding")
-public interface PaletteInfosPackage extends EPackage {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2007 Oracle Corporation"; //$NON-NLS-1$
-
-	/**
-	 * The package name.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String eNAME = "paletteinfos"; //$NON-NLS-1$
-
-	/**
-	 * The package namespace URI.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String eNS_URI = "http://org.eclipse.jsf.pagedesigner/paletteInfos.ecore"; //$NON-NLS-1$
-
-	/**
-	 * The package namespace name.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String eNS_PREFIX = "pi"; //$NON-NLS-1$
-
-	/**
-	 * The singleton instance of the package.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	PaletteInfosPackage eINSTANCE = org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.impl.PaletteInfosPackageImpl.init();
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.impl.PaletteInfosImpl <em>Palette Infos</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.impl.PaletteInfosImpl
-	 * @see org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.impl.PaletteInfosPackageImpl#getPaletteInfos()
-	 * @generated
-	 */
-	int PALETTE_INFOS = 0;
-
-	/**
-	 * The feature id for the '<em><b>Infos</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PALETTE_INFOS__INFOS = 0;
-
-	/**
-	 * The number of structural features of the '<em>Palette Infos</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PALETTE_INFOS_FEATURE_COUNT = 1;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.impl.PaletteInfoImpl <em>Palette Info</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.impl.PaletteInfoImpl
-	 * @see org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.impl.PaletteInfosPackageImpl#getPaletteInfo()
-	 * @generated
-	 */
-	int PALETTE_INFO = 1;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PALETTE_INFO__ID = 0;
-
-	/**
-	 * The feature id for the '<em><b>Tag</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PALETTE_INFO__TAG = 1;
-
-	/**
-	 * The feature id for the '<em><b>Display Label</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PALETTE_INFO__DISPLAY_LABEL = 2;
-
-	/**
-	 * The feature id for the '<em><b>Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PALETTE_INFO__DESCRIPTION = 3;
-
-	/**
-	 * The feature id for the '<em><b>Expert</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PALETTE_INFO__EXPERT = 4;
-
-	/**
-	 * The feature id for the '<em><b>Hidden</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PALETTE_INFO__HIDDEN = 5;
-
-	/**
-	 * The feature id for the '<em><b>Small Icon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PALETTE_INFO__SMALL_ICON = 6;
-
-	/**
-	 * The feature id for the '<em><b>Large Icon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PALETTE_INFO__LARGE_ICON = 7;
-
-	/**
-	 * The feature id for the '<em><b>Tag Creation</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PALETTE_INFO__TAG_CREATION = 8;
-
-	/**
-	 * The number of structural features of the '<em>Palette Info</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PALETTE_INFO_FEATURE_COUNT = 9;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.impl.TagCreationInfoImpl <em>Tag Creation Info</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.impl.TagCreationInfoImpl
-	 * @see org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.impl.PaletteInfosPackageImpl#getTagCreationInfo()
-	 * @generated
-	 */
-	int TAG_CREATION_INFO = 2;
-
-	/**
-	 * The feature id for the '<em><b>Attributes</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TAG_CREATION_INFO__ATTRIBUTES = 0;
-
-	/**
-	 * The feature id for the '<em><b>Template</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TAG_CREATION_INFO__TEMPLATE = 1;
-
-	/**
-	 * The number of structural features of the '<em>Tag Creation Info</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TAG_CREATION_INFO_FEATURE_COUNT = 2;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.impl.TagCreationTemplateImpl <em>Tag Creation Template</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.impl.TagCreationTemplateImpl
-	 * @see org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.impl.PaletteInfosPackageImpl#getTagCreationTemplate()
-	 * @generated
-	 */
-	int TAG_CREATION_TEMPLATE = 3;
-
-	/**
-	 * The feature id for the '<em><b>Template</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TAG_CREATION_TEMPLATE__TEMPLATE = 0;
-
-	/**
-	 * The number of structural features of the '<em>Tag Creation Template</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TAG_CREATION_TEMPLATE_FEATURE_COUNT = 1;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.impl.TagCreationAttributeImpl <em>Tag Creation Attribute</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.impl.TagCreationAttributeImpl
-	 * @see org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.impl.PaletteInfosPackageImpl#getTagCreationAttribute()
-	 * @generated
-	 */
-	int TAG_CREATION_ATTRIBUTE = 4;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TAG_CREATION_ATTRIBUTE__ID = 0;
-
-	/**
-	 * The feature id for the '<em><b>Value</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TAG_CREATION_ATTRIBUTE__VALUE = 1;
-
-	/**
-	 * The number of structural features of the '<em>Tag Creation Attribute</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TAG_CREATION_ATTRIBUTE_FEATURE_COUNT = 2;
-
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfos <em>Palette Infos</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Palette Infos</em>'.
-	 * @see org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfos
-	 * @generated
-	 */
-	EClass getPaletteInfos();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfos#getInfos <em>Infos</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Infos</em>'.
-	 * @see org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfos#getInfos()
-	 * @see #getPaletteInfos()
-	 * @generated
-	 */
-	EReference getPaletteInfos_Infos();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfo <em>Palette Info</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Palette Info</em>'.
-	 * @see org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfo
-	 * @generated
-	 */
-	EClass getPaletteInfo();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfo#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfo#getId()
-	 * @see #getPaletteInfo()
-	 * @generated
-	 */
-	EAttribute getPaletteInfo_Id();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfo#getTag <em>Tag</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Tag</em>'.
-	 * @see org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfo#getTag()
-	 * @see #getPaletteInfo()
-	 * @generated
-	 */
-	EAttribute getPaletteInfo_Tag();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfo#getDisplayLabel <em>Display Label</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Display Label</em>'.
-	 * @see org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfo#getDisplayLabel()
-	 * @see #getPaletteInfo()
-	 * @generated
-	 */
-	EAttribute getPaletteInfo_DisplayLabel();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfo#getDescription <em>Description</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Description</em>'.
-	 * @see org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfo#getDescription()
-	 * @see #getPaletteInfo()
-	 * @generated
-	 */
-	EAttribute getPaletteInfo_Description();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfo#getExpert <em>Expert</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Expert</em>'.
-	 * @see org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfo#getExpert()
-	 * @see #getPaletteInfo()
-	 * @generated
-	 */
-	EAttribute getPaletteInfo_Expert();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfo#getHidden <em>Hidden</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Hidden</em>'.
-	 * @see org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfo#getHidden()
-	 * @see #getPaletteInfo()
-	 * @generated
-	 */
-	EAttribute getPaletteInfo_Hidden();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfo#getSmallIcon <em>Small Icon</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Small Icon</em>'.
-	 * @see org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfo#getSmallIcon()
-	 * @see #getPaletteInfo()
-	 * @generated
-	 */
-	EAttribute getPaletteInfo_SmallIcon();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfo#getLargeIcon <em>Large Icon</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Large Icon</em>'.
-	 * @see org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfo#getLargeIcon()
-	 * @see #getPaletteInfo()
-	 * @generated
-	 */
-	EAttribute getPaletteInfo_LargeIcon();
-
-	/**
-	 * Returns the meta object for the reference '{@link org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfo#getTagCreation <em>Tag Creation</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference '<em>Tag Creation</em>'.
-	 * @see org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfo#getTagCreation()
-	 * @see #getPaletteInfo()
-	 * @generated
-	 */
-	EReference getPaletteInfo_TagCreation();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.TagCreationInfo <em>Tag Creation Info</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Tag Creation Info</em>'.
-	 * @see org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.TagCreationInfo
-	 * @generated
-	 */
-	EClass getTagCreationInfo();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.TagCreationInfo#getAttributes <em>Attributes</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Attributes</em>'.
-	 * @see org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.TagCreationInfo#getAttributes()
-	 * @see #getTagCreationInfo()
-	 * @generated
-	 */
-	EReference getTagCreationInfo_Attributes();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.TagCreationInfo#getTemplate <em>Template</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Template</em>'.
-	 * @see org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.TagCreationInfo#getTemplate()
-	 * @see #getTagCreationInfo()
-	 * @generated
-	 */
-	EAttribute getTagCreationInfo_Template();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.TagCreationTemplate <em>Tag Creation Template</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Tag Creation Template</em>'.
-	 * @see org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.TagCreationTemplate
-	 * @generated
-	 */
-	EClass getTagCreationTemplate();
-
-	/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.TagCreationTemplate#getTemplate <em>Template</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Template</em>'.
-	 * @see org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.TagCreationTemplate#getTemplate()
-	 * @see #getTagCreationTemplate()
-	 * @generated
-	 */
-	EReference getTagCreationTemplate_Template();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.TagCreationAttribute <em>Tag Creation Attribute</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Tag Creation Attribute</em>'.
-	 * @see org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.TagCreationAttribute
-	 * @generated
-	 */
-	EClass getTagCreationAttribute();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.TagCreationAttribute#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.TagCreationAttribute#getId()
-	 * @see #getTagCreationAttribute()
-	 * @generated
-	 */
-	EAttribute getTagCreationAttribute_Id();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.TagCreationAttribute#getValue <em>Value</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Value</em>'.
-	 * @see org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.TagCreationAttribute#getValue()
-	 * @see #getTagCreationAttribute()
-	 * @generated
-	 */
-	EAttribute getTagCreationAttribute_Value();
-
-	/**
-	 * Returns the factory that creates the instances of the model.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the factory that creates the instances of the model.
-	 * @generated
-	 */
-	PaletteInfosFactory getPaletteInfosFactory();
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * Defines literals for the meta objects that represent
-	 * <ul>
-	 *   <li>each class,</li>
-	 *   <li>each feature of each class,</li>
-	 *   <li>each enum,</li>
-	 *   <li>and each data type</li>
-	 * </ul>
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	interface Literals {
-		/**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.impl.PaletteInfosImpl <em>Palette Infos</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.impl.PaletteInfosImpl
-		 * @see org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.impl.PaletteInfosPackageImpl#getPaletteInfos()
-		 * @generated
-		 */
-		EClass PALETTE_INFOS = eINSTANCE.getPaletteInfos();
-
-		/**
-		 * The meta object literal for the '<em><b>Infos</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference PALETTE_INFOS__INFOS = eINSTANCE.getPaletteInfos_Infos();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.impl.PaletteInfoImpl <em>Palette Info</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.impl.PaletteInfoImpl
-		 * @see org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.impl.PaletteInfosPackageImpl#getPaletteInfo()
-		 * @generated
-		 */
-		EClass PALETTE_INFO = eINSTANCE.getPaletteInfo();
-
-		/**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute PALETTE_INFO__ID = eINSTANCE.getPaletteInfo_Id();
-
-		/**
-		 * The meta object literal for the '<em><b>Tag</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute PALETTE_INFO__TAG = eINSTANCE.getPaletteInfo_Tag();
-
-		/**
-		 * The meta object literal for the '<em><b>Display Label</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute PALETTE_INFO__DISPLAY_LABEL = eINSTANCE.getPaletteInfo_DisplayLabel();
-
-		/**
-		 * The meta object literal for the '<em><b>Description</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute PALETTE_INFO__DESCRIPTION = eINSTANCE.getPaletteInfo_Description();
-
-		/**
-		 * The meta object literal for the '<em><b>Expert</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute PALETTE_INFO__EXPERT = eINSTANCE.getPaletteInfo_Expert();
-
-		/**
-		 * The meta object literal for the '<em><b>Hidden</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute PALETTE_INFO__HIDDEN = eINSTANCE.getPaletteInfo_Hidden();
-
-		/**
-		 * The meta object literal for the '<em><b>Small Icon</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute PALETTE_INFO__SMALL_ICON = eINSTANCE.getPaletteInfo_SmallIcon();
-
-		/**
-		 * The meta object literal for the '<em><b>Large Icon</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute PALETTE_INFO__LARGE_ICON = eINSTANCE.getPaletteInfo_LargeIcon();
-
-		/**
-		 * The meta object literal for the '<em><b>Tag Creation</b></em>' reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference PALETTE_INFO__TAG_CREATION = eINSTANCE.getPaletteInfo_TagCreation();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.impl.TagCreationInfoImpl <em>Tag Creation Info</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.impl.TagCreationInfoImpl
-		 * @see org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.impl.PaletteInfosPackageImpl#getTagCreationInfo()
-		 * @generated
-		 */
-		EClass TAG_CREATION_INFO = eINSTANCE.getTagCreationInfo();
-
-		/**
-		 * The meta object literal for the '<em><b>Attributes</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference TAG_CREATION_INFO__ATTRIBUTES = eINSTANCE.getTagCreationInfo_Attributes();
-
-		/**
-		 * The meta object literal for the '<em><b>Template</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute TAG_CREATION_INFO__TEMPLATE = eINSTANCE.getTagCreationInfo_Template();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.impl.TagCreationTemplateImpl <em>Tag Creation Template</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.impl.TagCreationTemplateImpl
-		 * @see org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.impl.PaletteInfosPackageImpl#getTagCreationTemplate()
-		 * @generated
-		 */
-		EClass TAG_CREATION_TEMPLATE = eINSTANCE.getTagCreationTemplate();
-
-		/**
-		 * The meta object literal for the '<em><b>Template</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference TAG_CREATION_TEMPLATE__TEMPLATE = eINSTANCE.getTagCreationTemplate_Template();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.impl.TagCreationAttributeImpl <em>Tag Creation Attribute</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.impl.TagCreationAttributeImpl
-		 * @see org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.impl.PaletteInfosPackageImpl#getTagCreationAttribute()
-		 * @generated
-		 */
-		EClass TAG_CREATION_ATTRIBUTE = eINSTANCE.getTagCreationAttribute();
-
-		/**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute TAG_CREATION_ATTRIBUTE__ID = eINSTANCE.getTagCreationAttribute_Id();
-
-		/**
-		 * The meta object literal for the '<em><b>Value</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute TAG_CREATION_ATTRIBUTE__VALUE = eINSTANCE.getTagCreationAttribute_Value();
-
-	}
-
-} //PaletteInfosPackage
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/tagdisplay/internal/paletteinfos/TagCreationAttribute.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/tagdisplay/internal/paletteinfos/TagCreationAttribute.java
deleted file mode 100644
index 16e3092..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/tagdisplay/internal/paletteinfos/TagCreationAttribute.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/**
- * Copyright (c) 2007 Oracle Corporation
- *
- * $Id: TagCreationAttribute.java,v 1.2 2008/11/18 22:23:54 gkessler Exp $
- */
-package org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Tag Creation Attribute</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.TagCreationAttribute#getId <em>Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.TagCreationAttribute#getValue <em>Value</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfosPackage#getTagCreationAttribute()
- * @model
- * @generated
- */
-public interface TagCreationAttribute extends EObject {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2007 Oracle Corporation"; //$NON-NLS-1$
-
-	/**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfosPackage#getTagCreationAttribute_Id()
-	 * @model required="true"
-	 * @generated
-	 */
-	String getId();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.TagCreationAttribute#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Value</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Value</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Value</em>' attribute.
-	 * @see #setValue(String)
-	 * @see org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfosPackage#getTagCreationAttribute_Value()
-	 * @model
-	 * @generated
-	 */
-	String getValue();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.TagCreationAttribute#getValue <em>Value</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Value</em>' attribute.
-	 * @see #getValue()
-	 * @generated
-	 */
-	void setValue(String value);
-
-} // TagCreationAttribute
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/tagdisplay/internal/paletteinfos/TagCreationInfo.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/tagdisplay/internal/paletteinfos/TagCreationInfo.java
deleted file mode 100644
index 9c4635a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/tagdisplay/internal/paletteinfos/TagCreationInfo.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/**
- * Copyright (c) 2007 Oracle Corporation
- *
- * $Id: TagCreationInfo.java,v 1.2 2008/11/18 22:23:54 gkessler Exp $
- */
-package org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos;
-
-import org.eclipse.emf.common.util.EList;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Tag Creation Info</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.TagCreationInfo#getAttributes <em>Attributes</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.TagCreationInfo#getTemplate <em>Template</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfosPackage#getTagCreationInfo()
- * @model
- * @generated
- */
-public interface TagCreationInfo extends EObject {
-	/**
-	 * the name of the trait id
-	 */
-	public static final String TRAIT_ID = "tag-create"; //$NON-NLS-1$
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2007 Oracle Corporation"; //$NON-NLS-1$
-
-	/**
-	 * Returns the value of the '<em><b>Attributes</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.TagCreationAttribute}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Attributes</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Attributes</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfosPackage#getTagCreationInfo_Attributes()
-	 * @model type="org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.TagCreationAttribute" containment="true"
-	 *        extendedMetaData="kind='element' name='attribute'"
-	 * @generated
-	 */
-	EList getAttributes();
-
-	/**
-	 * Returns the value of the '<em><b>Template</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Template</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Template</em>' attribute.
-	 * @see #setTemplate(Object)
-	 * @see org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfosPackage#getTagCreationInfo_Template()
-	 * @model dataType="org.eclipse.emf.ecore.xml.type.AnySimpleType"
-	 * @generated
-	 */
-	Object getTemplate();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.TagCreationInfo#getTemplate <em>Template</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Template</em>' attribute.
-	 * @see #getTemplate()
-	 * @generated
-	 */
-	void setTemplate(Object value);
-
-} // TagCreationInfo
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/tagdisplay/internal/paletteinfos/TagCreationTemplate.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/tagdisplay/internal/paletteinfos/TagCreationTemplate.java
deleted file mode 100644
index 0037bf1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/tagdisplay/internal/paletteinfos/TagCreationTemplate.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/**
- * Copyright (c) 2007 Oracle Corporation
- *
- * $Id: TagCreationTemplate.java,v 1.2 2008/11/18 22:23:54 gkessler Exp $
- */
-package org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Tag Creation Template</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.TagCreationTemplate#getTemplate <em>Template</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfosPackage#getTagCreationTemplate()
- * @model
- * @generated
- */
-public interface TagCreationTemplate extends EObject {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2007 Oracle Corporation"; //$NON-NLS-1$
-
-	/**
-	 * Returns the value of the '<em><b>Template</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Template</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Template</em>' containment reference.
-	 * @see #setTemplate(EObject)
-	 * @see org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfosPackage#getTagCreationTemplate_Template()
-	 * @model containment="true"
-	 * @generated
-	 */
-	EObject getTemplate();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.TagCreationTemplate#getTemplate <em>Template</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Template</em>' containment reference.
-	 * @see #getTemplate()
-	 * @generated
-	 */
-	void setTemplate(EObject value);
-
-} // TagCreationTemplate
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/tagdisplay/internal/paletteinfos/impl/PaletteInfoImpl.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/tagdisplay/internal/paletteinfos/impl/PaletteInfoImpl.java
deleted file mode 100644
index 7b13fe4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/tagdisplay/internal/paletteinfos/impl/PaletteInfoImpl.java
+++ /dev/null
@@ -1,727 +0,0 @@
-/**
- * Copyright (c) 2007 Oracle Corporation
- *
- * $Id: PaletteInfoImpl.java,v 1.2 2008/11/18 22:24:03 gkessler Exp $
- */
-package org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.impl;
-
-import java.util.Iterator;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.common.metadata.Entity;
-import org.eclipse.jst.jsf.common.metadata.Model;
-import org.eclipse.jst.jsf.common.metadata.Trait;
-import org.eclipse.jst.jsf.common.metadata.internal.TraitValueHelper;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfo;
-import org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfosPackage;
-import org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.TagCreationInfo;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Palette Info</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.impl.PaletteInfoImpl#getId <em>Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.impl.PaletteInfoImpl#getTag() <em>Tag</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.impl.PaletteInfoImpl#getDisplayLabel <em>Display Label</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.impl.PaletteInfoImpl#getDescription <em>Description</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.impl.PaletteInfoImpl#getExpert <em>Expert</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.impl.PaletteInfoImpl#getHidden <em>Hidden</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.impl.PaletteInfoImpl#getSmallIcon <em>Small Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.impl.PaletteInfoImpl#getLargeIcon <em>Large Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.impl.PaletteInfoImpl#getTagCreation <em>Tag Creation</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class PaletteInfoImpl extends EObjectImpl implements PaletteInfo {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2007 Oracle Corporation"; //$NON-NLS-1$
-
-	/**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getTag() <em>Tag</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTag()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TAG_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getTag() <em>Tag</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTag()
-	 * @generated
-	 * @ordered
-	 */
-	protected String tag = TAG_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getDisplayLabel() <em>Display Label</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDisplayLabel()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String DISPLAY_LABEL_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getDisplayLabel() <em>Display Label</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDisplayLabel()
-	 * @generated
-	 * @ordered
-	 */
-	protected String displayLabel = DISPLAY_LABEL_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getDescription() <em>Description</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDescription()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String DESCRIPTION_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getDescription() <em>Description</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDescription()
-	 * @generated
-	 * @ordered
-	 */
-	protected String description = DESCRIPTION_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getExpert() <em>Expert</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getExpert()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Boolean EXPERT_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getExpert() <em>Expert</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getExpert()
-	 * @generated
-	 * @ordered
-	 */
-	protected Boolean expert = EXPERT_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getHidden() <em>Hidden</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getHidden()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Boolean HIDDEN_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getHidden() <em>Hidden</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getHidden()
-	 * @generated
-	 * @ordered
-	 */
-	protected Boolean hidden = HIDDEN_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getSmallIcon() <em>Small Icon</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getSmallIcon()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String SMALL_ICON_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getSmallIcon() <em>Small Icon</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getSmallIcon()
-	 * @generated
-	 * @ordered
-	 */
-	protected String smallIcon = SMALL_ICON_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getLargeIcon() <em>Large Icon</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getLargeIcon()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String LARGE_ICON_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getLargeIcon() <em>Large Icon</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getLargeIcon()
-	 * @generated
-	 * @ordered
-	 */
-	protected String largeIcon = LARGE_ICON_EDEFAULT;
-
-	/**
-	 * The cached value of the '{@link #getTagCreation() <em>Tag Creation</em>}' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTagCreation()
-	 * @generated
-	 * @ordered
-	 */
-	protected TagCreationInfo tagCreation = null;
-
-	private Entity _tag;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected PaletteInfoImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return PaletteInfosPackage.Literals.PALETTE_INFO;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, PaletteInfosPackage.PALETTE_INFO__ID, oldId, id));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String getTag() {
-		return tag != null ? tag : getId();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTag(String newTag) {
-		String oldTag = tag;
-		tag = newTag;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, PaletteInfosPackage.PALETTE_INFO__TAG, oldTag, tag));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String getDisplayLabel() {
-		if (displayLabel == null){
-			return getTagTraitValueAsString(getTag(), TRAIT_DISPLAY_LABEL);
-		}
-		return getNLSedValue(displayLabel);
-	}
-
-	private String getNLSedValue(final String rawValue) {		
-		String value = TraitValueHelper.getNLSValue((Trait)this.eContainer.eContainer(), rawValue);								
-		return value;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	private String getTagTraitValueAsString(final String _id, final String traitKey) {
-		EObject obj = getTagTraitValue(getTag(), traitKey);
-		if (obj != null){
-			return TraitValueHelper.getValueAsString((Trait)obj.eContainer());
-		}
-		return null;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	private EObject getTagTraitValue(final String tagName, final String traitKey) {
-		Entity tag_ = getTag(tagName);
-		if (tag_ != null){
-			for (Iterator it=tag_.getTraits().iterator();it.hasNext();){
-				Trait trait = (Trait)it.next();
-				if (traitKey.equals(trait.getId()))
-					return trait.getValue(); 	
-			}
-		}
-		return null;
-	}
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	private Entity getTag(String tagName) {
-		if (_tag == null){
-			//rely on PaletteInfos objects being inside a Model trait only			
-			try {
-				Model model = (Model)this.eContainer().eContainer().eContainer();
-				//we could probably do better than this... oh well
-                //FIXME: C.B: this is really bad! We could probably do better than
-                // write code that expects to throw ClassCastExceptions and then hides them?  I hope so!
-				_tag = findTag(model, tagName);
-			} catch (ClassCastException e) {		
-//			    PDPlugin.getLogger(getClass()).error(e);
-				JSFCorePlugin.log(e, "ClassCastException in getTag() for " + tagName); //$NON-NLS-1$
-				return null;
-			}
-		}
-		return _tag;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	private Entity findTag(Model model, String tagid) {
-		for (Iterator it=model.getChildEntities().iterator();it.hasNext();){
-			Entity tag_ = (Entity)it.next();
-			if (tagid.equals(tag_.getId()))
-					return tag_;
-		}
-		return null;
-	}
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setDisplayLabel(String newDisplayLabel) {
-		String oldDisplayLabel = displayLabel;
-		displayLabel = newDisplayLabel;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, PaletteInfosPackage.PALETTE_INFO__DISPLAY_LABEL, oldDisplayLabel, displayLabel));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String getDescription() {
-		if (description == null){
-			return getTagTraitValueAsString(getId(), TRAIT_DESCRIPTION);
-		}
-		return getNLSedValue(description);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setDescription(String newDescription) {
-		String oldDescription = description;
-		description = newDescription;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, PaletteInfosPackage.PALETTE_INFO__DESCRIPTION, oldDescription, description));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Boolean getExpert() {
-		return expert;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setExpert(Boolean newExpert) {
-		Boolean oldExpert = expert;
-		expert = newExpert;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, PaletteInfosPackage.PALETTE_INFO__EXPERT, oldExpert, expert));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Boolean getHidden() {
-		return hidden;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setHidden(Boolean newHidden) {
-		Boolean oldHidden = hidden;
-		hidden = newHidden;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, PaletteInfosPackage.PALETTE_INFO__HIDDEN, oldHidden, hidden));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String getSmallIcon() {
-		if (smallIcon == null){
-			return getTagTraitValueAsString(getId(), TRAIT_SMALL_ICON);
-		}
-		return smallIcon;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setSmallIcon(String newSmallIcon) {
-		String oldSmallIcon = smallIcon;
-		smallIcon = newSmallIcon;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, PaletteInfosPackage.PALETTE_INFO__SMALL_ICON, oldSmallIcon, smallIcon));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String getLargeIcon() {
-		if (largeIcon == null){
-			return getTagTraitValueAsString(getId(), TRAIT_LARGE_ICON);
-		}
-		return largeIcon;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setLargeIcon(String newLargeIcon) {
-		String oldLargeIcon = largeIcon;
-		largeIcon = newLargeIcon;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, PaletteInfosPackage.PALETTE_INFO__LARGE_ICON, oldLargeIcon, largeIcon));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public TagCreationInfo getTagCreation() {
-		if (tagCreation != null && tagCreation.eIsProxy()) {
-			InternalEObject oldTagCreation = (InternalEObject)tagCreation;
-			tagCreation = (TagCreationInfo)eResolveProxy(oldTagCreation);
-			if (tagCreation != oldTagCreation) {
-				if (eNotificationRequired())
-					eNotify(new ENotificationImpl(this, Notification.RESOLVE, PaletteInfosPackage.PALETTE_INFO__TAG_CREATION, oldTagCreation, tagCreation));
-			}
-		}
-		else if (tagCreation == null){
-			//delegate to entity if it exists
-			return (TagCreationInfo)getTagTraitValue(getTag(), "tag-create"); //$NON-NLS-1$
-		}
-		return tagCreation;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-     * @return the tag creation info 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public TagCreationInfo basicGetTagCreation() {
-		return tagCreation;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTagCreation(TagCreationInfo newTagCreation) {
-		TagCreationInfo oldTagCreation = tagCreation;
-		tagCreation = newTagCreation;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, PaletteInfosPackage.PALETTE_INFO__TAG_CREATION, oldTagCreation, tagCreation));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public boolean isExpert() {
-		if (expert == null){
-			String val = getTagTraitValueAsString(getId(), "expert"); //$NON-NLS-1$
-			return Boolean.valueOf(val).booleanValue();			
-		}
-		return expert.booleanValue();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public boolean isHidden() {
-		if (hidden == null){
-			String val = getTagTraitValueAsString(getId(), "hidden"); //$NON-NLS-1$
-			return Boolean.valueOf(val).booleanValue();	
-		}
-		return hidden.booleanValue();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case PaletteInfosPackage.PALETTE_INFO__ID:
-				return getId();
-			case PaletteInfosPackage.PALETTE_INFO__TAG:
-				return getTag();
-			case PaletteInfosPackage.PALETTE_INFO__DISPLAY_LABEL:
-				return getDisplayLabel();
-			case PaletteInfosPackage.PALETTE_INFO__DESCRIPTION:
-				return getDescription();
-			case PaletteInfosPackage.PALETTE_INFO__EXPERT:
-				return getExpert();
-			case PaletteInfosPackage.PALETTE_INFO__HIDDEN:
-				return getHidden();
-			case PaletteInfosPackage.PALETTE_INFO__SMALL_ICON:
-				return getSmallIcon();
-			case PaletteInfosPackage.PALETTE_INFO__LARGE_ICON:
-				return getLargeIcon();
-			case PaletteInfosPackage.PALETTE_INFO__TAG_CREATION:
-				if (resolve) return getTagCreation();
-				return basicGetTagCreation();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case PaletteInfosPackage.PALETTE_INFO__ID:
-				setId((String)newValue);
-				return;
-			case PaletteInfosPackage.PALETTE_INFO__TAG:
-				setTag((String)newValue);
-				return;
-			case PaletteInfosPackage.PALETTE_INFO__DISPLAY_LABEL:
-				setDisplayLabel((String)newValue);
-				return;
-			case PaletteInfosPackage.PALETTE_INFO__DESCRIPTION:
-				setDescription((String)newValue);
-				return;
-			case PaletteInfosPackage.PALETTE_INFO__EXPERT:
-				setExpert((Boolean)newValue);
-				return;
-			case PaletteInfosPackage.PALETTE_INFO__HIDDEN:
-				setHidden((Boolean)newValue);
-				return;
-			case PaletteInfosPackage.PALETTE_INFO__SMALL_ICON:
-				setSmallIcon((String)newValue);
-				return;
-			case PaletteInfosPackage.PALETTE_INFO__LARGE_ICON:
-				setLargeIcon((String)newValue);
-				return;
-			case PaletteInfosPackage.PALETTE_INFO__TAG_CREATION:
-				setTagCreation((TagCreationInfo)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case PaletteInfosPackage.PALETTE_INFO__ID:
-				setId(ID_EDEFAULT);
-				return;
-			case PaletteInfosPackage.PALETTE_INFO__TAG:
-				setTag(TAG_EDEFAULT);
-				return;
-			case PaletteInfosPackage.PALETTE_INFO__DISPLAY_LABEL:
-				setDisplayLabel(DISPLAY_LABEL_EDEFAULT);
-				return;
-			case PaletteInfosPackage.PALETTE_INFO__DESCRIPTION:
-				setDescription(DESCRIPTION_EDEFAULT);
-				return;
-			case PaletteInfosPackage.PALETTE_INFO__EXPERT:
-				setExpert(EXPERT_EDEFAULT);
-				return;
-			case PaletteInfosPackage.PALETTE_INFO__HIDDEN:
-				setHidden(HIDDEN_EDEFAULT);
-				return;
-			case PaletteInfosPackage.PALETTE_INFO__SMALL_ICON:
-				setSmallIcon(SMALL_ICON_EDEFAULT);
-				return;
-			case PaletteInfosPackage.PALETTE_INFO__LARGE_ICON:
-				setLargeIcon(LARGE_ICON_EDEFAULT);
-				return;
-			case PaletteInfosPackage.PALETTE_INFO__TAG_CREATION:
-				setTagCreation((TagCreationInfo)null);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case PaletteInfosPackage.PALETTE_INFO__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-			case PaletteInfosPackage.PALETTE_INFO__TAG:
-				return TAG_EDEFAULT == null ? tag != null : !TAG_EDEFAULT.equals(tag);
-			case PaletteInfosPackage.PALETTE_INFO__DISPLAY_LABEL:
-				return DISPLAY_LABEL_EDEFAULT == null ? displayLabel != null : !DISPLAY_LABEL_EDEFAULT.equals(displayLabel);
-			case PaletteInfosPackage.PALETTE_INFO__DESCRIPTION:
-				return DESCRIPTION_EDEFAULT == null ? description != null : !DESCRIPTION_EDEFAULT.equals(description);
-			case PaletteInfosPackage.PALETTE_INFO__EXPERT:
-				return EXPERT_EDEFAULT == null ? expert != null : !EXPERT_EDEFAULT.equals(expert);
-			case PaletteInfosPackage.PALETTE_INFO__HIDDEN:
-				return HIDDEN_EDEFAULT == null ? hidden != null : !HIDDEN_EDEFAULT.equals(hidden);
-			case PaletteInfosPackage.PALETTE_INFO__SMALL_ICON:
-				return SMALL_ICON_EDEFAULT == null ? smallIcon != null : !SMALL_ICON_EDEFAULT.equals(smallIcon);
-			case PaletteInfosPackage.PALETTE_INFO__LARGE_ICON:
-				return LARGE_ICON_EDEFAULT == null ? largeIcon != null : !LARGE_ICON_EDEFAULT.equals(largeIcon);
-			case PaletteInfosPackage.PALETTE_INFO__TAG_CREATION:
-				return tagCreation != null;
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(", tag: "); //$NON-NLS-1$
-		result.append(tag);
-		result.append(", displayLabel: "); //$NON-NLS-1$
-		result.append(displayLabel);
-		result.append(", description: "); //$NON-NLS-1$
-		result.append(description);
-		result.append(", expert: "); //$NON-NLS-1$
-		result.append(expert);
-		result.append(", hidden: "); //$NON-NLS-1$
-		result.append(hidden);
-		result.append(", smallIcon: "); //$NON-NLS-1$
-		result.append(smallIcon);
-		result.append(", largeIcon: "); //$NON-NLS-1$
-		result.append(largeIcon);
-		result.append(')');
-		return result.toString();
-	}
-
-} //PaletteInfoImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/tagdisplay/internal/paletteinfos/impl/PaletteInfosFactoryImpl.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/tagdisplay/internal/paletteinfos/impl/PaletteInfosFactoryImpl.java
deleted file mode 100644
index 6bed256..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/tagdisplay/internal/paletteinfos/impl/PaletteInfosFactoryImpl.java
+++ /dev/null
@@ -1,152 +0,0 @@
-/**
- * Copyright (c) 2007 Oracle Corporation
- *
- * $Id: PaletteInfosFactoryImpl.java,v 1.2 2008/11/18 22:24:03 gkessler Exp $
- */
-package org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.impl.EFactoryImpl;
-import org.eclipse.emf.ecore.plugin.EcorePlugin;
-import org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfo;
-import org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfos;
-import org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfosFactory;
-import org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfosPackage;
-import org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.TagCreationAttribute;
-import org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.TagCreationInfo;
-import org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.TagCreationTemplate;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model <b>Factory</b>.
- * <!-- end-user-doc -->
- * @generated
- */
-public class PaletteInfosFactoryImpl extends EFactoryImpl implements PaletteInfosFactory {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2007 Oracle Corporation"; //$NON-NLS-1$
-
-	/**
-	 * Creates the default factory implementation.
-	 * <!-- begin-user-doc -->
-     * @return the palette info factory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static PaletteInfosFactory init() {
-		try {
-			PaletteInfosFactory thePaletteInfosFactory = (PaletteInfosFactory)EPackage.Registry.INSTANCE.getEFactory("http://org.eclipse.jsf.pagedesigner/paletteInfos.ecore");  //$NON-NLS-1$
-			if (thePaletteInfosFactory != null) {
-				return thePaletteInfosFactory;
-			}
-		}
-		catch (Exception exception) {
-			EcorePlugin.INSTANCE.log(exception);
-		}
-		return new PaletteInfosFactoryImpl();
-	}
-
-	/**
-	 * Creates an instance of the factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public PaletteInfosFactoryImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EObject create(EClass eClass) {
-		switch (eClass.getClassifierID()) {
-			case PaletteInfosPackage.PALETTE_INFOS: return createPaletteInfos();
-			case PaletteInfosPackage.PALETTE_INFO: return createPaletteInfo();
-			case PaletteInfosPackage.TAG_CREATION_INFO: return createTagCreationInfo();
-			case PaletteInfosPackage.TAG_CREATION_TEMPLATE: return createTagCreationTemplate();
-			case PaletteInfosPackage.TAG_CREATION_ATTRIBUTE: return createTagCreationAttribute();
-			default:
-				throw new IllegalArgumentException("The class '" + eClass.getName() + "' is not a valid classifier"); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public PaletteInfo createPaletteInfo() {
-		PaletteInfoImpl paletteInfo = new PaletteInfoImpl();
-		return paletteInfo;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public TagCreationInfo createTagCreationInfo() {
-		TagCreationInfoImpl tagCreationInfo = new TagCreationInfoImpl();
-		return tagCreationInfo;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public TagCreationTemplate createTagCreationTemplate() {
-		TagCreationTemplateImpl tagCreationTemplate = new TagCreationTemplateImpl();
-		return tagCreationTemplate;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public TagCreationAttribute createTagCreationAttribute() {
-		TagCreationAttributeImpl tagCreationAttribute = new TagCreationAttributeImpl();
-		return tagCreationAttribute;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public PaletteInfos createPaletteInfos() {
-		PaletteInfosImpl paletteInfos = new PaletteInfosImpl();
-		return paletteInfos;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public PaletteInfosPackage getPaletteInfosPackage() {
-		return (PaletteInfosPackage)getEPackage();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-     * @return the palette info package 
-	 * <!-- end-user-doc -->
-	 * @deprecated
-	 * @generated
-	 */
-	public static PaletteInfosPackage getPackage() {
-		return PaletteInfosPackage.eINSTANCE;
-	}
-
-} //PaletteInfosFactoryImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/tagdisplay/internal/paletteinfos/impl/PaletteInfosImpl.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/tagdisplay/internal/paletteinfos/impl/PaletteInfosImpl.java
deleted file mode 100644
index 47f7dd8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/tagdisplay/internal/paletteinfos/impl/PaletteInfosImpl.java
+++ /dev/null
@@ -1,165 +0,0 @@
-/**
- * Copyright (c) 2007 Oracle Corporation
- *
- * $Id: PaletteInfosImpl.java,v 1.2 2008/11/18 22:24:03 gkessler Exp $
- */
-package org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.impl;
-
-import java.util.Collection;
-import java.util.Iterator;
-
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfo;
-import org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfos;
-import org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfosPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Palette Infos</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.impl.PaletteInfosImpl#getInfos <em>Infos</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class PaletteInfosImpl extends EObjectImpl implements PaletteInfos {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2007 Oracle Corporation"; //$NON-NLS-1$
-
-	/**
-	 * The cached value of the '{@link #getInfos() <em>Infos</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getInfos()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList infos;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected PaletteInfosImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return PaletteInfosPackage.Literals.PALETTE_INFOS;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getInfos() {
-		if (infos == null) {
-			infos = new EObjectContainmentEList(PaletteInfo.class, this, PaletteInfosPackage.PALETTE_INFOS__INFOS);
-		}
-		return infos;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public PaletteInfo findPaletteInfoById(String id) {
-		for (Iterator it=getInfos().iterator();it.hasNext();){
-			PaletteInfo info = (PaletteInfo)it.next();
-			if (id.equals(info.getId()))
-				return info;
-		}
-		return null;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case PaletteInfosPackage.PALETTE_INFOS__INFOS:
-				return ((InternalEList)getInfos()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case PaletteInfosPackage.PALETTE_INFOS__INFOS:
-				return getInfos();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case PaletteInfosPackage.PALETTE_INFOS__INFOS:
-				getInfos().clear();
-				getInfos().addAll((Collection)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case PaletteInfosPackage.PALETTE_INFOS__INFOS:
-				getInfos().clear();
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case PaletteInfosPackage.PALETTE_INFOS__INFOS:
-				return infos != null && !infos.isEmpty();
-		}
-		return super.eIsSet(featureID);
-	}
-
-} //PaletteInfosImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/tagdisplay/internal/paletteinfos/impl/PaletteInfosPackageImpl.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/tagdisplay/internal/paletteinfos/impl/PaletteInfosPackageImpl.java
deleted file mode 100644
index e4bf561..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/tagdisplay/internal/paletteinfos/impl/PaletteInfosPackageImpl.java
+++ /dev/null
@@ -1,520 +0,0 @@
-/**
- * Copyright (c) 2007 Oracle Corporation
- *
- * $Id: PaletteInfosPackageImpl.java,v 1.2 2008/11/18 22:24:03 gkessler Exp $
- */
-package org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.impl;
-
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EOperation;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.EReference;
-
-import org.eclipse.emf.ecore.impl.EPackageImpl;
-
-import org.eclipse.emf.ecore.xml.type.XMLTypePackage;
-
-import org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfo;
-import org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfos;
-import org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfosFactory;
-import org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfosPackage;
-import org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.TagCreationAttribute;
-import org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.TagCreationInfo;
-import org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.TagCreationTemplate;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model <b>Package</b>.
- * <!-- end-user-doc -->
- * @generated
- */
-public class PaletteInfosPackageImpl extends EPackageImpl implements PaletteInfosPackage {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2007 Oracle Corporation"; //$NON-NLS-1$
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass paletteInfosEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass paletteInfoEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass tagCreationInfoEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass tagCreationTemplateEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass tagCreationAttributeEClass = null;
-
-	/**
-	 * Creates an instance of the model <b>Package</b>, registered with
-	 * {@link org.eclipse.emf.ecore.EPackage.Registry EPackage.Registry} by the package
-	 * package URI value.
-	 * <p>Note: the correct way to create the package is via the static
-	 * factory method {@link #init init()}, which also performs
-	 * initialization of the package, or returns the registered package,
-	 * if one already exists.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.emf.ecore.EPackage.Registry
-	 * @see org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfosPackage#eNS_URI
-	 * @see #init()
-	 * @generated
-	 */
-	private PaletteInfosPackageImpl() {
-		super(eNS_URI, PaletteInfosFactory.eINSTANCE);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static boolean isInited = false;
-
-	/**
-	 * Creates, registers, and initializes the <b>Package</b> for this
-	 * model, and for any others upon which it depends.  Simple
-	 * dependencies are satisfied by calling this method on all
-	 * dependent packages before doing anything else.  This method drives
-	 * initialization for interdependent packages directly, in parallel
-	 * with this package, itself.
-	 * <p>Of this package and its interdependencies, all packages which
-	 * have not yet been registered by their URI values are first created
-	 * and registered.  The packages are then initialized in two steps:
-	 * meta-model objects for all of the packages are created before any
-	 * are initialized, since one package's meta-model objects may refer to
-	 * those of another.
-	 * <p>Invocation of this method will not affect any packages that have
-	 * already been initialized.
-	 * <!-- begin-user-doc -->
-     * @return the palette info package 
-	 * <!-- end-user-doc -->
-	 * @see #eNS_URI
-	 * @see #createPackageContents()
-	 * @see #initializePackageContents()
-	 * @generated
-	 */
-	public static PaletteInfosPackage init() {
-		if (isInited) return (PaletteInfosPackage)EPackage.Registry.INSTANCE.getEPackage(PaletteInfosPackage.eNS_URI);
-
-		// Obtain or create and register package
-		PaletteInfosPackageImpl thePaletteInfosPackage = (PaletteInfosPackageImpl)(EPackage.Registry.INSTANCE.getEPackage(eNS_URI) instanceof PaletteInfosPackageImpl ? EPackage.Registry.INSTANCE.getEPackage(eNS_URI) : new PaletteInfosPackageImpl());
-
-		isInited = true;
-
-		// Initialize simple dependencies
-		XMLTypePackage.eINSTANCE.eClass();
-
-		// Create package meta-data objects
-		thePaletteInfosPackage.createPackageContents();
-
-		// Initialize created meta-data
-		thePaletteInfosPackage.initializePackageContents();
-
-		// Mark meta-data to indicate it can't be changed
-		thePaletteInfosPackage.freeze();
-
-		return thePaletteInfosPackage;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getPaletteInfos() {
-		return paletteInfosEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getPaletteInfos_Infos() {
-		return (EReference)paletteInfosEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getPaletteInfo() {
-		return paletteInfoEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getPaletteInfo_Id() {
-		return (EAttribute)paletteInfoEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getPaletteInfo_Tag() {
-		return (EAttribute)paletteInfoEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getPaletteInfo_DisplayLabel() {
-		return (EAttribute)paletteInfoEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getPaletteInfo_Description() {
-		return (EAttribute)paletteInfoEClass.getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getPaletteInfo_Expert() {
-		return (EAttribute)paletteInfoEClass.getEStructuralFeatures().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getPaletteInfo_Hidden() {
-		return (EAttribute)paletteInfoEClass.getEStructuralFeatures().get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getPaletteInfo_SmallIcon() {
-		return (EAttribute)paletteInfoEClass.getEStructuralFeatures().get(6);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getPaletteInfo_LargeIcon() {
-		return (EAttribute)paletteInfoEClass.getEStructuralFeatures().get(7);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getPaletteInfo_TagCreation() {
-		return (EReference)paletteInfoEClass.getEStructuralFeatures().get(8);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getTagCreationInfo() {
-		return tagCreationInfoEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getTagCreationInfo_Attributes() {
-		return (EReference)tagCreationInfoEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTagCreationInfo_Template() {
-		return (EAttribute)tagCreationInfoEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getTagCreationTemplate() {
-		return tagCreationTemplateEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getTagCreationTemplate_Template() {
-		return (EReference)tagCreationTemplateEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getTagCreationAttribute() {
-		return tagCreationAttributeEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTagCreationAttribute_Id() {
-		return (EAttribute)tagCreationAttributeEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTagCreationAttribute_Value() {
-		return (EAttribute)tagCreationAttributeEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public PaletteInfosFactory getPaletteInfosFactory() {
-		return (PaletteInfosFactory)getEFactoryInstance();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private boolean isCreated = false;
-
-	/**
-	 * Creates the meta-model objects for the package.  This method is
-	 * guarded to have no affect on any invocation but its first.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void createPackageContents() {
-		if (isCreated) return;
-		isCreated = true;
-
-		// Create classes and their features
-		paletteInfosEClass = createEClass(PALETTE_INFOS);
-		createEReference(paletteInfosEClass, PALETTE_INFOS__INFOS);
-
-		paletteInfoEClass = createEClass(PALETTE_INFO);
-		createEAttribute(paletteInfoEClass, PALETTE_INFO__ID);
-		createEAttribute(paletteInfoEClass, PALETTE_INFO__TAG);
-		createEAttribute(paletteInfoEClass, PALETTE_INFO__DISPLAY_LABEL);
-		createEAttribute(paletteInfoEClass, PALETTE_INFO__DESCRIPTION);
-		createEAttribute(paletteInfoEClass, PALETTE_INFO__EXPERT);
-		createEAttribute(paletteInfoEClass, PALETTE_INFO__HIDDEN);
-		createEAttribute(paletteInfoEClass, PALETTE_INFO__SMALL_ICON);
-		createEAttribute(paletteInfoEClass, PALETTE_INFO__LARGE_ICON);
-		createEReference(paletteInfoEClass, PALETTE_INFO__TAG_CREATION);
-
-		tagCreationInfoEClass = createEClass(TAG_CREATION_INFO);
-		createEReference(tagCreationInfoEClass, TAG_CREATION_INFO__ATTRIBUTES);
-		createEAttribute(tagCreationInfoEClass, TAG_CREATION_INFO__TEMPLATE);
-
-		tagCreationTemplateEClass = createEClass(TAG_CREATION_TEMPLATE);
-		createEReference(tagCreationTemplateEClass, TAG_CREATION_TEMPLATE__TEMPLATE);
-
-		tagCreationAttributeEClass = createEClass(TAG_CREATION_ATTRIBUTE);
-		createEAttribute(tagCreationAttributeEClass, TAG_CREATION_ATTRIBUTE__ID);
-		createEAttribute(tagCreationAttributeEClass, TAG_CREATION_ATTRIBUTE__VALUE);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private boolean isInitialized = false;
-
-	/**
-	 * Complete the initialization of the package and its meta-model.  This
-	 * method is guarded to have no affect on any invocation but its first.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void initializePackageContents() {
-		if (isInitialized) return;
-		isInitialized = true;
-
-		// Initialize package
-		setName(eNAME);
-		setNsPrefix(eNS_PREFIX);
-		setNsURI(eNS_URI);
-
-		// Obtain other dependent packages
-		XMLTypePackage theXMLTypePackage = (XMLTypePackage)EPackage.Registry.INSTANCE.getEPackage(XMLTypePackage.eNS_URI);
-
-		// Add supertypes to classes
-
-		// Initialize classes and features; add operations and parameters
-		initEClass(paletteInfosEClass, PaletteInfos.class, "PaletteInfos", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEReference(getPaletteInfos_Infos(), this.getPaletteInfo(), null, "infos", null, 0, -1, PaletteInfos.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-		EOperation op = addEOperation(paletteInfosEClass, this.getPaletteInfo(), "findPaletteInfoById", 0, 1); //$NON-NLS-1$
-		addEParameter(op, ecorePackage.getEString(), "id", 1, 1); //$NON-NLS-1$
-
-		initEClass(paletteInfoEClass, PaletteInfo.class, "PaletteInfo", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEAttribute(getPaletteInfo_Id(), ecorePackage.getEString(), "id", null, 1, 1, PaletteInfo.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEAttribute(getPaletteInfo_Tag(), ecorePackage.getEString(), "tag", null, 0, 1, PaletteInfo.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEAttribute(getPaletteInfo_DisplayLabel(), ecorePackage.getEString(), "displayLabel", null, 0, 1, PaletteInfo.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEAttribute(getPaletteInfo_Description(), ecorePackage.getEString(), "description", null, 0, 1, PaletteInfo.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEAttribute(getPaletteInfo_Expert(), ecorePackage.getEBooleanObject(), "expert", null, 0, 1, PaletteInfo.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEAttribute(getPaletteInfo_Hidden(), ecorePackage.getEBooleanObject(), "hidden", null, 0, 1, PaletteInfo.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEAttribute(getPaletteInfo_SmallIcon(), ecorePackage.getEString(), "smallIcon", null, 0, 1, PaletteInfo.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEAttribute(getPaletteInfo_LargeIcon(), ecorePackage.getEString(), "largeIcon", null, 0, 1, PaletteInfo.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEReference(getPaletteInfo_TagCreation(), this.getTagCreationInfo(), null, "tagCreation", null, 0, 1, PaletteInfo.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-		addEOperation(paletteInfoEClass, ecorePackage.getEBoolean(), "isExpert", 0, 1); //$NON-NLS-1$
-
-		addEOperation(paletteInfoEClass, ecorePackage.getEBoolean(), "isHidden", 0, 1); //$NON-NLS-1$
-
-		initEClass(tagCreationInfoEClass, TagCreationInfo.class, "TagCreationInfo", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEReference(getTagCreationInfo_Attributes(), this.getTagCreationAttribute(), null, "attributes", null, 0, -1, TagCreationInfo.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEAttribute(getTagCreationInfo_Template(), theXMLTypePackage.getAnySimpleType(), "template", null, 0, 1, TagCreationInfo.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-		initEClass(tagCreationTemplateEClass, TagCreationTemplate.class, "TagCreationTemplate", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEReference(getTagCreationTemplate_Template(), ecorePackage.getEObject(), null, "template", null, 0, 1, TagCreationTemplate.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-		initEClass(tagCreationAttributeEClass, TagCreationAttribute.class, "TagCreationAttribute", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEAttribute(getTagCreationAttribute_Id(), ecorePackage.getEString(), "id", null, 1, 1, TagCreationAttribute.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEAttribute(getTagCreationAttribute_Value(), ecorePackage.getEString(), "value", null, 0, 1, TagCreationAttribute.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-		// Create resource
-		createResource(eNS_URI);
-
-		// Create annotations
-		// http:///org/eclipse/emf/ecore/util/ExtendedMetaData
-		createExtendedMetaDataAnnotations();
-	}
-
-	/**
-	 * Initializes the annotations for <b>http:///org/eclipse/emf/ecore/util/ExtendedMetaData</b>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void createExtendedMetaDataAnnotations() {
-		String source = "http:///org/eclipse/emf/ecore/util/ExtendedMetaData";		 //$NON-NLS-1$
-		addAnnotation
-		  (getPaletteInfos_Infos(), 
-		   source, 
-		   new String[] {
-			 "kind", "element", //$NON-NLS-1$ //$NON-NLS-2$
-			 "name", "item" //$NON-NLS-1$ //$NON-NLS-2$
-		   });		
-		addAnnotation
-		  (getPaletteInfo_DisplayLabel(), 
-		   source, 
-		   new String[] {
-			 "kind", "element", //$NON-NLS-1$ //$NON-NLS-2$
-			 "name", "display-label" //$NON-NLS-1$ //$NON-NLS-2$
-		   });		
-		addAnnotation
-		  (getPaletteInfo_Description(), 
-		   source, 
-		   new String[] {
-			 "kind", "element" //$NON-NLS-1$ //$NON-NLS-2$
-		   });		
-		addAnnotation
-		  (getPaletteInfo_Expert(), 
-		   source, 
-		   new String[] {
-			 "kind", "element" //$NON-NLS-1$ //$NON-NLS-2$
-		   });		
-		addAnnotation
-		  (getPaletteInfo_Hidden(), 
-		   source, 
-		   new String[] {
-			 "kind", "element" //$NON-NLS-1$ //$NON-NLS-2$
-		   });		
-		addAnnotation
-		  (getPaletteInfo_SmallIcon(), 
-		   source, 
-		   new String[] {
-			 "kind", "element", //$NON-NLS-1$ //$NON-NLS-2$
-			 "name", "small-icon" //$NON-NLS-1$ //$NON-NLS-2$
-		   });		
-		addAnnotation
-		  (getPaletteInfo_LargeIcon(), 
-		   source, 
-		   new String[] {
-			 "kind", "element", //$NON-NLS-1$ //$NON-NLS-2$
-			 "name", "large-icon" //$NON-NLS-1$ //$NON-NLS-2$
-		   });		
-		addAnnotation
-		  (getPaletteInfo_TagCreation(), 
-		   source, 
-		   new String[] {
-			 "kind", "element", //$NON-NLS-1$ //$NON-NLS-2$
-			 "name", "tag-create" //$NON-NLS-1$ //$NON-NLS-2$
-		   });		
-		addAnnotation
-		  (getTagCreationInfo_Attributes(), 
-		   source, 
-		   new String[] {
-			 "kind", "element", //$NON-NLS-1$ //$NON-NLS-2$
-			 "name", "attribute" //$NON-NLS-1$ //$NON-NLS-2$
-		   });
-	}
-
-} //PaletteInfosPackageImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/tagdisplay/internal/paletteinfos/impl/TagCreationAttributeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/tagdisplay/internal/paletteinfos/impl/TagCreationAttributeImpl.java
deleted file mode 100644
index 936f0f0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/tagdisplay/internal/paletteinfos/impl/TagCreationAttributeImpl.java
+++ /dev/null
@@ -1,221 +0,0 @@
-/**
- * Copyright (c) 2007 Oracle Corporation
- *
- * $Id: TagCreationAttributeImpl.java,v 1.2 2008/11/18 22:24:03 gkessler Exp $
- */
-package org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-
-import org.eclipse.emf.ecore.EClass;
-
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-
-import org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfosPackage;
-import org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.TagCreationAttribute;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Tag Creation Attribute</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.impl.TagCreationAttributeImpl#getId <em>Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.impl.TagCreationAttributeImpl#getValue <em>Value</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class TagCreationAttributeImpl extends EObjectImpl implements TagCreationAttribute {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2007 Oracle Corporation"; //$NON-NLS-1$
-
-	/**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getValue() <em>Value</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getValue()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String VALUE_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getValue() <em>Value</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getValue()
-	 * @generated
-	 * @ordered
-	 */
-	protected String value = VALUE_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected TagCreationAttributeImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return PaletteInfosPackage.Literals.TAG_CREATION_ATTRIBUTE;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, PaletteInfosPackage.TAG_CREATION_ATTRIBUTE__ID, oldId, id));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getValue() {
-		return value;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setValue(String newValue) {
-		String oldValue = value;
-		value = newValue;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, PaletteInfosPackage.TAG_CREATION_ATTRIBUTE__VALUE, oldValue, value));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case PaletteInfosPackage.TAG_CREATION_ATTRIBUTE__ID:
-				return getId();
-			case PaletteInfosPackage.TAG_CREATION_ATTRIBUTE__VALUE:
-				return getValue();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case PaletteInfosPackage.TAG_CREATION_ATTRIBUTE__ID:
-				setId((String)newValue);
-				return;
-			case PaletteInfosPackage.TAG_CREATION_ATTRIBUTE__VALUE:
-				setValue((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case PaletteInfosPackage.TAG_CREATION_ATTRIBUTE__ID:
-				setId(ID_EDEFAULT);
-				return;
-			case PaletteInfosPackage.TAG_CREATION_ATTRIBUTE__VALUE:
-				setValue(VALUE_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case PaletteInfosPackage.TAG_CREATION_ATTRIBUTE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-			case PaletteInfosPackage.TAG_CREATION_ATTRIBUTE__VALUE:
-				return VALUE_EDEFAULT == null ? value != null : !VALUE_EDEFAULT.equals(value);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(", value: "); //$NON-NLS-1$
-		result.append(value);
-		result.append(')');
-		return result.toString();
-	}
-
-} //TagCreationAttributeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/tagdisplay/internal/paletteinfos/impl/TagCreationInfoImpl.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/tagdisplay/internal/paletteinfos/impl/TagCreationInfoImpl.java
deleted file mode 100644
index 365ba8e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/tagdisplay/internal/paletteinfos/impl/TagCreationInfoImpl.java
+++ /dev/null
@@ -1,224 +0,0 @@
-/**
- * Copyright (c) 2007 Oracle Corporation
- *
- * $Id: TagCreationInfoImpl.java,v 1.2 2008/11/18 22:24:03 gkessler Exp $
- */
-package org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-
-import org.eclipse.emf.common.util.EList;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-
-import org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfosPackage;
-import org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.TagCreationAttribute;
-import org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.TagCreationInfo;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Tag Creation Info</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.impl.TagCreationInfoImpl#getAttributes <em>Attributes</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.impl.TagCreationInfoImpl#getTemplate <em>Template</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class TagCreationInfoImpl extends EObjectImpl implements TagCreationInfo {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2007 Oracle Corporation"; //$NON-NLS-1$
-
-	/**
-	 * The cached value of the '{@link #getAttributes() <em>Attributes</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getAttributes()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList attributes;
-
-	/**
-	 * The default value of the '{@link #getTemplate() <em>Template</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTemplate()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Object TEMPLATE_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getTemplate() <em>Template</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTemplate()
-	 * @generated
-	 * @ordered
-	 */
-	protected Object template = TEMPLATE_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected TagCreationInfoImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return PaletteInfosPackage.Literals.TAG_CREATION_INFO;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getAttributes() {
-		if (attributes == null) {
-			attributes = new EObjectContainmentEList(TagCreationAttribute.class, this, PaletteInfosPackage.TAG_CREATION_INFO__ATTRIBUTES);
-		}
-		return attributes;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getTemplate() {
-		return template;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTemplate(Object newTemplate) {
-		Object oldTemplate = template;
-		template = newTemplate;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, PaletteInfosPackage.TAG_CREATION_INFO__TEMPLATE, oldTemplate, template));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case PaletteInfosPackage.TAG_CREATION_INFO__ATTRIBUTES:
-				return ((InternalEList)getAttributes()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case PaletteInfosPackage.TAG_CREATION_INFO__ATTRIBUTES:
-				return getAttributes();
-			case PaletteInfosPackage.TAG_CREATION_INFO__TEMPLATE:
-				return getTemplate();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case PaletteInfosPackage.TAG_CREATION_INFO__ATTRIBUTES:
-				getAttributes().clear();
-				getAttributes().addAll((Collection)newValue);
-				return;
-			case PaletteInfosPackage.TAG_CREATION_INFO__TEMPLATE:
-				setTemplate(newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case PaletteInfosPackage.TAG_CREATION_INFO__ATTRIBUTES:
-				getAttributes().clear();
-				return;
-			case PaletteInfosPackage.TAG_CREATION_INFO__TEMPLATE:
-				setTemplate(TEMPLATE_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case PaletteInfosPackage.TAG_CREATION_INFO__ATTRIBUTES:
-				return attributes != null && !attributes.isEmpty();
-			case PaletteInfosPackage.TAG_CREATION_INFO__TEMPLATE:
-				return TEMPLATE_EDEFAULT == null ? template != null : !TEMPLATE_EDEFAULT.equals(template);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (template: "); //$NON-NLS-1$
-		result.append(template);
-		result.append(')');
-		return result.toString();
-	}
-
-} //TagCreationInfoImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/tagdisplay/internal/paletteinfos/impl/TagCreationTemplateImpl.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/tagdisplay/internal/paletteinfos/impl/TagCreationTemplateImpl.java
deleted file mode 100644
index ec66a79..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/tagdisplay/internal/paletteinfos/impl/TagCreationTemplateImpl.java
+++ /dev/null
@@ -1,183 +0,0 @@
-/**
- * Copyright (c) 2007 Oracle Corporation
- *
- * $Id: TagCreationTemplateImpl.java,v 1.2 2008/11/18 22:24:03 gkessler Exp $
- */
-package org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.InternalEObject;
-
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-
-import org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfosPackage;
-import org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.TagCreationTemplate;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Tag Creation Template</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.impl.TagCreationTemplateImpl#getTemplate <em>Template</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class TagCreationTemplateImpl extends EObjectImpl implements TagCreationTemplate {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2007 Oracle Corporation"; //$NON-NLS-1$
-
-	/**
-	 * The cached value of the '{@link #getTemplate() <em>Template</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTemplate()
-	 * @generated
-	 * @ordered
-	 */
-	protected EObject template;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected TagCreationTemplateImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return PaletteInfosPackage.Literals.TAG_CREATION_TEMPLATE;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EObject getTemplate() {
-		return template;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-     * @param newTemplate 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetTemplate(EObject newTemplate, NotificationChain msgs) {
-		EObject oldTemplate = template;
-		template = newTemplate;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, PaletteInfosPackage.TAG_CREATION_TEMPLATE__TEMPLATE, oldTemplate, newTemplate);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTemplate(EObject newTemplate) {
-		if (newTemplate != template) {
-			NotificationChain msgs = null;
-			if (template != null)
-				msgs = ((InternalEObject)template).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - PaletteInfosPackage.TAG_CREATION_TEMPLATE__TEMPLATE, null, msgs);
-			if (newTemplate != null)
-				msgs = ((InternalEObject)newTemplate).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - PaletteInfosPackage.TAG_CREATION_TEMPLATE__TEMPLATE, null, msgs);
-			msgs = basicSetTemplate(newTemplate, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, PaletteInfosPackage.TAG_CREATION_TEMPLATE__TEMPLATE, newTemplate, newTemplate));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case PaletteInfosPackage.TAG_CREATION_TEMPLATE__TEMPLATE:
-				return basicSetTemplate(null, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case PaletteInfosPackage.TAG_CREATION_TEMPLATE__TEMPLATE:
-				return getTemplate();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case PaletteInfosPackage.TAG_CREATION_TEMPLATE__TEMPLATE:
-				setTemplate((EObject)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case PaletteInfosPackage.TAG_CREATION_TEMPLATE__TEMPLATE:
-				setTemplate((EObject)null);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case PaletteInfosPackage.TAG_CREATION_TEMPLATE__TEMPLATE:
-				return template != null;
-		}
-		return super.eIsSet(featureID);
-	}
-
-} //TagCreationTemplateImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/tagdisplay/internal/paletteinfos/util/PaletteInfosAdapterFactory.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/tagdisplay/internal/paletteinfos/util/PaletteInfosAdapterFactory.java
deleted file mode 100644
index 8e08bef..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/tagdisplay/internal/paletteinfos/util/PaletteInfosAdapterFactory.java
+++ /dev/null
@@ -1,194 +0,0 @@
-/**
- * Copyright (c) 2007 Oracle Corporation
- *
- * $Id: PaletteInfosAdapterFactory.java,v 1.2 2008/11/18 22:23:51 gkessler Exp $
- */
-package org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.util;
-
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.common.notify.Notifier;
-
-import org.eclipse.emf.common.notify.impl.AdapterFactoryImpl;
-
-import org.eclipse.emf.ecore.EObject;
-
-import org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.*;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Adapter Factory</b> for the model.
- * It provides an adapter <code>createXXX</code> method for each class of the model.
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfosPackage
- * @generated
- */
-public class PaletteInfosAdapterFactory extends AdapterFactoryImpl {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2007 Oracle Corporation"; //$NON-NLS-1$
-
-	/**
-	 * The cached model package.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected static PaletteInfosPackage modelPackage;
-
-	/**
-	 * Creates an instance of the adapter factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public PaletteInfosAdapterFactory() {
-		if (modelPackage == null) {
-			modelPackage = PaletteInfosPackage.eINSTANCE;
-		}
-	}
-
-	/**
-	 * Returns whether this factory is applicable for the type of the object.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns <code>true</code> if the object is either the model's package or is an instance object of the model.
-	 * <!-- end-user-doc -->
-	 * @return whether this factory is applicable for the type of the object.
-	 * @generated
-	 */
-	public boolean isFactoryForType(Object object) {
-		if (object == modelPackage) {
-			return true;
-		}
-		if (object instanceof EObject) {
-			return ((EObject)object).eClass().getEPackage() == modelPackage;
-		}
-		return false;
-	}
-
-	/**
-	 * The switch that delegates to the <code>createXXX</code> methods.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected PaletteInfosSwitch modelSwitch =
-		new PaletteInfosSwitch() {
-			public Object casePaletteInfos(PaletteInfos object) {
-				return createPaletteInfosAdapter();
-			}
-			public Object casePaletteInfo(PaletteInfo object) {
-				return createPaletteInfoAdapter();
-			}
-			public Object caseTagCreationInfo(TagCreationInfo object) {
-				return createTagCreationInfoAdapter();
-			}
-			public Object caseTagCreationTemplate(TagCreationTemplate object) {
-				return createTagCreationTemplateAdapter();
-			}
-			public Object caseTagCreationAttribute(TagCreationAttribute object) {
-				return createTagCreationAttributeAdapter();
-			}
-			public Object defaultCase(EObject object) {
-				return createEObjectAdapter();
-			}
-		};
-
-	/**
-	 * Creates an adapter for the <code>target</code>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param target the object to adapt.
-	 * @return the adapter for the <code>target</code>.
-	 * @generated
-	 */
-	public Adapter createAdapter(Notifier target) {
-		return (Adapter)modelSwitch.doSwitch((EObject)target);
-	}
-
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfos <em>Palette Infos</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfos
-	 * @generated
-	 */
-	public Adapter createPaletteInfosAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfo <em>Palette Info</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfo
-	 * @generated
-	 */
-	public Adapter createPaletteInfoAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.TagCreationInfo <em>Tag Creation Info</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.TagCreationInfo
-	 * @generated
-	 */
-	public Adapter createTagCreationInfoAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.TagCreationTemplate <em>Tag Creation Template</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.TagCreationTemplate
-	 * @generated
-	 */
-	public Adapter createTagCreationTemplateAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.TagCreationAttribute <em>Tag Creation Attribute</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.TagCreationAttribute
-	 * @generated
-	 */
-	public Adapter createTagCreationAttributeAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for the default case.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @generated
-	 */
-	public Adapter createEObjectAdapter() {
-		return null;
-	}
-
-} //PaletteInfosAdapterFactory
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/tagdisplay/internal/paletteinfos/util/PaletteInfosSwitch.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/tagdisplay/internal/paletteinfos/util/PaletteInfosSwitch.java
deleted file mode 100644
index 7ce17c5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/tagdisplay/internal/paletteinfos/util/PaletteInfosSwitch.java
+++ /dev/null
@@ -1,223 +0,0 @@
-/**
- * Copyright (c) 2007 Oracle Corporation
- *
- * $Id: PaletteInfosSwitch.java,v 1.2 2008/11/18 22:23:51 gkessler Exp $
- */
-package org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.util;
-
-import java.util.List;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-
-import org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.*;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Switch</b> for the model's inheritance hierarchy.
- * It supports the call {@link #doSwitch(EObject) doSwitch(object)}
- * to invoke the <code>caseXXX</code> method for each class of the model,
- * starting with the actual class of the object
- * and proceeding up the inheritance hierarchy
- * until a non-null result is returned,
- * which is the result of the switch.
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfosPackage
- * @generated
- */
-public class PaletteInfosSwitch {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2007 Oracle Corporation"; //$NON-NLS-1$
-
-	/**
-	 * The cached model package
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected static PaletteInfosPackage modelPackage;
-
-	/**
-	 * Creates an instance of the switch.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public PaletteInfosSwitch() {
-		if (modelPackage == null) {
-			modelPackage = PaletteInfosPackage.eINSTANCE;
-		}
-	}
-
-	/**
-	 * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
-	 * <!-- begin-user-doc -->
-     * @param theEObject 
-	 * <!-- end-user-doc -->
-	 * @return the first non-null result returned by a <code>caseXXX</code> call.
-	 * @generated
-	 */
-	public Object doSwitch(EObject theEObject) {
-		return doSwitch(theEObject.eClass(), theEObject);
-	}
-
-	/**
-	 * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
-	 * <!-- begin-user-doc -->
-     * @param theEClass 
-     * @param theEObject 
-	 * <!-- end-user-doc -->
-	 * @return the first non-null result returned by a <code>caseXXX</code> call.
-	 * @generated
-	 */
-	protected Object doSwitch(EClass theEClass, EObject theEObject) {
-		if (theEClass.eContainer() == modelPackage) {
-			return doSwitch(theEClass.getClassifierID(), theEObject);
-		}
-        List eSuperTypes = theEClass.getESuperTypes();
-        return
-        	eSuperTypes.isEmpty() ?
-        		defaultCase(theEObject) :
-        		doSwitch((EClass)eSuperTypes.get(0), theEObject);
-	}
-
-	/**
-	 * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
-	 * <!-- begin-user-doc -->
-     * @param classifierID 
-     * @param theEObject 
-	 * <!-- end-user-doc -->
-	 * @return the first non-null result returned by a <code>caseXXX</code> call.
-	 * @generated
-	 */
-	protected Object doSwitch(int classifierID, EObject theEObject) {
-		switch (classifierID) {
-			case PaletteInfosPackage.PALETTE_INFOS: {
-				PaletteInfos paletteInfos = (PaletteInfos)theEObject;
-				Object result = casePaletteInfos(paletteInfos);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case PaletteInfosPackage.PALETTE_INFO: {
-				PaletteInfo paletteInfo = (PaletteInfo)theEObject;
-				Object result = casePaletteInfo(paletteInfo);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case PaletteInfosPackage.TAG_CREATION_INFO: {
-				TagCreationInfo tagCreationInfo = (TagCreationInfo)theEObject;
-				Object result = caseTagCreationInfo(tagCreationInfo);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case PaletteInfosPackage.TAG_CREATION_TEMPLATE: {
-				TagCreationTemplate tagCreationTemplate = (TagCreationTemplate)theEObject;
-				Object result = caseTagCreationTemplate(tagCreationTemplate);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case PaletteInfosPackage.TAG_CREATION_ATTRIBUTE: {
-				TagCreationAttribute tagCreationAttribute = (TagCreationAttribute)theEObject;
-				Object result = caseTagCreationAttribute(tagCreationAttribute);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			default: return defaultCase(theEObject);
-		}
-	}
-
-	/**
-	 * Returns the result of interpreting the object as an instance of '<em>Palette Infos</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Palette Infos</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object casePaletteInfos(PaletteInfos object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpreting the object as an instance of '<em>Palette Info</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Palette Info</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object casePaletteInfo(PaletteInfo object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpreting the object as an instance of '<em>Tag Creation Info</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Tag Creation Info</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseTagCreationInfo(TagCreationInfo object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpreting the object as an instance of '<em>Tag Creation Template</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Tag Creation Template</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseTagCreationTemplate(TagCreationTemplate object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpreting the object as an instance of '<em>Tag Creation Attribute</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Tag Creation Attribute</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseTagCreationAttribute(TagCreationAttribute object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpreting the object as an instance of '<em>EObject</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch, but this is the last case anyway.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>EObject</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject)
-	 * @generated
-	 */
-	public Object defaultCase(EObject object) {
-		return null;
-	}
-
-} //PaletteInfosSwitch
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/AbstractEnumerationType.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/AbstractEnumerationType.java
deleted file mode 100644
index fda6dd5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/AbstractEnumerationType.java
+++ /dev/null
@@ -1,137 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *	  Vadim Dmitriev
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.taglibprocessing.attributevalues;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jst.jsf.common.internal.types.CompositeType;
-import org.eclipse.jst.jsf.metadataprocessors.AbstractRootTypeDescriptor;
-import org.eclipse.jst.jsf.metadataprocessors.features.ELIsNotValidException;
-import org.eclipse.jst.jsf.metadataprocessors.features.IDefaultValue;
-import org.eclipse.jst.jsf.metadataprocessors.features.IPossibleValues;
-import org.eclipse.jst.jsf.metadataprocessors.features.IValidELValues;
-import org.eclipse.jst.jsf.metadataprocessors.features.IValidValues;
-import org.eclipse.jst.jsf.metadataprocessors.features.ValidationMessage;
-
-/**
- * Abstract meta-data processing type representing an enumeration attribute value runtime type
- * <p><b>Provisional API - subject to change</b></p>
- */
-public abstract class AbstractEnumerationType extends AbstractRootTypeDescriptor implements IValidValues, IDefaultValue, IValidELValues{
-	private List validationMessages;
-	
-	/**
-	 * An empty list
-	 */
-	protected static List EMPTY_LIST = new ArrayList(0);
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.metadataprocessors.features.IValidValues#getValidationMessages()
-	 */
-	public List getValidationMessages() {
-		if (validationMessages == null){
-			validationMessages = new ArrayList();
-		}
-		return validationMessages;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.metadataprocessors.features.IDefaultValue#getDefaultValue()
-	 */
-	public String getDefaultValue() {
-		return getTraitValueAsString(IDefaultValue.DEFAULT_VALUE_PROP_NAME);		
-	}
-	
-	/**
-	 * @return possible values of type as list of Strings using 
-	 * {@link IPossibleValues}.POSSIBLE_VALUES_PROP_NAME trait name
-	 */
-	protected List getMDPossibleValues() {
-		return getTraitValueAsListOfStrings(IPossibleValues.POSSIBLE_VALUES_PROP_NAME);
-	}
-	
-	/**
-	 * @return possible values of type to dislay as list of Strings using 
-	 * {@link IPossibleValues}.POSSIBLE_VALUES_FOR_DISPLAY_PROP_NAME trait name
-	 */
-	protected List getMDPossibleValuesForDisplay() {
-		return getTraitValueAsListOfStrings(IPossibleValues.POSSIBLE_VALUES_FOR_DISPLAY_PROP_NAME);
-	}
-	
-	/**
-	 * @return  list of valid values as list of Strings using 
-	 * {@link IValidValues}.VALID_VALUES_PROP_NAME trait name
-	 */
-	protected List getMDValidValues() {
-		return getTraitValueAsListOfStrings(IValidValues.VALID_VALUES_PROP_NAME);		
-	}
-	
-	/**
-	 * @return Validation message for type using
-	 * {@link IValidValues}.VALID_VALUES_MESSAGE_PROP_NAME trait name
-	 */
-	protected String getMDValidationMessage() {
-		return getTraitValueAsString(IValidValues.VALID_VALUES_MESSAGE_PROP_NAME);			
-	}
-
-	/**
-	 * @return Validation severity int value for type using
-	 * {@link IValidValues}.VALID_VALUES_SEVERITY_PROP_NAME trait name
-	 */
-	protected int getMDValidationSeverity() {
-		String val = getTraitValueAsString(IValidValues.VALID_VALUES_SEVERITY_PROP_NAME);		
-		if (val == null)
-			return IStatus.WARNING;
-		
-		int severity = Integer.valueOf(val).intValue();
-		return severity;
-	}
-
-	/**
-	 * @return Validation code as String value for type using
-	 * {@link IValidValues}.VALID_VALUES_CODE_PROP_NAME trait name
-	 */
-	protected String getMDValidationCode() {
-		return getTraitValueAsString(IValidValues.VALID_VALUES_CODE_PROP_NAME);		
-	}
-	
-	/**
-	 * Create a {@link ValidationMessage} from metadata or use default message
-	 * and add it to the collection of validation messages
-	 * @param defaultMsg
-	 */
-	protected void addNewValidationMessage(String defaultMsg) {
-		String msg = getMDValidationMessage();
-		if (msg == null || msg.equals("")) //$NON-NLS-1$
-			msg = defaultMsg;
-		
-		String code = getMDValidationCode();
-		int severity = getMDValidationSeverity();
-		ValidationMessage val = new ValidationMessage(msg, code, severity);
-		getValidationMessages().add(val);
-	}
-	
-	/**
-	 * @return the value of {@link org.eclipse.jst.jsf.common.internal.types.IAssignable}.ASSIGNMENT_TYPE_NONE.  Subclasses to override.
-	 */
-	protected int getAssignmentType(){
-		return 0;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.metadataprocessors.features.IValidELValues#getExpectedRuntimeType()
-	 */
-	public  abstract CompositeType getExpectedRuntimeType() throws ELIsNotValidException;
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/ActionType.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/ActionType.java
deleted file mode 100644
index 4e87c55..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/ActionType.java
+++ /dev/null
@@ -1,180 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.taglibprocessing.attributevalues;
-
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.FileLocator;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IStructuredDocumentContextResolverFactory;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IWorkspaceContextResolver;
-import org.eclipse.jst.jsf.core.jsfappconfig.internal.JSFAppConfigManagerFactory;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType;
-import org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType;
-import org.eclipse.jst.jsf.metadataprocessors.features.IPossibleValues;
-import org.eclipse.jst.jsf.metadataprocessors.features.IValidationMessage;
-import org.eclipse.jst.jsf.metadataprocessors.features.PossibleValue;
-import org.eclipse.jst.jsf.metadataprocessors.features.ValidationMessage;
-import org.eclipse.osgi.util.NLS;
-import org.osgi.framework.Bundle;
-
-/**
- * Meta-data processing type representing an "action" attribute
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * @author Gerry Kessler - Oracle
- */
-public class ActionType extends MethodBindingType implements IPossibleValues{
-	/**
-	 * Image to use if metadata defined image cannot be created
-	 */
-	protected static final ImageDescriptor MISSING_IMAGE = ImageDescriptor.getMissingImageDescriptor();
-	
-	private static final String IMAGE_NAME = "/icons/full/obj16/NavigationCaseType.gif"; //$NON-NLS-1$
-	private ImageDescriptor imageDescriptor;
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.taglibprocessing.attributevalues.MethodBindingType#isValidValue(java.lang.String)
-	 */
-	public boolean isValidValue(String value){
-		if (value == null || (value != null && value.length() == 0)) {
-			IValidationMessage msg = new ValidationMessage(Messages.ActionType_invalid_empty_value);
-			getValidationMessages().add(msg);
-			return false;
-		}
-		//any other value should be one of the possible values
-		//optimize
-		IWorkspaceContextResolver wr = IStructuredDocumentContextResolverFactory.INSTANCE.getWorkspaceContextResolver(getStructuredDocumentContext());
-		if (wr == null)
-			return true;//shouldn't get here
-		
-		//in case that this is not JSF faceted or missing configs, need to pass
-		if (JSFAppConfigManagerFactory.getJSFAppConfigManagerInstance(wr.getProject()) == null) 
-			return true;
-			
-		IFile jsp = (IFile)wr.getResource();
-		List<NavigationRuleType> rules = JSFAppConfigManagerFactory.getJSFAppConfigManagerInstance(wr.getProject()).getNavigationRulesForPage(jsp);
-		for(final NavigationRuleType rule : rules){
-			for (Iterator cases=rule.getNavigationCase().iterator();cases.hasNext();){				
-				NavigationCaseType navCase = (NavigationCaseType)cases.next();					
-				if (navCase.getFromOutcome() != null && 
-						value.equals(navCase.getFromOutcome().getTextContent().trim()))
-					return true;				
-			}
-		}
-		IValidationMessage msg = new ValidationMessage(Messages.ActionType_invalid_value);
-		getValidationMessages().add(msg);
-		return false;
-		
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.metadataprocessors.features.IPossibleValues#getPossibleValues()
-	 */
-	public List getPossibleValues() {
-		final List<NavigationRuleType> ret = new ArrayList<NavigationRuleType>();
-		if (getStructuredDocumentContext() == null)
-			return ret;
-		
-		final IWorkspaceContextResolver wr = IStructuredDocumentContextResolverFactory.INSTANCE.getWorkspaceContextResolver(getStructuredDocumentContext());
-		if (wr != null && JSFAppConfigManagerFactory.getJSFAppConfigManagerInstance(wr.getProject()) != null) {//may not be JSF faceted project or know faces-config){			
-			IFile jsp = (IFile)wr.getResource();
-			List<NavigationRuleType> rules = JSFAppConfigManagerFactory.getJSFAppConfigManagerInstance(wr.getProject()).getNavigationRulesForPage(jsp);
-			for(final NavigationRuleType rule : rules){
-				if (rule != null)
-					ret.addAll(createProposals(rule));
-			}
-		}
-		return ret;
-	}
-
-	private List createProposals(NavigationRuleType rule) {
-		List ret = new ArrayList();
-		List cases = rule.getNavigationCase();
-		for(Iterator it=cases.iterator();it.hasNext();){
-			NavigationCaseType navCase = (NavigationCaseType)it.next();
-			PossibleValue pv = createProposal(rule, navCase);
-			if (pv != null)
-				ret.add(pv);
-		}
-		return ret;
-	}
-
-	private PossibleValue createProposal(NavigationRuleType rule, NavigationCaseType navCase) {
-		PossibleValue pv = null;
-		String value = null;
-		String ruleDisp = null;
-		String navDisplay = null;
-		String navAction = null;
-		String toViewId = null;
-		
-		if (navCase.getFromOutcome() != null)
-			value = navCase.getFromOutcome().getTextContent();
-		if (navCase.getToViewId()!= null)
-			toViewId = navCase.getToViewId().getTextContent();
-		if (rule.getFromViewId() != null)
-			ruleDisp = rule.getFromViewId().getTextContent();
-		if (navCase.getDisplayName() != null
-				&& navCase.getDisplayName().size() > 0) {
-			navDisplay = ((DisplayNameType) navCase
-					.getDisplayName().get(0)).getTextContent();	
-		}
-		if (navCase.getFromAction() != null) {
-			navAction= navCase.getFromAction().getTextContent();	
-		}
-		if (navDisplay == null || navDisplay.trim().equals("")) //$NON-NLS-1$
-			navDisplay = NLS.bind(Messages.ActionType_navcase_display, new String[]{value, toViewId});
-		
-		if (value != null){
-			pv = new PossibleValue(value, navDisplay);
-			pv.setIcon(getNavCaseImageDescriptor());
-			pv.setAdditionalInformation("from-outcome: "+value  //$NON-NLS-1$
-										+ "<br>to-view-id: " + toViewId //$NON-NLS-1$
-										+ "<br>from-view-id: " + ruleDisp //$NON-NLS-1$
-										+ "<br>from-action: " + (navAction == null ? "null" : navAction)); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-
-		return pv;
-	}
-
-	
-	private ImageDescriptor getNavCaseImageDescriptor() {
-		ImageDescriptor ret = super.getImage();
-		if (ret != null && ret != MISSING_IMAGE)
-			return ret;
-
-		if (imageDescriptor == null){				
-			imageDescriptor = getImageDesc(IMAGE_NAME);
-		}
-		return imageDescriptor;
-
-	}
-	
-	private ImageDescriptor getImageDesc(String img) 
-    {
-		Bundle bundle = FacesConfigPlugin.getPlugin().getBundle();
-		URL url = FileLocator.find(bundle, new Path(img), null);
-		ImageDescriptor desc = ImageDescriptor.createFromURL(url);
-		if (desc == MISSING_IMAGE){
-			return null;
-		}
-		return desc;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/BindingType.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/BindingType.java
deleted file mode 100644
index 6932796..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/BindingType.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.taglibprocessing.attributevalues;
-
-import org.eclipse.jst.jsf.metadataprocessors.AbstractRootTypeDescriptor;
-
-/**
- * Abstract meta-data processing type representing a binding
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * @author Gerry Kessler - Oracle
- */
-public abstract class BindingType extends AbstractRootTypeDescriptor{
-    // TODO: what's the point of this?
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/BooleanType.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/BooleanType.java
deleted file mode 100644
index cd90e74..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/BooleanType.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.taglibprocessing.attributevalues;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jst.jsf.metadataprocessors.features.IDefaultValue;
-import org.eclipse.jst.jsf.metadataprocessors.features.IPossibleValues;
-import org.eclipse.jst.jsf.metadataprocessors.features.IValidValues;
-import org.eclipse.jst.jsf.metadataprocessors.features.PossibleValue;
-
-/**
- * Meta-data processing type representing a boolean attribute value runtime type
- * that implements IPossibleValues, IValidValues, IDefaultValue, IValidELValues
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * @author Gerry Kessler - Oracle
- */
-public class BooleanType extends EnumerationType implements IValidValues, IPossibleValues, IDefaultValue{
-	private static final String TRUE_VAL = "true"; //$NON-NLS-1$
-	private static final String FALSE_VAL = "false"; //$NON-NLS-1$
-	
-	private static final String BOOLTYPE_VALIDATION_MSG = Messages.BooleanType_invalid_values;
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.taglibprocessing.attributevalues.EnumerationType#getReturnType()
-	 */
-	protected String getReturnType(){ return "boolean";} //$NON-NLS-1$
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.metadataprocessors.features.IPossibleValues#getPossibleValues()
-	 */
-	public List getPossibleValues() {
-		String def = getDefaultValue();
-		List vals = new ArrayList();
-		vals.add(new PossibleValue(TRUE_VAL, TRUE_VAL, def != null && def.equals(TRUE_VAL) ));
-		vals.add(new PossibleValue(FALSE_VAL, FALSE_VAL, def != null && def.equals(FALSE_VAL) ));
-		return vals;
-	}
-	
-	/**
-	 * Type coercion according to JSP 2.0 spec: JSP.1.14.2.1 Conversions from String values
-	 * Although not completely faithful to spec, we will validate values as either 'true' or 'false'
-	 * @see org.eclipse.jst.jsf.metadataprocessors.features.IValidValues#isValidValue(java.lang.String)
-	 **/
-	public boolean isValidValue(String value) {		
-		if(TRUE_VAL.equalsIgnoreCase(value) || FALSE_VAL.equalsIgnoreCase(value)) {
-			return true;
-		}
-		addNewValidationMessage(BOOLTYPE_VALIDATION_MSG);	
-		return false;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/CSSClassType.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/CSSClassType.java
deleted file mode 100644
index 90c2dd4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/CSSClassType.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.taglibprocessing.attributevalues;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IDOMContextResolver;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.internal.impl.StructuredDocumentContextResolverFactory;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.metadataprocessors.AbstractRootTypeDescriptor;
-import org.eclipse.jst.jsf.metadataprocessors.IMetaDataEnabledFeature;
-import org.eclipse.jst.jsf.metadataprocessors.features.IPossibleValue;
-import org.eclipse.jst.jsf.metadataprocessors.features.IPossibleValues;
-import org.eclipse.jst.jsf.metadataprocessors.features.PossibleValue;
-import org.eclipse.wst.css.core.internal.provisional.adapters.IStyleSheetListAdapter;
-import org.eclipse.wst.css.core.internal.provisional.document.ICSSNode;
-import org.eclipse.wst.css.core.internal.util.CSSClassTraverser;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.w3c.dom.Document;
-import org.w3c.dom.stylesheets.StyleSheetList;
-
-/**
- * Represents a style class attribute type
- * <p><b>Provisional API - subject to change</b></p>
- */
-public class CSSClassType extends AbstractRootTypeDescriptor implements
-		IMetaDataEnabledFeature, IPossibleValues {
-
-	private List<IPossibleValue> _pvs;
-	
-	public List<IPossibleValue> getPossibleValues() {
-		if (_pvs == null){
-			IDOMContextResolver resolver = StructuredDocumentContextResolverFactory.getInstance().getDOMContextResolver(getStructuredDocumentContext());
-			_pvs = getCSSClasses(resolver.getDOMDocument());
-		}
-		return _pvs;
-	}
-
-	private List<IPossibleValue> getCSSClasses(Document doc) {
-		List result = new ArrayList();
-		String [] names = internalGetCSSClasses(doc);
-		for (int i=0;i<names.length;i++){
-			IPossibleValue pv = new PossibleValue(names[i]);
-			result.add(pv);
-		}
-		return result;
-	}
-	
-	//code duplicated from pagedesigner CSSUtils.  Uses internal CSSClassTraverser
-	private static String[] internalGetCSSClasses(Document doc) {
-		Collection c = Collections.EMPTY_SET;
-		if (doc instanceof INodeNotifier) {
-			IStyleSheetListAdapter adapter = (IStyleSheetListAdapter) ((INodeNotifier) doc)
-					.getAdapterFor(IStyleSheetListAdapter.class);
-			StyleSheetList ssl = (adapter == null ? null : adapter
-					.getStyleSheets());
-
-			CSSClassTraverser traverser = new CSSClassTraverser();
-			if (ssl != null) {
-				for (int i = 0, numStyles = ssl.getLength(); i < numStyles; i++) {
-					// loop for styles (<style> and <link>)
-					org.w3c.dom.stylesheets.StyleSheet ss = ssl.item(i);
-
-					try {
-						traverser.apply((ICSSNode) ss);
-					} catch (ClassCastException ex) {
-						JSFCorePlugin.log(ex, "Unable to cast to CSS style"); //$NON-NLS-1$
-					}
-				}
-				c = traverser.getClassNames();
-			}
-		}
-		String[] result = new String[c.size()];
-		c.toArray(result);
-		return result;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/CSSIdType.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/CSSIdType.java
deleted file mode 100644
index 4fa8ee1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/CSSIdType.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.taglibprocessing.attributevalues;
-
-import org.eclipse.jst.jsf.metadataprocessors.AbstractRootTypeDescriptor;
-import org.eclipse.jst.jsf.metadataprocessors.IMetaDataEnabledFeature;
-
-/**
- * Represents CSS id attribute type
- * EXPERIMENTAL - may change or disappear
- *
- */
-public class CSSIdType extends AbstractRootTypeDescriptor implements
-		IMetaDataEnabledFeature {
-
-	/**
-	 * Constructor
-	 */
-	public CSSIdType() {
-		// TODO Auto-generated constructor stub
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/CSSStyleType.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/CSSStyleType.java
deleted file mode 100644
index 1c7f35b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/CSSStyleType.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.taglibprocessing.attributevalues;
-
-import org.eclipse.jst.jsf.metadataprocessors.AbstractRootTypeDescriptor;
-import org.eclipse.jst.jsf.metadataprocessors.IMetaDataEnabledFeature;
-
-/**
- * Represents CSS style attribute.
- * No features currently supported.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- *
- */
-public class CSSStyleType extends AbstractRootTypeDescriptor implements
-		IMetaDataEnabledFeature {
-
-	/**
-	 * Constructor
-	 */
-	public CSSStyleType() {
-		//
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/CharacterType.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/CharacterType.java
deleted file mode 100644
index 5ec13d8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/CharacterType.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.taglibprocessing.attributevalues;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jst.jsf.metadataprocessors.AbstractRootTypeDescriptor;
-import org.eclipse.jst.jsf.metadataprocessors.IMetaDataEnabledFeature;
-import org.eclipse.jst.jsf.metadataprocessors.features.IValidValues;
-import org.eclipse.jst.jsf.metadataprocessors.features.IValidationMessage;
-import org.eclipse.jst.jsf.metadataprocessors.features.ValidationMessage;
-
-/**
- * Represents a single unicode character
- */
-public class CharacterType extends AbstractRootTypeDescriptor implements
-		IMetaDataEnabledFeature, IValidValues{
-
-	private List _msgs;
-
-	/**
-	 * Constructor
-	 */
-	public CharacterType() {
-		super();
-	}
-
-	public List<IValidationMessage> getValidationMessages() {
-		if (_msgs == null){
-			_msgs = new ArrayList<IValidationMessage>(1);
-		}
-		return _msgs;
-	}
-
-	public boolean isValidValue(String value) {
-		if (value.length() != 1)
-			getValidationMessages().add(new ValidationMessage(Messages.CharacterType_0));
-			
-		return getValidationMessages().size() == 0;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/ColorType.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/ColorType.java
deleted file mode 100644
index 897a399..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/ColorType.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation., and others
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Yury Kats/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.taglibprocessing.attributevalues;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jst.jsf.metadataprocessors.features.IPossibleValues;
-import org.eclipse.jst.jsf.metadataprocessors.features.PossibleValue;
-import org.eclipse.swt.graphics.ImageData;
-import org.eclipse.swt.graphics.PaletteData;
-import org.eclipse.swt.graphics.RGB;
-
-/**
- * Meta-data processing type representing a color.
- * A color is defined as in html spec http://www.w3.org/TR/html4/types.html#type-color
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author ykats
- */
-
-public class ColorType extends EnumerationType implements IPossibleValues {
-	
-	/**
-	 * List of standard colors
-	 * See http://www.w3.org/TR/html4/types.html#type-color
-	 */
-	private final static String[] COLORS = {"Black", "Silver", "Gray", "White", "Maroon", "Red", "Purple", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$
-				"Fuchsia", "Green", "Lime", "Olive", "Yellow", "Navy", "Blue", "Teal","Aqua"}; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ //$NON-NLS-9$
-		//if ordering changes, must change RGB[] ordering
-
-	private RGB[] _rgb;
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.taglibprocessing.attributevalues.EnumerationType#getReturnType()
-	 */
-	protected String getReturnType(){ return "java.lang.String";} //$NON-NLS-1$
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.metadataprocessors.features.IValidValues#isValidValue(java.lang.String)
-	 */
-	public boolean isValidValue(String value) {	
-		boolean bValid = true;
-		String trimmedVal = value.trim();
-		if (trimmedVal.length() == 0)
-			bValid = false;
-		else if (trimmedVal.charAt(0) == '#' && trimmedVal.length() == 7) {
-			for (int i=1; i<7; i++) {
-				if (trimmedVal.charAt(i) < '0' ||
-					(trimmedVal.charAt(i) > '9' && trimmedVal.charAt(i) < 'A') ||
-					(trimmedVal.charAt(i) > 'F' && trimmedVal.charAt(i) < 'a') ||
-					trimmedVal.charAt(i) > 'f') {
-					bValid = false;
-					break;
-				}
-			}
-		}
-		else {
-			bValid = false;
-			for (int i = 0; i < COLORS.length; i++) {
-				if(trimmedVal.equalsIgnoreCase(COLORS[i])) {
-					bValid = true;
-					break;
-				}
-			}
-		}
-		
-		if(!bValid) {
-			addNewValidationMessage(Messages.ColorType_invalid_color);
-		}
-		
-		return getValidationMessages().isEmpty();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.metadataprocessors.features.IPossibleValues#getPossibleValues()
-	 */
-	public List getPossibleValues() {
-		List ret = new ArrayList(COLORS.length);
-		for (int i=0;i < COLORS.length;i++){
-			PossibleValue pv = new PossibleValue(COLORS[i]);
-			pv.setIcon(createImage(i));
-			ret.add(pv);
-		}
-		return ret;
-	}
-
-	private ImageDescriptor createImage(int color) {
-		PaletteData pd = getPaletteData(color);
-		return ImageDescriptor.createFromImageData(new ImageData(16, 16, 1, pd));
-	}
-
-	private PaletteData getPaletteData(int color){
-		if (_rgb == null){
-			_rgb = new RGB[16];
-			_rgb[0] = new RGB(0,0,0);//black
-			_rgb[1] = new RGB(192,192,192);//silver
-			_rgb[2] = new RGB(128,128,128);//gray
-			_rgb[3] = new RGB(255,255,255);//white
-			_rgb[4] = new RGB(128,0,0);//Maroon
-			_rgb[5] = new RGB(255,0,0);//Red
-			_rgb[6] = new RGB(128,0,128);//Purple
-			_rgb[7] = new RGB(255,0,255);//Fuchsia
-			_rgb[8] = new RGB(0,128,0);//Green
-			_rgb[9] = new RGB(0,255,0);//Lime
-			_rgb[10] = new RGB(128,128,0);//Olive
-			_rgb[11] = new RGB(255,255,0);//Yellow
-			_rgb[12] = new RGB(0,0,128);//Navy
-			_rgb[13] = new RGB(0,0,255);//Blue
-			_rgb[14] = new RGB(0,128,128);//Teal
-			_rgb[15] = new RGB(0,255,255);//Aqua
-		}
-		RGB[] rgbColor = new RGB[1];
-		System.arraycopy(_rgb, color, rgbColor, 0, 1);
-		return new PaletteData(rgbColor);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/ComponentBindingType.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/ComponentBindingType.java
deleted file mode 100644
index 4e394ed..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/ComponentBindingType.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.taglibprocessing.attributevalues;
-
-
-import org.eclipse.jst.jsf.metadataprocessors.features.IValidELValues;
-import org.eclipse.jst.jsf.metadataprocessors.features.IValidValues;
-import org.eclipse.jst.jsf.metadataprocessors.features.IValidationMessage;
-import org.eclipse.jst.jsf.metadataprocessors.features.ValidationMessage;
-
-/**
- * Meta-data processing type representing a "binding" attribute
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * @author Gerry Kessler - Oracle
- */
-public class ComponentBindingType extends ValueBindingType implements
-		IValidValues, IValidELValues {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.metadataprocessors.features.IValidValues#isValidValue(java.lang.String)
-	 */
-	public boolean isValidValue(String value) {
-		//Strings are invalid.   Requires a EL value binding.
-		IValidationMessage msg = new ValidationMessage(Messages.ComponentBindingType_invalid_value);
-		getValidationMessages().add(msg);
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/ComponentIDType.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/ComponentIDType.java
deleted file mode 100644
index 82c9957..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/ComponentIDType.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.taglibprocessing.attributevalues;
-
-
-import org.eclipse.jst.jsf.common.internal.types.CompositeType;
-import org.eclipse.jst.jsf.metadataprocessors.features.ELIsNotValidException;
-import org.eclipse.jst.jsf.metadataprocessors.features.IValidELValues;
-import org.eclipse.jst.jsf.metadataprocessors.features.IValidValues;
-import org.eclipse.jst.jsf.metadataprocessors.features.IValidationMessage;
-import org.eclipse.jst.jsf.metadataprocessors.features.ValidationMessage;
-
-/**
- * Meta-data processing type representing an "id" attribute
- * Represents an ID or NAME HTML attribute type.
- * <br>
- * Attribute values of type ID and NAME must begin with a letter in the range A-Z or a-z or underscore ("_") and 
- * may be followed by letters (A-Z, a-z), digits (0-9), hyphens ("-"), underscores ("_"), colons (":"),
- * and periods ("."). 
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * @author Gerry Kessler - Oracle
- * TODO: finish regex validation
- */
-public class ComponentIDType extends ValueBindingType implements
-		IValidValues, IValidELValues {
-
-//	private static Pattern idPattern1 = Pattern.compile("[A-Za-z_]");;
-//	private static Pattern idPattern2 = Pattern.compile("^[:\\w\\.\\-]*");
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.taglibprocessing.attributevalues.ValueBindingType#getExpectedRuntimeType()
-	 */
-	public CompositeType getExpectedRuntimeType() throws ELIsNotValidException {
-		throw new ELIsNotValidException(Messages.ComponentIDType_invalid_as_el);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.metadataprocessors.features.IValidValues#isValidValue(java.lang.String)
-	 */
-	public boolean isValidValue(String value) {
-		IValidationMessage msg = null;
-		if (value != null && value.trim().length() == 0)
-			msg = new ValidationMessage(Messages.ComponentIDType_invalid_value);
-		else {
-			//we could validate uniqueness, but will not for the time being.  This would require a DT FacesContext.
-			//any other coercion rules apply here?
-			return true;
-		}			
-		getValidationMessages().add(msg);
-		return false;
-
-//		if (value != null && value.trim().length() == 0)
-//			msg = new ValidationMessage(Messages.ComponentIDType_invalid_value);
-//
-////		else if (!idPattern.matcher(value.trim()).find())
-////			fail = true;
-//		else if (!idPattern1.matcher(value.trim().substring(0, 1)).find())
-//			msg = new ValidationMessage("id must begin with alpha character");
-//		else if ((value.trim().length() > 1) && (!( idPattern2.matcher(value.trim().substring(1)).find())))
-//			msg = new ValidationMessage("illegal characters in id: must be alphanum, period, colon, and hyphen only");
-//		else {
-//			//we could validate uniqueness, but will not for the time being.  This would require a DT FacesContext.
-//			//any other coercion rules apply here?		
-//		}
-//		if (msg != null)
-//			getValidationMessages().add(msg);
-//			
-//		return getValidationMessages().size() == 0;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/ContentType.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/ContentType.java
deleted file mode 100644
index 4fb9ec4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/ContentType.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation., and others
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Yury Kats/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.taglibprocessing.attributevalues;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jst.jsf.metadataprocessors.features.IPossibleValues;
-import org.eclipse.jst.jsf.metadataprocessors.features.PossibleValue;
-
-/**
- * Meta-data processing type representing a content (MIME) type.
- * A ContentType is defined as in 4.0 html spec http://www.w3.org/TR/html401/types.html#h-6.7
- * 
- * <p><b>Provisional API - subject to change</b></p>
- */
-
-public class ContentType extends EnumerationType implements IPossibleValues {
-	
-	/**
-	 * List of some of the more common content (MIME) types
-	 * See http://www.w3.org/TR/html4/types.html#type-color
-	 */
-	private final static String[] commontypes = {
-		"text/html",  //$NON-NLS-1$
-		"text/css",  //$NON-NLS-1$
-		"image/jpeg",  //$NON-NLS-1$
-		"image/gif",  //$NON-NLS-1$
-		"audio/mpeg",  //$NON-NLS-1$
-		"video/mpeg", //$NON-NLS-1$
-		"video/quicktime",  //$NON-NLS-1$
-		"text/javascript" //$NON-NLS-1$
-	};
-
-	protected String getReturnType(){ return "java.lang.String";} //$NON-NLS-1$
-
-	public boolean isValidValue(String value) {	
-		boolean bValid = true;
-		if (value == null || value.trim().length() == 0)
-			bValid = false;
-		
-		if(!bValid) {
-			addNewValidationMessage(Messages.ContentType_MIME_not_empty);
-		}
-		
-		return getValidationMessages().isEmpty();
-	}
-
-	public List getPossibleValues() {
-		List ret = new ArrayList(commontypes.length);
-		for (int i=0;i < commontypes.length;i++){
-			PossibleValue pv = new PossibleValue(commontypes[i]);
-			ret.add(pv);
-		}
-		return ret;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/CurrencyCodeType.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/CurrencyCodeType.java
deleted file mode 100644
index 4dc6db8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/CurrencyCodeType.java
+++ /dev/null
@@ -1,232 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation., and others
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *   Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.taglibprocessing.attributevalues;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.jst.jsf.metadataprocessors.features.IPossibleValues;
-import org.eclipse.jst.jsf.metadataprocessors.features.PossibleValue;
-
-/**
- * ISO-4217 Currency codes 
- */
-public class CurrencyCodeType extends EnumerationType implements IPossibleValues {
-	private static final CurrencyCodeMap _map = new CurrencyCodeMap();
-
-	@Override
-	protected String getReturnType() {
-		return "java.lang.String"; //$NON-NLS-1$
-	}
-
-	public List getPossibleValues() {
-		List ret = new ArrayList();
-		for(Iterator it = _map.keySet().iterator();it.hasNext();){
-			String key = (String)it.next();
-			String value = _map.get(key);
-			PossibleValue pv = new PossibleValue(key, value);
-			ret.add(pv);
-		}
-		return ret;
-	}
-
-	public boolean isValidValue(String value) {
-		if(!_map.containsKey(value.toUpperCase())) {
-			addNewValidationMessage(Messages.CurrencyCodeType_invalid);
-		}
-
-		return getValidationMessages().isEmpty();
-	}
-
-	private static class CurrencyCodeMap extends HashMap<String, String> {
-		
-		private static final long serialVersionUID = 1L;
-
-		CurrencyCodeMap(){
-			put("AED",Messages.CurrencyCodeType_2); //$NON-NLS-1$ 
-			put("AFA",Messages.CurrencyCodeType_3); //$NON-NLS-1$ 
-			put("ALL",Messages.CurrencyCodeType_4); //$NON-NLS-1$ 
-			put("AMD",Messages.CurrencyCodeType_5); //$NON-NLS-1$ 
-			put("ANG",Messages.CurrencyCodeType_6); //$NON-NLS-1$ 
-			put("AOA",Messages.CurrencyCodeType_7); //$NON-NLS-1$ 
-			put("ARS",Messages.CurrencyCodeType_8); //$NON-NLS-1$ 
-			put("AUD",Messages.CurrencyCodeType_9); //$NON-NLS-1$ 
-			put("AWG",Messages.CurrencyCodeType_10); //$NON-NLS-1$ 
-			put("AZM",Messages.CurrencyCodeType_11); //$NON-NLS-1$ 
-			put("BAM",Messages.CurrencyCodeType_12); //$NON-NLS-1$ 
-			put("BBD",Messages.CurrencyCodeType_13); //$NON-NLS-1$ 
-			put("BDT",Messages.CurrencyCodeType_14); //$NON-NLS-1$ 
-			put("BGN",Messages.CurrencyCodeType_15); //$NON-NLS-1$ 
-			put("BHD",Messages.CurrencyCodeType_16); //$NON-NLS-1$ 
-			put("BIF",Messages.CurrencyCodeType_17); //$NON-NLS-1$ 
-			put("BMD",Messages.CurrencyCodeType_18); //$NON-NLS-1$ 
-			put("BND",Messages.CurrencyCodeType_19); //$NON-NLS-1$ 
-			put("BOB",Messages.CurrencyCodeType_20); //$NON-NLS-1$ 
-			put("BRL",Messages.CurrencyCodeType_21); //$NON-NLS-1$ 
-			put("BSD",Messages.CurrencyCodeType_22); //$NON-NLS-1$ 
-			put("BTN",Messages.CurrencyCodeType_23); //$NON-NLS-1$ 
-			put("BWP",Messages.CurrencyCodeType_24); //$NON-NLS-1$ 
-			put("BYR",Messages.CurrencyCodeType_25); //$NON-NLS-1$ 
-			put("BZD",Messages.CurrencyCodeType_26); //$NON-NLS-1$ 
-			put("CAD",Messages.CurrencyCodeType_27); //$NON-NLS-1$ 
-			put("CDF",Messages.CurrencyCodeType_28); //$NON-NLS-1$ 
-			put("CHF",Messages.CurrencyCodeType_29); //$NON-NLS-1$ 
-			put("CLP",Messages.CurrencyCodeType_30); //$NON-NLS-1$ 
-			put("CNY",Messages.CurrencyCodeType_31); //$NON-NLS-1$ 
-			put("COP",Messages.CurrencyCodeType_32); //$NON-NLS-1$ 
-			put("CRC",Messages.CurrencyCodeType_33); //$NON-NLS-1$ 
-			put("CSD",Messages.CurrencyCodeType_34); //$NON-NLS-1$ 
-			put("CUP",Messages.CurrencyCodeType_35); //$NON-NLS-1$ 
-			put("CVE",Messages.CurrencyCodeType_36); //$NON-NLS-1$ 
-			put("CYP",Messages.CurrencyCodeType_37); //$NON-NLS-1$ 
-			put("CZK",Messages.CurrencyCodeType_38); //$NON-NLS-1$ 
-			put("DJF",Messages.CurrencyCodeType_39); //$NON-NLS-1$ 
-			put("DKK",Messages.CurrencyCodeType_40); //$NON-NLS-1$ 
-			put("DOP",Messages.CurrencyCodeType_41); //$NON-NLS-1$ 
-			put("DZD",Messages.CurrencyCodeType_42); //$NON-NLS-1$ 
-			put("EEK",Messages.CurrencyCodeType_43); //$NON-NLS-1$ 
-			put("EGP",Messages.CurrencyCodeType_44); //$NON-NLS-1$ 
-			put("ERN",Messages.CurrencyCodeType_45); //$NON-NLS-1$ 
-			put("ETB",Messages.CurrencyCodeType_46); //$NON-NLS-1$ 
-			put("EUR",Messages.CurrencyCodeType_47); //$NON-NLS-1$ 
-			put("FJD",Messages.CurrencyCodeType_48); //$NON-NLS-1$ 
-			put("FKP",Messages.CurrencyCodeType_49); //$NON-NLS-1$ 
-			put("GBP",Messages.CurrencyCodeType_50); //$NON-NLS-1$ 
-			put("GEL",Messages.CurrencyCodeType_51); //$NON-NLS-1$ 
-			put("GGP",Messages.CurrencyCodeType_52); //$NON-NLS-1$ 
-			put("GHC",Messages.CurrencyCodeType_53); //$NON-NLS-1$ 
-			put("GIP",Messages.CurrencyCodeType_54); //$NON-NLS-1$ 
-			put("GMD",Messages.CurrencyCodeType_55); //$NON-NLS-1$ 
-			put("GNF",Messages.CurrencyCodeType_56); //$NON-NLS-1$ 
-			put("GTQ",Messages.CurrencyCodeType_57); //$NON-NLS-1$ 
-			put("GYD",Messages.CurrencyCodeType_58); //$NON-NLS-1$ 
-			put("HKD",Messages.CurrencyCodeType_59); //$NON-NLS-1$ 
-			put("HNL",Messages.CurrencyCodeType_60); //$NON-NLS-1$ 
-			put("HRK",Messages.CurrencyCodeType_61); //$NON-NLS-1$ 
-			put("HTG",Messages.CurrencyCodeType_62); //$NON-NLS-1$ 
-			put("HUF",Messages.CurrencyCodeType_63); //$NON-NLS-1$ 
-			put("IDR",Messages.CurrencyCodeType_64); //$NON-NLS-1$ 
-			put("ILS",Messages.CurrencyCodeType_65); //$NON-NLS-1$ 
-			put("IMP",Messages.CurrencyCodeType_66); //$NON-NLS-1$ 
-			put("INR",Messages.CurrencyCodeType_67); //$NON-NLS-1$ 
-			put("IQD",Messages.CurrencyCodeType_68); //$NON-NLS-1$ 
-			put("IRR",Messages.CurrencyCodeType_69); //$NON-NLS-1$ 
-			put("ISK",Messages.CurrencyCodeType_70); //$NON-NLS-1$ 
-			put("JEP",Messages.CurrencyCodeType_71); //$NON-NLS-1$ 
-			put("JMD",Messages.CurrencyCodeType_72); //$NON-NLS-1$ 
-			put("JOD",Messages.CurrencyCodeType_73); //$NON-NLS-1$ 
-			put("JPY",Messages.CurrencyCodeType_74); //$NON-NLS-1$ 
-			put("KES",Messages.CurrencyCodeType_75); //$NON-NLS-1$ 
-			put("KGS",Messages.CurrencyCodeType_76); //$NON-NLS-1$ 
-			put("KHR",Messages.CurrencyCodeType_77); //$NON-NLS-1$ 
-			put("KMF",Messages.CurrencyCodeType_78); //$NON-NLS-1$ 
-			put("KPW",Messages.CurrencyCodeType_79); //$NON-NLS-1$ 
-			put("KRW",Messages.CurrencyCodeType_80); //$NON-NLS-1$ 
-			put("KWD",Messages.CurrencyCodeType_81); //$NON-NLS-1$ 
-			put("KYD",Messages.CurrencyCodeType_82); //$NON-NLS-1$ 
-			put("KZT",Messages.CurrencyCodeType_83); //$NON-NLS-1$ 
-			put("LAK",Messages.CurrencyCodeType_84); //$NON-NLS-1$ 
-			put("LBP",Messages.CurrencyCodeType_85); //$NON-NLS-1$ 
-			put("LKR",Messages.CurrencyCodeType_86); //$NON-NLS-1$ 
-			put("LRD",Messages.CurrencyCodeType_87); //$NON-NLS-1$ 
-			put("LSL",Messages.CurrencyCodeType_88); //$NON-NLS-1$ 
-			put("LTL",Messages.CurrencyCodeType_89); //$NON-NLS-1$ 
-			put("LVL",Messages.CurrencyCodeType_90); //$NON-NLS-1$ 
-			put("LYD",Messages.CurrencyCodeType_91); //$NON-NLS-1$ 
-			put("MAD",Messages.CurrencyCodeType_92); //$NON-NLS-1$ 
-			put("MDL",Messages.CurrencyCodeType_93); //$NON-NLS-1$ 
-			put("MGA",Messages.CurrencyCodeType_94); //$NON-NLS-1$ 
-			put("MKD",Messages.CurrencyCodeType_95); //$NON-NLS-1$ 
-			put("MMK",Messages.CurrencyCodeType_96); //$NON-NLS-1$ 
-			put("MNT",Messages.CurrencyCodeType_97); //$NON-NLS-1$ 
-			put("MOP",Messages.CurrencyCodeType_98); //$NON-NLS-1$ 
-			put("MRO",Messages.CurrencyCodeType_99); //$NON-NLS-1$ 
-			put("MTL",Messages.CurrencyCodeType_100); //$NON-NLS-1$ 
-			put("MUR",Messages.CurrencyCodeType_101); //$NON-NLS-1$ 
-			put("MVR",Messages.CurrencyCodeType_102); //$NON-NLS-1$ 
-			put("MWK",Messages.CurrencyCodeType_103); //$NON-NLS-1$ 
-			put("MXN",Messages.CurrencyCodeType_104); //$NON-NLS-1$ 
-			put("MYR",Messages.CurrencyCodeType_105); //$NON-NLS-1$ 
-			put("MZM",Messages.CurrencyCodeType_106); //$NON-NLS-1$ 
-			put("NAD",Messages.CurrencyCodeType_107); //$NON-NLS-1$ 
-			put("NGN",Messages.CurrencyCodeType_108); //$NON-NLS-1$ 
-			put("NIO",Messages.CurrencyCodeType_109); //$NON-NLS-1$ 
-			put("NOK",Messages.CurrencyCodeType_110); //$NON-NLS-1$ 
-			put("NPR",Messages.CurrencyCodeType_111); //$NON-NLS-1$ 
-			put("NZD",Messages.CurrencyCodeType_112); //$NON-NLS-1$ 
-			put("OMR",Messages.CurrencyCodeType_113); //$NON-NLS-1$ 
-			put("PAB",Messages.CurrencyCodeType_114); //$NON-NLS-1$ 
-			put("PEN",Messages.CurrencyCodeType_115); //$NON-NLS-1$ 
-			put("PGK",Messages.CurrencyCodeType_116); //$NON-NLS-1$ 
-			put("PHP",Messages.CurrencyCodeType_117); //$NON-NLS-1$ 
-			put("PKR",Messages.CurrencyCodeType_118); //$NON-NLS-1$ 
-			put("PLN",Messages.CurrencyCodeType_119); //$NON-NLS-1$ 
-			put("PYG",Messages.CurrencyCodeType_120); //$NON-NLS-1$ 
-			put("QAR",Messages.CurrencyCodeType_121); //$NON-NLS-1$ 
-			put("ROL",Messages.CurrencyCodeType_122); //$NON-NLS-1$ 
-			put("RUB",Messages.CurrencyCodeType_123); //$NON-NLS-1$ 
-			put("RWF",Messages.CurrencyCodeType_124); //$NON-NLS-1$ 
-			put("SAR",Messages.CurrencyCodeType_125); //$NON-NLS-1$ 
-			put("SBD",Messages.CurrencyCodeType_126); //$NON-NLS-1$ 
-			put("SCR",Messages.CurrencyCodeType_127); //$NON-NLS-1$ 
-			put("SDD",Messages.CurrencyCodeType_128); //$NON-NLS-1$ 
-			put("SEK",Messages.CurrencyCodeType_129); //$NON-NLS-1$ 
-			put("SGD",Messages.CurrencyCodeType_130); //$NON-NLS-1$ 
-			put("SHP",Messages.CurrencyCodeType_131); //$NON-NLS-1$ 
-			put("SIT",Messages.CurrencyCodeType_132); //$NON-NLS-1$ 
-			put("SKK",Messages.CurrencyCodeType_133); //$NON-NLS-1$ 
-			put("SLL",Messages.CurrencyCodeType_134); //$NON-NLS-1$ 
-			put("SOS",Messages.CurrencyCodeType_135); //$NON-NLS-1$ 
-			put("SPL",Messages.CurrencyCodeType_136); //$NON-NLS-1$ 
-			put("SRD",Messages.CurrencyCodeType_137); //$NON-NLS-1$ 
-			put("STD",Messages.CurrencyCodeType_138); //$NON-NLS-1$ 
-			put("SVC",Messages.CurrencyCodeType_139); //$NON-NLS-1$ 
-			put("SYP",Messages.CurrencyCodeType_140); //$NON-NLS-1$ 
-			put("SZL",Messages.CurrencyCodeType_141); //$NON-NLS-1$ 
-			put("THB",Messages.CurrencyCodeType_142); //$NON-NLS-1$ 
-			put("TJS",Messages.CurrencyCodeType_143); //$NON-NLS-1$ 
-			put("TMM",Messages.CurrencyCodeType_144); //$NON-NLS-1$ 
-			put("TND",Messages.CurrencyCodeType_145); //$NON-NLS-1$ 
-			put("TOP",Messages.CurrencyCodeType_146); //$NON-NLS-1$ 
-			put("TRL",Messages.CurrencyCodeType_147); //$NON-NLS-1$ 
-			put("TRY",Messages.CurrencyCodeType_148); //$NON-NLS-1$ 
-			put("TTD",Messages.CurrencyCodeType_149); //$NON-NLS-1$ 
-			put("TVD",Messages.CurrencyCodeType_150); //$NON-NLS-1$ 
-			put("TWD",Messages.CurrencyCodeType_151); //$NON-NLS-1$ 
-			put("TZS",Messages.CurrencyCodeType_152); //$NON-NLS-1$ 
-			put("UAH",Messages.CurrencyCodeType_153); //$NON-NLS-1$ 
-			put("UGX",Messages.CurrencyCodeType_154); //$NON-NLS-1$ 
-			put("USD",Messages.CurrencyCodeType_155); //$NON-NLS-1$ 
-			put("UYU",Messages.CurrencyCodeType_156); //$NON-NLS-1$ 
-			put("UZS",Messages.CurrencyCodeType_157); //$NON-NLS-1$ 
-			put("VEB",Messages.CurrencyCodeType_158); //$NON-NLS-1$ 
-			put("VND",Messages.CurrencyCodeType_159); //$NON-NLS-1$ 
-			put("VUV",Messages.CurrencyCodeType_160); //$NON-NLS-1$ 
-			put("WST",Messages.CurrencyCodeType_161); //$NON-NLS-1$ 
-			put("XAF",Messages.CurrencyCodeType_162); //$NON-NLS-1$ 
-			put("XAG",Messages.CurrencyCodeType_163); //$NON-NLS-1$ 
-			put("XAU",Messages.CurrencyCodeType_164); //$NON-NLS-1$ 
-			put("XCD",Messages.CurrencyCodeType_165); //$NON-NLS-1$ 
-			put("XDR",Messages.CurrencyCodeType_166); //$NON-NLS-1$ 
-			put("XOF",Messages.CurrencyCodeType_167); //$NON-NLS-1$ 
-			put("XPD",Messages.CurrencyCodeType_168); //$NON-NLS-1$ 
-			put("XPF",Messages.CurrencyCodeType_169); //$NON-NLS-1$ 
-			put("XPT",Messages.CurrencyCodeType_170); //$NON-NLS-1$ 
-			put("YER",Messages.CurrencyCodeType_171); //$NON-NLS-1$ 
-			put("ZAR",Messages.CurrencyCodeType_172); //$NON-NLS-1$ 
-			put("ZMK",Messages.CurrencyCodeType_173); //$NON-NLS-1$ 
-			put("ZWD",Messages.CurrencyCodeType_174); //$NON-NLS-1$ 
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/DateTimePatternType.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/DateTimePatternType.java
deleted file mode 100644
index d48f28d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/DateTimePatternType.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation., and others
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.taglibprocessing.attributevalues;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IDOMContextResolver;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IStructuredDocumentContextResolverFactory;
-import org.eclipse.jst.jsf.metadataprocessors.AbstractRootTypeDescriptor;
-import org.eclipse.jst.jsf.metadataprocessors.features.IPossibleValues;
-import org.eclipse.jst.jsf.metadataprocessors.features.PossibleValue;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMAttr;
-import org.w3c.dom.Node;
-
-/**
- * Meta-data processing type representing a Date, Time and DateTime Pattern types.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- */
-
-public class DateTimePatternType extends AbstractRootTypeDescriptor implements IPossibleValues{
-	//should we ever validate the patterns, extend EnumerationType
-	final private static String[] DATEPATTERNS = {"M/d/yy", "EEE, M/d/yy", "MM/dd/yyyy", "EEE, MM/dd/yyyy", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
-        "MMM d, yyyy", "EEE, MMM d, yyyy", "MMMM d, yyyy", "EEEE, MMMM d, yyyy", "MMMM yyyy" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ };
-	};
-	
-	final private static String[] TIMEPATTERNS     = {"hh:mm", "hh:mm z", "HH:mm z", "HH:mm:ss z" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
-	};
-	  
-	final private static String[] DATETIMEPATTERNS = {"M/d/yy hh:mm", "EEE, M/d/yy hh:mm", "MM/dd/yyyy HH:mm:ss z", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-		"EEE, MM/dd/yyyy HH:mm:ss z", "MMM d, yyyy HH:mm z", "EEE, MMM d, yyyy HH:mm z", "MMMM d, yyyy HH:mm z", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
-		"EEEE, MMMM d, yyyy HH:mm z" //$NON-NLS-1$
-	};
-
-	public List getPossibleValues() {
-		List ret = new ArrayList();		
-		String typeVal = getTypeValue();
-		if ("date".equalsIgnoreCase(typeVal)){ //$NON-NLS-1$
-			for (int i=0;i<DATEPATTERNS.length;i++){
-				ret.add(new PossibleValue(DATEPATTERNS[i]));
-			}
-		}
-		else if ("time".equalsIgnoreCase(typeVal)){ //$NON-NLS-1$
-			for (int i=0;i<TIMEPATTERNS.length;i++){
-				ret.add(new PossibleValue(TIMEPATTERNS[i]));
-			}
-		}
-		else {	
-			for (int i=0;i<DATETIMEPATTERNS.length;i++){
-				ret.add(new PossibleValue(DATETIMEPATTERNS[i]));
-			}
-		}
-		return ret;
-	}
-	
-	private String getTypeValue() {
-		if (getStructuredDocumentContext() != null){
-			IDOMContextResolver resolver = IStructuredDocumentContextResolverFactory.INSTANCE.getDOMContextResolver(getStructuredDocumentContext());
-			if (resolver != null){
-				Node aNode = resolver.getNode();
-				if (aNode instanceof IDOMAttr) {
-					Node tagNode = ((IDOMAttr)aNode).getOwnerElement();
-					IDOMAttr typeNode = (IDOMAttr) tagNode.getAttributes().getNamedItem("type"); //$NON-NLS-1$
-					if (typeNode != null)
-						return typeNode.getValue();
-				}				
-			}
-		}
-		return ""; //$NON-NLS-1$
-	}
-
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/DirectBindingType.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/DirectBindingType.java
deleted file mode 100644
index 2c5f7c0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/DirectBindingType.java
+++ /dev/null
@@ -1,21 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.taglibprocessing.attributevalues;
-/**
- * Abstract meta-data processing type
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * @author Gerry Kessler - Oracle
- */
-public abstract class DirectBindingType extends BindingType {
-    // TODO: what is the point of this?
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/DoubleType.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/DoubleType.java
deleted file mode 100644
index 0e73d4a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/DoubleType.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.taglibprocessing.attributevalues;
-
-import java.util.List;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * Meta-data processing type representing a "double" attribute value runtime type
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * @author Gerry Kessler - Oracle
- */
-public class DoubleType extends NumberType {
-	private static final String INVALID_DOUBLE = Messages.DoubleType_invalid_double;
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.taglibprocessing.attributevalues.EnumerationType#getReturnType()
-	 */
-	protected String getReturnType(){ return "double";} //$NON-NLS-1$
-	
-	/**
-	 * Type coercion according to JSP 2.0 spec: JSP.1.14.2.1 Conversions from String values
-	 * @see org.eclipse.jst.jsf.metadataprocessors.features.IValidValues#isValidValue(java.lang.String)
-	 **/
-	public boolean isValidValue(String value) {		
-		try {
-			Double dbl = Double.valueOf(value);
-			exceedsMaxValue(dbl.doubleValue());
-			lessThanMinValue(dbl.doubleValue());
-			if (!(minFound || maxFound)){
-				List validVals = getMDValidValues();
-				if (!validVals.isEmpty()){
-					if (!validVals.contains(value)){
-						addNewValidationMessage(Messages.DoubleType_invalid_member);//fix me
-					}
-				}
-			}
-			return getValidationMessages().isEmpty();
-		} catch (NumberFormatException e) {
-			addNewValidationMessage(INVALID_DOUBLE);
-			return false;
-		}
-
-	}
-
-	private void exceedsMaxValue(double dbl) {
-		String strMax = getValidMaximumValue();
-		if (strMax != null){
-			try {
-				double max = Double.valueOf(strMax).doubleValue();
-				maxFound = true;
-				if (dbl > max){
-					addNewValidationMessage(NLS.bind(EXCEEDS_MAX, strMax));
-				}
-			} catch (NumberFormatException e) {
-				//TODO: ignore error????  or log it????
-			}
-		}
-		
-	}
-	
-	private void lessThanMinValue(double dbl) {
-		String strMin = getValidMinimumValue();
-		if (strMin != null){
-			try {
-				double max = Double.valueOf(strMin).doubleValue();
-				minFound = true;
-				if (dbl < max){
-					addNewValidationMessage(NLS.bind(LESS_THAN_MIN, strMin));
-				}
-			} catch (NumberFormatException e) {
-				//TODO: ignore error????  or log it????
-			}
-		}
-		
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/EnumerationType.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/EnumerationType.java
deleted file mode 100644
index f92684f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/EnumerationType.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *	  Vadim Dmitriev
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.taglibprocessing.attributevalues;
-
-import org.eclipse.jdt.core.Signature;
-import org.eclipse.jst.jsf.common.internal.types.CompositeType;
-import org.eclipse.jst.jsf.metadataprocessors.features.ELIsNotValidException;
-
-/**
- * Abstract meta-data processing type representing an enumeration attribute value runtime type
- * with a single signature
- * 
- * @author Gerry Kessler - Oracle
- */
-public abstract class EnumerationType extends AbstractEnumerationType
-{
-
-	/**
-	 * @return return Java type as string (i.e. boolean, java.lang.String, etc.)
-	 * Must not be null.
-	 */
-	protected abstract String getReturnType();
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.metadataprocessors.features.IValidELValues#getExpectedRuntimeType()
-	 */
-	public CompositeType getExpectedRuntimeType() throws ELIsNotValidException
-	{
-		String type = Signature.createTypeSignature(getReturnType(), true);
-		return new CompositeType(type, getAssignmentType());
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/ExpressionBindingType.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/ExpressionBindingType.java
deleted file mode 100644
index 1ae1d98..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/ExpressionBindingType.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.taglibprocessing.attributevalues;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Abstract meta-data processing type representing an expression binding attribute value runtime type
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * @author Gerry Kessler - Oracle
- */
-public abstract class ExpressionBindingType extends BindingType  {
-	/**
-	 * Valid values is any fully qualified Java type or primitive.  
-	 * Assign a value for each parameter in order
-	 */
-	public static final String RUNTIME_PARAMS_TYPES = "runtime-param-types"; //$NON-NLS-1$
-	/**
-	 * Valid values is any fully qualified Java type or primitive.  
-	 */
-	public static final String RUNTIME_RETURN_TYPE = "runtime-return-type"; //$NON-NLS-1$
-	/**
-	 * Value should be set true or false.   If not specified, the default inmplementation assumes false. 
-	 */
-	public static final String RUNTIME_SETTER_REQUIRED = "runtime-type-setter-required"; //$NON-NLS-1$
-	private List validationMessages;
-	
-
-	/**
-	 * @return String value of the "runtime-return-type" trait 
-	 */
-	protected String getReturnType() {
-		return getTraitValueAsString(RUNTIME_RETURN_TYPE);		
-	}
-
-	/**
-	 * @return String[] value of the "runtime-param-types" trait 
-	 */
-	protected String[] getParams() {
-		List params = getTraitValueAsListOfStrings(RUNTIME_PARAMS_TYPES);
-		
-		return (String[])params.toArray(new String[0]);
-	}
-
-	/**
-	 * @return lits of validation messages
-	 */
-	public List getValidationMessages() {
-		if (validationMessages == null){
-			validationMessages = new ArrayList();
-		}
-		return validationMessages;
-	}
-
-	
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/FacesConfigConverterIDFeatures.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/FacesConfigConverterIDFeatures.java
deleted file mode 100644
index 79b1c5b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/FacesConfigConverterIDFeatures.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.taglibprocessing.attributevalues;
-
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.jst.jsf.core.jsfappconfig.JSFAppConfigManager;
-import org.eclipse.jst.jsf.facesconfig.emf.ConverterType;
-import org.eclipse.jst.jsf.metadataprocessors.features.PossibleValue;
-import org.eclipse.osgi.util.NLS;
-
-/**
- * Meta-data processing feature representing an attribute value requiring a "converterid"
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * @author Gerry Kessler - Oracle
- */
-public class FacesConfigConverterIDFeatures extends FacesConfigIdentifierFeatures {
-
-	/**
-	 * Faces converter classname
-	 */
-	protected static final String CONVERTER = "javax.faces.convert.Converter"; //$NON-NLS-1$
-	/**
-	 * Imagename to use when displaying converter
-	 */
-	protected static final String IMAGE_NAME = "/icons/full/obj16/FacesConfig_Converter.gif"; //$NON-NLS-1$
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.taglibprocessing.attributevalues.FacesConfigIdentifierFeatures#getElements(org.eclipse.jst.jsf.core.jsfappconfig.JSFAppConfigManager)
-	 */
-	protected List getElements(JSFAppConfigManager mgr) {
-		if (mgr != null)
-			return mgr.getConverters();
-		return new ArrayList(0);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.taglibprocessing.attributevalues.FacesConfigIdentifierFeatures#getReturnType()
-	 */
-	protected String getReturnType(){ return CONVERTER;}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.taglibprocessing.attributevalues.FacesConfigIdentifierFeatures#getPossibleValueProposals(java.util.List)
-	 */
-	protected List getPossibleValueProposals(List elements) {
-		List ret = new ArrayList();
-		Collections.sort(elements, new ConverterSorter());
-		for (Iterator it = elements.iterator();it.hasNext();){
-			ConverterType obj = (ConverterType)it.next();
-			if (obj.getConverterId() != null && obj.getConverterId().getTextContent() != null){
-				PossibleValue pv = createProposal(obj.getConverterId().getTextContent(), obj.getDisplayName(), obj.getDescription());
-				if (pv != null){
-					pv.setIcon(getImage());
-					ret.add(pv);
-				}
-			}
-		}
-		return ret;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.taglibprocessing.attributevalues.FacesConfigIdentifierFeatures#getImageName()
-	 */
-	protected String getImageName() {		
-		return IMAGE_NAME;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.taglibprocessing.attributevalues.FacesConfigIdentifierFeatures#getMyValidationMessage(java.lang.String)
-	 */
-	protected String getMyValidationMessage(String value) {		
-		if (value == null || value.trim().equals("")) //$NON-NLS-1$
-			return Messages.FacesConfigConverterIDFeatures_converterid_empty;
-		
-		return NLS.bind(Messages.FacesConfigIdentifierType_invalid_converter_id, new String[]{singleQuote(value)});
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.taglibprocessing.attributevalues.FacesConfigIdentifierFeatures#getElementIDs(org.eclipse.jst.jsf.core.jsfappconfig.JSFAppConfigManager)
-	 */
-	protected List getElementIDs(JSFAppConfigManager mgr) {
-		List elements = getElements(mgr);
-		List ret = new ArrayList(elements.size());		
-		for (Iterator it = elements.iterator();it.hasNext();){
-			ConverterType aType = (ConverterType)it.next();
-			if (aType.getConverterId() != null && aType.getConverterId().getTextContent() != null){
-				String id = aType.getConverterId().getTextContent();
-				if (id != null)
-					ret.add(id.trim());
-			}
-		}
-		return ret;
-	}
-	
-	/**
-	 * 
-	 * Converter ID Sorter - incomplete
-	 */
-	private static class ConverterSorter implements Comparator, Serializable {
-	    /**
-         * 
-         */
-        private static final long serialVersionUID = 5255291244511783735L;
-
-        public int compare(Object o1, Object o2) {		
-			//TODO
-			return 0;
-
-		}
-		
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/FacesConfigConverterIDType.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/FacesConfigConverterIDType.java
deleted file mode 100644
index 3e81d04..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/FacesConfigConverterIDType.java
+++ /dev/null
@@ -1,20 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.taglibprocessing.attributevalues;
-
-/**
- * Type representing a FacesConfig Converter attribute
- * 
- * <p><b>Provisional API - subject to change</b></p>
- */
-public class FacesConfigConverterIDType extends FacesConfigIdentifierType {
-    // FIXME: why do we have an empty class?
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/FacesConfigIdentifierFeatures.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/FacesConfigIdentifierFeatures.java
deleted file mode 100644
index b22f4d1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/FacesConfigIdentifierFeatures.java
+++ /dev/null
@@ -1,305 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.taglibprocessing.attributevalues;
-
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.FileLocator;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.jdt.core.Signature;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jst.jsf.common.internal.types.CompositeType;
-import org.eclipse.jst.jsf.common.internal.types.IAssignable;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IStructuredDocumentContextResolverFactory;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IWorkspaceContextResolver;
-import org.eclipse.jst.jsf.core.jsfappconfig.JSFAppConfigManager;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.DescriptionType;
-import org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType;
-import org.eclipse.jst.jsf.metadataprocessors.AbstractMetaDataEnabledFeature;
-import org.eclipse.jst.jsf.metadataprocessors.features.ELIsNotValidException;
-import org.eclipse.jst.jsf.metadataprocessors.features.IPossibleValues;
-import org.eclipse.jst.jsf.metadataprocessors.features.IValidELValues;
-import org.eclipse.jst.jsf.metadataprocessors.features.IValidValues;
-import org.eclipse.jst.jsf.metadataprocessors.features.IValidationMessage;
-import org.eclipse.jst.jsf.metadataprocessors.features.PossibleValue;
-import org.eclipse.jst.jsf.metadataprocessors.features.ValidationMessage;
-import org.osgi.framework.Bundle;
-
-/**
- * Abstract meta-data processing feature representing a faces-config type
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * @author Gerry Kessler - Oracle
- */
-public abstract class FacesConfigIdentifierFeatures extends AbstractMetaDataEnabledFeature  
-		implements IPossibleValues, IValidValues, IValidELValues{
-	
-	/**
-	 * Meta-data property name to use for identifying the faces-config type
-	 * 
-	 * see jsf_core.xml converterID and validatorID attributes
-	 */
-	public static final String ID_TYPE_PROP_NAME = "config-type"; //$NON-NLS-1$
-
-	/**
-	 *  Missing image descriptor
-	 */
-	protected static final ImageDescriptor MISSING_IMAGE = ImageDescriptor.getMissingImageDescriptor();
-	
-	/**
-	 * Name of image file to use with content assist proposals
-	 */
-	protected String imageName;
-	private ImageDescriptor imageDescriptor;
-	/**
-	 * Validation messages to return
-	 */
-	protected List validationMessages;
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.metadataprocessors.features.IPossibleValues#getPossibleValues()
-	 */
-	public List getPossibleValues() {
-		List ret = new ArrayList();
-		List idTypes = getConfigTypes();
-		
-		if (idTypes != null){
-			for (int i=0;i<idTypes.size();i++){
-				//verify this feature can deal with this type
-				if (getReturnType().equals(idTypes.get(i))){
-					ret.addAll(createPossibleValues());
-				}
-			}
-		}
-		
-		return ret;
-	}
-		
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.metadataprocessors.features.IValidValues#isValidValue(java.lang.String)
-	 */
-	public boolean isValidValue(String value) {	
-		List idTypes = getConfigTypes();
-		if (idTypes != null){
-			for (int i=0;i<idTypes.size();i++){
-				if (getReturnType().equals(idTypes.get(i))){
-					if (hasValue(getElementIDs(getJSFAppConfigMgr()), value)){
-						getValidationMessages().clear();					
-						return true;
-					}
-                    getValidationMessages().add(getValidationMessage(value));
-				}
-			}
-		}
-		return false;
-	}
-	
-	private boolean hasValue(List elements, String value) {
-		for (Iterator it=elements.iterator();it.hasNext();){
-			if (value.equals(it.next()))
-				return true;
-		}
-		return false;
-	}
-
-	/**
-	 * @param value of the attribute
-	 * @return the validation message String
-	 */
-	protected abstract String getMyValidationMessage(String value);
-	
-	/**
-	 * Creates an IValidationMessage
-	 * @param value
-	 * @return IValidationMessage
-	 */
-	protected IValidationMessage getValidationMessage(String value) {
-		String msg;
-		msg = getCMValidationMessage();
-		if (msg == null){
-				msg = getMyValidationMessage(value);
-		}		
-		String code = getCMValidationCode();
-		int severity = getCMValidationSeverity();
-		
-		IValidationMessage valMsg = new ValidationMessage(msg, code, severity);
-		return valMsg;
-	}
-
-	/**
-	 * 
-	 * @param value
-	 * @return single-quoted value
-	 */
-	protected String singleQuote(String value){
-		return "'" + value+"'"; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.metadataprocessors.features.IValidValues#getValidationMessages()
-	 */
-	public List getValidationMessages(){
-		if (validationMessages == null){
-			validationMessages = new ArrayList();
-		}
-		return validationMessages;
-	}
-	
-	/**
-	 * @param jsfAppConfigManager
-	 * @return list of faces-config element for the specified config-type
-	 */
-	protected abstract List getElements(JSFAppConfigManager jsfAppConfigManager);
-	/**
-	 * @param elements
-	 * @return list of IPossibleValue objects for the specified list of config elements
-	 */
-	protected abstract List getPossibleValueProposals(List elements);
-	/**
-	 * @return image name relative to the FacesConfigEditPlugin where the images are stored
-	 */
-	protected abstract String getImageName();
-	
-	private List createPossibleValues() {		
-		return getPossibleValueProposals(getElements(getJSFAppConfigMgr()));
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.metadataprocessors.AbstractMetaDataEnabledFeature#getImage()
-	 */
-	protected ImageDescriptor getImage() {
-		ImageDescriptor ret = super.getImage();
-		if (ret != null && ret != MISSING_IMAGE)
-			return ret;
-
-		if (imageDescriptor == null){				
-			imageDescriptor = getImageDesc(getImageName());
-		}
-		return imageDescriptor;
-
-	}
-	
-	//return FacesConfigPlugin relative image descriptor
-	private ImageDescriptor getImageDesc(String img) {
-		Bundle bundle = FacesConfigPlugin.getPlugin().getBundle();
-		URL url = FileLocator.find(bundle, new Path(img), null);
-		ImageDescriptor desc = ImageDescriptor.createFromURL(url);
-		if (desc == MISSING_IMAGE){
-			return null;
-		}
-		return desc;
-	}
-
-	/**
-	 * @param value
-	 * @param displayName
-	 * @param description
-	 * @return PossibleValue object
-	 */
-	protected PossibleValue createProposal(String value, EList displayName, EList description) {
-		String display = value;
-		if (displayName.size() > 0) {
-			DisplayNameType displayNameType= (DisplayNameType) displayName.get(0);
-			display = displayNameType.getTextContent();
-		}
-		String desc = null;
-		if (description.size() > 0) {
-			DescriptionType descType= (DescriptionType) description.get(0);
-			desc = descType.getTextContent();
-		}		
-		PossibleValue pv = new PossibleValue(value, display);
-		if (desc != null)
-			pv.setAdditionalInformation(desc);
-		
-		return pv;
-		
-	}
-
-	private List getConfigTypes() {
-		return getTraitValueAsListOfStrings(ID_TYPE_PROP_NAME);
-		
-//		return CMAnnotationHelper.getCMAttributePropertyValues(getMetaDataContext().getBundleId(), 
-//				getMetaDataContext().getUri(), getMetaDataContext().getElementName(),
-//				getMetaDataContext().getAttributeName(), ID_TYPE_PROP_NAME);
-	}
-
-	private JSFAppConfigManager getJSFAppConfigMgr(){
-		return JSFAppConfigManager.getInstance(getProject());
-	}
-
-	private IProject getProject() {
-		IWorkspaceContextResolver resolver = IStructuredDocumentContextResolverFactory.INSTANCE.getWorkspaceContextResolver(getStructuredDocumentContext());
-		if (resolver != null)
-			return resolver.getProject();
-		
-		return null;
-	}
-
-	/**
-	 * @param jsfAppConfigManager
-	 * @return list of identifier Strings for config-type
-	 */
-	protected abstract List getElementIDs(JSFAppConfigManager jsfAppConfigManager);
-
-	/**
-	 * @return the config-type
-	 */
-	protected abstract String getReturnType();
-	/**
-	 * @return int value of {@link IAssignable}.ASSIGNMENT_TYPE_RHS & {@link IAssignable}.ASSIGNMENT_TYPE_LHS 
-	 */
-	protected int getAssignmentType(){
-		//TODO: fix me to get from meta-data(?)
-		return IAssignable.ASSIGNMENT_TYPE_RHS & IAssignable.ASSIGNMENT_TYPE_LHS;
-	}
-	public CompositeType getExpectedRuntimeType() throws ELIsNotValidException {
-		String type = Signature.createTypeSignature(getReturnType(), true);
-		return new CompositeType(type, getAssignmentType());
-	}
-	
-	/**
-	 * @return String value of {@link IValidValues}.VALID_VALUES_MESSAGE_PROP_NAME trait
-	 */
-	protected String getCMValidationMessage() {
-		//TODO: Standard Validation stuff - should be moved somewhere else
-		return getTraitValueAsString(IValidValues.VALID_VALUES_MESSAGE_PROP_NAME);			
-	}
-
-	/**
-	 * @return int value of {@link IValidValues}.VALID_VALUES_SEVERITY_PROP_NAME trait
-	 */
-	protected int getCMValidationSeverity() {
-		String val = getTraitValueAsString(IValidValues.VALID_VALUES_SEVERITY_PROP_NAME);		
-		if (val == null)
-			return IStatus.WARNING;
-		
-		int severity = Integer.valueOf(val).intValue();
-		return severity;
-	}
-
-	/**
-	 * @return String value of {@link IValidValues}.VALID_VALUES_CODE_PROP_NAME trait
-	 */
-	protected String getCMValidationCode() {
-		return getTraitValueAsString(IValidValues.VALID_VALUES_CODE_PROP_NAME);		
-	}
-	
-}
-
-
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/FacesConfigIdentifierType.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/FacesConfigIdentifierType.java
deleted file mode 100644
index 5ac934d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/FacesConfigIdentifierType.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.taglibprocessing.attributevalues;
-
-/**
- * Meta-data processing type representing a faces-config type
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * @author Gerry Kessler - Oracle
- */
-public abstract class FacesConfigIdentifierType extends IdentifierType	 {
-    // FIXME: why do we have an empty class?
-}
-	
-
-
-
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/FacesConfigValidatorIDFeatures.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/FacesConfigValidatorIDFeatures.java
deleted file mode 100644
index 2a2711a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/FacesConfigValidatorIDFeatures.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.taglibprocessing.attributevalues;
-
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.jst.jsf.core.jsfappconfig.JSFAppConfigManager;
-import org.eclipse.jst.jsf.facesconfig.emf.ValidatorType;
-import org.eclipse.jst.jsf.metadataprocessors.features.PossibleValue;
-import org.eclipse.osgi.util.NLS;
-
-/**
- * ValidatorID attribute feature
- * 
- * <p><b>Provisional API - subject to change</b></p>
- *
- */
-public class FacesConfigValidatorIDFeatures extends FacesConfigIdentifierFeatures {
-
-	/**
-	 * Faces validator classname
-	 */
-	protected static final String VALIDATOR = "javax.faces.validator.Validator"; //$NON-NLS-1$
-	/**
-	 * Imagename to use when displaying validator
-	 */
-	protected static final String IMAGE_NAME = "/icons/full/obj16/FacesConfig_Validator.gif"; //$NON-NLS-1$
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.taglibprocessing.attributevalues.FacesConfigIdentifierFeatures#getReturnType()
-	 */
-	protected String getReturnType(){ return VALIDATOR;}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.taglibprocessing.attributevalues.FacesConfigIdentifierFeatures#getElements(org.eclipse.jst.jsf.core.jsfappconfig.JSFAppConfigManager)
-	 */
-	protected List getElements(JSFAppConfigManager mgr) {
-		if (mgr != null)
-			return mgr.getValidators();
-		return new ArrayList(0);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.taglibprocessing.attributevalues.FacesConfigIdentifierFeatures#getPossibleValueProposals(java.util.List)
-	 */
-	protected List getPossibleValueProposals(List elements) {
-		List ret = new ArrayList();
-		Collections.sort(elements, new ValidatorSorter());
-		for (Iterator it = elements.iterator();it.hasNext();){
-			ValidatorType obj = (ValidatorType)it.next();
-			if (obj.getValidatorId() != null && obj.getValidatorId().getTextContent() != null){
-				PossibleValue pv = createProposal(obj.getValidatorId().getTextContent(), obj.getDisplayName(), obj.getDescription());
-				if (pv != null){
-					pv.setIcon(getImage());
-					ret.add(pv);
-				}
-			}
-		}
-		return ret;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.taglibprocessing.attributevalues.FacesConfigIdentifierFeatures#getImageName()
-	 */
-	protected String getImageName() {		
-		return IMAGE_NAME;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.taglibprocessing.attributevalues.FacesConfigIdentifierFeatures#getMyValidationMessage(java.lang.String)
-	 */
-	protected String getMyValidationMessage(String value) {		
-		if (value == null || value.trim().equals("")) //$NON-NLS-1$
-			return Messages.FacesConfigValidatorIDFeatures_validatorid_empty;
-		
-		return NLS.bind(Messages.FacesConfigIdentifierType_invalid_validator_id, new String[]{singleQuote(value)});
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.taglibprocessing.attributevalues.FacesConfigIdentifierFeatures#getElementIDs(org.eclipse.jst.jsf.core.jsfappconfig.JSFAppConfigManager)
-	 */
-	protected List getElementIDs(JSFAppConfigManager mgr) {
-		List elements = getElements(mgr);
-		List ret = new ArrayList(elements.size());		
-		for (Iterator it = elements.iterator();it.hasNext();){
-			ValidatorType aType = (ValidatorType)it.next();
-			if (aType.getValidatorId() != null && aType.getValidatorId().getTextContent() != null){
-				String id = aType.getValidatorId().getTextContent();
-				if (id != null)
-					ret.add(id.trim());
-			}
-		}
-		return ret;
-	}
-	
-	/**
-	 * Validator id sorter - incomplete
-	 */
-	private static class ValidatorSorter implements Comparator, Serializable {
-		/**
-         * 
-         */
-        private static final long serialVersionUID = -398026037193914126L;
-
-        public int compare(Object o1, Object o2) {		
-			//TODO
-			return 0;
-
-		}
-		
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/FacesConfigValidatorIDType.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/FacesConfigValidatorIDType.java
deleted file mode 100644
index 65f0504..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/FacesConfigValidatorIDType.java
+++ /dev/null
@@ -1,20 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.taglibprocessing.attributevalues;
-
-/**
- * Type representing a FacesConfig Validator attribute
- * 
- * <p><b>Provisional API - subject to change</b></p>
- */
-public class FacesConfigValidatorIDType extends FacesConfigIdentifierType {
-    // FIXME: why do we have an empty class?
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/IdentifierType.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/IdentifierType.java
deleted file mode 100644
index 134e23d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/IdentifierType.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.taglibprocessing.attributevalues;
-
-/**
- * Abstract meta-data processing type representing an identifier binding type
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * @author Gerry Kessler - Oracle
- */
-public abstract class IdentifierType extends DirectBindingType {
-    // TODO: parent is already abstract; what's the point?
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/IntegerType.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/IntegerType.java
deleted file mode 100644
index 6fcbdb7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/IntegerType.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.taglibprocessing.attributevalues;
-
-import java.util.List;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * Meta-data processing type representing an integer attribute value runtime type
- * that implements IValidValues, IDefaultValue, IValidELValues
- * 
- * <p><b>Provisional API - subject to change</b></p> 
- * @author Gerry Kessler - Oracle
- */
-public class IntegerType extends NumberType {
-	private static final String INVALID_INTEGER = Messages.IntegerType_invalid_integer;
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.taglibprocessing.attributevalues.EnumerationType#getReturnType()
-	 */
-	protected String getReturnType(){ return "int";} //$NON-NLS-1$
-	
-	/**
-	 * Type coercion according to JSP 2.0 spec: JSP.1.14.2.1 Conversions from String values
-	 * @see org.eclipse.jst.jsf.metadataprocessors.features.IValidValues#isValidValue(java.lang.String)
-	 **/
-	public boolean isValidValue(String value) {		
-		try {
-			Integer anInt = Integer.valueOf(value);
-			exceedsMaxValue(anInt.intValue());
-			lessThanMinValue(anInt.intValue());
-			if (!(minFound || maxFound)){
-				List validVals = getMDValidValues();
-				if (!validVals.isEmpty()){
-					if (!validVals.contains(value)){
-						addNewValidationMessage(Messages.IntegerType_invalid_member);//fix me
-					}
-				}
-			}
-			return getValidationMessages().isEmpty();
-		} catch (NumberFormatException e) {
-			addNewValidationMessage(INVALID_INTEGER);
-			return false;
-		}
-
-	}
-
-	private void exceedsMaxValue(int anInt) {
-		String strMax = getValidMaximumValue();
-		if (strMax != null){
-			try {
-				int max = Integer.valueOf(strMax).intValue();
-				maxFound = true;
-				if (anInt > max){
-					addNewValidationMessage(NLS.bind(EXCEEDS_MAX, strMax));
-				}
-			} catch (NumberFormatException e) {
-				//TODO: ignore error????  or log it????
-			}
-		}
-		
-	}
-	
-	private void lessThanMinValue(int anInt) {
-		String strMin = getValidMinimumValue();
-		if (strMin != null){
-			try {
-				int max = Integer.valueOf(strMin).intValue();
-				minFound = true;
-				if (anInt < max){
-					addNewValidationMessage(NLS.bind(LESS_THAN_MIN, strMin));
-				}
-			} catch (NumberFormatException e) {
-				//TODO: ignore error????  or log it????
-			}
-		}
-		
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/JavaClassType.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/JavaClassType.java
deleted file mode 100644
index 912c818..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/JavaClassType.java
+++ /dev/null
@@ -1,498 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.taglibprocessing.attributevalues;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jdt.core.Flags;
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.IPackageFragmentRoot;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.ITypeHierarchy;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jdt.core.search.IJavaSearchConstants;
-import org.eclipse.jdt.core.search.IJavaSearchScope;
-import org.eclipse.jdt.core.search.SearchEngine;
-import org.eclipse.jdt.core.search.SearchMatch;
-import org.eclipse.jdt.core.search.SearchParticipant;
-import org.eclipse.jdt.core.search.SearchPattern;
-import org.eclipse.jdt.core.search.SearchRequestor;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IStructuredDocumentContextResolverFactory;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IWorkspaceContextResolver;
-import org.eclipse.jst.jsf.metadataprocessors.features.IPossibleValues;
-import org.eclipse.jst.jsf.metadataprocessors.features.IValidValues;
-import org.eclipse.jst.jsf.metadataprocessors.features.PossibleValue;
-import org.eclipse.jst.jsf.metadataprocessors.features.ValidationMessage;
-
-/**
- * Provides possible values and validates attribute values that should be fully qualified Java types.
- * A type can be verified against multiple "valid-interfaces" and/or a "valid-superclass" from meta-data.
- * Code checks to ensure the class can be instantiated (i.e. not abstract, anonymous or inner class)
- * Search is scoped to within the current project only. 
- * 
- * (Until https://bugs.eclipse.org/bugs/show_bug.cgi?id=142044 is fixed, only the first found will be used)
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * @author Gerry Kessler - Oracle
- *
- */
-public class JavaClassType extends ObjectType implements IPossibleValues, IValidValues{
-	/**
-	 * Trait name for valid interfaces
-	 */
-	public static final String POSSIBLE_VALUES_INTERFACES_PROP_NAME = "valid-interfaces"; //$NON-NLS-1$
-	/**
-	 * Trait name for valid superclass
-	 */
-	public static final String POSSIBLE_VALUES_SUPERCLASS_PROP_NAME = "valid-superclass"; //$NON-NLS-1$
-	
-	private List validationMsgs;
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.metadataprocessors.features.IPossibleValues#getPossibleValues()
-	 */
-	public List getPossibleValues() {
-		List results = getTypes();
-		if (results != null && !results.isEmpty()){
-			
-			Set vals = new HashSet(results.size());
-			Set checkedTypes = new HashSet();
-			for (Iterator it = results.iterator();it.hasNext();){
-				SearchMatch match = (SearchMatch)it.next();
-				IType res = (IType)match.getElement();
-				addValidSubClasses(res, vals, checkedTypes);					
-			}
-			return createPossibleValues(vals);
-		}						
-		return new ArrayList(0);
-	}
-	
-	private List createPossibleValues(Set vals) {
-		List list = new ArrayList(vals.size());
-		Iterator it = vals.iterator();
-		while(it.hasNext()){
-			IJavaElement elem = (IJavaElement)it.next();
-			list.add(createPossibleValue(elem));
-		}
-		return list;
-	}
-
-	private void addValidSubClasses(IType res, Set vals, Set checkedTypes) {
-
-		try {
-			//check to see if we have already checked the hiearchy
-			if (checkedTypes.contains(res))
-				return;
-						
-			//should we add itself?
-			if (isInnerOrAnonymousClass(res))
-				return;
-			if (!isAbstractClass(res))
-				vals.add(res);  //since it is a set, dupes will not be added
-			
-
-			ITypeHierarchy hierarchy = res.newTypeHierarchy(getJavaProject(), null);			
-			IType[] subclasses = hierarchy.getSubclasses(res);
-			checkedTypes.add(res);
-			for (int i=0;i<subclasses.length;i++){
-				addValidSubClasses(subclasses[i], vals, checkedTypes);
-			}
-		} catch (JavaModelException e) {
-			//ignore
-		}
-	}
-
-	private IWorkspaceContextResolver getWorkspaceContextResolver(){
-		if (getStructuredDocumentContext() == null)
-			return null;
-		
-		 return IStructuredDocumentContextResolverFactory.INSTANCE.getWorkspaceContextResolver(getStructuredDocumentContext());
-	}
-	
-	private List getTypes(){
-		IJavaProject jp = getJavaProject();
-		if (jp == null)
-			return null;
-		
-		List elems = new ArrayList();
-		elems.addAll(getInterfaces(jp));
-		IType sc = getSuperClass(jp);
-		if (sc != null)
-			elems.add(sc);
-			
-		if (elems.size() > 0){				
-			SearchRequestor requestor = new Searcher();
-			SearchEngine engine = new SearchEngine();
-			
-			IJavaSearchScope scope = SearchEngine.createJavaSearchScope(new IJavaElement[]{jp});//, IJavaSearchScope.SOURCES | IJavaSearchScope.APPLICATION_LIBRARIES | IJavaSearchScope.);
-			SearchPattern combined = SearchPattern.createPattern((IJavaElement)elems.get(0), IJavaSearchConstants.IMPLEMENTORS, 0);
-
-//			 Until this bug is fixed, stub it out...  only the first interface/superclass will be used.
-//							https://bugs.eclipse.org/bugs/show_bug.cgi?id=142044
-//							for(int i=1;i<elems.size();i++){
-//								final SearchPattern other = SearchPattern.createPattern((IJavaElement)elems.get(i), IJavaSearchConstants.IMPLEMENTORS, 0);
-//								combined = SearchPattern.createAndPattern(combined, other);
-//							}
-			
-			try {
-				engine.search(combined, new SearchParticipant[] {SearchEngine.getDefaultSearchParticipant()}, scope, requestor, null);
-				
-			} catch (CoreException e) {
-				//ignore
-			}
-
-			return ((Searcher)requestor).getResults();	
-		}
-
-		return Collections.EMPTY_LIST;
-	}
-	
-	private IJavaProject getJavaProject() {
-		IWorkspaceContextResolver resolver = getWorkspaceContextResolver();
-		if (resolver != null){
-			IProject proj = resolver.getProject();
-			if (proj != null)
-				return JavaCore.create(proj);
-		}
-		return null;
-	}
-
-	private List getInterfaces(IJavaProject jp) {
-		List ret = new ArrayList();
-		List propVals = getInterfaceNames();		
-		
-		for (Iterator it = propVals.iterator();it.hasNext();){
-			String propVal = (String)it.next();
-			IType interfase = null;
-			try {
-				interfase = findType(jp, propVal);
-				if (interfase != null){
-					ret.add(interfase);
-				}
-			} catch (JavaModelException e) {
-                // suppress and fall-through to return empty list
-			}
-
-		}
-		return ret;
-	}
-	
-	private IType getSuperClass(IJavaProject jp){
-		IType superclass = null;
-		try {
-			String sc = getSuperClassName();
-			if (sc != null && !sc.trim().equals("")){ //$NON-NLS-1$
-				superclass = findType(jp, sc );
-				if (superclass != null){
-					return superclass;
-				}
-			}
-		} catch (JavaModelException e) {
-			//ignore
-		}
-		return null;
-	}
-	
-	private PossibleValue createPossibleValue(IJavaElement val) {
-		return new PossibleValue(((IType)val).getFullyQualifiedName());		
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.metadataprocessors.features.IValidValues#getValidationMessages()
-	 */
-	public List getValidationMessages() {
-		if (validationMsgs == null){
-			validationMsgs = new ArrayList();			
-		}
-		return validationMsgs;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.metadataprocessors.features.IValidValues#isValidValue(java.lang.String)
-	 */
-	public boolean isValidValue(String value) {
-		if (value == null || value.trim().equals("")){ //$NON-NLS-1$
-			getValidationMessages().add(new ValidationMessage(Messages.JavaClassType_invalid_type));
-			return false;
-		}
-		IJavaProject jp = getJavaProject();
-		if (jp == null)
-			return false;
-		
-		//first verify that the value specified is a resolvable type
-		IType type = getTypeForValue(jp, value);
-		if (type != null){			
-			//ensure that it is not abstract or anonymous
-			if (!isInnerOrAnonymousClass(type) && !isAbstractClass(type)){
-				//now verify that it meets the criteria
-				ITypeHierarchy hierarchy;
-				try {
-					hierarchy = type.newTypeHierarchy(jp, null);
-				} catch (JavaModelException e) {
-					return false;
-				}
-						
-				//check that all interfaces
-				List<String> interfaceNames = getInterfaceNames();
-				for (Iterator<String> it=interfaceNames.iterator();it.hasNext();){
-					//check that all interfaces are satisfied by type
-					IType interfase = getTypeForValue(jp, it.next());
-					if (interfase == null){
-						addNewValidationMessage(Messages.JavaClassType_not_found);
-						return false;
-					}
-					else if (! containsType(hierarchy.getAllSupertypes(type), interfase)){
-						addNewValidationMessage(Messages.JavaClassType_not_found);
-						return false;
-					}
-				}
-				//interfaces have been satisfied now check the superclass if specified				
-				IType superClass = getSuperClass(jp); 
-				if (superClass != null && superClass.equals(type))
-					return true;
-				else if (superClass != null && !containsType(hierarchy.getAllSuperclasses(type), superClass )){
-					addNewValidationMessage(Messages.JavaClassType_not_found);
-					return false;
-				}
-				return true;
-//				List results = getTypes();
-//				if (!results.isEmpty()){					
-//					for (Iterator it = results.iterator();it.hasNext();){
-//						SearchMatch match = (SearchMatch)it.next();
-//						IType res = (IType)match.getElement();
-//						if (!isInnerOrAnonymousClass(res) ){
-//							//if this is the class, then optimize to reduce expense of creating hierarchy
-//							if (!isAbstractClass(type) && (res.getFullyQualifiedName().equals(value)) )
-//								return true;
-//							//check to see if value is a subtype in the hierarchy
-//							try {
-//								ITypeHierarchy hierarchy = res.newTypeHierarchy(jp, null);
-//								if (containsType(hierarchy.getAllSubtypes(res), type)) 									
-//									return true;
-//								
-//							} catch (JavaModelException e) {
-//								//ignore
-//							}
-//						}
-//					}
-//				}
-			}
-		}
-		addNewValidationMessage(Messages.JavaClassType_not_found);
-		return false;
-	}
-	
-	private boolean containsType(IType[] types, IType type) {
-		for (int i=0;i < types.length;i++) {
-			if (type.equals(types[i]))
-				return true;
-		}
-		return false;
-	}
-
-	private IType getTypeForValue(IJavaProject jp, String value) {
-		try {
-			return findType(jp, value);
-		} catch (JavaModelException e) {
-            // suppress and fall through to return null
-		}
-		return null;
-	}
-
-	/**
-	 * @return String value of {@link #POSSIBLE_VALUES_SUPERCLASS_PROP_NAME}
-	 */
-	protected String getSuperClassName(){
-		return getTraitValueAsString(POSSIBLE_VALUES_SUPERCLASS_PROP_NAME);
-//		return CMAnnotationHelper.getCMAttributePropertyValue(getMetaDataContext().getBundleId(), getMetaDataContext().getUri(),
-//				getMetaDataContext().getElementName(), getMetaDataContext().getAttributeName(),
-//				POSSIBLE_VALUES_SUPERCLASS_PROP_NAME);
-
-	}
-	
-	/**
-	 * @return List of values from {@link #POSSIBLE_VALUES_INTERFACES_PROP_NAME}
-	 */
-	protected List getInterfaceNames(){
-		return getTraitValueAsListOfStrings(POSSIBLE_VALUES_INTERFACES_PROP_NAME);
-		
-//		return CMAnnotationHelper.getCMAttributePropertyValues(getMetaDataContext().getBundleId(), getMetaDataContext().getUri(),
-//				getMetaDataContext().getElementName(), getMetaDataContext().getAttributeName(),
-//				POSSIBLE_VALUES_INTERFACES_PROP_NAME);
-
-	}
-
-	/**
-	 * Create a {@link ValidationMessage} from metadata or use default message
-	 * and add it to the collection of validation messages
-	 * @param defaultMsg
-	 */
-	protected void addNewValidationMessage(String defaultMsg) {
-		//TODO: need to refactor below as this as also in Enumeration
-		String msg = getCMValidationMessage();
-		if (msg == null || msg.equals("")) //$NON-NLS-1$
-			msg = defaultMsg;
-		
-		String code = getValidationCode();
-		int severity = getValidationSeverity();
-		ValidationMessage val = new ValidationMessage(msg, code, severity);
-		getValidationMessages().add(val);
-	}
-	
-	
-	/**
-	 * @return validation message from meta-data using {@link IValidValues}.VALID_VALUES_MESSAGE_PROP_NAME trait.   Can be null.
-	 */
-	protected String getCMValidationMessage() {
-		return getTraitValueAsString(IValidValues.VALID_VALUES_MESSAGE_PROP_NAME);			
-	}
-	
-	/**
-	 * @return validation severity as int from meta-data using {@link IValidValues}.VALID_VALUES_SEVERITY_PROP_NAME trait.   IStatus.WARNING is default.
-	 */
-	protected int getValidationSeverity() {
-		String val = getTraitValueAsString(IValidValues.VALID_VALUES_SEVERITY_PROP_NAME);		
-		if (val == null)
-			return IStatus.WARNING;
-		
-		int severity = Integer.valueOf(val).intValue();
-		return severity;
-	}
-
-	/**
-	 * @return validation code as String from meta-data.   Can be null.
-	 */
-	protected String getValidationCode() {
-		return getTraitValueAsString(IValidValues.VALID_VALUES_CODE_PROP_NAME);		
-	}
-	
-	private boolean isInnerOrAnonymousClass(IType res) {
-		try {
-			if (res.isClass() && (res.isAnonymous() || 
-									(Flags.isPrivate(res.getFlags())) || 
-									res.getFullyQualifiedName().indexOf("$") > 0)) //must be better way to discover if it is an inner class //$NON-NLS-1$
-				return true;
-		} catch (JavaModelException e) {
-			//ignore
-		}
-		return false;
-	}
-
-
-	private boolean isAbstractClass(IType res) {	
-		try {
-			if (res.isClass() && Flags.isAbstract(res.getFlags()))
-				return true;
-		} catch (JavaModelException e) {
-			//ignore
-		}
-		return false;
-	}
-	
-	private static class Searcher extends SearchRequestor{
-		private List results = new ArrayList();
-		public void acceptSearchMatch(SearchMatch match) throws CoreException {
-			results.add(match);
-		}
-		
-		/**
-		 * @return list of serach results
-		 */
-		public List getResults(){
-			return results;
-		}
-	}
-	
-/////////////////  ///////////////////////////////////////////////////////////////////////
-//remainder of this class copied from org.eclipse.jdt.internal.corext.util.JavaCoreUtil //
-//TODO: find public version of this functionality										//
-//////////////////////////////////////////////////////////////////////////////////////////
-	private IType findType(IJavaProject jproject, String fullyQualifiedName) throws JavaModelException {
-		//workaround for bug 22883
-		IType type= jproject.findType(fullyQualifiedName);
-		if (type != null)
-			return type;
-
-		IPackageFragmentRoot[] roots= jproject.getPackageFragmentRoots();
-		for (int i= 0; i < roots.length; i++) {
-			IPackageFragmentRoot root= roots[i];
-			type= findType(root, fullyQualifiedName);
-			if (type != null && type.exists())
-				return type;
-		}	
-		return null;
-	}
-	
-	private IType findType(IPackageFragmentRoot root, String fullyQualifiedName) throws JavaModelException{
-		IJavaElement[] children= root.getChildren();
-		for (int i= 0; i < children.length; i++) {
-			IJavaElement element= children[i];
-			if (element.getElementType() == IJavaElement.PACKAGE_FRAGMENT){
-				IPackageFragment pack= (IPackageFragment)element;
-				if (! fullyQualifiedName.startsWith(pack.getElementName()))
-					continue;
-				IType type= findType(pack, fullyQualifiedName);
-				if (type != null && type.exists())
-					return type;
-			}
-		}		
-		return null;
-	}
-	
-	private IType findType(IPackageFragment pack, String fullyQualifiedName) throws JavaModelException{
-		ICompilationUnit[] cus= pack.getCompilationUnits();
-		for (int i= 0; i < cus.length; i++) {
-			ICompilationUnit unit= cus[i];
-			IType type= findType(unit, fullyQualifiedName);
-			if (type != null && type.exists())
-				return type;
-		}
-		return null;
-	}
-	
-	private IType findType(ICompilationUnit cu, String fullyQualifiedName) throws JavaModelException{
-		IType[] types= cu.getAllTypes();
-		for (int i= 0; i < types.length; i++) {
-			IType type= types[i];
-			if (getFullyQualifiedName(type).equals(fullyQualifiedName))
-				return type;
-		}
-		return null;
-	}
-	
-	private String getFullyQualifiedName(IType type) {
-		try {
-			if (type.isBinary() && !type.isAnonymous()) {
-				IType declaringType= type.getDeclaringType();
-				if (declaringType != null) {
-					return getFullyQualifiedName(declaringType) + '.' + type.getElementName();
-				}
-			}
-		} catch (JavaModelException e) {
-			// ignore
-		}		
-		return type.getFullyQualifiedName('.');
-	}
-////////////////////////////////////////////////////////////////////////
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/LanguageCodeType.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/LanguageCodeType.java
deleted file mode 100644
index 102df5a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/LanguageCodeType.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation., and others
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.taglibprocessing.attributevalues;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.jst.jsf.metadataprocessors.features.IPossibleValues;
-import org.eclipse.jst.jsf.metadataprocessors.features.PossibleValue;
-
-/**
- * Meta-data processing type representing a Language Code type.
- * A Language code is defined as in html spec http://www.w3.org/TR/html4/types.html#h-6.8
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- */
-
-public class LanguageCodeType extends EnumerationType implements IPossibleValues {
-	private static final LanguageCodeMap _map = new LanguageCodeMap();
-	
-	@Override
-	protected String getReturnType() {
-		return "java.lang.String"; //$NON-NLS-1$
-	}
-
-	public List getPossibleValues() {
-		List ret = new ArrayList();		
-		for(Iterator it = _map.keySet().iterator();it.hasNext();){
-			String key = (String)it.next();
-			String value = _map.get(key);
-			PossibleValue pv = new PossibleValue(key, value);
-			ret.add(pv);
-		}
-		return ret;
-	}
-
-	public boolean isValidValue(String value) {
-		if(!_map.containsKey(value)) {
-			addNewValidationMessage(Messages.LanguageCodeType_1);
-		}
-		
-		return getValidationMessages().isEmpty();
-	}
-	
-	/**
-	 * Defines language code map
-	 *
-	 */
-	private static class LanguageCodeMap extends HashMap<String, String> {
-		private static final long serialVersionUID = 1L;
-
-		LanguageCodeMap() {
-			put("af", Messages.LanguageCodeType_118); //$NON-NLS-1$
-			put("ar", Messages.LanguageCodeType_0); //$NON-NLS-1$
-			put("be", Messages.LanguageCodeType_7); //$NON-NLS-1$
-			put("bg", Messages.LanguageCodeType_9); //$NON-NLS-1$
-			put("br", Messages.LanguageCodeType_11); //$NON-NLS-1$
-			put("ca", Messages.LanguageCodeType_13); //$NON-NLS-1$
-			put("cs", Messages.LanguageCodeType_15); //$NON-NLS-1$
-			put("da", Messages.LanguageCodeType_17); //$NON-NLS-1$
-			put("de", Messages.LanguageCodeType_19); //$NON-NLS-1$
-			put("el", Messages.LanguageCodeType_21); //$NON-NLS-1$
-			put("en", Messages.LanguageCodeType_23); //$NON-NLS-1$
-			put("es", Messages.LanguageCodeType_25); //$NON-NLS-1$
-			put("et", Messages.LanguageCodeType_27); //$NON-NLS-1$
-			put("eu", Messages.LanguageCodeType_29); //$NON-NLS-1$
-			put("fa", Messages.LanguageCodeType_31); //$NON-NLS-1$
-			put("fi", Messages.LanguageCodeType_33); //$NON-NLS-1$
-			put("fo", Messages.LanguageCodeType_35); //$NON-NLS-1$
-			put("fr", Messages.LanguageCodeType_37); //$NON-NLS-1$
-			put("gd", Messages.LanguageCodeType_39); //$NON-NLS-1$
-			put("he", Messages.LanguageCodeType_41); //$NON-NLS-1$
-			put("hi", Messages.LanguageCodeType_43); //$NON-NLS-1$
-			put("hr", Messages.LanguageCodeType_45); //$NON-NLS-1$
-			put("hu", Messages.LanguageCodeType_47); //$NON-NLS-1$
-			put("id", Messages.LanguageCodeType_49); //$NON-NLS-1$
-			put("is", Messages.LanguageCodeType_51); //$NON-NLS-1$
-			put("it", Messages.LanguageCodeType_53); //$NON-NLS-1$
-			put("ja", Messages.LanguageCodeType_55); //$NON-NLS-1$
-			put("ko", Messages.LanguageCodeType_57); //$NON-NLS-1$
-			put("lt", Messages.LanguageCodeType_59); //$NON-NLS-1$
-			put("lv", Messages.LanguageCodeType_61); //$NON-NLS-1$
-			put("mk", Messages.LanguageCodeType_63); //$NON-NLS-1$
-			put("ms", Messages.LanguageCodeType_65); //$NON-NLS-1$
-			put("mt", Messages.LanguageCodeType_67); //$NON-NLS-1$
-			put("nl", Messages.LanguageCodeType_69); //$NON-NLS-1$
-			put("no", Messages.LanguageCodeType_71); //$NON-NLS-1$
-			put("pl", Messages.LanguageCodeType_73); //$NON-NLS-1$
-			put("pt", Messages.LanguageCodeType_75); //$NON-NLS-1$
-			put("rm", Messages.LanguageCodeType_77); //$NON-NLS-1$
-			put("ro", Messages.LanguageCodeType_79); //$NON-NLS-1$
-			put("ru", Messages.LanguageCodeType_81); //$NON-NLS-1$
-			put("sk", Messages.LanguageCodeType_83); //$NON-NLS-1$
-			put("sl", Messages.LanguageCodeType_85); //$NON-NLS-1$
-			put("sq", Messages.LanguageCodeType_87); //$NON-NLS-1$
-			put("sr", Messages.LanguageCodeType_89); //$NON-NLS-1$
-			put("sv", Messages.LanguageCodeType_91); //$NON-NLS-1$
-			put("sx", Messages.LanguageCodeType_93); //$NON-NLS-1$
-			put("sz", Messages.LanguageCodeType_95); //$NON-NLS-1$
-			put("th", Messages.LanguageCodeType_97); //$NON-NLS-1$
-			put("tn", Messages.LanguageCodeType_99); //$NON-NLS-1$
-			put("tr", Messages.LanguageCodeType_101); //$NON-NLS-1$
-			put("ts", Messages.LanguageCodeType_103); //$NON-NLS-1$
-			put("uk", Messages.LanguageCodeType_105); //$NON-NLS-1$
-			put("ur", Messages.LanguageCodeType_107); //$NON-NLS-1$
-			put("vi", Messages.LanguageCodeType_109); //$NON-NLS-1$
-			put("xh", Messages.LanguageCodeType_111); //$NON-NLS-1$
-			put("yi", Messages.LanguageCodeType_113); //$NON-NLS-1$
-			put("zh", Messages.LanguageCodeType_115); //$NON-NLS-1$
-			put("zu", Messages.LanguageCodeType_117);			 //$NON-NLS-1$
-		}
-		
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/LengthType.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/LengthType.java
deleted file mode 100644
index 70c5069..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/LengthType.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.taglibprocessing.attributevalues;
-
-/**
- * Meta-data processing type representing an length attribute value runtime type.
- * Does not support min and max values from MD.  Length must be positive.
- * that implements IValidValues, IDefaultValue, IValidELValues.
- */
-public class LengthType extends IntegerType {	
-	private static final String INVALID_LENGTH = Messages.LengthType_invalid_integer;
-	/**
-	 * Type coercion according to JSP 2.0 spec: JSP.1.14.2.1 Conversions from String values
-	 * Allows a percentage.
-	 * @see org.eclipse.jst.jsf.metadataprocessors.features.IValidValues#isValidValue(java.lang.String)
-	 **/
-	public boolean isValidValue(String value) {	
-		//FIXME:  this is not right... px, em, etc. are also valid... and spaces between # and units are not
-		//see http://www.w3.org/TR/html401/types.html#h-6.6
-		if (value == null) return true;
-		String aValue = stripPercentIfPresent(value);		
-		try {
-			int anInt = Integer.valueOf(aValue).intValue();
-			if (anInt < 0)
-				addNewValidationMessage(INVALID_LENGTH);
-			
-			return getValidationMessages().isEmpty();
-		} catch (NumberFormatException e) {
-			addNewValidationMessage(INVALID_LENGTH);
-			return false;
-		}
-
-	}
-	//will strip '%' if at end of string.  If string is only '%', then will return empty which will be invalid.
-	private String stripPercentIfPresent(String value) {
-		//"%" is allowed at end
-		if (value.length() > 0
-			&& value.lastIndexOf('%') == value.length() - 1)
-				return value.replaceFirst("%",""); //$NON-NLS-1$ //$NON-NLS-2$
-		
-		return value;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/LinkType.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/LinkType.java
deleted file mode 100644
index ead9b79..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/LinkType.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation., and others
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.taglibprocessing.attributevalues;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jst.jsf.metadataprocessors.features.IPossibleValues;
-import org.eclipse.jst.jsf.metadataprocessors.features.PossibleValue;
-
-/**
- * Meta-data processing type representing a Link type.
- * 
- * Possible values are only common types; not all
- * Valid values just checks for a non-empty value, and not against known link types
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- */
-
-public class LinkType extends EnumerationType implements IPossibleValues{
-	//common link types
-	private String[] _linkTypes = new String[]{
-			"Alternate", //$NON-NLS-1$
-			"Stylesheet", //$NON-NLS-1$
-			"Start", //$NON-NLS-1$
-			"Next", //$NON-NLS-1$
-			"Prev", //$NON-NLS-1$
-			"Contents", //$NON-NLS-1$
-			"Index", //$NON-NLS-1$
-			"Glossary", //$NON-NLS-1$
-			"Copyright", //$NON-NLS-1$
-			"Chapter", //$NON-NLS-1$
-			"Section", //$NON-NLS-1$
-			"Subsection", //$NON-NLS-1$
-			"Appendix", //$NON-NLS-1$
-			"Help", //$NON-NLS-1$
-			"Bookmark" //$NON-NLS-1$
-		};
-	
-	
-	@Override
-	protected String getReturnType() {
-		return "java.lang.String"; //$NON-NLS-1$
-	}
-
-	public List getPossibleValues() {
-		List ret = new ArrayList();		
-		for(int i=0;i<_linkTypes.length;i++){
-			PossibleValue pv = new PossibleValue(_linkTypes[i].toString(), _linkTypes[i].toString());
-			ret.add(pv);
-		}
-		return ret;
-	}
-
-	public boolean isValidValue(String value) {
-		if (value == null || value.trim().length() == 0){
-			addNewValidationMessage(Messages.LinkType_16);
-			return false;
-		}
-		return true;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/LocaleType.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/LocaleType.java
deleted file mode 100644
index 29607ca..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/LocaleType.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation., and others
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *	  Vadim Dmitriev
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.taglibprocessing.attributevalues;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.List;
-import java.util.Locale;
-
-import org.eclipse.jst.jsf.metadataprocessors.features.IPossibleValue;
-import org.eclipse.jst.jsf.metadataprocessors.features.IPossibleValues;
-import org.eclipse.jst.jsf.metadataprocessors.features.IValidELValues;
-import org.eclipse.jst.jsf.metadataprocessors.features.IValidValues;
-import org.eclipse.jst.jsf.metadataprocessors.features.PossibleValue;
-import org.eclipse.jst.jsf.metadataprocessors.features.ValidationMessage;
-
-/**
- * Meta-data processing type representing a Locale Code type.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- */
-
-public class LocaleType extends MultiSignatureEnumerationType implements IPossibleValues, IValidValues, IValidELValues{
-	private List<IPossibleValue> _pvs;
-	@Override
-	protected String[] getReturnTypes() {
-		return new String[]{"java.util.Locale", "java.lang.String"}; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	public List getPossibleValues() {
-		if (_pvs == null){
-			_pvs = new ArrayList();	
-			Locale[]_locales = getLocales();
-			for(int i=0;i<_locales.length;i++){
-				PossibleValue pv = new PossibleValue(_locales[i].toString(), _locales[i].getDisplayName());
-				_pvs.add(pv);
-			}
-			Collections.sort(_pvs, new Comparator(){
-				public int compare(Object o1, Object o2) {
-					PossibleValue pv1 = (PossibleValue)o1;
-					PossibleValue pv2 = (PossibleValue)o2;
-					return (pv1.getDisplayValue().compareTo(pv2.getDisplayValue()));
-				}
-			
-			});
-		}
-		return _pvs;
-	}
-
-	private Locale[] getLocales() {
-		return Locale.getAvailableLocales();
-	}
-
-	public boolean isValidValue(String value) {
-		Locale[]_locales = getLocales();
-		for(int i=0;i<_locales.length;i++){
-			Locale local = getLocales()[i];
-			if (local.toString().equals(value))
-				return true;
-		}
-		getValidationMessages().add(new ValidationMessage(Messages.LocaleType_1));
-		return false;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/LongType.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/LongType.java
deleted file mode 100644
index a7791e9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/LongType.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.taglibprocessing.attributevalues;
-
-import java.util.List;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * Meta-data processing type representing a long attribute value runtime type
- * that implements IValidValues, IDefaultValue, IValidELValues
- *  
- * <p><b>Provisional API - subject to change</b></p>
- * @author Gerry Kessler - Oracle
- */
-public class LongType extends NumberType {
-	private static final String INVALID_LONG = Messages.LongType_invalid_long;
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.taglibprocessing.attributevalues.EnumerationType#getReturnType()
-	 */
-	protected String getReturnType(){ return "long";} //$NON-NLS-1$
-
-	/**
-	 * Type coercion according to JSP 2.0 spec: JSP.1.14.2.1 Conversions from String values
-	 * @see org.eclipse.jst.jsf.metadataprocessors.features.IValidValues#isValidValue(java.lang.String)
-	 **/
-	public boolean isValidValue(String value) {			
-		try {
-			Long aLong = Long.valueOf(value);
-			exceedsMaxValue(aLong.longValue());
-			lessThanMinValue(aLong.longValue());
-			if (!(minFound || maxFound)){
-				List validVals = getMDValidValues();
-				if (!validVals.isEmpty()){
-					if (!validVals.contains(value)){
-						addNewValidationMessage(Messages.LongType_invalid_member);
-					}
-				}
-			}
-			return getValidationMessages().isEmpty();
-		} catch (NumberFormatException e) {
-			addNewValidationMessage(INVALID_LONG);
-			return false;
-		}
-
-	}
-
-	private void exceedsMaxValue(long aLong) {
-		String strMax = getValidMaximumValue();
-		if (strMax != null){
-			try {
-				long max = Long.valueOf(strMax).longValue();
-				maxFound = true;
-				if (aLong > max){
-					addNewValidationMessage(NLS.bind(EXCEEDS_MAX, strMax));
-				}
-			} catch (NumberFormatException e) {
-				//TODO: ignore error????  or log it????
-			}
-		}
-		
-	}
-	
-	private void lessThanMinValue(long aLong) {
-		String strMin = getValidMinimumValue();
-		if (strMin != null){
-			try {
-				long min = Long.valueOf(strMin).longValue();
-				minFound = true;
-				if (aLong < min){
-					addNewValidationMessage(NLS.bind(LESS_THAN_MIN, strMin));
-				}
-			} catch (NumberFormatException e) {
-				//TODO: ignore error????  or log it????
-			}
-		}
-		
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/Messages.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/Messages.java
deleted file mode 100644
index 447ef78..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/Messages.java
+++ /dev/null
@@ -1,1101 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.taglibprocessing.attributevalues;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * Message bundle for attributevalue types/features
- * 
- * <p>
- * <b>Provisional API - subject to change</b>
- * </p>
- */
-public class Messages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.jst.jsf.taglibprocessing.attributevalues.messages"; //$NON-NLS-1$
-	static {
-		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-	}
-	/**
-	 * see messages.properties
-	 */
-	public static String ActionType_navcase_display;
-	/**
-	 * see messages.properties
-	 */
-	public static String ActionType_invalid_value;
-	/**
-	 * see messages.properties
-	 */
-	public static String ActionType_invalid_empty_value;
-	/**
-	 * see messages.properties
-	 */
-	public static String BooleanType_invalid_values;
-	/**
-	 * see messages.properties
-	 */
-	public static String ContentType_MIME_not_empty;
-	/**
-	 * see messages.properties
-	 */
-	public static String ComponentBindingType_invalid_value;
-	/**
-	 * see messages.properties
-	 */
-	public static String ComponentIDType_invalid_as_el;
-	/**
-	 * see messages.properties
-	 */
-	public static String ComponentIDType_invalid_value;
-	/**
-	 * see messages.properties
-	 */
-	public static String DoubleType_invalid_double;
-	/**
-	 * see messages.properties
-	 */
-	public static String DoubleType_invalid_member;
-	/**
-	 * see messages.properties
-	 */
-	public static String FacesConfigConverterIDFeatures_converterid_empty;
-	/**
-	 * see messages.properties
-	 */
-	public static String FacesConfigIdentifierType_invalid_converter_id;
-	/**
-	 * see messages.properties
-	 */
-	public static String FacesConfigIdentifierType_invalid_validator_id;
-	/**
-	 * see messages.properties
-	 */
-	public static String FacesConfigValidatorIDFeatures_validatorid_empty;
-	/**
-	 * see messages.properties
-	 */
-	public static String IntegerType_invalid_integer;
-	/**
-	 * see messages.properties
-	 */
-	public static String IntegerType_invalid_member;
-	/**
-	 * see messages.properties
-	 */
-	public static String JavaClassType_invalid_type;
-	/**
-	 * see messages.properties
-	 */
-	public static String JavaClassType_not_found;
-	/**
-	 * see messages.properties
-	 */
-	public static String LongType_invalid_long;
-	/**
-	 * see messages.properties
-	 */
-	public static String LongType_invalid_member;
-	/**
-	 * see messages.properties
-	 */
-	public static String MethodBindingType_invalid_value;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_invalid;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_10;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_100;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_101;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_102;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_103;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_104;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_105;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_106;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_107;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_108;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_109;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_11;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_110;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_111;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_112;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_113;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_114;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_115;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_116;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_117;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_118;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_119;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_12;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_120;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_121;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_122;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_123;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_124;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_125;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_126;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_127;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_128;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_129;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_13;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_130;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_131;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_132;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_133;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_134;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_135;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_136;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_137;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_138;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_139;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_14;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_140;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_141;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_142;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_143;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_144;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_145;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_146;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_147;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_148;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_149;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_15;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_150;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_151;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_152;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_153;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_154;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_155;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_156;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_157;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_158;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_159;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_16;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_160;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_161;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_162;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_163;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_164;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_165;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_166;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_167;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_168;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_169;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_17;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_170;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_171;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_172;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_173;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_174;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_18;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_19;
-	/**
-	 * see messages.properties
-	 */
-	public static String CharacterType_0;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_2;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_20;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_21;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_22;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_23;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_24;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_25;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_26;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_27;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_28;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_29;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_3;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_30;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_31;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_32;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_33;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_34;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_35;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_36;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_37;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_38;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_39;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_4;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_40;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_41;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_42;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_43;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_44;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_45;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_46;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_47;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_48;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_49;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_5;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_50;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_51;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_52;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_53;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_54;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_55;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_56;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_57;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_58;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_59;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_6;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_60;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_61;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_62;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_63;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_64;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_65;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_66;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_67;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_68;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_69;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_7;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_70;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_71;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_72;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_73;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_74;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_75;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_76;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_77;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_78;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_79;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_8;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_80;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_81;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_82;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_83;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_84;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_85;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_86;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_87;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_88;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_89;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_9;
-	/**
-	 * see messages.properties
-	 */
-	public static String LanguageCodeType_0;
-	/**
-	 * see messages.properties
-	 */
-	public static String LanguageCodeType_1;
-	/**
-	 * see messages.properties
-	 */
-	public static String LanguageCodeType_7;
-	/**
-	 * see messages.properties
-	 */
-	public static String LanguageCodeType_9;
-	/**
-	 * see messages.properties
-	 */
-	public static String LinkType_16;
-	/**
-	 * see messages.properties
-	 */
-	public static String LocaleType_1;
-	/**
-	 * see messages.properties
-	 */
-	public static String WebPathType_1;
-	/**
-	 * see messages.properties
-	 */
-	public static String WebPathType_2;
-	/**
-	 * see messages.properties
-	 */
-	public static String LanguageCodeType_11;
-	/**
-	 * see messages.properties
-	 */
-	public static String LanguageCodeType_13;
-	/**
-	 * see messages.properties
-	 */
-	public static String LanguageCodeType_15;
-	/**
-	 * see messages.properties
-	 */
-	public static String LanguageCodeType_17;
-	/**
-	 * see messages.properties
-	 */
-	public static String LanguageCodeType_19;
-	/**
-	 * see messages.properties
-	 */
-	public static String LanguageCodeType_21;
-	/**
-	 * see messages.properties
-	 */
-	public static String LanguageCodeType_23;
-	/**
-	 * see messages.properties
-	 */
-	public static String LanguageCodeType_25;
-	/**
-	 * see messages.properties
-	 */
-	public static String LanguageCodeType_27;
-	/**
-	 * see messages.properties
-	 */
-	public static String LanguageCodeType_29;
-	/**
-	 * see messages.properties
-	 */
-	public static String LanguageCodeType_31;
-	/**
-	 * see messages.properties
-	 */
-	public static String LanguageCodeType_33;
-	/**
-	 * see messages.properties
-	 */
-	public static String LanguageCodeType_35;
-	/**
-	 * see messages.properties
-	 */
-	public static String LanguageCodeType_37;
-	/**
-	 * see messages.properties
-	 */
-	public static String LanguageCodeType_39;
-	/**
-	 * see messages.properties
-	 */
-	public static String LanguageCodeType_41;
-	/**
-	 * see messages.properties
-	 */
-	public static String LanguageCodeType_43;
-	/**
-	 * see messages.properties
-	 */
-	public static String LanguageCodeType_45;
-	/**
-	 * see messages.properties
-	 */
-	public static String LanguageCodeType_47;
-	/**
-	 * see messages.properties
-	 */
-	public static String LanguageCodeType_49;
-	/**
-	 * see messages.properties
-	 */
-	public static String LanguageCodeType_51;
-	/**
-	 * see messages.properties
-	 */
-	public static String LanguageCodeType_53;
-	/**
-	 * see messages.properties
-	 */
-	public static String LanguageCodeType_55;
-	/**
-	 * see messages.properties
-	 */
-	public static String LanguageCodeType_57;
-	/**
-	 * see messages.properties
-	 */
-	public static String LanguageCodeType_59;
-	/**
-	 * see messages.properties
-	 */
-	public static String LanguageCodeType_61;
-	/**
-	 * see messages.properties
-	 */
-	public static String LanguageCodeType_63;
-	/**
-	 * see messages.properties
-	 */
-	public static String LanguageCodeType_65;
-	/**
-	 * see messages.properties
-	 */
-	public static String LanguageCodeType_67;
-	/**
-	 * see messages.properties
-	 */
-	public static String LanguageCodeType_69;
-	/**
-	 * see messages.properties
-	 */
-	public static String LanguageCodeType_71;
-	/**
-	 * see messages.properties
-	 */
-	public static String LanguageCodeType_73;
-	/**
-	 * see messages.properties
-	 */
-	public static String LanguageCodeType_75;
-	/**
-	 * see messages.properties
-	 */
-	public static String LanguageCodeType_77;
-	/**
-	 * see messages.properties
-	 */
-	public static String LanguageCodeType_79;
-	/**
-	 * see messages.properties
-	 */
-	public static String LanguageCodeType_81;
-	/**
-	 * see messages.properties
-	 */
-	public static String LanguageCodeType_83;
-	/**
-	 * see messages.properties
-	 */
-	public static String LanguageCodeType_85;
-	/**
-	 * see messages.properties
-	 */
-	public static String LanguageCodeType_87;
-	/**
-	 * see messages.properties
-	 */
-	public static String LanguageCodeType_89;
-	/**
-	 * see messages.properties
-	 */
-	public static String LanguageCodeType_91;
-	/**
-	 * see messages.properties
-	 */
-	public static String LanguageCodeType_93;
-	/**
-	 * see messages.properties
-	 */
-	public static String LanguageCodeType_95;
-	/**
-	 * see messages.properties
-	 */
-	public static String LanguageCodeType_97;
-	/**
-	 * see messages.properties
-	 */
-	public static String LanguageCodeType_99;
-	/**
-	 * see messages.properties
-	 */
-	public static String LanguageCodeType_101;
-	/**
-	 * see messages.properties
-	 */
-	public static String LanguageCodeType_103;
-	/**
-	 * see messages.properties
-	 */
-	public static String LanguageCodeType_105;
-	/**
-	 * see messages.properties
-	 */
-	public static String LanguageCodeType_107;
-	/**
-	 * see messages.properties
-	 */
-	public static String LanguageCodeType_109;
-	/**
-	 * see messages.properties
-	 */
-	public static String LanguageCodeType_111;
-	/**
-	 * see messages.properties
-	 */
-	public static String LanguageCodeType_113;
-	/**
-	 * see messages.properties
-	 */
-	public static String LanguageCodeType_115;
-	/**
-	 * see messages.properties
-	 */
-	public static String LanguageCodeType_117;
-	/**
-	 * see messages.properties
-	 */
-	public static String LanguageCodeType_118;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_90;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_91;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_92;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_93;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_94;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_95;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_96;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_97;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_98;
-	/**
-	 * see messages.properties
-	 */
-	public static String CurrencyCodeType_99;
-	/**
-	 * see messages.properties
-	 */
-	public static String NumberType_max_val;
-	/**
-	 * see messages.properties
-	 */
-	public static String NumberType_min_val;
-	/**
-	 * see messages.properties
-	 */
-	public static String RelativePathType_0;
-	/**
-	 * see messages.properties
-	 */
-	public static String StringType_invalid_value;
-	/**
-	 * see messages.properties
-	 */
-	public static String ValueType_invalid_value;
-	/**
-	 * see messages.properties
-	 */
-	public static String ValueType_invalid_value_without_setter;
-	/**
-	 * see messages.properties
-	 */
-	public static String LengthType_invalid_integer;
-	/**
-	 * see messages.properties
-	 */
-	public static String ColorType_invalid_color;
-
-	/**
-	 * see messages.properties
-	 */
-	public static String Bundle_not_found_rb;
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/MethodBindingType.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/MethodBindingType.java
deleted file mode 100644
index 3409958..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/MethodBindingType.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.taglibprocessing.attributevalues;
-
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jdt.core.Signature;
-import org.eclipse.jst.jsf.common.internal.types.CompositeType;
-import org.eclipse.jst.jsf.common.internal.types.IAssignable;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.metadataprocessors.features.ELIsNotValidException;
-import org.eclipse.jst.jsf.metadataprocessors.features.IValidELValues;
-import org.eclipse.jst.jsf.metadataprocessors.features.IValidValues;
-import org.eclipse.jst.jsf.metadataprocessors.features.IValidationMessage;
-import org.eclipse.jst.jsf.metadataprocessors.features.ValidationMessage;
-
-/**
- * Meta-data processing type representing an method-binding attribute value runtime type
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * @author Gerry Kessler - Oracle
- */
-public class MethodBindingType extends ExpressionBindingType implements IValidELValues, IValidValues{
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.metadataprocessors.features.IValidELValues#getExpectedRuntimeType()
-	 */
-	public CompositeType getExpectedRuntimeType() throws ELIsNotValidException {
-		String[] params = getParams();
-        
-        // need to "signaturize" each parameter
-        for (int param = 0; param < params.length; param++)
-        {
-            params[param] = Signature.createTypeSignature(params[param],true);
-        }
-        final String runtimeType = getReturnType();
-        
-        String returnTypeSignature = null;
-        
-        if (runtimeType != null)
-        {
-             returnTypeSignature = Signature.createTypeSignature(runtimeType, true);
-        }
-        else
-        {
-            JSFCorePlugin.log(IStatus.INFO, "Missing metadata for trait "+RUNTIME_RETURN_TYPE+" for entity "+getMetaDataContext().getEntity()); //$NON-NLS-1$ //$NON-NLS-2$
-        }
-
-		if (returnTypeSignature == null)
-        {
-		    return null;
-        }
-		
-		String methodSig = Signature.createMethodSignature(params, returnTypeSignature);
-		return new CompositeType(methodSig, IAssignable.ASSIGNMENT_TYPE_NONE);
-	}
-
-	/**
-	 * Non-EL values are invalid for method bound attribute values
-	 * @see org.eclipse.jst.jsf.metadataprocessors.features.IValidValues#isValidValue(java.lang.String)
-	 */
-	public boolean isValidValue(String value) {		
-		//if this is being called, we are being called in an non-EL context which is invalid.
-		IValidationMessage msg = new ValidationMessage(Messages.MethodBindingType_invalid_value);
-		getValidationMessages().add(msg);
-		return false;
-	}
-
-	
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/MultiSignatureEnumerationType.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/MultiSignatureEnumerationType.java
deleted file mode 100644
index 5b84c4b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/MultiSignatureEnumerationType.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Vadim Dmitriev and others
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Vadim Dmitriev - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.taglibprocessing.attributevalues;
-
-import org.eclipse.jdt.core.Signature;
-import org.eclipse.jst.jsf.common.internal.types.CompositeType;
-import org.eclipse.jst.jsf.metadataprocessors.features.ELIsNotValidException;
-
-/**
- * Abstract meta-data processing type representing an enumeration attribute value
- * of multiple runtime types
- * 
- * @author Vadim Dmitriev
- */
-public abstract class MultiSignatureEnumerationType extends AbstractEnumerationType {
-
-	/**
-	 * @return return Java types as array of strings (i.e. 
-	 * new String[]{"boolean", "java.lang.String"}, etc.)
-	 * Must not be null.
-	 */
-	protected abstract String[] getReturnTypes();
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.metadataprocessors.features.IValidELValues#getExpectedRuntimeType()
-	 */
-	public CompositeType getExpectedRuntimeType() throws ELIsNotValidException {
-		String[] types = getReturnTypes();
-		int len = types.length;
-		
-		String[] signaturedTypes = new String[ len ];
-		for( int i = 0; i < len; i++ )
-		{
-			signaturedTypes[ i ] = Signature.createTypeSignature(types[ i ], true);
-		}
-		return new CompositeType( signaturedTypes, getAssignmentType());
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/NumberPatternType.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/NumberPatternType.java
deleted file mode 100644
index b5add42..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/NumberPatternType.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation., and others
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.taglibprocessing.attributevalues;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jst.jsf.metadataprocessors.AbstractRootTypeDescriptor;
-import org.eclipse.jst.jsf.metadataprocessors.features.IPossibleValues;
-import org.eclipse.jst.jsf.metadataprocessors.features.PossibleValue;
-
-/**
- * Meta-data processing type representing a numeric pattern type.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- */
-
-public class NumberPatternType extends AbstractRootTypeDescriptor implements IPossibleValues{
-	//should we ever decide to validate the patterns, extend EnumerationType
-	final private static String[] PATTERNS = {					
-			"0.00", //$NON-NLS-1$
-			"#,##0", //$NON-NLS-1$
-			"#,##0.00", //$NON-NLS-1$
-			"#,##0;(#,##0)", //$NON-NLS-1$
-			"#,##0.00;(#,##0.00)", //$NON-NLS-1$
-			"0.##E0", //$NON-NLS-1$
-			"0%", //$NON-NLS-1$
-			"0.00%" //$NON-NLS-1$
-	};
-
-	public List getPossibleValues() {
-		List ret = new ArrayList();		
-		for (int i=0;i<PATTERNS.length;i++){
-			ret.add(new PossibleValue(PATTERNS[i]));
-		}
-		return ret;
-	}
-
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/NumberType.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/NumberType.java
deleted file mode 100644
index 4ee78b9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/NumberType.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.taglibprocessing.attributevalues;
-
-import org.eclipse.jst.jsf.metadataprocessors.features.IValidValues;
-
-/**
- * Abstract meta-data processing type representing a numeric attribute value runtime type
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * @author Gerry Kessler - Oracle
- */
-public abstract class NumberType extends EnumerationType{
-	/**
-	 * flag indicating max value metadata was found
-	 */
-	protected boolean maxFound = false;
-	/**
-	 *  flag indicating min value metadata was found
-	 */
-	protected boolean minFound = false;
-	
-	/**
-	 * Validation message when value has exceeded maximum
-	 */
-	protected String EXCEEDS_MAX = Messages.NumberType_max_val;
-	/**
-	 * Validation message when value is less than minimum
-	 */
-	protected String LESS_THAN_MIN = Messages.NumberType_min_val;
-	
-	/**
-	 * @return maximum value from property named IValidValues.VALID_VALUES_MAX_PROP_NAME
-	 */
-	protected String getValidMaximumValue(){
-		return getTraitValueAsString(IValidValues.VALID_VALUES_MAX_PROP_NAME);
-	}
-		
-	/**
-	 * @return minimum value from property named IValidValues.VALID_VALUES_MIN_PROP_NAME
-	 */
-	protected String getValidMinimumValue(){
-		return getTraitValueAsString(IValidValues.VALID_VALUES_MIN_PROP_NAME);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/ObjectType.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/ObjectType.java
deleted file mode 100644
index 07120d4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/ObjectType.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.taglibprocessing.attributevalues;
-
-/**
- * Abstract meta-data processing type representing an Object attribute value runtime type
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * @author Gerry Kessler - Oracle
- */
-public abstract class ObjectType extends DirectBindingType {
-    // TODO: ????
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/PathType.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/PathType.java
deleted file mode 100644
index 5f4f311..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/PathType.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.taglibprocessing.attributevalues;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IStructuredDocumentContextResolverFactory;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IWorkspaceContextResolver;
-import org.eclipse.jst.jsf.metadataprocessors.AbstractRootTypeDescriptor;
-import org.eclipse.jst.jsf.metadataprocessors.features.IValidationMessage;
-
-/**
- * EXPERIMENTAL - may change or dissappear
- *
- */
-public abstract class PathType extends AbstractRootTypeDescriptor {
-
-	private IProject _project = null;
-	private final List<IValidationMessage> _validationMsgs = new ArrayList<IValidationMessage>(1);
-
-	/**
-	 * Constructor
-	 */
-	public PathType() {
-		super();
-	}
-
-	/**
-	 * @return IProject
-	 */
-	protected IProject getProject() {
-		if( _project == null )
-		{
-	        final IWorkspaceContextResolver wkspaceResolver =
-	            IStructuredDocumentContextResolverFactory.INSTANCE.getWorkspaceContextResolver( getStructuredDocumentContext() );
-	        _project = wkspaceResolver.getProject();
-		}
-		
-		return _project;
-	}
-
-	/**
-	 * @return list of {@link IValidationMessage}
-	 */
-	public List<IValidationMessage> getValidationMessages() {
-		return _validationMsgs;
-	}
-
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/RelativePathType.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/RelativePathType.java
deleted file mode 100644
index 82dd380..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/RelativePathType.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.taglibprocessing.attributevalues;
-
-import java.net.MalformedURLException;
-import java.net.URL;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jst.jsf.metadataprocessors.IMetaDataEnabledFeature;
-import org.eclipse.jst.jsf.metadataprocessors.features.IValidValues;
-import org.eclipse.jst.jsf.metadataprocessors.features.ValidationMessage;
-
-/**
- * Path is relative to project
- * <b>EXPERIMENTAL</b> - may change or dissappear
- * 
- */
-public class RelativePathType extends PathType implements
-		IMetaDataEnabledFeature, IValidValues{
-
-	public boolean isValidValue(String value) {
-		//is this a relative path, or absolute url?
-		try {
-			new URL(value);			
-			//not much else we what to do for now
-			return true;
-		} catch (MalformedURLException e) {
-			//is this a valid path relative to the 			
-			IProject project = getProject();
-			IFile  file= project.getFile(new Path(value));
-			if (! file.exists())
-				getValidationMessages().add(new ValidationMessage( value+Messages.RelativePathType_0));
-			
-			return getValidationMessages().size() == 0;
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/ResourceBundleType.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/ResourceBundleType.java
deleted file mode 100644
index 65f2fc9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/ResourceBundleType.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Vadim Dmitriev - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.taglibprocessing.attributevalues;
-
-import java.text.MessageFormat;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IStorage;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jst.jsf.core.internal.tld.LoadBundleUtil;
-import org.eclipse.jst.jsf.metadataprocessors.features.IValidValues;
-import org.eclipse.jst.jsf.metadataprocessors.features.ValidationMessage;
-
-/**
- * Meta-data processing type representing a path to resource bundle on classpath
- * Patch by Vadim Dmitriev.  See https://bugs.eclipse.org/bugs/show_bug.cgi?id=203307.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author Vadim Dmitriev
- * 
- * 
- */
-public class ResourceBundleType extends PathType implements IValidValues 
-{
-	public boolean isValidValue( String value )
-	{
-		try
-		{
-			IProject project = getProject();
-			IStorage bundle = LoadBundleUtil.getLoadBundleResource( project , value );
-			if( bundle != null )
-			{
-				return true;
-			}
-		}
-		catch (CoreException e) 
-		{
-			//error message is generated later
-		}
-		
-		final String message = 
-			MessageFormat.format(Messages.Bundle_not_found_rb, value); 
-		getValidationMessages().add(new ValidationMessage(message, "", IStatus.ERROR)); //$NON-NLS-1$
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/ScriptType.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/ScriptType.java
deleted file mode 100644
index 9df83d4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/ScriptType.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.taglibprocessing.attributevalues;
-
-import org.eclipse.jst.jsf.metadataprocessors.AbstractRootTypeDescriptor;
-
-/**
- * Represents script type
- * <p><b>Provisional API - subject to change</b></p>
- */
-public class ScriptType extends AbstractRootTypeDescriptor {
-//
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/StringType.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/StringType.java
deleted file mode 100644
index fa8f3af..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/StringType.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.taglibprocessing.attributevalues;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jst.jsf.metadataprocessors.features.IDefaultValue;
-import org.eclipse.jst.jsf.metadataprocessors.features.IPossibleValues;
-import org.eclipse.jst.jsf.metadataprocessors.features.IValidValues;
-import org.eclipse.jst.jsf.metadataprocessors.features.PossibleValue;
-
-/**
- * Meta-data processing type representing a String attribute value runtime type
- * that implements IPossibleValues, IValidValues and IDefaultValues
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * @author Gerry Kessler - Oracle
- */
-public class StringType extends EnumerationType implements IValidValues,
-		IPossibleValues, IDefaultValue {
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.taglibprocessing.attributevalues.EnumerationType#getReturnType()
-	 */
-	protected String getReturnType(){ return "java.lang.String";} //$NON-NLS-1$
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.metadataprocessors.features.IValidValues#isValidValue(java.lang.String)
-	 */
-	public boolean isValidValue(String value) {		
-		List vals = getMDValidValues();
-		if (vals.isEmpty())
-			return true;
-		
-		//if the value is empty but there is a default value, consider it valid		
-		if (getDefaultValue() != null  && (value == null || value.trim().equals(""))) //$NON-NLS-1$
-			return true;
-		
-		if(! vals.contains(value)){
-			addNewValidationMessage(Messages.StringType_invalid_value);
-		}
-		return getValidationMessages().isEmpty();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.metadataprocessors.features.IPossibleValues#getPossibleValues()
-	 */
-	public List getPossibleValues() {
-		List pvs = getMDPossibleValues();
-		if (pvs.isEmpty())
-			return EMPTY_LIST;
-		
-		List pdvs = getMDPossibleValuesForDisplay();
-		
-		//if there are no display vals or the meta-data list sizes are different, use the values list for display also
-		if (pdvs.isEmpty() || pvs.size() != pdvs.size())
-			pdvs = pvs;
-	
-		ImageDescriptor icon = getImage();
-		
-		String defaultValue = getDefaultValue();
-		List ret = new ArrayList(pvs.size());
-		for(int i=0;i<pvs.size();i++){
-			PossibleValue pv = new PossibleValue((String)pvs.get(i), (String)pdvs.get(i));
-			pv.setIcon(icon);
-			pv.setIsDefault(((String)pvs.get(i)).equals(defaultValue));
-			ret.add(pv);
-		}
-		return ret;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/TimeZoneType.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/TimeZoneType.java
deleted file mode 100644
index 56af13d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/TimeZoneType.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation., and others
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.taglibprocessing.attributevalues;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.TimeZone;
-
-import org.eclipse.jst.jsf.metadataprocessors.features.IPossibleValues;
-import org.eclipse.jst.jsf.metadataprocessors.features.IValidValues;
-import org.eclipse.jst.jsf.metadataprocessors.features.PossibleValue;
-
-/**
- * Meta-data processing type representing a TimeZone Code type.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- */
-
-public class TimeZoneType extends EnumerationType implements IPossibleValues, IValidValues{
-	private String[] _timezones;
-	
-	@Override
-	protected String getReturnType() {
-		return "java.lang.String"; //$NON-NLS-1$
-	}
-
-	public List getPossibleValues() {
-		List ret = new ArrayList();		
-		for(int i=0;i<getTimeZones().length;i++){
-			PossibleValue pv = new PossibleValue(_timezones[i], _timezones[i]);
-			ret.add(pv);
-		}
-		return ret;
-	}
-
-	private String[] getTimeZones() {
-		if (_timezones == null)
-			_timezones = TimeZone.getAvailableIDs();
-		return _timezones;
-	}
-
-	public boolean isValidValue(String value) {
-		for(int i=0;i<getTimeZones().length;i++){
-			if (getTimeZones()[i].equals(value))
-				return true;
-		}
-		return false;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/URIType.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/URIType.java
deleted file mode 100644
index 889959b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/URIType.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.taglibprocessing.attributevalues;
-
-import org.eclipse.jst.jsf.metadataprocessors.IMetaDataEnabledFeature;
-
-/**
- * URI Type: attribute values are Uniform Resource Identifiers (URIs), as defined in RFC 2396.
- * URI attribute values may include full URIs such as http://www.foobar.com/ as well as relative URIs such as foo.html and ../foo/.
- * EXPERIMENTAL - will change or dissappear
- */
-public class URIType extends PathType implements IMetaDataEnabledFeature{
-	//TODO: add validation... refactor or WebPath, RelativePath, etc.
-	
-	/**
-	 * Constructor
-	 */
-	public URIType() {
-		//
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/ValueBindingType.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/ValueBindingType.java
deleted file mode 100644
index ef9c455..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/ValueBindingType.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.taglibprocessing.attributevalues;
-
-import org.eclipse.jdt.core.Signature;
-import org.eclipse.jst.jsf.common.internal.types.CompositeType;
-import org.eclipse.jst.jsf.common.internal.types.IAssignable;
-import org.eclipse.jst.jsf.metadataprocessors.features.ELIsNotValidException;
-import org.eclipse.jst.jsf.metadataprocessors.features.IValidELValues;
-
-/**
- * Meta-data processing type representing a Value Bound attribute value runtime type
- * that implements IValidValues
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * @author Gerry Kessler - Oracle
- */
-public class ValueBindingType extends ExpressionBindingType implements IValidELValues{
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.metadataprocessors.features.IValidELValues#getExpectedRuntimeType()
-	 */
-	public CompositeType getExpectedRuntimeType() throws ELIsNotValidException {
-		String returnType = getReturnType();
-		if (returnType == null)
-			return null;
-		
-		String methodSig = Signature.createTypeSignature(returnType, true);
-		return new CompositeType(methodSig, getAssignmentValue());
-	}
-	
-	/**
-	 * @return {@link IAssignable}.LHS or {@link IAssignable}.RHS 
-	 */
-	protected int getAssignmentValue(){
-		return (getIsSetValueRequired() ? IAssignable.ASSIGNMENT_TYPE_LHS : 0) | IAssignable.ASSIGNMENT_TYPE_RHS;
-		
-	}
-	
-	/**
-	 * @return is runtime setter required?
-	 */
-	protected boolean getIsSetValueRequired(){
-		String value = getTraitValueAsString(RUNTIME_SETTER_REQUIRED);
-		if (value == null || value.trim().length() == 0)
-			return false; 
-		else if (value.trim().equals("true")) //$NON-NLS-1$
-			return true;
-		else
-			return false;		
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/ValueType.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/ValueType.java
deleted file mode 100644
index 7c03fae..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/ValueType.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.taglibprocessing.attributevalues;
-
-
-import org.eclipse.jst.jsf.metadataprocessors.features.IValidELValues;
-import org.eclipse.jst.jsf.metadataprocessors.features.IValidValues;
-
-/**
- * Meta-data processing type representing a "value" attribute 
- * that implements IValidValues and IValidELValues
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * @author Gerry Kessler - Oracle
- */
-public class ValueType extends ValueBindingType implements IValidValues, IValidELValues {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.metadataprocessors.features.IValidValues#isValidValue(java.lang.String)
-	 */
-	public boolean isValidValue(String value){
-		//value can be a string or a value binding expression
-		return true; 
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/WebPathType.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/WebPathType.java
deleted file mode 100644
index c1c8c0d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/WebPathType.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * 		Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.taglibprocessing.attributevalues;
-
-import java.net.MalformedURLException;
-import java.net.URL;
-
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jst.jsf.metadataprocessors.IMetaDataEnabledFeature;
-import org.eclipse.jst.jsf.metadataprocessors.features.IValidValues;
-import org.eclipse.jst.jsf.metadataprocessors.features.ValidationMessage;
-import org.eclipse.wst.common.componentcore.ComponentCore;
-import org.eclipse.wst.common.componentcore.resources.IVirtualContainer;
-import org.eclipse.wst.common.componentcore.resources.IVirtualFile;
-
-/**
- * Path relative to web root
- * <b>EXPERIMENTAL</b> - may change or dissappear
- *
- */
-public class WebPathType extends PathType implements
-	IMetaDataEnabledFeature, IValidValues{
-
-	public boolean isValidValue(String value) {
-		//is this a relative path, or absolute url?
-		try {
-			URL url = new URL(value);			
-			//if file protocol, see if it is valid?  Otherwise assume ok.
-			if (url.getProtocol().equals("file")){ //$NON-NLS-1$
-				validateFileRelativeToWebRoot(url.getPath());
-			} 
-		} catch (MalformedURLException e) {
-			//is this a valid path relative to the 			
-			validateFileRelativeToWebRoot(value);						
-		}
-		return getValidationMessages().size() == 0;
-
-	}
-
-    private void validateFileRelativeToWebRoot(String value) {
-		IVirtualContainer webRoot = getWebRoot();
-		if (! webRoot.exists()){
-			getValidationMessages().add(new ValidationMessage( Messages.WebPathType_1));
-		} 
-		else {
-			IVirtualFile file = webRoot.getFile(new Path(value));
-			if (!file.exists()) {
-				//was this a valid file path string, or bogus url?
-				getValidationMessages().add(new ValidationMessage(Messages.WebPathType_2));
-			}									
-			//we could also validate the expected file-extensions from meta data
-		}
-		
-	}
-
-	private IVirtualContainer getWebRoot()
-    {
-        IVirtualContainer webRoot =
-            ComponentCore.createComponent(getProject()).getRootFolder();
-        	       
-        return webRoot;
-    }
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/messages.properties b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/messages.properties
deleted file mode 100644
index 22ddc87..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/messages.properties
+++ /dev/null
@@ -1,278 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-IntegerType_invalid_integer=Value is not a valid integer.
-IntegerType_invalid_member=Value is not a member of the provided valid values
-LengthType_invalid_integer=Value is not a valid positive integer or positive integer percentage.
-LongType_invalid_long=Value is not a valid Long.
-LongType_invalid_member=Value is not a member of the provided valid values
-BooleanType_invalid_values=Valid values are "true" or "false"
-CurrencyCodeType_invalid=Invalid currency code
-CurrencyCodeType_10=Aruba, Guilders (also called Florins)
-CurrencyCodeType_100=Malta, Liri
-CurrencyCodeType_101=Mauritius, Rupees
-CurrencyCodeType_102=Maldives (Maldive Islands), Rufiyaa
-CurrencyCodeType_103=Malawi, Kwachas
-CurrencyCodeType_104=Mexico, Pesos
-CurrencyCodeType_105=Malaysia, Ringgits
-CurrencyCodeType_106=Mozambique, Meticais
-CurrencyCodeType_107=Namibia, Dollars
-CurrencyCodeType_108=Nigeria, Nairas
-CurrencyCodeType_109=Nicaragua, Cordobas
-CurrencyCodeType_11=Azerbaijan, Manats
-CurrencyCodeType_110=Norway, Krone
-CurrencyCodeType_111=Nepal, Nepal Rupees
-CurrencyCodeType_112=New Zealand, Dollars
-CurrencyCodeType_113=Oman, Rials
-CurrencyCodeType_114=Panama, Balboa
-CurrencyCodeType_115=Peru, Nuevos Soles
-CurrencyCodeType_116=Papua New Guinea, Kina
-CurrencyCodeType_117=Philippines, Pesos
-CurrencyCodeType_118=Pakistan, Rupees
-CurrencyCodeType_119=Poland, Zlotych
-CurrencyCodeType_12=Bosnia and Herzegovina, Convertible Marka
-CurrencyCodeType_120=Paraguay, Guarani
-CurrencyCodeType_121=Qatar, Rials
-CurrencyCodeType_122=Romania, Lei
-CurrencyCodeType_123=Russia, Rubles
-CurrencyCodeType_124=Rwanda, Rwanda Francs
-CurrencyCodeType_125=Saudi Arabia, Riyals
-CurrencyCodeType_126=Solomon Islands, Dollars
-CurrencyCodeType_127=Seychelles, Rupees
-CurrencyCodeType_128=Sudan, Dinars
-CurrencyCodeType_129=Sweden, Kronor
-CurrencyCodeType_13=Barbados, Dollars
-CurrencyCodeType_130=Singapore, Dollars
-CurrencyCodeType_131=Saint Helena, Pounds
-CurrencyCodeType_132=Slovenia, Tolars
-CurrencyCodeType_133=Slovakia, Koruny
-CurrencyCodeType_134=Sierra Leone, Leones
-CurrencyCodeType_135=Somalia, Shillings
-CurrencyCodeType_136=Seborga, Luigini
-CurrencyCodeType_137=Suriname, Dollars
-CurrencyCodeType_138=Principe and S\u00E3o Tome, Dobras
-CurrencyCodeType_139=El Salvador, Colones
-CurrencyCodeType_14=Bangladesh, Taka
-CurrencyCodeType_140=Syria, Pounds
-CurrencyCodeType_141=Swaziland, Emalangeni
-CurrencyCodeType_142=Thailand, Baht
-CurrencyCodeType_143=Tajikistan, Somoni
-CurrencyCodeType_144=Turkmenistan, Manats
-CurrencyCodeType_145=Tunisia, Dinars
-CurrencyCodeType_146=Tonga, Pa'anga
-CurrencyCodeType_147=Turkey, Liras [being phased out]
-CurrencyCodeType_148=Turkey, New Lira
-CurrencyCodeType_149=Trinidad and Tobago, Dollars
-CurrencyCodeType_15=Bulgaria, Leva
-CurrencyCodeType_150=Tuvalu, Tuvalu Dollars
-CurrencyCodeType_151=Taiwan, New Dollars
-CurrencyCodeType_152=Tanzania, Shillings
-CurrencyCodeType_153=Ukraine, Hryvnia
-CurrencyCodeType_154=Uganda, Shillings
-CurrencyCodeType_155=United States of America, Dollars
-CurrencyCodeType_156=Uruguay, Pesos
-CurrencyCodeType_157=Uzbekistan, Sums
-CurrencyCodeType_158=Venezuela, Bolivares
-CurrencyCodeType_159=Viet Nam, Dong
-CurrencyCodeType_16=Bahrain, Dinars
-CurrencyCodeType_160=Vanuatu, Vatu
-CurrencyCodeType_161=Samoa, Tala
-CurrencyCodeType_162=Communaut\u00E9 Financi\u00E8re Africaine BEAC Franc , Francs
-CurrencyCodeType_163=Silver, Ounces
-CurrencyCodeType_164=Gold, Ounces
-CurrencyCodeType_165=East Caribbean Dollars
-CurrencyCodeType_166=International Monetary Fund (IMF) Special Drawing Rights
-CurrencyCodeType_167=Communaut\u00E9 Financi\u00E8re Africaine BCEAO, Francs
-CurrencyCodeType_168=Palladium Ounces
-CurrencyCodeType_169=Comptoirs Francais du Pacifique, Francs
-CurrencyCodeType_17=Burundi, Francs
-CurrencyCodeType_170=Platinum, Ounces
-CurrencyCodeType_171=Yemen, Rials
-CurrencyCodeType_172=South Africa, Rand
-CurrencyCodeType_173=Zambia, Kwacha
-CurrencyCodeType_174=Zimbabwe, Zimbabwe Dollars
-CurrencyCodeType_18=Bermuda, Dollars
-CurrencyCodeType_19=Brunei Darussalam, Dollars
-CharacterType_0=Single unicode character is required
-CurrencyCodeType_2=United Arab Emirates, Dirhams
-CurrencyCodeType_20=Bolivia, Bolivianos
-CurrencyCodeType_21=Brazil, Brazil Real
-CurrencyCodeType_22=Bahamas, Dollars
-CurrencyCodeType_23=Bhutan, Ngultrum
-CurrencyCodeType_24=Botswana, Pulas
-CurrencyCodeType_25=Belarus, Rubles
-CurrencyCodeType_26=Belize, Dollars
-CurrencyCodeType_27=Canada, Dollars
-CurrencyCodeType_28=Congo/Kinshasa, Congolese Francs
-CurrencyCodeType_29=Switzerland, Francs
-CurrencyCodeType_3=Afghanistan, Afghanis
-CurrencyCodeType_30=Chile, Pesos
-CurrencyCodeType_31=China, Yuan Renminbi
-CurrencyCodeType_32=Colombia, Pesos
-CurrencyCodeType_33=Costa Rica, Colones
-CurrencyCodeType_34=Serbia, Dinars
-CurrencyCodeType_35=Cuba, Pesos
-CurrencyCodeType_36=Cape Verde, Escudos
-CurrencyCodeType_37=Cyprus, Pounds
-CurrencyCodeType_38=Czech Republic, Koruny
-CurrencyCodeType_39=Djibouti, Francs
-CurrencyCodeType_4=Albania, Leke
-CurrencyCodeType_40=Denmark, Kroner
-CurrencyCodeType_41=Dominican Republic, Pesos
-CurrencyCodeType_42=Algeria, Algeria Dinars
-CurrencyCodeType_43=Estonia, Krooni
-CurrencyCodeType_44=Egypt, Pounds
-CurrencyCodeType_45=Eritrea, Nakfa
-CurrencyCodeType_46=Ethiopia, Birr
-CurrencyCodeType_47=Euro Member Countries, Euro
-CurrencyCodeType_48=Fiji, Dollars
-CurrencyCodeType_49=Falkland Islands (Malvinas), Pounds
-CurrencyCodeType_5=Armenia, Drams
-CurrencyCodeType_50=United Kingdom, Pounds
-CurrencyCodeType_51=Georgia, Lari
-CurrencyCodeType_52=Guernsey, Pounds
-CurrencyCodeType_53=Ghana, Cedis
-CurrencyCodeType_54=Gibraltar, Pounds
-CurrencyCodeType_55=Gambia, Dalasi
-CurrencyCodeType_56=Guinea, Francs
-CurrencyCodeType_57=Guatemala, Quetzales
-CurrencyCodeType_58=Guyana, Dollars
-CurrencyCodeType_59=Hong Kong, Dollars
-CurrencyCodeType_6=Netherlands Antilles, Guilders (also called Florins)
-CurrencyCodeType_60=Honduras, Lempiras
-CurrencyCodeType_61=Croatia, Kuna
-CurrencyCodeType_62=Haiti, Gourdes
-CurrencyCodeType_63=Hungary, Forint
-CurrencyCodeType_64=Indonesia, Rupiahs
-CurrencyCodeType_65=Israel, New Shekels
-CurrencyCodeType_66=Isle of Man, Pounds
-CurrencyCodeType_67=India, Rupees
-CurrencyCodeType_68=Iraq, Dinars
-CurrencyCodeType_69=Iran, Rials
-CurrencyCodeType_7=Angola, Kwanza
-CurrencyCodeType_70=Iceland, Kronur
-CurrencyCodeType_71=Jersey, Pounds
-CurrencyCodeType_72=Jamaica, Dollars
-CurrencyCodeType_73=Jordan, Dinars
-CurrencyCodeType_74=Japan, Yen
-CurrencyCodeType_75=Kenya, Shillings
-CurrencyCodeType_76=Kyrgyzstan, Soms
-CurrencyCodeType_77=Cambodia, Riels
-CurrencyCodeType_78=Comoros, Francs
-CurrencyCodeType_79=Korea (North), Won
-CurrencyCodeType_8=Argentina, Pesos
-CurrencyCodeType_80=Korea (South), Won
-CurrencyCodeType_81=Kuwait, Dinars
-CurrencyCodeType_82=Cayman Islands, Dollars
-CurrencyCodeType_83=Kazakhstan, Tenge
-CurrencyCodeType_84=Laos, Kips
-CurrencyCodeType_85=Lebanon, Pounds
-CurrencyCodeType_86=Sri Lanka, Rupees
-CurrencyCodeType_87=Liberia, Dollars
-CurrencyCodeType_88=Lesotho, Maloti
-CurrencyCodeType_89=Lithuania, Litai
-CurrencyCodeType_9=Australia, Dollars
-LanguageCodeType_0=ar Arabic (needs subtype)
-LanguageCodeType_1=Invalid language code
-LanguageCodeType_101=tr Turkish
-LanguageCodeType_103=ts Tsonga
-LanguageCodeType_105=uk Ukrainian
-LanguageCodeType_107=ur Urdu
-LanguageCodeType_109=vi Vietnamese
-LanguageCodeType_11=br Breton
-LanguageCodeType_111=xh Xhosa
-LanguageCodeType_113=yi Yiddish
-LanguageCodeType_115=zh Chinese (needs subtype)
-LanguageCodeType_117=zu Zulu
-LanguageCodeType_118=af Afrikaans
-LanguageCodeType_13=ca Catalan
-LanguageCodeType_15=cs Czech
-LanguageCodeType_17=da Danish
-LanguageCodeType_19=de German (Standard)
-LanguageCodeType_21=el Greek
-LanguageCodeType_23=en English
-LanguageCodeType_25=es Spanish (Spain)
-LanguageCodeType_27=et Estonian
-LanguageCodeType_29=eu Basque
-LanguageCodeType_31=fa Farsi
-LanguageCodeType_33=fi Finnish
-LanguageCodeType_35=fo Faeroese
-LanguageCodeType_37=fr French (Standard)
-LanguageCodeType_39=gd Gaelic (Scotland)
-LanguageCodeType_41=he Hebrew
-LanguageCodeType_43=hi Hindi
-LanguageCodeType_45=hr Croatian
-LanguageCodeType_47=hu Hungarian
-LanguageCodeType_49=id Indonesian
-LanguageCodeType_51=is Icelandic
-LanguageCodeType_53=it Italian (Standard)
-LanguageCodeType_55=ja Japanese
-LanguageCodeType_57=ko Korean
-LanguageCodeType_59=lt Lithuanian
-LanguageCodeType_61=lv Latvian
-LanguageCodeType_63=mk Macedonian
-LanguageCodeType_65=ms Malaysian
-LanguageCodeType_67=mt Maltese
-LanguageCodeType_69=nl Dutch (Standard)
-LanguageCodeType_7=be Belarusian
-LanguageCodeType_71=no Norwegian (Bokmal/Nynorsk)
-LanguageCodeType_73=pl Polish
-LanguageCodeType_75=pt Portuguese (Standard)
-LanguageCodeType_77=rm Rhaeto-Romanic
-LanguageCodeType_79=ro Romanian
-LanguageCodeType_81=ru Russian
-LanguageCodeType_83=sk Slovak
-LanguageCodeType_85=sl Slovenian
-LanguageCodeType_87=sq Albanian
-LanguageCodeType_89=sr Serbian (Cyrillic/Latin)
-LanguageCodeType_9=bg Bulgarian
-LinkType_16=Link type value must not be empty
-LocaleType_1=Invalid locale value
-WebPathType_1=Web root path not found
-WebPathType_2=Invalid value
-LanguageCodeType_91=sv Swedish
-LanguageCodeType_93=sx Sutu
-LanguageCodeType_95=sz Sami (Lappish)
-LanguageCodeType_97=th Thai
-LanguageCodeType_99=tn Setswana
-CurrencyCodeType_90=Latvia, Lati
-CurrencyCodeType_91=Libya, Dinars
-CurrencyCodeType_92=Morocco, Dirhams
-CurrencyCodeType_93=Moldova, Lei
-CurrencyCodeType_94=Madagascar, Ariary
-CurrencyCodeType_95=Macedonia, Denars
-CurrencyCodeType_96=Myanmar (Burma), Kyats
-CurrencyCodeType_97=Mongolia, Tugriks
-CurrencyCodeType_98=Macau, Patacas
-CurrencyCodeType_99=Mauritania, Ouguiyas
-NumberType_max_val=Value exceeds maximum of {0}
-NumberType_min_val=Value is less than minimum of {0}
-RelativePathType_0=: path not found
-DoubleType_invalid_double=Value is not a valid double.
-DoubleType_invalid_member=Value is not a member of the provided valid values
-StringType_invalid_value=Value is not valid.
-FacesConfigIdentifierType_invalid_validator_id= {0} validator id is is not registered.
-FacesConfigIdentifierType_invalid_converter_id= {0} converter id is not registered.
-FacesConfigConverterIDFeatures_converterid_empty=Converter ids must not be null or empty.
-FacesConfigValidatorIDFeatures_validatorid_empty=Validator ids must not be null or empty.
-ValueType_invalid_value_without_setter=This 'value' attribute value must be a value binding expression that can take a value assignment.
-ValueType_invalid_value=The 'value' attribute must be a non-zero length String or be a value binding expression.
-ComponentBindingType_invalid_value=The 'binding' attribute requires an EL value binding reference to a UIComponent.
-ComponentIDType_invalid_as_el='id' attributes must be Strings.  Consider using 'binding' attribute instead.
-ComponentIDType_invalid_value=The 'id' attribute must be a non-zero length String and be uniquely defined on the page.
-ActionType_invalid_value=The action value does not match a navigation case outcome.
-ActionType_invalid_empty_value=The action attribute must be a non-zero length String or a method binding matching a navigation case outcome.
-ActionType_navcase_display={0}: goto {1} 
-ContentType_MIME_not_empty=Content (MIME) type must not be empty
-MethodBindingType_invalid_value=MethodBinding attribute values must be EL expressions.
-JavaClassType_invalid_type=Value for type attribute must be valid Java class and not empty.
-JavaClassType_not_found=Java type not found, not instantiable, or does implement correct interfaces or extend correct superclass.
-ColorType_invalid_color=Value is not a valid color.
-Bundle_not_found_rb=Resource bundle {0} cannot be found on classpath 
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/package-info.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/package-info.java
deleted file mode 100644
index 468104b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/package-info.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-/**
- * Provides type system for tag attribute values so that the 
- * org.eclipse.jst.jsf.core.metadataprocessors.features can be applied.  
- * 
- * A type is added using the org.eclipse.jst.jsf.core.AttributeValueRuntimeTypes extension point.
- * These types are referenced using the design-time metadata framework in org.eclipse.jst.jsf.common
- * The org.eclipse.jst.jsf.metadataprocessors.features provides the interesting tooling services based upon the type.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- */
-package org.eclipse.jst.jsf.taglibprocessing.attributevalues;
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/AbstractXMLViewValidationStrategy.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/AbstractXMLViewValidationStrategy.java
deleted file mode 100644
index 5be7a8a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/AbstractXMLViewValidationStrategy.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.validation.internal;
-
-import org.eclipse.jst.jsf.common.dom.DOMAdapter;
-import org.eclipse.jst.jsf.common.internal.policy.IIdentifiable;
-
-/**
- * A strategy that validates JSF views that are defined in XML format.
- * 
- * @author cbateman
- *
- */
-public abstract class AbstractXMLViewValidationStrategy implements IIdentifiable<String>
-{
-    private final String            _id;
-    private final String            _displayName;
-    
-    /**
-     * @param id
-     * @param displayName 
-     */
-    public AbstractXMLViewValidationStrategy(final String id, final String displayName)
-    {
-        _id = id;
-        _displayName = displayName;
-    }
-
-    /**
-     * @param domAdapter
-     */
-    public abstract void validate(final DOMAdapter  domAdapter);
-
-    /**
-     * @param domAdapter
-     * @return true if this validator is interested in validating this node
-     */
-    public abstract boolean isInteresting(final DOMAdapter  domAdapter);
-
-    public final String getId()
-    {
-        return _id;
-    }
-
-    public String getDisplayName()
-    {
-        return _displayName;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/ELValidationPreferences.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/ELValidationPreferences.java
deleted file mode 100644
index 522042e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/ELValidationPreferences.java
+++ /dev/null
@@ -1,767 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.validation.internal;
-
-import org.eclipse.core.runtime.preferences.IScopeContext;
-import org.eclipse.emf.common.util.Diagnostic;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jst.jsf.core.internal.IJSFPreferenceModel;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.validation.internal.el.diagnostics.DiagnosticFactory;
-
-/**
- * Model object for EL validation preferences
- * 
- * @author cbateman
- */
-public class ELValidationPreferences implements IJSFPreferenceModel
-{
-    private final static String KEY_ENABLE_BUILD_VALIDATION = 
-        "org.eclipse.jst.jsf.ui.ValidateJSFELBuild"; //$NON-NLS-1$
-    private final static boolean DEFAULT_ENABLE_BUILD_VALIDATION = true;
-
-    private final static String KEY_ENABLE_INCREMENTAL_VALIDATION = 
-        "org.eclipse.jst.jsf.ui.ValidateJSFELIncremental"; //$NON-NLS-1$
-    private final static boolean DEFAULT_ENABLE_INCREMENTAL_VALIDATION = false;
-    
-
-    private boolean         _enableBuildValidation;
-    private boolean         _enableIncrementalValidation;
-    private int[]           _severities;
-
-    /**
-     * Loads the object from the preference store provided
-     * 
-     * @param prefStore
-     */
-    public void load(IPreferenceStore  prefStore)
-    {
-        if (!prefStore.contains(KEY_ENABLE_BUILD_VALIDATION))
-        {
-            prefStore.setDefault(KEY_ENABLE_BUILD_VALIDATION, DEFAULT_ENABLE_BUILD_VALIDATION);
-        }
-        _enableBuildValidation = 
-            prefStore.getBoolean(KEY_ENABLE_BUILD_VALIDATION);
-
-        if (!prefStore.contains(KEY_ENABLE_INCREMENTAL_VALIDATION))
-        {
-            prefStore.setDefault(KEY_ENABLE_INCREMENTAL_VALIDATION, DEFAULT_ENABLE_INCREMENTAL_VALIDATION);
-        }
-        _enableIncrementalValidation = 
-            prefStore.getBoolean(KEY_ENABLE_INCREMENTAL_VALIDATION);
-        
-        loadSeverities(prefStore);
-    }
-
-    private void loadSeverities(final IPreferenceStore  prefStore)
-    {
-        final int severities[] = getSeverities();
-        
-        for (int i = 0; i < DiagnosticFactory.NUM_IDS; i++)
-        {
-            final String key = getKeyById(i);
-            
-            if (!prefStore.contains(key))
-            {
-                final int diagSeverity = getDefaultSeverity(i); 
-                final Severity severity  = mapDiagToSeverity(diagSeverity);
-        
-                prefStore.setDefault(key, severity.toString());
-            }
-            final String  storedSeverity = prefStore.getString(key);
-            severities[i] = mapSeverityToDiag(storedSeverity);
-        }
-    }
-    /**
-     * Copies the object into the preference store but DOES NOT SAVE IT
-     * 
-     * @param prefStore
-     */
-    public void commit(IPreferenceStore prefStore)
-    {
-        prefStore.setValue(KEY_ENABLE_BUILD_VALIDATION, _enableBuildValidation);
-        prefStore.setValue(KEY_ENABLE_INCREMENTAL_VALIDATION, 
-                           _enableIncrementalValidation);
-        commitSeverities(prefStore);
-    }
-    
-    private void commitSeverities(final IPreferenceStore prefStore)
-    {
-        final int severities[] = getSeverities();
-        
-        for (int i = 0; i < severities.length; i++)
-        {
-            final String key = getKeyById(i);
-            prefStore.setValue(key
-                , mapDiagToSeverity(severities[i]).toString());
-        }
-    }
-    
-    /**
-     * Reverts the model to it's defaults.  Does not commit to pref store. 
-     */
-    public void setDefaults()
-    {
-        setEnableBuildValidation(DEFAULT_ENABLE_BUILD_VALIDATION);
-        setEnableIncrementalValidation(DEFAULT_ENABLE_INCREMENTAL_VALIDATION);
-        setProblemSeverityDefaults();
-    }
-    
-    private void setProblemSeverityDefaults()
-    {
-        final int[] severities = getSeverities();
-        
-        for (int i = 0; i < DiagnosticFactory.NUM_IDS; i++)
-        {
-            severities[i] = getDefaultSeverity(i); 
-        }
-    }
-    
-    public Object getValueByKey(IScopeContext context, String key) {
-        // ignore context for now; will be used when we have project overrides
-        if (KEY_ENABLE_BUILD_VALIDATION.equals(key))
-        {
-            return Boolean.valueOf(isEnableBuildValidation());
-        }
-        else if (KEY_ENABLE_INCREMENTAL_VALIDATION.equals(key))
-        {
-            return Boolean.valueOf(isEnableIncrementalValidation());
-        }
-        else
-        {
-            try
-            {
-                final Severity severity = getSeverity(key);
-                return severity.toString();
-            }
-            catch (IllegalArgumentException e)
-            {
-                // getIdByKey will throw this exception if key is not a valid
-                // severity key.  Ignore the exception here and fall-through
-            }
-        }
-        
-        return null; // not found
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.jsf.core.internal.IJSFPreferenceModel#getStoredValueByKey(org.eclipse.core.runtime.preferences.IScopeContext, java.lang.String)
-     */
-    public Object getStoredValueByKey(IScopeContext context, String key) {
-        // ignore context for now; will be used when we have project overrides
-        if (KEY_ENABLE_BUILD_VALIDATION.equals(key))
-        {
-            return Boolean.valueOf(context.getNode("org.eclipse.jst.jsf.ui").getBoolean(key, true)); //$NON-NLS-1$
-        }
-        else if (KEY_ENABLE_INCREMENTAL_VALIDATION.equals(key))
-        {
-            return Boolean.valueOf(context.getNode("org.eclipse.jst.jsf.ui").getBoolean(key, false)); //$NON-NLS-1$
-        }
-        else
-        {
-            try
-            {
-                return context.getNode("org.eclipse.jst.jsf.core").get(key, mapDiagToSeverity(getDefaultSeverity(getIdByKey(key))).toString()); //$NON-NLS-1$
-            }
-            catch (IllegalArgumentException e)
-            {
-                // getIdByKey will throw this exception if key is not a valid
-                // severity key.  Ignore the exception here and fall-through
-            }
-        }
-        
-        return null; // not found
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.jsf.core.internal.IJSFPreferenceModel#setValueByKey(org.eclipse.core.runtime.preferences.IScopeContext, java.lang.String, java.lang.Object)
-     */
-    public Object setValueByKey(IScopeContext context, String key, Object value) 
-    {
-        // ignore context for now; will be used when we have project overrides
-        if (KEY_ENABLE_BUILD_VALIDATION.equals(key))
-        {
-            boolean oldValue = isEnableBuildValidation();
-            boolean newValue = ((Boolean)value).booleanValue();
-            setEnableBuildValidation(newValue);
-            return Boolean.valueOf(oldValue);
-        }
-        else if (KEY_ENABLE_INCREMENTAL_VALIDATION.equals(key))
-        {
-            boolean oldValue = isEnableIncrementalValidation();
-            boolean newValue = ((Boolean)value).booleanValue();
-            setEnableIncrementalValidation(newValue);
-            return Boolean.valueOf(oldValue);
-        }
-        else
-        {
-            final Severity oldValue = getSeverity(key);
-            setSeverity(key, (Severity)value);
-            return oldValue;
-        }
-    }
-
-    /**
-     * @return the build validation enablement
-     */
-    public boolean isEnableBuildValidation() 
-    {
-        return _enableBuildValidation;
-    }
-
-    /**
-     * @return the incremental validation enablement
-     */
-    public boolean isEnableIncrementalValidation() 
-    {
-        return _enableIncrementalValidation;
-    }
-
-    /**
-     * @param enableBuildValidation
-     */
-    public void setEnableBuildValidation(boolean enableBuildValidation) {
-        _enableBuildValidation = enableBuildValidation;
-    }
-
-    /**
-     * @param enableIncrementalValidation
-     */
-    public void setEnableIncrementalValidation(boolean enableIncrementalValidation) {
-        _enableIncrementalValidation = enableIncrementalValidation;
-    }
-    
-    /**
-     * @param key
-     * @return the severity
-     */
-    public Severity getSeverity(final String key)
-    {
-        final int severityDiag = _severities[getIdByKey(key)];
-        final Severity severity = mapDiagToSeverity(severityDiag);
-        return severity;
-    }
-
-    /**
-     * @param key
-     * @param severity
-     */
-    public void setSeverity(final String key, final Severity severity)
-    {
-        final int newSeverityDiag = mapSeverityToDiag(severity.toString());
-        final int diagId = getIdByKey(key);
-        _severities[diagId] = newSeverityDiag;
-    }
-    
-    /**
-     * @param diagnosticId
-     * @return the severity as configured for diagnosticId.  The value
-     * is relative to the Diagnostic class severity scheme
-     */
-    public final int getDiagnosticSeverity(final int diagnosticId)
-    {
-        return getSeverities()[diagnosticId];
-    }
-    
-    private int[] getSeverities()
-    {
-        if (_severities == null)
-        {
-            _severities = new int[DiagnosticFactory.NUM_IDS];
-        }
-        
-        return _severities;
-    }
-    
-    /**
-     * @param diagSeverity
-     * @return a Severity preference value for a diagnostic severity
-     */
-    public static Severity mapDiagToSeverity(int diagSeverity)
-    {
-        switch(diagSeverity)
-        {
-            case Diagnostic.ERROR:
-                return Severity.ERROR;
-            case Diagnostic.WARNING:
-                return Severity.WARNING;
-            default:
-                return Severity.IGNORE;
-        }
-    }
-    
-    /**
-     * @param severity
-     * @return a Diagnostic severity level for a severity pref string
-     */
-    public static int mapSeverityToDiag(String severity)
-    {
-        if ("error".equals(severity)) //$NON-NLS-1$
-        {
-            return Diagnostic.ERROR;
-        }
-        else if ("warning".equals(severity)) //$NON-NLS-1$
-        {
-            return Diagnostic.WARNING;
-        }
-        else if ("ignore".equals(severity)) //$NON-NLS-1$
-        {
-            return Diagnostic.OK;
-        }
-        else
-        {
-            throw new IllegalArgumentException("Invalid enum name: "+severity); //$NON-NLS-1$
-        }
-    }
-    
-    /**
-     * @param diagnosticId
-     * @return the default severity of a diagnostic
-     */
-    public static int getDefaultSeverity(final int diagnosticId)
-    {
-        switch(diagnosticId)
-        {
-            case DiagnosticFactory.BINARY_OP_BOTH_OPERANDS_NULL_ID:
-                return Diagnostic.WARNING;
-            case DiagnosticFactory.BINARY_OP_POSSIBLE_DIVISION_BY_ZERO_ID:
-                return Diagnostic.ERROR;
-            case DiagnosticFactory.BINARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION_ID:
-                return Diagnostic.ERROR;
-            case DiagnosticFactory.BINARY_OP_CONSTANT_EXPRESSION_ALWAYS_EVAL_SAME_ID:
-                return Diagnostic.WARNING;
-            case DiagnosticFactory.BINARY_OP_EQUALITY_COMP_WITH_NULL_ALWAYS_EVAL_SAME_ID:
-                return Diagnostic.WARNING;
-            case DiagnosticFactory.BINARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN_ID:
-                return Diagnostic.ERROR;
-            case DiagnosticFactory.BINARY_OP_FIRST_ARGUMENT_SHORT_CIRCUITS_ID:
-                return Diagnostic.WARNING;
-            case DiagnosticFactory.BINARY_OP_SECOND_ARGUMENT_ALWAYS_EVAL_SAME_ID:
-                return Diagnostic.WARNING;
-            case DiagnosticFactory.BINARY_OP_NO_AVAILABLE_TYPE_COERCION_ID:
-                return Diagnostic.ERROR;
-            case DiagnosticFactory.BINARY_OP_COULD_NOT_COERCE_LITERALS_TO_NUMBERS_ID:
-                return Diagnostic.ERROR;
-            case DiagnosticFactory.UNARY_OP_CONSTANT_EXPRESSION_EVAL_SAME_ID:
-                return Diagnostic.WARNING;
-            case DiagnosticFactory.UNARY_OP_EMPTY_ALWAYS_FALSE_ON_TYPE_ID:
-                return Diagnostic.WARNING;
-            case DiagnosticFactory.UNARY_OP_MINUS_ON_NULL_ALWAYS_ZERO_ID:
-                return Diagnostic.WARNING;
-            case DiagnosticFactory.UNARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION_ID:
-                return Diagnostic.ERROR;
-            case DiagnosticFactory.UNARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN_ID:
-                return Diagnostic.ERROR;
-            case DiagnosticFactory.TERNARY_OP_CHOICE_IS_ALWAYS_SAME_ID:
-                return Diagnostic.WARNING;
-            case DiagnosticFactory.TERNARY_OP_CANNOT_COERCE_CHOICE_TO_BOOLEAN_ID:
-                return Diagnostic.ERROR;
-            case DiagnosticFactory.UNARY_OP_STRING_CONVERSION_NOT_GUARANTEED_ID:
-                return Diagnostic.WARNING;
-            case DiagnosticFactory.CANNOT_APPLY_OPERATOR_TO_METHOD_BINDING_ID:
-                return Diagnostic.ERROR;
-            case DiagnosticFactory.MEMBER_NOT_FOUND_ID:
-                return Diagnostic.WARNING;
-            case DiagnosticFactory.VARIABLE_NOT_FOUND_ID:
-                return Diagnostic.INFO;
-            case DiagnosticFactory.MISSING_CLOSING_EXPR_BRACKET_ID:
-                return Diagnostic.ERROR;
-            case DiagnosticFactory.GENERAL_SYNTAX_ERROR_ID:
-                return Diagnostic.WARNING;
-            case DiagnosticFactory.EMPTY_EL_EXPRESSION_ID:
-                return Diagnostic.WARNING;
-            case DiagnosticFactory.BINARY_OP_DOT_WITH_VALUEB_NULL_ID:
-                return Diagnostic.WARNING;
-            case DiagnosticFactory.BINARY_OP_DOT_WITH_DOTTED_KEY_SHOULD_USE_ARRAY_ID:
-                return Diagnostic.WARNING;
-            case DiagnosticFactory.POSSIBLE_ARRAY_INDEX_OUT_OF_BOUNDS_ID:
-                return Diagnostic.WARNING;
-            case DiagnosticFactory.BINARY_COMPARISON_WITH_ENUM_ALWAYS_SAME_ID:
-                return Diagnostic.WARNING;
-            case DiagnosticFactory.BINARY_OP_COMPARISON_OF_ENUMS_INCOMPATIBLE_ID:
-                return Diagnostic.ERROR;
-            case DiagnosticFactory.MEMBER_IS_INTERMEDIATE_ID:
-                return Diagnostic.WARNING;
-            default:
-                throw new IllegalArgumentException("Diagnostic Id: "+ diagnosticId +" is out of range"); //$NON-NLS-1$ //$NON-NLS-2$
-        }
-    }
-
-    /**
-     * @param diagnosticId
-     * @return the preference key for the corresponding diagnosticId in the el DiagnosticFactory
-     */
-    public static String getKeyById(final int diagnosticId)
-    {
-        switch(diagnosticId)
-        {
-            case DiagnosticFactory.BINARY_OP_BOTH_OPERANDS_NULL_ID:
-                return BINARY_OP_BOTH_OPERANDS_NULL;
-            case DiagnosticFactory.BINARY_OP_POSSIBLE_DIVISION_BY_ZERO_ID:
-                return BINARY_OP_POSSIBLE_DIVISION_BY_ZERO;
-            case DiagnosticFactory.BINARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION_ID:
-                return BINARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION;
-            case DiagnosticFactory.BINARY_OP_CONSTANT_EXPRESSION_ALWAYS_EVAL_SAME_ID:
-                return BINARY_OP_CONSTANT_EXPRESSION_ALWAYS_EVAL_SAME;
-            case DiagnosticFactory.BINARY_OP_EQUALITY_COMP_WITH_NULL_ALWAYS_EVAL_SAME_ID:
-                return BINARY_OP_EQUALITY_COMP_WITH_NULL_ALWAYS_EVAL_SAME;
-            case DiagnosticFactory.BINARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN_ID:
-                return BINARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN;
-            case DiagnosticFactory.BINARY_OP_FIRST_ARGUMENT_SHORT_CIRCUITS_ID:
-                return BINARY_OP_FIRST_ARGUMENT_SHORT_CIRCUITS;
-            case DiagnosticFactory.BINARY_OP_SECOND_ARGUMENT_ALWAYS_EVAL_SAME_ID:
-                return BINARY_OP_SECOND_ARGUMENT_ALWAYS_EVAL_SAME;
-            case DiagnosticFactory.BINARY_OP_NO_AVAILABLE_TYPE_COERCION_ID:
-                return BINARY_OP_NO_AVAILABLE_TYPE_COERCION;
-            case DiagnosticFactory.BINARY_OP_COULD_NOT_COERCE_LITERALS_TO_NUMBERS_ID:
-                return BINARY_OP_COULD_NOT_COERCE_LITERALS_TO_NUMBERS;
-            case DiagnosticFactory.UNARY_OP_CONSTANT_EXPRESSION_EVAL_SAME_ID:
-                return UNARY_OP_CONSTANT_EXPRESSION_EVAL_SAME;
-            case DiagnosticFactory.UNARY_OP_EMPTY_ALWAYS_FALSE_ON_TYPE_ID:
-                return UNARY_OP_EMPTY_ALWAYS_FALSE_ON_TYPE;
-            case DiagnosticFactory.UNARY_OP_MINUS_ON_NULL_ALWAYS_ZERO_ID:
-                return UNARY_OP_MINUS_ON_NULL_ALWAYS_ZERO;
-            case DiagnosticFactory.UNARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION_ID:
-                return UNARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION;
-            case DiagnosticFactory.UNARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN_ID:
-                return UNARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN;
-            case DiagnosticFactory.TERNARY_OP_CHOICE_IS_ALWAYS_SAME_ID:
-                return TERNARY_OP_CHOICE_IS_ALWAYS_SAME;
-            case DiagnosticFactory.TERNARY_OP_CANNOT_COERCE_CHOICE_TO_BOOLEAN_ID:
-                return TERNARY_OP_CANNOT_COERCE_CHOICE_TO_BOOLEAN;
-            case DiagnosticFactory.UNARY_OP_STRING_CONVERSION_NOT_GUARANTEED_ID:
-                return UNARY_OP_STRING_CONVERSION_NOT_GUARANTEED;
-            case DiagnosticFactory.CANNOT_APPLY_OPERATOR_TO_METHOD_BINDING_ID:
-                return CANNOT_APPLY_OPERATOR_TO_METHOD_BINDING;
-            case DiagnosticFactory.MEMBER_NOT_FOUND_ID:
-                return MEMBER_NOT_FOUND;
-            case DiagnosticFactory.VARIABLE_NOT_FOUND_ID:
-                return VARIABLE_NOT_FOUND;
-            case DiagnosticFactory.MISSING_CLOSING_EXPR_BRACKET_ID:
-                return MISSING_CLOSING_EXPR_BRACKET;
-            case DiagnosticFactory.GENERAL_SYNTAX_ERROR_ID:
-                return GENERAL_SYNTAX_ERROR;
-            case DiagnosticFactory.EMPTY_EL_EXPRESSION_ID:
-                return EMPTY_EL_EXPRESSION;
-            case DiagnosticFactory.BINARY_OP_DOT_WITH_VALUEB_NULL_ID:
-                return BINARY_OP_DOT_WITH_VALUEB_NULL;
-            case DiagnosticFactory.BINARY_OP_DOT_WITH_DOTTED_KEY_SHOULD_USE_ARRAY_ID:
-                return BINARY_OP_DOT_WITH_DOTTED_KEY_SHOULD_USE_ARRAY;
-            case DiagnosticFactory.POSSIBLE_ARRAY_INDEX_OUT_OF_BOUNDS_ID:
-                return POSSIBLE_ARRAY_INDEX_OUT_OF_BOUNDS;
-            case DiagnosticFactory.BINARY_COMPARISON_WITH_ENUM_ALWAYS_SAME_ID:
-                return BINARY_COMPARISON_WITH_ENUM_ALWAYS_SAME;
-            case DiagnosticFactory.BINARY_OP_COMPARISON_OF_ENUMS_INCOMPATIBLE_ID:
-                return BINARY_OP_COMPARISON_OF_ENUMS_INCOMPATIBLE;
-            case DiagnosticFactory.MEMBER_IS_INTERMEDIATE_ID:
-                return MEMBER_IS_INTERMEDIATE;
-            default:
-                throw new IllegalArgumentException("Diagnostic Id: "+ diagnosticId +" is out of range"); //$NON-NLS-1$ //$NON-NLS-2$
-        }
-    }
-    
-    /**
-     * @param key
-     * @return the preference key for the corresponding diagnosticId in the el DiagnosticFactory
-     */
-    public static int getIdByKey(final String key)
-    {
-        if (BINARY_OP_BOTH_OPERANDS_NULL.equals(key))
-        {
-            return DiagnosticFactory.BINARY_OP_BOTH_OPERANDS_NULL_ID;
-        }
-        else if (BINARY_OP_POSSIBLE_DIVISION_BY_ZERO.equals(key))
-        {
-            return DiagnosticFactory.BINARY_OP_POSSIBLE_DIVISION_BY_ZERO_ID;
-        }
-        else if (BINARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION.equals(key))
-        {
-            return DiagnosticFactory.BINARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION_ID;
-        }
-        else if (BINARY_OP_CONSTANT_EXPRESSION_ALWAYS_EVAL_SAME.equals(key))
-        {
-            return DiagnosticFactory.BINARY_OP_CONSTANT_EXPRESSION_ALWAYS_EVAL_SAME_ID;
-        }
-        else if (BINARY_OP_EQUALITY_COMP_WITH_NULL_ALWAYS_EVAL_SAME.equals(key))
-        {
-            return DiagnosticFactory.BINARY_OP_EQUALITY_COMP_WITH_NULL_ALWAYS_EVAL_SAME_ID;
-        }
-        else if (BINARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN.equals(key))
-        {
-            return DiagnosticFactory.BINARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN_ID;
-        }
-        else if (BINARY_OP_FIRST_ARGUMENT_SHORT_CIRCUITS.equals(key))
-        {
-            return DiagnosticFactory.BINARY_OP_FIRST_ARGUMENT_SHORT_CIRCUITS_ID;
-        }
-        else if (BINARY_OP_SECOND_ARGUMENT_ALWAYS_EVAL_SAME.equals(key))
-        {
-            return DiagnosticFactory.BINARY_OP_SECOND_ARGUMENT_ALWAYS_EVAL_SAME_ID;
-        }
-        else if (BINARY_OP_NO_AVAILABLE_TYPE_COERCION.equals(key))
-        {
-            return DiagnosticFactory.BINARY_OP_NO_AVAILABLE_TYPE_COERCION_ID;
-        }
-        else if (BINARY_OP_COULD_NOT_COERCE_LITERALS_TO_NUMBERS.equals(key))
-        {
-            return DiagnosticFactory.BINARY_OP_COULD_NOT_COERCE_LITERALS_TO_NUMBERS_ID;
-        }
-        else if (UNARY_OP_CONSTANT_EXPRESSION_EVAL_SAME.equals(key))
-        {
-            return DiagnosticFactory.UNARY_OP_CONSTANT_EXPRESSION_EVAL_SAME_ID;
-        }
-        else if (UNARY_OP_EMPTY_ALWAYS_FALSE_ON_TYPE.equals(key))
-        {
-            return DiagnosticFactory.UNARY_OP_EMPTY_ALWAYS_FALSE_ON_TYPE_ID;
-        }
-        else if (UNARY_OP_MINUS_ON_NULL_ALWAYS_ZERO.equals(key))
-        {
-            return DiagnosticFactory.UNARY_OP_MINUS_ON_NULL_ALWAYS_ZERO_ID;
-        }
-        else if (UNARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION.equals(key))
-        {
-            return DiagnosticFactory.UNARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION_ID;
-        }
-        else if (UNARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN.equals(key))
-        {
-            return DiagnosticFactory.UNARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN_ID;
-        }
-        else if (TERNARY_OP_CHOICE_IS_ALWAYS_SAME.equals(key))
-        {
-            return DiagnosticFactory.TERNARY_OP_CHOICE_IS_ALWAYS_SAME_ID;
-        }
-        else if (TERNARY_OP_CANNOT_COERCE_CHOICE_TO_BOOLEAN.equals(key))
-        {
-            return DiagnosticFactory.TERNARY_OP_CANNOT_COERCE_CHOICE_TO_BOOLEAN_ID;
-        }
-        else if (UNARY_OP_STRING_CONVERSION_NOT_GUARANTEED.equals(key))
-        {
-            return DiagnosticFactory.UNARY_OP_STRING_CONVERSION_NOT_GUARANTEED_ID;
-        }
-        else if (CANNOT_APPLY_OPERATOR_TO_METHOD_BINDING.equals(key))
-        {
-            return DiagnosticFactory.CANNOT_APPLY_OPERATOR_TO_METHOD_BINDING_ID;
-        }
-        else if (MEMBER_NOT_FOUND.equals(key))
-        {
-            return DiagnosticFactory.MEMBER_NOT_FOUND_ID;
-        }
-        else if (VARIABLE_NOT_FOUND.equals(key))
-        {
-            return DiagnosticFactory.VARIABLE_NOT_FOUND_ID;
-        }
-        else if (MISSING_CLOSING_EXPR_BRACKET.equals(key))
-        {
-            return DiagnosticFactory.MISSING_CLOSING_EXPR_BRACKET_ID;
-        }
-        else if (GENERAL_SYNTAX_ERROR.equals(key))
-        {
-            return DiagnosticFactory.GENERAL_SYNTAX_ERROR_ID;
-        }
-        else if (EMPTY_EL_EXPRESSION.equals(key))
-        {
-           return DiagnosticFactory.EMPTY_EL_EXPRESSION_ID;
-        }
-        else if (BINARY_OP_DOT_WITH_VALUEB_NULL.equals(key))
-        {
-            return DiagnosticFactory.BINARY_OP_DOT_WITH_VALUEB_NULL_ID;
-        }
-        else if (BINARY_OP_DOT_WITH_DOTTED_KEY_SHOULD_USE_ARRAY.equals(key))
-        {
-            return DiagnosticFactory.BINARY_OP_DOT_WITH_DOTTED_KEY_SHOULD_USE_ARRAY_ID;
-        }
-        else if (POSSIBLE_ARRAY_INDEX_OUT_OF_BOUNDS.equals(key))
-        {
-            return DiagnosticFactory.POSSIBLE_ARRAY_INDEX_OUT_OF_BOUNDS_ID;
-        }
-        else if (BINARY_COMPARISON_WITH_ENUM_ALWAYS_SAME.equals(key))
-        {
-            return DiagnosticFactory.BINARY_COMPARISON_WITH_ENUM_ALWAYS_SAME_ID;
-        }
-        else if (BINARY_OP_COMPARISON_OF_ENUMS_INCOMPATIBLE.equals(key))
-        {
-            return DiagnosticFactory.BINARY_OP_COMPARISON_OF_ENUMS_INCOMPATIBLE_ID;
-        }
-        else if (MEMBER_IS_INTERMEDIATE.equals(key))
-        {
-            return DiagnosticFactory.MEMBER_IS_INTERMEDIATE_ID;
-        }
-        else
-        {
-            throw new IllegalArgumentException("Severity Key: "+ key); //$NON-NLS-1$
-        }
-    }
-    
-    /**
-     * e.g. createQualifiedKeyName("foo") -> org.eclipse.jst.jsf.core.foo
-     * @param baseName
-     * @return a plugin qualified key given the baseName
-     * 
-     */
-    private static String createQualifiedKeyName(final String baseName)
-    {
-        return JSFCorePlugin.PLUGIN_ID + "." + baseName; //$NON-NLS-1$
-    }
-    
-    /**
-     * preference key.  Match to DiagnosticFactory constants
-     */
-    public final static String BINARY_OP_BOTH_OPERANDS_NULL = 
-        createQualifiedKeyName("BINARY_OP_BOTH_OPERANDS_NULL"); //$NON-NLS-1$
-    /**
-     * preference key.  Match to DiagnosticFactory constants
-     */
-    public final static String BINARY_OP_POSSIBLE_DIVISION_BY_ZERO = 
-        createQualifiedKeyName("BINARY_OP_POSSIBLE_DIVISION_BY_ZERO"); //$NON-NLS-1$
-    /**
-     * preference key.  Match to DiagnosticFactory constants
-     */
-    public final static String BINARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION = 
-        createQualifiedKeyName("BINARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION"); //$NON-NLS-1$
-    /**
-     * preference key.  Match to DiagnosticFactory constants
-     */
-    public final static String BINARY_OP_CONSTANT_EXPRESSION_ALWAYS_EVAL_SAME = 
-        createQualifiedKeyName("BINARY_OP_CONSTANT_EXPRESSION_ALWAYS_EVAL_SAME"); //$NON-NLS-1$
-    /**
-     * preference key.  Match to DiagnosticFactory constants
-     */
-    public final static String BINARY_OP_EQUALITY_COMP_WITH_NULL_ALWAYS_EVAL_SAME = 
-        createQualifiedKeyName("BINARY_OP_EQUALITY_COMP_WITH_NULL_ALWAYS_EVAL_SAME"); //$NON-NLS-1$
-    /**
-     * preference key.  Match to DiagnosticFactory constants
-     */
-    public final static String BINARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN = 
-        createQualifiedKeyName("BINARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN"); //$NON-NLS-1$
-    /**
-     * preference key.  Match to DiagnosticFactory constants
-     */
-    public final static String BINARY_OP_FIRST_ARGUMENT_SHORT_CIRCUITS = 
-        createQualifiedKeyName("BINARY_OP_FIRST_ARGUMENT_SHORT_CIRCUITS"); //$NON-NLS-1$
-    /**
-     * preference key.  Match to DiagnosticFactory constants
-     */
-    public final static String BINARY_OP_SECOND_ARGUMENT_ALWAYS_EVAL_SAME =
-        createQualifiedKeyName("BINARY_OP_SECOND_ARGUMENT_ALWAYS_EVAL_SAME"); //$NON-NLS-1$
-    /**
-     * preference key.  Match to DiagnosticFactory constants
-     */
-    public final static String BINARY_OP_NO_AVAILABLE_TYPE_COERCION = 
-        createQualifiedKeyName("BINARY_OP_NO_AVAILABLE_TYPE_COERCION"); //$NON-NLS-1$
-    /**
-     * preference key.  Match to DiagnosticFactory constants
-     */
-    public final static String BINARY_OP_COULD_NOT_COERCE_LITERALS_TO_NUMBERS = 
-        createQualifiedKeyName("BINARY_OP_COULD_NOT_COERCE_LITERALS_TO_NUMBERS"); //$NON-NLS-1$
-    /**
-     * preference key.  Match to DiagnosticFactory constants
-     */
-    public final static String UNARY_OP_CONSTANT_EXPRESSION_EVAL_SAME = 
-        createQualifiedKeyName("UNARY_OP_CONSTANT_EXPRESSION_EVAL_SAME"); //$NON-NLS-1$
-    /**
-     * preference key.  Match to DiagnosticFactory constants
-     */
-    public final static String UNARY_OP_EMPTY_ALWAYS_FALSE_ON_TYPE = 
-        createQualifiedKeyName("UNARY_OP_EMPTY_ALWAYS_FALSE_ON_TYPE"); //$NON-NLS-1$
-    /**
-     * preference key.  Match to DiagnosticFactory constants
-     */
-    public final static String UNARY_OP_MINUS_ON_NULL_ALWAYS_ZERO = 
-        createQualifiedKeyName("UNARY_OP_MINUS_ON_NULL_ALWAYS_ZERO"); //$NON-NLS-1$
-    /**
-     * preference key.  Match to DiagnosticFactory constants
-     */
-    public final static String UNARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION = 
-        createQualifiedKeyName("UNARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION"); //$NON-NLS-1$
-    /**
-     * preference key.  Match to DiagnosticFactory constants
-     */
-    public final static String UNARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN = 
-        createQualifiedKeyName("UNARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN"); //$NON-NLS-1$
-    /**
-     * preference key.  Match to DiagnosticFactory constants
-     */
-    public final static String TERNARY_OP_CHOICE_IS_ALWAYS_SAME = 
-        createQualifiedKeyName("TERNARY_OP_CHOICE_IS_ALWAYS_SAME"); //$NON-NLS-1$
-    /**
-     * preference key.  Match to DiagnosticFactory constants
-     */
-    public final static String TERNARY_OP_CANNOT_COERCE_CHOICE_TO_BOOLEAN = 
-        createQualifiedKeyName("TERNARY_OP_CANNOT_COERCE_CHOICE_TO_BOOLEAN");  //$NON-NLS-1$
-    /**
-     * preference key.  Match to DiagnosticFactory constants
-     */
-    public final static String UNARY_OP_STRING_CONVERSION_NOT_GUARANTEED = 
-        createQualifiedKeyName("UNARY_OP_STRING_CONVERSION_NOT_GUARANTEED"); //$NON-NLS-1$
-    /**
-     * preference key.  Match to DiagnosticFactory constants
-     */
-    public final static String CANNOT_APPLY_OPERATOR_TO_METHOD_BINDING = 
-        createQualifiedKeyName("CANNOT_APPLY_OPERATOR_TO_METHOD_BINDING"); //$NON-NLS-1$
-    /**
-     * preference key.  Match to DiagnosticFactory constants
-     */
-    public final static String MEMBER_NOT_FOUND = 
-        createQualifiedKeyName("MEMBER_NOT_FOUND"); //$NON-NLS-1$
-    /**
-     * preference key.  Match to DiagnosticFactory constants
-     */
-    public final static String VARIABLE_NOT_FOUND = 
-        createQualifiedKeyName("VARIABLE_NOT_FOUND"); //$NON-NLS-1$
-    /**
-     * preference key.  Match to DiagnosticFactory constants
-     */
-    public final static String MISSING_CLOSING_EXPR_BRACKET = 
-        createQualifiedKeyName("MISSING_CLOSING_EXPR_BRACKET"); //$NON-NLS-1$
-    /**
-     * preference key.  Match to DiagnosticFactory constants
-     */
-    public final static String GENERAL_SYNTAX_ERROR = 
-        createQualifiedKeyName("GENERAL_SYNTAX_ERROR"); //$NON-NLS-1$
-    /**
-     * preference key.  Match to DiagnosticFactory constants
-     */
-    public final static String EMPTY_EL_EXPRESSION = 
-        createQualifiedKeyName("EMPTY_EL_EXPRESSION"); //$NON-NLS-1$
-    /**
-     * preference key.  Match to DiagnosticFactory constants
-     */
-    public final static String BINARY_OP_DOT_WITH_VALUEB_NULL = 
-        createQualifiedKeyName("BINARY_OP_DOT_WITH_VALUEB_NULL"); //$NON-NLS-1$
-    /**
-     * preference key.  Match to DiagnosticFactory constants
-     */
-    public final static String BINARY_OP_DOT_WITH_DOTTED_KEY_SHOULD_USE_ARRAY = 
-        createQualifiedKeyName("BINARY_OP_DOT_WITH_DOTTED_KEY_SHOULD_USE_ARRAY"); //$NON-NLS-1$
-    /**
-     * preference key.  Match to DiagnosticFactory constants
-     */
-    public final static String POSSIBLE_ARRAY_INDEX_OUT_OF_BOUNDS = 
-        createQualifiedKeyName("POSSIBLE_ARRAY_INDEX_OUT_OF_BOUNDS"); //$NON-NLS-1$
-    /**
-     * preference key.  Match to DiagnosticFactory constants
-     */
-    public final static String BINARY_COMPARISON_WITH_ENUM_ALWAYS_SAME = 
-        createQualifiedKeyName("BINARY_COMPARISON_WITH_ENUM_ALWAYS_SAME"); //$NON-NLS-1$
-    /**
-     * preference key.  Match to DiagnosticFactory constants
-     */
-    public final static String BINARY_OP_COMPARISON_OF_ENUMS_INCOMPATIBLE = 
-        createQualifiedKeyName("BINARY_OP_COMPARISON_OF_ENUMS_INCOMPATIBLE"); //$NON-NLS-1$
-    
-    /**
-     * preference key.  Match to DiagnosticFactory constants
-     */
-    public final static String MEMBER_IS_INTERMEDIATE =
-        createQualifiedKeyName("MEMBER_IS_INTERMEDIATE"); //$NON-NLS-1$
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/IJSFViewValidator.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/IJSFViewValidator.java
deleted file mode 100644
index a51c914..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/IJSFViewValidator.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.validation.internal;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.emf.common.util.Diagnostic;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
-import org.eclipse.wst.validation.internal.provisional.core.IMessage;
-
-/**
- * A validator for JSF views
- * 
- * @author cbateman
- * 
- */
-public interface IJSFViewValidator
-{
-    /**
-     * Validate the entire view file and report an problems using reporter.
-     * 
-     * @param viewFile
-     * @param reporter
-     */
-    void validateView(final IFile viewFile, final IValidationReporter reporter);
-
-    /**
-     * Validate only those regions specified in the viewFile and report problems
-     * using reporter.
-     * 
-     * @param viewFile
-     * @param regions
-     * @param reporter 
-     */
-    void validateView(final IFile viewFile,
-            final IStructuredDocumentRegion[] regions,
-            final IValidationReporter reporter);
-
-    /**
-     * Implemented by callers of the view validator to receive notification
-     * of problems discovered during validation.
-     *
-     */
-    public interface IValidationReporter
-    {
-        /**
-         * @param problem
-         * @param start
-         * @param length
-         */
-        void report(final Diagnostic problem, final int start, final int length);
-
-        /**
-         * @param message
-         * @deprecated internally by design
-         */
-        void report(final IMessage message);
-    }
-    
-    /**
-     * An empty adapter implementation of IValidationReporter.  All methods
-     * are noops.
-     * 
-     * @author cbateman
-     *
-     */
-    public class ReporterAdapter implements IValidationReporter
-    {
-
-        public void report(Diagnostic problem, int start, int length)
-        {
-            // do nothing
-        }
-
-        public void report(IMessage message)
-        {
-            // do nothing
-        }
-        
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/IJSPSemanticValidatorTest.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/IJSPSemanticValidatorTest.java
deleted file mode 100644
index 454d31d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/IJSPSemanticValidatorTest.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.validation.internal;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.jst.jsf.core.internal.region.Region2ElementAdapter;
-import org.eclipse.jst.jsf.validation.internal.IJSFViewValidator.IValidationReporter;
-
-/**
- * Exposes certain private members for use by testing.
- * 
- * NOT intended for use by production code.
- * 
- * @author cbateman
- *
- */
-public interface IJSPSemanticValidatorTest
-{
-    /**
-     * Proxies the internal call to validate the containment of a particular
-     * tag.
-     * 
-     * @param adapter
-     * @param node
-     * @param uri
-     * @param tagName
-     * @param reporter
-     * @param file
-     * @param context
-     */
-    void validateContainment(Region2ElementAdapter adapter, IValidationReporter reporter, IFile file, IStructuredDocumentContext context);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/JSFTypeComparatorPreferences.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/JSFTypeComparatorPreferences.java
deleted file mode 100644
index f00c7f1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/JSFTypeComparatorPreferences.java
+++ /dev/null
@@ -1,339 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.validation.internal;
-
-import org.eclipse.core.runtime.preferences.IScopeContext;
-import org.eclipse.emf.common.util.Diagnostic;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jst.jsf.common.internal.types.TypeComparatorDiagnosticFactory;
-import org.eclipse.jst.jsf.common.internal.types.TypeComparatorPreferences;
-import org.eclipse.jst.jsf.core.internal.IJSFPreferenceModel;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-
-/**
- * Type comparator preferences for JSF.
- * 
- * @author cbateman
- * 
- */
-public class JSFTypeComparatorPreferences extends TypeComparatorPreferences
-        implements IJSFPreferenceModel
-{
-
-    private int[] _severities;
-
-    /**
-     * Loads the object from the preference store provided
-     * 
-     * @param prefStore
-     */
-    public void load(IPreferenceStore prefStore)
-    {
-        loadSeverities(prefStore);
-    }
-
-    private void loadSeverities(final IPreferenceStore prefStore)
-    {
-        final int severities[] = getSeverities();
-
-        for (int i = 0; i < TypeComparatorDiagnosticFactory.NUM_IDS; i++)
-        {
-            final String key = getKeyById(i);
-
-            if (!prefStore.contains(key))
-            {
-                final int diagSeverity = getDefaultSeverity(i);
-                final Severity severity = mapDiagToSeverity(diagSeverity);
-
-                prefStore.setDefault(key, severity.toString());
-            }
-            final String storedSeverity = prefStore.getString(key);
-            severities[i] = mapSeverityToDiag(storedSeverity);
-        }
-    }
-
-    /**
-     * Copies the object into the preference store but DOES NOT SAVE IT
-     * 
-     * @param prefStore
-     */
-    public void commit(IPreferenceStore prefStore)
-    {
-        commitSeverities(prefStore);
-    }
-
-    private void commitSeverities(final IPreferenceStore prefStore)
-    {
-        final int severities[] = getSeverities();
-
-        for (int i = 0; i < severities.length; i++)
-        {
-            final String key = getKeyById(i);
-            prefStore
-                    .setValue(key, mapDiagToSeverity(severities[i]).toString());
-        }
-    }
-
-    /**
-     * Reverts the model to it's defaults. Does not commit to pref store.
-     */
-    public void setDefaults()
-    {
-        setProblemSeverityDefaults();
-    }
-
-    private void setProblemSeverityDefaults()
-    {
-        final int[] severities = getSeverities();
-
-        for (int i = 0; i < TypeComparatorDiagnosticFactory.NUM_IDS; i++)
-        {
-            severities[i] = getDefaultSeverity(i);
-        }
-    }
-
-    public Object getValueByKey(IScopeContext context, String key)
-    {
-        try
-        {
-            final Severity severity = getSeverity(key);
-            return severity.toString();
-        }
-        catch (IllegalArgumentException e)
-        {
-            // getIdByKey will throw this exception if key is not a valid
-            // severity key. Ignore the exception here and fall-through
-        }
-
-        return null; // not found
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jst.jsf.core.internal.IJSFPreferenceModel#getStoredValueByKey(org.eclipse.core.runtime.preferences.IScopeContext,
-     *      java.lang.String)
-     */
-    public Object getStoredValueByKey(IScopeContext context, String key)
-    {
-        try
-        {
-            return context.getNode("org.eclipse.jst.jsf.core").get( //$NON-NLS-1$
-                    key,
-                    mapDiagToSeverity(getDefaultSeverity(getIdByKey(key)))
-                            .toString());
-        }
-        catch (IllegalArgumentException e)
-        {
-            // getIdByKey will throw this exception if key is not a valid
-            // severity key. Ignore the exception here and fall-through
-        }
-
-        return null; // not found
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jst.jsf.core.internal.IJSFPreferenceModel#setValueByKey(org.eclipse.core.runtime.preferences.IScopeContext,
-     *      java.lang.String, java.lang.Object)
-     */
-    public Object setValueByKey(IScopeContext context, String key, Object value)
-    {
-        final Severity oldValue = getSeverity(key);
-        setSeverity(key, (Severity) value);
-        return oldValue;
-    }
-
-    /**
-     * @param key
-     * @return the severity
-     */
-    public Severity getSeverity(final String key)
-    {
-        final int severityDiag = _severities[getIdByKey(key)];
-        final Severity severity = mapDiagToSeverity(severityDiag);
-        return severity;
-    }
-
-    /**
-     * @param key
-     * @param severity
-     */
-    public void setSeverity(final String key, final Severity severity)
-    {
-        final int newSeverityDiag = mapSeverityToDiag(severity.toString());
-        final int diagId = getIdByKey(key);
-        _severities[diagId] = newSeverityDiag;
-    }
-
-    /**
-     * @param diagnosticId
-     * @return the severity as configured for diagnosticId. The value is
-     *         relative to the Diagnostic class severity scheme
-     */
-    public final int getDiagnosticSeverity(final int diagnosticId)
-    {
-        return getSeverities()[diagnosticId];
-    }
-
-    private int[] getSeverities()
-    {
-        if (_severities == null)
-        {
-            _severities = new int[TypeComparatorDiagnosticFactory.NUM_IDS];
-        }
-
-        return _severities;
-    }
-
-    /**
-     * @param diagSeverity
-     * @return a Severity preference value for a diagnostic severity
-     */
-    public static Severity mapDiagToSeverity(int diagSeverity)
-    {
-        switch (diagSeverity)
-        {
-            case Diagnostic.ERROR:
-                return Severity.ERROR;
-            case Diagnostic.WARNING:
-                return Severity.WARNING;
-            default:
-                return Severity.IGNORE;
-        }
-    }
-
-    /**
-     * @param severity
-     * @return a Diagnostic severity level for a severity pref string
-     */
-    public static int mapSeverityToDiag(String severity)
-    {
-        if ("error".equals(severity)) //$NON-NLS-1$
-        {
-            return Diagnostic.ERROR;
-        }
-        else if ("warning".equals(severity)) //$NON-NLS-1$
-        {
-            return Diagnostic.WARNING;
-        }
-        else if ("ignore".equals(severity)) //$NON-NLS-1$
-        {
-            return Diagnostic.OK;
-        }
-        else
-        {
-            throw new IllegalArgumentException("Invalid enum name: " + severity); //$NON-NLS-1$
-        }
-    }
-
-    /**
-     * @param diagnosticId
-     * @return the preference key for the corresponding diagnosticId in the el
-     *         DiagnosticFactory
-     */
-    public static String getKeyById(final int diagnosticId)
-    {
-        switch (diagnosticId)
-        {
-            case TypeComparatorDiagnosticFactory.INCOMPATIBLE_METHOD_TYPES_ID:
-                return INCOMPATIBLE_METHOD_TYPES;
-            case TypeComparatorDiagnosticFactory.INCOMPATIBLE_TYPES_ID:
-                return INCOMPATIBLE_TYPES;
-            case TypeComparatorDiagnosticFactory.METHOD_EXPRESSION_EXPECTED_ID:
-                return METHOD_EXPRESSION_EXPECTED;
-            case TypeComparatorDiagnosticFactory.PROPERTY_NOT_READABLE_ID:
-                return PROPERTY_NOT_READABLE;
-            case TypeComparatorDiagnosticFactory.PROPERTY_NOT_WRITABLE_ID:
-                return PROPERTY_NOT_WRITABLE;
-            case TypeComparatorDiagnosticFactory.VALUE_EXPRESSION_EXPECTED_ID:
-                return VALUE_EXPRESSION_EXPECTED;
-            default:
-                throw new IllegalArgumentException("Diagnostic Id: " //$NON-NLS-1$
-                        + diagnosticId + " is out of range"); //$NON-NLS-1$
-        }
-    }
-
-    /**
-     * @param key
-     * @return the preference key for the corresponding diagnosticId in the el
-     *         DiagnosticFactory
-     */
-    public static int getIdByKey(final String key)
-    {
-        if (INCOMPATIBLE_METHOD_TYPES.equals(key))
-        {
-            return TypeComparatorDiagnosticFactory.INCOMPATIBLE_METHOD_TYPES_ID;
-        }
-        else if (INCOMPATIBLE_TYPES.equals(key))
-        {
-            return TypeComparatorDiagnosticFactory.INCOMPATIBLE_TYPES_ID;
-        }
-        else if (METHOD_EXPRESSION_EXPECTED.equals(key))
-        {
-            return TypeComparatorDiagnosticFactory.METHOD_EXPRESSION_EXPECTED_ID;
-        }
-        else if (PROPERTY_NOT_READABLE.equals(key))
-        {
-            return TypeComparatorDiagnosticFactory.PROPERTY_NOT_READABLE_ID;
-        }
-        else if (PROPERTY_NOT_WRITABLE.equals(key))
-        {
-            return TypeComparatorDiagnosticFactory.PROPERTY_NOT_WRITABLE_ID;
-        }
-        else if (VALUE_EXPRESSION_EXPECTED.equals(key))
-        {
-            return TypeComparatorDiagnosticFactory.VALUE_EXPRESSION_EXPECTED_ID;
-        }
-        else
-        {
-            throw new IllegalArgumentException("Severity Key: " + key); //$NON-NLS-1$
-        }
-    }
-
-    /**
-     * e.g. createQualifiedKeyName("foo") -> org.eclipse.jst.jsf.core.foo
-     * 
-     * @param baseName
-     * @return a plugin qualified key given the baseName
-     * 
-     */
-    private static String createQualifiedKeyName(final String baseName)
-    {
-        return JSFCorePlugin.PLUGIN_ID + "." + baseName; //$NON-NLS-1$
-    }
-
-    /**
-     * preference key. Match to DiagnosticFactory constants
-     */
-    public final static String INCOMPATIBLE_METHOD_TYPES  = createQualifiedKeyName("INCOMPATIBLE_METHOD_TYPES"); //$NON-NLS-1$
-    /**
-     * preference key. Match to DiagnosticFactory constants
-     */
-    public final static String INCOMPATIBLE_TYPES         = createQualifiedKeyName("INCOMPATIBLE_TYPES"); //$NON-NLS-1$
-    /**
-     * preference key. Match to DiagnosticFactory constants
-     */
-    public final static String METHOD_EXPRESSION_EXPECTED = createQualifiedKeyName("METHOD_EXPRESSION_EXPECTED"); //$NON-NLS-1$
-    /**
-     * preference key. Match to DiagnosticFactory constants
-     */
-    public final static String PROPERTY_NOT_READABLE      = createQualifiedKeyName("PROPERTY_NOT_READABLE"); //$NON-NLS-1$
-    /**
-     * preference key. Match to DiagnosticFactory constants
-     */
-    public final static String PROPERTY_NOT_WRITABLE      = createQualifiedKeyName("PROPERTY_NOT_WRITABLE"); //$NON-NLS-1$
-    /**
-     * preference key. Match to DiagnosticFactory constants
-     */
-    public final static String VALUE_EXPRESSION_EXPECTED  = createQualifiedKeyName("VALUE_EXPRESSION_EXPECTED"); //$NON-NLS-1$
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/JSFValidationContext.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/JSFValidationContext.java
deleted file mode 100644
index baae123..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/JSFValidationContext.java
+++ /dev/null
@@ -1,159 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.validation.internal;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.jst.jsf.designtime.DTAppManagerUtil;
-import org.eclipse.jst.jsf.designtime.internal.view.IDTViewHandler;
-import org.eclipse.jst.jsf.designtime.internal.view.IViewRootHandle;
-import org.eclipse.jst.jsf.designtime.resolver.IStructuredDocumentSymbolResolverFactory;
-import org.eclipse.jst.jsf.validation.internal.IJSFViewValidator.IValidationReporter;
-import org.eclipse.jst.jsf.validation.internal.el.diagnostics.DiagnosticFactory;
-
-/**
- * A context object used pass JSF validation information around. Not related to
- * the model context framework.
- * 
- * @author cbateman
- * 
- */
-public final class JSFValidationContext
-{
-    private final ValidationPreferences _prefs;
-    private final boolean               _isIncremental;
-    private final IDTViewHandler        _adapter;
-    private final DiagnosticFactory     _diagnosticFactory;
-    private final IFile                 _file;
-    private final IValidationReporter   _reporter;
-    private final IStructuredDocumentSymbolResolverFactory _symbolResolverFactory;
-    // defer initializing this until is asked for because it is expensive
-    private IViewRootHandle       _viewRootHandle;
-
-    /**
-     * @param isIncremental --
-     *            true if this is "as-you-type" validation, false if this is
-     *            "Build" or "Run Validation" validation *
-     * @param prefs
-     * @param adapter 
-     * @param diagnosticFactory 
-     * @param file
-     * @param reporter
-     * @param symbolResolveFactory 
-     */
-    public JSFValidationContext(final boolean isIncremental,
-            final ValidationPreferences prefs,
-            final IDTViewHandler adapter,
-            final DiagnosticFactory diagnosticFactory, final IFile file,
-            final IValidationReporter reporter, final IStructuredDocumentSymbolResolverFactory symbolResolveFactory)
-    {
-        super();
-        _isIncremental = isIncremental;
-        _prefs = prefs;
-        _adapter = adapter;
-        _diagnosticFactory = diagnosticFactory;
-        _file = file;
-        _reporter = reporter;
-        _symbolResolverFactory = symbolResolveFactory;
-    }
-
-    /**
-     * 
-     * @return true if user preferences say we should do EL validation, false
-     *         otherwise
-     */
-    public final boolean shouldValidateEL()
-    {
-        _prefs.load();
-        if (_isIncremental)
-        {
-            return _prefs.getElPrefs().isEnableIncrementalValidation();
-        }
-
-        return _prefs.getElPrefs().isEnableBuildValidation();
-    }
-
-
-    /**
-     * @return the view handler
-     */
-    public IDTViewHandler getAdapter()
-    {
-        return _adapter;
-    }
-
-    /**
-     * @return the validator
-     */
-//    public IValidator getValidator()
-//    {
-//        return _validator;
-//    }
-
-    /**
-     * @return validation preferences
-     */
-    public ValidationPreferences getPrefs()
-    {
-        return _prefs;
-    }
-
-    /**
-     * @return diagnostic factory
-     */
-    public DiagnosticFactory getDiagnosticFactory()
-    {
-        return _diagnosticFactory;
-    }
-
-    /**
-     * @return the file
-     */
-    public IFile getFile()
-    {
-        return _file;
-    }
-
-    /**
-     * @return the reporter.
-     */
-    public IValidationReporter getReporter()
-    {
-        return _reporter;
-    }
-
-    /**
-     * @return the symbol resolver factory for this context
-     */
-    public IStructuredDocumentSymbolResolverFactory getSymbolResolverFactory()
-    {
-        return _symbolResolverFactory;
-    }
-
-    /**
-     * This method will be long running on first call, since it has to update
-     * the view root if not initialized.
-     * 
-     * @return the view root handle
-     */
-    public IViewRootHandle getViewRootHandle()
-    {
-        if (_viewRootHandle == null)
-        {
-            _viewRootHandle = DTAppManagerUtil.getViewRootHandle(_file);
-            if (_viewRootHandle.getCachedViewRoot() == null)
-            {
-                _viewRootHandle.updateViewRoot();
-            }
-        }
-        return _viewRootHandle;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/JSFValidatorFactory.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/JSFValidatorFactory.java
deleted file mode 100644
index 06ee772..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/JSFValidatorFactory.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.validation.internal;
-
-/**
- * A factory that is to construct JSF validators
- * 
- * @author cbateman
- *
- */
-public class JSFValidatorFactory
-{
-    /**
-     * @return a default validator for XML-defined views.
-     */
-    public static IJSFViewValidator createDefaultXMLValidator()
-    {
-        return new XMLViewDefnValidator();
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/LocalizedMessage.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/LocalizedMessage.java
deleted file mode 100644
index 11151c2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/LocalizedMessage.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-/**
- * 
- */
-package org.eclipse.jst.jsf.validation.internal;
-
-import java.util.Locale;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.wst.validation.internal.core.Message;
-
-/**
- * Localized version of the message.
- * 
- * @author cbateman
- *
- */
-public class LocalizedMessage extends Message {
-
-    private String _message = null;
-
-    /**
-     * @param severity
-     * @param messageText
-     */
-    public LocalizedMessage(int severity, String messageText) {
-        this(severity, messageText, null);
-    }
-
-    /**
-     * @param severity
-     * @param messageText
-     * @param targetObject
-     */
-    public LocalizedMessage(int severity, String messageText, IResource targetObject) {
-        this(severity, messageText, (Object) targetObject);
-    }
-
-    /**
-     * @param severity
-     * @param messageText
-     * @param targetObject
-     */
-    public LocalizedMessage(int severity, String messageText, Object targetObject) {
-        super(null, severity, null);
-        setLocalizedMessage(messageText);
-        setTargetObject(targetObject);
-    }
-
-    /**
-     * @param message
-     */
-    public void setLocalizedMessage(String message) {
-        _message = message;
-    }
-
-    /**
-     * @return the message
-     */
-    public String getLocalizedMessage() {
-        return _message;
-    }
-
-    public String getText() {
-        return getLocalizedMessage();
-    }
-
-    public String getText(ClassLoader cl) {
-        return getLocalizedMessage();
-    }
-
-    public String getText(Locale l) {
-        return getLocalizedMessage();
-    }
-
-    public String getText(Locale l, ClassLoader cl) {
-        return getLocalizedMessage();
-    }
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/Severity.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/Severity.java
deleted file mode 100644
index c97b852..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/Severity.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.validation.internal;
-
-/**
- * Severity levels of problems
- */
-public enum Severity
-{
-    /**
-     * Indicates a problem severity of Error
-     */
-    ERROR 
-    {
-        public java.lang.String toString() {
-            return "error"; //$NON-NLS-1$
-        }
-    }
-    ,
-    /**
-     * Indicates a problem severity of Warning
-     */
-    WARNING
-    {
-        public java.lang.String toString() {
-            return "warning"; //$NON-NLS-1$
-        }
-    }
-    , 
-    /**
-     * Indicates no problem should be shown
-     */
-    IGNORE
-    {
-        public java.lang.String toString() {
-            return "ignore"; //$NON-NLS-1$
-        }
-    };
-    
-    /**
-     * @param value
-     * @return the enum based on the toString mappings
-     */
-    public static Severity valueOfString(String value)
-    {
-        if ("error".equals(value)) //$NON-NLS-1$
-        {
-            return ERROR;
-        }
-        else if ("warning".equals(value)) //$NON-NLS-1$
-        {
-            return WARNING;
-        }
-        else
-        {
-            return IGNORE;
-        }
-    }
- }
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/ValidationPreferences.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/ValidationPreferences.java
deleted file mode 100644
index 2340969..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/ValidationPreferences.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.validation.internal;
-
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jst.jsf.validation.internal.facelet.FaceletValidationPreferences;
-
-/**
- * @author cbateman
- *
- */
-public class ValidationPreferences 
-{
-    private final IPreferenceStore                      _prefStore;
-    private final ELValidationPreferences               _elPrefs;
-    private final JSFTypeComparatorPreferences          _typeComparatorPrefs;
-    private final FaceletValidationPreferences          _faceletPrefs;
-    /**
-     * Constructor
-     * @param prefStore 
-     */
-    public ValidationPreferences(IPreferenceStore  prefStore)
-    {
-        _prefStore = prefStore;
-        _elPrefs = new ELValidationPreferences();
-        _typeComparatorPrefs = new JSFTypeComparatorPreferences();
-        _faceletPrefs = new FaceletValidationPreferences();
-    }
-
-    /**
-     * @return the el preferences
-     */
-    public ELValidationPreferences getElPrefs() 
-    {
-        return _elPrefs;
-    }
-
-    /**
-     * @return the type comparator preferences.
-     */
-    public JSFTypeComparatorPreferences getTypeComparatorPrefs()
-    {
-        return _typeComparatorPrefs;
-    }
-
-    /**
-     * @return the el preferences
-     */
-    public FaceletValidationPreferences getFaceletValidationPrefs() 
-    {
-        return _faceletPrefs;
-    }
-
-    /**IPreferenceStore
-     * The default preference loader
-     */
-    public void load()
-    {
-        load(_prefStore);
-    }
-    
-    /**
-     * Loads preferences from prefStore
-     * 
-     * @param prefStore
-     */
-    private void load(IPreferenceStore prefStore)
-    {
-        _elPrefs.load(prefStore);
-        _typeComparatorPrefs.load(prefStore);
-        _faceletPrefs.load(prefStore);
-    }
-
-    /**
-     * Commits but does not store the preferences
-     * 
-     * @param prefStore
-     */
-    public void commit(IPreferenceStore prefStore)
-    {
-        _elPrefs.commit(prefStore);
-        _typeComparatorPrefs.commit(prefStore);
-        _faceletPrefs.commit(prefStore);
-    }
-    
-    /**
-     * Reverts the model to it's defaults.  Does not commit to pref store.
-     */
-    public void setDefaults()
-    {
-        _elPrefs.setDefaults();
-        _typeComparatorPrefs.setDefaults();
-        _faceletPrefs.setDefaults();
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/XMLViewDefnValidator.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/XMLViewDefnValidator.java
deleted file mode 100644
index 9de83d1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/XMLViewDefnValidator.java
+++ /dev/null
@@ -1,203 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.validation.internal;
-
-import java.io.IOException;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.core.internal.region.Region2AttrAdapter;
-import org.eclipse.jst.jsf.core.internal.region.Region2ElementAdapter;
-import org.eclipse.jst.jsf.core.internal.region.Region2ElementAdapter.NoElementException;
-import org.eclipse.jst.jsf.designtime.DTAppManagerUtil;
-import org.eclipse.jst.jsf.designtime.internal.view.IDTViewHandler;
-import org.eclipse.jst.jsf.designtime.resolver.IStructuredDocumentSymbolResolverFactory;
-import org.eclipse.jst.jsf.designtime.resolver.StructuredDocumentSymbolResolverFactory;
-import org.eclipse.jst.jsf.validation.internal.el.diagnostics.DiagnosticFactory;
-import org.eclipse.jst.jsf.validation.internal.strategy.AttributeValidatingStrategy;
-import org.eclipse.jst.jsf.validation.internal.strategy.ContainmentValidatingStrategy;
-import org.eclipse.wst.sse.core.StructuredModelManager;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
-import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext;
-
-/**
- * Validator for JSF view definitions that are structured in XML format
- * 
- * @author cbateman
- * 
- */
-public class XMLViewDefnValidator implements IJSFViewValidator
-{
-    // TODO: should the source validator be a separate class in jsp.ui?
-    // problem with simple split off is that preference must also be split off
-    static final boolean DEBUG;
-    static
-    {
-        final String value = Platform
-        .getDebugOption("org.eclipse.jst.jsf.core/validation"); //$NON-NLS-1$
-        DEBUG = value != null && value.equalsIgnoreCase("true"); //$NON-NLS-1$
-    }
-
-    // default.  Overridable by calling setSymbolResolverFactory
-    private IStructuredDocumentSymbolResolverFactory   _symbolResolverFactory =
-        StructuredDocumentSymbolResolverFactory.getInstance();
-
-    /**
-     * Validates a JSP tag.
-     * 
-     * Currently only attribute values with supplied annotation meta-data is
-     * being validated. Also, only JSF EL is being validated and not JSP EL.
-     * 
-     * This method may be extended in the future to validate tag semantics an
-     * other cross attribute validations.
-     * 
-     * @param container
-     * @param jsfValidationContext 
-     * 
-     */
-    private void validateTag(final IStructuredDocumentRegion container,
-            final JSFValidationContext jsfValidationContext, 
-            final ContainmentValidatingStrategy containmentStrategy)
-    {
-        // TODO: later when we move to composite strategy, run in SafeRunner
-        // to protect against exceptions generated in external code.
-        try
-        {
-            final Region2ElementAdapter regionAdapter = new Region2ElementAdapter(
-                    container);
-
-//            final IStructuredDocumentContext elementContext = 
-//                IStructuredDocumentContextFactory.INSTANCE
-//                    .getContext(container.getParentDocument(), container
-//                            .getStartOffset());
-
-            if (containmentStrategy.isInteresting(regionAdapter))
-            {
-                containmentStrategy.validate(regionAdapter);
-            }
-
-            final AttributeValidatingStrategy  strategy =
-                new AttributeValidatingStrategy(jsfValidationContext);
-
-            for (final Region2AttrAdapter attrAdapter : regionAdapter
-                    .getAttributes().values())
-            {
-                if (strategy.isInteresting(attrAdapter))
-                {
-                    strategy.validate(attrAdapter);
-                }
-            }
-        }
-        catch (NoElementException ne)
-        {
-            // XXX:
-        }
-    }
-
-    public void validateView(final IFile viewFile, final IValidationReporter reporter)
-    {
-        IStructuredModel model = null;
-        if (DEBUG)
-        {
-            System.out.println("executing JSPSemanticsValidator.validateFile"); //$NON-NLS-1$
-        }
-
-        try
-        {
-            final JSFValidationContext jsfValidationContext =
-                createValidationContext(false, viewFile, reporter);
-
-            if (jsfValidationContext == null)
-            {
-                return;
-            }
-
-            model = StructuredModelManager.getModelManager().getModelForRead(
-                    viewFile);
-
-            final IStructuredDocument structuredDoc =
-                model.getStructuredDocument();
-            final IStructuredDocumentRegion[] regions =
-                structuredDoc.getStructuredDocumentRegions();
-            validateRegions(regions, jsfValidationContext, 
-                    new ContainmentValidatingStrategy(jsfValidationContext));
-        }
-        catch (final CoreException e)
-        {
-            JSFCorePlugin.log("Error validating JSF", e); //$NON-NLS-1$
-        }
-        catch (final IOException e)
-        {
-            JSFCorePlugin.log("Error validating JSF", e); //$NON-NLS-1$
-        }
-        finally
-        {
-            if (null != model)
-            {
-                model.releaseFromRead();
-            }
-        }
-    }
-
-    public void validateView(IFile viewFile,
-            IStructuredDocumentRegion[] regions, IValidationReporter reporter)
-    {
-        final JSFValidationContext jsfValidationContext =
-            createValidationContext(true, viewFile, reporter);
-
-        if (jsfValidationContext == null)
-        {
-            return;
-        }
-
-        validateRegions(regions, jsfValidationContext, 
-                new ContainmentValidatingStrategy(jsfValidationContext));
-    }
-    
-    private void validateRegions(final IStructuredDocumentRegion[] regions, 
-                                 final JSFValidationContext context,
-                                 final ContainmentValidatingStrategy containmentValidator)
-    {
-        for (final IStructuredDocumentRegion curNode : regions)
-        {
-            if (curNode.getFirstRegion().getType() == DOMRegionContext.XML_TAG_OPEN)
-            {
-                validateTag(curNode, context, containmentValidator);
-            }
-        }
-    }
-
-    private JSFValidationContext createValidationContext(
-            final boolean isIncremental, final IFile file,
-            final IValidationReporter reporter)
-    {
-        final ValidationPreferences prefs = new ValidationPreferences(
-                JSFCorePlugin.getDefault().getPreferenceStore());
-        prefs.load();
-        final DiagnosticFactory diagnosticFactory = new DiagnosticFactory();
-
-        final IDTViewHandler viewHandler = DTAppManagerUtil.getViewHandler(file
-                .getProject());
-
-        // only validate files that our designtime supports
-        if (viewHandler == null || !viewHandler.supportsViewDefinition(file))
-        {
-            return null;
-        }
-
-        return new JSFValidationContext(isIncremental, prefs, viewHandler,
-                diagnosticFactory, file, reporter, _symbolResolverFactory);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/AppConfigValidationUtil.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/AppConfigValidationUtil.java
deleted file mode 100644
index 90beacb..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/AppConfigValidationUtil.java
+++ /dev/null
@@ -1,476 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.validation.internal.appconfig;
-
-import java.io.StringReader;
-import java.util.Iterator;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.jdt.core.Flags;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.ITypeHierarchy;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jdt.core.Signature;
-import org.eclipse.jst.jsf.common.internal.types.TypeConstants;
-import org.eclipse.jst.jsf.common.util.TypeUtil;
-import org.eclipse.jst.jsf.core.JSFVersion;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.ListEntriesType;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanScopeType;
-import org.eclipse.jst.jsf.facesconfig.emf.MapEntriesType;
-import org.eclipse.jst.jsp.core.internal.java.jspel.JSPELParser;
-import org.eclipse.jst.jsp.core.internal.java.jspel.ParseException;
-import org.eclipse.wst.validation.internal.provisional.core.IMessage;
-import org.eclipse.wst.xml.core.internal.emf2xml.EMF2DOMSSEAdapter;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-import org.w3c.dom.Node;
-
-/**
- * Common functions for app config validation
- * 
- * @author cbateman
- *
- */
-public final class AppConfigValidationUtil 
-{
-    /**
-     * Per the fully-qualified-classType in the Faces 1.2 schema and
-     * the ClassName entity in the 1.1 DTD
-     * 
-     * @param fullyQualifiedName
-     * @param instanceOf 
-     * @param mustBeAClass 
-     * @param project 
-     * @return null if no problems or a Message if problem found
-     */
-    public static IMessage validateClassName(final String fullyQualifiedName, 
-                                             final String instanceOf,
-                                             final boolean mustBeAClass,
-                                             final IProject project)
-    {
-        try
-        {
-            IType type = getType(project, fullyQualifiedName);
-            if (type == null || !type.exists())
-            {
-                return DiagnosticFactory
-                        .create_CANNOT_FIND_CLASS_NAME(fullyQualifiedName);
-            }
-            
-            // must be a class, not an interface or enum
-            if (mustBeAClass && !type.isClass())
-            {
-                return DiagnosticFactory
-                        .create_FULLY_QUALIFIED_NAME_MUST_BE_A_CLASS
-                            (fullyQualifiedName);
-            }
-            
-            // must not be abstract since it must instantiable
-            if (Flags.isAbstract(type.getFlags()))
-            {
-                return DiagnosticFactory
-                        .create_CLASS_MUST_BE_CONCRETE(fullyQualifiedName);
-            }
-
-            if (instanceOf != null)
-            {
-                if (!isInstanceOf(type, instanceOf))
-                {
-                    // if we get to here, we haven't found the expected
-                    // the super type so error
-                    return DiagnosticFactory.create_CLASS_MUST_BE_INSTANCE_OF
-                        (fullyQualifiedName, Messages.AppConfigValidationUtil_0, instanceOf);
-                }
-            }
-        }
-        catch(JavaModelException jme)
-        {
-            // fall-through, not found
-            JSFCorePlugin.log(jme, 
-                "Error resolving fully qualified class name: "+fullyQualifiedName); //$NON-NLS-1$
-        }
-
-        // either found the class or had an exception so don't report error
-        return null;
-    }
-    
-    private static IType getType(final IProject project,
-                        final String fullyQualifiedName) throws JavaModelException
-    {
-        final IJavaProject javaProject = JavaCore.create(project);
-        return javaProject.findType(fullyQualifiedName);
-    }
-    
-    /**
-     * Per the faces-config-el-expressionType in the Faces 1.2 schema and
-     * the Action entity in the 1.1 DTD
-     * 
-     * @param textContent
-     * @return an validation diagnostic or null if the textContent
-     * represent an expected EL expression
-     */
-    public static IMessage validateELExpression(final String textContent)
-    {
-        final ELResultWrapper result = extractELExpression(textContent);
-        
-        if (result.elText != null)
-        {
-             JSPELParser parser = new JSPELParser(new StringReader(result.elText));
-            
-            try {
-                parser.Expression();
-            } catch (ParseException e) {
-                // syntax error
-                return DiagnosticFactory.create_SYNTAX_ERROR_IN_EL();
-            }
-            
-            return null;
-        }
-        
-        return result.message;
-    }
-
-    /**
-     * @param textContent
-     * @return the result of trying to extract an EL  expression from the
-     * textContent string.  The content is expected to be of the form
-     * #{elText}.  elText in the return value will be set to this value
-     * from within the braces.  If a syntax error occurs in this extraction
-     * message property of the result object will contain a validation message
-     * and elText will be set to null.
-     * TODO: move this somewhere more generic and shared.
-     */
-    public static ELResultWrapper extractELExpression(final String textContent)
-    {
-        final String elRegex = "#\\{(.*)\\}"; //$NON-NLS-1$
-        Pattern pattern = Pattern.compile(elRegex);
-        Matcher matcher = pattern.matcher(textContent.trim());
-        if (matcher.matches())
-        {
-           final String elText = matcher.group(1).trim();
-            
-            if ("".equals(elText) || elText == null) //$NON-NLS-1$
-            {
-                return new ELResultWrapper(DiagnosticFactory.create_SYNTAX_ERROR_IN_EL(), null);
-            }
-            return new ELResultWrapper(null, elText);
-        }
-        return new ELResultWrapper(DiagnosticFactory.create_EL_EXPR_MUST_BE_IN_HASH_BRACES(), null);
-    }
-
-    /**
-     * Value object that wraps the result of trying
-     * to extract an EL expression from an arbitrary String
-     */
-    public static class ELResultWrapper
-    {
-        private final IMessage    message;
-        private final String      elText;
-        
-        ELResultWrapper(IMessage message, String elText) {
-            super();
-            this.message = message;
-            this.elText = elText;
-        }
-
-        /**
-         * @return a message indicating a problem encountered
-         * trying to extract, or null if no problem was encountered
-         */
-        public IMessage getMessage() {
-            return message;
-        }
-
-        /**
-         * @return the el expression string raw, stripped of any
-         * sorrounding #{} syntax or null if could not be extracted
-         */
-        public String getElText() {
-            return elText;
-        }
-    }
-    
-    /**
-     * @param eObj
-     * @return the offset character offset in to the XML document of the
-     * XML node that eObj was constructed from or -1 if not 
-     * computable
-     */
-    public static int getStartOffset(EObject eObj)
-    {
-        IDOMNode node = getDomNode(eObj);
-        
-        if (node != null)
-        {
-            return node.getStartStructuredDocumentRegion().getStartOffset();
-        }
-        
-        return -1;
-    }
-
-    /**
-     * @param eObj
-     * @return the length in characters of the XML node that
-     * eObj was constructed from or -1 if no computable
-     */
-    public static int getLength(EObject eObj)
-    {
-        IDOMNode node = getDomNode(eObj);
-        
-        if (node != null)
-        {
-            return node.getEndStructuredDocumentRegion().getEndOffset()
-                      - node.getStartStructuredDocumentRegion().getStartOffset();
-        }
-        
-        return -1;
-    }
-    
-    /**
-     * @param eObj
-     * @return the DOM node that eObj was constructed from or
-     * null if not computable
-     */
-    public static IDOMNode getDomNode(EObject eObj)
-    {
-        for (Iterator it = eObj.eAdapters().iterator(); it.hasNext();)
-        {
-            Adapter adapter = (Adapter) it.next();
-            
-            if (adapter instanceof EMF2DOMSSEAdapter)
-            {
-                final EMF2DOMSSEAdapter sseAdapter = (EMF2DOMSSEAdapter) adapter;
-                final Node node = sseAdapter.getNode();
-                if (node instanceof IDOMNode)
-                {
-                    return (IDOMNode) node;
-                }
-            }
-        }
-        
-        return null;
-    }
-    
-    /**
-     * @param scope
-     * @param file
-     * @param version 
-     * @return an error message if scope does not match a valid
-     * scope enum.
-     */
-    public static IMessage validateManagedBeanScope(ManagedBeanScopeType scope, IFile file, JSFVersion version)
-    {    	
-        // scope must be one of a few enums
-        if (!"request".equals(scope.getTextContent()) //$NON-NLS-1$
-                && !"session".equals(scope.getTextContent()) //$NON-NLS-1$
-                && !"application".equals(scope.getTextContent()) //$NON-NLS-1$
-                && !"none".equals(scope.getTextContent())//$NON-NLS-1$
-                && ((version == null) || !((version.compareTo(JSFVersion.V2_0) >=0) && "view".equals(scope.getTextContent()) )))  //$NON-NLS-1$
-        {
-            return DiagnosticFactory.create_BEAN_SCOPE_NOT_VALID();
-        }
-        
-        return null;
-    }
-
-    /**
-     * @param targetName 
-     * @param targetType the type of the object that mapEntries will be assigned to
-     * @param mapEntries
-     * @param project
-     * @return null if okay or an error message if the mapEntries type is 
-     * invalid in some way
-     * Note: when Java 1.5 support is added we can validate against the template types
-     */
-    public static IMessage validateMapEntries(String targetName, String targetType, MapEntriesType mapEntries, IProject project)
-    {
-        if (mapEntries == null || targetType == null || project == null)
-        {
-            throw new AssertionError("Arguments to validateMapEntries can't be null"); //$NON-NLS-1$
-        }
-        
-        try
-        {
-            // TODO: do a bean look-up for targetName to verify that it a) matches the type
-            // and b) exists on the bean
-            IType type = getType(project, targetType);
-            
-            if (type != null &&
-                    !(isInstanceOf(type, Signature.toString(TypeConstants.TYPE_MAP))))
-            {
-                return DiagnosticFactory
-                    .create_MAP_ENTRIES_CAN_ONLY_BE_SET_ON_MAP_TYPE(targetName);
-            }
-            // TODO: validate the the map entries
-            // TODO: validate the types of the map entries against the values present
-            // TODO: validate the map key and value types against the template
-        }
-        catch (JavaModelException jme)
-        {
-            JSFCorePlugin.log(new Exception(jme), "Exception while validating mapEntries"); //$NON-NLS-1$
-        }
-        // if we get to here, we have not found anything meaningful to report
-        return null;
-    }
-    
-    /**
-     * @param targetName 
-     * @param targetType the type of the object that mapEntries will be assigned to
-     * @param listEntries
-     * @param project
-     * @return null if okay or an error message if the listEntries type is 
-     * invalid in some way
-     * Note: when Java 1.5 support is added we can validate against the template types
-     */
-    public static IMessage validateListEntries(String targetName, String targetType, ListEntriesType listEntries, IProject project)
-    {
-        if (listEntries == null || targetType == null || project == null)
-        {
-            throw new AssertionError("Arguments to validateMapEntries can't be null"); //$NON-NLS-1$
-        }
-        
-        try
-        {
-            IType type = getType(project, targetType);
-            // TODO: do a bean look-up for targetName to verify that it a) matches the type
-            // and b) exists on the bean
-            if (type != null &&
-                    !(isInstanceOf(type, Signature.toString(TypeConstants.TYPE_LIST))))
-            {
-                return DiagnosticFactory
-                    .create_LIST_ENTRIES_CAN_ONLY_BE_SET_ON_LIST_TYPE(targetName);
-            }
-            // TODO: validate the the list entries
-            // TODO: validate the types of the list entries against the values present
-            // TODO: validate the value types against the template
-        }
-        catch (JavaModelException jme)
-        {
-            JSFCorePlugin.log(new Exception(jme), "Exception while validating mapEntries"); //$NON-NLS-1$
-        }
-        // if we get to here, we have not found anything meaningful to report
-        return null;
-    }
-    
-    /**
-     * @param localeType
-     * @return a diagnostic if 'localeType' does not match the
-     * expected format or null if all is clear
-     */
-    public static IMessage validateLocaleType(final String localeType)
-    {
-        // based on the localeType in the Faces 1.2 schema.  This is safe
-        // to apply to 1.1 since it expects the same pattern even though 
-        // the DTD cannot validate it
-        final String localeTypePattern = "[a-z]{2}(_|-)?([\\p{L}\\-\\p{Nd}]{2})?"; //$NON-NLS-1$
-        final Matcher matcher = Pattern.compile(localeTypePattern).matcher(localeType);
-        
-        if (!matcher.matches())
-        {
-            return DiagnosticFactory.create_LOCALE_FORMAT_NOT_VALID();
-        }
-        
-        return null;
-    }
-    
-    /**
-     * @param type
-     * @param instanceOf
-     * @return true if type instanceof instanceOf is true
-     * 
-     * @throws JavaModelException
-     */
-    public static boolean isInstanceOf(final IType type, final String instanceOf) throws JavaModelException
-    {
-        if (instanceOf != null)
-        {
-            // must have either a no-arg constructor or an adapter constructor
-            // that is of the type of instanceOf
-//            IType  constructorParam = getType(project, instanceOf);
-//            if (constructorParam != null)
-//            {
-//                final String constructorMethodName = 
-//                    type.getElementName();
-//                final IMethod defaultConstructor = 
-//                    type.getMethod(constructorMethodName, new String[0]);
-//                final IMethod adapterConstructor =
-//                    type.getMethod(constructorMethodName, new String[]{instanceOf});
-//                final boolean isDefaultConstructor =
-//                    defaultConstructor != null && defaultConstructor.isConstructor();
-//                final boolean isAdapterConstructor =
-//                    adapterConstructor != null && adapterConstructor.isConstructor();
-//                if (!isDefaultConstructor && !isAdapterConstructor)
-//                {
-                    // TODO: no constructor == default constructor...
-//                }
-//            }
-
-            // if the type is an exact match
-            if (instanceOf.equals(type.getFullyQualifiedName()))
-            {
-                return true;
-            }
-
-            final ITypeHierarchy typeHierarchy = 
-                type.newSupertypeHierarchy(new NullProgressMonitor());
-            
-            final IType[] supers = typeHierarchy.getAllSupertypes(type);
-            for (int i = 0; i < supers.length; i++)
-            {
-                if (instanceOf.equals(supers[i].getFullyQualifiedName()))
-                {
-                    return true;
-                }
-            }
-        }
-        return false;
-    }
-
-    /**
-     * Takes the form expected by faces-config files for fully qualified class names
-     * @param inputStr java.lang.String format.
-     * @return the fully qualified type signature for the inputStr
-     */
-    public static String getBaseType(final String inputStr)
-    {
-        String checkValue = inputStr.trim();
-        try
-        {
-            // arrays are a special case where the 
-            // [Ljava.lang.String; syntax is valid.
-            if (Signature.getArrayCount(checkValue)>0)
-            {
-                checkValue = Signature.getElementType(checkValue);
-                checkValue = TypeUtil.getFullyQualifiedName(checkValue);
-            }
-        }
-        catch (final IllegalArgumentException e)
-        {
-            // ignore
-        }
-
-        return checkValue;
-    }
-
-    private AppConfigValidationUtil()
-    {
-        // no external construction
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/AppConfigValidator.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/AppConfigValidator.java
deleted file mode 100644
index ed025e3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/AppConfigValidator.java
+++ /dev/null
@@ -1,428 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *
- ********************************************************************************/
-package org.eclipse.jst.jsf.validation.internal.appconfig;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.ISchedulingRule;
-import org.eclipse.jst.jsf.core.IJSFCoreConstants;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.core.jsfappconfig.JSFAppConfigUtils;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType;
-import org.eclipse.jst.jsf.facesconfig.util.FacesConfigArtifactEdit;
-import org.eclipse.jst.jsp.core.internal.Logger;
-import org.eclipse.wst.common.project.facet.core.IFacetedProject;
-import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
-import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
-import org.eclipse.wst.sse.core.StructuredModelManager;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.eclipse.wst.validation.AbstractValidator;
-import org.eclipse.wst.validation.ValidationResult;
-import org.eclipse.wst.validation.ValidationState;
-import org.eclipse.wst.validation.internal.core.Message;
-import org.eclipse.wst.validation.internal.core.ValidationException;
-import org.eclipse.wst.validation.internal.provisional.core.IMessage;
-import org.eclipse.wst.validation.internal.provisional.core.IReporter;
-import org.eclipse.wst.validation.internal.provisional.core.IValidationContext;
-import org.eclipse.wst.validation.internal.provisional.core.IValidator;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.w3c.dom.DocumentType;
-import org.w3c.dom.NamedNodeMap;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-/**
- * General build-time validator for the JSF application configuration file  (faces-config.xml)b
- *
- * @author cbateman
- *
- */
-public class AppConfigValidator extends AbstractValidator implements IValidator {
-
-    @Override
-	public ValidationResult validate(final IResource resource, final int kind,
-			final ValidationState state, final IProgressMonitor monitor) {
-		final ValidationResult vr = new ValidationResult();
-		if (resource == null || !(resource instanceof IFile)) {
-			return vr;
-		}
-		final IReporter reporter = vr.getReporter(monitor);
-		validateFile((IFile) resource, reporter);
-		return vr;
-	}
-
-	/**
-	 * @param helper
-	 * @return the scheduling rull for this validator
-	 */
-	public ISchedulingRule getSchedulingRule(final IValidationContext helper) {
-        // no scheduling rule
-        return null;
-    }
-
-    /**
-     * @param helper
-     * @param reporter
-     * @return the result of running validation
-     * @throws ValidationException
-     */
-    public IStatus validateInJob(final IValidationContext helper, final IReporter reporter)
-            throws ValidationException {
-        IStatus status = Status.OK_STATUS;
-        try {
-            validate(helper, reporter);
-        }
-        catch (final ValidationException e) {
-            Logger.logException(e);
-            status = new Status(IStatus.ERROR, JSFCorePlugin.getDefault().getPluginID(), IStatus.ERROR, e.getLocalizedMessage(), e);
-        }
-        return status;
-    }
-
-    public void cleanup(final IReporter reporter) {
-        // no cleanup
-
-    }
-
-    public void validate(final IValidationContext helper, final IReporter reporter)
-            throws ValidationException
-    {
-        final String[] uris = helper.getURIs();
-        final IWorkspaceRoot wsRoot = ResourcesPlugin.getWorkspace().getRoot();
-        if (uris.length > 0) {
-            IFile currentFile = null;
-
-            for (int i = 0; i < uris.length && !reporter.isCancelled(); i++) {
-                currentFile = wsRoot.getFile(new Path(uris[i]));
-                if (currentFile != null && currentFile.exists()) {
-//                    if (shouldValidate(currentFile) && fragmentCheck(currentFile)) {
-
-//                        int percent = (i * 100) / uris.length + 1;
-//Message message = new LocalizedMessage(IMessage.LOW_SEVERITY, percent + "% " + uris[i]);
-  //                      reporter.displaySubtask(this, message);
-
-                        validateFile(currentFile, reporter);
-                }
-            }
-        }
-
-        // copied from JSPValidator TODO: perhaps just use app config locator?
-//        else {
-//
-//            // if uris[] length 0 -> validate() gets called for each project
-//            if (helper instanceof IWorkbenchContext) {
-//
-//                IProject project = ((IWorkbenchContext) helper).getProject();
-//                JSPFileVisitor visitor = new JSPFileVisitor(reporter);
-//                try {
-//                    // collect all jsp files for the project
-//                    project.accept(visitor, IResource.DEPTH_INFINITE);
-//                }
-//                catch (CoreException e) {
-//                    if (DEBUG)
-//                        e.printStackTrace();
-//                }
-//                IFile[] files = visitor.getFiles();
-//                for (int i = 0; i < files.length && !reporter.isCancelled(); i++) {
-//                    if (shouldValidate(files[i]) && fragmentCheck(files[i])) {
-//                        int percent = (i * 100) / files.length + 1;
-//                        Message message = new LocalizedMessage(IMessage.LOW_SEVERITY, percent + "% " + files[i].getFullPath().toString());
-//                        reporter.displaySubtask(this, message);
-//
-//                        validateFile(files[i], reporter);
-//                    }
-//                    if (DEBUG)
-//                        System.out.println("validating: [" + files[i] + "]"); //$NON-NLS-1$ //$NON-NLS-2$
-//                }
-//            }
-//        }
-    }
-
-    private void validateFile(final IFile file, final IReporter reporter)
-    {
-        FacesConfigArtifactEdit facesConfigEdit = null;
-        //Bug 290962 - NPE if faces-config.xml is in wrong folder
-        final IPath path = JSFAppConfigUtils.getWebContentFolderRelativePath(file);
-        if (path == null)
-        {
-        	reporter.addMessage(this, new Message(JSFCorePlugin.getDefault().getBundle().getSymbolicName(), IMessage.NORMAL_SEVERITY, Messages.CONFIG_FILE_NOT_UNDER_WEBCONTENT_FOLDER));
-        }
-        else
-        {
-	        try
-	        {
-	            facesConfigEdit = FacesConfigArtifactEdit.
-	                getFacesConfigArtifactEditForRead(file.getProject(), path.toString());
-	
-	            if (facesConfigEdit != null
-	                    && facesConfigEdit.getFacesConfig()!=null)
-	            {
-	                final String version = validateVersioning(file, facesConfigEdit, reporter);
-	                validateModel(file, facesConfigEdit,reporter, version);
-	            }
-	        }
-	        finally
-	        {
-	            if (facesConfigEdit != null)
-	            {
-	                facesConfigEdit.dispose();
-	            }
-	        }
-        }
-    }
-
-    /**
-     * Ensure that the expected project version (facet) jives with what is in
-     * the faces-config.  Generally this means:
-     *
-     * if (version == 1.1) then no 1.2 artifacts (error)
-     * if (version == 1.2) then warn if using old artifacts (warning)
-     */
-    private String validateVersioning(final IFile file, final FacesConfigArtifactEdit facesConfigEdit, final IReporter reporter)
-    {
-        final String appConfigFileVersion = getAppConfigFileVersion(facesConfigEdit);
-
-        if (appConfigFileVersion != null)
-        {
-            final String projectVersion = getJSFVersion(file.getProject());
-
-            if (IJSFCoreConstants.FACET_VERSION_1_1.equals(projectVersion)
-                    || IJSFCoreConstants.FACET_VERSION_1_0.equals(projectVersion))
-            {
-                if (IJSFCoreConstants.FACET_VERSION_1_2.equals(appConfigFileVersion))
-                {
-                    reporter.addMessage(this,
-                        DiagnosticFactory
-                            .create_APP_CONFIG_IS_NEWER_THAN_JSF_VERSION(file));
-                }
-            }
-            else if (IJSFCoreConstants.FACET_VERSION_1_2.equals(projectVersion))
-            {
-                if (IJSFCoreConstants.FACET_VERSION_1_1.equals(appConfigFileVersion)
-                        || IJSFCoreConstants.FACET_VERSION_1_0.equals(appConfigFileVersion))
-                {
-                    reporter.addMessage(this,
-                        DiagnosticFactory
-                            .create_APP_CONFIG_IS_OLDER_THAN_JSF_VERSION(file
-                                    , appConfigFileVersion, projectVersion));
-                }
-            }
-            // if no exact match, don't make any assumptions
-        }
-        return appConfigFileVersion;
-    }
-
-    /**
-     * @param facesConfigEdit
-     * @return the version of the app config file or null if not determinant
-     */
-    private String getAppConfigFileVersion(final FacesConfigArtifactEdit facesConfigEdit)
-    {
-        String appConfigVersion = null;
-
-        final IDOMModel domModel = facesConfigEdit.getIDOMModel();
-        final IDOMDocument document = domModel.getDocument();
-        if (document == null) {return null;}
-
-        final DocumentType docType = domModel.getDocument().getDoctype();
-
-        // if we have DTD doctype then we're looking at 1.1 or before
-        if (docType != null)
-        {
-            appConfigVersion = extractVersionFromPublicId(docType);
-            // if not found in the public id, try the system id
-            if (appConfigVersion == null)
-            {
-                appConfigVersion = extractVersionFromSystemId(docType);
-            }
-        }
-        else
-        {
-            final NodeList rootNodes = domModel.getDocument().getChildNodes();
-
-            for (int i = 0; i < rootNodes.getLength(); i++)
-            {
-                final Node node = rootNodes.item(i);
-                if (node.getNodeType() == Node.ELEMENT_NODE
-                        && "faces-config".equals(node.getLocalName())) //$NON-NLS-1$
-                {
-                    final NamedNodeMap map = node.getAttributes();
-                    // the most accurate thing is the version
-                    final Node versionAttrib = map.getNamedItem("version"); //$NON-NLS-1$
-
-                    if (versionAttrib != null)
-                    {
-                        appConfigVersion = versionAttrib.getNodeValue();
-                        break;
-                    }
-
-                    // TODO: add additional heuristic to parse out
-                    // the schema
-                }
-            }
-        }
-
-        return appConfigVersion;
-    }
-
-
-
-    private void validateModel(final IFile file,
-                               final FacesConfigArtifactEdit facesConfigEdit,
-                               final IReporter reporter,
-                               final String version)
-    {
-        final FacesConfigType facesConfigType = facesConfigEdit.getFacesConfig();
-        final FacesConfigValidator validator = new FacesConfigValidator(version);
-        final List messages = new ArrayList();
-        validator.validate(facesConfigType, messages, file);
-
-        if (messages.size() > 0) {
-        	IStructuredModel model = null;
-            try
-            {
-                model = StructuredModelManager.getModelManager().getModelForRead(
-                        file);
-                reportProblems(reporter, messages, model);
-            } catch (IOException e) {
-            	JSFCorePlugin.log("Error reporting FacesConfig validation problems", e); //$NON-NLS-1$
-    		} catch (CoreException e) {
-    			JSFCorePlugin.log("Error reporting FacesConfig validation problems", e); //$NON-NLS-1$
-    		} finally {
-            	if (model != null) {
-            		model.releaseFromRead();
-            	}
-            }
-        }
-    }
-
-    //sets line number and reports message
-    private void reportProblems(final IReporter reporter, final List messages, final IStructuredModel model) {
-        for (final Iterator it = messages.iterator(); it.hasNext();)
-        {
-            final IMessage message = (IMessage) it.next();
-            if (model != null) {
-	            final int line = model.getStructuredDocument().getLineOfOffset(message.getOffset());
-				if (line >= 0)
-					message.setLineNo(line + 1);
-            }
-            reporter.addMessage(this, message);
-        }
-    }
-
-
-	/**
-     * @param project
-     * @return the version string for the JSF facet on project
-     * or null if not found
-     */
-    private String getJSFVersion(final IProject project)
-    {
-        try
-        {
-            final IFacetedProject facetedProject = ProjectFacetsManager.create(project);
-            final Set facets = facetedProject.getProjectFacets();
-
-            for (final Iterator it = facets.iterator(); it.hasNext();)
-            {
-                final IProjectFacetVersion  facetVersion =
-                    (IProjectFacetVersion) it.next();
-
-                if (IJSFCoreConstants.JSF_CORE_FACET_ID.equals(facetVersion.getProjectFacet().getId()))
-                {
-                    return facetVersion.getVersionString();
-                }
-            }
-        }
-        catch (final CoreException ce)
-        {
-            JSFCorePlugin.log(ce, "Problem loading faceted project"); //$NON-NLS-1$
-            // fall-through and return null
-        }
-        return null;
-    }
-
-    private String extractVersionFromPublicId(final DocumentType docType)
-    {
-        final String publicId = docType.getPublicId();
-        final String publicIdRegex = "-\\/\\/(.*)\\/\\/(.*)\\/\\/.*"; //$NON-NLS-1$
-
-        if (publicId != null)
-        {
-            final Pattern pattern = Pattern.compile(publicIdRegex);
-            final Matcher matcher = pattern.matcher(publicId);
-
-            if (matcher.matches())
-            {
-                final String classTypeString = matcher.group(2);
-                final String[] classTypes = classTypeString.split("\\s+"); //$NON-NLS-1$
-                
-                // verify that the class type is a DTD
-                if (classTypes.length > 0
-                        && "DTD".equals(classTypes[0])) //$NON-NLS-1$
-                {
-                    // either 1.0 or 1.1; be most conservative
-                    String appConfigVersion = IJSFCoreConstants.JSF_VERSION_1_0;
-
-                    // see if the version is in the public id
-                    if (IJSFCoreConstants.JSF_VERSION_1_1.equals(classTypes[classTypes.length-1]))
-                    {
-                        appConfigVersion = IJSFCoreConstants.FACET_VERSION_1_1;
-                    }
-
-                    return appConfigVersion;
-                }
-            }
-        }
-
-        return null;
-    }
-
-    private String extractVersionFromSystemId(final DocumentType docType)
-    {
-        final String systemId = docType.getSystemId();
-        final String systemIdRegEx = "http:\\/\\/java.sun.com\\/dtd\\/web-facesconfig_(.*)\\.dtd"; //$NON-NLS-1$
-        if (systemId != null)
-        {
-            final Pattern pattern = Pattern.compile(systemIdRegEx);
-            final Matcher matcher = pattern.matcher(systemId);
-
-            if (matcher.matches())
-            {
-                final String version = matcher.group(1);
-                if ("1_1".equals(version)||"1_0".equals(version)) //$NON-NLS-1$ //$NON-NLS-2$
-                {
-                    return version.replaceAll("_", "."); //$NON-NLS-1$ //$NON-NLS-2$
-                }
-            }
-        }
-        return null;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/ApplicationValidationVisitor.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/ApplicationValidationVisitor.java
deleted file mode 100644
index e38d92f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/ApplicationValidationVisitor.java
+++ /dev/null
@@ -1,398 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.validation.internal.appconfig;
-
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.core.IJSFCoreConstants;
-import org.eclipse.jst.jsf.facesconfig.emf.DefaultLocaleType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType;
-import org.eclipse.jst.jsf.facesconfig.emf.LocaleConfigType;
-import org.eclipse.jst.jsf.facesconfig.emf.SupportedLocaleType;
-
-/**
- * Validator the <application> node of the app config model
- * @author cbateman
- *
- */
-public class ApplicationValidationVisitor extends EObjectValidationVisitor 
-{
-
-    /**
-     * Default constructure
-     * @param version 
-     */
-    public ApplicationValidationVisitor(String version) 
-    {
-        super(FacesConfigPackage.eINSTANCE.getFacesConfigType_Application(), version);
-    }
-
-    protected void doValidate(EObject object, List messages, IFile file) {
-        // nothing to validate
-    }
-
-    protected EObjectValidationVisitor[] getChildNodeValidators() {
-        return new EObjectValidationVisitor[]
-        {
-            // TODO: validate message and resource bundles
-            // TODO: validate default render kit id
-            new ActionListenerValidationVisitor(getVersion()),
-            new NavigationHandlerValidationVisitor(getVersion()),
-            new ViewHandlerValidationVisitor(getVersion()),
-            new StateManagerValidationVisitior(getVersion()),
-            new PropertyResolverValidationVisitor(getVersion()),
-            new VariableResolverValidationVisitor(getVersion()),
-            new ELResolverValidationVisitor(getVersion()),
-            new LocaleConfigValidationVisitor(getVersion()),
-//            new PartialTraversalValidationVisitor(getVersion()),
-            new ResourceHandlerValidationVisitor(getVersion()),
-            new SystemEventListenerTypeValidationVisitor(getVersion()),
-            new DefaultValidatorsValidationVisitor(getVersion())
-        };
-    }
-    
-    /**
-     * @param facesConfig
-     * @param messages
-     * @param file
-     */
-    protected void validateManagedBeanNames(FacesConfigType facesConfig, List messages, IFile file)
-    {
-//        final Map  foundBeans = new HashMap();
-//        final List firstCollisionInstance = new ArrayList();
-//        
-//        for (final Iterator it = facesConfig.getManagedBean().iterator(); it.hasNext();)
-//        {
-//            final ManagedBeanType managedBean = (ManagedBeanType) it.next();
-//            
-//            if (managedBean.getManagedBeanName() == null
-//                    || managedBean.getManagedBeanName().getTextContent() == null
-//                    || "".equals(managedBean.getManagedBeanName().getTextContent()))
-//            {
-//                
-//            }
-            
-//            if (!foundBeans.containsKey(managedBean.getManagedBeanName()))
-//        }
-    }
-    
-    private static class LocaleConfigValidationVisitor extends EObjectValidationVisitor
-    {
-        /**
-         * @param version
-         */
-        public LocaleConfigValidationVisitor(String version)
-        {
-            super(FacesConfigPackage.eINSTANCE.getApplicationType_LocaleConfig()
-                    , version);
-        }
-
-        protected void doValidate(EObject object, List messages, IFile file) 
-        {
-            final LocaleConfigType localeConfig = (LocaleConfigType) object;
-
-            DefaultLocaleType defaultLocale = localeConfig.getDefaultLocale();
-
-            if (defaultLocale != null)
-            {
-                addMessageInfo(
-                    messages,
-                    AppConfigValidationUtil
-                        .validateLocaleType(defaultLocale.getTextContent())
-                        , defaultLocale, file);
-            }
-            
-            for (final Iterator it = localeConfig.getSupportedLocale().iterator(); it.hasNext();)
-            {
-                final SupportedLocaleType supportedLocale =
-                    (SupportedLocaleType) it.next();
-                addMessageInfo(
-                    messages,
-                    AppConfigValidationUtil
-                        .validateLocaleType(supportedLocale.getTextContent())
-                        , supportedLocale, file);
-            }
-            
-        }
-
-        protected EObjectValidationVisitor[] getChildNodeValidators() {
-            // there are children, but we're going to validate in doValidate
-            return NO_CHILDREN;
-        }
-        
-    }
-    
-    private static class ActionListenerValidationVisitor extends ApplicationClassNameBasedValidationVisitor
-    {
-        /**
-         * @param version 
-         */
-        public ActionListenerValidationVisitor(final String version) {
-            super(FacesConfigPackage.eINSTANCE.getApplicationType_ActionListener(),
-                    version,"javax.faces.event.ActionListener", true); //$NON-NLS-1$
-        }
-    }
-    
-    private static class NavigationHandlerValidationVisitor extends ApplicationClassNameBasedValidationVisitor
-    {
-        /**
-         * @param version 
-         */
-        public NavigationHandlerValidationVisitor(final String version) {
-            super(FacesConfigPackage.eINSTANCE.getApplicationType_NavigationHandler(),
-                    version,"javax.faces.application.NavigationHandler", true); //$NON-NLS-1$
-        }
-    }
-    
-    private static class ViewHandlerValidationVisitor extends ApplicationClassNameBasedValidationVisitor
-    {
-        ViewHandlerValidationVisitor(final String version)
-        {
-            super(FacesConfigPackage.eINSTANCE.getApplicationType_ViewHandler(),
-                    version,"javax.faces.application.ViewHandler", true); //$NON-NLS-1$
-        }
-    }
-    
-    private static class StateManagerValidationVisitior extends ApplicationClassNameBasedValidationVisitor
-    {
-        StateManagerValidationVisitior(final String version)
-        {
-            // must a concrete class with a zero arg constructor:
-            //   JSF1.1_3.2.3.2 and JSF1.2_3.2.4.2
-            super(FacesConfigPackage.eINSTANCE.getApplicationType_StateManager(),
-                    version,"javax.faces.application.StateManager", true); //$NON-NLS-1$
-        }    
-    }
-    
-    private static class PropertyResolverValidationVisitor extends ApplicationClassNameBasedValidationVisitor
-    {
-        PropertyResolverValidationVisitor(final String version)
-        {
-            super(FacesConfigPackage.eINSTANCE.getApplicationType_PropertyResolver(),
-                    version,"javax.faces.el.PropertyResolver", true); //$NON-NLS-1$
-        }
-
-        protected void doValidate(EObject object, List messages, IFile file) {
-            super.doValidate(object, messages, file);
-            
-            // if this version greater than 1.1 then property resolvers are
-            // deprecated in favour of el-resolvers
-            final String version = getVersion();
-            if (!IJSFCoreConstants.FACET_VERSION_1_0.equals(version) && !IJSFCoreConstants.FACET_VERSION_1_1.equals(version))
-            {
-                addMessageInfo(messages, 
-                        DiagnosticFactory.create_API_DEPRECATED_AFTER_VERSION_ID
-                            ("property-resolver", IJSFCoreConstants.FACET_VERSION_1_1, "el-resolver") //$NON-NLS-1$ //$NON-NLS-2$
-                        , object, file);
-            }
-        }
-    }
-
-    private static class VariableResolverValidationVisitor extends ApplicationClassNameBasedValidationVisitor
-    {
-        VariableResolverValidationVisitor(final String version)
-        {
-            super(FacesConfigPackage.eINSTANCE.getApplicationType_VariableResolver(),
-                    version, "javax.faces.el.VariableResolver", true); //$NON-NLS-1$
-        }
-
-        protected void doValidate(EObject object, List messages, IFile file) {
-            super.doValidate(object, messages, file);
-            // if this version greater than 1.1 then property resolvers are
-            // deprecated in favour of el-resolvers
-            final String version = getVersion();
-            if (!IJSFCoreConstants.JSF_VERSION_1_0.equals(version) && !IJSFCoreConstants.JSF_VERSION_1_1.equals(version))
-            {
-                addMessageInfo(messages, 
-                        DiagnosticFactory.create_API_DEPRECATED_AFTER_VERSION_ID
-                            ("variable-resolver", IJSFCoreConstants.JSF_VERSION_1_1, "el-resolver") //$NON-NLS-1$ //$NON-NLS-2$
-                        , object, file);
-            }
-
-        }
-    }
-
-    private static class ELResolverValidationVisitor extends ApplicationClassNameBasedValidationVisitor
-    {
-        ELResolverValidationVisitor(final String version)
-        {
-            // must be a class and have zero-arg constructor
-            //   JSF1.2_5.6.1.4
-            super(FacesConfigPackage.eINSTANCE.getApplicationType_ELResolver(),
-               version, "javax.el.ELResolver", true); //$NON-NLS-1$
-        }
-
-        protected void doValidate(EObject object, List messages, IFile file) {
-            // if this version less than 1.2 then property resolvers are
-            // deprecated in favour of el-resolvers
-            final String version = getVersion();
-            if (IJSFCoreConstants.JSF_VERSION_1_0.equals(version) || IJSFCoreConstants.JSF_VERSION_1_1.equals(version))
-            {
-                addMessageInfo(messages, 
-                        DiagnosticFactory.create_API_NOT_AVAILABLE_BEFORE_VERSION
-                            ("el-resolver", IJSFCoreConstants.JSF_VERSION_1_2, "variable-resolver or property-resolver") //$NON-NLS-1$ //$NON-NLS-2$
-                        , object, file);
-            }
-            else
-            {
-                super.doValidate(object, messages, file);
-            }
-        }
-    }
-    
-    private abstract static class ApplicationClassNameBasedValidationVisitor extends ClassNameEObjectValidationVisitor
-    {
-        private final String _instanceOf;
-        private final boolean _mustBeClass;
-        
-        /**
-         * @param feature 
-         * @param version 
-         * @param instanceOf 
-         * @param mustBeClass 
-         */
-        protected ApplicationClassNameBasedValidationVisitor(EStructuralFeature feature,
-                final String version, final String instanceOf, final boolean mustBeClass) 
-        {
-            super(feature, version);
-            _instanceOf = instanceOf;
-            _mustBeClass = mustBeClass;
-        }
-
-        protected String getFullyQualifiedName(EObject eobj) 
-        {
-            EStructuralFeature feature = eobj.eClass().getEStructuralFeature("textContent"); //$NON-NLS-1$
-            
-            if (feature != null)
-            {
-                return (String)eobj.eGet(feature);
-            }
-            
-            return null;
-        }
-
-        @Override
-        protected boolean mustBeClass() {
-            return _mustBeClass;
-        }
-
-        protected EObjectValidationVisitor[] getChildNodeValidators() {
-            // no children
-            return NO_CHILDREN;
-        }
-
-        protected String getInstanceOf() {
-            return _instanceOf;
-        }
-    }
-    
-//    private static class PartialTraversalValidationVisitor extends ApplicationClassNameBasedValidationVisitor
-//    {
-//    	PartialTraversalValidationVisitor(final String version)
-//        {
-//            super(FacesConfigPackage.eINSTANCE.getApplicationType_PartialTraversal(),
-//                    version,"javax.faces.application.PartialTraversal", true); //$NON-NLS-1$
-//        }
-//    }
-    
-  private static class ResourceHandlerValidationVisitor extends ApplicationClassNameBasedValidationVisitor
-  {
-	  ResourceHandlerValidationVisitor(final String version)
-      {
-          super(FacesConfigPackage.eINSTANCE.getApplicationType_ResourceHandler(),
-                  version,"javax.faces.application.ResourceHandler", true); //$NON-NLS-1$
-      }
-  }
-    
-//  private static class PartialTraversalValidationVisitor extends ApplicationClassNameBasedValidationVisitor
-//  {
-//  	PartialTraversalValidationVisitor(final String version)
-//      {
-//          super(FacesConfigPackage.eINSTANCE.getApplicationType_PartialTraversal(),
-//                  version,"javax.faces.application.PartialTraversal", true); //$NON-NLS-1$
-//      }
-//  }
-    
-  private static class SystemEventListenerTypeValidationVisitor extends EObjectValidationVisitor
-  {
-	  SystemEventListenerTypeValidationVisitor(final String version)
-      {
-          super(FacesConfigPackage.eINSTANCE.getApplicationType_SystemEventListener(),
-                  version);
-      }
-
-	@Override
-	protected void doValidate(final EObject eObject, final List messages, final IFile file) {
-		//validation takes place with childNodeValidators
-	}
-
-	@Override
-	protected EObjectValidationVisitor[] getChildNodeValidators() {		 
-        return new EObjectValidationVisitor[]{
-    		new SystemEventListenerValidationVisitor(getVersion()),
-    		new SystemEventListenerClassValidationVisitor(getVersion()),
-    		new SystemEventListenerSourceClassValidationVisitor(getVersion())
-        };
-	}
-  }
-  private static class DefaultValidatorsValidationVisitor extends EObjectValidationVisitor
-  {
-	  DefaultValidatorsValidationVisitor(final String version)
-      {
-          super(FacesConfigPackage.eINSTANCE.getApplicationType_DefaultValidators(),
-                  version);
-      }
-
-	@Override
-	protected void doValidate(final EObject eObject, final List messages, final IFile file) {
-		//do nothing here... we should validate the ValidateIDType below 		
-	}
-
-	@Override
-	protected EObjectValidationVisitor[] getChildNodeValidators() {
-        //TODO - validate the ValidateIDTypes
-		return NO_CHILDREN;
-	}
-  }
-  
-  private static class SystemEventListenerValidationVisitor extends ApplicationClassNameBasedValidationVisitor {
-
-	  SystemEventListenerValidationVisitor(final String version)
-      {
-          super(FacesConfigPackage.eINSTANCE.getSystemEventListenerType_SystemEventListenerClass(),
-                  version,"javax.faces.event.SystemEventListener", true); //$NON-NLS-1$
-      }	  
-  }
-  
-  private static class SystemEventListenerClassValidationVisitor extends ApplicationClassNameBasedValidationVisitor {
-
-	  SystemEventListenerClassValidationVisitor(final String version)
-      {
-          super(FacesConfigPackage.eINSTANCE.getSystemEventListenerType_SystemEventClass(),
-                  version,"javax.faces.event.SystemEvent", true); //$NON-NLS-1$
-      }	  
-  }
-  
-  private static class SystemEventListenerSourceClassValidationVisitor extends ApplicationClassNameBasedValidationVisitor {
-
-	  SystemEventListenerSourceClassValidationVisitor(final String version)
-      {
-          super(FacesConfigPackage.eINSTANCE.getSystemEventListenerType_SourceClass(),
-                  version,"java.lang.Object", true); //$NON-NLS-1$
-      }	  
-  }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/AttributeValidationVisitor.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/AttributeValidationVisitor.java
deleted file mode 100644
index 2ddd7e8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/AttributeValidationVisitor.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.validation.internal.appconfig;
-
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.AttributeClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * Validates the <attribute> element of components, converters etc.
- * 
- * @author cbateman
- *
- */
-public class AttributeValidationVisitor extends EObjectValidationVisitor {
-
-    /**
-     * @param feature
-     * @param version
-     */
-    public AttributeValidationVisitor(EStructuralFeature feature, String version) {
-        // this validator can be attached to numerous parents so it
-        // cannot hard-code its feature
-        super(feature,version);
-    }
-
-    protected void doValidate(EObject object, List messages, IFile file) {
-        // nothing to do
-    }
-
-    protected EObjectValidationVisitor[] getChildNodeValidators() {
-        return new EObjectValidationVisitor[]
-        {
-             new AttributeClassValidationVisitor(getVersion())
-        };
-    }
-
-    private static class AttributeClassValidationVisitor extends ClassNameEObjectValidationVisitor
-    {
-        /**
-         * @param version
-         */
-        public AttributeClassValidationVisitor(
-                String version) {
-            super(FacesConfigPackage.eINSTANCE.getAttributeType_AttributeClass()
-                    , version);
-        }
-
-        protected String getFullyQualifiedName(EObject eobj) {
-            return ((AttributeClassType)eobj).getTextContent();
-        }
-
-        protected String getInstanceOf() {
-            // null since there is no instance of enforcement here
-            return null;
-        }
-
-        protected EObjectValidationVisitor[] getChildNodeValidators() {
-            return NO_CHILDREN;
-        }
-
-        @Override
-        protected boolean mustBeClass() 
-        {
-            // attribute could be a class or an enum
-            return false;
-        }
-        
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/BehaviorValidationVisitor.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/BehaviorValidationVisitor.java
deleted file mode 100644
index c7f73c5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/BehaviorValidationVisitor.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2010 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.validation.internal.appconfig;
-
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.jst.jsf.facesconfig.emf.BehaviorClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * Validates the behavior
- */
-public class BehaviorValidationVisitor extends EObjectValidationVisitor 
-{
-
-    /**
-     * @param version
-     */
-    public BehaviorValidationVisitor(String version) 
-    {
-        super(FacesConfigPackage.eINSTANCE.getFacesConfigType_Behavior()
-                ,version);
-    }
-
-    protected void doValidate(EObject object, List messages, IFile file) 
-    {
-        // nothing to do 
-    }
-
-    protected EObjectValidationVisitor[] getChildNodeValidators()
-    {
-        return new EObjectValidationVisitor[]
-        {
-            new BehaviorClassValidationVisitor(getVersion()),
-            new AttributeValidationVisitor(FacesConfigPackage.eINSTANCE.getBehaviorType_Attribute(), getVersion()),
-            new PropertyValidationVisitor
-                (FacesConfigPackage.eINSTANCE.getBehaviorType_Property()
-                ,FacesConfigPackage.eINSTANCE.getBehaviorType_BehaviorClass()
-                ,getVersion())
-        };
-    }
-
-    private static class BehaviorClassValidationVisitor extends ClassNameEObjectValidationVisitor
-    {
-        /**
-         * @param version
-         */
-        public BehaviorClassValidationVisitor(String version) 
-        {
-            super(FacesConfigPackage.eINSTANCE.getBehaviorType_BehaviorClass()
-                    , version);
-        }
-
-        protected String getFullyQualifiedName(EObject eobj) 
-        {
-            return ((BehaviorClassType)eobj).getTextContent();
-        }
-
-        protected String getInstanceOf() {
-            return "javax.faces.component.behavior.Behavior"; //$NON-NLS-1$
-        }
-
-        protected EObjectValidationVisitor[] getChildNodeValidators() {
-            return NO_CHILDREN;
-        }
-
-        @Override
-        protected boolean mustBeClass() {
-            // must be a class
-            return true;
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/ClassNameEObjectValidationVisitor.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/ClassNameEObjectValidationVisitor.java
deleted file mode 100644
index badc11e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/ClassNameEObjectValidationVisitor.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.validation.internal.appconfig;
-
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-
-/**
- * Abstract validation visitor for classname based eobjects
- * 
- * @author cbateman
- *
- */
-public abstract class ClassNameEObjectValidationVisitor extends
-        EObjectValidationVisitor 
-{
-    /**
-     * @param structuralFeature
-     * @param version 
-     */
-    public ClassNameEObjectValidationVisitor(
-            EStructuralFeature structuralFeature, String version) {
-        super(structuralFeature, version);
-    }
-
-    protected void doValidate(EObject object, List messages, IFile file) 
-    {
-        String fullyQualifiedName = getFullyQualifiedName(object);
-        // protect against null
-        fullyQualifiedName = fullyQualifiedName == null ? "" : fullyQualifiedName; //$NON-NLS-1$
-        addMessageInfo(messages,  
-            AppConfigValidationUtil
-                .validateClassName(fullyQualifiedName, getInstanceOf()
-                        , false, file.getProject()),object, file);
-    }
-
-    /**
-     * @param eobj
-     * @return the fully qualified name from the eobject
-     */
-    protected abstract String getFullyQualifiedName(EObject eobj);
-    
-    /**
-     * @return a fully-qualified 
-     */
-    protected abstract String getInstanceOf();
-    
-    /**
-     * @return true if the class being named must be a class
-     * and may not be an enum or interface
-     */
-    protected abstract boolean mustBeClass();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/ClientBehaviorRendererValidationVisitor.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/ClientBehaviorRendererValidationVisitor.java
deleted file mode 100644
index 7eb966d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/ClientBehaviorRendererValidationVisitor.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2010 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.validation.internal.appconfig;
-
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * ClientBehaviorRenderer validation
- *
- */
-public class ClientBehaviorRendererValidationVisitor extends EObjectValidationVisitor {
-
-    /**
-     * @param version
-     */
-    public ClientBehaviorRendererValidationVisitor(String version)
-    {
-        super(FacesConfigPackage.eINSTANCE.getRenderKitType_ClientBehaviorRenderer(),
-                version);
-    }
-
-    protected void doValidate(EObject object, List messages, IFile file) {
-        // nothing to do
-    }
-
-    protected EObjectValidationVisitor[] getChildNodeValidators() {
-        return new EObjectValidationVisitor[]
-        {
-            new ClientBehaviorRendererClassValidationVisitor(getVersion())
-        };
-    }
-
-    private static class ClientBehaviorRendererClassValidationVisitor extends ClassNameEObjectValidationVisitor
-    {
-        /**
-         * @param version
-         */
-        public ClientBehaviorRendererClassValidationVisitor(String version) 
-        {
-            super(FacesConfigPackage.eINSTANCE.getClientBehaviorRendererType_ClientBehaviorRendererClass()
-                    , version);
-        }
-
-        protected String getFullyQualifiedName(EObject eobj) 
-        {
-            return ((ClientBehaviorRendererClassType)eobj).getTextContent();
-        }
-
-        protected String getInstanceOf() {
-            return "javax.faces.render.ClientBehaviorRenderer"; //$NON-NLS-1$
-        }
-
-        protected EObjectValidationVisitor[] getChildNodeValidators() {
-            return NO_CHILDREN;
-        }
-
-        @Override
-        protected boolean mustBeClass() {
-            // must be a class
-            return true;
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/ComponentValidatorVisitor.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/ComponentValidatorVisitor.java
deleted file mode 100644
index 26f8d5b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/ComponentValidatorVisitor.java
+++ /dev/null
@@ -1,151 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.validation.internal.appconfig;
-
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.jst.jsf.facesconfig.emf.ComponentClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.FacetNameType;
-
-/**
- * Validator for a <component>
- * 
- * @author cbateman
- *
- */
-public class ComponentValidatorVisitor extends EObjectValidationVisitor 
-{
-    /**
-     * @param version
-     */
-    public ComponentValidatorVisitor(final String version)
-    {
-        super(FacesConfigPackage.eINSTANCE.getFacesConfigType_Component(),
-                version);
-    }
-    
-    protected void doValidate(EObject object, List messages, IFile file) {
-        // nothing in the tag to validate
-    }
-
-    protected EObjectValidationVisitor[] getChildNodeValidators() {
-        return new EObjectValidationVisitor[]
-        {
-            new ComponentClassValidationVisitor(getVersion()),
-            new AttributeValidationVisitor(FacesConfigPackage.eINSTANCE.getComponentType_Attribute(), getVersion()),
-            new PropertyValidationVisitor
-                (FacesConfigPackage.eINSTANCE.getComponentType_Property()
-                ,FacesConfigPackage.eINSTANCE.getComponentType_ComponentClass()
-                ,getVersion()),
-            new ComponentFacetValidationVisitor(getVersion())
-        };
-    }
-
-    private static class ComponentClassValidationVisitor extends ClassNameEObjectValidationVisitor
-    {
-        ComponentClassValidationVisitor(final String version)
-        {
-            super(FacesConfigPackage.eINSTANCE.getComponentType_ComponentClass(),
-                    version);
-        }
-        
-        protected String getFullyQualifiedName(EObject eobj) 
-        {
-            return ((ComponentClassType)eobj).getTextContent();
-        }
-
-        protected String getInstanceOf() {
-            return "javax.faces.component.UIComponent"; //$NON-NLS-1$
-        }
-
-        protected EObjectValidationVisitor[] getChildNodeValidators() {
-            return NO_CHILDREN;
-        }
-
-        @Override
-        protected boolean mustBeClass() {
-            // must a class
-            return true;
-        }
-    }
-    
-    private static class ComponentFacetValidationVisitor extends EObjectValidationVisitor
-    {
-        /**
-         * @param version
-         */
-        public ComponentFacetValidationVisitor(String version) 
-        {
-            super(FacesConfigPackage.eINSTANCE.getComponentType_Facet(), version);
-        }
-
-        protected void doValidate(EObject object, List messages, IFile file) {
-            // do nothing
-        }
-
-        protected EObjectValidationVisitor[] getChildNodeValidators() {
-            return new EObjectValidationVisitor[]
-            {
-                    new FacetNameValidationVisitor(getVersion())
-            };
-        }
-        
-        private static class FacetNameValidationVisitor extends EObjectValidationVisitor
-        {
-            /**
-             * @param version
-             */
-            public FacetNameValidationVisitor(String version) {
-                super(FacesConfigPackage.eINSTANCE.getFacetType_FacetName(),
-                        version);
-            }
-
-            protected void doValidate(EObject object, List messages, IFile file) {
-                FacetNameType name = (FacetNameType) object;
-                boolean   isValid = false;
-                
-                if (name.getTextContent() != null
-                        || "".equals(name.getTextContent().trim())) //$NON-NLS-1$
-                {
-                    String nameValue = name.getTextContent().trim();
-
-                    // TODO: isJavaIdentifierStart seems broken...
-                    if (Character.isJavaIdentifierStart(nameValue.charAt(0)))
-                    {
-                        isValid = true;
-                        for (int i = 1; i < nameValue.length(); i++)
-                        {
-                            if (!Character.isJavaIdentifierPart(nameValue.charAt(i)))
-                            {
-                                isValid = false;
-                            }
-                        }
-                    }
-                }
-                
-                if (!isValid)
-                {
-                    addMessageInfo(messages, 
-                            DiagnosticFactory.create_MUST_BE_A_VALID_JAVA_IDENT("Facet name") //$NON-NLS-1$
-                            , object, file);
-                }
-            }
-
-            protected EObjectValidationVisitor[] getChildNodeValidators() {
-                return NO_CHILDREN;
-            }
-            
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/ConverterValidationVisitor.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/ConverterValidationVisitor.java
deleted file mode 100644
index 2db6114..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/ConverterValidationVisitor.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.validation.internal.appconfig;
-
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.jst.jsf.facesconfig.emf.ConverterClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.ConverterForClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * Validates the converter
- */
-public class ConverterValidationVisitor extends EObjectValidationVisitor
-{
-
-    /**
-     * @param version
-     */
-    public ConverterValidationVisitor(final String version)
-    {
-        super(FacesConfigPackage.eINSTANCE.getFacesConfigType_Converter(),
-                version);
-    }
-    
-    protected void doValidate(EObject object, List messages, IFile file) {
-        // nothing in the tag to validate
-    }
-
-    protected EObjectValidationVisitor[] getChildNodeValidators() {
-        return new EObjectValidationVisitor[]
-        {
-            new ConverterClassValidationVisitor(getVersion())
-            , new AttributeValidationVisitor(FacesConfigPackage.eINSTANCE.getConverterType_Attribute(), getVersion())
-            , new PropertyValidationVisitor
-                (FacesConfigPackage.eINSTANCE.getConverterType_Property()
-                ,FacesConfigPackage.eINSTANCE.getConverterType_ConverterClass()
-                ,getVersion())
-            , new ConverterForClassValidationVisitor(getVersion())
-        };
-    }
-
-    private static class ConverterClassValidationVisitor extends ClassNameEObjectValidationVisitor
-    {
-        ConverterClassValidationVisitor(final String version)
-        {
-            super(FacesConfigPackage.eINSTANCE.getConverterType_ConverterClass(),
-                    version);
-        }
-        
-        protected String getFullyQualifiedName(EObject eobj) 
-        {
-            return ((ConverterClassType)eobj).getTextContent();
-        }
-
-        protected String getInstanceOf() {
-            return "javax.faces.convert.Converter"; //$NON-NLS-1$
-        }
-
-        protected EObjectValidationVisitor[] getChildNodeValidators() {
-            return NO_CHILDREN;
-        }
-
-        @Override
-        protected boolean mustBeClass() {
-            // can't be an enum
-            return true;
-        }
-    }
-    
-    private static class ConverterForClassValidationVisitor extends ClassNameEObjectValidationVisitor
-    {
-        ConverterForClassValidationVisitor(final String version)
-        {
-            super(FacesConfigPackage.eINSTANCE.getConverterType_ConverterForClass(),
-                    version);
-        }
-        
-        protected String getFullyQualifiedName(EObject eobj) 
-        {
-            String className = ((ConverterForClassType)eobj).getTextContent();
-            String typeName = AppConfigValidationUtil.getBaseType(className);
-            if (typeName == null)
-            {
-                return className;
-            }
-            return typeName;
-        }
-
-        protected String getInstanceOf() {
-            // no instanceof enforcement
-            return null;
-        }
-
-        protected EObjectValidationVisitor[] getChildNodeValidators() {
-            return NO_CHILDREN;
-        }
-
-        @Override
-        protected boolean mustBeClass() {
-            // could be a converter for all instances of an enum type
-            return false;
-        }
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/DiagnosticFactory.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/DiagnosticFactory.java
deleted file mode 100644
index 219bd59..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/DiagnosticFactory.java
+++ /dev/null
@@ -1,412 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.validation.internal.appconfig;
-
-import java.text.MessageFormat;
-import java.util.Locale;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.wst.validation.internal.core.Message;
-import org.eclipse.wst.validation.internal.provisional.core.IMessage;
-
-/**
- * Factory for constructing diagnostic objects for AppConfig file validation
- * 
- * @author cbateman
- *
- */
-public final class DiagnosticFactory 
-{
-    /**
-     * Problem id
-     */
-    public final static int EL_EXPR_MUST_BE_IN_HASH_BRACES_ID = 0;
-    
-    /**
-     * Problem id
-     */
-    public final static int SYNTAX_ERROR_IN_EL_ID = 1;
-    
-    /**
-     * Problem id
-     */
-    public final static int CANNOT_FIND_CLASS_NAME_ID = 2;
-    
-    /**
-     * Problem id
-     */
-    public final static int FULLY_QUALIFIED_NAME_MUST_BE_A_CLASS_ID = 3;
-    
-    /**
-     * Problem id
-     */
-    public final static int CLASS_MUST_BE_INSTANCE_OF_ID = 4;
-    
-    /**
-     * Problem id
-     */
-    public final static int CLASS_MUST_BE_CONCRETE_ID = 5;
-    
-    /**
-     * TODO:
-     */
-    public final static int CLASS_MUST_HAVE_DEFAULT_OR_ADAPTER_CONSTRUCTOR_ID = 6;
-
-    /**
-     * Problem id
-     */
-    public final static int API_DEPRECATED_AFTER_VERSION_ID = 7;
-    
-    /**
-     * Problem id
-     */
-    public final static int BEAN_PROPERTY_NOT_FOUND_ID = 8;
-    
-    /**
-     * Problem id
-     */
-    public final static int MUST_BE_A_VALID_JAVA_IDENT_ID = 9;
-    
-    /**
-     * Problem id
-     */
-    public final static int BEAN_SCOPE_NOT_VALID_ID = 10;
-    
-    /**
-     * Problem id
-     */
-    public final static int MAP_ENTRIES_CAN_ONLY_BE_SET_ON_MAP_TYPE_ID = 11;
-    
-    /**
-     * Problem id
-     */
-    public final static int LIST_ENTRIES_CAN_ONLY_BE_SET_ON_LIST_TYPE_ID = 12;
-    
-    /**
-     * Problem id
-     */
-    public final static int API_NOT_AVAILABLE_BEFORE_VERSION_ID = 13;
-    
-    /**
-     * Problem id
-     */
-    public final static int APP_CONFIG_IS_NEWER_THAN_JSF_VERSION_ID = 14;
-    /**
-     * Problem id
-     */
-    public final static int APP_CONFIG_IS_OLDER_THAN_JSF_VERSION_ID = 15;
-    
-    /**
-     * Problem id
-     */
-    public final static int LOCALE_FORMAT_NOT_VALID_ID = 16;
-    
-    /**
-     * @return message indicating text that should be EL was
-     * not found sorrounded in #{} values
-     */
-    public static IMessage create_EL_EXPR_MUST_BE_IN_HASH_BRACES()
-    {
-        return new MyLocalizedMessage(IMessage.NORMAL_SEVERITY,
-                Messages.EL_EXPR_MUST_BE_IN_HASH_BRACES_ID,
-                null, EL_EXPR_MUST_BE_IN_HASH_BRACES_ID);
-    }
-    
-    /**
-     * @return message indicating that EL was found that
-     * was empty or did not parse
-     */
-    public static IMessage create_SYNTAX_ERROR_IN_EL()
-    {
-        return new MyLocalizedMessage(IMessage.NORMAL_SEVERITY,
-                Messages.SYNTAX_ERROR_IN_EL_ID,
-                null, SYNTAX_ERROR_IN_EL_ID);
-    }
-    
-    /**
-     * @param className
-     * @return message indicating that className can't be found as 
-     * a valid fully qualified class name
-     */
-    public static IMessage create_CANNOT_FIND_CLASS_NAME(final String className)
-    {
-        return new MyLocalizedMessage(IMessage.NORMAL_SEVERITY,
-                MessageFormat.format(Messages.CANNOT_FIND_CLASS_NAME_ID,new Object[]{className}),
-                null, CANNOT_FIND_CLASS_NAME_ID);
-    }
-    
-    /**
-     * @param fullyQualifiedName
-     * @return the error message for a fullyQualifiedName that resolves to a type
-     * that is not a class (i.e. an interface or enum) but is expected to be
-     */
-    public static IMessage create_FULLY_QUALIFIED_NAME_MUST_BE_A_CLASS(final String fullyQualifiedName)
-    {
-        return new MyLocalizedMessage(IMessage.NORMAL_SEVERITY,
-                MessageFormat.format(Messages.FULLY_QUALIFIED_NAME_MUST_BE_A_CLASS_ID
-                        ,new Object[]{fullyQualifiedName})
-                        ,null, FULLY_QUALIFIED_NAME_MUST_BE_A_CLASS_ID);
-    }
-
-    /**
-     * @param className
-     * @param extensionType 
-     * @param expectedSuper
-     * @return an error when a class name must be of type expectedSuper
-     */
-    public static IMessage create_CLASS_MUST_BE_INSTANCE_OF(final String className, 
-                                                            final String extensionType,
-                                                            final String expectedSuper)
-    {
-        return new MyLocalizedMessage(IMessage.NORMAL_SEVERITY,
-                MessageFormat.format(Messages.CLASS_MUST_BE_INSTANCE_OF_ID
-                        ,new Object[]{className, extensionType, expectedSuper})
-                        ,null, CLASS_MUST_BE_INSTANCE_OF_ID);
-    }
-    
-    
-    /**
-     * @param className
-     * @return error indicating that className must specify a class
-     * that is concrete
-     */
-    public static IMessage create_CLASS_MUST_BE_CONCRETE(final String className)
-    {
-        return new MyLocalizedMessage(IMessage.NORMAL_SEVERITY,
-                MessageFormat.format(Messages.CLASS_MUST_BE_CONCRETE_ID
-                        ,new Object[]{className})
-                        ,null, CLASS_MUST_BE_CONCRETE_ID);
-    }
-    
-    /**
-     * @param apiName -- name of deprecated API
-     * @param afterVersion -- version after which deprecation is effective
-     * @param useInstead -- name of API to use instead
-     * @return an error indicating the use of a deprecated API
-     */
-    public static IMessage create_API_DEPRECATED_AFTER_VERSION_ID(final String apiName, final String afterVersion, final String useInstead)
-    {
-        return new MyLocalizedMessage(IMessage.NORMAL_SEVERITY,
-                MessageFormat.format(Messages.API_DEPRECATED_AFTER_VERSION_ID
-                        ,new Object[]{apiName, afterVersion, useInstead})
-                        ,null, API_DEPRECATED_AFTER_VERSION_ID);
-    }
-    
-    /**
-     * @param propertyName
-     * @param beanClassName
-     * @return an error indicating that the propertyName was not
-     * found on beanClassName
-     */
-    public static IMessage create_BEAN_PROPERTY_NOT_FOUND(final String propertyName, final String beanClassName)
-    {
-        return new MyLocalizedMessage(IMessage.NORMAL_SEVERITY,
-                MessageFormat.format(Messages.BEAN_PROPERTY_NOT_FOUND_ID
-                        ,new Object[]{propertyName, beanClassName})
-                        ,null, BEAN_PROPERTY_NOT_FOUND_ID);
-            
-    }
-    
-    
-    /**
-     * @param nameOfId
-     * @return an error indicating that some id must be a valid
-     * Java identifier
-     */
-    public static IMessage create_MUST_BE_A_VALID_JAVA_IDENT(final String nameOfId)
-    {
-        return new MyLocalizedMessage(IMessage.NORMAL_SEVERITY,
-            MessageFormat.format(Messages.MUST_BE_A_VALID_JAVA_IDENT_ID
-                ,new Object[]{nameOfId})
-                ,null, MUST_BE_A_VALID_JAVA_IDENT_ID);    
-    }
-    
-    /**
-     * @return an error indicating an invalid bean scope enum value
-     */
-    public static IMessage create_BEAN_SCOPE_NOT_VALID()
-    {
-        return new MyLocalizedMessage(IMessage.NORMAL_SEVERITY,
-            Messages.BEAN_SCOPE_NOT_VALID_ID
-            , null, BEAN_SCOPE_NOT_VALID_ID);    
-    }
-    
-    /**
-     * @param targetName 
-     * @return an error indicating that a map entry is being set on a target
-     * object that is not a java.util.Map
-     */
-    public static IMessage create_MAP_ENTRIES_CAN_ONLY_BE_SET_ON_MAP_TYPE(String targetName)
-    {
-        return new MyLocalizedMessage(IMessage.NORMAL_SEVERITY,
-            MessageFormat.format(Messages.MAP_ENTRIES_CAN_ONLY_BE_SET_ON_MAP_TYPE_ID,
-                                 new Object[]{targetName}),
-            null, MAP_ENTRIES_CAN_ONLY_BE_SET_ON_MAP_TYPE_ID);
-    }
-
-    /**
-     * @param targetName 
-     * @return an error indicating that a list entry is being set on a target
-     * object that is not a java.util.List
-     */
-    public static IMessage create_LIST_ENTRIES_CAN_ONLY_BE_SET_ON_LIST_TYPE(String targetName)
-    {
-        return new MyLocalizedMessage(IMessage.NORMAL_SEVERITY,
-            MessageFormat.format(Messages.LIST_ENTRIES_CAN_ONLY_BE_SET_ON_LIST_TYPE_ID,
-                                 new Object[]{targetName}),
-            null, LIST_ENTRIES_CAN_ONLY_BE_SET_ON_LIST_TYPE_ID);
-    }
-    
-    /**
-     * @param apiName
-     * @param beforeVersion
-     * @param useInstead
-     * @return a diagnostic indicating that an API is being used that is not yet
-     * available in the current JSF version.
-     */
-    public static IMessage create_API_NOT_AVAILABLE_BEFORE_VERSION(final String apiName, final String beforeVersion, final String useInstead)
-    {
-        return new MyLocalizedMessage(IMessage.NORMAL_SEVERITY,
-            MessageFormat.format(Messages.API_NOT_AVAILABLE_BEFORE_VERSION_ID
-                ,new Object[]{apiName, beforeVersion, useInstead})
-                ,null, API_NOT_AVAILABLE_BEFORE_VERSION_ID);
-    }
-    
-    /**
-     * @param file
-     * @return a diagnostic indicating that the app config model in use is too
-     * new for the selected JSF runtime version.
-     */
-    public static IMessage create_APP_CONFIG_IS_NEWER_THAN_JSF_VERSION(IFile file)
-    {
-        final IMessage message = new MyLocalizedMessage(IMessage.HIGH_SEVERITY,
-            Messages.APP_CONFIG_IS_NEWER_THAN_JSF_VERSION_ID
-                ,null, APP_CONFIG_IS_NEWER_THAN_JSF_VERSION_ID);
-        message.setTargetObject(file);
-        return message;
-    }
-    
-    /**
-     * @param file
-     * @param appConfigVersion 
-     * @param projectVersion 
-     * @return a diagnostic indicating that the app config model in use is older
-     * than the selected JSF runtime version.
-     */
-    public static IMessage create_APP_CONFIG_IS_OLDER_THAN_JSF_VERSION(IFile file, String appConfigVersion, String projectVersion)
-    {
-        final IMessage message = new MyLocalizedMessage(IMessage.NORMAL_SEVERITY,
-            MessageFormat.format(
-                Messages.APP_CONFIG_IS_OLDER_THAN_JSF_VERSION_ID,
-                    new Object[] {appConfigVersion, projectVersion})
-            ,null, APP_CONFIG_IS_OLDER_THAN_JSF_VERSION_ID);
-        message.setTargetObject(file);
-        return message;
-    }
-    
-    /**
-     * @return a diagnostic indicating that the locale format does
-     * not match what is expected
-     */
-    public static IMessage create_LOCALE_FORMAT_NOT_VALID()
-    {
-        IMessage message = new MyLocalizedMessage(IMessage.NORMAL_SEVERITY,
-                    Messages.LOCALE_FORMAT_NOT_VALID_ID
-                ,null, LOCALE_FORMAT_NOT_VALID_ID);
-        return message;
-    }
-    
-    /**
-     * Customized localizable message for app config validation
-     * @author cbateman
-     *
-     */
-    static class MyLocalizedMessage extends Message implements ILocalizedMessage
-    {
-        private final String _message;
-        private final int    _errorCode;
-
-        /**
-         * @param severity
-         * @param messageText
-         * @param targetObject
-         * @param errorCode 
-         */
-        public MyLocalizedMessage(int severity, String messageText, IResource targetObject, int errorCode) {
-            this(severity, messageText, (Object) targetObject, errorCode);
-        }
-
-        /**
-         * @param severity
-         * @param messageText
-         * @param targetObject
-         * @param errorCode 
-         */
-        private MyLocalizedMessage(int severity, String messageText, Object targetObject, int errorCode) {
-            super(JSFCorePlugin.getDefault().getBundle().getSymbolicName(), severity, 
-                    messageText);
-            _message = messageText;
-            setTargetObject(targetObject);
-            _errorCode = errorCode;
-        }
-
-        /**
-         * @return the localized message
-         */
-        public String getLocalizedMessage() {
-            return _message;
-        }
-
-        /**
-         * @see org.eclipse.wst.validation.internal.core.Message#getText()
-         */
-        public String getText() {
-            return getLocalizedMessage();
-        }
-
-        /**
-         * @see org.eclipse.wst.validation.internal.core.Message#getText(java.lang.ClassLoader)
-         */
-        public String getText(ClassLoader cl) {
-            return getLocalizedMessage();
-        }
-
-        /**
-         * @see org.eclipse.wst.validation.internal.core.Message#getText(java.util.Locale)
-         */
-        public String getText(Locale l) {
-            return getLocalizedMessage();
-        }
-
-        public String getText(Locale l, ClassLoader cl) {
-            return getLocalizedMessage();
-        }
-
-        /**
-         * @return the error code related to this message
-         */
-        public int getErrorCode() {
-            return _errorCode;
-        }
-
-
-        /**
-         * @param offset
-         * @return true if this message applies to document offset
-         */
-        public boolean appliesTo(int offset)
-        {
-            return (offset >= getOffset() && offset < getOffset()+getLength());
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/EObjectValidationVisitor.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/EObjectValidationVisitor.java
deleted file mode 100644
index 73c301e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/EObjectValidationVisitor.java
+++ /dev/null
@@ -1,173 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.validation.internal.appconfig;
-
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.core.JSFVersion;
-import org.eclipse.wst.validation.internal.provisional.core.IMessage;
-
-/**
- *  
- * @author cbateman
- */
-public abstract class EObjectValidationVisitor 
-{
-    private EStructuralFeature    _structuralFeature;
-    private Map                   _childFeatures; // == null; lazy initialized in validate
-    private final String          _version;
-    
-    /**
-     * Used to indicate no child nodes
-     */
-    protected final static EObjectValidationVisitor[] NO_CHILDREN = 
-        new EObjectValidationVisitor[0];
-    
-    /**
-     * @param version 
-     * 
-     */
-    public EObjectValidationVisitor(String version)
-    {
-        _version = version;
-    }
-
-    private EObjectValidationVisitor getVisitorForFeature(EStructuralFeature feature)
-    {
-        if (_childFeatures == null)
-        {
-            _childFeatures = new HashMap();
-
-            EObjectValidationVisitor[] children = getChildNodeValidators();
-            
-            for (int i = 0; i < children.length; i++)
-            {
-                final EObjectValidationVisitor child = children[i];
-                _childFeatures.put(child.getStructuralFeature(), child);
-            }
-        }
-
-        return (EObjectValidationVisitor) _childFeatures.get(feature);
-    }
-    
-    /**
-     * @param structuralFeature 
-     * @param version 
-     */
-    public EObjectValidationVisitor(EStructuralFeature structuralFeature, String version)
-    {
-        this(version);
-        _structuralFeature = structuralFeature;
-    }
-
-    /**
-     * @param eObject 
-     * @param messages
-     * @param file 
-     */
-    public final void validate(EObject eObject, List messages, IFile file)
-    {
-        doValidate(eObject, messages, file);
-        
-        List features = eObject.eClass().getEAllStructuralFeatures();
-        
-        for (final Iterator it = features.iterator(); it.hasNext();)
-        {
-            final EStructuralFeature feature = (EStructuralFeature) it.next();
-            final EObjectValidationVisitor visitor = 
-                getVisitorForFeature(feature);
-            
-            if (visitor != null)
-            {
-                final Object obj = eObject.eGet(feature);
-                
-                if (obj instanceof List
-                        && feature.isMany())
-                {
-                    for (final Iterator childIt = ((List)obj).iterator(); 
-                            childIt.hasNext();)
-                    {
-                        Object child = childIt.next();
-                        if (child instanceof EObject)
-                        {
-                            visitor.validate((EObject)child, messages, file);
-                        }
-                    }
-                }
-                else if (obj instanceof EObject)
-                {
-                    visitor.validate((EObject)obj , messages, file);
-                }
-            }
-        }
-    }
-
-    /**
-     * Do the validation for this visitor on this node.  Add any Message's to
-     * the messages list
-     * 
-     * @param eObject 
-     * @param messages
-     * @param file 
-     */
-    protected abstract void doValidate(EObject eObject, List messages, IFile file);
-    
-    /**
-     * @return an array of visitors that validate children of the current node
-     */
-    protected abstract EObjectValidationVisitor[] getChildNodeValidators();
-
-    /**
-     * @return the structural feature
-     */
-    protected final EStructuralFeature getStructuralFeature() 
-    {
-        return _structuralFeature;
-    }
-    
-    /**
-     * @return the version of the runtime
-     */
-    protected final String getVersion()
-    {
-        return _version;
-    }
-    
-    
-    /**
-     * @return {@link JSFVersion} of this file
-     */
-    protected JSFVersion getJSFVersion() {    	
-    	return JSFVersion.valueOfString(_version);
-    }
-    /**
-     * @param messages 
-     * @param message
-     * @param eObj
-     * @param file
-     */
-    protected static void addMessageInfo(List messages, IMessage message, EObject eObj, IFile file)
-    {
-        if (message != null)
-        {
-            message.setOffset(AppConfigValidationUtil.getStartOffset(eObj));
-            message.setLength(AppConfigValidationUtil.getLength(eObj));
-            message.setTargetObject(file);
-            messages.add(message);
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/FacesConfigValidator.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/FacesConfigValidator.java
deleted file mode 100644
index 5298eca..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/FacesConfigValidator.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.validation.internal.appconfig;
-
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.PhaseListenerType;
-
-/**
- * Top-level validator for the faces-config model
- * 
- * @author cbateman
- *
- */
-public class FacesConfigValidator extends EObjectValidationVisitor
-{
-    /**
-     * constructor
-     * @param version 
-     */
-    public FacesConfigValidator(String version) 
-    {
-        super(version);
-    }
-
-    protected EObjectValidationVisitor[] getChildNodeValidators() 
-    {
-        return new EObjectValidationVisitor[]
-        {
-            new NavigationRuleValidator(getVersion())
-            , new ApplicationValidationVisitor(getVersion())
-            , new LifecycleValidationVisitor(getVersion())
-            , new FactoryValidationVisitor(getVersion())
-            , new ComponentValidatorVisitor(getVersion())
-            , new ValidatorTypeValidationVisitor(getVersion())
-            , new ConverterValidationVisitor(getVersion())
-            , new ManagedBeanValidationVisitor(getVersion())
-            , new RenderKitValidationVisitor(getVersion())
-            , new BehaviorValidationVisitor(getVersion())
-        };
-    }
-
-    protected void doValidate(EObject object, List messages, IFile file) 
-    {
-        // nothing to do
-    }
-    
-    private static class LifecycleValidationVisitor extends EObjectValidationVisitor
-    {
-        LifecycleValidationVisitor(final String version)
-        {
-            super(FacesConfigPackage.eINSTANCE.getFacesConfigType_Lifecycle(),
-                  version);
-        }
-        
-        protected void doValidate(EObject object, List messages, IFile file) {
-            // nothing to validate except in children
-        }
-
-        protected EObjectValidationVisitor[] getChildNodeValidators() {
-            return new EObjectValidationVisitor[] {
-                 new PhaseListenerValidation(getVersion())
-            };
-        }
-        
-        private static class PhaseListenerValidation extends ClassNameEObjectValidationVisitor
-        {
-            PhaseListenerValidation(final String version)
-            {
-                super(FacesConfigPackage.eINSTANCE.getLifecycleType_PhaseListener(),
-                        version);
-            }
-            protected String getFullyQualifiedName(EObject eobj) {
-                return ((PhaseListenerType)eobj).getTextContent();
-            }
-
-            protected String getInstanceOf() {
-                return "javax.faces.event.PhaseListener"; //$NON-NLS-1$
-            }
-
-            protected EObjectValidationVisitor[] getChildNodeValidators() {
-                // no children
-                return NO_CHILDREN;
-            }
-            @Override
-            protected boolean mustBeClass() {
-                // must be a class
-                return true;
-            }
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/FactoryValidationVisitor.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/FactoryValidationVisitor.java
deleted file mode 100644
index 2f9678c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/FactoryValidationVisitor.java
+++ /dev/null
@@ -1,351 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.validation.internal.appconfig;
-
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.jst.jsf.facesconfig.emf.ApplicationFactoryType;
-import org.eclipse.jst.jsf.facesconfig.emf.ExceptionHandlerFactoryType;
-import org.eclipse.jst.jsf.facesconfig.emf.ExternalContextFactoryType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesContextFactoryType;
-import org.eclipse.jst.jsf.facesconfig.emf.LifecycleFactoryType;
-import org.eclipse.jst.jsf.facesconfig.emf.PartialViewContextFactoryType;
-import org.eclipse.jst.jsf.facesconfig.emf.RenderKitFactoryType;
-import org.eclipse.jst.jsf.facesconfig.emf.TagHandlerDelegateFactoryType;
-import org.eclipse.jst.jsf.facesconfig.emf.ViewDeclarationLanguageFactoryType;
-import org.eclipse.jst.jsf.facesconfig.emf.VisitContextFactoryType;
-
-/**
- * @author cbateman
- *
- */
-public class FactoryValidationVisitor extends EObjectValidationVisitor 
-{
-    /**
-     * @param version
-     */
-    public FactoryValidationVisitor(String version) {
-        super(FacesConfigPackage.eINSTANCE.getFacesConfigType_Factory()
-                ,version);
-    }
-
-    protected void doValidate(EObject object, List messages, IFile file) {
-        // nothing to do except vaildate children
-    }
-
-    protected EObjectValidationVisitor[] getChildNodeValidators() 
-    {
-        return new EObjectValidationVisitor[]
-        {
-                new ApplicationFactoryValidationVisitor(getVersion())
-                , new FacesContextFactoryValidationVisitor(getVersion())
-                , new LifecycleFactoryValidationVisitor(getVersion())
-                , new RenderkitFactoryValidationVisitor(getVersion())
-                , new ExceptionHandlerFactoryValidationVisitor(getVersion())
-                , new ExternalContextFactoryValidationVisitor(getVersion())
-                , new PartialViewContextFactoryValidationVisitor(getVersion())
-                , new ViewDeclarationLanguageFactoryValidationVisitor(getVersion())
-                , new TagHandlerDelegateFactoryValidationVisitor(getVersion())
-                , new VisitContextFactoryValidationVisitor(getVersion())
-        };
-    }
-
-    private static class ApplicationFactoryValidationVisitor extends ClassNameEObjectValidationVisitor
-    {
-        ApplicationFactoryValidationVisitor(final String version)
-        {
-            super(FacesConfigPackage.eINSTANCE.getFactoryType_ApplicationFactory(),
-                    version);
-        }
-        
-        protected String getFullyQualifiedName(EObject eobj) 
-        {
-            return ((ApplicationFactoryType)eobj).getTextContent();
-        }
-
-        protected String getInstanceOf() {
-            return "javax.faces.application.ApplicationFactory"; //$NON-NLS-1$
-        }
-
-        @Override
-        protected boolean mustBeClass() {
-            return true;
-        }
-
-        protected EObjectValidationVisitor[] getChildNodeValidators() {
-            // none
-            return NO_CHILDREN;
-        }
-        
-    }
-    
-    private static class FacesContextFactoryValidationVisitor extends ClassNameEObjectValidationVisitor
-    {
-        FacesContextFactoryValidationVisitor(final String version)
-        {
-            super(FacesConfigPackage.eINSTANCE.getFactoryType_FacesContextFactory(),
-                    version);
-        }
-        
-        protected String getFullyQualifiedName(EObject eobj) 
-        {
-            return ((FacesContextFactoryType)eobj).getTextContent();
-        }
-
-        protected String getInstanceOf() {
-            return "javax.faces.context.FacesContextFactory"; //$NON-NLS-1$
-        }
-
-        protected EObjectValidationVisitor[] getChildNodeValidators() {
-            // none
-            return NO_CHILDREN;
-        }
-
-        @Override
-        protected boolean mustBeClass() 
-        {
-            // must be a class
-            return true;
-        }
-        
-    }
-
-    private static class LifecycleFactoryValidationVisitor extends ClassNameEObjectValidationVisitor
-    {
-        LifecycleFactoryValidationVisitor(final String version)
-        {
-            super(FacesConfigPackage.eINSTANCE.getFactoryType_LifecycleFactory(),
-                    version);
-        }
-        
-        protected String getFullyQualifiedName(EObject eobj) 
-        {
-            return ((LifecycleFactoryType)eobj).getTextContent();
-        }
-
-        protected String getInstanceOf() {
-            return "javax.faces.lifecycle.LifecycleFactory"; //$NON-NLS-1$
-        }
-
-        protected EObjectValidationVisitor[] getChildNodeValidators() {
-            // none
-            return NO_CHILDREN;
-        }
-
-        @Override
-        protected boolean mustBeClass() {
-            // must be a class
-            return true;
-        }
-        
-    }
-
-    private static class RenderkitFactoryValidationVisitor extends ClassNameEObjectValidationVisitor
-    {
-        RenderkitFactoryValidationVisitor(final String version)
-        {
-            super(FacesConfigPackage.eINSTANCE.getFactoryType_RenderKitFactory(),
-                    version);
-        }
-        
-        protected String getFullyQualifiedName(EObject eobj) 
-        {
-            return ((RenderKitFactoryType)eobj).getTextContent();
-        }
-
-        protected String getInstanceOf() {
-            return "javax.faces.render.RenderKitFactory"; //$NON-NLS-1$
-        }
-
-        protected EObjectValidationVisitor[] getChildNodeValidators() {
-            // none
-            return NO_CHILDREN;
-        }
-
-        @Override
-        protected boolean mustBeClass() {
-            // must be a class
-            return true;
-        }
-    }
-    private static class ExceptionHandlerFactoryValidationVisitor extends ClassNameEObjectValidationVisitor
-    {
-    	ExceptionHandlerFactoryValidationVisitor(final String version)
-        {
-            super(FacesConfigPackage.eINSTANCE.getFactoryType_ExceptionHandlerFactory(),
-                    version);            
-        }
-        
-        protected String getFullyQualifiedName(EObject eobj) 
-        {
-            return ((ExceptionHandlerFactoryType)eobj).getTextContent();
-        }
-
-        protected String getInstanceOf() {
-            return "javax.faces.context.ExceptionHandlerFactory"; //$NON-NLS-1$
-        }
-
-        protected EObjectValidationVisitor[] getChildNodeValidators() {
-            // none
-            return NO_CHILDREN;
-        }
-
-        @Override
-        protected boolean mustBeClass() {
-            // must be a class
-            return true;
-        }
-    }
-    private static class ExternalContextFactoryValidationVisitor extends ClassNameEObjectValidationVisitor
-    {
-    	ExternalContextFactoryValidationVisitor(final String version)
-        {
-            super(FacesConfigPackage.eINSTANCE.getFactoryType_ExternalContextFactory(),
-                    version);
-        }
-        
-        protected String getFullyQualifiedName(EObject eobj) 
-        {
-            return ((ExternalContextFactoryType)eobj).getTextContent();
-        }
-
-        protected String getInstanceOf() {
-            return "javax.faces.context.ExternalContextFactory"; //$NON-NLS-1$
-        }
-
-        protected EObjectValidationVisitor[] getChildNodeValidators() {
-            // none
-            return NO_CHILDREN;
-        }
-
-        @Override
-        protected boolean mustBeClass() {
-            // must be a class
-            return true;
-        }
-    }
-
-    private static class ViewDeclarationLanguageFactoryValidationVisitor extends ClassNameEObjectValidationVisitor
-    {
-    	ViewDeclarationLanguageFactoryValidationVisitor(final String version)
-        {
-            super(FacesConfigPackage.eINSTANCE.getFactoryType_ViewDeclarationLanguageFactory(),
-                    version);
-        }
-        
-        protected String getFullyQualifiedName(EObject eobj) 
-        {
-            return ((ViewDeclarationLanguageFactoryType)eobj).getTextContent();
-        }
-
-        protected String getInstanceOf() {
-            return "javax.faces.faces.ViewDeclarationLanguageFactory"; //$NON-NLS-1$
-        }
-
-        protected EObjectValidationVisitor[] getChildNodeValidators() {
-            // none
-            return NO_CHILDREN;
-        }
-
-        @Override
-        protected boolean mustBeClass() {
-            // must be a class
-            return true;
-        }
-    }
-    private static class PartialViewContextFactoryValidationVisitor extends ClassNameEObjectValidationVisitor
-    {
-    	PartialViewContextFactoryValidationVisitor(final String version)
-        {
-            super(FacesConfigPackage.eINSTANCE.getFactoryType_PartialViewContextFactory(),
-                    version);
-        }
-        
-        protected String getFullyQualifiedName(EObject eobj) 
-        {
-            return ((PartialViewContextFactoryType)eobj).getTextContent();
-        }
-
-        protected String getInstanceOf() {
-            return "javax.faces.context.PartialViewContextFactory"; //$NON-NLS-1$
-        }
-
-        protected EObjectValidationVisitor[] getChildNodeValidators() {
-            // none
-            return NO_CHILDREN;
-        }
-
-        @Override
-        protected boolean mustBeClass() {
-            // must be a class
-            return true;
-        }
-    }
-    private static class TagHandlerDelegateFactoryValidationVisitor extends ClassNameEObjectValidationVisitor
-    {
-    	TagHandlerDelegateFactoryValidationVisitor(final String version)
-        {
-            super(FacesConfigPackage.eINSTANCE.getFactoryType_TagHandlerDelegateFactory(),
-                    version);
-        }
-        
-        protected String getFullyQualifiedName(EObject eobj) 
-        {
-            return ((TagHandlerDelegateFactoryType)eobj).getTextContent();
-        }
-
-        protected String getInstanceOf() {
-            return "javax.faces.view.facelets.TagHandlerDelegateFactory"; //$NON-NLS-1$
-        }
-
-        protected EObjectValidationVisitor[] getChildNodeValidators() {
-            // none
-            return NO_CHILDREN;
-        }
-
-        @Override
-        protected boolean mustBeClass() {
-            // must be a class
-            return true;
-        }
-    }
-    private static class VisitContextFactoryValidationVisitor extends ClassNameEObjectValidationVisitor
-    {
-    	VisitContextFactoryValidationVisitor(final String version)
-        {
-            super(FacesConfigPackage.eINSTANCE.getFactoryType_VisitContextFactory(),
-                    version);
-        }
-        
-        protected String getFullyQualifiedName(EObject eobj) 
-        {
-            return ((VisitContextFactoryType)eobj).getTextContent();
-        }
-
-        protected String getInstanceOf() {
-            return "javax.faces.component.visit.VisitContextFactory"; //$NON-NLS-1$
-        }
-
-        protected EObjectValidationVisitor[] getChildNodeValidators() {
-            // none
-            return NO_CHILDREN;
-        }
-
-        @Override
-        protected boolean mustBeClass() {
-            // must be a class
-            return true;
-        }
-    }    
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/ILocalizedMessage.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/ILocalizedMessage.java
deleted file mode 100644
index 33240d7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/ILocalizedMessage.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.validation.internal.appconfig;
-
-/**
- * Used to expose internal message data to unit tests.  Should not be used by clients
- * @author cbateman
- *
- */
-public interface ILocalizedMessage {
-    /**
-     * @return the error code
-     */
-    public int getErrorCode();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/ManagedBeanValidationVisitor.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/ManagedBeanValidationVisitor.java
deleted file mode 100644
index 99b8181..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/ManagedBeanValidationVisitor.java
+++ /dev/null
@@ -1,131 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.validation.internal.appconfig;
-
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ListEntriesType;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanScopeType;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType;
-import org.eclipse.jst.jsf.facesconfig.emf.MapEntriesType;
-import org.eclipse.wst.validation.internal.provisional.core.IMessage;
-
-/**
- * Managed bean validator
- * 
- * @author cbateman
- *
- */
-public class ManagedBeanValidationVisitor extends EObjectValidationVisitor 
-{
-    /**
-     * @param version
-     */
-    public ManagedBeanValidationVisitor(final String version) 
-    {
-        super(FacesConfigPackage.eINSTANCE.getFacesConfigType_ManagedBean()
-                ,version);
-    }
-
-    protected void doValidate(EObject object, List messages, IFile file) 
-    {
-        final ManagedBeanType managedBean = (ManagedBeanType) object;
-        
-        // TODO: validate managedBeanName is a valid Java id
-//        final String managedBeanName = 
-//            managedBean.getManagedBeanName().getTextContent();
-        validateScope(managedBean.getManagedBeanScope(), messages, file);
-        validateClass(managedBean.getManagedBeanClass(), messages, file);
-        validateEntryTypes(managedBean, messages, file);
-    }
-    
-    private void validateScope(ManagedBeanScopeType scope, List messages, IFile file)
-    {
-        if (scope != null && scope.getTextContent() != null)
-        {
-            addMessageInfo(messages
-                    , AppConfigValidationUtil.validateManagedBeanScope(scope, file, getJSFVersion())
-                    , scope, file);
-        }
-    }
-    
-    private void validateClass(ManagedBeanClassType classType, List messages, IFile file)
-    {
-        if (classType != null)
-        {
-            String classTypeValue = classType.getTextContent();
-            addMessageInfo(messages
-                , AppConfigValidationUtil.validateClassName
-                    (classTypeValue == null ? "" : classTypeValue //$NON-NLS-1$
-                            , null, true,   // a managed bean must be a class 
-                            file.getProject())
-                            , classType, file);
-        }
-    }
-    
-    private void validateEntryTypes(ManagedBeanType managedBeanType, List messages, IFile file)
-    {
-        // TODO: do a bean look-up for targetName to verify that it a) matches the type
-        // and b) exists on the bean
-        if (managedBeanType.getManagedBeanName()!= null
-                && managedBeanType.getManagedBeanClass() != null)
-        {
-            final String propertyName =
-                managedBeanType.getManagedBeanName().getTextContent();
-            final String propertyClass =
-                managedBeanType.getManagedBeanClass().getTextContent();
-            
-            if (propertyName == null || propertyClass == null
-                    || "".equals(propertyName.trim()) //$NON-NLS-1$
-                    || "".equals(propertyClass.trim())) //$NON-NLS-1$
-            {
-                return;
-            }
-            
-            IMessage message = null;
-            EObject eObj = null;
-            if (managedBeanType.getMapEntries() != null)
-            {
-                eObj = managedBeanType.getMapEntries();
-                message =
-                    AppConfigValidationUtil
-                        .validateMapEntries
-                            (propertyName
-                            , propertyClass
-                            , (MapEntriesType) eObj
-                            , file.getProject());
-            }
-            else if (managedBeanType.getListEntries() != null)
-            {
-                eObj = managedBeanType.getListEntries();
-                message =
-                    AppConfigValidationUtil
-                        .validateListEntries(
-                            propertyName
-                            , propertyClass
-                            , (ListEntriesType) eObj
-                            , file.getProject());
-            }
-            addMessageInfo(messages, message, eObj, file);
-        }
-    }
-    
-    protected EObjectValidationVisitor[] getChildNodeValidators() {
-        return new EObjectValidationVisitor[]
-        {
-            new ManagedPropertyValidationVisitor(getVersion())
-        };
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/ManagedPropertyValidationVisitor.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/ManagedPropertyValidationVisitor.java
deleted file mode 100644
index 154ae24..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/ManagedPropertyValidationVisitor.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.validation.internal.appconfig;
-
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ListEntriesType;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType;
-import org.eclipse.jst.jsf.facesconfig.emf.MapEntriesType;
-import org.eclipse.wst.validation.internal.provisional.core.IMessage;
-
-/**
- * Validates managed bean properties
- * 
- */
-public class ManagedPropertyValidationVisitor extends EObjectValidationVisitor
-{
-    /**
-     * @param version
-     */
-    public ManagedPropertyValidationVisitor(String version) {
-        super(FacesConfigPackage.eINSTANCE.getManagedBeanType_ManagedProperty()
-                ,version);
-    }
-
-    protected void doValidate(final EObject object, final List messages, final IFile file) 
-    {
-        // TODO: do a bean look-up for propertyName to verify that it a) matches the type
-        // and b) exists on the bean
-        final ManagedPropertyType managedPropertyType = 
-            (ManagedPropertyType) object;
-
-        if (managedPropertyType.getPropertyName() == null
-                || managedPropertyType.getPropertyClass() == null)
-        {
-            // don't bother if the basics aren't correct
-            return;
-        }
-        
-        final String propertyName =
-            managedPropertyType.getPropertyName().getTextContent();
-        final String propertyClass =
-            managedPropertyType.getPropertyClass().getTextContent();
-        
-        if (propertyName == null || propertyClass == null
-                || "".equals(propertyName.trim()) //$NON-NLS-1$
-                || "".equals(propertyClass.trim())) //$NON-NLS-1$
-        {
-            return;
-        }
-        
-        IMessage message = null;
-        EObject eObj = null;
-        if (managedPropertyType.getMapEntries() != null)
-        {
-            eObj = managedPropertyType.getMapEntries();
-            message =
-                AppConfigValidationUtil
-                    .validateMapEntries
-                        (propertyName
-                        , propertyClass
-                        , (MapEntriesType) eObj
-                        , file.getProject());
-        }
-        else if (managedPropertyType.getListEntries() != null)
-        {
-            eObj = managedPropertyType.getListEntries();
-            message =
-                AppConfigValidationUtil
-                    .validateListEntries(
-                        propertyName
-                        , propertyClass
-                        , (ListEntriesType) eObj
-                        , file.getProject());
-        }
-        
-        addMessageInfo(messages, message, eObj, file);
-    }
-
-    protected EObjectValidationVisitor[] getChildNodeValidators() {
-        return new EObjectValidationVisitor[]
-        {
-             new PropertyNameValidationVisitor(FacesConfigPackage.eINSTANCE.getManagedPropertyType_PropertyName(),
-                     FacesConfigPackage.eINSTANCE.getManagedBeanType_ManagedBeanClass(), getVersion())
-        };
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/Messages.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/Messages.java
deleted file mode 100644
index b0535a9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/Messages.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.validation.internal.appconfig;
-
-import org.eclipse.osgi.util.NLS;
-
-class Messages extends NLS {
-    private static final String BUNDLE_NAME = "org.eclipse.jst.jsf.validation.internal.appconfig.messages"; //$NON-NLS-1$
-
-
-
-
-    static {
-        NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-    }
-
-    /**
-     * see messages.properties
-     */
-    public static String AppConfigValidationUtil_0;
-
-    /**
-     * see messages.properties
-     */
-    public static String EL_EXPR_MUST_BE_IN_HASH_BRACES_ID;
-    
-    /**
-     * see messages.properties
-     */
-    public static String SYNTAX_ERROR_IN_EL_ID;
-    
-    /**
-     * see messages.properties
-     */
-    public static String CANNOT_FIND_CLASS_NAME_ID;
-    
-    /**
-     * see messages.properties
-     */
-    public static String FULLY_QUALIFIED_NAME_MUST_BE_A_CLASS_ID;
-    
-    /**
-     * see messages.properties
-     */
-    public static String CLASS_MUST_BE_INSTANCE_OF_ID;
-
-    /**
-     * see messages.properties
-     */
-    public static String CLASS_MUST_BE_CONCRETE_ID;
-
-    /**
-     * see messages.properties
-     */
-    public static String API_DEPRECATED_AFTER_VERSION_ID;
-
-    /**
-     * see messages.properties
-     */
-    public static String BEAN_PROPERTY_NOT_FOUND_ID;
-
-    /**
-     * see messages.properties
-     */
-    public static String MUST_BE_A_VALID_JAVA_IDENT_ID;
-
-    /**
-     * see messages.properties
-     */
-    public static String BEAN_SCOPE_NOT_VALID_ID;
-
-    /**
-     * see messages.properties
-     */
-    public static String MAP_ENTRIES_CAN_ONLY_BE_SET_ON_MAP_TYPE_ID;
-
-    /**
-     * see messages.properties
-     */
-    public static String LIST_ENTRIES_CAN_ONLY_BE_SET_ON_LIST_TYPE_ID;
-    
-    /**
-     * see messages.properties
-     */
-    public static String API_NOT_AVAILABLE_BEFORE_VERSION_ID;
-    
-    /**
-     * see messages.properties
-     */
-    public static String APP_CONFIG_IS_NEWER_THAN_JSF_VERSION_ID;
-
-    /**
-     * see messages.properties 
-     */
-    public static String APP_CONFIG_IS_OLDER_THAN_JSF_VERSION_ID;
-
-    /**
-     * see messages.properties
-     */
-    public static String LOCALE_FORMAT_NOT_VALID_ID;
-
-    /**
-     * see messages.properties
-     */
-    public static String CONFIG_FILE_NOT_UNDER_WEBCONTENT_FOLDER;
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/NavigationCaseValidationVisitor.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/NavigationCaseValidationVisitor.java
deleted file mode 100644
index 9c2c516..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/NavigationCaseValidationVisitor.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.validation.internal.appconfig;
-
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.FromActionType;
-import org.eclipse.wst.validation.internal.provisional.core.IMessage;
-
-/**
- * NavigationCase validation visitor.
- * 
- * @author cbateman
- *
- */
-public class NavigationCaseValidationVisitor extends EObjectValidationVisitor 
-{
-    /**
-     * @param version 
-     * 
-     */
-    public NavigationCaseValidationVisitor(final String version) 
-    {
-        super(FacesConfigPackage.eINSTANCE.getNavigationRuleType_NavigationCase()
-                , version);
-    }
-
-    protected void doValidate(EObject object, List messages, IFile file) 
-    {
-        // nothing to do
-    }
-
-    protected EObjectValidationVisitor[] getChildNodeValidators() 
-    {
-        return new EObjectValidationVisitor[]
-        {
-            new FromActionValidationVisitor(getVersion())
-        };
-    }
-
-    private static class FromActionValidationVisitor extends EObjectValidationVisitor
-    {
-        /**
-         * @param version 
-         * 
-         */
-        public FromActionValidationVisitor(String version) {
-            super(FacesConfigPackage.eINSTANCE.getNavigationCaseType_FromAction(),
-                    version);
-        }
-
-        protected void doValidate(EObject object, List messages, IFile file) 
-        {
-            if (object instanceof FromActionType)
-            {
-                final FromActionType actionType = (FromActionType) object;
-                IMessage message = AppConfigValidationUtil.validateELExpression
-                    (actionType.getTextContent());
-                addMessageInfo(messages, message, actionType, file);
-            }
-        }
-
-        protected EObjectValidationVisitor[] getChildNodeValidators() 
-        {
-            return NO_CHILDREN;
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/NavigationRuleValidator.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/NavigationRuleValidator.java
deleted file mode 100644
index 97b9df0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/NavigationRuleValidator.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.validation.internal.appconfig;
-
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * Recursive validator for navigation-rule
- * 
- * @author cbateman
- *
- */
-public class NavigationRuleValidator extends EObjectValidationVisitor 
-{
-    /**
-     * Constructor
-     * @param version 
-     */
-    public NavigationRuleValidator(final String version) 
-    {
-        super(FacesConfigPackage.eINSTANCE.getFacesConfigType_NavigationRule()
-                , version);
-    }
-
-    protected void doValidate(EObject eobj, List messages, IFile file) 
-    {
-        // nothing to do
-    }
-
-    protected EObjectValidationVisitor[] getChildNodeValidators() 
-    {
-        return new EObjectValidationVisitor[]
-        {
-            new NavigationCaseValidationVisitor(getVersion())
-        };
-    }
-//    private static class FromViewIdValidator extends ViewIdValidator
-//    {
-//        FromViewIdValidator()
-//        {
-//            super(Node.ELEMENT_NODE, "from-view-id");
-//        }
-//
-//        protected void doValidate(Node node, List messages, IFile file) 
-//        {
-//            // only validate if a custom navigation handler is not set
-//            // since we can only validate against what the default navigation
-//            // handler will expect
-//            if (!hasCustomNavigationHandler(file))
-//            {
-//                final String textContent = node.getTextContent();
-//                final IProject project = file.getProject();
-//                
-//                
-//            }
-//        }
-//        
-//        private boolean hasCustomNavigationHandler(IFile file)
-//        {
-//            JSFAppConfigManager configManager = 
-//                JSFAppConfigManager.getInstance(file.getProject());
-//            
-//            for (final Iterator appIt = configManager.getApplications().iterator(); appIt.hasNext();)
-//            {
-//                ApplicationType appType = (ApplicationType) appIt.next();
-//                if (appType.getNavigationHandler().size() > 0)
-//                {
-//                    return true;
-//                }
-//            }
-//            
-//            return false;
-//        }
-//
-//        protected NodeValidationVisitor[] getChildNodeValidators() {
-//            return EMPTY_CHILDREN;
-//        }
-//    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/NodeValidationVisitor.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/NodeValidationVisitor.java
deleted file mode 100644
index aa2f781..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/NodeValidationVisitor.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.validation.internal.appconfig;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.resources.IFile;
-import org.w3c.dom.NamedNodeMap;
-import org.w3c.dom.Node;
-
-/**
- * Visits an app config DOM tree and calls validators based on the
- * configured validator tree
- * 
- * @author cbateman
- *
- */
-public abstract class NodeValidationVisitor 
-{
-    private final short     _nodeType;
-    private final String    _nodeName;
-    private final Map       _attributeVisitors;
-    private final Map       _elementVisitors;
-    
-    /**
-     * Used to indicate no child nodes
-     */
-    protected final static NodeValidationVisitor[] EMPTY_CHILDREN = new NodeValidationVisitor[0];
-    
-    /**
-     * @param nodeType
-     * @param nodeName
-     */
-    public NodeValidationVisitor(short nodeType, String nodeName)
-    {
-        _nodeType = nodeType;
-        _nodeName = nodeName;
-        _attributeVisitors = new HashMap();
-        _elementVisitors = new HashMap();
-        
-        NodeValidationVisitor[] childVisitors = getChildNodeValidators();
-        
-        for (int i = 0; i < childVisitors.length; i++)
-        {
-            final NodeValidationVisitor visitor = childVisitors[i];
-            
-            switch(visitor.getNodeType())
-            {
-                case Node.ATTRIBUTE_NODE:
-                    _attributeVisitors.put(visitor.getNodeName(), visitor);
-                break;
-                
-                case Node.ELEMENT_NODE:
-                    _elementVisitors.put(visitor.getNodeName(), visitor);
-                break;
-            }
-        }
-    }
-    
-    /**
-     * @param node
-     * @param messages
-     * @param file 
-     */
-    public final void validate(Node node, List messages, IFile file)
-    {
-        doValidate(node, messages, file);
-        
-        final NamedNodeMap attributes = node.getAttributes();
-        
-        for (int i = 0; attributes != null && i < attributes.getLength(); i++)
-        {
-            final Node attr = attributes.item(i);
-            final NodeValidationVisitor  visitor = 
-                (NodeValidationVisitor) _attributeVisitors.get(attr.getNodeName());
-            if (visitor != null)
-            {
-                visitor.validate(attr, messages, file);
-            }
-        }
-        
-        for (int i = 0; i < node.getChildNodes().getLength(); i++)
-        {
-            final Node child = node.getChildNodes().item(i);
-            final NodeValidationVisitor  visitor = 
-                (NodeValidationVisitor) _elementVisitors.get(child.getNodeName());
-            if (visitor != null)
-            {
-                visitor.validate(child, messages, file);
-            }
-        }
-    }
-
-    /**
-     * Do the validation for this visitor on this node.  Add any Message's to
-     * the messages list
-     * 
-     * @param node
-     * @param messages
-     * @param file 
-     */
-    protected abstract void doValidate(Node node, List messages, IFile file);
-    
-    /**
-     * @return an array of visitors that validate children of the current node
-     */
-    protected abstract NodeValidationVisitor[] getChildNodeValidators();
-    
-    /**
-     * @return the node type for this validator
-     */
-    protected short getNodeType()
-    {
-        return _nodeType;
-    }
-    
-    /**
-     * @return the node name for this validator
-     */
-    protected String getNodeName()
-    {
-        return _nodeName;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/PropertyNameValidationVisitor.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/PropertyNameValidationVisitor.java
deleted file mode 100644
index c076c1b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/PropertyNameValidationVisitor.java
+++ /dev/null
@@ -1,169 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.validation.internal.appconfig;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jst.jsf.common.util.JDTBeanIntrospector;
-import org.eclipse.jst.jsf.common.util.JDTBeanProperty;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.PropertyNameType;
-
-/**
- * Validate the validation property name
- * 
- * @author cbateman
- */
-class PropertyNameValidationVisitor extends EObjectValidationVisitor
-{
-    private final EStructuralFeature   _parentClassNameFeature;
-	private final Map<IType, Map<String, JDTBeanProperty>> _propertyCache;
-	private final Map<String, IType>		_typeCache;
-    
-    /**
-     * @param feature 
-     * @param parentClassNameFeature 
-     * @param version
-     */
-    public PropertyNameValidationVisitor(EStructuralFeature feature,
-            EStructuralFeature parentClassNameFeature, String version)
-    {
-        super(feature, version);
-        _parentClassNameFeature = parentClassNameFeature;
-        _propertyCache = new HashMap<IType, Map<String, JDTBeanProperty>>();
-        _typeCache = new HashMap<String, IType>();
-    }
-
-    protected EObjectValidationVisitor[] getChildNodeValidators() 
-    {
-        return PropertyValidationVisitor.NO_CHILDREN;
-    }
-
-    protected void doValidate(EObject object, List messages, IFile file) 
-    {
-        final String parentClassType = getParentClassType(object);
-        
-        if (parentClassType != null)
-        {
-            final boolean isBeanProperty = 
-                validateProperty((PropertyNameType)object
-                        , file.getProject(), parentClassType);
-            final String propertyName = 
-                ((PropertyNameType)object).getTextContent();
-            
-            if (!isBeanProperty)
-            {
-                PropertyValidationVisitor.addMessageInfo(messages,
-                        DiagnosticFactory
-                            .create_BEAN_PROPERTY_NOT_FOUND
-                                (propertyName, parentClassType)
-                        , object, file);
-            }
-        }
-    }
-
-    private String getParentClassType(EObject object)
-    {
-        String parentClassType = null;
-        
-        // need to derive the parent's type
-        final EObject property = object.eContainer();
-        if (property != null)
-        {
-            EObject owningObject = property.eContainer();
-            
-            if (owningObject != null)
-            {
-                final EObject parentClassTypeObject =
-                    (EObject) owningObject.eGet(_parentClassNameFeature);
-
-                if (parentClassTypeObject != null)
-                {
-                    final EStructuralFeature feature =
-                        parentClassTypeObject.eClass()
-                            .getEStructuralFeature("textContent"); //$NON-NLS-1$
-                    
-                    if (feature != null)
-                    {
-                        parentClassType = (String) 
-                            parentClassTypeObject.eGet(feature);
-                    }
-                }
-            }
-        }
-        
-        return parentClassType;
-    }
-    
-	private boolean validateProperty(PropertyNameType object, IProject project, String parentClassType)
-    {
-        boolean isBeanProperty = false;
-
-        final IType type = getType(parentClassType, project);
-
-        if (type != null)
-        {
-            final String propertyName = object.getTextContent(); 
-
-            Map<String, JDTBeanProperty>  cachedType = _propertyCache.get(type);
-            if (cachedType == null)
-            {
-            	cachedType = getProperties(type, project);
-            	_propertyCache.put(type, cachedType);
-            }
-
-            final JDTBeanProperty beanProperty = cachedType.get(propertyName);
-
-            if (beanProperty != null)
-            {
-            	isBeanProperty = true; 
-            }
-        }
-        return isBeanProperty;
-    }
-
-	private Map<String, JDTBeanProperty> getProperties(final IType type, final IProject project) 
-	{
-		final JDTBeanIntrospector introspector = new JDTBeanIntrospector(type);
-		return introspector.getProperties();
-	}
-	
-	private IType getType(final String typeName, final IProject project)
-	{
-		IType type = _typeCache.get(typeName);
-		if (type == null)
-		{
-	        IJavaProject javaProject = JavaCore.create(project);
-	        try 
-	        {
-				type = javaProject.findType(typeName);
-				_typeCache.put(typeName, type);
-			} 
-	        catch (JavaModelException e) 
-			{
-				JSFCorePlugin
-                .log(new Exception(e), 
-                     "Problem validating on parent: "+typeName); //$NON-NLS-1$
-			}
-		}
-		return type;
-	}
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/PropertyValidationVisitor.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/PropertyValidationVisitor.java
deleted file mode 100644
index 5ff1e81..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/PropertyValidationVisitor.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.validation.internal.appconfig;
-
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * Validates property's
- * 
- */
-public class PropertyValidationVisitor extends EObjectValidationVisitor 
-{
-    private final EStructuralFeature    _parentClassName;
-    
-    /**
-     * @param feature
-     * @param parentClassName 
-     * @param version
-     */
-    public PropertyValidationVisitor(EStructuralFeature feature, EStructuralFeature parentClassName, String version) {
-        // this validator can be attached to numerous parents so it
-        // cannot hard-code its feature
-        super(feature,version);
-        _parentClassName = parentClassName;
-    }
-
-    protected void doValidate(EObject object, List messages, IFile file) {
-        // validate the class type here because we need knowledge
-        // of the property name to do it
-        //TODO:
-//         final PropertyType property = (PropertyType) object;
-//         final String propertyClass = 
-//             property.getPropertyClass().getTextContent();
-//         final String propertySignature =
-//             validateProperty(property.getPropertyName()
-//                     , file.getProject(), _parentClassType);
-//         
-//         if (propertySignature != null
-//                 && Signature.)
-//         {
-//             Signature.create
-//         }
-    }
-
-    protected EObjectValidationVisitor[] getChildNodeValidators() {
-        return new EObjectValidationVisitor[]
-        {
-             new PropertyNameValidationVisitor(FacesConfigPackage.eINSTANCE.getPropertyType_PropertyName(),
-                     _parentClassName, getVersion())
-        };
-    }
-
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/RenderKitValidationVisitor.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/RenderKitValidationVisitor.java
deleted file mode 100644
index 3252c58..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/RenderKitValidationVisitor.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.validation.internal.appconfig;
-
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.RenderKitClassType;
-
-/**
- * Validates the renderkit
- */
-public class RenderKitValidationVisitor extends EObjectValidationVisitor 
-{
-
-    /**
-     * @param version
-     */
-    public RenderKitValidationVisitor(String version) 
-    {
-        super(FacesConfigPackage.eINSTANCE.getFacesConfigType_RenderKit()
-                ,version);
-    }
-
-    protected void doValidate(EObject object, List messages, IFile file) 
-    {
-        // nothing to do 
-    }
-
-    protected EObjectValidationVisitor[] getChildNodeValidators()
-    {
-        return new EObjectValidationVisitor[]
-        {
-            new RenderKitClassValidationVisitor(getVersion()),
-            new RendererValidationVisitor(getVersion()),
-            new ClientBehaviorRendererValidationVisitor(getVersion())
-        };
-    }
-
-    private static class RenderKitClassValidationVisitor extends ClassNameEObjectValidationVisitor
-    {
-        /**
-         * @param version
-         */
-        public RenderKitClassValidationVisitor(String version) 
-        {
-            super(FacesConfigPackage.eINSTANCE.getRenderKitType_RenderKitClass()
-                    , version);
-        }
-
-        protected String getFullyQualifiedName(EObject eobj) 
-        {
-            return ((RenderKitClassType)eobj).getTextContent();
-        }
-
-        protected String getInstanceOf() {
-            return "javax.faces.render.RenderKit"; //$NON-NLS-1$
-        }
-
-        protected EObjectValidationVisitor[] getChildNodeValidators() {
-            return NO_CHILDREN;
-        }
-
-        @Override
-        protected boolean mustBeClass() {
-            // must be a class
-            return true;
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/RendererValidationVisitor.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/RendererValidationVisitor.java
deleted file mode 100644
index aa6a824..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/RendererValidationVisitor.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.validation.internal.appconfig;
-
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.RendererClassType;
-
-/**
- * Renderer validation
- *
- */
-public class RendererValidationVisitor extends EObjectValidationVisitor {
-
-    /**
-     * @param version
-     */
-    public RendererValidationVisitor(String version)
-    {
-        super(FacesConfigPackage.eINSTANCE.getRenderKitType_Renderer(),
-                version);
-    }
-
-    protected void doValidate(EObject object, List messages, IFile file) {
-        // nothing to do
-    }
-
-    protected EObjectValidationVisitor[] getChildNodeValidators() {
-        return new EObjectValidationVisitor[]
-        {
-            new RendererClassValidationVisitor(getVersion())
-            , new AttributeValidationVisitor
-                (FacesConfigPackage.eINSTANCE.getRendererType_Attribute()
-                        , getVersion())
-        };
-    }
-
-    private static class RendererClassValidationVisitor extends ClassNameEObjectValidationVisitor
-    {
-        /**
-         * @param version
-         */
-        public RendererClassValidationVisitor(String version) 
-        {
-            super(FacesConfigPackage.eINSTANCE.getRendererType_RendererClass()
-                    , version);
-        }
-
-        protected String getFullyQualifiedName(EObject eobj) 
-        {
-            return ((RendererClassType)eobj).getTextContent();
-        }
-
-        protected String getInstanceOf() {
-            return "javax.faces.render.Renderer"; //$NON-NLS-1$
-        }
-
-        protected EObjectValidationVisitor[] getChildNodeValidators() {
-            return NO_CHILDREN;
-        }
-
-        @Override
-        protected boolean mustBeClass() {
-            // must be a class
-            return true;
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/ValidatorTypeValidationVisitor.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/ValidatorTypeValidationVisitor.java
deleted file mode 100644
index ff60fee..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/ValidatorTypeValidationVisitor.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.validation.internal.appconfig;
-
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ValidatorClassType;
-
-/**
- * Validation visitor for the Validator faces config model sub-type
- * @author cbateman
- *
- */
-public class ValidatorTypeValidationVisitor extends EObjectValidationVisitor {
-
-    /**
-     * @param version
-     */
-    public ValidatorTypeValidationVisitor(final String version)
-    {
-        super(FacesConfigPackage.eINSTANCE.getFacesConfigType_Validator(),
-                version);
-    }
-    
-    protected void doValidate(EObject object, List messages, IFile file) {
-        // nothing in the tag to validate
-    }
-
-    protected EObjectValidationVisitor[] getChildNodeValidators() {
-        return new EObjectValidationVisitor[]
-        {
-            new ValidatorClassValidationVisitor(getVersion()),
-            new AttributeValidationVisitor(FacesConfigPackage.eINSTANCE.getValidatorType_Attribute(), getVersion()),
-            new PropertyValidationVisitor
-                (FacesConfigPackage.eINSTANCE.getValidatorType_Property()
-                ,FacesConfigPackage.eINSTANCE.getValidatorType_ValidatorClass()
-                ,getVersion()),
-        };
-    }
-
-    private static class ValidatorClassValidationVisitor extends ClassNameEObjectValidationVisitor
-    {
-        ValidatorClassValidationVisitor(final String version)
-        {
-            super(FacesConfigPackage.eINSTANCE.getValidatorType_ValidatorClass(),
-                    version);
-        }
-        
-        protected String getFullyQualifiedName(EObject eobj) 
-        {
-            return ((ValidatorClassType)eobj).getTextContent();
-        }
-
-        protected String getInstanceOf() {
-            return "javax.faces.validator.Validator"; //$NON-NLS-1$
-        }
-
-        protected EObjectValidationVisitor[] getChildNodeValidators() {
-            return NO_CHILDREN;
-        }
-
-        @Override
-        protected boolean mustBeClass() {
-            // must be a class
-            return true;
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/ViewIdValidator.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/ViewIdValidator.java
deleted file mode 100644
index 6c2a067..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/ViewIdValidator.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.validation.internal.appconfig;
-
-
-/**
- * @author cbateman
- *
- */
-public abstract class ViewIdValidator extends NodeValidationVisitor 
-{
-    /**
-     * @param nodeType
-     * @param nodeName
-     */
-    protected ViewIdValidator(final short nodeType, final String nodeName) 
-    {
-        super(nodeType, nodeName);
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/messages.properties b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/messages.properties
deleted file mode 100644
index b910ba6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/messages.properties
+++ /dev/null
@@ -1,28 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-EL_EXPR_MUST_BE_IN_HASH_BRACES_ID=EL expression must be of the form #{expression}
-SYNTAX_ERROR_IN_EL_ID=Syntax error in EL
-CANNOT_FIND_CLASS_NAME_ID=Cannot find fully qualified class: {0}
-FULLY_QUALIFIED_NAME_MUST_BE_A_CLASS_ID=Fully qualified name must be a class: {0}
-CLASS_MUST_BE_INSTANCE_OF_ID=Class {0} must {1} the type {2}
-CLASS_MUST_BE_CONCRETE_ID=Class {0} must be concrete (not abstract)
-API_DEPRECATED_AFTER_VERSION_ID=API {0} is deprecated after JSF {1}.  Use {2} instead.
-BEAN_PROPERTY_NOT_FOUND_ID=Bean property {0} not found on parent class {1}
-MUST_BE_A_VALID_JAVA_IDENT_ID={0} must be a valid Java identifier
-BEAN_SCOPE_NOT_VALID_ID=Managed bean scope must be one of: request, session, application, none
-MAP_ENTRIES_CAN_ONLY_BE_SET_ON_MAP_TYPE_ID=Map entries can only be set on objects of type Map. {0} is not an instance of type java.util.Map
-LIST_ENTRIES_CAN_ONLY_BE_SET_ON_LIST_TYPE_ID=List entries can only be set on objects of type List. {0} is not an instance of type java.util.List
-API_NOT_AVAILABLE_BEFORE_VERSION_ID=API {0} is not avaiable before JSF {1}.  Use {2} instead.
-APP_CONFIG_IS_NEWER_THAN_JSF_VERSION_ID=Faces 1.2 application configuration cannot be used in projects for Faces 1.1 or before
-APP_CONFIG_IS_OLDER_THAN_JSF_VERSION_ID=Faces {0} application configuration being used in Faces {1} project.  Not all Faces {1} features will be available"
-LOCALE_FORMAT_NOT_VALID_ID=Locale format must be of the form lang_[_country[_variant]] like en or en_US or ja_JP_SJIS
-AppConfigValidationUtil_0=extend
-CONFIG_FILE_NOT_UNDER_WEBCONTENT_FOLDER=JSF configuration file is not under this project's web content folder. Please check project setup.
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/constraints/ConstraintsFactory.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/constraints/ConstraintsFactory.java
deleted file mode 100644
index 0df2966..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/constraints/ConstraintsFactory.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ConstraintsFactory.java,v 1.1 2007/02/28 21:16:02 cbateman Exp $
- */
-package org.eclipse.jst.jsf.validation.internal.constraints;
-
-import org.eclipse.emf.ecore.EFactory;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Factory</b> for the model.
- * It provides a create method for each non-abstract class of the model.
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.jsf.validation.internal.constraints.ConstraintsPackage
- * @generated
- */
-public interface ConstraintsFactory extends EFactory {
-    /**
-     * The singleton instance of the factory.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    ConstraintsFactory eINSTANCE = org.eclipse.jst.jsf.validation.internal.constraints.impl.ConstraintsFactoryImpl.init();
-
-    /**
-     * Returns a new object of class '<em>Tag Id</em>'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new object of class '<em>Tag Id</em>'.
-     * @generated
-     */
-    TagId createTagId();
-
-    /**
-     * Returns a new object of class '<em>Tag Set</em>'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new object of class '<em>Tag Set</em>'.
-     * @generated
-     */
-    TagSet createTagSet();
-
-    /**
-     * Returns a new object of class '<em>Contains Tag Constraint</em>'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new object of class '<em>Contains Tag Constraint</em>'.
-     * @generated
-     */
-    ContainsTagConstraint createContainsTagConstraint();
-
-    /**
-     * Returns the package supported by this factory.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the package supported by this factory.
-     * @generated
-     */
-    ConstraintsPackage getConstraintsPackage();
-
-} //ConstraintsFactory
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/constraints/ConstraintsPackage.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/constraints/ConstraintsPackage.java
deleted file mode 100644
index 2347907..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/constraints/ConstraintsPackage.java
+++ /dev/null
@@ -1,353 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ConstraintsPackage.java,v 1.5 2008/11/18 22:24:09 gkessler Exp $
- */
-package org.eclipse.jst.jsf.validation.internal.constraints;
-
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.EReference;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Package</b> for the model.
- * It contains accessors for the meta objects to represent
- * <ul>
- *   <li>each class,</li>
- *   <li>each feature of each class,</li>
- *   <li>each enum,</li>
- *   <li>and each data type</li>
- * </ul>
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.jsf.validation.internal.constraints.ConstraintsFactory
- * @model kind="package"
- * @generated
- */
-@SuppressWarnings("hiding")
-public interface ConstraintsPackage extends EPackage {
-    /**
-     * The package name.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    String eNAME = "constraints"; //$NON-NLS-1$
-
-    /**
-     * The package namespace URI.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    String eNS_URI = "http://org.eclipse.jst.jsf.core/constraints.ecore"; //$NON-NLS-1$
-
-    /**
-     * The package namespace name.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    String eNS_PREFIX = "cnst"; //$NON-NLS-1$
-
-    /**
-     * The singleton instance of the package.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    ConstraintsPackage eINSTANCE = org.eclipse.jst.jsf.validation.internal.constraints.impl.ConstraintsPackageImpl.init();
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.validation.internal.constraints.impl.TagIdImpl <em>Tag Id</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.validation.internal.constraints.impl.TagIdImpl
-     * @see org.eclipse.jst.jsf.validation.internal.constraints.impl.ConstraintsPackageImpl#getTagId()
-     * @generated
-     */
-    int TAG_ID = 0;
-
-    /**
-     * The feature id for the '<em><b>Uri</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int TAG_ID__URI = 0;
-
-    /**
-     * The feature id for the '<em><b>Name</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int TAG_ID__NAME = 1;
-
-    /**
-     * The number of structural features of the '<em>Tag Id</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int TAG_ID_FEATURE_COUNT = 2;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.validation.internal.constraints.impl.TagSetImpl <em>Tag Set</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.validation.internal.constraints.impl.TagSetImpl
-     * @see org.eclipse.jst.jsf.validation.internal.constraints.impl.ConstraintsPackageImpl#getTagSet()
-     * @generated
-     */
-    int TAG_SET = 1;
-
-    /**
-     * The feature id for the '<em><b>Tags</b></em>' reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int TAG_SET__TAGS = 0;
-
-    /**
-     * The number of structural features of the '<em>Tag Set</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int TAG_SET_FEATURE_COUNT = 1;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.validation.internal.constraints.impl.ContainsTagConstraintImpl <em>Contains Tag Constraint</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.validation.internal.constraints.impl.ContainsTagConstraintImpl
-     * @see org.eclipse.jst.jsf.validation.internal.constraints.impl.ConstraintsPackageImpl#getContainsTagConstraint()
-     * @generated
-     */
-    int CONTAINS_TAG_CONSTRAINT = 2;
-
-    /**
-     * The feature id for the '<em><b>Set Generator</b></em>' reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int CONTAINS_TAG_CONSTRAINT__SET_GENERATOR = 0;
-
-    /**
-     * The feature id for the '<em><b>Satisfies Set</b></em>' reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int CONTAINS_TAG_CONSTRAINT__SATISFIES_SET = 1;
-
-    /**
-     * The number of structural features of the '<em>Contains Tag Constraint</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int CONTAINS_TAG_CONSTRAINT_FEATURE_COUNT = 2;
-
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.validation.internal.constraints.TagId <em>Tag Id</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Tag Id</em>'.
-     * @see org.eclipse.jst.jsf.validation.internal.constraints.TagId
-     * @generated
-     */
-    EClass getTagId();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.validation.internal.constraints.TagId#getUri <em>Uri</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Uri</em>'.
-     * @see org.eclipse.jst.jsf.validation.internal.constraints.TagId#getUri()
-     * @see #getTagId()
-     * @generated
-     */
-    EAttribute getTagId_Uri();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.validation.internal.constraints.TagId#getName <em>Name</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Name</em>'.
-     * @see org.eclipse.jst.jsf.validation.internal.constraints.TagId#getName()
-     * @see #getTagId()
-     * @generated
-     */
-    EAttribute getTagId_Name();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.validation.internal.constraints.TagSet <em>Tag Set</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Tag Set</em>'.
-     * @see org.eclipse.jst.jsf.validation.internal.constraints.TagSet
-     * @generated
-     */
-    EClass getTagSet();
-
-    /**
-     * Returns the meta object for the reference list '{@link org.eclipse.jst.jsf.validation.internal.constraints.TagSet#getTags <em>Tags</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the reference list '<em>Tags</em>'.
-     * @see org.eclipse.jst.jsf.validation.internal.constraints.TagSet#getTags()
-     * @see #getTagSet()
-     * @generated
-     */
-    EReference getTagSet_Tags();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.validation.internal.constraints.ContainsTagConstraint <em>Contains Tag Constraint</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Contains Tag Constraint</em>'.
-     * @see org.eclipse.jst.jsf.validation.internal.constraints.ContainsTagConstraint
-     * @generated
-     */
-    EClass getContainsTagConstraint();
-
-    /**
-     * Returns the meta object for the reference '{@link org.eclipse.jst.jsf.validation.internal.constraints.ContainsTagConstraint#getSetGenerator <em>Set Generator</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the reference '<em>Set Generator</em>'.
-     * @see org.eclipse.jst.jsf.validation.internal.constraints.ContainsTagConstraint#getSetGenerator()
-     * @see #getContainsTagConstraint()
-     * @generated
-     */
-    EReference getContainsTagConstraint_SetGenerator();
-
-    /**
-     * Returns the meta object for the reference '{@link org.eclipse.jst.jsf.validation.internal.constraints.ContainsTagConstraint#getSatisfiesSet <em>Satisfies Set</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the reference '<em>Satisfies Set</em>'.
-     * @see org.eclipse.jst.jsf.validation.internal.constraints.ContainsTagConstraint#getSatisfiesSet()
-     * @see #getContainsTagConstraint()
-     * @generated
-     */
-    EReference getContainsTagConstraint_SatisfiesSet();
-
-    /**
-     * Returns the factory that creates the instances of the model.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the factory that creates the instances of the model.
-     * @generated
-     */
-    ConstraintsFactory getConstraintsFactory();
-
-    /**
-     * <!-- begin-user-doc -->
-     * Defines literals for the meta objects that represent
-     * <ul>
-     *   <li>each class,</li>
-     *   <li>each feature of each class,</li>
-     *   <li>each enum,</li>
-     *   <li>and each data type</li>
-     * </ul>
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    interface Literals {
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.validation.internal.constraints.impl.TagIdImpl <em>Tag Id</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.validation.internal.constraints.impl.TagIdImpl
-         * @see org.eclipse.jst.jsf.validation.internal.constraints.impl.ConstraintsPackageImpl#getTagId()
-         * @generated
-         */
- //       @SuppressWarnings("hiding")
-        EClass TAG_ID = eINSTANCE.getTagId();
-
-        /**
-         * The meta object literal for the '<em><b>Uri</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
- //       @SuppressWarnings("hiding")
-        EAttribute TAG_ID__URI = eINSTANCE.getTagId_Uri();
-
-        /**
-         * The meta object literal for the '<em><b>Name</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
- //       @SuppressWarnings("hiding")
-        EAttribute TAG_ID__NAME = eINSTANCE.getTagId_Name();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.validation.internal.constraints.impl.TagSetImpl <em>Tag Set</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.validation.internal.constraints.impl.TagSetImpl
-         * @see org.eclipse.jst.jsf.validation.internal.constraints.impl.ConstraintsPackageImpl#getTagSet()
-         * @generated
-         */
- //       @SuppressWarnings("hiding")
-        EClass TAG_SET = eINSTANCE.getTagSet();
-
-        /**
-         * The meta object literal for the '<em><b>Tags</b></em>' reference list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
- //       @SuppressWarnings("hiding")
-        EReference TAG_SET__TAGS = eINSTANCE.getTagSet_Tags();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.validation.internal.constraints.impl.ContainsTagConstraintImpl <em>Contains Tag Constraint</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.validation.internal.constraints.impl.ContainsTagConstraintImpl
-         * @see org.eclipse.jst.jsf.validation.internal.constraints.impl.ConstraintsPackageImpl#getContainsTagConstraint()
-         * @generated
-         */
- //       @SuppressWarnings("hiding")
-        EClass CONTAINS_TAG_CONSTRAINT = eINSTANCE.getContainsTagConstraint();
-
-        /**
-         * The meta object literal for the '<em><b>Set Generator</b></em>' reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
- //       @SuppressWarnings("hiding")
-        EReference CONTAINS_TAG_CONSTRAINT__SET_GENERATOR = eINSTANCE.getContainsTagConstraint_SetGenerator();
-
-        /**
-         * The meta object literal for the '<em><b>Satisfies Set</b></em>' reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
- //       @SuppressWarnings("hiding")
-        EReference CONTAINS_TAG_CONSTRAINT__SATISFIES_SET = eINSTANCE.getContainsTagConstraint_SatisfiesSet();
-
-    }
-
-} //ConstraintsPackage
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/constraints/ContainsTagConstraint.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/constraints/ContainsTagConstraint.java
deleted file mode 100644
index d91e5c0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/constraints/ContainsTagConstraint.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ContainsTagConstraint.java,v 1.2 2007/04/16 19:53:29 itrimble Exp $
- */
-package org.eclipse.jst.jsf.validation.internal.constraints;
-
-import org.eclipse.emf.ecore.EObject;
-
-import org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.SetGenerator;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Contains Tag Constraint</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.validation.internal.constraints.ContainsTagConstraint#getSetGenerator <em>Set Generator</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.validation.internal.constraints.ContainsTagConstraint#getSatisfiesSet <em>Satisfies Set</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.validation.internal.constraints.ConstraintsPackage#getContainsTagConstraint()
- * @model
- * @generated
- */
-public interface ContainsTagConstraint extends EObject {
-    /**
-     * Returns the value of the '<em><b>Set Generator</b></em>' reference.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Set Generator</em>' reference isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Set Generator</em>' reference.
-     * @see #setSetGenerator(SetGenerator)
-     * @see org.eclipse.jst.jsf.validation.internal.constraints.ConstraintsPackage#getContainsTagConstraint_SetGenerator()
-     * @model extendedMetaData="kind='element' name='set-generator'"
-     * @generated
-     */
-    SetGenerator getSetGenerator();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.validation.internal.constraints.ContainsTagConstraint#getSetGenerator <em>Set Generator</em>}' reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Set Generator</em>' reference.
-     * @see #getSetGenerator()
-     * @generated
-     */
-    void setSetGenerator(SetGenerator value);
-
-    /**
-     * Returns the value of the '<em><b>Satisfies Set</b></em>' reference.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Satisfies Set</em>' reference isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Satisfies Set</em>' reference.
-     * @see #setSatisfiesSet(TagSet)
-     * @see org.eclipse.jst.jsf.validation.internal.constraints.ConstraintsPackage#getContainsTagConstraint_SatisfiesSet()
-     * @model extendedMetaData="kind='element' name='satisfies-set'"
-     * @generated
-     */
-    TagSet getSatisfiesSet();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.validation.internal.constraints.ContainsTagConstraint#getSatisfiesSet <em>Satisfies Set</em>}' reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Satisfies Set</em>' reference.
-     * @see #getSatisfiesSet()
-     * @generated
-     */
-    void setSatisfiesSet(TagSet value);
-
-} // ContainsTagConstraint
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/constraints/TagId.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/constraints/TagId.java
deleted file mode 100644
index 5c5ebb1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/constraints/TagId.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: TagId.java,v 1.1 2007/02/28 21:16:02 cbateman Exp $
- */
-package org.eclipse.jst.jsf.validation.internal.constraints;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Tag Id</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.validation.internal.constraints.TagId#getUri <em>Uri</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.validation.internal.constraints.TagId#getName <em>Name</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.validation.internal.constraints.ConstraintsPackage#getTagId()
- * @model
- * @generated
- */
-public interface TagId extends EObject {
-    /**
-     * Returns the value of the '<em><b>Uri</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Uri</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Uri</em>' attribute.
-     * @see #setUri(String)
-     * @see org.eclipse.jst.jsf.validation.internal.constraints.ConstraintsPackage#getTagId_Uri()
-     * @model extendedMetaData="kind='element'"
-     * @generated
-     */
-    String getUri();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.validation.internal.constraints.TagId#getUri <em>Uri</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Uri</em>' attribute.
-     * @see #getUri()
-     * @generated
-     */
-    void setUri(String value);
-
-    /**
-     * Returns the value of the '<em><b>Name</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Name</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Name</em>' attribute.
-     * @see #setName(String)
-     * @see org.eclipse.jst.jsf.validation.internal.constraints.ConstraintsPackage#getTagId_Name()
-     * @model extendedMetaData="kind='element'"
-     * @generated
-     */
-    String getName();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.validation.internal.constraints.TagId#getName <em>Name</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Name</em>' attribute.
-     * @see #getName()
-     * @generated
-     */
-    void setName(String value);
-
-} // TagId
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/constraints/TagSet.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/constraints/TagSet.java
deleted file mode 100644
index 5c60d5d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/constraints/TagSet.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: TagSet.java,v 1.1 2007/02/28 21:16:02 cbateman Exp $
- */
-package org.eclipse.jst.jsf.validation.internal.constraints;
-
-import org.eclipse.emf.common.util.EList;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Tag Set</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.validation.internal.constraints.TagSet#getTags <em>Tags</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.validation.internal.constraints.ConstraintsPackage#getTagSet()
- * @model
- * @generated
- */
-public interface TagSet extends EObject {
-    /**
-     * Returns the value of the '<em><b>Tags</b></em>' reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.validation.internal.constraints.TagId}.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Tags</em>' reference list isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Tags</em>' reference list.
-     * @see org.eclipse.jst.jsf.validation.internal.constraints.ConstraintsPackage#getTagSet_Tags()
-     * @model type="org.eclipse.jst.jsf.validation.internal.constraints.TagId"
-     * @generated
-     */
-    EList getTags();
-
-} // TagSet
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/constraints/impl/ConstraintsFactoryImpl.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/constraints/impl/ConstraintsFactoryImpl.java
deleted file mode 100644
index e2b10e5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/constraints/impl/ConstraintsFactoryImpl.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ConstraintsFactoryImpl.java,v 1.3 2008/11/18 22:23:52 gkessler Exp $
- */
-package org.eclipse.jst.jsf.validation.internal.constraints.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EPackage;
-
-import org.eclipse.emf.ecore.impl.EFactoryImpl;
-
-import org.eclipse.emf.ecore.plugin.EcorePlugin;
-
-import org.eclipse.jst.jsf.validation.internal.constraints.*;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model <b>Factory</b>.
- * <!-- end-user-doc -->
- * @generated
- */
-public class ConstraintsFactoryImpl extends EFactoryImpl implements ConstraintsFactory {
-    /**
-     * Creates the default factory implementation.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the constraints factory
-     * @generated
-     */
-    public static ConstraintsFactory init() {
-        try {
-            ConstraintsFactory theConstraintsFactory = (ConstraintsFactory)EPackage.Registry.INSTANCE.getEFactory("http://org.eclipse.jst.jsf.core/constraints.ecore");  //$NON-NLS-1$
-            if (theConstraintsFactory != null) {
-                return theConstraintsFactory;
-            }
-        }
-        catch (Exception exception) {
-            EcorePlugin.INSTANCE.log(exception);
-        }
-        return new ConstraintsFactoryImpl();
-    }
-
-    /**
-     * Creates an instance of the factory.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public ConstraintsFactoryImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param eClass 
-     * @return the eobject for the class
-     * @generated
-     */
-    public EObject create(EClass eClass) {
-        switch (eClass.getClassifierID()) {
-            case ConstraintsPackage.TAG_ID: return createTagId();
-            case ConstraintsPackage.TAG_SET: return createTagSet();
-            case ConstraintsPackage.CONTAINS_TAG_CONSTRAINT: return createContainsTagConstraint();
-            default:
-                throw new IllegalArgumentException("The class '" + eClass.getName() + "' is not a valid classifier"); //$NON-NLS-1$ //$NON-NLS-2$
-        }
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new tag id
-     * @generated
-     */
-    public TagId createTagId() {
-        TagIdImpl tagId = new TagIdImpl();
-        return tagId;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new tag set
-     * @generated
-     */
-    public TagSet createTagSet() {
-        TagSetImpl tagSet = new TagSetImpl();
-        return tagSet;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new Contains Tag Constraint
-     * @generated
-     */
-    public ContainsTagConstraint createContainsTagConstraint() {
-        ContainsTagConstraintImpl containsTagConstraint = new ContainsTagConstraintImpl();
-        return containsTagConstraint;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the constraints package
-     * @generated
-     */
-    public ConstraintsPackage getConstraintsPackage() {
-        return (ConstraintsPackage)getEPackage();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the package
-     * @deprecated
-     * @generated
-     */
-    public static ConstraintsPackage getPackage() {
-        return ConstraintsPackage.eINSTANCE;
-    }
-
-} //ConstraintsFactoryImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/constraints/impl/ConstraintsPackageImpl.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/constraints/impl/ConstraintsPackageImpl.java
deleted file mode 100644
index 7e1547e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/constraints/impl/ConstraintsPackageImpl.java
+++ /dev/null
@@ -1,329 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ConstraintsPackageImpl.java,v 1.4 2008/11/18 22:23:52 gkessler Exp $
- */
-package org.eclipse.jst.jsf.validation.internal.constraints.impl;
-
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.EReference;
-
-import org.eclipse.emf.ecore.impl.EPackageImpl;
-
-import org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.TraitTypesPackage;
-
-import org.eclipse.jst.jsf.validation.internal.constraints.ConstraintsFactory;
-import org.eclipse.jst.jsf.validation.internal.constraints.ConstraintsPackage;
-import org.eclipse.jst.jsf.validation.internal.constraints.ContainsTagConstraint;
-import org.eclipse.jst.jsf.validation.internal.constraints.TagId;
-import org.eclipse.jst.jsf.validation.internal.constraints.TagSet;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model <b>Package</b>.
- * <!-- end-user-doc -->
- * @generated
- */
-public class ConstraintsPackageImpl extends EPackageImpl implements ConstraintsPackage {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass tagIdEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass tagSetEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass containsTagConstraintEClass = null;
-
-    /**
-     * Creates an instance of the model <b>Package</b>, registered with
-     * {@link org.eclipse.emf.ecore.EPackage.Registry EPackage.Registry} by the package
-     * package URI value.
-     * <p>Note: the correct way to create the package is via the static
-     * factory method {@link #init init()}, which also performs
-     * initialization of the package, or returns the registered package,
-     * if one already exists.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.emf.ecore.EPackage.Registry
-     * @see org.eclipse.jst.jsf.validation.internal.constraints.ConstraintsPackage#eNS_URI
-     * @see #init()
-     * @generated
-     */
-    private ConstraintsPackageImpl() {
-        super(eNS_URI, ConstraintsFactory.eINSTANCE);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private static boolean isInited = false;
-
-    /**
-     * Creates, registers, and initializes the <b>Package</b> for this
-     * model, and for any others upon which it depends.  Simple
-     * dependencies are satisfied by calling this method on all
-     * dependent packages before doing anything else.  This method drives
-     * initialization for interdependent packages directly, in parallel
-     * with this package, itself.
-     * <p>Of this package and its interdependencies, all packages which
-     * have not yet been registered by their URI values are first created
-     * and registered.  The packages are then initialized in two steps:
-     * meta-model objects for all of the packages are created before any
-     * are initialized, since one package's meta-model objects may refer to
-     * those of another.
-     * <p>Invocation of this method will not affect any packages that have
-     * already been initialized.
-     * <!-- begin-user-doc -->
-     * @return the initialized package 
-     * <!-- end-user-doc -->
-     * @see #eNS_URI
-     * @see #createPackageContents()
-     * @see #initializePackageContents()
-     * @generated
-     */
-    public static ConstraintsPackage init() {
-        if (isInited) return (ConstraintsPackage)EPackage.Registry.INSTANCE.getEPackage(ConstraintsPackage.eNS_URI);
-
-        // Obtain or create and register package
-        ConstraintsPackageImpl theConstraintsPackage = (ConstraintsPackageImpl)(EPackage.Registry.INSTANCE.getEPackage(eNS_URI) instanceof ConstraintsPackageImpl ? EPackage.Registry.INSTANCE.getEPackage(eNS_URI) : new ConstraintsPackageImpl());
-
-        isInited = true;
-
-        // Initialize simple dependencies
-        TraitTypesPackage.eINSTANCE.eClass();
-
-        // Create package meta-data objects
-        theConstraintsPackage.createPackageContents();
-
-        // Initialize created meta-data
-        theConstraintsPackage.initializePackageContents();
-
-        // Mark meta-data to indicate it can't be changed
-        theConstraintsPackage.freeze();
-
-        return theConstraintsPackage;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getTagId() {
-        return tagIdEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getTagId_Uri() {
-        return (EAttribute)tagIdEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getTagId_Name() {
-        return (EAttribute)tagIdEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getTagSet() {
-        return tagSetEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EReference getTagSet_Tags() {
-        return (EReference)tagSetEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getContainsTagConstraint() {
-        return containsTagConstraintEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EReference getContainsTagConstraint_SetGenerator() {
-        return (EReference)containsTagConstraintEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EReference getContainsTagConstraint_SatisfiesSet() {
-        return (EReference)containsTagConstraintEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public ConstraintsFactory getConstraintsFactory() {
-        return (ConstraintsFactory)getEFactoryInstance();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private boolean isCreated = false;
-
-    /**
-     * Creates the meta-model objects for the package.  This method is
-     * guarded to have no affect on any invocation but its first.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void createPackageContents() {
-        if (isCreated) return;
-        isCreated = true;
-
-        // Create classes and their features
-        tagIdEClass = createEClass(TAG_ID);
-        createEAttribute(tagIdEClass, TAG_ID__URI);
-        createEAttribute(tagIdEClass, TAG_ID__NAME);
-
-        tagSetEClass = createEClass(TAG_SET);
-        createEReference(tagSetEClass, TAG_SET__TAGS);
-
-        containsTagConstraintEClass = createEClass(CONTAINS_TAG_CONSTRAINT);
-        createEReference(containsTagConstraintEClass, CONTAINS_TAG_CONSTRAINT__SET_GENERATOR);
-        createEReference(containsTagConstraintEClass, CONTAINS_TAG_CONSTRAINT__SATISFIES_SET);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private boolean isInitialized = false;
-
-    /**
-     * Complete the initialization of the package and its meta-model.  This
-     * method is guarded to have no affect on any invocation but its first.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void initializePackageContents() {
-        if (isInitialized) return;
-        isInitialized = true;
-
-        // Initialize package
-        setName(eNAME);
-        setNsPrefix(eNS_PREFIX);
-        setNsURI(eNS_URI);
-
-        // Obtain other dependent packages
-        TraitTypesPackage theTraitTypesPackage = (TraitTypesPackage)EPackage.Registry.INSTANCE.getEPackage(TraitTypesPackage.eNS_URI);
-
-        // Add supertypes to classes
-
-        // Initialize classes and features; add operations and parameters
-        initEClass(tagIdEClass, TagId.class, "TagId", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-        initEAttribute(getTagId_Uri(), ecorePackage.getEString(), "uri", null, 0, 1, TagId.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-        initEAttribute(getTagId_Name(), ecorePackage.getEString(), "name", null, 0, 1, TagId.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-        initEClass(tagSetEClass, TagSet.class, "TagSet", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-        initEReference(getTagSet_Tags(), this.getTagId(), null, "tags", null, 0, -1, TagSet.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-        initEClass(containsTagConstraintEClass, ContainsTagConstraint.class, "ContainsTagConstraint", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-        initEReference(getContainsTagConstraint_SetGenerator(), theTraitTypesPackage.getSetGenerator(), null, "setGenerator", null, 0, 1, ContainsTagConstraint.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-        initEReference(getContainsTagConstraint_SatisfiesSet(), this.getTagSet(), null, "satisfiesSet", null, 0, 1, ContainsTagConstraint.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-        // Create resource
-        createResource(eNS_URI);
-
-        // Create annotations
-        // http:///org/eclipse/emf/ecore/util/ExtendedMetaData
-        createExtendedMetaDataAnnotations();
-    }
-
-    /**
-     * Initializes the annotations for <b>http:///org/eclipse/emf/ecore/util/ExtendedMetaData</b>.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected void createExtendedMetaDataAnnotations() {
-        String source = "http:///org/eclipse/emf/ecore/util/ExtendedMetaData";		 //$NON-NLS-1$
-        addAnnotation
-          (getTagId_Uri(), 
-           source, 
-           new String[] {
-             "kind", "element", //$NON-NLS-1$ //$NON-NLS-2$
-             "name", "uri" //$NON-NLS-1$ //$NON-NLS-2$
-           });		
-        addAnnotation
-          (getTagId_Name(), 
-           source, 
-           new String[] {
-             "kind", "element", //$NON-NLS-1$ //$NON-NLS-2$
-             "name", "name" //$NON-NLS-1$ //$NON-NLS-2$
-           });		
-        addAnnotation
-          (getTagSet_Tags(), 
-           source, 
-           new String[] {
-             "kind", "element", //$NON-NLS-1$ //$NON-NLS-2$
-             "name", "tagId" //$NON-NLS-1$ //$NON-NLS-2$
-           });		
-        addAnnotation
-          (getContainsTagConstraint_SetGenerator(), 
-           source, 
-           new String[] {
-             "kind", "element", //$NON-NLS-1$ //$NON-NLS-2$
-             "name", "set-generator" //$NON-NLS-1$ //$NON-NLS-2$
-           });		
-        addAnnotation
-          (getContainsTagConstraint_SatisfiesSet(), 
-           source, 
-           new String[] {
-             "kind", "element", //$NON-NLS-1$ //$NON-NLS-2$
-             "name", "satisfies-set" //$NON-NLS-1$ //$NON-NLS-2$
-           });
-    }
-
-} //ConstraintsPackageImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/constraints/impl/ContainsTagConstraintImpl.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/constraints/impl/ContainsTagConstraintImpl.java
deleted file mode 100644
index d3fad71..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/constraints/impl/ContainsTagConstraintImpl.java
+++ /dev/null
@@ -1,220 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ContainsTagConstraintImpl.java,v 1.3 2007/04/16 19:53:19 itrimble Exp $
- */
-package org.eclipse.jst.jsf.validation.internal.constraints.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-
-import org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.SetGenerator;
-
-import org.eclipse.jst.jsf.validation.internal.constraints.ConstraintsPackage;
-import org.eclipse.jst.jsf.validation.internal.constraints.ContainsTagConstraint;
-import org.eclipse.jst.jsf.validation.internal.constraints.TagSet;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Contains Tag Constraint</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.validation.internal.constraints.impl.ContainsTagConstraintImpl#getSetGenerator <em>Set Generator</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.validation.internal.constraints.impl.ContainsTagConstraintImpl#getSatisfiesSet <em>Satisfies Set</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ContainsTagConstraintImpl extends EObjectImpl implements ContainsTagConstraint {
-    /**
-     * The cached value of the '{@link #getSetGenerator() <em>Set Generator</em>}' reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getSetGenerator()
-     * @generated
-     * @ordered
-     */
-    protected SetGenerator setGenerator = null;
-
-    /**
-     * The cached value of the '{@link #getSatisfiesSet() <em>Satisfies Set</em>}' reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getSatisfiesSet()
-     * @generated
-     * @ordered
-     */
-    protected TagSet satisfiesSet = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected ContainsTagConstraintImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected EClass eStaticClass() {
-        return ConstraintsPackage.Literals.CONTAINS_TAG_CONSTRAINT;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public SetGenerator getSetGenerator() {
-        if (setGenerator != null && setGenerator.eIsProxy()) {
-            InternalEObject oldSetGenerator = (InternalEObject)setGenerator;
-            setGenerator = (SetGenerator)eResolveProxy(oldSetGenerator);
-            if (setGenerator != oldSetGenerator) {
-                if (eNotificationRequired())
-                    eNotify(new ENotificationImpl(this, Notification.RESOLVE, ConstraintsPackage.CONTAINS_TAG_CONSTRAINT__SET_GENERATOR, oldSetGenerator, setGenerator));
-            }
-        }
-        return setGenerator;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return the set generator
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public SetGenerator basicGetSetGenerator() {
-        return setGenerator;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setSetGenerator(SetGenerator newSetGenerator) {
-        SetGenerator oldSetGenerator = setGenerator;
-        setGenerator = newSetGenerator;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, ConstraintsPackage.CONTAINS_TAG_CONSTRAINT__SET_GENERATOR, oldSetGenerator, setGenerator));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public TagSet getSatisfiesSet() {
-        if (satisfiesSet != null && satisfiesSet.eIsProxy()) {
-            InternalEObject oldSatisfiesSet = (InternalEObject)satisfiesSet;
-            satisfiesSet = (TagSet)eResolveProxy(oldSatisfiesSet);
-            if (satisfiesSet != oldSatisfiesSet) {
-                if (eNotificationRequired())
-                    eNotify(new ENotificationImpl(this, Notification.RESOLVE, ConstraintsPackage.CONTAINS_TAG_CONSTRAINT__SATISFIES_SET, oldSatisfiesSet, satisfiesSet));
-            }
-        }
-        return satisfiesSet;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return the tag set that must be satisfied 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public TagSet basicGetSatisfiesSet() {
-        return satisfiesSet;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setSatisfiesSet(TagSet newSatisfiesSet) {
-        TagSet oldSatisfiesSet = satisfiesSet;
-        satisfiesSet = newSatisfiesSet;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, ConstraintsPackage.CONTAINS_TAG_CONSTRAINT__SATISFIES_SET, oldSatisfiesSet, satisfiesSet));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case ConstraintsPackage.CONTAINS_TAG_CONSTRAINT__SET_GENERATOR:
-                if (resolve) return getSetGenerator();
-                return basicGetSetGenerator();
-            case ConstraintsPackage.CONTAINS_TAG_CONSTRAINT__SATISFIES_SET:
-                if (resolve) return getSatisfiesSet();
-                return basicGetSatisfiesSet();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eSet(int featureID, Object newValue) {
-        switch (featureID) {
-            case ConstraintsPackage.CONTAINS_TAG_CONSTRAINT__SET_GENERATOR:
-                setSetGenerator((SetGenerator)newValue);
-                return;
-            case ConstraintsPackage.CONTAINS_TAG_CONSTRAINT__SATISFIES_SET:
-                setSatisfiesSet((TagSet)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eUnset(int featureID) {
-        switch (featureID) {
-            case ConstraintsPackage.CONTAINS_TAG_CONSTRAINT__SET_GENERATOR:
-                setSetGenerator((SetGenerator)null);
-                return;
-            case ConstraintsPackage.CONTAINS_TAG_CONSTRAINT__SATISFIES_SET:
-                setSatisfiesSet((TagSet)null);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case ConstraintsPackage.CONTAINS_TAG_CONSTRAINT__SET_GENERATOR:
-                return setGenerator != null;
-            case ConstraintsPackage.CONTAINS_TAG_CONSTRAINT__SATISFIES_SET:
-                return satisfiesSet != null;
-        }
-        return super.eIsSet(featureID);
-    }
-
-} //ContainsTagConstraintImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/constraints/impl/TagIdImpl.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/constraints/impl/TagIdImpl.java
deleted file mode 100644
index be7dbce..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/constraints/impl/TagIdImpl.java
+++ /dev/null
@@ -1,215 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: TagIdImpl.java,v 1.2 2008/11/18 22:23:52 gkessler Exp $
- */
-package org.eclipse.jst.jsf.validation.internal.constraints.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-
-import org.eclipse.emf.ecore.EClass;
-
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-
-import org.eclipse.jst.jsf.validation.internal.constraints.ConstraintsPackage;
-import org.eclipse.jst.jsf.validation.internal.constraints.TagId;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Tag Id</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.validation.internal.constraints.impl.TagIdImpl#getUri <em>Uri</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.validation.internal.constraints.impl.TagIdImpl#getName <em>Name</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class TagIdImpl extends EObjectImpl implements TagId {
-    /**
-     * The default value of the '{@link #getUri() <em>Uri</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getUri()
-     * @generated
-     * @ordered
-     */
-    protected static final String URI_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getUri() <em>Uri</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getUri()
-     * @generated
-     * @ordered
-     */
-    protected String uri = URI_EDEFAULT;
-
-    /**
-     * The default value of the '{@link #getName() <em>Name</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getName()
-     * @generated
-     * @ordered
-     */
-    protected static final String NAME_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getName() <em>Name</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getName()
-     * @generated
-     * @ordered
-     */
-    protected String name = NAME_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected TagIdImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected EClass eStaticClass() {
-        return ConstraintsPackage.Literals.TAG_ID;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String getUri() {
-        return uri;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setUri(String newUri) {
-        String oldUri = uri;
-        uri = newUri;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, ConstraintsPackage.TAG_ID__URI, oldUri, uri));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String getName() {
-        return name;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setName(String newName) {
-        String oldName = name;
-        name = newName;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, ConstraintsPackage.TAG_ID__NAME, oldName, name));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case ConstraintsPackage.TAG_ID__URI:
-                return getUri();
-            case ConstraintsPackage.TAG_ID__NAME:
-                return getName();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eSet(int featureID, Object newValue) {
-        switch (featureID) {
-            case ConstraintsPackage.TAG_ID__URI:
-                setUri((String)newValue);
-                return;
-            case ConstraintsPackage.TAG_ID__NAME:
-                setName((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eUnset(int featureID) {
-        switch (featureID) {
-            case ConstraintsPackage.TAG_ID__URI:
-                setUri(URI_EDEFAULT);
-                return;
-            case ConstraintsPackage.TAG_ID__NAME:
-                setName(NAME_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case ConstraintsPackage.TAG_ID__URI:
-                return URI_EDEFAULT == null ? uri != null : !URI_EDEFAULT.equals(uri);
-            case ConstraintsPackage.TAG_ID__NAME:
-                return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT.equals(name);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (uri: "); //$NON-NLS-1$
-        result.append(uri);
-        result.append(", name: "); //$NON-NLS-1$
-        result.append(name);
-        result.append(')');
-        return result.toString();
-    }
-
-} //TagIdImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/constraints/impl/TagSetImpl.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/constraints/impl/TagSetImpl.java
deleted file mode 100644
index f389914..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/constraints/impl/TagSetImpl.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: TagSetImpl.java,v 1.1 2007/02/28 21:16:02 cbateman Exp $
- */
-package org.eclipse.jst.jsf.validation.internal.constraints.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.util.EList;
-
-import org.eclipse.emf.ecore.EClass;
-
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-
-import org.eclipse.emf.ecore.util.EObjectResolvingEList;
-
-import org.eclipse.jst.jsf.validation.internal.constraints.ConstraintsPackage;
-import org.eclipse.jst.jsf.validation.internal.constraints.TagId;
-import org.eclipse.jst.jsf.validation.internal.constraints.TagSet;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Tag Set</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.validation.internal.constraints.impl.TagSetImpl#getTags <em>Tags</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class TagSetImpl extends EObjectImpl implements TagSet {
-    /**
-     * The cached value of the '{@link #getTags() <em>Tags</em>}' reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getTags()
-     * @generated
-     * @ordered
-     */
-    protected EList tags = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected TagSetImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected EClass eStaticClass() {
-        return ConstraintsPackage.Literals.TAG_SET;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EList getTags() {
-        if (tags == null) {
-            tags = new EObjectResolvingEList(TagId.class, this, ConstraintsPackage.TAG_SET__TAGS);
-        }
-        return tags;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case ConstraintsPackage.TAG_SET__TAGS:
-                return getTags();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eSet(int featureID, Object newValue) {
-        switch (featureID) {
-            case ConstraintsPackage.TAG_SET__TAGS:
-                getTags().clear();
-                getTags().addAll((Collection)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eUnset(int featureID) {
-        switch (featureID) {
-            case ConstraintsPackage.TAG_SET__TAGS:
-                getTags().clear();
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case ConstraintsPackage.TAG_SET__TAGS:
-                return tags != null && !tags.isEmpty();
-        }
-        return super.eIsSet(featureID);
-    }
-
-} //TagSetImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/constraints/util/ConstraintsAdapterFactory.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/constraints/util/ConstraintsAdapterFactory.java
deleted file mode 100644
index ff1de0e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/constraints/util/ConstraintsAdapterFactory.java
+++ /dev/null
@@ -1,154 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ConstraintsAdapterFactory.java,v 1.1 2007/02/28 21:16:02 cbateman Exp $
- */
-package org.eclipse.jst.jsf.validation.internal.constraints.util;
-
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.common.notify.Notifier;
-
-import org.eclipse.emf.common.notify.impl.AdapterFactoryImpl;
-
-import org.eclipse.emf.ecore.EObject;
-
-import org.eclipse.jst.jsf.validation.internal.constraints.*;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Adapter Factory</b> for the model.
- * It provides an adapter <code>createXXX</code> method for each class of the model.
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.jsf.validation.internal.constraints.ConstraintsPackage
- * @generated
- */
-public class ConstraintsAdapterFactory extends AdapterFactoryImpl {
-    /**
-     * The cached model package.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected static ConstraintsPackage modelPackage;
-
-    /**
-     * Creates an instance of the adapter factory.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public ConstraintsAdapterFactory() {
-        if (modelPackage == null) {
-            modelPackage = ConstraintsPackage.eINSTANCE;
-        }
-    }
-
-    /**
-     * Returns whether this factory is applicable for the type of the object.
-     * <!-- begin-user-doc -->
-     * This implementation returns <code>true</code> if the object is either the model's package or is an instance object of the model.
-     * <!-- end-user-doc -->
-     * @return whether this factory is applicable for the type of the object.
-     * @generated
-     */
-    public boolean isFactoryForType(Object object) {
-        if (object == modelPackage) {
-            return true;
-        }
-        if (object instanceof EObject) {
-            return ((EObject)object).eClass().getEPackage() == modelPackage;
-        }
-        return false;
-    }
-
-    /**
-     * The switch the delegates to the <code>createXXX</code> methods.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected ConstraintsSwitch modelSwitch =
-        new ConstraintsSwitch() {
-            public Object caseTagId(TagId object) {
-                return createTagIdAdapter();
-            }
-            public Object caseTagSet(TagSet object) {
-                return createTagSetAdapter();
-            }
-            public Object caseContainsTagConstraint(ContainsTagConstraint object) {
-                return createContainsTagConstraintAdapter();
-            }
-            public Object defaultCase(EObject object) {
-                return createEObjectAdapter();
-            }
-        };
-
-    /**
-     * Creates an adapter for the <code>target</code>.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param target the object to adapt.
-     * @return the adapter for the <code>target</code>.
-     * @generated
-     */
-    public Adapter createAdapter(Notifier target) {
-        return (Adapter)modelSwitch.doSwitch((EObject)target);
-    }
-
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.validation.internal.constraints.TagId <em>Tag Id</em>}'.
-     * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.validation.internal.constraints.TagId
-     * @generated
-     */
-    public Adapter createTagIdAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.validation.internal.constraints.TagSet <em>Tag Set</em>}'.
-     * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.validation.internal.constraints.TagSet
-     * @generated
-     */
-    public Adapter createTagSetAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.validation.internal.constraints.ContainsTagConstraint <em>Contains Tag Constraint</em>}'.
-     * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.validation.internal.constraints.ContainsTagConstraint
-     * @generated
-     */
-    public Adapter createContainsTagConstraintAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for the default case.
-     * <!-- begin-user-doc -->
-     * This default implementation returns null.
-     * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @generated
-     */
-    public Adapter createEObjectAdapter() {
-        return null;
-    }
-
-} //ConstraintsAdapterFactory
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/constraints/util/ConstraintsResourceFactoryImpl.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/constraints/util/ConstraintsResourceFactoryImpl.java
deleted file mode 100644
index e0da2ca..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/constraints/util/ConstraintsResourceFactoryImpl.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ConstraintsResourceFactoryImpl.java,v 1.1 2007/02/28 21:16:02 cbateman Exp $
- */
-package org.eclipse.jst.jsf.validation.internal.constraints.util;
-
-import org.eclipse.emf.common.util.URI;
-
-import org.eclipse.emf.ecore.resource.Resource;
-
-import org.eclipse.emf.ecore.resource.impl.ResourceFactoryImpl;
-
-import org.eclipse.emf.ecore.xmi.XMLResource;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Resource Factory</b> associated with the package.
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.jsf.validation.internal.constraints.util.ConstraintsResourceImpl
- * @generated
- */
-public class ConstraintsResourceFactoryImpl extends ResourceFactoryImpl {
-    /**
-     * Creates an instance of the resource factory.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public ConstraintsResourceFactoryImpl() {
-        super();
-    }
-
-    /**
-     * Creates an instance of the resource.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Resource createResource(URI uri) {
-        XMLResource result = new ConstraintsResourceImpl(uri);
-        result.getDefaultSaveOptions().put(XMLResource.OPTION_EXTENDED_META_DATA, Boolean.TRUE);
-        result.getDefaultLoadOptions().put(XMLResource.OPTION_EXTENDED_META_DATA, Boolean.TRUE);
-
-        result.getDefaultSaveOptions().put(XMLResource.OPTION_SCHEMA_LOCATION, Boolean.TRUE);
-
-        result.getDefaultLoadOptions().put(XMLResource.OPTION_USE_ENCODED_ATTRIBUTE_STYLE, Boolean.TRUE);
-        result.getDefaultSaveOptions().put(XMLResource.OPTION_USE_ENCODED_ATTRIBUTE_STYLE, Boolean.TRUE);
-
-        result.getDefaultLoadOptions().put(XMLResource.OPTION_USE_LEXICAL_HANDLER, Boolean.TRUE);
-        return result;
-    }
-
-} //ConstraintsResourceFactoryImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/constraints/util/ConstraintsResourceImpl.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/constraints/util/ConstraintsResourceImpl.java
deleted file mode 100644
index c397df0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/constraints/util/ConstraintsResourceImpl.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ConstraintsResourceImpl.java,v 1.1 2007/02/28 21:16:02 cbateman Exp $
- */
-package org.eclipse.jst.jsf.validation.internal.constraints.util;
-
-import org.eclipse.emf.common.util.URI;
-
-import org.eclipse.emf.ecore.xmi.impl.XMLResourceImpl;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Resource </b> associated with the package.
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.jsf.validation.internal.constraints.util.ConstraintsResourceFactoryImpl
- * @generated
- */
-public class ConstraintsResourceImpl extends XMLResourceImpl {
-    /**
-     * Creates an instance of the resource.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param uri the URI of the new resource.
-     * @generated
-     */
-    public ConstraintsResourceImpl(URI uri) {
-        super(uri);
-    }
-
-} //ConstraintsResourceImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/constraints/util/ConstraintsSwitch.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/constraints/util/ConstraintsSwitch.java
deleted file mode 100644
index 9628616..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/constraints/util/ConstraintsSwitch.java
+++ /dev/null
@@ -1,175 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ConstraintsSwitch.java,v 1.2 2007/04/09 02:40:07 cbateman Exp $
- */
-package org.eclipse.jst.jsf.validation.internal.constraints.util;
-
-import java.util.List;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-
-import org.eclipse.jst.jsf.validation.internal.constraints.*;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Switch</b> for the model's inheritance hierarchy.
- * It supports the call {@link #doSwitch(EObject) doSwitch(object)}
- * to invoke the <code>caseXXX</code> method for each class of the model,
- * starting with the actual class of the object
- * and proceeding up the inheritance hierarchy
- * until a non-null result is returned,
- * which is the result of the switch.
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.jsf.validation.internal.constraints.ConstraintsPackage
- * @generated
- */
-public class ConstraintsSwitch {
-    /**
-     * The cached model package
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected static ConstraintsPackage modelPackage;
-
-    /**
-     * Creates an instance of the switch.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public ConstraintsSwitch() {
-        if (modelPackage == null) {
-            modelPackage = ConstraintsPackage.eINSTANCE;
-        }
-    }
-
-    /**
-     * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
-     * <!-- begin-user-doc -->
-     * @param theEObject 
-     * <!-- end-user-doc -->
-     * @return the first non-null result returned by a <code>caseXXX</code> call.
-     * @generated
-     */
-    public Object doSwitch(EObject theEObject) {
-        return doSwitch(theEObject.eClass(), theEObject);
-    }
-
-    /**
-     * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
-     * <!-- begin-user-doc -->
-     * @param theEClass 
-     * @param theEObject 
-     * <!-- end-user-doc -->
-     * @return the first non-null result returned by a <code>caseXXX</code> call.
-     * @generated
-     */
-    protected Object doSwitch(EClass theEClass, EObject theEObject) {
-        if (theEClass.eContainer() == modelPackage) {
-            return doSwitch(theEClass.getClassifierID(), theEObject);
-        }
-        List eSuperTypes = theEClass.getESuperTypes();
-        return
-            eSuperTypes.isEmpty() ?
-                defaultCase(theEObject) :
-                doSwitch((EClass)eSuperTypes.get(0), theEObject);
-    }
-
-    /**
-     * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
-     * <!-- begin-user-doc -->
-     * @param classifierID 
-     * @param theEObject 
-     * <!-- end-user-doc -->
-     * @return the first non-null result returned by a <code>caseXXX</code> call.
-     * @generated
-     */
-    protected Object doSwitch(int classifierID, EObject theEObject) {
-        switch (classifierID) {
-            case ConstraintsPackage.TAG_ID: {
-                TagId tagId = (TagId)theEObject;
-                Object result = caseTagId(tagId);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case ConstraintsPackage.TAG_SET: {
-                TagSet tagSet = (TagSet)theEObject;
-                Object result = caseTagSet(tagSet);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case ConstraintsPackage.CONTAINS_TAG_CONSTRAINT: {
-                ContainsTagConstraint containsTagConstraint = (ContainsTagConstraint)theEObject;
-                Object result = caseContainsTagConstraint(containsTagConstraint);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            default: return defaultCase(theEObject);
-        }
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>Tag Id</em>'.
-     * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>Tag Id</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-    public Object caseTagId(TagId object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>Tag Set</em>'.
-     * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>Tag Set</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-    public Object caseTagSet(TagSet object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>Contains Tag Constraint</em>'.
-     * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>Contains Tag Constraint</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-    public Object caseContainsTagConstraint(ContainsTagConstraint object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>EObject</em>'.
-     * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch, but this is the last case anyway.
-     * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>EObject</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject)
-     * @generated
-     */
-    public Object defaultCase(EObject object) {
-        return null;
-    }
-
-} //ConstraintsSwitch
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/constraints/util/ConstraintsXMLProcessor.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/constraints/util/ConstraintsXMLProcessor.java
deleted file mode 100644
index 3d80420..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/constraints/util/ConstraintsXMLProcessor.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ConstraintsXMLProcessor.java,v 1.1 2007/02/28 21:16:02 cbateman Exp $
- */
-package org.eclipse.jst.jsf.validation.internal.constraints.util;
-
-import java.util.Map;
-
-import org.eclipse.emf.ecore.EPackage;
-
-import org.eclipse.emf.ecore.xmi.util.XMLProcessor;
-
-import org.eclipse.jst.jsf.validation.internal.constraints.ConstraintsPackage;
-
-/**
- * This class contains helper methods to serialize and deserialize XML documents
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class ConstraintsXMLProcessor extends XMLProcessor {
-    /**
-     * Public constructor to instantiate the helper.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public ConstraintsXMLProcessor() {
-        super((EPackage.Registry.INSTANCE));
-        ConstraintsPackage.eINSTANCE.eClass();
-    }
-    
-    /**
-     * Register for "*" and "xml" file extensions the ConstraintsResourceFactoryImpl factory.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected Map getRegistrations() {
-        if (registrations == null) {
-            super.getRegistrations();
-            registrations.put(XML_EXTENSION, new ConstraintsResourceFactoryImpl());
-            registrations.put(STAR_EXTENSION, new ConstraintsResourceFactoryImpl());
-        }
-        return registrations;
-    }
-
-} //ConstraintsXMLProcessor
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/ASTSemanticValidator.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/ASTSemanticValidator.java
deleted file mode 100644
index 1ee65f5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/ASTSemanticValidator.java
+++ /dev/null
@@ -1,612 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- * 
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.validation.internal.el;
-
-import java.io.IOException;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.emf.common.util.Diagnostic;
-import org.eclipse.jst.jsf.common.internal.types.BooleanLiteralType;
-import org.eclipse.jst.jsf.common.internal.types.FloatLiteralType;
-import org.eclipse.jst.jsf.common.internal.types.IntegerLiteralType;
-import org.eclipse.jst.jsf.common.internal.types.LiteralType;
-import org.eclipse.jst.jsf.common.internal.types.MethodType;
-import org.eclipse.jst.jsf.common.internal.types.NullLiteralType;
-import org.eclipse.jst.jsf.common.internal.types.SignatureBasedType;
-import org.eclipse.jst.jsf.common.internal.types.StringLiteralType;
-import org.eclipse.jst.jsf.common.internal.types.ValueType;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IStructuredDocumentContextResolverFactory;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IWorkspaceContextResolver;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.jst.jsf.context.symbol.IInstanceSymbol;
-import org.eclipse.jst.jsf.context.symbol.IPropertySymbol;
-import org.eclipse.jst.jsf.context.symbol.ISymbol;
-import org.eclipse.jst.jsf.context.symbol.internal.util.IObjectSymbolBasedValueType;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.designtime.resolver.IStructuredDocumentSymbolResolverFactory;
-import org.eclipse.jst.jsf.designtime.resolver.ISymbolContextResolver;
-import org.eclipse.jst.jsf.validation.internal.IJSFViewValidator.IValidationReporter;
-import org.eclipse.jst.jsf.validation.internal.el.diagnostics.DiagnosticFactory;
-import org.eclipse.jst.jsf.validation.internal.el.operators.BinaryOperator;
-import org.eclipse.jst.jsf.validation.internal.el.operators.BracketOperator;
-import org.eclipse.jst.jsf.validation.internal.el.operators.DotOperator;
-import org.eclipse.jst.jsf.validation.internal.el.operators.TernaryChoiceOperator;
-import org.eclipse.jst.jsf.validation.internal.el.operators.UnaryOperator;
-import org.eclipse.jst.jsp.core.internal.java.jspel.ASTAddExpression;
-import org.eclipse.jst.jsp.core.internal.java.jspel.ASTAndExpression;
-import org.eclipse.jst.jsp.core.internal.java.jspel.ASTChoiceExpression;
-import org.eclipse.jst.jsp.core.internal.java.jspel.ASTEqualityExpression;
-import org.eclipse.jst.jsp.core.internal.java.jspel.ASTExpression;
-import org.eclipse.jst.jsp.core.internal.java.jspel.ASTFunctionInvocation;
-import org.eclipse.jst.jsp.core.internal.java.jspel.ASTLiteral;
-import org.eclipse.jst.jsp.core.internal.java.jspel.ASTMultiplyExpression;
-import org.eclipse.jst.jsp.core.internal.java.jspel.ASTOperatorExpression;
-import org.eclipse.jst.jsp.core.internal.java.jspel.ASTOrExpression;
-import org.eclipse.jst.jsp.core.internal.java.jspel.ASTRelationalExpression;
-import org.eclipse.jst.jsp.core.internal.java.jspel.ASTUnaryExpression;
-import org.eclipse.jst.jsp.core.internal.java.jspel.ASTValue;
-import org.eclipse.jst.jsp.core.internal.java.jspel.ASTValuePrefix;
-import org.eclipse.jst.jsp.core.internal.java.jspel.ASTValueSuffix;
-import org.eclipse.jst.jsp.core.internal.java.jspel.JSPELParser;
-import org.eclipse.jst.jsp.core.internal.java.jspel.JSPELParserConstants;
-import org.eclipse.jst.jsp.core.internal.java.jspel.JSPELParserVisitor;
-import org.eclipse.jst.jsp.core.internal.java.jspel.ParseException;
-import org.eclipse.jst.jsp.core.internal.java.jspel.SimpleNode;
-import org.eclipse.jst.jsp.core.internal.java.jspel.Token;
-
-
-class ASTSemanticValidator implements JSPELParserVisitor, IExpressionSemanticValidator
-{
-    private final IFile                             _targetFile;
-    private final ASTExpression                     _expr;
-    private final IStructuredDocumentContext        _context;
-    private final ISymbolContextResolver            _symbolResolver;
-//    private final List<IMessage>                    _messages;
-    private final EvaluationTracker                 _tracker;
-    private final DiagnosticFactory                 _diagnosticFactory;
-    private final IValidationReporter               _reporter;
-
-    ASTSemanticValidator(final ASTExpression expr,
-            final IStructuredDocumentContext context,
-            final IStructuredDocumentSymbolResolverFactory symbolResolverFactory,
-            final IValidationReporter reporter)
-    {
-        final IWorkspaceContextResolver resolver = IStructuredDocumentContextResolverFactory.INSTANCE
-                .getWorkspaceContextResolver(context);
-
-        if (resolver != null)
-        {
-            _targetFile = (IFile) resolver.getResource();
-        }
-        else
-        {
-            _targetFile = null;
-        }
-
-        _expr = expr;
-        _context = context;
-        _symbolResolver = symbolResolverFactory.getSymbolContextResolver(context);
-        _tracker = new EvaluationTracker();
-        _diagnosticFactory = new DiagnosticFactory();
-        _reporter = reporter;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.jsf.validation.internal.el.IExpressionSemanticValidator#validate()
-     */
-    public void validate()
-    {
-        _expr.jjtAccept(this, _tracker);
-    }
-
-    public Object visit(final ASTAddExpression node, final Object data)
-    {
-        performBinaryEvaluation(node, (EvaluationTracker)data);
-        return data;
-    }
-
-    public Object visit(final ASTAndExpression node, final Object data)
-    {
-        performBinaryEvaluation(node, (EvaluationTracker)data);
-        return data;
-    }
-
-    public Object visit(final ASTChoiceExpression node, final Object data)
-    {
-        if (node.jjtGetNumChildren() != 3)
-        {
-            throw new AssertionError("Binary operators should always have two sub-expressions");  //$NON-NLS-1$
-        }
-
-        // evaluate choice argument
-        node.jjtGetChild(0).jjtAccept(this, data);
-        final ValueType choiceArg = ((EvaluationTracker)data).getValueType();
-        // evaluate when true argument
-        node.jjtGetChild(1).jjtAccept(this, data);
-        final ValueType whenTrueArg = ((EvaluationTracker)data).getValueType();
-        //evaluate when false argument
-        node.jjtGetChild(2).jjtAccept(this, data);
-        final ValueType whenFalseArg = ((EvaluationTracker)data).getValueType();
-
-
-        if (choiceArg != null && whenTrueArg != null && whenFalseArg != null)
-        {
-            final TernaryChoiceOperator operator =
-                new TernaryChoiceOperator(_diagnosticFactory);
-
-            final Diagnostic diagnostic =
-                operator.validate(choiceArg/* whenTrueArg, whenFalseArg*/);
-
-            if (diagnostic.getSeverity() != Diagnostic.OK)
-            {
-                final Token firstToken = node.getFirstToken();
-                final int offset = _context.getDocumentPosition() + firstToken.beginColumn - 1;
-                final int length = node.getLastToken().endColumn - firstToken.beginColumn+1;
-                _reporter.report(diagnostic, offset, length);
-            }
-
-            ((EvaluationTracker)data).setType(operator.perform(choiceArg, whenTrueArg, whenFalseArg));
-        }
-        else
-        {
-            ((EvaluationTracker)data).setType(null);
-        }
-
-        return data;
-    }
-
-    public Object visit(final ASTEqualityExpression node, final Object data)
-    {
-        performBinaryEvaluation(node, (EvaluationTracker)data);
-        return data;
-    }
-
-    public Object visit(final ASTExpression node, final Object data) {
-        return node.childrenAccept(this, data);
-    }
-
-    public Object visit(final ASTFunctionInvocation node, final Object data)
-    {
-        // when we see a function invocation, null the type
-        // we do not validate function invocations currently
-        final Object retVal = node.childrenAccept(this, data);
-        ((EvaluationTracker)data).setType(null);
-        return retVal;
-    }
-
-    public Object visit(final ASTLiteral node, final Object data)
-    {
-        // note, there is an implicit assumption here that literals
-        // are all terminals (leafs in the tree)
-        if (node.jjtGetNumChildren() > 0)
-        {
-            throw new AssertionError("Literals should be terminal"); //$NON-NLS-1$
-        }
-
-        LiteralType type = null;
-
-        final Token  literalToken = node.getFirstToken();
-
-        switch (literalToken.kind)
-        {
-            case JSPELParserConstants.STRING_LITERAL:
-                type = new StringLiteralType(stripQuotes(literalToken.image));
-                break;
-
-            case JSPELParserConstants.INTEGER_LITERAL:
-                type = new IntegerLiteralType(Long.parseLong(literalToken.image));
-                break;
-
-            case JSPELParserConstants.FLOATING_POINT_LITERAL:
-                type = new FloatLiteralType(Double.parseDouble(literalToken.image));
-                break;
-
-            case JSPELParserConstants.FALSE:
-                type = BooleanLiteralType.FALSE;
-                break;
-
-            case JSPELParserConstants.TRUE:
-                type = BooleanLiteralType.TRUE;
-                break;
-
-            case JSPELParserConstants.NULL:
-                type = NullLiteralType.SINGLETON;
-                break;
-
-            default:
-                JSFCorePlugin.log("Unknown EL literal: " +literalToken.toString(), new Throwable("This throwable simply used to mark a stack trace")); //$NON-NLS-1$ //$NON-NLS-2$
-        }
-
-        ((EvaluationTracker)data).setType(type);
-        return data;
-    }
-
-    private String stripQuotes(final String stringLiteral)
-    {
-        if (stringLiteral.startsWith("'") //$NON-NLS-1$
-                || stringLiteral.startsWith("\"")) //$NON-NLS-1$
-
-        {
-            if (stringLiteral.length() > 2)
-            {
-                // take 'literal' -> literal
-                return stringLiteral.substring(1, stringLiteral.length()-1);
-            }
-            // if only two characters, then the empty string
-            return ""; //$NON-NLS-1$
-        }
-
-        return stringLiteral;
-    }
-
-    public Object visit(final ASTMultiplyExpression node, final Object data)
-    {
-        performBinaryEvaluation(node, (EvaluationTracker)data);
-        return data;
-    }
-
-    public Object visit(final ASTOrExpression node, final Object data)
-    {
-        performBinaryEvaluation(node, (EvaluationTracker)data);
-        return data;
-    }
-
-    public Object visit(final ASTRelationalExpression node, final Object data)
-    {
-        performBinaryEvaluation(node, (EvaluationTracker)data);
-        return data;
-    }
-
-    public Object visit(final ASTUnaryExpression node, final Object data)
-    {
-        // assertion here is that this expression decomposes:
-        // UnaryExpr -> Value
-        // UnaryExpr -> UnaryOp UnaryExpression
-        // since UnaryOp is a terminal (-,!,not,empty) node will
-        // always have exactly one child
-        node.childrenAccept(this, data);
-        final SignatureBasedType type = ((EvaluationTracker)data).getType();
-
-        if (type != null)
-        {
-            final Token  firstToken = node.getFirstToken();
-            if (UnaryOperator.isUnaryOperator(firstToken))
-            {
-                if (type instanceof ValueType)
-                {
-                    final UnaryOperator unaryOp = UnaryOperator.createUnaryOperator(firstToken, _diagnosticFactory);
-                    final Diagnostic diagnostic = unaryOp.validate((ValueType)type);
-
-                    if (diagnostic.getSeverity() != Diagnostic.OK)
-                    {
-                        final int offset = _context.getDocumentPosition() + firstToken.beginColumn - 1;
-                        final int length = node.getLastToken().endColumn - firstToken.beginColumn+1;
-                        _reporter.report(diagnostic, offset, length);
-                    }
-
-                    ((EvaluationTracker)data).
-                    setType(unaryOp.performOperation ((ValueType)type));
-                }
-                // cannot apply operations to method bindings
-                else
-                {
-                    final int offset = _context.getDocumentPosition() +
-                    firstToken.beginColumn - 1;
-                    final int length = node.getLastToken().endColumn -
-                    firstToken.beginColumn+1;
-
-                    Diagnostic diagnostic = 
-                        _diagnosticFactory.create_CANNOT_APPLY_OPERATOR_TO_METHOD_BINDING();
-                    
-                    _reporter.report(diagnostic, offset, length);
-                }
-            }
-        }
-
-        return data;
-    }
-
-    public Object visit(final ASTValue node, final Object data) {
-        final ValueExpressionTracker  tracker = new ValueExpressionTracker();
-
-        ((EvaluationTracker)data).setValueTracker(tracker);
-
-        node.childrenAccept(this, data);
-
-        final SignatureBasedType type = ((EvaluationTracker)data).getType();
-
-        // now check the tracker.  If the last property in the expression
-        // is non-null (i.e. the value has one or more suffices) then we
-        // to very the leaf node (i.e. 'z' in #{x.y.z}) is more than just
-        // an intermediate value used to get to other properties
-        if (type instanceof IObjectSymbolBasedValueType
-                && ((IObjectSymbolBasedValueType)type).getSymbol() instanceof IPropertySymbol
-                && ((IPropertySymbol)((IObjectSymbolBasedValueType)type).getSymbol()).isIntermediate())
-        {
-            final int offset = tracker.getCurPropertySymbolOffset();
-            final int length = tracker.getCurPropertySymbolLength();
-            final Diagnostic diagnostic = 
-                _diagnosticFactory.create_MEMBER_IS_INTERMEDIATE(
-                        ((IPropertySymbol)((IObjectSymbolBasedValueType)type).getSymbol()).getName());
-            _reporter.report(diagnostic, offset, length);
-        }
-
-        return data;
-    }
-
-    public Object visit(final ASTValuePrefix node, final Object data)
-    {
-        if (node.jjtGetNumChildren() == 0)
-        {
-            final Token token = node.getFirstToken();
-            final String image = token.image;
-
-            final ISymbol symbol = _symbolResolver.getVariable(image);
-
-            if (symbol == null)
-            {
-                final int offset =
-                    _context.getDocumentPosition() + token.beginColumn - 1;
-                final int length = token.endColumn - token.beginColumn + 1;
-
-                final Diagnostic diagnostic =
-                    _diagnosticFactory.create_VARIABLE_NOT_FOUND(image);
-
-                if (diagnostic.getSeverity() != Diagnostic.OK)
-                {
-                    _reporter.report(diagnostic, offset, length);
-                }
-            }
-            else if (symbol instanceof IInstanceSymbol)
-            {
-                final IObjectSymbolBasedValueType symbolType =
-                    IObjectSymbolBasedValueType.getInstance(symbol);
-                ((EvaluationTracker) data).setType(symbolType);
-            }
-        }
-
-        return node.childrenAccept(this, data);
-    }
-
-    public Object visit(final ASTValueSuffix node, final Object data)
-    {
-        final ValueExpressionTracker tracker = ((EvaluationTracker) data).getValueTracker();
-        final SignatureBasedType type = ((EvaluationTracker) data).getType();
-
-        if (type instanceof IObjectSymbolBasedValueType)
-        {
-            final IObjectSymbolBasedValueType symbolType =
-                (IObjectSymbolBasedValueType) type;
-            final Token firstToken = node.getFirstToken();
-
-            if (node.jjtGetNumChildren() == 0
-                    && firstToken.kind == JSPELParserConstants.DOT)
-            {
-                final Token dotId = node.getLastToken();
-
-                final int offset =
-                    _context.getDocumentPosition() + dotId.beginColumn - 1;
-                final int length = dotId.endColumn - dotId.beginColumn + 1;
-
-                final DotOperator dotOp = new DotOperator(_diagnosticFactory, _targetFile, _symbolResolver);
-
-                final StringLiteralType  suffixLiteral = new StringLiteralType(dotId.image);
-                final Diagnostic diagnostic =
-                    dotOp.validate(symbolType,
-                            suffixLiteral);
-
-                if (diagnostic.getSeverity() != Diagnostic.OK)
-                {
-                    _reporter.report(diagnostic, offset, length);
-                    ((EvaluationTracker) data).setType(null);
-                }
-                else
-                {
-                    //                    // if the base (value-a) is a map, then using the bracket value-a['y'] type
-                    //                    // syntax is recommended.  Note that we do this here instead of
-                    //                    // DotOperator so that we don't tie the default property resolver
-                    //                    // behaviour to that operator class.  If someone changes the rules
-                    //                    // of how the prop resolver interprets the base, then they may want to
-                    //                    // write their own validator that doesn't do this
-                    //                    if (symbolType.getSymbol().supportsCoercion(TypeConstants.TYPE_MAP))
-                    //                    {
-                    //                        _messages.add(ValidationMessageFactory.createFromDiagnostic(
-                    //                                DiagnosticFactory.create_BINARY_OP_DOT_WITH_VALUEA_MAP_SHOULD_USE_ARRAY
-                    //                                    (symbolType.getSymbol().getName(), dotId.image),
-                    //                                        startOffset, length, _targetFile));
-                    //                    }
-
-                    ((EvaluationTracker) data).setType(dotOp.performOperation(symbolType,
-                            suffixLiteral));
-                    tracker.setCurMemberSymbol(offset, length);
-                }
-
-                // we finished with the single dot suffix here
-                return data;
-            }
-            else if (firstToken.kind == JSPELParserConstants.LBRACKET)
-            {
-                final EvaluationTracker subExprTracker = new EvaluationTracker();
-                node.childrenAccept(this, subExprTracker);
-
-                final SignatureBasedType subExprType = subExprTracker.getType();
-
-                if (subExprType instanceof ValueType)
-                {
-                    final Token lastToken = node.getLastToken();
-                    final int offset =
-                        _context.getDocumentPosition() + firstToken.beginColumn - 1;
-                    final int length = lastToken.endColumn - firstToken.beginColumn + 1;
-
-                    final BracketOperator  bracketOperator = new BracketOperator(_diagnosticFactory, _targetFile, _symbolResolver);
-
-                    final Diagnostic diagnostic =
-                        bracketOperator.validate(symbolType,
-                                (ValueType)subExprType);
-
-                    if (diagnostic.getSeverity() != Diagnostic.OK)
-                    {
-                        _reporter.report(diagnostic, offset, length);
-                        ((EvaluationTracker) data).setType(null);
-                    }
-                    else
-                    {
-                        ((EvaluationTracker) data).setType(bracketOperator.performOperation(symbolType,
-                                (ValueType)subExprType));
-                        tracker.setCurMemberSymbol(offset, length);
-                    }
-                }
-                // we are finished with the bracketed suffix at this point.
-                return data;
-            }
-        }
-
-        // don't bother to accept children, since if we haven't done
-        // something above, there's not much sensible we can do with it
-        // clear the type first though
-        ((EvaluationTracker) data).setType(null);
-        return data; //node.childrenAccept(this, data);
-    }
-
-    public Object visit(final SimpleNode node, final Object data) {
-        return node.childrenAccept(this, data);
-    }
-
-    /**
-     * Copies stored messages into the validation reporter
-     * @param validator
-     * @param reporter
-     */
-//    public void reportFindings(final IValidator validator, final IReporter reporter)
-//    {
-//        for (final IMessage message : _messages)
-//        {
-//            // don't report messages that have no severity.
-//            if ((message.getSeverity() & IMessage.ALL_MESSAGES) != 0)
-//            {
-//                reporter.addMessage(validator, message);
-//            }
-//        }
-//    }
-
-    private void performBinaryEvaluation(final ASTOperatorExpression node, final EvaluationTracker tracker)
-    {
-        if (node.jjtGetNumChildren() < 2)
-        {
-            throw new AssertionError("Binary operators should always have at least two sub-expressions"); //$NON-NLS-1$
-        }
-        else if (node.getOperatorTokens().size() != node.jjtGetNumChildren()-1)
-        {
-            throw new AssertionError("Binary operators should always have one operator token less than number of sub-expressions"); //$NON-NLS-1$
-        }
-
-        // evaluate left-most argument
-        node.jjtGetChild(0).jjtAccept(this, tracker);
-
-        ValueType curType = getValueTypeForBinaryOperation(tracker.getType(), (SimpleNode) node.jjtGetChild(0));
-
-        for (int child = 1; child < node.jjtGetNumChildren(); child++)
-        {
-            // evaluate next argument running left-to-right
-            node.jjtGetChild(child).jjtAccept(this, tracker);
-            final ValueType secondType =
-                getValueTypeForBinaryOperation(tracker.getType(), (SimpleNode) node.jjtGetChild(child));
-
-            if (curType != null && secondType != null)
-            {
-                final BinaryOperator operator =
-                    BinaryOperator.getBinaryOperator((Token)node.getOperatorTokens().get(child-1), _diagnosticFactory, _context);
-
-                final Diagnostic diagnostic = operator.validate(curType, secondType);
-
-                if (diagnostic.getSeverity() != Diagnostic.OK)
-                {
-                    final Token firstToken = node.getFirstToken();
-                    final int offset = _context.getDocumentPosition() + firstToken.beginColumn - 1;
-                    final int length = node.getLastToken().endColumn - firstToken.beginColumn+1;
-                    _reporter.report(diagnostic, offset, length);
-                }
-
-                curType = operator.performOperation(curType, secondType);
-            }
-        }
-
-        tracker.setType(curType);
-    }
-
-    private ValueType getValueTypeForBinaryOperation(final SignatureBasedType type, final SimpleNode node)
-    {
-        if (type instanceof ValueType)
-        {
-            return (ValueType) type;
-        }
-        else if (type instanceof MethodType)
-        {
-            final int offset = _context.getDocumentPosition() + node.getFirstToken().beginColumn - 1;
-            final int length = node.getLastToken().endColumn - node.getFirstToken().beginColumn+1;
-            final Diagnostic diagnostic = _diagnosticFactory.create_CANNOT_APPLY_OPERATOR_TO_METHOD_BINDING();
-            _reporter.report(diagnostic, offset, length);
-        }
-
-        return null;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.jsf.validation.internal.el.IExpressionSemanticValidator#getMessages()
-     */
-//    public List getMessages()
-//    {
-//        if (!_validatorHasBeenCalled)
-//        {
-//            throw new AssertionError("Should not call getMessages before validate has been called");
-//        }
-//        return _messages;
-//    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.jsf.validation.internal.el.IExpressionSemanticValidator#getExpressionType()
-     */
-    public SignatureBasedType getExpressionType()
-    {
-        return _tracker.getType();
-    }
-
-    /**
-     * @param args
-     * @throws IOException
-     * @throws ParseException
-     */
-    public static void main(final String[] args) throws IOException, ParseException
-    {
-        String elText = ""; //$NON-NLS-1$
-        int nextCharacter;
-
-        while(((nextCharacter = System.in.read()) != -1))
-        {
-            final char nextChar = (char) nextCharacter;
-
-            if (nextChar == '\n')
-            {
-                final JSPELParser parser = JSPELParser.createParser(elText);
-                final ASTExpression expr = parser.Expression();
-                expr.dump(""); //$NON-NLS-1$
-
-                elText = ""; //$NON-NLS-1$
-            }
-            else
-            {
-                elText += nextChar;
-            }
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/ELExpressionValidator.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/ELExpressionValidator.java
deleted file mode 100644
index 71ccead..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/ELExpressionValidator.java
+++ /dev/null
@@ -1,158 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.validation.internal.el;
-
-import org.eclipse.emf.common.util.Diagnostic;
-import org.eclipse.jst.jsf.common.internal.types.CompositeType;
-import org.eclipse.jst.jsf.common.internal.types.SignatureBasedType;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.jst.jsf.designtime.resolver.IStructuredDocumentSymbolResolverFactory;
-import org.eclipse.jst.jsf.validation.internal.IJSFViewValidator.IValidationReporter;
-import org.eclipse.jst.jsf.validation.internal.el.diagnostics.DiagnosticFactory;
-import org.eclipse.jst.jsp.core.internal.java.jspel.ASTExpression;
-import org.eclipse.jst.jsp.core.internal.java.jspel.JSPELParser;
-import org.eclipse.jst.jsp.core.internal.java.jspel.ParseException;
-import org.eclipse.jst.jsp.core.internal.java.jspel.Token;
-import org.eclipse.jst.jsp.core.internal.java.jspel.TokenMgrError;
-
-/**
- * Validates a single expression string
- * 
- * @author cbateman
- *
- */
-public class ELExpressionValidator 
-{
-    private final IStructuredDocumentContext               _context;
-    private final String                                   _elText;
-    private final DiagnosticFactory                        _diagnosticFactory;
-
-    private ASTSemanticValidator                           _semanticValidator;
-    private final IStructuredDocumentSymbolResolverFactory _symbolResolverFactory;
-    private final IValidationReporter                      _reporter;
-
-    /**
-     * @param context
-     * @param elText
-     * @param symbolResolverFactory 
-     * @param reporter 
-     */
-    public ELExpressionValidator(final IStructuredDocumentContext context,
-                                 final String elText, 
-                                 final IStructuredDocumentSymbolResolverFactory symbolResolverFactory,
-                                 final IValidationReporter reporter)
-    {
-        _context = context;
-        _elText = elText;
-        _diagnosticFactory = new DiagnosticFactory();
-        _symbolResolverFactory = symbolResolverFactory;
-        _reporter = reporter;
-    }
-    
-    /**
-     * Validates a single EL expression in an XML attribute value
-     * @return an ASTExpression for the node
-     */
-    public ASTExpression validateXMLNode() 
-    {
-        JSPELParser elParser = JSPELParser.createParser(_elText);
-        // = 
-        try {
-            //final long startParsing = System.currentTimeMillis();
-            final ASTExpression expr =  elParser.Expression();
-            //final long endParsing = System.currentTimeMillis();
-            //final long startSemantics = System.currentTimeMillis();
-            validateSemantics(expr, _context);
-            //final long endSemantics = System.currentTimeMillis();
-
-            //System.out.println("Time to parse '"+elText+"' = "+(endParsing-startParsing));
-            //System.out.println("Time to semantic checking '"+elText+"' = "+(endSemantics-startSemantics));
-            
-            // if the parser bailed before parsing the whole
-            // expression, raise a warning that there is probably
-            // some syntatical issue
-            if (expr.getLastToken().endColumn < _elText.trim().length()-1)
-            {
-                final int offset = _context.getDocumentPosition() + expr.getLastToken().endColumn;
-                final int length = _elText.trim().length() - expr.getLastToken().endColumn;
-                final Diagnostic diagnostic =
-                    _diagnosticFactory.create_GENERAL_SYNTAX_ERROR();
-                
-                _reporter.report(diagnostic, offset, length);
-            }
-            
-            return expr;
-        }
-        catch (ParseException e) {
-            Token curTok = e.currentToken;
-            int offset = _context.getDocumentPosition() + curTok.beginColumn;
-            int length = curTok.endColumn - curTok.beginColumn + 1;
-            final Diagnostic diagnostic = _diagnosticFactory.create_GENERAL_SYNTAX_ERROR();
-            _reporter.report(diagnostic, offset, length);
-            return null;
-        }
-        catch (TokenMgrError te) {
-            final int offset = _context.getDocumentPosition();
-            final int length = _elText.length();
-            final Diagnostic diagnostic =
-                _diagnosticFactory.create_GENERAL_SYNTAX_ERROR();
-            _reporter.report(diagnostic, offset, length);
-            return null;
-        }
-    }
-
-    /**
-     * @return the type of the expression or null if 
-     * the type could not be evaluated
-     */
-    public CompositeType getExpressionType()
-    {
-        if (_semanticValidator != null)
-        {
-            final SignatureBasedType type = 
-                _semanticValidator.getExpressionType();
-            
-            if (type != null)
-            {
-                return type.toCompositeType();
-            }
-        }
-        
-        return null;
-    }
-    
-
-    /**
-     * @return the EL semantic validator for this expression validitor or
-     * null if one has not yet been constructor.  One will only be construct
-     * if validate is called and the expression does not have any syntax errors.
-     */
-    public IExpressionSemanticValidator getSemanticValidator()
-    {
-        return _semanticValidator;
-    }
-    
-    /**
-     * Validates the context-specific data for one EL expressino
-     * 
-     * @param expr
-     * @param file
-     * @param reporter
-     * @param context
-     */
-    private void validateSemantics(ASTExpression expr,IStructuredDocumentContext context)
-    {
-        _semanticValidator = new ASTSemanticValidator(expr, context, _symbolResolverFactory, _reporter);
-        _semanticValidator.validate();
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/EvaluationTracker.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/EvaluationTracker.java
deleted file mode 100644
index aec1b21..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/EvaluationTracker.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.validation.internal.el;
-
-import org.eclipse.jst.jsf.common.internal.types.SignatureBasedType;
-import org.eclipse.jst.jsf.common.internal.types.ValueType;
-
-/**
- * Used to track the evaulation of an EL expression AST
- * 
- * @author cbateman
- *
- */
-class EvaluationTracker 
-{
-    private ValueExpressionTracker  _valueTracker;
-    private SignatureBasedType      _type;
-    
-    /**
-     * @return the current value expression tracker or null if not set
-     */
-    public ValueExpressionTracker getValueTracker() {
-        return _valueTracker;
-    }
-
-    /**
-     * @param valueTracker
-     */
-    public void setValueTracker(ValueExpressionTracker valueTracker) {
-        _valueTracker = valueTracker;
-    }
-
-    /**
-     * @return the currently resolved type or null if not yet resolved
-     * or not able to resolve
-     */
-    public SignatureBasedType getType() {
-        return _type;
-    }
-
-    /**
-     * @param type
-     */
-    public void setType(SignatureBasedType type) {
-        _type = type;
-    }
-    
-    /**
-     * @return if getType() is a ValueType, returns it otherwise null
-     */
-    public ValueType getValueType()
-    {
-        if (_type instanceof ValueType)
-        {
-            return (ValueType) _type;
-        }
-        
-        return null;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/IExpressionSemanticValidator.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/IExpressionSemanticValidator.java
deleted file mode 100644
index 636fffe..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/IExpressionSemanticValidator.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.validation.internal.el;
-
-import org.eclipse.jst.jsf.common.internal.types.SignatureBasedType;
-
-/**
- * Exposes certain parts of the ASTSemanticValidator without exposing the whole class
- * Primarily this was done for JUnit testing
- * 
- * @author cbateman
- *
- */
-public interface IExpressionSemanticValidator {
-
-    /**
-     * Performs the semantic validatino
-     */
-    public abstract void validate();
-
-    /**
-     * @return the value type of fully resolved expression
-     * or null if not resolved (or could not be resolved)
-     */
-    public abstract SignatureBasedType getExpressionType();
-
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/QuickFixAssistant.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/QuickFixAssistant.java
deleted file mode 100644
index 89ff50f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/QuickFixAssistant.java
+++ /dev/null
@@ -1,149 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.validation.internal.el;
-
-
-/**
- * @author cbateman
- *
- */
-public class QuickFixAssistant //extends CorrectionAssistantProvider
-{
-/*	public IContentAssistant getCorrectionAssistant(ISourceViewer sourceViewer) {
-		IContentAssistant ca = null;
-
-		if (sourceViewer != null) {
-			ContentAssistant assistant = new ContentAssistant();
-
-			if (sourceViewer != null) {
-				IContentAssistProcessor correctionProcessor = new CorrectionProcessorXML(sourceViewer);
-				assistant.setContentAssistProcessor(correctionProcessor, IJSPPartitions.JSP_DEFAULT_EL2);
-			}
-			ca = assistant;
-		}
-
-		return ca;
-
-	}
-
-	private class CorrectionProcessorXML extends StructuredCorrectionProcessor {
-		/**
-		 * quick assist processor
-		 */
-/*		protected IQuickAssistProcessor fQuickAssistProcessor;
-		/**
-		 * quick fix processor
-		 */
-/*		protected IQuickFixProcessor fQuickFixProcessor;
-
-		/**
-		 * @param sourceViewer
-		 */
-/*		public CorrectionProcessorXML(ISourceViewer sourceViewer) {
-			super(sourceViewer);
-		}
-
-		protected IQuickAssistProcessor getQuickAssistProcessor() {
-			if (fQuickAssistProcessor == null)
-				fQuickAssistProcessor = new IQuickAssistProcessor()
-				{
-					public boolean canAssist(StructuredTextViewer viewer, int offset)
-					{
-						return true;
-					}
-	
-					/**
-					 * Collects proposals for assistant at the given offset.
-					 */
-/*					public ICompletionProposal[] getProposals(StructuredTextViewer viewer, int offset) throws CoreException
-					{
-						final IStructuredDocumentContext context = IStructuredDocumentContextFactory.INSTANCE.getContext(viewer, offset);
-						final ITextRegionContextResolver resolver = IStructuredDocumentContextResolverFactory.INSTANCE.getTextRegionResolver(context);
-						
-						if (resolver == null)
-						{
-							return new ICompletionProposal[0];
-						}
-						
-						final String regionType = resolver.getRegionType();
-						final List   proposals = new ArrayList();
-						
-						if (DOMJSPRegionContexts.JSP_VBL_CONTENT.equals(regionType))
-						{
-							final String elText = resolver.getRegionText();
-							final StringReader  reader = new StringReader(elText);
-							final JSPELParser  parser = new JSPELParser(reader);
-							
-							try
-							{
-								final ASTExpression expr = parser.Expression();
-								final IExpressionSemanticValidator validator = new ASTSemanticValidator(expr, context);
-								validator.validate();
-								
-//								for (final Iterator it = validator.getMessages().iterator(); it.hasNext();)
-//								{
-//									// TODO:MyLocalizedMessage message = (MyLocalizedMessage) it.next();
-//									
-//									if (message.appliesTo(offset))
-//									{
-                                       throw new UnsupportedOperationException("TODO:");
-//										switch(message.getErrorCode())
-//										{
-                                        //TODO:
-//											case Messages.ERROR_CODE_BEANNAME_NOT_FOUND:
-//											{
-//												final String beanName = 
-//													(String) message.getAttribute("name");
-//												proposals.add(new ELContentAssistProposal(beanName, ((IFile)message.getTargetObject()).getProject()));
-//											}
-//											break;
-//										}
-//									}
-//								}
-							}
-							catch (ParseException pe)
-							{
-								// left empty on purpose
-							}
-						}
-						
-						return (ICompletionProposal[]) proposals.toArray(new ICompletionProposal[0]);
-					}
-				};
-
-			return fQuickAssistProcessor;
-		}
-
-		protected IQuickFixProcessor getQuickFixProcessor() {
-			if (fQuickFixProcessor == null)
-			{
-				// TODO: should use the approach where possible, but the Annotation doesn't pass
-				// enough info
-				fQuickFixProcessor = new QuickFixProcessorXML()
-				{
-					public boolean canFix(Annotation annnotation)
-					{
-						return true;
-					}
-
-					public ICompletionProposal[] getProposals(Annotation annnotation) throws CoreException
-					{
-						return new ICompletionProposal[0];
-					}
-				};
-			}
-
-			return fQuickFixProcessor;
-		}
-	}*/
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/ValueExpressionTracker.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/ValueExpressionTracker.java
deleted file mode 100644
index 702f997..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/ValueExpressionTracker.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.validation.internal.el;
-
-
-class ValueExpressionTracker
-{
-    private int                         _curPropertySymbolOffset;
-    private int                         _curPropertySymbolLength;
-
-    /**
-     * @param offset 
-     * @param length 
-     */
-    public void setCurMemberSymbol(int offset, int length) 
-    {
-        _curPropertySymbolOffset = offset;
-        _curPropertySymbolLength = length;
-    }
-    
-    /**
-     * @return the offset of the current property symbol or 0 if no current property symbol
-     */
-    public int getCurPropertySymbolOffset()
-    {
-        return _curPropertySymbolOffset;
-    }
-    
-    /**
-     * @return the length of the current property symbol or 0 if no current property symbol
-     */
-    public int getCurPropertySymbolLength()
-    {
-        return _curPropertySymbolLength;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/diagnostics/DiagnosticFactory.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/diagnostics/DiagnosticFactory.java
deleted file mode 100644
index 64e8381..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/diagnostics/DiagnosticFactory.java
+++ /dev/null
@@ -1,561 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation7
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.validation.internal.el.diagnostics;
-
-import java.text.MessageFormat;
-
-import org.eclipse.emf.common.util.BasicDiagnostic;
-import org.eclipse.emf.common.util.Diagnostic;
-import org.eclipse.jst.jsf.validation.internal.ELValidationPreferences;
-import org.eclipse.osgi.util.NLS;
-
-/**
- * Factory for all operator diagnostics.  Class should
- * not be implemented, instantiated or sub-classed.
- * 
- * @author cbateman
- *
- */
-public final class DiagnosticFactory 
-{
-    /**
-     * The id used in the source field of all Diagnostic's created by this factory
-     * to uniquely identify EL validation as their source type.
-     */
-    public final static String      SOURCE_ID = "org.eclipse.jst.jsf.validation.el.Diagnostics";//$NON-NLS-1$
-    
-    /**
-     * Problem id
-     */
-    public final static int BINARY_OP_BOTH_OPERANDS_NULL_ID = 0;
-    /**
-     * Problem id
-     */
-    public final static int BINARY_OP_POSSIBLE_DIVISION_BY_ZERO_ID = 1;
-    /**
-     * Problem id
-     */
-    public final static int BINARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION_ID = 2;
-    /**
-     * Problem id
-     */
-    public final static int BINARY_OP_CONSTANT_EXPRESSION_ALWAYS_EVAL_SAME_ID = 3;
-    /**
-     * Problem id
-     */
-    public final static int BINARY_OP_EQUALITY_COMP_WITH_NULL_ALWAYS_EVAL_SAME_ID = 4;
-    /**
-     * Problem id
-     */
-    public final static int BINARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN_ID = 5;
-    /**
-     * Problem id
-     */
-    public final static int BINARY_OP_FIRST_ARGUMENT_SHORT_CIRCUITS_ID = 6;
-    /**
-     * Problem id
-     */
-    public final static int BINARY_OP_SECOND_ARGUMENT_ALWAYS_EVAL_SAME_ID = 7;
-    /**
-     * Problem id
-     */
-    public final static int BINARY_OP_NO_AVAILABLE_TYPE_COERCION_ID = 8;
-    /**
-     * Problem id
-     */
-    public final static int BINARY_OP_COULD_NOT_COERCE_LITERALS_TO_NUMBERS_ID = 9;
-    /**
-     * Problem id
-     */
-    public final static int UNARY_OP_CONSTANT_EXPRESSION_EVAL_SAME_ID = 10;
-    /**
-     * Problem id
-     */
-    public final static int UNARY_OP_EMPTY_ALWAYS_FALSE_ON_TYPE_ID = 11;
-    /**
-     * Problem id
-     */
-    public final static int UNARY_OP_MINUS_ON_NULL_ALWAYS_ZERO_ID = 12;
-    /**
-     * Problem id
-     */
-    public final static int UNARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION_ID = 13;
-    /**
-     * Problem id
-     */
-    public final static int UNARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN_ID = 14;
-    /**
-     * Problem id
-     */
-    public final static int TERNARY_OP_CHOICE_IS_ALWAYS_SAME_ID = 15;
-    /**
-     * Problem id
-     */
-    public final static int TERNARY_OP_CANNOT_COERCE_CHOICE_TO_BOOLEAN_ID = 16; 
-    /**
-     * Problem id
-     */
-    public final static int UNARY_OP_STRING_CONVERSION_NOT_GUARANTEED_ID = 17;
-    /**
-     * Problem id
-     */
-    public final static int CANNOT_APPLY_OPERATOR_TO_METHOD_BINDING_ID = 18;
-    /**
-     * Problem id
-     */
-    public final static int MEMBER_NOT_FOUND_ID = 19;
-    /**
-     * Problem id
-     */
-    public final static int VARIABLE_NOT_FOUND_ID = 20;
-    /**
-     * Problem id
-     */
-    public final static int MISSING_CLOSING_EXPR_BRACKET_ID = 21;
-    /**
-     * Problem id
-     */
-    public final static int GENERAL_SYNTAX_ERROR_ID = 22;
-    /**
-     * Problem id
-     */
-    public final static int EMPTY_EL_EXPRESSION_ID = 23;
-    
-    /**
-     * 
-     */
-    public final static int BINARY_OP_DOT_WITH_VALUEB_NULL_ID = 24;
-    
-    /**
-     * Identifies a problem where we have x.y and x is a map.  In this case
-     * the recommend syntax is x['y']
-     */
-    public final static int BINARY_OP_DOT_WITH_DOTTED_KEY_SHOULD_USE_ARRAY_ID = 25;
-    
-    /**
-     * Indicates that a numeric array accessor is being used with a value
-     * which is either < 0 or may be greater than the assumed size of the array
-     */
-    public final static int POSSIBLE_ARRAY_INDEX_OUT_OF_BOUNDS_ID = 26;
-    
-    /**
-     * Identifies the problem where an expr like bean.enumProp == 'blah'
-     * but 'blah' does not match any of the possible enum constants, meaning
-     * that the operation will always resolve to a constant value (in this case false)
-     */
-    public final static int BINARY_COMPARISON_WITH_ENUM_ALWAYS_SAME_ID = 27;
-    
-    /**
-     * Identifies a problem where two enum variables are compared but the enums are
-     * not compatible.  i.e. bean.enum1 < bean.enum2.  Enum.compareTo() may throw
-     * an exception in this case (CCE).
-     */
-    public final static int BINARY_OP_COMPARISON_OF_ENUMS_INCOMPATIBLE_ID = 28;
-    
-    /**
-     * Indicates a situation such as x.y where x is a bundle and 
-     * 'x.y.z' exists, but x.y while partially valid, does not have a value
-     * associated.
-     */
-    public final static int MEMBER_IS_INTERMEDIATE_ID = 29;
-    
-    /**
-     * Count of ids
-     */
-    public final static int NUM_IDS = 30;
-    
-    /**
-     * @param operatorName
-     * @return a configured diagnostic
-     */
-    public Diagnostic create_BINARY_OP_BOTH_OPERANDS_NULL(final String operatorName)
-    {
-        final String message = NLS.bind(
-                Messages.BINARY_OP_BOTH_OPERANDS_NULL, operatorName);
-        return create(BINARY_OP_BOTH_OPERANDS_NULL_ID, message);
-    }
-    
-    private static Diagnostic DIAGNOSTIC_POSSIBLE_DIV_BY_ZERO;
-    
-    /**
-     * @return a configured diagnostic
-     */
-    public Diagnostic create_BINARY_OP_POSSIBLE_DIVISION_BY_ZERO()
-    {
-        if (DIAGNOSTIC_POSSIBLE_DIV_BY_ZERO == null)
-        {
-            final String message = Messages.POSSIBLE_DIV_BY_ZERO;
-            DIAGNOSTIC_POSSIBLE_DIV_BY_ZERO = 
-                create(BINARY_OP_POSSIBLE_DIVISION_BY_ZERO_ID, message);
-        }
-        return DIAGNOSTIC_POSSIBLE_DIV_BY_ZERO;
-    }
-    
-    /**
-     * @param operatorName
-     * @return a configured diagnostic
-     */
-    public Diagnostic create_BINARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION(final String operatorName)
-    {
-        final String message = 
-            NLS.bind(Messages.BINARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION, operatorName);
-        return create(BINARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION_ID, message);
-    }
-    
-    /**
-     * @param operatorName
-     * @param value
-     * @return a configured diagnostic
-     */
-    public Diagnostic create_BINARY_OP_CONSTANT_EXPRESSION_ALWAYS_EVAL_SAME(final String operatorName, final String value)
-    {
-        final String message =  
-            NLS.bind(Messages.BINARY_OP_CONSTANT_EXPRESSION_ALWAYS_EVAL_SAME,operatorName, value);
-        return create(BINARY_OP_CONSTANT_EXPRESSION_ALWAYS_EVAL_SAME_ID, message);
-    }
-    
-    /**
-     * @param value
-     * @return a configured diagnostic
-     */
-    public Diagnostic create_BINARY_OP_EQUALITY_COMP_WITH_NULL_ALWAYS_EVAL_SAME(final String value)
-    {
-        final String message = 
-            NLS.bind(Messages.BINARY_OP_EQUALITY_COMP_WITH_NULL_ALWAYS_EVAL_SAME, value);
-        return create(BINARY_OP_EQUALITY_COMP_WITH_NULL_ALWAYS_EVAL_SAME_ID, message);
-    }
-
-    /**
-     * @param whichArgument
-     * @return a configured diagnostic
-     */
-    public Diagnostic create_BINARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN(final String whichArgument)
-    {
-        final String message = 
-            NLS.bind(Messages.BINARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN, whichArgument);
-        return create(BINARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN_ID, message);
-    }
-    
-    /**
-     * @param shortCircuitValue
-     * @param operatorName
-     * @return a configured diagnostic
-     */
-    public Diagnostic create_BINARY_OP_FIRST_ARGUMENT_SHORT_CIRCUITS(boolean shortCircuitValue, String operatorName)
-    {
-        final String message = 
-            NLS.bind(Messages.BINARY_OP_FIRST_ARGUMENT_SHORT_CIRCUITS, 
-                    Boolean.valueOf(shortCircuitValue), operatorName);
-        return create(BINARY_OP_FIRST_ARGUMENT_SHORT_CIRCUITS_ID, message); 
-    }
-    
-    /**
-     * @param shortCircuitValue
-     * @param operatorName
-     * @return a configured diagnostic
-     */
-    public Diagnostic create_BINARY_OP_SECOND_ARGUMENT_ALWAYS_EVAL_SAME(final boolean shortCircuitValue, final String operatorName)
-    {
-        final String message =
-            NLS.bind(Messages.BINARY_OP_SECOND_ARGUMENT_ALWAYS_EVAL_SAME, 
-                    Boolean.valueOf(shortCircuitValue), operatorName);
-        
-        return create(BINARY_OP_SECOND_ARGUMENT_ALWAYS_EVAL_SAME_ID, message); 
-    }
-
-    private static Diagnostic DIAGNOSTIC_NO_AVAILABLE_TYPE_COERCION;
-        
-    /**
-     * @return a configured diagnostic
-     */
-    public Diagnostic create_BINARY_OP_NO_AVAILABLE_TYPE_COERCION()
-    {
-        if (DIAGNOSTIC_NO_AVAILABLE_TYPE_COERCION == null)
-        {
-            DIAGNOSTIC_NO_AVAILABLE_TYPE_COERCION = 
-              create(BINARY_OP_NO_AVAILABLE_TYPE_COERCION_ID, 
-                    Messages.BINARY_OP_NO_AVAILABLE_TYPE_COERCION);
-        }
-        
-        return DIAGNOSTIC_NO_AVAILABLE_TYPE_COERCION;
-    }
-
-    private static Diagnostic DIAGNOSTIC_COULD_NOT_COERCE_LITERALS;
-    
-    /**
-     * @return a configured diagnostic
-     */
-    public Diagnostic create_BINARY_OP_COULD_NOT_COERCE_LITERALS_TO_NUMBERS()
-    {
-        if (DIAGNOSTIC_COULD_NOT_COERCE_LITERALS == null)
-        {
-            DIAGNOSTIC_COULD_NOT_COERCE_LITERALS = 
-                create(BINARY_OP_COULD_NOT_COERCE_LITERALS_TO_NUMBERS_ID, 
-                    Messages.BINARY_OP_COULD_NOT_COERCE_LITERALS_TO_NUMBERS);
-        }
-        
-        return DIAGNOSTIC_COULD_NOT_COERCE_LITERALS;
-    }
-    
-    /**
-     * @param operatorName
-     * @param value
-     * @return a configured diagnostic
-     */
-    public Diagnostic create_UNARY_OP_CONSTANT_EXPRESSION_EVAL_SAME_ID(final String operatorName, final String value)
-    {
-        final String message = 
-            NLS.bind(Messages.UNARY_OP_CONSTANT_EXPRESSION_EVAL_SAME, 
-                    operatorName, value);
-        return create(UNARY_OP_CONSTANT_EXPRESSION_EVAL_SAME_ID, message);
-    }
-    
-    /**
-     * @return a configured diagnostic
-     */
-    public Diagnostic create_UNARY_OP_EMPTY_ALWAYS_FALSE_ON_TYPE()
-    {
-        return create(UNARY_OP_EMPTY_ALWAYS_FALSE_ON_TYPE_ID, 
-             Messages.UNARY_OP_EMPTY_ALWAYS_FALSE_ON_TYPE);
-    }
-    
-    /**
-     * @return a configured diagnostic
-     */
-    public Diagnostic create_UNARY_OP_MINUS_ON_NULL_ALWAYS_ZERO()
-    {
-        return create(UNARY_OP_MINUS_ON_NULL_ALWAYS_ZERO_ID, 
-            Messages.UNARY_OP_MINUS_ON_NULL_ALWAYS_ZERO);
-    }
-    
-    /**
-     * @param operatorName
-     * @return a configured diagnostic
-     */
-    public Diagnostic create_UNARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION(final String operatorName)
-    {
-        final String message = 
-            NLS.bind(Messages.UNARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION,
-                    operatorName);
-        return create(UNARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION_ID, message);
-    }
-    
-    /**
-     * @param operatorName
-     * @return a configured diagnostic
-     */
-    public Diagnostic create_UNARY_OP_STRING_CONVERSION_NOT_GUARANTEED(final String operatorName)
-    {
-        final String message =
-            NLS.bind(Messages.UNARY_OP_STRING_CONVERSION_NOT_GUARANTEED,
-                                operatorName);
-        return create(UNARY_OP_STRING_CONVERSION_NOT_GUARANTEED_ID, message);
-    }
-    
-    /**
-     * @return a configured diagnostic
-     */
-    public Diagnostic create_UNARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN()
-    {
-        return create(UNARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN_ID, 
-                Messages.UNARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN);
-    }
-    
-    /**
-     * @param result
-     * @param whichSelected
-     * @return a configured diagnostic
-     */
-    public Diagnostic create_TERNARY_OP_CHOICE_IS_ALWAYS_SAME(boolean result, String whichSelected)
-    {
-        final String message =
-            NLS.bind(Messages.TERNARY_OP_CHOICE_IS_ALWAYS_SAME, 
-                    Boolean.valueOf(result), whichSelected);
-        return create(TERNARY_OP_CHOICE_IS_ALWAYS_SAME_ID, message);
-    }
-    
-    /**
-     * @return a configured diagnostic
-     */
-    public Diagnostic create_TERNARY_OP_CANNOT_COERCE_CHOICE_TO_BOOLEAN()
-    {
-        return create(TERNARY_OP_CANNOT_COERCE_CHOICE_TO_BOOLEAN_ID, 
-                Messages.TERNARY_OP_CANNOT_COERCE_CHOICE_TO_BOOLEAN_ID);
-    }
-    
-    /**
-     * Method bindings cannot participate in expressions involving operators
-     * Per JSP 1.1 spec section 5.2.1
-     * 
-     * @return a configured message
-     */
-    public Diagnostic create_CANNOT_APPLY_OPERATOR_TO_METHOD_BINDING()
-    {
-        return create(CANNOT_APPLY_OPERATOR_TO_METHOD_BINDING_ID, 
-                Messages.CANNOT_APPLY_OPERATORS_TO_MB);
-    }
-
-    /**
-     * @param curMemberSymbol
-     * @param owningMember
-     * @return a configured message
-     */
-    public Diagnostic create_MEMBER_NOT_FOUND(String curMemberSymbol, String owningMember)
-    {
-        return create(MEMBER_NOT_FOUND_ID,
-                NLS.bind(Messages.VM_PROP_NAME_NOT_FOUND, curMemberSymbol, owningMember));
-    }
-
-    /**
-     * @param variableName
-     * @return a configured message
-     */
-    public Diagnostic create_VARIABLE_NOT_FOUND(String variableName)
-    {
-        return create(VARIABLE_NOT_FOUND_ID
-                , NLS.bind(Messages.VM_ROOT_NAME_NOT_FOUND, variableName));
-    }
-
-    /**
-     * @return a configured message
-     */
-    public Diagnostic create_MISSING_CLOSING_EXPR_BRACKET()
-    {
-        return create(MISSING_CLOSING_EXPR_BRACKET_ID
-                , Messages.MISSING_CLOSING_EXPR_BRACKET);
-    }
-    
-    /**
-     * @return a configured message
-     */
-    public Diagnostic create_GENERAL_SYNTAX_ERROR()
-    {
-        return create(GENERAL_SYNTAX_ERROR_ID, Messages.GENERAL_SYNTAX_ERROR);
-    }
-
-    /**
-     * @return a configured message
-     */
-    public Diagnostic create_EMPTY_EL_EXPRESSION()
-    {
-        return create(EMPTY_EL_EXPRESSION_ID, Messages.EMPTY_EL_EXPRESSION);
-    }
-
-    /**
-     * @param operatorName 
-     * @return a configured diagnostic
-     */
-    public Diagnostic create_BINARY_OP_DOT_WITH_VALUEB_NULL(final String operatorName)
-    {
-        return create(BINARY_OP_DOT_WITH_VALUEB_NULL_ID
-                , Messages.bind(Messages.BINARY_OP_DOT_WITH_VALUEB_NULL, operatorName));
-    }
-    
-    /**
-     * @param valAName
-     * @param valueBName
-     * @return a configured diagnostic
-     */
-    public Diagnostic create_BINARY_OP_DOT_WITH_VALUEA_MAP_SHOULD_USE_ARRAY(final String valAName, final String valueBName)
-    {
-        final Object[] formatArgs = new Object[] {valAName, valueBName};
-        return create(BINARY_OP_DOT_WITH_DOTTED_KEY_SHOULD_USE_ARRAY_ID,
-                MessageFormat.format(Messages.BINARY_OP_DOT_WITH_DOTTED_KEY_SHOULD_USE_ARRAY,formatArgs));
-    }
-    
-    /**
-     * @param value
-     * @return an array index out of bounds diagnostic
-     */
-    public Diagnostic create_POSSIBLE_ARRAY_INDEX_OUT_OF_BOUNDS(final Integer value)
-    {
-        final Object[] formatArgs = new Object[] {value};
-
-        return create(POSSIBLE_ARRAY_INDEX_OUT_OF_BOUNDS_ID
-                , MessageFormat.format(Messages.POSSIBLE_ARRAY_INDEX_OUT_OF_BOUNDS,formatArgs));
-    }
-    
-    /**
-     * @param operatorName
-     * @param invariantResult
-     * @param enumName
-     * @param fieldName
-     * @return a diagnostic
-     */
-    public Diagnostic create_BINARY_COMPARISON_WITH_ENUM_AND_CONST_ALWAYS_SAME(final String operatorName, final boolean invariantResult, final String enumName,  final String fieldName)
-    {
-        return create(BINARY_COMPARISON_WITH_ENUM_ALWAYS_SAME_ID
-                , MessageFormat.format(Messages.BINARY_COMPARISON_WITH_ENUM_AND_CONST_ALWAYS_SAME
-                                      , new Object[] {operatorName
-                                      , Boolean.valueOf(invariantResult), enumName, fieldName}));
-    }
-
-    /**
-     * @param operatorName
-     * @param invariantResult
-     * @param enumName1
-     * @param enumName2
-     * @return a diagnostic
-     */
-    public Diagnostic create_BINARY_COMPARISON_WITH_TWO_ENUMS_ALWAYS_SAME(final String operatorName, final boolean invariantResult, final String enumName1, final String enumName2)
-    {
-        return create(BINARY_COMPARISON_WITH_ENUM_ALWAYS_SAME_ID
-                , MessageFormat.format(Messages.BINARY_COMPARISON_WITH_TWO_ENUMS_ALWAYS_SAME
-                                      , new Object[] {operatorName
-                                      , Boolean.valueOf(invariantResult), enumName1, enumName2}));
-    }
-    
-    /**
-     * @param operatorName
-     * @param invariantResult
-     * @param enumName
-     * @param nonEnum
-     * @return a diagnostic
-     */
-    public Diagnostic create_BINARY_COMPARISON_WITH_ENUM_AND_UNCOERCABLE_NONCONST_ALWAYS_SAME(final String operatorName, final boolean invariantResult, final String enumName, final String nonEnum)
-    {
-        return create(BINARY_COMPARISON_WITH_ENUM_ALWAYS_SAME_ID
-                , MessageFormat.format(Messages.BINARY_COMPARISON_WITH_ENUM_AND_UNCOERCABLE_NONCONST_ALWAYS_SAME
-                                      , new Object[] {operatorName
-                                      , Boolean.valueOf(invariantResult), enumName, nonEnum}));
-    }
-    
-    /**
-     * @return a diagnostic
-     */
-    public Diagnostic create_BINARY_OP_COMPARISON_OF_ENUMS_INCOMPATIBLE()
-    {
-        return create(BINARY_OP_COMPARISON_OF_ENUMS_INCOMPATIBLE_ID
-                , Messages.BINARY_OP_COMPARISON_OF_ENUMS_INCOMPATIBLE);
-    }
-
-    /**
-     * @param intermediateMemberName
-     * @return a diagnostic
-     */
-    public Diagnostic create_MEMBER_IS_INTERMEDIATE(final String intermediateMemberName)
-    {
-        return create(MEMBER_IS_INTERMEDIATE_ID
-                        ,  NLS.bind(Messages.MEMBER_IS_INTERMEDIATE
-                                , intermediateMemberName));
-    }
-    
-    private BasicDiagnostic create(int diagnosticId, String message)
-    {
-        final int severity = ELValidationPreferences.getDefaultSeverity(diagnosticId);
-        return new BasicDiagnostic(severity, SOURCE_ID 
-                , diagnosticId
-                , message
-                , null);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/diagnostics/Messages.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/diagnostics/Messages.java
deleted file mode 100644
index c14a851..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/diagnostics/Messages.java
+++ /dev/null
@@ -1,159 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.validation.internal.el.diagnostics;
-
-import org.eclipse.osgi.util.NLS;
-
-class Messages extends NLS {
-    private static final String BUNDLE_NAME = "org.eclipse.jst.jsf.validation.internal.el.diagnostics.messages"; //$NON-NLS-1$
-
-
-    static {
-        NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-    }
-
-    /**
-     * see messages.properties
-     */
-    public static String POSSIBLE_DIV_BY_ZERO;
-    /**
-     * see messages.properties
-     */
-    public static String UNARY_OP_EMPTY_ALWAYS_FALSE_ON_TYPE;
-    /**
-     * see messages.properties
-     */
-    public static String UNARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN; 
-    /**
-     * see messages.properties
-     */
-    public static String TERNARY_OP_CANNOT_COERCE_CHOICE_TO_BOOLEAN_ID;
-    /**
-     * see messages.properties
-     */
-    public static String BINARY_OP_BOTH_OPERANDS_NULL;
-    /**
-     * see messages.properties
-     */
-    public static String BINARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION;
-    /**
-     * see messages.properties
-     */
-    public static String BINARY_OP_CONSTANT_EXPRESSION_ALWAYS_EVAL_SAME;
-    /**
-     * see messages.properties
-     */
-    public static String BINARY_OP_EQUALITY_COMP_WITH_NULL_ALWAYS_EVAL_SAME;
-    /**
-     * see messages.properties
-     */
-    public static String BINARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN;
-    /**
-     * see messages.properties
-     */
-    public static String BINARY_OP_FIRST_ARGUMENT_SHORT_CIRCUITS;
-    /**
-     * see messages.properties
-     */
-    public static String BINARY_OP_SECOND_ARGUMENT_ALWAYS_EVAL_SAME;
-    /**
-     * see messages.properties
-     */
-    public static String BINARY_OP_NO_AVAILABLE_TYPE_COERCION;
-    /**
-     * see messages.properties
-     */
-    public static String BINARY_OP_COULD_NOT_COERCE_LITERALS_TO_NUMBERS;
-    /**
-     * see messages.properties
-     */
-    public static String UNARY_OP_CONSTANT_EXPRESSION_EVAL_SAME;
-    /**
-     * see messages.properties
-     */
-    public static String UNARY_OP_MINUS_ON_NULL_ALWAYS_ZERO;
-    /**
-     * see messages.properties
-     */
-    public static String UNARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION;
-    /**
-     * see messages.properties
-     */
-    public static String UNARY_OP_STRING_CONVERSION_NOT_GUARANTEED;
-    /**
-     * see messages.properties
-     */
-    public static String TERNARY_OP_CHOICE_IS_ALWAYS_SAME;
-    /**
-     * see messages.properties
-     */
-    public static String VM_PROP_NAME_NOT_FOUND;
-    /**
-     * see messages.properties
-     */
-    public static String VM_ROOT_NAME_NOT_FOUND;
-    /**
-     * see messages.properties
-     */
-    public static String CANNOT_APPLY_OPERATORS_TO_MB;
-    /**
-     * see messages.properties
-     */
-    public static String MISSING_CLOSING_EXPR_BRACKET;
-    /**
-     * see messages.properties
-     */
-    public static String GENERAL_SYNTAX_ERROR;
-    /**
-     * see messages.properties 
-     */
-    public static String EMPTY_EL_EXPRESSION;
-    /**
-     * see messages.properties
-     */
-    public static String BINARY_OP_DOT_WITH_VALUEB_NULL;
-    /**
-     * see messages.properties
-     */
-    public static String BINARY_OP_DOT_WITH_DOTTED_KEY_SHOULD_USE_ARRAY;
-    
-    /**
-     * see messages.properties
-     */
-    public static String POSSIBLE_ARRAY_INDEX_OUT_OF_BOUNDS;
-    /**
-     * see messages.properties
-     */
-    public static String BINARY_COMPARISON_WITH_ENUM_AND_CONST_ALWAYS_SAME;
-    /**
-     * see messages.properties
-     */
-    public static String BINARY_COMPARISON_WITH_TWO_ENUMS_ALWAYS_SAME;
-    /**
-     * see messages.properties
-     */
-    public static String BINARY_OP_COMPARISON_OF_ENUMS_INCOMPATIBLE;
-
-    /**
-     * see messages.properties
-     */
-    public static String BINARY_COMPARISON_WITH_ENUM_AND_UNCOERCABLE_NONCONST_ALWAYS_SAME;
-    /**
-     * see messages.properties
-     */
-    public static String MEMBER_IS_INTERMEDIATE;
-
-    private Messages() {
-        // do nothing; no external instantiation
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/diagnostics/messages.properties b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/diagnostics/messages.properties
deleted file mode 100644
index 8f78e7c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/diagnostics/messages.properties
+++ /dev/null
@@ -1,44 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2008 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-GENERAL_SYNTAX_ERROR=Syntax error in EL
-EMPTY_EL_EXPRESSION=Empty EL expression
-
-VM_ROOT_NAME_NOT_FOUND = {0} cannot be resolved
-VM_PROP_NAME_NOT_FOUND = {0} cannot be resolved as a member of {1}
-CANNOT_APPLY_OPERATORS_TO_MB=Cannot apply expression operators to method bindings
-MISSING_CLOSING_EXPR_BRACKET=Missing closing bracket on expression
-
-POSSIBLE_DIV_BY_ZERO=Possible division by zero
-UNARY_OP_EMPTY_ALWAYS_FALSE_ON_TYPE=This empty expression always evaluates to false.  Only string, maps, arrays and collection have meaningful values for the empty operator
-UNARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN=Not operator does not support type coercion. 
-TERNARY_OP_CANNOT_COERCE_CHOICE_TO_BOOLEAN_ID=Could not coerce choice argument to boolean
-BINARY_OP_BOTH_OPERANDS_NULL={0} with operand ''null'' is always zero
-BINARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION=Could not make numeric conversion for {0} operation
-BINARY_OP_CONSTANT_EXPRESSION_ALWAYS_EVAL_SAME=This {0} will always result a value of {1}
-BINARY_OP_EQUALITY_COMP_WITH_NULL_ALWAYS_EVAL_SAME=Comparisons with null always evaluates to {0}
-BINARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN=Cannot coerce {0} argument to boolean
-BINARY_OP_FIRST_ARGUMENT_SHORT_CIRCUITS=The first boolean argument is always {0}.  The second argument will never be evaluated and the {1} will always evaluate to {0}.
-BINARY_OP_SECOND_ARGUMENT_ALWAYS_EVAL_SAME=The second boolean argument is always {0}.  The {1} will always evaluate to {0}
-BINARY_OP_NO_AVAILABLE_TYPE_COERCION=Cannot coerce arguments for this operator
-BINARY_OP_COULD_NOT_COERCE_LITERALS_TO_NUMBERS=Could not coerce literals to numbers
-UNARY_OP_CONSTANT_EXPRESSION_EVAL_SAME=This {0} will always result a value of {1}
-UNARY_OP_MINUS_ON_NULL_ALWAYS_ZERO=Unary minus applied to null is always zero
-UNARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION=Could not make numeric conversion for {0} operation
-UNARY_OP_STRING_CONVERSION_NOT_GUARANTEED=Type coercion for {0} operator not guaranteed for possible runtime types: {1}
-TERNARY_OP_CHOICE_IS_ALWAYS_SAME=Choice argument is always {0}.  {1} argument is always returned
-BINARY_OP_DOT_WITH_VALUEB_NULL=Applying the {0} operator with null second argument always results in null
-BINARY_OP_DOT_WITH_DOTTED_KEY_SHOULD_USE_ARRAY=Array syntax is preferred when accessing Map properties with keys containing dots (i.e. {0}[''{1}''])
-POSSIBLE_ARRAY_INDEX_OUT_OF_BOUNDS=Possible array index out of bound on list/array access with value: {0}
-BINARY_COMPARISON_WITH_ENUM_AND_CONST_ALWAYS_SAME=Comparison using {0} will always evaluate to {1}.  Enumeration type {2} does not have a constant named {3}
-BINARY_OP_COMPARISON_OF_ENUMS_INCOMPATIBLE=Comparison of incompatible enumeration vales may cause a ClassCastException.
-BINARY_COMPARISON_WITH_TWO_ENUMS_ALWAYS_SAME=Comparison using {0} will always evaulate to {1}.  Enumeration type {2} is not equality comparable with {3}
-BINARY_COMPARISON_WITH_ENUM_AND_UNCOERCABLE_NONCONST_ALWAYS_SAME=Comparison using {0} will always evaulate to {1}.  Enumeration type {2} is not equality comparable with non-enumeration type {3}
-MEMBER_IS_INTERMEDIATE={0} is an intermediate property which does not have its own value associated with it.
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/AddArithmeticBinaryOperator.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/AddArithmeticBinaryOperator.java
deleted file mode 100644
index 755a447..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/AddArithmeticBinaryOperator.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.validation.internal.el.operators;
-
-import java.math.BigDecimal;
-
-import org.eclipse.jst.jsf.validation.internal.el.diagnostics.DiagnosticFactory;
-
-/**
- * Represents the arithmetic + operator in EL
- * 
- * @author cbateman
- *
- */
-/*package*/ class AddArithmeticBinaryOperator extends NoDivArithmeticBinaryOperator {
-
-    private static final String ADDITION = "addition"; //$NON-NLS-1$
-
-    AddArithmeticBinaryOperator(DiagnosticFactory diagnosticFactory) {
-        super(diagnosticFactory);
-    }
-
-    protected Long doRealOperation(Long firstArg, Long secondArg) 
-    {
-        return Long.valueOf(firstArg.longValue() + secondArg.longValue());
-    }
-
-    protected Double doRealOperation(Double firstArg, Double secondArg) {
-        return Double.valueOf(firstArg.doubleValue() + secondArg.doubleValue());
-    }
-
-    protected BigDecimal doRealOperation(BigDecimal firstArg,
-            BigDecimal secondArg) 
-    {
-        return firstArg.add(secondArg);
-    }
-
-    protected String getOperatorName() {
-        return ADDITION;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/AndBinaryOperator.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/AndBinaryOperator.java
deleted file mode 100644
index 2ef4a25..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/AndBinaryOperator.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.validation.internal.el.operators;
-
-import org.eclipse.jst.jsf.validation.internal.el.diagnostics.DiagnosticFactory;
-
-
-/**
- * Encapsulates the 'and'/'&&' boolean-AND operator
- * Based on JSP.2.3.6.1
- * 
- * @author cbateman
- *
- */
-/*package*/class AndBinaryOperator extends LogicalBinaryOperator 
-{
-
-    AndBinaryOperator(DiagnosticFactory diagnosticFactory) {
-        super(diagnosticFactory);
-    }
-
-    protected boolean doRealOperation(Boolean firstArg, Boolean secondArg) 
-    {
-        return (firstArg.booleanValue() && secondArg.booleanValue());
-    }
-
-    protected String readableOperatorName() 
-    {
-        return "logical-AND"; //$NON-NLS-1$
-    }
-
-    protected boolean shortCircuitValue() {
-        // AND short-circuits on false 
-        return false;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/ArithmeticBinaryOperator.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/ArithmeticBinaryOperator.java
deleted file mode 100644
index 3f70000..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/ArithmeticBinaryOperator.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.validation.internal.el.operators;
-
-import java.math.BigDecimal;
-
-import org.eclipse.emf.common.util.Diagnostic;
-import org.eclipse.jst.jsf.common.internal.types.ValueType;
-import org.eclipse.jst.jsf.validation.internal.el.diagnostics.DiagnosticFactory;
-
-/**
- * Super for all arithmetic binary operators -- +, -, *,/,%
- * 
- * @author cbateman
- *
- */
-/*package*/ abstract class ArithmeticBinaryOperator extends BinaryOperator 
-{
-    ArithmeticBinaryOperator(DiagnosticFactory diagnosticFactory) 
-    {
-        super(diagnosticFactory);
-    }
-    
-    public abstract ValueType performOperation(ValueType firstArg, ValueType secondArg); 
-    public abstract Diagnostic validate(ValueType firstArg, ValueType secondArg);
-    
-    /**
-     * @param firstArg
-     * @param secondArg
-     * @return the result of firstArg op secondArg
-     */
-    protected abstract Long doRealOperation(Long firstArg, Long secondArg);
-    
-    /**
-     * @param firstArg
-     * @param secondArg
-     * @return the result of firstArg op secondArg
-     */
-    protected abstract Double doRealOperation(Double firstArg, Double secondArg);
-
-    /**
-     * @param firstArg
-     * @param secondArg
-     * @return the result of firstArg op secondArg
-     */
-    protected abstract BigDecimal doRealOperation(BigDecimal firstArg, BigDecimal secondArg);
-    
-    /**
-     * @return human-readable name of the operator
-     */
-    protected abstract String getOperatorName();
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/BinaryOperator.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/BinaryOperator.java
deleted file mode 100644
index 58661da..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/BinaryOperator.java
+++ /dev/null
@@ -1,163 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.validation.internal.el.operators;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.emf.common.util.Diagnostic;
-import org.eclipse.jst.jsf.common.internal.types.ValueType;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IStructuredDocumentContextResolverFactory;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IWorkspaceContextResolver;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.jst.jsf.core.jsfappconfig.JSFAppConfigUtils;
-import org.eclipse.jst.jsf.validation.internal.el.diagnostics.DiagnosticFactory;
-import org.eclipse.jst.jsp.core.internal.java.jspel.JSPELParserConstants;
-import org.eclipse.jst.jsp.core.internal.java.jspel.Token;
-import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
-
-/**
- * Represents an abstract EL binary operator that always
- * takes arguments and produces a single results
- * 
- * @author cbateman
- *
- */
-public abstract class BinaryOperator 
-{
-    /**
-     * the factory used to construct diagnostics
-     */
-    protected final DiagnosticFactory   _diagnosticFactory;
-    
-    /**
-     * @param operatorToken
-     * @param diagnosticFactory 
-     * @param context -- the current EL document context; must not be null
-     * @return a binary operator based on the provided token
-     * @throws IllegalArgumentException if the token is not a recognized
-     * EL binary operator token or if context is null
-     */
-    public static BinaryOperator getBinaryOperator(Token operatorToken, DiagnosticFactory diagnosticFactory, IStructuredDocumentContext context)
-    {
-        if (context == null)
-        {
-            throw new IllegalArgumentException("Context must not be null"); //$NON-NLS-1$
-        }
-        final String facetVersion = determineJSFVersion(context);
-        
-        switch (operatorToken.kind)
-        {
-            case JSPELParserConstants.AND1:
-            case JSPELParserConstants.AND2:
-                return new AndBinaryOperator(diagnosticFactory);
-                
-            case JSPELParserConstants.OR1:
-            case JSPELParserConstants.OR2:
-                return new OrBinaryOperator(diagnosticFactory);
-                
-            case JSPELParserConstants.EQ1:
-            case JSPELParserConstants.EQ2:
-                return new EqualsBinaryRelationalOperator(diagnosticFactory,facetVersion);
-                
-            case JSPELParserConstants.NEQ1:
-            case JSPELParserConstants.NEQ2:
-                return new NotEqualsBinaryRelationalOperator(diagnosticFactory,facetVersion);
-                
-            case JSPELParserConstants.GT1:
-            case JSPELParserConstants.GT2:
-                return new GreaterThanRelationalBinaryOperator(diagnosticFactory,facetVersion);
-                
-            case JSPELParserConstants.GE1:
-            case JSPELParserConstants.GE2:
-                return new GreaterThanEqRelationalBinaryOperator(diagnosticFactory,facetVersion);
-                
-            case JSPELParserConstants.LT1:
-            case JSPELParserConstants.LT2:
-                return new LessThanRelationalBinaryOperator(diagnosticFactory,facetVersion);
-                
-            case JSPELParserConstants.LE1:
-            case JSPELParserConstants.LE2:
-                return new LessThanEqRelationalBinaryOperator(diagnosticFactory,facetVersion);
-                
-            case JSPELParserConstants.PLUS:
-                return new AddArithmeticBinaryOperator(diagnosticFactory);
-                
-            case JSPELParserConstants.MINUS:
-                return new SubtractArithmeticBinaryOperator(diagnosticFactory);
-                
-            case JSPELParserConstants.MULTIPLY:
-                return new MultiplyArithmeticBinaryOperator(diagnosticFactory);
-                
-            case JSPELParserConstants.DIVIDE1:
-            case JSPELParserConstants.DIVIDE2:
-                return new DivArithmeticBinaryOperator(diagnosticFactory);
-            
-            case JSPELParserConstants.MODULUS1:
-            case JSPELParserConstants.MODULUS2:
-                return new ModArithmeticBinaryOperator(diagnosticFactory);
-        }
-        
-        throw new IllegalArgumentException("Unknown binary operator: "+operatorToken.image); //$NON-NLS-1$
-    }
-    
-    /**
-     * 
-     * Constructor
-     */
-    BinaryOperator(DiagnosticFactory diagnosticFactory) 
-    {
-        /* no construction or sub-classing outside package*/
-        _diagnosticFactory = diagnosticFactory;
-    }
-    
-    /**
-     * If both arguments are literals and the operation can be performed, then
-     * the return must be a new LiteralType transformed using this operator.
-     * 
-     * If one or both of the arg is not a literal and the operaton can be performed, then
-     * the return is a new ValueType transformed per the rules of the operator
-     * 
-     * If the operation cannot be performed on ValueType, return null
-     * 
-     * @param firstArg 
-     * @param secondArg 
-     * @return a new value type after the operation is performed
-     */
-    public abstract ValueType performOperation(ValueType firstArg, ValueType secondArg);
-    
-    
-    /**
-     * @param firstArg 
-     * @param secondArg 
-     * @return a Diagnostic interpreting whether it is valid to perform the
-     * operation on the two arguments
-     */
-    public abstract Diagnostic validate(ValueType firstArg, ValueType secondArg);
-    
-    private static String determineJSFVersion(IStructuredDocumentContext context)
-    {
-        final IWorkspaceContextResolver wkResolver = 
-            IStructuredDocumentContextResolverFactory.
-                INSTANCE.getWorkspaceContextResolver(context);
-        
-        IProject project = wkResolver.getProject();
-        
-        IProjectFacetVersion  projectVersion = JSFAppConfigUtils.getProjectFacet(project);
-        
-        if (projectVersion != null)
-        {
-            return projectVersion.getVersionString();
-        }
-        
-        return null;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/BracketOperator.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/BracketOperator.java
deleted file mode 100644
index ac9308f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/BracketOperator.java
+++ /dev/null
@@ -1,184 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.validation.internal.el.operators;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.emf.common.util.Diagnostic;
-import org.eclipse.jdt.core.Signature;
-import org.eclipse.jst.jsf.common.internal.types.LiteralType;
-import org.eclipse.jst.jsf.common.internal.types.SignatureBasedType;
-import org.eclipse.jst.jsf.common.internal.types.TypeCoercer;
-import org.eclipse.jst.jsf.common.internal.types.TypeCoercionException;
-import org.eclipse.jst.jsf.common.internal.types.TypeConstants;
-import org.eclipse.jst.jsf.common.internal.types.TypeTransformer;
-import org.eclipse.jst.jsf.common.internal.types.ValueType;
-import org.eclipse.jst.jsf.context.symbol.IObjectSymbol;
-import org.eclipse.jst.jsf.context.symbol.ISymbol;
-import org.eclipse.jst.jsf.context.symbol.internal.util.IObjectSymbolBasedValueType;
-import org.eclipse.jst.jsf.designtime.DesignTimeApplicationManager;
-import org.eclipse.jst.jsf.designtime.el.AbstractDTPropertyResolver;
-import org.eclipse.jst.jsf.designtime.resolver.ISymbolContextResolver;
-import org.eclipse.jst.jsf.validation.internal.el.diagnostics.DiagnosticFactory;
-
-/**
- * Handles the operator 'bracket' where bracket(expr-a, id-b) == 'expr-a[id-b]' in EL syntax
- * 
- * @author cbateman
- *
- */
-public class BracketOperator extends MemberAccessorOperator
-{
-    private static final String OPERATOR_NAME_ARRAY_ACCESSOR = "array ('[]') accessor"; //$NON-NLS-1$
-
-    /**
-     * @param diagnosticFactory 
-     * @param file 
-     * @param resolver 
-     */
-    public BracketOperator(final DiagnosticFactory diagnosticFactory, final IFile file, final ISymbolContextResolver resolver)
-    {
-        super(file, diagnosticFactory, resolver);
-    }
-
-	protected SignatureBasedType handlePerformObjectSymbolValue(
-			IObjectSymbolBasedValueType firstArg, ValueType secondArg)
-	{
-        // per JSP.2.3.4 step 5.2, if value-a is a list or array access
-        if (firstArg.isInstanceOf(TypeConstants.TYPE_LIST)
-                || Signature.getArrayCount(firstArg.getSignature()) > 0)
-        {
-            return handlePerformNumericPropertyAccessorBase(firstArg, secondArg);
-        }
-
-        // per JSP.2.3.4 step 5, if value-a is a map or if it is not 
-        // a list or array (and therefore a bean), treat it as named property accessed object
-        // if firstArg is a map then we must treat the access like a map.get(secondArg)
-
-        // if we don't have a literal value with which to derive value-b, then
-        // we can't get a property
-        if (secondArg instanceof LiteralType)
-        {
-        	return handlePerformNamedPropertyAccessorBase(firstArg, (LiteralType)secondArg);
-        }
-
-        return null;
-	}
-	
-	protected Diagnostic validateObjectSymbolValue(IObjectSymbolBasedValueType firstArg,
-			ValueType secondArg) 
-	{
-        // per JSP.2.3.4 step 5.2, if value-a is a list or array access
-        if (firstArg.isInstanceOf(TypeConstants.TYPE_LIST)
-                || firstArg.getSymbol().getTypeDescriptor().isArray())
-        {
-            return validateNumericPropertyAccessorBase(firstArg, secondArg);
-        }
-
-        // per JSP.2.3.4 step 5, if value-a is a map or if it is not 
-        // a list or array (and therefore a bean), treat it as named property accessed object
-        // if firstArg is a map then we must treat the access like a map.get(secondArg)
-		if (secondArg instanceof LiteralType)
-		{
-			return validateNamedPropertyAccessorBase(firstArg, (LiteralType) secondArg);
-		}
-        // otherwise, there's nothing we can guarantee
-        return Diagnostic.OK_INSTANCE;
-	}
-	
-	private Diagnostic validateNumericPropertyAccessorBase(IObjectSymbolBasedValueType firstArg, 
-															ValueType secondArg)
-	{
-        try
-        {
-        	// secondArg must successfully coerce to integer
-        	TypeCoercer.coerceToNumber(TypeTransformer.transformBoxPrimitives(secondArg.getSignature()));
-        	
-        	if (secondArg instanceof LiteralType)
-        	{
-                // this will throw a TypeCoercionExceptino if it won't
-                // coerce
-                Integer integerValue = 
-                    (Integer) ((LiteralType)secondArg).coerceToNumber(Integer.class);
-
-        		if (integerValue.intValue() < 0)
-                {
-        		    return _diagnosticFactory.create_POSSIBLE_ARRAY_INDEX_OUT_OF_BOUNDS(integerValue);
-                }
-        	}
-            else
-            {
-                // if the argument is a non-literal string, we can't verify
-                // that the coercion to integer won't throw an exception
-                // at runtime
-                if (TypeCoercer.typeIsString(secondArg.getSignature()))
-                {
-                    return _diagnosticFactory.create_UNARY_OP_STRING_CONVERSION_NOT_GUARANTEED(OPERATOR_NAME_ARRAY_ACCESSOR);
-                }
-            }
-            
-            // TODO: attempt to detect ArrayIndexOutOfBoundsException
-            return Diagnostic.OK_INSTANCE;
-        }
-        catch (TypeCoercionException e)
-        {
-        	return _diagnosticFactory.create_BINARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION(OPERATOR_NAME_ARRAY_ACCESSOR);
-        }
-	}
-    
-    private SignatureBasedType handlePerformNumericPropertyAccessorBase(IObjectSymbolBasedValueType firstArg, 
-                                                            ValueType secondArg)
-    {
-        AbstractDTPropertyResolver propResolver = getPropertyResolver();
-        int index = 0;
-        if (secondArg instanceof LiteralType)
-        {
-            try {
-                index = ((LiteralType)secondArg).coerceToNumber(Integer.class).intValue();
-            } catch (TypeCoercionException e) {
-                // suppress, just use index = 0
-                // this maybe should be an assertion...
-            }
-        }
-        
-        final ISymbol symbol = 
-            propResolver.getProperty(firstArg.getSymbol(), index);
-        
-        if (symbol instanceof IObjectSymbol)
-        {
-            return IObjectSymbolBasedValueType.getInstance(symbol);
-        }
-        
-        // if can't be resolved, return null
-        return null;
-    }
-
-    @Override
-    protected String getOperatorName()
-    {
-        return Messages.getString("BracketOperator.Name"); //$NON-NLS-1$
-    }
-
-    /**
-     * @return the property resolver for the current source file
-     */
-    private AbstractDTPropertyResolver getPropertyResolver()
-    {
-        final DesignTimeApplicationManager manager =
-            DesignTimeApplicationManager.getInstance(_file.getProject());
-
-        if (manager != null)
-        {
-            return manager.getPropertyResolver();
-        }
-
-        return null;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/DivArithmeticBinaryOperator.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/DivArithmeticBinaryOperator.java
deleted file mode 100644
index 67242ec..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/DivArithmeticBinaryOperator.java
+++ /dev/null
@@ -1,266 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.validation.internal.el.operators;
-
-import java.math.BigDecimal;
-
-import org.eclipse.emf.common.util.Diagnostic;
-import org.eclipse.jdt.core.Signature;
-import org.eclipse.jst.jsf.common.internal.types.FloatLiteralType;
-import org.eclipse.jst.jsf.common.internal.types.IAssignable;
-import org.eclipse.jst.jsf.common.internal.types.IntegerLiteralType;
-import org.eclipse.jst.jsf.common.internal.types.LiteralType;
-import org.eclipse.jst.jsf.common.internal.types.TypeCoercer;
-import org.eclipse.jst.jsf.common.internal.types.TypeCoercionException;
-import org.eclipse.jst.jsf.common.internal.types.TypeConstants;
-import org.eclipse.jst.jsf.common.internal.types.TypeTransformer;
-import org.eclipse.jst.jsf.common.internal.types.ValueType;
-import org.eclipse.jst.jsf.validation.internal.el.diagnostics.DiagnosticFactory;
-
-/**
- * Represents dividing EL binary operators: div and / (same operator)
- * Based on JSP.2.3.5.2
- * 
- * @author cbateman
- *
- */
-/*package*/ class DivArithmeticBinaryOperator extends ArithmeticBinaryOperator 
-{
-
-    private static final String DIVISION = "division"; //$NON-NLS-1$
-
-    DivArithmeticBinaryOperator(DiagnosticFactory diagnosticFactory) {
-        super(diagnosticFactory);
-        // TODO Auto-generated constructor stub
-    }
-
-    public ValueType performOperation(ValueType firstArg, ValueType secondArg) 
-    {
-        // JSP.2.3.5.2, step one: if both null then always 0
-        if (TypeCoercer.typeIsNull(firstArg.getSignature())
-                && TypeCoercer.typeIsNull(secondArg.getSignature()))
-        {
-            return new IntegerLiteralType(0);
-        }
-        
-        final String boxedFirstArg = TypeTransformer.transformBoxPrimitives(firstArg.getSignature());
-        final String boxedSecondArg = TypeTransformer.transformBoxPrimitives(secondArg.getSignature());
-        
-        // JSP.2.3.5.2, step 2: if one arg is BigInteger or BigDecimal
-        // then coerce to BigDecimal and do div
-        if (TypeConstants.TYPE_BIG_DOUBLE.equals(boxedFirstArg)
-                || TypeConstants.TYPE_BIG_DOUBLE.equals(boxedSecondArg)
-                || TypeConstants.TYPE_BIG_INTEGER.equals(boxedFirstArg)
-                || TypeConstants.TYPE_BIG_INTEGER.equals(boxedSecondArg))
-        {
-            return performBigDecimal(firstArg, secondArg);
-        }
-        
-        return performDouble(firstArg, secondArg);
-    }
-
-    public Diagnostic validate(ValueType firstArg, ValueType secondArg) {
-    	if (TypeConstants.TYPE_JAVAOBJECT.equals(firstArg.getSignature()) ||
-    			TypeConstants.TYPE_JAVAOBJECT.equals(secondArg.getSignature())) {
-    		return Diagnostic.OK_INSTANCE;
-    	}
-
-    	// JSP.2.3.5.2, step one: if both null then always 0
-        if (TypeCoercer.typeIsNull(firstArg.getSignature())
-                && TypeCoercer.typeIsNull(secondArg.getSignature()))
-        {
-            return _diagnosticFactory.create_BINARY_OP_BOTH_OPERANDS_NULL(DIVISION);
-        }
-        
-        final String boxedFirstArg = TypeTransformer.transformBoxPrimitives(firstArg.getSignature());
-        final String boxedSecondArg = TypeTransformer.transformBoxPrimitives(secondArg.getSignature());
-        
-        // JSP.2.3.5.2, step 2: if one arg is BigInteger or BigDecimal
-        // then coerce to BigDecimal and do div
-        if (TypeConstants.TYPE_BIG_DOUBLE.equals(boxedFirstArg)
-                || TypeConstants.TYPE_BIG_DOUBLE.equals(boxedSecondArg)
-                || TypeConstants.TYPE_BIG_INTEGER.equals(boxedFirstArg)
-                || TypeConstants.TYPE_BIG_INTEGER.equals(boxedSecondArg))
-        {
-            return validateBigDecimal(firstArg, secondArg);
-        }
-        
-        return validateDouble(firstArg, secondArg);
-    }
-    
-    private ValueType performBigDecimal(ValueType firstArg, ValueType secondArg)
-    {
-        // since one or the other args must be either big decimal or big int,
-        // we don't have two literals, so it is sufficient to ensure that we can
-        // coerce both to numbers and check for div by zero and div of zero
-        try
-        {
-            TypeCoercer.coerceToNumber(TypeTransformer.transformBoxPrimitives(firstArg.getSignature()));
-            TypeCoercer.coerceToNumber(TypeTransformer.transformBoxPrimitives(secondArg.getSignature()));
-
-            // if we get to here, the result is always BigDecimal unless we have
-            // a div by zero
-            if (secondArg instanceof LiteralType)
-            {
-                final Number coercedValue = ((LiteralType)secondArg).coerceToNumber(BigDecimal.class);
-                if (((BigDecimal)coercedValue).equals(new BigDecimal(0)))
-                {
-                    return null;
-                }
-            }
-            
-            return new ValueType(TypeConstants.TYPE_BIG_DOUBLE, IAssignable.ASSIGNMENT_TYPE_RHS);
-        }
-        catch (TypeCoercionException ce)
-        {
-            return null;
-        }
-    }
-    
-    private ValueType performDouble(ValueType firstArg, ValueType secondArg)
-    {
-        try
-        {
-            TypeCoercer.coerceToNumber(TypeTransformer.transformBoxPrimitives(firstArg.getSignature()));
-            TypeCoercer.coerceToNumber(TypeTransformer.transformBoxPrimitives(secondArg.getSignature()));
-            
-            Number secondValue = null;
-            if (secondArg instanceof LiteralType)
-            {
-                secondValue = ((LiteralType)secondArg).coerceToNumber(Double.class);
-                // if the second value is definitely 0, then return null since
-                // we have a div by zero
-                if (secondValue.doubleValue() == 0.0)
-                {
-                    return null;
-                }
-            }
-
-            Number firstValue = null;
-            
-            if (firstArg instanceof LiteralType)
-            {
-                firstValue = ((LiteralType)firstArg).coerceToNumber(Double.class);
-            }
-            
-            if (firstValue != null && secondValue != null)
-            {
-                return new FloatLiteralType(
-                        doRealOperation(new Double(firstValue.doubleValue())
-                                , new Double(secondValue.doubleValue())).doubleValue());
-            }
-
-            // if not both literals and could coerce, then the type is double
-            return new ValueType(Signature.SIG_DOUBLE, IAssignable.ASSIGNMENT_TYPE_RHS);
-        }
-        catch (TypeCoercionException ce)
-        {
-            // could not coerce for the operation
-            return null;
-        }
-    }
-    
-    private Diagnostic validateBigDecimal(ValueType firstArg, ValueType secondArg)
-    {
-        // since one or the other args must be either big decimal or big int,
-        // we don't have two literals, so it is sufficient to ensure that we can
-        // coerce both to numbers and check for div by zero and div of zero
-        try
-        {
-            TypeCoercer.coerceToNumber(TypeTransformer.transformBoxPrimitives(firstArg.getSignature()));
-            TypeCoercer.coerceToNumber(TypeTransformer.transformBoxPrimitives(secondArg.getSignature()));
-
-            // if we get to here, the result is always BigDecimal unless we have
-            // a div by zero
-            if (secondArg instanceof LiteralType)
-            {
-                final Number coercedValue = ((LiteralType)secondArg).coerceToNumber(BigDecimal.class);
-                if (((BigDecimal)coercedValue).equals(new BigDecimal(0)))
-                {
-                    return _diagnosticFactory.create_BINARY_OP_POSSIBLE_DIVISION_BY_ZERO();
-                }
-            }
-            
-            // everything's okay if we get here
-            return Diagnostic.OK_INSTANCE;
-        }
-        catch (TypeCoercionException ce)
-        {
-            return _diagnosticFactory.create_BINARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION(DIVISION);
-        }
-    }
-    
-    private Diagnostic validateDouble(ValueType firstArg, ValueType secondArg)
-    {
-        try
-        {
-            TypeCoercer.coerceToNumber(TypeTransformer.transformBoxPrimitives(firstArg.getSignature()));
-            TypeCoercer.coerceToNumber(TypeTransformer.transformBoxPrimitives(secondArg.getSignature()));
-            
-            Number secondValue = null;
-            if (secondArg instanceof LiteralType)
-            {
-                secondValue = ((LiteralType)secondArg).coerceToNumber(Double.class);
-                // if the second value is definitely 0, then return null since
-                // we have a div by zero
-                if (secondValue.doubleValue() == 0.0)
-                {
-                    return _diagnosticFactory.create_BINARY_OP_POSSIBLE_DIVISION_BY_ZERO();
-                }
-            }
-
-            Number firstValue = null;
-            
-            if (firstArg instanceof LiteralType)
-            {
-                firstValue = ((LiteralType)firstArg).coerceToNumber(Double.class);
-            }
-            
-            if (firstValue != null && secondValue != null)
-            {
-                String result 
-                    = Double.toString(
-                            doRealOperation(new Double(firstValue.doubleValue()), 
-                                            new Double(secondValue.doubleValue())).doubleValue());
-
-                return _diagnosticFactory.create_BINARY_OP_CONSTANT_EXPRESSION_ALWAYS_EVAL_SAME(DIVISION, result);
-            }
-
-            // if not both literals and could coerce, then the type is double
-            return Diagnostic.OK_INSTANCE;
-        }
-        catch (TypeCoercionException ce)
-        {
-            // could not coerce for the operation
-            return _diagnosticFactory.create_BINARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION(DIVISION);
-        }
-    }
-
-    protected BigDecimal doRealOperation(BigDecimal firstArg, BigDecimal secondArg) {
-        // per JSP.2.3.5.2, step 2
-        return firstArg.divide(secondArg, BigDecimal.ROUND_HALF_UP);
-    }
-
-    protected Double doRealOperation(Double firstArg, Double secondArg) 
-    {
-        return new Double(firstArg.doubleValue() / secondArg.doubleValue());
-    }
-
-    protected Long doRealOperation(Long firstArg, Long secondArg) {
-        return Long.valueOf(firstArg.longValue() / secondArg.longValue());
-    }
-
-    protected String getOperatorName() {
-        return DIVISION;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/DotOperator.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/DotOperator.java
deleted file mode 100644
index f31950c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/DotOperator.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.validation.internal.el.operators;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.emf.common.util.Diagnostic;
-import org.eclipse.jst.jsf.common.internal.types.LiteralType;
-import org.eclipse.jst.jsf.common.internal.types.SignatureBasedType;
-import org.eclipse.jst.jsf.common.internal.types.ValueType;
-import org.eclipse.jst.jsf.context.symbol.internal.util.IObjectSymbolBasedValueType;
-import org.eclipse.jst.jsf.designtime.resolver.ISymbolContextResolver;
-import org.eclipse.jst.jsf.validation.internal.el.diagnostics.DiagnosticFactory;
-
-/**
- * Handles the operator 'dot' where dot(expr-a, id-b) == 'expr-a.id-b' in EL syntax
- * 
- * @author cbateman
- *
- */
-public class DotOperator extends MemberAccessorOperator
-{
-    /**
-     * @param diagnosticFactory 
-     * @param file
-     * @param resolver 
-     */
-    public DotOperator(final DiagnosticFactory diagnosticFactory, final IFile file, final ISymbolContextResolver resolver) 
-    {
-        super(file, diagnosticFactory, resolver);
-    }
-
-	protected SignatureBasedType handlePerformObjectSymbolValue(
-			IObjectSymbolBasedValueType firstArg, ValueType secondArg) 
-    {
-        // the dot operator (unlike the bracket) can only treat firstArg as 
-        // a named property accessor object
-        // if we don't have a literal value with which to derive value-b, then
-        // we can't get a property
-        if (secondArg instanceof LiteralType)
-        {
-        	return handlePerformNamedPropertyAccessorBase(firstArg, (LiteralType)secondArg);
-        }
-        return null;
-	}
-
-	public Diagnostic validateObjectSymbolValue(IObjectSymbolBasedValueType firstArg,
-												ValueType secondArg) 
-	{
-	    Diagnostic diag = Diagnostic.OK_INSTANCE;
-	    
-        if (secondArg instanceof LiteralType)
-        {
-        	diag = validateNamedPropertyAccessorBase(firstArg, (LiteralType) secondArg);
-        }
-
-        return diag;
-	}
-	
-    @Override
-    protected String getOperatorName()
-    {
-        return Messages.getString("DotOperator.Name"); //$NON-NLS-1$
-    }
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/EmptyUnaryOperator.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/EmptyUnaryOperator.java
deleted file mode 100644
index 8da62be..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/EmptyUnaryOperator.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.validation.internal.el.operators;
-
-import org.eclipse.emf.common.util.Diagnostic;
-import org.eclipse.jdt.core.Signature;
-import org.eclipse.jst.jsf.common.internal.types.BooleanLiteralType;
-import org.eclipse.jst.jsf.common.internal.types.NullLiteralType;
-import org.eclipse.jst.jsf.common.internal.types.StringLiteralType;
-import org.eclipse.jst.jsf.common.internal.types.TypeConstants;
-import org.eclipse.jst.jsf.common.internal.types.ValueType;
-import org.eclipse.jst.jsf.validation.internal.el.diagnostics.DiagnosticFactory;
-
-/**
- * Represents the EL unary operator '-' on a ValueType 
- * as described by JSP.2.3.7
- * 
- * @author cbateman
- *
- */
-/*package*/ class EmptyUnaryOperator extends UnaryOperator 
-{
-    private static final String EMPTY = "empty"; //$NON-NLS-1$
-
-    EmptyUnaryOperator(DiagnosticFactory diagnosticFactory) 
-    {
-        super(diagnosticFactory);
-    }
-
-    public ValueType performOperation(ValueType type) 
-    {
-        if (type instanceof StringLiteralType)
-        {
-            if ("".equals(((StringLiteralType)type).getLiteralValue())) //$NON-NLS-1$
-            {
-                // if the string is empty, operator always returns true
-                return BooleanLiteralType.TRUE;
-            }
-
-            // if the string is empty, operator always returns true
-            return BooleanLiteralType.FALSE;
-        }
-
-        // empty(null) is always true
-        if (type instanceof NullLiteralType)
-        {
-            return BooleanLiteralType.TRUE;
-        }
-        
-        // if the type is not string, array, Map, or Collection 
-        // then empty is always false
-        String testSig = type.getSignature();
-        
-        if (!TypeConstants.TYPE_STRING.equals(testSig)
-                && !type.isInstanceOf(TypeConstants.TYPE_COLLECTION)
-                && !type.isInstanceOf(TypeConstants.TYPE_MAP)
-                && Signature.getTypeSignatureKind(testSig) != Signature.ARRAY_TYPE_SIGNATURE)
-        {
-            return BooleanLiteralType.FALSE;
-        }
-        
-        // otherwise, return a generic boolean type
-        return new ValueType(TypeConstants.TYPE_BOOLEAN, type.getAssignability());
-    }
-
-    public Diagnostic validate(ValueType type) 
-    {
-        // empty always validates to false unless:
-        // the value is an empty string, array, map or collection
-        // one thing we do is see if the thing is a literal.  If it is
-        // we can warn that the value could be folded
-        if (type instanceof StringLiteralType)
-        {
-            String condition;
-            
-            if ("".equals(((StringLiteralType)type).getLiteralValue())) //$NON-NLS-1$
-            {
-                condition = "true"; //$NON-NLS-1$
-            }
-            else
-            {
-                condition = "false"; //$NON-NLS-1$
-            }
-
-            return _diagnosticFactory.
-                create_UNARY_OP_CONSTANT_EXPRESSION_EVAL_SAME_ID
-                    (EMPTY,condition);
-        }
-        
-        // empty(null) is always true
-        if (type instanceof NullLiteralType)
-        {
-            return _diagnosticFactory.
-            create_UNARY_OP_CONSTANT_EXPRESSION_EVAL_SAME_ID
-                (EMPTY,"true"); //$NON-NLS-1$
-        }
-        
-        // if the type is not string, array, Map, or Collection warn that
-        // this may be always false
-        String testSig = type.getSignature();
-        
-        if (!TypeConstants.TYPE_STRING.equals(testSig)
-                && !type.isInstanceOf(TypeConstants.TYPE_COLLECTION)
-                && !type.isInstanceOf(TypeConstants.TYPE_MAP)
-                && Signature.getTypeSignatureKind(testSig) != Signature.ARRAY_TYPE_SIGNATURE)
-        {
-            return _diagnosticFactory.create_UNARY_OP_EMPTY_ALWAYS_FALSE_ON_TYPE();
-        }
-        
-        return Diagnostic.OK_INSTANCE;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/EqualityRelationalBinaryOperator.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/EqualityRelationalBinaryOperator.java
deleted file mode 100644
index 963f9ad..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/EqualityRelationalBinaryOperator.java
+++ /dev/null
@@ -1,544 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.validation.internal.el.operators;
-
-import java.math.BigDecimal;
-import java.math.BigInteger;
-
-import org.eclipse.emf.common.util.Diagnostic;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jst.jsf.common.internal.types.BooleanLiteralType;
-import org.eclipse.jst.jsf.common.internal.types.IAssignable;
-import org.eclipse.jst.jsf.common.internal.types.LiteralType;
-import org.eclipse.jst.jsf.common.internal.types.StringLiteralType;
-import org.eclipse.jst.jsf.common.internal.types.TypeCoercer;
-import org.eclipse.jst.jsf.common.internal.types.TypeCoercionException;
-import org.eclipse.jst.jsf.common.internal.types.TypeConstants;
-import org.eclipse.jst.jsf.common.internal.types.TypeTransformer;
-import org.eclipse.jst.jsf.common.internal.types.ValueType;
-import org.eclipse.jst.jsf.common.util.TypeUtil;
-import org.eclipse.jst.jsf.context.symbol.internal.util.IObjectSymbolBasedValueType;
-import org.eclipse.jst.jsf.validation.internal.el.diagnostics.DiagnosticFactory;
-
-/**
- * A relational binary operator for equality: "==" or "!="
- * 
- * @author cbateman
- *
- */
-/*package*/ abstract class EqualityRelationalBinaryOperator extends RelationalBinaryOperator 
-{
-    EqualityRelationalBinaryOperator(final DiagnosticFactory diagnosticFactory, String jsfVersion) 
-    {
-        super(diagnosticFactory, jsfVersion);
-    }
-
-    /**
-     * @param firstArg
-     * @param secondArg
-     * @return the result of the operation
-     */
-    protected abstract boolean doRealOperation(Boolean firstArg, Boolean secondArg);
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.jsf.validation.internal.el.operators.BinaryOperator#performOperation(org.eclipse.jst.jsf.core.internal.types.ValueType, org.eclipse.jst.jsf.core.internal.types.ValueType)
-     */
-    public ValueType performOperation(ValueType firstArg, ValueType secondArg) 
-    {
-        // JSP.2.3.5.7 step 1 if operands are equal, then true for ==, false for !=
-        if (TypeCoercer.typeIsNull(firstArg.getSignature())
-                && TypeCoercer.typeIsNull(secondArg.getSignature()))
-        {
-            // perform the operation on two arguments that are equal.
-            return BooleanLiteralType.valueOf(doRealOperation(Integer.valueOf(4), Integer.valueOf(4)));
-        }
-        
-        String boxedFirstType = TypeTransformer.transformBoxPrimitives(firstArg.getSignature());
-        String boxedSecondType = TypeTransformer.transformBoxPrimitives(secondArg.getSignature());
-        
-        // JSP.2.3.5.7 step 3, if either is BigDecimal, promote both and compare
-        if (TypeConstants.TYPE_BIG_DOUBLE.equals(boxedFirstType)
-                || TypeConstants.TYPE_BIG_DOUBLE.equals(boxedSecondType))
-        {
-            return handleNumericComparison(firstArg, secondArg, BigDecimal.class);
-        }
-        
-        // JSP.2.3.5.7, step 4 if either is a float or double, promote both to 
-        // double and compare
-        if (TypeConstants.TYPE_BOXED_DOUBLE.equals(boxedFirstType)
-                || TypeConstants.TYPE_BOXED_FLOAT.equals(boxedFirstType)
-                || TypeConstants.TYPE_BOXED_DOUBLE.equals(boxedSecondType)
-                || TypeConstants.TYPE_BOXED_FLOAT.equals(boxedSecondType))
-        {
-            return handleNumericComparison(firstArg, secondArg, Double.class);
-        }
-        
-        // JSP.2.3.5.7, step 5 if either is a big integer, promote and compare
-        if (TypeConstants.TYPE_BIG_INTEGER.equals(boxedFirstType)
-                || TypeConstants.TYPE_BIG_INTEGER.equals(boxedSecondType))
-        {
-            return handleNumericComparison(firstArg, secondArg, BigInteger.class);
-        }
-        
-        // JSP.2.3.5.7, step 6 if either is Long or smaller, coerce both to Long
-        if (TypeConstants.TYPE_BOXED_LONG.equals(boxedFirstType)
-                || TypeConstants.TYPE_BOXED_LONG.equals(boxedSecondType)
-                || TypeConstants.TYPE_BOXED_INTEGER.equals(boxedFirstType)
-                || TypeConstants.TYPE_BOXED_INTEGER.equals(boxedSecondType)
-                || TypeConstants.TYPE_BOXED_SHORT.equals(boxedFirstType)
-                || TypeConstants.TYPE_BOXED_SHORT.equals(boxedSecondType)
-                || TypeConstants.TYPE_BOXED_BYTE.equals(boxedFirstType)
-                || TypeConstants.TYPE_BOXED_BYTE.equals(boxedSecondType)
-                || TypeConstants.SIGNATURE_BOXED_CHARACTER.equals(boxedFirstType)
-                || TypeConstants.SIGNATURE_BOXED_CHARACTER.equals(boxedSecondType))
-        {
-            return handleNumericComparison(firstArg, secondArg, Long.class);
-        }
-        
-        // JSP.2.3.5.7, step 7 if either is a boolean, coerce to boolean
-        if (TypeConstants.TYPE_BOXED_BOOLEAN.equals(boxedFirstType)
-                || TypeConstants.TYPE_BOXED_BOOLEAN.equals(boxedSecondType))
-        {
-            return handleBooleanComparison(firstArg, secondArg);
-        }
-        
-        // Unified EL 1.8.2, step 8 if either is a enum, then coerce both to enum
-        // NOTE: we handle the JSF 1.1 case also where enums are treated as non-coercable
-        // Object's
-        if (firstArg.isEnumType() || secondArg.isEnumType())
-        {
-            return handleEnumComparison(firstArg, secondArg);
-        }
-        
-        // JSP.2.3.5.7, step 8 if either is a string, coerce to string and
-        // compare lexically
-        if (TypeConstants.TYPE_STRING.equals(boxedFirstType)
-                || TypeConstants.TYPE_STRING.equals(boxedSecondType))
-        {
-            return handleStringComparison(firstArg, secondArg);
-        }
-        
-        // otherwise, an equal compare will be done A.equals(B).  Since 
-        return new ValueType(TypeConstants.TYPE_BOOLEAN, IAssignable.ASSIGNMENT_TYPE_RHS);
-    }
-
-    private ValueType handleEnumComparison(ValueType firstArg,
-            ValueType secondArg) 
-    {
-        assert firstArg.isEnumType() || secondArg.isEnumType();
-        
-        // if the first is not an enum, then we have non-Enum == Enum case
-        if (!firstArg.isEnumType())
-        {
-            return handleComparsionOfEnumAndNonEnum(secondArg, firstArg);
-        }
-        
-        // if the second is not an enum, then we have Enum == non-Enum case
-        if (!secondArg.isEnumType())
-        {
-            return handleComparsionOfEnumAndNonEnum(firstArg, secondArg);
-        }
-        
-        // only other case is they are both enums.  Check if they are directly
-        // comparable.
-        if (TypeUtil.canNeverBeEqual(firstArg.getSignature(), secondArg.getSignature()))
-        {
-            boolean result = doRealOperation("foo", "notFoo");  // just simulate the operation where the operands are not equal //$NON-NLS-1$ //$NON-NLS-2$
-            
-            return BooleanLiteralType.valueOf(result);
-        }
-        
-        // otherwise, all we know is that it's a boolean
-        return new ValueType(TypeConstants.TYPE_BOOLEAN, IAssignable.ASSIGNMENT_TYPE_RHS);
-    }
-
-    private ValueType handleComparsionOfEnumAndNonEnum(ValueType enumType,
-            ValueType nonEnumType) 
-    {
-        // the only literal value that could have got us here is a 
-        // StringLiteralValue since the others a filtered out before this is
-        // called
-        if (nonEnumType instanceof LiteralType)
-        {
-            assert nonEnumType instanceof StringLiteralType;
-            
-            Diagnostic result = validateIfEnumToStringComparison(((StringLiteralType)nonEnumType).getLiteralValue(), enumType);
-            
-            if (result != null)
-            {
-                // compare two things that aren't equal
-                return BooleanLiteralType.valueOf(doRealOperation("foo", "foo_")); //$NON-NLS-1$ //$NON-NLS-2$
-            }
-            return new ValueType(TypeConstants.TYPE_BOOLEAN, IAssignable.ASSIGNMENT_TYPE_RHS);
-        }
-        
-        // if the arg is a String, then we can't prove anything before runtime
-        if (nonEnumType.isInstanceOf(TypeConstants.TYPE_STRING))
-        {
-            return new ValueType(TypeConstants.TYPE_BOOLEAN, IAssignable.ASSIGNMENT_TYPE_RHS);
-        }
-        // otherwise, we know it will result in a problem since one is an enum
-        // and the other isn't so simply do a comparison on two things that aren't equals
-        return BooleanLiteralType.valueOf(doRealOperation("foo", "foo_")); //$NON-NLS-1$ //$NON-NLS-2$
-    }
-
-    public Diagnostic validate(ValueType firstArg, ValueType secondArg) {
-    	if (TypeConstants.TYPE_JAVAOBJECT.equals(firstArg.getSignature()) ||
-    			TypeConstants.TYPE_JAVAOBJECT.equals(secondArg.getSignature())) {
-    		return Diagnostic.OK_INSTANCE;
-    	}
-        
-        // JSP.2.3.5.7 step 2 if either operand is null, then not equal
-        if (TypeCoercer.typeIsNull(firstArg.getSignature())
-                && TypeCoercer.typeIsNull(secondArg.getSignature()))
-        {
-            // perform the operation on two arguments that are equal.
-            final boolean result = doRealOperation(Integer.valueOf(4), Integer.valueOf(4));
-            return _diagnosticFactory.create_BINARY_OP_EQUALITY_COMP_WITH_NULL_ALWAYS_EVAL_SAME(Boolean.toString(result));
-        }
-
-        final String boxedFirstType = 
-            TypeTransformer.transformBoxPrimitives(firstArg.getSignature());
-        final String boxedSecondType = 
-            TypeTransformer.transformBoxPrimitives(secondArg.getSignature());
-        
-        // JSP.2.3.5.7 step 3, if either is BigDecimal, promote both and compare
-        if (TypeConstants.TYPE_BIG_DOUBLE.equals(boxedFirstType)
-                || TypeConstants.TYPE_BIG_DOUBLE.equals(boxedSecondType))
-        {
-            return validateNumericComparison(firstArg, secondArg, BigDecimal.class);
-        }
-        
-        // JSP.2.3.5.7, step 4 if either is a float or double, promote both to 
-        // double and compare
-        if (TypeConstants.TYPE_BOXED_DOUBLE.equals(boxedFirstType)
-                || TypeConstants.TYPE_BOXED_FLOAT.equals(boxedFirstType)
-                || TypeConstants.TYPE_BOXED_DOUBLE.equals(boxedSecondType)
-                || TypeConstants.TYPE_BOXED_FLOAT.equals(boxedSecondType))
-        {
-            return validateNumericComparison(firstArg, secondArg, Double.class);
-        }
-        
-        // JSP.2.3.5.7, step 5 if either is a big integer, promote and compare
-        if (TypeConstants.TYPE_BIG_INTEGER.equals(boxedFirstType)
-                || TypeConstants.TYPE_BIG_INTEGER.equals(boxedSecondType))
-        {
-            return validateNumericComparison(firstArg, secondArg, BigInteger.class);
-        }
-        
-        // JSP.2.3.5.7, step 6 if either is Long or smaller, coerce both to Long
-        if (TypeConstants.TYPE_BOXED_LONG.equals(boxedFirstType)
-                || TypeConstants.TYPE_BOXED_LONG.equals(boxedSecondType)
-                || TypeConstants.TYPE_BOXED_INTEGER.equals(boxedFirstType)
-                || TypeConstants.TYPE_BOXED_INTEGER.equals(boxedSecondType)
-                || TypeConstants.TYPE_BOXED_SHORT.equals(boxedFirstType)
-                || TypeConstants.TYPE_BOXED_SHORT.equals(boxedSecondType)
-                || TypeConstants.TYPE_BOXED_BYTE.equals(boxedFirstType)
-                || TypeConstants.TYPE_BOXED_BYTE.equals(boxedSecondType)
-                || TypeConstants.SIGNATURE_BOXED_CHARACTER.equals(boxedFirstType)
-                || TypeConstants.SIGNATURE_BOXED_CHARACTER.equals(boxedSecondType))
-        {
-            return validateNumericComparison(firstArg, secondArg, Long.class);
-        }
-        
-        // JSP.2.3.5.7, step 7 if either is a boolean, coerce to boolean
-        if (TypeConstants.TYPE_BOXED_BOOLEAN.equals(boxedFirstType)
-                || TypeConstants.TYPE_BOXED_BOOLEAN.equals(boxedSecondType))
-        {
-            return validateBooleanComparison(firstArg, secondArg);
-        }
-        
-        // Unified EL 1.8.2, step 8 if either is a enum, then coerce both to enum
-        // NOTE: we handle the JSF 1.1 case also where enums are treated as non-coercable
-        // Object's
-        if (firstArg.isEnumType() || secondArg.isEnumType())
-        {
-            return validateEnumComparison(firstArg, secondArg);
-        }
-        
-        // JSP.2.3.5.7, step 8 if either is a string, coerce to string and
-        // compare lexically
-        if (TypeConstants.TYPE_STRING.equals(boxedFirstType)
-                || TypeConstants.TYPE_STRING.equals(boxedSecondType))
-        {
-            return validateStringComparison(firstArg, secondArg);
-        }
-
-        // otherwise, an equal compare will be done A.equals(B).  Since 
-        return Diagnostic.OK_INSTANCE;
-    }
-
-    
-    /**
-     * Both types are coerced to boolean before comparison
-     * 
-     * @param firstArg
-     * @param secondArg
-     * @return the result of the comparison
-     */
-    private ValueType handleBooleanComparison(ValueType firstArg, ValueType secondArg)
-    {
-        boolean canCoerceFirstArg =  
-            TypeCoercer.canCoerceToBoolean(TypeTransformer.transformBoxPrimitives(firstArg.getSignature()));
-        boolean canCoerceSecondArg = TypeCoercer.canCoerceToBoolean(TypeTransformer.transformBoxPrimitives(secondArg.getSignature()));
-
-        if (! (canCoerceFirstArg && canCoerceSecondArg))
-        {
-            return null;
-        }
-        
-        if (firstArg instanceof LiteralType && secondArg instanceof LiteralType)
-        {
-            try
-            {
-                Boolean firstValue = ((LiteralType)firstArg).coerceToBoolean();
-                Boolean secondValue = ((LiteralType)secondArg).coerceToBoolean();
-                
-                if (firstValue != null && secondValue != null)
-                {
-                    boolean result = doRealOperation(firstValue, secondValue);
-                    return result ? 
-                               BooleanLiteralType.TRUE : 
-                                       BooleanLiteralType.FALSE;
-                }
-            }
-            catch (TypeCoercionException tce)
-            {
-                throw new AssertionError("should never get here; have already checked coercability above"); //$NON-NLS-1$
-            }
-        }
-        
-        // otherwise, we have a valid comparison that results in boolean
-        return new ValueType(TypeConstants.TYPE_BOOLEAN, IAssignable.ASSIGNMENT_TYPE_RHS);
-    }
-    
-    private Diagnostic validateBooleanComparison(ValueType firstType, ValueType secondType)
-    {
-        boolean canCoerceFirstArg =  
-            TypeCoercer.canCoerceToBoolean(TypeTransformer.transformBoxPrimitives(firstType.getSignature()));
-        boolean canCoerceSecondArg = TypeCoercer.canCoerceToBoolean(TypeTransformer.transformBoxPrimitives(secondType.getSignature()));
-
-        if (!canCoerceFirstArg)
-        {
-            return _diagnosticFactory.create_BINARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN(Messages.getString("EqualityRelationalBinaryOperator.FirstArgument")); //$NON-NLS-1$
-        }
-        
-        if (!canCoerceSecondArg)
-        {
-            return _diagnosticFactory.create_BINARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN(Messages.getString("EqualityRelationalBinaryOperator.SecondArgument")); //$NON-NLS-1$
-        }
-        
-        if (firstType instanceof LiteralType && secondType instanceof LiteralType)
-        {
-            try
-            {
-                Boolean firstValue = ((LiteralType)firstType).coerceToBoolean();
-                Boolean secondValue = ((LiteralType)secondType).coerceToBoolean();
-                
-                if (firstValue != null && secondValue != null)
-                {
-                    final boolean result = 
-                        doRealOperation(firstValue, secondValue);
-                    return _diagnosticFactory.
-                        create_BINARY_OP_CONSTANT_EXPRESSION_ALWAYS_EVAL_SAME(getOperationName(), Boolean.toString(result));
-                }
-            }
-            catch (TypeCoercionException tce)
-            {
-                throw new AssertionError("should never get here; have already checked coercability above"); //$NON-NLS-1$
-            }
-        }
-        
-        // otherwise, we have a valid comparison
-        return Diagnostic.OK_INSTANCE;
-    }
-    
-    @Override
-    protected Diagnostic validateStringComparison(ValueType firstType,
-            ValueType secondType) 
-    {
-        String firstValue = null;
-
-        if (firstType instanceof LiteralType)
-        {
-            firstValue = ((LiteralType)firstType).getLiteralValue();
-        }
-
-        String secondValue = null;
-        if (secondType instanceof LiteralType)
-        {
-            secondValue = ((LiteralType)secondType).getLiteralValue();
-        }
-
-        if (firstValue != null)
-        { 
-            Diagnostic result = validateIfEnumToStringComparison(firstValue, secondType);
-            
-            if (result != null)
-            {
-                return result;
-            }
-        }
-
-        if (secondValue != null)
-        {
-            Diagnostic result = validateIfEnumToStringComparison(secondValue, firstType);
-            
-            if (result != null)
-            {
-                return result;
-            }
-        }
-        
-        // if it's a string to enum compare, do the default parent thing
-        return super.validateStringComparison(firstType, secondType);
-    }
-
-    
-    @Override
-    protected ValueType handleStringComparison(ValueType firstType,
-            ValueType secondType) 
-    {
-        String firstValue = null;
-
-        if (firstType instanceof LiteralType)
-        {
-            firstValue = ((LiteralType)firstType).getLiteralValue();
-        }
-
-        String secondValue = null;
-        if (secondType instanceof LiteralType)
-        {
-            secondValue = ((LiteralType)secondType).getLiteralValue();
-        }
-
-        if (firstValue != null)
-        { 
-            Diagnostic result = validateIfEnumToStringComparison(firstValue, secondType);
-            
-            if (result != null)
-            {
-                return handleIfEnumToNonMemberStringComparison(firstValue, secondType);
-            }
-        }
-
-        if (secondValue != null)
-        {
-            Diagnostic result = validateIfEnumToStringComparison(secondValue, firstType);
-            
-            if (result != null)
-            {
-                return handleIfEnumToNonMemberStringComparison(secondValue, firstType);
-            }
-        }
-
-        // otherwise, do the super thing
-        return super.handleStringComparison(firstType, secondType);
-    }
-
-    private Diagnostic validateEnumComparison(final ValueType firstArg, final ValueType secondArg)
-    {
-        assert firstArg.isEnumType() || secondArg.isEnumType();
-        
-        // if the first is not an enum, then we have non-Enum == Enum case
-        if (!firstArg.isEnumType())
-        {
-            return validateComparsionOfEnumAndNonEnum(firstArg, secondArg);
-        }
-        
-        // if the second is not an enum, then we have Enum == non-Enum case
-        if (!secondArg.isEnumType())
-        {
-            return validateComparsionOfEnumAndNonEnum(secondArg, firstArg);
-        }
-        
-        // only other case is they are both enums.  Check if they are directly
-        // comparable.
-        if (TypeUtil.canNeverBeEqual(firstArg.getSignature(), secondArg.getSignature()))
-        {
-            return _diagnosticFactory.
-                create_BINARY_COMPARISON_WITH_TWO_ENUMS_ALWAYS_SAME
-                    (getOperationName()
-                     , doRealOperation("foo", "notFoo")  // just simulate the operation where the operands are not equal //$NON-NLS-1$ //$NON-NLS-2$
-                     , TypeUtil.getFullyQualifiedName(firstArg.getSignature())
-                     , TypeUtil.getFullyQualifiedName(secondArg.getSignature())); 
-        }
-        
-        // otherwise, it's all good
-        return Diagnostic.OK_INSTANCE;
-    }
-    
-    private Diagnostic validateComparsionOfEnumAndNonEnum(final ValueType nonEnumType, final ValueType enumType)
-    {
-        // the only literal value that could have got us here is a 
-        // StringLiteralValue since the others a filtered out before this is
-        // called
-        if (nonEnumType instanceof LiteralType)
-        {
-            assert nonEnumType instanceof StringLiteralType;
-            
-            Diagnostic result = validateIfEnumToStringComparison(((StringLiteralType)nonEnumType).getLiteralValue(), enumType);
-            
-            if (result != null)
-            {
-                return result;
-            }
-            return Diagnostic.OK_INSTANCE;
-        }
-        
-        // if the arg is a String, then we can't prove anything before runtime
-        if (nonEnumType.isInstanceOf(TypeConstants.TYPE_STRING))
-        {
-            return Diagnostic.OK_INSTANCE;
-        }
-        // otherwise, we know it will result in a problem since one is an enum
-        // and the other isn't
-        return _diagnosticFactory.
-            create_BINARY_COMPARISON_WITH_ENUM_AND_UNCOERCABLE_NONCONST_ALWAYS_SAME
-                (getOperationName()
-                 , doRealOperation("foo", "notFoo")  // just simulate the operation where the operands are not equal //$NON-NLS-1$ //$NON-NLS-2$
-                 , TypeUtil.getFullyQualifiedName(enumType.getSignature())
-                 , TypeUtil.getFullyQualifiedName(nonEnumType.getSignature())); 
-    }
-    
-    private Diagnostic validateIfEnumToStringComparison(final String literalValue, final ValueType validateIfEnum)
-    {
-        if (validateIfEnum.isEnumType()
-                && validateIfEnum instanceof IObjectSymbolBasedValueType)
-        {
-            final IObjectSymbolBasedValueType symbolValueType =
-                (IObjectSymbolBasedValueType) validateIfEnum;
-            
-            IType type = symbolValueType.getSymbol().getTypeDescriptor().resolveType(symbolValueType.getSymbol().getTypeDescriptor().getTypeSignature());
-            
-            if (type != null && !TypeUtil.isEnumMember(type, literalValue))
-            {
-                return _diagnosticFactory.
-                    create_BINARY_COMPARISON_WITH_ENUM_AND_CONST_ALWAYS_SAME
-                        (getOperationName()
-                         , doRealOperation(literalValue, literalValue+"_")  // just simulate the operation where the operands are not equal //$NON-NLS-1$
-                         , TypeUtil.getFullyQualifiedName(validateIfEnum.getSignature())
-                         , literalValue);
-            }
-        }
-       
-        return null;
-    }
-    
-    private ValueType handleIfEnumToNonMemberStringComparison(final String literalValue, final ValueType enumValueType)
-    {
-        // we need to apply the real operation to literalValue and any string that !equals(literalValue)
-        // since it's not a member of the enum
-        return BooleanLiteralType.valueOf(doRealOperation(literalValue, literalValue+"_")); //$NON-NLS-1$
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/EqualsBinaryRelationalOperator.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/EqualsBinaryRelationalOperator.java
deleted file mode 100644
index 3fa99f4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/EqualsBinaryRelationalOperator.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.validation.internal.el.operators;
-
-import org.eclipse.jst.jsf.validation.internal.el.diagnostics.DiagnosticFactory;
-
-/**
- * Represents the equals -- ==/eq EL binary operator
- * 
- * @author cbateman
- *
- */
-/*package*/ class EqualsBinaryRelationalOperator extends
-        EqualityRelationalBinaryOperator 
-{
-
-    EqualsBinaryRelationalOperator(final DiagnosticFactory diagnosticFactory, String jsfVersion) {
-        super(diagnosticFactory, jsfVersion);
-    }
-
-    /**
-     * @param firstArg
-     * @param secondArg
-     * @return the result of the operation
-     */
-    protected boolean doRealOperation(Number firstArg, Number secondArg)
-    {
-        return firstArg.equals(secondArg);
-    }
-    
-    /**
-     * @param firstArg
-     * @param secondArg
-     * @return the result of the operation
-     */
-    protected boolean doRealOperation(Boolean firstArg, Boolean secondArg)
-    {
-        return firstArg.equals(secondArg);
-    }
-    
-    /**
-     * @param firstArg
-     * @param secondArg
-     * @return the result  of the operation
-     */
-    protected boolean doRealOperation(String firstArg, String secondArg)
-    {
-        return firstArg.equals(secondArg);
-    }
-
-    protected String getOperationName() 
-    {
-        return Messages.getString("EqualsBinaryRelationalOperator.OperationName"); //$NON-NLS-1$
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/GreaterThanEqRelationalBinaryOperator.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/GreaterThanEqRelationalBinaryOperator.java
deleted file mode 100644
index edab570..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/GreaterThanEqRelationalBinaryOperator.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.validation.internal.el.operators;
-
-import org.eclipse.jst.jsf.validation.internal.el.diagnostics.DiagnosticFactory;
-
-/**
- * Encapsulates the EL greater-than-eq operator -- ">="/ge
- * 
- * @author cbateman
- *
- */
-/*package*/ class GreaterThanEqRelationalBinaryOperator extends
-        LtGtRelationalBinaryOperator 
-{
-    GreaterThanEqRelationalBinaryOperator(final DiagnosticFactory diagnosticFactory, String jsfVersion) {
-        super(diagnosticFactory, jsfVersion);
-    }
-
-    protected boolean doRealOperation(Number firstArg, Number secondArg) 
-    {
-        return ((Comparable)firstArg).compareTo(secondArg) >= 0;
-    }
-
-    protected boolean doRealOperation(String firstArg, String secondArg) 
-    {
-        return firstArg.compareTo(secondArg) >= 0;
-    }
-
-    protected String getOperationName() 
-    {
-        return Messages.getString("GreaterThanEqRelationalBinaryOperator.OperationName"); //$NON-NLS-1$
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/GreaterThanRelationalBinaryOperator.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/GreaterThanRelationalBinaryOperator.java
deleted file mode 100644
index 78a62a7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/GreaterThanRelationalBinaryOperator.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.validation.internal.el.operators;
-
-import org.eclipse.jst.jsf.validation.internal.el.diagnostics.DiagnosticFactory;
-
-/**
- * Represents the EL greater than operator -- ">"/gt
- * @author cbateman
- *
- */
-/*package*/ class GreaterThanRelationalBinaryOperator extends
-        LtGtRelationalBinaryOperator {
-
-    GreaterThanRelationalBinaryOperator(final DiagnosticFactory diagnosticFactory, String jsfVersion) 
-    {
-        super(diagnosticFactory, jsfVersion);
-    }
-
-    protected boolean doRealOperation(Number firstArg, Number secondArg) 
-    {
-        return ((Comparable)firstArg).compareTo(secondArg) > 0;
-    }
-
-    protected boolean doRealOperation(String firstArg, String secondArg) 
-    {
-        return firstArg.compareTo(secondArg) > 0;
-    }
-
-    protected String getOperationName() 
-    {
-        return Messages.getString("GreaterThanRelationalBinaryOperator.OperationName"); //$NON-NLS-1$
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/LessThanEqRelationalBinaryOperator.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/LessThanEqRelationalBinaryOperator.java
deleted file mode 100644
index 24dc5e2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/LessThanEqRelationalBinaryOperator.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.validation.internal.el.operators;
-
-import org.eclipse.jst.jsf.validation.internal.el.diagnostics.DiagnosticFactory;
-
-
-/**
- * Encapsulates the EL less-than-equal operator -- "<="/le
- * 
- * @author cbateman
- *
- */
-/*package*/ class LessThanEqRelationalBinaryOperator extends
-        LtGtRelationalBinaryOperator 
-{
-    LessThanEqRelationalBinaryOperator(final DiagnosticFactory diagnosticFactory, String jsfVersion) {
-        super(diagnosticFactory, jsfVersion);
-    }
-
-    protected boolean doRealOperation(Number firstArg, Number secondArg) 
-    {
-        return ((Comparable)firstArg).compareTo(secondArg) <= 0;
-    }
-
-    protected boolean doRealOperation(String firstArg, String secondArg) 
-    {
-        return firstArg.compareTo(secondArg) <= 0;
-    }
-
-    protected String getOperationName() 
-    {
-        return Messages.getString("LessThanEqRelationalBinaryOperator.OperationName"); //$NON-NLS-1$
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/LessThanRelationalBinaryOperator.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/LessThanRelationalBinaryOperator.java
deleted file mode 100644
index 7b8e7ea..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/LessThanRelationalBinaryOperator.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.validation.internal.el.operators;
-
-import org.eclipse.jst.jsf.validation.internal.el.diagnostics.DiagnosticFactory;
-
-/**
- * The "<"/"lt" less-than EL operator
- * 
- * @author cbateman
- *
- */
-/*package*/ class LessThanRelationalBinaryOperator extends
-        LtGtRelationalBinaryOperator 
-{
-    LessThanRelationalBinaryOperator(final DiagnosticFactory diagnosticFactory, String jsfVersion) 
-    {
-        super(diagnosticFactory, jsfVersion);
-    }
-
-    protected boolean doRealOperation(Number firstArg, Number secondArg) 
-    {
-        return ((Comparable)firstArg).compareTo(secondArg) < 0;
-    }
-
-    protected boolean doRealOperation(String firstArg, String secondArg) 
-    {
-        return firstArg.compareTo(secondArg) < 0;
-    }
-
-    protected String getOperationName() 
-    {
-        return Messages.getString("LessThanRelationalBinaryOperator.OperationName"); //$NON-NLS-1$
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/LogicalBinaryOperator.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/LogicalBinaryOperator.java
deleted file mode 100644
index deb4e9b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/LogicalBinaryOperator.java
+++ /dev/null
@@ -1,183 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.validation.internal.el.operators;
-
-import org.eclipse.emf.common.util.Diagnostic;
-import org.eclipse.jst.jsf.common.internal.types.BooleanLiteralType;
-import org.eclipse.jst.jsf.common.internal.types.IAssignable;
-import org.eclipse.jst.jsf.common.internal.types.LiteralType;
-import org.eclipse.jst.jsf.common.internal.types.TypeCoercer;
-import org.eclipse.jst.jsf.common.internal.types.TypeCoercionException;
-import org.eclipse.jst.jsf.common.internal.types.TypeConstants;
-import org.eclipse.jst.jsf.common.internal.types.TypeTransformer;
-import org.eclipse.jst.jsf.common.internal.types.ValueType;
-import org.eclipse.jst.jsf.validation.internal.el.diagnostics.DiagnosticFactory;
-
-/**
- * Represents a logical binary operator per JSP.2.3.6.1 (logical and/or)
- * 
- * @author cbateman
- *
- */
-/*package*/abstract class LogicalBinaryOperator extends BinaryOperator 
-{
-    LogicalBinaryOperator(DiagnosticFactory diagnosticFactory) {
-        super(diagnosticFactory);
-    }
-
-    public ValueType performOperation(ValueType firstArg, ValueType secondArg) 
-    {
-        final boolean canCoerceFirstArg = 
-            TypeCoercer.canCoerceToBoolean(TypeTransformer.transformBoxPrimitives(firstArg.getSignature()));
-        final boolean canCoerceSecondArg = 
-            TypeCoercer.canCoerceToBoolean(TypeTransformer.transformBoxPrimitives(secondArg.getSignature()));
-        
-        // if can't perform, must return null
-        if (! (canCoerceFirstArg && canCoerceSecondArg))
-        {
-            return null;
-        }
-
-        Boolean  firstArgResolvedValue = null;
-        
-        if (firstArg instanceof LiteralType)
-        {
-            try
-            {
-                firstArgResolvedValue = ((LiteralType)firstArg).coerceToBoolean();
-            }
-            catch (TypeCoercionException tce)
-            {
-                // should never be throw due to already checking if can coerce
-                throw new AssertionError("coercion already checked; this should never be reached"); //$NON-NLS-1$
-            }
-        }
-    
-        Boolean secondArgResolvedValue = null;
-        if (secondArg instanceof LiteralType)
-        {
-            try
-            {
-                secondArgResolvedValue = ((LiteralType)secondArg).coerceToBoolean();
-            }
-            catch (TypeCoercionException tce)
-            {
-                // should never be throw due to already checking if can coerce
-                throw new AssertionError("coercion already checked; this should never be reached"); //$NON-NLS-1$
-            }
-        }
-
-        if (firstArgResolvedValue != null && secondArgResolvedValue != null)
-        {
-            boolean result = 
-                doRealOperation(firstArgResolvedValue, secondArgResolvedValue);
-            
-            return result ? BooleanLiteralType.TRUE : BooleanLiteralType.FALSE;
-            
-        }
-        
-        // otherwise, just return a boolean
-        // result can only be an rvalue
-        return new ValueType(TypeConstants.TYPE_BOOLEAN, IAssignable.ASSIGNMENT_TYPE_RHS);
-    }
-
-    public Diagnostic validate(ValueType firstArg, ValueType secondArg) 
-    {
-    	if (TypeConstants.TYPE_JAVAOBJECT.equals(firstArg.getSignature()) ||
-    			TypeConstants.TYPE_JAVAOBJECT.equals(secondArg.getSignature())) {
-    		return Diagnostic.OK_INSTANCE;
-    	}
-
-        final boolean canCoerceFirstArg = 
-            TypeCoercer.canCoerceToBoolean(TypeTransformer.transformBoxPrimitives(firstArg.getSignature()));
-        final boolean canCoerceSecondArg = 
-            TypeCoercer.canCoerceToBoolean(TypeTransformer.transformBoxPrimitives(secondArg.getSignature()));
-       
-        if (!canCoerceFirstArg)
-        {
-            return _diagnosticFactory.
-                    create_BINARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN("first"); //$NON-NLS-1$
-            //return new BasicDiagnostic(Diagnostic.ERROR, "", 0, "Cannot coerce first argument of "+readableOperatorName()+" to boolean", null);
-        }
-       
-        if (!canCoerceSecondArg)
-        {
-            return _diagnosticFactory.
-                create_BINARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN("first"); //$NON-NLS-1$
-
-            //return new BasicDiagnostic(Diagnostic.ERROR, "", 0, "Cannot coerce second argument of "+readableOperatorName()+" to boolean", null);
-        }
-           
-        if (firstArg instanceof LiteralType)
-        {
-            try
-            {
-                final Boolean boolValue = 
-                    ((LiteralType)firstArg).coerceToBoolean();
-         
-                if (boolValue.booleanValue() == shortCircuitValue())
-                {
-                    return _diagnosticFactory.
-                        create_BINARY_OP_FIRST_ARGUMENT_SHORT_CIRCUITS
-                            (shortCircuitValue(), readableOperatorName());
-                }
-            }
-            catch (TypeCoercionException tce)
-            {
-                // should never be throw due to already checking if can coerce
-                throw new AssertionError("coercion already checked; this should never be reached"); //$NON-NLS-1$
-            }
-        }
-        
-        if (secondArg instanceof LiteralType)
-        {
-            try
-            {
-                final Boolean boolValue =
-                    ((LiteralType)secondArg).coerceToBoolean();
- 
-                if (boolValue.booleanValue() == shortCircuitValue())
-                {
-                    return _diagnosticFactory.
-                        create_BINARY_OP_SECOND_ARGUMENT_ALWAYS_EVAL_SAME
-                            (shortCircuitValue(), readableOperatorName());
-                }
-            }
-            catch (TypeCoercionException tce)
-            {
-                // should never be throw due to already checking if can coerce
-                throw new AssertionError("coercion already checked; this should never be reached"); //$NON-NLS-1$
-            }
-        }
-           
-        // otherwise, nothing to report
-        return Diagnostic.OK_INSTANCE;
-    }
-    
-    /**
-     * @return a human readable name for the operator
-     */
-    protected abstract String readableOperatorName();
-    
-    /**
-     * @return the boolean value on which the operator short-circuits
-     */
-    protected abstract boolean shortCircuitValue();
-    
-    /**
-     * @param firstArg
-     * @param secondArg
-     * @return the result of performing the operator to two actual values
-     */
-    protected abstract boolean doRealOperation(Boolean firstArg, Boolean secondArg);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/LtGtRelationalBinaryOperator.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/LtGtRelationalBinaryOperator.java
deleted file mode 100644
index 8d8445c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/LtGtRelationalBinaryOperator.java
+++ /dev/null
@@ -1,230 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.validation.internal.el.operators;
-
-import java.math.BigDecimal;
-import java.math.BigInteger;
-
-import org.eclipse.emf.common.util.Diagnostic;
-import org.eclipse.jdt.core.Signature;
-import org.eclipse.jst.jsf.common.internal.types.BooleanLiteralType;
-import org.eclipse.jst.jsf.common.internal.types.IAssignable;
-import org.eclipse.jst.jsf.common.internal.types.TypeCoercer;
-import org.eclipse.jst.jsf.common.internal.types.TypeConstants;
-import org.eclipse.jst.jsf.common.internal.types.TypeTransformer;
-import org.eclipse.jst.jsf.common.internal.types.ValueType;
-import org.eclipse.jst.jsf.common.util.TypeUtil;
-import org.eclipse.jst.jsf.validation.internal.el.diagnostics.DiagnosticFactory;
-
-/**
- * Encapsulates the EL binary operators "<", ">", "<=", ">="
- * 
- * @author cbateman
- *
- */
-/*package*/ abstract class LtGtRelationalBinaryOperator extends RelationalBinaryOperator 
-{
-    LtGtRelationalBinaryOperator(final DiagnosticFactory diagnosticFactory, String jsfVersion) 
-    {
-        super(diagnosticFactory, jsfVersion);
-    }
-
-    protected abstract boolean doRealOperation(Number firstArg, Number secondArg);
-
-    protected abstract boolean doRealOperation(String firstArg, String secondArg); 
-
-    public ValueType performOperation(ValueType firstArg, ValueType secondArg) 
-    {
-        // JSP.2.3.5.6 step 2 if either operand is null, then always false
-        if (TypeCoercer.typeIsNull(firstArg.getSignature())
-                || TypeCoercer.typeIsNull(secondArg.getSignature()))
-        {
-            return BooleanLiteralType.FALSE;
-        }
-        
-        String boxedFirstType = TypeTransformer.transformBoxPrimitives(firstArg.getSignature());
-        String boxedSecondType = TypeTransformer.transformBoxPrimitives(secondArg.getSignature());
-        
-        // JSP.2.3.5.6 step 3, if either is BigDecimal, promote both and compare
-        if (TypeConstants.TYPE_BIG_DOUBLE.equals(boxedFirstType)
-                || TypeConstants.TYPE_BIG_DOUBLE.equals(boxedSecondType))
-        {
-            return handleNumericComparison(firstArg, secondArg, BigDecimal.class);
-        }
-        
-        // JSP.2.3.5.6, step 4 if either is a float or double, promote both to 
-        // double and compare
-        if (TypeConstants.TYPE_BOXED_DOUBLE.equals(boxedFirstType)
-                || TypeConstants.TYPE_BOXED_FLOAT.equals(boxedFirstType)
-                || TypeConstants.TYPE_BOXED_DOUBLE.equals(boxedSecondType)
-                || TypeConstants.TYPE_BOXED_FLOAT.equals(boxedSecondType))
-        {
-            return handleNumericComparison(firstArg, secondArg, Double.class);
-        }
-        
-        // JSP.2.3.5.6, step 5 if either is a big integer, promote and compare
-        if (TypeConstants.TYPE_BIG_INTEGER.equals(boxedFirstType)
-                || TypeConstants.TYPE_BIG_INTEGER.equals(boxedSecondType))
-        {
-            return handleNumericComparison(firstArg, secondArg, BigInteger.class);
-        }
-        
-        // JSP.2.3.5.6, step 6 if either is Long or smaller, coerce both to Long
-        if (TypeConstants.TYPE_BOXED_LONG.equals(boxedFirstType)
-                || TypeConstants.TYPE_BOXED_LONG.equals(boxedSecondType)
-                || TypeConstants.TYPE_BOXED_INTEGER.equals(boxedFirstType)
-                || TypeConstants.TYPE_BOXED_INTEGER.equals(boxedSecondType)
-                || TypeConstants.TYPE_BOXED_SHORT.equals(boxedFirstType)
-                || TypeConstants.TYPE_BOXED_SHORT.equals(boxedSecondType)
-                || TypeConstants.TYPE_BOXED_BYTE.equals(boxedFirstType)
-                || TypeConstants.TYPE_BOXED_BYTE.equals(boxedSecondType)
-                || TypeConstants.SIGNATURE_BOXED_CHARACTER.equals(boxedFirstType)
-                || TypeConstants.SIGNATURE_BOXED_CHARACTER.equals(boxedSecondType))
-        {
-            return handleNumericComparison(firstArg, secondArg, Long.class);
-        }
-        
-        // JSP.2.3.5.7, step 7 if either is a string, coerce to string and
-        // compare lexically
-        if (TypeConstants.TYPE_STRING.equals(boxedFirstType)
-                || TypeConstants.TYPE_STRING.equals(boxedSecondType))
-        {
-            return handleStringComparison(firstArg, secondArg);
-        }
-        
-        // JSP.2.3.5.7, steps 8 and 9 -- if either one implements the
-        // Comparable interface, then as far as we can determine statically
-        // (compareTo may not work on the other arg, but who knows),
-        // we are good
-        if (firstArg.isInstanceOf(TypeConstants.TYPE_COMPARABLE)
-                || secondArg.isInstanceOf(TypeConstants.TYPE_COMPARABLE))
-        {
-            if (checkIfIncompatibleEnums(firstArg, secondArg))
-            {
-                // error: no point in validating further since expr will probably throw an exception
-                return null;
-            }
-            
-            return new ValueType(Signature.SIG_BOOLEAN, IAssignable.ASSIGNMENT_TYPE_RHS);
-        }
-        
-        // JSP.2.3.5.6, step 10 -- otherwise, error
-        return null;
-
-    }
-
-    public Diagnostic validate(ValueType firstArg, ValueType secondArg) 
-    {
-    	if (TypeConstants.TYPE_JAVAOBJECT.equals(firstArg.getSignature()) ||
-    			TypeConstants.TYPE_JAVAOBJECT.equals(secondArg.getSignature())) {
-    		return Diagnostic.OK_INSTANCE;
-    	}
-
-    	// JSP.2.3.5.6 step 2 if either operand is null, then always false
-        if (TypeCoercer.typeIsNull(firstArg.getSignature())
-                || TypeCoercer.typeIsNull(secondArg.getSignature()))
-        {
-            return _diagnosticFactory.
-                create_BINARY_OP_EQUALITY_COMP_WITH_NULL_ALWAYS_EVAL_SAME(Messages.getString("LtGtRelationalBinaryOperator.ConstantName.False")); //$NON-NLS-1$
-        }
-        
-        String boxedFirstType = TypeTransformer.transformBoxPrimitives(firstArg.getSignature());
-        String boxedSecondType = TypeTransformer.transformBoxPrimitives(secondArg.getSignature());
-        
-        // JSP.2.3.5.6 step 3, if either is BigDecimal, promote both and compare
-        if (TypeConstants.TYPE_BIG_DOUBLE.equals(boxedFirstType)
-                || TypeConstants.TYPE_BIG_DOUBLE.equals(boxedSecondType))
-        {
-            return validateNumericComparison(firstArg, secondArg, BigDecimal.class);
-        }
-        
-        // JSP.2.3.5.6, step 4 if either is a float or double, promote both to 
-        // double and compare
-        if (TypeConstants.TYPE_BOXED_DOUBLE.equals(boxedFirstType)
-                || TypeConstants.TYPE_BOXED_FLOAT.equals(boxedFirstType)
-                || TypeConstants.TYPE_BOXED_DOUBLE.equals(boxedSecondType)
-                || TypeConstants.TYPE_BOXED_FLOAT.equals(boxedSecondType))
-        {
-            return validateNumericComparison(firstArg, secondArg, Double.class);
-        }
-        
-        // JSP.2.3.5.6, step 5 if either is a big integer, promote and compare
-        if (TypeConstants.TYPE_BIG_INTEGER.equals(boxedFirstType)
-                || TypeConstants.TYPE_BIG_INTEGER.equals(boxedSecondType))
-        {
-            return validateNumericComparison(firstArg, secondArg, BigInteger.class);
-        }
-        
-        // JSP.2.3.5.6, step 6 if either is Long or smaller, coerce both to Long
-        if (TypeConstants.TYPE_BOXED_LONG.equals(boxedFirstType)
-                || TypeConstants.TYPE_BOXED_LONG.equals(boxedSecondType)
-                || TypeConstants.TYPE_BOXED_INTEGER.equals(boxedFirstType)
-                || TypeConstants.TYPE_BOXED_INTEGER.equals(boxedSecondType)
-                || TypeConstants.TYPE_BOXED_SHORT.equals(boxedFirstType)
-                || TypeConstants.TYPE_BOXED_SHORT.equals(boxedSecondType)
-                || TypeConstants.TYPE_BOXED_BYTE.equals(boxedFirstType)
-                || TypeConstants.TYPE_BOXED_BYTE.equals(boxedSecondType)
-                || TypeConstants.SIGNATURE_BOXED_CHARACTER.equals(boxedFirstType)
-                || TypeConstants.SIGNATURE_BOXED_CHARACTER.equals(boxedSecondType))
-        {
-            return validateNumericComparison(firstArg, secondArg, Long.class);
-        }
-        
-        // JSP.2.3.5.7, step 7 if either is a string, coerce to string and
-        // compare lexically
-        if (TypeConstants.TYPE_STRING.equals(boxedFirstType)
-                || TypeConstants.TYPE_STRING.equals(boxedSecondType))
-        {
-            return validateStringComparison(firstArg, secondArg);
-        }
-        
-        // JSP.2.3.5.7, steps 8 and 9 -- if either one implements the
-        // Comparable interface, then as far as we can determine statically
-        // (compareTo may not work on the other arg, but who knows),
-        // we are good
-        if (firstArg.isInstanceOf(TypeConstants.TYPE_COMPARABLE)
-                || secondArg.isInstanceOf(TypeConstants.TYPE_COMPARABLE))
-        {
-            Diagnostic diag = Diagnostic.OK_INSTANCE;
-            if(checkIfIncompatibleEnums(firstArg, secondArg))
-            {
-                diag = _diagnosticFactory.create_BINARY_OP_COMPARISON_OF_ENUMS_INCOMPATIBLE();
-            }
-            return diag;
-        }
-        
-        // JSP.2.3.5.6, step 10 -- otherwise, error
-        return _diagnosticFactory.create_BINARY_OP_NO_AVAILABLE_TYPE_COERCION();
-    }
-
-    /**
-     * @param firstArg
-     * @param secondArg
-     * @return diagnostic if firstArg and secondArg are incompatible with each other
-     * for compareTo purpose or OK if not
-     */
-    private boolean checkIfIncompatibleEnums(ValueType firstArg,
-            ValueType secondArg) 
-    {
-        if (firstArg.isEnumType()
-                && secondArg.isEnumType()
-                && !TypeUtil.isEnumsCompareCompatible(firstArg.getSignature()
-                                                    , secondArg.getSignature()))
-        {
-            return true;
-        }
-        
-        return false;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/MemberAccessorOperator.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/MemberAccessorOperator.java
deleted file mode 100644
index b346d9f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/MemberAccessorOperator.java
+++ /dev/null
@@ -1,269 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.validation.internal.el.operators;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.emf.common.util.Diagnostic;
-import org.eclipse.jst.jsf.common.internal.types.LiteralType;
-import org.eclipse.jst.jsf.common.internal.types.NullLiteralType;
-import org.eclipse.jst.jsf.common.internal.types.SignatureBasedType;
-import org.eclipse.jst.jsf.common.internal.types.TypeCoercer;
-import org.eclipse.jst.jsf.common.internal.types.TypeConstants;
-import org.eclipse.jst.jsf.common.internal.types.ValueType;
-import org.eclipse.jst.jsf.context.symbol.IMethodSymbol;
-import org.eclipse.jst.jsf.context.symbol.IObjectSymbol;
-import org.eclipse.jst.jsf.context.symbol.IPropertySymbol;
-import org.eclipse.jst.jsf.context.symbol.ISymbol;
-import org.eclipse.jst.jsf.context.symbol.internal.util.IMethodSymbolBasedType;
-import org.eclipse.jst.jsf.context.symbol.internal.util.IObjectSymbolBasedValueType;
-import org.eclipse.jst.jsf.designtime.resolver.ISymbolContextResolver;
-import org.eclipse.jst.jsf.validation.internal.el.diagnostics.DiagnosticFactory;
-
-/**
- * Super-class for all operators whose function is to access members of an EL
- * object. i.e. the "." and "[]" operators
- * 
- * @author cbateman
- * 
- */
-public abstract class MemberAccessorOperator
-{
-    /**
-     * The source file for the EL expression in which this operator is being
-     * evaluated.
-     */
-    protected final IFile             _file;
-
-    /**
-     * the common factory used to create diagnostics
-     */
-    protected final DiagnosticFactory _diagnosticFactory;
-
-    /**
-     * Used to resolve variables and properties.
-     */
-    protected final ISymbolContextResolver  _contextResolver;
-
-    // TODO: need to reconcile with BinaryOperator? performOperation must return
-    // SignatureBasedType since it may return a method. This can't happen
-    // with other operators (besides eqiv [])
-    /**
-     * @param file
-     * @param diagnosticFactory
-     * @param contextResolver 
-     */
-    protected MemberAccessorOperator(final IFile file,
-            final DiagnosticFactory diagnosticFactory, final ISymbolContextResolver contextResolver)
-    {
-        _file = file;
-        _diagnosticFactory = diagnosticFactory;
-        _contextResolver = contextResolver;
-    }
-
-    /**
-     * @param firstArg
-     * @param secondArg
-     * @return the result of validating the dot operation with these arguments.
-     */
-    public Diagnostic validate(final ValueType firstArg, final ValueType secondArg)
-    {
-    	if (TypeConstants.TYPE_JAVAOBJECT.equals(firstArg.getSignature())) {
-    		return Diagnostic.OK_INSTANCE;
-    	}
-        if (!(firstArg instanceof IObjectSymbolBasedValueType))
-        {
-            throw new AssertionError(
-            "The first argument of the member operator must always be a symbol resolvable value type"); //$NON-NLS-1$
-        }
-
-        if (TypeCoercer.typeIsNull(secondArg.getSignature()))
-        {
-            return _diagnosticFactory
-            .create_BINARY_OP_DOT_WITH_VALUEB_NULL(getOperatorName());
-        }
-
-        return validateObjectSymbolValue(
-                (IObjectSymbolBasedValueType) firstArg, secondArg);
-    }
-
-    /**
-     * @param firstArg
-     * @param secondArg
-     * @return the diagnostic for member(firstArg, secondArg)
-     */
-    protected abstract Diagnostic validateObjectSymbolValue(
-            IObjectSymbolBasedValueType firstArg, ValueType secondArg);
-
-    /**
-     * @param firstArg
-     * @param secondArg
-     * @return a validation of a named property accessible base (map or bean)
-     *         given an a literal key argument
-     */
-    protected Diagnostic validateNamedPropertyAccessorBase(
-            final IObjectSymbolBasedValueType firstArg, final LiteralType secondArg)
-    {
-        final IObjectSymbol curBaseSymbol = firstArg.getSymbol();
-
-        final ISymbol nextSymbol =
-            getMemberSymbol(firstArg.getSymbol(), secondArg
-                    .getLiteralValueRaw());
-
-        // if the x in x.y is an unconstrained map an it returns
-        // a java.lang.Object, then return null. We can't really say
-        // anything meaningful about such a property anyway.
-        // TODO: do we need to refine the type descriptor on such
-        // a property object to make this more precise?
-        if (curBaseSymbol.supportsCoercion(TypeConstants.TYPE_MAP)
-                && nextSymbol instanceof IPropertySymbol
-                && TypeConstants.TYPE_JAVAOBJECT
-                .equals(((IPropertySymbol) nextSymbol)
-                        .getTypeDescriptor().getTypeSignature()))
-        {
-            // if we get a symbol back that's a generic object coming from a map
-            // then stop validating; we can't tell anything for sure
-            return Diagnostic.OK_INSTANCE;
-        }
-
-        if (nextSymbol == null)
-        {
-            return _diagnosticFactory.create_MEMBER_NOT_FOUND(secondArg
-                    .getLiteralValue(), firstArg.getSymbol().getName());
-        }
-
-        return Diagnostic.OK_INSTANCE;
-    }
-
-    /**
-     * @param firstArg
-     * @param secondArg
-     * @return the resolved type for the operation or null if not computable
-     */
-    public SignatureBasedType performOperation(final ValueType firstArg,
-            final ValueType secondArg)
-    {
-        if (!(firstArg instanceof IObjectSymbolBasedValueType))
-        {
-            return null;
-        }
-
-        // per JSP.2.3.4, if value-b is null, then return null (not literal
-        // null)
-        if (TypeCoercer.typeIsNull(secondArg.getSignature()))
-        {
-            return null;
-        }
-
-        return handlePerformObjectSymbolValue(
-                (IObjectSymbolBasedValueType) firstArg, secondArg);
-    }
-
-    /**
-     * @param firstArg --
-     *            represents value-a (expr-a after step 1) in JSP.2.3.4
-     * @param secondArg --
-     *            represents value-b (expr-b after step 3) in JSP.2.3.4
-     * @return the new ValueType for this operation or null
-     */
-    protected abstract SignatureBasedType handlePerformObjectSymbolValue(
-            IObjectSymbolBasedValueType firstArg, ValueType secondArg);
-
-    /**
-     * @param firstArg
-     * @param secondArg
-     * @return the resolved type for firstArg[secondArg] treating firstArg as a
-     *         type that uses a named property accessor (i.e. a map or bean but
-     *         not a list or array) or null if unresolved
-     */
-    protected SignatureBasedType handlePerformNamedPropertyAccessorBase(
-            final IObjectSymbolBasedValueType firstArg, final LiteralType secondArg)
-    {
-        final ISymbol symbol =
-            getMemberSymbol(firstArg.getSymbol(), secondArg
-                    .getLiteralValueRaw());
-
-        if (symbol instanceof IPropertySymbol)
-        {
-            return new IObjectSymbolBasedValueType((IPropertySymbol) symbol);
-        }
-        else if (symbol instanceof IMethodSymbol)
-        {
-            return new IMethodSymbolBasedType((IMethodSymbol) symbol);
-        }
-
-        // fall-through and return null
-        // per JSP2.3.4 steps 5 and 6, return null literal if map, null (error)
-        // otherwise
-        if (firstArg.isInstanceOf(TypeConstants.TYPE_MAP))
-        {
-            return NullLiteralType.SINGLETON;
-        }
-        return null;
-    }
-
-    /**
-     * @param symbol
-     * @param name
-     * @return the member symbol of 'symbol' corresponding to 'name' or null if
-     *         there is no such member
-     */
-    protected final ISymbol getMemberSymbol(final IObjectSymbol symbol,
-            final Object name)
-    {
-        ISymbol memberSymbol = getPropertySymbol(symbol, name);
-
-        if (memberSymbol != null)
-        {
-            return memberSymbol;
-        }
-
-        memberSymbol = getMethodSymbol(symbol, name);
-
-        // otherwise, see if it's a valid method
-        if (memberSymbol != null)
-        {
-            return memberSymbol;
-        }
-
-        // if not a property or method, then not a valid member
-        return null;
-    }
-
-    /**
-     * @param symbol
-     * @param name
-     * @return the property symbol called name relative to 'symbol' or null if
-     *         one doesn't exist
-     */
-    protected final ISymbol getPropertySymbol(final ISymbol symbol,
-            final Object name)
-    {
-        return _contextResolver.getProperty(symbol, name);
-    }
-
-    /**
-     * @param symbol
-     * @param name
-     * @return the method symbol on 'symbol' corresponding to 'name' or null if
-     *         no such member
-     */
-    protected final IMethodSymbol getMethodSymbol(final IObjectSymbol symbol,
-            final Object name)
-    {
-        return _contextResolver.getMethod(symbol, name);
-    }
-
-
-    /**
-     * @return a user-readable name of the operator (i.e. dot or bracket)
-     */
-    protected abstract String getOperatorName();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/Messages.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/Messages.java
deleted file mode 100644
index 22c4c56..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/Messages.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.validation.internal.el.operators;
-
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-class Messages {
-    private static final String BUNDLE_NAME = "org.eclipse.jst.jsf.validation.internal.el.operators.messages"; //$NON-NLS-1$
-
-    private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle
-            .getBundle(BUNDLE_NAME);
-
-    private Messages() {
-        // no external instantiation
-    }
-
-    /**
-     * @param key
-     * @return the string or !key! if not found
-     */
-    public static String getString(String key) {
-        try {
-            return RESOURCE_BUNDLE.getString(key);
-        } catch (MissingResourceException e) {
-            return '!' + key + '!';
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/MinusUnaryOperator.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/MinusUnaryOperator.java
deleted file mode 100644
index 91705d9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/MinusUnaryOperator.java
+++ /dev/null
@@ -1,215 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.validation.internal.el.operators;
-
-import org.eclipse.emf.common.util.Diagnostic;
-import org.eclipse.jdt.core.Signature;
-import org.eclipse.jst.jsf.common.internal.types.FloatLiteralType;
-import org.eclipse.jst.jsf.common.internal.types.IAssignable;
-import org.eclipse.jst.jsf.common.internal.types.IntegerLiteralType;
-import org.eclipse.jst.jsf.common.internal.types.LiteralType;
-import org.eclipse.jst.jsf.common.internal.types.StringLiteralType;
-import org.eclipse.jst.jsf.common.internal.types.TypeCoercer;
-import org.eclipse.jst.jsf.common.internal.types.TypeCoercionException;
-import org.eclipse.jst.jsf.common.internal.types.TypeConstants;
-import org.eclipse.jst.jsf.common.internal.types.TypeTransformer;
-import org.eclipse.jst.jsf.common.internal.types.ValueType;
-import org.eclipse.jst.jsf.validation.internal.el.diagnostics.DiagnosticFactory;
-
-/**
- * Represents the EL unary operator '-' on a ValueType 
- * as described by JSP.2.3.5.4
- * 
- * 
- * @author cbateman
- *
- */
-/*package*/class MinusUnaryOperator extends UnaryOperator 
-{
-    private static final String UNARY_MINUS = "unary minus"; //$NON-NLS-1$
-
-    MinusUnaryOperator(DiagnosticFactory diagnosticFactory) 
-    {
-        super(diagnosticFactory);
-    }
-
-    public Diagnostic validate(ValueType type)
-    {
-    	if (TypeConstants.TYPE_JAVAOBJECT.equals(type.getSignature())) {
-    		return Diagnostic.OK_INSTANCE;
-    	}
-        // must coerce to numeric type
-        try
-        {
-            // if coerceTypeNumber doesn't throw an exception, then
-            // give the benefit of the doubt
-            final String coercedType =
-                TypeCoercer.
-                    coerceToNumber(TypeTransformer.
-                            transformBoxPrimitives(type.getSignature()));
-            
-            if (TypeCoercer.typeIsNull(coercedType))
-            {
-                // null always coerces to 0L on this operator
-                return _diagnosticFactory.
-                    create_UNARY_OP_MINUS_ON_NULL_ALWAYS_ZERO();
-            }
-
-            // JSP.2.3.5.4, step 2 if BigDecimal or BigInteger, then can't be
-            // literal and retains type
-            if (TypeConstants.TYPE_BIG_DOUBLE.equals(coercedType)
-                    || TypeConstants.TYPE_BIG_INTEGER.equals(coercedType))
-            {
-                return Diagnostic.OK_INSTANCE;
-            }
-
-            // JSP.2.4.5.4, step 3: if String
-            // note, use uncoerced type, since type coercer will return null for strings
-            if (TypeCoercer.typeIsString(type.getSignature()))
-            {
-                // if it's a string and we have the value, we can determine for
-                // sure whether or not it's coercable to a number
-                // per JSP.2.3.5.4 step 3.1
-                if (type instanceof StringLiteralType)
-                {
-                    String literalValue = ((LiteralType)type).getLiteralValue();
-                    if (literalValue.indexOf('.') > -1
-                            || literalValue.indexOf('e') > -1
-                            || literalValue.indexOf('E') > -1)
-                    {
-                        // if it coerces to double, then it's a double
-                        ((LiteralType)type).coerceToNumber(Double.class);
-                        // this is okay, because an expression like #{-3.3} can't be folded
-                        return Diagnostic.OK_INSTANCE;
-                    }
-                    // per JSP.2.3.5.4, step 3.2 try to coerce to long
-                    // if it coerces to long, then it's a long
-                    ((LiteralType)type).coerceToNumber(Long.class);
-                    // this is okay, because an expression like #{-3} can't be folded
-                    return Diagnostic.OK_INSTANCE;
-                }
-                // if non-literal string, warn that coercion to number is not 
-                // guaranteed since Long.valueOf and Double.valueOf 
-                // (unlike Boolean.valueOf) throw NumberFormatExceptions
-                return _diagnosticFactory.create_UNARY_OP_STRING_CONVERSION_NOT_GUARANTEED(UNARY_MINUS);
-            }
-            
-            // JSP.2.3.5.4, step 4, for all numeric types, retain type,
-            // validate constant folding
-            // note that this return true for big int and decimal, so those cases
-            // must already have been handled.
-            if (TypeCoercer.typeIsNumeric(coercedType))
-            {
-                // otherwise, we are fine
-                return Diagnostic.OK_INSTANCE;
-            }
-            
-        }
-        catch (TypeCoercionException tce)
-        {
-            // fallthrough to error below
-        }
-        // otherwise, error
-        return _diagnosticFactory.create_UNARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION(UNARY_MINUS);
-    }
-    
-    /**
-     * Based on JSP.2.3.5.4
-     * 
-     * @param type
-     * @return type of type after a minus is applied or null if unknown
-     */
-    public ValueType performOperation(ValueType type)
-    {
-        try
-        {
-            final String  boxedType = 
-                TypeTransformer.transformBoxPrimitives(type.getSignature());
-            // check for valid type coercion 
-            String coercedType = TypeCoercer.coerceToNumber(boxedType);
-
-            if (TypeCoercer.typeIsNull(coercedType))
-            {
-                // null always coerces to 0L on this operator
-                return new IntegerLiteralType(0L);
-            }
-
-            // JSP.2.3.5.4, step 2 if BigDecimal or BigInteger, then can't be
-            // literal and retains type
-            if (TypeConstants.TYPE_BIG_DOUBLE.equals(coercedType))
-            {
-                return new ValueType(TypeConstants.TYPE_BIG_DOUBLE, IAssignable.ASSIGNMENT_TYPE_RHS);
-            }
-            else if (TypeConstants.TYPE_BIG_INTEGER.equals(coercedType))
-            {
-                return new ValueType(TypeConstants.TYPE_BIG_INTEGER, IAssignable.ASSIGNMENT_TYPE_RHS);
-            }
-            
-            if (TypeCoercer.typeIsString(type.getSignature()))
-            {
-                // if it's string and we have the value, we can determine for
-                // sure whether or not it's coercable to a number
-                // per JSP.2.3.5.4 step 3
-                if (type instanceof StringLiteralType)
-                {
-                    String literalValue = ((LiteralType)type).getLiteralValue();
-                    if (literalValue.indexOf('.') > -1
-                            || literalValue.indexOf('e') > -1
-                            || literalValue.indexOf('E') > -1)
-                    {
-                        // if it coerces to double, then it's a double
-                        Number value = ((LiteralType)type).coerceToNumber(Double.class);
-                        return new FloatLiteralType(-1 * value.doubleValue());
-                    }
-    
-                    // if it coerces to long, then it's a long
-                    Number value = ((LiteralType)type).coerceToNumber(Long.class);
-                    return new IntegerLiteralType(-1 * value.longValue());
-                }
-                
-                // otherwise, just return a long typed value
-                return new ValueType(Signature.SIG_LONG, IAssignable.ASSIGNMENT_TYPE_RHS);
-            }
-            
-            // JSP.2.3.5.4
-            // big integer and big decimal retain type
-            // all numeric types retain type
-            if (TypeCoercer.typeIsNumeric(boxedType))
-            {
-                // integer and float literals are special because -1 or -1.0
-                // is syntically minusOp(1) and minusOp(1.0)
-                if (type instanceof IntegerLiteralType)
-                {
-                    return new IntegerLiteralType(-1 * ((IntegerLiteralType)type).coerceToNumber(Long.class).longValue());
-                }
-                else if (type instanceof FloatLiteralType)
-                {
-                    return new FloatLiteralType(-1 * ((FloatLiteralType)type).coerceToNumber(Double.class).doubleValue());
-                }
-                return type;
-            }
-           
-            // all other cases, return null
-            // even is type represents a String, without it's value, we have
-            // no idea how to coerce it without it's value
-            // fall through and return null
-        }
-        catch (TypeCoercionException tce)
-        {
-            // do nothing, fall through and return null
-        }
-        
-        return null;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/ModArithmeticBinaryOperator.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/ModArithmeticBinaryOperator.java
deleted file mode 100644
index 0b6ac7d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/ModArithmeticBinaryOperator.java
+++ /dev/null
@@ -1,388 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.validation.internal.el.operators;
-
-import java.math.BigDecimal;
-import java.math.BigInteger;
-
-import org.eclipse.emf.common.util.Diagnostic;
-import org.eclipse.jdt.core.Signature;
-import org.eclipse.jst.jsf.common.internal.types.FloatLiteralType;
-import org.eclipse.jst.jsf.common.internal.types.IAssignable;
-import org.eclipse.jst.jsf.common.internal.types.IntegerLiteralType;
-import org.eclipse.jst.jsf.common.internal.types.LiteralType;
-import org.eclipse.jst.jsf.common.internal.types.TypeCoercer;
-import org.eclipse.jst.jsf.common.internal.types.TypeCoercionException;
-import org.eclipse.jst.jsf.common.internal.types.TypeConstants;
-import org.eclipse.jst.jsf.common.internal.types.TypeTransformer;
-import org.eclipse.jst.jsf.common.internal.types.ValueType;
-import org.eclipse.jst.jsf.validation.internal.el.diagnostics.DiagnosticFactory;
-
-/**
- * Represents the EL modulo operator: % or mod
- * Based JSP.2.3.5.3
- * 
- * @author cbateman
- *
- */
-/*package*/ class ModArithmeticBinaryOperator extends ArithmeticBinaryOperator 
-{
-    private static final String MODULO = "modulo"; //$NON-NLS-1$
-
-    ModArithmeticBinaryOperator(DiagnosticFactory diagnosticFactory) {
-        super(diagnosticFactory);
-    }
-
-    public ValueType performOperation(ValueType firstArg, ValueType secondArg) 
-    {
-        // JSP.2.3.5.3, step 1 if both null, then return zero
-        if (TypeCoercer.typeIsNull(firstArg.getSignature())
-                && TypeCoercer.typeIsNull(secondArg.getSignature()))
-        {
-            return IntegerLiteralType.ZERO;
-        }
-
-        final String boxedFirstArg = TypeTransformer.transformBoxPrimitives(firstArg.getSignature());
-        final String boxedSecondArg = TypeTransformer.transformBoxPrimitives(secondArg.getSignature());
-        
-        // JSP.2.3.5.3, step 2, if either arg is BigDecimal, Float, Double
-        // or String (ignoring whether it is value coercable), then coerce
-        // to Double and do op
-        if (TypeConstants.TYPE_BIG_DOUBLE.equals(boxedFirstArg)
-                || TypeConstants.TYPE_BIG_DOUBLE.equals(boxedSecondArg)
-                || TypeConstants.TYPE_BOXED_DOUBLE.equals(boxedFirstArg)
-                || TypeConstants.TYPE_BOXED_DOUBLE.equals(boxedSecondArg)
-                || TypeConstants.TYPE_BOXED_FLOAT.equals(boxedFirstArg)
-                || TypeConstants.TYPE_BOXED_FLOAT.equals(boxedSecondArg))
-        {
-            // TODO: handle case where one is a literal or resolvable string value
-            // that containss ".", "e" or "E"
-            return performDouble(firstArg, secondArg);
-        }
-        
-        // JSP.2.3.5.3, step 3, if either arg is a BigInteger, coerce
-        // both to BigInteger
-        if (TypeConstants.TYPE_BIG_INTEGER.equals(boxedFirstArg)
-                || TypeConstants.TYPE_BIG_INTEGER.equals(boxedSecondArg))
-        {
-            return performBigInteger(firstArg, secondArg);
-        }
-        
-        // JSP.2.3.5.3, step 4, otherwise try to perform as a Long op
-        return performLong(firstArg, secondArg);
-    }
-
-    public Diagnostic validate(ValueType firstArg, ValueType secondArg) {
-    	if (TypeConstants.TYPE_JAVAOBJECT.equals(firstArg.getSignature()) ||
-    			TypeConstants.TYPE_JAVAOBJECT.equals(secondArg.getSignature())) {
-    		return Diagnostic.OK_INSTANCE;
-    	}
-    	
-        // JSP.2.3.5.3, step 1 if both null, then return zero
-        if (TypeCoercer.typeIsNull(firstArg.getSignature())
-                && TypeCoercer.typeIsNull(secondArg.getSignature()))
-        {
-            return _diagnosticFactory.create_BINARY_OP_BOTH_OPERANDS_NULL(MODULO);
-        }
-
-        final String boxedFirstArg = TypeTransformer.transformBoxPrimitives(firstArg.getSignature());
-        final String boxedSecondArg = TypeTransformer.transformBoxPrimitives(secondArg.getSignature());
-        
-        // JSP.2.3.5.3, step 2, if either arg is BigDecimal, Float, Double
-        // or String (ignoring whether it is value coercable), then coerce
-        // to Double and do op
-        if (TypeConstants.TYPE_BIG_DOUBLE.equals(boxedFirstArg)
-                || TypeConstants.TYPE_BIG_DOUBLE.equals(boxedSecondArg)
-                || TypeConstants.TYPE_BOXED_DOUBLE.equals(boxedFirstArg)
-                || TypeConstants.TYPE_BOXED_DOUBLE.equals(boxedSecondArg)
-                || TypeConstants.TYPE_BOXED_FLOAT.equals(boxedFirstArg)
-                || TypeConstants.TYPE_BOXED_FLOAT.equals(boxedSecondArg))
-        {
-            // TODO: handle case where one is a literal or resolvable string value
-            // that containss ".", "e" or "E"
-            return validateDouble(firstArg, secondArg);
-        }
-        
-        // JSP.2.3.5.3, step 3, if either arg is a BigInteger, coerce
-        // both to BigInteger
-        if (TypeConstants.TYPE_BIG_INTEGER.equals(boxedFirstArg)
-                || TypeConstants.TYPE_BIG_INTEGER.equals(boxedSecondArg))
-        {
-            return validateBigInteger(firstArg, secondArg);
-        }
-        
-        // JSP.2.3.5.3, step 4, otherwise try to perform as a Long op
-        return validateLong(firstArg, secondArg);
-    }
-
-    private ValueType performDouble(ValueType firstArg, ValueType secondArg)
-    {
-        try
-        {
-            TypeCoercer.coerceToNumber(TypeTransformer.transformBoxPrimitives(firstArg.getSignature()));
-            TypeCoercer.coerceToNumber(TypeTransformer.transformBoxPrimitives(secondArg.getSignature()));
-            
-            Number secondValue = null;
-            
-            if (secondArg instanceof LiteralType)
-            {
-                secondValue = ((LiteralType)secondArg).coerceToNumber(Double.class);
-                
-                if (secondValue.doubleValue() == 0.0)
-                {
-                    // division by zero
-                    return null;
-                }
-            }
-            
-            Number firstValue = null;
-            
-            if (firstArg instanceof LiteralType)
-            {
-                firstValue = ((LiteralType)firstArg).coerceToNumber(Double.class);
-            }
-            
-            if (firstValue != null && secondValue != null)
-            {
-                return new FloatLiteralType(
-                        doRealOperation(new Double(firstValue.doubleValue()), 
-                                        new Double(secondValue.doubleValue())).doubleValue());
-            }
-
-            // if we get to here, the coercion is valid, so a Double will be
-            // returned
-            return new ValueType(Signature.SIG_DOUBLE, IAssignable.ASSIGNMENT_TYPE_RHS);
-        }
-        catch (TypeCoercionException tce)
-        {
-            // could not coerce, so null
-            return null;
-        }
-    }
-    
-    private ValueType performBigInteger(ValueType firstArg, ValueType secondArg)
-    {
-        try
-        {
-            TypeCoercer.coerceToNumber(TypeTransformer.transformBoxPrimitives(firstArg.getSignature()));
-            TypeCoercer.coerceToNumber(TypeTransformer.transformBoxPrimitives(secondArg.getSignature()));
-            
-            // check second arg for zero
-            if (secondArg instanceof LiteralType)
-            {
-                if (((LiteralType)secondArg).coerceToNumber(BigInteger.class).equals(BigInteger.ZERO))
-                {
-                    // division by zero
-                    return null;
-                }
-            }
-            
-            // since one of the args is BigInteger, they are not both literals,
-            // so if we get to here, we have a successful mod of two
-            // big integers to one big integer
-            return new ValueType(TypeConstants.TYPE_BIG_INTEGER, IAssignable.ASSIGNMENT_TYPE_RHS);
-        }
-        catch (TypeCoercionException tce)
-        {
-            // no coercion
-            return null;
-        }
-    }
-    
-    private ValueType performLong(ValueType firstArg, ValueType secondArg)
-    {
-        try
-        {
-            TypeCoercer.coerceToNumber(TypeTransformer.transformBoxPrimitives(firstArg.getSignature()));
-            TypeCoercer.coerceToNumber(TypeTransformer.transformBoxPrimitives(secondArg.getSignature()));
-        
-            Number secondValue = null;
-            
-            if (secondArg instanceof LiteralType)
-            {
-                secondValue = ((LiteralType)secondArg).coerceToNumber(Long.class);
-                
-                if (secondValue.longValue() == 0)
-                {
-                    // division by zero
-                    return null;
-                }
-            }
-            
-            Number firstValue = null;
-            
-            if (firstArg instanceof LiteralType)
-            {
-                firstValue = ((LiteralType)firstArg).coerceToNumber(Long.class);
-            }
-            
-            if (firstValue != null && secondValue != null)
-            {
-                return new IntegerLiteralType(
-                        doRealOperation(Long.valueOf(firstValue.longValue()), 
-                                        Long.valueOf(secondValue.longValue())).longValue());
-            }
-
-            // if we get to here, the coercion is valid, so a Long will be
-            // returned
-            return new ValueType(Signature.SIG_LONG, IAssignable.ASSIGNMENT_TYPE_RHS);
-        }
-        catch (TypeCoercionException tce)
-        {
-            // could not coerce, so null
-            return null;
-        }
-    }
-    
-    private Diagnostic validateDouble(ValueType firstArg, ValueType secondArg)
-    {
-        try
-        {
-            TypeCoercer.coerceToNumber(TypeTransformer.transformBoxPrimitives(firstArg.getSignature()));
-            TypeCoercer.coerceToNumber(TypeTransformer.transformBoxPrimitives(secondArg.getSignature()));
-            
-            Number secondValue = null;
-            
-            if (secondArg instanceof LiteralType)
-            {
-                secondValue = ((LiteralType)secondArg).coerceToNumber(Double.class);
-                
-                if (secondValue.doubleValue() == 0.0)
-                {
-                    // division by zero
-                    return _diagnosticFactory.create_BINARY_OP_POSSIBLE_DIVISION_BY_ZERO();
-                }
-            }
-            
-            Number firstValue = null;
-            
-            if (firstArg instanceof LiteralType)
-            {
-                firstValue = ((LiteralType)firstArg).coerceToNumber(Double.class);
-            }
-            
-            if (firstValue != null && secondValue != null)
-            {
-                return _diagnosticFactory.
-                    create_BINARY_OP_CONSTANT_EXPRESSION_ALWAYS_EVAL_SAME
-                        (MODULO, Double.toString(
-                                firstValue.doubleValue()%secondValue.doubleValue()));
-            }
-
-            // if we get to here, the coercion is valid, so a Double will be
-            // returned and everything is good
-            return Diagnostic.OK_INSTANCE;
-        }
-        catch (TypeCoercionException tce)
-        {
-            // could not coerce, so error
-            return _diagnosticFactory.
-                create_BINARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION(MODULO);
-        }
-    }
-    
-    private Diagnostic validateBigInteger(ValueType firstArg, ValueType secondArg)
-    {
-        try
-        {
-            TypeCoercer.coerceToNumber(TypeTransformer.transformBoxPrimitives(firstArg.getSignature()));
-            TypeCoercer.coerceToNumber(TypeTransformer.transformBoxPrimitives(secondArg.getSignature()));
-            
-            // check second arg for zero
-            if (secondArg instanceof LiteralType)
-            {
-                if (((LiteralType)secondArg).coerceToNumber(BigInteger.class).equals(BigInteger.ZERO))
-                {
-                    // division by zero
-                    return _diagnosticFactory.create_BINARY_OP_POSSIBLE_DIVISION_BY_ZERO();
-                }
-            }
-            
-            // since one of the args is BigInteger, they are not both literals,
-            // so if we get to here, we have a successful mod of two
-            // big integers to one big integer
-            return Diagnostic.OK_INSTANCE;
-        }
-        catch (TypeCoercionException tce)
-        {
-            // no coercion
-            return _diagnosticFactory.
-                create_BINARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION(MODULO);
-        }        
-    }
-    
-    private Diagnostic validateLong(ValueType firstArg, ValueType secondArg)
-    {
-        try
-        {
-            TypeCoercer.coerceToNumber(TypeTransformer.transformBoxPrimitives(firstArg.getSignature()));
-            TypeCoercer.coerceToNumber(TypeTransformer.transformBoxPrimitives(secondArg.getSignature()));
-        
-            Number secondValue = null;
-            
-            if (secondArg instanceof LiteralType)
-            {
-                secondValue = ((LiteralType)secondArg).coerceToNumber(Long.class);
-                
-                if (secondValue.longValue() == 0)
-                {
-                    // division by zero
-                    return _diagnosticFactory.
-                        create_BINARY_OP_POSSIBLE_DIVISION_BY_ZERO();
-                }
-            }
-            
-            Number firstValue = null;
-            
-            if (firstArg instanceof LiteralType)
-            {
-                firstValue = ((LiteralType)firstArg).coerceToNumber(Long.class);
-            }
-            
-            if (firstValue != null && secondValue != null)
-            {
-                return _diagnosticFactory.
-                    create_BINARY_OP_CONSTANT_EXPRESSION_ALWAYS_EVAL_SAME
-                        (MODULO, Long.toString(firstValue.longValue()%secondValue.longValue())); 
-            }
-
-            // if we get to here, the coercion is valid, so a Long will be
-            // returned
-            return Diagnostic.OK_INSTANCE;
-        }
-        catch (TypeCoercionException tce)
-        {
-            // could not coerce, so error
-            return _diagnosticFactory.
-                create_BINARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION(MODULO);
-        }
-    }
-    
-    protected Long doRealOperation(Long firstArg, Long secondArg) {
-        return Long.valueOf(firstArg.longValue() % secondArg.longValue());
-     }
-
-     protected Double doRealOperation(Double firstArg, Double secondArg) {
-         return new Double(firstArg.doubleValue() % secondArg.doubleValue());
-     }
-
-     protected BigDecimal doRealOperation(BigDecimal firstArg,
-             BigDecimal secondArg) {
-        return new BigDecimal(firstArg.doubleValue() % secondArg.doubleValue());
-     }
-
-    protected String getOperatorName() {
-        return MODULO;
-    }
-     
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/MultiplyArithmeticBinaryOperator.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/MultiplyArithmeticBinaryOperator.java
deleted file mode 100644
index 605ce47..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/MultiplyArithmeticBinaryOperator.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.validation.internal.el.operators;
-
-import java.math.BigDecimal;
-
-import org.eclipse.jst.jsf.validation.internal.el.diagnostics.DiagnosticFactory;
-
-/**
- * Represents the EL Multiply arithmetic binary operator "*"
- * 
- * @author cbateman
- *
- */
-/*package*/ class MultiplyArithmeticBinaryOperator extends
-        NoDivArithmeticBinaryOperator 
-{
-    private static final String MULTIPLICATION = "multiplication"; //$NON-NLS-1$
-
-
-    MultiplyArithmeticBinaryOperator(DiagnosticFactory diagnosticFactory) 
-    {
-        super(diagnosticFactory);
-    }
-
-    protected Long doRealOperation(Long firstArg, Long secondArg) 
-    {
-        return Long.valueOf(firstArg.longValue() * secondArg.longValue());
-    }
-
-    protected Double doRealOperation(Double firstArg, Double secondArg) 
-    {
-        return new Double(firstArg.doubleValue() * secondArg.doubleValue());
-    }
-
-    protected BigDecimal doRealOperation(BigDecimal firstArg,
-            BigDecimal secondArg) 
-    {
-        return firstArg.multiply(secondArg);
-    }
-
-    protected String getOperatorName() {
-        return MULTIPLICATION;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/NoDivArithmeticBinaryOperator.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/NoDivArithmeticBinaryOperator.java
deleted file mode 100644
index 3b05754..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/NoDivArithmeticBinaryOperator.java
+++ /dev/null
@@ -1,305 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.validation.internal.el.operators;
-
-import java.math.BigDecimal;
-import java.math.BigInteger;
-
-import org.eclipse.emf.common.util.Diagnostic;
-import org.eclipse.jdt.core.Signature;
-import org.eclipse.jst.jsf.common.internal.types.FloatLiteralType;
-import org.eclipse.jst.jsf.common.internal.types.IAssignable;
-import org.eclipse.jst.jsf.common.internal.types.IntegerLiteralType;
-import org.eclipse.jst.jsf.common.internal.types.LiteralType;
-import org.eclipse.jst.jsf.common.internal.types.TypeCoercer;
-import org.eclipse.jst.jsf.common.internal.types.TypeCoercionException;
-import org.eclipse.jst.jsf.common.internal.types.TypeConstants;
-import org.eclipse.jst.jsf.common.internal.types.TypeTransformer;
-import org.eclipse.jst.jsf.common.internal.types.ValueType;
-import org.eclipse.jst.jsf.validation.internal.el.diagnostics.DiagnosticFactory;
-
-/**
- * Represents non-dividing arithmetic EL operators: +,-,*
- * Based on JSP.2.3.5.1
- * 
- * @author cbateman
- *
- */
-/*package*/ abstract class NoDivArithmeticBinaryOperator extends ArithmeticBinaryOperator 
-{
-    NoDivArithmeticBinaryOperator(DiagnosticFactory diagnosticFactory) {
-        super(diagnosticFactory);
-    }
-
-    protected abstract Long doRealOperation(Long firstArg, Long secondArg);
-    
-    protected abstract Double doRealOperation(Double firstArg, Double secondArg);
-
-    public ValueType performOperation(ValueType firstArg, ValueType secondArg)
-    {
-        // JSP.2.3.5.1, step 1, if either arg is null, return (Long) 0
-        if (TypeCoercer.typeIsNull(firstArg.getSignature())
-                && TypeCoercer.typeIsNull(secondArg.getSignature()))
-        {
-            return new IntegerLiteralType(0);
-        }
-        
-        final String boxedFirstArg = TypeTransformer.transformBoxPrimitives(firstArg.getSignature());
-        final String boxedSecondArg = TypeTransformer.transformBoxPrimitives(secondArg.getSignature());
-        
-        // JSP.2.3.5.1, step 2, if either arg is a BigDecimal, coerce to BigDecimal
-        // and apply
-        if (TypeConstants.TYPE_BIG_DOUBLE.equals(boxedFirstArg)
-                || TypeConstants.TYPE_BIG_DOUBLE.equals(boxedSecondArg))
-        {
-            return handleNumericArithmetic(firstArg, secondArg, BigDecimal.class);
-        }
-        
-        // JSP.2.3.5.1, step 3, if either arg is float or double or 
-        // a String containing "., e or E", then coerce if the other is
-        // a big int, coerce up to BigDecimal, else to Double
-        // Note: we are ignoring strings we can't resolve to figure out
-        // if the contain "., e or E".  Assume they always do
-        if (TypeConstants.TYPE_BOXED_DOUBLE.equals(boxedFirstArg)
-                ||TypeConstants.TYPE_BOXED_DOUBLE.equals(boxedSecondArg)
-                ||TypeConstants.TYPE_BOXED_FLOAT.equals(boxedFirstArg)
-                ||TypeConstants.TYPE_BOXED_FLOAT.equals(boxedSecondArg))
-        {
-            if (TypeConstants.TYPE_BIG_INTEGER.equals(boxedFirstArg)
-                    ||TypeConstants.TYPE_BIG_INTEGER.equals(boxedSecondArg))
-            {
-                // if the other operand is BigInteger, treat as BigDecimal
-                return handleNumericArithmetic(firstArg, secondArg, BigDecimal.class);
-            }
-
-            // otherwise as double
-            return handleNumericArithmetic(firstArg, secondArg, Double.class);
-        }
-        
-        // JSP.2.3.5.1, step 4, if one is a big integer, coerce to big integer
-        if (TypeConstants.TYPE_BIG_INTEGER.equals(boxedFirstArg)
-                || TypeConstants.TYPE_BIG_INTEGER.equals(boxedSecondArg))
-        {
-            return handleNumericArithmetic(firstArg, secondArg, BigInteger.class);
-        }
-        
-        // JSP.2.3.5.1, step 5, otherwise, try to coerce to Long
-        return handleNumericArithmetic(firstArg, secondArg, Long.class);
-    }
-
-    public Diagnostic validate(ValueType firstArg, ValueType secondArg) 
-    {
-    	if (TypeConstants.TYPE_JAVAOBJECT.equals(firstArg.getSignature()) ||
-    			TypeConstants.TYPE_JAVAOBJECT.equals(secondArg.getSignature())) {
-    		return Diagnostic.OK_INSTANCE;
-    	}
-
-    	// JSP.2.3.5.1, step 1, if either arg is null, return (Long) 0
-        if (TypeCoercer.typeIsNull(firstArg.getSignature())
-                && TypeCoercer.typeIsNull(secondArg.getSignature()))
-        {
-            return _diagnosticFactory.create_BINARY_OP_BOTH_OPERANDS_NULL(getOperatorName());
-        }
-        
-        final String boxedFirstArg = TypeTransformer.transformBoxPrimitives(firstArg.getSignature());
-        final String boxedSecondArg = TypeTransformer.transformBoxPrimitives(secondArg.getSignature());
-        
-        // JSP.2.3.5.1, step 2, if either arg is a BigDecimal, coerce to BigDecimal
-        // and apply
-        if (TypeConstants.TYPE_BIG_DOUBLE.equals(boxedFirstArg)
-                || TypeConstants.TYPE_BIG_DOUBLE.equals(boxedSecondArg))
-        {
-            return validateNumericArithmetic(firstArg, secondArg, BigDecimal.class);
-        }
-        
-        // JSP.2.3.5.1, step 3, if either arg is float or double or 
-        // a String containing "., e or E", then coerce if the other is
-        // a big int, coerce up to BigDecimal, else to Double
-        // Note: we are ignoring strings we can't resolve to figure out
-        // if the contain "., e or E".  Assume they always do
-        if (TypeConstants.TYPE_BOXED_DOUBLE.equals(boxedFirstArg)
-                ||TypeConstants.TYPE_BOXED_DOUBLE.equals(boxedSecondArg)
-                ||TypeConstants.TYPE_BOXED_FLOAT.equals(boxedFirstArg)
-                ||TypeConstants.TYPE_BOXED_FLOAT.equals(boxedSecondArg))
-        {
-            if (TypeConstants.TYPE_BIG_INTEGER.equals(boxedFirstArg)
-                    ||TypeConstants.TYPE_BIG_INTEGER.equals(boxedSecondArg))
-            {
-                // if the other operand is BigInteger, treat as BigDecimal
-                return validateNumericArithmetic(firstArg, secondArg, BigDecimal.class);
-            }
-
-            // otherwise as double
-            return validateNumericArithmetic(firstArg, secondArg, Double.class);
-        }
-        
-        // JSP.2.3.5.1, step 4, if one is a big integer, coerce to big integer
-        if (TypeConstants.TYPE_BIG_INTEGER.equals(boxedFirstArg)
-                || TypeConstants.TYPE_BIG_INTEGER.equals(boxedSecondArg))
-        {
-            return validateNumericArithmetic(firstArg, secondArg, BigInteger.class);
-        }
-        
-        // JSP.2.3.5.1, step 5, otherwise, try to coerce to Long
-        return validateNumericArithmetic(firstArg, secondArg, Long.class);
-    }
-
-    /**
-     * @param firstArg
-     * @param secondArg
-     * @param numberType
-     * @return a value type based on the result of the arithmetic operation
-     */
-    protected ValueType handleNumericArithmetic(ValueType firstArg, ValueType secondArg, Class numberType)
-    {
-        try
-        {
-//            final String coercedFirstArg = 
-                TypeCoercer.coerceToNumber(TypeTransformer.transformBoxPrimitives(firstArg.getSignature()));
-//            final String coercedSecondArg = 
-                TypeCoercer.coerceToNumber(TypeTransformer.transformBoxPrimitives(secondArg.getSignature()));
-            
-            if (firstArg instanceof LiteralType && secondArg instanceof LiteralType)
-            {
-                try
-                {
-                    Number firstValue = 
-                        ((LiteralType)firstArg).coerceToNumber(numberType);
-                    Number secondValue = 
-                        ((LiteralType)secondArg).coerceToNumber(numberType);
-                    
-                    LiteralType result = null;
-                    
-                    if (numberType == Double.class)
-                    {
-                        Double resultValue = 
-                            doRealOperation((Double)firstValue, 
-                                    (Double) secondValue);
-                        result = new FloatLiteralType(resultValue.doubleValue());
-                    }
-                    else if (numberType == Long.class)
-                    {
-                        Long resultValue = 
-                            doRealOperation((Long) firstValue, (Long) secondValue);
-                        result = new IntegerLiteralType(resultValue.longValue());
-                    }
-                    else
-                    {
-                        throw new AssertionError("unsupport arithmetic upcast type"); //$NON-NLS-1$
-                    }
-                    
-                    return result;  
-                }
-                catch (TypeCoercionException tce)
-                {
-                    // could happen if two string literals passed
-                    return null;
-                }
-            }
-            
-            // if we get to here, then we have two valid numeric arith
-            // types, but at least one is not a literal, so the best we can
-            // say is that the return will be the same asthe type of numeric
-            // coercion
-            if (numberType == BigDecimal.class)
-            {
-                return new ValueType(TypeConstants.TYPE_BIG_DOUBLE, IAssignable.ASSIGNMENT_TYPE_RHS);
-            }
-            else if (numberType == Double.class)
-            {
-                return new ValueType(Signature.SIG_DOUBLE, IAssignable.ASSIGNMENT_TYPE_RHS);
-            }
-            else if (numberType == BigInteger.class)
-            {
-                return new ValueType(TypeConstants.TYPE_BIG_INTEGER, IAssignable.ASSIGNMENT_TYPE_RHS);
-            }
-            else
-            {
-                return new ValueType(Signature.SIG_LONG, IAssignable.ASSIGNMENT_TYPE_RHS);
-            }
-        }
-        catch (TypeCoercionException tce)
-        {
-            // coercion to number failed, so no go
-            return null;
-        }
-    }
-    
-    /**
-     * @param firstArg
-     * @param secondArg
-     * @param numberType
-     * @return a diagnostic validating the arithmetic expr firstArg op secondArg
-     */
-    protected Diagnostic validateNumericArithmetic(ValueType firstArg, ValueType secondArg, Class numberType)
-    {
-        try
-        {
-//            final String coercedFirstArg = 
-            TypeCoercer.coerceToNumber(TypeTransformer.transformBoxPrimitives(firstArg.getSignature()));
-//            final String coercedSecondArg = 
-            TypeCoercer.coerceToNumber(TypeTransformer.transformBoxPrimitives(secondArg.getSignature()));
-            
-            if (firstArg instanceof LiteralType && secondArg instanceof LiteralType)
-            {
-                try
-                {
-                    Number firstValue = 
-                        ((LiteralType)firstArg).coerceToNumber(numberType);
-                    Number secondValue = 
-                        ((LiteralType)secondArg).coerceToNumber(numberType);
-                    
-                    Number result = null;
-                    
-                    if (numberType == Double.class)
-                    {
-                        result =
-                            doRealOperation((Double)firstValue, 
-                                    (Double) secondValue);
-                    }
-                    else if (numberType == Long.class)
-                    {
-                        result =
-                            doRealOperation((Long) firstValue, (Long) secondValue);
-                    }
-                    else
-                    {
-                        throw new AssertionError("unsupport arithmetic upcast type"); //$NON-NLS-1$
-                    }
-                    
-                    return _diagnosticFactory.
-                        create_BINARY_OP_CONSTANT_EXPRESSION_ALWAYS_EVAL_SAME
-                            (getOperatorName(), result.toString());  
-                }
-                catch (TypeCoercionException tce)
-                {
-                    // could happen when two strings are passed
-                    return _diagnosticFactory.
-                        create_BINARY_OP_COULD_NOT_COERCE_LITERALS_TO_NUMBERS();
-                }
-            }
-            
-            // if we get to here, then we have two valid numeric arith
-            // types, but at least one is not a literal
-            // everything should be ok
-            return Diagnostic.OK_INSTANCE;
-        }
-        catch (TypeCoercionException tce)
-        {
-            // coercion to number failed, so no go
-            return _diagnosticFactory.
-                create_BINARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION(getOperatorName());
-        }
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/NotEqualsBinaryRelationalOperator.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/NotEqualsBinaryRelationalOperator.java
deleted file mode 100644
index 1d62454..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/NotEqualsBinaryRelationalOperator.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.validation.internal.el.operators;
-
-import org.eclipse.jst.jsf.validation.internal.el.diagnostics.DiagnosticFactory;
-
-/**
- * Represents the not equals -- "!="/ne EL binary operator
- * @author cbateman
- *
- */
-/*package*/ class NotEqualsBinaryRelationalOperator extends
-        EqualityRelationalBinaryOperator {
-
-    NotEqualsBinaryRelationalOperator(final DiagnosticFactory diagnosticFactory, String jsfVersion) 
-    {
-        super(diagnosticFactory, jsfVersion);
-    }
-
-    protected boolean doRealOperation(Number firstArg, Number secondArg) {
-        return !firstArg.equals(secondArg);
-    }
-
-    protected boolean doRealOperation(Boolean firstArg, Boolean secondArg) {
-        return !firstArg.equals(secondArg);
-    }
-
-    protected boolean doRealOperation(String firstArg, String secondArg) {
-        return !firstArg.equals(secondArg);
-    }
-
-    protected String getOperationName() 
-    {
-        return Messages.getString("NotEqualsBinaryRelationalOperator.OperationName"); //$NON-NLS-1$
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/NotUnaryOperator.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/NotUnaryOperator.java
deleted file mode 100644
index f8f09b2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/NotUnaryOperator.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.validation.internal.el.operators;
-
-import org.eclipse.emf.common.util.Diagnostic;
-import org.eclipse.jst.jsf.common.internal.types.BooleanLiteralType;
-import org.eclipse.jst.jsf.common.internal.types.LiteralType;
-import org.eclipse.jst.jsf.common.internal.types.TypeCoercer;
-import org.eclipse.jst.jsf.common.internal.types.TypeCoercionException;
-import org.eclipse.jst.jsf.common.internal.types.TypeConstants;
-import org.eclipse.jst.jsf.common.internal.types.TypeTransformer;
-import org.eclipse.jst.jsf.common.internal.types.ValueType;
-import org.eclipse.jst.jsf.validation.internal.el.diagnostics.DiagnosticFactory;
-
-/**
- * Represents te EL unary operators "!" and "not" on a ValueType
- * as described by JSP.2.3.6.2
- * 
- * @author cbateman
- *
- */
-/*package*/ class NotUnaryOperator extends UnaryOperator 
-{
-    NotUnaryOperator(DiagnosticFactory diagnosticFactory) 
-    {
-        super(diagnosticFactory);
-    }
-
-    public Diagnostic validate(ValueType type)
-    {
-    	if (TypeConstants.TYPE_JAVAOBJECT.equals(type.getSignature())) {
-    		return Diagnostic.OK_INSTANCE;
-    	}
-        boolean canCoerce =
-            TypeCoercer.canCoerceToBoolean(TypeTransformer.transformBoxPrimitives(type.getSignature()));
-
-        if (canCoerce)
-        {
-            // check for constant evaluation
-            if (type instanceof LiteralType)
-            {
-                try
-                {
-                    Boolean coercedValue = ((LiteralType)type).coerceToBoolean();
-                    
-                    // we are logically notting, so coerced is true, then false
-                    // if false then true
-                    return _diagnosticFactory.create_UNARY_OP_CONSTANT_EXPRESSION_EVAL_SAME_ID(
-                                 "not" //$NON-NLS-1$
-                                 , Boolean.valueOf(!coercedValue.booleanValue()).toString()); 
-                        
-                }
-                catch (TypeCoercionException tce)
-                {
-                    throw new AssertionError("coerce should not throw exception"); //$NON-NLS-1$
-                }
-            }
-            
-            return Diagnostic.OK_INSTANCE;
-        }
-        return _diagnosticFactory.create_UNARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN();
-    }
-    
-    public ValueType performOperation(ValueType type)
-    {
-        boolean canCoerce =
-            TypeCoercer.canCoerceToBoolean(TypeTransformer.transformBoxPrimitives(type.getSignature()));
-
-        if (canCoerce)
-        {
-            if (type instanceof LiteralType)
-            {
-                try
-                {
-                    Boolean coercedValue = ((LiteralType)type).coerceToBoolean();
-                    
-                    // we are logically notting, so coerced is true, then false
-                    // if false then true
-                    return 
-                        coercedValue.booleanValue() ? 
-                                  BooleanLiteralType.FALSE :
-                                      BooleanLiteralType.TRUE;
-                }
-                catch (TypeCoercionException tce)
-                {
-                    throw new AssertionError("coerce should not throw exception"); //$NON-NLS-1$
-                }
-            }
-            
-            return new ValueType(TypeConstants.TYPE_BOOLEAN, type.getAssignability());
-        }
-        return null;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/OrBinaryOperator.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/OrBinaryOperator.java
deleted file mode 100644
index 4914704..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/OrBinaryOperator.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.validation.internal.el.operators;
-
-import org.eclipse.jst.jsf.validation.internal.el.diagnostics.DiagnosticFactory;
-
-/** 
- * Encapsulates the 'and'/'&&' boolean-AND operator
- * Based on JSP.2.3.6.1
- * 
- * @author cbateman
- *
- */
-/*package*/class OrBinaryOperator extends LogicalBinaryOperator 
-{
-    OrBinaryOperator(DiagnosticFactory diagnosticFactory) 
-    {
-        super(diagnosticFactory);
-    }
-
-    protected boolean doRealOperation(Boolean firstArg, Boolean secondArg) 
-    {
-        return (firstArg.booleanValue() || secondArg.booleanValue());
-    }
-
-    protected String readableOperatorName()
-    {
-        return "logical-OR"; //$NON-NLS-1$
-    }
-
-    protected boolean shortCircuitValue() 
-    {
-        // OR short-circuits on true
-        return true;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/RelationalBinaryOperator.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/RelationalBinaryOperator.java
deleted file mode 100644
index 924ec98..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/RelationalBinaryOperator.java
+++ /dev/null
@@ -1,239 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.validation.internal.el.operators;
-
-import org.eclipse.emf.common.util.Diagnostic;
-import org.eclipse.jst.jsf.common.internal.types.BooleanLiteralType;
-import org.eclipse.jst.jsf.common.internal.types.IAssignable;
-import org.eclipse.jst.jsf.common.internal.types.LiteralType;
-import org.eclipse.jst.jsf.common.internal.types.TypeCoercer;
-import org.eclipse.jst.jsf.common.internal.types.TypeCoercionException;
-import org.eclipse.jst.jsf.common.internal.types.TypeConstants;
-import org.eclipse.jst.jsf.common.internal.types.TypeTransformer;
-import org.eclipse.jst.jsf.common.internal.types.ValueType;
-import org.eclipse.jst.jsf.core.IJSFCoreConstants;
-import org.eclipse.jst.jsf.validation.internal.el.diagnostics.DiagnosticFactory;
-
-
-/**
- * Super-class of all relational binary ops - "==", "!=", "<", ">", "<=", ">="
- * @author cbateman
- *
- */
-/*package*/ abstract class RelationalBinaryOperator extends BinaryOperator 
-{
-    private final String        _jsfVersion;
-    
-    RelationalBinaryOperator(final DiagnosticFactory diagnosticFactory, final String jsfVersion)
-    {
-        super(diagnosticFactory);
-        _jsfVersion = jsfVersion;
-    }
-    
-    /**
-     * @param firstArg
-     * @param secondArg
-     * @return the result of the operation
-     */
-    protected abstract boolean doRealOperation(Number firstArg, Number secondArg);
-
-    /**
-     * @param firstArg
-     * @param secondArg
-     * @return the result  of the operation
-     */
-    protected abstract boolean doRealOperation(String firstArg, String secondArg);
-
-    /**
-     * @return the operation's user readable name
-     */
-    protected abstract String getOperationName();
-    
-    /**
-     * Performs a the operation, casting both args to BigDecimal first
-     * 
-     * @param firstArg
-     * @param secondArg
-     * @param numberType 
-     * @return the result of the comparison or null if indeterminate
-     */
-    protected ValueType handleNumericComparison(ValueType firstArg, ValueType secondArg, Class  numberType)
-    {
-        try
-        {
-            TypeCoercer.coerceToNumber(TypeTransformer.transformBoxPrimitives(firstArg.getSignature()));
-            TypeCoercer.coerceToNumber(TypeTransformer.transformBoxPrimitives(secondArg.getSignature()));
-            
-            Number firstValue = null;
-            if (firstArg instanceof LiteralType)
-            {
-                firstValue = ((LiteralType)firstArg).coerceToNumber(numberType);
-            }
-            
-            Number secondValue = null;
-            if (secondArg instanceof LiteralType)
-            {
-                secondValue = ((LiteralType)secondArg).coerceToNumber(numberType);
-            }
-            
-            if (firstValue != null && secondValue != null)
-            {
-                boolean result = doRealOperation(firstValue, secondValue);
-                
-                return result ? BooleanLiteralType.TRUE : BooleanLiteralType.FALSE;
-            }
-            
-            // if we get to here, we only know that both can be up cast to BigDecimal
-            // and compared.  This will yield a boolean result
-            // this value cannot be lhs
-            return new ValueType(TypeConstants.TYPE_BOOLEAN, IAssignable.ASSIGNMENT_TYPE_RHS);
-        }
-        catch (TypeCoercionException tce)
-        {
-            // no valid coercion, so return null
-            return null;
-        }
-    }
-    
-    /**
-     * @param firstType
-     * @param secondType
-     * @param numberType
-     * @return a diagnostic validating the relational comparison of firstType to secondType
-     */
-    protected Diagnostic validateNumericComparison(ValueType firstType, ValueType secondType, Class numberType)
-    {
-        try
-        {
-            TypeCoercer.coerceToNumber(TypeTransformer.transformBoxPrimitives(firstType.getSignature()));
-            TypeCoercer.coerceToNumber(TypeTransformer.transformBoxPrimitives(secondType.getSignature()));
-            
-            Number firstValue = null;
-            if (firstType instanceof LiteralType)
-            {
-                firstValue = ((LiteralType)firstType).coerceToNumber(numberType);
-            }
-            
-            Number secondValue = null;
-            if (secondType instanceof LiteralType)
-            {
-                secondValue = ((LiteralType)secondType).coerceToNumber(numberType);
-            }
-            
-            if (firstValue != null && secondValue != null)
-            {
-                boolean result = doRealOperation(firstValue, secondValue);
-                
-                return _diagnosticFactory.
-                    create_BINARY_OP_CONSTANT_EXPRESSION_ALWAYS_EVAL_SAME
-                        (getOperationName(), Boolean.toString(result));
-            }
-            
-            // if we get to here, we only know that both can be up cast to BigDecimal
-            // and compared.  This condition is okay
-            return Diagnostic.OK_INSTANCE;
-        }
-        catch (TypeCoercionException tce)
-        {
-            // could not make numeric coercion for valid comparison
-            return _diagnosticFactory.create_BINARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION(getOperationName());
-        }
-    }
-
-    /**
-     * @param firstType
-     * @param secondType
-     * @return the result of the operation
-     */
-    protected ValueType handleStringComparison(ValueType firstType, ValueType secondType)
-    {
-        String firstValue = null;
-        
-        if (firstType instanceof LiteralType)
-        {
-            firstValue = ((LiteralType)firstType).getLiteralValue();
-        }
-        
-        String secondValue = null;
-        if (secondType instanceof LiteralType)
-        {
-            secondValue = ((LiteralType)secondType).getLiteralValue();
-        }
-        
-        if (firstValue != null && secondValue != null)
-        {
-            boolean newValue = doRealOperation(firstValue, secondValue);
-            return newValue ? BooleanLiteralType.TRUE : BooleanLiteralType.FALSE;
-        }
-        
-        // if don't have all literals, just return boolean type
-        return new ValueType(TypeConstants.TYPE_BOOLEAN, IAssignable.ASSIGNMENT_TYPE_RHS);
-    }
-
-    /**
-     * @param firstType
-     * @param secondType
-     * @return a diagnostic validating the string comparison of firstType to secondType
-     */
-    protected Diagnostic validateStringComparison(ValueType firstType, ValueType secondType)
-    {
-        String firstValue = null;
-        
-        if (firstType instanceof LiteralType)
-        {
-            firstValue = ((LiteralType)firstType).getLiteralValue();
-        }
-        
-        String secondValue = null;
-        if (secondType instanceof LiteralType)
-        {
-            secondValue = ((LiteralType)secondType).getLiteralValue();
-        }
-        
-        if (firstValue != null && secondValue != null)
-        {
-            boolean newValue = doRealOperation(firstValue, secondValue);
-            return _diagnosticFactory.
-                create_BINARY_OP_CONSTANT_EXPRESSION_ALWAYS_EVAL_SAME
-                    (getOperationName(), Boolean.toString(newValue));
-        }
-        
-        // if don't have all literals, just return boolean type
-        return Diagnostic.OK_INSTANCE;
-    }
-    
-
-    /**
-     * @return the current JSF version string
-     */
-    protected final String getJsfVersion() {
-        return _jsfVersion;
-    }
-    
-    /**
-     * @return true if the JSF version for this operator is JSF 1.1 or 1.0
-     */
-    protected final boolean isPreJSF12()
-    {
-        return IJSFCoreConstants.JSF_VERSION_1_1.equals(_jsfVersion) 
-                || IJSFCoreConstants.JSF_VERSION_1_0.equals(_jsfVersion);
-    }
-    
-    /**
-     * @return true if the JSF version for this operator is JSF 1.2 or later
-     */
-    protected final boolean isJSF12OrLater()
-    {
-        return !isPreJSF12();
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/SubtractArithmeticBinaryOperator.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/SubtractArithmeticBinaryOperator.java
deleted file mode 100644
index acdaeda..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/SubtractArithmeticBinaryOperator.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.validation.internal.el.operators;
-
-import java.math.BigDecimal;
-
-import org.eclipse.jst.jsf.validation.internal.el.diagnostics.DiagnosticFactory;
-
-/**
- * Represents the EL arithmetic subtraction binary operator
- * 
- * @author cbateman
- *
- */
-/*package*/  class SubtractArithmeticBinaryOperator extends
-        NoDivArithmeticBinaryOperator 
-{
-
-    private static final String SUBTRACTION = "subtraction"; //$NON-NLS-1$
-
-    SubtractArithmeticBinaryOperator(DiagnosticFactory diagnosticFactory) {
-        super(diagnosticFactory);
-    }
-
-    protected Long doRealOperation(Long firstArg, Long secondArg) 
-    {
-        return Long.valueOf(firstArg.longValue() - secondArg.longValue());
-    }
-
-    protected Double doRealOperation(Double firstArg, Double secondArg) 
-    {
-        return new Double(firstArg.doubleValue() - secondArg.doubleValue());
-    }
-
-    protected BigDecimal doRealOperation(BigDecimal firstArg,
-            BigDecimal secondArg) 
-    {
-        return firstArg.subtract(secondArg);
-    }
-
-    protected String getOperatorName() 
-    {
-        return SUBTRACTION;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/TernaryChoiceOperator.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/TernaryChoiceOperator.java
deleted file mode 100644
index a6a3683..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/TernaryChoiceOperator.java
+++ /dev/null
@@ -1,143 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.validation.internal.el.operators;
-
-import org.eclipse.emf.common.util.Diagnostic;
-import org.eclipse.jst.jsf.common.internal.types.IAssignable;
-import org.eclipse.jst.jsf.common.internal.types.LiteralType;
-import org.eclipse.jst.jsf.common.internal.types.TypeCoercer;
-import org.eclipse.jst.jsf.common.internal.types.TypeCoercionException;
-import org.eclipse.jst.jsf.common.internal.types.TypeConstants;
-import org.eclipse.jst.jsf.common.internal.types.TypeTransformer;
-import org.eclipse.jst.jsf.common.internal.types.ValueType;
-import org.eclipse.jst.jsf.validation.internal.el.diagnostics.DiagnosticFactory;
-
-/**
- * Represents the ternary choice op in EL: a ? b :c
- * Based on JSP.2.3.8
- * 
- * @author cbateman
- *
- */
-public class TernaryChoiceOperator 
-{
-    private final DiagnosticFactory     _diagnosticFactory;
-    
-    
-    /**
-     * @param diagnosticFactory
-     */
-    public TernaryChoiceOperator(DiagnosticFactory diagnosticFactory)
-    {
-        super();
-        _diagnosticFactory = diagnosticFactory;
-    }
-
-    /**
-     * @param choiceArg
-     * @param whenTrueArg
-     * @param whenFalseArg
-     * @return the result of the choice arguments or null if indeterminant
-     */
-    public ValueType perform(ValueType choiceArg, ValueType whenTrueArg, ValueType whenFalseArg)
-    {
-        final boolean isChoiceBoolean = 
-            TypeCoercer.canCoerceToBoolean(TypeTransformer.transformBoxPrimitives(choiceArg.getSignature()));
-        
-        if (isChoiceBoolean)
-        {
-            if (choiceArg instanceof LiteralType)
-            {
-                try
-                {
-                    Boolean result = ((LiteralType)choiceArg).coerceToBoolean();
-                    
-                    if (result != null)
-                    {
-                        return result.booleanValue() ? whenTrueArg : whenFalseArg;
-                    }
-                }
-                catch (TypeCoercionException tce)
-                {
-                    return null;
-                }
-            }
-            
-            final String boxedWhenTrueArg =
-                TypeTransformer.transformBoxPrimitives(whenTrueArg.getSignature());
-            
-            final String boxedWhenFalseArg =
-                TypeTransformer.transformBoxPrimitives(whenFalseArg.getSignature());
-            // check if the two results are the same type
-            // TODO: could increase accuracy by appoximating type:i.e. if both
-            // are numeric etc.
-            if (boxedWhenTrueArg.equals(boxedWhenFalseArg))
-            {
-                return new ValueType(whenTrueArg, IAssignable.ASSIGNMENT_TYPE_RHS);
-            }
-
-            // otherwise, we have no idea what the resulting type is
-            return null;
-        }
-        
-        // if choice is not boolean, then can't resolve
-        return null;
-    }
-    
-    /**
-     * @param choiceArg
-     * @return a diagnostic validating the choice expr with these arguments
-     */
-    public Diagnostic validate(ValueType choiceArg)
-    {
-    	if (TypeConstants.TYPE_JAVAOBJECT.equals(choiceArg.getSignature())) {
-    		return Diagnostic.OK_INSTANCE;
-    	}
-
-        final boolean isChoiceBoolean = 
-            TypeCoercer.canCoerceToBoolean(TypeTransformer.transformBoxPrimitives(choiceArg.getSignature()));
-        
-        if (isChoiceBoolean)
-        {
-            if (choiceArg instanceof LiteralType)
-            {
-                try
-                {
-                    Boolean result = ((LiteralType)choiceArg).coerceToBoolean();
-                    
-                    if (result != null)
-                    {
-                        String whichSelected = result.booleanValue() ? "first" : "second"; //$NON-NLS-1$ //$NON-NLS-2$
-                        return _diagnosticFactory.
-                            create_TERNARY_OP_CHOICE_IS_ALWAYS_SAME
-                                (result.booleanValue(), whichSelected);
-                    }
-                }
-                catch (TypeCoercionException tce)
-                {
-                    return _diagnosticFactory.
-                        create_TERNARY_OP_CANNOT_COERCE_CHOICE_TO_BOOLEAN();
-                }
-            }
-
-            // in both the case where the two arguments are the same and when
-            // they are different types, the best we can say is "OK", since
-            // we really don't know
-            return Diagnostic.OK_INSTANCE;
-        }
-        
-        // if choice is not boolean, then can't resolve
-        return _diagnosticFactory.
-            create_TERNARY_OP_CANNOT_COERCE_CHOICE_TO_BOOLEAN();
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/UnaryOperator.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/UnaryOperator.java
deleted file mode 100644
index 5161e46..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/UnaryOperator.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.validation.internal.el.operators;
-
-import org.eclipse.emf.common.util.Diagnostic;
-import org.eclipse.jst.jsf.common.internal.types.ValueType;
-import org.eclipse.jst.jsf.validation.internal.el.diagnostics.DiagnosticFactory;
-import org.eclipse.jst.jsp.core.internal.java.jspel.JSPELParserConstants;
-import org.eclipse.jst.jsp.core.internal.java.jspel.Token;
-
-/**
- * Encapsulates an EL unary operator
- * @author cbateman
- *
- */
-public abstract class UnaryOperator 
-{
-    /**
-     * The common factory used to construct diagnostics
-     */
-    protected final DiagnosticFactory     _diagnosticFactory;
-    
-    /**
-     * @param token
-     * @return true if the token is a unary operator
-     */
-    public static boolean isUnaryOperator(Token token)
-    {
-        return (token.kind == JSPELParserConstants.MINUS)
-                  || (token.kind == JSPELParserConstants.NOT1)
-                  || (token.kind == JSPELParserConstants.NOT2)
-                  || (token.kind == JSPELParserConstants.EMPTY);
-    }
-
-    /**
-     * @param token 
-     * @param diagnosticFactory 
-     * @return a new UnaryOperator instance matching token 
-     */
-    public static UnaryOperator createUnaryOperator(Token token, DiagnosticFactory diagnosticFactory)
-    {
-        if (!isUnaryOperator(token))
-        {
-            throw new IllegalArgumentException("token must be a unary operator"); //$NON-NLS-1$
-        }
-        
-        switch(token.kind)
-        {
-            case JSPELParserConstants.MINUS:
-                return new MinusUnaryOperator(diagnosticFactory);
-
-            case JSPELParserConstants.NOT1:
-            case JSPELParserConstants.NOT2:
-                return new NotUnaryOperator(diagnosticFactory);
-                
-            case JSPELParserConstants.EMPTY:
-                return new EmptyUnaryOperator(diagnosticFactory);
-        }
-
-        // should never get here because all four ops are covered
-        throw new AssertionError();
-    }
-
-    /**
-     * Constructor
-     */
-    UnaryOperator(DiagnosticFactory diagnosticFactory) 
-    {
-        /* no construction or sub-classing outside package*/
-        _diagnosticFactory = diagnosticFactory;
-    }
-    
-    /**
-     * If ValueType is a literal and the operation can be performed, then
-     * the return must be a new LiteralType transformed using this operator.
-     * 
-     * If ValueType is not a literal and the operaton can be performed, then
-     * the return is a new ValueType transformed per the rules of the operator
-     * (i.e. if it is a string type and the operator is "!", then the string
-     * must be coerced to a boolean and this is what will be returned)
-     * 
-     * If the operation cannot be performed on ValueType, return null
-     * 
-     * @param type
-     * @return a new value type after the operation is performed
-     */
-    public abstract ValueType performOperation(ValueType type);
-    
-    
-    /**
-     * @param type
-     * @return a Diagnostic interpreting whether it is valid to perform the
-     * operation on this type
-     */
-    public abstract Diagnostic validate(ValueType type);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/messages.properties b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/messages.properties
deleted file mode 100644
index ae40823..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/messages.properties
+++ /dev/null
@@ -1,21 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-EqualityRelationalBinaryOperator.FirstArgument=first
-EqualsBinaryRelationalOperator.OperationName=equals
-EqualityRelationalBinaryOperator.SecondArgument=second
-GreaterThanEqRelationalBinaryOperator.OperationName=greater than or equal to
-GreaterThanRelationalBinaryOperator.OperationName=greater than
-LessThanEqRelationalBinaryOperator.OperationName=less than or equal to
-LessThanRelationalBinaryOperator.OperationName=less than
-LtGtRelationalBinaryOperator.ConstantName.False=false
-NotEqualsBinaryRelationalOperator.OperationName=not equals
-BracketOperator.Name=bracket
-DotOperator.Name=dot
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/facelet/FaceletDiagnosticFactory.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/facelet/FaceletDiagnosticFactory.java
deleted file mode 100644
index 4f31523..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/facelet/FaceletDiagnosticFactory.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    Xianan Jiang/IBM - repurposed for Facelets.
- ********************************************************************************/
-package org.eclipse.jst.jsf.validation.internal.facelet;
-
-import org.eclipse.emf.common.util.BasicDiagnostic;
-import org.eclipse.emf.common.util.Diagnostic;
-import org.eclipse.osgi.util.NLS;
-
-/**
- * Factory for all operator diagnostics. Class should not be implemented,
- * instantiated or sub-classed.
- * 
- * @author cbateman, xjiang
- * 
- */
-public final class FaceletDiagnosticFactory
-{
-    /**
-     * The id used in the source field of all Diagnostic's created by this
-     * factory to uniquely identify EL validation as their source type.
-     */
-    public final static String SOURCE_ID = "org.eclipse.jst.jsf.facelet.core.internal.validation.diagnostics.Diagnostics";//$NON-NLS-1$
-    /**
-     * Problem id
-     */
-    public final static int CANNOT_FIND_FACELET_TAGLIB_ID = 0;
-    /**
-     * Count of ids
-     */
-    public final static int NUM_IDS = 1;
-
-    /**
-     * @param uri
-     * @return a configured diagnostic
-     */
-    public Diagnostic create_CANNOT_FIND_FACELET_TAGLIB(final String uri)
-    {
-        final String message = NLS.bind(Messages.CANNOT_FIND_FACELET_TAGLIB,
-                uri);
-        return create(CANNOT_FIND_FACELET_TAGLIB_ID, message);
-    }
-
-    private BasicDiagnostic create(final int diagnosticId, final String message)
-    {
-        final int severity = FaceletValidationPreferences
-                .getDefaultSeverity(diagnosticId);
-        return new BasicDiagnostic(severity, SOURCE_ID, diagnosticId, message,
-                null);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/facelet/FaceletValidationPreferences.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/facelet/FaceletValidationPreferences.java
deleted file mode 100644
index 42b5667..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/facelet/FaceletValidationPreferences.java
+++ /dev/null
@@ -1,291 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.validation.internal.facelet;
-
-import org.eclipse.core.runtime.preferences.IScopeContext;
-import org.eclipse.emf.common.util.Diagnostic;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jst.jsf.core.internal.IJSFPreferenceModel;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.validation.internal.Severity;
-import org.eclipse.jst.jsf.validation.internal.el.diagnostics.DiagnosticFactory;
-
-/**
- * Model object for EL validation preferences
- * 
- * @author cbateman
- */
-public class FaceletValidationPreferences implements IJSFPreferenceModel
-{
-    private int[] _severities;
-
-    /**
-     * Loads the object from the preference store provided
-     * 
-     * @param prefStore
-     */
-    public void load(final IPreferenceStore prefStore)
-    {
-        loadSeverities(prefStore);
-    }
-
-    private void loadSeverities(final IPreferenceStore prefStore)
-    {
-        final int severities[] = getSeverities();
-        for (int i = 0; i < FaceletDiagnosticFactory.NUM_IDS; i++)
-        {
-            final String key = getKeyById(i);
-            if (!prefStore.contains(key))
-            {
-                final int diagSeverity = getDefaultSeverity(i);
-                final Severity severity = mapDiagToSeverity(diagSeverity);
-                prefStore.setDefault(key, severity.toString());
-            }
-            final String storedSeverity = prefStore.getString(key);
-            severities[i] = mapSeverityToDiag(storedSeverity);
-        }
-    }
-
-    /**
-     * Copies the object into the preference store but DOES NOT SAVE IT
-     * 
-     * @param prefStore
-     */
-    public void commit(final IPreferenceStore prefStore)
-    {
-        commitSeverities(prefStore);
-    }
-
-    private void commitSeverities(final IPreferenceStore prefStore)
-    {
-        final int severities[] = getSeverities();
-        for (int i = 0; i < severities.length; i++)
-        {
-            final String key = getKeyById(i);
-            prefStore
-                    .setValue(key, mapDiagToSeverity(severities[i]).toString());
-        }
-    }
-
-    /**
-     * Reverts the model to it's defaults. Does not commit to pref store.
-     */
-    public void setDefaults()
-    {
-        setProblemSeverityDefaults();
-    }
-
-    private void setProblemSeverityDefaults()
-    {
-        final int[] severities = getSeverities();
-        for (int i = 0; i < DiagnosticFactory.NUM_IDS; i++)
-        {
-            severities[i] = getDefaultSeverity(i);
-        }
-    }
-
-    public Object getValueByKey(final IScopeContext context, final String key)
-    {
-        // ignore context for now; will be used when we have project overrides
-        try
-        {
-            final Severity severity = getSeverity(key);
-            return severity.toString();
-        } catch (final IllegalArgumentException e)
-        {
-            // getIdByKey will throw this exception if key is not a valid
-            // severity key. Ignore the exception here and fall-through
-        }
-        return null; // not found
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see
-     * org.eclipse.jst.jsf.core.internal.IJSFPreferenceModel#getStoredValueByKey
-     * (org.eclipse.core.runtime.preferences.IScopeContext, java.lang.String)
-     */
-    public Object getStoredValueByKey(final IScopeContext context, final String key)
-    {
-        // ignore context for now; will be used when we have project overrides
-        try
-        {
-            return context
-                    .getNode("org.eclipse.jst.jsf.core").get(key, mapDiagToSeverity(getDefaultSeverity(getIdByKey(key))).toString()); //$NON-NLS-1$
-        } catch (final IllegalArgumentException e)
-        {
-            // getIdByKey will throw this exception if key is not a valid
-            // severity key. Ignore the exception here and fall-through
-        }
-        return null; // not found
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see
-     * org.eclipse.jst.jsf.core.internal.IJSFPreferenceModel#setValueByKey(org
-     * .eclipse.core.runtime.preferences.IScopeContext, java.lang.String,
-     * java.lang.Object)
-     */
-    public Object setValueByKey(final IScopeContext context, final String key, final Object value)
-    {
-        // ignore context for now; will be used when we have project overrides
-        final Severity oldValue = getSeverity(key);
-        setSeverity(key, (Severity) value);
-        return oldValue;
-    }
-
-    /**
-     * @param key
-     * @return the severity
-     */
-    public Severity getSeverity(final String key)
-    {
-        final int severityDiag = _severities[getIdByKey(key)];
-        final Severity severity = mapDiagToSeverity(severityDiag);
-        return severity;
-    }
-
-    /**
-     * @param key
-     * @param severity
-     */
-    public void setSeverity(final String key, final Severity severity)
-    {
-        final int newSeverityDiag = mapSeverityToDiag(severity.toString());
-        final int diagId = getIdByKey(key);
-        _severities[diagId] = newSeverityDiag;
-    }
-
-    /**
-     * @param diagnosticId
-     * @return the severity as configured for diagnosticId. The value is
-     *         relative to the Diagnostic class severity scheme
-     */
-    public final int getDiagnosticSeverity(final int diagnosticId)
-    {
-        return getSeverities()[diagnosticId];
-    }
-
-    private int[] getSeverities()
-    {
-        if (_severities == null)
-        {
-            _severities = new int[FaceletDiagnosticFactory.NUM_IDS];
-        }
-        return _severities;
-    }
-
-    /**
-     * @param diagSeverity
-     * @return a Severity preference value for a diagnostic severity
-     */
-    public static Severity mapDiagToSeverity(final int diagSeverity)
-    {
-        switch (diagSeverity)
-        {
-            case Diagnostic.ERROR:
-                return Severity.ERROR;
-            case Diagnostic.WARNING:
-                return Severity.WARNING;
-            default:
-                return Severity.IGNORE;
-        }
-    }
-
-    /**
-     * @param severity
-     * @return a Diagnostic severity level for a severity pref string
-     */
-    public static int mapSeverityToDiag(final String severity)
-    {
-        if ("error".equals(severity)) //$NON-NLS-1$
-        {
-            return Diagnostic.ERROR;
-        } else if ("warning".equals(severity)) //$NON-NLS-1$
-        {
-            return Diagnostic.WARNING;
-        } else if ("ignore".equals(severity)) //$NON-NLS-1$
-        {
-            return Diagnostic.OK;
-        } else
-        {
-            throw new IllegalArgumentException("Invalid enum name: " + severity); //$NON-NLS-1$
-        }
-    }
-
-    /**
-     * @param diagnosticId
-     * @return the default severity of a diagnostic
-     */
-    public static int getDefaultSeverity(final int diagnosticId)
-    {
-        switch (diagnosticId)
-        {
-            case FaceletDiagnosticFactory.CANNOT_FIND_FACELET_TAGLIB_ID:
-                return Diagnostic.WARNING;
-            default:
-                throw new IllegalArgumentException(
-                        "Diagnostic Id: " + diagnosticId + " is out of range"); //$NON-NLS-1$ //$NON-NLS-2$
-        }
-    }
-
-    /**
-     * @param diagnosticId
-     * @return the preference key for the corresponding diagnosticId in the el
-     *         DiagnosticFactory
-     */
-    public static String getKeyById(final int diagnosticId)
-    {
-        switch (diagnosticId)
-        {
-            case FaceletDiagnosticFactory.CANNOT_FIND_FACELET_TAGLIB_ID:
-                return CANNOT_FIND_FACELET_TAGLIB;
-            default:
-                throw new IllegalArgumentException(
-                        "Diagnostic Id: " + diagnosticId + " is out of range"); //$NON-NLS-1$ //$NON-NLS-2$
-        }
-    }
-
-    /**
-     * @param key
-     * @return the preference key for the corresponding diagnosticId in the el
-     *         DiagnosticFactory
-     */
-    public static int getIdByKey(final String key)
-    {
-        if (CANNOT_FIND_FACELET_TAGLIB.equals(key))
-        {
-            return FaceletDiagnosticFactory.CANNOT_FIND_FACELET_TAGLIB_ID;
-        }
-        throw new IllegalArgumentException("Severity Key: " + key); //$NON-NLS-1$
-    }
-
-    /**
-     * e.g. createQualifiedKeyName("foo") -> org.eclipse.jst.jsf.core.foo
-     * 
-     * @param baseName
-     * @return a plugin qualified key given the baseName
-     * 
-     */
-    private static String createQualifiedKeyName(final String baseName)
-    {
-        return JSFCorePlugin.PLUGIN_ID + "." + baseName; //$NON-NLS-1$
-    }
-
-    /**
-     * preference key. Match to DiagnosticFactory constants
-     */
-    public final static String CANNOT_FIND_FACELET_TAGLIB = createQualifiedKeyName("CANNOT_FIND_FACELET_TAGLIB"); //$NON-NLS-1$
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/facelet/Messages.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/facelet/Messages.java
deleted file mode 100644
index 4cdfcad..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/facelet/Messages.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.validation.internal.facelet;
-
-import org.eclipse.osgi.util.NLS;
-
-class Messages extends NLS
-{
-    private static final String BUNDLE_NAME = "org.eclipse.jst.jsf.core.validation.internal.facelet.messages"; //$NON-NLS-1$
-    static
-    {
-        NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-    }
-    /**
-     * see messages.properties
-     */
-    public static String CANNOT_FIND_FACELET_TAGLIB;
-
-    private Messages()
-    {
-        // do nothing; no external instantiation
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/facelet/messages.properties b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/facelet/messages.properties
deleted file mode 100644
index e72d517..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/facelet/messages.properties
+++ /dev/null
@@ -1,11 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2008 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-CANNOT_FIND_FACELET_TAGLIB=Can't find facelet tag library for uri {0}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/strategy/AttributeValidatingStrategy.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/strategy/AttributeValidatingStrategy.java
deleted file mode 100644
index f30a5c4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/strategy/AttributeValidatingStrategy.java
+++ /dev/null
@@ -1,728 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.validation.internal.strategy;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.ISafeRunnable;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.SafeRunner;
-import org.eclipse.emf.common.util.BasicDiagnostic;
-import org.eclipse.emf.common.util.Diagnostic;
-import org.eclipse.jdt.core.Signature;
-import org.eclipse.jst.jsf.common.dom.AttrDOMAdapter;
-import org.eclipse.jst.jsf.common.dom.AttributeIdentifier;
-import org.eclipse.jst.jsf.common.dom.DOMAdapter;
-import org.eclipse.jst.jsf.common.internal.types.CompositeType;
-import org.eclipse.jst.jsf.common.internal.types.TypeComparator;
-import org.eclipse.jst.jsf.common.internal.types.TypeComparatorDiagnosticFactory;
-import org.eclipse.jst.jsf.common.internal.types.TypeConstants;
-import org.eclipse.jst.jsf.common.internal.types.TypeTransformer;
-import org.eclipse.jst.jsf.common.runtime.internal.model.ViewObject;
-import org.eclipse.jst.jsf.common.runtime.internal.model.component.ComponentFactory;
-import org.eclipse.jst.jsf.common.runtime.internal.model.component.ComponentInfo;
-import org.eclipse.jst.jsf.common.runtime.internal.model.decorator.ConverterDecorator;
-import org.eclipse.jst.jsf.common.runtime.internal.model.decorator.ConverterTypeInfo;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContextFactory;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.core.internal.region.Region2AttrAdapter;
-import org.eclipse.jst.jsf.core.internal.region.Region2ElementAdapter;
-import org.eclipse.jst.jsf.core.jsfappconfig.internal.IJSFAppConfigManager;
-import org.eclipse.jst.jsf.core.jsfappconfig.internal.JSFAppConfigManagerFactory;
-import org.eclipse.jst.jsf.designtime.DTAppManagerUtil;
-import org.eclipse.jst.jsf.designtime.internal.view.DTUIViewRoot;
-import org.eclipse.jst.jsf.designtime.internal.view.IDTViewHandler.ViewHandlerException;
-import org.eclipse.jst.jsf.designtime.internal.view.XMLViewDefnAdapter;
-import org.eclipse.jst.jsf.designtime.internal.view.XMLViewDefnAdapter.DTELExpression;
-import org.eclipse.jst.jsf.designtime.internal.view.XMLViewObjectMappingService;
-import org.eclipse.jst.jsf.designtime.internal.view.XMLViewObjectMappingService.ElementData;
-import org.eclipse.jst.jsf.facesconfig.emf.ConverterForClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.ConverterType;
-import org.eclipse.jst.jsf.metadataprocessors.MetaDataEnabledProcessingFactory;
-import org.eclipse.jst.jsf.metadataprocessors.features.ELIsNotValidException;
-import org.eclipse.jst.jsf.metadataprocessors.features.IValidELValues;
-import org.eclipse.jst.jsf.metadataprocessors.features.IValidValues;
-import org.eclipse.jst.jsf.metadataprocessors.features.IValidationMessage;
-import org.eclipse.jst.jsf.validation.internal.AbstractXMLViewValidationStrategy;
-import org.eclipse.jst.jsf.validation.internal.JSFValidationContext;
-import org.eclipse.jst.jsf.validation.internal.el.ELExpressionValidator;
-import org.eclipse.jst.jsp.core.internal.regions.DOMJSPRegionContexts;
-import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;
-import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionCollection;
-import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionList;
-import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext;
-
-/**
- * An XML view validation strategy that validates
- * 
- * @author cbateman
- * 
- */
-public class AttributeValidatingStrategy extends
-AbstractXMLViewValidationStrategy
-{
-    private static final  String       DISABLE_ALTERATIVE_TYPES_KEY = "jsfCoreDisableConverterValidation"; //$NON-NLS-1$
-    private static final  String       ENABLE_ALTERATIVE_TYPES_KEY  = "jsfCoreEnableConverterValidation"; //$NON-NLS-1$
-    static final boolean               DEBUG;
-    static
-    {
-        final String value = Platform
-        .getDebugOption("org.eclipse.jst.jsf.validation.internal.el/debug/jspsemanticsvalidator"); //$NON-NLS-1$
-        DEBUG = value != null && value.equalsIgnoreCase("true"); //$NON-NLS-1$
-    }
-
-    /**
-     * identifier
-     */
-    public final static String         ID           = "org.eclipse.jst.jsf.validation.strategy.AttributeValidatingStrategy"; //$NON-NLS-1$
-    private final static String        DISPLAY_NAME = "Attribute Validator"; //$NON-NLS-1$
-
-    private final JSFValidationContext _validationContext;
-    private final TypeComparator       _typeComparator;
-    private Set<String>                _conversionTypes;
-
-    /**
-     * Default constructor
-     * 
-     * @param validationContext
-     */
-    public AttributeValidatingStrategy(final JSFValidationContext validationContext)
-    {
-        super(ID, DISPLAY_NAME);
-
-        _validationContext = validationContext;
-        _typeComparator = new TypeComparator(
-                new TypeComparatorDiagnosticFactory(validationContext
-                        .getPrefs().getTypeComparatorPrefs()));
-    }
-
-    @Override
-    public boolean isInteresting(final DOMAdapter domAdapter)
-    {
-        return (domAdapter instanceof AttrDOMAdapter);
-    }
-
-    @Override
-    public void validate(final DOMAdapter domAdapter)
-    {
-        if (domAdapter instanceof AttrDOMAdapter)
-        {
-            final long curTime = System.nanoTime();
-            final Region2AttrAdapter attrAdapter = (Region2AttrAdapter) domAdapter;
-            // check that this is attribute value region - 221722
-            if (attrAdapter.getAttributeValueRegion() != null)
-            {
-                final IStructuredDocumentContext context = IStructuredDocumentContextFactory.INSTANCE
-                .getContext(attrAdapter.getDocumentContext()
-                        .getStructuredDocument(), attrAdapter
-                        .getOwningElement().getDocumentContext()
-                        .getDocumentPosition()
-                        + attrAdapter.getAttributeValueRegion()
-                        .getStart());
-
-                validateAttributeValue(context, attrAdapter);
-            }
-            if (DEBUG)
-            {
-                System.out.println(String.format("Validation for attribute: %s took %d" //$NON-NLS-1$
-                    , domAdapter.toString()
-                    , Long.valueOf(System.nanoTime()-curTime)));
-            }
-        }
-    }
-
-    /**
-     * Validates the attribute value. Reports any problems to the reporter in
-     * the JSFValidationContext.
-     * 
-     * @param context
-     * @param attrAdapter
-     */
-    private void validateAttributeValue(
-            final IStructuredDocumentContext context,
-            final Region2AttrAdapter attrAdapter)
-    {
-        // so of the code in run calls out into extension code or code
-        // dependent on external data (meta-data)
-        SafeRunner.run(new ISafeRunnable()
-        {
-            public void handleException(final Throwable exception)
-            {
-                JSFCorePlugin.log(String.format(
-                        "Error validating attribute: %s on element %s", //$NON-NLS-1$
-                        attrAdapter.getNodeName(), attrAdapter
-                        .getOwningElement().getNodeName()), exception);
-            }
-
-            public void run() throws Exception
-            {
-                final Region2ElementAdapter elementAdapter =
-                    attrAdapter.getOwningElement();
-                // if there's elText then validate it
-                // TODO: this approach will fail with mixed expressions
-                if (!checkIfELAndValidate(elementAdapter, attrAdapter, context))
-                {
-                    validateNonELAttributeValue(context, attrAdapter);
-                }
-            }
-        });
-    }
-
-    private boolean checkIfELAndValidate(final Region2ElementAdapter elementAdapter,
-            final Region2AttrAdapter attrAdapter,
-            final IStructuredDocumentContext context)
-    {
-        int offsetOfFirstEL = -1;
-        final String attrValue = attrAdapter.getValue();
-
-        // TODO: should find and validate all
-        offsetOfFirstEL = attrValue.indexOf('#');
-
-        if (offsetOfFirstEL != -1 && offsetOfFirstEL < attrValue.length() - 1
-                && attrValue.charAt(offsetOfFirstEL + 1) == '{')
-        {
-            offsetOfFirstEL += 2;
-        }
-        else
-        {
-            offsetOfFirstEL = -1;
-        }
-
-        final XMLViewDefnAdapter adapter = DTAppManagerUtil
-        .getXMLViewDefnAdapter(context);
-
-        boolean isEL = false;
-        if (adapter != null && offsetOfFirstEL != -1)
-        {
-            try
-            {
-                // use the attribute's context plus the offset into the
-                // whole attribute value to find where we think the el
-                // expression starts. Add one since the attribute value
-                // string returned by attrAdapter will have the value quotes
-                // removed, but the region offsets include the quotes.
-                IStructuredDocumentContext elContext = IStructuredDocumentContextFactory.INSTANCE
-                .getContext(context.getStructuredDocument(), context
-                        .getDocumentPosition()
-                        + offsetOfFirstEL + 1);
-                final DTELExpression elExpression = adapter
-                .getELExpression(elContext);
-                if (elExpression != null)
-                {
-                    final String elText = elExpression.getText();
-
-                    if (DEBUG)
-                    {
-                        System.out.println(addDebugSpacer(3) + "EL attrVal= " //$NON-NLS-1$
-                                + elText);
-                    }
-
-                    elContext = elExpression.getDocumentContext();
-                    // EL validation is user configurable because
-                    // it can be computationally costly.
-                    if (_validationContext.shouldValidateEL())
-                    {
-                        // also, skip the validation if the expression is empty
-                        // or only whitespace, since the parser doesn't handle
-                        // it
-                        // anyway.
-                        if ("".equals(elText.trim())) //$NON-NLS-1$
-                        {
-                            final int offset = elContext.getDocumentPosition() - 1;
-                            final int length = elText.length() + 2;
-                            final Diagnostic diagnostic = _validationContext
-                            .getDiagnosticFactory()
-                            .create_EMPTY_EL_EXPRESSION();
-                            // detected empty EL expression
-                            if (_validationContext.shouldValidateEL())
-                            {
-                                _validationContext.getReporter().report(
-                                        diagnostic, offset, length);
-                            }
-                        }
-                        else
-                        {
-                            final List elVals = MetaDataEnabledProcessingFactory
-                            .getInstance()
-                            .getAttributeValueRuntimeTypeFeatureProcessors(
-                                    IValidELValues.class,
-                                    elContext,
-                                    attrAdapter
-                                    .getAttributeIdentifier());
-                            final String safeELText = elText.replaceAll(
-                                    "[\n\r\t]", " "); //$NON-NLS-1$ //$NON-NLS-2$
-                            validateELExpression(context, elContext, elVals,
-                                    elementAdapter, attrAdapter, safeELText);
-                            isEL = true;
-                        }
-                    } else {
-                        isEL = true;
-                    }
-                }
-            }
-            catch (final ViewHandlerException e)
-            {
-                // fall through to return false
-            }
-        }
-
-        // is el if we've already detected it or if the step 2 method
-        // finds it. Run the method first to avoid short-circuiting
-        final boolean isEL2 = checkIfELAndValidate2(attrAdapter, context);
-
-        return isEL || isEL2;
-    }
-
-    /**
-     * Checks the region to see if it contains an EL attribute value. If it
-     * does, validates it
-     * 
-     * @return true if validated EL, false otherwise
-     */
-    private boolean checkIfELAndValidate2(final Region2AttrAdapter attrAdapter,
-            final IStructuredDocumentContext sDocContext)
-    {
-        final ITextRegion attrValueRegion = attrAdapter
-                .getAttributeValueRegion();
-        if (attrValueRegion instanceof ITextRegionCollection)
-        {
-            final ITextRegionCollection parentRegion = ((ITextRegionCollection) attrValueRegion);
-            if (parentRegion.getType() == DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE)
-            {
-                final ITextRegionList regionList = parentRegion.getRegions();
-
-                if (regionList.size() >= 3)
-                {
-                    final ITextRegion openQuote = regionList.get(0);
-                    final ITextRegion vblOpen = regionList.get(1);
-
-                    if ((openQuote.getType() == DOMJSPRegionContexts.XML_TAG_ATTRIBUTE_VALUE_DQUOTE || openQuote
-                            .getType() == DOMJSPRegionContexts.JSP_VBL_DQUOTE || 
-                            openQuote.getType() == DOMJSPRegionContexts.JSP_TAG_ATTRIBUTE_VALUE_DQUOTE)
-                            && vblOpen.getType() == DOMJSPRegionContexts.JSP_VBL_OPEN)
-                    {
-                        boolean foundClosingQuote = false;
-                        for (int i = 2; !foundClosingQuote
-                                && i < regionList.size(); i++)
-                        {
-                            final ITextRegion searchRegion = regionList.get(i);
-                            if (searchRegion.getType() == DOMJSPRegionContexts.JSP_VBL_CLOSE)
-                            {
-                                foundClosingQuote = true;
-                            }
-                        }
-
-                        if (!foundClosingQuote
-                                && _validationContext.shouldValidateEL())
-                        {
-                            final int offset = sDocContext
-                                    .getDocumentPosition() + 1;
-                            final int length = parentRegion.getText().length();
-                            final Diagnostic diagnostic = _validationContext
-                                    .getDiagnosticFactory()
-                                    .create_MISSING_CLOSING_EXPR_BRACKET();
-                            _validationContext.getReporter().report(diagnostic,
-                                    offset, length);
-                        }
-                        return true;
-                    }
-                }
-            }
-        }
-        return false;
-    }
-
-    private void validateELExpression(final IStructuredDocumentContext context,
-            final IStructuredDocumentContext elContext, final List elVals,
-            final Region2ElementAdapter elementAdapter,
-            final Region2AttrAdapter attrAdapter, final String elText)
-    {
-        // Call EL validator which will perform at least the syntactical
-        // validation
-        final ELExpressionValidator elValidator = new ELExpressionValidator(
-                elContext, elText, _validationContext
-                        .getSymbolResolverFactory(), _validationContext
-                        .getReporter());
-        elValidator.validateXMLNode();
-
-        final CompositeType exprType = elValidator.getExpressionType();
-        if (exprType != null)
-        {
-        	// Ignore the expression whose last two segments are of types Object.
-        	final CompositeType boxedType = TypeTransformer
-            	.transformBoxPrimitives(exprType);
-        	final String[] testSignatures = boxedType.getSignatures();
-        	if (testSignatures.length > 0 && TypeConstants.TYPE_JAVAOBJECT.equals(testSignatures[0])) 
-        	{
-        		if (elText.indexOf('.') != -1) 
-        		{
-        			String elText2 = elText.substring(0, elText.lastIndexOf('.'));
-                    final ELExpressionValidator elValidator2 = new ELExpressionValidator(
-                            elContext, elText2, _validationContext
-                                    .getSymbolResolverFactory(), _validationContext
-                                    .getReporter());
-                    elValidator2.validateXMLNode();
-
-                    final CompositeType exprType2 = elValidator.getExpressionType();
-                	final CompositeType boxedType2 = TypeTransformer.transformBoxPrimitives(exprType2);
-                	final String[] testSignatures2 = boxedType2.getSignatures();
-                	if (testSignatures2.length > 0 && TypeConstants.TYPE_JAVAOBJECT.equals(testSignatures2[0])) 
-                	{
-                		return;
-                	}
-        		}
-        	}
-        	
-            for (final Iterator it = elVals.iterator(); it.hasNext();)
-            {
-                final IValidELValues elval = (IValidELValues) it.next();
-                final String attributeVal = attrAdapter.getValue();
-                CompositeType expectedType;
-                Diagnostic status = null;
-                try
-                {
-                    expectedType = elval.getExpectedRuntimeType();
-
-                    if (expectedType != null)
-                    {
-                        expectedType = maybeAddAlternativeTypes(
-                                expectedType, exprType, elementAdapter,
-                                attrAdapter);
-                        status = _typeComparator.calculateTypeCompatibility(
-                                expectedType, exprType);
-                        if (status.getSeverity() != Diagnostic.OK)
-                        {
-                            reportValidationMessage(status, context,
-                                    attributeVal);
-                        }
-                    }
-                }
-                catch (final ELIsNotValidException e)
-                {
-                    reportValidationMessage(createValidationMessage(context,
-                            attributeVal, IStatus.WARNING, e.getMessage(),
-                            _validationContext.getFile()), context,
-                            attributeVal);
-                }
-            }
-        }
-    }
-
-    private boolean disableAlternativeTypes()
-    {
-        if (hasProperty(DISABLE_ALTERATIVE_TYPES_KEY))
-        {
-            return true;
-        }
-
-        if (hasProperty(ENABLE_ALTERATIVE_TYPES_KEY))
-        {
-            return false;
-        }
-        
-//      As of Helios, alternative type is disabled by default
-        return true;
-        
-//        final IPreferenceStore prefStore = JSFCorePlugin.getDefault().getPreferenceStore();
-//        return prefStore.getBoolean("org.eclipse.jst.jsf.core."+DISABLE_ALTERATIVE_TYPES_KEY); //$NON-NLS-1$
-    }
-    
-    private boolean hasProperty(final String key) {
-    	 String res = System.getProperty(key);
-         if (res == null) {
-             //check env var also
-             res = System.getenv(key);
-         }
-         return res != null;
-    }
-    /**
-     * @return true if alternative type comparison (i.e. post-conversion) passes
-     */
-    private CompositeType maybeAddAlternativeTypes(
-            final CompositeType expectedType, final CompositeType exprTypes,
-            final Region2ElementAdapter elementAdapter,
-            final Region2AttrAdapter attrAdapter)
-    {
-        final long curTime = System.nanoTime();
-        
-        //As of Helios, alternative type is disabled by default
-        //and enabled by the ENABLE_ALTERNATIVE_TYPES_KEY system/env property
-        if (disableAlternativeTypes())
-        {
-            return expectedType;
-        }
-
-        final IStructuredDocumentContext context = elementAdapter
-                .getDocumentContext();
-        final DTUIViewRoot viewRoot = _validationContext.getViewRootHandle().getCachedViewRoot();
-        final IAdaptable serviceAdaptable = viewRoot.getServices();
-        final XMLViewObjectMappingService mappingService = (XMLViewObjectMappingService) serviceAdaptable
-                .getAdapter(XMLViewObjectMappingService.class);
-        if (mappingService != null)
-        {
-            final ElementData elementData = XMLViewObjectMappingService
-                    .createElementData(elementAdapter.getNamespace(),
-                            elementAdapter.getLocalName(), context,
-                            Collections.EMPTY_MAP);
-            final ViewObject viewObject = mappingService
-                    .findViewObject(elementData);
-            // if the corresponding view object is a valueholder, then
-            // we need to see if you think there a valid conversion
-            // available
-            if (viewObject instanceof ComponentInfo
-                    && ((ComponentInfo) viewObject).getComponentTypeInfo() != null
-                    && ((ComponentInfo) viewObject).getComponentTypeInfo()
-                            .isInstanceOf(
-                                    ComponentFactory.INTERFACE_VALUEHOLDER))
-            {
-                final ComponentInfo component = (ComponentInfo) viewObject;
-                // get the original elementData
-                final ElementData mappedElementData = mappingService
-                        .findElementData(component);
-                final String propName = mappedElementData
-                        .getPropertyName(attrAdapter.getLocalName());
-                if ("value".equals(propName)) //$NON-NLS-1$
-                {
-                    // final List converters =
-                    // component.getDecorators(ComponentFactory.CONVERTER);
-
-                    // (ConverterDecorator) it.next();
-                    final CompositeType alternativeTypes = createCompositeType(
-                            expectedType, exprTypes, component
-                                    .getDecorators(ComponentFactory.CONVERTER));
-                    if (DEBUG)
-                    {
-                        System.out.println(String.format(
-                                "maybeAddAlternative took %d", Long.valueOf(System //$NON-NLS-1$
-                                        .nanoTime()
-                                            - curTime)));
-                    }
-                    return alternativeTypes;
-                }
-            }
-        }
-        if (DEBUG)
-        {
-            System.out.println(String.format("maybeAddAlternative took %d", Long //$NON-NLS-1$
-                .valueOf(System.nanoTime() - curTime)));
-        }
-        // don't add anything by default
-        return expectedType;
-    }
-
-    private CompositeType createCompositeType(final CompositeType initialTypes,
-            final CompositeType testTypes, final List<ConverterDecorator> decorators)
-    {
-        // indicates unknown converter
-        final Set<String> types = new HashSet(Arrays.asList(initialTypes
-                .getSignatures()));
-        // look for converters.  If there's one where we don't know the type,
-        // simply copy over the testTypes to force validation to ignore, since
-        // we have no  idea.
-        for (final ConverterDecorator decorator : decorators)
-        {
-            if (decorator.getTypeInfo() != null)
-            {
-                final ConverterTypeInfo converterTypeInfo = decorator.getTypeInfo();
-                if (converterTypeInfo.getForClass().length == 0)
-                {
-                    types.addAll(Arrays.asList(testTypes.getSignatures()));
-                    break;
-                }
-                types.addAll(createSignatures(converterTypeInfo.getForClass()));
-            }
-        }
-        types.addAll(getRegisteredConversionTypesByClass());
-        return new CompositeType(types.toArray(new String[0])
-                , initialTypes.getAssignmentTypeMask());
-    }
-
-    private Set<String>  getRegisteredConversionTypesByClass()
-    {
-        if (_conversionTypes == null)
-        {
-            _conversionTypes = new HashSet<String>();
-            final IProject project = _validationContext.getFile().getProject();
-            final IJSFAppConfigManager appConfig = JSFAppConfigManagerFactory.getJSFAppConfigManagerInstance(project);
-            final List<ConverterType> converters = appConfig.getConverters();
-            for (final ConverterType converterType : converters)
-            {
-                final ConverterForClassType forClassType = converterType.getConverterForClass();
-                if (forClassType != null)
-                {
-                    final String forClass = forClassType.getTextContent();
-                    if (forClass != null)
-                    {
-                        String signature = forClass.trim();
-                        try
-                        {
-                            // arrays are a special case where the 
-                            // [Ljava.lang.String; syntax is valid.
-                            if (Signature.getArrayCount(signature)>0)
-                            {
-                                _conversionTypes.add(signature);
-                            }
-                        }
-                        catch (final IllegalArgumentException e)
-                        {
-                            // ignore
-                        }
-
-                        try
-                        {
-                            signature = Signature.createTypeSignature(signature, true);
-                            _conversionTypes.add(signature);
-                        }
-                        catch (final Exception e)
-                        {
-                            // ignore: JSFCorePlugin.log(IStatus.INFO, "Could not use registered converter for-class: "+forClass); //$NON-NLS-1$
-                        }
-                    }
-                }
-            }
-        }
-        return _conversionTypes;
-    }
-
-    private List<String> createSignatures(final String[] classNames)
-    {
-        final List<String> signatures = new ArrayList<String>();
-        for (final String className : classNames)
-        {
-            try
-            {
-                String signature = Signature.createTypeSignature(className, true);
-                signatures.add(signature);
-            }
-            catch (final Exception e)
-            {
-                JSFCorePlugin.log(e, "Trying to create signature"); //$NON-NLS-1$
-            }
-        }
-        return signatures;
-    }
-
-    /**
-     * Validates an attribute value in context using the JSF metadata processing
-     * framework
-     * 
-     * @param context
-     * @param region
-     * @param uri
-     * @param tagName
-     * @param attrName
-     * @param attributeVal
-     * @param reporter
-     * @param file
-     */
-    private void validateNonELAttributeValue(
-            final IStructuredDocumentContext context,
-            final Region2AttrAdapter attrAdapter)
-    {
-        final String attributeValue = attrAdapter.getValue();
-        // else validate as static attribute value
-        if (DEBUG)
-        {
-            System.out.println(addDebugSpacer(3) + "attrVal= " //$NON-NLS-1$
-                    + (attributeValue != null ? attributeValue : "null")); //$NON-NLS-1$
-        }
-
-        final AttributeIdentifier attributeId = attrAdapter
-        .getAttributeIdentifier();
-
-        if (attributeId.getTagIdentifier() == null
-                || attributeId.getTagIdentifier().getTagName() == null
-                || attributeId.getName() == null)
-        {
-            return;
-        }
-
-        final List vv = MetaDataEnabledProcessingFactory.getInstance()
-        .getAttributeValueRuntimeTypeFeatureProcessors(
-                IValidValues.class, context, attributeId);
-        if (!vv.isEmpty())
-        {
-            for (final Iterator it = vv.iterator(); it.hasNext();)
-            {
-                final IValidValues v = (IValidValues) it.next();
-                if (!v.isValidValue(attributeValue.trim()))
-                {
-                    if (DEBUG)
-                    {
-                        System.out.println(addDebugSpacer(4) + "NOT VALID "); //$NON-NLS-1$
-                    }
-
-                    for (final Iterator msgs = v.getValidationMessages()
-                            .iterator(); msgs.hasNext();)
-                    {
-                        final IValidationMessage msg = (IValidationMessage) msgs
-                        .next();
-                        reportValidationMessage(createValidationMessage(
-                                context, attributeValue, msg.getSeverity(), msg
-                                .getMessage(), _validationContext
-                                .getFile()), context, attributeValue);
-                    }
-                }
-                else if (DEBUG)
-                {
-                    System.out.println(addDebugSpacer(5) + "VALID "); //$NON-NLS-1$
-                }
-            }
-        }
-        else if (DEBUG)
-        {
-            System.out.println(addDebugSpacer(4) + "NO META DATA "); //$NON-NLS-1$
-        }
-    }
-
-    private void reportValidationMessage(final Diagnostic problem,
-            final IStructuredDocumentContext context,
-            final String attributeValue)
-    {
-        final int start = context.getDocumentPosition() + 1;
-        final int length = attributeValue.length();
-        _validationContext.getReporter().report(problem, start, length);
-    }
-
-    private Diagnostic createValidationMessage(
-            final IStructuredDocumentContext context,
-            final String attributeValue, final int severity, final String msg,
-            final IFile file)
-    {
-        // TODO: need factory
-        final Diagnostic diagnostic = new BasicDiagnostic(severity, "", -1, //$NON-NLS-1$
-                msg, null);
-        return diagnostic;
-    }
-
-    private String addDebugSpacer(final int count)
-    {
-        final String TAB = "\t"; //$NON-NLS-1$
-        final StringBuffer ret = new StringBuffer(""); //$NON-NLS-1$
-        for (int i = 0; i <= count; i++)
-        {
-            ret.append(TAB);
-        }
-        return ret.toString();
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/strategy/ContainmentValidatingStrategy.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/strategy/ContainmentValidatingStrategy.java
deleted file mode 100644
index 5089a3d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/strategy/ContainmentValidatingStrategy.java
+++ /dev/null
@@ -1,243 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.validation.internal.strategy;
-
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.common.util.Diagnostic;
-import org.eclipse.jst.jsf.common.dom.DOMAdapter;
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.jsf.common.internal.JSPUtil;
-import org.eclipse.jst.jsf.common.metadata.Entity;
-import org.eclipse.jst.jsf.common.metadata.Trait;
-import org.eclipse.jst.jsf.common.metadata.query.ITaglibDomainMetaDataModelContext;
-import org.eclipse.jst.jsf.common.metadata.query.TaglibDomainMetaDataQueryHelper;
-import org.eclipse.jst.jsf.common.sets.AxiomaticSet;
-import org.eclipse.jst.jsf.common.sets.ConcreteAxiomaticSet;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IDOMContextResolver;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IStructuredDocumentContextResolverFactory;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.core.internal.region.Region2ElementAdapter;
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.jsf.core.internal.tld.TagIdentifierFactory;
-import org.eclipse.jst.jsf.core.set.constraint.MemberConstraint;
-import org.eclipse.jst.jsf.core.set.mapping.ElementToTagIdentifierMapping;
-import org.eclipse.jst.jsf.core.tagmatcher.EvaluationException;
-import org.eclipse.jst.jsf.core.tagmatcher.InvalidExpressionException;
-import org.eclipse.jst.jsf.core.tagmatcher.XPathMatchingAlgorithm;
-import org.eclipse.jst.jsf.validation.internal.AbstractXMLViewValidationStrategy;
-import org.eclipse.jst.jsf.validation.internal.JSFValidationContext;
-import org.eclipse.jst.jsf.validation.internal.constraints.ContainsTagConstraint;
-import org.eclipse.jst.jsf.validation.internal.constraints.TagId;
-import org.eclipse.jst.jsf.validation.internal.constraints.TagSet;
-import org.w3c.dom.Node;
-
-/**
- * @author cbateman
- * 
- */
-public class ContainmentValidatingStrategy extends
-        AbstractXMLViewValidationStrategy
-{
-    /**
-     * identifier
-     */
-    public final static String                         ID = 
-        "org.eclipse.jst.jsf.validation.strategy.ElementValidatingStrategy"; //$NON-NLS-1$
-    private final static String                        DISPLAY_NAME =
-        Messages.ContainmentValidatingStrategy_DisplayName;
-    private final static ElementToTagIdentifierMapping elem2TagIdMapper = 
-        new ElementToTagIdentifierMapping();
-    
-    private static final  String  ENABLE_CONTAINMENT_VALIDATION_KEY  = "jsfCoreEnableContainmentValidation"; //$NON-NLS-1$
-    
-    private int                                        _containmentValidationCount;  // = 0;
-    private final JSFValidationContext                 _jsfValidationContext;
-    private boolean 								   _enabled;						
-
-    /**
-     * @param jsfValidationContext
-     */
-    public ContainmentValidatingStrategy(
-            final JSFValidationContext jsfValidationContext)
-    {
-        super(ID, DISPLAY_NAME);
-        _jsfValidationContext = jsfValidationContext;
-        _enabled = isEnabled();
-    }
-
-	@Override
-    public boolean isInteresting(DOMAdapter domAdapter)
-    {
-        return domAdapter instanceof Region2ElementAdapter;
-    }
-
-    @Override
-    public void validate(DOMAdapter domAdapter)
-    {
-        if (_enabled 
-        		&& domAdapter instanceof Region2ElementAdapter)
-        {
-            final Region2ElementAdapter elementAdapter = 
-                (Region2ElementAdapter) domAdapter;
-            validateContainment(elementAdapter, _jsfValidationContext);
-        }
-    }
-
-    /**
-     * @return true if the containment validation strategy is enabled
-     */
-    public static boolean isEnabled() {
-		 String res = System.getProperty(ENABLE_CONTAINMENT_VALIDATION_KEY);
-		 if (res == null) {
-		     //check env var also
-		     res = System.getenv(ENABLE_CONTAINMENT_VALIDATION_KEY);
-		 }
-		 return res != null;		
-	}
-    
-    private void validateContainment(
-            final Region2ElementAdapter elementAdapter,
-            final JSFValidationContext jsfValidationContext)
-    {
-        // don't validate JSP fragments since the necessary containment may
-        // existing
-        // in the JSP files that include them
-        // also only validate the first instance of containment violation in a
-        // file
-        if (JSPUtil.isJSPFragment(jsfValidationContext.getFile())
-                || _containmentValidationCount > 0)
-        {
-            return;
-        }
-
-        final IStructuredDocumentContext context = elementAdapter
-                .getDocumentContext();
-        final IDOMContextResolver resolver = IStructuredDocumentContextResolverFactory.INSTANCE
-                .getDOMContextResolver(context);
-        final Node node = resolver.getNode();
-
-        final String uri = elementAdapter.getNamespace();
-        final String tagName = elementAdapter.getLocalName();
-        // final Element node = elementAdapter.
-
-        final ITaglibDomainMetaDataModelContext modelContext = TaglibDomainMetaDataQueryHelper
-                .createMetaDataModelContext(jsfValidationContext.getFile()
-                        .getProject(), uri);
-        final Entity entity = TaglibDomainMetaDataQueryHelper.getEntity(
-                modelContext, tagName);
-        if (entity != null)
-        {
-            final Trait trait = TaglibDomainMetaDataQueryHelper.getTrait(
-                    entity, "containment-constraint"); //$NON-NLS-1$
-
-            if (trait != null)
-            {
-                final ContainsTagConstraint tagConstraint = (ContainsTagConstraint) trait
-                        .getValue();
-
-                final String algorithm = tagConstraint.getSetGenerator()
-                        .getAlgorithm();
-
-                // TODO: need generalized factory mechanism for registering and
-                // constructing algorithms.
-                if (!"xpath".equals(algorithm)) //$NON-NLS-1$
-                {
-                    return;
-                }
-
-                final String expr = tagConstraint.getSetGenerator()
-                        .getExpression();
-
-                // TODO: optimize on the expression and cache for reuse
-                final XPathMatchingAlgorithm xpathAlg = new XPathMatchingAlgorithm(
-                        expr);
-
-                AxiomaticSet set = null;
-
-                try
-                {
-                    set = xpathAlg.evaluate(node);
-                    // map dom nodes to tag identifiers
-                    set = elem2TagIdMapper.map(set);
-                }
-                catch (final InvalidExpressionException e)
-                {
-                    JSFCorePlugin.log(e, "Problem with expression: " + expr //$NON-NLS-1$
-                            + " on node " + node); //$NON-NLS-1$
-                    return;
-                }
-                catch (final EvaluationException e)
-                {
-                    JSFCorePlugin.log(e, "Problem evaluating expression: " //$NON-NLS-1$
-                            + expr + " on node " + node); //$NON-NLS-1$
-                    return;
-                }
-
-                final TagSet constraintData = tagConstraint.getSatisfiesSet();
-                final AxiomaticSet constraintSet = new ConcreteAxiomaticSet();
-                for (final Iterator it = constraintData.getTags().iterator(); it
-                        .hasNext();)
-                {
-                    final TagId tagId = (TagId) it.next();
-                    constraintSet.add(TagIdentifierFactory.createJSPTagWrapper(
-                            tagId.getUri(), tagId.getName()));
-                }
-                final MemberConstraint memberConstraint = new MemberConstraint(
-                        constraintSet);
-                final Diagnostic diag = memberConstraint.isSatisfied(set);
-
-                if (diag.getSeverity() != Diagnostic.OK)
-                {
-                    _containmentValidationCount++; // found a violation
-
-                    final List data = diag.getData();
-
-                    for (final Iterator it = data.iterator(); it.hasNext();)
-                    {
-                        final TagIdentifier missingParent = (TagIdentifier) it
-                                .next();
-
-                        reportContainmentProblem(context, node, missingParent);
-                    }
-                }
-            }
-        }
-    }
-
-    private void reportContainmentProblem(
-            final IStructuredDocumentContext context,
-            final Node node,
-            final TagIdentifier missingParent)
-    {
-
-    	Diagnostic diagnostic = null;
-    	if (missingParent.equals(IJSFConstants.TAG_IDENTIFIER_VIEW)) {
-    		diagnostic = DiagnosticFactory.create_CONTAINMENT_ERROR_MISSING_VIEW(node.getNodeName());
-    	}
-    	else if (missingParent.equals(IJSFConstants.TAG_IDENTIFIER_FORM)) {
-    		diagnostic = DiagnosticFactory.create_CONTAINMENT_ERROR_MISSING_FORM(node.getNodeName());
-    	}
-    	else {
-    		diagnostic = DiagnosticFactory.create_CONTAINMENT_ERROR_MISSING_ANCESTOR(node.getNodeName(), missingParent);
-    	} 
-
-        // add one so that the start offset is at the node name, rather
-        // than the opening brace.
-        final int start = context.getDocumentPosition()+1;
-        final int length = node.getNodeName().length();
-
-       _jsfValidationContext.getReporter().report(diagnostic, start, length);
-    }
-    
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/strategy/DiagnosticFactory.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/strategy/DiagnosticFactory.java
deleted file mode 100644
index 809bff2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/strategy/DiagnosticFactory.java
+++ /dev/null
@@ -1,169 +0,0 @@
-package org.eclipse.jst.jsf.validation.internal.strategy;
-
-import java.util.Locale;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.emf.common.util.BasicDiagnostic;
-import org.eclipse.emf.common.util.Diagnostic;
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.validation.internal.appconfig.ILocalizedMessage;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.wst.validation.internal.core.Message;
-import org.eclipse.wst.validation.internal.provisional.core.IMessage;
-
-/**
- * Diagnostic factory for JSF views 
- *
- */
-public final class DiagnosticFactory {
-	
-    /**
-     * The id used in the source field of all Diagnostic's created by this factory
-     * to uniquely identify tag validation as their source type.
-     */
-    public final static String SOURCE_ID = "org.eclipse.jst.jsf.validation.tag.Diagnostics";//$NON-NLS-1$
-
-    /**
-     * Problem id
-     */
-    public final static int CONTAINMENT_ERROR_MISSING_VIEW = 1;
-    
-    /**
-     * Problem id
-     */
-    public final static int CONTAINMENT_ERROR_MISSING_FORM = 2;
-
-    /**
-     * Problem id
-     */
-	public static final int CONTAINMENT_ERROR_MISSING_ANCESTOR = 3;
-    
-
-    /**
-     * @param tagName 
-     * @return message indicating a JSF view tag is missing as an ancestor     
-     */
-    public static Diagnostic create_CONTAINMENT_ERROR_MISSING_VIEW(final String tagName)
-    {
-    	return create(CONTAINMENT_ERROR_MISSING_VIEW,
-    			NLS.bind(Messages.CONTAINMENT_ERROR_MISSING_VIEW, tagName));                
-    }
-    
-    /**
-     * @param tagName 
-     * @return message indicating a JSF form tag is missing as an ancestor     
-     */
-    public static Diagnostic create_CONTAINMENT_ERROR_MISSING_FORM(final String tagName)
-    {    	
-        return create(CONTAINMENT_ERROR_MISSING_FORM,
-               NLS.bind(Messages.CONTAINMENT_ERROR_MISSING_FORM, tagName));
-    }
-    
-    /**  
-     * @param tagName 
-     * @param missingTag 
-     * @return message indicating some tag is missing as an ancestor     
-     */
-    public static Diagnostic create_CONTAINMENT_ERROR_MISSING_ANCESTOR(final String tagName, final TagIdentifier missingTag)
-    {
-    	
-        return create(CONTAINMENT_ERROR_MISSING_ANCESTOR,
-        		NLS.bind(Messages.CONTAINMENT_ERROR_MISSING_ANCESTOR, 
-        				new Object[]{ tagName, missingTag.getUri(), missingTag.getTagName()}));
-    }
-
-    private static BasicDiagnostic create(final int diagnosticId, final String message)
-    {
-        final int severity = IMessage.NORMAL_SEVERITY;//ELValidationPreferences.getDefaultSeverity(diagnosticId);
-        return new BasicDiagnostic(severity, SOURCE_ID 
-                , diagnosticId
-                , message
-                , null);
-    }
-	/**
-     * Customized localizable message for view validation
-     * @author cbateman
-     *
-     */
-    static class MyLocalizedMessage extends Message implements ILocalizedMessage
-    {
-        private final String _message;
-        private final int    _errorCode;
-
-        /**
-         * @param severity
-         * @param messageText
-         * @param targetObject
-         * @param errorCode 
-         */
-        public MyLocalizedMessage(int severity, String messageText, IResource targetObject, int errorCode) {
-            this(severity, messageText, (Object) targetObject, errorCode);
-        }
-
-        /**
-         * @param severity
-         * @param messageText
-         * @param targetObject
-         * @param errorCode 
-         */
-        private MyLocalizedMessage(int severity, String messageText, Object targetObject, int errorCode) {
-            super(JSFCorePlugin.getDefault().getBundle().getSymbolicName(), severity, 
-                    messageText);
-            _message = messageText;
-            setTargetObject(targetObject);
-            _errorCode = errorCode;
-        }
-
-        /**
-         * @return the localized message
-         */
-        public String getLocalizedMessage() {
-            return _message;
-        }
-
-        /**
-         * @see org.eclipse.wst.validation.internal.core.Message#getText()
-         */
-        public String getText() {
-            return getLocalizedMessage();
-        }
-
-        /**
-         * @see org.eclipse.wst.validation.internal.core.Message#getText(java.lang.ClassLoader)
-         */
-        public String getText(ClassLoader cl) {
-            return getLocalizedMessage();
-        }
-
-        /**
-         * @see org.eclipse.wst.validation.internal.core.Message#getText(java.util.Locale)
-         */
-        public String getText(Locale l) {
-            return getLocalizedMessage();
-        }
-
-        public String getText(Locale l, ClassLoader cl) {
-            return getLocalizedMessage();
-        }
-
-        /**
-         * @return the error code related to this message
-         */
-        public int getErrorCode() {
-            return _errorCode;
-        }
-
-
-        /**
-         * @param offset
-         * @return true if this message applies to document offset
-         */
-        public boolean appliesTo(int offset)
-        {
-            return (offset >= getOffset() && offset < getOffset()+getLength());
-        }
-    }
-
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/strategy/Messages.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/strategy/Messages.java
deleted file mode 100644
index 6d88017..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/strategy/Messages.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.validation.internal.strategy;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * String resource handler
- *
- */
-public class Messages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.jst.jsf.validation.internal.strategy.messages"; //$NON-NLS-1$
-	/**
-	 * see messages.properties
-	 */
-	public static String AttributeValidatingStrategy_DisplayName;
-	
-	/**
-	 * see messages.properties
-	 */
-	public static String ContainmentValidatingStrategy_DisplayName;
-	
-    /**
-     * see messages.properties
-     */
-    public static String CONTAINMENT_ERROR_MISSING_VIEW;
-    
-    /**
-     * see messages.properties
-     */
-    public static String CONTAINMENT_ERROR_MISSING_FORM;
-
-    /**
-     * see messages.properties
-     */
-    public static String CONTAINMENT_ERROR_MISSING_ANCESTOR;
-	static {
-		// initialize resource bundle
-		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-	}
-
-	private Messages() {
-		//
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/strategy/messages.properties b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/strategy/messages.properties
deleted file mode 100644
index 71e68e3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/strategy/messages.properties
+++ /dev/null
@@ -1,6 +0,0 @@
-AttributeValidatingStrategy_DisplayName=Attribute Validator
-ContainmentValidatingStrategy_DisplayName=Tag Containment Validator
-
-CONTAINMENT_ERROR_MISSING_VIEW={0} requires f:view ancestor
-CONTAINMENT_ERROR_MISSING_FORM={0} requires h:form ancestor
-CONTAINMENT_ERROR_MISSING_ANCESTOR={0} requires {1} ancestor
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/.classpath b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/.classpath
deleted file mode 100644
index 304e861..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/.options b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/.options
deleted file mode 100644
index 5e3f0bc..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/.options
+++ /dev/null
@@ -1,11 +0,0 @@
-# Debugging options for the org.eclipse.jst.jsf.core
-
-# Turn on general debugging for the org.eclipse.jsf.core plugin.
-org.eclipse.jst.jsf.facelet.core/debug=false
-
-org.eclipse.jst.jsf.facelet.core/tagregistry=false
-org.eclipse.jst.jsf.facelet.core/tagregistry/changes=false
-org.eclipse.jst.jsf.facelet.core/registrymanager=false
-org.eclipse.jst.jsf.facelet.core/facetinstalldelegate=false
-org.eclipse.jst.jsf.facelet.core/facetuninstalldelegate=false
-org.eclipse.jst.jsf.facelet.core/facetchangedelegate=false
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/.project b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/.project
deleted file mode 100644
index 782c0aa..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.jst.jsf.facelet.core</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/.settings/org.eclipse.jdt.core.prefs b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 687a6a7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,89 +0,0 @@
-#Fri Apr 23 14:48:17 PDT 2010
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.5
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.doc.comment.support=enabled
-org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.autoboxing=warning
-org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
-org.eclipse.jdt.core.compiler.problem.deadCode=warning
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=ignore
-org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning
-org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
-org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
-org.eclipse.jdt.core.compiler.problem.invalidJavadoc=error
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=warning
-org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocComments=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.missingJavadocTags=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
-org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=error
-org.eclipse.jdt.core.compiler.problem.nullReference=warning
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
-org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore
-org.eclipse.jdt.core.compiler.problem.redundantNullCheck=warning
-org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
-org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=ignore
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=ignore
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=error
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=error
-org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
-org.eclipse.jdt.core.compiler.problem.unusedLocal=error
-org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore
-org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
-org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
-org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.5
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/.settings/org.eclipse.pde.prefs b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/.settings/org.eclipse.pde.prefs
deleted file mode 100644
index e611bfe..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/.settings/org.eclipse.pde.prefs
+++ /dev/null
@@ -1,22 +0,0 @@
-#Fri May 30 12:02:33 PDT 2008
-compilers.f.unresolved-features=1
-compilers.f.unresolved-plugins=1
-compilers.incompatible-environment=1
-compilers.p.build=1
-compilers.p.deprecated=1
-compilers.p.discouraged-class=1
-compilers.p.internal=1
-compilers.p.missing-packages=0
-compilers.p.no-required-att=0
-compilers.p.not-externalized-att=0
-compilers.p.unknown-attribute=1
-compilers.p.unknown-class=1
-compilers.p.unknown-element=1
-compilers.p.unknown-identifier=1
-compilers.p.unknown-resource=1
-compilers.p.unresolved-ex-points=0
-compilers.p.unresolved-import=0
-compilers.s.create-docs=false
-compilers.s.doc-folder=doc
-compilers.s.open-tags=1
-eclipse.preferences.version=1
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/META-INF/MANIFEST.MF b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/META-INF/MANIFEST.MF
deleted file mode 100644
index b98f23d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,58 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %Bundle-Name.0
-Bundle-SymbolicName: org.eclipse.jst.jsf.facelet.core;singleton:=true
-Bundle-Version: 1.0.1.qualifier
-Bundle-Activator: org.eclipse.jst.jsf.facelet.core.internal.FaceletCorePlugin$Implementation
-Bundle-Localization: plugin
-Require-Bundle: org.eclipse.core.runtime,
- org.eclipse.wst.common.project.facet.core,
- org.eclipse.core.resources;bundle-version="3.4.0",
- org.eclipse.wst.common.modulecore;bundle-version="1.1.103",
- org.eclipse.wst.common.frameworks;bundle-version="1.1.102",
- org.eclipse.jst.jsf.common.runtime,
- org.eclipse.jst.jsf.core,
- org.eclipse.jst.jsf.common;bundle-version="1.0.1";visibility:=reexport,
- org.eclipse.jface.text;bundle-version="3.4.0",
- org.eclipse.wst.sse.core;bundle-version="1.1.300",
- org.eclipse.wst.html.core;bundle-version="1.1.200",
- org.eclipse.jst.jsp.core;bundle-version="1.2.100",
- org.eclipse.jst.jsf.facesconfig;bundle-version="1.0.1",
- org.eclipse.emf.common;bundle-version="2.4.0",
- org.eclipse.jst.j2ee;bundle-version="1.1.105",
- org.eclipse.emf.ecore;bundle-version="2.4.0",
- org.eclipse.ui;bundle-version="3.4.0",
- org.eclipse.emf.edit.ui;bundle-version="2.4.0",
- org.eclipse.jst.j2ee.web;bundle-version="1.1.200",
- org.eclipse.wst.validation;bundle-version="1.2.0",
- org.eclipse.debug.core;bundle-version="[3.5.0,4.0.0)",
- org.eclipse.emf.ecore.xmi;bundle-version="2.5.0",
- org.eclipse.wst.xml.core;bundle-version="1.1.500",
- org.eclipse.jem.proxy;bundle-version="[2.0.300,3.0.0)",
- org.eclipse.jdt.core;bundle-version="[3.6.0,4.0.0)",
- org.eclipse.jst.j2ee.core;bundle-version="[1.2.0,2.0.0)"
-Bundle-ActivationPolicy: lazy
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
-Export-Package: org.eclipse.jst.jsf.facelet.core.internal;x-internal:=true,
- org.eclipse.jst.jsf.facelet.core.internal.cm;x-internal:=true,
- org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd;x-friends:="org.eclipse.jst.jsf.facelet.tagsupport",
- org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.impl;x-internal:=true,
- org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.provider;x-internal:=true,
- org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.util;x-internal:=true,
- org.eclipse.jst.jsf.facelet.core.internal.cm.attributevalues;x-internal:=true,
- org.eclipse.jst.jsf.facelet.core.internal.cm.strategy;x-internal:=true,
- org.eclipse.jst.jsf.facelet.core.internal.facet;x-internal:=true,
- org.eclipse.jst.jsf.facelet.core.internal.metadata;x-internal:=true,
- org.eclipse.jst.jsf.facelet.core.internal.registry;x-internal:=true,
- org.eclipse.jst.jsf.facelet.core.internal.registry.taglib;x-friends:="org.eclipse.jst.jsf.facelet.core.tests",
- org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib;x-friends:="org.eclipse.jst.jsf.facelet.core.tests",
- org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl;x-friends:="org.eclipse.jst.jsf.facelet.core.tests",
- org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.util;x-friends:="org.eclipse.jst.jsf.facelet.core.tests",
- org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0;x-internal:=true,
- org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl;x-internal:=true,
- org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.util;x-internal:=true,
- org.eclipse.jst.jsf.facelet.core.internal.tagmodel;x-internal:=true,
- org.eclipse.jst.jsf.facelet.core.internal.util;x-internal:=true,
- org.eclipse.jst.jsf.facelet.core.internal.validation;x-internal:=true,
- org.eclipse.jst.jsf.facelet.core.internal.view;x-internal:=true
-Bundle-Vendor: %providerName
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/about.html b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/about.html
deleted file mode 100644
index 90bd74d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/about.html
+++ /dev/null
@@ -1,22 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<head>
-<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
-<title>About</title>
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>June, 2008</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise indicated below, the Content is provided to you under the terms and conditions of the
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content.</p>
-
-</body>
-</html>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/about.ini b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/about.ini
deleted file mode 100644
index b20fd5b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/about.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-aboutText = %aboutText
-featureImage = eclipse32.png
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/about.properties b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/about.properties
deleted file mode 100644
index e2ffbfd..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/about.properties
+++ /dev/null
@@ -1,6 +0,0 @@
-aboutText=JSF Tools Project\n\
-\n\
-Version: 1.0.0\n\
-\n\
-(c) Copyright Eclipse contributors and others 2008.  All rights reserved. \n\
-Visit http://www.eclipse.org/webtools
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/build.properties b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/build.properties
deleted file mode 100644
index 3612185..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/build.properties
+++ /dev/null
@@ -1,16 +0,0 @@
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               .,\
-               plugin.xml,\
-               jars/,\
-               plugin.properties,\
-               dtd/,\
-               icons/,\
-               model/,\
-               about.ini,\
-               about.properties,\
-               eclipse_update_120.jpg,\
-               about.html,\
-               eclipse32.png,\
-               std-taglibs/
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/dtd/facelet-taglib_1_0.dtd b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/dtd/facelet-taglib_1_0.dtd
deleted file mode 100644
index 5cbf610..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/dtd/facelet-taglib_1_0.dtd
+++ /dev/null
@@ -1,36 +0,0 @@
-<!--
- Copyright 2005 Sun Microsystems, Inc. All rights reserved.
- Licensed under the Common Development and Distribution License,
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
- 
-   http://www.sun.com/cddl/
-   
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 
- implied. See the License for the specific language governing
- permissions and limitations under the License.
- 
- $Id: facelet-taglib_1_0.dtd,v 1.1 2010/03/08 18:49:45 cbateman Exp $
--->
-
-<!ELEMENT facelet-taglib (library-class|(namespace,(tag|function)+))>
-<!ATTLIST facelet-taglib xmlns CDATA #FIXED "http://java.sun.com/JSF/Facelet">
-<!ELEMENT namespace (#PCDATA)>
-<!ELEMENT library-class (#PCDATA)>
-<!ELEMENT tag (tag-name,(handler-class|component|converter|validator|source))>
-<!ELEMENT tag-name (#PCDATA)>
-<!ELEMENT handler-class (#PCDATA)>
-<!ELEMENT component (component-type,renderer-type?,handler-class?)>
-<!ELEMENT component-type (#PCDATA)>
-<!ELEMENT renderer-type (#PCDATA)>
-<!ELEMENT converter (converter-id, handler-class?)>
-<!ELEMENT converter-id (#PCDATA)>
-<!ELEMENT validator (validator-id, handler-class?)>
-<!ELEMENT validator-id (#PCDATA)>
-<!ELEMENT source (#PCDATA)>
-<!ELEMENT function (function-name,function-class,function-signature)>
-<!ELEMENT function-name (#PCDATA)>
-<!ELEMENT function-class (#PCDATA)>
-<!ELEMENT function-signature (#PCDATA)>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/eclipse32.png b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/eclipse32.png
deleted file mode 100644
index 568fac1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/eclipse32.png
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/eclipse_update_120.jpg b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/eclipse_update_120.jpg
deleted file mode 100644
index bfdf708..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/eclipse_update_120.jpg
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/icons/full/obj16/AttributeData.gif b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/icons/full/obj16/AttributeData.gif
deleted file mode 100644
index c414fe9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/icons/full/obj16/AttributeData.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/icons/full/obj16/ElementData.gif b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/icons/full/obj16/ElementData.gif
deleted file mode 100644
index d92f34c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/icons/full/obj16/ElementData.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/jars/fake_el.jar b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/jars/fake_el.jar
deleted file mode 100644
index 78b04b1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/jars/fake_el.jar
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/model/additionalTagMetadata.ecore b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/model/additionalTagMetadata.ecore
deleted file mode 100644
index 38f283a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/model/additionalTagMetadata.ecore
+++ /dev/null
@@ -1,47 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ecore:EPackage xmi:version="2.0"
-    xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="addtagmd"
-    nsURI="http://org.eclipse.jst.jsf.facelet.core/additionalTagMetadata.ecore" nsPrefix="addTagMD">
-  <eClassifiers xsi:type="ecore:EClass" name="ElementData">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="name" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="name"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="attributes" upperBound="-1"
-        eType="#//AttributeData" containment="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="attribute"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="AttributeData">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="name" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="name"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="usage" eType="#//AttributeUsage">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="usage"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="description" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="description"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EEnum" name="AttributeUsage">
-    <eLiterals name="OPTIONAL"/>
-    <eLiterals name="REQUIRED" value="1"/>
-    <eLiterals name="FIXED" value="2"/>
-    <eLiterals name="PROHIBITED" value="3"/>
-  </eClassifiers>
-</ecore:EPackage>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/model/additionalTagMetadata.genmodel b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/model/additionalTagMetadata.genmodel
deleted file mode 100644
index b87ea5a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/model/additionalTagMetadata.genmodel
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<genmodel:GenModel xmi:version="2.0"
-    xmlns:xmi="http://www.omg.org/XMI" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore"
-    xmlns:genmodel="http://www.eclipse.org/emf/2002/GenModel" copyrightText=""
-    modelDirectory="/org.eclipse.jst.jsf.facelet.core/src" editDirectory="/org.eclipse.jst.jsf.facelet.core/src"
-    modelPluginID="org.eclipse.jst.jsf.facelet.core" templateDirectory="templates"
-    dynamicTemplates="true" modelName="AdditionalTagMetadata" editPluginClass="org.eclipse.jst.jsf.facelet.core.internal.FaceletCorePlugin"
-    nonNLSMarkers="true" importerID="org.eclipse.emf.importer.ecore" complianceLevel="5.0"
-    copyrightFields="false" language="">
-  <foreignModel>additionalTagMetadata.ecore</foreignModel>
-  <genPackages prefix="AddTagMD" basePackage="org.eclipse.jst.jsf.facelet.core.internal.cm"
-      disposableProviderFactory="true" ecorePackage="additionalTagMetadata.ecore#/">
-    <genEnums typeSafeEnumCompatible="false" ecoreEnum="additionalTagMetadata.ecore#//AttributeUsage">
-      <genEnumLiterals ecoreEnumLiteral="additionalTagMetadata.ecore#//AttributeUsage/OPTIONAL"/>
-      <genEnumLiterals ecoreEnumLiteral="additionalTagMetadata.ecore#//AttributeUsage/REQUIRED"/>
-      <genEnumLiterals ecoreEnumLiteral="additionalTagMetadata.ecore#//AttributeUsage/FIXED"/>
-      <genEnumLiterals ecoreEnumLiteral="additionalTagMetadata.ecore#//AttributeUsage/PROHIBITED"/>
-    </genEnums>
-    <genClasses ecoreClass="additionalTagMetadata.ecore#//ElementData">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute additionalTagMetadata.ecore#//ElementData/name"/>
-      <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference additionalTagMetadata.ecore#//ElementData/attributes"/>
-    </genClasses>
-    <genClasses ecoreClass="additionalTagMetadata.ecore#//AttributeData">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute additionalTagMetadata.ecore#//AttributeData/name"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute additionalTagMetadata.ecore#//AttributeData/usage"/>
-    </genClasses>
-  </genPackages>
-</genmodel:GenModel>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/model/facelet-taglib-2_0.genmodel b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/model/facelet-taglib-2_0.genmodel
deleted file mode 100644
index 26e1951..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/model/facelet-taglib-2_0.genmodel
+++ /dev/null
@@ -1,160 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<genmodel:GenModel xmi:version="2.0"
-    xmlns:xmi="http://www.omg.org/XMI" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore"
-    xmlns:genmodel="http://www.eclipse.org/emf/2002/GenModel" modelDirectory="/org.eclipse.jst.jsf.facelet.core/src"
-    modelPluginID="org.eclipse.jst.jsf.facelet.core" modelName="Facelet-taglib-2_0"
-    nonNLSMarkers="true" importerID="org.eclipse.xsd.ecore.importer" complianceLevel="5.0"
-    copyrightFields="false">
-  <foreignModel>facelet-taglib.xsd</foreignModel>
-  <genPackages prefix="FaceletTaglib" basePackage="org.eclipse.jst.jsf.facelet.core.internal.registry.taglib"
-      resource="XML" disposableProviderFactory="true" fileExtensions="taglib.xml"
-      ecorePackage="faceletTaglib_2_0.ecore#/">
-    <genEnums typeSafeEnumCompatible="false" ecoreEnum="faceletTaglib_2_0.ecore#//FaceletTaglibVersion">
-      <genEnumLiterals ecoreEnumLiteral="faceletTaglib_2_0.ecore#//FaceletTaglibVersion/_20"/>
-    </genEnums>
-    <genEnums typeSafeEnumCompatible="false" ecoreEnum="faceletTaglib_2_0.ecore#//GenericBooleanBase">
-      <genEnumLiterals ecoreEnumLiteral="faceletTaglib_2_0.ecore#//GenericBooleanBase/true"/>
-      <genEnumLiterals ecoreEnumLiteral="faceletTaglib_2_0.ecore#//GenericBooleanBase/false"/>
-      <genEnumLiterals ecoreEnumLiteral="faceletTaglib_2_0.ecore#//GenericBooleanBase/yes"/>
-      <genEnumLiterals ecoreEnumLiteral="faceletTaglib_2_0.ecore#//GenericBooleanBase/no"/>
-    </genEnums>
-    <genDataTypes ecoreDataType="faceletTaglib_2_0.ecore#//FaceletTaglibVersionTypeObject"/>
-    <genDataTypes ecoreDataType="faceletTaglib_2_0.ecore#//FullyQualifiedClassBase"/>
-    <genDataTypes ecoreDataType="faceletTaglib_2_0.ecore#//JavaIdentifierBase"/>
-    <genDataTypes ecoreDataType="faceletTaglib_2_0.ecore#//PathTypeBase"/>
-    <genClasses ecoreClass="faceletTaglib_2_0.ecore#//Description"/>
-    <genClasses ecoreClass="faceletTaglib_2_0.ecore#//DisplayName"/>
-    <genClasses ecoreClass="faceletTaglib_2_0.ecore#//DocumentRoot">
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EAttribute faceletTaglib_2_0.ecore#//DocumentRoot/mixed"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference faceletTaglib_2_0.ecore#//DocumentRoot/xMLNSPrefixMap"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference faceletTaglib_2_0.ecore#//DocumentRoot/xSISchemaLocation"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference faceletTaglib_2_0.ecore#//DocumentRoot/faceletTaglib"/>
-    </genClasses>
-    <genClasses ecoreClass="faceletTaglib_2_0.ecore#//FaceletTaglibCanonicalName">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute faceletTaglib_2_0.ecore#//FaceletTaglibCanonicalName/value"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute faceletTaglib_2_0.ecore#//FaceletTaglibCanonicalName/id"/>
-    </genClasses>
-    <genClasses ecoreClass="faceletTaglib_2_0.ecore#//FaceletTaglibExtension">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EAttribute faceletTaglib_2_0.ecore#//FaceletTaglibExtension/any"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute faceletTaglib_2_0.ecore#//FaceletTaglibExtension/id"/>
-    </genClasses>
-    <genClasses ecoreClass="faceletTaglib_2_0.ecore#//FaceletTaglibFunction">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference faceletTaglib_2_0.ecore#//FaceletTaglibFunction/functionName"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference faceletTaglib_2_0.ecore#//FaceletTaglibFunction/functionClass"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference faceletTaglib_2_0.ecore#//FaceletTaglibFunction/functionSignature"/>
-    </genClasses>
-    <genClasses ecoreClass="faceletTaglib_2_0.ecore#//FaceletTaglibTagAttribute">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference faceletTaglib_2_0.ecore#//FaceletTaglibTagAttribute/nameElement"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference faceletTaglib_2_0.ecore#//FaceletTaglibTagAttribute/requiredElement"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference faceletTaglib_2_0.ecore#//FaceletTaglibTagAttribute/typeElement"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference faceletTaglib_2_0.ecore#//FaceletTaglibTagAttribute/methodSignatureElement"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute faceletTaglib_2_0.ecore#//FaceletTaglibTagAttribute/id"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EAttribute faceletTaglib_2_0.ecore#//FaceletTaglibTagAttribute/name"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EAttribute faceletTaglib_2_0.ecore#//FaceletTaglibTagAttribute/required"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EAttribute faceletTaglib_2_0.ecore#//FaceletTaglibTagAttribute/type"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EAttribute faceletTaglib_2_0.ecore#//FaceletTaglibTagAttribute/methodSignature"/>
-    </genClasses>
-    <genClasses ecoreClass="faceletTaglib_2_0.ecore#//FaceletTaglibTagBehaviorExtension">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EAttribute faceletTaglib_2_0.ecore#//FaceletTaglibTagBehaviorExtension/any"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute faceletTaglib_2_0.ecore#//FaceletTaglibTagBehaviorExtension/id"/>
-    </genClasses>
-    <genClasses ecoreClass="faceletTaglib_2_0.ecore#//FaceletTaglibTagBehavior">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference faceletTaglib_2_0.ecore#//FaceletTaglibTagBehavior/behaviorId"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference faceletTaglib_2_0.ecore#//FaceletTaglibTagBehavior/handlerClass"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference faceletTaglib_2_0.ecore#//FaceletTaglibTagBehavior/behaviorExtension"/>
-    </genClasses>
-    <genClasses ecoreClass="faceletTaglib_2_0.ecore#//FaceletTaglibTagComponentExtension">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EAttribute faceletTaglib_2_0.ecore#//FaceletTaglibTagComponentExtension/any"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute faceletTaglib_2_0.ecore#//FaceletTaglibTagComponentExtension/id"/>
-    </genClasses>
-    <genClasses ecoreClass="faceletTaglib_2_0.ecore#//FaceletTaglibTagComponent">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference faceletTaglib_2_0.ecore#//FaceletTaglibTagComponent/componentType"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference faceletTaglib_2_0.ecore#//FaceletTaglibTagComponent/rendererType"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference faceletTaglib_2_0.ecore#//FaceletTaglibTagComponent/handlerClass"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference faceletTaglib_2_0.ecore#//FaceletTaglibTagComponent/componentExtension"/>
-    </genClasses>
-    <genClasses ecoreClass="faceletTaglib_2_0.ecore#//FaceletTaglibTagConverterExtension">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EAttribute faceletTaglib_2_0.ecore#//FaceletTaglibTagConverterExtension/any"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute faceletTaglib_2_0.ecore#//FaceletTaglibTagConverterExtension/id"/>
-    </genClasses>
-    <genClasses ecoreClass="faceletTaglib_2_0.ecore#//FaceletTaglibTagConverter">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference faceletTaglib_2_0.ecore#//FaceletTaglibTagConverter/converterId"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference faceletTaglib_2_0.ecore#//FaceletTaglibTagConverter/handlerClass"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference faceletTaglib_2_0.ecore#//FaceletTaglibTagConverter/converterExtension"/>
-    </genClasses>
-    <genClasses ecoreClass="faceletTaglib_2_0.ecore#//FaceletTaglibTagExtension">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EAttribute faceletTaglib_2_0.ecore#//FaceletTaglibTagExtension/any"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute faceletTaglib_2_0.ecore#//FaceletTaglibTagExtension/id"/>
-    </genClasses>
-    <genClasses ecoreClass="faceletTaglib_2_0.ecore#//FaceletTaglibTag">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference faceletTaglib_2_0.ecore#//FaceletTaglibTag/tagNameElement"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference faceletTaglib_2_0.ecore#//FaceletTaglibTag/handlerClassElement"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference faceletTaglib_2_0.ecore#//FaceletTaglibTag/behavior"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference faceletTaglib_2_0.ecore#//FaceletTaglibTag/component"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference faceletTaglib_2_0.ecore#//FaceletTaglibTag/converter"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference faceletTaglib_2_0.ecore#//FaceletTaglibTag/validator"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference faceletTaglib_2_0.ecore#//FaceletTaglibTag/source"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference faceletTaglib_2_0.ecore#//FaceletTaglibTag/attribute"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference faceletTaglib_2_0.ecore#//FaceletTaglibTag/tagExtension"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EAttribute faceletTaglib_2_0.ecore#//FaceletTaglibTag/tagName"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EAttribute faceletTaglib_2_0.ecore#//FaceletTaglibTag/handlerClass"/>
-    </genClasses>
-    <genClasses ecoreClass="faceletTaglib_2_0.ecore#//FaceletTaglibTagValidatorExtension">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EAttribute faceletTaglib_2_0.ecore#//FaceletTaglibTagValidatorExtension/any"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute faceletTaglib_2_0.ecore#//FaceletTaglibTagValidatorExtension/id"/>
-    </genClasses>
-    <genClasses ecoreClass="faceletTaglib_2_0.ecore#//FaceletTaglibTagValidator">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference faceletTaglib_2_0.ecore#//FaceletTaglibTagValidator/validatorId"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference faceletTaglib_2_0.ecore#//FaceletTaglibTagValidator/handlerClass"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference faceletTaglib_2_0.ecore#//FaceletTaglibTagValidator/validatorExtension"/>
-    </genClasses>
-    <genClasses ecoreClass="faceletTaglib_2_0.ecore#//FaceletTaglib">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference faceletTaglib_2_0.ecore#//FaceletTaglib/libraryClass"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference faceletTaglib_2_0.ecore#//FaceletTaglib/namespace"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference faceletTaglib_2_0.ecore#//FaceletTaglib/compositeLibraryName"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EAttribute faceletTaglib_2_0.ecore#//FaceletTaglib/group"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference faceletTaglib_2_0.ecore#//FaceletTaglib/tag"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference faceletTaglib_2_0.ecore#//FaceletTaglib/function"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference faceletTaglib_2_0.ecore#//FaceletTaglib/taglibExtension"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute faceletTaglib_2_0.ecore#//FaceletTaglib/id"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute faceletTaglib_2_0.ecore#//FaceletTaglib/version"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute faceletTaglib_2_0.ecore#//FaceletTaglib/namespaceUri"/>
-    </genClasses>
-    <genClasses ecoreClass="faceletTaglib_2_0.ecore#//FullyQualifiedClass"/>
-    <genClasses ecoreClass="faceletTaglib_2_0.ecore#//GenericBoolean"/>
-    <genClasses ecoreClass="faceletTaglib_2_0.ecore#//Icon">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference faceletTaglib_2_0.ecore#//Icon/smallIcon"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference faceletTaglib_2_0.ecore#//Icon/largeIcon"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute faceletTaglib_2_0.ecore#//Icon/id"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute faceletTaglib_2_0.ecore#//Icon/lang"/>
-    </genClasses>
-    <genClasses ecoreClass="faceletTaglib_2_0.ecore#//JavaIdentifier"/>
-    <genClasses ecoreClass="faceletTaglib_2_0.ecore#//Path"/>
-    <genClasses ecoreClass="faceletTaglib_2_0.ecore#//IdentifiableStringValue">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute faceletTaglib_2_0.ecore#//IdentifiableStringValue/value"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute faceletTaglib_2_0.ecore#//IdentifiableStringValue/id"/>
-    </genClasses>
-    <genClasses image="false" ecoreClass="faceletTaglib_2_0.ecore#//IdentifiableLangStringValue">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute faceletTaglib_2_0.ecore#//IdentifiableLangStringValue/lang"/>
-    </genClasses>
-    <genClasses image="false" ecoreClass="faceletTaglib_2_0.ecore#//UserVisibleTaglibObject">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference faceletTaglib_2_0.ecore#//UserVisibleTaglibObject/description"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference faceletTaglib_2_0.ecore#//UserVisibleTaglibObject/displayName"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference faceletTaglib_2_0.ecore#//UserVisibleTaglibObject/icon"/>
-      <genOperations ecoreOperation="faceletTaglib_2_0.ecore#//UserVisibleTaglibObject/getDescription">
-        <genParameters ecoreParameter="faceletTaglib_2_0.ecore#//UserVisibleTaglibObject/getDescription/language"/>
-        <genParameters ecoreParameter="faceletTaglib_2_0.ecore#//UserVisibleTaglibObject/getDescription/separationString"/>
-      </genOperations>
-      <genOperations ecoreOperation="faceletTaglib_2_0.ecore#//UserVisibleTaglibObject/getDefaultDescription">
-        <genParameters ecoreParameter="faceletTaglib_2_0.ecore#//UserVisibleTaglibObject/getDefaultDescription/separationString"/>
-      </genOperations>
-      <genOperations ecoreOperation="faceletTaglib_2_0.ecore#//UserVisibleTaglibObject/getDisplayName">
-        <genParameters ecoreParameter="faceletTaglib_2_0.ecore#//UserVisibleTaglibObject/getDisplayName/language"/>
-        <genParameters ecoreParameter="faceletTaglib_2_0.ecore#//UserVisibleTaglibObject/getDisplayName/separationString"/>
-      </genOperations>
-      <genOperations ecoreOperation="faceletTaglib_2_0.ecore#//UserVisibleTaglibObject/getDefaultDisplayName">
-        <genParameters ecoreParameter="faceletTaglib_2_0.ecore#//UserVisibleTaglibObject/getDefaultDisplayName/separationString"/>
-      </genOperations>
-    </genClasses>
-  </genPackages>
-</genmodel:GenModel>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/model/faceletTaglib.ecore b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/model/faceletTaglib.ecore
deleted file mode 100644
index 16278c9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/model/faceletTaglib.ecore
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ecore:EPackage xmi:version="2.0"
-    xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="faceletTaglib_1_0"
-    nsURI="http://org.eclipse.jst.jsf.facelet.core/faceletTaglib_1_0" nsPrefix="faceletTaglib_1_0">
-  <eClassifiers xsi:type="ecore:EClass" name="FaceletLibraryClassTagLib" eSuperTypes="#//FaceletTaglibDefn">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="libraryClass" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="FaceletXMLDefnTaglib" eSuperTypes="#//FaceletTaglibDefn">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="namespace" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="tags" upperBound="-1" eType="#//TagDefn"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="functions" upperBound="-1"
-        eType="#//FunctionDefn"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="FaceletTaglibDefn"/>
-  <eClassifiers xsi:type="ecore:EClass" name="ComponentTagDefn" eSuperTypes="#//HandlerTagDefn">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="componentType" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="rendererType" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ValidatorTagDefn" eSuperTypes="#//HandlerTagDefn">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="validatorId" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ConverterTagDefn" eSuperTypes="#//HandlerTagDefn">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="converterId" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="HandlerTagDefn" eSuperTypes="#//TagDefn">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="handlerClass" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="SourceTagDefn" eSuperTypes="#//TagDefn">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="source" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="TagDefn">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="name" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="FunctionDefn">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="functionName" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="functionClass" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="functionSignature" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-  </eClassifiers>
-</ecore:EPackage>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/model/faceletTaglib.genmodel b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/model/faceletTaglib.genmodel
deleted file mode 100644
index 21ca89d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/model/faceletTaglib.genmodel
+++ /dev/null
@@ -1,44 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<genmodel:GenModel xmi:version="2.0"
-    xmlns:xmi="http://www.omg.org/XMI" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore"
-    xmlns:genmodel="http://www.eclipse.org/emf/2002/GenModel" modelDirectory="/org.eclipse.jst.jsf.facelet.core/src"
-    modelPluginID="org.eclipse.jst.jsf.facelet.core" modelName="FaceletTaglib" nonNLSMarkers="true"
-    importerID="org.eclipse.emf.importer.ecore" complianceLevel="5.0" copyrightFields="false">
-  <foreignModel>faceletTaglib.ecore</foreignModel>
-  <genPackages prefix="FaceletTaglib_1_0" basePackage="org.eclipse.jst.jsf.facelet.core.internal.registry.taglib"
-      disposableProviderFactory="true" ecorePackage="faceletTaglib.ecore#/">
-    <genClasses ecoreClass="faceletTaglib.ecore#//FaceletLibraryClassTagLib">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute faceletTaglib.ecore#//FaceletLibraryClassTagLib/libraryClass"/>
-    </genClasses>
-    <genClasses ecoreClass="faceletTaglib.ecore#//FaceletXMLDefnTaglib">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute faceletTaglib.ecore#//FaceletXMLDefnTaglib/namespace"/>
-      <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference faceletTaglib.ecore#//FaceletXMLDefnTaglib/tags"/>
-      <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference faceletTaglib.ecore#//FaceletXMLDefnTaglib/functions"/>
-    </genClasses>
-    <genClasses ecoreClass="faceletTaglib.ecore#//FaceletTaglibDefn"/>
-    <genClasses ecoreClass="faceletTaglib.ecore#//ComponentTagDefn">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute faceletTaglib.ecore#//ComponentTagDefn/componentType"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute faceletTaglib.ecore#//ComponentTagDefn/rendererType"/>
-    </genClasses>
-    <genClasses ecoreClass="faceletTaglib.ecore#//ValidatorTagDefn">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute faceletTaglib.ecore#//ValidatorTagDefn/validatorId"/>
-    </genClasses>
-    <genClasses ecoreClass="faceletTaglib.ecore#//ConverterTagDefn">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute faceletTaglib.ecore#//ConverterTagDefn/converterId"/>
-    </genClasses>
-    <genClasses ecoreClass="faceletTaglib.ecore#//HandlerTagDefn">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute faceletTaglib.ecore#//HandlerTagDefn/handlerClass"/>
-    </genClasses>
-    <genClasses ecoreClass="faceletTaglib.ecore#//SourceTagDefn">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute faceletTaglib.ecore#//SourceTagDefn/source"/>
-    </genClasses>
-    <genClasses ecoreClass="faceletTaglib.ecore#//TagDefn">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute faceletTaglib.ecore#//TagDefn/name"/>
-    </genClasses>
-    <genClasses ecoreClass="faceletTaglib.ecore#//FunctionDefn">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute faceletTaglib.ecore#//FunctionDefn/functionName"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute faceletTaglib.ecore#//FunctionDefn/functionClass"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute faceletTaglib.ecore#//FunctionDefn/functionSignature"/>
-    </genClasses>
-  </genPackages>
-</genmodel:GenModel>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/model/faceletTaglib_2_0.ecore b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/model/faceletTaglib_2_0.ecore
deleted file mode 100644
index 54c764f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/model/faceletTaglib_2_0.ecore
+++ /dev/null
@@ -1,877 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ecore:EPackage xmi:version="2.0"
-    xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="faceletTaglib"
-    nsURI="http://java.sun.com/xml/ns/javaee/web-facelettaglibrary_2_0" nsPrefix="faceletTaglib">
-  <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-    <details key="documentation" value="&#xD;&#xA;&#xD;&#xA;      DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.&#xD;&#xA;      &#xD;&#xA;      Copyright 2003-2009 Sun Microsystems, Inc. All rights reserved.&#xD;&#xA;      &#xD;&#xA;      The contents of this file are subject to the terms of either the&#xD;&#xA;      GNU General Public License Version 2 only (&quot;GPL&quot;) or the Common&#xD;&#xA;      Development and Distribution License(&quot;CDDL&quot;) (collectively, the&#xD;&#xA;      &quot;License&quot;).  You may not use this file except in compliance with&#xD;&#xA;      the License. You can obtain a copy of the License at&#xD;&#xA;      https://glassfish.dev.java.net/public/CDDL+GPL.html or&#xD;&#xA;      glassfish/bootstrap/legal/LICENSE.txt.  See the License for the&#xD;&#xA;      specific language governing permissions and limitations under the&#xD;&#xA;      License.&#xD;&#xA;      &#xD;&#xA;      When distributing the software, include this License Header&#xD;&#xA;      Notice in each file and include the License file at&#xD;&#xA;      glassfish/bootstrap/legal/LICENSE.txt.  Sun designates this&#xD;&#xA;      particular file as subject to the &quot;Classpath&quot; exception as&#xD;&#xA;      provided by Sun in the GPL Version 2 section of the License file&#xD;&#xA;      that accompanied this code.  If applicable, add the following&#xD;&#xA;      below the License Header, with the fields enclosed by brackets []&#xD;&#xA;      replaced by your own identifying information:&#xD;&#xA;      &quot;Portions Copyrighted [year] [name of copyright owner]&quot;&#xD;&#xA;      &#xD;&#xA;      Contributor(s):&#xD;&#xA;      &#xD;&#xA;      If you wish your version of this file to be governed by only the&#xD;&#xA;      CDDL or only the GPL Version 2, indicate your decision by adding&#xD;&#xA;      &quot;[Contributor] elects to include this software in this&#xD;&#xA;      distribution under the [CDDL or GPL Version 2] license.&quot;  If you&#xD;&#xA;      don't indicate a single choice of license, a recipient has the&#xD;&#xA;      option to distribute your version of this file under either the&#xD;&#xA;      CDDL, the GPL Version 2 or to extend the choice of license to its&#xD;&#xA;      licensees as provided above.  However, if you add GPL Version 2&#xD;&#xA;      code and therefore, elected the GPL Version 2 license, then the&#xD;&#xA;      option applies only if the new code is made subject to such&#xD;&#xA;      option by the copyright holder.&#xD;&#xA;      &#xD;&#xA;    &#xD;&#xA;&#xD;&#xA;&#xD;&#xA;            &lt;![CDATA[&#xD;&#xA;&#xD;&#xA;            The XML Schema for the Tag Libraries in the JavaServer Faces&#xD;&#xA;            Standard Facelets View Declaration Language (Facelets VDL)&#xD;&#xA;            (Version 2.0).&#xD;&#xA;&#xD;&#xA;            JSF 2.0 Facelet Tag Libraries that wish to conform to this&#xD;&#xA;            schema must declare it in the following manner.&#xD;&#xA;&#xD;&#xA;            &lt;facelet-taglib xmlns=&quot;http://java.sun.com/xml/ns/javaee&quot;&#xD;&#xA;              xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;&#xD;&#xA;              xsi:schemaLocation=&quot;http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facelettaglibary_2_0.xsd&quot;&#xD;&#xA;              version=&quot;2.0&quot;>&#xD;&#xA;&#xD;&#xA;            ...&#xD;&#xA;&#xD;&#xA;            &lt;/facelet-taglib>&#xD;&#xA;&#xD;&#xA;            The instance documents may indicate the published&#xD;&#xA;            version of the schema using xsi:schemaLocation attribute&#xD;&#xA;            for javaee namespace with the following location:&#xD;&#xA;&#xD;&#xA;            http://java.sun.com/xml/ns/javaee/web-facelettaglibary_2_0.xsd&#xD;&#xA;&#xD;&#xA;            ]]>&#xD;&#xA;&#xD;&#xA;        &#xD;&#xA;&#xD;&#xA;&#xD;&#xA;    &#xD;&#xA;&#xD;&#xA;&#xD;&#xA;      DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.&#xD;&#xA;      &#xD;&#xA;      Copyright 2003-2009 Sun Microsystems, Inc. All rights reserved.&#xD;&#xA;      &#xD;&#xA;      The contents of this file are subject to the terms of either the&#xD;&#xA;      GNU General Public License Version 2 only (&quot;GPL&quot;) or the Common&#xD;&#xA;      Development and Distribution License(&quot;CDDL&quot;) (collectively, the&#xD;&#xA;      &quot;License&quot;).  You may not use this file except in compliance with&#xD;&#xA;      the License. You can obtain a copy of the License at&#xD;&#xA;      https://glassfish.dev.java.net/public/CDDL+GPL.html or&#xD;&#xA;      glassfish/bootstrap/legal/LICENSE.txt.  See the License for the&#xD;&#xA;      specific language governing permissions and limitations under the&#xD;&#xA;      License.&#xD;&#xA;      &#xD;&#xA;      When distributing the software, include this License Header&#xD;&#xA;      Notice in each file and include the License file at&#xD;&#xA;      glassfish/bootstrap/legal/LICENSE.txt.  Sun designates this&#xD;&#xA;      particular file as subject to the &quot;Classpath&quot; exception as&#xD;&#xA;      provided by Sun in the GPL Version 2 section of the License file&#xD;&#xA;      that accompanied this code.  If applicable, add the following&#xD;&#xA;      below the License Header, with the fields enclosed by brackets []&#xD;&#xA;      replaced by your own identifying information:&#xD;&#xA;      &quot;Portions Copyrighted [year] [name of copyright owner]&quot;&#xD;&#xA;      &#xD;&#xA;      Contributor(s):&#xD;&#xA;      &#xD;&#xA;      If you wish your version of this file to be governed by only the&#xD;&#xA;      CDDL or only the GPL Version 2, indicate your decision by adding&#xD;&#xA;      &quot;[Contributor] elects to include this software in this&#xD;&#xA;      distribution under the [CDDL or GPL Version 2] license.&quot;  If you&#xD;&#xA;      don't indicate a single choice of license, a recipient has the&#xD;&#xA;      option to distribute your version of this file under either the&#xD;&#xA;      CDDL, the GPL Version 2 or to extend the choice of license to its&#xD;&#xA;      licensees as provided above.  However, if you add GPL Version 2&#xD;&#xA;      code and therefore, elected the GPL Version 2 license, then the&#xD;&#xA;      option applies only if the new code is made subject to such&#xD;&#xA;      option by the copyright holder.&#xD;&#xA;      &#xD;&#xA;    &#xD;&#xA;&#xD;&#xA;&#xD;&#xA;The following definitions that appear in the common&#xD;&#xA;shareable schema(s) of J2EE deployment descriptors should be&#xD;&#xA;interpreted with respect to the context they are included:&#xD;&#xA;&#xD;&#xA;Deployment Component may indicate one of the following:&#xD;&#xA;    j2ee application;&#xD;&#xA;    application client;&#xD;&#xA;    web application;&#xD;&#xA;    enterprise bean;&#xD;&#xA;    resource adapter;&#xD;&#xA;&#xD;&#xA;Deployment File may indicate one of the following:&#xD;&#xA;    ear file;&#xD;&#xA;    war file;&#xD;&#xA;    jar file;&#xD;&#xA;    rar file;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;   &lt;div xmlns=&quot;http://www.w3.org/1999/xhtml&quot;>&#xD;&#xA;    &lt;h1>About the XML namespace&lt;/h1>&#xD;&#xA;&#xD;&#xA;    &lt;div class=&quot;bodytext&quot;>&#xD;&#xA;     &lt;p>&#xD;&#xA;      This schema document describes the XML namespace, in a form&#xD;&#xA;      suitable for import by other schema documents.&#xD;&#xA;     &lt;/p>&#xD;&#xA;     &lt;p>&#xD;&#xA;      See &lt;a href=&quot;http://www.w3.org/XML/1998/namespace.html&quot;>&#xD;&#xA;      http://www.w3.org/XML/1998/namespace.html&lt;/a> and&#xD;&#xA;      &lt;a href=&quot;http://www.w3.org/TR/REC-xml&quot;>&#xD;&#xA;      http://www.w3.org/TR/REC-xml&lt;/a> for information &#xD;&#xA;      about this namespace.&#xD;&#xA;     &lt;/p>&#xD;&#xA;     &lt;p>&#xD;&#xA;      Note that local names in this namespace are intended to be&#xD;&#xA;      defined only by the World Wide Web Consortium or its subgroups.&#xD;&#xA;      The names currently defined in this namespace are listed below.&#xD;&#xA;      They should not be used with conflicting semantics by any Working&#xD;&#xA;      Group, specification, or document instance.&#xD;&#xA;     &lt;/p>&#xD;&#xA;     &lt;p>   &#xD;&#xA;      See further below in this document for more information about &lt;a href=&quot;#usage&quot;>how to refer to this schema document from your own&#xD;&#xA;      XSD schema documents&lt;/a> and about &lt;a href=&quot;#nsversioning&quot;>the&#xD;&#xA;      namespace-versioning policy governing this schema document&lt;/a>.&#xD;&#xA;     &lt;/p>&#xD;&#xA;    &lt;/div>&#xD;&#xA;   &lt;/div>&#xD;&#xA;  &#xD;&#xA;&#xD;&#xA;   &lt;div xmlns=&quot;http://www.w3.org/1999/xhtml&quot;>&#xD;&#xA;   &#xD;&#xA;    &lt;h3>Father (in any context at all)&lt;/h3> &#xD;&#xA;&#xD;&#xA;    &lt;div class=&quot;bodytext&quot;>&#xD;&#xA;     &lt;p>&#xD;&#xA;      denotes Jon Bosak, the chair of &#xD;&#xA;      the original XML Working Group.  This name is reserved by &#xD;&#xA;      the following decision of the W3C XML Plenary and &#xD;&#xA;      XML Coordination groups:&#xD;&#xA;     &lt;/p>&#xD;&#xA;     &lt;blockquote>&#xD;&#xA;       &lt;p>&#xD;&#xA;&#x9;In appreciation for his vision, leadership and&#xD;&#xA;&#x9;dedication the W3C XML Plenary on this 10th day of&#xD;&#xA;&#x9;February, 2000, reserves for Jon Bosak in perpetuity&#xD;&#xA;&#x9;the XML name &quot;xml:Father&quot;.&#xD;&#xA;       &lt;/p>&#xD;&#xA;     &lt;/blockquote>&#xD;&#xA;    &lt;/div>&#xD;&#xA;   &lt;/div>&#xD;&#xA;  &#xD;&#xA;&#xD;&#xA;   &lt;div id=&quot;usage&quot; xml:id=&quot;usage&quot; xmlns=&quot;http://www.w3.org/1999/xhtml&quot;>&#xD;&#xA;    &lt;h2>&#xD;&#xA;      &lt;a name=&quot;usage&quot;>About this schema document&lt;/a>&#xD;&#xA;    &lt;/h2>&#xD;&#xA;&#xD;&#xA;    &lt;div class=&quot;bodytext&quot;>&#xD;&#xA;     &lt;p>&#xD;&#xA;      This schema defines attributes and an attribute group suitable&#xD;&#xA;      for use by schemas wishing to allow &lt;code>xml:base&lt;/code>,&#xD;&#xA;      &lt;code>xml:lang&lt;/code>, &lt;code>xml:space&lt;/code> or&#xD;&#xA;      &lt;code>xml:id&lt;/code> attributes on elements they define.&#xD;&#xA;     &lt;/p>&#xD;&#xA;     &lt;p>&#xD;&#xA;      To enable this, such a schema must import this schema for&#xD;&#xA;      the XML namespace, e.g. as follows:&#xD;&#xA;     &lt;/p>&#xD;&#xA;     &lt;pre>&#xD;&#xA;          &amp;lt;schema . . .&amp;gt;&#xD;&#xA;           . . .&#xD;&#xA;           &amp;lt;import namespace=&quot;http://www.w3.org/XML/1998/namespace&quot;&#xD;&#xA;                      schemaLocation=&quot;http://www.w3.org/2001/xml.xsd&quot;/&amp;gt;&#xD;&#xA;     &lt;/pre>&#xD;&#xA;     &lt;p>&#xD;&#xA;      or&#xD;&#xA;     &lt;/p>&#xD;&#xA;     &lt;pre>&#xD;&#xA;           &amp;lt;import namespace=&quot;http://www.w3.org/XML/1998/namespace&quot;&#xD;&#xA;                      schemaLocation=&quot;http://www.w3.org/2009/01/xml.xsd&quot;/&amp;gt;&#xD;&#xA;     &lt;/pre>&#xD;&#xA;     &lt;p>&#xD;&#xA;      Subsequently, qualified reference to any of the attributes or the&#xD;&#xA;      group defined below will have the desired effect, e.g.&#xD;&#xA;     &lt;/p>&#xD;&#xA;     &lt;pre>&#xD;&#xA;          &amp;lt;type . . .&amp;gt;&#xD;&#xA;           . . .&#xD;&#xA;           &amp;lt;attributeGroup ref=&quot;xml:specialAttrs&quot;/&amp;gt;&#xD;&#xA;     &lt;/pre>&#xD;&#xA;     &lt;p>&#xD;&#xA;      will define a type which will schema-validate an instance element&#xD;&#xA;      with any of those attributes.&#xD;&#xA;     &lt;/p>&#xD;&#xA;    &lt;/div>&#xD;&#xA;   &lt;/div>&#xD;&#xA;  &#xD;&#xA;&#xD;&#xA;   &lt;div id=&quot;nsversioning&quot; xml:id=&quot;nsversioning&quot; xmlns=&quot;http://www.w3.org/1999/xhtml&quot;>&#xD;&#xA;    &lt;h2>&#xD;&#xA;      &lt;a name=&quot;nsversioning&quot;>Versioning policy for this schema document&lt;/a>&#xD;&#xA;    &lt;/h2>&#xD;&#xA;    &lt;div class=&quot;bodytext&quot;>&#xD;&#xA;     &lt;p>&#xD;&#xA;      In keeping with the XML Schema WG's standard versioning&#xD;&#xA;      policy, this schema document will persist at&#xD;&#xA;      &lt;a href=&quot;http://www.w3.org/2009/01/xml.xsd&quot;>&#xD;&#xA;       http://www.w3.org/2009/01/xml.xsd&lt;/a>.&#xD;&#xA;     &lt;/p>&#xD;&#xA;     &lt;p>&#xD;&#xA;      At the date of issue it can also be found at&#xD;&#xA;      &lt;a href=&quot;http://www.w3.org/2001/xml.xsd&quot;>&#xD;&#xA;       http://www.w3.org/2001/xml.xsd&lt;/a>.&#xD;&#xA;     &lt;/p>&#xD;&#xA;     &lt;p>&#xD;&#xA;      The schema document at that URI may however change in the future,&#xD;&#xA;      in order to remain compatible with the latest version of XML&#xD;&#xA;      Schema itself, or with the XML namespace itself.  In other words,&#xD;&#xA;      if the XML Schema or XML namespaces change, the version of this&#xD;&#xA;      document at &lt;a href=&quot;http://www.w3.org/2001/xml.xsd&quot;>&#xD;&#xA;       http://www.w3.org/2001/xml.xsd &#xD;&#xA;      &lt;/a> &#xD;&#xA;      will change accordingly; the version at &#xD;&#xA;      &lt;a href=&quot;http://www.w3.org/2009/01/xml.xsd&quot;>&#xD;&#xA;       http://www.w3.org/2009/01/xml.xsd &#xD;&#xA;      &lt;/a> &#xD;&#xA;      will not change.&#xD;&#xA;     &lt;/p>&#xD;&#xA;     &lt;p>&#xD;&#xA;      Previous dated (and unchanging) versions of this schema &#xD;&#xA;      document are at:&#xD;&#xA;     &lt;/p>&#xD;&#xA;     &lt;ul>&#xD;&#xA;      &lt;li>&#xD;&#xA;          &lt;a href=&quot;http://www.w3.org/2009/01/xml.xsd&quot;>&#xD;&#xA;&#x9;http://www.w3.org/2009/01/xml.xsd&lt;/a>&#xD;&#xA;        &lt;/li>&#xD;&#xA;      &lt;li>&#xD;&#xA;          &lt;a href=&quot;http://www.w3.org/2007/08/xml.xsd&quot;>&#xD;&#xA;&#x9;http://www.w3.org/2007/08/xml.xsd&lt;/a>&#xD;&#xA;        &lt;/li>&#xD;&#xA;      &lt;li>&#xD;&#xA;          &lt;a href=&quot;http://www.w3.org/2004/10/xml.xsd&quot;>&#xD;&#xA;&#x9;http://www.w3.org/2004/10/xml.xsd&lt;/a>&#xD;&#xA;        &lt;/li>&#xD;&#xA;      &lt;li>&#xD;&#xA;          &lt;a href=&quot;http://www.w3.org/2001/03/xml.xsd&quot;>&#xD;&#xA;&#x9;http://www.w3.org/2001/03/xml.xsd&lt;/a>&#xD;&#xA;        &lt;/li>&#xD;&#xA;     &lt;/ul>&#xD;&#xA;    &lt;/div>&#xD;&#xA;   &lt;/div>&#xD;&#xA;  "/>
-  </eAnnotations>
-  <eClassifiers xsi:type="ecore:EClass" name="Description" eSuperTypes="#//IdentifiableLangStringValue">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="&#xD;&#xA;&#xD;&#xA;    The description type is used by a description element to&#xD;&#xA;    provide text describing the parent element.  The elements&#xD;&#xA;    that use this type should include any information that the&#xD;&#xA;    Deployment Component's Deployment File file producer wants&#xD;&#xA;    to provide to the consumer of the Deployment Component's&#xD;&#xA;    Deployment File (i.e., to the Deployer). Typically, the&#xD;&#xA;    tools used by such a Deployment File consumer will display&#xD;&#xA;    the description when processing the parent element that&#xD;&#xA;    contains the description.&#xD;&#xA;&#xD;&#xA;    The lang attribute defines the language that the&#xD;&#xA;    description is provided in. The default value is &quot;en&quot; (English).&#xD;&#xA;&#xD;&#xA;      "/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="descriptionType"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="DisplayName" eSuperTypes="#//IdentifiableLangStringValue">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="&#xD;&#xA;    &lt;![CDATA[&#xD;&#xA;&#xD;&#xA;      The display-name type contains a short name that is intended&#xD;&#xA;      to be displayed by tools. It is used by display-name&#xD;&#xA;      elements.  The display name need not be unique.&#xD;&#xA;&#xD;&#xA;      Example:&#xD;&#xA;&#xD;&#xA;      ...&#xD;&#xA;         &lt;display-name xml:lang=&quot;en&quot;>&#xD;&#xA;           Employee Self Service&#xD;&#xA;         &lt;/display-name>&#xD;&#xA;&#xD;&#xA;      The value of the xml:lang attribute is &quot;en&quot; (English) by default.&#xD;&#xA;&#xD;&#xA;      ]]>&#xD;&#xA;      "/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="display-nameType"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="DocumentRoot">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value=""/>
-      <details key="kind" value="mixed"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="mixed" unique="false" upperBound="-1"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EFeatureMapEntry">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="elementWildcard"/>
-        <details key="name" value=":mixed"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="xMLNSPrefixMap" upperBound="-1"
-        eType="ecore:EClass http://www.eclipse.org/emf/2002/Ecore#//EStringToStringMapEntry"
-        transient="true" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="xmlns:prefix"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="xSISchemaLocation" upperBound="-1"
-        eType="ecore:EClass http://www.eclipse.org/emf/2002/Ecore#//EStringToStringMapEntry"
-        transient="true" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="xsi:schemaLocation"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="faceletTaglib" upperBound="-2"
-        eType="#//FaceletTaglib" volatile="true" transient="true" derived="true" containment="true"
-        resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="facelet-taglib"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="FaceletTaglibCanonicalName">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="&#xD;&#xA;&#xD;&#xA;                Defines the canonical name of a tag or attribute being&#xD;&#xA;                defined.&#xD;&#xA;&#xD;&#xA;                The name must conform to the lexical rules for an NCName&#xD;&#xA;&#xD;&#xA;            "/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="facelet-taglib-canonical-nameType"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="value" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//NCName">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="FaceletTaglibExtension">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="&#xD;&#xA;                Extension element for facelet-taglib. It may contain&#xD;&#xA;                implementation specific content.&#xD;&#xA;            "/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="facelet-taglib-extensionType"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="any" unique="false" upperBound="-1"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EFeatureMapEntry">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="elementWildcard"/>
-        <details key="wildcards" value="##any"/>
-        <details key="name" value=":0"/>
-        <details key="processing" value="lax"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="FaceletTaglibFunction" eSuperTypes="#//UserVisibleTaglibObject">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="&#xD;&#xA;                If the tag library XML file contains individual function&#xD;&#xA;                declarations rather than pointing to a library-class or a&#xD;&#xA;                declaring a composite-library name, the individual functions are&#xD;&#xA;                enclosed in function elements.&#xD;&#xA;            "/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="facelet-taglib-functionType"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="functionName" lowerBound="1"
-        eType="#//IdentifiableStringValue" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="function-name"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="functionClass" lowerBound="1"
-        eType="#//FullyQualifiedClass" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="function-class"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="functionSignature" lowerBound="1"
-        eType="#//IdentifiableStringValue" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="function-signature"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="FaceletTaglibTagAttribute" eSuperTypes="#//UserVisibleTaglibObject">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="&#xD;&#xA;&#xD;&#xA;                The attribute element defines an attribute for the nesting&#xD;&#xA;                tag. The attribute element may have several subelements&#xD;&#xA;                defining:&#xD;&#xA;&#xD;&#xA;                description a description of the attribute&#xD;&#xA;&#xD;&#xA;                name the name of the attribute&#xD;&#xA;&#xD;&#xA;                required whether the attribute is required or&#xD;&#xA;                optional&#xD;&#xA;&#xD;&#xA;                type the type of the attribute&#xD;&#xA;&#xD;&#xA;            "/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="facelet-taglib-tag-attributeType"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="nameElement" lowerBound="1"
-        eType="#//FaceletTaglibCanonicalName" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="name"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="requiredElement" eType="#//GenericBoolean"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="&#xD;&#xA;&#xD;&#xA;                        Defines if the nesting attribute is required or&#xD;&#xA;                        optional.&#xD;&#xA;&#xD;&#xA;                        If not present then the default is &quot;false&quot;, i.e&#xD;&#xA;                        the attribute is optional.&#xD;&#xA;&#xD;&#xA;                    "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="required"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="typeElement" eType="#//FullyQualifiedClass"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="&#xD;&#xA;&#xD;&#xA;                            Defines the Java type of the attributes&#xD;&#xA;                            value. If this element is omitted, the&#xD;&#xA;                            expected type is assumed to be&#xD;&#xA;                            &quot;java.lang.Object&quot;.&#xD;&#xA;&#xD;&#xA;                        "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="type"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="methodSignatureElement"
-        eType="#//IdentifiableStringValue" containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="&#xD;&#xA;&#xD;&#xA;                            Defines the method signature for a MethodExpression-&#xD;&#xA;                            enabled attribute.&#xD;&#xA;&#xD;&#xA;                        "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="method-signature"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="name" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"
-        volatile="true" transient="true"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="required" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"
-        volatile="true" transient="true"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="type" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"
-        volatile="true" transient="true"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="methodSignature" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"
-        volatile="true" transient="true"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="FaceletTaglibTagBehaviorExtension">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="&#xD;&#xA;                Extension element for behavior. It may contain&#xD;&#xA;                implementation specific content.&#xD;&#xA;            "/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="facelet-taglib-tag-behavior-extensionType"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="any" unique="false" upperBound="-1"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EFeatureMapEntry">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="elementWildcard"/>
-        <details key="wildcards" value="##any"/>
-        <details key="name" value=":0"/>
-        <details key="processing" value="lax"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="FaceletTaglibTagBehavior" eSuperTypes="#//UserVisibleTaglibObject">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="&#xD;&#xA;                Within a tag element, the behavior element encapsulates&#xD;&#xA;                information specific to a JSF Behavior.&#xD;&#xA;            "/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="facelet-taglib-tag-behaviorType"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="behaviorId" lowerBound="1"
-        eType="#//IdentifiableStringValue" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="behavior-id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="handlerClass" eType="#//FullyQualifiedClass"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="handler-class"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="behaviorExtension" upperBound="-1"
-        eType="#//FaceletTaglibTagBehaviorExtension" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="behavior-extension"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="FaceletTaglibTagComponentExtension">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="&#xD;&#xA;                Extension element for component It may contain&#xD;&#xA;                implementation specific content.&#xD;&#xA;            "/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="facelet-taglib-tag-component-extensionType"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="any" unique="false" upperBound="-1"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EFeatureMapEntry">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="elementWildcard"/>
-        <details key="wildcards" value="##any"/>
-        <details key="name" value=":0"/>
-        <details key="processing" value="lax"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="FaceletTaglibTagComponent" eSuperTypes="#//UserVisibleTaglibObject">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="&#xD;&#xA;                Within a tag element, the component element encapsulates&#xD;&#xA;                information specific to a JSF UIComponent.&#xD;&#xA;            "/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="facelet-taglib-tag-componentType"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="componentType" lowerBound="1"
-        eType="#//IdentifiableStringValue" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="component-type"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="rendererType" eType="#//IdentifiableStringValue"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="renderer-type"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="handlerClass" eType="#//FullyQualifiedClass"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="handler-class"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="componentExtension" upperBound="-1"
-        eType="#//FaceletTaglibTagComponentExtension" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="component-extension"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="FaceletTaglibTagConverterExtension">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="&#xD;&#xA;                Extension element for converter It may contain&#xD;&#xA;                implementation specific content.&#xD;&#xA;            "/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="facelet-taglib-tag-converter-extensionType"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="any" unique="false" upperBound="-1"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EFeatureMapEntry">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="elementWildcard"/>
-        <details key="wildcards" value="##any"/>
-        <details key="name" value=":0"/>
-        <details key="processing" value="lax"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="FaceletTaglibTagConverter" eSuperTypes="#//UserVisibleTaglibObject">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="&#xD;&#xA;                Within a tag element, the converter element encapsulates&#xD;&#xA;                information specific to a JSF Converter.&#xD;&#xA;            "/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="facelet-taglib-tag-converterType"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="converterId" lowerBound="1"
-        eType="#//IdentifiableStringValue" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="converter-id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="handlerClass" eType="#//FullyQualifiedClass"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="handler-class"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="converterExtension" upperBound="-1"
-        eType="#//FaceletTaglibTagConverterExtension" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="converter-extension"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="FaceletTaglibTagExtension">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="&#xD;&#xA;                Extension element for tag It may contain&#xD;&#xA;                implementation specific content.&#xD;&#xA;            "/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="facelet-taglib-tag-extensionType"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="any" unique="false" upperBound="-1"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EFeatureMapEntry">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="elementWildcard"/>
-        <details key="wildcards" value="##any"/>
-        <details key="name" value=":0"/>
-        <details key="processing" value="lax"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="FaceletTaglibTag" eSuperTypes="#//UserVisibleTaglibObject">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="&#xD;&#xA;                If the tag library XML file contains individual tag&#xD;&#xA;                declarations rather than pointing to a library-class or a&#xD;&#xA;                declaring a composite-library name, the individual tags are&#xD;&#xA;                enclosed in tag elements.&#xD;&#xA;            "/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="facelet-taglib-tagType"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="tagNameElement" lowerBound="1"
-        eType="#//FaceletTaglibCanonicalName" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="tag-name"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="handlerClassElement" eType="#//FullyQualifiedClass"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="handler-class"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="behavior" eType="#//FaceletTaglibTagBehavior"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="behavior"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="component" eType="#//FaceletTaglibTagComponent"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="component"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="converter" eType="#//FaceletTaglibTagConverter"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="converter"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="validator" eType="#//FaceletTaglibTagValidator"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="validator"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="source" eType="#//IdentifiableStringValue"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="source"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="attribute" upperBound="-1"
-        eType="#//FaceletTaglibTagAttribute" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="attribute"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="tagExtension" upperBound="-1"
-        eType="#//FaceletTaglibTagExtension" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="tag-extension"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="tagName" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"
-        volatile="true" transient="true"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="handlerClass" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"
-        volatile="true" transient="true"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="FaceletTaglibTagValidatorExtension">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="&#xD;&#xA;                Extension element for validator It may contain&#xD;&#xA;                implementation specific content.&#xD;&#xA;            "/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="facelet-taglib-tag-validator-extensionType"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="any" unique="false" upperBound="-1"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EFeatureMapEntry">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="elementWildcard"/>
-        <details key="wildcards" value="##any"/>
-        <details key="name" value=":0"/>
-        <details key="processing" value="lax"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="FaceletTaglibTagValidator" eSuperTypes="#//UserVisibleTaglibObject">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="&#xD;&#xA;                Within a tag element, the validator element encapsulates&#xD;&#xA;                information specific to a JSF Validator.&#xD;&#xA;            "/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value="facelet-taglib-tag-validatorType"/>
-        <details key="kind" value="elementOnly"/>
-      </eAnnotations>
-      <details key="name" value="facelet-taglib-tag-validatorType"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="validatorId" lowerBound="1"
-        eType="#//IdentifiableStringValue" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="validator-id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="handlerClass" eType="#//FullyQualifiedClass"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="handler-class"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="validatorExtension" upperBound="-1"
-        eType="#//FaceletTaglibTagValidatorExtension" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="validator-extension"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="FaceletTaglib" eSuperTypes="#//UserVisibleTaglibObject">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="&#xD;&#xA;                The top level XML element in a facelet tag library XML file.&#xD;&#xA;            "/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="facelet-taglibType"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="libraryClass" eType="#//FullyQualifiedClass"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="library-class"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="namespace" eType="#//IdentifiableStringValue"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="namespace"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="compositeLibraryName" eType="#//FullyQualifiedClass"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="composite-library-name"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="group" unique="false" upperBound="-1"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EFeatureMapEntry">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="group"/>
-        <details key="name" value="group:6"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="tag" upperBound="-1" eType="#//FaceletTaglibTag"
-        volatile="true" transient="true" derived="true" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="tag"/>
-        <details key="namespace" value="##targetNamespace"/>
-        <details key="group" value="#group:6"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="function" upperBound="-1"
-        eType="#//FaceletTaglibFunction" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="function"/>
-        <details key="namespace" value="##targetNamespace"/>
-        <details key="group" value="#group:6"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="taglibExtension" upperBound="-1"
-        eType="#//FaceletTaglibExtension" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="taglib-extension"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="version" lowerBound="1"
-        eType="#//FaceletTaglibVersion" unsettable="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="version"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="namespaceUri" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Token"
-        volatile="true" transient="true"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EEnum" name="FaceletTaglibVersion">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="&#xD;&#xA;                This type contains the recognized versions of&#xD;&#xA;                facelet-taglib supported.&#xD;&#xA;            "/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="facelet-taglib-versionType"/>
-    </eAnnotations>
-    <eLiterals name="_20" literal="2.0"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="FaceletTaglibVersionTypeObject" instanceClassName="org.eclipse.emf.common.util.Enumerator">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="facelet-taglib-versionType:Object"/>
-      <details key="baseType" value="facelet-taglib-versionType"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="FullyQualifiedClass" eSuperTypes="#//IdentifiableStringValue">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="&#xD;&#xA;&#xD;&#xA;    The elements that use this type designate the name of a&#xD;&#xA;    Java class or interface.  The name is in the form of a&#xD;&#xA;    &quot;binary name&quot;, as defined in the JLS.  This is the form&#xD;&#xA;    of name used in Class.forName().  Tools that need the&#xD;&#xA;    canonical name (the name used in source code) will need&#xD;&#xA;    to convert this binary name to the canonical name.&#xD;&#xA;&#xD;&#xA;      "/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="fully-qualified-classType"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="FullyQualifiedClassBase" instanceClassName="java.lang.String">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="fully-qualified-classType_._base"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#token"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="GenericBoolean" eSuperTypes="#//IdentifiableStringValue">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="&#xD;&#xA;&#xD;&#xA;    This type defines four different values which can designate&#xD;&#xA;    boolean values. This includes values yes and no which are&#xD;&#xA;    not designated by xsd:boolean&#xD;&#xA;&#xD;&#xA;      "/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="generic-booleanType"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EEnum" name="GenericBooleanBase">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="generic-booleanType_._base"/>
-    </eAnnotations>
-    <eLiterals name="true"/>
-    <eLiterals name="false" value="1"/>
-    <eLiterals name="yes" value="2"/>
-    <eLiterals name="no" value="3"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Icon">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="&#xD;&#xA;&#xD;&#xA;    The icon type contains small-icon and large-icon elements&#xD;&#xA;    that specify the file names for small and large GIF, JPEG,&#xD;&#xA;    or PNG icon images used to represent the parent element in a&#xD;&#xA;    GUI tool.&#xD;&#xA;&#xD;&#xA;    The xml:lang attribute defines the language that the&#xD;&#xA;    icon file names are provided in. Its value is &quot;en&quot; (English)&#xD;&#xA;    by default.&#xD;&#xA;&#xD;&#xA;      "/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="iconType"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="smallIcon" eType="#//Path"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="&#xD;&#xA;        &lt;![CDATA[&#xD;&#xA;&#xD;&#xA;          The small-icon element contains the name of a file&#xD;&#xA;          containing a small (16 x 16) icon image. The file&#xD;&#xA;          name is a relative path within the Deployment&#xD;&#xA;          Component's Deployment File.&#xD;&#xA;&#xD;&#xA;          The image may be in the GIF, JPEG, or PNG format.&#xD;&#xA;          The icon can be used by tools.&#xD;&#xA;&#xD;&#xA;          Example:&#xD;&#xA;&#xD;&#xA;          &lt;small-icon>employee-service-icon16x16.jpg&lt;/small-icon>&#xD;&#xA;&#xD;&#xA;          ]]>&#xD;&#xA;      "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="small-icon"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="largeIcon" eType="#//Path"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="&#xD;&#xA;        &lt;![CDATA[&#xD;&#xA;&#xD;&#xA;          The large-icon element contains the name of a file&#xD;&#xA;          containing a large&#xD;&#xA;          (32 x 32) icon image. The file name is a relative&#xD;&#xA;          path within the Deployment Component's Deployment&#xD;&#xA;          File.&#xD;&#xA;&#xD;&#xA;          The image may be in the GIF, JPEG, or PNG format.&#xD;&#xA;          The icon can be used by tools.&#xD;&#xA;&#xD;&#xA;          Example:&#xD;&#xA;&#xD;&#xA;          &lt;large-icon>employee-service-icon32x32.jpg&lt;/large-icon>&#xD;&#xA;&#xD;&#xA;          ]]>&#xD;&#xA;      "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="large-icon"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="lang" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="&#xD;&#xA;    &lt;div xmlns=&quot;http://www.w3.org/1999/xhtml&quot;>&#xD;&#xA;     &#xD;&#xA;      &lt;h3>lang (as an attribute name)&lt;/h3>&#xD;&#xA;      &lt;p>&#xD;&#xA;       denotes an attribute whose value&#xD;&#xA;       is a language code for the natural language of the content of&#xD;&#xA;       any element; its value is inherited.  This name is reserved&#xD;&#xA;       by virtue of its definition in the XML specification.&lt;/p>&#xD;&#xA;     &#xD;&#xA;    &lt;/div>&#xD;&#xA;    &lt;div xmlns=&quot;http://www.w3.org/1999/xhtml&quot;>&#xD;&#xA;     &lt;h4>Notes&lt;/h4>&#xD;&#xA;     &lt;p>&#xD;&#xA;      Attempting to install the relevant ISO 2- and 3-letter&#xD;&#xA;      codes as the enumerated possible values is probably never&#xD;&#xA;      going to be a realistic possibility.  &#xD;&#xA;     &lt;/p>&#xD;&#xA;     &lt;p>&#xD;&#xA;      See BCP 47 at &lt;a href=&quot;http://www.rfc-editor.org/rfc/bcp/bcp47.txt&quot;>&#xD;&#xA;       http://www.rfc-editor.org/rfc/bcp/bcp47.txt&lt;/a>&#xD;&#xA;      and the IANA language subtag registry at&#xD;&#xA;      &lt;a href=&quot;http://www.iana.org/assignments/language-subtag-registry&quot;>&#xD;&#xA;       http://www.iana.org/assignments/language-subtag-registry&lt;/a>&#xD;&#xA;      for further information.&#xD;&#xA;     &lt;/p>&#xD;&#xA;     &lt;p>&#xD;&#xA;      The union allows for the 'un-declaration' of xml:lang with&#xD;&#xA;      the empty string.&#xD;&#xA;     &lt;/p>&#xD;&#xA;    &lt;/div>&#xD;&#xA;   "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="lang"/>
-        <details key="namespace" value="http://www.w3.org/XML/1998/namespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="JavaIdentifier" eSuperTypes="#//IdentifiableStringValue">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="&#xD;&#xA;&#xD;&#xA;    The java-identifierType defines a Java identifier.&#xD;&#xA;    The users of this type should further verify that&#xD;&#xA;    the content does not contain Java reserved keywords.&#xD;&#xA;&#xD;&#xA;      "/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="java-identifierType"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="JavaIdentifierBase" instanceClassName="java.lang.String">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="java-identifierType_._base"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#token"/>
-      <details key="pattern" value="($|_|\p{L})(\p{L}|\p{Nd}|_|$)*"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Path" eSuperTypes="#//IdentifiableStringValue">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="&#xD;&#xA;&#xD;&#xA;    The elements that use this type designate either a relative&#xD;&#xA;    path or an absolute path starting with a &quot;/&quot;.&#xD;&#xA;&#xD;&#xA;    In elements that specify a pathname to a file within the&#xD;&#xA;    same Deployment File, relative filenames (i.e., those not&#xD;&#xA;    starting with &quot;/&quot;) are considered relative to the root of&#xD;&#xA;    the Deployment File's namespace.  Absolute filenames (i.e.,&#xD;&#xA;    those starting with &quot;/&quot;) also specify names in the root of&#xD;&#xA;    the Deployment File's namespace.  In general, relative names&#xD;&#xA;    are preferred.  The exception is .war files where absolute&#xD;&#xA;    names are preferred for consistency with the Servlet API.&#xD;&#xA;&#xD;&#xA;      "/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="pathType"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="PathTypeBase" instanceClassName="java.lang.String">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="pathType_._base"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#token"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="IdentifiableStringValue">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="&#xD;&#xA;&#xD;&#xA;    This is a special string datatype that is defined by Java EE as&#xD;&#xA;    a base type for defining collapsed strings. When schemas&#xD;&#xA;    require trailing/leading space elimination as well as&#xD;&#xA;    collapsing the existing whitespace, this base type may be&#xD;&#xA;    used.&#xD;&#xA;&#xD;&#xA;      "/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="string"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="value" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Token">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="IdentifiableLangStringValue" abstract="true"
-      eSuperTypes="#//IdentifiableStringValue">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="lang" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="&#xD;&#xA;    &lt;div xmlns=&quot;http://www.w3.org/1999/xhtml&quot;>&#xD;&#xA;     &#xD;&#xA;      &lt;h3>lang (as an attribute name)&lt;/h3>&#xD;&#xA;      &lt;p>&#xD;&#xA;       denotes an attribute whose value&#xD;&#xA;       is a language code for the natural language of the content of&#xD;&#xA;       any element; its value is inherited.  This name is reserved&#xD;&#xA;       by virtue of its definition in the XML specification.&lt;/p>&#xD;&#xA;     &#xD;&#xA;    &lt;/div>&#xD;&#xA;    &lt;div xmlns=&quot;http://www.w3.org/1999/xhtml&quot;>&#xD;&#xA;     &lt;h4>Notes&lt;/h4>&#xD;&#xA;     &lt;p>&#xD;&#xA;      Attempting to install the relevant ISO 2- and 3-letter&#xD;&#xA;      codes as the enumerated possible values is probably never&#xD;&#xA;      going to be a realistic possibility.  &#xD;&#xA;     &lt;/p>&#xD;&#xA;     &lt;p>&#xD;&#xA;      See BCP 47 at &lt;a href=&quot;http://www.rfc-editor.org/rfc/bcp/bcp47.txt&quot;>&#xD;&#xA;       http://www.rfc-editor.org/rfc/bcp/bcp47.txt&lt;/a>&#xD;&#xA;      and the IANA language subtag registry at&#xD;&#xA;      &lt;a href=&quot;http://www.iana.org/assignments/language-subtag-registry&quot;>&#xD;&#xA;       http://www.iana.org/assignments/language-subtag-registry&lt;/a>&#xD;&#xA;      for further information.&#xD;&#xA;     &lt;/p>&#xD;&#xA;     &lt;p>&#xD;&#xA;      The union allows for the 'un-declaration' of xml:lang with&#xD;&#xA;      the empty string.&#xD;&#xA;     &lt;/p>&#xD;&#xA;    &lt;/div>&#xD;&#xA;   "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="lang"/>
-        <details key="namespace" value="http://www.w3.org/XML/1998/namespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="UserVisibleTaglibObject" abstract="true">
-    <eOperations name="getDescription" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Iterates through all descriptions and returns a concatenated string of&#xD;&#xA;all descriptions for the specified language.&#xD;&#xA;Passing the empty string indicates descriptions with no locale.&#xD;&#xA;Passing null is invalid and will cause an NPE to be thrown."/>
-      </eAnnotations>
-      <eParameters name="language" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-      <eParameters name="separationString" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString">
-        <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-          <details key="documentation" value="A string that will be used to separate each individual description after it&#xD;&#xA;has been trimmed but before it is concatenated to the result."/>
-        </eAnnotations>
-      </eParameters>
-    </eOperations>
-    <eOperations name="getDefaultDescription" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Equivalent to getDescription(&quot;&quot;)."/>
-      </eAnnotations>
-      <eParameters name="separationString" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString">
-        <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-          <details key="documentation" value="A string that will be used to separate each individual display-name after it&#xD;&#xA;has been trimmed but before it is concatenated to the result."/>
-        </eAnnotations>
-      </eParameters>
-    </eOperations>
-    <eOperations name="getDisplayName" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Iterates through all display names and returns a concatenated string of&#xD;&#xA;all display names for the specified language.  Passing null indicates the use of the current locale.&#xD;&#xA;Passing the empty string indicates descriptions with no locale."/>
-      </eAnnotations>
-      <eParameters name="language" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-      <eParameters name="separationString" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString">
-        <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-          <details key="documentation" value="A string that will be used to separate each individual display-name after it&#xD;&#xA;has been trimmed but before it is concatenated to the result."/>
-        </eAnnotations>
-      </eParameters>
-    </eOperations>
-    <eOperations name="getDefaultDisplayName" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Equivalent to getDisplayName(&quot;&quot;)."/>
-      </eAnnotations>
-      <eParameters name="separationString" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString">
-        <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-          <details key="documentation" value="A string that will be used to separate each individual display-name after it&#xD;&#xA;has been trimmed but before it is concatenated to the result."/>
-        </eAnnotations>
-      </eParameters>
-    </eOperations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="description" upperBound="-1"
-        eType="#//Description" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="description"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="displayName" upperBound="-1"
-        eType="#//DisplayName" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="display-name"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="icon" upperBound="-1" eType="#//Icon"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="icon"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-</ecore:EPackage>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/model/namespace.ecore b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/model/namespace.ecore
deleted file mode 100644
index 4a45d26..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/model/namespace.ecore
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ecore:EPackage xmi:version="2.0"
-    xmlns:xmi="http://www.omg.org/XMI" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="namespace"
-    nsURI="http://www.w3.org/XML/1998/namespace" nsPrefix="namespace"/>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/model/templates/Header.javajetinc b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/model/templates/Header.javajetinc
deleted file mode 100644
index f7c8f2b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/model/templates/Header.javajetinc
+++ /dev/null
@@ -1,10 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *******************************************************************************/ 
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/plugin.properties b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/plugin.properties
deleted file mode 100644
index f0b7de2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/plugin.properties
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/plugin.xml b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/plugin.xml
deleted file mode 100644
index d17c4c5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/plugin.xml
+++ /dev/null
@@ -1,84 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.2"?>
-<plugin>
-   <extension-point id="projectTaglibDescriptorFactory" name="%extension-point.name" schema="schema/testProjectTaglibDescriptorFactory.exsd"/>
-    <extension
-          point="org.eclipse.jst.jsf.core.tagregistry">
-       <tagRegistry
-             class="org.eclipse.jst.jsf.facelet.core.internal.registry.FaceletRegistryManager$MyRegistryFactory"
-             description="%tagRegistry.description.0"
-             id="FaceletRegistry">
-          <content-type
-                contentTypeId="org.eclipse.wst.html.core.htmlsource">
-          </content-type>
-       </tagRegistry>
-    </extension>
-    <extension point="org.eclipse.wst.xml.core.documentFactories">
-        <factory
-            type="xhtml"
-            class="org.eclipse.jst.jsf.facelet.core.internal.cm.FaceletDocumentFactory">
-        </factory>
-    </extension>
-    <extension
-          point="org.eclipse.jst.jsf.core.viewhandler">
-       <viewhandler
-             class="org.eclipse.jst.jsf.facelet.core.internal.view.DTFaceletViewHandler"
-             id="org.eclipse.jst.jsf.facelet.core.html.viewhandler">
-       </viewhandler>
-    </extension>
-    <extension
-        point="org.eclipse.emf.edit.itemProviderAdapterFactories">
-        <factory 
-       uri = "http://org.eclipse.jst.jsf.facelet.core/additionalTagMetadata.ecore" 
-       class = "org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.provider.AddTagMDItemProviderAdapterFactory" 
-       supportedTypes = 
-         "org.eclipse.emf.edit.provider.IEditingDomainItemProvider
-          org.eclipse.emf.edit.provider.IStructuredItemContentProvider
-          org.eclipse.emf.edit.provider.ITreeItemContentProvider
-          org.eclipse.emf.edit.provider.IItemLabelProvider
-          org.eclipse.emf.edit.provider.IItemPropertySource
-          org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.provider.IResourceProvider"/>
-  </extension>
-    <extension
-          point="org.eclipse.wst.xml.core.catalogContributions">
-       <catalogContribution id="default">
-             <public
-                publicId="-//Sun Microsystems, Inc.//DTD Facelet Taglib 1.0//EN"
-                uri="dtd/facelet-taglib_1_0.dtd"
-                webURL="facelet-taglib_1_0.dtd" />
-       </catalogContribution>
-    </extension>
-    
-       <extension
-         point="org.eclipse.jst.jsf.core.AttributeValueRuntimeTypes">
-
-      <attributeValueRuntimeType
-            class="org.eclipse.jst.jsf.facelet.core.internal.cm.attributevalues.TemplateWebPathType"
-            id="attributevalues.TemplateWebPathType"/>
-    </extension>
-
-  <extension point="org.eclipse.emf.ecore.generated_package">
-    <package 
-       uri = "http://org.eclipse.jst.jsf.facelet.core/additionalTagMetadata.ecore" 
-       class = "org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AddTagMDPackage"
-       genModel = "model/additionalTagMetadata.genmodel" /> 
-  </extension> 
-  <extension
-        point="org.eclipse.jst.jsf.common.domainSourceModelTypes">
-      <domainSourceModelTypes
-            domainId="TagLibraryDomain"
-            domainSourceModelTypeId="FaceletNamespaceContentModelHandler"
-            locator="org.eclipse.jst.jsf.facelet.core.internal.metadata.FaceletNamespaceMetaDataLocator"
-            ordinal="3">
-      </domainSourceModelTypes>      
-  </extension>
- 
-  <extension
-        point="org.eclipse.jst.jsf.common.domainSourceModelTypeTranslators">
-    <domainSourceModelTypeTranslator
-          domainSourceModelTypeId="FaceletNamespaceContentModelHandler"
-          translatorClass="org.eclipse.jst.jsf.facelet.core.internal.metadata.FaceletNamespaceMetaDataTranslator">
-    </domainSourceModelTypeTranslator>                
-  </extension>
-
-</plugin>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/schema/testProjectTaglibDescriptorFactory.exsd b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/schema/testProjectTaglibDescriptorFactory.exsd
deleted file mode 100644
index 48cb7e1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/schema/testProjectTaglibDescriptorFactory.exsd
+++ /dev/null
@@ -1,102 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.jst.jsf.facelet.core" xmlns="http://www.w3.org/2001/XMLSchema">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.jst.jsf.facelet.core" id="jsfAppConfigManagerFactory" name="JSF App Config Manager Factory"/>
-      </appInfo>
-      <documentation>
-         internal... not provisional API
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <annotation>
-         <appInfo>
-            <meta.element />
-         </appInfo>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="factory"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="factory">
-      <complexType>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn=":org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.IProjectTaglibDescriptorFactory"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         [Enter the first release in which this extension point appears.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         [Enter extension point usage example here.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiinfo"/>
-      </appInfo>
-      <documentation>
-         [Enter API information here.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         [Enter information about supplied implementation of this extension point.]
-      </documentation>
-   </annotation>
-
-
-</schema>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/FaceletCorePlugin.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/FaceletCorePlugin.java
deleted file mode 100644
index 278fdd1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/FaceletCorePlugin.java
+++ /dev/null
@@ -1,136 +0,0 @@
-package org.eclipse.jst.jsf.facelet.core.internal;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.emf.common.EMFPlugin;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.osgi.framework.BundleContext;
-
-/**
- * The activator class controls the plug-in life cycle
- */
-public class FaceletCorePlugin extends EMFPlugin
-{
-
-    /**
-     * Keep track of the singleton.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public static final FaceletCorePlugin INSTANCE = new FaceletCorePlugin();
-
-    /**
-     * The plug-in ID
-     */
-    public static final String       PLUGIN_ID = "org.eclipse.jst.jsf.facelet.core"; //$NON-NLS-1$
-
-    // The shared instance
-    private static Implementation plugin;
-
-    /**
-     * Create the instance.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public FaceletCorePlugin()
-    {
-        super
-          (new ResourceLocator [] 
-           {
-           });
-    }
-
-    /**
-     * Returns the singleton instance of the Eclipse plugin.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the singleton instance.
-     * @generated
-     */
-    @Override
-    public ResourceLocator getPluginResourceLocator()
-    {
-        return plugin;
-    }
-
-    /**
-     * Returns the singleton instance of the Eclipse plugin.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the singleton instance.
-     * @generated
-     */
-    public static Implementation getPlugin()
-    {
-        return plugin;
-    }
-
-    /**
-     * The actual implementation of the Eclipse <b>Plugin</b>.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public static class Implementation extends EclipsePlugin
-    {
-        private BundleContext context = null;
-        /**
-         * Creates an instance.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        public Implementation()
-        {
-            super();
-
-            // Remember the static instance.
-            //
-            plugin = this;
-        }
-
-        @Override
-        public void start(BundleContext bundleContext) throws Exception
-        {
-            super.start(bundleContext);
-            this.context = bundleContext;
-        }
-        
-        /**
-         * @return the bundle context.
-         */
-        public BundleContext getBundleContext()
-        {
-            return this.context;
-        }
-    }
-
-    
-    /**
-     * Returns the shared instance
-     * 
-     * @return the shared instance
-     */
-    public static Implementation getDefault()
-    {
-        if (plugin == null)
-        {
-            return new Implementation();
-        }
-        return plugin;
-    }
-
-    /**
-     * @param logMessage
-     * @param exception
-     */
-    public static void log(final String logMessage, final Throwable exception)
-    {
-        final IStatus status = new Status(IStatus.ERROR, PLUGIN_ID,
-                logMessage, exception);
-        getDefault().getLog().log(status);
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/FaceletCoreTraceOptions.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/FaceletCoreTraceOptions.java
deleted file mode 100644
index 70250cc..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/FaceletCoreTraceOptions.java
+++ /dev/null
@@ -1,88 +0,0 @@
-package org.eclipse.jst.jsf.facelet.core.internal;
-
-import org.eclipse.osgi.framework.debug.FrameworkDebugOptions;
-import org.eclipse.osgi.service.debug.DebugOptions;
-
-/**
- * Defines that standard runtime trace options for debugging. See .options file
- * for definitions.
- * 
- * @author cbateman
- * 
- */
-public final class FaceletCoreTraceOptions
-{
-    /**
-     * True if debug tracing is enabled. Other tracing cannot be enabled unless
-     * this is enabled.
-     */
-    public static final boolean ENABLED;
-
-    /**
-     * True if the registry manager tracing is enabled
-     */
-    public static final boolean TRACE_REGISTRYMANAGER;
-
-    /**
-     * True if the facet installer is being traced.
-     */
-    public static final boolean TRACE_FACETINSTALLDELEGATE;
-    /**
-     * True if the facet uninstaller is being traced
-     */
-    public static final boolean TRACE_FACETUNINSTALLDELEGATE;
-    /**
-     * True if the base facet change delegate is being traced
-     */
-    public static final boolean TRACE_FACETCHANGEDELEGATE;
-
-    private static final String KEY_DEBUG_ENABLED = "/debug"; //$NON-NLS-1$
-//    private static final String KEY_VIEW_TAGREGISTRY = "/jsptagregistry";
-//    private static final String KEY_VIEW_JSPTAGREGISTRY_CHANGES =
-//        KEY_VIEW_TAGREGISTRY + "/changes";
-    private static final String KEY_VIEW_REGISTRYMANAGER = "/registrymanager"; //$NON-NLS-1$
-    private static final String KEY_FACETINSTALLDELEGATE = "/facetinstalldelegate"; //$NON-NLS-1$
-    private static final String KEY_FACETUNINSTALLDELEGATE = "facetuninstalldelegate"; //$NON-NLS-1$
-    private static final String KEY_FACETCHANGEDELEGATE = "facetchangedelegate"; //$NON-NLS-1$
-
-    static
-    {
-        final DebugOptions debugOptions = FrameworkDebugOptions.getDefault();
-
-        ENABLED = debugOptions != null
-                && debugOptions.getBooleanOption(FaceletCorePlugin.PLUGIN_ID
-                        + KEY_DEBUG_ENABLED, false);
-
-        if (ENABLED && debugOptions != null)
-        {
-            TRACE_REGISTRYMANAGER = debugOptions.getBooleanOption(
-                    FaceletCorePlugin.PLUGIN_ID + KEY_VIEW_REGISTRYMANAGER, false);
-            TRACE_FACETINSTALLDELEGATE = debugOptions.getBooleanOption(
-                    FaceletCorePlugin.PLUGIN_ID + KEY_FACETINSTALLDELEGATE, false);
-            TRACE_FACETUNINSTALLDELEGATE = debugOptions.getBooleanOption(
-                    FaceletCorePlugin.PLUGIN_ID + KEY_FACETUNINSTALLDELEGATE, false);
-            TRACE_FACETCHANGEDELEGATE = debugOptions.getBooleanOption(
-                    FaceletCorePlugin.PLUGIN_ID + KEY_FACETCHANGEDELEGATE, false);
-        }
-        else
-        {
-            TRACE_REGISTRYMANAGER = false;
-            TRACE_FACETINSTALLDELEGATE = false;
-            TRACE_FACETUNINSTALLDELEGATE = false;
-            TRACE_FACETCHANGEDELEGATE = false;
-        }
-    }
-
-    /**
-     * @param message
-     */
-    public static void log(final String message)
-    {
-        System.out.println(message);
-    }
-
-    private FaceletCoreTraceOptions()
-    {
-        // no instantiation
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/AttributeCMAdapter.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/AttributeCMAdapter.java
deleted file mode 100644
index c7b3766..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/AttributeCMAdapter.java
+++ /dev/null
@@ -1,99 +0,0 @@
-package org.eclipse.jst.jsf.facelet.core.internal.cm;
-
-import java.util.Enumeration;
-
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.ITagAttribute;
-import org.eclipse.jst.jsp.core.internal.contentmodel.tld.CMDataTypeImpl;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
-
-/**
- * Adapts Facelet attribute date to the CM model.
- * 
- * @author cbateman
- *
- */
-public class AttributeCMAdapter implements CMAttributeDeclaration
-{
-    private static final String DESCRIPTION = "description"; //$NON-NLS-1$
-    private final int     _usage;
-    private final String _name;
-    private String _description;
-
-    /**
-     * @param name
-     * @param usage
-     */
-    public AttributeCMAdapter(final String name, final int usage)
-    {
-        _name = name;
-        _usage = usage;
-    }
-    
-    /**
-     * @param tagAttr 
-     */
-    public AttributeCMAdapter(final ITagAttribute tagAttr)
-    {
-        this(tagAttr.getName(), tagAttr.isRequired() ? REQUIRED : OPTIONAL);
-        _description = tagAttr.getDescription();
-    }
-    
-    public String getAttrName()
-    {
-        return _name;
-    }
-
-    public CMDataType getAttrType()
-    {
-        return new CMDataTypeImpl(CMDataType.CDATA);
-    }
-
-    public String getDefaultValue()
-    {
-        return null;
-    }
-
-    public Enumeration<?> getEnumAttr()
-    {
-        return null;
-    }
-
-    public int getUsage()
-    {
-        return _usage;
-    }
-
-    public String getNodeName()
-    {
-        return _name;
-    }
-
-    public int getNodeType()
-    {
-        return CMNode.ATTRIBUTE_DECLARATION;
-    }
-
-    public Object getProperty(String propertyName)
-    {
-        if (DESCRIPTION.equals(propertyName))
-        {
-            return _description;
-        }
-        return null;
-    }
-
-    /**
-     * @param description
-     */
-    public void setDescription(final String description)
-    {
-        _description = description;
-    }
-    
-    public boolean supports(String propertyName)
-    {
-        return false;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/CompositeTagInfo.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/CompositeTagInfo.java
deleted file mode 100644
index ee81c1d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/CompositeTagInfo.java
+++ /dev/null
@@ -1,107 +0,0 @@
-package org.eclipse.jst.jsf.facelet.core.internal.cm;
-
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.jsf.core.internal.tld.TagIdentifierFactory;
-import org.eclipse.jst.jsf.facelet.core.internal.FaceletCorePlugin;
-import org.eclipse.jst.jsf.facelet.core.internal.cm.strategy.TagInfoStrategyComposite;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
-
-/**
- * A tag info that composes a number of other tag infos selected from a 
- * TagInfoStrategyComposite.
- * 
- * @author cbateman
- *
- */
-public abstract class CompositeTagInfo extends TagInfo
-{
-    private final TagInfoStrategyComposite _compositeStrategy;
-    private final String _uri;
-
-    /**
-     * @param uri 
-     * @param compositeStrategy
-     */
-    protected CompositeTagInfo(final String uri, final TagInfoStrategyComposite compositeStrategy)
-    {
-        _uri = uri;
-        _compositeStrategy = compositeStrategy;
-    }
-    @Override
-    public Object getTagProperty(String tagName, String key)
-    {
-        final TagIdentifier tagId = TagIdentifierFactory.createJSPTagWrapper(
-                _uri, tagName);
-        _compositeStrategy.resetIterator();
-
-        for (TagInfo tagInfo = getNextExternalInfo(tagId); tagInfo != _compositeStrategy
-                .getNoResult(); tagInfo = getNextExternalInfo(tagId))
-        {
-            try
-            {
-                if (tagInfo != _compositeStrategy.getNoResult())
-                {
-                    final Object value = tagInfo.getTagProperty(tagName, key);
-
-                    if (value != null)
-                    {
-                        return value;
-                    }
-                }
-
-                // fall-through
-            }
-            catch (final Exception e)
-            {
-                FaceletCorePlugin.log("During meta-data strategy", e); //$NON-NLS-1$
-            }
-        }
-
-        return null;
-
-    }
-
-    /**
-     * @param tagName
-     * @return a named node map of known attributes for the tag, or null if not
-     *         found
-     */
-    @Override
-    public CMNamedNodeMap getAttributes(String tagName)
-    {
-        final TagIdentifier tagId = TagIdentifierFactory.createJSPTagWrapper(
-                _uri, tagName);
-        _compositeStrategy.resetIterator();
-
-        for (TagInfo tagInfo = getNextExternalInfo(tagId); tagInfo != _compositeStrategy
-                .getNoResult(); tagInfo = getNextExternalInfo(tagId))
-        {
-            try
-            {
-                if (tagInfo != _compositeStrategy.getNoResult())
-                {
-                    final CMNamedNodeMap nodeMap = tagInfo
-                            .getAttributes(tagName);
-
-                    if (nodeMap != null)
-                    {
-                        return nodeMap;
-                    }
-                }
-
-                // fall-through
-            }
-            catch (final Exception e)
-            {
-                FaceletCorePlugin.log("During meta-data strategy", e); //$NON-NLS-1$
-            }
-        }
-
-        return null;
-    }
-
-    private TagInfo getNextExternalInfo(final TagIdentifier input)
-    {
-        return _compositeStrategy.perform(input);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/DocumentElementCMAdapter.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/DocumentElementCMAdapter.java
deleted file mode 100644
index a20c5f1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/DocumentElementCMAdapter.java
+++ /dev/null
@@ -1,109 +0,0 @@
-package org.eclipse.jst.jsf.facelet.core.internal.cm;
-
-import java.util.Iterator;
-
-import org.eclipse.wst.xml.core.internal.contentmodel.CMContent;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
-
-class DocumentElementCMAdapter implements CMNamedNodeMap,
-        CMElementDeclaration
-{
-    private final  String               _prefix;
-    private final  ElementCMAdapter     _adapter;
-    
-    public DocumentElementCMAdapter(final ElementCMAdapter adapter, final String prefix)
-    {
-        _prefix = prefix;
-        _adapter = adapter;
-    }
-    
-    public int getLength()
-    {
-        return _adapter.getLength();
-    }
-
-    public CMNode getNamedItem(String name)
-    {
-        return _adapter.getNamedItem(name);
-    }
-
-    public CMNode item(int index)
-    {
-        return _adapter.item(index);
-    }
-
-    @SuppressWarnings("unchecked")
-    public Iterator iterator()
-    {
-        return _adapter.iterator();
-    }
-
-    public CMNamedNodeMap getAttributes()
-    {
-        return _adapter.getAttributes();
-    }
-
-    public CMContent getContent()
-    {
-        return _adapter.getContent();
-    }
-
-    public int getContentType()
-    {
-       return _adapter.getContentType();
-    }
-
-    public CMDataType getDataType()
-    {
-        return _adapter.getDataType();
-    }
-
-    public String getElementName()
-    {
-        return getPrefixedName(_adapter.getElementName());
-    }
-
-    public CMNamedNodeMap getLocalElements()
-    {
-        return _adapter.getLocalElements();
-    }
-
-    public int getMaxOccur()
-    {
-        return _adapter.getMaxOccur();
-    }
-
-    public int getMinOccur()
-    {
-        return _adapter.getMinOccur();
-    }
-
-    public String getNodeName()
-    {
-        return getPrefixedName(_adapter.getNodeName());
-    }
-
-    private String getPrefixedName(final String name)
-    {
-        return _prefix + ":"+name; //$NON-NLS-1$
-    }
-    
-    public int getNodeType()
-    {
-        return _adapter.getNodeType();
-    }
-
-    public Object getProperty(String propertyName)
-    {
-        return _adapter.getProperty(propertyName);
-    }
-
-    public boolean supports(String propertyName)
-    {
-        return _adapter.supports(propertyName);
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/DocumentNamespaceCMAdapter.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/DocumentNamespaceCMAdapter.java
deleted file mode 100644
index bae83f7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/DocumentNamespaceCMAdapter.java
+++ /dev/null
@@ -1,161 +0,0 @@
-package org.eclipse.jst.jsf.facelet.core.internal.cm;
-
-import java.util.Iterator;
-
-import org.eclipse.wst.xml.core.internal.contentmodel.CMDocument;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMNamespace;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
-
-/**
- * A namespace a specific to a document, where it's tag name prefix is known.
- *
- */
-class DocumentNamespaceCMAdapter implements CMNamedNodeMap, CMDocument
-{
-    private final String                    _prefix;
-    private final NamespaceCMAdapter        _adapter;
-    
-    public DocumentNamespaceCMAdapter(final NamespaceCMAdapter adapter, final String prefix)
-    {
-        _prefix = prefix;
-        _adapter = adapter;
-    }
-    
-    public int getLength()
-    {
-        return _adapter.getLength();
-    }
-
-    public CMNode getNamedItem(String name)
-    {
-        CMNode  node = _adapter.getNamedItem(name);
-        
-        if (node != null)
-        {
-            node =  new DocumentElementCMAdapter((ElementCMAdapter) node,_prefix);
-        }
-        return node;
-    }
-
-    public CMNode item(int index)
-    {
-        CMNode  item = _adapter.item(index);
-        
-        if (item != null)
-        {
-            item = new DocumentElementCMAdapter((ElementCMAdapter) item,_prefix);
-        }
-        return item;
-    }
-
-    public Iterator<?> iterator()
-    {
-        return new WrappingIterator(_adapter.iterator());
-    }
-
-    private class WrappingIterator implements Iterator<CMNode>
-    {
-        private Iterator<?>   _it;
-        
-        public WrappingIterator(final Iterator<?> it)
-        {
-            _it = it;
-        }
-        public boolean hasNext()
-        {
-            return _it.hasNext();
-        }
-
-        public CMNode next()
-        {
-            CMNode node = (CMNode) _it.next();
-            node = getNamedItem(node.getNodeName());
-            return node;
-        }
-
-        public void remove()
-        {
-            throw new UnsupportedOperationException(""); //$NON-NLS-1$
-        }
-    }
-
-    public CMNamedNodeMap getElements()
-    {
-        return this;
-    }
-
-    public CMNamedNodeMap getEntities()
-    {
-        //not changing entities
-        return _adapter.getEntities();
-    }
-
-    public CMNamespace getNamespace()
-    {
-        return new CMNamespaceImpl(_adapter.getNamespace(), _prefix);
-    }
-
-    public String getNodeName()
-    {
-        // not changing node name
-        return _adapter.getNodeName();
-    }
-
-    public int getNodeType()
-    {
-        return _adapter.getNodeType();
-    }
-
-    public Object getProperty(String propertyName)
-    {
-        return _adapter.getProperty(propertyName);
-    }
-
-    public boolean supports(String propertyName)
-    {
-        return _adapter.supports(propertyName);
-    }
-
-    private static class CMNamespaceImpl implements CMNamespace
-    {
-        private final CMNamespace   _proxy;
-        private final String        _prefix;
-        
-        CMNamespaceImpl(CMNamespace proxy, final String prefix)
-        {
-            _proxy = proxy;
-            _prefix = prefix;
-        }
-
-        public String getPrefix()
-        {
-            return _prefix;
-        }
-
-        public String getURI()
-        {
-            return _proxy.getURI();
-        }
-
-        public String getNodeName()
-        {
-            return _proxy.getNodeName();
-        }
-
-        public int getNodeType()
-        {
-            return _proxy.getNodeType();
-        }
-
-        public Object getProperty(String propertyName)
-        {
-            return _proxy.getProperty(propertyName);
-        }
-
-        public boolean supports(String propertyName)
-        {
-            return _proxy.supports(propertyName);
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/ElementCMAdapter.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/ElementCMAdapter.java
deleted file mode 100644
index b38e431..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/ElementCMAdapter.java
+++ /dev/null
@@ -1,147 +0,0 @@
-/**
- * 
- */
-package org.eclipse.jst.jsf.facelet.core.internal.cm;
-
-import java.util.Iterator;
-
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.ITagElement;
-import org.eclipse.jst.jsp.core.internal.contentmodel.tld.CMDataTypeImpl;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMContent;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
-
-class ElementCMAdapter implements CMElementDeclaration, CMNamedNodeMap
-{
-    private final ITagElement  _tagElement;
-    private final TagInfo _tLDTagInfo;
-
-    ElementCMAdapter(final ITagElement tagElement, final TagInfo tldTagInfo)
-    {
-        _tagElement = tagElement;
-        _tLDTagInfo = tldTagInfo;
-    }
-
-    public CMNamedNodeMap getAttributes()
-    {
-        return this;
-    }
-
-    public CMContent getContent()
-    {
-        return null;
-    }
-
-    public int getContentType()
-    {
-        return ELEMENT;
-    }
-
-    public CMDataType getDataType()
-    {
-        return new CMDataTypeImpl(CMDataType.CDATA);
-    }
-
-    public String getElementName()
-    {
-        return _tagElement.getName();
-    }
-
-    public CMNamedNodeMap getLocalElements()
-    {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    public int getMaxOccur()
-    {
-        // unbounded
-        return -1;
-    }
-
-    public int getMinOccur()
-    {
-        // optional
-        return 0;
-    }
-
-    public String getNodeName()
-    {
-        return _tagElement.getName();
-    }
-
-    public int getNodeType()
-    {
-        return CMNode.ELEMENT_DECLARATION;
-    }
-
-    public Object getProperty(final String propertyName)
-    {
-        return _tLDTagInfo.getTagProperty(_tagElement.getName(), propertyName);
-    }
-
-    public boolean supports(final String propertyName)
-    {
-        return false;
-    }
-
-    @Override
-    public boolean equals(final Object obj)
-    {
-        if (obj instanceof ElementCMAdapter)
-        {
-            return ((ElementCMAdapter) obj)._tagElement.equals(_tagElement);
-        }
-
-        return false;
-    }
-
-    @Override
-    public int hashCode()
-    {
-        return _tagElement.hashCode();
-    }
-
-    public int getLength()
-    {
-        final CMNamedNodeMap map = _tLDTagInfo.getAttributes(_tagElement.getName());
-
-        if (map != null)
-        {
-            return map.getLength();
-        }
-
-        return 0;
-    }
-
-    public CMNode getNamedItem(final String name)
-    {
-        final CMNamedNodeMap map = _tLDTagInfo.getAttributes(_tagElement.getName());
-
-        if (map != null)
-        {
-            return map.getNamedItem(name);
-        }
-        return null;
-    }
-
-    public CMNode item(final int index)
-    {
-        final CMNamedNodeMap map = _tLDTagInfo.getAttributes(_tagElement.getName());
-
-        if (map != null)
-        {
-            return map.item(index);
-        }
-        return null;
-    }
-
-    public Iterator<?> iterator()
-    {
-        final CMNamedNodeMap map = _tLDTagInfo.getAttributes(_tagElement.getName());
-        return map.iterator();
-    }
-
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/ExternalTagInfo.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/ExternalTagInfo.java
deleted file mode 100644
index f17eed3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/ExternalTagInfo.java
+++ /dev/null
@@ -1,96 +0,0 @@
-package org.eclipse.jst.jsf.facelet.core.internal.cm;
-
-import java.util.Iterator;
-import java.util.NoSuchElementException;
-
-import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
-
-/**
- * Represents information about Facelets brought from external sources such as
- * the JSP tag library.
- * 
- * @author cbateman
- * 
- */
-public abstract class ExternalTagInfo extends TagInfo
-{
-    /**
-     * Single instance of the null external tag info
-     */
-    public static TagInfo  NULL_INSTANCE = new NullExternalTagInfo();
-
-    @Override
-    public abstract CMNamedNodeMap getAttributes(final String tagName);
-
-    @Override
-    public abstract Object getTagProperty(final String tagName, final String key);
-
-    /**
-     * @author cbateman
-     *
-     */
-    public static class NullExternalTagInfo extends ExternalTagInfo
-    {
-        private NullExternalTagInfo()
-        {
-            // no external instantitation
-        }
-        
-        @Override
-        public CMNamedNodeMap getAttributes(final String tagName)
-        {
-            return new NullCMNamedNodeMap();
-        }
-
-        @Override
-        public Object getTagProperty(final String tagName, final String key)
-        {
-            // no data so always null
-            return null;
-        }
-
-        private static class NullCMNamedNodeMap implements CMNamedNodeMap
-        {
-            public int getLength()
-            {
-                return 0;
-            }
-
-            public CMNode getNamedItem(final String name)
-            {
-                return null;
-            }
-
-            public CMNode item(final int index)
-            {
-                return null;
-            }
-
-            public Iterator iterator()
-            {
-                return new NullIterator();
-            }
-        }
-
-        private static class NullIterator implements Iterator
-        {
-            public boolean hasNext()
-            {
-                return false;
-            }
-
-            public Object next()
-            {
-                throw new NoSuchElementException();
-            }
-
-            public void remove()
-            {
-                throw new UnsupportedOperationException(
-                        "can not remove regions via iterator"); //$NON-NLS-1$
-            }
-        }
-    }
-
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/FaceletDocumentFactory.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/FaceletDocumentFactory.java
deleted file mode 100644
index 0c806f8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/FaceletDocumentFactory.java
+++ /dev/null
@@ -1,177 +0,0 @@
-package org.eclipse.jst.jsf.facelet.core.internal.cm;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.Namespace;
-import org.eclipse.jst.jsf.core.JSFVersion;
-import org.eclipse.jst.jsf.designtime.internal.view.model.ITagRegistry;
-import org.eclipse.jst.jsf.designtime.internal.view.model.TagRegistryFactory.TagRegistryFactoryException;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.FaceletRegistryManager.MyRegistryFactory;
-import org.eclipse.jst.jsf.facelet.core.internal.util.ViewUtil;
-import org.eclipse.jst.jsf.facelet.core.internal.util.ViewUtil.PrefixEntry;
-import org.eclipse.jst.jsp.core.internal.contentmodel.tld.CMDocumentFactoryTLD;
-import org.eclipse.jst.jsp.core.internal.contentmodel.tld.provisional.TLDDocument;
-import org.eclipse.jst.jsp.core.taglib.ITaglibRecord;
-import org.eclipse.jst.jsp.core.taglib.TaglibIndex;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMDocument;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
-import org.w3c.dom.Element;
-
-/**
- * Creates CMDocument framework adaptation for Facelet features.
- * 
- * NOTE: this class currently caches state and is NOT THREADSAFE.  Share 
- * instances of this class between unowned classes at your own risk.
- * 
- * @author cbateman
- *
- */
-public class FaceletDocumentFactory
-{
-    private final IProject                        _project;
-    private final Map<String, NamespaceCMAdapter> _cmDocuments;
-    private final Map<String, TagInfo>    _externalTagInfo;
-
-    /**
-     * @param project
-     */
-    public FaceletDocumentFactory(final IProject project)
-    {
-        _project = project;
-        _cmDocuments = new HashMap<String, NamespaceCMAdapter>(8);
-        _externalTagInfo = new HashMap<String, TagInfo>(8);
-    }
-
-    /**
-     * @param uri
-     * @param prefix
-     * @return the CMDocument for the uri where prefix is used as its namespace
-     * short-form (usually in the context of an XML document instance).
-     */
-    public CMDocument createCMDocumentForContext(final String uri,
-            final String prefix)
-    {
-        final NamespaceCMAdapter cmDoc = getOrCreateCMDocument(_project, uri);
-
-        if (cmDoc != null)
-        {
-            return new DocumentNamespaceCMAdapter(cmDoc, prefix);
-        }
-        return null;
-    }
-
-    /**
-     * @param element
-     * @return the CM model data for element or null if none.
-     */
-    public CMElementDeclaration createCMElementDeclaration(final Element element)
-    {
-        final String prefix = element.getPrefix();
-        final Map<String, PrefixEntry> namespaces = ViewUtil
-                .getDocumentNamespaces(element.getOwnerDocument());
-        final PrefixEntry prefixEntry = namespaces.get(prefix);
-
-        if (prefixEntry != null)
-        {
-            final CMDocument cmDoc = createCMDocumentForContext(prefixEntry
-                    .getUri(), prefixEntry.getPrefix());
-
-            if (cmDoc != null)
-            {
-                return (CMElementDeclaration) cmDoc.getElements().getNamedItem(
-                        element.getLocalName());
-            }
-        }
-
-        return null;
-    }
-
-    /**
-     * @param ns
-     * @return the externa tag info the namespace.  May return a previously
-     * cached value. If there is no cached value, then creates it.
-     */
-    public TagInfo getOrCreateExtraTagInfo(final String ns)
-    {
-        TagInfo tagInfo = _externalTagInfo.get(ns);
-
-        if (tagInfo == null)
-        {
-            tagInfo = createExternalTagInfo(ns);
-            _externalTagInfo.put(ns, tagInfo);
-        }
-        return tagInfo;
-    }
-
-    /**
-     * @return a new external tag info for this namespace
-     */
-    private TagInfo createExternalTagInfo(final String uri)
-    {
-        final JSFVersion jsfVersion = JSFVersion.valueOfProject(_project);
-        TagInfo tldTagInfo = null;
-        if (jsfVersion != null)
-        {
-            if (jsfVersion.compareTo(JSFVersion.V2_0) >= 0)
-            {
-                tldTagInfo = new FaceletTagInfo(_project, uri);
-            } else
-            {
-                final ITaglibRecord[] tldrecs = TaglibIndex
-                        .getAvailableTaglibRecords(_project.getFullPath());
-                FIND_TLDRECORD: for (final ITaglibRecord rec : tldrecs)
-                {
-                    final String matchUri = rec.getDescriptor().getURI();
-                    if (uri.equals(matchUri))
-                    {
-                        final CMDocumentFactoryTLD factory = new CMDocumentFactoryTLD();
-                        tldTagInfo = new MetadataTagInfo(_project,
-                                (TLDDocument) factory.createCMDocument(rec));
-                        break FIND_TLDRECORD;
-                    }
-                }
-
-                if (tldTagInfo == null)
-                {
-                    tldTagInfo = new MetadataTagInfo(_project, uri);
-                }
-            }
-        }
-        return tldTagInfo;
-    }
-
-    private NamespaceCMAdapter getOrCreateCMDocument(final IProject project,
-            final String uri)
-    {
-        NamespaceCMAdapter adapter = _cmDocuments.get(uri);
-
-        if (adapter == null)
-        {
-            final MyRegistryFactory factory = new MyRegistryFactory();
-
-            ITagRegistry registry;
-            try
-            {
-                registry = factory.createTagRegistry(project);
-                if (registry != null)
-                {
-                    final Namespace ns = registry.getTagLibrary(uri);
-
-                    if (ns != null)
-                    {
-                        adapter = new NamespaceCMAdapter(ns, project);
-                        _cmDocuments.put(uri, adapter);
-                    }
-                }
-            }
-            catch (final TagRegistryFactoryException e)
-            {
-                // fall-through
-            }
-        }
-        return adapter;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/FaceletTagInfo.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/FaceletTagInfo.java
deleted file mode 100644
index a9ab0fa..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/FaceletTagInfo.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package org.eclipse.jst.jsf.facelet.core.internal.cm;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jst.jsf.facelet.core.internal.cm.strategy.FaceletExternalMetadataStrategy;
-import org.eclipse.jst.jsf.facelet.core.internal.cm.strategy.IExternalMetadataStrategy;
-import org.eclipse.jst.jsf.facelet.core.internal.cm.strategy.MDExternalMetadataStrategy;
-import org.eclipse.jst.jsf.facelet.core.internal.cm.strategy.TagInfoStrategyComposite;
-
-/*package*/class FaceletTagInfo extends CompositeTagInfo
-{
-    public FaceletTagInfo(final IProject project, final String uri)
-    {
-        super(uri, createStrategy(project));
-    }
-
-    private static TagInfoStrategyComposite createStrategy(
-            final IProject project)
-    {
-        final IExternalMetadataStrategy mdStrategy = MDExternalMetadataStrategy
-        .create(project);
-        final IExternalMetadataStrategy faceletStrategy = new FaceletExternalMetadataStrategy(
-                project);
-        final List<String> ids = new ArrayList<String>();
-        ids.add(FaceletExternalMetadataStrategy.STRATEGY_ID);
-        ids.add(MDExternalMetadataStrategy.STRATEGY_ID);
-
-        final TagInfoStrategyComposite strategyComposite = new TagInfoStrategyComposite(
-                ids);
-        strategyComposite.addStrategy(faceletStrategy);
-        strategyComposite.addStrategy(mdStrategy);
-        return strategyComposite;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/MetadataTagInfo.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/MetadataTagInfo.java
deleted file mode 100644
index f8b6703..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/MetadataTagInfo.java
+++ /dev/null
@@ -1,56 +0,0 @@
-package org.eclipse.jst.jsf.facelet.core.internal.cm;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jst.jsf.facelet.core.internal.cm.strategy.IExternalMetadataStrategy;
-import org.eclipse.jst.jsf.facelet.core.internal.cm.strategy.JSPExternalMetadataStrategy;
-import org.eclipse.jst.jsf.facelet.core.internal.cm.strategy.MDExternalMetadataStrategy;
-import org.eclipse.jst.jsf.facelet.core.internal.cm.strategy.TagInfoStrategyComposite;
-import org.eclipse.jst.jsp.core.internal.contentmodel.tld.provisional.TLDDocument;
-
-/**
- * An external tag info that checks first the meta-data repository and second in
- * the provided TLDDocument for data.
- * 
- * @author cbateman
- * 
- */
-/* package */class MetadataTagInfo extends CompositeTagInfo
-{
-    private MetadataTagInfo(final IProject project, final TLDDocument doc,
-            final String uri)
-    {
-        super(uri, createStrategy(project,doc));
-    }
-
-    public MetadataTagInfo(final IProject project, final String uri)
-    {
-        this(project, null, uri);
-    }
-
-    /**
-     * @param project
-     * @param doc
-     */
-    public MetadataTagInfo(final IProject project, final TLDDocument doc)
-    {
-        this(project, doc, doc.getUri());
-    }
-
-    private static TagInfoStrategyComposite createStrategy(final IProject project, final TLDDocument doc)
-    {
-        IExternalMetadataStrategy mdStrategy = MDExternalMetadataStrategy.create(project);
-        JSPExternalMetadataStrategy jspStrategy = new JSPExternalMetadataStrategy(doc);
-
-        final List<String> ids = new ArrayList<String>();
-        ids.add(MDExternalMetadataStrategy.STRATEGY_ID);
-        ids.add(JSPExternalMetadataStrategy.STRATEGY_ID);
-
-        TagInfoStrategyComposite strategyComposite = new TagInfoStrategyComposite(ids);
-        strategyComposite.addStrategy(mdStrategy);
-        strategyComposite.addStrategy(jspStrategy);
-        return strategyComposite;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/NamespaceCMAdapter.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/NamespaceCMAdapter.java
deleted file mode 100644
index 0732f19..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/NamespaceCMAdapter.java
+++ /dev/null
@@ -1,232 +0,0 @@
-package org.eclipse.jst.jsf.facelet.core.internal.cm;
-
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.concurrent.atomic.AtomicBoolean;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jst.jsf.common.internal.managedobject.IManagedObject;
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.ITagElement;
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.Namespace;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMDocument;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMNamespace;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
-
-/*package*/class NamespaceCMAdapter implements CMNamedNodeMap, CMDocument, IManagedObject
-{
-    private final Namespace                     _ns;
-    private final Map<String, ElementCMAdapter> _elements;
-    private final FaceletDocumentFactory        _factory;
-    private final AtomicBoolean                 _isDisposed = new AtomicBoolean(false);
-
-    public NamespaceCMAdapter(final Namespace ns, final IProject project)
-    {
-        _ns = ns;
-        _elements = new HashMap<String, ElementCMAdapter>();
-        _factory = new FaceletDocumentFactory(project);
-    }
-
-    public int getLength()
-    {
-        if (_ns.hasViewElements())
-        {
-            return _ns.getViewElements().size();
-        }
-        return 0;
-    }
-
-    public CMNode getNamedItem(final String name)
-    {
-        String localname = name;
-
-        if (name != null && name.indexOf(':') > -1)
-        {
-            String[]  splitName = name.split(":"); //$NON-NLS-1$
-            
-            if (splitName.length == 2)
-            {
-                localname = splitName[1];
-            }
-        }
-        ElementCMAdapter element = _elements.get(localname);
-
-        if (element == null)
-        {
-            final ITagElement tagElement = _ns.getViewElement(localname);
-            if (tagElement != null)
-            {
-                TagInfo tagInfo = _factory.getOrCreateExtraTagInfo(_ns.getNSUri());
-                element = new ElementCMAdapter(tagElement, tagInfo);
-                _elements.put(localname, element);
-            }
-        }
-        return element; 
-    }
-
-    // TODO: optimize
-    public CMNode item(int index)
-    {
-        if (_ns.hasViewElements() && index >= 0
-                && index < _ns.getViewElements().size())
-        {
-            final Iterator<?> it = iterator();
-            for (int i = 0; it.hasNext(); i++)
-            {
-                final ITagElement tagElement = (ITagElement) it.next(); 
-                if (i == index)
-                {
-                    ElementCMAdapter element = _elements.get(tagElement.getName());
-                    
-                    if (element == null)
-                    {
-                        element = new ElementCMAdapter(tagElement, _factory.getOrCreateExtraTagInfo(_ns.getNSUri()));
-                        _elements.put(tagElement.getName(), element);
-                        return element;
-                    }
-                }
-            }
-        }
-        return null;
-    }
-
-    public Iterator<?> iterator()
-    {
-        return new WrappingIterator(_ns.getViewElements());
-    }
-
-    private class WrappingIterator implements Iterator<CMNode>
-    {
-        @SuppressWarnings("unchecked")
-        final Iterator  _viewElementIterator;
-        @SuppressWarnings("unchecked")
-        public WrappingIterator(final Collection viewElements)
-        {
-            _viewElementIterator = viewElements.iterator();
-        }
-        
-        public boolean hasNext()
-        {
-            return _viewElementIterator.hasNext();
-        }
-
-        public CMNode next()
-        {
-            ITagElement nextElement = (ITagElement) _viewElementIterator.next();
-            CMNode node = getNamedItem(nextElement.getName());
-            return node;
-        }
-
-        public void remove()
-        {
-            throw new UnsupportedOperationException(""); //$NON-NLS-1$
-        }
-        
-    }
-    public CMNamedNodeMap getElements()
-    {
-        return this;
-    }
-
-    public CMNamedNodeMap getEntities()
-    {
-        // no entities
-        return null;
-    }
-
-    public CMNamespace getNamespace()
-    {
-        return new CMNamespaceImpl(_ns.getNSUri());
-    }
-
-    public String getNodeName()
-    {
-        return getNamespace().getURI();
-    }
-
-    public int getNodeType()
-    {
-        return CMNode.DOCUMENT;
-    }
-
-    public Object getProperty(String propertyName)
-    {
-        // none supported for now
-        return null;
-    }
-
-    public boolean supports(String propertyName)
-    {
-        // support none for now
-        return false;
-    }
-
-    private static class CMNamespaceImpl implements CMNamespace
-    {
-        private final String _uri;
-
-        CMNamespaceImpl(final String uri)
-        {
-            _uri = uri;
-        }
-
-        public String getPrefix()
-        {
-            return null;
-        }
-
-        public String getURI()
-        {
-            return _uri;
-        }
-
-        public String getNodeName()
-        {
-            return getURI();
-        }
-
-        public int getNodeType()
-        {
-            return CMNode.NAME_SPACE;
-        }
-
-        public Object getProperty(String propertyName)
-        {
-            // TODO Auto-generated method stub
-            return null;
-        }
-
-        public boolean supports(String propertyName)
-        {
-            // TODO Auto-generated method stub
-            return false;
-        }
-    }
-    public void dispose()
-    {
-        if (_isDisposed.compareAndSet(false, true))
-        {
-            _elements.clear();
-        }
-    }
-
-    public void checkpoint()
-    {
-        // TODO: ??
-        
-    }
-
-    public void destroy()
-    {
-        // TODO: ??
-        
-    }
-
-    public boolean isDisposed()
-    {
-        return _isDisposed.get();
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/TagInfo.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/TagInfo.java
deleted file mode 100644
index dd801ee..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/TagInfo.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package org.eclipse.jst.jsf.facelet.core.internal.cm;
-
-import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
-
-/**
- * Generic adapter needed to provide CM required metadata for a CMNode from
- * different sources.
- * 
- * @author cbateman
- *
- */
-public abstract class TagInfo
-{
-    /**
-     * @param tagName
-     * @param key
-     * @return the tag property in the CM model for tagName at key or null if
-     *         not found.
-     */
-    public abstract Object getTagProperty(final String tagName, final String key);
-
-    /**
-     * @param tagName
-     * @return the node map of attributes for the tag called tagName
-     */
-    public abstract CMNamedNodeMap getAttributes(final String tagName);
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/addtagmd/AddTagMDFactory.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/addtagmd/AddTagMDFactory.java
deleted file mode 100644
index aac6e12..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/addtagmd/AddTagMDFactory.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: AddTagMDFactory.java,v 1.1 2010/03/08 18:49:41 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd;
-
-import org.eclipse.emf.ecore.EFactory;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Factory</b> for the model.
- * It provides a create method for each non-abstract class of the model.
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AddTagMDPackage
- * @generated
- */
-public interface AddTagMDFactory extends EFactory
-{
-    /**
-     * The singleton instance of the factory.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    AddTagMDFactory eINSTANCE = org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.impl.AddTagMDFactoryImpl.init();
-
-    /**
-     * Returns a new object of class '<em>Element Data</em>'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new object of class '<em>Element Data</em>'.
-     * @generated
-     */
-    ElementData createElementData();
-
-    /**
-     * Returns a new object of class '<em>Attribute Data</em>'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new object of class '<em>Attribute Data</em>'.
-     * @generated
-     */
-    AttributeData createAttributeData();
-
-    /**
-     * Returns the package supported by this factory.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the package supported by this factory.
-     * @generated
-     */
-    AddTagMDPackage getAddTagMDPackage();
-
-} //AddTagMDFactory
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/addtagmd/AddTagMDPackage.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/addtagmd/AddTagMDPackage.java
deleted file mode 100644
index deaa284..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/addtagmd/AddTagMDPackage.java
+++ /dev/null
@@ -1,339 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: AddTagMDPackage.java,v 1.1 2010/03/08 18:49:41 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd;
-
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EEnum;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.EReference;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Package</b> for the model.
- * It contains accessors for the meta objects to represent
- * <ul>
- *   <li>each class,</li>
- *   <li>each feature of each class,</li>
- *   <li>each enum,</li>
- *   <li>and each data type</li>
- * </ul>
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AddTagMDFactory
- * @model kind="package"
- * @generated
- */
-public interface AddTagMDPackage extends EPackage
-{
-    /**
-     * The package name.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    String eNAME = "addtagmd"; //$NON-NLS-1$
-
-    /**
-     * The package namespace URI.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    String eNS_URI = "http://org.eclipse.jst.jsf.facelet.core/additionalTagMetadata.ecore"; //$NON-NLS-1$
-
-    /**
-     * The package namespace name.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    String eNS_PREFIX = "addTagMD"; //$NON-NLS-1$
-
-    /**
-     * The singleton instance of the package.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    AddTagMDPackage eINSTANCE = org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.impl.AddTagMDPackageImpl.init();
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.impl.ElementDataImpl <em>Element Data</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.impl.ElementDataImpl
-     * @see org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.impl.AddTagMDPackageImpl#getElementData()
-     * @generated
-     */
-    int ELEMENT_DATA = 0;
-
-    /**
-     * The feature id for the '<em><b>Name</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int ELEMENT_DATA__NAME = 0;
-
-    /**
-     * The feature id for the '<em><b>Attributes</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int ELEMENT_DATA__ATTRIBUTES = 1;
-
-    /**
-     * The number of structural features of the '<em>Element Data</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int ELEMENT_DATA_FEATURE_COUNT = 2;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.impl.AttributeDataImpl <em>Attribute Data</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.impl.AttributeDataImpl
-     * @see org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.impl.AddTagMDPackageImpl#getAttributeData()
-     * @generated
-     */
-    int ATTRIBUTE_DATA = 1;
-
-    /**
-     * The feature id for the '<em><b>Name</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int ATTRIBUTE_DATA__NAME = 0;
-
-    /**
-     * The feature id for the '<em><b>Usage</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int ATTRIBUTE_DATA__USAGE = 1;
-
-    /**
-     * The feature id for the '<em><b>Description</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int ATTRIBUTE_DATA__DESCRIPTION = 2;
-
-    /**
-     * The number of structural features of the '<em>Attribute Data</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int ATTRIBUTE_DATA_FEATURE_COUNT = 3;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AttributeUsage <em>Attribute Usage</em>}' enum.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AttributeUsage
-     * @see org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.impl.AddTagMDPackageImpl#getAttributeUsage()
-     * @generated
-     */
-    int ATTRIBUTE_USAGE = 2;
-
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.ElementData <em>Element Data</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Element Data</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.ElementData
-     * @generated
-     */
-    EClass getElementData();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.ElementData#getName <em>Name</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Name</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.ElementData#getName()
-     * @see #getElementData()
-     * @generated
-     */
-    EAttribute getElementData_Name();
-
-    /**
-     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.ElementData#getAttributes <em>Attributes</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the containment reference list '<em>Attributes</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.ElementData#getAttributes()
-     * @see #getElementData()
-     * @generated
-     */
-    EReference getElementData_Attributes();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AttributeData <em>Attribute Data</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Attribute Data</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AttributeData
-     * @generated
-     */
-    EClass getAttributeData();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AttributeData#getName <em>Name</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Name</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AttributeData#getName()
-     * @see #getAttributeData()
-     * @generated
-     */
-    EAttribute getAttributeData_Name();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AttributeData#getUsage <em>Usage</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Usage</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AttributeData#getUsage()
-     * @see #getAttributeData()
-     * @generated
-     */
-    EAttribute getAttributeData_Usage();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AttributeData#getDescription <em>Description</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Description</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AttributeData#getDescription()
-     * @see #getAttributeData()
-     * @generated
-     */
-    EAttribute getAttributeData_Description();
-
-    /**
-     * Returns the meta object for enum '{@link org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AttributeUsage <em>Attribute Usage</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for enum '<em>Attribute Usage</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AttributeUsage
-     * @generated
-     */
-    EEnum getAttributeUsage();
-
-    /**
-     * Returns the factory that creates the instances of the model.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the factory that creates the instances of the model.
-     * @generated
-     */
-    AddTagMDFactory getAddTagMDFactory();
-
-    /**
-     * <!-- begin-user-doc -->
-     * Defines literals for the meta objects that represent
-     * <ul>
-     *   <li>each class,</li>
-     *   <li>each feature of each class,</li>
-     *   <li>each enum,</li>
-     *   <li>and each data type</li>
-     * </ul>
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @SuppressWarnings("hiding")
-    interface Literals
-    {
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.impl.ElementDataImpl <em>Element Data</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.impl.ElementDataImpl
-         * @see org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.impl.AddTagMDPackageImpl#getElementData()
-         * @generated
-         */
-        EClass ELEMENT_DATA = eINSTANCE.getElementData();
-
-        /**
-         * The meta object literal for the '<em><b>Name</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute ELEMENT_DATA__NAME = eINSTANCE.getElementData_Name();
-
-        /**
-         * The meta object literal for the '<em><b>Attributes</b></em>' containment reference list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference ELEMENT_DATA__ATTRIBUTES = eINSTANCE.getElementData_Attributes();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.impl.AttributeDataImpl <em>Attribute Data</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.impl.AttributeDataImpl
-         * @see org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.impl.AddTagMDPackageImpl#getAttributeData()
-         * @generated
-         */
-        EClass ATTRIBUTE_DATA = eINSTANCE.getAttributeData();
-
-        /**
-         * The meta object literal for the '<em><b>Name</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute ATTRIBUTE_DATA__NAME = eINSTANCE.getAttributeData_Name();
-
-        /**
-         * The meta object literal for the '<em><b>Usage</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute ATTRIBUTE_DATA__USAGE = eINSTANCE.getAttributeData_Usage();
-
-        /**
-         * The meta object literal for the '<em><b>Description</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute ATTRIBUTE_DATA__DESCRIPTION = eINSTANCE.getAttributeData_Description();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AttributeUsage <em>Attribute Usage</em>}' enum.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AttributeUsage
-         * @see org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.impl.AddTagMDPackageImpl#getAttributeUsage()
-         * @generated
-         */
-        EEnum ATTRIBUTE_USAGE = eINSTANCE.getAttributeUsage();
-
-    }
-
-} //AddTagMDPackage
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/addtagmd/AttributeData.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/addtagmd/AttributeData.java
deleted file mode 100644
index 1ffa635..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/addtagmd/AttributeData.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: AttributeData.java,v 1.1 2010/03/08 18:49:41 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Attribute Data</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AttributeData#getName <em>Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AttributeData#getUsage <em>Usage</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AttributeData#getDescription <em>Description</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AddTagMDPackage#getAttributeData()
- * @model
- * @generated
- */
-public interface AttributeData extends EObject
-{
-    /**
-     * Returns the value of the '<em><b>Name</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Name</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Name</em>' attribute.
-     * @see #setName(String)
-     * @see org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AddTagMDPackage#getAttributeData_Name()
-     * @model extendedMetaData="kind='element' name='name'"
-     * @generated
-     */
-    String getName();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AttributeData#getName <em>Name</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Name</em>' attribute.
-     * @see #getName()
-     * @generated
-     */
-    void setName(String value);
-
-    /**
-     * Returns the value of the '<em><b>Usage</b></em>' attribute.
-     * The literals are from the enumeration {@link org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AttributeUsage}.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Usage</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Usage</em>' attribute.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AttributeUsage
-     * @see #setUsage(AttributeUsage)
-     * @see org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AddTagMDPackage#getAttributeData_Usage()
-     * @model extendedMetaData="kind='element' name='usage'"
-     * @generated
-     */
-    AttributeUsage getUsage();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AttributeData#getUsage <em>Usage</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Usage</em>' attribute.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AttributeUsage
-     * @see #getUsage()
-     * @generated
-     */
-    void setUsage(AttributeUsage value);
-
-    /**
-     * Returns the value of the '<em><b>Description</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Description</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Description</em>' attribute.
-     * @see #setDescription(String)
-     * @see org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AddTagMDPackage#getAttributeData_Description()
-     * @model extendedMetaData="kind='element' name='description'"
-     * @generated
-     */
-    String getDescription();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AttributeData#getDescription <em>Description</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Description</em>' attribute.
-     * @see #getDescription()
-     * @generated
-     */
-    void setDescription(String value);
-
-} // AttributeData
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/addtagmd/AttributeUsage.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/addtagmd/AttributeUsage.java
deleted file mode 100644
index f8bee81..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/addtagmd/AttributeUsage.java
+++ /dev/null
@@ -1,287 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: AttributeUsage.java,v 1.1 2010/03/08 18:49:41 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd;
-
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.emf.common.util.Enumerator;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the literals of the enumeration '<em><b>Attribute Usage</b></em>',
- * and utility methods for working with them.
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AddTagMDPackage#getAttributeUsage()
- * @model
- * @generated
- */
-public enum AttributeUsage implements Enumerator
-{
-    /**
-     * The '<em><b>OPTIONAL</b></em>' literal object.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #OPTIONAL_VALUE
-     * @generated
-     * @ordered
-     */
-    OPTIONAL(0, "OPTIONAL", "OPTIONAL"), //$NON-NLS-1$ //$NON-NLS-2$
-
-    /**
-     * The '<em><b>REQUIRED</b></em>' literal object.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #REQUIRED_VALUE
-     * @generated
-     * @ordered
-     */
-    REQUIRED(1, "REQUIRED", "REQUIRED"), //$NON-NLS-1$ //$NON-NLS-2$
-
-    /**
-     * The '<em><b>FIXED</b></em>' literal object.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #FIXED_VALUE
-     * @generated
-     * @ordered
-     */
-    FIXED(2, "FIXED", "FIXED"), //$NON-NLS-1$ //$NON-NLS-2$
-
-    /**
-     * The '<em><b>PROHIBITED</b></em>' literal object.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #PROHIBITED_VALUE
-     * @generated
-     * @ordered
-     */
-    PROHIBITED(3, "PROHIBITED", "PROHIBITED"); //$NON-NLS-1$ //$NON-NLS-2$
-
-    /**
-     * The '<em><b>OPTIONAL</b></em>' literal value.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of '<em><b>OPTIONAL</b></em>' literal object isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @see #OPTIONAL
-     * @model
-     * @generated
-     * @ordered
-     */
-    public static final int OPTIONAL_VALUE = 0;
-
-    /**
-     * The '<em><b>REQUIRED</b></em>' literal value.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of '<em><b>REQUIRED</b></em>' literal object isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @see #REQUIRED
-     * @model
-     * @generated
-     * @ordered
-     */
-    public static final int REQUIRED_VALUE = 1;
-
-    /**
-     * The '<em><b>FIXED</b></em>' literal value.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of '<em><b>FIXED</b></em>' literal object isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @see #FIXED
-     * @model
-     * @generated
-     * @ordered
-     */
-    public static final int FIXED_VALUE = 2;
-
-    /**
-     * The '<em><b>PROHIBITED</b></em>' literal value.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of '<em><b>PROHIBITED</b></em>' literal object isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @see #PROHIBITED
-     * @model
-     * @generated
-     * @ordered
-     */
-    public static final int PROHIBITED_VALUE = 3;
-
-    /**
-     * An array of all the '<em><b>Attribute Usage</b></em>' enumerators.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private static final AttributeUsage[] VALUES_ARRAY =
-        new AttributeUsage[]
-        {
-            OPTIONAL,
-            REQUIRED,
-            FIXED,
-            PROHIBITED,
-        };
-
-    /**
-     * A public read-only list of all the '<em><b>Attribute Usage</b></em>' enumerators.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public static final List<AttributeUsage> VALUES = Collections.unmodifiableList(Arrays.asList(VALUES_ARRAY));
-
-    /**
-     * Returns the '<em><b>Attribute Usage</b></em>' literal with the specified literal value.
-     * <!-- begin-user-doc -->
-     * @param literal 
-     * @return the attribute usage
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public static AttributeUsage get(String literal)
-    {
-        for (int i = 0; i < VALUES_ARRAY.length; ++i)
-        {
-            AttributeUsage result = VALUES_ARRAY[i];
-            if (result.toString().equals(literal))
-            {
-                return result;
-            }
-        }
-        return null;
-    }
-
-    /**
-     * Returns the '<em><b>Attribute Usage</b></em>' literal with the specified name.
-     * <!-- begin-user-doc -->
-     * @param name 
-     * @return the attribute usage
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public static AttributeUsage getByName(String name)
-    {
-        for (int i = 0; i < VALUES_ARRAY.length; ++i)
-        {
-            AttributeUsage result = VALUES_ARRAY[i];
-            if (result.getName().equals(name))
-            {
-                return result;
-            }
-        }
-        return null;
-    }
-
-    /**
-     * Returns the '<em><b>Attribute Usage</b></em>' literal with the specified integer value.
-     * <!-- begin-user-doc -->
-     * @param value 
-     * @return the attribute usage
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public static AttributeUsage get(int value)
-    {
-        switch (value)
-        {
-            case OPTIONAL_VALUE: return OPTIONAL;
-            case REQUIRED_VALUE: return REQUIRED;
-            case FIXED_VALUE: return FIXED;
-            case PROHIBITED_VALUE: return PROHIBITED;
-        }
-        return null;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private final int value;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private final String name;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private final String literal;
-
-    /**
-     * Only this class can construct instances.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private AttributeUsage(int value, String name, String literal)
-    {
-        this.value = value;
-        this.name = name;
-        this.literal = literal;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public int getValue()
-    {
-      return value;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String getName()
-    {
-      return name;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String getLiteral()
-    {
-      return literal;
-    }
-
-    /**
-     * Returns the literal value of the enumerator, which is its string representation.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public String toString()
-    {
-        return literal;
-    }
-    
-} //AttributeUsage
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/addtagmd/ElementData.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/addtagmd/ElementData.java
deleted file mode 100644
index 2e0d68f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/addtagmd/ElementData.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ElementData.java,v 1.1 2010/03/08 18:49:41 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd;
-
-import org.eclipse.emf.common.util.EList;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Element Data</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.ElementData#getName <em>Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.ElementData#getAttributes <em>Attributes</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AddTagMDPackage#getElementData()
- * @model
- * @generated
- */
-public interface ElementData extends EObject
-{
-    /**
-     * Returns the value of the '<em><b>Name</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Name</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Name</em>' attribute.
-     * @see #setName(String)
-     * @see org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AddTagMDPackage#getElementData_Name()
-     * @model extendedMetaData="kind='element' name='name'"
-     * @generated
-     */
-    String getName();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.ElementData#getName <em>Name</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Name</em>' attribute.
-     * @see #getName()
-     * @generated
-     */
-    void setName(String value);
-
-    /**
-     * Returns the value of the '<em><b>Attributes</b></em>' containment reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AttributeData}.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Attributes</em>' reference list isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Attributes</em>' containment reference list.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AddTagMDPackage#getElementData_Attributes()
-     * @model containment="true"
-     *        extendedMetaData="kind='element' name='attribute'"
-     * @generated
-     */
-    EList<AttributeData> getAttributes();
-
-} // ElementData
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/addtagmd/impl/AddTagMDFactoryImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/addtagmd/impl/AddTagMDFactoryImpl.java
deleted file mode 100644
index 44fc555..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/addtagmd/impl/AddTagMDFactoryImpl.java
+++ /dev/null
@@ -1,187 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: AddTagMDFactoryImpl.java,v 1.1 2010/03/08 18:49:41 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EDataType;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EPackage;
-
-import org.eclipse.emf.ecore.impl.EFactoryImpl;
-
-import org.eclipse.emf.ecore.plugin.EcorePlugin;
-
-import org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.*;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model <b>Factory</b>.
- * <!-- end-user-doc -->
- * @generated
- */
-public class AddTagMDFactoryImpl extends EFactoryImpl implements AddTagMDFactory
-{
-    /**
-     * Creates the default factory implementation.
-     * <!-- begin-user-doc -->
-     * @return the factory
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public static AddTagMDFactory init()
-    {
-        try
-        {
-            AddTagMDFactory theAddTagMDFactory = (AddTagMDFactory)EPackage.Registry.INSTANCE.getEFactory("http://org.eclipse.jst.jsf.facelet.core/additionalTagMetadata.ecore"); //$NON-NLS-1$ 
-            if (theAddTagMDFactory != null)
-            {
-                return theAddTagMDFactory;
-            }
-        }
-        catch (Exception exception)
-        {
-            EcorePlugin.INSTANCE.log(exception);
-        }
-        return new AddTagMDFactoryImpl();
-    }
-
-    /**
-     * Creates an instance of the factory.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public AddTagMDFactoryImpl()
-    {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public EObject create(EClass eClass)
-    {
-        switch (eClass.getClassifierID())
-        {
-            case AddTagMDPackage.ELEMENT_DATA: return createElementData();
-            case AddTagMDPackage.ATTRIBUTE_DATA: return createAttributeData();
-            default:
-                throw new IllegalArgumentException("The class '" + eClass.getName() + "' is not a valid classifier"); //$NON-NLS-1$ //$NON-NLS-2$
-        }
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public Object createFromString(EDataType eDataType, String initialValue)
-    {
-        switch (eDataType.getClassifierID())
-        {
-            case AddTagMDPackage.ATTRIBUTE_USAGE:
-                return createAttributeUsageFromString(eDataType, initialValue);
-            default:
-                throw new IllegalArgumentException("The datatype '" + eDataType.getName() + "' is not a valid classifier"); //$NON-NLS-1$ //$NON-NLS-2$
-        }
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public String convertToString(EDataType eDataType, Object instanceValue)
-    {
-        switch (eDataType.getClassifierID())
-        {
-            case AddTagMDPackage.ATTRIBUTE_USAGE:
-                return convertAttributeUsageToString(eDataType, instanceValue);
-            default:
-                throw new IllegalArgumentException("The datatype '" + eDataType.getName() + "' is not a valid classifier"); //$NON-NLS-1$ //$NON-NLS-2$
-        }
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public ElementData createElementData()
-    {
-        ElementDataImpl elementData = new ElementDataImpl();
-        return elementData;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public AttributeData createAttributeData()
-    {
-        AttributeDataImpl attributeData = new AttributeDataImpl();
-        return attributeData;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param eDataType 
-     * @param initialValue 
-     * @return the attribute usage
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public AttributeUsage createAttributeUsageFromString(EDataType eDataType, String initialValue)
-    {
-        AttributeUsage result = AttributeUsage.get(initialValue);
-        if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-        return result;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param eDataType 
-     * @param instanceValue 
-     * @return the usage string
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String convertAttributeUsageToString(EDataType eDataType, Object instanceValue)
-    {
-        return instanceValue == null ? null : instanceValue.toString();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public AddTagMDPackage getAddTagMDPackage()
-    {
-        return (AddTagMDPackage)getEPackage();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return the package
-     * <!-- end-user-doc -->
-     * @deprecated
-     * @generated
-     */
-    @Deprecated
-    public static AddTagMDPackage getPackage()
-    {
-        return AddTagMDPackage.eINSTANCE;
-    }
-
-} //AddTagMDFactoryImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/addtagmd/impl/AddTagMDPackageImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/addtagmd/impl/AddTagMDPackageImpl.java
deleted file mode 100644
index 743afa0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/addtagmd/impl/AddTagMDPackageImpl.java
+++ /dev/null
@@ -1,352 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: AddTagMDPackageImpl.java,v 1.1 2010/03/08 18:49:41 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.impl;
-
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EEnum;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.EReference;
-
-import org.eclipse.emf.ecore.impl.EPackageImpl;
-
-import org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AddTagMDFactory;
-import org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AddTagMDPackage;
-import org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AttributeData;
-import org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AttributeUsage;
-import org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.ElementData;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model <b>Package</b>.
- * <!-- end-user-doc -->
- * @generated
- */
-public class AddTagMDPackageImpl extends EPackageImpl implements AddTagMDPackage
-{
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass elementDataEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass attributeDataEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EEnum attributeUsageEEnum = null;
-
-    /**
-     * Creates an instance of the model <b>Package</b>, registered with
-     * {@link org.eclipse.emf.ecore.EPackage.Registry EPackage.Registry} by the package
-     * package URI value.
-     * <p>Note: the correct way to create the package is via the static
-     * factory method {@link #init init()}, which also performs
-     * initialization of the package, or returns the registered package,
-     * if one already exists.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.emf.ecore.EPackage.Registry
-     * @see org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AddTagMDPackage#eNS_URI
-     * @see #init()
-     * @generated
-     */
-    private AddTagMDPackageImpl()
-    {
-        super(eNS_URI, AddTagMDFactory.eINSTANCE);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private static boolean isInited = false;
-
-    /**
-     * Creates, registers, and initializes the <b>Package</b> for this
-     * model, and for any others upon which it depends.  Simple
-     * dependencies are satisfied by calling this method on all
-     * dependent packages before doing anything else.  This method drives
-     * initialization for interdependent packages directly, in parallel
-     * with this package, itself.
-     * <p>Of this package and its interdependencies, all packages which
-     * have not yet been registered by their URI values are first created
-     * and registered.  The packages are then initialized in two steps:
-     * meta-model objects for all of the packages are created before any
-     * are initialized, since one package's meta-model objects may refer to
-     * those of another.
-     * <p>Invocation of this method will not affect any packages that have
-     * already been initialized.
-     * <!-- begin-user-doc -->
-     * @return the package
-     * <!-- end-user-doc -->
-     * @see #eNS_URI
-     * @see #createPackageContents()
-     * @see #initializePackageContents()
-     * @generated
-     */
-    public static AddTagMDPackage init()
-    {
-        if (isInited) return (AddTagMDPackage)EPackage.Registry.INSTANCE.getEPackage(AddTagMDPackage.eNS_URI);
-
-        // Obtain or create and register package
-        AddTagMDPackageImpl theAddTagMDPackage = (AddTagMDPackageImpl)(EPackage.Registry.INSTANCE.getEPackage(eNS_URI) instanceof AddTagMDPackageImpl ? EPackage.Registry.INSTANCE.getEPackage(eNS_URI) : new AddTagMDPackageImpl());
-
-        isInited = true;
-
-        // Create package meta-data objects
-        theAddTagMDPackage.createPackageContents();
-
-        // Initialize created meta-data
-        theAddTagMDPackage.initializePackageContents();
-
-        // Mark meta-data to indicate it can't be changed
-        theAddTagMDPackage.freeze();
-
-        return theAddTagMDPackage;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getElementData()
-    {
-        return elementDataEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getElementData_Name()
-    {
-        return (EAttribute)elementDataEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EReference getElementData_Attributes()
-    {
-        return (EReference)elementDataEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getAttributeData()
-    {
-        return attributeDataEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getAttributeData_Name()
-    {
-        return (EAttribute)attributeDataEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getAttributeData_Usage()
-    {
-        return (EAttribute)attributeDataEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getAttributeData_Description()
-    {
-        return (EAttribute)attributeDataEClass.getEStructuralFeatures().get(2);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EEnum getAttributeUsage()
-    {
-        return attributeUsageEEnum;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public AddTagMDFactory getAddTagMDFactory()
-    {
-        return (AddTagMDFactory)getEFactoryInstance();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private boolean isCreated = false;
-
-    /**
-     * Creates the meta-model objects for the package.  This method is
-     * guarded to have no affect on any invocation but its first.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void createPackageContents()
-    {
-        if (isCreated) return;
-        isCreated = true;
-
-        // Create classes and their features
-        elementDataEClass = createEClass(ELEMENT_DATA);
-        createEAttribute(elementDataEClass, ELEMENT_DATA__NAME);
-        createEReference(elementDataEClass, ELEMENT_DATA__ATTRIBUTES);
-
-        attributeDataEClass = createEClass(ATTRIBUTE_DATA);
-        createEAttribute(attributeDataEClass, ATTRIBUTE_DATA__NAME);
-        createEAttribute(attributeDataEClass, ATTRIBUTE_DATA__USAGE);
-        createEAttribute(attributeDataEClass, ATTRIBUTE_DATA__DESCRIPTION);
-
-        // Create enums
-        attributeUsageEEnum = createEEnum(ATTRIBUTE_USAGE);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private boolean isInitialized = false;
-
-    /**
-     * Complete the initialization of the package and its meta-model.  This
-     * method is guarded to have no affect on any invocation but its first.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void initializePackageContents()
-    {
-        if (isInitialized) return;
-        isInitialized = true;
-
-        // Initialize package
-        setName(eNAME);
-        setNsPrefix(eNS_PREFIX);
-        setNsURI(eNS_URI);
-
-        // Create type parameters
-
-        // Set bounds for type parameters
-
-        // Add supertypes to classes
-
-        // Initialize classes and features; add operations and parameters
-        initEClass(elementDataEClass, ElementData.class, "ElementData", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-        initEAttribute(getElementData_Name(), ecorePackage.getEString(), "name", null, 0, 1, ElementData.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-        initEReference(getElementData_Attributes(), this.getAttributeData(), null, "attributes", null, 0, -1, ElementData.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-        initEClass(attributeDataEClass, AttributeData.class, "AttributeData", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-        initEAttribute(getAttributeData_Name(), ecorePackage.getEString(), "name", null, 0, 1, AttributeData.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-        initEAttribute(getAttributeData_Usage(), this.getAttributeUsage(), "usage", null, 0, 1, AttributeData.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-        initEAttribute(getAttributeData_Description(), ecorePackage.getEString(), "description", null, 0, 1, AttributeData.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-        // Initialize enums and add enum literals
-        initEEnum(attributeUsageEEnum, AttributeUsage.class, "AttributeUsage"); //$NON-NLS-1$
-        addEEnumLiteral(attributeUsageEEnum, AttributeUsage.OPTIONAL);
-        addEEnumLiteral(attributeUsageEEnum, AttributeUsage.REQUIRED);
-        addEEnumLiteral(attributeUsageEEnum, AttributeUsage.FIXED);
-        addEEnumLiteral(attributeUsageEEnum, AttributeUsage.PROHIBITED);
-
-        // Create resource
-        createResource(eNS_URI);
-
-        // Create annotations
-        // http:///org/eclipse/emf/ecore/util/ExtendedMetaData
-        createExtendedMetaDataAnnotations();
-    }
-
-    /**
-     * Initializes the annotations for <b>http:///org/eclipse/emf/ecore/util/ExtendedMetaData</b>.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected void createExtendedMetaDataAnnotations()
-    {
-        String source = "http:///org/eclipse/emf/ecore/util/ExtendedMetaData"; //$NON-NLS-1$		
-        addAnnotation
-          (getElementData_Name(), 
-           source, 
-           new String[] 
-           {
-             "kind", "element", //$NON-NLS-1$ //$NON-NLS-2$
-             "name", "name" //$NON-NLS-1$ //$NON-NLS-2$
-           });		
-        addAnnotation
-          (getElementData_Attributes(), 
-           source, 
-           new String[] 
-           {
-             "kind", "element", //$NON-NLS-1$ //$NON-NLS-2$
-             "name", "attribute" //$NON-NLS-1$ //$NON-NLS-2$
-           });		
-        addAnnotation
-          (getAttributeData_Name(), 
-           source, 
-           new String[] 
-           {
-             "kind", "element", //$NON-NLS-1$ //$NON-NLS-2$
-             "name", "name" //$NON-NLS-1$ //$NON-NLS-2$
-           });		
-        addAnnotation
-          (getAttributeData_Usage(), 
-           source, 
-           new String[] 
-           {
-             "kind", "element", //$NON-NLS-1$ //$NON-NLS-2$
-             "name", "usage" //$NON-NLS-1$ //$NON-NLS-2$
-           });		
-        addAnnotation
-          (getAttributeData_Description(), 
-           source, 
-           new String[] 
-           {
-             "kind", "element", //$NON-NLS-1$ //$NON-NLS-2$
-             "name", "description" //$NON-NLS-1$ //$NON-NLS-2$
-           });
-    }
-
-} //AddTagMDPackageImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/addtagmd/impl/AttributeDataImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/addtagmd/impl/AttributeDataImpl.java
deleted file mode 100644
index 6e47d33..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/addtagmd/impl/AttributeDataImpl.java
+++ /dev/null
@@ -1,294 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: AttributeDataImpl.java,v 1.1 2010/03/08 18:49:41 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-
-import org.eclipse.emf.ecore.EClass;
-
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-
-import org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AddTagMDPackage;
-import org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AttributeData;
-import org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AttributeUsage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Attribute Data</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.impl.AttributeDataImpl#getName <em>Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.impl.AttributeDataImpl#getUsage <em>Usage</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.impl.AttributeDataImpl#getDescription <em>Description</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class AttributeDataImpl extends EObjectImpl implements AttributeData
-{
-    /**
-     * The default value of the '{@link #getName() <em>Name</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getName()
-     * @generated
-     * @ordered
-     */
-    protected static final String NAME_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getName() <em>Name</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getName()
-     * @generated
-     * @ordered
-     */
-    protected String name = NAME_EDEFAULT;
-
-    /**
-     * The default value of the '{@link #getUsage() <em>Usage</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getUsage()
-     * @generated
-     * @ordered
-     */
-    protected static final AttributeUsage USAGE_EDEFAULT = AttributeUsage.OPTIONAL;
-
-    /**
-     * The cached value of the '{@link #getUsage() <em>Usage</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getUsage()
-     * @generated
-     * @ordered
-     */
-    protected AttributeUsage usage = USAGE_EDEFAULT;
-
-    /**
-     * The default value of the '{@link #getDescription() <em>Description</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getDescription()
-     * @generated
-     * @ordered
-     */
-    protected static final String DESCRIPTION_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getDescription() <em>Description</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getDescription()
-     * @generated
-     * @ordered
-     */
-    protected String description = DESCRIPTION_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected AttributeDataImpl()
-    {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    protected EClass eStaticClass()
-    {
-        return AddTagMDPackage.Literals.ATTRIBUTE_DATA;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String getName()
-    {
-        return name;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setName(String newName)
-    {
-        String oldName = name;
-        name = newName;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, AddTagMDPackage.ATTRIBUTE_DATA__NAME, oldName, name));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public AttributeUsage getUsage()
-    {
-        return usage;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setUsage(AttributeUsage newUsage)
-    {
-        AttributeUsage oldUsage = usage;
-        usage = newUsage == null ? USAGE_EDEFAULT : newUsage;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, AddTagMDPackage.ATTRIBUTE_DATA__USAGE, oldUsage, usage));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String getDescription()
-    {
-        return description;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setDescription(String newDescription)
-    {
-        String oldDescription = description;
-        description = newDescription;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, AddTagMDPackage.ATTRIBUTE_DATA__DESCRIPTION, oldDescription, description));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public Object eGet(int featureID, boolean resolve, boolean coreType)
-    {
-        switch (featureID)
-        {
-            case AddTagMDPackage.ATTRIBUTE_DATA__NAME:
-                return getName();
-            case AddTagMDPackage.ATTRIBUTE_DATA__USAGE:
-                return getUsage();
-            case AddTagMDPackage.ATTRIBUTE_DATA__DESCRIPTION:
-                return getDescription();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public void eSet(int featureID, Object newValue)
-    {
-        switch (featureID)
-        {
-            case AddTagMDPackage.ATTRIBUTE_DATA__NAME:
-                setName((String)newValue);
-                return;
-            case AddTagMDPackage.ATTRIBUTE_DATA__USAGE:
-                setUsage((AttributeUsage)newValue);
-                return;
-            case AddTagMDPackage.ATTRIBUTE_DATA__DESCRIPTION:
-                setDescription((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public void eUnset(int featureID)
-    {
-        switch (featureID)
-        {
-            case AddTagMDPackage.ATTRIBUTE_DATA__NAME:
-                setName(NAME_EDEFAULT);
-                return;
-            case AddTagMDPackage.ATTRIBUTE_DATA__USAGE:
-                setUsage(USAGE_EDEFAULT);
-                return;
-            case AddTagMDPackage.ATTRIBUTE_DATA__DESCRIPTION:
-                setDescription(DESCRIPTION_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public boolean eIsSet(int featureID)
-    {
-        switch (featureID)
-        {
-            case AddTagMDPackage.ATTRIBUTE_DATA__NAME:
-                return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT.equals(name);
-            case AddTagMDPackage.ATTRIBUTE_DATA__USAGE:
-                return usage != USAGE_EDEFAULT;
-            case AddTagMDPackage.ATTRIBUTE_DATA__DESCRIPTION:
-                return DESCRIPTION_EDEFAULT == null ? description != null : !DESCRIPTION_EDEFAULT.equals(description);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public String toString()
-    {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (name: "); //$NON-NLS-1$
-        result.append(name);
-        result.append(", usage: "); //$NON-NLS-1$
-        result.append(usage);
-        result.append(", description: "); //$NON-NLS-1$
-        result.append(description);
-        result.append(')');
-        return result.toString();
-    }
-
-} //AttributeDataImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/addtagmd/impl/ElementDataImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/addtagmd/impl/ElementDataImpl.java
deleted file mode 100644
index 4860f62..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/addtagmd/impl/ElementDataImpl.java
+++ /dev/null
@@ -1,239 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ElementDataImpl.java,v 1.1 2010/03/08 18:49:41 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AddTagMDPackage;
-import org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AttributeData;
-import org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.ElementData;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Element Data</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.impl.ElementDataImpl#getName <em>Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.impl.ElementDataImpl#getAttributes <em>Attributes</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ElementDataImpl extends EObjectImpl implements ElementData
-{
-    /**
-     * The default value of the '{@link #getName() <em>Name</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getName()
-     * @generated
-     * @ordered
-     */
-    protected static final String NAME_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getName() <em>Name</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getName()
-     * @generated
-     * @ordered
-     */
-    protected String name = NAME_EDEFAULT;
-
-    /**
-     * The cached value of the '{@link #getAttributes() <em>Attributes</em>}' containment reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getAttributes()
-     * @generated
-     * @ordered
-     */
-    protected EList<AttributeData> attributes;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected ElementDataImpl()
-    {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    protected EClass eStaticClass()
-    {
-        return AddTagMDPackage.Literals.ELEMENT_DATA;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String getName()
-    {
-        return name;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setName(String newName)
-    {
-        String oldName = name;
-        name = newName;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, AddTagMDPackage.ELEMENT_DATA__NAME, oldName, name));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EList<AttributeData> getAttributes()
-    {
-        if (attributes == null)
-        {
-            attributes = new EObjectContainmentEList<AttributeData>(AttributeData.class, this, AddTagMDPackage.ELEMENT_DATA__ATTRIBUTES);
-        }
-        return attributes;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
-    {
-        switch (featureID)
-        {
-            case AddTagMDPackage.ELEMENT_DATA__ATTRIBUTES:
-                return ((InternalEList<?>)getAttributes()).basicRemove(otherEnd, msgs);
-        }
-        return super.eInverseRemove(otherEnd, featureID, msgs);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public Object eGet(int featureID, boolean resolve, boolean coreType)
-    {
-        switch (featureID)
-        {
-            case AddTagMDPackage.ELEMENT_DATA__NAME:
-                return getName();
-            case AddTagMDPackage.ELEMENT_DATA__ATTRIBUTES:
-                return getAttributes();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @SuppressWarnings("unchecked")
-    @Override
-    public void eSet(int featureID, Object newValue)
-    {
-        switch (featureID)
-        {
-            case AddTagMDPackage.ELEMENT_DATA__NAME:
-                setName((String)newValue);
-                return;
-            case AddTagMDPackage.ELEMENT_DATA__ATTRIBUTES:
-                getAttributes().clear();
-                getAttributes().addAll((Collection<? extends AttributeData>)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public void eUnset(int featureID)
-    {
-        switch (featureID)
-        {
-            case AddTagMDPackage.ELEMENT_DATA__NAME:
-                setName(NAME_EDEFAULT);
-                return;
-            case AddTagMDPackage.ELEMENT_DATA__ATTRIBUTES:
-                getAttributes().clear();
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public boolean eIsSet(int featureID)
-    {
-        switch (featureID)
-        {
-            case AddTagMDPackage.ELEMENT_DATA__NAME:
-                return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT.equals(name);
-            case AddTagMDPackage.ELEMENT_DATA__ATTRIBUTES:
-                return attributes != null && !attributes.isEmpty();
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public String toString()
-    {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (name: "); //$NON-NLS-1$
-        result.append(name);
-        result.append(')');
-        return result.toString();
-    }
-
-} //ElementDataImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/addtagmd/provider/AddTagMDItemProviderAdapterFactory.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/addtagmd/provider/AddTagMDItemProviderAdapterFactory.java
deleted file mode 100644
index 4d23f22..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/addtagmd/provider/AddTagMDItemProviderAdapterFactory.java
+++ /dev/null
@@ -1,246 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: AddTagMDItemProviderAdapterFactory.java,v 1.1 2010/03/08 18:49:40 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.provider;
-
-import java.util.ArrayList;
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.Notifier;
-
-import org.eclipse.emf.edit.provider.ChangeNotifier;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
-import org.eclipse.emf.edit.provider.IChangeNotifier;
-import org.eclipse.emf.edit.provider.IDisposable;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.INotifyChangedListener;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-
-import org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.util.AddTagMDAdapterFactory;
-
-/**
- * This is the factory that is used to provide the interfaces needed to support Viewers.
- * The adapters generated by this factory convert EMF adapter notifications into calls to {@link #fireNotifyChanged fireNotifyChanged}.
- * The adapters also support Eclipse property sheets.
- * Note that most of the adapters are shared among multiple instances.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class AddTagMDItemProviderAdapterFactory extends AddTagMDAdapterFactory implements ComposeableAdapterFactory, IChangeNotifier, IDisposable
-{
-    /**
-     * This keeps track of the root adapter factory that delegates to this adapter factory.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected ComposedAdapterFactory parentAdapterFactory;
-
-    /**
-     * This is used to implement {@link org.eclipse.emf.edit.provider.IChangeNotifier}.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected IChangeNotifier changeNotifier = new ChangeNotifier();
-
-    /**
-     * This keeps track of all the supported types checked by {@link #isFactoryForType isFactoryForType}.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected Collection<Object> supportedTypes = new ArrayList<Object>();
-
-    /**
-     * This constructs an instance.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated NOT
-     */
-    public AddTagMDItemProviderAdapterFactory()
-    {
-        supportedTypes.add(IEditingDomainItemProvider.class);
-        supportedTypes.add(IStructuredItemContentProvider.class);
-        supportedTypes.add(ITreeItemContentProvider.class);
-        supportedTypes.add(IItemLabelProvider.class);
-        supportedTypes.add(IItemPropertySource.class);
-        supportedTypes.add(IResourceProvider.class);
-    }
-
-    /**
-     * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.ElementData} instances.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected ElementDataItemProvider elementDataItemProvider;
-
-    /**
-     * This creates an adapter for a {@link org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.ElementData}.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public Adapter createElementDataAdapter()
-    {
-        if (elementDataItemProvider == null)
-        {
-            elementDataItemProvider = new ElementDataItemProvider(this);
-        }
-
-        return elementDataItemProvider;
-    }
-
-    /**
-     * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AttributeData} instances.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected AttributeDataItemProvider attributeDataItemProvider;
-
-    /**
-     * This creates an adapter for a {@link org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AttributeData}.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public Adapter createAttributeDataAdapter()
-    {
-        if (attributeDataItemProvider == null)
-        {
-            attributeDataItemProvider = new AttributeDataItemProvider(this);
-        }
-
-        return attributeDataItemProvider;
-    }
-
-    /**
-     * This returns the root adapter factory that contains this factory.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public ComposeableAdapterFactory getRootAdapterFactory()
-    {
-        return parentAdapterFactory == null ? this : parentAdapterFactory.getRootAdapterFactory();
-    }
-
-    /**
-     * This sets the composed adapter factory that contains this factory.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setParentAdapterFactory(ComposedAdapterFactory parentAdapterFactory)
-    {
-        this.parentAdapterFactory = parentAdapterFactory;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public boolean isFactoryForType(Object type)
-    {
-        return supportedTypes.contains(type) || super.isFactoryForType(type);
-    }
-
-    /**
-     * This implementation substitutes the factory itself as the key for the adapter.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public Adapter adapt(Notifier notifier, Object type)
-    {
-        return super.adapt(notifier, this);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public Object adapt(Object object, Object type)
-    {
-        if (isFactoryForType(type))
-        {
-            Object adapter = super.adapt(object, type);
-            if (!(type instanceof Class) || (((Class<?>)type).isInstance(adapter)))
-            {
-                return adapter;
-            }
-        }
-
-        return null;
-    }
-
-    /**
-     * This adds a listener.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void addListener(INotifyChangedListener notifyChangedListener)
-    {
-        changeNotifier.addListener(notifyChangedListener);
-    }
-
-    /**
-     * This removes a listener.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void removeListener(INotifyChangedListener notifyChangedListener)
-    {
-        changeNotifier.removeListener(notifyChangedListener);
-    }
-
-    /**
-     * This delegates to {@link #changeNotifier} and to {@link #parentAdapterFactory}.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void fireNotifyChanged(Notification notification)
-    {
-        changeNotifier.fireNotifyChanged(notification);
-
-        if (parentAdapterFactory != null)
-        {
-            parentAdapterFactory.fireNotifyChanged(notification);
-        }
-    }
-
-    /**
-     * This disposes all of the item providers created by this factory. 
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void dispose()
-    {
-        if (elementDataItemProvider != null) elementDataItemProvider.dispose();
-        if (attributeDataItemProvider != null) attributeDataItemProvider.dispose();
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/addtagmd/provider/AttributeDataItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/addtagmd/provider/AttributeDataItemProvider.java
deleted file mode 100644
index 1bc1152..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/addtagmd/provider/AttributeDataItemProvider.java
+++ /dev/null
@@ -1,258 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: AttributeDataItemProvider.java,v 1.1 2010/03/08 18:49:40 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-
-import org.eclipse.emf.common.util.ResourceLocator;
-
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-
-import org.eclipse.jst.jsf.common.metadata.Trait;
-import org.eclipse.jst.jsf.common.metadata.internal.TraitValueHelper;
-import org.eclipse.jst.jsf.facelet.core.internal.FaceletCorePlugin;
-
-import org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AddTagMDPackage;
-import org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AttributeData;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AttributeData} object.
- * <!-- begin-user-doc -->
- * @extends IResourceProvider
- * <!-- end-user-doc -->
- * @generated
- */
-public class AttributeDataItemProvider
-    extends ItemProviderAdapter
-    implements
-        IEditingDomainItemProvider,
-        IStructuredItemContentProvider,
-        ITreeItemContentProvider,
-        IItemLabelProvider,
-        IItemPropertySource,
-        IResourceProvider
-{
-    /**
-     * This constructs an instance from a factory and a notifier.
-     * <!-- begin-user-doc -->
-     * @param adapterFactory 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public AttributeDataItemProvider(AdapterFactory adapterFactory)
-    {
-        super(adapterFactory);
-    }
-
-    /**
-     * This returns the property descriptors for the adapted class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public List<IItemPropertyDescriptor> getPropertyDescriptors(Object object)
-    {
-        if (itemPropertyDescriptors == null)
-        {
-            super.getPropertyDescriptors(object);
-
-            addNamePropertyDescriptor(object);
-            addUsagePropertyDescriptor(object);
-            addDescriptionPropertyDescriptor(object);
-        }
-        return itemPropertyDescriptors;
-    }
-
-    /**
-     * This adds a property descriptor for the Name feature.
-     * <!-- begin-user-doc -->
-     * @param object 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected void addNamePropertyDescriptor(Object object)
-    {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_AttributeData_name_feature"), //$NON-NLS-1$
-                 getString("_UI_PropertyDescriptor_description", "_UI_AttributeData_name_feature", "_UI_AttributeData_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-                 AddTagMDPackage.Literals.ATTRIBUTE_DATA__NAME,
-                 true,
-                 false,
-                 false,
-                 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-                 null,
-                 null));
-    }
-
-    /**
-     * This adds a property descriptor for the Usage feature.
-     * <!-- begin-user-doc -->
-     * @param object 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected void addUsagePropertyDescriptor(Object object)
-    {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_AttributeData_usage_feature"), //$NON-NLS-1$
-                 getString("_UI_PropertyDescriptor_description", "_UI_AttributeData_usage_feature", "_UI_AttributeData_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-                 AddTagMDPackage.Literals.ATTRIBUTE_DATA__USAGE,
-                 true,
-                 false,
-                 false,
-                 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-                 null,
-                 null));
-    }
-
-    /**
-     * This adds a property descriptor for the Description feature.
-     * <!-- begin-user-doc -->
-     * @param object 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected void addDescriptionPropertyDescriptor(Object object)
-    {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_AttributeData_description_feature"), //$NON-NLS-1$
-                 getString("_UI_PropertyDescriptor_description", "_UI_AttributeData_description_feature", "_UI_AttributeData_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-                 AddTagMDPackage.Literals.ATTRIBUTE_DATA__DESCRIPTION,
-                 true,
-                 false,
-                 false,
-                 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-                 null,
-                 null));
-    }
-
-    /**
-     * This returns AttributeData.gif.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public Object getImage(Object object)
-    {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/AttributeData")); //$NON-NLS-1$
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public String getText(Object object)
-    {
-        String label = ((AttributeData)object).getName();
-        return label == null || label.length() == 0 ?
-            getString("_UI_AttributeData_type") : //$NON-NLS-1$
-            getString("_UI_AttributeData_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public void notifyChanged(Notification notification)
-    {
-        updateChildren(notification);
-
-        switch (notification.getFeatureID(AttributeData.class))
-        {
-            case AddTagMDPackage.ATTRIBUTE_DATA__NAME:
-            case AddTagMDPackage.ATTRIBUTE_DATA__USAGE:
-            case AddTagMDPackage.ATTRIBUTE_DATA__DESCRIPTION:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-                return;
-        }
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-     * that can be created under this object.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    protected void collectNewChildDescriptors(Collection<Object> newChildDescriptors, Object object)
-    {
-        super.collectNewChildDescriptors(newChildDescriptors, object);
-    }
-
-    /**
-     * Return the resource locator for this item provider's resources.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public ResourceLocator getResourceLocator()
-    {
-        return FaceletCorePlugin.INSTANCE;
-    }
-    
-    public String getTranslatedString(EObject object, EStructuralFeature feature)
-    {
-        Object value = object.eGet(feature);
-        
-        if (value != null)
-        {
-            EObject  testObject = object;
-            
-            while (! (testObject instanceof Trait) 
-                    && testObject != null)
-            {
-                testObject = testObject.eContainer();
-            }
-            
-            if (testObject instanceof Trait)
-            {
-                Trait trait = (Trait) testObject;
-                value = TraitValueHelper.getNLSValue(trait, value.toString());
-            }
-            return value.toString();
-        }
-
-        return object.toString();
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/addtagmd/provider/ElementDataItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/addtagmd/provider/ElementDataItemProvider.java
deleted file mode 100644
index 9aeae53..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/addtagmd/provider/ElementDataItemProvider.java
+++ /dev/null
@@ -1,228 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ElementDataItemProvider.java,v 1.1 2010/03/08 18:49:40 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.common.metadata.Trait;
-import org.eclipse.jst.jsf.common.metadata.internal.TraitValueHelper;
-import org.eclipse.jst.jsf.facelet.core.internal.FaceletCorePlugin;
-import org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AddTagMDPackage;
-import org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.ElementData;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.ElementData} object.
- * <!-- begin-user-doc -->
- * @extends IResourceProvider
- * <!-- end-user-doc -->
- * @generated
- */
-public class ElementDataItemProvider
-    extends ItemProviderAdapter
-    implements
-        IEditingDomainItemProvider,
-        IStructuredItemContentProvider,
-        ITreeItemContentProvider,
-        IItemLabelProvider,
-        IItemPropertySource,
-        IResourceProvider
-{
-    /**
-     * This constructs an instance from a factory and a notifier.
-     * <!-- begin-user-doc -->
-     * @param adapterFactory 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public ElementDataItemProvider(AdapterFactory adapterFactory)
-    {
-        super(adapterFactory);
-    }
-
-    /**
-     * This returns the property descriptors for the adapted class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public List<IItemPropertyDescriptor> getPropertyDescriptors(Object object)
-    {
-        if (itemPropertyDescriptors == null)
-        {
-            super.getPropertyDescriptors(object);
-
-            addNamePropertyDescriptor(object);
-            addAttributesPropertyDescriptor(object);
-        }
-        return itemPropertyDescriptors;
-    }
-
-    /**
-     * This adds a property descriptor for the Name feature.
-     * <!-- begin-user-doc -->
-     * @param object 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected void addNamePropertyDescriptor(Object object)
-    {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_ElementData_name_feature"), //$NON-NLS-1$
-                 getString("_UI_PropertyDescriptor_description", "_UI_ElementData_name_feature", "_UI_ElementData_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-                 AddTagMDPackage.Literals.ELEMENT_DATA__NAME,
-                 true,
-                 false,
-                 false,
-                 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-                 null,
-                 null));
-    }
-
-    /**
-     * This adds a property descriptor for the Attributes feature.
-     * <!-- begin-user-doc -->
-     * @param object 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected void addAttributesPropertyDescriptor(Object object)
-    {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_ElementData_attributes_feature"), //$NON-NLS-1$
-                 getString("_UI_PropertyDescriptor_description", "_UI_ElementData_attributes_feature", "_UI_ElementData_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-                 AddTagMDPackage.Literals.ELEMENT_DATA__ATTRIBUTES,
-                 true,
-                 false,
-                 true,
-                 null,
-                 null,
-                 null));
-    }
-
-    /**
-     * This returns ElementData.gif.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public Object getImage(Object object)
-    {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/ElementData")); //$NON-NLS-1$
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public String getText(Object object)
-    {
-        String label = ((ElementData)object).getName();
-        return label == null || label.length() == 0 ?
-            getString("_UI_ElementData_type") : //$NON-NLS-1$
-            getString("_UI_ElementData_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public void notifyChanged(Notification notification)
-    {
-        updateChildren(notification);
-
-        switch (notification.getFeatureID(ElementData.class))
-        {
-            case AddTagMDPackage.ELEMENT_DATA__NAME:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-                return;
-        }
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-     * that can be created under this object.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    protected void collectNewChildDescriptors(Collection<Object> newChildDescriptors, Object object)
-    {
-        super.collectNewChildDescriptors(newChildDescriptors, object);
-    }
-
-    /**
-     * Return the resource locator for this item provider's resources.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public ResourceLocator getResourceLocator()
-    {
-        return FaceletCorePlugin.INSTANCE;
-    }
-
-    public String getTranslatedString(EObject object, EStructuralFeature feature)
-    {
-        Object value = object.eGet(feature);
-        
-        if (value != null)
-        {
-            EObject  testObject = object;
-            
-            while (! (testObject instanceof Trait) 
-                    && testObject != null)
-            {
-                testObject = testObject.eContainer();
-            }
-            
-            if (testObject instanceof Trait)
-            {
-                Trait trait = (Trait) testObject;
-                value = TraitValueHelper.getNLSValue(trait, value.toString());
-            }
-            return value.toString();
-        }
-
-        return object.toString();
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/addtagmd/provider/IResourceProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/addtagmd/provider/IResourceProvider.java
deleted file mode 100644
index d441f59..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/addtagmd/provider/IResourceProvider.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.provider;
-
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-
-/**
- * A translated string provider.
- * 
- * @author cbateman
- * 
- */
-public interface IResourceProvider
-{
-    /**
-     * @param object
-     * @param feature
-     * @return the string value of object.eGet(feature)
-     */
-    String getTranslatedString(final EObject object,
-            final EStructuralFeature feature);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/addtagmd/util/AddTagMDAdapterFactory.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/addtagmd/util/AddTagMDAdapterFactory.java
deleted file mode 100644
index 0ec5f72..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/addtagmd/util/AddTagMDAdapterFactory.java
+++ /dev/null
@@ -1,156 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: AddTagMDAdapterFactory.java,v 1.1 2010/03/08 18:49:42 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.util;
-
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.common.notify.Notifier;
-
-import org.eclipse.emf.common.notify.impl.AdapterFactoryImpl;
-
-import org.eclipse.emf.ecore.EObject;
-
-import org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.*;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Adapter Factory</b> for the model.
- * It provides an adapter <code>createXXX</code> method for each class of the model.
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AddTagMDPackage
- * @generated
- */
-public class AddTagMDAdapterFactory extends AdapterFactoryImpl
-{
-    /**
-     * The cached model package.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected static AddTagMDPackage modelPackage;
-
-    /**
-     * Creates an instance of the adapter factory.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public AddTagMDAdapterFactory()
-    {
-        if (modelPackage == null)
-        {
-            modelPackage = AddTagMDPackage.eINSTANCE;
-        }
-    }
-
-    /**
-     * Returns whether this factory is applicable for the type of the object.
-     * <!-- begin-user-doc -->
-     * This implementation returns <code>true</code> if the object is either the model's package or is an instance object of the model.
-     * <!-- end-user-doc -->
-     * @return whether this factory is applicable for the type of the object.
-     * @generated
-     */
-    @Override
-    public boolean isFactoryForType(Object object)
-    {
-        if (object == modelPackage)
-        {
-            return true;
-        }
-        if (object instanceof EObject)
-        {
-            return ((EObject)object).eClass().getEPackage() == modelPackage;
-        }
-        return false;
-    }
-
-    /**
-     * The switch that delegates to the <code>createXXX</code> methods.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected AddTagMDSwitch<Adapter> modelSwitch =
-        new AddTagMDSwitch<Adapter>()
-        {
-            @Override
-            public Adapter caseElementData(ElementData object)
-            {
-                return createElementDataAdapter();
-            }
-            @Override
-            public Adapter caseAttributeData(AttributeData object)
-            {
-                return createAttributeDataAdapter();
-            }
-            @Override
-            public Adapter defaultCase(EObject object)
-            {
-                return createEObjectAdapter();
-            }
-        };
-
-    /**
-     * Creates an adapter for the <code>target</code>.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param target the object to adapt.
-     * @return the adapter for the <code>target</code>.
-     * @generated
-     */
-    @Override
-    public Adapter createAdapter(Notifier target)
-    {
-        return modelSwitch.doSwitch((EObject)target);
-    }
-
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.ElementData <em>Element Data</em>}'.
-     * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.ElementData
-     * @generated
-     */
-    public Adapter createElementDataAdapter()
-    {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AttributeData <em>Attribute Data</em>}'.
-     * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AttributeData
-     * @generated
-     */
-    public Adapter createAttributeDataAdapter()
-    {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for the default case.
-     * <!-- begin-user-doc -->
-     * This default implementation returns null.
-     * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @generated
-     */
-    public Adapter createEObjectAdapter()
-    {
-        return null;
-    }
-
-} //AddTagMDAdapterFactory
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/addtagmd/util/AddTagMDSwitch.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/addtagmd/util/AddTagMDSwitch.java
deleted file mode 100644
index e15cffd..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/addtagmd/util/AddTagMDSwitch.java
+++ /dev/null
@@ -1,168 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: AddTagMDSwitch.java,v 1.1 2010/03/08 18:49:42 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.util;
-
-import java.util.List;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-
-import org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.*;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Switch</b> for the model's inheritance hierarchy.
- * It supports the call {@link #doSwitch(EObject) doSwitch(object)}
- * to invoke the <code>caseXXX</code> method for each class of the model,
- * starting with the actual class of the object
- * and proceeding up the inheritance hierarchy
- * until a non-null result is returned,
- * which is the result of the switch.
- * @param <T> 
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AddTagMDPackage
- * @generated
- */
-public class AddTagMDSwitch<T>
-{
-    /**
-     * The cached model package
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected static AddTagMDPackage modelPackage;
-
-    /**
-     * Creates an instance of the switch.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public AddTagMDSwitch()
-    {
-        if (modelPackage == null)
-        {
-            modelPackage = AddTagMDPackage.eINSTANCE;
-        }
-    }
-
-    /**
-     * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
-     * <!-- begin-user-doc -->
-     * @param theEObject 
-     * <!-- end-user-doc -->
-     * @return the first non-null result returned by a <code>caseXXX</code> call.
-     * @generated
-     */
-    public T doSwitch(EObject theEObject)
-    {
-        return doSwitch(theEObject.eClass(), theEObject);
-    }
-
-    /**
-     * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
-     * <!-- begin-user-doc -->
-     * @param theEClass 
-     * @param theEObject 
-     * <!-- end-user-doc -->
-     * @return the first non-null result returned by a <code>caseXXX</code> call.
-     * @generated
-     */
-    protected T doSwitch(EClass theEClass, EObject theEObject)
-    {
-        if (theEClass.eContainer() == modelPackage)
-        {
-            return doSwitch(theEClass.getClassifierID(), theEObject);
-        }
-        List<EClass> eSuperTypes = theEClass.getESuperTypes();
-        return
-            eSuperTypes.isEmpty() ?
-                defaultCase(theEObject) :
-                doSwitch(eSuperTypes.get(0), theEObject);
-    }
-
-    /**
-     * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
-     * <!-- begin-user-doc -->
-     * @param classifierID 
-     * @param theEObject 
-     * <!-- end-user-doc -->
-     * @return the first non-null result returned by a <code>caseXXX</code> call.
-     * @generated
-     */
-    protected T doSwitch(int classifierID, EObject theEObject)
-    {
-        switch (classifierID)
-        {
-            case AddTagMDPackage.ELEMENT_DATA:
-            {
-                ElementData elementData = (ElementData)theEObject;
-                T result = caseElementData(elementData);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case AddTagMDPackage.ATTRIBUTE_DATA:
-            {
-                AttributeData attributeData = (AttributeData)theEObject;
-                T result = caseAttributeData(attributeData);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            default: return defaultCase(theEObject);
-        }
-    }
-
-    /**
-     * Returns the result of interpreting the object as an instance of '<em>Element Data</em>'.
-     * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpreting the object as an instance of '<em>Element Data</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-    public T caseElementData(ElementData object)
-    {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpreting the object as an instance of '<em>Attribute Data</em>'.
-     * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpreting the object as an instance of '<em>Attribute Data</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-    public T caseAttributeData(AttributeData object)
-    {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpreting the object as an instance of '<em>EObject</em>'.
-     * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch, but this is the last case anyway.
-     * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpreting the object as an instance of '<em>EObject</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject)
-     * @generated
-     */
-    public T defaultCase(EObject object)
-    {
-        return null;
-    }
-
-} //AddTagMDSwitch
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/attributevalues/TemplateWebPathType.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/attributevalues/TemplateWebPathType.java
deleted file mode 100644
index 572d7d5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/attributevalues/TemplateWebPathType.java
+++ /dev/null
@@ -1,179 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facelet.core.internal.cm.attributevalues;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IDOMContextResolver;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IStructuredDocumentContextResolverFactory;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.jst.jsf.facelet.core.internal.FaceletCorePlugin;
-import org.eclipse.jst.jsf.metadataprocessors.features.IPossibleValues;
-import org.eclipse.jst.jsf.metadataprocessors.features.PossibleValue;
-import org.eclipse.jst.jsf.taglibprocessing.attributevalues.WebPathType;
-import org.eclipse.wst.common.componentcore.ComponentCore;
-import org.eclipse.wst.common.componentcore.resources.IVirtualContainer;
-import org.eclipse.wst.common.componentcore.resources.IVirtualResource;
-import org.w3c.dom.Attr;
-import org.w3c.dom.Node;
-
-/**
- * Web-path attribute value type that adds possible values support
- * 
- * @author cbateman
- * 
- */
-public class TemplateWebPathType extends WebPathType implements IPossibleValues
-{
-
-    public List getPossibleValues()
-    {
-        final IStructuredDocumentContext context = getStructuredDocumentContext();
-        final IDOMContextResolver resolver = IStructuredDocumentContextResolverFactory.INSTANCE
-                .getDOMContextResolver(context);
-        if (resolver != null)
-        {
-            final Node node = resolver.getNode();
-            if (node instanceof Attr)
-            {
-                return createPossibleValues((Attr) node);
-            }
-        }
-        return Collections.EMPTY_LIST;
-    }
-
-    private List createPossibleValues(final Attr node)
-    {
-        String currentPathString = node.getNodeValue();
-
-        final List possibleValues = new ArrayList();
-
-        if (currentPathString == null || "".equals(currentPathString.trim())) //$NON-NLS-1$
-        {
-            currentPathString = "/"; //$NON-NLS-1$
-        }
-
-        final IPath currentPath = new Path(currentPathString);
-
-        final IVirtualContainer webRoot = getWebRoot();
-
-        final IVirtualResource deepestElement = findDeepestCommonElement(
-                currentPath, webRoot);
-
-        if (deepestElement == null)
-        {
-            // empty
-            return possibleValues;
-        }
-
-        final IResource[] allResources = deepestElement
-                .getUnderlyingResources();
-        for (final IResource res : allResources)
-        {
-            if (res instanceof IContainer)
-            {
-                try
-                {
-                    for (final IResource child : ((IContainer) res).members())
-                    {
-                        if (child.exists())
-                        {
-                            IPath childPath = child.getProjectRelativePath();
-                            int numLeadingSegments = webRoot
-                                    .getProjectRelativePath()
-                                    .matchingFirstSegments(childPath);
-                            childPath = childPath
-                                    .removeFirstSegments(numLeadingSegments);
-                            String pathName = null;
-                            if (currentPath.isAbsolute())
-                            {
-                                pathName = childPath.makeAbsolute()
-                                    .toString();
-                            }
-                            else
-                            {
-                                pathName = childPath.makeRelative().toString();
-                            }
-
-                            final PossibleValue pv = new PossibleValue(
-                                    pathName, pathName);
-                            possibleValues.add(pv);
-                        }
-                    }
-                }
-                catch (final CoreException ce)
-                {
-                    FaceletCorePlugin.log("While trying possible values", ce); //$NON-NLS-1$
-                }
-            }
-        }
-        return possibleValues;
-    }
-
-    private IVirtualResource findDeepestCommonElement(
-            final IPath currentPath, final IVirtualContainer webRoot)
-    {
-        final String[] segments = currentPath.segments();
-        IVirtualResource deepestElement = null;
-        if (segments != null)
-        {
-            IPath longestSubPath = new Path(""); //$NON-NLS-1$
-            for (final String segment : segments)
-            {
-                longestSubPath = longestSubPath.append(segment);
-                deepestElement = webRoot.findMember(longestSubPath);
-                if (deepestElement == null)
-                {
-                    longestSubPath = longestSubPath.removeLastSegments(1);
-                    break;
-                }
-            }
-
-            deepestElement = webRoot.findMember(longestSubPath);
-            if (deepestElement == null)
-            {
-                deepestElement = webRoot;
-            }
-            else 
-            {
-                int avoidInfiniteLoopCount = 0;
-                while(avoidInfiniteLoopCount < 1000 && // we timeout in cause of circular chains.
-                        deepestElement != null &&
-                        ! (deepestElement.getUnderlyingResource() instanceof IContainer))
-                {
-                    deepestElement = deepestElement.getParent();
-                }
-                
-                if (avoidInfiniteLoopCount == 1000)
-                {
-                    throw new IllegalStateException();
-                }
-            }
-        }
-        return deepestElement;
-    }
-
-    private IVirtualContainer getWebRoot()
-
-    {
-        final IVirtualContainer webRoot = ComponentCore.createComponent(
-                getProject()).getRootFolder();
-
-        return webRoot;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/strategy/AbstractExternalMetadataStrategy.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/strategy/AbstractExternalMetadataStrategy.java
deleted file mode 100644
index 3a46644..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/strategy/AbstractExternalMetadataStrategy.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facelet.core.internal.cm.strategy;
-
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.jsf.facelet.core.internal.cm.ExternalTagInfo;
-import org.eclipse.jst.jsf.facelet.core.internal.cm.TagInfo;
-
-/**
- * Super class of all external meta-data strategy.
- * 
- * @author cbateman
- * 
- */
-/* package */abstract class AbstractExternalMetadataStrategy implements
-IExternalMetadataStrategy
-{
-    private final String _displayName;
-    private final String _id;
-
-    protected AbstractExternalMetadataStrategy(final String id,
-            final String displayName)
-    {
-        _id = id;
-        _displayName = displayName;
-    }
-
-    public final TagInfo getNoResult()
-    {
-        // this value must be "==" comparable
-        return ExternalTagInfo.NULL_INSTANCE;
-    }
-
-    public abstract TagInfo perform(TagIdentifier input) throws Exception;
-
-    public final String getDisplayName()
-    {
-        return _displayName;
-    }
-
-    public String getId()
-    {
-        return _id;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/strategy/FaceletExternalMetadataStrategy.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/strategy/FaceletExternalMetadataStrategy.java
deleted file mode 100644
index 149c341..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/strategy/FaceletExternalMetadataStrategy.java
+++ /dev/null
@@ -1,138 +0,0 @@
-package org.eclipse.jst.jsf.facelet.core.internal.cm.strategy;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.Map;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.ITagAttribute;
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.ITagElement;
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.Namespace;
-import org.eclipse.jst.jsf.designtime.internal.view.model.ITagRegistry;
-import org.eclipse.jst.jsf.facelet.core.internal.cm.AttributeCMAdapter;
-import org.eclipse.jst.jsf.facelet.core.internal.cm.TagInfo;
-import org.eclipse.jst.jsf.facelet.core.internal.util.ViewUtil;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
-
-/**
- * The 
- * @author cbateman
- *
- */
-public class FaceletExternalMetadataStrategy extends
-        AbstractExternalMetadataStrategy
-{
-    /**
-     * The unique identifier for the strategy.
-     */
-    public final static String STRATEGY_ID = "org.eclipse.jst.jsf.facelet.core.internal.cm.strategy.FaceletExternalMetadataStrategy"; //$NON-NLS-1$
-    private final IProject _project;
-
-    /**
-     * @param project 
-     */
-    public FaceletExternalMetadataStrategy(final IProject project)
-    {
-        super(STRATEGY_ID, Messages.FaceletExternalMetadataStrategy_0);
-        _project = project;
-    }
-
-    @Override
-    public TagInfo perform(TagIdentifier input) throws Exception
-    {
-        final ITagRegistry tagRegistry = ViewUtil.getTagRegistry(_project);
-        
-        if (tagRegistry != null)
-        {
-            Namespace tagLibrary = tagRegistry.getTagLibrary(input.getUri());
-            if (tagLibrary != null)
-            {
-                return new FaceletInternalInfo(tagLibrary);
-            }
-        }
-        return getNoResult();
-    }
-    
-    private static class FaceletInternalInfo extends TagInfo
-    {
-        private final Namespace _namespace;
-
-        public FaceletInternalInfo(final Namespace namespace)
-        {
-            _namespace = namespace;
-        }
-        
-        @Override
-        public Object getTagProperty(String tagName, String key)
-        {
-            if ("description".equals(key)) //$NON-NLS-1$
-            {
-                // TODO:
-            }
-            return null;
-        }
-
-        @Override
-        public CMNamedNodeMap getAttributes(String tagName)
-        {
-            ITagElement viewElement = _namespace.getViewElement(tagName);
-            if (viewElement != null)
-            {
-                return new MyNodeNameMap(viewElement);
-            }
-            return null;
-        }
-
-        private static class MyNodeNameMap implements CMNamedNodeMap
-        {
-            private final ITagElement  _tagElement;
-            private final ArrayList<CMNode> _attrs;
-
-            public MyNodeNameMap(final ITagElement tagElement)
-            {
-                super();
-                _tagElement = tagElement;
-                _attrs = new ArrayList<CMNode>();
-                for (final Map.Entry<String, ? extends ITagAttribute> entry : _tagElement.getAttributes().entrySet())
-                {
-                    final ITagAttribute attr = entry.getValue();
-                    _attrs.add(new AttributeCMAdapter(attr));
-                }
-            }
-
-            public int getLength()
-            {
-                return _attrs.size();
-            }
-
-            public CMNode getNamedItem(String name)
-            {
-                if (name == null)
-                {
-                    return null;
-                }
-                for (final CMNode cmNode : _attrs)
-                {
-                    if (name.equals(cmNode.getNodeName()))
-                    {
-                        return cmNode;
-                    }
-                }
-                return null;
-            }
-
-            public CMNode item(int index)
-            {
-                return _attrs.get(index);
-            }
-
-            public Iterator iterator()
-            {
-                return Collections.unmodifiableList(_attrs).iterator();
-            }
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/strategy/IExternalMetadataStrategy.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/strategy/IExternalMetadataStrategy.java
deleted file mode 100644
index 320e824..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/strategy/IExternalMetadataStrategy.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facelet.core.internal.cm.strategy;
-
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.jsf.common.internal.strategy.IIdentifiableStrategy;
-import org.eclipse.jst.jsf.facelet.core.internal.cm.ExternalTagInfo;
-import org.eclipse.jst.jsf.facelet.core.internal.cm.TagInfo;
-
-/**
- * A strategy whose algorithm loads the tag CM data for a tag.
- * 
- * @author cbateman
- * 
- */
-public interface IExternalMetadataStrategy extends
-        IIdentifiableStrategy<TagIdentifier, TagInfo, String>
-{
-    
-    /**
-     * A null strategy that returns no result for all queries
-     * @author cbateman
-     *
-     */
-    static class NullExternalMetadataStrategy implements IExternalMetadataStrategy
-    {
-
-        public TagInfo getNoResult()
-        {
-            return ExternalTagInfo.NULL_INSTANCE;
-        }
-
-        public TagInfo perform(TagIdentifier input) throws Exception
-        {
-            return getNoResult();
-        }
-
-        public String getDisplayName()
-        {
-            return "NULL instance; you shouldn't see this label!"; //$NON-NLS-1$
-        }
-
-        public String getId()
-        {
-            return "NULL Strategy"; //$NON-NLS-1$
-        }
-        
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/strategy/InternalNamedNodeMap.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/strategy/InternalNamedNodeMap.java
deleted file mode 100644
index f92b8c7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/strategy/InternalNamedNodeMap.java
+++ /dev/null
@@ -1,96 +0,0 @@
-package org.eclipse.jst.jsf.facelet.core.internal.cm.strategy;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
-
-/*package*/ class InternalNamedNodeMap implements CMNamedNodeMap
-{
-    private final List<CMNode> _nodes = new ArrayList<CMNode>();
-
-    /**
-     * Add a node to the map.  This is not on the CMNamedNodeMap and is used
-     * to populate the map.
-     * 
-     * @param node
-     */
-    public void add(final CMNode node)
-    {
-        _nodes.add(node);
-    }
-
-    public int getLength()
-    {
-        return _nodes.size();
-    }
-
-    public CMNode getNamedItem(final String name)
-    {
-        for (final CMNode foundNode : _nodes)
-        {
-            if (name.equals(foundNode.getNodeName()))
-            {
-                return foundNode;
-            }
-        }
-        return null;
-    }
-
-    public CMNode item(final int index)
-    {
-        if (index < _nodes.size())
-        {
-            return _nodes.get(index);
-        }
-        return null;
-    }
-
-    public Iterator<?> iterator()
-    {
-        return Collections.unmodifiableList(_nodes).iterator();
-    }
-    
-    /**
-     * A null instance object for InternalNamedNodeMap
-     *
-     */
-    public static class NullInternalNamedNodeMap extends InternalNamedNodeMap
-    {
-
-        @Override
-        public void add(final CMNode node)
-        {
-            // do nothing
-        }
-
-        @Override
-        public int getLength()
-        {
-            // always empty
-            return 0;
-        }
-
-        @Override
-        public CMNode getNamedItem(final String name)
-        {
-            return null;
-        }
-
-        @Override
-        public CMNode item(final int index)
-        {
-            return null;
-        }
-
-        @Override
-        public Iterator<?> iterator()
-        {
-            return Collections.EMPTY_LIST.iterator();
-        }
-
-    }
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/strategy/JSPExternalMetadataStrategy.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/strategy/JSPExternalMetadataStrategy.java
deleted file mode 100644
index e704e03..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/strategy/JSPExternalMetadataStrategy.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facelet.core.internal.cm.strategy;
-
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.jsf.facelet.core.internal.cm.ExternalTagInfo;
-import org.eclipse.jst.jsf.facelet.core.internal.cm.TagInfo;
-import org.eclipse.jst.jsp.core.internal.contentmodel.tld.provisional.TLDDocument;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
-
-/**
- * A metadata strategy that uses JSP TLD metadata.
- * 
- * @author cbateman
- * 
- */
-public class JSPExternalMetadataStrategy extends
-        AbstractExternalMetadataStrategy
-{
-    private final TLDDocument  _doc;
-    /**
-     * The unique identifier for the strategy.
-     */
-    public final static String STRATEGY_ID = "org.eclipse.jst.jsf.facelet.core.internal.cm.strategy.JSPExternalMetadataStrategy"; //$NON-NLS-1$
-
-    /**
-     * @param doc 
-     */
-    public JSPExternalMetadataStrategy(final TLDDocument doc)
-    {
-        super(STRATEGY_ID, Messages.JSPExternalMetadataStrategy_DisplayName);
-        _doc = doc;
-    }
-
-    @Override
-    public TagInfo perform(final TagIdentifier input) throws Exception
-    {
-        if (_doc != null)
-        {
-            return new TLDMetadataExternalInfo(_doc);
-        }
-        return getNoResult();
-    }
-
-    private static class TLDMetadataExternalInfo extends ExternalTagInfo
-    {
-        private final TLDDocument _doc;
-
-        public TLDMetadataExternalInfo(final TLDDocument doc)
-        {
-            _doc = doc;
-        }
-
-        @Override
-        public CMNamedNodeMap getAttributes(final String tagName)
-        {
-            final CMElementDeclaration element = (CMElementDeclaration) _doc
-                    .getElements().getNamedItem(tagName);
-
-            if (element != null)
-            {
-                return element.getAttributes();
-            }
-            return null;
-        }
-
-        @Override
-        public Object getTagProperty(final String tagName, final String key)
-        {
-            final CMElementDeclaration element = (CMElementDeclaration) _doc
-                    .getElements().getNamedItem(tagName);
-            if (element != null)
-            {
-                return element.getProperty(key);
-            }
-            return null;
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/strategy/MDExternalMetadataStrategy.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/strategy/MDExternalMetadataStrategy.java
deleted file mode 100644
index b7b2b21..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/strategy/MDExternalMetadataStrategy.java
+++ /dev/null
@@ -1,416 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facelet.core.internal.cm.strategy;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.concurrent.atomic.AtomicBoolean;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.ISafeRunnable;
-import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
-import org.eclipse.jface.util.SafeRunnable;
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.jsf.common.internal.managedobject.IManagedObject;
-import org.eclipse.jst.jsf.common.internal.managedobject.ObjectManager.ManagedObjectException;
-import org.eclipse.jst.jsf.common.internal.resource.ResourceSingletonObjectManager;
-import org.eclipse.jst.jsf.facelet.core.internal.FaceletCorePlugin;
-import org.eclipse.jst.jsf.facelet.core.internal.cm.AttributeCMAdapter;
-import org.eclipse.jst.jsf.facelet.core.internal.cm.ExternalTagInfo;
-import org.eclipse.jst.jsf.facelet.core.internal.cm.TagInfo;
-import org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AddTagMDPackage;
-import org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AttributeData;
-import org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AttributeUsage;
-import org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.ElementData;
-import org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.provider.IResourceProvider;
-import org.eclipse.jst.jsf.facelet.core.internal.cm.strategy.InternalNamedNodeMap.NullInternalNamedNodeMap;
-import org.eclipse.jst.jsf.facelet.core.internal.util.TagMetadataLoader;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
-
-/**
- * An external meta-data strategy that uses the JSF meta-data framework.
- * 
- * @author cbateman
- * 
- */
-public class MDExternalMetadataStrategy extends
-        AbstractExternalMetadataStrategy implements IManagedObject
-{
-    private static MySingletonManager MANAGER = new MySingletonManager();
-
-    /**
-     * @param project
-     * @return the instance of the strategy for project or
-     */
-    public static IExternalMetadataStrategy create(final IProject project)
-    {
-        try
-        {
-            return MANAGER.getInstance(project);
-        }
-        catch (final ManagedObjectException e)
-        {
-            FaceletCorePlugin.log(
-                    "Getting managed instance of tag metadata strategy", e); //$NON-NLS-1$
-        }
-        return new NullExternalMetadataStrategy();
-    }
-
-    /**
-     * The unique identifier for the strategy.
-     */
-    public final static String                   STRATEGY_ID = "org.eclipse.jst.jsf.facelet.core.internal.cm.strategy.MDExternalMetadataStrategy"; //$NON-NLS-1$
-
-    //    private static final String     VAR         = "var";                                                  //$NON-NLS-1$
-    //    private static final String     VALUE       = "value";                                                //$NON-NLS-1$
-    //    private static final String     SRC         = "src";                                                  //$NON-NLS-1$
-    //    private static final String     NAME        = "name";                                                 //$NON-NLS-1$
-    //    private static final String     HOTKEY      = "hotkey";                                               //$NON-NLS-1$
-    //    private static final String     TEMPLATE    = "template";                                             //$NON-NLS-1$
-    //    private static final String     BINDING     = "binding";                                              //$NON-NLS-1$
-    //    private static final String     ID          = "id";                                                   //$NON-NLS-1$
-
-    private final IProject                       _project;
-    private final TagMetadataLoader              _tagMetadataLoader;
-    private final Map<String, MDExternalTagInfo> _cached;
-    private final AtomicBoolean                  _isDisposed = new AtomicBoolean(
-                                                                     false);
-
-    /**
-     * Default constructor
-     * 
-     * @param project
-     */
-    private MDExternalMetadataStrategy(final IProject project)
-    {
-        super(STRATEGY_ID, Messages.MDExternalMetadataStrategy_DisplayName);
-        _project = project;
-        _tagMetadataLoader = new TagMetadataLoader(_project);
-        _cached = new HashMap<String, MDExternalTagInfo>();
-    }
-
-    public void checkpoint()
-    {
-        // do nothing
-    }
-
-    public void destroy()
-    {
-        // currently no persistent state, so just dispose
-    }
-
-    public void dispose()
-    {
-        if (_isDisposed.compareAndSet(false, true))
-        {
-            _cached.clear();
-        }
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jst.jsf.facelet.core.internal.cm.strategy.
-     * AbstractExternalMetadataStrategy
-     * #perform(org.eclipse.jst.jsf.common.dom.TagIdentifier)
-     */
-    @Override
-    public TagInfo perform(final TagIdentifier input) throws Exception
-    {
-        MDExternalTagInfo tagInfo = _cached.get(input.getUri());
-
-        if (tagInfo == null)
-        {
-            tagInfo = new MDExternalTagInfo(input.getUri(), _tagMetadataLoader);
-            _cached.put(input.getUri(), tagInfo);
-        }
-        return tagInfo;
-    }
-
-    private static class MDExternalTagInfo extends ExternalTagInfo
-    {
-        private final String                            _uri;
-        private final TagMetadataLoader                 _tagMetadataLoader;
-        private final Map<String, InternalNamedNodeMap> _attributes;
-
-        public MDExternalTagInfo(final String uri,
-                final TagMetadataLoader tagMetadataLoader)
-        {
-            _uri = uri;
-            _tagMetadataLoader = tagMetadataLoader;
-            _attributes = new HashMap<String, InternalNamedNodeMap>();
-        }
-
-        @Override
-        public CMNamedNodeMap getAttributes(final String tagName)
-        {
-            final InternalNamedNodeMap nodeMap = _attributes.get(tagName);
-            final InternalNamedNodeMap[] innerClassNodeMap = new InternalNamedNodeMap[1];
-            innerClassNodeMap[0] = nodeMap;
-
-            if (nodeMap == null)
-            {
-                SafeRunnable.run(new ISafeRunnable()
-                {
-                    public void run()
-                    {
-                        final ElementData data = _tagMetadataLoader
-                                .getElementData(_uri, tagName);
-
-                        if (data != null)
-                        {
-                            innerClassNodeMap[0] = new InternalNamedNodeMap();
-
-                            for (final AttributeData attribute : data
-                                    .getAttributes())
-                            {
-                                innerClassNodeMap[0]
-                                        .add(createAttribute(attribute));
-                            }
-                            _attributes.put(tagName, innerClassNodeMap[0]);
-                        }
-                        // no meta-data found for this tag, so mark as null
-                        // instance so future calls don't bother a re-lookup.
-                        else
-                        {
-                            _attributes.put(tagName,
-                                    MDExternalMetadataStrategy.NULL_INSTANCE);
-                        }
-                    }
-
-                    public void handleException(final Throwable exception)
-                    {
-                        FaceletCorePlugin.log(
-                                "While loading attribute meta-data", exception); //$NON-NLS-1$
-                    }
-                });
-            }
-
-            // don't return the null map instance
-            if (innerClassNodeMap[0] == MDExternalMetadataStrategy.NULL_INSTANCE)
-            {
-                return null;
-            }
-            return innerClassNodeMap[0];
-        }
-
-        @Override
-        public Object getTagProperty(final String tagName, final String key)
-        {
-            final Object[] value = new Object[1];
-            value[0] = null;
-
-            SafeRunnable.run(new ISafeRunnable()
-            {
-                public void run()
-                {
-                    if ("description".equals(key)) //$NON-NLS-1$
-                    {
-                        value[0] = _tagMetadataLoader.getDescription(_uri,
-                                tagName);
-                    }
-                }
-
-                public void handleException(final Throwable exception)
-                {
-                    FaceletCorePlugin.log(
-                            "While loading tag property meta-data", exception); //$NON-NLS-1$
-                }
-            });
-            return value[0];
-        }
-    }
-
-    private final static NullInternalNamedNodeMap NULL_INSTANCE = new NullInternalNamedNodeMap();
-
-
-
-    // temporary: transfer out to metadata
-    final static Map<String, InternalNamedNodeMap> _faceletData;
-
-    static
-    {
-        // final String ID_DESCRIPTION =
-        // Messages.MDExternalMetadataStrategy_ID_DESCRIPTION;
-        // final String BINDING_DESCRIPTION =
-        // Messages.MDExternalMetadataStrategy_BINDING_DESCRIPTION;
-        // final String TEMPLATE_DESCRIPTION =
-        // Messages.MDExternalMetadataStrategy_TEMPLATE_DESCRIPTION;
-        // final String HOTKEY_DESCRIPTION =
-        // Messages.MDExternalMetadataStrategy_HOTKEY_DESCRIPTION;
-        // final String DEFINE_NAME_DESCRIPTION =
-        // Messages.MDExternalMetadataStrategy_DEFINE_NAME_DESCRIPTION;
-        // final String SRC_DESCRIPTION =
-        // Messages.MDExternalMetadataStrategy_SRC_DESCRIPTION;
-        // final String INSERT_NAME_DESCRIPTION =
-        // Messages.MDExternalMetadataStrategy_INSERT_NAME_DESCRIPTION;
-        // final String PARAM_NAME_DESCRIPTION =
-        // Messages.MDExternalMetadataStrategy_PARAM_NAME_DESCRIPTION;
-        // final String PARAM_VALUE_DESCRIPTION =
-        // Messages.MDExternalMetadataStrategy_PARAM_VALUE_DESCRIPTION;
-        // final String REPEAT_VAR_DESCRIPTION =
-        // Messages.MDExternalMetadataStrategy_REPEAT_VAR_DESCRIPTION;
-        // final String REPEAT_VALUE_DESCRIPTION =
-        // Messages.MDExternalMetadataStrategy_REPEAT_VALUE_DESCRIPTION;
-
-        final Map<String, InternalNamedNodeMap> map = new HashMap<String, InternalNamedNodeMap>();
-        // component
-        // InternalNamedNodeMap nodeMap = new InternalNamedNodeMap();
-        // nodeMap.add(createAttribute(ID, CMAttributeDeclaration.OPTIONAL,
-        // ID_DESCRIPTION));
-        // nodeMap.add(createAttribute(BINDING, CMAttributeDeclaration.OPTIONAL,
-        // BINDING_DESCRIPTION));
-        // map.put(IFaceletTagConstants.TAG_COMPONENT, nodeMap);
-        //
-        // // composition
-        // nodeMap = new InternalNamedNodeMap();
-        // nodeMap.add(createAttribute(TEMPLATE,
-        // CMAttributeDeclaration.OPTIONAL,
-        // TEMPLATE_DESCRIPTION));
-        // map.put(IFaceletTagConstants.TAG_COMPOSITION, nodeMap);
-
-        // debug
-        // nodeMap = new InternalNamedNodeMap();
-        // nodeMap.add(createAttribute(HOTKEY, CMAttributeDeclaration.OPTIONAL,
-        // HOTKEY_DESCRIPTION));
-        // map.put(IFaceletTagConstants.TAG_DEBUG, nodeMap);
-
-        // decorate
-        // nodeMap = new InternalNamedNodeMap();
-        // nodeMap.add(createAttribute(TEMPLATE,
-        // CMAttributeDeclaration.REQUIRED,
-        // TEMPLATE_DESCRIPTION));
-        // map.put(IFaceletTagConstants.TAG_DECORATE, nodeMap);
-
-        // define
-        // nodeMap = new InternalNamedNodeMap();
-        // nodeMap.add(createAttribute(NAME, CMAttributeDeclaration.REQUIRED,
-        // DEFINE_NAME_DESCRIPTION));
-        // map.put(IFaceletTagConstants.TAG_DEFINE, nodeMap);
-
-        // fragment
-        // nodeMap = new InternalNamedNodeMap();
-        // nodeMap.add(createAttribute(ID, CMAttributeDeclaration.OPTIONAL,
-        // ID_DESCRIPTION));
-        // nodeMap.add(createAttribute(BINDING, CMAttributeDeclaration.OPTIONAL,
-        // BINDING_DESCRIPTION));
-        // map.put(IFaceletTagConstants.TAG_FRAGMENT, nodeMap);
-
-        // include
-        // nodeMap = new InternalNamedNodeMap();
-        // nodeMap.add(createAttribute(SRC, CMAttributeDeclaration.REQUIRED,
-        // SRC_DESCRIPTION));
-        // map.put(IFaceletTagConstants.TAG_INCLUDE, nodeMap);
-
-        // insert
-        // nodeMap = new InternalNamedNodeMap();
-        // nodeMap.add(createAttribute(NAME, CMAttributeDeclaration.OPTIONAL,
-        // INSERT_NAME_DESCRIPTION));
-        // map.put(IFaceletTagConstants.TAG_INSERT, nodeMap);
-
-        // param
-        // nodeMap = new InternalNamedNodeMap();
-        // nodeMap.add(createAttribute(NAME, CMAttributeDeclaration.REQUIRED,
-        // PARAM_NAME_DESCRIPTION));
-        // nodeMap.add(createAttribute(VALUE, CMAttributeDeclaration.REQUIRED,
-        // PARAM_VALUE_DESCRIPTION));
-        // map.put(IFaceletTagConstants.TAG_PARAM, nodeMap);
-
-        // remove
-        // nodeMap = new InternalNamedNodeMap();
-        // // no attributes
-        // map.put(IFaceletTagConstants.TAG_PARAM, nodeMap);
-
-        // repeat
-        // nodeMap = new InternalNamedNodeMap();
-        // nodeMap.add(createAttribute(VALUE, CMAttributeDeclaration.REQUIRED,
-        // REPEAT_VALUE_DESCRIPTION));
-        // nodeMap.add(createAttribute(VAR, CMAttributeDeclaration.REQUIRED,
-        // REPEAT_VAR_DESCRIPTION));
-        // map.put(IFaceletTagConstants.TAG_REPEAT, nodeMap);
-
-        _faceletData = Collections.unmodifiableMap(map);
-    }
-
-    private static CMAttributeDeclaration createAttribute(
-            final AttributeData attributeData)
-    {
-        final AttributeCMAdapter attribute = new AttributeCMAdapter(
-                attributeData.getName(), convertUsageEnum(attributeData
-                        .getUsage()));
-
-        final ComposedAdapterFactory factory = new ComposedAdapterFactory(
-                ComposedAdapterFactory.Descriptor.Registry.INSTANCE);
-
-        final Object provider = factory.adapt(attributeData,
-                IResourceProvider.class);
-
-        // get the description from meta-data and feed through the provider
-        // for possible translation
-        String description = attributeData.getDescription();
-
-        if (provider instanceof IResourceProvider)
-        {
-            final IResourceProvider resProvider = (IResourceProvider) provider;
-            final String translated = resProvider.getTranslatedString(
-                    attributeData, AddTagMDPackage.eINSTANCE
-                            .getAttributeData_Description());
-            description = translated != null ? translated : description;
-        }
-
-        attribute.setDescription(description);
-        return attribute;
-    }
-
-    private static int convertUsageEnum(final AttributeUsage usage)
-    {
-        switch (usage)
-        {
-            case OPTIONAL:
-                return CMAttributeDeclaration.OPTIONAL;
-            case REQUIRED:
-                return CMAttributeDeclaration.REQUIRED;
-            case FIXED:
-                return CMAttributeDeclaration.FIXED;
-            case PROHIBITED:
-                return CMAttributeDeclaration.PROHIBITED;
-            default:
-                return CMAttributeDeclaration.OPTIONAL;
-        }
-    }
-
-    private static class MySingletonManager
-            extends
-            ResourceSingletonObjectManager<MDExternalMetadataStrategy, IProject>
-    {
-
-        protected MySingletonManager()
-        {
-            super(ResourcesPlugin.getWorkspace());
-        }
-
-        @Override
-        protected MDExternalMetadataStrategy createNewInstance(
-                final IProject resource)
-        {
-            return new MDExternalMetadataStrategy(resource);
-        }
-
-    }
-
-    public boolean isDisposed()
-    {
-        return _isDisposed.get();
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/strategy/Messages.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/strategy/Messages.java
deleted file mode 100644
index 484f0cd..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/strategy/Messages.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facelet.core.internal.cm.strategy;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * 
- * @author cbateman
- *
- */
-/*package*/ class Messages extends NLS
-{
-    private static final String BUNDLE_NAME = "org.eclipse.jst.jsf.facelet.core.internal.cm.strategy.messages"; //$NON-NLS-1$
-
-
-    public static String FaceletExternalMetadataStrategy_0;
-
-
-    public static String JSPExternalMetadataStrategy_DisplayName;
-
-
-    /**
-     * Display name for MDExternalMetadataStrategy
-     */
-    public static String        MDExternalMetadataStrategy_DisplayName;
-    
-    public static String        MDExternalMetadataStrategy_BINDING_DESCRIPTION;
-    public static String        MDExternalMetadataStrategy_DEFINE_NAME_DESCRIPTION;
-    public static String        MDExternalMetadataStrategy_HOTKEY_DESCRIPTION;
-    public static String        MDExternalMetadataStrategy_ID_DESCRIPTION;
-    public static String        MDExternalMetadataStrategy_INSERT_NAME_DESCRIPTION;
-    public static String        MDExternalMetadataStrategy_PARAM_NAME_DESCRIPTION;
-    public static String        MDExternalMetadataStrategy_PARAM_VALUE_DESCRIPTION;
-    public static String        MDExternalMetadataStrategy_REPEAT_VALUE_DESCRIPTION;
-    public static String        MDExternalMetadataStrategy_REPEAT_VAR_DESCRIPTION;
-    public static String        MDExternalMetadataStrategy_SRC_DESCRIPTION;
-    public static String        MDExternalMetadataStrategy_TEMPLATE_DESCRIPTION;
-
-
-    static
-    {
-        // initialize resource bundle
-        NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-    }
-
-    private Messages()
-    {
-        // no external instantiation
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/strategy/TagInfoStrategyComposite.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/strategy/TagInfoStrategyComposite.java
deleted file mode 100644
index b2f2a3d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/strategy/TagInfoStrategyComposite.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facelet.core.internal.cm.strategy;
-
-import java.util.Collection;
-import java.util.Iterator;
-
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.jsf.common.internal.policy.IdentifierOrderedIteratorPolicy;
-import org.eclipse.jst.jsf.common.internal.strategy.IteratorPolicyBasedStrategyComposite;
-import org.eclipse.jst.jsf.facelet.core.internal.cm.ExternalTagInfo;
-import org.eclipse.jst.jsf.facelet.core.internal.cm.TagInfo;
-
-/**
- * A composite of strategies for deriving external tag metadata.
- * 
- * @author cbateman
- * 
- */
-public class TagInfoStrategyComposite
-        extends
-        IteratorPolicyBasedStrategyComposite<TagIdentifier, TagInfo, TagInfo, String, IExternalMetadataStrategy>
-{
-    private final Iterable<String> _policyOrder;
-
-    /**
-     * @param policyOrder
-     */
-    public TagInfoStrategyComposite(final Iterable<String> policyOrder)
-    {
-        super(new MyIteratorPolicy(policyOrder));
-        _policyOrder = policyOrder;
-    }
-
-    @Override
-    public TagInfo getNoResult()
-    {
-        return ExternalTagInfo.NULL_INSTANCE;
-    }
-
-    /**
-     * 
-     */
-    public void resetIterator()
-    {
-        setPolicy(new MyIteratorPolicy(_policyOrder));
-    }
-
-    private static class MyIteratorPolicy extends
-            IdentifierOrderedIteratorPolicy<String>
-    {
-        private Iterator<String> _iterator;
-
-        public MyIteratorPolicy(final Iterable<String> policyOrder)
-        {
-            super(policyOrder);
-            setExcludeNonExplicitValues(true);
-        }
-
-        @Override
-        public Iterator<String> getIterator(
-                final Collection<String> forCollection)
-        {
-            if (_iterator == null)
-            {
-                _iterator = super.getIterator(forCollection);
-            }
-            return _iterator;
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/strategy/messages.properties b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/strategy/messages.properties
deleted file mode 100644
index 8e41092..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/strategy/messages.properties
+++ /dev/null
@@ -1,14 +0,0 @@
-FaceletExternalMetadataStrategy_0=Facelet metadata strategy
-JSPExternalMetadataStrategy_DisplayName=JSP TLD meta-data
-MDExternalMetadataStrategy_DisplayName=Tag meta-data from MD framework
-MDExternalMetadataStrategy_BINDING_DESCRIPTION=A method binding of the form of the form \#{bean.binding} where 'binding' has the signature <b>UIComponent binding()</b>, that returns the component instance to use. If not present, Facelets will automatically instantiate one.
-MDExternalMetadataStrategy_DEFINE_NAME_DESCRIPTION=The name of a template area.  This name is referenced in instance documents using the insert tag
-MDExternalMetadataStrategy_HOTKEY_DESCRIPTION=The key in combination with CTRL-SHIFT to use to launch the debug viewer
-MDExternalMetadataStrategy_ID_DESCRIPTION=Assign a unique idea to generated component.  If not present, Facelets will automatically generate one.
-MDExternalMetadataStrategy_INSERT_NAME_DESCRIPTION=The name of a template area to insert (defined in the template using the define tag).  If not specified, the entire template will be inserted.
-MDExternalMetadataStrategy_PARAM_NAME_DESCRIPTION=The name of the new EL variable to declare
-MDExternalMetadataStrategy_PARAM_VALUE_DESCRIPTION=The literal or EL value to assign to the new variable
-MDExternalMetadataStrategy_REPEAT_VALUE_DESCRIPTION=The EL expression used to derive the list of items to repeat over
-MDExternalMetadataStrategy_REPEAT_VAR_DESCRIPTION=The name of the EL variable to use as the iterator
-MDExternalMetadataStrategy_SRC_DESCRIPTION=The path, absolute or relative to the original request, to another Facelet to include.  May be EL.  e.g. 'headerPage.xhtml'
-MDExternalMetadataStrategy_TEMPLATE_DESCRIPTION=A uri that points to the template to use.  e.g. /WEB-INF/templates/mytemplate.xhtml
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/facet/ChangeActionType.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/facet/ChangeActionType.java
deleted file mode 100644
index 3348976..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/facet/ChangeActionType.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facelet.core.internal.facet;
-
-/**
- * Indicates the type of change that should be made with the data in a
- * FacetChangeModel.
- * 
- * @author cbateman
- * 
- */
-public enum ChangeActionType
-{
-    /**
-     * Change is to add indicated values
-     */
-    ADD,
-
-    /**
-     * Change is to remove indicated values
-     */
-    REMOVE
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/facet/FaceletChangeDelegate.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/facet/FaceletChangeDelegate.java
deleted file mode 100644
index 84a5bb2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/facet/FaceletChangeDelegate.java
+++ /dev/null
@@ -1,160 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facelet.core.internal.facet;
-
-import java.util.Iterator;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.jst.jsf.facelet.core.internal.FaceletCoreTraceOptions;
-import org.eclipse.jst.jsf.facesconfig.emf.ApplicationType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType;
-import org.eclipse.jst.jsf.facesconfig.emf.ViewHandlerType;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.wst.common.project.facet.core.IDelegate;
-import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
-
-/**
- * The super-class of all Facelet facet change delegates.  The only expected 
- * delegates at this time are install and uninstall.  Each super-class must
- * decide the meaning of "change" and implement the abstract members 
- * appropriately.
- * 
- * @author cbateman
- *
- */
-public abstract class FaceletChangeDelegate implements IDelegate
-{
-    /**
-     * The default name of the Facelet runtime view handler
-     */
-    protected static final String RUNTIME_VIEWHANDLER_CLASS_NAME = "com.sun.facelets.FaceletViewHandler"; //$NON-NLS-1$
-
-    public void execute(final IProject project, final IProjectFacetVersion fv,
-            final Object config, final IProgressMonitor monitor)
-            throws CoreException
-    {
-        PlatformUI.getWorkbench().getDisplay().syncExec(new Runnable()
-        {
-            public void run()
-            {
-                final FacetChangeModel model = (FacetChangeModel) config;
-
-                // XXX: look at glassfish changes
-                handleDesignTimeViewHandler(project);
-
-                if (model.isChgViewHandler())
-                {
-                    maybeChangeFaceletViewHandler(project, monitor);
-				}
-				
-				final WebAppConfigurator configurator = WebAppConfigurator
-                        .getConfigurator(project);
-
-                if (configurator != null)
-                {
-                    maybeChangeDefaultSuffix(model, configurator);
-                    maybeChangeConfigureListener(model, configurator);
-                    maybeChangeWebLifecycleListener(model, configurator);
-                }
-                else if (FaceletCoreTraceOptions.TRACE_FACETCHANGEDELEGATE)
-                {
-                    FaceletCoreTraceOptions
-                            .log("FaceletChangeDelegate: No web configurator"); //$NON-NLS-1$
-                }
-            }
-        });
-    }
-
-    /**
-     * Performs the change to the web lifecycle listener configuration of of the
-     * web.xml model using configurator, if applicable.
-     * 
-     * @param model
-     * @param configurator
-     */
-    protected abstract void maybeChangeWebLifecycleListener(
-            FacetChangeModel model, WebAppConfigurator configurator);
-
-    /**
-     * Performs the change to the configure listener configuration of the
-     * web.xml model using configurator, if applicable.
-     * 
-     * @param model
-     * @param configurator
-     */
-    protected abstract void maybeChangeConfigureListener(
-            FacetChangeModel model, WebAppConfigurator configurator);
-
-    /**
-     * Performs the change to the DEFAULT_SUFFIX configuration of the web.xml
-     * model using configurator, if applicable.
-     * 
-     * @param model
-     * @param configurator
-     */
-    protected abstract void maybeChangeDefaultSuffix(FacetChangeModel model,
-            WebAppConfigurator configurator);
-
-    /**
-     * Changes the runtime view handler settings on project if applicable.
-     * 
-     * @param project
-     * @param monitor
-     * 
-     */
-    protected abstract void maybeChangeFaceletViewHandler(IProject project,
-            IProgressMonitor monitor);
-
-    /**
-     * Change the designtime view handler if applicable.
-     * 
-     * @param project
-     */
-    protected abstract void handleDesignTimeViewHandler(final IProject project);
-
-    /**
-     * @return a user displayable name of the sub-classing change delegate.
-     */
-    protected abstract String getDisplayName();
-
-    /**
-     * @param root
-     * @return true if the Facelet view handler is already present in the
-     *         WEB-INF/faces-config.xml file.
-     */
-    protected final boolean isViewHandlerPresent(final FacesConfigType root)
-    {
-        final EList<?> applications = root.getApplication();
-        for (final Object name : applications)
-        {
-            final ApplicationType app = (ApplicationType) name;
-            if (app != null)
-            {
-                for (final Iterator<?> viewIt = app.getViewHandler().iterator(); viewIt
-                        .hasNext();)
-                {
-                    final ViewHandlerType viewHandler = (ViewHandlerType) viewIt
-                            .next();
-                    if (viewHandler != null
-                            && RUNTIME_VIEWHANDLER_CLASS_NAME
-                                    .equals(viewHandler.getTextContent().trim()))
-                    {
-                        return true;
-                    }
-                }
-            }
-        }
-        return false;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/facet/FaceletFacet.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/facet/FaceletFacet.java
deleted file mode 100644
index ed425a4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/facet/FaceletFacet.java
+++ /dev/null
@@ -1,96 +0,0 @@
-package org.eclipse.jst.jsf.facelet.core.internal.facet;
-
-import java.util.Iterator;
-import java.util.Set;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.wst.common.project.facet.core.IFacetedProject;
-import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
-import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
-
-/**
- * Facelet facet constants and utilities
- * @author cbateman
- *
- */
-public final class FaceletFacet
-{
-    /**
-     * Facelet facet id
-     */
-    public final static String FACET_ID        = "jsf.facelet"; //$NON-NLS-1$
-    /**
-     * The id of the Facelet HTML view handler
-     */
-    public final static String VIEW_HANDLER_ID = "org.eclipse.jst.jsf.facelet.core.html.viewhandler"; //$NON-NLS-1$
-    static final String COM_SUN_FACES_APPLICATION_WEBAPP_LIFECYCLE_LISTENER = "com.sun.faces.application.WebappLifecycleListener"; //$NON-NLS-1$
-    static final String COM_SUN_FACES_CONFIG_CONFIGURE_LISTENER             = "com.sun.faces.config.ConfigureListener";           //$NON-NLS-1$
-    static final String XHTML                                               = ".xhtml";                                           //$NON-NLS-1$
-    static final String JAVAX_FACES_DEFAULT_SUFFIX                          = "javax.faces.DEFAULT_SUFFIX";                       //$NON-NLS-1$
-
-    private FaceletFacet()
-    {
-        // no external instantiation
-    }
-
-    /**
-     * @param project
-     * @return true if projec has the facelet facet installed.
-     */
-    public static boolean hasFacet(final IProject project)
-    {
-        final IProjectFacetVersion facetVersion = getProjectFacet(project);
-
-        if (facetVersion != null)
-        {
-            return true;
-        }
-        return false;
-    }
-
-    /**
-     * Get the facet version for the project
-     * 
-     * @param project
-     * @return the project facet version or null if could not be found or if
-     *  project is not accessible
-     */
-    @SuppressWarnings("unchecked")
-    public static IProjectFacetVersion getProjectFacet(final IProject project)
-    {
-        // check for null or inaccessible project
-        if (project != null && project.isAccessible())
-        {
-            // check for Facelet facet on project
-            try
-            {
-                final IFacetedProject facetedProject = ProjectFacetsManager
-                        .create(project);
-                if (facetedProject != null)
-                {
-                    final Set projectFacets = facetedProject.getProjectFacets();
-                    final Iterator itProjectFacets = projectFacets.iterator();
-                    while (itProjectFacets.hasNext())
-                    {
-                        final IProjectFacetVersion projectFacetVersion = (IProjectFacetVersion) itProjectFacets
-                                .next();
-                        if (FACET_ID.equals(projectFacetVersion
-                                .getProjectFacet().getId()))
-                        {
-                            return projectFacetVersion;
-                        }
-                    }
-                }
-            }
-            catch (final CoreException ce)
-            {
-                // log error
-                JSFCorePlugin.log(IStatus.ERROR, ce.getLocalizedMessage(), ce);
-            }
-        }
-        return null;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/facet/FaceletFacetChangeDataModelProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/facet/FaceletFacetChangeDataModelProvider.java
deleted file mode 100644
index f987c6a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/facet/FaceletFacetChangeDataModelProvider.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facelet.core.internal.facet;
-
-import java.beans.BeanInfo;
-import java.beans.IntrospectionException;
-import java.beans.Introspector;
-import java.beans.PropertyDescriptor;
-import java.util.Set;
-
-import org.eclipse.jst.jsf.facelet.core.internal.FaceletCorePlugin;
-import org.eclipse.wst.common.componentcore.datamodel.FacetInstallDataModelProvider;
-
-/**
- * The base data  model provider for the facet install/uninstall
- * 
- * @author cbateman
- *
- */
-public abstract class FaceletFacetChangeDataModelProvider extends
-FacetInstallDataModelProvider
-{
-    /**
-     * Change key identifier for web app lifecycle listener
-     */
-    protected static final String CHG_WEB_APP_LIFECYCLE_LISTENER = "chgWebAppLifecycleListener"; //$NON-NLS-1$
-    /**
-     * Change key identifier for configure listener
-     */
-    protected static final String CHG_CONFIGURE_LISTENER         = "chgConfigureListener"; //$NON-NLS-1$
-    /**
-     * Change key identifier for the Facelet runtime view handler
-     */
-    protected static final String CHG_VIEW_HANDLER               = "chgViewHandler"; //$NON-NLS-1$
-    /**
-     * Change key identifier for the default suffix
-     */
-    protected static final String CHG_DEFAULT_SUFFIX             = "chgDefaultSuffix"; //$NON-NLS-1$
-
-    private BeanInfo              _beanInfo;
-
-    /**
-     * 
-     */
-    public FaceletFacetChangeDataModelProvider()
-    {
-        try
-        {
-            _beanInfo = Introspector.getBeanInfo(FacetInstallModel.class);
-        }
-        catch (final IntrospectionException e)
-        {
-            // TODO: suppress for now
-            FaceletCorePlugin.log("Problem getting bean info for FacetInstallModel", e); //$NON-NLS-1$
-        }
-    }
-
-    @Override
-    public Object create()
-    {
-        final FacetChangeModel model_ = createChangeModel();
-
-        model_
-        .setChgDefaultSuffix(((Boolean) getDefaultProperty(CHG_DEFAULT_SUFFIX)).booleanValue());
-        model_.setChgViewHandler(((Boolean) getDefaultProperty(CHG_VIEW_HANDLER)).booleanValue());
-        model_
-        .setChgConfigureListener(((Boolean) getDefaultProperty(CHG_CONFIGURE_LISTENER)).booleanValue());
-        model_
-        .setChgWebAppLifecycleListener(((Boolean) getDefaultProperty(CHG_WEB_APP_LIFECYCLE_LISTENER)).booleanValue());
-
-        return model_;
-    }
-
-    /**
-     * @return the change model to be used by the delegate.
-     */
-    protected abstract FacetChangeModel createChangeModel();
-
-    /**
-     * Set the default property value
-     */
-    @Override
-    public Object getDefaultProperty(final String propertyName)
-    {
-        return super.getDefaultProperty(propertyName);
-    }
-
-    @SuppressWarnings("unchecked")
-    @Override
-    public Set getPropertyNames()
-    {
-        final Set<String> propSet = super.getPropertyNames();
-        final PropertyDescriptor[] props = _beanInfo.getPropertyDescriptors();
-        for (final PropertyDescriptor prop : props)
-        {
-            propSet.add(prop.getName());
-        }
-        return propSet;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/facet/FaceletFacetDefaultVersionProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/facet/FaceletFacetDefaultVersionProvider.java
deleted file mode 100644
index fd39d60..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/facet/FaceletFacetDefaultVersionProvider.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package org.eclipse.jst.jsf.facelet.core.internal.facet;
-
-import org.eclipse.wst.common.project.facet.core.IDefaultVersionProvider;
-import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
-import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
-
-/**
- * Provides the default Facelet project facet version. Currently always returns
- * "1.1" facet version.
- */
-public final class FaceletFacetDefaultVersionProvider implements
-        IDefaultVersionProvider
-{
-
-    /**
-     * The global id for the Facelet facet
-     */
-    private static final String DEFAULT_FACET_ID      = FaceletFacet.FACET_ID;
-
-    private static final String DEFAULT_FACET_VERSION = "1.0"; //$NON-NLS-1$
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.wst.common.project.facet.core.IDefaultVersionProvider#getDefaultVersion()
-     */
-
-    public IProjectFacetVersion getDefaultVersion()
-    {
-        return ProjectFacetsManager.getProjectFacet(DEFAULT_FACET_ID)
-                .getVersion(DEFAULT_FACET_VERSION);
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/facet/FaceletFacetInstallDataModelProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/facet/FaceletFacetInstallDataModelProvider.java
deleted file mode 100644
index 25ac2aa..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/facet/FaceletFacetInstallDataModelProvider.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package org.eclipse.jst.jsf.facelet.core.internal.facet;
-
-
-/**
- * The data model provider for the facet install.
- * 
- * @author cbateman
- *
- */
-public class FaceletFacetInstallDataModelProvider extends FaceletFacetChangeDataModelProvider
-{
-    @Override
-    public Object getDefaultProperty(final String propertyName)
-    {
-        if (propertyName.equals(CHG_DEFAULT_SUFFIX))
-        {
-            return Boolean.TRUE;
-        }
-        else if (propertyName.equals(CHG_VIEW_HANDLER))
-        {
-            return Boolean.TRUE;
-        }
-        else if (propertyName.equals(CHG_CONFIGURE_LISTENER))
-        {
-            return Boolean.FALSE;
-        }
-        else if (propertyName.equals(CHG_WEB_APP_LIFECYCLE_LISTENER))
-        {
-            return Boolean.FALSE;
-        }
-        return super.getDefaultProperty(propertyName);
-    }
-
-    @Override
-    protected FacetChangeModel createChangeModel()
-    {
-        return new FacetInstallModel();
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/facet/FaceletFacetUninstallModelProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/facet/FaceletFacetUninstallModelProvider.java
deleted file mode 100644
index e17e071..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/facet/FaceletFacetUninstallModelProvider.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.facelet.core.internal.facet;
-
-
-/**
- * The data model provider for facet uninstall.
- * 
- * @author cbateman
- *
- */
-public class FaceletFacetUninstallModelProvider extends FaceletFacetChangeDataModelProvider
-{
-    @Override
-    public Object getDefaultProperty(final String propertyName)
-    {
-        if (propertyName.equals(CHG_DEFAULT_SUFFIX))
-        {
-            return Boolean.FALSE;
-        }
-        else if (propertyName.equals(CHG_VIEW_HANDLER))
-        {
-            return Boolean.FALSE;
-        }
-        else if (propertyName.equals(CHG_CONFIGURE_LISTENER))
-        {
-            return Boolean.FALSE;
-        }
-        else if (propertyName.equals(CHG_WEB_APP_LIFECYCLE_LISTENER))
-        {
-            return Boolean.FALSE;
-        }
-        return super.getDefaultProperty(propertyName);
-    }
-
-    @Override
-    protected FacetChangeModel createChangeModel()
-    {
-        return new FaceletUninstallModel();
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/facet/FaceletInstallDelegate.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/facet/FaceletInstallDelegate.java
deleted file mode 100644
index 64eb0ee..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/facet/FaceletInstallDelegate.java
+++ /dev/null
@@ -1,234 +0,0 @@
-package org.eclipse.jst.jsf.facelet.core.internal.facet;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.jst.jsf.designtime.DesignTimeApplicationManager;
-import org.eclipse.jst.jsf.facelet.core.internal.FaceletCoreTraceOptions;
-import org.eclipse.jst.jsf.facesconfig.emf.ApplicationType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType;
-import org.eclipse.jst.jsf.facesconfig.emf.ViewHandlerType;
-import org.eclipse.jst.jsf.facesconfig.util.FacesConfigArtifactEdit;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
-
-/**
- * The facet installing delegate for Facelets.
- * 
- * @author cbateman
- * 
- */
-public class FaceletInstallDelegate extends FaceletChangeDelegate
-{
-
-    @Override
-    public void execute(final IProject project, final IProjectFacetVersion fv,
-            final Object config, final IProgressMonitor monitor)
-            throws CoreException
-    {
-        final FacetChangeModel model = (FacetChangeModel) config;
-        if (FaceletCoreTraceOptions.TRACE_FACETINSTALLDELEGATE)
-        {
-            FaceletCoreTraceOptions.log("Installing facet on project: " //$NON-NLS-1$
-                    + project.getName());
-
-            FaceletCoreTraceOptions.log(String.format(
-                    "FaceletInstallDelegate: Add default selection %b", //$NON-NLS-1$
-                    Boolean.valueOf(model.isChgDefaultSuffix())));
-            FaceletCoreTraceOptions
-                    .log(String
-                            .format(
-                                    "FaceletInstallDelegate: Add view handler %b", Boolean.valueOf(model //$NON-NLS-1$
-                                                    .isChgViewHandler())));
-            FaceletCoreTraceOptions.log(String.format(
-                    "FaceletInstallDelegate: Add configure listener %b", //$NON-NLS-1$
-                    Boolean.valueOf(model.isChgConfigureListener())));
-            FaceletCoreTraceOptions
-                    .log(String
-                            .format(
-                                    "FaceletInstallDelegate: Add web app lifecycle listener %b", //$NON-NLS-1$
-                                    Boolean.valueOf(model
-                                            .isChgWebAppLifecycleListener())));
-        }
-
-        try
-        {
-            if (monitor != null)
-            {
-                monitor.beginTask("Installing facelet facet", 1); //$NON-NLS-1$
-            }
-
-            super.execute(project, fv, config, monitor);
-        }
-        finally
-        {
-            if (monitor != null)
-            {
-                monitor.done();
-            }
-        }
-    }
-
-    /**
-     * Install the facelet view handler in the WEB-INF/faces-config file if not
-     * already present.
-     * 
-     * @param project
-     * @param monitor
-     */
-    @Override
-    protected void maybeChangeFaceletViewHandler(final IProject project,
-            final IProgressMonitor monitor)
-    {
-        if (FaceletCoreTraceOptions.TRACE_FACETINSTALLDELEGATE)
-        {
-            FaceletCoreTraceOptions
-                    .log("FaceletInstallDelegate: Installing facelet view handler"); //$NON-NLS-1$
-        }
-
-        final FacesConfigArtifactEdit edit = FacesConfigArtifactEdit
-                .getFacesConfigArtifactEditForWrite(project,
-                        "WEB-INF/faces-config.xml"); //$NON-NLS-1$
-        if (edit != null)
-        {
-            try
-            {
-                final FacesConfigType root = edit.getFacesConfig();
-                if (!isViewHandlerPresent(root))
-                {
-                    if (FaceletCoreTraceOptions.TRACE_FACETINSTALLDELEGATE)
-                    {
-                        FaceletCoreTraceOptions
-                                .log("FaceletInstallDelegate: View Handler not already found in faces-config"); //$NON-NLS-1$
-                    }
-
-                    PlatformUI.getWorkbench().getDisplay().syncExec(
-                            new TempSafeUpdateFacesConfigOnUIThread(edit,
-                                    monitor));
-
-                    if (FaceletCoreTraceOptions.TRACE_FACETINSTALLDELEGATE)
-                    {
-                        FaceletCoreTraceOptions
-                                .log("FaceletInstallDelegate: Saved changes for facelet view handler"); //$NON-NLS-1$
-                    }
-                }
-                else
-                {
-                    if (FaceletCoreTraceOptions.TRACE_FACETINSTALLDELEGATE)
-                    {
-                        FaceletCoreTraceOptions
-                                .log("FaceletInstallDelegate: View Handler NOT already found in faces-config; not adding"); //$NON-NLS-1$
-                    }
-                }
-            }
-            finally
-            {
-                edit.dispose();
-            }
-        }
-    }
-
-    private static class TempSafeUpdateFacesConfigOnUIThread implements
-            Runnable
-    {
-        private final FacesConfigArtifactEdit _edit;
-        private final IProgressMonitor        _monitor;
-
-        public TempSafeUpdateFacesConfigOnUIThread(
-                final FacesConfigArtifactEdit edit,
-                final IProgressMonitor monitor)
-        {
-            _edit = edit;
-            _monitor = monitor;
-        }
-
-        @SuppressWarnings("unchecked")
-        public void run()
-        {
-
-            final FacesConfigType root = _edit.getFacesConfig();
-            final EList applications = root.getApplication();
-            ApplicationType application = null;
-            if (applications.size() > 0)
-            {
-                application = (ApplicationType) applications.get(0);
-            }
-            else
-            {
-                application = FacesConfigFactory.eINSTANCE
-                        .createApplicationType();
-                applications.add(application);
-            }
-            final ViewHandlerType viewHandlerType = FacesConfigFactory.eINSTANCE
-                    .createViewHandlerType();
-            viewHandlerType.setTextContent(RUNTIME_VIEWHANDLER_CLASS_NAME);
-            application.getViewHandler().add(viewHandlerType);
-            _edit.save(_monitor);
-        }
-    }
-
-    @Override
-    protected void handleDesignTimeViewHandler(final IProject project)
-    {
-        final DesignTimeApplicationManager manager = DesignTimeApplicationManager
-                .getInstance(project);
-
-        manager.setViewHandlerId(FaceletFacet.VIEW_HANDLER_ID);
-    }
-
-    @Override
-    protected String getDisplayName()
-    {
-        return Messages.FaceletInstallDelegate_FACET_INSTALLER_DELEGATE_DISPLAY_NAME;
-    }
-
-    @Override
-    protected void maybeChangeDefaultSuffix(final FacetChangeModel model,
-            final WebAppConfigurator configurator)
-    {
-        if (model.isChgDefaultSuffix())
-        {
-            if (FaceletCoreTraceOptions.TRACE_FACETINSTALLDELEGATE)
-            {
-                FaceletCoreTraceOptions
-                        .log("FaceletInstallDelegate: Installing DEFAULT_SUFFIX"); //$NON-NLS-1$
-            }
-            configurator.addContextParam(FaceletFacet.JAVAX_FACES_DEFAULT_SUFFIX, FaceletFacet.XHTML,
-                    false);
-        }
-    }
-
-    @Override
-    protected void maybeChangeConfigureListener(final FacetChangeModel model,
-            final WebAppConfigurator configurator)
-    {
-        if (model.isChgConfigureListener())
-        {
-            if (FaceletCoreTraceOptions.TRACE_FACETINSTALLDELEGATE)
-            {
-                FaceletCoreTraceOptions
-                        .log("FaceletInstallDelegate: Install Configure Listener"); //$NON-NLS-1$
-            }
-            configurator.addListener(FaceletFacet.COM_SUN_FACES_CONFIG_CONFIGURE_LISTENER,
-                    false);
-        }
-    }
-
-    @Override
-    protected void maybeChangeWebLifecycleListener(
-            final FacetChangeModel model, final WebAppConfigurator configurator)
-    {
-        if (model.isChgWebAppLifecycleListener())
-        {
-            if (FaceletCoreTraceOptions.TRACE_FACETINSTALLDELEGATE)
-            {
-                FaceletCoreTraceOptions
-                        .log("FaceletInstallDelegate: Install WebappLifecycleListener"); //$NON-NLS-1$
-            }
-            configurator.addListener(
-                    FaceletFacet.COM_SUN_FACES_APPLICATION_WEBAPP_LIFECYCLE_LISTENER, false);
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/facet/FaceletUninstallDelegate.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/facet/FaceletUninstallDelegate.java
deleted file mode 100644
index 3e0170e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/facet/FaceletUninstallDelegate.java
+++ /dev/null
@@ -1,236 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facelet.core.internal.facet;
-
-import java.util.Iterator;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.jst.jsf.designtime.DesignTimeApplicationManager;
-import org.eclipse.jst.jsf.facelet.core.internal.FaceletCoreTraceOptions;
-import org.eclipse.jst.jsf.facesconfig.emf.ApplicationType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType;
-import org.eclipse.jst.jsf.facesconfig.emf.ViewHandlerType;
-import org.eclipse.jst.jsf.facesconfig.util.FacesConfigArtifactEdit;
-import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
-
-/**
- * The facet removal delegate for Facelets.
- * 
- * @author cbateman
- * 
- */
-public class FaceletUninstallDelegate extends FaceletChangeDelegate
-{
-
-    @Override
-    public void execute(final IProject project, final IProjectFacetVersion fv,
-            final Object config, final IProgressMonitor monitor)
-            throws CoreException
-    {
-        final FacetChangeModel model = (FacetChangeModel) config;
-        if (FaceletCoreTraceOptions.TRACE_FACETUNINSTALLDELEGATE)
-        {
-            FaceletCoreTraceOptions.log("Uninstalling facet on project: " //$NON-NLS-1$
-                    + project.getName());
-
-            FaceletCoreTraceOptions.log(String.format(
-                    "FaceletUninstallDelegate: Remove default selection %b", //$NON-NLS-1$
-                    Boolean.valueOf(model.isChgDefaultSuffix())));
-            FaceletCoreTraceOptions
-                    .log(String
-                            .format(
-                                    "FaceletUninstallDelegate: Remove view handler %b", Boolean.valueOf(model //$NON-NLS-1$
-                                                    .isChgViewHandler())));
-            FaceletCoreTraceOptions.log(String.format(
-                    "FaceletUninstallDelegate: Remove configure listener %b", //$NON-NLS-1$
-                    Boolean.valueOf(model.isChgConfigureListener())));
-            FaceletCoreTraceOptions
-                    .log(String
-                            .format(
-                                    "FaceletUninstallDelegate: Remove web app lifecycle listener %b", //$NON-NLS-1$
-                                    Boolean.valueOf(model
-                                            .isChgWebAppLifecycleListener())));
-        }
-
-        try
-        {
-            if (monitor != null)
-            {
-                monitor.beginTask("Uninstalling facelet facet", 1); //$NON-NLS-1$
-            }
-
-            super.execute(project, fv, config, monitor);
-        }
-        finally
-        {
-            if (monitor != null)
-            {
-                monitor.done();
-            }
-        }
-    }
-
-    /**
-     * Install the facelet view handler in the WEB-INF/faces-config file if not
-     * already present.
-     * 
-     * @param project
-     * @param monitor
-     */
-    @SuppressWarnings("unchecked")
-    @Override
-    protected void maybeChangeFaceletViewHandler(final IProject project,
-            final IProgressMonitor monitor)
-    {
-        if (FaceletCoreTraceOptions.TRACE_FACETUNINSTALLDELEGATE)
-        {
-            FaceletCoreTraceOptions
-                    .log("FaceletInstallDelegate: Uninstalling facelet view handler"); //$NON-NLS-1$
-        }
-
-        final FacesConfigArtifactEdit edit = FacesConfigArtifactEdit
-                .getFacesConfigArtifactEditForWrite(project,
-                        "WEB-INF/faces-config.xml"); //$NON-NLS-1$
-        if (edit != null)
-        {
-            try
-            {
-                final FacesConfigType root = edit.getFacesConfig();
-                if (isViewHandlerPresent(root))
-                {
-                    if (FaceletCoreTraceOptions.TRACE_FACETUNINSTALLDELEGATE)
-                    {
-                        FaceletCoreTraceOptions
-                                .log("FaceletInstallDelegate: View Handler not already found in faces-config"); //$NON-NLS-1$
-                    }
-                    final EList applications = root.getApplication();
-
-                    for (final Iterator<?> appIt = applications.iterator(); appIt
-                            .hasNext();)
-                    {
-                        final ApplicationType application = (ApplicationType) appIt
-                                .next();
-                        for (final Iterator viewHandlerIt = application
-                                .getViewHandler().iterator(); viewHandlerIt
-                                .hasNext();)
-                        {
-                            final ViewHandlerType viewHandlerType = (ViewHandlerType) viewHandlerIt
-                                    .next();
-                            if (viewHandlerType != null
-                                    && RUNTIME_VIEWHANDLER_CLASS_NAME
-                                            .equals(viewHandlerType
-                                                    .getTextContent().trim()))
-                            {
-                                viewHandlerIt.remove();
-
-                                if (FaceletCoreTraceOptions.TRACE_FACETUNINSTALLDELEGATE)
-                                {
-                                    FaceletCoreTraceOptions
-                                            .log("FaceletUninstallDelegate: Removed runtime view handler"); //$NON-NLS-1$
-                                }
-                            }
-                        }
-                    }
-
-                    edit.save(monitor);
-
-                    if (FaceletCoreTraceOptions.TRACE_FACETUNINSTALLDELEGATE)
-                    {
-                        FaceletCoreTraceOptions
-                                .log("FaceletUninstallDelegate: Saved changes for facelet view handler"); //$NON-NLS-1$
-                    }
-                }
-                else
-                {
-                    if (FaceletCoreTraceOptions.TRACE_FACETUNINSTALLDELEGATE)
-                    {
-                        FaceletCoreTraceOptions
-                                .log("FaceletInstallDelegate: View Handler NOT already found in faces-config; not adding"); //$NON-NLS-1$
-                    }
-                }
-            }
-            finally
-            {
-                edit.dispose();
-            }
-        }
-    }
-
-    @Override
-    protected void handleDesignTimeViewHandler(final IProject project)
-    {
-        final DesignTimeApplicationManager manager = DesignTimeApplicationManager
-                .getInstance(project);
-
-        // TODO: need this API
-        //manager.clearViewHandlerId();
-        manager.setViewHandlerId("org.eclipse.jst.jsf.designtime.view.jspviewhandler"); //$NON-NLS-1$
-    }
-
-    @Override
-    protected String getDisplayName()
-    {
-        return Messages.FaceletUninstallDelegate_FACET_INSTALLER_DELEGATE_DISPLAY_NAME;
-    }
-
-    @Override
-    protected void maybeChangeDefaultSuffix(final FacetChangeModel model,
-            final WebAppConfigurator configurator)
-    {
-        if (model.isChgDefaultSuffix())
-        {
-            if (FaceletCoreTraceOptions.TRACE_FACETUNINSTALLDELEGATE)
-            {
-                FaceletCoreTraceOptions
-                        .log("FaceletUninstallDelegate: Removing DEFAULT_SUFFIX"); //$NON-NLS-1$
-            }
-            configurator
-                    .removeContextParam(
-                            FaceletFacet.JAVAX_FACES_DEFAULT_SUFFIX,
-                            FaceletFacet.XHTML);
-        }
-    }
-
-    @Override
-    protected void maybeChangeConfigureListener(final FacetChangeModel model,
-            final WebAppConfigurator configurator)
-    {
-        if (model.isChgConfigureListener())
-        {
-            if (FaceletCoreTraceOptions.TRACE_FACETUNINSTALLDELEGATE)
-            {
-                FaceletCoreTraceOptions
-                        .log("FaceletUninstallDelegate: Remove Configure Listener"); //$NON-NLS-1$
-            }
-            configurator
-                    .removeListener(FaceletFacet.COM_SUN_FACES_CONFIG_CONFIGURE_LISTENER);
-        }
-    }
-
-    @Override
-    protected void maybeChangeWebLifecycleListener(
-            final FacetChangeModel model, final WebAppConfigurator configurator)
-    {
-        if (model.isChgWebAppLifecycleListener())
-        {
-            if (FaceletCoreTraceOptions.TRACE_FACETUNINSTALLDELEGATE)
-            {
-                FaceletCoreTraceOptions
-                        .log("FaceletUninstallDelegate: Remove WebappLifecycleListener"); //$NON-NLS-1$
-            }
-            configurator
-                    .removeListener(FaceletFacet.COM_SUN_FACES_APPLICATION_WEBAPP_LIFECYCLE_LISTENER);
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/facet/FaceletUninstallModel.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/facet/FaceletUninstallModel.java
deleted file mode 100644
index c8b6d19..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/facet/FaceletUninstallModel.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facelet.core.internal.facet;
-
-import java.beans.PropertyChangeListener;
-import java.beans.PropertyChangeSupport;
-
-/*package*/ class FaceletUninstallModel extends FacetChangeModel
-{
-    // default bean listeners
-    private final PropertyChangeSupport _changeSupport = new PropertyChangeSupport(
-                                                              this);
-
-    public void addPropertyChangeListener(final String propertyName,
-            final PropertyChangeListener listener)
-    {
-        _changeSupport.addPropertyChangeListener(propertyName, listener);
-    }
-
-    public void removePropertyChangeListener(final String propertyName,
-            final PropertyChangeListener listener)
-    {
-        _changeSupport.removePropertyChangeListener(propertyName, listener);
-    }
-
-    @Override
-    public ChangeActionType getChangeActionType()
-    {
-        return ChangeActionType.REMOVE;
-    }
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/facet/FacetChangeModel.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/facet/FacetChangeModel.java
deleted file mode 100644
index 1235e3f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/facet/FacetChangeModel.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facelet.core.internal.facet;
-
-/**
- * Encapsulate configuration change data during facet install/uninstall
- * @author cbateman
- *
- */
-public abstract class FacetChangeModel
-{
-    private boolean _chgDefaultSuffix;
-    private boolean _chgViewHandler;
-    private boolean _chgConfigureListener;
-    private boolean _chgWebAppLifecycleListener;
-
-    /**
-     * @return the type of change action
-     */
-    public abstract ChangeActionType getChangeActionType();
-
-    /**
-     * @return true if should change the runtime view handler configuration
-     */
-    public boolean isChgViewHandler()
-    {
-        return _chgViewHandler;
-    }
-
-    /**
-     * @param chgViewHandler
-     */
-    public void setChgViewHandler(final boolean chgViewHandler)
-    {
-        _chgViewHandler = chgViewHandler;
-    }
-
-    /**
-     * @return true if should change DEFAULT_SUFFIX option
-     */
-    public boolean isChgDefaultSuffix()
-    {
-        return _chgDefaultSuffix;
-    }
-
-    /**
-     * @param chgDefaultSuffix
-     */
-    public void setChgDefaultSuffix(final boolean chgDefaultSuffix)
-    {
-        _chgDefaultSuffix = chgDefaultSuffix;
-    }
-
-    /**
-     * @return true if should change the configure listener option
-     */
-    public boolean isChgConfigureListener()
-    {
-        return _chgConfigureListener;
-    }
-
-    /**
-     * @param chgConfigureListener
-     */
-    public void setChgConfigureListener(final boolean chgConfigureListener)
-    {
-        _chgConfigureListener = chgConfigureListener;
-    }
-
-    /**
-     * @return true if should change the webapp lifecycle listener option
-     */
-    public boolean isChgWebAppLifecycleListener()
-    {
-        return _chgWebAppLifecycleListener;
-    }
-
-    /**
-     * @param chgWebAppLifecycleListener
-     */
-    public void setChgWebAppLifecycleListener(
-            final boolean chgWebAppLifecycleListener)
-    {
-        _chgWebAppLifecycleListener = chgWebAppLifecycleListener;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/facet/FacetInstallModel.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/facet/FacetInstallModel.java
deleted file mode 100644
index aeac135..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/facet/FacetInstallModel.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package org.eclipse.jst.jsf.facelet.core.internal.facet;
-
-import java.beans.PropertyChangeListener;
-import java.beans.PropertyChangeSupport;
-
-/*package*/ class FacetInstallModel extends FacetChangeModel
-{
-    // default bean listeners
-    private final PropertyChangeSupport changeSupport = new PropertyChangeSupport(
-                                                              this);
-
-    public void addPropertyChangeListener(final String propertyName,
-            final PropertyChangeListener listener)
-    {
-        changeSupport.addPropertyChangeListener(propertyName, listener);
-    }
-
-    public void removePropertyChangeListener(final String propertyName,
-            final PropertyChangeListener listener)
-    {
-        changeSupport.removePropertyChangeListener(propertyName, listener);
-    }
-
-    @Override
-    public ChangeActionType getChangeActionType()
-    {
-        return ChangeActionType.ADD;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/facet/Messages.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/facet/Messages.java
deleted file mode 100644
index b7e076d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/facet/Messages.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facelet.core.internal.facet;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * NLS message file
- * 
- * @author cbateman
- *
- */
-public class Messages extends NLS
-{
-    private static final String BUNDLE_NAME = "org.eclipse.jst.jsf.facelet.core.internal.facet.messages"; //$NON-NLS-1$
-    /**
-     * see messages.properties
-     */
-    public static String        FaceletInstallDelegate_FACET_INSTALLER_DELEGATE_DISPLAY_NAME;
-    /**
-     * see messages.properties
-     */
-    public static String FaceletUninstallDelegate_FACET_INSTALLER_DELEGATE_DISPLAY_NAME;
-    static
-    {
-        // initialize resource bundle
-        NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-    }
-
-    private Messages()
-    {
-        // no external instantiation
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/facet/WebAppConfigurator.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/facet/WebAppConfigurator.java
deleted file mode 100644
index f5de1e9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/facet/WebAppConfigurator.java
+++ /dev/null
@@ -1,394 +0,0 @@
-package org.eclipse.jst.jsf.facelet.core.internal.facet;
-
-import java.util.Iterator;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jst.j2ee.model.IModelProvider;
-import org.eclipse.jst.j2ee.model.ModelProviderManager;
-import org.eclipse.jst.jsf.facelet.core.internal.FaceletCorePlugin;
-
-/**
- * Insulates caller from the insane J2EE/JavaEE dual model.
- * 
- * @author cbateman
- * 
- */
-public abstract class WebAppConfigurator
-{
-    /**
-     * @param project
-     * @return the configurator for project or null if none
-     */
-    public static WebAppConfigurator getConfigurator(final IProject project)
-    {
-        final IModelProvider provider = ModelProviderManager
-                .getModelProvider(project);
-        final Object webAppObj = provider.getModelObject();
-        if (webAppObj == null)
-        {
-            FaceletCorePlugin.log("Error getting web app configurator", //$NON-NLS-1$
-                    new Throwable());
-            return null;
-        }
-
-        if (webAppObj instanceof org.eclipse.jst.javaee.web.WebApp)
-        {
-            return new JavaEEWebAppConfigurator(project);
-        }
-        else if (webAppObj instanceof org.eclipse.jst.j2ee.webapplication.WebApp)
-        {
-            return new J2EEWebAppConfigurator(project);
-        }
-
-        return null;
-    }
-
-    private final IProject _project;
-
-    WebAppConfigurator(final IProject project)
-    {
-        _project = project;
-    }
-
-    /**
-     * @param paramName
-     * @param paramValue
-     * @param addEvenIfPresent
-     */
-    public abstract void addContextParam(final String paramName,
-            final String paramValue, final boolean addEvenIfPresent);
-
-    /**
-     * @param paramName
-     * @param paramValue
-     */
-    public abstract void removeContextParam(final String paramName,
-            final String paramValue);
-
-    /**
-     * Adds the listenerClass to the webapp config. If addEventIfPresent is
-     * false, then it will not add it if it finds it already. If true, it will
-     * forcibly add.
-     * 
-     * @param listenerClass
-     * @param addEvenIfPresent
-     */
-    public abstract void addListener(final String listenerClass,
-            final boolean addEvenIfPresent);
-
-    /**
-     * @param listenerClass
-     */
-    public abstract void removeListener(final String listenerClass);
-
-    /**
-     * @param runnable
-     */
-    protected void executeChange(final Runnable runnable)
-    {
-        final IPath webXMLPath = new Path("WEB-INF").append("web.xml"); //$NON-NLS-1$ //$NON-NLS-2$
-        final IModelProvider provider = ModelProviderManager
-                .getModelProvider(getProject());
-        provider.modify(runnable, webXMLPath);
-    }
-
-    /**
-     * @return the project
-     */
-    protected IProject getProject()
-    {
-        return _project;
-    }
-
-    @SuppressWarnings("unchecked")
-    private static class JavaEEWebAppConfigurator extends WebAppConfigurator
-    {
-        public JavaEEWebAppConfigurator(final IProject project)
-        {
-            super(project);
-        }
-
-        @Override
-        public void addContextParam(final String paramName,
-                final String paramValue, final boolean addEvenIfPresent)
-        {
-            final Runnable runnable = new Runnable()
-            {
-                public void run()
-                {
-                    final org.eclipse.jst.javaee.web.WebApp webApp = (org.eclipse.jst.javaee.web.WebApp) ModelProviderManager
-                            .getModelProvider(getProject()).getModelObject();
-                    if (addEvenIfPresent
-                            || !isContextParamPresent(webApp, paramName))
-                    {
-                        final org.eclipse.jst.javaee.core.ParamValue newParamValue = org.eclipse.jst.javaee.core.JavaeeFactory.eINSTANCE
-                                .createParamValue();
-                        newParamValue.setParamName(paramName);
-                        newParamValue.setParamValue(paramValue);
-                        webApp.getContextParams().add(newParamValue);
-                    }
-                }
-            };
-            executeChange(runnable);
-        }
-
-        @Override
-        public void removeContextParam(final String paramName,
-                final String paramVal)
-        {
-            final Runnable runnable = new Runnable()
-            {
-                public void run()
-                {
-                    final org.eclipse.jst.javaee.web.WebApp webApp = (org.eclipse.jst.javaee.web.WebApp) ModelProviderManager
-                            .getModelProvider(getProject()).getModelObject();
-                    for (final Iterator<?> it = webApp.getContextParams()
-                            .iterator(); it.hasNext();)
-                    {
-                        final org.eclipse.jst.javaee.core.ParamValue paramValue = (org.eclipse.jst.javaee.core.ParamValue) it
-                                .next();
-                        if (paramName.equals(paramValue.getParamName().trim())
-                                && paramVal.equals(paramValue.getParamValue()
-                                        .trim()))
-                        {
-                            it.remove();
-                        }
-                    }
-                }
-            };
-            executeChange(runnable);
-        }
-
-        private boolean isContextParamPresent(
-                final org.eclipse.jst.javaee.web.WebApp webApp,
-                final String paramName)
-        {
-            for (final Iterator<?> it = webApp.getContextParams().iterator(); it
-                    .hasNext();)
-            {
-                final org.eclipse.jst.javaee.core.ParamValue paramValue = (org.eclipse.jst.javaee.core.ParamValue) it
-                        .next();
-                if (paramName.equals(paramValue.getParamName().trim()))
-                {
-                    return true;
-                }
-            }
-            return false;
-        }
-
-        @Override
-        public void addListener(final String listenerClass,
-                final boolean addEvenIfPresent)
-        {
-            final Runnable runnable = new Runnable()
-            {
-                public void run()
-                {
-                    final org.eclipse.jst.javaee.web.WebApp webApp = (org.eclipse.jst.javaee.web.WebApp) ModelProviderManager
-                            .getModelProvider(getProject()).getModelObject();
-
-                    if (addEvenIfPresent
-                            || !isListenerPresent(webApp, listenerClass))
-                    {
-                        final org.eclipse.jst.javaee.core.Listener listener = org.eclipse.jst.javaee.core.JavaeeFactory.eINSTANCE
-                                .createListener();
-                        listener.setListenerClass(listenerClass);
-                        webApp.getListeners().add(listener);
-                    }
-                }
-            };
-            executeChange(runnable);
-        }
-
-        @Override
-        public void removeListener(final String listenerClass)
-        {
-            final Runnable runnable = new Runnable()
-            {
-                public void run()
-                {
-                    final org.eclipse.jst.javaee.web.WebApp webApp = (org.eclipse.jst.javaee.web.WebApp) ModelProviderManager
-                            .getModelProvider(getProject()).getModelObject();
-                    for (final Iterator listenerIt = webApp.getListeners()
-                            .iterator(); listenerIt.hasNext();)
-                    {
-                        final org.eclipse.jst.javaee.core.Listener listener = (org.eclipse.jst.javaee.core.Listener) listenerIt
-                                .next();
-                        if (listenerClass.equals(listener.getListenerClass()
-                                .trim()))
-                        {
-                            listenerIt.remove();
-                        }
-                    }
-                }
-            };
-            executeChange(runnable);
-        }
-
-        private boolean isListenerPresent(
-                final org.eclipse.jst.javaee.web.WebApp webApp,
-                final String listenerClass)
-        {
-            for (final Iterator listenerIt = webApp.getListeners().iterator(); listenerIt
-                    .hasNext();)
-            {
-                final org.eclipse.jst.javaee.core.Listener listener = (org.eclipse.jst.javaee.core.Listener) listenerIt
-                        .next();
-                if (listenerClass.equals(listener.getListenerClass().trim()))
-                {
-                    return true;
-                }
-            }
-            return false;
-        }
-    }
-
-    @SuppressWarnings("unchecked")
-    private static class J2EEWebAppConfigurator extends WebAppConfigurator
-    {
-        public J2EEWebAppConfigurator(final IProject project)
-        {
-            super(project);
-        }
-
-        @Override
-        public void addContextParam(final String paramName,
-                final String paramValue, final boolean addEvenIfPresent)
-        {
-            final Runnable runnable = new Runnable()
-            {
-                public void run()
-                {
-                    final org.eclipse.jst.j2ee.webapplication.WebApp webApp = (org.eclipse.jst.j2ee.webapplication.WebApp) ModelProviderManager
-                            .getModelProvider(getProject()).getModelObject();
-
-                    if (addEvenIfPresent
-                            || !isContextParamPresent(webApp, paramName))
-                    {
-                        final org.eclipse.jst.j2ee.common.ParamValue newParamValue = org.eclipse.jst.j2ee.common.CommonFactory.eINSTANCE
-                                .createParamValue();
-                        newParamValue.setName(paramName);
-                        newParamValue.setValue(paramValue);
-                        webApp.getContextParams().add(newParamValue);
-                    }
-                }
-            };
-            executeChange(runnable);
-        }
-
-        @Override
-        public void removeContextParam(final String paramName,
-                final String paramVal)
-        {
-            final Runnable runnable = new Runnable()
-            {
-                public void run()
-                {
-                    final org.eclipse.jst.j2ee.webapplication.WebApp webApp = (org.eclipse.jst.j2ee.webapplication.WebApp) ModelProviderManager
-                            .getModelProvider(getProject()).getModelObject();
-                    for (final Iterator it = webApp.getContextParams()
-                            .iterator(); it.hasNext();)
-                    {
-                        final org.eclipse.jst.j2ee.common.ParamValue paramValue = (org.eclipse.jst.j2ee.common.ParamValue) it
-                                .next();
-                        if (paramName.equals(paramValue.getName().trim())
-                                && paramVal
-                                        .equals(paramValue.getValue().trim()))
-                        {
-                            it.remove();
-                        }
-                    }
-                }
-            };
-            executeChange(runnable);
-        }
-
-        private boolean isContextParamPresent(
-                final org.eclipse.jst.j2ee.webapplication.WebApp webApp,
-                final String paramName)
-        {
-            for (final Iterator it = webApp.getContextParams().iterator(); it
-                    .hasNext();)
-            {
-                final org.eclipse.jst.j2ee.common.ParamValue paramValue = (org.eclipse.jst.j2ee.common.ParamValue) it
-                        .next();
-                if (paramName.equals(paramValue.getName().trim()))
-                {
-                    return true;
-                }
-            }
-            return false;
-        }
-
-        @Override
-        public void addListener(final String listenerClass,
-                final boolean addEvenIfPresent)
-        {
-            final Runnable runnable = new Runnable()
-            {
-                public void run()
-                {
-                    final org.eclipse.jst.j2ee.webapplication.WebApp webApp = (org.eclipse.jst.j2ee.webapplication.WebApp) ModelProviderManager
-                            .getModelProvider(getProject()).getModelObject();
-
-                    if (addEvenIfPresent
-                            || !isListenerPresent(webApp, listenerClass))
-                    {
-                        final org.eclipse.jst.j2ee.common.Listener listener = org.eclipse.jst.j2ee.common.CommonFactory.eINSTANCE
-                                .createListener();
-                        listener.setListenerClassName(listenerClass);
-                        webApp.getListeners().add(listener);
-                    }
-                }
-            };
-            executeChange(runnable);
-        }
-
-        @Override
-        public void removeListener(final String listenerClass)
-        {
-            final Runnable runnable = new Runnable()
-            {
-                public void run()
-                {
-                    final org.eclipse.jst.j2ee.webapplication.WebApp webApp = (org.eclipse.jst.j2ee.webapplication.WebApp) ModelProviderManager
-                            .getModelProvider(getProject()).getModelObject();
-
-                    for (final Iterator listenerIt = webApp.getListeners()
-                            .iterator(); listenerIt.hasNext();)
-                    {
-                        final org.eclipse.jst.j2ee.common.Listener listener = (org.eclipse.jst.j2ee.common.Listener) listenerIt
-                                .next();
-                        if (listenerClass.equals(listener
-                                .getListenerClassName().trim()))
-                        {
-                            listenerIt.remove();
-                        }
-                    }
-                }
-            };
-            executeChange(runnable);
-        }
-
-        private boolean isListenerPresent(
-                final org.eclipse.jst.j2ee.webapplication.WebApp webApp,
-                final String listenerClass)
-        {
-            for (final Iterator listenerIt = webApp.getListeners().iterator(); listenerIt
-                    .hasNext();)
-            {
-                final org.eclipse.jst.j2ee.common.Listener listener = (org.eclipse.jst.j2ee.common.Listener) listenerIt
-                        .next();
-                if (listenerClass
-                        .equals(listener.getListenerClassName().trim()))
-                {
-                    return true;
-                }
-            }
-            return false;
-        }
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/facet/messages.properties b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/facet/messages.properties
deleted file mode 100644
index aa79cd5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/facet/messages.properties
+++ /dev/null
@@ -1,2 +0,0 @@
-FaceletInstallDelegate_FACET_INSTALLER_DELEGATE_DISPLAY_NAME=Facelet Install Delegate
-FaceletUninstallDelegate_FACET_INSTALLER_DELEGATE_DISPLAY_NAME=Facelet Uninstall Delegate
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/metadata/FaceletNamespaceMetaDataLocator.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/metadata/FaceletNamespaceMetaDataLocator.java
deleted file mode 100644
index 9ded96b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/metadata/FaceletNamespaceMetaDataLocator.java
+++ /dev/null
@@ -1,173 +0,0 @@
-package org.eclipse.jst.jsf.facelet.core.internal.metadata;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.ISafeRunnable;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.content.IContentType;
-import org.eclipse.jface.util.SafeRunnable;
-import org.eclipse.jst.jsf.common.metadata.internal.AbstractMetaDataLocator;
-import org.eclipse.jst.jsf.common.metadata.internal.IMetaDataChangeNotificationEvent;
-import org.eclipse.jst.jsf.common.metadata.internal.IMetaDataLocator;
-import org.eclipse.jst.jsf.common.metadata.internal.IMetaDataObserver;
-import org.eclipse.jst.jsf.common.metadata.internal.IMetaDataSourceModelProvider;
-import org.eclipse.jst.jsf.common.metadata.internal.IPathSensitiveMetaDataLocator;
-import org.eclipse.jst.jsf.common.metadata.internal.MetaDataChangeNotificationEvent;
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.Namespace;
-import org.eclipse.jst.jsf.core.IJSFCoreConstants;
-import org.eclipse.jst.jsf.core.JSFVersion;
-import org.eclipse.jst.jsf.core.internal.CompositeTagRegistryFactory;
-import org.eclipse.jst.jsf.core.internal.CompositeTagRegistryFactory.TagRegistryIdentifier;
-import org.eclipse.jst.jsf.core.jsfappconfig.JSFAppConfigUtils;
-import org.eclipse.jst.jsf.core.metadata.internal.INamespaceModelProvider;
-import org.eclipse.jst.jsf.designtime.internal.view.model.ITagRegistry;
-import org.eclipse.jst.jsf.designtime.internal.view.model.ITagRegistry.ITagRegistryListener;
-import org.eclipse.jst.jsf.designtime.internal.view.model.ITagRegistry.TagRegistryChangeEvent;
-import org.eclipse.jst.jsf.facelet.core.internal.FaceletCorePlugin;
-import org.eclipse.wst.common.project.facet.core.FacetedProjectFramework;
-import org.eclipse.wst.common.project.facet.core.events.IFacetedProjectEvent;
-import org.eclipse.wst.common.project.facet.core.events.IFacetedProjectEvent.Type;
-import org.eclipse.wst.common.project.facet.core.events.IFacetedProjectListener;
-import org.eclipse.wst.common.project.facet.core.events.IProjectFacetActionEvent;
-
-
-/**
- * Locates Facelet {@link Namespace} metadata
- */
-public class FaceletNamespaceMetaDataLocator 
-		extends AbstractMetaDataLocator
-		implements IPathSensitiveMetaDataLocator, ITagRegistryListener, IFacetedProjectListener {
-	
-	//in the future if there is an explicit xhtml content type id, we will need to use that here
-	private static final IContentType XHTML_CONTENTTYPE = 
-			Platform.getContentTypeManager().getContentType("org.eclipse.wst.html.core.htmlsource"); //$NON-NLS-1$
-	
-	private IProject _project;
-	private ITagRegistry _reg; 
-
-	public List<IMetaDataSourceModelProvider> locateMetaDataModelProviders(final String uri) {
-		final List<IMetaDataSourceModelProvider> providers = new ArrayList<IMetaDataSourceModelProvider>();
-		if (_reg != null) {
-			final Namespace ns = _reg.getTagLibrary(uri);
-		    
-			if (ns != null) {
-		    	providers.add(new NamespaceSourceModel(ns));
-		    }
-		}
-        return providers;
-	}
-
-	public void startLocating() {
-		if (_project != null && JSFAppConfigUtils.isValidJSFProject(_project) 
-			&& JSFVersion.valueOfProject(_project).compareTo(JSFVersion.V2_0) >=0 ) {
-				
-				final TagRegistryIdentifier tagRegId = new TagRegistryIdentifier(_project, XHTML_CONTENTTYPE);
-				_reg = CompositeTagRegistryFactory.getInstance().getRegistry(tagRegId);
-				if (_reg != null) {
-					_reg.addListener(this);
-				}
-		}
-		
-		//add faceted project listener that will check for JSF facet version
-		//being added and the facelet registry not being initialized
-		FacetedProjectFramework.addListener(this, Type.POST_INSTALL);
-	}
-
-	public void stopLocating() {
-		if (_reg != null) {
-			_reg.removeListener(this);
-			_reg = null;
-		}
-		FacetedProjectFramework.removeListener(this);
-	}
-
-	public void setProjectContext(final IProject project) {
-		_project = project;
-	}
-
-	public void registryChanged(final TagRegistryChangeEvent changeEvent) {
-		for (final Namespace ns : changeEvent.getAffectedObjects()) {
-			if (adaptTagRegistryEvent(changeEvent) != IMetaDataChangeNotificationEvent.ADDED) {
-				final IMetaDataChangeNotificationEvent mdEvent = new MetaDataChangeNotificationEvent(this, ns.getNSUri(), adaptTagRegistryEvent(changeEvent));
-				fireEvent(mdEvent);
-			}
-		}
-	}
-
-	private int adaptTagRegistryEvent(final TagRegistryChangeEvent event) {
-		switch (event.getType()) {
-		case ADDED_NAMESPACE:
-			return IMetaDataChangeNotificationEvent.ADDED;
-		case REMOVED_NAMESPACE:			
-		case REGISTRY_DISPOSED:
-			return IMetaDataChangeNotificationEvent.REMOVED;
-		default:
-			return IMetaDataChangeNotificationEvent.CHANGED;
-		}
-	}
-	
-	private void fireEvent(final IMetaDataChangeNotificationEvent event) {
-		SafeRunnable.run(new ISafeRunnable(){
-
-			public void handleException(Throwable exception) {
-				FaceletCorePlugin.log("Error while firing metadataChangeNotificationEvent" , exception)	; //$NON-NLS-1$
-			}
-	
-			public void run() throws Exception {				
-				for (final IMetaDataObserver observer : getObservers()){					
-					observer.notifyMetadataChanged(event);
-				}
-			}
-	
-		});
-	}
-	
-	public void handleEvent(final IFacetedProjectEvent event) {
-		if (event.getProject().getProject() == _project) {
-			final IProjectFacetActionEvent ev = (IProjectFacetActionEvent)event;
-			if (ev.getProjectFacet().getId()
-					.equals(IJSFCoreConstants.JSF_CORE_FACET_ID)) { 	
-				//if jsf facet has been added, it may be a 2.0 faceted project now
-				//call start locating again to add listener to facelet registry
-				//if not already doing so.
-				//only have to look at POST_INSTALL event since there is no version_changes option
-				//currently with the JSF Facet
-				if (ev.getType() == Type.POST_INSTALL && _reg == null) {
-					startLocating();
-				}
-			}
-		}
-	}
-	private class NamespaceSourceModel implements INamespaceModelProvider {
-
-		private Namespace ns;
-		private IMetaDataLocator locator;
-
-		NamespaceSourceModel(final Namespace ns){
-			this.ns = ns;
-		}
-		
-		public Object getSourceModel() {
-			return ns;
-		}
-
-		public IMetaDataLocator getLocator() {
-			return locator;
-		}
-
-		public void setLocator(IMetaDataLocator locator) {
-			this.locator = locator;			
-		}
-
-		public Object getAdapter(Class klass) {
-			return null;
-		}
-
-		public Namespace getNamespace() {
-			return ns;
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/metadata/FaceletNamespaceMetaDataTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/metadata/FaceletNamespaceMetaDataTranslator.java
deleted file mode 100644
index 4235213..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/metadata/FaceletNamespaceMetaDataTranslator.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package org.eclipse.jst.jsf.facelet.core.internal.metadata;
-
-import org.eclipse.jst.jsf.common.metadata.Entity;
-import org.eclipse.jst.jsf.common.metadata.Trait;
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.Namespace;
-import org.eclipse.jst.jsf.core.metadata.internal.NamespaceMetaDataTranslator;
-
-/**
- * Translates Facelet {@link Namespace} to standard {@link Entity} and {@link Trait} metadata
- *
- */
-public class FaceletNamespaceMetaDataTranslator extends NamespaceMetaDataTranslator {
-	private static final String COMPOSITE = "http://java.sun.com/jsf/composite"; //$NON-NLS-1$
-	
-	@Override
-	protected String getNamespaceDisplayLabel() {
-		if (getMergedModel().getId().indexOf(COMPOSITE) == 0 
-				&& getMergedModel().getId().length() > COMPOSITE.length())
-			return getMergedModel().getId().substring(COMPOSITE.length()+1);
-		return super.getNamespaceDisplayLabel();
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/ELProxyContributor.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/ELProxyContributor.java
deleted file mode 100644
index c000bbc..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/ELProxyContributor.java
+++ /dev/null
@@ -1,53 +0,0 @@
-package org.eclipse.jst.jsf.facelet.core.internal.registry;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jem.internal.proxy.core.ConfigurationContributorAdapter;
-import org.eclipse.jem.internal.proxy.core.IConfigurationContributionController;
-import org.eclipse.jst.jsf.facelet.core.internal.FaceletCorePlugin;
-import org.osgi.framework.Bundle;
-
-/**
- * Contributes additional, sometimes fake, jars to the JEM classpath to allow
- * for smooth instantiation of introspected objects.
- * 
- * @author cbateman
- *
- */
-public class ELProxyContributor extends ConfigurationContributorAdapter
-{
-    private final IProject _project;
-
-    /**
-     * @param project
-     */
-    public ELProxyContributor(final IProject project)
-    {
-        _project = project;
-    }
-
-    @Override
-    public void contributeClasspaths(
-            final IConfigurationContributionController controller)
-    throws CoreException
-    {
-        if (_project.isAccessible())
-        {
-            final IJavaProject javaProject = JavaCore.create(_project);
-            final IType type  = javaProject.findType("java.el.ELException"); //$NON-NLS-1$
-
-            // if we can't find ELException on the classpath,then inject
-            // our fake el jar to aid linkage while introspecting facelet libs
-            if (type == null)
-            {
-                final Bundle faceletBundle = FaceletCorePlugin.getDefault().getBundle();
-                controller.contributeClasspath(faceletBundle, "/jars/fake_el.jar", //$NON-NLS-1$
-                        IConfigurationContributionController.APPEND_USER_CLASSPATH,
-                        false);
-            }
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/FaceletMetaResolvingStrategy.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/FaceletMetaResolvingStrategy.java
deleted file mode 100644
index f202b1f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/FaceletMetaResolvingStrategy.java
+++ /dev/null
@@ -1,205 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facelet.core.internal.registry;
-
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.jsf.common.runtime.internal.model.component.ComponentTypeInfo;
-import org.eclipse.jst.jsf.common.runtime.internal.model.decorator.ConverterTypeInfo;
-import org.eclipse.jst.jsf.common.runtime.internal.model.decorator.ValidatorTypeInfo;
-import org.eclipse.jst.jsf.common.runtime.internal.model.types.TypeInfo;
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.IHandlerTagElement.TagHandlerType;
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.ITagElement;
-import org.eclipse.jst.jsf.core.internal.tld.TagIdentifierFactory;
-import org.eclipse.jst.jsf.designtime.internal.Messages;
-import org.eclipse.jst.jsf.designtime.internal.view.mapping.ViewMetadataLoader;
-import org.eclipse.jst.jsf.designtime.internal.view.mapping.ViewMetadataMapper;
-import org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.TagMapping;
-import org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.TagToViewObjectMapping;
-import org.eclipse.jst.jsf.designtime.internal.view.model.jsp.AbstractTagResolvingStrategy;
-import org.eclipse.jst.jsf.designtime.internal.view.model.jsp.DefaultTagTypeInfo;
-import org.eclipse.jst.jsf.facelet.core.internal.cm.FaceletDocumentFactory;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagAttribute;
-import org.eclipse.jst.jsf.facelet.core.internal.tagmodel.ComponentTag;
-import org.eclipse.jst.jsf.facelet.core.internal.tagmodel.ConverterTag;
-import org.eclipse.jst.jsf.facelet.core.internal.tagmodel.HandlerTag;
-import org.eclipse.jst.jsf.facelet.core.internal.tagmodel.NoArchetypeFaceletTag;
-import org.eclipse.jst.jsf.facelet.core.internal.tagmodel.ValidatorTag;
-import org.osgi.framework.Version;
-
-/**
- * Resolves facelet tags from JSF framework metadata.
- * 
- * @author cbateman
- *
- */
-public class FaceletMetaResolvingStrategy
-        extends
-        AbstractTagResolvingStrategy<IFaceletTagResolvingStrategy.TLDWrapper, String>
-        implements IFaceletTagResolvingStrategy
-{
-
-    /**
-     * strategy id
-     */
-    public final static String           ID           = "org.eclipse.jst.jsf.facelet.metadata.FaceletMetaResolvingStrategy"; //$NON-NLS-1$
-    /**
-     * displayable nameb
-     */
-    public final static String           DISPLAY_NAME = Messages.DefaultJSPTagResolver_DisplayName;
-
-    private final ViewMetadataLoader     _loader;
-    private final ViewMetadataMapper     _mapper;
-    private final FaceletDocumentFactory _factory;
-
-    /**
-     * @param project
-     * @param factory 
-     */
-    public FaceletMetaResolvingStrategy(final IProject project,
-            final FaceletDocumentFactory factory)
-    {
-        _factory = factory;
-        _loader = new ViewMetadataLoader(project);
-        _mapper = new ViewMetadataMapper();
-    }
-
-    @Override
-    public ITagElement resolve(
-            final IFaceletTagResolvingStrategy.TLDWrapper elementDecl)
-    {
-        final String uri = elementDecl.getUri();
-        final String tagName = elementDecl.getTagDefn().getTagName();
-        final TagIdentifier tagId = TagIdentifierFactory.createJSPTagWrapper(
-                uri, tagName);
-        final TagMapping mapping = _loader.getTagToViewMapping(tagId);
-
-        TypeInfo elementType = null;
-        if (mapping != null)
-        {
-            elementType = findTypeInfo(mapping, "1.1", null); //$NON-NLS-1$
-        }
-        final List<FaceletTaglibTagAttribute>  attributes = 
-            elementDecl.getTagDefn().getAttribute();
-        if (elementType instanceof ComponentTypeInfo)
-        {
-            return new ComponentTag(uri, tagName,
-                    (ComponentTypeInfo) elementType, null, _factory,
-                    new MetadataAttributeAdvisor(tagId, _loader, attributes));
-        }
-        else if (elementType instanceof ConverterTypeInfo)
-        {
-            return new ConverterTag(uri, tagName,
-                    (ConverterTypeInfo) elementType, null, _factory,
-                    new MetadataAttributeAdvisor(tagId, _loader, attributes));
-        }
-        else if (elementType instanceof ValidatorTypeInfo)
-        {
-            return new ValidatorTag(uri, tagName,
-                    (ValidatorTypeInfo) elementType, null, _factory,
-                    new MetadataAttributeAdvisor(tagId, _loader, attributes));
-        }
-        else if (elementType instanceof TagHandlerType)
-        {
-            return new HandlerTag(uri, tagName,
-                    (TagHandlerType) elementType, null, _factory,
-                    new MetadataAttributeAdvisor(
-                            tagId, _loader, attributes));
-        }
-        else if (DefaultTagTypeInfo.isDefaultLib(tagId.getUri()))
-        {
-            return new NoArchetypeFaceletTag(uri, tagName, _factory, new MetadataAttributeAdvisor(tagId, _loader, attributes));
-        }
-
-        // not found
-        return null;
-    }
-
-    private TypeInfo findTypeInfo(final TagMapping mapping,
-            final String jsfVersion, final String libVersion)
-    {
-        final EList list = mapping.getVersionedTagToViewMappings();
-
-        FIND_BY_VERSION: for (final Iterator<?> it = list.iterator(); it
-                .hasNext();)
-        {
-            Object obj = it.next();
-
-            if (obj instanceof TagToViewObjectMapping)
-            {
-                final TagToViewObjectMapping viewMapping = (TagToViewObjectMapping) obj;
-
-                final String minJsfVersionString = viewMapping
-                        .getMinJSFVersion();
-                if (minJsfVersionString != null)
-                {
-                    try
-                    {
-                        final Version version = new Version(jsfVersion);
-                        final Version minVersion = Version
-                                .parseVersion(minJsfVersionString);
-
-                        if (version.compareTo(minVersion) < 0)
-                        {
-                            // my version is less than the minimum specified
-                            // by this meta-data
-                            continue FIND_BY_VERSION;
-                        }
-                    }
-                    catch (final IllegalArgumentException iae)
-                    {
-                        continue FIND_BY_VERSION;
-                    }
-                }
-                final String minLibVersionString = viewMapping
-                        .getMinLibraryVersion();
-                if (libVersion != null && minLibVersionString != null)
-                {
-                    try
-                    {
-                        final Version version = new Version(libVersion);
-                        final Version minLibVersion = Version
-                                .parseVersion(minLibVersionString);
-
-                        if (version.compareTo(minLibVersion) < 0)
-                        {
-                            // my lib version is less than the minimum specified
-                            // by the meta-data
-                            continue FIND_BY_VERSION;
-                        }
-                    }
-                    catch (IllegalArgumentException iae)
-                    {
-                        continue FIND_BY_VERSION;
-                    }
-                }
-                return _mapper.mapToFrameworkData(viewMapping.getTypeInfo());
-            }
-        }
-        return null;
-    }
-
-    @Override
-    public String getId()
-    {
-        return ID;
-    }
-
-    public String getDisplayName()
-    {
-        return DISPLAY_NAME;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/FaceletRegistryManager.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/FaceletRegistryManager.java
deleted file mode 100644
index 357458b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/FaceletRegistryManager.java
+++ /dev/null
@@ -1,130 +0,0 @@
-package org.eclipse.jst.jsf.facelet.core.internal.registry;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.jst.jsf.common.internal.resource.ResourceSingletonObjectManager;
-import org.eclipse.jst.jsf.core.JSFVersion;
-import org.eclipse.jst.jsf.designtime.internal.view.model.ITagRegistry;
-import org.eclipse.jst.jsf.designtime.internal.view.model.TagRegistryFactory;
-import org.eclipse.jst.jsf.facelet.core.internal.FaceletCoreTraceOptions;
-
-/**
- * A per-resource singleton manager for TLDTagRegistry's.
- * 
- * @author cbateman
- * 
- */
-public final class FaceletRegistryManager extends
-                        ResourceSingletonObjectManager<FaceletTagRegistry, IProject>
-{
-    // STATIC
-    private static FaceletRegistryManager                  INSTANCE;
-
-    /**
-     * @return the singleton instance
-     */
-    private static FaceletRegistryManager getGlobalManager(final IWorkspace workspace)
-    {
-        if (FaceletCoreTraceOptions.TRACE_REGISTRYMANAGER)
-        {
-            FaceletCoreTraceOptions
-                    .log("FaceletRegistryManager: Initializing FaceletRegistryManager singleton"); //$NON-NLS-1$
-        }
-
-        synchronized(FaceletRegistryManager.class)
-        {
-            if (INSTANCE == null)
-            {
-                INSTANCE = new FaceletRegistryManager(workspace);
-            }
-            
-            return INSTANCE;
-        }
-    }
-
-    private FaceletRegistryManager(final IWorkspace workspace)
-    {
-        super(workspace);
-    }
-
-    @Override
-    protected FaceletTagRegistry createNewInstance(final IProject project)
-    {
-        if (FaceletCoreTraceOptions.TRACE_REGISTRYMANAGER)
-        {
-            FaceletCoreTraceOptions.log("FaceletRegistryManager: creating new instance for " //$NON-NLS-1$
-                    + project.toString());
-        }
-
-        return new FaceletTagRegistry(project);
-    }
-
-    @Override
-    protected void runAfterGetInstance(final IProject resource)
-    {
-        if (FaceletCoreTraceOptions.TRACE_REGISTRYMANAGER)
-        {
-            FaceletCoreTraceOptions.log("FaceletRegistryManager: Acquired instance for " //$NON-NLS-1$
-                    + resource.toString());
-        }
-    }
-
-    @Override
-    protected void runBeforeGetInstance(final IProject resource)
-    {
-        if (FaceletCoreTraceOptions.TRACE_REGISTRYMANAGER)
-        {
-            FaceletCoreTraceOptions.log("FaceletRegistryManager: Getting registry for " //$NON-NLS-1$
-                    + resource.toString());
-        }
-    }
-    
-    /**
-     * Adapter used to allow creation by extension point.
-     * 
-     * @author cbateman
-     *
-     */
-    public static class MyRegistryFactory extends TagRegistryFactory
-    {
-        @Override
-        public ITagRegistry createTagRegistry(IProject project) throws TagRegistryFactoryException
-        {
-            try
-            {
-                return getGlobalManager(project.getWorkspace()).getInstance(project);
-            }
-            catch (ManagedObjectException e)
-            {
-                throw new TagRegistryFactoryException(e);
-            }
-        }
-
-        @Override
-        public boolean isInstance(IProject project)
-        {
-            return getGlobalManager(project.getWorkspace()).isInstance(project);
-        }
-
-        public String getDisplayName()
-        {
-            return Messages.FaceletRegistryManager_REGISTRY_FACTORY_DISPLAYNAME;
-        }
-
-        @Override
-        public boolean projectIsValid(IProject project) {
-            if (project == null)
-            {
-                return false;
-            }
-
-            final JSFVersion jsfVersion = JSFVersion.valueOfProject(project);
-            if (jsfVersion != null && jsfVersion.compareTo(JSFVersion.V2_0) >= 0)
-            {
-                return true;
-            }
-
-            return false;
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/FaceletTagRegistry.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/FaceletTagRegistry.java
deleted file mode 100644
index 16f782b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/FaceletTagRegistry.java
+++ /dev/null
@@ -1,374 +0,0 @@
-package org.eclipse.jst.jsf.facelet.core.internal.registry;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.ConcurrentLinkedQueue;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.MultiStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jst.jsf.common.internal.managedobject.IManagedObject;
-import org.eclipse.jst.jsf.common.internal.managedobject.ObjectManager.ManagedObjectException;
-import org.eclipse.jst.jsf.common.internal.policy.IdentifierOrderedIteratorPolicy;
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.Namespace;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.core.internal.JSFCoreTraceOptions;
-import org.eclipse.jst.jsf.designtime.internal.view.model.AbstractTagRegistry;
-import org.eclipse.jst.jsf.designtime.internal.view.model.jsp.CompositeTagResolvingStrategy;
-import org.eclipse.jst.jsf.facelet.core.internal.FaceletCorePlugin;
-import org.eclipse.jst.jsf.facelet.core.internal.FaceletCoreTraceOptions;
-import org.eclipse.jst.jsf.facelet.core.internal.cm.FaceletDocumentFactory;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.IFaceletTagResolvingStrategy.TLDWrapper;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.FaceletTagIndex;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.IFaceletTagRecord;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.IProjectTaglibDescriptor;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.Listener;
-import org.eclipse.jst.jsf.facelet.core.internal.tagmodel.FaceletNamespace;
-
-/**
- * Registry of all facelet tag registries: at most one per project.
- * 
- */
-public final class FaceletTagRegistry extends AbstractTagRegistry implements
-        IManagedObject
-{
-    // INSTANCE
-    private final ConcurrentLinkedQueue<LibraryOperation>   _changeOperations = new ConcurrentLinkedQueue<LibraryOperation>();
-
-    private final IProject                                  _project;
-    private final Map<String, FaceletNamespace>             _nsResolved;
-    private final Set<FaceletNamespace>                     _unResolved;
-    private final CompositeTagResolvingStrategy<TLDWrapper> _resolver;
-    private final FaceletDocumentFactory                    _factory;
-    private final LibraryOperationFactory                   _operationFactory = new LibraryOperationFactory(
-                                                                                      this);
-    private boolean                                         _isInitialized;
-
-    private ChangeJob                                       _changeJob;
-    private MyTaglibListener                                _listener;
-
-    FaceletTagRegistry(final IProject project)
-    {
-        _project = project;
-        _nsResolved = new HashMap<String, FaceletNamespace>();
-        _unResolved = new HashSet<FaceletNamespace>();
-
-        final List<String> ids = new ArrayList<String>();
-        
-//Commenting out this strategy because of current circular dependency with facelet md locating.  See FaceletNamespaceMetaDataLocator.
-//        ids.add(FaceletMetaResolvingStrategy.ID);
-        ids.add(FaceletTagResolvingStrategy.ID);
-        final IdentifierOrderedIteratorPolicy<String> policy = new IdentifierOrderedIteratorPolicy<String>(
-                ids);
-
-        // exclude things that are not explicitly listed in the policy. That
-        // way preference-based disablement will cause those strategies to
-        // be excluded.
-        policy.setExcludeNonExplicitValues(true);
-        _resolver = new CompositeTagResolvingStrategy<TLDWrapper>(policy);
-
-        _factory = new FaceletDocumentFactory(project);
-        // add the strategies
-        _resolver.addStrategy(new FaceletTagResolvingStrategy(_project,
-                _factory));
-        
-//Commenting out this strategy because of current circular dependency with facelet md locating.  See FaceletNamespaceMetaDataLocator.
-//        _resolver.addStrategy(new FaceletMetaResolvingStrategy(_project, _factory));
-
-        // _resolver.addStrategy(new DefaultJSPTagResolver(_project));
-        // makes sure that a tag element will always be created for any
-        // given tag definition even if other methods fail
-        // _resolver.addStrategy(new UnresolvedJSPTagResolvingStrategy());
-        _changeJob = new ChangeJob(project.getName());
-    }
-
-    /**
-     * @return a copy of all tag libs, both with namespaces resolved and without
-     *         Changing the returned may has no effect on the registry, however
-     *         the containned objects are not copies.
-     */
-    @Override
-    public synchronized Collection<FaceletNamespace> getAllTagLibraries()
-    {
-        final Set<FaceletNamespace> allTagLibraries = new HashSet<FaceletNamespace>();
-        if (!_isInitialized)
-        {
-            try
-            {
-                initialize(false);
-                _isInitialized = true;
-            }
-            catch (final JavaModelException e)
-            {
-                FaceletCorePlugin.log("Problem during initialization", e); //$NON-NLS-1$
-            }
-            catch (final CoreException e)
-            {
-                FaceletCorePlugin.log("Problem during initialization", e); //$NON-NLS-1$
-            }
-        }
-        allTagLibraries.addAll(_nsResolved.values());
-        allTagLibraries.addAll(_unResolved);
-        return allTagLibraries;
-    }
-
-    private void initialize(boolean fireEvent) throws JavaModelException, CoreException
-    {
-        if (!_project.exists() || !_project.hasNature(JavaCore.NATURE_ID))
-        {
-            throw new CoreException(new Status(IStatus.ERROR,
-                    FaceletCorePlugin.PLUGIN_ID,
-                    "Project either does not exists or is not a java project: " //$NON-NLS-1$
-                            + _project));
-        }
-
-        final FaceletTagIndex index = FaceletTagIndex.getInstance(_project.getWorkspace());
-
-        IProjectTaglibDescriptor tagDesc;
-        try
-        {
-            tagDesc = index.getInstance(_project);
-        }
-        catch (ManagedObjectException e)
-        {
-            throw new CoreException(
-                    new Status(
-                            IStatus.ERROR,
-                            FaceletCorePlugin.PLUGIN_ID,
-                            "Error instantiating facelet tag index for project: " + _project.getName(), e)); //$NON-NLS-1$
-        }
-
-        if (tagDesc != null)
-        {
-            for (final IFaceletTagRecord taglib : tagDesc.getTagLibraries())
-            {
-                initialize(taglib, fireEvent);
-            }
-
-            _listener = new MyTaglibListener();
-            tagDesc.addListener(_listener);
-        }
-    }
-
-    FaceletNamespace initialize(final IFaceletTagRecord tagRecord,
-            final boolean fireEvent)
-    {
-        if (JSFCoreTraceOptions.TRACE_JSPTAGREGISTRY_CHANGES)
-        {
-            FaceletCoreTraceOptions
-                    .log("TLDTagRegistry.initialize_TagRecord: Initializing new tld record: " + tagRecord.toString()); //$NON-NLS-1$
-        }
-        final FaceletNamespace ns = new FaceletNamespace(tagRecord, _resolver);
-        _nsResolved.put(tagRecord.getURI(), ns);
-
-        if (fireEvent)
-        {
-            fireEvent(new TagRegistryChangeEvent(this,
-                    TagRegistryChangeEvent.EventType.ADDED_NAMESPACE,
-                    Collections.singletonList(ns)));
-        }
-        return ns;
-    }
-
-    void remove(final IFaceletTagRecord tagRecord)
-    {
-        final FaceletNamespace ns = _nsResolved.remove(tagRecord.getURI());
-
-        if (ns != null)
-        {
-            fireEvent(new TagRegistryChangeEvent(this,
-                    TagRegistryChangeEvent.EventType.REMOVED_NAMESPACE,
-                    Collections.singletonList(ns)));
-        }
-    }
-
-    @Override
-    public synchronized Namespace getTagLibrary(final String uri)
-    {
-        // TODO:
-        getAllTagLibraries();
-        return _nsResolved.get(uri);
-    }
-
-    @Override
-    protected Job getRefreshJob(final boolean flushCaches)
-    {
-        return new Job("Refreshing Facelet tag registry for " + _project.getName()) //$NON-NLS-1$
-        {
-            @Override
-            protected IStatus run(final IProgressMonitor monitor)
-            {
-//                if (FaceletCoreTraceOptions.TRACE_JSPTAGREGISTRY)
-//                {
-//                    JSFCoreTraceOptions.log("FaceletTagRegistry.refresh: start"); //$NON-NLS-1$
-//                }
-
-                synchronized (FaceletTagRegistry.this)
-                {
-                    if (JSFCoreTraceOptions.TRACE_JSPTAGREGISTRY)
-                    {
-                        JSFCoreTraceOptions
-                                .log("FaceletTagRegistry.refresh: start"); //$NON-NLS-1$
-                    }
-
-                    final List<Namespace> namespaces = new ArrayList(
-                            _nsResolved.values());
-
-                    if (flushCaches)
-                    {
-                        FaceletTagIndex.getInstance(_project.getWorkspace()).flush(_project);
-                    }
-                    // if we aren't flushing caches, then check point the
-                    // current namespace data, so it isn't lost when we clear
-                    // THE NAMESPACES
-                    else
-                    {
-                        checkpoint();
-                    }
-
-                    _nsResolved.clear();
-
-                    fireEvent(new TagRegistryChangeEvent(FaceletTagRegistry.this,
-                            TagRegistryChangeEvent.EventType.REMOVED_NAMESPACE,
-                            namespaces));
-                    try
-                    {
-                        initialize(true);
-                    }
-                    catch (JavaModelException e)
-                    {
-                        return new Status(IStatus.ERROR, FaceletCorePlugin.PLUGIN_ID, "Problem refreshing registry", e); //$NON-NLS-1$
-                    }
-                    catch (CoreException e)
-                    {
-                        return new Status(IStatus.ERROR, FaceletCorePlugin.PLUGIN_ID, "Problem refreshing registry", e); //$NON-NLS-1$
-                    }
-
-//                    if (JSFCoreTraceOptions.TRACE_JSPTAGREGISTRY)
-//                    {
-//                        JSFCoreTraceOptions
-//                                .log("TLDTagRegistry.refresh: finished");
-//                    }
-                    return Status.OK_STATUS;
-                }
-            }
-        };
-    }
-
-    private class MyTaglibListener extends Listener
-    {
-        @Override
-        public void changed(TaglibChangedEvent event)
-        {
-            switch (event.getChangeType())
-            {
-                case ADDED:
-                    addLibraryOperation(_operationFactory
-                            .createAddOperation(event.getNewValue()));
-                break;
-                case CHANGED:
-                    addLibraryOperation(_operationFactory
-                            .createChangeOperation(event.getNewValue()));
-                break;
-                case REMOVED:
-                    addLibraryOperation(_operationFactory
-                            .createRemoveOperation(event.getOldValue()));
-                break;
-            }
-        }
-    }
-
-    private void addLibraryOperation(final LibraryOperation operation)
-    {
-        _changeOperations.add(operation);
-        _changeJob.schedule();
-    }
-
-    private class ChangeJob extends Job
-    {
-        private int _rescheduleTime = -1;
-
-        public ChangeJob(final String projectName)
-        {
-            super("Update job for project " + projectName); //$NON-NLS-1$
-        }
-
-        @Override
-        protected IStatus run(final IProgressMonitor monitor)
-        {
-            synchronized (FaceletTagRegistry.this)
-            {
-                _rescheduleTime = -1;
-
-                LibraryOperation operation = null;
-                final MultiStatus multiStatus = new MultiStatus(
-                        JSFCorePlugin.PLUGIN_ID, 0, "Result of change job", //$NON-NLS-1$
-                        new Throwable());
-                while ((operation = _changeOperations.poll()) != null)
-                {
-                    _rescheduleTime = 10000; // ms
-
-                    operation.run();
-                    multiStatus.add(operation.getResult());
-                }
-
-                if (_rescheduleTime >= 0 && !monitor.isCanceled())
-                {
-                    // if any operations were found on this run, reschedule
-                    // to run again in 10seconds based on the assumption that
-                    // events may be coming in bursts
-                    schedule(_rescheduleTime);
-                }
-
-                return multiStatus;
-            }
-        }
-    }
-
-    @Override
-    protected void doDispose()
-    {
-        if (_listener != null)
-        {
-            FaceletTagIndex index = FaceletTagIndex.getInstance(_project.getWorkspace());
-            try
-            {
-                IProjectTaglibDescriptor instance = index.getInstance(_project);
-                instance.removeListener(_listener);
-            }
-            catch (ManagedObjectException e)
-            {
-                FaceletCorePlugin
-                        .log(
-                                "Disposing facelet tag registry for project: " + _project.getName(), e); //$NON-NLS-1$
-            }
-
-            _nsResolved.clear();
-        }
-    }
-
-    @Override
-    protected void cleanupPersistentState()
-    {
-        // TODO ??
-
-    }
-
-    public void checkpoint()
-    {
-        // TODO ??
-
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/FaceletTagResolvingStrategy.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/FaceletTagResolvingStrategy.java
deleted file mode 100644
index 7ba6238..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/FaceletTagResolvingStrategy.java
+++ /dev/null
@@ -1,167 +0,0 @@
-package org.eclipse.jst.jsf.facelet.core.internal.registry;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jem.internal.proxy.core.IConfigurationContributor;
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.jsf.common.runtime.internal.model.component.ComponentTypeInfo;
-import org.eclipse.jst.jsf.common.runtime.internal.model.decorator.ConverterTypeInfo;
-import org.eclipse.jst.jsf.common.runtime.internal.model.decorator.ValidatorTypeInfo;
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.ITagElement;
-import org.eclipse.jst.jsf.core.internal.tld.TagIdentifierFactory;
-import org.eclipse.jst.jsf.designtime.internal.view.DTComponentIntrospector;
-import org.eclipse.jst.jsf.designtime.internal.view.mapping.ViewMetadataLoader;
-import org.eclipse.jst.jsf.designtime.internal.view.model.jsp.AbstractTagResolvingStrategy;
-import org.eclipse.jst.jsf.designtime.internal.view.model.jsp.IAttributeAdvisor;
-import org.eclipse.jst.jsf.facelet.core.internal.cm.FaceletDocumentFactory;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTag;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.ComponentTagDefn;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.ConverterTagDefn;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.HandlerTagDefn;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.SourceTagDefn;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.ValidatorTagDefn;
-import org.eclipse.jst.jsf.facelet.core.internal.tagmodel.ComponentTag;
-import org.eclipse.jst.jsf.facelet.core.internal.tagmodel.ConverterTag;
-import org.eclipse.jst.jsf.facelet.core.internal.tagmodel.FaceletTag;
-import org.eclipse.jst.jsf.facelet.core.internal.tagmodel.HandlerTag;
-import org.eclipse.jst.jsf.facelet.core.internal.tagmodel.NoArchetypeFaceletTag;
-import org.eclipse.jst.jsf.facelet.core.internal.tagmodel.SourceTag;
-import org.eclipse.jst.jsf.facelet.core.internal.tagmodel.ValidatorTag;
-
-/*package*/class FaceletTagResolvingStrategy
-        extends
-        AbstractTagResolvingStrategy<IFaceletTagResolvingStrategy.TLDWrapper, String>
-        implements IFaceletTagResolvingStrategy
-{
-    public final static String           ID = "org.eclipse.jst.jsf.facelet.core.FaceletTagResolvingStrategy"; //$NON-NLS-1$
-    private final IProject               _project;
-    private final FaceletDocumentFactory _factory;
-    private final ViewMetadataLoader     _viewLoader;
-
-    public FaceletTagResolvingStrategy(final IProject project,
-            final FaceletDocumentFactory factory)
-    {
-        _project = project;
-        _factory = factory;
-        _viewLoader = new ViewMetadataLoader(project);
-    }
-
-    @Override
-    public final String getId()
-    {
-        return ID;
-    }
-
-    @Override
-    public final ITagElement resolve(final TLDWrapper tldWrapper)
-    {
-        return createFaceletTag(tldWrapper.getUri(), tldWrapper.getTagDefn());
-    }
-
-    public final String getDisplayName()
-    {
-        return Messages.FaceletTagResolvingStrategy_FACELET_TAG_RESOLVER_DISPLAY_NAME;
-    }
-
-    private FaceletTag createFaceletTag(final String uri, final FaceletTaglibTag tagDefn)
-    {
-        final String tagName = tagDefn.getTagName();
-        final TagIdentifier tagId = TagIdentifierFactory.createJSPTagWrapper(
-                uri, tagName);
-
-        final IAttributeAdvisor advisor = new MetadataAttributeAdvisor(tagId,
-                _viewLoader, tagDefn.getAttribute());
-
-        if (tagDefn instanceof ComponentTagDefn)
-        {
-            final ComponentTagDefn componentTagDefn = (ComponentTagDefn) tagDefn;
-            final String componentType = componentTagDefn.getComponentType();
-            final String componentClass = DTComponentIntrospector
-                    .findComponentClass(componentType, _project);
-
-            ComponentTypeInfo typeInfo = null;
-
-            if (componentClass != null)
-            {
-                typeInfo = DTComponentIntrospector.getComponent(componentType,
-                        componentClass, _project,
-                        new IConfigurationContributor[]
-                        { new ELProxyContributor(_project) });
-            }
-            return new ComponentTag(uri, tagName, typeInfo, safeGetString(componentTagDefn.getHandlerClass()), _factory, advisor);
-        }
-        // render type is optional, but must have component type
-        else if (tagDefn instanceof ValidatorTagDefn)
-        {
-            final ValidatorTagDefn validatorTagDefn = (ValidatorTagDefn) tagDefn;
-            final String validatorId = validatorTagDefn.getValidatorId();
-
-            ValidatorTypeInfo typeInfo;
-
-            if (validatorId != null)
-            {
-                final String validatorClass = DTComponentIntrospector
-                        .findValidatorClass(validatorId, _project);
-                typeInfo = new ValidatorTypeInfo(validatorClass, validatorId);
-            }
-            else
-            {
-                typeInfo = ValidatorTypeInfo.UNKNOWN;
-            }
-
-            return new ValidatorTag(uri, tagName, typeInfo, safeGetString(validatorTagDefn.getHandlerClass()), _factory,
-                    advisor);
-        }
-        // render type is optional, but must have converter id
-        else if (tagDefn instanceof ConverterTagDefn)
-        {
-            final ConverterTagDefn converterTagDefn = (ConverterTagDefn) tagDefn;
-            final String converterId = converterTagDefn.getConverterId();
-
-            ConverterTypeInfo typeInfo;
-
-            if (converterId != null)
-            {
-                final String converterClass = DTComponentIntrospector
-                        .findConverterClass(converterId, _project);
-                typeInfo = new ConverterTypeInfo(converterClass, converterId);
-            }
-            else
-            {
-                typeInfo = ConverterTypeInfo.UNKNOWN;
-            }
-
-            // for now, all converters are unknown
-            return new ConverterTag(uri, tagName, typeInfo, 
-                    safeGetString(converterTagDefn.getHandlerClass()), _factory, advisor);
-        }
-        else if (tagDefn instanceof HandlerTagDefn)
-        {
-            final String handlerClass = safeGetString(((HandlerTagDefn)tagDefn).getHandlerClass());
-            return new HandlerTag(uri, tagName, null, handlerClass, _factory, advisor);
-        }
-        else if (tagDefn instanceof SourceTagDefn)
-        {
-            final String source = ((SourceTagDefn)tagDefn).getSource();
-            return new SourceTag(uri, tagName, source, _factory, advisor);
-        }
-
-        return new NoArchetypeFaceletTag(uri, tagName, _factory, advisor);
-    }
-    
-    private static String safeGetString(final String value)
-    {
-        if (value == null)
-        {
-            return null;
-        }
-        
-        final String trimmed = value.trim();
-        
-        if ("".equals(trimmed)) //$NON-NLS-1$
-        {
-            return null;
-        }
-        
-        return trimmed;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/IFaceletTagResolvingStrategy.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/IFaceletTagResolvingStrategy.java
deleted file mode 100644
index 2be5978..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/IFaceletTagResolvingStrategy.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facelet.core.internal.registry;
-
-import org.eclipse.jst.jsf.designtime.internal.view.model.jsp.ITagResolvingStrategy;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTag;
-
-/**
- * @author cbateman
- *
- */
-public interface IFaceletTagResolvingStrategy extends
-        ITagResolvingStrategy<IFaceletTagResolvingStrategy.TLDWrapper, String>
-{
-
-    /**
-     * Wraps data for Facelet tag information to used by the resolving strategy
-     * 
-     * @author cbateman
-     *
-     */
-    public static class TLDWrapper
-    {
-        private final String  _uri;
-        private final FaceletTaglibTag _tagDefn;
-
-        /**
-         * @param tagDefn
-         * @param uri
-         */
-        public TLDWrapper(FaceletTaglibTag tagDefn, String uri)
-        {
-            super();
-            _tagDefn = tagDefn;
-            _uri = uri;
-        }
-
-        /**
-         * @return the uri for the tld namespace
-         */
-        public final String getUri()
-        {
-            return _uri;
-        }
-
-        /**
-         * @return the tag definition information
-         */
-        public final FaceletTaglibTag getTagDefn()
-        {
-            return _tagDefn;
-        }
-
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/LibraryOperation.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/LibraryOperation.java
deleted file mode 100644
index 249dfaf..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/LibraryOperation.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facelet.core.internal.registry;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jst.jsf.facelet.core.internal.FaceletCorePlugin;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.IFaceletTagRecord;
-
-abstract class LibraryOperation
-{
-    protected final IFaceletTagRecord _changeRecord;
-    private IStatus               _result;
-
-    protected LibraryOperation(final IFaceletTagRecord changeRecord)
-    {
-        if (changeRecord == null)
-        {
-            throw new NullPointerException();
-        }
-        _changeRecord = changeRecord;
-    }
-
-    public final void run()
-    {
-        try
-        {
-            _result = doRun();
-        }
-        catch (final Exception e)
-        {
-            _result = new Status(IStatus.ERROR, FaceletCorePlugin.PLUGIN_ID,
-                    "Problem during run", e); //$NON-NLS-1$
-        }
-    }
-
-    public IStatus getResult()
-    {
-        return _result;
-    }
-
-    protected abstract IStatus doRun();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/LibraryOperationFactory.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/LibraryOperationFactory.java
deleted file mode 100644
index c69cbfe..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/LibraryOperationFactory.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.facelet.core.internal.registry;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.IFaceletTagRecord;
-
-class LibraryOperationFactory
-{
-    private final FaceletTagRegistry _tagRegistry;
-
-    public LibraryOperationFactory(final FaceletTagRegistry tagRegistry)
-    {
-        _tagRegistry = tagRegistry;
-    }
-
-    LibraryOperation createAddOperation(final IFaceletTagRecord changeRecord)
-    {
-        return new AddTagLibrary(_tagRegistry, changeRecord);
-    }
-
-    LibraryOperation createRemoveOperation(final IFaceletTagRecord changeRecord)
-    {
-        return new RemoveTagLibrary(_tagRegistry, changeRecord);
-    }
-
-    LibraryOperation createChangeOperation(final IFaceletTagRecord changeRecord)
-    {
-        if (changeRecord == null)
-        {
-            throw new IllegalArgumentException();
-        }
-        return new ChangeTagLibrary(_tagRegistry, changeRecord);
-    }
-
-    private static class AddTagLibrary extends LibraryOperation
-    {
-        private final FaceletTagRegistry _tagRegistry;
-
-        public AddTagLibrary(final FaceletTagRegistry tagRegistry,
-                final IFaceletTagRecord newRecord)
-        {
-            super(newRecord);
-            _tagRegistry = tagRegistry;
-        }
-
-        @Override
-        protected IStatus doRun()
-        {
-            synchronized (_tagRegistry)
-            {
-                // fire change event if applicable
-                _tagRegistry.initialize(_changeRecord, true);
-                return Status.OK_STATUS;
-            }
-        }
-    }
-
-    private static class RemoveTagLibrary extends LibraryOperation
-    {
-        private final FaceletTagRegistry _tagRegistry;
-
-        protected RemoveTagLibrary(final FaceletTagRegistry tagRegistry,
-                final IFaceletTagRecord changeRecord)
-        {
-            super(changeRecord);
-            _tagRegistry = tagRegistry;
-        }
-
-        @Override
-        protected IStatus doRun()
-        {
-            _tagRegistry.remove(_changeRecord);
-            return Status.OK_STATUS;
-
-        }
-
-    }
-
-    private static class ChangeTagLibrary extends LibraryOperation
-    {
-        private final FaceletTagRegistry _tagRegistry;
-
-        protected ChangeTagLibrary(final FaceletTagRegistry tagRegistry,
-                final IFaceletTagRecord changeRecord)
-        {
-            super(changeRecord);
-            _tagRegistry = tagRegistry;
-        }
-
-        @Override
-        protected IStatus doRun()
-        {
-            IStatus result = null;
-
-            synchronized (_tagRegistry)
-            {
-                result = new RemoveTagLibrary(_tagRegistry, _changeRecord).doRun();
-
-                if (result.getSeverity() != IStatus.ERROR
-                        && result.getSeverity() != IStatus.CANCEL)
-                {
-                    result = new AddTagLibrary(_tagRegistry, _changeRecord)
-                            .doRun();
-                }
-            }
-
-            return result;
-        }
-
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/Messages.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/Messages.java
deleted file mode 100644
index 1a4f0d6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/Messages.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facelet.core.internal.registry;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * Externalized string manager.
- * 
- * @author cbateman
- *
- */
-public final class Messages extends NLS
-{
-    private static final String BUNDLE_NAME = "org.eclipse.jst.jsf.facelet.core.internal.registry.messages"; //$NON-NLS-1$
-    /**
-     * see messages.properties
-     */
-    public static String        FaceletRegistryManager_REGISTRY_FACTORY_DISPLAYNAME;
-    /**
-     * see messages.properties
-     */
-    public static String FaceletTagRegistry_TAG_REGISTRY_REFRESH_JOB_DESCRIPTION;
-    /**
-     * see messages.properties
-     */
-    public static String FaceletTagResolvingStrategy_FACELET_TAG_RESOLVER_DISPLAY_NAME;
-    static
-    {
-        // initialize resource bundle
-        NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-    }
-
-    private Messages()
-    {
-        // no instantiation
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/MetadataAttributeAdvisor.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/MetadataAttributeAdvisor.java
deleted file mode 100644
index d0ba0bf..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/MetadataAttributeAdvisor.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facelet.core.internal.registry;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.ComponentPropertyHandler;
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.ITagAttribute;
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.ITagAttributeHandler;
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.TagAttributeHandler;
-import org.eclipse.jst.jsf.designtime.internal.view.mapping.ViewMetadataLoader;
-import org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.AttributeToPropertyMapping;
-import org.eclipse.jst.jsf.designtime.internal.view.model.jsp.IAttributeAdvisor;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagAttribute;
-import org.eclipse.jst.jsf.facelet.core.internal.tagmodel.FaceletAttribute;
-
-/**
- * An attribute advisor that composes multiple strategies for deriving information
- * about Facelet tags.
- * 
- * @author cbateman
- *
- */
-/*package*/ class MetadataAttributeAdvisor implements IAttributeAdvisor
-{
-    private final TagIdentifier      _tagId;
-    private final ViewMetadataLoader _loader;
-    private List<FaceletTaglibTagAttribute> _attributes;
-
-    /**
-     * @param tagId
-     * @param loader
-     * @param attributes 
-     */
-    public MetadataAttributeAdvisor(final TagIdentifier tagId,
-            final ViewMetadataLoader loader, final List<FaceletTaglibTagAttribute> attributes)
-    {
-        _tagId = tagId;
-        _loader = loader;
-        _attributes = attributes;
-    }
-
-    public ITagAttributeHandler createAttributeHandler(final String name)
-            throws UnknownAttributeException
-    {
-        final AttributeToPropertyMapping mapping = _loader.getAttributeMapping(
-                _tagId, name);
-        if (mapping != null)
-        {
-            final String customHandler = mapping.getCustomConversionFactoryId();
-            final boolean isELAllowed = mapping.isElAllowed();
-            final String propertyName = mapping.getPropertyName();
-            if (propertyName != null)
-            {
-                return new ComponentPropertyHandler(customHandler, name,
-                        isELAllowed, propertyName);
-            }
-            return new TagAttributeHandler(customHandler, name, isELAllowed);
-        }
-        return new TagAttributeHandler(null, name, false);
-    }
-
-    public Map<String, ? extends ITagAttribute> getAttributes()
-    {
-        final Map<String, ITagAttribute>  attributes = new HashMap<String, ITagAttribute>();
-        
-        for (final FaceletTaglibTagAttribute attribute : _attributes)
-        {
-            attributes.put(attribute.getName(), new FaceletAttribute(attribute));
-        }
-        return Collections.unmodifiableMap(attributes);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/ServletBeanProxyContributor.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/ServletBeanProxyContributor.java
deleted file mode 100644
index 2394738..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/ServletBeanProxyContributor.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/**
- * 
- */
-package org.eclipse.jst.jsf.facelet.core.internal.registry;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jem.internal.proxy.core.ConfigurationContributorAdapter;
-import org.eclipse.jem.internal.proxy.core.IConfigurationContributionController;
-import org.eclipse.jst.jsf.core.JSFVersion;
-import org.osgi.framework.Bundle;
-
-/**
- * Contributes dummy jsp servlet api to smooth the JEM instantiation for introspection.
- * 
- * @author cbateman
- *
- */
-public class ServletBeanProxyContributor extends ConfigurationContributorAdapter
-{
-    private static final String JAVAX_SERVLET_JSP = "javax.servlet.jsp"; //$NON-NLS-1$
-    private static final String JAVAX_SERVLET = "javax.servlet"; //$NON-NLS-1$
-    private final JSFVersion _jsfVersion;
-
-    /**
-     * @param jsfVersion
-     */
-    public ServletBeanProxyContributor(final JSFVersion jsfVersion)
-    {
-        if (jsfVersion == null)
-        {
-            throw new IllegalArgumentException("jsfVersion must not be null"); //$NON-NLS-1$
-        }
-        
-        _jsfVersion = jsfVersion;
-    }
-
-    @Override
-    public void contributeClasspaths(
-            final IConfigurationContributionController controller)
-            throws CoreException
-    {
-        if (_jsfVersion != JSFVersion.V1_2)
-        {
-            final Bundle servletBundle = Platform.getBundle(JAVAX_SERVLET);
-            controller.contributeClasspath(servletBundle, (IPath) null,
-                    IConfigurationContributionController.APPEND_USER_CLASSPATH,
-                    true);
-
-            final Bundle jspBundle = Platform.getBundle(JAVAX_SERVLET_JSP);
-            controller.contributeClasspath(jspBundle, (IPath) null,
-                    IConfigurationContributionController.APPEND_USER_CLASSPATH,
-                    true);
-        }
-        
-    }
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/messages.properties b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/messages.properties
deleted file mode 100644
index dd82d81..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/messages.properties
+++ /dev/null
@@ -1,3 +0,0 @@
-FaceletRegistryManager_REGISTRY_FACTORY_DISPLAYNAME=Facelet Registry Factory
-FaceletTagRegistry_TAG_REGISTRY_REFRESH_JOB_DESCRIPTION=Refreshing Facelet tag registry for 
-FaceletTagResolvingStrategy_FACELET_TAG_RESOLVER_DISPLAY_NAME=Facelet Introspecting Tag Resolver
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/AbstractFaceletTaglibLocator.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/AbstractFaceletTaglibLocator.java
deleted file mode 100644
index 3b63d2e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/AbstractFaceletTaglibLocator.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib;
-
-import java.util.Map;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jst.jsf.common.internal.locator.AbstractLocator;
-import org.eclipse.jst.jsf.common.internal.locator.ILocatorChangeListener;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.Listener.TaglibChangedEvent;
-
-/**
- * Parent of all locators of facelet taglibs.
- * 
- * @author cbateman
- * 
- */
-public abstract class AbstractFaceletTaglibLocator
-        extends
-        AbstractLocator<Map<String, ? extends IFaceletTagRecord>, IProject, String>
-        implements IFaceletTaglibLocator
-{
-    /**
-     * @param id
-     * @param displayName
-     */
-    public AbstractFaceletTaglibLocator(final String id,
-            final String displayName)
-    {
-        super(id, displayName);
-        // new MapMergingCompositionStrategy
-        // <IProject, Map<String, IFaceletTagRecord>, Map<String,
-        // IFaceletTagRecord>,
-        // ILocator<Map<String, IFaceletTagRecord>, IProject, String>>
-        // (new HashMap<String, IFaceletTagRecord>(), Collections.EMPTY_MAP)
-    }
-
-    /**
-     * @return a list of all tag libraries known to this locator
-     */
-    @Override
-    protected abstract Map<String, ? extends IFaceletTagRecord> doLocate(
-            IProject context);
-
-    /**
-     * Listener argument must be of type Listener.
-     * 
-     * @see org.eclipse.jst.jsf.common.internal.locator.AbstractLocator#addListener(org.eclipse.jst.jsf.common.internal.locator.ILocatorChangeListener)
-     */
-    @Override
-    public void addListener(final ILocatorChangeListener listener)
-    {
-        if (!(listener instanceof Listener))
-        {
-            throw new IllegalArgumentException();
-        }
-        super.addListener(listener);
-    }
-
-    /**
-     * @param listener
-     */
-    public void addListener(final Listener listener)
-    {
-        super.addListener(listener);
-    }
-
-    /**
-     * @param taglibChangedEvent
-     */
-    protected void fireChangeEvent(final TaglibChangedEvent taglibChangedEvent)
-    {
-        super.fireChangeEvent(taglibChangedEvent);
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/AbstractProjectTaglibDescriptorFactory.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/AbstractProjectTaglibDescriptorFactory.java
deleted file mode 100644
index 47866c0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/AbstractProjectTaglibDescriptorFactory.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib;
-
-import org.eclipse.core.resources.IProject;
-
-/**
- * The base class for all impls of IProjectTaglibDescriptorFactory.
- * 
- * @author cbateman
- *
- */
-public abstract class AbstractProjectTaglibDescriptorFactory implements IProjectTaglibDescriptorFactory 
-{
-
-    public abstract IProjectTaglibDescriptor create(IProject project,
-            TagRecordFactory factory);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/CompositeComponentTaglibLocator.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/CompositeComponentTaglibLocator.java
deleted file mode 100644
index 8cf8ced..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/CompositeComponentTaglibLocator.java
+++ /dev/null
@@ -1,207 +0,0 @@
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib;
-
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jst.jsf.common.internal.locator.ILocatorProvider;
-import org.eclipse.jst.jsf.designtime.internal.resources.IJSFResource;
-import org.eclipse.jst.jsf.designtime.internal.resources.IJSFResourceContainer;
-import org.eclipse.jst.jsf.designtime.internal.resources.IJSFResourceFragment;
-import org.eclipse.jst.jsf.designtime.internal.resources.IJSFResourceFragment.Type;
-import org.eclipse.jst.jsf.designtime.internal.resources.IJSFResourceLocator;
-import org.eclipse.jst.jsf.designtime.internal.resources.JSFResourceChangeListener;
-import org.eclipse.jst.jsf.designtime.internal.resources.JSFResourceContainer;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.JSFResourceBasedTagRecord.Builder;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.Listener.TaglibChangedEvent;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.Listener.TaglibChangedEvent.CHANGE_TYPE;
-
-/**
- * A taglib locator that locates composite components, which a located as a type
- * of JSF locatable resource.
- * 
- * @author cbateman
- * 
- */
-public class CompositeComponentTaglibLocator extends
-        AbstractFaceletTaglibLocator
-{
-    private final class ResourceLocatorChangeListener extends
-            JSFResourceChangeListener
-    {
-        @Override
-        public void changed(final JSFResourceChangedEvent event)
-        {
-            final Builder builder = new Builder();
-            switch (event.getChangeType())
-            {
-                case ADDED:
-                case CHANGED:
-                {
-                    handleAddAndChange(event, builder);
-                }
-                break;
-                case REMOVED:
-                {
-                    handleRemove(event, builder);
-                }
-                break;
-            }
-        }
-
-        private void handleRemove(final JSFResourceChangedEvent event,
-                final Builder builder)
-        {
-            List<TaglibChangedEvent> events = Collections.EMPTY_LIST;
-            switch (event.getOldValue().getType())
-            {
-                case RESOURCE:
-                {
-                    events = handleRemoveResource(event, builder);
-                }
-                break;
-                case CONTAINER:
-                {
-                    events = handleRemoveContainer(event, builder);
-                }
-                break;
-            }
-
-            _records = builder.merge(events, _records);
-            for (final TaglibChangedEvent fireEvent : events)
-            {
-                fireChangeEvent(fireEvent);
-            }
-        }
-
-        private List<TaglibChangedEvent> handleRemoveContainer(
-                final JSFResourceChangedEvent event, final Builder builder)
-        {
-            final IJSFResourceFragment oldValue = event.getOldValue();
-            builder.addLibrary((IJSFResourceContainer) oldValue,
-                    CHANGE_TYPE.REMOVED);
-            return builder.createRemove(CompositeComponentTaglibLocator.this,
-                    _records);
-        }
-
-        private List<TaglibChangedEvent> handleRemoveResource(
-                final JSFResourceChangedEvent event, final Builder builder)
-        {
-            final IJSFResourceFragment oldValue = event.getOldValue();
-            builder.addTag((IJSFResource) oldValue, CHANGE_TYPE.REMOVED);
-            return builder.createRemove(CompositeComponentTaglibLocator.this,
-                    _records);
-        }
-
-        private void handleAddAndChange(final JSFResourceChangedEvent event,
-                final Builder builder)
-        {
-            List<TaglibChangedEvent> events = Collections.EMPTY_LIST;
-
-            switch (event.getNewValue().getType())
-            {
-                case CONTAINER:
-                    // if it's a fragment handle as a possible library add
-                    events = handleFolderAddChange(event, builder);
-                break;
-                case RESOURCE:
-                    // otherwise, handle as a file add.
-                    events = handleFileAddChange(event, builder);
-                break;
-            }
-
-            _records = builder.merge(events, _records);
-
-            for (final TaglibChangedEvent fireEvent : events)
-            {
-                fireChangeEvent(fireEvent);
-            }
-        }
-
-        private List<TaglibChangedEvent> handleFolderAddChange(
-                final JSFResourceChangedEvent event, final Builder builder)
-        {
-            final JSFResourceContainer newValue = (JSFResourceContainer) event
-                    .getNewValue();
-            builder.addLibrary(newValue, CHANGE_TYPE.ADDED);
-            return builder.createMerge(CompositeComponentTaglibLocator.this,
-                    _records);
-        }
-
-        private List<TaglibChangedEvent> handleFileAddChange(
-                final JSFResourceChangedEvent event, final Builder builder)
-        {
-            final IJSFResource newValue = (IJSFResource) event.getNewValue();
-            builder.addTag(newValue, CHANGE_TYPE.ADDED);
-            return builder.createMerge(CompositeComponentTaglibLocator.this,
-                    _records);
-        }
-    }
-
-    /**
-     * the id of the locator strategy.
-     */
-    public static final String ID = CompositeComponentTaglibLocator.class
-            .getCanonicalName();
-    private static final String DISPLAY_NAME = "Composite Composite Tag Lib Locator"; //$NON-NLS-1$
-    private final ILocatorProvider<IJSFResourceLocator> _locatorProvider;
-    private Map<String, JSFResourceBasedTagRecord> _records;
-    private final ResourceLocatorChangeListener _listener;
-
-    /**
-     * @param locatorProvider
-     */
-    public CompositeComponentTaglibLocator(
-            final ILocatorProvider<IJSFResourceLocator> locatorProvider)
-    {
-        super(ID, DISPLAY_NAME);
-        _locatorProvider = locatorProvider;
-        _locatorProvider.initialize();
-        _listener = new ResourceLocatorChangeListener();
-    }
-
-    @Override
-    public void start(final IProject initialContext)
-    {
-        for (final IJSFResourceLocator locator : _locatorProvider.getLocators())
-        {
-            locator.start(initialContext);
-            locator.addListener(_listener);
-        }
-
-        final Builder builder = new Builder();
-        for (final IJSFResourceLocator locator : _locatorProvider.getLocators())
-        {
-            final List<IJSFResourceFragment> resources = locator
-                    .locate(initialContext);
-            for (final IJSFResourceFragment resource : resources)
-            {
-                if (resource.getType() == Type.RESOURCE)
-                {
-                    builder.addTag((IJSFResource) resource, CHANGE_TYPE.ADDED);
-                }
-            }
-        }
-        _records = builder.build();
-
-        super.start(initialContext);
-    }
-
-    @Override
-    public void stop()
-    {
-        for (final IJSFResourceLocator locator : _locatorProvider.getLocators())
-        {
-            locator.stop();
-        }
-        super.stop();
-    }
-
-    @Override
-    protected Map<String, ? extends IFaceletTagRecord> doLocate(
-            final IProject context)
-    {
-        return Collections.unmodifiableMap(_records);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/ContextParamSpecifiedFaceletTaglibLocator.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/ContextParamSpecifiedFaceletTaglibLocator.java
deleted file mode 100644
index 863b16c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/ContextParamSpecifiedFaceletTaglibLocator.java
+++ /dev/null
@@ -1,267 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jst.j2ee.model.IModelProvider;
-import org.eclipse.jst.jsf.common.internal.componentcore.AbstractVirtualComponentQuery;
-import org.eclipse.jst.jsf.common.internal.managedobject.ObjectManager.ManagedObjectException;
-import org.eclipse.jst.jsf.common.internal.resource.WorkspaceMediator;
-import org.eclipse.jst.jsf.facelet.core.internal.FaceletCorePlugin;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.IFaceletTagRecord.WorkspaceTagRecordDescriptor;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.Listener.TaglibChangedEvent;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.Listener.TaglibChangedEvent.CHANGE_TYPE;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglib;
-
-/**
- * Attempts to locate Facelet taglib's specified as xml files in project
- * relative paths specified in the Facelet.LIBRARIES servlet parameters.
- * 
- * @author Based on class in org.eclipse.jst.jsf.coreby Ian Trimble - Oracle
- * 
- *         TODO:merge back with common code in JSFAppConfig framework
- */
-public class ContextParamSpecifiedFaceletTaglibLocator extends
-        AbstractFaceletTaglibLocator
-{
-    private static final String ID = ContextParamSpecifiedFaceletTaglibLocator.class
-            .getCanonicalName();
-    private static final String DISPLAYNAME = Messages.ContextParamSpecifiedFaceletTaglibLocator_0;
-    private final IProject _project;
-    private final Map<String, IFaceletTagRecord> _records;
-    private final TagRecordFactory _factory;
-    private final TaglibResourceManager _fileManager;
-
-    /**
-     * @param project
-     * @param factory
-     * @param webAppProvider
-     * @param vcQuery
-     * @param wsMediator
-     */
-    public ContextParamSpecifiedFaceletTaglibLocator(final IProject project,
-            final TagRecordFactory factory,
-            final IModelProvider webAppProvider,
-            final AbstractVirtualComponentQuery vcQuery,
-            final WorkspaceMediator wsMediator)
-    {
-        super(ID, DISPLAYNAME);
-        _project = project;
-        _records = new HashMap<String, IFaceletTagRecord>();
-        _factory = factory;
-        WebappConfiguration webConfig = new WebappConfiguration(project, webAppProvider,
-                vcQuery, wsMediator);
-        _fileManager = new TaglibResourceManager(project,
-                new LibraryChangeHandler(), wsMediator, webConfig);
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @seeorg.eclipse.jst.jsf.core.jsfappconfig.AbstractJSFAppConfigLocater#
-     * startLocating()
-     */
-    @Override
-    public void start(final IProject project)
-    {
-        _fileManager.initResources();
-        super.start(project);
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @seeorg.eclipse.jst.jsf.core.jsfappconfig.AbstractJSFAppConfigLocater#
-     * stopLocating()
-     */
-    @Override
-    public void stop()
-    {
-        _fileManager.dispose();
-        super.stop();
-    }
-
-    @Override
-    protected Map<String, ? extends IFaceletTagRecord> doLocate(
-            final IProject context)
-    {
-        final List<IFile> files = _fileManager.getResources();
-
-        _records.clear();
-
-        for (final IFile file : files)
-        {
-            if (file.exists())
-            {
-                TaglibFileTracker tracker = null;
-                try
-                {
-                    tracker = (TaglibFileTracker) _fileManager.getInstance(file);
-                } catch (final ManagedObjectException e)
-                {
-                    FaceletCorePlugin.log("Creating record", e); //$NON-NLS-1$
-                }
-
-                final IFaceletTagRecord record = createTagRecord(file);
-                if (record != null)
-                {
-                    _records.put(record.getURI(), record);
-                    if (tracker != null)
-                    {
-                        tracker.setUri(record.getURI());
-                    }
-                }
-            }
-        }
-
-        return _records;
-    }
-
-    private IFaceletTagRecord createTagRecord(final IFile file)
-    {
-        InputStream is = null;
-        if (!file.isAccessible())
-        {
-            return null;
-        }
-        try
-        {
-            is = file.getContents();
-            final TagModelLoader loader = new TagModelLoader(file.getFullPath()
-                    .toFile().getCanonicalPath());
-            loader.loadFromInputStream(is);
-            final FaceletTaglib taglib = loader.getTaglib();
-            // if no valid namespace, don't create a record.
-            if (taglib != null && taglib.getNamespaceUri() != null && taglib.getNamespaceUri().trim().length()>0)
-            {
-                return _factory.createRecords(taglib, new WorkspaceTagRecordDescriptor(file));
-            }
-        } catch (final Exception e)
-        {
-            FaceletCorePlugin
-                    .log(
-                            "Loading web root taglibs for project: " + _project.getName(), e); //$NON-NLS-1$
-        } finally
-        {
-            if (is != null)
-            {
-                try
-                {
-                    is.close();
-                } catch (final IOException e)
-                {
-                    FaceletCorePlugin.log("Closing taglib.xml", e); //$NON-NLS-1$
-                }
-            }
-        }
-        return null;
-    }
-
-    class LibraryChangeHandler implements ILibraryChangeHandler
-    {
-        public void added(final IFile file)
-        {
-            final IFaceletTagRecord tagRecord = createTagRecord(file);
-            TaglibFileTracker tracker = null;
-            try
-            {
-                tracker = (TaglibFileTracker) _fileManager.getInstance(file);
-            } catch (final ManagedObjectException e)
-            {
-                FaceletCorePlugin.log("Adding new library", e); //$NON-NLS-1$
-            }
-
-            if (tagRecord != null)
-            {
-
-                _records.put(tagRecord.getURI(), tagRecord);
-                if (tracker != null)
-                {
-                    tracker.setUri(tagRecord.getURI());
-                }
-
-                fireChangeEvent(new TaglibChangedEvent(
-                        ContextParamSpecifiedFaceletTaglibLocator.this, null,
-                        tagRecord, CHANGE_TYPE.ADDED));
-            }
-        }
-
-        public void removed(final String uri, final IFile file)
-        {
-            final IFaceletTagRecord tagRecord = _records.remove(uri);
-            if (tagRecord != null)
-            {
-                fireChangeEvent(new TaglibChangedEvent(
-                        ContextParamSpecifiedFaceletTaglibLocator.this, tagRecord,
-                        null, CHANGE_TYPE.REMOVED));
-            }
-        }
-
-        public void changed(final String uri, final IFile file)
-        {
-            final IFaceletTagRecord oldValue = _records.remove(uri);
-            final IFaceletTagRecord newValue = createTagRecord(file);
-
-            if (oldValue == null)
-            {
-                // no oldValue, is newValue so ADD
-                if (newValue != null)
-                {
-                    _records.put(uri, newValue);
-                    fireChangeEvent(new TaglibChangedEvent(
-                            ContextParamSpecifiedFaceletTaglibLocator.this, null,
-                            newValue, CHANGE_TYPE.ADDED));
-                }
-            }
-            // if there is an old value
-            else
-            {
-                // oldValue but no new value, so REMOVE
-                if (newValue == null)
-                {
-                    fireChangeEvent(new TaglibChangedEvent(
-                            ContextParamSpecifiedFaceletTaglibLocator.this, oldValue,
-                            null, CHANGE_TYPE.REMOVED));
-                    
-                }
-                // both old and new value, so a change of some kind
-                else
-                {
-                    _records.put(uri, newValue);
-                    // if the namespaces match, then it's a simple change
-                    if (oldValue.getURI() != null && oldValue.getURI().equals(newValue.getURI()))
-                    {
-                        fireChangeEvent(new TaglibChangedEvent(
-                                ContextParamSpecifiedFaceletTaglibLocator.this,
-                                oldValue, newValue, CHANGE_TYPE.CHANGED));
-                    }
-                    // otherwise, it's a remove of old value and an add of new value
-                    else
-                    {
-                        fireChangeEvent(new TaglibChangedEvent(
-                                ContextParamSpecifiedFaceletTaglibLocator.this, oldValue,
-                                null, CHANGE_TYPE.REMOVED));
-                        fireChangeEvent(new TaglibChangedEvent(
-                                ContextParamSpecifiedFaceletTaglibLocator.this, null,
-                                newValue, CHANGE_TYPE.ADDED));
-                    }
-                }
-            }
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/DefaultStandardTaglibLocator.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/DefaultStandardTaglibLocator.java
deleted file mode 100644
index e62b51c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/DefaultStandardTaglibLocator.java
+++ /dev/null
@@ -1,130 +0,0 @@
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib;
-
-import java.io.File;
-import java.io.InputStream;
-import java.net.URL;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.FileLocator;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jst.jsf.facelet.core.internal.FaceletCorePlugin;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.IFaceletTagRecord.TagRecordDescriptor;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglib;
-
-/**
- * @author cbateman
- * 
- */
-public class DefaultStandardTaglibLocator extends AbstractFaceletTaglibLocator
-{
-    private static final Set<String> taglibLocations;
-    static
-    {
-        final Set<String> set = new HashSet<String>();
-        set.add("/std-taglibs/html_basic.taglib.xml"); //$NON-NLS-1$
-        set.add("/std-taglibs/composite.taglib.xml"); //$NON-NLS-1$
-        set.add("/std-taglibs/facelets_jsf_core.taglib.xml"); //$NON-NLS-1$
-        set.add("/std-taglibs/jstl-core.taglib.xml"); //$NON-NLS-1$
-        set.add("/std-taglibs/jstl-fn.taglib.xml"); //$NON-NLS-1$
-        set.add("/std-taglibs/ui.taglib.xml"); //$NON-NLS-1$
-        taglibLocations = Collections.unmodifiableSet(set);
-    }
-    private static final Set<MyTagRecordDescriptor> DEFAULT_TAGLIBS;
-    static
-    {
-        Set<MyTagRecordDescriptor>  taglibs = new HashSet<MyTagRecordDescriptor>();
-        for (final String location : taglibLocations)
-        {
-            try
-            {
-                final URL url = FaceletCorePlugin.getDefault().getBundle()
-                        .getEntry(location);
-                final URL fileURL = FileLocator.toFileURL(url);
-                File file = new File(fileURL.getPath());
-                final InputStream openStream = fileURL.openStream();
-                final TagModelLoader loader = new TagModelLoader(
-                        file.getAbsolutePath());
-                loader.loadFromInputStream(openStream);
-                final FaceletTaglib taglib = loader.getTaglib();
-                MyTagRecordDescriptor desc = new MyTagRecordDescriptor(new Path(fileURL.toString()), taglib);
-                taglibs.add(desc);
-            } catch (final Exception e)
-            {
-                FaceletCorePlugin.log(
-                        "Trying to load default taglib for: " + location, e); //$NON-NLS-1$
-            }
-        }
-        DEFAULT_TAGLIBS = Collections.unmodifiableSet(taglibs);
-    }
-    private HashMap<String, IFaceletTagRecord> _defaultRecords;
-
-    /**
-     * 
-     */
-    public DefaultStandardTaglibLocator()
-    {
-        super("", ""); //$NON-NLS-1$//$NON-NLS-2$
-        _defaultRecords = new HashMap<String, IFaceletTagRecord>();
-    }
-
-    @Override
-    public void start(IProject project)
-    {
-        final TagRecordFactory factory = new TagRecordFactory(project,
-                false);
-        
-        for (final MyTagRecordDescriptor desc : DEFAULT_TAGLIBS)
-        {
-            final IFaceletTagRecord record = factory.createRecords(desc.getTaglib(),
-                    desc);
-            if (record != null)
-            {
-                _defaultRecords.put(record.getURI(), record);
-            }
-        }
-        super.start(project);
-    }
-
-    @Override
-    protected Map<String, ? extends IFaceletTagRecord> doLocate(IProject context)
-    {
-        return Collections.unmodifiableMap(_defaultRecords);
-    }
-
-    private static class MyTagRecordDescriptor extends TagRecordDescriptor
-    {
-        private final IPath _path;
-        private final FaceletTaglib  _taglib;
-        
-        public MyTagRecordDescriptor(final IPath path, final FaceletTaglib taglib)
-        {
-            super(Source.JAR);
-            _path = path;
-            _taglib = taglib;
-        }
-
-        @Override
-        public IResource getResource()
-        {
-            return null;
-        }
-
-        @Override
-        public IPath getPath()
-        {
-            return _path;
-        }
-
-        public FaceletTaglib getTaglib()
-        {
-            return _taglib;
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/ExtensionBasedTagDescriptorFactoryProviderStrategy.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/ExtensionBasedTagDescriptorFactoryProviderStrategy.java
deleted file mode 100644
index 1c61b9c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/ExtensionBasedTagDescriptorFactoryProviderStrategy.java
+++ /dev/null
@@ -1,69 +0,0 @@
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib;
-
-import java.util.List;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jst.jsf.common.internal.pde.AbstractSimpleClassExtensionRegistryReader;
-import org.eclipse.jst.jsf.common.internal.strategy.ISimpleStrategy;
-import org.eclipse.jst.jsf.core.jsfappconfig.internal.IJSFAppConfigManager;
-import org.eclipse.jst.jsf.facelet.core.internal.FaceletCorePlugin;
-
-/**
- * Extension-based strategy for returning {@link IJSFAppConfigManager}s
- * 
- */
-public class ExtensionBasedTagDescriptorFactoryProviderStrategy implements
-        ISimpleStrategy<IProject, IProjectTaglibDescriptorFactory>
-{
-    private static IProjectTaglibDescriptorFactory EXT_PT_BASED_FACTORY;
-    static
-    {
-        final ProjectTaglibDescriptorFactoryExtensionPointReader reader = new ProjectTaglibDescriptorFactoryExtensionPointReader();
-        final List<IProjectTaglibDescriptorFactory> res = reader
-                .getExtensions();
-        if (res != null && res.size() > 0)
-        {// return first
-            EXT_PT_BASED_FACTORY = res.get(0);
-        }
-    }
-
-    public IProjectTaglibDescriptorFactory perform(final IProject input)
-            throws Exception
-    {
-        return EXT_PT_BASED_FACTORY != null ? EXT_PT_BASED_FACTORY
-                : getNoResult();
-    }
-
-    private static class ProjectTaglibDescriptorFactoryExtensionPointReader
-            extends
-            AbstractSimpleClassExtensionRegistryReader<IProjectTaglibDescriptorFactory>
-    {
-        private static final String EXT_PT_ID = "projectTaglibDescriptorFactory"; //$NON-NLS-1$
-        private static final String EXT_PT_ELEMENT = "factory"; //$NON-NLS-1$
-        private static final String EXT_PT_ATTR = "class"; //$NON-NLS-1$
-
-        protected ProjectTaglibDescriptorFactoryExtensionPointReader()
-        {
-            super(
-                    FaceletCorePlugin.PLUGIN_ID,
-                    EXT_PT_ID,
-                    EXT_PT_ELEMENT,
-                    EXT_PT_ATTR,
-                    new CompareOrgEclipseJstContributorsLastComparator<IProjectTaglibDescriptorFactory>());
-        }
-
-        @Override
-        protected void handleLoadFailure(final CoreException ce)
-        {
-            org.eclipse.jst.jsf.core.internal.JSFCorePlugin
-                    .log(ce,
-                            "Error loading ProjectTaglibDescriptorFactory from extension"); //$NON-NLS-1$
-        }
-    }
-
-    public IProjectTaglibDescriptorFactory getNoResult()
-    {
-        return null;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/FaceletTagIndex.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/FaceletTagIndex.java
deleted file mode 100644
index cdef395..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/FaceletTagIndex.java
+++ /dev/null
@@ -1,232 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.concurrent.CopyOnWriteArrayList;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.jst.j2ee.model.ModelProviderManager;
-import org.eclipse.jst.jsf.common.internal.componentcore.AbstractVirtualComponentQuery.DefaultVirtualComponentQuery;
-import org.eclipse.jst.jsf.common.internal.finder.AbstractMatcher.AlwaysMatcher;
-import org.eclipse.jst.jsf.common.internal.locator.AbstractLocatorProvider;
-import org.eclipse.jst.jsf.common.internal.locator.AbstractLocatorProvider.DefaultLocatorProvider;
-import org.eclipse.jst.jsf.common.internal.locator.ILocatorChangeListener;
-import org.eclipse.jst.jsf.common.internal.resource.ContentTypeResolver;
-import org.eclipse.jst.jsf.common.internal.resource.DefaultJarLocator;
-import org.eclipse.jst.jsf.common.internal.resource.JavaCoreMediator;
-import org.eclipse.jst.jsf.common.internal.resource.ResourceSingletonObjectManager;
-import org.eclipse.jst.jsf.common.internal.resource.WorkspaceMediator;
-import org.eclipse.jst.jsf.common.internal.strategy.AbstractTestableExtensibleDefaultProviderSelectionStrategy;
-import org.eclipse.jst.jsf.common.internal.strategy.ISimpleStrategy;
-import org.eclipse.jst.jsf.designtime.internal.resources.IJSFResourceLocator;
-import org.eclipse.jst.jsf.designtime.internal.resources.JarBasedJSFResourceLocator;
-import org.eclipse.jst.jsf.designtime.internal.resources.WorkspaceJSFResourceLocator;
-
-/**
- * @author cbateman
- * 
- */
-public class FaceletTagIndex extends
-        ResourceSingletonObjectManager<IProjectTaglibDescriptor, IProject>
-{
-    private ISimpleStrategy<IProject, IProjectTaglibDescriptorFactory> _tagDescriptorFactoryProvider;
-
-    /**
-     * @param ws
-     */
-    public FaceletTagIndex(final IWorkspace ws)
-    {
-        super(ws);
-        _tagDescriptorFactoryProvider = new ProjectTaglibDescriptorFactoryProviderSelectionStrategy();
-    }
-
-    /**
-     * @param ws
-     * @param tagDescriptorFactoryProvider
-     */
-    public FaceletTagIndex(final IWorkspace ws, final ISimpleStrategy<IProject, IProjectTaglibDescriptorFactory> tagDescriptorFactoryProvider)
-    {
-        this(ws);
-        _tagDescriptorFactoryProvider = tagDescriptorFactoryProvider;
-    }
-
-    private static FaceletTagIndex INSTANCE;
-
-    /**
-     * @param ws
-     * @return the singleton instance
-     */
-    public static synchronized FaceletTagIndex getInstance(final IWorkspace ws)
-    {
-        if (INSTANCE == null)
-        {
-            INSTANCE = new FaceletTagIndex(ws);
-        }
-        return INSTANCE;
-    }
-
-    @Override
-    protected IProjectTaglibDescriptor createNewInstance(final IProject project)
-    {
-        final TagRecordFactory factory = new TagRecordFactory(project, true);
-        IProjectTaglibDescriptorFactory descFactory;
-        try
-        {
-            descFactory = _tagDescriptorFactoryProvider
-                    .perform(project);
-            return descFactory.create(project, factory);
-        } catch (Exception e)
-        {
-            return null;
-        }
-    }
-
-    /**
-     * Force a project to refresh its tag index info
-     * 
-     * @param project
-     */
-    public void flush(final IProject project)
-    {
-        final IProjectTaglibDescriptor flushedDescriptor = unmanageResource(project);
-        flushedDescriptor.destroy();
-    }
-
-    /**
-     * Used to decide what provider gets used to get the descriptor factory.
-     * This allows us to inject a different descriptor factory than the default
-     * through either a test setter (test-only) or production (ext point).
-     * 
-     * @author cbateman
-     * 
-     */
-    private static class ProjectTaglibDescriptorFactoryProviderSelectionStrategy
-            extends
-            AbstractTestableExtensibleDefaultProviderSelectionStrategy<IProject, IProjectTaglibDescriptorFactory>
-    {
-        private static final IProjectTaglibDescriptorFactory NO_RESULT = null;
-
-        public ProjectTaglibDescriptorFactoryProviderSelectionStrategy()
-        {
-            super();
-            addDefaultStrategy(new DefaultProjectTaglibDescriptorFactoryProvider(
-                    new DefaultProjectTaglibDescriptorFactory()));
-            addExtensionStrategy(new ExtensionBasedTagDescriptorFactoryProviderStrategy());
-        }
-
-        @Override
-        public IProjectTaglibDescriptorFactory getNoResult()
-        {
-            return NO_RESULT;
-        }
-    }
-
-    private static class DefaultProjectTaglibDescriptorFactoryProvider
-            implements
-            ISimpleStrategy<IProject, IProjectTaglibDescriptorFactory>
-    {
-        private final DefaultProjectTaglibDescriptorFactory _factory;
-
-        public DefaultProjectTaglibDescriptorFactoryProvider(
-                final DefaultProjectTaglibDescriptorFactory factory)
-        {
-            _factory = factory;
-        }
-
-        public IProjectTaglibDescriptorFactory perform(final IProject input)
-                throws Exception
-        {
-            return _factory;
-        }
-
-        public IProjectTaglibDescriptorFactory getNoResult()
-        {
-            return null;
-        }
-    }
-
-    /**
-     * The default factory for creating per-project tag descriptors.
-     * 
-     * @author cbateman
-     * 
-     */
-    public static class DefaultProjectTaglibDescriptorFactory extends
-            AbstractProjectTaglibDescriptorFactory
-    {
-        @Override
-        public IProjectTaglibDescriptor create(final IProject project,
-                final TagRecordFactory factory)
-        {
-            final List<AbstractFaceletTaglibLocator> locators = new ArrayList<AbstractFaceletTaglibLocator>();
-            locators.add(new JarFileFaceletTaglibLocator(factory));
-            locators.add(new ContextParamSpecifiedFaceletTaglibLocator(project,
-                    factory, ModelProviderManager.getModelProvider(project),
-                    new DefaultVirtualComponentQuery(), new WorkspaceMediator()));
-            final List<IJSFResourceLocator> resourceLocators = new ArrayList<IJSFResourceLocator>();
-            resourceLocators
-                    .add(new JarBasedJSFResourceLocator(Collections.EMPTY_LIST,
-                            new CopyOnWriteArrayList<ILocatorChangeListener>(),
-                            new DefaultJarLocator(Collections
-                                    .singletonList(new AlwaysMatcher()),
-                                    new JavaCoreMediator()),
-                            new ContentTypeResolver()));
-            final IWorkspace workspace = project.getWorkspace();
-            resourceLocators.add(new WorkspaceJSFResourceLocator(
-                    Collections.EMPTY_LIST,
-                    new CopyOnWriteArrayList<ILocatorChangeListener>(),
-                    new DefaultVirtualComponentQuery(),
-                    new ContentTypeResolver(), workspace));
-            final DefaultLocatorProvider<IJSFResourceLocator> resourceLocatorProvider = new DefaultLocatorProvider<IJSFResourceLocator>(
-                    resourceLocators);
-            locators.add(new CompositeComponentTaglibLocator(
-                    resourceLocatorProvider));
-            final LocatorProvider provider = new LocatorProvider(locators);
-            return new ProjectTaglibDescriptor(project, factory, provider);
-        }
-    }
-
-    /**
-     * The locator provider used by the tag index.
-     * 
-     * @author cbateman
-     * 
-     */
-    public static class LocatorProvider extends
-            AbstractLocatorProvider<AbstractFaceletTaglibLocator>
-    {
-        private final List<AbstractFaceletTaglibLocator> _locators;
-
-        /**
-         * @param locators
-         */
-        public LocatorProvider(final List<AbstractFaceletTaglibLocator> locators)
-        {
-            _locators = locators;
-        }
-
-        @Override
-        protected void doInitialize()
-        {
-            // nothing to do
-        }
-
-        @Override
-        protected List<? extends AbstractFaceletTaglibLocator> doGetLocators()
-        {
-            return Collections.unmodifiableList(_locators);
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/FaceletTagRecord.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/FaceletTagRecord.java
deleted file mode 100644
index 95db97f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/FaceletTagRecord.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib;
-
-import java.util.Collection;
-import java.util.concurrent.CopyOnWriteArrayList;
-
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTag;
-
-/**
- * Super of all facelet tag records.
- * 
- * @author cbateman
- *
- */
-public abstract class FaceletTagRecord implements IFaceletTagRecord
-{
-    private final CopyOnWriteArrayList<ITagRecordChangeListener> _listeners;
-    private final TagRecordDescriptor _descriptor;
-
-    /**
-     * @param descriptor 
-     * 
-     */
-    public FaceletTagRecord(final TagRecordDescriptor descriptor)
-    {
-        _listeners = new CopyOnWriteArrayList<ITagRecordChangeListener>();
-        _descriptor = descriptor;
-    }
-
-    
-    public TagRecordDescriptor getDescriptor()
-    {
-        return _descriptor;
-    }
-
-
-    public void addListener(final ITagRecordChangeListener listener)
-    {
-        _listeners.addIfAbsent(listener);
-    }
-
-    public void removeListener(final ITagRecordChangeListener listener)
-    {
-        _listeners.remove(listener);
-    }
-
-    /**
-     * @param event
-     */
-    protected void fireEvent(final TagRecordChangeEvent event)
-    {
-        for (final ITagRecordChangeListener listener : _listeners)
-        {
-            listener.changed(event);
-        }
-    }
-
-    /**
-     * 
-     */
-    private static final long serialVersionUID = -4606745577562951499L;
-
-    public abstract String getURI();
-
-    public abstract FaceletTaglibTag getTag(final String name);
-
-    public abstract Collection<? extends FaceletTaglibTag> getTags();
-    
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/IFaceletTagRecord.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/IFaceletTagRecord.java
deleted file mode 100644
index 7de826b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/IFaceletTagRecord.java
+++ /dev/null
@@ -1,267 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib;
-
-import java.io.Serializable;
-import java.util.Collection;
-import java.util.EventObject;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTag;
-
-/**
- * @author cbateman
- * 
- */
-public interface IFaceletTagRecord extends Serializable
-{
-    /**
-     * @return the uri of the tag library
-     */
-    String getURI();
-
-    /**
-     * This may be implemented differently than getTags().size(), since getting
-     * all tags may be very expensive, while the overall number may be cheap.
-     * 
-     * However, it should always be true that getTags().size() == getNumTags()
-     * 
-     * @return the number of tags in this record.
-     */
-    int getNumTags();
-
-    /**
-     * @return the tag definitions
-     */
-    Collection<? extends FaceletTaglibTag> getTags();
-
-    /**
-     * @param name
-     * @return the tag definition for name or null.
-     */
-    FaceletTaglibTag getTag(final String name);
-
-    /**
-     * @return the tag record descriptor for the record.
-     */
-    TagRecordDescriptor getDescriptor();
-
-    /**
-     * @param listener
-     */
-    void addListener(final ITagRecordChangeListener listener);
-
-    /**
-     * @param listener
-     */
-    void removeListener(final ITagRecordChangeListener listener);
-
-    /**
-     * Indicates that a tag record has changed
-     */
-    public static class TagRecordChangeEvent extends EventObject
-    {
-        /**
-         * 
-         */
-        private static final long serialVersionUID = 5655356157624922019L;
-
-        /**
-         * @param source
-         */
-        public TagRecordChangeEvent(final IFaceletTagRecord source)
-        {
-            super(source);
-        }
-    }
-
-    /**
-     * A listener for tag record change events.
-     * 
-     */
-    public interface ITagRecordChangeListener
-    {
-        /**
-         * @param event
-         */
-        public void changed(final TagRecordChangeEvent event);
-    }
-
-    /**
-     * Describes the source of a tag record in the filesystem and workspace.
-     * 
-     */
-    public abstract static class TagRecordDescriptor
-    {
-        private final Source _source;
-
-        /**
-         * @param source
-         */
-        public TagRecordDescriptor(final Source source)
-        {
-            super();
-            _source = source;
-        }
-
-        /**
-         * @return the source type of the descriptor
-         */
-        public Source getSource()
-        {
-            return _source;
-        }
-
-        /**
-         * The source of the tag record
-         * 
-         */
-        public enum Source
-        {
-            /**
-             * Tag record is defined in a file in the workspace. If this is the
-             * source, then getResource() will never return null and will be of
-             * type IFile.
-             */
-            WORKSPACE_FILE,
-            /**
-             * Tag record is defined in a folder in the workspace. If this is
-             * the source, then getResource() will never return null and will be
-             * of type IFolder.
-             */
-            WORKSPACE_FOLDER,
-            /**
-             * Tag record is defined in a jar file. If this is the source then
-             * getResource() will return an IFile if the jar is in the workspace
-             * and null otherwise.
-             */
-            JAR
-        }
-
-        /**
-         * see Source for information on what this returns.
-         * 
-         * @return the workspace resource where the tag record is defined. or
-         *         null if it is not in the workspace
-         */
-        public abstract IResource getResource();
-
-        /**
-         * @return the absolute path in the file system to the where the library
-         *         is defined. If Source is WORKSPACE_FOLDER then this will
-         *         point to a directory.
-         * 
-         *         Otherwise, it will point to a file.
-         */
-        public abstract IPath getPath();
-    }
-
-    /**
-     * Describes a tag record defined in workspace.
-     * 
-     */
-    public static class WorkspaceTagRecordDescriptor extends
-            TagRecordDescriptor
-    {
-        private final IResource _resource;
-
-        /**
-         * @param file
-         */
-        public WorkspaceTagRecordDescriptor(final IFile file)
-        {
-            super(Source.WORKSPACE_FILE);
-            _resource = file;
-        }
-
-        /**
-         * @param folder
-         */
-        public WorkspaceTagRecordDescriptor(final IFolder folder)
-        {
-            super(Source.WORKSPACE_FOLDER);
-            _resource = folder;
-        }
-
-        @Override
-        public IResource getResource()
-        {
-            return _resource;
-        }
-
-        @Override
-        public IPath getPath()
-        {
-            return _resource.getLocation();
-        }
-    }
-
-    /**
-     * Describes a tag record defined in a jar. The additional entryName
-     * provides the jar entry where the actual tag record source file is found.
-     * 
-     */
-    public static class JarTagRecordDescriptor extends TagRecordDescriptor
-    {
-        private final IResource _resourceJar;
-        private final String _entryName;
-        private final IPath _absPath;
-
-        /**
-         * @param resourceJar
-         * @param entryName
-         */
-        public JarTagRecordDescriptor(final IResource resourceJar,
-                final String entryName)
-        {
-            super(Source.JAR);
-            _resourceJar = resourceJar;
-            _entryName = entryName;
-            _absPath = resourceJar.getLocation();
-        }
-
-        /**
-         * @param absPath
-         * @param entryName
-         */
-        public JarTagRecordDescriptor(final IPath absPath,
-                final String entryName)
-        {
-            super(Source.JAR);
-            _resourceJar = null;
-            _absPath = absPath;
-            _entryName = entryName;
-        }
-
-        @Override
-        public IResource getResource()
-        {
-            return _resourceJar;
-        }
-
-        @Override
-        public IPath getPath()
-        {
-            return _absPath;
-        }
-
-        /**
-         * @return the entry name o
-         */
-        public final String getEntryName()
-        {
-            return _entryName;
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/IFaceletTaglibLocator.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/IFaceletTaglibLocator.java
deleted file mode 100644
index 6d0f761..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/IFaceletTaglibLocator.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib;
-
-import java.util.Map;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jst.jsf.common.internal.locator.ILocator;
-
-/**
- * A locator that returns a name-keyed map of facelet tag records for a particular
- * project.
- * 
- * @author cbateman
- *
- */
-public interface IFaceletTaglibLocator extends ILocator<Map<String, ? extends IFaceletTagRecord>, IProject, String>
-{
-    /**
-     * @param listener
-     */
-    public abstract void addListener(final Listener listener);
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/ILibraryChangeHandler.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/ILibraryChangeHandler.java
deleted file mode 100644
index 69d51f5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/ILibraryChangeHandler.java
+++ /dev/null
@@ -1,37 +0,0 @@
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib;
-
-import org.eclipse.core.resources.IFile;
-
-/**
- * A callback interface used declare library changes to a client.
- * 
- * @author cbateman
- *
- */
-public interface ILibraryChangeHandler
-{
-
-    /**
-     * Signal that the library defined in file with namespace uri has changed.
-     * 
-     * @param uri
-     * @param file
-     */
-    public abstract void changed(final String uri, final IFile file);
-
-    /**
-     * Signal that the library defined in file with namespace uri has been
-     * removed as a library.  This may or may not mean that file still exists.
-     * @param uri
-     * @param file
-     */
-    public abstract void removed(final String uri, final IFile file);
-
-    /**
-     * A new tag library defined in file has been added to the system.
-     * 
-     * @param file
-     */
-    public abstract void added(final IFile file);
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/IProjectTaglibDescriptor.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/IProjectTaglibDescriptor.java
deleted file mode 100644
index effe16c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/IProjectTaglibDescriptor.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib;
-
-import java.util.Collection;
-
-import org.eclipse.jst.jsf.common.internal.managedobject.IManagedObject;
-
-/**
- * A descriptor for all facelet taglibs in a project.
- * 
- * @author cbateman
- *
- */
-public interface IProjectTaglibDescriptor extends IManagedObject
-{
-    /**
-     * @return get the tag library records
-     */
-    public Collection<? extends IFaceletTagRecord> getTagLibraries();
-
-    /**
-     * @param uri
-     * @return get the tag library for uri
-     */
-    public IFaceletTagRecord getTagLibrary(final String uri);
-    
-    /**
-     * @param listener
-     */
-    public void addListener(final Listener  listener);
-    
-    /**
-     * @param listener
-     */
-    public void removeListener(final Listener listener);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/IProjectTaglibDescriptorFactory.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/IProjectTaglibDescriptorFactory.java
deleted file mode 100644
index 039d926..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/IProjectTaglibDescriptorFactory.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib;
-
-import org.eclipse.core.resources.IProject;
-
-/**
- * Implemented by factories that create new IProjectTaglibDescriptor objects.
- * 
- * @author cbateman
- *
- */
-public interface IProjectTaglibDescriptorFactory
-{
-    /**
-     * @param project
-     * @param factory
-     * @param jarProvider
-     * @param webAppProvider
-     * @param vcQuery
-     * @return a new taglib descriptor.
-     */
-    IProjectTaglibDescriptor create(final IProject project, final TagRecordFactory factory);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/JSFResourceBasedTagRecord.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/JSFResourceBasedTagRecord.java
deleted file mode 100644
index a15276e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/JSFResourceBasedTagRecord.java
+++ /dev/null
@@ -1,421 +0,0 @@
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib;
-
-import java.io.File;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jst.jsf.common.internal.util.JarUtilities;
-import org.eclipse.jst.jsf.designtime.internal.resources.IJSFResource;
-import org.eclipse.jst.jsf.designtime.internal.resources.IJSFResourceContainer;
-import org.eclipse.jst.jsf.designtime.internal.resources.IJSFResourceFragment;
-import org.eclipse.jst.jsf.designtime.internal.resources.IJarBasedJSFResource;
-import org.eclipse.jst.jsf.designtime.internal.resources.IWorkspaceJSFResourceFragment;
-import org.eclipse.jst.jsf.designtime.internal.resources.WorkspaceJSFResourceContainer;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.Listener.TaglibChangedEvent;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.Listener.TaglibChangedEvent.CHANGE_TYPE;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibFactory;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTag;
-
-/**
- * A facelet tag record is derived from a JSF locatable resource (ezcomp).
- * 
- * @author cbateman
- * 
- */
-public class JSFResourceBasedTagRecord extends FaceletTagRecord
-{
-    private final List<FaceletTaglibTag> _tags;
-    private final String _uri;
-
-    /**
-     * @param uri
-     * @param tags
-     * @param descriptor
-     */
-    public JSFResourceBasedTagRecord(final String uri,
-            final List<FaceletTaglibTag> tags,
-            final TagRecordDescriptor descriptor)
-    {
-        super(descriptor);
-        _uri = uri;
-        _tags = tags;
-    }
-
-    /**
-     * 
-     */
-    private static final long serialVersionUID = 5944923828112777373L;
-
-    public int getNumTags()
-    {
-        return _tags.size();
-    }
-
-    @Override
-    public String getURI()
-    {
-        return _uri;
-    }
-
-    @Override
-    public FaceletTaglibTag getTag(final String name)
-    {
-        for (final FaceletTaglibTag tag : _tags)
-        {
-            if (tag.getTagName().equals(name))
-            {
-                return tag;
-            }
-        }
-        return null;
-    }
-
-    @Override
-    public Collection<? extends FaceletTaglibTag> getTags()
-    {
-        return Collections.unmodifiableCollection(_tags);
-    }
-
-    /**
-     * Merge my tags with 'withThese'. Tags in my list will be replaced with
-     * those in 'withThese' if their names match.
-     * 
-     * @param withThese
-     */
-    /* package */JSFResourceBasedTagRecord mergeTags(
-            final List<FaceletTaglibTag> withThese)
-    {
-        final List<FaceletTaglibTag> tags = new ArrayList<FaceletTaglibTag>(
-                _tags);
-        for (final FaceletTaglibTag mergeTag : withThese)
-        {
-            final FaceletTaglibTag tag = getTag(mergeTag.getTagName());
-            if (tag != null)
-            {
-                tags.remove(tag);
-            }
-            tags.add(mergeTag);
-        }
-        return new JSFResourceBasedTagRecord(_uri, tags, getDescriptor());
-    }
-
-    /* package */JSFResourceBasedTagRecord removeTags(
-            final List<FaceletTaglibTag> removeThese)
-    {
-        final List<FaceletTaglibTag> tags = new ArrayList<FaceletTaglibTag>(
-                _tags);
-        for (final FaceletTaglibTag mergeTag : removeThese)
-        {
-            final FaceletTaglibTag tag = getTag(mergeTag.getTagName());
-            if (tag != null)
-            {
-                tags.remove(tag);
-            }
-        }
-        return new JSFResourceBasedTagRecord(_uri, tags, getDescriptor());
-    }
-
-    /**
-     * A builder for tag record.
-     * 
-     * @author cbateman
-     * 
-     */
-    public static class Builder
-    {
-        private static final LibEntry WHOLE_LIBRARY = new LibEntry(null);
-        private static final JSFResourceBasedTagRecord WHOLE_LIB_RECORD = new JSFResourceBasedTagRecord(null, Collections.EMPTY_LIST, null);
-        private final Map<String, LibEntry> _tags = new HashMap<String, LibEntry>();
-        private static final String FACELET_FILE_CONTENT_TYPE = "org.eclipse.wst.html.core.htmlsource"; //$NON-NLS-1$
-
-        /**
-         * @param jsfResource
-         * @param changeType
-         */
-        public void addTag(final IJSFResource jsfResource,
-                final CHANGE_TYPE changeType)
-        {
-            final String libraryName = jsfResource.getId().getLibraryName();
-            if (libraryName == null)
-            {
-                return;
-            }
-            final String uri = String.format(
-                    "http://java.sun.com/jsf/composite/%s", libraryName); //$NON-NLS-1$
-            LibEntry tags = _tags.get(uri);
-            if (tags == null)
-            {
-                tags = new LibEntry(createDescriptor(jsfResource));
-                _tags.put(uri, tags);
-            }
-            final String resourceName = jsfResource.getId().getResourceName();
-            final IPath resourceNamePath = new Path(resourceName)
-                    .removeFileExtension();
-            final FaceletTaglibTag tag = FaceletTaglibFactory.eINSTANCE
-                    .createFaceletTaglibTag();
-            tag.setTagName(resourceNamePath.toString());
-            switch (changeType)
-            {
-                case ADDED:
-                case CHANGED:
-                    // only add to the list on a add/change if the resource
-                    // exists and is the right type
-                    if (jsfResource.isAccessible()
-                            && jsfResource
-                                    .isContentType(FACELET_FILE_CONTENT_TYPE))
-                    {
-                        tags.addTag(tag);
-                    }
-                break;
-                case REMOVED:
-                    // add all comers to the remove list. There will only be
-                    // removal
-                    // on merge if ADDED/CHANGED path decided they should be
-                    // there.
-                    tags.addTag(tag);
-                break;
-            }
-        }
-
-        /**
-         * @param jsfResource
-         * @param changeType
-         */
-        public void addLibrary(final IJSFResourceContainer jsfResource,
-                final CHANGE_TYPE changeType)
-        {
-            final String libraryName = jsfResource.getId().getLibraryName();
-            if (libraryName == null || libraryName.trim().length() == 0)
-            {
-                return;
-            }
-            final String uri = String.format(
-                    "http://java.sun.com/jsf/composite/%s", libraryName); //$NON-NLS-1$
-            if (changeType == CHANGE_TYPE.REMOVED)
-            {
-                _tags.put(uri, WHOLE_LIBRARY);
-            } else
-            {
-                LibEntry tags = _tags.get(uri);
-                if (tags == null)
-                {
-                    tags = new LibEntry(createDescriptor(jsfResource));
-                    _tags.put(uri, tags);
-                }
-            }
-        }
-
-        /**
-         * @return the built list of tag records.
-         */
-        public Map<String, JSFResourceBasedTagRecord> build()
-        {
-            final Map<String, JSFResourceBasedTagRecord> records = new HashMap<String, JSFResourceBasedTagRecord>();
-            for (final Map.Entry<String, LibEntry> entry : _tags
-                    .entrySet())
-            {
-                if (entry.getValue() == WHOLE_LIBRARY)
-                {
-                    records.put(entry.getKey(), WHOLE_LIB_RECORD);
-                }
-                else
-                {
-                    final String uri = entry.getKey();
-                    final List<FaceletTaglibTag> tags = new ArrayList<FaceletTaglibTag>(entry.getValue().getTags());
-                    final TagRecordDescriptor descriptor = entry.getValue().getDescriptor();
-                    final JSFResourceBasedTagRecord newRecord = new JSFResourceBasedTagRecord(
-                            uri, tags, descriptor);
-                    records.put(entry.getKey(), newRecord);
-                }
-            }
-            return records;
-        }
-
-        /**
-         * @param locator
-         * @param records
-         * @return a list of taglib change events that reflect what will happen
-         *         when my tags are merged into the map 'records'.
-         */
-        public List<TaglibChangedEvent> createMerge(
-                final AbstractFaceletTaglibLocator locator,
-                final Map<String, JSFResourceBasedTagRecord> records)
-        {
-            final Map<String, JSFResourceBasedTagRecord> newRecords = build();
-            final List<TaglibChangedEvent> mergeEvents = new ArrayList<TaglibChangedEvent>();
-            for (final Map.Entry<String, JSFResourceBasedTagRecord> entry : newRecords
-                    .entrySet())
-            {
-                TaglibChangedEvent event = null;
-                if (!records.containsKey(entry.getKey()))
-                {
-                    event = new TaglibChangedEvent(locator, null,
-                            entry.getValue(), CHANGE_TYPE.ADDED);
-                } else
-                {
-                    final JSFResourceBasedTagRecord oldRecord = records
-                            .get(entry.getKey());
-                    final JSFResourceBasedTagRecord newRecord = oldRecord
-                            .mergeTags(entry.getValue()._tags);
-                    event = new TaglibChangedEvent(locator, oldRecord,
-                            newRecord, CHANGE_TYPE.CHANGED);
-                }
-                mergeEvents.add(event);
-            }
-            return mergeEvents;
-        }
-
-        /**
-         * @param locator
-         * @param records
-         * @return a list of change events that will result from removing my
-         *         _tags from records.
-         */
-        public List<TaglibChangedEvent> createRemove(
-                final AbstractFaceletTaglibLocator locator,
-                final Map<String, JSFResourceBasedTagRecord> records)
-        {
-            final Map<String, JSFResourceBasedTagRecord> newRecords = build();
-            final List<TaglibChangedEvent> mergeEvents = new ArrayList<TaglibChangedEvent>();
-            for (final Map.Entry<String, JSFResourceBasedTagRecord> entry : newRecords
-                    .entrySet())
-            {
-                TaglibChangedEvent event = null;
-                final JSFResourceBasedTagRecord oldRecord = records.get(entry
-                        .getKey());
-                if (oldRecord != null)
-                {
-                    final JSFResourceBasedTagRecord record = entry.getValue();
-                    if (record == WHOLE_LIB_RECORD)
-                    {
-                        event = new TaglibChangedEvent(locator, oldRecord,
-                                null, CHANGE_TYPE.REMOVED);
-                    } else
-                    {
-                        final JSFResourceBasedTagRecord newRecord = oldRecord
-                                .removeTags(entry.getValue()._tags);
-                        event = new TaglibChangedEvent(locator, oldRecord,
-                                newRecord, CHANGE_TYPE.CHANGED);
-                    }
-                }
-                if (event != null)
-                {
-                    mergeEvents.add(event);
-                }
-            }
-            return mergeEvents;
-        }
-
-        /**
-         * @param events
-         * @param withThese
-         * @return a new merged map that contains withThese plus everything
-         *         here.
-         */
-        public Map<String, JSFResourceBasedTagRecord> merge(
-                final List<TaglibChangedEvent> events,
-                final Map<String, JSFResourceBasedTagRecord> withThese)
-        {
-            final Map<String, JSFResourceBasedTagRecord> newMap = new HashMap<String, JSFResourceBasedTagRecord>(
-                    withThese);
-            for (final TaglibChangedEvent event : events)
-            {
-                switch (event.getChangeType())
-                {
-                    case ADDED:
-                    case CHANGED:
-                    {
-                        final IFaceletTagRecord newRecord = event.getNewValue();
-                        // doubles as null check
-                        if (newRecord instanceof JSFResourceBasedTagRecord)
-                        {
-                            newMap.put(newRecord.getURI(),
-                                    (JSFResourceBasedTagRecord) newRecord);
-                        }
-                    }
-                    break;
-                    case REMOVED:
-                    {
-                        final IFaceletTagRecord oldRecord = event.getOldValue();
-                        if (oldRecord != null)
-                        {
-                            newMap.remove(oldRecord.getURI());
-                        }
-                    }
-                    break;
-                }
-            }
-            return newMap;
-        }
-
-        private TagRecordDescriptor createDescriptor(final IJSFResourceFragment resource)
-        {
-            if (resource instanceof IWorkspaceJSFResourceFragment)
-            {
-                if (resource instanceof WorkspaceJSFResourceContainer)
-                {
-                    final IResource res = ((WorkspaceJSFResourceContainer)resource).getResource();
-                    return new WorkspaceTagRecordDescriptor((IFolder) res);
-                }
-                final IResource res = ((IWorkspaceJSFResourceFragment) resource)
-                        .getResource();
-                return new WorkspaceTagRecordDescriptor((IFile) res);
-            } else if (resource instanceof IJarBasedJSFResource)
-            {
-                final URL jarURL = ((IJarBasedJSFResource) resource)
-                        .getJarURL();
-                final File file = JarUtilities.INSTANCE.getFile(jarURL);
-                if (file != null)
-                {
-                    final String absolutePath = file.getAbsolutePath();
-                    final String jarEntryName = ((IJarBasedJSFResource) resource)
-                            .getJarEntryName();
-                    return new JarTagRecordDescriptor(new Path(absolutePath),
-                            jarEntryName);
-                }
-            }
-            return null;
-        }
-
-        private static class LibEntry
-        {
-            private final TagRecordDescriptor _descriptor;
-            private final List<FaceletTaglibTag> _tags;
-
-            /**
-             * @param descriptor
-             */
-            public LibEntry(final TagRecordDescriptor descriptor)
-            {
-                super();
-                _descriptor = descriptor;
-                _tags = new ArrayList<FaceletTaglibTag>();
-            }
-
-            public TagRecordDescriptor getDescriptor()
-            {
-                return _descriptor;
-            }
-
-            public void addTag(final FaceletTaglibTag tag)
-            {
-                _tags.add(tag);
-            }
-
-            public List<FaceletTaglibTag> getTags()
-            {
-                return Collections.unmodifiableList(_tags);
-            }
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/JarFileFaceletTaglibLocator.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/JarFileFaceletTaglibLocator.java
deleted file mode 100644
index 01677e1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/JarFileFaceletTaglibLocator.java
+++ /dev/null
@@ -1,308 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.jar.JarEntry;
-import java.util.jar.JarFile;
-import java.util.regex.Pattern;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.jst.jsf.common.internal.finder.AbstractMatcher.AlwaysMatcher;
-import org.eclipse.jst.jsf.common.internal.finder.AbstractMatcher.IMatcher;
-import org.eclipse.jst.jsf.common.internal.finder.VisitorMatcher;
-import org.eclipse.jst.jsf.common.internal.finder.acceptor.JarEntryMatchingAcceptor;
-import org.eclipse.jst.jsf.common.internal.finder.matcher.TaglibJarEntryFinder;
-import org.eclipse.jst.jsf.common.internal.resource.ClasspathJarFile;
-import org.eclipse.jst.jsf.common.internal.resource.DefaultJarLocator;
-import org.eclipse.jst.jsf.common.internal.resource.IJarLocator;
-import org.eclipse.jst.jsf.common.internal.resource.IJarLocator.JarChangeEvent;
-import org.eclipse.jst.jsf.common.internal.resource.IJarLocator.JarChangeListener;
-import org.eclipse.jst.jsf.common.internal.resource.JavaCoreMediator;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.facelet.core.internal.FaceletCorePlugin;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.IFaceletTagRecord.JarTagRecordDescriptor;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.Listener.TaglibChangedEvent;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.Listener.TaglibChangedEvent.CHANGE_TYPE;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglib;
-
-/**
- * A locator that finds Facelet taglibs in jars on the classpath
- * 
- * @author cbateman
- * 
- */
-public class JarFileFaceletTaglibLocator extends AbstractFaceletTaglibLocator
-{
-    /**
-     * Default taglib finder that looks in meta-inf
-     */
-    public static final TaglibJarEntryFinder _taglibMetaInfFinder = new TaglibJarEntryFinder(
-            Pattern.compile("META-INF/.*\\.taglib\\.xml")); //$NON-NLS-1$
-    /**
-     * Default finder that looks in the glassfish package.
-     */
-    public static final TaglibJarEntryFinder _taglibGlassfishFinder = new TaglibJarEntryFinder(
-            Pattern.compile("com/sun/faces/metadata/taglib/.*\\.taglib\\.xml")); //$NON-NLS-1$
-    private static final List<IMatcher> MATCHERS;
-    static
-    {
-        final List<IMatcher> matchers = new ArrayList<IMatcher>();
-        matchers.add(_taglibGlassfishFinder);
-        matchers.add(_taglibMetaInfFinder);
-        MATCHERS = Collections.unmodifiableList(matchers);
-    }
-    private static final String DISPLAYNAME = Messages.JarFileFaceletTaglibLocator_0;
-    private static final String ID = JarFileFaceletTaglibLocator.class
-            .getCanonicalName();
-    private final TagRecordFactory _factory;
-    private final Map<String, IFaceletTagRecord> _records;
-    private final IJarLocator _locator;
-    private final List<IMatcher> _jarEntryMatchers;
-
-    /**
-     * @param factory
-     */
-    public JarFileFaceletTaglibLocator(final TagRecordFactory factory)
-    {
-        this(factory, new DefaultJarLocator(
-                Collections.singletonList(new AlwaysMatcher()),
-                new JavaCoreMediator()));
-    }
-
-    /**
-     * @param factory
-     * @param jarProvider
-     */
-    public JarFileFaceletTaglibLocator(final TagRecordFactory factory,
-            final IJarLocator jarProvider)
-    {
-        this(factory, jarProvider, MATCHERS);
-    }
-
-    /**
-     * @param factory
-     * @param jarProvider
-     * @param jarEntryMatchers
-     */
-    public JarFileFaceletTaglibLocator(final TagRecordFactory factory,
-            final IJarLocator jarProvider, final List<IMatcher>  jarEntryMatchers)
-    {    
-        super(ID, DISPLAYNAME);
-        _factory = factory;
-        _records = new HashMap<String, IFaceletTagRecord>();
-        _locator = jarProvider;
-        _jarEntryMatchers = jarEntryMatchers;
-    }
-
-    @Override
-    public void start(final IProject project)
-    {
-        _locator.start(project);
-        final List<LibJarEntry> tagLibsFound = new ArrayList<LibJarEntry>();
-        final Collection<? extends ClasspathJarFile> jars = _locator
-                .getJars(project);
-        for (final ClasspathJarFile cpJarFile : jars)
-        {
-            final JarFile jarFile = cpJarFile.getJarFile();
-            if (jarFile != null)
-            {
-                tagLibsFound.addAll(processJar(cpJarFile, _jarEntryMatchers));
-            }
-        }
-        for (final LibJarEntry jarEntry : tagLibsFound)
-        {
-            final IFaceletTagRecord record = _factory.createRecords(jarEntry
-                    .getTaglib(), new JarTagRecordDescriptor(
-                    jarEntry.getPath(), jarEntry.getEntryName()));
-            if (record != null)
-            {
-                _records.put(record.getURI(), record);
-            }
-        }
-        _locator.addListener(new JarChangeListener()
-        {
-            @Override
-            public void changed(final JarChangeEvent event)
-            {
-                switch (event.getType())
-                {
-                    case JAR_ADDED:
-                    {
-                        final ClasspathJarFile jar = event.getJar();
-                        final List<LibJarEntry> foundLibs = processJar(jar, _jarEntryMatchers);
-                        for (final LibJarEntry lib : foundLibs)
-                        {
-                            final IFaceletTagRecord newRecord = _factory.createRecords(
-                                    lib.getTaglib(),
-                                    new JarTagRecordDescriptor(lib
-                                            .getPath(), lib
-                                            .getEntryName()));
-                            _records.put(newRecord.getURI(), newRecord);
-                            fireChangeEvent(new TaglibChangedEvent(
-                                    JarFileFaceletTaglibLocator.this, null,
-                                    newRecord,
-                                    CHANGE_TYPE.ADDED));
-                        }
-                    }
-                    break;
-                    case JAR_REMOVED:
-                    {
-                        final ClasspathJarFile jar = event.getJar();
-                        final List<IFaceletTagRecord>  removeRecords = 
-                            new ArrayList<IFaceletTagRecord>();
-                        for (final Map.Entry<String, IFaceletTagRecord> entry : _records
-                                .entrySet())
-                        {
-                            if (entry.getValue().getDescriptor()
-                                    .getPath().equals(jar.getPath()))
-                            {
-                                removeRecords.add(entry.getValue());
-                            }
-                        }
-                        
-                        for (final IFaceletTagRecord removeMe : removeRecords)
-                        {
-                            _records.remove(removeMe);
-                            fireChangeEvent(new TaglibChangedEvent(
-                                    JarFileFaceletTaglibLocator.this,
-                                    removeMe, null,
-                                    CHANGE_TYPE.REMOVED));
-                        }
-                    }
-                    break;
-                }
-            }
-        });
-        super.start(project);
-    }
-
-    @Override
-    public void stop()
-    {
-        _locator.stop();
-        super.stop();
-    }
-
-    @Override
-    public Map<String, ? extends IFaceletTagRecord> doLocate(
-            final IProject project)
-    {
-        return Collections.unmodifiableMap(_records);
-    }
-
-    /**
-     * @param entry
-     * @param defaultDtdStream
-     * @throws Exception
-     */
-    private static List<LibJarEntry> processJar(final ClasspathJarFile cpJarFile,
-            final List<IMatcher> jarEntryMatchers)
-    {
-        final List<LibJarEntry> tagLibsFound = new ArrayList<LibJarEntry>();
-        final JarFile jarFile = cpJarFile.getJarFile();
-        try
-        {
-            if (jarFile != null)
-            {
-                final JarEntryMatchingAcceptor acceptor = new JarEntryMatchingAcceptor();
-                final VisitorMatcher<JarFile, JarEntry, String> matcher = new VisitorMatcher<JarFile, JarEntry, String>(
-                        "", "", acceptor, jarEntryMatchers); //$NON-NLS-1$//$NON-NLS-2$
-                final Collection<? extends JarEntry> matchingEntries = matcher
-                        .find(jarFile);
-                for (final JarEntry jarEntry : matchingEntries)
-                {
-                    InputStream is = null;
-                    try
-                    {
-                        is = jarFile.getInputStream(jarEntry);
-                        final String name = jarEntry.getName();
-                        final TagModelLoader loader = new TagModelLoader(name);
-                        loader.loadFromInputStream(is);
-                        final FaceletTaglib tagLib = loader.getTaglib();
-                        if (tagLib != null)
-                        {
-                            tagLibsFound.add(new LibJarEntry(tagLib, cpJarFile
-                                    .getPath(), name));
-                        }
-                    } catch (final Exception e)
-                    {
-                        FaceletCorePlugin.log(
-                                "Error initializing facelet registry entry", //$NON-NLS-1$
-                                e);
-                    } finally
-                    {
-                        if (is != null)
-                        {
-                            // is.close();
-                        }
-                    }
-                }
-            }
-        } catch (final Exception e)
-        {
-            JSFCorePlugin.log(e,
-                    "While locating jar based facelet tag libraries"); //$NON-NLS-1$
-        } finally
-        {
-            if (jarFile != null)
-            {
-                try
-                {
-                    jarFile.close();
-                } catch (final IOException ioe)
-                {
-                    FaceletCorePlugin.log("Error closing jar file", ioe); //$NON-NLS-1$
-                }
-            }
-        }
-        return tagLibsFound;
-    }
-
-    private static class LibJarEntry
-    {
-        private final FaceletTaglib _taglib;
-        private final String _entryName;
-        private final IPath _iPath;
-
-        public LibJarEntry(final FaceletTaglib taglib, final IPath iPath,
-                final String entryName)
-        {
-            super();
-            _taglib = taglib;
-            _iPath = iPath;
-            _entryName = entryName;
-        }
-
-        public FaceletTaglib getTaglib()
-        {
-            return _taglib;
-        }
-
-        public String getEntryName()
-        {
-            return _entryName;
-        }
-
-        public IPath getPath()
-        {
-            return _iPath;
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/LibraryClassBasedTagRecord.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/LibraryClassBasedTagRecord.java
deleted file mode 100644
index 4997017..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/LibraryClassBasedTagRecord.java
+++ /dev/null
@@ -1,538 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Map;
-import java.util.concurrent.atomic.AtomicBoolean;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jem.internal.proxy.core.IBeanProxy;
-import org.eclipse.jem.internal.proxy.core.IBeanTypeProxy;
-import org.eclipse.jem.internal.proxy.core.IStringBeanProxy;
-import org.eclipse.jem.internal.proxy.core.ProxyFactoryRegistry;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.core.internal.jem.BeanProxyUtil;
-import org.eclipse.jst.jsf.core.internal.jem.BeanProxyUtil.BeanProxyWrapper;
-import org.eclipse.jst.jsf.core.internal.jem.BeanProxyUtil.ProxyException;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTag;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletLibraryClassTagLib;
-
-/**
- * @author cbateman
- * 
- */
-/* package */class LibraryClassBasedTagRecord extends FaceletTagRecord
-{
-//    private static final String             METHOD_NAME_GET_VALUE                                                     = "getValue";                                                           //$NON-NLS-1$
-//    private static final String             METHOD_NAME_GET_KEY                                                       = "getKey";                                                             //$NON-NLS-1$
-//    private static final String             METHOD_NAME_HAS_NEXT                                                      = "hasNext";                                                            //$NON-NLS-1$
-//    private static final String             METHOD_NAME_NEXT                                                          = "next";                                                               //$NON-NLS-1$
-//    private static final String             METHOD_NAME_ITERATOR                                                      = "iterator";                                                           //$NON-NLS-1$
-//    private static final String             METHOD_NAME_ENTRY_SET                                                     = "entrySet";                                                           //$NON-NLS-1$
-//    private static final String             PROPERTY_NAME_FACTORIES                                                   = "factories";                                                          //$NON-NLS-1$
-//    private static final String             QUALIFIED_CLASS_NAME__COM_SUN_FACELETS_TAG_ABSTRACT_TAG_LIBRARY           = "com.sun.facelets.tag.AbstractTagLibrary";                            //$NON-NLS-1$
-//    private static final String             QUALIFIED_CLASS_NAME_JAVA_UTIL_MAP                                        = "java.util.Map";                                                      //$NON-NLS-1$
-//
-//    private static final String             COM_SUN_FACELETS_TAG_ABSTRACT_TAG_LIBRARY$_HANDLER_FACTORY                = "com.sun.facelets.tag.AbstractTagLibrary$HandlerFactory";             //$NON-NLS-1$
-//    private static final String             COM_SUN_FACELETS_TAG_ABSTRACT_TAG_LIBRARY$_USER_CONVERTER_HANDLER_FACTORY = "com.sun.facelets.tag.AbstractTagLibrary$UserConverterHandlerFactory"; //$NON-NLS-1$
-//    private static final String             COM_SUN_FACELETS_TAG_ABSTRACT_TAG_LIBRARY$_CONVERTER_HANDLER_FACTORY      = "com.sun.facelets.tag.AbstractTagLibrary$ConverterHandlerFactory";    //$NON-NLS-1$
-//    private static final String             COM_SUN_FACELETS_TAG_ABSTRACT_TAG_LIBRARY$_USER_VALIDATOR_HANDLER_FACTORY = "com.sun.facelets.tag.AbstractTagLibrary$UserValidatorHandlerFactory"; //$NON-NLS-1$
-//    private static final String             COM_SUN_FACELETS_TAG_ABSTRACT_TAG_LIBRARY$_VALIDATOR_HANDLER_FACTORY      = "com.sun.facelets.tag.AbstractTagLibrary$ValidatorHandlerFactory";    //$NON-NLS-1$
-//    private static final String             COM_SUN_FACELETS_TAG_ABSTRACT_TAG_LIBRARY$_USER_COMPONENT_HANDLER_FACTORY = "com.sun.facelets.tag.AbstractTagLibrary$UserComponentHandlerFactory"; //$NON-NLS-1$
-//    private static final String             COM_SUN_FACELETS_TAG_ABSTRACT_TAG_LIBRARY$_COMPONENT_HANDLER_FACTORY      = "com.sun.facelets.tag.AbstractTagLibrary$ComponentHandlerFactory";    //$NON-NLS-1$
-//
-//    private static final String             FIELD_NAME_CONVERTER_ID                                                   = "converterId";                                                        //$NON-NLS-1$
-//    private static final String             FIELD_NAME_VALIDATOR_ID                                                   = "validatorId";                                                        //$NON-NLS-1$
-//    private static final String             FIELD_NAME_RENDER_TYPE                                                    = "renderType";                                                         //$NON-NLS-1$
-//    private static final String             FIELD_NAME_COMPONENT_TYPE                                                 = "componentType";                                                      //$NON-NLS-1$
-
-    /**
-     * 
-     */
-    private static final long               serialVersionUID                                                          = 4174629773250721041L;
-    private static final String             STATIC_MEMBER_NAMESPACE                                                   = "Namespace";                                                          //$NON-NLS-1$
-    private static final String             METHOD_NAME_GET_NAMESPACE                                                 = "getNamespace";                                                       //$NON-NLS-1$
-
-    private final IProject _project;
-    private final FaceletLibraryClassTagLib _model;
-    private final ProxyFactoryRegistry      _registry;
-    private final AtomicBoolean             _isInitialized                                                            = new AtomicBoolean(
-                                                                                                                              false);
-
-    private String                          _uri;
-    private BeanProxyWrapper                _classTypeWrapper;
-    private Map<String, FaceletTaglibTag>            _tags;
-
-    /**
-     * @param registry
-     * @param model
-     * @param project 
-     * @param descriptor 
-     */
-    public LibraryClassBasedTagRecord(final ProxyFactoryRegistry registry,
-            final FaceletLibraryClassTagLib model, final IProject project, TagRecordDescriptor descriptor)
-    {
-        super(descriptor);
-        _registry = registry;
-        _model = model;
-        _project = project;
-    }
-
-    public void initURI() throws CoreException
-    {
-        if (_isInitialized.get())
-        {
-            throw new CoreException(
-                    new Status(
-                            IStatus.ERROR,
-                            JSFCorePlugin.PLUGIN_ID,
-                            "Cannot initURI once the library is initialized for: " + _model.getLibraryClass())); //$NON-NLS-1$
-        }
-
-        final IBeanTypeProxy libFactoryTypeProxy = _registry
-                .getBeanTypeProxyFactory().getBeanTypeProxy(
-                        _model.getLibraryClass());
-
-        if (libFactoryTypeProxy == null)
-        {
-            throw new CoreException(new Status(IStatus.ERROR,
-                    JSFCorePlugin.PLUGIN_ID,
-                    "Couldn't find type proxy for " + _model.getLibraryClass())); //$NON-NLS-1$
-        }
-
-        // TODO: wrap in try per the Glassfish patch
-        _classTypeWrapper = new BeanProxyWrapper(_project, libFactoryTypeProxy);
-
-        try
-        {
-            _classTypeWrapper.init();
-        }
-        catch (final ProxyException e)
-        {
-            throw new CoreException(new Status(IStatus.ERROR,
-                    JSFCorePlugin.PLUGIN_ID,
-                    "Couldn't load class: " + _model.getLibraryClass(), e)); //$NON-NLS-1$
-        }
-
-        final String namespace = resolveNS(_classTypeWrapper);
-        System.out.println(namespace);
-
-        if (namespace == null)
-        {
-            throw new CoreException(new Status(IStatus.ERROR,
-                    JSFCorePlugin.PLUGIN_ID,
-                    "Couldn't load uri: " + _model.getLibraryClass())); //$NON-NLS-1$
-
-        }
-        _uri = namespace;
-    }
-
-    @Override
-    public synchronized FaceletTaglibTag getTag(final String name)
-    {
-//        initializeIfNecessary();
-        return _tags.get(name);
-    }
-
-    @Override
-    public synchronized Collection<? extends FaceletTaglibTag> getTags()
-    {
-//        initializeIfNecessary();
-        return Collections.unmodifiableCollection(_tags.values());
-    }
-
-//    private void initializeIfNecessary()
-//    {
-//        if (_isInitialized.compareAndSet(false, true))
-//        {
-//            if (_tags == null)
-//            {
-//                _tags = resolveTags();
-//            }
-//        }
-//    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see
-     * org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.FaceletTagRecord
-     * #getURI()
-     */
-    @Override
-    public String getURI()
-    {
-        return _uri;
-    }
-
-//    private Map<String, FaceletTaglibTag> resolveTags()
-//    {
-//        final Map<String, FaceletTaglibTag> tags = new HashMap<String, FaceletTaglibTag>();
-//
-//        // if the tag factory is a child of AbstractTagFactory, then we
-//        // can try to get our hands on its private parts ...
-//        final IBeanTypeProxy mapTypeProxy = _registry.getBeanTypeProxyFactory()
-//                .getBeanTypeProxy(QUALIFIED_CLASS_NAME_JAVA_UTIL_MAP);
-//        final IBeanTypeProxy componentFactoryTypeProxy = _registry
-//                .getBeanTypeProxyFactory()
-//                .getBeanTypeProxy(
-//                        QUALIFIED_CLASS_NAME__COM_SUN_FACELETS_TAG_ABSTRACT_TAG_LIBRARY);
-//
-//        if (mapTypeProxy != null && componentFactoryTypeProxy != null)
-//        {
-//            final IFieldProxy fieldProxy = componentFactoryTypeProxy
-//                    .getDeclaredFieldProxy(PROPERTY_NAME_FACTORIES);
-//
-//            if (fieldProxy != null)
-//            {
-//                if (fieldProxy.getFieldType().isKindOf(mapTypeProxy))
-//                {
-//                    IBeanProxy factories = null;
-//
-//                    try
-//                    {
-//                        // need to turn off security checking on the private
-//                        // field
-//                        fieldProxy.setAccessible(true);
-//                        factories = fieldProxy.get(_classTypeWrapper
-//                                .getInstance());
-//                    }
-//                    catch (final ThrowableProxy e)
-//                    {
-//                        FaceletCorePlugin.log(
-//                                "Error getting factories from bean instance", //$NON-NLS-1$
-//                                e);
-//                    }
-//
-//                    if (factories != null)
-//                    {
-//                        final IMethodProxy entrySetMethod = fieldProxy
-//                                .getFieldType().getMethodProxy(
-//                                        METHOD_NAME_ENTRY_SET);
-//                        if (entrySetMethod != null)
-//                        {
-//                            try
-//                            {
-//                                entrySetMethod.setAccessible(true);
-//                                final IBeanProxy entrySetProxy = entrySetMethod
-//                                        .invoke(factories);
-//
-//                                if (entrySetProxy != null)
-//                                {
-//                                    final IMethodProxy iteratorMethod = entrySetProxy
-//                                            .getTypeProxy().getMethodProxy(
-//                                                    METHOD_NAME_ITERATOR);
-//                                    iteratorMethod.setAccessible(true);
-//                                    final IBeanProxy iteratorProxy = iteratorMethod
-//                                            .invoke(entrySetProxy);
-//
-//                                    if (iteratorProxy != null)
-//                                    {
-//                                        final IMethodProxy nextMethod = iteratorProxy
-//                                                .getTypeProxy().getMethodProxy(
-//                                                        METHOD_NAME_NEXT);
-//                                        nextMethod.setAccessible(true);
-//                                        final IMethodProxy hasNextMethod = iteratorProxy
-//                                                .getTypeProxy().getMethodProxy(
-//                                                        METHOD_NAME_HAS_NEXT);
-//                                        hasNextMethod.setAccessible(true);
-//
-//                                        while (((IBooleanBeanProxy) hasNextMethod
-//                                                .invoke(iteratorProxy))
-//                                                .booleanValue())
-//                                        {
-//                                            final IBeanProxy entryProxy = nextMethod
-//                                                    .invoke(iteratorProxy);
-//                                            final IMethodProxy getKeyProxy = entryProxy
-//                                                    .getTypeProxy()
-//                                                    .getMethodProxy(
-//                                                            METHOD_NAME_GET_KEY);
-//                                            final IMethodProxy getValueProxy = entryProxy
-//                                                    .getTypeProxy()
-//                                                    .getMethodProxy(
-//                                                            METHOD_NAME_GET_VALUE);
-//                                            if (getKeyProxy != null
-//                                                    && getValueProxy != null)
-//                                            {
-//                                                getKeyProxy.setAccessible(true);
-//                                                final IBeanProxy key = getKeyProxy
-//                                                        .invoke(entryProxy);
-//
-//                                                if (key instanceof IStringBeanProxy)
-//                                                {
-//                                                    final String name = ((IStringBeanProxy) key)
-//                                                            .stringValue();
-//                                                    getValueProxy
-//                                                            .setAccessible(true);
-//                                                    final IBeanProxy value = getValueProxy
-//                                                            .invoke(entryProxy);
-//
-//                                                    if (value != null)
-//                                                    {
-//                                                        final FaceletTaglibTag tagDefn = createTagDefn(
-//                                                                name,
-//                                                                value);
-//                                                        if (tagDefn != null)
-//                                                        {
-//                                                            tags.put(name,
-//                                                                    tagDefn);
-//                                                        }
-//                                                    }
-//                                                }
-//                                            }
-//                                        }
-//                                    }
-//                                }
-//                            }
-//                            catch (final ThrowableProxy e)
-//                            {
-//                                FaceletCorePlugin.log(
-//                                        "Error invoking entrySet", e); //$NON-NLS-1$
-//                            }
-//                        }
-//                    }
-//
-//                }
-//            }
-//        }
-//        return tags;
-//    }
-
-//    private FaceletTaglibTag createTagDefn(final String name,
-//            final IBeanProxy handlerValueProxy)
-    {
-//        final IBeanTypeProxy handlerTypeProxy = handlerValueProxy.getTypeProxy();
-//        final FaceletTaglibFactory TAGDEFN_FACTORY = FaceletTaglibFactory.eINSTANCE;
-//
-//        final IBeanTypeProxy componentHandlerFactory = _registry
-//                .getBeanTypeProxyFactory()
-//                .getBeanTypeProxy(
-//                        COM_SUN_FACELETS_TAG_ABSTRACT_TAG_LIBRARY$_COMPONENT_HANDLER_FACTORY);
-//        final IBeanTypeProxy userComponentHandlerFactory = _registry
-//                .getBeanTypeProxyFactory()
-//                .getBeanTypeProxy(
-//                        COM_SUN_FACELETS_TAG_ABSTRACT_TAG_LIBRARY$_USER_COMPONENT_HANDLER_FACTORY);
-//        final IBeanTypeProxy validatorHandlerFactory = _registry
-//                .getBeanTypeProxyFactory()
-//                .getBeanTypeProxy(
-//                        COM_SUN_FACELETS_TAG_ABSTRACT_TAG_LIBRARY$_VALIDATOR_HANDLER_FACTORY);
-//        final IBeanTypeProxy userValidatorHandlerFactory = _registry
-//                .getBeanTypeProxyFactory()
-//                .getBeanTypeProxy(
-//                        COM_SUN_FACELETS_TAG_ABSTRACT_TAG_LIBRARY$_USER_VALIDATOR_HANDLER_FACTORY);
-//        final IBeanTypeProxy converterHandlerFactory = _registry
-//                .getBeanTypeProxyFactory()
-//                .getBeanTypeProxy(
-//                        COM_SUN_FACELETS_TAG_ABSTRACT_TAG_LIBRARY$_CONVERTER_HANDLER_FACTORY);
-//        final IBeanTypeProxy userConverterHandlerFactory = _registry
-//                .getBeanTypeProxyFactory()
-//                .getBeanTypeProxy(
-//                        COM_SUN_FACELETS_TAG_ABSTRACT_TAG_LIBRARY$_USER_CONVERTER_HANDLER_FACTORY);
-//        final IBeanTypeProxy handlerFactory = _registry
-//                .getBeanTypeProxyFactory()
-//                .getBeanTypeProxy(
-//                        COM_SUN_FACELETS_TAG_ABSTRACT_TAG_LIBRARY$_HANDLER_FACTORY);
-//        final IBeanTypeProxy userTagFactory = _registry
-//                .getBeanTypeProxyFactory()
-//                .getBeanTypeProxy(
-//                        COM_SUN_FACELETS_TAG_ABSTRACT_TAG_LIBRARY$_HANDLER_FACTORY);
-//
-//        FaceletTaglibTag tagDefn = null;
-//
-//        if (handlerTypeProxy.isKindOf(componentHandlerFactory)
-//                || handlerTypeProxy.isKindOf(userComponentHandlerFactory))
-//        {
-//            final IFieldProxy componentTypeProxy = handlerTypeProxy
-//                    .getDeclaredFieldProxy(FIELD_NAME_COMPONENT_TYPE);
-//            final IFieldProxy rendererTypeProxy = handlerTypeProxy
-//                    .getDeclaredFieldProxy(FIELD_NAME_RENDER_TYPE);
-//            try
-//            {
-//                if (componentTypeProxy != null)
-//                {
-//                    componentTypeProxy.setAccessible(true);
-//                    rendererTypeProxy.setAccessible(true);
-//                    final IBeanProxy componentType = componentTypeProxy
-//                            .get(handlerValueProxy);
-//                    // final IBeanProxy rendererType = rendererTypeProxy
-//                    // .get(handlerValueProxy);
-//
-//                    // render type is optional, but must have component type
-//                    if (componentType instanceof IStringBeanProxy)
-//                    {
-//                        final String componentTypeValue = getMeaningfulString(((IStringBeanProxy) componentType)
-//                                .stringValue());
-//
-//                        if (componentTypeValue != null)
-//                        {
-//                            final ComponentTagDefn compTagDefn = TAGDEFN_FACTORY
-//                                    .createComponentTagDefn();
-//                            compTagDefn.setComponentType(componentTypeValue);
-//                            // if (rendererType instanceof IStringBeanProxy)
-//                            // {
-//                            // compTagDefn
-//                            // .setRendererType(getMeaningfulString(((
-//                            // IStringBeanProxy) rendererType)
-//                            // .stringValue()));
-//                            // }
-//                            tagDefn = compTagDefn;
-//                        }
-//                    }
-//                }
-//            }
-//            catch (final ThrowableProxy e)
-//            {
-//                FaceletCorePlugin.log("Error get component info", e); //$NON-NLS-1$
-//            }
-//        }
-//        else if (handlerTypeProxy.isKindOf(validatorHandlerFactory)
-//                || handlerTypeProxy.isKindOf(userValidatorHandlerFactory))
-//        {
-//            final IFieldProxy validatorIdProxy = handlerTypeProxy
-//                    .getDeclaredFieldProxy(FIELD_NAME_VALIDATOR_ID);
-//
-//            try
-//            {
-//                if (validatorIdProxy != null)
-//                {
-//                    validatorIdProxy.setAccessible(true);
-//                    final IBeanProxy validatorId = validatorIdProxy
-//                            .get(handlerValueProxy);
-//
-//                    final ValidatorTagDefn valTagDefn = TAGDEFN_FACTORY
-//                            .createValidatorTagDefn();
-//                    tagDefn = valTagDefn;
-//
-//                    if (validatorId instanceof IStringBeanProxy)
-//                    {
-//                        final String validatorIdValue = getMeaningfulString(((IStringBeanProxy) validatorId)
-//                                .stringValue());
-//
-//                        if (validatorIdValue != null)
-//                        {
-//                            valTagDefn.setValidatorId(validatorIdValue);
-//                        }
-//                    }
-//                }
-//            }
-//            catch (final ThrowableProxy e)
-//            {
-//                FaceletCorePlugin.log("Error getting validator info", e); //$NON-NLS-1$
-//            }
-//        }
-//        else if (handlerTypeProxy.isKindOf(converterHandlerFactory)
-//                || handlerTypeProxy.isKindOf(userConverterHandlerFactory))
-//        {
-//            final IFieldProxy converterIdProxy = handlerTypeProxy
-//                    .getDeclaredFieldProxy(FIELD_NAME_CONVERTER_ID);
-//
-//            try
-//            {
-//                if (converterIdProxy != null)
-//                {
-//                    converterIdProxy.setAccessible(true);
-//                    final IBeanProxy converterId = converterIdProxy
-//                            .get(handlerValueProxy);
-//
-//                    final ConverterTagDefn converterTagDefn = TAGDEFN_FACTORY
-//                            .createConverterTagDefn();
-//                    tagDefn = converterTagDefn;
-//
-//                    if (converterId instanceof IStringBeanProxy)
-//                    {
-//                        final String converterIdValue = getMeaningfulString(((IStringBeanProxy) converterId)
-//                                .stringValue());
-//
-//                        if (converterIdValue != null)
-//                        {
-//                            converterTagDefn.setConverterId(converterIdValue);
-//                        }
-//                    }
-//                }
-//            }
-//            catch (final ThrowableProxy e)
-//            {
-//                FaceletCorePlugin.log("Error getting validator info", e); //$NON-NLS-1$
-//            }
-//        }
-//        else if (handlerTypeProxy.isKindOf(handlerFactory)
-//                || handlerTypeProxy.isKindOf(userTagFactory))
-//        {
-//            tagDefn = TAGDEFN_FACTORY.createHandlerTagDefn();
-//        }
-//
-//        if (tagDefn != null)
-//        {
-//            tagDefn.setName(name);
-//        }
-//        return tagDefn;
-    }
-
-//    private String getMeaningfulString(final String value)
-//    {
-//        if (value == null)
-//        {
-//            return null;
-//        }
-//
-//        String retValue = value.trim();
-//
-//        if ("".equals(retValue)) //$NON-NLS-1$
-//        {
-//            retValue = null;
-//        }
-//        return retValue;
-//    }
-
-    private String resolveNS(final BeanProxyWrapper beanProxy)
-    {
-        IBeanProxy resultProxy = null;
-        try
-        {
-            resultProxy = beanProxy.call(METHOD_NAME_GET_NAMESPACE);
-
-            if (resultProxy instanceof IStringBeanProxy)
-            {
-                return ((IStringBeanProxy) resultProxy).stringValue();
-            }
-        }
-        catch (final BeanProxyUtil.ProxyException e)
-        {
-            // fall through
-        }
-
-        return resolveNSAggressively(beanProxy);
-    }
-
-    private String resolveNSAggressively(final BeanProxyWrapper beanProxy)
-    {
-        try
-        {
-            return beanProxy.getStringFieldValue(STATIC_MEMBER_NAMESPACE);
-        }
-        catch (final ProxyException e)
-        {
-            // fall through
-        }
-        return null;
-    }
-
-    public synchronized int getNumTags()
-    {
-//        initializeIfNecessary();
-        return _tags.size();
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/Listener.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/Listener.java
deleted file mode 100644
index 07de09a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/Listener.java
+++ /dev/null
@@ -1,112 +0,0 @@
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib;
-
-import org.eclipse.jst.jsf.common.internal.locator.ILocatorChangeListener;
-
-/**
- * A listener for locator detected tag library changes
- * @author cbateman
- *
- */
-public abstract class Listener implements ILocatorChangeListener
-{
-    /**
-     * Indicates that a tag library has changed
-     * @author cbateman
-     *
-     */
-    public static class TaglibChangedEvent extends LocatorChangeEvent
-    {
-        /**
-         * TODO: what happens if one locator has a namespace collision with
-         * another one?
-         */
-        public enum CHANGE_TYPE
-        {
-            /**
-             * Indicates that the library is new
-             */
-            ADDED, 
-            
-            /**
-             * Indicates that the library was removed.
-             */
-            REMOVED, 
-            
-            /**
-             * Indicates that the library is not new, but it's content
-             * has changed
-             */
-            CHANGED
-        }
-
-        private final TaglibChangedEvent.CHANGE_TYPE       _changeType;
-        private final IFaceletTagRecord _oldValue;
-        private final IFaceletTagRecord _newValue;
-
-        /**
-         * @param source
-         * @param oldValue 
-         * @param newValue 
-         * @param changeType
-         */
-        public TaglibChangedEvent(
-                final AbstractFaceletTaglibLocator source,
-                final IFaceletTagRecord oldValue, 
-                final IFaceletTagRecord newValue,
-                TaglibChangedEvent.CHANGE_TYPE changeType)
-        {
-            super(source);
-            _changeType = changeType;
-            _oldValue = oldValue;
-            _newValue = newValue;
-        }
-
-        /**
-         * 
-         */
-        private static final long serialVersionUID = -4060018031568577836L;
-
-        @Override
-        public AbstractFaceletTaglibLocator getSource()
-        {
-            return (AbstractFaceletTaglibLocator) super.getSource();
-        }
-
-        /**
-         * @return the type of the change
-         */
-        public final TaglibChangedEvent.CHANGE_TYPE getChangeType()
-        {
-            return _changeType;
-        }
-
-        /**
-         * @return the old value. This is null if the event is ADDED
-         */
-        public final IFaceletTagRecord getOldValue()
-        {
-            return _oldValue;
-        }
-        
-        /**
-         * @return the new value.  This is null if the event is REMOVED
-         */
-        public final IFaceletTagRecord getNewValue()
-        {
-            return _newValue;
-        }
-    }
-
- 
-    public final void changed(final LocatorChangeEvent event)
-    {
-        changed((TaglibChangedEvent)event);
-    }
-
-
-    /**
-     * @param event 
-     * 
-     */
-    public abstract void changed(Listener.TaglibChangedEvent event);
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/Messages.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/Messages.java
deleted file mode 100644
index 0ebb73d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/Messages.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * Package NLS manager.
- * @author cbateman
- *
- */
-public class Messages extends NLS
-{
-    private static final String BUNDLE_NAME = "org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.messages"; //$NON-NLS-1$
-    /**
-     * see messages.properties.
-     */
-    public static String ContextParamSpecifiedFaceletTaglibLocator_0;
-    /**
-     * see messages.properties/
-     */
-    public static String JarFileFaceletTaglibLocator_0;
-    static
-    {
-        // initialize resource bundle
-        NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-    }
-
-    private Messages()
-    {
-        // no external instantiation.
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/ProjectTaglibDescriptor.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/ProjectTaglibDescriptor.java
deleted file mode 100644
index cf9d74d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/ProjectTaglibDescriptor.java
+++ /dev/null
@@ -1,200 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.concurrent.atomic.AtomicInteger;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.ISafeRunnable;
-import org.eclipse.core.runtime.SafeRunner;
-import org.eclipse.jst.jsf.common.internal.locator.ILocatorProvider;
-import org.eclipse.jst.jsf.core.internal.tld.IFaceletConstants;
-import org.eclipse.jst.jsf.facelet.core.internal.FaceletCorePlugin;
-
-/**
- * Taglib descriptor for a project.
- * 
- * @author cbateman
- *
- */
-public class ProjectTaglibDescriptor implements IProjectTaglibDescriptor
-{
-    private final AtomicInteger                      _isInitialized = new AtomicInteger(
-                                                                            0);
-    private final IProject                           _project;
-    private final ILocatorProvider<AbstractFaceletTaglibLocator>      _locatorProvider;
-    private final MyChangeListener                   _libChangeListener;
-    private final Map<String, IFaceletTagRecord>     _tagRecords;
-    private final TagRecordFactory _factory;
-    private final AtomicBoolean     _isDisposed = new AtomicBoolean(false);
-    private final DefaultStandardTaglibLocator _defaultTaglibLocator;
-
-    /**
-     * @param project
-     * @param factory 
-     * @param locatorProvider 
-     */
-    public ProjectTaglibDescriptor(final IProject project, final TagRecordFactory factory, 
-            final ILocatorProvider<AbstractFaceletTaglibLocator> locatorProvider)
-    {
-        _project = project;
-        _tagRecords = new HashMap<String, IFaceletTagRecord>();
-        _locatorProvider = locatorProvider;
-        _locatorProvider.initialize();
-        _factory = factory; 
-        _libChangeListener = new MyChangeListener();
-        _defaultTaglibLocator = new DefaultStandardTaglibLocator();
-        _defaultTaglibLocator.start(project);
-    }
-
-    private void initialize()
-    {
-        if (_isInitialized.addAndGet(1) == 1)
-        {
-            synchronized (this)
-            {
-                for (final AbstractFaceletTaglibLocator locator : _locatorProvider.getLocators())
-                {
-                    SafeRunner.run(new ISafeRunnable()
-                    {
-                        public void handleException(final Throwable exception)
-                        {
-                            FaceletCorePlugin
-                                    .log(
-                                            "While locating facelet libraries on project: " + _project.getName(), new Exception(exception)); //$NON-NLS-1$
-                        }
-                        public void run() throws Exception
-                        {
-                            locator.addListener(_libChangeListener);
-                            locator.start(_project);
-                            _tagRecords.putAll(locator.locate(_project));
-                        }
-                    });
-                }
-                // ensure that we add the standard tag libraries if we don't find them 
-                // on the classpath.  The spec doesn't require that taglib's are
-                // included in a JSF impl for these
-                ensureStandardLibraries(_project);
-            }
-        }
-    }
-
-    private void ensureStandardLibraries(final IProject project)
-    {
-        final Map<String, ? extends IFaceletTagRecord>  defaultRecords = _defaultTaglibLocator.locate(project);
-        for (final String uri : IFaceletConstants.ALL_FACELET_TAGLIBS)
-        {
-            if (!_tagRecords.containsKey(uri))
-            {
-                IFaceletTagRecord faceletTagRecord = defaultRecords.get(uri);
-                if (faceletTagRecord != null)
-                {
-                    _tagRecords.put(uri, faceletTagRecord);
-                }
-                else
-                {
-                    FaceletCorePlugin.log("Could not find taglib for uri: "+uri, new Exception()); //$NON-NLS-1$
-                }
-            }
-        }
-    }
-
-    public Collection<? extends IFaceletTagRecord> getTagLibraries()
-    {
-        initialize();
-        return Collections.unmodifiableCollection(_tagRecords.values());
-    }
-
-    void maybeLog(final Exception e)
-    {
-        if (_isInitialized.get() <= 1)
-        {
-            FaceletCorePlugin.log("Failed initializing taglib descriptor", e); //$NON-NLS-1$
-        }
-    }
-
-    public IFaceletTagRecord getTagLibrary(final String uri)
-    {
-        initialize();
-        return _tagRecords.get(uri);
-    }
-
-    public void addListener(final Listener listener)
-    {
-        for (final AbstractFaceletTaglibLocator locator : _locatorProvider.getLocators())
-        {
-            locator.addListener(listener);
-        }
-    }
-
-    public void removeListener(final Listener listener)
-    {
-        for (final AbstractFaceletTaglibLocator locator : _locatorProvider.getLocators())
-        {
-            locator.removeListener(listener);
-        }
-    }
-
-    public void checkpoint()
-    {
-        // do nothing
-    }
-
-    public void destroy()
-    {
-        // call dispose;  there is no persistent data to cleanup.
-        dispose();
-    }
-
-    public void dispose()
-    {
-        if (_isDisposed.compareAndSet(false, true))
-        {
-            for (final AbstractFaceletTaglibLocator locator : _locatorProvider.getLocators())
-            {
-                locator.stop();
-            }
-            _factory.dispose();
-        }
-    }
-
-    public boolean isDisposed()
-    {
-        return _isDisposed.get();
-    }
-
-    private class MyChangeListener extends Listener
-    {
-        @Override
-        public void changed(final TaglibChangedEvent event)
-        {
-            switch (event.getChangeType())
-            {
-                case ADDED:
-                    _tagRecords.put(event.getNewValue().getURI(), event
-                            .getNewValue());
-                break;
-                case CHANGED:
-                    _tagRecords.put(event.getNewValue().getURI(), event
-                            .getNewValue());
-                break;
-                case REMOVED:
-                    _tagRecords.remove(event.getOldValue());
-                break;
-            }
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/TagModelLoader.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/TagModelLoader.java
deleted file mode 100644
index 2ec287d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/TagModelLoader.java
+++ /dev/null
@@ -1,239 +0,0 @@
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.net.URISyntaxException;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.runtime.URIUtil;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.resource.ContentHandler;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.resource.URIConverter;
-import org.eclipse.emf.ecore.resource.URIHandler;
-import org.eclipse.emf.ecore.resource.impl.ExtensibleURIConverterImpl;
-import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
-import org.eclipse.emf.ecore.resource.impl.URIHandlerImpl;
-import org.eclipse.emf.ecore.util.BasicExtendedMetaData;
-import org.eclipse.emf.ecore.util.ExtendedMetaData;
-import org.eclipse.emf.ecore.xmi.XMLResource;
-import org.eclipse.jst.jsf.facelet.core.internal.FaceletCorePlugin;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.DocumentRoot;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglib;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.util.FaceletTaglibResourceFactoryImpl;
-import org.eclipse.wst.xml.core.internal.XMLCorePlugin;
-import org.eclipse.wst.xml.core.internal.catalog.provisional.ICatalog;
-import org.eclipse.wst.xml.core.internal.catalog.provisional.ICatalogEntry;
-import org.eclipse.wst.xml.core.internal.catalog.provisional.INextCatalog;
-
-/**
- * Loads the facelet taglib file model using EMF.
- * 
- * @author cbateman
- * 
- */
-public class TagModelLoader
-{
-    private final ResourceSetImpl _resSet;
-    private final String _resourceUri;
-    private DocumentRoot _docRoot;
-    private FaceletTaglib _faceletTaglib;
-    private final static List<URIHandler> DEFAULT_URI_HANDLERS;
-    static
-    {
-        final List<URIHandler> handlers = new ArrayList<URIHandler>();
-        final URIHandler handleFacelet = new DefaultFaceletURIHandler();
-        handlers.add(handleFacelet);
-        handlers.addAll(URIHandler.DEFAULT_HANDLERS);
-        DEFAULT_URI_HANDLERS = handlers;
-    }
-
-    /**
-     * @param resourceUri
-     */
-    public TagModelLoader(final String resourceUri)
-    {
-        this(resourceUri, new ExtensibleURIConverterImpl(DEFAULT_URI_HANDLERS,
-                ContentHandler.Registry.INSTANCE.contentHandlers()));
-    }
-
-    /**
-     * @param resourceUri
-     * @param uriConverter
-     */
-    public TagModelLoader(final String resourceUri,
-            final URIConverter uriConverter)
-    {
-        _resourceUri = resourceUri;
-        _resSet = new ResourceSetImpl();
-        _resSet.getPackageRegistry().put("http://java.sun.com/xml/ns/javaee", //$NON-NLS-1$
-                FaceletTaglibPackage.eINSTANCE);
-        _resSet.getPackageRegistry().put(
-                "http://java.sun.com/xml/ns/javaee/web-facelettaglibrary.xsd", //$NON-NLS-1$
-                FaceletTaglibPackage.eINSTANCE);
-        _resSet.setURIConverter(uriConverter);
-        final ExtendedMetaData extendedMetaData = new BasicExtendedMetaData(
-                _resSet.getPackageRegistry());
-        _resSet.getLoadOptions().put(XMLResource.OPTION_EXTENDED_META_DATA,
-                extendedMetaData);
-        _resSet.getResourceFactoryRegistry().getExtensionToFactoryMap()
-                .put("xml", new FaceletTaglibResourceFactoryImpl()); //$NON-NLS-1$
-    }
-
-    /**
-     * @param is
-     * @throws Exception
-     */
-    public void loadFromInputStream(final InputStream is) throws Exception
-    {
-        final Resource res = _resSet.createResource(URI
-                .createFileURI(_resourceUri));
-        if (res != null)
-        {
-            res.load(is, Collections.EMPTY_MAP);
-            final EObject eObject = res.getContents().get(0);
-            _docRoot = (DocumentRoot) eObject;
-            _faceletTaglib = _docRoot.getFaceletTaglib();
-        } else
-        {
-            // This is often caused if the extension of the file pointed to
-            // by _resourceUri wasn't initialized in extensionToFactoryMap.
-            throw new IllegalArgumentException("Could not create Resource"); //$NON-NLS-1$
-        }
-    }
-
-    /**
-     * @param os
-     * @throws Exception
-     */
-    public void save(final OutputStream os) throws Exception
-    {
-        final Resource res = _resSet.createResource(URI
-                .createFileURI(_resourceUri));
-        if (res != null)
-        {
-            res.getContents().add(_docRoot);
-            res.save(os, Collections.EMPTY_MAP);
-        } else
-        {
-            throw new IllegalArgumentException("Could not create Resource"); //$NON-NLS-1$
-        }
-    }
-
-    /**
-     * @param faceletTaglib
-     */
-    public final void setTaglib(final FaceletTaglib faceletTaglib)
-    {
-        _faceletTaglib = faceletTaglib;
-    }
-
-    /**
-     * @param docRoot
-     */
-    public final void setDocRoot(final DocumentRoot docRoot)
-    {
-        _docRoot = docRoot;
-    }
-
-    /**
-     * @return the taglib or null if none has been loaded.
-     */
-    public FaceletTaglib getTaglib()
-    {
-        return _faceletTaglib;
-    }
-
-    /**
-     * @return the doc root or null if none has been loaded.
-     */
-    public DocumentRoot getDocRoot()
-    {
-        return _docRoot;
-    }
-
-    /**
-     * Handles facelet taglib dtd resolver requests
-     * 
-     */
-    private static final class DefaultFaceletURIHandler extends URIHandlerImpl
-    {
-        @Override
-        public boolean canHandle(final URI uri)
-        {
-            return "http://java.sun.com/dtd/facelet-taglib_1_0.dtd".equals(uri.toString()); //$NON-NLS-1$
-        }
-
-        @Override
-        public InputStream createInputStream(final URI uri, final Map<?, ?> options)
-                throws IOException
-        {
-            try
-            {
-                return findFaceletDtdInCatalog();
-            } catch (final URISyntaxException e)
-            {
-                FaceletCorePlugin.log(
-                        "While trying to load facelet dtd from catalog", e); //$NON-NLS-1$
-                // fall through
-            }
-            return null;
-        }
-
-        private InputStream findFaceletDtdInCatalog() throws URISyntaxException, IOException
-        {
-            final ICatalog xmlCatalog = XMLCorePlugin.getDefault()
-                    .getDefaultXMLCatalog();
-            if (xmlCatalog != null)
-            {
-                ICatalog systemCatalog = null;
-                final INextCatalog[] nextCatalogs = xmlCatalog.getNextCatalogs();
-                for (final INextCatalog catalog : nextCatalogs)
-                {
-                    final ICatalog referencedCatalog = catalog
-                            .getReferencedCatalog();
-                    if (referencedCatalog != null)
-                    {
-                        if (XMLCorePlugin.SYSTEM_CATALOG_ID
-                                .equals(referencedCatalog.getId()))
-                        {
-                            systemCatalog = referencedCatalog;
-                        }
-                    }
-                }
-                if (systemCatalog != null)
-                {
-                    ICatalogEntry foundEntry = null;
-                    for (final ICatalogEntry entry : systemCatalog.getCatalogEntries())
-                    {
-                        if ("-//Sun Microsystems, Inc.//DTD Facelet Taglib 1.0//EN" //$NON-NLS-1$
-                        .equals(entry.getKey()))
-                        {
-                            foundEntry = entry;
-                            break;
-                        }
-                    }
-                    if (foundEntry != null)
-                    {
-                        final java.net.URI uri = new java.net.URI(foundEntry.getURI());
-                        URL url = URIUtil.toURL(uri);
-                        return url.openStream();
-//                        final String uriString = foundEntry.getURI();
-//                        if (URIUtil.isFileURI(uriString))
-//                        {
-//                            return new File(URIUtil.toFile(uriString));
-//                        }
-                    }
-                }
-            }
-            return null;
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/TagModelParser.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/TagModelParser.java
deleted file mode 100644
index bb7c164..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/TagModelParser.java
+++ /dev/null
@@ -1,461 +0,0 @@
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
-
-import org.eclipse.jst.jsf.facelet.core.internal.FaceletCorePlugin;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.ComponentTagDefn;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.ConverterTagDefn;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletLibraryClassTagLib;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletTaglibDefn;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletTaglibFactory;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletXMLDefnTaglib;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.HandlerTagDefn;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.SourceTagDefn;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.TagDefn;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.ValidatorTagDefn;
-import org.w3c.dom.Document;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.xml.sax.InputSource;
-import org.xml.sax.SAXException;
-import org.xml.sax.helpers.DefaultHandler;
-
-/**
- * A Facelet tag library document parser (dtd 1.0).
- * 
- * @author cbateman
- * 
- */
-public class TagModelParser
-{
-    private static final String FACELET_TAGLIB_DTD_PATH = "/dtd/facelet-taglib_1_0.dtd"; //$NON-NLS-1$
-
-
-    private static final String ELEMENT_NAME_VALIDATOR_ID         = "validator-id";                                         //$NON-NLS-1$
-    private static final String ELEMENT_NAME_CONVERTER_ID         = "converter-id";                                         //$NON-NLS-1$
-    private static final String ELEMENT_NAME_RENDERER_TYPE        = "renderer-type";                                        //$NON-NLS-1$
-    private static final String ELEMENT_NAME_COMPONENT_TYPE       = "component-type";                                       //$NON-NLS-1$
-    private static final String ELEMENT_NAME_VALIDATOR            = "validator";                                            //$NON-NLS-1$
-    private static final String ELEMENT_NAME_CONVERTER            = "converter";                                            //$NON-NLS-1$
-    private static final String ELEMENT_NAME_COMPONENT            = "component";                                            //$NON-NLS-1$
-    private static final String ELEMENT_NAME_HANDLER_CLASS        = "handler-class";                                        //$NON-NLS-1$
-    private static final String ELEMENT_NAME_SOURCE               = "source";                                               //$NON-NLS-1$
-    private static final String ELEMENT_NAME_TAG_NAME             = "tag-name";                                             //$NON-NLS-1$
-    private static final String ELEMENT_NAME_TAG                  = "tag";                                                  //$NON-NLS-1$
-    private static final String ELEMENT_NAME_NAMESPACE            = "namespace";                                            //$NON-NLS-1$
-    private static final String ELEMENT_NAME_LIBRARY_CLASS        = "library-class";                                        //$NON-NLS-1$
-    private static final String ELEMENT_NAME_FACELET_TAGLIB       = "facelet-taglib";                                       //$NON-NLS-1$
-    private static final String URI_FACELET_TAGLIB_1_0_DTD        = "facelet-taglib_1_0.dtd";                               //$NON-NLS-1$
-    private static final String PUBLIC_DTD_FACELET_TAGLIB_1_0_DTD = "-//Sun Microsystems, Inc.//DTD Facelet Taglib 1.0//EN"; //$NON-NLS-1$
-
-    /**
-     * @param is
-     * @param dtdSourcePath
-     * @return the taglib definition or null
-     * @throws IOException
-     * @throws ParserConfigurationException
-     * @throws SAXException
-     */
-    public static FaceletTaglibDefn loadFromInputStream(final InputStream is, final String dtdSourcePath) throws IOException, ParserConfigurationException, SAXException
-    {
-        final byte[] buffer = getBufferForEntry(is);
-        final InputStream dtdSource = getDefaultDTDSource(dtdSourcePath != null ? dtdSourcePath : FACELET_TAGLIB_DTD_PATH);
-        final FaceletTaglibDefn taglib = loadFromBuffer(buffer, dtdSource);
-        return taglib;
-
-    }
-    /**
-     * @param buffer
-     * @param defaultDtdStream
-     * @return the tag library definition (loaded EMF model) for the buffer
-     * @throws IOException
-     * @throws ParserConfigurationException
-     * @throws SAXException
-     */
-    public static FaceletTaglibDefn loadFromBuffer(final byte[] buffer,
-            final InputStream defaultDtdStream) throws IOException,
-            ParserConfigurationException, SAXException
-    {
-        final InputSource inputSource = new InputSource(
-                new ByteArrayInputStream(buffer));
-
-        final Document doc = TagModelParser.getDefaultTaglibDocument(
-                inputSource, new InputSource(defaultDtdStream));
-        final FaceletTaglibDefn tagLib = TagModelParser.processDocument(doc);
-        return tagLib;
-    }
-
-    /**
-     * @param path 
-     * @return the input stream for the default bundle Facelet dtd.
-     * @throws IOException
-     */
-    protected static InputStream getDefaultDTDSource(final String path) throws IOException
-    {
-        final URL url = FaceletCorePlugin.getDefault().getBundle().getEntry(path);
-
-        if (url != null)
-        {
-            return url.openStream();
-        }
-        return null;
-    }
-
-    /**
-     * @param is must be open.  Caller is responsible for closing.
-     * @return load the stream into a byte buffer.  
-     */
-    protected static byte[] getBufferForEntry(final InputStream is)
-    {
-        final ByteArrayOutputStream stream = new ByteArrayOutputStream();
-        final byte[] buffer = new byte[2048];
-
-        int bytesRead = 0;
-
-        try
-        {
-            while (((bytesRead = is.read(buffer))) != -1)
-            {
-                stream.write(buffer, 0, bytesRead);
-            }
-        }
-        catch (final IOException e)
-        {
-            FaceletCorePlugin.log("Error loading buffer", e); //$NON-NLS-1$
-            return null;
-        }
-
-        return stream.toByteArray();
-    }
-
-    /**
-     * @param taglibFile
-     * @param defaultDTDSource
-     * @return the default taglib dom Document
-     * @throws IOException
-     * @throws ParserConfigurationException
-     * @throws SAXException
-     */
-    public static Document getDefaultTaglibDocument(
-            final InputSource taglibFile, final InputSource defaultDTDSource)
-            throws IOException, ParserConfigurationException, SAXException
-    {
-        final DocumentBuilderFactory factory = DocumentBuilderFactory
-                .newInstance();
-        factory.setValidating(false);
-        factory.setIgnoringComments(true);
-
-        final DocumentBuilder builder = factory.newDocumentBuilder();
-
-        final DefaultHandler handler = new DefaultHandler()
-        {
-            @Override
-            public InputSource resolveEntity(final String publicId,
-                    final String systemId) throws IOException, SAXException
-            {
-                if (PUBLIC_DTD_FACELET_TAGLIB_1_0_DTD.equals(publicId)
-                        || (systemId != null && systemId
-                                .endsWith(URI_FACELET_TAGLIB_1_0_DTD)))
-
-                {
-                    return defaultDTDSource;
-                }
-                return super.resolveEntity(publicId, systemId);
-            }
-        };
-
-        builder.setEntityResolver(handler);
-        return builder.parse(taglibFile);
-    }
-
-    /**
-     * @param doc
-     * @return the facelet tag library or null
-     */
-    public static FaceletTaglibDefn processDocument(final Document doc)
-    {
-        Node curNode = null;
-
-        for (int i = 0; i < doc.getChildNodes().getLength(); i++)
-        {
-            curNode = doc.getChildNodes().item(i);
-
-            if (curNode.getNodeType() == Node.ELEMENT_NODE
-                    && ELEMENT_NAME_FACELET_TAGLIB
-                            .equals(curNode.getNodeName()))
-            {
-                break;
-            }
-        }
-
-        if (curNode == null)
-        {
-            throw new IllegalArgumentException(
-                    "Couldn't find facelet-taglib node"); //$NON-NLS-1$
-        }
-
-        for (int i = 0; i < curNode.getChildNodes().getLength(); i++)
-        {
-            final Node node = curNode.getChildNodes().item(i);
-
-            if (node.getNodeType() == Node.ELEMENT_NODE)
-            {
-                if (ELEMENT_NAME_LIBRARY_CLASS.equals(node.getNodeName()))
-                {
-                    final FaceletLibraryClassTagLib faceletLibraryClassTagLib = FaceletTaglibFactory.eINSTANCE
-                            .createFaceletLibraryClassTagLib();
-                    faceletLibraryClassTagLib.setLibraryClass(node
-                            .getTextContent().trim());
-                    return faceletLibraryClassTagLib;
-                }
-                return processFaceletTaglibWithTags(curNode);
-            }
-        }
-
-        return null;
-    }
-
-    private static FaceletXMLDefnTaglib processFaceletTaglibWithTags(
-            final Node node)
-    {
-        String namespace = null;
-        final List<Node> tagNodes = new ArrayList<Node>();
-
-        for (int i = 0; i < node.getChildNodes().getLength(); i++)
-        {
-            final Node childNode = node.getChildNodes().item(i);
-
-            if (childNode.getNodeType() == Node.ELEMENT_NODE)
-            {
-                if (ELEMENT_NAME_NAMESPACE.equals(childNode.getNodeName()))
-                {
-                    namespace = childNode.getTextContent();
-                }
-                else if (ELEMENT_NAME_TAG.equals(childNode.getNodeName()))
-                {
-                    tagNodes.add(childNode);
-                }
-            }
-        }
-
-        if (namespace != null)
-        {
-            final FaceletXMLDefnTaglib xmlDefnTaglib = FaceletTaglibFactory.eINSTANCE
-                    .createFaceletXMLDefnTaglib();
-            xmlDefnTaglib.setNamespace(namespace);
-
-            for (final Node tagNode : tagNodes)
-            {
-                final TagDefn tag = createTagFromNode(namespace, tagNode);
-
-                if (tag != null)
-                {
-                    xmlDefnTaglib.getTags().add(tag);
-                }
-            }
-
-            return xmlDefnTaglib;
-        }
-        return null;
-    }
-
-    private static TagDefn createTagFromNode(final String namespace,
-            final Node tagNode)
-    {
-        final Map<String, Node> children = indexChildren(tagNode);
-
-        Node node = children.get(ELEMENT_NAME_TAG_NAME);
-
-        if (node != null)
-        {
-            final String name = safeGetTextContext(node);
-
-            if (name == null)
-            {
-                return null;
-            }
-
-            node = children.get(ELEMENT_NAME_HANDLER_CLASS);
-
-            if (node != null)
-            {
-                final HandlerTagDefn handlerTag = FaceletTaglibFactory.eINSTANCE
-                        .createHandlerTagDefn();
-                handlerTag.setHandlerClass(safeGetTextContext(node));
-                handlerTag.setName(name);
-                return handlerTag;
-            }
-
-            node = children.get(ELEMENT_NAME_SOURCE);
-
-            if (node != null)
-            {
-                final SourceTagDefn sourceTag = FaceletTaglibFactory.eINSTANCE
-                        .createSourceTagDefn();
-                sourceTag.setSource(safeGetTextContext(node));
-                sourceTag.setName(name);
-                return sourceTag;
-            }
-
-            node = children.get(ELEMENT_NAME_COMPONENT);
-
-            if (node != null)
-            {
-                return createTagWithComponentType(namespace, name, node);
-            }
-
-            node = children.get(ELEMENT_NAME_CONVERTER);
-
-            if (node != null)
-            {
-                return createTagWithConverter(namespace, name, node);
-            }
-
-            node = children.get(ELEMENT_NAME_VALIDATOR);
-
-            if (node != null)
-            {
-                return createValidatorTag(namespace, name, node);
-            }
-        }
-
-        return null;
-    }
-
-    private static ComponentTagDefn createTagWithComponentType(
-            final String uri, final String tagName, final Node paramNode)
-    {
-        final Map<String, Node> componentChildren = indexChildren(paramNode);
-        Node node = componentChildren.get(ELEMENT_NAME_COMPONENT_TYPE);
-
-        if (node != null)
-        {
-            final String componentType = safeGetTextContext(node);
-            String rendererType = null;
-            String handlerClass = null;
-
-            node = componentChildren.get(ELEMENT_NAME_RENDERER_TYPE);
-            if (node != null)
-            {
-                rendererType = safeGetTextContext(node);
-            }
-
-            node = componentChildren.get(ELEMENT_NAME_HANDLER_CLASS);
-            if (node != null)
-            {
-                handlerClass = safeGetTextContext(node);
-            }
-
-            final ComponentTagDefn componentTag = FaceletTaglibFactory.eINSTANCE
-                    .createComponentTagDefn();
-            componentTag.setName(tagName);
-            componentTag.setComponentType(componentType);
-            componentTag.setHandlerClass(handlerClass);
-            componentTag.setRendererType(rendererType);
-            return componentTag;
-        }
-        return null;
-    }
-
-    private static ConverterTagDefn createTagWithConverter(final String uri,
-            final String tagName, final Node paramNode)
-    {
-        final Map<String, Node> converterChildren = indexChildren(paramNode);
-        Node node = converterChildren.get(ELEMENT_NAME_CONVERTER_ID);
-
-        if (node != null)
-        {
-            final String converterId = safeGetTextContext(node);
-            String handlerClass = null;
-
-            node = converterChildren.get(ELEMENT_NAME_HANDLER_CLASS);
-            if (node != null)
-            {
-                handlerClass = safeGetTextContext(node);
-            }
-
-            final ConverterTagDefn converterTag = FaceletTaglibFactory.eINSTANCE
-                    .createConverterTagDefn();
-            converterTag.setName(tagName);
-            converterTag.setConverterId(converterId);
-            converterTag.setHandlerClass(handlerClass);
-            return converterTag;
-        }
-        return null;
-    }
-
-    private static ValidatorTagDefn createValidatorTag(final String uri,
-            final String tagName, final Node paramNode)
-    {
-        final Map<String, Node> converterChildren = indexChildren(paramNode);
-        Node node = converterChildren.get(ELEMENT_NAME_VALIDATOR_ID);
-
-        if (node != null)
-        {
-            final String validatorId = safeGetTextContext(node);
-            String handlerClass = null;
-
-            node = converterChildren.get(ELEMENT_NAME_HANDLER_CLASS);
-            if (node != null)
-            {
-                handlerClass = safeGetTextContext(node);
-            }
-
-            final ValidatorTagDefn validatorTag = FaceletTaglibFactory.eINSTANCE
-                    .createValidatorTagDefn();
-            validatorTag.setName(tagName);
-            validatorTag.setHandlerClass(handlerClass);
-            validatorTag.setValidatorId(validatorId);
-            return validatorTag;
-        }
-        return null;
-    }
-
-    private static Map<String, Node> indexChildren(final Node node)
-    {
-        final Map<String, Node> children = new HashMap<String, Node>();
-        final NodeList nodeList = node.getChildNodes();
-
-        for (int i = 0; i < nodeList.getLength(); i++)
-        {
-            final Node childNode = nodeList.item(i);
-
-            if (childNode.getNodeType() == Node.ELEMENT_NODE)
-            {
-                children.put(childNode.getNodeName(), childNode);
-            }
-        }
-
-        return children;
-    }
-
-    private static String safeGetTextContext(final Node node)
-    {
-        String textContent = node.getTextContent();
-        if (textContent == null)
-        {
-            return null;
-        }
-
-        textContent = textContent.trim();
-
-        if ("".equals(textContent)) //$NON-NLS-1$
-        {
-            return null;
-        }
-
-        return textContent;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/TagRecordFactory.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/TagRecordFactory.java
deleted file mode 100644
index ef06cec..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/TagRecordFactory.java
+++ /dev/null
@@ -1,154 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.ISafeRunnable;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.SafeRunner;
-import org.eclipse.jem.internal.proxy.core.ICallbackRegistry;
-import org.eclipse.jem.internal.proxy.core.IConfigurationContributor;
-import org.eclipse.jem.internal.proxy.core.ProxyFactoryRegistry;
-import org.eclipse.jem.internal.proxy.ide.IDERegistration;
-import org.eclipse.jst.jsf.core.JSFVersion;
-import org.eclipse.jst.jsf.facelet.core.internal.FaceletCorePlugin;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.ELProxyContributor;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.ServletBeanProxyContributor;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.IFaceletTagRecord.TagRecordDescriptor;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglib;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletLibraryClassTagLib;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletXMLDefnTaglib;
-
-/**
- * Creates new tag records for a project.
- *
- */
-public class TagRecordFactory
-{
-    private final ProxyFactoryRegistry _registry;
-    private final IProject _project;
-
-    /**
-     * @param project
-     * @param useJEMProxy TODO
-     */
-    public TagRecordFactory(final IProject project, boolean useJEMProxy)
-    {
-        _project = project;
-        ProxyFactoryRegistry registry = NULL_REGISTRY;
-        if (useJEMProxy)
-        {
-            try
-            {
-                registry = createProxyRegistry(_project);
-            } catch (final Exception e)
-            {
-                FaceletCorePlugin.log("While creatinng proxy", e); //$NON-NLS-1$
-            }
-            
-        }
-        _registry = registry;
-    }
-
-    /**
-     * @param taglibDefn
-     * @param descriptor 
-     * @return the new tag record
-     */
-    public IFaceletTagRecord createRecords(final FaceletTaglib taglibDefn, final TagRecordDescriptor descriptor)
-    {
-        IFaceletTagRecord retValue = null;
-
-        if (taglibDefn instanceof FaceletLibraryClassTagLib)
-        {
-            if (_registry != NULL_REGISTRY)
-            {
-                final LibraryClassBasedTagRecord record = new LibraryClassBasedTagRecord(
-                        _registry, (FaceletLibraryClassTagLib) taglibDefn,
-                        _project, descriptor);
-                try
-                {
-                    record.initURI();
-                    retValue = record;
-                } catch (CoreException e)
-                {
-                    FaceletCorePlugin
-                            .log("While creating record: " + record, e); //$NON-NLS-1$
-                }
-            }
-        } else if (taglibDefn instanceof FaceletXMLDefnTaglib)
-        {
-            throw new UnsupportedOperationException();
-            // final XMLBasedTagRecord record = new XMLBasedTagRecord(
-            // (FaceletXMLDefnTaglib) taglibDefn);
-            // retValue = record;
-        } else
-        {
-            final XMLBasedTagRecord record = new XMLBasedTagRecord(taglibDefn, descriptor);
-            retValue = record;
-        }
-        return retValue;
-    }
-
-    /**
-     * Dispose the registry.
-     */
-    public void dispose()
-    {
-        if (_registry != null && _registry != NULL_REGISTRY)
-        {
-            SafeRunner.run(new ISafeRunnable()
-            {
-                
-                public void run() throws Exception
-                {
-                    _registry.terminateRegistry(false);
-                }
-                
-                public void handleException(Throwable e)
-                {
-                    FaceletCorePlugin.log("While creatinng proxy", e); //$NON-NLS-1$
-                }
-            });
-        }
-    }
-
-    private static ProxyFactoryRegistry createProxyRegistry(
-            final IProject project) throws CoreException
-    {
-        final IConfigurationContributor[] contributor = new IConfigurationContributor[]
-        { new ServletBeanProxyContributor(JSFVersion.V1_1),
-                new ELProxyContributor(project) };
-
-        return IDERegistration.startAnImplementation(contributor, false,
-                project, project.getName(), FaceletCorePlugin.PLUGIN_ID,
-                new NullProgressMonitor());
-    }
-
-    private final static NullProxyFactoryRegistry NULL_REGISTRY = new NullProxyFactoryRegistry();
-
-    private static class NullProxyFactoryRegistry extends ProxyFactoryRegistry
-    {
-
-        @Override
-        public ICallbackRegistry getCallbackRegistry()
-        {
-            throw new UnsupportedOperationException("This is null proxy"); //$NON-NLS-1$
-        }
-
-        @Override
-        protected void registryTerminated(final boolean wait)
-        {
-            throw new UnsupportedOperationException("This is null proxy"); //$NON-NLS-1$
-        }
-    }
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/TaglibFileTracker.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/TaglibFileTracker.java
deleted file mode 100644
index cc435e2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/TaglibFileTracker.java
+++ /dev/null
@@ -1,60 +0,0 @@
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.jst.jsf.common.internal.resource.ResourceLifecycleEvent.ReasonType;
-import org.eclipse.jst.jsf.common.internal.resource.ResourceTracker;
-
-class TaglibFileTracker extends ResourceTracker<IFile>
-{
-    private String _uri;
-    private TaglibResourceManager _manager;
-    private final ILibraryChangeHandler _handler;
-
-    public TaglibFileTracker(final IFile file, final TaglibResourceManager manager,
-            final ILibraryChangeHandler handler)
-    {
-        super(file);
-        _manager = manager;
-        _manager.addListener(this);
-        _handler = handler;
-    }
-
-    public String getUri()
-    {
-        return _uri;
-    }
-
-    public final void setUri(final String uri)
-    {
-        _uri = uri;
-    }
-
-    @Override
-    public void dispose()
-    {
-        _manager.removeListener(this);
-        _manager = null;
-    }
-
-    @Override
-    protected void fireResourceInAccessible(final IResource resource, final ReasonType reasonType)
-    {
-        // removed resources kick a remove event
-        _handler.removed(_uri, getResource());
-    }
-
-    @Override
-    protected void fireResourceChanged(final IResource resource, final ReasonType reasonType)
-    {
-        // changed resources kick a change event
-        _handler.changed(_uri, getResource());
-    }
-
-    @Override
-    protected void fireResourceAdded(final IResource affectedResource, final ReasonType reasonType)
-    {
-        // added resources kick an add event.
-        _handler.added(getResource());
-    }
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/TaglibResourceManager.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/TaglibResourceManager.java
deleted file mode 100644
index ce7cce0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/TaglibResourceManager.java
+++ /dev/null
@@ -1,99 +0,0 @@
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib;
-
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.jst.jsf.common.internal.resource.ResourceManager;
-import org.eclipse.jst.jsf.common.internal.resource.ResourceTracker;
-import org.eclipse.jst.jsf.common.internal.resource.WorkspaceMediator;
-import org.eclipse.jst.jsf.facelet.core.internal.FaceletCorePlugin;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.WebappConfiguration.WebappListener;
-
-class TaglibResourceManager extends ResourceManager<IFile>
-{
-    private ILibraryChangeHandler _handler;
-    private final WebappConfiguration _webAppConfiguration;
-
-    public TaglibResourceManager(final IProject project,
-            final ILibraryChangeHandler handler,
-            final WorkspaceMediator wsMediator, 
-            final WebappConfiguration webAppConfiguration)
-    {
-        super(project.getWorkspace());
-        _handler = handler;
-        _webAppConfiguration = webAppConfiguration;
-    }
-
-    @Override
-    public List<IFile> getResources()
-    {
-        return _webAppConfiguration.getFiles();
-    }
-
-    @Override
-    public void initResources()
-    {
-        _webAppConfiguration.start();
-        _webAppConfiguration.addListener(new WebappListener()
-        {
-            @Override
-            public void webappChanged(final WebappChangeEvent event)
-            {
-                for (final IFile file : event.getRemoved())
-                {
-                    TaglibFileTracker tracker;
-                    // only fire removals on files that we are already managing: you can't remove
-                    // a file that is not there.
-                    if (isInstance(file))
-                    {
-                        tracker = (TaglibFileTracker) unmanageResource(file);
-                        _handler.removed(tracker.getUri(), file);
-                    }
-                }
-
-                for (final IFile file : event.getAdded())
-                {
-                    _handler.added(file);
-                }
-            }
-        });
-        List<IFile> files = _webAppConfiguration.getFiles();
-        for (final IFile file : files)
-        {
-            // add files to ensure we get add events for ones that don't exist.
-            try
-            {
-                getInstance(file);
-            } catch (ManagedObjectException e)
-            {
-                FaceletCorePlugin.log("While starting the taglib resource manager", e); //$NON-NLS-1$
-            }
-        }
-    }
-
-    @Override
-    protected ResourceTracker createNewInstance(final IResource resource)
-    {
-        if (resource.getType() == IResource.FILE)
-        {
-            return new TaglibFileTracker((IFile) resource, this, _handler);
-        }
-        throw new IllegalArgumentException();
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see
-     * org.eclipse.jst.jsf.common.internal.resource.ResourceSingletonObjectManager
-     * #dispose()
-     */
-    @Override
-    public void dispose()
-    {
-        _webAppConfiguration.dispose();
-        super.dispose();
-    }
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/WebappConfiguration.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/WebappConfiguration.java
deleted file mode 100644
index e0117c8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/WebappConfiguration.java
+++ /dev/null
@@ -1,400 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-import java.util.StringTokenizer;
-import java.util.concurrent.CopyOnWriteArrayList;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IWorkspaceRunnable;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jst.j2ee.model.IModelProvider;
-import org.eclipse.jst.javaee.web.IWebCommon;
-import org.eclipse.jst.jsf.common.internal.componentcore.AbstractVirtualComponentQuery;
-import org.eclipse.jst.jsf.common.internal.resource.EventResult;
-import org.eclipse.jst.jsf.common.internal.resource.IResourceLifecycleListener;
-import org.eclipse.jst.jsf.common.internal.resource.LifecycleListener;
-import org.eclipse.jst.jsf.common.internal.resource.ResourceLifecycleEvent;
-import org.eclipse.jst.jsf.common.internal.resource.ResourceLifecycleEvent.EventType;
-import org.eclipse.jst.jsf.common.internal.resource.WorkspaceMediator;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.WebappConfiguration.WebappListener.WebappChangeEvent;
-import org.eclipse.wst.common.componentcore.resources.IVirtualFile;
-import org.eclipse.wst.common.componentcore.resources.IVirtualFolder;
-
-/**
- * Manages the web.xml elements of interest to Facelet tag libraries
- * 
- * @author cbateman
- * 
- */
-public class WebappConfiguration
-{
-    /**
-     * The param key for Facelet 1.x libraries declared in web.xml
-     */
-    public static final String FACELET_10_LIBRARIES_CONTEXT_PARAM_NAME = "facelets.LIBRARIES"; //$NON-NLS-1$
-    /**
-     * The param key for Facelet 2.0 libraries declared in web.xml
-     */
-    public static final String JSF20_FACELET_LIBRARIES_CONTEXT_PARAM_NAME = "javax.faces.FACELETS_LIBRARIES"; //$NON-NLS-1$
-    private final IProject _project;
-    /**
-     * Cached instance of ContextParamAdapter.
-     */
-    private final ContextParamAdapter _contextParamAdapter;
-    private List<IFile> _cachedFiles;
-    private final IModelProvider _modelProvider;
-    private final AbstractVirtualComponentQuery _vcQuery;
-    private final LifecycleListener _lifecycleListener;
-    private final WorkspaceMediator _wsMediator;
-
-    /**
-     * @param project
-     * @param modelProvider
-     * @param vcQuery
-     * @param wsMediator
-     */
-    public WebappConfiguration(final IProject project,
-            final IModelProvider modelProvider,
-            final AbstractVirtualComponentQuery vcQuery,
-            final WorkspaceMediator wsMediator)
-    {
-        _project = project;
-        _vcQuery = vcQuery;
-        _lifecycleListener = new LifecycleListener(getWebXmlFile(project),
-                project.getWorkspace());
-        _contextParamAdapter = new ContextParamAdapter();
-        _modelProvider = modelProvider;
-        _wsMediator = wsMediator;
-    }
-
-    /**
-     * @param listener
-     */
-    public void addListener(final WebappListener listener)
-    {
-        _contextParamAdapter.addListener(listener);
-    }
-
-    /**
-     * @param listener
-     */
-    public void removeListener(final WebappListener listener)
-    {
-        _contextParamAdapter.removeListener(listener);
-    }
-
-    /**
-     * @return the list of IFile's
-     */
-    public List<IFile> getFiles()
-    {
-        final IVirtualFolder folder = _vcQuery.getWebContentFolder(_project);
-
-        if (folder == null)
-        {
-            return Collections.emptyList();
-        }
-
-        final List<String> filenames = getConfigFilesFromContextParam(_project,
-                _modelProvider);
-        final List<IFile> files = new ArrayList<IFile>();
-
-        for (final String filename : filenames)
-        {
-            final IVirtualFile vfile = folder.getFile(new Path(filename));
-            if (vfile != null)
-            {
-                files.add(vfile.getUnderlyingFile());
-            }
-        }
-        _cachedFiles = files;
-        return Collections.unmodifiableList(_cachedFiles);
-    }
-
-    private IFile getWebXmlFile(final IProject project)
-    {
-        final IVirtualFolder webContentFolder = _vcQuery
-                .getWebContentFolder(project);
-        final IContainer folder = webContentFolder.getUnderlyingFolder();
-        return folder.getFile(new Path("WEB-INF/web.xml")); //$NON-NLS-1$
-    }
-
-    /**
-     * 
-     */
-    public void start()
-    {
-        _lifecycleListener.addListener(_contextParamAdapter);
-    }
-
-    /**
-     * 
-     */
-    public void stop()
-    {
-        _lifecycleListener.removeListener(_contextParamAdapter);
-    }
-
-    /**
-     * 
-     */
-    public void dispose()
-    {
-        _lifecycleListener.dispose();
-    }
-
-    /**
-     * Gets list of application configuration file names as listed in the JSF
-     * CONFIG_FILES context parameter ("javax.faces.CONFIG_FILES"). Will return
-     * an empty list if WebArtifactEdit is null, if WebApp is null, if context
-     * parameter does not exist, or if trimmed context parameter's value is an
-     * empty String.
-     * 
-     * @param project
-     *            IProject instance for which to get the context parameter's
-     *            value.
-     * @param provider
-     * @return List of application configuration file names as listed in the JSF
-     *         CONFIG_FILES context parameter ("javax.faces.CONFIG_FILES"); list
-     *         may be empty.
-     */
-    public static List<String> getConfigFilesFromContextParam(
-            final IProject project, final IModelProvider provider)
-    {
-        List<String> filesList = Collections.EMPTY_LIST;
-        // if (JSFAppConfigUtils.isValidJSFProject(project))
-        {
-            final Object webAppObj = provider.getModelObject();
-            if (webAppObj != null)
-            {
-                if (webAppObj instanceof org.eclipse.jst.javaee.web.WebApp)
-                {
-                    filesList = getConfigFilesForJEEApp((org.eclipse.jst.javaee.web.WebApp) webAppObj);
-                }
-            }
-
-        }
-        return filesList;
-    }
-
-    private static List<String> getConfigFilesForJEEApp(
-            final org.eclipse.jst.javaee.web.WebApp webApp)
-    {
-        String filesString = null;
-        final List contextParams = webApp.getContextParams();
-        final Iterator itContextParams = contextParams.iterator();
-        final List<String> fileStrings = new ArrayList<String>();
-        while (itContextParams.hasNext())
-        {
-            final org.eclipse.jst.javaee.core.ParamValue paramValue = (org.eclipse.jst.javaee.core.ParamValue) itContextParams
-                    .next();
-            if (paramValue.getParamName().equals(
-                    FACELET_10_LIBRARIES_CONTEXT_PARAM_NAME)
-                    || paramValue.getParamName().equals(
-                            JSF20_FACELET_LIBRARIES_CONTEXT_PARAM_NAME))
-            {
-                filesString = paramValue.getParamValue();
-                fileStrings.addAll(parseFilesString(filesString));
-            }
-        }
-        return fileStrings;
-    }
-
-    private static List<String> parseFilesString(final String filesString)
-    {
-        final List<String> filesList = new ArrayList<String>();
-        if (filesString != null && filesString.trim().length() > 0)
-        {
-            final StringTokenizer stFilesString = new StringTokenizer(
-                    filesString, ";"); //$NON-NLS-1$
-            while (stFilesString.hasMoreTokens())
-            {
-                final String configFile = stFilesString.nextToken().trim();
-                filesList.add(configFile);
-            }
-        }
-        return filesList;
-    }
-
-    /**
-     * Adapter implementation used to monitor addition/removal of context-param
-     * nodes and change in name of existing nodes in order to respond to changes
-     * to the JSF CONFIG_FILES context-param.
-     * 
-     * @author Ian Trimble - Oracle
-     */
-    private class ContextParamAdapter implements IResourceLifecycleListener
-    {
-        private final CopyOnWriteArrayList<WebappListener> _listeners = new CopyOnWriteArrayList<WebappListener>();
-
-        public void addListener(final WebappListener listener)
-        {
-            _listeners.addIfAbsent(listener);
-        }
-
-        public void removeListener(final WebappListener listener)
-        {
-            _listeners.remove(listener);
-        }
-
-        private void fireEvent(final WebappChangeEvent event)
-        {
-            for (final WebappListener listener : _listeners)
-            {
-                listener.webappChanged(event);
-            }
-        }
-
-        private void checkAndFireFileChanges()
-        {
-            final List<IFile> oldFiles = _cachedFiles == null ? Collections.EMPTY_LIST
-                    : _cachedFiles;
-            final List<IFile> newFiles = getFiles();
-
-            final List<IFile> filesAdded = new ArrayList<IFile>();
-            final List<IFile> filesRemoved = new ArrayList<IFile>();
-
-            for (final IFile oldFile : oldFiles)
-            {
-                if (!newFiles.contains(oldFile))
-                {
-                    filesRemoved.add(oldFile);
-                }
-            }
-
-            for (final IFile newFile : newFiles)
-            {
-                if (!oldFiles.contains(newFile))
-                {
-                    filesAdded.add(newFile);
-                }
-            }
-
-            if (filesAdded.size() > 0 || filesRemoved.size() > 0)
-            {
-                fireEvent(new WebappChangeEvent(filesRemoved, filesAdded));
-            }
-        }
-
-        /**
-         * Called when a ContextParam instance is removed.
-         * 
-         * @param contextParam
-         *            ContextParam instance.
-         */
-        protected void processParamValue(
-                final org.eclipse.jst.javaee.core.ParamValue contextParam)
-        {
-            checkAndFireFileChanges();
-        }
-
-//        /**
-//         * Tests if the passed ContextParam instance is the JSF CONFIG_FILES
-//         * context parameter.
-//         * 
-//         * @param contextParam
-//         *            ContextParam instance.
-//         * @return true if the passed ContextParam instance is the JSF
-//         *         CONFIG_FILES context parameter, else false
-//         */
-//        protected boolean isConfigFilesContextParam(
-//                final org.eclipse.jst.javaee.core.ParamValue contextParam)
-//        {
-//            boolean isConfigFiles = false;
-//            if (contextParam != null)
-//            {
-//                final String name = contextParam.getParamName();
-//                if (FACELET_10_LIBRARIES_CONTEXT_PARAM_NAME.equals(name)
-//                        || JSF20_FACELET_LIBRARIES_CONTEXT_PARAM_NAME
-//                                .equals(name))
-//                {
-//                    isConfigFiles = true;
-//                }
-//            }
-//            return isConfigFiles;
-//        }
-
-        public EventResult acceptEvent(final ResourceLifecycleEvent event)
-        {
-            // the event is only interesting if it is the web.xml
-            if (event.getAffectedResource() instanceof IFile
-                    && "web.xml".equals(event.getAffectedResource().getProjectRelativePath().lastSegment())) //$NON-NLS-1$
-            {
-                if (event.getEventType() == EventType.RESOURCE_CHANGED)
-                {
-                    handleChange();
-                }
-            }
-            return EventResult.getDefaultEventResult();
-        }
-
-        private void handleChange()
-        {
-            final IWorkspaceRunnable runnable = new IWorkspaceRunnable()
-            {
-                public void run(final IProgressMonitor monitor) throws CoreException
-                {
-                    final Object modelObject = _modelProvider.getModelObject();
-                    if (modelObject instanceof org.eclipse.jst.javaee.web.WebApp)
-                    {
-                        for (final org.eclipse.jst.javaee.core.ParamValue paramValue : ((IWebCommon) modelObject)
-                                .getContextParams())
-                        {
-                            processParamValue(paramValue);
-                        }
-                    }
-                    // TODO: possibly handle facelets 1.0 in pre-2.5 webapps in
-                    // the
-                    // future
-                    // if it's worth the complexity.
-                    // SEE previous revs in CVS.
-                }
-            };
-            _wsMediator.runInWorkspaceJob(runnable, "Update web xml"); //$NON-NLS-1$
-        }
-    }
-
-    abstract static class WebappListener
-    {
-        public static class WebappChangeEvent
-        {
-            private final List<IFile> _removed;
-            private final List<IFile> _added;
-
-            WebappChangeEvent(final List<IFile> removed, final List<IFile> added)
-            {
-                _removed = Collections.unmodifiableList(removed);
-                _added = Collections.unmodifiableList(added);
-            }
-
-            public final List<IFile> getRemoved()
-            {
-                return _removed;
-            }
-
-            public final List<IFile> getAdded()
-            {
-                return _added;
-            }
-        }
-
-        public abstract void webappChanged(final WebappChangeEvent event);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/XMLBasedTagRecord.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/XMLBasedTagRecord.java
deleted file mode 100644
index 9fda907..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/XMLBasedTagRecord.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglib;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTag;
-
-/**
- * A tag record based on an xml tag defined Facelet taglib.xml
- * @author cbateman
- *
- */
-public class XMLBasedTagRecord extends FaceletTagRecord
-{
-    /**
-     * 
-     */
-    private static final long serialVersionUID = 1411551451386954263L;
-    private final FaceletTaglib _taglibDefn;
-    private Map<String, FaceletTaglibTag>       _tagIndexByName;
-
-    /**
-     * @param taglibDefn
-     * @param descriptor 
-     */
-    public XMLBasedTagRecord(final FaceletTaglib taglibDefn, final TagRecordDescriptor descriptor)
-    {
-        super(descriptor);
-        _taglibDefn = taglibDefn;
-    }
-
-    @Override
-    public String getURI()
-    {
-        return _taglibDefn.getNamespaceUri();
-    }
-
-
-    @Override
-    public FaceletTaglibTag getTag(final String name)
-    {
-        return getAndIndexElementDeclaration(name);
-    }
-
-    private synchronized FaceletTaglibTag getAndIndexElementDeclaration(final String name)
-    {
-        FaceletTaglibTag tagDefn = null;
-
-        if (_tagIndexByName == null)
-        {
-            _tagIndexByName = new HashMap<String, FaceletTaglibTag>();
-        }
-        else
-        {
-            tagDefn = _tagIndexByName.get(name);
-        }
-
-        if (tagDefn == null && _tagIndexByName.size() < _taglibDefn.getTag().size())
-        {
-            tagDefn = findTag(name);
-            if (tagDefn != null)
-            {
-                _tagIndexByName.put(name, tagDefn);
-            }
-        }
-
-        return tagDefn;
-    }
-
-    private FaceletTaglibTag findTag(final String name)
-    {
-        for (final FaceletTaglibTag tag : _taglibDefn.getTag())
-        {
-            if (name.equals(tag.getTagName()))
-            {
-                return tag;
-            }
-        }
-        return null;
-    }
-
-    @Override
-    public List<FaceletTaglibTag> getTags()
-    {
-        return Collections.unmodifiableList(_taglibDefn.getTag());
-    }
-
-    public int getNumTags()
-    {
-        return _taglibDefn.getTag().size();
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/XMLBasedTagRecord_Facelet10.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/XMLBasedTagRecord_Facelet10.java
deleted file mode 100644
index 1a73273..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/XMLBasedTagRecord_Facelet10.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglib;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTag;
-
-/**
- * A tag record based on an xml tag defined Facelet taglib.xml
- * @author cbateman
- *
- */
-public class XMLBasedTagRecord_Facelet10 extends FaceletTagRecord
-{
-    /**
-     * 
-     */
-    private static final long serialVersionUID = 1411551451386954263L;
-    private final FaceletTaglib _taglibDefn;
-    private Map<String, FaceletTaglibTag>       _tagIndexByName;
-
-    /**
-     * @param taglibDefn
-     * @param descriptor 
-     */
-    public XMLBasedTagRecord_Facelet10(final FaceletTaglib taglibDefn, final TagRecordDescriptor descriptor)
-    {
-        super(descriptor);
-        _taglibDefn = taglibDefn;
-    }
-
-    @Override
-    public String getURI()
-    {
-        return _taglibDefn.getNamespaceUri();
-    }
-
-
-    @Override
-    public FaceletTaglibTag getTag(final String name)
-    {
-        return getAndIndexElementDeclaration(name);
-    }
-
-    private synchronized FaceletTaglibTag getAndIndexElementDeclaration(final String name)
-    {
-        FaceletTaglibTag tagDefn = null;
-
-        if (_tagIndexByName == null)
-        {
-            _tagIndexByName = new HashMap<String, FaceletTaglibTag>();
-        }
-        else
-        {
-            tagDefn = _tagIndexByName.get(name);
-        }
-
-        if (tagDefn == null && _tagIndexByName.size() < _taglibDefn.getTag().size())
-        {
-            tagDefn = findTag(name);
-        }
-
-        return tagDefn;
-    }
-
-    private FaceletTaglibTag findTag(final String name)
-    {
-        for (final FaceletTaglibTag tag : _taglibDefn.getTag())
-        {
-            if (name.equals(tag.getTagName()))
-            {
-                return tag;
-            }
-        }
-        return null;
-    }
-
-    @Override
-    public List<FaceletTaglibTag> getTags()
-    {
-        return Collections.unmodifiableList(_taglibDefn.getTag());
-    }
-
-    public int getNumTags()
-    {
-        return _taglibDefn.getTag().size();
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/Description.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/Description.java
deleted file mode 100644
index 42810ac..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/Description.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: Description.java,v 1.1 2010/03/18 06:24:36 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Description</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * 
- * 
- *     The description type is used by a description element to
- *     provide text describing the parent element.  The elements
- *     that use this type should include any information that the
- *     Deployment Component's Deployment File file producer wants
- *     to provide to the consumer of the Deployment Component's
- *     Deployment File (i.e., to the Deployer). Typically, the
- *     tools used by such a Deployment File consumer will display
- *     the description when processing the parent element that
- *     contains the description.
- * 
- *     The lang attribute defines the language that the
- *     description is provided in. The default value is "en" (English).
- * 
- *       
- * <!-- end-model-doc -->
- *
- *
- * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage#getDescription()
- * @model extendedMetaData="name='descriptionType' kind='simple'"
- * @generated
- */
-public interface Description extends IdentifiableLangStringValue
-{
- // Description
-} 
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/DisplayName.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/DisplayName.java
deleted file mode 100644
index c44b496..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/DisplayName.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: DisplayName.java,v 1.1 2010/03/18 06:24:36 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Display Name</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * 
- *     <![CDATA[
- * 
- *       The display-name type contains a short name that is intended
- *       to be displayed by tools. It is used by display-name
- *       elements.  The display name need not be unique.
- * 
- *       Example:
- * 
- *       ...
- *          <display-name xml:lang="en">
- *            Employee Self Service
- *          </display-name>
- * 
- *       The value of the xml:lang attribute is "en" (English) by default.
- * 
- *       ]]>
- *       
- * <!-- end-model-doc -->
- *
- *
- * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage#getDisplayName()
- * @model extendedMetaData="name='display-nameType' kind='simple'"
- * @generated
- */
-public interface DisplayName extends IdentifiableLangStringValue
-{
- // DisplayName
-} 
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/DocumentRoot.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/DocumentRoot.java
deleted file mode 100644
index 3cb9176..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/DocumentRoot.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: DocumentRoot.java,v 1.1 2010/03/18 06:24:37 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib;
-
-import org.eclipse.emf.common.util.EMap;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.util.FeatureMap;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Document Root</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.DocumentRoot#getMixed <em>Mixed</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.DocumentRoot#getXMLNSPrefixMap <em>XMLNS Prefix Map</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.DocumentRoot#getXSISchemaLocation <em>XSI Schema Location</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.DocumentRoot#getFaceletTaglib <em>Facelet Taglib</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage#getDocumentRoot()
- * @model extendedMetaData="name='' kind='mixed'"
- * @generated
- */
-public interface DocumentRoot extends EObject
-{
-    /**
-     * Returns the value of the '<em><b>Mixed</b></em>' attribute list.
-     * The list contents are of type {@link org.eclipse.emf.ecore.util.FeatureMap.Entry}.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Mixed</em>' attribute list isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Mixed</em>' attribute list.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage#getDocumentRoot_Mixed()
-     * @model unique="false" dataType="org.eclipse.emf.ecore.EFeatureMapEntry" many="true"
-     *        extendedMetaData="kind='elementWildcard' name=':mixed'"
-     * @generated
-     */
-    FeatureMap getMixed();
-
-    /**
-     * Returns the value of the '<em><b>XMLNS Prefix Map</b></em>' map.
-     * The key is of type {@link java.lang.String},
-     * and the value is of type {@link java.lang.String},
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>XMLNS Prefix Map</em>' map isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>XMLNS Prefix Map</em>' map.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage#getDocumentRoot_XMLNSPrefixMap()
-     * @model mapType="org.eclipse.emf.ecore.EStringToStringMapEntry<org.eclipse.emf.ecore.EString, org.eclipse.emf.ecore.EString>" transient="true"
-     *        extendedMetaData="kind='attribute' name='xmlns:prefix'"
-     * @generated
-     */
-    EMap<String, String> getXMLNSPrefixMap();
-
-    /**
-     * Returns the value of the '<em><b>XSI Schema Location</b></em>' map.
-     * The key is of type {@link java.lang.String},
-     * and the value is of type {@link java.lang.String},
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>XSI Schema Location</em>' map isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>XSI Schema Location</em>' map.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage#getDocumentRoot_XSISchemaLocation()
-     * @model mapType="org.eclipse.emf.ecore.EStringToStringMapEntry<org.eclipse.emf.ecore.EString, org.eclipse.emf.ecore.EString>" transient="true"
-     *        extendedMetaData="kind='attribute' name='xsi:schemaLocation'"
-     * @generated
-     */
-    EMap<String, String> getXSISchemaLocation();
-
-    /**
-     * Returns the value of the '<em><b>Facelet Taglib</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Facelet Taglib</em>' containment reference isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Facelet Taglib</em>' containment reference.
-     * @see #setFaceletTaglib(FaceletTaglib)
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage#getDocumentRoot_FaceletTaglib()
-     * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-     *        extendedMetaData="kind='element' name='facelet-taglib' namespace='##targetNamespace'"
-     * @generated
-     */
-    FaceletTaglib getFaceletTaglib();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.DocumentRoot#getFaceletTaglib <em>Facelet Taglib</em>}' containment reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Facelet Taglib</em>' containment reference.
-     * @see #getFaceletTaglib()
-     * @generated
-     */
-    void setFaceletTaglib(FaceletTaglib value);
-
-} // DocumentRoot
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/FaceletTaglib.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/FaceletTaglib.java
deleted file mode 100644
index 1e872d8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/FaceletTaglib.java
+++ /dev/null
@@ -1,304 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: FaceletTaglib.java,v 1.1 2010/03/18 06:24:29 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.util.FeatureMap;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Facelet Taglib</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * 
- *                 The top level XML element in a facelet tag library XML file.
- *             
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglib#getLibraryClass <em>Library Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglib#getNamespace <em>Namespace</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglib#getCompositeLibraryName <em>Composite Library Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglib#getGroup <em>Group</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglib#getTag <em>Tag</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglib#getFunction <em>Function</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglib#getTaglibExtension <em>Taglib Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglib#getId <em>Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglib#getVersion <em>Version</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglib#getNamespaceUri <em>Namespace Uri</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage#getFaceletTaglib()
- * @model extendedMetaData="name='facelet-taglibType' kind='elementOnly'"
- * @generated
- */
-public interface FaceletTaglib extends UserVisibleTaglibObject
-{
-    /**
-     * Returns the value of the '<em><b>Library Class</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Library Class</em>' containment reference isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Library Class</em>' containment reference.
-     * @see #setLibraryClass(FullyQualifiedClass)
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage#getFaceletTaglib_LibraryClass()
-     * @model containment="true"
-     *        extendedMetaData="kind='element' name='library-class' namespace='##targetNamespace'"
-     * @generated
-     */
-    FullyQualifiedClass getLibraryClass();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglib#getLibraryClass <em>Library Class</em>}' containment reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Library Class</em>' containment reference.
-     * @see #getLibraryClass()
-     * @generated
-     */
-    void setLibraryClass(FullyQualifiedClass value);
-
-    /**
-     * Returns the value of the '<em><b>Namespace</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Namespace</em>' containment reference isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Namespace</em>' containment reference.
-     * @see #setNamespace(IdentifiableStringValue)
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage#getFaceletTaglib_Namespace()
-     * @model containment="true"
-     *        extendedMetaData="kind='element' name='namespace' namespace='##targetNamespace'"
-     * @generated
-     */
-    IdentifiableStringValue getNamespace();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglib#getNamespace <em>Namespace</em>}' containment reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Namespace</em>' containment reference.
-     * @see #getNamespace()
-     * @generated
-     */
-    void setNamespace(IdentifiableStringValue value);
-
-    /**
-     * Returns the value of the '<em><b>Composite Library Name</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Composite Library Name</em>' containment reference isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Composite Library Name</em>' containment reference.
-     * @see #setCompositeLibraryName(FullyQualifiedClass)
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage#getFaceletTaglib_CompositeLibraryName()
-     * @model containment="true"
-     *        extendedMetaData="kind='element' name='composite-library-name' namespace='##targetNamespace'"
-     * @generated
-     */
-    FullyQualifiedClass getCompositeLibraryName();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglib#getCompositeLibraryName <em>Composite Library Name</em>}' containment reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Composite Library Name</em>' containment reference.
-     * @see #getCompositeLibraryName()
-     * @generated
-     */
-    void setCompositeLibraryName(FullyQualifiedClass value);
-
-    /**
-     * Returns the value of the '<em><b>Group</b></em>' attribute list.
-     * The list contents are of type {@link org.eclipse.emf.ecore.util.FeatureMap.Entry}.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Group</em>' attribute list isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Group</em>' attribute list.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage#getFaceletTaglib_Group()
-     * @model unique="false" dataType="org.eclipse.emf.ecore.EFeatureMapEntry" many="true"
-     *        extendedMetaData="kind='group' name='group:6'"
-     * @generated
-     */
-    FeatureMap getGroup();
-
-    /**
-     * Returns the value of the '<em><b>Tag</b></em>' containment reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTag}.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Tag</em>' containment reference list isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Tag</em>' containment reference list.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage#getFaceletTaglib_Tag()
-     * @model containment="true" transient="true" volatile="true" derived="true"
-     *        extendedMetaData="kind='element' name='tag' namespace='##targetNamespace' group='#group:6'"
-     * @generated
-     */
-    EList<FaceletTaglibTag> getTag();
-
-    /**
-     * Returns the value of the '<em><b>Function</b></em>' containment reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibFunction}.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Function</em>' containment reference list isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Function</em>' containment reference list.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage#getFaceletTaglib_Function()
-     * @model containment="true" transient="true" volatile="true" derived="true"
-     *        extendedMetaData="kind='element' name='function' namespace='##targetNamespace' group='#group:6'"
-     * @generated
-     */
-    EList<FaceletTaglibFunction> getFunction();
-
-    /**
-     * Returns the value of the '<em><b>Taglib Extension</b></em>' containment reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibExtension}.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Taglib Extension</em>' containment reference list isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Taglib Extension</em>' containment reference list.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage#getFaceletTaglib_TaglibExtension()
-     * @model containment="true"
-     *        extendedMetaData="kind='element' name='taglib-extension' namespace='##targetNamespace'"
-     * @generated
-     */
-    EList<FaceletTaglibExtension> getTaglibExtension();
-
-    /**
-     * Returns the value of the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Id</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Id</em>' attribute.
-     * @see #setId(String)
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage#getFaceletTaglib_Id()
-     * @model id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-     *        extendedMetaData="kind='attribute' name='id'"
-     * @generated
-     */
-    String getId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglib#getId <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Id</em>' attribute.
-     * @see #getId()
-     * @generated
-     */
-    void setId(String value);
-
-    /**
-     * Returns the value of the '<em><b>Version</b></em>' attribute.
-     * The literals are from the enumeration {@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibVersion}.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Version</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Version</em>' attribute.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibVersion
-     * @see #isSetVersion()
-     * @see #unsetVersion()
-     * @see #setVersion(FaceletTaglibVersion)
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage#getFaceletTaglib_Version()
-     * @model unsettable="true" required="true"
-     *        extendedMetaData="kind='attribute' name='version'"
-     * @generated
-     */
-    FaceletTaglibVersion getVersion();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglib#getVersion <em>Version</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Version</em>' attribute.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibVersion
-     * @see #isSetVersion()
-     * @see #unsetVersion()
-     * @see #getVersion()
-     * @generated
-     */
-    void setVersion(FaceletTaglibVersion value);
-
-    /**
-     * Unsets the value of the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglib#getVersion <em>Version</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #isSetVersion()
-     * @see #getVersion()
-     * @see #setVersion(FaceletTaglibVersion)
-     * @generated
-     */
-    void unsetVersion();
-
-    /**
-     * Returns whether the value of the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglib#getVersion <em>Version</em>}' attribute is set.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return whether the value of the '<em>Version</em>' attribute is set.
-     * @see #unsetVersion()
-     * @see #getVersion()
-     * @see #setVersion(FaceletTaglibVersion)
-     * @generated
-     */
-    boolean isSetVersion();
-
-    /**
-     * Returns the value of the '<em><b>Namespace Uri</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Namespace Uri</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Namespace Uri</em>' attribute.
-     * @see #setNamespaceUri(String)
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage#getFaceletTaglib_NamespaceUri()
-     * @model dataType="org.eclipse.emf.ecore.xml.type.Token" transient="true" volatile="true"
-     * @generated
-     */
-    String getNamespaceUri();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglib#getNamespaceUri <em>Namespace Uri</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Namespace Uri</em>' attribute.
-     * @see #getNamespaceUri()
-     * @generated
-     */
-    void setNamespaceUri(String value);
-
-} // FaceletTaglib
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/FaceletTaglibCanonicalName.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/FaceletTaglibCanonicalName.java
deleted file mode 100644
index 21fabab..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/FaceletTaglibCanonicalName.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: FaceletTaglibCanonicalName.java,v 1.1 2010/03/18 06:24:29 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Facelet Taglib Canonical Name</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * 
- * 
- *                 Defines the canonical name of a tag or attribute being
- *                 defined.
- * 
- *                 The name must conform to the lexical rules for an NCName
- * 
- *             
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibCanonicalName#getValue <em>Value</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibCanonicalName#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage#getFaceletTaglibCanonicalName()
- * @model extendedMetaData="name='facelet-taglib-canonical-nameType' kind='simple'"
- * @generated
- */
-public interface FaceletTaglibCanonicalName extends EObject
-{
-    /**
-     * Returns the value of the '<em><b>Value</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Value</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Value</em>' attribute.
-     * @see #setValue(String)
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage#getFaceletTaglibCanonicalName_Value()
-     * @model dataType="org.eclipse.emf.ecore.xml.type.NCName"
-     *        extendedMetaData="name=':0' kind='simple'"
-     * @generated
-     */
-    String getValue();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibCanonicalName#getValue <em>Value</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Value</em>' attribute.
-     * @see #getValue()
-     * @generated
-     */
-    void setValue(String value);
-
-    /**
-     * Returns the value of the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Id</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Id</em>' attribute.
-     * @see #setId(String)
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage#getFaceletTaglibCanonicalName_Id()
-     * @model id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-     *        extendedMetaData="kind='attribute' name='id'"
-     * @generated
-     */
-    String getId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibCanonicalName#getId <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Id</em>' attribute.
-     * @see #getId()
-     * @generated
-     */
-    void setId(String value);
-
-} // FaceletTaglibCanonicalName
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/FaceletTaglibExtension.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/FaceletTaglibExtension.java
deleted file mode 100644
index 75ab467..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/FaceletTaglibExtension.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: FaceletTaglibExtension.java,v 1.1 2010/03/18 06:24:29 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib;
-
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.util.FeatureMap;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Facelet Taglib Extension</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * 
- *                 Extension element for facelet-taglib. It may contain
- *                 implementation specific content.
- *             
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibExtension#getAny <em>Any</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibExtension#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage#getFaceletTaglibExtension()
- * @model extendedMetaData="name='facelet-taglib-extensionType' kind='elementOnly'"
- * @generated
- */
-public interface FaceletTaglibExtension extends EObject
-{
-    /**
-     * Returns the value of the '<em><b>Any</b></em>' attribute list.
-     * The list contents are of type {@link org.eclipse.emf.ecore.util.FeatureMap.Entry}.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Any</em>' attribute list isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Any</em>' attribute list.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage#getFaceletTaglibExtension_Any()
-     * @model unique="false" dataType="org.eclipse.emf.ecore.EFeatureMapEntry" many="true"
-     *        extendedMetaData="kind='elementWildcard' wildcards='##any' name=':0' processing='lax'"
-     * @generated
-     */
-    FeatureMap getAny();
-
-    /**
-     * Returns the value of the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Id</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Id</em>' attribute.
-     * @see #setId(String)
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage#getFaceletTaglibExtension_Id()
-     * @model id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-     *        extendedMetaData="kind='attribute' name='id'"
-     * @generated
-     */
-    String getId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibExtension#getId <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Id</em>' attribute.
-     * @see #getId()
-     * @generated
-     */
-    void setId(String value);
-
-} // FaceletTaglibExtension
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/FaceletTaglibFactory.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/FaceletTaglibFactory.java
deleted file mode 100644
index 97c72da..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/FaceletTaglibFactory.java
+++ /dev/null
@@ -1,254 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: FaceletTaglibFactory.java,v 1.2 2010/03/18 06:24:28 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib;
-
-import org.eclipse.emf.ecore.EFactory;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Factory</b> for the model.
- * It provides a create method for each non-abstract class of the model.
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage
- * @generated
- */
-public interface FaceletTaglibFactory extends EFactory
-{
-    /**
-     * The singleton instance of the factory.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    FaceletTaglibFactory eINSTANCE = org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibFactoryImpl.init();
-
-    /**
-     * Returns a new object of class '<em>Description</em>'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new object of class '<em>Description</em>'.
-     * @generated
-     */
-    Description createDescription();
-
-    /**
-     * Returns a new object of class '<em>Display Name</em>'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new object of class '<em>Display Name</em>'.
-     * @generated
-     */
-    DisplayName createDisplayName();
-
-    /**
-     * Returns a new object of class '<em>Document Root</em>'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new object of class '<em>Document Root</em>'.
-     * @generated
-     */
-    DocumentRoot createDocumentRoot();
-
-    /**
-     * Returns a new object of class '<em>Canonical Name</em>'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new object of class '<em>Canonical Name</em>'.
-     * @generated
-     */
-    FaceletTaglibCanonicalName createFaceletTaglibCanonicalName();
-
-    /**
-     * Returns a new object of class '<em>Extension</em>'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new object of class '<em>Extension</em>'.
-     * @generated
-     */
-    FaceletTaglibExtension createFaceletTaglibExtension();
-
-    /**
-     * Returns a new object of class '<em>Function</em>'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new object of class '<em>Function</em>'.
-     * @generated
-     */
-    FaceletTaglibFunction createFaceletTaglibFunction();
-
-    /**
-     * Returns a new object of class '<em>Tag Attribute</em>'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new object of class '<em>Tag Attribute</em>'.
-     * @generated
-     */
-    FaceletTaglibTagAttribute createFaceletTaglibTagAttribute();
-
-    /**
-     * Returns a new object of class '<em>Tag Behavior Extension</em>'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new object of class '<em>Tag Behavior Extension</em>'.
-     * @generated
-     */
-    FaceletTaglibTagBehaviorExtension createFaceletTaglibTagBehaviorExtension();
-
-    /**
-     * Returns a new object of class '<em>Tag Behavior</em>'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new object of class '<em>Tag Behavior</em>'.
-     * @generated
-     */
-    FaceletTaglibTagBehavior createFaceletTaglibTagBehavior();
-
-    /**
-     * Returns a new object of class '<em>Tag Component Extension</em>'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new object of class '<em>Tag Component Extension</em>'.
-     * @generated
-     */
-    FaceletTaglibTagComponentExtension createFaceletTaglibTagComponentExtension();
-
-    /**
-     * Returns a new object of class '<em>Tag Component</em>'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new object of class '<em>Tag Component</em>'.
-     * @generated
-     */
-    FaceletTaglibTagComponent createFaceletTaglibTagComponent();
-
-    /**
-     * Returns a new object of class '<em>Tag Converter Extension</em>'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new object of class '<em>Tag Converter Extension</em>'.
-     * @generated
-     */
-    FaceletTaglibTagConverterExtension createFaceletTaglibTagConverterExtension();
-
-    /**
-     * Returns a new object of class '<em>Tag Converter</em>'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new object of class '<em>Tag Converter</em>'.
-     * @generated
-     */
-    FaceletTaglibTagConverter createFaceletTaglibTagConverter();
-
-    /**
-     * Returns a new object of class '<em>Tag Extension</em>'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new object of class '<em>Tag Extension</em>'.
-     * @generated
-     */
-    FaceletTaglibTagExtension createFaceletTaglibTagExtension();
-
-    /**
-     * Returns a new object of class '<em>Tag</em>'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new object of class '<em>Tag</em>'.
-     * @generated
-     */
-    FaceletTaglibTag createFaceletTaglibTag();
-
-    /**
-     * Returns a new object of class '<em>Tag Validator Extension</em>'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new object of class '<em>Tag Validator Extension</em>'.
-     * @generated
-     */
-    FaceletTaglibTagValidatorExtension createFaceletTaglibTagValidatorExtension();
-
-    /**
-     * Returns a new object of class '<em>Tag Validator</em>'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new object of class '<em>Tag Validator</em>'.
-     * @generated
-     */
-    FaceletTaglibTagValidator createFaceletTaglibTagValidator();
-
-    /**
-     * Returns a new object of class '<em>Facelet Taglib</em>'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new object of class '<em>Facelet Taglib</em>'.
-     * @generated
-     */
-    FaceletTaglib createFaceletTaglib();
-
-    /**
-     * Returns a new object of class '<em>Fully Qualified Class</em>'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new object of class '<em>Fully Qualified Class</em>'.
-     * @generated
-     */
-    FullyQualifiedClass createFullyQualifiedClass();
-
-    /**
-     * Returns a new object of class '<em>Generic Boolean</em>'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new object of class '<em>Generic Boolean</em>'.
-     * @generated
-     */
-    GenericBoolean createGenericBoolean();
-
-    /**
-     * Returns a new object of class '<em>Icon</em>'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new object of class '<em>Icon</em>'.
-     * @generated
-     */
-    Icon createIcon();
-
-    /**
-     * Returns a new object of class '<em>Java Identifier</em>'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new object of class '<em>Java Identifier</em>'.
-     * @generated
-     */
-    JavaIdentifier createJavaIdentifier();
-
-    /**
-     * Returns a new object of class '<em>Path</em>'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new object of class '<em>Path</em>'.
-     * @generated
-     */
-    Path createPath();
-
-    /**
-     * Returns a new object of class '<em>Identifiable String Value</em>'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new object of class '<em>Identifiable String Value</em>'.
-     * @generated
-     */
-    IdentifiableStringValue createIdentifiableStringValue();
-
-    /**
-     * Returns the package supported by this factory.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the package supported by this factory.
-     * @generated
-     */
-    FaceletTaglibPackage getFaceletTaglibPackage();
-
-} //FaceletTaglibFactory
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/FaceletTaglibFunction.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/FaceletTaglibFunction.java
deleted file mode 100644
index 51abee1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/FaceletTaglibFunction.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: FaceletTaglibFunction.java,v 1.1 2010/03/18 06:24:29 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Facelet Taglib Function</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * 
- *                 If the tag library XML file contains individual function
- *                 declarations rather than pointing to a library-class or a
- *                 declaring a composite-library name, the individual functions are
- *                 enclosed in function elements.
- *             
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibFunction#getFunctionName <em>Function Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibFunction#getFunctionClass <em>Function Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibFunction#getFunctionSignature <em>Function Signature</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage#getFaceletTaglibFunction()
- * @model extendedMetaData="name='facelet-taglib-functionType' kind='elementOnly'"
- * @generated
- */
-public interface FaceletTaglibFunction extends UserVisibleTaglibObject
-{
-    /**
-     * Returns the value of the '<em><b>Function Name</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Function Name</em>' containment reference isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Function Name</em>' containment reference.
-     * @see #setFunctionName(IdentifiableStringValue)
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage#getFaceletTaglibFunction_FunctionName()
-     * @model containment="true" required="true"
-     *        extendedMetaData="kind='element' name='function-name' namespace='##targetNamespace'"
-     * @generated
-     */
-    IdentifiableStringValue getFunctionName();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibFunction#getFunctionName <em>Function Name</em>}' containment reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Function Name</em>' containment reference.
-     * @see #getFunctionName()
-     * @generated
-     */
-    void setFunctionName(IdentifiableStringValue value);
-
-    /**
-     * Returns the value of the '<em><b>Function Class</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Function Class</em>' containment reference isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Function Class</em>' containment reference.
-     * @see #setFunctionClass(FullyQualifiedClass)
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage#getFaceletTaglibFunction_FunctionClass()
-     * @model containment="true" required="true"
-     *        extendedMetaData="kind='element' name='function-class' namespace='##targetNamespace'"
-     * @generated
-     */
-    FullyQualifiedClass getFunctionClass();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibFunction#getFunctionClass <em>Function Class</em>}' containment reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Function Class</em>' containment reference.
-     * @see #getFunctionClass()
-     * @generated
-     */
-    void setFunctionClass(FullyQualifiedClass value);
-
-    /**
-     * Returns the value of the '<em><b>Function Signature</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Function Signature</em>' containment reference isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Function Signature</em>' containment reference.
-     * @see #setFunctionSignature(IdentifiableStringValue)
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage#getFaceletTaglibFunction_FunctionSignature()
-     * @model containment="true" required="true"
-     *        extendedMetaData="kind='element' name='function-signature' namespace='##targetNamespace'"
-     * @generated
-     */
-    IdentifiableStringValue getFunctionSignature();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibFunction#getFunctionSignature <em>Function Signature</em>}' containment reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Function Signature</em>' containment reference.
-     * @see #getFunctionSignature()
-     * @generated
-     */
-    void setFunctionSignature(IdentifiableStringValue value);
-
-} // FaceletTaglibFunction
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/FaceletTaglibPackage.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/FaceletTaglibPackage.java
deleted file mode 100644
index 2525d4b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/FaceletTaglibPackage.java
+++ /dev/null
@@ -1,4018 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: FaceletTaglibPackage.java,v 1.2 2010/03/18 06:24:36 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib;
-
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EDataType;
-import org.eclipse.emf.ecore.EEnum;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.EReference;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Package</b> for the model.
- * It contains accessors for the meta objects to represent
- * <ul>
- *   <li>each class,</li>
- *   <li>each feature of each class,</li>
- *   <li>each enum,</li>
- *   <li>and each data type</li>
- * </ul>
- * <!-- end-user-doc -->
- * <!-- begin-model-doc -->
- * 
- * 
- *       DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
- *       
- *       Copyright 2003-2009 Sun Microsystems, Inc. All rights reserved.
- *       
- *       The contents of this file are subject to the terms of either the
- *       GNU General Public License Version 2 only ("GPL") or the Common
- *       Development and Distribution License("CDDL") (collectively, the
- *       "License").  You may not use this file except in compliance with
- *       the License. You can obtain a copy of the License at
- *       https://glassfish.dev.java.net/public/CDDL+GPL.html or
- *       glassfish/bootstrap/legal/LICENSE.txt.  See the License for the
- *       specific language governing permissions and limitations under the
- *       License.
- *       
- *       When distributing the software, include this License Header
- *       Notice in each file and include the License file at
- *       glassfish/bootstrap/legal/LICENSE.txt.  Sun designates this
- *       particular file as subject to the "Classpath" exception as
- *       provided by Sun in the GPL Version 2 section of the License file
- *       that accompanied this code.  If applicable, add the following
- *       below the License Header, with the fields enclosed by brackets []
- *       replaced by your own identifying information:
- *       "Portions Copyrighted [year] [name of copyright owner]"
- *       
- *       Contributor(s):
- *       
- *       If you wish your version of this file to be governed by only the
- *       CDDL or only the GPL Version 2, indicate your decision by adding
- *       "[Contributor] elects to include this software in this
- *       distribution under the [CDDL or GPL Version 2] license."  If you
- *       don't indicate a single choice of license, a recipient has the
- *       option to distribute your version of this file under either the
- *       CDDL, the GPL Version 2 or to extend the choice of license to its
- *       licensees as provided above.  However, if you add GPL Version 2
- *       code and therefore, elected the GPL Version 2 license, then the
- *       option applies only if the new code is made subject to such
- *       option by the copyright holder.
- *       
- *     
- * 
- * 
- *             <![CDATA[
- * 
- *             The XML Schema for the Tag Libraries in the JavaServer Faces
- *             Standard Facelets View Declaration Language (Facelets VDL)
- *             (Version 2.0).
- * 
- *             JSF 2.0 Facelet Tag Libraries that wish to conform to this
- *             schema must declare it in the following manner.
- * 
- *             <facelet-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 http://java.sun.com/xml/ns/javaee/web-facelettaglibary_2_0.xsd"
- *               version="2.0">
- * 
- *             ...
- * 
- *             </facelet-taglib>
- * 
- *             The instance documents may indicate the published
- *             version of the schema using xsi:schemaLocation attribute
- *             for javaee namespace with the following location:
- * 
- *             http://java.sun.com/xml/ns/javaee/web-facelettaglibary_2_0.xsd
- * 
- *             ]]>
- * 
- *         
- * 
- * 
- *     
- * 
- * 
- *       DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
- *       
- *       Copyright 2003-2009 Sun Microsystems, Inc. All rights reserved.
- *       
- *       The contents of this file are subject to the terms of either the
- *       GNU General Public License Version 2 only ("GPL") or the Common
- *       Development and Distribution License("CDDL") (collectively, the
- *       "License").  You may not use this file except in compliance with
- *       the License. You can obtain a copy of the License at
- *       https://glassfish.dev.java.net/public/CDDL+GPL.html or
- *       glassfish/bootstrap/legal/LICENSE.txt.  See the License for the
- *       specific language governing permissions and limitations under the
- *       License.
- *       
- *       When distributing the software, include this License Header
- *       Notice in each file and include the License file at
- *       glassfish/bootstrap/legal/LICENSE.txt.  Sun designates this
- *       particular file as subject to the "Classpath" exception as
- *       provided by Sun in the GPL Version 2 section of the License file
- *       that accompanied this code.  If applicable, add the following
- *       below the License Header, with the fields enclosed by brackets []
- *       replaced by your own identifying information:
- *       "Portions Copyrighted [year] [name of copyright owner]"
- *       
- *       Contributor(s):
- *       
- *       If you wish your version of this file to be governed by only the
- *       CDDL or only the GPL Version 2, indicate your decision by adding
- *       "[Contributor] elects to include this software in this
- *       distribution under the [CDDL or GPL Version 2] license."  If you
- *       don't indicate a single choice of license, a recipient has the
- *       option to distribute your version of this file under either the
- *       CDDL, the GPL Version 2 or to extend the choice of license to its
- *       licensees as provided above.  However, if you add GPL Version 2
- *       code and therefore, elected the GPL Version 2 license, then the
- *       option applies only if the new code is made subject to such
- *       option by the copyright holder.
- *       
- *     
- * 
- * 
- * The following definitions that appear in the common
- * shareable schema(s) of J2EE deployment descriptors should be
- * interpreted with respect to the context they are included:
- * 
- * Deployment Component may indicate one of the following:
- *     j2ee application;
- *     application client;
- *     web application;
- *     enterprise bean;
- *     resource adapter;
- * 
- * Deployment File may indicate one of the following:
- *     ear file;
- *     war file;
- *     jar file;
- *     rar file;
- * 
- * 
- * 
- *    <div xmlns="http://www.w3.org/1999/xhtml">
- *     <h1>About the XML namespace</h1>
- * 
- *     <div class="bodytext">
- *      <p>
- *       This schema document describes the XML namespace, in a form
- *       suitable for import by other schema documents.
- *      </p>
- *      <p>
- *       See <a href="http://www.w3.org/XML/1998/namespace.html">
- *       http://www.w3.org/XML/1998/namespace.html</a> and
- *       <a href="http://www.w3.org/TR/REC-xml">
- *       http://www.w3.org/TR/REC-xml</a> for information 
- *       about this namespace.
- *      </p>
- *      <p>
- *       Note that local names in this namespace are intended to be
- *       defined only by the World Wide Web Consortium or its subgroups.
- *       The names currently defined in this namespace are listed below.
- *       They should not be used with conflicting semantics by any Working
- *       Group, specification, or document instance.
- *      </p>
- *      <p>   
- *       See further below in this document for more information about <a href="#usage">how to refer to this schema document from your own
- *       XSD schema documents</a> and about <a href="#nsversioning">the
- *       namespace-versioning policy governing this schema document</a>.
- *      </p>
- *     </div>
- *    </div>
- *   
- * 
- *    <div xmlns="http://www.w3.org/1999/xhtml">
- *    
- *     <h3>Father (in any context at all)</h3> 
- * 
- *     <div class="bodytext">
- *      <p>
- *       denotes Jon Bosak, the chair of 
- *       the original XML Working Group.  This name is reserved by 
- *       the following decision of the W3C XML Plenary and 
- *       XML Coordination groups:
- *      </p>
- *      <blockquote>
- *        <p>
- * 	In appreciation for his vision, leadership and
- * 	dedication the W3C XML Plenary on this 10th day of
- * 	February, 2000, reserves for Jon Bosak in perpetuity
- * 	the XML name "xml:Father".
- *        </p>
- *      </blockquote>
- *     </div>
- *    </div>
- *   
- * 
- *    <div id="usage" xml:id="usage" xmlns="http://www.w3.org/1999/xhtml">
- *     <h2>
- *       <a name="usage">About this schema document</a>
- *     </h2>
- * 
- *     <div class="bodytext">
- *      <p>
- *       This schema defines attributes and an attribute group suitable
- *       for use by schemas wishing to allow <code>xml:base</code>,
- *       <code>xml:lang</code>, <code>xml:space</code> or
- *       <code>xml:id</code> attributes on elements they define.
- *      </p>
- *      <p>
- *       To enable this, such a schema must import this schema for
- *       the XML namespace, e.g. as follows:
- *      </p>
- *      <pre>
- *           &lt;schema . . .&gt;
- *            . . .
- *            &lt;import namespace="http://www.w3.org/XML/1998/namespace"
- *                       schemaLocation="http://www.w3.org/2001/xml.xsd"/&gt;
- *      </pre>
- *      <p>
- *       or
- *      </p>
- *      <pre>
- *            &lt;import namespace="http://www.w3.org/XML/1998/namespace"
- *                       schemaLocation="http://www.w3.org/2009/01/xml.xsd"/&gt;
- *      </pre>
- *      <p>
- *       Subsequently, qualified reference to any of the attributes or the
- *       group defined below will have the desired effect, e.g.
- *      </p>
- *      <pre>
- *           &lt;type . . .&gt;
- *            . . .
- *            &lt;attributeGroup ref="xml:specialAttrs"/&gt;
- *      </pre>
- *      <p>
- *       will define a type which will schema-validate an instance element
- *       with any of those attributes.
- *      </p>
- *     </div>
- *    </div>
- *   
- * 
- *    <div id="nsversioning" xml:id="nsversioning" xmlns="http://www.w3.org/1999/xhtml">
- *     <h2>
- *       <a name="nsversioning">Versioning policy for this schema document</a>
- *     </h2>
- *     <div class="bodytext">
- *      <p>
- *       In keeping with the XML Schema WG's standard versioning
- *       policy, this schema document will persist at
- *       <a href="http://www.w3.org/2009/01/xml.xsd">
- *        http://www.w3.org/2009/01/xml.xsd</a>.
- *      </p>
- *      <p>
- *       At the date of issue it can also be found at
- *       <a href="http://www.w3.org/2001/xml.xsd">
- *        http://www.w3.org/2001/xml.xsd</a>.
- *      </p>
- *      <p>
- *       The schema document at that URI may however change in the future,
- *       in order to remain compatible with the latest version of XML
- *       Schema itself, or with the XML namespace itself.  In other words,
- *       if the XML Schema or XML namespaces change, the version of this
- *       document at <a href="http://www.w3.org/2001/xml.xsd">
- *        http://www.w3.org/2001/xml.xsd 
- *       </a> 
- *       will change accordingly; the version at 
- *       <a href="http://www.w3.org/2009/01/xml.xsd">
- *        http://www.w3.org/2009/01/xml.xsd 
- *       </a> 
- *       will not change.
- *      </p>
- *      <p>
- *       Previous dated (and unchanging) versions of this schema 
- *       document are at:
- *      </p>
- *      <ul>
- *       <li>
- *           <a href="http://www.w3.org/2009/01/xml.xsd">
- * 	http://www.w3.org/2009/01/xml.xsd</a>
- *         </li>
- *       <li>
- *           <a href="http://www.w3.org/2007/08/xml.xsd">
- * 	http://www.w3.org/2007/08/xml.xsd</a>
- *         </li>
- *       <li>
- *           <a href="http://www.w3.org/2004/10/xml.xsd">
- * 	http://www.w3.org/2004/10/xml.xsd</a>
- *         </li>
- *       <li>
- *           <a href="http://www.w3.org/2001/03/xml.xsd">
- * 	http://www.w3.org/2001/03/xml.xsd</a>
- *         </li>
- *      </ul>
- *     </div>
- *    </div>
- *   
- * <!-- end-model-doc -->
- * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibFactory
- * @model kind="package"
- * @generated
- */
-public interface FaceletTaglibPackage extends EPackage
-{
-    /**
-     * The package name.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    String eNAME = "faceletTaglib"; //$NON-NLS-1$
-
-    /**
-     * The package namespace URI.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    String eNS_URI = "http://java.sun.com/xml/ns/javaee/web-facelettaglibrary_2_0"; //$NON-NLS-1$
-
-    /**
-     * The package namespace name.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    String eNS_PREFIX = "faceletTaglib"; //$NON-NLS-1$
-
-    /**
-     * The singleton instance of the package.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    FaceletTaglibPackage eINSTANCE = org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibPackageImpl.init();
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.IdentifiableStringValueImpl <em>Identifiable String Value</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.IdentifiableStringValueImpl
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibPackageImpl#getIdentifiableStringValue()
-     * @generated
-     */
-    int IDENTIFIABLE_STRING_VALUE = 23;
-
-    /**
-     * The feature id for the '<em><b>Value</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IDENTIFIABLE_STRING_VALUE__VALUE = 0;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IDENTIFIABLE_STRING_VALUE__ID = 1;
-
-    /**
-     * The number of structural features of the '<em>Identifiable String Value</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IDENTIFIABLE_STRING_VALUE_FEATURE_COUNT = 2;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.IdentifiableLangStringValueImpl <em>Identifiable Lang String Value</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.IdentifiableLangStringValueImpl
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibPackageImpl#getIdentifiableLangStringValue()
-     * @generated
-     */
-    int IDENTIFIABLE_LANG_STRING_VALUE = 24;
-
-    /**
-     * The feature id for the '<em><b>Value</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IDENTIFIABLE_LANG_STRING_VALUE__VALUE = IDENTIFIABLE_STRING_VALUE__VALUE;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IDENTIFIABLE_LANG_STRING_VALUE__ID = IDENTIFIABLE_STRING_VALUE__ID;
-
-    /**
-     * The feature id for the '<em><b>Lang</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IDENTIFIABLE_LANG_STRING_VALUE__LANG = IDENTIFIABLE_STRING_VALUE_FEATURE_COUNT + 0;
-
-    /**
-     * The number of structural features of the '<em>Identifiable Lang String Value</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IDENTIFIABLE_LANG_STRING_VALUE_FEATURE_COUNT = IDENTIFIABLE_STRING_VALUE_FEATURE_COUNT + 1;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.DescriptionImpl <em>Description</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.DescriptionImpl
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibPackageImpl#getDescription()
-     * @generated
-     */
-    int DESCRIPTION = 0;
-
-    /**
-     * The feature id for the '<em><b>Value</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int DESCRIPTION__VALUE = IDENTIFIABLE_LANG_STRING_VALUE__VALUE;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int DESCRIPTION__ID = IDENTIFIABLE_LANG_STRING_VALUE__ID;
-
-    /**
-     * The feature id for the '<em><b>Lang</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int DESCRIPTION__LANG = IDENTIFIABLE_LANG_STRING_VALUE__LANG;
-
-    /**
-     * The number of structural features of the '<em>Description</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int DESCRIPTION_FEATURE_COUNT = IDENTIFIABLE_LANG_STRING_VALUE_FEATURE_COUNT + 0;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.DisplayNameImpl <em>Display Name</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.DisplayNameImpl
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibPackageImpl#getDisplayName()
-     * @generated
-     */
-    int DISPLAY_NAME = 1;
-
-    /**
-     * The feature id for the '<em><b>Value</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int DISPLAY_NAME__VALUE = IDENTIFIABLE_LANG_STRING_VALUE__VALUE;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int DISPLAY_NAME__ID = IDENTIFIABLE_LANG_STRING_VALUE__ID;
-
-    /**
-     * The feature id for the '<em><b>Lang</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int DISPLAY_NAME__LANG = IDENTIFIABLE_LANG_STRING_VALUE__LANG;
-
-    /**
-     * The number of structural features of the '<em>Display Name</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int DISPLAY_NAME_FEATURE_COUNT = IDENTIFIABLE_LANG_STRING_VALUE_FEATURE_COUNT + 0;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.DocumentRootImpl <em>Document Root</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.DocumentRootImpl
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibPackageImpl#getDocumentRoot()
-     * @generated
-     */
-    int DOCUMENT_ROOT = 2;
-
-    /**
-     * The feature id for the '<em><b>Mixed</b></em>' attribute list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int DOCUMENT_ROOT__MIXED = 0;
-
-    /**
-     * The feature id for the '<em><b>XMLNS Prefix Map</b></em>' map.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int DOCUMENT_ROOT__XMLNS_PREFIX_MAP = 1;
-
-    /**
-     * The feature id for the '<em><b>XSI Schema Location</b></em>' map.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int DOCUMENT_ROOT__XSI_SCHEMA_LOCATION = 2;
-
-    /**
-     * The feature id for the '<em><b>Facelet Taglib</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int DOCUMENT_ROOT__FACELET_TAGLIB = 3;
-
-    /**
-     * The number of structural features of the '<em>Document Root</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int DOCUMENT_ROOT_FEATURE_COUNT = 4;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibCanonicalNameImpl <em>Canonical Name</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibCanonicalNameImpl
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibPackageImpl#getFaceletTaglibCanonicalName()
-     * @generated
-     */
-    int FACELET_TAGLIB_CANONICAL_NAME = 3;
-
-    /**
-     * The feature id for the '<em><b>Value</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_TAGLIB_CANONICAL_NAME__VALUE = 0;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_TAGLIB_CANONICAL_NAME__ID = 1;
-
-    /**
-     * The number of structural features of the '<em>Canonical Name</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_TAGLIB_CANONICAL_NAME_FEATURE_COUNT = 2;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibExtensionImpl <em>Extension</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibExtensionImpl
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibPackageImpl#getFaceletTaglibExtension()
-     * @generated
-     */
-    int FACELET_TAGLIB_EXTENSION = 4;
-
-    /**
-     * The feature id for the '<em><b>Any</b></em>' attribute list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_TAGLIB_EXTENSION__ANY = 0;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_TAGLIB_EXTENSION__ID = 1;
-
-    /**
-     * The number of structural features of the '<em>Extension</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_TAGLIB_EXTENSION_FEATURE_COUNT = 2;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.UserVisibleTaglibObjectImpl <em>User Visible Taglib Object</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.UserVisibleTaglibObjectImpl
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibPackageImpl#getUserVisibleTaglibObject()
-     * @generated
-     */
-    int USER_VISIBLE_TAGLIB_OBJECT = 25;
-
-    /**
-     * The feature id for the '<em><b>Description</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int USER_VISIBLE_TAGLIB_OBJECT__DESCRIPTION = 0;
-
-    /**
-     * The feature id for the '<em><b>Display Name</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int USER_VISIBLE_TAGLIB_OBJECT__DISPLAY_NAME = 1;
-
-    /**
-     * The feature id for the '<em><b>Icon</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int USER_VISIBLE_TAGLIB_OBJECT__ICON = 2;
-
-    /**
-     * The number of structural features of the '<em>User Visible Taglib Object</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int USER_VISIBLE_TAGLIB_OBJECT_FEATURE_COUNT = 3;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibFunctionImpl <em>Function</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibFunctionImpl
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibPackageImpl#getFaceletTaglibFunction()
-     * @generated
-     */
-    int FACELET_TAGLIB_FUNCTION = 5;
-
-    /**
-     * The feature id for the '<em><b>Description</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_TAGLIB_FUNCTION__DESCRIPTION = USER_VISIBLE_TAGLIB_OBJECT__DESCRIPTION;
-
-    /**
-     * The feature id for the '<em><b>Display Name</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_TAGLIB_FUNCTION__DISPLAY_NAME = USER_VISIBLE_TAGLIB_OBJECT__DISPLAY_NAME;
-
-    /**
-     * The feature id for the '<em><b>Icon</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_TAGLIB_FUNCTION__ICON = USER_VISIBLE_TAGLIB_OBJECT__ICON;
-
-    /**
-     * The feature id for the '<em><b>Function Name</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_TAGLIB_FUNCTION__FUNCTION_NAME = USER_VISIBLE_TAGLIB_OBJECT_FEATURE_COUNT + 0;
-
-    /**
-     * The feature id for the '<em><b>Function Class</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_TAGLIB_FUNCTION__FUNCTION_CLASS = USER_VISIBLE_TAGLIB_OBJECT_FEATURE_COUNT + 1;
-
-    /**
-     * The feature id for the '<em><b>Function Signature</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_TAGLIB_FUNCTION__FUNCTION_SIGNATURE = USER_VISIBLE_TAGLIB_OBJECT_FEATURE_COUNT + 2;
-
-    /**
-     * The number of structural features of the '<em>Function</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_TAGLIB_FUNCTION_FEATURE_COUNT = USER_VISIBLE_TAGLIB_OBJECT_FEATURE_COUNT + 3;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibTagAttributeImpl <em>Tag Attribute</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibTagAttributeImpl
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibPackageImpl#getFaceletTaglibTagAttribute()
-     * @generated
-     */
-    int FACELET_TAGLIB_TAG_ATTRIBUTE = 6;
-
-    /**
-     * The feature id for the '<em><b>Description</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_TAGLIB_TAG_ATTRIBUTE__DESCRIPTION = USER_VISIBLE_TAGLIB_OBJECT__DESCRIPTION;
-
-    /**
-     * The feature id for the '<em><b>Display Name</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_TAGLIB_TAG_ATTRIBUTE__DISPLAY_NAME = USER_VISIBLE_TAGLIB_OBJECT__DISPLAY_NAME;
-
-    /**
-     * The feature id for the '<em><b>Icon</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_TAGLIB_TAG_ATTRIBUTE__ICON = USER_VISIBLE_TAGLIB_OBJECT__ICON;
-
-    /**
-     * The feature id for the '<em><b>Name Element</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_TAGLIB_TAG_ATTRIBUTE__NAME_ELEMENT = USER_VISIBLE_TAGLIB_OBJECT_FEATURE_COUNT + 0;
-
-    /**
-     * The feature id for the '<em><b>Required Element</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_TAGLIB_TAG_ATTRIBUTE__REQUIRED_ELEMENT = USER_VISIBLE_TAGLIB_OBJECT_FEATURE_COUNT + 1;
-
-    /**
-     * The feature id for the '<em><b>Type Element</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_TAGLIB_TAG_ATTRIBUTE__TYPE_ELEMENT = USER_VISIBLE_TAGLIB_OBJECT_FEATURE_COUNT + 2;
-
-    /**
-     * The feature id for the '<em><b>Method Signature Element</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_TAGLIB_TAG_ATTRIBUTE__METHOD_SIGNATURE_ELEMENT = USER_VISIBLE_TAGLIB_OBJECT_FEATURE_COUNT + 3;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_TAGLIB_TAG_ATTRIBUTE__ID = USER_VISIBLE_TAGLIB_OBJECT_FEATURE_COUNT + 4;
-
-    /**
-     * The feature id for the '<em><b>Name</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_TAGLIB_TAG_ATTRIBUTE__NAME = USER_VISIBLE_TAGLIB_OBJECT_FEATURE_COUNT + 5;
-
-    /**
-     * The feature id for the '<em><b>Required</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_TAGLIB_TAG_ATTRIBUTE__REQUIRED = USER_VISIBLE_TAGLIB_OBJECT_FEATURE_COUNT + 6;
-
-    /**
-     * The feature id for the '<em><b>Type</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_TAGLIB_TAG_ATTRIBUTE__TYPE = USER_VISIBLE_TAGLIB_OBJECT_FEATURE_COUNT + 7;
-
-    /**
-     * The feature id for the '<em><b>Method Signature</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_TAGLIB_TAG_ATTRIBUTE__METHOD_SIGNATURE = USER_VISIBLE_TAGLIB_OBJECT_FEATURE_COUNT + 8;
-
-    /**
-     * The number of structural features of the '<em>Tag Attribute</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_TAGLIB_TAG_ATTRIBUTE_FEATURE_COUNT = USER_VISIBLE_TAGLIB_OBJECT_FEATURE_COUNT + 9;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibTagBehaviorExtensionImpl <em>Tag Behavior Extension</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibTagBehaviorExtensionImpl
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibPackageImpl#getFaceletTaglibTagBehaviorExtension()
-     * @generated
-     */
-    int FACELET_TAGLIB_TAG_BEHAVIOR_EXTENSION = 7;
-
-    /**
-     * The feature id for the '<em><b>Any</b></em>' attribute list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_TAGLIB_TAG_BEHAVIOR_EXTENSION__ANY = 0;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_TAGLIB_TAG_BEHAVIOR_EXTENSION__ID = 1;
-
-    /**
-     * The number of structural features of the '<em>Tag Behavior Extension</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_TAGLIB_TAG_BEHAVIOR_EXTENSION_FEATURE_COUNT = 2;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibTagBehaviorImpl <em>Tag Behavior</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibTagBehaviorImpl
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibPackageImpl#getFaceletTaglibTagBehavior()
-     * @generated
-     */
-    int FACELET_TAGLIB_TAG_BEHAVIOR = 8;
-
-    /**
-     * The feature id for the '<em><b>Description</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_TAGLIB_TAG_BEHAVIOR__DESCRIPTION = USER_VISIBLE_TAGLIB_OBJECT__DESCRIPTION;
-
-    /**
-     * The feature id for the '<em><b>Display Name</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_TAGLIB_TAG_BEHAVIOR__DISPLAY_NAME = USER_VISIBLE_TAGLIB_OBJECT__DISPLAY_NAME;
-
-    /**
-     * The feature id for the '<em><b>Icon</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_TAGLIB_TAG_BEHAVIOR__ICON = USER_VISIBLE_TAGLIB_OBJECT__ICON;
-
-    /**
-     * The feature id for the '<em><b>Behavior Id</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_TAGLIB_TAG_BEHAVIOR__BEHAVIOR_ID = USER_VISIBLE_TAGLIB_OBJECT_FEATURE_COUNT + 0;
-
-    /**
-     * The feature id for the '<em><b>Handler Class</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_TAGLIB_TAG_BEHAVIOR__HANDLER_CLASS = USER_VISIBLE_TAGLIB_OBJECT_FEATURE_COUNT + 1;
-
-    /**
-     * The feature id for the '<em><b>Behavior Extension</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_TAGLIB_TAG_BEHAVIOR__BEHAVIOR_EXTENSION = USER_VISIBLE_TAGLIB_OBJECT_FEATURE_COUNT + 2;
-
-    /**
-     * The number of structural features of the '<em>Tag Behavior</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_TAGLIB_TAG_BEHAVIOR_FEATURE_COUNT = USER_VISIBLE_TAGLIB_OBJECT_FEATURE_COUNT + 3;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibTagComponentExtensionImpl <em>Tag Component Extension</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibTagComponentExtensionImpl
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibPackageImpl#getFaceletTaglibTagComponentExtension()
-     * @generated
-     */
-    int FACELET_TAGLIB_TAG_COMPONENT_EXTENSION = 9;
-
-    /**
-     * The feature id for the '<em><b>Any</b></em>' attribute list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_TAGLIB_TAG_COMPONENT_EXTENSION__ANY = 0;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_TAGLIB_TAG_COMPONENT_EXTENSION__ID = 1;
-
-    /**
-     * The number of structural features of the '<em>Tag Component Extension</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_TAGLIB_TAG_COMPONENT_EXTENSION_FEATURE_COUNT = 2;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibTagComponentImpl <em>Tag Component</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibTagComponentImpl
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibPackageImpl#getFaceletTaglibTagComponent()
-     * @generated
-     */
-    int FACELET_TAGLIB_TAG_COMPONENT = 10;
-
-    /**
-     * The feature id for the '<em><b>Description</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_TAGLIB_TAG_COMPONENT__DESCRIPTION = USER_VISIBLE_TAGLIB_OBJECT__DESCRIPTION;
-
-    /**
-     * The feature id for the '<em><b>Display Name</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_TAGLIB_TAG_COMPONENT__DISPLAY_NAME = USER_VISIBLE_TAGLIB_OBJECT__DISPLAY_NAME;
-
-    /**
-     * The feature id for the '<em><b>Icon</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_TAGLIB_TAG_COMPONENT__ICON = USER_VISIBLE_TAGLIB_OBJECT__ICON;
-
-    /**
-     * The feature id for the '<em><b>Component Type</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_TAGLIB_TAG_COMPONENT__COMPONENT_TYPE = USER_VISIBLE_TAGLIB_OBJECT_FEATURE_COUNT + 0;
-
-    /**
-     * The feature id for the '<em><b>Renderer Type</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_TAGLIB_TAG_COMPONENT__RENDERER_TYPE = USER_VISIBLE_TAGLIB_OBJECT_FEATURE_COUNT + 1;
-
-    /**
-     * The feature id for the '<em><b>Handler Class</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_TAGLIB_TAG_COMPONENT__HANDLER_CLASS = USER_VISIBLE_TAGLIB_OBJECT_FEATURE_COUNT + 2;
-
-    /**
-     * The feature id for the '<em><b>Component Extension</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_TAGLIB_TAG_COMPONENT__COMPONENT_EXTENSION = USER_VISIBLE_TAGLIB_OBJECT_FEATURE_COUNT + 3;
-
-    /**
-     * The number of structural features of the '<em>Tag Component</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_TAGLIB_TAG_COMPONENT_FEATURE_COUNT = USER_VISIBLE_TAGLIB_OBJECT_FEATURE_COUNT + 4;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibTagConverterExtensionImpl <em>Tag Converter Extension</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibTagConverterExtensionImpl
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibPackageImpl#getFaceletTaglibTagConverterExtension()
-     * @generated
-     */
-    int FACELET_TAGLIB_TAG_CONVERTER_EXTENSION = 11;
-
-    /**
-     * The feature id for the '<em><b>Any</b></em>' attribute list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_TAGLIB_TAG_CONVERTER_EXTENSION__ANY = 0;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_TAGLIB_TAG_CONVERTER_EXTENSION__ID = 1;
-
-    /**
-     * The number of structural features of the '<em>Tag Converter Extension</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_TAGLIB_TAG_CONVERTER_EXTENSION_FEATURE_COUNT = 2;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibTagConverterImpl <em>Tag Converter</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibTagConverterImpl
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibPackageImpl#getFaceletTaglibTagConverter()
-     * @generated
-     */
-    int FACELET_TAGLIB_TAG_CONVERTER = 12;
-
-    /**
-     * The feature id for the '<em><b>Description</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_TAGLIB_TAG_CONVERTER__DESCRIPTION = USER_VISIBLE_TAGLIB_OBJECT__DESCRIPTION;
-
-    /**
-     * The feature id for the '<em><b>Display Name</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_TAGLIB_TAG_CONVERTER__DISPLAY_NAME = USER_VISIBLE_TAGLIB_OBJECT__DISPLAY_NAME;
-
-    /**
-     * The feature id for the '<em><b>Icon</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_TAGLIB_TAG_CONVERTER__ICON = USER_VISIBLE_TAGLIB_OBJECT__ICON;
-
-    /**
-     * The feature id for the '<em><b>Converter Id</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_TAGLIB_TAG_CONVERTER__CONVERTER_ID = USER_VISIBLE_TAGLIB_OBJECT_FEATURE_COUNT + 0;
-
-    /**
-     * The feature id for the '<em><b>Handler Class</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_TAGLIB_TAG_CONVERTER__HANDLER_CLASS = USER_VISIBLE_TAGLIB_OBJECT_FEATURE_COUNT + 1;
-
-    /**
-     * The feature id for the '<em><b>Converter Extension</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_TAGLIB_TAG_CONVERTER__CONVERTER_EXTENSION = USER_VISIBLE_TAGLIB_OBJECT_FEATURE_COUNT + 2;
-
-    /**
-     * The number of structural features of the '<em>Tag Converter</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_TAGLIB_TAG_CONVERTER_FEATURE_COUNT = USER_VISIBLE_TAGLIB_OBJECT_FEATURE_COUNT + 3;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibTagExtensionImpl <em>Tag Extension</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibTagExtensionImpl
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibPackageImpl#getFaceletTaglibTagExtension()
-     * @generated
-     */
-    int FACELET_TAGLIB_TAG_EXTENSION = 13;
-
-    /**
-     * The feature id for the '<em><b>Any</b></em>' attribute list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_TAGLIB_TAG_EXTENSION__ANY = 0;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_TAGLIB_TAG_EXTENSION__ID = 1;
-
-    /**
-     * The number of structural features of the '<em>Tag Extension</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_TAGLIB_TAG_EXTENSION_FEATURE_COUNT = 2;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibTagImpl <em>Tag</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibTagImpl
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibPackageImpl#getFaceletTaglibTag()
-     * @generated
-     */
-    int FACELET_TAGLIB_TAG = 14;
-
-    /**
-     * The feature id for the '<em><b>Description</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_TAGLIB_TAG__DESCRIPTION = USER_VISIBLE_TAGLIB_OBJECT__DESCRIPTION;
-
-    /**
-     * The feature id for the '<em><b>Display Name</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_TAGLIB_TAG__DISPLAY_NAME = USER_VISIBLE_TAGLIB_OBJECT__DISPLAY_NAME;
-
-    /**
-     * The feature id for the '<em><b>Icon</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_TAGLIB_TAG__ICON = USER_VISIBLE_TAGLIB_OBJECT__ICON;
-
-    /**
-     * The feature id for the '<em><b>Tag Name Element</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_TAGLIB_TAG__TAG_NAME_ELEMENT = USER_VISIBLE_TAGLIB_OBJECT_FEATURE_COUNT + 0;
-
-    /**
-     * The feature id for the '<em><b>Handler Class Element</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_TAGLIB_TAG__HANDLER_CLASS_ELEMENT = USER_VISIBLE_TAGLIB_OBJECT_FEATURE_COUNT + 1;
-
-    /**
-     * The feature id for the '<em><b>Behavior</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_TAGLIB_TAG__BEHAVIOR = USER_VISIBLE_TAGLIB_OBJECT_FEATURE_COUNT + 2;
-
-    /**
-     * The feature id for the '<em><b>Component</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_TAGLIB_TAG__COMPONENT = USER_VISIBLE_TAGLIB_OBJECT_FEATURE_COUNT + 3;
-
-    /**
-     * The feature id for the '<em><b>Converter</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_TAGLIB_TAG__CONVERTER = USER_VISIBLE_TAGLIB_OBJECT_FEATURE_COUNT + 4;
-
-    /**
-     * The feature id for the '<em><b>Validator</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_TAGLIB_TAG__VALIDATOR = USER_VISIBLE_TAGLIB_OBJECT_FEATURE_COUNT + 5;
-
-    /**
-     * The feature id for the '<em><b>Source</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_TAGLIB_TAG__SOURCE = USER_VISIBLE_TAGLIB_OBJECT_FEATURE_COUNT + 6;
-
-    /**
-     * The feature id for the '<em><b>Attribute</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_TAGLIB_TAG__ATTRIBUTE = USER_VISIBLE_TAGLIB_OBJECT_FEATURE_COUNT + 7;
-
-    /**
-     * The feature id for the '<em><b>Tag Extension</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_TAGLIB_TAG__TAG_EXTENSION = USER_VISIBLE_TAGLIB_OBJECT_FEATURE_COUNT + 8;
-
-    /**
-     * The feature id for the '<em><b>Tag Name</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_TAGLIB_TAG__TAG_NAME = USER_VISIBLE_TAGLIB_OBJECT_FEATURE_COUNT + 9;
-
-    /**
-     * The feature id for the '<em><b>Handler Class</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_TAGLIB_TAG__HANDLER_CLASS = USER_VISIBLE_TAGLIB_OBJECT_FEATURE_COUNT + 10;
-
-    /**
-     * The number of structural features of the '<em>Tag</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_TAGLIB_TAG_FEATURE_COUNT = USER_VISIBLE_TAGLIB_OBJECT_FEATURE_COUNT + 11;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibTagValidatorExtensionImpl <em>Tag Validator Extension</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibTagValidatorExtensionImpl
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibPackageImpl#getFaceletTaglibTagValidatorExtension()
-     * @generated
-     */
-    int FACELET_TAGLIB_TAG_VALIDATOR_EXTENSION = 15;
-
-    /**
-     * The feature id for the '<em><b>Any</b></em>' attribute list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_TAGLIB_TAG_VALIDATOR_EXTENSION__ANY = 0;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_TAGLIB_TAG_VALIDATOR_EXTENSION__ID = 1;
-
-    /**
-     * The number of structural features of the '<em>Tag Validator Extension</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_TAGLIB_TAG_VALIDATOR_EXTENSION_FEATURE_COUNT = 2;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibTagValidatorImpl <em>Tag Validator</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibTagValidatorImpl
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibPackageImpl#getFaceletTaglibTagValidator()
-     * @generated
-     */
-    int FACELET_TAGLIB_TAG_VALIDATOR = 16;
-
-    /**
-     * The feature id for the '<em><b>Description</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_TAGLIB_TAG_VALIDATOR__DESCRIPTION = USER_VISIBLE_TAGLIB_OBJECT__DESCRIPTION;
-
-    /**
-     * The feature id for the '<em><b>Display Name</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_TAGLIB_TAG_VALIDATOR__DISPLAY_NAME = USER_VISIBLE_TAGLIB_OBJECT__DISPLAY_NAME;
-
-    /**
-     * The feature id for the '<em><b>Icon</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_TAGLIB_TAG_VALIDATOR__ICON = USER_VISIBLE_TAGLIB_OBJECT__ICON;
-
-    /**
-     * The feature id for the '<em><b>Validator Id</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_TAGLIB_TAG_VALIDATOR__VALIDATOR_ID = USER_VISIBLE_TAGLIB_OBJECT_FEATURE_COUNT + 0;
-
-    /**
-     * The feature id for the '<em><b>Handler Class</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_TAGLIB_TAG_VALIDATOR__HANDLER_CLASS = USER_VISIBLE_TAGLIB_OBJECT_FEATURE_COUNT + 1;
-
-    /**
-     * The feature id for the '<em><b>Validator Extension</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_TAGLIB_TAG_VALIDATOR__VALIDATOR_EXTENSION = USER_VISIBLE_TAGLIB_OBJECT_FEATURE_COUNT + 2;
-
-    /**
-     * The number of structural features of the '<em>Tag Validator</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_TAGLIB_TAG_VALIDATOR_FEATURE_COUNT = USER_VISIBLE_TAGLIB_OBJECT_FEATURE_COUNT + 3;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibImpl <em>Facelet Taglib</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibImpl
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibPackageImpl#getFaceletTaglib()
-     * @generated
-     */
-    int FACELET_TAGLIB = 17;
-
-    /**
-     * The feature id for the '<em><b>Description</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_TAGLIB__DESCRIPTION = USER_VISIBLE_TAGLIB_OBJECT__DESCRIPTION;
-
-    /**
-     * The feature id for the '<em><b>Display Name</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_TAGLIB__DISPLAY_NAME = USER_VISIBLE_TAGLIB_OBJECT__DISPLAY_NAME;
-
-    /**
-     * The feature id for the '<em><b>Icon</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_TAGLIB__ICON = USER_VISIBLE_TAGLIB_OBJECT__ICON;
-
-    /**
-     * The feature id for the '<em><b>Library Class</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_TAGLIB__LIBRARY_CLASS = USER_VISIBLE_TAGLIB_OBJECT_FEATURE_COUNT + 0;
-
-    /**
-     * The feature id for the '<em><b>Namespace</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_TAGLIB__NAMESPACE = USER_VISIBLE_TAGLIB_OBJECT_FEATURE_COUNT + 1;
-
-    /**
-     * The feature id for the '<em><b>Composite Library Name</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_TAGLIB__COMPOSITE_LIBRARY_NAME = USER_VISIBLE_TAGLIB_OBJECT_FEATURE_COUNT + 2;
-
-    /**
-     * The feature id for the '<em><b>Group</b></em>' attribute list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_TAGLIB__GROUP = USER_VISIBLE_TAGLIB_OBJECT_FEATURE_COUNT + 3;
-
-    /**
-     * The feature id for the '<em><b>Tag</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_TAGLIB__TAG = USER_VISIBLE_TAGLIB_OBJECT_FEATURE_COUNT + 4;
-
-    /**
-     * The feature id for the '<em><b>Function</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_TAGLIB__FUNCTION = USER_VISIBLE_TAGLIB_OBJECT_FEATURE_COUNT + 5;
-
-    /**
-     * The feature id for the '<em><b>Taglib Extension</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_TAGLIB__TAGLIB_EXTENSION = USER_VISIBLE_TAGLIB_OBJECT_FEATURE_COUNT + 6;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_TAGLIB__ID = USER_VISIBLE_TAGLIB_OBJECT_FEATURE_COUNT + 7;
-
-    /**
-     * The feature id for the '<em><b>Version</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_TAGLIB__VERSION = USER_VISIBLE_TAGLIB_OBJECT_FEATURE_COUNT + 8;
-
-    /**
-     * The feature id for the '<em><b>Namespace Uri</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_TAGLIB__NAMESPACE_URI = USER_VISIBLE_TAGLIB_OBJECT_FEATURE_COUNT + 9;
-
-    /**
-     * The number of structural features of the '<em>Facelet Taglib</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_TAGLIB_FEATURE_COUNT = USER_VISIBLE_TAGLIB_OBJECT_FEATURE_COUNT + 10;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FullyQualifiedClassImpl <em>Fully Qualified Class</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FullyQualifiedClassImpl
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibPackageImpl#getFullyQualifiedClass()
-     * @generated
-     */
-    int FULLY_QUALIFIED_CLASS = 18;
-
-    /**
-     * The feature id for the '<em><b>Value</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FULLY_QUALIFIED_CLASS__VALUE = IDENTIFIABLE_STRING_VALUE__VALUE;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FULLY_QUALIFIED_CLASS__ID = IDENTIFIABLE_STRING_VALUE__ID;
-
-    /**
-     * The number of structural features of the '<em>Fully Qualified Class</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FULLY_QUALIFIED_CLASS_FEATURE_COUNT = IDENTIFIABLE_STRING_VALUE_FEATURE_COUNT + 0;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.GenericBooleanImpl <em>Generic Boolean</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.GenericBooleanImpl
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibPackageImpl#getGenericBoolean()
-     * @generated
-     */
-    int GENERIC_BOOLEAN = 19;
-
-    /**
-     * The feature id for the '<em><b>Value</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int GENERIC_BOOLEAN__VALUE = IDENTIFIABLE_STRING_VALUE__VALUE;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int GENERIC_BOOLEAN__ID = IDENTIFIABLE_STRING_VALUE__ID;
-
-    /**
-     * The number of structural features of the '<em>Generic Boolean</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int GENERIC_BOOLEAN_FEATURE_COUNT = IDENTIFIABLE_STRING_VALUE_FEATURE_COUNT + 0;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.IconImpl <em>Icon</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.IconImpl
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibPackageImpl#getIcon()
-     * @generated
-     */
-    int ICON = 20;
-
-    /**
-     * The feature id for the '<em><b>Small Icon</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int ICON__SMALL_ICON = 0;
-
-    /**
-     * The feature id for the '<em><b>Large Icon</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int ICON__LARGE_ICON = 1;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int ICON__ID = 2;
-
-    /**
-     * The feature id for the '<em><b>Lang</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int ICON__LANG = 3;
-
-    /**
-     * The number of structural features of the '<em>Icon</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int ICON_FEATURE_COUNT = 4;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.JavaIdentifierImpl <em>Java Identifier</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.JavaIdentifierImpl
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibPackageImpl#getJavaIdentifier()
-     * @generated
-     */
-    int JAVA_IDENTIFIER = 21;
-
-    /**
-     * The feature id for the '<em><b>Value</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int JAVA_IDENTIFIER__VALUE = IDENTIFIABLE_STRING_VALUE__VALUE;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int JAVA_IDENTIFIER__ID = IDENTIFIABLE_STRING_VALUE__ID;
-
-    /**
-     * The number of structural features of the '<em>Java Identifier</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int JAVA_IDENTIFIER_FEATURE_COUNT = IDENTIFIABLE_STRING_VALUE_FEATURE_COUNT + 0;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.PathImpl <em>Path</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.PathImpl
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibPackageImpl#getPath()
-     * @generated
-     */
-    int PATH = 22;
-
-    /**
-     * The feature id for the '<em><b>Value</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int PATH__VALUE = IDENTIFIABLE_STRING_VALUE__VALUE;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int PATH__ID = IDENTIFIABLE_STRING_VALUE__ID;
-
-    /**
-     * The number of structural features of the '<em>Path</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int PATH_FEATURE_COUNT = IDENTIFIABLE_STRING_VALUE_FEATURE_COUNT + 0;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibVersion <em>Version</em>}' enum.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibVersion
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibPackageImpl#getFaceletTaglibVersion()
-     * @generated
-     */
-    int FACELET_TAGLIB_VERSION = 26;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.GenericBooleanBase <em>Generic Boolean Base</em>}' enum.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.GenericBooleanBase
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibPackageImpl#getGenericBooleanBase()
-     * @generated
-     */
-    int GENERIC_BOOLEAN_BASE = 27;
-
-    /**
-     * The meta object id for the '<em>Version Type Object</em>' data type.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibVersion
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibPackageImpl#getFaceletTaglibVersionTypeObject()
-     * @generated
-     */
-    int FACELET_TAGLIB_VERSION_TYPE_OBJECT = 28;
-
-    /**
-     * The meta object id for the '<em>Fully Qualified Class Base</em>' data type.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see java.lang.String
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibPackageImpl#getFullyQualifiedClassBase()
-     * @generated
-     */
-    int FULLY_QUALIFIED_CLASS_BASE = 29;
-
-    /**
-     * The meta object id for the '<em>Java Identifier Base</em>' data type.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see java.lang.String
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibPackageImpl#getJavaIdentifierBase()
-     * @generated
-     */
-    int JAVA_IDENTIFIER_BASE = 30;
-
-    /**
-     * The meta object id for the '<em>Path Type Base</em>' data type.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see java.lang.String
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibPackageImpl#getPathTypeBase()
-     * @generated
-     */
-    int PATH_TYPE_BASE = 31;
-
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.Description <em>Description</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Description</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.Description
-     * @generated
-     */
-    EClass getDescription();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.DisplayName <em>Display Name</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Display Name</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.DisplayName
-     * @generated
-     */
-    EClass getDisplayName();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.DocumentRoot <em>Document Root</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Document Root</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.DocumentRoot
-     * @generated
-     */
-    EClass getDocumentRoot();
-
-    /**
-     * Returns the meta object for the attribute list '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.DocumentRoot#getMixed <em>Mixed</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute list '<em>Mixed</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.DocumentRoot#getMixed()
-     * @see #getDocumentRoot()
-     * @generated
-     */
-    EAttribute getDocumentRoot_Mixed();
-
-    /**
-     * Returns the meta object for the map '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.DocumentRoot#getXMLNSPrefixMap <em>XMLNS Prefix Map</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the map '<em>XMLNS Prefix Map</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.DocumentRoot#getXMLNSPrefixMap()
-     * @see #getDocumentRoot()
-     * @generated
-     */
-    EReference getDocumentRoot_XMLNSPrefixMap();
-
-    /**
-     * Returns the meta object for the map '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.DocumentRoot#getXSISchemaLocation <em>XSI Schema Location</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the map '<em>XSI Schema Location</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.DocumentRoot#getXSISchemaLocation()
-     * @see #getDocumentRoot()
-     * @generated
-     */
-    EReference getDocumentRoot_XSISchemaLocation();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.DocumentRoot#getFaceletTaglib <em>Facelet Taglib</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Facelet Taglib</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.DocumentRoot#getFaceletTaglib()
-     * @see #getDocumentRoot()
-     * @generated
-     */
-    EReference getDocumentRoot_FaceletTaglib();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibCanonicalName <em>Canonical Name</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Canonical Name</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibCanonicalName
-     * @generated
-     */
-    EClass getFaceletTaglibCanonicalName();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibCanonicalName#getValue <em>Value</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Value</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibCanonicalName#getValue()
-     * @see #getFaceletTaglibCanonicalName()
-     * @generated
-     */
-    EAttribute getFaceletTaglibCanonicalName_Value();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibCanonicalName#getId <em>Id</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Id</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibCanonicalName#getId()
-     * @see #getFaceletTaglibCanonicalName()
-     * @generated
-     */
-    EAttribute getFaceletTaglibCanonicalName_Id();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibExtension <em>Extension</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Extension</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibExtension
-     * @generated
-     */
-    EClass getFaceletTaglibExtension();
-
-    /**
-     * Returns the meta object for the attribute list '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibExtension#getAny <em>Any</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute list '<em>Any</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibExtension#getAny()
-     * @see #getFaceletTaglibExtension()
-     * @generated
-     */
-    EAttribute getFaceletTaglibExtension_Any();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibExtension#getId <em>Id</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Id</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibExtension#getId()
-     * @see #getFaceletTaglibExtension()
-     * @generated
-     */
-    EAttribute getFaceletTaglibExtension_Id();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibFunction <em>Function</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Function</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibFunction
-     * @generated
-     */
-    EClass getFaceletTaglibFunction();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibFunction#getFunctionName <em>Function Name</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Function Name</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibFunction#getFunctionName()
-     * @see #getFaceletTaglibFunction()
-     * @generated
-     */
-    EReference getFaceletTaglibFunction_FunctionName();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibFunction#getFunctionClass <em>Function Class</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Function Class</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibFunction#getFunctionClass()
-     * @see #getFaceletTaglibFunction()
-     * @generated
-     */
-    EReference getFaceletTaglibFunction_FunctionClass();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibFunction#getFunctionSignature <em>Function Signature</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Function Signature</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibFunction#getFunctionSignature()
-     * @see #getFaceletTaglibFunction()
-     * @generated
-     */
-    EReference getFaceletTaglibFunction_FunctionSignature();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagAttribute <em>Tag Attribute</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Tag Attribute</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagAttribute
-     * @generated
-     */
-    EClass getFaceletTaglibTagAttribute();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagAttribute#getNameElement <em>Name Element</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Name Element</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagAttribute#getNameElement()
-     * @see #getFaceletTaglibTagAttribute()
-     * @generated
-     */
-    EReference getFaceletTaglibTagAttribute_NameElement();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagAttribute#getRequiredElement <em>Required Element</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Required Element</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagAttribute#getRequiredElement()
-     * @see #getFaceletTaglibTagAttribute()
-     * @generated
-     */
-    EReference getFaceletTaglibTagAttribute_RequiredElement();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagAttribute#getTypeElement <em>Type Element</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Type Element</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagAttribute#getTypeElement()
-     * @see #getFaceletTaglibTagAttribute()
-     * @generated
-     */
-    EReference getFaceletTaglibTagAttribute_TypeElement();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagAttribute#getMethodSignatureElement <em>Method Signature Element</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Method Signature Element</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagAttribute#getMethodSignatureElement()
-     * @see #getFaceletTaglibTagAttribute()
-     * @generated
-     */
-    EReference getFaceletTaglibTagAttribute_MethodSignatureElement();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagAttribute#getId <em>Id</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Id</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagAttribute#getId()
-     * @see #getFaceletTaglibTagAttribute()
-     * @generated
-     */
-    EAttribute getFaceletTaglibTagAttribute_Id();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagAttribute#getName <em>Name</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Name</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagAttribute#getName()
-     * @see #getFaceletTaglibTagAttribute()
-     * @generated
-     */
-    EAttribute getFaceletTaglibTagAttribute_Name();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagAttribute#isRequired <em>Required</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Required</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagAttribute#isRequired()
-     * @see #getFaceletTaglibTagAttribute()
-     * @generated
-     */
-    EAttribute getFaceletTaglibTagAttribute_Required();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagAttribute#getType <em>Type</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Type</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagAttribute#getType()
-     * @see #getFaceletTaglibTagAttribute()
-     * @generated
-     */
-    EAttribute getFaceletTaglibTagAttribute_Type();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagAttribute#getMethodSignature <em>Method Signature</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Method Signature</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagAttribute#getMethodSignature()
-     * @see #getFaceletTaglibTagAttribute()
-     * @generated
-     */
-    EAttribute getFaceletTaglibTagAttribute_MethodSignature();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagBehaviorExtension <em>Tag Behavior Extension</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Tag Behavior Extension</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagBehaviorExtension
-     * @generated
-     */
-    EClass getFaceletTaglibTagBehaviorExtension();
-
-    /**
-     * Returns the meta object for the attribute list '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagBehaviorExtension#getAny <em>Any</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute list '<em>Any</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagBehaviorExtension#getAny()
-     * @see #getFaceletTaglibTagBehaviorExtension()
-     * @generated
-     */
-    EAttribute getFaceletTaglibTagBehaviorExtension_Any();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagBehaviorExtension#getId <em>Id</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Id</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagBehaviorExtension#getId()
-     * @see #getFaceletTaglibTagBehaviorExtension()
-     * @generated
-     */
-    EAttribute getFaceletTaglibTagBehaviorExtension_Id();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagBehavior <em>Tag Behavior</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Tag Behavior</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagBehavior
-     * @generated
-     */
-    EClass getFaceletTaglibTagBehavior();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagBehavior#getBehaviorId <em>Behavior Id</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Behavior Id</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagBehavior#getBehaviorId()
-     * @see #getFaceletTaglibTagBehavior()
-     * @generated
-     */
-    EReference getFaceletTaglibTagBehavior_BehaviorId();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagBehavior#getHandlerClass <em>Handler Class</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Handler Class</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagBehavior#getHandlerClass()
-     * @see #getFaceletTaglibTagBehavior()
-     * @generated
-     */
-    EReference getFaceletTaglibTagBehavior_HandlerClass();
-
-    /**
-     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagBehavior#getBehaviorExtension <em>Behavior Extension</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the containment reference list '<em>Behavior Extension</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagBehavior#getBehaviorExtension()
-     * @see #getFaceletTaglibTagBehavior()
-     * @generated
-     */
-    EReference getFaceletTaglibTagBehavior_BehaviorExtension();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagComponentExtension <em>Tag Component Extension</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Tag Component Extension</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagComponentExtension
-     * @generated
-     */
-    EClass getFaceletTaglibTagComponentExtension();
-
-    /**
-     * Returns the meta object for the attribute list '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagComponentExtension#getAny <em>Any</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute list '<em>Any</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagComponentExtension#getAny()
-     * @see #getFaceletTaglibTagComponentExtension()
-     * @generated
-     */
-    EAttribute getFaceletTaglibTagComponentExtension_Any();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagComponentExtension#getId <em>Id</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Id</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagComponentExtension#getId()
-     * @see #getFaceletTaglibTagComponentExtension()
-     * @generated
-     */
-    EAttribute getFaceletTaglibTagComponentExtension_Id();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagComponent <em>Tag Component</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Tag Component</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagComponent
-     * @generated
-     */
-    EClass getFaceletTaglibTagComponent();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagComponent#getComponentType <em>Component Type</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Component Type</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagComponent#getComponentType()
-     * @see #getFaceletTaglibTagComponent()
-     * @generated
-     */
-    EReference getFaceletTaglibTagComponent_ComponentType();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagComponent#getRendererType <em>Renderer Type</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Renderer Type</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagComponent#getRendererType()
-     * @see #getFaceletTaglibTagComponent()
-     * @generated
-     */
-    EReference getFaceletTaglibTagComponent_RendererType();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagComponent#getHandlerClass <em>Handler Class</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Handler Class</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagComponent#getHandlerClass()
-     * @see #getFaceletTaglibTagComponent()
-     * @generated
-     */
-    EReference getFaceletTaglibTagComponent_HandlerClass();
-
-    /**
-     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagComponent#getComponentExtension <em>Component Extension</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the containment reference list '<em>Component Extension</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagComponent#getComponentExtension()
-     * @see #getFaceletTaglibTagComponent()
-     * @generated
-     */
-    EReference getFaceletTaglibTagComponent_ComponentExtension();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagConverterExtension <em>Tag Converter Extension</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Tag Converter Extension</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagConverterExtension
-     * @generated
-     */
-    EClass getFaceletTaglibTagConverterExtension();
-
-    /**
-     * Returns the meta object for the attribute list '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagConverterExtension#getAny <em>Any</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute list '<em>Any</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagConverterExtension#getAny()
-     * @see #getFaceletTaglibTagConverterExtension()
-     * @generated
-     */
-    EAttribute getFaceletTaglibTagConverterExtension_Any();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagConverterExtension#getId <em>Id</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Id</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagConverterExtension#getId()
-     * @see #getFaceletTaglibTagConverterExtension()
-     * @generated
-     */
-    EAttribute getFaceletTaglibTagConverterExtension_Id();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagConverter <em>Tag Converter</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Tag Converter</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagConverter
-     * @generated
-     */
-    EClass getFaceletTaglibTagConverter();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagConverter#getConverterId <em>Converter Id</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Converter Id</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagConverter#getConverterId()
-     * @see #getFaceletTaglibTagConverter()
-     * @generated
-     */
-    EReference getFaceletTaglibTagConverter_ConverterId();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagConverter#getHandlerClass <em>Handler Class</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Handler Class</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagConverter#getHandlerClass()
-     * @see #getFaceletTaglibTagConverter()
-     * @generated
-     */
-    EReference getFaceletTaglibTagConverter_HandlerClass();
-
-    /**
-     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagConverter#getConverterExtension <em>Converter Extension</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the containment reference list '<em>Converter Extension</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagConverter#getConverterExtension()
-     * @see #getFaceletTaglibTagConverter()
-     * @generated
-     */
-    EReference getFaceletTaglibTagConverter_ConverterExtension();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagExtension <em>Tag Extension</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Tag Extension</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagExtension
-     * @generated
-     */
-    EClass getFaceletTaglibTagExtension();
-
-    /**
-     * Returns the meta object for the attribute list '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagExtension#getAny <em>Any</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute list '<em>Any</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagExtension#getAny()
-     * @see #getFaceletTaglibTagExtension()
-     * @generated
-     */
-    EAttribute getFaceletTaglibTagExtension_Any();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagExtension#getId <em>Id</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Id</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagExtension#getId()
-     * @see #getFaceletTaglibTagExtension()
-     * @generated
-     */
-    EAttribute getFaceletTaglibTagExtension_Id();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTag <em>Tag</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Tag</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTag
-     * @generated
-     */
-    EClass getFaceletTaglibTag();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTag#getTagNameElement <em>Tag Name Element</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Tag Name Element</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTag#getTagNameElement()
-     * @see #getFaceletTaglibTag()
-     * @generated
-     */
-    EReference getFaceletTaglibTag_TagNameElement();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTag#getHandlerClassElement <em>Handler Class Element</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Handler Class Element</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTag#getHandlerClassElement()
-     * @see #getFaceletTaglibTag()
-     * @generated
-     */
-    EReference getFaceletTaglibTag_HandlerClassElement();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTag#getBehavior <em>Behavior</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Behavior</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTag#getBehavior()
-     * @see #getFaceletTaglibTag()
-     * @generated
-     */
-    EReference getFaceletTaglibTag_Behavior();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTag#getComponent <em>Component</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Component</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTag#getComponent()
-     * @see #getFaceletTaglibTag()
-     * @generated
-     */
-    EReference getFaceletTaglibTag_Component();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTag#getConverter <em>Converter</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Converter</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTag#getConverter()
-     * @see #getFaceletTaglibTag()
-     * @generated
-     */
-    EReference getFaceletTaglibTag_Converter();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTag#getValidator <em>Validator</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Validator</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTag#getValidator()
-     * @see #getFaceletTaglibTag()
-     * @generated
-     */
-    EReference getFaceletTaglibTag_Validator();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTag#getSource <em>Source</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Source</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTag#getSource()
-     * @see #getFaceletTaglibTag()
-     * @generated
-     */
-    EReference getFaceletTaglibTag_Source();
-
-    /**
-     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTag#getAttribute <em>Attribute</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the containment reference list '<em>Attribute</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTag#getAttribute()
-     * @see #getFaceletTaglibTag()
-     * @generated
-     */
-    EReference getFaceletTaglibTag_Attribute();
-
-    /**
-     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTag#getTagExtension <em>Tag Extension</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the containment reference list '<em>Tag Extension</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTag#getTagExtension()
-     * @see #getFaceletTaglibTag()
-     * @generated
-     */
-    EReference getFaceletTaglibTag_TagExtension();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTag#getTagName <em>Tag Name</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Tag Name</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTag#getTagName()
-     * @see #getFaceletTaglibTag()
-     * @generated
-     */
-    EAttribute getFaceletTaglibTag_TagName();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTag#getHandlerClass <em>Handler Class</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Handler Class</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTag#getHandlerClass()
-     * @see #getFaceletTaglibTag()
-     * @generated
-     */
-    EAttribute getFaceletTaglibTag_HandlerClass();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagValidatorExtension <em>Tag Validator Extension</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Tag Validator Extension</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagValidatorExtension
-     * @generated
-     */
-    EClass getFaceletTaglibTagValidatorExtension();
-
-    /**
-     * Returns the meta object for the attribute list '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagValidatorExtension#getAny <em>Any</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute list '<em>Any</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagValidatorExtension#getAny()
-     * @see #getFaceletTaglibTagValidatorExtension()
-     * @generated
-     */
-    EAttribute getFaceletTaglibTagValidatorExtension_Any();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagValidatorExtension#getId <em>Id</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Id</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagValidatorExtension#getId()
-     * @see #getFaceletTaglibTagValidatorExtension()
-     * @generated
-     */
-    EAttribute getFaceletTaglibTagValidatorExtension_Id();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagValidator <em>Tag Validator</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Tag Validator</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagValidator
-     * @generated
-     */
-    EClass getFaceletTaglibTagValidator();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagValidator#getValidatorId <em>Validator Id</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Validator Id</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagValidator#getValidatorId()
-     * @see #getFaceletTaglibTagValidator()
-     * @generated
-     */
-    EReference getFaceletTaglibTagValidator_ValidatorId();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagValidator#getHandlerClass <em>Handler Class</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Handler Class</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagValidator#getHandlerClass()
-     * @see #getFaceletTaglibTagValidator()
-     * @generated
-     */
-    EReference getFaceletTaglibTagValidator_HandlerClass();
-
-    /**
-     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagValidator#getValidatorExtension <em>Validator Extension</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the containment reference list '<em>Validator Extension</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagValidator#getValidatorExtension()
-     * @see #getFaceletTaglibTagValidator()
-     * @generated
-     */
-    EReference getFaceletTaglibTagValidator_ValidatorExtension();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglib <em>Facelet Taglib</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Facelet Taglib</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglib
-     * @generated
-     */
-    EClass getFaceletTaglib();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglib#getLibraryClass <em>Library Class</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Library Class</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglib#getLibraryClass()
-     * @see #getFaceletTaglib()
-     * @generated
-     */
-    EReference getFaceletTaglib_LibraryClass();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglib#getNamespace <em>Namespace</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Namespace</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglib#getNamespace()
-     * @see #getFaceletTaglib()
-     * @generated
-     */
-    EReference getFaceletTaglib_Namespace();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglib#getCompositeLibraryName <em>Composite Library Name</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Composite Library Name</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglib#getCompositeLibraryName()
-     * @see #getFaceletTaglib()
-     * @generated
-     */
-    EReference getFaceletTaglib_CompositeLibraryName();
-
-    /**
-     * Returns the meta object for the attribute list '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglib#getGroup <em>Group</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute list '<em>Group</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglib#getGroup()
-     * @see #getFaceletTaglib()
-     * @generated
-     */
-    EAttribute getFaceletTaglib_Group();
-
-    /**
-     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglib#getTag <em>Tag</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the containment reference list '<em>Tag</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglib#getTag()
-     * @see #getFaceletTaglib()
-     * @generated
-     */
-    EReference getFaceletTaglib_Tag();
-
-    /**
-     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglib#getFunction <em>Function</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the containment reference list '<em>Function</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglib#getFunction()
-     * @see #getFaceletTaglib()
-     * @generated
-     */
-    EReference getFaceletTaglib_Function();
-
-    /**
-     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglib#getTaglibExtension <em>Taglib Extension</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the containment reference list '<em>Taglib Extension</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglib#getTaglibExtension()
-     * @see #getFaceletTaglib()
-     * @generated
-     */
-    EReference getFaceletTaglib_TaglibExtension();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglib#getId <em>Id</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Id</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglib#getId()
-     * @see #getFaceletTaglib()
-     * @generated
-     */
-    EAttribute getFaceletTaglib_Id();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglib#getVersion <em>Version</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Version</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglib#getVersion()
-     * @see #getFaceletTaglib()
-     * @generated
-     */
-    EAttribute getFaceletTaglib_Version();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglib#getNamespaceUri <em>Namespace Uri</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Namespace Uri</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglib#getNamespaceUri()
-     * @see #getFaceletTaglib()
-     * @generated
-     */
-    EAttribute getFaceletTaglib_NamespaceUri();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FullyQualifiedClass <em>Fully Qualified Class</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Fully Qualified Class</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FullyQualifiedClass
-     * @generated
-     */
-    EClass getFullyQualifiedClass();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.GenericBoolean <em>Generic Boolean</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Generic Boolean</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.GenericBoolean
-     * @generated
-     */
-    EClass getGenericBoolean();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.Icon <em>Icon</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Icon</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.Icon
-     * @generated
-     */
-    EClass getIcon();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.Icon#getSmallIcon <em>Small Icon</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Small Icon</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.Icon#getSmallIcon()
-     * @see #getIcon()
-     * @generated
-     */
-    EReference getIcon_SmallIcon();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.Icon#getLargeIcon <em>Large Icon</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Large Icon</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.Icon#getLargeIcon()
-     * @see #getIcon()
-     * @generated
-     */
-    EReference getIcon_LargeIcon();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.Icon#getId <em>Id</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Id</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.Icon#getId()
-     * @see #getIcon()
-     * @generated
-     */
-    EAttribute getIcon_Id();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.Icon#getLang <em>Lang</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Lang</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.Icon#getLang()
-     * @see #getIcon()
-     * @generated
-     */
-    EAttribute getIcon_Lang();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.JavaIdentifier <em>Java Identifier</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Java Identifier</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.JavaIdentifier
-     * @generated
-     */
-    EClass getJavaIdentifier();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.Path <em>Path</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Path</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.Path
-     * @generated
-     */
-    EClass getPath();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.IdentifiableStringValue <em>Identifiable String Value</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Identifiable String Value</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.IdentifiableStringValue
-     * @generated
-     */
-    EClass getIdentifiableStringValue();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.IdentifiableStringValue#getValue <em>Value</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Value</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.IdentifiableStringValue#getValue()
-     * @see #getIdentifiableStringValue()
-     * @generated
-     */
-    EAttribute getIdentifiableStringValue_Value();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.IdentifiableStringValue#getId <em>Id</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Id</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.IdentifiableStringValue#getId()
-     * @see #getIdentifiableStringValue()
-     * @generated
-     */
-    EAttribute getIdentifiableStringValue_Id();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.IdentifiableLangStringValue <em>Identifiable Lang String Value</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Identifiable Lang String Value</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.IdentifiableLangStringValue
-     * @generated
-     */
-    EClass getIdentifiableLangStringValue();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.IdentifiableLangStringValue#getLang <em>Lang</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Lang</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.IdentifiableLangStringValue#getLang()
-     * @see #getIdentifiableLangStringValue()
-     * @generated
-     */
-    EAttribute getIdentifiableLangStringValue_Lang();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.UserVisibleTaglibObject <em>User Visible Taglib Object</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>User Visible Taglib Object</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.UserVisibleTaglibObject
-     * @generated
-     */
-    EClass getUserVisibleTaglibObject();
-
-    /**
-     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.UserVisibleTaglibObject#getDescription <em>Description</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the containment reference list '<em>Description</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.UserVisibleTaglibObject#getDescription()
-     * @see #getUserVisibleTaglibObject()
-     * @generated
-     */
-    EReference getUserVisibleTaglibObject_Description();
-
-    /**
-     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.UserVisibleTaglibObject#getDisplayName <em>Display Name</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the containment reference list '<em>Display Name</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.UserVisibleTaglibObject#getDisplayName()
-     * @see #getUserVisibleTaglibObject()
-     * @generated
-     */
-    EReference getUserVisibleTaglibObject_DisplayName();
-
-    /**
-     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.UserVisibleTaglibObject#getIcon <em>Icon</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the containment reference list '<em>Icon</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.UserVisibleTaglibObject#getIcon()
-     * @see #getUserVisibleTaglibObject()
-     * @generated
-     */
-    EReference getUserVisibleTaglibObject_Icon();
-
-    /**
-     * Returns the meta object for enum '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibVersion <em>Version</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for enum '<em>Version</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibVersion
-     * @generated
-     */
-    EEnum getFaceletTaglibVersion();
-
-    /**
-     * Returns the meta object for enum '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.GenericBooleanBase <em>Generic Boolean Base</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for enum '<em>Generic Boolean Base</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.GenericBooleanBase
-     * @generated
-     */
-    EEnum getGenericBooleanBase();
-
-    /**
-     * Returns the meta object for data type '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibVersion <em>Version Type Object</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for data type '<em>Version Type Object</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibVersion
-     * @model instanceClass="org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibVersion"
-     *        extendedMetaData="name='facelet-taglib-versionType:Object' baseType='facelet-taglib-versionType'"
-     * @generated
-     */
-    EDataType getFaceletTaglibVersionTypeObject();
-
-    /**
-     * Returns the meta object for data type '{@link java.lang.String <em>Fully Qualified Class Base</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for data type '<em>Fully Qualified Class Base</em>'.
-     * @see java.lang.String
-     * @model instanceClass="java.lang.String"
-     *        extendedMetaData="name='fully-qualified-classType_._base' baseType='http://www.eclipse.org/emf/2003/XMLType#token'"
-     * @generated
-     */
-    EDataType getFullyQualifiedClassBase();
-
-    /**
-     * Returns the meta object for data type '{@link java.lang.String <em>Java Identifier Base</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for data type '<em>Java Identifier Base</em>'.
-     * @see java.lang.String
-     * @model instanceClass="java.lang.String"
-     *        extendedMetaData="name='java-identifierType_._base' baseType='http://www.eclipse.org/emf/2003/XMLType#token' pattern='($|_|\\p{L})(\\p{L}|\\p{Nd}|_|$)*'"
-     * @generated
-     */
-    EDataType getJavaIdentifierBase();
-
-    /**
-     * Returns the meta object for data type '{@link java.lang.String <em>Path Type Base</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for data type '<em>Path Type Base</em>'.
-     * @see java.lang.String
-     * @model instanceClass="java.lang.String"
-     *        extendedMetaData="name='pathType_._base' baseType='http://www.eclipse.org/emf/2003/XMLType#token'"
-     * @generated
-     */
-    EDataType getPathTypeBase();
-
-    /**
-     * Returns the factory that creates the instances of the model.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the factory that creates the instances of the model.
-     * @generated
-     */
-    FaceletTaglibFactory getFaceletTaglibFactory();
-
-    /**
-     * <!-- begin-user-doc -->
-     * Defines literals for the meta objects that represent
-     * <ul>
-     *   <li>each class,</li>
-     *   <li>each feature of each class,</li>
-     *   <li>each enum,</li>
-     *   <li>and each data type</li>
-     * </ul>
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @SuppressWarnings("hiding")
-    interface Literals
-    {
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.DescriptionImpl <em>Description</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.DescriptionImpl
-         * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibPackageImpl#getDescription()
-         * @generated
-         */
-        EClass DESCRIPTION = eINSTANCE.getDescription();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.DisplayNameImpl <em>Display Name</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.DisplayNameImpl
-         * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibPackageImpl#getDisplayName()
-         * @generated
-         */
-        EClass DISPLAY_NAME = eINSTANCE.getDisplayName();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.DocumentRootImpl <em>Document Root</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.DocumentRootImpl
-         * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibPackageImpl#getDocumentRoot()
-         * @generated
-         */
-        EClass DOCUMENT_ROOT = eINSTANCE.getDocumentRoot();
-
-        /**
-         * The meta object literal for the '<em><b>Mixed</b></em>' attribute list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute DOCUMENT_ROOT__MIXED = eINSTANCE.getDocumentRoot_Mixed();
-
-        /**
-         * The meta object literal for the '<em><b>XMLNS Prefix Map</b></em>' map feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference DOCUMENT_ROOT__XMLNS_PREFIX_MAP = eINSTANCE.getDocumentRoot_XMLNSPrefixMap();
-
-        /**
-         * The meta object literal for the '<em><b>XSI Schema Location</b></em>' map feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference DOCUMENT_ROOT__XSI_SCHEMA_LOCATION = eINSTANCE.getDocumentRoot_XSISchemaLocation();
-
-        /**
-         * The meta object literal for the '<em><b>Facelet Taglib</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference DOCUMENT_ROOT__FACELET_TAGLIB = eINSTANCE.getDocumentRoot_FaceletTaglib();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibCanonicalNameImpl <em>Canonical Name</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibCanonicalNameImpl
-         * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibPackageImpl#getFaceletTaglibCanonicalName()
-         * @generated
-         */
-        EClass FACELET_TAGLIB_CANONICAL_NAME = eINSTANCE.getFaceletTaglibCanonicalName();
-
-        /**
-         * The meta object literal for the '<em><b>Value</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute FACELET_TAGLIB_CANONICAL_NAME__VALUE = eINSTANCE.getFaceletTaglibCanonicalName_Value();
-
-        /**
-         * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute FACELET_TAGLIB_CANONICAL_NAME__ID = eINSTANCE.getFaceletTaglibCanonicalName_Id();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibExtensionImpl <em>Extension</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibExtensionImpl
-         * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibPackageImpl#getFaceletTaglibExtension()
-         * @generated
-         */
-        EClass FACELET_TAGLIB_EXTENSION = eINSTANCE.getFaceletTaglibExtension();
-
-        /**
-         * The meta object literal for the '<em><b>Any</b></em>' attribute list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute FACELET_TAGLIB_EXTENSION__ANY = eINSTANCE.getFaceletTaglibExtension_Any();
-
-        /**
-         * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute FACELET_TAGLIB_EXTENSION__ID = eINSTANCE.getFaceletTaglibExtension_Id();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibFunctionImpl <em>Function</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibFunctionImpl
-         * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibPackageImpl#getFaceletTaglibFunction()
-         * @generated
-         */
-        EClass FACELET_TAGLIB_FUNCTION = eINSTANCE.getFaceletTaglibFunction();
-
-        /**
-         * The meta object literal for the '<em><b>Function Name</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference FACELET_TAGLIB_FUNCTION__FUNCTION_NAME = eINSTANCE.getFaceletTaglibFunction_FunctionName();
-
-        /**
-         * The meta object literal for the '<em><b>Function Class</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference FACELET_TAGLIB_FUNCTION__FUNCTION_CLASS = eINSTANCE.getFaceletTaglibFunction_FunctionClass();
-
-        /**
-         * The meta object literal for the '<em><b>Function Signature</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference FACELET_TAGLIB_FUNCTION__FUNCTION_SIGNATURE = eINSTANCE.getFaceletTaglibFunction_FunctionSignature();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibTagAttributeImpl <em>Tag Attribute</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibTagAttributeImpl
-         * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibPackageImpl#getFaceletTaglibTagAttribute()
-         * @generated
-         */
-        EClass FACELET_TAGLIB_TAG_ATTRIBUTE = eINSTANCE.getFaceletTaglibTagAttribute();
-
-        /**
-         * The meta object literal for the '<em><b>Name Element</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference FACELET_TAGLIB_TAG_ATTRIBUTE__NAME_ELEMENT = eINSTANCE.getFaceletTaglibTagAttribute_NameElement();
-
-        /**
-         * The meta object literal for the '<em><b>Required Element</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference FACELET_TAGLIB_TAG_ATTRIBUTE__REQUIRED_ELEMENT = eINSTANCE.getFaceletTaglibTagAttribute_RequiredElement();
-
-        /**
-         * The meta object literal for the '<em><b>Type Element</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference FACELET_TAGLIB_TAG_ATTRIBUTE__TYPE_ELEMENT = eINSTANCE.getFaceletTaglibTagAttribute_TypeElement();
-
-        /**
-         * The meta object literal for the '<em><b>Method Signature Element</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference FACELET_TAGLIB_TAG_ATTRIBUTE__METHOD_SIGNATURE_ELEMENT = eINSTANCE.getFaceletTaglibTagAttribute_MethodSignatureElement();
-
-        /**
-         * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute FACELET_TAGLIB_TAG_ATTRIBUTE__ID = eINSTANCE.getFaceletTaglibTagAttribute_Id();
-
-        /**
-         * The meta object literal for the '<em><b>Name</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute FACELET_TAGLIB_TAG_ATTRIBUTE__NAME = eINSTANCE.getFaceletTaglibTagAttribute_Name();
-
-        /**
-         * The meta object literal for the '<em><b>Required</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute FACELET_TAGLIB_TAG_ATTRIBUTE__REQUIRED = eINSTANCE.getFaceletTaglibTagAttribute_Required();
-
-        /**
-         * The meta object literal for the '<em><b>Type</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute FACELET_TAGLIB_TAG_ATTRIBUTE__TYPE = eINSTANCE.getFaceletTaglibTagAttribute_Type();
-
-        /**
-         * The meta object literal for the '<em><b>Method Signature</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute FACELET_TAGLIB_TAG_ATTRIBUTE__METHOD_SIGNATURE = eINSTANCE.getFaceletTaglibTagAttribute_MethodSignature();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibTagBehaviorExtensionImpl <em>Tag Behavior Extension</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibTagBehaviorExtensionImpl
-         * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibPackageImpl#getFaceletTaglibTagBehaviorExtension()
-         * @generated
-         */
-        EClass FACELET_TAGLIB_TAG_BEHAVIOR_EXTENSION = eINSTANCE.getFaceletTaglibTagBehaviorExtension();
-
-        /**
-         * The meta object literal for the '<em><b>Any</b></em>' attribute list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute FACELET_TAGLIB_TAG_BEHAVIOR_EXTENSION__ANY = eINSTANCE.getFaceletTaglibTagBehaviorExtension_Any();
-
-        /**
-         * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute FACELET_TAGLIB_TAG_BEHAVIOR_EXTENSION__ID = eINSTANCE.getFaceletTaglibTagBehaviorExtension_Id();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibTagBehaviorImpl <em>Tag Behavior</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibTagBehaviorImpl
-         * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibPackageImpl#getFaceletTaglibTagBehavior()
-         * @generated
-         */
-        EClass FACELET_TAGLIB_TAG_BEHAVIOR = eINSTANCE.getFaceletTaglibTagBehavior();
-
-        /**
-         * The meta object literal for the '<em><b>Behavior Id</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference FACELET_TAGLIB_TAG_BEHAVIOR__BEHAVIOR_ID = eINSTANCE.getFaceletTaglibTagBehavior_BehaviorId();
-
-        /**
-         * The meta object literal for the '<em><b>Handler Class</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference FACELET_TAGLIB_TAG_BEHAVIOR__HANDLER_CLASS = eINSTANCE.getFaceletTaglibTagBehavior_HandlerClass();
-
-        /**
-         * The meta object literal for the '<em><b>Behavior Extension</b></em>' containment reference list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference FACELET_TAGLIB_TAG_BEHAVIOR__BEHAVIOR_EXTENSION = eINSTANCE.getFaceletTaglibTagBehavior_BehaviorExtension();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibTagComponentExtensionImpl <em>Tag Component Extension</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibTagComponentExtensionImpl
-         * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibPackageImpl#getFaceletTaglibTagComponentExtension()
-         * @generated
-         */
-        EClass FACELET_TAGLIB_TAG_COMPONENT_EXTENSION = eINSTANCE.getFaceletTaglibTagComponentExtension();
-
-        /**
-         * The meta object literal for the '<em><b>Any</b></em>' attribute list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute FACELET_TAGLIB_TAG_COMPONENT_EXTENSION__ANY = eINSTANCE.getFaceletTaglibTagComponentExtension_Any();
-
-        /**
-         * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute FACELET_TAGLIB_TAG_COMPONENT_EXTENSION__ID = eINSTANCE.getFaceletTaglibTagComponentExtension_Id();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibTagComponentImpl <em>Tag Component</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibTagComponentImpl
-         * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibPackageImpl#getFaceletTaglibTagComponent()
-         * @generated
-         */
-        EClass FACELET_TAGLIB_TAG_COMPONENT = eINSTANCE.getFaceletTaglibTagComponent();
-
-        /**
-         * The meta object literal for the '<em><b>Component Type</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference FACELET_TAGLIB_TAG_COMPONENT__COMPONENT_TYPE = eINSTANCE.getFaceletTaglibTagComponent_ComponentType();
-
-        /**
-         * The meta object literal for the '<em><b>Renderer Type</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference FACELET_TAGLIB_TAG_COMPONENT__RENDERER_TYPE = eINSTANCE.getFaceletTaglibTagComponent_RendererType();
-
-        /**
-         * The meta object literal for the '<em><b>Handler Class</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference FACELET_TAGLIB_TAG_COMPONENT__HANDLER_CLASS = eINSTANCE.getFaceletTaglibTagComponent_HandlerClass();
-
-        /**
-         * The meta object literal for the '<em><b>Component Extension</b></em>' containment reference list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference FACELET_TAGLIB_TAG_COMPONENT__COMPONENT_EXTENSION = eINSTANCE.getFaceletTaglibTagComponent_ComponentExtension();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibTagConverterExtensionImpl <em>Tag Converter Extension</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibTagConverterExtensionImpl
-         * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibPackageImpl#getFaceletTaglibTagConverterExtension()
-         * @generated
-         */
-        EClass FACELET_TAGLIB_TAG_CONVERTER_EXTENSION = eINSTANCE.getFaceletTaglibTagConverterExtension();
-
-        /**
-         * The meta object literal for the '<em><b>Any</b></em>' attribute list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute FACELET_TAGLIB_TAG_CONVERTER_EXTENSION__ANY = eINSTANCE.getFaceletTaglibTagConverterExtension_Any();
-
-        /**
-         * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute FACELET_TAGLIB_TAG_CONVERTER_EXTENSION__ID = eINSTANCE.getFaceletTaglibTagConverterExtension_Id();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibTagConverterImpl <em>Tag Converter</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibTagConverterImpl
-         * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibPackageImpl#getFaceletTaglibTagConverter()
-         * @generated
-         */
-        EClass FACELET_TAGLIB_TAG_CONVERTER = eINSTANCE.getFaceletTaglibTagConverter();
-
-        /**
-         * The meta object literal for the '<em><b>Converter Id</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference FACELET_TAGLIB_TAG_CONVERTER__CONVERTER_ID = eINSTANCE.getFaceletTaglibTagConverter_ConverterId();
-
-        /**
-         * The meta object literal for the '<em><b>Handler Class</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference FACELET_TAGLIB_TAG_CONVERTER__HANDLER_CLASS = eINSTANCE.getFaceletTaglibTagConverter_HandlerClass();
-
-        /**
-         * The meta object literal for the '<em><b>Converter Extension</b></em>' containment reference list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference FACELET_TAGLIB_TAG_CONVERTER__CONVERTER_EXTENSION = eINSTANCE.getFaceletTaglibTagConverter_ConverterExtension();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibTagExtensionImpl <em>Tag Extension</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibTagExtensionImpl
-         * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibPackageImpl#getFaceletTaglibTagExtension()
-         * @generated
-         */
-        EClass FACELET_TAGLIB_TAG_EXTENSION = eINSTANCE.getFaceletTaglibTagExtension();
-
-        /**
-         * The meta object literal for the '<em><b>Any</b></em>' attribute list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute FACELET_TAGLIB_TAG_EXTENSION__ANY = eINSTANCE.getFaceletTaglibTagExtension_Any();
-
-        /**
-         * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute FACELET_TAGLIB_TAG_EXTENSION__ID = eINSTANCE.getFaceletTaglibTagExtension_Id();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibTagImpl <em>Tag</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibTagImpl
-         * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibPackageImpl#getFaceletTaglibTag()
-         * @generated
-         */
-        EClass FACELET_TAGLIB_TAG = eINSTANCE.getFaceletTaglibTag();
-
-        /**
-         * The meta object literal for the '<em><b>Tag Name Element</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference FACELET_TAGLIB_TAG__TAG_NAME_ELEMENT = eINSTANCE.getFaceletTaglibTag_TagNameElement();
-
-        /**
-         * The meta object literal for the '<em><b>Handler Class Element</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference FACELET_TAGLIB_TAG__HANDLER_CLASS_ELEMENT = eINSTANCE.getFaceletTaglibTag_HandlerClassElement();
-
-        /**
-         * The meta object literal for the '<em><b>Behavior</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference FACELET_TAGLIB_TAG__BEHAVIOR = eINSTANCE.getFaceletTaglibTag_Behavior();
-
-        /**
-         * The meta object literal for the '<em><b>Component</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference FACELET_TAGLIB_TAG__COMPONENT = eINSTANCE.getFaceletTaglibTag_Component();
-
-        /**
-         * The meta object literal for the '<em><b>Converter</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference FACELET_TAGLIB_TAG__CONVERTER = eINSTANCE.getFaceletTaglibTag_Converter();
-
-        /**
-         * The meta object literal for the '<em><b>Validator</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference FACELET_TAGLIB_TAG__VALIDATOR = eINSTANCE.getFaceletTaglibTag_Validator();
-
-        /**
-         * The meta object literal for the '<em><b>Source</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference FACELET_TAGLIB_TAG__SOURCE = eINSTANCE.getFaceletTaglibTag_Source();
-
-        /**
-         * The meta object literal for the '<em><b>Attribute</b></em>' containment reference list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference FACELET_TAGLIB_TAG__ATTRIBUTE = eINSTANCE.getFaceletTaglibTag_Attribute();
-
-        /**
-         * The meta object literal for the '<em><b>Tag Extension</b></em>' containment reference list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference FACELET_TAGLIB_TAG__TAG_EXTENSION = eINSTANCE.getFaceletTaglibTag_TagExtension();
-
-        /**
-         * The meta object literal for the '<em><b>Tag Name</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute FACELET_TAGLIB_TAG__TAG_NAME = eINSTANCE.getFaceletTaglibTag_TagName();
-
-        /**
-         * The meta object literal for the '<em><b>Handler Class</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute FACELET_TAGLIB_TAG__HANDLER_CLASS = eINSTANCE.getFaceletTaglibTag_HandlerClass();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibTagValidatorExtensionImpl <em>Tag Validator Extension</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibTagValidatorExtensionImpl
-         * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibPackageImpl#getFaceletTaglibTagValidatorExtension()
-         * @generated
-         */
-        EClass FACELET_TAGLIB_TAG_VALIDATOR_EXTENSION = eINSTANCE.getFaceletTaglibTagValidatorExtension();
-
-        /**
-         * The meta object literal for the '<em><b>Any</b></em>' attribute list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute FACELET_TAGLIB_TAG_VALIDATOR_EXTENSION__ANY = eINSTANCE.getFaceletTaglibTagValidatorExtension_Any();
-
-        /**
-         * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute FACELET_TAGLIB_TAG_VALIDATOR_EXTENSION__ID = eINSTANCE.getFaceletTaglibTagValidatorExtension_Id();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibTagValidatorImpl <em>Tag Validator</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibTagValidatorImpl
-         * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibPackageImpl#getFaceletTaglibTagValidator()
-         * @generated
-         */
-        EClass FACELET_TAGLIB_TAG_VALIDATOR = eINSTANCE.getFaceletTaglibTagValidator();
-
-        /**
-         * The meta object literal for the '<em><b>Validator Id</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference FACELET_TAGLIB_TAG_VALIDATOR__VALIDATOR_ID = eINSTANCE.getFaceletTaglibTagValidator_ValidatorId();
-
-        /**
-         * The meta object literal for the '<em><b>Handler Class</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference FACELET_TAGLIB_TAG_VALIDATOR__HANDLER_CLASS = eINSTANCE.getFaceletTaglibTagValidator_HandlerClass();
-
-        /**
-         * The meta object literal for the '<em><b>Validator Extension</b></em>' containment reference list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference FACELET_TAGLIB_TAG_VALIDATOR__VALIDATOR_EXTENSION = eINSTANCE.getFaceletTaglibTagValidator_ValidatorExtension();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibImpl <em>Facelet Taglib</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibImpl
-         * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibPackageImpl#getFaceletTaglib()
-         * @generated
-         */
-        EClass FACELET_TAGLIB = eINSTANCE.getFaceletTaglib();
-
-        /**
-         * The meta object literal for the '<em><b>Library Class</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference FACELET_TAGLIB__LIBRARY_CLASS = eINSTANCE.getFaceletTaglib_LibraryClass();
-
-        /**
-         * The meta object literal for the '<em><b>Namespace</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference FACELET_TAGLIB__NAMESPACE = eINSTANCE.getFaceletTaglib_Namespace();
-
-        /**
-         * The meta object literal for the '<em><b>Composite Library Name</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference FACELET_TAGLIB__COMPOSITE_LIBRARY_NAME = eINSTANCE.getFaceletTaglib_CompositeLibraryName();
-
-        /**
-         * The meta object literal for the '<em><b>Group</b></em>' attribute list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute FACELET_TAGLIB__GROUP = eINSTANCE.getFaceletTaglib_Group();
-
-        /**
-         * The meta object literal for the '<em><b>Tag</b></em>' containment reference list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference FACELET_TAGLIB__TAG = eINSTANCE.getFaceletTaglib_Tag();
-
-        /**
-         * The meta object literal for the '<em><b>Function</b></em>' containment reference list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference FACELET_TAGLIB__FUNCTION = eINSTANCE.getFaceletTaglib_Function();
-
-        /**
-         * The meta object literal for the '<em><b>Taglib Extension</b></em>' containment reference list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference FACELET_TAGLIB__TAGLIB_EXTENSION = eINSTANCE.getFaceletTaglib_TaglibExtension();
-
-        /**
-         * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute FACELET_TAGLIB__ID = eINSTANCE.getFaceletTaglib_Id();
-
-        /**
-         * The meta object literal for the '<em><b>Version</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute FACELET_TAGLIB__VERSION = eINSTANCE.getFaceletTaglib_Version();
-
-        /**
-         * The meta object literal for the '<em><b>Namespace Uri</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute FACELET_TAGLIB__NAMESPACE_URI = eINSTANCE.getFaceletTaglib_NamespaceUri();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FullyQualifiedClassImpl <em>Fully Qualified Class</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FullyQualifiedClassImpl
-         * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibPackageImpl#getFullyQualifiedClass()
-         * @generated
-         */
-        EClass FULLY_QUALIFIED_CLASS = eINSTANCE.getFullyQualifiedClass();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.GenericBooleanImpl <em>Generic Boolean</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.GenericBooleanImpl
-         * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibPackageImpl#getGenericBoolean()
-         * @generated
-         */
-        EClass GENERIC_BOOLEAN = eINSTANCE.getGenericBoolean();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.IconImpl <em>Icon</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.IconImpl
-         * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibPackageImpl#getIcon()
-         * @generated
-         */
-        EClass ICON = eINSTANCE.getIcon();
-
-        /**
-         * The meta object literal for the '<em><b>Small Icon</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference ICON__SMALL_ICON = eINSTANCE.getIcon_SmallIcon();
-
-        /**
-         * The meta object literal for the '<em><b>Large Icon</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference ICON__LARGE_ICON = eINSTANCE.getIcon_LargeIcon();
-
-        /**
-         * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute ICON__ID = eINSTANCE.getIcon_Id();
-
-        /**
-         * The meta object literal for the '<em><b>Lang</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute ICON__LANG = eINSTANCE.getIcon_Lang();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.JavaIdentifierImpl <em>Java Identifier</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.JavaIdentifierImpl
-         * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibPackageImpl#getJavaIdentifier()
-         * @generated
-         */
-        EClass JAVA_IDENTIFIER = eINSTANCE.getJavaIdentifier();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.PathImpl <em>Path</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.PathImpl
-         * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibPackageImpl#getPath()
-         * @generated
-         */
-        EClass PATH = eINSTANCE.getPath();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.IdentifiableStringValueImpl <em>Identifiable String Value</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.IdentifiableStringValueImpl
-         * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibPackageImpl#getIdentifiableStringValue()
-         * @generated
-         */
-        EClass IDENTIFIABLE_STRING_VALUE = eINSTANCE.getIdentifiableStringValue();
-
-        /**
-         * The meta object literal for the '<em><b>Value</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute IDENTIFIABLE_STRING_VALUE__VALUE = eINSTANCE.getIdentifiableStringValue_Value();
-
-        /**
-         * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute IDENTIFIABLE_STRING_VALUE__ID = eINSTANCE.getIdentifiableStringValue_Id();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.IdentifiableLangStringValueImpl <em>Identifiable Lang String Value</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.IdentifiableLangStringValueImpl
-         * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibPackageImpl#getIdentifiableLangStringValue()
-         * @generated
-         */
-        EClass IDENTIFIABLE_LANG_STRING_VALUE = eINSTANCE.getIdentifiableLangStringValue();
-
-        /**
-         * The meta object literal for the '<em><b>Lang</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute IDENTIFIABLE_LANG_STRING_VALUE__LANG = eINSTANCE.getIdentifiableLangStringValue_Lang();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.UserVisibleTaglibObjectImpl <em>User Visible Taglib Object</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.UserVisibleTaglibObjectImpl
-         * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibPackageImpl#getUserVisibleTaglibObject()
-         * @generated
-         */
-        EClass USER_VISIBLE_TAGLIB_OBJECT = eINSTANCE.getUserVisibleTaglibObject();
-
-        /**
-         * The meta object literal for the '<em><b>Description</b></em>' containment reference list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference USER_VISIBLE_TAGLIB_OBJECT__DESCRIPTION = eINSTANCE.getUserVisibleTaglibObject_Description();
-
-        /**
-         * The meta object literal for the '<em><b>Display Name</b></em>' containment reference list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference USER_VISIBLE_TAGLIB_OBJECT__DISPLAY_NAME = eINSTANCE.getUserVisibleTaglibObject_DisplayName();
-
-        /**
-         * The meta object literal for the '<em><b>Icon</b></em>' containment reference list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference USER_VISIBLE_TAGLIB_OBJECT__ICON = eINSTANCE.getUserVisibleTaglibObject_Icon();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibVersion <em>Version</em>}' enum.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibVersion
-         * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibPackageImpl#getFaceletTaglibVersion()
-         * @generated
-         */
-        EEnum FACELET_TAGLIB_VERSION = eINSTANCE.getFaceletTaglibVersion();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.GenericBooleanBase <em>Generic Boolean Base</em>}' enum.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.GenericBooleanBase
-         * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibPackageImpl#getGenericBooleanBase()
-         * @generated
-         */
-        EEnum GENERIC_BOOLEAN_BASE = eINSTANCE.getGenericBooleanBase();
-
-        /**
-         * The meta object literal for the '<em>Version Type Object</em>' data type.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibVersion
-         * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibPackageImpl#getFaceletTaglibVersionTypeObject()
-         * @generated
-         */
-        EDataType FACELET_TAGLIB_VERSION_TYPE_OBJECT = eINSTANCE.getFaceletTaglibVersionTypeObject();
-
-        /**
-         * The meta object literal for the '<em>Fully Qualified Class Base</em>' data type.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see java.lang.String
-         * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibPackageImpl#getFullyQualifiedClassBase()
-         * @generated
-         */
-        EDataType FULLY_QUALIFIED_CLASS_BASE = eINSTANCE.getFullyQualifiedClassBase();
-
-        /**
-         * The meta object literal for the '<em>Java Identifier Base</em>' data type.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see java.lang.String
-         * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibPackageImpl#getJavaIdentifierBase()
-         * @generated
-         */
-        EDataType JAVA_IDENTIFIER_BASE = eINSTANCE.getJavaIdentifierBase();
-
-        /**
-         * The meta object literal for the '<em>Path Type Base</em>' data type.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see java.lang.String
-         * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibPackageImpl#getPathTypeBase()
-         * @generated
-         */
-        EDataType PATH_TYPE_BASE = eINSTANCE.getPathTypeBase();
-
-    }
-
-} //FaceletTaglibPackage
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/FaceletTaglibTag.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/FaceletTaglibTag.java
deleted file mode 100644
index d1124c6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/FaceletTaglibTag.java
+++ /dev/null
@@ -1,323 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: FaceletTaglibTag.java,v 1.1 2010/03/18 06:24:28 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib;
-
-import org.eclipse.emf.common.util.EList;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Facelet Taglib Tag</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * 
- *                 If the tag library XML file contains individual tag
- *                 declarations rather than pointing to a library-class or a
- *                 declaring a composite-library name, the individual tags are
- *                 enclosed in tag elements.
- *             
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTag#getTagNameElement <em>Tag Name Element</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTag#getHandlerClassElement <em>Handler Class Element</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTag#getBehavior <em>Behavior</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTag#getComponent <em>Component</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTag#getConverter <em>Converter</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTag#getValidator <em>Validator</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTag#getSource <em>Source</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTag#getAttribute <em>Attribute</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTag#getTagExtension <em>Tag Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTag#getTagName <em>Tag Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTag#getHandlerClass <em>Handler Class</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage#getFaceletTaglibTag()
- * @model extendedMetaData="name='facelet-taglib-tagType' kind='elementOnly'"
- * @generated
- */
-public interface FaceletTaglibTag extends UserVisibleTaglibObject
-{
-    /**
-     * Returns the value of the '<em><b>Tag Name Element</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Tag Name Element</em>' containment reference isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Tag Name Element</em>' containment reference.
-     * @see #setTagNameElement(FaceletTaglibCanonicalName)
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage#getFaceletTaglibTag_TagNameElement()
-     * @model containment="true" required="true"
-     *        extendedMetaData="kind='element' name='tag-name' namespace='##targetNamespace'"
-     * @generated
-     */
-    FaceletTaglibCanonicalName getTagNameElement();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTag#getTagNameElement <em>Tag Name Element</em>}' containment reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Tag Name Element</em>' containment reference.
-     * @see #getTagNameElement()
-     * @generated
-     */
-    void setTagNameElement(FaceletTaglibCanonicalName value);
-
-    /**
-     * Returns the value of the '<em><b>Handler Class Element</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Handler Class Element</em>' containment reference isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Handler Class Element</em>' containment reference.
-     * @see #setHandlerClassElement(FullyQualifiedClass)
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage#getFaceletTaglibTag_HandlerClassElement()
-     * @model containment="true"
-     *        extendedMetaData="kind='element' name='handler-class' namespace='##targetNamespace'"
-     * @generated
-     */
-    FullyQualifiedClass getHandlerClassElement();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTag#getHandlerClassElement <em>Handler Class Element</em>}' containment reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Handler Class Element</em>' containment reference.
-     * @see #getHandlerClassElement()
-     * @generated
-     */
-    void setHandlerClassElement(FullyQualifiedClass value);
-
-    /**
-     * Returns the value of the '<em><b>Tag Name</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Tag Name</em>' containment reference isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Tag Name</em>' attribute.
-     * @see #setTagName(String)
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage#getFaceletTaglibTag_TagName()
-     * @model transient="true" volatile="true"
-     * @generated
-     */
-    String getTagName();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTag#getTagName <em>Tag Name</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Tag Name</em>' attribute.
-     * @see #getTagName()
-     * @generated
-     */
-    void setTagName(String value);
-
-    /**
-     * Returns the value of the '<em><b>Handler Class</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Handle Class</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Handler Class</em>' attribute.
-     * @see #setHandlerClass(String)
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage#getFaceletTaglibTag_HandlerClass()
-     * @model transient="true" volatile="true"
-     * @generated
-     */
-    String getHandlerClass();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTag#getHandlerClass <em>Handler Class</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Handler Class</em>' attribute.
-     * @see #getHandlerClass()
-     * @generated
-     */
-    void setHandlerClass(String value);
-
-    /**
-     * Returns the value of the '<em><b>Behavior</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Behavior</em>' containment reference isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Behavior</em>' containment reference.
-     * @see #setBehavior(FaceletTaglibTagBehavior)
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage#getFaceletTaglibTag_Behavior()
-     * @model containment="true"
-     *        extendedMetaData="kind='element' name='behavior' namespace='##targetNamespace'"
-     * @generated
-     */
-    FaceletTaglibTagBehavior getBehavior();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTag#getBehavior <em>Behavior</em>}' containment reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Behavior</em>' containment reference.
-     * @see #getBehavior()
-     * @generated
-     */
-    void setBehavior(FaceletTaglibTagBehavior value);
-
-    /**
-     * Returns the value of the '<em><b>Component</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Component</em>' containment reference isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Component</em>' containment reference.
-     * @see #setComponent(FaceletTaglibTagComponent)
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage#getFaceletTaglibTag_Component()
-     * @model containment="true"
-     *        extendedMetaData="kind='element' name='component' namespace='##targetNamespace'"
-     * @generated
-     */
-    FaceletTaglibTagComponent getComponent();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTag#getComponent <em>Component</em>}' containment reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Component</em>' containment reference.
-     * @see #getComponent()
-     * @generated
-     */
-    void setComponent(FaceletTaglibTagComponent value);
-
-    /**
-     * Returns the value of the '<em><b>Converter</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Converter</em>' containment reference isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Converter</em>' containment reference.
-     * @see #setConverter(FaceletTaglibTagConverter)
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage#getFaceletTaglibTag_Converter()
-     * @model containment="true"
-     *        extendedMetaData="kind='element' name='converter' namespace='##targetNamespace'"
-     * @generated
-     */
-    FaceletTaglibTagConverter getConverter();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTag#getConverter <em>Converter</em>}' containment reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Converter</em>' containment reference.
-     * @see #getConverter()
-     * @generated
-     */
-    void setConverter(FaceletTaglibTagConverter value);
-
-    /**
-     * Returns the value of the '<em><b>Validator</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Validator</em>' containment reference isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Validator</em>' containment reference.
-     * @see #setValidator(FaceletTaglibTagValidator)
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage#getFaceletTaglibTag_Validator()
-     * @model containment="true"
-     *        extendedMetaData="kind='element' name='validator' namespace='##targetNamespace'"
-     * @generated
-     */
-    FaceletTaglibTagValidator getValidator();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTag#getValidator <em>Validator</em>}' containment reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Validator</em>' containment reference.
-     * @see #getValidator()
-     * @generated
-     */
-    void setValidator(FaceletTaglibTagValidator value);
-
-    /**
-     * Returns the value of the '<em><b>Source</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Source</em>' containment reference isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Source</em>' containment reference.
-     * @see #setSource(IdentifiableStringValue)
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage#getFaceletTaglibTag_Source()
-     * @model containment="true"
-     *        extendedMetaData="kind='element' name='source' namespace='##targetNamespace'"
-     * @generated
-     */
-    IdentifiableStringValue getSource();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTag#getSource <em>Source</em>}' containment reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Source</em>' containment reference.
-     * @see #getSource()
-     * @generated
-     */
-    void setSource(IdentifiableStringValue value);
-
-    /**
-     * Returns the value of the '<em><b>Attribute</b></em>' containment reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagAttribute}.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Attribute</em>' containment reference list isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Attribute</em>' containment reference list.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage#getFaceletTaglibTag_Attribute()
-     * @model containment="true"
-     *        extendedMetaData="kind='element' name='attribute' namespace='##targetNamespace'"
-     * @generated
-     */
-    EList<FaceletTaglibTagAttribute> getAttribute();
-
-    /**
-     * Returns the value of the '<em><b>Tag Extension</b></em>' containment reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagExtension}.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Tag Extension</em>' containment reference list isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Tag Extension</em>' containment reference list.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage#getFaceletTaglibTag_TagExtension()
-     * @model containment="true"
-     *        extendedMetaData="kind='element' name='tag-extension' namespace='##targetNamespace'"
-     * @generated
-     */
-    EList<FaceletTaglibTagExtension> getTagExtension();
-
-} // FaceletTaglibTag
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/FaceletTaglibTagAttribute.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/FaceletTaglibTagAttribute.java
deleted file mode 100644
index 52d2ea2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/FaceletTaglibTagAttribute.java
+++ /dev/null
@@ -1,303 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: FaceletTaglibTagAttribute.java,v 1.1 2010/03/18 06:24:37 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Facelet Taglib Tag Attribute</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * 
- * 
- *                 The attribute element defines an attribute for the nesting
- *                 tag. The attribute element may have several subelements
- *                 defining:
- * 
- *                 description a description of the attribute
- * 
- *                 name the name of the attribute
- * 
- *                 required whether the attribute is required or
- *                 optional
- * 
- *                 type the type of the attribute
- * 
- *             
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagAttribute#getNameElement <em>Name Element</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagAttribute#getRequiredElement <em>Required Element</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagAttribute#getTypeElement <em>Type Element</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagAttribute#getMethodSignatureElement <em>Method Signature Element</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagAttribute#getId <em>Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagAttribute#getName <em>Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagAttribute#isRequired <em>Required</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagAttribute#getType <em>Type</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagAttribute#getMethodSignature <em>Method Signature</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage#getFaceletTaglibTagAttribute()
- * @model extendedMetaData="name='facelet-taglib-tag-attributeType' kind='elementOnly'"
- * @generated
- */
-public interface FaceletTaglibTagAttribute extends UserVisibleTaglibObject
-{
-    /**
-     * Returns the value of the '<em><b>Name Element</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Name Element</em>' containment reference isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Name Element</em>' containment reference.
-     * @see #setNameElement(FaceletTaglibCanonicalName)
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage#getFaceletTaglibTagAttribute_NameElement()
-     * @model containment="true" required="true"
-     *        extendedMetaData="kind='element' name='name' namespace='##targetNamespace'"
-     * @generated
-     */
-    FaceletTaglibCanonicalName getNameElement();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagAttribute#getNameElement <em>Name Element</em>}' containment reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Name Element</em>' containment reference.
-     * @see #getNameElement()
-     * @generated
-     */
-    void setNameElement(FaceletTaglibCanonicalName value);
-
-    /**
-     * Returns the value of the '<em><b>Required Element</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * <!-- begin-model-doc -->
-     * 
-     * 
-     *                         Defines if the nesting attribute is required or
-     *                         optional.
-     * 
-     *                         If not present then the default is "false", i.e
-     *                         the attribute is optional.
-     * 
-     *                     
-     * <!-- end-model-doc -->
-     * @return the value of the '<em>Required Element</em>' containment reference.
-     * @see #setRequiredElement(GenericBoolean)
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage#getFaceletTaglibTagAttribute_RequiredElement()
-     * @model containment="true"
-     *        extendedMetaData="kind='element' name='required' namespace='##targetNamespace'"
-     * @generated
-     */
-    GenericBoolean getRequiredElement();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagAttribute#getRequiredElement <em>Required Element</em>}' containment reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Required Element</em>' containment reference.
-     * @see #getRequiredElement()
-     * @generated
-     */
-    void setRequiredElement(GenericBoolean value);
-
-    /**
-     * Returns the value of the '<em><b>Type Element</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * <!-- begin-model-doc -->
-     * 
-     * 
-     *                             Defines the Java type of the attributes
-     *                             value. If this element is omitted, the
-     *                             expected type is assumed to be
-     *                             "java.lang.Object".
-     * 
-     *                         
-     * <!-- end-model-doc -->
-     * @return the value of the '<em>Type Element</em>' containment reference.
-     * @see #setTypeElement(FullyQualifiedClass)
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage#getFaceletTaglibTagAttribute_TypeElement()
-     * @model containment="true"
-     *        extendedMetaData="kind='element' name='type' namespace='##targetNamespace'"
-     * @generated
-     */
-    FullyQualifiedClass getTypeElement();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagAttribute#getTypeElement <em>Type Element</em>}' containment reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Type Element</em>' containment reference.
-     * @see #getTypeElement()
-     * @generated
-     */
-    void setTypeElement(FullyQualifiedClass value);
-
-    /**
-     * Returns the value of the '<em><b>Method Signature Element</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * <!-- begin-model-doc -->
-     * 
-     * 
-     *                             Defines the method signature for a MethodExpression-
-     *                             enabled attribute.
-     * 
-     *                         
-     * <!-- end-model-doc -->
-     * @return the value of the '<em>Method Signature Element</em>' containment reference.
-     * @see #setMethodSignatureElement(IdentifiableStringValue)
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage#getFaceletTaglibTagAttribute_MethodSignatureElement()
-     * @model containment="true"
-     *        extendedMetaData="kind='element' name='method-signature' namespace='##targetNamespace'"
-     * @generated
-     */
-    IdentifiableStringValue getMethodSignatureElement();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagAttribute#getMethodSignatureElement <em>Method Signature Element</em>}' containment reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Method Signature Element</em>' containment reference.
-     * @see #getMethodSignatureElement()
-     * @generated
-     */
-    void setMethodSignatureElement(IdentifiableStringValue value);
-
-    /**
-     * Returns the value of the '<em><b>Name</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Name</em>' containment reference isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Name</em>' attribute.
-     * @see #setName(String)
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage#getFaceletTaglibTagAttribute_Name()
-     * @model transient="true" volatile="true"
-     * @generated
-     */
-    String getName();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagAttribute#getName <em>Name</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Name</em>' attribute.
-     * @see #getName()
-     * @generated
-     */
-    void setName(String value);
-
-    /**
-     * Returns the value of the '<em><b>Required</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Required</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Required</em>' attribute.
-     * @see #setRequired(boolean)
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage#getFaceletTaglibTagAttribute_Required()
-     * @model transient="true" volatile="true"
-     * @generated
-     */
-    boolean isRequired();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagAttribute#isRequired <em>Required</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Required</em>' attribute.
-     * @see #isRequired()
-     * @generated
-     */
-    void setRequired(boolean value);
-
-    /**
-     * Returns the value of the '<em><b>Type</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Type</em>' attribute.
-     * @see #setType(String)
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage#getFaceletTaglibTagAttribute_Type()
-     * @model transient="true" volatile="true"
-     * @generated
-     */
-    String getType();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagAttribute#getType <em>Type</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Type</em>' attribute.
-     * @see #getType()
-     * @generated
-     */
-    void setType(String value);
-
-    /**
-     * Returns the value of the '<em><b>Method Signature</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Method Signature</em>' attribute.
-     * @see #setMethodSignature(String)
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage#getFaceletTaglibTagAttribute_MethodSignature()
-     * @model transient="true" volatile="true"
-     * @generated
-     */
-    String getMethodSignature();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagAttribute#getMethodSignature <em>Method Signature</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Method Signature</em>' attribute.
-     * @see #getMethodSignature()
-     * @generated
-     */
-    void setMethodSignature(String value);
-
-    /**
-     * Returns the value of the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Id</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Id</em>' attribute.
-     * @see #setId(String)
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage#getFaceletTaglibTagAttribute_Id()
-     * @model id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-     *        extendedMetaData="kind='attribute' name='id'"
-     * @generated
-     */
-    String getId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagAttribute#getId <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Id</em>' attribute.
-     * @see #getId()
-     * @generated
-     */
-    void setId(String value);
-
-} // FaceletTaglibTagAttribute
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/FaceletTaglibTagBehavior.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/FaceletTaglibTagBehavior.java
deleted file mode 100644
index 7d0fd20..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/FaceletTaglibTagBehavior.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: FaceletTaglibTagBehavior.java,v 1.1 2010/03/18 06:24:37 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib;
-
-import org.eclipse.emf.common.util.EList;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Facelet Taglib Tag Behavior</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * 
- *                 Within a tag element, the behavior element encapsulates
- *                 information specific to a JSF Behavior.
- *             
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagBehavior#getBehaviorId <em>Behavior Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagBehavior#getHandlerClass <em>Handler Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagBehavior#getBehaviorExtension <em>Behavior Extension</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage#getFaceletTaglibTagBehavior()
- * @model extendedMetaData="name='facelet-taglib-tag-behaviorType' kind='elementOnly'"
- * @generated
- */
-public interface FaceletTaglibTagBehavior extends UserVisibleTaglibObject
-{
-    /**
-     * Returns the value of the '<em><b>Behavior Id</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Behavior Id</em>' containment reference isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Behavior Id</em>' containment reference.
-     * @see #setBehaviorId(IdentifiableStringValue)
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage#getFaceletTaglibTagBehavior_BehaviorId()
-     * @model containment="true" required="true"
-     *        extendedMetaData="kind='element' name='behavior-id' namespace='##targetNamespace'"
-     * @generated
-     */
-    IdentifiableStringValue getBehaviorId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagBehavior#getBehaviorId <em>Behavior Id</em>}' containment reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Behavior Id</em>' containment reference.
-     * @see #getBehaviorId()
-     * @generated
-     */
-    void setBehaviorId(IdentifiableStringValue value);
-
-    /**
-     * Returns the value of the '<em><b>Handler Class</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Handler Class</em>' containment reference isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Handler Class</em>' containment reference.
-     * @see #setHandlerClass(FullyQualifiedClass)
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage#getFaceletTaglibTagBehavior_HandlerClass()
-     * @model containment="true"
-     *        extendedMetaData="kind='element' name='handler-class' namespace='##targetNamespace'"
-     * @generated
-     */
-    FullyQualifiedClass getHandlerClass();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagBehavior#getHandlerClass <em>Handler Class</em>}' containment reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Handler Class</em>' containment reference.
-     * @see #getHandlerClass()
-     * @generated
-     */
-    void setHandlerClass(FullyQualifiedClass value);
-
-    /**
-     * Returns the value of the '<em><b>Behavior Extension</b></em>' containment reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagBehaviorExtension}.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Behavior Extension</em>' containment reference list isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Behavior Extension</em>' containment reference list.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage#getFaceletTaglibTagBehavior_BehaviorExtension()
-     * @model containment="true"
-     *        extendedMetaData="kind='element' name='behavior-extension' namespace='##targetNamespace'"
-     * @generated
-     */
-    EList<FaceletTaglibTagBehaviorExtension> getBehaviorExtension();
-
-} // FaceletTaglibTagBehavior
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/FaceletTaglibTagBehaviorExtension.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/FaceletTaglibTagBehaviorExtension.java
deleted file mode 100644
index b489e89..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/FaceletTaglibTagBehaviorExtension.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: FaceletTaglibTagBehaviorExtension.java,v 1.1 2010/03/18 06:24:29 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib;
-
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.util.FeatureMap;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Facelet Taglib Tag Behavior Extension</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * 
- *                 Extension element for behavior. It may contain
- *                 implementation specific content.
- *             
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagBehaviorExtension#getAny <em>Any</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagBehaviorExtension#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage#getFaceletTaglibTagBehaviorExtension()
- * @model extendedMetaData="name='facelet-taglib-tag-behavior-extensionType' kind='elementOnly'"
- * @generated
- */
-public interface FaceletTaglibTagBehaviorExtension extends EObject
-{
-    /**
-     * Returns the value of the '<em><b>Any</b></em>' attribute list.
-     * The list contents are of type {@link org.eclipse.emf.ecore.util.FeatureMap.Entry}.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Any</em>' attribute list isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Any</em>' attribute list.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage#getFaceletTaglibTagBehaviorExtension_Any()
-     * @model unique="false" dataType="org.eclipse.emf.ecore.EFeatureMapEntry" many="true"
-     *        extendedMetaData="kind='elementWildcard' wildcards='##any' name=':0' processing='lax'"
-     * @generated
-     */
-    FeatureMap getAny();
-
-    /**
-     * Returns the value of the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Id</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Id</em>' attribute.
-     * @see #setId(String)
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage#getFaceletTaglibTagBehaviorExtension_Id()
-     * @model id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-     *        extendedMetaData="kind='attribute' name='id'"
-     * @generated
-     */
-    String getId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagBehaviorExtension#getId <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Id</em>' attribute.
-     * @see #getId()
-     * @generated
-     */
-    void setId(String value);
-
-} // FaceletTaglibTagBehaviorExtension
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/FaceletTaglibTagComponent.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/FaceletTaglibTagComponent.java
deleted file mode 100644
index 585fe2d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/FaceletTaglibTagComponent.java
+++ /dev/null
@@ -1,137 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: FaceletTaglibTagComponent.java,v 1.1 2010/03/18 06:24:29 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib;
-
-import org.eclipse.emf.common.util.EList;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Facelet Taglib Tag Component</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * 
- *                 Within a tag element, the component element encapsulates
- *                 information specific to a JSF UIComponent.
- *             
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagComponent#getComponentType <em>Component Type</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagComponent#getRendererType <em>Renderer Type</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagComponent#getHandlerClass <em>Handler Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagComponent#getComponentExtension <em>Component Extension</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage#getFaceletTaglibTagComponent()
- * @model extendedMetaData="name='facelet-taglib-tag-componentType' kind='elementOnly'"
- * @generated
- */
-public interface FaceletTaglibTagComponent extends UserVisibleTaglibObject
-{
-    /**
-     * Returns the value of the '<em><b>Component Type</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Component Type</em>' containment reference isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Component Type</em>' containment reference.
-     * @see #setComponentType(IdentifiableStringValue)
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage#getFaceletTaglibTagComponent_ComponentType()
-     * @model containment="true" required="true"
-     *        extendedMetaData="kind='element' name='component-type' namespace='##targetNamespace'"
-     * @generated
-     */
-    IdentifiableStringValue getComponentType();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagComponent#getComponentType <em>Component Type</em>}' containment reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Component Type</em>' containment reference.
-     * @see #getComponentType()
-     * @generated
-     */
-    void setComponentType(IdentifiableStringValue value);
-
-    /**
-     * Returns the value of the '<em><b>Renderer Type</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Renderer Type</em>' containment reference isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Renderer Type</em>' containment reference.
-     * @see #setRendererType(IdentifiableStringValue)
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage#getFaceletTaglibTagComponent_RendererType()
-     * @model containment="true"
-     *        extendedMetaData="kind='element' name='renderer-type' namespace='##targetNamespace'"
-     * @generated
-     */
-    IdentifiableStringValue getRendererType();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagComponent#getRendererType <em>Renderer Type</em>}' containment reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Renderer Type</em>' containment reference.
-     * @see #getRendererType()
-     * @generated
-     */
-    void setRendererType(IdentifiableStringValue value);
-
-    /**
-     * Returns the value of the '<em><b>Handler Class</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Handler Class</em>' containment reference isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Handler Class</em>' containment reference.
-     * @see #setHandlerClass(FullyQualifiedClass)
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage#getFaceletTaglibTagComponent_HandlerClass()
-     * @model containment="true"
-     *        extendedMetaData="kind='element' name='handler-class' namespace='##targetNamespace'"
-     * @generated
-     */
-    FullyQualifiedClass getHandlerClass();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagComponent#getHandlerClass <em>Handler Class</em>}' containment reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Handler Class</em>' containment reference.
-     * @see #getHandlerClass()
-     * @generated
-     */
-    void setHandlerClass(FullyQualifiedClass value);
-
-    /**
-     * Returns the value of the '<em><b>Component Extension</b></em>' containment reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagComponentExtension}.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Component Extension</em>' containment reference list isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Component Extension</em>' containment reference list.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage#getFaceletTaglibTagComponent_ComponentExtension()
-     * @model containment="true"
-     *        extendedMetaData="kind='element' name='component-extension' namespace='##targetNamespace'"
-     * @generated
-     */
-    EList<FaceletTaglibTagComponentExtension> getComponentExtension();
-
-} // FaceletTaglibTagComponent
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/FaceletTaglibTagComponentExtension.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/FaceletTaglibTagComponentExtension.java
deleted file mode 100644
index 83c19b9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/FaceletTaglibTagComponentExtension.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: FaceletTaglibTagComponentExtension.java,v 1.1 2010/03/18 06:24:29 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib;
-
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.util.FeatureMap;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Facelet Taglib Tag Component Extension</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * 
- *                 Extension element for component It may contain
- *                 implementation specific content.
- *             
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagComponentExtension#getAny <em>Any</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagComponentExtension#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage#getFaceletTaglibTagComponentExtension()
- * @model extendedMetaData="name='facelet-taglib-tag-component-extensionType' kind='elementOnly'"
- * @generated
- */
-public interface FaceletTaglibTagComponentExtension extends EObject
-{
-    /**
-     * Returns the value of the '<em><b>Any</b></em>' attribute list.
-     * The list contents are of type {@link org.eclipse.emf.ecore.util.FeatureMap.Entry}.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Any</em>' attribute list isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Any</em>' attribute list.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage#getFaceletTaglibTagComponentExtension_Any()
-     * @model unique="false" dataType="org.eclipse.emf.ecore.EFeatureMapEntry" many="true"
-     *        extendedMetaData="kind='elementWildcard' wildcards='##any' name=':0' processing='lax'"
-     * @generated
-     */
-    FeatureMap getAny();
-
-    /**
-     * Returns the value of the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Id</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Id</em>' attribute.
-     * @see #setId(String)
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage#getFaceletTaglibTagComponentExtension_Id()
-     * @model id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-     *        extendedMetaData="kind='attribute' name='id'"
-     * @generated
-     */
-    String getId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagComponentExtension#getId <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Id</em>' attribute.
-     * @see #getId()
-     * @generated
-     */
-    void setId(String value);
-
-} // FaceletTaglibTagComponentExtension
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/FaceletTaglibTagConverter.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/FaceletTaglibTagConverter.java
deleted file mode 100644
index 35a2b49..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/FaceletTaglibTagConverter.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: FaceletTaglibTagConverter.java,v 1.1 2010/03/18 06:24:29 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib;
-
-import org.eclipse.emf.common.util.EList;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Facelet Taglib Tag Converter</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * 
- *                 Within a tag element, the converter element encapsulates
- *                 information specific to a JSF Converter.
- *             
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagConverter#getConverterId <em>Converter Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagConverter#getHandlerClass <em>Handler Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagConverter#getConverterExtension <em>Converter Extension</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage#getFaceletTaglibTagConverter()
- * @model extendedMetaData="name='facelet-taglib-tag-converterType' kind='elementOnly'"
- * @generated
- */
-public interface FaceletTaglibTagConverter extends UserVisibleTaglibObject
-{
-    /**
-     * Returns the value of the '<em><b>Converter Id</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Converter Id</em>' containment reference isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Converter Id</em>' containment reference.
-     * @see #setConverterId(IdentifiableStringValue)
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage#getFaceletTaglibTagConverter_ConverterId()
-     * @model containment="true" required="true"
-     *        extendedMetaData="kind='element' name='converter-id' namespace='##targetNamespace'"
-     * @generated
-     */
-    IdentifiableStringValue getConverterId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagConverter#getConverterId <em>Converter Id</em>}' containment reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Converter Id</em>' containment reference.
-     * @see #getConverterId()
-     * @generated
-     */
-    void setConverterId(IdentifiableStringValue value);
-
-    /**
-     * Returns the value of the '<em><b>Handler Class</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Handler Class</em>' containment reference isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Handler Class</em>' containment reference.
-     * @see #setHandlerClass(FullyQualifiedClass)
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage#getFaceletTaglibTagConverter_HandlerClass()
-     * @model containment="true"
-     *        extendedMetaData="kind='element' name='handler-class' namespace='##targetNamespace'"
-     * @generated
-     */
-    FullyQualifiedClass getHandlerClass();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagConverter#getHandlerClass <em>Handler Class</em>}' containment reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Handler Class</em>' containment reference.
-     * @see #getHandlerClass()
-     * @generated
-     */
-    void setHandlerClass(FullyQualifiedClass value);
-
-    /**
-     * Returns the value of the '<em><b>Converter Extension</b></em>' containment reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagConverterExtension}.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Converter Extension</em>' containment reference list isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Converter Extension</em>' containment reference list.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage#getFaceletTaglibTagConverter_ConverterExtension()
-     * @model containment="true"
-     *        extendedMetaData="kind='element' name='converter-extension' namespace='##targetNamespace'"
-     * @generated
-     */
-    EList<FaceletTaglibTagConverterExtension> getConverterExtension();
-
-} // FaceletTaglibTagConverter
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/FaceletTaglibTagConverterExtension.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/FaceletTaglibTagConverterExtension.java
deleted file mode 100644
index e6d88c1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/FaceletTaglibTagConverterExtension.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: FaceletTaglibTagConverterExtension.java,v 1.1 2010/03/18 06:24:29 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib;
-
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.util.FeatureMap;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Facelet Taglib Tag Converter Extension</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * 
- *                 Extension element for converter It may contain
- *                 implementation specific content.
- *             
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagConverterExtension#getAny <em>Any</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagConverterExtension#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage#getFaceletTaglibTagConverterExtension()
- * @model extendedMetaData="name='facelet-taglib-tag-converter-extensionType' kind='elementOnly'"
- * @generated
- */
-public interface FaceletTaglibTagConverterExtension extends EObject
-{
-    /**
-     * Returns the value of the '<em><b>Any</b></em>' attribute list.
-     * The list contents are of type {@link org.eclipse.emf.ecore.util.FeatureMap.Entry}.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Any</em>' attribute list isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Any</em>' attribute list.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage#getFaceletTaglibTagConverterExtension_Any()
-     * @model unique="false" dataType="org.eclipse.emf.ecore.EFeatureMapEntry" many="true"
-     *        extendedMetaData="kind='elementWildcard' wildcards='##any' name=':0' processing='lax'"
-     * @generated
-     */
-    FeatureMap getAny();
-
-    /**
-     * Returns the value of the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Id</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Id</em>' attribute.
-     * @see #setId(String)
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage#getFaceletTaglibTagConverterExtension_Id()
-     * @model id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-     *        extendedMetaData="kind='attribute' name='id'"
-     * @generated
-     */
-    String getId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagConverterExtension#getId <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Id</em>' attribute.
-     * @see #getId()
-     * @generated
-     */
-    void setId(String value);
-
-} // FaceletTaglibTagConverterExtension
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/FaceletTaglibTagExtension.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/FaceletTaglibTagExtension.java
deleted file mode 100644
index 013b045..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/FaceletTaglibTagExtension.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: FaceletTaglibTagExtension.java,v 1.1 2010/03/18 06:24:37 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib;
-
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.util.FeatureMap;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Facelet Taglib Tag Extension</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * 
- *                 Extension element for tag It may contain
- *                 implementation specific content.
- *             
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagExtension#getAny <em>Any</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagExtension#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage#getFaceletTaglibTagExtension()
- * @model extendedMetaData="name='facelet-taglib-tag-extensionType' kind='elementOnly'"
- * @generated
- */
-public interface FaceletTaglibTagExtension extends EObject
-{
-    /**
-     * Returns the value of the '<em><b>Any</b></em>' attribute list.
-     * The list contents are of type {@link org.eclipse.emf.ecore.util.FeatureMap.Entry}.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Any</em>' attribute list isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Any</em>' attribute list.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage#getFaceletTaglibTagExtension_Any()
-     * @model unique="false" dataType="org.eclipse.emf.ecore.EFeatureMapEntry" many="true"
-     *        extendedMetaData="kind='elementWildcard' wildcards='##any' name=':0' processing='lax'"
-     * @generated
-     */
-    FeatureMap getAny();
-
-    /**
-     * Returns the value of the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Id</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Id</em>' attribute.
-     * @see #setId(String)
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage#getFaceletTaglibTagExtension_Id()
-     * @model id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-     *        extendedMetaData="kind='attribute' name='id'"
-     * @generated
-     */
-    String getId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagExtension#getId <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Id</em>' attribute.
-     * @see #getId()
-     * @generated
-     */
-    void setId(String value);
-
-} // FaceletTaglibTagExtension
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/FaceletTaglibTagValidator.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/FaceletTaglibTagValidator.java
deleted file mode 100644
index 772fe8c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/FaceletTaglibTagValidator.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: FaceletTaglibTagValidator.java,v 1.1 2010/03/18 06:24:29 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib;
-
-import org.eclipse.emf.common.util.EList;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Facelet Taglib Tag Validator</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * 
- *                 Within a tag element, the validator element encapsulates
- *                 information specific to a JSF Validator.
- *             
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagValidator#getValidatorId <em>Validator Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagValidator#getHandlerClass <em>Handler Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagValidator#getValidatorExtension <em>Validator Extension</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage#getFaceletTaglibTagValidator()
- * @model extendedMetaData="name='facelet-taglib-tag-validatorType' kind='elementOnly'"
- * @generated
- */
-public interface FaceletTaglibTagValidator extends UserVisibleTaglibObject
-{
-    /**
-     * Returns the value of the '<em><b>Validator Id</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Validator Id</em>' containment reference isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Validator Id</em>' containment reference.
-     * @see #setValidatorId(IdentifiableStringValue)
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage#getFaceletTaglibTagValidator_ValidatorId()
-     * @model containment="true" required="true"
-     *        extendedMetaData="kind='element' name='validator-id' namespace='##targetNamespace'"
-     * @generated
-     */
-    IdentifiableStringValue getValidatorId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagValidator#getValidatorId <em>Validator Id</em>}' containment reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Validator Id</em>' containment reference.
-     * @see #getValidatorId()
-     * @generated
-     */
-    void setValidatorId(IdentifiableStringValue value);
-
-    /**
-     * Returns the value of the '<em><b>Handler Class</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Handler Class</em>' containment reference isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Handler Class</em>' containment reference.
-     * @see #setHandlerClass(FullyQualifiedClass)
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage#getFaceletTaglibTagValidator_HandlerClass()
-     * @model containment="true"
-     *        extendedMetaData="kind='element' name='handler-class' namespace='##targetNamespace'"
-     * @generated
-     */
-    FullyQualifiedClass getHandlerClass();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagValidator#getHandlerClass <em>Handler Class</em>}' containment reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Handler Class</em>' containment reference.
-     * @see #getHandlerClass()
-     * @generated
-     */
-    void setHandlerClass(FullyQualifiedClass value);
-
-    /**
-     * Returns the value of the '<em><b>Validator Extension</b></em>' containment reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagValidatorExtension}.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Validator Extension</em>' containment reference list isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Validator Extension</em>' containment reference list.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage#getFaceletTaglibTagValidator_ValidatorExtension()
-     * @model containment="true"
-     *        extendedMetaData="kind='element' name='validator-extension' namespace='##targetNamespace'"
-     * @generated
-     */
-    EList<FaceletTaglibTagValidatorExtension> getValidatorExtension();
-
-} // FaceletTaglibTagValidator
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/FaceletTaglibTagValidatorExtension.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/FaceletTaglibTagValidatorExtension.java
deleted file mode 100644
index 08fd06a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/FaceletTaglibTagValidatorExtension.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: FaceletTaglibTagValidatorExtension.java,v 1.1 2010/03/18 06:24:29 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib;
-
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.util.FeatureMap;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Facelet Taglib Tag Validator Extension</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * 
- *                 Extension element for validator It may contain
- *                 implementation specific content.
- *             
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagValidatorExtension#getAny <em>Any</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagValidatorExtension#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage#getFaceletTaglibTagValidatorExtension()
- * @model extendedMetaData="name='facelet-taglib-tag-validator-extensionType' kind='elementOnly'"
- * @generated
- */
-public interface FaceletTaglibTagValidatorExtension extends EObject
-{
-    /**
-     * Returns the value of the '<em><b>Any</b></em>' attribute list.
-     * The list contents are of type {@link org.eclipse.emf.ecore.util.FeatureMap.Entry}.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Any</em>' attribute list isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Any</em>' attribute list.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage#getFaceletTaglibTagValidatorExtension_Any()
-     * @model unique="false" dataType="org.eclipse.emf.ecore.EFeatureMapEntry" many="true"
-     *        extendedMetaData="kind='elementWildcard' wildcards='##any' name=':0' processing='lax'"
-     * @generated
-     */
-    FeatureMap getAny();
-
-    /**
-     * Returns the value of the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Id</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Id</em>' attribute.
-     * @see #setId(String)
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage#getFaceletTaglibTagValidatorExtension_Id()
-     * @model id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-     *        extendedMetaData="kind='attribute' name='id'"
-     * @generated
-     */
-    String getId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagValidatorExtension#getId <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Id</em>' attribute.
-     * @see #getId()
-     * @generated
-     */
-    void setId(String value);
-
-} // FaceletTaglibTagValidatorExtension
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/FaceletTaglibVersion.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/FaceletTaglibVersion.java
deleted file mode 100644
index 48ab61d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/FaceletTaglibVersion.java
+++ /dev/null
@@ -1,212 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: FaceletTaglibVersion.java,v 1.1 2010/03/18 06:24:28 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib;
-
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.emf.common.util.Enumerator;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the literals of the enumeration '<em><b>Facelet Taglib Version</b></em>',
- * and utility methods for working with them.
- * <!-- end-user-doc -->
- * <!-- begin-model-doc -->
- * 
- *                 This type contains the recognized versions of
- *                 facelet-taglib supported.
- *             
- * <!-- end-model-doc -->
- * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage#getFaceletTaglibVersion()
- * @model extendedMetaData="name='facelet-taglib-versionType'"
- * @generated
- */
-public enum FaceletTaglibVersion implements Enumerator
-{
-    /**
-     * The '<em><b>20</b></em>' literal object.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #_20_VALUE
-     * @generated
-     * @ordered
-     */
-    _20(0, "_20", "2.0");  //$NON-NLS-1$//$NON-NLS-2$
-
-    /**
-     * The '<em><b>20</b></em>' literal value.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of '<em><b>20</b></em>' literal object isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @see #_20
-     * @model literal="2.0"
-     * @generated
-     * @ordered
-     */
-    public static final int _20_VALUE = 0;
-
-    /**
-     * An array of all the '<em><b>Version</b></em>' enumerators.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private static final FaceletTaglibVersion[] VALUES_ARRAY =
-        new FaceletTaglibVersion[]
-        {
-            _20,
-        };
-
-    /**
-     * A public read-only list of all the '<em><b>Version</b></em>' enumerators.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public static final List<FaceletTaglibVersion> VALUES = Collections.unmodifiableList(Arrays.asList(VALUES_ARRAY));
-
-    /**
-     * Returns the '<em><b>Version</b></em>' literal with the specified literal value.
-     * <!-- begin-user-doc -->
-     * @param literal 
-     * @return the version
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public static FaceletTaglibVersion get(String literal)
-    {
-        for (int i = 0; i < VALUES_ARRAY.length; ++i)
-        {
-            FaceletTaglibVersion result = VALUES_ARRAY[i];
-            if (result.toString().equals(literal))
-            {
-                return result;
-            }
-        }
-        return null;
-    }
-
-    /**
-     * Returns the '<em><b>Version</b></em>' literal with the specified name.
-     * <!-- begin-user-doc -->
-     * @param name 
-     * @return the version
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public static FaceletTaglibVersion getByName(String name)
-    {
-        for (int i = 0; i < VALUES_ARRAY.length; ++i)
-        {
-            FaceletTaglibVersion result = VALUES_ARRAY[i];
-            if (result.getName().equals(name))
-            {
-                return result;
-            }
-        }
-        return null;
-    }
-
-    /**
-     * Returns the '<em><b>Version</b></em>' literal with the specified integer value.
-     * <!-- begin-user-doc -->
-     * @param value 
-     * @return the version
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public static FaceletTaglibVersion get(int value)
-    {
-        switch (value)
-        {
-            case _20_VALUE: return _20;
-        }
-        return null;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private final int value;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private final String name;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private final String literal;
-
-    /**
-     * Only this class can construct instances.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private FaceletTaglibVersion(int value, String name, String literal)
-    {
-        this.value = value;
-        this.name = name;
-        this.literal = literal;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public int getValue()
-    {
-      return value;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String getName()
-    {
-      return name;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String getLiteral()
-    {
-      return literal;
-    }
-
-    /**
-     * Returns the literal value of the enumerator, which is its string representation.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public String toString()
-    {
-        return literal;
-    }
-    
-} //FaceletTaglibVersion
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/FullyQualifiedClass.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/FullyQualifiedClass.java
deleted file mode 100644
index 4315186..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/FullyQualifiedClass.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: FullyQualifiedClass.java,v 1.1 2010/03/18 06:24:29 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Fully Qualified Class</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * 
- * 
- *     The elements that use this type designate the name of a
- *     Java class or interface.  The name is in the form of a
- *     "binary name", as defined in the JLS.  This is the form
- *     of name used in Class.forName().  Tools that need the
- *     canonical name (the name used in source code) will need
- *     to convert this binary name to the canonical name.
- * 
- *       
- * <!-- end-model-doc -->
- *
- *
- * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage#getFullyQualifiedClass()
- * @model extendedMetaData="name='fully-qualified-classType' kind='simple'"
- * @generated
- */
-public interface FullyQualifiedClass extends IdentifiableStringValue
-{
- // FullyQualifiedClass
-} 
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/GenericBoolean.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/GenericBoolean.java
deleted file mode 100644
index 23b8f2e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/GenericBoolean.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: GenericBoolean.java,v 1.1 2010/03/18 06:24:29 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Generic Boolean</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * 
- * 
- *     This type defines four different values which can designate
- *     boolean values. This includes values yes and no which are
- *     not designated by xsd:boolean
- * 
- *       
- * <!-- end-model-doc -->
- *
- *
- * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage#getGenericBoolean()
- * @model extendedMetaData="name='generic-booleanType' kind='simple'"
- * @generated
- */
-public interface GenericBoolean extends IdentifiableStringValue
-{
- // GenericBoolean
-} 
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/GenericBooleanBase.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/GenericBooleanBase.java
deleted file mode 100644
index b17f306..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/GenericBooleanBase.java
+++ /dev/null
@@ -1,287 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: GenericBooleanBase.java,v 1.1 2010/03/18 06:24:28 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib;
-
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.emf.common.util.Enumerator;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the literals of the enumeration '<em><b>Generic Boolean Base</b></em>',
- * and utility methods for working with them.
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage#getGenericBooleanBase()
- * @model extendedMetaData="name='generic-booleanType_._base'"
- * @generated
- */
-public enum GenericBooleanBase implements Enumerator
-{
-    /**
-     * The '<em><b>True</b></em>' literal object.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #TRUE_VALUE
-     * @generated
-     * @ordered
-     */
-    TRUE(0, "true", "true"),  //$NON-NLS-1$//$NON-NLS-2$
-
-    /**
-     * The '<em><b>False</b></em>' literal object.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #FALSE_VALUE
-     * @generated
-     * @ordered
-     */
-    FALSE(1, "false", "false"), //$NON-NLS-1$ //$NON-NLS-2$
-
-    /**
-     * The '<em><b>Yes</b></em>' literal object.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #YES_VALUE
-     * @generated
-     * @ordered
-     */
-    YES(2, "yes", "yes"),  //$NON-NLS-1$//$NON-NLS-2$
-
-    /**
-     * The '<em><b>No</b></em>' literal object.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #NO_VALUE
-     * @generated
-     * @ordered
-     */
-    NO(3, "no", "no"); //$NON-NLS-1$ //$NON-NLS-2$
-
-    /**
-     * The '<em><b>True</b></em>' literal value.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of '<em><b>True</b></em>' literal object isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @see #TRUE
-     * @model name="true"
-     * @generated
-     * @ordered
-     */
-    public static final int TRUE_VALUE = 0;
-
-    /**
-     * The '<em><b>False</b></em>' literal value.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of '<em><b>False</b></em>' literal object isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @see #FALSE
-     * @model name="false"
-     * @generated
-     * @ordered
-     */
-    public static final int FALSE_VALUE = 1;
-
-    /**
-     * The '<em><b>Yes</b></em>' literal value.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of '<em><b>Yes</b></em>' literal object isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @see #YES
-     * @model name="yes"
-     * @generated
-     * @ordered
-     */
-    public static final int YES_VALUE = 2;
-
-    /**
-     * The '<em><b>No</b></em>' literal value.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of '<em><b>No</b></em>' literal object isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @see #NO
-     * @model name="no"
-     * @generated
-     * @ordered
-     */
-    public static final int NO_VALUE = 3;
-
-    /**
-     * An array of all the '<em><b>Generic Boolean Base</b></em>' enumerators.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private static final GenericBooleanBase[] VALUES_ARRAY =
-        new GenericBooleanBase[]
-        {
-            TRUE,
-            FALSE,
-            YES,
-            NO,
-        };
-
-    /**
-     * A public read-only list of all the '<em><b>Generic Boolean Base</b></em>' enumerators.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public static final List<GenericBooleanBase> VALUES = Collections.unmodifiableList(Arrays.asList(VALUES_ARRAY));
-
-    /**
-     * Returns the '<em><b>Generic Boolean Base</b></em>' literal with the specified literal value.
-     * <!-- begin-user-doc -->
-     * @param literal 
-     * @return value
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public static GenericBooleanBase get(String literal)
-    {
-        for (int i = 0; i < VALUES_ARRAY.length; ++i)
-        {
-            GenericBooleanBase result = VALUES_ARRAY[i];
-            if (result.toString().equals(literal))
-            {
-                return result;
-            }
-        }
-        return null;
-    }
-
-    /**
-     * Returns the '<em><b>Generic Boolean Base</b></em>' literal with the specified name.
-     * <!-- begin-user-doc -->
-     * @param name 
-     * @return the boolean base.
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public static GenericBooleanBase getByName(String name)
-    {
-        for (int i = 0; i < VALUES_ARRAY.length; ++i)
-        {
-            GenericBooleanBase result = VALUES_ARRAY[i];
-            if (result.getName().equals(name))
-            {
-                return result;
-            }
-        }
-        return null;
-    }
-
-    /**
-     * Returns the '<em><b>Generic Boolean Base</b></em>' literal with the specified integer value.
-     * <!-- begin-user-doc -->
-     * @param value 
-     * @return the boolean base. 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public static GenericBooleanBase get(int value)
-    {
-        switch (value)
-        {
-            case TRUE_VALUE: return TRUE;
-            case FALSE_VALUE: return FALSE;
-            case YES_VALUE: return YES;
-            case NO_VALUE: return NO;
-        }
-        return null;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private final int value;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private final String name;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private final String literal;
-
-    /**
-     * Only this class can construct instances.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private GenericBooleanBase(int value, String name, String literal)
-    {
-        this.value = value;
-        this.name = name;
-        this.literal = literal;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public int getValue()
-    {
-      return value;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String getName()
-    {
-      return name;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String getLiteral()
-    {
-      return literal;
-    }
-
-    /**
-     * Returns the literal value of the enumerator, which is its string representation.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public String toString()
-    {
-        return literal;
-    }
-    
-} //GenericBooleanBase
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/Icon.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/Icon.java
deleted file mode 100644
index 2525a7b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/Icon.java
+++ /dev/null
@@ -1,215 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: Icon.java,v 1.1 2010/03/18 06:24:29 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Icon</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * 
- * 
- *     The icon type contains small-icon and large-icon elements
- *     that specify the file names for small and large GIF, JPEG,
- *     or PNG icon images used to represent the parent element in a
- *     GUI tool.
- * 
- *     The xml:lang attribute defines the language that the
- *     icon file names are provided in. Its value is "en" (English)
- *     by default.
- * 
- *       
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.Icon#getSmallIcon <em>Small Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.Icon#getLargeIcon <em>Large Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.Icon#getId <em>Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.Icon#getLang <em>Lang</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage#getIcon()
- * @model extendedMetaData="name='iconType' kind='elementOnly'"
- * @generated
- */
-public interface Icon extends EObject
-{
-    /**
-     * Returns the value of the '<em><b>Small Icon</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * <!-- begin-model-doc -->
-     * 
-     *         <![CDATA[
-     * 
-     *           The small-icon element contains the name of a file
-     *           containing a small (16 x 16) icon image. The file
-     *           name is a relative path within the Deployment
-     *           Component's Deployment File.
-     * 
-     *           The image may be in the GIF, JPEG, or PNG format.
-     *           The icon can be used by tools.
-     * 
-     *           Example:
-     * 
-     *           <small-icon>employee-service-icon16x16.jpg</small-icon>
-     * 
-     *           ]]>
-     *       
-     * <!-- end-model-doc -->
-     * @return the value of the '<em>Small Icon</em>' containment reference.
-     * @see #setSmallIcon(Path)
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage#getIcon_SmallIcon()
-     * @model containment="true"
-     *        extendedMetaData="kind='element' name='small-icon' namespace='##targetNamespace'"
-     * @generated
-     */
-    Path getSmallIcon();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.Icon#getSmallIcon <em>Small Icon</em>}' containment reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Small Icon</em>' containment reference.
-     * @see #getSmallIcon()
-     * @generated
-     */
-    void setSmallIcon(Path value);
-
-    /**
-     * Returns the value of the '<em><b>Large Icon</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * <!-- begin-model-doc -->
-     * 
-     *         <![CDATA[
-     * 
-     *           The large-icon element contains the name of a file
-     *           containing a large
-     *           (32 x 32) icon image. The file name is a relative
-     *           path within the Deployment Component's Deployment
-     *           File.
-     * 
-     *           The image may be in the GIF, JPEG, or PNG format.
-     *           The icon can be used by tools.
-     * 
-     *           Example:
-     * 
-     *           <large-icon>employee-service-icon32x32.jpg</large-icon>
-     * 
-     *           ]]>
-     *       
-     * <!-- end-model-doc -->
-     * @return the value of the '<em>Large Icon</em>' containment reference.
-     * @see #setLargeIcon(Path)
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage#getIcon_LargeIcon()
-     * @model containment="true"
-     *        extendedMetaData="kind='element' name='large-icon' namespace='##targetNamespace'"
-     * @generated
-     */
-    Path getLargeIcon();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.Icon#getLargeIcon <em>Large Icon</em>}' containment reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Large Icon</em>' containment reference.
-     * @see #getLargeIcon()
-     * @generated
-     */
-    void setLargeIcon(Path value);
-
-    /**
-     * Returns the value of the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Id</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Id</em>' attribute.
-     * @see #setId(String)
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage#getIcon_Id()
-     * @model id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-     *        extendedMetaData="kind='attribute' name='id'"
-     * @generated
-     */
-    String getId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.Icon#getId <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Id</em>' attribute.
-     * @see #getId()
-     * @generated
-     */
-    void setId(String value);
-
-    /**
-     * Returns the value of the '<em><b>Lang</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * <!-- begin-model-doc -->
-     * 
-     *     <div xmlns="http://www.w3.org/1999/xhtml">
-     *      
-     *       <h3>lang (as an attribute name)</h3>
-     *       <p>
-     *        denotes an attribute whose value
-     *        is a language code for the natural language of the content of
-     *        any element; its value is inherited.  This name is reserved
-     *        by virtue of its definition in the XML specification.</p>
-     *      
-     *     </div>
-     *     <div xmlns="http://www.w3.org/1999/xhtml">
-     *      <h4>Notes</h4>
-     *      <p>
-     *       Attempting to install the relevant ISO 2- and 3-letter
-     *       codes as the enumerated possible values is probably never
-     *       going to be a realistic possibility.  
-     *      </p>
-     *      <p>
-     *       See BCP 47 at <a href="http://www.rfc-editor.org/rfc/bcp/bcp47.txt">
-     *        http://www.rfc-editor.org/rfc/bcp/bcp47.txt</a>
-     *       and the IANA language subtag registry at
-     *       <a href="http://www.iana.org/assignments/language-subtag-registry">
-     *        http://www.iana.org/assignments/language-subtag-registry</a>
-     *       for further information.
-     *      </p>
-     *      <p>
-     *       The union allows for the 'un-declaration' of xml:lang with
-     *       the empty string.
-     *      </p>
-     *     </div>
-     *    
-     * <!-- end-model-doc -->
-     * @return the value of the '<em>Lang</em>' attribute.
-     * @see #setLang(String)
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage#getIcon_Lang()
-     * @model extendedMetaData="kind='attribute' name='lang' namespace='http://www.w3.org/XML/1998/namespace'"
-     * @generated
-     */
-    String getLang();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.Icon#getLang <em>Lang</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Lang</em>' attribute.
-     * @see #getLang()
-     * @generated
-     */
-    void setLang(String value);
-
-} // Icon
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/IdentifiableLangStringValue.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/IdentifiableLangStringValue.java
deleted file mode 100644
index 262a670..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/IdentifiableLangStringValue.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: IdentifiableLangStringValue.java,v 1.1 2010/03/18 06:24:37 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Identifiable Lang String Value</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.IdentifiableLangStringValue#getLang <em>Lang</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage#getIdentifiableLangStringValue()
- * @model abstract="true"
- * @generated
- */
-public interface IdentifiableLangStringValue extends IdentifiableStringValue
-{
-    /**
-     * Returns the value of the '<em><b>Lang</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * <!-- begin-model-doc -->
-     * 
-     *     <div xmlns="http://www.w3.org/1999/xhtml">
-     *      
-     *       <h3>lang (as an attribute name)</h3>
-     *       <p>
-     *        denotes an attribute whose value
-     *        is a language code for the natural language of the content of
-     *        any element; its value is inherited.  This name is reserved
-     *        by virtue of its definition in the XML specification.</p>
-     *      
-     *     </div>
-     *     <div xmlns="http://www.w3.org/1999/xhtml">
-     *      <h4>Notes</h4>
-     *      <p>
-     *       Attempting to install the relevant ISO 2- and 3-letter
-     *       codes as the enumerated possible values is probably never
-     *       going to be a realistic possibility.  
-     *      </p>
-     *      <p>
-     *       See BCP 47 at <a href="http://www.rfc-editor.org/rfc/bcp/bcp47.txt">
-     *        http://www.rfc-editor.org/rfc/bcp/bcp47.txt</a>
-     *       and the IANA language subtag registry at
-     *       <a href="http://www.iana.org/assignments/language-subtag-registry">
-     *        http://www.iana.org/assignments/language-subtag-registry</a>
-     *       for further information.
-     *      </p>
-     *      <p>
-     *       The union allows for the 'un-declaration' of xml:lang with
-     *       the empty string.
-     *      </p>
-     *     </div>
-     *    
-     * <!-- end-model-doc -->
-     * @return the value of the '<em>Lang</em>' attribute.
-     * @see #setLang(String)
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage#getIdentifiableLangStringValue_Lang()
-     * @model extendedMetaData="kind='attribute' name='lang' namespace='http://www.w3.org/XML/1998/namespace'"
-     * @generated
-     */
-    String getLang();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.IdentifiableLangStringValue#getLang <em>Lang</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Lang</em>' attribute.
-     * @see #getLang()
-     * @generated
-     */
-    void setLang(String value);
-
-} // IdentifiableLangStringValue
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/IdentifiableStringValue.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/IdentifiableStringValue.java
deleted file mode 100644
index 6e0693c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/IdentifiableStringValue.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: IdentifiableStringValue.java,v 1.1 2010/03/18 06:24:36 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Identifiable String Value</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * 
- * 
- *     This is a special string datatype that is defined by Java EE as
- *     a base type for defining collapsed strings. When schemas
- *     require trailing/leading space elimination as well as
- *     collapsing the existing whitespace, this base type may be
- *     used.
- * 
- *       
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.IdentifiableStringValue#getValue <em>Value</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.IdentifiableStringValue#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage#getIdentifiableStringValue()
- * @model extendedMetaData="name='string' kind='simple'"
- * @generated
- */
-public interface IdentifiableStringValue extends EObject
-{
-    /**
-     * Returns the value of the '<em><b>Value</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Value</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Value</em>' attribute.
-     * @see #setValue(String)
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage#getIdentifiableStringValue_Value()
-     * @model dataType="org.eclipse.emf.ecore.xml.type.Token"
-     *        extendedMetaData="name=':0' kind='simple'"
-     * @generated
-     */
-    String getValue();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.IdentifiableStringValue#getValue <em>Value</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Value</em>' attribute.
-     * @see #getValue()
-     * @generated
-     */
-    void setValue(String value);
-
-    /**
-     * Returns the value of the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Id</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Id</em>' attribute.
-     * @see #setId(String)
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage#getIdentifiableStringValue_Id()
-     * @model id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-     *        extendedMetaData="kind='attribute' name='id'"
-     * @generated
-     */
-    String getId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.IdentifiableStringValue#getId <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Id</em>' attribute.
-     * @see #getId()
-     * @generated
-     */
-    void setId(String value);
-
-} // IdentifiableStringValue
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/JavaIdentifier.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/JavaIdentifier.java
deleted file mode 100644
index f6623c1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/JavaIdentifier.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: JavaIdentifier.java,v 1.1 2010/03/18 06:24:37 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Java Identifier</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * 
- * 
- *     The java-identifierType defines a Java identifier.
- *     The users of this type should further verify that
- *     the content does not contain Java reserved keywords.
- * 
- *       
- * <!-- end-model-doc -->
- *
- *
- * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage#getJavaIdentifier()
- * @model extendedMetaData="name='java-identifierType' kind='simple'"
- * @generated
- */
-public interface JavaIdentifier extends IdentifiableStringValue
-{
- // JavaIdentifier
-} 
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/Path.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/Path.java
deleted file mode 100644
index 35a2fb7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/Path.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: Path.java,v 1.1 2010/03/18 06:24:37 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Path</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * 
- * 
- *     The elements that use this type designate either a relative
- *     path or an absolute path starting with a "/".
- * 
- *     In elements that specify a pathname to a file within the
- *     same Deployment File, relative filenames (i.e., those not
- *     starting with "/") are considered relative to the root of
- *     the Deployment File's namespace.  Absolute filenames (i.e.,
- *     those starting with "/") also specify names in the root of
- *     the Deployment File's namespace.  In general, relative names
- *     are preferred.  The exception is .war files where absolute
- *     names are preferred for consistency with the Servlet API.
- * 
- *       
- * <!-- end-model-doc -->
- *
- *
- * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage#getPath()
- * @model extendedMetaData="name='pathType' kind='simple'"
- * @generated
- */
-public interface Path extends IdentifiableStringValue
-{
- // Path
-} 
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/UserVisibleTaglibObject.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/UserVisibleTaglibObject.java
deleted file mode 100644
index d4684f8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/UserVisibleTaglibObject.java
+++ /dev/null
@@ -1,150 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: UserVisibleTaglibObject.java,v 1.1 2010/03/18 06:24:37 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>User Visible Taglib Object</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.UserVisibleTaglibObject#getDescription <em>Description</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.UserVisibleTaglibObject#getDisplayName <em>Display Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.UserVisibleTaglibObject#getIcon <em>Icon</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage#getUserVisibleTaglibObject()
- * @model abstract="true"
- * @generated
- */
-public interface UserVisibleTaglibObject extends EObject
-{
-    /**
-     * Returns the value of the '<em><b>Description</b></em>' containment reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.Description}.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Description</em>' containment reference list isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Description</em>' containment reference list.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage#getUserVisibleTaglibObject_Description()
-     * @model containment="true"
-     *        extendedMetaData="kind='element' name='description' namespace='##targetNamespace'"
-     * @generated
-     */
-    EList<Description> getDescription();
-
-    /**
-     * Returns the value of the '<em><b>Display Name</b></em>' containment reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.DisplayName}.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Display Name</em>' containment reference list isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Display Name</em>' containment reference list.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage#getUserVisibleTaglibObject_DisplayName()
-     * @model containment="true"
-     *        extendedMetaData="kind='element' name='display-name' namespace='##targetNamespace'"
-     * @generated
-     */
-    EList<DisplayName> getDisplayName();
-
-    /**
-     * Returns the value of the '<em><b>Icon</b></em>' containment reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.Icon}.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Icon</em>' containment reference list isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Icon</em>' containment reference list.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage#getUserVisibleTaglibObject_Icon()
-     * @model containment="true"
-     *        extendedMetaData="kind='element' name='icon' namespace='##targetNamespace'"
-     * @generated
-     */
-    EList<Icon> getIcon();
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param language 
-     * @return 
-     * <!-- end-user-doc -->
-     * <!-- begin-model-doc -->
-     * Iterates through all descriptions and returns a concatenated string of
-     * all descriptions for the specified language.
-     * Passing the empty string indicates descriptions with no locale.
-     * Passing null is invalid and will cause an NPE to be thrown.
-     * @param separationString
-     *   A string that will be used to separate each individual description after it
-     *   has been trimmed but before it is concatenated to the result.
-     * <!-- end-model-doc -->
-     * @model
-     * @generated
-     */
-    String getDescription(String language, String separationString);
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return 
-     * <!-- end-user-doc -->
-     * <!-- begin-model-doc -->
-     * Equivalent to getDescription("").
-     * @param separationString
-     *   A string that will be used to separate each individual display-name after it
-     *   has been trimmed but before it is concatenated to the result.
-     * <!-- end-model-doc -->
-     * @model
-     * @generated
-     */
-    String getDefaultDescription(String separationString);
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param language 
-     * @return 
-     * <!-- end-user-doc -->
-     * <!-- begin-model-doc -->
-     * Iterates through all display names and returns a concatenated string of
-     * all display names for the specified language.  Passing null indicates the use of the current locale.
-     * Passing the empty string indicates descriptions with no locale.
-     * @param separationString
-     *   A string that will be used to separate each individual display-name after it
-     *   has been trimmed but before it is concatenated to the result.
-     * <!-- end-model-doc -->
-     * @model
-     * @generated
-     */
-    String getDisplayName(String language, String separationString);
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return 
-     * <!-- end-user-doc -->
-     * <!-- begin-model-doc -->
-     * Equivalent to getDisplayName("").
-     * @param separationString
-     *   A string that will be used to separate each individual display-name after it
-     *   has been trimmed but before it is concatenated to the result.
-     * <!-- end-model-doc -->
-     * @model
-     * @generated
-     */
-    String getDefaultDisplayName(String separationString);
-
-} // UserVisibleTaglibObject
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/impl/DescriptionImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/impl/DescriptionImpl.java
deleted file mode 100644
index 1b9cf17..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/impl/DescriptionImpl.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: DescriptionImpl.java,v 1.1 2010/03/18 06:24:38 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.Description;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Description</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * </p>
- *
- * @generated
- */
-public class DescriptionImpl extends IdentifiableLangStringValueImpl implements Description
-{
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected DescriptionImpl()
-    {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    protected EClass eStaticClass()
-    {
-        return FaceletTaglibPackage.Literals.DESCRIPTION;
-    }
-
-} //DescriptionImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/impl/DisplayNameImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/impl/DisplayNameImpl.java
deleted file mode 100644
index 9b59e3b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/impl/DisplayNameImpl.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: DisplayNameImpl.java,v 1.1 2010/03/18 06:24:38 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.DisplayName;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Display Name</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * </p>
- *
- * @generated
- */
-public class DisplayNameImpl extends IdentifiableLangStringValueImpl implements DisplayName
-{
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected DisplayNameImpl()
-    {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    protected EClass eStaticClass()
-    {
-        return FaceletTaglibPackage.Literals.DISPLAY_NAME;
-    }
-
-} //DisplayNameImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/impl/DocumentRootImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/impl/DocumentRootImpl.java
deleted file mode 100644
index 3786cba..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/impl/DocumentRootImpl.java
+++ /dev/null
@@ -1,307 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: DocumentRootImpl.java,v 1.1 2010/03/18 06:24:38 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl;
-
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EMap;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.EcorePackage;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.impl.EStringToStringMapEntryImpl;
-import org.eclipse.emf.ecore.util.BasicFeatureMap;
-import org.eclipse.emf.ecore.util.EcoreEMap;
-import org.eclipse.emf.ecore.util.FeatureMap;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.DocumentRoot;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglib;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Document Root</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.DocumentRootImpl#getMixed <em>Mixed</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.DocumentRootImpl#getXMLNSPrefixMap <em>XMLNS Prefix Map</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.DocumentRootImpl#getXSISchemaLocation <em>XSI Schema Location</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.DocumentRootImpl#getFaceletTaglib <em>Facelet Taglib</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class DocumentRootImpl extends EObjectImpl implements DocumentRoot
-{
-    /**
-     * The cached value of the '{@link #getMixed() <em>Mixed</em>}' attribute list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getMixed()
-     * @generated
-     * @ordered
-     */
-    protected FeatureMap mixed;
-
-    /**
-     * The cached value of the '{@link #getXMLNSPrefixMap() <em>XMLNS Prefix Map</em>}' map.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getXMLNSPrefixMap()
-     * @generated
-     * @ordered
-     */
-    protected EMap<String, String> xMLNSPrefixMap;
-
-    /**
-     * The cached value of the '{@link #getXSISchemaLocation() <em>XSI Schema Location</em>}' map.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getXSISchemaLocation()
-     * @generated
-     * @ordered
-     */
-    protected EMap<String, String> xSISchemaLocation;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected DocumentRootImpl()
-    {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    protected EClass eStaticClass()
-    {
-        return FaceletTaglibPackage.Literals.DOCUMENT_ROOT;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public FeatureMap getMixed()
-    {
-        if (mixed == null)
-        {
-            mixed = new BasicFeatureMap(this, FaceletTaglibPackage.DOCUMENT_ROOT__MIXED);
-        }
-        return mixed;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EMap<String, String> getXMLNSPrefixMap()
-    {
-        if (xMLNSPrefixMap == null)
-        {
-            xMLNSPrefixMap = new EcoreEMap<String,String>(EcorePackage.Literals.ESTRING_TO_STRING_MAP_ENTRY, EStringToStringMapEntryImpl.class, this, FaceletTaglibPackage.DOCUMENT_ROOT__XMLNS_PREFIX_MAP);
-        }
-        return xMLNSPrefixMap;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EMap<String, String> getXSISchemaLocation()
-    {
-        if (xSISchemaLocation == null)
-        {
-            xSISchemaLocation = new EcoreEMap<String,String>(EcorePackage.Literals.ESTRING_TO_STRING_MAP_ENTRY, EStringToStringMapEntryImpl.class, this, FaceletTaglibPackage.DOCUMENT_ROOT__XSI_SCHEMA_LOCATION);
-        }
-        return xSISchemaLocation;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public FaceletTaglib getFaceletTaglib()
-    {
-        return (FaceletTaglib)getMixed().get(FaceletTaglibPackage.Literals.DOCUMENT_ROOT__FACELET_TAGLIB, true);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param newFaceletTaglib 
-     * @param msgs 
-     * @return the notification chain
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public NotificationChain basicSetFaceletTaglib(FaceletTaglib newFaceletTaglib, NotificationChain msgs)
-    {
-        return ((FeatureMap.Internal)getMixed()).basicAdd(FaceletTaglibPackage.Literals.DOCUMENT_ROOT__FACELET_TAGLIB, newFaceletTaglib, msgs);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setFaceletTaglib(FaceletTaglib newFaceletTaglib)
-    {
-        ((FeatureMap.Internal)getMixed()).set(FaceletTaglibPackage.Literals.DOCUMENT_ROOT__FACELET_TAGLIB, newFaceletTaglib);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglibPackage.DOCUMENT_ROOT__MIXED:
-                return ((InternalEList<?>)getMixed()).basicRemove(otherEnd, msgs);
-            case FaceletTaglibPackage.DOCUMENT_ROOT__XMLNS_PREFIX_MAP:
-                return ((InternalEList<?>)getXMLNSPrefixMap()).basicRemove(otherEnd, msgs);
-            case FaceletTaglibPackage.DOCUMENT_ROOT__XSI_SCHEMA_LOCATION:
-                return ((InternalEList<?>)getXSISchemaLocation()).basicRemove(otherEnd, msgs);
-            case FaceletTaglibPackage.DOCUMENT_ROOT__FACELET_TAGLIB:
-                return basicSetFaceletTaglib(null, msgs);
-        }
-        return super.eInverseRemove(otherEnd, featureID, msgs);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public Object eGet(int featureID, boolean resolve, boolean coreType)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglibPackage.DOCUMENT_ROOT__MIXED:
-                if (coreType) return getMixed();
-                return ((FeatureMap.Internal)getMixed()).getWrapper();
-            case FaceletTaglibPackage.DOCUMENT_ROOT__XMLNS_PREFIX_MAP:
-                if (coreType) return getXMLNSPrefixMap();
-                    return getXMLNSPrefixMap().map();
-            case FaceletTaglibPackage.DOCUMENT_ROOT__XSI_SCHEMA_LOCATION:
-                if (coreType) return getXSISchemaLocation();
-                    return getXSISchemaLocation().map();
-            case FaceletTaglibPackage.DOCUMENT_ROOT__FACELET_TAGLIB:
-                return getFaceletTaglib();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public void eSet(int featureID, Object newValue)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglibPackage.DOCUMENT_ROOT__MIXED:
-                ((FeatureMap.Internal)getMixed()).set(newValue);
-                return;
-            case FaceletTaglibPackage.DOCUMENT_ROOT__XMLNS_PREFIX_MAP:
-                ((EStructuralFeature.Setting)getXMLNSPrefixMap()).set(newValue);
-                return;
-            case FaceletTaglibPackage.DOCUMENT_ROOT__XSI_SCHEMA_LOCATION:
-                ((EStructuralFeature.Setting)getXSISchemaLocation()).set(newValue);
-                return;
-            case FaceletTaglibPackage.DOCUMENT_ROOT__FACELET_TAGLIB:
-                setFaceletTaglib((FaceletTaglib)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public void eUnset(int featureID)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglibPackage.DOCUMENT_ROOT__MIXED:
-                getMixed().clear();
-                return;
-            case FaceletTaglibPackage.DOCUMENT_ROOT__XMLNS_PREFIX_MAP:
-                getXMLNSPrefixMap().clear();
-                return;
-            case FaceletTaglibPackage.DOCUMENT_ROOT__XSI_SCHEMA_LOCATION:
-                getXSISchemaLocation().clear();
-                return;
-            case FaceletTaglibPackage.DOCUMENT_ROOT__FACELET_TAGLIB:
-                setFaceletTaglib((FaceletTaglib)null);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public boolean eIsSet(int featureID)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglibPackage.DOCUMENT_ROOT__MIXED:
-                return mixed != null && !mixed.isEmpty();
-            case FaceletTaglibPackage.DOCUMENT_ROOT__XMLNS_PREFIX_MAP:
-                return xMLNSPrefixMap != null && !xMLNSPrefixMap.isEmpty();
-            case FaceletTaglibPackage.DOCUMENT_ROOT__XSI_SCHEMA_LOCATION:
-                return xSISchemaLocation != null && !xSISchemaLocation.isEmpty();
-            case FaceletTaglibPackage.DOCUMENT_ROOT__FACELET_TAGLIB:
-                return getFaceletTaglib() != null;
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public String toString()
-    {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (mixed: "); //$NON-NLS-1$
-        result.append(mixed);
-        result.append(')');
-        return result.toString();
-    }
-
-} //DocumentRootImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/impl/FaceletTaglibCanonicalNameImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/impl/FaceletTaglibCanonicalNameImpl.java
deleted file mode 100644
index 01a3571..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/impl/FaceletTaglibCanonicalNameImpl.java
+++ /dev/null
@@ -1,234 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: FaceletTaglibCanonicalNameImpl.java,v 1.1 2010/03/18 06:24:39 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibCanonicalName;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Facelet Taglib Canonical Name</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibCanonicalNameImpl#getValue <em>Value</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibCanonicalNameImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class FaceletTaglibCanonicalNameImpl extends EObjectImpl implements FaceletTaglibCanonicalName
-{
-    /**
-     * The default value of the '{@link #getValue() <em>Value</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getValue()
-     * @generated
-     * @ordered
-     */
-    protected static final String VALUE_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getValue() <em>Value</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getValue()
-     * @generated
-     * @ordered
-     */
-    protected String value = VALUE_EDEFAULT;
-
-    /**
-     * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-    protected static final String ID_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-    protected String id = ID_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected FaceletTaglibCanonicalNameImpl()
-    {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    protected EClass eStaticClass()
-    {
-        return FaceletTaglibPackage.Literals.FACELET_TAGLIB_CANONICAL_NAME;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String getValue()
-    {
-        return value;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setValue(String newValue)
-    {
-        String oldValue = value;
-        value = newValue;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FaceletTaglibPackage.FACELET_TAGLIB_CANONICAL_NAME__VALUE, oldValue, value));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String getId()
-    {
-        return id;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setId(String newId)
-    {
-        String oldId = id;
-        id = newId;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FaceletTaglibPackage.FACELET_TAGLIB_CANONICAL_NAME__ID, oldId, id));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public Object eGet(int featureID, boolean resolve, boolean coreType)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglibPackage.FACELET_TAGLIB_CANONICAL_NAME__VALUE:
-                return getValue();
-            case FaceletTaglibPackage.FACELET_TAGLIB_CANONICAL_NAME__ID:
-                return getId();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public void eSet(int featureID, Object newValue)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglibPackage.FACELET_TAGLIB_CANONICAL_NAME__VALUE:
-                setValue((String)newValue);
-                return;
-            case FaceletTaglibPackage.FACELET_TAGLIB_CANONICAL_NAME__ID:
-                setId((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public void eUnset(int featureID)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglibPackage.FACELET_TAGLIB_CANONICAL_NAME__VALUE:
-                setValue(VALUE_EDEFAULT);
-                return;
-            case FaceletTaglibPackage.FACELET_TAGLIB_CANONICAL_NAME__ID:
-                setId(ID_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public boolean eIsSet(int featureID)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglibPackage.FACELET_TAGLIB_CANONICAL_NAME__VALUE:
-                return VALUE_EDEFAULT == null ? value != null : !VALUE_EDEFAULT.equals(value);
-            case FaceletTaglibPackage.FACELET_TAGLIB_CANONICAL_NAME__ID:
-                return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public String toString()
-    {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (value: "); //$NON-NLS-1$
-        result.append(value);
-        result.append(", id: "); //$NON-NLS-1$
-        result.append(id);
-        result.append(')');
-        return result.toString();
-    }
-
-} //FaceletTaglibCanonicalNameImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/impl/FaceletTaglibExtensionImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/impl/FaceletTaglibExtensionImpl.java
deleted file mode 100644
index a347bc2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/impl/FaceletTaglibExtensionImpl.java
+++ /dev/null
@@ -1,237 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: FaceletTaglibExtensionImpl.java,v 1.1 2010/03/18 06:24:39 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.BasicFeatureMap;
-import org.eclipse.emf.ecore.util.FeatureMap;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibExtension;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Facelet Taglib Extension</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibExtensionImpl#getAny <em>Any</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibExtensionImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class FaceletTaglibExtensionImpl extends EObjectImpl implements FaceletTaglibExtension
-{
-    /**
-     * The cached value of the '{@link #getAny() <em>Any</em>}' attribute list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getAny()
-     * @generated
-     * @ordered
-     */
-    protected FeatureMap any;
-
-    /**
-     * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-    protected static final String ID_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-    protected String id = ID_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected FaceletTaglibExtensionImpl()
-    {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    protected EClass eStaticClass()
-    {
-        return FaceletTaglibPackage.Literals.FACELET_TAGLIB_EXTENSION;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public FeatureMap getAny()
-    {
-        if (any == null)
-        {
-            any = new BasicFeatureMap(this, FaceletTaglibPackage.FACELET_TAGLIB_EXTENSION__ANY);
-        }
-        return any;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String getId()
-    {
-        return id;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setId(String newId)
-    {
-        String oldId = id;
-        id = newId;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FaceletTaglibPackage.FACELET_TAGLIB_EXTENSION__ID, oldId, id));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglibPackage.FACELET_TAGLIB_EXTENSION__ANY:
-                return ((InternalEList<?>)getAny()).basicRemove(otherEnd, msgs);
-        }
-        return super.eInverseRemove(otherEnd, featureID, msgs);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public Object eGet(int featureID, boolean resolve, boolean coreType)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglibPackage.FACELET_TAGLIB_EXTENSION__ANY:
-                if (coreType) return getAny();
-                return ((FeatureMap.Internal)getAny()).getWrapper();
-            case FaceletTaglibPackage.FACELET_TAGLIB_EXTENSION__ID:
-                return getId();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public void eSet(int featureID, Object newValue)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglibPackage.FACELET_TAGLIB_EXTENSION__ANY:
-                ((FeatureMap.Internal)getAny()).set(newValue);
-                return;
-            case FaceletTaglibPackage.FACELET_TAGLIB_EXTENSION__ID:
-                setId((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public void eUnset(int featureID)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglibPackage.FACELET_TAGLIB_EXTENSION__ANY:
-                getAny().clear();
-                return;
-            case FaceletTaglibPackage.FACELET_TAGLIB_EXTENSION__ID:
-                setId(ID_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public boolean eIsSet(int featureID)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglibPackage.FACELET_TAGLIB_EXTENSION__ANY:
-                return any != null && !any.isEmpty();
-            case FaceletTaglibPackage.FACELET_TAGLIB_EXTENSION__ID:
-                return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public String toString()
-    {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (any: "); //$NON-NLS-1$
-        result.append(any);
-        result.append(", id: "); //$NON-NLS-1$
-        result.append(id);
-        result.append(')');
-        return result.toString();
-    }
-
-} //FaceletTaglibExtensionImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/impl/FaceletTaglibFactoryImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/impl/FaceletTaglibFactoryImpl.java
deleted file mode 100644
index 3dd27c7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/impl/FaceletTaglibFactoryImpl.java
+++ /dev/null
@@ -1,629 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: FaceletTaglibFactoryImpl.java,v 1.2 2010/03/18 06:24:39 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EDataType;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.impl.EFactoryImpl;
-import org.eclipse.emf.ecore.plugin.EcorePlugin;
-import org.eclipse.emf.ecore.xml.type.XMLTypeFactory;
-import org.eclipse.emf.ecore.xml.type.XMLTypePackage;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.Description;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.DisplayName;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.DocumentRoot;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglib;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibCanonicalName;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibExtension;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibFactory;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibFunction;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTag;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagAttribute;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagBehavior;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagBehaviorExtension;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagComponent;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagComponentExtension;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagConverter;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagConverterExtension;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagExtension;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagValidator;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagValidatorExtension;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibVersion;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FullyQualifiedClass;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.GenericBoolean;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.GenericBooleanBase;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.Icon;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.IdentifiableStringValue;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.JavaIdentifier;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.Path;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model <b>Factory</b>.
- * <!-- end-user-doc -->
- * @generated
- */
-public class FaceletTaglibFactoryImpl extends EFactoryImpl implements FaceletTaglibFactory
-{
-    /**
-     * Creates the default factory implementation.
-     * <!-- begin-user-doc -->
-     * @return 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public static FaceletTaglibFactory init()
-    {
-        try
-        {
-            FaceletTaglibFactory theFaceletTaglibFactory = (FaceletTaglibFactory)EPackage.Registry.INSTANCE.getEFactory("http://java.sun.com/xml/ns/javaee/web-facelettaglibrary_2_0"); //$NON-NLS-1$ 
-            if (theFaceletTaglibFactory != null)
-            {
-                return theFaceletTaglibFactory;
-            }
-        }
-        catch (Exception exception)
-        {
-            EcorePlugin.INSTANCE.log(exception);
-        }
-        return new FaceletTaglibFactoryImpl();
-    }
-
-    /**
-     * Creates an instance of the factory.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public FaceletTaglibFactoryImpl()
-    {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public EObject create(EClass eClass)
-    {
-        switch (eClass.getClassifierID())
-        {
-            case FaceletTaglibPackage.DESCRIPTION: return createDescription();
-            case FaceletTaglibPackage.DISPLAY_NAME: return createDisplayName();
-            case FaceletTaglibPackage.DOCUMENT_ROOT: return createDocumentRoot();
-            case FaceletTaglibPackage.FACELET_TAGLIB_CANONICAL_NAME: return createFaceletTaglibCanonicalName();
-            case FaceletTaglibPackage.FACELET_TAGLIB_EXTENSION: return createFaceletTaglibExtension();
-            case FaceletTaglibPackage.FACELET_TAGLIB_FUNCTION: return createFaceletTaglibFunction();
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_ATTRIBUTE: return createFaceletTaglibTagAttribute();
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_BEHAVIOR_EXTENSION: return createFaceletTaglibTagBehaviorExtension();
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_BEHAVIOR: return createFaceletTaglibTagBehavior();
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_COMPONENT_EXTENSION: return createFaceletTaglibTagComponentExtension();
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_COMPONENT: return createFaceletTaglibTagComponent();
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_CONVERTER_EXTENSION: return createFaceletTaglibTagConverterExtension();
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_CONVERTER: return createFaceletTaglibTagConverter();
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_EXTENSION: return createFaceletTaglibTagExtension();
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG: return createFaceletTaglibTag();
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_VALIDATOR_EXTENSION: return createFaceletTaglibTagValidatorExtension();
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_VALIDATOR: return createFaceletTaglibTagValidator();
-            case FaceletTaglibPackage.FACELET_TAGLIB: return createFaceletTaglib();
-            case FaceletTaglibPackage.FULLY_QUALIFIED_CLASS: return createFullyQualifiedClass();
-            case FaceletTaglibPackage.GENERIC_BOOLEAN: return createGenericBoolean();
-            case FaceletTaglibPackage.ICON: return createIcon();
-            case FaceletTaglibPackage.JAVA_IDENTIFIER: return createJavaIdentifier();
-            case FaceletTaglibPackage.PATH: return createPath();
-            case FaceletTaglibPackage.IDENTIFIABLE_STRING_VALUE: return createIdentifiableStringValue();
-            default:
-                throw new IllegalArgumentException("The class '" + eClass.getName() + "' is not a valid classifier"); //$NON-NLS-1$ //$NON-NLS-2$
-        }
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public Object createFromString(EDataType eDataType, String initialValue)
-    {
-        switch (eDataType.getClassifierID())
-        {
-            case FaceletTaglibPackage.FACELET_TAGLIB_VERSION:
-                return createFaceletTaglibVersionFromString(eDataType, initialValue);
-            case FaceletTaglibPackage.GENERIC_BOOLEAN_BASE:
-                return createGenericBooleanBaseFromString(eDataType, initialValue);
-            case FaceletTaglibPackage.FACELET_TAGLIB_VERSION_TYPE_OBJECT:
-                return createFaceletTaglibVersionTypeObjectFromString(eDataType, initialValue);
-            case FaceletTaglibPackage.FULLY_QUALIFIED_CLASS_BASE:
-                return createFullyQualifiedClassBaseFromString(eDataType, initialValue);
-            case FaceletTaglibPackage.JAVA_IDENTIFIER_BASE:
-                return createJavaIdentifierBaseFromString(eDataType, initialValue);
-            case FaceletTaglibPackage.PATH_TYPE_BASE:
-                return createPathTypeBaseFromString(eDataType, initialValue);
-            default:
-                throw new IllegalArgumentException("The datatype '" + eDataType.getName() + "' is not a valid classifier"); //$NON-NLS-1$ //$NON-NLS-2$
-        }
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public String convertToString(EDataType eDataType, Object instanceValue)
-    {
-        switch (eDataType.getClassifierID())
-        {
-            case FaceletTaglibPackage.FACELET_TAGLIB_VERSION:
-                return convertFaceletTaglibVersionToString(eDataType, instanceValue);
-            case FaceletTaglibPackage.GENERIC_BOOLEAN_BASE:
-                return convertGenericBooleanBaseToString(eDataType, instanceValue);
-            case FaceletTaglibPackage.FACELET_TAGLIB_VERSION_TYPE_OBJECT:
-                return convertFaceletTaglibVersionTypeObjectToString(eDataType, instanceValue);
-            case FaceletTaglibPackage.FULLY_QUALIFIED_CLASS_BASE:
-                return convertFullyQualifiedClassBaseToString(eDataType, instanceValue);
-            case FaceletTaglibPackage.JAVA_IDENTIFIER_BASE:
-                return convertJavaIdentifierBaseToString(eDataType, instanceValue);
-            case FaceletTaglibPackage.PATH_TYPE_BASE:
-                return convertPathTypeBaseToString(eDataType, instanceValue);
-            default:
-                throw new IllegalArgumentException("The datatype '" + eDataType.getName() + "' is not a valid classifier"); //$NON-NLS-1$ //$NON-NLS-2$
-        }
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Description createDescription()
-    {
-        DescriptionImpl description = new DescriptionImpl();
-        return description;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public DisplayName createDisplayName()
-    {
-        DisplayNameImpl displayName = new DisplayNameImpl();
-        return displayName;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public DocumentRoot createDocumentRoot()
-    {
-        DocumentRootImpl documentRoot = new DocumentRootImpl();
-        return documentRoot;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public FaceletTaglibCanonicalName createFaceletTaglibCanonicalName()
-    {
-        FaceletTaglibCanonicalNameImpl faceletTaglibCanonicalName = new FaceletTaglibCanonicalNameImpl();
-        return faceletTaglibCanonicalName;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public FaceletTaglibExtension createFaceletTaglibExtension()
-    {
-        FaceletTaglibExtensionImpl faceletTaglibExtension = new FaceletTaglibExtensionImpl();
-        return faceletTaglibExtension;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public FaceletTaglibFunction createFaceletTaglibFunction()
-    {
-        FaceletTaglibFunctionImpl faceletTaglibFunction = new FaceletTaglibFunctionImpl();
-        return faceletTaglibFunction;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public FaceletTaglibTagAttribute createFaceletTaglibTagAttribute()
-    {
-        FaceletTaglibTagAttributeImpl faceletTaglibTagAttribute = new FaceletTaglibTagAttributeImpl();
-        return faceletTaglibTagAttribute;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public FaceletTaglibTagBehaviorExtension createFaceletTaglibTagBehaviorExtension()
-    {
-        FaceletTaglibTagBehaviorExtensionImpl faceletTaglibTagBehaviorExtension = new FaceletTaglibTagBehaviorExtensionImpl();
-        return faceletTaglibTagBehaviorExtension;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public FaceletTaglibTagBehavior createFaceletTaglibTagBehavior()
-    {
-        FaceletTaglibTagBehaviorImpl faceletTaglibTagBehavior = new FaceletTaglibTagBehaviorImpl();
-        return faceletTaglibTagBehavior;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public FaceletTaglibTagComponentExtension createFaceletTaglibTagComponentExtension()
-    {
-        FaceletTaglibTagComponentExtensionImpl faceletTaglibTagComponentExtension = new FaceletTaglibTagComponentExtensionImpl();
-        return faceletTaglibTagComponentExtension;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public FaceletTaglibTagComponent createFaceletTaglibTagComponent()
-    {
-        FaceletTaglibTagComponentImpl faceletTaglibTagComponent = new FaceletTaglibTagComponentImpl();
-        return faceletTaglibTagComponent;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public FaceletTaglibTagConverterExtension createFaceletTaglibTagConverterExtension()
-    {
-        FaceletTaglibTagConverterExtensionImpl faceletTaglibTagConverterExtension = new FaceletTaglibTagConverterExtensionImpl();
-        return faceletTaglibTagConverterExtension;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public FaceletTaglibTagConverter createFaceletTaglibTagConverter()
-    {
-        FaceletTaglibTagConverterImpl faceletTaglibTagConverter = new FaceletTaglibTagConverterImpl();
-        return faceletTaglibTagConverter;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public FaceletTaglibTagExtension createFaceletTaglibTagExtension()
-    {
-        FaceletTaglibTagExtensionImpl faceletTaglibTagExtension = new FaceletTaglibTagExtensionImpl();
-        return faceletTaglibTagExtension;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public FaceletTaglibTag createFaceletTaglibTag()
-    {
-        FaceletTaglibTagImpl faceletTaglibTag = new FaceletTaglibTagImpl();
-        return faceletTaglibTag;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public FaceletTaglibTagValidatorExtension createFaceletTaglibTagValidatorExtension()
-    {
-        FaceletTaglibTagValidatorExtensionImpl faceletTaglibTagValidatorExtension = new FaceletTaglibTagValidatorExtensionImpl();
-        return faceletTaglibTagValidatorExtension;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public FaceletTaglibTagValidator createFaceletTaglibTagValidator()
-    {
-        FaceletTaglibTagValidatorImpl faceletTaglibTagValidator = new FaceletTaglibTagValidatorImpl();
-        return faceletTaglibTagValidator;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public FaceletTaglib createFaceletTaglib()
-    {
-        FaceletTaglibImpl faceletTaglib = new FaceletTaglibImpl();
-        return faceletTaglib;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public FullyQualifiedClass createFullyQualifiedClass()
-    {
-        FullyQualifiedClassImpl fullyQualifiedClass = new FullyQualifiedClassImpl();
-        return fullyQualifiedClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public GenericBoolean createGenericBoolean()
-    {
-        GenericBooleanImpl genericBoolean = new GenericBooleanImpl();
-        return genericBoolean;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Icon createIcon()
-    {
-        IconImpl icon = new IconImpl();
-        return icon;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public JavaIdentifier createJavaIdentifier()
-    {
-        JavaIdentifierImpl javaIdentifier = new JavaIdentifierImpl();
-        return javaIdentifier;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Path createPath()
-    {
-        PathImpl path = new PathImpl();
-        return path;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public IdentifiableStringValue createIdentifiableStringValue()
-    {
-        IdentifiableStringValueImpl identifiableStringValue = new IdentifiableStringValueImpl();
-        return identifiableStringValue;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param eDataType 
-     * @param initialValue 
-     * @return the version
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public FaceletTaglibVersion createFaceletTaglibVersionFromString(EDataType eDataType, String initialValue)
-    {
-        FaceletTaglibVersion result = FaceletTaglibVersion.get(initialValue);
-        if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-        return result;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param eDataType 
-     * @param instanceValue 
-     * @return 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String convertFaceletTaglibVersionToString(EDataType eDataType, Object instanceValue)
-    {
-        return instanceValue == null ? null : instanceValue.toString();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param eDataType 
-     * @param initialValue 
-     * @return 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public GenericBooleanBase createGenericBooleanBaseFromString(EDataType eDataType, String initialValue)
-    {
-        GenericBooleanBase result = GenericBooleanBase.get(initialValue);
-        if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-        return result;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param eDataType 
-     * @param instanceValue 
-     * @return 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String convertGenericBooleanBaseToString(EDataType eDataType, Object instanceValue)
-    {
-        return instanceValue == null ? null : instanceValue.toString();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param eDataType 
-     * @param initialValue 
-     * @return 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public FaceletTaglibVersion createFaceletTaglibVersionTypeObjectFromString(EDataType eDataType, String initialValue)
-    {
-        return createFaceletTaglibVersionFromString(FaceletTaglibPackage.Literals.FACELET_TAGLIB_VERSION, initialValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param eDataType 
-     * @param instanceValue 
-     * @return 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String convertFaceletTaglibVersionTypeObjectToString(EDataType eDataType, Object instanceValue)
-    {
-        return convertFaceletTaglibVersionToString(FaceletTaglibPackage.Literals.FACELET_TAGLIB_VERSION, instanceValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param eDataType 
-     * @param initialValue 
-     * @return 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String createFullyQualifiedClassBaseFromString(EDataType eDataType, String initialValue)
-    {
-        return (String)XMLTypeFactory.eINSTANCE.createFromString(XMLTypePackage.Literals.TOKEN, initialValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param eDataType 
-     * @param instanceValue 
-     * @return 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String convertFullyQualifiedClassBaseToString(EDataType eDataType, Object instanceValue)
-    {
-        return XMLTypeFactory.eINSTANCE.convertToString(XMLTypePackage.Literals.TOKEN, instanceValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param eDataType 
-     * @param initialValue 
-     * @return 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String createJavaIdentifierBaseFromString(EDataType eDataType, String initialValue)
-    {
-        return (String)XMLTypeFactory.eINSTANCE.createFromString(XMLTypePackage.Literals.TOKEN, initialValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param eDataType 
-     * @param instanceValue 
-     * @return 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String convertJavaIdentifierBaseToString(EDataType eDataType, Object instanceValue)
-    {
-        return XMLTypeFactory.eINSTANCE.convertToString(XMLTypePackage.Literals.TOKEN, instanceValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param eDataType 
-     * @param initialValue 
-     * @return 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String createPathTypeBaseFromString(EDataType eDataType, String initialValue)
-    {
-        return (String)XMLTypeFactory.eINSTANCE.createFromString(XMLTypePackage.Literals.TOKEN, initialValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param eDataType 
-     * @param instanceValue 
-     * @return 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String convertPathTypeBaseToString(EDataType eDataType, Object instanceValue)
-    {
-        return XMLTypeFactory.eINSTANCE.convertToString(XMLTypePackage.Literals.TOKEN, instanceValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public FaceletTaglibPackage getFaceletTaglibPackage()
-    {
-        return (FaceletTaglibPackage)getEPackage();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return 
-     * <!-- end-user-doc -->
-     * @deprecated
-     * @generated
-     */
-    @Deprecated
-    public static FaceletTaglibPackage getPackage()
-    {
-        return FaceletTaglibPackage.eINSTANCE;
-    }
-
-} //FaceletTaglibFactoryImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/impl/FaceletTaglibFunctionImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/impl/FaceletTaglibFunctionImpl.java
deleted file mode 100644
index b12c43f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/impl/FaceletTaglibFunctionImpl.java
+++ /dev/null
@@ -1,347 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: FaceletTaglibFunctionImpl.java,v 1.1 2010/03/18 06:24:38 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibFunction;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FullyQualifiedClass;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.IdentifiableStringValue;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Facelet Taglib Function</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibFunctionImpl#getFunctionName <em>Function Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibFunctionImpl#getFunctionClass <em>Function Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibFunctionImpl#getFunctionSignature <em>Function Signature</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class FaceletTaglibFunctionImpl extends UserVisibleTaglibObjectImpl implements FaceletTaglibFunction
-{
-    /**
-     * The cached value of the '{@link #getFunctionName() <em>Function Name</em>}' containment reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getFunctionName()
-     * @generated
-     * @ordered
-     */
-    protected IdentifiableStringValue functionName;
-
-    /**
-     * The cached value of the '{@link #getFunctionClass() <em>Function Class</em>}' containment reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getFunctionClass()
-     * @generated
-     * @ordered
-     */
-    protected FullyQualifiedClass functionClass;
-
-    /**
-     * The cached value of the '{@link #getFunctionSignature() <em>Function Signature</em>}' containment reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getFunctionSignature()
-     * @generated
-     * @ordered
-     */
-    protected IdentifiableStringValue functionSignature;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected FaceletTaglibFunctionImpl()
-    {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    protected EClass eStaticClass()
-    {
-        return FaceletTaglibPackage.Literals.FACELET_TAGLIB_FUNCTION;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public IdentifiableStringValue getFunctionName()
-    {
-        return functionName;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param newFunctionName 
-     * @param msgs 
-     * @return the notification chain
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public NotificationChain basicSetFunctionName(IdentifiableStringValue newFunctionName, NotificationChain msgs)
-    {
-        IdentifiableStringValue oldFunctionName = functionName;
-        functionName = newFunctionName;
-        if (eNotificationRequired())
-        {
-            ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FaceletTaglibPackage.FACELET_TAGLIB_FUNCTION__FUNCTION_NAME, oldFunctionName, newFunctionName);
-            if (msgs == null) msgs = notification; else msgs.add(notification);
-        }
-        return msgs;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setFunctionName(IdentifiableStringValue newFunctionName)
-    {
-        if (newFunctionName != functionName)
-        {
-            NotificationChain msgs = null;
-            if (functionName != null)
-                msgs = ((InternalEObject)functionName).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FaceletTaglibPackage.FACELET_TAGLIB_FUNCTION__FUNCTION_NAME, null, msgs);
-            if (newFunctionName != null)
-                msgs = ((InternalEObject)newFunctionName).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FaceletTaglibPackage.FACELET_TAGLIB_FUNCTION__FUNCTION_NAME, null, msgs);
-            msgs = basicSetFunctionName(newFunctionName, msgs);
-            if (msgs != null) msgs.dispatch();
-        }
-        else if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FaceletTaglibPackage.FACELET_TAGLIB_FUNCTION__FUNCTION_NAME, newFunctionName, newFunctionName));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public FullyQualifiedClass getFunctionClass()
-    {
-        return functionClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param newFunctionClass 
-     * @param msgs 
-     * @return the notification chain. 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public NotificationChain basicSetFunctionClass(FullyQualifiedClass newFunctionClass, NotificationChain msgs)
-    {
-        FullyQualifiedClass oldFunctionClass = functionClass;
-        functionClass = newFunctionClass;
-        if (eNotificationRequired())
-        {
-            ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FaceletTaglibPackage.FACELET_TAGLIB_FUNCTION__FUNCTION_CLASS, oldFunctionClass, newFunctionClass);
-            if (msgs == null) msgs = notification; else msgs.add(notification);
-        }
-        return msgs;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setFunctionClass(FullyQualifiedClass newFunctionClass)
-    {
-        if (newFunctionClass != functionClass)
-        {
-            NotificationChain msgs = null;
-            if (functionClass != null)
-                msgs = ((InternalEObject)functionClass).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FaceletTaglibPackage.FACELET_TAGLIB_FUNCTION__FUNCTION_CLASS, null, msgs);
-            if (newFunctionClass != null)
-                msgs = ((InternalEObject)newFunctionClass).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FaceletTaglibPackage.FACELET_TAGLIB_FUNCTION__FUNCTION_CLASS, null, msgs);
-            msgs = basicSetFunctionClass(newFunctionClass, msgs);
-            if (msgs != null) msgs.dispatch();
-        }
-        else if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FaceletTaglibPackage.FACELET_TAGLIB_FUNCTION__FUNCTION_CLASS, newFunctionClass, newFunctionClass));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public IdentifiableStringValue getFunctionSignature()
-    {
-        return functionSignature;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param newFunctionSignature 
-     * @param msgs 
-     * @return the notification chain.
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public NotificationChain basicSetFunctionSignature(IdentifiableStringValue newFunctionSignature, NotificationChain msgs)
-    {
-        IdentifiableStringValue oldFunctionSignature = functionSignature;
-        functionSignature = newFunctionSignature;
-        if (eNotificationRequired())
-        {
-            ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FaceletTaglibPackage.FACELET_TAGLIB_FUNCTION__FUNCTION_SIGNATURE, oldFunctionSignature, newFunctionSignature);
-            if (msgs == null) msgs = notification; else msgs.add(notification);
-        }
-        return msgs;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setFunctionSignature(IdentifiableStringValue newFunctionSignature)
-    {
-        if (newFunctionSignature != functionSignature)
-        {
-            NotificationChain msgs = null;
-            if (functionSignature != null)
-                msgs = ((InternalEObject)functionSignature).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FaceletTaglibPackage.FACELET_TAGLIB_FUNCTION__FUNCTION_SIGNATURE, null, msgs);
-            if (newFunctionSignature != null)
-                msgs = ((InternalEObject)newFunctionSignature).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FaceletTaglibPackage.FACELET_TAGLIB_FUNCTION__FUNCTION_SIGNATURE, null, msgs);
-            msgs = basicSetFunctionSignature(newFunctionSignature, msgs);
-            if (msgs != null) msgs.dispatch();
-        }
-        else if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FaceletTaglibPackage.FACELET_TAGLIB_FUNCTION__FUNCTION_SIGNATURE, newFunctionSignature, newFunctionSignature));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglibPackage.FACELET_TAGLIB_FUNCTION__FUNCTION_NAME:
-                return basicSetFunctionName(null, msgs);
-            case FaceletTaglibPackage.FACELET_TAGLIB_FUNCTION__FUNCTION_CLASS:
-                return basicSetFunctionClass(null, msgs);
-            case FaceletTaglibPackage.FACELET_TAGLIB_FUNCTION__FUNCTION_SIGNATURE:
-                return basicSetFunctionSignature(null, msgs);
-        }
-        return super.eInverseRemove(otherEnd, featureID, msgs);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public Object eGet(int featureID, boolean resolve, boolean coreType)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglibPackage.FACELET_TAGLIB_FUNCTION__FUNCTION_NAME:
-                return getFunctionName();
-            case FaceletTaglibPackage.FACELET_TAGLIB_FUNCTION__FUNCTION_CLASS:
-                return getFunctionClass();
-            case FaceletTaglibPackage.FACELET_TAGLIB_FUNCTION__FUNCTION_SIGNATURE:
-                return getFunctionSignature();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @SuppressWarnings("unchecked")
-    @Override
-    public void eSet(int featureID, Object newValue)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglibPackage.FACELET_TAGLIB_FUNCTION__FUNCTION_NAME:
-                setFunctionName((IdentifiableStringValue)newValue);
-                return;
-            case FaceletTaglibPackage.FACELET_TAGLIB_FUNCTION__FUNCTION_CLASS:
-                setFunctionClass((FullyQualifiedClass)newValue);
-                return;
-            case FaceletTaglibPackage.FACELET_TAGLIB_FUNCTION__FUNCTION_SIGNATURE:
-                setFunctionSignature((IdentifiableStringValue)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public void eUnset(int featureID)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglibPackage.FACELET_TAGLIB_FUNCTION__FUNCTION_NAME:
-                setFunctionName((IdentifiableStringValue)null);
-                return;
-            case FaceletTaglibPackage.FACELET_TAGLIB_FUNCTION__FUNCTION_CLASS:
-                setFunctionClass((FullyQualifiedClass)null);
-                return;
-            case FaceletTaglibPackage.FACELET_TAGLIB_FUNCTION__FUNCTION_SIGNATURE:
-                setFunctionSignature((IdentifiableStringValue)null);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public boolean eIsSet(int featureID)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglibPackage.FACELET_TAGLIB_FUNCTION__FUNCTION_NAME:
-                return functionName != null;
-            case FaceletTaglibPackage.FACELET_TAGLIB_FUNCTION__FUNCTION_CLASS:
-                return functionClass != null;
-            case FaceletTaglibPackage.FACELET_TAGLIB_FUNCTION__FUNCTION_SIGNATURE:
-                return functionSignature != null;
-        }
-        return super.eIsSet(featureID);
-    }
-
-} //FaceletTaglibFunctionImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/impl/FaceletTaglibImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/impl/FaceletTaglibImpl.java
deleted file mode 100644
index 5fc20bc..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/impl/FaceletTaglibImpl.java
+++ /dev/null
@@ -1,694 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: FaceletTaglibImpl.java,v 1.1 2010/03/18 06:24:38 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.util.BasicFeatureMap;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.FeatureMap;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglib;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibExtension;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibFunction;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTag;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibVersion;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FullyQualifiedClass;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.IdentifiableStringValue;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Facelet Taglib</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibImpl#getLibraryClass <em>Library Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibImpl#getNamespace <em>Namespace</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibImpl#getCompositeLibraryName <em>Composite Library Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibImpl#getGroup <em>Group</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibImpl#getTag <em>Tag</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibImpl#getFunction <em>Function</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibImpl#getTaglibExtension <em>Taglib Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibImpl#getId <em>Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibImpl#getVersion <em>Version</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibImpl#getNamespaceUri <em>Namespace Uri</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class FaceletTaglibImpl extends UserVisibleTaglibObjectImpl implements FaceletTaglib
-{
-    /**
-     * The cached value of the '{@link #getLibraryClass() <em>Library Class</em>}' containment reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getLibraryClass()
-     * @generated
-     * @ordered
-     */
-    protected FullyQualifiedClass libraryClass;
-
-    /**
-     * The cached value of the '{@link #getNamespace() <em>Namespace</em>}' containment reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getNamespace()
-     * @generated
-     * @ordered
-     */
-    protected IdentifiableStringValue namespace;
-
-    /**
-     * The cached value of the '{@link #getCompositeLibraryName() <em>Composite Library Name</em>}' containment reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getCompositeLibraryName()
-     * @generated
-     * @ordered
-     */
-    protected FullyQualifiedClass compositeLibraryName;
-
-    /**
-     * The cached value of the '{@link #getGroup() <em>Group</em>}' attribute list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getGroup()
-     * @generated
-     * @ordered
-     */
-    protected FeatureMap group;
-
-    /**
-     * The cached value of the '{@link #getTaglibExtension() <em>Taglib Extension</em>}' containment reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getTaglibExtension()
-     * @generated
-     * @ordered
-     */
-    protected EList<FaceletTaglibExtension> taglibExtension;
-
-    /**
-     * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-    protected static final String ID_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-    protected String id = ID_EDEFAULT;
-
-    /**
-     * The default value of the '{@link #getVersion() <em>Version</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getVersion()
-     * @generated
-     * @ordered
-     */
-    protected static final FaceletTaglibVersion VERSION_EDEFAULT = FaceletTaglibVersion._20;
-
-    /**
-     * The cached value of the '{@link #getVersion() <em>Version</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getVersion()
-     * @generated
-     * @ordered
-     */
-    protected FaceletTaglibVersion version = VERSION_EDEFAULT;
-
-    /**
-     * This is true if the Version attribute has been set.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    protected boolean versionESet;
-
-    /**
-     * The default value of the '{@link #getNamespaceUri() <em>Namespace Uri</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getNamespaceUri()
-     * @generated
-     * @ordered
-     */
-    protected static final String NAMESPACE_URI_EDEFAULT = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected FaceletTaglibImpl()
-    {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    protected EClass eStaticClass()
-    {
-        return FaceletTaglibPackage.Literals.FACELET_TAGLIB;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public FullyQualifiedClass getLibraryClass()
-    {
-        return libraryClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param newLibraryClass 
-     * @param msgs 
-     * @return the notification chain
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public NotificationChain basicSetLibraryClass(FullyQualifiedClass newLibraryClass, NotificationChain msgs)
-    {
-        FullyQualifiedClass oldLibraryClass = libraryClass;
-        libraryClass = newLibraryClass;
-        if (eNotificationRequired())
-        {
-            ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FaceletTaglibPackage.FACELET_TAGLIB__LIBRARY_CLASS, oldLibraryClass, newLibraryClass);
-            if (msgs == null) msgs = notification; else msgs.add(notification);
-        }
-        return msgs;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setLibraryClass(FullyQualifiedClass newLibraryClass)
-    {
-        if (newLibraryClass != libraryClass)
-        {
-            NotificationChain msgs = null;
-            if (libraryClass != null)
-                msgs = ((InternalEObject)libraryClass).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FaceletTaglibPackage.FACELET_TAGLIB__LIBRARY_CLASS, null, msgs);
-            if (newLibraryClass != null)
-                msgs = ((InternalEObject)newLibraryClass).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FaceletTaglibPackage.FACELET_TAGLIB__LIBRARY_CLASS, null, msgs);
-            msgs = basicSetLibraryClass(newLibraryClass, msgs);
-            if (msgs != null) msgs.dispatch();
-        }
-        else if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FaceletTaglibPackage.FACELET_TAGLIB__LIBRARY_CLASS, newLibraryClass, newLibraryClass));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public IdentifiableStringValue getNamespace()
-    {
-        return namespace;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param newNamespace 
-     * @param msgs 
-     * @return the notification chain
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public NotificationChain basicSetNamespace(IdentifiableStringValue newNamespace, NotificationChain msgs)
-    {
-        IdentifiableStringValue oldNamespace = namespace;
-        namespace = newNamespace;
-        if (eNotificationRequired())
-        {
-            ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FaceletTaglibPackage.FACELET_TAGLIB__NAMESPACE, oldNamespace, newNamespace);
-            if (msgs == null) msgs = notification; else msgs.add(notification);
-        }
-        return msgs;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setNamespace(IdentifiableStringValue newNamespace)
-    {
-        if (newNamespace != namespace)
-        {
-            NotificationChain msgs = null;
-            if (namespace != null)
-                msgs = ((InternalEObject)namespace).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FaceletTaglibPackage.FACELET_TAGLIB__NAMESPACE, null, msgs);
-            if (newNamespace != null)
-                msgs = ((InternalEObject)newNamespace).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FaceletTaglibPackage.FACELET_TAGLIB__NAMESPACE, null, msgs);
-            msgs = basicSetNamespace(newNamespace, msgs);
-            if (msgs != null) msgs.dispatch();
-        }
-        else if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FaceletTaglibPackage.FACELET_TAGLIB__NAMESPACE, newNamespace, newNamespace));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public FullyQualifiedClass getCompositeLibraryName()
-    {
-        return compositeLibraryName;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param newCompositeLibraryName 
-     * @param msgs 
-     * @return the notification chain
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public NotificationChain basicSetCompositeLibraryName(FullyQualifiedClass newCompositeLibraryName, NotificationChain msgs)
-    {
-        FullyQualifiedClass oldCompositeLibraryName = compositeLibraryName;
-        compositeLibraryName = newCompositeLibraryName;
-        if (eNotificationRequired())
-        {
-            ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FaceletTaglibPackage.FACELET_TAGLIB__COMPOSITE_LIBRARY_NAME, oldCompositeLibraryName, newCompositeLibraryName);
-            if (msgs == null) msgs = notification; else msgs.add(notification);
-        }
-        return msgs;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setCompositeLibraryName(FullyQualifiedClass newCompositeLibraryName)
-    {
-        if (newCompositeLibraryName != compositeLibraryName)
-        {
-            NotificationChain msgs = null;
-            if (compositeLibraryName != null)
-                msgs = ((InternalEObject)compositeLibraryName).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FaceletTaglibPackage.FACELET_TAGLIB__COMPOSITE_LIBRARY_NAME, null, msgs);
-            if (newCompositeLibraryName != null)
-                msgs = ((InternalEObject)newCompositeLibraryName).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FaceletTaglibPackage.FACELET_TAGLIB__COMPOSITE_LIBRARY_NAME, null, msgs);
-            msgs = basicSetCompositeLibraryName(newCompositeLibraryName, msgs);
-            if (msgs != null) msgs.dispatch();
-        }
-        else if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FaceletTaglibPackage.FACELET_TAGLIB__COMPOSITE_LIBRARY_NAME, newCompositeLibraryName, newCompositeLibraryName));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public FeatureMap getGroup()
-    {
-        if (group == null)
-        {
-            group = new BasicFeatureMap(this, FaceletTaglibPackage.FACELET_TAGLIB__GROUP);
-        }
-        return group;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EList<FaceletTaglibTag> getTag()
-    {
-        return getGroup().list(FaceletTaglibPackage.Literals.FACELET_TAGLIB__TAG);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EList<FaceletTaglibFunction> getFunction()
-    {
-        return getGroup().list(FaceletTaglibPackage.Literals.FACELET_TAGLIB__FUNCTION);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EList<FaceletTaglibExtension> getTaglibExtension()
-    {
-        if (taglibExtension == null)
-        {
-            taglibExtension = new EObjectContainmentEList<FaceletTaglibExtension>(FaceletTaglibExtension.class, this, FaceletTaglibPackage.FACELET_TAGLIB__TAGLIB_EXTENSION);
-        }
-        return taglibExtension;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String getId()
-    {
-        return id;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setId(String newId)
-    {
-        String oldId = id;
-        id = newId;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FaceletTaglibPackage.FACELET_TAGLIB__ID, oldId, id));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public FaceletTaglibVersion getVersion()
-    {
-        return version;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setVersion(FaceletTaglibVersion newVersion)
-    {
-        FaceletTaglibVersion oldVersion = version;
-        version = newVersion == null ? VERSION_EDEFAULT : newVersion;
-        boolean oldVersionESet = versionESet;
-        versionESet = true;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FaceletTaglibPackage.FACELET_TAGLIB__VERSION, oldVersion, version, !oldVersionESet));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void unsetVersion()
-    {
-        FaceletTaglibVersion oldVersion = version;
-        boolean oldVersionESet = versionESet;
-        version = VERSION_EDEFAULT;
-        versionESet = false;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.UNSET, FaceletTaglibPackage.FACELET_TAGLIB__VERSION, oldVersion, VERSION_EDEFAULT, oldVersionESet));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean isSetVersion()
-    {
-        return versionESet;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated NOT
-     */
-    public String getNamespaceUri()
-    {
-        return (String) Util.getSimplifiedNestedField(this, FaceletTaglibPackage.Literals.FACELET_TAGLIB__NAMESPACE, FaceletTaglibPackage.Literals.IDENTIFIABLE_STRING_VALUE__VALUE);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * Sets the namespace value on the this taglib.  If the wrapping IdentifiableStringValue
-     * does not exist, then it is created. 
-     * 
-     * NOTE: event listeners will receive an event for the value set on the
-     * the IdentifiableStringValue if it was non-null but will receive an
-     * event for set on the whole getNamespace() featuer if it was null.
-     * <!-- end-user-doc -->
-     * @generated NOT
-     */
-    public void setNamespaceUri(String newNamespaceUri)
-    {
-        Util.setSimplifiedNestedField(this,  FaceletTaglibPackage.Literals.FACELET_TAGLIB__NAMESPACE, FaceletTaglibPackage.Literals.IDENTIFIABLE_STRING_VALUE__VALUE, newNamespaceUri);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglibPackage.FACELET_TAGLIB__LIBRARY_CLASS:
-                return basicSetLibraryClass(null, msgs);
-            case FaceletTaglibPackage.FACELET_TAGLIB__NAMESPACE:
-                return basicSetNamespace(null, msgs);
-            case FaceletTaglibPackage.FACELET_TAGLIB__COMPOSITE_LIBRARY_NAME:
-                return basicSetCompositeLibraryName(null, msgs);
-            case FaceletTaglibPackage.FACELET_TAGLIB__GROUP:
-                return ((InternalEList<?>)getGroup()).basicRemove(otherEnd, msgs);
-            case FaceletTaglibPackage.FACELET_TAGLIB__TAG:
-                return ((InternalEList<?>)getTag()).basicRemove(otherEnd, msgs);
-            case FaceletTaglibPackage.FACELET_TAGLIB__FUNCTION:
-                return ((InternalEList<?>)getFunction()).basicRemove(otherEnd, msgs);
-            case FaceletTaglibPackage.FACELET_TAGLIB__TAGLIB_EXTENSION:
-                return ((InternalEList<?>)getTaglibExtension()).basicRemove(otherEnd, msgs);
-        }
-        return super.eInverseRemove(otherEnd, featureID, msgs);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public Object eGet(int featureID, boolean resolve, boolean coreType)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglibPackage.FACELET_TAGLIB__LIBRARY_CLASS:
-                return getLibraryClass();
-            case FaceletTaglibPackage.FACELET_TAGLIB__NAMESPACE:
-                return getNamespace();
-            case FaceletTaglibPackage.FACELET_TAGLIB__COMPOSITE_LIBRARY_NAME:
-                return getCompositeLibraryName();
-            case FaceletTaglibPackage.FACELET_TAGLIB__GROUP:
-                if (coreType) return getGroup();
-                return ((FeatureMap.Internal)getGroup()).getWrapper();
-            case FaceletTaglibPackage.FACELET_TAGLIB__TAG:
-                return getTag();
-            case FaceletTaglibPackage.FACELET_TAGLIB__FUNCTION:
-                return getFunction();
-            case FaceletTaglibPackage.FACELET_TAGLIB__TAGLIB_EXTENSION:
-                return getTaglibExtension();
-            case FaceletTaglibPackage.FACELET_TAGLIB__ID:
-                return getId();
-            case FaceletTaglibPackage.FACELET_TAGLIB__VERSION:
-                return getVersion();
-            case FaceletTaglibPackage.FACELET_TAGLIB__NAMESPACE_URI:
-                return getNamespaceUri();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @SuppressWarnings("unchecked")
-    @Override
-    public void eSet(int featureID, Object newValue)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglibPackage.FACELET_TAGLIB__LIBRARY_CLASS:
-                setLibraryClass((FullyQualifiedClass)newValue);
-                return;
-            case FaceletTaglibPackage.FACELET_TAGLIB__NAMESPACE:
-                setNamespace((IdentifiableStringValue)newValue);
-                return;
-            case FaceletTaglibPackage.FACELET_TAGLIB__COMPOSITE_LIBRARY_NAME:
-                setCompositeLibraryName((FullyQualifiedClass)newValue);
-                return;
-            case FaceletTaglibPackage.FACELET_TAGLIB__GROUP:
-                ((FeatureMap.Internal)getGroup()).set(newValue);
-                return;
-            case FaceletTaglibPackage.FACELET_TAGLIB__TAG:
-                getTag().clear();
-                getTag().addAll((Collection<? extends FaceletTaglibTag>)newValue);
-                return;
-            case FaceletTaglibPackage.FACELET_TAGLIB__FUNCTION:
-                getFunction().clear();
-                getFunction().addAll((Collection<? extends FaceletTaglibFunction>)newValue);
-                return;
-            case FaceletTaglibPackage.FACELET_TAGLIB__TAGLIB_EXTENSION:
-                getTaglibExtension().clear();
-                getTaglibExtension().addAll((Collection<? extends FaceletTaglibExtension>)newValue);
-                return;
-            case FaceletTaglibPackage.FACELET_TAGLIB__ID:
-                setId((String)newValue);
-                return;
-            case FaceletTaglibPackage.FACELET_TAGLIB__VERSION:
-                setVersion((FaceletTaglibVersion)newValue);
-                return;
-            case FaceletTaglibPackage.FACELET_TAGLIB__NAMESPACE_URI:
-                setNamespaceUri((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public void eUnset(int featureID)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglibPackage.FACELET_TAGLIB__LIBRARY_CLASS:
-                setLibraryClass((FullyQualifiedClass)null);
-                return;
-            case FaceletTaglibPackage.FACELET_TAGLIB__NAMESPACE:
-                setNamespace((IdentifiableStringValue)null);
-                return;
-            case FaceletTaglibPackage.FACELET_TAGLIB__COMPOSITE_LIBRARY_NAME:
-                setCompositeLibraryName((FullyQualifiedClass)null);
-                return;
-            case FaceletTaglibPackage.FACELET_TAGLIB__GROUP:
-                getGroup().clear();
-                return;
-            case FaceletTaglibPackage.FACELET_TAGLIB__TAG:
-                getTag().clear();
-                return;
-            case FaceletTaglibPackage.FACELET_TAGLIB__FUNCTION:
-                getFunction().clear();
-                return;
-            case FaceletTaglibPackage.FACELET_TAGLIB__TAGLIB_EXTENSION:
-                getTaglibExtension().clear();
-                return;
-            case FaceletTaglibPackage.FACELET_TAGLIB__ID:
-                setId(ID_EDEFAULT);
-                return;
-            case FaceletTaglibPackage.FACELET_TAGLIB__VERSION:
-                unsetVersion();
-                return;
-            case FaceletTaglibPackage.FACELET_TAGLIB__NAMESPACE_URI:
-                setNamespaceUri(NAMESPACE_URI_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public boolean eIsSet(int featureID)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglibPackage.FACELET_TAGLIB__LIBRARY_CLASS:
-                return libraryClass != null;
-            case FaceletTaglibPackage.FACELET_TAGLIB__NAMESPACE:
-                return namespace != null;
-            case FaceletTaglibPackage.FACELET_TAGLIB__COMPOSITE_LIBRARY_NAME:
-                return compositeLibraryName != null;
-            case FaceletTaglibPackage.FACELET_TAGLIB__GROUP:
-                return group != null && !group.isEmpty();
-            case FaceletTaglibPackage.FACELET_TAGLIB__TAG:
-                return !getTag().isEmpty();
-            case FaceletTaglibPackage.FACELET_TAGLIB__FUNCTION:
-                return !getFunction().isEmpty();
-            case FaceletTaglibPackage.FACELET_TAGLIB__TAGLIB_EXTENSION:
-                return taglibExtension != null && !taglibExtension.isEmpty();
-            case FaceletTaglibPackage.FACELET_TAGLIB__ID:
-                return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-            case FaceletTaglibPackage.FACELET_TAGLIB__VERSION:
-                return isSetVersion();
-            case FaceletTaglibPackage.FACELET_TAGLIB__NAMESPACE_URI:
-                return NAMESPACE_URI_EDEFAULT == null ? getNamespaceUri() != null : !NAMESPACE_URI_EDEFAULT.equals(getNamespaceUri());
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public String toString()
-    {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (group: "); //$NON-NLS-1$
-        result.append(group);
-        result.append(", id: "); //$NON-NLS-1$
-        result.append(id);
-        result.append(", version: "); //$NON-NLS-1$
-        if (versionESet) result.append(version); else result.append("<unset>"); //$NON-NLS-1$
-        result.append(')');
-        return result.toString();
-    }
-
-} //FaceletTaglibImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/impl/FaceletTaglibPackageImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/impl/FaceletTaglibPackageImpl.java
deleted file mode 100644
index 1395630..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/impl/FaceletTaglibPackageImpl.java
+++ /dev/null
@@ -1,2653 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: FaceletTaglibPackageImpl.java,v 1.2 2010/03/18 06:24:39 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl;
-
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EDataType;
-import org.eclipse.emf.ecore.EEnum;
-import org.eclipse.emf.ecore.EOperation;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.EReference;
-import org.eclipse.emf.ecore.EValidator;
-import org.eclipse.emf.ecore.impl.EPackageImpl;
-import org.eclipse.emf.ecore.xml.type.XMLTypePackage;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.Description;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.DisplayName;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.DocumentRoot;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglib;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibCanonicalName;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibExtension;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibFactory;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibFunction;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTag;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagAttribute;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagBehavior;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagBehaviorExtension;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagComponent;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagComponentExtension;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagConverter;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagConverterExtension;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagExtension;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagValidator;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagValidatorExtension;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibVersion;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FullyQualifiedClass;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.GenericBoolean;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.GenericBooleanBase;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.Icon;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.IdentifiableLangStringValue;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.IdentifiableStringValue;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.JavaIdentifier;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.Path;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.UserVisibleTaglibObject;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.util.FaceletTaglibValidator;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model <b>Package</b>.
- * <!-- end-user-doc -->
- * @generated
- */
-public class FaceletTaglibPackageImpl extends EPackageImpl implements FaceletTaglibPackage
-{
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass descriptionEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass displayNameEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass documentRootEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass faceletTaglibCanonicalNameEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass faceletTaglibExtensionEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass faceletTaglibFunctionEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass faceletTaglibTagAttributeEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass faceletTaglibTagBehaviorExtensionEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass faceletTaglibTagBehaviorEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass faceletTaglibTagComponentExtensionEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass faceletTaglibTagComponentEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass faceletTaglibTagConverterExtensionEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass faceletTaglibTagConverterEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass faceletTaglibTagExtensionEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass faceletTaglibTagEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass faceletTaglibTagValidatorExtensionEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass faceletTaglibTagValidatorEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass faceletTaglibEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass fullyQualifiedClassEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass genericBooleanEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass iconEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass javaIdentifierEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass pathEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass identifiableStringValueEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass identifiableLangStringValueEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass userVisibleTaglibObjectEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EEnum faceletTaglibVersionEEnum = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EEnum genericBooleanBaseEEnum = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EDataType faceletTaglibVersionTypeObjectEDataType = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EDataType fullyQualifiedClassBaseEDataType = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EDataType javaIdentifierBaseEDataType = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EDataType pathTypeBaseEDataType = null;
-
-    /**
-     * Creates an instance of the model <b>Package</b>, registered with
-     * {@link org.eclipse.emf.ecore.EPackage.Registry EPackage.Registry} by the package
-     * package URI value.
-     * <p>Note: the correct way to create the package is via the static
-     * factory method {@link #init init()}, which also performs
-     * initialization of the package, or returns the registered package,
-     * if one already exists.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.emf.ecore.EPackage.Registry
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage#eNS_URI
-     * @see #init()
-     * @generated
-     */
-    private FaceletTaglibPackageImpl()
-    {
-        super(eNS_URI, FaceletTaglibFactory.eINSTANCE);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private static boolean isInited = false;
-
-    /**
-     * Creates, registers, and initializes the <b>Package</b> for this model, and for any others upon which it depends.
-     * 
-     * <p>This method is used to initialize {@link FaceletTaglibPackage#eINSTANCE} when that field is accessed.
-     * Clients should not invoke it directly. Instead, they should simply access that field to obtain the package.
-     * <!-- begin-user-doc -->
-     * @return 
-     * <!-- end-user-doc -->
-     * @see #eNS_URI
-     * @see #createPackageContents()
-     * @see #initializePackageContents()
-     * @generated
-     */
-    public static FaceletTaglibPackage init()
-    {
-        if (isInited) return (FaceletTaglibPackage)EPackage.Registry.INSTANCE.getEPackage(FaceletTaglibPackage.eNS_URI);
-
-        // Obtain or create and register package
-        FaceletTaglibPackageImpl theFaceletTaglibPackage = (FaceletTaglibPackageImpl)(EPackage.Registry.INSTANCE.get(eNS_URI) instanceof FaceletTaglibPackageImpl ? EPackage.Registry.INSTANCE.get(eNS_URI) : new FaceletTaglibPackageImpl());
-
-        isInited = true;
-
-        // Initialize simple dependencies
-        XMLTypePackage.eINSTANCE.eClass();
-
-        // Create package meta-data objects
-        theFaceletTaglibPackage.createPackageContents();
-
-        // Initialize created meta-data
-        theFaceletTaglibPackage.initializePackageContents();
-
-        // Register package validator
-        EValidator.Registry.INSTANCE.put
-            (theFaceletTaglibPackage, 
-             new EValidator.Descriptor()
-             {
-                 public EValidator getEValidator()
-                 {
-                     return FaceletTaglibValidator.INSTANCE;
-                 }
-             });
-
-        // Mark meta-data to indicate it can't be changed
-        theFaceletTaglibPackage.freeze();
-
-  
-        // Update the registry and return the package
-        EPackage.Registry.INSTANCE.put(FaceletTaglibPackage.eNS_URI, theFaceletTaglibPackage);
-        return theFaceletTaglibPackage;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getDescription()
-    {
-        return descriptionEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getDisplayName()
-    {
-        return displayNameEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getDocumentRoot()
-    {
-        return documentRootEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getDocumentRoot_Mixed()
-    {
-        return (EAttribute)documentRootEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EReference getDocumentRoot_XMLNSPrefixMap()
-    {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EReference getDocumentRoot_XSISchemaLocation()
-    {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(2);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EReference getDocumentRoot_FaceletTaglib()
-    {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(3);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getFaceletTaglibCanonicalName()
-    {
-        return faceletTaglibCanonicalNameEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getFaceletTaglibCanonicalName_Value()
-    {
-        return (EAttribute)faceletTaglibCanonicalNameEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getFaceletTaglibCanonicalName_Id()
-    {
-        return (EAttribute)faceletTaglibCanonicalNameEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getFaceletTaglibExtension()
-    {
-        return faceletTaglibExtensionEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getFaceletTaglibExtension_Any()
-    {
-        return (EAttribute)faceletTaglibExtensionEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getFaceletTaglibExtension_Id()
-    {
-        return (EAttribute)faceletTaglibExtensionEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getFaceletTaglibFunction()
-    {
-        return faceletTaglibFunctionEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EReference getFaceletTaglibFunction_FunctionName()
-    {
-        return (EReference)faceletTaglibFunctionEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EReference getFaceletTaglibFunction_FunctionClass()
-    {
-        return (EReference)faceletTaglibFunctionEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EReference getFaceletTaglibFunction_FunctionSignature()
-    {
-        return (EReference)faceletTaglibFunctionEClass.getEStructuralFeatures().get(2);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getFaceletTaglibTagAttribute()
-    {
-        return faceletTaglibTagAttributeEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EReference getFaceletTaglibTagAttribute_NameElement()
-    {
-        return (EReference)faceletTaglibTagAttributeEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EReference getFaceletTaglibTagAttribute_RequiredElement()
-    {
-        return (EReference)faceletTaglibTagAttributeEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EReference getFaceletTaglibTagAttribute_TypeElement()
-    {
-        return (EReference)faceletTaglibTagAttributeEClass.getEStructuralFeatures().get(2);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EReference getFaceletTaglibTagAttribute_MethodSignatureElement()
-    {
-        return (EReference)faceletTaglibTagAttributeEClass.getEStructuralFeatures().get(3);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getFaceletTaglibTagAttribute_Id()
-    {
-        return (EAttribute)faceletTaglibTagAttributeEClass.getEStructuralFeatures().get(4);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getFaceletTaglibTagAttribute_Name()
-    {
-        return (EAttribute)faceletTaglibTagAttributeEClass.getEStructuralFeatures().get(5);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getFaceletTaglibTagAttribute_Required()
-    {
-        return (EAttribute)faceletTaglibTagAttributeEClass.getEStructuralFeatures().get(6);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getFaceletTaglibTagAttribute_Type()
-    {
-        return (EAttribute)faceletTaglibTagAttributeEClass.getEStructuralFeatures().get(7);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getFaceletTaglibTagAttribute_MethodSignature()
-    {
-        return (EAttribute)faceletTaglibTagAttributeEClass.getEStructuralFeatures().get(8);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getFaceletTaglibTagBehaviorExtension()
-    {
-        return faceletTaglibTagBehaviorExtensionEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getFaceletTaglibTagBehaviorExtension_Any()
-    {
-        return (EAttribute)faceletTaglibTagBehaviorExtensionEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getFaceletTaglibTagBehaviorExtension_Id()
-    {
-        return (EAttribute)faceletTaglibTagBehaviorExtensionEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getFaceletTaglibTagBehavior()
-    {
-        return faceletTaglibTagBehaviorEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EReference getFaceletTaglibTagBehavior_BehaviorId()
-    {
-        return (EReference)faceletTaglibTagBehaviorEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EReference getFaceletTaglibTagBehavior_HandlerClass()
-    {
-        return (EReference)faceletTaglibTagBehaviorEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EReference getFaceletTaglibTagBehavior_BehaviorExtension()
-    {
-        return (EReference)faceletTaglibTagBehaviorEClass.getEStructuralFeatures().get(2);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getFaceletTaglibTagComponentExtension()
-    {
-        return faceletTaglibTagComponentExtensionEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getFaceletTaglibTagComponentExtension_Any()
-    {
-        return (EAttribute)faceletTaglibTagComponentExtensionEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getFaceletTaglibTagComponentExtension_Id()
-    {
-        return (EAttribute)faceletTaglibTagComponentExtensionEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getFaceletTaglibTagComponent()
-    {
-        return faceletTaglibTagComponentEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EReference getFaceletTaglibTagComponent_ComponentType()
-    {
-        return (EReference)faceletTaglibTagComponentEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EReference getFaceletTaglibTagComponent_RendererType()
-    {
-        return (EReference)faceletTaglibTagComponentEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EReference getFaceletTaglibTagComponent_HandlerClass()
-    {
-        return (EReference)faceletTaglibTagComponentEClass.getEStructuralFeatures().get(2);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EReference getFaceletTaglibTagComponent_ComponentExtension()
-    {
-        return (EReference)faceletTaglibTagComponentEClass.getEStructuralFeatures().get(3);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getFaceletTaglibTagConverterExtension()
-    {
-        return faceletTaglibTagConverterExtensionEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getFaceletTaglibTagConverterExtension_Any()
-    {
-        return (EAttribute)faceletTaglibTagConverterExtensionEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getFaceletTaglibTagConverterExtension_Id()
-    {
-        return (EAttribute)faceletTaglibTagConverterExtensionEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getFaceletTaglibTagConverter()
-    {
-        return faceletTaglibTagConverterEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EReference getFaceletTaglibTagConverter_ConverterId()
-    {
-        return (EReference)faceletTaglibTagConverterEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EReference getFaceletTaglibTagConverter_HandlerClass()
-    {
-        return (EReference)faceletTaglibTagConverterEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EReference getFaceletTaglibTagConverter_ConverterExtension()
-    {
-        return (EReference)faceletTaglibTagConverterEClass.getEStructuralFeatures().get(2);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getFaceletTaglibTagExtension()
-    {
-        return faceletTaglibTagExtensionEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getFaceletTaglibTagExtension_Any()
-    {
-        return (EAttribute)faceletTaglibTagExtensionEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getFaceletTaglibTagExtension_Id()
-    {
-        return (EAttribute)faceletTaglibTagExtensionEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getFaceletTaglibTag()
-    {
-        return faceletTaglibTagEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EReference getFaceletTaglibTag_TagNameElement()
-    {
-        return (EReference)faceletTaglibTagEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EReference getFaceletTaglibTag_HandlerClassElement()
-    {
-        return (EReference)faceletTaglibTagEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EReference getFaceletTaglibTag_Behavior()
-    {
-        return (EReference)faceletTaglibTagEClass.getEStructuralFeatures().get(2);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EReference getFaceletTaglibTag_Component()
-    {
-        return (EReference)faceletTaglibTagEClass.getEStructuralFeatures().get(3);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EReference getFaceletTaglibTag_Converter()
-    {
-        return (EReference)faceletTaglibTagEClass.getEStructuralFeatures().get(4);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EReference getFaceletTaglibTag_Validator()
-    {
-        return (EReference)faceletTaglibTagEClass.getEStructuralFeatures().get(5);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EReference getFaceletTaglibTag_Source()
-    {
-        return (EReference)faceletTaglibTagEClass.getEStructuralFeatures().get(6);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EReference getFaceletTaglibTag_Attribute()
-    {
-        return (EReference)faceletTaglibTagEClass.getEStructuralFeatures().get(7);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EReference getFaceletTaglibTag_TagExtension()
-    {
-        return (EReference)faceletTaglibTagEClass.getEStructuralFeatures().get(8);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getFaceletTaglibTag_TagName()
-    {
-        return (EAttribute)faceletTaglibTagEClass.getEStructuralFeatures().get(9);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getFaceletTaglibTag_HandlerClass()
-    {
-        return (EAttribute)faceletTaglibTagEClass.getEStructuralFeatures().get(10);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getFaceletTaglibTagValidatorExtension()
-    {
-        return faceletTaglibTagValidatorExtensionEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getFaceletTaglibTagValidatorExtension_Any()
-    {
-        return (EAttribute)faceletTaglibTagValidatorExtensionEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getFaceletTaglibTagValidatorExtension_Id()
-    {
-        return (EAttribute)faceletTaglibTagValidatorExtensionEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getFaceletTaglibTagValidator()
-    {
-        return faceletTaglibTagValidatorEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EReference getFaceletTaglibTagValidator_ValidatorId()
-    {
-        return (EReference)faceletTaglibTagValidatorEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EReference getFaceletTaglibTagValidator_HandlerClass()
-    {
-        return (EReference)faceletTaglibTagValidatorEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EReference getFaceletTaglibTagValidator_ValidatorExtension()
-    {
-        return (EReference)faceletTaglibTagValidatorEClass.getEStructuralFeatures().get(2);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getFaceletTaglib()
-    {
-        return faceletTaglibEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EReference getFaceletTaglib_LibraryClass()
-    {
-        return (EReference)faceletTaglibEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EReference getFaceletTaglib_Namespace()
-    {
-        return (EReference)faceletTaglibEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EReference getFaceletTaglib_CompositeLibraryName()
-    {
-        return (EReference)faceletTaglibEClass.getEStructuralFeatures().get(2);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getFaceletTaglib_Group()
-    {
-        return (EAttribute)faceletTaglibEClass.getEStructuralFeatures().get(3);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EReference getFaceletTaglib_Tag()
-    {
-        return (EReference)faceletTaglibEClass.getEStructuralFeatures().get(4);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EReference getFaceletTaglib_Function()
-    {
-        return (EReference)faceletTaglibEClass.getEStructuralFeatures().get(5);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EReference getFaceletTaglib_TaglibExtension()
-    {
-        return (EReference)faceletTaglibEClass.getEStructuralFeatures().get(6);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getFaceletTaglib_Id()
-    {
-        return (EAttribute)faceletTaglibEClass.getEStructuralFeatures().get(7);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getFaceletTaglib_Version()
-    {
-        return (EAttribute)faceletTaglibEClass.getEStructuralFeatures().get(8);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getFaceletTaglib_NamespaceUri()
-    {
-        return (EAttribute)faceletTaglibEClass.getEStructuralFeatures().get(9);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getFullyQualifiedClass()
-    {
-        return fullyQualifiedClassEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getGenericBoolean()
-    {
-        return genericBooleanEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getIcon()
-    {
-        return iconEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EReference getIcon_SmallIcon()
-    {
-        return (EReference)iconEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EReference getIcon_LargeIcon()
-    {
-        return (EReference)iconEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getIcon_Id()
-    {
-        return (EAttribute)iconEClass.getEStructuralFeatures().get(2);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getIcon_Lang()
-    {
-        return (EAttribute)iconEClass.getEStructuralFeatures().get(3);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getJavaIdentifier()
-    {
-        return javaIdentifierEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getPath()
-    {
-        return pathEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getIdentifiableStringValue()
-    {
-        return identifiableStringValueEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getIdentifiableStringValue_Value()
-    {
-        return (EAttribute)identifiableStringValueEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getIdentifiableStringValue_Id()
-    {
-        return (EAttribute)identifiableStringValueEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getIdentifiableLangStringValue()
-    {
-        return identifiableLangStringValueEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getIdentifiableLangStringValue_Lang()
-    {
-        return (EAttribute)identifiableLangStringValueEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getUserVisibleTaglibObject()
-    {
-        return userVisibleTaglibObjectEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EReference getUserVisibleTaglibObject_Description()
-    {
-        return (EReference)userVisibleTaglibObjectEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EReference getUserVisibleTaglibObject_DisplayName()
-    {
-        return (EReference)userVisibleTaglibObjectEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EReference getUserVisibleTaglibObject_Icon()
-    {
-        return (EReference)userVisibleTaglibObjectEClass.getEStructuralFeatures().get(2);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EEnum getFaceletTaglibVersion()
-    {
-        return faceletTaglibVersionEEnum;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EEnum getGenericBooleanBase()
-    {
-        return genericBooleanBaseEEnum;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EDataType getFaceletTaglibVersionTypeObject()
-    {
-        return faceletTaglibVersionTypeObjectEDataType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EDataType getFullyQualifiedClassBase()
-    {
-        return fullyQualifiedClassBaseEDataType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EDataType getJavaIdentifierBase()
-    {
-        return javaIdentifierBaseEDataType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EDataType getPathTypeBase()
-    {
-        return pathTypeBaseEDataType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public FaceletTaglibFactory getFaceletTaglibFactory()
-    {
-        return (FaceletTaglibFactory)getEFactoryInstance();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private boolean isCreated = false;
-
-    /**
-     * Creates the meta-model objects for the package.  This method is
-     * guarded to have no affect on any invocation but its first.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void createPackageContents()
-    {
-        if (isCreated) return;
-        isCreated = true;
-
-        // Create classes and their features
-        descriptionEClass = createEClass(DESCRIPTION);
-
-        displayNameEClass = createEClass(DISPLAY_NAME);
-
-        documentRootEClass = createEClass(DOCUMENT_ROOT);
-        createEAttribute(documentRootEClass, DOCUMENT_ROOT__MIXED);
-        createEReference(documentRootEClass, DOCUMENT_ROOT__XMLNS_PREFIX_MAP);
-        createEReference(documentRootEClass, DOCUMENT_ROOT__XSI_SCHEMA_LOCATION);
-        createEReference(documentRootEClass, DOCUMENT_ROOT__FACELET_TAGLIB);
-
-        faceletTaglibCanonicalNameEClass = createEClass(FACELET_TAGLIB_CANONICAL_NAME);
-        createEAttribute(faceletTaglibCanonicalNameEClass, FACELET_TAGLIB_CANONICAL_NAME__VALUE);
-        createEAttribute(faceletTaglibCanonicalNameEClass, FACELET_TAGLIB_CANONICAL_NAME__ID);
-
-        faceletTaglibExtensionEClass = createEClass(FACELET_TAGLIB_EXTENSION);
-        createEAttribute(faceletTaglibExtensionEClass, FACELET_TAGLIB_EXTENSION__ANY);
-        createEAttribute(faceletTaglibExtensionEClass, FACELET_TAGLIB_EXTENSION__ID);
-
-        faceletTaglibFunctionEClass = createEClass(FACELET_TAGLIB_FUNCTION);
-        createEReference(faceletTaglibFunctionEClass, FACELET_TAGLIB_FUNCTION__FUNCTION_NAME);
-        createEReference(faceletTaglibFunctionEClass, FACELET_TAGLIB_FUNCTION__FUNCTION_CLASS);
-        createEReference(faceletTaglibFunctionEClass, FACELET_TAGLIB_FUNCTION__FUNCTION_SIGNATURE);
-
-        faceletTaglibTagAttributeEClass = createEClass(FACELET_TAGLIB_TAG_ATTRIBUTE);
-        createEReference(faceletTaglibTagAttributeEClass, FACELET_TAGLIB_TAG_ATTRIBUTE__NAME_ELEMENT);
-        createEReference(faceletTaglibTagAttributeEClass, FACELET_TAGLIB_TAG_ATTRIBUTE__REQUIRED_ELEMENT);
-        createEReference(faceletTaglibTagAttributeEClass, FACELET_TAGLIB_TAG_ATTRIBUTE__TYPE_ELEMENT);
-        createEReference(faceletTaglibTagAttributeEClass, FACELET_TAGLIB_TAG_ATTRIBUTE__METHOD_SIGNATURE_ELEMENT);
-        createEAttribute(faceletTaglibTagAttributeEClass, FACELET_TAGLIB_TAG_ATTRIBUTE__ID);
-        createEAttribute(faceletTaglibTagAttributeEClass, FACELET_TAGLIB_TAG_ATTRIBUTE__NAME);
-        createEAttribute(faceletTaglibTagAttributeEClass, FACELET_TAGLIB_TAG_ATTRIBUTE__REQUIRED);
-        createEAttribute(faceletTaglibTagAttributeEClass, FACELET_TAGLIB_TAG_ATTRIBUTE__TYPE);
-        createEAttribute(faceletTaglibTagAttributeEClass, FACELET_TAGLIB_TAG_ATTRIBUTE__METHOD_SIGNATURE);
-
-        faceletTaglibTagBehaviorExtensionEClass = createEClass(FACELET_TAGLIB_TAG_BEHAVIOR_EXTENSION);
-        createEAttribute(faceletTaglibTagBehaviorExtensionEClass, FACELET_TAGLIB_TAG_BEHAVIOR_EXTENSION__ANY);
-        createEAttribute(faceletTaglibTagBehaviorExtensionEClass, FACELET_TAGLIB_TAG_BEHAVIOR_EXTENSION__ID);
-
-        faceletTaglibTagBehaviorEClass = createEClass(FACELET_TAGLIB_TAG_BEHAVIOR);
-        createEReference(faceletTaglibTagBehaviorEClass, FACELET_TAGLIB_TAG_BEHAVIOR__BEHAVIOR_ID);
-        createEReference(faceletTaglibTagBehaviorEClass, FACELET_TAGLIB_TAG_BEHAVIOR__HANDLER_CLASS);
-        createEReference(faceletTaglibTagBehaviorEClass, FACELET_TAGLIB_TAG_BEHAVIOR__BEHAVIOR_EXTENSION);
-
-        faceletTaglibTagComponentExtensionEClass = createEClass(FACELET_TAGLIB_TAG_COMPONENT_EXTENSION);
-        createEAttribute(faceletTaglibTagComponentExtensionEClass, FACELET_TAGLIB_TAG_COMPONENT_EXTENSION__ANY);
-        createEAttribute(faceletTaglibTagComponentExtensionEClass, FACELET_TAGLIB_TAG_COMPONENT_EXTENSION__ID);
-
-        faceletTaglibTagComponentEClass = createEClass(FACELET_TAGLIB_TAG_COMPONENT);
-        createEReference(faceletTaglibTagComponentEClass, FACELET_TAGLIB_TAG_COMPONENT__COMPONENT_TYPE);
-        createEReference(faceletTaglibTagComponentEClass, FACELET_TAGLIB_TAG_COMPONENT__RENDERER_TYPE);
-        createEReference(faceletTaglibTagComponentEClass, FACELET_TAGLIB_TAG_COMPONENT__HANDLER_CLASS);
-        createEReference(faceletTaglibTagComponentEClass, FACELET_TAGLIB_TAG_COMPONENT__COMPONENT_EXTENSION);
-
-        faceletTaglibTagConverterExtensionEClass = createEClass(FACELET_TAGLIB_TAG_CONVERTER_EXTENSION);
-        createEAttribute(faceletTaglibTagConverterExtensionEClass, FACELET_TAGLIB_TAG_CONVERTER_EXTENSION__ANY);
-        createEAttribute(faceletTaglibTagConverterExtensionEClass, FACELET_TAGLIB_TAG_CONVERTER_EXTENSION__ID);
-
-        faceletTaglibTagConverterEClass = createEClass(FACELET_TAGLIB_TAG_CONVERTER);
-        createEReference(faceletTaglibTagConverterEClass, FACELET_TAGLIB_TAG_CONVERTER__CONVERTER_ID);
-        createEReference(faceletTaglibTagConverterEClass, FACELET_TAGLIB_TAG_CONVERTER__HANDLER_CLASS);
-        createEReference(faceletTaglibTagConverterEClass, FACELET_TAGLIB_TAG_CONVERTER__CONVERTER_EXTENSION);
-
-        faceletTaglibTagExtensionEClass = createEClass(FACELET_TAGLIB_TAG_EXTENSION);
-        createEAttribute(faceletTaglibTagExtensionEClass, FACELET_TAGLIB_TAG_EXTENSION__ANY);
-        createEAttribute(faceletTaglibTagExtensionEClass, FACELET_TAGLIB_TAG_EXTENSION__ID);
-
-        faceletTaglibTagEClass = createEClass(FACELET_TAGLIB_TAG);
-        createEReference(faceletTaglibTagEClass, FACELET_TAGLIB_TAG__TAG_NAME_ELEMENT);
-        createEReference(faceletTaglibTagEClass, FACELET_TAGLIB_TAG__HANDLER_CLASS_ELEMENT);
-        createEReference(faceletTaglibTagEClass, FACELET_TAGLIB_TAG__BEHAVIOR);
-        createEReference(faceletTaglibTagEClass, FACELET_TAGLIB_TAG__COMPONENT);
-        createEReference(faceletTaglibTagEClass, FACELET_TAGLIB_TAG__CONVERTER);
-        createEReference(faceletTaglibTagEClass, FACELET_TAGLIB_TAG__VALIDATOR);
-        createEReference(faceletTaglibTagEClass, FACELET_TAGLIB_TAG__SOURCE);
-        createEReference(faceletTaglibTagEClass, FACELET_TAGLIB_TAG__ATTRIBUTE);
-        createEReference(faceletTaglibTagEClass, FACELET_TAGLIB_TAG__TAG_EXTENSION);
-        createEAttribute(faceletTaglibTagEClass, FACELET_TAGLIB_TAG__TAG_NAME);
-        createEAttribute(faceletTaglibTagEClass, FACELET_TAGLIB_TAG__HANDLER_CLASS);
-
-        faceletTaglibTagValidatorExtensionEClass = createEClass(FACELET_TAGLIB_TAG_VALIDATOR_EXTENSION);
-        createEAttribute(faceletTaglibTagValidatorExtensionEClass, FACELET_TAGLIB_TAG_VALIDATOR_EXTENSION__ANY);
-        createEAttribute(faceletTaglibTagValidatorExtensionEClass, FACELET_TAGLIB_TAG_VALIDATOR_EXTENSION__ID);
-
-        faceletTaglibTagValidatorEClass = createEClass(FACELET_TAGLIB_TAG_VALIDATOR);
-        createEReference(faceletTaglibTagValidatorEClass, FACELET_TAGLIB_TAG_VALIDATOR__VALIDATOR_ID);
-        createEReference(faceletTaglibTagValidatorEClass, FACELET_TAGLIB_TAG_VALIDATOR__HANDLER_CLASS);
-        createEReference(faceletTaglibTagValidatorEClass, FACELET_TAGLIB_TAG_VALIDATOR__VALIDATOR_EXTENSION);
-
-        faceletTaglibEClass = createEClass(FACELET_TAGLIB);
-        createEReference(faceletTaglibEClass, FACELET_TAGLIB__LIBRARY_CLASS);
-        createEReference(faceletTaglibEClass, FACELET_TAGLIB__NAMESPACE);
-        createEReference(faceletTaglibEClass, FACELET_TAGLIB__COMPOSITE_LIBRARY_NAME);
-        createEAttribute(faceletTaglibEClass, FACELET_TAGLIB__GROUP);
-        createEReference(faceletTaglibEClass, FACELET_TAGLIB__TAG);
-        createEReference(faceletTaglibEClass, FACELET_TAGLIB__FUNCTION);
-        createEReference(faceletTaglibEClass, FACELET_TAGLIB__TAGLIB_EXTENSION);
-        createEAttribute(faceletTaglibEClass, FACELET_TAGLIB__ID);
-        createEAttribute(faceletTaglibEClass, FACELET_TAGLIB__VERSION);
-        createEAttribute(faceletTaglibEClass, FACELET_TAGLIB__NAMESPACE_URI);
-
-        fullyQualifiedClassEClass = createEClass(FULLY_QUALIFIED_CLASS);
-
-        genericBooleanEClass = createEClass(GENERIC_BOOLEAN);
-
-        iconEClass = createEClass(ICON);
-        createEReference(iconEClass, ICON__SMALL_ICON);
-        createEReference(iconEClass, ICON__LARGE_ICON);
-        createEAttribute(iconEClass, ICON__ID);
-        createEAttribute(iconEClass, ICON__LANG);
-
-        javaIdentifierEClass = createEClass(JAVA_IDENTIFIER);
-
-        pathEClass = createEClass(PATH);
-
-        identifiableStringValueEClass = createEClass(IDENTIFIABLE_STRING_VALUE);
-        createEAttribute(identifiableStringValueEClass, IDENTIFIABLE_STRING_VALUE__VALUE);
-        createEAttribute(identifiableStringValueEClass, IDENTIFIABLE_STRING_VALUE__ID);
-
-        identifiableLangStringValueEClass = createEClass(IDENTIFIABLE_LANG_STRING_VALUE);
-        createEAttribute(identifiableLangStringValueEClass, IDENTIFIABLE_LANG_STRING_VALUE__LANG);
-
-        userVisibleTaglibObjectEClass = createEClass(USER_VISIBLE_TAGLIB_OBJECT);
-        createEReference(userVisibleTaglibObjectEClass, USER_VISIBLE_TAGLIB_OBJECT__DESCRIPTION);
-        createEReference(userVisibleTaglibObjectEClass, USER_VISIBLE_TAGLIB_OBJECT__DISPLAY_NAME);
-        createEReference(userVisibleTaglibObjectEClass, USER_VISIBLE_TAGLIB_OBJECT__ICON);
-
-        // Create enums
-        faceletTaglibVersionEEnum = createEEnum(FACELET_TAGLIB_VERSION);
-        genericBooleanBaseEEnum = createEEnum(GENERIC_BOOLEAN_BASE);
-
-        // Create data types
-        faceletTaglibVersionTypeObjectEDataType = createEDataType(FACELET_TAGLIB_VERSION_TYPE_OBJECT);
-        fullyQualifiedClassBaseEDataType = createEDataType(FULLY_QUALIFIED_CLASS_BASE);
-        javaIdentifierBaseEDataType = createEDataType(JAVA_IDENTIFIER_BASE);
-        pathTypeBaseEDataType = createEDataType(PATH_TYPE_BASE);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private boolean isInitialized = false;
-
-    /**
-     * Complete the initialization of the package and its meta-model.  This
-     * method is guarded to have no affect on any invocation but its first.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void initializePackageContents()
-    {
-        if (isInitialized) return;
-        isInitialized = true;
-
-        // Initialize package
-        setName(eNAME);
-        setNsPrefix(eNS_PREFIX);
-        setNsURI(eNS_URI);
-
-        // Obtain other dependent packages
-        XMLTypePackage theXMLTypePackage = (XMLTypePackage)EPackage.Registry.INSTANCE.getEPackage(XMLTypePackage.eNS_URI);
-
-        // Create type parameters
-
-        // Set bounds for type parameters
-
-        // Add supertypes to classes
-        descriptionEClass.getESuperTypes().add(this.getIdentifiableLangStringValue());
-        displayNameEClass.getESuperTypes().add(this.getIdentifiableLangStringValue());
-        faceletTaglibFunctionEClass.getESuperTypes().add(this.getUserVisibleTaglibObject());
-        faceletTaglibTagAttributeEClass.getESuperTypes().add(this.getUserVisibleTaglibObject());
-        faceletTaglibTagBehaviorEClass.getESuperTypes().add(this.getUserVisibleTaglibObject());
-        faceletTaglibTagComponentEClass.getESuperTypes().add(this.getUserVisibleTaglibObject());
-        faceletTaglibTagConverterEClass.getESuperTypes().add(this.getUserVisibleTaglibObject());
-        faceletTaglibTagEClass.getESuperTypes().add(this.getUserVisibleTaglibObject());
-        faceletTaglibTagValidatorEClass.getESuperTypes().add(this.getUserVisibleTaglibObject());
-        faceletTaglibEClass.getESuperTypes().add(this.getUserVisibleTaglibObject());
-        fullyQualifiedClassEClass.getESuperTypes().add(this.getIdentifiableStringValue());
-        genericBooleanEClass.getESuperTypes().add(this.getIdentifiableStringValue());
-        javaIdentifierEClass.getESuperTypes().add(this.getIdentifiableStringValue());
-        pathEClass.getESuperTypes().add(this.getIdentifiableStringValue());
-        identifiableLangStringValueEClass.getESuperTypes().add(this.getIdentifiableStringValue());
-
-        // Initialize classes and features; add operations and parameters
-        initEClass(descriptionEClass, Description.class, "Description", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-
-        initEClass(displayNameEClass, DisplayName.class, "DisplayName", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-
-        initEClass(documentRootEClass, DocumentRoot.class, "DocumentRoot", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-        initEAttribute(getDocumentRoot_Mixed(), ecorePackage.getEFeatureMapEntry(), "mixed", null, 0, -1, null, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-        initEReference(getDocumentRoot_XMLNSPrefixMap(), ecorePackage.getEStringToStringMapEntry(), null, "xMLNSPrefixMap", null, 0, -1, null, IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-        initEReference(getDocumentRoot_XSISchemaLocation(), ecorePackage.getEStringToStringMapEntry(), null, "xSISchemaLocation", null, 0, -1, null, IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-        initEReference(getDocumentRoot_FaceletTaglib(), this.getFaceletTaglib(), null, "faceletTaglib", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-        initEClass(faceletTaglibCanonicalNameEClass, FaceletTaglibCanonicalName.class, "FaceletTaglibCanonicalName", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-        initEAttribute(getFaceletTaglibCanonicalName_Value(), theXMLTypePackage.getNCName(), "value", null, 0, 1, FaceletTaglibCanonicalName.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-        initEAttribute(getFaceletTaglibCanonicalName_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, FaceletTaglibCanonicalName.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-        initEClass(faceletTaglibExtensionEClass, FaceletTaglibExtension.class, "FaceletTaglibExtension", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-        initEAttribute(getFaceletTaglibExtension_Any(), ecorePackage.getEFeatureMapEntry(), "any", null, 0, -1, FaceletTaglibExtension.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-        initEAttribute(getFaceletTaglibExtension_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, FaceletTaglibExtension.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-        initEClass(faceletTaglibFunctionEClass, FaceletTaglibFunction.class, "FaceletTaglibFunction", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-        initEReference(getFaceletTaglibFunction_FunctionName(), this.getIdentifiableStringValue(), null, "functionName", null, 1, 1, FaceletTaglibFunction.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-        initEReference(getFaceletTaglibFunction_FunctionClass(), this.getFullyQualifiedClass(), null, "functionClass", null, 1, 1, FaceletTaglibFunction.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-        initEReference(getFaceletTaglibFunction_FunctionSignature(), this.getIdentifiableStringValue(), null, "functionSignature", null, 1, 1, FaceletTaglibFunction.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-        initEClass(faceletTaglibTagAttributeEClass, FaceletTaglibTagAttribute.class, "FaceletTaglibTagAttribute", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-        initEReference(getFaceletTaglibTagAttribute_NameElement(), this.getFaceletTaglibCanonicalName(), null, "nameElement", null, 1, 1, FaceletTaglibTagAttribute.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-        initEReference(getFaceletTaglibTagAttribute_RequiredElement(), this.getGenericBoolean(), null, "requiredElement", null, 0, 1, FaceletTaglibTagAttribute.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-        initEReference(getFaceletTaglibTagAttribute_TypeElement(), this.getFullyQualifiedClass(), null, "typeElement", null, 0, 1, FaceletTaglibTagAttribute.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-        initEReference(getFaceletTaglibTagAttribute_MethodSignatureElement(), this.getIdentifiableStringValue(), null, "methodSignatureElement", null, 0, 1, FaceletTaglibTagAttribute.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-        initEAttribute(getFaceletTaglibTagAttribute_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, FaceletTaglibTagAttribute.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-        initEAttribute(getFaceletTaglibTagAttribute_Name(), ecorePackage.getEString(), "name", null, 0, 1, FaceletTaglibTagAttribute.class, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-        initEAttribute(getFaceletTaglibTagAttribute_Required(), ecorePackage.getEBoolean(), "required", null, 0, 1, FaceletTaglibTagAttribute.class, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-        initEAttribute(getFaceletTaglibTagAttribute_Type(), ecorePackage.getEString(), "type", null, 0, 1, FaceletTaglibTagAttribute.class, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-        initEAttribute(getFaceletTaglibTagAttribute_MethodSignature(), ecorePackage.getEString(), "methodSignature", null, 0, 1, FaceletTaglibTagAttribute.class, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-        initEClass(faceletTaglibTagBehaviorExtensionEClass, FaceletTaglibTagBehaviorExtension.class, "FaceletTaglibTagBehaviorExtension", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-        initEAttribute(getFaceletTaglibTagBehaviorExtension_Any(), ecorePackage.getEFeatureMapEntry(), "any", null, 0, -1, FaceletTaglibTagBehaviorExtension.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-        initEAttribute(getFaceletTaglibTagBehaviorExtension_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, FaceletTaglibTagBehaviorExtension.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-        initEClass(faceletTaglibTagBehaviorEClass, FaceletTaglibTagBehavior.class, "FaceletTaglibTagBehavior", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-        initEReference(getFaceletTaglibTagBehavior_BehaviorId(), this.getIdentifiableStringValue(), null, "behaviorId", null, 1, 1, FaceletTaglibTagBehavior.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-        initEReference(getFaceletTaglibTagBehavior_HandlerClass(), this.getFullyQualifiedClass(), null, "handlerClass", null, 0, 1, FaceletTaglibTagBehavior.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-        initEReference(getFaceletTaglibTagBehavior_BehaviorExtension(), this.getFaceletTaglibTagBehaviorExtension(), null, "behaviorExtension", null, 0, -1, FaceletTaglibTagBehavior.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-        initEClass(faceletTaglibTagComponentExtensionEClass, FaceletTaglibTagComponentExtension.class, "FaceletTaglibTagComponentExtension", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-        initEAttribute(getFaceletTaglibTagComponentExtension_Any(), ecorePackage.getEFeatureMapEntry(), "any", null, 0, -1, FaceletTaglibTagComponentExtension.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-        initEAttribute(getFaceletTaglibTagComponentExtension_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, FaceletTaglibTagComponentExtension.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-        initEClass(faceletTaglibTagComponentEClass, FaceletTaglibTagComponent.class, "FaceletTaglibTagComponent", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-        initEReference(getFaceletTaglibTagComponent_ComponentType(), this.getIdentifiableStringValue(), null, "componentType", null, 1, 1, FaceletTaglibTagComponent.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-        initEReference(getFaceletTaglibTagComponent_RendererType(), this.getIdentifiableStringValue(), null, "rendererType", null, 0, 1, FaceletTaglibTagComponent.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-        initEReference(getFaceletTaglibTagComponent_HandlerClass(), this.getFullyQualifiedClass(), null, "handlerClass", null, 0, 1, FaceletTaglibTagComponent.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-        initEReference(getFaceletTaglibTagComponent_ComponentExtension(), this.getFaceletTaglibTagComponentExtension(), null, "componentExtension", null, 0, -1, FaceletTaglibTagComponent.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-        initEClass(faceletTaglibTagConverterExtensionEClass, FaceletTaglibTagConverterExtension.class, "FaceletTaglibTagConverterExtension", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-        initEAttribute(getFaceletTaglibTagConverterExtension_Any(), ecorePackage.getEFeatureMapEntry(), "any", null, 0, -1, FaceletTaglibTagConverterExtension.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-        initEAttribute(getFaceletTaglibTagConverterExtension_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, FaceletTaglibTagConverterExtension.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-        initEClass(faceletTaglibTagConverterEClass, FaceletTaglibTagConverter.class, "FaceletTaglibTagConverter", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-        initEReference(getFaceletTaglibTagConverter_ConverterId(), this.getIdentifiableStringValue(), null, "converterId", null, 1, 1, FaceletTaglibTagConverter.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-        initEReference(getFaceletTaglibTagConverter_HandlerClass(), this.getFullyQualifiedClass(), null, "handlerClass", null, 0, 1, FaceletTaglibTagConverter.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-        initEReference(getFaceletTaglibTagConverter_ConverterExtension(), this.getFaceletTaglibTagConverterExtension(), null, "converterExtension", null, 0, -1, FaceletTaglibTagConverter.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-        initEClass(faceletTaglibTagExtensionEClass, FaceletTaglibTagExtension.class, "FaceletTaglibTagExtension", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-        initEAttribute(getFaceletTaglibTagExtension_Any(), ecorePackage.getEFeatureMapEntry(), "any", null, 0, -1, FaceletTaglibTagExtension.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-        initEAttribute(getFaceletTaglibTagExtension_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, FaceletTaglibTagExtension.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-        initEClass(faceletTaglibTagEClass, FaceletTaglibTag.class, "FaceletTaglibTag", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-        initEReference(getFaceletTaglibTag_TagNameElement(), this.getFaceletTaglibCanonicalName(), null, "tagNameElement", null, 1, 1, FaceletTaglibTag.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-        initEReference(getFaceletTaglibTag_HandlerClassElement(), this.getFullyQualifiedClass(), null, "handlerClassElement", null, 0, 1, FaceletTaglibTag.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-        initEReference(getFaceletTaglibTag_Behavior(), this.getFaceletTaglibTagBehavior(), null, "behavior", null, 0, 1, FaceletTaglibTag.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-        initEReference(getFaceletTaglibTag_Component(), this.getFaceletTaglibTagComponent(), null, "component", null, 0, 1, FaceletTaglibTag.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-        initEReference(getFaceletTaglibTag_Converter(), this.getFaceletTaglibTagConverter(), null, "converter", null, 0, 1, FaceletTaglibTag.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-        initEReference(getFaceletTaglibTag_Validator(), this.getFaceletTaglibTagValidator(), null, "validator", null, 0, 1, FaceletTaglibTag.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-        initEReference(getFaceletTaglibTag_Source(), this.getIdentifiableStringValue(), null, "source", null, 0, 1, FaceletTaglibTag.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-        initEReference(getFaceletTaglibTag_Attribute(), this.getFaceletTaglibTagAttribute(), null, "attribute", null, 0, -1, FaceletTaglibTag.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-        initEReference(getFaceletTaglibTag_TagExtension(), this.getFaceletTaglibTagExtension(), null, "tagExtension", null, 0, -1, FaceletTaglibTag.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-        initEAttribute(getFaceletTaglibTag_TagName(), ecorePackage.getEString(), "tagName", null, 0, 1, FaceletTaglibTag.class, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-        initEAttribute(getFaceletTaglibTag_HandlerClass(), ecorePackage.getEString(), "handlerClass", null, 0, 1, FaceletTaglibTag.class, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-        initEClass(faceletTaglibTagValidatorExtensionEClass, FaceletTaglibTagValidatorExtension.class, "FaceletTaglibTagValidatorExtension", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-        initEAttribute(getFaceletTaglibTagValidatorExtension_Any(), ecorePackage.getEFeatureMapEntry(), "any", null, 0, -1, FaceletTaglibTagValidatorExtension.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-        initEAttribute(getFaceletTaglibTagValidatorExtension_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, FaceletTaglibTagValidatorExtension.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-        initEClass(faceletTaglibTagValidatorEClass, FaceletTaglibTagValidator.class, "FaceletTaglibTagValidator", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-        initEReference(getFaceletTaglibTagValidator_ValidatorId(), this.getIdentifiableStringValue(), null, "validatorId", null, 1, 1, FaceletTaglibTagValidator.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-        initEReference(getFaceletTaglibTagValidator_HandlerClass(), this.getFullyQualifiedClass(), null, "handlerClass", null, 0, 1, FaceletTaglibTagValidator.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-        initEReference(getFaceletTaglibTagValidator_ValidatorExtension(), this.getFaceletTaglibTagValidatorExtension(), null, "validatorExtension", null, 0, -1, FaceletTaglibTagValidator.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-        initEClass(faceletTaglibEClass, FaceletTaglib.class, "FaceletTaglib", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-        initEReference(getFaceletTaglib_LibraryClass(), this.getFullyQualifiedClass(), null, "libraryClass", null, 0, 1, FaceletTaglib.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-        initEReference(getFaceletTaglib_Namespace(), this.getIdentifiableStringValue(), null, "namespace", null, 0, 1, FaceletTaglib.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-        initEReference(getFaceletTaglib_CompositeLibraryName(), this.getFullyQualifiedClass(), null, "compositeLibraryName", null, 0, 1, FaceletTaglib.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-        initEAttribute(getFaceletTaglib_Group(), ecorePackage.getEFeatureMapEntry(), "group", null, 0, -1, FaceletTaglib.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-        initEReference(getFaceletTaglib_Tag(), this.getFaceletTaglibTag(), null, "tag", null, 0, -1, FaceletTaglib.class, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-        initEReference(getFaceletTaglib_Function(), this.getFaceletTaglibFunction(), null, "function", null, 0, -1, FaceletTaglib.class, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-        initEReference(getFaceletTaglib_TaglibExtension(), this.getFaceletTaglibExtension(), null, "taglibExtension", null, 0, -1, FaceletTaglib.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-        initEAttribute(getFaceletTaglib_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, FaceletTaglib.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-        initEAttribute(getFaceletTaglib_Version(), this.getFaceletTaglibVersion(), "version", null, 1, 1, FaceletTaglib.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-        initEAttribute(getFaceletTaglib_NamespaceUri(), theXMLTypePackage.getToken(), "namespaceUri", null, 0, 1, FaceletTaglib.class, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-        initEClass(fullyQualifiedClassEClass, FullyQualifiedClass.class, "FullyQualifiedClass", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-
-        initEClass(genericBooleanEClass, GenericBoolean.class, "GenericBoolean", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-
-        initEClass(iconEClass, Icon.class, "Icon", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-        initEReference(getIcon_SmallIcon(), this.getPath(), null, "smallIcon", null, 0, 1, Icon.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-        initEReference(getIcon_LargeIcon(), this.getPath(), null, "largeIcon", null, 0, 1, Icon.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-        initEAttribute(getIcon_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, Icon.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-        initEAttribute(getIcon_Lang(), ecorePackage.getEString(), "lang", null, 0, 1, Icon.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-        initEClass(javaIdentifierEClass, JavaIdentifier.class, "JavaIdentifier", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-
-        initEClass(pathEClass, Path.class, "Path", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-
-        initEClass(identifiableStringValueEClass, IdentifiableStringValue.class, "IdentifiableStringValue", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-        initEAttribute(getIdentifiableStringValue_Value(), theXMLTypePackage.getToken(), "value", null, 0, 1, IdentifiableStringValue.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-        initEAttribute(getIdentifiableStringValue_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, IdentifiableStringValue.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-        initEClass(identifiableLangStringValueEClass, IdentifiableLangStringValue.class, "IdentifiableLangStringValue", IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-        initEAttribute(getIdentifiableLangStringValue_Lang(), ecorePackage.getEString(), "lang", null, 0, 1, IdentifiableLangStringValue.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-        initEClass(userVisibleTaglibObjectEClass, UserVisibleTaglibObject.class, "UserVisibleTaglibObject", IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-        initEReference(getUserVisibleTaglibObject_Description(), this.getDescription(), null, "description", null, 0, -1, UserVisibleTaglibObject.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-        initEReference(getUserVisibleTaglibObject_DisplayName(), this.getDisplayName(), null, "displayName", null, 0, -1, UserVisibleTaglibObject.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-        initEReference(getUserVisibleTaglibObject_Icon(), this.getIcon(), null, "icon", null, 0, -1, UserVisibleTaglibObject.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-        EOperation op = addEOperation(userVisibleTaglibObjectEClass, ecorePackage.getEString(), "getDescription", 0, 1, IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
-        addEParameter(op, ecorePackage.getEString(), "language", 0, 1, IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
-        addEParameter(op, ecorePackage.getEString(), "separationString", 0, 1, IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
-
-        op = addEOperation(userVisibleTaglibObjectEClass, ecorePackage.getEString(), "getDefaultDescription", 0, 1, IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
-        addEParameter(op, ecorePackage.getEString(), "separationString", 0, 1, IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
-
-        op = addEOperation(userVisibleTaglibObjectEClass, ecorePackage.getEString(), "getDisplayName", 0, 1, IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
-        addEParameter(op, ecorePackage.getEString(), "language", 0, 1, IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
-        addEParameter(op, ecorePackage.getEString(), "separationString", 0, 1, IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
-
-        op = addEOperation(userVisibleTaglibObjectEClass, ecorePackage.getEString(), "getDefaultDisplayName", 0, 1, IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
-        addEParameter(op, ecorePackage.getEString(), "separationString", 0, 1, IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
-
-        // Initialize enums and add enum literals
-        initEEnum(faceletTaglibVersionEEnum, FaceletTaglibVersion.class, "FaceletTaglibVersion"); //$NON-NLS-1$
-        addEEnumLiteral(faceletTaglibVersionEEnum, FaceletTaglibVersion._20);
-
-        initEEnum(genericBooleanBaseEEnum, GenericBooleanBase.class, "GenericBooleanBase"); //$NON-NLS-1$
-        addEEnumLiteral(genericBooleanBaseEEnum, GenericBooleanBase.TRUE);
-        addEEnumLiteral(genericBooleanBaseEEnum, GenericBooleanBase.FALSE);
-        addEEnumLiteral(genericBooleanBaseEEnum, GenericBooleanBase.YES);
-        addEEnumLiteral(genericBooleanBaseEEnum, GenericBooleanBase.NO);
-
-        // Initialize data types
-        initEDataType(faceletTaglibVersionTypeObjectEDataType, FaceletTaglibVersion.class, "FaceletTaglibVersionTypeObject", IS_SERIALIZABLE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-        initEDataType(fullyQualifiedClassBaseEDataType, String.class, "FullyQualifiedClassBase", IS_SERIALIZABLE, !IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-        initEDataType(javaIdentifierBaseEDataType, String.class, "JavaIdentifierBase", IS_SERIALIZABLE, !IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-        initEDataType(pathTypeBaseEDataType, String.class, "PathTypeBase", IS_SERIALIZABLE, !IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-
-        // Create resource
-        createResource(eNS_URI);
-
-        // Create annotations
-        // http:///org/eclipse/emf/ecore/util/ExtendedMetaData
-        createExtendedMetaDataAnnotations();
-    }
-
-    /**
-     * Initializes the annotations for <b>http:///org/eclipse/emf/ecore/util/ExtendedMetaData</b>.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected void createExtendedMetaDataAnnotations()
-    {
-        String source = "http:///org/eclipse/emf/ecore/util/ExtendedMetaData"; //$NON-NLS-1$				
-        addAnnotation
-          (descriptionEClass, 
-           source, 
-           new String[] 
-           {
-             "name", "descriptionType", //$NON-NLS-1$ //$NON-NLS-2$
-             "kind", "simple" //$NON-NLS-1$ //$NON-NLS-2$
-           });			
-        addAnnotation
-          (displayNameEClass, 
-           source, 
-           new String[] 
-           {
-             "name", "display-nameType", //$NON-NLS-1$ //$NON-NLS-2$
-             "kind", "simple" //$NON-NLS-1$ //$NON-NLS-2$
-           });		
-        addAnnotation
-          (documentRootEClass, 
-           source, 
-           new String[] 
-           {
-             "name", "", //$NON-NLS-1$ //$NON-NLS-2$
-             "kind", "mixed" //$NON-NLS-1$ //$NON-NLS-2$
-           });		
-        addAnnotation
-          (getDocumentRoot_Mixed(), 
-           source, 
-           new String[] 
-           {
-             "kind", "elementWildcard", //$NON-NLS-1$ //$NON-NLS-2$
-             "name", ":mixed" //$NON-NLS-1$ //$NON-NLS-2$
-           });		
-        addAnnotation
-          (getDocumentRoot_XMLNSPrefixMap(), 
-           source, 
-           new String[] 
-           {
-             "kind", "attribute", //$NON-NLS-1$ //$NON-NLS-2$
-             "name", "xmlns:prefix" //$NON-NLS-1$ //$NON-NLS-2$
-           });		
-        addAnnotation
-          (getDocumentRoot_XSISchemaLocation(), 
-           source, 
-           new String[] 
-           {
-             "kind", "attribute", //$NON-NLS-1$ //$NON-NLS-2$
-             "name", "xsi:schemaLocation" //$NON-NLS-1$ //$NON-NLS-2$
-           });		
-        addAnnotation
-          (getDocumentRoot_FaceletTaglib(), 
-           source, 
-           new String[] 
-           {
-             "kind", "element", //$NON-NLS-1$ //$NON-NLS-2$
-             "name", "facelet-taglib", //$NON-NLS-1$ //$NON-NLS-2$
-             "namespace", "##targetNamespace" //$NON-NLS-1$ //$NON-NLS-2$
-           });			
-        addAnnotation
-          (faceletTaglibCanonicalNameEClass, 
-           source, 
-           new String[] 
-           {
-             "name", "facelet-taglib-canonical-nameType", //$NON-NLS-1$ //$NON-NLS-2$
-             "kind", "simple" //$NON-NLS-1$ //$NON-NLS-2$
-           });		
-        addAnnotation
-          (getFaceletTaglibCanonicalName_Value(), 
-           source, 
-           new String[] 
-           {
-             "name", ":0", //$NON-NLS-1$ //$NON-NLS-2$
-             "kind", "simple" //$NON-NLS-1$ //$NON-NLS-2$
-           });		
-        addAnnotation
-          (getFaceletTaglibCanonicalName_Id(), 
-           source, 
-           new String[] 
-           {
-             "kind", "attribute", //$NON-NLS-1$ //$NON-NLS-2$
-             "name", "id" //$NON-NLS-1$ //$NON-NLS-2$
-           });			
-        addAnnotation
-          (faceletTaglibExtensionEClass, 
-           source, 
-           new String[] 
-           {
-             "name", "facelet-taglib-extensionType", //$NON-NLS-1$ //$NON-NLS-2$
-             "kind", "elementOnly" //$NON-NLS-1$ //$NON-NLS-2$
-           });		
-        addAnnotation
-          (getFaceletTaglibExtension_Any(), 
-           source, 
-           new String[] 
-           {
-             "kind", "elementWildcard", //$NON-NLS-1$ //$NON-NLS-2$
-             "wildcards", "##any", //$NON-NLS-1$ //$NON-NLS-2$
-             "name", ":0", //$NON-NLS-1$ //$NON-NLS-2$
-             "processing", "lax" //$NON-NLS-1$ //$NON-NLS-2$
-           });		
-        addAnnotation
-          (getFaceletTaglibExtension_Id(), 
-           source, 
-           new String[] 
-           {
-             "kind", "attribute", //$NON-NLS-1$ //$NON-NLS-2$
-             "name", "id" //$NON-NLS-1$ //$NON-NLS-2$
-           });			
-        addAnnotation
-          (faceletTaglibFunctionEClass, 
-           source, 
-           new String[] 
-           {
-             "name", "facelet-taglib-functionType", //$NON-NLS-1$ //$NON-NLS-2$
-             "kind", "elementOnly" //$NON-NLS-1$ //$NON-NLS-2$
-           });		
-        addAnnotation
-          (getFaceletTaglibFunction_FunctionName(), 
-           source, 
-           new String[] 
-           {
-             "kind", "element", //$NON-NLS-1$ //$NON-NLS-2$
-             "name", "function-name", //$NON-NLS-1$ //$NON-NLS-2$
-             "namespace", "##targetNamespace" //$NON-NLS-1$ //$NON-NLS-2$
-           });		
-        addAnnotation
-          (getFaceletTaglibFunction_FunctionClass(), 
-           source, 
-           new String[] 
-           {
-             "kind", "element", //$NON-NLS-1$ //$NON-NLS-2$
-             "name", "function-class", //$NON-NLS-1$ //$NON-NLS-2$
-             "namespace", "##targetNamespace" //$NON-NLS-1$ //$NON-NLS-2$
-           });		
-        addAnnotation
-          (getFaceletTaglibFunction_FunctionSignature(), 
-           source, 
-           new String[] 
-           {
-             "kind", "element", //$NON-NLS-1$ //$NON-NLS-2$
-             "name", "function-signature", //$NON-NLS-1$ //$NON-NLS-2$
-             "namespace", "##targetNamespace" //$NON-NLS-1$ //$NON-NLS-2$
-           });			
-        addAnnotation
-          (faceletTaglibTagAttributeEClass, 
-           source, 
-           new String[] 
-           {
-             "name", "facelet-taglib-tag-attributeType", //$NON-NLS-1$ //$NON-NLS-2$
-             "kind", "elementOnly" //$NON-NLS-1$ //$NON-NLS-2$
-           });		
-        addAnnotation
-          (getFaceletTaglibTagAttribute_NameElement(), 
-           source, 
-           new String[] 
-           {
-             "kind", "element", //$NON-NLS-1$ //$NON-NLS-2$
-             "name", "name", //$NON-NLS-1$ //$NON-NLS-2$
-             "namespace", "##targetNamespace" //$NON-NLS-1$ //$NON-NLS-2$
-           });			
-        addAnnotation
-          (getFaceletTaglibTagAttribute_RequiredElement(), 
-           source, 
-           new String[] 
-           {
-             "kind", "element", //$NON-NLS-1$ //$NON-NLS-2$
-             "name", "required", //$NON-NLS-1$ //$NON-NLS-2$
-             "namespace", "##targetNamespace" //$NON-NLS-1$ //$NON-NLS-2$
-           });			
-        addAnnotation
-          (getFaceletTaglibTagAttribute_TypeElement(), 
-           source, 
-           new String[] 
-           {
-             "kind", "element", //$NON-NLS-1$ //$NON-NLS-2$
-             "name", "type", //$NON-NLS-1$ //$NON-NLS-2$
-             "namespace", "##targetNamespace" //$NON-NLS-1$ //$NON-NLS-2$
-           });			
-        addAnnotation
-          (getFaceletTaglibTagAttribute_MethodSignatureElement(), 
-           source, 
-           new String[] 
-           {
-             "kind", "element", //$NON-NLS-1$ //$NON-NLS-2$
-             "name", "method-signature", //$NON-NLS-1$ //$NON-NLS-2$
-             "namespace", "##targetNamespace" //$NON-NLS-1$ //$NON-NLS-2$
-           });		
-        addAnnotation
-          (getFaceletTaglibTagAttribute_Id(), 
-           source, 
-           new String[] 
-           {
-             "kind", "attribute", //$NON-NLS-1$ //$NON-NLS-2$
-             "name", "id" //$NON-NLS-1$ //$NON-NLS-2$
-           });			
-        addAnnotation
-          (faceletTaglibTagBehaviorExtensionEClass, 
-           source, 
-           new String[] 
-           {
-             "name", "facelet-taglib-tag-behavior-extensionType", //$NON-NLS-1$ //$NON-NLS-2$
-             "kind", "elementOnly" //$NON-NLS-1$ //$NON-NLS-2$
-           });		
-        addAnnotation
-          (getFaceletTaglibTagBehaviorExtension_Any(), 
-           source, 
-           new String[] 
-           {
-             "kind", "elementWildcard", //$NON-NLS-1$ //$NON-NLS-2$
-             "wildcards", "##any", //$NON-NLS-1$ //$NON-NLS-2$
-             "name", ":0", //$NON-NLS-1$ //$NON-NLS-2$
-             "processing", "lax" //$NON-NLS-1$ //$NON-NLS-2$
-           });		
-        addAnnotation
-          (getFaceletTaglibTagBehaviorExtension_Id(), 
-           source, 
-           new String[] 
-           {
-             "kind", "attribute", //$NON-NLS-1$ //$NON-NLS-2$
-             "name", "id" //$NON-NLS-1$ //$NON-NLS-2$
-           });			
-        addAnnotation
-          (faceletTaglibTagBehaviorEClass, 
-           source, 
-           new String[] 
-           {
-             "name", "facelet-taglib-tag-behaviorType", //$NON-NLS-1$ //$NON-NLS-2$
-             "kind", "elementOnly" //$NON-NLS-1$ //$NON-NLS-2$
-           });		
-        addAnnotation
-          (getFaceletTaglibTagBehavior_BehaviorId(), 
-           source, 
-           new String[] 
-           {
-             "kind", "element", //$NON-NLS-1$ //$NON-NLS-2$
-             "name", "behavior-id", //$NON-NLS-1$ //$NON-NLS-2$
-             "namespace", "##targetNamespace" //$NON-NLS-1$ //$NON-NLS-2$
-           });		
-        addAnnotation
-          (getFaceletTaglibTagBehavior_HandlerClass(), 
-           source, 
-           new String[] 
-           {
-             "kind", "element", //$NON-NLS-1$ //$NON-NLS-2$
-             "name", "handler-class", //$NON-NLS-1$ //$NON-NLS-2$
-             "namespace", "##targetNamespace" //$NON-NLS-1$ //$NON-NLS-2$
-           });		
-        addAnnotation
-          (getFaceletTaglibTagBehavior_BehaviorExtension(), 
-           source, 
-           new String[] 
-           {
-             "kind", "element", //$NON-NLS-1$ //$NON-NLS-2$
-             "name", "behavior-extension", //$NON-NLS-1$ //$NON-NLS-2$
-             "namespace", "##targetNamespace" //$NON-NLS-1$ //$NON-NLS-2$
-           });			
-        addAnnotation
-          (faceletTaglibTagComponentExtensionEClass, 
-           source, 
-           new String[] 
-           {
-             "name", "facelet-taglib-tag-component-extensionType", //$NON-NLS-1$ //$NON-NLS-2$
-             "kind", "elementOnly" //$NON-NLS-1$ //$NON-NLS-2$
-           });		
-        addAnnotation
-          (getFaceletTaglibTagComponentExtension_Any(), 
-           source, 
-           new String[] 
-           {
-             "kind", "elementWildcard", //$NON-NLS-1$ //$NON-NLS-2$
-             "wildcards", "##any", //$NON-NLS-1$ //$NON-NLS-2$
-             "name", ":0", //$NON-NLS-1$ //$NON-NLS-2$
-             "processing", "lax" //$NON-NLS-1$ //$NON-NLS-2$
-           });		
-        addAnnotation
-          (getFaceletTaglibTagComponentExtension_Id(), 
-           source, 
-           new String[] 
-           {
-             "kind", "attribute", //$NON-NLS-1$ //$NON-NLS-2$
-             "name", "id" //$NON-NLS-1$ //$NON-NLS-2$
-           });			
-        addAnnotation
-          (faceletTaglibTagComponentEClass, 
-           source, 
-           new String[] 
-           {
-             "name", "facelet-taglib-tag-componentType", //$NON-NLS-1$ //$NON-NLS-2$
-             "kind", "elementOnly" //$NON-NLS-1$ //$NON-NLS-2$
-           });		
-        addAnnotation
-          (getFaceletTaglibTagComponent_ComponentType(), 
-           source, 
-           new String[] 
-           {
-             "kind", "element", //$NON-NLS-1$ //$NON-NLS-2$
-             "name", "component-type", //$NON-NLS-1$ //$NON-NLS-2$
-             "namespace", "##targetNamespace" //$NON-NLS-1$ //$NON-NLS-2$
-           });		
-        addAnnotation
-          (getFaceletTaglibTagComponent_RendererType(), 
-           source, 
-           new String[] 
-           {
-             "kind", "element", //$NON-NLS-1$ //$NON-NLS-2$
-             "name", "renderer-type", //$NON-NLS-1$ //$NON-NLS-2$
-             "namespace", "##targetNamespace" //$NON-NLS-1$ //$NON-NLS-2$
-           });		
-        addAnnotation
-          (getFaceletTaglibTagComponent_HandlerClass(), 
-           source, 
-           new String[] 
-           {
-             "kind", "element", //$NON-NLS-1$ //$NON-NLS-2$
-             "name", "handler-class", //$NON-NLS-1$ //$NON-NLS-2$
-             "namespace", "##targetNamespace" //$NON-NLS-1$ //$NON-NLS-2$
-           });		
-        addAnnotation
-          (getFaceletTaglibTagComponent_ComponentExtension(), 
-           source, 
-           new String[] 
-           {
-             "kind", "element", //$NON-NLS-1$ //$NON-NLS-2$
-             "name", "component-extension", //$NON-NLS-1$ //$NON-NLS-2$
-             "namespace", "##targetNamespace" //$NON-NLS-1$ //$NON-NLS-2$
-           });			
-        addAnnotation
-          (faceletTaglibTagConverterExtensionEClass, 
-           source, 
-           new String[] 
-           {
-             "name", "facelet-taglib-tag-converter-extensionType", //$NON-NLS-1$ //$NON-NLS-2$
-             "kind", "elementOnly" //$NON-NLS-1$ //$NON-NLS-2$
-           });		
-        addAnnotation
-          (getFaceletTaglibTagConverterExtension_Any(), 
-           source, 
-           new String[] 
-           {
-             "kind", "elementWildcard", //$NON-NLS-1$ //$NON-NLS-2$
-             "wildcards", "##any", //$NON-NLS-1$ //$NON-NLS-2$
-             "name", ":0", //$NON-NLS-1$ //$NON-NLS-2$
-             "processing", "lax" //$NON-NLS-1$ //$NON-NLS-2$
-           });		
-        addAnnotation
-          (getFaceletTaglibTagConverterExtension_Id(), 
-           source, 
-           new String[] 
-           {
-             "kind", "attribute", //$NON-NLS-1$ //$NON-NLS-2$
-             "name", "id" //$NON-NLS-1$ //$NON-NLS-2$
-           });			
-        addAnnotation
-          (faceletTaglibTagConverterEClass, 
-           source, 
-           new String[] 
-           {
-             "name", "facelet-taglib-tag-converterType", //$NON-NLS-1$ //$NON-NLS-2$
-             "kind", "elementOnly" //$NON-NLS-1$ //$NON-NLS-2$
-           });		
-        addAnnotation
-          (getFaceletTaglibTagConverter_ConverterId(), 
-           source, 
-           new String[] 
-           {
-             "kind", "element", //$NON-NLS-1$ //$NON-NLS-2$
-             "name", "converter-id", //$NON-NLS-1$ //$NON-NLS-2$
-             "namespace", "##targetNamespace" //$NON-NLS-1$ //$NON-NLS-2$
-           });		
-        addAnnotation
-          (getFaceletTaglibTagConverter_HandlerClass(), 
-           source, 
-           new String[] 
-           {
-             "kind", "element", //$NON-NLS-1$ //$NON-NLS-2$
-             "name", "handler-class", //$NON-NLS-1$ //$NON-NLS-2$
-             "namespace", "##targetNamespace" //$NON-NLS-1$ //$NON-NLS-2$
-           });		
-        addAnnotation
-          (getFaceletTaglibTagConverter_ConverterExtension(), 
-           source, 
-           new String[] 
-           {
-             "kind", "element", //$NON-NLS-1$ //$NON-NLS-2$
-             "name", "converter-extension", //$NON-NLS-1$ //$NON-NLS-2$
-             "namespace", "##targetNamespace" //$NON-NLS-1$ //$NON-NLS-2$
-           });			
-        addAnnotation
-          (faceletTaglibTagExtensionEClass, 
-           source, 
-           new String[] 
-           {
-             "name", "facelet-taglib-tag-extensionType", //$NON-NLS-1$ //$NON-NLS-2$
-             "kind", "elementOnly" //$NON-NLS-1$ //$NON-NLS-2$
-           });		
-        addAnnotation
-          (getFaceletTaglibTagExtension_Any(), 
-           source, 
-           new String[] 
-           {
-             "kind", "elementWildcard", //$NON-NLS-1$ //$NON-NLS-2$
-             "wildcards", "##any", //$NON-NLS-1$ //$NON-NLS-2$
-             "name", ":0", //$NON-NLS-1$ //$NON-NLS-2$
-             "processing", "lax" //$NON-NLS-1$ //$NON-NLS-2$
-           });		
-        addAnnotation
-          (getFaceletTaglibTagExtension_Id(), 
-           source, 
-           new String[] 
-           {
-             "kind", "attribute", //$NON-NLS-1$ //$NON-NLS-2$
-             "name", "id" //$NON-NLS-1$ //$NON-NLS-2$
-           });			
-        addAnnotation
-          (faceletTaglibTagEClass, 
-           source, 
-           new String[] 
-           {
-             "name", "facelet-taglib-tagType", //$NON-NLS-1$ //$NON-NLS-2$
-             "kind", "elementOnly" //$NON-NLS-1$ //$NON-NLS-2$
-           });		
-        addAnnotation
-          (getFaceletTaglibTag_TagNameElement(), 
-           source, 
-           new String[] 
-           {
-             "kind", "element", //$NON-NLS-1$ //$NON-NLS-2$
-             "name", "tag-name", //$NON-NLS-1$ //$NON-NLS-2$
-             "namespace", "##targetNamespace" //$NON-NLS-1$ //$NON-NLS-2$
-           });		
-        addAnnotation
-          (getFaceletTaglibTag_HandlerClassElement(), 
-           source, 
-           new String[] 
-           {
-             "kind", "element", //$NON-NLS-1$ //$NON-NLS-2$
-             "name", "handler-class", //$NON-NLS-1$ //$NON-NLS-2$
-             "namespace", "##targetNamespace" //$NON-NLS-1$ //$NON-NLS-2$
-           });		
-        addAnnotation
-          (getFaceletTaglibTag_Behavior(), 
-           source, 
-           new String[] 
-           {
-             "kind", "element", //$NON-NLS-1$ //$NON-NLS-2$
-             "name", "behavior", //$NON-NLS-1$ //$NON-NLS-2$
-             "namespace", "##targetNamespace" //$NON-NLS-1$ //$NON-NLS-2$
-           });		
-        addAnnotation
-          (getFaceletTaglibTag_Component(), 
-           source, 
-           new String[] 
-           {
-             "kind", "element", //$NON-NLS-1$ //$NON-NLS-2$
-             "name", "component", //$NON-NLS-1$ //$NON-NLS-2$
-             "namespace", "##targetNamespace" //$NON-NLS-1$ //$NON-NLS-2$
-           });		
-        addAnnotation
-          (getFaceletTaglibTag_Converter(), 
-           source, 
-           new String[] 
-           {
-             "kind", "element", //$NON-NLS-1$ //$NON-NLS-2$
-             "name", "converter", //$NON-NLS-1$ //$NON-NLS-2$
-             "namespace", "##targetNamespace" //$NON-NLS-1$ //$NON-NLS-2$
-           });		
-        addAnnotation
-          (getFaceletTaglibTag_Validator(), 
-           source, 
-           new String[] 
-           {
-             "kind", "element", //$NON-NLS-1$ //$NON-NLS-2$
-             "name", "validator", //$NON-NLS-1$ //$NON-NLS-2$
-             "namespace", "##targetNamespace" //$NON-NLS-1$ //$NON-NLS-2$
-           });		
-        addAnnotation
-          (getFaceletTaglibTag_Source(), 
-           source, 
-           new String[] 
-           {
-             "kind", "element", //$NON-NLS-1$ //$NON-NLS-2$
-             "name", "source", //$NON-NLS-1$ //$NON-NLS-2$
-             "namespace", "##targetNamespace" //$NON-NLS-1$ //$NON-NLS-2$
-           });		
-        addAnnotation
-          (getFaceletTaglibTag_Attribute(), 
-           source, 
-           new String[] 
-           {
-             "kind", "element", //$NON-NLS-1$ //$NON-NLS-2$
-             "name", "attribute", //$NON-NLS-1$ //$NON-NLS-2$
-             "namespace", "##targetNamespace" //$NON-NLS-1$ //$NON-NLS-2$
-           });		
-        addAnnotation
-          (getFaceletTaglibTag_TagExtension(), 
-           source, 
-           new String[] 
-           {
-             "kind", "element", //$NON-NLS-1$ //$NON-NLS-2$
-             "name", "tag-extension", //$NON-NLS-1$ //$NON-NLS-2$
-             "namespace", "##targetNamespace" //$NON-NLS-1$ //$NON-NLS-2$
-           });			
-        addAnnotation
-          (faceletTaglibTagValidatorExtensionEClass, 
-           source, 
-           new String[] 
-           {
-             "name", "facelet-taglib-tag-validator-extensionType", //$NON-NLS-1$ //$NON-NLS-2$
-             "kind", "elementOnly" //$NON-NLS-1$ //$NON-NLS-2$
-           });		
-        addAnnotation
-          (getFaceletTaglibTagValidatorExtension_Any(), 
-           source, 
-           new String[] 
-           {
-             "kind", "elementWildcard", //$NON-NLS-1$ //$NON-NLS-2$
-             "wildcards", "##any", //$NON-NLS-1$ //$NON-NLS-2$
-             "name", ":0", //$NON-NLS-1$ //$NON-NLS-2$
-             "processing", "lax" //$NON-NLS-1$ //$NON-NLS-2$
-           });		
-        addAnnotation
-          (getFaceletTaglibTagValidatorExtension_Id(), 
-           source, 
-           new String[] 
-           {
-             "kind", "attribute", //$NON-NLS-1$ //$NON-NLS-2$
-             "name", "id" //$NON-NLS-1$ //$NON-NLS-2$
-           });			
-        addAnnotation
-          (faceletTaglibTagValidatorEClass, 
-           source, 
-           new String[] 
-           {
-             "name", "facelet-taglib-tag-validatorType", //$NON-NLS-1$ //$NON-NLS-2$
-             "kind", "elementOnly" //$NON-NLS-1$ //$NON-NLS-2$
-           });
-        addAnnotation
-          (faceletTaglibTagValidatorEClass, 
-           1,
-           "http:///org/eclipse/emf/ecore/util/ExtendedMetaData", //$NON-NLS-1$
-           new String[] 
-           {
-             "name", "facelet-taglib-tag-validatorType", //$NON-NLS-1$ //$NON-NLS-2$
-             "kind", "elementOnly" //$NON-NLS-1$ //$NON-NLS-2$
-           });		
-        addAnnotation
-          (getFaceletTaglibTagValidator_ValidatorId(), 
-           source, 
-           new String[] 
-           {
-             "kind", "element", //$NON-NLS-1$ //$NON-NLS-2$
-             "name", "validator-id", //$NON-NLS-1$ //$NON-NLS-2$
-             "namespace", "##targetNamespace" //$NON-NLS-1$ //$NON-NLS-2$
-           });		
-        addAnnotation
-          (getFaceletTaglibTagValidator_HandlerClass(), 
-           source, 
-           new String[] 
-           {
-             "kind", "element", //$NON-NLS-1$ //$NON-NLS-2$
-             "name", "handler-class", //$NON-NLS-1$ //$NON-NLS-2$
-             "namespace", "##targetNamespace" //$NON-NLS-1$ //$NON-NLS-2$
-           });		
-        addAnnotation
-          (getFaceletTaglibTagValidator_ValidatorExtension(), 
-           source, 
-           new String[] 
-           {
-             "kind", "element", //$NON-NLS-1$ //$NON-NLS-2$
-             "name", "validator-extension", //$NON-NLS-1$ //$NON-NLS-2$
-             "namespace", "##targetNamespace" //$NON-NLS-1$ //$NON-NLS-2$
-           });			
-        addAnnotation
-          (faceletTaglibEClass, 
-           source, 
-           new String[] 
-           {
-             "name", "facelet-taglibType", //$NON-NLS-1$ //$NON-NLS-2$
-             "kind", "elementOnly" //$NON-NLS-1$ //$NON-NLS-2$
-           });		
-        addAnnotation
-          (getFaceletTaglib_LibraryClass(), 
-           source, 
-           new String[] 
-           {
-             "kind", "element", //$NON-NLS-1$ //$NON-NLS-2$
-             "name", "library-class", //$NON-NLS-1$ //$NON-NLS-2$
-             "namespace", "##targetNamespace" //$NON-NLS-1$ //$NON-NLS-2$
-           });		
-        addAnnotation
-          (getFaceletTaglib_Namespace(), 
-           source, 
-           new String[] 
-           {
-             "kind", "element", //$NON-NLS-1$ //$NON-NLS-2$
-             "name", "namespace", //$NON-NLS-1$ //$NON-NLS-2$
-             "namespace", "##targetNamespace" //$NON-NLS-1$ //$NON-NLS-2$
-           });		
-        addAnnotation
-          (getFaceletTaglib_CompositeLibraryName(), 
-           source, 
-           new String[] 
-           {
-             "kind", "element", //$NON-NLS-1$ //$NON-NLS-2$
-             "name", "composite-library-name", //$NON-NLS-1$ //$NON-NLS-2$
-             "namespace", "##targetNamespace" //$NON-NLS-1$ //$NON-NLS-2$
-           });		
-        addAnnotation
-          (getFaceletTaglib_Group(), 
-           source, 
-           new String[] 
-           {
-             "kind", "group", //$NON-NLS-1$ //$NON-NLS-2$
-             "name", "group:6" //$NON-NLS-1$ //$NON-NLS-2$
-           });		
-        addAnnotation
-          (getFaceletTaglib_Tag(), 
-           source, 
-           new String[] 
-           {
-             "kind", "element", //$NON-NLS-1$ //$NON-NLS-2$
-             "name", "tag", //$NON-NLS-1$ //$NON-NLS-2$
-             "namespace", "##targetNamespace", //$NON-NLS-1$ //$NON-NLS-2$
-             "group", "#group:6" //$NON-NLS-1$ //$NON-NLS-2$
-           });		
-        addAnnotation
-          (getFaceletTaglib_Function(), 
-           source, 
-           new String[] 
-           {
-             "kind", "element", //$NON-NLS-1$ //$NON-NLS-2$
-             "name", "function", //$NON-NLS-1$ //$NON-NLS-2$
-             "namespace", "##targetNamespace", //$NON-NLS-1$ //$NON-NLS-2$
-             "group", "#group:6" //$NON-NLS-1$ //$NON-NLS-2$
-           });		
-        addAnnotation
-          (getFaceletTaglib_TaglibExtension(), 
-           source, 
-           new String[] 
-           {
-             "kind", "element", //$NON-NLS-1$ //$NON-NLS-2$
-             "name", "taglib-extension", //$NON-NLS-1$ //$NON-NLS-2$
-             "namespace", "##targetNamespace" //$NON-NLS-1$ //$NON-NLS-2$
-           });		
-        addAnnotation
-          (getFaceletTaglib_Id(), 
-           source, 
-           new String[] 
-           {
-             "kind", "attribute", //$NON-NLS-1$ //$NON-NLS-2$
-             "name", "id" //$NON-NLS-1$ //$NON-NLS-2$
-           });		
-        addAnnotation
-          (getFaceletTaglib_Version(), 
-           source, 
-           new String[] 
-           {
-             "kind", "attribute", //$NON-NLS-1$ //$NON-NLS-2$
-             "name", "version" //$NON-NLS-1$ //$NON-NLS-2$
-           });			
-        addAnnotation
-          (faceletTaglibVersionEEnum, 
-           source, 
-           new String[] 
-           {
-             "name", "facelet-taglib-versionType" //$NON-NLS-1$ //$NON-NLS-2$
-           });		
-        addAnnotation
-          (faceletTaglibVersionTypeObjectEDataType, 
-           source, 
-           new String[] 
-           {
-             "name", "facelet-taglib-versionType:Object", //$NON-NLS-1$ //$NON-NLS-2$
-             "baseType", "facelet-taglib-versionType" //$NON-NLS-1$ //$NON-NLS-2$
-           });			
-        addAnnotation
-          (fullyQualifiedClassEClass, 
-           source, 
-           new String[] 
-           {
-             "name", "fully-qualified-classType", //$NON-NLS-1$ //$NON-NLS-2$
-             "kind", "simple" //$NON-NLS-1$ //$NON-NLS-2$
-           });		
-        addAnnotation
-          (fullyQualifiedClassBaseEDataType, 
-           source, 
-           new String[] 
-           {
-             "name", "fully-qualified-classType_._base", //$NON-NLS-1$ //$NON-NLS-2$
-             "baseType", "http://www.eclipse.org/emf/2003/XMLType#token" //$NON-NLS-1$ //$NON-NLS-2$
-           });			
-        addAnnotation
-          (genericBooleanEClass, 
-           source, 
-           new String[] 
-           {
-             "name", "generic-booleanType", //$NON-NLS-1$ //$NON-NLS-2$
-             "kind", "simple" //$NON-NLS-1$ //$NON-NLS-2$
-           });		
-        addAnnotation
-          (genericBooleanBaseEEnum, 
-           source, 
-           new String[] 
-           {
-             "name", "generic-booleanType_._base" //$NON-NLS-1$ //$NON-NLS-2$
-           });			
-        addAnnotation
-          (iconEClass, 
-           source, 
-           new String[] 
-           {
-             "name", "iconType", //$NON-NLS-1$ //$NON-NLS-2$
-             "kind", "elementOnly" //$NON-NLS-1$ //$NON-NLS-2$
-           });			
-        addAnnotation
-          (getIcon_SmallIcon(), 
-           source, 
-           new String[] 
-           {
-             "kind", "element", //$NON-NLS-1$ //$NON-NLS-2$
-             "name", "small-icon", //$NON-NLS-1$ //$NON-NLS-2$
-             "namespace", "##targetNamespace" //$NON-NLS-1$ //$NON-NLS-2$
-           });			
-        addAnnotation
-          (getIcon_LargeIcon(), 
-           source, 
-           new String[] 
-           {
-             "kind", "element", //$NON-NLS-1$ //$NON-NLS-2$
-             "name", "large-icon", //$NON-NLS-1$ //$NON-NLS-2$
-             "namespace", "##targetNamespace" //$NON-NLS-1$ //$NON-NLS-2$
-           });		
-        addAnnotation
-          (getIcon_Id(), 
-           source, 
-           new String[] 
-           {
-             "kind", "attribute", //$NON-NLS-1$ //$NON-NLS-2$
-             "name", "id" //$NON-NLS-1$ //$NON-NLS-2$
-           });			
-        addAnnotation
-          (getIcon_Lang(), 
-           source, 
-           new String[] 
-           {
-             "kind", "attribute", //$NON-NLS-1$ //$NON-NLS-2$
-             "name", "lang", //$NON-NLS-1$ //$NON-NLS-2$
-             "namespace", "http://www.w3.org/XML/1998/namespace" //$NON-NLS-1$ //$NON-NLS-2$
-           });			
-        addAnnotation
-          (javaIdentifierEClass, 
-           source, 
-           new String[] 
-           {
-             "name", "java-identifierType", //$NON-NLS-1$ //$NON-NLS-2$
-             "kind", "simple" //$NON-NLS-1$ //$NON-NLS-2$
-           });		
-        addAnnotation
-          (javaIdentifierBaseEDataType, 
-           source, 
-           new String[] 
-           {
-             "name", "java-identifierType_._base", //$NON-NLS-1$ //$NON-NLS-2$
-             "baseType", "http://www.eclipse.org/emf/2003/XMLType#token", //$NON-NLS-1$ //$NON-NLS-2$
-             "pattern", "($|_|\\p{L})(\\p{L}|\\p{Nd}|_|$)*" //$NON-NLS-1$ //$NON-NLS-2$
-           });			
-        addAnnotation
-          (pathEClass, 
-           source, 
-           new String[] 
-           {
-             "name", "pathType", //$NON-NLS-1$ //$NON-NLS-2$
-             "kind", "simple" //$NON-NLS-1$ //$NON-NLS-2$
-           });		
-        addAnnotation
-          (pathTypeBaseEDataType, 
-           source, 
-           new String[] 
-           {
-             "name", "pathType_._base", //$NON-NLS-1$ //$NON-NLS-2$
-             "baseType", "http://www.eclipse.org/emf/2003/XMLType#token" //$NON-NLS-1$ //$NON-NLS-2$
-           });			
-        addAnnotation
-          (identifiableStringValueEClass, 
-           source, 
-           new String[] 
-           {
-             "name", "string", //$NON-NLS-1$ //$NON-NLS-2$
-             "kind", "simple" //$NON-NLS-1$ //$NON-NLS-2$
-           });		
-        addAnnotation
-          (getIdentifiableStringValue_Value(), 
-           source, 
-           new String[] 
-           {
-             "name", ":0", //$NON-NLS-1$ //$NON-NLS-2$
-             "kind", "simple" //$NON-NLS-1$ //$NON-NLS-2$
-           });		
-        addAnnotation
-          (getIdentifiableStringValue_Id(), 
-           source, 
-           new String[] 
-           {
-             "kind", "attribute", //$NON-NLS-1$ //$NON-NLS-2$
-             "name", "id" //$NON-NLS-1$ //$NON-NLS-2$
-           });			
-        addAnnotation
-          (getIdentifiableLangStringValue_Lang(), 
-           source, 
-           new String[] 
-           {
-             "kind", "attribute", //$NON-NLS-1$ //$NON-NLS-2$
-             "name", "lang", //$NON-NLS-1$ //$NON-NLS-2$
-             "namespace", "http://www.w3.org/XML/1998/namespace" //$NON-NLS-1$ //$NON-NLS-2$
-           });										
-        addAnnotation
-          (getUserVisibleTaglibObject_Description(), 
-           source, 
-           new String[] 
-           {
-             "kind", "element", //$NON-NLS-1$ //$NON-NLS-2$
-             "name", "description", //$NON-NLS-1$ //$NON-NLS-2$
-             "namespace", "##targetNamespace" //$NON-NLS-1$ //$NON-NLS-2$
-           });		
-        addAnnotation
-          (getUserVisibleTaglibObject_DisplayName(), 
-           source, 
-           new String[] 
-           {
-             "kind", "element", //$NON-NLS-1$ //$NON-NLS-2$
-             "name", "display-name", //$NON-NLS-1$ //$NON-NLS-2$
-             "namespace", "##targetNamespace" //$NON-NLS-1$ //$NON-NLS-2$
-           });		
-        addAnnotation
-          (getUserVisibleTaglibObject_Icon(), 
-           source, 
-           new String[] 
-           {
-             "kind", "element", //$NON-NLS-1$ //$NON-NLS-2$
-             "name", "icon", //$NON-NLS-1$ //$NON-NLS-2$
-             "namespace", "##targetNamespace" //$NON-NLS-1$ //$NON-NLS-2$
-           });
-    }
-
-} //FaceletTaglibPackageImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/impl/FaceletTaglibTagAttributeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/impl/FaceletTaglibTagAttributeImpl.java
deleted file mode 100644
index dfe5916..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/impl/FaceletTaglibTagAttributeImpl.java
+++ /dev/null
@@ -1,671 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: FaceletTaglibTagAttributeImpl.java,v 1.1 2010/03/18 06:24:38 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibCanonicalName;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagAttribute;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FullyQualifiedClass;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.GenericBoolean;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.GenericBooleanBase;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.IdentifiableStringValue;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Facelet Taglib Tag Attribute</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibTagAttributeImpl#getNameElement <em>Name Element</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibTagAttributeImpl#getRequiredElement <em>Required Element</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibTagAttributeImpl#getTypeElement <em>Type Element</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibTagAttributeImpl#getMethodSignatureElement <em>Method Signature Element</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibTagAttributeImpl#getId <em>Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibTagAttributeImpl#getName <em>Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibTagAttributeImpl#isRequired <em>Required</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibTagAttributeImpl#getType <em>Type</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibTagAttributeImpl#getMethodSignature <em>Method Signature</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class FaceletTaglibTagAttributeImpl extends UserVisibleTaglibObjectImpl implements FaceletTaglibTagAttribute
-{
-    /**
-     * The cached value of the '{@link #getNameElement() <em>Name Element</em>}' containment reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getNameElement()
-     * @generated
-     * @ordered
-     */
-    protected FaceletTaglibCanonicalName nameElement;
-
-    /**
-     * The cached value of the '{@link #getRequiredElement() <em>Required Element</em>}' containment reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getRequiredElement()
-     * @generated
-     * @ordered
-     */
-    protected GenericBoolean requiredElement;
-
-    /**
-     * The cached value of the '{@link #getTypeElement() <em>Type Element</em>}' containment reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getTypeElement()
-     * @generated
-     * @ordered
-     */
-    protected FullyQualifiedClass typeElement;
-
-    /**
-     * The cached value of the '{@link #getMethodSignatureElement() <em>Method Signature Element</em>}' containment reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getMethodSignatureElement()
-     * @generated
-     * @ordered
-     */
-    protected IdentifiableStringValue methodSignatureElement;
-
-    /**
-     * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-    protected static final String ID_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-    protected String id = ID_EDEFAULT;
-
-    /**
-     * The default value of the '{@link #getName() <em>Name</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getName()
-     * @generated
-     * @ordered
-     */
-    protected static final String NAME_EDEFAULT = null;
-
-    /**
-     * The default value of the '{@link #isRequired() <em>Required</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #isRequired()
-     * @generated
-     * @ordered
-     */
-    protected static final boolean REQUIRED_EDEFAULT = false;
-
-    /**
-     * The default value of the '{@link #getType() <em>Type</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getType()
-     * @generated
-     * @ordered
-     */
-    protected static final String TYPE_EDEFAULT = null;
-
-    /**
-     * The default value of the '{@link #getMethodSignature() <em>Method Signature</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getMethodSignature()
-     * @generated
-     * @ordered
-     */
-    protected static final String METHOD_SIGNATURE_EDEFAULT = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected FaceletTaglibTagAttributeImpl()
-    {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    protected EClass eStaticClass()
-    {
-        return FaceletTaglibPackage.Literals.FACELET_TAGLIB_TAG_ATTRIBUTE;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public FaceletTaglibCanonicalName getNameElement()
-    {
-        return nameElement;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param newNameElement 
-     * @param msgs 
-     * @return the notification chain
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public NotificationChain basicSetNameElement(FaceletTaglibCanonicalName newNameElement, NotificationChain msgs)
-    {
-        FaceletTaglibCanonicalName oldNameElement = nameElement;
-        nameElement = newNameElement;
-        if (eNotificationRequired())
-        {
-            ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FaceletTaglibPackage.FACELET_TAGLIB_TAG_ATTRIBUTE__NAME_ELEMENT, oldNameElement, newNameElement);
-            if (msgs == null) msgs = notification; else msgs.add(notification);
-        }
-        return msgs;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setNameElement(FaceletTaglibCanonicalName newNameElement)
-    {
-        if (newNameElement != nameElement)
-        {
-            NotificationChain msgs = null;
-            if (nameElement != null)
-                msgs = ((InternalEObject)nameElement).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FaceletTaglibPackage.FACELET_TAGLIB_TAG_ATTRIBUTE__NAME_ELEMENT, null, msgs);
-            if (newNameElement != null)
-                msgs = ((InternalEObject)newNameElement).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FaceletTaglibPackage.FACELET_TAGLIB_TAG_ATTRIBUTE__NAME_ELEMENT, null, msgs);
-            msgs = basicSetNameElement(newNameElement, msgs);
-            if (msgs != null) msgs.dispatch();
-        }
-        else if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FaceletTaglibPackage.FACELET_TAGLIB_TAG_ATTRIBUTE__NAME_ELEMENT, newNameElement, newNameElement));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public GenericBoolean getRequiredElement()
-    {
-        return requiredElement;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param newRequiredElement 
-     * @param msgs 
-     * @return 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public NotificationChain basicSetRequiredElement(GenericBoolean newRequiredElement, NotificationChain msgs)
-    {
-        GenericBoolean oldRequiredElement = requiredElement;
-        requiredElement = newRequiredElement;
-        if (eNotificationRequired())
-        {
-            ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FaceletTaglibPackage.FACELET_TAGLIB_TAG_ATTRIBUTE__REQUIRED_ELEMENT, oldRequiredElement, newRequiredElement);
-            if (msgs == null) msgs = notification; else msgs.add(notification);
-        }
-        return msgs;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setRequiredElement(GenericBoolean newRequiredElement)
-    {
-        if (newRequiredElement != requiredElement)
-        {
-            NotificationChain msgs = null;
-            if (requiredElement != null)
-                msgs = ((InternalEObject)requiredElement).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FaceletTaglibPackage.FACELET_TAGLIB_TAG_ATTRIBUTE__REQUIRED_ELEMENT, null, msgs);
-            if (newRequiredElement != null)
-                msgs = ((InternalEObject)newRequiredElement).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FaceletTaglibPackage.FACELET_TAGLIB_TAG_ATTRIBUTE__REQUIRED_ELEMENT, null, msgs);
-            msgs = basicSetRequiredElement(newRequiredElement, msgs);
-            if (msgs != null) msgs.dispatch();
-        }
-        else if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FaceletTaglibPackage.FACELET_TAGLIB_TAG_ATTRIBUTE__REQUIRED_ELEMENT, newRequiredElement, newRequiredElement));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public FullyQualifiedClass getTypeElement()
-    {
-        return typeElement;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param newTypeElement 
-     * @param msgs 
-     * @return 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public NotificationChain basicSetTypeElement(FullyQualifiedClass newTypeElement, NotificationChain msgs)
-    {
-        FullyQualifiedClass oldTypeElement = typeElement;
-        typeElement = newTypeElement;
-        if (eNotificationRequired())
-        {
-            ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FaceletTaglibPackage.FACELET_TAGLIB_TAG_ATTRIBUTE__TYPE_ELEMENT, oldTypeElement, newTypeElement);
-            if (msgs == null) msgs = notification; else msgs.add(notification);
-        }
-        return msgs;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setTypeElement(FullyQualifiedClass newTypeElement)
-    {
-        if (newTypeElement != typeElement)
-        {
-            NotificationChain msgs = null;
-            if (typeElement != null)
-                msgs = ((InternalEObject)typeElement).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FaceletTaglibPackage.FACELET_TAGLIB_TAG_ATTRIBUTE__TYPE_ELEMENT, null, msgs);
-            if (newTypeElement != null)
-                msgs = ((InternalEObject)newTypeElement).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FaceletTaglibPackage.FACELET_TAGLIB_TAG_ATTRIBUTE__TYPE_ELEMENT, null, msgs);
-            msgs = basicSetTypeElement(newTypeElement, msgs);
-            if (msgs != null) msgs.dispatch();
-        }
-        else if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FaceletTaglibPackage.FACELET_TAGLIB_TAG_ATTRIBUTE__TYPE_ELEMENT, newTypeElement, newTypeElement));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public IdentifiableStringValue getMethodSignatureElement()
-    {
-        return methodSignatureElement;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param newMethodSignatureElement 
-     * @param msgs 
-     * @return 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public NotificationChain basicSetMethodSignatureElement(IdentifiableStringValue newMethodSignatureElement, NotificationChain msgs)
-    {
-        IdentifiableStringValue oldMethodSignatureElement = methodSignatureElement;
-        methodSignatureElement = newMethodSignatureElement;
-        if (eNotificationRequired())
-        {
-            ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FaceletTaglibPackage.FACELET_TAGLIB_TAG_ATTRIBUTE__METHOD_SIGNATURE_ELEMENT, oldMethodSignatureElement, newMethodSignatureElement);
-            if (msgs == null) msgs = notification; else msgs.add(notification);
-        }
-        return msgs;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setMethodSignatureElement(IdentifiableStringValue newMethodSignatureElement)
-    {
-        if (newMethodSignatureElement != methodSignatureElement)
-        {
-            NotificationChain msgs = null;
-            if (methodSignatureElement != null)
-                msgs = ((InternalEObject)methodSignatureElement).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FaceletTaglibPackage.FACELET_TAGLIB_TAG_ATTRIBUTE__METHOD_SIGNATURE_ELEMENT, null, msgs);
-            if (newMethodSignatureElement != null)
-                msgs = ((InternalEObject)newMethodSignatureElement).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FaceletTaglibPackage.FACELET_TAGLIB_TAG_ATTRIBUTE__METHOD_SIGNATURE_ELEMENT, null, msgs);
-            msgs = basicSetMethodSignatureElement(newMethodSignatureElement, msgs);
-            if (msgs != null) msgs.dispatch();
-        }
-        else if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FaceletTaglibPackage.FACELET_TAGLIB_TAG_ATTRIBUTE__METHOD_SIGNATURE_ELEMENT, newMethodSignatureElement, newMethodSignatureElement));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated NOT
-     */
-    public String getName()
-    {
-        return (String) Util.getSimplifiedNestedField(this, FaceletTaglibPackage.Literals.FACELET_TAGLIB_TAG_ATTRIBUTE__NAME_ELEMENT, FaceletTaglibPackage.Literals.FACELET_TAGLIB_CANONICAL_NAME__VALUE);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated NOT
-     */
-    public void setName(String newName)
-    {
-        Util.setSimplifiedNestedField(
-                this,
-                FaceletTaglibPackage.Literals.FACELET_TAGLIB_TAG_ATTRIBUTE__NAME_ELEMENT,
-                FaceletTaglibPackage.Literals.FACELET_TAGLIB_CANONICAL_NAME__VALUE,
-                newName);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated NOT
-     */
-    public boolean isRequired()
-    {
-        String requiredStr = (String) Util.getSimplifiedNestedField(this, FaceletTaglibPackage.Literals.FACELET_TAGLIB_TAG_ATTRIBUTE__REQUIRED_ELEMENT, FaceletTaglibPackage.Literals.IDENTIFIABLE_STRING_VALUE__VALUE);
-        GenericBooleanBase enumValue = GenericBooleanBase.get(requiredStr);
-        if (enumValue == GenericBooleanBase.TRUE || enumValue == GenericBooleanBase.YES)
-        {
-            return true;
-        }
-        return false;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated NOT
-     */
-    public void setRequired(boolean newRequired)
-    {
-        String newValue = newRequired ? GenericBooleanBase.TRUE.toString() : GenericBooleanBase.FALSE.toString();
-        Util.setSimplifiedNestedField(this, FaceletTaglibPackage.Literals.FACELET_TAGLIB_TAG_ATTRIBUTE__REQUIRED_ELEMENT, FaceletTaglibPackage.Literals.IDENTIFIABLE_STRING_VALUE__VALUE, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated NOT
-     */
-    public String getType()
-    {
-        return (String) Util.getSimplifiedNestedField(this, FaceletTaglibPackage.Literals.FACELET_TAGLIB_TAG_ATTRIBUTE__TYPE_ELEMENT, FaceletTaglibPackage.Literals.IDENTIFIABLE_STRING_VALUE__VALUE);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated NOT
-     */
-    public void setType(String newType)
-    {
-        Util.setSimplifiedNestedField(this, FaceletTaglibPackage.Literals.FACELET_TAGLIB_TAG_ATTRIBUTE__TYPE_ELEMENT, FaceletTaglibPackage.Literals.IDENTIFIABLE_STRING_VALUE__VALUE, newType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated NOT
-     */
-    public String getMethodSignature()
-    {
-        return (String) Util.getSimplifiedNestedField(this, FaceletTaglibPackage.Literals.FACELET_TAGLIB_TAG_ATTRIBUTE__METHOD_SIGNATURE_ELEMENT, FaceletTaglibPackage.Literals.IDENTIFIABLE_STRING_VALUE__VALUE);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated NOT
-     */
-    public void setMethodSignature(String newMethodSignature)
-    {
-        Util.setSimplifiedNestedField(this, FaceletTaglibPackage.Literals.FACELET_TAGLIB_TAG_ATTRIBUTE__METHOD_SIGNATURE_ELEMENT, FaceletTaglibPackage.Literals.IDENTIFIABLE_STRING_VALUE__VALUE, newMethodSignature);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String getId()
-    {
-        return id;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setId(String newId)
-    {
-        String oldId = id;
-        id = newId;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FaceletTaglibPackage.FACELET_TAGLIB_TAG_ATTRIBUTE__ID, oldId, id));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_ATTRIBUTE__NAME_ELEMENT:
-                return basicSetNameElement(null, msgs);
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_ATTRIBUTE__REQUIRED_ELEMENT:
-                return basicSetRequiredElement(null, msgs);
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_ATTRIBUTE__TYPE_ELEMENT:
-                return basicSetTypeElement(null, msgs);
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_ATTRIBUTE__METHOD_SIGNATURE_ELEMENT:
-                return basicSetMethodSignatureElement(null, msgs);
-        }
-        return super.eInverseRemove(otherEnd, featureID, msgs);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @SuppressWarnings("boxing")
-    @Override
-    public Object eGet(int featureID, boolean resolve, boolean coreType)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_ATTRIBUTE__NAME_ELEMENT:
-                return getNameElement();
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_ATTRIBUTE__REQUIRED_ELEMENT:
-                return getRequiredElement();
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_ATTRIBUTE__TYPE_ELEMENT:
-                return getTypeElement();
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_ATTRIBUTE__METHOD_SIGNATURE_ELEMENT:
-                return getMethodSignatureElement();
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_ATTRIBUTE__ID:
-                return getId();
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_ATTRIBUTE__NAME:
-                return getName();
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_ATTRIBUTE__REQUIRED:
-                return isRequired();
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_ATTRIBUTE__TYPE:
-                return getType();
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_ATTRIBUTE__METHOD_SIGNATURE:
-                return getMethodSignature();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @SuppressWarnings({ "unchecked", "boxing" })
-    @Override
-    public void eSet(int featureID, Object newValue)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_ATTRIBUTE__NAME_ELEMENT:
-                setNameElement((FaceletTaglibCanonicalName)newValue);
-                return;
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_ATTRIBUTE__REQUIRED_ELEMENT:
-                setRequiredElement((GenericBoolean)newValue);
-                return;
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_ATTRIBUTE__TYPE_ELEMENT:
-                setTypeElement((FullyQualifiedClass)newValue);
-                return;
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_ATTRIBUTE__METHOD_SIGNATURE_ELEMENT:
-                setMethodSignatureElement((IdentifiableStringValue)newValue);
-                return;
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_ATTRIBUTE__ID:
-                setId((String)newValue);
-                return;
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_ATTRIBUTE__NAME:
-                setName((String)newValue);
-                return;
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_ATTRIBUTE__REQUIRED:
-                setRequired((Boolean)newValue);
-                return;
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_ATTRIBUTE__TYPE:
-                setType((String)newValue);
-                return;
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_ATTRIBUTE__METHOD_SIGNATURE:
-                setMethodSignature((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public void eUnset(int featureID)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_ATTRIBUTE__NAME_ELEMENT:
-                setNameElement((FaceletTaglibCanonicalName)null);
-                return;
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_ATTRIBUTE__REQUIRED_ELEMENT:
-                setRequiredElement((GenericBoolean)null);
-                return;
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_ATTRIBUTE__TYPE_ELEMENT:
-                setTypeElement((FullyQualifiedClass)null);
-                return;
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_ATTRIBUTE__METHOD_SIGNATURE_ELEMENT:
-                setMethodSignatureElement((IdentifiableStringValue)null);
-                return;
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_ATTRIBUTE__ID:
-                setId(ID_EDEFAULT);
-                return;
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_ATTRIBUTE__NAME:
-                setName(NAME_EDEFAULT);
-                return;
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_ATTRIBUTE__REQUIRED:
-                setRequired(REQUIRED_EDEFAULT);
-                return;
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_ATTRIBUTE__TYPE:
-                setType(TYPE_EDEFAULT);
-                return;
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_ATTRIBUTE__METHOD_SIGNATURE:
-                setMethodSignature(METHOD_SIGNATURE_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public boolean eIsSet(int featureID)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_ATTRIBUTE__NAME_ELEMENT:
-                return nameElement != null;
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_ATTRIBUTE__REQUIRED_ELEMENT:
-                return requiredElement != null;
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_ATTRIBUTE__TYPE_ELEMENT:
-                return typeElement != null;
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_ATTRIBUTE__METHOD_SIGNATURE_ELEMENT:
-                return methodSignatureElement != null;
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_ATTRIBUTE__ID:
-                return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_ATTRIBUTE__NAME:
-                return NAME_EDEFAULT == null ? getName() != null : !NAME_EDEFAULT.equals(getName());
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_ATTRIBUTE__REQUIRED:
-                return isRequired() != REQUIRED_EDEFAULT;
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_ATTRIBUTE__TYPE:
-                return TYPE_EDEFAULT == null ? getType() != null : !TYPE_EDEFAULT.equals(getType());
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_ATTRIBUTE__METHOD_SIGNATURE:
-                return METHOD_SIGNATURE_EDEFAULT == null ? getMethodSignature() != null : !METHOD_SIGNATURE_EDEFAULT.equals(getMethodSignature());
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public String toString()
-    {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (id: "); //$NON-NLS-1$
-        result.append(id);
-        result.append(')');
-        return result.toString();
-    }
-
-} //FaceletTaglibTagAttributeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/impl/FaceletTaglibTagBehaviorExtensionImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/impl/FaceletTaglibTagBehaviorExtensionImpl.java
deleted file mode 100644
index b933999..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/impl/FaceletTaglibTagBehaviorExtensionImpl.java
+++ /dev/null
@@ -1,237 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: FaceletTaglibTagBehaviorExtensionImpl.java,v 1.1 2010/03/18 06:24:37 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.BasicFeatureMap;
-import org.eclipse.emf.ecore.util.FeatureMap;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagBehaviorExtension;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Facelet Taglib Tag Behavior Extension</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibTagBehaviorExtensionImpl#getAny <em>Any</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibTagBehaviorExtensionImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class FaceletTaglibTagBehaviorExtensionImpl extends EObjectImpl implements FaceletTaglibTagBehaviorExtension
-{
-    /**
-     * The cached value of the '{@link #getAny() <em>Any</em>}' attribute list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getAny()
-     * @generated
-     * @ordered
-     */
-    protected FeatureMap any;
-
-    /**
-     * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-    protected static final String ID_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-    protected String id = ID_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected FaceletTaglibTagBehaviorExtensionImpl()
-    {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    protected EClass eStaticClass()
-    {
-        return FaceletTaglibPackage.Literals.FACELET_TAGLIB_TAG_BEHAVIOR_EXTENSION;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public FeatureMap getAny()
-    {
-        if (any == null)
-        {
-            any = new BasicFeatureMap(this, FaceletTaglibPackage.FACELET_TAGLIB_TAG_BEHAVIOR_EXTENSION__ANY);
-        }
-        return any;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String getId()
-    {
-        return id;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setId(String newId)
-    {
-        String oldId = id;
-        id = newId;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FaceletTaglibPackage.FACELET_TAGLIB_TAG_BEHAVIOR_EXTENSION__ID, oldId, id));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_BEHAVIOR_EXTENSION__ANY:
-                return ((InternalEList<?>)getAny()).basicRemove(otherEnd, msgs);
-        }
-        return super.eInverseRemove(otherEnd, featureID, msgs);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public Object eGet(int featureID, boolean resolve, boolean coreType)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_BEHAVIOR_EXTENSION__ANY:
-                if (coreType) return getAny();
-                return ((FeatureMap.Internal)getAny()).getWrapper();
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_BEHAVIOR_EXTENSION__ID:
-                return getId();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public void eSet(int featureID, Object newValue)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_BEHAVIOR_EXTENSION__ANY:
-                ((FeatureMap.Internal)getAny()).set(newValue);
-                return;
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_BEHAVIOR_EXTENSION__ID:
-                setId((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public void eUnset(int featureID)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_BEHAVIOR_EXTENSION__ANY:
-                getAny().clear();
-                return;
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_BEHAVIOR_EXTENSION__ID:
-                setId(ID_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public boolean eIsSet(int featureID)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_BEHAVIOR_EXTENSION__ANY:
-                return any != null && !any.isEmpty();
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_BEHAVIOR_EXTENSION__ID:
-                return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public String toString()
-    {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (any: "); //$NON-NLS-1$
-        result.append(any);
-        result.append(", id: "); //$NON-NLS-1$
-        result.append(id);
-        result.append(')');
-        return result.toString();
-    }
-
-} //FaceletTaglibTagBehaviorExtensionImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/impl/FaceletTaglibTagBehaviorImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/impl/FaceletTaglibTagBehaviorImpl.java
deleted file mode 100644
index dc23e00..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/impl/FaceletTaglibTagBehaviorImpl.java
+++ /dev/null
@@ -1,317 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: FaceletTaglibTagBehaviorImpl.java,v 1.1 2010/03/18 06:24:38 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagBehavior;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagBehaviorExtension;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FullyQualifiedClass;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.IdentifiableStringValue;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Facelet Taglib Tag Behavior</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibTagBehaviorImpl#getBehaviorId <em>Behavior Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibTagBehaviorImpl#getHandlerClass <em>Handler Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibTagBehaviorImpl#getBehaviorExtension <em>Behavior Extension</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class FaceletTaglibTagBehaviorImpl extends UserVisibleTaglibObjectImpl implements FaceletTaglibTagBehavior
-{
-    /**
-     * The cached value of the '{@link #getBehaviorId() <em>Behavior Id</em>}' containment reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getBehaviorId()
-     * @generated
-     * @ordered
-     */
-    protected IdentifiableStringValue behaviorId;
-
-    /**
-     * The cached value of the '{@link #getHandlerClass() <em>Handler Class</em>}' containment reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getHandlerClass()
-     * @generated
-     * @ordered
-     */
-    protected FullyQualifiedClass handlerClass;
-
-    /**
-     * The cached value of the '{@link #getBehaviorExtension() <em>Behavior Extension</em>}' containment reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getBehaviorExtension()
-     * @generated
-     * @ordered
-     */
-    protected EList<FaceletTaglibTagBehaviorExtension> behaviorExtension;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected FaceletTaglibTagBehaviorImpl()
-    {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    protected EClass eStaticClass()
-    {
-        return FaceletTaglibPackage.Literals.FACELET_TAGLIB_TAG_BEHAVIOR;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public IdentifiableStringValue getBehaviorId()
-    {
-        return behaviorId;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param newBehaviorId 
-     * @param msgs 
-     * @return the notification chain
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public NotificationChain basicSetBehaviorId(IdentifiableStringValue newBehaviorId, NotificationChain msgs)
-    {
-        IdentifiableStringValue oldBehaviorId = behaviorId;
-        behaviorId = newBehaviorId;
-        if (eNotificationRequired())
-        {
-            ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FaceletTaglibPackage.FACELET_TAGLIB_TAG_BEHAVIOR__BEHAVIOR_ID, oldBehaviorId, newBehaviorId);
-            if (msgs == null) msgs = notification; else msgs.add(notification);
-        }
-        return msgs;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setBehaviorId(IdentifiableStringValue newBehaviorId)
-    {
-        if (newBehaviorId != behaviorId)
-        {
-            NotificationChain msgs = null;
-            if (behaviorId != null)
-                msgs = ((InternalEObject)behaviorId).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FaceletTaglibPackage.FACELET_TAGLIB_TAG_BEHAVIOR__BEHAVIOR_ID, null, msgs);
-            if (newBehaviorId != null)
-                msgs = ((InternalEObject)newBehaviorId).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FaceletTaglibPackage.FACELET_TAGLIB_TAG_BEHAVIOR__BEHAVIOR_ID, null, msgs);
-            msgs = basicSetBehaviorId(newBehaviorId, msgs);
-            if (msgs != null) msgs.dispatch();
-        }
-        else if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FaceletTaglibPackage.FACELET_TAGLIB_TAG_BEHAVIOR__BEHAVIOR_ID, newBehaviorId, newBehaviorId));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public FullyQualifiedClass getHandlerClass()
-    {
-        return handlerClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param newHandlerClass 
-     * @param msgs 
-     * @return the notification chain
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public NotificationChain basicSetHandlerClass(FullyQualifiedClass newHandlerClass, NotificationChain msgs)
-    {
-        FullyQualifiedClass oldHandlerClass = handlerClass;
-        handlerClass = newHandlerClass;
-        if (eNotificationRequired())
-        {
-            ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FaceletTaglibPackage.FACELET_TAGLIB_TAG_BEHAVIOR__HANDLER_CLASS, oldHandlerClass, newHandlerClass);
-            if (msgs == null) msgs = notification; else msgs.add(notification);
-        }
-        return msgs;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setHandlerClass(FullyQualifiedClass newHandlerClass)
-    {
-        if (newHandlerClass != handlerClass)
-        {
-            NotificationChain msgs = null;
-            if (handlerClass != null)
-                msgs = ((InternalEObject)handlerClass).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FaceletTaglibPackage.FACELET_TAGLIB_TAG_BEHAVIOR__HANDLER_CLASS, null, msgs);
-            if (newHandlerClass != null)
-                msgs = ((InternalEObject)newHandlerClass).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FaceletTaglibPackage.FACELET_TAGLIB_TAG_BEHAVIOR__HANDLER_CLASS, null, msgs);
-            msgs = basicSetHandlerClass(newHandlerClass, msgs);
-            if (msgs != null) msgs.dispatch();
-        }
-        else if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FaceletTaglibPackage.FACELET_TAGLIB_TAG_BEHAVIOR__HANDLER_CLASS, newHandlerClass, newHandlerClass));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EList<FaceletTaglibTagBehaviorExtension> getBehaviorExtension()
-    {
-        if (behaviorExtension == null)
-        {
-            behaviorExtension = new EObjectContainmentEList<FaceletTaglibTagBehaviorExtension>(FaceletTaglibTagBehaviorExtension.class, this, FaceletTaglibPackage.FACELET_TAGLIB_TAG_BEHAVIOR__BEHAVIOR_EXTENSION);
-        }
-        return behaviorExtension;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_BEHAVIOR__BEHAVIOR_ID:
-                return basicSetBehaviorId(null, msgs);
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_BEHAVIOR__HANDLER_CLASS:
-                return basicSetHandlerClass(null, msgs);
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_BEHAVIOR__BEHAVIOR_EXTENSION:
-                return ((InternalEList<?>)getBehaviorExtension()).basicRemove(otherEnd, msgs);
-        }
-        return super.eInverseRemove(otherEnd, featureID, msgs);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public Object eGet(int featureID, boolean resolve, boolean coreType)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_BEHAVIOR__BEHAVIOR_ID:
-                return getBehaviorId();
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_BEHAVIOR__HANDLER_CLASS:
-                return getHandlerClass();
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_BEHAVIOR__BEHAVIOR_EXTENSION:
-                return getBehaviorExtension();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @SuppressWarnings("unchecked")
-    @Override
-    public void eSet(int featureID, Object newValue)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_BEHAVIOR__BEHAVIOR_ID:
-                setBehaviorId((IdentifiableStringValue)newValue);
-                return;
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_BEHAVIOR__HANDLER_CLASS:
-                setHandlerClass((FullyQualifiedClass)newValue);
-                return;
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_BEHAVIOR__BEHAVIOR_EXTENSION:
-                getBehaviorExtension().clear();
-                getBehaviorExtension().addAll((Collection<? extends FaceletTaglibTagBehaviorExtension>)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public void eUnset(int featureID)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_BEHAVIOR__BEHAVIOR_ID:
-                setBehaviorId((IdentifiableStringValue)null);
-                return;
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_BEHAVIOR__HANDLER_CLASS:
-                setHandlerClass((FullyQualifiedClass)null);
-                return;
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_BEHAVIOR__BEHAVIOR_EXTENSION:
-                getBehaviorExtension().clear();
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public boolean eIsSet(int featureID)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_BEHAVIOR__BEHAVIOR_ID:
-                return behaviorId != null;
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_BEHAVIOR__HANDLER_CLASS:
-                return handlerClass != null;
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_BEHAVIOR__BEHAVIOR_EXTENSION:
-                return behaviorExtension != null && !behaviorExtension.isEmpty();
-        }
-        return super.eIsSet(featureID);
-    }
-
-} //FaceletTaglibTagBehaviorImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/impl/FaceletTaglibTagComponentExtensionImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/impl/FaceletTaglibTagComponentExtensionImpl.java
deleted file mode 100644
index 5366ec2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/impl/FaceletTaglibTagComponentExtensionImpl.java
+++ /dev/null
@@ -1,237 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: FaceletTaglibTagComponentExtensionImpl.java,v 1.1 2010/03/18 06:24:39 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.BasicFeatureMap;
-import org.eclipse.emf.ecore.util.FeatureMap;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagComponentExtension;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Facelet Taglib Tag Component Extension</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibTagComponentExtensionImpl#getAny <em>Any</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibTagComponentExtensionImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class FaceletTaglibTagComponentExtensionImpl extends EObjectImpl implements FaceletTaglibTagComponentExtension
-{
-    /**
-     * The cached value of the '{@link #getAny() <em>Any</em>}' attribute list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getAny()
-     * @generated
-     * @ordered
-     */
-    protected FeatureMap any;
-
-    /**
-     * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-    protected static final String ID_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-    protected String id = ID_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected FaceletTaglibTagComponentExtensionImpl()
-    {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    protected EClass eStaticClass()
-    {
-        return FaceletTaglibPackage.Literals.FACELET_TAGLIB_TAG_COMPONENT_EXTENSION;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public FeatureMap getAny()
-    {
-        if (any == null)
-        {
-            any = new BasicFeatureMap(this, FaceletTaglibPackage.FACELET_TAGLIB_TAG_COMPONENT_EXTENSION__ANY);
-        }
-        return any;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String getId()
-    {
-        return id;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setId(String newId)
-    {
-        String oldId = id;
-        id = newId;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FaceletTaglibPackage.FACELET_TAGLIB_TAG_COMPONENT_EXTENSION__ID, oldId, id));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_COMPONENT_EXTENSION__ANY:
-                return ((InternalEList<?>)getAny()).basicRemove(otherEnd, msgs);
-        }
-        return super.eInverseRemove(otherEnd, featureID, msgs);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public Object eGet(int featureID, boolean resolve, boolean coreType)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_COMPONENT_EXTENSION__ANY:
-                if (coreType) return getAny();
-                return ((FeatureMap.Internal)getAny()).getWrapper();
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_COMPONENT_EXTENSION__ID:
-                return getId();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public void eSet(int featureID, Object newValue)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_COMPONENT_EXTENSION__ANY:
-                ((FeatureMap.Internal)getAny()).set(newValue);
-                return;
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_COMPONENT_EXTENSION__ID:
-                setId((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public void eUnset(int featureID)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_COMPONENT_EXTENSION__ANY:
-                getAny().clear();
-                return;
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_COMPONENT_EXTENSION__ID:
-                setId(ID_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public boolean eIsSet(int featureID)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_COMPONENT_EXTENSION__ANY:
-                return any != null && !any.isEmpty();
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_COMPONENT_EXTENSION__ID:
-                return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public String toString()
-    {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (any: "); //$NON-NLS-1$
-        result.append(any);
-        result.append(", id: "); //$NON-NLS-1$
-        result.append(id);
-        result.append(')');
-        return result.toString();
-    }
-
-} //FaceletTaglibTagComponentExtensionImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/impl/FaceletTaglibTagComponentImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/impl/FaceletTaglibTagComponentImpl.java
deleted file mode 100644
index e1f86ff..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/impl/FaceletTaglibTagComponentImpl.java
+++ /dev/null
@@ -1,391 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: FaceletTaglibTagComponentImpl.java,v 1.1 2010/03/18 06:24:39 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagComponent;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagComponentExtension;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FullyQualifiedClass;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.IdentifiableStringValue;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Facelet Taglib Tag Component</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibTagComponentImpl#getComponentType <em>Component Type</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibTagComponentImpl#getRendererType <em>Renderer Type</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibTagComponentImpl#getHandlerClass <em>Handler Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibTagComponentImpl#getComponentExtension <em>Component Extension</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class FaceletTaglibTagComponentImpl extends UserVisibleTaglibObjectImpl implements FaceletTaglibTagComponent
-{
-    /**
-     * The cached value of the '{@link #getComponentType() <em>Component Type</em>}' containment reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getComponentType()
-     * @generated
-     * @ordered
-     */
-    protected IdentifiableStringValue componentType;
-
-    /**
-     * The cached value of the '{@link #getRendererType() <em>Renderer Type</em>}' containment reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getRendererType()
-     * @generated
-     * @ordered
-     */
-    protected IdentifiableStringValue rendererType;
-
-    /**
-     * The cached value of the '{@link #getHandlerClass() <em>Handler Class</em>}' containment reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getHandlerClass()
-     * @generated
-     * @ordered
-     */
-    protected FullyQualifiedClass handlerClass;
-
-    /**
-     * The cached value of the '{@link #getComponentExtension() <em>Component Extension</em>}' containment reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getComponentExtension()
-     * @generated
-     * @ordered
-     */
-    protected EList<FaceletTaglibTagComponentExtension> componentExtension;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected FaceletTaglibTagComponentImpl()
-    {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    protected EClass eStaticClass()
-    {
-        return FaceletTaglibPackage.Literals.FACELET_TAGLIB_TAG_COMPONENT;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public IdentifiableStringValue getComponentType()
-    {
-        return componentType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param newComponentType 
-     * @param msgs 
-     * @return the notification chain
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public NotificationChain basicSetComponentType(IdentifiableStringValue newComponentType, NotificationChain msgs)
-    {
-        IdentifiableStringValue oldComponentType = componentType;
-        componentType = newComponentType;
-        if (eNotificationRequired())
-        {
-            ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FaceletTaglibPackage.FACELET_TAGLIB_TAG_COMPONENT__COMPONENT_TYPE, oldComponentType, newComponentType);
-            if (msgs == null) msgs = notification; else msgs.add(notification);
-        }
-        return msgs;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setComponentType(IdentifiableStringValue newComponentType)
-    {
-        if (newComponentType != componentType)
-        {
-            NotificationChain msgs = null;
-            if (componentType != null)
-                msgs = ((InternalEObject)componentType).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FaceletTaglibPackage.FACELET_TAGLIB_TAG_COMPONENT__COMPONENT_TYPE, null, msgs);
-            if (newComponentType != null)
-                msgs = ((InternalEObject)newComponentType).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FaceletTaglibPackage.FACELET_TAGLIB_TAG_COMPONENT__COMPONENT_TYPE, null, msgs);
-            msgs = basicSetComponentType(newComponentType, msgs);
-            if (msgs != null) msgs.dispatch();
-        }
-        else if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FaceletTaglibPackage.FACELET_TAGLIB_TAG_COMPONENT__COMPONENT_TYPE, newComponentType, newComponentType));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public IdentifiableStringValue getRendererType()
-    {
-        return rendererType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param newRendererType 
-     * @param msgs 
-     * @return the notification chain
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public NotificationChain basicSetRendererType(IdentifiableStringValue newRendererType, NotificationChain msgs)
-    {
-        IdentifiableStringValue oldRendererType = rendererType;
-        rendererType = newRendererType;
-        if (eNotificationRequired())
-        {
-            ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FaceletTaglibPackage.FACELET_TAGLIB_TAG_COMPONENT__RENDERER_TYPE, oldRendererType, newRendererType);
-            if (msgs == null) msgs = notification; else msgs.add(notification);
-        }
-        return msgs;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setRendererType(IdentifiableStringValue newRendererType)
-    {
-        if (newRendererType != rendererType)
-        {
-            NotificationChain msgs = null;
-            if (rendererType != null)
-                msgs = ((InternalEObject)rendererType).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FaceletTaglibPackage.FACELET_TAGLIB_TAG_COMPONENT__RENDERER_TYPE, null, msgs);
-            if (newRendererType != null)
-                msgs = ((InternalEObject)newRendererType).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FaceletTaglibPackage.FACELET_TAGLIB_TAG_COMPONENT__RENDERER_TYPE, null, msgs);
-            msgs = basicSetRendererType(newRendererType, msgs);
-            if (msgs != null) msgs.dispatch();
-        }
-        else if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FaceletTaglibPackage.FACELET_TAGLIB_TAG_COMPONENT__RENDERER_TYPE, newRendererType, newRendererType));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public FullyQualifiedClass getHandlerClass()
-    {
-        return handlerClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param newHandlerClass 
-     * @param msgs 
-     * @return the notification chain
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public NotificationChain basicSetHandlerClass(FullyQualifiedClass newHandlerClass, NotificationChain msgs)
-    {
-        FullyQualifiedClass oldHandlerClass = handlerClass;
-        handlerClass = newHandlerClass;
-        if (eNotificationRequired())
-        {
-            ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FaceletTaglibPackage.FACELET_TAGLIB_TAG_COMPONENT__HANDLER_CLASS, oldHandlerClass, newHandlerClass);
-            if (msgs == null) msgs = notification; else msgs.add(notification);
-        }
-        return msgs;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setHandlerClass(FullyQualifiedClass newHandlerClass)
-    {
-        if (newHandlerClass != handlerClass)
-        {
-            NotificationChain msgs = null;
-            if (handlerClass != null)
-                msgs = ((InternalEObject)handlerClass).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FaceletTaglibPackage.FACELET_TAGLIB_TAG_COMPONENT__HANDLER_CLASS, null, msgs);
-            if (newHandlerClass != null)
-                msgs = ((InternalEObject)newHandlerClass).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FaceletTaglibPackage.FACELET_TAGLIB_TAG_COMPONENT__HANDLER_CLASS, null, msgs);
-            msgs = basicSetHandlerClass(newHandlerClass, msgs);
-            if (msgs != null) msgs.dispatch();
-        }
-        else if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FaceletTaglibPackage.FACELET_TAGLIB_TAG_COMPONENT__HANDLER_CLASS, newHandlerClass, newHandlerClass));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EList<FaceletTaglibTagComponentExtension> getComponentExtension()
-    {
-        if (componentExtension == null)
-        {
-            componentExtension = new EObjectContainmentEList<FaceletTaglibTagComponentExtension>(FaceletTaglibTagComponentExtension.class, this, FaceletTaglibPackage.FACELET_TAGLIB_TAG_COMPONENT__COMPONENT_EXTENSION);
-        }
-        return componentExtension;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_COMPONENT__COMPONENT_TYPE:
-                return basicSetComponentType(null, msgs);
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_COMPONENT__RENDERER_TYPE:
-                return basicSetRendererType(null, msgs);
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_COMPONENT__HANDLER_CLASS:
-                return basicSetHandlerClass(null, msgs);
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_COMPONENT__COMPONENT_EXTENSION:
-                return ((InternalEList<?>)getComponentExtension()).basicRemove(otherEnd, msgs);
-        }
-        return super.eInverseRemove(otherEnd, featureID, msgs);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public Object eGet(int featureID, boolean resolve, boolean coreType)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_COMPONENT__COMPONENT_TYPE:
-                return getComponentType();
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_COMPONENT__RENDERER_TYPE:
-                return getRendererType();
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_COMPONENT__HANDLER_CLASS:
-                return getHandlerClass();
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_COMPONENT__COMPONENT_EXTENSION:
-                return getComponentExtension();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @SuppressWarnings("unchecked")
-    @Override
-    public void eSet(int featureID, Object newValue)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_COMPONENT__COMPONENT_TYPE:
-                setComponentType((IdentifiableStringValue)newValue);
-                return;
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_COMPONENT__RENDERER_TYPE:
-                setRendererType((IdentifiableStringValue)newValue);
-                return;
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_COMPONENT__HANDLER_CLASS:
-                setHandlerClass((FullyQualifiedClass)newValue);
-                return;
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_COMPONENT__COMPONENT_EXTENSION:
-                getComponentExtension().clear();
-                getComponentExtension().addAll((Collection<? extends FaceletTaglibTagComponentExtension>)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public void eUnset(int featureID)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_COMPONENT__COMPONENT_TYPE:
-                setComponentType((IdentifiableStringValue)null);
-                return;
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_COMPONENT__RENDERER_TYPE:
-                setRendererType((IdentifiableStringValue)null);
-                return;
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_COMPONENT__HANDLER_CLASS:
-                setHandlerClass((FullyQualifiedClass)null);
-                return;
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_COMPONENT__COMPONENT_EXTENSION:
-                getComponentExtension().clear();
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public boolean eIsSet(int featureID)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_COMPONENT__COMPONENT_TYPE:
-                return componentType != null;
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_COMPONENT__RENDERER_TYPE:
-                return rendererType != null;
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_COMPONENT__HANDLER_CLASS:
-                return handlerClass != null;
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_COMPONENT__COMPONENT_EXTENSION:
-                return componentExtension != null && !componentExtension.isEmpty();
-        }
-        return super.eIsSet(featureID);
-    }
-
-} //FaceletTaglibTagComponentImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/impl/FaceletTaglibTagConverterExtensionImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/impl/FaceletTaglibTagConverterExtensionImpl.java
deleted file mode 100644
index 454af8f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/impl/FaceletTaglibTagConverterExtensionImpl.java
+++ /dev/null
@@ -1,237 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: FaceletTaglibTagConverterExtensionImpl.java,v 1.1 2010/03/18 06:24:38 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.BasicFeatureMap;
-import org.eclipse.emf.ecore.util.FeatureMap;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagConverterExtension;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Facelet Taglib Tag Converter Extension</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibTagConverterExtensionImpl#getAny <em>Any</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibTagConverterExtensionImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class FaceletTaglibTagConverterExtensionImpl extends EObjectImpl implements FaceletTaglibTagConverterExtension
-{
-    /**
-     * The cached value of the '{@link #getAny() <em>Any</em>}' attribute list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getAny()
-     * @generated
-     * @ordered
-     */
-    protected FeatureMap any;
-
-    /**
-     * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-    protected static final String ID_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-    protected String id = ID_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected FaceletTaglibTagConverterExtensionImpl()
-    {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    protected EClass eStaticClass()
-    {
-        return FaceletTaglibPackage.Literals.FACELET_TAGLIB_TAG_CONVERTER_EXTENSION;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public FeatureMap getAny()
-    {
-        if (any == null)
-        {
-            any = new BasicFeatureMap(this, FaceletTaglibPackage.FACELET_TAGLIB_TAG_CONVERTER_EXTENSION__ANY);
-        }
-        return any;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String getId()
-    {
-        return id;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setId(String newId)
-    {
-        String oldId = id;
-        id = newId;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FaceletTaglibPackage.FACELET_TAGLIB_TAG_CONVERTER_EXTENSION__ID, oldId, id));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_CONVERTER_EXTENSION__ANY:
-                return ((InternalEList<?>)getAny()).basicRemove(otherEnd, msgs);
-        }
-        return super.eInverseRemove(otherEnd, featureID, msgs);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public Object eGet(int featureID, boolean resolve, boolean coreType)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_CONVERTER_EXTENSION__ANY:
-                if (coreType) return getAny();
-                return ((FeatureMap.Internal)getAny()).getWrapper();
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_CONVERTER_EXTENSION__ID:
-                return getId();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public void eSet(int featureID, Object newValue)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_CONVERTER_EXTENSION__ANY:
-                ((FeatureMap.Internal)getAny()).set(newValue);
-                return;
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_CONVERTER_EXTENSION__ID:
-                setId((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public void eUnset(int featureID)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_CONVERTER_EXTENSION__ANY:
-                getAny().clear();
-                return;
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_CONVERTER_EXTENSION__ID:
-                setId(ID_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public boolean eIsSet(int featureID)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_CONVERTER_EXTENSION__ANY:
-                return any != null && !any.isEmpty();
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_CONVERTER_EXTENSION__ID:
-                return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public String toString()
-    {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (any: "); //$NON-NLS-1$
-        result.append(any);
-        result.append(", id: "); //$NON-NLS-1$
-        result.append(id);
-        result.append(')');
-        return result.toString();
-    }
-
-} //FaceletTaglibTagConverterExtensionImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/impl/FaceletTaglibTagConverterImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/impl/FaceletTaglibTagConverterImpl.java
deleted file mode 100644
index dc62580..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/impl/FaceletTaglibTagConverterImpl.java
+++ /dev/null
@@ -1,317 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: FaceletTaglibTagConverterImpl.java,v 1.1 2010/03/18 06:24:38 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagConverter;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagConverterExtension;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FullyQualifiedClass;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.IdentifiableStringValue;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Facelet Taglib Tag Converter</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibTagConverterImpl#getConverterId <em>Converter Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibTagConverterImpl#getHandlerClass <em>Handler Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibTagConverterImpl#getConverterExtension <em>Converter Extension</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class FaceletTaglibTagConverterImpl extends UserVisibleTaglibObjectImpl implements FaceletTaglibTagConverter
-{
-    /**
-     * The cached value of the '{@link #getConverterId() <em>Converter Id</em>}' containment reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getConverterId()
-     * @generated
-     * @ordered
-     */
-    protected IdentifiableStringValue converterId;
-
-    /**
-     * The cached value of the '{@link #getHandlerClass() <em>Handler Class</em>}' containment reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getHandlerClass()
-     * @generated
-     * @ordered
-     */
-    protected FullyQualifiedClass handlerClass;
-
-    /**
-     * The cached value of the '{@link #getConverterExtension() <em>Converter Extension</em>}' containment reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getConverterExtension()
-     * @generated
-     * @ordered
-     */
-    protected EList<FaceletTaglibTagConverterExtension> converterExtension;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected FaceletTaglibTagConverterImpl()
-    {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    protected EClass eStaticClass()
-    {
-        return FaceletTaglibPackage.Literals.FACELET_TAGLIB_TAG_CONVERTER;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public IdentifiableStringValue getConverterId()
-    {
-        return converterId;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param newConverterId 
-     * @param msgs 
-     * @return the notification chain
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public NotificationChain basicSetConverterId(IdentifiableStringValue newConverterId, NotificationChain msgs)
-    {
-        IdentifiableStringValue oldConverterId = converterId;
-        converterId = newConverterId;
-        if (eNotificationRequired())
-        {
-            ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FaceletTaglibPackage.FACELET_TAGLIB_TAG_CONVERTER__CONVERTER_ID, oldConverterId, newConverterId);
-            if (msgs == null) msgs = notification; else msgs.add(notification);
-        }
-        return msgs;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setConverterId(IdentifiableStringValue newConverterId)
-    {
-        if (newConverterId != converterId)
-        {
-            NotificationChain msgs = null;
-            if (converterId != null)
-                msgs = ((InternalEObject)converterId).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FaceletTaglibPackage.FACELET_TAGLIB_TAG_CONVERTER__CONVERTER_ID, null, msgs);
-            if (newConverterId != null)
-                msgs = ((InternalEObject)newConverterId).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FaceletTaglibPackage.FACELET_TAGLIB_TAG_CONVERTER__CONVERTER_ID, null, msgs);
-            msgs = basicSetConverterId(newConverterId, msgs);
-            if (msgs != null) msgs.dispatch();
-        }
-        else if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FaceletTaglibPackage.FACELET_TAGLIB_TAG_CONVERTER__CONVERTER_ID, newConverterId, newConverterId));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public FullyQualifiedClass getHandlerClass()
-    {
-        return handlerClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param newHandlerClass 
-     * @param msgs 
-     * @return the notification chain
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public NotificationChain basicSetHandlerClass(FullyQualifiedClass newHandlerClass, NotificationChain msgs)
-    {
-        FullyQualifiedClass oldHandlerClass = handlerClass;
-        handlerClass = newHandlerClass;
-        if (eNotificationRequired())
-        {
-            ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FaceletTaglibPackage.FACELET_TAGLIB_TAG_CONVERTER__HANDLER_CLASS, oldHandlerClass, newHandlerClass);
-            if (msgs == null) msgs = notification; else msgs.add(notification);
-        }
-        return msgs;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setHandlerClass(FullyQualifiedClass newHandlerClass)
-    {
-        if (newHandlerClass != handlerClass)
-        {
-            NotificationChain msgs = null;
-            if (handlerClass != null)
-                msgs = ((InternalEObject)handlerClass).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FaceletTaglibPackage.FACELET_TAGLIB_TAG_CONVERTER__HANDLER_CLASS, null, msgs);
-            if (newHandlerClass != null)
-                msgs = ((InternalEObject)newHandlerClass).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FaceletTaglibPackage.FACELET_TAGLIB_TAG_CONVERTER__HANDLER_CLASS, null, msgs);
-            msgs = basicSetHandlerClass(newHandlerClass, msgs);
-            if (msgs != null) msgs.dispatch();
-        }
-        else if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FaceletTaglibPackage.FACELET_TAGLIB_TAG_CONVERTER__HANDLER_CLASS, newHandlerClass, newHandlerClass));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EList<FaceletTaglibTagConverterExtension> getConverterExtension()
-    {
-        if (converterExtension == null)
-        {
-            converterExtension = new EObjectContainmentEList<FaceletTaglibTagConverterExtension>(FaceletTaglibTagConverterExtension.class, this, FaceletTaglibPackage.FACELET_TAGLIB_TAG_CONVERTER__CONVERTER_EXTENSION);
-        }
-        return converterExtension;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_CONVERTER__CONVERTER_ID:
-                return basicSetConverterId(null, msgs);
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_CONVERTER__HANDLER_CLASS:
-                return basicSetHandlerClass(null, msgs);
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_CONVERTER__CONVERTER_EXTENSION:
-                return ((InternalEList<?>)getConverterExtension()).basicRemove(otherEnd, msgs);
-        }
-        return super.eInverseRemove(otherEnd, featureID, msgs);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public Object eGet(int featureID, boolean resolve, boolean coreType)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_CONVERTER__CONVERTER_ID:
-                return getConverterId();
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_CONVERTER__HANDLER_CLASS:
-                return getHandlerClass();
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_CONVERTER__CONVERTER_EXTENSION:
-                return getConverterExtension();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @SuppressWarnings("unchecked")
-    @Override
-    public void eSet(int featureID, Object newValue)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_CONVERTER__CONVERTER_ID:
-                setConverterId((IdentifiableStringValue)newValue);
-                return;
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_CONVERTER__HANDLER_CLASS:
-                setHandlerClass((FullyQualifiedClass)newValue);
-                return;
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_CONVERTER__CONVERTER_EXTENSION:
-                getConverterExtension().clear();
-                getConverterExtension().addAll((Collection<? extends FaceletTaglibTagConverterExtension>)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public void eUnset(int featureID)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_CONVERTER__CONVERTER_ID:
-                setConverterId((IdentifiableStringValue)null);
-                return;
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_CONVERTER__HANDLER_CLASS:
-                setHandlerClass((FullyQualifiedClass)null);
-                return;
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_CONVERTER__CONVERTER_EXTENSION:
-                getConverterExtension().clear();
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public boolean eIsSet(int featureID)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_CONVERTER__CONVERTER_ID:
-                return converterId != null;
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_CONVERTER__HANDLER_CLASS:
-                return handlerClass != null;
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_CONVERTER__CONVERTER_EXTENSION:
-                return converterExtension != null && !converterExtension.isEmpty();
-        }
-        return super.eIsSet(featureID);
-    }
-
-} //FaceletTaglibTagConverterImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/impl/FaceletTaglibTagExtensionImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/impl/FaceletTaglibTagExtensionImpl.java
deleted file mode 100644
index 1034a81..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/impl/FaceletTaglibTagExtensionImpl.java
+++ /dev/null
@@ -1,237 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: FaceletTaglibTagExtensionImpl.java,v 1.1 2010/03/18 06:24:38 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.BasicFeatureMap;
-import org.eclipse.emf.ecore.util.FeatureMap;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagExtension;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Facelet Taglib Tag Extension</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibTagExtensionImpl#getAny <em>Any</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibTagExtensionImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class FaceletTaglibTagExtensionImpl extends EObjectImpl implements FaceletTaglibTagExtension
-{
-    /**
-     * The cached value of the '{@link #getAny() <em>Any</em>}' attribute list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getAny()
-     * @generated
-     * @ordered
-     */
-    protected FeatureMap any;
-
-    /**
-     * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-    protected static final String ID_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-    protected String id = ID_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected FaceletTaglibTagExtensionImpl()
-    {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    protected EClass eStaticClass()
-    {
-        return FaceletTaglibPackage.Literals.FACELET_TAGLIB_TAG_EXTENSION;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public FeatureMap getAny()
-    {
-        if (any == null)
-        {
-            any = new BasicFeatureMap(this, FaceletTaglibPackage.FACELET_TAGLIB_TAG_EXTENSION__ANY);
-        }
-        return any;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String getId()
-    {
-        return id;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setId(String newId)
-    {
-        String oldId = id;
-        id = newId;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FaceletTaglibPackage.FACELET_TAGLIB_TAG_EXTENSION__ID, oldId, id));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_EXTENSION__ANY:
-                return ((InternalEList<?>)getAny()).basicRemove(otherEnd, msgs);
-        }
-        return super.eInverseRemove(otherEnd, featureID, msgs);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public Object eGet(int featureID, boolean resolve, boolean coreType)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_EXTENSION__ANY:
-                if (coreType) return getAny();
-                return ((FeatureMap.Internal)getAny()).getWrapper();
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_EXTENSION__ID:
-                return getId();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public void eSet(int featureID, Object newValue)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_EXTENSION__ANY:
-                ((FeatureMap.Internal)getAny()).set(newValue);
-                return;
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_EXTENSION__ID:
-                setId((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public void eUnset(int featureID)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_EXTENSION__ANY:
-                getAny().clear();
-                return;
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_EXTENSION__ID:
-                setId(ID_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public boolean eIsSet(int featureID)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_EXTENSION__ANY:
-                return any != null && !any.isEmpty();
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_EXTENSION__ID:
-                return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public String toString()
-    {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (any: "); //$NON-NLS-1$
-        result.append(any);
-        result.append(", id: "); //$NON-NLS-1$
-        result.append(id);
-        result.append(')');
-        return result.toString();
-    }
-
-} //FaceletTaglibTagExtensionImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/impl/FaceletTaglibTagImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/impl/FaceletTaglibTagImpl.java
deleted file mode 100644
index 65915c3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/impl/FaceletTaglibTagImpl.java
+++ /dev/null
@@ -1,800 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: FaceletTaglibTagImpl.java,v 1.1 2010/03/18 06:24:38 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibCanonicalName;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTag;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagAttribute;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagBehavior;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagComponent;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagConverter;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagExtension;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagValidator;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FullyQualifiedClass;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.IdentifiableStringValue;
-
-/**
- * <!-- begin-user-doc --> An implementation of the model object '
- * <em><b>Facelet Taglib Tag</b></em>'. <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibTagImpl#getTagNameElement <em>Tag Name Element</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibTagImpl#getHandlerClassElement <em>Handler Class Element</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibTagImpl#getBehavior <em>Behavior</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibTagImpl#getComponent <em>Component</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibTagImpl#getConverter <em>Converter</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibTagImpl#getValidator <em>Validator</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibTagImpl#getSource <em>Source</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibTagImpl#getAttribute <em>Attribute</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibTagImpl#getTagExtension <em>Tag Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibTagImpl#getTagName <em>Tag Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibTagImpl#getHandlerClass <em>Handler Class</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class FaceletTaglibTagImpl extends UserVisibleTaglibObjectImpl implements
-        FaceletTaglibTag
-{
-    /**
-     * The cached value of the '{@link #getTagNameElement() <em>Tag Name Element</em>}' containment reference.
-     * <!-- begin-user-doc
-     * --> <!-- end-user-doc -->
-     * @see #getTagNameElement()
-     * @generated
-     * @ordered
-     */
-    protected FaceletTaglibCanonicalName tagNameElement;
-
-    /**
-     * The cached value of the '{@link #getHandlerClassElement() <em>Handler Class Element</em>}' containment reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getHandlerClassElement()
-     * @generated
-     * @ordered
-     */
-    protected FullyQualifiedClass handlerClassElement;
-
-    /**
-     * The cached value of the '{@link #getBehavior() <em>Behavior</em>}' containment reference.
-     * <!-- begin-user-doc --> <!-- end-user-doc -->
-     * @see #getBehavior()
-     * @generated
-     * @ordered
-     */
-    protected FaceletTaglibTagBehavior behavior;
-
-    /**
-     * The cached value of the '{@link #getComponent() <em>Component</em>}' containment reference.
-     * <!-- begin-user-doc --> <!-- end-user-doc -->
-     * @see #getComponent()
-     * @generated
-     * @ordered
-     */
-    protected FaceletTaglibTagComponent component;
-
-    /**
-     * The cached value of the '{@link #getConverter() <em>Converter</em>}' containment reference.
-     * <!-- begin-user-doc --> <!-- end-user-doc -->
-     * @see #getConverter()
-     * @generated
-     * @ordered
-     */
-    protected FaceletTaglibTagConverter converter;
-
-    /**
-     * The cached value of the '{@link #getValidator() <em>Validator</em>}' containment reference.
-     * <!-- begin-user-doc --> <!-- end-user-doc -->
-     * @see #getValidator()
-     * @generated
-     * @ordered
-     */
-    protected FaceletTaglibTagValidator validator;
-
-    /**
-     * The cached value of the '{@link #getSource() <em>Source</em>}' containment reference.
-     * <!-- begin-user-doc --> <!-- end-user-doc -->
-     * @see #getSource()
-     * @generated
-     * @ordered
-     */
-    protected IdentifiableStringValue source;
-
-    /**
-     * The cached value of the '{@link #getAttribute() <em>Attribute</em>}' containment reference list.
-     * <!-- begin-user-doc --> <!-- end-user-doc -->
-     * @see #getAttribute()
-     * @generated
-     * @ordered
-     */
-    protected EList<FaceletTaglibTagAttribute> attribute;
-
-    /**
-     * The cached value of the '{@link #getTagExtension() <em>Tag Extension</em>}' containment reference list.
-     * <!-- begin-user-doc
-     * --> <!-- end-user-doc -->
-     * @see #getTagExtension()
-     * @generated
-     * @ordered
-     */
-    protected EList<FaceletTaglibTagExtension> tagExtension;
-
-    /**
-     * The default value of the '{@link #getTagName() <em>Tag Name</em>}' attribute.
-     * <!-- begin-user-doc --> <!-- end-user-doc -->
-     * @see #getTagName()
-     * @generated
-     * @ordered
-     */
-    protected static final String TAG_NAME_EDEFAULT = null;
-
-    /**
-     * The default value of the '{@link #getHandlerClass() <em>Handler Class</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getHandlerClass()
-     * @generated
-     * @ordered
-     */
-    protected static final String HANDLER_CLASS_EDEFAULT = null;
-
-    /**
-     * <!-- begin-user-doc --> <!-- end-user-doc -->
-     * @generated
-     */
-    protected FaceletTaglibTagImpl()
-    {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc --> <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    protected EClass eStaticClass()
-    {
-        return FaceletTaglibPackage.Literals.FACELET_TAGLIB_TAG;
-    }
-
-    /**
-     * <!-- begin-user-doc --> <!-- end-user-doc -->
-     * @generated
-     */
-    public FaceletTaglibCanonicalName getTagNameElement()
-    {
-        return tagNameElement;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * 
-     * @param newTagNameElement
-     * @param msgs
-     * @return the notification chain <!-- end-user-doc -->
-     * @generated
-     */
-    public NotificationChain basicSetTagNameElement(
-            FaceletTaglibCanonicalName newTagNameElement, NotificationChain msgs)
-    {
-        FaceletTaglibCanonicalName oldTagNameElement = tagNameElement;
-        tagNameElement = newTagNameElement;
-        if (eNotificationRequired())
-        {
-            ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FaceletTaglibPackage.FACELET_TAGLIB_TAG__TAG_NAME_ELEMENT, oldTagNameElement, newTagNameElement);
-            if (msgs == null) msgs = notification; else msgs.add(notification);
-        }
-        return msgs;
-    }
-
-    /**
-     * <!-- begin-user-doc --> <!-- end-user-doc -->
-     * @generated
-     */
-    public void setTagNameElement(FaceletTaglibCanonicalName newTagNameElement)
-    {
-        if (newTagNameElement != tagNameElement)
-        {
-            NotificationChain msgs = null;
-            if (tagNameElement != null)
-                msgs = ((InternalEObject)tagNameElement).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FaceletTaglibPackage.FACELET_TAGLIB_TAG__TAG_NAME_ELEMENT, null, msgs);
-            if (newTagNameElement != null)
-                msgs = ((InternalEObject)newTagNameElement).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FaceletTaglibPackage.FACELET_TAGLIB_TAG__TAG_NAME_ELEMENT, null, msgs);
-            msgs = basicSetTagNameElement(newTagNameElement, msgs);
-            if (msgs != null) msgs.dispatch();
-        }
-        else if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FaceletTaglibPackage.FACELET_TAGLIB_TAG__TAG_NAME_ELEMENT, newTagNameElement, newTagNameElement));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public FullyQualifiedClass getHandlerClassElement()
-    {
-        return handlerClassElement;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param newHandlerClassElement 
-     * @param msgs 
-     * @return 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public NotificationChain basicSetHandlerClassElement(FullyQualifiedClass newHandlerClassElement, NotificationChain msgs)
-    {
-        FullyQualifiedClass oldHandlerClassElement = handlerClassElement;
-        handlerClassElement = newHandlerClassElement;
-        if (eNotificationRequired())
-        {
-            ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FaceletTaglibPackage.FACELET_TAGLIB_TAG__HANDLER_CLASS_ELEMENT, oldHandlerClassElement, newHandlerClassElement);
-            if (msgs == null) msgs = notification; else msgs.add(notification);
-        }
-        return msgs;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setHandlerClassElement(FullyQualifiedClass newHandlerClassElement)
-    {
-        if (newHandlerClassElement != handlerClassElement)
-        {
-            NotificationChain msgs = null;
-            if (handlerClassElement != null)
-                msgs = ((InternalEObject)handlerClassElement).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FaceletTaglibPackage.FACELET_TAGLIB_TAG__HANDLER_CLASS_ELEMENT, null, msgs);
-            if (newHandlerClassElement != null)
-                msgs = ((InternalEObject)newHandlerClassElement).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FaceletTaglibPackage.FACELET_TAGLIB_TAG__HANDLER_CLASS_ELEMENT, null, msgs);
-            msgs = basicSetHandlerClassElement(newHandlerClassElement, msgs);
-            if (msgs != null) msgs.dispatch();
-        }
-        else if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FaceletTaglibPackage.FACELET_TAGLIB_TAG__HANDLER_CLASS_ELEMENT, newHandlerClassElement, newHandlerClassElement));
-    }
-
-    /**
-     * <!-- begin-user-doc --> <!-- end-user-doc -->
-     * 
-     * @generated NOT
-     */
-    public String getTagName()
-    {
-        return (String) Util.getSimplifiedNestedField(this, FaceletTaglibPackage.Literals.FACELET_TAGLIB_TAG__TAG_NAME_ELEMENT, FaceletTaglibPackage.Literals.FACELET_TAGLIB_CANONICAL_NAME__VALUE);
-    }
-
-    /**
-     * <!-- begin-user-doc --> <!-- end-user-doc -->
-     * 
-     * @generated NOT
-     */
-    public void setTagName(String newTagName)
-    {
-        Util.setSimplifiedNestedField(this, FaceletTaglibPackage.Literals.FACELET_TAGLIB_TAG__TAG_NAME_ELEMENT, FaceletTaglibPackage.Literals.FACELET_TAGLIB_CANONICAL_NAME__VALUE, newTagName);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated NOT
-     */
-    public String getHandlerClass()
-    {
-        return (String) Util
-                .getSimplifiedNestedField(
-                        this,
-                        FaceletTaglibPackage.Literals.FACELET_TAGLIB_TAG__HANDLER_CLASS_ELEMENT,
-                        FaceletTaglibPackage.Literals.IDENTIFIABLE_STRING_VALUE__VALUE);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated NOT
-     */
-    public void setHandlerClass(String newHandleClass)
-    {
-        Util.setSimplifiedNestedField(
-                this,
-                FaceletTaglibPackage.Literals.FACELET_TAGLIB_TAG__HANDLER_CLASS_ELEMENT,
-                FaceletTaglibPackage.Literals.IDENTIFIABLE_STRING_VALUE__VALUE,
-                newHandleClass);
-    }
-
-    /**
-     * <!-- begin-user-doc --> <!-- end-user-doc -->
-     * @generated
-     */
-    public FaceletTaglibTagBehavior getBehavior()
-    {
-        return behavior;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * 
-     * @param newBehavior
-     * @param msgs
-     * @return the notification chain <!-- end-user-doc -->
-     * @generated
-     */
-    public NotificationChain basicSetBehavior(
-            FaceletTaglibTagBehavior newBehavior, NotificationChain msgs)
-    {
-        FaceletTaglibTagBehavior oldBehavior = behavior;
-        behavior = newBehavior;
-        if (eNotificationRequired())
-        {
-            ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FaceletTaglibPackage.FACELET_TAGLIB_TAG__BEHAVIOR, oldBehavior, newBehavior);
-            if (msgs == null) msgs = notification; else msgs.add(notification);
-        }
-        return msgs;
-    }
-
-    /**
-     * <!-- begin-user-doc --> <!-- end-user-doc -->
-     * @generated
-     */
-    public void setBehavior(FaceletTaglibTagBehavior newBehavior)
-    {
-        if (newBehavior != behavior)
-        {
-            NotificationChain msgs = null;
-            if (behavior != null)
-                msgs = ((InternalEObject)behavior).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FaceletTaglibPackage.FACELET_TAGLIB_TAG__BEHAVIOR, null, msgs);
-            if (newBehavior != null)
-                msgs = ((InternalEObject)newBehavior).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FaceletTaglibPackage.FACELET_TAGLIB_TAG__BEHAVIOR, null, msgs);
-            msgs = basicSetBehavior(newBehavior, msgs);
-            if (msgs != null) msgs.dispatch();
-        }
-        else if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FaceletTaglibPackage.FACELET_TAGLIB_TAG__BEHAVIOR, newBehavior, newBehavior));
-    }
-
-    /**
-     * <!-- begin-user-doc --> <!-- end-user-doc -->
-     * @generated
-     */
-    public FaceletTaglibTagComponent getComponent()
-    {
-        return component;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * 
-     * @param newComponent
-     * @param msgs
-     * @return the notification chain <!-- end-user-doc -->
-     * @generated
-     */
-    public NotificationChain basicSetComponent(
-            FaceletTaglibTagComponent newComponent, NotificationChain msgs)
-    {
-        FaceletTaglibTagComponent oldComponent = component;
-        component = newComponent;
-        if (eNotificationRequired())
-        {
-            ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FaceletTaglibPackage.FACELET_TAGLIB_TAG__COMPONENT, oldComponent, newComponent);
-            if (msgs == null) msgs = notification; else msgs.add(notification);
-        }
-        return msgs;
-    }
-
-    /**
-     * <!-- begin-user-doc --> <!-- end-user-doc -->
-     * @generated
-     */
-    public void setComponent(FaceletTaglibTagComponent newComponent)
-    {
-        if (newComponent != component)
-        {
-            NotificationChain msgs = null;
-            if (component != null)
-                msgs = ((InternalEObject)component).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FaceletTaglibPackage.FACELET_TAGLIB_TAG__COMPONENT, null, msgs);
-            if (newComponent != null)
-                msgs = ((InternalEObject)newComponent).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FaceletTaglibPackage.FACELET_TAGLIB_TAG__COMPONENT, null, msgs);
-            msgs = basicSetComponent(newComponent, msgs);
-            if (msgs != null) msgs.dispatch();
-        }
-        else if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FaceletTaglibPackage.FACELET_TAGLIB_TAG__COMPONENT, newComponent, newComponent));
-    }
-
-    /**
-     * <!-- begin-user-doc --> <!-- end-user-doc -->
-     * @generated
-     */
-    public FaceletTaglibTagConverter getConverter()
-    {
-        return converter;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * 
-     * @param newConverter
-     * @param msgs
-     * @return the notification chain <!-- end-user-doc -->
-     * @generated
-     */
-    public NotificationChain basicSetConverter(
-            FaceletTaglibTagConverter newConverter, NotificationChain msgs)
-    {
-        FaceletTaglibTagConverter oldConverter = converter;
-        converter = newConverter;
-        if (eNotificationRequired())
-        {
-            ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FaceletTaglibPackage.FACELET_TAGLIB_TAG__CONVERTER, oldConverter, newConverter);
-            if (msgs == null) msgs = notification; else msgs.add(notification);
-        }
-        return msgs;
-    }
-
-    /**
-     * <!-- begin-user-doc --> <!-- end-user-doc -->
-     * @generated
-     */
-    public void setConverter(FaceletTaglibTagConverter newConverter)
-    {
-        if (newConverter != converter)
-        {
-            NotificationChain msgs = null;
-            if (converter != null)
-                msgs = ((InternalEObject)converter).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FaceletTaglibPackage.FACELET_TAGLIB_TAG__CONVERTER, null, msgs);
-            if (newConverter != null)
-                msgs = ((InternalEObject)newConverter).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FaceletTaglibPackage.FACELET_TAGLIB_TAG__CONVERTER, null, msgs);
-            msgs = basicSetConverter(newConverter, msgs);
-            if (msgs != null) msgs.dispatch();
-        }
-        else if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FaceletTaglibPackage.FACELET_TAGLIB_TAG__CONVERTER, newConverter, newConverter));
-    }
-
-    /**
-     * <!-- begin-user-doc --> <!-- end-user-doc -->
-     * @generated
-     */
-    public FaceletTaglibTagValidator getValidator()
-    {
-        return validator;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * 
-     * @param newValidator
-     * @param msgs
-     * @return the notification chain <!-- end-user-doc -->
-     * @generated
-     */
-    public NotificationChain basicSetValidator(
-            FaceletTaglibTagValidator newValidator, NotificationChain msgs)
-    {
-        FaceletTaglibTagValidator oldValidator = validator;
-        validator = newValidator;
-        if (eNotificationRequired())
-        {
-            ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FaceletTaglibPackage.FACELET_TAGLIB_TAG__VALIDATOR, oldValidator, newValidator);
-            if (msgs == null) msgs = notification; else msgs.add(notification);
-        }
-        return msgs;
-    }
-
-    /**
-     * <!-- begin-user-doc --> <!-- end-user-doc -->
-     * @generated
-     */
-    public void setValidator(FaceletTaglibTagValidator newValidator)
-    {
-        if (newValidator != validator)
-        {
-            NotificationChain msgs = null;
-            if (validator != null)
-                msgs = ((InternalEObject)validator).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FaceletTaglibPackage.FACELET_TAGLIB_TAG__VALIDATOR, null, msgs);
-            if (newValidator != null)
-                msgs = ((InternalEObject)newValidator).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FaceletTaglibPackage.FACELET_TAGLIB_TAG__VALIDATOR, null, msgs);
-            msgs = basicSetValidator(newValidator, msgs);
-            if (msgs != null) msgs.dispatch();
-        }
-        else if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FaceletTaglibPackage.FACELET_TAGLIB_TAG__VALIDATOR, newValidator, newValidator));
-    }
-
-    /**
-     * <!-- begin-user-doc --> <!-- end-user-doc -->
-     * @generated
-     */
-    public IdentifiableStringValue getSource()
-    {
-        return source;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * 
-     * @param newSource
-     * @param msgs
-     * @return the notification chain <!-- end-user-doc -->
-     * @generated
-     */
-    public NotificationChain basicSetSource(IdentifiableStringValue newSource,
-            NotificationChain msgs)
-    {
-        IdentifiableStringValue oldSource = source;
-        source = newSource;
-        if (eNotificationRequired())
-        {
-            ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FaceletTaglibPackage.FACELET_TAGLIB_TAG__SOURCE, oldSource, newSource);
-            if (msgs == null) msgs = notification; else msgs.add(notification);
-        }
-        return msgs;
-    }
-
-    /**
-     * <!-- begin-user-doc --> <!-- end-user-doc -->
-     * @generated
-     */
-    public void setSource(IdentifiableStringValue newSource)
-    {
-        if (newSource != source)
-        {
-            NotificationChain msgs = null;
-            if (source != null)
-                msgs = ((InternalEObject)source).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FaceletTaglibPackage.FACELET_TAGLIB_TAG__SOURCE, null, msgs);
-            if (newSource != null)
-                msgs = ((InternalEObject)newSource).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FaceletTaglibPackage.FACELET_TAGLIB_TAG__SOURCE, null, msgs);
-            msgs = basicSetSource(newSource, msgs);
-            if (msgs != null) msgs.dispatch();
-        }
-        else if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FaceletTaglibPackage.FACELET_TAGLIB_TAG__SOURCE, newSource, newSource));
-    }
-
-    /**
-     * <!-- begin-user-doc --> <!-- end-user-doc -->
-     * @generated
-     */
-    public EList<FaceletTaglibTagAttribute> getAttribute()
-    {
-        if (attribute == null)
-        {
-            attribute = new EObjectContainmentEList<FaceletTaglibTagAttribute>(FaceletTaglibTagAttribute.class, this, FaceletTaglibPackage.FACELET_TAGLIB_TAG__ATTRIBUTE);
-        }
-        return attribute;
-    }
-
-    /**
-     * <!-- begin-user-doc --> <!-- end-user-doc -->
-     * @generated
-     */
-    public EList<FaceletTaglibTagExtension> getTagExtension()
-    {
-        if (tagExtension == null)
-        {
-            tagExtension = new EObjectContainmentEList<FaceletTaglibTagExtension>(FaceletTaglibTagExtension.class, this, FaceletTaglibPackage.FACELET_TAGLIB_TAG__TAG_EXTENSION);
-        }
-        return tagExtension;
-    }
-
-    /**
-     * <!-- begin-user-doc --> <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public NotificationChain eInverseRemove(InternalEObject otherEnd,
-            int featureID, NotificationChain msgs)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG__TAG_NAME_ELEMENT:
-                return basicSetTagNameElement(null, msgs);
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG__HANDLER_CLASS_ELEMENT:
-                return basicSetHandlerClassElement(null, msgs);
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG__BEHAVIOR:
-                return basicSetBehavior(null, msgs);
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG__COMPONENT:
-                return basicSetComponent(null, msgs);
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG__CONVERTER:
-                return basicSetConverter(null, msgs);
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG__VALIDATOR:
-                return basicSetValidator(null, msgs);
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG__SOURCE:
-                return basicSetSource(null, msgs);
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG__ATTRIBUTE:
-                return ((InternalEList<?>)getAttribute()).basicRemove(otherEnd, msgs);
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG__TAG_EXTENSION:
-                return ((InternalEList<?>)getTagExtension()).basicRemove(otherEnd, msgs);
-        }
-        return super.eInverseRemove(otherEnd, featureID, msgs);
-    }
-
-    /**
-     * <!-- begin-user-doc --> <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public Object eGet(int featureID, boolean resolve, boolean coreType)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG__TAG_NAME_ELEMENT:
-                return getTagNameElement();
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG__HANDLER_CLASS_ELEMENT:
-                return getHandlerClassElement();
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG__BEHAVIOR:
-                return getBehavior();
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG__COMPONENT:
-                return getComponent();
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG__CONVERTER:
-                return getConverter();
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG__VALIDATOR:
-                return getValidator();
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG__SOURCE:
-                return getSource();
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG__ATTRIBUTE:
-                return getAttribute();
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG__TAG_EXTENSION:
-                return getTagExtension();
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG__TAG_NAME:
-                return getTagName();
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG__HANDLER_CLASS:
-                return getHandlerClass();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc --> <!-- end-user-doc -->
-     * @generated
-     */
-    @SuppressWarnings("unchecked")
-    @Override
-    public void eSet(int featureID, Object newValue)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG__TAG_NAME_ELEMENT:
-                setTagNameElement((FaceletTaglibCanonicalName)newValue);
-                return;
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG__HANDLER_CLASS_ELEMENT:
-                setHandlerClassElement((FullyQualifiedClass)newValue);
-                return;
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG__BEHAVIOR:
-                setBehavior((FaceletTaglibTagBehavior)newValue);
-                return;
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG__COMPONENT:
-                setComponent((FaceletTaglibTagComponent)newValue);
-                return;
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG__CONVERTER:
-                setConverter((FaceletTaglibTagConverter)newValue);
-                return;
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG__VALIDATOR:
-                setValidator((FaceletTaglibTagValidator)newValue);
-                return;
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG__SOURCE:
-                setSource((IdentifiableStringValue)newValue);
-                return;
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG__ATTRIBUTE:
-                getAttribute().clear();
-                getAttribute().addAll((Collection<? extends FaceletTaglibTagAttribute>)newValue);
-                return;
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG__TAG_EXTENSION:
-                getTagExtension().clear();
-                getTagExtension().addAll((Collection<? extends FaceletTaglibTagExtension>)newValue);
-                return;
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG__TAG_NAME:
-                setTagName((String)newValue);
-                return;
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG__HANDLER_CLASS:
-                setHandlerClass((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc --> <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public void eUnset(int featureID)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG__TAG_NAME_ELEMENT:
-                setTagNameElement((FaceletTaglibCanonicalName)null);
-                return;
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG__HANDLER_CLASS_ELEMENT:
-                setHandlerClassElement((FullyQualifiedClass)null);
-                return;
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG__BEHAVIOR:
-                setBehavior((FaceletTaglibTagBehavior)null);
-                return;
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG__COMPONENT:
-                setComponent((FaceletTaglibTagComponent)null);
-                return;
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG__CONVERTER:
-                setConverter((FaceletTaglibTagConverter)null);
-                return;
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG__VALIDATOR:
-                setValidator((FaceletTaglibTagValidator)null);
-                return;
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG__SOURCE:
-                setSource((IdentifiableStringValue)null);
-                return;
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG__ATTRIBUTE:
-                getAttribute().clear();
-                return;
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG__TAG_EXTENSION:
-                getTagExtension().clear();
-                return;
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG__TAG_NAME:
-                setTagName(TAG_NAME_EDEFAULT);
-                return;
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG__HANDLER_CLASS:
-                setHandlerClass(HANDLER_CLASS_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc --> <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public boolean eIsSet(int featureID)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG__TAG_NAME_ELEMENT:
-                return tagNameElement != null;
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG__HANDLER_CLASS_ELEMENT:
-                return handlerClassElement != null;
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG__BEHAVIOR:
-                return behavior != null;
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG__COMPONENT:
-                return component != null;
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG__CONVERTER:
-                return converter != null;
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG__VALIDATOR:
-                return validator != null;
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG__SOURCE:
-                return source != null;
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG__ATTRIBUTE:
-                return attribute != null && !attribute.isEmpty();
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG__TAG_EXTENSION:
-                return tagExtension != null && !tagExtension.isEmpty();
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG__TAG_NAME:
-                return TAG_NAME_EDEFAULT == null ? getTagName() != null : !TAG_NAME_EDEFAULT.equals(getTagName());
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG__HANDLER_CLASS:
-                return HANDLER_CLASS_EDEFAULT == null ? getHandlerClass() != null : !HANDLER_CLASS_EDEFAULT.equals(getHandlerClass());
-        }
-        return super.eIsSet(featureID);
-    }
-
-} // FaceletTaglibTagImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/impl/FaceletTaglibTagValidatorExtensionImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/impl/FaceletTaglibTagValidatorExtensionImpl.java
deleted file mode 100644
index 48145ba..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/impl/FaceletTaglibTagValidatorExtensionImpl.java
+++ /dev/null
@@ -1,237 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: FaceletTaglibTagValidatorExtensionImpl.java,v 1.1 2010/03/18 06:24:38 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.BasicFeatureMap;
-import org.eclipse.emf.ecore.util.FeatureMap;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagValidatorExtension;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Facelet Taglib Tag Validator Extension</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibTagValidatorExtensionImpl#getAny <em>Any</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibTagValidatorExtensionImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class FaceletTaglibTagValidatorExtensionImpl extends EObjectImpl implements FaceletTaglibTagValidatorExtension
-{
-    /**
-     * The cached value of the '{@link #getAny() <em>Any</em>}' attribute list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getAny()
-     * @generated
-     * @ordered
-     */
-    protected FeatureMap any;
-
-    /**
-     * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-    protected static final String ID_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-    protected String id = ID_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected FaceletTaglibTagValidatorExtensionImpl()
-    {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    protected EClass eStaticClass()
-    {
-        return FaceletTaglibPackage.Literals.FACELET_TAGLIB_TAG_VALIDATOR_EXTENSION;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public FeatureMap getAny()
-    {
-        if (any == null)
-        {
-            any = new BasicFeatureMap(this, FaceletTaglibPackage.FACELET_TAGLIB_TAG_VALIDATOR_EXTENSION__ANY);
-        }
-        return any;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String getId()
-    {
-        return id;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setId(String newId)
-    {
-        String oldId = id;
-        id = newId;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FaceletTaglibPackage.FACELET_TAGLIB_TAG_VALIDATOR_EXTENSION__ID, oldId, id));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_VALIDATOR_EXTENSION__ANY:
-                return ((InternalEList<?>)getAny()).basicRemove(otherEnd, msgs);
-        }
-        return super.eInverseRemove(otherEnd, featureID, msgs);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public Object eGet(int featureID, boolean resolve, boolean coreType)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_VALIDATOR_EXTENSION__ANY:
-                if (coreType) return getAny();
-                return ((FeatureMap.Internal)getAny()).getWrapper();
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_VALIDATOR_EXTENSION__ID:
-                return getId();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public void eSet(int featureID, Object newValue)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_VALIDATOR_EXTENSION__ANY:
-                ((FeatureMap.Internal)getAny()).set(newValue);
-                return;
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_VALIDATOR_EXTENSION__ID:
-                setId((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public void eUnset(int featureID)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_VALIDATOR_EXTENSION__ANY:
-                getAny().clear();
-                return;
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_VALIDATOR_EXTENSION__ID:
-                setId(ID_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public boolean eIsSet(int featureID)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_VALIDATOR_EXTENSION__ANY:
-                return any != null && !any.isEmpty();
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_VALIDATOR_EXTENSION__ID:
-                return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public String toString()
-    {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (any: "); //$NON-NLS-1$
-        result.append(any);
-        result.append(", id: "); //$NON-NLS-1$
-        result.append(id);
-        result.append(')');
-        return result.toString();
-    }
-
-} //FaceletTaglibTagValidatorExtensionImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/impl/FaceletTaglibTagValidatorImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/impl/FaceletTaglibTagValidatorImpl.java
deleted file mode 100644
index 675da9b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/impl/FaceletTaglibTagValidatorImpl.java
+++ /dev/null
@@ -1,317 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: FaceletTaglibTagValidatorImpl.java,v 1.1 2010/03/18 06:24:38 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagValidator;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagValidatorExtension;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FullyQualifiedClass;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.IdentifiableStringValue;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Facelet Taglib Tag Validator</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibTagValidatorImpl#getValidatorId <em>Validator Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibTagValidatorImpl#getHandlerClass <em>Handler Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.FaceletTaglibTagValidatorImpl#getValidatorExtension <em>Validator Extension</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class FaceletTaglibTagValidatorImpl extends UserVisibleTaglibObjectImpl implements FaceletTaglibTagValidator
-{
-    /**
-     * The cached value of the '{@link #getValidatorId() <em>Validator Id</em>}' containment reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getValidatorId()
-     * @generated
-     * @ordered
-     */
-    protected IdentifiableStringValue validatorId;
-
-    /**
-     * The cached value of the '{@link #getHandlerClass() <em>Handler Class</em>}' containment reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getHandlerClass()
-     * @generated
-     * @ordered
-     */
-    protected FullyQualifiedClass handlerClass;
-
-    /**
-     * The cached value of the '{@link #getValidatorExtension() <em>Validator Extension</em>}' containment reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getValidatorExtension()
-     * @generated
-     * @ordered
-     */
-    protected EList<FaceletTaglibTagValidatorExtension> validatorExtension;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected FaceletTaglibTagValidatorImpl()
-    {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    protected EClass eStaticClass()
-    {
-        return FaceletTaglibPackage.Literals.FACELET_TAGLIB_TAG_VALIDATOR;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public IdentifiableStringValue getValidatorId()
-    {
-        return validatorId;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param newValidatorId 
-     * @param msgs 
-     * @return the notification chain
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public NotificationChain basicSetValidatorId(IdentifiableStringValue newValidatorId, NotificationChain msgs)
-    {
-        IdentifiableStringValue oldValidatorId = validatorId;
-        validatorId = newValidatorId;
-        if (eNotificationRequired())
-        {
-            ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FaceletTaglibPackage.FACELET_TAGLIB_TAG_VALIDATOR__VALIDATOR_ID, oldValidatorId, newValidatorId);
-            if (msgs == null) msgs = notification; else msgs.add(notification);
-        }
-        return msgs;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setValidatorId(IdentifiableStringValue newValidatorId)
-    {
-        if (newValidatorId != validatorId)
-        {
-            NotificationChain msgs = null;
-            if (validatorId != null)
-                msgs = ((InternalEObject)validatorId).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FaceletTaglibPackage.FACELET_TAGLIB_TAG_VALIDATOR__VALIDATOR_ID, null, msgs);
-            if (newValidatorId != null)
-                msgs = ((InternalEObject)newValidatorId).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FaceletTaglibPackage.FACELET_TAGLIB_TAG_VALIDATOR__VALIDATOR_ID, null, msgs);
-            msgs = basicSetValidatorId(newValidatorId, msgs);
-            if (msgs != null) msgs.dispatch();
-        }
-        else if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FaceletTaglibPackage.FACELET_TAGLIB_TAG_VALIDATOR__VALIDATOR_ID, newValidatorId, newValidatorId));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public FullyQualifiedClass getHandlerClass()
-    {
-        return handlerClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param newHandlerClass 
-     * @param msgs 
-     * @return the notification chain
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public NotificationChain basicSetHandlerClass(FullyQualifiedClass newHandlerClass, NotificationChain msgs)
-    {
-        FullyQualifiedClass oldHandlerClass = handlerClass;
-        handlerClass = newHandlerClass;
-        if (eNotificationRequired())
-        {
-            ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FaceletTaglibPackage.FACELET_TAGLIB_TAG_VALIDATOR__HANDLER_CLASS, oldHandlerClass, newHandlerClass);
-            if (msgs == null) msgs = notification; else msgs.add(notification);
-        }
-        return msgs;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setHandlerClass(FullyQualifiedClass newHandlerClass)
-    {
-        if (newHandlerClass != handlerClass)
-        {
-            NotificationChain msgs = null;
-            if (handlerClass != null)
-                msgs = ((InternalEObject)handlerClass).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FaceletTaglibPackage.FACELET_TAGLIB_TAG_VALIDATOR__HANDLER_CLASS, null, msgs);
-            if (newHandlerClass != null)
-                msgs = ((InternalEObject)newHandlerClass).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FaceletTaglibPackage.FACELET_TAGLIB_TAG_VALIDATOR__HANDLER_CLASS, null, msgs);
-            msgs = basicSetHandlerClass(newHandlerClass, msgs);
-            if (msgs != null) msgs.dispatch();
-        }
-        else if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FaceletTaglibPackage.FACELET_TAGLIB_TAG_VALIDATOR__HANDLER_CLASS, newHandlerClass, newHandlerClass));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EList<FaceletTaglibTagValidatorExtension> getValidatorExtension()
-    {
-        if (validatorExtension == null)
-        {
-            validatorExtension = new EObjectContainmentEList<FaceletTaglibTagValidatorExtension>(FaceletTaglibTagValidatorExtension.class, this, FaceletTaglibPackage.FACELET_TAGLIB_TAG_VALIDATOR__VALIDATOR_EXTENSION);
-        }
-        return validatorExtension;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_VALIDATOR__VALIDATOR_ID:
-                return basicSetValidatorId(null, msgs);
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_VALIDATOR__HANDLER_CLASS:
-                return basicSetHandlerClass(null, msgs);
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_VALIDATOR__VALIDATOR_EXTENSION:
-                return ((InternalEList<?>)getValidatorExtension()).basicRemove(otherEnd, msgs);
-        }
-        return super.eInverseRemove(otherEnd, featureID, msgs);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public Object eGet(int featureID, boolean resolve, boolean coreType)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_VALIDATOR__VALIDATOR_ID:
-                return getValidatorId();
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_VALIDATOR__HANDLER_CLASS:
-                return getHandlerClass();
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_VALIDATOR__VALIDATOR_EXTENSION:
-                return getValidatorExtension();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @SuppressWarnings("unchecked")
-    @Override
-    public void eSet(int featureID, Object newValue)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_VALIDATOR__VALIDATOR_ID:
-                setValidatorId((IdentifiableStringValue)newValue);
-                return;
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_VALIDATOR__HANDLER_CLASS:
-                setHandlerClass((FullyQualifiedClass)newValue);
-                return;
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_VALIDATOR__VALIDATOR_EXTENSION:
-                getValidatorExtension().clear();
-                getValidatorExtension().addAll((Collection<? extends FaceletTaglibTagValidatorExtension>)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public void eUnset(int featureID)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_VALIDATOR__VALIDATOR_ID:
-                setValidatorId((IdentifiableStringValue)null);
-                return;
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_VALIDATOR__HANDLER_CLASS:
-                setHandlerClass((FullyQualifiedClass)null);
-                return;
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_VALIDATOR__VALIDATOR_EXTENSION:
-                getValidatorExtension().clear();
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public boolean eIsSet(int featureID)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_VALIDATOR__VALIDATOR_ID:
-                return validatorId != null;
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_VALIDATOR__HANDLER_CLASS:
-                return handlerClass != null;
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_VALIDATOR__VALIDATOR_EXTENSION:
-                return validatorExtension != null && !validatorExtension.isEmpty();
-        }
-        return super.eIsSet(featureID);
-    }
-
-} //FaceletTaglibTagValidatorImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/impl/FullyQualifiedClassImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/impl/FullyQualifiedClassImpl.java
deleted file mode 100644
index f188958..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/impl/FullyQualifiedClassImpl.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: FullyQualifiedClassImpl.java,v 1.1 2010/03/18 06:24:38 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FullyQualifiedClass;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Fully Qualified Class</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * </p>
- *
- * @generated
- */
-public class FullyQualifiedClassImpl extends IdentifiableStringValueImpl implements FullyQualifiedClass
-{
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected FullyQualifiedClassImpl()
-    {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    protected EClass eStaticClass()
-    {
-        return FaceletTaglibPackage.Literals.FULLY_QUALIFIED_CLASS;
-    }
-
-} //FullyQualifiedClassImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/impl/GenericBooleanImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/impl/GenericBooleanImpl.java
deleted file mode 100644
index 6632e66..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/impl/GenericBooleanImpl.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: GenericBooleanImpl.java,v 1.1 2010/03/18 06:24:39 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.GenericBoolean;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Generic Boolean</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * </p>
- *
- * @generated
- */
-public class GenericBooleanImpl extends IdentifiableStringValueImpl implements GenericBoolean
-{
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected GenericBooleanImpl()
-    {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    protected EClass eStaticClass()
-    {
-        return FaceletTaglibPackage.Literals.GENERIC_BOOLEAN;
-    }
-
-} //GenericBooleanImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/impl/IconImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/impl/IconImpl.java
deleted file mode 100644
index d9b9bde..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/impl/IconImpl.java
+++ /dev/null
@@ -1,399 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: IconImpl.java,v 1.1 2010/03/18 06:24:37 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.Icon;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.Path;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Icon</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.IconImpl#getSmallIcon <em>Small Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.IconImpl#getLargeIcon <em>Large Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.IconImpl#getId <em>Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.IconImpl#getLang <em>Lang</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class IconImpl extends EObjectImpl implements Icon
-{
-    /**
-     * The cached value of the '{@link #getSmallIcon() <em>Small Icon</em>}' containment reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getSmallIcon()
-     * @generated
-     * @ordered
-     */
-    protected Path smallIcon;
-
-    /**
-     * The cached value of the '{@link #getLargeIcon() <em>Large Icon</em>}' containment reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getLargeIcon()
-     * @generated
-     * @ordered
-     */
-    protected Path largeIcon;
-
-    /**
-     * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-    protected static final String ID_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-    protected String id = ID_EDEFAULT;
-
-    /**
-     * The default value of the '{@link #getLang() <em>Lang</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getLang()
-     * @generated
-     * @ordered
-     */
-    protected static final String LANG_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getLang() <em>Lang</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getLang()
-     * @generated
-     * @ordered
-     */
-    protected String lang = LANG_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected IconImpl()
-    {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    protected EClass eStaticClass()
-    {
-        return FaceletTaglibPackage.Literals.ICON;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Path getSmallIcon()
-    {
-        return smallIcon;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param newSmallIcon 
-     * @param msgs 
-     * @return the notification chain
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public NotificationChain basicSetSmallIcon(Path newSmallIcon, NotificationChain msgs)
-    {
-        Path oldSmallIcon = smallIcon;
-        smallIcon = newSmallIcon;
-        if (eNotificationRequired())
-        {
-            ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FaceletTaglibPackage.ICON__SMALL_ICON, oldSmallIcon, newSmallIcon);
-            if (msgs == null) msgs = notification; else msgs.add(notification);
-        }
-        return msgs;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setSmallIcon(Path newSmallIcon)
-    {
-        if (newSmallIcon != smallIcon)
-        {
-            NotificationChain msgs = null;
-            if (smallIcon != null)
-                msgs = ((InternalEObject)smallIcon).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FaceletTaglibPackage.ICON__SMALL_ICON, null, msgs);
-            if (newSmallIcon != null)
-                msgs = ((InternalEObject)newSmallIcon).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FaceletTaglibPackage.ICON__SMALL_ICON, null, msgs);
-            msgs = basicSetSmallIcon(newSmallIcon, msgs);
-            if (msgs != null) msgs.dispatch();
-        }
-        else if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FaceletTaglibPackage.ICON__SMALL_ICON, newSmallIcon, newSmallIcon));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Path getLargeIcon()
-    {
-        return largeIcon;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param newLargeIcon 
-     * @param msgs 
-     * @return the notification chain.
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public NotificationChain basicSetLargeIcon(Path newLargeIcon, NotificationChain msgs)
-    {
-        Path oldLargeIcon = largeIcon;
-        largeIcon = newLargeIcon;
-        if (eNotificationRequired())
-        {
-            ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FaceletTaglibPackage.ICON__LARGE_ICON, oldLargeIcon, newLargeIcon);
-            if (msgs == null) msgs = notification; else msgs.add(notification);
-        }
-        return msgs;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setLargeIcon(Path newLargeIcon)
-    {
-        if (newLargeIcon != largeIcon)
-        {
-            NotificationChain msgs = null;
-            if (largeIcon != null)
-                msgs = ((InternalEObject)largeIcon).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FaceletTaglibPackage.ICON__LARGE_ICON, null, msgs);
-            if (newLargeIcon != null)
-                msgs = ((InternalEObject)newLargeIcon).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FaceletTaglibPackage.ICON__LARGE_ICON, null, msgs);
-            msgs = basicSetLargeIcon(newLargeIcon, msgs);
-            if (msgs != null) msgs.dispatch();
-        }
-        else if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FaceletTaglibPackage.ICON__LARGE_ICON, newLargeIcon, newLargeIcon));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String getId()
-    {
-        return id;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setId(String newId)
-    {
-        String oldId = id;
-        id = newId;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FaceletTaglibPackage.ICON__ID, oldId, id));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String getLang()
-    {
-        return lang;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setLang(String newLang)
-    {
-        String oldLang = lang;
-        lang = newLang;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FaceletTaglibPackage.ICON__LANG, oldLang, lang));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglibPackage.ICON__SMALL_ICON:
-                return basicSetSmallIcon(null, msgs);
-            case FaceletTaglibPackage.ICON__LARGE_ICON:
-                return basicSetLargeIcon(null, msgs);
-        }
-        return super.eInverseRemove(otherEnd, featureID, msgs);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public Object eGet(int featureID, boolean resolve, boolean coreType)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglibPackage.ICON__SMALL_ICON:
-                return getSmallIcon();
-            case FaceletTaglibPackage.ICON__LARGE_ICON:
-                return getLargeIcon();
-            case FaceletTaglibPackage.ICON__ID:
-                return getId();
-            case FaceletTaglibPackage.ICON__LANG:
-                return getLang();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public void eSet(int featureID, Object newValue)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglibPackage.ICON__SMALL_ICON:
-                setSmallIcon((Path)newValue);
-                return;
-            case FaceletTaglibPackage.ICON__LARGE_ICON:
-                setLargeIcon((Path)newValue);
-                return;
-            case FaceletTaglibPackage.ICON__ID:
-                setId((String)newValue);
-                return;
-            case FaceletTaglibPackage.ICON__LANG:
-                setLang((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public void eUnset(int featureID)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglibPackage.ICON__SMALL_ICON:
-                setSmallIcon((Path)null);
-                return;
-            case FaceletTaglibPackage.ICON__LARGE_ICON:
-                setLargeIcon((Path)null);
-                return;
-            case FaceletTaglibPackage.ICON__ID:
-                setId(ID_EDEFAULT);
-                return;
-            case FaceletTaglibPackage.ICON__LANG:
-                setLang(LANG_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public boolean eIsSet(int featureID)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglibPackage.ICON__SMALL_ICON:
-                return smallIcon != null;
-            case FaceletTaglibPackage.ICON__LARGE_ICON:
-                return largeIcon != null;
-            case FaceletTaglibPackage.ICON__ID:
-                return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-            case FaceletTaglibPackage.ICON__LANG:
-                return LANG_EDEFAULT == null ? lang != null : !LANG_EDEFAULT.equals(lang);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public String toString()
-    {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (id: "); //$NON-NLS-1$
-        result.append(id);
-        result.append(", lang: "); //$NON-NLS-1$
-        result.append(lang);
-        result.append(')');
-        return result.toString();
-    }
-
-} //IconImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/impl/IdentifiableLangStringValueImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/impl/IdentifiableLangStringValueImpl.java
deleted file mode 100644
index 8f5721a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/impl/IdentifiableLangStringValueImpl.java
+++ /dev/null
@@ -1,177 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: IdentifiableLangStringValueImpl.java,v 1.1 2010/03/18 06:24:39 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.IdentifiableLangStringValue;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Identifiable Lang String Value</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.IdentifiableLangStringValueImpl#getLang <em>Lang</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public abstract class IdentifiableLangStringValueImpl extends IdentifiableStringValueImpl implements IdentifiableLangStringValue
-{
-    /**
-     * The default value of the '{@link #getLang() <em>Lang</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getLang()
-     * @generated
-     * @ordered
-     */
-    protected static final String LANG_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getLang() <em>Lang</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getLang()
-     * @generated
-     * @ordered
-     */
-    protected String lang = LANG_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected IdentifiableLangStringValueImpl()
-    {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    protected EClass eStaticClass()
-    {
-        return FaceletTaglibPackage.Literals.IDENTIFIABLE_LANG_STRING_VALUE;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String getLang()
-    {
-        return lang;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setLang(String newLang)
-    {
-        String oldLang = lang;
-        lang = newLang;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FaceletTaglibPackage.IDENTIFIABLE_LANG_STRING_VALUE__LANG, oldLang, lang));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public Object eGet(int featureID, boolean resolve, boolean coreType)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglibPackage.IDENTIFIABLE_LANG_STRING_VALUE__LANG:
-                return getLang();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public void eSet(int featureID, Object newValue)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglibPackage.IDENTIFIABLE_LANG_STRING_VALUE__LANG:
-                setLang((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public void eUnset(int featureID)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglibPackage.IDENTIFIABLE_LANG_STRING_VALUE__LANG:
-                setLang(LANG_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public boolean eIsSet(int featureID)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglibPackage.IDENTIFIABLE_LANG_STRING_VALUE__LANG:
-                return LANG_EDEFAULT == null ? lang != null : !LANG_EDEFAULT.equals(lang);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public String toString()
-    {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (lang: "); //$NON-NLS-1$
-        result.append(lang);
-        result.append(')');
-        return result.toString();
-    }
-
-} //IdentifiableLangStringValueImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/impl/IdentifiableStringValueImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/impl/IdentifiableStringValueImpl.java
deleted file mode 100644
index b380e98..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/impl/IdentifiableStringValueImpl.java
+++ /dev/null
@@ -1,234 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: IdentifiableStringValueImpl.java,v 1.1 2010/03/18 06:24:39 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.IdentifiableStringValue;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Identifiable String Value</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.IdentifiableStringValueImpl#getValue <em>Value</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.IdentifiableStringValueImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class IdentifiableStringValueImpl extends EObjectImpl implements IdentifiableStringValue
-{
-    /**
-     * The default value of the '{@link #getValue() <em>Value</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getValue()
-     * @generated
-     * @ordered
-     */
-    protected static final String VALUE_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getValue() <em>Value</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getValue()
-     * @generated
-     * @ordered
-     */
-    protected String value = VALUE_EDEFAULT;
-
-    /**
-     * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-    protected static final String ID_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-    protected String id = ID_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected IdentifiableStringValueImpl()
-    {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    protected EClass eStaticClass()
-    {
-        return FaceletTaglibPackage.Literals.IDENTIFIABLE_STRING_VALUE;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String getValue()
-    {
-        return value;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setValue(String newValue)
-    {
-        String oldValue = value;
-        value = newValue;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FaceletTaglibPackage.IDENTIFIABLE_STRING_VALUE__VALUE, oldValue, value));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String getId()
-    {
-        return id;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setId(String newId)
-    {
-        String oldId = id;
-        id = newId;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FaceletTaglibPackage.IDENTIFIABLE_STRING_VALUE__ID, oldId, id));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public Object eGet(int featureID, boolean resolve, boolean coreType)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglibPackage.IDENTIFIABLE_STRING_VALUE__VALUE:
-                return getValue();
-            case FaceletTaglibPackage.IDENTIFIABLE_STRING_VALUE__ID:
-                return getId();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public void eSet(int featureID, Object newValue)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglibPackage.IDENTIFIABLE_STRING_VALUE__VALUE:
-                setValue((String)newValue);
-                return;
-            case FaceletTaglibPackage.IDENTIFIABLE_STRING_VALUE__ID:
-                setId((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public void eUnset(int featureID)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglibPackage.IDENTIFIABLE_STRING_VALUE__VALUE:
-                setValue(VALUE_EDEFAULT);
-                return;
-            case FaceletTaglibPackage.IDENTIFIABLE_STRING_VALUE__ID:
-                setId(ID_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public boolean eIsSet(int featureID)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglibPackage.IDENTIFIABLE_STRING_VALUE__VALUE:
-                return VALUE_EDEFAULT == null ? value != null : !VALUE_EDEFAULT.equals(value);
-            case FaceletTaglibPackage.IDENTIFIABLE_STRING_VALUE__ID:
-                return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public String toString()
-    {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (value: "); //$NON-NLS-1$
-        result.append(value);
-        result.append(", id: "); //$NON-NLS-1$
-        result.append(id);
-        result.append(')');
-        return result.toString();
-    }
-
-} //IdentifiableStringValueImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/impl/JavaIdentifierImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/impl/JavaIdentifierImpl.java
deleted file mode 100644
index 18287c9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/impl/JavaIdentifierImpl.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: JavaIdentifierImpl.java,v 1.1 2010/03/18 06:24:39 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.JavaIdentifier;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Java Identifier</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * </p>
- *
- * @generated
- */
-public class JavaIdentifierImpl extends IdentifiableStringValueImpl implements JavaIdentifier
-{
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected JavaIdentifierImpl()
-    {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    protected EClass eStaticClass()
-    {
-        return FaceletTaglibPackage.Literals.JAVA_IDENTIFIER;
-    }
-
-} //JavaIdentifierImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/impl/PathImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/impl/PathImpl.java
deleted file mode 100644
index 0da2c86..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/impl/PathImpl.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: PathImpl.java,v 1.1 2010/03/18 06:24:38 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.Path;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Path</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * </p>
- *
- * @generated
- */
-public class PathImpl extends IdentifiableStringValueImpl implements Path
-{
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected PathImpl()
-    {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    protected EClass eStaticClass()
-    {
-        return FaceletTaglibPackage.Literals.PATH;
-    }
-
-} //PathImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/impl/UserVisibleTaglibObjectImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/impl/UserVisibleTaglibObjectImpl.java
deleted file mode 100644
index 06a0d91..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/impl/UserVisibleTaglibObjectImpl.java
+++ /dev/null
@@ -1,284 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: UserVisibleTaglibObjectImpl.java,v 1.1 2010/03/18 06:24:38 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.Description;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.DisplayName;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.Icon;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.UserVisibleTaglibObject;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>User Visible Taglib Object</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.UserVisibleTaglibObjectImpl#getDescription <em>Description</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.UserVisibleTaglibObjectImpl#getDisplayName <em>Display Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl.UserVisibleTaglibObjectImpl#getIcon <em>Icon</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public abstract class UserVisibleTaglibObjectImpl extends EObjectImpl implements UserVisibleTaglibObject
-{
-    /**
-     * The cached value of the '{@link #getDescription() <em>Description</em>}' containment reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getDescription()
-     * @generated
-     * @ordered
-     */
-    protected EList<Description> description;
-
-    /**
-     * The cached value of the '{@link #getDisplayName() <em>Display Name</em>}' containment reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getDisplayName()
-     * @generated
-     * @ordered
-     */
-    protected EList<DisplayName> displayName;
-
-    /**
-     * The cached value of the '{@link #getIcon() <em>Icon</em>}' containment reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getIcon()
-     * @generated
-     * @ordered
-     */
-    protected EList<Icon> icon;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected UserVisibleTaglibObjectImpl()
-    {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    protected EClass eStaticClass()
-    {
-        return FaceletTaglibPackage.Literals.USER_VISIBLE_TAGLIB_OBJECT;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EList<Description> getDescription()
-    {
-        if (description == null)
-        {
-            description = new EObjectContainmentEList<Description>(Description.class, this, FaceletTaglibPackage.USER_VISIBLE_TAGLIB_OBJECT__DESCRIPTION);
-        }
-        return description;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EList<DisplayName> getDisplayName()
-    {
-        if (displayName == null)
-        {
-            displayName = new EObjectContainmentEList<DisplayName>(DisplayName.class, this, FaceletTaglibPackage.USER_VISIBLE_TAGLIB_OBJECT__DISPLAY_NAME);
-        }
-        return displayName;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EList<Icon> getIcon()
-    {
-        if (icon == null)
-        {
-            icon = new EObjectContainmentEList<Icon>(Icon.class, this, FaceletTaglibPackage.USER_VISIBLE_TAGLIB_OBJECT__ICON);
-        }
-        return icon;
-    }
-
-    /**
-     * <!-- begin-user-doc --> <!-- end-user-doc -->
-     * 
-     * @generated NOT
-     */
-    public String getDescription(String language, String separationString)
-    {
-        return Util.concat(this, getDescription(), language, separationString);
-    }
-
-    /**
-     * <!-- begin-user-doc --> <!-- end-user-doc -->
-     * 
-     * @generated NOT
-     */
-    public String getDefaultDescription(String separationString)
-    {
-        return getDescription("", separationString); //$NON-NLS-1$
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated NOT
-     */
-    public String getDisplayName(String language, String separationString)
-    {
-        return Util.concat(this, getDescription(), language, separationString);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated NOT
-     */
-    public String getDefaultDisplayName(String separationString)
-    {
-        return getDisplayName("", separationString); //$NON-NLS-1$
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglibPackage.USER_VISIBLE_TAGLIB_OBJECT__DESCRIPTION:
-                return ((InternalEList<?>)getDescription()).basicRemove(otherEnd, msgs);
-            case FaceletTaglibPackage.USER_VISIBLE_TAGLIB_OBJECT__DISPLAY_NAME:
-                return ((InternalEList<?>)getDisplayName()).basicRemove(otherEnd, msgs);
-            case FaceletTaglibPackage.USER_VISIBLE_TAGLIB_OBJECT__ICON:
-                return ((InternalEList<?>)getIcon()).basicRemove(otherEnd, msgs);
-        }
-        return super.eInverseRemove(otherEnd, featureID, msgs);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public Object eGet(int featureID, boolean resolve, boolean coreType)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglibPackage.USER_VISIBLE_TAGLIB_OBJECT__DESCRIPTION:
-                return getDescription();
-            case FaceletTaglibPackage.USER_VISIBLE_TAGLIB_OBJECT__DISPLAY_NAME:
-                return getDisplayName();
-            case FaceletTaglibPackage.USER_VISIBLE_TAGLIB_OBJECT__ICON:
-                return getIcon();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @SuppressWarnings("unchecked")
-    @Override
-    public void eSet(int featureID, Object newValue)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglibPackage.USER_VISIBLE_TAGLIB_OBJECT__DESCRIPTION:
-                getDescription().clear();
-                getDescription().addAll((Collection<? extends Description>)newValue);
-                return;
-            case FaceletTaglibPackage.USER_VISIBLE_TAGLIB_OBJECT__DISPLAY_NAME:
-                getDisplayName().clear();
-                getDisplayName().addAll((Collection<? extends DisplayName>)newValue);
-                return;
-            case FaceletTaglibPackage.USER_VISIBLE_TAGLIB_OBJECT__ICON:
-                getIcon().clear();
-                getIcon().addAll((Collection<? extends Icon>)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public void eUnset(int featureID)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglibPackage.USER_VISIBLE_TAGLIB_OBJECT__DESCRIPTION:
-                getDescription().clear();
-                return;
-            case FaceletTaglibPackage.USER_VISIBLE_TAGLIB_OBJECT__DISPLAY_NAME:
-                getDisplayName().clear();
-                return;
-            case FaceletTaglibPackage.USER_VISIBLE_TAGLIB_OBJECT__ICON:
-                getIcon().clear();
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public boolean eIsSet(int featureID)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglibPackage.USER_VISIBLE_TAGLIB_OBJECT__DESCRIPTION:
-                return description != null && !description.isEmpty();
-            case FaceletTaglibPackage.USER_VISIBLE_TAGLIB_OBJECT__DISPLAY_NAME:
-                return displayName != null && !displayName.isEmpty();
-            case FaceletTaglibPackage.USER_VISIBLE_TAGLIB_OBJECT__ICON:
-                return icon != null && !icon.isEmpty();
-        }
-        return super.eIsSet(featureID);
-    }
-
-} //UserVisibleTaglibObjectImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/impl/Util.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/impl/Util.java
deleted file mode 100644
index dd6f85c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/impl/Util.java
+++ /dev/null
@@ -1,86 +0,0 @@
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.impl;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EReference;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.IdentifiableLangStringValue;
-
-/**
- * A private utility class for use by Facelet Taglib model impls.
- * 
- * @author cbateman
- * 
- */
-class Util
-{
-    public static String concat(final EObject listOwner,
-            final EList<? extends IdentifiableLangStringValue> list,
-            final String filterString,
-            final String separationString)
-    {
-        if (filterString == null)
-        {
-            throw new NullPointerException("language must not be null"); //$NON-NLS-1$
-        }
-
-        String retString = ""; //$NON-NLS-1$
-        for (final IdentifiableLangStringValue obj : list)
-        {
-            if (obj != null
-                    && passesFilter(filterString.length() == 0 ? null
-                            : filterString, obj))
-            {
-                String value = obj.getValue();
-                if (value != null)
-                {
-                    value = value.trim();
-                    if (retString.length() != 0)
-                    {
-                        retString += separationString;
-                    }
-                    retString += value;
-                }
-            }
-        }
-        return retString;
-    }
-
-    private static boolean passesFilter(final String expectedLang,
-            final IdentifiableLangStringValue langOwner)
-    {
-        final Object lang = langOwner.getLang();
-        return ((expectedLang == null && lang == null) || (expectedLang != null && expectedLang
-                .equals(lang)));
-    }
-    
-    public static Object getSimplifiedNestedField(final EObject owner,
-            final EReference firstLevelFeature, EAttribute simplifiedFeature)
-    {
-        Object complexObject = owner.eGet(firstLevelFeature);
-        if (complexObject instanceof EObject)
-        {
-            return ((EObject) complexObject).eGet(simplifiedFeature);
-        }
-        return null;
-    }
-    
-    public static void setSimplifiedNestedField(final EObject owner,
-            final EReference firstLevelFeature, EAttribute simplifiedFeature,
-            final Object newSimpleValue)
-    {
-        Object complexObject = owner.eGet(firstLevelFeature);
-        if (complexObject == null)
-        {
-            complexObject = EcoreUtil.create((EClass) firstLevelFeature.getEType());
-            ((EObject) complexObject).eSet(simplifiedFeature, newSimpleValue);
-            owner.eSet(firstLevelFeature, complexObject);
-        } else
-        {
-            ((EObject) complexObject).eSet(simplifiedFeature, newSimpleValue);
-        }
-
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/util/FaceletTaglibAdapterFactory.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/util/FaceletTaglibAdapterFactory.java
deleted file mode 100644
index 065e0f8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/util/FaceletTaglibAdapterFactory.java
+++ /dev/null
@@ -1,659 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: FaceletTaglibAdapterFactory.java,v 1.2 2010/03/18 06:24:40 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.util;
-
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.common.notify.Notifier;
-import org.eclipse.emf.common.notify.impl.AdapterFactoryImpl;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.Description;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.DisplayName;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.DocumentRoot;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglib;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibCanonicalName;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibExtension;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibFunction;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTag;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagAttribute;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagBehavior;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagBehaviorExtension;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagComponent;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagComponentExtension;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagConverter;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagConverterExtension;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagExtension;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagValidator;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagValidatorExtension;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FullyQualifiedClass;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.GenericBoolean;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.Icon;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.IdentifiableLangStringValue;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.IdentifiableStringValue;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.JavaIdentifier;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.Path;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.UserVisibleTaglibObject;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Adapter Factory</b> for the model.
- * It provides an adapter <code>createXXX</code> method for each class of the model.
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage
- * @generated
- */
-public class FaceletTaglibAdapterFactory extends AdapterFactoryImpl
-{
-    /**
-     * The cached model package.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected static FaceletTaglibPackage modelPackage;
-
-    /**
-     * Creates an instance of the adapter factory.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public FaceletTaglibAdapterFactory()
-    {
-        if (modelPackage == null)
-        {
-            modelPackage = FaceletTaglibPackage.eINSTANCE;
-        }
-    }
-
-    /**
-     * Returns whether this factory is applicable for the type of the object.
-     * <!-- begin-user-doc -->
-     * This implementation returns <code>true</code> if the object is either the model's package or is an instance object of the model.
-     * <!-- end-user-doc -->
-     * @return whether this factory is applicable for the type of the object.
-     * @generated
-     */
-    @Override
-    public boolean isFactoryForType(Object object)
-    {
-        if (object == modelPackage)
-        {
-            return true;
-        }
-        if (object instanceof EObject)
-        {
-            return ((EObject)object).eClass().getEPackage() == modelPackage;
-        }
-        return false;
-    }
-
-    /**
-     * The switch that delegates to the <code>createXXX</code> methods.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected FaceletTaglibSwitch<Adapter> modelSwitch =
-        new FaceletTaglibSwitch<Adapter>()
-        {
-            @Override
-            public Adapter caseDescription(Description object)
-            {
-                return createDescriptionAdapter();
-            }
-            @Override
-            public Adapter caseDisplayName(DisplayName object)
-            {
-                return createDisplayNameAdapter();
-            }
-            @Override
-            public Adapter caseDocumentRoot(DocumentRoot object)
-            {
-                return createDocumentRootAdapter();
-            }
-            @Override
-            public Adapter caseFaceletTaglibCanonicalName(FaceletTaglibCanonicalName object)
-            {
-                return createFaceletTaglibCanonicalNameAdapter();
-            }
-            @Override
-            public Adapter caseFaceletTaglibExtension(FaceletTaglibExtension object)
-            {
-                return createFaceletTaglibExtensionAdapter();
-            }
-            @Override
-            public Adapter caseFaceletTaglibFunction(FaceletTaglibFunction object)
-            {
-                return createFaceletTaglibFunctionAdapter();
-            }
-            @Override
-            public Adapter caseFaceletTaglibTagAttribute(FaceletTaglibTagAttribute object)
-            {
-                return createFaceletTaglibTagAttributeAdapter();
-            }
-            @Override
-            public Adapter caseFaceletTaglibTagBehaviorExtension(FaceletTaglibTagBehaviorExtension object)
-            {
-                return createFaceletTaglibTagBehaviorExtensionAdapter();
-            }
-            @Override
-            public Adapter caseFaceletTaglibTagBehavior(FaceletTaglibTagBehavior object)
-            {
-                return createFaceletTaglibTagBehaviorAdapter();
-            }
-            @Override
-            public Adapter caseFaceletTaglibTagComponentExtension(FaceletTaglibTagComponentExtension object)
-            {
-                return createFaceletTaglibTagComponentExtensionAdapter();
-            }
-            @Override
-            public Adapter caseFaceletTaglibTagComponent(FaceletTaglibTagComponent object)
-            {
-                return createFaceletTaglibTagComponentAdapter();
-            }
-            @Override
-            public Adapter caseFaceletTaglibTagConverterExtension(FaceletTaglibTagConverterExtension object)
-            {
-                return createFaceletTaglibTagConverterExtensionAdapter();
-            }
-            @Override
-            public Adapter caseFaceletTaglibTagConverter(FaceletTaglibTagConverter object)
-            {
-                return createFaceletTaglibTagConverterAdapter();
-            }
-            @Override
-            public Adapter caseFaceletTaglibTagExtension(FaceletTaglibTagExtension object)
-            {
-                return createFaceletTaglibTagExtensionAdapter();
-            }
-            @Override
-            public Adapter caseFaceletTaglibTag(FaceletTaglibTag object)
-            {
-                return createFaceletTaglibTagAdapter();
-            }
-            @Override
-            public Adapter caseFaceletTaglibTagValidatorExtension(FaceletTaglibTagValidatorExtension object)
-            {
-                return createFaceletTaglibTagValidatorExtensionAdapter();
-            }
-            @Override
-            public Adapter caseFaceletTaglibTagValidator(FaceletTaglibTagValidator object)
-            {
-                return createFaceletTaglibTagValidatorAdapter();
-            }
-            @Override
-            public Adapter caseFaceletTaglib(FaceletTaglib object)
-            {
-                return createFaceletTaglibAdapter();
-            }
-            @Override
-            public Adapter caseFullyQualifiedClass(FullyQualifiedClass object)
-            {
-                return createFullyQualifiedClassAdapter();
-            }
-            @Override
-            public Adapter caseGenericBoolean(GenericBoolean object)
-            {
-                return createGenericBooleanAdapter();
-            }
-            @Override
-            public Adapter caseIcon(Icon object)
-            {
-                return createIconAdapter();
-            }
-            @Override
-            public Adapter caseJavaIdentifier(JavaIdentifier object)
-            {
-                return createJavaIdentifierAdapter();
-            }
-            @Override
-            public Adapter casePath(Path object)
-            {
-                return createPathAdapter();
-            }
-            @Override
-            public Adapter caseIdentifiableStringValue(IdentifiableStringValue object)
-            {
-                return createIdentifiableStringValueAdapter();
-            }
-            @Override
-            public Adapter caseIdentifiableLangStringValue(IdentifiableLangStringValue object)
-            {
-                return createIdentifiableLangStringValueAdapter();
-            }
-            @Override
-            public Adapter caseUserVisibleTaglibObject(UserVisibleTaglibObject object)
-            {
-                return createUserVisibleTaglibObjectAdapter();
-            }
-            @Override
-            public Adapter defaultCase(EObject object)
-            {
-                return createEObjectAdapter();
-            }
-        };
-
-    /**
-     * Creates an adapter for the <code>target</code>.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param target the object to adapt.
-     * @return the adapter for the <code>target</code>.
-     * @generated
-     */
-    @Override
-    public Adapter createAdapter(Notifier target)
-    {
-        return modelSwitch.doSwitch((EObject)target);
-    }
-
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.Description <em>Description</em>}'.
-     * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.Description
-     * @generated
-     */
-    public Adapter createDescriptionAdapter()
-    {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.DisplayName <em>Display Name</em>}'.
-     * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.DisplayName
-     * @generated
-     */
-    public Adapter createDisplayNameAdapter()
-    {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.DocumentRoot <em>Document Root</em>}'.
-     * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.DocumentRoot
-     * @generated
-     */
-    public Adapter createDocumentRootAdapter()
-    {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibCanonicalName <em>Canonical Name</em>}'.
-     * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibCanonicalName
-     * @generated
-     */
-    public Adapter createFaceletTaglibCanonicalNameAdapter()
-    {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibExtension <em>Extension</em>}'.
-     * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibExtension
-     * @generated
-     */
-    public Adapter createFaceletTaglibExtensionAdapter()
-    {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibFunction <em>Function</em>}'.
-     * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibFunction
-     * @generated
-     */
-    public Adapter createFaceletTaglibFunctionAdapter()
-    {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagAttribute <em>Tag Attribute</em>}'.
-     * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagAttribute
-     * @generated
-     */
-    public Adapter createFaceletTaglibTagAttributeAdapter()
-    {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagBehaviorExtension <em>Tag Behavior Extension</em>}'.
-     * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagBehaviorExtension
-     * @generated
-     */
-    public Adapter createFaceletTaglibTagBehaviorExtensionAdapter()
-    {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagBehavior <em>Tag Behavior</em>}'.
-     * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagBehavior
-     * @generated
-     */
-    public Adapter createFaceletTaglibTagBehaviorAdapter()
-    {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagComponentExtension <em>Tag Component Extension</em>}'.
-     * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagComponentExtension
-     * @generated
-     */
-    public Adapter createFaceletTaglibTagComponentExtensionAdapter()
-    {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagComponent <em>Tag Component</em>}'.
-     * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagComponent
-     * @generated
-     */
-    public Adapter createFaceletTaglibTagComponentAdapter()
-    {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagConverterExtension <em>Tag Converter Extension</em>}'.
-     * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagConverterExtension
-     * @generated
-     */
-    public Adapter createFaceletTaglibTagConverterExtensionAdapter()
-    {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagConverter <em>Tag Converter</em>}'.
-     * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagConverter
-     * @generated
-     */
-    public Adapter createFaceletTaglibTagConverterAdapter()
-    {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagExtension <em>Tag Extension</em>}'.
-     * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagExtension
-     * @generated
-     */
-    public Adapter createFaceletTaglibTagExtensionAdapter()
-    {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTag <em>Tag</em>}'.
-     * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTag
-     * @generated
-     */
-    public Adapter createFaceletTaglibTagAdapter()
-    {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagValidatorExtension <em>Tag Validator Extension</em>}'.
-     * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagValidatorExtension
-     * @generated
-     */
-    public Adapter createFaceletTaglibTagValidatorExtensionAdapter()
-    {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagValidator <em>Tag Validator</em>}'.
-     * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagValidator
-     * @generated
-     */
-    public Adapter createFaceletTaglibTagValidatorAdapter()
-    {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglib <em>Facelet Taglib</em>}'.
-     * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglib
-     * @generated
-     */
-    public Adapter createFaceletTaglibAdapter()
-    {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FullyQualifiedClass <em>Fully Qualified Class</em>}'.
-     * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FullyQualifiedClass
-     * @generated
-     */
-    public Adapter createFullyQualifiedClassAdapter()
-    {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.GenericBoolean <em>Generic Boolean</em>}'.
-     * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.GenericBoolean
-     * @generated
-     */
-    public Adapter createGenericBooleanAdapter()
-    {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.Icon <em>Icon</em>}'.
-     * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.Icon
-     * @generated
-     */
-    public Adapter createIconAdapter()
-    {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.JavaIdentifier <em>Java Identifier</em>}'.
-     * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.JavaIdentifier
-     * @generated
-     */
-    public Adapter createJavaIdentifierAdapter()
-    {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.Path <em>Path</em>}'.
-     * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.Path
-     * @generated
-     */
-    public Adapter createPathAdapter()
-    {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.IdentifiableStringValue <em>Identifiable String Value</em>}'.
-     * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.IdentifiableStringValue
-     * @generated
-     */
-    public Adapter createIdentifiableStringValueAdapter()
-    {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.IdentifiableLangStringValue <em>Identifiable Lang String Value</em>}'.
-     * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.IdentifiableLangStringValue
-     * @generated
-     */
-    public Adapter createIdentifiableLangStringValueAdapter()
-    {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.UserVisibleTaglibObject <em>User Visible Taglib Object</em>}'.
-     * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.UserVisibleTaglibObject
-     * @generated
-     */
-    public Adapter createUserVisibleTaglibObjectAdapter()
-    {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for the default case.
-     * <!-- begin-user-doc -->
-     * This default implementation returns null.
-     * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @generated
-     */
-    public Adapter createEObjectAdapter()
-    {
-        return null;
-    }
-
-} //FaceletTaglibAdapterFactory
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/util/FaceletTaglibResourceFactoryImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/util/FaceletTaglibResourceFactoryImpl.java
deleted file mode 100644
index 6c438eb..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/util/FaceletTaglibResourceFactoryImpl.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: FaceletTaglibResourceFactoryImpl.java,v 1.1 2010/03/18 06:24:41 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.util;
-
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.resource.impl.ResourceFactoryImpl;
-import org.eclipse.emf.ecore.xmi.XMLResource;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Resource Factory</b> associated with the package.
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.util.FaceletTaglibResourceImpl
- * @generated
- */
-public class FaceletTaglibResourceFactoryImpl extends ResourceFactoryImpl
-{
-    /**
-     * Creates an instance of the resource factory.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public FaceletTaglibResourceFactoryImpl()
-    {
-        super();
-    }
-
-    /**
-     * Creates an instance of the resource.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public Resource createResource(URI uri)
-    {
-        XMLResource result = new FaceletTaglibResourceImpl(uri);
-        result.getDefaultSaveOptions().put(XMLResource.OPTION_EXTENDED_META_DATA, Boolean.TRUE);
-        result.getDefaultLoadOptions().put(XMLResource.OPTION_EXTENDED_META_DATA, Boolean.TRUE);
-
-        result.getDefaultSaveOptions().put(XMLResource.OPTION_SCHEMA_LOCATION, Boolean.TRUE);
-
-        result.getDefaultLoadOptions().put(XMLResource.OPTION_USE_ENCODED_ATTRIBUTE_STYLE, Boolean.TRUE);
-        result.getDefaultSaveOptions().put(XMLResource.OPTION_USE_ENCODED_ATTRIBUTE_STYLE, Boolean.TRUE);
-
-        result.getDefaultLoadOptions().put(XMLResource.OPTION_USE_LEXICAL_HANDLER, Boolean.TRUE);
-        return result;
-    }
-
-} //FaceletTaglibResourceFactoryImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/util/FaceletTaglibResourceImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/util/FaceletTaglibResourceImpl.java
deleted file mode 100644
index b117ffe..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/util/FaceletTaglibResourceImpl.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: FaceletTaglibResourceImpl.java,v 1.1 2010/03/18 06:24:41 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.util;
-
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.xmi.XMLLoad;
-import org.eclipse.emf.ecore.xmi.impl.SAXXMLHandler;
-import org.eclipse.emf.ecore.xmi.impl.XMLLoadImpl;
-import org.eclipse.emf.ecore.xmi.impl.XMLResourceImpl;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage;
-import org.xml.sax.helpers.DefaultHandler;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Resource </b> associated with the package.
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.util.FaceletTaglibResourceFactoryImpl
- * @generated
- */
-public class FaceletTaglibResourceImpl extends XMLResourceImpl
-{
-    /**
-     * Creates an instance of the resource.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param uri the URI of the new resource.
-     * @generated
-     */
-    public FaceletTaglibResourceImpl(URI uri)
-    {
-        super(uri);
-    }
-
-    @Override
-    protected XMLLoad createXMLLoad()
-    {
-        return new XMLLoadImpl(createXMLHelper())
-        {
-
-            @Override
-            protected DefaultHandler makeDefaultHandler()
-            {
-                return new SAXXMLHandler(resource, helper, options)
-                {
-
-                    @Override
-                    protected void handleXMLNSAttribute(final String attrib,
-                            final String value)
-                    {
-                        String useValue = value;
-                        if ("xmlns".equals(attrib)) //$NON-NLS-1$
-                        {
-                            useValue = FaceletTaglibPackage.eNS_URI;
-                        }
-                        super.handleXMLNSAttribute(attrib, useValue);
-                    }
-                    
-                };
-            }
-            
-        };
-    }
-
-} //FaceletTaglibResourceImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/util/FaceletTaglibSwitch.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/util/FaceletTaglibSwitch.java
deleted file mode 100644
index b0c1b46..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/util/FaceletTaglibSwitch.java
+++ /dev/null
@@ -1,762 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: FaceletTaglibSwitch.java,v 1.2 2010/03/18 06:24:41 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.util;
-
-import java.util.List;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.Description;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.DisplayName;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.DocumentRoot;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglib;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibCanonicalName;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibExtension;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibFunction;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTag;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagAttribute;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagBehavior;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagBehaviorExtension;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagComponent;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagComponentExtension;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagConverter;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagConverterExtension;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagExtension;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagValidator;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagValidatorExtension;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FullyQualifiedClass;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.GenericBoolean;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.Icon;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.IdentifiableLangStringValue;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.IdentifiableStringValue;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.JavaIdentifier;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.Path;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.UserVisibleTaglibObject;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Switch</b> for the model's inheritance hierarchy.
- * It supports the call {@link #doSwitch(EObject) doSwitch(object)}
- * to invoke the <code>caseXXX</code> method for each class of the model,
- * starting with the actual class of the object
- * and proceeding up the inheritance hierarchy
- * until a non-null result is returned,
- * which is the result of the switch.
- * @param <T> 
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage
- * @generated
- */
-public class FaceletTaglibSwitch<T>
-{
-    /**
-     * The cached model package
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected static FaceletTaglibPackage modelPackage;
-
-    /**
-     * Creates an instance of the switch.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public FaceletTaglibSwitch()
-    {
-        if (modelPackage == null)
-        {
-            modelPackage = FaceletTaglibPackage.eINSTANCE;
-        }
-    }
-
-    /**
-     * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
-     * <!-- begin-user-doc -->
-     * @param theEObject 
-     * <!-- end-user-doc -->
-     * @return the first non-null result returned by a <code>caseXXX</code> call.
-     * @generated
-     */
-    public T doSwitch(EObject theEObject)
-    {
-        return doSwitch(theEObject.eClass(), theEObject);
-    }
-
-    /**
-     * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
-     * <!-- begin-user-doc -->
-     * @param theEClass 
-     * @param theEObject 
-     * <!-- end-user-doc -->
-     * @return the first non-null result returned by a <code>caseXXX</code> call.
-     * @generated
-     */
-    protected T doSwitch(EClass theEClass, EObject theEObject)
-    {
-        if (theEClass.eContainer() == modelPackage)
-        {
-            return doSwitch(theEClass.getClassifierID(), theEObject);
-        }
-        List<EClass> eSuperTypes = theEClass.getESuperTypes();
-        return
-            eSuperTypes.isEmpty() ?
-                defaultCase(theEObject) :
-                doSwitch(eSuperTypes.get(0), theEObject);
-    }
-
-    /**
-     * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
-     * <!-- begin-user-doc -->
-     * @param classifierID 
-     * @param theEObject 
-     * <!-- end-user-doc -->
-     * @return the first non-null result returned by a <code>caseXXX</code> call.
-     * @generated
-     */
-    protected T doSwitch(int classifierID, EObject theEObject)
-    {
-        switch (classifierID)
-        {
-            case FaceletTaglibPackage.DESCRIPTION:
-            {
-                Description description = (Description)theEObject;
-                T result = caseDescription(description);
-                if (result == null) result = caseIdentifiableLangStringValue(description);
-                if (result == null) result = caseIdentifiableStringValue(description);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FaceletTaglibPackage.DISPLAY_NAME:
-            {
-                DisplayName displayName = (DisplayName)theEObject;
-                T result = caseDisplayName(displayName);
-                if (result == null) result = caseIdentifiableLangStringValue(displayName);
-                if (result == null) result = caseIdentifiableStringValue(displayName);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FaceletTaglibPackage.DOCUMENT_ROOT:
-            {
-                DocumentRoot documentRoot = (DocumentRoot)theEObject;
-                T result = caseDocumentRoot(documentRoot);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FaceletTaglibPackage.FACELET_TAGLIB_CANONICAL_NAME:
-            {
-                FaceletTaglibCanonicalName faceletTaglibCanonicalName = (FaceletTaglibCanonicalName)theEObject;
-                T result = caseFaceletTaglibCanonicalName(faceletTaglibCanonicalName);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FaceletTaglibPackage.FACELET_TAGLIB_EXTENSION:
-            {
-                FaceletTaglibExtension faceletTaglibExtension = (FaceletTaglibExtension)theEObject;
-                T result = caseFaceletTaglibExtension(faceletTaglibExtension);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FaceletTaglibPackage.FACELET_TAGLIB_FUNCTION:
-            {
-                FaceletTaglibFunction faceletTaglibFunction = (FaceletTaglibFunction)theEObject;
-                T result = caseFaceletTaglibFunction(faceletTaglibFunction);
-                if (result == null) result = caseUserVisibleTaglibObject(faceletTaglibFunction);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_ATTRIBUTE:
-            {
-                FaceletTaglibTagAttribute faceletTaglibTagAttribute = (FaceletTaglibTagAttribute)theEObject;
-                T result = caseFaceletTaglibTagAttribute(faceletTaglibTagAttribute);
-                if (result == null) result = caseUserVisibleTaglibObject(faceletTaglibTagAttribute);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_BEHAVIOR_EXTENSION:
-            {
-                FaceletTaglibTagBehaviorExtension faceletTaglibTagBehaviorExtension = (FaceletTaglibTagBehaviorExtension)theEObject;
-                T result = caseFaceletTaglibTagBehaviorExtension(faceletTaglibTagBehaviorExtension);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_BEHAVIOR:
-            {
-                FaceletTaglibTagBehavior faceletTaglibTagBehavior = (FaceletTaglibTagBehavior)theEObject;
-                T result = caseFaceletTaglibTagBehavior(faceletTaglibTagBehavior);
-                if (result == null) result = caseUserVisibleTaglibObject(faceletTaglibTagBehavior);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_COMPONENT_EXTENSION:
-            {
-                FaceletTaglibTagComponentExtension faceletTaglibTagComponentExtension = (FaceletTaglibTagComponentExtension)theEObject;
-                T result = caseFaceletTaglibTagComponentExtension(faceletTaglibTagComponentExtension);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_COMPONENT:
-            {
-                FaceletTaglibTagComponent faceletTaglibTagComponent = (FaceletTaglibTagComponent)theEObject;
-                T result = caseFaceletTaglibTagComponent(faceletTaglibTagComponent);
-                if (result == null) result = caseUserVisibleTaglibObject(faceletTaglibTagComponent);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_CONVERTER_EXTENSION:
-            {
-                FaceletTaglibTagConverterExtension faceletTaglibTagConverterExtension = (FaceletTaglibTagConverterExtension)theEObject;
-                T result = caseFaceletTaglibTagConverterExtension(faceletTaglibTagConverterExtension);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_CONVERTER:
-            {
-                FaceletTaglibTagConverter faceletTaglibTagConverter = (FaceletTaglibTagConverter)theEObject;
-                T result = caseFaceletTaglibTagConverter(faceletTaglibTagConverter);
-                if (result == null) result = caseUserVisibleTaglibObject(faceletTaglibTagConverter);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_EXTENSION:
-            {
-                FaceletTaglibTagExtension faceletTaglibTagExtension = (FaceletTaglibTagExtension)theEObject;
-                T result = caseFaceletTaglibTagExtension(faceletTaglibTagExtension);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG:
-            {
-                FaceletTaglibTag faceletTaglibTag = (FaceletTaglibTag)theEObject;
-                T result = caseFaceletTaglibTag(faceletTaglibTag);
-                if (result == null) result = caseUserVisibleTaglibObject(faceletTaglibTag);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_VALIDATOR_EXTENSION:
-            {
-                FaceletTaglibTagValidatorExtension faceletTaglibTagValidatorExtension = (FaceletTaglibTagValidatorExtension)theEObject;
-                T result = caseFaceletTaglibTagValidatorExtension(faceletTaglibTagValidatorExtension);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_VALIDATOR:
-            {
-                FaceletTaglibTagValidator faceletTaglibTagValidator = (FaceletTaglibTagValidator)theEObject;
-                T result = caseFaceletTaglibTagValidator(faceletTaglibTagValidator);
-                if (result == null) result = caseUserVisibleTaglibObject(faceletTaglibTagValidator);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FaceletTaglibPackage.FACELET_TAGLIB:
-            {
-                FaceletTaglib faceletTaglib = (FaceletTaglib)theEObject;
-                T result = caseFaceletTaglib(faceletTaglib);
-                if (result == null) result = caseUserVisibleTaglibObject(faceletTaglib);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FaceletTaglibPackage.FULLY_QUALIFIED_CLASS:
-            {
-                FullyQualifiedClass fullyQualifiedClass = (FullyQualifiedClass)theEObject;
-                T result = caseFullyQualifiedClass(fullyQualifiedClass);
-                if (result == null) result = caseIdentifiableStringValue(fullyQualifiedClass);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FaceletTaglibPackage.GENERIC_BOOLEAN:
-            {
-                GenericBoolean genericBoolean = (GenericBoolean)theEObject;
-                T result = caseGenericBoolean(genericBoolean);
-                if (result == null) result = caseIdentifiableStringValue(genericBoolean);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FaceletTaglibPackage.ICON:
-            {
-                Icon icon = (Icon)theEObject;
-                T result = caseIcon(icon);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FaceletTaglibPackage.JAVA_IDENTIFIER:
-            {
-                JavaIdentifier javaIdentifier = (JavaIdentifier)theEObject;
-                T result = caseJavaIdentifier(javaIdentifier);
-                if (result == null) result = caseIdentifiableStringValue(javaIdentifier);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FaceletTaglibPackage.PATH:
-            {
-                Path path = (Path)theEObject;
-                T result = casePath(path);
-                if (result == null) result = caseIdentifiableStringValue(path);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FaceletTaglibPackage.IDENTIFIABLE_STRING_VALUE:
-            {
-                IdentifiableStringValue identifiableStringValue = (IdentifiableStringValue)theEObject;
-                T result = caseIdentifiableStringValue(identifiableStringValue);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FaceletTaglibPackage.IDENTIFIABLE_LANG_STRING_VALUE:
-            {
-                IdentifiableLangStringValue identifiableLangStringValue = (IdentifiableLangStringValue)theEObject;
-                T result = caseIdentifiableLangStringValue(identifiableLangStringValue);
-                if (result == null) result = caseIdentifiableStringValue(identifiableLangStringValue);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FaceletTaglibPackage.USER_VISIBLE_TAGLIB_OBJECT:
-            {
-                UserVisibleTaglibObject userVisibleTaglibObject = (UserVisibleTaglibObject)theEObject;
-                T result = caseUserVisibleTaglibObject(userVisibleTaglibObject);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            default: return defaultCase(theEObject);
-        }
-    }
-
-    /**
-     * Returns the result of interpreting the object as an instance of '<em>Description</em>'.
-     * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpreting the object as an instance of '<em>Description</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-    public T caseDescription(Description object)
-    {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpreting the object as an instance of '<em>Display Name</em>'.
-     * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpreting the object as an instance of '<em>Display Name</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-    public T caseDisplayName(DisplayName object)
-    {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpreting the object as an instance of '<em>Document Root</em>'.
-     * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpreting the object as an instance of '<em>Document Root</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-    public T caseDocumentRoot(DocumentRoot object)
-    {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpreting the object as an instance of '<em>Canonical Name</em>'.
-     * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpreting the object as an instance of '<em>Canonical Name</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-    public T caseFaceletTaglibCanonicalName(FaceletTaglibCanonicalName object)
-    {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpreting the object as an instance of '<em>Extension</em>'.
-     * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpreting the object as an instance of '<em>Extension</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-    public T caseFaceletTaglibExtension(FaceletTaglibExtension object)
-    {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpreting the object as an instance of '<em>Function</em>'.
-     * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpreting the object as an instance of '<em>Function</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-    public T caseFaceletTaglibFunction(FaceletTaglibFunction object)
-    {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpreting the object as an instance of '<em>Tag Attribute</em>'.
-     * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpreting the object as an instance of '<em>Tag Attribute</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-    public T caseFaceletTaglibTagAttribute(FaceletTaglibTagAttribute object)
-    {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpreting the object as an instance of '<em>Tag Behavior Extension</em>'.
-     * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpreting the object as an instance of '<em>Tag Behavior Extension</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-    public T caseFaceletTaglibTagBehaviorExtension(FaceletTaglibTagBehaviorExtension object)
-    {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpreting the object as an instance of '<em>Tag Behavior</em>'.
-     * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpreting the object as an instance of '<em>Tag Behavior</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-    public T caseFaceletTaglibTagBehavior(FaceletTaglibTagBehavior object)
-    {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpreting the object as an instance of '<em>Tag Component Extension</em>'.
-     * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpreting the object as an instance of '<em>Tag Component Extension</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-    public T caseFaceletTaglibTagComponentExtension(FaceletTaglibTagComponentExtension object)
-    {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpreting the object as an instance of '<em>Tag Component</em>'.
-     * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpreting the object as an instance of '<em>Tag Component</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-    public T caseFaceletTaglibTagComponent(FaceletTaglibTagComponent object)
-    {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpreting the object as an instance of '<em>Tag Converter Extension</em>'.
-     * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpreting the object as an instance of '<em>Tag Converter Extension</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-    public T caseFaceletTaglibTagConverterExtension(FaceletTaglibTagConverterExtension object)
-    {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpreting the object as an instance of '<em>Tag Converter</em>'.
-     * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpreting the object as an instance of '<em>Tag Converter</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-    public T caseFaceletTaglibTagConverter(FaceletTaglibTagConverter object)
-    {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpreting the object as an instance of '<em>Tag Extension</em>'.
-     * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpreting the object as an instance of '<em>Tag Extension</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-    public T caseFaceletTaglibTagExtension(FaceletTaglibTagExtension object)
-    {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpreting the object as an instance of '<em>Tag</em>'.
-     * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpreting the object as an instance of '<em>Tag</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-    public T caseFaceletTaglibTag(FaceletTaglibTag object)
-    {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpreting the object as an instance of '<em>Tag Validator Extension</em>'.
-     * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpreting the object as an instance of '<em>Tag Validator Extension</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-    public T caseFaceletTaglibTagValidatorExtension(FaceletTaglibTagValidatorExtension object)
-    {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpreting the object as an instance of '<em>Tag Validator</em>'.
-     * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpreting the object as an instance of '<em>Tag Validator</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-    public T caseFaceletTaglibTagValidator(FaceletTaglibTagValidator object)
-    {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpreting the object as an instance of '<em>Facelet Taglib</em>'.
-     * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpreting the object as an instance of '<em>Facelet Taglib</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-    public T caseFaceletTaglib(FaceletTaglib object)
-    {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpreting the object as an instance of '<em>Fully Qualified Class</em>'.
-     * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpreting the object as an instance of '<em>Fully Qualified Class</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-    public T caseFullyQualifiedClass(FullyQualifiedClass object)
-    {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpreting the object as an instance of '<em>Generic Boolean</em>'.
-     * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpreting the object as an instance of '<em>Generic Boolean</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-    public T caseGenericBoolean(GenericBoolean object)
-    {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpreting the object as an instance of '<em>Icon</em>'.
-     * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpreting the object as an instance of '<em>Icon</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-    public T caseIcon(Icon object)
-    {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpreting the object as an instance of '<em>Java Identifier</em>'.
-     * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpreting the object as an instance of '<em>Java Identifier</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-    public T caseJavaIdentifier(JavaIdentifier object)
-    {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpreting the object as an instance of '<em>Path</em>'.
-     * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpreting the object as an instance of '<em>Path</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-    public T casePath(Path object)
-    {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpreting the object as an instance of '<em>Identifiable String Value</em>'.
-     * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpreting the object as an instance of '<em>Identifiable String Value</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-    public T caseIdentifiableStringValue(IdentifiableStringValue object)
-    {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpreting the object as an instance of '<em>Identifiable Lang String Value</em>'.
-     * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpreting the object as an instance of '<em>Identifiable Lang String Value</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-    public T caseIdentifiableLangStringValue(IdentifiableLangStringValue object)
-    {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpreting the object as an instance of '<em>User Visible Taglib Object</em>'.
-     * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpreting the object as an instance of '<em>User Visible Taglib Object</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-    public T caseUserVisibleTaglibObject(UserVisibleTaglibObject object)
-    {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpreting the object as an instance of '<em>EObject</em>'.
-     * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch, but this is the last case anyway.
-     * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpreting the object as an instance of '<em>EObject</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject)
-     * @generated
-     */
-    public T defaultCase(EObject object)
-    {
-        return null;
-    }
-
-} //FaceletTaglibSwitch
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/util/FaceletTaglibValidator.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/util/FaceletTaglibValidator.java
deleted file mode 100644
index 2faf923..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/util/FaceletTaglibValidator.java
+++ /dev/null
@@ -1,698 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: FaceletTaglibValidator.java,v 1.1 2010/03/18 06:24:40 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.util;
-
-import java.util.Map;
-
-import org.eclipse.emf.common.util.DiagnosticChain;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.util.EObjectValidator;
-import org.eclipse.emf.ecore.xml.type.util.XMLTypeUtil;
-import org.eclipse.emf.ecore.xml.type.util.XMLTypeValidator;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.Description;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.DisplayName;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.DocumentRoot;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglib;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibCanonicalName;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibExtension;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibFunction;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTag;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagAttribute;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagBehavior;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagBehaviorExtension;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagComponent;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagComponentExtension;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagConverter;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagConverterExtension;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagExtension;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagValidator;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagValidatorExtension;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibVersion;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FullyQualifiedClass;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.GenericBoolean;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.GenericBooleanBase;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.Icon;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.IdentifiableLangStringValue;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.IdentifiableStringValue;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.JavaIdentifier;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.Path;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.UserVisibleTaglibObject;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Validator</b> for the model.
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage
- * @generated
- */
-public class FaceletTaglibValidator extends EObjectValidator
-{
-    /**
-     * The cached model package
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @SuppressWarnings("hiding")
-    public static final FaceletTaglibValidator INSTANCE = new FaceletTaglibValidator();
-
-    /**
-     * A constant for the {@link org.eclipse.emf.common.util.Diagnostic#getSource() source} of diagnostic {@link org.eclipse.emf.common.util.Diagnostic#getCode() codes} from this package.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.emf.common.util.Diagnostic#getSource()
-     * @see org.eclipse.emf.common.util.Diagnostic#getCode()
-     * @generated
-     */
-    @SuppressWarnings("hiding")
-    public static final String DIAGNOSTIC_SOURCE = "org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib"; //$NON-NLS-1$
-
-    /**
-     * A constant with a fixed name that can be used as the base value for additional hand written constants.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private static final int GENERATED_DIAGNOSTIC_CODE_COUNT = 0;
-
-    /**
-     * A constant with a fixed name that can be used as the base value for additional hand written constants in a derived class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected static final int DIAGNOSTIC_CODE_COUNT = GENERATED_DIAGNOSTIC_CODE_COUNT;
-
-    /**
-     * The cached base package validator.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected XMLTypeValidator xmlTypeValidator;
-
-    /**
-     * Creates an instance of the switch.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public FaceletTaglibValidator()
-    {
-        super();
-        xmlTypeValidator = XMLTypeValidator.INSTANCE;
-    }
-
-    /**
-     * Returns the package of this validator switch.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    protected EPackage getEPackage()
-    {
-      return FaceletTaglibPackage.eINSTANCE;
-    }
-
-    /**
-     * Calls <code>validateXXX</code> for the corresponding classifier of the model.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    protected boolean validate(int classifierID, Object value, DiagnosticChain diagnostics, Map<Object, Object> context)
-    {
-        switch (classifierID)
-        {
-            case FaceletTaglibPackage.DESCRIPTION:
-                return validateDescription((Description)value, diagnostics, context);
-            case FaceletTaglibPackage.DISPLAY_NAME:
-                return validateDisplayName((DisplayName)value, diagnostics, context);
-            case FaceletTaglibPackage.DOCUMENT_ROOT:
-                return validateDocumentRoot((DocumentRoot)value, diagnostics, context);
-            case FaceletTaglibPackage.FACELET_TAGLIB_CANONICAL_NAME:
-                return validateFaceletTaglibCanonicalName((FaceletTaglibCanonicalName)value, diagnostics, context);
-            case FaceletTaglibPackage.FACELET_TAGLIB_EXTENSION:
-                return validateFaceletTaglibExtension((FaceletTaglibExtension)value, diagnostics, context);
-            case FaceletTaglibPackage.FACELET_TAGLIB_FUNCTION:
-                return validateFaceletTaglibFunction((FaceletTaglibFunction)value, diagnostics, context);
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_ATTRIBUTE:
-                return validateFaceletTaglibTagAttribute((FaceletTaglibTagAttribute)value, diagnostics, context);
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_BEHAVIOR_EXTENSION:
-                return validateFaceletTaglibTagBehaviorExtension((FaceletTaglibTagBehaviorExtension)value, diagnostics, context);
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_BEHAVIOR:
-                return validateFaceletTaglibTagBehavior((FaceletTaglibTagBehavior)value, diagnostics, context);
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_COMPONENT_EXTENSION:
-                return validateFaceletTaglibTagComponentExtension((FaceletTaglibTagComponentExtension)value, diagnostics, context);
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_COMPONENT:
-                return validateFaceletTaglibTagComponent((FaceletTaglibTagComponent)value, diagnostics, context);
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_CONVERTER_EXTENSION:
-                return validateFaceletTaglibTagConverterExtension((FaceletTaglibTagConverterExtension)value, diagnostics, context);
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_CONVERTER:
-                return validateFaceletTaglibTagConverter((FaceletTaglibTagConverter)value, diagnostics, context);
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_EXTENSION:
-                return validateFaceletTaglibTagExtension((FaceletTaglibTagExtension)value, diagnostics, context);
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG:
-                return validateFaceletTaglibTag((FaceletTaglibTag)value, diagnostics, context);
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_VALIDATOR_EXTENSION:
-                return validateFaceletTaglibTagValidatorExtension((FaceletTaglibTagValidatorExtension)value, diagnostics, context);
-            case FaceletTaglibPackage.FACELET_TAGLIB_TAG_VALIDATOR:
-                return validateFaceletTaglibTagValidator((FaceletTaglibTagValidator)value, diagnostics, context);
-            case FaceletTaglibPackage.FACELET_TAGLIB:
-                return validateFaceletTaglib((FaceletTaglib)value, diagnostics, context);
-            case FaceletTaglibPackage.FULLY_QUALIFIED_CLASS:
-                return validateFullyQualifiedClass((FullyQualifiedClass)value, diagnostics, context);
-            case FaceletTaglibPackage.GENERIC_BOOLEAN:
-                return validateGenericBoolean((GenericBoolean)value, diagnostics, context);
-            case FaceletTaglibPackage.ICON:
-                return validateIcon((Icon)value, diagnostics, context);
-            case FaceletTaglibPackage.JAVA_IDENTIFIER:
-                return validateJavaIdentifier((JavaIdentifier)value, diagnostics, context);
-            case FaceletTaglibPackage.PATH:
-                return validatePath((Path)value, diagnostics, context);
-            case FaceletTaglibPackage.IDENTIFIABLE_STRING_VALUE:
-                return validateIdentifiableStringValue((IdentifiableStringValue)value, diagnostics, context);
-            case FaceletTaglibPackage.IDENTIFIABLE_LANG_STRING_VALUE:
-                return validateIdentifiableLangStringValue((IdentifiableLangStringValue)value, diagnostics, context);
-            case FaceletTaglibPackage.USER_VISIBLE_TAGLIB_OBJECT:
-                return validateUserVisibleTaglibObject((UserVisibleTaglibObject)value, diagnostics, context);
-            case FaceletTaglibPackage.FACELET_TAGLIB_VERSION:
-                return validateFaceletTaglibVersion((FaceletTaglibVersion)value, diagnostics, context);
-            case FaceletTaglibPackage.GENERIC_BOOLEAN_BASE:
-                return validateGenericBooleanBase((GenericBooleanBase)value, diagnostics, context);
-            case FaceletTaglibPackage.FACELET_TAGLIB_VERSION_TYPE_OBJECT:
-                return validateFaceletTaglibVersionTypeObject((FaceletTaglibVersion)value, diagnostics, context);
-            case FaceletTaglibPackage.FULLY_QUALIFIED_CLASS_BASE:
-                return validateFullyQualifiedClassBase((String)value, diagnostics, context);
-            case FaceletTaglibPackage.JAVA_IDENTIFIER_BASE:
-                return validateJavaIdentifierBase((String)value, diagnostics, context);
-            case FaceletTaglibPackage.PATH_TYPE_BASE:
-                return validatePathTypeBase((String)value, diagnostics, context);
-            default:
-                return true;
-        }
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param description 
-     * @param diagnostics 
-     * @param context 
-     * @return 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean validateDescription(Description description, DiagnosticChain diagnostics, Map<Object, Object> context)
-    {
-        return validate_EveryDefaultConstraint(description, diagnostics, context);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param displayName 
-     * @param diagnostics 
-     * @param context 
-     * @return 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean validateDisplayName(DisplayName displayName, DiagnosticChain diagnostics, Map<Object, Object> context)
-    {
-        return validate_EveryDefaultConstraint(displayName, diagnostics, context);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param documentRoot 
-     * @param diagnostics 
-     * @param context 
-     * @return 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean validateDocumentRoot(DocumentRoot documentRoot, DiagnosticChain diagnostics, Map<Object, Object> context)
-    {
-        return validate_EveryDefaultConstraint(documentRoot, diagnostics, context);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param faceletTaglibCanonicalName 
-     * @param diagnostics 
-     * @param context 
-     * @return 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean validateFaceletTaglibCanonicalName(FaceletTaglibCanonicalName faceletTaglibCanonicalName, DiagnosticChain diagnostics, Map<Object, Object> context)
-    {
-        return validate_EveryDefaultConstraint(faceletTaglibCanonicalName, diagnostics, context);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param faceletTaglibExtension 
-     * @param diagnostics 
-     * @param context 
-     * @return 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean validateFaceletTaglibExtension(FaceletTaglibExtension faceletTaglibExtension, DiagnosticChain diagnostics, Map<Object, Object> context)
-    {
-        return validate_EveryDefaultConstraint(faceletTaglibExtension, diagnostics, context);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param faceletTaglibFunction 
-     * @param diagnostics 
-     * @param context 
-     * @return 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean validateFaceletTaglibFunction(FaceletTaglibFunction faceletTaglibFunction, DiagnosticChain diagnostics, Map<Object, Object> context)
-    {
-        return validate_EveryDefaultConstraint(faceletTaglibFunction, diagnostics, context);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param faceletTaglibTagAttribute 
-     * @param diagnostics 
-     * @param context 
-     * @return 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean validateFaceletTaglibTagAttribute(FaceletTaglibTagAttribute faceletTaglibTagAttribute, DiagnosticChain diagnostics, Map<Object, Object> context)
-    {
-        return validate_EveryDefaultConstraint(faceletTaglibTagAttribute, diagnostics, context);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param faceletTaglibTagBehaviorExtension 
-     * @param diagnostics 
-     * @param context 
-     * @return 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean validateFaceletTaglibTagBehaviorExtension(FaceletTaglibTagBehaviorExtension faceletTaglibTagBehaviorExtension, DiagnosticChain diagnostics, Map<Object, Object> context)
-    {
-        return validate_EveryDefaultConstraint(faceletTaglibTagBehaviorExtension, diagnostics, context);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param faceletTaglibTagBehavior 
-     * @param diagnostics 
-     * @param context 
-     * @return 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean validateFaceletTaglibTagBehavior(FaceletTaglibTagBehavior faceletTaglibTagBehavior, DiagnosticChain diagnostics, Map<Object, Object> context)
-    {
-        return validate_EveryDefaultConstraint(faceletTaglibTagBehavior, diagnostics, context);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param faceletTaglibTagComponentExtension 
-     * @param diagnostics 
-     * @param context 
-     * @return 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean validateFaceletTaglibTagComponentExtension(FaceletTaglibTagComponentExtension faceletTaglibTagComponentExtension, DiagnosticChain diagnostics, Map<Object, Object> context)
-    {
-        return validate_EveryDefaultConstraint(faceletTaglibTagComponentExtension, diagnostics, context);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param faceletTaglibTagComponent 
-     * @param diagnostics 
-     * @param context 
-     * @return 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean validateFaceletTaglibTagComponent(FaceletTaglibTagComponent faceletTaglibTagComponent, DiagnosticChain diagnostics, Map<Object, Object> context)
-    {
-        return validate_EveryDefaultConstraint(faceletTaglibTagComponent, diagnostics, context);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param faceletTaglibTagConverterExtension 
-     * @param diagnostics 
-     * @param context 
-     * @return 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean validateFaceletTaglibTagConverterExtension(FaceletTaglibTagConverterExtension faceletTaglibTagConverterExtension, DiagnosticChain diagnostics, Map<Object, Object> context)
-    {
-        return validate_EveryDefaultConstraint(faceletTaglibTagConverterExtension, diagnostics, context);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param faceletTaglibTagConverter 
-     * @param diagnostics 
-     * @param context 
-     * @return 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean validateFaceletTaglibTagConverter(FaceletTaglibTagConverter faceletTaglibTagConverter, DiagnosticChain diagnostics, Map<Object, Object> context)
-    {
-        return validate_EveryDefaultConstraint(faceletTaglibTagConverter, diagnostics, context);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param faceletTaglibTagExtension 
-     * @param diagnostics 
-     * @param context 
-     * @return 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean validateFaceletTaglibTagExtension(FaceletTaglibTagExtension faceletTaglibTagExtension, DiagnosticChain diagnostics, Map<Object, Object> context)
-    {
-        return validate_EveryDefaultConstraint(faceletTaglibTagExtension, diagnostics, context);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param faceletTaglibTag 
-     * @param diagnostics 
-     * @param context 
-     * @return 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean validateFaceletTaglibTag(FaceletTaglibTag faceletTaglibTag, DiagnosticChain diagnostics, Map<Object, Object> context)
-    {
-        return validate_EveryDefaultConstraint(faceletTaglibTag, diagnostics, context);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param faceletTaglibTagValidatorExtension 
-     * @param diagnostics 
-     * @param context 
-     * @return 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean validateFaceletTaglibTagValidatorExtension(FaceletTaglibTagValidatorExtension faceletTaglibTagValidatorExtension, DiagnosticChain diagnostics, Map<Object, Object> context)
-    {
-        return validate_EveryDefaultConstraint(faceletTaglibTagValidatorExtension, diagnostics, context);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param faceletTaglibTagValidator 
-     * @param diagnostics 
-     * @param context 
-     * @return 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean validateFaceletTaglibTagValidator(FaceletTaglibTagValidator faceletTaglibTagValidator, DiagnosticChain diagnostics, Map<Object, Object> context)
-    {
-        return validate_EveryDefaultConstraint(faceletTaglibTagValidator, diagnostics, context);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param faceletTaglib 
-     * @param diagnostics 
-     * @param context 
-     * @return 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean validateFaceletTaglib(FaceletTaglib faceletTaglib, DiagnosticChain diagnostics, Map<Object, Object> context)
-    {
-        return validate_EveryDefaultConstraint(faceletTaglib, diagnostics, context);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param fullyQualifiedClass 
-     * @param diagnostics 
-     * @param context 
-     * @return 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean validateFullyQualifiedClass(FullyQualifiedClass fullyQualifiedClass, DiagnosticChain diagnostics, Map<Object, Object> context)
-    {
-        return validate_EveryDefaultConstraint(fullyQualifiedClass, diagnostics, context);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param genericBoolean 
-     * @param diagnostics 
-     * @param context 
-     * @return 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean validateGenericBoolean(GenericBoolean genericBoolean, DiagnosticChain diagnostics, Map<Object, Object> context)
-    {
-        return validate_EveryDefaultConstraint(genericBoolean, diagnostics, context);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param icon 
-     * @param diagnostics 
-     * @param context 
-     * @return 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean validateIcon(Icon icon, DiagnosticChain diagnostics, Map<Object, Object> context)
-    {
-        return validate_EveryDefaultConstraint(icon, diagnostics, context);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param javaIdentifier 
-     * @param diagnostics 
-     * @param context 
-     * @return 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean validateJavaIdentifier(JavaIdentifier javaIdentifier, DiagnosticChain diagnostics, Map<Object, Object> context)
-    {
-        return validate_EveryDefaultConstraint(javaIdentifier, diagnostics, context);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param path 
-     * @param diagnostics 
-     * @param context 
-     * @return 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean validatePath(Path path, DiagnosticChain diagnostics, Map<Object, Object> context)
-    {
-        return validate_EveryDefaultConstraint(path, diagnostics, context);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param identifiableStringValue 
-     * @param diagnostics 
-     * @param context 
-     * @return 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean validateIdentifiableStringValue(IdentifiableStringValue identifiableStringValue, DiagnosticChain diagnostics, Map<Object, Object> context)
-    {
-        return validate_EveryDefaultConstraint(identifiableStringValue, diagnostics, context);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param identifiableLangStringValue 
-     * @param diagnostics 
-     * @param context 
-     * @return 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean validateIdentifiableLangStringValue(IdentifiableLangStringValue identifiableLangStringValue, DiagnosticChain diagnostics, Map<Object, Object> context)
-    {
-        return validate_EveryDefaultConstraint(identifiableLangStringValue, diagnostics, context);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param userVisibleTaglibObject 
-     * @param diagnostics 
-     * @param context 
-     * @return 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean validateUserVisibleTaglibObject(UserVisibleTaglibObject userVisibleTaglibObject, DiagnosticChain diagnostics, Map<Object, Object> context)
-    {
-        return validate_EveryDefaultConstraint(userVisibleTaglibObject, diagnostics, context);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param faceletTaglibVersion 
-     * @param diagnostics 
-     * @param context 
-     * @return 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean validateFaceletTaglibVersion(FaceletTaglibVersion faceletTaglibVersion, DiagnosticChain diagnostics, Map<Object, Object> context)
-    {
-        return true;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param genericBooleanBase 
-     * @param diagnostics 
-     * @param context 
-     * @return 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean validateGenericBooleanBase(GenericBooleanBase genericBooleanBase, DiagnosticChain diagnostics, Map<Object, Object> context)
-    {
-        return true;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param faceletTaglibVersionTypeObject 
-     * @param diagnostics 
-     * @param context 
-     * @return 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean validateFaceletTaglibVersionTypeObject(FaceletTaglibVersion faceletTaglibVersionTypeObject, DiagnosticChain diagnostics, Map<Object, Object> context)
-    {
-        return true;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param fullyQualifiedClassBase 
-     * @param diagnostics 
-     * @param context 
-     * @return 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean validateFullyQualifiedClassBase(String fullyQualifiedClassBase, DiagnosticChain diagnostics, Map<Object, Object> context)
-    {
-        return true;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param javaIdentifierBase 
-     * @param diagnostics 
-     * @param context 
-     * @return 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean validateJavaIdentifierBase(String javaIdentifierBase, DiagnosticChain diagnostics, Map<Object, Object> context)
-    {
-        boolean result = validateJavaIdentifierBase_Pattern(javaIdentifierBase, diagnostics, context);
-        return result;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @see #validateJavaIdentifierBase_Pattern
-     */
-    public static final  PatternMatcher [][] JAVA_IDENTIFIER_BASE__PATTERN__VALUES =
-        new PatternMatcher [][]
-        {
-            new PatternMatcher []
-            {
-                XMLTypeUtil.createPatternMatcher("($|_|\\p{L})(\\p{L}|\\p{Nd}|_|$)*") //$NON-NLS-1$
-            }
-        };
-
-    /**
-     * Validates the Pattern constraint of '<em>Java Identifier Base</em>'.
-     * <!-- begin-user-doc -->
-     * @param javaIdentifierBase 
-     * @param diagnostics 
-     * @param context 
-     * @return 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean validateJavaIdentifierBase_Pattern(String javaIdentifierBase, DiagnosticChain diagnostics, Map<Object, Object> context)
-    {
-        return validatePattern(FaceletTaglibPackage.Literals.JAVA_IDENTIFIER_BASE, javaIdentifierBase, JAVA_IDENTIFIER_BASE__PATTERN__VALUES, diagnostics, context);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param pathTypeBase 
-     * @param diagnostics 
-     * @param context 
-     * @return 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean validatePathTypeBase(String pathTypeBase, DiagnosticChain diagnostics, Map<Object, Object> context)
-    {
-        return true;
-    }
-
-    /**
-     * Returns the resource locator that will be used to fetch messages for this validator's diagnostics.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public ResourceLocator getResourceLocator()
-    {
-        // TODO
-        // Specialize this to return a resource locator for messages specific to this validator.
-        // Ensure that you remove @generated or mark it @generated NOT
-        return super.getResourceLocator();
-    }
-
-} //FaceletTaglibValidator
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/util/FaceletTaglibXMLProcessor.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/util/FaceletTaglibXMLProcessor.java
deleted file mode 100644
index 0e962dd..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib/util/FaceletTaglibXMLProcessor.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: FaceletTaglibXMLProcessor.java,v 1.1 2010/03/18 06:24:40 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.util;
-
-import java.util.Map;
-
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.xmi.util.XMLProcessor;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibPackage;
-
-/**
- * This class contains helper methods to serialize and deserialize XML documents
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class FaceletTaglibXMLProcessor extends XMLProcessor
-{
-
-    /**
-     * Public constructor to instantiate the helper.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public FaceletTaglibXMLProcessor()
-    {
-        super((EPackage.Registry.INSTANCE));
-        FaceletTaglibPackage.eINSTANCE.eClass();
-    }
-    
-    /**
-     * Register for "*" and "xml" file extensions the FaceletTaglibResourceFactoryImpl factory.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    protected Map<String, Resource.Factory> getRegistrations()
-    {
-        if (registrations == null)
-        {
-            super.getRegistrations();
-            registrations.put(XML_EXTENSION, new FaceletTaglibResourceFactoryImpl());
-            registrations.put(STAR_EXTENSION, new FaceletTaglibResourceFactoryImpl());
-        }
-        return registrations;
-    }
-
-} //FaceletTaglibXMLProcessor
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib_1_0/ComponentTagDefn.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib_1_0/ComponentTagDefn.java
deleted file mode 100644
index 73816dd..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib_1_0/ComponentTagDefn.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ComponentTagDefn.java,v 1.1 2010/03/18 06:24:40 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Component Tag Defn</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.ComponentTagDefn#getComponentType <em>Component Type</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.ComponentTagDefn#getRendererType <em>Renderer Type</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletTaglib_1_0Package#getComponentTagDefn()
- * @model
- * @generated
- */
-public interface ComponentTagDefn extends HandlerTagDefn
-{
-    /**
-     * Returns the value of the '<em><b>Component Type</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Component Type</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Component Type</em>' attribute.
-     * @see #setComponentType(String)
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletTaglib_1_0Package#getComponentTagDefn_ComponentType()
-     * @model
-     * @generated
-     */
-    String getComponentType();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.ComponentTagDefn#getComponentType <em>Component Type</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Component Type</em>' attribute.
-     * @see #getComponentType()
-     * @generated
-     */
-    void setComponentType(String value);
-
-    /**
-     * Returns the value of the '<em><b>Renderer Type</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Renderer Type</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Renderer Type</em>' attribute.
-     * @see #setRendererType(String)
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletTaglib_1_0Package#getComponentTagDefn_RendererType()
-     * @model
-     * @generated
-     */
-    String getRendererType();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.ComponentTagDefn#getRendererType <em>Renderer Type</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Renderer Type</em>' attribute.
-     * @see #getRendererType()
-     * @generated
-     */
-    void setRendererType(String value);
-
-} // ComponentTagDefn
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib_1_0/ConverterTagDefn.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib_1_0/ConverterTagDefn.java
deleted file mode 100644
index 82ac3e8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib_1_0/ConverterTagDefn.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ConverterTagDefn.java,v 1.1 2010/03/18 06:24:40 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Converter Tag Defn</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.ConverterTagDefn#getConverterId <em>Converter Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletTaglib_1_0Package#getConverterTagDefn()
- * @model
- * @generated
- */
-public interface ConverterTagDefn extends HandlerTagDefn
-{
-    /**
-     * Returns the value of the '<em><b>Converter Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Converter Id</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Converter Id</em>' attribute.
-     * @see #setConverterId(String)
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletTaglib_1_0Package#getConverterTagDefn_ConverterId()
-     * @model
-     * @generated
-     */
-    String getConverterId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.ConverterTagDefn#getConverterId <em>Converter Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Converter Id</em>' attribute.
-     * @see #getConverterId()
-     * @generated
-     */
-    void setConverterId(String value);
-
-} // ConverterTagDefn
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib_1_0/FaceletLibraryClassTagLib.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib_1_0/FaceletLibraryClassTagLib.java
deleted file mode 100644
index c56fffa..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib_1_0/FaceletLibraryClassTagLib.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: FaceletLibraryClassTagLib.java,v 1.1 2010/03/18 06:24:40 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Facelet Library Class Tag Lib</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletLibraryClassTagLib#getLibraryClass <em>Library Class</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletTaglib_1_0Package#getFaceletLibraryClassTagLib()
- * @model
- * @generated
- */
-public interface FaceletLibraryClassTagLib extends FaceletTaglibDefn
-{
-    /**
-     * Returns the value of the '<em><b>Library Class</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Library Class</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Library Class</em>' attribute.
-     * @see #setLibraryClass(String)
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletTaglib_1_0Package#getFaceletLibraryClassTagLib_LibraryClass()
-     * @model
-     * @generated
-     */
-    String getLibraryClass();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletLibraryClassTagLib#getLibraryClass <em>Library Class</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Library Class</em>' attribute.
-     * @see #getLibraryClass()
-     * @generated
-     */
-    void setLibraryClass(String value);
-
-} // FaceletLibraryClassTagLib
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib_1_0/FaceletTaglibDefn.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib_1_0/FaceletTaglibDefn.java
deleted file mode 100644
index 2acac15..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib_1_0/FaceletTaglibDefn.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: FaceletTaglibDefn.java,v 1.1 2010/03/18 06:24:40 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Defn</b></em>'.
- * <!-- end-user-doc -->
- *
- *
- * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletTaglib_1_0Package#getFaceletTaglibDefn()
- * @model
- * @generated
- */
-public interface FaceletTaglibDefn extends EObject
-{
-  // nuthin'
-} // FaceletTaglibDefn
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib_1_0/FaceletTaglibFactory.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib_1_0/FaceletTaglibFactory.java
deleted file mode 100644
index 9d7b851..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib_1_0/FaceletTaglibFactory.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: FaceletTaglibFactory.java,v 1.1 2010/03/18 06:24:40 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0;
-
-import org.eclipse.emf.ecore.EFactory;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Factory</b> for the model.
- * It provides a create method for each non-abstract class of the model.
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletTaglibPackage
- * @generated
- */
-public interface FaceletTaglibFactory extends EFactory
-{
-    /**
-     * The singleton instance of the factory.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    FaceletTaglibFactory eINSTANCE = org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.FaceletTaglibFactoryImpl.init();
-
-    /**
-     * Returns a new object of class '<em>Facelet Library Class Tag Lib</em>'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new object of class '<em>Facelet Library Class Tag Lib</em>'.
-     * @generated
-     */
-    FaceletLibraryClassTagLib createFaceletLibraryClassTagLib();
-
-    /**
-     * Returns a new object of class '<em>Facelet XML Defn Taglib</em>'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new object of class '<em>Facelet XML Defn Taglib</em>'.
-     * @generated
-     */
-    FaceletXMLDefnTaglib createFaceletXMLDefnTaglib();
-
-    /**
-     * Returns a new object of class '<em>Defn</em>'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new object of class '<em>Defn</em>'.
-     * @generated
-     */
-    FaceletTaglibDefn createFaceletTaglibDefn();
-
-    /**
-     * Returns a new object of class '<em>Component Tag Defn</em>'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new object of class '<em>Component Tag Defn</em>'.
-     * @generated
-     */
-    ComponentTagDefn createComponentTagDefn();
-
-    /**
-     * Returns a new object of class '<em>Validator Tag Defn</em>'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new object of class '<em>Validator Tag Defn</em>'.
-     * @generated
-     */
-    ValidatorTagDefn createValidatorTagDefn();
-
-    /**
-     * Returns a new object of class '<em>Converter Tag Defn</em>'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new object of class '<em>Converter Tag Defn</em>'.
-     * @generated
-     */
-    ConverterTagDefn createConverterTagDefn();
-
-    /**
-     * Returns a new object of class '<em>Handler Tag Defn</em>'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new object of class '<em>Handler Tag Defn</em>'.
-     * @generated
-     */
-    HandlerTagDefn createHandlerTagDefn();
-
-    /**
-     * Returns a new object of class '<em>Source Tag Defn</em>'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new object of class '<em>Source Tag Defn</em>'.
-     * @generated
-     */
-    SourceTagDefn createSourceTagDefn();
-
-    /**
-     * Returns a new object of class '<em>Tag Defn</em>'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new object of class '<em>Tag Defn</em>'.
-     * @generated
-     */
-    TagDefn createTagDefn();
-
-    /**
-     * Returns a new object of class '<em>Function Defn</em>'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new object of class '<em>Function Defn</em>'.
-     * @generated
-     */
-    FunctionDefn createFunctionDefn();
-
-    /**
-     * Returns the package supported by this factory.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the package supported by this factory.
-     * @generated
-     */
-    FaceletTaglibPackage getFaceletTaglibPackage();
-
-} //FaceletTaglibFactory
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib_1_0/FaceletTaglibPackage.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib_1_0/FaceletTaglibPackage.java
deleted file mode 100644
index 89e51e7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib_1_0/FaceletTaglibPackage.java
+++ /dev/null
@@ -1,944 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: FaceletTaglibPackage.java,v 1.1 2010/03/18 06:24:40 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0;
-
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.EReference;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Package</b> for the model.
- * It contains accessors for the meta objects to represent
- * <ul>
- *   <li>each class,</li>
- *   <li>each feature of each class,</li>
- *   <li>each enum,</li>
- *   <li>and each data type</li>
- * </ul>
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletTaglibFactory
- * @model kind="package"
- * @generated
- */
-public interface FaceletTaglibPackage extends EPackage
-{
-    /**
-     * The package name.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    String eNAME = "faceletTaglib"; //$NON-NLS-1$
-
-    /**
-     * The package namespace URI.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    String eNS_URI = "http://org.eclipse.jst.jsf.facelet.core/faceletTaglib.ecore"; //$NON-NLS-1$
-
-    /**
-     * The package namespace name.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    String eNS_PREFIX = "faceletTaglib"; //$NON-NLS-1$
-
-    /**
-     * The singleton instance of the package.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    FaceletTaglibPackage eINSTANCE = org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.FaceletTaglibPackageImpl.init();
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.FaceletTaglibDefnImpl <em>Defn</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.FaceletTaglibDefnImpl
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.FaceletTaglibPackageImpl#getFaceletTaglibDefn()
-     * @generated
-     */
-    int FACELET_TAGLIB_DEFN = 2;
-
-    /**
-     * The number of structural features of the '<em>Defn</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_TAGLIB_DEFN_FEATURE_COUNT = 0;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.FaceletLibraryClassTagLibImpl <em>Facelet Library Class Tag Lib</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.FaceletLibraryClassTagLibImpl
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.FaceletTaglibPackageImpl#getFaceletLibraryClassTagLib()
-     * @generated
-     */
-    int FACELET_LIBRARY_CLASS_TAG_LIB = 0;
-
-    /**
-     * The feature id for the '<em><b>Library Class</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_LIBRARY_CLASS_TAG_LIB__LIBRARY_CLASS = FACELET_TAGLIB_DEFN_FEATURE_COUNT + 0;
-
-    /**
-     * The number of structural features of the '<em>Facelet Library Class Tag Lib</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_LIBRARY_CLASS_TAG_LIB_FEATURE_COUNT = FACELET_TAGLIB_DEFN_FEATURE_COUNT + 1;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.FaceletXMLDefnTaglibImpl <em>Facelet XML Defn Taglib</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.FaceletXMLDefnTaglibImpl
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.FaceletTaglibPackageImpl#getFaceletXMLDefnTaglib()
-     * @generated
-     */
-    int FACELET_XML_DEFN_TAGLIB = 1;
-
-    /**
-     * The feature id for the '<em><b>Namespace</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_XML_DEFN_TAGLIB__NAMESPACE = FACELET_TAGLIB_DEFN_FEATURE_COUNT + 0;
-
-    /**
-     * The feature id for the '<em><b>Tags</b></em>' reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_XML_DEFN_TAGLIB__TAGS = FACELET_TAGLIB_DEFN_FEATURE_COUNT + 1;
-
-    /**
-     * The feature id for the '<em><b>Functions</b></em>' reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_XML_DEFN_TAGLIB__FUNCTIONS = FACELET_TAGLIB_DEFN_FEATURE_COUNT + 2;
-
-    /**
-     * The number of structural features of the '<em>Facelet XML Defn Taglib</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_XML_DEFN_TAGLIB_FEATURE_COUNT = FACELET_TAGLIB_DEFN_FEATURE_COUNT + 3;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.TagDefnImpl <em>Tag Defn</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.TagDefnImpl
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.FaceletTaglibPackageImpl#getTagDefn()
-     * @generated
-     */
-    int TAG_DEFN = 8;
-
-    /**
-     * The feature id for the '<em><b>Name</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int TAG_DEFN__NAME = 0;
-
-    /**
-     * The number of structural features of the '<em>Tag Defn</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int TAG_DEFN_FEATURE_COUNT = 1;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.HandlerTagDefnImpl <em>Handler Tag Defn</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.HandlerTagDefnImpl
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.FaceletTaglibPackageImpl#getHandlerTagDefn()
-     * @generated
-     */
-    int HANDLER_TAG_DEFN = 6;
-
-    /**
-     * The feature id for the '<em><b>Name</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int HANDLER_TAG_DEFN__NAME = TAG_DEFN__NAME;
-
-    /**
-     * The feature id for the '<em><b>Handler Class</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int HANDLER_TAG_DEFN__HANDLER_CLASS = TAG_DEFN_FEATURE_COUNT + 0;
-
-    /**
-     * The number of structural features of the '<em>Handler Tag Defn</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int HANDLER_TAG_DEFN_FEATURE_COUNT = TAG_DEFN_FEATURE_COUNT + 1;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.ComponentTagDefnImpl <em>Component Tag Defn</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.ComponentTagDefnImpl
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.FaceletTaglibPackageImpl#getComponentTagDefn()
-     * @generated
-     */
-    int COMPONENT_TAG_DEFN = 3;
-
-    /**
-     * The feature id for the '<em><b>Name</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int COMPONENT_TAG_DEFN__NAME = HANDLER_TAG_DEFN__NAME;
-
-    /**
-     * The feature id for the '<em><b>Handler Class</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int COMPONENT_TAG_DEFN__HANDLER_CLASS = HANDLER_TAG_DEFN__HANDLER_CLASS;
-
-    /**
-     * The feature id for the '<em><b>Component Type</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int COMPONENT_TAG_DEFN__COMPONENT_TYPE = HANDLER_TAG_DEFN_FEATURE_COUNT + 0;
-
-    /**
-     * The feature id for the '<em><b>Renderer Type</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int COMPONENT_TAG_DEFN__RENDERER_TYPE = HANDLER_TAG_DEFN_FEATURE_COUNT + 1;
-
-    /**
-     * The number of structural features of the '<em>Component Tag Defn</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int COMPONENT_TAG_DEFN_FEATURE_COUNT = HANDLER_TAG_DEFN_FEATURE_COUNT + 2;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.ValidatorTagDefnImpl <em>Validator Tag Defn</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.ValidatorTagDefnImpl
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.FaceletTaglibPackageImpl#getValidatorTagDefn()
-     * @generated
-     */
-    int VALIDATOR_TAG_DEFN = 4;
-
-    /**
-     * The feature id for the '<em><b>Name</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int VALIDATOR_TAG_DEFN__NAME = HANDLER_TAG_DEFN__NAME;
-
-    /**
-     * The feature id for the '<em><b>Handler Class</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int VALIDATOR_TAG_DEFN__HANDLER_CLASS = HANDLER_TAG_DEFN__HANDLER_CLASS;
-
-    /**
-     * The feature id for the '<em><b>Validator Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int VALIDATOR_TAG_DEFN__VALIDATOR_ID = HANDLER_TAG_DEFN_FEATURE_COUNT + 0;
-
-    /**
-     * The number of structural features of the '<em>Validator Tag Defn</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int VALIDATOR_TAG_DEFN_FEATURE_COUNT = HANDLER_TAG_DEFN_FEATURE_COUNT + 1;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.ConverterTagDefnImpl <em>Converter Tag Defn</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.ConverterTagDefnImpl
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.FaceletTaglibPackageImpl#getConverterTagDefn()
-     * @generated
-     */
-    int CONVERTER_TAG_DEFN = 5;
-
-    /**
-     * The feature id for the '<em><b>Name</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int CONVERTER_TAG_DEFN__NAME = HANDLER_TAG_DEFN__NAME;
-
-    /**
-     * The feature id for the '<em><b>Handler Class</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int CONVERTER_TAG_DEFN__HANDLER_CLASS = HANDLER_TAG_DEFN__HANDLER_CLASS;
-
-    /**
-     * The feature id for the '<em><b>Converter Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int CONVERTER_TAG_DEFN__CONVERTER_ID = HANDLER_TAG_DEFN_FEATURE_COUNT + 0;
-
-    /**
-     * The number of structural features of the '<em>Converter Tag Defn</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int CONVERTER_TAG_DEFN_FEATURE_COUNT = HANDLER_TAG_DEFN_FEATURE_COUNT + 1;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.SourceTagDefnImpl <em>Source Tag Defn</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.SourceTagDefnImpl
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.FaceletTaglibPackageImpl#getSourceTagDefn()
-     * @generated
-     */
-    int SOURCE_TAG_DEFN = 7;
-
-    /**
-     * The feature id for the '<em><b>Name</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int SOURCE_TAG_DEFN__NAME = TAG_DEFN__NAME;
-
-    /**
-     * The feature id for the '<em><b>Source</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int SOURCE_TAG_DEFN__SOURCE = TAG_DEFN_FEATURE_COUNT + 0;
-
-    /**
-     * The number of structural features of the '<em>Source Tag Defn</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int SOURCE_TAG_DEFN_FEATURE_COUNT = TAG_DEFN_FEATURE_COUNT + 1;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.FunctionDefnImpl <em>Function Defn</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.FunctionDefnImpl
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.FaceletTaglibPackageImpl#getFunctionDefn()
-     * @generated
-     */
-    int FUNCTION_DEFN = 9;
-
-    /**
-     * The feature id for the '<em><b>Function Name</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FUNCTION_DEFN__FUNCTION_NAME = 0;
-
-    /**
-     * The feature id for the '<em><b>Function Class</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FUNCTION_DEFN__FUNCTION_CLASS = 1;
-
-    /**
-     * The feature id for the '<em><b>Function Signature</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FUNCTION_DEFN__FUNCTION_SIGNATURE = 2;
-
-    /**
-     * The number of structural features of the '<em>Function Defn</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FUNCTION_DEFN_FEATURE_COUNT = 3;
-
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletLibraryClassTagLib <em>Facelet Library Class Tag Lib</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Facelet Library Class Tag Lib</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletLibraryClassTagLib
-     * @generated
-     */
-    EClass getFaceletLibraryClassTagLib();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletLibraryClassTagLib#getLibraryClass <em>Library Class</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Library Class</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletLibraryClassTagLib#getLibraryClass()
-     * @see #getFaceletLibraryClassTagLib()
-     * @generated
-     */
-    EAttribute getFaceletLibraryClassTagLib_LibraryClass();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletXMLDefnTaglib <em>Facelet XML Defn Taglib</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Facelet XML Defn Taglib</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletXMLDefnTaglib
-     * @generated
-     */
-    EClass getFaceletXMLDefnTaglib();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletXMLDefnTaglib#getNamespace <em>Namespace</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Namespace</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletXMLDefnTaglib#getNamespace()
-     * @see #getFaceletXMLDefnTaglib()
-     * @generated
-     */
-    EAttribute getFaceletXMLDefnTaglib_Namespace();
-
-    /**
-     * Returns the meta object for the reference list '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletXMLDefnTaglib#getTags <em>Tags</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the reference list '<em>Tags</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletXMLDefnTaglib#getTags()
-     * @see #getFaceletXMLDefnTaglib()
-     * @generated
-     */
-    EReference getFaceletXMLDefnTaglib_Tags();
-
-    /**
-     * Returns the meta object for the reference list '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletXMLDefnTaglib#getFunctions <em>Functions</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the reference list '<em>Functions</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletXMLDefnTaglib#getFunctions()
-     * @see #getFaceletXMLDefnTaglib()
-     * @generated
-     */
-    EReference getFaceletXMLDefnTaglib_Functions();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletTaglibDefn <em>Defn</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Defn</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletTaglibDefn
-     * @generated
-     */
-    EClass getFaceletTaglibDefn();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.ComponentTagDefn <em>Component Tag Defn</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Component Tag Defn</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.ComponentTagDefn
-     * @generated
-     */
-    EClass getComponentTagDefn();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.ComponentTagDefn#getComponentType <em>Component Type</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Component Type</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.ComponentTagDefn#getComponentType()
-     * @see #getComponentTagDefn()
-     * @generated
-     */
-    EAttribute getComponentTagDefn_ComponentType();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.ComponentTagDefn#getRendererType <em>Renderer Type</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Renderer Type</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.ComponentTagDefn#getRendererType()
-     * @see #getComponentTagDefn()
-     * @generated
-     */
-    EAttribute getComponentTagDefn_RendererType();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.ValidatorTagDefn <em>Validator Tag Defn</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Validator Tag Defn</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.ValidatorTagDefn
-     * @generated
-     */
-    EClass getValidatorTagDefn();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.ValidatorTagDefn#getValidatorId <em>Validator Id</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Validator Id</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.ValidatorTagDefn#getValidatorId()
-     * @see #getValidatorTagDefn()
-     * @generated
-     */
-    EAttribute getValidatorTagDefn_ValidatorId();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.ConverterTagDefn <em>Converter Tag Defn</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Converter Tag Defn</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.ConverterTagDefn
-     * @generated
-     */
-    EClass getConverterTagDefn();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.ConverterTagDefn#getConverterId <em>Converter Id</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Converter Id</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.ConverterTagDefn#getConverterId()
-     * @see #getConverterTagDefn()
-     * @generated
-     */
-    EAttribute getConverterTagDefn_ConverterId();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.HandlerTagDefn <em>Handler Tag Defn</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Handler Tag Defn</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.HandlerTagDefn
-     * @generated
-     */
-    EClass getHandlerTagDefn();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.HandlerTagDefn#getHandlerClass <em>Handler Class</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Handler Class</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.HandlerTagDefn#getHandlerClass()
-     * @see #getHandlerTagDefn()
-     * @generated
-     */
-    EAttribute getHandlerTagDefn_HandlerClass();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.SourceTagDefn <em>Source Tag Defn</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Source Tag Defn</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.SourceTagDefn
-     * @generated
-     */
-    EClass getSourceTagDefn();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.SourceTagDefn#getSource <em>Source</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Source</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.SourceTagDefn#getSource()
-     * @see #getSourceTagDefn()
-     * @generated
-     */
-    EAttribute getSourceTagDefn_Source();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.TagDefn <em>Tag Defn</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Tag Defn</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.TagDefn
-     * @generated
-     */
-    EClass getTagDefn();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.TagDefn#getName <em>Name</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Name</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.TagDefn#getName()
-     * @see #getTagDefn()
-     * @generated
-     */
-    EAttribute getTagDefn_Name();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FunctionDefn <em>Function Defn</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Function Defn</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FunctionDefn
-     * @generated
-     */
-    EClass getFunctionDefn();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FunctionDefn#getFunctionName <em>Function Name</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Function Name</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FunctionDefn#getFunctionName()
-     * @see #getFunctionDefn()
-     * @generated
-     */
-    EAttribute getFunctionDefn_FunctionName();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FunctionDefn#getFunctionClass <em>Function Class</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Function Class</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FunctionDefn#getFunctionClass()
-     * @see #getFunctionDefn()
-     * @generated
-     */
-    EAttribute getFunctionDefn_FunctionClass();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FunctionDefn#getFunctionSignature <em>Function Signature</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Function Signature</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FunctionDefn#getFunctionSignature()
-     * @see #getFunctionDefn()
-     * @generated
-     */
-    EAttribute getFunctionDefn_FunctionSignature();
-
-    /**
-     * Returns the factory that creates the instances of the model.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the factory that creates the instances of the model.
-     * @generated
-     */
-    FaceletTaglibFactory getFaceletTaglibFactory();
-
-    /**
-     * <!-- begin-user-doc -->
-     * Defines literals for the meta objects that represent
-     * <ul>
-     *   <li>each class,</li>
-     *   <li>each feature of each class,</li>
-     *   <li>each enum,</li>
-     *   <li>and each data type</li>
-     * </ul>
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @SuppressWarnings("hiding")
-    interface Literals
-    {
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.FaceletLibraryClassTagLibImpl <em>Facelet Library Class Tag Lib</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.FaceletLibraryClassTagLibImpl
-         * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.FaceletTaglibPackageImpl#getFaceletLibraryClassTagLib()
-         * @generated
-         */
-        EClass FACELET_LIBRARY_CLASS_TAG_LIB = eINSTANCE.getFaceletLibraryClassTagLib();
-
-        /**
-         * The meta object literal for the '<em><b>Library Class</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute FACELET_LIBRARY_CLASS_TAG_LIB__LIBRARY_CLASS = eINSTANCE.getFaceletLibraryClassTagLib_LibraryClass();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.FaceletXMLDefnTaglibImpl <em>Facelet XML Defn Taglib</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.FaceletXMLDefnTaglibImpl
-         * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.FaceletTaglibPackageImpl#getFaceletXMLDefnTaglib()
-         * @generated
-         */
-        EClass FACELET_XML_DEFN_TAGLIB = eINSTANCE.getFaceletXMLDefnTaglib();
-
-        /**
-         * The meta object literal for the '<em><b>Namespace</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute FACELET_XML_DEFN_TAGLIB__NAMESPACE = eINSTANCE.getFaceletXMLDefnTaglib_Namespace();
-
-        /**
-         * The meta object literal for the '<em><b>Tags</b></em>' reference list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference FACELET_XML_DEFN_TAGLIB__TAGS = eINSTANCE.getFaceletXMLDefnTaglib_Tags();
-
-        /**
-         * The meta object literal for the '<em><b>Functions</b></em>' reference list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference FACELET_XML_DEFN_TAGLIB__FUNCTIONS = eINSTANCE.getFaceletXMLDefnTaglib_Functions();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.FaceletTaglibDefnImpl <em>Defn</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.FaceletTaglibDefnImpl
-         * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.FaceletTaglibPackageImpl#getFaceletTaglibDefn()
-         * @generated
-         */
-        EClass FACELET_TAGLIB_DEFN = eINSTANCE.getFaceletTaglibDefn();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.ComponentTagDefnImpl <em>Component Tag Defn</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.ComponentTagDefnImpl
-         * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.FaceletTaglibPackageImpl#getComponentTagDefn()
-         * @generated
-         */
-        EClass COMPONENT_TAG_DEFN = eINSTANCE.getComponentTagDefn();
-
-        /**
-         * The meta object literal for the '<em><b>Component Type</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute COMPONENT_TAG_DEFN__COMPONENT_TYPE = eINSTANCE.getComponentTagDefn_ComponentType();
-
-        /**
-         * The meta object literal for the '<em><b>Renderer Type</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute COMPONENT_TAG_DEFN__RENDERER_TYPE = eINSTANCE.getComponentTagDefn_RendererType();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.ValidatorTagDefnImpl <em>Validator Tag Defn</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.ValidatorTagDefnImpl
-         * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.FaceletTaglibPackageImpl#getValidatorTagDefn()
-         * @generated
-         */
-        EClass VALIDATOR_TAG_DEFN = eINSTANCE.getValidatorTagDefn();
-
-        /**
-         * The meta object literal for the '<em><b>Validator Id</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute VALIDATOR_TAG_DEFN__VALIDATOR_ID = eINSTANCE.getValidatorTagDefn_ValidatorId();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.ConverterTagDefnImpl <em>Converter Tag Defn</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.ConverterTagDefnImpl
-         * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.FaceletTaglibPackageImpl#getConverterTagDefn()
-         * @generated
-         */
-        EClass CONVERTER_TAG_DEFN = eINSTANCE.getConverterTagDefn();
-
-        /**
-         * The meta object literal for the '<em><b>Converter Id</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute CONVERTER_TAG_DEFN__CONVERTER_ID = eINSTANCE.getConverterTagDefn_ConverterId();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.HandlerTagDefnImpl <em>Handler Tag Defn</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.HandlerTagDefnImpl
-         * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.FaceletTaglibPackageImpl#getHandlerTagDefn()
-         * @generated
-         */
-        EClass HANDLER_TAG_DEFN = eINSTANCE.getHandlerTagDefn();
-
-        /**
-         * The meta object literal for the '<em><b>Handler Class</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute HANDLER_TAG_DEFN__HANDLER_CLASS = eINSTANCE.getHandlerTagDefn_HandlerClass();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.SourceTagDefnImpl <em>Source Tag Defn</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.SourceTagDefnImpl
-         * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.FaceletTaglibPackageImpl#getSourceTagDefn()
-         * @generated
-         */
-        EClass SOURCE_TAG_DEFN = eINSTANCE.getSourceTagDefn();
-
-        /**
-         * The meta object literal for the '<em><b>Source</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute SOURCE_TAG_DEFN__SOURCE = eINSTANCE.getSourceTagDefn_Source();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.TagDefnImpl <em>Tag Defn</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.TagDefnImpl
-         * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.FaceletTaglibPackageImpl#getTagDefn()
-         * @generated
-         */
-        EClass TAG_DEFN = eINSTANCE.getTagDefn();
-
-        /**
-         * The meta object literal for the '<em><b>Name</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute TAG_DEFN__NAME = eINSTANCE.getTagDefn_Name();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.FunctionDefnImpl <em>Function Defn</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.FunctionDefnImpl
-         * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.FaceletTaglibPackageImpl#getFunctionDefn()
-         * @generated
-         */
-        EClass FUNCTION_DEFN = eINSTANCE.getFunctionDefn();
-
-        /**
-         * The meta object literal for the '<em><b>Function Name</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute FUNCTION_DEFN__FUNCTION_NAME = eINSTANCE.getFunctionDefn_FunctionName();
-
-        /**
-         * The meta object literal for the '<em><b>Function Class</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute FUNCTION_DEFN__FUNCTION_CLASS = eINSTANCE.getFunctionDefn_FunctionClass();
-
-        /**
-         * The meta object literal for the '<em><b>Function Signature</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute FUNCTION_DEFN__FUNCTION_SIGNATURE = eINSTANCE.getFunctionDefn_FunctionSignature();
-
-    }
-
-} //FaceletTaglibPackage
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib_1_0/FaceletTaglib_1_0Factory.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib_1_0/FaceletTaglib_1_0Factory.java
deleted file mode 100644
index 3ceb1eb..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib_1_0/FaceletTaglib_1_0Factory.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: FaceletTaglib_1_0Factory.java,v 1.1 2010/03/18 06:24:39 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0;
-
-import org.eclipse.emf.ecore.EFactory;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Factory</b> for the model.
- * It provides a create method for each non-abstract class of the model.
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletTaglib_1_0Package
- * @generated
- */
-public interface FaceletTaglib_1_0Factory extends EFactory
-{
-    /**
-     * The singleton instance of the factory.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    FaceletTaglib_1_0Factory eINSTANCE = org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.FaceletTaglib_1_0FactoryImpl.init();
-
-    /**
-     * Returns a new object of class '<em>Facelet Library Class Tag Lib</em>'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new object of class '<em>Facelet Library Class Tag Lib</em>'.
-     * @generated
-     */
-    FaceletLibraryClassTagLib createFaceletLibraryClassTagLib();
-
-    /**
-     * Returns a new object of class '<em>Facelet XML Defn Taglib</em>'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new object of class '<em>Facelet XML Defn Taglib</em>'.
-     * @generated
-     */
-    FaceletXMLDefnTaglib createFaceletXMLDefnTaglib();
-
-    /**
-     * Returns a new object of class '<em>Facelet Taglib Defn</em>'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new object of class '<em>Facelet Taglib Defn</em>'.
-     * @generated
-     */
-    FaceletTaglibDefn createFaceletTaglibDefn();
-
-    /**
-     * Returns a new object of class '<em>Component Tag Defn</em>'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new object of class '<em>Component Tag Defn</em>'.
-     * @generated
-     */
-    ComponentTagDefn createComponentTagDefn();
-
-    /**
-     * Returns a new object of class '<em>Validator Tag Defn</em>'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new object of class '<em>Validator Tag Defn</em>'.
-     * @generated
-     */
-    ValidatorTagDefn createValidatorTagDefn();
-
-    /**
-     * Returns a new object of class '<em>Converter Tag Defn</em>'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new object of class '<em>Converter Tag Defn</em>'.
-     * @generated
-     */
-    ConverterTagDefn createConverterTagDefn();
-
-    /**
-     * Returns a new object of class '<em>Handler Tag Defn</em>'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new object of class '<em>Handler Tag Defn</em>'.
-     * @generated
-     */
-    HandlerTagDefn createHandlerTagDefn();
-
-    /**
-     * Returns a new object of class '<em>Source Tag Defn</em>'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new object of class '<em>Source Tag Defn</em>'.
-     * @generated
-     */
-    SourceTagDefn createSourceTagDefn();
-
-    /**
-     * Returns a new object of class '<em>Tag Defn</em>'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new object of class '<em>Tag Defn</em>'.
-     * @generated
-     */
-    TagDefn createTagDefn();
-
-    /**
-     * Returns a new object of class '<em>Function Defn</em>'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new object of class '<em>Function Defn</em>'.
-     * @generated
-     */
-    FunctionDefn createFunctionDefn();
-
-    /**
-     * Returns the package supported by this factory.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the package supported by this factory.
-     * @generated
-     */
-    FaceletTaglib_1_0Package getFaceletTaglib_1_0Package();
-
-} //FaceletTaglib_1_0Factory
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib_1_0/FaceletTaglib_1_0Package.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib_1_0/FaceletTaglib_1_0Package.java
deleted file mode 100644
index 5428931..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib_1_0/FaceletTaglib_1_0Package.java
+++ /dev/null
@@ -1,944 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: FaceletTaglib_1_0Package.java,v 1.1 2010/03/18 06:24:40 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0;
-
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.EReference;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Package</b> for the model.
- * It contains accessors for the meta objects to represent
- * <ul>
- *   <li>each class,</li>
- *   <li>each feature of each class,</li>
- *   <li>each enum,</li>
- *   <li>and each data type</li>
- * </ul>
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletTaglib_1_0Factory
- * @model kind="package"
- * @generated
- */
-public interface FaceletTaglib_1_0Package extends EPackage
-{
-    /**
-     * The package name.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    String eNAME = "faceletTaglib_1_0"; //$NON-NLS-1$
-
-    /**
-     * The package namespace URI.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    String eNS_URI = "http://org.eclipse.jst.jsf.facelet.core/faceletTaglib_1_0"; //$NON-NLS-1$
-
-    /**
-     * The package namespace name.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    String eNS_PREFIX = "faceletTaglib_1_0"; //$NON-NLS-1$
-
-    /**
-     * The singleton instance of the package.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    FaceletTaglib_1_0Package eINSTANCE = org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.FaceletTaglib_1_0PackageImpl.init();
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.FaceletTaglibDefnImpl <em>Facelet Taglib Defn</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.FaceletTaglibDefnImpl
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.FaceletTaglib_1_0PackageImpl#getFaceletTaglibDefn()
-     * @generated
-     */
-    int FACELET_TAGLIB_DEFN = 2;
-
-    /**
-     * The number of structural features of the '<em>Facelet Taglib Defn</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_TAGLIB_DEFN_FEATURE_COUNT = 0;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.FaceletLibraryClassTagLibImpl <em>Facelet Library Class Tag Lib</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.FaceletLibraryClassTagLibImpl
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.FaceletTaglib_1_0PackageImpl#getFaceletLibraryClassTagLib()
-     * @generated
-     */
-    int FACELET_LIBRARY_CLASS_TAG_LIB = 0;
-
-    /**
-     * The feature id for the '<em><b>Library Class</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_LIBRARY_CLASS_TAG_LIB__LIBRARY_CLASS = FACELET_TAGLIB_DEFN_FEATURE_COUNT + 0;
-
-    /**
-     * The number of structural features of the '<em>Facelet Library Class Tag Lib</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_LIBRARY_CLASS_TAG_LIB_FEATURE_COUNT = FACELET_TAGLIB_DEFN_FEATURE_COUNT + 1;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.FaceletXMLDefnTaglibImpl <em>Facelet XML Defn Taglib</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.FaceletXMLDefnTaglibImpl
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.FaceletTaglib_1_0PackageImpl#getFaceletXMLDefnTaglib()
-     * @generated
-     */
-    int FACELET_XML_DEFN_TAGLIB = 1;
-
-    /**
-     * The feature id for the '<em><b>Namespace</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_XML_DEFN_TAGLIB__NAMESPACE = FACELET_TAGLIB_DEFN_FEATURE_COUNT + 0;
-
-    /**
-     * The feature id for the '<em><b>Tags</b></em>' reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_XML_DEFN_TAGLIB__TAGS = FACELET_TAGLIB_DEFN_FEATURE_COUNT + 1;
-
-    /**
-     * The feature id for the '<em><b>Functions</b></em>' reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_XML_DEFN_TAGLIB__FUNCTIONS = FACELET_TAGLIB_DEFN_FEATURE_COUNT + 2;
-
-    /**
-     * The number of structural features of the '<em>Facelet XML Defn Taglib</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACELET_XML_DEFN_TAGLIB_FEATURE_COUNT = FACELET_TAGLIB_DEFN_FEATURE_COUNT + 3;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.TagDefnImpl <em>Tag Defn</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.TagDefnImpl
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.FaceletTaglib_1_0PackageImpl#getTagDefn()
-     * @generated
-     */
-    int TAG_DEFN = 8;
-
-    /**
-     * The feature id for the '<em><b>Name</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int TAG_DEFN__NAME = 0;
-
-    /**
-     * The number of structural features of the '<em>Tag Defn</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int TAG_DEFN_FEATURE_COUNT = 1;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.HandlerTagDefnImpl <em>Handler Tag Defn</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.HandlerTagDefnImpl
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.FaceletTaglib_1_0PackageImpl#getHandlerTagDefn()
-     * @generated
-     */
-    int HANDLER_TAG_DEFN = 6;
-
-    /**
-     * The feature id for the '<em><b>Name</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int HANDLER_TAG_DEFN__NAME = TAG_DEFN__NAME;
-
-    /**
-     * The feature id for the '<em><b>Handler Class</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int HANDLER_TAG_DEFN__HANDLER_CLASS = TAG_DEFN_FEATURE_COUNT + 0;
-
-    /**
-     * The number of structural features of the '<em>Handler Tag Defn</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int HANDLER_TAG_DEFN_FEATURE_COUNT = TAG_DEFN_FEATURE_COUNT + 1;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.ComponentTagDefnImpl <em>Component Tag Defn</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.ComponentTagDefnImpl
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.FaceletTaglib_1_0PackageImpl#getComponentTagDefn()
-     * @generated
-     */
-    int COMPONENT_TAG_DEFN = 3;
-
-    /**
-     * The feature id for the '<em><b>Name</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int COMPONENT_TAG_DEFN__NAME = HANDLER_TAG_DEFN__NAME;
-
-    /**
-     * The feature id for the '<em><b>Handler Class</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int COMPONENT_TAG_DEFN__HANDLER_CLASS = HANDLER_TAG_DEFN__HANDLER_CLASS;
-
-    /**
-     * The feature id for the '<em><b>Component Type</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int COMPONENT_TAG_DEFN__COMPONENT_TYPE = HANDLER_TAG_DEFN_FEATURE_COUNT + 0;
-
-    /**
-     * The feature id for the '<em><b>Renderer Type</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int COMPONENT_TAG_DEFN__RENDERER_TYPE = HANDLER_TAG_DEFN_FEATURE_COUNT + 1;
-
-    /**
-     * The number of structural features of the '<em>Component Tag Defn</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int COMPONENT_TAG_DEFN_FEATURE_COUNT = HANDLER_TAG_DEFN_FEATURE_COUNT + 2;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.ValidatorTagDefnImpl <em>Validator Tag Defn</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.ValidatorTagDefnImpl
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.FaceletTaglib_1_0PackageImpl#getValidatorTagDefn()
-     * @generated
-     */
-    int VALIDATOR_TAG_DEFN = 4;
-
-    /**
-     * The feature id for the '<em><b>Name</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int VALIDATOR_TAG_DEFN__NAME = HANDLER_TAG_DEFN__NAME;
-
-    /**
-     * The feature id for the '<em><b>Handler Class</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int VALIDATOR_TAG_DEFN__HANDLER_CLASS = HANDLER_TAG_DEFN__HANDLER_CLASS;
-
-    /**
-     * The feature id for the '<em><b>Validator Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int VALIDATOR_TAG_DEFN__VALIDATOR_ID = HANDLER_TAG_DEFN_FEATURE_COUNT + 0;
-
-    /**
-     * The number of structural features of the '<em>Validator Tag Defn</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int VALIDATOR_TAG_DEFN_FEATURE_COUNT = HANDLER_TAG_DEFN_FEATURE_COUNT + 1;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.ConverterTagDefnImpl <em>Converter Tag Defn</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.ConverterTagDefnImpl
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.FaceletTaglib_1_0PackageImpl#getConverterTagDefn()
-     * @generated
-     */
-    int CONVERTER_TAG_DEFN = 5;
-
-    /**
-     * The feature id for the '<em><b>Name</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int CONVERTER_TAG_DEFN__NAME = HANDLER_TAG_DEFN__NAME;
-
-    /**
-     * The feature id for the '<em><b>Handler Class</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int CONVERTER_TAG_DEFN__HANDLER_CLASS = HANDLER_TAG_DEFN__HANDLER_CLASS;
-
-    /**
-     * The feature id for the '<em><b>Converter Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int CONVERTER_TAG_DEFN__CONVERTER_ID = HANDLER_TAG_DEFN_FEATURE_COUNT + 0;
-
-    /**
-     * The number of structural features of the '<em>Converter Tag Defn</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int CONVERTER_TAG_DEFN_FEATURE_COUNT = HANDLER_TAG_DEFN_FEATURE_COUNT + 1;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.SourceTagDefnImpl <em>Source Tag Defn</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.SourceTagDefnImpl
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.FaceletTaglib_1_0PackageImpl#getSourceTagDefn()
-     * @generated
-     */
-    int SOURCE_TAG_DEFN = 7;
-
-    /**
-     * The feature id for the '<em><b>Name</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int SOURCE_TAG_DEFN__NAME = TAG_DEFN__NAME;
-
-    /**
-     * The feature id for the '<em><b>Source</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int SOURCE_TAG_DEFN__SOURCE = TAG_DEFN_FEATURE_COUNT + 0;
-
-    /**
-     * The number of structural features of the '<em>Source Tag Defn</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int SOURCE_TAG_DEFN_FEATURE_COUNT = TAG_DEFN_FEATURE_COUNT + 1;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.FunctionDefnImpl <em>Function Defn</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.FunctionDefnImpl
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.FaceletTaglib_1_0PackageImpl#getFunctionDefn()
-     * @generated
-     */
-    int FUNCTION_DEFN = 9;
-
-    /**
-     * The feature id for the '<em><b>Function Name</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FUNCTION_DEFN__FUNCTION_NAME = 0;
-
-    /**
-     * The feature id for the '<em><b>Function Class</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FUNCTION_DEFN__FUNCTION_CLASS = 1;
-
-    /**
-     * The feature id for the '<em><b>Function Signature</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FUNCTION_DEFN__FUNCTION_SIGNATURE = 2;
-
-    /**
-     * The number of structural features of the '<em>Function Defn</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FUNCTION_DEFN_FEATURE_COUNT = 3;
-
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletLibraryClassTagLib <em>Facelet Library Class Tag Lib</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Facelet Library Class Tag Lib</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletLibraryClassTagLib
-     * @generated
-     */
-    EClass getFaceletLibraryClassTagLib();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletLibraryClassTagLib#getLibraryClass <em>Library Class</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Library Class</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletLibraryClassTagLib#getLibraryClass()
-     * @see #getFaceletLibraryClassTagLib()
-     * @generated
-     */
-    EAttribute getFaceletLibraryClassTagLib_LibraryClass();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletXMLDefnTaglib <em>Facelet XML Defn Taglib</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Facelet XML Defn Taglib</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletXMLDefnTaglib
-     * @generated
-     */
-    EClass getFaceletXMLDefnTaglib();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletXMLDefnTaglib#getNamespace <em>Namespace</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Namespace</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletXMLDefnTaglib#getNamespace()
-     * @see #getFaceletXMLDefnTaglib()
-     * @generated
-     */
-    EAttribute getFaceletXMLDefnTaglib_Namespace();
-
-    /**
-     * Returns the meta object for the reference list '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletXMLDefnTaglib#getTags <em>Tags</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the reference list '<em>Tags</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletXMLDefnTaglib#getTags()
-     * @see #getFaceletXMLDefnTaglib()
-     * @generated
-     */
-    EReference getFaceletXMLDefnTaglib_Tags();
-
-    /**
-     * Returns the meta object for the reference list '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletXMLDefnTaglib#getFunctions <em>Functions</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the reference list '<em>Functions</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletXMLDefnTaglib#getFunctions()
-     * @see #getFaceletXMLDefnTaglib()
-     * @generated
-     */
-    EReference getFaceletXMLDefnTaglib_Functions();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletTaglibDefn <em>Facelet Taglib Defn</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Facelet Taglib Defn</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletTaglibDefn
-     * @generated
-     */
-    EClass getFaceletTaglibDefn();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.ComponentTagDefn <em>Component Tag Defn</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Component Tag Defn</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.ComponentTagDefn
-     * @generated
-     */
-    EClass getComponentTagDefn();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.ComponentTagDefn#getComponentType <em>Component Type</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Component Type</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.ComponentTagDefn#getComponentType()
-     * @see #getComponentTagDefn()
-     * @generated
-     */
-    EAttribute getComponentTagDefn_ComponentType();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.ComponentTagDefn#getRendererType <em>Renderer Type</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Renderer Type</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.ComponentTagDefn#getRendererType()
-     * @see #getComponentTagDefn()
-     * @generated
-     */
-    EAttribute getComponentTagDefn_RendererType();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.ValidatorTagDefn <em>Validator Tag Defn</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Validator Tag Defn</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.ValidatorTagDefn
-     * @generated
-     */
-    EClass getValidatorTagDefn();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.ValidatorTagDefn#getValidatorId <em>Validator Id</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Validator Id</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.ValidatorTagDefn#getValidatorId()
-     * @see #getValidatorTagDefn()
-     * @generated
-     */
-    EAttribute getValidatorTagDefn_ValidatorId();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.ConverterTagDefn <em>Converter Tag Defn</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Converter Tag Defn</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.ConverterTagDefn
-     * @generated
-     */
-    EClass getConverterTagDefn();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.ConverterTagDefn#getConverterId <em>Converter Id</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Converter Id</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.ConverterTagDefn#getConverterId()
-     * @see #getConverterTagDefn()
-     * @generated
-     */
-    EAttribute getConverterTagDefn_ConverterId();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.HandlerTagDefn <em>Handler Tag Defn</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Handler Tag Defn</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.HandlerTagDefn
-     * @generated
-     */
-    EClass getHandlerTagDefn();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.HandlerTagDefn#getHandlerClass <em>Handler Class</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Handler Class</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.HandlerTagDefn#getHandlerClass()
-     * @see #getHandlerTagDefn()
-     * @generated
-     */
-    EAttribute getHandlerTagDefn_HandlerClass();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.SourceTagDefn <em>Source Tag Defn</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Source Tag Defn</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.SourceTagDefn
-     * @generated
-     */
-    EClass getSourceTagDefn();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.SourceTagDefn#getSource <em>Source</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Source</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.SourceTagDefn#getSource()
-     * @see #getSourceTagDefn()
-     * @generated
-     */
-    EAttribute getSourceTagDefn_Source();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.TagDefn <em>Tag Defn</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Tag Defn</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.TagDefn
-     * @generated
-     */
-    EClass getTagDefn();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.TagDefn#getName <em>Name</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Name</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.TagDefn#getName()
-     * @see #getTagDefn()
-     * @generated
-     */
-    EAttribute getTagDefn_Name();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FunctionDefn <em>Function Defn</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Function Defn</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FunctionDefn
-     * @generated
-     */
-    EClass getFunctionDefn();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FunctionDefn#getFunctionName <em>Function Name</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Function Name</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FunctionDefn#getFunctionName()
-     * @see #getFunctionDefn()
-     * @generated
-     */
-    EAttribute getFunctionDefn_FunctionName();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FunctionDefn#getFunctionClass <em>Function Class</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Function Class</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FunctionDefn#getFunctionClass()
-     * @see #getFunctionDefn()
-     * @generated
-     */
-    EAttribute getFunctionDefn_FunctionClass();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FunctionDefn#getFunctionSignature <em>Function Signature</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Function Signature</em>'.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FunctionDefn#getFunctionSignature()
-     * @see #getFunctionDefn()
-     * @generated
-     */
-    EAttribute getFunctionDefn_FunctionSignature();
-
-    /**
-     * Returns the factory that creates the instances of the model.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the factory that creates the instances of the model.
-     * @generated
-     */
-    FaceletTaglib_1_0Factory getFaceletTaglib_1_0Factory();
-
-    /**
-     * <!-- begin-user-doc -->
-     * Defines literals for the meta objects that represent
-     * <ul>
-     *   <li>each class,</li>
-     *   <li>each feature of each class,</li>
-     *   <li>each enum,</li>
-     *   <li>and each data type</li>
-     * </ul>
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @SuppressWarnings("hiding")
-    interface Literals
-    {
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.FaceletLibraryClassTagLibImpl <em>Facelet Library Class Tag Lib</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.FaceletLibraryClassTagLibImpl
-         * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.FaceletTaglib_1_0PackageImpl#getFaceletLibraryClassTagLib()
-         * @generated
-         */
-        EClass FACELET_LIBRARY_CLASS_TAG_LIB = eINSTANCE.getFaceletLibraryClassTagLib();
-
-        /**
-         * The meta object literal for the '<em><b>Library Class</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute FACELET_LIBRARY_CLASS_TAG_LIB__LIBRARY_CLASS = eINSTANCE.getFaceletLibraryClassTagLib_LibraryClass();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.FaceletXMLDefnTaglibImpl <em>Facelet XML Defn Taglib</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.FaceletXMLDefnTaglibImpl
-         * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.FaceletTaglib_1_0PackageImpl#getFaceletXMLDefnTaglib()
-         * @generated
-         */
-        EClass FACELET_XML_DEFN_TAGLIB = eINSTANCE.getFaceletXMLDefnTaglib();
-
-        /**
-         * The meta object literal for the '<em><b>Namespace</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute FACELET_XML_DEFN_TAGLIB__NAMESPACE = eINSTANCE.getFaceletXMLDefnTaglib_Namespace();
-
-        /**
-         * The meta object literal for the '<em><b>Tags</b></em>' reference list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference FACELET_XML_DEFN_TAGLIB__TAGS = eINSTANCE.getFaceletXMLDefnTaglib_Tags();
-
-        /**
-         * The meta object literal for the '<em><b>Functions</b></em>' reference list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference FACELET_XML_DEFN_TAGLIB__FUNCTIONS = eINSTANCE.getFaceletXMLDefnTaglib_Functions();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.FaceletTaglibDefnImpl <em>Facelet Taglib Defn</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.FaceletTaglibDefnImpl
-         * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.FaceletTaglib_1_0PackageImpl#getFaceletTaglibDefn()
-         * @generated
-         */
-        EClass FACELET_TAGLIB_DEFN = eINSTANCE.getFaceletTaglibDefn();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.ComponentTagDefnImpl <em>Component Tag Defn</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.ComponentTagDefnImpl
-         * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.FaceletTaglib_1_0PackageImpl#getComponentTagDefn()
-         * @generated
-         */
-        EClass COMPONENT_TAG_DEFN = eINSTANCE.getComponentTagDefn();
-
-        /**
-         * The meta object literal for the '<em><b>Component Type</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute COMPONENT_TAG_DEFN__COMPONENT_TYPE = eINSTANCE.getComponentTagDefn_ComponentType();
-
-        /**
-         * The meta object literal for the '<em><b>Renderer Type</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute COMPONENT_TAG_DEFN__RENDERER_TYPE = eINSTANCE.getComponentTagDefn_RendererType();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.ValidatorTagDefnImpl <em>Validator Tag Defn</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.ValidatorTagDefnImpl
-         * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.FaceletTaglib_1_0PackageImpl#getValidatorTagDefn()
-         * @generated
-         */
-        EClass VALIDATOR_TAG_DEFN = eINSTANCE.getValidatorTagDefn();
-
-        /**
-         * The meta object literal for the '<em><b>Validator Id</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute VALIDATOR_TAG_DEFN__VALIDATOR_ID = eINSTANCE.getValidatorTagDefn_ValidatorId();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.ConverterTagDefnImpl <em>Converter Tag Defn</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.ConverterTagDefnImpl
-         * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.FaceletTaglib_1_0PackageImpl#getConverterTagDefn()
-         * @generated
-         */
-        EClass CONVERTER_TAG_DEFN = eINSTANCE.getConverterTagDefn();
-
-        /**
-         * The meta object literal for the '<em><b>Converter Id</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute CONVERTER_TAG_DEFN__CONVERTER_ID = eINSTANCE.getConverterTagDefn_ConverterId();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.HandlerTagDefnImpl <em>Handler Tag Defn</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.HandlerTagDefnImpl
-         * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.FaceletTaglib_1_0PackageImpl#getHandlerTagDefn()
-         * @generated
-         */
-        EClass HANDLER_TAG_DEFN = eINSTANCE.getHandlerTagDefn();
-
-        /**
-         * The meta object literal for the '<em><b>Handler Class</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute HANDLER_TAG_DEFN__HANDLER_CLASS = eINSTANCE.getHandlerTagDefn_HandlerClass();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.SourceTagDefnImpl <em>Source Tag Defn</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.SourceTagDefnImpl
-         * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.FaceletTaglib_1_0PackageImpl#getSourceTagDefn()
-         * @generated
-         */
-        EClass SOURCE_TAG_DEFN = eINSTANCE.getSourceTagDefn();
-
-        /**
-         * The meta object literal for the '<em><b>Source</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute SOURCE_TAG_DEFN__SOURCE = eINSTANCE.getSourceTagDefn_Source();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.TagDefnImpl <em>Tag Defn</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.TagDefnImpl
-         * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.FaceletTaglib_1_0PackageImpl#getTagDefn()
-         * @generated
-         */
-        EClass TAG_DEFN = eINSTANCE.getTagDefn();
-
-        /**
-         * The meta object literal for the '<em><b>Name</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute TAG_DEFN__NAME = eINSTANCE.getTagDefn_Name();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.FunctionDefnImpl <em>Function Defn</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.FunctionDefnImpl
-         * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.FaceletTaglib_1_0PackageImpl#getFunctionDefn()
-         * @generated
-         */
-        EClass FUNCTION_DEFN = eINSTANCE.getFunctionDefn();
-
-        /**
-         * The meta object literal for the '<em><b>Function Name</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute FUNCTION_DEFN__FUNCTION_NAME = eINSTANCE.getFunctionDefn_FunctionName();
-
-        /**
-         * The meta object literal for the '<em><b>Function Class</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute FUNCTION_DEFN__FUNCTION_CLASS = eINSTANCE.getFunctionDefn_FunctionClass();
-
-        /**
-         * The meta object literal for the '<em><b>Function Signature</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute FUNCTION_DEFN__FUNCTION_SIGNATURE = eINSTANCE.getFunctionDefn_FunctionSignature();
-
-    }
-
-} //FaceletTaglib_1_0Package
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib_1_0/FaceletXMLDefnTaglib.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib_1_0/FaceletXMLDefnTaglib.java
deleted file mode 100644
index 9332034..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib_1_0/FaceletXMLDefnTaglib.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: FaceletXMLDefnTaglib.java,v 1.1 2010/03/18 06:24:40 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0;
-
-import org.eclipse.emf.common.util.EList;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Facelet XML Defn Taglib</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletXMLDefnTaglib#getNamespace <em>Namespace</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletXMLDefnTaglib#getTags <em>Tags</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletXMLDefnTaglib#getFunctions <em>Functions</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletTaglib_1_0Package#getFaceletXMLDefnTaglib()
- * @model
- * @generated
- */
-public interface FaceletXMLDefnTaglib extends FaceletTaglibDefn
-{
-    /**
-     * Returns the value of the '<em><b>Namespace</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Namespace</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Namespace</em>' attribute.
-     * @see #setNamespace(String)
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletTaglib_1_0Package#getFaceletXMLDefnTaglib_Namespace()
-     * @model
-     * @generated
-     */
-    String getNamespace();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletXMLDefnTaglib#getNamespace <em>Namespace</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Namespace</em>' attribute.
-     * @see #getNamespace()
-     * @generated
-     */
-    void setNamespace(String value);
-
-    /**
-     * Returns the value of the '<em><b>Tags</b></em>' reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.TagDefn}.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Tags</em>' reference list isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Tags</em>' reference list.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletTaglib_1_0Package#getFaceletXMLDefnTaglib_Tags()
-     * @model
-     * @generated
-     */
-    EList<TagDefn> getTags();
-
-    /**
-     * Returns the value of the '<em><b>Functions</b></em>' reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FunctionDefn}.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Functions</em>' reference list isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Functions</em>' reference list.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletTaglib_1_0Package#getFaceletXMLDefnTaglib_Functions()
-     * @model
-     * @generated
-     */
-    EList<FunctionDefn> getFunctions();
-
-} // FaceletXMLDefnTaglib
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib_1_0/FunctionDefn.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib_1_0/FunctionDefn.java
deleted file mode 100644
index d7d03e9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib_1_0/FunctionDefn.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: FunctionDefn.java,v 1.1 2010/03/18 06:24:40 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Function Defn</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FunctionDefn#getFunctionName <em>Function Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FunctionDefn#getFunctionClass <em>Function Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FunctionDefn#getFunctionSignature <em>Function Signature</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletTaglib_1_0Package#getFunctionDefn()
- * @model
- * @generated
- */
-public interface FunctionDefn extends EObject
-{
-    /**
-     * Returns the value of the '<em><b>Function Name</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Function Name</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Function Name</em>' attribute.
-     * @see #setFunctionName(String)
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletTaglib_1_0Package#getFunctionDefn_FunctionName()
-     * @model
-     * @generated
-     */
-    String getFunctionName();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FunctionDefn#getFunctionName <em>Function Name</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Function Name</em>' attribute.
-     * @see #getFunctionName()
-     * @generated
-     */
-    void setFunctionName(String value);
-
-    /**
-     * Returns the value of the '<em><b>Function Class</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Function Class</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Function Class</em>' attribute.
-     * @see #setFunctionClass(String)
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletTaglib_1_0Package#getFunctionDefn_FunctionClass()
-     * @model
-     * @generated
-     */
-    String getFunctionClass();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FunctionDefn#getFunctionClass <em>Function Class</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Function Class</em>' attribute.
-     * @see #getFunctionClass()
-     * @generated
-     */
-    void setFunctionClass(String value);
-
-    /**
-     * Returns the value of the '<em><b>Function Signature</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Function Signature</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Function Signature</em>' attribute.
-     * @see #setFunctionSignature(String)
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletTaglib_1_0Package#getFunctionDefn_FunctionSignature()
-     * @model
-     * @generated
-     */
-    String getFunctionSignature();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FunctionDefn#getFunctionSignature <em>Function Signature</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Function Signature</em>' attribute.
-     * @see #getFunctionSignature()
-     * @generated
-     */
-    void setFunctionSignature(String value);
-
-} // FunctionDefn
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib_1_0/HandlerTagDefn.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib_1_0/HandlerTagDefn.java
deleted file mode 100644
index bf4416e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib_1_0/HandlerTagDefn.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: HandlerTagDefn.java,v 1.1 2010/03/18 06:24:40 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Handler Tag Defn</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.HandlerTagDefn#getHandlerClass <em>Handler Class</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletTaglib_1_0Package#getHandlerTagDefn()
- * @model
- * @generated
- */
-public interface HandlerTagDefn extends TagDefn
-{
-    /**
-     * Returns the value of the '<em><b>Handler Class</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Handler Class</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Handler Class</em>' attribute.
-     * @see #setHandlerClass(String)
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletTaglib_1_0Package#getHandlerTagDefn_HandlerClass()
-     * @model
-     * @generated
-     */
-    String getHandlerClass();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.HandlerTagDefn#getHandlerClass <em>Handler Class</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Handler Class</em>' attribute.
-     * @see #getHandlerClass()
-     * @generated
-     */
-    void setHandlerClass(String value);
-
-} // HandlerTagDefn
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib_1_0/SourceTagDefn.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib_1_0/SourceTagDefn.java
deleted file mode 100644
index 1867c34..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib_1_0/SourceTagDefn.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: SourceTagDefn.java,v 1.1 2010/03/18 06:24:40 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Source Tag Defn</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.SourceTagDefn#getSource <em>Source</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletTaglib_1_0Package#getSourceTagDefn()
- * @model
- * @generated
- */
-public interface SourceTagDefn extends TagDefn
-{
-    /**
-     * Returns the value of the '<em><b>Source</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Source</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Source</em>' attribute.
-     * @see #setSource(String)
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletTaglib_1_0Package#getSourceTagDefn_Source()
-     * @model
-     * @generated
-     */
-    String getSource();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.SourceTagDefn#getSource <em>Source</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Source</em>' attribute.
-     * @see #getSource()
-     * @generated
-     */
-    void setSource(String value);
-
-} // SourceTagDefn
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib_1_0/TagDefn.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib_1_0/TagDefn.java
deleted file mode 100644
index a44baee..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib_1_0/TagDefn.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: TagDefn.java,v 1.1 2010/03/18 06:24:40 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Tag Defn</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.TagDefn#getName <em>Name</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletTaglib_1_0Package#getTagDefn()
- * @model
- * @generated
- */
-public interface TagDefn extends EObject
-{
-    /**
-     * Returns the value of the '<em><b>Name</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Name</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Name</em>' attribute.
-     * @see #setName(String)
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletTaglib_1_0Package#getTagDefn_Name()
-     * @model
-     * @generated
-     */
-    String getName();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.TagDefn#getName <em>Name</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Name</em>' attribute.
-     * @see #getName()
-     * @generated
-     */
-    void setName(String value);
-
-} // TagDefn
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib_1_0/ValidatorTagDefn.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib_1_0/ValidatorTagDefn.java
deleted file mode 100644
index f925b27..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib_1_0/ValidatorTagDefn.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ValidatorTagDefn.java,v 1.1 2010/03/18 06:24:40 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Validator Tag Defn</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.ValidatorTagDefn#getValidatorId <em>Validator Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletTaglib_1_0Package#getValidatorTagDefn()
- * @model
- * @generated
- */
-public interface ValidatorTagDefn extends HandlerTagDefn
-{
-    /**
-     * Returns the value of the '<em><b>Validator Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Validator Id</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Validator Id</em>' attribute.
-     * @see #setValidatorId(String)
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletTaglib_1_0Package#getValidatorTagDefn_ValidatorId()
-     * @model
-     * @generated
-     */
-    String getValidatorId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.ValidatorTagDefn#getValidatorId <em>Validator Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Validator Id</em>' attribute.
-     * @see #getValidatorId()
-     * @generated
-     */
-    void setValidatorId(String value);
-
-} // ValidatorTagDefn
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib_1_0/impl/ComponentTagDefnImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib_1_0/impl/ComponentTagDefnImpl.java
deleted file mode 100644
index cd170e2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib_1_0/impl/ComponentTagDefnImpl.java
+++ /dev/null
@@ -1,233 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ComponentTagDefnImpl.java,v 1.1 2010/03/18 06:24:28 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.ComponentTagDefn;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletTaglib_1_0Package;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Component Tag Defn</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.ComponentTagDefnImpl#getComponentType <em>Component Type</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.ComponentTagDefnImpl#getRendererType <em>Renderer Type</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ComponentTagDefnImpl extends HandlerTagDefnImpl implements ComponentTagDefn
-{
-    /**
-     * The default value of the '{@link #getComponentType() <em>Component Type</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getComponentType()
-     * @generated
-     * @ordered
-     */
-    protected static final String COMPONENT_TYPE_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getComponentType() <em>Component Type</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getComponentType()
-     * @generated
-     * @ordered
-     */
-    protected String componentType = COMPONENT_TYPE_EDEFAULT;
-
-    /**
-     * The default value of the '{@link #getRendererType() <em>Renderer Type</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getRendererType()
-     * @generated
-     * @ordered
-     */
-    protected static final String RENDERER_TYPE_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getRendererType() <em>Renderer Type</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getRendererType()
-     * @generated
-     * @ordered
-     */
-    protected String rendererType = RENDERER_TYPE_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected ComponentTagDefnImpl()
-    {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    protected EClass eStaticClass()
-    {
-        return FaceletTaglib_1_0Package.Literals.COMPONENT_TAG_DEFN;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String getComponentType()
-    {
-        return componentType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setComponentType(String newComponentType)
-    {
-        String oldComponentType = componentType;
-        componentType = newComponentType;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FaceletTaglib_1_0Package.COMPONENT_TAG_DEFN__COMPONENT_TYPE, oldComponentType, componentType));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String getRendererType()
-    {
-        return rendererType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setRendererType(String newRendererType)
-    {
-        String oldRendererType = rendererType;
-        rendererType = newRendererType;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FaceletTaglib_1_0Package.COMPONENT_TAG_DEFN__RENDERER_TYPE, oldRendererType, rendererType));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public Object eGet(int featureID, boolean resolve, boolean coreType)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglib_1_0Package.COMPONENT_TAG_DEFN__COMPONENT_TYPE:
-                return getComponentType();
-            case FaceletTaglib_1_0Package.COMPONENT_TAG_DEFN__RENDERER_TYPE:
-                return getRendererType();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public void eSet(int featureID, Object newValue)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglib_1_0Package.COMPONENT_TAG_DEFN__COMPONENT_TYPE:
-                setComponentType((String)newValue);
-                return;
-            case FaceletTaglib_1_0Package.COMPONENT_TAG_DEFN__RENDERER_TYPE:
-                setRendererType((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public void eUnset(int featureID)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglib_1_0Package.COMPONENT_TAG_DEFN__COMPONENT_TYPE:
-                setComponentType(COMPONENT_TYPE_EDEFAULT);
-                return;
-            case FaceletTaglib_1_0Package.COMPONENT_TAG_DEFN__RENDERER_TYPE:
-                setRendererType(RENDERER_TYPE_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public boolean eIsSet(int featureID)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglib_1_0Package.COMPONENT_TAG_DEFN__COMPONENT_TYPE:
-                return COMPONENT_TYPE_EDEFAULT == null ? componentType != null : !COMPONENT_TYPE_EDEFAULT.equals(componentType);
-            case FaceletTaglib_1_0Package.COMPONENT_TAG_DEFN__RENDERER_TYPE:
-                return RENDERER_TYPE_EDEFAULT == null ? rendererType != null : !RENDERER_TYPE_EDEFAULT.equals(rendererType);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public String toString()
-    {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (componentType: "); //$NON-NLS-1$
-        result.append(componentType);
-        result.append(", rendererType: "); //$NON-NLS-1$
-        result.append(rendererType);
-        result.append(')');
-        return result.toString();
-    }
-
-} //ComponentTagDefnImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib_1_0/impl/ConverterTagDefnImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib_1_0/impl/ConverterTagDefnImpl.java
deleted file mode 100644
index a7ff950..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib_1_0/impl/ConverterTagDefnImpl.java
+++ /dev/null
@@ -1,177 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ConverterTagDefnImpl.java,v 1.1 2010/03/18 06:24:28 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.ConverterTagDefn;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletTaglib_1_0Package;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Converter Tag Defn</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.ConverterTagDefnImpl#getConverterId <em>Converter Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ConverterTagDefnImpl extends HandlerTagDefnImpl implements ConverterTagDefn
-{
-    /**
-     * The default value of the '{@link #getConverterId() <em>Converter Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getConverterId()
-     * @generated
-     * @ordered
-     */
-    protected static final String CONVERTER_ID_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getConverterId() <em>Converter Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getConverterId()
-     * @generated
-     * @ordered
-     */
-    protected String converterId = CONVERTER_ID_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected ConverterTagDefnImpl()
-    {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    protected EClass eStaticClass()
-    {
-        return FaceletTaglib_1_0Package.Literals.CONVERTER_TAG_DEFN;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String getConverterId()
-    {
-        return converterId;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setConverterId(String newConverterId)
-    {
-        String oldConverterId = converterId;
-        converterId = newConverterId;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FaceletTaglib_1_0Package.CONVERTER_TAG_DEFN__CONVERTER_ID, oldConverterId, converterId));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public Object eGet(int featureID, boolean resolve, boolean coreType)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglib_1_0Package.CONVERTER_TAG_DEFN__CONVERTER_ID:
-                return getConverterId();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public void eSet(int featureID, Object newValue)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglib_1_0Package.CONVERTER_TAG_DEFN__CONVERTER_ID:
-                setConverterId((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public void eUnset(int featureID)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglib_1_0Package.CONVERTER_TAG_DEFN__CONVERTER_ID:
-                setConverterId(CONVERTER_ID_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public boolean eIsSet(int featureID)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglib_1_0Package.CONVERTER_TAG_DEFN__CONVERTER_ID:
-                return CONVERTER_ID_EDEFAULT == null ? converterId != null : !CONVERTER_ID_EDEFAULT.equals(converterId);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public String toString()
-    {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (converterId: "); //$NON-NLS-1$
-        result.append(converterId);
-        result.append(')');
-        return result.toString();
-    }
-
-} //ConverterTagDefnImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib_1_0/impl/FaceletLibraryClassTagLibImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib_1_0/impl/FaceletLibraryClassTagLibImpl.java
deleted file mode 100644
index 117892f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib_1_0/impl/FaceletLibraryClassTagLibImpl.java
+++ /dev/null
@@ -1,177 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: FaceletLibraryClassTagLibImpl.java,v 1.1 2010/03/18 06:24:28 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletLibraryClassTagLib;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletTaglib_1_0Package;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Facelet Library Class Tag Lib</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.FaceletLibraryClassTagLibImpl#getLibraryClass <em>Library Class</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class FaceletLibraryClassTagLibImpl extends FaceletTaglibDefnImpl implements FaceletLibraryClassTagLib
-{
-    /**
-     * The default value of the '{@link #getLibraryClass() <em>Library Class</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getLibraryClass()
-     * @generated
-     * @ordered
-     */
-    protected static final String LIBRARY_CLASS_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getLibraryClass() <em>Library Class</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getLibraryClass()
-     * @generated
-     * @ordered
-     */
-    protected String libraryClass = LIBRARY_CLASS_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected FaceletLibraryClassTagLibImpl()
-    {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    protected EClass eStaticClass()
-    {
-        return FaceletTaglib_1_0Package.Literals.FACELET_LIBRARY_CLASS_TAG_LIB;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String getLibraryClass()
-    {
-        return libraryClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setLibraryClass(String newLibraryClass)
-    {
-        String oldLibraryClass = libraryClass;
-        libraryClass = newLibraryClass;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FaceletTaglib_1_0Package.FACELET_LIBRARY_CLASS_TAG_LIB__LIBRARY_CLASS, oldLibraryClass, libraryClass));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public Object eGet(int featureID, boolean resolve, boolean coreType)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglib_1_0Package.FACELET_LIBRARY_CLASS_TAG_LIB__LIBRARY_CLASS:
-                return getLibraryClass();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public void eSet(int featureID, Object newValue)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglib_1_0Package.FACELET_LIBRARY_CLASS_TAG_LIB__LIBRARY_CLASS:
-                setLibraryClass((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public void eUnset(int featureID)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglib_1_0Package.FACELET_LIBRARY_CLASS_TAG_LIB__LIBRARY_CLASS:
-                setLibraryClass(LIBRARY_CLASS_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public boolean eIsSet(int featureID)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglib_1_0Package.FACELET_LIBRARY_CLASS_TAG_LIB__LIBRARY_CLASS:
-                return LIBRARY_CLASS_EDEFAULT == null ? libraryClass != null : !LIBRARY_CLASS_EDEFAULT.equals(libraryClass);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public String toString()
-    {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (libraryClass: "); //$NON-NLS-1$
-        result.append(libraryClass);
-        result.append(')');
-        return result.toString();
-    }
-
-} //FaceletLibraryClassTagLibImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib_1_0/impl/FaceletTaglibDefnImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib_1_0/impl/FaceletTaglibDefnImpl.java
deleted file mode 100644
index 409ea42..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib_1_0/impl/FaceletTaglibDefnImpl.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: FaceletTaglibDefnImpl.java,v 1.1 2010/03/18 06:24:28 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletTaglibDefn;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletTaglib_1_0Package;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Defn</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * </p>
- *
- * @generated
- */
-public class FaceletTaglibDefnImpl extends EObjectImpl implements FaceletTaglibDefn
-{
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected FaceletTaglibDefnImpl()
-    {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    protected EClass eStaticClass()
-    {
-        return FaceletTaglib_1_0Package.Literals.FACELET_TAGLIB_DEFN;
-    }
-
-} //FaceletTaglibDefnImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib_1_0/impl/FaceletTaglibFactoryImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib_1_0/impl/FaceletTaglibFactoryImpl.java
deleted file mode 100644
index f5c7069..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib_1_0/impl/FaceletTaglibFactoryImpl.java
+++ /dev/null
@@ -1,228 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: FaceletTaglibFactoryImpl.java,v 1.1 2010/03/18 06:24:28 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.impl.EFactoryImpl;
-import org.eclipse.emf.ecore.plugin.EcorePlugin;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.ComponentTagDefn;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.ConverterTagDefn;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletLibraryClassTagLib;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletTaglibDefn;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletTaglibFactory;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletTaglibPackage;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletXMLDefnTaglib;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FunctionDefn;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.HandlerTagDefn;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.SourceTagDefn;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.TagDefn;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.ValidatorTagDefn;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model <b>Factory</b>.
- * <!-- end-user-doc -->
- * @generated
- */
-public class FaceletTaglibFactoryImpl extends EFactoryImpl implements FaceletTaglibFactory
-{
-    /**
-     * Creates the default factory implementation.
-     * <!-- begin-user-doc -->
-     * @return the factory
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public static FaceletTaglibFactory init()
-    {
-        try
-        {
-            FaceletTaglibFactory theFaceletTaglibFactory = (FaceletTaglibFactory)EPackage.Registry.INSTANCE.getEFactory("http://org.eclipse.jst.jsf.facelet.core/faceletTaglib.ecore");  //$NON-NLS-1$
-            if (theFaceletTaglibFactory != null)
-            {
-                return theFaceletTaglibFactory;
-            }
-        }
-        catch (Exception exception)
-        {
-            EcorePlugin.INSTANCE.log(exception);
-        }
-        return new FaceletTaglibFactoryImpl();
-    }
-
-    /**
-     * Creates an instance of the factory.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public FaceletTaglibFactoryImpl()
-    {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public EObject create(EClass eClass)
-    {
-        switch (eClass.getClassifierID())
-        {
-            case FaceletTaglibPackage.FACELET_LIBRARY_CLASS_TAG_LIB: return createFaceletLibraryClassTagLib();
-            case FaceletTaglibPackage.FACELET_XML_DEFN_TAGLIB: return createFaceletXMLDefnTaglib();
-            case FaceletTaglibPackage.FACELET_TAGLIB_DEFN: return createFaceletTaglibDefn();
-            case FaceletTaglibPackage.COMPONENT_TAG_DEFN: return createComponentTagDefn();
-            case FaceletTaglibPackage.VALIDATOR_TAG_DEFN: return createValidatorTagDefn();
-            case FaceletTaglibPackage.CONVERTER_TAG_DEFN: return createConverterTagDefn();
-            case FaceletTaglibPackage.HANDLER_TAG_DEFN: return createHandlerTagDefn();
-            case FaceletTaglibPackage.SOURCE_TAG_DEFN: return createSourceTagDefn();
-            case FaceletTaglibPackage.TAG_DEFN: return createTagDefn();
-            case FaceletTaglibPackage.FUNCTION_DEFN: return createFunctionDefn();
-            default:
-                throw new IllegalArgumentException("The class '" + eClass.getName() + "' is not a valid classifier"); //$NON-NLS-1$ //$NON-NLS-2$
-        }
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public FaceletLibraryClassTagLib createFaceletLibraryClassTagLib()
-    {
-        FaceletLibraryClassTagLibImpl faceletLibraryClassTagLib = new FaceletLibraryClassTagLibImpl();
-        return faceletLibraryClassTagLib;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public FaceletXMLDefnTaglib createFaceletXMLDefnTaglib()
-    {
-        FaceletXMLDefnTaglibImpl faceletXMLDefnTaglib = new FaceletXMLDefnTaglibImpl();
-        return faceletXMLDefnTaglib;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public FaceletTaglibDefn createFaceletTaglibDefn()
-    {
-        FaceletTaglibDefnImpl faceletTaglibDefn = new FaceletTaglibDefnImpl();
-        return faceletTaglibDefn;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public ComponentTagDefn createComponentTagDefn()
-    {
-        ComponentTagDefnImpl componentTagDefn = new ComponentTagDefnImpl();
-        return componentTagDefn;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public ValidatorTagDefn createValidatorTagDefn()
-    {
-        ValidatorTagDefnImpl validatorTagDefn = new ValidatorTagDefnImpl();
-        return validatorTagDefn;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public ConverterTagDefn createConverterTagDefn()
-    {
-        ConverterTagDefnImpl converterTagDefn = new ConverterTagDefnImpl();
-        return converterTagDefn;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public HandlerTagDefn createHandlerTagDefn()
-    {
-        HandlerTagDefnImpl handlerTagDefn = new HandlerTagDefnImpl();
-        return handlerTagDefn;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public SourceTagDefn createSourceTagDefn()
-    {
-        SourceTagDefnImpl sourceTagDefn = new SourceTagDefnImpl();
-        return sourceTagDefn;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public TagDefn createTagDefn()
-    {
-        TagDefnImpl tagDefn = new TagDefnImpl();
-        return tagDefn;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public FunctionDefn createFunctionDefn()
-    {
-        FunctionDefnImpl functionDefn = new FunctionDefnImpl();
-        return functionDefn;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public FaceletTaglibPackage getFaceletTaglibPackage()
-    {
-        return (FaceletTaglibPackage)getEPackage();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return the package
-     * <!-- end-user-doc -->
-     * @deprecated
-     * @generated
-     */
-    @Deprecated
-    public static FaceletTaglibPackage getPackage()
-    {
-        return FaceletTaglibPackage.eINSTANCE;
-    }
-
-} //FaceletTaglibFactoryImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib_1_0/impl/FaceletTaglibPackageImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib_1_0/impl/FaceletTaglibPackageImpl.java
deleted file mode 100644
index 4c3117e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib_1_0/impl/FaceletTaglibPackageImpl.java
+++ /dev/null
@@ -1,557 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: FaceletTaglibPackageImpl.java,v 1.1 2010/03/18 06:24:28 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl;
-
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.EReference;
-import org.eclipse.emf.ecore.impl.EPackageImpl;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.ComponentTagDefn;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.ConverterTagDefn;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletLibraryClassTagLib;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletTaglibDefn;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletTaglibFactory;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletTaglibPackage;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletXMLDefnTaglib;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FunctionDefn;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.HandlerTagDefn;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.SourceTagDefn;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.TagDefn;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.ValidatorTagDefn;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model <b>Package</b>.
- * <!-- end-user-doc -->
- * @generated
- */
-public class FaceletTaglibPackageImpl extends EPackageImpl implements FaceletTaglibPackage
-{
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass faceletLibraryClassTagLibEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass faceletXMLDefnTaglibEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass faceletTaglibDefnEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass componentTagDefnEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass validatorTagDefnEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass converterTagDefnEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass handlerTagDefnEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass sourceTagDefnEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass tagDefnEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass functionDefnEClass = null;
-
-    /**
-     * Creates an instance of the model <b>Package</b>, registered with
-     * {@link org.eclipse.emf.ecore.EPackage.Registry EPackage.Registry} by the package
-     * package URI value.
-     * <p>Note: the correct way to create the package is via the static
-     * factory method {@link #init init()}, which also performs
-     * initialization of the package, or returns the registered package,
-     * if one already exists.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.emf.ecore.EPackage.Registry
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletTaglibPackage#eNS_URI
-     * @see #init()
-     * @generated
-     */
-    private FaceletTaglibPackageImpl()
-    {
-        super(eNS_URI, FaceletTaglibFactory.eINSTANCE);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private static boolean isInited = false;
-
-    /**
-     * Creates, registers, and initializes the <b>Package</b> for this
-     * model, and for any others upon which it depends.  Simple
-     * dependencies are satisfied by calling this method on all
-     * dependent packages before doing anything else.  This method drives
-     * initialization for interdependent packages directly, in parallel
-     * with this package, itself.
-     * <p>Of this package and its interdependencies, all packages which
-     * have not yet been registered by their URI values are first created
-     * and registered.  The packages are then initialized in two steps:
-     * meta-model objects for all of the packages are created before any
-     * are initialized, since one package's meta-model objects may refer to
-     * those of another.
-     * <p>Invocation of this method will not affect any packages that have
-     * already been initialized.
-     * <!-- begin-user-doc -->
-     * @return the package
-     * <!-- end-user-doc -->
-     * @see #eNS_URI
-     * @see #createPackageContents()
-     * @see #initializePackageContents()
-     * @generated
-     */
-    public static FaceletTaglibPackage init()
-    {
-        if (isInited) return (FaceletTaglibPackage)EPackage.Registry.INSTANCE.getEPackage(FaceletTaglibPackage.eNS_URI);
-
-        // Obtain or create and register package
-        FaceletTaglibPackageImpl theFaceletTaglibPackage = (FaceletTaglibPackageImpl)(EPackage.Registry.INSTANCE.getEPackage(eNS_URI) instanceof FaceletTaglibPackageImpl ? EPackage.Registry.INSTANCE.getEPackage(eNS_URI) : new FaceletTaglibPackageImpl());
-
-        isInited = true;
-
-        // Create package meta-data objects
-        theFaceletTaglibPackage.createPackageContents();
-
-        // Initialize created meta-data
-        theFaceletTaglibPackage.initializePackageContents();
-
-        // Mark meta-data to indicate it can't be changed
-        theFaceletTaglibPackage.freeze();
-
-        return theFaceletTaglibPackage;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getFaceletLibraryClassTagLib()
-    {
-        return faceletLibraryClassTagLibEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getFaceletLibraryClassTagLib_LibraryClass()
-    {
-        return (EAttribute)faceletLibraryClassTagLibEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getFaceletXMLDefnTaglib()
-    {
-        return faceletXMLDefnTaglibEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getFaceletXMLDefnTaglib_Namespace()
-    {
-        return (EAttribute)faceletXMLDefnTaglibEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EReference getFaceletXMLDefnTaglib_Tags()
-    {
-        return (EReference)faceletXMLDefnTaglibEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EReference getFaceletXMLDefnTaglib_Functions()
-    {
-        return (EReference)faceletXMLDefnTaglibEClass.getEStructuralFeatures().get(2);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getFaceletTaglibDefn()
-    {
-        return faceletTaglibDefnEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getComponentTagDefn()
-    {
-        return componentTagDefnEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getComponentTagDefn_ComponentType()
-    {
-        return (EAttribute)componentTagDefnEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getComponentTagDefn_RendererType()
-    {
-        return (EAttribute)componentTagDefnEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getValidatorTagDefn()
-    {
-        return validatorTagDefnEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getValidatorTagDefn_ValidatorId()
-    {
-        return (EAttribute)validatorTagDefnEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getConverterTagDefn()
-    {
-        return converterTagDefnEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getConverterTagDefn_ConverterId()
-    {
-        return (EAttribute)converterTagDefnEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getHandlerTagDefn()
-    {
-        return handlerTagDefnEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getHandlerTagDefn_HandlerClass()
-    {
-        return (EAttribute)handlerTagDefnEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getSourceTagDefn()
-    {
-        return sourceTagDefnEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getSourceTagDefn_Source()
-    {
-        return (EAttribute)sourceTagDefnEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getTagDefn()
-    {
-        return tagDefnEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getTagDefn_Name()
-    {
-        return (EAttribute)tagDefnEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getFunctionDefn()
-    {
-        return functionDefnEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getFunctionDefn_FunctionName()
-    {
-        return (EAttribute)functionDefnEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getFunctionDefn_FunctionClass()
-    {
-        return (EAttribute)functionDefnEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getFunctionDefn_FunctionSignature()
-    {
-        return (EAttribute)functionDefnEClass.getEStructuralFeatures().get(2);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public FaceletTaglibFactory getFaceletTaglibFactory()
-    {
-        return (FaceletTaglibFactory)getEFactoryInstance();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private boolean isCreated = false;
-
-    /**
-     * Creates the meta-model objects for the package.  This method is
-     * guarded to have no affect on any invocation but its first.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void createPackageContents()
-    {
-        if (isCreated) return;
-        isCreated = true;
-
-        // Create classes and their features
-        faceletLibraryClassTagLibEClass = createEClass(FACELET_LIBRARY_CLASS_TAG_LIB);
-        createEAttribute(faceletLibraryClassTagLibEClass, FACELET_LIBRARY_CLASS_TAG_LIB__LIBRARY_CLASS);
-
-        faceletXMLDefnTaglibEClass = createEClass(FACELET_XML_DEFN_TAGLIB);
-        createEAttribute(faceletXMLDefnTaglibEClass, FACELET_XML_DEFN_TAGLIB__NAMESPACE);
-        createEReference(faceletXMLDefnTaglibEClass, FACELET_XML_DEFN_TAGLIB__TAGS);
-        createEReference(faceletXMLDefnTaglibEClass, FACELET_XML_DEFN_TAGLIB__FUNCTIONS);
-
-        faceletTaglibDefnEClass = createEClass(FACELET_TAGLIB_DEFN);
-
-        componentTagDefnEClass = createEClass(COMPONENT_TAG_DEFN);
-        createEAttribute(componentTagDefnEClass, COMPONENT_TAG_DEFN__COMPONENT_TYPE);
-        createEAttribute(componentTagDefnEClass, COMPONENT_TAG_DEFN__RENDERER_TYPE);
-
-        validatorTagDefnEClass = createEClass(VALIDATOR_TAG_DEFN);
-        createEAttribute(validatorTagDefnEClass, VALIDATOR_TAG_DEFN__VALIDATOR_ID);
-
-        converterTagDefnEClass = createEClass(CONVERTER_TAG_DEFN);
-        createEAttribute(converterTagDefnEClass, CONVERTER_TAG_DEFN__CONVERTER_ID);
-
-        handlerTagDefnEClass = createEClass(HANDLER_TAG_DEFN);
-        createEAttribute(handlerTagDefnEClass, HANDLER_TAG_DEFN__HANDLER_CLASS);
-
-        sourceTagDefnEClass = createEClass(SOURCE_TAG_DEFN);
-        createEAttribute(sourceTagDefnEClass, SOURCE_TAG_DEFN__SOURCE);
-
-        tagDefnEClass = createEClass(TAG_DEFN);
-        createEAttribute(tagDefnEClass, TAG_DEFN__NAME);
-
-        functionDefnEClass = createEClass(FUNCTION_DEFN);
-        createEAttribute(functionDefnEClass, FUNCTION_DEFN__FUNCTION_NAME);
-        createEAttribute(functionDefnEClass, FUNCTION_DEFN__FUNCTION_CLASS);
-        createEAttribute(functionDefnEClass, FUNCTION_DEFN__FUNCTION_SIGNATURE);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private boolean isInitialized = false;
-
-    /**
-     * Complete the initialization of the package and its meta-model.  This
-     * method is guarded to have no affect on any invocation but its first.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void initializePackageContents()
-    {
-        if (isInitialized) return;
-        isInitialized = true;
-
-        // Initialize package
-        setName(eNAME);
-        setNsPrefix(eNS_PREFIX);
-        setNsURI(eNS_URI);
-
-        // Create type parameters
-
-        // Set bounds for type parameters
-
-        // Add supertypes to classes
-        faceletLibraryClassTagLibEClass.getESuperTypes().add(this.getFaceletTaglibDefn());
-        faceletXMLDefnTaglibEClass.getESuperTypes().add(this.getFaceletTaglibDefn());
-        componentTagDefnEClass.getESuperTypes().add(this.getHandlerTagDefn());
-        validatorTagDefnEClass.getESuperTypes().add(this.getHandlerTagDefn());
-        converterTagDefnEClass.getESuperTypes().add(this.getHandlerTagDefn());
-        handlerTagDefnEClass.getESuperTypes().add(this.getTagDefn());
-        sourceTagDefnEClass.getESuperTypes().add(this.getTagDefn());
-
-        // Initialize classes and features; add operations and parameters
-        initEClass(faceletLibraryClassTagLibEClass, FaceletLibraryClassTagLib.class, "FaceletLibraryClassTagLib", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-        initEAttribute(getFaceletLibraryClassTagLib_LibraryClass(), ecorePackage.getEString(), "libraryClass", null, 0, 1, FaceletLibraryClassTagLib.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-        initEClass(faceletXMLDefnTaglibEClass, FaceletXMLDefnTaglib.class, "FaceletXMLDefnTaglib", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-        initEAttribute(getFaceletXMLDefnTaglib_Namespace(), ecorePackage.getEString(), "namespace", null, 0, 1, FaceletXMLDefnTaglib.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-        initEReference(getFaceletXMLDefnTaglib_Tags(), this.getTagDefn(), null, "tags", null, 0, -1, FaceletXMLDefnTaglib.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-        initEReference(getFaceletXMLDefnTaglib_Functions(), this.getFunctionDefn(), null, "functions", null, 0, -1, FaceletXMLDefnTaglib.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-        initEClass(faceletTaglibDefnEClass, FaceletTaglibDefn.class, "FaceletTaglibDefn", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-
-        initEClass(componentTagDefnEClass, ComponentTagDefn.class, "ComponentTagDefn", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-        initEAttribute(getComponentTagDefn_ComponentType(), ecorePackage.getEString(), "componentType", null, 0, 1, ComponentTagDefn.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-        initEAttribute(getComponentTagDefn_RendererType(), ecorePackage.getEString(), "rendererType", null, 0, 1, ComponentTagDefn.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-        initEClass(validatorTagDefnEClass, ValidatorTagDefn.class, "ValidatorTagDefn", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-        initEAttribute(getValidatorTagDefn_ValidatorId(), ecorePackage.getEString(), "validatorId", null, 0, 1, ValidatorTagDefn.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-        initEClass(converterTagDefnEClass, ConverterTagDefn.class, "ConverterTagDefn", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-        initEAttribute(getConverterTagDefn_ConverterId(), ecorePackage.getEString(), "converterId", null, 0, 1, ConverterTagDefn.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-        initEClass(handlerTagDefnEClass, HandlerTagDefn.class, "HandlerTagDefn", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-        initEAttribute(getHandlerTagDefn_HandlerClass(), ecorePackage.getEString(), "handlerClass", null, 0, 1, HandlerTagDefn.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-        initEClass(sourceTagDefnEClass, SourceTagDefn.class, "SourceTagDefn", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-        initEAttribute(getSourceTagDefn_Source(), ecorePackage.getEString(), "source", null, 0, 1, SourceTagDefn.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-        initEClass(tagDefnEClass, TagDefn.class, "TagDefn", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-        initEAttribute(getTagDefn_Name(), ecorePackage.getEString(), "name", null, 0, 1, TagDefn.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-        initEClass(functionDefnEClass, FunctionDefn.class, "FunctionDefn", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-        initEAttribute(getFunctionDefn_FunctionName(), ecorePackage.getEString(), "functionName", null, 0, 1, FunctionDefn.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-        initEAttribute(getFunctionDefn_FunctionClass(), ecorePackage.getEString(), "functionClass", null, 0, 1, FunctionDefn.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-        initEAttribute(getFunctionDefn_FunctionSignature(), ecorePackage.getEString(), "functionSignature", null, 0, 1, FunctionDefn.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-        // Create resource
-        createResource(eNS_URI);
-    }
-
-} //FaceletTaglibPackageImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib_1_0/impl/FaceletTaglib_1_0FactoryImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib_1_0/impl/FaceletTaglib_1_0FactoryImpl.java
deleted file mode 100644
index 3d91d60..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib_1_0/impl/FaceletTaglib_1_0FactoryImpl.java
+++ /dev/null
@@ -1,228 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: FaceletTaglib_1_0FactoryImpl.java,v 1.1 2010/03/18 06:24:28 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.impl.EFactoryImpl;
-import org.eclipse.emf.ecore.plugin.EcorePlugin;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.ComponentTagDefn;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.ConverterTagDefn;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletLibraryClassTagLib;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletTaglibDefn;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletTaglib_1_0Factory;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletTaglib_1_0Package;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletXMLDefnTaglib;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FunctionDefn;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.HandlerTagDefn;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.SourceTagDefn;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.TagDefn;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.ValidatorTagDefn;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model <b>Factory</b>.
- * <!-- end-user-doc -->
- * @generated
- */
-public class FaceletTaglib_1_0FactoryImpl extends EFactoryImpl implements FaceletTaglib_1_0Factory
-{
-    /**
-     * Creates the default factory implementation.
-     * <!-- begin-user-doc -->
-     * @return the factory
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public static FaceletTaglib_1_0Factory init()
-    {
-        try
-        {
-            FaceletTaglib_1_0Factory theFaceletTaglib_1_0Factory = (FaceletTaglib_1_0Factory)EPackage.Registry.INSTANCE.getEFactory("http://org.eclipse.jst.jsf.facelet.core/faceletTaglib_1_0"); //$NON-NLS-1$ 
-            if (theFaceletTaglib_1_0Factory != null)
-            {
-                return theFaceletTaglib_1_0Factory;
-            }
-        }
-        catch (Exception exception)
-        {
-            EcorePlugin.INSTANCE.log(exception);
-        }
-        return new FaceletTaglib_1_0FactoryImpl();
-    }
-
-    /**
-     * Creates an instance of the factory.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public FaceletTaglib_1_0FactoryImpl()
-    {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public EObject create(EClass eClass)
-    {
-        switch (eClass.getClassifierID())
-        {
-            case FaceletTaglib_1_0Package.FACELET_LIBRARY_CLASS_TAG_LIB: return createFaceletLibraryClassTagLib();
-            case FaceletTaglib_1_0Package.FACELET_XML_DEFN_TAGLIB: return createFaceletXMLDefnTaglib();
-            case FaceletTaglib_1_0Package.FACELET_TAGLIB_DEFN: return createFaceletTaglibDefn();
-            case FaceletTaglib_1_0Package.COMPONENT_TAG_DEFN: return createComponentTagDefn();
-            case FaceletTaglib_1_0Package.VALIDATOR_TAG_DEFN: return createValidatorTagDefn();
-            case FaceletTaglib_1_0Package.CONVERTER_TAG_DEFN: return createConverterTagDefn();
-            case FaceletTaglib_1_0Package.HANDLER_TAG_DEFN: return createHandlerTagDefn();
-            case FaceletTaglib_1_0Package.SOURCE_TAG_DEFN: return createSourceTagDefn();
-            case FaceletTaglib_1_0Package.TAG_DEFN: return createTagDefn();
-            case FaceletTaglib_1_0Package.FUNCTION_DEFN: return createFunctionDefn();
-            default:
-                throw new IllegalArgumentException("The class '" + eClass.getName() + "' is not a valid classifier"); //$NON-NLS-1$ //$NON-NLS-2$
-        }
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public FaceletLibraryClassTagLib createFaceletLibraryClassTagLib()
-    {
-        FaceletLibraryClassTagLibImpl faceletLibraryClassTagLib = new FaceletLibraryClassTagLibImpl();
-        return faceletLibraryClassTagLib;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public FaceletXMLDefnTaglib createFaceletXMLDefnTaglib()
-    {
-        FaceletXMLDefnTaglibImpl faceletXMLDefnTaglib = new FaceletXMLDefnTaglibImpl();
-        return faceletXMLDefnTaglib;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public FaceletTaglibDefn createFaceletTaglibDefn()
-    {
-        FaceletTaglibDefnImpl faceletTaglibDefn = new FaceletTaglibDefnImpl();
-        return faceletTaglibDefn;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public ComponentTagDefn createComponentTagDefn()
-    {
-        ComponentTagDefnImpl componentTagDefn = new ComponentTagDefnImpl();
-        return componentTagDefn;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public ValidatorTagDefn createValidatorTagDefn()
-    {
-        ValidatorTagDefnImpl validatorTagDefn = new ValidatorTagDefnImpl();
-        return validatorTagDefn;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public ConverterTagDefn createConverterTagDefn()
-    {
-        ConverterTagDefnImpl converterTagDefn = new ConverterTagDefnImpl();
-        return converterTagDefn;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public HandlerTagDefn createHandlerTagDefn()
-    {
-        HandlerTagDefnImpl handlerTagDefn = new HandlerTagDefnImpl();
-        return handlerTagDefn;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public SourceTagDefn createSourceTagDefn()
-    {
-        SourceTagDefnImpl sourceTagDefn = new SourceTagDefnImpl();
-        return sourceTagDefn;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public TagDefn createTagDefn()
-    {
-        TagDefnImpl tagDefn = new TagDefnImpl();
-        return tagDefn;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public FunctionDefn createFunctionDefn()
-    {
-        FunctionDefnImpl functionDefn = new FunctionDefnImpl();
-        return functionDefn;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public FaceletTaglib_1_0Package getFaceletTaglib_1_0Package()
-    {
-        return (FaceletTaglib_1_0Package)getEPackage();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return the package.
-     * <!-- end-user-doc -->
-     * @deprecated
-     * @generated
-     */
-    @Deprecated
-    public static FaceletTaglib_1_0Package getPackage()
-    {
-        return FaceletTaglib_1_0Package.eINSTANCE;
-    }
-
-} //FaceletTaglib_1_0FactoryImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib_1_0/impl/FaceletTaglib_1_0PackageImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib_1_0/impl/FaceletTaglib_1_0PackageImpl.java
deleted file mode 100644
index ca7436d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib_1_0/impl/FaceletTaglib_1_0PackageImpl.java
+++ /dev/null
@@ -1,550 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: FaceletTaglib_1_0PackageImpl.java,v 1.1 2010/03/18 06:24:27 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl;
-
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.EReference;
-import org.eclipse.emf.ecore.impl.EPackageImpl;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.ComponentTagDefn;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.ConverterTagDefn;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletLibraryClassTagLib;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletTaglibDefn;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletTaglib_1_0Factory;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletTaglib_1_0Package;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletXMLDefnTaglib;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FunctionDefn;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.HandlerTagDefn;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.SourceTagDefn;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.TagDefn;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.ValidatorTagDefn;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model <b>Package</b>.
- * <!-- end-user-doc -->
- * @generated
- */
-public class FaceletTaglib_1_0PackageImpl extends EPackageImpl implements FaceletTaglib_1_0Package
-{
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass faceletLibraryClassTagLibEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass faceletXMLDefnTaglibEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass faceletTaglibDefnEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass componentTagDefnEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass validatorTagDefnEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass converterTagDefnEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass handlerTagDefnEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass sourceTagDefnEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass tagDefnEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass functionDefnEClass = null;
-
-    /**
-     * Creates an instance of the model <b>Package</b>, registered with
-     * {@link org.eclipse.emf.ecore.EPackage.Registry EPackage.Registry} by the package
-     * package URI value.
-     * <p>Note: the correct way to create the package is via the static
-     * factory method {@link #init init()}, which also performs
-     * initialization of the package, or returns the registered package,
-     * if one already exists.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.emf.ecore.EPackage.Registry
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletTaglib_1_0Package#eNS_URI
-     * @see #init()
-     * @generated
-     */
-    private FaceletTaglib_1_0PackageImpl()
-    {
-        super(eNS_URI, FaceletTaglib_1_0Factory.eINSTANCE);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private static boolean isInited = false;
-
-    /**
-     * Creates, registers, and initializes the <b>Package</b> for this model, and for any others upon which it depends.
-     * 
-     * <p>This method is used to initialize {@link FaceletTaglib_1_0Package#eINSTANCE} when that field is accessed.
-     * Clients should not invoke it directly. Instead, they should simply access that field to obtain the package.
-     * <!-- begin-user-doc -->
-     * @return the package.
-     * <!-- end-user-doc -->
-     * @see #eNS_URI
-     * @see #createPackageContents()
-     * @see #initializePackageContents()
-     * @generated
-     */
-    public static FaceletTaglib_1_0Package init()
-    {
-        if (isInited) return (FaceletTaglib_1_0Package)EPackage.Registry.INSTANCE.getEPackage(FaceletTaglib_1_0Package.eNS_URI);
-
-        // Obtain or create and register package
-        FaceletTaglib_1_0PackageImpl theFaceletTaglib_1_0Package = (FaceletTaglib_1_0PackageImpl)(EPackage.Registry.INSTANCE.get(eNS_URI) instanceof FaceletTaglib_1_0PackageImpl ? EPackage.Registry.INSTANCE.get(eNS_URI) : new FaceletTaglib_1_0PackageImpl());
-
-        isInited = true;
-
-        // Create package meta-data objects
-        theFaceletTaglib_1_0Package.createPackageContents();
-
-        // Initialize created meta-data
-        theFaceletTaglib_1_0Package.initializePackageContents();
-
-        // Mark meta-data to indicate it can't be changed
-        theFaceletTaglib_1_0Package.freeze();
-
-  
-        // Update the registry and return the package
-        EPackage.Registry.INSTANCE.put(FaceletTaglib_1_0Package.eNS_URI, theFaceletTaglib_1_0Package);
-        return theFaceletTaglib_1_0Package;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getFaceletLibraryClassTagLib()
-    {
-        return faceletLibraryClassTagLibEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getFaceletLibraryClassTagLib_LibraryClass()
-    {
-        return (EAttribute)faceletLibraryClassTagLibEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getFaceletXMLDefnTaglib()
-    {
-        return faceletXMLDefnTaglibEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getFaceletXMLDefnTaglib_Namespace()
-    {
-        return (EAttribute)faceletXMLDefnTaglibEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EReference getFaceletXMLDefnTaglib_Tags()
-    {
-        return (EReference)faceletXMLDefnTaglibEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EReference getFaceletXMLDefnTaglib_Functions()
-    {
-        return (EReference)faceletXMLDefnTaglibEClass.getEStructuralFeatures().get(2);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getFaceletTaglibDefn()
-    {
-        return faceletTaglibDefnEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getComponentTagDefn()
-    {
-        return componentTagDefnEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getComponentTagDefn_ComponentType()
-    {
-        return (EAttribute)componentTagDefnEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getComponentTagDefn_RendererType()
-    {
-        return (EAttribute)componentTagDefnEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getValidatorTagDefn()
-    {
-        return validatorTagDefnEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getValidatorTagDefn_ValidatorId()
-    {
-        return (EAttribute)validatorTagDefnEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getConverterTagDefn()
-    {
-        return converterTagDefnEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getConverterTagDefn_ConverterId()
-    {
-        return (EAttribute)converterTagDefnEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getHandlerTagDefn()
-    {
-        return handlerTagDefnEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getHandlerTagDefn_HandlerClass()
-    {
-        return (EAttribute)handlerTagDefnEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getSourceTagDefn()
-    {
-        return sourceTagDefnEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getSourceTagDefn_Source()
-    {
-        return (EAttribute)sourceTagDefnEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getTagDefn()
-    {
-        return tagDefnEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getTagDefn_Name()
-    {
-        return (EAttribute)tagDefnEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getFunctionDefn()
-    {
-        return functionDefnEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getFunctionDefn_FunctionName()
-    {
-        return (EAttribute)functionDefnEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getFunctionDefn_FunctionClass()
-    {
-        return (EAttribute)functionDefnEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getFunctionDefn_FunctionSignature()
-    {
-        return (EAttribute)functionDefnEClass.getEStructuralFeatures().get(2);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public FaceletTaglib_1_0Factory getFaceletTaglib_1_0Factory()
-    {
-        return (FaceletTaglib_1_0Factory)getEFactoryInstance();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private boolean isCreated = false;
-
-    /**
-     * Creates the meta-model objects for the package.  This method is
-     * guarded to have no affect on any invocation but its first.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void createPackageContents()
-    {
-        if (isCreated) return;
-        isCreated = true;
-
-        // Create classes and their features
-        faceletLibraryClassTagLibEClass = createEClass(FACELET_LIBRARY_CLASS_TAG_LIB);
-        createEAttribute(faceletLibraryClassTagLibEClass, FACELET_LIBRARY_CLASS_TAG_LIB__LIBRARY_CLASS);
-
-        faceletXMLDefnTaglibEClass = createEClass(FACELET_XML_DEFN_TAGLIB);
-        createEAttribute(faceletXMLDefnTaglibEClass, FACELET_XML_DEFN_TAGLIB__NAMESPACE);
-        createEReference(faceletXMLDefnTaglibEClass, FACELET_XML_DEFN_TAGLIB__TAGS);
-        createEReference(faceletXMLDefnTaglibEClass, FACELET_XML_DEFN_TAGLIB__FUNCTIONS);
-
-        faceletTaglibDefnEClass = createEClass(FACELET_TAGLIB_DEFN);
-
-        componentTagDefnEClass = createEClass(COMPONENT_TAG_DEFN);
-        createEAttribute(componentTagDefnEClass, COMPONENT_TAG_DEFN__COMPONENT_TYPE);
-        createEAttribute(componentTagDefnEClass, COMPONENT_TAG_DEFN__RENDERER_TYPE);
-
-        validatorTagDefnEClass = createEClass(VALIDATOR_TAG_DEFN);
-        createEAttribute(validatorTagDefnEClass, VALIDATOR_TAG_DEFN__VALIDATOR_ID);
-
-        converterTagDefnEClass = createEClass(CONVERTER_TAG_DEFN);
-        createEAttribute(converterTagDefnEClass, CONVERTER_TAG_DEFN__CONVERTER_ID);
-
-        handlerTagDefnEClass = createEClass(HANDLER_TAG_DEFN);
-        createEAttribute(handlerTagDefnEClass, HANDLER_TAG_DEFN__HANDLER_CLASS);
-
-        sourceTagDefnEClass = createEClass(SOURCE_TAG_DEFN);
-        createEAttribute(sourceTagDefnEClass, SOURCE_TAG_DEFN__SOURCE);
-
-        tagDefnEClass = createEClass(TAG_DEFN);
-        createEAttribute(tagDefnEClass, TAG_DEFN__NAME);
-
-        functionDefnEClass = createEClass(FUNCTION_DEFN);
-        createEAttribute(functionDefnEClass, FUNCTION_DEFN__FUNCTION_NAME);
-        createEAttribute(functionDefnEClass, FUNCTION_DEFN__FUNCTION_CLASS);
-        createEAttribute(functionDefnEClass, FUNCTION_DEFN__FUNCTION_SIGNATURE);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private boolean isInitialized = false;
-
-    /**
-     * Complete the initialization of the package and its meta-model.  This
-     * method is guarded to have no affect on any invocation but its first.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void initializePackageContents()
-    {
-        if (isInitialized) return;
-        isInitialized = true;
-
-        // Initialize package
-        setName(eNAME);
-        setNsPrefix(eNS_PREFIX);
-        setNsURI(eNS_URI);
-
-        // Create type parameters
-
-        // Set bounds for type parameters
-
-        // Add supertypes to classes
-        faceletLibraryClassTagLibEClass.getESuperTypes().add(this.getFaceletTaglibDefn());
-        faceletXMLDefnTaglibEClass.getESuperTypes().add(this.getFaceletTaglibDefn());
-        componentTagDefnEClass.getESuperTypes().add(this.getHandlerTagDefn());
-        validatorTagDefnEClass.getESuperTypes().add(this.getHandlerTagDefn());
-        converterTagDefnEClass.getESuperTypes().add(this.getHandlerTagDefn());
-        handlerTagDefnEClass.getESuperTypes().add(this.getTagDefn());
-        sourceTagDefnEClass.getESuperTypes().add(this.getTagDefn());
-
-        // Initialize classes and features; add operations and parameters
-        initEClass(faceletLibraryClassTagLibEClass, FaceletLibraryClassTagLib.class, "FaceletLibraryClassTagLib", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-        initEAttribute(getFaceletLibraryClassTagLib_LibraryClass(), ecorePackage.getEString(), "libraryClass", null, 0, 1, FaceletLibraryClassTagLib.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-        initEClass(faceletXMLDefnTaglibEClass, FaceletXMLDefnTaglib.class, "FaceletXMLDefnTaglib", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-        initEAttribute(getFaceletXMLDefnTaglib_Namespace(), ecorePackage.getEString(), "namespace", null, 0, 1, FaceletXMLDefnTaglib.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-        initEReference(getFaceletXMLDefnTaglib_Tags(), this.getTagDefn(), null, "tags", null, 0, -1, FaceletXMLDefnTaglib.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-        initEReference(getFaceletXMLDefnTaglib_Functions(), this.getFunctionDefn(), null, "functions", null, 0, -1, FaceletXMLDefnTaglib.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-        initEClass(faceletTaglibDefnEClass, FaceletTaglibDefn.class, "FaceletTaglibDefn", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-
-        initEClass(componentTagDefnEClass, ComponentTagDefn.class, "ComponentTagDefn", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-        initEAttribute(getComponentTagDefn_ComponentType(), ecorePackage.getEString(), "componentType", null, 0, 1, ComponentTagDefn.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-        initEAttribute(getComponentTagDefn_RendererType(), ecorePackage.getEString(), "rendererType", null, 0, 1, ComponentTagDefn.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-        initEClass(validatorTagDefnEClass, ValidatorTagDefn.class, "ValidatorTagDefn", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-        initEAttribute(getValidatorTagDefn_ValidatorId(), ecorePackage.getEString(), "validatorId", null, 0, 1, ValidatorTagDefn.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-        initEClass(converterTagDefnEClass, ConverterTagDefn.class, "ConverterTagDefn", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-        initEAttribute(getConverterTagDefn_ConverterId(), ecorePackage.getEString(), "converterId", null, 0, 1, ConverterTagDefn.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-        initEClass(handlerTagDefnEClass, HandlerTagDefn.class, "HandlerTagDefn", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-        initEAttribute(getHandlerTagDefn_HandlerClass(), ecorePackage.getEString(), "handlerClass", null, 0, 1, HandlerTagDefn.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-        initEClass(sourceTagDefnEClass, SourceTagDefn.class, "SourceTagDefn", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-        initEAttribute(getSourceTagDefn_Source(), ecorePackage.getEString(), "source", null, 0, 1, SourceTagDefn.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-        initEClass(tagDefnEClass, TagDefn.class, "TagDefn", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-        initEAttribute(getTagDefn_Name(), ecorePackage.getEString(), "name", null, 0, 1, TagDefn.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-        initEClass(functionDefnEClass, FunctionDefn.class, "FunctionDefn", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-        initEAttribute(getFunctionDefn_FunctionName(), ecorePackage.getEString(), "functionName", null, 0, 1, FunctionDefn.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-        initEAttribute(getFunctionDefn_FunctionClass(), ecorePackage.getEString(), "functionClass", null, 0, 1, FunctionDefn.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-        initEAttribute(getFunctionDefn_FunctionSignature(), ecorePackage.getEString(), "functionSignature", null, 0, 1, FunctionDefn.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-        // Create resource
-        createResource(eNS_URI);
-    }
-
-} //FaceletTaglib_1_0PackageImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib_1_0/impl/FaceletXMLDefnTaglibImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib_1_0/impl/FaceletXMLDefnTaglibImpl.java
deleted file mode 100644
index e461e93..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib_1_0/impl/FaceletXMLDefnTaglibImpl.java
+++ /dev/null
@@ -1,256 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: FaceletXMLDefnTaglibImpl.java,v 1.1 2010/03/18 06:24:28 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.util.EObjectResolvingEList;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletTaglib_1_0Package;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletXMLDefnTaglib;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FunctionDefn;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.TagDefn;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Facelet XML Defn Taglib</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.FaceletXMLDefnTaglibImpl#getNamespace <em>Namespace</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.FaceletXMLDefnTaglibImpl#getTags <em>Tags</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.FaceletXMLDefnTaglibImpl#getFunctions <em>Functions</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class FaceletXMLDefnTaglibImpl extends FaceletTaglibDefnImpl implements FaceletXMLDefnTaglib
-{
-    /**
-     * The default value of the '{@link #getNamespace() <em>Namespace</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getNamespace()
-     * @generated
-     * @ordered
-     */
-    protected static final String NAMESPACE_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getNamespace() <em>Namespace</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getNamespace()
-     * @generated
-     * @ordered
-     */
-    protected String namespace = NAMESPACE_EDEFAULT;
-
-    /**
-     * The cached value of the '{@link #getTags() <em>Tags</em>}' reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getTags()
-     * @generated
-     * @ordered
-     */
-    protected EList<TagDefn> tags;
-
-    /**
-     * The cached value of the '{@link #getFunctions() <em>Functions</em>}' reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getFunctions()
-     * @generated
-     * @ordered
-     */
-    protected EList<FunctionDefn> functions;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected FaceletXMLDefnTaglibImpl()
-    {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    protected EClass eStaticClass()
-    {
-        return FaceletTaglib_1_0Package.Literals.FACELET_XML_DEFN_TAGLIB;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String getNamespace()
-    {
-        return namespace;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setNamespace(String newNamespace)
-    {
-        String oldNamespace = namespace;
-        namespace = newNamespace;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FaceletTaglib_1_0Package.FACELET_XML_DEFN_TAGLIB__NAMESPACE, oldNamespace, namespace));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EList<TagDefn> getTags()
-    {
-        if (tags == null)
-        {
-            tags = new EObjectResolvingEList<TagDefn>(TagDefn.class, this, FaceletTaglib_1_0Package.FACELET_XML_DEFN_TAGLIB__TAGS);
-        }
-        return tags;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EList<FunctionDefn> getFunctions()
-    {
-        if (functions == null)
-        {
-            functions = new EObjectResolvingEList<FunctionDefn>(FunctionDefn.class, this, FaceletTaglib_1_0Package.FACELET_XML_DEFN_TAGLIB__FUNCTIONS);
-        }
-        return functions;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public Object eGet(int featureID, boolean resolve, boolean coreType)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglib_1_0Package.FACELET_XML_DEFN_TAGLIB__NAMESPACE:
-                return getNamespace();
-            case FaceletTaglib_1_0Package.FACELET_XML_DEFN_TAGLIB__TAGS:
-                return getTags();
-            case FaceletTaglib_1_0Package.FACELET_XML_DEFN_TAGLIB__FUNCTIONS:
-                return getFunctions();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @SuppressWarnings("unchecked")
-    @Override
-    public void eSet(int featureID, Object newValue)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglib_1_0Package.FACELET_XML_DEFN_TAGLIB__NAMESPACE:
-                setNamespace((String)newValue);
-                return;
-            case FaceletTaglib_1_0Package.FACELET_XML_DEFN_TAGLIB__TAGS:
-                getTags().clear();
-                getTags().addAll((Collection<? extends TagDefn>)newValue);
-                return;
-            case FaceletTaglib_1_0Package.FACELET_XML_DEFN_TAGLIB__FUNCTIONS:
-                getFunctions().clear();
-                getFunctions().addAll((Collection<? extends FunctionDefn>)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public void eUnset(int featureID)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglib_1_0Package.FACELET_XML_DEFN_TAGLIB__NAMESPACE:
-                setNamespace(NAMESPACE_EDEFAULT);
-                return;
-            case FaceletTaglib_1_0Package.FACELET_XML_DEFN_TAGLIB__TAGS:
-                getTags().clear();
-                return;
-            case FaceletTaglib_1_0Package.FACELET_XML_DEFN_TAGLIB__FUNCTIONS:
-                getFunctions().clear();
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public boolean eIsSet(int featureID)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglib_1_0Package.FACELET_XML_DEFN_TAGLIB__NAMESPACE:
-                return NAMESPACE_EDEFAULT == null ? namespace != null : !NAMESPACE_EDEFAULT.equals(namespace);
-            case FaceletTaglib_1_0Package.FACELET_XML_DEFN_TAGLIB__TAGS:
-                return tags != null && !tags.isEmpty();
-            case FaceletTaglib_1_0Package.FACELET_XML_DEFN_TAGLIB__FUNCTIONS:
-                return functions != null && !functions.isEmpty();
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public String toString()
-    {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (namespace: "); //$NON-NLS-1$
-        result.append(namespace);
-        result.append(')');
-        return result.toString();
-    }
-
-} //FaceletXMLDefnTaglibImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib_1_0/impl/FunctionDefnImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib_1_0/impl/FunctionDefnImpl.java
deleted file mode 100644
index d11932c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib_1_0/impl/FunctionDefnImpl.java
+++ /dev/null
@@ -1,290 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: FunctionDefnImpl.java,v 1.1 2010/03/18 06:24:28 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletTaglib_1_0Package;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FunctionDefn;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Function Defn</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.FunctionDefnImpl#getFunctionName <em>Function Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.FunctionDefnImpl#getFunctionClass <em>Function Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.FunctionDefnImpl#getFunctionSignature <em>Function Signature</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class FunctionDefnImpl extends EObjectImpl implements FunctionDefn
-{
-    /**
-     * The default value of the '{@link #getFunctionName() <em>Function Name</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getFunctionName()
-     * @generated
-     * @ordered
-     */
-    protected static final String FUNCTION_NAME_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getFunctionName() <em>Function Name</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getFunctionName()
-     * @generated
-     * @ordered
-     */
-    protected String functionName = FUNCTION_NAME_EDEFAULT;
-
-    /**
-     * The default value of the '{@link #getFunctionClass() <em>Function Class</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getFunctionClass()
-     * @generated
-     * @ordered
-     */
-    protected static final String FUNCTION_CLASS_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getFunctionClass() <em>Function Class</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getFunctionClass()
-     * @generated
-     * @ordered
-     */
-    protected String functionClass = FUNCTION_CLASS_EDEFAULT;
-
-    /**
-     * The default value of the '{@link #getFunctionSignature() <em>Function Signature</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getFunctionSignature()
-     * @generated
-     * @ordered
-     */
-    protected static final String FUNCTION_SIGNATURE_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getFunctionSignature() <em>Function Signature</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getFunctionSignature()
-     * @generated
-     * @ordered
-     */
-    protected String functionSignature = FUNCTION_SIGNATURE_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected FunctionDefnImpl()
-    {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    protected EClass eStaticClass()
-    {
-        return FaceletTaglib_1_0Package.Literals.FUNCTION_DEFN;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String getFunctionName()
-    {
-        return functionName;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setFunctionName(String newFunctionName)
-    {
-        String oldFunctionName = functionName;
-        functionName = newFunctionName;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FaceletTaglib_1_0Package.FUNCTION_DEFN__FUNCTION_NAME, oldFunctionName, functionName));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String getFunctionClass()
-    {
-        return functionClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setFunctionClass(String newFunctionClass)
-    {
-        String oldFunctionClass = functionClass;
-        functionClass = newFunctionClass;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FaceletTaglib_1_0Package.FUNCTION_DEFN__FUNCTION_CLASS, oldFunctionClass, functionClass));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String getFunctionSignature()
-    {
-        return functionSignature;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setFunctionSignature(String newFunctionSignature)
-    {
-        String oldFunctionSignature = functionSignature;
-        functionSignature = newFunctionSignature;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FaceletTaglib_1_0Package.FUNCTION_DEFN__FUNCTION_SIGNATURE, oldFunctionSignature, functionSignature));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public Object eGet(int featureID, boolean resolve, boolean coreType)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglib_1_0Package.FUNCTION_DEFN__FUNCTION_NAME:
-                return getFunctionName();
-            case FaceletTaglib_1_0Package.FUNCTION_DEFN__FUNCTION_CLASS:
-                return getFunctionClass();
-            case FaceletTaglib_1_0Package.FUNCTION_DEFN__FUNCTION_SIGNATURE:
-                return getFunctionSignature();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public void eSet(int featureID, Object newValue)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglib_1_0Package.FUNCTION_DEFN__FUNCTION_NAME:
-                setFunctionName((String)newValue);
-                return;
-            case FaceletTaglib_1_0Package.FUNCTION_DEFN__FUNCTION_CLASS:
-                setFunctionClass((String)newValue);
-                return;
-            case FaceletTaglib_1_0Package.FUNCTION_DEFN__FUNCTION_SIGNATURE:
-                setFunctionSignature((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public void eUnset(int featureID)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglib_1_0Package.FUNCTION_DEFN__FUNCTION_NAME:
-                setFunctionName(FUNCTION_NAME_EDEFAULT);
-                return;
-            case FaceletTaglib_1_0Package.FUNCTION_DEFN__FUNCTION_CLASS:
-                setFunctionClass(FUNCTION_CLASS_EDEFAULT);
-                return;
-            case FaceletTaglib_1_0Package.FUNCTION_DEFN__FUNCTION_SIGNATURE:
-                setFunctionSignature(FUNCTION_SIGNATURE_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public boolean eIsSet(int featureID)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglib_1_0Package.FUNCTION_DEFN__FUNCTION_NAME:
-                return FUNCTION_NAME_EDEFAULT == null ? functionName != null : !FUNCTION_NAME_EDEFAULT.equals(functionName);
-            case FaceletTaglib_1_0Package.FUNCTION_DEFN__FUNCTION_CLASS:
-                return FUNCTION_CLASS_EDEFAULT == null ? functionClass != null : !FUNCTION_CLASS_EDEFAULT.equals(functionClass);
-            case FaceletTaglib_1_0Package.FUNCTION_DEFN__FUNCTION_SIGNATURE:
-                return FUNCTION_SIGNATURE_EDEFAULT == null ? functionSignature != null : !FUNCTION_SIGNATURE_EDEFAULT.equals(functionSignature);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public String toString()
-    {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (functionName: "); //$NON-NLS-1$
-        result.append(functionName);
-        result.append(", functionClass: "); //$NON-NLS-1$
-        result.append(functionClass);
-        result.append(", functionSignature: "); //$NON-NLS-1$
-        result.append(functionSignature);
-        result.append(')');
-        return result.toString();
-    }
-
-} //FunctionDefnImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib_1_0/impl/HandlerTagDefnImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib_1_0/impl/HandlerTagDefnImpl.java
deleted file mode 100644
index 0fbc010..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib_1_0/impl/HandlerTagDefnImpl.java
+++ /dev/null
@@ -1,177 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: HandlerTagDefnImpl.java,v 1.1 2010/03/18 06:24:28 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletTaglib_1_0Package;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.HandlerTagDefn;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Handler Tag Defn</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.HandlerTagDefnImpl#getHandlerClass <em>Handler Class</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class HandlerTagDefnImpl extends TagDefnImpl implements HandlerTagDefn
-{
-    /**
-     * The default value of the '{@link #getHandlerClass() <em>Handler Class</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getHandlerClass()
-     * @generated
-     * @ordered
-     */
-    protected static final String HANDLER_CLASS_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getHandlerClass() <em>Handler Class</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getHandlerClass()
-     * @generated
-     * @ordered
-     */
-    protected String handlerClass = HANDLER_CLASS_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected HandlerTagDefnImpl()
-    {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    protected EClass eStaticClass()
-    {
-        return FaceletTaglib_1_0Package.Literals.HANDLER_TAG_DEFN;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String getHandlerClass()
-    {
-        return handlerClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setHandlerClass(String newHandlerClass)
-    {
-        String oldHandlerClass = handlerClass;
-        handlerClass = newHandlerClass;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FaceletTaglib_1_0Package.HANDLER_TAG_DEFN__HANDLER_CLASS, oldHandlerClass, handlerClass));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public Object eGet(int featureID, boolean resolve, boolean coreType)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglib_1_0Package.HANDLER_TAG_DEFN__HANDLER_CLASS:
-                return getHandlerClass();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public void eSet(int featureID, Object newValue)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglib_1_0Package.HANDLER_TAG_DEFN__HANDLER_CLASS:
-                setHandlerClass((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public void eUnset(int featureID)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglib_1_0Package.HANDLER_TAG_DEFN__HANDLER_CLASS:
-                setHandlerClass(HANDLER_CLASS_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public boolean eIsSet(int featureID)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglib_1_0Package.HANDLER_TAG_DEFN__HANDLER_CLASS:
-                return HANDLER_CLASS_EDEFAULT == null ? handlerClass != null : !HANDLER_CLASS_EDEFAULT.equals(handlerClass);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public String toString()
-    {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (handlerClass: "); //$NON-NLS-1$
-        result.append(handlerClass);
-        result.append(')');
-        return result.toString();
-    }
-
-} //HandlerTagDefnImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib_1_0/impl/SourceTagDefnImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib_1_0/impl/SourceTagDefnImpl.java
deleted file mode 100644
index 95b98bf..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib_1_0/impl/SourceTagDefnImpl.java
+++ /dev/null
@@ -1,177 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: SourceTagDefnImpl.java,v 1.1 2010/03/18 06:24:28 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletTaglib_1_0Package;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.SourceTagDefn;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Source Tag Defn</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.SourceTagDefnImpl#getSource <em>Source</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class SourceTagDefnImpl extends TagDefnImpl implements SourceTagDefn
-{
-    /**
-     * The default value of the '{@link #getSource() <em>Source</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getSource()
-     * @generated
-     * @ordered
-     */
-    protected static final String SOURCE_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getSource() <em>Source</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getSource()
-     * @generated
-     * @ordered
-     */
-    protected String source = SOURCE_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected SourceTagDefnImpl()
-    {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    protected EClass eStaticClass()
-    {
-        return FaceletTaglib_1_0Package.Literals.SOURCE_TAG_DEFN;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String getSource()
-    {
-        return source;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setSource(String newSource)
-    {
-        String oldSource = source;
-        source = newSource;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FaceletTaglib_1_0Package.SOURCE_TAG_DEFN__SOURCE, oldSource, source));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public Object eGet(int featureID, boolean resolve, boolean coreType)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglib_1_0Package.SOURCE_TAG_DEFN__SOURCE:
-                return getSource();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public void eSet(int featureID, Object newValue)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglib_1_0Package.SOURCE_TAG_DEFN__SOURCE:
-                setSource((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public void eUnset(int featureID)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglib_1_0Package.SOURCE_TAG_DEFN__SOURCE:
-                setSource(SOURCE_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public boolean eIsSet(int featureID)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglib_1_0Package.SOURCE_TAG_DEFN__SOURCE:
-                return SOURCE_EDEFAULT == null ? source != null : !SOURCE_EDEFAULT.equals(source);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public String toString()
-    {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (source: "); //$NON-NLS-1$
-        result.append(source);
-        result.append(')');
-        return result.toString();
-    }
-
-} //SourceTagDefnImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib_1_0/impl/TagDefnImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib_1_0/impl/TagDefnImpl.java
deleted file mode 100644
index 68a7c59..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib_1_0/impl/TagDefnImpl.java
+++ /dev/null
@@ -1,178 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: TagDefnImpl.java,v 1.1 2010/03/18 06:24:28 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletTaglib_1_0Package;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.TagDefn;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Tag Defn</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.TagDefnImpl#getName <em>Name</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class TagDefnImpl extends EObjectImpl implements TagDefn
-{
-    /**
-     * The default value of the '{@link #getName() <em>Name</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getName()
-     * @generated
-     * @ordered
-     */
-    protected static final String NAME_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getName() <em>Name</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getName()
-     * @generated
-     * @ordered
-     */
-    protected String name = NAME_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected TagDefnImpl()
-    {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    protected EClass eStaticClass()
-    {
-        return FaceletTaglib_1_0Package.Literals.TAG_DEFN;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String getName()
-    {
-        return name;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setName(String newName)
-    {
-        String oldName = name;
-        name = newName;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FaceletTaglib_1_0Package.TAG_DEFN__NAME, oldName, name));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public Object eGet(int featureID, boolean resolve, boolean coreType)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglib_1_0Package.TAG_DEFN__NAME:
-                return getName();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public void eSet(int featureID, Object newValue)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglib_1_0Package.TAG_DEFN__NAME:
-                setName((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public void eUnset(int featureID)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglib_1_0Package.TAG_DEFN__NAME:
-                setName(NAME_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public boolean eIsSet(int featureID)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglib_1_0Package.TAG_DEFN__NAME:
-                return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT.equals(name);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public String toString()
-    {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (name: "); //$NON-NLS-1$
-        result.append(name);
-        result.append(')');
-        return result.toString();
-    }
-
-} //TagDefnImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib_1_0/impl/ValidatorTagDefnImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib_1_0/impl/ValidatorTagDefnImpl.java
deleted file mode 100644
index 3cc23ac..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib_1_0/impl/ValidatorTagDefnImpl.java
+++ /dev/null
@@ -1,177 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ValidatorTagDefnImpl.java,v 1.1 2010/03/18 06:24:28 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletTaglib_1_0Package;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.ValidatorTagDefn;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Validator Tag Defn</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.impl.ValidatorTagDefnImpl#getValidatorId <em>Validator Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ValidatorTagDefnImpl extends HandlerTagDefnImpl implements ValidatorTagDefn
-{
-    /**
-     * The default value of the '{@link #getValidatorId() <em>Validator Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getValidatorId()
-     * @generated
-     * @ordered
-     */
-    protected static final String VALIDATOR_ID_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getValidatorId() <em>Validator Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getValidatorId()
-     * @generated
-     * @ordered
-     */
-    protected String validatorId = VALIDATOR_ID_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected ValidatorTagDefnImpl()
-    {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    protected EClass eStaticClass()
-    {
-        return FaceletTaglib_1_0Package.Literals.VALIDATOR_TAG_DEFN;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String getValidatorId()
-    {
-        return validatorId;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setValidatorId(String newValidatorId)
-    {
-        String oldValidatorId = validatorId;
-        validatorId = newValidatorId;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FaceletTaglib_1_0Package.VALIDATOR_TAG_DEFN__VALIDATOR_ID, oldValidatorId, validatorId));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public Object eGet(int featureID, boolean resolve, boolean coreType)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglib_1_0Package.VALIDATOR_TAG_DEFN__VALIDATOR_ID:
-                return getValidatorId();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public void eSet(int featureID, Object newValue)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglib_1_0Package.VALIDATOR_TAG_DEFN__VALIDATOR_ID:
-                setValidatorId((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public void eUnset(int featureID)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglib_1_0Package.VALIDATOR_TAG_DEFN__VALIDATOR_ID:
-                setValidatorId(VALIDATOR_ID_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public boolean eIsSet(int featureID)
-    {
-        switch (featureID)
-        {
-            case FaceletTaglib_1_0Package.VALIDATOR_TAG_DEFN__VALIDATOR_ID:
-                return VALIDATOR_ID_EDEFAULT == null ? validatorId != null : !VALIDATOR_ID_EDEFAULT.equals(validatorId);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public String toString()
-    {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (validatorId: "); //$NON-NLS-1$
-        result.append(validatorId);
-        result.append(')');
-        return result.toString();
-    }
-
-} //ValidatorTagDefnImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib_1_0/util/FaceletTaglibAdapterFactory.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib_1_0/util/FaceletTaglibAdapterFactory.java
deleted file mode 100644
index e7bc103..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib_1_0/util/FaceletTaglibAdapterFactory.java
+++ /dev/null
@@ -1,323 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: FaceletTaglibAdapterFactory.java,v 1.1 2010/03/18 06:24:40 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.util;
-
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.common.notify.Notifier;
-import org.eclipse.emf.common.notify.impl.AdapterFactoryImpl;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.ComponentTagDefn;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.ConverterTagDefn;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletLibraryClassTagLib;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletTaglibDefn;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletTaglibPackage;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletXMLDefnTaglib;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FunctionDefn;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.HandlerTagDefn;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.SourceTagDefn;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.TagDefn;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.ValidatorTagDefn;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Adapter Factory</b> for the model.
- * It provides an adapter <code>createXXX</code> method for each class of the model.
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletTaglibPackage
- * @generated
- */
-public class FaceletTaglibAdapterFactory extends AdapterFactoryImpl
-{
-    /**
-     * The cached model package.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected static FaceletTaglibPackage modelPackage;
-
-    /**
-     * Creates an instance of the adapter factory.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public FaceletTaglibAdapterFactory()
-    {
-        if (modelPackage == null)
-        {
-            modelPackage = FaceletTaglibPackage.eINSTANCE;
-        }
-    }
-
-    /**
-     * Returns whether this factory is applicable for the type of the object.
-     * <!-- begin-user-doc -->
-     * This implementation returns <code>true</code> if the object is either the model's package or is an instance object of the model.
-     * <!-- end-user-doc -->
-     * @return whether this factory is applicable for the type of the object.
-     * @generated
-     */
-    @Override
-    public boolean isFactoryForType(Object object)
-    {
-        if (object == modelPackage)
-        {
-            return true;
-        }
-        if (object instanceof EObject)
-        {
-            return ((EObject)object).eClass().getEPackage() == modelPackage;
-        }
-        return false;
-    }
-
-    /**
-     * The switch that delegates to the <code>createXXX</code> methods.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected FaceletTaglibSwitch<Adapter> modelSwitch =
-        new FaceletTaglibSwitch<Adapter>()
-        {
-            @Override
-            public Adapter caseFaceletLibraryClassTagLib(FaceletLibraryClassTagLib object)
-            {
-                return createFaceletLibraryClassTagLibAdapter();
-            }
-            @Override
-            public Adapter caseFaceletXMLDefnTaglib(FaceletXMLDefnTaglib object)
-            {
-                return createFaceletXMLDefnTaglibAdapter();
-            }
-            @Override
-            public Adapter caseFaceletTaglibDefn(FaceletTaglibDefn object)
-            {
-                return createFaceletTaglibDefnAdapter();
-            }
-            @Override
-            public Adapter caseComponentTagDefn(ComponentTagDefn object)
-            {
-                return createComponentTagDefnAdapter();
-            }
-            @Override
-            public Adapter caseValidatorTagDefn(ValidatorTagDefn object)
-            {
-                return createValidatorTagDefnAdapter();
-            }
-            @Override
-            public Adapter caseConverterTagDefn(ConverterTagDefn object)
-            {
-                return createConverterTagDefnAdapter();
-            }
-            @Override
-            public Adapter caseHandlerTagDefn(HandlerTagDefn object)
-            {
-                return createHandlerTagDefnAdapter();
-            }
-            @Override
-            public Adapter caseSourceTagDefn(SourceTagDefn object)
-            {
-                return createSourceTagDefnAdapter();
-            }
-            @Override
-            public Adapter caseTagDefn(TagDefn object)
-            {
-                return createTagDefnAdapter();
-            }
-            @Override
-            public Adapter caseFunctionDefn(FunctionDefn object)
-            {
-                return createFunctionDefnAdapter();
-            }
-            @Override
-            public Adapter defaultCase(EObject object)
-            {
-                return createEObjectAdapter();
-            }
-        };
-
-    /**
-     * Creates an adapter for the <code>target</code>.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param target the object to adapt.
-     * @return the adapter for the <code>target</code>.
-     * @generated
-     */
-    @Override
-    public Adapter createAdapter(Notifier target)
-    {
-        return modelSwitch.doSwitch((EObject)target);
-    }
-
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletLibraryClassTagLib <em>Facelet Library Class Tag Lib</em>}'.
-     * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletLibraryClassTagLib
-     * @generated
-     */
-    public Adapter createFaceletLibraryClassTagLibAdapter()
-    {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletXMLDefnTaglib <em>Facelet XML Defn Taglib</em>}'.
-     * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletXMLDefnTaglib
-     * @generated
-     */
-    public Adapter createFaceletXMLDefnTaglibAdapter()
-    {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletTaglibDefn <em>Defn</em>}'.
-     * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletTaglibDefn
-     * @generated
-     */
-    public Adapter createFaceletTaglibDefnAdapter()
-    {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.ComponentTagDefn <em>Component Tag Defn</em>}'.
-     * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.ComponentTagDefn
-     * @generated
-     */
-    public Adapter createComponentTagDefnAdapter()
-    {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.ValidatorTagDefn <em>Validator Tag Defn</em>}'.
-     * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.ValidatorTagDefn
-     * @generated
-     */
-    public Adapter createValidatorTagDefnAdapter()
-    {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.ConverterTagDefn <em>Converter Tag Defn</em>}'.
-     * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.ConverterTagDefn
-     * @generated
-     */
-    public Adapter createConverterTagDefnAdapter()
-    {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.HandlerTagDefn <em>Handler Tag Defn</em>}'.
-     * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.HandlerTagDefn
-     * @generated
-     */
-    public Adapter createHandlerTagDefnAdapter()
-    {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.SourceTagDefn <em>Source Tag Defn</em>}'.
-     * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.SourceTagDefn
-     * @generated
-     */
-    public Adapter createSourceTagDefnAdapter()
-    {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.TagDefn <em>Tag Defn</em>}'.
-     * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.TagDefn
-     * @generated
-     */
-    public Adapter createTagDefnAdapter()
-    {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FunctionDefn <em>Function Defn</em>}'.
-     * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FunctionDefn
-     * @generated
-     */
-    public Adapter createFunctionDefnAdapter()
-    {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for the default case.
-     * <!-- begin-user-doc -->
-     * This default implementation returns null.
-     * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @generated
-     */
-    public Adapter createEObjectAdapter()
-    {
-        return null;
-    }
-
-} //FaceletTaglibAdapterFactory
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib_1_0/util/FaceletTaglibSwitch.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib_1_0/util/FaceletTaglibSwitch.java
deleted file mode 100644
index 7fbbaee..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib_1_0/util/FaceletTaglibSwitch.java
+++ /dev/null
@@ -1,371 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: FaceletTaglibSwitch.java,v 1.1 2010/03/18 06:24:40 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.util;
-
-import java.util.List;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.ComponentTagDefn;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.ConverterTagDefn;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletLibraryClassTagLib;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletTaglibDefn;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletTaglibPackage;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletXMLDefnTaglib;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FunctionDefn;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.HandlerTagDefn;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.SourceTagDefn;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.TagDefn;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.ValidatorTagDefn;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Switch</b> for the model's inheritance hierarchy.
- * It supports the call {@link #doSwitch(EObject) doSwitch(object)}
- * to invoke the <code>caseXXX</code> method for each class of the model,
- * starting with the actual class of the object
- * and proceeding up the inheritance hierarchy
- * until a non-null result is returned,
- * which is the result of the switch.
- * @param <T> 
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletTaglibPackage
- * @generated
- */
-public class FaceletTaglibSwitch<T>
-{
-    /**
-     * The cached model package
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected static FaceletTaglibPackage modelPackage;
-
-    /**
-     * Creates an instance of the switch.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public FaceletTaglibSwitch()
-    {
-        if (modelPackage == null)
-        {
-            modelPackage = FaceletTaglibPackage.eINSTANCE;
-        }
-    }
-
-    /**
-     * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
-     * <!-- begin-user-doc -->
-     * @param theEObject 
-     * <!-- end-user-doc -->
-     * @return the first non-null result returned by a <code>caseXXX</code> call.
-     * @generated
-     */
-    public T doSwitch(EObject theEObject)
-    {
-        return doSwitch(theEObject.eClass(), theEObject);
-    }
-
-    /**
-     * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
-     * <!-- begin-user-doc -->
-     * @param theEClass 
-     * @param theEObject 
-     * <!-- end-user-doc -->
-     * @return the first non-null result returned by a <code>caseXXX</code> call.
-     * @generated
-     */
-    protected T doSwitch(EClass theEClass, EObject theEObject)
-    {
-        if (theEClass.eContainer() == modelPackage)
-        {
-            return doSwitch(theEClass.getClassifierID(), theEObject);
-        }
-        List<EClass> eSuperTypes = theEClass.getESuperTypes();
-        return
-            eSuperTypes.isEmpty() ?
-                defaultCase(theEObject) :
-                doSwitch(eSuperTypes.get(0), theEObject);
-    }
-
-    /**
-     * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
-     * <!-- begin-user-doc -->
-     * @param classifierID 
-     * @param theEObject 
-     * <!-- end-user-doc -->
-     * @return the first non-null result returned by a <code>caseXXX</code> call.
-     * @generated
-     */
-    protected T doSwitch(int classifierID, EObject theEObject)
-    {
-        switch (classifierID)
-        {
-            case FaceletTaglibPackage.FACELET_LIBRARY_CLASS_TAG_LIB:
-            {
-                FaceletLibraryClassTagLib faceletLibraryClassTagLib = (FaceletLibraryClassTagLib)theEObject;
-                T result = caseFaceletLibraryClassTagLib(faceletLibraryClassTagLib);
-                if (result == null) result = caseFaceletTaglibDefn(faceletLibraryClassTagLib);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FaceletTaglibPackage.FACELET_XML_DEFN_TAGLIB:
-            {
-                FaceletXMLDefnTaglib faceletXMLDefnTaglib = (FaceletXMLDefnTaglib)theEObject;
-                T result = caseFaceletXMLDefnTaglib(faceletXMLDefnTaglib);
-                if (result == null) result = caseFaceletTaglibDefn(faceletXMLDefnTaglib);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FaceletTaglibPackage.FACELET_TAGLIB_DEFN:
-            {
-                FaceletTaglibDefn faceletTaglibDefn = (FaceletTaglibDefn)theEObject;
-                T result = caseFaceletTaglibDefn(faceletTaglibDefn);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FaceletTaglibPackage.COMPONENT_TAG_DEFN:
-            {
-                ComponentTagDefn componentTagDefn = (ComponentTagDefn)theEObject;
-                T result = caseComponentTagDefn(componentTagDefn);
-                if (result == null) result = caseHandlerTagDefn(componentTagDefn);
-                if (result == null) result = caseTagDefn(componentTagDefn);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FaceletTaglibPackage.VALIDATOR_TAG_DEFN:
-            {
-                ValidatorTagDefn validatorTagDefn = (ValidatorTagDefn)theEObject;
-                T result = caseValidatorTagDefn(validatorTagDefn);
-                if (result == null) result = caseHandlerTagDefn(validatorTagDefn);
-                if (result == null) result = caseTagDefn(validatorTagDefn);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FaceletTaglibPackage.CONVERTER_TAG_DEFN:
-            {
-                ConverterTagDefn converterTagDefn = (ConverterTagDefn)theEObject;
-                T result = caseConverterTagDefn(converterTagDefn);
-                if (result == null) result = caseHandlerTagDefn(converterTagDefn);
-                if (result == null) result = caseTagDefn(converterTagDefn);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FaceletTaglibPackage.HANDLER_TAG_DEFN:
-            {
-                HandlerTagDefn handlerTagDefn = (HandlerTagDefn)theEObject;
-                T result = caseHandlerTagDefn(handlerTagDefn);
-                if (result == null) result = caseTagDefn(handlerTagDefn);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FaceletTaglibPackage.SOURCE_TAG_DEFN:
-            {
-                SourceTagDefn sourceTagDefn = (SourceTagDefn)theEObject;
-                T result = caseSourceTagDefn(sourceTagDefn);
-                if (result == null) result = caseTagDefn(sourceTagDefn);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FaceletTaglibPackage.TAG_DEFN:
-            {
-                TagDefn tagDefn = (TagDefn)theEObject;
-                T result = caseTagDefn(tagDefn);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FaceletTaglibPackage.FUNCTION_DEFN:
-            {
-                FunctionDefn functionDefn = (FunctionDefn)theEObject;
-                T result = caseFunctionDefn(functionDefn);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            default: return defaultCase(theEObject);
-        }
-    }
-
-    /**
-     * Returns the result of interpreting the object as an instance of '<em>Facelet Library Class Tag Lib</em>'.
-     * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpreting the object as an instance of '<em>Facelet Library Class Tag Lib</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-    public T caseFaceletLibraryClassTagLib(FaceletLibraryClassTagLib object)
-    {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpreting the object as an instance of '<em>Facelet XML Defn Taglib</em>'.
-     * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpreting the object as an instance of '<em>Facelet XML Defn Taglib</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-    public T caseFaceletXMLDefnTaglib(FaceletXMLDefnTaglib object)
-    {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpreting the object as an instance of '<em>Defn</em>'.
-     * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpreting the object as an instance of '<em>Defn</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-    public T caseFaceletTaglibDefn(FaceletTaglibDefn object)
-    {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpreting the object as an instance of '<em>Component Tag Defn</em>'.
-     * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpreting the object as an instance of '<em>Component Tag Defn</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-    public T caseComponentTagDefn(ComponentTagDefn object)
-    {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpreting the object as an instance of '<em>Validator Tag Defn</em>'.
-     * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpreting the object as an instance of '<em>Validator Tag Defn</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-    public T caseValidatorTagDefn(ValidatorTagDefn object)
-    {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpreting the object as an instance of '<em>Converter Tag Defn</em>'.
-     * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpreting the object as an instance of '<em>Converter Tag Defn</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-    public T caseConverterTagDefn(ConverterTagDefn object)
-    {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpreting the object as an instance of '<em>Handler Tag Defn</em>'.
-     * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpreting the object as an instance of '<em>Handler Tag Defn</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-    public T caseHandlerTagDefn(HandlerTagDefn object)
-    {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpreting the object as an instance of '<em>Source Tag Defn</em>'.
-     * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpreting the object as an instance of '<em>Source Tag Defn</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-    public T caseSourceTagDefn(SourceTagDefn object)
-    {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpreting the object as an instance of '<em>Tag Defn</em>'.
-     * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpreting the object as an instance of '<em>Tag Defn</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-    public T caseTagDefn(TagDefn object)
-    {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpreting the object as an instance of '<em>Function Defn</em>'.
-     * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpreting the object as an instance of '<em>Function Defn</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-    public T caseFunctionDefn(FunctionDefn object)
-    {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpreting the object as an instance of '<em>EObject</em>'.
-     * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch, but this is the last case anyway.
-     * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpreting the object as an instance of '<em>EObject</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject)
-     * @generated
-     */
-    public T defaultCase(EObject object)
-    {
-        return null;
-    }
-
-} //FaceletTaglibSwitch
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib_1_0/util/FaceletTaglib_1_0AdapterFactory.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib_1_0/util/FaceletTaglib_1_0AdapterFactory.java
deleted file mode 100644
index e99e8c9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib_1_0/util/FaceletTaglib_1_0AdapterFactory.java
+++ /dev/null
@@ -1,323 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: FaceletTaglib_1_0AdapterFactory.java,v 1.1 2010/03/18 06:24:40 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.util;
-
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.common.notify.Notifier;
-import org.eclipse.emf.common.notify.impl.AdapterFactoryImpl;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.ComponentTagDefn;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.ConverterTagDefn;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletLibraryClassTagLib;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletTaglibDefn;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletTaglib_1_0Package;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletXMLDefnTaglib;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FunctionDefn;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.HandlerTagDefn;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.SourceTagDefn;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.TagDefn;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.ValidatorTagDefn;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Adapter Factory</b> for the model.
- * It provides an adapter <code>createXXX</code> method for each class of the model.
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletTaglib_1_0Package
- * @generated
- */
-public class FaceletTaglib_1_0AdapterFactory extends AdapterFactoryImpl
-{
-    /**
-     * The cached model package.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected static FaceletTaglib_1_0Package modelPackage;
-
-    /**
-     * Creates an instance of the adapter factory.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public FaceletTaglib_1_0AdapterFactory()
-    {
-        if (modelPackage == null)
-        {
-            modelPackage = FaceletTaglib_1_0Package.eINSTANCE;
-        }
-    }
-
-    /**
-     * Returns whether this factory is applicable for the type of the object.
-     * <!-- begin-user-doc -->
-     * This implementation returns <code>true</code> if the object is either the model's package or is an instance object of the model.
-     * <!-- end-user-doc -->
-     * @return whether this factory is applicable for the type of the object.
-     * @generated
-     */
-    @Override
-    public boolean isFactoryForType(Object object)
-    {
-        if (object == modelPackage)
-        {
-            return true;
-        }
-        if (object instanceof EObject)
-        {
-            return ((EObject)object).eClass().getEPackage() == modelPackage;
-        }
-        return false;
-    }
-
-    /**
-     * The switch that delegates to the <code>createXXX</code> methods.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected FaceletTaglib_1_0Switch<Adapter> modelSwitch =
-        new FaceletTaglib_1_0Switch<Adapter>()
-        {
-            @Override
-            public Adapter caseFaceletLibraryClassTagLib(FaceletLibraryClassTagLib object)
-            {
-                return createFaceletLibraryClassTagLibAdapter();
-            }
-            @Override
-            public Adapter caseFaceletXMLDefnTaglib(FaceletXMLDefnTaglib object)
-            {
-                return createFaceletXMLDefnTaglibAdapter();
-            }
-            @Override
-            public Adapter caseFaceletTaglibDefn(FaceletTaglibDefn object)
-            {
-                return createFaceletTaglibDefnAdapter();
-            }
-            @Override
-            public Adapter caseComponentTagDefn(ComponentTagDefn object)
-            {
-                return createComponentTagDefnAdapter();
-            }
-            @Override
-            public Adapter caseValidatorTagDefn(ValidatorTagDefn object)
-            {
-                return createValidatorTagDefnAdapter();
-            }
-            @Override
-            public Adapter caseConverterTagDefn(ConverterTagDefn object)
-            {
-                return createConverterTagDefnAdapter();
-            }
-            @Override
-            public Adapter caseHandlerTagDefn(HandlerTagDefn object)
-            {
-                return createHandlerTagDefnAdapter();
-            }
-            @Override
-            public Adapter caseSourceTagDefn(SourceTagDefn object)
-            {
-                return createSourceTagDefnAdapter();
-            }
-            @Override
-            public Adapter caseTagDefn(TagDefn object)
-            {
-                return createTagDefnAdapter();
-            }
-            @Override
-            public Adapter caseFunctionDefn(FunctionDefn object)
-            {
-                return createFunctionDefnAdapter();
-            }
-            @Override
-            public Adapter defaultCase(EObject object)
-            {
-                return createEObjectAdapter();
-            }
-        };
-
-    /**
-     * Creates an adapter for the <code>target</code>.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param target the object to adapt.
-     * @return the adapter for the <code>target</code>.
-     * @generated
-     */
-    @Override
-    public Adapter createAdapter(Notifier target)
-    {
-        return modelSwitch.doSwitch((EObject)target);
-    }
-
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletLibraryClassTagLib <em>Facelet Library Class Tag Lib</em>}'.
-     * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletLibraryClassTagLib
-     * @generated
-     */
-    public Adapter createFaceletLibraryClassTagLibAdapter()
-    {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletXMLDefnTaglib <em>Facelet XML Defn Taglib</em>}'.
-     * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletXMLDefnTaglib
-     * @generated
-     */
-    public Adapter createFaceletXMLDefnTaglibAdapter()
-    {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletTaglibDefn <em>Facelet Taglib Defn</em>}'.
-     * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletTaglibDefn
-     * @generated
-     */
-    public Adapter createFaceletTaglibDefnAdapter()
-    {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.ComponentTagDefn <em>Component Tag Defn</em>}'.
-     * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.ComponentTagDefn
-     * @generated
-     */
-    public Adapter createComponentTagDefnAdapter()
-    {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.ValidatorTagDefn <em>Validator Tag Defn</em>}'.
-     * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.ValidatorTagDefn
-     * @generated
-     */
-    public Adapter createValidatorTagDefnAdapter()
-    {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.ConverterTagDefn <em>Converter Tag Defn</em>}'.
-     * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.ConverterTagDefn
-     * @generated
-     */
-    public Adapter createConverterTagDefnAdapter()
-    {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.HandlerTagDefn <em>Handler Tag Defn</em>}'.
-     * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.HandlerTagDefn
-     * @generated
-     */
-    public Adapter createHandlerTagDefnAdapter()
-    {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.SourceTagDefn <em>Source Tag Defn</em>}'.
-     * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.SourceTagDefn
-     * @generated
-     */
-    public Adapter createSourceTagDefnAdapter()
-    {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.TagDefn <em>Tag Defn</em>}'.
-     * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.TagDefn
-     * @generated
-     */
-    public Adapter createTagDefnAdapter()
-    {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FunctionDefn <em>Function Defn</em>}'.
-     * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FunctionDefn
-     * @generated
-     */
-    public Adapter createFunctionDefnAdapter()
-    {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for the default case.
-     * <!-- begin-user-doc -->
-     * This default implementation returns null.
-     * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @generated
-     */
-    public Adapter createEObjectAdapter()
-    {
-        return null;
-    }
-
-} //FaceletTaglib_1_0AdapterFactory
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib_1_0/util/FaceletTaglib_1_0Switch.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib_1_0/util/FaceletTaglib_1_0Switch.java
deleted file mode 100644
index 4375e3c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/faceletTaglib_1_0/util/FaceletTaglib_1_0Switch.java
+++ /dev/null
@@ -1,371 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: FaceletTaglib_1_0Switch.java,v 1.1 2010/03/18 06:24:40 cbateman Exp $
- */
-package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.util;
-
-import java.util.List;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.ComponentTagDefn;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.ConverterTagDefn;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletLibraryClassTagLib;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletTaglibDefn;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletTaglib_1_0Package;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletXMLDefnTaglib;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FunctionDefn;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.HandlerTagDefn;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.SourceTagDefn;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.TagDefn;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.ValidatorTagDefn;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Switch</b> for the model's inheritance hierarchy.
- * It supports the call {@link #doSwitch(EObject) doSwitch(object)}
- * to invoke the <code>caseXXX</code> method for each class of the model,
- * starting with the actual class of the object
- * and proceeding up the inheritance hierarchy
- * until a non-null result is returned,
- * which is the result of the switch.
- * @param <T> 
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletTaglib_1_0Package
- * @generated
- */
-public class FaceletTaglib_1_0Switch<T>
-{
-    /**
-     * The cached model package
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected static FaceletTaglib_1_0Package modelPackage;
-
-    /**
-     * Creates an instance of the switch.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public FaceletTaglib_1_0Switch()
-    {
-        if (modelPackage == null)
-        {
-            modelPackage = FaceletTaglib_1_0Package.eINSTANCE;
-        }
-    }
-
-    /**
-     * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
-     * <!-- begin-user-doc -->
-     * @param theEObject 
-     * <!-- end-user-doc -->
-     * @return the first non-null result returned by a <code>caseXXX</code> call.
-     * @generated
-     */
-    public T doSwitch(EObject theEObject)
-    {
-        return doSwitch(theEObject.eClass(), theEObject);
-    }
-
-    /**
-     * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
-     * <!-- begin-user-doc -->
-     * @param theEClass 
-     * @param theEObject 
-     * <!-- end-user-doc -->
-     * @return the first non-null result returned by a <code>caseXXX</code> call.
-     * @generated
-     */
-    protected T doSwitch(EClass theEClass, EObject theEObject)
-    {
-        if (theEClass.eContainer() == modelPackage)
-        {
-            return doSwitch(theEClass.getClassifierID(), theEObject);
-        }
-        List<EClass> eSuperTypes = theEClass.getESuperTypes();
-        return
-            eSuperTypes.isEmpty() ?
-                defaultCase(theEObject) :
-                doSwitch(eSuperTypes.get(0), theEObject);
-    }
-
-    /**
-     * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
-     * <!-- begin-user-doc -->
-     * @param classifierID 
-     * @param theEObject 
-     * <!-- end-user-doc -->
-     * @return the first non-null result returned by a <code>caseXXX</code> call.
-     * @generated
-     */
-    protected T doSwitch(int classifierID, EObject theEObject)
-    {
-        switch (classifierID)
-        {
-            case FaceletTaglib_1_0Package.FACELET_LIBRARY_CLASS_TAG_LIB:
-            {
-                FaceletLibraryClassTagLib faceletLibraryClassTagLib = (FaceletLibraryClassTagLib)theEObject;
-                T result = caseFaceletLibraryClassTagLib(faceletLibraryClassTagLib);
-                if (result == null) result = caseFaceletTaglibDefn(faceletLibraryClassTagLib);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FaceletTaglib_1_0Package.FACELET_XML_DEFN_TAGLIB:
-            {
-                FaceletXMLDefnTaglib faceletXMLDefnTaglib = (FaceletXMLDefnTaglib)theEObject;
-                T result = caseFaceletXMLDefnTaglib(faceletXMLDefnTaglib);
-                if (result == null) result = caseFaceletTaglibDefn(faceletXMLDefnTaglib);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FaceletTaglib_1_0Package.FACELET_TAGLIB_DEFN:
-            {
-                FaceletTaglibDefn faceletTaglibDefn = (FaceletTaglibDefn)theEObject;
-                T result = caseFaceletTaglibDefn(faceletTaglibDefn);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FaceletTaglib_1_0Package.COMPONENT_TAG_DEFN:
-            {
-                ComponentTagDefn componentTagDefn = (ComponentTagDefn)theEObject;
-                T result = caseComponentTagDefn(componentTagDefn);
-                if (result == null) result = caseHandlerTagDefn(componentTagDefn);
-                if (result == null) result = caseTagDefn(componentTagDefn);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FaceletTaglib_1_0Package.VALIDATOR_TAG_DEFN:
-            {
-                ValidatorTagDefn validatorTagDefn = (ValidatorTagDefn)theEObject;
-                T result = caseValidatorTagDefn(validatorTagDefn);
-                if (result == null) result = caseHandlerTagDefn(validatorTagDefn);
-                if (result == null) result = caseTagDefn(validatorTagDefn);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FaceletTaglib_1_0Package.CONVERTER_TAG_DEFN:
-            {
-                ConverterTagDefn converterTagDefn = (ConverterTagDefn)theEObject;
-                T result = caseConverterTagDefn(converterTagDefn);
-                if (result == null) result = caseHandlerTagDefn(converterTagDefn);
-                if (result == null) result = caseTagDefn(converterTagDefn);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FaceletTaglib_1_0Package.HANDLER_TAG_DEFN:
-            {
-                HandlerTagDefn handlerTagDefn = (HandlerTagDefn)theEObject;
-                T result = caseHandlerTagDefn(handlerTagDefn);
-                if (result == null) result = caseTagDefn(handlerTagDefn);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FaceletTaglib_1_0Package.SOURCE_TAG_DEFN:
-            {
-                SourceTagDefn sourceTagDefn = (SourceTagDefn)theEObject;
-                T result = caseSourceTagDefn(sourceTagDefn);
-                if (result == null) result = caseTagDefn(sourceTagDefn);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FaceletTaglib_1_0Package.TAG_DEFN:
-            {
-                TagDefn tagDefn = (TagDefn)theEObject;
-                T result = caseTagDefn(tagDefn);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FaceletTaglib_1_0Package.FUNCTION_DEFN:
-            {
-                FunctionDefn functionDefn = (FunctionDefn)theEObject;
-                T result = caseFunctionDefn(functionDefn);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            default: return defaultCase(theEObject);
-        }
-    }
-
-    /**
-     * Returns the result of interpreting the object as an instance of '<em>Facelet Library Class Tag Lib</em>'.
-     * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpreting the object as an instance of '<em>Facelet Library Class Tag Lib</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-    public T caseFaceletLibraryClassTagLib(FaceletLibraryClassTagLib object)
-    {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpreting the object as an instance of '<em>Facelet XML Defn Taglib</em>'.
-     * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpreting the object as an instance of '<em>Facelet XML Defn Taglib</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-    public T caseFaceletXMLDefnTaglib(FaceletXMLDefnTaglib object)
-    {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpreting the object as an instance of '<em>Facelet Taglib Defn</em>'.
-     * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpreting the object as an instance of '<em>Facelet Taglib Defn</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-    public T caseFaceletTaglibDefn(FaceletTaglibDefn object)
-    {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpreting the object as an instance of '<em>Component Tag Defn</em>'.
-     * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpreting the object as an instance of '<em>Component Tag Defn</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-    public T caseComponentTagDefn(ComponentTagDefn object)
-    {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpreting the object as an instance of '<em>Validator Tag Defn</em>'.
-     * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpreting the object as an instance of '<em>Validator Tag Defn</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-    public T caseValidatorTagDefn(ValidatorTagDefn object)
-    {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpreting the object as an instance of '<em>Converter Tag Defn</em>'.
-     * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpreting the object as an instance of '<em>Converter Tag Defn</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-    public T caseConverterTagDefn(ConverterTagDefn object)
-    {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpreting the object as an instance of '<em>Handler Tag Defn</em>'.
-     * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpreting the object as an instance of '<em>Handler Tag Defn</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-    public T caseHandlerTagDefn(HandlerTagDefn object)
-    {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpreting the object as an instance of '<em>Source Tag Defn</em>'.
-     * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpreting the object as an instance of '<em>Source Tag Defn</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-    public T caseSourceTagDefn(SourceTagDefn object)
-    {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpreting the object as an instance of '<em>Tag Defn</em>'.
-     * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpreting the object as an instance of '<em>Tag Defn</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-    public T caseTagDefn(TagDefn object)
-    {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpreting the object as an instance of '<em>Function Defn</em>'.
-     * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpreting the object as an instance of '<em>Function Defn</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-    public T caseFunctionDefn(FunctionDefn object)
-    {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpreting the object as an instance of '<em>EObject</em>'.
-     * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch, but this is the last case anyway.
-     * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpreting the object as an instance of '<em>EObject</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject)
-     * @generated
-     */
-    public T defaultCase(EObject object)
-    {
-        return null;
-    }
-
-} //FaceletTaglib_1_0Switch
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/messages.properties b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/messages.properties
deleted file mode 100644
index 635e1ab..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/messages.properties
+++ /dev/null
@@ -1,2 +0,0 @@
-ContextParamSpecifiedFaceletTaglibLocator_0=Facelet Taglib Locator for Context Params
-JarFileFaceletTaglibLocator_0=Facelet Taglib Locator for Jar Files
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/tagmodel/AttributeHandlerMapAdapter.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/tagmodel/AttributeHandlerMapAdapter.java
deleted file mode 100644
index d699df2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/tagmodel/AttributeHandlerMapAdapter.java
+++ /dev/null
@@ -1,191 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facelet.core.internal.tagmodel;
-
-import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-import java.io.Serializable;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.atomic.AtomicBoolean;
-
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.ITagAttributeHandler;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.designtime.internal.view.model.jsp.IAttributeAdvisor;
-import org.eclipse.jst.jsf.designtime.internal.view.model.jsp.IAttributeAdvisor.UnknownAttributeException;
-import org.eclipse.jst.jsf.facelet.core.internal.cm.TagInfo;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
-
-/**
- * TODO: merge back with common elements of AttributeHandlerMapAdapter
- * 
- * Adapts TLDDocument attributes to a simple map of ITagAttributeHandler. Map is
- * unmodifiable.
- * 
- * @author cbateman
- * 
- */
-public class AttributeHandlerMapAdapter implements
-        Map<String, ITagAttributeHandler>, Serializable
-{
-    /**
-     * 
-     */
-    private static final long                       serialVersionUID = -6052662048278098351L;
-    private transient final IAttributeAdvisor       _advisor;
-    private transient AtomicBoolean                 _isInitialized   = new AtomicBoolean(
-                                                                             false);
-    private final transient TagInfo         _tagInfo;
-    private final Map<String, ITagAttributeHandler> _cache;
-    private final String                            _tagName;
-
-    /**
-     * @param tagInfo
-     * @param advisor
-     * @param tagName
-     */
-    public AttributeHandlerMapAdapter(final TagInfo tagInfo,
-            final IAttributeAdvisor advisor, final String tagName)
-    {
-        _tagInfo = tagInfo;
-        _advisor = advisor;
-        _tagName = tagName;
-        _cache = new HashMap<String, ITagAttributeHandler>();
-    }
-
-    public boolean containsKey(final Object key)
-    {
-        ensureAllAttributes();
-        return _cache.containsKey(key);
-    }
-
-    public boolean containsValue(final Object value)
-    {
-        ensureAllAttributes();
-        return _cache.containsValue(value);
-    }
-
-    public Set<java.util.Map.Entry<String, ITagAttributeHandler>> entrySet()
-    {
-        ensureAllAttributes();
-        return _cache.entrySet();
-    }
-
-    public ITagAttributeHandler get(final Object key)
-    {
-        if (key instanceof String)
-        {
-            return getOrCreateAttribute((String) key);
-        }
-        return null;
-    }
-
-    public boolean isEmpty()
-    {
-        return size() == 0;
-    }
-
-    public Set<String> keySet()
-    {
-        ensureAllAttributes();
-        return Collections.unmodifiableSet(_cache.keySet());
-    }
-
-    public int size()
-    {
-        if (_tagInfo != null)
-        {
-            return _tagInfo.getAttributes(_tagName).getLength();
-        }
-        return _cache.size();
-    }
-
-    public Collection<ITagAttributeHandler> values()
-    {
-        ensureAllAttributes();
-        return Collections.unmodifiableCollection(_cache.values());
-    }
-
-    private synchronized ITagAttributeHandler getOrCreateAttribute(
-            final String name)
-    {
-        ITagAttributeHandler tagAttr = _cache.get(name);
-
-        if (tagAttr == null)
-        {
-            try
-            {
-                tagAttr = _advisor.createAttributeHandler(name);
-                _cache.put(name, tagAttr);
-            }
-            catch (final UnknownAttributeException e)
-            {
-                JSFCorePlugin.log(e, "Trying to get attribute for " + name); //$NON-NLS-1$
-            }
-        }
-
-        return tagAttr;
-    }
-
-    private void ensureAllAttributes()
-    {
-        if (_isInitialized.compareAndSet(false, true))
-        {
-            for (final Iterator<?> it = _tagInfo.getAttributes(_tagName)
-                    .iterator(); it.hasNext();)
-            {
-                final CMNode attrDecl = (CMAttributeDeclaration) it.next();
-                getOrCreateAttribute(attrDecl.getNodeName());
-            }
-        }
-    }
-
-    public void clear()
-    {
-        throw new UnsupportedOperationException("Cannot modify map"); //$NON-NLS-1$
-    }
-
-    public ITagAttributeHandler put(final String key,
-            final ITagAttributeHandler value)
-    {
-        throw new UnsupportedOperationException("Cannot modify map"); //$NON-NLS-1$
-    }
-
-    public void putAll(
-            final Map<? extends String, ? extends ITagAttributeHandler> t)
-    {
-        throw new UnsupportedOperationException("Cannot modify map"); //$NON-NLS-1$
-    }
-
-    public ITagAttributeHandler remove(final Object key)
-    {
-        throw new UnsupportedOperationException("Cannot modify map"); //$NON-NLS-1$
-    }
-
-    private void readObject(final ObjectInputStream in) throws IOException,
-            ClassNotFoundException
-    {
-        in.defaultReadObject();
-        _isInitialized = new AtomicBoolean(true);
-    }
-
-    private void writeObject(final ObjectOutputStream out) throws IOException
-    {
-        ensureAllAttributes();
-        out.defaultWriteObject();
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/tagmodel/ComponentTag.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/tagmodel/ComponentTag.java
deleted file mode 100644
index 5e381fd..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/tagmodel/ComponentTag.java
+++ /dev/null
@@ -1,76 +0,0 @@
-package org.eclipse.jst.jsf.facelet.core.internal.tagmodel;
-
-import org.eclipse.jst.jsf.common.runtime.internal.model.component.ComponentTypeInfo;
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.IComponentTagElement;
-import org.eclipse.jst.jsf.designtime.internal.view.model.jsp.IAttributeAdvisor;
-import org.eclipse.jst.jsf.facelet.core.internal.cm.FaceletDocumentFactory;
-
-
-
-
-/**
- * A basic JSF component facelet tag element
- * 
- * @author cbateman
- *
- */
-public class ComponentTag extends FaceletTag implements IComponentTagElement
-{
-    /**
-     * 
-     */
-    private static final long serialVersionUID = -7457091811357699617L;
-    private final ComponentTypeInfo _typeInfo;
-
-//    public ComponentTag(final String uri, final String name, final String componentType)
-//    {
-//        // renderType and handlerClass are (?) in the dtd
-//        this(uri, name, componentType, null);
-//    }
-
-    /**
-     * @param uri
-     * @param name
-     * @param typeInfo
-     * @param handlerClass 
-     * @param factory
-     * @param advisor
-     */
-    public ComponentTag(final String uri,
-            final String name,
-            final ComponentTypeInfo typeInfo,
-            final String handlerClass,
-            final FaceletDocumentFactory factory, 
-            final IAttributeAdvisor advisor)
-    {
-        super(uri, name, TagType.COMPONENT, handlerClass, factory, advisor);
-        _typeInfo = typeInfo;
-    }
-
-    @Override
-    public String toString() {
-        String toString = super.toString();
-        toString += "; Component Type: " + _typeInfo.getComponentType(); //$NON-NLS-1$
-
-        final String rendererType = _typeInfo.getRenderFamily();
-        if (rendererType != null)
-        {
-            toString += "; Renderer Type: " + rendererType; //$NON-NLS-1$
-        }
-
-        final String handlerClass = getTagHandlerClassName();
-        if (handlerClass != null)
-        {
-            toString += "; Handler Class: " + handlerClass; //$NON-NLS-1$
-        }
-
-        return toString;
-    }
-
-    public ComponentTypeInfo getComponent()
-    {
-        return _typeInfo;
-    }
-
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/tagmodel/ConverterTag.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/tagmodel/ConverterTag.java
deleted file mode 100644
index 6c8b015..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/tagmodel/ConverterTag.java
+++ /dev/null
@@ -1,62 +0,0 @@
-package org.eclipse.jst.jsf.facelet.core.internal.tagmodel;
-
-import org.eclipse.jst.jsf.common.runtime.internal.model.decorator.ConverterTypeInfo;
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.IConverterTagElement;
-import org.eclipse.jst.jsf.designtime.internal.view.model.jsp.IAttributeAdvisor;
-import org.eclipse.jst.jsf.facelet.core.internal.cm.FaceletDocumentFactory;
-
-
-/**
- * A basic JSF converter facelet tag element
- * 
- * @author cbateman
- *
- */
-public class ConverterTag extends FaceletTag implements IConverterTagElement
-{
-    /**
-     * 
-     */
-    private static final long serialVersionUID = -5310748504219020605L;
-    private final ConverterTypeInfo _converter;
-
-    /**
-     * @param uri
-     * @param name
-     * @param converter
-     * @param handler
-     * @param factory
-     * @param advisor
-     */
-    public ConverterTag(final String uri, final String name, final ConverterTypeInfo converter, final String handler, final FaceletDocumentFactory factory, 
-            final IAttributeAdvisor advisor)
-    {
-        super(uri, name, TagType.CONVERTER, handler, factory, advisor);
-        _converter = converter;
-    }
-
-    /**
-     * @return the converter id
-     */
-    public ConverterTypeInfo getConverter()
-    {
-        return _converter;
-    }
-
-    @Override
-    public String toString()
-    {
-        String toString = super.toString();
-
-        toString += "Converter Id: "+getConverter()+"\n"; //$NON-NLS-1$ //$NON-NLS-2$
-
-        if  (getTagHandlerClassName() != null)
-        {
-            toString += "Handler Class: "+getTagHandlerClassName()+"\n"; //$NON-NLS-1$ //$NON-NLS-2$
-        }
-
-        return toString;
-    }
-
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/tagmodel/FaceletAttribute.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/tagmodel/FaceletAttribute.java
deleted file mode 100644
index ebc6b6a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/tagmodel/FaceletAttribute.java
+++ /dev/null
@@ -1,59 +0,0 @@
-package org.eclipse.jst.jsf.facelet.core.internal.tagmodel;
-
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.AbstractTagAttribute;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTagAttribute;
-
-/**
- * Adapts a FaceletTaglibTagAttribute to the ITagAttribute interface.
- * 
- * @author cbateman
- *
- */
-public class FaceletAttribute extends AbstractTagAttribute
-{
-    
-    /**
-     * 
-     */
-    private static final long serialVersionUID = 5909354642079229663L;
-
-    private final FaceletTaglibTagAttribute _attr;
-
-    /**
-     * @param attr
-     */
-    public FaceletAttribute(final FaceletTaglibTagAttribute attr)
-    {
-        _attr = attr;
-    }
-
-    @Override
-    public String getName()
-    {
-        return _attr.getName();
-    }
-
-    @Override
-    public String getTargetNamespace()
-    {
-        return null;
-    }
-
-    @Override
-    public String getDescription()
-    {
-        return _attr.getDefaultDescription("\n"); //$NON-NLS-1$
-    }
-
-    @Override
-    public String getDisplayName()
-    {
-        return _attr.getDefaultDescription("\n"); //$NON-NLS-1$
-    }
-
-    @Override
-    public boolean isRequired()
-    {
-        return _attr.isRequired();
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/tagmodel/FaceletNamespace.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/tagmodel/FaceletNamespace.java
deleted file mode 100644
index dcb211b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/tagmodel/FaceletNamespace.java
+++ /dev/null
@@ -1,214 +0,0 @@
-package org.eclipse.jst.jsf.facelet.core.internal.tagmodel;
-
-import java.io.Serializable;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.ITagElement;
-import org.eclipse.jst.jsf.designtime.internal.view.model.jsp.ITagResolvingStrategy;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.IFaceletTagResolvingStrategy.TLDWrapper;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.IFaceletTagRecord;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTag;
-
-/**
- * A description about a facelet tag library descriptor (facelet-taglib_1_0.dtd)
- * 
- * @author cbateman
- * 
- */
-public class FaceletNamespace extends
-        org.eclipse.jst.jsf.common.runtime.internal.view.model.common.Namespace
-{
-    /**
-     * 
-     */
-    private static final long          serialVersionUID = 2133853120220947741L;
-    /**
-     * The namespace that this tag library is associated with
-     */
-    private final FaceletNamespaceData _data;
-
-    /**
-     * @param record
-     * @param resolver
-     */
-    public FaceletNamespace(final IFaceletTagRecord record,
-            final ITagResolvingStrategy<TLDWrapper, String> resolver)
-    {
-        _data = new TaglibFaceletNamespaceData(record, resolver);
-    }
-
-    @Override
-    public String getDisplayName()
-    {
-        return _data.getDisplayName();
-    }
-
-    @Override
-    public String getNSUri()
-    {
-        return _data.getUri();
-    }
-
-    @Override
-    public Collection<? extends ITagElement> getViewElements()
-    {
-        return _data.getAllViewElements().values();
-    }
-
-    @Override
-    public String toString()
-    {
-        return "Namespace: " + getNSUri() + "\n"; //$NON-NLS-1$ //$NON-NLS-2$
-    }
-
-    @Override
-    public ITagElement getViewElement(final String name)
-    {
-        return _data.getViewElement(name);
-    }
-
-    @Override
-    public boolean hasViewElements()
-    {
-        return _data.getNumTags() > 0;
-    }
-
-    @Override
-    public boolean isInitialized()
-    {
-        return _data.isInitialized();
-    }
-
-    /**
-     * Namespace data driven off a record.
-     * 
-     */
-    private static class TaglibFaceletNamespaceData extends
-            FaceletNamespaceData
-    {
-        /**
-         * 
-         */
-        private static final long                                         serialVersionUID = -562720162853425804L;
-        private transient final IFaceletTagRecord                         _record;
-        private transient final ITagResolvingStrategy<TLDWrapper, String> _resolver;
-        private final Map<String, ITagElement>                            _tags;
-
-        public TaglibFaceletNamespaceData(final IFaceletTagRecord record,
-                final ITagResolvingStrategy<TLDWrapper, String> resolver)
-        {
-            _record = record;
-            _tags = new HashMap<String, ITagElement>();
-            _resolver = resolver;
-        }
-
-        @Override
-        public synchronized Map<String, ITagElement> getAllViewElements()
-        {
-            if (!isInitialized())
-            {
-                for (final FaceletTaglibTag tagDefn : _record.getTags())
-                {
-                    getViewElement(tagDefn.getTagName());
-                }
-            }
-            return _tags;
-        }
-
-        @Override
-        public synchronized ITagElement getViewElement(final String name)
-        {
-            final FaceletTaglibTag tagDefn = _record.getTag(name);
-            if (tagDefn != null)
-            {
-                return getAndInitIfMissing(tagDefn);
-            }
-            return null;
-        }
-
-        private ITagElement getAndInitIfMissing(final FaceletTaglibTag tagDefn)
-        {
-            ITagElement tagElement = _tags.get(tagDefn.getTagName());
-            if (tagElement == null)
-            {
-                tagElement = _resolver
-                        .resolve(new TLDWrapper(tagDefn, getUri()));
-                _tags.put(tagDefn.getTagName(), tagElement);
-            }
-            return tagElement;
-        }
-
-        @Override
-        public synchronized boolean isInitialized()
-        {
-            return _tags.size() == _record.getNumTags();
-        }
-
-        @Override
-        public String getDisplayName()
-        {
-            return _record.getURI();
-        }
-
-        @Override
-        public int getNumTags()
-        {
-            return _record.getNumTags();
-        }
-
-        @Override
-        public String getUri()
-        {
-            return _record.getURI();
-        }
-    }
-
-    /**
-     * Encapsulates all the data for a TLDNamespace. Allows the model to be
-     * separated from the Namespace interface for ease of serialization and
-     * controlled subclassing.
-     * 
-     */
-    public abstract static class FaceletNamespaceData implements Serializable
-    {
-        /**
-         * 
-         */
-        private static final long serialVersionUID = 1697605990460247389L;
-
-        /**
-         * @return the displayb
-         */
-        public abstract String getDisplayName();
-
-        /**
-         * @return the number of tags
-         */
-        public abstract int getNumTags();
-
-        /**
-         * @return the namespace uri
-         */
-        public abstract String getUri();
-
-        /**
-         * @param name
-         * @return the view element for name or null if not found.
-         */
-        public abstract ITagElement getViewElement(final String name);
-
-        /**
-         * May be long running since it will lazily calculate all unloaded tags.
-         * 
-         * @return all view elements for this namespace
-         */
-        public abstract Map<String, ITagElement> getAllViewElements();
-
-        /**
-         * @return true if all elements have been lazily loaded
-         */
-        public abstract boolean isInitialized();
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/tagmodel/FaceletTag.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/tagmodel/FaceletTag.java
deleted file mode 100644
index 8b8a4ad..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/tagmodel/FaceletTag.java
+++ /dev/null
@@ -1,96 +0,0 @@
-package org.eclipse.jst.jsf.facelet.core.internal.tagmodel;
-
-import java.util.Map;
-
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.IJSFTagElement;
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.ITagAttribute;
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.TagElement;
-import org.eclipse.jst.jsf.designtime.internal.view.model.jsp.IAttributeAdvisor;
-import org.eclipse.jst.jsf.facelet.core.internal.cm.FaceletDocumentFactory;
-import org.eclipse.jst.jsf.facelet.core.internal.cm.TagInfo;
-
-/**
- * A description of the a facelet tag
- * 
- * @author cbateman
- * 
- */
-public abstract class FaceletTag extends TagElement implements IJSFTagElement
-{
-    /**
-     * 
-     */
-    private static final long                    serialVersionUID = 3027895246947365781L;
-    private final String                         _uri;
-    private final String                         _name;
-    private final TagType                        _type;
-    private final String                         _tagHandlerClass;
-    private final AttributeHandlerMapAdapter     _attributeHandlerMapAdapter;
-    private final IAttributeAdvisor              _advisor;
-
-    /**
-     * @param uri
-     * @param name
-     * @param type
-     * @param tagHandlerClassName
-     * @param docFactory
-     * @param advisor
-     */
-    protected FaceletTag(final String uri, final String name,
-            final TagType type, final String tagHandlerClassName,
-            final FaceletDocumentFactory docFactory,
-            final IAttributeAdvisor advisor)
-    {
-        _uri = uri;
-        _name = name;
-        _type = type;
-        _tagHandlerClass = tagHandlerClassName;
-        final TagInfo tagInfo = docFactory.getOrCreateExtraTagInfo(uri);
-        _attributeHandlerMapAdapter = new AttributeHandlerMapAdapter(tagInfo, advisor, name);
-        _advisor = advisor;
-    }
-
-    /**
-     * @return the name of the tag
-     */
-    @Override
-    public final String getName()
-    {
-        return _name;
-    }
-
-    public final TagType getType()
-    {
-        return _type;
-    }
-
-    @Override
-    public String getUri()
-    {
-        return _uri;
-    }
-
-    @Override
-    public String getTagHandlerClassName()
-    {
-        return _tagHandlerClass;
-    }
-
-    @Override
-    public String toString()
-    {
-        return "Tag Name: " + getName() + "Tag Type: " + getType(); //$NON-NLS-1$ //$NON-NLS-2$
-    }
-
-    @Override
-    public Map<?, ?> getAttributeHandlers()
-    {
-        return _attributeHandlerMapAdapter;
-    }
-
-    public Map<String, ? extends ITagAttribute> getAttributes()
-    {
-        return _advisor.getAttributes();
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/tagmodel/HandlerTag.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/tagmodel/HandlerTag.java
deleted file mode 100644
index b2257c1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/tagmodel/HandlerTag.java
+++ /dev/null
@@ -1,56 +0,0 @@
-package org.eclipse.jst.jsf.facelet.core.internal.tagmodel;
-
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.IHandlerTagElement;
-import org.eclipse.jst.jsf.designtime.internal.view.model.jsp.IAttributeAdvisor;
-import org.eclipse.jst.jsf.facelet.core.internal.cm.FaceletDocumentFactory;
-
-
-/**
- * A basic handler tag that has no direct effect on creation of components,
- * converters or validators.
- * 
- * @author cbateman
- *
- */
-public class HandlerTag extends FaceletTag
-{
-    /**
-     * 
-     */
-    private static final long serialVersionUID = 8882557774865456522L;
-    private final IHandlerTagElement.TagHandlerType _handlerType;
-    /**
-     * @param uri
-     * @param name
-     * @param handlerType
-     * @param handlerClassName
-     * @param factory
-     * @param advisor
-     */
-    public HandlerTag(final String uri, final String name, final IHandlerTagElement.TagHandlerType handlerType,
-            final String handlerClassName, final FaceletDocumentFactory factory, 
-            final IAttributeAdvisor advisor) {
-        super(uri, name, TagType.HANDLER, handlerClassName, factory, advisor);
-        _handlerType = handlerType;
-    }
-
-    /**
-     * @return the handler type
-     */
-    public IHandlerTagElement.TagHandlerType getHandlerType()
-    {
-        return _handlerType;
-    }
-
-    @Override
-    public String toString()
-    {
-        String toString = super.toString();
-
-        toString += "Handler Class: " + getTagHandlerClassName() + "\n"; //$NON-NLS-1$ //$NON-NLS-2$
-
-        return toString;
-    }
-
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/tagmodel/IFaceletTagConstants.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/tagmodel/IFaceletTagConstants.java
deleted file mode 100644
index dd86647..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/tagmodel/IFaceletTagConstants.java
+++ /dev/null
@@ -1,149 +0,0 @@
-package org.eclipse.jst.jsf.facelet.core.internal.tagmodel;
-
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.jsf.core.internal.tld.TagIdentifierFactory;
-
-/**
- * Common constants for Facelet ui tags.
- * @author cbateman
- *
- */
-public interface IFaceletTagConstants
-{
-    /**
-     * The JSF tag library uri
-     */
-    final static public String URI_JSF_FACELETS           = "http://java.sun.com/jsf/facelets"; //$NON-NLS-1$
-
-    /**
-     * component tagname
-     */
-    final static public String TAG_COMPONENT              = "component"; //$NON-NLS-1$
-
-    /**
-     * composition tagname
-     */
-    final static public String TAG_COMPOSITION              = "composition"; //$NON-NLS-1$
-    /**
-     * debug tagname
-     */
-    final static public String TAG_DEBUG                  = "debug"; //$NON-NLS-1$
-    /**
-     * decorate tagname
-     */
-    final static public String TAG_DECORATE               = "decorate"; //$NON-NLS-1$
-    /**
-     * define tagname
-     */
-    final static public String TAG_DEFINE                 = "define"; //$NON-NLS-1$
-    /**
-     * fragment tagname
-     */
-    final static public String TAG_FRAGMENT               = "fragment"; //$NON-NLS-1$
-    /**
-     * include tagname
-     */
-    final static public String TAG_INCLUDE                = "include"; //$NON-NLS-1$
-    /**
-     * insert tagname
-     */
-    final static public String TAG_INSERT                 = "insert"; //$NON-NLS-1$
-    /**
-     * param tagname
-     */
-    final static public String TAG_PARAM                  = "param"; //$NON-NLS-1$
-    
-    /**
-     * remove tagname
-     */
-    final static public String TAG_REMOVE                 = "remove"; //$NON-NLS-1$
-    /**
-     * repeat tagname
-     */
-    final static public String TAG_REPEAT                 = "repeat"; //$NON-NLS-1$
-
-    /**
-     * TagIdentifier for COMPONENT 
-     */
-    final static TagIdentifier TAG_IDENTIFIER_COMPONENT = TagIdentifierFactory
-                                                                  .createJSPTagWrapper(
-                                                                          URI_JSF_FACELETS,
-                                                                          TAG_COMPONENT);
-    /**
-     * TagIdentifier for COMPOSITE 
-     */
-    final static TagIdentifier TAG_IDENTIFIER_COMPOSITION = TagIdentifierFactory
-                                                                  .createJSPTagWrapper(
-                                                                          URI_JSF_FACELETS,
-                                                                          TAG_COMPOSITION);
-
-    /**
-     * TagIdentifier for DEBUG 
-     */
-    final static TagIdentifier TAG_IDENTIFIER_DEBUG = TagIdentifierFactory
-                                                                  .createJSPTagWrapper(
-                                                                          URI_JSF_FACELETS,
-                                                                          TAG_DEBUG);
-    
-    /**
-     * TagIdentifier for DEBUG 
-     */
-    final static TagIdentifier TAG_IDENTIFIER_DECORATE = TagIdentifierFactory
-                                                                  .createJSPTagWrapper(
-                                                                          URI_JSF_FACELETS,
-                                                                          TAG_DECORATE);
-
-    /**
-     * TagIdentifier for DEFINE 
-     */
-    final static TagIdentifier TAG_IDENTIFIER_DEFINE = TagIdentifierFactory
-                                                                  .createJSPTagWrapper(
-                                                                          URI_JSF_FACELETS,
-                                                                          TAG_DEFINE);
-    
-    /**
-     * TagIdentifier for FRAGMENT 
-     */
-    final static TagIdentifier TAG_IDENTIFIER_FRAGMENT = TagIdentifierFactory
-                                                                  .createJSPTagWrapper(
-                                                                          URI_JSF_FACELETS,
-                                                                          TAG_FRAGMENT);
-    
-    /**
-     * TagIdentifier for INCLUDE 
-     */
-    final static TagIdentifier TAG_IDENTIFIER_INCLUDE = TagIdentifierFactory
-                                                                  .createJSPTagWrapper(
-                                                                          URI_JSF_FACELETS,
-                                                                          TAG_INCLUDE);
-
-    /**
-     * TagIdentifier for INCLUDE 
-     */
-    final static TagIdentifier TAG_IDENTIFIER_INSERT = TagIdentifierFactory
-                                                                  .createJSPTagWrapper(
-                                                                          URI_JSF_FACELETS,
-                                                                          TAG_INSERT);
-
-    /**
-     * TagIdentifier for PARAM 
-     */
-    final static TagIdentifier TAG_IDENTIFIER_PARAM = TagIdentifierFactory
-                                                                  .createJSPTagWrapper(
-                                                                          URI_JSF_FACELETS,
-                                                                          TAG_PARAM);
-    /**
-     * TagIdentifier for REPEAT 
-     */
-    final static TagIdentifier TAG_IDENTIFIER_REMOVE = TagIdentifierFactory
-                                                                  .createJSPTagWrapper(
-                                                                          URI_JSF_FACELETS,
-                                                                          TAG_REMOVE);
-    /**
-     * TagIdentifier for REPEAT 
-     */
-    final static TagIdentifier TAG_IDENTIFIER_REPEAT = TagIdentifierFactory
-                                                                  .createJSPTagWrapper(
-                                                                          URI_JSF_FACELETS,
-                                                                          TAG_REPEAT);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/tagmodel/Messages.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/tagmodel/Messages.java
deleted file mode 100644
index 7bebac4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/tagmodel/Messages.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facelet.core.internal.tagmodel;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * Externalizable string support.
- * 
- * @author cbateman
- * 
- */
-public final class Messages extends NLS
-{
-    private static final String BUNDLE_NAME = "org.eclipse.jst.jsf.facelet.core.internal.tagmodel.messages"; //$NON-NLS-1$
-    /**
-     * 
-     */
-    public static String        FaceletTaglibWithLibraryClass_TAG_LIBRARY_TYPE_DESCRIPTION;
-    /**
-     * 
-     */
-    public static String        FaceletTaglibWithTags_TAG_LIBRARY_WITH_TAGS_TYPE_DESCRIPTION;
-    static
-    {
-        // initialize resource bundle
-        NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-    }
-
-    private Messages()
-    {
-        // no instantiation
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/tagmodel/NoArchetypeFaceletTag.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/tagmodel/NoArchetypeFaceletTag.java
deleted file mode 100644
index 142ff3b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/tagmodel/NoArchetypeFaceletTag.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package org.eclipse.jst.jsf.facelet.core.internal.tagmodel;
-
-import org.eclipse.jst.jsf.designtime.internal.view.model.jsp.IAttributeAdvisor;
-import org.eclipse.jst.jsf.facelet.core.internal.cm.FaceletDocumentFactory;
-
-
-/**
- * A facelet tag with no information about it than its name
- * 
- * @author cbateman
- *
- */
-public final class NoArchetypeFaceletTag extends FaceletTag {
-
-    /**
-     * 
-     */
-    private static final long serialVersionUID = 4810723162936027305L;
-
-    /**
-     * @param uri
-     * @param name
-     * @param factory
-     * @param advisor
-     */
-    public NoArchetypeFaceletTag(final String uri, final String name, final FaceletDocumentFactory factory, 
-            final IAttributeAdvisor advisor) {
-        super(uri, name, TagType.HANDLER, null, factory, advisor);
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/tagmodel/SourceTag.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/tagmodel/SourceTag.java
deleted file mode 100644
index 59365a6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/tagmodel/SourceTag.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package org.eclipse.jst.jsf.facelet.core.internal.tagmodel;
-
-import org.eclipse.jst.jsf.designtime.internal.view.model.jsp.IAttributeAdvisor;
-import org.eclipse.jst.jsf.facelet.core.internal.cm.FaceletDocumentFactory;
-
-
-/**
- * A facet "source" tag as defined in the dtd.
- * 
- * @author cbateman
- *
- */
-public class SourceTag extends FaceletTag
-{
-    /**
-     * 
-     */
-    private static final long serialVersionUID = 4648054050352065079L;
-    private final String _source;
-
-    /**
-     * @param uri
-     * @param name
-     * @param source
-     * @param factory
-     * @param advisor
-     */
-    public SourceTag(final String uri, final String name, final String source, final FaceletDocumentFactory factory, 
-            final IAttributeAdvisor advisor) {
-        super(uri, name, TagType.HANDLER, null, factory, advisor);
-        _source = source;
-    }
-
-    /**
-     * @return the source
-     */
-    public final String getSource() {
-        return _source;
-    }
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/tagmodel/ValidatorTag.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/tagmodel/ValidatorTag.java
deleted file mode 100644
index f64623c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/tagmodel/ValidatorTag.java
+++ /dev/null
@@ -1,53 +0,0 @@
-package org.eclipse.jst.jsf.facelet.core.internal.tagmodel;
-
-import org.eclipse.jst.jsf.common.runtime.internal.model.decorator.ValidatorTypeInfo;
-import org.eclipse.jst.jsf.designtime.internal.view.model.jsp.IAttributeAdvisor;
-import org.eclipse.jst.jsf.facelet.core.internal.cm.FaceletDocumentFactory;
-
-
-/**
- * 
- *
- */
-public class ValidatorTag extends FaceletTag
-{
-    /**
-     * 
-     */
-    private static final long serialVersionUID = 3898280066837027347L;
-    private final ValidatorTypeInfo _validatorTypeInfo;
-
-    /**
-     * @param name
-     * @param uri
-     * @param validatorTypeInfo 
-     * @param handlerClass 
-     * @param factory 
-     * @param advisor 
-     */
-    public ValidatorTag(final String uri, final String name, final ValidatorTypeInfo validatorTypeInfo, final String handlerClass, final FaceletDocumentFactory factory, 
-            final IAttributeAdvisor advisor)
-    {
-        super(uri, name, TagType.VALIDATOR, handlerClass, factory, advisor);
-        _validatorTypeInfo = validatorTypeInfo;
-    }
-    /**
-     * @return the validator id
-     */
-    public ValidatorTypeInfo getValidatorId()
-    {
-        return _validatorTypeInfo;
-    }
-    @Override
-    public String toString()
-    {
-        String toString = super.toString();
-        toString += "Validator Id: "+getValidatorId()+"\n"; //$NON-NLS-1$ //$NON-NLS-2$
-
-        if (getTagHandlerClassName() != null)
-        {
-            toString += "Handler Class: "+getTagHandlerClassName()+"\n"; //$NON-NLS-1$ //$NON-NLS-2$
-        }
-        return toString;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/tagmodel/messages.properties b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/tagmodel/messages.properties
deleted file mode 100644
index 4fb97d1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/tagmodel/messages.properties
+++ /dev/null
@@ -1,2 +0,0 @@
-FaceletTaglibWithLibraryClass_TAG_LIBRARY_TYPE_DESCRIPTION=Facelet Tag Library With Library Class
-FaceletTaglibWithTags_TAG_LIBRARY_WITH_TAGS_TYPE_DESCRIPTION=Facelet Tag Library with Tag/Function Definitions
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/util/TagMetadataLoader.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/util/TagMetadataLoader.java
deleted file mode 100644
index e4425db..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/util/TagMetadataLoader.java
+++ /dev/null
@@ -1,162 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facelet.core.internal.util;
-
-import java.util.Iterator;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.common.metadata.Entity;
-import org.eclipse.jst.jsf.common.metadata.Model;
-import org.eclipse.jst.jsf.common.metadata.Trait;
-import org.eclipse.jst.jsf.common.metadata.query.ITaglibDomainMetaDataModelContext;
-import org.eclipse.jst.jsf.common.metadata.query.TaglibDomainMetaDataQueryHelper;
-import org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.ElementData;
-import org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfo;
-import org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfos;
-
-/**
- * Loads tag meta-data.
- * 
- * @author cbateman
- * 
- */
-public class TagMetadataLoader
-{
-    private static final String PALETTE_INFOS      = "paletteInfos"; //$NON-NLS-1$
-
-    private static final String TRAIT_DISPLAY_NAME = "displayName"; //$NON-NLS-1$
-
-    private static final String TRAIT_DESCRIPTION  = "description"; //$NON-NLS-1$
-
-    private static final String TRAIT_ADDITIONALELEMENTDATA = "additionalElementData"; //$NON-NLS-1$
-    
-    private final IProject      _project;
-
-    /**
-     * @param project
-     */
-    public TagMetadataLoader(final IProject project)
-    {
-        _project = project;
-    }
-
-    /**
-     * @param nsUri
-     * @param tagName
-     * @return the display name for tagName or null if not found.
-     */
-    public String getDisplayName(final String nsUri, final String tagName)
-    {
-        return getString(nsUri, tagName, TRAIT_DISPLAY_NAME);
-    }
-
-    /**
-     * @param nsUri
-     * @param tagName
-     * @return the description for tagName or null if not found.
-     */
-    public String getDescription(final String nsUri, final String tagName)
-    {
-        return getString(nsUri, tagName, TRAIT_DESCRIPTION);
-    }
-
-    /**
-     * @param nsUri
-     * @param tagName
-     * @return attribute data identified by the name or null.
-     */
-    public ElementData getElementData(final String nsUri,
-            final String tagName)
-    {
-        final ITaglibDomainMetaDataModelContext modelContext = TaglibDomainMetaDataQueryHelper
-                .createMetaDataModelContext(_project, nsUri);
-
-        final Entity entity = TaglibDomainMetaDataQueryHelper.getEntity(
-                modelContext, tagName);
-
-        if (entity != null)
-        {
-            Trait trait = 
-                TaglibDomainMetaDataQueryHelper.getTrait(entity, TRAIT_ADDITIONALELEMENTDATA);
-            if (trait != null)
-            {
-                EObject value= trait.getValue();
-                if (value instanceof ElementData)
-                {
-                    return (ElementData) value;
-                }
-            }
-        }
-        return null;
-    }
-
-    private String getString(final String nsUri, final String tagName,
-            final String key)
-    {
-        String value = null;
-        final Model model = getModel(nsUri);
-        if (model != null)
-        {
-            value = getString(key, model, tagName);
-        }
-        return value;
-    }
-
-    private String getString(final String key, final Model model,
-            final String tagName)
-    {
-        String value = null;
-
-        // use palette infos if available
-        final Trait trait = TaglibDomainMetaDataQueryHelper.getTrait(model,
-                PALETTE_INFOS);
-        if (trait != null)
-        {
-            final PaletteInfos tags = (PaletteInfos) trait.getValue();
-            for (final Iterator it = tags.getInfos().iterator(); it.hasNext();)
-            {
-                final PaletteInfo tag = (PaletteInfo) it.next();
-                if (tag.getId().equalsIgnoreCase(tagName))
-                {
-                    final EStructuralFeature feature = tag.eClass()
-                            .getEStructuralFeature(key);
-                    if (feature != null)
-                    {
-                        if (tag.eIsSet(feature))
-                        {
-                            final Object strValue = tag.eGet(feature);
-                            if (strValue instanceof String)
-                            {
-                                value = (String) strValue;
-                            }
-                        }
-                    }
-                }
-            }
-        }
-        return value;
-    }
-
-    private Model getModel(final String nsUri)
-    {
-        final ITaglibDomainMetaDataModelContext modelContext = TaglibDomainMetaDataQueryHelper
-                .createMetaDataModelContext(_project, nsUri);
-        final Model model = TaglibDomainMetaDataQueryHelper
-                .getModel(modelContext);
-        // no caching at this time so there is no need to listen to model
-        // notifications
-        // if (model != null && !hasAdapter(model))
-        // addAdapter(model);
-        return model;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/util/ViewUtil.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/util/ViewUtil.java
deleted file mode 100644
index 1429e93..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/util/ViewUtil.java
+++ /dev/null
@@ -1,262 +0,0 @@
-package org.eclipse.jst.jsf.facelet.core.internal.util;
-
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.content.IContentType;
-import org.eclipse.jst.jsf.core.internal.CompositeTagRegistryFactory;
-import org.eclipse.jst.jsf.core.internal.CompositeTagRegistryFactory.TagRegistryIdentifier;
-import org.eclipse.jst.jsf.designtime.DesignTimeApplicationManager;
-import org.eclipse.jst.jsf.designtime.internal.view.IDTViewHandler;
-import org.eclipse.jst.jsf.designtime.internal.view.model.ITagRegistry;
-import org.eclipse.jst.jsf.designtime.internal.view.model.TagRegistryFactory.TagRegistryFactoryException;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.FaceletRegistryManager.MyRegistryFactory;
-import org.eclipse.jst.jsp.core.internal.contentmodel.tld.CMDocumentFactoryTLD;
-import org.eclipse.jst.jsp.core.internal.contentmodel.tld.provisional.TLDDocument;
-import org.eclipse.jst.jsp.core.taglib.ITaglibRecord;
-import org.eclipse.jst.jsp.core.taglib.TaglibIndex;
-import org.w3c.dom.Attr;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.NamedNodeMap;
-import org.w3c.dom.Node;
-
-/**
- * Facelet view utilities
- * 
- * @author cbateman
- */
-public final class ViewUtil
-{
-    private static final String HTMLSOURCE_CONTENT_TYPE_ID = "org.eclipse.wst.html.core.htmlsource"; //$NON-NLS-1$
-    private static final String XMLNS = "xmlns"; //$NON-NLS-1$
-
-    /**
-     * Warning! This call can be very expensive.  Cache results whenever
-     * possible.
-     * 
-     * @param project
-     * @param uri
-     * @return the tld document for uri in project or null if not found
-     */
-    public static TLDDocument findTLDDocument(final IProject project,
-            final String uri)
-    {
-        final ITaglibRecord[] tldrecs = TaglibIndex
-                .getAvailableTaglibRecords(project.getFullPath());
-
-        for (final ITaglibRecord rec : tldrecs)
-        {
-            final String matchUri = rec.getDescriptor().getURI();
-            if (uri.equals(matchUri))
-            {
-                final CMDocumentFactoryTLD factory = new CMDocumentFactoryTLD();
-                return (TLDDocument) factory.createCMDocument(rec);
-            }
-        }
-        return null;
-    }
-
-    /**
-     * @param attributes
-     * @return the set of uri's that declared in attributes
-     */
-    public static Set<Attr> getDeclaredNamespaces(final NamedNodeMap attributes)
-    {
-        final Set<Attr> alreadyUsed = new HashSet<Attr>();
-        for (int i = 0; i < attributes.getLength(); i++)
-        {
-            final Node node = attributes.item(i);
-            if (XMLNS.equals(node.getNodeName())
-                    || XMLNS.equals(node.getPrefix()))
-            {
-                final String attrValue = node.getNodeValue();
-
-                if (attrValue != null && !"".equals(attrValue.trim()) //$NON-NLS-1$
-                        && node instanceof Attr)
-                {
-                    alreadyUsed.add((Attr) node);
-                }
-            }
-        }
-
-        return alreadyUsed;
-    }
-
-    /**
-     * @param attrSet
-     * @param value
-     * @return true if attrSet contains an attribute whose value is <i>value</i>
-     */
-    public static boolean hasAttributeValue(final Set<Attr> attrSet,
-            final String value)
-    {
-        for (final Attr attr : attrSet)
-        {
-            if (value.equals(attr.getValue()))
-            {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    /**
-     * @param project
-     * @return the html source type tag registry for project
-     */
-    public static ITagRegistry getHtmlTagRegistry(final IProject project)
-    {
-        final IContentType contentType = Platform.getContentTypeManager()
-                .getContentType(HTMLSOURCE_CONTENT_TYPE_ID);
-        final TagRegistryIdentifier id = new TagRegistryIdentifier(project,
-                contentType);
-        final ITagRegistry tagRegistry = CompositeTagRegistryFactory
-                .getInstance().getRegistry(id);
-        return tagRegistry;
-    }
-
-    /**
-     * @param doc
-     * @return all of the prefixed namespaces defined in doc
-     */
-    public static Map<String, PrefixEntry> getDocumentNamespaces(
-            final Document doc)
-    {
-        final Map<String, PrefixEntry> namespaces = new HashMap<String, PrefixEntry>();
-
-        final Element rootElement = doc.getDocumentElement();
-
-        if (rootElement != null)
-        {
-            final NamedNodeMap attrs = rootElement.getAttributes();
-            for (int i = 0; i < attrs.getLength(); i++)
-            {
-                final Attr a = (Attr) attrs.item(i);
-                final PrefixEntry ns = PrefixEntry.parseNamespace(a);
-                if (ns != null)
-                {
-                    namespaces.put(ns._prefix, ns);
-                }
-            }
-        }
-        return namespaces;
-    }
-
-    /**
-     * @param file
-     * @return true if the file is a Facelet VDL file
-     */
-    public static boolean isFaceletVDLFile(final IFile file)
-    {
-        final DesignTimeApplicationManager instance = DesignTimeApplicationManager.getInstance(file.getProject());
-        if (instance != null)
-        {
-            final IDTViewHandler viewHandler = instance.getViewHandler();
-            if (viewHandler != null)
-            {
-                return viewHandler.supportsViewDefinition(file);
-            }
-        }
-        return false;
-    }
-
-    /**
-     * @param project
-     * @return the facelet tag registry for the project or null if none.
-     */
-    public static ITagRegistry getTagRegistry(final IProject project)
-    {
-        final MyRegistryFactory factory = new MyRegistryFactory();
-
-        ITagRegistry registry = null;
-        try
-        {
-            registry = factory.createTagRegistry(project);
-        }
-        catch (final TagRegistryFactoryException e)
-        {
-            // fall-through
-        }
-        return registry;
-    }
-    /**
-     * Encapsulates a single namespace/prefix use declaration in an XML document
-     * @author cbateman
-     *
-     */
-    public static class PrefixEntry
-    {
-        private final String _uri;
-        private final String _prefix;
-
-        /**
-         * @param attr
-         * @return the prefix entry for attr or null
-         */
-        public static PrefixEntry parseNamespace(final Attr attr)
-        {
-            final String prefix = attr.getPrefix();
-
-            if (XMLNS.equals(prefix))
-            {
-                final String prefixName = attr.getLocalName();
-                if (prefixName != null)
-                {
-                    final String uri = attr.getNodeValue();
-
-                    if (uri != null)
-                    {
-                        return new PrefixEntry(uri, prefixName);
-                    }
-                }
-            }
-
-            return null;
-        }
-
-        /**
-         * @param uri
-         * @param prefix
-         */
-        public PrefixEntry(final String uri, final String prefix)
-        {
-            _uri = uri;
-            _prefix = prefix;
-        }
-
-        /**
-         * @return the namespace uri
-         */
-        public final String getUri()
-        {
-            return _uri;
-        }
-
-        /**
-         * @return the namespace prefix
-         */
-        public final String getPrefix()
-        {
-            return _prefix;
-        }
-
-        @Override
-        public int hashCode()
-        {
-            return _uri.hashCode();
-        }
-
-        @Override
-        public boolean equals(final Object obj)
-        {
-            return _uri.equals(obj);
-        }
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/validation/TaglibValidator.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/validation/TaglibValidator.java
deleted file mode 100644
index 7e35aa6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/validation/TaglibValidator.java
+++ /dev/null
@@ -1,183 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facelet.core.internal.validation;
-
-import java.io.IOException;
-import java.io.InputStream;
-
-import javax.xml.parsers.ParserConfigurationException;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.ISchedulingRule;
-import org.eclipse.jst.j2ee.model.ModelProviderManager;
-import org.eclipse.jst.jsf.common.internal.componentcore.AbstractVirtualComponentQuery.DefaultVirtualComponentQuery;
-import org.eclipse.jst.jsf.facelet.core.internal.FaceletCorePlugin;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.TagModelParser;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.WebappConfiguration;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletTaglibDefn;
-import org.eclipse.jst.jsf.facelet.core.internal.util.ViewUtil;
-import org.eclipse.jst.jsp.core.internal.Logger;
-import org.eclipse.wst.common.componentcore.resources.IVirtualFolder;
-import org.eclipse.wst.validation.internal.core.ValidationException;
-import org.eclipse.wst.validation.internal.provisional.core.IReporter;
-import org.eclipse.wst.validation.internal.provisional.core.IValidationContext;
-import org.eclipse.wst.validation.internal.provisional.core.IValidatorJob;
-import org.xml.sax.SAXException;
-
-/**
- * FUTURE USE: a build validator for source taglib definition files.
- * 
- * @author cbateman
- *
- */
-public class TaglibValidator implements IValidatorJob
-{
-
-    public ISchedulingRule getSchedulingRule(IValidationContext helper)
-    {
-        // no scheduling rule
-        return null;
-    }
-
-    public IStatus validateInJob(IValidationContext helper, IReporter reporter)
-            throws ValidationException
-    {
-        IStatus status = Status.OK_STATUS;
-        try
-        {
-            validate(helper, reporter);
-        }
-        catch (ValidationException e)
-        {
-            Logger.logException(e);
-            status = new Status(IStatus.ERROR, FaceletCorePlugin.PLUGIN_ID,
-                    IStatus.ERROR, e.getLocalizedMessage(), e);
-        }
-        return status;
-
-    }
-
-    public void cleanup(IReporter reporter)
-    {
-        // no cleanup
-    }
-
-    public void validate(IValidationContext helper, IReporter reporter)
-            throws ValidationException
-    {
-        String[] uris = helper.getURIs();
-        IWorkspaceRoot wsRoot = ResourcesPlugin.getWorkspace().getRoot();
-        if (uris.length > 0)
-        {
-            IFile currentFile = null;
-
-            for (int i = 0; i < uris.length && !reporter.isCancelled(); i++)
-            {
-                currentFile = wsRoot.getFile(new Path(uris[i]));
-                if (currentFile != null && currentFile.exists())
-                {
-                    if (shouldValidate(currentFile))
-                    {
-
-                        validateFile(currentFile, reporter);
-                    }
-                }
-            }
-        }
-    }
-
-    private boolean shouldValidate(IFile currentFile)
-    {
-        final IProject project = currentFile.getProject();
-        final IVirtualFolder folder = new DefaultVirtualComponentQuery().getWebContentFolder(project);
-        final IPath filePath = currentFile.getProjectRelativePath();
-        final IPath webFolderPath = folder.getUnderlyingFolder().getProjectRelativePath();
-        boolean isInValidPath =  ViewUtil.isFaceletVDLFile(currentFile)
-            && webFolderPath.isPrefixOf(filePath);
-        
-        if (isInValidPath)
-        {
-            for (final String configuredPath : WebappConfiguration.getConfigFilesFromContextParam(project, ModelProviderManager.getModelProvider(project)))
-            {
-                final IPath path = webFolderPath.append(configuredPath);
-                if (path.equals(filePath))
-                {
-                    return true;
-                }
-            }
-        }
-        return false;
-    }
-
-    private void validateFile(IFile file, IReporter reporter)
-    {
-        InputStream is = null;
-        try
-        {
-            is = file.getContents();
-            FaceletTaglibDefn taglib = TagModelParser.loadFromInputStream(is, null);
-            if (taglib != null)
-            {
-                validate(taglib);
-            }
-        }
-        catch (CoreException e)
-        {
-            FaceletCorePlugin.log("Validating taglib file: "+file.getName(), e); //$NON-NLS-1$
-        }
-        catch (IOException e)
-        {
-            FaceletCorePlugin.log("Validating taglib file: "+file.getName(), e); //$NON-NLS-1$
-        }
-        catch (ParserConfigurationException e)
-        {
-            FaceletCorePlugin.log("Validating taglib file: "+file.getName(), e); //$NON-NLS-1$
-        }
-        catch (SAXException e)
-        {
-            FaceletCorePlugin.log("Validating taglib file: "+file.getName(), e); //$NON-NLS-1$
-        }
-        finally
-        {
-            if (is != null)
-            {
-                try
-                {
-                    is.close();
-                }
-                catch (IOException e)
-                {
-                    FaceletCorePlugin.log("Closing taglib file: "+file.getName(), e); //$NON-NLS-1$
-                }
-            }
-        }
-    }
-
-    private void validate(FaceletTaglibDefn taglib)
-    {
-//        if (taglib instanceof FaceletXMLDefnTaglib)
-//        {
-//            
-//        }
-//        else if (taglib instanceof FaceletLibraryClassTagLib)
-//        {
-//            
-//        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/view/DTFaceletViewHandler.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/view/DTFaceletViewHandler.java
deleted file mode 100644
index 794c385..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/view/DTFaceletViewHandler.java
+++ /dev/null
@@ -1,149 +0,0 @@
-package org.eclipse.jst.jsf.facelet.core.internal.view;
-
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.content.IContentType;
-import org.eclipse.core.runtime.content.IContentTypeManager;
-import org.eclipse.jst.jsf.common.internal.JSPUtil;
-import org.eclipse.jst.jsf.common.runtime.internal.model.component.ComponentInfo;
-import org.eclipse.jst.jsf.core.jsfappconfig.JSFAppConfigUtils;
-import org.eclipse.jst.jsf.designtime.context.DTFacesContext;
-import org.eclipse.jst.jsf.designtime.internal.view.DTUIViewRoot;
-import org.eclipse.jst.jsf.designtime.internal.view.DTUIViewRoot.VersionStamp;
-import org.eclipse.jst.jsf.designtime.internal.view.DefaultDTViewHandler;
-import org.eclipse.jst.jsf.designtime.internal.view.IViewDefnAdapterFactory;
-import org.eclipse.jst.jsf.designtime.internal.view.XMLComponentTreeConstructionStrategy;
-import org.eclipse.jst.jsf.designtime.internal.view.XMLViewDefnAdapter;
-
-/**
- * The Facelet design time view handler implementation.
- * 
- * @author cbateman
- *
- */
-public class DTFaceletViewHandler extends DefaultDTViewHandler
-{
-
-    private static final String ORG_ECLIPSE_WST_HTML_CORE_HTMLSOURCE = "org.eclipse.wst.html.core.htmlsource"; //$NON-NLS-1$
-    private static final String JAVAX_FACES_VIEW_ROOT = "javax.faces.ViewRoot"; //$NON-NLS-1$
-
-    @Override
-    public String calculateLocale(DTFacesContext context)
-            throws ViewHandlerException
-    {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public IResource getActionDefinition(DTFacesContext context, String viewId)
-            throws ViewHandlerException
-    {
-        // TODO: this seems like a bit of a cope out...
-        return context.adaptContextObject();
-    }
-
-    @Override
-    public IPath getActionURL(DTFacesContext context, IResource resource,
-            IPath requestPath) throws ViewHandlerException
-    {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public IPath getRelativeActionPath(DTFacesContext context,
-            String relativeToViewId, String uri) throws ViewHandlerException
-    {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public IViewDefnAdapterFactory getViewMetadataAdapterFactory(
-            DTFacesContext context) throws ViewHandlerException
-    {
-        final IResource res = context.adaptContextObject();
-
-        if (res instanceof IFile)
-        {
-            return new ViewDefnAdapterFactory(this, getDefaultViewMetadataAdapterFactory(context));
-        }
-
-        return null;
-    }
-
-    @Override
-    protected DTUIViewRoot newView(DTFacesContext facesContext, String viewId)
-    {
-        return new FaceletUIViewRoot(facesContext);
-    }
-
-    @Override
-    protected XMLComponentTreeConstructionStrategy createTreeConstructionStrategy(
-            XMLViewDefnAdapter adapter, IProject project)
-    {
-        return new XMLComponentTreeConstructionStrategy(adapter, project)
-        {
-            @SuppressWarnings("unchecked")
-            @Override
-            protected void populateViewRoot(DTUIViewRoot viewRoot, List children)
-            {
-                // facelets effectively ignores view roots created by the view
-                // defn.  So we simply need to loop through all of children
-                // and add them to viewRoot unless they are view roots, in which
-                // case we add their children
-                for (final Iterator<?> it = children.iterator(); it.hasNext();)
-                {
-                    final ComponentInfo child = (ComponentInfo) it.next();
-                    
-                    if (child instanceof DTUIViewRoot ||
-                            JAVAX_FACES_VIEW_ROOT.equals(child.getComponentTypeInfo().getComponentType()))
-                    {
-                        // add recursively
-                        populateViewRoot(viewRoot, child.getChildren());
-                    }
-                    else
-                    {
-                        viewRoot.addChild(child);
-                    }
-                }
-            }
-        };
-    }
-
-    @Override
-    public boolean supportsViewDefinition(final IFile file)
-    {
-        // XXX: cover case where we are in a JSF 1.2 project and the file is facelet.
-        return JSFAppConfigUtils.isValidJSFProject(file.getProject(), "2.0") && //$NON-NLS-1$
-            (JSPUtil.isJSPContentType(file) || isHTMLContent(file));
-    }
-
-    boolean isHTMLContent(final IFile file)
-    {
-        final IContentTypeManager typeManager = Platform
-                .getContentTypeManager();
-        IContentType htmlContentType = typeManager
-                .getContentType(ORG_ECLIPSE_WST_HTML_CORE_HTMLSOURCE);
-        if (htmlContentType != null
-                && htmlContentType.isAssociatedWith(file.getName()))
-        {
-            return true;
-        }
-        return false;
-    }
-
-    @Override
-    protected VersionStamp createVersionStamp(DTFacesContext facesContext,
-            String viewId)
-    {
-        return new TimeBasedVersionStamp();
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/view/FaceletUIViewRoot.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/view/FaceletUIViewRoot.java
deleted file mode 100644
index 9a329cf..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/view/FaceletUIViewRoot.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package org.eclipse.jst.jsf.facelet.core.internal.view;
-
-import org.eclipse.jst.jsf.designtime.context.DTFacesContext;
-import org.eclipse.jst.jsf.designtime.internal.view.DefaultDTUIViewRoot;
-
-/**
- * Facelet view root
- * 
- * @author cbateman
- *
- */
-public class FaceletUIViewRoot extends DefaultDTUIViewRoot
-{
-    /**
-     * 
-     */
-    private static final long serialVersionUID = -7289148553566455867L;
-
-    /**
-     * @param facesContext
-     */
-    public FaceletUIViewRoot(final DTFacesContext facesContext)
-    {
-        super(facesContext);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/view/FaceletViewDefnAdapter.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/view/FaceletViewDefnAdapter.java
deleted file mode 100644
index 6eb5021..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/view/FaceletViewDefnAdapter.java
+++ /dev/null
@@ -1,257 +0,0 @@
-package org.eclipse.jst.jsf.facelet.core.internal.view;
-
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jst.jsf.context.IModelContext;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IDOMContextResolver;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IStructuredDocumentContextResolverFactory;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.internal.ITextRegionContextResolver;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContextFactory;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.designtime.context.DTFacesContext;
-import org.eclipse.jst.jsf.designtime.internal.view.TaglibBasedViewDefnAdapter;
-import org.eclipse.jst.jsf.designtime.internal.view.IDTViewHandler.ViewHandlerException;
-import org.eclipse.jst.jsf.designtime.internal.view.IDTViewHandler.ViewHandlerException.Cause;
-import org.eclipse.jst.jsf.designtime.internal.view.model.ITagRegistry;
-import org.eclipse.wst.sse.core.StructuredModelManager;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext;
-import org.w3c.dom.Attr;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.NamedNodeMap;
-
-/**
- * The facelet view definition adapter.
- * 
- * @author cbateman
- *
- */
-public class FaceletViewDefnAdapter extends TaglibBasedViewDefnAdapter
-{
-    FaceletViewDefnAdapter(final ITagRegistry tagRegistry)
-    {
-        super(tagRegistry);
-    }
-
-    @Override
-    public IDocument getContainer(final DTFacesContext context, final String viewId)
-    {
-        final IResource viewDefn = context.adaptContextObject();
-
-        if (viewDefn instanceof IFile)
-        {
-            final IFile viewDefnFile = (IFile) viewDefn;
-            IStructuredModel model = null;
-            try
-            {
-                model = StructuredModelManager.getModelManager()
-                .getModelForRead(viewDefnFile);
-
-                return model.getStructuredDocument();
-            }
-            catch (final IOException e)
-            {
-                JSFCorePlugin.log(e, "Acquiring model for view root"); //$NON-NLS-1$
-            }
-            catch (final CoreException e)
-            {
-                JSFCorePlugin.log(e, "Acquiring model for view root"); //$NON-NLS-1$
-            }
-            finally
-            {
-                if (model != null)
-                {
-                    model.releaseFromRead();
-                }
-            }
-        }
-        return null;
-    }
-
-    @Override
-    public DTELExpression getELExpression(final IModelContext genericContext)
-            throws ViewHandlerException
-    {
-        final IStructuredDocumentContext context = (IStructuredDocumentContext) genericContext
-                .getAdapter(IStructuredDocumentContext.class);
-
-        if (context == null)
-        {
-            throw new ViewHandlerException(Cause.EL_NOT_FOUND);
-        }
-
-        final ITextRegionContextResolver resolver =
-            IStructuredDocumentContextResolverFactory.INSTANCE
-            .getTextRegionResolver(context);
-
-        if (resolver != null)
-        {
-            final String regionType = resolver.getRegionType();
-            int startOffset = resolver.getStartOffset();
-            int relativeOffset = context.getDocumentPosition() - startOffset;
-            
-            if (DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE.equals(regionType))
-            {
-                final String attributeText = resolver.getRegionText();
-                int elOpenIdx = attributeText.indexOf("#"); //$NON-NLS-1$
-                
-                if (elOpenIdx >= 0 && elOpenIdx < relativeOffset
-                        && elOpenIdx+1 < attributeText.length()
-                        && attributeText.charAt(elOpenIdx+1) == '{')
-                {
-                    // we may have a hit
-                    int elCloseIdx = attributeText.indexOf('}', elOpenIdx+1);
-                    if (elCloseIdx  != -1)
-                    {
-                        final IStructuredDocumentContext elContext =
-                            IStructuredDocumentContextFactory.INSTANCE.getContext(
-                                    context.getStructuredDocument(), resolver
-                                    .getStartOffset()+elOpenIdx+2);
-                        final String elText = attributeText.substring(
-                                elOpenIdx + 2, elCloseIdx);
-                        return new DTELExpression(elContext, elText);
-                    }
-                }
-            }
-        }
-
-        return null;
-    }
-
-    @Override
-    public String getNamespace(final Element element, final IDocument doc)
-    {
-        final Map<String, PrefixEntry> namespaces = getDocumentNamespaces(element
-                .getOwnerDocument());
-        final String prefix = element.getPrefix();
-
-        final PrefixEntry prefixEntry = namespaces.get(prefix);
-
-        if (prefixEntry != null)
-        {
-            return prefixEntry.getUri();
-        }
-
-        return null;
-    }
-
-    @Override
-    public String getPrefix(String namespace, IDocument document)
-    {
-        if (namespace == null || "".equals(namespace.trim())) //$NON-NLS-1$
-        {
-            return null;
-        }
-        final IStructuredDocumentContext context = IStructuredDocumentContextFactory.INSTANCE
-                .getContext(document, -1);
-        if (context != null)
-        {
-            final IDOMContextResolver resolver = IStructuredDocumentContextResolverFactory.INSTANCE
-                    .getDOMContextResolver(context);
-
-            if (resolver != null)
-            {
-                final Document xmlDoc = resolver.getDOMDocument();
-
-                if (xmlDoc != null)
-                {
-                    Map<String, PrefixEntry> map = getDocumentNamespaces(xmlDoc);
-                
-                    for (final Map.Entry<String, PrefixEntry> mapEntry : map.entrySet())
-                    {
-                        if (namespace.equals(mapEntry.getValue().getUri()))
-                        {
-                            return mapEntry.getKey();
-                        }
-                    }
-                }
-            }
-        }
-        return null;
-    }
-
-    /**
-     * @param doc
-     * @return map of available prefices in doc keyed by tag prefix
-     */
-    private Map<String, PrefixEntry> getDocumentNamespaces(final Document doc)
-    {
-        final Map<String, PrefixEntry> namespaces = new HashMap<String, PrefixEntry>();
-
-        final Element rootElement = doc.getDocumentElement();
-
-        if (rootElement != null)
-        {
-            final NamedNodeMap attrs = rootElement.getAttributes();
-            for (int i = 0; i < attrs.getLength(); i++)
-            {
-                final Attr a = (Attr) attrs.item(i);
-                final PrefixEntry ns = PrefixEntry.parseNamespace(a);
-                if (ns != null)
-                {
-                    namespaces.put(ns._prefix, ns);
-                }
-            }
-        }
-        return namespaces;
-    }
-
-    private static class PrefixEntry
-    {
-        private static final String XMLNS = "xmlns"; //$NON-NLS-1$
-        private final String _uri;
-        private final String _prefix;
-
-        public static PrefixEntry parseNamespace(final Attr attr)
-        {
-            final String prefix = attr.getPrefix();
-
-            if (XMLNS.equals(prefix))
-            {
-                final String prefixName = attr.getLocalName();
-                if (prefixName != null)
-                {
-                    final String uri = attr.getNodeValue();
-
-                    if (uri != null)
-                    {
-                        return new PrefixEntry(uri, prefixName);
-                    }
-                }
-            }
-
-            return null;
-        }
-
-        public PrefixEntry(final String uri, final String prefix)
-        {
-            _uri = uri;
-            _prefix = prefix;
-        }
-
-        public final String getUri()
-        {
-            return _uri;
-        }
-
-        @Override
-        public int hashCode()
-        {
-            return _uri.hashCode();
-        }
-
-        @Override
-        public boolean equals(final Object obj)
-        {
-            return _uri.equals(obj);
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/view/ViewDefnAdapterFactory.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/view/ViewDefnAdapterFactory.java
deleted file mode 100644
index c1de79a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/view/ViewDefnAdapterFactory.java
+++ /dev/null
@@ -1,56 +0,0 @@
-package org.eclipse.jst.jsf.facelet.core.internal.view;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.designtime.context.DTFacesContext;
-import org.eclipse.jst.jsf.designtime.internal.view.AbstractViewDefnAdapterFactory;
-import org.eclipse.jst.jsf.designtime.internal.view.IViewDefnAdapter;
-import org.eclipse.jst.jsf.designtime.internal.view.IViewDefnAdapterFactory;
-import org.eclipse.jst.jsf.designtime.internal.view.IDTViewHandler.ViewHandlerException;
-import org.eclipse.jst.jsf.designtime.internal.view.model.ITagRegistry;
-
-class ViewDefnAdapterFactory extends AbstractViewDefnAdapterFactory
-{
-    private final DTFaceletViewHandler _myViewHandler;
-	private final IViewDefnAdapterFactory _defaultViewDefnAdapterFactory;
-
-    ViewDefnAdapterFactory(final DTFaceletViewHandler viewHandler, final IViewDefnAdapterFactory defaultViewDefnAdapterFactory) 
-    {
-        _myViewHandler = viewHandler;
-        _defaultViewDefnAdapterFactory = defaultViewDefnAdapterFactory;
-    }
-
-    @Override
-    public IViewDefnAdapter<?, ?> createAdapter(DTFacesContext context, String viewId)
-    {
-        try
-        {
-            final IResource res =
-                    _myViewHandler.getActionDefinition(context, viewId);
-
-            if (res instanceof IFile)
-            {
-                final IFile srcFile = (IFile) res;
-                final ITagRegistry registry = findTagRegistry(srcFile);
-                if (registry != null) {
-	                if (_myViewHandler.isHTMLContent(srcFile))
-	                {
-	                    return new FaceletViewDefnAdapter(registry);
-	                }
-                    // if we have a jsp file, then return the default
-                    // adapter
-	                return _defaultViewDefnAdapterFactory.createAdapter(context, viewId);	                
-                }
-            }
-        }
-        catch (final ViewHandlerException vhe)
-        {
-            JSFCorePlugin.log(vhe, "While acquiring view adapter"); //$NON-NLS-1$
-        }
-
-        // not found or failed
-        return null;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/std-taglibs/composite.taglib.xml b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/std-taglibs/composite.taglib.xml
deleted file mode 100644
index 32f722f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/std-taglibs/composite.taglib.xml
+++ /dev/null
@@ -1,1710 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!--
- DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
-
- Copyright 2009 Sun Microsystems, Inc. All rights reserved.
-
- The contents of this file are subject to the terms of either the GNU
- General Public License Version 2 only ("GPL") or the Common Development
- and Distribution License("CDDL") (collectively, the "License").  You
- may not use this file except in compliance with the License. You can obtain
- a copy of the License at https://glassfish.dev.java.net/public/CDDL+GPL.html
- or glassfish/bootstrap/legal/LICENSE.txt.  See the License for the specific
- language governing permissions and limitations under the License.
-
- When distributing the software, include this License Header Notice in each
- file and include the License file at glassfish/bootstrap/legal/LICENSE.txt.
- Sun designates this particular file as subject to the "Classpath" exception
- as provided by Sun in the GPL Version 2 section of the License file that
- accompanied this code.  If applicable, add the following below the License
- Header, with the fields enclosed by brackets [] replaced by your own
- identifying information: "Portions Copyrighted [year]
- [name of copyright owner]"
-
- Contributor(s):
-
- If you wish your version of this file to be governed by only the CDDL or
- only the GPL Version 2, indicate your decision by adding "[Contributor]
- elects to include this software in this distribution under the [CDDL or GPL
- Version 2] license."  If you don't indicate a single choice of license, a
- recipient has the option to distribute your version of this file under
- either the CDDL, the GPL Version 2 or to extend the choice of license to
- its licensees as provided above.  However, if you add GPL Version 2 code
- and therefore, elected the GPL Version 2 license, then the option applies
- only if the new code is made subject to such option by the copyright
- holder.
--->
-
-<facelet-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 http://java.sun.com/xml/ns/javaee/web-facelettaglibrary_2_0.xsd"
-              version="2.0">
-    <description>
-
-
-        &lt;/pre&gt;
-
-        &lt;div class="changed_added_2_0"&gt;
-
-        &lt;p&gt;Describes the Facelets2 tag library used for declaring and
-        defining
-        the usage contract for composite UI Components. When authoring a
-        composite component, use of this tag library is largely optional,
-        though always recommended. Declaring and defining a composite
-        component with this taglib provides valuable information about the
-        component that can be used by tools and users of the composite
-        component. In most cases, a composite component can be authored
-        without declaring and defining its usage contract with this taglib.
-        PENDING: the limit of what one can do without declaring and defining a
-        usage contract must be cleary specified and documented. PENDING: The
-        implementation team must help discover these limits.
-        &lt;/p&gt;
-
-        &lt;h2&gt;Creating a Composite Component&lt;/h2&gt;
-
-        &lt;p&gt;The default implementation must support authoring A composite
-        component is declared by creating a Facelets2 file inside of a resource
-        library. (See section JSF.2.6 of the specification prose document for
-        more information about resource libraries.) A composite component
-        must reside within a resource library. It is not possible to create a
-        composite component without putting it inside of a resource
-        library.&lt;/p&gt;
-
-        &lt;p&gt;The default XML namespace URI of the taglib that contains the
-        composite component, for use in &lt;em&gt;the using page&lt;/em&gt;, is
-        &lt;code&gt;http://java.sun.com/jsf/composite/&amp;lt;composite-library-name&amp;gt;&lt;/code&gt;,
-        where &lt;code&gt;&amp;lt;composite-library-name&amp;gt;&lt;/code&gt; is
-        the name of the
-        resource library. For example:&lt;/p&gt;
-
-        &lt;pre&gt;&lt;code&gt;
-        &amp;lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-        &lt;br /&gt;
-        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&amp;gt;&lt;br
-        /&gt;
-        &amp;lt;html xmlns="http://www.w3.org/1999/xhtml"&lt;br /&gt;
-        xmlns:h="http://java.sun.com/jsf/html"&lt;br /&gt;
-        xmlns:f="http://java.sun.com/jsf/core"&lt;br /&gt;
-        xmlns:ui="http://java.sun.com/jsf/facelets"&lt;br /&gt;
-        xmlns:ez="&lt;i&gt;http://java.sun.com/jsf/composite/&lt;b&gt;ezcomp&lt;/b&gt;&lt;/i&gt;"&amp;gt;&lt;br
-        /&gt;
-        ...&lt;br /&gt;
-        &lt;/code&gt;&lt;/pre&gt;
-
-        &lt;p&gt;This declares that any Facelets2 file in the resource
-        library called &lt;code&gt;ezcomp&lt;/code&gt; can be used as a regular
-        JSF UI
-        component in a page with the above namespace declaration by using the
-        "&lt;code&gt;ez&lt;/code&gt;" prefix. For example, placing a file called
-        &lt;code&gt;foo.xhtml&lt;/code&gt; in a resource library called &lt;code&gt;ezcomp&lt;/code&gt;
-        would make that file accessible like this.&lt;/p&gt;
-
-        &lt;pre&gt;&lt;code&gt;
-        &amp;lt;ez:foo /&amp;gt;
-        &lt;/code&gt;&lt;/pre&gt;
-
-
-        &lt;p&gt;The implementation must also support declaring the
-        namespace of the tag library in a JSF PDL tag library descriptor.
-        This descriptor file is optional and is useful for component vendors
-        that do not want to use the default XML namespace. This version of
-        the proposal currently uses the facelet taglib descriptor syntax. For
-        example: &lt;/p&gt;
-
-        &lt;pre&gt;&lt;code&gt;
-        &amp;lt;facelet-taglib&amp;gt;&lt;br /&gt;
-        &amp;lt;namespace&amp;gt;http://domain.com/path&amp;lt;/namespace&amp;gt;
-        &lt;br /&gt;
-        &amp;lt;composite-library-name&amp;gt;compositeTest&amp;lt;/composite-library-name&amp;gt;
-        &lt;br /&gt;
-        &amp;lt;/facelet-taglib&amp;gt; &lt;br /&gt;
-        &lt;/code&gt;&lt;/pre&gt;
-
-        &lt;p&gt;Components from that taglibrary may be used in a using page by
-        declaring them in the XML namespace for that page:&lt;/p&gt;
-
-        &lt;pre&gt;&lt;code&gt;
-        &amp;lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-        &lt;br /&gt;
-        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&amp;gt;&lt;br
-        /&gt;
-        &amp;lt;html xmlns="http://www.w3.org/1999/xhtml"&lt;br /&gt;
-        xmlns:h="http://java.sun.com/jsf/html"&lt;br /&gt;
-        xmlns:f="http://java.sun.com/jsf/core"&lt;br /&gt;
-        xmlns:ui="http://java.sun.com/jsf/facelets"&lt;br /&gt;
-        xmlns:ez="&lt;i&gt;&lt;b&gt;http://domain.com/path/namespace&lt;/b&gt;&lt;/i&gt;"&amp;gt;&lt;br
-        /&gt;
-        ...&lt;br /&gt;
-        &lt;/code&gt;&lt;/pre&gt;
-
-
-        &lt;p&gt;&lt;a name="composite_example"&gt;Below is an example of a
-        fairly
-        involved composite component declaration. Such a declaration might
-        appear in &lt;code&gt;foo.xhtml&lt;/code&gt;.&lt;/a&gt;&lt;/p&gt;
-
-        &lt;div class="syntax"&gt;&lt;div class="html4strict"
-        style="font-family: monospace;"&gt;&lt;ol&gt;&lt;li class="li1"&gt;&lt;div
-        class="de1"&gt;&lt;span class="sc2"&gt;&amp;lt;&lt;a
-        href="interface.html"&gt;composite:interface&lt;/a&gt; &lt;span
-        class="kw3"&gt;name&lt;/span&gt;=&lt;span class="st0"&gt;&amp;quot;foo&amp;quot;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-        &lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;
-        &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
-        &amp;nbsp;displayName=&lt;span class="st0"&gt;&amp;quot;Very Simple
-        Login Panel&amp;quot;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-        &lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;
-        &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
-        &amp;nbsp;preferred=&lt;span class="st0"&gt;&amp;quot;true&amp;quot;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-        &lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;
-        &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
-        &amp;nbsp;expert=&lt;span class="st0"&gt;&amp;quot;false&amp;quot;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-        &lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;
-        &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
-        &amp;nbsp;shortDescription=&lt;span class="st0"&gt;&amp;quot;An
-        illustration of the composite component feature&amp;quot;&lt;/span&gt;&lt;span
-        class="kw2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-        &lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &lt;span
-        class="sc2"&gt;&amp;lt;&lt;a href="attribute.html"&gt;composite:attribute&lt;/a&gt;
-        &lt;span class="kw3"&gt;name&lt;/span&gt;=&lt;span class="st0"&gt;&amp;quot;model&amp;quot;&lt;/span&gt;
-        required=&lt;span class="st0"&gt;&amp;quot;true&amp;quot;&lt;/span&gt;&lt;span
-        class="kw2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-        &lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &lt;span
-        class="sc2"&gt;&amp;lt;composite:attribute &lt;span class="kw3"&gt;name&lt;/span&gt;=&lt;span
-        class="st0"&gt;&amp;quot;loginAction&amp;quot;&lt;/span&gt; required=&lt;span
-        class="st0"&gt;&amp;quot;true&amp;quot;&lt;/span&gt; method-signature=&lt;span
-        class="st0"&gt;&amp;quot;java.lang.Object action()&amp;quot;&lt;/span&gt;/
-        &lt;span class="kw2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-        &lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &lt;span
-        class="sc2"&gt;&lt;span class="kw2"&gt;&amp;lt;&lt;/span&gt;/composite:attribute&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-        &lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &lt;span
-        class="sc2"&gt;&amp;lt;composite:attribute &lt;span class="kw3"&gt;name&lt;/span&gt;=&lt;span
-        class="st0"&gt;&amp;quot;valueChangeListener&amp;quot;&lt;/span&gt;
-        targets=&lt;span class="st0"&gt;&amp;quot;username&amp;quot;&lt;/span&gt;
-        /&lt;span class="kw2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-        &lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &lt;span
-        class="sc2"&gt;&amp;lt;composite:attribute &lt;span class="kw3"&gt;name&lt;/span&gt;=&lt;span
-        class="st0"&gt;&amp;quot;specialMethodExpression&amp;quot;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-        &lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;
-        &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
-        &amp;nbsp; &amp;nbsp;method-signature=&lt;span class="st0"&gt;&amp;quot;com.foo.User
-        validateCurrentUser()&amp;quot;&lt;/span&gt; /&lt;span class="kw2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-        &lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &lt;span
-        class="sc2"&gt;&amp;lt;composite:attribute &lt;span class="kw3"&gt;name&lt;/span&gt;=&lt;span
-        class="st0"&gt;&amp;quot;loginButtonLabel&amp;quot;&lt;/span&gt;
-        default=&lt;span class="st0"&gt;&amp;quot;Login&amp;quot;&lt;/span&gt; /&lt;span
-        class="kw2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-        &lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &lt;span
-        class="sc2"&gt;&amp;lt;&lt;a href="editableValueHolder.html"&gt;composite:editableValueHolder&lt;/a&gt;
-        &lt;span class="kw3"&gt;name&lt;/span&gt;=&lt;span class="st0"&gt;&amp;quot;username&amp;quot;&lt;/span&gt;
-        /&lt;span class="kw2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-        &lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &lt;span
-        class="sc2"&gt;&amp;lt;composite:actionSource &lt;span class="kw3"&gt;name&lt;/span&gt;=&lt;span
-        class="st0"&gt;&amp;quot;loginEvent&amp;quot;&lt;/span&gt; /&lt;span
-        class="kw2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-        &lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &lt;span
-        class="sc2"&gt;&amp;lt;composite:actionSource &lt;span class="kw3"&gt;name&lt;/span&gt;=&lt;span
-        class="st0"&gt;&amp;quot;cancelEvent&amp;quot;&lt;/span&gt; /&lt;span
-        class="kw2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-        &lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &lt;span
-        class="sc2"&gt;&amp;lt;composite:actionSource &lt;span class="kw3"&gt;name&lt;/span&gt;=&lt;span
-        class="st0"&gt;&amp;quot;allEvents&amp;quot;&lt;/span&gt; targets=&lt;span
-        class="st0"&gt;&amp;quot;loginEvent,cancelEvent&amp;quot;&lt;/span&gt; /&lt;span
-        class="kw2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-        &lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="sc2"&gt;&lt;span
-        class="kw2"&gt;&amp;lt;&lt;/span&gt;/composite:interface&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-        &lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="sc2"&gt;&amp;lt;&lt;a
-        href="implementation.html"&gt;composite:implementation&lt;/a&gt; &lt;span
-        class="kw2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-        &lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
-        &lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &lt;span
-        class="sc2"&gt;&amp;lt;ui:decorate template=&lt;span class="st0"&gt;&amp;quot;fooTemplate.xhtml&amp;quot;&lt;/span&gt;&lt;span
-        class="kw2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-        &lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
-        &lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &lt;span
-        class="sc2"&gt;&amp;lt;ui:define &lt;span class="kw3"&gt;name&lt;/span&gt;=&lt;span
-        class="st0"&gt;&amp;quot;header&amp;quot;&lt;/span&gt;&lt;span
-        class="kw2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-        &lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
-        &lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;
-        &lt;span class="sc2"&gt;&lt;span class="kw2"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;&lt;/span&gt;This
-        is the login panel header&lt;span class="sc2"&gt;&lt;span class="kw2"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-        &lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
-        &lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &lt;span
-        class="sc2"&gt;&lt;span class="kw2"&gt;&amp;lt;&lt;/span&gt;/ui:define&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-        &lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
-        &lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &lt;span
-        class="sc2"&gt;&amp;lt;ui:define &lt;span class="kw3"&gt;name&lt;/span&gt;=&lt;span
-        class="st0"&gt;&amp;quot;body&amp;quot;&lt;/span&gt;&lt;span class="kw2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-        &lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
-        &lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;
-        &lt;span class="sc2"&gt;&lt;span class="kw2"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-        &lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
-        &lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;
-        &amp;nbsp; &amp;nbsp;&lt;span class="sc2"&gt;&amp;lt;h:inputText &lt;span
-        class="kw3"&gt;id&lt;/span&gt;=&lt;span class="st0"&gt;&amp;quot;username&amp;quot;&lt;/span&gt;
-        /&lt;span class="kw2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-        &lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
-        &lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;
-        &lt;span class="sc2"&gt;&lt;span class="kw2"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-        &lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
-        &lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;
-        &lt;span class="sc2"&gt;&lt;span class="kw2"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-        &lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
-        &lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;
-        &amp;nbsp; &lt;span class="sc2"&gt;&amp;lt;h:commandButton &lt;span
-        class="kw3"&gt;id&lt;/span&gt;=&lt;span class="st0"&gt;&amp;quot;loginEvent&amp;quot;&lt;/span&gt;
-        &lt;/div&gt;&lt;/li&gt;
-        &lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;
-        &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
-        &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class="kw3"&gt;value&lt;/span&gt;=&lt;span
-        class="st0"&gt;&amp;quot;#{cc.attrs.loginButtonLabel}&amp;quot;&lt;/span&gt;&lt;span
-        class="kw2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-        &lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
-        &lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;
-        &amp;nbsp; &lt;span class="sc2"&gt;&lt;span class="kw2"&gt;&amp;lt;&lt;/span&gt;/h:commandButton&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-        &lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
-        &lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;
-        &amp;nbsp; &lt;span class="sc2"&gt;&amp;lt;h:commandButton &lt;span
-        class="kw3"&gt;id&lt;/span&gt;=&lt;span class="st0"&gt;&amp;quot;cancelEvent&amp;quot;&lt;/span&gt;
-        &lt;span class="kw3"&gt;value&lt;/span&gt;=&lt;span class="st0"&gt;&amp;quot;Cancel&amp;quot;&lt;/span&gt;
-        &lt;span class="kw3"&gt;action&lt;/span&gt;=&lt;span class="st0"&gt;&amp;quot;cancel&amp;quot;&lt;/span&gt;&lt;span
-        class="kw2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-        &lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
-        &lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;
-        &amp;nbsp; &lt;span class="sc2"&gt;&lt;span class="kw2"&gt;&amp;lt;&lt;/span&gt;/h:commandButton&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-        &lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
-        &lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;
-        &amp;nbsp; &lt;span class="sc2"&gt;&amp;lt;special:validateUserButton
-        &lt;/div&gt;&lt;/li&gt;
-        &lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;
-        &amp;nbsp; &amp;nbsp; validateUser=&lt;span class="st0"&gt;&amp;quot;#{cc.attrs.specialMethodExpression}&amp;quot;&lt;/span&gt;
-        /&lt;span class="kw2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-        &lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
-        &lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
-        &lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;
-        &lt;span class="sc2"&gt;&lt;span class="kw2"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-        &lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
-        &lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &lt;span
-        class="sc2"&gt;&lt;span class="kw2"&gt;&amp;lt;&lt;/span&gt;/ui:define&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-        &lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
-        &lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &lt;span
-        class="sc2"&gt;&amp;lt;ui:define &lt;span class="kw3"&gt;name&lt;/span&gt;=&lt;span
-        class="st0"&gt;&amp;quot;footer&amp;quot;&lt;/span&gt;&lt;span
-        class="kw2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-        &lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
-        &lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span
-        class="sc2"&gt;&lt;span class="kw2"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;&lt;/span&gt;This
-        is the login panel footer&lt;span class="sc2"&gt;&lt;span class="kw2"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-        &lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
-        &lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &lt;span
-        class="sc2"&gt;&lt;span class="kw2"&gt;&amp;lt;&lt;/span&gt;/ui:define&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-        &lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
-        &lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &lt;span
-        class="sc2"&gt;&lt;span class="kw2"&gt;&amp;lt;&lt;/span&gt;/ui:decorate&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-        &lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
-        &lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="sc2"&gt;&lt;span
-        class="kw2"&gt;&amp;lt;&lt;/span&gt;/composite:implementation&amp;gt;&lt;/span&gt;
-        &lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;
-
-        &lt;p&gt;The values for attributes in a composite component PDL file can
-        be
-        fully localized by putting them inside a ResourceBundle in the same
-        directory as the PDL page and accessing them with the per-component
-        resource bundle syntax. Consider the file &lt;code&gt;foo.xhtml&lt;/code&gt;,
-        in
-        the resource library &lt;code&gt;ezcomp&lt;/code&gt;. The
-        &lt;code&gt;shortDescription&lt;/code&gt; element could be changed to
-        be:&lt;/p&gt;
-
-        &lt;pre&gt;&lt;code&gt;
-        &amp;lt;composite:interface
-        shortDescription="#{cc.resourceBundleMap.shortDescription}" &amp;gt;
-        &lt;/code&gt;&lt;/pre&gt;
-
-        &lt;p&gt;In this case, In the same &lt;code&gt;ezcomp&lt;/code&gt;
-        directory as
-        &lt;code&gt;foo.xhtml&lt;/code&gt;, there would be a &lt;code&gt;foo.properties&lt;/code&gt;
-        file that would contain this entry:&lt;/p&gt;
-
-        &lt;pre&gt;&lt;code&gt;
-        shortDescription=A really nifty login panel.
-        &lt;/code&gt;&lt;/pre&gt;
-
-        &lt;p&gt;The normal localization rules for &lt;code&gt;ResourceBundle&lt;/code&gt;
-        would
-        apply.&lt;/p&gt;
-
-        &lt;/div&gt;
-
-
-        &lt;pre&gt;
-
-
-    </description>
-    <namespace>http://java.sun.com/jsf/composite</namespace>
-    <tag>
-        <description>
-
-
-            &lt;div class="changed_added_2_0"&gt;
-
-            &lt;p&gt;This element declares the usage contract for a composite
-            component. Optionally, and at the component author's
-            discretion, this contract exposes the features of one or
-            more inner components to the page author. The page author
-            can work with the composite component as a single component
-            whose feature set is the union of the features declared in
-            the usage contract.&lt;/p&gt;
-
-            &lt;p&gt;For example, consider a composite component that
-            implements the functionality of a "login panel". Such a
-            component would likely have two text fields and one button.
-            The user of such a component might like to do one or more of
-            the following.&lt;/p&gt;
-
-            &lt;ul&gt;
-
-            &lt;li&gt;&lt;p&gt;Be able to listen for the &lt;code&gt;ActionEvent&lt;/code&gt;
-            on the button.&lt;/p&gt;
-
-            &lt;p&gt;In this case, a
-            &lt;code&gt;&amp;lt;composite:actionSource&amp;gt;&lt;/code&gt;
-            element is
-            included in the usage contract that refers to the inner
-            button in the &lt;code&gt;&amp;lt;composite:implementation&amp;gt;&lt;/code&gt;
-            section.&lt;/p&gt;
-
-            &lt;/li&gt;
-
-            &lt;li&gt;&lt;p&gt;Provide an "action" to invoke when the button is
-            pressed.
-            &lt;/p&gt;
-
-            &lt;p&gt;In this case, a
-            &lt;code&gt;&amp;lt;composite:attribute&amp;gt;&lt;/code&gt; element
-            is included
-            in the usage contract that refers to the inner button in the
-            &lt;code&gt;&amp;lt;composite:implementation&amp;gt;&lt;/code&gt;
-            section and
-            declares the proper method signature for an "action".&lt;/p&gt;
-
-            &lt;/li&gt;
-
-            &lt;li&gt;&lt;p&gt;Provide parameters to the composite component for
-            labels and other rendering specific aspects of the composite
-            component.&lt;/p&gt;
-
-            &lt;p&gt;In this case, one or more
-            &lt;code&gt;&amp;lt;composite:attribute&amp;gt;&lt;/code&gt;
-            elements are included
-            in the usage contract and those parameters are referred to in
-            the &lt;code&gt;&amp;lt;composite:implementation&amp;gt;&lt;/code&gt;
-            section
-            using EL expressions like
-            &lt;code&gt;#{cc.attrs.usernameLabel}&lt;/code&gt;,
-            assuming &lt;code&gt;usernameLabel&lt;/code&gt; is the &lt;code&gt;name&lt;/code&gt;
-            of one of the &lt;code&gt;&amp;lt;composite:attribute&amp;gt;&lt;/code&gt;
-            elements in the usage contract.&lt;/p&gt;
-
-            &lt;/li&gt;
-
-
-            &lt;li&gt;&lt;p&gt;Add &lt;code&gt;ValueChangeListener&lt;/code&gt;s,
-            &lt;code&gt;Converter&lt;/code&gt;s, or &lt;code&gt;Validator&lt;/code&gt;s
-            to either
-            or both text fields.
-            &lt;/p&gt;
-
-            &lt;p&gt;In this case, a
-            &lt;code&gt;&amp;lt;composite:editableValueHolder&amp;gt;&lt;/code&gt;
-            element is
-            included in the usage contract that refers to the inner text
-            field in the &lt;code&gt;&amp;lt;composite:implementation&amp;gt;&lt;/code&gt;
-            section. In the case of wanting to enable only adding a
-            &lt;code&gt;Converter&lt;/code&gt; (and not a
-            &lt;code&gt;ValueChangeListener&lt;/code&gt; or &lt;code&gt;Validator&lt;/code&gt;,
-            a
-            &lt;code&gt;&amp;lt;composite:valueHolder&amp;gt;&lt;/code&gt;
-            element would be
-            used.&lt;/p&gt;
-
-            &lt;/li&gt;
-
-            &lt;li&gt;&lt;p&gt;Add facet children to the login panel.&lt;/p&gt;
-
-            &lt;p&gt;In this case, a &lt;code&gt;&amp;lt;composite:facet&amp;gt;&lt;/code&gt;
-            element is included in the usage contract that refers to the
-            inner &lt;code&gt;&amp;lt;composite:renderFacet&amp;gt;&lt;/code&gt;
-            element in
-            the &lt;code&gt;&amp;lt;composite:implementation&amp;gt;&lt;/code&gt;
-            section.
-            &lt;/p&gt;
-
-            &lt;/li&gt;
-
-
-            &lt;/ul&gt;
-
-            &lt;p&gt;For each of the behaviorial interfaces in Section JSF.3.2
-            of
-            the specification, there is a tag in the
-            &lt;code&gt;composite:&lt;/code&gt; library to nest inside of the
-            &lt;code&gt;&amp;lt;composite:interface&amp;gt;&lt;/code&gt;
-            section.
-            &lt;/p&gt;
-
-
-            &lt;p&gt;If the &lt;code&gt;&amp;lt;composite:interface&amp;gt;&lt;/code&gt;
-            section
-            is not present in a &lt;em&gt;PDL page&lt;/em&gt;, the contract will
-            be
-            inferred as described in the specification. There must be
-            zero or one of these elements in a composite component PDL
-            file. If a &lt;code&gt;&amp;lt;composite:interface&amp;gt;&lt;/code&gt;
-            element
-            does appear, there must be an accompanying
-            &lt;code&gt;&amp;lt;composite:implementation&amp;gt;&lt;/code&gt;
-            element in the
-            same PDL file. &lt;/p&gt;
-
-            &lt;p&gt;&lt;b&gt;Nesting of composite components&lt;/b&gt;&lt;/p&gt;
-
-            &lt;p&gt;The implementation must support nesting of composite
-            components. Specifically, it must be possible for the
-            &lt;code&gt;&amp;lt;composite:implementation&amp;gt;&lt;/code&gt;
-            section of a
-            composite component to act as the &lt;em&gt;using page&lt;/em&gt;
-            for
-            another composite component. When a composite component
-            exposes a behavioral interface to the &lt;em&gt;using page&lt;/em&gt;,
-            such as a &lt;code&gt;&amp;lt;composite:actionSource&amp;gt;&lt;/code&gt;,
-            &lt;code&gt;&amp;lt;composite:editableValueHolder&amp;gt;&lt;/code&gt;,
-            &lt;code&gt;&amp;lt;composite:valueHolder&amp;gt;&lt;/code&gt; or
-            other
-            behavioral interface, it must be possible to
-            &amp;#8220;propogate&amp;#8221; the exposure of such an interface in
-            the case of a nested composite component. The composite
-            component author must ensure that the value of the
-            &lt;code&gt;name&lt;/code&gt; attributes exactly match at all levels
-            of
-            the nesting to enable this exposure to work. The
-            implementation is not required to support
-            &amp;#8220;re-mapping&amp;#8221; of names in a nested composite
-            component.&lt;/p&gt;
-
-            &lt;p&gt;For example, consider this nested composite component.&lt;/p&gt;
-
-            &lt;p&gt;Using page&lt;/p&gt;
-
-            &lt;div class="syntax"&gt;&lt;div class="html4strict"
-            style="font-family: monospace;"&gt;&lt;ol&gt;&lt;li class="li1"&gt;&lt;div
-            class="de1"&gt;&lt;span class="sc2"&gt;&amp;lt;ez:actionSourceOuter&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-            &lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &lt;span
-            class="sc2"&gt;&amp;lt;f:actionListener &lt;span class="kw3"&gt;for&lt;/span&gt;=&lt;span
-            class="st0"&gt;&amp;quot;button1&amp;quot;&lt;/span&gt; /&lt;span
-            class="kw2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-            &lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="sc2"&gt;&lt;span
-            class="kw2"&gt;&amp;lt;&lt;/span&gt;/ez:actionSourceOuter&amp;gt;&lt;/span&gt;
-            &lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;
-
-            &lt;p&gt;actionSourceOuter.xhtml: Outer composite component&lt;/p&gt;
-
-            &lt;div class="syntax"&gt;&lt;div class="html4strict"
-            style="font-family: monospace;"&gt;&lt;ol&gt;&lt;li class="li1"&gt;&lt;div
-            class="de1"&gt;&lt;span class="sc2"&gt;&amp;lt;composite:interface&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-            &lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &lt;span
-            class="sc2"&gt;&amp;lt;composite:actionSource &lt;span class="kw3"&gt;name&lt;/span&gt;=&lt;span
-            class="st0"&gt;&amp;quot;button1&amp;quot;&lt;/span&gt; /&lt;span
-            class="kw2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-            &lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="sc2"&gt;&lt;span
-            class="kw2"&gt;&amp;lt;&lt;/span&gt;/composite:interface&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-            &lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
-            &lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="sc2"&gt;&amp;lt;composite:implementation&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-            &lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &lt;span
-            class="sc2"&gt;&amp;lt;ez:actionSourceInner /&lt;span class="kw2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-            &lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="sc2"&gt;&lt;span
-            class="kw2"&gt;&amp;lt;&lt;/span&gt;/composite:implementation&amp;gt;&lt;/span&gt;
-            &lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;
-
-            &lt;p&gt;actionSourceInner.xhtml: the composite component used
-            within a
-            composite component.&lt;/p&gt;
-
-            &lt;div class="syntax"&gt;&lt;div class="html4strict"
-            style="font-family: monospace;"&gt;&lt;ol&gt;&lt;li class="li1"&gt;&lt;div
-            class="de1"&gt;&lt;span class="sc2"&gt;&amp;lt;composite:interface&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-            &lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &lt;span
-            class="sc2"&gt;&amp;lt;composite:actionSource &lt;span class="kw3"&gt;name&lt;/span&gt;=&lt;span
-            class="st0"&gt;&amp;quot;button1&amp;quot;&lt;/span&gt; /&lt;span
-            class="kw2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-            &lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="sc2"&gt;&lt;span
-            class="kw2"&gt;&amp;lt;&lt;/span&gt;/composite:interface&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-            &lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
-            &lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="sc2"&gt;&amp;lt;composite:implementation&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-            &lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &lt;span
-            class="sc2"&gt;&amp;lt;h:commandButton &lt;span class="kw3"&gt;id&lt;/span&gt;=&lt;span
-            class="st0"&gt;&amp;quot;button1&amp;quot;&lt;/span&gt; &lt;span
-            class="kw3"&gt;value&lt;/span&gt;=&lt;span class="st0"&gt;&amp;quot;the
-            real button&amp;quot;&lt;/span&gt; /&lt;span class="kw2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-            &lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="sc2"&gt;&lt;span
-            class="kw2"&gt;&amp;lt;&lt;/span&gt;/composite:implementation&amp;gt;&lt;/span&gt;
-            &lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;
-
-            &lt;p&gt;The &lt;code&gt;id&lt;/code&gt; of the &lt;code&gt;&amp;lt;h:commandButton&amp;gt;&lt;/code&gt;
-            on
-            line 6 of actionSourceInner.xhtml must match the &lt;code&gt;name&lt;/code&gt;
-            on
-            line 2 of that file (this is a standard requirement for all
-            composite
-            components, nested or not). That &lt;code&gt;id&lt;/code&gt; must
-            also match the
-            &lt;code&gt;name&lt;/code&gt; on line 2 of actionSourceOuter.xhtml,
-            and the
-            &lt;code&gt;for&lt;/code&gt; on line 2 of the using page.&lt;/p&gt;
-
-            &lt;p&gt;The implementation must support any level of nesting as
-            long as the
-            &lt;code&gt;for&lt;/code&gt;, &lt;code&gt;name&lt;/code&gt;, and
-            &lt;code&gt;id&lt;/code&gt; values match
-            up. Furthermore, the &lt;code&gt;targets&lt;/code&gt; attribute is
-            also valid for
-            use in this nested fashion.&lt;/p&gt;
-
-            &lt;p&gt;&lt;b&gt;Naming containers within composite components&lt;/b&gt;&lt;/p&gt;
-
-            &lt;p&gt;Composite components are themselves naming containers so
-            that any
-            possible id conflicts between inner components and components in the
-            using page are avoided. However, special care must be taken when
-            using
-            naming containers in the &lt;code&gt;&amp;lt;composite:implementation&amp;gt;&lt;/code&gt;
-            section. In such cases the value of the &amp;#8220;name&amp;#8221;
-            attribute,
-            or the values of the &amp;#8220;targets&amp;#8221; attribute must be
-            used with a
-            clientId relative to the &lt;em&gt;top level component&lt;/em&gt; to
-            expose any
-            attached object targets to the using page. For example:&lt;/p&gt;
-
-            &lt;p&gt;Using page&lt;/p&gt;
-
-            &lt;div class="syntax"&gt;&lt;div class="html4strict"
-            style="font-family: monospace;"&gt;&lt;ol&gt;&lt;li class="li1"&gt;&lt;div
-            class="de1"&gt;&lt;span class="sc2"&gt;&amp;lt;ez:loginButton&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-            &lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &lt;span
-            class="sc2"&gt;&amp;lt;f:actionListener &lt;span class="kw3"&gt;for&lt;/span&gt;=&lt;span
-            class="st0"&gt;&amp;quot;button&amp;quot;&lt;/span&gt; &lt;span
-            class="kw3"&gt;binding&lt;/span&gt;=&lt;span class="st0"&gt;&amp;quot;#{foo.actionListener}&amp;quot;&lt;/span&gt;
-            /&lt;span class="kw2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-            &lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="sc2"&gt;&lt;span
-            class="kw2"&gt;&amp;lt;&lt;/span&gt;/ez:loginButton&amp;gt;&lt;/span&gt;
-            &lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;
-
-
-            &lt;p&gt;loginButton.xhtml&lt;/p&gt;
-
-            &lt;div class="syntax"&gt;&lt;div class="html4strict"
-            style="font-family: monospace;"&gt;&lt;ol&gt;&lt;li class="li1"&gt;&lt;div
-            class="de1"&gt;&lt;span class="sc2"&gt;&amp;lt;composite:interface&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-            &lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &lt;span
-            class="sc2"&gt;&amp;lt;composite:actionSource &lt;span class="kw3"&gt;name&lt;/span&gt;=&lt;span
-            class="st0"&gt;&amp;quot;button&amp;quot;&lt;/span&gt; targets=&lt;span
-            class="st0"&gt;&amp;quot;form:button&amp;quot;&lt;/span&gt; /&lt;span
-            class="kw2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-            &lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="sc2"&gt;&lt;span
-            class="kw2"&gt;&amp;lt;&lt;/span&gt;/composite:interface&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-            &lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
-            &lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="sc2"&gt;&amp;lt;composite:implementation&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-            &lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
-            &lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &lt;span
-            class="sc2"&gt;&amp;lt;h:form &lt;span class="kw3"&gt;id&lt;/span&gt;=&lt;span
-            class="st0"&gt;&amp;quot;form&amp;quot;&lt;/span&gt;&lt;span
-            class="kw2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-            &lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp;
-            &lt;span class="sc2"&gt;&amp;lt;h:commandButton &lt;span class="kw3"&gt;id&lt;/span&gt;=&lt;span
-            class="st0"&gt;&amp;quot;button&amp;quot;&lt;/span&gt; &lt;span
-            class="kw3"&gt;value&lt;/span&gt;=&lt;span class="st0"&gt;&amp;quot;Submit&amp;quot;&lt;/span&gt;
-            /&lt;span class="kw2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-            &lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &lt;span
-            class="sc2"&gt;&lt;span class="kw2"&gt;&amp;lt;&lt;/span&gt;/h:form&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-            &lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="sc2"&gt;&lt;span
-            class="kw2"&gt;&amp;lt;&lt;/span&gt;/composite:implementation&amp;gt;&lt;/span&gt;
-            &lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;
-
-            &lt;p&gt;Because the button on line 8 resides within a form, it must
-            be
-            referred to using a client id, relative to the &lt;em&gt;top level
-            component&lt;/em&gt;, in the "targets" attribute on line 2. Using a
-            relative
-            clientId is required due to the semantics of
-            &lt;code&gt;UIComponent.findComponent()&lt;/code&gt;.&lt;/p&gt;
-
-            &lt;/div&gt;
-
-        </description>
-        <tag-name>interface</tag-name>
-        <handler-class>com.sun.faces.facelets.tag.composite.InterfaceHandler</handler-class>
-        <attribute>
-            <description>
-
-
-                &lt;div class="changed_added_2_0"&gt;
-                &lt;p&gt;The name of this composite component.
-                Advisory only. The real name is taken from the
-                filename. The value of this attribute will be set as
-                the value for this property on the &lt;em&gt;composite
-                component bean descriptor&lt;/em&gt;.&lt;/p&gt;&lt;/div&gt;
-
-            </description>
-            <name>name</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-
-
-                &lt;div class="changed_added_2_0"&gt;
-                &lt;p&gt;The &lt;code&gt;component-type&lt;/code&gt; of the &lt;code&gt;UIComponent&lt;/code&gt;
-                that
-                will serve as the &lt;em&gt;composite component root&lt;/em&gt;
-                for this composite
-                component. The declared &lt;code&gt;component-family&lt;/code&gt;
-                for this
-                component must be &lt;code&gt;javax.faces.NamingContainer&lt;/code&gt;.&lt;/p&gt;&lt;/div&gt;
-
-            </description>
-            <name>componentType</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-
-
-                &lt;div class="changed_added_2_0"&gt;
-                &lt;p&gt;The name to display in a tool palette
-                containing this component. The value of this attribute will be
-                set as
-                the value for this property on the &lt;em&gt;composite
-                component bean descriptor&lt;/em&gt;.&lt;/p&gt;&lt;/div&gt;
-
-            </description>
-            <name>displayName</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-
-
-                &lt;div class="changed_added_2_0"&gt;
-                &lt;p&gt;Is this a "preferred" component. The value
-                of this attribute will be set as the value for this
-                property on the &lt;em&gt;composite component bean
-                descriptor&lt;/em&gt;.&lt;/p&gt;&lt;/div&gt;
-
-            </description>
-            <name>preferred</name>
-            <required>false</required>
-            <type>boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-
-
-                &lt;div class="changed_added_2_0"&gt;
-                &lt;p&gt;Is this component only for expert users?
-                The value of this attribute will be set as the value for
-                this property on the &lt;em&gt;composite component bean
-                descriptor&lt;/em&gt;.&lt;/p&gt;&lt;/div&gt;
-
-            </description>
-            <name>expert</name>
-            <required>false</required>
-            <type>boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-
-
-                &lt;div class="changed_added_2_0"&gt;
-                &lt;p&gt;A short description of the purpose of this
-                component. The value of this attribute will be set as
-                the value for this property on the &lt;em&gt;composite
-                component bean descriptor&lt;/em&gt;.&lt;/p&gt;&lt;/div&gt;
-
-            </description>
-            <name>shortDescription</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-    </tag>
-    <tag>
-        <description>
-
-            &lt;div class="changed_added_2_0"&gt;
-            &lt;p&gt;Defines the implementation of the composite
-            component. There must be zero or one of these in a
-            composite component markup file. If a
-            &lt;code&gt;&amp;lt;composite:interface&amp;gt;&lt;/code&gt; element
-            appears,
-            there must be a corresponding
-            &lt;code&gt;&amp;lt;composite-implementation&amp;gt;&lt;/code&gt;
-            element. If no
-            &lt;code&gt;&amp;lt;composite:interface&amp;gt;&lt;/code&gt; element
-            appears,
-            the &lt;code&gt;&amp;lt;composite-implementation&amp;gt;&lt;/code&gt;
-            element is
-            optional. &lt;/p&gt; &lt;/div&gt;
-        </description>
-        <tag-name>implementation</tag-name>
-        <handler-class>com.sun.faces.facelets.tag.composite.ImplementationHandler</handler-class>
-    </tag>
-    <tag>
-        <description>
-
-
-            &lt;div class="changed_added_2_0"&gt;
-            &lt;p&gt;Declares an attribute that may be given to an instance of
-            the
-            &lt;em&gt;composite component&lt;/em&gt; tag for this composite
-            component. There
-            may be zero or many of these inside of the
-            &lt;code&gt;&amp;lt;composite:interface&lt;/code&gt;&amp;gt;
-            section. This element may be
-            nested within other &lt;code&gt;&amp;lt;composite:attribute&amp;gt;&lt;/code&gt;
-            elements to
-            convey a usage contract that includes nested properties.&lt;/p&gt;
-
-            &lt;p&gt;Please see &lt;a href="tld-summary.html#composite_example"&gt;summary
-            page&lt;/a&gt; for a usage example.&lt;/p&gt;
-
-            &lt;p&gt;The &lt;em&gt;top level component&lt;/em&gt; in which this
-            element is
-            ultimately nested must be a &lt;code&gt;NamingContainer&lt;/code&gt;.
-            There are certain component properties that must not be
-            exposed using this element. The motivation for this
-            restriction is that the mapping of markup attributes to
-            component properties/attributes does not allow for these
-            attributes to be set. The following properties must not be
-            exposed using this element.&lt;/p&gt;
-
-            &lt;ul&gt;
-            &lt;li&gt;&lt;p&gt;binding&lt;/p&gt;&lt;/li&gt;
-            &lt;li&gt;&lt;p&gt;id&lt;/p&gt;&lt;/li&gt;
-            &lt;li&gt;&lt;p&gt;inView&lt;/p&gt;&lt;/li&gt;
-            &lt;li&gt;&lt;p&gt;parent&lt;/p&gt;&lt;/li&gt;
-            &lt;li&gt;&lt;p&gt;rendered&lt;/p&gt;&lt;/li&gt;
-            &lt;li&gt;&lt;p&gt;rendererType&lt;/p&gt;&lt;/li&gt;
-            &lt;li&gt;&lt;p&gt;transient&lt;/p&gt;&lt;/li&gt;
-            &lt;/ul&gt;
-
-            &lt;/div&gt;
-        </description>
-        <tag-name>attribute</tag-name>
-        <handler-class>com.sun.faces.facelets.tag.composite.AttributeHandler</handler-class>
-        <attribute>
-            <description>
-
-
-                &lt;div class="changed_added_2_0"&gt;
-                &lt;p&gt;The name of the attribute as it must appear on the &lt;em&gt;composite
-                component tag&lt;/em&gt; in the &lt;em&gt;using page&lt;/em&gt;.
-                If the value of the
-                &lt;em&gt;name&lt;/em&gt; attribute is equal to (without the
-                quotes)
-                &amp;#8220;action&amp;#8221;, &amp;#8221;actionListener&amp;#8221;,
-                &amp;#8220;validator&amp;#8221;, or &amp;#8220;valueChangeListener&amp;#8221;,
-                the
-                action described in &lt;a target="_"
-                href="../../../javadocs/javax/faces/application/ViewHandler.html#retargetMethodExpressions(javax.faces.context.FacesContext,%20javax.faces.component.UIComponent)"&gt;ViewHandler.retargetMethodExpressions()&lt;/a&gt;
-                must be taken to handle the attribute. In these cases, the
-                &lt;code&gt;method-signature&lt;/code&gt; attribute, if present,
-                must be ignored as
-                its value is derived as described in
-                &lt;code&gt;retargetMethodExpressions()&lt;/code&gt;.&lt;/div&gt;
-
-            </description>
-            <name>name</name>
-            <required>true</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-
-
-                &lt;div class="changed_added_2_0"&gt;
-
-                &lt;p&gt;If this element has a &lt;code&gt;method-signature&lt;/code&gt;
-                attribute, the
-                value of the &lt;code&gt;targets&lt;/code&gt; attribute must be
-                interpreted as a
-                space (not tab) separated list of client ids (relative to the
-                &lt;em&gt;top
-                level component&lt;/em&gt;) of components within the
-                &lt;code&gt;&amp;lt;composite:implementation&amp;gt;&lt;/code&gt;
-                section. Space is used as
-                the delimiter for compatibility with the IDREFS and NMTOKENS
-                data types
-                from the XML Schema. Each entry in the list must be interpreted
-                as the
-                id of an inner component to which the &lt;code&gt;MethodExpression&lt;/code&gt;
-                from
-                the &lt;em&gt;composite component tag&lt;/em&gt; in the &lt;em&gt;using
-                page&lt;/em&gt; must be
-                applied. If this element has a &lt;code&gt;method-signature&lt;/code&gt;
-                attribute,
-                but no &lt;code&gt;targets&lt;/code&gt; attribute, the value of
-                the
-                &lt;code&gt;name&lt;/code&gt; attribute is used as the single
-                entry in the list. If
-                the value of the &lt;code&gt;name&lt;/code&gt; attribute is &lt;strong&gt;not&lt;/strong&gt;
-                one
-                of the special values listed in the description of the &lt;code&gt;name
-                attribute&lt;/code&gt;, &lt;code&gt;targets&lt;/code&gt; (or its
-                derived value) need not
-                correspond to the id of an inner component.&lt;/p&gt;
-
-                &lt;/div&gt;
-
-            </description>
-            <name>targets</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-
-
-                &lt;div class="changed_added_2_0"&gt;
-                &lt;p&gt;If this attribute is not required, and a
-                value is not supplied by the page author, use this as
-                the default value.&lt;/p&gt;&lt;/div&gt;
-
-            </description>
-            <name>default</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-
-
-                &lt;div class="changed_added_2_0"&gt;
-                &lt;p&gt;The name to display in a tool palette
-                containing this component. The value of this attribute will be
-                set as
-                the value for this property on the &lt;em&gt;composite
-                component bean descriptor&lt;/em&gt;.&lt;/p&gt;&lt;/div&gt;
-
-            </description>
-            <name>displayName</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-
-
-                &lt;div class="changed_added_2_0"&gt;
-                &lt;p&gt;True if the page author must supply a value
-                for this attribute.&lt;/p&gt;&lt;/div&gt;
-
-            </description>
-            <name>required</name>
-            <required>false</required>
-            <type>boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-
-
-                &lt;div class="changed_added_2_0"&gt;
-                &lt;p&gt;Is this a "preferred" component. The value
-                of this attribute will be set as the value for this
-                property on the &lt;em&gt;composite component bean
-                descriptor&lt;/em&gt;.&lt;/p&gt;&lt;/div&gt;
-
-            </description>
-            <name>preferred</name>
-            <required>false</required>
-            <type>boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-
-
-                &lt;div class="changed_added_2_0"&gt;
-                &lt;p&gt;Is this component only for expert users?
-                The value of this attribute will be set as the value for
-                this property on the &lt;em&gt;composite component bean
-                descriptor&lt;/em&gt;.&lt;/p&gt;&lt;/div&gt;
-
-            </description>
-            <name>expert</name>
-            <required>false</required>
-            <type>boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-
-
-                &lt;div class="changed_added_2_0"&gt;
-                &lt;p&gt;A short description of the purpose of this
-                component. The value of this attribute will be set as
-                the value for this property on the &lt;em&gt;composite
-                component bean descriptor&lt;/em&gt;.&lt;/p&gt;&lt;/div&gt;
-
-            </description>
-            <name>shortDescription</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-
-
-                &lt;div class="changed_added_2_0"&gt;
-                &lt;p&gt;Declares that this attribute must be a &lt;code&gt;MethodExpression&lt;/code&gt;
-                whose method signature is described by the value of this
-                attribute. The
-                signature must be described using fully qualified class names
-                wherever a
-                type is required. This attribute is mutually exclusive with the
-                "type"
-                attribute. If both attributes are present, the
-                "method-signature"
-                attribute is ignored.&lt;/p&gt;
-
-                &lt;p&gt;PENDING: when this file is generated from the
-                web-facesuicomponent_2_0.xsd, we will not need to copy the
-                content here
-                manually.&lt;/p&gt;
-
-                &lt;p&gt;Provides the signature of the Java method. The syntax
-                of
-                the method-signature element is as follows (taken from
-                function-signature in web-jsptaglibrary_2_1.xsd):&lt;/p&gt;
-
-                &lt;p&gt;MethodSignature ::= ReturnType S MethodName S?
-                '(' S? Parameters? S? ')'&lt;/p&gt;
-
-                &lt;p&gt;ReturnType ::= Type&lt;/p&gt;
-
-                &lt;p&gt;MethodName ::= Identifier&lt;/p&gt;
-
-                &lt;p&gt;Parameters ::= Parameter
-                | ( Parameter S? ',' S? Parameters )&lt;/p&gt;
-
-                &lt;p&gt;Parameter ::= Type&lt;/p&gt;
-
-                &lt;p&gt;Where:&lt;/p&gt;
-
-                &lt;ul&gt;
-
-                &lt;li&gt;&lt;p&gt;Type is a basic type or a fully qualified
-                Java class name (including package name),
-                as per the 'Type' production in the Java
-                Language Specification, Second Edition,
-                Chapter 18.&lt;/p&gt;&lt;/li&gt;
-
-                &lt;li&gt;&lt;p&gt;Identifier is a Java identifier, as per
-                the 'Identifier' production in the Java
-                Language Specification, Second
-                Edition, Chapter 18.&lt;/p&gt;&lt;/li&gt;
-
-                &lt;/ul&gt;
-
-                &lt;p&gt;Example:&lt;/p&gt;
-
-                &lt;p&gt;&lt;code&gt;java.lang.String nickName(
-                java.lang.String, int )&lt;/code&gt;&lt;/p&gt;
-
-
-                &lt;/div&gt;
-
-            </description>
-            <name>method-signature</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-
-
-                &lt;div class="changed_added_2_0"&gt;
-                &lt;p&gt;Declares that this attribute must be a &lt;code&gt;ValueExpression&lt;/code&gt;
-                whose expected type is given by the value of this attribute. If
-                not
-                specified, and no "method-signature" attribute is present,
-                &lt;code&gt;java.lang.Object&lt;/code&gt; is assumed. This
-                attribute is mutually
-                exclusive with the "type" attribute. If both attributes are
-                present, the
-                "method-signature" attribute is ignored. &lt;/p&gt; &lt;/div&gt;
-
-            </description>
-            <name>type</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-    </tag>
-    <tag>
-        <description>
-
-
-            &lt;div class="changed_added_2_0"&gt;
-
-            &lt;p&gt;Declares that this composite component supports a facet
-            with the
-            name given by the value of the "name" attribute. &lt;/p&gt;
-
-            &lt;p&gt;Please see &lt;code&gt;&amp;lt;&lt;a
-            href="interface.html"&gt;composite:interface&lt;/a&gt;&amp;gt;&lt;/code&gt;
-            for a usage
-            example.&lt;/p&gt;
-
-
-            &lt;/div&gt;
-        </description>
-        <tag-name>facet</tag-name>
-        <handler-class>com.sun.faces.facelets.tag.composite.DeclareFacetHandler</handler-class>
-        <attribute>
-            <description>
-
-
-                &lt;div class="changed_added_2_0"&gt;
-                &lt;p&gt;The name of the attribute as it must appear
-                on the &lt;em&gt;composite component tag&lt;/em&gt; in the
-                &lt;em&gt;using page&lt;/em&gt;.&lt;/p&gt;&lt;/div&gt;
-
-            </description>
-            <name>name</name>
-            <required>true</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-
-
-                &lt;div class="changed_added_2_0"&gt;
-                &lt;p&gt;The name to display in a tool palette
-                containing this component. The value of this attribute will be
-                set as
-                the value for this property on the &lt;em&gt;composite
-                component bean descriptor&lt;/em&gt;.&lt;/p&gt;&lt;/div&gt;
-
-            </description>
-            <name>displayName</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-
-
-                &lt;div class="changed_added_2_0"&gt;
-                &lt;p&gt;True if the page author must supply a facet with this
-                name.&lt;/p&gt;&lt;/div&gt;
-
-            </description>
-            <name>required</name>
-            <required>false</required>
-            <type>boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-
-
-                &lt;div class="changed_added_2_0"&gt;
-                &lt;p&gt;Is this a "preferred" facet. The value
-                of this attribute will be set as the value for this
-                property on the &lt;em&gt;composite component bean
-                descriptor&lt;/em&gt;.&lt;/p&gt;&lt;/div&gt;
-
-            </description>
-            <name>preferred</name>
-            <required>false</required>
-            <type>boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-
-
-                &lt;div class="changed_added_2_0"&gt;
-                &lt;p&gt;Is this facet only for expert users?
-                The value of this attribute will be set as the value for
-                this property on the &lt;em&gt;composite component bean
-                descriptor&lt;/em&gt;.&lt;/p&gt;&lt;/div&gt;
-
-            </description>
-            <name>expert</name>
-            <required>false</required>
-            <type>boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-
-
-                &lt;div class="changed_added_2_0"&gt;
-                &lt;p&gt;A short description of the purpose of this
-                facet. The value of this attribute will be set as
-                the value for this property on the &lt;em&gt;composite
-                component bean descriptor&lt;/em&gt;.&lt;/p&gt;&lt;/div&gt;
-
-            </description>
-            <name>shortDescription</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-    </tag>
-    <tag>
-        <description>
-
-
-            &lt;div class="changed_added_2_0"&gt;
-
-            &lt;p&gt;This element is used in the
-            &lt;code&gt;&amp;lt;composite:implementation&amp;gt;&lt;/code&gt;
-            section. The facet with
-            the name equal to the value of the name attribute, given by the page
-            author in the using page, will be rendered at this point in the
-            composite component PDL page. &lt;/p&gt;
-
-
-            &lt;p&gt;The implementation of this tag handler must insert a
-            component with &lt;code&gt;component-type&lt;/code&gt;
-            &lt;code&gt;javax.faces.Output&lt;/code&gt; and &lt;code&gt;renderer-type&lt;/code&gt;
-            &lt;code&gt;javax.faces.CompositeFacet&lt;/code&gt; as a
-            child at this point in the component tree.&lt;/p&gt;
-
-            &lt;p&gt;The implementation of this tag handler must store an
-            attribute into
-            the created component's attribute map under the key given by the
-            value
-            of the symbolic constant &lt;code&gt;UIComponent.FACETS_KEY&lt;/code&gt;.
-            The value
-            for this key must be the evaluated value of the "name" attribute.&lt;/p&gt;
-
-            &lt;/div&gt;
-        </description>
-        <tag-name>renderFacet</tag-name>
-        <handler-class>com.sun.faces.facelets.tag.composite.RenderFacetHandler</handler-class>
-        <attribute>
-            <description>
-
-
-                &lt;div class="changed_added_2_0"&gt;
-                &lt;p&gt;The value of the name attribute as it must appear on an
-                &lt;code&gt;&amp;lt;f:facet&amp;gt;&lt;/code&gt; tag nested
-                within the &lt;em&gt;composite
-                component tag&lt;/em&gt; in the &lt;em&gt;using page&lt;/em&gt;.&lt;/p&gt;&lt;/div&gt;
-
-            </description>
-            <name>name</name>
-            <required>true</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-
-                &lt;div class="changed_added_2_0"&gt;
-
-                &lt;p&gt;If &lt;code&gt;true&lt;/code&gt;, and there is no such
-                facet present on the top
-                level component, a &lt;code&gt;TagException&lt;/code&gt; must be
-                thrown, containing
-                the &lt;code&gt;Location&lt;/code&gt;, the facet name, and a
-                localized descriptive
-                error message.&lt;/p&gt;
-
-                &lt;/div&gt;
-
-            </description>
-            <name>required</name>
-            <required>false</required>
-            <type>boolean</type>
-        </attribute>
-    </tag>
-    <tag>
-        <description>
-
-
-            &lt;div class="changed_added_2_0"&gt;
-
-            &lt;p&gt;This element is used in the
-            &lt;code&gt;&amp;lt;composite:implementation&amp;gt;&lt;/code&gt;
-            section. Any child
-            components or template text within the composite component tag in
-            the
-            using page will be re-parented into the composite component at the
-            point
-            indicated by this tag's placement within the
-            &lt;code&gt;&amp;lt;composite:implementation&amp;gt;&lt;/code&gt;
-            section. The normal
-            use-case for this element is to have only one occurrence within the
-            &lt;code&gt;&amp;lt;composite:implementation&amp;gt;&lt;/code&gt;
-            section. Inserting
-            multiple occurrences may cause duplicate id errors. The results are
-            undefined if there are multiple occurrences of this element in the
-            &lt;code&gt;&amp;lt;composite:implementation&amp;gt;&lt;/code&gt;
-            section.&lt;/p&gt;
-
-            &lt;/div&gt;
-        </description>
-        <tag-name>insertChildren</tag-name>
-        <handler-class>com.sun.faces.facelets.tag.composite.InsertChildrenHandler</handler-class>
-    </tag>
-    <tag>
-        <description>
-
-
-            &lt;div class="changed_added_2_0"&gt;
-            &lt;p&gt;Declares that the composite component whose
-            contract is declared by the
-            &lt;code&gt;&amp;lt;composite:interface&amp;gt;&lt;/code&gt; in
-            which this
-            element is nested exposes an implementation of
-            &lt;code&gt;ValueHolder&lt;/code&gt; suitable for use as the target
-            of
-            &lt;em&gt;attached objects&lt;/em&gt; in &lt;em&gt;the using page&lt;/em&gt;.
-            Any attached objects suitable for implementations of
-            &lt;code&gt;ValueHolder&lt;/code&gt; may be attached to the
-            composite
-            component. Consider this excerpt from &lt;em&gt;the using
-            page&lt;/em&gt;:
-            &lt;/p&gt;
-
-            &lt;div class="syntax"&gt;&lt;div class="html4strict"
-            style="font-family: monospace;"&gt;&lt;ol&gt;&lt;li class="li1"&gt;&lt;div
-            class="de1"&gt;&lt;span class="sc2"&gt;&amp;lt;ez:foo&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-            &lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &lt;span
-            class="sc2"&gt;&amp;lt;f:converter &lt;span class="kw3"&gt;for&lt;/span&gt;=&lt;span
-            class="st0"&gt;&amp;quot;userid&amp;quot;&lt;/span&gt; binding=&lt;span
-            class="st0"&gt;&amp;quot;#{bean.converter}&amp;quot;&lt;/span&gt; /&lt;span
-            class="kw2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-            &lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="sc2"&gt;&lt;span
-            class="kw2"&gt;&amp;lt;&lt;/span&gt;/ez:foo&amp;gt;&lt;/span&gt;
-            &lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;
-
-            &lt;p&gt;Line 2 refers to the
-            &lt;code&gt;&amp;lt;composite:valueHolder&amp;gt;&lt;/code&gt;
-            declaration on
-            line 2 of &lt;code&gt;foo.xhtml&lt;/code&gt;:&lt;/p&gt;
-
-            &lt;div class="syntax"&gt;&lt;div class="html4strict"
-            style="font-family: monospace;"&gt;&lt;ol&gt;&lt;li class="li1"&gt;&lt;div
-            class="de1"&gt;&lt;span class="sc2"&gt;&amp;lt;composite:interface&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-            &lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &lt;span
-            class="sc2"&gt;&amp;lt;composite:valueHolder &lt;span class="kw3"&gt;name&lt;/span&gt;=&lt;span
-            class="st0"&gt;&amp;quot;userid&amp;quot;&lt;/span&gt; /&lt;span
-            class="kw2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-            &lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="sc2"&gt;&lt;span
-            class="kw2"&gt;&amp;lt;&lt;/span&gt;/composite:interface&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-            &lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
-            &lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="sc2"&gt;&amp;lt;composite:implementation&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-            &lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &lt;span
-            class="sc2"&gt;&amp;lt;h:inputText &lt;span class="kw3"&gt;id&lt;/span&gt;=&lt;span
-            class="st0"&gt;&amp;quot;userid&amp;quot;&lt;/span&gt; /&lt;span
-            class="kw2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-            &lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="sc2"&gt;&lt;span
-            class="kw2"&gt;&amp;lt;&lt;/span&gt;/composite:implementation&amp;gt;&lt;/span&gt;
-            &lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;
-
-            &lt;p&gt;&lt;/p&gt;
-
-            &lt;p&gt;It is possible to declare that a single
-            &lt;code&gt;&amp;lt;composite:valueHolder&amp;gt;&lt;/code&gt;
-            element should cause multiple
-            components within the &lt;code&gt;&amp;lt;composite:implementation&amp;gt;&lt;/code&gt;
-            section to be the targets of an &lt;em&gt;attached object&lt;/em&gt;
-            in the
-            using page. Assuming the same &lt;em&gt;using page&lt;/em&gt;
-            excerpt as
-            above, the revised &lt;em&gt;PDL page&lt;/em&gt; is:&lt;/p&gt;
-
-            &lt;div class="syntax"&gt;&lt;div class="html4strict"
-            style="font-family: monospace;"&gt;&lt;ol&gt;&lt;li class="li1"&gt;&lt;div
-            class="de1"&gt;&lt;span class="sc2"&gt;&amp;lt;composite:interface&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-            &lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &lt;span
-            class="sc2"&gt;&amp;lt;composite:valueHolder targets=&lt;span
-            class="st0"&gt;&amp;quot;userid,password&amp;quot;&lt;/span&gt; /&lt;span
-            class="kw2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-            &lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="sc2"&gt;&lt;span
-            class="kw2"&gt;&amp;lt;&lt;/span&gt;/composite:interface&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-            &lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
-            &lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="sc2"&gt;&amp;lt;composite:implementation&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-            &lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &lt;span
-            class="sc2"&gt;&amp;lt;h:inputText &lt;span class="kw3"&gt;id&lt;/span&gt;=&lt;span
-            class="st0"&gt;&amp;quot;userid&amp;quot;&lt;/span&gt; /&lt;span
-            class="kw2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-            &lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &lt;span
-            class="sc2"&gt;&amp;lt;h:inputText &lt;span class="kw3"&gt;id&lt;/span&gt;=&lt;span
-            class="st0"&gt;&amp;quot;password&amp;quot;&lt;/span&gt; /&lt;span
-            class="kw2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-            &lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="sc2"&gt;&lt;span
-            class="kw2"&gt;&amp;lt;&lt;/span&gt;/composite:implementation&amp;gt;&lt;/span&gt;
-            &lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;
-
-            &lt;p&gt;In this case, the "targets" attribute on the
-            &lt;code&gt;&amp;lt;composite:valueHolder&amp;gt;&lt;/code&gt;
-            element, on line 2 above,
-            replaces the "name" attribute in the previous example. "targets" is
-            a
-            list of ids of client ids (relative to the &lt;em&gt;top level
-            component&lt;/em&gt;)
-            within the &lt;code&gt;&amp;lt;composite:implementation&amp;gt;&lt;/code&gt;
-            section. In
-            this case, "targets" refers to the &lt;code&gt;&amp;lt;h:inputText&amp;gt;&lt;/code&gt;
-            components on lines 6 and 7 above.&lt;/p&gt;
-
-            &lt;p&gt;Please see &lt;code&gt;&amp;lt;&lt;a
-            href="interface.html"&gt;composite:interface&lt;/a&gt;&amp;gt;&lt;/code&gt;
-            for a usage
-            example.&lt;/p&gt;
-
-            &lt;/div&gt;
-        </description>
-        <tag-name>valueHolder</tag-name>
-        <handler-class>com.sun.faces.facelets.tag.composite.ValueHolderAttachedObjectTargetHandler</handler-class>
-        <attribute>
-            <description>
-
-
-                &lt;div class="changed_added_2_0"&gt;
-                &lt;p&gt;
-                The value of this attribute maps back to the "for" attribute on
-                an attachable object
-                nested within a composite component. If the "targets" attribute
-                is not specified,
-                this value also represents the component ID of the target
-                component within the
-                that the &lt;code&gt;&amp;lt;composite:implementation&amp;gt;&lt;/code&gt;
-                ActionListener should be mapped to.
-                &lt;/p&gt;
-                &lt;/div&gt;
-
-            </description>
-            <name>name</name>
-            <required>true</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-
-
-                &lt;div class="changed_added_2_0"&gt;
-                &lt;p&gt;If present, this must be a space (not tab) separated
-                list of client
-                ids (relative to the &lt;em&gt;top level component&lt;/em&gt;)
-                of components within
-                the &lt;code&gt;&amp;lt;composite:implementation&amp;gt;&lt;/code&gt;
-                section. Space is
-                used as the delimiter for compatibility with the IDREFS and
-                NMTOKENS
-                data types from the XML Schema. &lt;/p&gt;&lt;/div&gt;
-
-            </description>
-            <name>targets</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-    </tag>
-    <tag>
-        <description>
-
-
-            &lt;div class="changed_added_2_0"&gt;
-            &lt;p&gt;Declares that the composite component whose
-            contract is declared by the
-            &lt;code&gt;&amp;lt;composite:interface&amp;gt;&lt;/code&gt; in
-            which this
-            element is nested exposes an implementation of
-            &lt;code&gt;EditableValueHolder&lt;/code&gt; suitable for use as the
-            target of &lt;em&gt;attached objects&lt;/em&gt; in &lt;em&gt;the
-            using
-            page&lt;/em&gt;. Any attached objects suitable for
-            implementations of &lt;code&gt;EditableValueHolder&lt;/code&gt; may
-            be
-            attached to the composite component.The example from &lt;a
-            href="valueHolder.html"&gt;&lt;code&gt;&amp;lt;composite:valueHolder&amp;gt;&lt;/code&gt;&lt;/a&gt;
-            still applies.
-            &lt;/p&gt;
-
-            &lt;p&gt;Please see &lt;code&gt;&amp;lt;&lt;a
-            href="interface.html"&gt;composite:interface&lt;/a&gt;&amp;gt;&lt;/code&gt;
-            for a usage
-            example.&lt;/p&gt;
-
-            &lt;/div&gt;
-        </description>
-        <tag-name>editableValueHolder</tag-name>
-        <handler-class>com.sun.faces.facelets.tag.composite.EditableValueHolderAttachedObjectTargetHandler</handler-class>
-        <attribute>
-            <description>
-
-
-                &lt;div class="changed_added_2_0"&gt;
-                &lt;p&gt;
-                The value of this attribute maps back to the "for" attribute on
-                an attachable object
-                nested within a composite component. If the "targets" attribute
-                is not specified,
-                this value also represents the component ID of the target
-                component within the
-                that the &lt;code&gt;&amp;lt;composite:implementation&amp;gt;&lt;/code&gt;
-                ActionListener should be mapped to.
-                &lt;/p&gt;
-                &lt;/div&gt;
-
-            </description>
-            <name>name</name>
-            <required>true</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-
-
-                &lt;div class="changed_added_2_0"&gt;
-                &lt;p&gt;If present, this must be a space (not tab) separated
-                list of client
-                ids (relative to the &lt;em&gt;top level component&lt;/em&gt;)
-                of components within
-                the &lt;code&gt;&amp;lt;composite:implementation&amp;gt;&lt;/code&gt;
-                section. Space is
-                used as the delimiter for compatibility with the IDREFS and
-                NMTOKENS
-                data types from the XML Schema.&lt;/p&gt;&lt;/div&gt;
-
-            </description>
-            <name>targets</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-    </tag>
-    <tag>
-        <description>
-
-
-            &lt;div class="changed_added_2_0"&gt;
-            &lt;p&gt;Declares that the composite component whose
-            contract is declared by the
-            &lt;code&gt;&amp;lt;composite:interface&amp;gt;&lt;/code&gt; in
-            which this
-            element is nested exposes an implementation of
-            &lt;code&gt;ActionSource2&lt;/code&gt; suitable for use as the
-            target of
-            &lt;em&gt;attached objects&lt;/em&gt; in &lt;em&gt;the using page&lt;/em&gt;.
-            Any attached objects suitable for implementations of
-            &lt;code&gt;ActionSource2&lt;/code&gt; may be attached to the
-            composite
-            component. Consider this excerpt from &lt;em&gt;the using
-            page&lt;/em&gt;:
-            &lt;/p&gt;
-
-            &lt;div class="syntax"&gt;&lt;div class="html4strict"
-            style="font-family: monospace;"&gt;&lt;ol&gt;&lt;li class="li1"&gt;&lt;div
-            class="de1"&gt;&lt;span class="sc2"&gt;&amp;lt;ez:loginPanel &lt;span
-            class="kw3"&gt;id&lt;/span&gt;=&lt;span class="st0"&gt;&amp;quot;loginPanel&amp;quot;&lt;/span&gt;
-            model=&lt;span class="st0"&gt;&amp;quot;#{bean}&amp;quot;&lt;/span&gt;&lt;span
-            class="kw2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-            &lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &lt;span
-            class="sc2"&gt;&amp;lt;f:valueChangeListener &lt;span class="kw3"&gt;for&lt;/span&gt;=&lt;span
-            class="st0"&gt;&amp;quot;username&amp;quot;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-            &lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp;
-            &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
-            &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;
-            &amp;nbsp; binding=&lt;span class="st0"&gt;&amp;quot;#{bean.useridValueChangeListener}&amp;quot;&lt;/span&gt;
-            /&lt;span class="kw2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-            &lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &lt;span
-            class="sc2"&gt;&amp;lt;f:actionListener &lt;span class="kw3"&gt;for&lt;/span&gt;=&lt;span
-            class="st0"&gt;&amp;quot;loginEvent&amp;quot;&lt;/span&gt; &lt;/div&gt;&lt;/li&gt;
-            &lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp;
-            &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
-            &amp;nbsp; &amp;nbsp; binding=&lt;span class="st0"&gt;&amp;quot;#{bean.loginEventListener}&amp;quot;&lt;/span&gt;
-            /&lt;span class="kw2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-            &lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
-            &lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &lt;span
-            class="sc2"&gt;&amp;lt;f:actionListener &lt;span class="kw3"&gt;for&lt;/span&gt;=&lt;span
-            class="st0"&gt;&amp;quot;cancelEvent&amp;quot;&lt;/span&gt; &lt;/div&gt;&lt;/li&gt;
-            &lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp;
-            &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
-            &amp;nbsp; &amp;nbsp; binding=&lt;span class="st0"&gt;&amp;quot;#{bean.cancelEventListener}&amp;quot;&lt;/span&gt;
-            /&lt;span class="kw2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-            &lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
-            &lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &lt;span
-            class="sc2"&gt;&amp;lt;f:actionListener &lt;span class="kw3"&gt;for&lt;/span&gt;=&lt;span
-            class="st0"&gt;&amp;quot;allEvents&amp;quot;&lt;/span&gt; &lt;/div&gt;&lt;/li&gt;
-            &lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp;
-            &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
-            &amp;nbsp; &amp;nbsp; binding=&lt;span class="st0"&gt;&amp;quot;#{bean.allEventsListener}&amp;quot;&lt;/span&gt;
-            /&lt;span class="kw2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-            &lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
-            &lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="sc2"&gt;&lt;span
-            class="kw2"&gt;&amp;lt;&lt;/span&gt;/ez:loginPanel&amp;gt;&lt;/span&gt;
-            &lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;
-
-            &lt;p&gt;The &lt;code&gt;&amp;lt;f:actionListener&amp;gt;&lt;/code&gt;
-            elements on lines 4, 7, and 10
-            refer to the &lt;em&gt;attached objects&lt;/em&gt; declared on lines
-            2, 3 and 4 below.&lt;/p&gt;
-
-            &lt;div class="syntax"&gt;&lt;div class="html4strict"
-            style="font-family: monospace;"&gt;&lt;ol&gt;&lt;li class="li1"&gt;&lt;div
-            class="de1"&gt;&lt;span class="sc2"&gt;&amp;lt;composite:interface
-            &lt;span class="kw3"&gt;name&lt;/span&gt;=&lt;span class="st0"&gt;&amp;quot;loginPanel&amp;quot;&lt;/span&gt;&lt;span
-            class="kw2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-            &lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &lt;span
-            class="sc2"&gt;&amp;lt;composite:actionSource &lt;span class="kw3"&gt;name&lt;/span&gt;=&lt;span
-            class="st0"&gt;&amp;quot;loginEvent&amp;quot;&lt;/span&gt; /&lt;span
-            class="kw2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-            &lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &lt;span
-            class="sc2"&gt;&amp;lt;composite:actionSource &lt;span class="kw3"&gt;name&lt;/span&gt;=&lt;span
-            class="st0"&gt;&amp;quot;cancelEvent&amp;quot;&lt;/span&gt; /&lt;span
-            class="kw2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-            &lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &lt;span
-            class="sc2"&gt;&amp;lt;composite:actionSource &lt;span class="kw3"&gt;name&lt;/span&gt;=&lt;span
-            class="st0"&gt;&amp;quot;allEvents&amp;quot;&lt;/span&gt; targets=&lt;span
-            class="st0"&gt;&amp;quot;loginEvent,cancelEvent&amp;quot;&lt;/span&gt;
-            /&lt;span class="kw2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-            &lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="sc2"&gt;&lt;span
-            class="kw2"&gt;&amp;lt;&lt;/span&gt;/composite:interface&amp;gt;&lt;/span&gt;
-            &lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;
-
-            &lt;p&gt;Most of the concepts from example content from &lt;a
-            href="valueHolder.html"&gt;&lt;code&gt;&amp;lt;composite:valueHolder&amp;gt;&lt;/code&gt;&lt;/a&gt;
-            also applies in the case of
-            &lt;code&gt;&amp;lt;composite:actionSource&amp;gt;&lt;/code&gt;.&lt;/p&gt;
-
-            &lt;p&gt;Please see &lt;code&gt;&amp;lt;&lt;a
-            href="interface.html"&gt;composite:interface&lt;/a&gt;&amp;gt;&lt;/code&gt;
-            for a usage
-            example.&lt;/p&gt;
-
-
-            &lt;/div&gt;
-        </description>
-        <tag-name>actionSource</tag-name>
-        <handler-class>com.sun.faces.facelets.tag.composite.ActionSource2AttachedObjectTargetHandler</handler-class>
-        <attribute>
-            <description>
-
-
-                &lt;div class="changed_added_2_0"&gt;
-                &lt;p&gt;
-                The value of this attribute maps back to the "for" attribute on
-                an attachable object
-                nested within a composite component. If the "targets" attribute
-                is not specified,
-                this value also represents the component ID of the target
-                component within the
-                that the &lt;code&gt;&amp;lt;composite:implementation&amp;gt;&lt;/code&gt;
-                ActionListener should be mapped to.
-                &lt;/p&gt;
-                &lt;/div&gt;
-
-            </description>
-            <name>name</name>
-            <required>true</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-
-
-                &lt;div class="changed_added_2_0"&gt;
-                &lt;p&gt;If present, this must be a space (not tab) separated
-                list of client
-                ids (relative to the &lt;em&gt;top level component&lt;/em&gt;)
-                of components within
-                the &lt;code&gt;&amp;lt;composite:implementation&amp;gt;&lt;/code&gt;
-                section. Space is
-                used as the delimiter for compatibility with the IDREFS and
-                NMTOKENS
-                data types from the XML Schema.&lt;/p&gt;&lt;/div&gt;
-
-            </description>
-            <name>targets</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-    </tag>
-    <tag>
-        <description>
-
-
-            &lt;div class="changed_added_2_0"&gt;
-            &lt;p&gt;Used within a &lt;code&gt;&amp;lt;composite:interface&amp;gt;&lt;/code&gt;
-            section,
-            within any sub-element of that section, to include XML content not
-            defined by this specification. This element can be used to
-            incorporate
-            &lt;a target="_" href="http://jcp.org/en/jsr/detail?id=276"&gt;JSR-276&lt;/a&gt;
-            metadata into a composite component.&lt;/p&gt;
-
-            &lt;/div&gt;
-        </description>
-        <tag-name>extension</tag-name>
-        <handler-class>com.sun.faces.facelets.tag.composite.ExtensionHandler</handler-class>
-    </tag>
-    <tag>
-        <description>
-
-            &lt;div class="changed_added_2_0"&gt;
-
-            &lt;p&gt;The presence of this tag in a
-            &lt;code&gt;&amp;lt;composite:implementation&amp;gt;&lt;/code&gt;
-            section must cause the
-            named facet to be taken from the facet map of the &lt;em&gt;top
-            level
-            component&lt;/em&gt; and inserted as a facet child of the component
-            in which
-            this element is nested.&lt;/p&gt;
-
-            &lt;/div&gt;
-
-        </description>
-        <tag-name>insertFacet</tag-name>
-        <handler-class>com.sun.faces.facelets.tag.composite.InsertFacetHandler</handler-class>
-        <attribute>
-            <description>
-
-                &lt;div class="changed_added_2_0"&gt;
-
-                &lt;p&gt;The name of the facet child on the &lt;em&gt;top level
-                component&lt;/em&gt; which
-                must be inserted as a facet child of the component in which this
-                element
-                is nested.&lt;/p&gt;
-
-                &lt;/div&gt;
-
-            </description>
-            <name>name</name>
-            <required>true</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-
-                &lt;div class="changed_added_2_0"&gt;
-
-                &lt;p&gt;If &lt;code&gt;true&lt;/code&gt;, and there is no such
-                facet present on the top
-                level component, a &lt;code&gt;TagException&lt;/code&gt; must be
-                thrown, containing
-                the &lt;code&gt;Location&lt;/code&gt;, the facet name, and a
-                localized descriptive
-                error message.&lt;/p&gt;
-
-                &lt;/div&gt;
-
-            </description>
-            <name>required</name>
-            <required>false</required>
-            <type>boolean</type>
-        </attribute>
-    </tag>
-</facelet-taglib>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/std-taglibs/facelets_jsf_core.taglib.xml b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/std-taglibs/facelets_jsf_core.taglib.xml
deleted file mode 100644
index 592028c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/std-taglibs/facelets_jsf_core.taglib.xml
+++ /dev/null
@@ -1,2056 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!--
- DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
-
- Copyright 2009 Sun Microsystems, Inc. All rights reserved.
-
- The contents of this file are subject to the terms of either the GNU
- General Public License Version 2 only ("GPL") or the Common Development
- and Distribution License("CDDL") (collectively, the "License").  You
- may not use this file except in compliance with the License. You can obtain
- a copy of the License at https://glassfish.dev.java.net/public/CDDL+GPL.html
- or glassfish/bootstrap/legal/LICENSE.txt.  See the License for the specific
- language governing permissions and limitations under the License.
-
- When distributing the software, include this License Header Notice in each
- file and include the License file at glassfish/bootstrap/legal/LICENSE.txt.
- Sun designates this particular file as subject to the "Classpath" exception
- as provided by Sun in the GPL Version 2 section of the License file that
- accompanied this code.  If applicable, add the following below the License
- Header, with the fields enclosed by brackets [] replaced by your own
- identifying information: "Portions Copyrighted [year]
- [name of copyright owner]"
-
- Contributor(s):
-
- If you wish your version of this file to be governed by only the CDDL or
- only the GPL Version 2, indicate your decision by adding "[Contributor]
- elects to include this software in this distribution under the [CDDL or GPL
- Version 2] license."  If you don't indicate a single choice of license, a
- recipient has the option to distribute your version of this file under
- either the CDDL, the GPL Version 2 or to extend the choice of license to
- its licensees as provided above.  However, if you add GPL Version 2 code
- and therefore, elected the GPL Version 2 license, then the option applies
- only if the new code is made subject to such option by the copyright
- holder.
--->
-
-<facelet-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 http://java.sun.com/xml/ns/javaee/web-facelettaglibrary_2_0.xsd"
-                version="2.0">
-    <description>
-        The core JavaServer Faces custom actions that are independent of
-        any particular RenderKit.
-    </description>
-    <namespace>http://java.sun.com/jsf/core</namespace>
-    <tag>
-        <description>
-
-            &lt;p&gt;Register an ActionListener instance on the
-            UIComponent associated with the closest parent UIComponent
-            custom action.&lt;/p&gt;
-        </description>
-        <tag-name>actionListener</tag-name>
-        <handler-class>com.sun.faces.facelets.tag.jsf.core.ActionListenerHandler</handler-class>
-        <attribute>
-            <description>
-                Fully qualified Java class name of an ActionListener to be
-                created and registered.
-            </description>
-            <name>type</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Value binding expression that evaluates to an object that
-                implements javax.faces.event.ActionListener.
-            </description>
-            <name>binding</name>
-            <required>false</required>
-            <type>javax.faces.event.ActionListener</type>
-        </attribute>
-        <attribute>
-            <description>
-
-                &lt;p class="changed_added_2_0"&gt;If present, this attribute
-                refers
-                to the value of one of the exposed attached objects within the
-                composite component inside of which this tag is nested.&lt;/p&gt;
-
-            </description>
-            <name>for</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-    </tag>
-    <tag>
-        <description>
-            Add an attribute to the UIComponent associated with the closest
-            parent UIComponent custom action.
-        </description>
-        <tag-name>attribute</tag-name>
-        <handler-class>com.sun.faces.facelets.tag.jsf.core.AttributeHandler</handler-class>
-        <attribute>
-            <description>
-                The name of the component attribute to be set.
-            </description>
-            <name>name</name>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                The value of the component attribute to be set.
-            </description>
-            <name>value</name>
-            <type>java.lang.Object</type>
-        </attribute>
-    </tag>
-    <tag>
-        <description>
-            Register a DateTimeConverter instance on the UIComponent associated
-            with the closest parent UIComponent custom action.
-        </description>
-        <tag-name>convertDateTime</tag-name>
-        <converter>
-            <converter-id>javax.faces.DateTime</converter-id>
-            <handler-class>com.sun.faces.facelets.tag.jsf.core.ConvertDateTimeHandler</handler-class>
-        </converter>
-        <attribute>
-            <description>
-                Predefined formatting style which determines how the date
-                component of a date string is to be formatted and parsed.
-                Applied only if type is "date" or "both". Valid values
-                are "default", "short", "medium", "long", and "full".
-                Default value is "default".
-            </description>
-            <name>dateStyle</name>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Locale whose predefined styles for dates and times are used
-                during formatting or parsing. If not specified, the Locale
-                returned by FacesContext.getViewRoot().getLocale() will be used.
-                Value must be either a VB expression that evaluates to a
-                java.util.Locale instance, or a String that is valid to pass as
-                the first argument to the constructor java.util.Locale(String
-                language, String country). The empty string is passed as the
-                second argument.
-            </description>
-            <name>locale</name>
-            <required>false</required>
-            <type>java.lang.Object</type>
-        </attribute>
-        <attribute>
-            <description>
-                Custom formatting pattern which determines how the
-                date/time string should be formatted and parsed.
-            </description>
-            <name>pattern</name>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Predefined formatting style which determines how the
-                time component of a date string is to be formatted and
-                parsed. Applied only if type is "time" or "both".
-                Valid values are "default", "short", "medium", "long",
-                and "full". Default value is "default".
-            </description>
-            <name>timeStyle</name>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Time zone in which to interpret any time information in the date
-                String. Value must be either a VB expression that evaluates to
-                a java.util.TimeZone instance, or a String that is a timezone ID
-                as described in the javadocs for
-                java.util.TimeZone.getTimeZone().
-            </description>
-            <name>timeZone</name>
-            <type>java.lang.Object</type>
-        </attribute>
-        <attribute>
-            <description>
-                Specifies what contents the string value will be
-                formatted to include, or parsed expecting. Valid
-                values are "date", "time", and "both". Default
-                value is "date".
-            </description>
-            <name>type</name>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                A ValueExpression that evaluates to an instance of
-                javax.faces.convert.DateTimeConverter.
-            </description>
-            <name>binding</name>
-            <type>javax.faces.convert.DateTimeConverter</type>
-        </attribute>
-        <attribute>
-            <description>
-
-                &lt;p class="changed_added_2_0"&gt;If present, this attribute
-                refers
-                to the value of one of the exposed attached objects within the
-                composite component inside of which this tag is nested.&lt;/p&gt;
-
-            </description>
-            <name>for</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-    </tag>
-    <tag>
-        <description>
-            Register a NumberConverter instance on the UIComponent associated
-            with the closest parent UIComponent custom action.
-        </description>
-        <tag-name>convertNumber</tag-name>
-         <converter>
-            <converter-id>javax.faces.Number</converter-id>
-            <handler-class>com.sun.faces.facelets.tag.jsf.core.ConvertNumberHandler</handler-class>
-        </converter>
-        <attribute>
-            <description>
-                ISO 4217 currency code, applied only when
-                formatting currencies.
-            </description>
-            <name>currencyCode</name>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Currency symbol, applied only when formatting
-                currencies.
-            </description>
-            <name>currencySymbol</name>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Flag specifying whether formatted output will
-                contain grouping separators. Expressions must
-                evaluate to a boolean. Default value
-                is true.
-            </description>
-            <name>groupingUsed</name>
-            <type>java.lang.Boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-                Flag specifying whether only the integer part
-                of the value will be formatted and parsed.
-                Expressions must evaluate to a boolean.
-                Default value is false.
-            </description>
-            <name>integerOnly</name>
-            <type>java.lang.Boolean</type>
-        </attribute>
-        <attribute>
-            <description>&lt;p&gt;
-
-                &lt;span class="changed_modified_2_0"&gt;Locale&lt;/span&gt;
-                whose
-                predefined styles for numbers are used during formatting
-                and parsing. If not specified, the Locale returned by
-                FacesContext.getViewRoot().getLocale() will be used.
-                Expressions must evaluate to a java.util.Locale &lt;span
-                class="changed_modified_2_0"&gt;or a String that is valid to
-                pass as the first argument to the constructor
-                java.util.Locale(String language, String country). The
-                empty string is passed as the second argument.&lt;/span&gt;
-
-                &lt;/p&gt;</description>
-            <name>locale</name>
-            <type>java.lang.Object</type>
-        </attribute>
-        <attribute>
-            <description>
-                Maximum number of digits that will be formatted
-                in the fractional portion of the output. Expressions
-                must evaluate to an int.
-            </description>
-            <name>maxFractionDigits</name>
-            <type>java.lang.Integer</type>
-        </attribute>
-        <attribute>
-            <description>
-                Maximum number of digits that will be formatted
-                in the integer portion of the output. Expressions
-                must evaluate to an int.
-            </description>
-            <name>maxIntegerDigits</name>
-            <type>java.lang.Integer</type>
-        </attribute>
-        <attribute>
-            <description>
-                Minimum number of digits that will be formatted
-                in the fractional portion of the output. Expressions
-                must evaluate to an int.
-            </description>
-            <name>minFractionDigits</name>
-            <type>java.lang.Integer</type>
-        </attribute>
-        <attribute>
-            <description>
-                Minimum number of digits that will be formatted
-                in the integer portion of the output. Expressions
-                must evaluate to an int.
-            </description>
-            <name>minIntegerDigits</name>
-            <type>java.lang.Integer</type>
-        </attribute>
-        <attribute>
-            <description>
-                Custom formatting pattern which determins how the
-                number string should be formatted and parsed.
-            </description>
-            <name>pattern</name>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Specifies how the number string will be formatted
-                and parsed. Valid values are "number", "currency",
-                and "percent". Default value is "number".
-            </description>
-            <name>type</name>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                A ValueExpression that evaluates to an instance of
-                javax.faces.convert.NumberConverter.
-            </description>
-            <name>binding</name>
-            <type>javax.faces.convert.NumberConverter</type>
-        </attribute>
-        <attribute>
-            <description>
-
-                &lt;p class="changed_added_2_0"&gt;If present, this attribute
-                refers
-                to the value of one of the exposed attached objects within the
-                composite component inside of which this tag is nested.&lt;/p&gt;
-
-            </description>
-            <name>for</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-    </tag>
-    <tag>
-        <description>
-            Register a named Converter instance on the UIComponent
-            associated with the closest parent UIComponent custom action.
-        </description>
-        <tag-name>converter</tag-name>
-        <handler-class>com.sun.faces.facelets.tag.jsf.core.ConvertDelegateHandler</handler-class>
-        <attribute>
-            <description>
-                Converter identifier of the Converter instance to be
-                created and registered.
-            </description>
-            <name>converterId</name>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                A ValueExpression that evaluates to an object that
-                implements javax.faces.convert.Converter.
-            </description>
-            <name>binding</name>
-            <type>javax.faces.convert.Converter</type>
-        </attribute>
-        <attribute>
-            <description>
-
-                &lt;p class="changed_added_2_0"&gt;If present, this attribute
-                refers
-                to the value of one of the exposed attached objects within the
-                composite component inside of which this tag is nested.&lt;/p&gt;
-
-            </description>
-            <name>for</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-    </tag>
-    <tag>
-        <description>
-
-            &lt;p class="changed_added_2_0"&gt;Register an AjaxBehavior instance
-            on one or more
-            UIComponents implementing the ClientBehaviorHolder interface. This
-            tag
-            may be nested witin a single component (enabling Ajax for a single
-            component),
-            or it may be "wrapped" around multiple components (enabling Ajax for
-            many components).&lt;/p&gt;
-
-        </description>
-        <tag-name>ajax</tag-name>
-        <handler-class>com.sun.faces.facelets.tag.jsf.core.AjaxHandler</handler-class>
-        <attribute>
-            <description>
-                &lt;p class="changed_added_2_0"&gt;A value of "true" indicates
-                the
-                AjaxBehavior should not be rendered. A value of "false"
-                indicates
-                the AjaxBehavior should be rendered. "false" is the default.&lt;/p&gt;
-
-            </description>
-            <name>disabled</name>
-            <required>false</required>
-            <type>java.lang.Boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-                &lt;p class="changed_added_2_0"&gt;A String identifying the type
-                of event
-                the Ajax action will apply to. If specified, it must be one of
-                the
-                events supported by the component the Ajax behavior is being
-                applied to.
-                For HTML components this would be the set of supported DOM
-                events for the
-                component, plus "action" for Faces ActionSource components and
-                "valueChange"
-                for Faces EditableValueHolder components. If not specified, the
-                default
-                event is determined for the component. The DOM event name is the
-                actual DOM
-                event name (for example: "click") as opposed to (for example:
-                "onclick").&lt;/p&gt;
-
-            </description>
-            <name>event</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                &lt;p class="changed_added_2_0"&gt;Evaluates to Collection&lt;String&gt;.
-                Identifiers of
-                components that will participate in the "execute" portion of the
-                Request
-                Processing Lifecycle. If a literal is specified the identifiers
-                must be space
-                delimited. Any of the keywords "@this", "@form", "@all", "@none"
-                may be specified
-                in the identifier list.&lt;/p&gt;
-
-            </description>
-            <name>execute</name>
-            <required>false</required>
-            <type>java.lang.Object</type>
-        </attribute>
-        <attribute>
-            <description>
-                &lt;p class="changed_added_2_0"&gt;If "true" behavior events
-                generated from this behavior
-                are broadcast during Apply Request Values phase. Otherwise, the
-                events will be
-                broadcast during Invoke Aplications phase&lt;/p&gt;
-
-            </description>
-            <name>immediate</name>
-            <required>false</required>
-            <type>java.lang.Boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-                &lt;p class="changed_added_2_0"&gt;Method expression referencing
-                a method
-                that will be called when an AjaxBehaviorEvent has been
-                broadcast for the listener.&lt;/p&gt;
-
-            </description>
-            <name>listener</name>
-            <required>false</required>
-            <method-signature>public void
-                processAjaxBehavior(javax.faces.event.AjaxBehaviorEvent event)
-                throws javax.faces.event.AbortProcessingException
-            </method-signature>
-        </attribute>
-        <attribute>
-            <description>
-                &lt;p class="changed_added_2_0"&gt;The name of the JavaScript
-                function that will handle UI events.&lt;/p&gt;
-
-            </description>
-            <name>onevent</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                &lt;p class="changed_added_2_0"&gt;The name of the JavaScript
-                function that will handle errors.&lt;/p&gt;
-
-            </description>
-            <name>oneerror</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                &lt;p class="changed_added_2_0"&gt;Evaluates to Collection&lt;String&gt;.
-                Identifiers of
-                components that will participate in the "render" portion of the
-                Request
-                Processing Lifecycle. If a literal is specified the identifiers
-                must be space
-                delimited. Any of the keywords "@this", "@form", "@all", "@none"
-                may be specified
-                in the identifier list.&lt;/p&gt;
-
-            </description>
-            <name>render</name>
-            <required>false</required>
-            <type>java.lang.Object</type>
-        </attribute>
-    </tag>
-    <tag>
-        <description>
-
-            &lt;p class="changed_added_2_0"&gt;Allow JSF page authors to
-            install &lt;code&gt;ComponentSystemEventListener&lt;/code&gt;
-            instances
-            on a component in a page.&lt;/p&gt;
-
-            &lt;div class="changed_added_2_0"&gt;
-
-            &lt;p&gt;&lt;/p&gt;
-
-            &lt;/div&gt;
-
-        </description>
-        <tag-name>event</tag-name>
-        <handler-class>com.sun.faces.facelets.tag.jsf.core.EventHandler</handler-class>
-        <attribute>
-            <description>
-
-                &lt;p class="changed_added_2_0"&gt;Name of the event for which
-                to install a listener. The following table lists the
-                valid values for this attribute, and the corresponding
-                event type for which the listener action is
-                registered.&lt;/p&gt;
-
-                &lt;table border="1"&gt;
-                &lt;tr&gt;
-
-                &lt;th&gt;value for "&lt;code&gt;type&lt;/code&gt;" tag
-                attribute&lt;/th&gt;
-
-                &lt;th&gt;Type of event sent to listener method
-                &lt;/th&gt;
-
-                &lt;/tr&gt;
-
-                &lt;tr&gt;
-
-                &lt;td&gt;preRenderComponent
-                &lt;/td&gt;
-
-                &lt;td&gt;javax.faces.event.PreRenderComponentEvent
-                &lt;/td&gt;
-
-                &lt;/tr&gt;
-
-                &lt;tr&gt;
-
-                &lt;td&gt;PostAddToView
-                &lt;/td&gt;
-
-                &lt;td&gt;javax.faces.event.PostAddToViewEvent
-                &lt;/td&gt;
-
-                &lt;/tr&gt;
-
-                &lt;tr&gt;
-
-                &lt;td&gt;preValidate
-                &lt;/td&gt;
-
-                &lt;td&gt;javax.faces.event.PreValidateEvent
-                &lt;/td&gt;
-
-                &lt;/tr&gt;
-
-                &lt;tr&gt;
-
-                &lt;td&gt;postValidate
-                &lt;/td&gt;
-
-                &lt;td&gt;javax.faces.event.PostValidateEvent
-                &lt;/td&gt;
-
-                &lt;/tr&gt;
-
-                &lt;/table&gt;
-
-                &lt;div class="changed_added_2_0"&gt;
-
-                &lt;p&gt;In addition to these values, the fully qualified class
-                name of any
-                java class that extends
-                &lt;code&gt;javax.faces.event.ComponentSystemEvent&lt;/code&gt;
-                may be used as the
-                value of the "type" attribute.&lt;/p&gt;
-
-                &lt;p&gt;Also, the &lt;code&gt;@javax.faces.event.NamedEvent&lt;/code&gt;
-                annotation may
-                be attached to any java class that extends
-                &lt;code&gt;javax.faces.event.ComponentSystemEvent&lt;/code&gt;.
-                This enables that
-                event to be referenced from this attribute, as descibed in the
-                javadocs
-                for &lt;code&gt;@NamedEvent&lt;/code&gt;.&lt;/p&gt;
-
-                &lt;/div&gt;
-
-
-            </description>
-            <name>type</name>
-            <required>true</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                MethodExpression pointing to a method expression of
-                that will be called when the listener's processEvent
-                method would have been called.
-            </description>
-            <name>listener</name>
-            <required>true</required>
-            <method-signature>public void
-                listener(javax.faces.event.ComponentSystemEvent event) throws
-                javax.faces.event.AbortProcessingException
-            </method-signature>
-        </attribute>
-    </tag>
-    <tag>
-        <description>
-
-            &lt;p&gt;Register a named facet on the UIComponent associated with
-            the closest parent UIComponent custom action.&lt;/p&gt;
-
-
-        </description>
-        <tag-name>facet</tag-name>
-        <handler-class>com.sun.faces.facelets.tag.jsf.core.FacetHandler</handler-class>
-        <attribute>
-            <description>
-                Name of the facet to be created.
-            </description>
-            <name>name</name>
-            <required>true</required>
-            <type>java.lang.String</type>
-        </attribute>
-    </tag>
-    <tag>
-        <description>
-
-            &lt;p class="changed_added_2_0"&gt;Declare the metadata facet for
-            this view. This must be a child of the
-            &lt;code&gt;&amp;lt;f:view&amp;gt;&lt;/code&gt;. This tag must
-            reside within the
-            top level XHTML file for the given viewId, not in a
-            template. The implementation must insure that the direct
-            child of the facet is a &lt;code&gt;UIPanel&lt;/code&gt;, even if
-            there
-            is only one child of the facet. The implementation must set
-            the id of the &lt;code&gt;UIPanel&lt;/code&gt; to be the value of
-            the
-            &lt;code&gt;UIViewRoot.METADATA_FACET_NAME&lt;/code&gt; symbolic
-            constant.&lt;/p&gt;
-
-            &lt;div class="changed_added_2_0"&gt;
-
-            &lt;p&gt;The implementation must allow templating for this element
-            according
-            to the following pattern.&lt;/p&gt;
-
-            &lt;p&gt;viewId XHTML page, page01.xhtml&lt;/p&gt;
-
-            &lt;/div&gt;
-
-            &lt;div class="html4strict" style="font-family: monospace;"&gt;&lt;ol&gt;&lt;li
-            class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="sc2"&gt;&amp;lt;ui:composition
-            template=&lt;span class="st0"&gt;&amp;quot;template.xhtml&amp;quot;&lt;/span&gt;&lt;span
-            class="kw2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-            &lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp;
-            &lt;span class="sc2"&gt;&amp;lt;ui:define &lt;span class="kw3"&gt;name&lt;/span&gt;=&lt;span
-            class="st0"&gt;&amp;quot;metadata&amp;quot;&lt;/span&gt;&lt;span
-            class="kw2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-            &lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp;
-            &amp;nbsp; &lt;span class="sc2"&gt;&amp;lt;f:metadata&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-            &lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp;
-            &amp;nbsp; &amp;nbsp; &lt;span class="sc2"&gt;&amp;lt;f:viewParam
-            &lt;span class="kw3"&gt;name&lt;/span&gt;=&lt;span class="st0"&gt;&amp;quot;id&amp;quot;&lt;/span&gt;/&lt;span
-            class="kw2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-            &lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp;
-            &amp;nbsp; &lt;span class="sc2"&gt;&lt;span class="kw2"&gt;&amp;lt;&lt;/span&gt;/f:metadata&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-            &lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp;
-            &lt;span class="sc2"&gt;&lt;span class="kw2"&gt;&amp;lt;&lt;/span&gt;/ui:define&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-            &lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp;
-            &lt;span class="sc2"&gt;&amp;lt;ui:define &lt;span class="kw3"&gt;name&lt;/span&gt;=&lt;span
-            class="st0"&gt;&amp;quot;content&amp;quot;&lt;/span&gt;&lt;span
-            class="kw2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-            &lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp;
-            &amp;nbsp; &amp;nbsp; &lt;span class="sc2"&gt;&lt;span class="kw2"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;&lt;/span&gt;The
-            big news stories of the day&lt;span class="sc2"&gt;&lt;span
-            class="kw2"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-            &lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp;
-            &lt;span class="sc2"&gt;&lt;span class="kw2"&gt;&amp;lt;&lt;/span&gt;/ui:define&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-            &lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="sc2"&gt;&lt;span
-            class="kw2"&gt;&amp;lt;&lt;/span&gt;/ui:composition&amp;gt;&lt;/span&gt;
-            &lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;
-
-            &lt;div class="changed_added_2_0"&gt;
-            &lt;p&gt;Note line 4. The page author must ensure that the
-            &lt;code&gt;&amp;lt;f:metadata&amp;gt;&lt;/code&gt; element does not
-            appear on a template or
-            included page. It must reside on the root page that corresponds to
-            the
-            viewId.&lt;/p&gt;
-
-            &lt;p&gt;The template page, template.xhtml&lt;/p&gt;
-
-            &lt;/div&gt;
-
-
-            &lt;div class="html4strict" style="font-family: monospace;"&gt;&lt;ol&gt;&lt;li
-            class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="sc2"&gt;&lt;span
-            class="kw2"&gt;&amp;lt;html&lt;/span&gt; xmlns=&lt;span class="st0"&gt;&amp;quot;http://www.w3.org/1999/xhtml&amp;quot;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-            &lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp;
-            &amp;nbsp; xmlns:ui=&lt;span class="st0"&gt;&amp;quot;http://java.sun.com/jsf/facelets&amp;quot;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-            &lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp;
-            &amp;nbsp; xmlns:f=&lt;span class="st0"&gt;&amp;quot;http://java.sun.com/jsf/core&amp;quot;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-            &lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp;
-            &amp;nbsp; xml:&lt;span class="kw3"&gt;lang&lt;/span&gt;=&lt;span
-            class="st0"&gt;&amp;quot;en&amp;quot;&lt;/span&gt; &lt;span
-            class="kw3"&gt;lang&lt;/span&gt;=&lt;span class="st0"&gt;&amp;quot;en&amp;quot;&lt;/span&gt;&lt;span
-            class="kw2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-            &lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
-            &lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="sc2"&gt;&lt;span
-            class="kw2"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-            &lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="sc2"&gt;&amp;lt;f:view&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-            &lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp;
-            &lt;/div&gt;&lt;/li&gt;
-            &lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp;
-            &amp;nbsp; &amp;nbsp; &lt;span class="sc2"&gt;&amp;lt;ui:insert &lt;span
-            class="kw3"&gt;name&lt;/span&gt;=&lt;span class="st0"&gt;&amp;quot;metadata&amp;quot;&lt;/span&gt;/&lt;span
-            class="kw2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-            &lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp;&lt;/div&gt;&lt;/li&gt;
-            &lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp;
-            &lt;span class="sc2"&gt;&lt;span class="kw2"&gt;&amp;lt;div&lt;/span&gt;
-            &lt;span class="kw3"&gt;id&lt;/span&gt;=&lt;span class="st0"&gt;&amp;quot;container&amp;quot;&lt;/span&gt;&lt;span
-            class="kw2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-            &lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp;
-            &amp;nbsp; &amp;nbsp; &lt;span class="sc2"&gt;&amp;lt;ui:insert &lt;span
-            class="kw3"&gt;name&lt;/span&gt;=&lt;span class="st0"&gt;&amp;quot;content&amp;quot;&lt;/span&gt;/&lt;span
-            class="kw2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-            &lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp;
-            &lt;span class="sc2"&gt;&lt;span class="kw2"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-            &lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="sc2"&gt;&lt;span
-            class="kw2"&gt;&amp;lt;&lt;/span&gt;/f:view&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-            &lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="sc2"&gt;&lt;span
-            class="kw2"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-            &lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="sc2"&gt;&lt;span
-            class="kw2"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;&lt;/span&gt; &lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;
-
-            &lt;p&gt;The page author is not &lt;em&gt;required&lt;/em&gt; to use
-            templating, but if
-            they do, it must be done as shown above, (or with
-            &lt;code&gt;&amp;lt;ui:include&amp;gt;&lt;/code&gt; in a similar
-            manner).&lt;/p&gt;
-
-            &lt;/div&gt;
-
-
-        </description>
-        <tag-name>metadata</tag-name>
-        <handler-class>com.sun.faces.facelets.tag.jsf.core.MetadataHandler</handler-class>
-    </tag>
-    <tag>
-        <description>
-            Load a resource bundle localized for the Locale of the current
-            view, and expose it as a java.util.Map in the request attributes
-            of the current request under the key specified by the value of the
-            "var" attribute of this tag. The Map must behave such that if a
-            get() call is made for a key that does not exist in the Map, the
-            literal string ???KEY??? is returned from the Map, where KEY is
-            the key being looked up in the Map, instead of a
-            MissingResourceException being thrown. If the ResourceBundle does
-            not exist, a JspException must be thrown.
-        </description>
-        <tag-name>loadBundle</tag-name>
-        <handler-class>com.sun.faces.facelets.tag.jsf.core.LoadBundleHandler</handler-class>
-        <attribute>
-            <description>
-                Base name of the resource bundle
-                to be loaded.
-            </description>
-            <name>basename</name>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Name of a request scope attribute under which
-                the resource bundle will be exposed as a Map.
-            </description>
-            <name>var</name>
-            <required>true</required>
-            <type>java.lang.String</type>
-        </attribute>
-    </tag>
-    <tag>
-        <description>
-            Add a child UIParameter component to the UIComponent
-            associated with the closest parent UIComponent custom
-            action.
-        </description>
-        <tag-name>param</tag-name>
-        <component>
-            <component-type>javax.faces.Parameter</component-type>
-            <renderer-type/>
-        </component>
-        <attribute>
-            <description>
-                ValueExpression to a backing bean
-                property bound to the component instance for
-                the UIComponent created by this custom action.
-            </description>
-            <name>binding</name>
-            <type>javax.faces.component.UIComponent</type>
-        </attribute>
-        <attribute>
-            <description>
-                Component identifier of the UIParameter component
-                to be created.
-            </description>
-            <name>id</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Name of the parameter to be created.
-            </description>
-            <name>name</name>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Value of the parameter to be set.
-            </description>
-            <name>value</name>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                RELEASE_PENDING
-                - Also update spec for bookmarkable URL (don't forget the two
-                sources for include-view-params).
-                - convey precendence feature using non-normative language
-                vs algorithmic
-                Flag enabling or disabling the inclusion of the parameter
-            </description>
-            <name>disable</name>
-            <type>boolean</type>
-        </attribute>
-    </tag>
-    <tag>
-        <description>
-
-            &lt;p class="changed_added_2_0"&gt;Used inside of the metada facet
-            of a view, this tag causes a &lt;a target="_"
-            href="../../../javadocs/javax/faces/component/UIViewParameter.html"&gt;UIViewParameter&lt;/a&gt;
-            to be attached as metadata for the current view. Because
-            &lt;code&gt;UIViewParameter&lt;/code&gt; extends &lt;code&gt;UIInput&lt;/code&gt;
-            all of the attributes and nested child content for any
-            &lt;code&gt;UIInput&lt;/code&gt; tags are valid on this tag as well.&lt;/p&gt;
-
-        </description>
-        <tag-name>viewParam</tag-name>
-        <component>
-            <component-type>javax.faces.Parameter</component-type>
-            <renderer-type/>
-        </component>
-        <attribute>
-            <description>
-                The name of the request parameter from which the value for this component
-                is retrieved on an initial request or to override the stored value on a
-                postback.
-            </description>
-            <name>name</name>
-            <required>true</required>
-            <type>java.lang.String</type>
-        </attribute>
-
-        <attribute>
-            <description>
-                Converter instance registered with this component.
-            </description>
-            <name>converter</name>
-            <required>false</required>
-            <type>javax.faces.convert.Converter</type>
-        </attribute>
-        <attribute>
-            <description>
-                A ValueExpression enabled attribute that, if present, will be
-                used as the text of the converter message, replacing any message
-                that comes from the converter.
-            </description>
-            <name>converterMessage</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                The component identifier for this component. This value must be
-                unique within the closest parent component that is a naming
-                container.
-            </description>
-            <name>id</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Flag indicating that the user is required to provide a submitted
-                value for this input component.
-            </description>
-            <name>required</name>
-            <required>false</required>
-            <type>boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-                A ValueExpression enabled attribute that, if present, will be
-                used as the text of the validation message for the "required"
-                facility, if the "required" facility is used.
-            </description>
-            <name>requiredMessage</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                MethodExpression representing a validator method that will be
-                called
-                during Process Validations to perform correctness checks on the
-                value of this component. The expression must evaluate to a
-                public
-                method that takes FacesContext, UIComponent, and Object
-                parameters,
-                with a return type of void.
-            </description>
-            <name>validator</name>
-            <required>false</required>
-            <method-signature>void validate(javax.faces.context.FacesContext,
-                javax.faces.component.UIComponent, java.lang.Object)
-            </method-signature>
-        </attribute>
-        <attribute>
-            <description>
-                A ValueExpression enabled attribute that, if present, will be
-                used as the text of the validator message, replacing any
-                message that comes from the validator.
-            </description>
-            <name>validatorMessage</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                A ValueExpression to which the value of the request parameter, as
-                determined by the name attribute, is bound. The resolved value of this
-                expression is used when encoding the view parameter into a bookmarkable link or
-                redirect URL with view parameter encoding enabled. If this attribute is omitted,
-                the value of the request parameter will instead be the local value of the
-                UIViewParameter.
-            </description>
-            <name>value</name>
-            <required>false</required>
-            <type>java.lang.Object</type>
-        </attribute>
-        <attribute>
-            <description>
-                &lt;p&gt;
-
-                MethodExpression representing a value change listener method
-                that will be notified when a new value has been set for this
-                input component. The expression must evaluate to a public
-                method that takes a &lt;code&gt;ValueChangeEvent&lt;/code&gt;
-                parameter,
-                with a return type of void, &lt;span class="changed_added_2_0"&gt;or
-                to a public method that takes no arguments with a return type
-                of void. In the latter case, the method has no way of easily
-                knowing what the new value is, but this can be useful in cases
-                where a notification is needed that "this value
-                changed".&lt;/span&gt;
-
-                &lt;/p&gt;
-            </description>
-            <name>valueChangeListener</name>
-            <required>false</required>
-            <method-signature>void
-                valueChange(javax.faces.event.ValueChangeEvent)
-            </method-signature>
-        </attribute>
-        <attribute>
-            <description>
-                The maximum number of characters that may
-                be entered in this field.
-            </description>
-            <name>maxlength</name>
-            <required>false</required>
-            <type>int</type>
-        </attribute>
-        <attribute>
-            <description>
-                The ValueExpression linking this component to a property in a
-                backing bean
-            </description>
-            <name>binding</name>
-            <required>false</required>
-            <type>javax.faces.component.UIComponent</type>
-        </attribute>
-        <attribute>
-            <description>
-
-                &lt;p class="changed_added_2_0"&gt;If present, this attribute
-                refers
-                to the value of one of the exposed attached objects within the
-                composite component inside of which this tag is nested.&lt;/p&gt;
-
-            </description>
-            <name>for</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-    </tag>
-    <tag>
-        <description>
-            Register a PhaseListener instance on the UIViewRoot in which
-            this tag is nested.
-        </description>
-        <tag-name>phaseListener</tag-name>
-        <handler-class>com.sun.faces.facelets.tag.jsf.core.PhaseListenerHandler</handler-class>
-        <attribute>
-            <description>
-                Fully qualified Java class name of an PhaseListener to be
-                created and registered.
-            </description>
-            <name>type</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Value binding expression that evaluates to an object that
-                implements javax.faces.event.PhaseListener.
-            </description>
-            <name>binding</name>
-            <required>false</required>
-            <type>javax.faces.event.PhaseListener</type>
-        </attribute>
-    </tag>
-    <tag>
-        <description>
-            Add a child UISelectItem component to the UIComponent
-            associated with the closest parent UIComponent custom
-            action.
-        </description>
-        <tag-name>selectItem</tag-name>
-        <component>
-            <component-type>javax.faces.SelectItem</component-type>
-            <renderer-type/>
-        </component>
-        <attribute>
-            <description>
-                Value binding expression to a backing bean
-                property bound to the component instance for
-                the UIComponent created by this custom action.
-            </description>
-            <name>binding</name>
-            <type>javax.faces.component.UIComponent</type>
-        </attribute>
-        <attribute>
-            <description>
-                Component identifier of the UISelectItem
-                component to be created.
-            </description>
-            <name>id</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Description of this option, for use in
-                development tools.
-            </description>
-            <name>itemDescription</name>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Flag indicating whether the option created
-                by this component is disabled. Expressions
-                must evaluate to a boolean. Default value
-                is false.
-            </description>
-            <name>itemDisabled</name>
-            <type>java.lang.Boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-                Label to be displayed to the user
-                for this option.
-            </description>
-            <name>itemLabel</name>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Flag indicating that characters that are sensitive in
-                the value of the &lt;code&gt;itemLabel&lt;/code&gt;
-                attribute must be escaped. This flag is set to "true" by
-                default.
-            </description>
-            <name>escape</name>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Value to be returned to the server if this
-                option is selected by the user.
-            </description>
-            <name>itemValue</name>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Value binding expression pointing at a
-                SelectItem instance containing the
-                information for this option.
-            </description>
-            <name>value</name>
-            <type>javax.faces.model.SelectItem</type>
-        </attribute>
-        <attribute>
-            <description>
-                Flag indicating whether the option created by this
-                component represents the special "no selection"
-                option. Expressions must evaluate to a boolean.
-                Default value is false.
-            </description>
-            <name>noSelectionOption</name>
-            <type>java.lang.Boolean</type>
-        </attribute>
-    </tag>
-    <tag>
-        <description>
-            &lt;p&gt;&lt;span class="changed_modified_2_0"&gt;Add&lt;/span&gt; a
-            child UISelectItems component to the UIComponent associated
-            with the closed parent UIComponent custom action.&lt;/p&gt;
-
-            &lt;p class="changed_modified_2_0"&gt;When iterating over the
-            select items, &lt;code&gt;toString()&lt;/code&gt; mest be called on
-            the
-            string rendered attribute values.&lt;/p&gt;
-
-            &lt;p class="changed_added_2_0"&gt;Version 2 of the specification
-            introduces
-            several new attributes, described below. These are: var, itemValue,
-            itemLabel, itemDescription, itemDisabled, and itemLabelEscaped.&lt;/p&gt;
-
-
-        </description>
-        <tag-name>selectItems</tag-name>
-        <component>
-            <component-type>javax.faces.SelectItems</component-type>
-            <renderer-type/>
-        </component>
-        <attribute>
-            <description>
-                Value binding expression to a backing bean
-                property bound to the component instance for
-                the UIComponent created by this custom action.
-            </description>
-            <name>binding</name>
-            <type>javax.faces.component.UIComponent</type>
-        </attribute>
-        <attribute>
-            <description>
-                Component identifier of the UISelectItems
-                component to be created.
-            </description>
-            <name>id</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-
-
-                &lt;p&gt;Value expression pointing at &lt;span
-                class="changed_modified_2_0"&gt;any &lt;code&gt;Collection&lt;/code&gt;
-                or array.&lt;/span&gt; The member elements may be instances of
-                &lt;code&gt;SelectItem&lt;/code&gt; &lt;span
-                class="changed_added_2_0"&gt;or any Java Object. In the
-                case where the member elements are plain Java Objects,
-                several additional attributes must be used by the page
-                author to correctly identify the data to the enclosing
-                &lt;code&gt;UISelectOne&lt;/code&gt; or &lt;code&gt;UISelectMany&lt;/code&gt;
-                component, as shown in the following example.&lt;/span&gt;
-
-                &lt;div class="syntax"&gt;&lt;div class="html4strict"
-                style="font-family: monospace;"&gt;&lt;ol&gt;&lt;li class="li1"&gt;&lt;div
-                class="de1"&gt;&lt;span class="sc2"&gt;&amp;lt;h:selectOneListbox
-                &lt;span class="kw3"&gt;size&lt;/span&gt;=&lt;span class="st0"&gt;&amp;quot;1&amp;quot;&lt;/span&gt;
-                &lt;span class="kw3"&gt;id&lt;/span&gt;=&lt;span class="st0"&gt;&amp;quot;escape02&amp;quot;&lt;/span&gt;
-                &lt;span class="kw3"&gt;value&lt;/span&gt;=&lt;span class="st0"&gt;&amp;quot;#{select05NoSelection.initialCollectionValues}&amp;quot;&lt;/span&gt;&lt;span
-                class="kw2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-                &lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &lt;span
-                class="sc2"&gt;&amp;lt;f:selectItems &lt;span class="kw3"&gt;value&lt;/span&gt;=&lt;span
-                class="st0"&gt;&amp;quot;#{select05NoSelection.hobbitList}&amp;quot;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-                &lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp;
-                &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
-                &amp;nbsp;var=&lt;span class="st0"&gt;&amp;quot;n&amp;quot;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-                &lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp;
-                &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
-                &amp;nbsp;itemValue=&lt;span class="st0"&gt;&amp;quot;#{n}&amp;quot;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-                &lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp;
-                &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
-                &amp;nbsp;itemLabel=&lt;span class="st0"&gt;&amp;quot;#{n.bio}&amp;quot;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-                &lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp;
-                &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
-                &amp;nbsp;itemDescription=&lt;span class="st0"&gt;&amp;quot;#{n.description}&amp;quot;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-                &lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp;
-                &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
-                &amp;nbsp;itemDisabled=&lt;span class="st0"&gt;&amp;quot;#{n.disabled}&amp;quot;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-                &lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp;
-                &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
-                &amp;nbsp;itemLabelEscaped=&lt;span class="st0"&gt;&amp;quot;true&amp;quot;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-                &lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp;
-                &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
-                &amp;nbsp;noSelectionValue=&lt;span class="st0"&gt;&amp;quot;#{select05NoSelection.hobbitList[0]}&amp;quot;&lt;/span&gt;/&lt;span
-                class="kw2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-                &lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span
-                class="sc2"&gt;&lt;span class="kw2"&gt;&amp;lt;&lt;/span&gt;/h:selectOneListbox&amp;gt;&lt;/span&gt;
-                &lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;
-
-                &lt;p class="changed_added_2_0"&gt;In the preceding example, the
-                &lt;code&gt;value&lt;/code&gt; attribute on line 1 points to a
-                &lt;code&gt;Collection&amp;lt;HobbitBean&amp;gt;&lt;/code&gt;.
-                &lt;code&gt;HobbitBean&lt;/code&gt; is
-                just a regular Java Object (POJO) that conforms to JavaBeans
-                naming
-                conventions for its properties. The &lt;code&gt;value&lt;/code&gt;
-                attribute on
-                line 2 points to a &lt;code&gt;List&amp;lt;HobbitBean&amp;gt;&lt;/code&gt;,
-                though it could
-                just as well point to a &lt;code&gt;Collection&lt;/code&gt;,
-                array, or
-                &lt;code&gt;javax.faces.model.DataModel&lt;/code&gt;. The
-                attributes on lines 3
-                through 9, inclusive, leverage the fact that the value is a
-                collection
-                of POJOs.
-                &lt;/p&gt;
-
-
-                &lt;/p&gt;
-
-
-            </description>
-            <name>value</name>
-            <type>java.lang.Object</type>
-        </attribute>
-        <attribute>
-            <description>
-
-
-                &lt;p class="changed_added_2_0"&gt;Expose the value from the
-                &lt;code&gt;value&lt;/code&gt; attribute under this request
-                scoped key so that it
-                may be referred to in EL for the value of other attributes.&lt;/p&gt;
-
-
-            </description>
-            <name>var</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-
-                &lt;p class="changed_added_2_0"&gt;evaluates to a
-                &lt;code&gt;Collection&lt;/code&gt;, array, or &lt;code&gt;Map&lt;/code&gt;
-                from which the items
-                to be shown will be rendered.&lt;/p&gt;
-
-            </description>
-            <name>itemValue</name>
-            <type>java.lang.Object</type>
-        </attribute>
-        <attribute>
-            <description>
-
-                &lt;p class="changed_added_2_0"&gt;evaluates to a String that
-                will
-                serve as the label to be shown for the item.&lt;/p&gt;
-
-            </description>
-            <name>itemLabel</name>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-
-
-                &lt;p class="changed_added_2_0"&gt;evaluates to a String that
-                will
-                serve as the description to be shown for the item.&lt;/p&gt;
-
-            </description>
-            <name>itemDescription</name>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-
-                &lt;p class="changed_added_2_0"&gt;evaluates to a boolean that
-                will
-                determine if the item value is selectable or not.&lt;/p&gt;
-
-            </description>
-            <name>itemDisabled</name>
-            <type>java.lang.Boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-
-                &lt;p class="changed_added_2_0"&gt;evaluates to a boolean that
-                will
-                determine if the rendered markup for the item receives normal
-                JSF HTML escaping or not.&lt;/p&gt;
-
-            </description>
-            <name>itemLabelEscaped</name>
-            <type>java.lang.Boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-
-                &lt;p class="changed_added_2_0"&gt;Is either an EL expression
-                pointing to the element in the value collection whose value
-                should be
-                marked as a &amp;#8220;no selection&amp;#8221; item, or a
-                literal string that
-                exactly matches the value of the item in the collection that
-                must be
-                marked as the &amp;#8220;no selection&amp;#8221; item. If the
-                user selects such
-                an item &lt;strong&gt;and&lt;/strong&gt; the field is marked as
-                required, then it
-                will not pass validation.&lt;/p&gt;
-
-            </description>
-            <name>itemLabelEscaped</name>
-            <type>java.lang.Boolean</type>
-        </attribute>
-    </tag>
-    <tag>
-        <description>
-            &lt;p&gt;Register an ActionListener instance on the UIComponent
-            associated with the closest parent UIComponent custom action.
-            This actionListener will cause the value given by the "value"
-            attribute to be set into the ValueExpression given by the "target"
-            attribute.&lt;/p&gt;
-
-            &lt;p&gt;The implementation of this tag creates a special
-            &lt;code&gt;ActionListener&lt;/code&gt; instance and registers it on
-            the
-            &lt;code&gt;ActionSource&lt;/code&gt; associated with our most
-            immediate surrounding
-            instance of a tag whose implementation class is a subclass of
-            &lt;code&gt;UIComponentTag&lt;/code&gt;. This tag creates no output
-            to the page
-            currently being created.&lt;/p&gt;
-
-            &lt;p&gt;The &lt;code&gt;ActionListener&lt;/code&gt; instance
-            created and installed by
-            this tag has the following behavior and contract.&lt;/p&gt;
-
-            &lt;ul&gt;
-
-            &lt;li&gt;Only create and register the &lt;code&gt;ActionListener&lt;/code&gt;
-            instance
-            the first time the component for this tag is created&lt;/li&gt;
-
-            &lt;li&gt;The "target" and "value" tag attributes are
-            ValueExpression
-            instances and are stored unevaluated as instance variables of the
-            listener.&lt;/li&gt;
-
-            &lt;li&gt;When the listener executes, perform the following:
-            &lt;ul&gt;
-            Call getValue() on the "value" ValueExpression.
-            &lt;/ul&gt;
-            &lt;ul&gt;
-            If value of the "value" expression is null, call setValue() on
-            the "target" ValueExpression with the null value.
-            &lt;/ul&gt;
-            &lt;ul&gt;
-            If the value of the "value" expression is not null, call getType()
-            on the "value" and "target" ValueExpressions to determine their
-            property types.
-            &lt;/ul&gt;
-            &lt;ul&gt;
-            Coerce the value of the "value" expression to the "target"
-            expression value type following the Expression Language coercion
-            rules. Call setValue() on the "target" ValueExpression with the
-            resulting value.
-            &lt;/ul&gt;
-            &lt;ul&gt;
-            If either coercion or the execution of setValue() fails throw an
-            AbortProcessingException.
-            &lt;/ul&gt;
-            &lt;/li&gt;
-
-            &lt;/ul&gt;
-        </description>
-        <tag-name>setPropertyActionListener</tag-name>
-        <handler-class>com.sun.faces.facelets.tag.jsf.core.SetPropertyActionListenerHandler</handler-class>
-        <attribute>
-            <description>
-                ValueExpression to be stored as the value of the target
-                attribute.
-            </description>
-            <name>value</name>
-            <required>true</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                ValueExpression that is the destination of the value
-                attribute.
-            </description>
-            <name>target</name>
-            <required>true</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-
-                &lt;p class="changed_added_2_0"&gt;If present, this attribute
-                refers
-                to the value of one of the exposed attached objects within the
-                composite component inside of which this tag is nested.&lt;/p&gt;
-
-            </description>
-            <name>for</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-    </tag>
-    <tag>
-        <description>
-            Container action for all JavaServer Faces core and
-            custom component actions used on a nested page via
-            "jsp:include" or any custom action that dynamically
-            includes another page from the same web application,
-            such as JSTL's "c:import".
-        </description>
-        <tag-name>subview</tag-name>
-        <component>
-            <component-type>javax.faces.NamingContainer</component-type>
-            <renderer-type/>
-        </component>
-        <attribute>
-            <description>
-                Value binding expression to a backing bean
-                property bound to the component instance for
-                the UIComponent created by this custom action.
-            </description>
-            <name>binding</name>
-            <type>javax.faces.component.UIComponent</type>
-        </attribute>
-        <attribute>
-            <description>
-                Component identifier of the UINamingContainer
-                component to be created.
-            </description>
-            <name>id</name>
-            <required>true</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Flag indicating whether this component (and its
-                children) should be rendered. Expressions must
-                evaluate to a boolean.
-            </description>
-            <name>rendered</name>
-            <type>java.lang.Boolean</type>
-        </attribute>
-    </tag>
-    <tag>
-        <description>
-            Register a DoubleRangeValidator instance on the
-            UIComponent associated with the closest parent
-            UIComponent custom action.
-        </description>
-        <tag-name>validateDoubleRange</tag-name>
-        <validator>
-            <validator-id>javax.faces.DoubleRange</validator-id>
-            <handler-class>com.sun.faces.facelets.tag.jsf.core.ValidateDelegateHandler</handler-class>
-        </validator>
-        <attribute>
-            <description>
-                &lt;p class="changed_added_2_0"&gt;A boolean value
-                enabling page level determination of whether or not this
-                validator is enabled on the enclosing component.&lt;/p&gt;
-
-
-            </description>
-            <name>disabled</name>
-            <type>java.lang.Boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-                Maximum value allowed for this component.
-            </description>
-            <name>maximum</name>
-            <type>java.lang.Double</type>
-        </attribute>
-        <attribute>
-            <description>
-                Minimum value allowed for this component.
-            </description>
-            <name>minimum</name>
-            <type>java.lang.Double</type>
-        </attribute>
-        <attribute>
-            <description>
-                A ValueExpression that evaluates to an instance of
-                DoubleRangeValidator.
-            </description>
-            <name>binding</name>
-            <type>javax.faces.validator.DoubleRangeValidator</type>
-        </attribute>
-        <attribute>
-            <description>
-
-                &lt;p class="changed_added_2_0"&gt;If present, this attribute
-                refers
-                to the value of one of the exposed attached objects within the
-                composite component inside of which this tag is nested.&lt;/p&gt;
-
-            </description>
-            <name>for</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-    </tag>
-    <tag>
-        <description>
-            Register a LengthValidator instance on the
-            UIComponent associated with the closest parent
-            UIComponent custom action.
-        </description>
-        <tag-name>validateLength</tag-name>
-        <validator>
-            <validator-id>javax.faces.Length</validator-id>
-            <handler-class>com.sun.faces.facelets.tag.jsf.core.ValidateDelegateHandler</handler-class>
-        </validator>
-        <attribute>
-            <description>
-                &lt;p class="changed_added_2_0"&gt;A boolean value
-                enabling page level determination of whether or not this
-                validator is enabled on the enclosing component.&lt;/p&gt;
-
-
-            </description>
-            <name>disabled</name>
-            <type>java.lang.Boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-                Maximum length allowed for this component.
-            </description>
-            <name>maximum</name>
-            <type>java.lang.Integer</type>
-        </attribute>
-        <attribute>
-            <description>
-                Minimum length allowed for this component.
-            </description>
-            <name>minimum</name>
-            <type>java.lang.Integer</type>
-        </attribute>
-        <attribute>
-            <description>
-                A ValueExpression that evaluates to an instance of
-                LenghtValidator.
-            </description>
-            <name>binding</name>
-            <type>javax.faces.validator.LengthValidator</type>
-        </attribute>
-        <attribute>
-            <description>
-
-                &lt;p class="changed_added_2_0"&gt;If present, this attribute
-                refers
-                to the value of one of the exposed attached objects within the
-                composite component inside of which this tag is nested.&lt;/p&gt;
-
-            </description>
-            <name>for</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-    </tag>
-    <tag>
-        <description>
-            Register a LongRangeValidator instance on the
-            UIComponent associated with the closest parent
-            UIComponent custom action.
-        </description>
-        <tag-name>validateLongRange</tag-name>
-        <validator>
-            <validator-id>javax.faces.LongRange</validator-id>
-            <handler-class>com.sun.faces.facelets.tag.jsf.core.ValidateDelegateHandler</handler-class>
-        </validator>
-        <attribute>
-            <description>
-                &lt;p class="changed_added_2_0"&gt;A boolean value
-                enabling page level determination of whether or not this
-                validator is enabled on the enclosing component.&lt;/p&gt;
-
-
-            </description>
-            <name>disabled</name>
-            <type>java.lang.Boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-                Maximum value allowed for this component.
-            </description>
-            <name>maximum</name>
-            <type>java.lang.Long</type>
-        </attribute>
-        <attribute>
-            <description>
-                Minimum value allowed for this component.
-            </description>
-            <name>minimum</name>
-            <type>java.lang.Long</type>
-        </attribute>
-        <attribute>
-            <description>
-                A ValueExpression that evaluates to an instance of
-                LongRangeValidator.
-            </description>
-            <name>binding</name>
-            <type>javax.faces.validator.LongRangeValidator</type>
-        </attribute>
-        <attribute>
-            <description>
-
-                &lt;p class="changed_added_2_0"&gt;If present, this attribute
-                refers
-                to the value of one of the exposed attached objects within the
-                composite component inside of which this tag is nested.&lt;/p&gt;
-
-            </description>
-            <name>for</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-    </tag>
-    <tag>
-        <description>&lt;p&gt;
-
-            &lt;span class="changed_added_2_0"&gt;
-            A validator that delegates the validation of the local value
-            to the Bean Validation API. The validationGroups attribute
-            serves as a filter that instructs the Bean Validation API which
-            contraints to enforce. If there are any constraint violations
-            reported by Bean Validation, the value is considered invalid.
-
-            &lt;/p&gt;
-        </description>
-        <tag-name>validateBean</tag-name>
-        <validator>
-            <validator-id>javax.faces.Bean</validator-id>
-            <handler-class>com.sun.faces.facelets.tag.jsf.core.ValidateDelegateHandler</handler-class>
-        </validator>
-        <attribute>
-            <description>
-                A comma-separated list of validation groups. A validation group
-                is a fully-qualified class name.
-            </description>
-            <name>validationGroups</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                &lt;p class="changed_added_2_0"&gt;A boolean value
-                enabling page level determination of whether or not this
-                validator is enabled on the enclosing component.&lt;/p&gt;
-
-
-            </description>
-            <name>disabled</name>
-            <type>java.lang.Boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-                A ValueExpression that evaluates to an instance of
-                BeanValidator.
-            </description>
-            <name>binding</name>
-            <type>javax.faces.validator.BeanValidator</type>
-        </attribute>
-        <attribute>
-            <description>
-
-                &lt;p class="changed_added_2_0"&gt;If present, this attribute
-                refers
-                to the value of one of the exposed attached objects within the
-                composite component inside of which this tag is nested.&lt;/p&gt;
-
-            </description>
-            <name>for</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-    </tag>
-    <tag>
-        <description>&lt;p&gt;
-
-            &lt;span class="changed_added_2_0"&gt;
-            A validator that uses the pattern attribute to validate the
-            wrapping component. The entire pattern is matched against
-            the String value of the component. If it matches, it's
-            valid.
-
-            &lt;/p&gt;
-        </description>
-        <tag-name>validateRegex</tag-name>
-        <validator>
-            <validator-id>javax.faces.RegularExpression</validator-id>
-            <handler-class>com.sun.faces.facelets.tag.jsf.core.ValidateDelegateHandler</handler-class>
-        </validator>
-        <attribute>
-            <description>
-                &lt;p class="changed_added_2_0"&gt;A boolean value
-                enabling page level determination of whether or not this
-                validator is enabled on the enclosing component.&lt;/p&gt;
-
-
-            </description>
-            <name>disabled</name>
-            <type>java.lang.Boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-                A regular expression pattern. Remember that, like in
-                all Java strings, backslash must be escaped with another
-                backslash.
-            </description>
-            <name>pattern</name>
-            <required>true</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                A ValueExpression that evaluates to an instance of
-                RegexpValidator.
-            </description>
-            <name>binding</name>
-            <type>javax.faces.validator.RegexValidator</type>
-        </attribute>
-        <attribute>
-            <description>
-
-                &lt;p class="changed_added_2_0"&gt;If present, this attribute
-                refers
-                to the value of one of the exposed attached objects within the
-                composite component inside of which this tag is nested.&lt;/p&gt;
-
-            </description>
-            <name>for</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-    </tag>
-    <tag>
-        <description>
-
-            &lt;p class="changed_added_2_0"&gt;A validator that enforces
-            the presence of a value. It has the same affect as setting the
-            required attribute on a UIInput to true.&lt;/p&gt;
-
-        </description>
-        <tag-name>validateRequired</tag-name>
-        <validator>
-            <validator-id>javax.faces.Required</validator-id>
-            <handler-class>com.sun.faces.facelets.tag.jsf.core.ValidateDelegateHandler</handler-class>
-        </validator>
-        <attribute>
-            <description>
-                &lt;p class="changed_added_2_0"&gt;A boolean value
-                enabling page level determination of whether or not this
-                validator is enabled on the enclosing component.&lt;/p&gt;
-
-
-            </description>
-            <name>disabled</name>
-            <type>java.lang.Boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-                A ValueExpression that evaluates to an instance of
-                RequiredValidator.
-            </description>
-            <name>binding</name>
-            <type>javax.faces.validator.RequiredValidator</type>
-        </attribute>
-        <attribute>
-            <description>
-
-                &lt;p class="changed_added_2_0"&gt;If present, this attribute
-                refers
-                to the value of one of the exposed attached objects within the
-                composite component inside of which this tag is nested.&lt;/p&gt;
-
-            </description>
-            <name>for</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-    </tag>
-    <tag>
-        <description>
-
-            &lt;p&gt;&lt;span class="changed_modified_2_0"&gt;Register&lt;/span&gt;
-            a named
-            Validator instance on the UIComponent associated with the
-            closest parent UIComponent custom action.&lt;/p&gt;
-
-            &lt;div class="changed_added_2_0"&gt;
-
-            &lt;p&gt;Usage outside of an &lt;code&gt;EditableValueHolder&lt;/code&gt;
-            parent&lt;/p&gt;
-
-            &lt;p&gt;If this element is nested within a
-            &lt;code&gt;UIComponent&lt;/code&gt; tag that has other
-            &lt;code&gt;UIComponent&lt;/code&gt; children, the validator will be
-            automatically added to all the child components as well as
-            this one. The implementation must ensure this occurs even if
-            the parent of this element is not an instance of
-            &lt;code&gt;EditableValueHolder&lt;/code&gt;.&lt;/p&gt;
-
-            &lt;/div&gt;
-
-        </description>
-        <tag-name>validator</tag-name>
-        <handler-class>com.sun.faces.facelets.tag.jsf.core.ValidateDelegateHandler</handler-class>
-        <attribute>
-            <description>
-                &lt;p class="changed_added_2_0"&gt;A boolean value
-                enabling page level determination of whether or not this
-                validator is enabled on the enclosing component.&lt;/p&gt;
-
-
-            </description>
-            <name>disabled</name>
-            <type>java.lang.Boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-                Validator identifier of the Validator
-                to be created and registered.
-            </description>
-            <name>validatorId</name>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                A ValueExpression that evaluates to an object that implements
-                the javax.faces.validator.Validator interface.
-            </description>
-            <name>binding</name>
-            <type>javax.faces.validator.Validator</type>
-        </attribute>
-        <attribute>
-            <description>
-
-                &lt;p class="changed_added_2_0"&gt;If present, this attribute
-                refers
-                to the value of one of the exposed attached objects within the
-                composite component inside of which this tag is nested.&lt;/p&gt;
-
-            </description>
-            <name>for</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-    </tag>
-    <tag>
-        <description>
-            Register a ValueChangeListener instance on the UIComponent
-            associated with the closest parent UIComponent custom
-            action.
-        </description>
-        <tag-name>valueChangeListener</tag-name>
-        <handler-class>com.sun.faces.facelets.tag.jsf.core.ValueChangeListenerHandler</handler-class>
-        <attribute>
-            <description>
-                Fully qualified Java class name of a
-                ValueChangeListener to be created and registered.
-            </description>
-            <name>type</name>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Value binding expression that evaluates to an object that
-                implements javax.faces.event.ValueChangeListener.
-            </description>
-            <name>binding</name>
-            <required>false</required>
-            <type>javax.faces.event.ValueChangeListener</type>
-        </attribute>
-        <attribute>
-            <description>
-
-                &lt;p class="changed_added_2_0"&gt;If present, this attribute
-                refers
-                to the value of one of the exposed attached objects within the
-                composite component inside of which this tag is nested.&lt;/p&gt;
-
-            </description>
-            <name>for</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-    </tag>
-    <tag>
-        <description>
-            Create and register a child UIOutput component
-            associated with the closest parent UIComponent
-            custom action, which renders nested body content.
-        </description>
-        <tag-name>verbatim</tag-name>
-        <component>
-            <component-type>javax.faces.Output</component-type>
-            <renderer-type>javax.faces.Text</renderer-type>
-        </component>
-        <attribute>
-            <description>
-                Flag indicating that generated markup must
-                be escaped in a manner that is appropriate
-                for the markup language to be rendered.
-                Expressions must evaluate to a boolean.
-                Default value is false.
-            </description>
-            <name>escape</name>
-            <type>java.lang.Boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-                Flag indicating whether or not this component should be rendered
-                (during Render Response Phase), or processed on any subsequent
-                form submit. The default value for this property is true.
-            </description>
-            <name>rendered</name>
-            <required>false</required>
-            <type>java.lang.Boolean</type>
-        </attribute>
-    </tag>
-    <tag>
-        <description>
-            Container for all JavaServer Faces core and custom
-            component actions used on a page.
-        </description>
-        <tag-name>view</tag-name>
-        <component>
-            <component-type>javax.faces.ViewRoot</component-type>
-            <renderer-type/>
-        </component>
-        <attribute>
-            <description>
-                Locale to use for localizing this page. Expressions
-                must evaluate to a java.util.Locale or to a String
-                that is converted to a Locale.
-            </description>
-            <name>locale</name>
-            <type>java.lang.Object</type>
-        </attribute>
-        <attribute>
-            <description>
-                Identifier for the RenderKit to use for
-                rendering this page.
-            </description>
-            <name>renderKitId</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Specifies the content-type of the response.
-            </description>
-            <name>contentType</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-
-        <attribute>
-            <description>
-                Specifies the character encoding that should be used for the
-                response.
-            </description>
-            <name>encoding</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-
-                MethodBinding pointing to a method that takes a
-                javax.faces.event.PhaseEvent and returns void. This method
-                will be called before every phase except for restore view.
-            </description>
-            <name>beforePhase</name>
-            <required>false</required>
-            <method-signature>void beforePhase(javax.faces.event.PhaseEvent)
-            </method-signature>
-        </attribute>
-        <attribute>
-            <description>
-
-                MethodBinding pointing to a method that takes a
-                javax.faces.event.PhaseEvent and returns void. This method
-                will be called after every phase except for restore view.
-            </description>
-            <name>afterPhase</name>
-            <required>false</required>
-            <method-signature>void afterPhase(javax.faces.event.PhaseEvent)
-            </method-signature>
-        </attribute>
-    </tag>
-</facelet-taglib>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/std-taglibs/html_basic.taglib.xml b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/std-taglibs/html_basic.taglib.xml
deleted file mode 100644
index 7426c4f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/std-taglibs/html_basic.taglib.xml
+++ /dev/null
@@ -1,10465 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!--
- DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
-
- Copyright 2009 Sun Microsystems, Inc. All rights reserved.
-
- The contents of this file are subject to the terms of either the GNU
- General Public License Version 2 only ("GPL") or the Common Development
- and Distribution License("CDDL") (collectively, the "License").  You
- may not use this file except in compliance with the License. You can obtain
- a copy of the License at https://glassfish.dev.java.net/public/CDDL+GPL.html
- or glassfish/bootstrap/legal/LICENSE.txt.  See the License for the specific
- language governing permissions and limitations under the License.
-
- When distributing the software, include this License Header Notice in each
- file and include the License file at glassfish/bootstrap/legal/LICENSE.txt.
- Sun designates this particular file as subject to the "Classpath" exception
- as provided by Sun in the GPL Version 2 section of the License file that
- accompanied this code.  If applicable, add the following below the License
- Header, with the fields enclosed by brackets [] replaced by your own
- identifying information: "Portions Copyrighted [year]
- [name of copyright owner]"
-
- Contributor(s):
-
- If you wish your version of this file to be governed by only the CDDL or
- only the GPL Version 2, indicate your decision by adding "[Contributor]
- elects to include this software in this distribution under the [CDDL or GPL
- Version 2] license."  If you don't indicate a single choice of license, a
- recipient has the option to distribute your version of this file under
- either the CDDL, the GPL Version 2 or to extend the choice of license to
- its licensees as provided above.  However, if you add GPL Version 2 code
- and therefore, elected the GPL Version 2 license, then the option applies
- only if the new code is made subject to such option by the copyright
- holder.
--->
-<facelet-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 http://java.sun.com/xml/ns/javaee/web-facelettaglibrary_2_0.xsd"
-                version="2.0">
-    <description>
-        This tag library contains JavaServer Faces component tags for all
-        UIComponent + HTML RenderKit Renderer combinations defined in the
-        JavaServer Faces Specification.
-    </description>
-    <namespace>http://java.sun.com/jsf/html</namespace>
-    <tag>
-        <description>
-            <![CDATA[<div class="changed_added_2_0">Render an HTML "input" element of type "button".
-            The value of the component is rendered as the button text and the outcome of the
-            component is used to determine the target URL which is activated by onclick.  If
-            "image" attribute is specified, render it as the value of the "src" attribute after
-            passing it to the <code>getResourceURL()</code> method of the <code>ViewHandler</code>
-            for this application, and passing the result through the <code>encodeResourceURL()</code>
-            method of the <code>ExternalContext</code>. Any child <code>UIParameter</code> components
-            are appended to the String to be used as the target URL as query parameters before rendering.
-            The entire target URL string must be passed through a call to the <code>encodeResourceURL()</code>
-            method of the <code>ExternalContext</code>.  The name of the <code>UIParameter</code> goes on the
-            left hand side, and the value of the <code>UIParameter</code> on the right hand side.  The name
-            and the value must be URLEncoded.  Each <code>UIParameter</code> instance is separeted by an
-            ampersand, as dictated in the URL spec.  The final encoded result will be written out to the
-            onclick attribute of the button as "window.location.href = '<encoded HREF value>'".
-            If the developer has specified a custom onlclick the window.location.href name/value
-            pair will be appended at the end of the developer specified script.
-            If the "fragment" attribute is specified, the value will be included at the end
-            of the resulting URL preceded by a hash mark.  If the "styleClass" attribute is specified,
-            render its value as the value of the "class" attribute.  If the "id" attribute is specified,
-            follow the same steps as mentioned in the "<a href="../../../renderkitdocs/HTML_BASIC/renderkit-summary.html#general_encoding">General
-            Notes on Encoding</a>" regarding the "id" attribute for UIInput components.  If the
-            "disabled" attribute is specified, do not render the "onclick" element and assign the
-            "disabled" attribute a value of true.</div>]]>
-        </description>
-        <tag-name>
-            button
-        </tag-name>
-        <component>
-            <component-type>javax.faces.HtmlOutcomeTargetButton</component-type>
-            <renderer-type>javax.faces.Button</renderer-type>
-        </component>
-        <attribute>
-            <description>
-                <![CDATA[The component identifier for this component.  This value must be
-                unique within the closest parent component that is a naming
-                container.]]>
-            </description>
-            <name>
-                id
-            </name>
-            <required>
-                false
-            </required>
-            <type>
-                java.lang.String
-            </type>
-        </attribute>
-        <attribute>
-            <description>
-                <![CDATA[Whether to include page parameters in the target URI.]]>
-            </description>
-            <name>
-                includeViewParams
-            </name>
-            <required>
-                false
-            </required>
-            <type>
-                java.lang.Boolean
-            </type>
-        </attribute>
-        <attribute>
-            <description>
-                <![CDATA[The logical outcome used to resolve a navigation case.]]>
-            </description>
-            <name>
-                outcome
-            </name>
-            <required>
-                false
-            </required>
-            <type>
-                java.lang.String
-            </type>
-        </attribute>
-        <attribute>
-            <description>
-                <![CDATA[Flag indicating whether or not this component should be rendered
-                (during Render Response Phase), or processed on any subsequent
-                form submit.  The default value for this property is true.]]>
-            </description>
-            <name>
-                rendered
-            </name>
-            <required>
-                false
-            </required>
-            <type>
-                boolean
-            </type>
-        </attribute>
-        <attribute>
-            <description>
-                <![CDATA[The current value of this component.]]>
-            </description>
-            <name>
-                value
-            </name>
-            <required>
-                false
-            </required>
-            <type>
-                java.lang.Object
-            </type>
-        </attribute>
-        <attribute>
-            <description>
-                <![CDATA[Access key that, when pressed, transfers focus
-                to this element.]]>
-            </description>
-            <name>
-                accesskey
-            </name>
-            <required>
-                false
-            </required>
-            <type>
-                java.lang.String
-            </type>
-        </attribute>
-        <attribute>
-            <description>
-                <![CDATA[Alternate textual description of the
-                element rendered by this component.]]>
-            </description>
-            <name>
-                alt
-            </name>
-            <required>
-                false
-            </required>
-            <type>
-                java.lang.String
-            </type>
-        </attribute>
-        <attribute>
-            <description>
-                <![CDATA[Direction indication for text that does not inherit directionality.
-                Valid values are "LTR" (left-to-right) and "RTL" (right-to-left).]]>
-            </description>
-            <name>
-                dir
-            </name>
-            <required>
-                false
-            </required>
-            <type>
-                java.lang.String
-            </type>
-        </attribute>
-        <attribute>
-            <description>
-                <![CDATA[The identifier of the page fragment which should
-                be brought into focus when the target page is
-                rendered. The value of this attribute is appended
-                to the end of target URL following a hash (#) mark.
-                This notation is part of the standard URL syntax.]]>
-            </description>
-            <name>
-                fragment
-            </name>
-            <required>
-                false
-            </required>
-            <type>
-                java.lang.String
-            </type>
-        </attribute>
-        <attribute>
-            <description>
-                <![CDATA[<p>
-                Absolute or relative URL of the
-                image to be displayed for this
-                button.  If specified, this
-                "input" element will be of type
-                "image".  Otherwise, it will be
-                of the type specified by the
-                "type" property with a label
-                specified by the "value"
-                property.  <span
-                class="changed_added_2_0">Note
-                that if the value of this
-                attribute starts with "/", the
-                rendered value for this
-                attribute will be prefixed with
-                the context-root for this
-                application.</span>
-                </p>]]>
-            </description>
-            <name>
-                image
-            </name>
-            <required>
-                false
-            </required>
-            <type>
-                java.lang.String
-            </type>
-        </attribute>
-        <attribute>
-            <description>
-                <![CDATA[Code describing the language used in the generated markup
-                for this component.]]>
-            </description>
-            <name>
-                lang
-            </name>
-            <required>
-                false
-            </required>
-            <type>
-                java.lang.String
-            </type>
-        </attribute>
-        <attribute>
-            <description>
-                <![CDATA[Javascript code executed when this element loses focus.]]>
-            </description>
-            <name>
-                onblur
-            </name>
-            <required>
-                false
-            </required>
-            <type>
-                java.lang.String
-            </type>
-        </attribute>
-        <attribute>
-            <description>
-                <![CDATA[Javascript code executed when a pointer button is
-                clicked over this element.]]>
-            </description>
-            <name>
-                onclick
-            </name>
-            <required>
-                false
-            </required>
-            <type>
-                java.lang.String
-            </type>
-        </attribute>
-        <attribute>
-            <description>
-                <![CDATA[Javascript code executed when a pointer button is
-                double clicked over this element.]]>
-            </description>
-            <name>
-                ondblclick
-            </name>
-            <required>
-                false
-            </required>
-            <type>
-                java.lang.String
-            </type>
-        </attribute>
-        <attribute>
-            <description>
-                <![CDATA[Javascript code executed when this element receives focus.]]>
-            </description>
-            <name>
-                onfocus
-            </name>
-            <required>
-                false
-            </required>
-            <type>
-                java.lang.String
-            </type>
-        </attribute>
-        <attribute>
-            <description>
-                <![CDATA[Javascript code executed when a key is
-                pressed down over this element.]]>
-            </description>
-            <name>
-                onkeydown
-            </name>
-            <required>
-                false
-            </required>
-            <type>
-                java.lang.String
-            </type>
-        </attribute>
-        <attribute>
-            <description>
-                <![CDATA[Javascript code executed when a key is
-                pressed and released over this element.]]>
-            </description>
-            <name>
-                onkeypress
-            </name>
-            <required>
-                false
-            </required>
-            <type>
-                java.lang.String
-            </type>
-        </attribute>
-        <attribute>
-            <description>
-                <![CDATA[Javascript code executed when a key is
-                released over this element.]]>
-            </description>
-            <name>
-                onkeyup
-            </name>
-            <required>
-                false
-            </required>
-            <type>
-                java.lang.String
-            </type>
-        </attribute>
-        <attribute>
-            <description>
-                <![CDATA[Javascript code executed when a pointer button is
-                pressed down over this element.]]>
-            </description>
-            <name>
-                onmousedown
-            </name>
-            <required>
-                false
-            </required>
-            <type>
-                java.lang.String
-            </type>
-        </attribute>
-        <attribute>
-            <description>
-                <![CDATA[Javascript code executed when a pointer button is
-                moved within this element.]]>
-            </description>
-            <name>
-                onmousemove
-            </name>
-            <required>
-                false
-            </required>
-            <type>
-                java.lang.String
-            </type>
-        </attribute>
-        <attribute>
-            <description>
-                <![CDATA[Javascript code executed when a pointer button is
-                moved away from this element.]]>
-            </description>
-            <name>
-                onmouseout
-            </name>
-            <required>
-                false
-            </required>
-            <type>
-                java.lang.String
-            </type>
-        </attribute>
-        <attribute>
-            <description>
-                <![CDATA[Javascript code executed when a pointer button is
-                moved onto this element.]]>
-            </description>
-            <name>
-                onmouseover
-            </name>
-            <required>
-                false
-            </required>
-            <type>
-                java.lang.String
-            </type>
-        </attribute>
-        <attribute>
-            <description>
-                <![CDATA[Javascript code executed when a pointer button is
-                released over this element.]]>
-            </description>
-            <name>
-                onmouseup
-            </name>
-            <required>
-                false
-            </required>
-            <type>
-                java.lang.String
-            </type>
-        </attribute>
-        <attribute>
-            <description>
-                <![CDATA[CSS style(s) to be applied when this component is rendered.]]>
-            </description>
-            <name>
-                style
-            </name>
-            <required>
-                false
-            </required>
-            <type>
-                java.lang.String
-            </type>
-        </attribute>
-        <attribute>
-            <description>
-                <![CDATA[Space-separated list of CSS style class(es) to be applied when
-                this element is rendered.  This value must be passed through
-                as the "class" attribute on generated markup.]]>
-            </description>
-            <name>
-                styleClass
-            </name>
-            <required>
-                false
-            </required>
-            <type>
-                java.lang.String
-            </type>
-        </attribute>
-        <attribute>
-            <description>
-                <![CDATA[Position of this element in the tabbing order
-                for the current document.  This value must be
-                an integer between 0 and 32767.]]>
-            </description>
-            <name>
-                tabindex
-            </name>
-            <required>
-                false
-            </required>
-            <type>
-                java.lang.String
-            </type>
-        </attribute>
-        <attribute>
-            <description>
-                <![CDATA[Advisory title information about markup elements generated
-                for this component.]]>
-            </description>
-            <name>
-                title
-            </name>
-            <required>
-                false
-            </required>
-            <type>
-                java.lang.String
-            </type>
-        </attribute>
-        <attribute>
-            <description>
-                The ValueExpression linking this component to a property in a
-                backing bean
-            </description>
-            <name>
-                binding
-            </name>
-            <required>
-                false
-            </required>
-            <type>
-                javax.faces.component.UIComponent
-            </type>
-        </attribute>
-    </tag>
-    <tag>
-        <description>
-            <![CDATA[<div class="changed_added_2_0">Render an HTML "a" anchor element.  The value of the
-            component is rendered as the anchor text and the outcome of the component is used
-            to determine the target URL rendered in the "href" attribute.  Any
-            child <code>UIParameter</code> components are appended to the String to be
-            output as the value of the "href" attribute as query parameters
-            before rendering.  The entire "href" string must be passed through
-            a call to the <code>encodeResourceURL()</code> method of the
-            <code>ExternalContext</code>.  The name of the <code>UIParameter</code> goes on
-            the left hand side, and the value of the <code>UIParameter</code> on the right
-            hand side.  The name and the value must be URLEncoded.  Each
-            <code>UIParameter</code> instance is separated by an ampersand, as dictated in
-            the URL spec.  If the "fragment" attribute is specified, the value will be
-            included at the end of the resulting URL preceded by a hash mark.
-            If the "styleClass" attribute is specified, render
-            its value as the value of the "class" attribute.  If the "id" attribute
-            is specified, follow the same steps as mentioned in the
-            "<a href="../../../renderkitdocs/HTML_BASIC/renderkit-summary.html#general_encoding">General
-            Notes on Encoding</a>" regarding the "id" attribute for UIInput components.
-            If the "disabled" attribute is specified, do not render the HTML "a"
-            anchor element or the "href" element.  Instead, render a "span" element.
-            If the "styleClass" attribute is specified, render its value as the value
-            of the "class" attribute on the "span".  Render any pass-through attributes
-            on the "span".</div>]]>
-        </description>
-        <tag-name>
-            link
-        </tag-name>
-        <component>
-            <component-type>javax.faces.HtmlOutcomeTargetLink</component-type>
-            <renderer-type>javax.faces.Link</renderer-type>
-        </component>
-        <attribute>
-            <description>
-                <![CDATA[The component identifier for this component.  This value must be
-                unique within the closest parent component that is a naming
-                container.]]>
-            </description>
-            <name>
-                id
-            </name>
-            <required>
-                false
-            </required>
-            <type>
-                java.lang.String
-            </type>
-        </attribute>
-        <attribute>
-            <description>
-                <![CDATA[Whether to include page parameters in the target URI.]]>
-            </description>
-            <name>
-                includeViewParams
-            </name>
-            <required>
-                false
-            </required>
-            <type>
-                java.lang.Boolean
-            </type>
-        </attribute>
-        <attribute>
-            <description>
-                <![CDATA[The logical outcome used to resolve a navigation case.]]>
-            </description>
-            <name>
-                outcome
-            </name>
-            <required>
-                false
-            </required>
-            <type>
-                java.lang.String
-            </type>
-        </attribute>
-        <attribute>
-            <description>
-                <![CDATA[Flag indicating whether or not this component should be rendered
-                (during Render Response Phase), or processed on any subsequent
-                form submit.  The default value for this property is true.]]>
-            </description>
-            <name>
-                rendered
-            </name>
-            <required>
-                false
-            </required>
-            <type>
-                boolean
-            </type>
-        </attribute>
-        <attribute>
-            <description>
-                <![CDATA[The current value of this component.]]>
-            </description>
-            <name>
-                value
-            </name>
-            <required>
-                false
-            </required>
-            <type>
-                java.lang.Object
-            </type>
-        </attribute>
-        <attribute>
-            <description>
-                <![CDATA[Access key that, when pressed, transfers focus
-                to this element.]]>
-            </description>
-            <name>
-                accesskey
-            </name>
-            <required>
-                false
-            </required>
-            <type>
-                java.lang.String
-            </type>
-        </attribute>
-        <attribute>
-            <description>
-                <![CDATA[The character encoding of the resource designated
-                by this hyperlink.]]>
-            </description>
-            <name>
-                charset
-            </name>
-            <required>
-                false
-            </required>
-            <type>
-                java.lang.String
-            </type>
-        </attribute>
-        <attribute>
-            <description>
-                <![CDATA[The position and shape of the hot spot on the screen
-                (for use in client-side image maps).]]>
-            </description>
-            <name>
-                coords
-            </name>
-            <required>
-                false
-            </required>
-            <type>
-                java.lang.String
-            </type>
-        </attribute>
-        <attribute>
-            <description>
-                <![CDATA[Direction indication for text that does not inherit directionality.
-                Valid values are "LTR" (left-to-right) and "RTL" (right-to-left).]]>
-            </description>
-            <name>
-                dir
-            </name>
-            <required>
-                false
-            </required>
-            <type>
-                java.lang.String
-            </type>
-        </attribute>
-        <attribute>
-            <description>
-                <![CDATA[Flag indicating that this element must never
-                receive focus or be included in a subsequent
-                submit.]]>
-            </description>
-            <name>
-                disabled
-            </name>
-            <required>
-                false
-            </required>
-            <type>
-                boolean
-            </type>
-        </attribute>
-        <attribute>
-            <description>
-                <![CDATA[The identifier of the page fragment which should
-                be brought into focus when the target page is
-                rendered. The value of this attribute is appended
-                to the end of target URL following a hash (#) mark.
-                This notation is part of the standard URL syntax.]]>
-            </description>
-            <name>
-                fragment
-            </name>
-            <required>
-                false
-            </required>
-            <type>
-                java.lang.String
-            </type>
-        </attribute>
-        <attribute>
-            <description>
-                <![CDATA[The language code of the resource designated
-                by this hyperlink.]]>
-            </description>
-            <name>
-                hreflang
-            </name>
-            <required>
-                false
-            </required>
-            <type>
-                java.lang.String
-            </type>
-        </attribute>
-        <attribute>
-            <description>
-                <![CDATA[Code describing the language used in the generated markup
-                for this component.]]>
-            </description>
-            <name>
-                lang
-            </name>
-            <required>
-                false
-            </required>
-            <type>
-                java.lang.String
-            </type>
-        </attribute>
-        <attribute>
-            <description>
-                <![CDATA[Javascript code executed when this element loses focus.]]>
-            </description>
-            <name>
-                onblur
-            </name>
-            <required>
-                false
-            </required>
-            <type>
-                java.lang.String
-            </type>
-        </attribute>
-        <attribute>
-            <description>
-                <![CDATA[Javascript code executed when a pointer button is
-                clicked over this element.]]>
-            </description>
-            <name>
-                onclick
-            </name>
-            <required>
-                false
-            </required>
-            <type>
-                java.lang.String
-            </type>
-        </attribute>
-        <attribute>
-            <description>
-                <![CDATA[Javascript code executed when a pointer button is
-                double clicked over this element.]]>
-            </description>
-            <name>
-                ondblclick
-            </name>
-            <required>
-                false
-            </required>
-            <type>
-                java.lang.String
-            </type>
-        </attribute>
-        <attribute>
-            <description>
-                <![CDATA[Javascript code executed when this element receives focus.]]>
-            </description>
-            <name>
-                onfocus
-            </name>
-            <required>
-                false
-            </required>
-            <type>
-                java.lang.String
-            </type>
-        </attribute>
-        <attribute>
-            <description>
-                <![CDATA[Javascript code executed when a key is
-                pressed down over this element.]]>
-            </description>
-            <name>
-                onkeydown
-            </name>
-            <required>
-                false
-            </required>
-            <type>
-                java.lang.String
-            </type>
-        </attribute>
-        <attribute>
-            <description>
-                <![CDATA[Javascript code executed when a key is
-                pressed and released over this element.]]>
-            </description>
-            <name>
-                onkeypress
-            </name>
-            <required>
-                false
-            </required>
-            <type>
-                java.lang.String
-            </type>
-        </attribute>
-        <attribute>
-            <description>
-                <![CDATA[Javascript code executed when a key is
-                released over this element.]]>
-            </description>
-            <name>
-                onkeyup
-            </name>
-            <required>
-                false
-            </required>
-            <type>
-                java.lang.String
-            </type>
-        </attribute>
-        <attribute>
-            <description>
-                <![CDATA[Javascript code executed when a pointer button is
-                pressed down over this element.]]>
-            </description>
-            <name>
-                onmousedown
-            </name>
-            <required>
-                false
-            </required>
-            <type>
-                java.lang.String
-            </type>
-        </attribute>
-        <attribute>
-            <description>
-                <![CDATA[Javascript code executed when a pointer button is
-                moved within this element.]]>
-            </description>
-            <name>
-                onmousemove
-            </name>
-            <required>
-                false
-            </required>
-            <type>
-                java.lang.String
-            </type>
-        </attribute>
-        <attribute>
-            <description>
-                <![CDATA[Javascript code executed when a pointer button is
-                moved away from this element.]]>
-            </description>
-            <name>
-                onmouseout
-            </name>
-            <required>
-                false
-            </required>
-            <type>
-                java.lang.String
-            </type>
-        </attribute>
-        <attribute>
-            <description>
-                <![CDATA[Javascript code executed when a pointer button is
-                moved onto this element.]]>
-            </description>
-            <name>
-                onmouseover
-            </name>
-            <required>
-                false
-            </required>
-            <type>
-                java.lang.String
-            </type>
-        </attribute>
-        <attribute>
-            <description>
-                <![CDATA[Javascript code executed when a pointer button is
-                released over this element.]]>
-            </description>
-            <name>
-                onmouseup
-            </name>
-            <required>
-                false
-            </required>
-            <type>
-                java.lang.String
-            </type>
-        </attribute>
-        <attribute>
-            <description>
-                <![CDATA[The relationship from the current document
-                to the anchor specified by this hyperlink.
-                The value of this attribute is a space-separated
-                list of link types.]]>
-            </description>
-            <name>
-                rel
-            </name>
-            <required>
-                false
-            </required>
-            <type>
-                java.lang.String
-            </type>
-        </attribute>
-        <attribute>
-            <description>
-                <![CDATA[A reverse link from the anchor specified
-                by this hyperlink to the current document.
-                The value of this attribute is a space-separated
-                list of link types.]]>
-            </description>
-            <name>
-                rev
-            </name>
-            <required>
-                false
-            </required>
-            <type>
-                java.lang.String
-            </type>
-        </attribute>
-        <attribute>
-            <description>
-                <![CDATA[The shape of the hot spot on the screen
-                (for use in client-side image maps).  Valid
-                values are:  default (entire region); rect
-                (rectangular region); circle (circular region);
-                and poly (polygonal region).]]>
-            </description>
-            <name>
-                shape
-            </name>
-            <required>
-                false
-            </required>
-            <type>
-                java.lang.String
-            </type>
-        </attribute>
-        <attribute>
-            <description>
-                <![CDATA[CSS style(s) to be applied when this component is rendered.]]>
-            </description>
-            <name>
-                style
-            </name>
-            <required>
-                false
-            </required>
-            <type>
-                java.lang.String
-            </type>
-        </attribute>
-        <attribute>
-            <description>
-                <![CDATA[Space-separated list of CSS style class(es) to be applied when
-                this element is rendered.  This value must be passed through
-                as the "class" attribute on generated markup.]]>
-            </description>
-            <name>
-                styleClass
-            </name>
-            <required>
-                false
-            </required>
-            <type>
-                java.lang.String
-            </type>
-        </attribute>
-        <attribute>
-            <description>
-                <![CDATA[Position of this element in the tabbing order
-                for the current document.  This value must be
-                an integer between 0 and 32767.]]>
-            </description>
-            <name>
-                tabindex
-            </name>
-            <required>
-                false
-            </required>
-            <type>
-                java.lang.String
-            </type>
-        </attribute>
-        <attribute>
-            <description>
-                <![CDATA[Name of a frame where the resource
-                retrieved via this hyperlink is to
-                be displayed.]]>
-            </description>
-            <name>
-                target
-            </name>
-            <required>
-                false
-            </required>
-            <type>
-                java.lang.String
-            </type>
-        </attribute>
-        <attribute>
-            <description>
-                <![CDATA[Advisory title information about markup elements generated
-                for this component.]]>
-            </description>
-            <name>
-                title
-            </name>
-            <required>
-                false
-            </required>
-            <type>
-                java.lang.String
-            </type>
-        </attribute>
-        <attribute>
-            <description>
-                <![CDATA[The content type of the resource designated
-                by this hyperlink.]]>
-            </description>
-            <name>
-                type
-            </name>
-            <required>
-                false
-            </required>
-            <type>
-                java.lang.String
-            </type>
-        </attribute>
-        <attribute>
-            <description>
-                The ValueExpression linking this component to a property in a
-                backing bean
-            </description>
-            <name>
-                binding
-            </name>
-            <required>
-                false
-            </required>
-            <type>
-                javax.faces.component.UIComponent
-            </type>
-        </attribute>
-    </tag>
-    <tag>
-        <description>
-            <![CDATA[
-
-          <p>Render the markup for a <code>&lt;head&gt;</code> element.</p>
-
-          <p>Decode Behavior</p>
-
-          <ul>
-
-          <p>No action is required during decode for this renderer.</p>
-
-          </ul>
-
-          <p>Encode Behavior</p>
-
-          <ul>
-
-          <p>Render the starting <code>&lt;head&gt;</code> element tag.  Any attributes declared on the element must be passed through
-          unmodified to the rendered output.
-          Just before rendering the
-          closing <code>&lt;/head&gt;</code> element tag, render any resources that have been targeted
-          for this "head" element:
-          <ul>
-          <li>Obtain a <code>UIViewRoot</code> instance.</li>
-          <li>Obtain a <code>List</code> of component resources targeted for
-          this "head" element with a call to <code>UIViewRoot.getComponentResources()</code>
-          with the <code>String "head"</code> as the argument.</li>
-          <li>Iterate over the returned <code>List</code> of <code>UIComponent</code> instances
-          and call <code>encodeAll</code> on each <code>UIComponent</code> instance.
-
-          <p>Any attributes declared on the element must be passed through
-          unmodified to the rendered output.</p>
-
-          </ul>
-          Render the ending <code>&lt;/head&gt;</code> element tag.</p>
-
-           ]]>
-        </description>
-        <tag-name>
-            head
-        </tag-name>
-        <component>
-            <component-type>javax.faces.Output</component-type>
-            <renderer-type>javax.faces.Head</renderer-type>
-        </component>
-        <attribute>
-            <description>
-                <![CDATA[Direction indication for text that does not inherit directionality.
-              Valid values are "LTR" (left-to-right) and "RTL" (right-to-left).]]>
-            </description>
-            <name>
-                dir
-            </name>
-            <required>
-                false
-            </required>
-            <type>
-                java.lang.String
-            </type>
-        </attribute>
-        <attribute>
-            <description>
-                <![CDATA[Code describing the language used in the generated markup
-              for this component.]]>
-            </description>
-            <name>
-                lang
-            </name>
-            <required>
-                false
-            </required>
-            <type>
-                java.lang.String
-            </type>
-        </attribute>
-        <attribute>
-            <description>
-                The ValueExpression linking this component to a property in a
-                backing bean
-            </description>
-            <name>
-                binding
-            </name>
-            <required>
-                false
-            </required>
-            <type>
-                javax.faces.component.UIComponent
-            </type>
-        </attribute>
-    </tag>
-    <tag>
-        <description>
-            <![CDATA[
-
-          <p>Render the markup for a <code>&lt;body&gt;</code> element.</p>
-
-          <p>Decode Behavior</p>
-
-          <ul>
-
-          <p>No action is required during decode for this renderer.</p>
-
-          </ul>
-
-          <p>Encode Behavior</p>
-
-          <ul>
-
-          <p>Render the starting <code>&lt;body&gt;</code> element tag. Just before rendering the
-          closing <code>&lt;/body&gt;</code> element tag, render any resources that have been targeted
-          for this "body" element:
-          <ul>
-          <li>Obtain a <code>UIViewRoot</code> instance.</li>
-
-          <li>Obtain a <code>List</code> of component resources targeted for
-          this "body" element with a call to
-          <code>UIViewRoot.getComponentResources()</code> with the
-          <code>String "body"</code> as the argument.  Render the ending
-          <code>&lt;/body&gt;</code> element tag.</li>
-
-          <li>Iterate over the returned <code>List</code> of <code>UIComponent</code> instances
-          and call <code>encodeAll</code> on each <code>UIComponent</code> instance.
-          </ul>
-
-          <p>Any attributes declared on the element must be passed through
-          unmodified to the rendered output.</p>
-
-          ]]>
-        </description>
-        <tag-name>
-            body
-        </tag-name>
-        <component>
-            <component-type>javax.faces.Output</component-type>
-            <renderer-type>javax.faces.Body</renderer-type>
-        </component>
-        <attribute>
-            <description>
-                <![CDATA[Direction indication for text that does not inherit directionality.
-              Valid values are "LTR" (left-to-right) and "RTL" (right-to-left).]]>
-            </description>
-            <name>
-                dir
-            </name>
-            <required>
-                false
-            </required>
-            <type>
-                java.lang.String
-            </type>
-        </attribute>
-        <attribute>
-            <description>
-                <![CDATA[Code describing the language used in the generated markup
-              for this component.]]>
-            </description>
-            <name>
-                lang
-            </name>
-            <required>
-                false
-            </required>
-            <type>
-                java.lang.String
-            </type>
-        </attribute>
-        <attribute>
-            <description>
-                <![CDATA[Javascript code executed when a pointer button is
-              clicked over this element.]]>
-            </description>
-            <name>
-                onclick
-            </name>
-            <required>
-                false
-            </required>
-            <type>
-                java.lang.String
-            </type>
-        </attribute>
-        <attribute>
-            <description>
-                <![CDATA[Javascript code executed when a pointer button is
-              double clicked over this element.]]>
-            </description>
-            <name>
-                ondblclick
-            </name>
-            <required>
-                false
-            </required>
-            <type>
-                java.lang.String
-            </type>
-        </attribute>
-        <attribute>
-            <description>
-                <![CDATA[Javascript code executed when a key is
-              pressed down over this element.]]>
-            </description>
-            <name>
-                onkeydown
-            </name>
-            <required>
-                false
-            </required>
-            <type>
-                java.lang.String
-            </type>
-        </attribute>
-        <attribute>
-            <description>
-                <![CDATA[Javascript code executed when a key is
-              pressed and released over this element.]]>
-            </description>
-            <name>
-                onkeypress
-            </name>
-            <required>
-                false
-            </required>
-            <type>
-                java.lang.String
-            </type>
-        </attribute>
-        <attribute>
-            <description>
-                <![CDATA[Javascript code executed when a key is
-              released over this element.]]>
-            </description>
-            <name>
-                onkeyup
-            </name>
-            <required>
-                false
-            </required>
-            <type>
-                java.lang.String
-            </type>
-        </attribute>
-        <attribute>
-            <description>
-                <![CDATA[Javascript code executed when the user agent finishes loading
-              a window or all frames within a frameset.]]>
-            </description>
-            <name>
-                onload
-            </name>
-            <required>
-                false
-            </required>
-            <type>
-                java.lang.String
-            </type>
-        </attribute>
-        <attribute>
-            <description>
-                <![CDATA[Javascript code executed when a pointer button is
-              pressed down over this element.]]>
-            </description>
-            <name>
-                onmousedown
-            </name>
-            <required>
-                false
-            </required>
-            <type>
-                java.lang.String
-            </type>
-        </attribute>
-        <attribute>
-            <description>
-                <![CDATA[Javascript code executed when a pointer button is
-              moved within this element.]]>
-            </description>
-            <name>
-                onmousemove
-            </name>
-            <required>
-                false
-            </required>
-            <type>
-                java.lang.String
-            </type>
-        </attribute>
-        <attribute>
-            <description>
-                <![CDATA[Javascript code executed when a pointer button is
-              moved away from this element.]]>
-            </description>
-            <name>
-                onmouseout
-            </name>
-            <required>
-                false
-            </required>
-            <type>
-                java.lang.String
-            </type>
-        </attribute>
-        <attribute>
-            <description>
-                <![CDATA[Javascript code executed when a pointer button is
-              moved onto this element.]]>
-            </description>
-            <name>
-                onmouseover
-            </name>
-            <required>
-                false
-            </required>
-            <type>
-                java.lang.String
-            </type>
-        </attribute>
-        <attribute>
-            <description>
-                <![CDATA[Javascript code executed when a pointer button is
-              released over this element.]]>
-            </description>
-            <name>
-                onmouseup
-            </name>
-            <required>
-                false
-            </required>
-            <type>
-                java.lang.String
-            </type>
-        </attribute>
-        <attribute>
-            <description>
-                <![CDATA[Javascript code executed when the user agent removes
-              a document from a window or frame.]]>
-            </description>
-            <name>
-                onunload
-            </name>
-            <required>
-                false
-            </required>
-            <type>
-                java.lang.String
-            </type>
-        </attribute>
-        <attribute>
-            <description>
-                <![CDATA[CSS style(s) to be applied when this component is rendered.]]>
-            </description>
-            <name>
-                style
-            </name>
-            <required>
-                false
-            </required>
-            <type>
-                java.lang.String
-            </type>
-        </attribute>
-        <attribute>
-            <description>
-                <![CDATA[Space-separated list of CSS style class(es) to be applied when
-              this element is rendered.  This value must be passed through
-              as the "class" attribute on generated markup.]]>
-            </description>
-            <name>
-                styleClass
-            </name>
-            <required>
-                false
-            </required>
-            <type>
-                java.lang.String
-            </type>
-        </attribute>
-        <attribute>
-            <description>
-                <![CDATA[Advisory title information about markup elements generated
-              for this component.]]>
-            </description>
-            <name>
-                title
-            </name>
-            <required>
-                false
-            </required>
-            <type>
-                java.lang.String
-            </type>
-        </attribute>
-        <attribute>
-            <description>
-                The ValueExpression linking this component to a property in a
-                backing bean
-            </description>
-            <name>
-                binding
-            </name>
-            <required>
-                false
-            </required>
-            <type>
-                javax.faces.component.UIComponent
-            </type>
-        </attribute>
-    </tag>
-    <tag>
-        <description>
-            &lt;p&gt;&lt;span
-            class="changed_modified_2_0"&gt;Renders an HTML "input"
-            element.&lt;/p&gt;
-            &lt;p&gt;Decode Behavior&lt;/p&gt;
-            &lt;ul&gt;
-            &lt;p&gt;Obtain the &lt;code&gt;Map&lt;/code&gt; from the
-            "requestParameterMap"
-            property of the &lt;code&gt;ExternalContext&lt;/code&gt;. If the
-            value in the
-            &lt;code&gt;Map&lt;/code&gt; for the value of the "clientId"
-            property of the
-            component is &lt;code&gt;null&lt;/code&gt;, create a String by
-            concatenating
-            the value of the "clientId" property of the component with the
-            String ".x" (without the quotes). Create another String in the
-            same manner, but concatenate ".y" (without the quotes). If
-            &lt;code&gt;null&lt;/code&gt; is the value in the &lt;code&gt;Map&lt;/code&gt;
-            for both
-            Strings, return from &lt;code&gt;decode()&lt;/code&gt;. If the value
-            in the
-            &lt;code&gt;Map&lt;/code&gt; for the value of the "clientId"
-            property of the
-            component is not &lt;code&gt;null&lt;/code&gt;, get the value of the
-            "type"
-            attribute, and convert it to lower case. If the result is equal
-            to the String "reset" (without the quotes), return from
-            &lt;code&gt;decode()&lt;/code&gt;. Otherwise, create a
-            &lt;code&gt;javax.faces.event.ActionEvent&lt;/code&gt; around the
-            component,
-            and pass it to the &lt;code&gt;queueEvent()&lt;/code&gt; method of
-            the
-            component, which must be an instance of
-            &lt;code&gt;UICommand&lt;/code&gt;.&lt;/p&gt;
-            &lt;/ul&gt;
-            &lt;p&gt;Encode Behavior&lt;/p&gt;
-            &lt;ul&gt;
-            &lt;p&gt;Render the clientId of the component as the value of the
-            "name"
-            attribute. Render the current value of the component as the value
-            of the "value" attribute. If "image" attribute is specified render
-            it as the value of the "src" attribute after passing it to the
-            &lt;code&gt;getResourceURL()&lt;/code&gt; method of the
-            &lt;code&gt;ViewHandler&lt;/code&gt; for this application, and
-            passing the
-            result through the &lt;code&gt;encodeResourceURL()&lt;/code&gt;
-            method of the
-            &lt;code&gt;ExternalContext&lt;/code&gt;. &lt;span
-            class="changed_added_2_0"&gt;Note that calling
-            &lt;code&gt;getResourceURL()&lt;/code&gt; will prefix the
-            context-root of the
-            current application if the value of the "src" attribute starts
-            with "/".&lt;/span&gt; When handling the "image" attribute, the
-            value must not
-            be escaped. For example, &lt;code&gt;&amp;&lt;/code&gt; must not be
-            turned into
-            &lt;code&gt;&amp;amp;amp;&lt;/code&gt;. If the "styleClass"
-            attribute is
-            specified, render its value as the value of the "class" attribute.
-            If the user has specified an "onclick" attribute, append that
-            JavaScript to any existing JavaScript before rendering.&lt;/p&gt;
-            &lt;p class="changed_added_2_0"&gt;If the component being rendered
-            by
-            this renderer has any &lt;code&gt;UIParameter&lt;/code&gt; children,
-            each one
-            of them must be rendered using the renderer for component-family:
-            "javax.faces.Input" and renderer-type: "javax.faces.Hidden". For
-            discussion, this is called the hiddenRenderer. A component with
-            component-type "javax.faces.Input" must be created for local use
-            in rendering each &lt;code&gt;UIParameter&lt;/code&gt; child. The
-            "id"
-            property of the temporary component must be set to the "name" of
-            the &lt;code&gt;UIParameter&lt;/code&gt;. The "value" property of
-            the
-            temporary component must be set to the "value" of the
-            &lt;code&gt;UIParameter&lt;/code&gt;. For each &lt;code&gt;UIParameter&lt;/code&gt;
-            child, the hiddenRenderer must have its
-            &lt;code&gt;encodeBegin()&lt;/code&gt;, &lt;code&gt;encodeChildren()&lt;/code&gt;,
-            and
-            &lt;code&gt;encodeEnd()&lt;/code&gt; methods called, in order,
-            passing the
-            temporary component as the second argument.&lt;/p&gt;
-            &lt;/ul&gt;
-        </description>
-        <tag-name>commandButton</tag-name>
-        <component>
-            <component-type>javax.faces.HtmlCommandButton</component-type>
-            <renderer-type>javax.faces.Button</renderer-type>
-        </component>
-        <attribute>
-            <description>
-                MethodExpression representing the application action to invoke
-                when this component is activated by the user. The expression
-                must evaluate to a public method that takes no parameters, and
-                returns an Object (the toString() of which is called to derive
-                the logical outcome) which is passed to the NavigationHandler
-                for this application.
-            </description>
-            <name>action</name>
-            <required>false</required>
-            <method-signature>java.lang.Object action()</method-signature>
-        </attribute>
-        <attribute>
-            <description>
-                &lt;p&gt;
-                MethodExpression representing an action listener method that
-                will be notified when this component is activated by the user.
-                The expression must evaluate to a public method that takes an
-                ActionEvent parameter, with a return type of void, &lt;span
-                class="changed_added_2_0"&gt;or to a public method that takes no
-                arguments with a return type of void. In the latter case, the
-                method has no way of easily knowing where the event came from,
-                but this can be useful in cases where a notification is needed
-                that "some action happened".&lt;/span&gt;
-                &lt;/p&gt;
-            </description>
-            <name>actionListener</name>
-            <required>false</required>
-            <method-signature>void actionListener(javax.faces.event.ActionEvent)
-            </method-signature>
-        </attribute>
-        <attribute>
-            <description>
-                The component identifier for this component. This value must be
-                unique within the closest parent component that is a naming
-                container.
-            </description>
-            <name>id</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Flag indicating that, if this component is activated by the
-                user,
-                notifications should be delivered to interested listeners and
-                actions
-                immediately (that is, during Apply Request Values phase) rather
-                than
-                waiting until Invoke Application phase.
-            </description>
-            <name>immediate</name>
-            <required>false</required>
-            <type>boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-                Flag indicating whether or not this component should be rendered
-                (during Render Response Phase), or processed on any subsequent
-                form submit. The default value for this property is true.
-            </description>
-            <name>rendered</name>
-            <required>false</required>
-            <type>boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-                The current value of this component.
-            </description>
-            <name>value</name>
-            <required>false</required>
-            <type>java.lang.Object</type>
-        </attribute>
-        <attribute>
-            <description>
-                Access key that, when pressed, transfers focus
-                to this element.
-            </description>
-            <name>accesskey</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Alternate textual description of the
-                element rendered by this component.
-            </description>
-            <name>alt</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Direction indication for text that does not inherit
-                directionality.
-                Valid values are "LTR" (left-to-right) and "RTL"
-                (right-to-left).
-            </description>
-            <name>dir</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Flag indicating that this element must never receive focus or
-                be included in a subsequent submit. A value of false causes
-                no attribute to be rendered, while a value of true causes the
-                attribute to be rendered as disabled="disabled".
-            </description>
-            <name>disabled</name>
-            <required>false</required>
-            <type>boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-                &lt;p&gt;
-                Absolute or relative URL of the
-                image to be displayed for this
-                button. If specified, this
-                "input" element will be of type
-                "image". Otherwise, it will be
-                of the type specified by the
-                "type" property with a label
-                specified by the "value"
-                property. &lt;span
-                class="changed_added_2_0"&gt;Note
-                that if the value of this
-                attribute starts with "/", the
-                rendered value for this
-                attribute will be prefixed with
-                the context-root for this
-                application.&lt;/span&gt;
-                &lt;/p&gt;
-            </description>
-            <name>image</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                A localized user presentable name for this component.
-            </description>
-            <name>label</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Code describing the language used in the generated markup
-                for this component.
-            </description>
-            <name>lang</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when this element loses focus.
-            </description>
-            <name>onblur</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when this element loses focus
-                and its value has been modified since gaining focus.
-            </description>
-            <name>onchange</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                clicked over this element.
-            </description>
-            <name>onclick</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                double clicked over this element.
-            </description>
-            <name>ondblclick</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when this element receives focus.
-            </description>
-            <name>onfocus</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a key is
-                pressed down over this element.
-            </description>
-            <name>onkeydown</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a key is
-                pressed and released over this element.
-            </description>
-            <name>onkeypress</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a key is
-                released over this element.
-            </description>
-            <name>onkeyup</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                pressed down over this element.
-            </description>
-            <name>onmousedown</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                moved within this element.
-            </description>
-            <name>onmousemove</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                moved away from this element.
-            </description>
-            <name>onmouseout</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                moved onto this element.
-            </description>
-            <name>onmouseover</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                released over this element.
-            </description>
-            <name>onmouseup</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when text within this
-                element is selected by the user.
-            </description>
-            <name>onselect</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Flag indicating that this component will prohibit changes by
-                the user. The element may receive focus unless it has also
-                been disabled. A value of false causes
-                no attribute to be rendered, while a value of true causes the
-                attribute to be rendered as readonly="readonly".
-            </description>
-            <name>readonly</name>
-            <required>false</required>
-            <type>boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-                CSS style(s) to be applied when this component is rendered.
-            </description>
-            <name>style</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Space-separated list of CSS style class(es) to be applied when
-                this element is rendered. This value must be passed through
-                as the "class" attribute on generated markup.
-            </description>
-            <name>styleClass</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Position of this element in the tabbing order
-                for the current document. This value must be
-                an integer between 0 and 32767.
-            </description>
-            <name>tabindex</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Advisory title information about markup elements generated
-                for this component.
-            </description>
-            <name>title</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Type of button to create. Valid values are "submit", "button",
-                and "reset". If not specified, or not a valid value, the default
-                value is "submit".
-            </description>
-            <name>type</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                The ValueExpression linking this component to a property in a
-                backing bean
-            </description>
-            <name>binding</name>
-            <required>false</required>
-            <type>javax.faces.component.UIComponent</type>
-        </attribute>
-    </tag>
-    <tag>
-        <description>
-            &lt;p&gt;&lt;span
-            class="changed_modified_2_0"&gt;Render&lt;/span&gt; an HTML "a"
-            anchor
-            element that acts like a form submit button when
-            clicked.&lt;/p&gt;
-            &lt;p&gt;General Behaviour&lt;/p&gt;
-            &lt;p&gt;Both the encode and decode behavior require the ability to
-            get
-            the id/name for a hidden field, &lt;span
-            class="changed_added_2_0"&gt;which may be rendered in markup or
-            which
-            may be programmatically added via client DOM manipulation&lt;/span&gt;,
-            whose value is set by the JavaScript form submit. This name must
-            be constructed as follows:&lt;/p&gt;
-            &lt;ul&gt;
-            &lt;li&gt;&lt;p&gt;Get the clientId for the form of which this
-            component is a
-            child.&lt;/p&gt;&lt;/li&gt;
-            &lt;li&gt;&lt;p&gt;Append
-            &lt;code&gt;NamingContainer.SEPARATOR_CHAR&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
-            &lt;li&gt;&lt;p&gt;Append a constant string that is the same for all
-            command
-            link components in the tree.&lt;/p&gt;&lt;/li&gt;
-            &lt;/ul&gt;
-            &lt;p&gt;In the following text, this String is called
-            hiddenFieldName.&lt;/p&gt;
-            &lt;p&gt;Decode Behavior&lt;/p&gt;
-            &lt;ul&gt;
-            &lt;p&gt;Obtain the "clientId" property of the component. Obtain the
-            &lt;code&gt;Map&lt;/code&gt; from the "requestParameterMap" property
-            of the
-            &lt;code&gt;ExternalContext&lt;/code&gt;. Derive hiddenFieldName as
-            above.
-            Get the entry in the &lt;code&gt;Map&lt;/code&gt; under the key that
-            is the
-            hiddenFieldName. If the there is no entry, or the entry is the
-            empty String, or the entry is not equal to the value of the
-            "clientId" property, return immediately. If there is an entry,
-            and its value is equal to the value of the "clientId" property,
-            create a new &lt;code&gt;javax.faces.event.ActionEvent&lt;/code&gt;
-            instance
-            around the component and call &lt;code&gt;queueActionEvent()&lt;/code&gt;
-            on
-            the component, passing the event.&lt;/p&gt;
-            &lt;/ul&gt;
-            &lt;p&gt;Encode Behavior&lt;/p&gt;
-            &lt;ul&gt;
-            &lt;p&gt;If the value of the &lt;code&gt;disabled&lt;/code&gt;
-            attribute is
-            &lt;code&gt;true&lt;/code&gt;, render a span element. Render all the
-            passthru
-            attributes and the &lt;code&gt;target&lt;/code&gt; attribute as
-            pass-through
-            attributes on the span, even though the &lt;code&gt;target&lt;/code&gt;
-            attribute will have no effect on a span. Render the current value
-            of the component as the content of the span. Return.&lt;/p&gt;
-            &lt;p&gt;If the &lt;code&gt;disabled&lt;/code&gt; attribute is not
-            present, or its
-            value is &lt;code&gt;false&lt;/code&gt;, render an HTML &lt;code&gt;a&lt;/code&gt;
-            element. Render "#" as the value of the "href" attribute. Render
-            the current value of the component as the link text if it is
-            specified. Render JavaScript that is functionally equivalent to
-            the following as the value of the "onclick" attribute:&lt;/p&gt;
-            &lt;p&gt;&lt;code&gt;document.forms['CLIENT_ID']['hiddenFieldName'].value='CLIENT_ID';
-            document.forms['CLIENT_ID']['PARAM1_NAME'].value='PARAM1_VALUE';
-            document.forms['CLIENT_ID']['PARAM2_NAME'].value='PARAM2_VALUE';
-            return false;&lt;/code&gt;&lt;/p&gt;
-            &lt;p&gt;document.forms['CLIENT_ID'].submit()" where hiddenFieldName
-            is
-            as described above, CLIENT_ID is the clientId of the UICommand
-            component, PARAM*_NAME and PARAM*_VALUE are the names and values,
-            respectively, of any nested UIParameter children. The name and
-            the value must be URLEncoded. If an "onclick" attribute was
-            specified by the user, render this JavaScript in a function,
-            and render the user's JavaScript in a function. Render both
-            functions
-            in a choice function as follows:&lt;/p&gt;
-            &lt;p&gt;&lt;code&gt;var a=function(){#USER_FUNCTION#};
-            var b=function(){#JSF_FUNCTION#};
-            return (a()==false) ? false : b();&lt;/code&gt;&lt;/p&gt;
-            &lt;p&gt;where #USER_FUNCTION# is the user's JavaScript and
-            #JSF_FUNCTION# is the JavaScript rendered by JSF. The choice
-            function should operate such that if the user's JavaScript returns
-            true, then the rendered JavaScript will also execute.&lt;/p&gt;
-            &lt;p&gt;If the "styleClass" attribute is specified, render its
-            value as
-            the value of the "class" attribute. Render any non-UIParameter
-            output children as normal inside of the "a" element. These will
-            appear as the link text. Allow the form renderer to output a
-            single "input" element (for the entire page, regardless of how
-            many command link components are in the page) of "type" "hidden"
-            whose "name" is the value of hiddenFieldName, and which must not
-            have a "value" attribute. Multiple occurrences of command link
-            components in the tree should not cause multiple hiddenFieldName
-            hidden fields. Allow the form renderer to output an "input"
-            element of "type" "hidden" for each of the nested UIParameter
-            children, taking the name property (but not the value) from each
-            one in turn. If the "disabled" attribute is specified, do not
-            render the HTML "a" anchor element or its "href" attribute.
-            Instead, render a "span" element. If the "styleClass" attribute
-            is specified, render its value as the value of the "class"
-            attribute on the "span". Render any pass-through attributes on
-            the "span". The content of the span element comes from the value
-            of the component or its children as specified above.&lt;/p&gt;
-            &lt;p&gt;If the user specified a &lt;code&gt;target&lt;/code&gt;
-            attribute, its
-            value must be set using javascript since the &lt;code&gt;onclick&lt;/code&gt;
-            handler will prevent the target attribute from being generated.
-            This must be accomplished using JavaScript that is equivalent to
-            the following.&lt;/p&gt;
-            &lt;p&gt;&lt;code&gt;document.forms['CLIENT_ID'].target='TARGET';&lt;/code&gt;&lt;/p&gt;
-            &lt;p&gt;Where TARGET is the value of the target attribute on the
-            JSP
-            tag.&lt;/p&gt;
-            &lt;/ul&gt;
-        </description>
-        <tag-name>commandLink</tag-name>
-        <component>
-            <component-type>javax.faces.HtmlCommandLink</component-type>
-            <renderer-type>javax.faces.Link</renderer-type>
-        </component>
-        <attribute>
-            <description>
-                MethodExpression representing the application action to invoke
-                when this component is activated by the user. The expression
-                must evaluate to a public method that takes no parameters, and
-                returns an Object (the toString() of which is called to derive
-                the logical outcome) which is passed to the NavigationHandler
-                for this application.
-            </description>
-            <name>action</name>
-            <required>false</required>
-            <method-signature>java.lang.Object action()</method-signature>
-        </attribute>
-        <attribute>
-            <description>
-                &lt;p&gt;
-                MethodExpression representing an action listener method that
-                will be notified when this component is activated by the user.
-                The expression must evaluate to a public method that takes an
-                ActionEvent parameter, with a return type of void, &lt;span
-                class="changed_added_2_0"&gt;or to a public method that takes no
-                arguments with a return type of void. In the latter case, the
-                method has no way of easily knowing where the event came from,
-                but this can be useful in cases where a notification is needed
-                that "some action happened".&lt;/span&gt;
-                &lt;/p&gt;
-            </description>
-            <name>actionListener</name>
-            <required>false</required>
-            <method-signature>void actionListener(javax.faces.event.ActionEvent)
-            </method-signature>
-        </attribute>
-        <attribute>
-            <description>
-                The component identifier for this component. This value must be
-                unique within the closest parent component that is a naming
-                container.
-            </description>
-            <name>id</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Flag indicating that, if this component is activated by the
-                user,
-                notifications should be delivered to interested listeners and
-                actions
-                immediately (that is, during Apply Request Values phase) rather
-                than
-                waiting until Invoke Application phase.
-            </description>
-            <name>immediate</name>
-            <required>false</required>
-            <type>boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-                Flag indicating whether or not this component should be rendered
-                (during Render Response Phase), or processed on any subsequent
-                form submit. The default value for this property is true.
-            </description>
-            <name>rendered</name>
-            <required>false</required>
-            <type>boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-                The current value of this component.
-            </description>
-            <name>value</name>
-            <required>false</required>
-            <type>java.lang.Object</type>
-        </attribute>
-        <attribute>
-            <description>
-                Access key that, when pressed, transfers focus
-                to this element.
-            </description>
-            <name>accesskey</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                The character encoding of the resource designated
-                by this hyperlink.
-            </description>
-            <name>charset</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                The position and shape of the hot spot on the screen
-                (for use in client-side image maps).
-            </description>
-            <name>coords</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Direction indication for text that does not inherit
-                directionality.
-                Valid values are "LTR" (left-to-right) and "RTL"
-                (right-to-left).
-            </description>
-            <name>dir</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Flag indicating that this element must never
-                receive focus or be included in a subsequent
-                submit.
-            </description>
-            <name>disabled</name>
-            <required>false</required>
-            <type>boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-                The language code of the resource designated
-                by this hyperlink.
-            </description>
-            <name>hreflang</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Code describing the language used in the generated markup
-                for this component.
-            </description>
-            <name>lang</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when this element loses focus.
-            </description>
-            <name>onblur</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                clicked over this element.
-            </description>
-            <name>onclick</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                double clicked over this element.
-            </description>
-            <name>ondblclick</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when this element receives focus.
-            </description>
-            <name>onfocus</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a key is
-                pressed down over this element.
-            </description>
-            <name>onkeydown</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a key is
-                pressed and released over this element.
-            </description>
-            <name>onkeypress</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a key is
-                released over this element.
-            </description>
-            <name>onkeyup</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                pressed down over this element.
-            </description>
-            <name>onmousedown</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                moved within this element.
-            </description>
-            <name>onmousemove</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                moved away from this element.
-            </description>
-            <name>onmouseout</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                moved onto this element.
-            </description>
-            <name>onmouseover</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                released over this element.
-            </description>
-            <name>onmouseup</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                The relationship from the current document
-                to the anchor specified by this hyperlink.
-                The value of this attribute is a space-separated
-                list of link types.
-            </description>
-            <name>rel</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                A reverse link from the anchor specified
-                by this hyperlink to the current document.
-                The value of this attribute is a space-separated
-                list of link types.
-            </description>
-            <name>rev</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                The shape of the hot spot on the screen
-                (for use in client-side image maps). Valid
-                values are: default (entire region); rect
-                (rectangular region); circle (circular region);
-                and poly (polygonal region).
-            </description>
-            <name>shape</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                CSS style(s) to be applied when this component is rendered.
-            </description>
-            <name>style</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Space-separated list of CSS style class(es) to be applied when
-                this element is rendered. This value must be passed through
-                as the "class" attribute on generated markup.
-            </description>
-            <name>styleClass</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Position of this element in the tabbing order
-                for the current document. This value must be
-                an integer between 0 and 32767.
-            </description>
-            <name>tabindex</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Name of a frame where the resource
-                retrieved via this hyperlink is to
-                be displayed.
-            </description>
-            <name>target</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Advisory title information about markup elements generated
-                for this component.
-            </description>
-            <name>title</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                The content type of the resource designated
-                by this hyperlink.
-            </description>
-            <name>type</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                The ValueExpression linking this component to a property in a
-                backing bean
-            </description>
-            <name>binding</name>
-            <required>false</required>
-            <type>javax.faces.component.UIComponent</type>
-        </attribute>
-    </tag>
-    <tag>
-        <description>
-            &lt;p&gt;Renders an HTML "table" element compliant with the HTML 401
-            specification. Render the "caption" facet, if present, inside a
-            "caption" element immediately below the "table" element. If the
-            "captionClass" attribute is specified, render its value as the
-            value of the "class" attribute on the "caption" element. If the
-            "captionStyle" attribute is specified, render its value as the
-            value of the "style" attribute on the "caption" element.&lt;/p&gt;
-            &lt;p&gt;Please consult the javadoc for &lt;code&gt;UIData&lt;/code&gt;
-            to
-            supplement this specification. If the "styleClass" attribute is
-            specified, render its value as the value of the "class" attribute
-            on the "table" element. Any pass-through attributes are also
-            rendered on the "table" element. &lt;/p&gt;
-            &lt;p&gt;Column Groups&lt;/p&gt;
-            &lt;ul&gt;
-            &lt;p&gt;If the &lt;code&gt;UIData&lt;/code&gt; component has a
-            "colgroups" facet,
-            render its contents. Consistent with the rules of facets in
-            general, this facet must have only one child. In general, this
-            will be a &lt;code&gt;panel group&lt;/code&gt; component that will
-            contain
-            &lt;code&gt;colgroup&lt;/code&gt; and &lt;code&gt;col&lt;/code&gt;
-            elements per the HTML
-            Table specification. Use of column grouping can improve
-            accessibility. This facet must be rendered before the table
-            header and footer.&lt;/p&gt;
-            &lt;/ul&gt;
-            &lt;p&gt;Rendering the header&lt;/p&gt;
-            &lt;ul&gt;
-            &lt;p&gt;If the &lt;code&gt;UIData&lt;/code&gt; component has a
-            "header" facet, or
-            any of the child &lt;code&gt;UIColumn&lt;/code&gt; components has a
-            "header"
-            facet, render a "thead" element. If the &lt;code&gt;UIData&lt;/code&gt;
-            component has a "header" facet, encode its contents inside of "tr"
-            and "th" elements, respectively. Output the value of the
-            "headerClass" attribute of the &lt;code&gt;UIData&lt;/code&gt;
-            component, if
-            present, as the value of the "class" attribute on the "th".
-            Output the number of child &lt;code&gt;UIColumn&lt;/code&gt;
-            components of the
-            &lt;code&gt;UIData&lt;/code&gt; component as the value of the
-            "colspan"
-            attribute on the "th". Output "colgroup" as the value of the
-            "scope" attribute on the "th" element. &lt;/p&gt;
-            &lt;p&gt;If any of the child &lt;code&gt;UIColumn&lt;/code&gt;
-            components has a
-            "header" facet render a "tr" element. For each
-            &lt;code&gt;UIColumn&lt;/code&gt; that actually has a "header"
-            facet, render
-            it inside of a "th" element. Columns that don't have a "header"
-            facet cause an empty "th" element to be rendered. Output the
-            value of the "headerClass" attribute of the &lt;code&gt;UIColumn&lt;/code&gt;
-            component, if present, as the value of the "class" attribute on
-            the "th". If the "headerClass" attribute of the &lt;code&gt;UIColumn&lt;/code&gt;
-            component is not present, output the value of the "headerClass"
-            attribute of the &lt;code&gt;UIData&lt;/code&gt; component, if
-            present, as
-            the value of the "class" attribute on the "th". Output "col" as
-            the value of the "scope" attribute on the "th" element.
-            &lt;/p&gt;
-            &lt;p&gt;Close out the "thead" element.&lt;/p&gt;
-            &lt;/ul&gt;
-            &lt;p&gt;Rendering the footer&lt;/p&gt;
-            &lt;ul&gt;
-            &lt;p&gt;Follow the same process as for the header, except replace
-            "header" with "footer", "th" with "td", "thead" with "tfoot", and
-            "headerClass" with "footerClass". Do not render any "scope"
-            attribute for the footer.&lt;/p&gt;
-            &lt;/ul&gt;
-            &lt;p&gt;Rendering the table body&lt;/p&gt;
-            &lt;ul&gt;
-            &lt;p&gt;Look at the value of the "bodyrows" attribute. If present,
-            this must be a comma separated list of integers. Each entry in
-            this list is the row index of the row before which a "tbody"
-            element should be rendered.&lt;/p&gt;
-            &lt;p&gt;If there was no "bodyrows" attribute, or it was empty,
-            render a
-            "tbody" element. Keep track of the result of the "rows" property
-            on the &lt;code&gt;UIData&lt;/code&gt; component. Keep track of the
-            number of
-            rows we have rendered so far. Iterate through the rows. Set the
-            "rowIndex" property of the &lt;code&gt;UIData&lt;/code&gt; component
-            to be
-            correct as we iterate through the rows. Stop rendering children
-            and close out the "tbody" element if the "rowAvailable" property
-            of the &lt;code&gt;UIData&lt;/code&gt; returned false. If the
-            current row
-            index is contained in the "bodyrows" attribute, check if a "tbody"
-            start element was rendered that needs to be closed, and if so,
-            close the "tbody" element. Then render a "tbody" element start.
-            Otherwise, do not render a "tbody" element.&lt;/p&gt;
-            &lt;p&gt;Output a "tr" element. Output the value of the "rowClasses"
-            per the attribute description below. For each
-            &lt;code&gt;UIColumn&lt;/code&gt; child, if the column component has
-            a
-            "rowHeader" attribute with a value of "true", output a "th"
-            element with a "scope" attribute with the value of "row".
-            Otherwise, if the column component has no "rowHeader" attribute,
-            or its value is false, output a "td" element. In either case
-            attach the value of the "columnClasses" attribute of the
-            &lt;code&gt;UIData&lt;/code&gt; component per the attribute
-            description below.
-            Recursively encode each child of each &lt;code&gt;UIColumn&lt;/code&gt;
-            child.
-            Close out the "td" or "th" element. When done with the row, close
-            out the "tr" element. When done with all the rows, close out the
-            "tbody" element.&lt;/p&gt;
-            &lt;/ul&gt;
-            &lt;p&gt;When done rendering all the rows, set the "rowIndex"
-            property of
-            the &lt;code&gt;UIData&lt;/code&gt; to -1, and close out the "table"
-            element.&lt;/p&gt;
-        </description>
-        <tag-name>dataTable</tag-name>
-        <component>
-            <component-type>javax.faces.HtmlDataTable</component-type>
-            <renderer-type>javax.faces.Table</renderer-type>
-        </component>
-        <attribute>
-            <description>
-                Zero-relative row number of the first row to be displayed. If
-                this
-                property is set to zero, rendering will begin with the first row
-                of
-                the underlying data.
-            </description>
-            <name>first</name>
-            <required>false</required>
-            <type>int</type>
-        </attribute>
-        <attribute>
-            <description>
-                The component identifier for this component. This value must be
-                unique within the closest parent component that is a naming
-                container.
-            </description>
-            <name>id</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Flag indicating whether or not this component should be rendered
-                (during Render Response Phase), or processed on any subsequent
-                form submit. The default value for this property is true.
-            </description>
-            <name>rendered</name>
-            <required>false</required>
-            <type>boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-                The number of rows to display, starting with the one identified
-                by the
-                "first" property. If this value is set to zero, all available
-                rows in
-                the underlying data model will be displayed.
-            </description>
-            <name>rows</name>
-            <required>false</required>
-            <type>int</type>
-        </attribute>
-        <attribute>
-            <description>
-                The current value of this component.
-            </description>
-            <name>value</name>
-            <required>false</required>
-            <type>java.lang.Object</type>
-        </attribute>
-        <attribute>
-            <description>
-                Name of a request-scope attribute under which the model data for
-                the
-                row selected by the current value of the "rowIndex" property
-                (i.e.
-                also the current value of the "rowData" property) will be
-                exposed.
-            </description>
-            <name>var</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Name or code of the background color for this table.
-            </description>
-            <name>bgcolor</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Comma separated list of row indices for which a new
-                "tbody" element should be started (and any
-                previously opened one should be ended).
-            </description>
-            <name>bodyrows</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Width (in pixels) of the border to be drawn
-                around this table.
-            </description>
-            <name>border</name>
-            <required>false</required>
-            <type>int</type>
-        </attribute>
-        <attribute>
-            <description>
-                Space-separated list of CSS style class(es) that will be
-                applied to any caption generated for this table.
-            </description>
-            <name>captionClass</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                CSS style(s) to be applied when this caption is rendered.
-            </description>
-            <name>captionStyle</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Definition of how much space the user agent should
-                leave between the border of each cell and its contents.
-            </description>
-            <name>cellpadding</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Definition of how much space the user agent should
-                leave between the left side of the table and the
-                leftmost column, the top of the table and the top of
-                the top side of the topmost row, and so on for the
-                right and bottom of the table. It also specifies
-                the amount of space to leave between cells.
-            </description>
-            <name>cellspacing</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Comma-delimited list of CSS style classes that will be applied
-                to the columns of this table. A space separated list of
-                classes may also be specified for any individual column. If
-                the number of elements in this list is less than the number of
-                actual column children of the UIData, no "class"
-                attribute is output for each column greater than the number of
-                elements in the list. If the number of elements in the list
-                is greater than the number of actual column children of the
-                UIData, the elements at the posisiton in the list
-                after the last column are ignored.
-            </description>
-            <name>columnClasses</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Direction indication for text that does not inherit
-                directionality.
-                Valid values are "LTR" (left-to-right) and "RTL"
-                (right-to-left).
-            </description>
-            <name>dir</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Space-separated list of CSS style class(es) that will be
-                applied to any footer generated for this table.
-            </description>
-            <name>footerClass</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Code specifying which sides of the frame surrounding
-                this table will be visible. Valid values are:
-                none (no sides, default value); above (top side only);
-                below (bottom side only); hsides (top and bottom sides
-                only); vsides (right and left sides only); lhs (left
-                hand side only); rhs (right hand side only); box
-                (all four sides); and border (all four sides).
-            </description>
-            <name>frame</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Space-separated list of CSS style class(es) that will be
-                applied to any header generated for this table.
-            </description>
-            <name>headerClass</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Code describing the language used in the generated markup
-                for this component.
-            </description>
-            <name>lang</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                clicked over this element.
-            </description>
-            <name>onclick</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                double clicked over this element.
-            </description>
-            <name>ondblclick</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a key is
-                pressed down over this element.
-            </description>
-            <name>onkeydown</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a key is
-                pressed and released over this element.
-            </description>
-            <name>onkeypress</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a key is
-                released over this element.
-            </description>
-            <name>onkeyup</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                pressed down over this element.
-            </description>
-            <name>onmousedown</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                moved within this element.
-            </description>
-            <name>onmousemove</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                moved away from this element.
-            </description>
-            <name>onmouseout</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                moved onto this element.
-            </description>
-            <name>onmouseover</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                released over this element.
-            </description>
-            <name>onmouseup</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Comma-delimited list of CSS style classes that will be applied
-                to the rows of this table. A space separated list of classes
-                may also be specified for any individual row. Thes styles are
-                applied, in turn, to each row in the table. For example, if
-                the list has two elements, the first style class in the list
-                is applied to the first row, the second to the second row, the
-                first to the third row, the second to the fourth row, etc. In
-                other words, we keep iterating through the list until we reach
-                the end, and then we start at the beginning again.
-            </description>
-            <name>rowClasses</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Code specifying which rules will appear between cells
-                within this table. Valid values are: none (no rules,
-                default value); groups (between row groups); rows
-                (between rows only); cols (between columns only); and
-                all (between all rows and columns).
-            </description>
-            <name>rules</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                CSS style(s) to be applied when this component is rendered.
-            </description>
-            <name>style</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Space-separated list of CSS style class(es) to be applied when
-                this element is rendered. This value must be passed through
-                as the "class" attribute on generated markup.
-            </description>
-            <name>styleClass</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Summary of this table's purpose and structure, for
-                user agents rendering to non-visual media such as
-                speech and Braille.
-            </description>
-            <name>summary</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Advisory title information about markup elements generated
-                for this component.
-            </description>
-            <name>title</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Width of the entire table, for visual user agents.
-            </description>
-            <name>width</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                The ValueExpression linking this component to a property in a
-                backing bean
-            </description>
-            <name>binding</name>
-            <required>false</required>
-            <type>javax.faces.component.UIComponent</type>
-        </attribute>
-    </tag>
-    <tag>
-        <description>
-            &lt;span class="changed_modified_2_0"&gt;
-            Renders&lt;/span&gt; an HTML "form" element.
-            &lt;p&gt;Decode Behavior&lt;/p&gt;
-            &lt;ul&gt;
-            &lt;p&gt;Obtain the &lt;code&gt;Map&lt;/code&gt; from the
-            "requestParameterMap"
-            property of the &lt;code&gt;ExternalContext&lt;/code&gt;. If the map
-            contains
-            an entry for the "clientId" of this &lt;code&gt;UIForm&lt;/code&gt;
-            component,
-            call &lt;code&gt;setSubmitted(true)&lt;/code&gt; on the form,
-            otherwise call
-            &lt;code&gt;setSubmitted(false)&lt;/code&gt; on the form.&lt;/p&gt;
-            &lt;/ul&gt;
-            &lt;p&gt;Encode Behavior&lt;/p&gt;
-            &lt;ul&gt;
-            &lt;p&gt;The value of the "method" attribute must be "post". The
-            value
-            of the "action" attribute must be the result of passing the view
-            identifier of the current view to the &lt;code&gt;getActionURL()&lt;/code&gt;
-            method of the &lt;code&gt;ViewHandler&lt;/code&gt; for this
-            application, then
-            passing that String to the &lt;code&gt;encodeActionURL()&lt;/code&gt;
-            method
-            on the &lt;code&gt;ExternalContext&lt;/code&gt;. The value of the
-            acceptcharset
-            attribute must be rendered as the value of "accept-charset".
-            If the "styleClass" attribute is specified, render its value as the
-            value of the "class" attribute. Render a "name"
-            attribute with a value the same as the "id" attribute as described
-            in "&lt;a
-            href="../../../renderkitdocs/HTML_BASIC/renderkit-summary.html#general_encoding"&gt;General
-            Notes on
-            Encoding&lt;/a&gt;" regarding the "id" attribute for UIInput
-            components. &lt;p class="changed_added_2_0"&gt;Obtain the &lt;code&gt;UIViewRoot
-            view identifier&lt;/code&gt; and
-            use it to obtain an &lt;code&gt;action URL&lt;/code&gt; by calling
-            &lt;code&gt;ViewHandler.getActionURL&lt;/code&gt;.
-            Use the &lt;code&gt;action URL&lt;/code&gt; to obtain an &lt;code&gt;encoded
-            action URL&lt;/code&gt; by calling
-            &lt;code&gt;ExternalContext.encodeActionURL&lt;/code&gt;. Obtain an
-            &lt;code&gt;encoded partial action URL&lt;/code&gt; by calling
-            &lt;code&gt;ExternalContext.encodePartialActionURL&lt;/code&gt;
-            using &lt;code&gt;action URL&lt;/code&gt; as the argument.
-            Compare the result from &lt;code&gt;ExternalContext.encodePartialActionURL&lt;/code&gt;
-            with the
-            value from &lt;code&gt;ExternalContext.encodeActionURL()&lt;/code&gt;.
-            If they are different,
-            render a hidden field with the name &lt;code&gt;javax.faces.encodedURL&lt;/code&gt;
-            and the value
-            of this hidden field as the value from &lt;code&gt;ExternalContext.encodePartialActionURL&lt;/code&gt;.&lt;/p&gt;
-            Call &lt;code&gt;ViewHandler.writeState()&lt;/code&gt;
-            before the the close of the "form" element. Render all the
-            necessary hidden fields for all commandLink instances in the page
-            just before the close of the "form" element.
-            &lt;div class="changed_modified_2_0"&gt;
-            Just before rendering the closing &lt;code&gt;&amp;lt;/form&amp;gt;&lt;/code&gt;
-            element tag, render
-            any resources that have been targeted for this form:
-            &lt;ul&gt;
-            &lt;li&gt;Obtain a &lt;code&gt;UIViewRoot&lt;/code&gt; instance.&lt;/li&gt;
-            &lt;li&gt;Obtain a &lt;code&gt;List&lt;/code&gt; of component
-            resources targeted for
-            this form with a call to &lt;code&gt;UIViewRoot.getComponentResources()&lt;/code&gt;
-            with the &lt;code&gt;String "form"&lt;/code&gt; as the argument.&lt;/li&gt;
-            &lt;li&gt;Iterate over the returned &lt;code&gt;List&lt;/code&gt; of
-            &lt;code&gt;UIComponent&lt;/code&gt; instances
-            and call &lt;code&gt;encodeAll&lt;/code&gt; on each &lt;code&gt;UIComponent&lt;/code&gt;
-            instance.
-            &lt;/ul&gt;
-            &lt;/div&gt;
-            &lt;/p&gt;
-            &lt;/ul&gt;
-            &lt;/div&gt;
-        </description>
-        <tag-name>form</tag-name>
-        <component>
-            <component-type>javax.faces.HtmlForm</component-type>
-            <renderer-type>javax.faces.Form</renderer-type>
-        </component>
-        <attribute>
-            <description>
-                The component identifier for this component. This value must be
-                unique within the closest parent component that is a naming
-                container.
-            </description>
-            <name>id</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Flag indicating whether or not this form should prepend its id
-                to its descendent's id during the clientId generation process.
-                If this flag is not set, the default value is true.
-            </description>
-            <name>prependId</name>
-            <required>false</required>
-            <type>boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-                Flag indicating whether or not this component should be rendered
-                (during Render Response Phase), or processed on any subsequent
-                form submit. The default value for this property is true.
-            </description>
-            <name>rendered</name>
-            <required>false</required>
-            <type>boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-                List of content types that a server processing this form
-                will handle correctly
-            </description>
-            <name>accept</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                List of character encodings for input data
-                that are accepted by the server processing
-                this form.
-            </description>
-            <name>acceptcharset</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Direction indication for text that does not inherit
-                directionality.
-                Valid values are "LTR" (left-to-right) and "RTL"
-                (right-to-left).
-            </description>
-            <name>dir</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Content type used to submit the form to the server. If not
-                specified, the default value is
-                "application/x-www-form-urlencoded".
-            </description>
-            <name>enctype</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Code describing the language used in the generated markup
-                for this component.
-            </description>
-            <name>lang</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                clicked over this element.
-            </description>
-            <name>onclick</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                double clicked over this element.
-            </description>
-            <name>ondblclick</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a key is
-                pressed down over this element.
-            </description>
-            <name>onkeydown</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a key is
-                pressed and released over this element.
-            </description>
-            <name>onkeypress</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a key is
-                released over this element.
-            </description>
-            <name>onkeyup</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                pressed down over this element.
-            </description>
-            <name>onmousedown</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                moved within this element.
-            </description>
-            <name>onmousemove</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                moved away from this element.
-            </description>
-            <name>onmouseout</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                moved onto this element.
-            </description>
-            <name>onmouseover</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                released over this element.
-            </description>
-            <name>onmouseup</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when this form is reset.
-            </description>
-            <name>onreset</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when this form is submitted.
-            </description>
-            <name>onsubmit</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                CSS style(s) to be applied when this component is rendered.
-            </description>
-            <name>style</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Space-separated list of CSS style class(es) to be applied when
-                this element is rendered. This value must be passed through
-                as the "class" attribute on generated markup.
-            </description>
-            <name>styleClass</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Name of a frame where the response
-                retrieved after this form submit is to
-                be displayed.
-            </description>
-            <name>target</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Advisory title information about markup elements generated
-                for this component.
-            </description>
-            <name>title</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                The ValueExpression linking this component to a property in a
-                backing bean
-            </description>
-            <name>binding</name>
-            <required>false</required>
-            <type>javax.faces.component.UIComponent</type>
-        </attribute>
-    </tag>
-    <tag>
-        <description>
-            &lt;p&gt;&lt;span
-            class="changed_modified_2_0"&gt;Renders&lt;/span&gt; an HTML "img"
-            element. Render the clientId as the value of the "id"
-            attribute.&lt;/p&gt;
-            &lt;div class="changed_modified_2_0"&gt;
-            &lt;p&gt;Handling the Value&lt;/p&gt;
-            &lt;ul&gt;
-            &lt;p&gt;If the "name" attribute is present, execute algorithm &lt;a
-            href="javax.faces.Outputjavax.faces.resource.Script.html#ResourceCommonGetResource"&gt;Common
-            Algorithm for Obtaining A Resource to Render&lt;/a&gt; to obtain a
-            &lt;code&gt;Resource&lt;/code&gt; instance. Call
-            &lt;code&gt;Resource.getRequestPath()&lt;/code&gt; and output the
-            result as the
-            value of the "src" attribute on the rendered markup.&lt;/p&gt;
-            &lt;p&gt;Otherwise, if the "url" attribute is present, treat its
-            value as
-            if it was the value of the "value" attribute. Otherwise, if the
-            "value" attribute is present, render the value of the component as
-            the value of the "src" attribute, after passing it to the
-            &lt;code&gt;getResourceURL()&lt;/code&gt; method of the &lt;code&gt;ViewHandler&lt;/code&gt;
-            for this application, and passing the result through the
-            &lt;code&gt;encodeResourceURL()&lt;/code&gt; method of the
-            &lt;code&gt;ExternalContext&lt;/code&gt;.&lt;/p&gt;
-            &lt;p&gt;When handling the "src" attribute,
-            the value must not be escaped. For example, &lt;code&gt;&amp;&lt;/code&gt;
-            must not
-            be turned into &lt;code&gt;&amp;amp;amp;&lt;/code&gt;. If the
-            "styleClass"
-            attribute is specified, render its value as the value of the "class"
-            attribute.&lt;/p&gt;
-            &lt;/ul&gt;
-            &lt;/div&gt;
-        </description>
-        <tag-name>graphicImage</tag-name>
-        <component>
-            <component-type>javax.faces.HtmlGraphicImage</component-type>
-            <renderer-type>javax.faces.Image</renderer-type>
-        </component>
-        <attribute>
-            <description>
-                The component identifier for this component. This value must be
-                unique within the closest parent component that is a naming
-                container.
-            </description>
-            <name>id</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Flag indicating whether or not this component should be rendered
-                (during Render Response Phase), or processed on any subsequent
-                form submit. The default value for this property is true.
-            </description>
-            <name>rendered</name>
-            <required>false</required>
-            <type>boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-                Context-relative URL to retrieve the resource associated with
-                this component. This is an alias for the "value" property.
-            </description>
-            <name>url</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                The current value of this component.
-            </description>
-            <name>value</name>
-            <required>false</required>
-            <type>java.lang.Object</type>
-        </attribute>
-        <attribute>
-            <description>
-                Alternate textual description of the
-                element rendered by this component.
-            </description>
-            <name>alt</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Direction indication for text that does not inherit
-                directionality.
-                Valid values are "LTR" (left-to-right) and "RTL"
-                (right-to-left).
-            </description>
-            <name>dir</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Override for the height of this image.
-            </description>
-            <name>height</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Flag indicating that this image is to be used as a server side
-                image map. Such an image must be enclosed within a hyperlink
-                ("a"). A value of false causes no attribute to be rendered,
-                while a value of true causes the attribute to be rendered as
-                ismap="ismap".
-            </description>
-            <name>ismap</name>
-            <required>false</required>
-            <type>boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-                Code describing the language used in the generated markup
-                for this component.
-            </description>
-            <name>lang</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                &lt;div class="changed_added_2_0"&gt;&lt;p&gt;The &lt;em&gt;libraryName&lt;/em&gt;
-                for this resource.&lt;/p&gt;&lt;/div&gt;
-            </description>
-            <name>library</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                URI to a long description of the image
-                represented by this element.
-            </description>
-            <name>longdesc</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                &lt;div class="changed_added_2_0"&gt;&lt;p&gt;The &lt;em&gt;resourceName&lt;/em&gt;
-                for this resource.&lt;/p&gt;&lt;/div&gt;
-            </description>
-            <name>name</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                clicked over this element.
-            </description>
-            <name>onclick</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                double clicked over this element.
-            </description>
-            <name>ondblclick</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a key is
-                pressed down over this element.
-            </description>
-            <name>onkeydown</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a key is
-                pressed and released over this element.
-            </description>
-            <name>onkeypress</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a key is
-                released over this element.
-            </description>
-            <name>onkeyup</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                pressed down over this element.
-            </description>
-            <name>onmousedown</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                moved within this element.
-            </description>
-            <name>onmousemove</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                moved away from this element.
-            </description>
-            <name>onmouseout</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                moved onto this element.
-            </description>
-            <name>onmouseover</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                released over this element.
-            </description>
-            <name>onmouseup</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                CSS style(s) to be applied when this component is rendered.
-            </description>
-            <name>style</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Space-separated list of CSS style class(es) to be applied when
-                this element is rendered. This value must be passed through
-                as the "class" attribute on generated markup.
-            </description>
-            <name>styleClass</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Advisory title information about markup elements generated
-                for this component.
-            </description>
-            <name>title</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                The name of a client side image map (an HTML "map"
-                element) for which this element provides the image.
-            </description>
-            <name>usemap</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Override for the width of this image.
-            </description>
-            <name>width</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                The ValueExpression linking this component to a property in a
-                backing bean
-            </description>
-            <name>binding</name>
-            <required>false</required>
-            <type>javax.faces.component.UIComponent</type>
-        </attribute>
-    </tag>
-    <tag>
-        <description>
-            &lt;p&gt;Renders an HTML "input" element of type
-            "hidden".&lt;/p&gt;
-            &lt;p&gt;Decode Behavior&lt;/p&gt;
-            &lt;ul&gt;
-            &lt;p&gt;See the decode description for the &lt;a
-            href="javax.faces.Inputjavax.faces.Text.html#encode"&gt;Input
-            Text&lt;/a&gt; renderer.&lt;/p&gt;
-            &lt;/ul&gt;
-            &lt;p&gt;Encode Behavior&lt;/p&gt;
-            &lt;ul&gt;
-            &lt;p&gt;Render the clientId of the component as the value of the
-            "name" attribute. Render the current value of the component as
-            the value of the "value" attribute.&lt;/p&gt;
-            &lt;/ul&gt;
-        </description>
-        <tag-name>inputHidden</tag-name>
-        <component>
-            <component-type>javax.faces.HtmlInputHidden</component-type>
-            <renderer-type>javax.faces.Hidden</renderer-type>
-        </component>
-        <attribute>
-            <description>
-                Converter instance registered with this component.
-            </description>
-            <name>converter</name>
-            <required>false</required>
-            <type>javax.faces.convert.Converter</type>
-        </attribute>
-        <attribute>
-            <description>
-                A ValueExpression enabled attribute that, if present, will be
-                used as the text of the converter message, replacing any message
-                that comes from the converter.
-            </description>
-            <name>converterMessage</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                The component identifier for this component. This value must be
-                unique within the closest parent component that is a naming
-                container.
-            </description>
-            <name>id</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Flag indicating that this component's value must be
-                converted and validated immediately (that is, during
-                Apply Request Values phase), rather than waiting
-                until Process Validations phase.
-            </description>
-            <name>immediate</name>
-            <required>false</required>
-            <type>boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-                Flag indicating whether or not this component should be rendered
-                (during Render Response Phase), or processed on any subsequent
-                form submit. The default value for this property is true.
-            </description>
-            <name>rendered</name>
-            <required>false</required>
-            <type>boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-                Flag indicating that the user is required to provide a submitted
-                value for this input component.
-            </description>
-            <name>required</name>
-            <required>false</required>
-            <type>boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-                A ValueExpression enabled attribute that, if present, will be
-                used as the text of the validation message for the "required"
-                facility, if the "required" facility is used.
-            </description>
-            <name>requiredMessage</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                MethodExpression representing a validator method that will be
-                called
-                during Process Validations to perform correctness checks on the
-                value of this component. The expression must evaluate to a
-                public
-                method that takes FacesContext, UIComponent, and Object
-                parameters,
-                with a return type of void.
-            </description>
-            <name>validator</name>
-            <required>false</required>
-            <method-signature>void validate(javax.faces.context.FacesContext,
-                javax.faces.component.UIComponent, java.lang.Object)
-            </method-signature>
-        </attribute>
-        <attribute>
-            <description>
-                A ValueExpression enabled attribute that, if present, will be
-                used as the text of the validator message, replacing any
-                message that comes from the validator.
-            </description>
-            <name>validatorMessage</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                The current value of this component.
-            </description>
-            <name>value</name>
-            <required>false</required>
-            <type>java.lang.Object</type>
-        </attribute>
-        <attribute>
-            <description>
-                &lt;p&gt;
-                MethodExpression representing a value change listener method
-                that will be notified when a new value has been set for this
-                input component. The expression must evaluate to a public
-                method that takes a &lt;code&gt;ValueChangeEvent&lt;/code&gt;
-                parameter,
-                with a return type of void, &lt;span class="changed_added_2_0"&gt;or
-                to a public method that takes no arguments with a return type
-                of void. In the latter case, the method has no way of easily
-                knowing what the new value is, but this can be useful in cases
-                where a notification is needed that "this value
-                changed".&lt;/span&gt;
-                &lt;/p&gt;
-            </description>
-            <name>valueChangeListener</name>
-            <required>false</required>
-            <method-signature>void
-                valueChange(javax.faces.event.ValueChangeEvent)
-            </method-signature>
-        </attribute>
-        <attribute>
-            <description>
-                The ValueExpression linking this component to a property in a
-                backing bean
-            </description>
-            <name>binding</name>
-            <required>false</required>
-            <type>javax.faces.component.UIComponent</type>
-        </attribute>
-    </tag>
-    <tag>
-        <description>
-            &lt;p&gt;Renders an HTML "input" element of "type" "password".&lt;/p&gt;
-            &lt;p&gt;Decode Behavior&lt;/p&gt;
-            &lt;ul&gt;
-            &lt;p&gt;See the decode description for the &lt;a
-            href="javax.faces.Inputjavax.faces.Text.html#encode"&gt;Input
-            Text&lt;/a&gt; renderer.&lt;/p&gt;
-            &lt;/ul&gt;
-            &lt;p&gt;Encode Behavior&lt;/p&gt;
-            &lt;ul&gt;
-            &lt;p&gt;
-            Render the clientId of the component as the value of the "name"
-            attribute. Render the current value of the component as the value
-            of the "value" attribute, if and only if the "redisplay" component
-            attribute is the string "true". If the "styleClass" attribute is
-            specified, render its value as the value of the "class"
-            attribute.&lt;/p&gt;
-            &lt;/ul&gt;
-        </description>
-        <tag-name>inputSecret</tag-name>
-        <component>
-            <component-type>javax.faces.HtmlInputSecret</component-type>
-            <renderer-type>javax.faces.Secret</renderer-type>
-        </component>
-        <attribute>
-            <description>
-                Converter instance registered with this component.
-            </description>
-            <name>converter</name>
-            <required>false</required>
-            <type>javax.faces.convert.Converter</type>
-        </attribute>
-        <attribute>
-            <description>
-                A ValueExpression enabled attribute that, if present, will be
-                used as the text of the converter message, replacing any message
-                that comes from the converter.
-            </description>
-            <name>converterMessage</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                The component identifier for this component. This value must be
-                unique within the closest parent component that is a naming
-                container.
-            </description>
-            <name>id</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Flag indicating that this component's value must be
-                converted and validated immediately (that is, during
-                Apply Request Values phase), rather than waiting
-                until Process Validations phase.
-            </description>
-            <name>immediate</name>
-            <required>false</required>
-            <type>boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-                Flag indicating whether or not this component should be rendered
-                (during Render Response Phase), or processed on any subsequent
-                form submit. The default value for this property is true.
-            </description>
-            <name>rendered</name>
-            <required>false</required>
-            <type>boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-                Flag indicating that the user is required to provide a submitted
-                value for this input component.
-            </description>
-            <name>required</name>
-            <required>false</required>
-            <type>boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-                A ValueExpression enabled attribute that, if present, will be
-                used as the text of the validation message for the "required"
-                facility, if the "required" facility is used.
-            </description>
-            <name>requiredMessage</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                MethodExpression representing a validator method that will be
-                called
-                during Process Validations to perform correctness checks on the
-                value of this component. The expression must evaluate to a
-                public
-                method that takes FacesContext, UIComponent, and Object
-                parameters,
-                with a return type of void.
-            </description>
-            <name>validator</name>
-            <required>false</required>
-            <method-signature>void validate(javax.faces.context.FacesContext,
-                javax.faces.component.UIComponent, java.lang.Object)
-            </method-signature>
-        </attribute>
-        <attribute>
-            <description>
-                A ValueExpression enabled attribute that, if present, will be
-                used as the text of the validator message, replacing any
-                message that comes from the validator.
-            </description>
-            <name>validatorMessage</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                The current value of this component.
-            </description>
-            <name>value</name>
-            <required>false</required>
-            <type>java.lang.Object</type>
-        </attribute>
-        <attribute>
-            <description>
-                &lt;p&gt;
-                MethodExpression representing a value change listener method
-                that will be notified when a new value has been set for this
-                input component. The expression must evaluate to a public
-                method that takes a &lt;code&gt;ValueChangeEvent&lt;/code&gt;
-                parameter,
-                with a return type of void, &lt;span class="changed_added_2_0"&gt;or
-                to a public method that takes no arguments with a return type
-                of void. In the latter case, the method has no way of easily
-                knowing what the new value is, but this can be useful in cases
-                where a notification is needed that "this value
-                changed".&lt;/span&gt;
-                &lt;/p&gt;
-            </description>
-            <name>valueChangeListener</name>
-            <required>false</required>
-            <method-signature>void
-                valueChange(javax.faces.event.ValueChangeEvent)
-            </method-signature>
-        </attribute>
-        <attribute>
-            <description>
-                Access key that, when pressed, transfers focus
-                to this element.
-            </description>
-            <name>accesskey</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Alternate textual description of the
-                element rendered by this component.
-            </description>
-            <name>alt</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                If the value of this attribute is "off", render "off" as the
-                value
-                of the attribute. This indicates that the browser should
-                disable its autocomplete feature for this component. This is
-                useful for components that perform autocompletion and do not
-                want the browser interfering. If this attribute is not set or
-                the value
-                is "on", render nothing.
-            </description>
-            <name>autocomplete</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Direction indication for text that does not inherit
-                directionality.
-                Valid values are "LTR" (left-to-right) and "RTL"
-                (right-to-left).
-            </description>
-            <name>dir</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Flag indicating that this element must never receive focus or
-                be included in a subsequent submit. A value of false causes
-                no attribute to be rendered, while a value of true causes the
-                attribute to be rendered as disabled="disabled".
-            </description>
-            <name>disabled</name>
-            <required>false</required>
-            <type>boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-                A localized user presentable name for this component.
-            </description>
-            <name>label</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Code describing the language used in the generated markup
-                for this component.
-            </description>
-            <name>lang</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                The maximum number of characters that may
-                be entered in this field.
-            </description>
-            <name>maxlength</name>
-            <required>false</required>
-            <type>int</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when this element loses focus.
-            </description>
-            <name>onblur</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when this element loses focus
-                and its value has been modified since gaining focus.
-            </description>
-            <name>onchange</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                clicked over this element.
-            </description>
-            <name>onclick</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                double clicked over this element.
-            </description>
-            <name>ondblclick</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when this element receives focus.
-            </description>
-            <name>onfocus</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a key is
-                pressed down over this element.
-            </description>
-            <name>onkeydown</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a key is
-                pressed and released over this element.
-            </description>
-            <name>onkeypress</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a key is
-                released over this element.
-            </description>
-            <name>onkeyup</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                pressed down over this element.
-            </description>
-            <name>onmousedown</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                moved within this element.
-            </description>
-            <name>onmousemove</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                moved away from this element.
-            </description>
-            <name>onmouseout</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                moved onto this element.
-            </description>
-            <name>onmouseover</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                released over this element.
-            </description>
-            <name>onmouseup</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when text within this
-                element is selected by the user.
-            </description>
-            <name>onselect</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Flag indicating that this component will prohibit changes by
-                the user. The element may receive focus unless it has also
-                been disabled. A value of false causes
-                no attribute to be rendered, while a value of true causes the
-                attribute to be rendered as readonly="readonly".
-            </description>
-            <name>readonly</name>
-            <required>false</required>
-            <type>boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-                Flag indicating that any existing value
-                in this field should be rendered when the
-                form is created. Because this is a potential
-                security risk, password values are not
-                displayed by default.
-            </description>
-            <name>redisplay</name>
-            <required>false</required>
-            <type>boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-                The number of characters used to determine
-                the width of this field.
-            </description>
-            <name>size</name>
-            <required>false</required>
-            <type>int</type>
-        </attribute>
-        <attribute>
-            <description>
-                CSS style(s) to be applied when this component is rendered.
-            </description>
-            <name>style</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Space-separated list of CSS style class(es) to be applied when
-                this element is rendered. This value must be passed through
-                as the "class" attribute on generated markup.
-            </description>
-            <name>styleClass</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Position of this element in the tabbing order
-                for the current document. This value must be
-                an integer between 0 and 32767.
-            </description>
-            <name>tabindex</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Advisory title information about markup elements generated
-                for this component.
-            </description>
-            <name>title</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                The ValueExpression linking this component to a property in a
-                backing bean
-            </description>
-            <name>binding</name>
-            <required>false</required>
-            <type>javax.faces.component.UIComponent</type>
-        </attribute>
-    </tag>
-    <tag>
-        <description>
-            &lt;p&gt;Renders an HTML "input"
-            element of "type" "text".&lt;/p&gt;
-            &lt;p&gt;&lt;a name="decode"&gt;Decode Behavior&lt;/a&gt;&lt;/p&gt;
-            &lt;ul&gt;
-            &lt;p&gt;Obtain the &lt;code&gt;Map&lt;/code&gt; from the
-            "requestParameterMap"
-            property of the &lt;code&gt;ExternalContext&lt;/code&gt;. If the
-            &lt;code&gt;Map&lt;/code&gt; contains an entry for the "clientId" of
-            the
-            component, pass the value of the entry to the
-            &lt;code&gt;setSubmittedValue()&lt;/code&gt; method of the
-            component, which
-            must be an instance of &lt;code&gt;EditableValueHolder&lt;/code&gt;.&lt;/p&gt;
-            &lt;/ul&gt;
-            &lt;p&gt;Encode Behavior&lt;/p&gt;
-            &lt;ul&gt;
-            &lt;p&gt; Render the clientId of the component as
-            the value of the "name" attribute. Render the current value of
-            the component as the value of the "value" attribute. If the
-            "styleClass" attribute is specified, render its value as the value
-            of the "class" attribute.
-            &lt;/p&gt;
-            &lt;/ul&gt;
-        </description>
-        <tag-name>inputText</tag-name>
-        <component>
-            <component-type>javax.faces.HtmlInputText</component-type>
-            <renderer-type>javax.faces.Text</renderer-type>
-        </component>
-        <attribute>
-            <description>
-                Converter instance registered with this component.
-            </description>
-            <name>converter</name>
-            <required>false</required>
-            <type>javax.faces.convert.Converter</type>
-        </attribute>
-        <attribute>
-            <description>
-                A ValueExpression enabled attribute that, if present, will be
-                used as the text of the converter message, replacing any message
-                that comes from the converter.
-            </description>
-            <name>converterMessage</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                The component identifier for this component. This value must be
-                unique within the closest parent component that is a naming
-                container.
-            </description>
-            <name>id</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Flag indicating that this component's value must be
-                converted and validated immediately (that is, during
-                Apply Request Values phase), rather than waiting
-                until Process Validations phase.
-            </description>
-            <name>immediate</name>
-            <required>false</required>
-            <type>boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-                Flag indicating whether or not this component should be rendered
-                (during Render Response Phase), or processed on any subsequent
-                form submit. The default value for this property is true.
-            </description>
-            <name>rendered</name>
-            <required>false</required>
-            <type>boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-                Flag indicating that the user is required to provide a submitted
-                value for this input component.
-            </description>
-            <name>required</name>
-            <required>false</required>
-            <type>boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-                A ValueExpression enabled attribute that, if present, will be
-                used as the text of the validation message for the "required"
-                facility, if the "required" facility is used.
-            </description>
-            <name>requiredMessage</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                MethodExpression representing a validator method that will be
-                called
-                during Process Validations to perform correctness checks on the
-                value of this component. The expression must evaluate to a
-                public
-                method that takes FacesContext, UIComponent, and Object
-                parameters,
-                with a return type of void.
-            </description>
-            <name>validator</name>
-            <required>false</required>
-            <method-signature>void validate(javax.faces.context.FacesContext,
-                javax.faces.component.UIComponent, java.lang.Object)
-            </method-signature>
-        </attribute>
-        <attribute>
-            <description>
-                A ValueExpression enabled attribute that, if present, will be
-                used as the text of the validator message, replacing any
-                message that comes from the validator.
-            </description>
-            <name>validatorMessage</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                The current value of this component.
-            </description>
-            <name>value</name>
-            <required>false</required>
-            <type>java.lang.Object</type>
-        </attribute>
-        <attribute>
-            <description>
-                &lt;p&gt;
-                MethodExpression representing a value change listener method
-                that will be notified when a new value has been set for this
-                input component. The expression must evaluate to a public
-                method that takes a &lt;code&gt;ValueChangeEvent&lt;/code&gt;
-                parameter,
-                with a return type of void, &lt;span class="changed_added_2_0"&gt;or
-                to a public method that takes no arguments with a return type
-                of void. In the latter case, the method has no way of easily
-                knowing what the new value is, but this can be useful in cases
-                where a notification is needed that "this value
-                changed".&lt;/span&gt;
-                &lt;/p&gt;
-            </description>
-            <name>valueChangeListener</name>
-            <required>false</required>
-            <method-signature>void
-                valueChange(javax.faces.event.ValueChangeEvent)
-            </method-signature>
-        </attribute>
-        <attribute>
-            <description>
-                Access key that, when pressed, transfers focus
-                to this element.
-            </description>
-            <name>accesskey</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Alternate textual description of the
-                element rendered by this component.
-            </description>
-            <name>alt</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                If the value of this attribute is "off", render "off" as the
-                value
-                of the attribute. This indicates that the browser should
-                disable its autocomplete feature for this component. This is
-                useful for components that perform autocompletion and do not
-                want the browser interfering. If this attribute is not set or
-                the value
-                is "on", render nothing.
-            </description>
-            <name>autocomplete</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Direction indication for text that does not inherit
-                directionality.
-                Valid values are "LTR" (left-to-right) and "RTL"
-                (right-to-left).
-            </description>
-            <name>dir</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Flag indicating that this element must never receive focus or
-                be included in a subsequent submit. A value of false causes
-                no attribute to be rendered, while a value of true causes the
-                attribute to be rendered as disabled="disabled".
-            </description>
-            <name>disabled</name>
-            <required>false</required>
-            <type>boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-                A localized user presentable name for this component.
-            </description>
-            <name>label</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Code describing the language used in the generated markup
-                for this component.
-            </description>
-            <name>lang</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                The maximum number of characters that may
-                be entered in this field.
-            </description>
-            <name>maxlength</name>
-            <required>false</required>
-            <type>int</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when this element loses focus.
-            </description>
-            <name>onblur</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when this element loses focus
-                and its value has been modified since gaining focus.
-            </description>
-            <name>onchange</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                clicked over this element.
-            </description>
-            <name>onclick</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                double clicked over this element.
-            </description>
-            <name>ondblclick</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when this element receives focus.
-            </description>
-            <name>onfocus</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a key is
-                pressed down over this element.
-            </description>
-            <name>onkeydown</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a key is
-                pressed and released over this element.
-            </description>
-            <name>onkeypress</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a key is
-                released over this element.
-            </description>
-            <name>onkeyup</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                pressed down over this element.
-            </description>
-            <name>onmousedown</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                moved within this element.
-            </description>
-            <name>onmousemove</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                moved away from this element.
-            </description>
-            <name>onmouseout</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                moved onto this element.
-            </description>
-            <name>onmouseover</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                released over this element.
-            </description>
-            <name>onmouseup</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when text within this
-                element is selected by the user.
-            </description>
-            <name>onselect</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Flag indicating that this component will prohibit changes by
-                the user. The element may receive focus unless it has also
-                been disabled. A value of false causes
-                no attribute to be rendered, while a value of true causes the
-                attribute to be rendered as readonly="readonly".
-            </description>
-            <name>readonly</name>
-            <required>false</required>
-            <type>boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-                The number of characters used to determine
-                the width of this field.
-            </description>
-            <name>size</name>
-            <required>false</required>
-            <type>int</type>
-        </attribute>
-        <attribute>
-            <description>
-                CSS style(s) to be applied when this component is rendered.
-            </description>
-            <name>style</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Space-separated list of CSS style class(es) to be applied when
-                this element is rendered. This value must be passed through
-                as the "class" attribute on generated markup.
-            </description>
-            <name>styleClass</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Position of this element in the tabbing order
-                for the current document. This value must be
-                an integer between 0 and 32767.
-            </description>
-            <name>tabindex</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Advisory title information about markup elements generated
-                for this component.
-            </description>
-            <name>title</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                The ValueExpression linking this component to a property in a
-                backing bean
-            </description>
-            <name>binding</name>
-            <required>false</required>
-            <type>javax.faces.component.UIComponent</type>
-        </attribute>
-    </tag>
-    <tag>
-        <description>
-            &lt;p&gt;Renders an HTML "textarea" element.&lt;/p&gt;
-            &lt;p&gt;Decode Behavior&lt;/p&gt;
-            &lt;ul&gt;
-            &lt;p&gt;See the encode description for the &lt;a
-            href="javax.faces.Inputjavax.faces.Text.html#encode"&gt;Input
-            Text&lt;/a&gt; renderer.&lt;/p&gt;
-            &lt;/ul&gt;
-            &lt;p&gt;Encode Behavior&lt;/p&gt;
-            &lt;ul&gt;
-            &lt;p&gt; Render the
-            clientId as the value of the "name" attribute. Render the current
-            valu eof the component inside the "textarea"
-            element.&lt;/p&gt; &lt;/ul&gt;
-        </description>
-        <tag-name>inputTextarea</tag-name>
-        <component>
-            <component-type>javax.faces.HtmlInputTextarea</component-type>
-            <renderer-type>javax.faces.Textarea</renderer-type>
-        </component>
-        <attribute>
-            <description>
-                Converter instance registered with this component.
-            </description>
-            <name>converter</name>
-            <required>false</required>
-            <type>javax.faces.convert.Converter</type>
-        </attribute>
-        <attribute>
-            <description>
-                A ValueExpression enabled attribute that, if present, will be
-                used as the text of the converter message, replacing any message
-                that comes from the converter.
-            </description>
-            <name>converterMessage</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                The component identifier for this component. This value must be
-                unique within the closest parent component that is a naming
-                container.
-            </description>
-            <name>id</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Flag indicating that this component's value must be
-                converted and validated immediately (that is, during
-                Apply Request Values phase), rather than waiting
-                until Process Validations phase.
-            </description>
-            <name>immediate</name>
-            <required>false</required>
-            <type>boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-                Flag indicating whether or not this component should be rendered
-                (during Render Response Phase), or processed on any subsequent
-                form submit. The default value for this property is true.
-            </description>
-            <name>rendered</name>
-            <required>false</required>
-            <type>boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-                Flag indicating that the user is required to provide a submitted
-                value for this input component.
-            </description>
-            <name>required</name>
-            <required>false</required>
-            <type>boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-                A ValueExpression enabled attribute that, if present, will be
-                used as the text of the validation message for the "required"
-                facility, if the "required" facility is used.
-            </description>
-            <name>requiredMessage</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                MethodExpression representing a validator method that will be
-                called
-                during Process Validations to perform correctness checks on the
-                value of this component. The expression must evaluate to a
-                public
-                method that takes FacesContext, UIComponent, and Object
-                parameters,
-                with a return type of void.
-            </description>
-            <name>validator</name>
-            <required>false</required>
-            <method-signature>void validate(javax.faces.context.FacesContext,
-                javax.faces.component.UIComponent, java.lang.Object)
-            </method-signature>
-        </attribute>
-        <attribute>
-            <description>
-                A ValueExpression enabled attribute that, if present, will be
-                used as the text of the validator message, replacing any
-                message that comes from the validator.
-            </description>
-            <name>validatorMessage</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                The current value of this component.
-            </description>
-            <name>value</name>
-            <required>false</required>
-            <type>java.lang.Object</type>
-        </attribute>
-        <attribute>
-            <description>
-                &lt;p&gt;
-                MethodExpression representing a value change listener method
-                that will be notified when a new value has been set for this
-                input component. The expression must evaluate to a public
-                method that takes a &lt;code&gt;ValueChangeEvent&lt;/code&gt;
-                parameter,
-                with a return type of void, &lt;span class="changed_added_2_0"&gt;or
-                to a public method that takes no arguments with a return type
-                of void. In the latter case, the method has no way of easily
-                knowing what the new value is, but this can be useful in cases
-                where a notification is needed that "this value
-                changed".&lt;/span&gt;
-                &lt;/p&gt;
-            </description>
-            <name>valueChangeListener</name>
-            <required>false</required>
-            <method-signature>void
-                valueChange(javax.faces.event.ValueChangeEvent)
-            </method-signature>
-        </attribute>
-        <attribute>
-            <description>
-                Access key that, when pressed, transfers focus
-                to this element.
-            </description>
-            <name>accesskey</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                The number of columns to be displayed.
-            </description>
-            <name>cols</name>
-            <required>false</required>
-            <type>int</type>
-        </attribute>
-        <attribute>
-            <description>
-                Direction indication for text that does not inherit
-                directionality.
-                Valid values are "LTR" (left-to-right) and "RTL"
-                (right-to-left).
-            </description>
-            <name>dir</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Flag indicating that this element must never receive focus or
-                be included in a subsequent submit. A value of false causes
-                no attribute to be rendered, while a value of true causes the
-                attribute to be rendered as disabled="disabled".
-            </description>
-            <name>disabled</name>
-            <required>false</required>
-            <type>boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-                A localized user presentable name for this component.
-            </description>
-            <name>label</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Code describing the language used in the generated markup
-                for this component.
-            </description>
-            <name>lang</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when this element loses focus.
-            </description>
-            <name>onblur</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when this element loses focus
-                and its value has been modified since gaining focus.
-            </description>
-            <name>onchange</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                clicked over this element.
-            </description>
-            <name>onclick</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                double clicked over this element.
-            </description>
-            <name>ondblclick</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when this element receives focus.
-            </description>
-            <name>onfocus</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a key is
-                pressed down over this element.
-            </description>
-            <name>onkeydown</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a key is
-                pressed and released over this element.
-            </description>
-            <name>onkeypress</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a key is
-                released over this element.
-            </description>
-            <name>onkeyup</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                pressed down over this element.
-            </description>
-            <name>onmousedown</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                moved within this element.
-            </description>
-            <name>onmousemove</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                moved away from this element.
-            </description>
-            <name>onmouseout</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                moved onto this element.
-            </description>
-            <name>onmouseover</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                released over this element.
-            </description>
-            <name>onmouseup</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when text within this
-                element is selected by the user.
-            </description>
-            <name>onselect</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Flag indicating that this component will prohibit changes by
-                the user. The element may receive focus unless it has also
-                been disabled. A value of false causes
-                no attribute to be rendered, while a value of true causes the
-                attribute to be rendered as readonly="readonly".
-            </description>
-            <name>readonly</name>
-            <required>false</required>
-            <type>boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-                The number of rows to be displayed.
-            </description>
-            <name>rows</name>
-            <required>false</required>
-            <type>int</type>
-        </attribute>
-        <attribute>
-            <description>
-                CSS style(s) to be applied when this component is rendered.
-            </description>
-            <name>style</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Space-separated list of CSS style class(es) to be applied when
-                this element is rendered. This value must be passed through
-                as the "class" attribute on generated markup.
-            </description>
-            <name>styleClass</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Position of this element in the tabbing order
-                for the current document. This value must be
-                an integer between 0 and 32767.
-            </description>
-            <name>tabindex</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Advisory title information about markup elements generated
-                for this component.
-            </description>
-            <name>title</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                The ValueExpression linking this component to a property in a
-                backing bean
-            </description>
-            <name>binding</name>
-            <required>false</required>
-            <type>javax.faces.component.UIComponent</type>
-        </attribute>
-    </tag>
-    <tag>
-        <description>
-            &lt;p&gt;Render a single message for a specific component.&lt;/p&gt;
-            &lt;p&gt;Set-up for Rendering&lt;/p&gt;
-            &lt;ul&gt;
-            &lt;p&gt;Obtain the "summary" and "detail" properties from
-            &lt;code&gt;UIMessage&lt;/code&gt; component. If not present, keep
-            the
-            empty string as the value, respectively. Obtain the first
-            &lt;code&gt;FacesMessage&lt;/code&gt; to render from the component,
-            using
-            the "for" property of the &lt;code&gt;UIMessage&lt;/code&gt;. This
-            will be
-            the only message we render. Obtain the severity style for this
-            message. If the severity of the message is
-            &lt;code&gt;FacesMessage.SEVERITY_INFO&lt;/code&gt;, the severity
-            style
-            comes from the value of the "infoStyle" attribute. If the
-            severity of the message is
-            &lt;code&gt;FacesMessage.SEVERITY_WARN&lt;/code&gt;, the severity
-            style
-            comes from the value of the "warnStyle" attribute, and so on for
-            each of the severities, &lt;code&gt;INFO, WARN, ERROR&lt;/code&gt;
-            and
-            &lt;code&gt;FATAL&lt;/code&gt;. The same rules apply for obtaining
-            the
-            severity style class, but instead of "infoStyle, warnStyle", etc
-            use "infoClass, warnClass", etc. Obtain the "style",
-            "styleClass" and "layout" attributes from the
-            &lt;code&gt;UIMessage&lt;/code&gt; component. If we have a "style"
-            attribute and a severity style attribute, use the severity style
-            attribute as the value of the "style" attribute. If we have no
-            "style" attribute, but do have a severity style, use the
-            severity style as the value of the "style" attribute. The same
-            precedence rules apply for the style class. Obtain the value of
-            the &lt;code&gt;dir&lt;/code&gt; and &lt;code&gt;lang&lt;/code&gt;
-            attributes.&lt;/p&gt;
-            &lt;/ul&gt;
-            &lt;p&gt;Rendering&lt;/p&gt;
-            &lt;ul&gt;
-            &lt;p&gt;For the message renderer, we only render one row, for the
-            first
-            message. For the messages renderer, we render as many rows as we
-            have messages. If any of the "dir", "lang", "style" or
-            "styleClass" attributes has a non-null value (as determined
-            above), render a "span" element, outputting the value of the
-            "style" attribute as the the value of the "style" attribute, and
-            outputting the value of the "styleClass" attribute as the value of
-            the "class" attribute on the "span" element. Output the "dir" and
-            "lang" attributes as well, if they are present. If the
-            &lt;code&gt;UIMessage&lt;/code&gt; has a "tooltip" attribute with
-            the value of
-            "true", and the &lt;code&gt;UIMessage&lt;/code&gt; has "showSummary"
-            and
-            "showDetail" properties with the value "true", if we haven't
-            already written out the "span", output the "summary" as the value
-            of the "title" attribute on the "span". If we haven't already
-            written out a "title" attribute, and "showSummary" is true, output
-            the summary. If "showDetail" is true, output the detail. Close
-            out the span if necessary.&lt;/p&gt;
-            &lt;/ul&gt;
-        </description>
-        <tag-name>message</tag-name>
-        <component>
-            <component-type>javax.faces.HtmlMessage</component-type>
-            <renderer-type>javax.faces.Message</renderer-type>
-        </component>
-        <attribute>
-            <description>
-                Client identifier of the component for which to display
-                messages.
-            </description>
-            <name>for</name>
-            <required>true</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                The component identifier for this component. This value must be
-                unique within the closest parent component that is a naming
-                container.
-            </description>
-            <name>id</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Flag indicating whether or not this component should be rendered
-                (during Render Response Phase), or processed on any subsequent
-                form submit. The default value for this property is true.
-            </description>
-            <name>rendered</name>
-            <required>false</required>
-            <type>boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-                Flag indicating whether the detail portion of displayed messages
-                should be included. Default value is "true".
-            </description>
-            <name>showDetail</name>
-            <required>false</required>
-            <type>boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-                Flag indicating whether the summary portion of displayed
-                messages
-                should be included. Default value is "false".
-            </description>
-            <name>showSummary</name>
-            <required>false</required>
-            <type>boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-                Direction indication for text that does not inherit
-                directionality.
-                Valid values are "LTR" (left-to-right) and "RTL"
-                (right-to-left).
-            </description>
-            <name>dir</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                CSS style class to apply to any message
-                with a severity class of "ERROR".
-            </description>
-            <name>errorClass</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                CSS style(s) to apply to any message
-                with a severity class of "ERROR".
-            </description>
-            <name>errorStyle</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                CSS style class to apply to any message
-                with a severity class of "FATAL".
-            </description>
-            <name>fatalClass</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                CSS style(s) to apply to any message
-                with a severity class of "FATAL".
-            </description>
-            <name>fatalStyle</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                CSS style class to apply to any message
-                with a severity class of "INFO".
-            </description>
-            <name>infoClass</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                CSS style(s) to apply to any message
-                with a severity class of "INFO".
-            </description>
-            <name>infoStyle</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Code describing the language used in the generated markup
-                for this component.
-            </description>
-            <name>lang</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                CSS style(s) to be applied when this component is rendered.
-            </description>
-            <name>style</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Space-separated list of CSS style class(es) to be applied when
-                this element is rendered. This value must be passed through
-                as the "class" attribute on generated markup.
-            </description>
-            <name>styleClass</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Advisory title information about markup elements generated
-                for this component.
-            </description>
-            <name>title</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Flag indicating whether the detail portion of the
-                message should be displayed as a tooltip.
-            </description>
-            <name>tooltip</name>
-            <required>false</required>
-            <type>boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-                CSS style class to apply to any message
-                with a severity class of "WARN".
-            </description>
-            <name>warnClass</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                CSS style(s) to apply to any message
-                with a severity class of "WARN".
-            </description>
-            <name>warnStyle</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                The ValueExpression linking this component to a property in a
-                backing bean
-            </description>
-            <name>binding</name>
-            <required>false</required>
-            <type>javax.faces.component.UIComponent</type>
-        </attribute>
-    </tag>
-    <tag>
-        <description>
-            &lt;p&gt;&lt;span class="changed_modified_2_0"&gt;The&lt;/span&gt;
-            same as for the
-            Message renderer, but output all the messages. &lt;span
-            class="changed_added_2_0"&gt;If an "id" attribute has been
-            specified,
-            it must be rendered on the outermost markup corresponding to this
-            component.&lt;/span&gt; If the value of the "layout" attribute is
-            "table", render nested "table", "tr", and "td" elements, in that
-            order. If the value of the "layout" attribute is "list", or the
-            "layout" attribute is not specified, render nested "ul", "li"
-            elements, in that order. Output the value of the "style" attribute
-            as the value of the "style" attribute, output the value of the
-            "styleClass" attribute as the value of the "class" attribute, and
-            output the dir and lang attributes. Output these values on the
-            "table" element or the "ul" element. Output the values of the
-            "errorStyle", "fatalStyle", "infoStyle", "warnStyle" attributes as
-            the value of the "style" attribute on either the "tr" element or
-            the "li" element. Output the values of the "errorClass",
-            "fatalClass", "infoClass", "warnClass" attributes as the value of
-            the "class" attribute on either the "tr" element or the "li"
-            element. The component is a &lt;code&gt;UIMessages&lt;/code&gt;, and
-            there is
-            no "for" attribute. Therefore, use either &lt;code&gt;null&lt;/code&gt;
-            to
-            obtain the messages from the &lt;code&gt;FacesContext&lt;/code&gt;
-            or the empty
-            string if the components "globalOnly" property is
-            &lt;code&gt;true&lt;/code&gt;. If the layout was "table" close out
-            the table
-            elements, otherwise, close out the list elements.&lt;/p&gt;
-        </description>
-        <tag-name>messages</tag-name>
-        <component>
-            <component-type>javax.faces.HtmlMessages</component-type>
-            <renderer-type>javax.faces.Messages</renderer-type>
-        </component>
-        <attribute>
-            <description>
-                Client identifier of the component for which to display
-                messages. This
-                attribute is mutually exclusive with globalOnly and take
-                precedence
-                if used.
-            </description>
-            <name>for</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Flag indicating that only global messages (that is, messages not
-                associated with any client identifier) are to be displayed.
-                Default value is "false".
-            </description>
-            <name>globalOnly</name>
-            <required>false</required>
-            <type>boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-                The component identifier for this component. This value must be
-                unique within the closest parent component that is a naming
-                container.
-            </description>
-            <name>id</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Flag indicating whether or not this component should be rendered
-                (during Render Response Phase), or processed on any subsequent
-                form submit. The default value for this property is true.
-            </description>
-            <name>rendered</name>
-            <required>false</required>
-            <type>boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-                Flag indicating whether the detail portion of displayed messages
-                should be included. Default value is "false".
-            </description>
-            <name>showDetail</name>
-            <required>false</required>
-            <type>boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-                Flag indicating whether the summary portion of displayed
-                messages
-                should be included. Default value is "true".
-            </description>
-            <name>showSummary</name>
-            <required>false</required>
-            <type>boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-                Direction indication for text that does not inherit
-                directionality.
-                Valid values are "LTR" (left-to-right) and "RTL"
-                (right-to-left).
-            </description>
-            <name>dir</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                CSS style class to apply to any message
-                with a severity class of "ERROR".
-            </description>
-            <name>errorClass</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                CSS style(s) to apply to any message
-                with a severity class of "ERROR".
-            </description>
-            <name>errorStyle</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                CSS style class to apply to any message
-                with a severity class of "FATAL".
-            </description>
-            <name>fatalClass</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                CSS style(s) to apply to any message
-                with a severity class of "FATAL".
-            </description>
-            <name>fatalStyle</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                CSS style class to apply to any message
-                with a severity class of "INFO".
-            </description>
-            <name>infoClass</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                CSS style(s) to apply to any message
-                with a severity class of "INFO".
-            </description>
-            <name>infoStyle</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Code describing the language used in the generated markup
-                for this component.
-            </description>
-            <name>lang</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                The type of layout markup to use when rendering
-                error messages. Valid values are "table" (an HTML
-                table) and "list" (an HTML list). If not specified,
-                the default value is "list".
-            </description>
-            <name>layout</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                CSS style(s) to be applied when this component is rendered.
-            </description>
-            <name>style</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Space-separated list of CSS style class(es) to be applied when
-                this element is rendered. This value must be passed through
-                as the "class" attribute on generated markup.
-            </description>
-            <name>styleClass</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Advisory title information about markup elements generated
-                for this component.
-            </description>
-            <name>title</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Flag indicating whether the detail portion of the
-                message should be displayed as a tooltip.
-            </description>
-            <name>tooltip</name>
-            <required>false</required>
-            <type>boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-                CSS style class to apply to any message
-                with a severity class of "WARN".
-            </description>
-            <name>warnClass</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                CSS style(s) to apply to any message
-                with a severity class of "WARN".
-            </description>
-            <name>warnStyle</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                The ValueExpression linking this component to a property in a
-                backing bean
-            </description>
-            <name>binding</name>
-            <required>false</required>
-            <type>javax.faces.component.UIComponent</type>
-        </attribute>
-    </tag>
-    <tag>
-        <description>
-            &lt;p&gt;Render parameterized text. Obtain the
-            &lt;code&gt;style&lt;/code&gt;, &lt;code&gt;styleClass&lt;/code&gt;,
-            &lt;code&gt;dir&lt;/code&gt;, and
-            &lt;code&gt;lang&lt;/code&gt; attributees from this component. If
-            any are
-            present, render a "span" element. Output the
-            &lt;code&gt;styleClass&lt;/code&gt; attribute (if present) as the
-            value of the
-            &lt;code&gt;class&lt;/code&gt; attribute. Output the &lt;code&gt;style&lt;/code&gt;
-            attribute as the value of the &lt;code&gt;style&lt;/code&gt;
-            attribute.
-            Output the &lt;code&gt;dir&lt;/code&gt; and &lt;code&gt;lang&lt;/code&gt;
-            attributes as
-            pass through attributes. Accrue a list of the values of all child
-            &lt;code&gt;UIParameter&lt;/code&gt; components of this component.
-            If there
-            are one or more accumulated parameter values, convert the list of
-            parameter values to an &lt;code&gt;Object&lt;/code&gt; array, call
-            &lt;code&gt;MessageFormat.format()&lt;/code&gt;, passing the
-            &lt;code&gt;value&lt;/code&gt; of this component as the first
-            argument, and
-            the array of parameter values as the second argument, and render
-            the result. Otherwise, render the &lt;code&gt;value&lt;/code&gt; of
-            this
-            component unmodified.&lt;/p&gt;
-        </description>
-        <tag-name>outputFormat</tag-name>
-        <component>
-            <component-type>javax.faces.HtmlOutputFormat</component-type>
-            <renderer-type>javax.faces.Format</renderer-type>
-        </component>
-        <attribute>
-            <description>
-                Converter instance registered with this component.
-            </description>
-            <name>converter</name>
-            <required>false</required>
-            <type>javax.faces.convert.Converter</type>
-        </attribute>
-        <attribute>
-            <description>
-                The component identifier for this component. This value must be
-                unique within the closest parent component that is a naming
-                container.
-            </description>
-            <name>id</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Flag indicating whether or not this component should be rendered
-                (during Render Response Phase), or processed on any subsequent
-                form submit. The default value for this property is true.
-            </description>
-            <name>rendered</name>
-            <required>false</required>
-            <type>boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-                The current value of this component.
-            </description>
-            <name>value</name>
-            <required>false</required>
-            <type>java.lang.Object</type>
-        </attribute>
-        <attribute>
-            <description>
-                Direction indication for text that does not inherit
-                directionality.
-                Valid values are "LTR" (left-to-right) and "RTL"
-                (right-to-left).
-            </description>
-            <name>dir</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Flag indicating that characters that are sensitive
-                in HTML and XML markup must be escaped. This flag
-                is set to "true" by default.
-            </description>
-            <name>escape</name>
-            <required>false</required>
-            <type>boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-                Code describing the language used in the generated markup
-                for this component.
-            </description>
-            <name>lang</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                CSS style(s) to be applied when this component is rendered.
-            </description>
-            <name>style</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Space-separated list of CSS style class(es) to be applied when
-                this element is rendered. This value must be passed through
-                as the "class" attribute on generated markup.
-            </description>
-            <name>styleClass</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Advisory title information about markup elements generated
-                for this component.
-            </description>
-            <name>title</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                The ValueExpression linking this component to a property in a
-                backing bean
-            </description>
-            <name>binding</name>
-            <required>false</required>
-            <type>javax.faces.component.UIComponent</type>
-        </attribute>
-    </tag>
-    <tag>
-        <description>
-            Renders an HTML "label" element. Render the current value
-            of the component as label text if it is specified. If a "for"
-            attribute is
-            specified, find the component specified by the value of the "for"
-            attribute, and render its client id as the value of the "for"
-            attribute.
-            If "styleClass" attribute is specified, render its value as the
-            value
-            of the "class" attribute.
-        </description>
-        <tag-name>outputLabel</tag-name>
-        <component>
-            <component-type>javax.faces.HtmlOutputLabel</component-type>
-            <renderer-type>javax.faces.Label</renderer-type>
-        </component>
-        <attribute>
-            <description>
-                Converter instance registered with this component.
-            </description>
-            <name>converter</name>
-            <required>false</required>
-            <type>javax.faces.convert.Converter</type>
-        </attribute>
-        <attribute>
-            <description>
-                The component identifier for this component. This value must be
-                unique within the closest parent component that is a naming
-                container.
-            </description>
-            <name>id</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Flag indicating whether or not this component should be rendered
-                (during Render Response Phase), or processed on any subsequent
-                form submit. The default value for this property is true.
-            </description>
-            <name>rendered</name>
-            <required>false</required>
-            <type>boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-                The current value of this component.
-            </description>
-            <name>value</name>
-            <required>false</required>
-            <type>java.lang.Object</type>
-        </attribute>
-        <attribute>
-            <description>
-                Access key that, when pressed, transfers focus
-                to this element.
-            </description>
-            <name>accesskey</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Direction indication for text that does not inherit
-                directionality.
-                Valid values are "LTR" (left-to-right) and "RTL"
-                (right-to-left).
-            </description>
-            <name>dir</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Flag indicating that characters that are sensitive
-                in HTML and XML markup must be escaped. If omitted, this
-                flag is assumed to be "true".
-            </description>
-            <name>escape</name>
-            <required>false</required>
-            <type>boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-                Client identifier of the component for which this element
-                is a label.
-            </description>
-            <name>for</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Code describing the language used in the generated markup
-                for this component.
-            </description>
-            <name>lang</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when this element loses focus.
-            </description>
-            <name>onblur</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                clicked over this element.
-            </description>
-            <name>onclick</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                double clicked over this element.
-            </description>
-            <name>ondblclick</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when this element receives focus.
-            </description>
-            <name>onfocus</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a key is
-                pressed down over this element.
-            </description>
-            <name>onkeydown</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a key is
-                pressed and released over this element.
-            </description>
-            <name>onkeypress</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a key is
-                released over this element.
-            </description>
-            <name>onkeyup</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                pressed down over this element.
-            </description>
-            <name>onmousedown</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                moved within this element.
-            </description>
-            <name>onmousemove</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                moved away from this element.
-            </description>
-            <name>onmouseout</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                moved onto this element.
-            </description>
-            <name>onmouseover</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                released over this element.
-            </description>
-            <name>onmouseup</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                CSS style(s) to be applied when this component is rendered.
-            </description>
-            <name>style</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Space-separated list of CSS style class(es) to be applied when
-                this element is rendered. This value must be passed through
-                as the "class" attribute on generated markup.
-            </description>
-            <name>styleClass</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Position of this element in the tabbing order
-                for the current document. This value must be
-                an integer between 0 and 32767.
-            </description>
-            <name>tabindex</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Advisory title information about markup elements generated
-                for this component.
-            </description>
-            <name>title</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                The ValueExpression linking this component to a property in a
-                backing bean
-            </description>
-            <name>binding</name>
-            <required>false</required>
-            <type>javax.faces.component.UIComponent</type>
-        </attribute>
-    </tag>
-    <tag>
-        <description>
-            Render an HTML "a" anchor element. The value of the
-            component is rendered as the value of the "href" attribute. Any
-            child UIParameter components are appended to the String to be
-            output as the value of the "href" attribute as query parameters
-            before rendering. The entire "href" string must be passed through
-            a call to the &lt;code&gt;encodeResourceURL()&lt;/code&gt; method of
-            the
-            &lt;code&gt;ExternalContext&lt;/code&gt;. The name of the
-            UIParameter goes on
-            the left hand side, and the value of the UIParameter on the right
-            hand side. The name and the value must be URLEncoded. Each
-            UIParameter instance is separeted by an ampersand, as dictated in
-            the URL spec. If the "styleClass" attribute is specified, render
-            its value as the value of the "class" attribute. If the "id"
-            attribute
-            is specified, follow the same steps as mentioned in the
-            "&lt;a
-            href="../../../renderkitdocs/HTML_BASIC/renderkit-summary.html#general_encoding"&gt;General
-            Notes on Encoding&lt;/a&gt;" regarding the "id" attribute for
-            UIInput components.
-            If the "disabled" attribute is specified, do not render the HTML "a"
-            anchor element or the "href" element. Instead, render a "span"
-            element.
-            If the "styleClass" attribute is specified, render its value as the
-            value
-            of the "class" attribute on the "span". Render any pass-through
-            attributes
-            on the "span".
-        </description>
-        <tag-name>outputLink</tag-name>
-        <component>
-            <component-type>javax.faces.HtmlOutputLink</component-type>
-            <renderer-type>javax.faces.Link</renderer-type>
-        </component>
-        <attribute>
-            <description>
-                Converter instance registered with this component.
-            </description>
-            <name>converter</name>
-            <required>false</required>
-            <type>javax.faces.convert.Converter</type>
-        </attribute>
-        <attribute>
-            <description>
-                The component identifier for this component. This value must be
-                unique within the closest parent component that is a naming
-                container.
-            </description>
-            <name>id</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Flag indicating whether or not this component should be rendered
-                (during Render Response Phase), or processed on any subsequent
-                form submit. The default value for this property is true.
-            </description>
-            <name>rendered</name>
-            <required>false</required>
-            <type>boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-                The current value of this component.
-            </description>
-            <name>value</name>
-            <required>false</required>
-            <type>java.lang.Object</type>
-        </attribute>
-        <attribute>
-            <description>
-                Access key that, when pressed, transfers focus
-                to this element.
-            </description>
-            <name>accesskey</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                The character encoding of the resource designated
-                by this hyperlink.
-            </description>
-            <name>charset</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                The position and shape of the hot spot on the screen
-                (for use in client-side image maps).
-            </description>
-            <name>coords</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Direction indication for text that does not inherit
-                directionality.
-                Valid values are "LTR" (left-to-right) and "RTL"
-                (right-to-left).
-            </description>
-            <name>dir</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Flag indicating that this element must never
-                receive focus or be included in a subsequent
-                submit.
-            </description>
-            <name>disabled</name>
-            <required>false</required>
-            <type>boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-                The language code of the resource designated
-                by this hyperlink.
-            </description>
-            <name>hreflang</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Code describing the language used in the generated markup
-                for this component.
-            </description>
-            <name>lang</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when this element loses focus.
-            </description>
-            <name>onblur</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                clicked over this element.
-            </description>
-            <name>onclick</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                double clicked over this element.
-            </description>
-            <name>ondblclick</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when this element receives focus.
-            </description>
-            <name>onfocus</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a key is
-                pressed down over this element.
-            </description>
-            <name>onkeydown</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a key is
-                pressed and released over this element.
-            </description>
-            <name>onkeypress</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a key is
-                released over this element.
-            </description>
-            <name>onkeyup</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                pressed down over this element.
-            </description>
-            <name>onmousedown</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                moved within this element.
-            </description>
-            <name>onmousemove</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                moved away from this element.
-            </description>
-            <name>onmouseout</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                moved onto this element.
-            </description>
-            <name>onmouseover</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                released over this element.
-            </description>
-            <name>onmouseup</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                The relationship from the current document
-                to the anchor specified by this hyperlink.
-                The value of this attribute is a space-separated
-                list of link types.
-            </description>
-            <name>rel</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                A reverse link from the anchor specified
-                by this hyperlink to the current document.
-                The value of this attribute is a space-separated
-                list of link types.
-            </description>
-            <name>rev</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                The shape of the hot spot on the screen
-                (for use in client-side image maps). Valid
-                values are: default (entire region); rect
-                (rectangular region); circle (circular region);
-                and poly (polygonal region).
-            </description>
-            <name>shape</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                CSS style(s) to be applied when this component is rendered.
-            </description>
-            <name>style</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Space-separated list of CSS style class(es) to be applied when
-                this element is rendered. This value must be passed through
-                as the "class" attribute on generated markup.
-            </description>
-            <name>styleClass</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Position of this element in the tabbing order
-                for the current document. This value must be
-                an integer between 0 and 32767.
-            </description>
-            <name>tabindex</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Name of a frame where the resource
-                retrieved via this hyperlink is to
-                be displayed.
-            </description>
-            <name>target</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Advisory title information about markup elements generated
-                for this component.
-            </description>
-            <name>title</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                The content type of the resource designated
-                by this hyperlink.
-            </description>
-            <name>type</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                The ValueExpression linking this component to a property in a
-                backing bean
-            </description>
-            <name>binding</name>
-            <required>false</required>
-            <type>javax.faces.component.UIComponent</type>
-        </attribute>
-    </tag>
-    <tag>
-        <description>
-            If the "styleClass", "style", "dir" or "lang"
-            attributes are present, render a "span" element. If the
-            "styleClass" attribute is present, render its value as the value
-            of the "class" attribute. If the "style" attribute is present,
-            pass it thru. If the "escape" attribute is not present, or it is
-            present and its value is "true" all angle brackets should be
-            converted to the ampersand xx semicolon syntax when rendering the
-            value of the "value" attribute as the value of the component. If
-            the "escape" attribute is present and is "false" the value of the
-            component should be rendered as text without escaping.
-        </description>
-        <tag-name>outputText</tag-name>
-        <component>
-            <component-type>javax.faces.HtmlOutputText</component-type>
-            <renderer-type>javax.faces.Text</renderer-type>
-        </component>
-        <attribute>
-            <description>
-                Converter instance registered with this component.
-            </description>
-            <name>converter</name>
-            <required>false</required>
-            <type>javax.faces.convert.Converter</type>
-        </attribute>
-        <attribute>
-            <description>
-                The component identifier for this component. This value must be
-                unique within the closest parent component that is a naming
-                container.
-            </description>
-            <name>id</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Flag indicating whether or not this component should be rendered
-                (during Render Response Phase), or processed on any subsequent
-                form submit. The default value for this property is true.
-            </description>
-            <name>rendered</name>
-            <required>false</required>
-            <type>boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-                The current value of this component.
-            </description>
-            <name>value</name>
-            <required>false</required>
-            <type>java.lang.Object</type>
-        </attribute>
-        <attribute>
-            <description>
-                Direction indication for text that does not inherit
-                directionality.
-                Valid values are "LTR" (left-to-right) and "RTL"
-                (right-to-left).
-            </description>
-            <name>dir</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Flag indicating that characters that are sensitive
-                in HTML and XML markup must be escaped. This flag
-                is set to "true" by default.
-            </description>
-            <name>escape</name>
-            <required>false</required>
-            <type>boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-                Code describing the language used in the generated markup
-                for this component.
-            </description>
-            <name>lang</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                CSS style(s) to be applied when this component is rendered.
-            </description>
-            <name>style</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Space-separated list of CSS style class(es) to be applied when
-                this element is rendered. This value must be passed through
-                as the "class" attribute on generated markup.
-            </description>
-            <name>styleClass</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Advisory title information about markup elements generated
-                for this component.
-            </description>
-            <name>title</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                The ValueExpression linking this component to a property in a
-                backing bean
-            </description>
-            <name>binding</name>
-            <required>false</required>
-            <type>javax.faces.component.UIComponent</type>
-        </attribute>
-    </tag>
-    <tag>
-        <description>
-            <![CDATA[<div class="changed_added_2_0">
-            
-            <p>Render the markup for a <code>&lt;script&gt;</code> element that
-            renders the script <code>Resource</code> specified by the optional
-            <code>name</code> attribute and <code>library</code> attributes.</p>
-            
-            <p>The implementation of this renderer must have a <a target="_"
-            href="../../javadocs/javax/faces/event/ListenerFor.html"><code>@ListenerFor</code></a>
-            annotation attached to it, at the class level, declaring <a target="_"
-            href="../../javadocs/javax/faces/event/PostAddToViewEvent.html"><code>PostAddToViewEvent.class</code></a>
-            as the value of the <code>systemEventClass</code> attribute.  The presence of
-            this annotation on a renderer implies the renderer implements <a
-            target="_"
-            href="../../javadocs/javax/faces/event/ComponentSystemEventListener.html"><code>ComponentSystemEventListener</code></a>,
-            which this renderer must do.  The implementation of
-            <code>processEvent()</code> must extract the <code>UIComponent</code>
-            from the argument event and look for the presence of the key
-            "<code>target</code>" in the component's attribute <code>Map</code>.  If
-            and only if such a key is present, the implementation of
-            <code>processEvent()</code> must pass the component to <a target="_"
-            href="../../javadocs/javax/faces/component/UIViewRoot.html#addComponentResource(javax.faces.context.FacesContext,%20javax.faces.component.UIComponent)"><code>UIViewRoot.addComponentResource()</code></a>.</p>
-            
-            <p>Decode Behavior</p>
-            
-            <ul>
-            
-            <p>No action is required during decode for this renderer.</p>
-            
-            </ul>
-            
-            <p>Encode Behavior</p>
-            
-            <ul>
-            
-            <p><a name="ResourceCommonGetResource">Common Algorithm for Obtaining A Resource to Render</a></p>
-            
-            <ul>
-            
-            <p>This algorithm is used by all resource renderers to obtain
-            a <code>Resource</code> instance which is then rendered in a
-            specific way depending on what kind of renderer is doing the
-            encoding.</p>
-            
-            <ul>
-            
-            <li><p>Look in the component attribute <code>Map</code> for a
-            value under the key <em>name</em>.</p></li>
-            
-            <li><p>Look in the component attribute <code>Map</code> for a
-            value under the key <em>library</em>.  This attribute is
-            optional, therefore, <em>library</em> may be
-            <code>null</code>.</p></li>
-            
-            <li><p>Create the resource by calling
-            <code>Application.getResourceHandler.createResource(<em>name</em>,
-            <em>library</em>);</code>.</p></li>
-            
-            </p></li>
-            
-            </ul>
-            
-            </ul>
-            
-            <p><a name="ResourceCommonEncode">Common Encode Behavior</a></p>
-            
-            <ul>
-            
-            <p>This algorithm is used by all resource renderers to render the
-            resource.</p>
-            
-            <p><code>encodeBegin()</code> must take no action.</p>
-            
-            <p>Because this renderer returns <code>true</code> from
-            <code>getRendersChildren()</code>, the <code>encodeChildren()
-            method must take the following action.</code></p>
-            
-            <ul>
-            
-            <li><p>If there is no <em>name</em> attribute, and the
-            argument <code>component</code> has no children, and
-            <code>ProjectStage</code> is not
-            <code>ProjectStage.Production</code>, add a
-            <code>FacesMessage</code> for this component's clientId to the
-            <code>FacesContext</code> stating that if no name attribute is
-            present, and no body content is present either, then the user
-            should take action to correct this problem.  In this case,
-            <code>encodeChildren()</code> must take no further
-            action.</p></li>
-            
-            <li><p>If there is no <em>name</em> attribute and the argument
-            <code>component</code> <b>does</b> have children, the renderer
-            must ensure that those children are encoded as usual.</p></li>
-            
-            <li><p>If there <b>is</b> a <em>name</em> attribute and the
-            argument <code>component</code> <b>does</b> have children, the
-            renderer must log a descriptive localized message stating that
-            the child content will be ignored.  The resource referenced by
-            the <em>name</em> attribute will be rendered in
-            <code>encodeEnd()</code>.</p></li>
-            
-            <li><p>If there <b>is</b> a <em>name attribute</em> and the
-            argument <code>component</code> <b>does not</b> have children,
-            <code>encodeChildren()</code> must take no action.</p></li>
-            
-            </ul>
-            
-            <p><code>encodeEnd()</code> must take specific action based on
-            the specific kind of resource being rendered.</p>
-            
-            </ul>
-            
-            <p>Use the algorithm <em>Common Encode Behavior</em> for
-            <code>encodeBegin()</code>, <code>encodeChildren()</code> and
-            <code>getRendersChildren()</code>.</p>
-            
-            <p>For <code>encodeEnd()</code>, use the algorithm <em>Common
-            Algorithm for Obtaining A Resource to Render</em> above to
-            obtain a reference to the <code>Resource</code> to be
-            encoded.</p>
-            
-            <p>If this is NOT the first time this <code>Resource</code> has
-            been referenced on this request take no action and return.</p>
-            
-            <p>Render a script element.  Use the result from calling
-            <code>resource.getRequestPath()</code> as the value of the "src"
-            attribue and the result from calling
-            <code>resource.getContentType()</code> as the value of the "type"
-            attribute.</p>
-            
-            </p>
-            
-            
-            
-            </ul>
-            
-            
-            
-            </div>]]>
-        </description>
-        <tag-name>
-            outputScript
-        </tag-name>
-        <component>
-            <component-type>javax.faces.Output</component-type>
-            <renderer-type>javax.faces.resource.Script</renderer-type>
-        </component>
-        <attribute>
-            <description>
-                <![CDATA[Converter instance registered with this component.]]>
-            </description>
-            <name>
-                converter
-            </name>
-            <required>
-                false
-            </required>
-            <type>
-                javax.faces.convert.Converter
-            </type>
-        </attribute>
-        <attribute>
-            <description>
-                <![CDATA[The component identifier for this component.  This value must be
-                unique within the closest parent component that is a naming
-                container.]]>
-            </description>
-            <name>
-                id
-            </name>
-            <required>
-                false
-            </required>
-            <type>
-                java.lang.String
-            </type>
-        </attribute>
-        <attribute>
-            <description>
-                <![CDATA[Flag indicating whether or not this component should be rendered
-                (during Render Response Phase), or processed on any subsequent
-                form submit.  The default value for this property is true.]]>
-            </description>
-            <name>
-                rendered
-            </name>
-            <required>
-                false
-            </required>
-            <type>
-                boolean
-            </type>
-        </attribute>
-        <attribute>
-            <description>
-                <![CDATA[The current value of this component.]]>
-            </description>
-            <name>
-                value
-            </name>
-            <required>
-                false
-            </required>
-            <type>
-                java.lang.Object
-            </type>
-        </attribute>
-        <attribute>
-            <description>
-                <![CDATA[<div class="changed_added_2_0"><p>The <em>libraryName</em> for this resource.</p></div>]]>
-            </description>
-            <name>
-                library
-            </name>
-            <required>
-                false
-            </required>
-            <type>
-                java.lang.String
-            </type>
-        </attribute>
-        <attribute>
-            <description>
-                <![CDATA[<div class="changed_added_2_0"><p>The <em>resourceName</em> for this resource.</p></div>]]>
-            </description>
-            <name>
-                name
-            </name>
-            <required>
-                false
-            </required>
-            <type>
-                java.lang.String
-            </type>
-        </attribute>
-        <attribute>
-            <description>
-                <![CDATA[<div class="changed_added_2_0"><p>The <em>target</em> area for which this resource will be rendered.  For example, <em>target="head"</em> would cause the resource to be rendered within the <em>head</em> element.</p></div>]]>
-            </description>
-            <name>
-                target
-            </name>
-            <required>
-                false
-            </required>
-            <type>
-                java.lang.String
-            </type>
-        </attribute>
-        <attribute>
-            <description>
-                The ValueExpression linking this component to a property in a
-                backing bean
-            </description>
-            <name>
-                binding
-            </name>
-            <required>
-                false
-            </required>
-            <type>
-                javax.faces.component.UIComponent
-            </type>
-        </attribute>
-    </tag>
-    <tag>
-        <description>
-            <![CDATA[<div class="changed_added_2_0">
-            
-            <p>Render the markup for a <code>&lt;link&gt;</code> element that
-            renders the style <code>Resource</code> specified by the optional
-            <code>name</code> and <code>library</code> attributes.</p>
-            
-            <p>Decode Behavior</p>
-            
-            <ul>
-            
-            <p>No action is required during decode for this renderer.</p>
-            
-            </ul>
-            
-            <p>Encode Behavior</p>
-            
-            <ul>
-            
-            <p>Use the algorithm <em>Common Encode Behavior</em> for
-            <code>encodeBegin()</code>, <code>encodeChildren()</code> and
-            <code>getRendersChildren()</code>.</p>
-            
-            <p>For <code>encodeEnd()</code>, use the algorithm <a
-            href="javax.faces.Outputjavax.faces.resource.Script.html#ResourceCommonGetResource">Common
-            Algorithm for Obtaining A Resource to Render</a> to obtain a
-            reference to the <code>Resource</code> to be encoded.</p>
-            
-            <p>Output a <code>&lt;link&gt;</code> element.  Use the result from
-            calling <code>resource.getRequestPath()</code> as the value of the
-            "href" attribute, the result from calling
-            <code>resource.getContentType()</code> as the value of the "type"
-            attribute, the literal string "stylesheet" as the value of the "rel"
-            attribute, and the literal string "screen" as the value of the "media"
-            attribute.</p>
-            
-            <p>The implementation of this renderer must have a <a target="_"
-            href="../../javadocs/javax/faces/event/ListenerFor.html"><code>@ListenerFor</code></a>
-            annotation attached to it, at the class level, declaring <a target="_"
-            href="../../javadocs/javax/faces/event/PostAddToViewEvent.html"><code>PostAddToViewEvent.class</code></a>
-            as the value of the <code>systemEventClass</code> attribute.  The presence of
-            this annotation on a renderer implies the renderer implements <a target="_"
-            href="../../javadocs/javax/faces/event/ComponentSystemEventListener.html"><code>ComponentSystemEventListener</code></a>,
-            which this renderer must do.  The implementation of
-            <code>processEvent()</code> must extract the <code>UIComponent</code>
-            from the argument event pass it to <a target="_"
-            href="../../javadocs/javax/faces/component/UIViewRoot.html#addComponentResource(javax.faces.context.FacesContext,%20javax.faces.component.UIComponent,%20java.lang.String)"><code>UIViewRoot.addComponentResource()</code></a>, specifying
-            the literal string "<code>head</code>" as the last argument.</p>
-            
-            <p>The stylsheet renderer must ensure that any stylesheets are included in the &lt;head&gt; of the document.
-            </p>
-            
-            </div>]]>
-        </description>
-        <tag-name>
-            outputStylesheet
-        </tag-name>
-        <component>
-            <component-type>javax.faces.Output</component-type>
-            <renderer-type>javax.faces.resource.Stylesheet</renderer-type>
-        </component>
-        <attribute>
-            <description>
-                <![CDATA[Converter instance registered with this component.]]>
-            </description>
-            <name>
-                converter
-            </name>
-            <required>
-                false
-            </required>
-            <type>
-                javax.faces.convert.Converter
-            </type>
-        </attribute>
-        <attribute>
-            <description>
-                <![CDATA[The component identifier for this component.  This value must be
-                unique within the closest parent component that is a naming
-                container.]]>
-            </description>
-            <name>
-                id
-            </name>
-            <required>
-                false
-            </required>
-            <type>
-                java.lang.String
-            </type>
-        </attribute>
-        <attribute>
-            <description>
-                <![CDATA[Flag indicating whether or not this component should be rendered
-                (during Render Response Phase), or processed on any subsequent
-                form submit.  The default value for this property is true.]]>
-            </description>
-            <name>
-                rendered
-            </name>
-            <required>
-                false
-            </required>
-            <type>
-                boolean
-            </type>
-        </attribute>
-        <attribute>
-            <description>
-                <![CDATA[The current value of this component.]]>
-            </description>
-            <name>
-                value
-            </name>
-            <required>
-                false
-            </required>
-            <type>
-                java.lang.Object
-            </type>
-        </attribute>
-        <attribute>
-            <description>
-                <![CDATA[<div class="changed_added_2_0"><p>The <em>libraryName</em> for this resource.</p></div>]]>
-            </description>
-            <name>
-                library
-            </name>
-            <required>
-                false
-            </required>
-            <type>
-                java.lang.String
-            </type>
-        </attribute>
-        <attribute>
-            <description>
-                <![CDATA[<div class="changed_added_2_0"><p>The <em>resourceName</em> for this resource.</p></div>]]>
-            </description>
-            <name>
-                name
-            </name>
-            <required>
-                false
-            </required>
-            <type>
-                java.lang.String
-            </type>
-        </attribute>
-        <attribute>
-            <description>
-                The ValueExpression linking this component to a property in a
-                backing bean
-            </description>
-            <name>
-                binding
-            </name>
-            <required>
-                false
-            </required>
-            <type>
-                javax.faces.component.UIComponent
-            </type>
-        </attribute>
-    </tag>
-    <tag>
-        <description>
-            Renders an HTML "table" element, conforming to the
-            rules in the HTML 401 specification. Render the "caption" facet,
-            if present, inside a "caption" element immediately below the "table"
-            element.
-            If the "captionClass" attribute is specified, render its value as
-            the value
-            of the "class" attribute on the "caption" element. If the
-            "captionStyle" attribute
-            is specified, render its value as the value of the "style" attribute
-            on the "caption" element. If the "styleClass" attribute is
-            specified, render
-            its value as the value of the "class" attribute. Render the
-            pass-through
-            attributes in the table below. Render the "header" facet, if
-            present, inside of
-            "thead", "tr", and "th" elements, nested in that order. If the
-            "headerClass" attribute is specifed, render its value as the value
-            of the "class" attribute on the "th" element. Render "colgroup"
-            as the value of the "scope" attribute. Render the value of the
-            "columns" attribute as the value of the "colspan" attribute on the
-            "th" element. Render the "footer" facet if present, using similar
-            logic to the rendering of the "header", but replacing "thead" with
-            "tfoot", "th" with "td", and "headerClass" with "footerClass".
-            Render the children of the &lt;code&gt;UIPanel&lt;/code&gt;
-            component inside
-            of a "tbody" element. Render the children based on the value of
-            the "columns" attribute, creating a new row each time a "columns"
-            worth of children have been rendered. For the start of each row,
-            render a "tr" element. Output the value of the "rowClasses" per
-            the attribute description below. For each child, output a "td"
-            element, attaching the value of the "columnClasses" attribute per
-            the attribute description below. Recursively encode each child.
-            Close out the "td" element. When done with the row, close out the
-            "tr" element. If a child has "rendered==false" it is not rendered,
-            and the column counter must not be incremented.
-        </description>
-        <tag-name>panelGrid</tag-name>
-        <component>
-            <component-type>javax.faces.HtmlPanelGrid</component-type>
-            <renderer-type>javax.faces.Grid</renderer-type>
-        </component>
-        <attribute>
-            <description>
-                The component identifier for this component. This value must be
-                unique within the closest parent component that is a naming
-                container.
-            </description>
-            <name>id</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Flag indicating whether or not this component should be rendered
-                (during Render Response Phase), or processed on any subsequent
-                form submit. The default value for this property is true.
-            </description>
-            <name>rendered</name>
-            <required>false</required>
-            <type>boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-                Name or code of the background color for this table.
-            </description>
-            <name>bgcolor</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Comma separated list of row indices for which a new
-                "tbody" element should be started (and any
-                previously opened one should be ended).
-            </description>
-            <name>bodyrows</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Width (in pixels) of the border to be drawn
-                around this table.
-            </description>
-            <name>border</name>
-            <required>false</required>
-            <type>int</type>
-        </attribute>
-        <attribute>
-            <description>
-                Space-separated list of CSS style class(es) that will be
-                applied to any caption generated for this table.
-            </description>
-            <name>captionClass</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                CSS style(s) to be applied when this caption is rendered.
-            </description>
-            <name>captionStyle</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Definition of how much space the user agent should
-                leave between the border of each cell and its contents.
-            </description>
-            <name>cellpadding</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Definition of how much space the user agent should
-                leave between the left side of the table and the
-                leftmost column, the top of the table and the top of
-                the top side of the topmost row, and so on for the
-                right and bottom of the table. It also specifies
-                the amount of space to leave between cells.
-            </description>
-            <name>cellspacing</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Comma-delimited list of CSS style classes that will be applied
-                to the columns of this table. A space separated list of
-                classes may also be specified for any individual column. If
-                the number of elements in this list is less than the number of
-                actual column children of the UIData, no "class"
-                attribute is output for each column greater than the number of
-                elements in the list. If the number of elements in the list
-                is greater than the number of actual column children of the
-                UIData, the elements at the posisiton in the list
-                after the last column are ignored.
-            </description>
-            <name>columnClasses</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                The number of columns to render before
-                starting a new row.
-            </description>
-            <name>columns</name>
-            <required>false</required>
-            <type>int</type>
-        </attribute>
-        <attribute>
-            <description>
-                Direction indication for text that does not inherit
-                directionality.
-                Valid values are "LTR" (left-to-right) and "RTL"
-                (right-to-left).
-            </description>
-            <name>dir</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Space-separated list of CSS style class(es) that will be
-                applied to any footer generated for this table.
-            </description>
-            <name>footerClass</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Code specifying which sides of the frame surrounding
-                this table will be visible. Valid values are:
-                none (no sides, default value); above (top side only);
-                below (bottom side only); hsides (top and bottom sides
-                only); vsides (right and left sides only); lhs (left
-                hand side only); rhs (right hand side only); box
-                (all four sides); and border (all four sides).
-            </description>
-            <name>frame</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Space-separated list of CSS style class(es) that will be
-                applied to any header generated for this table.
-            </description>
-            <name>headerClass</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Code describing the language used in the generated markup
-                for this component.
-            </description>
-            <name>lang</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                clicked over this element.
-            </description>
-            <name>onclick</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                double clicked over this element.
-            </description>
-            <name>ondblclick</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a key is
-                pressed down over this element.
-            </description>
-            <name>onkeydown</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a key is
-                pressed and released over this element.
-            </description>
-            <name>onkeypress</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a key is
-                released over this element.
-            </description>
-            <name>onkeyup</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                pressed down over this element.
-            </description>
-            <name>onmousedown</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                moved within this element.
-            </description>
-            <name>onmousemove</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                moved away from this element.
-            </description>
-            <name>onmouseout</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                moved onto this element.
-            </description>
-            <name>onmouseover</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                released over this element.
-            </description>
-            <name>onmouseup</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Comma-delimited list of CSS style classes that will be applied
-                to the rows of this table. A space separated list of classes
-                may also be specified for any individual row. Thes styles are
-                applied, in turn, to each row in the table. For example, if
-                the list has two elements, the first style class in the list
-                is applied to the first row, the second to the second row, the
-                first to the third row, the second to the fourth row, etc. In
-                other words, we keep iterating through the list until we reach
-                the end, and then we start at the beginning again.
-            </description>
-            <name>rowClasses</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Code specifying which rules will appear between cells
-                within this table. Valid values are: none (no rules,
-                default value); groups (between row groups); rows
-                (between rows only); cols (between columns only); and
-                all (between all rows and columns).
-            </description>
-            <name>rules</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                CSS style(s) to be applied when this component is rendered.
-            </description>
-            <name>style</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Space-separated list of CSS style class(es) to be applied when
-                this element is rendered. This value must be passed through
-                as the "class" attribute on generated markup.
-            </description>
-            <name>styleClass</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Summary of this table's purpose and structure, for
-                user agents rendering to non-visual media such as
-                speech and Braille.
-            </description>
-            <name>summary</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Advisory title information about markup elements generated
-                for this component.
-            </description>
-            <name>title</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Width of the entire table, for visual user agents.
-            </description>
-            <name>width</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                The ValueExpression linking this component to a property in a
-                backing bean
-            </description>
-            <name>binding</name>
-            <required>false</required>
-            <type>javax.faces.component.UIComponent</type>
-        </attribute>
-    </tag>
-    <tag>
-        <description>
-            Intended for use in situations when only one
-            UIComponent child can be nested, such as in the case of facets.
-            If the "style" or "styleClass" attributes are present, and the
-            "layout"
-            attribute is present with a value of "block", render a "div"
-            element,
-            outputting the value of the "style" attribute as the value of the
-            "style" attribute and the value of the "styleClass" attribute as the
-            value of the "class" attribute. Otherwise, if the "layout" attribute
-            is not present, or the "layout" attribute contains a value other
-            than
-            "block", render a "span" element, outputting the value of the
-            "style" attribute as the value of the "style" attribute, and the
-            value
-            of the "styleClass" attribute as the value of the "class"
-            attribute.
-        </description>
-        <tag-name>panelGroup</tag-name>
-        <component>
-            <component-type>javax.faces.HtmlPanelGroup</component-type>
-            <renderer-type>javax.faces.Group</renderer-type>
-        </component>
-        <attribute>
-            <description>
-                The component identifier for this component. This value must be
-                unique within the closest parent component that is a naming
-                container.
-            </description>
-            <name>id</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Flag indicating whether or not this component should be rendered
-                (during Render Response Phase), or processed on any subsequent
-                form submit. The default value for this property is true.
-            </description>
-            <name>rendered</name>
-            <required>false</required>
-            <type>boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-                The type of layout markup to use when rendering this group.
-                If the value is "block" the renderer must produce an HTML
-                "div" element. Otherwise HTML "span" element must
-                be produced.
-            </description>
-            <name>layout</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                CSS style(s) to be applied when this component is rendered.
-            </description>
-            <name>style</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Space-separated list of CSS style class(es) to be applied when
-                this element is rendered. This value must be passed through
-                as the "class" property on generated markup.
-            </description>
-            <name>styleClass</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                The ValueExpression linking this component to a property in a
-                backing bean
-            </description>
-            <name>binding</name>
-            <required>false</required>
-            <type>javax.faces.component.UIComponent</type>
-        </attribute>
-    </tag>
-    <tag>
-        <description>
-            &lt;p&gt;Renders an HTML "input" element of type "checkbox".&lt;/p&gt;
-            &lt;p&gt;Decode Behavior&lt;/p&gt;
-            &lt;ul&gt;
-            &lt;p&gt;Obtain the &lt;code&gt;Map&lt;/code&gt; from the
-            "requestParameterMap"
-            property of the &lt;code&gt;ExternalContext&lt;/code&gt;. If there
-            is no
-            entry in the &lt;code&gt;Map&lt;/code&gt; for the "clientId" of this
-            component, pass "false" to the &lt;code&gt;setSubmittedValue()&lt;/code&gt;
-            method of the component, which must be an instance of
-            &lt;code&gt;EditableValueHolder&lt;/code&gt;. If there is an entry,
-            and its
-            value is equal, ignoring case and without quotes, to any of the
-            Strings: "on", "yes" or "true" pass true to the
-            &lt;code&gt;setSubmittedValue()&lt;/code&gt; method of the
-            component.&lt;/p&gt;
-            &lt;/ul&gt;
-            &lt;p&gt;Encode Behavior&lt;/p&gt;
-            &lt;ul&gt;
-            &lt;p&gt;
-            Render the clientId of the component as the value of the "name"
-            attribute. If the current value of the component is "true",
-            output the "checked" attribute (must be rendered as
-            checked="checked").
-            If the "styleClass" attribute is specified, render its value as the
-            value
-            of the "class" attribute.&lt;/p&gt; &lt;/ul&gt;
-        </description>
-        <tag-name>selectBooleanCheckbox</tag-name>
-        <component>
-            <component-type>javax.faces.HtmlSelectBooleanCheckbox
-            </component-type>
-            <renderer-type>javax.faces.Checkbox</renderer-type>
-        </component>
-        <attribute>
-            <description>
-                Converter instance registered with this component.
-            </description>
-            <name>converter</name>
-            <required>false</required>
-            <type>javax.faces.convert.Converter</type>
-        </attribute>
-        <attribute>
-            <description>
-                A ValueExpression enabled attribute that, if present, will be
-                used as the text of the converter message, replacing any message
-                that comes from the converter.
-            </description>
-            <name>converterMessage</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                The component identifier for this component. This value must be
-                unique within the closest parent component that is a naming
-                container.
-            </description>
-            <name>id</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Flag indicating that this component's value must be
-                converted and validated immediately (that is, during
-                Apply Request Values phase), rather than waiting
-                until Process Validations phase.
-            </description>
-            <name>immediate</name>
-            <required>false</required>
-            <type>boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-                Flag indicating whether or not this component should be rendered
-                (during Render Response Phase), or processed on any subsequent
-                form submit. The default value for this property is true.
-            </description>
-            <name>rendered</name>
-            <required>false</required>
-            <type>boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-                Flag indicating that the user is required to provide a submitted
-                value for this input component.
-            </description>
-            <name>required</name>
-            <required>false</required>
-            <type>boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-                A ValueExpression enabled attribute that, if present, will be
-                used as the text of the validation message for the "required"
-                facility, if the "required" facility is used.
-            </description>
-            <name>requiredMessage</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                MethodExpression representing a validator method that will be
-                called
-                during Process Validations to perform correctness checks on the
-                value of this component. The expression must evaluate to a
-                public
-                method that takes FacesContext, UIComponent, and Object
-                parameters,
-                with a return type of void.
-            </description>
-            <name>validator</name>
-            <required>false</required>
-            <method-signature>void validate(javax.faces.context.FacesContext,
-                javax.faces.component.UIComponent, java.lang.Object)
-            </method-signature>
-        </attribute>
-        <attribute>
-            <description>
-                A ValueExpression enabled attribute that, if present, will be
-                used as the text of the validator message, replacing any
-                message that comes from the validator.
-            </description>
-            <name>validatorMessage</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                The current value of this component.
-            </description>
-            <name>value</name>
-            <required>false</required>
-            <type>java.lang.Boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-                &lt;p&gt;
-                MethodExpression representing a value change listener method
-                that will be notified when a new value has been set for this
-                input component. The expression must evaluate to a public
-                method that takes a &lt;code&gt;ValueChangeEvent&lt;/code&gt;
-                parameter,
-                with a return type of void, &lt;span class="changed_added_2_0"&gt;or
-                to a public method that takes no arguments with a return type
-                of void. In the latter case, the method has no way of easily
-                knowing what the new value is, but this can be useful in cases
-                where a notification is needed that "this value
-                changed".&lt;/span&gt;
-                &lt;/p&gt;
-            </description>
-            <name>valueChangeListener</name>
-            <required>false</required>
-            <method-signature>void
-                valueChange(javax.faces.event.ValueChangeEvent)
-            </method-signature>
-        </attribute>
-        <attribute>
-            <description>
-                Access key that, when pressed, transfers focus
-                to this element.
-            </description>
-            <name>accesskey</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Direction indication for text that does not inherit
-                directionality.
-                Valid values are "LTR" (left-to-right) and "RTL"
-                (right-to-left).
-            </description>
-            <name>dir</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Flag indicating that this element must never receive focus or
-                be included in a subsequent submit. A value of false causes
-                no attribute to be rendered, while a value of true causes the
-                attribute to be rendered as disabled="disabled".
-            </description>
-            <name>disabled</name>
-            <required>false</required>
-            <type>boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-                A localized user presentable name for this component.
-            </description>
-            <name>label</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Code describing the language used in the generated markup
-                for this component.
-            </description>
-            <name>lang</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when this element loses focus.
-            </description>
-            <name>onblur</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when this element loses focus
-                and its value has been modified since gaining focus.
-            </description>
-            <name>onchange</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                clicked over this element.
-            </description>
-            <name>onclick</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                double clicked over this element.
-            </description>
-            <name>ondblclick</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when this element receives focus.
-            </description>
-            <name>onfocus</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a key is
-                pressed down over this element.
-            </description>
-            <name>onkeydown</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a key is
-                pressed and released over this element.
-            </description>
-            <name>onkeypress</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a key is
-                released over this element.
-            </description>
-            <name>onkeyup</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                pressed down over this element.
-            </description>
-            <name>onmousedown</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                moved within this element.
-            </description>
-            <name>onmousemove</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                moved away from this element.
-            </description>
-            <name>onmouseout</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                moved onto this element.
-            </description>
-            <name>onmouseover</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                released over this element.
-            </description>
-            <name>onmouseup</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when text within this
-                element is selected by the user.
-            </description>
-            <name>onselect</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Flag indicating that this component will prohibit changes by
-                the user. The element may receive focus unless it has also
-                been disabled. A value of false causes
-                no attribute to be rendered, while a value of true causes the
-                attribute to be rendered as readonly="readonly".
-            </description>
-            <name>readonly</name>
-            <required>false</required>
-            <type>boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-                CSS style(s) to be applied when this component is rendered.
-            </description>
-            <name>style</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Space-separated list of CSS style class(es) to be applied when
-                this element is rendered. This value must be passed through
-                as the "class" attribute on generated markup.
-            </description>
-            <name>styleClass</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Position of this element in the tabbing order
-                for the current document. This value must be
-                an integer between 0 and 32767.
-            </description>
-            <name>tabindex</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Advisory title information about markup elements generated
-                for this component.
-            </description>
-            <name>title</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                The ValueExpression linking this component to a property in a
-                backing bean
-            </description>
-            <name>binding</name>
-            <required>false</required>
-            <type>javax.faces.component.UIComponent</type>
-        </attribute>
-    </tag>
-    <tag>
-        <description>
-            &lt;p&gt;&lt;span
-            class="changed_modified_2_0"&gt;Render&lt;/span&gt; an HTML checkbox
-            list.&lt;/p&gt;
-            &lt;p&gt;&lt;a name="decode"&gt;Decode Behavior&lt;/a&gt;&lt;/p&gt;
-            &lt;ul&gt;
-            &lt;p&gt;See the &lt;a
-            href="SelectManyListbox.html"&gt;"Decode
-            Behavior for UISelectMany Components"&lt;/a&gt; section.&lt;/p&gt;
-            &lt;/ul&gt;
-            &lt;p&gt;Encode Behavior&lt;/p&gt;
-            &lt;ul&gt;
-            &lt;p&gt;Render a "table" element. If the "styleClass" is specified,
-            render the value of the "styleClass" attribute as the value of the
-            "class" attribute on the "table" element. If the "style", or
-            "border" attributes are specified, pass them thru &lt;span
-            class="changed_added_2_0"&gt;and render their values as the "style"
-            and "border" attributes on the "table", respectively.&lt;/span&gt;
-            If
-            the "layout" attribute is specified, and its value is
-            "pageDirection", render the children elements vertically,
-            otherwise horizontally, in the table. If any of the children are
-            an instance of SelectItemGroup, render them as a nested table.
-            Each of the children are ultimately rendererd as follows. Render
-            an "input" element of "type" "checkbox" for each child component.
-            Render the "name" attribute on the "input" element with the value
-            of the &lt;code&gt;clientId&lt;/code&gt; of the component. Render an
-            "id"
-            attribute on the "input" element. Each "id" value must be unique.
-            If the current SelectItem.isDisabled() returns true, render
-            "disabled" as the value of the "disabled" attribute. Close out
-            the "input" element. Render a "label" element. Render the "for"
-            attribute of the "label" element whose value is the corresponding
-            "input" element's "id" value. Render any "style" as the "class"
-            attribute on the "label" element. &lt;span
-            class="changed_added_2_0"&gt;If the current checkbox would be
-            rendered as being checked, and there is a "selectedClass"
-            attribute, append a space, followed by the value of the
-            "selectedClass" attribute to any existing "class" attribute value
-            on the label element. Otherwise, render the value of the
-            "selectedClass" attribute as the value of the "class" attribute on
-            the label element. If the current checkbox would be rendered as
-            being not checked, and there is a "unselectedClass" attribute,
-            append a space, followed by the value of the "unselectedClass"
-            attribute to any existing "class" attribute value on the label
-            element. Otherwise, render the value of the "unselectedClass"
-            attribute as the value of the "class" attribute on the label
-            element.&lt;/span&gt; Close out the starting "label" element and
-            render
-            the label value from SelectItem.getLabel(). Close out the "label"
-            element. As an exception to the general rules about how to handle
-            the "id" attribute, render it as an attribute on the outer "table"
-            element, the value of which is the &lt;code&gt;clientId&lt;/code&gt;
-            of the
-            component per the rules at the beginning of this specification.
-            The value of the current SelectItem is rendered as the value of
-            the "value" attribute. Coerce the value of the currently rendered
-            child to the type of the parent UISelectMany value following the
-            Expression Language coercion rules, before comparing the values.
-            If the value of the enclosing UISelectMany matches the current
-            value, render "checked" as the value of the "checked" attribute.
-            See the &lt;a
-            href="SelectManyListbox.html"&gt;"Rendering
-            the option elements" &lt;/a&gt; specification for
-            &lt;code&gt;ListboxRenderer&lt;/code&gt; for more detail on how to
-            render the
-            "option" elements in this renderer.&lt;/p&gt;
-            &lt;/ul&gt;
-        </description>
-        <tag-name>selectManyCheckbox</tag-name>
-        <component>
-            <component-type>javax.faces.HtmlSelectManyCheckbox</component-type>
-            <renderer-type>javax.faces.Checkbox</renderer-type>
-        </component>
-        <attribute>
-            <description>
-                Converter instance registered with this component.
-            </description>
-            <name>converter</name>
-            <required>false</required>
-            <type>javax.faces.convert.Converter</type>
-        </attribute>
-        <attribute>
-            <description>
-                A ValueExpression enabled attribute that, if present, will be
-                used as the text of the converter message, replacing any message
-                that comes from the converter.
-            </description>
-            <name>converterMessage</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                The component identifier for this component. This value must be
-                unique within the closest parent component that is a naming
-                container.
-            </description>
-            <name>id</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Flag indicating that this component's value must be
-                converted and validated immediately (that is, during
-                Apply Request Values phase), rather than waiting
-                until Process Validations phase.
-            </description>
-            <name>immediate</name>
-            <required>false</required>
-            <type>boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-                Flag indicating whether or not this component should be rendered
-                (during Render Response Phase), or processed on any subsequent
-                form submit. The default value for this property is true.
-            </description>
-            <name>rendered</name>
-            <required>false</required>
-            <type>boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-                Flag indicating that the user is required to provide a submitted
-                value for this input component.
-            </description>
-            <name>required</name>
-            <required>false</required>
-            <type>boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-                A ValueExpression enabled attribute that, if present, will be
-                used as the text of the validation message for the "required"
-                facility, if the "required" facility is used.
-            </description>
-            <name>requiredMessage</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                MethodExpression representing a validator method that will be
-                called
-                during Process Validations to perform correctness checks on the
-                value of this component. The expression must evaluate to a
-                public
-                method that takes FacesContext, UIComponent, and Object
-                parameters,
-                with a return type of void.
-            </description>
-            <name>validator</name>
-            <required>false</required>
-            <method-signature>void validate(javax.faces.context.FacesContext,
-                javax.faces.component.UIComponent, java.lang.Object)
-            </method-signature>
-        </attribute>
-        <attribute>
-            <description>
-                A ValueExpression enabled attribute that, if present, will be
-                used as the text of the validator message, replacing any
-                message that comes from the validator.
-            </description>
-            <name>validatorMessage</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                The current value of this component.
-            </description>
-            <name>value</name>
-            <required>false</required>
-            <type>java.lang.Object</type>
-        </attribute>
-        <attribute>
-            <description>
-                &lt;p&gt;
-                MethodExpression representing a value change listener method
-                that will be notified when a new value has been set for this
-                input component. The expression must evaluate to a public
-                method that takes a &lt;code&gt;ValueChangeEvent&lt;/code&gt;
-                parameter,
-                with a return type of void, &lt;span class="changed_added_2_0"&gt;or
-                to a public method that takes no arguments with a return type
-                of void. In the latter case, the method has no way of easily
-                knowing what the new value is, but this can be useful in cases
-                where a notification is needed that "this value
-                changed".&lt;/span&gt;
-                &lt;/p&gt;
-            </description>
-            <name>valueChangeListener</name>
-            <required>false</required>
-            <method-signature>void
-                valueChange(javax.faces.event.ValueChangeEvent)
-            </method-signature>
-        </attribute>
-        <attribute>
-            <description>
-                Access key that, when pressed, transfers focus
-                to this element.
-            </description>
-            <name>accesskey</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Width (in pixels) of the border to be drawn
-                around the table containing the options list.
-            </description>
-            <name>border</name>
-            <required>false</required>
-            <type>int</type>
-        </attribute>
-        <attribute>
-            <description>
-                &lt;p class="changed_modified_2_0"&gt; Optional
-                attribute that is a literal string that is the fully qualified
-                class name of a concrete class that implements
-                &lt;code&gt;java.util.Collection&lt;/code&gt;, or an EL
-                expression that
-                evaluates to either 1. such a String, or 2. the
-                &lt;code&gt;Class&lt;/code&gt; object itself. &lt;/p&gt;
-            </description>
-            <name>collectionType</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Direction indication for text that does not inherit
-                directionality.
-                Valid values are "LTR" (left-to-right) and "RTL"
-                (right-to-left).
-            </description>
-            <name>dir</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Flag indicating that this element must never receive focus or
-                be included in a subsequent submit. A value of false causes
-                no attribute to be rendered, while a value of true causes the
-                attribute to be rendered as disabled="disabled".
-            </description>
-            <name>disabled</name>
-            <required>false</required>
-            <type>boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-                CSS style class to apply to the rendered label
-                on disabled options.
-            </description>
-            <name>disabledClass</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                CSS style class to apply to the rendered label
-                on enabled options.
-            </description>
-            <name>enabledClass</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                &lt;p class="changed_modified_2_0"&gt;
-                Flag indicating that, if this component is activated by the
-                user,
-                The "no selection option", if any, must be hidden.&lt;/p&gt;
-            </description>
-            <name>hideNoSelectionOption</name>
-            <required>false</required>
-            <type>boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-                A localized user presentable name for this component.
-            </description>
-            <name>label</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Code describing the language used in the generated markup
-                for this component.
-            </description>
-            <name>lang</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Orientation of the options list to be created.
-                Valid values are "pageDirection" (list is laid
-                out vertically), or "lineDirection" (list is
-                laid out horizontally). If not specified, the
-                default value is "lineDirection".
-            </description>
-            <name>layout</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when this element loses focus.
-            </description>
-            <name>onblur</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when this element loses focus
-                and its value has been modified since gaining focus.
-            </description>
-            <name>onchange</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                clicked over this element.
-            </description>
-            <name>onclick</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                double clicked over this element.
-            </description>
-            <name>ondblclick</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when this element receives focus.
-            </description>
-            <name>onfocus</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a key is
-                pressed down over this element.
-            </description>
-            <name>onkeydown</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a key is
-                pressed and released over this element.
-            </description>
-            <name>onkeypress</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a key is
-                released over this element.
-            </description>
-            <name>onkeyup</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                pressed down over this element.
-            </description>
-            <name>onmousedown</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                moved within this element.
-            </description>
-            <name>onmousemove</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                moved away from this element.
-            </description>
-            <name>onmouseout</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                moved onto this element.
-            </description>
-            <name>onmouseover</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                released over this element.
-            </description>
-            <name>onmouseup</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when text within this
-                element is selected by the user.
-            </description>
-            <name>onselect</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Flag indicating that this component will prohibit changes by
-                the user. The element may receive focus unless it has also
-                been disabled. A value of false causes
-                no attribute to be rendered, while a value of true causes the
-                attribute to be rendered as readonly="readonly".
-            </description>
-            <name>readonly</name>
-            <required>false</required>
-            <type>boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-                CSS style class to apply to the rendered label
-                on selected options.
-            </description>
-            <name>selectedClass</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                CSS style(s) to be applied when this component is rendered.
-            </description>
-            <name>style</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Space-separated list of CSS style class(es) to be applied when
-                this element is rendered. This value must be passed through
-                as the "class" attribute on generated markup.
-            </description>
-            <name>styleClass</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Position of this element in the tabbing order
-                for the current document. This value must be
-                an integer between 0 and 32767.
-            </description>
-            <name>tabindex</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Advisory title information about markup elements generated
-                for this component.
-            </description>
-            <name>title</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                CSS style class to apply to the rendered label
-                on unselected options.
-            </description>
-            <name>unselectedClass</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                The ValueExpression linking this component to a property in a
-                backing bean
-            </description>
-            <name>binding</name>
-            <required>false</required>
-            <type>javax.faces.component.UIComponent</type>
-        </attribute>
-    </tag>
-    <tag>
-        <description>
-            &lt;p&gt;&lt;span
-            class="changed_modified_2_0"&gt;Render&lt;/span&gt; an HTML option
-            list.&lt;/p&gt;
-            &lt;p&gt;Decode Behavior&lt;/p&gt;
-            &lt;p&gt;This section documents the decode behavior for all
-            renderers
-            that handle &lt;code&gt;UISelectMany&lt;/code&gt; or &lt;code&gt;UISelectOne&lt;/code&gt;
-            components.&lt;/p&gt;
-            &lt;ul&gt;
-            &lt;p&gt;&lt;a name="decodeMany"&gt;Decode Behavior for
-            &lt;code&gt;UISelectMany&lt;/code&gt; components&lt;/a&gt;&lt;/p&gt;
-            &lt;ul&gt;
-            &lt;p&gt;Obtain the &lt;code&gt;Map&lt;/code&gt; from the
-            "requestParameterValuesMap" property of the
-            &lt;code&gt;ExternalContext&lt;/code&gt;. If the &lt;code&gt;Map&lt;/code&gt;
-            contains
-            an entry for the "clientId" of the component, pass the value of
-            the entry, cast to a &lt;code&gt;String []&lt;/code&gt;, to the
-            &lt;code&gt;setSubmittedValue()&lt;/code&gt; method of the
-            component, which
-            must be an &lt;code&gt;EditableValueHolder&lt;/code&gt;. If the
-            &lt;code&gt;Map&lt;/code&gt; does not contain an entry, create an
-            empty
-            &lt;code&gt;String&lt;/code&gt; array and call
-            &lt;code&gt;setSubmittedValue()&lt;/code&gt; with it.&lt;/p&gt;
-            &lt;p class="changed_modified_2_0"&gt;Please check the javadoc for
-            &lt;a
-            href="../../javadocs/javax/faces/component/UISelectMany.html#getConvertedvalue"&gt;UISelectMany.getConvertedValue()&lt;/a&gt;
-            for additional requirements for renderers that render this kind
-            of component.&lt;/p&gt;
-            &lt;/ul&gt;
-            &lt;p&gt;&lt;a name="decodeOne"&gt;Decode Behavior for
-            &lt;code&gt;UISelectOne&lt;/code&gt; components&lt;/a&gt;&lt;/p&gt;
-            &lt;ul&gt;
-            &lt;p&gt;Obtain the &lt;code&gt;Map&lt;/code&gt; from the
-            "requestParameterMap"
-            property of the &lt;code&gt;ExternalContext&lt;/code&gt;. If there
-            is a
-            &lt;code&gt;Map&lt;/code&gt; entry for the "clientId" property of
-            the
-            component, pass it to the &lt;code&gt;setSubmittedValue()&lt;/code&gt;
-            method
-            of the component. &lt;span class="changed_added_2_0"&gt;If the
-            &lt;code&gt;Map&lt;/code&gt; does not contain an entry, call
-            &lt;code&gt;setSubmittedValue()&lt;/code&gt; passing an empty
-            &lt;code&gt;String&lt;/code&gt; as the argument.&lt;/span&gt; &lt;/p&gt;
-            &lt;/ul&gt;
-            &lt;p&gt;Encode Behavior&lt;/p&gt;
-            &lt;ul&gt;
-            &lt;p&gt;Render an HTML "select" element. Render the clientId of
-            the component as the value of the "name" attribute. If the
-            "styleClass"
-            attribute is specified, render its value as the value of the "class"
-            attribute on the "select" element. If the component is a
-            &lt;code&gt;UISelectMany&lt;/code&gt; instance, render "multiple" as
-            the value of the
-            "multiple" attribute. If the "size" attribute is specified, render
-            its
-            value as the value of the "size" attribute. Otherwise use the number
-            of
-            items as the value of the "size" attribute.&lt;/p&gt;
-            &lt;/ul&gt;
-            &lt;p&gt;&lt;a name="option"&gt;Rendering the "option" elements&lt;/a&gt;&lt;/p&gt;
-            &lt;ul&gt;
-            &lt;p&gt;The only valid children of this component are
-            &lt;code&gt;UISelectItem&lt;/code&gt; or &lt;code&gt;UISelectItems&lt;/code&gt;
-            instances. Iterate over the children of this component, and accrue
-            a list of &lt;code&gt;javax.faces.model.SelectItem&lt;/code&gt;
-            instances.
-            &lt;span class="changed_added_2_0"&gt;If the current child is a
-            &lt;code&gt;SelectItem&lt;/code&gt; whose &lt;code&gt;noSelctionProperty&lt;/code&gt;
-            is
-            &lt;code&gt;true&lt;/code&gt;, &lt;b&gt;and&lt;/b&gt; the &lt;code&gt;UISelectOne&lt;/code&gt;
-            or
-            &lt;code&gt;UISelectMany&lt;/code&gt; parent of this option has one
-            or more
-            selected values that &lt;b&gt;are not&lt;/b&gt; the "no selection"
-            &lt;code&gt;SelectItem&lt;/code&gt;, &lt;b&gt;and&lt;/b&gt; the
-            component has a
-            "hideNoSelectionLabel" attribute whose value is &lt;code&gt;true&lt;/code&gt;,
-            then the current option, which is the "no selection" option, must
-            not be rendered.&lt;/span&gt; If the current child is a
-            &lt;code&gt;UISelectItem&lt;/code&gt; create a &lt;code&gt;SelectItem&lt;/code&gt;instance
-            from its &lt;code&gt;itemValue, itemLabel&lt;/code&gt;, &lt;code
-            class="changed_added_2_0"&gt;itemEscaped&lt;/code&gt;, and
-            &lt;code&gt;itemDescription&lt;/code&gt; properties, add it to the
-            list. If
-            the current child is a &lt;code&gt;UISelectItems&lt;/code&gt;
-            instance, call
-            its &lt;code&gt;getValue()&lt;/code&gt; method. If the result is a
-            &lt;code&gt;SelectItem&lt;/code&gt; bean, add it to the list. If the
-            result
-            is an array of &lt;code&gt;SelectItem&lt;/code&gt; beans, add each
-            one to the
-            list. If the result is a &lt;code&gt;Collection&lt;/code&gt; of
-            &lt;code&gt;SelectItem&lt;/code&gt; beans, add each one to the list.
-            If the
-            result is a &lt;code&gt;Map&lt;/code&gt;, create a &lt;code&gt;SelectItem&lt;/code&gt;
-            bean for each entry in the &lt;code&gt;Map&lt;/code&gt; using the
-            key as the
-            label, the value as the value, and &lt;code&gt;null&lt;/code&gt; as
-            the
-            description.&lt;/p&gt;
-            &lt;p&gt;Iterate over the list of &lt;code&gt;SelectItem&lt;/code&gt;
-            beans. If the
-            current element is a &lt;code&gt;SelectItemGroup&lt;/code&gt;,
-            render an
-            "optgroup" element with a "label" attribute, the value of which is
-            the "label" property from the current element, then call
-            &lt;code&gt;getSelectItems()&lt;/code&gt; and render each element as
-            below.
-            If the current element is not a &lt;code&gt;SelectItemGroup&lt;/code&gt;,
-            render an "option" element. Follow the conversion rules in the
-            spec to obtain a renderable &lt;code&gt;String&lt;/code&gt; from the
-            "value"
-            property of the current element, render that as the value of the
-            "value" atribute. Now it is time to see if the current element is
-            the selected value. Call its &lt;code&gt;getSubmittedValue()&lt;/code&gt;
-            method, casting the result to an &lt;code&gt;Object []&lt;/code&gt;,
-            otherwise
-            the component must be a &lt;code&gt;UISelectOne&lt;/code&gt;
-            instance, call
-            its &lt;code&gt;getSubmittedValue()&lt;/code&gt; method and create
-            an
-            &lt;code&gt;Object []&lt;/code&gt; around the result. Determine the
-            type of
-            the resultant array, if the resultant array is non-null, otherwise
-            the type is &lt;code&gt;String&lt;/code&gt;. Coerce the current item
-            value to
-            this type following the Expression Language coercion rules. If
-            the resultant array is non-null, we look in the array for a value
-            that, when we pass the renderable value to its
-            &lt;code&gt;equals()&lt;/code&gt; method, it returns &lt;code&gt;true&lt;/code&gt;,
-            meaning the current element is selected. If the resultant array
-            is &lt;code&gt;null&lt;/code&gt;, if the component is a
-            &lt;code&gt;UISelectMany&lt;/code&gt;, call its &lt;code&gt;getValue()&lt;/code&gt;
-            method. If the result is a &lt;code&gt;List&lt;/code&gt; obtain the
-            values in
-            the list as an array. Otherwise, the component must be a
-            &lt;code&gt;UISelectOne&lt;/code&gt; instance. Call its
-            &lt;code&gt;getValue()&lt;/code&gt; method, which must be an Object
-            array.
-            Look for an element in the resultant array that, 1. when we pass
-            the renderable value to its &lt;code&gt;equals()&lt;/code&gt;
-            method, it
-            returns &lt;code&gt;true&lt;/code&gt; , or 2. if the renderable
-            value is null,
-            and there is a null element in the array, also conclude that the
-            current element is selected. Otherwise the current element is not
-            selected. Now, if the current value is selected, write out an
-            HTML boolean property "selected". If the current
-            SelectItem.isDisabled() returns true, render "disabled" as the
-            value of the "disabled" attribute. &lt;span
-            class="changed_added_2_0"&gt;If the value of the &lt;code&gt;escape&lt;/code&gt;
-            property is true, use the &lt;code&gt;writeText()&lt;/code&gt;
-            method of
-            &lt;code&gt;ResponseWriter&lt;/code&gt; to write out the value of
-            the
-            &lt;code&gt;label&lt;/code&gt; property. Otherwise, use the
-            &lt;code&gt;write()&lt;/code&gt; method of the &lt;code&gt;ResponseWriter&lt;/code&gt;
-            to
-            do so.&lt;/span&gt;&lt;/p&gt;
-            &lt;/ul&gt;
-            &lt;/ul&gt;
-        </description>
-        <tag-name>selectManyListbox</tag-name>
-        <component>
-            <component-type>javax.faces.HtmlSelectManyListbox</component-type>
-            <renderer-type>javax.faces.Listbox</renderer-type>
-        </component>
-        <attribute>
-            <description>
-                Converter instance registered with this component.
-            </description>
-            <name>converter</name>
-            <required>false</required>
-            <type>javax.faces.convert.Converter</type>
-        </attribute>
-        <attribute>
-            <description>
-                A ValueExpression enabled attribute that, if present, will be
-                used as the text of the converter message, replacing any message
-                that comes from the converter.
-            </description>
-            <name>converterMessage</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                The component identifier for this component. This value must be
-                unique within the closest parent component that is a naming
-                container.
-            </description>
-            <name>id</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Flag indicating that this component's value must be
-                converted and validated immediately (that is, during
-                Apply Request Values phase), rather than waiting
-                until Process Validations phase.
-            </description>
-            <name>immediate</name>
-            <required>false</required>
-            <type>boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-                Flag indicating whether or not this component should be rendered
-                (during Render Response Phase), or processed on any subsequent
-                form submit. The default value for this property is true.
-            </description>
-            <name>rendered</name>
-            <required>false</required>
-            <type>boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-                Flag indicating that the user is required to provide a submitted
-                value for this input component.
-            </description>
-            <name>required</name>
-            <required>false</required>
-            <type>boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-                A ValueExpression enabled attribute that, if present, will be
-                used as the text of the validation message for the "required"
-                facility, if the "required" facility is used.
-            </description>
-            <name>requiredMessage</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                MethodExpression representing a validator method that will be
-                called
-                during Process Validations to perform correctness checks on the
-                value of this component. The expression must evaluate to a
-                public
-                method that takes FacesContext, UIComponent, and Object
-                parameters,
-                with a return type of void.
-            </description>
-            <name>validator</name>
-            <required>false</required>
-            <method-signature>void validate(javax.faces.context.FacesContext,
-                javax.faces.component.UIComponent, java.lang.Object)
-            </method-signature>
-        </attribute>
-        <attribute>
-            <description>
-                A ValueExpression enabled attribute that, if present, will be
-                used as the text of the validator message, replacing any
-                message that comes from the validator.
-            </description>
-            <name>validatorMessage</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                The current value of this component.
-            </description>
-            <name>value</name>
-            <required>false</required>
-            <type>java.lang.Object</type>
-        </attribute>
-        <attribute>
-            <description>
-                &lt;p&gt;
-                MethodExpression representing a value change listener method
-                that will be notified when a new value has been set for this
-                input component. The expression must evaluate to a public
-                method that takes a &lt;code&gt;ValueChangeEvent&lt;/code&gt;
-                parameter,
-                with a return type of void, &lt;span class="changed_added_2_0"&gt;or
-                to a public method that takes no arguments with a return type
-                of void. In the latter case, the method has no way of easily
-                knowing what the new value is, but this can be useful in cases
-                where a notification is needed that "this value
-                changed".&lt;/span&gt;
-                &lt;/p&gt;
-            </description>
-            <name>valueChangeListener</name>
-            <required>false</required>
-            <method-signature>void
-                valueChange(javax.faces.event.ValueChangeEvent)
-            </method-signature>
-        </attribute>
-        <attribute>
-            <description>
-                Access key that, when pressed, transfers focus
-                to this element.
-            </description>
-            <name>accesskey</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                &lt;p class="changed_modified_2_0"&gt; Optional
-                attribute that is a literal string that is the fully qualified
-                class name of a concrete class that implements
-                &lt;code&gt;java.util.Collection&lt;/code&gt;, or an EL
-                expression that
-                evaluates to either 1. such a String, or 2. the
-                &lt;code&gt;Class&lt;/code&gt; object itself. &lt;/p&gt;
-            </description>
-            <name>collectionType</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Direction indication for text that does not inherit
-                directionality.
-                Valid values are "LTR" (left-to-right) and "RTL"
-                (right-to-left).
-            </description>
-            <name>dir</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Flag indicating that this element must never receive focus or
-                be included in a subsequent submit. A value of false causes
-                no attribute to be rendered, while a value of true causes the
-                attribute to be rendered as disabled="disabled".
-            </description>
-            <name>disabled</name>
-            <required>false</required>
-            <type>boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-                CSS style class to apply to the rendered label
-                on disabled options.
-            </description>
-            <name>disabledClass</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                CSS style class to apply to the rendered label
-                on enabled options.
-            </description>
-            <name>enabledClass</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                &lt;p class="changed_modified_2_0"&gt;
-                Flag indicating that, if this component is activated by the
-                user,
-                The "no selection option", if any, must be hidden.&lt;/p&gt;
-            </description>
-            <name>hideNoSelectionOption</name>
-            <required>false</required>
-            <type>boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-                A localized user presentable name for this component.
-            </description>
-            <name>label</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Code describing the language used in the generated markup
-                for this component.
-            </description>
-            <name>lang</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when this element loses focus.
-            </description>
-            <name>onblur</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when this element loses focus
-                and its value has been modified since gaining focus.
-            </description>
-            <name>onchange</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                clicked over this element.
-            </description>
-            <name>onclick</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                double clicked over this element.
-            </description>
-            <name>ondblclick</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when this element receives focus.
-            </description>
-            <name>onfocus</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a key is
-                pressed down over this element.
-            </description>
-            <name>onkeydown</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a key is
-                pressed and released over this element.
-            </description>
-            <name>onkeypress</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a key is
-                released over this element.
-            </description>
-            <name>onkeyup</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                pressed down over this element.
-            </description>
-            <name>onmousedown</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                moved within this element.
-            </description>
-            <name>onmousemove</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                moved away from this element.
-            </description>
-            <name>onmouseout</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                moved onto this element.
-            </description>
-            <name>onmouseover</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                released over this element.
-            </description>
-            <name>onmouseup</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when text within this
-                element is selected by the user.
-            </description>
-            <name>onselect</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Flag indicating that this component will prohibit changes by
-                the user. The element may receive focus unless it has also
-                been disabled. A value of false causes
-                no attribute to be rendered, while a value of true causes the
-                attribute to be rendered as readonly="readonly".
-            </description>
-            <name>readonly</name>
-            <required>false</required>
-            <type>boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-                Number of available options to be shown at all times.
-                If not specified, all available options are shown.
-            </description>
-            <name>size</name>
-            <required>false</required>
-            <type>int</type>
-        </attribute>
-        <attribute>
-            <description>
-                CSS style(s) to be applied when this component is rendered.
-            </description>
-            <name>style</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Space-separated list of CSS style class(es) to be applied when
-                this element is rendered. This value must be passed through
-                as the "class" attribute on generated markup.
-            </description>
-            <name>styleClass</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Position of this element in the tabbing order
-                for the current document. This value must be
-                an integer between 0 and 32767.
-            </description>
-            <name>tabindex</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Advisory title information about markup elements generated
-                for this component.
-            </description>
-            <name>title</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                The ValueExpression linking this component to a property in a
-                backing bean
-            </description>
-            <name>binding</name>
-            <required>false</required>
-            <type>javax.faces.component.UIComponent</type>
-        </attribute>
-    </tag>
-    <tag>
-        <description>
-            &lt;p&gt;&lt;span
-            class="changed_modified_2_0"&gt;Render&lt;/span&gt; an HTML option
-            list.&lt;/p&gt;
-            &lt;p&gt;&lt;a name="decode"&gt;Decode Behavior&lt;/a&gt;&lt;/p&gt;
-            &lt;ul&gt;
-            &lt;p&gt;See the &lt;a
-            href="SelectManyListbox.html"&gt;"Decode
-            Behavior for UISelectMany Components"&lt;/a&gt; section.&lt;/p&gt;
-            &lt;/ul&gt;
-            &lt;p&gt;Encode Behavior&lt;/p&gt;
-            &lt;ul&gt;
-            &lt;p&gt;Render an HTML "select" element. Render the clientId of
-            the component as the value of the "name" attribute. If the
-            "styleClass"
-            attribute is specified, render its value as the value of the "class"
-            attribute on the "select" element. If the component
-            to be rendered is a UISelectMany, render "multiple" as the value of
-            the "multiple" attribute. Render "1" as the value of the "size"
-            attribute. See the &lt;a
-            href="SelectManyListbox.html"&gt;"Rendering the option
-            elements" &lt;/a&gt; specification for &lt;code&gt;ListboxRenderer&lt;/code&gt;
-            for
-            more detail on how to render the "option" elements in this
-            renderer.&lt;/p&gt;
-            &lt;/ul&gt;
-        </description>
-        <tag-name>selectManyMenu</tag-name>
-        <component>
-            <component-type>javax.faces.HtmlSelectManyMenu</component-type>
-            <renderer-type>javax.faces.Menu</renderer-type>
-        </component>
-        <attribute>
-            <description>
-                Converter instance registered with this component.
-            </description>
-            <name>converter</name>
-            <required>false</required>
-            <type>javax.faces.convert.Converter</type>
-        </attribute>
-        <attribute>
-            <description>
-                A ValueExpression enabled attribute that, if present, will be
-                used as the text of the converter message, replacing any message
-                that comes from the converter.
-            </description>
-            <name>converterMessage</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                The component identifier for this component. This value must be
-                unique within the closest parent component that is a naming
-                container.
-            </description>
-            <name>id</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Flag indicating that this component's value must be
-                converted and validated immediately (that is, during
-                Apply Request Values phase), rather than waiting
-                until Process Validations phase.
-            </description>
-            <name>immediate</name>
-            <required>false</required>
-            <type>boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-                Flag indicating whether or not this component should be rendered
-                (during Render Response Phase), or processed on any subsequent
-                form submit. The default value for this property is true.
-            </description>
-            <name>rendered</name>
-            <required>false</required>
-            <type>boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-                Flag indicating that the user is required to provide a submitted
-                value for this input component.
-            </description>
-            <name>required</name>
-            <required>false</required>
-            <type>boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-                A ValueExpression enabled attribute that, if present, will be
-                used as the text of the validation message for the "required"
-                facility, if the "required" facility is used.
-            </description>
-            <name>requiredMessage</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                MethodExpression representing a validator method that will be
-                called
-                during Process Validations to perform correctness checks on the
-                value of this component. The expression must evaluate to a
-                public
-                method that takes FacesContext, UIComponent, and Object
-                parameters,
-                with a return type of void.
-            </description>
-            <name>validator</name>
-            <required>false</required>
-            <method-signature>void validate(javax.faces.context.FacesContext,
-                javax.faces.component.UIComponent, java.lang.Object)
-            </method-signature>
-        </attribute>
-        <attribute>
-            <description>
-                A ValueExpression enabled attribute that, if present, will be
-                used as the text of the validator message, replacing any
-                message that comes from the validator.
-            </description>
-            <name>validatorMessage</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                The current value of this component.
-            </description>
-            <name>value</name>
-            <required>false</required>
-            <type>java.lang.Object</type>
-        </attribute>
-        <attribute>
-            <description>
-                &lt;p&gt;
-                MethodExpression representing a value change listener method
-                that will be notified when a new value has been set for this
-                input component. The expression must evaluate to a public
-                method that takes a &lt;code&gt;ValueChangeEvent&lt;/code&gt;
-                parameter,
-                with a return type of void, &lt;span class="changed_added_2_0"&gt;or
-                to a public method that takes no arguments with a return type
-                of void. In the latter case, the method has no way of easily
-                knowing what the new value is, but this can be useful in cases
-                where a notification is needed that "this value
-                changed".&lt;/span&gt;
-                &lt;/p&gt;
-            </description>
-            <name>valueChangeListener</name>
-            <required>false</required>
-            <method-signature>void
-                valueChange(javax.faces.event.ValueChangeEvent)
-            </method-signature>
-        </attribute>
-        <attribute>
-            <description>
-                Access key that, when pressed, transfers focus
-                to this element.
-            </description>
-            <name>accesskey</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                &lt;p class="changed_modified_2_0"&gt; Optional
-                attribute that is a literal string that is the fully qualified
-                class name of a concrete class that implements
-                &lt;code&gt;java.util.Collection&lt;/code&gt;, or an EL
-                expression that
-                evaluates to either 1. such a String, or 2. the
-                &lt;code&gt;Class&lt;/code&gt; object itself. &lt;/p&gt;
-            </description>
-            <name>collectionType</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Direction indication for text that does not inherit
-                directionality.
-                Valid values are "LTR" (left-to-right) and "RTL"
-                (right-to-left).
-            </description>
-            <name>dir</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Flag indicating that this element must never receive focus or
-                be included in a subsequent submit. A value of false causes
-                no attribute to be rendered, while a value of true causes the
-                attribute to be rendered as disabled="disabled".
-            </description>
-            <name>disabled</name>
-            <required>false</required>
-            <type>boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-                CSS style class to apply to the rendered label
-                on disabled options.
-            </description>
-            <name>disabledClass</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                CSS style class to apply to the rendered label
-                on enabled options.
-            </description>
-            <name>enabledClass</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                &lt;p class="changed_modified_2_0"&gt;
-                Flag indicating that, if this component is activated by the
-                user,
-                The "no selection option", if any, must be hidden.&lt;/p&gt;
-            </description>
-            <name>hideNoSelectionOption</name>
-            <required>false</required>
-            <type>boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-                A localized user presentable name for this component.
-            </description>
-            <name>label</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Code describing the language used in the generated markup
-                for this component.
-            </description>
-            <name>lang</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when this element loses focus.
-            </description>
-            <name>onblur</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when this element loses focus
-                and its value has been modified since gaining focus.
-            </description>
-            <name>onchange</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                clicked over this element.
-            </description>
-            <name>onclick</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                double clicked over this element.
-            </description>
-            <name>ondblclick</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when this element receives focus.
-            </description>
-            <name>onfocus</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a key is
-                pressed down over this element.
-            </description>
-            <name>onkeydown</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a key is
-                pressed and released over this element.
-            </description>
-            <name>onkeypress</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a key is
-                released over this element.
-            </description>
-            <name>onkeyup</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                pressed down over this element.
-            </description>
-            <name>onmousedown</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                moved within this element.
-            </description>
-            <name>onmousemove</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                moved away from this element.
-            </description>
-            <name>onmouseout</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                moved onto this element.
-            </description>
-            <name>onmouseover</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                released over this element.
-            </description>
-            <name>onmouseup</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when text within this
-                element is selected by the user.
-            </description>
-            <name>onselect</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Flag indicating that this component will prohibit changes by
-                the user. The element may receive focus unless it has also
-                been disabled. A value of false causes
-                no attribute to be rendered, while a value of true causes the
-                attribute to be rendered as readonly="readonly".
-            </description>
-            <name>readonly</name>
-            <required>false</required>
-            <type>boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-                CSS style(s) to be applied when this component is rendered.
-            </description>
-            <name>style</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Space-separated list of CSS style class(es) to be applied when
-                this element is rendered. This value must be passed through
-                as the "class" attribute on generated markup.
-            </description>
-            <name>styleClass</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Position of this element in the tabbing order
-                for the current document. This value must be
-                an integer between 0 and 32767.
-            </description>
-            <name>tabindex</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Advisory title information about markup elements generated
-                for this component.
-            </description>
-            <name>title</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                The ValueExpression linking this component to a property in a
-                backing bean
-            </description>
-            <name>binding</name>
-            <required>false</required>
-            <type>javax.faces.component.UIComponent</type>
-        </attribute>
-    </tag>
-    <tag>
-        <description>
-            &lt;p&gt;Render an HTML option list.&lt;/p&gt;
-            &lt;p&gt;&lt;a name="decode"&gt;Decode Behavior&lt;/a&gt;&lt;/p&gt;
-            &lt;ul&gt;
-            &lt;p&gt;See the &lt;a
-            href="SelectManyListbox.html"&gt;"Decode
-            Behavior for UISelectOne Components"&lt;/a&gt; section.&lt;/p&gt;
-            &lt;/ul&gt;
-            &lt;p&gt;Encode Behavior&lt;/p&gt;
-            &lt;ul&gt;
-            &lt;p&gt;Render an HTML "select" element. Render the clientId of
-            the component as the value of the "name" attribute. If the
-            "styleClass"
-            attribute is specified, render its value as the value of the "class"
-            attribute on the "select" element. If the component
-            to be rendered is a UISelectMany, render "multiple" as the value of
-            the "multiple" attribute. If the "size" attribute is specified,
-            render its value as the value of the "size" attribute. Otherwise
-            use the number of items as the value of the "size" attribute. See
-            the &lt;a href="SelectManyListbox.html"&gt;"Rendering the option
-            elements" &lt;/a&gt; specification for &lt;code&gt;ListboxRenderer&lt;/code&gt;
-            for
-            more detail on how to render the "option" elements in this
-            renderer.&lt;/p&gt;
-            &lt;/ul&gt;
-        </description>
-        <tag-name>selectOneListbox</tag-name>
-        <component>
-            <component-type>javax.faces.HtmlSelectOneListbox</component-type>
-            <renderer-type>javax.faces.Listbox</renderer-type>
-        </component>
-        <attribute>
-            <description>
-                Converter instance registered with this component.
-            </description>
-            <name>converter</name>
-            <required>false</required>
-            <type>javax.faces.convert.Converter</type>
-        </attribute>
-        <attribute>
-            <description>
-                A ValueExpression enabled attribute that, if present, will be
-                used as the text of the converter message, replacing any message
-                that comes from the converter.
-            </description>
-            <name>converterMessage</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                The component identifier for this component. This value must be
-                unique within the closest parent component that is a naming
-                container.
-            </description>
-            <name>id</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Flag indicating that this component's value must be
-                converted and validated immediately (that is, during
-                Apply Request Values phase), rather than waiting
-                until Process Validations phase.
-            </description>
-            <name>immediate</name>
-            <required>false</required>
-            <type>boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-                Flag indicating whether or not this component should be rendered
-                (during Render Response Phase), or processed on any subsequent
-                form submit. The default value for this property is true.
-            </description>
-            <name>rendered</name>
-            <required>false</required>
-            <type>boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-                Flag indicating that the user is required to provide a submitted
-                value for this input component.
-            </description>
-            <name>required</name>
-            <required>false</required>
-            <type>boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-                A ValueExpression enabled attribute that, if present, will be
-                used as the text of the validation message for the "required"
-                facility, if the "required" facility is used.
-            </description>
-            <name>requiredMessage</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                MethodExpression representing a validator method that will be
-                called
-                during Process Validations to perform correctness checks on the
-                value of this component. The expression must evaluate to a
-                public
-                method that takes FacesContext, UIComponent, and Object
-                parameters,
-                with a return type of void.
-            </description>
-            <name>validator</name>
-            <required>false</required>
-            <method-signature>void validate(javax.faces.context.FacesContext,
-                javax.faces.component.UIComponent, java.lang.Object)
-            </method-signature>
-        </attribute>
-        <attribute>
-            <description>
-                A ValueExpression enabled attribute that, if present, will be
-                used as the text of the validator message, replacing any
-                message that comes from the validator.
-            </description>
-            <name>validatorMessage</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                The current value of this component.
-            </description>
-            <name>value</name>
-            <required>false</required>
-            <type>java.lang.Object</type>
-        </attribute>
-        <attribute>
-            <description>
-                &lt;p&gt;
-                MethodExpression representing a value change listener method
-                that will be notified when a new value has been set for this
-                input component. The expression must evaluate to a public
-                method that takes a &lt;code&gt;ValueChangeEvent&lt;/code&gt;
-                parameter,
-                with a return type of void, &lt;span class="changed_added_2_0"&gt;or
-                to a public method that takes no arguments with a return type
-                of void. In the latter case, the method has no way of easily
-                knowing what the new value is, but this can be useful in cases
-                where a notification is needed that "this value
-                changed".&lt;/span&gt;
-                &lt;/p&gt;
-            </description>
-            <name>valueChangeListener</name>
-            <required>false</required>
-            <method-signature>void
-                valueChange(javax.faces.event.ValueChangeEvent)
-            </method-signature>
-        </attribute>
-        <attribute>
-            <description>
-                Access key that, when pressed, transfers focus
-                to this element.
-            </description>
-            <name>accesskey</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Direction indication for text that does not inherit
-                directionality.
-                Valid values are "LTR" (left-to-right) and "RTL"
-                (right-to-left).
-            </description>
-            <name>dir</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Flag indicating that this element must never receive focus or
-                be included in a subsequent submit. A value of false causes
-                no attribute to be rendered, while a value of true causes the
-                attribute to be rendered as disabled="disabled".
-            </description>
-            <name>disabled</name>
-            <required>false</required>
-            <type>boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-                CSS style class to apply to the rendered label
-                on disabled options.
-            </description>
-            <name>disabledClass</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                CSS style class to apply to the rendered label
-                on enabled options.
-            </description>
-            <name>enabledClass</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                &lt;p class="changed_modified_2_0"&gt;
-                Flag indicating that, if this component is activated by the
-                user,
-                The "no selection option", if any, must be hidden.&lt;/p&gt;
-            </description>
-            <name>hideNoSelectionOption</name>
-            <required>false</required>
-            <type>boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-                A localized user presentable name for this component.
-            </description>
-            <name>label</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Code describing the language used in the generated markup
-                for this component.
-            </description>
-            <name>lang</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when this element loses focus.
-            </description>
-            <name>onblur</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when this element loses focus
-                and its value has been modified since gaining focus.
-            </description>
-            <name>onchange</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                clicked over this element.
-            </description>
-            <name>onclick</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                double clicked over this element.
-            </description>
-            <name>ondblclick</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when this element receives focus.
-            </description>
-            <name>onfocus</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a key is
-                pressed down over this element.
-            </description>
-            <name>onkeydown</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a key is
-                pressed and released over this element.
-            </description>
-            <name>onkeypress</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a key is
-                released over this element.
-            </description>
-            <name>onkeyup</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                pressed down over this element.
-            </description>
-            <name>onmousedown</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                moved within this element.
-            </description>
-            <name>onmousemove</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                moved away from this element.
-            </description>
-            <name>onmouseout</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                moved onto this element.
-            </description>
-            <name>onmouseover</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                released over this element.
-            </description>
-            <name>onmouseup</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when text within this
-                element is selected by the user.
-            </description>
-            <name>onselect</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Flag indicating that this component will prohibit changes by
-                the user. The element may receive focus unless it has also
-                been disabled. A value of false causes
-                no attribute to be rendered, while a value of true causes the
-                attribute to be rendered as readonly="readonly".
-            </description>
-            <name>readonly</name>
-            <required>false</required>
-            <type>boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-                Number of available options to be shown at all times.
-                If not specified, all available options are shown.
-            </description>
-            <name>size</name>
-            <required>false</required>
-            <type>int</type>
-        </attribute>
-        <attribute>
-            <description>
-                CSS style(s) to be applied when this component is rendered.
-            </description>
-            <name>style</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Space-separated list of CSS style class(es) to be applied when
-                this element is rendered. This value must be passed through
-                as the "class" attribute on generated markup.
-            </description>
-            <name>styleClass</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Position of this element in the tabbing order
-                for the current document. This value must be
-                an integer between 0 and 32767.
-            </description>
-            <name>tabindex</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Advisory title information about markup elements generated
-                for this component.
-            </description>
-            <name>title</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                The ValueExpression linking this component to a property in a
-                backing bean
-            </description>
-            <name>binding</name>
-            <required>false</required>
-            <type>javax.faces.component.UIComponent</type>
-        </attribute>
-    </tag>
-    <tag>
-        <description>
-            &lt;p&gt;Render an HTML option list.&lt;/p&gt;
-            &lt;p&gt;&lt;a name="decode"&gt;Decode Behavior&lt;/a&gt;&lt;/p&gt;
-            &lt;ul&gt;
-            &lt;p&gt;See the &lt;a
-            href="SelectManyListbox.html"&gt;"Decode
-            Behavior for UISelectOne Components"&lt;/a&gt; section.&lt;/p&gt;
-            &lt;/ul&gt;
-            &lt;p&gt;Encode Behavior&lt;/p&gt;
-            &lt;ul&gt;
-            &lt;p&gt;Render an HTML "select" element. Render the clientId of the
-            component as the value of the "name" attribute. If the
-            "styleClass" attribute is specified, render its value as the value
-            of the "class" attribute on the "select" element. If the component
-            to be rendered is a UISelectMany, render "true" as the value of
-            the "multiple" attribute. Use the number of items as the value of
-            the "size" attribute. See the &lt;a
-            href="SelectManyListbox.html"&gt;"Rendering
-            the option elements" &lt;/a&gt; specification for
-            &lt;code&gt;ListboxRenderer&lt;/code&gt; for more detail on how to
-            render the
-            "option" elements in this renderer.&lt;/p&gt;
-            &lt;/ul&gt;
-        </description>
-        <tag-name>selectOneMenu</tag-name>
-        <component>
-            <component-type>javax.faces.HtmlSelectOneMenu</component-type>
-            <renderer-type>javax.faces.Menu</renderer-type>
-        </component>
-        <attribute>
-            <description>
-                Converter instance registered with this component.
-            </description>
-            <name>converter</name>
-            <required>false</required>
-            <type>javax.faces.convert.Converter</type>
-        </attribute>
-        <attribute>
-            <description>
-                A ValueExpression enabled attribute that, if present, will be
-                used as the text of the converter message, replacing any message
-                that comes from the converter.
-            </description>
-            <name>converterMessage</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                The component identifier for this component. This value must be
-                unique within the closest parent component that is a naming
-                container.
-            </description>
-            <name>id</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Flag indicating that this component's value must be
-                converted and validated immediately (that is, during
-                Apply Request Values phase), rather than waiting
-                until Process Validations phase.
-            </description>
-            <name>immediate</name>
-            <required>false</required>
-            <type>boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-                Flag indicating whether or not this component should be rendered
-                (during Render Response Phase), or processed on any subsequent
-                form submit. The default value for this property is true.
-            </description>
-            <name>rendered</name>
-            <required>false</required>
-            <type>boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-                Flag indicating that the user is required to provide a submitted
-                value for this input component.
-            </description>
-            <name>required</name>
-            <required>false</required>
-            <type>boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-                A ValueExpression enabled attribute that, if present, will be
-                used as the text of the validation message for the "required"
-                facility, if the "required" facility is used.
-            </description>
-            <name>requiredMessage</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                MethodExpression representing a validator method that will be
-                called
-                during Process Validations to perform correctness checks on the
-                value of this component. The expression must evaluate to a
-                public
-                method that takes FacesContext, UIComponent, and Object
-                parameters,
-                with a return type of void.
-            </description>
-            <name>validator</name>
-            <required>false</required>
-            <method-signature>void validate(javax.faces.context.FacesContext,
-                javax.faces.component.UIComponent, java.lang.Object)
-            </method-signature>
-        </attribute>
-        <attribute>
-            <description>
-                A ValueExpression enabled attribute that, if present, will be
-                used as the text of the validator message, replacing any
-                message that comes from the validator.
-            </description>
-            <name>validatorMessage</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                The current value of this component.
-            </description>
-            <name>value</name>
-            <required>false</required>
-            <type>java.lang.Object</type>
-        </attribute>
-        <attribute>
-            <description>
-                &lt;p&gt;
-                MethodExpression representing a value change listener method
-                that will be notified when a new value has been set for this
-                input component. The expression must evaluate to a public
-                method that takes a &lt;code&gt;ValueChangeEvent&lt;/code&gt;
-                parameter,
-                with a return type of void, &lt;span class="changed_added_2_0"&gt;or
-                to a public method that takes no arguments with a return type
-                of void. In the latter case, the method has no way of easily
-                knowing what the new value is, but this can be useful in cases
-                where a notification is needed that "this value
-                changed".&lt;/span&gt;
-                &lt;/p&gt;
-            </description>
-            <name>valueChangeListener</name>
-            <required>false</required>
-            <method-signature>void
-                valueChange(javax.faces.event.ValueChangeEvent)
-            </method-signature>
-        </attribute>
-        <attribute>
-            <description>
-                Access key that, when pressed, transfers focus
-                to this element.
-            </description>
-            <name>accesskey</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Direction indication for text that does not inherit
-                directionality.
-                Valid values are "LTR" (left-to-right) and "RTL"
-                (right-to-left).
-            </description>
-            <name>dir</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Flag indicating that this element must never receive focus or
-                be included in a subsequent submit. A value of false causes
-                no attribute to be rendered, while a value of true causes the
-                attribute to be rendered as disabled="disabled".
-            </description>
-            <name>disabled</name>
-            <required>false</required>
-            <type>boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-                CSS style class to apply to the rendered label
-                on disabled options.
-            </description>
-            <name>disabledClass</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                CSS style class to apply to the rendered label
-                on enabled options.
-            </description>
-            <name>enabledClass</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                &lt;p class="changed_modified_2_0"&gt;
-                Flag indicating that, if this component is activated by the
-                user,
-                The "no selection option", if any, must be hidden.&lt;/p&gt;
-            </description>
-            <name>hideNoSelectionOption</name>
-            <required>false</required>
-            <type>boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-                A localized user presentable name for this component.
-            </description>
-            <name>label</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Code describing the language used in the generated markup
-                for this component.
-            </description>
-            <name>lang</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when this element loses focus.
-            </description>
-            <name>onblur</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when this element loses focus
-                and its value has been modified since gaining focus.
-            </description>
-            <name>onchange</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                clicked over this element.
-            </description>
-            <name>onclick</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                double clicked over this element.
-            </description>
-            <name>ondblclick</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when this element receives focus.
-            </description>
-            <name>onfocus</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a key is
-                pressed down over this element.
-            </description>
-            <name>onkeydown</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a key is
-                pressed and released over this element.
-            </description>
-            <name>onkeypress</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a key is
-                released over this element.
-            </description>
-            <name>onkeyup</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                pressed down over this element.
-            </description>
-            <name>onmousedown</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                moved within this element.
-            </description>
-            <name>onmousemove</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                moved away from this element.
-            </description>
-            <name>onmouseout</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                moved onto this element.
-            </description>
-            <name>onmouseover</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                released over this element.
-            </description>
-            <name>onmouseup</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when text within this
-                element is selected by the user.
-            </description>
-            <name>onselect</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Flag indicating that this component will prohibit changes by
-                the user. The element may receive focus unless it has also
-                been disabled. A value of false causes
-                no attribute to be rendered, while a value of true causes the
-                attribute to be rendered as readonly="readonly".
-            </description>
-            <name>readonly</name>
-            <required>false</required>
-            <type>boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-                CSS style(s) to be applied when this component is rendered.
-            </description>
-            <name>style</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Space-separated list of CSS style class(es) to be applied when
-                this element is rendered. This value must be passed through
-                as the "class" attribute on generated markup.
-            </description>
-            <name>styleClass</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Position of this element in the tabbing order
-                for the current document. This value must be
-                an integer between 0 and 32767.
-            </description>
-            <name>tabindex</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Advisory title information about markup elements generated
-                for this component.
-            </description>
-            <name>title</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                The ValueExpression linking this component to a property in a
-                backing bean
-            </description>
-            <name>binding</name>
-            <required>false</required>
-            <type>javax.faces.component.UIComponent</type>
-        </attribute>
-    </tag>
-    <tag>
-        <description>
-            &lt;p&gt;&lt;span
-            class="changed_modified_2_0"&gt;Render&lt;/span&gt; a set of html
-            "input" elements of type "radio".&lt;/p&gt;
-            &lt;p&gt;&lt;a name="decode"&gt;Decode Behavior&lt;/a&gt;&lt;/p&gt;
-            &lt;ul&gt;
-            &lt;p&gt;See the &lt;a
-            href="SelectManyListbox.html"&gt;"Decode
-            Behavior for UISelectOne Components"&lt;/a&gt; section.&lt;/p&gt;
-            &lt;/ul&gt;
-            &lt;p&gt;Encode Behavior&lt;/p&gt;
-            &lt;ul&gt;
-            &lt;p&gt;Render a "table" element. If the "styleClass" is specified,
-            render the value of the "styleClass" attribute as the value of the
-            "class" attribute on the "table" element. If the "style", "border"
-            attributes are specified, pass them thru &lt;span
-            class="changed_added_2_0"&gt;and render their values as the "style"
-            and "border" attributes on the "table", respectively.&lt;/span&gt;.
-            If
-            the "layout" attribute is specified, and its value is
-            "pageDirection", render the children elements vertically,
-            otherwise horizontally, in the table. If any of the children are
-            an instance of SelectItemGroup, render them as a nested table.
-            Each of the children are ultimately rendered as follows. Render
-            an "input" element of "type" "radio" for each child component.
-            Render the "name" attribute on the "input" element with the value
-            of the &lt;code&gt;clientId&lt;/code&gt; of the component. Render an
-            "id"
-            attribute on the "input" element. Each "id" value must be unique.
-            If the current SelectItem.isDisabled() returns true, render
-            "disabled" as the value of the "disabled" attribute. Close out
-            the "input" element. Render a "label" element. Render the "for"
-            attribute of the "label" element whose value is the corresponding
-            "input" element's "id" value. Render any "style" as the "class"
-            attribute on the "label" element. Close out the starting "label"
-            element and render the label value from SelectItem.getLabel().
-            Close out the "label" element. As an exception to the general
-            rules about how to handle the "id" attribute, render it as an
-            attribute on the outer "table" element, the value of which is the
-            &lt;code&gt;clientId&lt;/code&gt; of the component per the rules at
-            the
-            beginning of this specification. Coerce the value of the
-            currently rendered child to the type of the parent UISelectOne
-            value using the Expression Language coercion rules before
-            comparing the values. If the value of the currently rendered
-            child is equal to the value of the parent UISelectOne, render an
-            appropriate HTML boolean value indicating "checked" for the
-            enclosing "input". See the &lt;a
-            href="SelectManyListbox.html"&gt;"Rendering
-            the option elements" &lt;/a&gt; specification for
-            &lt;code&gt;ListboxRenderer&lt;/code&gt; for more detail on how to
-            render the
-            "option" elements in this renderer.&lt;/p&gt;
-            &lt;/ul&gt;
-        </description>
-        <tag-name>selectOneRadio</tag-name>
-        <component>
-            <component-type>javax.faces.HtmlSelectOneRadio</component-type>
-            <renderer-type>javax.faces.Radio</renderer-type>
-        </component>
-        <attribute>
-            <description>
-                Converter instance registered with this component.
-            </description>
-            <name>converter</name>
-            <required>false</required>
-            <type>javax.faces.convert.Converter</type>
-        </attribute>
-        <attribute>
-            <description>
-                A ValueExpression enabled attribute that, if present, will be
-                used as the text of the converter message, replacing any message
-                that comes from the converter.
-            </description>
-            <name>converterMessage</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                The component identifier for this component. This value must be
-                unique within the closest parent component that is a naming
-                container.
-            </description>
-            <name>id</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Flag indicating that this component's value must be
-                converted and validated immediately (that is, during
-                Apply Request Values phase), rather than waiting
-                until Process Validations phase.
-            </description>
-            <name>immediate</name>
-            <required>false</required>
-            <type>boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-                Flag indicating whether or not this component should be rendered
-                (during Render Response Phase), or processed on any subsequent
-                form submit. The default value for this property is true.
-            </description>
-            <name>rendered</name>
-            <required>false</required>
-            <type>boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-                Flag indicating that the user is required to provide a submitted
-                value for this input component.
-            </description>
-            <name>required</name>
-            <required>false</required>
-            <type>boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-                A ValueExpression enabled attribute that, if present, will be
-                used as the text of the validation message for the "required"
-                facility, if the "required" facility is used.
-            </description>
-            <name>requiredMessage</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                MethodExpression representing a validator method that will be
-                called
-                during Process Validations to perform correctness checks on the
-                value of this component. The expression must evaluate to a
-                public
-                method that takes FacesContext, UIComponent, and Object
-                parameters,
-                with a return type of void.
-            </description>
-            <name>validator</name>
-            <required>false</required>
-            <method-signature>void validate(javax.faces.context.FacesContext,
-                javax.faces.component.UIComponent, java.lang.Object)
-            </method-signature>
-        </attribute>
-        <attribute>
-            <description>
-                A ValueExpression enabled attribute that, if present, will be
-                used as the text of the validator message, replacing any
-                message that comes from the validator.
-            </description>
-            <name>validatorMessage</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                The current value of this component.
-            </description>
-            <name>value</name>
-            <required>false</required>
-            <type>java.lang.Object</type>
-        </attribute>
-        <attribute>
-            <description>
-                &lt;p&gt;
-                MethodExpression representing a value change listener method
-                that will be notified when a new value has been set for this
-                input component. The expression must evaluate to a public
-                method that takes a &lt;code&gt;ValueChangeEvent&lt;/code&gt;
-                parameter,
-                with a return type of void, &lt;span class="changed_added_2_0"&gt;or
-                to a public method that takes no arguments with a return type
-                of void. In the latter case, the method has no way of easily
-                knowing what the new value is, but this can be useful in cases
-                where a notification is needed that "this value
-                changed".&lt;/span&gt;
-                &lt;/p&gt;
-            </description>
-            <name>valueChangeListener</name>
-            <required>false</required>
-            <method-signature>void
-                valueChange(javax.faces.event.ValueChangeEvent)
-            </method-signature>
-        </attribute>
-        <attribute>
-            <description>
-                Access key that, when pressed, transfers focus
-                to this element.
-            </description>
-            <name>accesskey</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Width (in pixels) of the border to be drawn
-                around the table containing the options list.
-            </description>
-            <name>border</name>
-            <required>false</required>
-            <type>int</type>
-        </attribute>
-        <attribute>
-            <description>
-                Direction indication for text that does not inherit
-                directionality.
-                Valid values are "LTR" (left-to-right) and "RTL"
-                (right-to-left).
-            </description>
-            <name>dir</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Flag indicating that this element must never receive focus or
-                be included in a subsequent submit. A value of false causes
-                no attribute to be rendered, while a value of true causes the
-                attribute to be rendered as disabled="disabled".
-            </description>
-            <name>disabled</name>
-            <required>false</required>
-            <type>boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-                CSS style class to apply to the rendered label
-                on disabled options.
-            </description>
-            <name>disabledClass</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                CSS style class to apply to the rendered label
-                on enabled options.
-            </description>
-            <name>enabledClass</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                &lt;p class="changed_modified_2_0"&gt;
-                Flag indicating that, if this component is activated by the
-                user,
-                The "no selection option", if any, must be hidden.&lt;/p&gt;
-            </description>
-            <name>hideNoSelectionOption</name>
-            <required>false</required>
-            <type>boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-                A localized user presentable name for this component.
-            </description>
-            <name>label</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Code describing the language used in the generated markup
-                for this component.
-            </description>
-            <name>lang</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Orientation of the options list to be created.
-                Valid values are "pageDirection" (list is laid
-                out vertically), or "lineDirection" (list is
-                laid out horizontally). If not specified, the
-                default value is "lineDirection".
-            </description>
-            <name>layout</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when this element loses focus.
-            </description>
-            <name>onblur</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when this element loses focus
-                and its value has been modified since gaining focus.
-            </description>
-            <name>onchange</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                clicked over this element.
-            </description>
-            <name>onclick</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                double clicked over this element.
-            </description>
-            <name>ondblclick</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when this element receives focus.
-            </description>
-            <name>onfocus</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a key is
-                pressed down over this element.
-            </description>
-            <name>onkeydown</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a key is
-                pressed and released over this element.
-            </description>
-            <name>onkeypress</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a key is
-                released over this element.
-            </description>
-            <name>onkeyup</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                pressed down over this element.
-            </description>
-            <name>onmousedown</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                moved within this element.
-            </description>
-            <name>onmousemove</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                moved away from this element.
-            </description>
-            <name>onmouseout</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                moved onto this element.
-            </description>
-            <name>onmouseover</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when a pointer button is
-                released over this element.
-            </description>
-            <name>onmouseup</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Javascript code executed when text within this
-                element is selected by the user.
-            </description>
-            <name>onselect</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Flag indicating that this component will prohibit changes by
-                the user. The element may receive focus unless it has also
-                been disabled. A value of false causes
-                no attribute to be rendered, while a value of true causes the
-                attribute to be rendered as readonly="readonly".
-            </description>
-            <name>readonly</name>
-            <required>false</required>
-            <type>boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-                CSS style(s) to be applied when this component is rendered.
-            </description>
-            <name>style</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Space-separated list of CSS style class(es) to be applied when
-                this element is rendered. This value must be passed through
-                as the "class" attribute on generated markup.
-            </description>
-            <name>styleClass</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Position of this element in the tabbing order
-                for the current document. This value must be
-                an integer between 0 and 32767.
-            </description>
-            <name>tabindex</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Advisory title information about markup elements generated
-                for this component.
-            </description>
-            <name>title</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                The ValueExpression linking this component to a property in a
-                backing bean
-            </description>
-            <name>binding</name>
-            <required>false</required>
-            <type>javax.faces.component.UIComponent</type>
-        </attribute>
-    </tag>
-    <tag>
-        <description>
-            &lt;p&gt;Renders a UIComponent that represents a single column of
-            data within a parent &lt;code&gt;UIData&lt;/code&gt; component.&lt;/p&gt;
-        </description>
-        <tag-name>column</tag-name>
-        <component>
-            <component-type>javax.faces.Column</component-type>
-            <renderer-type/>
-        </component>
-        <attribute>
-            <description>
-                Flag indicating whether or not this component should be rendered
-                (during Render Response Phase), or processed on any subsequent
-                form submit.
-            </description>
-            <name>rendered</name>
-            <required>false</required>
-            <type>java.lang.Boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-                The value binding expression linking this component to a
-                property in a backing bean
-            </description>
-            <name>binding</name>
-            <required>false</required>
-            <type>javax.faces.component.UIComponent</type>
-        </attribute>
-        <attribute>
-            <description>
-                The component identifier for the associated component
-            </description>
-            <name>id</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Space-separated list of CSS style class(es) that will be
-                applied to any column footer generated for this table.
-            </description>
-            <name>footerClass</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Space-separated list of CSS style class(es) that will be
-                applied to any column header generated for this table.
-            </description>
-            <name>headerClass</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Flag indicating that this column is a row header column and
-                therefore cells in this column should be rendered with "th"
-                instead of "td" and must have the 'scope="row"' attribute.
-            </description>
-            <name>rowHeader</name>
-            <required>false</required>
-            <type>boolean</type>
-        </attribute>
-    </tag>
-</facelet-taglib>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/std-taglibs/jstl-core.taglib.xml b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/std-taglibs/jstl-core.taglib.xml
deleted file mode 100644
index ea0554c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/std-taglibs/jstl-core.taglib.xml
+++ /dev/null
@@ -1,283 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!--
- DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
-
- Copyright 2009 Sun Microsystems, Inc. All rights reserved.
-
- The contents of this file are subject to the terms of either the GNU
- General Public License Version 2 only ("GPL") or the Common Development
- and Distribution License("CDDL") (collectively, the "License").  You
- may not use this file except in compliance with the License. You can obtain
- a copy of the License at https://glassfish.dev.java.net/public/CDDL+GPL.html
- or glassfish/bootstrap/legal/LICENSE.txt.  See the License for the specific
- language governing permissions and limitations under the License.
-
- When distributing the software, include this License Header Notice in each
- file and include the License file at glassfish/bootstrap/legal/LICENSE.txt.
- Sun designates this particular file as subject to the "Classpath" exception
- as provided by Sun in the GPL Version 2 section of the License file that
- accompanied this code.  If applicable, add the following below the License
- Header, with the fields enclosed by brackets [] replaced by your own
- identifying information: "Portions Copyrighted [year]
- [name of copyright owner]"
-
- Contributor(s):
-
- If you wish your version of this file to be governed by only the CDDL or
- only the GPL Version 2, indicate your decision by adding "[Contributor]
- elects to include this software in this distribution under the [CDDL or GPL
- Version 2] license."  If you don't indicate a single choice of license, a
- recipient has the option to distribute your version of this file under
- either the CDDL, the GPL Version 2 or to extend the choice of license to
- its licensees as provided above.  However, if you add GPL Version 2 code
- and therefore, elected the GPL Version 2 license, then the option applies
- only if the new code is made subject to such option by the copyright
- holder.
--->
-
-<facelet-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 http://java.sun.com/xml/ns/javaee/web-facelettaglibrary_2_0.xsd"
-                version="2.0">
-    <description>JSTL 1.2 core library</description>
-    <namespace>http://java.sun.com/jsp/jstl/core</namespace>
-    <tag>
-        <description>
-            Catches any Throwable that occurs in its body and optionally
-            exposes it.
-        </description>
-        <tag-name>catch</tag-name>
-        <handler-class>com.sun.faces.facelets.tag.jstl.core.CatchHandler</handler-class>
-        <attribute>
-            <description>
-                Name of the exported scoped variable for the
-                exception thrown from a nested action. The type of the
-                scoped variable is the type of the exception thrown.
-            </description>
-            <name>var</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-    </tag>
-    <tag>
-        <description>
-            Simple conditional tag that establishes a context for
-            mutually exclusive conditional operations, marked by
-            &lt;when&gt; and &lt;otherwise&gt;
-        </description>
-        <tag-name>choose</tag-name>
-        <handler-class>com.sun.faces.facelets.tag.jstl.core.ChooseHandler</handler-class>
-    </tag>
-    <tag>
-        <description>
-            Simple conditional tag, which evalutes its body if the
-            supplied condition is true and optionally exposes a Boolean
-            scripting variable representing the evaluation of this condition
-        </description>
-        <tag-name>if</tag-name>
-        <handler-class>com.sun.faces.facelets.tag.jstl.core.IfHandler</handler-class>
-        <attribute>
-            <description>
-                The test condition that determines whether or
-                not the body content should be processed.
-            </description>
-            <name>test</name>
-            <required>true</required>
-            <type>boolean</type>
-        </attribute>
-        <attribute>
-            <description>
-                Name of the exported scoped variable for the
-                resulting value of the test condition. The type
-                of the scoped variable is Boolean.
-            </description>
-            <name>var</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Scope for var.
-            </description>
-            <name>scope</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-    </tag>
-    <tag>
-        <description>
-            The basic iteration tag, accepting many different
-            collection types and supporting subsetting and other
-            functionality
-        </description>
-        <tag-name>forEach</tag-name>
-        <handler-class>com.sun.faces.facelets.tag.jstl.core.ForEachHandler</handler-class>
-        <attribute>
-            <description>
-                Collection of items to iterate over.
-            </description>
-            <name>items</name>
-            <required>false</required>
-            <type>java.lang.Object</type>
-        </attribute>
-        <attribute>
-            <description>
-                If items specified:
-                Iteration begins at the item located at the
-                specified index. First item of the collection has
-                index 0.
-                If items not specified:
-                Iteration begins with index set at the value
-                specified.
-            </description>
-            <name>begin</name>
-            <required>false</required>
-            <type>int</type>
-        </attribute>
-        <attribute>
-            <description>
-                If items specified:
-                Iteration ends at the item located at the
-                specified index (inclusive).
-                If items not specified:
-                Iteration ends when index reaches the value
-                specified.
-            </description>
-            <name>end</name>
-            <required>false</required>
-            <type>int</type>
-        </attribute>
-        <attribute>
-            <description>
-                Iteration will only process every step items of
-                the collection, starting with the first one.
-            </description>
-            <name>step</name>
-            <required>false</required>
-            <type>int</type>
-        </attribute>
-        <attribute>
-            <description>
-                Name of the exported scoped variable for the
-                current item of the iteration. This scoped
-                variable has nested visibility. Its type depends
-                on the object of the underlying collection.
-            </description>
-            <name>var</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Name of the exported scoped variable for the
-                status of the iteration. Object exported is of type
-                javax.servlet.jsp.jstl.core.LoopTagStatus. This scoped variable
-                has nested
-                visibility.
-            </description>
-            <name>varStatus</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-    </tag>
-    <tag>
-        <description>
-            Subtag of &lt;choose&gt; that follows &lt;when&gt; tags
-            and runs only if all of the prior conditions evaluated to
-            'false'
-        </description>
-        <tag-name>otherwise</tag-name>
-        <handler-class>com.sun.faces.facelets.tag.jstl.core.ChooseOtherwiseHandler</handler-class>
-    </tag>
-    <tag>
-        <description>
-            &lt;p&gt;Sets the result of an expression evaluation based on the
-            value of the attributes. If "scope" the is present, but has a zero
-            length or is equal to the string "page", &lt;code&gt;TagException&lt;/code&gt;
-            is
-            thrown with an informative error message, ensuring page location
-            information is saved.&lt;/p&gt;
-
-            &lt;p&gt;This handler operates in one of two ways.
-
-            &lt;ol&gt;
-
-            &lt;li&gt;&lt;p&gt;The user has set "var", "value" and (optionally)
-            "scope" attributes.&lt;/p&gt;&lt;/li&gt;
-
-            &lt;li&gt;&lt;p&gt;The user has set "target", "property", and
-            "value"
-            attributes.&lt;/p&gt;&lt;/li&gt;
-
-
-            &lt;/ol&gt;
-
-            &lt;p&gt;The first case takes precedence over the second.&lt;/p&gt;
-
-
-        </description>
-        <tag-name>set</tag-name>
-        <handler-class>com.sun.faces.facelets.tag.jstl.core.SetHandler</handler-class>
-        <attribute>
-            <description>
-                Name of the exported scoped variable to hold the value
-                specified in the action. The type of the scoped variable is
-                whatever type the value expression evaluates to.
-            </description>
-            <name>var</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Expression to be evaluated.
-            </description>
-            <name>value</name>
-            <required>false</required>
-            <type>java.lang.Object</type>
-        </attribute>
-        <attribute>
-            <description>
-                Target object whose property will be set. Must evaluate to
-                a JavaBeans object with setter property property, or to a
-                java.util.Map object.
-            </description>
-            <name>target</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Name of the property to be set in the target object.
-            </description>
-            <name>property</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-                Scope for var.
-            </description>
-            <name>scope</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-    </tag>
-    <tag>
-        <description>
-            Subtag of &lt;choose&gt; that includes its body if its
-            condition evalutes to 'true'
-        </description>
-        <tag-name>when</tag-name>
-        <handler-class>com.sun.faces.facelets.tag.jstl.core.ChooseWhenHandler</handler-class>
-        <attribute>
-            <description>
-                The test condition that determines whether or not the
-                body content should be processed.
-            </description>
-            <name>test</name>
-            <required>true</required>
-            <type>boolean</type>
-        </attribute>
-    </tag>
-</facelet-taglib>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/std-taglibs/jstl-fn.taglib.xml b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/std-taglibs/jstl-fn.taglib.xml
deleted file mode 100644
index 86acd9b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/std-taglibs/jstl-fn.taglib.xml
+++ /dev/null
@@ -1,173 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!--
- DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
-
- Copyright 2009 Sun Microsystems, Inc. All rights reserved.
-
- The contents of this file are subject to the terms of either the GNU
- General Public License Version 2 only ("GPL") or the Common Development
- and Distribution License("CDDL") (collectively, the "License").  You
- may not use this file except in compliance with the License. You can obtain
- a copy of the License at https://glassfish.dev.java.net/public/CDDL+GPL.html
- or glassfish/bootstrap/legal/LICENSE.txt.  See the License for the specific
- language governing permissions and limitations under the License.
-
- When distributing the software, include this License Header Notice in each
- file and include the License file at glassfish/bootstrap/legal/LICENSE.txt.
- Sun designates this particular file as subject to the "Classpath" exception
- as provided by Sun in the GPL Version 2 section of the License file that
- accompanied this code.  If applicable, add the following below the License
- Header, with the fields enclosed by brackets [] replaced by your own
- identifying information: "Portions Copyrighted [year]
- [name of copyright owner]"
-
- Contributor(s):
-
- If you wish your version of this file to be governed by only the CDDL or
- only the GPL Version 2, indicate your decision by adding "[Contributor]
- elects to include this software in this distribution under the [CDDL or GPL
- Version 2] license."  If you don't indicate a single choice of license, a
- recipient has the option to distribute your version of this file under
- either the CDDL, the GPL Version 2 or to extend the choice of license to
- its licensees as provided above.  However, if you add GPL Version 2 code
- and therefore, elected the GPL Version 2 license, then the option applies
- only if the new code is made subject to such option by the copyright
- holder.
--->
-
-<facelet-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 http://java.sun.com/xml/ns/javaee/web-facelettaglibrary_2_0.xsd"
-                version="2.0">
-  <description>JSTL 1.1 functions library</description>
-  <namespace>http://java.sun.com/jsp/jstl/functions</namespace>
-  <function>
-    <description>
-      Tests if an input string contains the specified substring.
-    </description>
-    <function-name>contains</function-name>
-    <function-class>com.sun.faces.facelets.tag.jstl.fn.JstlFunction</function-class>
-    <function-signature>boolean contains(java.lang.String, java.lang.String)</function-signature>
-  </function>
-  <function>
-    <description>
-      Tests if an input string contains the specified substring in a case insensitive way.
-    </description>
-    <function-name>containsIgnoreCase</function-name>
-    <function-class>com.sun.faces.facelets.tag.jstl.fn.JstlFunction</function-class>
-    <function-signature>boolean containsIgnoreCase(java.lang.String, java.lang.String)</function-signature>
-  </function>
-  <function>
-    <description>
-      Tests if an input string ends with the specified suffix.
-    </description>
-    <function-name>endsWith</function-name>
-    <function-class>com.sun.faces.facelets.tag.jstl.fn.JstlFunction</function-class>
-    <function-signature>boolean endsWith(java.lang.String, java.lang.String)</function-signature>
-  </function>
-  <function>
-    <description>
-      Escapes characters that could be interpreted as XML markup.
-    </description>
-    <function-name>escapeXml</function-name>
-    <function-class>com.sun.faces.facelets.tag.jstl.fn.JstlFunction</function-class>
-    <function-signature>java.lang.String escapeXml(java.lang.String)</function-signature>
-  </function>
-  <function>
-    <description>
-      Returns the index withing a string of the first occurrence of a specified substring.
-    </description>
-    <function-name>indexOf</function-name>
-    <function-class>com.sun.faces.facelets.tag.jstl.fn.JstlFunction</function-class>
-    <function-signature>int indexOf(java.lang.String, java.lang.String)</function-signature>
-  </function>
-  <function>
-    <description>
-      Joins all elements of an array into a string.
-    </description>
-    <function-name>join</function-name>
-    <function-class>com.sun.faces.facelets.tag.jstl.fn.JstlFunction</function-class>
-    <function-signature>java.lang.String join(java.lang.String[], java.lang.String)</function-signature>
-  </function>
-  <function>
-    <description>
-      Returns the number of items in a collection, or the number of characters in a string.
-    </description>
-    <function-name>length</function-name>
-    <function-class>com.sun.faces.facelets.tag.jstl.fn.JstlFunction</function-class>
-    <function-signature>int length(java.lang.Object)</function-signature>
-  </function>
-  <function>
-    <description>
-      Returns a string resulting from replacing in an input string all occurrences
-      of a "before" string into an "after" substring.
-    </description>
-    <function-name>replace</function-name>
-    <function-class>com.sun.faces.facelets.tag.jstl.fn.JstlFunction</function-class>
-    <function-signature>java.lang.String replace(java.lang.String, java.lang.String, java.lang.String)</function-signature>
-  </function>
-  <function>
-    <description>
-      Splits a string into an array of substrings.
-    </description>
-    <function-name>split</function-name>
-    <function-class>com.sun.faces.facelets.tag.jstl.fn.JstlFunction</function-class>
-    <function-signature>java.lang.String[] split(java.lang.String, java.lang.String)</function-signature>
-  </function>
-  <function>
-    <description>
-      Tests if an input string starts with the specified prefix.
-    </description>
-    <function-name>startsWith</function-name>
-    <function-class>com.sun.faces.facelets.tag.jstl.fn.JstlFunction</function-class>
-    <function-signature>boolean startsWith(java.lang.String, java.lang.String)</function-signature>
-  </function>
-  <function>
-    <description>
-      Returns a subset of a string.
-    </description>
-    <function-name>substring</function-name>
-    <function-class>com.sun.faces.facelets.tag.jstl.fn.JstlFunction</function-class>
-    <function-signature>java.lang.String substring(java.lang.String, int, int)</function-signature>
-  </function>
-  <function>
-    <description>
-      Returns a subset of a string following a specific substring.
-    </description>
-    <function-name>substringAfter</function-name>
-    <function-class>com.sun.faces.facelets.tag.jstl.fn.JstlFunction</function-class>
-    <function-signature>java.lang.String substringAfter(java.lang.String, java.lang.String)</function-signature>
-  </function>
-  <function>
-    <description>
-      Returns a subset of a string before a specific substring.
-    </description>
-    <function-name>substringBefore</function-name>
-    <function-class>com.sun.faces.facelets.tag.jstl.fn.JstlFunction</function-class>
-    <function-signature>java.lang.String substringBefore(java.lang.String, java.lang.String)</function-signature>
-  </function>
-  <function>
-    <description>
-      Converts all of the characters of a string to lower case.
-    </description>
-    <function-name>toLowerCase</function-name>
-    <function-class>com.sun.faces.facelets.tag.jstl.fn.JstlFunction</function-class>
-    <function-signature>java.lang.String toLowerCase(java.lang.String)</function-signature>
-  </function>
-  <function>
-    <description>
-      Converts all of the characters of a string to upper case.
-    </description>
-    <function-name>toUpperCase</function-name>
-    <function-class>com.sun.faces.facelets.tag.jstl.fn.JstlFunction</function-class>
-    <function-signature>java.lang.String toUpperCase(java.lang.String)</function-signature>
-  </function>
-  <function>
-    <description>
-      Removes white spaces from both ends of a string.
-    </description>
-    <function-name>trim</function-name>
-    <function-class>com.sun.faces.facelets.tag.jstl.fn.JstlFunction</function-class>
-    <function-signature>java.lang.String trim(java.lang.String)</function-signature>
-  </function>
-</facelet-taglib>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/std-taglibs/ui.taglib.xml b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/std-taglibs/ui.taglib.xml
deleted file mode 100644
index a9358d9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/std-taglibs/ui.taglib.xml
+++ /dev/null
@@ -1,1026 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!--
- DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
-
- Copyright 2009 Sun Microsystems, Inc. All rights reserved.
-
- The contents of this file are subject to the terms of either the GNU
- General Public License Version 2 only ("GPL") or the Common Development
- and Distribution License("CDDL") (collectively, the "License").  You
- may not use this file except in compliance with the License. You can obtain
- a copy of the License at https://glassfish.dev.java.net/public/CDDL+GPL.html
- or glassfish/bootstrap/legal/LICENSE.txt.  See the License for the specific
- language governing permissions and limitations under the License.
-
- When distributing the software, include this License Header Notice in each
- file and include the License file at glassfish/bootstrap/legal/LICENSE.txt.
- Sun designates this particular file as subject to the "Classpath" exception
- as provided by Sun in the GPL Version 2 section of the License file that
- accompanied this code.  If applicable, add the following below the License
- Header, with the fields enclosed by brackets [] replaced by your own
- identifying information: "Portions Copyrighted [year]
- [name of copyright owner]"
-
- Contributor(s):
-
- If you wish your version of this file to be governed by only the CDDL or
- only the GPL Version 2, indicate your decision by adding "[Contributor]
- elects to include this software in this distribution under the [CDDL or GPL
- Version 2] license."  If you don't indicate a single choice of license, a
- recipient has the option to distribute your version of this file under
- either the CDDL, the GPL Version 2 or to extend the choice of license to
- its licensees as provided above.  However, if you add GPL Version 2 code
- and therefore, elected the GPL Version 2 license, then the option applies
- only if the new code is made subject to such option by the copyright
- holder.
--->
-
-<facelet-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 http://java.sun.com/xml/ns/javaee/web-facelettaglibrary_2_0.xsd"
-                version="2.0">
-    <description>
-
-        &lt;/pre&gt;
-
-        &lt;div class="changed_added_2_0"&gt;
-
-        &lt;p&gt;The tags in this library add templating&amp;#8212;a powerful
-        view composition technique&amp;#8212;to JSF.
-        Templating is so useful that there are entire frameworks, such as Tiles
-        and SiteMesh, that are built
-        around the concept of templating. So what is templating, how can you
-        benefit from it, and how does
-        this tag library implement it?
-        &lt;/p&gt;
-
-        &lt;p&gt;If you've used JSP before, you've probably used &lt;code&gt;jsp:include&lt;/code&gt;.
-        The prototypical example for
-        &lt;code&gt;jsp:include&lt;/code&gt; is a header on each page in a web
-        application. One JSP page, say header.jsp,
-        encapsulates the header content, and the header is included by each
-        page. You &lt;em&gt;encapsulate and reuse
-        content&lt;/em&gt;, so that changes to one file, header.jsp, affect the
-        header on every page.
-        &lt;/p&gt;
-
-        &lt;p&gt;This tab library contains a tag&amp;#8212&lt;code&gt;ui:include&lt;/code&gt;&amp;#8212
-        that's analagous to &lt;code&gt;jsp:include&lt;/code&gt;,
-        but encapsulating and reusing content is only half the templating story,
-        because templating also lets you
-        &lt;em&gt;encapsulate and reuse &lt;b&gt;layout&lt;/b&gt;&lt;/em&gt;.
-        You define a single &lt;em&gt;template&lt;/em&gt; (meaning layout), and
-        you reuse
-        that template with multiple &lt;em&gt;compositions&lt;/em&gt;. So now
-        you can control the layout of many pages with a single
-        template (layout). Let's take a look at an example.
-        &lt;/p&gt;
-
-        &lt;h3&gt;A Templating Example&lt;/h3&gt;
-
-        &lt;p&gt;
-        First, we define a template:
-        &lt;/p&gt;
-        &lt;div class="syntax"&gt;&lt;div class="html4strict"
-        style="font-family: monospace;"&gt;&lt;ol&gt;&lt;li class="li1"&gt;&lt;div
-        class="de1"&gt;&lt;span class="sc0"&gt;&amp;lt;!DOCTYPE html PUBLIC
-        &amp;quot;-//W3C//DTD XHTML 1.0 Transitional//EN&amp;quot;&lt;/div&gt;&lt;/li&gt;
-
-        &lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;
-        &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&amp;quot;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-        &lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
-        &lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="sc3"&gt;&lt;span
-        class="re1"&gt;&amp;lt;html&lt;/span&gt; &lt;span class="re0"&gt;xmlns&lt;/span&gt;=&lt;span
-        class="st0"&gt;&amp;quot;http://www.w3.org/1999/xhtml&amp;quot;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-        &lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;
-        &amp;nbsp; &amp;nbsp; &amp;nbsp; xmlns:&lt;span class="re0"&gt;ui&lt;/span&gt;=&lt;span
-        class="st0"&gt;&amp;quot;http://java.sun.com/jsf/facelets&amp;quot;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-
-        &lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &lt;span
-        class="sc3"&gt;&lt;span class="re1"&gt;&amp;lt;head&lt;span class="re2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-        &lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;
-        &lt;span class="sc3"&gt;&lt;span class="re1"&gt;&amp;lt;link&lt;/span&gt;
-        &lt;span class="re0"&gt;href&lt;/span&gt;=&lt;span class="st0"&gt;&amp;quot;styles.css&amp;quot;&lt;/span&gt;
-        &lt;span class="re0"&gt;rel&lt;/span&gt;=&lt;span class="st0"&gt;&amp;quot;stylesheet&amp;quot;&lt;/span&gt;
-        &lt;span class="re0"&gt;type&lt;/span&gt;=&lt;span class="st0"&gt;&amp;quot;text/css&amp;quot;&lt;/span&gt;&lt;span
-        class="re2"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-
-        &lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;
-        &lt;span class="sc3"&gt;&lt;span class="re1"&gt;&amp;lt;title&lt;span
-        class="re2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span
-        class="sc3"&gt;&lt;span class="re1"&gt;&amp;lt;ui&lt;/span&gt;:insert
-        &lt;span class="re0"&gt;name&lt;/span&gt;=&lt;span class="st0"&gt;&amp;quot;title&amp;quot;&lt;/span&gt;&lt;span
-        class="re2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Default Title&lt;span
-        class="sc3"&gt;&lt;span class="re1"&gt;&amp;lt;/ui&lt;/span&gt;:insert&lt;span
-        class="re2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="sc3"&gt;&lt;span
-        class="re1"&gt;&amp;lt;/title&lt;span class="re2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-        &lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &lt;span
-        class="sc3"&gt;&lt;span class="re1"&gt;&amp;lt;/head&lt;span class="re2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-
-        &lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
-        &lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &lt;span
-        class="sc3"&gt;&lt;span class="re1"&gt;&amp;lt;body&lt;span class="re2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-        &lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;
-        &lt;span class="sc3"&gt;&lt;span class="re1"&gt;&amp;lt;ui&lt;/span&gt;:debug&lt;span
-        class="re2"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-        &lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;
-        &lt;span class="sc3"&gt;&lt;span class="re1"&gt;&amp;lt;div&lt;/span&gt;
-        &lt;span class="re0"&gt;class&lt;/span&gt;=&lt;span class="st0"&gt;&amp;quot;heading&amp;quot;&lt;/span&gt;&lt;span
-        class="re2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-
-        &lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;
-        &amp;nbsp; &lt;span class="sc3"&gt;&lt;span class="re1"&gt;&amp;lt;ui&lt;/span&gt;:insert
-        &lt;span class="re0"&gt;name&lt;/span&gt;=&lt;span class="st0"&gt;&amp;quot;heading&amp;quot;&lt;/span&gt;&lt;span
-        class="re2"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-        &lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;
-        &lt;span class="sc3"&gt;&lt;span class="re1"&gt;&amp;lt;/div&lt;span
-        class="re2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-        &lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
-
-        &lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;
-        &lt;span class="sc3"&gt;&lt;span class="re1"&gt;&amp;lt;div&lt;/span&gt;
-        &lt;span class="re0"&gt;class&lt;/span&gt;=&lt;span class="st0"&gt;&amp;quot;content&amp;quot;&lt;/span&gt;&lt;span
-        class="re2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-        &lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;
-        &amp;nbsp; &lt;span class="sc3"&gt;&lt;span class="re1"&gt;&amp;lt;ui&lt;/span&gt;:insert
-        &lt;span class="re0"&gt;name&lt;/span&gt;=&lt;span class="st0"&gt;&amp;quot;content&amp;quot;&lt;/span&gt;&lt;span
-        class="re2"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-
-        &lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;
-        &lt;span class="sc3"&gt;&lt;span class="re1"&gt;&amp;lt;/div&lt;span
-        class="re2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-        &lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &lt;span
-        class="sc3"&gt;&lt;span class="re1"&gt;&amp;lt;/body&lt;span class="re2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-        &lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="sc3"&gt;&lt;span
-        class="re1"&gt;&amp;lt;/html&lt;span class="re2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
-        &lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;
-
-        &lt;p&gt;
-        In the preceeding listing, we've defined a layout, also known as a
-        template. That template uses the
-        &lt;code&gt;ui:insert&lt;/code&gt; tag to insert pieces of a page &amp;#8212namely,
-        title, heading, and content&amp;#8212
-        defined in a &lt;em&gt;composition&lt;/em&gt;. Notice that on line 8, we
-        define a default title, in case one isn't provided
-        by the composition. Also note that on line 12 we have the &lt;code&gt;ui:debug&lt;/code&gt;
-        tag, which lets the user activate
-        a popup window with debugging information by typing CTRL + Shift + d.
-        &lt;/p&gt;
-
-        &lt;p&gt;
-        The title, heading, and content pieces of the page referenced in the
-        template are defined in a separate XHTML
-        file in a composition, like this:
-        &lt;/p&gt;
-
-        &lt;div class="syntax"&gt;&lt;div class="html4strict"
-        style="font-family: monospace;"&gt;&lt;ol&gt;&lt;li class="li1"&gt;&lt;div
-        class="de1"&gt;&lt;span class="sc0"&gt;&amp;lt;!DOCTYPE html PUBLIC
-        &amp;quot;-//W3C//DTD XHTML 1.0 Transitional//EN&amp;quot;&lt;/div&gt;&lt;/li&gt;
-
-        &lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;
-        &amp;nbsp; &amp;quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&amp;quot;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-        &lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
-        &lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="sc3"&gt;&lt;span
-        class="re1"&gt;&amp;lt;html&lt;/span&gt; &lt;span class="re0"&gt;xmlns&lt;/span&gt;=&lt;span
-        class="st0"&gt;&amp;quot;http://www.w3.org/1999/xhtml&amp;quot;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-        &lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp;xmlns:&lt;span
-        class="re0"&gt;ui&lt;/span&gt;=&lt;span class="st0"&gt;&amp;quot;http://java.sun.com/jsf/facelets&amp;quot;&lt;/span&gt;&lt;span
-        class="re2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-
-        &lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
-        &lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &lt;span
-        class="sc3"&gt;&lt;span class="re1"&gt;&amp;lt;body&lt;span class="re2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-        &lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &lt;span
-        class="sc3"&gt;&lt;span class="re1"&gt;&amp;lt;ui&lt;/span&gt;:composition
-        &lt;span class="re0"&gt;template&lt;/span&gt;=&lt;span class="st0"&gt;&amp;quot;/layout.xhtml&amp;quot;&lt;/span&gt;&lt;span
-        class="re2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-        &lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
-        &lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;
-        &lt;span class="sc3"&gt;&lt;span class="re1"&gt;&amp;lt;ui&lt;/span&gt;:define
-        &lt;span class="re0"&gt;name&lt;/span&gt;=&lt;span class="st0"&gt;&amp;quot;title&amp;quot;&lt;/span&gt;&lt;span
-        class="re2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;A List of Contacts&lt;span
-        class="sc3"&gt;&lt;span class="re1"&gt;&amp;lt;/ui&lt;/span&gt;:define&lt;span
-        class="re2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-
-        &lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;
-        &lt;span class="sc3"&gt;&lt;span class="re1"&gt;&amp;lt;ui&lt;/span&gt;:define
-        &lt;span class="re0"&gt;name&lt;/span&gt;=&lt;span class="st0"&gt;&amp;quot;heading&amp;quot;&lt;/span&gt;&lt;span
-        class="re2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Contacts&lt;span
-        class="sc3"&gt;&lt;span class="re1"&gt;&amp;lt;/ui&lt;/span&gt;:define&lt;span
-        class="re2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-        &lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
-        &lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;
-        &lt;span class="sc3"&gt;&lt;span class="re1"&gt;&amp;lt;ui&lt;/span&gt;:define
-        &lt;span class="re0"&gt;name&lt;/span&gt;=&lt;span class="st0"&gt;&amp;quot;content&amp;quot;&lt;/span&gt;&lt;span
-        class="re2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-
-        &lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;
-        &amp;nbsp; &lt;span class="sc3"&gt;&lt;span class="re1"&gt;&amp;lt;ui&lt;/span&gt;:include
-        &lt;span class="re0"&gt;src&lt;/span&gt;=&lt;span class="st0"&gt;&amp;quot;contactsTable.xhtml&amp;quot;&lt;/span&gt;
-        &lt;span class="re2"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-        &lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;
-        &lt;span class="sc3"&gt;&lt;span class="re1"&gt;&amp;lt;/ui&lt;/span&gt;:define&lt;span
-        class="re2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-
-        &lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;
-        &amp;nbsp; &amp;nbsp;&lt;/div&gt;&lt;/li&gt;
-        &lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &lt;span
-        class="sc3"&gt;&lt;span class="re1"&gt;&amp;lt;/ui&lt;/span&gt;:composition&lt;span
-        class="re2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-        &lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &lt;span
-        class="sc3"&gt;&lt;span class="re1"&gt;&amp;lt;/body&lt;span class="re2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-        &lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="sc3"&gt;&lt;span
-        class="re1"&gt;&amp;lt;/html&lt;span class="re2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
-        &lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;
-
-        &lt;p&gt;
-        At runtime, JSF synthesizes the two previous XHTML pages to create a
-        single JSF view by inserting the
-        pieces defined in the composition into the template (that template is
-        layout.xhtml, which is the first
-        listing above). JSF also disregards everything outside of the &lt;code&gt;composition&lt;/code&gt;
-        tag so that we don't
-        wind up with two &lt;code&gt;body&lt;/code&gt; elements in the view.
-        Also, note that we use the &lt;code&gt;ui:include&lt;/code&gt;
-        tag on line 14 to include content (which happens to be a table) from
-        another XHTML page, so that we can reuse
-        that table in other views.
-        &lt;/p&gt;
-
-        &lt;p&gt;
-        So why do we have two XHTML pages to define a single view? Why not
-        simply take the pieces and manually insert
-        them into the layout so that we have only a single XHTML page? The
-        answer is simple: we have separated layout
-        from the content so that we can &lt;em&gt;reuse that layout&lt;/em&gt;
-        among multiple compositions. For example, now we can
-        define another composition that uses the same layout:
-        &lt;/p&gt;
-
-        &lt;div class="syntax"&gt;&lt;div class="html4strict"
-        style="font-family: monospace;"&gt;&lt;ol&gt;&lt;li class="li1"&gt;&lt;div
-        class="de1"&gt;&lt;span class="sc0"&gt;&amp;lt;!DOCTYPE html PUBLIC
-        &amp;quot;-//W3C//DTD XHTML 1.0 Transitional//EN&amp;quot;&lt;/div&gt;&lt;/li&gt;
-
-        &lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;
-        &amp;nbsp; &amp;quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&amp;quot;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-        &lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
-        &lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="sc3"&gt;&lt;span
-        class="re1"&gt;&amp;lt;html&lt;/span&gt; &lt;span class="re0"&gt;xmlns&lt;/span&gt;=&lt;span
-        class="st0"&gt;&amp;quot;http://www.w3.org/1999/xhtml&amp;quot;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-        &lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;
-        xmlns:&lt;span class="re0"&gt;ui&lt;/span&gt;=&lt;span class="st0"&gt;&amp;quot;http://java.sun.com/jsf/facelets&amp;quot;&lt;/span&gt;&lt;span
-        class="re2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-
-        &lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
-        &lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &lt;span
-        class="sc3"&gt;&lt;span class="re1"&gt;&amp;lt;body&lt;span class="re2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-        &lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &lt;span
-        class="sc3"&gt;&lt;span class="re1"&gt;&amp;lt;ui&lt;/span&gt;:composition
-        &lt;span class="re0"&gt;template&lt;/span&gt;=&lt;span class="st0"&gt;&amp;quot;/layout.xhtml&amp;quot;&lt;/span&gt;&lt;span
-        class="re2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-
-        &lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
-
-        &lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;
-        &lt;span class="sc3"&gt;&lt;span class="re1"&gt;&amp;lt;ui&lt;/span&gt;:define
-        &lt;span class="re0"&gt;name&lt;/span&gt;=&lt;span class="st0"&gt;&amp;quot;title&amp;quot;&lt;/span&gt;&lt;span
-        class="re2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Create a Contact&lt;span
-        class="sc3"&gt;&lt;span class="re1"&gt;&amp;lt;/ui&lt;/span&gt;:define&lt;span
-        class="re2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-
-        &lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;
-        &lt;span class="sc3"&gt;&lt;span class="re1"&gt;&amp;lt;ui&lt;/span&gt;:define
-        &lt;span class="re0"&gt;name&lt;/span&gt;=&lt;span class="st0"&gt;&amp;quot;heading&amp;quot;&lt;/span&gt;&lt;span
-        class="re2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Create Contact&amp;lt;/ui&lt;/span&gt;:define&lt;span
-        class="re2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-
-        &lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
-        &lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;
-        &lt;span class="sc3"&gt;&lt;span class="re1"&gt;&amp;lt;ui&lt;/span&gt;:define
-        &lt;span class="re0"&gt;name&lt;/span&gt;=&lt;span class="st0"&gt;&amp;quot;content&amp;quot;&lt;/span&gt;&lt;span
-        class="re2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-        &lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;
-        &amp;nbsp; &lt;span class="sc3"&gt;&lt;span class="re1"&gt;&amp;lt;ui&lt;/span&gt;:include
-        &lt;span class="re0"&gt;src&lt;/span&gt;=&lt;span class="st0"&gt;&amp;quot;createContactForm.xhtml&amp;quot;&lt;/span&gt;&lt;span
-        class="re2"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-
-        &lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;
-        &lt;span class="sc3"&gt;&lt;span class="re1"&gt;&amp;lt;/ui&lt;/span&gt;:define&lt;span
-        class="re2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-
-        &lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
-
-        &lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &lt;span
-        class="sc3"&gt;&lt;span class="re1"&gt;&amp;lt;/ui&lt;/span&gt;:composition&lt;span
-        class="re2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-        &lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &lt;span
-        class="sc3"&gt;&lt;span class="re1"&gt;&amp;lt;/body&lt;span class="re2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-        &lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="sc3"&gt;&lt;span
-        class="re1"&gt;&amp;lt;/html&lt;span class="re2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
-        &lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;
-
-        &lt;p&gt;
-        By encapsulating the layout, we can reuse that layout among multiple
-        compositions. Just like
-        &lt;code&gt;ui:include&lt;/code&gt; lets us encapsulate and reuse
-        conent, JSF compositions let us encapsulate and reuse
-        layout, so that changes to a single layout can affect multiple views.
-        Fundamentally, that's what this
-        tag library is all about.
-        &lt;/p&gt;
-
-        &lt;/div&gt;
-        &lt;pre&gt;
-
-    </description>
-    <namespace>http://java.sun.com/jsf/facelets</namespace>
-    <tag>
-        <description>
-
-
-            &lt;div class="changed_added_2_0"&gt;
-            &lt;p&gt;
-            This tag is the same as the &lt;code&gt;ui:composition&lt;/code&gt;,
-            except for two things:
-            JSF creates a component and adds it directly to the tree, and
-            there's no associated
-            template.
-            &lt;/p&gt;
-
-            &lt;p&gt;
-            Use this tag to create a component and specify a filename for the
-            component as either the source of a &lt;code&gt;ui:include&lt;/code&gt;,
-            or the source of a Facelets tag.
-            &lt;/p&gt;
-            &lt;/div&gt;
-
-        </description>
-        <tag-name>component</tag-name>
-        <handler-class>com.sun.faces.facelets.tag.ui.ComponentRefHandler</handler-class>
-        <attribute>
-            <description>
-
-
-                &lt;div class="changed_added_2_0"&gt;
-                &lt;p&gt;
-                The identifier of the component that JSF inserts into the
-                component tree. If an identifier is
-                not explicitly specified by the page author, JSF will assign an
-                identifier based on the algorithm
-                that it uses for all components.
-                &lt;/p&gt;
-                &lt;/div&gt;
-
-            </description>
-            <name>id</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-
-
-                &lt;div class="changed_added_2_0"&gt;
-                &lt;p&gt;
-                Binds the component to a backing bean property, as specified in
-                the JSF specification.
-                &lt;/p&gt;
-                &lt;/div&gt;
-
-            </description>
-            <name>binding</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-    </tag>
-    <tag>
-        <description>
-
-
-            &lt;div class="changed_added_2_0"&gt;
-            &lt;p&gt;
-            Defines a composition that optionally uses a template, as outlined
-            in the description of the ui tag library. Multiple
-            compositions can use the same template, thus encapsulating and
-            reusing layout. JSF disregards everything outside of the
-            composition, which lets developers embed compositions in well-formed
-            XHTML pages that can be viewed in an XHTML viewer,
-            such as Dreamweaver or a browser, without including extraneous
-            elements such as &lt;code&gt;head&lt;/code&gt; and &lt;code&gt;body&lt;/code&gt;.
-            &lt;/p&gt;
-            &lt;div class="syntax"&gt;&lt;div class="html4strict"
-            style="font-family: monospace;"&gt;&lt;ol&gt;&lt;li class="li1"&gt;&lt;div
-            class="de1"&gt;&lt;span class="sc0"&gt;&amp;lt;!DOCTYPE html PUBLIC
-            &amp;quot;-//W3C//DTD XHTML 1.0 Transitional//EN&amp;quot;&lt;/div&gt;&lt;/li&gt;
-
-            &lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp;
-            &amp;nbsp; &amp;nbsp; &amp;quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&amp;quot;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-            &lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
-            &lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="sc3"&gt;&lt;span
-            class="re1"&gt;&amp;lt;html&lt;/span&gt; &lt;span class="re0"&gt;xmlns&lt;/span&gt;=&lt;span
-            class="st0"&gt;&amp;quot;http://www.w3.org/1999/xhtml&amp;quot;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-            &lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp;xmlns:&lt;span
-            class="re0"&gt;ui&lt;/span&gt;=&lt;span class="st0"&gt;&amp;quot;http://java.sun.com/jsf/facelets&amp;quot;&lt;/span&gt;&lt;span
-            class="re2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-
-            &lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
-            &lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &lt;span
-            class="sc3"&gt;&lt;span class="re1"&gt;&amp;lt;body&lt;span
-            class="re2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-            &lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
-            &lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp;
-            THIS LINE, AND EVERYTHING ABOVE IT IS DISREGARDED BY JSF&lt;/div&gt;&lt;/li&gt;
-            &lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp;
-            &lt;span class="sc3"&gt;&lt;span class="re1"&gt;&amp;lt;ui&lt;/span&gt;:composition
-            &lt;span class="re0"&gt;template&lt;/span&gt;=&lt;span class="st0"&gt;&amp;quot;/layout.xhtml&amp;quot;&lt;/span&gt;&lt;span
-            class="re2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-
-            &lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
-            &lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp;
-            &amp;nbsp; &lt;span class="sc3"&gt;&lt;span class="re1"&gt;&amp;lt;ui&lt;/span&gt;:define
-            &lt;span class="re0"&gt;name&lt;/span&gt;=&lt;span class="st0"&gt;&amp;quot;title&amp;quot;&lt;/span&gt;&lt;span
-            class="re2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;#{msgs.contactsWindowTitle}&lt;span
-            class="sc3"&gt;&lt;span class="re1"&gt;&amp;lt;/ui&lt;/span&gt;:define&lt;span
-            class="re2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-            &lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp;
-            &amp;nbsp; &lt;span class="sc3"&gt;&lt;span class="re1"&gt;&amp;lt;ui&lt;/span&gt;:define
-            &lt;span class="re0"&gt;name&lt;/span&gt;=&lt;span class="st0"&gt;&amp;quot;heading&amp;quot;&lt;/span&gt;&lt;span
-            class="re2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;#{msgs.contactsHeading}&lt;span
-            class="sc3"&gt;&lt;span class="re1"&gt;&amp;lt;/ui&lt;/span&gt;:define&lt;span
-            class="re2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-
-            &lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
-            &lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp;
-            &amp;nbsp; &lt;span class="sc3"&gt;&lt;span class="re1"&gt;&amp;lt;ui&lt;/span&gt;:define
-            &lt;span class="re0"&gt;name&lt;/span&gt;=&lt;span class="st0"&gt;&amp;quot;content&amp;quot;&lt;/span&gt;&lt;span
-            class="re2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-            &lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp;
-            &amp;nbsp; &amp;nbsp; &lt;span class="sc3"&gt;&lt;span class="re1"&gt;&amp;lt;ui&lt;/span&gt;:include
-            &lt;span class="re0"&gt;src&lt;/span&gt;=&lt;span class="st0"&gt;&amp;quot;contactsTable.xhtml&amp;quot;&lt;/span&gt;
-            &lt;span class="re2"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-
-            &lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp;
-            &amp;nbsp; &lt;span class="sc3"&gt;&lt;span class="re1"&gt;&amp;lt;/ui&lt;/span&gt;:define&lt;span
-            class="re2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-            &lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp;
-            &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/div&gt;&lt;/li&gt;
-            &lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp;
-            &lt;span class="sc3"&gt;&lt;span class="re1"&gt;&amp;lt;/ui&lt;/span&gt;:composition&lt;span
-            class="re2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-            &lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp;
-            THIS LINE, AND EVERYTHING BELOW IT IS DISREGARDED BY JSF&lt;/div&gt;&lt;/li&gt;
-
-            &lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
-            &lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &lt;span
-            class="sc3"&gt;&lt;span class="re1"&gt;&amp;lt;/body&lt;span
-            class="re2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-            &lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="sc3"&gt;&lt;span
-            class="re1"&gt;&amp;lt;/html&lt;span class="re2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
-            &lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;
-
-            &lt;/div&gt;
-
-        </description>
-        <tag-name>composition</tag-name>
-        <handler-class>com.sun.faces.facelets.tag.ui.CompositionHandler</handler-class>
-        <attribute>
-            <description>
-
-
-                &lt;div class="changed_added_2_0"&gt;
-                &lt;p&gt;
-                A URI that points to a template, also known as a layout, that
-                inserts pieces of the page defined in the composition.
-                &lt;/p&gt;
-                &lt;/div&gt;
-
-            </description>
-            <name>template</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-    </tag>
-    <tag>
-        <description>
-
-
-            &lt;div class="changed_added_2_0"&gt;
-            &lt;p&gt;
-            When the &lt;code&gt;ui:debug&lt;/code&gt; tag is placed in an XHTML
-            page, it creates a component and adds it to the
-            component tree. That debug component captures debugging information,
-            namely the current state of the component
-            tree and the scoped variables in the application, when the component
-            is rendered. If the user presses CTRL + SHIFT + d,
-            JSF opens a window that shows the debugging information captured by
-            the debug component.
-            &lt;/p&gt;
-
-            &lt;p&gt;
-            Typically, the best place to put the &lt;code&gt;ui:debug&lt;/code&gt;
-            tag is in an application's main template, which
-            lets developers enable or disable viewing of debugging information
-            in one central location. Additionally, page
-            authors can change the hotkey (which by default is CTRL + SHIFT + d,
-            where the d stands for debug) to CTRL + SHIFT + ?,
-            where ? represents the key specified as the value of the &lt;code&gt;hotkey&lt;/code&gt;
-            attribute.
-            &lt;/p&gt;
-
-            &lt;p&gt;
-            You can use the &lt;code&gt;rendered&lt;/code&gt; attribute to
-            control whether the debug component is rendered.
-            Using an EL expression as the value for the &lt;code&gt;rendered&lt;/code&gt;
-            attribute lets you control whether
-            debug output is enabled for multiple views based on a single bean
-            property.
-            &lt;/p&gt;
-            &lt;/div&gt;
-
-        </description>
-        <tag-name>debug</tag-name>
-        <handler-class>com.sun.faces.facelets.tag.ui.UIDebug</handler-class>
-        <attribute>
-            <description>
-
-
-                &lt;div class="changed_added_2_0"&gt;
-                &lt;p&gt;
-                Defines a single character, that, pressed in conjunction with
-                CTRL and SHIFT, will display the JSF debug window.
-                By default, the hotkey is 'd'. &lt;em&gt;The value for the
-                hotkey attribute cannot be an EL expression.&lt;/em&gt;
-                &lt;/p&gt;
-
-                &lt;/div&gt;
-
-            </description>
-            <name>hotkey</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-
-
-                &lt;div class="changed_added_2_0"&gt;
-                &lt;p&gt;
-                Controls whether the debug component is rendered. Valid values
-                for this attribute are either the strings "true" or "false" or
-                an EL expression that evaluates to either "true" or "false".&lt;p&gt;If
-                this attribute's value is "false" or the value is an EL
-                expression that evaluates to "false", the debug component is not
-                rendered in the page, the hotkey attribute is disregarded, and
-                users cannot open the debugging information window with a
-                hotkey.&lt;/p&gt;
-                &lt;/p&gt;
-
-                &lt;/div&gt;
-
-            </description>
-            <name>rendered</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-    </tag>
-    <tag>
-        <description>
-
-
-            &lt;div class="changed_added_2_0"&gt;
-
-            &lt;p&gt;The &lt;code&gt;define&lt;/code&gt; tag defines content
-            that is inserted into a page by a template. The &lt;code&gt;define&lt;/code&gt;
-            tag can be used inside &lt;code&gt;ui:composition&lt;/code&gt;, &lt;code&gt;ui:component&lt;/code&gt;,
-            &lt;code&gt;ui:decorate&lt;/code&gt;, and &lt;code&gt;ui:fragment&lt;/code&gt;
-            tags.&lt;/p&gt;
-
-            &lt;p&gt;Content defined by the &lt;code&gt;define&lt;/code&gt; tag
-            can be inserted into a page by using &lt;code&gt;ui:insert&lt;/code&gt;.
-            &lt;/p&gt;
-
-            &lt;/div&gt;
-
-        </description>
-        <tag-name>define</tag-name>
-        <handler-class>com.sun.faces.facelets.tag.ui.DefineHandler</handler-class>
-        <attribute>
-            <description>
-
-
-                &lt;div class="changed_added_2_0"&gt;
-
-                &lt;p&gt;Assigns a name to the content inside a &lt;code&gt;define&lt;/code&gt;
-                tag. That name is used by corresponding &lt;code&gt;ui:insert&lt;/code&gt;
-                tags in a template that insert the named content into a page.&lt;/p&gt;
-                &lt;/div&gt;
-
-            </description>
-            <name>name</name>
-            <required>true</required>
-            <type>java.lang.String</type>
-        </attribute>
-    </tag>
-    <tag>
-        <description>
-
-
-            &lt;div class="changed_added_2_0"&gt;
-
-            &lt;p&gt;
-            The &lt;code&gt;decorate&lt;/code&gt; tag is identical to the &lt;code&gt;composition&lt;/code&gt;
-            tag, except that &lt;code&gt;ui:decorate&lt;/code&gt;, unlike &lt;code&gt;ui:composition&lt;/code&gt;,
-            does not disregard all content outside of the tag. The &lt;code&gt;decorate&lt;/code&gt;
-            is useful when you want to decorate some content in a page, for
-            example, you might want to decorate a list of items, like this:
-
-            &lt;div class="syntax"&gt;&lt;div class="html4strict"
-            style="font-family: monospace;"&gt;&lt;ol&gt;&lt;li class="li1"&gt;&lt;div
-            class="de1"&gt;
-
-            &lt;span class="sc2"&gt;&amp;lt;ui:decorate template=&lt;span
-            class="st0"&gt;&amp;quot;/layout.xhtml&amp;quot;&lt;/span&gt;&lt;span
-            class="kw2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-            &lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &lt;span
-            class="sc2"&gt;&amp;lt;ui:define &lt;span class="kw3"&gt;name&lt;/span&gt;=&lt;span
-            class="st0"&gt;&amp;quot;listHeading&amp;quot;&lt;/span&gt;&lt;span
-            class="kw2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-
-            &lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp;
-            &lt;span class="sc2"&gt;&amp;lt;ui:include &lt;span class="kw3"&gt;src&lt;/span&gt;="shared/listHeading.xhtml"/&lt;span
-            class="kw2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-            &lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &lt;span
-            class="sc2"&gt;&lt;span class="kw2"&gt;&amp;lt;&lt;/span&gt;/ui:define&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-            &lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp;
-            &amp;nbsp; &amp;nbsp; &lt;/div&gt;&lt;/li&gt;
-            &lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &lt;span
-            class="sc2"&gt;&amp;lt;c:forEach items="#&lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;items&lt;span
-            class="br0"&gt;&amp;#125;"&lt;/span&gt; var="item"&lt;span
-            class="kw2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-
-            &lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp;
-            ...&lt;/div&gt;&lt;/li&gt;
-            &lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &lt;span
-            class="sc2"&gt;&lt;span class="kw2"&gt;&amp;lt;&lt;/span&gt;/c:forEach&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
-            &lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; ...&lt;/div&gt;&lt;/li&gt;
-            &lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="sc2"&gt;&lt;span
-            class="kw2"&gt;&amp;lt;&lt;/span&gt;/ui:decorate&amp;gt;&lt;/span&gt;
-            &lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;
-            &lt;/p&gt;
-
-            Because JSF does not disregard everything outside of the &lt;code&gt;ui:decorate&lt;/code&gt;
-            tag, &lt;code&gt;ui:decorate&lt;/code&gt; can
-            be used to decorate pieces of a page.
-
-            &lt;/div&gt;
-
-        </description>
-        <tag-name>decorate</tag-name>
-        <handler-class>com.sun.faces.facelets.tag.ui.DecorateHandler</handler-class>
-        <attribute>
-            <description>
-
-
-                &lt;div class="changed_added_2_0"&gt;
-                A URI that points to a template, also known as a layout, that
-                inserts pieces of the page defined in the decorator.
-
-                &lt;/div&gt;
-
-            </description>
-            <name>template</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-    </tag>
-    <tag>
-        <description>
-
-
-            &lt;div class="changed_added_2_0"&gt;
-            &lt;p&gt;The &lt;code&gt;fragment&lt;/code&gt; tag is identical to
-            the &lt;code&gt;component&lt;/code&gt; tag, except that &lt;code&gt;ui:fragment&lt;/code&gt;,
-            unlike &lt;code&gt;ui:component&lt;/code&gt;, JSF does not disregard
-            all content outside of the tag.&lt;/p&gt;
-            &lt;/div&gt;
-
-        </description>
-        <tag-name>fragment</tag-name>
-        <handler-class>com.sun.faces.facelets.tag.ui.ComponentRefHandler</handler-class>
-        <attribute>
-            <description>
-
-
-                &lt;div class="changed_added_2_0"&gt;
-                The identifier of the component that JSF inserts into the
-                component tree. If an identifier is
-                not explicitly specified by the page author, JSF will assign an
-                identifier based on the algorithm
-                that it uses for all components.
-                &lt;/div&gt;
-
-            </description>
-            <name>id</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-
-
-                &lt;div class="changed_added_2_0"&gt;
-                Binds the component to a backing bean property, as specified in
-                the JSF specification.
-                &lt;/div&gt;
-
-            </description>
-            <name>binding</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-    </tag>
-    <tag>
-        <description>
-
-
-            &lt;div class="changed_added_2_0"&gt;
-            &lt;p&gt;Use this tag&amp;#8212which is very similar to JSP's &lt;code&gt;jsp:include&lt;/code&gt;&amp;#8212to
-            encapsulate and reuse content among
-            multiple XHTML pages. There are three things this tag can include:
-            plain XHTML, and XHTML pages that have either a &lt;code&gt;composition&lt;/code&gt;
-            tag or a &lt;code&gt;component&lt;/code&gt; tag.
-            &lt;/p&gt;
-            &lt;p&gt;You supply a filename, through &lt;code&gt;ui:include&lt;/code&gt;'s
-            &lt;code&gt;src&lt;/code&gt; attribute for JSF to include. That
-            filename is relative to the XHTML file that was rendered as a result
-            of the last request. So, for example, if JSF loaded
-            the view &lt;code&gt;login.xhtml&lt;/code&gt;, and that file
-            included &lt;code&gt;pageDecorations/header.xhtml&lt;/code&gt;, and
-            &lt;code&gt;
-            pageDecorations/header.xhtml&lt;/code&gt; included &lt;code&gt;companyLogo.xhtml&lt;/code&gt;,
-            then &lt;code&gt;companyLogo.xhtml&lt;/code&gt; will
-            not be found if it's in the &lt;code&gt;pageDecorations&lt;/code&gt;
-            directory, because &lt;code&gt;companyLogo.xhtml&lt;/code&gt; has to
-            be
-            in the same directory as &lt;code&gt;login.xhtml&lt;/code&gt;.
-            &lt;/p&gt;
-
-            &lt;/div&gt;
-
-        </description>
-        <tag-name>include</tag-name>
-        <handler-class>com.sun.faces.facelets.tag.ui.IncludeHandler</handler-class>
-        <attribute>
-            <description>
-
-
-                &lt;div class="changed_added_2_0"&gt;
-                The filename of an XHTML page to include. The filename is
-                relative to the XHTML page that was originally loaded.
-                &lt;/div&gt;
-
-            </description>
-            <name>src</name>
-            <required>true</required>
-            <type>java.lang.String</type>
-        </attribute>
-    </tag>
-    <tag>
-        <description>
-
-
-            &lt;div class="changed_added_2_0"&gt;
-            &lt;p&gt;Inserts content into a template. That content is defined&amp;#8212with
-            the &lt;code&gt;ui:define&lt;/code&gt; tag&amp;#8212 in either a
-            &lt;code&gt;ui:composition&lt;/code&gt;, &lt;code&gt;ui:component&lt;/code&gt;,
-            &lt;code&gt;ui:decorate&lt;/code&gt;, or &lt;code&gt;ui:fragment&lt;/code&gt;.&lt;/p&gt;
-            &lt;/div&gt;
-
-        </description>
-        <tag-name>insert</tag-name>
-        <handler-class>com.sun.faces.facelets.tag.ui.IncludeHandler</handler-class>
-        <attribute>
-            <description>
-
-
-                &lt;div class="changed_added_2_0"&gt;
-
-                The optional name attribute matches the associated &amp;lt;ui:define/&amp;gt;
-                tag in this template's client. If no name is specified, it's
-                expected
-                that the whole template client will be inserted.
-
-                &lt;/div&gt;
-
-            </description>
-            <name>name</name>
-            <required>false</required>
-            <type>java.lang.String</type>
-        </attribute>
-    </tag>
-    <tag>
-        <description>
-
-
-            &lt;div class="changed_added_2_0"&gt;
-            &lt;p&gt;Use this tag to pass parameters to an included file (using
-            &lt;code&gt;ui:include&lt;/code&gt;), or a template
-            (linked to either a composition or decorator). Embed &lt;code&gt;ui:param&lt;/code&gt;
-            tags in either &lt;code&gt;ui:include&lt;/code&gt;,
-            &lt;code&gt;ui:composition&lt;/code&gt;, or &lt;code&gt;ui:decorate&lt;/code&gt;
-            to pass the parameters.
-            &lt;/div&gt;
-
-        </description>
-        <tag-name>param</tag-name>
-        <handler-class>com.sun.faces.facelets.tag.ui.ParamHandler</handler-class>
-        <attribute>
-            <description>
-
-
-                &lt;div class="changed_added_2_0"&gt;
-                The name of the parameter.
-                &lt;/div&gt;
-
-            </description>
-            <name>name</name>
-            <required>true</required>
-            <type>java.lang.String</type>
-        </attribute>
-        <attribute>
-            <description>
-
-
-                &lt;div class="changed_added_2_0"&gt;
-                The value of the parameter. Notice that this attribute's value
-                can be an EL expression, which
-                means that you can pass objects to either an included file or a
-                template.
-                &lt;/div&gt;
-            </description>
-            <name>value</name>
-            <required>true</required>
-            <type>java.lang.String</type>
-        </attribute>
-    </tag>
-    <tag>
-        <description>
-
-
-            &lt;div class="changed_added_2_0"&gt;
-
-            &lt;p&gt;Use this tag as an alternative to &lt;code&gt;h:dataTable&lt;/code&gt;
-            or
-            &lt;code&gt;c:forEach&lt;/code&gt;, especially when you are using
-            the
-            &lt;code&gt;jsfc&lt;/code&gt; feature of Facelets. You can specify
-            this component as
-            the value of the &lt;code&gt;jsfc&lt;/code&gt; attribute, like this:
-            &amp;lt;div... jsfc="ui:repeat" value="#{contacts}" var="contact"&amp;gt;...
-            &lt;/p&gt;
-            &lt;/div&gt;
-
-        </description>
-        <tag-name>repeat</tag-name>
-        <handler-class>com.sun.faces.facelets.tag.ui.RepeatHandler</handler-class>
-        <attribute>
-            <description>
-
-
-                &lt;div class="changed_added_2_0"&gt;
-
-                &lt;p&gt;Read-write property setting the offset from the
-                beginning of the
-                collection from which to start the iteration. If not set, this
-                offset
-                is not considered and iteration will start at the beginning of
-                the
-                collection.&lt;/p&gt;
-
-                &lt;/div&gt;
-
-            </description>
-            <name>offset</name>
-            <required>false</required>
-            <type>int</type>
-        </attribute>
-        <attribute>
-            <description>
-
-
-                &lt;div class="changed_added_2_0"&gt;
-
-                &lt;p&gt;Read-write property setting the size of the collection
-                to iterate.
-                If this value is less than the actual size of the collection, a
-                &lt;code&gt;FacesException&lt;/code&gt; must be thrown.&lt;/p&gt;
-
-                &lt;/div&gt;
-
-            </description>
-            <name>size</name>
-            <required>false</required>
-            <type>int</type>
-        </attribute>
-        <attribute>
-            <description>
-
-                &lt;div class="changed_added_2_0"&gt;&lt;p&gt;Iteration
-                will only process every step items of the collection,
-                starting with the first one.&lt;/p&gt;&lt;/div&gt;
-
-            </description>
-            <name>step</name>
-            <required>false</required>
-            <type>int</type>
-        </attribute>
-        <attribute>
-            <description>
-
-
-                &lt;div class="changed_added_2_0"&gt;
-
-                &lt;p&gt;The name of a collection of items that this tag
-                iterates over. The
-                collection may be a &lt;code&gt;List&lt;/code&gt;, &lt;code&gt;array&lt;/code&gt;,
-                &lt;code&gt;java.sql.ResultSet&lt;/code&gt;, or an individual
-                java Object. If the
-                collection is null, this tag does nothing.&lt;/p&gt;
-
-                &lt;/div&gt;
-
-            </description>
-            <name>value</name>
-            <required>true</required>
-            <type>java.lang.Object</type>
-        </attribute>
-        <attribute>
-            <description>
-
-                &lt;div class="changed_added_2_0"&gt;&lt;p&gt;Name of the
-                exported scoped variable for the current item of the
-                iteration. This scoped variable has nested
-                visibility. Its type depends on the object of the
-                underlying collection&lt;/p&gt;&lt;/div&gt;
-
-            </description>
-            <name>var</name>
-            <required>true</required>
-            <type>java.lang.Object</type>
-        </attribute>
-        <attribute>
-            <description>
-
-                &lt;div class="changed_added_2_0"&gt;&lt;p&gt;Name of the
-                exported request scoped variable for the status of the
-                iteration. Object is a POJO with the following read-only
-                JavaBeans properties. This scoped variable has nested
-                visibility.&lt;/p&gt;
-
-                &lt;p&gt;&lt;code&gt;begin&lt;/code&gt; of type Integer&lt;/p&gt;
-
-                &lt;p&gt;&lt;code&gt;end&lt;/code&gt; of type Integer&lt;/p&gt;
-
-                &lt;p&gt;&lt;code&gt;index&lt;/code&gt; of type int&lt;/p&gt;
-
-                &lt;p&gt;&lt;code&gt;step&lt;/code&gt; of type Integer&lt;/p&gt;
-
-                &lt;p&gt;&lt;code&gt;even&lt;/code&gt; of type boolean&lt;/p&gt;
-
-                &lt;p&gt;&lt;code&gt;odd&lt;/code&gt; of type boolean&lt;/p&gt;
-
-                &lt;p&gt;&lt;code&gt;first&lt;/code&gt; of type boolean&lt;/p&gt;
-
-                &lt;p&gt;&lt;code&gt;last&lt;/code&gt; of type boolean&lt;/p&gt;
-
-                &lt;/div&gt;
-
-            </description>
-            <name>varStatus</name>
-            <required>false</required>
-            <type>java.lang.Object</type>
-        </attribute>
-    </tag>
-    <tag>
-        <description>
-
-
-            &lt;div class="changed_added_2_0"&gt;
-            &lt;p&gt;Remove content from a page. This tag is often used in
-            conjunction with the &lt;code&gt;jsfc&lt;/code&gt; feature of
-            Facelets,
-            to wrap additional markup. When Facelets removes markup from a page
-            by substituting markup items that have
-            a &lt;code&gt;jsfc&lt;/code&gt; attribute with the specified
-            component, Facelets also removes anything in the page that
-            is contained in a &lt;code&gt;ui:remove&lt;/code&gt; tag.&lt;/p&gt;
-            &lt;/div&gt;
-
-        </description>
-        <tag-name>remove</tag-name>
-        <handler-class>com.sun.faces.facelets.tag.ui.SchemaCompliantRemoveHandler</handler-class>
-
-    </tag>
-</facelet-taglib>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.ui/.classpath b/jsf/plugins/org.eclipse.jst.jsf.facelet.ui/.classpath
deleted file mode 100644
index 304e861..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.ui/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.ui/.project b/jsf/plugins/org.eclipse.jst.jsf.facelet.ui/.project
deleted file mode 100644
index c7247f3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.ui/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.jst.jsf.facelet.ui</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.ui/.settings/org.eclipse.jdt.core.prefs b/jsf/plugins/org.eclipse.jst.jsf.facelet.ui/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 42536dd..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.ui/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,79 +0,0 @@
-#Tue Oct 23 12:04:38 PDT 2007
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=disabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.5
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.doc.comment.support=enabled
-org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.autoboxing=warning
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=ignore
-org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
-org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
-org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
-org.eclipse.jdt.core.compiler.problem.invalidJavadoc=error
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocComments=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.missingJavadocTags=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
-org.eclipse.jdt.core.compiler.problem.nullReference=ignore
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
-org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore
-org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=ignore
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=ignore
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=error
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=error
-org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
-org.eclipse.jdt.core.compiler.problem.unusedLocal=error
-org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
-org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.5
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.ui/.settings/org.eclipse.pde.prefs b/jsf/plugins/org.eclipse.jst.jsf.facelet.ui/.settings/org.eclipse.pde.prefs
deleted file mode 100644
index cde2584..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.ui/.settings/org.eclipse.pde.prefs
+++ /dev/null
@@ -1,24 +0,0 @@
-#Fri May 30 12:03:18 PDT 2008
-compilers.f.unresolved-features=1
-compilers.f.unresolved-plugins=1
-compilers.incompatible-environment=1
-compilers.p.build=1
-compilers.p.deprecated=1
-compilers.p.discouraged-class=2
-compilers.p.internal=1
-compilers.p.missing-bundle-classpath-entries=1
-compilers.p.missing-packages=0
-compilers.p.no-required-att=0
-compilers.p.not-externalized-att=0
-compilers.p.unknown-attribute=1
-compilers.p.unknown-class=1
-compilers.p.unknown-element=1
-compilers.p.unknown-identifier=1
-compilers.p.unknown-resource=1
-compilers.p.unresolved-ex-points=0
-compilers.p.unresolved-import=0
-compilers.s.create-docs=false
-compilers.s.doc-folder=doc
-compilers.s.open-tags=1
-compilers.use-project=true
-eclipse.preferences.version=1
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.ui/META-INF/MANIFEST.MF b/jsf/plugins/org.eclipse.jst.jsf.facelet.ui/META-INF/MANIFEST.MF
deleted file mode 100644
index 8c082cd..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.ui/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,40 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %Bundle-Name.0
-Bundle-SymbolicName: org.eclipse.jst.jsf.facelet.ui;singleton:=true
-Bundle-Version: 1.0.0.qualifier
-Bundle-Activator: org.eclipse.jst.jsf.facelet.ui.internal.FaceletUiPlugin
-Bundle-Localization: plugin
-Require-Bundle: org.eclipse.ui,
- org.eclipse.core.runtime,
- org.eclipse.wst.html.core;bundle-version="1.1.200",
- org.eclipse.wst.html.ui;bundle-version="1.0.300",
- org.eclipse.wst.xml.ui;bundle-version="1.0.400",
- org.eclipse.jface.text;bundle-version="3.4.0",
- org.eclipse.wst.sse.ui;bundle-version="1.1.0",
- org.eclipse.wst.sse.core;bundle-version="1.1.300",
- org.eclipse.wst.xml.core;bundle-version="1.1.300",
- org.eclipse.jst.jsf.common;bundle-version="1.0.1",
- org.eclipse.core.resources;bundle-version="3.4.0",
- org.eclipse.jst.jsf.core;bundle-version="1.0.1",
- org.eclipse.jst.jsf.common.runtime;bundle-version="1.0.0",
- org.eclipse.wst.validation;bundle-version="1.1.103",
- org.eclipse.emf.common;bundle-version="2.4.0",
- org.eclipse.wst.common.project.facet.ui,
- org.eclipse.wst.common.frameworks;bundle-version="1.1.102",
- org.eclipse.core.databinding;bundle-version="1.1.0",
- org.eclipse.jface.databinding;bundle-version="1.2.0",
- org.eclipse.wst.common.modulecore;bundle-version="1.1.103",
- org.eclipse.core.databinding.beans;bundle-version="1.0.100",
- org.eclipse.wst.common.frameworks.ui;bundle-version="1.1.101",
- org.eclipse.jst.jsf.ui;bundle-version="1.0.1",
- org.eclipse.jst.jsf.facelet.core;bundle-version="1.0.0"
-Bundle-ActivationPolicy: lazy
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
-Export-Package: org.eclipse.jst.jsf.facelet.ui.internal;x-internal:=true,
- org.eclipse.jst.jsf.facelet.ui.internal.contentassist;x-internal:=true,
- org.eclipse.jst.jsf.facelet.ui.internal.facet;x-internal:=true,
- org.eclipse.jst.jsf.facelet.ui.internal.hover;x-internal:=true,
- org.eclipse.jst.jsf.facelet.ui.internal.htmleditor;x-internal:=true,
- org.eclipse.jst.jsf.facelet.ui.internal.validation;x-internal:=true
-Bundle-Vendor: %Bundle-Vendor.0
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.ui/about.html b/jsf/plugins/org.eclipse.jst.jsf.facelet.ui/about.html
deleted file mode 100644
index 90bd74d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.ui/about.html
+++ /dev/null
@@ -1,22 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<head>
-<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
-<title>About</title>
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>June, 2008</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise indicated below, the Content is provided to you under the terms and conditions of the
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content.</p>
-
-</body>
-</html>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.ui/build.properties b/jsf/plugins/org.eclipse.jst.jsf.facelet.ui/build.properties
deleted file mode 100644
index 28e0ea2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.ui/build.properties
+++ /dev/null
@@ -1,8 +0,0 @@
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               .,\
-               plugin.xml,\
-               plugin.properties,\
-               templates/,\
-               about.html
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.ui/plugin.properties b/jsf/plugins/org.eclipse.jst.jsf.facelet.ui/plugin.properties
deleted file mode 100644
index 21fb12e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.ui/plugin.properties
+++ /dev/null
@@ -1,5 +0,0 @@
-FaceletHTMLValidator_name=Facelet HTML Validator
-EL_Hyperlinkdetector_name=Facelet EL Hyperlink Detector
-FaceletValidatorMarker=Facelet Validator
-Bundle-Name.0 = UI Plug-in
-Bundle-Vendor.0 = Eclipse.org
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.ui/plugin.xml b/jsf/plugins/org.eclipse.jst.jsf.facelet.ui/plugin.xml
deleted file mode 100644
index d2dab59..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.ui/plugin.xml
+++ /dev/null
@@ -1,147 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.2"?>
-<plugin>
-   <extension
-         point="org.eclipse.wst.sse.ui.editorConfiguration">
-      <sourceViewerConfiguration
-            class="org.eclipse.wst.html.ui.StructuredTextViewerConfigurationHTML"
-            target="org.eclipse.wst.html.core.htmlsource">
-      </sourceViewerConfiguration>
-      <provisionalConfiguration
-            class="org.eclipse.jst.jsf.facelet.ui.internal.contentassist.XHTMLContentAssistProcessor"
-            target="org.eclipse.wst.html.HTML_DEFAULT"
-            type="contentassistprocessor">
-      </provisionalConfiguration>
-     <provisionalConfiguration 
-        type="contentassistprocessor" 
-        class="org.eclipse.jst.jsf.facelet.ui.internal.contentassist.CompositeAttributeAssistProcessor" 
-        target="org.eclipse.wst.html.HTML_DEFAULT" />
-      <documentationTextHover
-          class="org.eclipse.jst.jsf.facelet.ui.internal.hover.FaceletHover"
-          target="org.eclipse.wst.html.HTML_DEFAULT">
-    </documentationTextHover>
-    </extension>
-
-    <extension point="org.eclipse.ui.workbench.texteditor.hyperlinkDetectors">
-       <hyperlinkDetector
-             class="org.eclipse.jst.jsf.facelet.ui.internal.htmleditor.FaceletELHyperlinkDetector"
-             id="org.eclipse.jst.jsf.ui.elhyperlinkdetector"
-             name="%EL_Hyperlinkdetector_name"
-             targetId="org.eclipse.wst.html.core.htmlsource">
-       </hyperlinkDetector>
-    </extension>
-
-   <extension
-        id="FaceletValidationMarker"
-        name="%FaceletValidatorMarker"
-        point="org.eclipse.core.resources.markers">
-      <super
-            type="org.eclipse.wst.validation.problemmarker">
-      </super>
-    </extension>
-
-   <extension
-        point="org.eclipse.wst.validation.validatorV2"
-        id="FaceletHTMLValidator"
-        name="%FaceletHTMLValidator_name">
-        <validator
-            build="true"
-            class="org.eclipse.jst.jsf.facelet.ui.internal.validation.HTMLValidator"
-            manual="true"
-            markerId="org.eclipse.jst.jsf.facelet.ui.FaceletValidationMarker"
-            version="1">
-
-         <include>
-            <rules>
-               <projectNature
-                     id="org.eclipse.wst.common.modulecore.ModuleCoreNature">
-               </projectNature>
-            </rules>
-         </include>
-         <include>
-            <rules>
-               <projectNature
-                     id="org.eclipse.jdt.core.javanature">
-               </projectNature>
-            </rules>
-         </include>
-
-         <include>
-            <rules>
-               <facet
-                     id="jst.java">
-               </facet>
-            </rules>
-         </include>
-         <include>
-            <rules>
-               <facet
-                     id="jst.web">
-               </facet>
-            </rules>
-         </include>
-         <include>
-            <rules>
-               <facet
-                     id="jst.jsf" version="2.0">
-               </facet>
-            </rules>
-         </include>
-         <include>
-            <rules>
-               <contentType
-                     exactMatch="false"
-                     id="jsf.facelet">
-               </contentType>
-               <contentType
-                     exactMatch="false"
-                     id="jsf.facelet.composite">
-               </contentType>
-            </rules>
-         </include>
-         <group
-               id="org.eclipse.wst.sse.core.structuredModelGroup">
-         </group>
-
-        </validator>
-        </extension>
-        
-       <!--<extension
-        point="org.eclipse.wst.validation.validator"
-        id="FaceletTaglibValidator"
-        name="%FaceletTaglibValidator">
-        <validator>
-            <projectNature id="org.eclipse.wst.common.modulecore.ModuleCoreNature" />
-            <projectNature id="org.eclipse.jdt.core.javanature" />
-            <filter
-                objectClass="org.eclipse.core.resources.IFile"
-                nameFilter="faces-config.xml">
-            </filter>
-            <markerId
-               markerIdValue="JSPSemanticsValidatorMarker">
-            </markerId>
-            <helper 
-                class="org.eclipse.wst.validation.internal.operations.WorkbenchContext">
-            </helper>
-            <run
-                class="org.eclipse.jst.jsf.validation.internal.appconfig.AppConfigValidator"
-                incremental="true"
-                fullBuild="true"
-            />
-        </validator>
-    </extension>-->
-   <extension
-         point="org.eclipse.ui.editors.templates">
-      <include
-            file="templates/templates.xml"
-            translations="$nl$/templates/templates.properties">
-      </include>
-   </extension>
-   <!--<extension
-         point="org.eclipse.wst.xml.core.modelQueryExtensions">
-      <modelQueryExtension
-            class="org.eclipse.jst.jsf.facelet.ui.internal.contentassist.MyModelQueryExtension"
-            contentType="org.eclipse.wst.html.core.htmlsource">
-      </modelQueryExtension>
-   </extension>-->
-</plugin>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.ui/src/org/eclipse/jst/jsf/facelet/ui/internal/FaceletUiPlugin.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.ui/src/org/eclipse/jst/jsf/facelet/ui/internal/FaceletUiPlugin.java
deleted file mode 100644
index 15ed671..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.ui/src/org/eclipse/jst/jsf/facelet/ui/internal/FaceletUiPlugin.java
+++ /dev/null
@@ -1,69 +0,0 @@
-package org.eclipse.jst.jsf.facelet.ui.internal;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jst.jsf.designtime.internal.view.model.TagRegistryFactory.TagRegistryFactoryException;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.osgi.framework.BundleContext;
-
-/**
- * The activator class controls the plug-in life cycle
- */
-public class FaceletUiPlugin extends AbstractUIPlugin
-{
-
-    /**
-     * The plug-in ID
-     */
-    public static final String     PLUGIN_ID = "org.eclipse.jst.jsf.facelet.ui";
-
-    // The shared instance
-    private static FaceletUiPlugin plugin;
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see
-     * org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext
-     * )
-     */
-    @Override
-    public void start(final BundleContext context) throws Exception
-    {
-        super.start(context);
-        plugin = this;
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see
-     * org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext
-     * )
-     */
-    @Override
-    public void stop(final BundleContext context) throws Exception
-    {
-        plugin = null;
-        super.stop(context);
-    }
-
-    /**
-     * Returns the shared instance
-     * 
-     * @return the shared instance
-     */
-    public static FaceletUiPlugin getDefault()
-    {
-        return plugin;
-    }
-
-    /**
-     * @param e
-     */
-    public static void log(final TagRegistryFactoryException e)
-    {
-        getDefault().getLog().log(new Status(IStatus.ERROR, PLUGIN_ID, "", e));
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.ui/src/org/eclipse/jst/jsf/facelet/ui/internal/contentassist/CompositeAttributeAssistProcessor.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.ui/src/org/eclipse/jst/jsf/facelet/ui/internal/contentassist/CompositeAttributeAssistProcessor.java
deleted file mode 100644
index 13312fa..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.ui/src/org/eclipse/jst/jsf/facelet/ui/internal/contentassist/CompositeAttributeAssistProcessor.java
+++ /dev/null
@@ -1,123 +0,0 @@
-package org.eclipse.jst.jsf.facelet.ui.internal.contentassist;
-
-import org.eclipse.jface.text.ITextViewer;
-import org.eclipse.jface.text.contentassist.ICompletionProposal;
-import org.eclipse.jface.text.contentassist.IContentAssistProcessor;
-import org.eclipse.jface.text.contentassist.IContextInformation;
-import org.eclipse.jface.text.contentassist.IContextInformationValidator;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContextFactory;
-import org.eclipse.jst.jsf.designtime.DTAppManagerUtil;
-import org.eclipse.jst.jsf.designtime.internal.view.XMLViewDefnAdapter;
-import org.eclipse.jst.jsf.designtime.internal.view.IDTViewHandler.ViewHandlerException;
-import org.eclipse.jst.jsf.designtime.internal.view.XMLViewDefnAdapter.DTELExpression;
-import org.eclipse.jst.jsf.ui.internal.contentassist.JSFContentAssistProcessor;
-import org.eclipse.jst.jsf.ui.internal.contentassist.el.JSFELContentAssistProcessor;
-
-/**
- * Composes the EL and non-EL attribute value assist processor for JSF.  This
- * is necessary mainly because, without the EL partitioning in HTML, both
- * processors would otherwise activate on every attribute.
- * 
- * @author cbateman
- *
- */
-public class CompositeAttributeAssistProcessor implements
-        IContentAssistProcessor
-{
-    private JSFContentAssistProcessor _nonELProcessor;
-    private JSFELContentAssistProcessor _elProcessor;
-    private char[]                      _activationChars;
-
-    /**
-     * Default constructor
-     */
-    public CompositeAttributeAssistProcessor()
-    {
-        _nonELProcessor = new JSFContentAssistProcessor();
-        _elProcessor = new JSFELContentAssistProcessor();
-        
-        char[] nonELChars = 
-            _nonELProcessor.getCompletionProposalAutoActivationCharacters();
-        char[] elChars =
-            _elProcessor.getCompletionProposalAutoActivationCharacters();
-        _activationChars = new char[nonELChars.length+elChars.length];
-        System.arraycopy(nonELChars, 0, _activationChars, 0, nonELChars.length);
-        System.arraycopy(elChars, 0, _activationChars, nonELChars.length, elChars.length);
-        
-        
-    }
-    public ICompletionProposal[] computeCompletionProposals(ITextViewer viewer,
-            int offset)
-    {
-        if (isEL(viewer, offset))
-        {
-            return _elProcessor.computeCompletionProposals(viewer, offset);
-        }
-        return _nonELProcessor.computeCompletionProposals(viewer, offset);
-    }
-
-    public IContextInformation[] computeContextInformation(ITextViewer viewer,
-            int offset)
-    {
-        if (isEL(viewer, offset))
-        {
-            return _elProcessor.computeContextInformation(viewer, offset);
-        }
-        return _nonELProcessor.computeContextInformation(viewer, offset);
-    }
-
-    public char[] getCompletionProposalAutoActivationCharacters()
-    {
-        return _activationChars;
-    }
-
-    public char[] getContextInformationAutoActivationCharacters()
-    {
-        // disable this functionality
-        return null;
-    }
-
-    public IContextInformationValidator getContextInformationValidator()
-    {
-        // disable this functionality
-        return null;
-    }
-
-    public String getErrorMessage()
-    {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    private boolean isEL(final ITextViewer viewer, int offset)
-    {
-        IStructuredDocumentContext context =
-            IStructuredDocumentContextFactory.INSTANCE.getContext(viewer, offset);
-        
-        if (context != null)
-        {
-            XMLViewDefnAdapter adapter = 
-                DTAppManagerUtil.getXMLViewDefnAdapter(context);
-            if (adapter != null)
-            {
-                try
-                {
-                    DTELExpression elExpression = adapter.getELExpression(context);
-    
-                    // only return true if we definitively find EL
-                    if(elExpression != null)
-                    {
-                        return true;
-                    }
-                }
-                catch (ViewHandlerException e)
-                {
-                    // fall through to false, no el
-                }
-            }
-        }
-        // all other cases, return false
-        return false;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.ui/src/org/eclipse/jst/jsf/facelet/ui/internal/contentassist/MyModelQueryExtension.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.ui/src/org/eclipse/jst/jsf/facelet/ui/internal/contentassist/MyModelQueryExtension.java
deleted file mode 100644
index f2b80aa..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.ui/src/org/eclipse/jst/jsf/facelet/ui/internal/contentassist/MyModelQueryExtension.java
+++ /dev/null
@@ -1,84 +0,0 @@
-package org.eclipse.jst.jsf.facelet.ui.internal.contentassist;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IStructuredDocumentContextResolverFactory;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IWorkspaceContextResolver;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContextFactory2;
-import org.eclipse.jst.jsf.facelet.core.internal.cm.FaceletDocumentFactory;
-import org.eclipse.jst.jsf.facelet.core.internal.util.ViewUtil;
-import org.eclipse.jst.jsf.facelet.core.internal.util.ViewUtil.PrefixEntry;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMDocument;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
-import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.extension.ModelQueryExtension;
-import org.w3c.dom.Element;
-
-/**
- * A model query extension used to help support content assist in html files.
- * 
- * @author cbateman
- *
- */
-public class MyModelQueryExtension extends ModelQueryExtension
-{
-
-    @Override
-    public String[] getAttributeValues(Element ownerElement, String namespace,
-            String name)
-    {
-        // TODO Auto-generated method stub
-        return super.getAttributeValues(ownerElement, namespace, name);
-    }
-
-    @Override
-    public CMNode[] getAvailableElementContent(Element parentElement,
-            String namespace, int includeOptions)
-    {
-        final IStructuredDocumentContext context = IStructuredDocumentContextFactory2.INSTANCE
-                .getContext(parentElement);
-        if (context != null)
-        {
-            final IWorkspaceContextResolver resolver = IStructuredDocumentContextResolverFactory.INSTANCE
-                    .getWorkspaceContextResolver(context);
-            
-            if (resolver != null)
-            {
-                final IProject project = resolver.getProject();
-                final FaceletDocumentFactory factory = 
-                    new FaceletDocumentFactory(project);
-                final Map<String, PrefixEntry> map = 
-                    ViewUtil.getDocumentNamespaces(parentElement.getOwnerDocument());
-                String prefix = null;
-                for (final Map.Entry<String, PrefixEntry> entry : map.entrySet())
-                {
-                    if (entry.getValue().getUri().equals(namespace))
-                    {
-                        prefix = entry.getValue().getPrefix();
-                        break;
-                    }
-                }
-                
-                if (prefix != null)
-                {
-                    CMDocument document = 
-                        factory.createCMDocumentForContext(namespace, prefix);
-                    if (document != null)
-                    {
-                        List<CMNode>  nodes = new ArrayList<CMNode>();
-                        for (final Iterator<?> it = document.getElements().iterator(); it.hasNext();)
-                        {
-                            nodes.add((CMNode)it.next());
-                        }
-                        return nodes.toArray(new CMNode[0]);
-                    }
-                }
-            }
-        }
-        return new CMNode[0];
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.ui/src/org/eclipse/jst/jsf/facelet/ui/internal/contentassist/XHTMLContentAssistProcessor.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.ui/src/org/eclipse/jst/jsf/facelet/ui/internal/contentassist/XHTMLContentAssistProcessor.java
deleted file mode 100644
index 0b2afd4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.ui/src/org/eclipse/jst/jsf/facelet/ui/internal/contentassist/XHTMLContentAssistProcessor.java
+++ /dev/null
@@ -1,277 +0,0 @@
-package org.eclipse.jst.jsf.facelet.ui.internal.contentassist;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.jface.text.ITextViewer;
-import org.eclipse.jface.text.contentassist.ICompletionProposal;
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.Namespace;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IDOMContextResolver;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IStructuredDocumentContextResolverFactory;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IWorkspaceContextResolver;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContextFactory;
-import org.eclipse.jst.jsf.designtime.internal.view.model.ITagRegistry;
-import org.eclipse.jst.jsf.facelet.core.internal.cm.FaceletDocumentFactory;
-import org.eclipse.jst.jsf.facelet.core.internal.util.ViewUtil;
-import org.eclipse.jst.jsf.facelet.core.internal.util.ViewUtil.PrefixEntry;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
-import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;
-import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionList;
-import org.eclipse.wst.sse.ui.internal.contentassist.CustomCompletionProposal;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMDocument;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext;
-import org.eclipse.wst.xml.ui.internal.contentassist.AbstractContentAssistProcessor;
-import org.eclipse.wst.xml.ui.internal.contentassist.ContentAssistRequest;
-import org.eclipse.wst.xml.ui.internal.contentassist.XMLRelevanceConstants;
-import org.w3c.dom.Attr;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.NamedNodeMap;
-import org.w3c.dom.Node;
-
-/**
- * The main entry point for Facelet content assist in html files.
- * @author cbateman
- *
- */
-public class XHTMLContentAssistProcessor extends AbstractContentAssistProcessor
-{
-    private IFile _file;
-    private FaceletDocumentFactory      _factory;
-
-    private final static ICompletionProposal[] NO_PROPOSALS = new ICompletionProposal[0];
-    
-    @Override
-    public ICompletionProposal[] computeCompletionProposals(
-            final ITextViewer textViewer, final int documentPosition)
-    {
-        ICompletionProposal[] proposals = null;
-        _file = getFile(textViewer, documentPosition);
-
-        if (_file != null && shouldContribute(_file))
-        {
-            _factory = new FaceletDocumentFactory(_file.getProject());
-            proposals =  super.computeCompletionProposals(textViewer,
-                    documentPosition);
-        }
-        return proposals != null ? proposals : NO_PROPOSALS;
-    }
-
-    @SuppressWarnings("unchecked")
-    @Override
-    protected List getAvailableChildElementDeclarations(final Element parent,
-            final int childPosition, final int kindOfAction)
-    {
-        final Map<String, PrefixEntry> namespaces = getDocumentNamespaces(
-                _factory, childPosition);
-        final List availableChildElements = new ArrayList();
-
-        for (final Map.Entry<String, PrefixEntry> entry : namespaces.entrySet())
-        {
-            final String prefix = entry.getValue().getPrefix();
-            final CMDocument cmDocument = _factory.createCMDocumentForContext(
-                    entry.getValue().getUri(), prefix);
-
-            if (cmDocument != null)
-            {
-                final Iterator it = cmDocument.getElements().iterator();
-                while (it.hasNext())
-                {
-                    availableChildElements.add(it.next());
-                }
-            }
-        }
-
-        return availableChildElements;
-    }
-
-    @Override
-    protected void addAttributeValueProposals(
-            final ContentAssistRequest contentAssistRequest)
-    {
-        final ITextRegion textRegion = findNameRegionIfIsHTMLRoot(contentAssistRequest);
-
-        if (textRegion != null)
-        {
-            final IDOMNode node = (IDOMNode) contentAssistRequest.getNode();
-            final NamedNodeMap attributes = node.getAttributes();
-            final String attrName = node.getFirstStructuredDocumentRegion()
-            .getText(textRegion);
-            if (attrName != null)
-            {
-                final int colonPos = attrName.indexOf(':');
-                // must have a colon && it must not be the last char, otherwise
-                // there is no localName
-                if (colonPos > -1 && colonPos < attrName.length() - 1)
-                {
-                    final String prefix = attrName.substring(0, colonPos);
-
-                    if ("xmlns".equals(prefix))
-                    {
-                        final ITagRegistry tagRegistry = ViewUtil.getHtmlTagRegistry(_file.getProject());
-                        if (tagRegistry != null)
-                        {
-                            final Set<Attr> alreadyUsed = ViewUtil.getDeclaredNamespaces(attributes);
-                            final Collection<? extends Namespace> namespaces = tagRegistry
-                            .getAllTagLibraries();
-                            NAMESPACE_LOOP: for (final Namespace ns : namespaces)
-                            {
-                                final String possibleValue = ns.getNSUri();
-
-                                if (ViewUtil.hasAttributeValue(alreadyUsed, possibleValue))
-                                {
-                                    continue NAMESPACE_LOOP;
-                                }
-                                // we have an attribute of the form xmlns:X in
-                                // the
-                                // html root node. Here we can provide value
-                                // proposals
-                                // for all of the known namespaces.
-                                final String rString = "\"" + possibleValue + "\""; //$NON-NLS-2$//$NON-NLS-1$
-                                final int rOffset = contentAssistRequest
-                                .getReplacementBeginPosition();
-                                final int rLength = contentAssistRequest
-                                .getReplacementLength();
-                                final int cursorAfter = possibleValue.length() + 1;
-                                final String displayString = "\"" + possibleValue + "\""; //$NON-NLS-2$//$NON-NLS-1$
-
-                                final CustomCompletionProposal proposal = new CustomCompletionProposal(
-                                        rString,
-                                        rOffset,
-                                        rLength,
-                                        cursorAfter,
-                                        null,
-                                        displayString,
-                                        null,
-                                        null,
-                                        XMLRelevanceConstants.R_XML_ATTRIBUTE_VALUE);
-                                contentAssistRequest.addProposal(proposal);
-                            }
-                        }
-                        // now bail, since super only adds annoying identity completions
-                        // for this case
-                        return;
-                    }
-                }
-            }
-        }
-        super.addAttributeValueProposals(contentAssistRequest);
-    }
-
-    private ITextRegion findNameRegionIfIsHTMLRoot(
-            final ContentAssistRequest contentAssistRequest)
-    {
-        final IDOMNode node = (IDOMNode) contentAssistRequest.getNode();
-        if (node.getNodeType() == Node.ELEMENT_NODE
-                && "html".equals(node.getNodeName())
-                && node.getOwnerDocument().getDocumentElement() == node)
-        {
-            // Find the attribute region and name for which this position should
-            // have a value proposed
-            final IStructuredDocumentRegion open = node
-            .getFirstStructuredDocumentRegion();
-            final ITextRegionList openRegions = open.getRegions();
-            int i = openRegions.indexOf(contentAssistRequest.getRegion());
-            if (i < 0)
-            {
-                return null;
-            }
-            ITextRegion nameRegion = null;
-            while (i >= 0)
-            {
-                nameRegion = openRegions.get(i--);
-                if (nameRegion.getType() == DOMRegionContext.XML_TAG_ATTRIBUTE_NAME)
-                {
-                    break;
-                }
-            }
-            return nameRegion;
-        }
-        return null;
-    }
-
-    @SuppressWarnings("unchecked")
-    private Map<String, PrefixEntry> getDocumentNamespaces(
-            final FaceletDocumentFactory factory, final int offset)
-            {
-        final IStructuredDocumentContext context = IStructuredDocumentContextFactory.INSTANCE
-        .getContext(fTextViewer, offset);
-
-        Document doc = null;
-        if (context != null)
-        {
-            final IDOMContextResolver domContextResolver = IStructuredDocumentContextResolverFactory.INSTANCE
-            .getDOMContextResolver(context);
-
-            doc = domContextResolver.getDOMDocument();
-
-            if (doc == null)
-            {
-                return Collections.EMPTY_MAP;
-            }
-        }
-        return ViewUtil.getDocumentNamespaces(doc);
-            }
-
-    @Override
-    protected CMElementDeclaration getCMElementDeclaration(final Node node)
-    {
-        if (node.getNodeType() == Node.ELEMENT_NODE)
-        {
-            if (node.getPrefix() != null)
-            {
-                final Element element = (Element) node;
-
-                final CMElementDeclaration elementDecl = _factory
-                .createCMElementDeclaration(element);
-
-                if (elementDecl != null)
-                {
-                    return elementDecl;
-                }
-            }
-        }
-
-        return null;
-        // return super.getCMElementDeclaration(node);
-    }
-
-    private boolean shouldContribute(final IFile file)
-    {
-        return ViewUtil.isFaceletVDLFile(file);
-    }
-
-    private IFile getFile(final ITextViewer textViewer,
-            final int documentPosition)
-    {
-        final IStructuredDocumentContext context = IStructuredDocumentContextFactory.INSTANCE
-        .getContext(textViewer, documentPosition);
-
-        if (context != null)
-        {
-            final IWorkspaceContextResolver resolver = IStructuredDocumentContextResolverFactory.INSTANCE
-            .getWorkspaceContextResolver(context);
-
-            if (resolver != null)
-            {
-                final IResource resource = resolver.getResource();
-                if (resource != null &&
-                        resource.getType() == IResource.FILE)
-                {
-                    return (IFile) resource;
-                }
-            }
-        }
-        return null;
-    }
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.ui/src/org/eclipse/jst/jsf/facelet/ui/internal/contentassist/XHTMLContentAssistProcessor2.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.ui/src/org/eclipse/jst/jsf/facelet/ui/internal/contentassist/XHTMLContentAssistProcessor2.java
deleted file mode 100644
index 47ac591..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.ui/src/org/eclipse/jst/jsf/facelet/ui/internal/contentassist/XHTMLContentAssistProcessor2.java
+++ /dev/null
@@ -1,335 +0,0 @@
-package org.eclipse.jst.jsf.facelet.ui.internal.contentassist;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jface.text.ITextViewer;
-import org.eclipse.jface.text.contentassist.CompletionProposal;
-import org.eclipse.jface.text.contentassist.ICompletionProposal;
-import org.eclipse.jface.text.contentassist.IContentAssistProcessor;
-import org.eclipse.jface.text.contentassist.IContextInformation;
-import org.eclipse.jface.text.contentassist.IContextInformationValidator;
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.ITagElement;
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.Namespace;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IDOMContextResolver;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IStructuredDocumentContextResolverFactory;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IWorkspaceContextResolver;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.internal.ITextRegionContextResolver;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContextFactory;
-import org.eclipse.jst.jsf.designtime.internal.view.model.ITagRegistry;
-import org.eclipse.jst.jsf.designtime.internal.view.model.TagRegistryFactory.TagRegistryFactoryException;
-import org.eclipse.jst.jsf.facelet.core.internal.registry.FaceletRegistryManager.MyRegistryFactory;
-import org.eclipse.jst.jsf.facelet.ui.internal.FaceletUiPlugin;
-import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext;
-import org.w3c.dom.Attr;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.NamedNodeMap;
-
-/**
- * Temporary.
- * 
- * @author cbateman
- *
- */
-public class XHTMLContentAssistProcessor2 implements IContentAssistProcessor
-{
-    private final static ICompletionProposal[] NO_PROPOSALS = new ICompletionProposal[0];
-
-    public ICompletionProposal[] computeCompletionProposals(ITextViewer viewer,
-            int offset)
-    {
-        List<ICompletionProposal> proposals = new ArrayList<ICompletionProposal>();
-        final IStructuredDocumentContext context = IStructuredDocumentContextFactory.INSTANCE
-                .getContext(viewer, offset);
-
-        if (context != null)
-        {
-            final IDOMContextResolver domContextResolver = IStructuredDocumentContextResolverFactory.INSTANCE
-                    .getDOMContextResolver(context);
-
-            final Document doc = domContextResolver.getDOMDocument();
-
-            if (doc == null)
-            {
-                return NO_PROPOSALS;
-            }
-
-            // get the namespaces that are already declared
-            final Map<String, PrefixEntry> documentNamespaces = getDocumentNamespaces(doc);
-
-            final ITextRegionContextResolver resolver = IStructuredDocumentContextResolverFactory.INSTANCE
-                    .getTextRegionResolver(context);
-
-            if (resolver != null)
-            {
-                final String regionType = resolver.getRegionType();
-
-                if (DOMRegionContext.XML_CONTENT.equals(regionType))
-                {
-                    // TODO: this may be in the open it may occur on the inside
-                    // of a
-                    // "<" that doesn't have any further tag name yet
-                    proposals = getTagCompletionsForDocument(context,
-                            documentNamespaces, TagPrefix.NO_PREFIX);
-                }
-                else if (DOMRegionContext.XML_TAG_NAME.equals(regionType))
-                {
-                    final TagPrefix tagPrefix = new TagPrefix(resolver
-                            .getRegionText());
-                    proposals = getTagCompletionsForDocument(context,
-                            documentNamespaces, tagPrefix);
-                }
-                else
-                {
-                    System.out.println(regionType);
-                }
-            }
-        }
-
-        return proposals.toArray(NO_PROPOSALS);
-    }
-
-    private List<ICompletionProposal> getTagCompletionsForDocument(
-            final IStructuredDocumentContext context,
-            final Map<String, PrefixEntry> namespaces, final TagPrefix tagPrefix)
-    {
-        final List<ICompletionProposal> proposals = new ArrayList<ICompletionProposal>();
-
-        final IWorkspaceContextResolver wkspaceResolver = IStructuredDocumentContextResolverFactory.INSTANCE
-                .getWorkspaceContextResolver(context);
-        final IProject project = wkspaceResolver.getProject();
-
-        MyRegistryFactory factory = new MyRegistryFactory();
-        ITagRegistry registry;
-        try
-        {
-            registry = factory.createTagRegistry(project);
-            if (registry == null)
-            {
-                return proposals;
-            }
-
-            final Collection<? extends Namespace> tagLibs = registry
-                    .getAllTagLibraries();
-
-            for (final Namespace tagLib : tagLibs)
-            {
-                final PrefixEntry ns = namespaces.get(tagLib.getNSUri());
-
-                // if the tag library is not initialized, don't trigger
-                // a potentially expensive operation during the content assist
-                if (ns != null && tagLib.isInitialized())
-                {
-                    // only add if this namespace's prefix starts with
-                    // the prefix that the user provided
-                    if (ns._prefix.startsWith(tagPrefix.getPrefix()))
-                    {
-                        final Collection<?> tags = tagLib.getViewElements();
-
-                        for (final Iterator<?> it = tags.iterator(); it
-                                .hasNext();)
-                        {
-                            final ITagElement tagElement = (ITagElement) it
-                                    .next();
-
-                            // only add an element it starts with the prefix
-                            // provided
-                            if (tagElement.getName().startsWith(
-                                    tagPrefix.getLocalName()))
-                            {
-                                final String userPrefix = tagPrefix
-                                        .getUserPrefix();
-
-                                final String tagName = ns._prefix + ":"
-                                        + tagElement.getName();
-                                String replacementText = "";
-                                if ("".equals(userPrefix))
-                                {
-                                    replacementText = "<" + tagName + "></"
-                                            + tagName + ">";
-                                }
-                                else
-                                {
-                                    replacementText = tagName
-                                            .substring(userPrefix.length());
-                                }
-                                proposals.add(new CompletionProposal(
-                                        replacementText, context
-                                                .getDocumentPosition(), 0, 0,
-                                        null, tagName, null, null));
-                            }
-                        }
-                    }
-                }
-            }
-        }
-        catch (TagRegistryFactoryException e)
-        {
-            FaceletUiPlugin.log(e);
-        }
-
-        return proposals;
-    }
-
-    private Map<String, PrefixEntry> getDocumentNamespaces(Document doc)
-    {
-        final Map<String, PrefixEntry> namespaces = new HashMap<String, PrefixEntry>();
-
-        Element rootElement = doc.getDocumentElement();
-
-        if (rootElement != null)
-        {
-            NamedNodeMap attrs = rootElement.getAttributes();
-            for (int i = 0; i < attrs.getLength(); i++)
-            {
-                Attr a = (Attr) attrs.item(i);
-                PrefixEntry ns = PrefixEntry.parseNamespace(a);
-                if (ns != null)
-                {
-                    namespaces.put(ns.getUri(), ns);
-                }
-            }
-        }
-
-        return namespaces;
-    }
-
-    private static class TagPrefix
-    {
-        public final static TagPrefix NO_PREFIX = new TagPrefix("");
-
-        private final String          _prefix;
-        private final String          _localName;
-        private final boolean         _hasColon;
-
-        public TagPrefix(final String tagName)
-        {
-            int prefixIdx = tagName.indexOf(':');
-
-            if (prefixIdx != -1)
-            {
-                _prefix = tagName.substring(0, prefixIdx);
-                _hasColon = true;
-                if (tagName.length() > prefixIdx)
-                {
-                    _localName = tagName.substring(prefixIdx + 1);
-                }
-                else
-                {
-                    _localName = "";
-                }
-            }
-            else
-            {
-                _hasColon = false;
-                _prefix = tagName;
-                _localName = "";
-            }
-        }
-
-        public String getUserPrefix()
-        {
-            String userPrefix = _prefix;
-
-            if (_hasColon)
-            {
-                userPrefix += ":";
-                userPrefix += _localName;
-            }
-
-            return userPrefix;
-        }
-
-        public String getPrefix()
-        {
-            return _prefix;
-        }
-
-        public String getLocalName()
-        {
-            return _localName;
-        }
-    }
-
-    private static class PrefixEntry
-    {
-        private final String _uri;
-        private final String _prefix;
-
-        public static PrefixEntry parseNamespace(Attr attr)
-        {
-            final String prefix = attr.getPrefix();
-
-            if ("xmlns".equals(prefix))
-            {
-                final String prefixName = attr.getLocalName();
-                if (prefixName != null)
-                {
-                    final String uri = attr.getNodeValue();
-
-                    if (uri != null)
-                    {
-                        return new PrefixEntry(uri, prefixName);
-                    }
-                }
-            }
-
-            return null;
-        }
-
-        public PrefixEntry(final String uri, final String prefix)
-        {
-            _uri = uri;
-            _prefix = prefix;
-        }
-
-        public final String getUri()
-        {
-            return _uri;
-        }
-
-        public int hashCode()
-        {
-            return _uri.hashCode();
-        }
-
-        public boolean equals(Object obj)
-        {
-            return _uri.equals(obj);
-        }
-    }
-
-    public IContextInformation[] computeContextInformation(ITextViewer viewer,
-            int offset)
-    {
-        return null;
-    }
-
-    public char[] getCompletionProposalAutoActivationCharacters()
-    {
-        return null;
-    }
-
-    public char[] getContextInformationAutoActivationCharacters()
-    {
-        return null;
-    }
-
-    public IContextInformationValidator getContextInformationValidator()
-    {
-        return null;
-    }
-
-    public String getErrorMessage()
-    {
-        return null;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.ui/src/org/eclipse/jst/jsf/facelet/ui/internal/facet/FaceletChangePage.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.ui/src/org/eclipse/jst/jsf/facelet/ui/internal/facet/FaceletChangePage.java
deleted file mode 100644
index 24996aa..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.ui/src/org/eclipse/jst/jsf/facelet/ui/internal/facet/FaceletChangePage.java
+++ /dev/null
@@ -1,163 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facelet.ui.internal.facet;
-
-import org.eclipse.core.databinding.DataBindingContext;
-import org.eclipse.core.databinding.beans.BeansObservables;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.jface.databinding.swt.SWTObservables;
-import org.eclipse.jst.jsf.facelet.core.internal.facet.ChangeActionType;
-import org.eclipse.jst.jsf.facelet.core.internal.facet.FacetChangeModel;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.RowData;
-import org.eclipse.swt.layout.RowLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.wst.common.project.facet.ui.AbstractFacetWizardPage;
-
-/**
- * A common facet change UI page, mainly used for facet install/uninstall.
- * 
- * @author cbateman
- *
- */
-public abstract class FaceletChangePage extends AbstractFacetWizardPage
-{
-    private Button             _chgDefaultSuffix;
-    private Button             _chgViewHandler;
-    private Button             _chgConfigureListener;
-    private Button             _chgWebappLifecycleListener;
-
-    private DataBindingContext _bindingContext;
-    private FacetChangeModel _dataModel;
-
-    /**
-     * @param name
-     */
-    public FaceletChangePage(String name)
-    {
-        super(name);
-    }
-
-    public void setConfig(final Object config)
-    {
-        _dataModel = (FacetChangeModel) config;
-    }
-
-    /**
-     * @return the name of the change based on the actionType enumeration.
-     */
-    protected String getTextForChangeType()
-    {
-        final ChangeActionType actionType = _dataModel.getChangeActionType();
-
-        switch (actionType)
-        {
-            case ADD:
-                return "Add";
-
-            case REMOVE:
-                return "Remove";
-        }
-
-        return "*ERROR*";
-    }
-
-    private void initDefaultSuffixButton(final Composite parent)
-    {
-        _chgDefaultSuffix = new Button(parent, SWT.CHECK);
-        _chgDefaultSuffix.setText(getTextForChangeType() + " '.xhtml' DEFAULT_SUFFIX parameter");
-        _chgDefaultSuffix.setSelection(_dataModel.isChgDefaultSuffix());
-        _chgDefaultSuffix.setLayoutData(new RowData());
-        IObservableValue modelObservable = BeansObservables.observeValue(
-                _dataModel, "chgDefaultSuffix");
-
-        _bindingContext.bindValue(SWTObservables
-                .observeSelection(_chgDefaultSuffix), modelObservable, null,
-                null);
-    }
-
-    private void initViewHandlerButton(final Composite parent)
-    {
-        _chgViewHandler = new Button(parent, SWT.CHECK);
-        _chgViewHandler.setText(getTextForChangeType() + " Facelet view handler");
-        _chgViewHandler.setSelection(_dataModel.isChgViewHandler());
-        _chgViewHandler.setLayoutData(new RowData());
-        IObservableValue modelObservable = BeansObservables.observeValue(
-                _dataModel, "chgViewHandler");
-
-        _bindingContext
-                .bindValue(SWTObservables.observeSelection(_chgViewHandler),
-                        modelObservable, null, null);
-    }
-
-    private void initConfigureListener(final Composite parent)
-    {
-        _chgConfigureListener = new Button(parent, SWT.CHECK);
-        _chgConfigureListener
-                .setText(getTextForChangeType() + " configure listener (needed by some Tomcat containers)");
-        _chgConfigureListener.setSelection(_dataModel.isChgConfigureListener());
-        _chgConfigureListener.setLayoutData(new RowData());
-        IObservableValue modelObservable = BeansObservables.observeValue(
-                _dataModel, "chgConfigureListener");
-
-        _bindingContext.bindValue(SWTObservables
-                .observeSelection(_chgConfigureListener), modelObservable,
-                null, null);
-    }
-
-    private void initWebappLifecycleListener(final Composite parent)
-    {
-        _chgWebappLifecycleListener = new Button(parent, SWT.CHECK);
-        _chgWebappLifecycleListener
-                .setText(getTextForChangeType() + " web application lifecycle listener (needed by some Tomcat containers)");
-        _chgWebappLifecycleListener.setSelection(_dataModel
-                .isChgConfigureListener());
-        _chgWebappLifecycleListener.setLayoutData(new RowData());
-        IObservableValue modelObservable = BeansObservables.observeValue(
-                _dataModel, "chgWebAppLifecycleListener");
-
-        _bindingContext.bindValue(SWTObservables
-                .observeSelection(_chgWebappLifecycleListener),
-                modelObservable, null, null);
-    }
-
-    public void createControl(final Composite parent)
-    {
-        setTitle("Facelet");
-        setMessage("Configure Facelet settings");
-
-        _bindingContext = new DataBindingContext();
-
-        // WizardPageSupport.create(this, _bindingContext);
-
-        final Composite control = new Composite(parent, SWT.NONE);
-        final RowLayout rowLayout = new RowLayout(SWT.VERTICAL);
-        rowLayout.fill = true;
-        control.setLayout(rowLayout);
-
-        final Group webXMLGroup = new Group(control, SWT.NONE);
-        webXMLGroup.setLayout(rowLayout);
-        webXMLGroup.setText("Deployment Descriptor (web.xml) Configuration");
-        initDefaultSuffixButton(webXMLGroup);
-        initConfigureListener(webXMLGroup);
-        initWebappLifecycleListener(webXMLGroup);
-
-        final Group facesConfigGroup = new Group(control, SWT.NONE);
-        facesConfigGroup.setLayout(rowLayout);
-        facesConfigGroup
-                .setText("Application (faces-config.xml) Configuration");
-        initViewHandlerButton(facesConfigGroup);
-
-        setControl(control);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.ui/src/org/eclipse/jst/jsf/facelet/ui/internal/facet/FaceletInstallPage.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.ui/src/org/eclipse/jst/jsf/facelet/ui/internal/facet/FaceletInstallPage.java
deleted file mode 100644
index 2ef2c5c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.ui/src/org/eclipse/jst/jsf/facelet/ui/internal/facet/FaceletInstallPage.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package org.eclipse.jst.jsf.facelet.ui.internal.facet;
-
-
-/**
- * The UI page for installing the Facelet facet.
- * @author cbateman
- *
- */
-public class FaceletInstallPage extends FaceletChangePage
-{
-    /**
-     * 
-     */
-    public FaceletInstallPage()
-    {
-        super("Facelet Install Page");
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.ui/src/org/eclipse/jst/jsf/facelet/ui/internal/facet/FaceletUninstallPage.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.ui/src/org/eclipse/jst/jsf/facelet/ui/internal/facet/FaceletUninstallPage.java
deleted file mode 100644
index f0e0c2f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.ui/src/org/eclipse/jst/jsf/facelet/ui/internal/facet/FaceletUninstallPage.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.facelet.ui.internal.facet;
-
-/**
- * The uninstall page for the Facelet facet.
- * 
- * @author cbateman
- *
- */
-public class FaceletUninstallPage extends FaceletChangePage
-{
-    /**
-     * 
-     */
-    public FaceletUninstallPage()
-    {
-        super("Facelet Uninstall Page");
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.ui/src/org/eclipse/jst/jsf/facelet/ui/internal/hover/FaceletHover.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.ui/src/org/eclipse/jst/jsf/facelet/ui/internal/hover/FaceletHover.java
deleted file mode 100644
index 9fe5821..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.ui/src/org/eclipse/jst/jsf/facelet/ui/internal/hover/FaceletHover.java
+++ /dev/null
@@ -1,143 +0,0 @@
-package org.eclipse.jst.jsf.facelet.ui.internal.hover;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jface.text.IRegion;
-import org.eclipse.jface.text.ITextHover;
-import org.eclipse.jface.text.ITextViewer;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IStructuredDocumentContextResolverFactory;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IWorkspaceContextResolver;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.internal.ITextRegionContextResolver;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContextFactory;
-import org.eclipse.jst.jsf.facelet.core.internal.cm.FaceletDocumentFactory;
-import org.eclipse.jst.jsf.ui.internal.jspeditor.JSFELHover;
-import org.eclipse.wst.html.ui.internal.taginfo.HTMLTagInfoHoverProcessor;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
-import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * The text hover for Facelets in html documents.
- * 
- * @author cbateman
- *
- */
-public class FaceletHover implements ITextHover
-{
-    private IProject                  _project;
-    private JSFELHover                _elHover;
-    private HTMLTagInfoHoverProcessor _htmlHoverProcessor;
-
-    /**
-     * 
-     */
-    public FaceletHover()
-    {
-        _elHover = new JSFELHover();
-        _htmlHoverProcessor = new MyHTMLTagInfoHoverProcessor();
-    }
-
-    public String getHoverInfo(ITextViewer textViewer, IRegion hoverRegion)
-    {
-        final IStructuredDocumentContext context = IStructuredDocumentContextFactory.INSTANCE
-                .getContext(textViewer, hoverRegion.getOffset());
-        String info = null;
-        if (isInAttributeValue(context))
-        {
-            info = _elHover.getHoverInfo(textViewer, hoverRegion);
-        }
-
-        if (info == null)
-        {
-            if (context != null)
-            {
-                _project = getProject(context);
-            }
-
-            info = _htmlHoverProcessor.getHoverInfo(textViewer, hoverRegion);
-        }
-
-        return info;
-    }
-
-    public IRegion getHoverRegion(ITextViewer textViewer, int offset)
-    {
-        IRegion region = null;
-        final IStructuredDocumentContext context = IStructuredDocumentContextFactory.INSTANCE
-                .getContext(textViewer, offset);
-
-        // if we are in an attribute value, try to get a region from the
-        // el hover first
-        if (context != null)
-        {
-            if (isInAttributeValue(context))
-            {
-                region = _elHover.getHoverRegion(textViewer, offset);
-            }
-        }
-
-        if (region == null)
-        {
-            if (context != null)
-            {
-                _project = getProject(context);
-            }
-            region = _htmlHoverProcessor.getHoverRegion(textViewer, offset);
-        }
-
-        return region;
-    }
-
-    private boolean isInAttributeValue(final IStructuredDocumentContext context)
-    {
-        final ITextRegionContextResolver resolver = IStructuredDocumentContextResolverFactory.INSTANCE
-                .getTextRegionResolver(context);
-        final String regionType = resolver.getRegionType();
-        if (regionType != null
-                && (regionType == DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE || resolver
-                        .matchesRelative(new String[]
-                        { DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE })))
-        {
-            return true;
-        }
-
-        return false;
-    }
-
-    private IProject getProject(final IStructuredDocumentContext context)
-    {
-        final IWorkspaceContextResolver resolver = IStructuredDocumentContextResolverFactory.INSTANCE
-                .getWorkspaceContextResolver(context);
-
-        if (resolver != null)
-        {
-            return resolver.getProject();
-        }
-        return null;
-    }
-
-    private class MyHTMLTagInfoHoverProcessor extends HTMLTagInfoHoverProcessor
-    {
-        @Override
-        protected CMElementDeclaration getCMElementDeclaration(Node node)
-        {
-            if (_project != null && node.getNodeType() == Node.ELEMENT_NODE
-                    && node.getPrefix() != null)
-            {
-                final Element element = (Element) node;
-                final FaceletDocumentFactory factory = new FaceletDocumentFactory(_project);
-
-                final CMElementDeclaration elementDecl = factory
-                        .createCMElementDeclaration(element);
-
-                if (elementDecl != null)
-                {
-                    return elementDecl;
-                }
-            }
-
-            return super.getCMElementDeclaration(node);
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.ui/src/org/eclipse/jst/jsf/facelet/ui/internal/htmleditor/FaceletELHyperlinkDetector.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.ui/src/org/eclipse/jst/jsf/facelet/ui/internal/htmleditor/FaceletELHyperlinkDetector.java
deleted file mode 100644
index 703eeee..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.ui/src/org/eclipse/jst/jsf/facelet/ui/internal/htmleditor/FaceletELHyperlinkDetector.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facelet.ui.internal.htmleditor;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IStructuredDocumentContextResolverFactory;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IWorkspaceContextResolver;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.jst.jsf.ui.internal.jspeditor.AbstractELHyperlinkDetector;
-
-/**
- * This HyperlinkDetector creates hyperlinks for symbols in JSF EL expressions
- * inside facelet files.
- */
-public class FaceletELHyperlinkDetector extends AbstractELHyperlinkDetector {
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.ui.internal.jspeditor.AbstractELHyperlinkDetector#isEnabled(org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext)
-	 */
-	@Override
-	protected boolean isEnabled(IStructuredDocumentContext context) {
-		boolean enabled = false;
-		if (context != null) {
-			IWorkspaceContextResolver resolver =
-				IStructuredDocumentContextResolverFactory.INSTANCE.getWorkspaceContextResolver(context);
-			if (resolver != null) {
-				IResource resource = resolver.getResource();
-				if (resource instanceof IFile) {
-					IFile file = (IFile)resource;
-					String filename = file.getFullPath().toString();
-					enabled =
-						hasContentType(filename, "jsf.facelet") || //$NON-NLS-1$
-						hasContentType(filename, "jsf.facelet.composite"); //$NON-NLS-1$
-				}
-			}
-		}
-		return enabled;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.ui/src/org/eclipse/jst/jsf/facelet/ui/internal/validation/HTMLValidator.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.ui/src/org/eclipse/jst/jsf/facelet/ui/internal/validation/HTMLValidator.java
deleted file mode 100644
index b3df148..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.ui/src/org/eclipse/jst/jsf/facelet/ui/internal/validation/HTMLValidator.java
+++ /dev/null
@@ -1,280 +0,0 @@
-package org.eclipse.jst.jsf.facelet.ui.internal.validation;
-
-import java.io.IOException;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Set;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.content.IContentType;
-import org.eclipse.core.runtime.content.IContentTypeManager;
-import org.eclipse.core.runtime.jobs.ISchedulingRule;
-import org.eclipse.emf.common.util.Diagnostic;
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.Namespace;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IDOMContextResolver;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IStructuredDocumentContextResolverFactory;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContextFactory;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.designtime.internal.view.model.ITagRegistry;
-import org.eclipse.jst.jsf.facelet.core.internal.util.ViewUtil;
-import org.eclipse.jst.jsf.facelet.ui.internal.FaceletUiPlugin;
-import org.eclipse.jst.jsf.validation.internal.IJSFViewValidator;
-import org.eclipse.jst.jsf.validation.internal.JSFValidatorFactory;
-import org.eclipse.jst.jsf.validation.internal.ValidationPreferences;
-import org.eclipse.jst.jsf.validation.internal.facelet.FaceletDiagnosticFactory;
-import org.eclipse.wst.sse.core.StructuredModelManager;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
-import org.eclipse.wst.validation.AbstractValidator;
-import org.eclipse.wst.validation.ValidationResult;
-import org.eclipse.wst.validation.ValidationState;
-import org.eclipse.wst.validation.internal.core.ValidationException;
-import org.eclipse.wst.validation.internal.operations.LocalizedMessage;
-import org.eclipse.wst.validation.internal.provisional.core.IMessage;
-import org.eclipse.wst.validation.internal.provisional.core.IReporter;
-import org.eclipse.wst.validation.internal.provisional.core.IValidationContext;
-import org.eclipse.wst.validation.internal.provisional.core.IValidator;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMAttr;
-import org.w3c.dom.Attr;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-
-/**
- * The Facelet HTML file validator.
- * 
- * @author cbateman
- *
- */
-public class HTMLValidator extends AbstractValidator implements IValidator
-{
-	private FaceletDiagnosticFactory _diagnosticFactory = new FaceletDiagnosticFactory();
-    /**
-     * @param helper
-     * @return no rule, null
-     */
-    public ISchedulingRule getSchedulingRule(final IValidationContext helper)
-    {
-        // no rule...
-        return null;
-    }
-
-    /**
-     * @param helper
-     * @param reporter
-     * @return status of this validation
-     * @throws ValidationException
-     */
-    public IStatus validateInJob(final IValidationContext helper,
-            final IReporter reporter) throws ValidationException
-    {
-        IStatus status = Status.OK_STATUS;
-        try
-        {
-            validate(helper, reporter);
-        }
-        catch (final ValidationException e)
-        {
-            status = new Status(IStatus.ERROR, FaceletUiPlugin.PLUGIN_ID,
-                    IStatus.ERROR, e.getLocalizedMessage(), e);
-        }
-        return status;
-
-    }
-
-    public void cleanup(final IReporter reporter)
-    {
-        // do nothing
-    }
-
-    @Override
-	public ValidationResult validate(IResource resource, int kind, ValidationState state, IProgressMonitor monitor){
-		ValidationResult vr = new ValidationResult();
-		if (resource == null || !(resource instanceof IFile)) {
-			return vr;
-		}
-		IFile currentFile = (IFile) resource;
-        if (shouldValidate(currentFile)) {
-            validateFile(currentFile, vr.getReporter(monitor));
-        }
-		return vr;
-	}
-
-    public void validate(final IValidationContext helper,
-            final IReporter reporter) throws ValidationException
-    {
-        final String[] uris = helper.getURIs();
-        final IWorkspaceRoot wsRoot = ResourcesPlugin.getWorkspace().getRoot();
-        if (uris.length > 0)
-        {
-            IFile currentFile = null;
-
-            for (int i = 0; i < uris.length && !reporter.isCancelled(); i++)
-            {
-                currentFile = wsRoot.getFile(new Path(uris[i]));
-                if (currentFile != null && currentFile.exists())
-                {
-                    if (shouldValidate(currentFile))
-                    {
-                        final int percent = (i * 100) / uris.length + 1;
-                        final IMessage message = new LocalizedMessage(
-                                IMessage.LOW_SEVERITY, percent + "% " + uris[i]);
-                        reporter.displaySubtask(this, message);
-
-                        validateFile(currentFile, reporter);
-                    }
-                }
-            }
-        }
-
-    }
-
-    private void validateFile(final IFile file, final IReporter reporter)
-    {
-        final IJSFViewValidator validator = JSFValidatorFactory
-                .createDefaultXMLValidator();
-        final ValidationPreferences prefs = new ValidationPreferences(
-                JSFCorePlugin.getDefault().getPreferenceStore());
-        prefs.load();
-
-        IStructuredModel model = null;
-        try
-        {
-            model = StructuredModelManager.getModelManager().getModelForRead(
-                    file);
-
-            final ValidationReporter jsfReporter = new ValidationReporter(this,
-                    reporter, file, prefs, model);
-            validator.validateView(file, jsfReporter);
-            // TODO: break off into composite strategies
-            validateFaceletHtml(file, jsfReporter);
-        }
-        catch (final CoreException e)
-        {
-            JSFCorePlugin.log("Error validating JSF", e);
-        }
-        catch (final IOException e)
-        {
-            JSFCorePlugin.log("Error validating JSF", e);
-        }
-        finally
-        {
-            if (null != model)
-            {
-                model.releaseFromRead();
-            }
-        }
-    }
-
-    private void validateFaceletHtml(final IFile file,
-            final ValidationReporter reporter)
-    {
-        IStructuredModel model = null;
-        try
-        {
-            model = StructuredModelManager.getModelManager().getModelForRead(
-                    file);
-
-            final IStructuredDocument structuredDoc = model
-                    .getStructuredDocument();
-
-            validateDocument(structuredDoc, reporter, file.getProject());
-        }
-        catch (final CoreException e)
-        {
-            JSFCorePlugin.log("Error validating JSF", e);
-        }
-        catch (final IOException e)
-        {
-            JSFCorePlugin.log("Error validating JSF", e);
-        }
-        finally
-        {
-            if (null != model)
-            {
-                model.releaseFromRead();
-            }
-        }
-    }
-
-    private void validateDocument(IStructuredDocument structuredDoc,
-            final ValidationReporter reporter, IProject project)
-    {
-        validateRoot(structuredDoc, reporter, project);
-    }
-
-    private void validateRoot(IStructuredDocument structuredDoc,
-            ValidationReporter reporter, IProject project)
-    {
-        final IStructuredDocumentContext context = IStructuredDocumentContextFactory.INSTANCE
-                .getContext(structuredDoc, -1);
-        final IDOMContextResolver resolver = IStructuredDocumentContextResolverFactory.INSTANCE
-                .getDOMContextResolver(context);
-        final Document document = resolver.getDOMDocument();
-        Element rootElement = document.getDocumentElement();
-
-        if ("html".equals(rootElement.getNodeName()))
-        {
-            final Set<Attr> declaredNamespaces = ViewUtil
-                    .getDeclaredNamespaces(rootElement.getAttributes());
-            final ITagRegistry tagRegistry = ViewUtil
-                    .getHtmlTagRegistry(project);
-            final Collection<? extends Namespace> namespaces;
-            if (tagRegistry != null)
-            {
-                namespaces = tagRegistry.getAllTagLibraries();
-            }
-            else
-            {
-                // unexpected
-                namespaces = Collections.EMPTY_SET;
-                JSFCorePlugin.log(IStatus.ERROR, "Program Error: HTML tag registry not found"); //$NON-NLS-1$
-            }
-
-            for (final Attr attr : declaredNamespaces)
-            {
-                // only validate prefix declarations
-                if (attr.getPrefix() != null && attr instanceof IDOMAttr)
-                {
-                    final String declaredUri = attr.getValue();
-                    String findUri = null;
-                    SEARCH_NAMESPACES: for (final Namespace ns : namespaces)
-                    {
-                        if (ns.getNSUri().equals(declaredUri))
-                        {
-                            findUri = ns.getNSUri();
-                            break SEARCH_NAMESPACES;
-                        }
-                    }
-
-                    if (findUri == null)
-                    {
-                        final Diagnostic diag = _diagnosticFactory.create_CANNOT_FIND_FACELET_TAGLIB(declaredUri);
-                        final IDOMAttr domAttr = (IDOMAttr) attr;
-                        reporter.report(diag, domAttr.getValueRegionStartOffset(), domAttr
-                                .getValue().length());
-                    }
-                }
-            }
-        }
-    }
-    
-    private boolean shouldValidate(final IFile model)
-    {
-        final IContentTypeManager manager = Platform.getContentTypeManager();
-        final IContentType contentType = manager
-                .getContentType("org.eclipse.wst.html.core.htmlsource");
-        return (contentType.isAssociatedWith(model.getName()))
-                && ViewUtil.isFaceletVDLFile(model);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.ui/src/org/eclipse/jst/jsf/facelet/ui/internal/validation/ValidationReporter.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.ui/src/org/eclipse/jst/jsf/facelet/ui/internal/validation/ValidationReporter.java
deleted file mode 100644
index 2e87e82..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.ui/src/org/eclipse/jst/jsf/facelet/ui/internal/validation/ValidationReporter.java
+++ /dev/null
@@ -1,69 +0,0 @@
-package org.eclipse.jst.jsf.facelet.ui.internal.validation;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.emf.common.util.Diagnostic;
-import org.eclipse.jst.jsf.ui.internal.validation.ValidationMessageFactory;
-import org.eclipse.jst.jsf.validation.internal.IJSFViewValidator;
-import org.eclipse.jst.jsf.validation.internal.ValidationPreferences;
-import org.eclipse.jst.jsf.validation.internal.strategy.DiagnosticFactory;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.eclipse.wst.validation.internal.provisional.core.IMessage;
-import org.eclipse.wst.validation.internal.provisional.core.IReporter;
-import org.eclipse.wst.validation.internal.provisional.core.IValidator;
-
-/*package*/class ValidationReporter implements
-        IJSFViewValidator.IValidationReporter
-{
-    private final IValidator _validator;
-    private final IReporter _reporter;
-    private final IFile _file;
-    private final ValidationMessageFactory _factory;
-
-    public ValidationReporter(final IValidator validator,
-            final IReporter reporter, final IFile file,
-            final ValidationPreferences prefs, final IStructuredModel model)
-    {
-        _validator = validator;
-        _reporter = reporter;
-        _file = file;
-        _factory = new ValidationMessageFactory(prefs, model);
-    }
-
-    public void report(final Diagnostic problem, final int start,
-            final int length)
-    {
-        if (shouldReportProblem(problem.getCode()))
-        {
-            final IMessage message = _factory.createFromDiagnostic(problem,
-                    start, length, _file);
-            if ((message.getSeverity() & IMessage.ALL_MESSAGES) != 0)
-            {
-                _reporter.addMessage(_validator, message);
-            }
-        }
-    }
-
-    /**
-     * @param problemCode
-     * @return filters out problems to be reported by code
-     */
-    private boolean shouldReportProblem(final int problemCode)
-    {
-        switch (problemCode)
-        {
-            case DiagnosticFactory.CONTAINMENT_ERROR_MISSING_VIEW:
-                return false;
-            default:
-                return true;
-        }
-    }
-
-    public void report(IMessage message)
-    {
-        // not capable of filtering problems by code... should not be used
-        if ((message.getSeverity() & IMessage.ALL_MESSAGES) != 0)
-        {
-            _reporter.addMessage(_validator, message);
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.ui/templates/templates.properties b/jsf/plugins/org.eclipse.jst.jsf.facelet.ui/templates/templates.properties
deleted file mode 100644
index 1b2b72b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.ui/templates/templates.properties
+++ /dev/null
@@ -1,15 +0,0 @@
-New_Facelet_Footer=New Facelet Footer
-New_Footer_Description=Creates a footer for use with the Facelet template.
-
-New_Facelet_Header=New Facelet Header
-New_Facelet_Header_Description=Creates a header for use with the Facelet template
-
-New_Facelet_Template=New Facelet Template
-New_Facelet_Template_Description=Creates a basic header/content/footer Facelet template
-
-New_Simple_Facelet_Composition_Page=New Facelet Composition Page
-New_Simple_Facelet_Composition_Page_Description=Creates a new Facelet page for use with a template.
-New_Facelet_Header.header=<?xml version="1.0" encoding="ISO-8859-1" ?>\n<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\n<html xmlns="http://www.w3.org/1999/xhtml">\n<body>\n<div style="width:100%;font-size:36px;line-height:48px;background-color:navy;color:white">My Facelet Application</div>\n</body>\n</html>\n
-New_Facelet_Footer.footer=<?xml version="1.0" encoding="ISO-8859-1" ?>\n<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\n<html xmlns="http://www.w3.org/1999/xhtml">\n<head>\n<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />\n<title>Insert title here</title>\n</head>\n<body>\n<div style="background-color:navy;width:100%;color:white"></div>\n</body>\n</html>\n
-New_Facelet_Template.template=<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" \n          "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\n<html xmlns="http://www.w3.org/1999/xhtml"\n      xmlns:ui="http://java.sun.com/jsf/facelets">\n<head>\n  <title><ui:insert name="title">Default title</ui:insert></title>\n</head>\n\n<body>\n\n<div id="header">\n    <ui:insert name="header">\n    	Header area.  See comments below this line in the source.\n    	<!--  include your header file or uncomment the include below and create header.xhtml in this directory -->\n    	<!-- <ui:include src="header.xhtml"/> -->\n    </ui:insert>\n</div>\n\n\n<div id="content">\n  <ui:insert name="content">\n    	Content area.  See comments below this line in the source.\n    	<!--  include your content file or uncomment the include below and create content.xhtml in this directory -->\n	  	<!-- <div> -->\n    	<!-- <ui:include src="content.xhtml"/> -->  \n    	<!-- </div> -->\n  </ui:insert>\n</div>\n\n<div id="footer">\n  <ui:insert name="footer">\n    	Footer area.  See comments below this line in the source.\n    	<!--  include your header file or uncomment the include below and create footer.xhtml in this directory -->\n		<!--<ui:include src="footer.xhtml"/>  -->\n  </ui:insert>\n</div>\n\n</body>\n\n</html>\n
-New_Simple_Facelet_Composition_Page.composition=<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" \n    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\n\n<html xmlns="http://www.w3.org/1999/xhtml"\n	xmlns:ui="http://java.sun.com/jsf/facelets"\n	xmlns:h="http://java.sun.com/jsf/html"\n	xmlns:f="http://java.sun.com/jsf/core">\n\n<ui:composition template="">\n	<ui:define name="header">\n	    Add your header here or delete to use the default\n	</ui:define>\n	<ui:define name="content">\n	    Add your content here or delete to use the default\n	</ui:define>\n	<ui:define name="footer">\n	    Add your footer here or delete to use the default\n	</ui:define>\n</ui:composition>\n</html>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.ui/templates/templates.xml b/jsf/plugins/org.eclipse.jst.jsf.facelet.ui/templates/templates.xml
deleted file mode 100644
index c5f4eb1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facelet.ui/templates/templates.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<templates>
-<template id="org.eclipse.jst.jsf.facelet.ui.new_simple_footer_xhtml" autoinsert="false" context="html_new" deleted="false" description="%New_Footer_Description" enabled="true" name="%New_Facelet_Footer">%New_Facelet_Footer.footer</template>
-<template id="org.eclipse.jst.jsf.facelet.ui.new_header_xhtml" autoinsert="false" context="html_new" deleted="false" description="%New_Facelet_Header_Description" enabled="true" name="%New_Facelet_Header">%New_Facelet_Header.header</template>
-<template id="org.eclipse.jst.jsf.facelet.ui.new_basic_template_xhtml" autoinsert="false" context="html_new" deleted="false" description="%New_Facelet_Template_Description" enabled="true" name="%New_Facelet_Template">%New_Facelet_Template.template</template>
-<template id="org.eclipse.jst.jsf.facelet.ui.new_basic_composition_xhtml" autoinsert="false" context="html_new" deleted="false" description="%New_Simple_Facelet_Composition_Page_Description" enabled="true" name="%New_Simple_Facelet_Composition_Page">%New_Simple_Facelet_Composition_Page.composition</template>
-</templates>
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/.classpath b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/.classpath
deleted file mode 100644
index 304e861..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/.cvsignore b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/.cvsignore
deleted file mode 100644
index 40e79ad..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/.cvsignore
+++ /dev/null
@@ -1,3 +0,0 @@
-build.xml
-javaCompiler...args
-@dot
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/.project b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/.project
deleted file mode 100644
index ca987a4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.jst.jsf.facesconfig.ui</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/.settings/org.eclipse.core.resources.prefs b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/.settings/org.eclipse.core.resources.prefs
deleted file mode 100644
index c9896cd..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/.settings/org.eclipse.core.resources.prefs
+++ /dev/null
@@ -1,3 +0,0 @@
-#Sun May 27 16:03:23 EDT 2007
-eclipse.preferences.version=1
-encoding/<project>=ISO-8859-1
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/.settings/org.eclipse.jdt.core.prefs b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 9d11d52..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,82 +0,0 @@
-#Mon Jun 30 15:56:09 PDT 2008
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.5
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.doc.comment.support=enabled
-org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.autoboxing=warning
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=ignore
-org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
-org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
-org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
-org.eclipse.jdt.core.compiler.problem.invalidJavadoc=error
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocComments=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.missingJavadocTags=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=error
-org.eclipse.jdt.core.compiler.problem.nullReference=ignore
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
-org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore
-org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=ignore
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=ignore
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=error
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=error
-org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
-org.eclipse.jdt.core.compiler.problem.unusedLocal=error
-org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
-org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
-org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.5
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/.settings/org.eclipse.jdt.ui.prefs b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644
index 82eb6c1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,3 +0,0 @@
-#Fri Apr 06 18:25:15 PDT 2007
-eclipse.preferences.version=1
-org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8"?><templates/>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/.settings/org.eclipse.pde.prefs b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/.settings/org.eclipse.pde.prefs
deleted file mode 100644
index cd8bbb3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/.settings/org.eclipse.pde.prefs
+++ /dev/null
@@ -1,22 +0,0 @@
-#Fri May 30 11:55:44 PDT 2008
-compilers.f.unresolved-features=1
-compilers.f.unresolved-plugins=1
-compilers.incompatible-environment=1
-compilers.p.build=1
-compilers.p.deprecated=1
-compilers.p.discouraged-class=1
-compilers.p.internal=1
-compilers.p.missing-packages=0
-compilers.p.no-required-att=0
-compilers.p.not-externalized-att=0
-compilers.p.unknown-attribute=1
-compilers.p.unknown-class=1
-compilers.p.unknown-element=1
-compilers.p.unknown-identifier=1
-compilers.p.unknown-resource=1
-compilers.p.unresolved-ex-points=0
-compilers.p.unresolved-import=0
-compilers.s.create-docs=false
-compilers.s.doc-folder=doc
-compilers.s.open-tags=1
-eclipse.preferences.version=1
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/.settings/org.eclipse.wst.validation.prefs b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/.settings/org.eclipse.wst.validation.prefs
deleted file mode 100644
index 97e2fd2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/.settings/org.eclipse.wst.validation.prefs
+++ /dev/null
@@ -1,6 +0,0 @@
-#Tue Apr 25 16:26:29 CST 2006
-DELEGATES_PREFERENCE=delegateValidatorListorg.eclipse.wst.wsdl.validation.internal.eclipse.WSDLDelegatingValidator\=org.eclipse.wst.wsdl.validation.internal.eclipse.Validator;org.eclipse.wst.xsd.core.internal.validation.eclipse.XSDDelegatingValidator\=org.eclipse.wst.xsd.core.internal.validation.eclipse.Validator;
-USER_BUILD_PREFERENCE=enabledBuildValidatorListorg.eclipse.wst.dtd.core.internal.validation.eclipse.Validator;org.eclipse.jst.jsp.core.internal.validation.JSPELValidator;org.eclipse.wst.wsdl.validation.internal.eclipse.WSDLDelegatingValidator;org.eclipse.jst.jsp.core.internal.validation.JSPJavaValidator;org.eclipse.wst.xml.core.internal.validation.eclipse.Validator;org.eclipse.wst.html.internal.validation.HTMLValidator;org.eclipse.wst.wsi.ui.internal.WSIMessageValidator;org.eclipse.jst.jsp.core.internal.validation.JSPDirectiveValidator;org.eclipse.wst.xsd.core.internal.validation.eclipse.XSDDelegatingValidator;
-USER_MANUAL_PREFERENCE=enabledManualValidatorListorg.eclipse.wst.dtd.core.internal.validation.eclipse.Validator;org.eclipse.jst.jsp.core.internal.validation.JSPELValidator;org.eclipse.wst.wsdl.validation.internal.eclipse.WSDLDelegatingValidator;org.eclipse.jst.jsp.core.internal.validation.JSPJavaValidator;org.eclipse.wst.xml.core.internal.validation.eclipse.Validator;org.eclipse.wst.html.internal.validation.HTMLValidator;org.eclipse.wst.wsi.ui.internal.WSIMessageValidator;org.eclipse.jst.jsp.core.internal.validation.JSPDirectiveValidator;org.eclipse.wst.xsd.core.internal.validation.eclipse.XSDDelegatingValidator;
-USER_PREFERENCE=overrideGlobalPreferencesfalse
-eclipse.preferences.version=1
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/META-INF/MANIFEST.MF b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/META-INF/MANIFEST.MF
deleted file mode 100644
index 1868385..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,57 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %plugin.name
-Bundle-SymbolicName: org.eclipse.jst.jsf.facesconfig.ui;singleton:=true
-Bundle-Version: 1.2.0.qualifier
-Bundle-Activator: org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin
-Bundle-Vendor: %plugin.provider
-Bundle-Localization: plugin
-Require-Bundle: org.eclipse.core.runtime;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.jdt.core;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.core.resources;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.core.runtime;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.help;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.gef;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.wst.xml.core;bundle-version="[1.1.0,1.2.0)",
- org.eclipse.wst.sse.core;bundle-version="[1.1.0,1.2.0)",
- org.eclipse.wst.xml.ui;bundle-version="[1.0.100,1.2.0)",
- org.eclipse.emf.ecore.xmi;bundle-version="[2.2.0,3.0.0)",
- org.eclipse.jst.jsp.core;bundle-version="[1.1.0,1.3.0)",
- org.eclipse.wst.sse.ui;bundle-version="[1.0.101,1.3.0)",
- org.eclipse.jface.text;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.wst.common.emf;bundle-version="[1.1.103,2.0.0)",
- org.eclipse.jst.jsf.facesconfig;bundle-version="[1.0.0,2.0.0)",
- org.eclipse.wst.common.project.facet.core;bundle-version="[1.2.0,2.0.0)",
- org.eclipse.emf.edit.ui;bundle-version="[2.2.0,3.0.0)",
- org.eclipse.jst.jsf.common.ui;bundle-version="[1.0.0,2.0.0)",
- org.eclipse.jdt.ui;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.jst.jsf.core;bundle-version="[1.1.0,2.0.0)",
- org.eclipse.ui.ide;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.wst.common.modulecore;bundle-version="[1.1.0,2.0.0)",
- org.eclipse.ui.views.properties.tabbed;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.jst.jsf.common;bundle-version="[1.0.0,2.0.0)"
-Bundle-ActivationPolicy: lazy
-Export-Package: org.eclipse.jst.jsf.facesconfig.ui;x-internal:=true,
- org.eclipse.jst.jsf.facesconfig.ui.dialog;x-internal:=true,
- org.eclipse.jst.jsf.facesconfig.ui.page;x-internal:=true,
- org.eclipse.jst.jsf.facesconfig.ui.page.detail;x-internal:=true,
- org.eclipse.jst.jsf.facesconfig.ui.pageflow;x-internal:=true,
- org.eclipse.jst.jsf.facesconfig.ui.pageflow.action;x-internal:=true,
- org.eclipse.jst.jsf.facesconfig.ui.pageflow.action.icons;x-internal:=true,
- org.eclipse.jst.jsf.facesconfig.ui.pageflow.command;x-internal:=true,
- org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart;x-internal:=true,
- org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpolicy;x-internal:=true,
- org.eclipse.jst.jsf.facesconfig.ui.pageflow.figure;x-internal:=true,
- org.eclipse.jst.jsf.facesconfig.ui.pageflow.layout;x-internal:=true,
- org.eclipse.jst.jsf.facesconfig.ui.pageflow.model;x-internal:=true,
- org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl;x-internal:=true,
- org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties;x-internal:=true,
- org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties.section;x-internal:=true,
- org.eclipse.jst.jsf.facesconfig.ui.pageflow.synchronization;x-internal:=true,
- org.eclipse.jst.jsf.facesconfig.ui.pageflow.util;x-internal:=true,
- org.eclipse.jst.jsf.facesconfig.ui.preference;x-internal:=true,
- org.eclipse.jst.jsf.facesconfig.ui.provider;x-internal:=true,
- org.eclipse.jst.jsf.facesconfig.ui.section;x-internal:=true,
- org.eclipse.jst.jsf.facesconfig.ui.util;x-internal:=true,
- org.eclipse.jst.jsf.facesconfig.ui.wizard;x-internal:=true
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/about.html b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/about.html
deleted file mode 100644
index 8e56059..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/about.html
+++ /dev/null
@@ -1,22 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<head>
-<title>About</title>
-<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>June, 2008</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise indicated below, the Content is provided to you under the terms and conditions of the
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content.</p>
-
-</body>
-</html>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/build.properties b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/build.properties
deleted file mode 100644
index e34e43f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/build.properties
+++ /dev/null
@@ -1,21 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               .,\
-               icons/,\
-               plugin.xml,\
-               plugin.properties,\
-               cheatsheets/,\
-               about.html
-javacSource=1.5
-javacTarget=1.5
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/cheatsheets/facesconfigeditor.xml b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/cheatsheets/facesconfigeditor.xml
deleted file mode 100644
index aed958f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/cheatsheets/facesconfigeditor.xml
+++ /dev/null
@@ -1,276 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<cheatsheet title="Faces Configuration Editor">
-
-	<intro
-		href="/org.eclipse.platform.doc.user/reference/ref-cheatsheets.htm">
-		<description>
-			This cheat sheet will demonstrate how to edit a JSF
-			configuration file with Faces Config Editor.
-			<br />
-			<br />
-			To learn more about using cheat sheets, click the help
-			button in the top right corner (?).
-		</description>
-	</intro>
-
-	<!-- Item -->
-
-	<item title="Open the J2EE perspective"
-		href="/org.eclipse.jst.j2ee.doc.user/topics/cjpers.html"
-		dialog="false" skip="true">
-		<description>
-			To open the J2EE perspective, select
-			<b>Window-&gt;Open Perspective-&gt;Other...</b>
-			and choose
-			<b>J2EE</b>
-			.
-			<br />
-			<br />
-			Alternatively, click the following button to perform the
-			task.
-		</description>
-		<command
-			serialization="org.eclipse.ui.perspectives.showPerspective(org.eclipse.ui.perspectives.showPerspective.perspectiveId=org.eclipse.jst.j2ee.J2EEPerspective)" />
-	</item>
-
-	<!-- Item -->
-
-	<item title="Create the JSF web project"
-		href="/org.eclipse.jst.jsf.doc.user/html/tasks/create_jsf_app.html"
-		dialog="true" skip="false">
-		<description>
-			To create the JSF web application perform the following
-			steps
-		</description>
-		<subitem
-			label="Select &quot;File-&gt;New-&gt;Project...&quot; from the main menu and choose &quot;Dynamic Web Project&quot; from the resulting &quot;New Project&quot; dialog box"
-			skip="false">
-			<command
-				serialization="org.eclipse.ui.newWizard(newWizardId=org.eclipse.jst.servlet.ui.project.facet.WebProjectWizard)" />
-		</subitem>
-		<subitem
-			label="Input &quot;JSFApplication&quot; into the &quot;Project Name&quot; text box"
-			skip="false" />
-		<subitem
-			label="Select &quot;JavaServer Faces v1.1 Project&quot; in the &quot;Configurations&quot; dropdown box"
-			skip="false" />
-		<subitem
-			label="Accept the rest of the default preloaded values on the &quot;Dynamic Web Project&quot; page and click &quot;Next&quot;"
-			skip="false" />
-		<subitem
-			label="Accept the rest of the default preloaded values on the &quot;Project Facets&quot; page and click &quot;Next&quot;"
-			skip="false" />
-		<subitem
-			label="Accept the rest of the default preloaded values on the &quot;Web Module&quot; page and click &quot;Next&quot;"
-			skip="false" />
-		<subitem
-			label="Specify JSF Facet Settings on the &quot;JSF Capabilities&quot; page and click &quot;Finish&quot;"
-			skip="false" />
-	</item>
-
-	<item title="Open the JSF configuration file"
-		href="/org.eclipse.jst.jsf.doc.user/html/tasks/use_facesconfig_editor.html"
-		dialog="true" skip="false">
-		<description>
-			To open the JSF configuration file, Expand the
-			WebContent/WEB-INF/ folder in the &quot;Project
-			Explorer&quot; view; Double click on the
-			&quot;faces-config.xml&quot; file to open it. Or right click
-			on it then select &quot;Open With&quot; -> &quot;FacesConfig
-			Editor&quot;
-		</description>
-		<subitem
-			label="Expand the /JSFApplication/WebContent/WEB-INF/ folder in the &quot;Project Explorer&quot; view; "
-			skip="true">
-		</subitem>
-		<subitem
-			label="Double click on the &quot;faces-config.xml&quot; file to open it.
-			Or right click on it then select &quot;Open With&quot; -> &quot;FacesConfig Editor&quot;"
-			skip="false">
-			<command
-				serialization="org.eclipse.ui.navigate.openResource(filePath=JSFApplication/WebContent/WEB-INF/faces-config.xml)" />
-		</subitem>
-	</item>
-
-
-	<item href=" " title="Get an introduction on the FacesConfig Editor"
-		dialog="false" skip="true">
-		<description>
-			On the &quot;Introduction &quot; page, there are some
-			introductions about the FacesConfig Editor, and some links
-			to start work with it, or show user the tutorial and help
-			documentation.
-		</description>
-	</item>
-
-
-	<item href=" " title="Get an overview of the content" dialog="false"
-		skip="true">
-		<description>
-			On the &quot;Overview &quot; page, there are several tables
-			that list the main elements defined in the current faces
-			config file. By double-clicking on an element, user could be
-			guided to the corresponding page to edit it.
-		</description>
-	</item>
-
-	<item
-		href="/org.eclipse.jst.jsf.doc.user/html/tasks/define_navigations.html"
-		title="Create a Navigation Rule">
-		<description>
-			To create a navigation rule perform the following steps
-		</description>
-		<subitem
-			label="Use the JSP Page wizard to create a page called &quot; login.jsp &quot; in the Web Content folder of the new application. 
-			In the Select Templates page of the wizard, select the &quot;New JSP(html) &quot; template. Click Finish."
-			skip="false">
-			<command
-				serialization="org.eclipse.ui.newWizard(newWizardId=org.eclipse.jst.jsp.ui.internal.wizard.NewJSPWizard)" />
-		</subitem>
-		<subitem
-			label="In the same way, create a page called &quot;welcome.jsp &quot; ."
-			skip="false">
-			<command
-				serialization="org.eclipse.ui.newWizard(newWizardId=org.eclipse.jst.jsp.ui.internal.wizard.NewJSPWizard)" />
-		</subitem>
-		<subitem
-			label="Select the &quot;Page&quot; control from the &quot;Palette&quot; and drop it on the &quot;Navigation&quot; tab. 
-			Choose the page in the resulting &quot;Select JSP File&quot; dialog. "
-			skip="false" />
-		<subitem
-			label="Connect the two pages. Click on the &quot;Link&quot; control in the &quot;Palette&quot;, select the &quot;login&quot; page and draw a line to the &quot;welcome&quot; page. 
-			Select the line in the &quot;Navigation&quot; tab and in the property view, set the value of the &quot;from-outcome&quot; to &quot;login&quot; . "
-			skip="false" />
-		<subitem
-			label="Swith to the &quot;Source&quot; page, will find that there is a navigation-rule element created."
-			skip="false" />
-	</item>
-
-	<item
-		href="/org.eclipse.jst.jsf.doc.user/html/tasks/create_managedbean.html"
-		title="Create a Managed Bean">
-		<description>
-			To create a managed bean perform the following steps
-		</description>
-		<subitem
-			label="Switch to the &quot;ManagedBean&quot; page; click the &quot;New&quot; button, the new managed bean wizard pops up."
-			skip="false" />
-		<subitem
-			label="On the &quot;Java Class Selection&quot; page, choose &quot;Create a new Java class&quot;, then click &quot;Next&quot;."
-			skip="false" />
-		<subitem
-			label="On the &quot;Java Class&quot; page, input &quot;com.tutorial&quot; into the &quot;Package&quot; field and input &quot;LoginBean&quot; into the &quot;Name&quot; field, 
-			then click &quot;Next&quot; to the next page."
-			skip="false" />
-		<subitem
-			label="On the &quot;Managed Bean Configuration&quot; page, accept the default values and click &quot;Finish&quot; to finish this wizard."
-			skip="false" />
-		<subitem
-			label="Swith to the &quot;Source&quot; page, will find that there is a managed-bean element created."
-			skip="true" />
-	</item>
-
-	<item
-		href="/org.eclipse.jst.jsf.doc.user/html/tasks/facesconfig_ui/add_component.html"
-		title="Create a Component">
-		<description>
-			To create a component perform the following steps
-		</description>
-		<subitem
-			label="Switch to the &quot;Component&quot; page; expand the &quot;Components&quot; section; "
-			skip="false" />
-		<subitem
-			label="Click the &quot;New&quot; button, a new empty component element is created."
-			skip="false" />
-		<subitem
-			label="On the right part, fill in the essential fields for this component, for example &quot;Component Type&quot;, &quot;Component Class&quot;."
-			skip="false" />
-		<subitem
-			label="Swith to the &quot;Source&quot; page, will find that there is a component element created."
-			skip="false" />
-	</item>
-
-
-	<item
-		href="/org.eclipse.jst.jsf.doc.user/html/tasks/facesconfig_ui/add_converter.html"
-		title="Create a Converter">
-		<description>
-			To create a converter perform the following steps
-		</description>
-		<subitem
-			label="Switch to the &quot;Component&quot; page; expand the &quot;Converters&quot; section; "
-			skip="false" />
-		<subitem
-			label="Click the &quot;New&quot; button, a new empty converter element is created."
-			skip="false" />
-		<subitem
-			label="On the right part, fill in the essential fields for this converter, for example &quot;Converter ID&quot;, &quot;Converter Class&quot;."
-			skip="false" />
-		<subitem
-			label="Swith to the &quot;Source&quot; page, will find that there is a converter element created."
-			skip="false" />
-	</item>
-
-	<item
-		href="/org.eclipse.jst.jsf.doc.user/html/tasks/facesconfig_ui/add_renderkit.html"
-		title="Create a Render Kit">
-		<description>
-			To create a render-kit perform the following steps
-		</description>
-		<subitem
-			label="Switch to the &quot;Component&quot; page; expand the &quot;RenderKits&quot; section; "
-			skip="false" />
-		<subitem
-			label="Click the &quot;New&quot; button, a new empty render-kit element is created."
-			skip="false" />
-		<subitem
-			label="On the right part, fill in the essential fields for this converter, for example &quot;Renderkit ID&quot;, &quot;Renderkit Class&quot;."
-			skip="false" />
-		<subitem
-			label="Swith to the &quot;Source&quot; page, will find that there is a render-kit element created."
-			skip="false" />
-	</item>
-
-	<item
-		href="/org.eclipse.jst.jsf.doc.user/html/tasks/facesconfig_ui/add_validator.html"
-		title="Create a Validator">
-		<description>
-			To create a validator perform the following steps
-		</description>
-		<subitem
-			label="Switch to the &quot;Component&quot; page; expand the &quot;Validators&quot; section; "
-			skip="false" />
-		<subitem
-			label="Click the &quot;New&quot; button, a new empty validator element is created."
-			skip="false" />
-		<subitem
-			label="On the right part, fill in the essential fields for this converter, for example &quot;Validator ID&quot;, &quot;Validator Class&quot;."
-			skip="false" />
-		<subitem
-			label="Swith to the &quot;Source&quot; page, will find that there is a validator element created."
-			skip="false" />
-	</item>
-
-	<item
-		href="/org.eclipse.jst.jsf.doc.user/html/tasks/use_facesconfig_editor.html"
-		title="Editing other elements on the Others Page">
-		<description>
-			On the &quot;Others&quot; page, there are several sections
-			for editing the elements such as
-			&quot;action-listener&quot;, &quot;locale-config&quot;, and
-			so on.
-		</description>
-	</item>
-
-	<item title="Source Page">
-		<description>
-		   The &quot;Source&quot; page is a embeded XML editor, user can edit the xml source of faces config directly here.
-		</description>
-	</item>
-
-	<item title="Completion">
-		<description>
-			Congratulations, you should now be able to use this editor fluently.
-		</description>
-	</item>
-</cheatsheet>
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/FacesConfig_GotoEditor.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/FacesConfig_GotoEditor.gif
deleted file mode 100644
index 0e5bcf6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/FacesConfig_GotoEditor.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/FacesConfig_Introduction.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/FacesConfig_Introduction.gif
deleted file mode 100644
index 44cd044..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/FacesConfig_Introduction.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/FacesConfig_Tutorial.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/FacesConfig_Tutorial.gif
deleted file mode 100644
index ad8e5b6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/FacesConfig_Tutorial.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/Scope.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/Scope.gif
deleted file mode 100644
index d49078b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/Scope.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/Scope_Application.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/Scope_Application.gif
deleted file mode 100644
index 591ceb2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/Scope_Application.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/Scope_None.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/Scope_None.gif
deleted file mode 100644
index 0a96aaa..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/Scope_None.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/Scope_Request.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/Scope_Request.gif
deleted file mode 100644
index e875d01..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/Scope_Request.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/Scope_Session.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/Scope_Session.gif
deleted file mode 100644
index cbe011b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/Scope_Session.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/FacesConfig_ManagedBean.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/FacesConfig_ManagedBean.gif
deleted file mode 100644
index 6cdef7b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/FacesConfig_ManagedBean.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/FacesConfig_Pageflow16.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/FacesConfig_Pageflow16.gif
deleted file mode 100644
index 5ea67da..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/FacesConfig_Pageflow16.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/FacesConfig_Plugin.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/FacesConfig_Plugin.gif
deleted file mode 100644
index 5ea67da..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/FacesConfig_Plugin.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_Action16.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_Action16.gif
deleted file mode 100644
index c241f5f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_Action16.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_BooleanValue.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_BooleanValue.gif
deleted file mode 100644
index 5002791..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_BooleanValue.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_GenericValue.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_GenericValue.gif
deleted file mode 100644
index 7ef81e5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_GenericValue.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_IntegralValue.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_IntegralValue.gif
deleted file mode 100644
index fea95ce..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_IntegralValue.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_Link.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_Link.gif
deleted file mode 100644
index 6c10cea..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_Link.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_Link24.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_Link24.gif
deleted file mode 100644
index 8004b19..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_Link24.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_Outline.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_Outline.gif
deleted file mode 100644
index f302d8c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_Outline.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_Outline_Overview.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_Outline_Overview.gif
deleted file mode 100644
index 852dc81..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_Outline_Overview.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_Page.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_Page.gif
deleted file mode 100644
index 97cafa9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_Page.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_Page16.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_Page16.gif
deleted file mode 100644
index 5b56ee3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_Page16.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_Page24.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_Page24.gif
deleted file mode 100644
index 2fc426f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_Page24.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_Quickfix_Error.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_Quickfix_Error.gif
deleted file mode 100644
index 1f0002b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_Quickfix_Error.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_TextValue.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_TextValue.gif
deleted file mode 100644
index d483f48..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_TextValue.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/form_banner.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/form_banner.gif
deleted file mode 100644
index aebc0b2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/form_banner.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/help.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/help.gif
deleted file mode 100644
index 9d70301..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/help.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/overview_obj.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/overview_obj.gif
deleted file mode 100644
index 03f656f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/overview_obj.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/plugin.properties b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/plugin.properties
deleted file mode 100644
index f8d99a5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/plugin.properties
+++ /dev/null
@@ -1,60 +0,0 @@
-############################################################################
-# Copyright (c) 2004, 2005 Sybase, Inc. and others.
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     Sybase, Inc. - initial API and implementation
-############################################################################
-plugin.name=JavaServer Faces Tools - FacesConfig Editor
-plugin.provider=Eclipse.org
-
-# Editors
-facesConfigEditor=Faces Config Editor
-facesConfigEditorIcon=icons/facesconfig/FacesConfig_Plugin.gif
-
-# Introduction
-pageflow.editor.intro.name = Introduction
-pageflow.editor.intro.description =
-pageflow.editor.intro.section.heading = The Faces Configuration Editor
-pageflow.editor.intro.section.description = The faces configuration editor helps you to complete the JSF web application development process by allowing you to edit faces configuration. Use the pages in this editor to define and edit page navigations, managed beans, component, converter, validator, renderkit and other element configurations.
-pageflow.editor.intro.cheatsheets.link = Tutorial
-pageflow.editor.intro.cheatsheets.text = Launch the cheat sheet for guidance in working with the editor.
-pageflow.editor.intro.help.link = Help
-pageflow.editor.intro.help.text = Launch the help system and review topics about working with faces configuration descriptor.
-pageflow.editor.intro.start.link = Start
-pageflow.editor.intro.start.text = Start working with the editor by selecting PageFlow and defining page navigations.
-
-#overview Section
-pageflow.editor.overview.name = Editor Information
-pageflow.editor.overview.description = This page summaries the editors information.
-pageflow.editor.overview.pageflow.link = PageFlow Editor
-pageflow.editor.overview.pageflow.text = Editor to create or modify Navigation Rules.
-
-pageflow.editor.intro.overview.mbean.text = Editor to create or modify Managed Beans.
-pageflow.editor.overview.mbean.link = ManagedBeans Editor
-pageflow.editor.intro.overview.components.text = Editor to create or modify component elements.
-pageflow.editor.overview.components.link = Components Editor
-pageflow.editor.intro.overview.others.text = Editor to create or modify other elements.
-pageflow.editor.overview.others.link = Others Editor
-pageflow.editor.intro.overview.source.text = Text Editor source.
-pageflow.editor.overview.source.link = Source Editor
-
-contentType.defaultFacesConfig.name = Default FacesConfig File
-contentType.webdotxmlfile.name = Web Application Description File
-
-#property tab's name
-propertyTab.general=Attributes
-propertyTab.attribute=Quick Edit
-
-# Cheatsheets
-cheatsheet.pagefloweditor.name = Pageflow Editor Cheat Sheet
-cheatsheet.pagefloweditor.description = Cheat Sheet for using the Pageflow Editor
-cheatsheet.jsf.title=JSF Development
-cheatsheet.jsf.facesconfig.title=Faces Configuration Editor
-
-#preference page
-preferencepage.jsffacesconfigui.name=FacesConfig Editor
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/plugin.xml b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/plugin.xml
deleted file mode 100644
index be99224..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/plugin.xml
+++ /dev/null
@@ -1,109 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin>
-  <extension
-        point="org.eclipse.ui.preferencePages">
-     <page
-           category="org.eclipse.jst.jsf.ui.JSFRootPage"
-           class="org.eclipse.jst.jsf.facesconfig.ui.preference.GEMPreferences"
-           id="org.eclipse.jst.jsf.facesconfig.ui.preference.GEMPreferences"
-           name="%preferencepage.jsffacesconfigui.name"/>
-  </extension>
-	<extension point="org.eclipse.ui.editors">
-			
-		<editor
-	        class="org.eclipse.jst.jsf.facesconfig.ui.FacesConfigEditor"
-	        contributorClass="org.eclipse.jst.jsf.facesconfig.ui.FacesConfigActionBarContributor"
-	        default="false"        
-	        icon="icons/facesconfig/FacesConfig_Plugin.gif"
-	        id="org.eclipse.jst.jsf.facesconfig.ui.FacesConfigEditor"
-	        name="%facesConfigEditor">
-			<contentTypeBinding
-					contentTypeId="org.eclipse.jst.jsf.facesconfig.facesConfigFile" />
-		</editor>
-		</extension>
-	
- 	<!-- ********** Introduction Page of PageFlow editor************** -->
-	<extension id="org.eclipse.jst.jsf.facesconfig.ui.FacesConfigEditor"
-		name="%pageflow.editor.intro.name"
-		point="org.eclipse.jst.jsf.common.ui.introductionPage">
-		<introductionpage name="%pageflow.editor.intro.name"
-			description="%pageflow.editor.intro.description">
-			<introductionelement icon="icons/FacesConfig_Introduction.gif"
-				heading="%pageflow.editor.intro.section.heading"
-				text="%pageflow.editor.intro.section.description"/>
-			<introductionelement
-				actionparameters="org.eclipse.jst.jsf.facesconfig.ui.pageflow.PageflowEditor"
-				icon="icons/FacesConfig_GotoEditor.gif"
-				hyperlinkaction="org.eclipse.jst.jsf.common.ui.internal.actions.OpenPageAction"
-				text="%pageflow.editor.intro.start.text"
-				hyperlink="%pageflow.editor.intro.start.link"/>
-			<introductionelement
-				actionparameters="FacesConfigEditor.CheatSheet"
-				icon="icons/FacesConfig_Tutorial.gif"
-				hyperlinkaction="org.eclipse.jst.jsf.common.ui.internal.actions.LoadCheatSheetAction"
-				text="%pageflow.editor.intro.cheatsheets.text"
-				hyperlink="%pageflow.editor.intro.cheatsheets.link"/>
-			<introductionelement actionparameters="org.eclipse.jst.jsf.facesconfig.ui.use_facesconfig_editor"
-				icon="icons/overview_obj.gif"
-				hyperlinkaction="org.eclipse.jst.jsf.common.ui.internal.actions.LoadHelpAction"
-				text="%pageflow.editor.intro.help.text"
-				hyperlink="%pageflow.editor.intro.help.link"/>
-		</introductionpage>		
-	</extension>
-	<!-- ********** End Introduction Page ************** -->
-		<!-- ************* properties view ************** -->
-	<extension point="org.eclipse.ui.views.properties.tabbed.propertyTabs"> 
-		<propertyTabs 
-			contributorId="org.eclipse.jst.jsf.facesconfig.ui.FacesConfigEditor">
-			<propertyTab label="%propertyTab.attribute" category="attribute"
-				id="org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties.attribute"/>
-			<propertyTab label="%propertyTab.general" category="general"
-				id="org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties.general"/>
-		</propertyTabs>
-	</extension>
-		<extension point="org.eclipse.ui.views.properties.tabbed.propertyContributor">
-		<propertyContributor
-			sectionDescriptorProvider="org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties.PageflowSectionDescriptorProvider"
-			contributorId="org.eclipse.jst.jsf.facesconfig.ui.FacesConfigEditor"
-			labelProvider="org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties.PageflowSectionLabelProvider">
-			<propertyCategory category="attribute" />
-			<propertyCategory category="general"/>
-		</propertyContributor>
-	</extension>
-  <extension
-        point="org.eclipse.ui.cheatsheets.cheatSheetContent">
-     <cheatsheet
-           category="org.eclipse.jst.jsf"
-           composite="false"
-           contentFile="$nl$/cheatsheets/facesconfigeditor.xml"
-           id="FacesConfigEditor.CheatSheet"
-           name="%cheatsheet.jsf.facesconfig.title"/>
-     <category
-           id="org.eclipse.jst.jsf"
-           name="%cheatsheet.jsf.title">
-     </category>
-  </extension>
-  <!--<extension
-        point="org.eclipse.ui.views.properties.tabbed.propertyContributor">
-     <propertyContributor
-           contributorId="org.eclipse.jst.jsf.facesconfig.ui.FacesConfigEditor"
-           labelProvider="org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties.PageflowSectionLabelProvider">
-        <propertyCategory category="attribute"/>
-        <propertyCategory category="general"/>
-     </propertyContributor>
-  </extension>
-  <extension
-        point="org.eclipse.ui.views.properties.tabbed.propertyTabs">
-     <propertyTabs contributorId="org.eclipse.jst.jsf.facesconfig.ui.FacesConfigEditor">
-        <propertyTab
-              category="attribute"
-              id="org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties.attribute"
-              label="%propertyTab.attribute"/>
-        <propertyTab
-              category="general"
-              id="org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties.general"
-              label="%propertyTab.general"/>
-     </propertyTabs>
-  </extension>-->
-</plugin>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/EditorMessages.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/EditorMessages.java
deleted file mode 100644
index 274c5d8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/EditorMessages.java
+++ /dev/null
@@ -1,1567 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * Provides localized messages from EditorMessages.properties.
- */
-public final class EditorMessages extends NLS {
-
-	private static final String BUNDLE_NAME = "org.eclipse.jst.jsf.facesconfig.ui.EditorMessages"; //$NON-NLS-1$
-
-	private EditorMessages() {
-		// Do not instantiate
-	}
-
-	static {
-		NLS.initializeMessages(BUNDLE_NAME, EditorMessages.class);
-	}
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String AddEditManagedPropertyDialog_Add;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String AddEditManagedPropertyDialog_Edit;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String AddEditMapEntryDialog_NullValue;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String FacesConfigEditor_ErrorHandlingUndoConflicts_DialogMessage;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-    public static String FacesConfigEditor_ErrorHandlingUndoConflicts_DialogTitle;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-    public static String FacesConfigEditor_WaitForLoad_EditorTabTitle;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-    public static String UI_Button_Add;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String UI_Button_Edit;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String UI_Button_Remove;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String UI_Button_Add_more;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String UI_Button_Edit_more;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String Remove_Title;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String Remove_Msg;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String FindType;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String FindType_Filter;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String FindType_Error_CannotFindType;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String FacesConfigEditor_Introduction_TabName;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String FacesConfigEditor_Overview_TabName;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String FacesConfigEditor_Pageflow_TabName;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String FacesConfigEditor_ManagedBeans_TabName;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String FacesConfigEditor_Components_TabName;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String FacesConfigEditor_Others_TabName;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String FacesConfigEditor_Source_TabName;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String editor_pageflow_page_intro_name;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String editor_pageflow_page_intro_title;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String editor_pageflow_page_intro_help_HelpContextID;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String editor_pageflow_page_intro_help_HelpToolTip;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ManagedBeanPage_Title;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ManagedBeanMasterSection_Name;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ManagedBeanMasterSection_Description;
-
-//	public static String ManagedBeanMasterSection_HelpContextID;
-//
-//	public static String ManagedBeanMasterSection_HelpToolTip;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ManagedBeanGeneralSection_Name;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ManagedBeanGeneralSection_Desc;
-
-//	public static String ManagedBeanGeneralSection_HelpContextID;
-//
-//	public static String ManagedBeanGeneralSection_HelpToolTip;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ManagedBeanGeneralSection_ManagedBeanName;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ManagedBeanGeneralSection_ManagedBeanClass;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ManagedBeanGeneralSection_ManagedBeanScope;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String InitializationSection_Name;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String InitializationSection_Description;
-
-//	public static String InitializationSection_HelpContextID;
-//
-//	public static String InitializationSection_HelpToolTip;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ManagedBeanPropertyEditDialog_Title_NewPropertyEntry;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ManagedBeanPropertyEditDialog_Title_ExistingPropertyEntry;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ManagedBeanPropertyEditDialog_PropertyName;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ManagedBeanPropertyEditDialog_PropertyClass;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ManagedBeanPropertyEditDialog_PropertyClass_Browse;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ManagedBeanPropertyEditDialog_ValueType;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ManagedBeanProeprtyEditPage_Description;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ManagedBeanPropertyEditDialog_Value;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ManagedBeanPropertyEditWizard_Title;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ManagedBeanProeprtyEditPage_Title;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ManagedBeanPropertyEditDialog_Value_Change;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ManagedBeanPropertyEditDialog_FindType;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ManagedBeanPropertyEditDialog_FindType_Filter;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String InitializationSection_ClassType;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String InitializationSection_ClassType_General;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String InitializationSection_ClassType_Map;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String InitializationSection_ClassType_List;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String InitializationSection_PropertyTable_Name;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String InitializationSection_PropertyTable_Class;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String InitializationSection_PropertyTable_Value;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String InitializationSection_MapType_KeyClass;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String InitializationSection_MapType_ValueClass;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String InitializationSection_MapTable_Title;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String InitializationSection_MapTable_Key;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String InitializationSection_MapTable_Value;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String InitializationSection_ListType_ValueClass;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String InitializationSection_ListTable_Title;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String InitializationSection_ListTable_Value;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ListEntriesEditPage_Title;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ListEntriesWizard_Title;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ListEntriesEditPage_Description;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String OverviewPage_page_name;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String OverviewPage_page_id;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String OverviewPage_page_title;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String OverviewPage_PageflowOverview_summary;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String OverviewPage_EditorSection_name;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String OverviewPage_EditorSection_description;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String OverviewPage_EditorSection_noplugin;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String OverviewPage_EditorSection_nooverview;
-
-//	public static String OverviewPage_EditorSection_Help_HelpContextID;
-//
-//	public static String OverviewPage_EditorSection_Help_HelpToolTip;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String OverviewPage_GeneralSection_name;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String OverviewPage_GeneralSection_description;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String OverviewPage_GeneralSection_label_name;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String OverviewPage_GeneralSection_label_version;
-
-//	public static String OverviewPage_GeneralSection_Help_HelpContextID;
-//
-//	public static String OverviewPage_GeneralSection_Help_HelpToolTip;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String OverviewPage_NavigationSection_name;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String OverviewPage_NavigationSection_description;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String OverviewPage_NavigationSection_table_col1;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String OverviewPage_NavigationSection_table_col2;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String OverviewPage_NavigationSection_table_col3;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String OverviewPage_NavigationSection_pageflowPageID;
-
-//	public static String OverviewPage_NavigationSection_Help_HelpContextID;
-//
-//	public static String OverviewPage_NavigationSection_Help_HelpToolTip;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String OverviewPage_ManagedBeanSection_name;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String OverviewPage_ManagedBeanSection_description;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String OverviewPage_ManagedBeanSection_table_namecol;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String OverviewPage_ManagedBeanSection_table_scopecol;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String OverviewPage_ManagedBeanSection_table_classcol;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String OverviewPage_ManagedBeanSection_managedbeanPageID;
-
-//	public static String OverviewPage_ManagedBeanSection_Help_HelpContextID;
-//
-//	public static String OverviewPage_ManagedBeanSection_Help_HelpToolTip;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String OverviewPage_ComponentsSection_name;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String OverviewPage_ComponentsSection_description;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String OverviewPage_ComponentsSection_table_typecol;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String OverviewPage_ComponentsSection_table_namecol;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String OverviewPage_ComponentsSection_componentsPageID;
-
-//	public static String OverviewPage_ComponentsSection_Help_HelpContextID;
-//
-//	public static String OverviewPage_ComponentsSection_Help_HelpToolTip;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String OverviewPage_OthersSection_name;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String OverviewPage_OthersSection_description;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String OverviewPage_OthersSection_table_typecol;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String OverviewPage_OthersSection_table_namecol;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String OverviewPage_OthersSection_table_valuecol;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String OverviewPage_OthersSection_othersPageID;
-
-//	public static String OverviewPage_OthersSection_Help_HelpContextID;
-//
-//	public static String OverviewPage_OthersSection_Help_HelpToolTip;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ManagedBeanPropertyGroup_error_EmptyName;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ManagedBeanPropertyGroup_error_EmptyClass;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String MapEntriesEditGroup_Edit;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String MapEntriesEditPage_Title;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String MapEntriesWizard_Title;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String MapEntryEditGroup_Key;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String MapEntryEditGroup_error_EmptyKey;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String MapEntryEditGroup_error_DuplicateKey;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String MapEntryEditPage_Title;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String MapEntryEditWizard_Title;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String MapEntriesEditPage_Description;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String MapEntryEditPage_Description;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ValueEditDialog_Title;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ValueEditWizard_Title;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ValueEditPage_Description;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ValueEditGroup_Value;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ValueEditPage_Title;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ComponentsPage_Title;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ComponentMasterSection_Name;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ComponentMasterSection_Description;
-
-//	public static String ComponentMasterSection_HelpContextID;
-//
-//	public static String ComponentMasterSection_HelpToolTip;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ComponentGeneralSection_Name;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ComponentGeneralSection_Description;
-
-//	public static String ComponentGeneralSection_HelpContextID;
-//
-//	public static String ComponentGeneralSection_HelpToolTip;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ComponentGeneralSection_Label_DisplayName;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ComponentGeneralSection_Label_Description;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ComponentGeneralSection_Label_ComponentType;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ComponentGeneralSection_Label_ComponentClass;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String RenderKitMasterSection_Name;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String RenderKitMasterSection_Description;
-
-//	public static String RenderKitMasterSection_HelpContextID;
-//
-//	public static String RenderKitMasterSection_HelpToolTip;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String RenderKitGeneralSection_Name;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String RenderKitGeneralSection_Description;
-
-//	public static String RenderKitGeneralSection_HelpContextID;
-//
-//	public static String RenderKitGeneralSection_HelpToolTip;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String RenderKitGeneralSection_Label_DisplayName;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String RenderKitGeneralSection_Label_Description;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String RenderKitGeneralSection_Label_RenderKitID;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String RenderKitGeneralSection_Label_RenderKitClass;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String RendererSection_Name;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String RendererSection_Description;
-
-//	public static String RendererSection_HelpContextID;
-//
-//	public static String RendererSection_HelpToolTip;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String RendererSection_Table_NameColumn;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String RendererSection_Table_ComponentFamilyColumn;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String RendererSection_Table_TypeColumn;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String RendererSection_Table_ClassColumn;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String RendererSection_Dialog_Title_Add;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String RendererSection_Dialog_Title_Edit;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String RendererSection_Dialog_Tab_General;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String RendererSection_Dialog_DisplayName;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String RendererSection_Dialog_ComponentFamilyValue;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String RendererSection_Dialog_TypeValue;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String RendererSection_Dialog_RendererClass;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String RendererSection_Dialog_Error_ComponentFamilyEmpty;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String RendererSection_Dialog_Error_RendererTypeEmpty;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String RendererSection_Dialog_Error_RendererClassEmpty;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String RendererSection_Dialog_SelectComponentFamilyDialog_Title;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String RendererSection_Dialog_ComponentFamilyCaption;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String RendererSection_Dialog_ComponentFamilyLabel;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ConverterMasterSection_Name;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ConverterMasterSection_Description;
-
-//	public static String ConverterMasterSection_HelpContextID;
-//
-//	public static String ConverterMasterSection_HelpToolTip;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ConverterGeneralSection_Name;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ConverterGeneralSection_Description;
-
-//	public static String ConverterGeneralSection_HelpContextID;
-//
-//	public static String ConverterGeneralSection_HelpToolTip;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ConverterGeneralSection_Label_DisplayName;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ConverterGeneralSection_Label_Description;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ConverterGeneralSection_Label_ConverterID;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ConverterGeneralSection_Label_ConverterForClass;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ConverterGeneralSection_Label_ConverterClass;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ValidatorMasterSection_Name;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ValidatorMasterSection_Description;
-
-//	public static String ValidatorMasterSection_HelpContextID;
-//
-//	public static String ValidatorMasterSection_HelpToolTip;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ValidatorGeneralSection_Name;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ValidatorGeneralSection_Description;
-
-//	public static String ValidatorGeneralSection_HelpContextID;
-//
-//	public static String ValidatorGeneralSection_HelpToolTip;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ValidatorGeneralSection_Label_DisplayName;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ValidatorGeneralSection_Label_Description;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ValidatorGeneralSection_Label_ValidatorID;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ValidatorGeneralSection_Label_ValidatorClass;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String AttributeSection_Name;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String AttributeSection_Description;
-
-//	public static String AttributeSection_HelpContextID;
-//
-//	public static String AttributeSection_HelpToolTip;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String AttributeSection_Table_NameColumn;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String AttributeSection_Table_ClassColumn;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String AttributeSection_Table_DefaultValueColumn;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String AttributeSection_Table_SuggestedValueColumn;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String AttributeSection_Dialog_Title_Add;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String AttributeSection_Dialog_Title_Edit;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String AttributeSection_Dialog_Tab_General;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String AttributeSection_Dialog_AttributeName;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String AttributeSection_Dialog_AttributeClass;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String AttributeSection_Dialog_DefaultValue;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String AttributeSection_Dialog_SuggestedValue;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String AttributeSection_Dialog_Error_NameEmpty;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String AttributeSection_Dialog_Error_ClassEmpty;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String PropertySection_Name;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String PropertySection_Description;
-
-//	public static String PropertySection_HelpContextID;
-//
-//	public static String PropertySection_HelpToolTip;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String PropertySection_Table_NameColumn;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String PropertySection_Table_ClassColumn;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String PropertySection_Table_DefaultValueColumn;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String PropertySection_Table_SuggestedValueColumn;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String PropertySection_Dialog_Title_Add;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String PropertySection_Dialog_Title_Edit;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String PropertySection_Dialog_Tab_General;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String PropertySection_Dialog_PropertyName;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String PropertySection_Dialog_PropertyClass;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String PropertySection_Dialog_DefaultValue;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String PropertySection_Dialog_SuggestedValue;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String PropertySection_Dialog_Error_NameEmpty;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String PropertySection_Dialog_Error_ClassEmpty;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String FacetSection_Name;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String FacetSection_Description;
-
-//	public static String FacetSection_HelpContextID;
-//
-//	public static String FacetsSection_HelpToolTip;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String FacetSection_Table_DisplayNameColumn;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String FacetSection_Table_FacetNameColumn;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String FacetSection_Table_DescriptionColumn;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String FacetSection_Dialog_Title_Add;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String FacetSection_Dialog_Title_Edit;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String FacetSection_Dialog_Tab_General;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String FacetSection_Dialog_FacetName;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String FacetSection_Dialog_DisplayName;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String FacetSection_Dialog_Description;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String FacetSection_Dialog_Error_NameEmpty;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String OthersPage_Title;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ActionListenerSection_Name;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ActionListenerSection_Description;
-
-//	public static String ActionListenerSection_HelpContextID;
-//
-//	public static String ActionListenerSection_HelpToolTip;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String MessageBundleSection_Name;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String MessageBundleSection_Description;
-
-//	public static String MessageBundleSection_HelpContextID;
-//
-//	public static String MessageBundleSection_HelpToolTip;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String MessageBundleSection_Dialog_Title;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String MessageBundleSection_Dialog_Message_SelectPropertyFile;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String MessageBundleSection_Dialog_Message_AlreadyExists;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String LocaleConfigSection_Name;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String LocaleConfigSection_Description;
-
-//	public static String LocaleConfigSection_HelpContextID;
-//
-//	public static String LocaleConfigSection_HelpToolTip;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String LocaleConfigSection_Wizard_WindowTitle;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String LocaleConfigSection_Wizard_Page_Name;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String LocaleConfigSection_Wizard_Page_Title;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String LocaleConfigSection_Wizard_Page_Description;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String LocaleConfigSection_Wizard_Page_LabelText;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String LocaleConfigSection_Wizard_Page_AlreadyExistsError;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String DefaultRenderKitIDSection_Name;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String DefaultRenderKitIDSection_Description;
-
-//	public static String DefaultRenderKitIDSection_HelpContextID;
-//
-//	public static String DefaultRenderKitIDSection_HelpToolTip;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String DefaultRenderKitIDSection_Wizard_WindowTitle;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String DefaultRenderKitIDSection_Wizard_Page_Name;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String DefaultRenderKitIDSection_Wizard_Page_Title;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String DefaultRenderKitIDSection_Wizard_Page_Description;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String DefaultRenderKitIDSection_Wizard_Page_LabelText;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String DefaultRenderKitIDSection_Wizard_Page_AlreadyExistsError;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String NavigationHandlerSection_Name;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String NavigationHandlerSection_Description;
-
-//	public static String NavigationHandlerSection_HelpContextID;
-//
-//	public static String NavigationHandlerSection_HelpToolTip;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ViewHandlerSection_Name;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ViewHandlerSection_Description;
-
-//	public static String ViewHandlerSection_HelpContextID;
-//
-//	public static String ViewHandlerSection_HelpToolTip;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String StateManagerSection_Name;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String StateManagerSection_Description;
-
-//	public static String StateManagerSection_HelpContextID;
-//
-//	public static String StateManagerSection_HelpToolTip;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String PropertyResolverSection_Name;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String PropertyResolverSection_Description;
-
-//	public static String PropertyResolverSection_HelpContextID;
-//
-//	public static String PropertyResolverSection_HelpToolTip;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String VariableResolverSection_Name;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String VariableResolverSection_Description;
-
-//	public static String VariableResolverSection_HelpContextID;
-//
-//	public static String VariableResolverSection_HelpToolTip;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ApplicationFactorySection_Name;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ApplicationFactorySection_Description;
-
-//	public static String ApplicationFactorySection_HelpContextID;
-//
-//	public static String ApplicationFactorySection_HelpToolTip;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String FacesContextFactorySection_Name;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String FacesContextFactorySection_Description;
-
-//	public static String FacesContextFactorySection_HelpContextID;
-//
-//	public static String FacesContextFactorySection_HelpToolTip;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String LifecycleFactorySection_Name;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String LifecycleFactorySection_Description;
-
-//	public static String LifecycleFactorySection_HelpContextID;
-//
-//	public static String LifecycleFactorySection_HelpToolTip;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String RenderKitFactorySection_Name;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String RenderKitFactorySection_Description;
-
-//	public static String RenderKitFactorySection_HelpContextID;
-//
-//	public static String RenderKitFactorySection_HelpToolTip;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String PhaseListenerSection_Name;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String PhaseListenerSection_Description;
-
-//	public static String PhaseListenerSection_HelpContextID;
-//
-//	public static String PhaseListenerSection_HelpToolTip;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String MultiPageEditorOutlinePage_noOutline;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String FacesConfigEditor_Error_OpenModel_Title;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String FacesConfigEditor_Error_OpenModel;
-	
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String FacesConfigEditor_WaitForLoadPage_Title;
-	
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ModelLoader_LoadingModelJobName;
-
-	/**
-	 * Align bottom action label.
-	 */
-	public static String AlignmentAction_AlignBottomAction_Label;
-
-	/**
-	 * Align bottom action tooltip.
-	 */
-	public static String AlignmentAction_AlignBottomAction_Tooltip;
-
-	/**
-	 * Align center action label.
-	 */
-	public static String AlignmentAction_AlignCenterAction_Label;
-
-	/**
-	 * Align center action tooltip.
-	 */
-	public static String AlignmentAction_AlignCenterAction_Tooltip;
-
-	/**
-	 * Align left action label.
-	 */
-	public static String AlignmentAction_AlignLeftAction_Label;
-
-	/**
-	 * Align left action tooltip.
-	 */
-	public static String AlignmentAction_AlignLeftAction_Tooltip;
-
-	/**
-	 * Align middle action label.
-	 */
-	public static String AlignmentAction_AlignMiddleAction_Label;
-
-	/**
-	 * Align middle action tooltip.
-	 */
-	public static String AlignmentAction_AlignMiddleAction_Tooltip;
-
-	/**
-	 * Align right action label.
-	 */
-	public static String AlignmentAction_AlignRightAction_Label;
-
-	/**
-	 * Align right action tooltip.
-	 */
-	public static String AlignmentAction_AlignRightAction_Tooltip;
-
-	/**
-	 * Align top action label.
-	 */
-	public static String AlignmentAction_AlignTopAction_Label;
-
-	/**
-	 * Align top action tooltip.
-	 */
-	public static String AlignmentAction_AlignTopAction_Tooltip;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String EditListEntriesDialog_EditingListEntries;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String EditMapEntriesDialog_EditingMapEntries;
-
-    /**
-     * User can turn off intro page in faces-config editor
-     */
-    public static String editor_pageflow_page_intro_NoIntroPage;
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/EditorMessages.properties b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/EditorMessages.properties
deleted file mode 100644
index 8891323..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/EditorMessages.properties
+++ /dev/null
@@ -1,453 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-####################################################
-# Common UI resources
-####################################################
-UI_Button_Add = Add
-UI_Button_Edit = Edit
-UI_Button_Remove = Remove
-UI_Button_Add_more = Add...
-UI_Button_Edit_more = Edit...
-
-##Message for remove confirm alerter.
-Remove_Title = Confirm Remove
-Remove_Msg = Are you sure you want to remove {0}?
-
-FindType = Find Type
-FindType_Filter = Choose a type (?=any character, *=any string):
-FindType_Error_CannotFindType = Can not find java class
-
-FacesConfigEditor_Error_OpenModel_Title = Error
-FacesConfigEditor_ErrorHandlingUndoConflicts_DialogTitle=File Conflict
-FacesConfigEditor_ErrorHandlingUndoConflicts_DialogMessage=There are unsaved changes that conflict with changes made outside the editor.  Do you wish to discard this editor's changes?
-FacesConfigEditor_Error_OpenModel = Cannot open the faces-config file, this project is not a web project.
-####################################################
-# Tab's name for multipageeditor of faces-config 
-####################################################
-FacesConfigEditor_Introduction_TabName = Introduction
-FacesConfigEditor_Overview_TabName = Overview
-FacesConfigEditor_Pageflow_TabName = Navigation Rule
-FacesConfigEditor_ManagedBeans_TabName = ManagedBean
-FacesConfigEditor_Components_TabName = Component
-FacesConfigEditor_Others_TabName = Others
-FacesConfigEditor_Source_TabName = Source
-
-
-####################################################
-#Introduction page 
-####################################################
-editor_pageflow_page_intro_name = Introduction
-editor_pageflow_page_intro_title = Faces Configuration Introduction
-editor_pageflow_page_intro_help_HelpContextID = com.sybase.stf.jmt.faces_config_editor_introduction
-editor_pageflow_page_intro_help_HelpToolTip = Introduction
-editor_pageflow_page_intro_NoIntroPage=Don't show this page next time. 
-
-####################################################
-#ManagedBean page 
-####################################################
-ManagedBeanPage_Title = Faces Configuration Managed Bean
-
-##managed bean section
-ManagedBeanMasterSection_Name = Managed Bean Elements
-ManagedBeanMasterSection_Description = The following managed beans are defined
-
-
-##managed bean general section
-ManagedBeanGeneralSection_Name = Managed Bean
-
-ManagedBeanGeneralSection_Desc = This section describes general configuration of this managed bean
-
-ManagedBeanGeneralSection_ManagedBeanName = Managed Bean name*:
-ManagedBeanGeneralSection_ManagedBeanClass = Managed Bean class*:
-ManagedBeanGeneralSection_ManagedBeanScope = Managed Bean scope*:
-
-##managed bean initialization section
-InitializationSection_Name = Initialization
-InitializationSection_Description = You can initialize the managed bean's properties or itself if it is a subclass of java.util.Map or java.util.List
-
-ManagedBeanPropertyEditDialog_Title_NewPropertyEntry = Create New Property
-ManagedBeanPropertyEditDialog_Title_ExistingPropertyEntry = Edit Existing Property
-ManagedBeanPropertyEditDialog_PropertyName = Property name*:
-ManagedBeanPropertyEditDialog_PropertyClass = Property class*:
-ManagedBeanPropertyEditDialog_PropertyClass_Browse = Browse...
-ManagedBeanPropertyEditDialog_ValueType = Value type:
-ManagedBeanProeprtyEditPage_Description = Editing managed bean property.
-ManagedBeanPropertyEditDialog_Value = Value:
-ManagedBeanPropertyEditWizard_Title = Editing Managed Bean Property
-ManagedBeanProeprtyEditPage_Title = Edit Property
-ManagedBeanPropertyEditDialog_Value_Change = Edit...
-
-ManagedBeanPropertyEditDialog_FindType = Find Type
-ManagedBeanPropertyEditDialog_FindType_Filter = Choose a type (?=any character, *=any string):
-
-InitializationSection_ClassType = Managed Bean class type:
-
-InitializationSection_ClassType_General = General class
-InitializationSection_ClassType_Map = Map
-InitializationSection_ClassType_List = List
-
-InitializationSection_PropertyTable_Name = Name
-InitializationSection_PropertyTable_Class = Class
-InitializationSection_PropertyTable_Value = Value
-
-InitializationSection_MapType_KeyClass = Key class:
-InitializationSection_MapType_ValueClass = Value class:
-
-InitializationSection_MapTable_Title = Values:
-InitializationSection_MapTable_Key = Key
-
-InitializationSection_MapTable_Value = Value
-
-InitializationSection_ListType_ValueClass = Value class:
-InitializationSection_ListTable_Title = Values:
-InitializationSection_ListTable_Value = Value
-
-
-##ListEntriesEditGroup
-ListEntriesEditPage_Title = Editing list-entries
-ListEntriesWizard_Title = Editing list-entries
-ListEntriesEditPage_Description = Editing list-entries of managed bean property.
-
-
-
-####################################################
-#Overview Page
-####################################################
-#OverviewPage.help = Help
-OverviewPage_page_name = Overview
-OverviewPage_page_id = PageflowOverview
-OverviewPage_page_title = PageFlow Overview
-OverviewPage_PageflowOverview_summary = Faces Configuration Overview
-
-# editor section 
-OverviewPage_EditorSection_name = Editors Information
-OverviewPage_EditorSection_description = This section information about editors
-OverviewPage_EditorSection_noplugin = No plugin.xml file
-OverviewPage_EditorSection_nooverview = No Overview section found in plugin.xml file
-
-# general section
-OverviewPage_GeneralSection_name = General information of faces-config.xml
-OverviewPage_GeneralSection_description = This section describes general information
-OverviewPage_GeneralSection_label_name = Faces Config Name:
-OverviewPage_GeneralSection_label_version = Version:
-
-#navigation section
-OverviewPage_NavigationSection_name = Navigation Information
-OverviewPage_NavigationSection_description = This section describes the navigation rules
-OverviewPage_NavigationSection_table_col1 = From View ID
-OverviewPage_NavigationSection_table_col2 = From Outcome
-OverviewPage_NavigationSection_table_col3 = To View ID
-OverviewPage_NavigationSection_pageflowPageID = org.eclipse.wtp.jsf.facesconfig.editor.pageflow.PageflowEditor
-
-
-# managed bean section
-OverviewPage_ManagedBeanSection_name = ManagedBean Information
-OverviewPage_ManagedBeanSection_description = This section describes the managed beans
-OverviewPage_ManagedBeanSection_table_namecol = Name
-OverviewPage_ManagedBeanSection_table_scopecol = Scope
-OverviewPage_ManagedBeanSection_table_classcol = Class
-OverviewPage_ManagedBeanSection_managedbeanPageID = com.sybase.stf.jmt.editors.pageflow.managedbean.DataBindingPage
-
-#components section
-OverviewPage_ComponentsSection_name = Component Information
-OverviewPage_ComponentsSection_description = This section describes component, render-kit, converter and validator elements
-OverviewPage_ComponentsSection_table_typecol = Element Type
-OverviewPage_ComponentsSection_table_namecol = Element Name
-OverviewPage_ComponentsSection_componentsPageID = com.sybase.stf.jmt.editors.pageflow.components.ComponentsPage
-
-#other section
-OverviewPage_OthersSection_name = Others Information
-OverviewPage_OthersSection_description = This section describes application, factory and lifecycle elements
-OverviewPage_OthersSection_table_typecol = Element Type
-OverviewPage_OthersSection_table_namecol = Element Name
-OverviewPage_OthersSection_table_valuecol = Element Value
-OverviewPage_OthersSection_othersPageID = com.sybase.stf.jmt.editors.pageflow.OthersPage
-
-ManagedBeanPropertyGroup_error_EmptyName = The property name should be selected.
-ManagedBeanPropertyGroup_error_EmptyClass = The property class should be selected or input.
-MapEntriesEditGroup_Edit = Edit...
-MapEntriesEditPage_Title = Editing map-entries
-MapEntriesWizard_Title = Editing map-entries
-MapEntryEditGroup_Key = Key*:
-MapEntryEditGroup_error_EmptyKey = The key is empty.
-MapEntryEditGroup_error_DuplicateKey = The key ''{0}'' is duplicated.
-
-
-MapEntryEditPage_Title = Edit map-entry
-MapEntryEditWizard_Title = Edit Map Entry
-MapEntriesEditPage_Description = Editing map-entries of managed bean property.
-MapEntryEditPage_Description = Editing map-entry of managed bean property.
-ValueEditDialog_Title = Edit Value
-ValueEditWizard_Title = Edit Value
-ValueEditPage_Description = Editing value of managed bean property.
-ValueEditGroup_Value = Value:
-ValueEditPage_Title = Edit Value
-
-####################################################
-#Components page 
-####################################################
-ComponentsPage_Title = Faces Configuration Components
-
-##Component Master Section
-ComponentMasterSection_Name = Components
-ComponentMasterSection_Description = The following components are defined:
-
-
-##Components General Section
-ComponentGeneralSection_Name = General
-ComponentGeneralSection_Description = This section describes the general information of this component.
-ComponentGeneralSection_Label_DisplayName = Display Name:
-ComponentGeneralSection_Label_Description = Description:
-ComponentGeneralSection_Label_ComponentType = Component Type*:
-ComponentGeneralSection_Label_ComponentClass = Component Class*:
-
-##RenderKit Master Section
-RenderKitMasterSection_Name = Render Kits
-RenderKitMasterSection_Description = The following render-kits are defined:
-
-
-##RenderKits General Section
-RenderKitGeneralSection_Name = General
-RenderKitGeneralSection_Description = This section describes the general information of this render-kit.
-RenderKitGeneralSection_Label_DisplayName = Display Name:
-RenderKitGeneralSection_Label_Description = Description:
-RenderKitGeneralSection_Label_RenderKitID = Renderkit ID:
-RenderKitGeneralSection_Label_RenderKitClass = Renderkit Class:
-
-##Renderer Section
-RendererSection_Name = Renderers
-RendererSection_Description = This section lists all the renderers of this render-kit.
-RendererSection_Table_NameColumn = Name
-RendererSection_Table_ComponentFamilyColumn = Component Family
-RendererSection_Table_TypeColumn = Type
-RendererSection_Table_ClassColumn = Class
-
-##Add/Edit Renderer Dialog
-RendererSection_Dialog_Title_Add = Add Renderer
-RendererSection_Dialog_Title_Edit = Edit Renderer
-RendererSection_Dialog_Tab_General = General
-RendererSection_Dialog_DisplayName = Display Name:
-RendererSection_Dialog_ComponentFamilyValue = Component Family*:
-RendererSection_Dialog_TypeValue = Renderer Type*:
-RendererSection_Dialog_RendererClass = Renderer Class*:
-RendererSection_Dialog_Error_ComponentFamilyEmpty = The component family is empty.
-RendererSection_Dialog_Error_RendererTypeEmpty = The renderer type is empty.
-RendererSection_Dialog_Error_RendererClassEmpty = The renderer class is empty.
-
-RendererSection_Dialog_SelectComponentFamilyDialog_Title = Select Component Family
-#RendererSection.Dialog.Page.SelectComponentFamilyDialogPage.Title = Select Component Family
-#RendererSection.Dialog.Page.SelectComponentFamilyDialogPage.Description = Enter or select a component family.
-#RendererSection.Dialog.Page.SelectComponentFamilyDialogPage.LabelText = Enter or select a component family:
-RendererSection_Dialog_ComponentFamilyCaption = Select Component Family
-RendererSection_Dialog_ComponentFamilyLabel = Enter or select a component family:
-##Converter Master Section
-ConverterMasterSection_Name = Converters
-ConverterMasterSection_Description = The following Converters are defined:
-
-
-##Converter General Section
-ConverterGeneralSection_Name = General
-ConverterGeneralSection_Description = This section describes the general information of this converter.
-ConverterGeneralSection_Label_DisplayName = Display Name:
-ConverterGeneralSection_Label_Description = Description:
-ConverterGeneralSection_Label_ConverterID = Converter ID:
-ConverterGeneralSection_Label_ConverterForClass = or Converter For Class:
-ConverterGeneralSection_Label_ConverterClass = Converter Class*:
-
-##Validator Section
-ValidatorMasterSection_Name = Validators
-ValidatorMasterSection_Description = The following Validators are defined:
-
-
-##Validator General Section
-ValidatorGeneralSection_Name = General
-ValidatorGeneralSection_Description = This section describes general information of this Validator
-ValidatorGeneralSection_Label_DisplayName = Display Name:
-ValidatorGeneralSection_Label_Description = Description:
-ValidatorGeneralSection_Label_ValidatorID = Validator ID*:
-ValidatorGeneralSection_Label_ValidatorClass = Validator Class*:
-
-##Attribute Section
-AttributeSection_Name = Attributes
-AttributeSection_Description = This section lists all the attributes.
-
-AttributeSection_Table_NameColumn = Name
-AttributeSection_Table_ClassColumn = Class
-AttributeSection_Table_DefaultValueColumn = Default Value
-AttributeSection_Table_SuggestedValueColumn = Suggested Value
-
-##Add/Edit Attribute Dialog
-AttributeSection_Dialog_Title_Add = Add Attribute
-AttributeSection_Dialog_Title_Edit = Edit Attribute
-AttributeSection_Dialog_Tab_General = General
-AttributeSection_Dialog_AttributeName = Attribute Name*:
-AttributeSection_Dialog_AttributeClass = Attribute Class*:
-AttributeSection_Dialog_DefaultValue = Default value:
-AttributeSection_Dialog_SuggestedValue = Suggested value:
-AttributeSection_Dialog_Error_NameEmpty = The attribute name is empty.
-AttributeSection_Dialog_Error_ClassEmpty = The attribute class is empty.
-
-##Property Section
-PropertySection_Name = Properties
-PropertySection_Description = This section lists all the properties.
-
-PropertySection_Table_NameColumn = Name
-PropertySection_Table_ClassColumn = Class
-PropertySection_Table_DefaultValueColumn = Default Value
-PropertySection_Table_SuggestedValueColumn = Suggested Value
-
-
-##Add/Edit Property Dialog
-PropertySection_Dialog_Title_Add = Add Property
-PropertySection_Dialog_Title_Edit = Edit Property
-PropertySection_Dialog_Tab_General = General
-PropertySection_Dialog_PropertyName = Property Name*:
-PropertySection_Dialog_PropertyClass = Property Class*:
-PropertySection_Dialog_DefaultValue = Default value:
-PropertySection_Dialog_SuggestedValue = Suggested value:
-PropertySection_Dialog_Error_NameEmpty = The property name is empty.
-PropertySection_Dialog_Error_ClassEmpty = The property class is empty.
-
-##Facet Section
-FacetSection_Name = Facets
-FacetSection_Description = This section lists all the facets.
-
-FacetSection_Table_DisplayNameColumn = Display Name
-FacetSection_Table_FacetNameColumn = Facet Name
-FacetSection_Table_DescriptionColumn = Description
-
-FacetSection_Dialog_Title_Add = Add Facet
-FacetSection_Dialog_Title_Edit = Edit Facet
-FacetSection_Dialog_Tab_General = General
-FacetSection_Dialog_FacetName = Facet Name*:
-FacetSection_Dialog_DisplayName = Display Name:
-FacetSection_Dialog_Description = Description:
-FacetSection_Dialog_Error_NameEmpty = The facet name is empty.
-
-####################################################
-#Others page 
-####################################################
-OthersPage_Title = Faces Configuration Others
-
-##Application ActionListener Section
-ActionListenerSection_Name = Action Listener
-ActionListenerSection_Description = 
-
-
-##Application Message Bundle Section
-MessageBundleSection_Name = Message Bundle
-MessageBundleSection_Description = 
-
-
-MessageBundleSection_Dialog_Title = Select Message Bundle
-MessageBundleSection_Dialog_Message_SelectPropertyFile = Please select a message bundle file.
-MessageBundleSection_Dialog_Message_AlreadyExists = This message bundle already exists.
-
-##Application Locale Config Section
-LocaleConfigSection_Name = Locale Config
-LocaleConfigSection_Description = 
-
-LocaleConfigSection_Wizard_WindowTitle = Add New Locale
-LocaleConfigSection_Wizard_Page_Name = addLocalePage
-LocaleConfigSection_Wizard_Page_Title = Add Supported Locale
-LocaleConfigSection_Wizard_Page_Description = 
-LocaleConfigSection_Wizard_Page_LabelText = Enter or select a locale:
-LocaleConfigSection_Wizard_Page_AlreadyExistsError = This locale already exists.
-
-##Application Default RenderKit ID Section
-DefaultRenderKitIDSection_Name = Default RenderKit ID
-DefaultRenderKitIDSection_Description = 
-
-
-DefaultRenderKitIDSection_Wizard_WindowTitle = Add Default Render Kit ID
-DefaultRenderKitIDSection_Wizard_Page_Name = addDefaultRenderKitIDPage
-DefaultRenderKitIDSection_Wizard_Page_Title = Add Default Render Kit ID
-DefaultRenderKitIDSection_Wizard_Page_Description = 
-DefaultRenderKitIDSection_Wizard_Page_LabelText = Enter or select a render kit id:
-DefaultRenderKitIDSection_Wizard_Page_AlreadyExistsError = This render kit ID already exists.
-
-##Application Navigation Handler Section
-NavigationHandlerSection_Name = Navigation Handler
-NavigationHandlerSection_Description = 
-
-
-##Application View Handler Section
-ViewHandlerSection_Name = View Handler
-ViewHandlerSection_Description = 
-
-
-##Application State Manager Section
-StateManagerSection_Name = State Manager
-StateManagerSection_Description = 
-
-
-##Application Property Resolver Section
-PropertyResolverSection_Name = Property Resolver
-PropertyResolverSection_Description = 
-
-##Application Variable Resolver Section
-VariableResolverSection_Name = Variable Resolver
-VariableResolverSection_Description = 
-
-
-##Factory Application Factory Section
-ApplicationFactorySection_Name = Application Factory
-ApplicationFactorySection_Description = 
-
-
-##Factory Faces Context Factory Section
-FacesContextFactorySection_Name = Faces Context Factory
-FacesContextFactorySection_Description = 
-
-
-##Factory Lifecycle Factory Section
-LifecycleFactorySection_Name = Lifecycle Factory
-LifecycleFactorySection_Description = 
-
-
-##Factory Render Kit Factory Section
-RenderKitFactorySection_Name = Render Kit Factory
-RenderKitFactorySection_Description = 
-
-##LifeCycle Phase Listener Section
-PhaseListenerSection_Name = Phase Listener
-PhaseListenerSection_Description = 
-
-####################################################
-#Resource for MultiPageEditorOutlinePage
-####################################################
-MultiPageEditorOutlinePage_noOutline = An outline is not available.
-
-
-FacesConfigEditor_WaitForLoadPage_Title= Please wait while the editor finishes loading...
-FacesConfigEditor_WaitForLoad_EditorTabTitle=Wait for Load
-ModelLoader_LoadingModelJobName="Loading faces-config model"
-
-###########################
-# AlignmentAction messages
-###########################
-AlignmentAction_AlignLeftAction_Tooltip=Align Left
-AlignmentAction_AlignLeftAction_Label=Align &Left
-AlignmentAction_AlignRightAction_Tooltip=Align Right
-AlignmentAction_AlignRightAction_Label=Align &Right
-AlignmentAction_AlignTopAction_Tooltip=Align Top
-AlignmentAction_AlignTopAction_Label=Align &Top
-AlignmentAction_AlignBottomAction_Tooltip=Align Bottom
-AlignmentAction_AlignBottomAction_Label=Align &Bottom
-AlignmentAction_AlignCenterAction_Tooltip=Align Center
-AlignmentAction_AlignCenterAction_Label=Align &Center
-AlignmentAction_AlignMiddleAction_Tooltip=Align Middle
-AlignmentAction_AlignMiddleAction_Label=Align &Middle
-AddEditManagedPropertyDialog_Add=Add Managed Property
-AddEditManagedPropertyDialog_Edit=Edit Managed Property
-AddEditMapEntryDialog_NullValue=Null Value
-EditListEntriesDialog_EditingListEntries=Editing list-entries
-EditMapEntriesDialog_EditingMapEntries=Editing map-entries
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/EditorPlugin.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/EditorPlugin.java
deleted file mode 100644
index d65ef67..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/EditorPlugin.java
+++ /dev/null
@@ -1,268 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui;
-
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.resource.ImageRegistry;
-import org.eclipse.jst.jsf.common.ui.internal.guiutils.Alerts;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.jsf.facesconfig.ui.preference.GEMPreferences;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.osgi.framework.BundleContext;
-
-/**
- * The main plugin class to be used in the desktop.
- */
-public class EditorPlugin extends AbstractUIPlugin {//implements IStartup {
-
-	// The shared instance.
-	private static EditorPlugin plugin;
-
-	private Logger log;
-
-	private ResourceBundle resourceBundle;
-
-	private static Alerts alerts;
-
-	private URL pluginBase;
-
-	/**
-	 * The constructor.
-	 */
-	public EditorPlugin() {
-		super();
-		plugin = this;
-	}
-	
-
-	/**
-	 * This method is called upon plug-in activation
-	 */
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-		try {
-			// get resource bundle.
-			resourceBundle = ResourceBundle
-					.getBundle("org.eclipse.jst.jsf.facesconfig.ui.EditorPluginResources"); //$NON-NLS-1$
-			alerts = new Alerts(this, resourceBundle);
-			pluginBase = getBundle().getEntry("/"); //$NON-NLS-1$
-
-			// set up logging for this plugin and everthing under it.
-			log = new Logger(this.getBundle(), resourceBundle);
-
-			// log.info("log.StartMessage", CommonPlugin.getVersion());
-		} catch (Exception ee) {
-			// only log if the logger was configured correctly.
-			if (log != null) {
-				log.error("log.msg", //$NON-NLS-1$
-						"Problems starting plug-in Faces Config Editor.", ee); //$NON-NLS-1$
-			}
-
-			throw new CoreException(new Status(IStatus.ERROR, getBundle()
-					.getSymbolicName(), IStatus.OK,
-					"Problems starting plug-in Faces Config Editor", ee)); //$NON-NLS-1$
-		}
-		
-	}
-
-	/**
-	 * This method is called when the plug-in is stopped
-	 */
-	public void stop(BundleContext context) throws Exception {
-		super.stop(context);
-		plugin = null;
-	}
-
-	/**
-	 * @return the shared instance.
-	 */
-	public static EditorPlugin getDefault() {
-		return plugin;
-	}
-
-	/**
-	 * @return the alerts objects associated with this plugin for alerting the user.
-	 */
-	public static Alerts getAlerts() {
-		return alerts;
-	}
-
-	/**
-	 * Returns a logger for the new class using this plugin for reference.
-	 * @param theClass 
-	 * @return the default root logger
-	 */
-	public static Logger getLogger(Class theClass) {
-		return getDefault().getRootLogger(); // .getLogger(theClass);
-	}
-
-	/**
-	 * Returns the plugin's root logger
-	 * @return the root logger
-	 */
-	public Logger getRootLogger() {
-		return log;
-	}
-
-	/**
-	 * Returns the plugin's resource bundle,
-	 * @return the resource bundle
-	 */
-	public ResourceBundle getResourceBundle() {
-		return resourceBundle;
-	}
-
-	/**
-	 * Returns the string from the plugin's resource bundle, or 'key' if not
-	 * found.
-	 * @param key 
-	 * @return the resource bundle string for key
-	 */
-	public static String getResourceString(String key) {
-		ResourceBundle bundle = getDefault().getResourceBundle();
-		try {
-			return (bundle != null) ? bundle.getString(key) : key;
-		} catch (MissingResourceException e) {
-			return key;
-		}
-	}
-
-	/**
-	 * Returns the standard display to be used. The method first checks, if the
-	 * thread calling this method has an associated dispaly. If so, this display
-	 * is returned. Otherwise the method returns the default display.
-	 * @return the standard display
-	 */
-	public static Display getStandardDisplay() {
-		Display display;
-		display = Display.getCurrent();
-		if (display == null) {
-			display = Display.getDefault();
-		}
-		return display;
-	}
-
-	/**
-	 * Returns the active workbench window.
-	 * 
-	 * @return the active workbench window. this can be null but I've never seen
-	 *         it.
-	 */
-	public static IWorkbenchWindow getActiveWorkbenchWindow() {
-		if (getDefault().getWorkbench() == null) {
-			return null;
-		}
-        return getDefault().getWorkbench().getActiveWorkbenchWindow();
-	}
-
-	/**
-	 * @return the active shell
-	 */
-	public static Shell getActiveShell() {
-		Shell shell = null;
-		IWorkbenchWindow workbenchWindow = getActiveWorkbenchWindow();
-		if (workbenchWindow.getShell() != null) {
-			shell = workbenchWindow.getShell();
-		} else {
-			shell = new Shell();
-		}
-		return shell;
-	}
-
-	/**
-	 * Returns a shared image for the given name
-	 * <p>
-	 * Note: Images returned from this method will be automitically disposed of
-	 * when this plug-in shuts down. Callers must not dispose of these images
-	 * themselves.
-	 * </p>
-	 * 
-	 * @param name
-	 *            the image name found in /icons (with extension)
-	 * @return the image, null on error or not found.
-	 */
-	public Image getImage(String name) {
-		if (name == null) {
-			return null;
-		}
-
-		ImageRegistry images = getImageRegistry();
-		Image image = images.get(name);
-		if (image == null) {
-			try {
-				ImageDescriptor id = ImageDescriptor.createFromURL(new URL(
-						pluginBase, "icons/" + name)); //$NON-NLS-1$
-				images.put(name, id);
-
-				image = images.get(name);
-			} catch (MalformedURLException ee) {
-				// log.EditorPlugin.image.error=Image {0} not found.
-				log.error("log.msg", "log.EditorPlugin.image.error", name, ee); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-		}
-		return image;
-	}
-
-	/**
-	 * Returns an image descriptor for the image file at the given plug-in
-	 * relative path.
-	 * 
-	 * @param path
-	 *            the path
-	 * @return the image descriptor
-	 */
-	public ImageDescriptor getImageDescriptor(String path) {
-		if (path == null) {
-			return null;
-		}
-
-		ImageRegistry images = getImageRegistry();
-		ImageDescriptor id = images.getDescriptor(path);
-		if (id == null) {
-			try {
-				id = ImageDescriptor.createFromURL(new URL(pluginBase, "icons/" //$NON-NLS-1$
-						+ path));
-				images.put(path, id);
-			} catch (MalformedURLException ee) {
-				// log.EditorPlugin.image.error=Image {0} not found.
-				log.error("log.msg", "log.EditorPlugin.image.error", path, ee); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-		}
-		return id;
-	}
-
-	/**
-	 * Returns this plugin's unique identifier
-	 * 
-	 * @return this plugin's unique identifier
-	 * 
-	 */
-	public static String getPluginId() {
-		return getDefault().getBundle().getSymbolicName();
-	}
-
-	protected void initializeDefaultPluginPreferences() {
-		GEMPreferences.initializeDefaults();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/EditorPluginResources.properties b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/EditorPluginResources.properties
deleted file mode 100644
index a8dd34c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/EditorPluginResources.properties
+++ /dev/null
@@ -1,85 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2008 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-common.error=Error
-common.warning=Warning
-log.StartMessage=Faces Config Editor initialized on eclipse version {0}.
-####################################################
-# Resource message for Logging
-####################################################
-
-log.msg={0}
-
-log.EditorPlugin=Faces Config Editor Plugin initialized on eclipse version {0}.
-log.EditorPlugin.image.error=Image ''{0}'' not found.
-
-####################################################
-# Resource message for Alert
-####################################################
-
-Pageflow.PageflowEditor.Alert.errorOpenEditorTitle 	= Open Pageflow Error
-Pageflow.PageflowEditor.Alert.errorOpenEditorInfo 	= An error occured during opening the editor.
-Pageflow.PageflowEditor.Alert.errorSaveFileTitle 	= Save Pageflow Error
-Pageflow.PageflowEditor.Alert.errorSaveFileInfo 	= The current pageflow model could not be saved.
-Pageflow.PageflowEditor.Alert.nullModelManager 	= No model manager found for saving the file.
-Pageflow.PageflowEditor.Alert.errorOpenEditor4JSFTitle 	= Open JSF File Error
-Pageflow.PageflowEditor.Alert.errorOpenEditor4JSFInfo 	= The JSF file ''{0}'' does not exist.
-Pageflow.PageflowEditor.Alert.errorOpenEditor4JSFFolderInfo = Cannot open the page in the page editor.
-
-Pageflow.PageflowEditor.Alert.confirmCreateNewJSFFileTitle = Confirm
-Pageflow.PageflowEditor.Alert.confirmCreateNewJSFFile = No jsp file is related with this page.
-
-Pageflow.PageflowEditor.Alert.syncWithFacesConfigTitle = Confirm
-Pageflow.PageflowEditor.Alert.syncWithFacesConfigInfo = Synchronizing with faces-config will update the current pageflow model! \nThis command CAN NOT undo. Are you sure?
-Pageflow.PageflowEditor.Alert.errorSyncPageflowModel = The current pageflow model could not be synchronized with the specified faces-config file.
-
-Pageflow.PageflowEditor.Alert.updateFacesConfigTitle = Confirm
-Pageflow.PageflowEditor.Alert.updateFacesConfigInfo = Update the related faces config file. Are you sure?
-Pageflow.PageflowEditor.Alert.errorUpdateFacesConfig = The related faces-config file could not be updated.
-
-Pageflow.Transform.Alert.ResourceTitle = Resource Error
-Pageflow.Transform.Alert.LoadResourceError = Error loading resource
-Pageflow.Transform.Alert.SaveResourceError = Error saving resource
-
-Pageflow.PageflowEditor.Alert.DNDResourceTitle	= Pageflow Creation Error 
-Pageflow.PageflowEditor.Alert.ExistingPage	= The web page ''{0}'' already exists in current PageFlow.
-Pageflow.PageflowEditor.Alert.ExistingAction	= The action ''{0}'' already exists in current PageFlow.
-Pageflow.PageflowEditor.Alert.PageFromOtherProject 	= The web page ''{0}'' does not belong to current project.
-
-Pageflow.FacesConfig.Alert.ResourceTitle = Faces Configuration File Warning
-Pageflow.FacesConfig.Alert.LoadFileError = Invalid content in faces configuration file ''{0}''.
-Pageflow.FacesConfig.Alert.ErrorUpdateFacesConfigFromPageflow = Invalid content in faces configuration file. \nThe pageflow diagram can not be transformed.
-Pageflow.FacesConfig.Alert.SaveFileError = Failed to save faces configuration file ''{0}''.
-
-ManagedBeanInitializationSection.Remove.Title	= Confirm Remove
-ManagedBeanInitializationSection.RemoveManagedProperty = Are you sure you want to remove all the managed-properties?
-ManagedBeanInitializationSection.RemoveMapEntries = Are you sure you want to remove map-entries?
-ManagedBeanInitializationSection.RemoveListEntries = Are you sure you want to remove list-entries?
-
-Alert.Error.CompletionProcessor.HTML.AttributeCompletionProp=No completions found
-Alert.Info.JSPPageEditorContributor.CreateAction.Message=Sample Action Executed
-
-Pageflow.PageflowEditor.Error.invalidPageflowFile 	= The specified input is not a valid pageflow.
-Pageflow.PageflowEditor.Error.invalidPageflowModel 	= The model in the pageflow file is not a valid pageflow model.
-Pageflow.PageflowEditor.Error.canNotOpenEditor4JSF 	= The jsf file can not be opened in the editor.
-Pageflow.PageflowEditor.Error.ResourceChange 	= Failed in the resource change.
-Pageflow.PageflowEditor.Error.canNotShowPropertyView	= Failed to show property sheet view.
-Pageflow.PageflowEditor.Error.canNotShowPaletteView 	= Failed to show palette sheet view.
-
-Pageflow.PageflowResources.Error.invalidResourceBundle     = The specified resource file is not a valid resourece bundle file.
-Pageflow.Transform.Resource.LoadError = Error loading resource ''{0}''
-
-Pageflow.PageflowEditor.Error.UnableRemoveAllMarkers 	= Unable to remove all markers
-Pageflow.PageflowEditor.Error.UnableAddMarker 	= Unable to add a marker
-Pageflow.PageflowEditor.Error.UnableRemoveMarker 	= Unable to remove a marker
-Pageflow.PageflowEditor.Error.invalidMarkerAttribute 	= Unable to get marker's attribute
-
-PageflowEditor.Encoding.Unsupported 			= Unsupported Encoding.
-PageflowEditor.Transform.Error.GetPageflowFromFacesConfig 	= Failed to get pageflow model from faces-config'a navigation rule.
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/FacesConfigActionBarContributor.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/FacesConfigActionBarContributor.java
deleted file mode 100644
index 7171e35..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/FacesConfigActionBarContributor.java
+++ /dev/null
@@ -1,179 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui;
-
-import org.eclipse.emf.edit.ui.action.EditingDomainActionBarContributor;
-import org.eclipse.jface.action.ICoolBarManager;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.IStatusLineManager;
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.PageflowActionBarContributor;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.PageflowEditor;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.part.EditorActionBarContributor;
-import org.eclipse.ui.part.MultiPageEditorActionBarContributor;
-import org.eclipse.wst.sse.ui.StructuredTextEditor;
-import org.eclipse.wst.xml.ui.internal.tabletree.SourcePageActionContributor;
-
-/**
- * The faces-config editor itself is composed by a set of pages. Each page has
- * its own action contributor. This FacesConfigActionBarContributor will work as
- * a proxy to delegate the action contributing to target nested action
- * contributor.
- * 
- * @author hmeng
- */
-
-public class FacesConfigActionBarContributor extends
-		MultiPageEditorActionBarContributor {
-	private SourcePageActionContributor sourceActionContributor = null;
-
-	private PageflowActionBarContributor pageflowActionContributor = null;
-
-	private EditingDomainActionBarContributor formbasedPageActionContributor = null;
-
-	private IEditorPart activeNestedEditor;
-
-	/**
-	 * Default constructor
-	 */
-	public FacesConfigActionBarContributor() {
-		super();
-	}
-
-	public void setActivePage(IEditorPart activeEditor) {
-		if (activeEditor != activeNestedEditor) {
-			if (getActionContributor(activeNestedEditor) != null) {
-				getActionContributor(activeNestedEditor).setActiveEditor(
-						activeEditor);
-			}
-			activeNestedEditor = activeEditor;
-			EditorActionBarContributor activeContributor = getActionContributor(activeEditor);
-			if (activeContributor != null)
-				activeContributor.setActiveEditor(activeEditor);
-			else
-				super.setActiveEditor(activeEditor);
-			updateActionBars();
-		}
-	}
-
-	public void contributeToCoolBar(ICoolBarManager coolBarManager) {
-		EditorActionBarContributor activeContributor = getActionContributor(activeNestedEditor);
-		if (activeContributor != null)
-			activeContributor.contributeToCoolBar(coolBarManager);
-	}
-
-	public void contributeToMenu(IMenuManager menuManager) {
-		EditorActionBarContributor activeContributor = getActionContributor(activeNestedEditor);
-		if (activeContributor != null) {
-			activeContributor.contributeToMenu(menuManager);
-		}
-	}
-
-	public void contributeToStatusLine(IStatusLineManager statusLineManager) {
-		EditorActionBarContributor activeContributor = getActionContributor(activeNestedEditor);
-		if (activeContributor != null) {
-			activeContributor.contributeToStatusLine(statusLineManager);
-		}
-	}
-
-	public void contributeToToolBar(IToolBarManager toolBarManager) {
-		EditorActionBarContributor activeContributor = getActionContributor(activeNestedEditor);
-		if (activeContributor != null) {
-			activeContributor.contributeToToolBar(toolBarManager);
-		}
-	}
-
-	public void dispose() {
-		getFormbasedPageActionContributor().dispose();
-		getPageflowActionContributor().dispose();
-		getSourceActionContributor().dispose();
-	}
-
-	public IActionBars getActionBars() {
-		EditorActionBarContributor activeContributor = getActionContributor(activeNestedEditor);
-		if (activeContributor != null) {
-			return activeContributor.getActionBars();
-		}
-        return super.getActionBars();
-	}
-
-	public IWorkbenchPage getPage() {
-		return super.getPage();
-	}
-
-	public void init(IActionBars bars, IWorkbenchPage page) {
-		getPageflowActionContributor().init(bars, page);
-		getSourceActionContributor().init(bars, page);
-		getFormbasedPageActionContributor().init(bars, page);
-		super.init(bars, page);
-	}
-
-//	private IEditorPart getActiveNestedEditor(IEditorPart targetEditor) {
-//		IEditorPart activeNestedEditor_;
-//		if (targetEditor instanceof FormEditor) {
-//			activeNestedEditor_ = ((FormEditor) targetEditor).getActiveEditor();
-//		} else {
-//			activeNestedEditor_ = targetEditor;
-//		}
-//		return activeNestedEditor_;
-//	}
-
-	private EditorActionBarContributor getActionContributor(
-			IEditorPart activeNestedEditor_) {
-		EditorActionBarContributor activeContributor = null;
-		if (activeNestedEditor_ instanceof PageflowEditor) {
-			activeContributor = getPageflowActionContributor();
-		} else if (activeNestedEditor_ instanceof StructuredTextEditor) {
-			activeContributor = getSourceActionContributor();
-		} else if (activeNestedEditor_ != null) {
-			activeContributor = getFormbasedPageActionContributor();
-		}
-		return activeContributor;
-	}
-
-	private SourcePageActionContributor getSourceActionContributor() {
-		if (sourceActionContributor == null) {
-			sourceActionContributor = new SourcePageActionContributor();
-		}
-		return sourceActionContributor;
-	}
-
-	private EditingDomainActionBarContributor getFormbasedPageActionContributor() {
-		if (formbasedPageActionContributor == null) {
-			formbasedPageActionContributor = new MyEditingDomainActionContributor();
-		}
-		return formbasedPageActionContributor;
-	}
-
-	private PageflowActionBarContributor getPageflowActionContributor() {
-		if (pageflowActionContributor == null) {
-			pageflowActionContributor = new PageflowActionBarContributor();
-		}
-		return pageflowActionContributor;
-
-	}
-
-	/**
-	 * update the action bars
-	 */
-	public void updateActionBars() {
-		EditorActionBarContributor activeContributor = getActionContributor(activeNestedEditor);
-		if (activeContributor instanceof INestedActionContributor)
-			((INestedActionContributor) activeContributor).update();
-		// getActionBars().getMenuManager().removeAll();
-		// activeContributor.contributeToMenu(getActionBars().getMenuManager());
-		getActionBars().updateActionBars();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/FacesConfigEditor.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/FacesConfigEditor.java
deleted file mode 100644
index 15db4c0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/FacesConfigEditor.java
+++ /dev/null
@@ -1,1411 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.EventObject;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-import java.util.concurrent.atomic.AtomicBoolean;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IResourceChangeEvent;
-import org.eclipse.core.resources.IResourceChangeListener;
-import org.eclipse.core.resources.IResourceDelta;
-import org.eclipse.core.resources.IResourceDeltaVisitor;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.emf.common.command.BasicCommandStack;
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.resource.ResourceSet;
-import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.emf.edit.domain.IEditingDomainProvider;
-import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
-import org.eclipse.emf.edit.provider.ReflectiveItemProviderAdapterFactory;
-import org.eclipse.emf.edit.provider.resource.ResourceItemProviderAdapterFactory;
-import org.eclipse.gef.commands.CommandStack;
-import org.eclipse.gef.commands.CommandStackListener;
-import org.eclipse.gef.editparts.ZoomManager;
-import org.eclipse.gef.ui.actions.ActionRegistry;
-import org.eclipse.gef.ui.actions.EditorPartAction;
-import org.eclipse.gef.ui.actions.SaveAction;
-import org.eclipse.gef.ui.actions.UpdateAction;
-import org.eclipse.gef.ui.views.palette.PaletteView;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jst.jsf.common.ui.internal.actions.IOpenPage;
-import org.eclipse.jst.jsf.core.IJSFCoreConstants;
-import org.eclipse.jst.jsf.facesconfig.edit.provider.FacesConfigItemProviderAdapterFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType;
-import org.eclipse.jst.jsf.facesconfig.ui.page.ComponentsPage;
-import org.eclipse.jst.jsf.facesconfig.ui.page.IntroductionPage;
-import org.eclipse.jst.jsf.facesconfig.ui.page.ManagedBeanPage;
-import org.eclipse.jst.jsf.facesconfig.ui.page.OthersPage;
-import org.eclipse.jst.jsf.facesconfig.ui.page.OverviewPage;
-import org.eclipse.jst.jsf.facesconfig.ui.page.WaitForLoadPage;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.DelegatingZoomManager;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.PageflowEditor;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.command.DelegatingCommandStack;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.command.EMFCommandStackGEFAdapter;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.layout.PageflowLayoutManager;
-import org.eclipse.jst.jsf.facesconfig.ui.preference.GEMPreferences;
-import org.eclipse.jst.jsf.facesconfig.util.FacesConfigArtifactEdit;
-import org.eclipse.swt.custom.CTabFolder;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.IEditorActionBarContributor;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.IFileEditorInput;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.actions.WorkspaceModifyOperation;
-import org.eclipse.ui.dialogs.SaveAsDialog;
-import org.eclipse.ui.forms.editor.FormEditor;
-import org.eclipse.ui.forms.editor.FormPage;
-import org.eclipse.ui.forms.editor.IFormPage;
-import org.eclipse.ui.ide.IDE;
-import org.eclipse.ui.ide.IGotoMarker;
-import org.eclipse.ui.internal.BaseSaveAction;
-import org.eclipse.ui.part.FileEditorInput;
-import org.eclipse.ui.views.contentoutline.IContentOutlinePage;
-import org.eclipse.ui.views.properties.IPropertySheetPage;
-import org.eclipse.ui.views.properties.tabbed.ITabbedPropertySheetPageContributor;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
-import org.eclipse.wst.common.project.facet.core.IFacetedProject;
-import org.eclipse.wst.common.project.facet.core.IProjectFacet;
-import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
-import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
-import org.eclipse.wst.sse.ui.StructuredTextEditor;
-
-/**
- * This is the main editor for the faces-config file.  Note that the model
- * load can involve long-running socket operations (shouldn't but can),
- * so the editor UI is load asynchronously.  This is means that any 
- * operations that need to be executed on editor open should be run
- * using AddPagesTask.pageSafeExecute() to ensure that they occur
- * after all editor pages have finished loading.
- * 
- * @author sfshi
- * 
- */
-public class FacesConfigEditor extends FormEditor implements
-		IEditingDomainProvider, ISelectionProvider {
-
-    /**
-     * This editor's ID.  TODO: this should prob be in plugin.properties?
-     */
-    public static final String EDITOR_ID = "org.eclipse.jst.jsf.facesconfig.ui.FacesConfigEditor"; //$NON-NLS-1$
-    
-    
-    /**
-     * Page id for Source page.   Used for testing only.
-     */
-    public static final String SOURCE_PAGE_ID = "SourcePageId"; //$NON-NLS-1$
-	/**
-	 * editing domain that is used to track all changes to the model
-	 */
-	private AdapterFactoryEditingDomain editingDomain;
-
-	/**
-	 * adapter factory used for providing views of the model
-	 */
-	private ComposedAdapterFactory adapterFactory;
-
-	/** id of the pageflowPage */
-	private int pageflowPageID;
-
-	private int managedBeanPageID;
-
-	private int componentsPageID;
-
-	private int othersPageID;
-
-	private int sourcePageId;
-
-	private PageflowEditor pageflowPage;
-
-	/** The source text editor. */
-	private StructuredTextEditor sourcePage;
-
-	private Collection selectionChangedListeners = new ArrayList();
-
-	private ISelection editorSelection = StructuredSelection.EMPTY;
-
-	private IContentOutlinePage outlinePage;
-
-	private IProject currentProject;
-
-	private boolean isWebProject;
-	
-	private ModelLoader        _modelLoader;
-	
-	/**
-	 * only true once dispose() has been called
-	 * used to signal that the editor was disposed.
-	 */
-	private boolean _isDisposed; // = false;
-	
-    /**
-     * Used to load editor pages when the model is loaded
-     */
-    private final AddPagesTask     _addPagesTask = new AddPagesTask();
-        
-	/**
-	 * Default constructor
-	 */
-	public FacesConfigEditor() {
-		initializeEMF();
-	}
-
-	/**
-	 * This listens for workspace changes. <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected IResourceChangeListener resourceChangeListener = new IResourceChangeListener() {
-		public void resourceChanged(IResourceChangeEvent event) {
-			// Only listening to these.
-			// if (event.getType() == IResourceDelta.POST_CHANGE)
-			{
-				IResourceDelta delta = event.getDelta();
-				try {
-					class ResourceDeltaVisitor implements IResourceDeltaVisitor {
-						protected ResourceSet resourceSet = editingDomain
-								.getResourceSet();
-
-						@SuppressWarnings("hiding") 
-                        protected Collection changedResources = new ArrayList();
-
-						@SuppressWarnings("hiding") 
-                        protected Collection removedResources = new ArrayList();
-
-						public boolean visit(IResourceDelta delta_) {
-							if (delta_.getFlags() != IResourceDelta.MARKERS
-									&& delta_.getResource().getType() == IResource.FILE) {
-								if ((delta_.getKind() & (IResourceDelta.CHANGED | IResourceDelta.REMOVED)) != 0) {
-									Resource resource = resourceSet
-											.getResource(URI.createURI(delta_
-													.getFullPath().toString()),
-													false);
-									if (resource != null) {
-										if ((delta_.getKind() & IResourceDelta.REMOVED) != 0) {
-											removedResources.add(resource);
-										} else {
-											changedResources.add(resource);
-										}
-									}
-								}
-							}
-
-							return true;
-						}
-
-						public Collection getChangedResources() {
-							return changedResources;
-						}
-
-						public Collection getRemovedResources() {
-							return removedResources;
-						}
-					}
-
-					ResourceDeltaVisitor visitor = new ResourceDeltaVisitor();
-					delta.accept(visitor);
-
-					if (!visitor.getRemovedResources().isEmpty()) {
-						removedResources.addAll(visitor.getRemovedResources());
-						if (!isDirty()) {
-							getSite().getShell().getDisplay().asyncExec(
-									new Runnable() {
-										public void run() {
-											getSite().getPage().closeEditor(
-													FacesConfigEditor.this,
-													false);
-											FacesConfigEditor.this.dispose();
-										}
-									});
-						}
-					}
-
-					if (!visitor.getChangedResources().isEmpty()) {
-						changedResources.addAll(visitor.getChangedResources());
-					}
-				} catch (CoreException exception) {
-					// log it.
-					EditorPlugin.getDefault().getLog().log(
-							new Status(IStatus.ERROR, EditorPlugin
-									.getPluginId(), IStatus.OK, exception
-									.getMessage() == null ? "" : exception //$NON-NLS-1$
-									.getMessage(), exception));
-				}
-			}
-		}
-	};
-
-	/**
-	 * Resources that have been removed since last activation.
-	 * 
-	 * @generated
-	 */
-	Collection removedResources = new ArrayList();
-
-	/**
-	 * Resources that have been changed since last activation.
-	 * 
-	 * @generated
-	 */
-	Collection changedResources = new ArrayList();
-
-	/**
-	 * Resources that have been saved.
-	 * 
-	 * @generated
-	 */
-	Collection savedResources = new ArrayList();
-
-	/**
-	 * Initializes the EMF support.
-	 */
-	private void initializeEMF() {
-		// create an adapter factory that yields item providers
-		List factories = new ArrayList();
-		factories.add(new ResourceItemProviderAdapterFactory());
-		factories.add(new FacesConfigItemProviderAdapterFactory());
-		factories.add(new ReflectiveItemProviderAdapterFactory());
-		adapterFactory = new ComposedAdapterFactory(factories);
-
-		// create the command stack that will notify this editor as commands are
-		// executed
-		BasicCommandStack commandStack = new BasicCommandStack();
-		commandStack
-				.addCommandStackListener(new org.eclipse.emf.common.command.CommandStackListener() {
-					public void commandStackChanged(final EventObject event) {
-						getContainer().getShell().getDisplay().asyncExec(
-								new Runnable() {
-									public void run() {
-										editorDirtyStateChanged();
-										getActionBarContributor()
-												.updateActionBars();
-									}
-								});
-					}
-				});
-		// commandStack.addCommandStackListener(this);
-		// create the editing domain with a special command stack
-		editingDomain = new AdapterFactoryEditingDomain(adapterFactory,
-				commandStack, new HashMap());
-	}
-
-	/*
-	 * @see org.eclipse.ui.IEditorPart#init(org.eclipse.ui.IEditorSite,
-	 *      org.eclipse.ui.IEditorInput)
-	 */
-	public void init(IEditorSite site, IEditorInput input)
-			throws PartInitException {
-		try {
-			super.init(site, input);
-		} catch (Exception e) {
-			MessageDialog.openError(null,
-					EditorMessages.FacesConfigEditor_Error_OpenModel_Title,
-					EditorMessages.FacesConfigEditor_Error_OpenModel);
-			throw new PartInitException(
-					EditorMessages.FacesConfigEditor_Error_OpenModel);
-		}
-
-		setPartName(input.getName());
-		if (!isValidInput(input)) {
-			PlatformUI.getWorkbench().getActiveWorkbenchWindow()
-					.getActivePage().openEditor(input,
-							"org.eclipse.ui.DefaultTextEditor"); //$NON-NLS-1$
-
-			close(false);
-			return;
-		}
-
-		createActions();
-
-		ResourcesPlugin.getWorkspace().addResourceChangeListener(
-				resourceChangeListener, IResourceChangeEvent.POST_CHANGE);
-	}
-
-	/*
-	 * @see org.eclipse.ui.part.EditorPart#setInput(org.eclipse.ui.IEditorInput)
-	 */
-	protected void setInput(IEditorInput input) 
-	{
-        isWebProject = matches(input);
-        super.setInput(input);
-
-		IFile inputFile = (IFile) input.getAdapter(IFile.class);
-		if (inputFile != null) 
-		{
-			final IProject project = inputFile.getProject();
-			final IPath inputPath = inputFile.getFullPath();
-			
-			_modelLoader = new ModelLoader(); 
-			_modelLoader.load(project, inputPath, isWebProject, _addPagesTask);
-		}
-	}
-
-
-	protected void addPages() 
-	{
-	    // try loading wait page
-	    // if we get to here before model load completes,
-	    // then wait page will give the user the indication
-	    // that something is happening in the background before
-	    // the editor full loads.
-	    // if the model is already loaded, this call should do nothing
-	    _addPagesTask.maybeAddWaitPage();
-	}
-
-	/**
-	 * This runnable is used to used to manage the loading of the 
-	 * editor pages for editor in a deferred fashion.  Because the model
-	 * loading for this editor can be noticably long and (unfortunately)
-	 * may involve socket calls that block, loadModel(), runs this on a
-	 * separate thread. This class is intended to be used in two ways:
-	 * 
-	 * 1) by the model loading code to signal it is finished by executing
-	 * the run() via a display.asyncExec().
-	 * 
-	 * 2) by the addPages() call back on the the main editor as a way to
-	 * load a "Please wait for loading" page if the loading is still running
-	 * by the time the editor is ready to visualize itself.
-	 * 
-	 * Note that in both cases methods of this class *must* be running on the
-	 * main display thread.
-	 * 
-	 * @author cbateman
-	 *
-	 */
-	private class AddPagesTask extends ModelLoader.ModelLoaderComplete
-	{
-	    private final AtomicBoolean    _arePagesLoaded = new AtomicBoolean(false);     // set to true when the regular editor pages are loaded
-	    private FormPage               _waitPage;
-	    private List<Runnable>         _deferredRunnables = new ArrayList<Runnable>();
-	    
-	    /**
-	     * If the editor pages are loaded, runnable.run() is invoked immediately
-	     * If the editor pages are not loaded yet, runnable is queued and will be 
-	     * executed in the order they are added immediately after the pages are loaded
-	     * 
-	     * @param runnable
-	     */
-	    public synchronized void pageSafeExecute(Runnable runnable)
-	    {
-	        if (!_isDisposed)
-	        {
-    	        if (!_arePagesLoaded.get())
-    	        {
-    	            _deferredRunnables.add(runnable);
-    	        }
-    	        else
-    	        {
-    	            runnable.run();
-    	        }
-	        }
-	    }
-	    
-        /**
-         * @return true if the pages are loaded
-         */
-        public synchronized boolean getArePagesLoaded() 
-        {
-            return _arePagesLoaded.get();
-        }
-        
-        /**
-         * Remove the wait page if present.
-         */
-        public synchronized void removeWaitPage()
-        {
-            if (_waitPage != null 
-            		&& !_waitPage.getPartControl().isDisposed()) 
-            {
-                int index = _waitPage.getIndex();
-                
-                if (index >= 0)
-                {
-                    removePage(index);
-                }
-            }
-        }
-        
-        /**
-         * Add the wait page if the main pages aren't already loaded
-         */
-        public synchronized void maybeAddWaitPage()
-        {
-            // only load the wait page if the other pages haven't been loaded
-            if (!getArePagesLoaded())
-            {
-                _waitPage = new WaitForLoadPage(FacesConfigEditor.this, "WaitForLoad", EditorMessages.FacesConfigEditor_WaitForLoad_EditorTabTitle); //$NON-NLS-1$
-                
-                try
-                {
-                    addPage(0,_waitPage);
-                }
-                catch(PartInitException pie)
-                {
-                    _waitPage =null;
-                    EditorPlugin.getDefault().getLog().log(
-                            new Status(IStatus.ERROR, EditorPlugin.getPluginId(),
-                                    IStatus.OK, pie.getMessage() == null ? "" : pie //$NON-NLS-1$
-                                            .getMessage(), pie));
-                }
-            }
-        }
-
-        /**
-         * Must be run on the UI thread
-         */
-        public void doRun(FacesConfigArtifactEdit  edit) 
-        {
-            synchronized(this)
-            {
-                // ensure wait page gets removed
-                removeWaitPage();
-                
-                if (!getArePagesLoaded()
-                        && !_isDisposed)  // NOTE: we assume that access to variable does not need to
-                                          // to be synchronous since this method must 
-                                          // be run on the UI thread.  The only way
-                                          // that isDisposed should be true is if model loading took a long
-                                          // time and the user closed the editor before it completed (trigger dispose to be called)
-                {
-                    try 
-                    {
-                        if (isWebProject && edit != null && edit.getFacesConfig() != null) 
-                        {
-                            // only add the intro editor if the preference
-                            // is set to do so.
-                            if (GEMPreferences.getShowIntroEditor())
-                            {
-                                IntroductionPage page1 = new IntroductionPage(FacesConfigEditor.this);
-                                addPage(page1, FacesConfigEditor.this.getEditorInput());
-                            }
-                            
-                            IFormPage overviewPage = new OverviewPage(FacesConfigEditor.this);
-                            addPage(overviewPage, FacesConfigEditor.this.getEditorInput());
-        
-                            // Page flow
-                            createAndAddPageflowPage();
-        
-                            // pages
-                            IFormPage managedBeanPage = new ManagedBeanPage(FacesConfigEditor.this);
-                            managedBeanPageID = addPage(managedBeanPage, FacesConfigEditor.this.getEditorInput());
-                            IFormPage componentsPage = new ComponentsPage(FacesConfigEditor.this);
-                            componentsPageID = addPage(componentsPage, FacesConfigEditor.this.getEditorInput());
-                            IFormPage othersPage = new OthersPage(FacesConfigEditor.this);
-                            othersPageID = addPage(othersPage, FacesConfigEditor.this.getEditorInput());
-                        }
-        
-                        sourcePage = new StructuredTextEditor();
-                        sourcePage.setEditorPart(FacesConfigEditor.this);
-                        sourcePageId = addPage(sourcePage, FacesConfigEditor.this.getEditorInput());
-                        setPageText(sourcePageId, EditorMessages.FacesConfigEditor_Source_TabName);
-                        sourcePage.update();
-
-                        /* Bug 263806 - Problems saving file from source tab of faces-config editor
-                         * 
-                         * Getting the save action and calling partDeactivated on it will attach
-                         * the internal listener necessary for the save action to receive subsequent
-                         * property change events. (There is no public method available to just hook
-                         * up the internal listener to our part.)
-                         */
-                        IAction sourcePageSaveAction = sourcePage.getAction("save"); //$NON-NLS-1$
-                        if (sourcePageSaveAction instanceof BaseSaveAction) {
-                        	((BaseSaveAction)sourcePageSaveAction).partDeactivated(FacesConfigEditor.this);
-                        }
-
-                        // default active page to 0
-                        setActivePage(0);
-
-                        // execute deferred runnables
-                        for (Runnable runnable : _deferredRunnables)
-                        {
-                            runnable.run();
-                        }
-                        
-                        // flag the fact that the regular editor pages have been added
-                        _arePagesLoaded.set(true);
-                    } catch (PartInitException e) {
-                        EditorPlugin.getDefault().getLog().log(
-                                new Status(IStatus.ERROR, EditorPlugin.getPluginId(),
-                                        IStatus.OK, e.getMessage() == null ? "" : e //$NON-NLS-1$
-                                                .getMessage(), e));
-                    }
-                }
-            }
-        }
-	}
-	
-	/**
-	 * Creates the pageflow page of the multi-page editor.
-	 * @throws PartInitException 
-	 */
-	protected void createAndAddPageflowPage() throws PartInitException {
-		pageflowPage = new PageflowEditor(this);
-		pageflowPageID = addPage(pageflowPage, getEditorInput());
-		setPageText(pageflowPageID,
-				EditorMessages.FacesConfigEditor_Pageflow_TabName);
-		addPageActionRegistry(pageflowPage);
-		pageflowPage.getModelsTransform().setFacesConfig(getFacesConfig());
-		pageflowPage.getModelsTransform().setPageflow(
-				pageflowPage.getPageflow());
-		boolean fornew = pageflowPage.getModelsTransform()
-				.updatePageflowModelFromEMF();
-		pageflowPage.setGraphicalViewerContents(pageflowPage.getPageflow());
-		if (fornew) {
-			PageflowLayoutManager.getInstance().layoutPageflow(
-					pageflowPage.getPageflow());
-		}
-		pageflowPage.getModelsTransform().setListenToNotify(true);
-	}
-
-	/**
-	 * TODO: this is used only for testing
-	 * @return the page flow editor
-	 */
-	public PageflowEditor getPageflowPage() {
-		return pageflowPage;
-	}
-
-	/**
-	 * get the action's registry of sub pages.
-	 * @param page 
-	 * 
-	 */
-	protected void addPageActionRegistry(IEditorPart page) {
-		if (page != null) {
-			ActionRegistry pageActionRegisty = (ActionRegistry) page
-					.getAdapter(ActionRegistry.class);
-			if (pageActionRegisty != null) {
-				for (Iterator iter = pageActionRegisty.getActions(); iter
-						.hasNext();) {
-					getActionRegistry().registerAction((IAction) iter.next());
-				}
-			}
-		}
-	}
-
-	/** the editor's action registry */
-	private ActionRegistry actionRegistry = null;
-
-	/**
-	 * Returns the action registry of this editor.
-	 * 
-	 * @return - the action registry
-	 */
-	protected ActionRegistry getActionRegistry() {
-		if (null == actionRegistry)
-			actionRegistry = new ActionRegistry();
-
-		return actionRegistry;
-	}
-
-	/**
-	 * Returns the root object of the configuration model.
-	 * 
-	 * @return the root object.  Should not, but may return null.
-	 */
-	public FacesConfigType getFacesConfig() 
-	{
-	    FacesConfigArtifactEdit  edit = _modelLoader.getEdit();
-	    if (edit != null)
-	    {
-	        return edit.getFacesConfig();
-	    }
-	    return null;
-	}
-
-	/*
-	 * @see org.eclipse.ui.ISaveablePart#isDirty()
-	 */
-	public boolean isDirty() { 
-		return ((BasicCommandStack) editingDomain.getCommandStack()) 
-				.isSaveNeeded()
-				|| super.isDirty(); 
-	}
-
-	/**
-	 * This class listens for command stack changes of the pages contained in
-	 * this editor and decides if the editor is dirty or not.
-	 */
-	private class MultiPageCommandStackListener implements CommandStackListener {
-
-		/** the observed command stacks */
-		private List commandStacks = new ArrayList(2);
-
-		/** to get the editorpart from command stack */
-		private HashMap mapEditorCommandStack = new HashMap();
-
-		private boolean saveLocation = false;
-
-		/**
-		 * Adds a <code>CommandStack</code> to observe.
-		 * 
-		 * @param commandStack
-		 * @param editor 
-		 */
-		public void addCommandStack(CommandStack commandStack,
-				IEditorPart editor) {
-			if (commandStack == null)
-				return;
-
-			if (mapEditorCommandStack.get(commandStack) == editor)
-				return;
-
-			commandStacks.add(commandStack);
-			commandStack.addCommandStackListener(this);
-			mapEditorCommandStack.put(commandStack, editor);
-		}
-
-		/**
-		 * set the dirty status for the models of different editor
-		 * 
-		 * @param editor -
-		 *            editor, e.g., pageflow or databinding page.
-		 * @param dirty -
-		 *            true or false
-		 */
-		private void setEditorDirty(IEditorPart editor, boolean dirty) {
-            // do nothing
-		}
-
-		/** the list of action ids that are to CommandStack actions */
-		private List stackActionIDs = new ArrayList();
-
-		/**
-		 * Updates the specified actions.
-		 * 
-		 * @param actionIds -
-		 *            the list of ids of actions to update
-		 */
-		private void updateActions(List actionIds) {
-			for (Iterator ids = actionIds.iterator(); ids.hasNext();) {
-				IAction action = getActionRegistry().getAction(ids.next());
-				if (null != action && action instanceof UpdateAction) {
-					((UpdateAction) action).update();
-				}
-			}
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see CommandStackListener#commandStackChanged(java.util.EventObject)
-		 */
-		public void commandStackChanged(EventObject event) {
-			// enable or disable the actions
-			updateActions(stackActionIDs);
-			if (((CommandStack) event.getSource()).isDirty()) {
-				// set the editor's model dirty status
-				setEditorDirty((IEditorPart) mapEditorCommandStack
-						.get(event.getSource()), true);
-				// at least one command stack is dirty,
-				// so the multi page editor is dirty too
-				setDirty(true);
-			} else {
-				// set the editor's model dirty status, if it is from not save
-				// location.
-				if (!saveLocation) {
-					setEditorDirty((IEditorPart) mapEditorCommandStack
-							.get(event.getSource()), true);
-					setDirty(true);
-				} else {
-					setDirty(false);
-				}
-			}
-		}
-
-		/** the pageflow page editor's dirty state */
-		private boolean isDirty = false;
-
-		/**
-		 * Changes the dirty state.
-		 * 
-		 * @param dirty -
-		 *            dirty state
-		 */
-		public void setDirty(boolean dirty) {
-			if (isDirty != dirty) {
-				isDirty = dirty;
-				firePropertyChange(IEditorPart.PROP_DIRTY);
-			}
-		}
-
-		/**
-		 * Disposed the listener
-		 */
-		public void dispose() {
-			for (Iterator stacks = commandStacks.iterator(); stacks.hasNext();) {
-				((CommandStack) stacks.next()).removeCommandStackListener(this);
-			}
-			commandStacks.clear();
-		}
-
-		/**
-		 * Marks every observed command stack beeing saved. This method should
-		 * be called whenever the editor/model was saved.
-		 */
-		public void markSaveLocations() {
-			saveLocation = true;
-			for (Iterator stacks = commandStacks.iterator(); stacks.hasNext();) {
-				CommandStack stack = (CommandStack) stacks.next();
-				stack.markSaveLocation();
-			}
-			saveLocation = false;
-		}
-
-		/**
-		 * Flushes every observed command stack and resets the save location to
-		 * zero.
-		 */
-//		public void flush() {
-//			for (Iterator stacks = commandStacks.iterator(); stacks.hasNext();) {
-//				CommandStack stack = (CommandStack) stacks.next();
-//				stack.flush();
-//			}
-//		}
-	}
-
-	/** the <code>CommandStackListener</code> */
-	private MultiPageCommandStackListener multiPageCommandStackListener = null;
-
-	/**
-	 * Returns the global command stack listener.
-	 * 
-	 * @return the <code>CommandStackListener</code>
-	 */
-	protected MultiPageCommandStackListener getMultiPageCommandStackListener() {
-		if (null == multiPageCommandStackListener)
-			multiPageCommandStackListener = new MultiPageCommandStackListener();
-
-		return multiPageCommandStackListener;
-	}
-
-	/*
-	 * @see org.eclipse.ui.ISaveablePart#doSave(org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public void doSave(IProgressMonitor monitor) {
-		// do the work within an operation because this is a long running
-		// activity that modifies the workbench
-		WorkspaceModifyOperation operation = new WorkspaceModifyOperation() {
-			public void execute(IProgressMonitor monitor_) {
-				try {
-					if (isWebProject &&
-					        _modelLoader.getEdit() != null) {
-						// modelResource.save(Collections.EMPTY_MAP);
-						Resource deploymentDescriptorResource = _modelLoader.getEdit()
-                                      .getDeploymentDescriptorResource();
-                        if (deploymentDescriptorResource != null)
-                        {
-                            deploymentDescriptorResource.save(
-                                   Collections.EMPTY_MAP);
-						}
-						IFile file = ((IFileEditorInput) getEditorInput())
-								.getFile();
-						pageflowPage.doSave(file, monitor_);
-					}
-					sourcePage.doSave(monitor_);
-					getMultiPageCommandStackListener().markSaveLocations();
-				} catch (Exception e) {
-					EditorPlugin.getDefault().getLog().log(
-							new Status(IStatus.ERROR, EditorPlugin
-									.getPluginId(), IStatus.OK,
-									e.getMessage() == null ? "" : e //$NON-NLS-1$
-											.getMessage(), e));
-				}
-			}
-		};
-		try {
-			// commit all pending changes in form pages
-			for (Iterator iter = pages.iterator(); iter.hasNext();) {
-				Object obj = iter.next();
-				if (obj instanceof FormPage) {
-					((FormPage) obj).doSave(monitor);
-				}
-				// else if (obj instanceof PageflowEditor) {
-				// ((PageflowEditor) obj).doSave(monitor);
-				// }
-
-			}
-			operation.run(null);// .run(true, false,
-			// operation;
-			// runs the operation, and shows progress
-			// new ProgressMonitorDialog();
-
-			// refresh the necessary state
-			((BasicCommandStack) editingDomain.getCommandStack()).saveIsDone();
-
-			editorDirtyStateChanged();
-		} catch (Exception e) {
-			EditorPlugin.getDefault().getLog().log(
-					new Status(IStatus.ERROR, EditorPlugin.getPluginId(),
-							IStatus.OK, e.getMessage(), e));
-		}
-	}
-
-	public void doSaveAs() {
-		SaveAsDialog saveAsDialog = new SaveAsDialog(getSite().getShell());
-		saveAsDialog.open();
-		IPath path = saveAsDialog.getResult();
-		if (path != null) {
-			IFile file = ResourcesPlugin.getWorkspace().getRoot().getFile(path);
-			if (file != null) {
-				doSaveAs(URI.createPlatformResourceURI(file.getFullPath()
-						.toString(), false), new FileEditorInput(file));
-			}
-		}
-	}
-
-	/**
-	 * @param uri
-	 * @param editorInput
-	 */
-	protected void doSaveAs(URI uri, IEditorInput editorInput) {
-		editingDomain.getResourceSet().getResources().get(0)
-				.setURI(uri);
-		setInputWithNotify(editorInput);
-		setPartName(editorInput.getName());
-		IProgressMonitor progressMonitor = getActionBars()
-				.getStatusLineManager() != null ? getActionBars()
-				.getStatusLineManager().getProgressMonitor()
-				: new NullProgressMonitor();
-		doSave(progressMonitor);
-	}
-
-	public boolean isSaveAsAllowed() {
-		return true;
-	}
-
-	/**
-	 * Returns the <code>TabbedPropertySheetPage</code> for this editor.
-	 * 
-	 * @return - the <code>TabbedPropertySheetPage</code>
-	 */
-	protected IPropertySheetPage getPropertySheetPage() {
-		return new TabbedPropertySheetPage(
-				new ITabbedPropertySheetPageContributor() {
-
-					public String getContributorId() {
-						return EDITOR_ID;
-					}
-				});
-	}
-
-	/** the delegating ZoomManager */
-	private DelegatingZoomManager delegatingZoomManager = null;
-
-	/**
-	 * check whether the input is related with IFile.
-	 * 
-	 * @param input
-	 * @return
-	 */
-	private boolean isValidInput(IEditorInput input) {
-		if (input != null) {
-			IFile file = (IFile) input.getAdapter(IResource.class);
-			if (file != null) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * Returns the <code>DelegatingZoomManager</code> for this editor.
-	 * 
-	 * @return - the <code>DelegatingZoomManager</code>
-	 */
-	protected DelegatingZoomManager getDelegatingZoomManager() {
-		if (!isValidInput(getEditorInput()) || !isWebProject || !_addPagesTask.getArePagesLoaded()) {
-			return null;
-		}
-		if (null == delegatingZoomManager) {
-			delegatingZoomManager = new DelegatingZoomManager();
-			delegatingZoomManager
-					.setCurrentZoomManager((ZoomManager) pageflowPage
-							.getAdapter(ZoomManager.class));
-		}
-		return delegatingZoomManager;
-	}
-
-	/** the delegating CommandStack */
-	private DelegatingCommandStack delegatingCommandStack = null;
-
-	/**
-	 * Returns the <code>CommandStack</code> for this editor.
-	 * 
-	 * @return - the <code>CommandStack</code>
-	 */
-	public DelegatingCommandStack getDelegatingCommandStack() {
-		if (null == delegatingCommandStack) {
-			delegatingCommandStack = new DelegatingCommandStack();
-		}
-		return delegatingCommandStack;
-	}
-
-	/*
-	 * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
-	 */
-	public Object getAdapter(Class adapter) {
-		if (adapter == IEditingDomainProvider.class) {
-			return new IEditingDomainProvider() {
-				public EditingDomain getEditingDomain() {
-					return editingDomain;
-				}
-			};
-		}
-		if (adapter == EditingDomain.class) {
-			return editingDomain;
-		}
-		if (adapter == AdapterFactory.class) {
-			return adapterFactory;
-		}
-		if (adapter == IEditorPart.class) {
-			return getActiveEditor();
-		}
-
-		if (adapter == CommandStack.class) {
-			return getDelegatingCommandStack();
-		}
-		if (adapter == ZoomManager.class) {
-			return getDelegatingZoomManager();
-		}
-
-		if (adapter == ActionRegistry.class) {
-			return getActionRegistry();
-		}
-		if (adapter == IGotoMarker.class) {
-			return new IGotoMarker() {
-				public void gotoMarker(final IMarker marker) {
-				    // this may be called on an editor open (i.e. double-click the Problems view)
-				    // so ensure it runs safely with respect to the page load
-				    _addPagesTask.pageSafeExecute(new Runnable()
-				    {
-				        public void run()
-				        {
-		                    FacesConfigEditor.this.gotoMarker(marker);
-				        }
-				    });
-				}
-			};
-		}
-		if (adapter == StructuredTextEditor.class) {
-			return sourcePage;
-		}
-
-		if (adapter == IContentOutlinePage.class) {
-			return getOutlinePage();
-		}
-
-		if (adapter == IPropertySheetPage.class) {
-			return getPropertySheetPage();
-		}
-
-		if (adapter == IProject.class) {
-			return getProject();
-		}
-
-		if (adapter == CTabFolder.class) {
-			return getContainer();
-		}
-
-		if (adapter == IOpenPage.class) {
-			return new IOpenPage() {
-
-				public void setActiveEditorPage(String pageID) {
-					FacesConfigEditor.this.setActiveEditorPage(pageID);
-
-				}
-			};
-		}
-
-		return super.getAdapter(adapter);
-	}
-
-	private EMFCommandStackGEFAdapter sourceCommandStack;
-
-	/**
-	 * get or create the source page's GEF command stack based on its EMF
-	 * command stack.
-	 * 
-	 * @return
-	 */
-	private CommandStack getSourcePageCommandStack() {
-		if (sourceCommandStack == null) {
-            IDocument doc = sourcePage.getDocumentProvider().getDocument(getEditorInput());
-            if (doc instanceof IStructuredDocument) {
-            	sourceCommandStack = new EMFCommandStackGEFAdapter(doc);
-            }
-            else
-            {
-                EditorPlugin.getDefault().getLog().log(
-                   new Status(IStatus.ERROR, EditorPlugin.getPluginId(), 0, 
-                           "Error getting undo stack for Faces Config editor.  Undo may be disabled", //$NON-NLS-1$
-                           new Throwable()));
-            }
-		}
-		return sourceCommandStack;
-	}
-
-	/** the list of action ids that are to CommandStack actions */
-	// private List stackActionIDs = new ArrayList();
-	/** the list of action ids that are editor actions */
-	private List editorActionIDs = new ArrayList();
-
-	/**
-	 * Adds an editor action to this editor.
-	 * <p>
-	 * Editor actions are actions that depend and work on the editor.
-	 * 
-	 * @param action -
-	 *            the editor action
-	 */
-	protected void addEditorAction(EditorPartAction action) {
-		getActionRegistry().registerAction(action);
-		editorActionIDs.add(action.getId());
-	}
-
-	/**
-	 * Creates different kinds of actions and registers them to the
-	 * ActionRegistry.
-	 */
-	protected void createActions() {
-		// register save action
-		addEditorAction(new SaveAction(this));
-	}
-
-	/**
-	 * Indicates that the current page has changed.
-	 * <p>
-	 * We update the DelegatingCommandStack, OutlineViewer and other things
-	 * here. //
-	 */
-	protected void currentPageChanged() {
-		IEditorPart activeEditor = getActiveEditor();
-		if (activeEditor == null) {
-			return;
-		}
-
-		// update command stack
-		CommandStack cmdStack = null;
-
-		if (activeEditor == pageflowPage) {
-			cmdStack = (CommandStack) activeEditor
-					.getAdapter(CommandStack.class);
-		} else if (activeEditor == sourcePage)// other page will delegate the
-		// GEF command stack to source
-		// page's.
-		{
-			cmdStack = this.getSourcePageCommandStack();
-		}
-
-		// Add command stacks
-		getMultiPageCommandStackListener().addCommandStack(cmdStack,
-				activeEditor);
-		getDelegatingCommandStack().setCurrentCommandStack(cmdStack);
-
-		// enable or disable the actions
-		// updateActions(stackActionIDs);
-
-		// update zoom actions
-		ZoomManager zoomManager = null;
-		zoomManager = (ZoomManager) activeEditor.getAdapter(ZoomManager.class);
-
-		if (zoomManager != null) {
-			getDelegatingZoomManager().setCurrentZoomManager(zoomManager);
-		}
-
-		IEditorActionBarContributor contributor = getEditorSite()
-				.getActionBarContributor();
-		if (contributor != null
-				&& contributor instanceof FacesConfigActionBarContributor) {
-			((FacesConfigActionBarContributor) contributor)
-					.setActivePage(activeEditor);
-			PaletteView paletteView = (PaletteView) PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().findView(PaletteView.ID);
-			if(paletteView != null) {
-				paletteView.partActivated(activeEditor);
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see MultiPageEditorPart#pageChange(int)
-	 */
-	protected void pageChange(int newPageIndex) {
-		super.pageChange(newPageIndex);
-		// getActionBarContributor().setActivePage(getActiveEditor());
-		// refresh content depending on current page
-		currentPageChanged();
-	}
-
-	public void dispose() 
-	{
-        // signal that we have been disposed
-        // do this before anything else
-	    _isDisposed = true;
-	    _modelLoader.dispose();
-	    
-	    ResourcesPlugin.getWorkspace().removeResourceChangeListener(
-				resourceChangeListener);
-
-		adapterFactory.dispose();
-
-		if (this.outlinePage != null) 
-			outlinePage.dispose();		
-		
-		if (sourcePage != null) 
-			sourcePage.dispose();
-		
-		if (sourceCommandStack != null)
-			sourceCommandStack.dispose();
-		
-		if (pageflowPage != null) 
-			pageflowPage.dispose();					
-		
-	    if (multiPageCommandStackListener != null)
-	    	multiPageCommandStackListener.dispose();	    
-	    
-		//do not call dispose on delegatingCommandStack.   source and multiPage are already disposed
-		
-		super.dispose();
-	}
-
-	/**
-	 * get the project of the faces config file that the editor is working on.
-	 * 
-	 * @return IProject
-	 */
-	public IProject getProject() {
-		if (currentProject == null) {
-			if (_modelLoader.getEdit() != null) {
-				IFile file = _modelLoader.getEdit().getFile();
-				if (file != null)
-					currentProject = file.getProject();
-			}
-		}
-		return currentProject;
-	}
-
-	public EditingDomain getEditingDomain() {
-		return editingDomain;
-	}
-
-	/**
-	 * Returns the <code>IContentOutlinePage</code> for this editor.
-	 * 
-	 * @return - the <code>IContentOutlinePage</code>
-	 */
-	protected IContentOutlinePage getOutlinePage() {
-		if (null == outlinePage) {
-			outlinePage = new MultiPageEditorOutlinePage();
-		}
-		return outlinePage;
-	}
-
-	public void addSelectionChangedListener(ISelectionChangedListener listener) {
-		selectionChangedListeners.add(listener);
-	}
-
-	public ISelection getSelection() {
-		return editorSelection;
-	}
-
-	public void removeSelectionChangedListener(
-			ISelectionChangedListener listener) {
-		selectionChangedListeners.remove(listener);
-	}
-
-	public void setSelection(ISelection selection) {
-		editorSelection = selection;
-		for (Iterator listeners = selectionChangedListeners.iterator(); listeners
-				.hasNext();) {
-			ISelectionChangedListener listener = (ISelectionChangedListener) listeners
-					.next();
-			listener
-					.selectionChanged(new SelectionChangedEvent(this, selection));
-		}
-	}
-
-	private void gotoMarker(IMarker marker) {
-		setActivePage(sourcePageId);
-		IDE.gotoMarker(this.sourcePage, marker);
-	}
-
-	/**
-	 * FIXME: this is used only for testing. Should isolate better
-	 * @return the action bar
-	 */
-	public FacesConfigActionBarContributor getActionBarContributor() {
-		return (FacesConfigActionBarContributor) getEditorSite()
-				.getActionBarContributor();
-	}
-
-	private IActionBars getActionBars() {
-		return getActionBarContributor().getActionBars();
-	}
-
-	public Object getSelectedPage() {
-		IFormPage page = getActivePageInstance();
-		if (page != null) 
-			return page;
-			
-		if (getActiveEditor() instanceof PageflowEditor)
-			return getActiveEditor();
-		
-		return null;
-	}
-
-	/**
-	 * Shows a dialog that asks if conflicting changes should be discarded.
-	 * @return the user's response.
-	 */
-	protected boolean handleDirtyConflict() {
-		return MessageDialog
-				.openQuestion(
-						getSite().getShell(),
-						EditorMessages.FacesConfigEditor_ErrorHandlingUndoConflicts_DialogTitle,
-						EditorMessages.FacesConfigEditor_ErrorHandlingUndoConflicts_DialogMessage);
-	}
-
-	/**
-	 * Handles what to do with changed resources on activation.
-	 * 
-	 * @generated
-	 */
-	protected void handleChangedResources() {
-		if (!changedResources.isEmpty()
-				&& (!isDirty() || handleDirtyConflict())) {
-			editingDomain.getCommandStack().flush();
-
-			for (Iterator i = changedResources.iterator(); i.hasNext();) {
-				Resource resource = (Resource) i.next();
-				if (resource.isLoaded()) {
-					resource.unload();
-					try {
-						resource.load(Collections.EMPTY_MAP);
-					} catch (IOException exception) {
-						EditorPlugin.getDefault().getLog().log(
-								new Status(IStatus.ERROR, EditorPlugin
-										.getPluginId(), IStatus.OK, exception
-										.getMessage() == null ? "" : exception //$NON-NLS-1$
-										.getMessage(), exception));
-					}
-				}
-			}
-		}
-	}
-
-	/**
-	 * TODO this is used only for testing.  Should be able to remove if we
-	 * go to true automated UI testing
-	 * @param pageID
-	 */
-	public void setActiveEditorPage(String pageID) {
-		if (pageID.equals(PageflowEditor.PAGE_ID)) {
-			setActivePage(pageflowPageID);
-		} else if (pageID.equals(ManagedBeanPage.PAGE_ID)) {
-			setActivePage(managedBeanPageID);
-		} else if (pageID.equals(ComponentsPage.PAGE_ID)) {
-			setActivePage(componentsPageID);
-		} else if (pageID.equals(OthersPage.PAGE_ID)) {
-			setActivePage(othersPageID);
-		} else if (pageID.equals(SOURCE_PAGE_ID)) {
-			setActivePage(sourcePageId);			
-		}
-	}
-
-	private boolean matches(IEditorInput input) {
-		final IResource file = (IResource) input.getAdapter(IResource.class);
-		boolean hasWebFacet = false;
-		boolean hasJSFFacet = false;
-
-		if (file != null) {
-			final IProject project = file.getProject();
-
-			if (project != null) {
-				try {
-					final IFacetedProject facetedProject = ProjectFacetsManager
-							.create(project);
-
-					if (facetedProject != null) {
-						final Set facets = facetedProject.getProjectFacets();
-
-						for (final Iterator it = facets.iterator(); it
-								.hasNext();) {
-							final IProjectFacetVersion version = (IProjectFacetVersion) it
-									.next();
-
-							IProjectFacet facet = version.getProjectFacet();
-							if (IJSFCoreConstants.JSF_CORE_FACET_ID.equals(facet.getId())) {
-								hasJSFFacet = true;
-							} else if ("jst.web".equals(facet.getId())) { //$NON-NLS-1$
-								hasWebFacet = true;
-							}
-						}
-					}
-				} catch (CoreException ex) {
-					EditorPlugin.getDefault().getLog().log(
-							new Status(IStatus.ERROR, EditorPlugin
-									.getPluginId(), IStatus.OK,
-									ex.getMessage() == null ? "" : ex //$NON-NLS-1$
-											.getMessage(), ex));
-				}
-			}
-		}
-
-		return hasWebFacet && hasJSFFacet;
-	}
-	
-    /**
-     * DANGER!  This call is for testing only!  Should not be used,
-     * even internally, by production code.
-     * @param timeoutMs the time to wait in milliseconds
-     * @throws InterruptedException 
-     */	
-	public void doPageLoad(long timeoutMs) throws InterruptedException
-	{
-	    _modelLoader.waitForLoad(timeoutMs);
-	    _addPagesTask.doRun(_modelLoader.getEdit());
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/IFacesConfigConstants.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/IFacesConfigConstants.java
deleted file mode 100644
index c13cff1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/IFacesConfigConstants.java
+++ /dev/null
@@ -1,160 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui;
-
-/**
- * @author jchoi
- * @version
- */
-public interface IFacesConfigConstants {
-
-	/**
-	 * 
-	 */
-	public static final String FACES_CONFIG = "faces-config"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String MANAGED_PROPERTY = "managed-property"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String VALUE = "value"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String NULL_VALUE = "null-value"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String MAP_ENTRIES = "map-entries"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String MAP_ENTRY = "map-entry"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String LIST_ENTRIES = "list-entries"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String NAVIGATION_RULE = "navigation-rule"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String COMPONENT_SUPER_CLASS = "javax.faces.component.UIComponent"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String RENDER_KIT_SUPER_CLASS = "javax.faces.render.RenderKit"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String CONVERTER_INTERFACE = "javax.faces.convert.Converter"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String VALIDATOR_INTERFACE = "javax.faces.validator.Validator"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String RENDERER_SUPER_CLASS = "javax.faces.render.Renderer"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String ACTION_LISTENER_INTERFACE = "javax.faces.event.ActionListener"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String NAVIGATION_HANDLE_SUPER_CLASS = "javax.faces.application.NavigationHandler"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String PROPERTY_RESOLVER_SUPER_CLASS = "javax.faces.el.PropertyResolver"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String STATE_MANAGER_SUPER_CLASS = "javax.faces.application.StateManager"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String VARIABLE_RESOLVER_SUPER_CLASS = "javax.faces.el.VariableResolver"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String VIEW_HANDLER_SUPER_CLASS = "javax.faces.application.ViewHandler"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String APPLICATION_FACTORY_SUPER_CLASS = "javax.faces.application.ApplicationFactory"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String FACES_CONTEXT_FACTORY_SUPER_CLASS = "javax.faces.context.FacesContextFactory"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String LIFECYCLE_FACTORY_SUPER_CLASS = "javax.faces.lifecycle.LifecycleFactory"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String RENDER_KIT_FACTORY_SUPER_CLASS = "javax.faces.render.RenderKitFactory"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String PHASE_LISTENER_INTERFACE = "javax.faces.event.PhaseListener"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String MANAGED_BEAN_SCOPE_APPLICATION = "application"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String MANAGED_BEAN_SCOPE_SESSION = "session"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String MANAGED_BEAN_SCOPE_REQUEST = "request"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String MANAGED_BEAN_SCOPE_NONE = "none"; //$NON-NLS-1$
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/INestedActionContributor.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/INestedActionContributor.java
deleted file mode 100644
index a36a2f4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/INestedActionContributor.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-
-package org.eclipse.jst.jsf.facesconfig.ui;
-
-/**
- * The nested action contributor should be able to update its actions as
- * required.
- */
-public interface INestedActionContributor {
-	/**
-	 * Updated nested actions
-	 */
-	void update();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/ModelLoader.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/ModelLoader.java
deleted file mode 100644
index 417b949..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/ModelLoader.java
+++ /dev/null
@@ -1,215 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui;
-
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
-
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.jst.jsf.facesconfig.ui.util.WebrootUtil;
-import org.eclipse.jst.jsf.facesconfig.util.FacesConfigArtifactEdit;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * Centralizes logic to load the faces config model off of the UI thread for
- * the FacesConfig Editor.
- * 
- * Also encapsulates the lifecycle for the instance of the faces artifact 
- * created for its editor.  All creation, access and destruction of the artifact
- * should be centralized through this class
- * 
- * @author cbateman
- *
- */
-class ModelLoader 
-{
-    private FacesConfigArtifactEdit     _edit;
-    private Job                         _loadModelJob;
-    private CountDownLatch              _modelLoaded = new CountDownLatch(1);    
-    
-    /**
-     * @return  the artifact edit or null if not loaded.  Should only be called
-     * after load() is called and has executed its callback 
-     */
-    public synchronized FacesConfigArtifactEdit getEdit() {
-        return _edit;
-    }
-
-    private synchronized void setEdit(FacesConfigArtifactEdit edit)
-    {
-        _edit = edit;
-    }
-    
-    void waitForLoad(long timeoutMs) throws InterruptedException
-    {
-        _modelLoaded.await(timeoutMs, TimeUnit.MILLISECONDS);
-    }
-    
-    /**
-     * Dispose of the model and any unfinished loading operations
-     * 
-     * Must be run on the UI thread.
-     */
-    public synchronized void dispose()
-    {
-        assertOnDisplayThread();
-       
-        // if the load model job has not completed, cancel it
-        if (_loadModelJob != null
-                && _loadModelJob.getResult() == null)
-        {
-            _loadModelJob.cancel();
-        }
-        
-        if (_edit != null)
-        {
-            _edit.dispose();
-            //System.out.println("FacesConfigEditor.dispose(): isDisposed == "+_edit.isDisposed());
-        }
-    }
-    
-    /**
-     * Load the model file located by path in project. Must be called from the UI thread.
-     * 
-     * Method does not block.
-     * 
-     * @param project
-     * @param path
-     * @param isWebProject 
-     * @param signalComplete to be asyncExec'd on the UI thread when the model is loaded
-     */
-    public void load(final IProject project, final IPath path, final boolean isWebProject, final ModelLoaderComplete signalComplete)
-    {
-        assertOnDisplayThread();
-        _loadModelJob = new ModelLoaderJob(project, path, isWebProject, signalComplete);
-        _loadModelJob.schedule();
-    }
-    
-    private class ModelLoaderJob extends Job
-    {
-        private final IProject                  _project;
-        private final IPath                     _path;
-        private final ModelLoaderComplete       _runnable;
-        private final boolean                   _isWebProject;
-
-        ModelLoaderJob(final IProject project, final IPath path, final boolean isWebProject, final ModelLoaderComplete signalComplete)
-        {
-            super(EditorMessages.ModelLoader_LoadingModelJobName);
-            _project = project;
-            _path = path;
-            _runnable = signalComplete;
-            _isWebProject = isWebProject;
-        }
-        
-        @Override
-        protected IStatus run(IProgressMonitor monitor) 
-        {
-            FacesConfigArtifactEdit artifactEdit = loadModel(_project, _path);
-            
-            // synchrnoize on the ModelLoader.  Ensure that any call to dispose()
-            // that occurs before we set the edit is done atomically.
-            synchronized(ModelLoader.this)
-            {
-                // only bother with this if the task hasn't been signalled for cancel
-                if (!monitor.isCanceled())
-                {
-                    setEdit(artifactEdit);
-                    
-                    _runnable.setFacesConfigArtifactEdit(artifactEdit);
-                    
-                    // finish as quickly possible; we are holding the ModelLoader
-                    // lock so we must ensure that we don't block.
-                    // NEVER USE syncExec here.
-                    PlatformUI.getWorkbench().getDisplay().asyncExec(_runnable);
-                }
-                // if we were cancelled, then dispose of the artifact edit
-                else
-                {
-                    if (artifactEdit != null)
-                    {
-                        artifactEdit.dispose();
-                    }
-                }
-            }
-            
-            // signal that we are done loading
-            _modelLoaded.countDown();
-            return Status.OK_STATUS;
-        }
-        
-        /**
-         * Loads the configuration model from the given path.
-         * 
-         */
-        private FacesConfigArtifactEdit loadModel(IProject project, IPath modelPath) 
-        {
-            if (_isWebProject) 
-            {
-                IFolder webContentFolder = WebrootUtil.getWebContentFolder(project);
-                Assert
-                        .isTrue(webContentFolder != null
-                                && webContentFolder.exists());
-
-                IPath relativePath = modelPath;
-                if (webContentFolder.getFullPath().isPrefixOf(modelPath)) {
-                    relativePath = modelPath.removeFirstSegments(webContentFolder
-                            .getFullPath().segmentCount());
-                }
-
-                
-                return FacesConfigArtifactEdit
-                        .getFacesConfigArtifactEditForWrite(project, relativePath
-                                .toString());
-            }
-            
-            return null;
-        }
-    }
-    
-    abstract static class ModelLoaderComplete implements Runnable
-    {
-        private FacesConfigArtifactEdit  _edit;
-        
-        private void setFacesConfigArtifactEdit(FacesConfigArtifactEdit  edit)
-        {
-            _edit = edit;
-        }
-        
-        public final void run() 
-        {
-            assertOnDisplayThread();
-            doRun(_edit);
-        }
-        
-        /**
-         * Called by the runnable.  Implementer should _not_ cache the edit variable
-         * edit may be null
-         * 
-         * @param edit
-         */
-        protected abstract void doRun(FacesConfigArtifactEdit edit);
-    }
-    
-    private static void assertOnDisplayThread()
-    {
-        if (Thread.currentThread() != PlatformUI.getWorkbench().getDisplay().getThread())
-        {
-            throw new IllegalStateException("ModelLoaderComplete must be called on the UI thread"); //$NON-NLS-1$
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/MultiPageEditorOutlinePage.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/MultiPageEditorOutlinePage.java
deleted file mode 100644
index d9110dd..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/MultiPageEditorOutlinePage.java
+++ /dev/null
@@ -1,706 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui;
-
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.core.runtime.ListenerList;
-import org.eclipse.core.runtime.SafeRunner;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.util.SafeRunnable;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.CTabFolder;
-import org.eclipse.swt.custom.CTabItem;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.SubActionBars;
-import org.eclipse.ui.part.EditorPart;
-import org.eclipse.ui.part.IPage;
-import org.eclipse.ui.part.IPageBookViewPage;
-import org.eclipse.ui.part.IPageSite;
-import org.eclipse.ui.part.MessagePage;
-import org.eclipse.ui.part.MultiPageEditorPart;
-import org.eclipse.ui.part.Page;
-import org.eclipse.ui.part.PageBook;
-import org.eclipse.ui.views.contentoutline.IContentOutlinePage;
-
-/**
- * @author Xiao-guang Zhang
- * 
- * The outline page class for mulitPage Editorpart.
- */
-public class MultiPageEditorOutlinePage extends Page implements
-		IContentOutlinePage, SelectionListener {
-	/** log instance */
-	private static final Logger log = EditorPlugin
-			.getLogger(MultiPageEditorOutlinePage.class);
-
-	/**
-	 * Selection change listeners.
-	 */
-	private ListenerList selectionChangedListeners = new ListenerList(ListenerList.IDENTITY);
-
-	/** the pagebook */
-	private PageBook pageBook = null;
-
-	/**
-	 * Selection change listener to listen for page selection changes
-	 */
-	private ISelectionChangedListener selectionChangedListener = new ISelectionChangedListener() {
-		public void selectionChanged(SelectionChangedEvent event) {
-			pageSelectionChanged(event);
-		}
-	};
-
-	/**
-	 * A data structure used to store the information about a single page within
-	 * a MultiPageEditorOutlinePage
-	 */
-	protected static class PageRec {
-
-		/**
-		 * The part including editorpart, or Control
-		 */
-		public IWorkbenchPart part;
-
-		/**
-		 * The page.
-		 */
-		public IPage page;
-
-		/**
-		 * The page's action bars
-		 */
-		public SubActionBars subActionBars;
-
-		/**
-		 * Creates a new page record initialized to the given part and page.
-		 * 
-		 * @param part
-		 * @param page
-		 */
-		public PageRec(IWorkbenchPart part, IPage page) {
-			this.part = part;
-			this.page = page;
-		}
-
-		/**
-		 * Disposes of this page record by <code>null</code>ing its fields.
-		 */
-		public void dispose() {
-			part = null;
-			page = null;
-		}
-	}
-
-	/**
-	 * The page record for the default page.
-	 */
-	private PageRec defaultPageRec;
-
-	/**
-	 * Map from parts to part records (key type: <code>IWorkbenchPart</code>;
-	 * value type: <code>PartRec</code>).
-	 */
-	private Map mapPartToRec = new HashMap();
-
-	/**
-	 * Map from pages to view sites Note that view sites were not added to page
-	 * recs to avoid breaking binary compatibility with previous builds
-	 */
-	private Map mapPageToSite = new HashMap();
-
-	/**
-	 * The page rec which provided the current page or <code>null</code>
-	 */
-	private PageRec activeRec;
-
-	/**
-	 * the container composite control of MutliPageEditorPart
-	 */
-	private CTabFolder tabFolder;
-
-	/**
-	 * Creates a new MultiPageEditorOutlinePage instance.
-	 * 
-	 * 
-	 */
-	public MultiPageEditorOutlinePage() {
-		super();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.part.Page#createControl(org.eclipse.swt.widgets.Composite)
-	 */
-	public void createControl(Composite parent) {
-		// pagebook
-		pageBook = new PageBook(parent, SWT.NONE);
-
-		// Create the default page rec.
-		IPage defaultPage = createDefaultPage(pageBook);
-		defaultPageRec = new PageRec(null, defaultPage);
-		preparePage(defaultPageRec);
-
-		// Show the default page
-		showPageRec(defaultPageRec);
-
-		// get the tab control and add the page selection listener.
-		if (getContainerForMultiPageEditorPart() != null) {
-			getContainerForMultiPageEditorPart().addSelectionListener(this);
-		}
-
-		// show the activate part page.
-		showBootstrapPart();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see Page#dispose()
-	 */
-	public void dispose() {
-		// Deref all of the pages.
-		activeRec = null;
-		if (defaultPageRec != null) {
-			// check for null since the default page may not have
-			// been created (ex. perspective never visible)
-			defaultPageRec.page.dispose();
-			defaultPageRec = null;
-		}
-		Map clone = (Map) ((HashMap) mapPartToRec).clone();
-		Iterator iterator = clone.values().iterator();
-		while (iterator.hasNext()) {
-			PageRec rec = (PageRec) iterator.next();
-			removePage(rec);
-		}
-
-		// important: always call super implementation of dispose
-		super.dispose();
-	}
-
-	/**
-	 * Creates and returns the default page for this view.
-	 * 
-	 * @param book -
-	 *            the pagebook control
-	 * @return - the default page
-	 */
-	protected IPage createDefaultPage(PageBook book) {
-		// Message to show on the default page
-		String defaultText = EditorMessages.MultiPageEditorOutlinePage_noOutline;
-
-		MessagePage page = new MessagePage();
-		initPage(page);
-		page.createControl(book);
-		page.setMessage(defaultText);
-		return page;
-	}
-
-	/**
-	 * Prepares the page in the given page rec for use in this view.
-	 * 
-	 * @param rec -
-	 *            the page rec
-	 */
-	private void preparePage(PageRec rec) {
-		IPageSite site = null;
-
-		if (!doesPageExist(rec.page)) {
-			if (rec.page instanceof IPageBookViewPage) {
-				site = ((IPageBookViewPage) rec.page).getSite();
-			}
-			if (site == null) {
-				// We will create a site for our use
-				site = new SubPageSite(getSite());
-			}
-			mapPageToSite.put(rec.page, site);
-
-			rec.subActionBars = (SubActionBars) site.getActionBars();
-			// rec.subActionBars.addPropertyChangeListener(actionBarPropListener);
-			// for backward compability with IPage
-			rec.page.setActionBars(rec.subActionBars);
-
-		} else {
-			site = (IPageSite) mapPageToSite.get(rec.page);
-			rec.subActionBars = (SubActionBars) site.getActionBars();
-		}
-	}
-
-	/**
-	 * Returns the currently visible page for this view or <code>null</code>
-	 * if no page is currently visible.
-	 * 
-	 * @return the currently visible page
-	 */
-	public IPage getCurrentPage() {
-		if (activeRec == null)
-			return null;
-		return activeRec.page;
-	}
-
-	/**
-	 * Returns the view site for the given page of this view.
-	 * 
-	 * @param page
-	 *            the page
-	 * @return the corresponding site, or <code>null</code> if not found
-	 */
-	protected SubPageSite getPageSite(IPage page) {
-		return (SubPageSite) mapPageToSite.get(page);
-	}
-
-	/**
-	 * Shows page contained in the given page record in this view. The page
-	 * record must be one from this pagebook view.
-	 * <p>
-	 * The <code>PageBookView</code> implementation of this method asks the
-	 * pagebook control to show the given page's control, and records that the
-	 * given page is now current. Subclasses may extend.
-	 * </p>
-	 * 
-	 * @param pageRec
-	 *            the page record containing the page to show
-	 */
-	protected void showPageRec(PageRec pageRec) {
-		IPageSite pageSite = getPageSite(pageRec.page);
-		ISelectionProvider provider = pageSite.getSelectionProvider();
-		if (provider == null && (pageRec.page instanceof IContentOutlinePage)) {
-			// This means that the page did not set a provider during its
-			// initialization
-			// so for backward compatibility we will set the page itself as the
-			// provider.
-			pageSite.setSelectionProvider((IContentOutlinePage) pageRec.page);
-		}
-
-		// If already showing do nothing
-		if (activeRec == pageRec) {
-			return;
-		}
-		// If the page is the same, just set activeRec to pageRec
-		if (activeRec != null && pageRec != null
-				&& activeRec.page == pageRec.page) {
-			activeRec = pageRec;
-			return;
-		}
-
-		// Hide old page.
-		if (activeRec != null) {
-			activeRec.subActionBars.deactivate();
-			// remove our selection listener
-			provider = ((SubPageSite) mapPageToSite.get(activeRec.page))
-					.getSelectionProvider();
-			if (provider != null) {
-				provider
-						.removeSelectionChangedListener(selectionChangedListener);
-			}
-		}
-		// Show new page.
-		activeRec = pageRec;
-		Control pageControl = activeRec.page.getControl();
-		if (pageControl != null && !pageControl.isDisposed()) {
-			// Verify that the page control is not disposed
-			// If we are closing, it may have already been disposed
-			pageBook.showPage(pageControl);
-			activeRec.subActionBars.activate();
-			refreshGlobalActionHandlers();
-			// add our selection listener
-			provider = ((SubPageSite) mapPageToSite.get(activeRec.page))
-					.getSelectionProvider();
-			if (provider != null) {
-				provider.addSelectionChangedListener(selectionChangedListener);
-			}
-			// Update action bars.
-			getSite().getActionBars().updateActionBars();
-		}
-	}
-
-	/**
-	 * Refreshes the global actions for the active page.
-	 */
-	private void refreshGlobalActionHandlers() {
-		// Clear old actions.
-		IActionBars bars = getSite().getActionBars();
-		bars.clearGlobalActionHandlers();
-
-		// Set new actions.
-		Map newActionHandlers = activeRec.subActionBars
-				.getGlobalActionHandlers();
-		if (newActionHandlers != null) {
-			Set keys = newActionHandlers.entrySet();
-			Iterator iter = keys.iterator();
-			while (iter.hasNext()) {
-				Map.Entry entry = (Map.Entry) iter.next();
-				bars.setGlobalActionHandler((String) entry.getKey(),
-						(IAction) entry.getValue());
-			}
-		}
-	}
-
-	/**
-	 * Creates a page for a given part. Adds it to the pagebook but does not
-	 * show it.
-	 * 
-	 * @param part
-	 *            The part we are making a page for.
-	 * @return IWorkbenchPart
-	 */
-	private PageRec createPage(IWorkbenchPart part) {
-		PageRec rec = doCreatePage(part);
-		if (rec != null) {
-			mapPartToRec.put(part, rec);
-			preparePage(rec);
-		}
-		return rec;
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on PageBookView.
-	 */
-	private PageRec doCreatePage(IWorkbenchPart part) {
-		// Try to get an outline page.
-		Object obj = part.getAdapter(IContentOutlinePage.class);
-		if (obj instanceof IContentOutlinePage) {
-			IContentOutlinePage page = (IContentOutlinePage) obj;
-			if (page instanceof IPageBookViewPage) {
-				initPage((IPageBookViewPage) page);
-			}
-			page.createControl(getPageBook());
-			return new PageRec(part, page);
-		}
-		// There is no content outline
-		return null;
-	}
-
-	/**
-	 * Returns the pagebook control for this view.
-	 * 
-	 * @return the pagebook control, or <code>null</code> if not initialized
-	 */
-	protected PageBook getPageBook() {
-		return pageBook;
-	}
-
-	/**
-	 * Returns the page record for the given part.
-	 * 
-	 * @param part
-	 *            the part
-	 * @return the corresponding page record, or <code>null</code> if not
-	 *         found
-	 */
-	protected PageRec getPageRec(Object part) {
-		return (PageRec) mapPartToRec.get(part);
-	}
-
-	/**
-	 * Initializes the given page with a page site.
-	 * <p>
-	 * Subclasses should call this method after the page is created but before
-	 * creating its controls.
-	 * </p>
-	 * <p>
-	 * Subclasses may override
-	 * </p>
-	 * 
-	 * @param page
-	 *            The page to initialize
-	 */
-	protected void initPage(IPageBookViewPage page) {
-		try {
-			page.init(new SubPageSite(getSite()));
-		} catch (PartInitException e) {
-			log.error(e.getMessage());
-		}
-	}
-
-	/**
-	 * Shows a page for the active workbench part.
-	 */
-	private void showBootstrapPart() {
-		IWorkbenchPart part = getBootstrapPart();
-		if (part != null) {
-			partActivated(part);
-		}
-	}
-
-	/**
-	 * Returns the active, important workbench part for this view.
-	 * 
-	 * @return the active important part, or <code>null</code> if none
-	 */
-	private IWorkbenchPart getBootstrapPart() {
-		IWorkbenchPage page = getSite().getPage();
-		if (page != null
-				&& page.getActiveEditor() instanceof MultiPageEditorPart) {
-			// get active editor of mutli-page editor.
-			return (IWorkbenchPart) page.getActiveEditor().getAdapter(
-					IEditorPart.class);
-		}
-        return null;
-	}
-
-	/**
-	 * This method shows the page when the given part is activated. Subclasses
-	 * may extend.
-	 */
-	private void partActivated(IWorkbenchPart part) {
-		// Is this an important part? If not just return.
-		if (!isImportant(part)) {
-			return;
-		}
-
-		// Create a page for the part.
-		PageRec rec = getPageRec(part);
-		if (rec == null) {
-			rec = createPage(part);
-		}
-
-		// Show the page.
-		if (rec != null) {
-			showPageRec(rec);
-		} else {
-			showPageRec(defaultPageRec);
-		}
-	}
-
-	/**
-	 * Returns true if the page has already been created.
-	 * 
-	 * @param page
-	 *            the page to test
-	 * @return true if this page has already been created.
-	 */
-	private boolean doesPageExist(IPage page) {
-		return mapPageToSite.containsKey(page);
-	}
-
-	/**
-	 * Returns whether the given part should be added to this view.
-	 * 
-	 * @param part
-	 *            the input part
-	 * @return <code>true</code> if the part is relevant, and
-	 *         <code>false</code> otherwise
-	 */
-	protected boolean isImportant(IWorkbenchPart part) {
-		// We only care about editors
-		return (part instanceof IEditorPart);
-	}
-
-	/**
-	 * get the composite control (Container) of source MultiPageEditorPart
-	 * 
-	 * @return - the composite control (Container)
-	 */
-	private CTabFolder getContainerForMultiPageEditorPart() {
-		if (null == tabFolder) {
-			tabFolder = ((CTabFolder) (getSite().getPage().getActiveEditor()
-					.getAdapter(CTabFolder.class)));
-		}
-		return tabFolder;
-	}
-
-	/**
-	 * Removes a page record. If it is the last reference to the page dispose of
-	 * it - otherwise just decrement the reference count.
-	 * 
-	 * @param rec
-	 */
-	private void removePage(PageRec rec) {
-		mapPartToRec.remove(rec.part);
-		IPageSite site = (IPageSite) mapPageToSite.remove(rec.page);
-
-		if (rec.subActionBars != null) {
-			rec.subActionBars.dispose();
-		}
-
-		Control control = rec.page.getControl();
-		if (control != null && !control.isDisposed()) {
-			// Dispose the page's control so pages don't have to do this in
-			// their
-			// dispose method.
-			// The page's control is a child of this view's control so if this
-			// view
-			// is closed, the page's control will already be disposed.
-			control.dispose();
-		}
-
-		if (site instanceof SubPageSite) {
-			((SubPageSite) site).dispose();
-		}
-
-		// free the page
-		doDestroyPage(rec.part, rec);
-	}
-
-	/**
-	 * Destroys a page in the pagebook for a particular part.
-	 * 
-	 * @param part
-	 *            the input part
-	 * @param rec
-	 *            a page record for the part
-	 */
-	protected void doDestroyPage(IWorkbenchPart part, PageRec rec) {
-		IContentOutlinePage page = (IContentOutlinePage) rec.page;
-		page.dispose();
-		rec.dispose();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.part.Page#getControl()
-	 */
-	public Control getControl() {
-		return pageBook;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.part.Page#setFocus()
-	 */
-	public void setFocus() {
-		if (getControl() != null) {
-			getControl().setFocus();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#addSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
-	 */
-	public void addSelectionChangedListener(ISelectionChangedListener listener) {
-		selectionChangedListeners.add(listener);
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#getSelection()
-	 */
-	public ISelection getSelection() {
-		// get the selection provider from the current page
-		IPage currentPage = getCurrentPage();
-		// during workbench startup we may be in a state when
-		// there is no current page
-		if (currentPage == null) {
-			return StructuredSelection.EMPTY;
-		}
-		IPageSite site = getPageSite(currentPage);
-		if (site == null) {
-			return StructuredSelection.EMPTY;
-		}
-		ISelectionProvider selProvider = site.getSelectionProvider();
-		if (selProvider != null) {
-			return selProvider.getSelection();
-		}
-		return StructuredSelection.EMPTY;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#removeSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
-	 */
-	public void removeSelectionChangedListener(
-			ISelectionChangedListener listener) {
-		selectionChangedListeners.remove(listener);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#setSelection(org.eclipse.jface.viewers.ISelection)
-	 */
-	public void setSelection(ISelection selection) {
-		// get the selection provider from the current page
-		IPage currentPage = getCurrentPage();
-		// during workbench startup we may be in a state when
-		// there is no current page
-		if (currentPage == null) {
-			return;
-		}
-		IPageSite site = getPageSite(currentPage);
-		if (site == null) {
-			return;
-		}
-		ISelectionProvider selProvider = site.getSelectionProvider();
-		// and set its selection
-		if (selProvider != null) {
-			selProvider.setSelection(selection);
-		}
-	}
-
-	/**
-	 * The selection has changed. Process the event.
-	 * 
-	 * @param event
-	 */
-	public void pageSelectionChanged(final SelectionChangedEvent event) {
-		// pass on the notification to listeners
-		Object[] listeners = selectionChangedListeners.getListeners();
-		for (int i = 0; i < listeners.length; ++i) {
-			final ISelectionChangedListener l = (ISelectionChangedListener) listeners[i];
-			SafeRunner.run(new SafeRunnable() {
-				public void run() {
-					l.selectionChanged(event);
-				}
-			});
-		}
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see SelectionListener#widgetSelected(SelectionEvent)
-	 */
-	public void widgetSelected(SelectionEvent e) {
-		EditorPart part = (EditorPart) ((CTabItem) e.item).getData();
-
-		if (part != null) {
-			partActivated(part);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see SelectionListener#widgetDefaultSelected(SelectionEvent)
-	 */
-	public void widgetDefaultSelected(SelectionEvent e) {
-        // do nothing: no handling of default selected event
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/MyEditingDomainActionContributor.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/MyEditingDomainActionContributor.java
deleted file mode 100644
index 6c2559a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/MyEditingDomainActionContributor.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-
-package org.eclipse.jst.jsf.facesconfig.ui;
-
-import org.eclipse.emf.edit.domain.IEditingDomainProvider;
-import org.eclipse.emf.edit.ui.action.EditingDomainActionBarContributor;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.actions.ActionFactory;
-
-/**
- * The action contributor for form based page.
- * 
- * @author hmeng
- * 
- */
-public class MyEditingDomainActionContributor extends
-		EditingDomainActionBarContributor implements INestedActionContributor {
-	/**
-	 * Default constructor
-	 */
-	public MyEditingDomainActionContributor() {
-		super();
-	}
-
-	public void setActiveEditor(IEditorPart part) {
-		if (getActiveEditor() != null) {
-			deactivate();
-		}
-		super.setActiveEditor(part);
-		IActionBars actionBars = getActionBars();
-		actionBars.clearGlobalActionHandlers();
-		if (part instanceof IEditingDomainProvider) {
-			actionBars.setGlobalActionHandler(ActionFactory.DELETE.getId(),
-					deleteAction);
-			actionBars.setGlobalActionHandler(ActionFactory.UNDO.getId(),
-					undoAction);
-			actionBars.setGlobalActionHandler(ActionFactory.REDO.getId(),
-					redoAction);
-			// actionBars.setGlobalActionHandler(ActionFactory.CUT.getId(),
-			// cutAction);
-			// actionBars.setGlobalActionHandler(ActionFactory.COPY.getId(),
-			// copyAction);
-			// actionBars.setGlobalActionHandler(ActionFactory.PASTE.getId(),
-			// pasteAction);
-			activate();
-		}
-	}
-
-	public void update() {
-		if (getActiveEditor() instanceof IEditingDomainProvider) {
-			super.update();
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/SubPageSite.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/SubPageSite.java
deleted file mode 100644
index 9b459e8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/SubPageSite.java
+++ /dev/null
@@ -1,167 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.SubActionBars;
-import org.eclipse.ui.part.IPageSite;
-
-/**
- * 
- * This implementation of <code>IPageSite</code> provides a site for a sub
- * page within a <code>Page</code>. Most methods are forwarded to the parent
- * page's site.
- * 
- * @author Xiao-guang Zhang
- */
-public class SubPageSite implements IPageSite {
-
-	/**
-	 * The "parent" Page site
-	 */
-	private IPageSite parentSite;
-
-	/**
-	 * A selection provider set by the page. Value is <code>null</code> until
-	 * set.
-	 */
-	private ISelectionProvider selectionProvider;
-
-	/**
-	 * The action bars for this site
-	 */
-	private SubActionBars subActionBars;
-
-	/**
-	 * The list of menu extender for each registered menu.
-	 */
-//	private ArrayList menuExtenders;
-
-	/**
-	 * Creates a new sub page site of the given parent page site.
-	 * 
-	 * @param parentSite
-	 *            the parent view site
-	 */
-	public SubPageSite(IPageSite parentSite) {
-		Assert.isNotNull(parentSite);
-		this.parentSite = parentSite;
-		subActionBars = new SubActionBars(this.parentSite.getActionBars());
-	}
-
-	/**
-	 * Disposes of the menu extender contributions.
-	 */
-	protected void dispose() {
-		// if (menuExtenders != null) {
-		// for (int i = 0; i < menuExtenders.size(); i++) {
-		// ((PopupMenuExtender) menuExtenders.get(i)).dispose();
-		// }
-		// menuExtenders = null;
-		//		}
-		subActionBars.dispose();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.part.IPageSite#registerContextMenu(java.lang.String,
-	 *      org.eclipse.jface.action.MenuManager,
-	 *      org.eclipse.jface.viewers.ISelectionProvider)
-	 */
-	public void registerContextMenu(String menuId, MenuManager menuManager,
-			ISelectionProvider selectionProvider1) {
-
-		parentSite.registerContextMenu(menuId, menuManager, selectionProvider1);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.part.IPageSite#getActionBars()
-	 */
-	public IActionBars getActionBars() {
-		return subActionBars;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.IWorkbenchSite#getPage()
-	 */
-	public IWorkbenchPage getPage() {
-		return parentSite.getPage();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.IWorkbenchSite#getSelectionProvider()
-	 */
-	public ISelectionProvider getSelectionProvider() {
-		return selectionProvider;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.IWorkbenchSite#getShell()
-	 */
-	public Shell getShell() {
-		return parentSite.getShell();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.IWorkbenchSite#getWorkbenchWindow()
-	 */
-	public IWorkbenchWindow getWorkbenchWindow() {
-		return parentSite.getWorkbenchWindow();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.IWorkbenchSite#setSelectionProvider(org.eclipse.jface.viewers.ISelectionProvider)
-	 */
-	public void setSelectionProvider(ISelectionProvider provider) {
-		selectionProvider = provider;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
-	 */
-	public Object getAdapter(Class adapter) {
-		return parentSite.getAdapter(adapter);
-	}
-
-	public Object getService(Class api) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	public boolean hasService(Class api) {
-		// TODO Auto-generated method stub
-		return false;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/AddEditAttributeDialog.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/AddEditAttributeDialog.java
deleted file mode 100644
index 5017085..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/AddEditAttributeDialog.java
+++ /dev/null
@@ -1,269 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.dialog;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.ClassButtonDialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.LayoutUtil;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.StringDialogField;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.TabFolder;
-import org.eclipse.swt.widgets.TabItem;
-
-/**
- * The dialog is for adding and editing attribute.
- * 
- * @author sfshi
- * 
- */
-public class AddEditAttributeDialog extends Dialog {
-
-	private static final int MIN_DIALOG_WIDTH = 300;
-
-	private StringDialogField attributeNameField;
-
-	private ClassButtonDialogField attributeClassField;
-
-	private StringDialogField defaultValueField;
-
-	private StringDialogField suggestedValueField;
-
-	private IProject project;
-
-	private String attributeName;
-
-	private String attributeClass;
-
-	private String defaultValue;
-
-	private String suggestedValue;
-
-	private boolean isNew;
-
-	/**
-	 * @param parentShell
-	 * @param isNew
-	 */
-	public AddEditAttributeDialog(Shell parentShell, boolean isNew) {
-		super(parentShell);
-		this.isNew = isNew;
-	}
-
-	/**
-	 * 
-	 * @param parentShell
-	 * @param attributeName
-	 * @param attributeClass
-	 * @param defaultValue
-	 * @param suggestedValue
-	 */
-	public AddEditAttributeDialog(Shell parentShell, String attributeName,
-			String attributeClass, String defaultValue, String suggestedValue) {
-		super(parentShell);
-		this.attributeName = attributeName;
-		this.attributeClass = attributeClass;
-		this.defaultValue = defaultValue;
-		this.suggestedValue = suggestedValue;
-		this.isNew = false;
-	}
-
-	/*
-	 * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
-	 */
-	protected void configureShell(Shell newShell) {
-		super.configureShell(newShell);
-		if (isNew)
-			newShell.setText(EditorMessages.AttributeSection_Dialog_Title_Add);
-		else
-			newShell
-					.setText(EditorMessages.AttributeSection_Dialog_Title_Edit);
-	}
-
-	/*
-	 * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Control createDialogArea(Composite parent) {
-		Composite container = new Composite(parent, SWT.FILL);
-		GridLayout layout = new GridLayout();
-		layout.numColumns = 2;
-		layout.marginWidth = layout.marginHeight = 5;
-		container.setLayout(layout);
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		container.setLayoutData(gd);
-
-		TabFolder tabFolder = new TabFolder(container, SWT.FILL);
-		tabFolder.setLayoutData(gd);
-		TabItem generalTabItem = new TabItem(tabFolder, SWT.NONE);
-		generalTabItem
-				.setText(EditorMessages.AttributeSection_Dialog_Tab_General);
-		Control control = createGeneralTabControl(generalTabItem.getParent());
-		generalTabItem.setControl(control);
-		return container;
-	}
-
-	/**
-	 * @param parent
-	 * @return
-	 */
-	private Control createGeneralTabControl(Composite parent) {
-		Composite composite = new Composite(parent, SWT.NONE);
-		GridLayout layout = new GridLayout();
-		layout.numColumns = 5;
-		composite.setLayout(layout);
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		composite.setLayoutData(gd);
-		composite.setFont(parent.getFont());
-
-		attributeNameField = new StringDialogField();
-//		attributeNameField.setRequired(true);
-		attributeNameField
-				.setLabelText(EditorMessages.AttributeSection_Dialog_AttributeName);
-
-		attributeClassField = new ClassButtonDialogField(getProject());
-//		attributeClassField.setRequired(true);
-		attributeClassField
-				.setLabelText(EditorMessages.AttributeSection_Dialog_AttributeClass);
-
-		attributeClassField.setAutoOpenResource(false);
-
-		defaultValueField = new StringDialogField();
-		defaultValueField
-				.setLabelText(EditorMessages.AttributeSection_Dialog_DefaultValue);
-
-		suggestedValueField = new StringDialogField();
-		suggestedValueField
-				.setLabelText(EditorMessages.AttributeSection_Dialog_SuggestedValue);
-
-		GridData data = new GridData(GridData.FILL_BOTH);
-		composite.setLayoutData(data);
-
-		int numberOfColumns = 4;
-		GridLayout gl = new GridLayout(numberOfColumns, false);
-		composite.setLayout(gl);
-
-		attributeNameField.doFillIntoGrid(null, composite, numberOfColumns);
-
-		attributeClassField.doFillIntoGrid(null, composite, numberOfColumns);
-
-		defaultValueField.doFillIntoGrid(null, composite, numberOfColumns);
-
-		suggestedValueField.doFillIntoGrid(null, composite, numberOfColumns);
-
-		LayoutUtil.setHorizontalGrabbing(attributeClassField.getTextControl(
-				null, composite));
-
-		// set the initial value for these fields.
-		attributeNameField.setText(attributeName);
-		attributeClassField.setText(attributeClass);
-		defaultValueField.setText(defaultValue);
-		suggestedValueField.setText(suggestedValue);
-
-		return composite;
-	}
-
-	/*
-	 * @see org.eclipse.jface.window.Window#getInitialSize()
-	 */
-	protected Point getInitialSize() {
-		Point shellSize = super.getInitialSize();
-		return new Point(Math.max(
-				convertHorizontalDLUsToPixels(MIN_DIALOG_WIDTH), shellSize.x),
-				shellSize.y);
-	}
-
-	private IProject getProject() {
-		return project;
-	}
-
-	/**
-	 * 
-	 */
-	protected void okPressed() {
-		attributeName = attributeNameField.getText();
-		attributeClass = attributeClassField.getText();
-		defaultValue = defaultValueField.getText();
-		suggestedValue = suggestedValueField.getText();
-
-		super.okPressed();
-	}
-
-	/**
-	 * @return the attribute class
-	 */
-	public String getAttributeClass() {
-		return attributeClass;
-	}
-
-	/**
-	 * @param attributeClass
-	 */
-	public void setAttributeClass(String attributeClass) {
-		this.attributeClass = attributeClass;
-	}
-
-	/**
-	 * @return the attribute name
-	 */
-	public String getAttributeName() {
-		return attributeName;
-	}
-
-	/**
-	 * @param attributeName
-	 */
-	public void setAttributeName(String attributeName) {
-		this.attributeName = attributeName;
-	}
-
-	/**
-	 * @return the default value
-	 */
-	public String getDefaultValue() {
-		return defaultValue;
-	}
-
-	/**
-	 * @param defaultValue
-	 */
-	public void setDefaultValue(String defaultValue) {
-		this.defaultValue = defaultValue;
-	}
-
-	/**
-	 * @return the suggested value
-	 */
-	public String getSuggestedValue() {
-		return suggestedValue;
-	}
-
-	/**
-	 * @param suggestedValue
-	 */
-	public void setSuggestedValue(String suggestedValue) {
-		this.suggestedValue = suggestedValue;
-	}
-
-	/**
-	 * @param project
-	 */
-	public void setProject(IProject project) {
-		this.project = project;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/AddEditFacetDialog.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/AddEditFacetDialog.java
deleted file mode 100644
index d0df52d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/AddEditFacetDialog.java
+++ /dev/null
@@ -1,226 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.dialog;
-
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.LayoutUtil;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.StringDialogField;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.TabFolder;
-import org.eclipse.swt.widgets.TabItem;
-
-/**
- * The dialog is for adding and editing a facet.
- * 
- * @author sfshi
- * 
- */
-public class AddEditFacetDialog extends Dialog {
-
-	private StringDialogField facetNameField;
-
-	private StringDialogField displayNameField;
-
-	private StringDialogField descriptionField;
-
-	private boolean isNew;
-
-	private static final int MIN_DIALOG_WIDTH = 300;
-
-	private String facetName;
-
-	private String displayName;
-
-	private String description;
-
-	/**
-	 * Constructor of this dialog, could be used for adding and editing, usually
-	 * it is used for adding;
-	 * 
-	 * @param parentShell
-	 * @param isNew
-	 *            whether this dialog is used for create a new facet or not;
-	 */
-	public AddEditFacetDialog(Shell parentShell, boolean isNew) {
-		super(parentShell);
-		this.isNew = isNew;
-	}
-
-	/**
-	 * Usually this contructor is used for editing a facet, passing the original
-	 * values of facet here.
-	 * 
-	 * @param parentShell
-	 * @param facetName
-	 *            the original text value of facet-name element;
-	 * @param displayName
-	 *            the original text value of display-name element;
-	 * @param description
-	 *            the original text value of description element;
-	 */
-	public AddEditFacetDialog(Shell parentShell, String facetName,
-			String displayName, String description) {
-		super(parentShell);
-		this.facetName = facetName;
-		this.displayName = displayName;
-		this.description = description;
-		this.isNew = false;
-	}
-
-	/*
-	 * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
-	 */
-	protected void configureShell(Shell newShell) {
-		super.configureShell(newShell);
-		if (isNew)
-			newShell.setText(EditorMessages.FacetSection_Dialog_Title_Add);
-		else
-			newShell.setText(EditorMessages.FacetSection_Dialog_Title_Edit);
-	}
-
-	/*
-	 * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Control createDialogArea(Composite parent) {
-		Composite container = new Composite(parent, SWT.FILL);
-		GridLayout layout = new GridLayout();
-		layout.numColumns = 2;
-		layout.marginWidth = layout.marginHeight = 5;
-		container.setLayout(layout);
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		container.setLayoutData(gd);
-
-		TabFolder tabFolder = new TabFolder(container, SWT.FILL);
-		tabFolder.setLayoutData(gd);
-		TabItem generalTabItem = new TabItem(tabFolder, SWT.NONE);
-		generalTabItem.setText(EditorMessages.FacetSection_Dialog_Tab_General);
-		Control control = createGeneralTabControl(generalTabItem.getParent());
-		generalTabItem.setControl(control);
-		return container;
-	}
-
-	/**
-	 * @param parent
-	 * @return
-	 */
-	private Control createGeneralTabControl(Composite parent) {
-		Composite composite = new Composite(parent, SWT.NONE);
-		GridLayout layout = new GridLayout();
-		layout.numColumns = 5;
-		composite.setLayout(layout);
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		composite.setLayoutData(gd);
-		composite.setFont(parent.getFont());
-
-		facetNameField = new StringDialogField();
-//		facetNameField.setRequired(true);
-		facetNameField
-				.setLabelText(EditorMessages.FacetSection_Dialog_FacetName);
-
-		displayNameField = new StringDialogField();
-		displayNameField
-				.setLabelText(EditorMessages.FacetSection_Dialog_DisplayName);
-
-		descriptionField = new StringDialogField();
-		descriptionField
-				.setLabelText(EditorMessages.FacetSection_Dialog_Description);
-
-		GridData data = new GridData(GridData.FILL_BOTH);
-		composite.setLayoutData(data);
-
-		int numberOfColumns = 4;
-		GridLayout gl = new GridLayout(numberOfColumns, false);
-		composite.setLayout(gl);
-
-		facetNameField.doFillIntoGrid(null, composite, numberOfColumns);
-		displayNameField.doFillIntoGrid(null, composite, numberOfColumns);
-
-		descriptionField.doFillIntoGrid(null, composite, numberOfColumns);
-
-		LayoutUtil.setHorizontalGrabbing(facetNameField.getTextControl(null,
-				composite));
-
-		// set the initial value for these fields.
-		facetNameField.setText(facetName);
-		displayNameField.setText(displayName);
-		descriptionField.setText(description);
-
-		return composite;
-	}
-
-	/*
-	 * @see org.eclipse.jface.window.Window#getInitialSize()
-	 */
-	protected Point getInitialSize() {
-		Point shellSize = super.getInitialSize();
-		return new Point(Math.max(
-				convertHorizontalDLUsToPixels(MIN_DIALOG_WIDTH), shellSize.x),
-				shellSize.y);
-	}
-
-	protected void okPressed() {
-		facetName = facetNameField.getText();
-		displayName = displayNameField.getText();
-		description = descriptionField.getText();
-		super.okPressed();
-	}
-
-	/**
-	 * @return the description
-	 */
-	public String getDescription() {
-		return description;
-	}
-
-	/**
-	 * @return the display name
-	 */
-	public String getDisplayName() {
-		return displayName;
-	}
-
-	/**
-	 * @return the facet name
-	 */
-	public String getFacetName() {
-		return facetName;
-	}
-
-	/**
-	 * @param description
-	 */
-	public void setDescription(String description) {
-		this.description = description;
-	}
-
-	/**
-	 * @param displayName
-	 */
-	public void setDisplayName(String displayName) {
-		this.displayName = displayName;
-	}
-
-	/**
-	 * @param facetName
-	 */
-	public void setFacetName(String facetName) {
-		this.facetName = facetName;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/AddEditManagedPropertyDialog.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/AddEditManagedPropertyDialog.java
deleted file mode 100644
index b54adc4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/AddEditManagedPropertyDialog.java
+++ /dev/null
@@ -1,530 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.dialog;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.window.Window;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.ClassButtonDialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.ComboDialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogFieldApplyListener;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.IStringButtonAdapter;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.LayoutUtil;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.StringButtonDialogField;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.ListEntriesType;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType;
-import org.eclipse.jst.jsf.facesconfig.emf.MapEntriesType;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.jst.jsf.facesconfig.ui.IFacesConfigConstants;
-import org.eclipse.jst.jsf.facesconfig.ui.section.AbstractFacesConfigSection;
-import org.eclipse.jst.jsf.facesconfig.ui.util.JavaBeanProperty;
-import org.eclipse.jst.jsf.facesconfig.ui.util.JavaBeanUtils;
-import org.eclipse.jst.jsf.facesconfig.ui.util.JavaClassUtils;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * The dialog is for adding and editing managed property.
- * 
- * @author sfshi
- * 
- */
-public class AddEditManagedPropertyDialog extends Dialog {
-
-	private static final int MIN_DIALOG_WIDTH = 300;
-
-	private static final int DEFAULT_CONTROL_WIDTH = 200;
-
-	private ComboDialogField nameField;
-
-	private ClassButtonDialogField classField;
-
-	private ComboDialogField valueTypeField;
-
-	private StringButtonDialogField valueField;
-
-	private IProject project;
-
-	private String propertyName;
-
-	private String propertyClass;
-
-	private String valueType;
-
-	/**
-	 * the value could be a string, or instance of <code>NullValueType</code>,
-	 * <code>MapEntriesType</code> and <code>ListEntriesType</code>.
-	 */
-	private Object valueObject;
-
-	private ManagedBeanType managedBean;
-
-	/**
-	 * the list of this bean properties.
-	 */
-	private List beanPropertyList;
-
-	/**
-	 * the managed-property object that is editing, but it will be read-only.
-	 */
-	private ManagedPropertyType managedProperty;
-
-	// private FormToolkit toolkit;
-
-	private Composite parent;
-
-	private static final String[] valueTypes = { IFacesConfigConstants.VALUE,
-			IFacesConfigConstants.NULL_VALUE,
-			IFacesConfigConstants.MAP_ENTRIES,
-			IFacesConfigConstants.LIST_ENTRIES };
-
-	private boolean isNew;
-
-	private AbstractFacesConfigSection section;
-
-	/**
-	 * constructor for adding a managed property.
-	 * 
-	 * @param parentShell
-	 * @param managedBean
-	 * @param section 
-	 */
-	public AddEditManagedPropertyDialog(Shell parentShell,
-			ManagedBeanType managedBean, AbstractFacesConfigSection section) {
-		super(parentShell);
-		this.isNew = true;
-		this.managedBean = managedBean;
-		this.section = section;
-	}
-
-	/**
-	 * 
-	 * @param parentShell
-	 * @param managedProperty
-	 * @param section
-	 */
-	public AddEditManagedPropertyDialog(Shell parentShell,
-			ManagedPropertyType managedProperty, AbstractFacesConfigSection section) {
-		super(parentShell);
-		this.isNew = false;
-		this.managedProperty = managedProperty;
-		this.managedBean = (ManagedBeanType) managedProperty.eContainer();
-		this.section = section;
-	}
-
-	/*
-	 * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
-	 */
-	protected void configureShell(Shell newShell) {
-		super.configureShell(newShell);
-		if (isNew)
-			newShell.setText(EditorMessages.AddEditManagedPropertyDialog_Add);
-		else
-			newShell.setText(EditorMessages.AddEditManagedPropertyDialog_Edit);
-	}
-
-	/*
-	 * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Control createDialogArea(Composite parent_) {
-		Composite container = new Composite(parent_, SWT.FILL);
-		this.parent = container;
-		GridLayout layout = new GridLayout();
-		layout.numColumns = 2;
-		layout.marginWidth = layout.marginHeight = 5;
-		container.setLayout(layout);
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		container.setLayoutData(gd);
-
-		nameField = new ComboDialogField(SWT.DROP_DOWN | SWT.READ_ONLY
-				| SWT.BORDER);
-		nameField.setLabelText(EditorMessages.ManagedBeanPropertyEditDialog_PropertyName);
-
-		int propertyCount = 0;
-		beanPropertyList = getBeanPropertyList(managedBean);
-		if (beanPropertyList != null)
-			propertyCount = beanPropertyList.size();
-
-		if (propertyCount > 0) {
-			String[] propertyNames = new String[propertyCount];
-
-			for (int i = 0; i < propertyCount; i++) {
-				JavaBeanProperty property = (JavaBeanProperty) beanPropertyList
-						.get(i);
-				propertyNames[i] = property.getName();
-			}
-			nameField.setItems(propertyNames);
-		}
-
-		nameField.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
-			public void dialogFieldApplied(DialogField field) {
-				handleNameSelection(((ComboDialogField) field).getText());
-			}
-		});
-
-		classField = new ClassButtonDialogField(null);
-		classField.setProject(getProject());
-		classField.setLabelText(EditorMessages.ManagedBeanPropertyEditDialog_PropertyClass);
-
-		valueTypeField = new ComboDialogField(SWT.DROP_DOWN | SWT.READ_ONLY
-				| SWT.BORDER);
-		valueTypeField.setLabelText(EditorMessages.ManagedBeanPropertyEditDialog_ValueType);
-
-		valueTypeField.setItems(valueTypes);
-		valueTypeField
-				.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
-					public void dialogFieldApplied(DialogField field) {
-						updateValueStatus();
-					}
-				});
-
-		valueField = new StringButtonDialogField(new IStringButtonAdapter() {
-			public void changeControlPressed(DialogField field) {
-				handleChangeValue(valueTypeField.getText(),
-						((StringButtonDialogField) field).getText());
-			}
-
-		});
-
-		valueField.setLabelText(EditorMessages.ManagedBeanPropertyEditDialog_Value);
-		valueField.setButtonLabel(EditorMessages.UI_Button_Edit_more);
-
-		valueField.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
-
-			public void dialogFieldApplied(DialogField field) {
-				valueObject = ((StringButtonDialogField) field).getText();
-
-			}
-		});
-
-		GridData data = new GridData(GridData.FILL_BOTH);
-		container.setLayoutData(data);
-
-		int numberOfColumns = 5;
-		GridLayout gl = new GridLayout(numberOfColumns, false);
-		container.setLayout(gl);
-
-		nameField.doFillIntoGrid(null, container, numberOfColumns);
-		LayoutUtil.setWidthHint(nameField.getComboControl(null, container),
-				DEFAULT_CONTROL_WIDTH);
-
-		classField.doFillIntoGrid(null, container, numberOfColumns - 1);
-		data = new GridData(SWT.FILL, SWT.CENTER, false, false);
-		data.horizontalSpan = 2;
-		classField.getChangeControl(null, container).setLayoutData(data);
-		LayoutUtil.setWidthHint(classField.getTextControl(null, container),
-				DEFAULT_CONTROL_WIDTH);
-
-		valueTypeField.doFillIntoGrid(null, container, numberOfColumns);
-
-		valueField.doFillIntoGrid(null, container, numberOfColumns);
-
-		LayoutUtil.setHorizontalGrabbing(classField.getTextControl(null,
-				container));
-
-		valueTypeField.selectItem(0);
-
-		if (!isNew && managedProperty != null) {
-			initFields();
-		}
-
-		return container;
-	}
-
-	private void initFields() {
-
-		if (managedProperty.getPropertyName() != null)
-			nameField.setText(managedProperty.getPropertyName()
-					.getTextContent());
-
-		if (managedProperty.getPropertyClass() != null)
-			classField.setText(managedProperty.getPropertyClass()
-					.getTextContent());
-
-		if (managedProperty.getValue() != null) {
-			valueTypeField.setText(valueTypes[0]);
-			valueField.setText(managedProperty.getValue().getTextContent());
-		} else if (managedProperty.getNullValue() != null)
-			valueTypeField.setText(valueTypes[1]);
-		else if (managedProperty.getMapEntries() != null)
-			valueTypeField.setText(valueTypes[2]);
-		else if (managedProperty.getListEntries() != null)
-			valueTypeField.setText(valueTypes[3]);
-		else
-			valueTypeField.setText(valueTypes[0]);
-		updateValueStatus();
-	}
-
-	/**
-	 * @param text
-	 */
-	protected void handleNameSelection(String text) {
-		int propertyCount = 0;
-		if (beanPropertyList != null)
-			propertyCount = beanPropertyList.size();
-
-		if (propertyCount > 0) {
-			for (int i = 0; i < propertyCount; i++) {
-				JavaBeanProperty property = (JavaBeanProperty) beanPropertyList
-						.get(i);
-
-				if (property.getName().equals(text.trim())) {
-					classField.setText(property.getQualifiedType());
-					break;
-				}
-			}
-		}
-
-	}
-
-	private void updateValueStatus() {
-		if (valueField == null) {
-			return;
-		}
-		valueObject = null;
-		if (valueTypeField.getText().equalsIgnoreCase(
-				IFacesConfigConstants.NULL_VALUE)) {
-			valueField.setEnabled(false);
-			valueObject = FacesConfigFactory.eINSTANCE.createNullValueType();
-		} else if (valueTypeField.getText().equalsIgnoreCase(
-				IFacesConfigConstants.MAP_ENTRIES)
-				|| valueTypeField.getText().equalsIgnoreCase(
-						IFacesConfigConstants.LIST_ENTRIES)) {
-			valueField.getTextControl(null, parent).setEditable(false);
-			valueField.setEnabled(true);
-		} else {
-			
-			valueObject = valueField.getText(); //Bug 173831
-			valueField.getTextControl(null, parent).setEditable(true);
-			valueField.setEnabled(true);
-		}
-	}
-
-	/**
-	 * @param valueType_ 
-	 * @param value 
-	 */
-	protected void handleChangeValue(String valueType_, String value) {
-		if (valueType_.equalsIgnoreCase(IFacesConfigConstants.VALUE)) {
-			handleChangeLongStringValue(value);
-		} else if (valueType_
-				.equalsIgnoreCase(IFacesConfigConstants.MAP_ENTRIES)) {
-			handleChangeMapEntries();
-		} else if (valueType_
-				.equalsIgnoreCase(IFacesConfigConstants.LIST_ENTRIES)) {
-			handleChangeListEntries();
-		}
-	}
-
-	/**
-	 * @param textControl
-	 */
-	private void handleChangeLongStringValue(String value) {
-		EditValueDialog valueDialog = new EditValueDialog(EditorPlugin
-				.getActiveShell(), value);
-		if (valueDialog.open() == Window.OK) {
-			valueField.setText((String) valueDialog.getResultData());
-			valueObject = valueDialog.getResultData();
-		}
-	}
-
-	/**
-	 * 
-	 */
-	private void handleChangeMapEntries() {
-
-		MapEntriesType mapEntries;
-
-		if (valueObject instanceof MapEntriesType)
-			mapEntries = (MapEntriesType) valueObject;
-		else if (isNew || managedProperty.getMapEntries() == null) {
-			mapEntries = FacesConfigFactory.eINSTANCE.createMapEntriesType();
-		} else {
-			mapEntries = EcoreUtil.copy(managedProperty
-					.getMapEntries());
-		}
-
-		EditMapEntriesDialog dialog = new EditMapEntriesDialog(EditorPlugin
-				.getActiveShell(), mapEntries, section);
-		if (dialog.open() == Dialog.OK) {
-			valueObject = dialog.getMapEntries();
-		} else {
-			//user cancel the dialog, then restore.
-			if (!isNew && managedProperty.getMapEntries() != null)
-				valueObject = EcoreUtil.copy(managedProperty
-						.getMapEntries());
-			// else
-			//				valueObject = null;
-		}
-	}
-
-	private void handleChangeListEntries() {
-		ListEntriesType listEntries;
-
-		if (valueObject instanceof ListEntriesType)
-			listEntries = (ListEntriesType) valueObject;
-		else if (isNew || managedProperty.getListEntries() == null) {
-			listEntries = FacesConfigFactory.eINSTANCE.createListEntriesType();
-		} else {
-			listEntries = EcoreUtil.copy(managedProperty
-					.getListEntries());
-		}
-
-		EditListEntriesDialog dialog = new EditListEntriesDialog(EditorPlugin
-				.getActiveShell(), listEntries, section);
-		if (dialog.open() == Dialog.OK) {
-			valueObject = dialog.getListEntries();
-		} else {
-			//user cancel the dialog, then restore.
-			if (!isNew && managedProperty.getListEntries() != null)
-				valueObject = EcoreUtil.copy(managedProperty
-						.getListEntries());
-			// else
-			// valueObject = null;
-		}
-	}
-
-	/**
-	 * Get a list of JavaBeanProperty that from the managed bean class.
-	 * 
-	 * @return
-	 */
-	private List getBeanPropertyList(ManagedBeanType managedBean_) {
-		if (managedBean_.getManagedBeanClass() == null)
-			return null;
-		String beanClassName = managedBean_.getManagedBeanClass()
-				.getTextContent();
-		IType classType = JavaClassUtils.getType(getProject(), beanClassName);
-		if (classType == null) {
-			return null;
-		}
-		List list = new ArrayList();
-		JavaBeanProperty[] properties = JavaBeanUtils
-				.getBeanProperties(classType);
-		if (properties != null) {
-			for (int i = 0; i < properties.length; i++) {
-				list.add(properties[i]);
-			}
-		}
-		return list;
-	}
-
-	/*
-	 * @see org.eclipse.jface.window.Window#getInitialSize()
-	 */
-	protected Point getInitialSize() {
-		Point shellSize = super.getInitialSize();
-		return new Point(Math.max(
-				convertHorizontalDLUsToPixels(MIN_DIALOG_WIDTH), shellSize.x),
-				shellSize.y);
-	}
-
-	/**
-	 * @return the project
-	 */
-	public IProject getProject() {
-		if (project == null) {
-			project = (IProject) section.getPage().getEditor().getAdapter(
-					IProject.class);
-		}
-		return project;
-	}
-
-	/**
-	 * 
-	 */
-	protected void okPressed() {
-		propertyName = nameField.getText();
-		propertyClass = classField.getText();
-		valueType = valueTypeField.getText();
-
-		super.okPressed();
-	}
-
-	/**
-	 * @return the property class
-	 */
-	public String getPropertyClass() {
-		return propertyClass;
-	}
-
-	/**
-	 * @param attributeClass
-	 */
-	public void setAttributeClass(String attributeClass) {
-		this.propertyClass = attributeClass;
-	}
-
-	/**
-	 * @return the property name
-	 */
-	public String getPropertyName() {
-		return propertyName;
-	}
-
-	/**
-	 * @param attributeName
-	 */
-	public void setAttributeName(String attributeName) {
-		this.propertyName = attributeName;
-	}
-
-	/**
-	 * @return the value type
-	 */
-	public String getValueType() {
-		return valueType;
-	}
-
-	/**
-	 * @param defaultValue
-	 */
-	public void setValueType(String defaultValue) {
-		this.valueType = defaultValue;
-	}
-
-	/**
-	 * @param project
-	 */
-	public void setProject(IProject project) {
-		this.project = project;
-	}
-
-	/**
-	 * @return the value object
-	 */
-	public Object getValueObject() {
-		return valueObject;
-	}
-
-	/**
-	 * @param valueObject
-	 */
-	public void setValueObject(Object valueObject) {
-		this.valueObject = valueObject;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/AddEditMapEntryDialog.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/AddEditMapEntryDialog.java
deleted file mode 100644
index fb254fb..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/AddEditMapEntryDialog.java
+++ /dev/null
@@ -1,255 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.dialog;
-
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.LayoutUtil;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.StringDialogField;
-import org.eclipse.jst.jsf.common.ui.internal.guiutils.SWTUtils;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * The dialog is for adding and editing map-entry.
- * 
- * @author sfshi
- * 
- */
-public class AddEditMapEntryDialog extends Dialog {
-
-	private static final int MIN_DIALOG_WIDTH = 300;
-
-	private static final int VALUE_DEFAULT_LINENUMS = 10;
-
-	private boolean isNew;
-
-	private StringDialogField keyField;
-
-	private Button nullValueTypeButton;
-
-	private StringDialogField valueField;
-
-	private String key;
-
-	private String value;
-
-	private boolean isNullValue;
-
-	/**
-	 * @param parentShell
-	 * @param isNew
-	 */
-	public AddEditMapEntryDialog(Shell parentShell, boolean isNew) {
-		super(parentShell);
-		this.isNew = isNew;
-	}
-
-	/**
-	 * 
-	 * @param parentShell
-	 * @param attributeName
-	 * @param attributeClass
-	 * @param defaultValue
-	 * @param suggestedValue
-	 */
-	public AddEditMapEntryDialog(Shell parentShell, String attributeName,
-			String attributeClass, String defaultValue, String suggestedValue) {
-		super(parentShell);
-		this.isNew = false;
-	}
-
-	/*
-	 * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
-	 */
-	protected void configureShell(Shell newShell) {
-		super.configureShell(newShell);
-		if (isNew)
-			// TODO change it to "add"
-			newShell.setText(EditorMessages.MapEntryEditPage_Title);
-		else
-			newShell.setText(EditorMessages.MapEntryEditPage_Title);
-	}
-
-	/*
-	 * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Control createDialogArea(Composite parent) {
-		Composite container = new Composite(parent, SWT.FILL);
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		container.setLayoutData(gd);
-
-		GridLayout gl = new GridLayout();
-		gl.verticalSpacing = 0;
-		gl.numColumns = 1;
-		container.setLayout(gl);
-
-		layoutKeySection(container);
-		layoutValueSection(container);
-		if (!isNew) {
-			initFields();
-		}
-		return container;
-	}
-
-	private void initFields() {
-		keyField.setText(key);
-		if (this.isNullValue) {
-			nullValueTypeButton.setSelection(true);
-			valueField.setText(""); //$NON-NLS-1$
-			valueField.setEnabled(false);
-		} else {
-			nullValueTypeButton.setSelection(false);
-			valueField.setEnabled(true);
-			valueField.setText(value);
-		}
-	}
-
-	/**
-	 * @param parent
-	 */
-	public void layoutKeySection(Composite parent) {
-		keyField = new StringDialogField();
-		keyField.setLabelText(EditorMessages.MapEntryEditGroup_Key);
-		Composite
-
-		keySection = SWTUtils.createComposite(parent, SWT.NONE);
-
-		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-		keySection.setLayoutData(gd);
-
-		int numberOfColumns = 3;
-		GridLayout gl = new GridLayout(numberOfColumns, false);
-		keySection.setLayout(gl);
-
-		keyField.doFillIntoGrid(null, keySection, numberOfColumns);
-
-		LayoutUtil.setGrabHorizontal(keyField.getTextControl(null, keySection),
-				true);
-
-	}
-
-	/**
-	 * @param parent
-	 */
-	public void layoutValueSection(Composite parent) {
-		Composite valueSection = SWTUtils.createComposite(parent, SWT.NONE);
-
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		valueSection.setLayoutData(gd);
-
-		int numberOfColumns = 3;
-		GridLayout gl = new GridLayout(numberOfColumns, false);
-		gl.verticalSpacing = 10;
-		gl.marginHeight = 10;
-		valueSection.setLayout(gl);
-
-		nullValueTypeButton = SWTUtils.createCheckBox(valueSection,
-				EditorMessages.AddEditMapEntryDialog_NullValue, 2);
-
-		nullValueTypeButton.addSelectionListener(new SelectionAdapter() {
-
-			public void widgetSelected(SelectionEvent e) {
-				valueField.setEnabled(!nullValueTypeButton.getSelection());
-
-			}
-
-		});
-		valueField = new StringDialogField(VALUE_DEFAULT_LINENUMS);
-
-		valueField.setLabelText(EditorMessages.ValueEditGroup_Value);
-		valueField.doFillIntoGrid(null, valueSection, numberOfColumns);
-
-		gd = (GridData) valueField.getLabelControl(null, valueSection)
-				.getLayoutData();
-		gd.verticalAlignment = gd.verticalAlignment | GridData.GRAB_VERTICAL;
-		LayoutUtil.setHorizontalGrabbing(valueField.getTextControl(null,
-				valueSection));
-
-		gd = (GridData) valueField.getTextControl(null, valueSection)
-				.getLayoutData();
-		gd.verticalAlignment = gd.verticalAlignment | GridData.FILL_VERTICAL;
-
-	}
-
-	/*
-	 * @see org.eclipse.jface.window.Window#getInitialSize()
-	 */
-	protected Point getInitialSize() {
-		Point shellSize = super.getInitialSize();
-		return new Point(Math.max(
-				convertHorizontalDLUsToPixels(MIN_DIALOG_WIDTH), shellSize.x),
-				shellSize.y);
-	}
-
-	/**
-	 * 
-	 */
-	protected void okPressed() {
-
-		key = this.keyField.getText().trim();
-		value = this.valueField.getText().trim();
-		isNullValue = nullValueTypeButton.getSelection();
-		super.okPressed();
-	}
-
-	/**
-	 * @return true if is null
-	 */
-	public boolean isNullValue() {
-		return isNullValue;
-	}
-
-	/**
-	 * @param isNullValue
-	 */
-	public void setNullValue(boolean isNullValue) {
-		this.isNullValue = isNullValue;
-	}
-
-	/**
-	 * @return the key 
-	 */ 
-	public String getKey() {
-		return key;
-	}
-
-	/**
-	 * @param key
-	 */
-	public void setKey(String key) {
-		this.key = key;
-	}
-
-	/**
-	 * @return the value
-	 */
-	public String getValue() {
-		return value;
-	}
-
-	/**
-	 * @param value
-	 */
-	public void setValue(String value) {
-		this.value = value;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/AddEditPropertyDialog.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/AddEditPropertyDialog.java
deleted file mode 100644
index 432d064..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/AddEditPropertyDialog.java
+++ /dev/null
@@ -1,270 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.dialog;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.ClassButtonDialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.LayoutUtil;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.StringDialogField;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.TabFolder;
-import org.eclipse.swt.widgets.TabItem;
-
-/**
- * The dialog is for adding and editing property.
- * 
- * @author sfshi
- * 
- */
-public class AddEditPropertyDialog extends Dialog {
-
-	private static final int MIN_DIALOG_WIDTH = 300;
-
-	private StringDialogField propertyNameField;
-
-	private ClassButtonDialogField propertyClassField;
-
-	private StringDialogField defaultValueField;
-
-	private StringDialogField suggestedValueField;
-
-	private IProject project;
-
-	private boolean isNew;
-
-	private String propertyName;
-
-	private String propertyClass;
-
-	private String defaultValue;
-
-	private String suggestedValue;
-
-	/**
-	 * 
-	 * @param parentShell
-	 * @param isNew
-	 */
-	public AddEditPropertyDialog(Shell parentShell, boolean isNew) {
-		super(parentShell);
-		this.isNew = isNew;
-	}
-
-	/**
-	 * 
-	 * @param parentShell
-	 * @param propertyName
-	 * @param propertyClass
-	 * @param defaultValue
-	 * @param suggestedValue
-	 */
-	public AddEditPropertyDialog(Shell parentShell, String propertyName,
-			String propertyClass, String defaultValue, String suggestedValue) {
-		super(parentShell);
-		this.propertyName = propertyName;
-		this.propertyClass = propertyClass;
-		this.defaultValue = defaultValue;
-		this.suggestedValue = suggestedValue;
-		this.isNew = false;
-	}
-
-	/*
-	 * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
-	 */
-	protected void configureShell(Shell newShell) {
-		super.configureShell(newShell);
-		if (isNew)
-			newShell
-					.setText(EditorMessages.PropertySection_Dialog_Title_Add);
-		else
-
-			newShell
-					.setText(EditorMessages.PropertySection_Dialog_Title_Edit);
-	}
-
-	/*
-	 * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Control createDialogArea(Composite parent) {
-		Composite container = new Composite(parent, SWT.FILL);
-		GridLayout layout = new GridLayout();
-		layout.numColumns = 2;
-		layout.marginWidth = layout.marginHeight = 5;
-		container.setLayout(layout);
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		container.setLayoutData(gd);
-
-		TabFolder tabFolder = new TabFolder(container, SWT.FILL);
-		tabFolder.setLayoutData(gd);
-		TabItem generalTabItem = new TabItem(tabFolder, SWT.NONE);
-		generalTabItem
-				.setText(EditorMessages.PropertySection_Dialog_Tab_General);
-		Control control = createGeneralTabControl(generalTabItem.getParent());
-		generalTabItem.setControl(control);
-		return container;
-	}
-
-	/**
-	 * @param parent
-	 * @return
-	 */
-	private Control createGeneralTabControl(Composite parent) {
-		Composite composite = new Composite(parent, SWT.NONE);
-		GridLayout layout = new GridLayout();
-		layout.numColumns = 5;
-		composite.setLayout(layout);
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		composite.setLayoutData(gd);
-		composite.setFont(parent.getFont());
-
-		propertyNameField = new StringDialogField();
-		// propertyNameField.setRequired(true);
-		propertyNameField
-				.setLabelText(EditorMessages.PropertySection_Dialog_PropertyName);
-
-		propertyClassField = new ClassButtonDialogField(getProject());
-		// propertyClassField.setRequired(true);
-		propertyClassField
-				.setLabelText(EditorMessages.PropertySection_Dialog_PropertyClass);
-
-		propertyClassField.setAutoOpenResource(false);
-
-		defaultValueField = new StringDialogField();
-		defaultValueField
-				.setLabelText(EditorMessages.PropertySection_Dialog_DefaultValue);
-
-		suggestedValueField = new StringDialogField();
-		suggestedValueField
-				.setLabelText(EditorMessages.PropertySection_Dialog_SuggestedValue);
-
-		GridData data = new GridData(GridData.FILL_BOTH);
-		composite.setLayoutData(data);
-
-		int numberOfColumns = 4;
-		GridLayout gl = new GridLayout(numberOfColumns, false);
-		composite.setLayout(gl);
-
-		propertyNameField.doFillIntoGrid(null, composite, numberOfColumns);
-
-		propertyClassField.doFillIntoGrid(null, composite, numberOfColumns);
-
-		defaultValueField.doFillIntoGrid(null, composite, numberOfColumns);
-
-		suggestedValueField.doFillIntoGrid(null, composite, numberOfColumns);
-
-		LayoutUtil.setHorizontalGrabbing(propertyClassField.getTextControl(
-				null, composite));
-
-		// set the initial value for these fields.
-		propertyNameField.setText(propertyName);
-		propertyClassField.setText(propertyClass);
-		defaultValueField.setText(defaultValue);
-		suggestedValueField.setText(suggestedValue);
-
-		return composite;
-	}
-
-	/*
-	 * @see org.eclipse.jface.window.Window#getInitialSize()
-	 */
-	protected Point getInitialSize() {
-		Point shellSize = super.getInitialSize();
-		return new Point(Math.max(
-				convertHorizontalDLUsToPixels(MIN_DIALOG_WIDTH), shellSize.x),
-				shellSize.y);
-	}
-
-	private IProject getProject() {
-		return project;
-	}
-
-	protected void okPressed() {
-		propertyName = propertyNameField.getText();
-		propertyClass = propertyClassField.getText();
-		defaultValue = defaultValueField.getText();
-		suggestedValue = suggestedValueField.getText();
-
-		super.okPressed();
-	}
-
-	/**
-	 * @return the default value
-	 */
-	public String getDefaultValue() {
-		return defaultValue;
-	}
-
-	/**
-	 * @param defaultValue
-	 */
-	public void setDefaultValue(String defaultValue) {
-		this.defaultValue = defaultValue;
-	}
-
-	/**
-	 * @return the property class
-	 */
-	public String getPropertyClass() {
-		return propertyClass;
-	}
-
-	/**
-	 * @param propertyClass
-	 */
-	public void setPropertyClass(String propertyClass) {
-		this.propertyClass = propertyClass;
-	}
-
-	/**
-	 * @return the property name
-	 */
-	public String getPropertyName() {
-		return propertyName;
-	}
-
-	/**
-	 * @param propertyName
-	 */
-	public void setPropertyName(String propertyName) {
-		this.propertyName = propertyName;
-	}
-
-	/**
-	 * @return the suggested value
-	 */
-	public String getSuggestedValue() {
-		return suggestedValue;
-	}
-
-	/**
-	 * @param suggestedValue
-	 */
-	public void setSuggestedValue(String suggestedValue) {
-		this.suggestedValue = suggestedValue;
-	}
-
-	/**
-	 * @param project
-	 */
-	public void setProject(IProject project) {
-		this.project = project;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/AddEditRendererDialog.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/AddEditRendererDialog.java
deleted file mode 100644
index 8e40eef..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/AddEditRendererDialog.java
+++ /dev/null
@@ -1,297 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.dialog;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.ClassButtonDialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.IStringButtonAdapter;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.LayoutUtil;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.StringButtonDialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.StringDialogField;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.jst.jsf.facesconfig.ui.IFacesConfigConstants;
-import org.eclipse.jst.jsf.facesconfig.ui.page.IFacesConfigPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.TabFolder;
-import org.eclipse.swt.widgets.TabItem;
-
-/**
- * @author Bryan Yang
- * 
- */
-public class AddEditRendererDialog extends Dialog {
-
-	private static final int MIN_DIALOG_WIDTH = 300;
-
-	private StringDialogField rendererNameField;
-
-	private ClassButtonDialogField rendererClassField;
-
-	private StringButtonDialogField componentFamilyField;
-
-	private StringDialogField renderTypeField;
-
-	private IProject project;
-
-	private String rendererName;
-
-	private String rendererClass;
-
-	private String componentFamily;
-
-	private String rendererType;
-
-	private boolean isNew;
-
-	private IFacesConfigPage page;
-
-	/**
-	 * @param parentShell
-	 * @param page
-	 * @param isNew
-	 */
-	public AddEditRendererDialog(Shell parentShell, IFacesConfigPage page,
-			boolean isNew) {
-		super(parentShell);
-		this.page = page;
-		this.isNew = isNew;
-	}
-
-	/**
-	 * 
-	 * @param parentShell
-	 * @param rendererName 
-	 * @param rendererClass 
-	 * @param componentFamily 
-	 * @param renderType 
-	 */
-	public AddEditRendererDialog(Shell parentShell, String rendererName,
-			String rendererClass, String componentFamily, String renderType) {
-		super(parentShell);
-		this.rendererName = rendererName;
-		this.rendererClass = rendererClass;
-		this.componentFamily = componentFamily;
-		this.rendererType = renderType;
-		this.isNew = false;
-	}
-
-	/*
-	 * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
-	 */
-	protected void configureShell(Shell newShell) {
-		super.configureShell(newShell);
-		if (isNew)
-			newShell.setText(EditorMessages.RendererSection_Dialog_Title_Add);
-		else
-			newShell.setText(EditorMessages.RendererSection_Dialog_Title_Edit);
-	}
-
-	/*
-	 * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Control createDialogArea(Composite parent) {
-		Composite container = new Composite(parent, SWT.FILL);
-		GridLayout layout = new GridLayout();
-		layout.numColumns = 2;
-		layout.marginWidth = layout.marginHeight = 5;
-		container.setLayout(layout);
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		container.setLayoutData(gd);
-
-		TabFolder tabFolder = new TabFolder(container, SWT.FILL);
-		tabFolder.setLayoutData(gd);
-		TabItem generalTabItem = new TabItem(tabFolder, SWT.NONE);
-		generalTabItem
-				.setText(EditorMessages.RendererSection_Dialog_Tab_General);
-		Control control = createGeneralTabControl(generalTabItem.getParent());
-		generalTabItem.setControl(control);
-		return container;
-	}
-
-	/**
-	 * @param parent
-	 * @return
-	 */
-	private Control createGeneralTabControl(Composite parent) {
-		Composite composite = new Composite(parent, SWT.NONE);
-		GridLayout layout = new GridLayout();
-		layout.numColumns = 5;
-		composite.setLayout(layout);
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		composite.setLayoutData(gd);
-		composite.setFont(parent.getFont());
-
-		rendererNameField = new StringDialogField();
-		rendererNameField
-				.setLabelText(EditorMessages.RendererSection_Dialog_DisplayName);
-
-		rendererClassField = new ClassButtonDialogField(getProject());
-//		rendererClassField.setRequired(true);
-		rendererClassField
-				.setLabelText(EditorMessages.RendererSection_Dialog_RendererClass);
-		rendererClassField.setProject(getProject());
-		rendererClassField.setSuperClassName(IFacesConfigConstants.RENDERER_SUPER_CLASS);
-		rendererClassField.setAutoOpenResource(false);
-
-		componentFamilyField = new StringButtonDialogField(
-				new IStringButtonAdapter() {
-					public void changeControlPressed(DialogField field) {
-						Shell shell = EditorPlugin.getActiveShell();
-						ComponentListDialog dialog = new ComponentListDialog(
-								shell,
-								page,
-								page.getInput(),
-								EditorMessages.RendererSection_Dialog_ComponentFamilyCaption,
-								EditorMessages.RendererSection_Dialog_ComponentFamilyLabel);
-						if (dialog.open() == Dialog.OK) {
-							componentFamilyField.setText(dialog.getValue());
-						}
-					}
-				});
-		componentFamilyField
-				.setLabelText(EditorMessages.RendererSection_Dialog_ComponentFamilyValue);
-//		componentFamilyField.setRequired(true);
-
-		renderTypeField = new StringDialogField();
-//		renderTypeField.setRequired(true);
-		renderTypeField
-				.setLabelText(EditorMessages.RendererSection_Dialog_TypeValue);
-
-		GridData data = new GridData(GridData.FILL_BOTH);
-		composite.setLayoutData(data);
-
-		int numberOfColumns = 4;
-		GridLayout gl = new GridLayout(numberOfColumns, false);
-		composite.setLayout(gl);
-
-		rendererNameField.doFillIntoGrid(null, composite, numberOfColumns);
-
-		componentFamilyField.doFillIntoGrid(null, composite, numberOfColumns);
-
-		renderTypeField.doFillIntoGrid(null, composite, numberOfColumns);
-
-		rendererClassField.doFillIntoGrid(null, composite, numberOfColumns);
-
-		LayoutUtil.setHorizontalGrabbing(rendererClassField.getTextControl(
-				null, composite));
-
-		// set the initial value for these fields.
-		rendererNameField.setText(rendererName);
-		rendererClassField.setText(rendererClass);
-		componentFamilyField.setText(componentFamily);
-		renderTypeField.setText(rendererType);
-
-		return composite;
-	}
-
-	/*
-	 * @see org.eclipse.jface.window.Window#getInitialSize()
-	 */
-	protected Point getInitialSize() {
-		Point shellSize = super.getInitialSize();
-		return new Point(Math.max(
-				convertHorizontalDLUsToPixels(MIN_DIALOG_WIDTH), shellSize.x),
-				shellSize.y);
-	}
-
-	/**
-	 * @return the associated project
-	 */
-	public IProject getProject() {
-		return project;
-	}
-
-	/**
-	 * 
-	 */
-	protected void okPressed() {
-		rendererName = rendererNameField.getText();
-		rendererClass = rendererClassField.getText();
-		componentFamily = componentFamilyField.getText();
-		rendererType = renderTypeField.getText();
-
-		super.okPressed();
-	}
-
-	/**
-	 * @return the renderer clas
-	 */
-	public String getRendererClass() {
-		return rendererClass;
-	}
-
-	/**
-	 * @param rendererClass
-	 */
-	public void setRendererClass(String rendererClass) {
-		this.rendererClass = rendererClass;
-	}
-
-	/**
-	 * @return the renderer name
-	 */
-	public String getRendererName() {
-		return rendererName;
-	}
-
-	/**
-	 * @param rendererName
-	 */
-	public void setRendererName(String rendererName) {
-		this.rendererName = rendererName;
-	}
-
-	/**
-	 * @return the component family
-	 */
-	public String getComponentFamily() {
-		return componentFamily;
-	}
-
-	/**
-	 * @param componentFamily
-	 */
-	public void setComponentFamily(String componentFamily) {
-		this.componentFamily = componentFamily;
-	}
-
-	/**
-	 * @return the renderer type
-	 */
-	public String getRendererType() {
-		return rendererType;
-	}
-
-	/**
-	 * @param rendererType
-	 */
-	public void setRendererType(String rendererType) {
-		this.rendererType = rendererType;
-	}
-
-	/**
-	 * @param project
-	 */
-	public void setProject(IProject project) {
-		this.project = project;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/CommonListDialog.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/CommonListDialog.java
deleted file mode 100644
index 5cae0b1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/CommonListDialog.java
+++ /dev/null
@@ -1,245 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.dialog;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jst.jsf.common.ui.internal.guiutils.SWTUtils;
-import org.eclipse.jst.jsf.facesconfig.ui.page.IFacesConfigPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * @author Bryan Yang
- * 
- */
-public class CommonListDialog extends Dialog implements
-		ISelectionChangedListener, ISelectionProvider {
-	private static final int MIN_DIALOG_WIDTH = 300;
-
-	private Text inputText;
-
-	private StructuredViewer structuredViewer;
-
-	private String value;
-
-	private IFacesConfigPage page;
-
-	private Object input;
-
-	private String label;
-	
-	private String caption;
-
-	/** The mini width for the text control */
-	private static final int TEXT_MINI_WIDTH = 100;
-
-	/**
-	 * @param parentShell
-	 * @param page
-	 * @param input
-	 * @param caption
-	 * @param label
-	 */
-	protected CommonListDialog(Shell parentShell, IFacesConfigPage page,
-			Object input, String caption, String label) {
-		super(parentShell);
-		this.page = page;
-		this.input = input;
-		this.label = label;
-		this.caption = caption;
-		parentShell.setText(caption);
-	}
-	
-	/*
-	 * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
-	 */
-	protected void configureShell(Shell newShell) {
-		super.configureShell(newShell);
-		newShell.setText(caption);
-	}
-
-
-	/*
-	 * @see org.eclipse.jface.window.Window#getInitialSize()
-	 */
-	protected Point getInitialSize() {
-		Point shellSize = super.getInitialSize();
-		return new Point(Math.max(
-				convertHorizontalDLUsToPixels(MIN_DIALOG_WIDTH), shellSize.x),
-				shellSize.y);
-	}
-
-	/*
-	 * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Control createDialogArea(Composite parent) {
-		Composite composite = SWTUtils.createComposite(parent, 1);
-
-		SWTUtils.createLabel(composite, label, 1);
-
-		inputText = SWTUtils.createTextBox(composite, 1);
-		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-		gd.widthHint = TEXT_MINI_WIDTH;
-		inputText.setLayoutData(gd);
-
-		structuredViewer = createViewer(composite);
-		structuredViewer.addSelectionChangedListener(this);
-
-		return composite;
-	}
-
-	/**
-	 * Create the structured viewer, set up content & label provider for it.
-	 * Defaultly create a tableviewer.
-	 * 
-	 * @param parent
-	 * @return the structured viewer
-	 */
-	protected StructuredViewer createViewer(Composite parent) {
-
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		gd.heightHint = 200;
-		gd.widthHint = 150;
-		parent.setLayoutData(gd);
-		GridLayout layout = new GridLayout();
-		parent.setLayout(layout);
-
-		TableViewer tableViewer = new TableViewer(parent, SWT.SINGLE
-				| SWT.H_SCROLL | SWT.V_SCROLL);
-		gd = new GridData(GridData.FILL_BOTH);
-		tableViewer.getControl().setLayoutData(gd);
-
-		tableViewer.setContentProvider(new AdapterFactoryContentProvider(
-				getAdapterFactory()));
-		tableViewer.setLabelProvider(new AdapterFactoryLabelProvider(
-				getAdapterFactory()));
-		configViewer(tableViewer);
-		tableViewer.setInput(input);
-
-		return tableViewer;
-	}
-
-	/**
-	 * set the structuredViewer's input
-	 * 
-	 * @param input
-	 */
-	private void setViewerInput(Object input) {
-		structuredViewer.setInput(input);
-		this.input = input;
-	}
-
-	/**
-	 * get the input object of this section.
-	 * @return the input
-	 */
-	public Object getInput() {
-		return input;
-	}
-
-	/**
-	 * set input object for this section.
-	 * @param newInput 
-	 */
-	public void setInput(Object newInput) {
-		input = newInput;
-		setViewerInput(input);
-	}
-
-	/**
-	 * Config the viewer, such as set a filter and so on. Sub classes should
-	 * override this method to add filter.
-	 * 
-	 * @param structuredViewer_
-	 */
-	protected void configViewer(StructuredViewer structuredViewer_) {
-        // do nothing; sub-classes should override
-	}
-
-     //TODO: why bother with this interface?
-	public void selectionChanged(SelectionChangedEvent event) {
-		// selectionChanged not handled
-
-	}
-
-	public void addSelectionChangedListener(ISelectionChangedListener listener) {
-        // do nothing; not handling setSelection
-	}
-
-	public ISelection getSelection() {
-		return structuredViewer.getSelection();
-	}
-
-	public void removeSelectionChangedListener(
-			ISelectionChangedListener listener) {
-		// do nothing; not handling setSelection
-	}
-
-	public void setSelection(ISelection selection) {
-        // do nothing; not handling change in selection
-	}
-
-	/**
-	 * the convenient method to get the AdapterFactory instance of the editor;
-	 * 
-	 * @return the AdapterFactory instance.
-	 */
-	public AdapterFactory getAdapterFactory() {
-		return (AdapterFactory) page.getEditor().getAdapter(
-				AdapterFactory.class);
-	}
-
-	/**
-	 * the convenient method to get the EditingDomain instance of the editor;
-	 * 
-	 * @return the EditingDomain instance.
-	 */
-	public EditingDomain getEditingDomain() {
-		return (EditingDomain) page.getEditor().getAdapter(EditingDomain.class);
-	}
-
-	/**
-	 * @return the value
-	 */
-	public String getValue() {
-		return value;
-	}
-	/**
-	 * @param value
-	 */
-	public void setValue(String value) {
-		this.value = value;
-		refresh();
-	}
-	
-	private void refresh()
-	{
-	   inputText.setText(value)	;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/ComponentListDialog.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/ComponentListDialog.java
deleted file mode 100644
index 8c83c04..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/ComponentListDialog.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.dialog;
-
-import java.util.Iterator;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.jst.jsf.facesconfig.emf.ComponentType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.ui.page.IFacesConfigPage;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * @author Bryan Yang
- *
- */
-public class ComponentListDialog extends CommonListDialog {
-
-	public void selectionChanged(SelectionChangedEvent event) {
-		IStructuredSelection ssel = StructuredSelection.EMPTY;
-		ISelection selection = getSelection();
-		if (selection instanceof IStructuredSelection) {
-			ssel = (IStructuredSelection) selection;
-		}
-
-		if (!ssel.isEmpty()) {
-			for (Iterator iter = ssel.iterator(); iter.hasNext();) {
-				ComponentType element = (ComponentType) iter.next();
-				if (element.getComponentType() != null)
-					setValue(element.getComponentType().getTextContent());
-				else
-					setValue(""); //$NON-NLS-1$
-			}
-
-		}
-	}
-
-	/**
-	 * @param parentShell
-	 * @param page
-	 * @param input
-	 * @param caption
-	 * @param label
-	 */
-	protected ComponentListDialog(Shell parentShell, IFacesConfigPage page,
-			Object input, String caption, String label) {
-		super(parentShell, page, input, caption, label);
-	}
-
-	protected void configViewer(StructuredViewer structuredViewer) {
-		super.configViewer(structuredViewer);
-		structuredViewer.addFilter(new ViewerFilter() {
-			public boolean select(Viewer viewer, Object parentElement,
-					Object element) {
-				return FacesConfigPackage.eINSTANCE.getComponentType()
-						.isInstance(element);
-			}
-		});
-
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/DialogUtil.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/DialogUtil.java
deleted file mode 100644
index 7ced390..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/DialogUtil.java
+++ /dev/null
@@ -1,151 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.dialog;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jface.window.Window;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.JavaUIHelper;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType;
-import org.eclipse.jst.jsf.facesconfig.emf.RenderKitIdType;
-import org.eclipse.jst.jsf.facesconfig.emf.RenderKitType;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.dialogs.SelectionDialog;
-
-/**
- * @author Zhi-peng Zhang
- * @version
- */
-public final class DialogUtil {
-
-	/**
-	 * @param shell
-	 * @param project
-	 * @param superType
-	 * @param tyle
-	 * @return fully qualified class name or null
-	 */
-	public static String openClassDialog(Shell shell, IProject project,
-			String superType, int tyle) {
-		SelectionDialog dialog = JavaUIHelper
-				.openSelectionDialog(shell, project, superType, tyle);
-        
-        // dialog could be null
-        if (dialog != null)
-        {
-    		dialog.setTitle(EditorMessages.FindType);
-    		dialog.setMessage(EditorMessages.FindType_Filter);
-    		if (dialog.open() == SelectionDialog.OK) {
-    			Object[] result = dialog.getResult();
-    			IType searchedType = (IType) result[0];
-    			return searchedType.getFullyQualifiedName();
-    		}
-        }
-		return null;
-	}
-
-	/**
-	 * @param shell
-	 * @param facesConfig
-	 * @return the name of the renderkit or null
-	 */
-	public static String openRenderKitDialog(Shell shell,
-			FacesConfigType facesConfig) {
-		if (facesConfig != null) {
-			EList list = facesConfig.getRenderKit();
-			ArrayList ids = new ArrayList();
-			for (int i = 0, n = list.size(); i < n; i++) {
-				RenderKitIdType renderKitId = ((RenderKitType) list.get(i))
-						.getRenderKitId();
-				if (renderKitId != null) {
-					if (!"".equals(renderKitId.getTextContent())) { //$NON-NLS-1$
-						ids.add(renderKitId.getTextContent());
-					}
-				}
-			}
-			String[] idArray = (String[]) ids.toArray(new String[ids.size()]);
-			Arrays.sort(idArray);
-			ListChoiceDialog dialog = new ListChoiceDialog(
-					shell,
-					idArray,
-					EditorMessages.DefaultRenderKitIDSection_Wizard_Page_LabelText);
-			if (dialog.open() == SelectionDialog.OK) {
-				String result = dialog.getResult();
-				if (!"".equals(result)) { //$NON-NLS-1$
-					return result;
-				}
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * @param shell
-	 * @param existedLocaleList
-	 * @return the locale or null
-	 */
-	public static String openLocaleDialog(Shell shell, List existedLocaleList) {
-		LocaleDialog dialog = new LocaleDialog(shell, existedLocaleList);
-		if (dialog.open() == Window.OK) {
-			String result = dialog.getResult();
-			if (!"".equals(result)) { //$NON-NLS-1$
-				return result;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * @param shell
-	 * @param project
-	 * @param existedBundleList
-	 * @return the message bundle or null
-	 */
-	public static String openMessageBundleDialog(Shell shell, IProject project,
-			List existedBundleList) {
-		IJavaProject javaProject = null;
-
-		try {
-			if (project != null && project.hasNature(JavaCore.NATURE_ID)) {
-				javaProject = JavaCore.create(project);
-			} else {
-				return null;
-			}
-		} catch (CoreException e) {
-			// Ignore
-		}
-		MessageBundleSelectionDialog dialog = new MessageBundleSelectionDialog(
-				shell, javaProject, existedBundleList);
-
-		if (dialog.open() == SelectionDialog.OK) {
-			String newValue = (String) dialog.getResult()[0];
-			if (!"".equalsIgnoreCase(newValue)) { //$NON-NLS-1$
-				return newValue;
-			}
-		}
-		return null;
-	}
-	
-	private DialogUtil()
-	{
-		// no instantiation
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/EditListEntriesDialog.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/EditListEntriesDialog.java
deleted file mode 100644
index 89b6da9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/EditListEntriesDialog.java
+++ /dev/null
@@ -1,414 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-
-package org.eclipse.jst.jsf.facesconfig.ui.dialog;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.viewers.ColumnWeightData;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.TableLayout;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.ClassButtonDialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogFieldBase;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.LayoutUtil;
-import org.eclipse.jst.jsf.common.ui.internal.guiutils.SWTUtils;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ListEntriesType;
-import org.eclipse.jst.jsf.facesconfig.emf.NullValueType;
-import org.eclipse.jst.jsf.facesconfig.emf.ValueClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.ValueType;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.jst.jsf.facesconfig.ui.section.AbstractFacesConfigSection;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.MouseAdapter;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-
-/**
- * 
- * @author sfshi
- * 
- */
-public class EditListEntriesDialog extends Dialog {
-
-	private static final int MIN_DIALOG_WIDTH = 300;
-
-	private static final int TABLE_DEFAULT_HEIGHT = 160;
-
-	private ClassButtonDialogField valueClassField;
-
-	private IProject project;
-
-	private TableViewer tableViewer;
-
-	private Button removeButton;
-
-	private Button editButton;
-
-	private ListEntriesType listEntries;
-
-	private AbstractFacesConfigSection section;
-
-	/**
-	 * 
-	 * @param parentShell
-	 * @param listEntries
-	 *            the list-entries element that working on.
-	 * @param section 
-	 */
-	public EditListEntriesDialog(Shell parentShell,
-			ListEntriesType listEntries, AbstractFacesConfigSection section) {
-		super(parentShell);
-		this.listEntries = listEntries;
-		this.section = section;
-	}
-
-	/*
-	 * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
-	 */
-	protected void configureShell(Shell newShell) {
-		super.configureShell(newShell);
-		newShell.setText(EditorMessages.EditListEntriesDialog_EditingListEntries);
-	}
-
-	/*
-	 * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Control createDialogArea(Composite parent) {
-		Composite container = new Composite(parent, SWT.FILL);
-		GridData data = new GridData(GridData.FILL_BOTH);
-		container.setLayoutData(data);
-
-		GridLayout gl = new GridLayout();
-		gl.verticalSpacing = 0;
-		// gl.marginHeight = 0;
-		container.setLayout(gl);
-		createKeyValueSection(container);
-		createTableSection(container);
-
-		initFields();
-		return container;
-	}
-
-	private void initFields() {
-
-		if (listEntries.getValueClass() != null)
-			valueClassField.setText(listEntries.getValueClass()
-					.getTextContent());
-
-		tableViewer.setInput(listEntries);
-	}
-
-	private void createKeyValueSection(Composite parent) {
-		valueClassField = new ClassButtonDialogField(getProject());
-
-		valueClassField
-				.setLabelText(EditorMessages.InitializationSection_MapType_ValueClass);
-		Composite typeSelectionSection = SWTUtils.createComposite(parent,
-				SWT.NONE);
-
-		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-		typeSelectionSection.setLayoutData(gd);
-
-		int numberOfColumns = 4;
-		GridLayout gl = new GridLayout(numberOfColumns, false);
-		typeSelectionSection.setLayout(gl);
-
-		valueClassField.doFillIntoGrid(null, typeSelectionSection,
-				numberOfColumns);
-		LayoutUtil.setHorizontalGrabbing(valueClassField.getTextControl(null,
-				parent));
-	}
-
-	/**
-	 * 
-	 * @param parent
-	 */
-	private void createTableSection(Composite parent) {
-		Composite mapValueSection = SWTUtils.createComposite(parent, SWT.NONE);
-
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		mapValueSection.setLayoutData(gd);
-
-		int numberOfColumns = 3;
-		GridLayout gl = new GridLayout(numberOfColumns, false);
-		mapValueSection.setLayout(gl);
-
-		DialogField valuesTitle = new DialogFieldBase();
-		valuesTitle
-				.setLabelText(EditorMessages.InitializationSection_MapTable_Title);    
-
-		valuesTitle.doFillIntoGrid(null, mapValueSection, numberOfColumns);
-
-		Table mapTable = new Table(mapValueSection, SWT.FULL_SELECTION
-				| SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
-
-		mapTable.addSelectionListener(new SelectionAdapter() {
-
-			public void widgetSelected(SelectionEvent e) {
-				updateButtonsStatus();
-
-			}
-
-		});
-		mapTable.addMouseListener(new MouseAdapter() {
-			public void mouseDoubleClick(MouseEvent e) {
-				if (((IStructuredSelection) tableViewer.getSelection()).size() > 0)
-					editButtonSelected(null);
-			}
-		});
-		gd = new GridData(GridData.FILL_BOTH);
-		gd.horizontalSpan = 1;
-		gd.heightHint = TABLE_DEFAULT_HEIGHT;
-		mapTable.setLayoutData(gd);
-		mapTable.setHeaderVisible(true);
-		mapTable.setLinesVisible(true);
-		TableLayout layout = new TableLayout();
-		layout.addColumnData(new ColumnWeightData(1, true));
-		mapTable.setLayout(layout);
-
-		TableColumn keyCol = new TableColumn(mapTable, SWT.NONE);
-		keyCol
-				.setText(EditorMessages.InitializationSection_MapTable_Value);
-		layout.addColumnData(new ColumnWeightData(1, true));
-		keyCol.setResizable(true);
-
-		tableViewer = new TableViewer(mapTable);
-		tableViewer.setContentProvider(new AdapterFactoryContentProvider(
-				getAdapterFactory()));
-		tableViewer.setLabelProvider(new AdapterFactoryLabelProvider(
-				getAdapterFactory()));
-
-		tableViewer.addFilter(new ViewerFilter() {
-			public boolean select(Viewer viewer, Object parentElement,
-					Object element) {
-				return FacesConfigPackage.eINSTANCE.getValueType().isInstance(
-						element)
-						|| FacesConfigPackage.eINSTANCE.getNullValueType()
-								.isInstance(element);
-			}
-		});
-
-		Composite operationContainer = null;
-
-		operationContainer = SWTUtils
-				.createComposite(mapValueSection, SWT.NONE);
-
-		gd = new GridData(GridData.FILL_VERTICAL);
-		operationContainer.setLayoutData(gd);
-		gl = new GridLayout();
-		operationContainer.setLayout(gl);
-
-		Button addButton = SWTUtils.createPushButton(operationContainer,
-				EditorMessages.UI_Button_Add_more);
-
-		gd = new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		gd.grabExcessHorizontalSpace = false;
-		addButton.setLayoutData(gd);
-		addButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				addButtonSelected(e);
-			}
-		});
-
-		editButton = SWTUtils.createPushButton(operationContainer,
-				EditorMessages.UI_Button_Edit_more);
-
-		gd = new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		gd.grabExcessHorizontalSpace = false;
-		editButton.setLayoutData(gd);
-		editButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				editButtonSelected(e);
-			}
-
-		});
-		removeButton = SWTUtils.createPushButton(operationContainer,
-				EditorMessages.UI_Button_Remove);
-
-		gd = new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		gd.grabExcessHorizontalSpace = false;
-		removeButton.setLayoutData(gd);
-		removeButton.addSelectionListener(new SelectionAdapter() {
-
-			public void widgetSelected(SelectionEvent e) {
-				removeButtonSelected();
-			}
-
-		});
-		editButton.setEnabled(false);
-		removeButton.setEnabled(false);
-	}
-
-	private AdapterFactory getAdapterFactory() {
-		return section.getAdapterFactory();
-	}
-
-	private void addButtonSelected(SelectionEvent e) {
-
-		EditValueDialog dialog = new EditValueDialog(EditorPlugin
-				.getActiveShell(), true, false, null);
-		if (dialog.open() == Dialog.OK) {
-			if (dialog.isNullValue()) {
-				NullValueType nullValue = FacesConfigFactory.eINSTANCE
-						.createNullValueType();
-				listEntries.getNullValue().add(nullValue);
-			} else {
-				ValueType value = FacesConfigFactory.eINSTANCE
-						.createValueType();
-				value.setTextContent((String) dialog.getResultData());
-				listEntries.getValue().add(value);
-			}
-		}
-
-	}
-
-	private void editButtonSelected(SelectionEvent e) {
-		Object select = ((IStructuredSelection) tableViewer.getSelection())
-				.getFirstElement();
-		boolean isNullValue;
-		String valueText = null;
-		if (select instanceof NullValueType)
-			isNullValue = true;
-		else {
-			isNullValue = false;
-			valueText = ((ValueType) select).getTextContent();
-		}
-
-		EditValueDialog dialog = new EditValueDialog(EditorPlugin
-				.getActiveShell(), true, isNullValue, valueText);
-		if (dialog.open() == Dialog.OK) {
-			if (isNullValue && !dialog.isNullValue()) {
-				listEntries.getNullValue().remove(select);
-				ValueType value = FacesConfigFactory.eINSTANCE
-						.createValueType();
-				value.setTextContent((String) dialog.getResultData());
-				listEntries.getValue().add(value);
-			} else if (!isNullValue && dialog.isNullValue()) {
-				listEntries.getValue().remove(select);
-				NullValueType nullValue = FacesConfigFactory.eINSTANCE
-						.createNullValueType();
-				listEntries.getNullValue().add(nullValue);
-			} else if (!isNullValue && !dialog.isNullValue()) {
-				((ValueType) select).setTextContent((String) dialog
-						.getResultData());
-			}
-		}
-	}
-
-	private void removeButtonSelected() {
-		Object select = ((IStructuredSelection) tableViewer.getSelection())
-				.getFirstElement();
-		if (select instanceof NullValueType)
-			listEntries.getNullValue().remove(select);
-		else
-			listEntries.getValue().remove(select);
-		tableViewer.refresh();
-		updateButtonsStatus();
-	}
-
-	/**
-	 * update the status buttons
-	 */
-	public void updateButtonsStatus() {
-		if (((IStructuredSelection) tableViewer.getSelection()).size() > 0) {
-			editButton.setEnabled(true);
-			removeButton.setEnabled(true);
-		} else {
-			editButton.setEnabled(false);
-			removeButton.setEnabled(false);
-		}
-	}
-
-	/**
-	 * 
-	 */
-	protected void okPressed() {
-
-		String valueClass = valueClassField.getText();
-		if (listEntries.getValueClass() != null) {
-			listEntries.getValueClass().setTextContent(valueClass);
-		} else {
-			ValueClassType valueClassType = FacesConfigFactory.eINSTANCE
-					.createValueClassType();
-			valueClassType.setTextContent(valueClass);
-			listEntries.setValueClass(valueClassType);
-		}
-		super.okPressed();
-	}
-
-	/*
-	 * @see org.eclipse.jface.window.Window#getInitialSize()
-	 */
-	protected Point getInitialSize() {
-		Point shellSize = super.getInitialSize();
-		return new Point(Math.max(
-				convertHorizontalDLUsToPixels(MIN_DIALOG_WIDTH), shellSize.x),
-				shellSize.y);
-	}
-
-	/**
-	 * @return the current project
-	 */
-	public IProject getProject() {
-		if (project == null) {
-			project = (IProject) section.getPage().getEditor().getAdapter(
-					IProject.class);
-		}
-		return project;
-	}
-
-	/**
-	 * @param project
-	 */
-	public void setProject(IProject project) {
-		this.project = project;
-	}
-
-	/**
-	 * @return the list entries
-	 */
-	public ListEntriesType getListEntries() {
-		return listEntries;
-	}
-
-	/**
-	 * @param listEntries
-	 */
-	public void setListEntries(ListEntriesType listEntries) {
-		this.listEntries = listEntries;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/EditMapEntriesDialog.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/EditMapEntriesDialog.java
deleted file mode 100644
index ee91462..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/EditMapEntriesDialog.java
+++ /dev/null
@@ -1,449 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-
-package org.eclipse.jst.jsf.facesconfig.ui.dialog;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.viewers.ColumnWeightData;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.TableLayout;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.ClassButtonDialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogFieldBase;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.LayoutUtil;
-import org.eclipse.jst.jsf.common.ui.internal.guiutils.SWTUtils;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.KeyClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.KeyType;
-import org.eclipse.jst.jsf.facesconfig.emf.MapEntriesType;
-import org.eclipse.jst.jsf.facesconfig.emf.MapEntryType;
-import org.eclipse.jst.jsf.facesconfig.emf.NullValueType;
-import org.eclipse.jst.jsf.facesconfig.emf.ValueClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.ValueType;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.jst.jsf.facesconfig.ui.section.AbstractFacesConfigSection;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.MouseAdapter;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-
-/**
- * 
- * @author sfshi
- * 
- */
-public class EditMapEntriesDialog extends Dialog {
-
-	private static final int MIN_DIALOG_WIDTH = 300;
-
-	private static final int TABLE_DEFAULT_HEIGHT = 160;
-
-	private ClassButtonDialogField keyClassField;
-
-	private ClassButtonDialogField valueClassField;
-
-	private IProject project;
-
-	private TableViewer tableViewer;
-
-	private Button removeButton;
-
-	private Button editButton;
-
-	private MapEntriesType mapEntries;
-
-	private AbstractFacesConfigSection section;
-
-	/**
-	 * 
-	 * @param parentShell
-	 * @param mapEntries
-	 *            the map-entries element that working on.
-	 * @param section 
-	 */
-	public EditMapEntriesDialog(Shell parentShell, MapEntriesType mapEntries,
-			AbstractFacesConfigSection section) {
-		super(parentShell);
-		this.mapEntries = mapEntries;
-		this.section = section;
-	}
-
-	/*
-	 * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
-	 */
-	protected void configureShell(Shell newShell) {
-		super.configureShell(newShell);
-		newShell.setText(EditorMessages.EditMapEntriesDialog_EditingMapEntries);
-	}
-
-	/*
-	 * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Control createDialogArea(Composite parent) {
-		Composite container = new Composite(parent, SWT.FILL);
-		GridData data = new GridData(GridData.FILL_BOTH);
-		container.setLayoutData(data);
-
-		GridLayout gl = new GridLayout();
-		gl.verticalSpacing = 0;
-		// gl.marginHeight = 0;
-		container.setLayout(gl);
-		createKeyValueSection(container);
-		createTableSection(container);
-
-		initFields();
-		return container;
-	}
-
-	private void initFields() {
-
-		if (mapEntries.getKeyClass() != null)
-			keyClassField.setText(mapEntries.getKeyClass().getTextContent());
-
-		if (mapEntries.getValueClass() != null)
-			valueClassField
-					.setText(mapEntries.getValueClass().getTextContent());
-
-		tableViewer.setInput(mapEntries);
-	}
-
-	private void createKeyValueSection(Composite parent) {
-		keyClassField = new ClassButtonDialogField(getProject());
-		keyClassField
-				.setLabelText(EditorMessages.InitializationSection_MapType_KeyClass);
-
-		valueClassField = new ClassButtonDialogField(getProject());
-
-		valueClassField
-				.setLabelText(EditorMessages.InitializationSection_MapType_ValueClass);
-
-		Composite typeSelectionSection = SWTUtils.createComposite(parent,
-				SWT.NONE);
-
-		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-		typeSelectionSection.setLayoutData(gd);
-
-		int numberOfColumns = 4;
-		GridLayout gl = new GridLayout(numberOfColumns, false);
-		typeSelectionSection.setLayout(gl);
-
-		keyClassField.doFillIntoGrid(null, typeSelectionSection,
-				numberOfColumns);
-		LayoutUtil.setHorizontalGrabbing(keyClassField.getTextControl(null,
-				parent));
-
-		valueClassField.doFillIntoGrid(null, typeSelectionSection,
-				numberOfColumns);
-	}
-
-	/**
-	 * 
-	 * @param parent
-	 */
-	private void createTableSection(Composite parent) {
-		Composite mapValueSection = SWTUtils.createComposite(parent, SWT.NONE);
-
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		mapValueSection.setLayoutData(gd);
-
-		int numberOfColumns = 3;
-		GridLayout gl = new GridLayout(numberOfColumns, false);
-		mapValueSection.setLayout(gl);
-
-		DialogField valuesTitle = new DialogFieldBase();
-		valuesTitle
-				.setLabelText(EditorMessages.InitializationSection_MapTable_Title);    
-
-		valuesTitle.doFillIntoGrid(null, mapValueSection, numberOfColumns);
-
-		Table mapTable = new Table(mapValueSection, SWT.FULL_SELECTION
-				| SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
-
-		mapTable.addSelectionListener(new SelectionAdapter() {
-
-			public void widgetSelected(SelectionEvent e) {
-				updateButtonsStatus();
-
-			}
-
-		});
-		mapTable.addMouseListener(new MouseAdapter() {
-			public void mouseDoubleClick(MouseEvent e) {
-				if (((IStructuredSelection) tableViewer.getSelection()).size() > 0)
-					editButtonSelected(null);
-			}
-		});
-		gd = new GridData(GridData.FILL_BOTH);
-		gd.horizontalSpan = 1;
-		gd.heightHint = TABLE_DEFAULT_HEIGHT;
-		mapTable.setLayoutData(gd);
-		mapTable.setHeaderVisible(true);
-		mapTable.setLinesVisible(true);
-		TableLayout layout = new TableLayout();
-		mapTable.setLayout(layout);
-
-		TableColumn keyCol = new TableColumn(mapTable, SWT.NONE);
-		keyCol
-				.setText(EditorMessages.InitializationSection_MapTable_Key);
-		layout.addColumnData(new ColumnWeightData(1, true));
-		keyCol.setResizable(true);
-
-		TableColumn valueCol = new TableColumn(mapTable, SWT.NONE);
-		layout.addColumnData(new ColumnWeightData(1, true));
-
-		valueCol
-				.setText(EditorMessages.InitializationSection_MapTable_Value);
-		valueCol.setResizable(true);
-
-		tableViewer = new TableViewer(mapTable);
-		tableViewer.setContentProvider(new AdapterFactoryContentProvider(
-				getAdapterFactory()));
-		tableViewer.setLabelProvider(new AdapterFactoryLabelProvider(
-				getAdapterFactory()));
-
-		tableViewer.addFilter(new ViewerFilter() {
-			public boolean select(Viewer viewer, Object parentElement,
-					Object element) {
-				return FacesConfigPackage.eINSTANCE.getMapEntryType()
-						.isInstance(element);
-			}
-		});
-
-		// map's operation buttons
-		Composite operationContainer = null;
-
-		operationContainer = SWTUtils
-				.createComposite(mapValueSection, SWT.NONE);
-
-		gd = new GridData(GridData.FILL_VERTICAL);
-		operationContainer.setLayoutData(gd);
-		gl = new GridLayout();
-		operationContainer.setLayout(gl);
-
-		Button addButton = SWTUtils.createPushButton(operationContainer,
-				EditorMessages.UI_Button_Add_more);
-
-		gd = new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		gd.grabExcessHorizontalSpace = false;
-		addButton.setLayoutData(gd);
-		addButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				addButtonSelected(e);
-			}
-		});
-
-		editButton = SWTUtils.createPushButton(operationContainer,
-				EditorMessages.UI_Button_Edit_more);
-
-		gd = new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		gd.grabExcessHorizontalSpace = false;
-		editButton.setLayoutData(gd);
-		editButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				editButtonSelected(e);
-			}
-
-		});
-		removeButton = SWTUtils.createPushButton(operationContainer,
-				EditorMessages.UI_Button_Remove);
-
-		gd = new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		gd.grabExcessHorizontalSpace = false;
-		removeButton.setLayoutData(gd);
-		removeButton.addSelectionListener(new SelectionAdapter() {
-
-			public void widgetSelected(SelectionEvent e) {
-				removeButtonSelected();
-			}
-
-		});
-		editButton.setEnabled(false);
-		removeButton.setEnabled(false);
-	}
-	
-	/**
-	 * @return the current project
-	 */
-	public IProject getProject() {
-		if (project == null) {
-			project = (IProject) section.getPage().getEditor().getAdapter(
-					IProject.class);
-		}
-		return project;
-	}
-	private AdapterFactory getAdapterFactory() {
-		return section.getAdapterFactory();
-	}
-
-	private void addButtonSelected(SelectionEvent e) {
-		AddEditMapEntryDialog dialog = new AddEditMapEntryDialog(EditorPlugin
-				.getActiveShell(), true);
-		if (dialog.open() == Dialog.OK) {
-			MapEntryType mapEntry = FacesConfigFactory.eINSTANCE
-					.createMapEntryType();
-			if (dialog.getKey() != null) {
-				KeyType key = FacesConfigFactory.eINSTANCE.createKeyType();
-				key.setTextContent(dialog.getKey());
-				mapEntry.setKey(key);
-			}
-			if (dialog.isNullValue()) {
-				NullValueType nullValue = FacesConfigFactory.eINSTANCE
-						.createNullValueType();
-				mapEntry.setNullValue(nullValue);
-			} else {
-				ValueType value = FacesConfigFactory.eINSTANCE
-						.createValueType();
-				value.setTextContent(dialog.getValue());
-				mapEntry.setValue(value);
-			}
-
-			mapEntries.getMapEntry().add(mapEntry);
-		}
-
-	}
-
-	private void editButtonSelected(SelectionEvent e) {
-		MapEntryType mapEntry = (MapEntryType) ((IStructuredSelection) tableViewer
-				.getSelection()).getFirstElement();
-		AddEditMapEntryDialog dialog = new AddEditMapEntryDialog(EditorPlugin
-				.getActiveShell(), false);
-		if (mapEntry.getKey() != null)
-			dialog.setKey(mapEntry.getKey().getTextContent());
-		if (mapEntry.getNullValue() != null)
-			dialog.setNullValue(true);
-		else if (mapEntry.getValue() != null)
-			dialog.setValue(mapEntry.getValue().getTextContent());
-
-		if (dialog.open() == Dialog.OK) {
-			if (mapEntry.getKey() != null)
-				mapEntry.getKey().setTextContent(dialog.getKey());
-			else {
-				KeyType keyType = FacesConfigFactory.eINSTANCE.createKeyType();
-				keyType.setTextContent(dialog.getKey());
-				mapEntry.setKey(keyType);
-			}
-			if (dialog.isNullValue()) {
-				if (mapEntry.getValue() != null)
-					EcoreUtil.remove(mapEntry.getValue());
-				// mapEntry.eUnset(FacesConfigPackage.eINSTANCE.getMapEntryType_Value());
-				mapEntry.setNullValue(FacesConfigFactory.eINSTANCE
-						.createNullValueType());
-
-			} else {
-				if (mapEntry.getNullValue() != null)
-					EcoreUtil.remove(mapEntry.getNullValue());
-				if (mapEntry.getValue() != null)
-					mapEntry.getValue().setTextContent(dialog.getValue());
-				else {
-					ValueType value = FacesConfigFactory.eINSTANCE
-							.createValueType();
-					value.setTextContent(dialog.getValue());
-					mapEntry.setValue(value);
-				}
-
-			}
-			tableViewer.refresh(mapEntry);
-		}
-
-	}
-
-	private void removeButtonSelected() {
-		MapEntryType mapEntry = (MapEntryType) ((IStructuredSelection) tableViewer
-				.getSelection()).getFirstElement();
-		mapEntries.getMapEntry().remove(mapEntry);
-		tableViewer.refresh();
-		updateButtonsStatus();
-	}
-
-	/**
-	 * update the button status
-	 */
-	public void updateButtonsStatus() {
-		if (((IStructuredSelection) tableViewer.getSelection()).size() > 0) {
-			editButton.setEnabled(true);
-			removeButton.setEnabled(true);
-		} else {
-			editButton.setEnabled(false);
-			removeButton.setEnabled(false);
-		}
-	}
-
-	/**
-	 * 
-	 */
-	protected void okPressed() {
-		KeyClassType keyClass = FacesConfigFactory.eINSTANCE
-				.createKeyClassType();
-		keyClass.setTextContent(this.keyClassField.getText().trim());
-		mapEntries.setKeyClass(keyClass);
-		ValueClassType valueClass = FacesConfigFactory.eINSTANCE
-				.createValueClassType();
-		valueClass.setTextContent(this.valueClassField.getText().trim());
-		mapEntries.setValueClass(valueClass);
-		super.okPressed();
-	}
-
-	/*
-	 * @see org.eclipse.jface.window.Window#getInitialSize()
-	 */
-	protected Point getInitialSize() {
-		Point shellSize = super.getInitialSize();
-		return new Point(Math.max(
-				convertHorizontalDLUsToPixels(MIN_DIALOG_WIDTH), shellSize.x),
-				shellSize.y);
-	}
-
-	/**
-	 * @param project
-	 */
-	public void setProject(IProject project) {
-		this.project = project;
-	}
-
-	/**
-	 * @return the map entries
-	 */
-	public MapEntriesType getMapEntries() {
-		return mapEntries;
-	}
-
-	/**
-	 * @param mapEntries
-	 */
-	public void setMapEntries(MapEntriesType mapEntries) {
-		this.mapEntries = mapEntries;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/EditValueDialog.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/EditValueDialog.java
deleted file mode 100644
index d69d66d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/EditValueDialog.java
+++ /dev/null
@@ -1,226 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.dialog;
-
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogFieldBase;
-import org.eclipse.jst.jsf.common.ui.internal.guiutils.SWTUtils;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.IFacesConfigConstants;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * This dialog is used to edit managed bean's property. if the
- * bDefinitionEditable is true, the property's name, class type, and initial
- * value can be edit and changed. otherwise, only initial value can be changed.
- * 
- * @author Xiao-guang Zhang, sfshi
- */
-public class EditValueDialog extends Dialog {
-
-	/** default dialog width and height */
-	private static final int VALUE_WIDTH = 380;
-
-	private static final int VALUE_HEIGHT = 220;
-
-	private String value;
-
-	/** property's initla value text control */
-	private Text valueText;
-
-	private Button nullValueTypeButton;
-
-	private boolean isNullButtonShown;
-
-	private boolean isNullValue;
-
-	/**
-	 * Equivilent to EditValueDialog(parentShell, false, false, value)
-	 * 
-	 * @param parentShell
-	 * @param value
-	 */
-	public EditValueDialog(Shell parentShell, String value) {
-		this(parentShell, false, false, value);
-		this.value = value;
-		this.isNullButtonShown = false;
-	}
-
-	/**
-	 * @param parentShell
-	 * @param isNullButtonShown
-	 * @param isNullValue
-	 * @param value
-	 */
-	public EditValueDialog(Shell parentShell, boolean isNullButtonShown,
-			boolean isNullValue, String value) {
-		super(parentShell);
-		this.isNullValue = isNullValue;
-		this.value = value;
-		this.isNullButtonShown = isNullButtonShown;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see Dialog#createDialogArea(Composite)
-	 */
-	protected Control createDialogArea(Composite parent) {
-		GridLayout gridLayout;
-		Composite container = (Composite) super.createDialogArea(parent);
-		gridLayout = new GridLayout();
-		gridLayout.numColumns = 1;
-		gridLayout.marginHeight = 10;
-		gridLayout.marginWidth = 10;
-		container.setLayout(gridLayout);
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		container.setLayoutData(gd);
-
-		if (this.isNullButtonShown) {
-			nullValueTypeButton = SWTUtils.createCheckBox(container,
-					IFacesConfigConstants.NULL_VALUE, 2);
-			nullValueTypeButton.addSelectionListener(new SelectionAdapter() {
-
-				public void widgetSelected(SelectionEvent e) {
-					valueText.setEnabled(!nullValueTypeButton.getSelection());
-					isNullValue = nullValueTypeButton.getSelection();
-				}
-
-			});
-		}
-
-		DialogField valueTitle = new DialogFieldBase();
-		// ManagedBeansPage.ManagedBeanInitializationSection.MapTable.Title =
-		// Values:
-		valueTitle
-				.setLabelText(EditorMessages.ManagedBeanPropertyEditDialog_Value);
-		valueTitle.doFillIntoGrid(null, container, 1);
-
-		gd = new GridData(GridData.FILL_BOTH);
-		gd.widthHint = VALUE_WIDTH;
-		gd.heightHint = VALUE_HEIGHT;
-		valueText = new Text(container, SWT.MULTI | SWT.BORDER);
-		valueText.setLayoutData(gd);
-
-		initFields();
-		return container;
-	}
-
-	private void initFields() {
-
-		if (isNullButtonShown && isNullValue) {
-			nullValueTypeButton.setSelection(true);
-			valueText.setEnabled(false);
-		} else if (value != null) {
-			valueText.setText(value);
-		}
-	}
-
-	/**
-	 * create a inital value group
-	 * 
-	 * @param container -
-	 *            parent composite control
-	 */
-	protected void createValueSection(Composite container) {
-		Composite valueSection = new Composite(container, SWT.NONE);
-		GridLayout gl = new GridLayout();
-		// gl.marginHeight = 20;
-		gl.numColumns = 2;
-		valueSection.setLayout(gl);
-		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-		valueSection.setLayoutData(gd);
-
-		Label lblValue = new Label(valueSection, SWT.LEFT);
-		gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
-		gd.widthHint = 100;
-		lblValue.setLayoutData(gd);
-
-		// ManagedBeanPropertyEditDialog.Value = Value:
-		lblValue
-				.setText(EditorMessages.ManagedBeanPropertyEditDialog_Value);
-
-		gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL
-				| GridData.FILL_HORIZONTAL);
-		gd.widthHint = 200;
-		valueText = new Text(valueSection, SWT.BORDER);
-		valueText.setLayoutData(gd);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see Dialog#createButtonsForButtonBar(Composite)
-	 */
-	protected void createButtonsForButtonBar(Composite parent) {
-		createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL,
-				true);
-		createButton(parent, IDialogConstants.CANCEL_ID,
-				IDialogConstants.CANCEL_LABEL, false);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see Dialog#configureShell(Shell)
-	 */
-	protected void configureShell(Shell newShell) {
-		super.configureShell(newShell);
-		newShell.setText(EditorMessages.ValueEditDialog_Title);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see Dialog#buttonPressed(int)
-	 */
-	protected void buttonPressed(int buttonId) {
-		if (buttonId == IDialogConstants.CANCEL_ID) {
-			setReturnCode(CANCEL);
-			close();
-			return;
-		} else if (buttonId == IDialogConstants.OK_ID) {
-			value = valueText.getText();
-			setReturnCode(OK);
-			close();
-			return;
-		}
-		super.buttonPressed(buttonId);
-	}
-
-	/**
-	 * @return the result data
-	 */
-	public Object getResultData() {
-		return value;
-	}
-
-	/**
-	 * @return tru if isNullButtonShown and isNullValue are both true
-	 */
-	public boolean isNullValue() {
-		return this.isNullButtonShown && isNullValue;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/ListChoiceDialog.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/ListChoiceDialog.java
deleted file mode 100644
index 9538b11..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/ListChoiceDialog.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.dialog;
-
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jst.jsf.common.ui.internal.guiutils.SWTUtils;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * @author Zhi-peng Zhang
- * @version
- */
-public class ListChoiceDialog extends Dialog {
-	/** The mini width for the text control */
-	private static final int TEXT_MINI_WIDTH = 350;
-
-	/** The mini width for the table viewer control */
-	private static final int TABLEVIEWER_MINI_WIDTH = 200;
-
-	private Text inputText;
-
-	private TableViewer tableViewer;
-
-	private String[] items;
-
-	private String result;
-	
-	private String labelString;
-
-	/**
-	 * @param parentShell
-	 * @param items
-	 * @param labelString
-	 */
-	public ListChoiceDialog(Shell parentShell, String[] items, String labelString) {
-		super(parentShell);
-		// if passed null for items, make it an empty array of strings
-		this.items = items == null ? new String[0] : items;
-		this.labelString = labelString;
-		
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Control createDialogArea(Composite parent) {
-		Composite composite = SWTUtils.createComposite(parent, 1);
-
-		SWTUtils.createLabel(composite, labelString, 1);
-
-		inputText = SWTUtils.createTextBox(composite, 1);
-		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-		gd.widthHint = TEXT_MINI_WIDTH;
-		inputText.setLayoutData(gd);
-
-		inputText.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				result = inputText.getText();
-			}
-		});
-
-		createTableViewer(composite);
-		return composite;
-	}
-
-	/**
-	 * @param composite
-	 */
-	private void createTableViewer(Composite composite) {
-		tableViewer = new TableViewer(composite, SWT.BORDER | SWT.H_SCROLL
-				| SWT.V_SCROLL);
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		gd.heightHint = TABLEVIEWER_MINI_WIDTH;
-		tableViewer.getControl().setLayoutData(gd);
-		tableViewer.add(items);
-		tableViewer
-				.addSelectionChangedListener(new ISelectionChangedListener() {
-					public void selectionChanged(SelectionChangedEvent event) {
-						IStructuredSelection selection = (IStructuredSelection) event
-								.getSelection();
-						if (selection != null) {
-							String text = (String) selection.getFirstElement();
-							if (text != null && text.length() > 0) {
-								result = text;
-								inputText.setText(text);
-							}
-						}
-					}
-				});
-	}
-	
-	/**
-	 * @return the result
-	 */
-	public String getResult()
-	{
-		return result;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/LocaleDialog.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/LocaleDialog.java
deleted file mode 100644
index 21e5169..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/LocaleDialog.java
+++ /dev/null
@@ -1,184 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.dialog;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Locale;
-
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.jst.jsf.common.ui.internal.guiutils.SWTUtils;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.KeyAdapter;
-import org.eclipse.swt.events.KeyEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * @author Zhi-peng Zhang
- * @version
- */
-public class LocaleDialog extends StatusDialog {
-	private Text inputText;
-
-	private TableViewer tableViewer;
-
-	private String newLocale;
-
-	private List existedLocaleList;
-
-	private List itemsList;
-
-	/** The mini width for the text control */
-	private static final int TEXT_MINI_WIDTH = 350;
-
-	/** The mini width for the table viewer control */
-	private static final int TABLEVIEWER_MINI_WIDTH = 200;
-
-	class LocaleViewerFilter extends ViewerFilter {
-		private String locale;
-
-		LocaleViewerFilter(String locale) {
-			super();
-			this.locale = locale;
-		}
-
-		public boolean select(Viewer v, Object parent, Object object) {
-			if (object instanceof String) {
-				if (null == locale || locale.length() == 0) {
-					return true;
-				}
-                String aLocale = (String) object;
-                return aLocale.startsWith(this.locale);
-			}
-			return false;
-		}
-	}
-
-	/**
-	 * 
-	 * @param parentShell
-	 * @param existedLocaleList
-	 */
-	public LocaleDialog(Shell parentShell, List existedLocaleList) {
-		super(parentShell);
-		this.existedLocaleList = existedLocaleList;
-		Locale[] locales = Locale.getAvailableLocales();
-		itemsList = new ArrayList(locales.length);
-
-		for (int i = 0, n = locales.length; i < n; i++) {
-			itemsList.add(locales[i].toString());
-		}
-		
-		setStatusMessage(EditorMessages.LocaleConfigSection_Wizard_Page_AlreadyExistsError);
-	}
-	
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
-	 */
-	protected void configureShell(Shell newShell) {
-		super.configureShell(newShell);
-		newShell.setText(EditorMessages.LocaleConfigSection_Wizard_WindowTitle);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.dialog.StatusDialog#createDialogContents(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Control createDialogContents(Composite parent) {
-		GridLayout layout = new GridLayout();
-		layout.marginWidth = 0;
-		layout.marginHeight = 0;
-		parent.setLayout(layout);
-
-		SWTUtils
-				.createLabel(
-						parent,
-						EditorMessages.LocaleConfigSection_Wizard_Page_LabelText,
-						1);
-
-		inputText = SWTUtils.createTextBox(parent, 1);
-		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-		gd.widthHint = TEXT_MINI_WIDTH;
-		inputText.setLayoutData(gd);
-
-		inputText.addKeyListener(new KeyAdapter() {
-			public void keyReleased(KeyEvent e) {
-				newLocale = inputText.getText();
-				tableViewer.resetFilters();
-				tableViewer.addFilter(new LocaleViewerFilter(newLocale));
-				tableViewer.add(itemsList.toArray());
-				updateStatus();
-			}
-		});
-
-		createTableViewer(parent);
-		return parent;
-	}
-
-	/**
-	 * @param composite
-	 */
-	private void createTableViewer(Composite composite) {
-		tableViewer = new TableViewer(composite, SWT.BORDER | SWT.H_SCROLL
-				| SWT.V_SCROLL);
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		gd.heightHint = TABLEVIEWER_MINI_WIDTH;
-		tableViewer.getControl().setLayoutData(gd);
-		tableViewer.add(itemsList.toArray());
-
-		tableViewer
-				.addSelectionChangedListener(new ISelectionChangedListener() {
-					public void selectionChanged(SelectionChangedEvent event) {
-
-						IStructuredSelection selection = (IStructuredSelection) event
-								.getSelection();
-						if (selection != null) {
-							String text = (String) selection.getFirstElement();
-							if (text != null && text.length() > 0) {
-								newLocale = text;
-								inputText.setText(text);
-								updateStatus();
-							}
-						}
-					}
-				});
-
-	}
-	
-	protected boolean isValid()
-	{
-		if (existedLocaleList != null && existedLocaleList.contains(newLocale)) {
-			return false;
-		}
-		return true;
-	}
-
-	/**
-	 * @return the result
-	 */
-	public String getResult()
-	{
-		return newLocale;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/MessageBundleSelectionDialog.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/MessageBundleSelectionDialog.java
deleted file mode 100644
index d4e34d8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/MessageBundleSelectionDialog.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.dialog;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jst.jsf.common.ui.IFileFolderConstants;
-import org.eclipse.jst.jsf.common.ui.internal.dialogs.ResourceOnClasspathDialog;
-import org.eclipse.jst.jsf.facesconfig.emf.MessageBundleType;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * @author sfshi
- * @version
- */
-public class MessageBundleSelectionDialog extends ResourceOnClasspathDialog {
-	/** A list contains the resoursebundles existing in faces config */
-	private List resourceBundles;
-
-	private String selectPropertyFileMessage = EditorMessages.MessageBundleSection_Dialog_Message_SelectPropertyFile; 
-
-	private String alreadyExistStatusMessage = EditorMessages.MessageBundleSection_Dialog_Message_AlreadyExists; 
-
-	private static final String[] PROPERTIES_FILES_SUFFIXS = new String[] { IFileFolderConstants.EXT_PROPERTIES };
-
-	/**
-	 * @param parentShell
-	 * @param project
-	 * @param resourceBundles
-	 */
-	public MessageBundleSelectionDialog(Shell parentShell,
-			IJavaProject project, List resourceBundles) {
-		super(parentShell, project);
-		this.resourceBundles = resourceBundles;
-		setSuffixs(PROPERTIES_FILES_SUFFIXS);
-		
-		setTitle(EditorMessages.MessageBundleSection_Dialog_Title);
-		setViewerSorter(new MessageBundleViewerSorter());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.common.dialogs.TreeViewerSelectionDialog#isValidSelection(java.lang.Object)
-	 */
-	protected boolean isValidSelection(Object selection) {
-		if (!(super.isValidSelection(selection))) {
-			setStatusMessage(selectPropertyFileMessage);
-			return false;
-		}
-
-		List selectionList = new ArrayList();
-		selectionList.add(selection);
-		this.setResult(selectionList);
-		Object result = super.getResult()[0];
-		if (null == result) {
-			setStatusMessage(selectPropertyFileMessage);
-			return false;
-		}
-
-		String newResourceBundle = (String) result;
-
-		if (isAlreadyExist(newResourceBundle)) {
-			this.setStatusMessage(alreadyExistStatusMessage);
-			return false;
-		}
-
-		return true;
-	}
-
-	/**
-	 * Determine whether this resource bundle file has already been defined in
-	 * faces config.
-	 * 
-	 * @return boolean
-	 */
-	private boolean isAlreadyExist(String resourceBundleString) {
-		if (null == resourceBundleString || resourceBundleString.length() == 0) {
-			return true;
-		}
-
-		if (null == resourceBundles) {
-			return false;
-		}
-
-		for (int i = 0; i < resourceBundles.size(); i++) {
-			MessageBundleType node = (MessageBundleType) resourceBundles.get(i);
-			String rbName = node.getTextContent();
-			if (rbName != null && rbName.equalsIgnoreCase(resourceBundleString)) {
-				return true;
-			}
-		}
-
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/MessageBundleViewerSorter.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/MessageBundleViewerSorter.java
deleted file mode 100644
index 18a8129..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/MessageBundleViewerSorter.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.dialog;
-
-import java.text.Collator;
-
-import org.eclipse.jdt.core.IPackageFragmentRoot;
-import org.eclipse.jface.viewers.ViewerSorter;
-import org.eclipse.jst.jsf.common.ui.IFileFolderConstants;
-
-/**
- * @author sfshi
- * @version
- */
-public class MessageBundleViewerSorter extends ViewerSorter {
-
-	/**
-	 * 
-	 */
-	public MessageBundleViewerSorter() {
-		super();
-	}
-
-	/**
-	 * @param collator
-	 */
-	public MessageBundleViewerSorter(Collator collator) {
-		super(collator);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ViewerSorter#category(java.lang.Object)
-	 */
-	public int category(Object element) {
-		if (element instanceof IPackageFragmentRoot
-				&& !((IPackageFragmentRoot)element).isArchive()) {
-			IPackageFragmentRoot root = (IPackageFragmentRoot) element;
-			if (IFileFolderConstants.FOLDER_SOURCE
-					.equals(root.getElementName())) {
-				return 0;
-			}
-			return 1;
-		}
-
-		return 2;
-	}
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/StatusDialog.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/StatusDialog.java
deleted file mode 100644
index 22485d9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/StatusDialog.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.dialog;
-
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * @author Zhi-peng Zhang
- * @version
- */
-
-/**
- * A common Dialog with validation information.
- */
-public abstract class StatusDialog extends Dialog {
-	/** The validation image */
-	private Label statusImage;
-
-	/** The validation message */
-	private Label statusLabel;
-
-	/** The validation message content */
-	private String statusMessage;
-
-	/**
-	 * 
-	 * @param parentShell
-	 */
-	protected StatusDialog(Shell parentShell) {
-		super(parentShell);
-	}
-
-	/**
-	 * Creates and returns the contents of the upper part of this dialog (above
-	 * the validation widgets). User should create Layout for the parent parameter.
-	 * 
-	 * @param parent
-	 *            the parent composite to contain the dialog area
-	 * @return the dialog area control
-	 */
-	protected abstract Control createDialogContents(Composite parent);
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Control createDialogArea(Composite parent) {
-		Composite area = (Composite) super.createDialogArea(parent);
-		area.setLayout(new GridLayout(2,false));
-
-		Composite contents = new Composite(area, SWT.NONE);
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		gd.horizontalSpan = 2;
-		contents.setLayoutData(gd);
-		createDialogContents(contents);
-
-		statusImage = createLabel(area);
-		statusImage.setImage(JFaceResources
-				.getImage(Dialog.DLG_IMG_MESSAGE_ERROR));
-		statusLabel = createLabel(area);
-		statusImage.setVisible(false);
-		return area;
-	}
-
-	private Label createLabel(Composite parent) {
-		Label label = new Label(parent, SWT.LEFT);
-		GridData data = new GridData();
-		data.horizontalSpan = 1;
-		data.horizontalAlignment = GridData.FILL;
-		label.setLayoutData(data);
-		return label;
-	}
-
-	/**
-	 * @return true if is status is valid
-	 */
-	protected abstract boolean isValid();
-
-	/**
-	 * update the status information
-	 */
-	protected void updateStatus() {
-		if (isValid()) {
-			statusImage.setVisible(false);
-			statusLabel.setText(""); //$NON-NLS-1$
-			getButton(IDialogConstants.OK_ID).setEnabled(true);
-		} else {
-			statusImage.setVisible(true);
-			statusLabel.setText(statusMessage == null ? "" : statusMessage);//$NON-NLS-1$
-			getButton(IDialogConstants.OK_ID).setEnabled(false);
-		}
-	}
-
-	/**
-	 * @return the current status message
-	 */
-	public String getStatusMessage() {
-		return statusMessage;
-	}
-
-	/**
-	 * @param statusMessage
-	 */
-	public void setStatusMessage(String statusMessage) {
-		this.statusMessage = statusMessage;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/ComponentsPage.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/ComponentsPage.java
deleted file mode 100644
index 7fb266e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/ComponentsPage.java
+++ /dev/null
@@ -1,286 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.page;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.jface.viewers.ViewerSorter;
-import org.eclipse.jst.jsf.facesconfig.emf.AttributeType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.FacetType;
-import org.eclipse.jst.jsf.facesconfig.emf.PropertyType;
-import org.eclipse.jst.jsf.facesconfig.emf.RendererType;
-import org.eclipse.jst.jsf.facesconfig.ui.FacesConfigEditor;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.page.detail.ComponentDetailsPage;
-import org.eclipse.jst.jsf.facesconfig.ui.page.detail.ConverterDetailsPage;
-import org.eclipse.jst.jsf.facesconfig.ui.page.detail.RenderkitDetailsPage;
-import org.eclipse.jst.jsf.facesconfig.ui.page.detail.ValidatorDetailsPage;
-import org.eclipse.jst.jsf.facesconfig.ui.section.ComponentMasterSection;
-import org.eclipse.jst.jsf.facesconfig.ui.section.ConverterMasterSection;
-import org.eclipse.jst.jsf.facesconfig.ui.section.FacesConfigMasterSection;
-import org.eclipse.jst.jsf.facesconfig.ui.section.RenderkitMasterSection;
-import org.eclipse.jst.jsf.facesconfig.ui.section.ValidatorMasterSection;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.forms.IDetailsPage;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.views.contentoutline.ContentOutlinePage;
-import org.eclipse.ui.views.contentoutline.IContentOutlinePage;
-
-/**
- * The "Components" page of faces config editor.
- * 
- * @author sfshi
- * 
- */
-public class ComponentsPage extends FacesConfigMasterDetailPage {
-
-	/**
-	 * The id of this page in the faces-config editor.
-	 */
-	public static final String PAGE_ID = "org.eclipse.jst.jsf.facesconfig.ui.page.ComponentsPage"; //$NON-NLS-1$
-
-	private IContentOutlinePage contentOutlinePage;
-
-	/**
-	 * Constructor of ComponentsPage;
-	 * 
-	 * @param editor
-	 *            the facesconfig editor;
-	 */
-	public ComponentsPage(FacesConfigEditor editor) {
-		super(editor, "ComponentsPage", //$NON-NLS-1$
-				EditorMessages.FacesConfigEditor_Components_TabName);
-	}
-
-	/**
-	 * Create the master sections;
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.page.FacesConfigMasterDetailPage#createMasterSections(Composite,
-	 *      IManagedForm, FormToolkit, FacesConfigMasterDetailPage)
-	 */
-	protected FacesConfigMasterSection[] createMasterSections(
-			Composite composite, IManagedForm managedForm, FormToolkit toolkit,
-			FacesConfigMasterDetailPage page) {
-		FacesConfigMasterSection componentMaster = new ComponentMasterSection(
-				composite, managedForm, toolkit, page);
-		componentMaster.getSection().setExpanded(true);
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		componentMaster.getSection().setLayoutData(gd);
-
-		FacesConfigMasterSection converterMaster = new ConverterMasterSection(
-				composite, managedForm, toolkit, page);
-		converterMaster.getSection().setExpanded(false);
-		GridData convertergd = new GridData(GridData.FILL_HORIZONTAL);
-		converterMaster.getSection().setLayoutData(convertergd);
-
-		FacesConfigMasterSection renderkitMaster = new RenderkitMasterSection(
-				composite, managedForm, toolkit, page);
-		renderkitMaster.getSection().setExpanded(false);
-		GridData renderkitgd = new GridData(GridData.FILL_HORIZONTAL);
-		renderkitMaster.getSection().setLayoutData(renderkitgd);
-
-		FacesConfigMasterSection validatorMaster = new ValidatorMasterSection(
-				composite, managedForm, toolkit, page);
-		validatorMaster.getSection().setExpanded(false);
-		GridData valicatorgd = new GridData(GridData.FILL_HORIZONTAL);
-		validatorMaster.getSection().setLayoutData(valicatorgd);
-
-		return new FacesConfigMasterSection[] { componentMaster,
-				converterMaster, renderkitMaster, validatorMaster };
-	}
-
-	/**
-	 * get the details page;
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.page.FacesConfigMasterDetailPage#getPageKey(Object
-	 *      object)
-	 * @param key
-	 *            the eClass object of a component.
-	 */
-	public IDetailsPage getPage(Object key) {
-		IDetailsPage detailsPage = null;
-		if (key instanceof EClass) {
-			EClass eClass = (EClass) key;
-			if (eClass.getClassifierID() == FacesConfigPackage.COMPONENT_TYPE) {
-				detailsPage = new ComponentDetailsPage(this);
-			} else if (eClass.getClassifierID() == FacesConfigPackage.RENDER_KIT_TYPE) {
-				detailsPage = new RenderkitDetailsPage(this);
-			} else if (eClass.getClassifierID() == FacesConfigPackage.CONVERTER_TYPE) {
-				detailsPage = new ConverterDetailsPage(this);
-			} else if (eClass.getClassifierID() == FacesConfigPackage.VALIDATOR_TYPE) {
-				detailsPage = new ValidatorDetailsPage(this);
-			}
-
-			if (detailsPage instanceof ISelectionProvider) {
-				((ISelectionProvider) detailsPage)
-						.addSelectionChangedListener(this);
-			}
-		}
-		return detailsPage;
-	}
-
-	public Object getAdapter(Class adapter) {
-
-		if (adapter == IContentOutlinePage.class) {
-			return getOutlinePage();
-		}
-
-		return super.getAdapter(adapter);
-	}
-
-	private IContentOutlinePage getOutlinePage() {
-
-		if (contentOutlinePage == null) {
-			// The content outline is just a tree.
-			//
-			class ComponentsContentOutlinePage extends ContentOutlinePage {
-				public void createControl(Composite parent) {
-					super.createControl(parent);
-					TreeViewer contentOutlineViewer = getTreeViewer();
-					contentOutlineViewer.addSelectionChangedListener(this);
-
-					AdapterFactory adapterFactory = (AdapterFactory) getEditor()
-							.getAdapter(AdapterFactory.class);
-					// Set up the tree viewer.
-					contentOutlineViewer
-							.setContentProvider(new AdapterFactoryContentProvider(
-									adapterFactory));
-					contentOutlineViewer
-							.setLabelProvider(new AdapterFactoryLabelProvider(
-									adapterFactory));
-					contentOutlineViewer.addFilter(new ViewerFilter() {
-
-						public boolean select(Viewer viewer,
-								Object parentElement, Object element) {
-							return FacesConfigPackage.eINSTANCE
-									.getComponentType().isInstance(element)
-									|| FacesConfigPackage.eINSTANCE
-											.getConverterType().isInstance(
-													element)
-									|| FacesConfigPackage.eINSTANCE
-											.getRenderKitType().isInstance(
-													element)
-									|| FacesConfigPackage.eINSTANCE
-											.getValidatorType().isInstance(
-													element)
-									|| FacesConfigPackage.eINSTANCE
-											.getAttributeType().isInstance(
-													element)
-									|| FacesConfigPackage.eINSTANCE
-											.getPropertyType().isInstance(
-													element)
-									|| FacesConfigPackage.eINSTANCE
-											.getFacetType().isInstance(element)
-									|| FacesConfigPackage.eINSTANCE
-											.getRendererType().isInstance(
-													element);
-						}
-					});
-
-					contentOutlineViewer.setSorter(new ViewerSorter());
-					contentOutlineViewer.setInput(getInput());
-				}
-
-			}
-
-			contentOutlinePage = new ComponentsContentOutlinePage();
-
-			// Listen to selection so that we can handle it is a special
-			// way.
-			//
-			contentOutlinePage
-					.addSelectionChangedListener(new ISelectionChangedListener() {
-						// This ensures that we handle selections correctly.
-						public void selectionChanged(SelectionChangedEvent event) {
-							setSelection(event.getSelection());
-						}
-					});
-
-			addSelectionChangedListener((ContentOutlinePage) contentOutlinePage);
-		}
-
-		return contentOutlinePage;
-
-	}
-
-	/**
-	 * handle the selection changed event from outline page.
-	 * 
-	 * @param selection
-	 */
-	public void setSelection(ISelection selection) {
-
-		if (selection instanceof IStructuredSelection) {
-			IStructuredSelection ss = (IStructuredSelection) selection;
-			IStructuredSelection currentSelection = (IStructuredSelection) this
-					.getSelection();
-			if ((!ss.isEmpty())
-					&& (!currentSelection.isEmpty())
-					&& (ss.getFirstElement() == currentSelection
-							.getFirstElement())) {
-				return;
-			}
-			EObject component = null;
-			if (ss.getFirstElement() instanceof AttributeType
-					|| ss.getFirstElement() instanceof PropertyType
-					|| ss.getFirstElement() instanceof FacetType
-					|| ss.getFirstElement() instanceof RendererType) {
-				component = ((EObject) ss.getFirstElement()).eContainer();
-			} else if (ss.getFirstElement() instanceof EObject) {
-				component = (EObject) ss.getFirstElement();
-			}
-
-			if (component != null) {
-				FacesConfigMasterSection section = null;
-				if (FacesConfigPackage.eINSTANCE.getComponentType().isInstance(
-						component)) {
-					section = getFacesConfigMasterSections()[0];
-				} else if (FacesConfigPackage.eINSTANCE.getConverterType()
-						.isInstance(component)) {
-					section = getFacesConfigMasterSections()[1];
-				} else if (FacesConfigPackage.eINSTANCE.getRenderKitType()
-						.isInstance(component)) {
-					section = getFacesConfigMasterSections()[2];
-				} else if (FacesConfigPackage.eINSTANCE.getValidatorType()
-						.isInstance(component)) {
-					section = getFacesConfigMasterSections()[3];
-				}
-
-				if (!section.getSection().isExpanded()) {
-					this.closeOtherSections(section);
-					GridData gd = new GridData(GridData.FILL_BOTH);
-					section.getSection().setLayoutData(gd);
-					section.getSection().setExpanded(true);
-				}
-				IStructuredSelection newselection = new StructuredSelection(
-						component);
-				section.getStructuredViewer().setSelection(newselection);
-			}
-		}
-
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/FacesConfigMasterDetailPage.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/FacesConfigMasterDetailPage.java
deleted file mode 100644
index c9ff0ee..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/FacesConfigMasterDetailPage.java
+++ /dev/null
@@ -1,396 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.page;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.emf.edit.domain.IEditingDomainProvider;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.emf.edit.ui.view.ExtendedPropertySheetPage;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.jst.jsf.facesconfig.ui.FacesConfigEditor;
-import org.eclipse.jst.jsf.facesconfig.ui.page.detail.FacesConfigDetailsPage;
-import org.eclipse.jst.jsf.facesconfig.ui.section.FacesConfigMasterSection;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.SashForm;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.forms.DetailsPart;
-import org.eclipse.ui.forms.IDetailsPage;
-import org.eclipse.ui.forms.IDetailsPageProvider;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.editor.FormPage;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.forms.widgets.ScrolledForm;
-import org.eclipse.ui.views.properties.IPropertySheetPage;
-
-/**
- * In some cases the page is a master-detail style, the content of the right
- * side will change according user's selection on the left side. This is an
- * abstract implementation of IFacesConfigPage, with a FacesConfigMasterSection
- * array and a DetailsPart.
- * 
- * @author sfshi
- * 
- */
-public abstract class FacesConfigMasterDetailPage extends FormPage implements
-		IFacesConfigPage, IDetailsPageProvider, ISelectionChangedListener,
-		ISelectionProvider, IEditingDomainProvider {
-
-	private static final String BANNER_IMAGE_FILE = "form_banner.gif"; //$NON-NLS-1$
-
-	private final static Image BANNER_IMAGE = EditorPlugin.getDefault()
-			.getImage(BANNER_IMAGE_FILE);
-
-	private FacesConfigMasterSection[] facesConfigMasterSections;
-
-	private DetailsPart detailsPart;
-
-	private Object input;
-
-	private List selectionChangedListeners = new ArrayList();
-
-	private IPropertySheetPage propertySheetPage;
-	
-	private ISelection currentSelection = null;
-
-	/**
-	 * 
-	 * @param editor
-	 *            the editor part that this page belongs to;
-	 * @param id
-	 *            page id;
-	 * @param title
-	 *            page title;
-	 */
-	public FacesConfigMasterDetailPage(FacesConfigEditor editor, String id,
-			String title) {
-		super(editor, id, title);
-	}
-
-	public void dispose() {
-		for(int i=0; i < facesConfigMasterSections.length;i++) {
-			FacesConfigMasterSection master = facesConfigMasterSections[i];
-			if (master != null)
-				master.dispose();
-		}
-		
-		selectionChangedListeners.clear();
-		
-		super.dispose();
-	}
-	public EditingDomain getEditingDomain() {
-		return ((FacesConfigEditor) getEditor()).getEditingDomain();
-	}
-
-	/**
-	 * 
-	 * @see org.eclipse.ui.forms.editor.FormPage#createFormContent(org.eclipse.ui.forms.IManagedForm)
-	 */
-	protected void createFormContent(IManagedForm managedForm) {
-
-		ScrolledForm form = managedForm.getForm();
-		form.setText(this.getTitle());
-		form.setBackgroundImage(BANNER_IMAGE); 
-		fillBody(managedForm, managedForm.getToolkit());
-		managedForm.refresh();
-	}
-
-	/**
-	 * set input for this page when the it got activated at the first time; if
-	 * it's not the first time, then refresh the page.
-	 * 
-	 * @see org.eclipse.ui.forms.editor.FormPage#setActive(boolean)
-	 */
-	public void setActive(boolean active) {
-		super.setActive(active);
-		if (active) {
-			if (getInput() != ((FacesConfigEditor) getEditor())
-					.getFacesConfig()) {
-				setInput(((FacesConfigEditor) getEditor()).getFacesConfig());
-			} else {
-				this.refresh();
-			}
-		}
-	}
-
-	public boolean isEditor() {
-		return true;
-	}
-
-	/**
-	 * 
-	 * @param managedForm
-	 * @param toolkit
-	 */
-	private void fillBody(IManagedForm managedForm, FormToolkit toolkit) {
-		Composite body = managedForm.getForm().getBody();
-
-		GridLayout gridLayout = new GridLayout();
-		gridLayout.horizontalSpacing = 0;
-		gridLayout.verticalSpacing = 0;
-		gridLayout.numColumns = 2;
-		gridLayout.marginHeight = 0;
-		gridLayout.marginWidth = 0;
-		body.setLayout(gridLayout);
-
-		SashForm sashForm = new SashForm(body, SWT.NULL);
-		managedForm.getToolkit().adapt(sashForm, false, false);
-		sashForm.setMenu(body.getMenu());
-		sashForm.setLayoutData(new GridData(GridData.FILL_BOTH));
-
-		Composite leftContainer = toolkit.createComposite(sashForm);
-		GridLayout gl = new GridLayout();
-		gl.marginHeight = 0;
-		leftContainer.setLayout(gl);
-
-		// create master sections here
-		facesConfigMasterSections = createMasterSections(leftContainer,
-				managedForm, toolkit, this);
-
-		if (facesConfigMasterSections != null) {
-			for (int i = 0, n = facesConfigMasterSections.length; i < n; i++) {
-				FacesConfigMasterSection aSection = facesConfigMasterSections[i];
-				aSection.initialize();
-				aSection.addSelectionChangedListener(this);
-
-			}
-		}
-
-		detailsPart = new DetailsPart(managedForm, sashForm, SWT.NULL);
-		managedForm.addPart(detailsPart);
-
-		detailsPart.setPageLimit(4);
-		detailsPart.setPageProvider(this);
-
-		detailsPart.initialize(managedForm);
-
-		sashForm.setWeights(new int[] { 40, 60 });
-
-		getSite().setSelectionProvider(this);
-	}
-
-	/**
-	 * Create the detail sections, and set layout data and initial expand state
-	 * for them.
-	 * 
-	 * @param composite
-	 * @param managedForm
-	 * @param toolkit
-	 * @param page
-	 * @return the detail sections
-	 */
-	abstract protected FacesConfigMasterSection[] createMasterSections(
-			Composite composite, IManagedForm managedForm, FormToolkit toolkit,
-			FacesConfigMasterDetailPage page);
-
-	/**
-	 * set input object; also set into all the master sections.
-	 */
-	public void setInput(Object input) {
-		if (facesConfigMasterSections != null) {
-			for (int i = 0, n = facesConfigMasterSections.length; i < n; i++) {
-				facesConfigMasterSections[i].setInput(input);
-			}
-		}
-		this.input = input;
-	}
-
-	/**
-	 * get the input object.
-	 */
-	public Object getInput() {
-		return input;
-	}
-
-	/**
-	 * Defaultly use the EClass object of the selected object as page key. Sub
-	 * classes can override this method if there has other ways.
-	 * 
-	 * @param object
-	 */
-	public Object getPageKey(Object object) {
-		if (object instanceof EObject) {
-			EObject eObject = (EObject) object;
-			return eObject.eClass();
-		}
-		return null;
-	}
-
-	/**
-	 * Subclasses should create and return an IDetailsPage instance according
-	 * what the key is. Defaultly the EClass object of the selected object in
-	 * the structured viewer will be taken as the page key.
-	 * 
-	 * @see #getPageKey
-	 * 
-	 */
-	abstract public IDetailsPage getPage(Object key);
-
-	/**
-	 * transfer the selection changed event to detail part.
-	 */
-	public void selectionChanged(SelectionChangedEvent event) {
-
-		currentSelection = event.getSelection();
-		if (event.getSource() instanceof FacesConfigMasterSection) {
-			FacesConfigMasterSection source = (FacesConfigMasterSection) event
-					.getSource();
-
-			detailsPart.selectionChanged(source, event.getSelection());
-
-			if (source.getSection().isExpanded()) {
-				for (int i = 0, n = selectionChangedListeners.size(); i < n; i++) {
-					((ISelectionChangedListener) selectionChangedListeners
-							.get(i)).selectionChanged(event);
-				}
-			}
-		} else if (event.getSource() instanceof FacesConfigDetailsPage) {
-			for (int i = 0, n = selectionChangedListeners.size(); i < n; i++) {
-				((ISelectionChangedListener) selectionChangedListeners.get(i))
-						.selectionChanged(event);
-			}
-		}
-	}
-
-	/**
-	 * set other sections' expand state to false, except this section;
-	 * 
-	 * @param section
-	 *            the section that be expanded.
-	 */
-	public void closeOtherSections(FacesConfigMasterSection section) {
-
-		for (int i = 0, n = facesConfigMasterSections.length; i < n; i++) {
-			FacesConfigMasterSection aSection = facesConfigMasterSections[i];
-			if (aSection != section && aSection.getSection().isExpanded()) {
-				aSection.getSection().setExpanded(false);
-				GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-				aSection.getSection().setLayoutData(gd);
-			}
-		}
-	}
-
-	/**
-	 * refresh this page, the expanded section and the detail page will got
-	 * refreshed.
-	 */
-	public void refresh() {
-
-		// only refresh the expanded section;
-		for (int i = 0, n = facesConfigMasterSections.length; i < n; i++) {
-			if (facesConfigMasterSections[i].getSection().isExpanded()) {
-				facesConfigMasterSections[i].refresh();
-			}
-		}
-
-		// refresh the detail page, it will call detail sections
-		// to got refreshed.
-		if (detailsPart.getCurrentPage() != null) {
-			detailsPart.getCurrentPage().refresh();
-		}
-	}
-
-	/**
-	 * get the section that is expanded.
-	 * 
-	 * @return the master section
-	 */
-	protected FacesConfigMasterSection getActiveSection() {
-		for (int i = 0, n = facesConfigMasterSections.length; i < n; i++) {
-
-			if (facesConfigMasterSections[i].getSection().isExpanded()) {
-				return facesConfigMasterSections[i];
-			}
-		}
-		return null;
-
-	}
-
-	public void addSelectionChangedListener(ISelectionChangedListener listener) {
-		selectionChangedListeners.add(listener);
-	}
-
-	public ISelection getSelection() {
-		if(currentSelection != null)
-			return currentSelection;
-		return StructuredSelection.EMPTY;
-
-	}
-
-	public void removeSelectionChangedListener(
-			ISelectionChangedListener listener) {
-		selectionChangedListeners.remove(listener);
-	}
-
-	public void setSelection(ISelection selection) {
-	    // no selection setting
-	}
-
-	public Object getAdapter(Class adapter) {
-
-		if (adapter == IPropertySheetPage.class) {
-			return getPropertySheetPage();
-		}
-		return super.getAdapter(adapter);
-	}
-
-	private IPropertySheetPage getPropertySheetPage() {
-
-		AdapterFactoryEditingDomain editingDomain = (AdapterFactoryEditingDomain) getEditor()
-				.getAdapter(EditingDomain.class);
-		AdapterFactory adapterFactory = (AdapterFactory) getEditor()
-				.getAdapter(AdapterFactory.class);
-		if (propertySheetPage == null) {
-			propertySheetPage = new ExtendedPropertySheetPage(editingDomain) {
-				public void setSelectionToViewer(List selection) {
-					// FacesConfigEditor.this.setSelectionToViewer(selection);
-					// FacesConfigEditor.this.setFocus();
-				}
-
-				public void setActionBars(IActionBars actionBars) {
-					super.setActionBars(actionBars);
-					// getActionBarContributor().shareGlobalActions(this,
-					// actionBars);
-				}
-			};
-			((ExtendedPropertySheetPage) propertySheetPage)
-					.setPropertySourceProvider(new AdapterFactoryContentProvider(
-							adapterFactory));
-			// this.addSelectionChangedListener((ExtendedPropertySheetPage)
-			// propertySheetPage);
-		}
-
-		return propertySheetPage;
-
-	}
-
-	/**
-	 * @return the facesConfigMasterSections
-	 */
-	public FacesConfigMasterSection[] getFacesConfigMasterSections() {
-		return facesConfigMasterSections;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/IFacesConfigPage.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/IFacesConfigPage.java
deleted file mode 100644
index 42afa4f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/IFacesConfigPage.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.page;
-
-import org.eclipse.ui.forms.editor.IFormPage;
-
-/**
- * Implemented by IFormPage's that want to support EditorInput-like
- * model set/get/refresh
- * 
- * @author sfshi
- * 
- */
-public interface IFacesConfigPage extends IFormPage {
-
-	/**
-	 * Set the input.  Implementer may choose to ignore
-	 * 
-	 * @param input
-	 */
-	void setInput(Object input);
-
-	/**
-	 * @return the input or null if none set
-	 */
-	Object getInput();
-
-	/**
-	 * signal to a form page that the data in its input has changed
-	 * and it should refresh its view.
-	 */
-	void refresh();
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/IntroductionPage.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/IntroductionPage.java
deleted file mode 100644
index f3e1354..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/IntroductionPage.java
+++ /dev/null
@@ -1,176 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.page;
-
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jst.jsf.common.ui.internal.guiutils.IntroductionSection;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.jst.jsf.facesconfig.ui.FacesConfigEditor;
-import org.eclipse.jst.jsf.facesconfig.ui.preference.GEMPreferences;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.editor.FormPage;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.forms.widgets.ScrolledForm;
-import org.eclipse.ui.forms.widgets.TableWrapData;
-import org.eclipse.ui.forms.widgets.TableWrapLayout;
-
-/**
- * Handle the Introduction page for the pageflow editor.
- * 
- * @author jchoi
- */
-public class IntroductionPage extends FormPage implements IFacesConfigPage, ISelectionProvider, IPropertyChangeListener{
-	
-	private static final String FORM_BANNER_IMAGE_FILE = "form_banner.gif"; //$NON-NLS-1$
-	
-	private Button noIntroPageButton = null;
-
-	/**
-	 * @param facesConfigEditor
-	 */
-	public IntroductionPage(FacesConfigEditor facesConfigEditor) {
-		super(facesConfigEditor, IntroductionPage.class.getName(),
-				EditorMessages.editor_pageflow_page_intro_name);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.forms.editor.FormPage#createFormContent(org.eclipse.ui.forms.IManagedForm)
-	 */
-	protected void createFormContent(IManagedForm managedForm) {
-		// get the form
-		ScrolledForm form = managedForm.getForm();
-		FormToolkit toolkit = getEditor().getToolkit();
-		form.setText(EditorMessages.editor_pageflow_page_intro_title);
-
-		form.setBackgroundImage(EditorPlugin.getDefault().getImage(FORM_BANNER_IMAGE_FILE));
-
-		// create a layout
-		TableWrapLayout layout = new TableWrapLayout();
-		layout.numColumns = 1;
-		layout.makeColumnsEqualWidth = true;
-		layout.verticalSpacing = 20;
-		form.getBody().setLayout(layout);
-
-		IntroductionSection introPart = new IntroductionSection(
-				FacesConfigEditor.EDITOR_ID, managedForm, toolkit,
-				EditorMessages.editor_pageflow_page_intro_help_HelpContextID,
-				EditorMessages.editor_pageflow_page_intro_help_HelpToolTip);
-		
-		noIntroPageButton = toolkit.createButton(form.getBody(), EditorMessages.editor_pageflow_page_intro_NoIntroPage, SWT.CHECK);
-		noIntroPageButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				boolean selection = ((Button) e.widget).getSelection();
-				EditorPlugin.getDefault().getPreferenceStore().setValue(GEMPreferences.SHOW_INTRO_EDITOR, !selection);
-			}
-		});
-		TableWrapData td = new TableWrapData(TableWrapData.FILL_GRAB);
-		td.colspan = 1;
-		introPart.setLayoutData(td);
-
-		getSite().setSelectionProvider(this);
-		
-		IPreferenceStore preferenceStore = EditorPlugin.getDefault().getPreferenceStore();
-		preferenceStore.addPropertyChangeListener(this);
-		updatePrefenceControls(preferenceStore);
-	}
-
-	public void addSelectionChangedListener(ISelectionChangedListener listener) {
-		// TODO Auto-generated method stub
-		
-	}
-	
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.forms.editor.IFormPage#isEditor()
-	 */
-	public boolean isEditor() {
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#getSelection()
-	 */
-	public ISelection getSelection() {
-		return StructuredSelection.EMPTY;
-	}
-
-	public void removeSelectionChangedListener(ISelectionChangedListener listener) {
-		// TODO Auto-generated method stub
-		
-	}
-
-	public void setSelection(ISelection selection) {
-		// TODO Auto-generated method stub
-		
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.page.IFacesConfigPage#getInput()
-	 */
-	public Object getInput() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.page.IFacesConfigPage#refresh()
-	 */
-	public void refresh() {
-		// TODO Auto-generated method stub
-		
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.page.IFacesConfigPage#setInput(java.lang.Object)
-	 */
-	public void setInput(Object input) {
-		// TODO Auto-generated method stub
-		
-	}
-
-	public void propertyChange(PropertyChangeEvent event) {
-		if (event != null) {
-			String property = event.getProperty();
-			if (property == null || property.equals(GEMPreferences.SHOW_INTRO_EDITOR)) {
-				//assume that we are in an ui thread, as other listeners assume this too:
-				updatePrefenceControls(EditorPlugin.getDefault().getPreferenceStore());
-			}
-		}
-	}
-
-	private void updatePrefenceControls(IPreferenceStore preferenceStore) {
-		boolean noIntroPage = !GEMPreferences.getShowIntroEditor();
-		noIntroPageButton.setSelection(noIntroPage);
-	}
-
-	public void dispose() {
-		EditorPlugin.getDefault().getPreferenceStore().removePropertyChangeListener(this);
-		super.dispose();
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/ManagedBeanPage.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/ManagedBeanPage.java
deleted file mode 100644
index ad6ef9a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/ManagedBeanPage.java
+++ /dev/null
@@ -1,205 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.page;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.jface.viewers.ViewerSorter;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType;
-import org.eclipse.jst.jsf.facesconfig.ui.FacesConfigEditor;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.page.detail.ManagedBeanDetailsPage;
-import org.eclipse.jst.jsf.facesconfig.ui.section.FacesConfigMasterSection;
-import org.eclipse.jst.jsf.facesconfig.ui.section.ManagedBeanMasterSection;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.forms.IDetailsPage;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.views.contentoutline.ContentOutlinePage;
-import org.eclipse.ui.views.contentoutline.IContentOutlinePage;
-
-/**
- * 
- * @author sfshi
- * 
- */
-public class ManagedBeanPage extends FacesConfigMasterDetailPage {
-
-    /**
-     * The id of this page in the faces-config editor.
-     */
-	public static final String PAGE_ID = "org.eclipse.jst.jsf.facesconfig.ui.page.ManagedBeanPage"; //$NON-NLS-1$
-
-	private IContentOutlinePage contentOutlinePage;
-
-	/**
-	 * @param editor
-	 */
-	public ManagedBeanPage(FacesConfigEditor editor) {
-		super(editor, "ManagedBeanPage", //$NON-NLS-1$
-				EditorMessages.FacesConfigEditor_ManagedBeans_TabName);
-	}
-
-	public void dispose() {
-		if (contentOutlinePage != null) {
-			contentOutlinePage.dispose();
-			contentOutlinePage = null;
-		}
-		super.dispose();
-	}
-	protected FacesConfigMasterSection[] createMasterSections(
-			Composite composite, IManagedForm managedForm, FormToolkit toolkit,
-			FacesConfigMasterDetailPage page) {
-		FacesConfigMasterSection managedBeanMaster = new ManagedBeanMasterSection(
-				composite, managedForm, toolkit, page);
-		managedBeanMaster.getSection().setExpanded(true);
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		managedBeanMaster.getSection().setLayoutData(gd);
-		return new FacesConfigMasterSection[] { managedBeanMaster };
-	}
-
-	public IDetailsPage getPage(Object key) {
-		IDetailsPage detailsPage = null;
-		if (key instanceof EClass) {
-			EClass eClass = (EClass) key;
-			if (eClass.getClassifierID() == FacesConfigPackage.MANAGED_BEAN_TYPE) {
-				detailsPage = new ManagedBeanDetailsPage(this);
-			}
-			
-			if (detailsPage instanceof ISelectionProvider) {
-				((ISelectionProvider) detailsPage)
-						.addSelectionChangedListener(this);
-			}
-		}
-		return detailsPage;
-	}
-
-	public Object getAdapter(Class adapter) {
-
-		if (adapter == IContentOutlinePage.class) {
-			return getOutlinePage();
-		}
-
-		return super.getAdapter(adapter);
-	}
-
-	private IContentOutlinePage getOutlinePage() {
-
-		if (contentOutlinePage == null) {
-			// The content outline is just a tree.
-			//
-			class ManagedBeanContentOutlinePage extends ContentOutlinePage {
-				public void createControl(Composite parent) {
-					super.createControl(parent);
-					TreeViewer contentOutlineViewer = getTreeViewer();
-					contentOutlineViewer.addSelectionChangedListener(this);
-
-					AdapterFactory adapterFactory = (AdapterFactory) getEditor()
-							.getAdapter(AdapterFactory.class);
-					// Set up the tree viewer.
-					contentOutlineViewer
-							.setContentProvider(new AdapterFactoryContentProvider(
-									adapterFactory));
-					contentOutlineViewer
-							.setLabelProvider(new AdapterFactoryLabelProvider(
-									adapterFactory));
-					contentOutlineViewer.addFilter(new ViewerFilter() {
-
-						public boolean select(Viewer viewer,
-								Object parentElement, Object element) {
-							return FacesConfigPackage.eINSTANCE
-									.getManagedBeanType().isInstance(element)
-									|| FacesConfigPackage.eINSTANCE
-											.getManagedPropertyType()
-											.isInstance(element);
-						}
-					});
-
-					contentOutlineViewer.setSorter(new ViewerSorter());
-					contentOutlineViewer.setInput(getInput());
-				}
-
-			}
-
-			contentOutlinePage = new ManagedBeanContentOutlinePage();
-
-			// Listen to selection so that we can handle it is a special
-			// way.
-			//
-			contentOutlinePage
-					.addSelectionChangedListener(new ISelectionChangedListener() {
-						// This ensures that we handle selections correctly.
-						public void selectionChanged(SelectionChangedEvent event) {
-							setSelection(event.getSelection());
-						}
-					});
-
-			// this.addSelectionChangedListener((ContentOutlinePage)
-			// contentOutlinePage);
-		}
-
-		return contentOutlinePage;
-
-	}
-
-	/**
-	 * handle the selection changed event from outline page.
-	 * 
-	 * @param selection
-	 */
-	public void setSelection(ISelection selection) {
-
-		if (selection instanceof IStructuredSelection) {
-			IStructuredSelection ss = (IStructuredSelection) selection;
-			ManagedBeanType bean = null;
-			if (ss.getFirstElement() instanceof ManagedBeanType) {
-				bean = (ManagedBeanType) ss.getFirstElement();
-			} else if (ss.getFirstElement() instanceof ManagedPropertyType) {
-				bean = (ManagedBeanType) ((ManagedPropertyType) ss
-						.getFirstElement()).eContainer();
-			}
-
-			if (bean != null) {
-				if (!getManagedBeanMasterSection().getSection().isExpanded()) {
-					GridData gd = new GridData(GridData.FILL_BOTH);
-					getManagedBeanMasterSection().getSection()
-							.setLayoutData(gd);
-					getManagedBeanMasterSection().getSection()
-							.setExpanded(true);
-				}
-				IStructuredSelection newselection = new StructuredSelection(
-						bean);
-				getManagedBeanMasterSection().getStructuredViewer()
-						.setSelection(newselection);
-			}
-		}
-
-	}
-
-	private ManagedBeanMasterSection getManagedBeanMasterSection() {
-		return (ManagedBeanMasterSection) getFacesConfigMasterSections()[0];
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/OthersPage.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/OthersPage.java
deleted file mode 100644
index 021e7b6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/OthersPage.java
+++ /dev/null
@@ -1,836 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.page;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.impl.AdapterImpl;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.emf.edit.domain.IEditingDomainProvider;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
-import org.eclipse.emf.edit.ui.view.ExtendedPropertySheetPage;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.jface.viewers.ViewerSorter;
-import org.eclipse.jst.jsf.facesconfig.emf.ApplicationType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType;
-import org.eclipse.jst.jsf.facesconfig.emf.FactoryType;
-import org.eclipse.jst.jsf.facesconfig.emf.LifecycleType;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.jst.jsf.facesconfig.ui.FacesConfigEditor;
-import org.eclipse.jst.jsf.facesconfig.ui.section.AbstractFacesConfigSection;
-import org.eclipse.jst.jsf.facesconfig.ui.section.ApplicationSection;
-import org.eclipse.jst.jsf.facesconfig.ui.section.FactorySection;
-import org.eclipse.jst.jsf.facesconfig.ui.section.LifecycleSection;
-import org.eclipse.jst.jsf.facesconfig.ui.section.LocaleConfigSection;
-import org.eclipse.jst.jsf.facesconfig.ui.section.OthersPageBaseSection;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.SashForm;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.editor.FormPage;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.forms.widgets.ScrolledForm;
-import org.eclipse.ui.views.contentoutline.ContentOutlinePage;
-import org.eclipse.ui.views.contentoutline.IContentOutlinePage;
-import org.eclipse.ui.views.properties.IPropertySheetPage;
-
-/**
- * @author Zhi-peng Zhang, sfshi
- * @version
- */
-
-/**
- * This class is the "Others" page.
- */
-public class OthersPage extends FormPage implements IFacesConfigPage,
-		ISelectionProvider, ISelectionChangedListener, IEditingDomainProvider {
-
-    private static final String BANNER_IMAGE_FILE = "form_banner.gif"; //$NON-NLS-1$
-
-	/**
-     * The id of this page in the faces-config editor.
-     */
-	public static final String PAGE_ID = "org.eclipse.jst.jsf.facesconfig.ui.page.OthersPage"; //$NON-NLS-1$
-
-	private final static Image BANNER_IMAGE = EditorPlugin.getDefault()
-			.getImage(BANNER_IMAGE_FILE);
-
-	private List leftSections;
-
-	private List rightSections;
-
-	private Object input;
-
-	private List selectionChangedListeners = new ArrayList();
-
-	private IPropertySheetPage propertySheetPage;
-
-	private IContentOutlinePage contentOutlinePage;
-
-	private ISelection currentSelection;
-
-	private FacesConfigOthersAdapter _facesConfigOthersAdapter;
-
-	/**
-	 * Constructor of OthersPage;
-	 * 
-	 * @param editor
-	 *            the facesconfig editor;
-	 */
-	public OthersPage(FacesConfigEditor editor) {
-		super(editor, "OthersPage", //$NON-NLS-1$
-				EditorMessages.FacesConfigEditor_Others_TabName);
-	}
-
-	protected void createFormContent(IManagedForm managedForm) {
-		super.createFormContent(managedForm);
-		ScrolledForm form = managedForm.getForm();
-		form.setText(EditorMessages.OthersPage_Title);
-		form.setBackgroundImage(BANNER_IMAGE);
-		fillBody(managedForm, managedForm.getToolkit());
-		managedForm.refresh();
-	}
-
-	private void initSection(OthersPageBaseSection section, String name,
-			String description, ArrayList list) {
-		section.getSection().setText(name);
-		section.getSection().setDescription(description);
-		section.initialize();
-		section.addSelectionChangedListener(this);
-		section.getSection().setExpanded(false);
-		section.getSection().setLayoutData(
-				new GridData(GridData.FILL_HORIZONTAL));
-		list.add(section);
-	}
-
-	public void dispose() {
-		disposeFormSections(rightSections);
-		disposeFormSections(leftSections);
-		removeAdapterFromInput(getInput());
-		getSite().setSelectionProvider(null);
-		super.dispose();
-	}
-
-	private void disposeFormSections(List sections) {
-		for (int i=0; i < sections.size();i++) {
-			OthersPageBaseSection section = (OthersPageBaseSection) sections.get(i);
-			section.removeSelectionChangedListener(this);
-			section.dispose();
-		}
-	}
-	
-	private void fillBody(IManagedForm managedForm, FormToolkit toolkit) {
-		Composite body = managedForm.getForm().getBody();
-
-		body.setLayout(new GridLayout());
-
-		SashForm sashForm = new SashForm(body, SWT.NONE);
-		managedForm.getToolkit().adapt(sashForm, false, false);
-		sashForm.setMenu(body.getMenu());
-		sashForm.setLayoutData(new GridData(GridData.FILL_BOTH));
-
-		Composite leftContainer = toolkit.createComposite(sashForm);
-		leftContainer.setLayout(new GridLayout());
-
-		ArrayList sectionList = new ArrayList();
-
-		OthersPageBaseSection section = new ApplicationSection(
-				FacesConfigPackage.eINSTANCE.getActionListenerType(),
-				leftContainer, managedForm, this, toolkit);
-		initSection(section, EditorMessages.ActionListenerSection_Name,
-				EditorMessages.ActionListenerSection_Description,
-				sectionList);
-		section.getSection().setLayoutData(new GridData(GridData.FILL_BOTH));
-		section.getSection().setExpanded(true);
-
-		section = new ApplicationSection(FacesConfigPackage.eINSTANCE
-				.getDefaultRenderKitIdType(), leftContainer, managedForm, this,
-				toolkit);
-		initSection(section,
-				EditorMessages.DefaultRenderKitIDSection_Name,
-				EditorMessages.DefaultRenderKitIDSection_Description,
-				sectionList);
-
-		section = new LocaleConfigSection(FacesConfigPackage.eINSTANCE
-				.getSupportedLocaleType(), leftContainer, managedForm, this,
-				toolkit);
-		initSection(section, EditorMessages.LocaleConfigSection_Name,
-				EditorMessages.LocaleConfigSection_Description,
-				sectionList);
-
-		section = new ApplicationSection(FacesConfigPackage.eINSTANCE
-				.getMessageBundleType(), leftContainer, managedForm, this,
-				toolkit);
-		initSection(section, EditorMessages.MessageBundleSection_Name,
-				EditorMessages.MessageBundleSection_Description,
-				sectionList);
-
-		section = new ApplicationSection(FacesConfigPackage.eINSTANCE
-				.getNavigationHandlerType(), leftContainer, managedForm, this,
-				toolkit);
-		initSection(section,
-				EditorMessages.NavigationHandlerSection_Name,
-				EditorMessages.NavigationHandlerSection_Description,
-				sectionList);
-
-		section = new ApplicationSection(FacesConfigPackage.eINSTANCE
-				.getPropertyResolverType(), leftContainer, managedForm, this,
-				toolkit);
-		initSection(section,
-				EditorMessages.PropertyResolverSection_Name,
-				EditorMessages.PropertyResolverSection_Description,
-				sectionList);
-
-		section = new ApplicationSection(FacesConfigPackage.eINSTANCE
-				.getStateManagerType(), leftContainer, managedForm, this,
-				toolkit);
-		initSection(section, EditorMessages.StateManagerSection_Name,
-				EditorMessages.StateManagerSection_Description,
-				sectionList);
-
-		section = new ApplicationSection(FacesConfigPackage.eINSTANCE
-				.getVariableResolverType(), leftContainer, managedForm, this,
-				toolkit);
-		initSection(section,
-				EditorMessages.VariableResolverSection_Name,
-				EditorMessages.VariableResolverSection_Description,
-				sectionList);
-
-		section = new ApplicationSection(FacesConfigPackage.eINSTANCE
-				.getViewHandlerType(), leftContainer, managedForm, this,
-				toolkit);
-		initSection(section, EditorMessages.ViewHandlerSection_Name,
-				EditorMessages.ViewHandlerSection_Description,
-				sectionList);
-
-		leftSections = sectionList;
-
-		sectionList = new ArrayList();
-
-		Composite rightContainer = toolkit.createComposite(sashForm);
-		rightContainer.setLayout(new GridLayout());
-		rightContainer.setLayoutData(new GridData(GridData.FILL_BOTH));
-
-		section = new FactorySection(FacesConfigPackage.eINSTANCE
-				.getApplicationFactoryType(), rightContainer, managedForm,
-				this, toolkit);
-		initSection(section,
-				EditorMessages.ApplicationFactorySection_Name,
-				EditorMessages.ApplicationFactorySection_Description,
-				sectionList);
-		section.getSection().setLayoutData(new GridData(GridData.FILL_BOTH));
-		section.getSection().setExpanded(true);
-
-		section = new FactorySection(FacesConfigPackage.eINSTANCE
-				.getFacesContextFactoryType(), rightContainer, managedForm,
-				this, toolkit);
-		initSection(section,
-				EditorMessages.FacesContextFactorySection_Name,
-				EditorMessages.FacesContextFactorySection_Description,
-				sectionList);
-
-		section = new FactorySection(FacesConfigPackage.eINSTANCE
-				.getLifecycleFactoryType(), rightContainer, managedForm, this,
-				toolkit);
-		initSection(section,
-				EditorMessages.LifecycleFactorySection_Name,
-				EditorMessages.LifecycleFactorySection_Description,
-				sectionList);
-
-		section = new FactorySection(FacesConfigPackage.eINSTANCE
-				.getRenderKitFactoryType(), rightContainer, managedForm, this,
-				toolkit);
-		initSection(section,
-				EditorMessages.RenderKitFactorySection_Name,
-				EditorMessages.RenderKitFactorySection_Description,
-				sectionList);
-
-		section = new LifecycleSection(FacesConfigPackage.eINSTANCE
-				.getPhaseListenerType(), rightContainer, managedForm, this,
-				toolkit);
-		initSection(section, EditorMessages.PhaseListenerSection_Name,
-				EditorMessages.PhaseListenerSection_Description,
-				sectionList);
-
-		rightSections = sectionList;
-
-		getSite().setSelectionProvider(this);
-	}
-
-	/**
-	 * set input for this page when the it got activated at the first time; if
-	 * it's not the first time, then refresh the page.
-	 * 
-	 * @see org.eclipse.ui.forms.editor.FormPage#setActive(boolean)
-	 */
-	public void setActive(boolean active) {
-		super.setActive(active);
-		if (active) {
-			if (getInput() != ((FacesConfigEditor) getEditor())
-					.getFacesConfig()) {
-				setInput(((FacesConfigEditor) getEditor()).getFacesConfig());
-			} else {
-				this.refresh();
-			}
-		}
-	}
-
-	/**
-	 * 
-	 */
-	public void setInput(Object input) {
-		if (input instanceof FacesConfigType) {
-			this.input = input;
-			FacesConfigType facesConfig = (FacesConfigType) input;
-			facesConfig.eAdapters().add(getFacesConfigAdapter());
-			setInputForApplicationSections(facesConfig);
-			setInputForFactorySections(facesConfig);
-			setInputForLifecycleSections(facesConfig);
-		}
-	}
-
-	private void removeAdapterFromInput(Object input_) {
-		if (_facesConfigOthersAdapter != null && input_ != null && input_ instanceof FacesConfigType) {
-			((FacesConfigType)input_).eAdapters().remove(_facesConfigOthersAdapter);
-		}
-	}
-	
-	private Adapter getFacesConfigAdapter() {
-		if (_facesConfigOthersAdapter == null) {
-			_facesConfigOthersAdapter = new FacesConfigOthersAdapter();
-		}
-		return _facesConfigOthersAdapter;
-	}
-
-	public boolean isEditor() {
-		return true;
-	}
-
-	/**
-	 * Reset the editor input for the application section
-	 */
-	public void resetApplicationInput() {
-		if (getInput() instanceof FacesConfigType) {
-			setInputForApplicationSections((FacesConfigType) getInput());
-		}
-	}
-
-	/**
-	 * Reset the editor input for the factory sections
-	 */
-	public void resetFactoryInput() {
-		if (getInput() instanceof FacesConfigType) {
-			setInputForFactorySections((FacesConfigType) getInput());
-		}
-	}
-
-	/**
-	 * Reset the editor input for the lifecycle section
-	 */
-	public void resetLifecycleInput() {
-		if (getInput() instanceof FacesConfigType) {
-			setInputForLifecycleSections((FacesConfigType) getInput());
-		}
-	}
-
-	/**
-	 * Sets the model for all Application sub-model elements to facesConfig
-	 * @param facesConfig
-	 */
-	protected void setInputForApplicationSections(FacesConfigType facesConfig) {
-		ApplicationType application;
-		if (facesConfig.getApplication().size() > 0) {
-			application = (ApplicationType) facesConfig.getApplication().get(0);
-		} else {
-			application = null;
-		}
-		for (Iterator it = leftSections.iterator(); it.hasNext();) {
-			ApplicationSection section = (ApplicationSection) it.next();
-			section.setInput(application);
-		}
-	}
-
-	/**
-	 * Sets the model for all Factory  sub-model elements to facesConfig
-	 * @param facesConfig
-	 */
-	protected void setInputForFactorySections(FacesConfigType facesConfig) {
-		FactoryType factory;
-		if (facesConfig.getFactory().size() > 0) {
-			factory = (FactoryType) facesConfig.getFactory().get(0);
-		} else {
-			factory = null;
-		}
-
-		for (Iterator it = rightSections.iterator(); it.hasNext();) {
-			Object section = it.next();
-			if (section instanceof FactorySection)
-				((FactorySection) section).setInput(factory);
-		}
-	}
-
-	/**
-	 * Sets the model for all Lifecycle sub-model elements to facesConfig
-	 * @param facesConfig
-	 */
-	protected void setInputForLifecycleSections(FacesConfigType facesConfig) {
-		LifecycleType lifecycle;
-		if (facesConfig.getLifecycle().size() > 0) {
-			lifecycle = (LifecycleType) facesConfig.getLifecycle().get(0);
-
-		} else {
-			lifecycle = null;
-		}
-		for (Iterator it = rightSections.iterator(); it.hasNext();) {
-			Object section = it.next();
-			if (section instanceof LifecycleSection)
-				((LifecycleSection) section).setInput(lifecycle);
-		}
-	}
-
-	public Object getInput() {
-		return input;
-	}
-
-	public void refresh() {
-
-		// only refresh the expanded section;
-		for (int i = 0, n = leftSections.size(); i < n; i++) {
-			OthersPageBaseSection section = (OthersPageBaseSection) leftSections
-					.get(i);
-			if (section.getSection().isExpanded()) {
-				section.refresh();
-			}
-		}
-
-		for (int i = 0, n = rightSections.size(); i < n; i++) {
-			OthersPageBaseSection section = (OthersPageBaseSection) leftSections
-					.get(i);
-			if (section.getSection().isExpanded()) {
-				section.refresh();
-			}
-		}
-
-	}
-
-	/**
-	 * set other sections' expand state to false, except this section;
-	 * 
-	 * @param section
-	 *            the section that be expanded.
-	 */
-	public void closeOtherSections(AbstractFacesConfigSection section) {
-		OthersPageBaseSection[] sections;
-		if (leftSections.contains(section)) {
-			sections = (OthersPageBaseSection[]) leftSections
-					.toArray(new OthersPageBaseSection[leftSections.size()]);
-		} else {
-			sections = (OthersPageBaseSection[]) rightSections
-					.toArray(new OthersPageBaseSection[rightSections.size()]);
-		}
-		for (int i = 0, n = sections.length; i < n; i++) {
-			AbstractFacesConfigSection aSection = sections[i];
-			if (aSection != section && aSection.getSection().isExpanded()) {
-				aSection.getSection().setExpanded(false);
-				GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-				aSection.getSection().setLayoutData(gd);
-			}
-		}
-	}
-
-	/**
-	 * An adapter on faces config.
-	 * 
-	 * @author sfshi
-	 * 
-	 */
-	class FacesConfigOthersAdapter extends AdapterImpl {
-		public void notifyChanged(Notification msg) {
-			if (msg.getEventType() == Notification.REMOVE
-					|| msg.getEventType() == Notification.ADD) {
-				if (msg.getFeature() == FacesConfigPackage.eINSTANCE
-						.getFacesConfigType_Application()) {
-					if (Thread.currentThread() == PlatformUI.getWorkbench().getDisplay().getThread()) {
-						resetApplicationInput();
-					} else {
-						PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
-							public void run() {
-								resetApplicationInput();
-							}
-						});
-					}
-				} else if (msg.getFeature() == FacesConfigPackage.eINSTANCE
-						.getFacesConfigType_Factory()) {
-					if (Thread.currentThread() == PlatformUI.getWorkbench().getDisplay().getThread()) {
-						resetFactoryInput();
-					} else {
-						PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
-							public void run() {
-								resetFactoryInput();
-							}
-						});	
-					}
-				} else if (msg.getFeature() == FacesConfigPackage.eINSTANCE
-						.getFacesConfigType_Lifecycle()) {
-					if (Thread.currentThread() == PlatformUI.getWorkbench().getDisplay().getThread()) {
-						resetLifecycleInput();
-					} else {
-						PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
-							public void run() {
-								resetLifecycleInput();
-							}
-						});	
-					}
-				}
-			}
-		}
-	}
-
-	public void addSelectionChangedListener(ISelectionChangedListener listener) {
-		// TODO Auto-generated method stub
-
-		selectionChangedListeners.add(listener);
-	}
-
-	public ISelection getSelection() {
-		if (currentSelection != null)
-			return currentSelection;
-
-		return StructuredSelection.EMPTY;
-	}
-
-	public void removeSelectionChangedListener(
-			ISelectionChangedListener listener) {
-		// TODO Auto-generated method stub
-
-		selectionChangedListeners.remove(listener);
-	}
-
-	public void selectionChanged(SelectionChangedEvent event) {
-		currentSelection = event.getSelection();
-		if (event.getSource() instanceof OthersPageBaseSection) {
-			OthersPageBaseSection source = (OthersPageBaseSection) event
-					.getSource();
-
-			if (source.getSection().isExpanded()) {
-				for (int i = 0, n = selectionChangedListeners.size(); i < n; i++) {
-					((ISelectionChangedListener) selectionChangedListeners
-							.get(i)).selectionChanged(event);
-				}
-			}
-		}
-	}
-
-	/**
-	 * get the section that is expanded.
-	 * 
-	 * @return the page section
-	 */
-	protected OthersPageBaseSection getActiveSection() {
-		for (int i = 0, n = leftSections.size(); i < n; i++) {
-
-			OthersPageBaseSection section = (OthersPageBaseSection) leftSections
-					.get(i);
-			if (section.getSection().isExpanded()) {
-				return section;
-			}
-		}
-
-		for (int i = 0, n = rightSections.size(); i < n; i++) {
-
-			OthersPageBaseSection section = (OthersPageBaseSection) leftSections
-					.get(i);
-			if (section.getSection().isExpanded()) {
-				return section;
-			}
-		}
-		return null;
-
-	}
-
-	public Object getAdapter(Class adapter) {
-
-		if (adapter == IPropertySheetPage.class) {
-			return getPropertySheetPage();
-		}
-
-		if (adapter == IContentOutlinePage.class) {
-			return getOutlinePage();
-		}
-
-		return super.getAdapter(adapter);
-	}
-
-	private IPropertySheetPage getPropertySheetPage() {
-
-		AdapterFactoryEditingDomain editingDomain = (AdapterFactoryEditingDomain) getEditor()
-				.getAdapter(EditingDomain.class);
-		AdapterFactory adapterFactory = (AdapterFactory) getEditor()
-				.getAdapter(AdapterFactory.class);
-		if (propertySheetPage == null) {
-			propertySheetPage = new ExtendedPropertySheetPage(editingDomain) {
-				public void setSelectionToViewer(List selection) {
-					// FacesConfigEditor.this.setSelectionToViewer(selection);
-					// FacesConfigEditor.this.setFocus();
-				}
-
-				public void setActionBars(IActionBars actionBars) {
-					super.setActionBars(actionBars);
-					// getActionBarContributor().shareGlobalActions(this,
-					// actionBars);
-				}
-			};
-			((ExtendedPropertySheetPage) propertySheetPage)
-					.setPropertySourceProvider(new AdapterFactoryContentProvider(
-							adapterFactory));
-			// this.addSelectionChangedListener((ExtendedPropertySheetPage)
-			// propertySheetPage);
-		}
-
-		return propertySheetPage;
-
-	}
-
-	private IContentOutlinePage getOutlinePage() {
-
-		if (contentOutlinePage == null) {
-			// The content outline is just a tree.
-			//
-			class OthersContentOutlinePage extends ContentOutlinePage {
-				public void createControl(Composite parent) {
-					super.createControl(parent);
-					TreeViewer contentOutlineViewer = getTreeViewer();
-					contentOutlineViewer.addSelectionChangedListener(this);
-
-					AdapterFactory adapterFactory = (AdapterFactory) getEditor()
-							.getAdapter(AdapterFactory.class);
-					// Set up the tree viewer.
-					contentOutlineViewer
-							.setContentProvider(new AdapterFactoryContentProvider(
-									adapterFactory));
-					contentOutlineViewer
-							.setLabelProvider(new AdapterFactoryLabelProvider(
-									adapterFactory));
-					contentOutlineViewer.addFilter(new ViewerFilter() {
-
-						public boolean select(Viewer viewer,
-								Object parentElement, Object element) {
-							return FacesConfigPackage.eINSTANCE
-									.getApplicationType().isInstance(element)
-									|| FacesConfigPackage.eINSTANCE
-											.getFactoryType().isInstance(
-													element)
-									|| FacesConfigPackage.eINSTANCE
-											.getLifecycleType().isInstance(
-													element)
-									|| FacesConfigPackage.eINSTANCE
-											.getActionListenerType()
-											.isInstance(element)
-									|| FacesConfigPackage.eINSTANCE
-											.getDefaultRenderKitIdType()
-											.isInstance(element)
-									|| FacesConfigPackage.eINSTANCE
-											.getLocaleConfigType().isInstance(
-													element)
-									|| FacesConfigPackage.eINSTANCE
-											.getDefaultLocaleType().isInstance(
-													element)
-									|| FacesConfigPackage.eINSTANCE
-											.getSupportedLocaleType()
-											.isInstance(element)
-									|| FacesConfigPackage.eINSTANCE
-											.getMessageBundleType().isInstance(
-													element)
-									|| FacesConfigPackage.eINSTANCE
-											.getNavigationHandlerType()
-											.isInstance(element)
-									|| FacesConfigPackage.eINSTANCE
-											.getPropertyResolverType()
-											.isInstance(element)
-									|| FacesConfigPackage.eINSTANCE
-											.getStateManagerType().isInstance(
-													element)
-									|| FacesConfigPackage.eINSTANCE
-											.getVariableResolverType()
-											.isInstance(element)
-									|| FacesConfigPackage.eINSTANCE
-											.getViewHandlerType().isInstance(
-													element)
-									|| FacesConfigPackage.eINSTANCE
-											.getApplicationFactoryType()
-											.isInstance(element)
-									|| FacesConfigPackage.eINSTANCE
-											.getFacesContextFactoryType()
-											.isInstance(element)
-									|| FacesConfigPackage.eINSTANCE
-											.getLifecycleFactoryType()
-											.isInstance(element)
-									|| FacesConfigPackage.eINSTANCE
-											.getRenderKitFactoryType()
-											.isInstance(element)
-									|| FacesConfigPackage.eINSTANCE
-											.getPhaseListenerType().isInstance(
-													element)
-
-							;
-						}
-					});
-
-					contentOutlineViewer.setSorter(new ViewerSorter());
-					contentOutlineViewer.setInput(getInput());
-				}
-
-			}
-
-			contentOutlinePage = new OthersContentOutlinePage();
-
-			// Listen to selection so that we can handle it is a special
-			// way.
-			//
-			contentOutlinePage
-					.addSelectionChangedListener(new ISelectionChangedListener() {
-						// This ensures that we handle selections correctly.
-						public void selectionChanged(SelectionChangedEvent event) {
-							setSelection(event.getSelection());
-						}
-					});
-
-		}
-
-		return contentOutlinePage;
-
-	}
-
-	/**
-	 * handle the selection changed event from outline page.
-	 * 
-	 * @param selection
-	 */
-	public void setSelection(ISelection selection) {
-
-		if (selection instanceof IStructuredSelection) {
-			IStructuredSelection ss = (IStructuredSelection) selection;
-			if (ss.isEmpty())
-				return;
-
-			final EObject object = (EObject) ss.getFirstElement();
-			OthersPageBaseSection section = null;
-
-			if (FacesConfigPackage.eINSTANCE.getActionListenerType()
-					.isInstance(object)) {
-				section = (OthersPageBaseSection) leftSections.get(0);
-			} else if (FacesConfigPackage.eINSTANCE.getDefaultRenderKitIdType()
-					.isInstance(object)) {
-				section = (OthersPageBaseSection) leftSections.get(1);
-			} else if (FacesConfigPackage.eINSTANCE.getLocaleConfigType()
-					.isInstance(object)) {
-				section = (OthersPageBaseSection) leftSections.get(2);
-			} else if (FacesConfigPackage.eINSTANCE.getDefaultLocaleType()
-					.isInstance(object)) {
-				section = (OthersPageBaseSection) leftSections.get(2);
-			} else if (FacesConfigPackage.eINSTANCE.getSupportedLocaleType()
-					.isInstance(object)) {
-				section = (OthersPageBaseSection) leftSections.get(2);
-			} else if (FacesConfigPackage.eINSTANCE.getMessageBundleType()
-					.isInstance(object)) {
-				section = (OthersPageBaseSection) leftSections.get(3);
-			} else if (FacesConfigPackage.eINSTANCE.getNavigationHandlerType()
-					.isInstance(object)) {
-				section = (OthersPageBaseSection) leftSections.get(4);
-			} else if (FacesConfigPackage.eINSTANCE.getPropertyResolverType()
-					.isInstance(object)) {
-				section = (OthersPageBaseSection) leftSections.get(5);
-			} else if (FacesConfigPackage.eINSTANCE.getStateManagerType()
-					.isInstance(object)) {
-				section = (OthersPageBaseSection) leftSections.get(6);
-			} else if (FacesConfigPackage.eINSTANCE.getVariableResolverType()
-					.isInstance(object)) {
-				section = (OthersPageBaseSection) leftSections.get(7);
-			} else if (FacesConfigPackage.eINSTANCE.getViewHandlerType()
-					.isInstance(object)) {
-				section = (OthersPageBaseSection) leftSections.get(8);
-			} else if (FacesConfigPackage.eINSTANCE.getApplicationFactoryType()
-					.isInstance(object)) {
-				section = (OthersPageBaseSection) rightSections.get(0);
-			} else if (FacesConfigPackage.eINSTANCE
-					.getFacesContextFactoryType().isInstance(object)) {
-				section = (OthersPageBaseSection) rightSections.get(1);
-			} else if (FacesConfigPackage.eINSTANCE.getLifecycleFactoryType()
-					.isInstance(object)) {
-				section = (OthersPageBaseSection) rightSections.get(2);
-			} else if (FacesConfigPackage.eINSTANCE.getRenderKitFactoryType()
-					.isInstance(object)) {
-				section = (OthersPageBaseSection) rightSections.get(3);
-			} else if (FacesConfigPackage.eINSTANCE.getPhaseListenerType()
-					.isInstance(object)) {
-				section = (OthersPageBaseSection) rightSections.get(4);
-			}
-			if (section != null) {
-				if ((Thread.currentThread() == PlatformUI.getWorkbench().getDisplay().getThread())) {
-					 setSelectionInSection(section, object);
-				} 
-				else {
-					final OthersPageBaseSection baseSection = section;
-					PlatformUI.getWorkbench().getDisplay().syncExec(new Runnable() {
-						public void run() {
-							setSelectionInSection(baseSection, object);							
-						}
-					});
-				 }
-			}
-		}
-	}
-
-	private void setSelectionInSection(final OthersPageBaseSection section, final Object object) {
-		if (!section.getSection().isExpanded()) {
-			this.closeOtherSections(section);
-			GridData gd = new GridData(GridData.FILL_BOTH);
-			section.getSection().setLayoutData(gd);
-			section.getSection().setExpanded(true);
-		}
-		IStructuredSelection newselection = new StructuredSelection(
-				object);
-		section.getTableViewer().setSelection(newselection);
-	}
-	
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.domain.IEditingDomainProvider#getEditingDomain()
-	 */
-	public EditingDomain getEditingDomain() {
-		return ((FacesConfigEditor) getEditor()).getEditingDomain();
-	}
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/OverviewPage.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/OverviewPage.java
deleted file mode 100644
index 808a89f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/OverviewPage.java
+++ /dev/null
@@ -1,248 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.page;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.jst.jsf.facesconfig.ui.FacesConfigEditor;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.section.OverviewComponentsSection;
-import org.eclipse.jst.jsf.facesconfig.ui.section.OverviewGeneralSection;
-import org.eclipse.jst.jsf.facesconfig.ui.section.OverviewManagedBeanSection;
-import org.eclipse.jst.jsf.facesconfig.ui.section.OverviewNavigationSection;
-import org.eclipse.jst.jsf.facesconfig.ui.section.OverviewOthersSection;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.editor.FormEditor;
-import org.eclipse.ui.forms.editor.FormPage;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.forms.widgets.ScrolledForm;
-
-/**
- * @author jchoi, Xiao-guang Zhang
- * @version
- */
-public class OverviewPage extends FormPage implements ISelectionProvider,
-		IFacesConfigPage {
-
-
-    /**
-     * The id of this page in the faces-config editor.
-     */
-	public static final String PAGE_ID = "org.eclipse.jst.jsf.facesconfig.ui.page.OverviewPage"; //$NON-NLS-1$
-	
-	private static final int LAYOUT_MARGIN_HEIGHT = 2;
-
-	private static final int LAYOUT_MARGIN_WIDTH = 2;
-
-	private Object input;
-
-	private OverviewGeneralSection generalSection;
-
-	private OverviewManagedBeanSection beanSection;
-
-	private OverviewComponentsSection componentsSection;
-
-	//
-	private OverviewNavigationSection navigationSection;
-
-	//
-	private OverviewOthersSection otherSection;
-
-	/**
-	 * 
-	 * @param editor
-	 */
-	public OverviewPage(FormEditor editor) {
-		super(editor, "OverviewPage", EditorMessages.OverviewPage_page_name); //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.forms.editor.FormPage#createFormContent(org.eclipse.ui.forms.IManagedForm)
-	 */
-	protected void createFormContent(IManagedForm managedForm) {
-
-		ScrolledForm form = managedForm.getForm();
-		form.setText(EditorMessages.OverviewPage_PageflowOverview_summary);
-		form.setBackgroundImage(EditorPlugin.getDefault().getImage(
-				"form_banner.gif")); //$NON-NLS-1$
-		Composite body = form.getBody();
-		GridLayout gridLayout = new GridLayout();
-		gridLayout.marginWidth = LAYOUT_MARGIN_WIDTH;
-		gridLayout.marginHeight = LAYOUT_MARGIN_HEIGHT;
-		body.setLayout(gridLayout);
-		gridLayout = new GridLayout(2, true);
-		form.getBody().setLayout(gridLayout);
-		FormEditor editor = getEditor();
-		FormToolkit toolkit = editor.getToolkit();
-
-		// add overview general information
-		generalSection = new OverviewGeneralSection(managedForm.getForm()
-				.getBody(), managedForm, this, toolkit);
-		generalSection.initialize();
-		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-		gd.horizontalSpan = 2;
-		generalSection.getSection().setLayoutData(gd);
-
-		// Navigation section
-		navigationSection = new OverviewNavigationSection(managedForm.getForm()
-				.getBody(), managedForm, this, toolkit);
-		navigationSection.initialize();
-		gd = new GridData(GridData.FILL_BOTH);
-		navigationSection.getSection().setLayoutData(gd);
-		navigationSection.getSection().setExpanded(true);
-
-		// ManagedBeans section
-		beanSection = new OverviewManagedBeanSection(managedForm.getForm()
-				.getBody(), managedForm, this, toolkit);
-		beanSection.initialize();
-		gd = new GridData(GridData.FILL_BOTH);
-		beanSection.getSection().setLayoutData(gd);
-		beanSection.getSection().setExpanded(true);
-
-		/* components section */
-		componentsSection = new OverviewComponentsSection(managedForm.getForm()
-				.getBody(), managedForm, this, toolkit);
-		componentsSection.initialize();
-		gd = new GridData(GridData.FILL_BOTH);
-		componentsSection.getSection().setLayoutData(gd);
-		componentsSection.getSection().setExpanded(true);
-
-		/* other sections */
-		otherSection = new OverviewOthersSection(managedForm.getForm()
-				.getBody(), managedForm, this, toolkit);
-		otherSection.initialize();
-		gd = new GridData(GridData.FILL_BOTH);
-		otherSection.getSection().setLayoutData(gd);
-		otherSection.getSection().setExpanded(true);
-
-		this.getSite().setSelectionProvider(this);
-
-	}
-
-	/**
-	 * set input for this page when the it got activated at the first time; if
-	 * it's not the first time, then refresh the page.
-	 * 
-	 * @see org.eclipse.ui.forms.editor.FormPage#setActive(boolean)
-	 */
-	public void setActive(boolean active) {
-		super.setActive(active);
-		if (active) {
-			if (getInput() != ((FacesConfigEditor) getEditor())
-					.getFacesConfig()) {
-				setInput(((FacesConfigEditor) getEditor()).getFacesConfig());
-			} else {
-				this.refresh();
-			}
-		}
-	}
-
-	/**
-	 * 
-	 */
-	public void setInput(Object input) {
-		if (input instanceof FacesConfigType) {
-			this.input = input;
-			navigationSection.setInput(input);
-			beanSection.setInput(input);
-			componentsSection.setInput(input);
-			otherSection.setInput(input);
-		}
-	}
-
-	/**
-	 * Call refreshAll on all sections on this page
-	 */
-	public void refreshAll() {
-		generalSection.refreshAll();
-		navigationSection.refreshAll();
-		beanSection.refreshAll();
-		componentsSection.refreshAll();
-		otherSection.refreshAll();
-	}
-
-	public Object getInput() {
-		return input;
-	}
-
-	public void refresh() {
-		generalSection.refresh();
-		navigationSection.refresh();
-		beanSection.refresh();
-		componentsSection.refresh();
-		otherSection.refresh();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.forms.editor.IFormPage#isEditor()
-	 */
-	public boolean isEditor() {
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#addSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
-	 */
-	public void addSelectionChangedListener(ISelectionChangedListener listener) {
-        // do not support change in selection
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#getSelection()
-	 */
-	public ISelection getSelection() {
-		return StructuredSelection.EMPTY;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#removeSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
-	 */
-	public void removeSelectionChangedListener(
-			ISelectionChangedListener listener) {
-        // do not support change in selection
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#setSelection(org.eclipse.jface.viewers.ISelection)
-	 */
-	public void setSelection(ISelection selection) {
-	    // do not support change in selection
-	}
-	
-	public void dispose() {
-		beanSection.dispose();
-		componentsSection.dispose();
-		generalSection.dispose();
-		navigationSection.dispose();
-		otherSection.dispose();
-		super.dispose();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/WaitForLoadPage.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/WaitForLoadPage.java
deleted file mode 100644
index 1b20160..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/WaitForLoadPage.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.page;
-
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.editor.FormEditor;
-import org.eclipse.ui.forms.editor.FormPage;
-import org.eclipse.ui.forms.widgets.ScrolledForm;
-
-/**
- * A page the exists only be used before the editor's model is fully loaded
- * as a status placeholder while the user waits.
- * 
- * @author cbateman
- *
- */
-public class WaitForLoadPage extends FormPage 
-{
-
-    /**
-     * @param editor the parent
-     * @param id  the id of the editor within its parent
-     * @param title the title displayed to the user on the editor's tab
-     */
-    public WaitForLoadPage(FormEditor editor, String id, String title) {
-        super(editor, id, title);
-    }
-
-    @Override
-    protected void createFormContent(IManagedForm managedForm) {
-        // get the form
-        ScrolledForm form = managedForm.getForm();
-        //FormToolkit toolkit = getEditor().getToolkit();
-        form.setText(EditorMessages.FacesConfigEditor_WaitForLoadPage_Title);
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/detail/ComponentDetailsPage.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/detail/ComponentDetailsPage.java
deleted file mode 100644
index 9a882d5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/detail/ComponentDetailsPage.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.page.detail;
-
-import org.eclipse.jst.jsf.facesconfig.ui.page.FacesConfigMasterDetailPage;
-import org.eclipse.jst.jsf.facesconfig.ui.section.AttributeSection;
-import org.eclipse.jst.jsf.facesconfig.ui.section.ComponentGeneralSection;
-import org.eclipse.jst.jsf.facesconfig.ui.section.FacetSection;
-import org.eclipse.jst.jsf.facesconfig.ui.section.IFacesConfigSection;
-import org.eclipse.jst.jsf.facesconfig.ui.section.PropertySection;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * 
- * @author sfshi
- * 
- */
-public class ComponentDetailsPage extends FacesConfigDetailsPage {
-
-	/**
-	 * 
-	 * @param page
-	 */
-	public ComponentDetailsPage(FacesConfigMasterDetailPage page) {
-		super(page);
-	}
-
-	/**
-	 * create the detail sections and set layout for them.
-	 */
-	protected IFacesConfigSection[] createDetailSections(Composite composite,
-			IManagedForm managedForm, FormToolkit toolkit, FacesConfigMasterDetailPage page) {
-		ComponentGeneralSection generalSection = new ComponentGeneralSection(
-				composite, managedForm, getPage(), toolkit);
-		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-		generalSection.getSection().setLayoutData(gd);
-
-		AttributeSection attributeSection = new AttributeSection(composite,
-				managedForm, getPage(), toolkit);
-		gd = new GridData(GridData.FILL_HORIZONTAL);
-		attributeSection.getSection().setLayoutData(gd);
-
-		FacetSection facetSection = new FacetSection(composite, managedForm,
-				getPage(), toolkit);
-		gd = new GridData(GridData.FILL_HORIZONTAL);
-		facetSection.getSection().setLayoutData(gd);
-
-		PropertySection propertySection = new PropertySection(composite,
-				managedForm, getPage(), toolkit);
-		gd = new GridData(GridData.FILL_BOTH);
-		propertySection.getSection().setLayoutData(gd);
-		return new IFacesConfigSection[] { generalSection, attributeSection, facetSection,
-				propertySection };
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/detail/ConverterDetailsPage.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/detail/ConverterDetailsPage.java
deleted file mode 100644
index 0e720f4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/detail/ConverterDetailsPage.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.page.detail;
-
-import org.eclipse.jst.jsf.facesconfig.ui.page.FacesConfigMasterDetailPage;
-import org.eclipse.jst.jsf.facesconfig.ui.section.AttributeSection;
-import org.eclipse.jst.jsf.facesconfig.ui.section.ConverterGeneralSection;
-import org.eclipse.jst.jsf.facesconfig.ui.section.IFacesConfigSection;
-import org.eclipse.jst.jsf.facesconfig.ui.section.PropertySection;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * @author Bryan Yang
- *
- */
-public class ConverterDetailsPage extends FacesConfigDetailsPage {
-
-	/**
-	 * 
-	 * @param page
-	 */
-	public ConverterDetailsPage(FacesConfigMasterDetailPage page) {
-		super(page);
-	}
-
-	/**
-	 * create the detail sections and set layout for them.
-	 */
-	protected IFacesConfigSection[] createDetailSections(Composite composite,
-			IManagedForm managedForm, FormToolkit toolkit, FacesConfigMasterDetailPage page) {
-		ConverterGeneralSection generalSection = new ConverterGeneralSection(
-				composite, managedForm, getPage(), toolkit);
-		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-		generalSection.getSection().setLayoutData(gd);
-
-		AttributeSection attributeSection = new AttributeSection(composite,
-				managedForm, getPage(), toolkit);
-		gd = new GridData(GridData.FILL_HORIZONTAL);
-		attributeSection.getSection().setLayoutData(gd);
-
-
-		PropertySection propertySection = new PropertySection(composite,
-				managedForm, getPage(), toolkit);
-		gd = new GridData(GridData.FILL_BOTH);
-		propertySection.getSection().setLayoutData(gd);
-		return new IFacesConfigSection[] { generalSection, attributeSection,
-				propertySection };
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/detail/FacesConfigDetailsPage.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/detail/FacesConfigDetailsPage.java
deleted file mode 100644
index eec368a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/detail/FacesConfigDetailsPage.java
+++ /dev/null
@@ -1,185 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.page.detail;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jst.jsf.facesconfig.ui.page.FacesConfigMasterDetailPage;
-import org.eclipse.jst.jsf.facesconfig.ui.section.IFacesConfigSection;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.forms.AbstractFormPart;
-import org.eclipse.ui.forms.IDetailsPage;
-import org.eclipse.ui.forms.IFormPart;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * The detail part of a page. It contains several IFacesConfigSection instances.
- * 
- * @author sfshi
- * 
- */
-public abstract class FacesConfigDetailsPage extends AbstractFormPart implements
-		IDetailsPage, ISelectionProvider, ISelectionChangedListener {
-
-	private FacesConfigMasterDetailPage page;
-
-	private IFacesConfigSection[] detailSections;
-
-	private List selectionChangedListeners = new ArrayList();
-
-	/**
-	 * @param page
-	 */
-	public FacesConfigDetailsPage(FacesConfigMasterDetailPage page) {
-		super();
-		this.page = page;
-	}
-
-	public void createContents(Composite parent) {
-		GridLayout layout = new GridLayout();
-		layout.marginWidth = 0;
-		layout.marginHeight = 0;
-		parent.setLayout(layout);
-
-		parent.setLayoutData(new GridData(GridData.FILL_BOTH));
-
-		FormToolkit toolkit = getManagedForm().getToolkit();
-		Composite detailsContainer = toolkit.createComposite(parent);
-		toolkit.paintBordersFor(detailsContainer);
-		detailsContainer.setLayoutData(new GridData(GridData.FILL_BOTH));
-
-		GridLayout gl = new GridLayout();
-		gl.verticalSpacing = 0;
-		gl.marginHeight = 0;
-		detailsContainer.setLayout(gl);
-
-		detailSections = createDetailSections(detailsContainer,
-				getManagedForm(), toolkit, page);
-		if (detailSections != null) {
-			for (int i = 0, n = detailSections.length; i < n; i++) {
-				detailSections[i].initialize();
-				if (detailSections[i] instanceof ISelectionProvider) {
-					((ISelectionProvider) detailSections[i])
-							.addSelectionChangedListener(this);
-				}
-			}
-		}
-	}
-
-	/**
-	 * create the sub detail sections and set layout data for them.
-	 * 
-	 * @param composite
-	 * @param managedForm
-	 * @param toolkit
-	 * @param page_ 
-	 * @return the detail sections
-	 */
-	abstract protected IFacesConfigSection[] createDetailSections(
-			Composite composite, IManagedForm managedForm, FormToolkit toolkit,
-			FacesConfigMasterDetailPage page_);
-
-	/**
-	 * 
-	 */
-	public void selectionChanged(IFormPart part, ISelection selection) {
-		Object selectedItem = ((StructuredSelection) selection)
-				.getFirstElement();
-		if (detailSections != null) {
-			for (int i = 0, n = detailSections.length; i < n; i++) {
-				IFacesConfigSection aSection = detailSections[i];
-				aSection.setInput(selectedItem);
-			}
-		}
-
-	}
-
-	/**
-	 * @return the master/detail page for this page
-	 */
-	public FacesConfigMasterDetailPage getPage() {
-		return page;
-	}
-
-	public void refresh() {
-		super.refresh();
-		if (detailSections != null) {
-			for (int i = 0, n = detailSections.length; i < n; i++) {
-				detailSections[i].refresh();
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
-	 */
-	public void selectionChanged(SelectionChangedEvent event) {
-		for (Iterator listeners = selectionChangedListeners.iterator(); listeners
-				.hasNext();) {
-			ISelectionChangedListener listener = (ISelectionChangedListener) listeners
-					.next();
-			listener.selectionChanged(new SelectionChangedEvent(this, event
-					.getSelection()));
-		}
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#addSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
-	 */
-	public void addSelectionChangedListener(ISelectionChangedListener listener) {
-		selectionChangedListeners.add(listener);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#getSelection()
-	 */
-	public ISelection getSelection() {
-		return StructuredSelection.EMPTY;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#removeSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
-	 */
-	public void removeSelectionChangedListener(
-			ISelectionChangedListener listener) {
-		selectionChangedListeners.remove(listener);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#setSelection(org.eclipse.jface.viewers.ISelection)
-	 */
-	public void setSelection(ISelection selection) {
-	    // no selection allowed
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/detail/ManagedBeanDetailsPage.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/detail/ManagedBeanDetailsPage.java
deleted file mode 100644
index 9ee1641..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/detail/ManagedBeanDetailsPage.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.page.detail;
-
-import org.eclipse.jst.jsf.facesconfig.ui.page.FacesConfigMasterDetailPage;
-import org.eclipse.jst.jsf.facesconfig.ui.section.IFacesConfigSection;
-import org.eclipse.jst.jsf.facesconfig.ui.section.InitializationSection;
-import org.eclipse.jst.jsf.facesconfig.ui.section.ManagedBeanGeneralSection;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * 
- * @author sfshi
- * 
- */
-public class ManagedBeanDetailsPage extends FacesConfigDetailsPage {
-
-	/**
-	 * 
-	 * @param page
-	 */
-	public ManagedBeanDetailsPage(FacesConfigMasterDetailPage page) {
-		super(page);
-	}
-
-	/**
-	 * create the detail sections and set layout for them.
-	 */
-	protected IFacesConfigSection[] createDetailSections(Composite composite,
-			IManagedForm managedForm, FormToolkit toolkit, FacesConfigMasterDetailPage page) {
-		ManagedBeanGeneralSection generalSection = new ManagedBeanGeneralSection(
-				composite, managedForm, getPage(), toolkit);
-		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-		generalSection.getSection().setLayoutData(gd);
-
-		InitializationSection initializationSection  = new InitializationSection(
-				composite, managedForm, getPage(), toolkit);
-		gd = new GridData(GridData.FILL_BOTH | GridData.VERTICAL_ALIGN_FILL);
-		initializationSection.getSection().setLayoutData(gd);
-	
-		return new IFacesConfigSection[] { generalSection, initializationSection};
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/detail/RenderkitDetailsPage.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/detail/RenderkitDetailsPage.java
deleted file mode 100644
index efb8dd7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/detail/RenderkitDetailsPage.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.page.detail;
-
-import org.eclipse.jst.jsf.facesconfig.ui.page.FacesConfigMasterDetailPage;
-import org.eclipse.jst.jsf.facesconfig.ui.section.IFacesConfigSection;
-import org.eclipse.jst.jsf.facesconfig.ui.section.RendererSection;
-import org.eclipse.jst.jsf.facesconfig.ui.section.RenderkitGeneralSection;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * @author Bryan Yang
- * 
- */
-public class RenderkitDetailsPage extends FacesConfigDetailsPage {
-
-	/**
-	 * 
-	 * @param page
-	 */
-	public RenderkitDetailsPage(FacesConfigMasterDetailPage page) {
-		super(page);
-	}
-
-	/**
-	 * create the detail sections and set layout for them.
-	 */
-	protected IFacesConfigSection[] createDetailSections(Composite composite,
-			IManagedForm managedForm, FormToolkit toolkit, FacesConfigMasterDetailPage page) {
-		RenderkitGeneralSection generalSection = new RenderkitGeneralSection(
-				composite, managedForm, getPage(), toolkit);
-		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-		generalSection.getSection().setLayoutData(gd);
-		
-		RendererSection rendererSection = new RendererSection(composite,
-				managedForm, getPage(), toolkit);
-		gd = new GridData(GridData.FILL_BOTH | GridData.VERTICAL_ALIGN_FILL);
-		rendererSection.getSection().setLayoutData(gd);
-
-		return new IFacesConfigSection[] { generalSection,rendererSection };
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/detail/ValidatorDetailsPage.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/detail/ValidatorDetailsPage.java
deleted file mode 100644
index a238578..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/detail/ValidatorDetailsPage.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.page.detail;
-
-import org.eclipse.jst.jsf.facesconfig.ui.page.FacesConfigMasterDetailPage;
-import org.eclipse.jst.jsf.facesconfig.ui.section.AttributeSection;
-import org.eclipse.jst.jsf.facesconfig.ui.section.IFacesConfigSection;
-import org.eclipse.jst.jsf.facesconfig.ui.section.PropertySection;
-import org.eclipse.jst.jsf.facesconfig.ui.section.ValidatorGeneralSection;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * @author Bryan Yang
- * 
- */
-public class ValidatorDetailsPage extends FacesConfigDetailsPage {
-
-	/**
-	 * 
-	 * @param page
-	 */
-	public ValidatorDetailsPage(FacesConfigMasterDetailPage page) {
-		super(page);
-	}
-
-	/**
-	 * create the detail sections and set layout for them.
-	 */
-	protected IFacesConfigSection[] createDetailSections(Composite composite,
-			IManagedForm managedForm, FormToolkit toolkit, FacesConfigMasterDetailPage page) {
-		ValidatorGeneralSection generalSection = new ValidatorGeneralSection(
-				composite, managedForm, getPage(), toolkit);
-		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-		generalSection.getSection().setLayoutData(gd);
-
-		AttributeSection attributeSection = new AttributeSection(composite,
-				managedForm, getPage(), toolkit);
-		gd = new GridData(GridData.FILL_HORIZONTAL);
-		attributeSection.getSection().setLayoutData(gd);
-
-		PropertySection propertySection = new PropertySection(composite,
-				managedForm, getPage(), toolkit);
-		gd = new GridData(GridData.FILL_BOTH);
-		propertySection.getSection().setLayoutData(gd);
-		return new IFacesConfigSection[] { generalSection, attributeSection,
-				propertySection };
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/DelegatingZoomManager.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/DelegatingZoomManager.java
deleted file mode 100644
index 0a8f335..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/DelegatingZoomManager.java
+++ /dev/null
@@ -1,374 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow;
-
-// import org.eclipse.core.runtime.ListenerList;
-import org.eclipse.core.runtime.ListenerList;
-import org.eclipse.draw2d.ScalableFigure;
-import org.eclipse.draw2d.Viewport;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.editparts.ZoomListener;
-import org.eclipse.gef.editparts.ZoomManager;
-
-/**
- * A delegating ZoomManager.
- * 
- */
-public class DelegatingZoomManager extends ZoomManager implements ZoomListener {
-	/** Default string or double value of zoom level */
-	private static final String DEFAULT_ZOOM_LEVEL_STRING = "100%"; //$NON-NLS-1$
-
-	private static final double DEFAULT_ZOOM_LEVEL = 1;
-
-	/** the current ZoomManager all work is delegated to */
-	private ZoomManager currentZoomManager = null;
-
-	/** listeners of zoom */
-	private ListenerList zoomListeners = new ListenerList(
-			ListenerList.IDENTITY);
-
-	/**
-	 * Creates a new DelegatingZoomManager instance.
-	 */
-	public DelegatingZoomManager() {
-		super((ScalableFigure) null, (Viewport) null);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ZoomListener#zoomChanged(double)
-	 */
-	public void zoomChanged(double zoom) {
-		Object[] listeners = zoomListeners.getListeners();
-		for (int i = 0; i < listeners.length; ++i) {
-			((ZoomListener) listeners[i]).zoomChanged(zoom);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ZoomManager#addZoomListener(ZoomListener)
-	 */
-	public void addZoomListener(ZoomListener listener) {
-		zoomListeners.add(listener);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ZoomManager#removeZoomListener(oZoomListener)
-	 */
-	public void removeZoomListener(ZoomListener listener) {
-		zoomListeners.remove(listener);
-	}
-
-	/**
-	 * Sets the ZoomManager all work should be delegated to.
-	 * 
-	 * @param zoomManager
-	 */
-	public void setCurrentZoomManager(ZoomManager zoomManager) {
-		if (null != currentZoomManager) {
-			currentZoomManager.removeZoomListener(this);
-		}
-
-		currentZoomManager = zoomManager;
-		if (null != currentZoomManager) {
-			currentZoomManager.addZoomListener(this);
-			zoomChanged(currentZoomManager.getZoom());
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ZoomManager#canZoomIn()
-	 */
-	public boolean canZoomIn() {
-		if (null == currentZoomManager) {
-			return false;
-		}
-
-		return currentZoomManager.canZoomIn();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ZoomManager#canZoomOut()
-	 */
-	public boolean canZoomOut() {
-		if (null == currentZoomManager) {
-			return false;
-		}
-
-		return currentZoomManager.canZoomOut();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ZoomManager#getMaxZoom()
-	 */
-	public double getMaxZoom() {
-		if (null == currentZoomManager) {
-			return DEFAULT_ZOOM_LEVEL;
-		}
-
-		return currentZoomManager.getMaxZoom();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ZoomManager#getMinZoom()
-	 */
-	public double getMinZoom() {
-		if (null == currentZoomManager) {
-			return DEFAULT_ZOOM_LEVEL;
-		}
-
-		return currentZoomManager.getMinZoom();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ZoomManager#getNextZoomLevel()
-	 */
-	public double getNextZoomLevel() {
-		if (null == currentZoomManager) {
-			return DEFAULT_ZOOM_LEVEL;
-		}
-
-		return currentZoomManager.getNextZoomLevel();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ZoomManager#getPreviousZoomLevel()
-	 */
-	public double getPreviousZoomLevel() {
-		if (null == currentZoomManager) {
-			return DEFAULT_ZOOM_LEVEL;
-		}
-
-		return currentZoomManager.getPreviousZoomLevel();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ZoomManager#getScalableFigure()
-	 */
-	public ScalableFigure getScalableFigure() {
-		if (null == currentZoomManager) {
-			return null;
-		}
-
-		return currentZoomManager.getScalableFigure();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ZoomManager#getUIMultiplier()
-	 */
-	public double getUIMultiplier() {
-		if (null == currentZoomManager) {
-			return DEFAULT_ZOOM_LEVEL;
-		}
-
-		return currentZoomManager.getUIMultiplier();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ZoomManager#getViewport()
-	 */
-	public Viewport getViewport() {
-		if (null == currentZoomManager) {
-			return null;
-		}
-
-		return currentZoomManager.getViewport();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ZoomManager#getZoom()
-	 */
-	public double getZoom() {
-		if (null == currentZoomManager) {
-			return DEFAULT_ZOOM_LEVEL;
-		}
-
-		return currentZoomManager.getZoom();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ZoomManager#getZoomAsText()
-	 */
-	public String getZoomAsText() {
-		if (null == currentZoomManager) {
-			return DEFAULT_ZOOM_LEVEL_STRING;
-		}
-
-		return currentZoomManager.getZoomAsText();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ZoomManager#getZoomLevels()
-	 */
-	public double[] getZoomLevels() {
-		if (null == currentZoomManager) {
-			return new double[] { DEFAULT_ZOOM_LEVEL };
-		}
-
-		return currentZoomManager.getZoomLevels();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ZoomManager#getZoomLevelsAsText()
-	 */
-	public String[] getZoomLevelsAsText() {
-		if (null == currentZoomManager) {
-			return new String[] { DEFAULT_ZOOM_LEVEL_STRING };
-		}
-
-		return currentZoomManager.getZoomLevelsAsText();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ZoomManager#setUIMultiplier(double)
-	 */
-	public void setUIMultiplier(double multiplier) {
-		if (null == currentZoomManager) {
-			return;
-		}
-
-		currentZoomManager.setUIMultiplier(multiplier);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ZoomManager#setViewLocation(Point)
-	 */
-	public void setViewLocation(Point p) {
-		if (null == currentZoomManager) {
-			return;
-		}
-
-		currentZoomManager.setViewLocation(p);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ZoomManager#setZoom(double)
-	 */
-	public void setZoom(double zoom) {
-		if (null == currentZoomManager) {
-			return;
-		}
-		currentZoomManager.setZoom(zoom);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ZoomManager#setZoomAnimationStyle(int)
-	 */
-	public void setZoomAnimationStyle(int style) {
-		if (null == currentZoomManager) {
-			return;
-		}
-		currentZoomManager.setZoomAnimationStyle(style);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ZoomManager#setZoomAsText(String)
-	 */
-	public void setZoomAsText(String zoomString) {
-		if (null == currentZoomManager) {
-			return;
-		}
-		currentZoomManager.setZoomAsText(zoomString);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ZoomManager#setZoomLevels(double[])
-	 */
-	public void setZoomLevels(double[] zoomLevels) {
-		if (null == currentZoomManager) {
-			return;
-		}
-		currentZoomManager.setZoomLevels(zoomLevels);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ZoomManager#zoomIn()
-	 */
-	public void zoomIn() {
-		if (null == currentZoomManager) {
-			return;
-		}
-		currentZoomManager.zoomIn();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ZoomManager#zoomOut()
-	 */
-	public void zoomOut() {
-		if (null == currentZoomManager) {
-			return;
-		}
-		currentZoomManager.zoomOut();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ZoomManager#zoomTo(Rectangle)
-	 */
-	public void zoomTo(Rectangle rect) {
-		if (null == currentZoomManager) {
-			return;
-		}
-		currentZoomManager.zoomTo(rect);
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/PageflowActionBarContributor.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/PageflowActionBarContributor.java
deleted file mode 100644
index 349b69d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/PageflowActionBarContributor.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow;
-
-import org.eclipse.draw2d.PositionConstants;
-import org.eclipse.gef.editparts.ZoomManager;
-import org.eclipse.gef.ui.actions.ActionBarContributor;
-import org.eclipse.gef.ui.actions.AlignmentRetargetAction;
-import org.eclipse.gef.ui.actions.DeleteRetargetAction;
-import org.eclipse.gef.ui.actions.GEFActionConstants;
-import org.eclipse.gef.ui.actions.RedoRetargetAction;
-import org.eclipse.gef.ui.actions.UndoRetargetAction;
-import org.eclipse.gef.ui.actions.ZoomComboContributionItem;
-import org.eclipse.gef.ui.actions.ZoomInRetargetAction;
-import org.eclipse.gef.ui.actions.ZoomOutRetargetAction;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jst.jsf.facesconfig.ui.INestedActionContributor;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IWorkbenchActionConstants;
-import org.eclipse.ui.actions.ActionFactory;
-
-/**
- * The action bar contributor for the page flow editor
- *
- */
-public class PageflowActionBarContributor extends ActionBarContributor
-		implements INestedActionContributor {
-
-	IEditorPart activeEditor;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ActionBarContributor#buildActions()
-	 */
-	protected void buildActions() {
-		addRetargetAction(new UndoRetargetAction());
-		addRetargetAction(new RedoRetargetAction());
-		addRetargetAction(new DeleteRetargetAction());
-		addRetargetAction(new ZoomInRetargetAction());
-		addRetargetAction(new ZoomOutRetargetAction());
-
-		addRetargetAction(new AlignmentRetargetAction(PositionConstants.LEFT));
-		addRetargetAction(new AlignmentRetargetAction(PositionConstants.CENTER));
-		addRetargetAction(new AlignmentRetargetAction(PositionConstants.RIGHT));
-		addRetargetAction(new AlignmentRetargetAction(PositionConstants.TOP));
-		addRetargetAction(new AlignmentRetargetAction(PositionConstants.MIDDLE));
-		addRetargetAction(new AlignmentRetargetAction(PositionConstants.BOTTOM));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ActionBarContributor#declareGlobalActionKeys()
-	 */
-	public void declareGlobalActionKeys() {
-		// do nothing
-	}
-
-	/**
-	 * Update the action keys
-	 */
-	public void updateActionKeys() {
-		declareGlobalActionKeys();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see EditorActionBarContributor#contributeToToolBar(IToolBarManager)
-	 */
-	public void contributeToToolBar(IToolBarManager tbm) {
-		tbm.add(getAction(ActionFactory.UNDO.getId()));
-		tbm.add(getAction(ActionFactory.REDO.getId()));
-		tbm.add(new Separator());
-		tbm.add(getAction(GEFActionConstants.ALIGN_LEFT));
-		tbm.add(getAction(GEFActionConstants.ALIGN_CENTER));
-		tbm.add(getAction(GEFActionConstants.ALIGN_RIGHT));
-		tbm.add(new Separator());
-		tbm.add(getAction(GEFActionConstants.ALIGN_TOP));
-		tbm.add(getAction(GEFActionConstants.ALIGN_MIDDLE));
-		tbm.add(getAction(GEFActionConstants.ALIGN_BOTTOM));
-
-		tbm.add(new Separator());
-		String[] zoomStrings = new String[] { ZoomManager.FIT_ALL,
-				ZoomManager.FIT_HEIGHT, ZoomManager.FIT_WIDTH };
-		tbm.add(new ZoomComboContributionItem(getPage(), zoomStrings));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see EditorActionBarContributor#contributeToMenu(IMenuManager)
-	 */
-	public void contributeToMenu(IMenuManager menubar) {
-		super.contributeToMenu(menubar);
-		MenuManager viewMenu = new MenuManager("View"); //$NON-NLS-1$
-		viewMenu.add(getAction(GEFActionConstants.ZOOM_IN));
-		viewMenu.add(getAction(GEFActionConstants.ZOOM_OUT));
-		menubar.insertAfter(IWorkbenchActionConstants.M_EDIT, viewMenu);
-	}
-
-	public void setActiveEditor(IEditorPart editor) {
-		if (editor instanceof PageflowEditor) {
-			activeEditor = editor;
-			// updateActionKeys();
-			super.setActiveEditor(editor);
-		}
-	}
-
-	public void update() {
-		if (activeEditor != null) {
-			((PageflowEditor) activeEditor).updateActions();
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/PageflowEditor.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/PageflowEditor.java
deleted file mode 100644
index f65230a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/PageflowEditor.java
+++ /dev/null
@@ -1,1225 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow;
-
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IResourceChangeEvent;
-import org.eclipse.core.resources.IResourceChangeListener;
-import org.eclipse.core.resources.IResourceDelta;
-import org.eclipse.core.resources.IResourceDeltaVisitor;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.SubProgressMonitor;
-import org.eclipse.draw2d.PositionConstants;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.gef.ContextMenuProvider;
-import org.eclipse.gef.DefaultEditDomain;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPartViewer;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.GraphicalViewer;
-import org.eclipse.gef.KeyHandler;
-import org.eclipse.gef.KeyStroke;
-import org.eclipse.gef.RootEditPart;
-import org.eclipse.gef.commands.CommandStack;
-import org.eclipse.gef.commands.CommandStackEvent;
-import org.eclipse.gef.commands.CommandStackEventListener;
-import org.eclipse.gef.editparts.ScalableFreeformRootEditPart;
-import org.eclipse.gef.editparts.ScalableRootEditPart;
-import org.eclipse.gef.editparts.ZoomManager;
-import org.eclipse.gef.palette.PaletteRoot;
-import org.eclipse.gef.requests.CreationFactory;
-import org.eclipse.gef.ui.actions.ActionRegistry;
-import org.eclipse.gef.ui.actions.DeleteAction;
-import org.eclipse.gef.ui.actions.GEFActionConstants;
-import org.eclipse.gef.ui.actions.RedoAction;
-import org.eclipse.gef.ui.actions.SelectionAction;
-import org.eclipse.gef.ui.actions.StackAction;
-import org.eclipse.gef.ui.actions.UndoAction;
-import org.eclipse.gef.ui.actions.UpdateAction;
-import org.eclipse.gef.ui.actions.ZoomInAction;
-import org.eclipse.gef.ui.actions.ZoomOutAction;
-import org.eclipse.gef.ui.parts.GraphicalEditorWithFlyoutPalette;
-import org.eclipse.gef.ui.parts.GraphicalViewerKeyHandler;
-import org.eclipse.gef.ui.parts.ScrollingGraphicalViewer;
-import org.eclipse.gef.ui.parts.SelectionSynchronizer;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.preference.PreferenceConverter;
-import org.eclipse.jface.resource.FontRegistry;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.jface.util.TransferDropTargetListener;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.action.AlignmentAction;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.action.OpenEditorAction;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.action.ShowPropertyViewAction;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.command.PreExecuteCommandStack;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart.ConfigurableRootEditPart;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart.IConnectionPreference;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart.IFigurePreference;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart.ILayerPanePreference;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart.INodePreference;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart.PageflowEditPartsFactory;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart.PageflowNodeEditPart;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.synchronization.FC2PFTransformer;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.util.EditPartMarkerUtil;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.util.PageflowAnnotationUtil;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.util.PageflowModelManager;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.util.PageflowResourceFactory;
-import org.eclipse.jst.jsf.facesconfig.ui.preference.GEMPreferences;
-import org.eclipse.jst.jsf.facesconfig.ui.util.WebrootUtil;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.FontData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.ISelectionListener;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.actions.ActionFactory;
-import org.eclipse.ui.ide.IGotoMarker;
-import org.eclipse.ui.part.FileEditorInput;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.eclipse.ui.views.contentoutline.IContentOutlinePage;
-import org.eclipse.ui.views.properties.IPropertySheetPage;
-import org.eclipse.ui.views.properties.PropertySheetPage;
-
-/**
- * This the the main editor page for modifying a complete pageflow.
- */
-public class PageflowEditor extends GraphicalEditorWithFlyoutPalette implements
-		IAdaptable, IPropertyChangeListener, IGotoMarker {
-	/** log instance */
-	private static final Logger log = EditorPlugin
-			.getLogger(PageflowEditor.class);
-
-	/** pageflow context menu registration ID */
-	private static final String PAGEFLOW_CONTEXTMENU_REG_ID = ".pageflow.editor.contextmenu"; //$NON-NLS-1$
-
-	/** the edit domain */
-	private final DefaultEditDomain domain;
-
-	/** the palette root */
-	private PaletteRoot paletteRoot = null;
-
-	/** the parent multi-page editor */
-	private IEditorPart parentEditor = null;
-
-	/** the graphical viewer */
-	private GraphicalViewer viewer = null;
-
-	/** the undoable <code>IPropertySheetPage</code> */
-	private PropertySheetPage undoablePropertySheetPage = null;
-
-	/** the editor's action registry */
-	private ActionRegistry actionRegistry = null;
-
-	/**
-	 * The id of the editor page
-	 */
-	public static final String PAGE_ID = "org.eclipse.jst.jsf.facesconfig.ui.pageflow.PageflowEditor"; //$NON-NLS-1$
-
-	/** the list of action ids that are to EditPart actions */
-	private List editPartActionIDs = new ArrayList();
-
-	/** the selection listener */
-	private ISelectionListener selectionListener = new ISelectionListener() {
-		public void selectionChanged(IWorkbenchPart part, ISelection selection) {
-			updateActions();
-		}
-	};
-
-	/** the selection synchronizer for the edit part viewer */
-	private SelectionSynchronizer synchronizer = null;
-
-	/** the shared key handler */
-	private KeyHandler sharedKeyHandler = null;
-
-	/** pageflow model manager */
-	private PageflowModelManager pageflowManager;
-
-	/** the dirty status of this page */
-	private boolean isDirty = false;
-
-	/** the command stack of this page */
-	private CommandStack commandStack;
-
-	private FC2PFTransformer modelsTransform;
-
-	List stackActions = new ArrayList();
-
-	/**
-	 * @return the faces-config to pageflow model
-	 */
-	public FC2PFTransformer getModelsTransform() {
-		if (modelsTransform == null) {
-			modelsTransform = new FC2PFTransformer();
-		}
-		return modelsTransform;
-	}
-
-	/**
-	 * update the editor actions
-	 */
-	public void updateActions() {
-		updateActions(stackActions);
-		updateActions(editPartActionIDs);
-	}
-
-	/**
-	 * This class listens for command stack changes of the page and decides if
-	 * the editor is dirty or not.
-	 * 
-	 */
-	private class PageCommandStackListener implements CommandStackEventListener {
-		public void stackChanged(CommandStackEvent event) {
-			if (((CommandStack) event.getSource()).isDirty()) {
-				// at least one command stack is dirty,
-				// so the multi page editor is dirty too
-				setDirty(true);
-			}
-			updateActions();
-		}
-	}
-
-	/**
-	 * This class listens to changes to the file system in the workspace, and
-	 * validate the current pageflow based on web files' status.
-	 */
-	private class ResourceTracker implements IResourceChangeListener,
-			IResourceDeltaVisitor {
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.core.resources.IResourceChangeListener#resourceChanged(org.eclipse.core.resources.IResourceChangeEvent)
-		 */
-		public void resourceChanged(IResourceChangeEvent event) {
-			IResourceDelta delta = event.getDelta();
-			try {
-				if (delta != null) {
-					delta.accept(this);
-				}
-			} catch (CoreException exception) {
-				// Pageflow.PageflowEditor.Error.ResourceChange = Failed in the
-				// resource change.
-				log.error("Pageflow.PageflowEditor.Error.ResourceChange", //$NON-NLS-1$
-						exception);
-			}
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.core.resources.IResourceDeltaVisitor#visit(org.eclipse.core.resources.IResourceDelta)
-		 */
-		public boolean visit(IResourceDelta delta) {
-			// if the delta is not a file instance, just return true
-			if (!(delta.getResource() instanceof IFile)) {
-				return true;
-			}
-
-			// web file is changed.
-			if (WebrootUtil.isValidWebFile(((IFile) delta.getResource())
-					.getFullPath())) {
-				webPageChanged(((IFile) delta.getResource()).getFullPath());
-				return false;
-			}
-			return false;
-		}
-	}
-
-	/** the resource tracker instance */
-	private ResourceTracker resourceTracker = null;
-
-	/**
-	 * Returns the resource tracker instance
-	 * 
-	 * @return - Returns the resource tracker instance
-	 */
-	private ResourceTracker getResourceTracker() {
-		if (null == resourceTracker) {
-			resourceTracker = new ResourceTracker();
-		}
-		return resourceTracker;
-	}
-
-	/**
-	 * Changes the dirty state.
-	 * 
-	 * @param dirty -
-	 *            dirty state
-	 */
-	protected void setDirty(boolean dirty) {
-		if (isDirty != dirty) {
-			isDirty = dirty;
-		}
-	}
-
-	/**
-	 * Updates the specified actions.
-	 * 
-	 * @param actionIds -
-	 *            the list of ids of actions to update
-	 */
-	protected void updateActions(List actionIds) {
-		for (Iterator ids = actionIds.iterator(); ids.hasNext();) {
-			IAction action = getActionRegistry().getAction(ids.next());
-			if (null != action && action instanceof UpdateAction) {
-				((UpdateAction) action).update();
-			}
-		}
-	}
-
-	/**
-	 * Creates a new PageflowPage instance.
-	 * <p>
-	 * By design this page uses its own <code>EditDomain</code>. The main
-	 * goal of this approach is that this page has its own undo/redo command
-	 * stack.
-	 * 
-	 * @param parent -
-	 *            the parent multi page editor
-	 */
-	public PageflowEditor(IEditorPart parent) {
-		domain = new DefaultEditDomain(parent);
-		domain.setCommandStack(getCommandStack());
-		this.setEditDomain(domain);
-		parentEditor = parent;
-	}
-
-	/**
-	 * Adds an <code>CommandStack</code> action to this editor.
-	 * <p>
-	 * <code>CommandStack</code> actions are actions that depend and work on
-	 * the <code>CommandStack</code>.
-	 * 
-	 * @param action -
-	 *            the <code>CommandStack</code> action
-	 */
-	protected void addStackAction(StackAction action) {
-		getActionRegistry().registerAction(action);
-		stackActions.add(action.getId());
-	}
-
-	/**
-	 * Creates different kinds of actions and registers them to the
-	 * ActionRegistry.
-	 */
-	protected void createActions() {
-		// register delete action
-		addEditPartAction(new DeleteAction((IWorkbenchPart) this));
-		// register undo/redo action
-		addStackAction(new UndoAction(this));
-		addStackAction(new RedoAction(this));
-
-		// Allows opening of JSP files from the pageflow
-		addEditPartAction(new OpenEditorAction(this));
-
-		// Allows showing property view for the pageflow
-		SelectionAction action = new ShowPropertyViewAction(this);
-		action
-				.setImageDescriptor(getImageDescriptorForView("org.eclipse.ui.views.PropertySheet")); //$NON-NLS-1$
-		addEditPartAction(action);
-		// Allows showing property view for the pageflow
-		// addEditPartAction(new ShowPaletteViewAction((IWorkbenchPart) this));
-
-		// register alignment actions
-		addEditPartAction(new AlignmentAction((IWorkbenchPart) this,
-				PositionConstants.LEFT));
-		addEditPartAction(new AlignmentAction((IWorkbenchPart) this,
-				PositionConstants.RIGHT));
-		addEditPartAction(new AlignmentAction((IWorkbenchPart) this,
-				PositionConstants.TOP));
-		addEditPartAction(new AlignmentAction((IWorkbenchPart) this,
-				PositionConstants.BOTTOM));
-		addEditPartAction(new AlignmentAction((IWorkbenchPart) this,
-				PositionConstants.CENTER));
-		addEditPartAction(new AlignmentAction((IWorkbenchPart) this,
-				PositionConstants.MIDDLE));
-
-		// register zoom in/out action
-		IAction zoomIn = new ZoomInAction(getZoomManager(getGraphicalViewer()));
-		IAction zoomOut = new ZoomOutAction(
-				getZoomManager(getGraphicalViewer()));
-		addAction(zoomIn);
-		addAction(zoomOut);
-
-//		getSite().getKeyBindingService().registerAction(zoomIn);
-//		getSite().getKeyBindingService().registerAction(zoomOut);
-	}
-
-	/**
-	 * Returns the zoom manager of the specified viewer.
-	 * 
-	 * @param viewer_ -
-	 *            the viewer to get the zoom manager from
-	 * @return - the zoom manager
-	 */
-	private ZoomManager getZoomManager(GraphicalViewer viewer_) {
-		// get zoom manager from root edit part
-		RootEditPart rootEditPart = viewer_.getRootEditPart();
-		ZoomManager zoomManager = null;
-		if (rootEditPart instanceof ScalableFreeformRootEditPart) {
-			zoomManager = ((ScalableFreeformRootEditPart) rootEditPart)
-					.getZoomManager();
-		} else if (rootEditPart instanceof ScalableRootEditPart) {
-			zoomManager = ((ScalableRootEditPart) rootEditPart)
-					.getZoomManager();
-		}
-		return zoomManager;
-	}
-
-	/**
-	 * Adds an action to this editor's <code>ActionRegistry</code>.
-	 * 
-	 * @param action -
-	 *            the action to add.
-	 */
-	protected void addAction(IAction action) {
-		getActionRegistry().registerAction(action);
-	}
-
-	/**
-	 * Adds an <code>EditPart</code> action to this editor.
-	 * <p>
-	 * <code>EditPart</code> actions are actions that depend and work on the
-	 * selected <code>EditPart</code>s.
-	 * 
-	 * @param action -
-	 *            the <code>EditPart</code> action
-	 */
-	protected void addEditPartAction(SelectionAction action) {
-		getActionRegistry().registerAction(action);
-		editPartActionIDs.add(action.getId());
-	}
-
-	/**
-	 * Returns the action registry of this editor.
-	 * 
-	 * @return - the action registry
-	 */
-	public ActionRegistry getActionRegistry() {
-		if (null == actionRegistry) {
-			actionRegistry = new ActionRegistry();
-		}
-
-		return actionRegistry;
-	}
-
-	/**
-	 * Creates the GraphicalViewer on the specified <code>Composite</code>.
-	 * 
-	 * @param parent -
-	 *            the parent composite
-	 */
-	public void createGraphicalViewer(Composite parent) {
-		viewer = new ScrollingGraphicalViewer();
-		viewer.createControl(parent);
-
-		// configure the viewer
-		viewer.getControl().setBackground(parent.getBackground());
-
-		viewer.setRootEditPart(new ConfigurableRootEditPart());
-		// _viewer.setRootEditPart(new ScalableFreeformRootEditPart());
-		viewer.setKeyHandler(new GraphicalViewerKeyHandler(viewer));
-
-		// hook the viewer into the editor
-		registerEditPartViewer(viewer);
-
-		// configure the viewer with context menu and template drag and drop
-		configureEditPartViewer(viewer);
-
-		// initialize the viewer with input
-		viewer.setEditPartFactory(new PageflowEditPartsFactory());
-		// viewer.setContents(getPageflow());
-
-		// support the resource drag&drop
-		viewer
-				.addDropTargetListener((TransferDropTargetListener) new ResourceTransferDropTargetListener(
-						viewer, getParentEditor()) {
-					protected CreationFactory getFactory(Object obj) {
-						return getResourceFactory((IResource) obj);
-					}
-				});
-
-		// apply Editor's preferences
-		// propertyChange(null);
-		// add listener to Editor's preferences changing
-		EditorPlugin.getDefault().getPreferenceStore()
-				.addPropertyChangeListener(this);
-	}
-
-	private CreationFactory getResourceFactory(IResource resource) {
-		return new PageflowResourceFactory(resource);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ISaveablePart#doSave(org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public final void doSave(IProgressMonitor monitor) {
-		// our policy: delegate saving to the parent
-		getParentEditor().doSave(monitor);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ISaveablePart#doSaveAs()
-	 */
-	public final void doSaveAs() {
-		// our policy: delegate saving to the parent
-		getParentEditor().doSaveAs();
-	}
-
-	/**
-	 * Saves the pageflow under the specified path.
-	 * @param file 
-	 * 
-	 * @param progressMonitor
-	 * @throws CoreException 
-	 */
-	public void doSave(IFile file, IProgressMonitor progressMonitor)
-			throws CoreException {
-		if (((FileEditorInput) getEditorInput()).getFile() != file) {
-			// TODO: save to other page.
-		}
-		if (null == progressMonitor) {
-			progressMonitor = new NullProgressMonitor();
-		}
-		// Pageflow.Label.Saving = Saving
-		progressMonitor.beginTask(PageflowMessages.Pageflow_Label_Saving + " " //$NON-NLS-1$
-				+ file.getFullPath(), 2);
-
-		if (null == getPageflowManager()) {
-			// Pageflow.PageflowEditor.Alert.nullModelManager = No model manager
-			// found for saving the file.
-			EditorPlugin.getAlerts().throwCoreException(
-					"Pageflow.PageflowEditor.Alert.nullModelManager"); //$NON-NLS-1$
-		}
-
-		// save pageflow to file
-		try {
-			getPageflowManager().save(getPageflowFilePath(file));
-
-			progressMonitor.worked(1);
-			file.refreshLocal(IResource.DEPTH_ZERO, new SubProgressMonitor(
-					progressMonitor, 1));
-			progressMonitor.done();
-			setDirty(false);
-		} catch (FileNotFoundException e) {
-			// Pageflow.PageflowEditor.Alert.errorSaveFileInfo = The current
-			// pageflow model could not be saved.
-			EditorPlugin.getAlerts().throwCoreException(e);
-		} catch (IOException e) {
-			// Pageflow.PageflowEditor.Alert.errorSaveFileInfo = The current
-			// pageflow model could not be saved.
-			EditorPlugin.getAlerts().throwCoreException(e);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see IEditorPart#init(org.eclipse.ui.IEditorSite,
-	 *      org.eclipse.ui.IEditorInput)
-	 */
-	public void init(IEditorSite site, IEditorInput input)
-			throws PartInitException {
-		setSite(site);
-		setInput(input);
-		IFile fileFacesConfig = null;
-		try {
-			fileFacesConfig = ((FileEditorInput) input).getFile();
-
-			// load and validate pageflow
-			if (null == createPageflow(getPageflowFilePath(fileFacesConfig))) {
-				// Pageflow.PageflowEditor.Error.invalidPageflowFile = The
-				// specified input is not a valid pageflow.
-				log.error("Pageflow.PageflowEditor.Error.invalidPageflowFile"); //$NON-NLS-1$
-				throw new PartInitException(
-						EditorPlugin
-								.getResourceString("Pageflow.PageflowEditor.Error.invalidPageflowFile")); //$NON-NLS-1$
-			}
-
-		} catch (CoreException e) {
-			// Pageflow.PageflowEditor.Error.invalidPageflowFile = The specified
-			// input is not a valid pageflow.
-			log.error("Pageflow.PageflowEditor.Error.invalidPageflowFile", e); //$NON-NLS-1$
-			throw new PartInitException(e.getStatus());
-		} catch (IOException e) {
-			// Pageflow.PageflowEditor.Alert.errorSaveFileInfo = The current
-			// pageflow model could not be saved.
-			log.error("Pageflow.PageflowEditor.Alert.errorSaveFileInfo", e); //$NON-NLS-1$
-		}
-
-		// add selection change listener
-		getSite().getWorkbenchWindow().getSelectionService()
-				.addSelectionListener(getSelectionListener());
-
-		// Add resource change listener
-		fileFacesConfig.getWorkspace().addResourceChangeListener(
-				getResourceTracker());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.IWorkbenchPart#dispose()
-	 */
-	public void dispose() {
-		// remove selection change listener
-		getModelsTransform().dispose();
-		getSite().getWorkbenchWindow().getSelectionService()
-				.removeSelectionListener(getSelectionListener());
-
-		// remove listener to Editor's preferences changing
-		EditorPlugin.getDefault().getPreferenceStore()
-				.removePropertyChangeListener(this);
-
-		if (getEditorInput() != null) {
-			IFile file = (IFile) getEditorInput().getAdapter(IResource.class);
-			if (file != null) {
-				file.getWorkspace().removeResourceChangeListener(
-						getResourceTracker());
-			}
-		}
-		super.dispose();
-	}
-
-	/**
-	 * get the pageflow file path based on faces-config.xml file path
-	 * 
-	 * @return
-	 */
-	private IPath getPageflowFilePath(IFile file) {
-		IPath pageflowFilePath;
-		pageflowFilePath = PageflowModelManager.makePageflowPath(file
-				.getFullPath());
-		return pageflowFilePath;
-	}
-
-	/**
-	 * Returns the pageflow object from the specified file.
-	 * 
-	 * @param file -
-	 *            the file resource
-	 * @return -the pageflow object from the specified file
-	 * @throws IOException
-	 */
-	private Pageflow createPageflow(IPath pathPageflow) throws CoreException,
-			IOException {
-		Pageflow pageflow = null;
-
-		try {
-			getPageflowManager().load(pathPageflow);
-		} catch (Exception e) {
-			// Pageflow.PageflowEditor.Error.invalidPageflowFile = The specified
-			// input is not a valid pageflow.
-			// _log.error("Pageflow.PageflowEditor.Error.invalidPageflowFile",
-			// e);
-			getPageflowManager().createPageflow(pathPageflow);
-		}
-		IFile fileFacesConfig = ((FileEditorInput) getEditorInput()).getFile();
-		// it should update related config file
-		if (!fileFacesConfig.getFullPath().toString().trim().equalsIgnoreCase(
-				getPageflowManager().getModel().getConfigfile())) {
-			getPageflowManager().getModel().setConfigfile(
-					fileFacesConfig.getFullPath().toString());
-			getPageflowManager().save(pathPageflow);
-		}
-		pageflow = getPageflowManager().getModel();
-		if (null == pageflow) {
-			// Pageflow.PageflowEditor.Error.invalidPageflowModel = The model in
-			// the pageflow file is not a valid pageflow model.
-			log.error("Pageflow.PageflowEditor.Error.invalidPageflowModel"); //$NON-NLS-1$
-			EditorPlugin.getAlerts().throwCoreException(
-					"Pageflow.PageflowEditor.Error.invalidPageflowModel"); //$NON-NLS-1$
-		}
-		return pageflow;
-	}
-
-	/** get the pageflow manager for this page 
-	 * @return  the model manager
-	 */
-	public PageflowModelManager getPageflowManager() {
-		if (pageflowManager == null) {
-			pageflowManager = new PageflowModelManager();
-		}
-		return pageflowManager;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ISaveablePart#isDirty()
-	 */
-	public final boolean isDirty() {
-		return isDirty;
-	}
-
-	/**
-	 * Returns the <code>CommandStack</code> of this editor page.
-	 * 
-	 * @return - the <code>CommandStack</code> of this editor page
-	 */
-	public final CommandStack getCommandStack() {
-		if (commandStack == null) {
-			commandStack = new PreExecuteCommandStack();
-			commandStack
-					.addCommandStackEventListener(new PageCommandStackListener());
-		}
-		return commandStack;
-	}
-
-	/**
-	 * Returns the default <code>PaletteRoot</code> for this editor and all
-	 * its pages.
-	 * 
-	 * @return - the default <code>PaletteRoot</code>
-	 */
-	protected PaletteRoot getPaletteRoot() {
-		if (null == paletteRoot) {
-			// create root
-			paletteRoot = new PageflowPaletteRoot();
-		}
-		return paletteRoot;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ISaveablePart#isSaveAsAllowed()
-	 */
-	public final boolean isSaveAsAllowed() {
-		// our policy: delegate saving to the parent
-		return getParentEditor().isSaveAsAllowed();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see IWorkbenchPart#setFocus()
-	 */
-	public void setFocus() {
-		getGraphicalViewer().getControl().setFocus();
-	}
-
-	/**
-	 * Returns the multi page pageflow editor this editor page is contained in.
-	 * 
-	 * @return - the parent multi page editor
-	 */
-	protected final IEditorPart getParentEditor() {
-		return parentEditor;
-	}
-
-	/**
-	 * Returns the edit domain this editor page uses.
-	 * 
-	 * @return - the edit domain this editor page uses
-	 */
-	public final DefaultEditDomain getEditDomain() {
-		return domain;
-	}
-
-	/**
-	 * Hooks a <code>EditPartViewer</code> to the rest of the Editor.
-	 * <p>
-	 * By default, the viewer is added to the SelectionSynchronizer, which can
-	 * be used to keep 2 or more EditPartViewers in sync. The viewer is also
-	 * registered as the ISelectionProvider for the Editor's PartSite.
-	 * 
-	 * @param viewer_ -
-	 *            the viewer to hook into the editor
-	 */
-	protected void registerEditPartViewer(EditPartViewer viewer_) {
-		// register viewer to edit domain
-		getEditDomain().addViewer(viewer_);
-
-		// the multi page pageflow editor keeps track of synchronizing
-		getSelectionSynchronizer().addViewer(viewer_);
-
-		// add viewer as selection provider
-		getSite().setSelectionProvider(viewer_);
-	}
-
-	/**
-	 * Configures the specified <code>EditPartViewer</code> including context
-	 * menu, key handler, etc.
-	 * 
-	 * @param viewer_ -
-	 *            the pageflow graphical viewer.
-	 */
-	protected void configureEditPartViewer(EditPartViewer viewer_) {
-		// configure the shared key handler
-		if (null != viewer_.getKeyHandler()) {
-			viewer_.getKeyHandler().setParent(getSharedKeyHandler());
-		}
-		// create the ActionRegistry
-		createActions();
-
-		// append the parent editor's action registry.
-		ActionRegistry actionRegistry_ = (ActionRegistry) getParentEditor()
-				.getAdapter(ActionRegistry.class);
-		if (actionRegistry_ != null) {
-			for (Iterator iter = actionRegistry_.getActions(); iter.hasNext();) {
-				getActionRegistry().registerAction((IAction) iter.next());
-			}
-		}
-		// configure and register the context menu
-		ContextMenuProvider provider = new PageflowEditorContextMenuProvider(
-				viewer_, getActionRegistry());
-		viewer_.setContextMenu(provider);
-		getSite().registerContextMenu(
-				EditorPlugin.getPluginId() + PAGEFLOW_CONTEXTMENU_REG_ID,
-				provider, getSite().getSelectionProvider());
-
-		// enable viewer as drop target for template transfers
-		viewer_
-				.addDropTargetListener((TransferDropTargetListener) new PageflowTemplateTransferDropTargetListener(
-						viewer_));
-
-	}
-
-	/**
-	 * Returns the pageflow that is edited.
-	 * 
-	 * @return - the pageflow that is edited
-	 */
-	public Pageflow getPageflow() {
-		return getPageflowManager().getModel();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see AbstractEditorPage#getGraphicalViewerForZoomSupport()
-	 */
-	public GraphicalViewer getGraphicalViewer() {
-		return viewer;
-	}
-
-	/**
-	 * @param contents
-	 */
-	public void setGraphicalViewerContents(Object contents) {
-		viewer.setContents(contents);
-		propertyChange(null);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see IAdaptable#getAdapter(Class)
-	 */
-	public Object getAdapter(Class type) {
-		if (type == IContentOutlinePage.class) {
-			return getOutlinePage();
-		} else if (type == CommandStack.class) {
-			return getCommandStack();
-		} else if (type == ActionRegistry.class) {
-			return getActionRegistry();
-		} else if (type == IPropertySheetPage.class) {
-			return getPropertySheetPage();
-		} else if (type == ZoomManager.class) {
-			return getZoomManager(getGraphicalViewer());
-		}
-		return super.getAdapter(type);
-	}
-
-	/**
-	 * Returns the outline page for the outline view with lazy creation
-	 * 
-	 * @return - the outline page
-	 */
-	protected PageflowEditorOutlinePage getOutlinePage() {
-		PageflowEditorOutlinePage outlinePage = new PageflowEditorOutlinePage(
-				this);
-		outlinePage.initialize(this);
-		return outlinePage;
-	}
-
-	/**
-	 * Returns the undoable <code>PropertySheetPage</code> for this editor.
-	 * 
-	 * @return - the undoable <code>PropertySheetPage</code>
-	 */
-	protected IPropertySheetPage getPropertySheetPage() {
-		if (null == undoablePropertySheetPage) {
-			undoablePropertySheetPage = new PropertySheetPage();
-
-			/** set the property source for property sheet page */
-			undoablePropertySheetPage
-					.setRootEntry(new org.eclipse.gef.ui.properties.UndoablePropertySheetEntry(
-							(CommandStack) getAdapter(CommandStack.class)));
-
-		}
-
-		return undoablePropertySheetPage;
-	}
-
-	/**
-	 * Returns the selection syncronizer object. The synchronizer can be used to
-	 * sync the selection of 2 or more EditPartViewers.
-	 * 
-	 * @return - the syncrhonizer
-	 */
-	protected SelectionSynchronizer getSelectionSynchronizer() {
-		if (null == synchronizer) {
-			synchronizer = new SelectionSynchronizer();
-		}
-		return synchronizer;
-	}
-
-	/**
-	 * Returns the shared KeyHandler that should be used for all viewers.
-	 * 
-	 * @return - the shared KeyHandler
-	 */
-	protected KeyHandler getSharedKeyHandler() {
-		if (null == sharedKeyHandler) {
-			sharedKeyHandler = new KeyHandler();
-
-			// configure common keys for all viewers
-			sharedKeyHandler
-					.put(KeyStroke.getPressed(SWT.DEL, 127, 0),
-							getActionRegistry().getAction(
-									ActionFactory.DELETE.getId()));
-			sharedKeyHandler.put(KeyStroke.getPressed(SWT.F2, 0),
-					getActionRegistry().getAction(
-							GEFActionConstants.DIRECT_EDIT));
-		}
-		return sharedKeyHandler;
-	}
-
-	/**
-	 * Returns the selection listener.
-	 * 
-	 * @return - the <code>ISelectionListener</code>
-	 */
-	protected ISelectionListener getSelectionListener() {
-		return selectionListener;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent)
-	 */
-	public void propertyChange(PropertyChangeEvent event) {
-		String property = (event == null) ? null : event.getProperty();
-
-		propagateProperty(property, viewer.getRootEditPart());
-	}
-
-	/**
-	 * propagate property change to children edit part
-	 * 
-	 * @param property -
-	 *            property's string name
-	 * @param part -
-	 *            parent edit part.
-	 */
-	private void propagateProperty(String property, EditPart part) {
-		processPropertyChange(property, part);
-
-		if (part instanceof GraphicalEditPart) {
-			// get the connections edit part
-			Iterator iterConns = ((GraphicalEditPart) part)
-					.getSourceConnections().iterator();
-			while (iterConns.hasNext()) {
-				EditPart child = (EditPart) iterConns.next();
-				propagateProperty(property, child);
-			}
-		}
-		Iterator iter = part.getChildren().iterator();
-		while (iter.hasNext()) {
-			EditPart child = (EditPart) iter.next();
-			propagateProperty(property, child);
-		}
-	}
-
-	/**
-	 * process the property change FIXME: The property change should be category
-	 * to improve the performance.
-	 * 
-	 * @param property -
-	 *            property's string name
-	 * @param part
-	 */
-	private void processPropertyChange(String property, EditPart part) {
-		IPreferenceStore store = EditorPlugin.getDefault().getPreferenceStore();
-
-		if (property != null
-				&& property.equals(GEMPreferences.USE_SYSTEM_COLORS)) {
-			// reload all properties - it's easiest
-			property = null;
-		}
-
-		if (property == null || GEMPreferences.SNAP_TO_GRID.equals(property)) {
-			boolean bSnapToGrid = store.getBoolean(GEMPreferences.SNAP_TO_GRID);
-			if (part instanceof ILayerPanePreference) {
-				((ILayerPanePreference) part).setGridVisible(bSnapToGrid);
-			}
-		}
-
-		if (property == null || GEMPreferences.GRID_WIDTH.equals(property)
-				|| GEMPreferences.GRID_HEIGHT.equals(property)) {
-			Dimension gridSpacing = new Dimension(store
-					.getInt(GEMPreferences.GRID_WIDTH), store
-					.getInt(GEMPreferences.GRID_HEIGHT));
-			if (part instanceof ILayerPanePreference) {
-				((ILayerPanePreference) part).setGridSpacing(gridSpacing);
-			}
-		}
-
-		if (property == null || GEMPreferences.GRID_COLOR.equals(property)) {
-			Color gridFgColor = GEMPreferences.getColor(store,
-					GEMPreferences.GRID_COLOR);
-			if (part instanceof ILayerPanePreference) {
-				((ILayerPanePreference) part)
-						.setGridForegroundColor(gridFgColor);
-			}
-		}
-
-		if (property == null || GEMPreferences.CANVAS_COLOR.equals(property)) {
-			Color containerBgColor = GEMPreferences.getColor(store,
-					GEMPreferences.CANVAS_COLOR);
-			if (part instanceof IFigurePreference) {
-				((IFigurePreference) part).setBackgroundColor(containerBgColor);
-			}
-		}
-
-		if (property == null || GEMPreferences.LINE_WIDTH.equals(property)) {
-			int linkLineWidth = store.getInt(GEMPreferences.LINE_WIDTH);
-
-			if (part instanceof IConnectionPreference) {
-				((IConnectionPreference) part).setLineWidth(linkLineWidth);
-			}
-		}
-
-		if (property == null || GEMPreferences.LINE_COLOR.equals(property)) {
-			Color linkLineColor = GEMPreferences.getColor(store,
-					GEMPreferences.LINE_COLOR);
-			if (part instanceof IConnectionPreference) {
-				((IConnectionPreference) part)
-						.setForegroundColor(linkLineColor);
-			}
-		}
-
-		if (property == null
-				|| GEMPreferences.SHOW_LINE_LABELS.equals(property)) {
-			boolean bLinkLabelVisible = store
-					.getBoolean(GEMPreferences.SHOW_LINE_LABELS);
-			if (part instanceof IConnectionPreference) {
-				((IConnectionPreference) part)
-						.setLabelVisible(bLinkLabelVisible);
-			}
-		}
-
-		if (property == null || GEMPreferences.LINE_LABEL_FONT.equals(property)
-				|| GEMPreferences.LINE_LABEL_FONT_COLOR.equals(property)) {
-			Font linkLabelFont = getLinkLabelFont();
-			Color linkLabelFgColor = GEMPreferences.getColor(store,
-					GEMPreferences.LINE_LABEL_FONT_COLOR);
-			if (part instanceof IConnectionPreference) {
-				((IConnectionPreference) part).setFont(linkLabelFont);
-				((IConnectionPreference) part)
-						.setLabelForegroundColor(linkLabelFgColor);
-			}
-		}
-
-		if (property == null
-				|| GEMPreferences.LINE_LABEL_COLOR.equals(property)) {
-			Color linkLabelBgColor = GEMPreferences.getColor(store,
-					GEMPreferences.LINE_LABEL_COLOR);
-			if (part instanceof IConnectionPreference) {
-				((IConnectionPreference) part)
-						.setLabelBackgroundColor(linkLabelBgColor);
-			}
-		}
-
-		if (property == null || GEMPreferences.LINE_ROUTING.equals(property)) {
-			String connectionStyle = store
-					.getString(GEMPreferences.LINE_ROUTING);
-			int style;
-			if (GEMPreferences.LINE_ROUTING_MANHATTAN.equals(connectionStyle)) {
-				style = ILayerPanePreference.LINE_ROUTING_MANHATTAN;
-			} else {
-				style = ILayerPanePreference.LINE_ROUTING_MANUAL;
-			}
-
-			if (part instanceof ILayerPanePreference) {
-				((ILayerPanePreference) part).setConnectionRouterStyle(style);
-			} else if (part instanceof IConnectionPreference) {
-				((IConnectionPreference) part).setConnectionRouterStyle(style);
-			}
-		}
-
-		if (property == null
-				|| GEMPreferences.FIGURE_LABEL_FONT.equals(property)
-				|| GEMPreferences.FIGURE_LABEL_FONT_COLOR.equals(property)) {
-			Font nodeLabelFont = getNodeLabelFont();
-			Color nodeLabelFgColor = GEMPreferences.getColor(store,
-					GEMPreferences.FIGURE_LABEL_FONT_COLOR);
-
-			if (part instanceof INodePreference) {
-				((INodePreference) part).setFont(nodeLabelFont);
-				((INodePreference) part).setForegroundColor(nodeLabelFgColor);
-			}
-		}
-
-		if (property == null || GEMPreferences.LABEL_PLACEMENT.equals(property)) {
-			int placement = PositionConstants.SOUTH;
-			String nodeLabelPlacement = store
-					.getString(GEMPreferences.LABEL_PLACEMENT);
-			if (GEMPreferences.LABEL_PLACEMENT_TOP.equals(nodeLabelPlacement))
-				placement = PositionConstants.NORTH;
-			else if (GEMPreferences.LABEL_PLACEMENT_BOTTOM
-					.equals(nodeLabelPlacement))
-				placement = PositionConstants.SOUTH;
-			else if (GEMPreferences.LABEL_PLACEMENT_LEFT
-					.equals(nodeLabelPlacement))
-				placement = PositionConstants.WEST;
-			else if (GEMPreferences.LABEL_PLACEMENT_RIGHT
-					.equals(nodeLabelPlacement))
-				placement = PositionConstants.EAST;
-			if (part instanceof INodePreference)
-				((INodePreference) part).setTextPlacement(placement);
-		}
-	}
-
-	private Font getLinkLabelFont() {
-		FontRegistry registry = JFaceResources.getFontRegistry();
-		IPreferenceStore store = EditorPlugin.getDefault().getPreferenceStore();
-		FontData fontData = PreferenceConverter.getFontData(store,
-				GEMPreferences.LINE_LABEL_FONT);
-		if (!registry.get(fontData.toString()).equals(registry.defaultFont()))
-			return registry.get(fontData.toString());
-		
-		registry.put(fontData.toString(), new FontData[] {fontData});
-		return registry.get(fontData.toString());
-	}
-
-	private Font getNodeLabelFont() {
-		FontRegistry registry = JFaceResources.getFontRegistry();
-		IPreferenceStore store = EditorPlugin.getDefault().getPreferenceStore();
-		FontData fontData = PreferenceConverter.getFontData(store,
-				GEMPreferences.FIGURE_LABEL_FONT);
-		if (!registry.get(fontData.toString()).equals(registry.defaultFont()))
-			return registry.get(fontData.toString());
-		
-		registry.put(fontData.toString(), new FontData[] {fontData});
-		return registry.get(fontData.toString());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.ide.IGotoMarker#gotoMarker(org.eclipse.core.resources.IMarker)
-	 */
-	public void gotoMarker(IMarker marker) {
-		// The LOCATION attribute in the marker should be the ID string
-		Object id = null;
-		try {
-			id = marker.getAttribute(IMarker.LOCATION);
-		} catch (CoreException e) {
-			// Pageflow.PageflowEditor.Error.invalidMarkerAttribute = Unable to
-			// get marker's attribute
-			log
-					.error(
-							"Pageflow.PageflowEditor.Error.invalidMarkerAttribute", //$NON-NLS-1$
-							e);
-		}
-		if (id instanceof String) {
-			GraphicalEditPart part = EditPartMarkerUtil.findEditPart(
-					(GraphicalEditPart) getGraphicalViewer().getRootEditPart(),
-					(String) id);
-			if (part != null) {
-				getGraphicalViewer().reveal(part);
-				getGraphicalViewer().select(part);
-				return;
-			}
-		}
-
-	}
-
-	/**
-	 * the related web page is changed in outside editor, the pageflow should be
-	 * revalidated to update the validation icons
-	 * 
-	 * @param fullPath
-	 */
-	public void webPageChanged(IPath fullPath) {
-		PageflowPage page = getPageflowManager().foundPage(
-				WebrootUtil.getWebPath(fullPath));
-
-		if (page != null && getGraphicalViewer() != null
-				&& getGraphicalViewer().getRootEditPart() != null) {
-			GraphicalEditPart pagePart = EditPartMarkerUtil.findEditPart(
-					(GraphicalEditPart) getGraphicalViewer().getRootEditPart(),
-					page.getId());
-			PageflowAnnotationUtil
-					.validatePage((PageflowNodeEditPart) pagePart);
-		}
-	}
-
-	/**
-	 * Get the image desriptor from the view's id.
-	 * 
-	 * @param viewid
-	 * @return
-	 */
-	private ImageDescriptor getImageDescriptorForView(String viewid) {
-		IConfigurationElement[] elements = Platform.getExtensionRegistry()
-				.getConfigurationElementsFor("org.eclipse.ui.views"); //$NON-NLS-1$
-		for (int i = 0; i < elements.length; i++) {
-			String name = elements[i].getName();
-			String id = elements[i].getAttribute("id"); //$NON-NLS-1$
-			if ("view".equals(name) && viewid.equals(id)) { //$NON-NLS-1$
-				String iconPath = elements[i].getAttribute("icon"); //$NON-NLS-1$
-				if (iconPath != null) {
-					return AbstractUIPlugin.imageDescriptorFromPlugin(
-							elements[i].getDeclaringExtension().getContributor().getName(),
-							iconPath);
-				}
-			}
-		}
-		return null;
-	}
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/PageflowEditorContextMenuProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/PageflowEditorContextMenuProvider.java
deleted file mode 100644
index 3e23919..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/PageflowEditorContextMenuProvider.java
+++ /dev/null
@@ -1,242 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow;
-
-import org.eclipse.gef.ContextMenuProvider;
-import org.eclipse.gef.EditPartViewer;
-import org.eclipse.gef.ui.actions.ActionRegistry;
-import org.eclipse.gef.ui.actions.GEFActionConstants;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jst.jsf.facesconfig.ui.FacesConfigEditor;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.action.ShowPropertyViewAction;
-import org.eclipse.ui.actions.ActionFactory;
-
-/**
- * This is the context menu provider for pageflow editor.
- * 
- */
-public class PageflowEditorContextMenuProvider extends ContextMenuProvider {
-	/** the action registry */
-	private final ActionRegistry actionRegistry;
-
-	/**
-	 * Creates a new PageflowEditorContextMenuProvider instance.
-	 * 
-	 * @param viewer -
-	 *            the editor viewer
-	 * @param actionRegistry -
-	 *            action registry of the editor
-	 */
-	public PageflowEditorContextMenuProvider(EditPartViewer viewer,
-			ActionRegistry actionRegistry) {
-		super(viewer);
-
-		this.actionRegistry = actionRegistry;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ContextMenuProvider#buildContextMenu(IMenuManager)
-	 */
-	public void buildContextMenu(IMenuManager menuManager) {
-		// add GEF menu groups, such as undo, edit, save, etc.
-		GEFActionConstants.addStandardActionGroups(menuManager);
-
-		// add typical undo/redo commands
-		appendActionToUndoGroup(menuManager, ActionFactory.UNDO.getId());
-		appendActionToUndoGroup(menuManager, ActionFactory.REDO.getId());
-		// add edit commands, including copy, paste, delete
-		appendActionToEditGroup(menuManager, ActionFactory.COPY.getId());
-		appendActionToEditGroup(menuManager, ActionFactory.PASTE.getId());
-		appendActionToEditGroup(menuManager, ActionFactory.DELETE.getId());
-		// Add Open Editor Action
-		appendActionToEditGroup(menuManager, FacesConfigEditor.EDITOR_ID);
-
-		// append the save submenu
-		appendActionToSaveGroup(menuManager, ActionFactory.SAVE.getId());
-
-		// append the alignment submenu, including top, bottom, middle, left,
-		// right and center.
-		appendAlignmentSubmenu(menuManager);
-
-		appendShowViewSubmenu(menuManager);
-
-	}
-
-	/**
-	 * Appends the alignment subment.
-	 * 
-	 * @param menuManager
-	 *            manager of workbench
-	 */
-	private void appendShowViewSubmenu(IMenuManager menuManager) {
-		// Show View Actions
-		MenuManager submenu = new MenuManager(
-				PageflowMessages.Pageflow_Contextmenu_ShowView_Label);
-
-		IAction action = getActionRegistry().getAction(
-				ShowPropertyViewAction.SHOW_PROPERTY_VIEW);
-		if (null != action && action.isEnabled()) {
-			submenu.add(action);
-		}
-
-		// action = getActionRegistry().getAction(
-		// ShowPaletteViewAction.SHOW_PALETTE_VIEW);
-		// if (null != action && action.isEnabled()) {
-		// submenu.add(action);
-		// }
-
-		if (!submenu.isEmpty()) {
-			menuManager.appendToGroup(GEFActionConstants.GROUP_REST, submenu);
-		}
-	}
-
-	/**
-	 * Appends the alignment subment.
-	 * 
-	 * @param menuManager
-	 *            manager of workbench
-	 */
-	private void appendAlignmentSubmenu(IMenuManager menuManager) {
-		// Alignment Actions
-		MenuManager submenu = new MenuManager(
-				PageflowMessages.Pageflow_Contextmenu_Align_Label);
-
-		IAction action = getActionRegistry().getAction(
-				GEFActionConstants.ALIGN_LEFT);
-		if (null != action && action.isEnabled()) {
-			submenu.add(action);
-		}
-
-		action = getActionRegistry().getAction(GEFActionConstants.ALIGN_CENTER);
-		if (null != action && action.isEnabled()) {
-			submenu.add(action);
-		}
-
-		action = getActionRegistry().getAction(GEFActionConstants.ALIGN_RIGHT);
-		if (null != action && action.isEnabled()) {
-			submenu.add(action);
-		}
-
-		action = getActionRegistry().getAction(GEFActionConstants.ALIGN_TOP);
-		if (null != action && action.isEnabled()) {
-			submenu.add(action);
-		}
-
-		action = getActionRegistry().getAction(GEFActionConstants.ALIGN_MIDDLE);
-		if (null != action && action.isEnabled()) {
-			submenu.add(action);
-		}
-
-		action = getActionRegistry().getAction(GEFActionConstants.ALIGN_BOTTOM);
-		if (null != action && action.isEnabled()) {
-			submenu.add(action);
-		}
-
-		if (!submenu.isEmpty()) {
-			menuManager.appendToGroup(GEFActionConstants.GROUP_EDIT, submenu);
-		}
-	}
-
-	/**
-	 * Returns the action registry.
-	 * 
-	 * @return - the action registry
-	 */
-	protected ActionRegistry getActionRegistry() {
-		return actionRegistry;
-	}
-
-	/**
-	 * Appends the specified action to the specified menu group
-	 * 
-	 * @param menu -
-	 *            menu manager
-	 * @param actionId -
-	 *            action's ID
-	 * @param menuGroup -
-	 *            menu group name
-	 */
-	 // TODO: dead code
-//	private void appendActionToMenu(IMenuManager menu, String actionId,
-//			String menuGroup) {
-//		IAction action = getActionRegistry().getAction(actionId);
-//		if (null != action && action.isEnabled()) {
-//			menu.appendToGroup(menuGroup, action);
-//		}
-//	}
-
-	/**
-	 * Appends the specified action to the 'Undo' menu group
-	 * 
-	 * @param menu -
-	 *            menu manager
-	 * @param actionId -
-	 *            action's ID
-	 */
-	private void appendActionToUndoGroup(IMenuManager menu, String actionId) {
-		IAction action = getActionRegistry().getAction(actionId);
-		if (null != action && action.isEnabled()) {
-			menu.appendToGroup(GEFActionConstants.GROUP_UNDO, action);
-		}
-	}
-
-	/**
-	 * Appends the specified action to the 'edit' menu group
-	 * 
-	 * @param menu -
-	 *            menu manager
-	 * @param actionId -
-	 *            action's ID
-	 */
-	private void appendActionToEditGroup(IMenuManager menu, String actionId) {
-		IAction action = getActionRegistry().getAction(actionId);
-		if (null != action && action.isEnabled()) {
-			menu.appendToGroup(GEFActionConstants.GROUP_EDIT, action);
-		}
-	}
-
-	/**
-	 * Appends the specified action to the 'add' menu group
-	 * 
-	 * @param menu -
-	 *            menu manager
-	 * @param actionId -
-	 *            action's ID
-	 */
-	 // TODO: dead code
-//	private void appendActionToAddGroup(IMenuManager menu, String actionId) {
-//		IAction action = getActionRegistry().getAction(actionId);
-//		if (null != action && action.isEnabled()) {
-//			menu.appendToGroup(GEFActionConstants.GROUP_ADD, action);
-//		}
-//	}
-
-	/**
-	 * Appends the specified action to the 'save' menu group
-	 * 
-	 * @param menu -
-	 *            menu manager
-	 * @param actionId -
-	 *            action's ID
-	 */
-	private void appendActionToSaveGroup(IMenuManager menu, String actionId) {
-		IAction action = getActionRegistry().getAction(actionId);
-		if (null != action && action.isEnabled()) {
-			menu.appendToGroup(GEFActionConstants.GROUP_SAVE, action);
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/PageflowEditorOutlinePage.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/PageflowEditorOutlinePage.java
deleted file mode 100644
index 82ca489..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/PageflowEditorOutlinePage.java
+++ /dev/null
@@ -1,545 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.LightweightSystem;
-import org.eclipse.draw2d.MarginBorder;
-import org.eclipse.draw2d.Viewport;
-import org.eclipse.draw2d.parts.ScrollableThumbnail;
-import org.eclipse.gef.ContextMenuProvider;
-import org.eclipse.gef.EditDomain;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPartListener;
-import org.eclipse.gef.EditPartViewer;
-import org.eclipse.gef.LayerConstants;
-import org.eclipse.gef.RootEditPart;
-import org.eclipse.gef.editparts.ScalableFreeformRootEditPart;
-import org.eclipse.gef.editparts.ScalableRootEditPart;
-import org.eclipse.gef.ui.parts.TreeViewer;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart.PageflowTreePartFactory;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Canvas;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.ui.part.EditorPart;
-import org.eclipse.ui.part.Page;
-import org.eclipse.ui.part.PageBook;
-import org.eclipse.ui.views.contentoutline.IContentOutlinePage;
-
-/**
- * This is an implementation of an outline page showing an overview figure and
- * an tree outline of the main graphical viewer provided by the current active
- * page of an multi page editor.
- * 
- */
-public class PageflowEditorOutlinePage extends Page implements
-		IContentOutlinePage {
-	/** the pageflow editor */
-	private final PageflowEditor editor;
-
-	/** the outlineContent for the tree viewer */
-	private PageflowElement outlineContent = null;
-
-	/** the control of the overview */
-	private Canvas overview = null;
-
-	/** the root edit part (outlineContent for the thumbnail) */
-	private RootEditPart overviewContent = null;
-
-	/** the thumbnail */
-	private ScrollableThumbnail thumbnail = null;
-
-	/** the tree viewer */
-	private TreeViewer treeViewer = null;
-
-	/** the control of the tree view */
-	private Control outline = null;
-
-	/** the pagebook */
-	private PageBook pageBook = null;
-
-	/** action for showing the tree page */
-	private IAction showOutlineAction = null;
-
-	/** action for showing the overview page */
-	private IAction showOverviewAction = null;
-
-	/** the LightweightSystem */
-	private LightweightSystem lws = null;
-
-	/** the edit domain */
-	private EditDomain editDomain = null;
-
-	/**
-	 * Creates a new PageflowEditorOutlinePage instance.
-	 * 
-	 * @param editor -
-	 *            Pageflow Editor
-	 */
-	public PageflowEditorOutlinePage(EditorPart editor) {
-		super();
-		this.editor = (PageflowEditor) editor;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ISelectionProvider#addSelectionChangedListener(ISelectionChangedListener)
-	 */
-	public void addSelectionChangedListener(ISelectionChangedListener listener) {
-		getTreeViewer().addSelectionChangedListener(listener);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see IPage#createControl(Composite)
-	 */
-	public void createControl(Composite parent) {
-		// pagebook
-		pageBook = new PageBook(parent, SWT.NONE);
-
-		// tree viewer control
-		outline = getTreeViewer().createControl(pageBook);
-		configureEditPartViewer(getTreeViewer());
-
-		// overview canvas
-		overview = new Canvas(pageBook, SWT.NONE);
-		lws = new LightweightSystem(overview);
-
-		// create actions
-		IToolBarManager tbm = getSite().getActionBars().getToolBarManager();
-		showOutlineAction = new Action() {
-			public void run() {
-				showPage(outline);
-			}
-		};
-		showOutlineAction.setImageDescriptor(EditorPlugin.getDefault()
-				.getImageDescriptor("facesconfig/Pageflow_Outline.gif")); //$NON-NLS-1$
-		tbm.add(showOutlineAction);
-		showOverviewAction = new Action() {
-			public void run() {
-				showPage(overview);
-			}
-		};
-		showOverviewAction.setImageDescriptor(EditorPlugin.getDefault()
-				.getImageDescriptor("facesconfig/Pageflow_Outline_Overview.gif")); //$NON-NLS-1$
-		tbm.add(showOverviewAction);
-
-		// initialize outline page
-		initializeOutlineViewer();
-
-		// initialize overview
-		initializeOverview();
-
-		// initialize pagebook
-		showPage(outline);
-	}
-
-	/**
-	 * Configures the outline viewer
-	 */
-	private void initializeOutlineViewer() {
-		if (null != getEditDomain()) {
-			getEditDomain().addViewer(getTreeViewer());
-		}
-		// getTreeViewer().setEditPartFactory(new PageflowTreePartFactory());
-
-		// synchronize selections
-		editor.getSelectionSynchronizer().addViewer(getTreeViewer());
-
-		// add content
-		getTreeViewer().setContents(getOutlineContent());
-	}
-
-	/**
-	 * Shows the spcified page.
-	 * 
-	 * @param id -
-	 *            control id of pagebook in outline page. it is can be _outline
-	 *            or _overview
-	 */
-	protected void showPage(Control id) {
-		if (id == outline) {
-			showOutlineAction.setChecked(true);
-			showOverviewAction.setChecked(false);
-			pageBook.showPage(outline);
-			if (thumbnail != null) {
-				thumbnail.setVisible(false);
-			}
-		} else if (id == overview) {
-			showOutlineAction.setChecked(false);
-			showOverviewAction.setChecked(true);
-			pageBook.showPage(overview);
-			if (thumbnail != null) {
-				thumbnail.setVisible(true);
-			}
-		}
-	}
-
-	/**
-	 * Returns the current edit domain.
-	 * 
-	 * @return - the edit domain
-	 */
-	public EditDomain getEditDomain() {
-		return editDomain;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see IPage#dispose()
-	 */
-	public void dispose() {
-		editor.getSelectionSynchronizer().removeViewer(getTreeViewer());
-
-		if (null != thumbnail) {
-			thumbnail.deactivate();
-		}
-
-		super.dispose();
-	}
-
-	/**
-	 * initialize Overview.
-	 * 
-	 */
-	private void initializeOverview() {
-		// check if control was created
-		if (null == lws) {
-			return;
-		}
-
-		// deactivate old thumbnail
-		if (null != thumbnail) {
-			thumbnail.deactivate();
-		}
-
-		// create empty thumbnail
-		thumbnail = new ScrollableThumbnail();
-		thumbnail.setBorder(new MarginBorder(3));
-		lws.setContents(thumbnail);
-
-		// initialize thumbnail
-		if (null != getOverviewContent()) {
-			Viewport viewport = null;
-			IFigure source = null;
-			if (getOverviewContent() instanceof ScalableFreeformRootEditPart) {
-				viewport = (Viewport) ((ScalableFreeformRootEditPart) getOverviewContent())
-						.getFigure();
-				source = ((ScalableFreeformRootEditPart) getOverviewContent())
-						.getLayer(LayerConstants.PRINTABLE_LAYERS);
-			}
-			if (getOverviewContent() instanceof ScalableRootEditPart) {
-				viewport = (Viewport) ((ScalableRootEditPart) getOverviewContent())
-						.getFigure();
-				source = ((ScalableRootEditPart) getOverviewContent())
-						.getLayer(LayerConstants.PRINTABLE_LAYERS);
-			}
-
-			if (null != viewport && null != source) {
-				thumbnail.setViewport(viewport);
-				thumbnail.setSource(source);
-			}
-		}
-	}
-
-	/**
-	 * Returns the outlineContent.
-	 * 
-	 * @return - the outlineContent
-	 */
-	public PageflowElement getOutlineContent() {
-		return outlineContent;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see IPage#getControl()
-	 */
-	public Control getControl() {
-		return pageBook;
-	}
-
-	/**
-	 * Returns the root edit part
-	 * 
-	 * @return - the root edit part
-	 */
-	public RootEditPart getOverviewContent() {
-		return overviewContent;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ISelectionProvider#getSelection()
-	 */
-	public ISelection getSelection() {
-		return getTreeViewer().getSelection();
-	}
-
-	/**
-	 * Returns the tree viewer.
-	 * 
-	 * @return - the tree viewer
-	 */
-	public TreeViewer getTreeViewer() {
-		if (null == treeViewer) {
-			treeViewer = new TreeViewer();
-			treeViewer.setEditPartFactory(new PageflowTreePartFactory());
-		}
-
-		return treeViewer;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ISelectionProvider#removeSelectionChangedListener(ISelectionChangedListener)
-	 */
-	public void removeSelectionChangedListener(
-			ISelectionChangedListener listener) {
-		getTreeViewer().removeSelectionChangedListener(listener);
-	}
-
-	/**
-	 * Sets the outlineContent.
-	 * 
-	 * @param element -
-	 *            Pageflow Element
-	 */
-	public void setOutlineContent(PageflowElement element) {
-		if (outlineContent != element) {
-			outlineContent = element;
-
-			// refresh viewer
-			if (null != getTreeViewer().getControl()) {
-				getTreeViewer().setContents(element);
-
-				// bugfix: something is overwriting visibility
-				if (null != pageBook) {
-					if (showOverviewAction.isChecked()) {
-						showPage(outline);
-						showPage(overview);
-					} else {
-						showPage(outline);
-					}
-				}
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see IPage#setFocus()
-	 */
-	public void setFocus() {
-		if (getControl() != null) {
-			getControl().setFocus();
-		}
-	}
-
-	/**
-	 * Sets the root edit part.
-	 * 
-	 * @param part -
-	 *            root edit part for pageflow model
-	 */
-	public void setOverviewContent(RootEditPart part) {
-		if (overviewContent != part) {
-			overviewContent = part;
-			// reinitialize thumbnail
-			// if (null != thumbnail && thumbnail.isVisible())
-			initializeOverview();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ISelectionProvider#setSelection(ISelection)
-	 */
-	public void setSelection(ISelection selection) {
-		getTreeViewer().setSelection(selection);
-	}
-
-	/**
-	 * Initializes this outline page from a given editor page.
-	 * 
-	 * @param newPage -
-	 *            Pageflow EditorPage
-	 */
-	public void initialize(PageflowEditor newPage) {
-		if (null != newPage.getGraphicalViewer()) {
-			setOverviewContent(newPage.getGraphicalViewer().getRootEditPart());
-			EditPart currentContent = newPage.getGraphicalViewer()
-					.getContents();
-			setOutlineContent(null != currentContent ? (PageflowElement) currentContent
-					.getModel()
-					: null);
-			setEditDomain(newPage.getEditDomain());
-			getViewerContentListener().setViewer(newPage.getGraphicalViewer());
-		} else {
-			setOverviewContent(null);
-			setOutlineContent(null);
-			setEditDomain(null);
-		}
-	}
-
-	/**
-	 * Sets the edit domain.
-	 * 
-	 * @param domain -
-	 *            editor's edit domain
-	 */
-	public void setEditDomain(EditDomain domain) {
-		if (editDomain != domain) {
-			// refresh viewer
-			if (null != getTreeViewer()) {
-				if (null != editDomain) {
-					editDomain.removeViewer(getTreeViewer());
-				}
-				if (null != domain) {
-					domain.addViewer(getTreeViewer());
-				}
-			}
-			editDomain = domain;
-		}
-	}
-
-	/**
-	 * the current viewer content listener
-	 */
-	private final ViewerContentListener viewerContentListener = new ViewerContentListener();
-
-	/**
-	 * This class listens for changes of the content of an EditPartViewer. If
-	 * the content changed, it will update the outline viewer.
-	 * <p>
-	 * Important: this class has to be disposed with
-	 * <code>setViewer(null)</code>.
-	 * 
-	 * @author Gunnar Wagenknecht
-	 */
-	private class ViewerContentListener implements EditPartListener {
-		/* the viewer */
-		private EditPartViewer _viewer;
-
-		/**
-		 * Sets a new viewer. <code>null</code> is allowed to dispose.
-		 * 
-		 * @param viewer
-		 */
-		public void setViewer(EditPartViewer viewer) {
-			if (null != this._viewer)
-				this._viewer.getRootEditPart().removeEditPartListener(this);
-
-			this._viewer = viewer;
-
-			if (null != this._viewer)
-				this._viewer.getRootEditPart().addEditPartListener(this);
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.gef.EditPartListener#childAdded(org.eclipse.gef.EditPart,
-		 *      int)
-		 */
-		public void childAdded(EditPart child, int index) {
-			// this is out event, update the viewers
-			if (child.getModel() instanceof PageflowElement)
-				setOutlineContent((PageflowElement) child.getModel());
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.gef.EditPartListener#partActivated(org.eclipse.gef.EditPart)
-		 */
-		public void partActivated(EditPart editpart) {
-            // do nothing
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.gef.EditPartListener#partDeactivated(org.eclipse.gef.EditPart)
-		 */
-		public void partDeactivated(EditPart editpart) {
-            // do nothing
-        }
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.gef.EditPartListener#removingChild(org.eclipse.gef.EditPart,
-		 *      int)
-		 */
-		public void removingChild(EditPart child, int index) {
-            // do nothing
-        }
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.gef.EditPartListener#selectedStateChanged(org.eclipse.gef.EditPart)
-		 */
-		public void selectedStateChanged(EditPart editpart) {
-            // do nothing
-		}
-	}
-
-	/**
-	 * Returns the viewer content listener.
-	 * 
-	 * @return the viewer content listener
-	 */
-	private ViewerContentListener getViewerContentListener() {
-		return viewerContentListener;
-	}
-
-	/**
-	 * Configures the specified <code>EditPartViewer</code>.
-	 * 
-	 * @param viewer
-	 */
-	protected void configureEditPartViewer(EditPartViewer viewer) {
-		// configure the shared key handler
-		if (viewer.getKeyHandler() != null) {
-			viewer.getKeyHandler().setParent(editor.getSharedKeyHandler());
-		}
-
-		// configure the context menu
-		ContextMenuProvider provider = new PageflowEditorContextMenuProvider(
-				viewer, editor.getActionRegistry());
-		viewer.setContextMenu(provider);
-		getSite().registerContextMenu(
-				EditorPlugin.getPluginId()
-						+ ".pageflow.editor.outlineview.contextmenu", provider, //$NON-NLS-1$
-				getSite().getSelectionProvider());
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/PageflowMessages.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/PageflowMessages.java
deleted file mode 100644
index a64b442..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/PageflowMessages.java
+++ /dev/null
@@ -1,483 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * Pageflow message bundle
- *
- */
-public final class PageflowMessages extends NLS {
-
-	private static final String BUNDLE_NAME = "org.eclipse.jst.jsf.facesconfig.ui.pageflow.PageflowMessages"; //$NON-NLS-1$
-
-	private PageflowMessages() {
-		// Do not instantiate
-	}
-
-	static {
-		NLS.initializeMessages(BUNDLE_NAME, PageflowMessages.class);
-	}
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Label_True;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Label_False;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Label_Saving;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Dialog_Label_CreateFileTitle;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Dialog_Label_FileNotExistedPart1;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Dialog_Label_FileNotExistedPart2;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Action_OpenEditor_Label;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Action_OpenEditor_ToolTip;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Action_ShowPropertyView_Label;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Action_ShowPropertyView_ToolTip;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Action_ShowPaletteView_Label;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Action_ShowPaletteView_ToolTip;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Action_SyncWithFacesConfig_Label;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Action_SyncWithFacesConfig_ToolTip;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Action_UpdateFacesConfig_Label;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Action_UpdateFacesConfig_ToolTip;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_PaletteTool_Group_Controls;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_PaletteTool_Select_Label;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_PaletteTool_Select_Description;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_PaletteTool_Marquee_Label;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_PaletteTool_Marquee_Description;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_PaletteTool_Link_Label;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_PaletteTool_Link_Description;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_PaletteTool_Group_Nodes;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_PaletteTool_Begin_Label;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_PaletteTool_Begin_Description;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_PaletteTool_End_Label;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_PaletteTool_End_Description;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_PaletteTool_Action_Label;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_PaletteTool_Action_Description;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_PaletteTool_Page_Label;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_PaletteTool_Page_Description;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Contextmenu_Align_Label;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Contextmenu_ShowView_Label;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Commands_AddNodeCommand_Label;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Commands_CreateNodeCommand_Label;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Commands_DeleteNodeCommand_Label;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Commands_ConnectionCommand_Label;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Commands_CreateBendpointCommand_Label;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Commands_MoveBendpointCommand_Label;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Commands_DeleteBendpointCommand_Label;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Commands_OpenEditorCommand_Label;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Commands_OrphanChildCommand_Label;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Commands_UpdatePageflowCommand_Label;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Commands_CreateNodeCommand_SelectJSPDialog_Title;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Commands_CreateNodeCommand_SelectJSPDialog_Description;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Model_Attributes_comment;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Model_Attributes_name;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Model_Attributes_largeicon;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Model_Attributes_smallicon;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Model_Attributes_action;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Model_Attributes_path;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Model_Attributes_begin;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Model_Attributes_end;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Model_Attributes_configfile;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Model_Attributes_source;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Model_Attributes_target;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Model_Attributes_outcome;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Model_Attributes_redirect;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Model_Attributes_fromaction;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Model_Attributes_referenceLink;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Model_Items_Pageflow;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Model_Items_PFPage;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Model_Items_PFLink;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Property_Action_OutcomeSelectionDialog_Choice;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Property_Action_OutcomeSelectionDialog_Title;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Property_Action_OutcomeSelectionDialog_JSPName;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Property_Action_OutcomeSelectionDialog_ActionListTable_Title;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Property_Action_OutcomeSelectionDialog_ActionListTableWithJSP_Title;
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Property_Action_OutcomeSelectionDialog_ActionListTable_Component;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String PageflowLinkPropertySource_Title;
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String ProjectWebPageSelectionDialog_Description;
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String PageflowLinkPropertySource_Text;
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Property_Action_OutcomeSelectionDialog_ActionListTable_Action;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Property_Action_OutcomeSelectionDialog_Outcome;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Validation_UndefinedOutcome;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Validation_NotExistedSourcePage;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Validation_MissingSourcePage;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Validation_InvalidWebPage;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Validation_NotExitedWebPage;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Validation_MissingWebPage;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Validation_MissingManagedBean;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Validation_MissingAction;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String ExistingPagePathDialogCellEdito_LabelText;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String PageflowLinkEditPart_FromAction;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String PageflowLinkEditPart_FromOutcome;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String PageflowContainerEditPolicy_OrphanLabel;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String PageflowNode_NoRecursiveContainment;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String PageflowXYLayoutEditPolicy_Add;
-		
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String SetConstraintCommand_Resize;
-	
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String SetConstraintCommand_Location;
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/PageflowMessages.properties b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/PageflowMessages.properties
deleted file mode 100644
index 67a09e5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/PageflowMessages.properties
+++ /dev/null
@@ -1,158 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-####################################################
-# Generic Strings for UI
-####################################################
-Pageflow_Label_True=true
-Pageflow_Label_False=false
-
-Pageflow_Label_Saving=Saving  
-
-Pageflow_Dialog_Label_CreateFileTitle=Create File
-Pageflow_Dialog_Label_FileNotExistedPart1=The file 
-Pageflow_Dialog_Label_FileNotExistedPart2=doesn't exist. Click OK to create it.
-
-####################################################
-# Generic Strings for Action and PaletteTool
-####################################################
-Pageflow_Action_OpenEditor_Label=Open
-Pageflow_Action_OpenEditor_ToolTip=Open Page or Action component
-
-Pageflow_Action_ShowPropertyView_Label=Properties
-Pageflow_Action_ShowPropertyView_ToolTip=Show Properties View
-
-Pageflow_Action_ShowPaletteView_Label=Palette
-Pageflow_Action_ShowPaletteView_ToolTip=Show Palette View
-
-Pageflow_Action_SyncWithFacesConfig_Label=Synchronize with Faces-config
-Pageflow_Action_SyncWithFacesConfig_ToolTip=Synchronizing PageFlow Model with Faces-config
-
-Pageflow_Action_UpdateFacesConfig_Label=Update Faces-config
-Pageflow_Action_UpdateFacesConfig_ToolTip=Update Faces-config File from The Current PageFlow
-
-Pageflow_PaletteTool_Group_Controls=Controls
-
-Pageflow_PaletteTool_Select_Label=Select
-Pageflow_PaletteTool_Select_Description=Select One or More Items
-
-Pageflow_PaletteTool_Marquee_Label=Marquee
-Pageflow_PaletteTool_Marquee_Description=Marquee One or More Items
-
-Pageflow_PaletteTool_Link_Label=Link
-Pageflow_PaletteTool_Link_Description=Creates a Link
-
-Pageflow_PaletteTool_Group_Nodes=Nodes
-
-Pageflow_PaletteTool_Begin_Label=Begin
-Pageflow_PaletteTool_Begin_Description=Creates a PageFlow Begin
-
-Pageflow_PaletteTool_End_Label=End
-Pageflow_PaletteTool_End_Description=Creates a PageFlow End
-
-Pageflow_PaletteTool_Action_Label=Action
-Pageflow_PaletteTool_Action_Description=Creates a PageFlow Action
-
-Pageflow_PaletteTool_Page_Label=Page
-Pageflow_PaletteTool_Page_Description=Creates a PageFlow Page
-
-Pageflow_Contextmenu_Align_Label=Align
-
-Pageflow_Contextmenu_ShowView_Label=Show View
-
-
-
-####################################################
-# Generic Strings for Commands
-####################################################
-Pageflow_Commands_AddNodeCommand_Label=Add
-Pageflow_Commands_CreateNodeCommand_Label=Create
-Pageflow_Commands_DeleteNodeCommand_Label=Delete
-
-Pageflow_Commands_ConnectionCommand_Label=Connection
-Pageflow_Commands_CreateBendpointCommand_Label=Create Bendpoint
-Pageflow_Commands_MoveBendpointCommand_Label=Move Bendpoint
-Pageflow_Commands_DeleteBendpointCommand_Label=Delete Bendpoint
-
-Pageflow_Commands_OpenEditorCommand_Label=Open
-Pageflow_Commands_OrphanChildCommand_Label=Orphan Child
-Pageflow_Commands_UpdatePageflowCommand_Label=Update Pageflow
-
-Pageflow_Commands_CreateNodeCommand_SelectJSPDialog_Title=Select JSP File
-Pageflow_Commands_CreateNodeCommand_SelectJSPDialog_Description=Please select a jsp file.
-
-####################################################
-# Generic Strings for property attribute name 
-####################################################
-Pageflow_Model_Attributes_comment=description
-Pageflow_Model_Attributes_name=display-name
-Pageflow_Model_Attributes_largeicon=large-icon
-Pageflow_Model_Attributes_smallicon=small-icon
-
-Pageflow_Model_Attributes_action=from-action
-Pageflow_Model_Attributes_path=path
-Pageflow_Model_Attributes_begin=begin
-Pageflow_Model_Attributes_end=end
-Pageflow_Model_Attributes_configfile=config file
-
-Pageflow_Model_Attributes_source = from-view-id
-Pageflow_Model_Attributes_target = to-view-id
-
-Pageflow_Model_Attributes_outcome=from-outcome
-Pageflow_Model_Attributes_redirect=redirect
-
-Pageflow_Model_Attributes_fromaction=from-action
-Pageflow_Model_Attributes_referenceLink=reference
-
-Pageflow_Model_Items_Pageflow=File
-Pageflow_Model_Items_PFPage=Page
-Pageflow_Model_Items_PFLink=Link
-
-
-Pageflow_Property_Action_OutcomeSelectionDialog_Choice=Enter the outcome or select one from action list below:
-
-Pageflow_Property_Action_OutcomeSelectionDialog_Title=Outcome Selection
-Pageflow_Property_Action_OutcomeSelectionDialog_JSPName=JSP File Name:
-Pageflow_Property_Action_OutcomeSelectionDialog_ActionListTable_Title=Actions
-Pageflow_Property_Action_OutcomeSelectionDialog_ActionListTableWithJSP_Title=Actions in {0}
-Pageflow_Property_Action_OutcomeSelectionDialog_ActionListTable_Component=Component ID
-Pageflow_Property_Action_OutcomeSelectionDialog_ActionListTable_Action=Action
-
-Pageflow_Property_Action_OutcomeSelectionDialog_Outcome=Outcome:
-
-####################################################
-#Pageflow validation
-####################################################
-Pageflow_Validation_UndefinedOutcome=The outcome \''{0}\'' is not defined in previous page \''{1}\''.
-Pageflow_Validation_NotExistedSourcePage=The source page \''{0}\'' is not existed.
-Pageflow_Validation_MissingSourcePage=The source page should be specified.
-
-Pageflow_Validation_InvalidWebPage=The file \''{0}\'' is not valid web file.
-Pageflow_Validation_NotExitedWebPage=The web page  \''{0}\''  is not existed.
-Pageflow_Validation_MissingWebPage=The web page's path should be specified.
-
-Pageflow_Validation_MissingManagedBean=The managed bean \''{0}\'' is not defined.
-Pageflow_Validation_MissingAction=The action should be specified.
-
-ExistingPagePathDialogCellEdito_LabelText = Please enter or select a web page path:
-
-PageflowLinkEditPart_FromAction=fromAction:
-PageflowLinkEditPart_FromOutcome=fromOutcome:
-
-PageflowLinkPropertySource_Title=Note
-PageflowLinkPropertySource_Text=Please select an existing page
-
-#######################################################
-PageflowContainerEditPolicy_OrphanLabel=label here
-PageflowNode_NoRecursiveContainment=Recursive containment not allowed for 
-PageflowXYLayoutEditPolicy_Add=Add
-SetConstraintCommand_Location=Change Page Location
-SetConstraintCommand_Resize=Resize Page
-ProjectWebPageSelectionDialog_Description=Please select a Web Page
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/PageflowPaletteRoot.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/PageflowPaletteRoot.java
deleted file mode 100644
index eefad92..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/PageflowPaletteRoot.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow;
-
-import org.eclipse.gef.palette.CombinedTemplateCreationEntry;
-import org.eclipse.gef.palette.ConnectionCreationToolEntry;
-import org.eclipse.gef.palette.MarqueeToolEntry;
-import org.eclipse.gef.palette.PaletteDrawer;
-import org.eclipse.gef.palette.PaletteGroup;
-import org.eclipse.gef.palette.PaletteRoot;
-import org.eclipse.gef.palette.PaletteSeparator;
-import org.eclipse.gef.palette.SelectionToolEntry;
-import org.eclipse.gef.palette.ToolEntry;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.util.ModelCreationFactory;
-
-/**
- * This is the root of the palette used by pageflow editors.
- */
-public class PageflowPaletteRoot extends PaletteRoot {
-
-	/**
-	 * Creates a new PageflowPaletteRoot instance.
-	 */
-	public PageflowPaletteRoot() {
-		// create root
-		super();
-
-		// a group of default control tools
-		// Pageflow.PaletteTool.Group.Controls = Controls
-		PaletteGroup controls = new PaletteGroup(
-				PageflowMessages.Pageflow_PaletteTool_Group_Controls);
-		add(controls);
-
-		// the selection tool
-		// Pageflow.PaletteTool.Select.Label = Select
-		// Pageflow.PaletteTool.Select.Description = Select one or more items
-		ToolEntry tool = new SelectionToolEntry(
-				PageflowMessages.Pageflow_PaletteTool_Select_Label,
-				PageflowMessages.Pageflow_PaletteTool_Select_Description);
-
-		controls.add(tool);
-
-		// use selection tool as default entry
-		setDefaultEntry(tool);
-
-		// the marquee selection tool
-		// Pageflow.PaletteTool.Marquee.Label = Marquee
-		// Pageflow.PaletteTool.Marquee.Description = Marquee one or more items
-		controls.add(new MarqueeToolEntry(
-				PageflowMessages.Pageflow_PaletteTool_Marquee_Label,
-				PageflowMessages.Pageflow_PaletteTool_Marquee_Description));
-
-		controls.add(new PaletteSeparator());
-
-		// conection creation
-		// Pageflow.PaletteTool.Link.Label = Link
-		// Pageflow.PaletteTool.Link.Description = Creates an link
-		ConnectionCreationToolEntry linkEntry = new ConnectionCreationToolEntry(
-				PageflowMessages.Pageflow_PaletteTool_Link_Label,
-				PageflowMessages.Pageflow_PaletteTool_Link_Description,
-				new ModelCreationFactory(PageflowLink.class), EditorPlugin
-						.getDefault().getImageDescriptor(
-								"facesconfig/Pageflow_Link.gif"), //$NON-NLS-1$
-				EditorPlugin.getDefault().getImageDescriptor(
-						"facesconfig/Pageflow_Link24.gif")); //$NON-NLS-1$
-		linkEntry.setUserModificationPermission(PERMISSION_FULL_MODIFICATION);
-		controls.add(linkEntry);
-
-		controls.add(new PaletteSeparator());
-
-		// Pageflow.PaletteTool.Group.Nodes = Nodes
-		PaletteDrawer nodes = new PaletteDrawer(
-				PageflowMessages.Pageflow_PaletteTool_Group_Nodes);
-		add(nodes);
-
-		// use CombinedTemplateCreationEntry which can be also dragged
-		CombinedTemplateCreationEntry entry;
-
-		// Pageflow.PaletteTool.Page.Label = Page
-		// Pageflow.PaletteTool.Page.Description = Creates a pageflow page
-		entry = new CombinedTemplateCreationEntry(
-				PageflowMessages.Pageflow_PaletteTool_Page_Label,
-				PageflowMessages.Pageflow_PaletteTool_Page_Description,
-				PageflowPage.class,
-				new ModelCreationFactory(PageflowPage.class), EditorPlugin
-						.getDefault().getImageDescriptor(
-								"facesconfig/Pageflow_Page16.gif"), //$NON-NLS-1$
-				EditorPlugin.getDefault().getImageDescriptor(
-						"facesconfig/Pageflow_Page24.gif")); //$NON-NLS-1$
-		nodes.add(entry);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/PageflowTemplateTransferDropTargetListener.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/PageflowTemplateTransferDropTargetListener.java
deleted file mode 100644
index 4c4a8a4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/PageflowTemplateTransferDropTargetListener.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow;
-
-import org.eclipse.gef.EditPartViewer;
-import org.eclipse.gef.dnd.TemplateTransferDropTargetListener;
-import org.eclipse.gef.requests.CreationFactory;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.util.ModelCreationFactory;
-
-/**
- * This is the drop listener for template transfers from the palette. Only need
- * to implement the <code>getFactory</code> method.
- */
-public class PageflowTemplateTransferDropTargetListener extends
-		TemplateTransferDropTargetListener {
-	/**
-	 * Creates a new PageflowTemplateTransferDropTargetListener instance.
-	 * 
-	 * @param viewer -
-	 *            target pageflow editor view.
-	 */
-	public PageflowTemplateTransferDropTargetListener(EditPartViewer viewer) {
-		super(viewer);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see TemplateTransferDropTargetListener#getFactory(Object)
-	 */
-	protected CreationFactory getFactory(Object template) {
-		if (template instanceof Class) {
-			return new ModelCreationFactory((Class) template);
-		}
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/ResourceTransferDropTargetListener.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/ResourceTransferDropTargetListener.java
deleted file mode 100644
index 634d5bb..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/ResourceTransferDropTargetListener.java
+++ /dev/null
@@ -1,213 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPartViewer;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.dnd.AbstractTransferDropTargetListener;
-import org.eclipse.gef.requests.CreateRequest;
-import org.eclipse.gef.requests.CreationFactory;
-import org.eclipse.jface.util.LocalSelectionTransfer;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jst.jsf.facesconfig.ui.util.WebrootUtil;
-import org.eclipse.swt.dnd.DND;
-import org.eclipse.swt.dnd.DropTargetEvent;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.part.FileEditorInput;
-import org.eclipse.ui.part.ResourceTransfer;
-
-
-/**
- * This is the listener for resource drag and drop operations
- * 
- */
-public abstract class ResourceTransferDropTargetListener extends
-		AbstractTransferDropTargetListener {
-	/** the pageflow editor */
-	private IEditorPart editor = null;
-
-	/**
-	 * Creates a new ResourceTransferDropTargetListener instance.
-	 * 
-	 * @param viewer -
-	 *            target pageflow editor view.
-	 * @param editor 
-	 */
-	public ResourceTransferDropTargetListener(EditPartViewer viewer,
-			IEditorPart editor) {
-		super(viewer, ResourceTransfer.getInstance());
-
-		this.editor = editor;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see AbstractTransferDropTargetListener#createTargetRequest()
-	 */
-	protected Request createTargetRequest() {
-		CreateRequest request = new CreateRequest();
-		if (getCurrentEvent().data == null) {
-			request.setFactory(getFactory(null));
-		} else {
-			IResource[] resources = (IResource[]) getCurrentEvent().data;
-			request.setFactory(getFactory(resources[0]));
-		}
-		return request;
-	}
-
-	/**
-	 * get the request for creating a new resource object
-	 * 
-	 * @return - creation request
-	 */
-	protected final CreateRequest getCreateRequest() {
-		return (CreateRequest) getTargetRequest();
-	}
-
-	/**
-	 * get creation factory for resource object, which should be implemented.
-	 * 
-	 * @param obj -
-	 *            resource object
-	 * @return - creation factory for resource object
-	 */
-	abstract protected CreationFactory getFactory(Object obj);
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see AbstractTransferDropTargetListener#handleDragOperationChanged()
-	 */
-	protected void handleDragOperationChanged() {
-		getCurrentEvent().detail = DND.DROP_COPY;
-		super.handleDragOperationChanged();
-	}
-
-	/**
-	 * get the current transfered local selection object.
-	 * 
-	 * @return
-	 */
-	private Object getCurrentLocalObject() {
-		ISelection sel = LocalSelectionTransfer.getTransfer().getSelection();
-		if (sel instanceof IStructuredSelection) {
-			return ((IStructuredSelection) sel).getFirstElement();
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see AbstractTransferDropTargetListener#handleDragOver()
-	 */
-	protected void handleDragOver() {
-		if (!isValidJSFFile(getCurrentLocalObject())) {
-			getCurrentEvent().detail = DND.ERROR_INVALID_DATA;
-		} else {
-			getCurrentEvent().detail = DND.DROP_COPY;
-		}
-		getCurrentEvent().feedback = DND.FEEDBACK_SCROLL | DND.FEEDBACK_EXPAND;
-		super.handleDragOver();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see AbstractTransferDropTargetListener#handleDrop()
-	 */
-	protected void handleDrop() {
-		getCurrentEvent().detail = DND.DROP_COPY;
-		super.handleDrop();
-		// because the handle drop can change this event to DND.DROP_NONE
-		if (getCurrentEvent().detail == DND.DROP_COPY) {
-			selectAddedObject();
-		}
-	}
-
-	/**
-	 * select the new drag and drop object in the pageflow view.
-	 */
-	private void selectAddedObject() {
-		Object model = getCreateRequest().getNewObject();
-		if (null == model) {
-			return;
-		}
-		EditPartViewer viewer = getViewer();
-		Object editpart = viewer.getEditPartRegistry().get(model);
-		if (editpart instanceof EditPart) {
-			viewer.flush();
-			viewer.select((EditPart) editpart);
-			// Activate the editor window
-			PlatformUI.getWorkbench().getActiveWorkbenchWindow()
-					.getActivePage().activate(editor);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see AbstractTransferDropTargetListener#updateTargetRequest()
-	 */
-	protected void updateTargetRequest() {
-		CreateRequest request = getCreateRequest();
-		request.setLocation(getDropLocation());
-	}
-
-	/**
-	 * Allow drop if any of these types in the drop data, which can be jsp file
-	 * or a sub folder of the webroot folder.
-	 * 
-	 */
-	private boolean isValidJSFFile(Object resource) {
-		if (resource == null || !(resource instanceof IResource)) {
-			return false;
-		}
-
-		if (((IResource) resource).getProject() == ((FileEditorInput) editor
-				.getEditorInput()).getFile().getProject()) {
-			if (WebrootUtil.getWebPath(((IResource) resource).getFullPath())
-					.length() > 0) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see AbstractTransferDropTargetListener#isEnabled()
-	 */
-	public boolean isEnabled(DropTargetEvent dropTargetEvent) {
-		if (super.isEnabled(dropTargetEvent)) {
-			if (dropTargetEvent.data != null) {
-				IResource[] resources = (IResource[]) dropTargetEvent.data;
-				// The resource should be under the same project of the current
-				// faces-config file
-				if (isValidJSFFile(resources[0])) {
-					return true;
-				}
-				return false;
-			}
-			// If no data, can't verify, so allow the drop
-			return true;
-		}
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/AlignmentAction.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/AlignmentAction.java
deleted file mode 100644
index e108d8e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/AlignmentAction.java
+++ /dev/null
@@ -1,329 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.action;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.draw2d.PositionConstants;
-import org.eclipse.draw2d.geometry.PrecisionRectangle;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.RequestConstants;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.commands.CompoundCommand;
-import org.eclipse.gef.requests.AlignmentRequest;
-import org.eclipse.gef.tools.ToolUtilities;
-import org.eclipse.gef.ui.actions.GEFActionConstants;
-import org.eclipse.gef.ui.actions.SelectionAction;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IWorkbenchPart;
-
-/**
- * An improved alignment action to align the selected parts in different action.
- * 
- * @author xgzhang
- * @version original version is from GEF
- */
-public final class AlignmentAction extends SelectionAction {
-
-	/**
-	 * Indicates that the bottom edges should be aligned.
-	 */
-	public static final String ID_ALIGN_BOTTOM = GEFActionConstants.ALIGN_BOTTOM;
-
-	/**
-	 * Indicates that the horizontal centers should be aligned.
-	 */
-	public static final String ID_ALIGN_CENTER = GEFActionConstants.ALIGN_CENTER;
-
-	/**
-	 * Indicates that the left edges should be aligned.
-	 */
-	public static final String ID_ALIGN_LEFT = GEFActionConstants.ALIGN_LEFT;
-
-	/**
-	 * Indicates that the vertical midpoints should be aligned.
-	 */
-	public static final String ID_ALIGN_MIDDLE = GEFActionConstants.ALIGN_MIDDLE;
-
-	/**
-	 * Indicates that the right edges should be aligned.
-	 */
-	public static final String ID_ALIGN_RIGHT = GEFActionConstants.ALIGN_RIGHT;
-
-	/**
-	 * Indicates that the top edges should be aligned.
-	 */
-	public static final String ID_ALIGN_TOP = GEFActionConstants.ALIGN_TOP;
-
-	private int alignment;
-
-	private List operationSet;
-
-	/**
-	 * @deprecated use AlignmentAction(IWorkbenchPart, int align)
-	 * @param editor
-	 *            the editor
-	 * @param align
-	 *            the alignment ID
-	 */
-	public AlignmentAction(IEditorPart editor, int align) {
-		this((IWorkbenchPart) editor, align);
-	}
-
-	/**
-	 * Constructs an AlignmentAction with the given part and alignment ID. The
-	 * alignment ID must by one of:
-	 * <UL>
-	 * <LI>GEFActionConstants.ALIGN_LEFT
-	 * <LI>GEFActionConstants.ALIGN_RIGHT
-	 * <LI>GEFActionConstants.ALIGN_CENTER
-	 * <LI>GEFActionConstants.ALIGN_TOP
-	 * <LI>GEFActionConstants.ALIGN_BOTTOM
-	 * <LI>GEFActionConstants.ALIGN_MIDDLE
-	 * </UL>
-	 * 
-	 * @param part
-	 *            the workbench part used to obtain context
-	 * @param align
-	 *            the aligment ID.
-	 */
-	public AlignmentAction(IWorkbenchPart part, int align) {
-		super(part);
-		alignment = align;
-		initUI();
-	}
-
-	/**
-	 * Returns the alignment rectangle to which all selected parts should be
-	 * aligned.
-	 * 
-	 * @param request
-	 *            the alignment Request
-	 * @return the alignment rectangle
-	 */
-	protected Rectangle calculateAlignmentRectangle(Request request) {
-		List editparts = getOperationSet(request);
-		if (editparts == null || editparts.isEmpty()) {
-			return null;
-		}
-		GraphicalEditPart part = null;
-		if (alignment == PositionConstants.MIDDLE
-				|| alignment == PositionConstants.CENTER) {
-			part = (GraphicalEditPart) editparts.get(editparts.size() - 1);
-		} else {
-			part = getFitnessPart(editparts);
-		}
-		Rectangle rect = new PrecisionRectangle(part.getFigure().getBounds());
-		part.getFigure().translateToAbsolute(rect);
-		return rect;
-	}
-
-	/**
-	 * get the Fitness part in the four kinds of alignment directions
-	 * 
-	 * @param editparts
-	 */
-	private GraphicalEditPart getFitnessPart(List editparts) {
-		if (alignment == PositionConstants.MIDDLE
-				|| alignment == PositionConstants.CENTER) {
-			return null;
-		}
-
-		int positionComparor = Integer.MAX_VALUE;
-
-		if (alignment == PositionConstants.LEFT
-				|| alignment == PositionConstants.TOP) {
-			positionComparor = Integer.MAX_VALUE;
-		} else if (alignment == PositionConstants.RIGHT
-				|| alignment == PositionConstants.BOTTOM) {
-			positionComparor = Integer.MIN_VALUE;
-		}
-
-		GraphicalEditPart fitnessPart = null;
-
-		for (Iterator iter = editparts.iterator(); iter.hasNext();) {
-			GraphicalEditPart part = (GraphicalEditPart) iter.next();
-			Rectangle rectPart = part.getFigure().getBounds();
-			switch (alignment) {
-			case PositionConstants.LEFT:
-				if (rectPart.getLeft().x < positionComparor) {
-					fitnessPart = part;
-					positionComparor = rectPart.getLeft().x;
-				}
-				break;
-
-			case PositionConstants.RIGHT:
-				if (rectPart.getRight().x > positionComparor) {
-					fitnessPart = part;
-					positionComparor = rectPart.getRight().x;
-				}
-				break;
-			case PositionConstants.TOP:
-				if (rectPart.getTop().y < positionComparor) {
-					fitnessPart = part;
-					positionComparor = rectPart.getTop().y;
-				}
-				break;
-			case PositionConstants.BOTTOM:
-				if (rectPart.getBottom().y > positionComparor) {
-					fitnessPart = part;
-					positionComparor = rectPart.getBottom().y;
-				}
-				break;
-			}
-		}
-
-		return fitnessPart;
-	}
-
-	/**
-	 * @see org.eclipse.gef.ui.actions.WorkbenchPartAction#calculateEnabled()
-	 */
-	protected boolean calculateEnabled() {
-		operationSet = null;
-		Command cmd = createAlignmentCommand();
-		if (cmd == null) {
-			return false;
-		}
-		return cmd.canExecute();
-	}
-
-	private Command createAlignmentCommand() {
-		AlignmentRequest request = new AlignmentRequest(
-				RequestConstants.REQ_ALIGN);
-		request.setAlignmentRectangle(calculateAlignmentRectangle(request));
-		request.setAlignment(alignment);
-		List editparts = getOperationSet(request);
-		if (editparts.size() < 2) {
-			return null;
-		}
-
-		CompoundCommand command = new CompoundCommand();
-		command.setDebugLabel(getText());
-		for (int i = 0; i < editparts.size(); i++) {
-			EditPart editpart = (EditPart) editparts.get(i);
-			command.add(editpart.getCommand(request));
-		}
-		return command;
-	}
-
-	/**
-	 * @see org.eclipse.gef.Disposable#dispose()
-	 */
-	public void dispose() {
-		operationSet = Collections.EMPTY_LIST;
-		super.dispose();
-	}
-
-	/**
-	 * Returns the list of editparts which will participate in alignment.
-	 * 
-	 * @param request
-	 *            the alignment request
-	 * @return the list of parts which will be aligned
-	 */
-	protected List getOperationSet(Request request) {
-		if (operationSet != null) {
-			return operationSet;
-		}
-		List editparts = new ArrayList(getSelectedObjects());
-		if (editparts.isEmpty()
-				|| !(editparts.get(0) instanceof GraphicalEditPart)) {
-			return Collections.EMPTY_LIST;
-		}
-		Object primary = editparts.get(editparts.size() - 1);
-		editparts = ToolUtilities.getSelectionWithoutDependants(editparts);
-		ToolUtilities.filterEditPartsUnderstanding(editparts, request);
-		if (editparts.size() < 2 || !editparts.contains(primary)) {
-			return Collections.EMPTY_LIST;
-		}
-		EditPart parent = ((EditPart) editparts.get(0)).getParent();
-		for (int i = 1; i < editparts.size(); i++) {
-			EditPart part = (EditPart) editparts.get(i);
-			if (part.getParent() != parent) {
-				return Collections.EMPTY_LIST;
-			}
-		}
-		return editparts;
-	}
-
-	/**
-	 * Initializes the actions UI presentation.
-	 */
-	protected void initUI() {
-		switch (alignment) {
-		case PositionConstants.LEFT:
-			setId(GEFActionConstants.ALIGN_LEFT);
-			setText(EditorMessages.AlignmentAction_AlignLeftAction_Label);
-			setToolTipText(EditorMessages.AlignmentAction_AlignLeftAction_Tooltip);
-			setImageDescriptor(InternalImages.DESC_HORZ_ALIGN_LEFT);
-			setDisabledImageDescriptor(InternalImages.DESC_HORZ_ALIGN_LEFT_DIS);
-			break;
-
-		case PositionConstants.RIGHT:
-			setId(GEFActionConstants.ALIGN_RIGHT);
-			setText(EditorMessages.AlignmentAction_AlignRightAction_Label);
-			setToolTipText(EditorMessages.AlignmentAction_AlignRightAction_Tooltip);
-			setImageDescriptor(InternalImages.DESC_HORZ_ALIGN_RIGHT);
-			setDisabledImageDescriptor(InternalImages.DESC_HORZ_ALIGN_RIGHT_DIS);
-			break;
-
-		case PositionConstants.TOP:
-			setId(GEFActionConstants.ALIGN_TOP);
-			setText(EditorMessages.AlignmentAction_AlignTopAction_Label);
-			setToolTipText(EditorMessages.AlignmentAction_AlignTopAction_Tooltip);
-			setImageDescriptor(InternalImages.DESC_VERT_ALIGN_TOP);
-			setDisabledImageDescriptor(InternalImages.DESC_VERT_ALIGN_TOP_DIS);
-			break;
-
-		case PositionConstants.BOTTOM:
-			setId(GEFActionConstants.ALIGN_BOTTOM);
-			setText(EditorMessages.AlignmentAction_AlignBottomAction_Label);
-			setToolTipText(EditorMessages.AlignmentAction_AlignBottomAction_Tooltip);
-			setImageDescriptor(InternalImages.DESC_VERT_ALIGN_BOTTOM);
-			setDisabledImageDescriptor(InternalImages.DESC_VERT_ALIGN_BOTTOM_DIS);
-			break;
-
-		case PositionConstants.CENTER:
-			setId(GEFActionConstants.ALIGN_CENTER);
-			setText(EditorMessages.AlignmentAction_AlignCenterAction_Label);
-			setToolTipText(EditorMessages.AlignmentAction_AlignCenterAction_Tooltip);
-			setImageDescriptor(InternalImages.DESC_HORZ_ALIGN_CENTER);
-			setDisabledImageDescriptor(InternalImages.DESC_HORZ_ALIGN_CENTER_DIS);
-			break;
-
-		case PositionConstants.MIDDLE:
-			setId(GEFActionConstants.ALIGN_MIDDLE);
-			setText(EditorMessages.AlignmentAction_AlignMiddleAction_Label);
-			setToolTipText(EditorMessages.AlignmentAction_AlignMiddleAction_Tooltip);
-			setImageDescriptor(InternalImages.DESC_VERT_ALIGN_MIDDLE);
-			setDisabledImageDescriptor(InternalImages.DESC_VERT_ALIGN_MIDDLE_DIS);
-			break;
-		}
-	}
-
-	/**
-	 * @see org.eclipse.jface.action.IAction#run()
-	 */
-	public void run() {
-		operationSet = null;
-		execute(createAlignmentCommand());
-	}
-
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/InternalImages.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/InternalImages.java
deleted file mode 100644
index 8daa9ba..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/InternalImages.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.action;
-
-import org.eclipse.jface.resource.ImageDescriptor;
-
-/**
- * Supplies image descriptors, intended for internal use only.
- * 
- * @author Ian Trimble - Oracle
- */
-public class InternalImages {
-
-	/**
-	 * ImageDescriptor instance for center alignment image.
-	 */
-	public static final ImageDescriptor DESC_HORZ_ALIGN_CENTER;
-
-	/**
-	 * ImageDescriptor instance for left alignment image.
-	 */
-	public static final ImageDescriptor DESC_HORZ_ALIGN_LEFT;
-
-	/**
-	 * ImageDescriptor instance for right alignment image.
-	 */
-	public static final ImageDescriptor DESC_HORZ_ALIGN_RIGHT;
-
-	/**
-	 * ImageDescriptor instance for middle alignment image.
-	 */
-	public static final ImageDescriptor DESC_VERT_ALIGN_MIDDLE;
-
-	/**
-	 * ImageDescriptor instance for top alignment image.
-	 */
-	public static final ImageDescriptor DESC_VERT_ALIGN_TOP;
-
-	/**
-	 * ImageDescriptor instance for bottom alignment image.
-	 */
-	public static final ImageDescriptor DESC_VERT_ALIGN_BOTTOM;
-
-	/**
-	 * ImageDescriptor instance for center alignment image (disabled).
-	 */
-	public static final ImageDescriptor DESC_HORZ_ALIGN_CENTER_DIS;
-
-	/**
-	 * ImageDescriptor instance for left alignment image (disabled).
-	 */
-	public static final ImageDescriptor DESC_HORZ_ALIGN_LEFT_DIS;
-
-	/**
-	 * ImageDescriptor instance for right alignment image (disabled).
-	 */
-	public static final ImageDescriptor DESC_HORZ_ALIGN_RIGHT_DIS;
-
-	/**
-	 * ImageDescriptor instance for middle alignment image (disabled).
-	 */
-	public static final ImageDescriptor DESC_VERT_ALIGN_MIDDLE_DIS;
-
-	/**
-	 * ImageDescriptor instance for top alignment image (disabled).
-	 */
-	public static final ImageDescriptor DESC_VERT_ALIGN_TOP_DIS;
-
-	/**
-	 * ImageDescriptor instance for bottom alignment image (disabled).
-	 */
-	public static final ImageDescriptor DESC_VERT_ALIGN_BOTTOM_DIS;
-
-	static {
-		DESC_VERT_ALIGN_BOTTOM = createDescriptor("icons/alignbottom.gif"); //$NON-NLS-1$
-		DESC_HORZ_ALIGN_CENTER = createDescriptor("icons/aligncenter.gif"); //$NON-NLS-1$
-		DESC_HORZ_ALIGN_LEFT = createDescriptor("icons/alignleft.gif"); //$NON-NLS-1$
-		DESC_VERT_ALIGN_MIDDLE = createDescriptor("icons/alignmid.gif"); //$NON-NLS-1$
-		DESC_HORZ_ALIGN_RIGHT = createDescriptor("icons/alignright.gif"); //$NON-NLS-1$
-		DESC_VERT_ALIGN_TOP = createDescriptor("icons/aligntop.gif"); //$NON-NLS-1$
-		DESC_VERT_ALIGN_BOTTOM_DIS = createDescriptor("icons/alignbottom_d.gif"); //$NON-NLS-1$
-		DESC_HORZ_ALIGN_CENTER_DIS = createDescriptor("icons/aligncenter_d.gif"); //$NON-NLS-1$
-		DESC_HORZ_ALIGN_LEFT_DIS = createDescriptor("icons/alignleft_d.gif"); //$NON-NLS-1$
-		DESC_VERT_ALIGN_MIDDLE_DIS = createDescriptor("icons/alignmid_d.gif"); //$NON-NLS-1$
-		DESC_HORZ_ALIGN_RIGHT_DIS = createDescriptor("icons/alignright_d.gif"); //$NON-NLS-1$
-		DESC_VERT_ALIGN_TOP_DIS = createDescriptor("icons/aligntop_d.gif"); //$NON-NLS-1$
-	}
-
-	private static ImageDescriptor createDescriptor(String filename) {
-		return ImageDescriptor.createFromFile(InternalImages.class, filename);
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/OpenEditorAction.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/OpenEditorAction.java
deleted file mode 100644
index 7c27eab..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/OpenEditorAction.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.action;
-
-import java.util.List;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.commands.CompoundCommand;
-import org.eclipse.gef.ui.actions.SelectionAction;
-import org.eclipse.jst.jsf.facesconfig.ui.FacesConfigEditor;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.PageflowMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage;
-import org.eclipse.ui.IWorkbenchPart;
-
-/**
- * 
- * This is the Action for opening a JSP page in the default JSP Editor from a
- * Pageflow Diagram
- * 
- */
-public class OpenEditorAction extends SelectionAction {
-	/** The name of the request */
-	public static final String OPEN_EDITOR_REQUEST = PageflowMessages.Pageflow_Commands_OpenEditorCommand_Label;
-
-	/** The request */
-	Request request;
-
-	/**
-	 * The constructor
-	 * 
-	 * @param part -
-	 *            the IWorkbenchPart
-	 */
-	public OpenEditorAction(IWorkbenchPart part) {
-		super(part);
-		request = new Request(OPEN_EDITOR_REQUEST);
-		// Pageflow.Action.OpenEditor.Label = Edit Page
-		setText(PageflowMessages.Pageflow_Action_OpenEditor_Label);
-		setId(FacesConfigEditor.EDITOR_ID);
-		// Pageflow.Action.OpenEditor.ToolTip = Edit this page
-		setToolTipText(PageflowMessages.Pageflow_Action_OpenEditor_ToolTip);
-	}
-
-	/**
-	 * Determines if the action can be enabled
-	 * 
-	 * @return boolean - the enabled state
-	 */
-	protected boolean calculateEnabled() {
-		return canPerformAction();
-	}
-
-	/**
-	 * Determines if the action can be performed
-	 * 
-	 * @return boolean - the perform state
-	 */
-	private boolean canPerformAction() {
-		if (getSelectedObjects().isEmpty()) {
-			return false;
-		}
-		List parts = getSelectedObjects();
-		for (int i = 0; i < parts.size(); i++) {
-			Object o = parts.get(i);
-			if (!(o instanceof EditPart)) {
-				return false;
-			}
-			EditPart part = (EditPart) o;
-			if (!(part.getModel() instanceof PageflowPage)) {
-				return false;
-			}
-		}
-		return true;
-	}
-
-	/**
-	 * Returns the command for the action
-	 * 
-	 * @return Command - the action command
-	 */
-	private Command getCommand() {
-		List editparts = getSelectedObjects();
-		CompoundCommand cc = new CompoundCommand();
-		cc.setDebugLabel(OPEN_EDITOR_REQUEST);
-		for (int i = 0; i < editparts.size(); i++) {
-			EditPart part = (EditPart) editparts.get(i);
-			cc.add(part.getCommand(request));
-		}
-		return cc;
-	}
-
-	/**
-	 * Runs the command
-	 */
-	public void run() {
-		execute(getCommand());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.ui.actions.WorkbenchPartAction#execute(org.eclipse.gef.commands.Command)
-	 */
-	protected void execute(Command command) {
-		if (command == null || !command.canExecute()) {
-			return;
-		}
-		command.execute();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/ShowPropertyViewAction.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/ShowPropertyViewAction.java
deleted file mode 100644
index 24fe9da..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/ShowPropertyViewAction.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.action;
-
-import java.util.List;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.ui.actions.SelectionAction;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.PageflowMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * 
- * This is the Action for opening a JSP page in the default JSP Editor from a
- * Pageflow Diagram
- * 
- * @author Xiao-guang Zhang
- */
-public class ShowPropertyViewAction extends SelectionAction {
-	/** log instance */
-	private static final Logger log = EditorPlugin
-			.getLogger(ShowPropertyViewAction.class);
-
-	/** The ID of the action */
-	public static final String SHOW_PROPERTY_VIEW = "org.eclipse.jst.jsf.facesconfig.ui.pageflow.action.ShowPropertyViewAction"; //$NON-NLS-1$ 
-
-	/**
-	 * The constructor
-	 * 
-	 * @param part -
-	 *            the IWorkbenchPart
-	 */
-	public ShowPropertyViewAction(IWorkbenchPart part) {
-		super(part);
-		// Pageflow.Action.ShowPropertyView.Label = Properties
-		setText(PageflowMessages.Pageflow_Action_ShowPropertyView_Label);
-		setId(SHOW_PROPERTY_VIEW);
-		// Pageflow.Action.ShowPropertyView.ToolTip = Show properties
-		setToolTipText(PageflowMessages.Pageflow_Action_ShowPropertyView_ToolTip);
-	}
-
-	/**
-	 * Determines if the action can be enabled
-	 * 
-	 * @return boolean - the enabled state
-	 */
-	protected boolean calculateEnabled() {
-		return canPerformAction();
-	}
-
-	/**
-	 * Determines if the action can be performed
-	 * 
-	 * @return boolean - the perform state
-	 */
-	private boolean canPerformAction() {
-		if (getSelectedObjects().isEmpty()) {
-			return false;
-		}
-		List parts = getSelectedObjects();
-		for (int i = 0; i < parts.size(); i++) {
-			Object o = parts.get(i);
-			if (!(o instanceof EditPart)) {
-				return false;
-			}
-			EditPart part = (EditPart) o;
-			if (!((part.getModel() instanceof PageflowElement))) {
-				return false;
-			}
-		}
-		return true;
-	}
-
-	/**
-	 * Runs the command
-	 */
-	public void run() {
-		List editparts = getSelectedObjects();
-		if (editparts.size() > 0) {
-			EditPart part = (EditPart) editparts.get(0);
-			// execute(getCommand());
-			if (part.getModel() instanceof PageflowElement) {
-				// ensure the visibility of the palette view and property veiw.
-				IWorkbenchWindow dw = PlatformUI.getWorkbench()
-						.getActiveWorkbenchWindow();
-				IWorkbenchPage page = dw.getActivePage();
-				if (page != null) {
-					try {
-						page.showView("org.eclipse.ui.views.PropertySheet"); //$NON-NLS-1$
-					} catch (PartInitException e) {
-						// Pageflow.PageflowEditor.Error.canNotShowPropertyView
-						// = Failed to show property sheet view.
-						log
-								.error(
-										"Pageflow.PageflowEditor.Error.canNotShowPropertyView", //$NON-NLS-1$
-										e);
-					}
-
-				}
-			}
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/icons/alignbottom.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/icons/alignbottom.gif
deleted file mode 100644
index 9eea558..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/icons/alignbottom.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/icons/alignbottom_d.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/icons/alignbottom_d.gif
deleted file mode 100644
index 1c62797..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/icons/alignbottom_d.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/icons/aligncenter.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/icons/aligncenter.gif
deleted file mode 100644
index 4e8c94a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/icons/aligncenter.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/icons/aligncenter_d.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/icons/aligncenter_d.gif
deleted file mode 100644
index ceeafb7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/icons/aligncenter_d.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/icons/alignleft.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/icons/alignleft.gif
deleted file mode 100644
index 55cecc2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/icons/alignleft.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/icons/alignleft_d.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/icons/alignleft_d.gif
deleted file mode 100644
index 60fcc8f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/icons/alignleft_d.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/icons/alignmid.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/icons/alignmid.gif
deleted file mode 100644
index 5f13c93..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/icons/alignmid.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/icons/alignmid_d.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/icons/alignmid_d.gif
deleted file mode 100644
index 2f7534e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/icons/alignmid_d.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/icons/alignright.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/icons/alignright.gif
deleted file mode 100644
index f6ead15..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/icons/alignright.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/icons/alignright_d.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/icons/alignright_d.gif
deleted file mode 100644
index 0495ed5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/icons/alignright_d.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/icons/aligntop.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/icons/aligntop.gif
deleted file mode 100644
index 2f9ceeb..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/icons/aligntop.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/icons/aligntop_d.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/icons/aligntop_d.gif
deleted file mode 100644
index 9f1b49b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/icons/aligntop_d.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/AbstractBatchEditCommand.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/AbstractBatchEditCommand.java
deleted file mode 100644
index eded9f1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/AbstractBatchEditCommand.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.command;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.synchronization.FC2PFTransformer;
-
-/**
- * A batched edit command will enable adapters to interven before and after a
- * set of operations was done by sending notification to the adapters.
- * 
- * @author hmeng
- */
-
-/*package*/ abstract class AbstractBatchEditCommand extends Command {
-	Pageflow pageflow;
-
-	/**
-	 * @param pageflow
-	 */
-	public AbstractBatchEditCommand(Pageflow pageflow) {
-		this(pageflow, null);
-	}
-
-	/**
-	 * @param pageflow
-	 * @param label
-	 */
-	public AbstractBatchEditCommand(Pageflow pageflow, String label) {
-		super(label);
-		this.pageflow = pageflow;
-	}
-
-	/**
-	 * @return the pageflow
-	 */
-	public Pageflow getPageflow() {
-		return pageflow;
-	}
-
-	/**
-	 * The subclass should extend methods doXXX only.
-	 */
-	final public void execute() {
-		preExecute();
-		doExecute();
-		postExecute();
-	}
-
-	final public void redo() {
-		doRedo();
-	}
-
-	final public void undo() {
-		preExecute();
-		doUndo();
-		postExecute();
-	}
-
-	/**
-	 * 
-	 */
-	abstract public void doExecute();
-
-	/**
-	 * Do the customized redo
-	 */
-	public void doRedo() {
-		execute();
-	}
-
-	abstract void doUndo();
-
-	final void preExecute() {
-		getPageflow().eNotify(
-				new ENotificationImpl((InternalEObject) getPageflow(),
-						FC2PFTransformer.MY_NOTIFICATION_TYPE,
-						PageflowPackage.PAGEFLOW, null, null));
-	}
-
-	/**
-	 * execute the post-execution handling
-	 */
-	final protected void postExecute() {
-		getPageflow().eNotify(
-				new ENotificationImpl((InternalEObject) getPageflow(),
-						FC2PFTransformer.MY_NOTIFICATION_TYPE1,
-						PageflowPackage.PAGEFLOW, null, null));
-		notifyPageflow(getPageflow());
-	}
-
-	/**
-	 * @param pageflow_
-	 */
-	protected void notifyPageflow(Pageflow pageflow_) {
-		pageflow_.notifyModelChanged(new ENotificationImpl(
-				(InternalEObject) pageflow_, Notification.ADD,
-				PageflowPackage.PAGEFLOW, null, null));
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/AddConnectionCommand.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/AddConnectionCommand.java
deleted file mode 100644
index 149da0b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/AddConnectionCommand.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.command;
-
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.layout.PageflowLayoutManager;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.util.PageflowValidation;
-
-/**
- * Add a new connection
- * 
- * @author hmeng
- * 
- */
-public class AddConnectionCommand extends ConnectionCommand {
-
-	public boolean canExecute() {
-		// if user don't set PFLink object before, this command can't be
-		// executed.
-		if (link == null) {
-			return false;
-		}
-
-		// It is a connection create command
-		if (oldSource == null && oldTarget == null) {
-			// It is a connection create command
-			// Source and target must be pointing to some
-			// real connection point
-			if (source == null || target == null) {
-				return false;
-			}
-
-			if (!PageflowValidation.getInstance().isValidLinkForCreation(
-					source, target)) {
-				return false;
-			}
-		}
-		return true;
-	}
-
-	public void doExecute() {
-		// It is a connection create command
-		if (canExecute() && oldSource == null && oldTarget == null) {
-			Pageflow pageflow = null;
-			// Get a reference to the pageflow
-			if (source != null) {
-				pageflow = source.getPageflow();
-			} else if (target != null) {
-				pageflow = target.getPageflow();
-			}
-			pageflow.connect(source, target, link);
-
-			// self loop link
-			if (source == target) {
-				PageflowLayoutManager.updateSelfLoopLink(link);
-			}
-		}
-	}
-
-	public void redo() {
-		// TODO Auto-generated method stub
-		super.redo();
-	}
-
-	public void undo() {
-		if (canExecute()) {
-			// It was a connection create command
-			if (oldSource == null && oldTarget == null) {
-
-				Pageflow pageflow = null;
-				// Get a reference to the pageflow
-				if (source != null) {
-					pageflow = source.getPageflow();
-				} else if (target != null) {
-					pageflow = target.getPageflow();
-				}
-
-				// Ensure that link knows nothing about nodes anymore.
-				link.setSource(null);
-				link.setTarget(null);
-				// Remove link from pageflow
-				pageflow.getLinks().remove(link);
-			}
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/AddNodeCommand.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/AddNodeCommand.java
deleted file mode 100644
index be41ab2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/AddNodeCommand.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.command;
-
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.PageflowMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode;
-
-/**
- * This is the add command for pageflow editpart
- * 
- */
-public class AddNodeCommand extends Command {
-	/** Pageflow node including Page, action, begin, end. */
-	private PageflowNode child;
-
-	/** parent Pageflow */
-	private Pageflow parent;
-
-	/** index of pageflow nodes */
-	private int index = -1;
-
-	/**
-	 * Default constructor
-	 */
-	public AddNodeCommand() {
-		// Pageflow.Commands.AddNodeCommand.Label = add
-		super(PageflowMessages.Pageflow_Commands_AddNodeCommand_Label);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see Command#execute()
-	 */
-	public void execute() {
-		if (index < 0) {
-			parent.getNodes().add(child);
-		} else {
-			parent.getNodes().add(index, child);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see Command#redo()
-	 */
-	public void redo() {
-		if (index < 0) {
-			parent.getNodes().add(child);
-		} else {
-			parent.getNodes().add(index, child);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see Command#undo()
-	 */
-	public void undo() {
-		parent.getNodes().remove(child);
-	}
-
-	/**
-	 * get parent pageflow of the node.
-	 * @return the parent
-	 * 
-	 */
-	public Pageflow getParent() {
-		return parent;
-	}
-
-	/**
-	 * Set the child pageflow node
-	 * 
-	 * @param subpart -
-	 *            child pageflow node
-	 */
-	public void setChild(PageflowNode subpart) {
-		child = subpart;
-	}
-
-	/**
-	 * Creates a new AbstractEditorPage instance.
-	 * 
-	 * @param i -
-	 *            index of pageflow node
-	 */
-	public void setIndex(int i) {
-		index = i;
-	}
-
-	/**
-	 * Set the new parent pageflow
-	 * 
-	 * @param newParent -
-	 *            parent pageflow
-	 */
-	public void setParent(Pageflow newParent) {
-		parent = newParent;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/BendpointCommand.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/BendpointCommand.java
deleted file mode 100644
index e4690d0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/BendpointCommand.java
+++ /dev/null
@@ -1,143 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.command;
-
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink;
-
-/**
- * base class for bend point commands.
- * 
- */
-/*package*/ abstract class BendpointCommand extends Command {
-	/** the index of the bend point */
-	protected int index;
-
-	/** the location of the bendpoint */
-	protected Point location;
-
-	/** the parent link */
-	protected PageflowLink link;
-
-	/** relative dimension between the bendpoint with start point of the pflink */
-	private Dimension dimStart;
-
-	/** relative dimension between the bendpoint with end point of the pflink */
-	private Dimension dimEnd;
-
-	/**
-	 * @param label
-	 */
-	public BendpointCommand(String label) {
-		super(label);
-	}
-
-	/**
-	 * get the dimension between the bendpoint and start point
-	 * 
-	 * @return - the start dimension
-	 */
-	protected Dimension getFirstRelativeDimension() {
-		return dimStart;
-	}
-
-	/**
-	 * get the dimension between the bendpoint and end point
-	 * 
-	 * @return - the end dimension
-	 */
-	protected Dimension getSecondRelativeDimension() {
-		return dimEnd;
-	}
-
-	/**
-	 * get the index of the bend point
-	 * 
-	 * @return - the index
-	 */
-	protected int getIndex() {
-		return index;
-	}
-
-	/**
-	 * get the location of the bend point
-	 * 
-	 * @return - the index
-	 */
-	protected Point getLocation() {
-		return location;
-	}
-
-	/**
-	 * get the parent link
-	 * 
-	 * @return - parent link
-	 */
-	protected PageflowLink getPFLink() {
-		return link;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see Command#redo()
-	 */
-	public void redo() {
-		execute();
-	}
-
-	/**
-	 * set the relative dimensions of the bendpoint
-	 * 
-	 * @param dim1 -
-	 *            the dimension between the bendpoint and start point
-	 * @param dim2 -
-	 *            the dimension between the bendpoint and end point
-	 */
-	public void setRelativeDimensions(Dimension dim1, Dimension dim2) {
-		dimStart = dim1;
-		dimEnd = dim2;
-	}
-
-	/**
-	 * set the index of the bendpoint in the bendpoint list
-	 * 
-	 * @param i -
-	 *            index
-	 */
-	public void setIndex(int i) {
-		index = i;
-	}
-
-	/**
-	 * set the location of the bendpoing
-	 * 
-	 * @param p -
-	 *            new location
-	 */
-	public void setLocation(Point p) {
-		location = p;
-	}
-
-	/**
-	 * set the parent link
-	 * 
-	 * @param newLink -
-	 *            new parent pflink
-	 */
-	public void setPFLink(PageflowLink newLink) {
-		link = newLink;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/ConnectionCommand.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/ConnectionCommand.java
deleted file mode 100644
index dafa9f6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/ConnectionCommand.java
+++ /dev/null
@@ -1,154 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.command;
-
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.PageflowMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.synchronization.TransformUtil;
-
-/**
- * This is the connection command for pageflow editpart
- * 
- * @author Xiao-guang Zhang, hmeng
- */
-public abstract class ConnectionCommand extends Command {
-	/** Old source pageflow node */
-	protected PageflowNode oldSource;
-
-	/** Old target pageflow node */
-	protected PageflowNode oldTarget;
-
-	/** New source pageflow node */
-	protected PageflowNode source;
-
-	/** New target pageflow node */
-	protected PageflowNode target;
-
-	/** pageflow link */
-	protected PageflowLink link;
-
-	/**
-	 * Default constructor
-	 */
-	public ConnectionCommand() {
-		super(PageflowMessages.Pageflow_Commands_ConnectionCommand_Label);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see Command#canExecute()
-	 */
-	public boolean canExecute() {
-		return TransformUtil.isValidPageflowElement(link);
-	}
-
-	/**
-	 * perform the main command execution.  Sub-classes should override.
-	 */
-	protected void doExecute() {
-	    // do nothing; sub-class can over-ride
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see Command#execute()
-	 */
-	public final void execute() {
-		if (canExecute()) {
-			doExecute();
-		} else {
-			link = null;
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see Command#redo()
-	 */
-	public void redo() {
-		execute();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ommand#undo()
-	 */
-	public void undo() {
-        // do nothing
-	}
-
-	/**
-	 * Get the source pageflow node
-	 * 
-	 * @return - the source pageflow node
-	 */
-	public PageflowNode getSource() {
-		return source;
-	}
-
-	/**
-	 * Get the target pageflow node
-	 * 
-	 * @return - the target pageflow node.
-	 */
-	public PageflowNode getTarget() {
-		return target;
-	}
-
-	/**
-	 * Get the pageflow link
-	 * 
-	 * @return - the pageflow link.
-	 */
-	public PageflowLink getPFLink() {
-		return link;
-	}
-
-	/**
-	 * Set the source pageflow node
-	 * 
-	 * @param newSource -
-	 *            new source pageflow node
-	 */
-	public void setSource(PageflowNode newSource) {
-		source = newSource;
-	}
-
-	/**
-	 * Set the target pageflow node
-	 * 
-	 * @param newTarget -
-	 *            new target pageflow node
-	 */
-	public void setTarget(PageflowNode newTarget) {
-		target = newTarget;
-	}
-
-	/**
-	 * Set the pageflow link
-	 * 
-	 * @param link -
-	 *            new pageflow link
-	 */
-	public void setPFLink(PageflowLink link) {
-		this.link = link;
-		oldSource = link.getSource();
-		oldTarget = link.getTarget();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/ConnectionCommandFactory.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/ConnectionCommandFactory.java
deleted file mode 100644
index 8c7397c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/ConnectionCommandFactory.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.command;
-
-import org.eclipse.gef.Request;
-import org.eclipse.gef.RequestConstants;
-
-/**
- * The factory helps to create connection commands.
- * 
- * @author hmeng
- * 
- */
-public class ConnectionCommandFactory {
-	/**
-	 * @param request
-	 * @return the connection command for  the request
-	 */
-	public static ConnectionCommand createCommand(Request request) {
-		ConnectionCommand command = null;
-		if (request.getType() == RequestConstants.REQ_CONNECTION_START
-				|| request.getType() == RequestConstants.REQ_CONNECTION_END) {
-			command = new AddConnectionCommand();
-		} else if (request.getType() == RequestConstants.REQ_RECONNECT_SOURCE
-				|| request.getType() == RequestConstants.REQ_RECONNECT_TARGET) {
-			command = new ReconnectConnectionCommand();
-		} else if (request.getType() == RequestConstants.REQ_DELETE) {
-			command = new DeleteConnectionCommand();
-		}
-		return command;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/CreateBendpointCommand.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/CreateBendpointCommand.java
deleted file mode 100644
index 60df11d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/CreateBendpointCommand.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.command;
-
-import java.util.Map;
-
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.PageflowMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowFactory;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLinkBendpoint;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage;
-
-/**
- * Create a new bend point command
- * 
- */
-public class CreateBendpointCommand extends BendpointCommand {
-	/**
-	 * Default constructor
-	 */
-	public CreateBendpointCommand() {
-		// Pageflow.Commands.CreateBendpointCommand.Label = Create Bendpoint
-		super(PageflowMessages.Pageflow_Commands_CreateBendpointCommand_Label);
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see Command#execute()
-	 */
-	public void execute() {
-		Map registry = EPackage.Registry.INSTANCE;
-		String pageflowURI = PageflowPackage.eNS_URI;
-		PageflowPackage pageflowPackage = (PageflowPackage) registry
-				.get(pageflowURI);
-		PageflowFactory factory = pageflowPackage.getPageflowFactory();
-		PageflowLinkBendpoint _newBendpoint = factory.createPFLinkBendpoint();
-
-		_newBendpoint.setRelativeDimensions(getFirstRelativeDimension(),
-				getSecondRelativeDimension());
-		getPFLink().insertBendpoint(getIndex(), _newBendpoint);
-		super.execute();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see Command#undo()
-	 */
-	public void undo() {
-		super.undo();
-		getPFLink().removeBendpoint(getIndex());
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/CreateNodeCommand.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/CreateNodeCommand.java
deleted file mode 100644
index 0cb7b28..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/CreateNodeCommand.java
+++ /dev/null
@@ -1,253 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.command;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jface.window.Window;
-import org.eclipse.jst.jsf.common.ui.internal.dialogs.CommonResourceDialog;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.PageflowMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.util.PageflowValidation;
-import org.eclipse.jst.jsf.facesconfig.ui.util.WebrootUtil;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IWorkbenchWindow;
-
-/**
- * This is the creation command for pageflow editpart
- * 
- * @author Xiao-guang Zhang
- */
-public class CreateNodeCommand extends Command implements IPreExecuteCommand {
-	private static final String UNNAMED_NODE = "unnamed"; //$NON-NLS-1$
-
-	/** new pageflow node */
-	private PageflowNode child;
-
-	/** size of pageflow node figure */
-	private Rectangle rect;
-
-	/** parent pageflow */
-	private Pageflow parent;
-
-	/** index of pageflow nodes */
-	// private int _index = -1;
-	public CreateNodeCommand() {
-		// Pageflow.Commands.CreateNodeCommand.Label = Create new node
-		super(PageflowMessages.Pageflow_Commands_CreateNodeCommand_Label);
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.commands.Command#canExecute()
-	 */
-	public boolean canExecute() {
-		return child != null && parent != null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see Command#execute()
-	 */
-	public void execute() {
-		if (rect != null) {
-			child.setX(rect.x);
-			child.setY(rect.y);
-			if (!rect.isEmpty()) {
-				child.setHeight(rect.getSize().height);
-				child.setWidth(rect.getSize().width);
-			}
-		}
-
-		if (child.getName() == UNNAMED_NODE) {
-			child.setName(parent.getDefaultNodeName(child.getClass()));
-		}
-
-		parent.getNodes().add(child);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see Command#redo()
-	 */
-	public void redo() {
-		if (rect != null) {
-			child.setX(rect.x);
-			child.setY(rect.y);
-			if (!rect.isEmpty()) {
-				child.setHeight(rect.getSize().height);
-				child.setWidth(rect.getSize().width);
-			}
-		}
-
-		parent.getNodes().add(child);
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see Command#undo()
-	 */
-	public void undo() {
-		parent.getNodes().remove(child);
-	}
-
-	/**
-	 * select a jsp page in current project.
-	 * 
-	 * @return
-	 */
-	private boolean selectJSPPage() {
-
-		Shell shell = null;
-		IWorkbenchWindow workbenchWindow = EditorPlugin
-				.getActiveWorkbenchWindow();
-		if (workbenchWindow.getShell() != null) {
-			shell = workbenchWindow.getShell();
-		} else {
-			shell = new Shell();
-		}
-		IProject project = WebrootUtil.getProject(getParent());
-
-		CommonResourceDialog dialog = new CommonResourceDialog(shell, project,
-				SWT.NONE);
-
-		dialog
-				.setTitle(PageflowMessages.Pageflow_Commands_CreateNodeCommand_SelectJSPDialog_Title);
-		// no suffix filter
-		dialog.setSuffixs(null);
-		dialog
-				.setResourceDescription(PageflowMessages.Pageflow_Commands_CreateNodeCommand_SelectJSPDialog_Description);
-
-		if (dialog.open() == Window.OK) {
-			Object[] result = dialog.getResult();
-			if (result != null) {
-				IFile jspFile = (IFile) result[0];
-				if (jspFile != null) {
-					// get the project path for the new created file, i.e.,
-					// /project/webroot/*.jsp
-					String jsfSelection = WebrootUtil.getWebPath(jspFile
-							.getFullPath());
-					if (jsfSelection != null && jsfSelection.length() > 0) {
-						if (PageflowValidation.getInstance().isExistedPage(
-								this.parent, jsfSelection)) {
-							// Pageflow.PageflowEditor.Alert.DNDResourceTitle =
-							// Pageflow Creation Error
-							// Pageflow.PageflowEditor.Alert.ExistingPage = The
-							// web page {0} is already existed in current
-							// PageFlow.
-							EditorPlugin
-									.getAlerts()
-									.error(
-											"Pageflow.PageflowEditor.Alert.DNDResourceTitle", //$NON-NLS-1$
-											"Pageflow.PageflowEditor.Alert.ExistingPage", //$NON-NLS-1$
-											jsfSelection);
-							return false;
-						}
-
-						((PageflowPage) (child)).setPath(jsfSelection);
-						((PageflowPage) (child)).setName(WebrootUtil
-								.getPageNameFromWebPath(jsfSelection));
-					}
-
-					return true;
-				}
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * call the JSF wizard to create a new jsf page.
-	 * @return the parent
-	 * 
-	 */
-	public Pageflow getParent() {
-		return parent;
-	}
-
-	/**
-	 * set the child node
-	 * 
-	 * @param subpart -
-	 *            new child pageflow node
-	 */
-	public void setChild(PageflowNode subpart) {
-		child = subpart;
-	}
-
-	/**
-	 * set the location of the new pageflow node
-	 * 
-	 * @param r -
-	 *            location of the new pageflow node
-	 */
-	public void setLocation(Rectangle r) {
-		rect = r;
-	}
-
-	/**
-	 * set the parent pageflow
-	 * 
-	 * @param newParent -
-	 *            the new parent pageflow
-	 */
-	public void setParent(Pageflow newParent) {
-		parent = newParent;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.editors.pageflow.commands.IPreExecuteCommand#preExecute()
-	 */
-	public boolean preExecute() {
-		// note that the model adds the ports to the node in this call
-		// pop up the new the wizard to create the new jsf file
-		if (child instanceof PageflowPage) {
-			// if the new page's file path is not empty, i.e., drag a file from
-			// resource navigator view
-			if (null != ((PageflowPage) child).getPath()) {
-				if (PageflowValidation.getInstance().isExistedPage(parent,
-						(PageflowPage) child)) {
-					// Pageflow.PageflowEditor.Alert.DNDResourceTitle = Pageflow
-					// Creation Error
-					// Pageflow.PageflowEditor.Alert.ExistingPage = The web page
-					// {0} is already existed in current PageFlow.
-					EditorPlugin.getAlerts().error(
-							"Pageflow.PageflowEditor.Alert.DNDResourceTitle", //$NON-NLS-1$
-							"Pageflow.PageflowEditor.Alert.ExistingPage", //$NON-NLS-1$
-							((PageflowPage) child).getPath());
-					return false;
-				}
-			} else
-			// create a new jsf page from scratch
-			{
-				// return createNewJSFPage();
-				return selectJSPPage();
-			}
-		}
-		return true;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/DelegatingCommandStack.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/DelegatingCommandStack.java
deleted file mode 100644
index 1586f6f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/DelegatingCommandStack.java
+++ /dev/null
@@ -1,262 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.command;
-
-import java.util.EventObject;
-
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.commands.CommandStack;
-import org.eclipse.gef.commands.CommandStackListener;
-import org.eclipse.gef.commands.UnexecutableCommand;
-
-/**
- * This is a delegating command stack, which delegates everything to another
- * CommandStack except event listners.
- * <p>
- * Event listeners registered to a <code>DelegatingCommandStack</code> will be
- * informed whenever the underlying <code>CommandStack</code> changes. They
- * will not be registered to the underlying <code>CommandStack</code> directly
- * but they will be informed about change events of them.
- * 
- */
-public class DelegatingCommandStack extends CommandStack implements
-		CommandStackListener {
-	/** the empty object array */
-	private static final Object[] EMPTY_OBJECT_ARRAY = new Object[] {};
-
-	/** the current command stack */
-	private CommandStack currentCommandStack = null;
-
-	/**
-	 * Returns the current <code>CommandStack</code>.
-	 * 
-	 * @return - the current <code>CommandStack</code>
-	 */
-	public CommandStack getCurrentCommandStack() {
-		return currentCommandStack;
-	}
-
-	/**
-	 * Sets the current <code>CommandStack</code>.
-	 * 
-	 * @param stack -
-	 *            the <code>CommandStack</code> to set
-	 */
-	public void setCurrentCommandStack(CommandStack stack) {
-		if (currentCommandStack == stack) {
-			return;
-		}
-
-		// remove from old command stack
-		if (null != currentCommandStack) {
-			currentCommandStack.removeCommandStackListener(this);
-		}
-
-		// set new command stack
-		currentCommandStack = stack;
-
-		if (currentCommandStack != null) {
-			// watch new command stack
-			currentCommandStack.addCommandStackListener(this);
-
-			// the command stack changed
-			notifyListeners();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see CommandStack#canRedo()
-	 */
-	public boolean canRedo() {
-		if (null == currentCommandStack) {
-			return false;
-		}
-
-		return currentCommandStack.canRedo();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see CommandStack#canUndo()
-	 */
-	public boolean canUndo() {
-		if (null == currentCommandStack) {
-			return false;
-		}
-
-		return currentCommandStack.canUndo();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see CommandStack#dispose()
-	 */
-	public void dispose() {
-		if (null != currentCommandStack) {
-			currentCommandStack.dispose();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see CommandStack#execute(org.eclipse.gef.commands.Command)
-	 */
-	public void execute(Command command) {
-		if (null != currentCommandStack) {
-			currentCommandStack.execute(command);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see CommandStack#flush()
-	 */
-	public void flush() {
-		if (null != currentCommandStack) {
-			currentCommandStack.flush();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see CommandStack#getCommands()
-	 */
-	public Object[] getCommands() {
-		if (null == currentCommandStack) {
-			return EMPTY_OBJECT_ARRAY;
-		}
-
-		return currentCommandStack.getCommands();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see CommandStack#getRedoCommand()
-	 */
-	public Command getRedoCommand() {
-		if (null == currentCommandStack) {
-			return UnexecutableCommand.INSTANCE;
-		}
-
-		return currentCommandStack.getRedoCommand();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see CommandStack#getUndoCommand()
-	 */
-	public Command getUndoCommand() {
-		if (null == currentCommandStack) {
-			return UnexecutableCommand.INSTANCE;
-		}
-
-		return currentCommandStack.getUndoCommand();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see CommandStack#getUndoLimit()
-	 */
-	public int getUndoLimit() {
-		if (null == currentCommandStack) {
-			return -1;
-		}
-
-		return currentCommandStack.getUndoLimit();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see CommandStack#isDirty()
-	 */
-	public boolean isDirty() {
-		if (null == currentCommandStack) {
-			return false;
-		}
-
-		return currentCommandStack.isDirty();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see CommandStack#markSaveLocation()
-	 */
-	public void markSaveLocation() {
-		if (null != currentCommandStack) {
-			currentCommandStack.markSaveLocation();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see CommandStack#redo()
-	 */
-	public void redo() {
-		if (null != currentCommandStack) {
-			currentCommandStack.redo();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see CommandStack#setUndoLimit(int)
-	 */
-	public void setUndoLimit(int undoLimit) {
-		if (null != currentCommandStack) {
-			currentCommandStack.setUndoLimit(undoLimit);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see CommandStack#undo()
-	 */
-	public void undo() {
-		if (null != currentCommandStack) {
-			currentCommandStack.undo();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see Object#toString()
-	 */
-	public String toString() {
-		return "DelegatingCommandStack(" + currentCommandStack + ")"; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see CommandStackListener#commandStackChanged(java.util.EventObject)
-	 */
-	public void commandStackChanged(EventObject event) {
-		notifyListeners();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/DeleteBendpointCommand.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/DeleteBendpointCommand.java
deleted file mode 100644
index 25e0049..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/DeleteBendpointCommand.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.command;
-
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.PageflowMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLinkBendpoint;
-
-/**
- * 
- */
-public class DeleteBendpointCommand extends BendpointCommand {
-
-	/** the deleting bendpoint */
-	private PageflowLinkBendpoint bendpoint;
-
-	/**
-	 * Default constructor
-	 */
-	public DeleteBendpointCommand() {
-
-		// Pageflow.Commands.DeleteBendpointCommand.Label = Delete Bendpoint
-		super(PageflowMessages.Pageflow_Commands_DeleteBendpointCommand_Label);
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see Command#execute()
-	 */
-	public void execute() {
-		super.execute();
-		bendpoint = (PageflowLinkBendpoint) getPFLink().getBendPoints().get(
-				getIndex());
-		getPFLink().removeBendpoint(getIndex());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see Command#undo()
-	 */
-	public void undo() {
-		super.undo();
-		getPFLink().insertBendpoint(getIndex(), bendpoint);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/DeleteConnectionCommand.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/DeleteConnectionCommand.java
deleted file mode 100644
index dd22437..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/DeleteConnectionCommand.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.command;
-
-/**
- * Delete a connection.
- * 
- * @author hmeng
- * 
- */
-public class DeleteConnectionCommand extends ConnectionCommand {
-
-	public boolean canExecute() {
-		return link != null;
-	}
-
-	protected void doExecute() {
-		// It is a delete connection command
-		if (link != null) {
-			link.setSource(null);
-			link.setTarget(null);
-			oldSource.getPageflow().getLinks().remove(link);
-			link.eAdapters().clear();
-		}
-	}
-
-	public void undo() {
-		// It is a delete connection command
-		if (canExecute()) {
-			link.setSource(oldSource);
-			link.setTarget(oldTarget);
-			oldSource.getPageflow().getLinks().add(link);
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/DeleteNodeCommand.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/DeleteNodeCommand.java
deleted file mode 100644
index 4660942..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/DeleteNodeCommand.java
+++ /dev/null
@@ -1,189 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.command;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.PageflowMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode;
-
-/**
- * This is the delete command for pageflow editpart
- * 
- */
-public class DeleteNodeCommand extends AbstractBatchEditCommand {
-	/** the deleting pageflow node */
-	private PageflowNode child;
-
-	/** parent pageflow */
-	private Pageflow parent;
-
-	/** index of pageflow nodes */
-	private int index = -1;
-
-	/** source connections with the deleting node */
-	private List sourceConnections = new ArrayList();
-
-	private List sourceConnectionSources = new ArrayList();
-
-	private List sourceConnectionTargets = new ArrayList();
-
-	/** target connections with the deleting node */
-	private List targetConnections = new ArrayList();
-
-	private List targetConnectionSources = new ArrayList();
-
-	private List targetConnectionTargets = new ArrayList();
-
-	/**
-	 * @param pageflow
-	 */
-	public DeleteNodeCommand(Pageflow pageflow) {
-		// Pageflow.Commands.DeleteNodeCommand.Label = Delete
-		super(pageflow, PageflowMessages.Pageflow_Commands_DeleteNodeCommand_Label);
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see Command#execute()
-	 */
-	public void doExecute() {
-		primExecute();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see Command#redo()
-	 */
-	public void doRedo() {
-		primExecute();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see Command#undo()
-	 */
-	public void doUndo() {
-		parent.getNodes().add(index, child);
-		restoreConnections(child);
-	}
-
-	/**
-	 * delete the connections related with the pageflow node.
-	 * 
-	 * @param node -
-	 *            the deleting pageflow node
-	 */
-	private void deleteConnections(PageflowNode node) {
-		while (node.getOutlinks().size() > 0) {
-			// Note:should save the source and target of the link, otherwise
-			// source and target will be lost,
-			// when the source and target node remove the link.
-			PageflowLink link = (PageflowLink) node.getOutlinks().get(0);
-			sourceConnections.add(link);
-			sourceConnectionSources.add(link.getSource());
-			sourceConnectionTargets.add(link.getTarget());
-
-			link.getTarget().getInlinks().remove(link);
-			node.getOutlinks().remove(link);
-			parent.getLinks().remove(link);
-		}
-
-		while (node.getInlinks().size() > 0) {
-			// Note: should save the source and target of the link, otherwise
-			// source and target will be lost,
-			// when the source and target node remove the link.
-			PageflowLink link = (PageflowLink) node.getInlinks().get(0);
-			targetConnections.add(link);
-			targetConnectionSources.add(link.getSource());
-			targetConnectionTargets.add(link.getTarget());
-
-			link.getSource().getOutlinks().remove(link);
-			node.getInlinks().remove(link);
-			parent.getLinks().remove(link);
-		}
-	}
-
-	/**
-	 * execute the delete command
-	 * 
-	 * 
-	 */
-	protected void primExecute() {
-		deleteConnections(child);
-		index = parent.getNodes().indexOf(child);
-		parent.getNodes().remove(child);
-	}
-
-	/**
-	 * restore the connections of the deleted pageflow node
-	 * 
-	 * @param node -
-	 *            the deleted pageflow node
-	 */
-	private void restoreConnections(PageflowNode node) {
-		for (int i = 0; i < sourceConnections.size(); i++) {
-			// restore the link with the source and target
-			PageflowLink link = (PageflowLink) sourceConnections.get(i);
-			PageflowNode source = (PageflowNode) sourceConnectionSources.get(i);
-			PageflowNode target = (PageflowNode) sourceConnectionTargets.get(i);
-			link.setSource(source);
-			link.setTarget(target);
-
-			parent.getLinks().add(link);
-			node.getOutlinks().add(link);
-			link.getTarget().getInlinks().add(link);
-		}
-		sourceConnections.clear();
-		for (int i = 0; i < targetConnections.size(); i++) {
-			// restore the link with the source and target
-			PageflowLink link = (PageflowLink) targetConnections.get(i);
-			PageflowNode source = (PageflowNode) targetConnectionSources.get(i);
-			PageflowNode target = (PageflowNode) targetConnectionTargets.get(i);
-			link.setSource(source);
-			link.setTarget(target);
-
-			parent.getLinks().add(link);
-			node.getInlinks().add(link);
-			link.getSource().getOutlinks().add(link);
-		}
-		targetConnections.clear();
-	}
-
-	/**
-	 * set the child pageflow node
-	 * 
-	 * @param c -
-	 *            the child pageflow node
-	 */
-	public void setChild(PageflowNode c) {
-		child = c;
-	}
-
-	/**
-	 * set the parent pageflow
-	 * 
-	 * @param p -
-	 *            the parent pageflow
-	 */
-	public void setParent(Pageflow p) {
-		parent = p;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/EMFCommandGEFAdapter.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/EMFCommandGEFAdapter.java
deleted file mode 100644
index 456c1b8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/EMFCommandGEFAdapter.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.command;
-
-import org.eclipse.gef.commands.Command;
-
-/**
- * This class is used to adapter EMF Command to GEF Command.
- * 
- * @author xgzhang
- * @version
- */
-/*package*/ class EMFCommandGEFAdapter extends Command {
-	private org.eclipse.emf.common.command.Command emfCommand;
-
-	/**
-	 * @param emfCommand 
-	 */
-	public EMFCommandGEFAdapter(
-			org.eclipse.emf.common.command.Command emfCommand) {
-		super();
-		this.emfCommand = emfCommand;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.commands.Command#canExecute()
-	 */
-	public boolean canExecute() {
-		if (emfCommand == null) {
-			return false;
-		}
-		return emfCommand.canExecute();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.commands.Command#canUndo()
-	 */
-	public boolean canUndo() {
-		if (emfCommand == null) {
-			return false;
-		}
-		return emfCommand.canUndo();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.commands.Command#dispose()
-	 */
-	public void dispose() {
-		if (emfCommand == null) {
-			return;
-		}
-		emfCommand.dispose();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.commands.Command#execute()
-	 */
-	public void execute() {
-		if (emfCommand == null) {
-			return;
-		}
-		emfCommand.execute();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.commands.Command#getLabel()
-	 */
-	public String getLabel() {
-		if (emfCommand == null) {
-			return null;
-		}
-		return emfCommand.getLabel();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.commands.Command#redo()
-	 */
-	public void redo() {
-		if (emfCommand == null) {
-			return;
-		}
-		emfCommand.redo();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.commands.Command#undo()
-	 */
-	public void undo() {
-		if (emfCommand == null) {
-			return;
-		}
-		emfCommand.undo();
-	}
-
-	/**
-	 * 
-	 */
-	org.eclipse.emf.common.command.Command getEMFCommand() {
-		return emfCommand;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/EMFCommandStackGEFAdapter.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/EMFCommandStackGEFAdapter.java
deleted file mode 100644
index a253dff..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/EMFCommandStackGEFAdapter.java
+++ /dev/null
@@ -1,199 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.command;
-
-import java.util.EventObject;
-
-import org.eclipse.emf.common.command.BasicCommandStack;
-import org.eclipse.emf.common.command.CommandStackListener;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.commands.CommandStack;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.wst.sse.core.StructuredModelManager;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
-
-/**
- * This adapter is used to let editor be able to monitor EMF CommandStack, e.g.,
- * in StructuredTextEditor, using GEF CommandStack.
- * 
- * @author xgzhang
- * @version
- */
-public class EMFCommandStackGEFAdapter extends CommandStack implements
-		CommandStackListener {
-	private org.eclipse.emf.common.command.BasicCommandStack emfCommandStack;
-	private IStructuredModel model;
-
-	/**
-	 * @param doc
-	 */
-	public EMFCommandStackGEFAdapter (IDocument doc) {
-		
-		super();
-		
-		model = StructuredModelManager.getModelManager().getExistingModelForEdit(doc);
-		
-		if (model == null) {
-			model = StructuredModelManager.getModelManager().getModelForEdit((IStructuredDocument) doc);
-		}
-		
-		emfCommandStack = ((BasicCommandStack) this.model.getUndoManager().getCommandStack());
-		emfCommandStack.addCommandStackListener(this);
-	}
-
-	
-	@Override
-	public void dispose() {
-		model.releaseFromEdit();
-		super.dispose();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.commands.CommandStack#canRedo()
-	 */
-	public boolean canRedo() {
-		if (emfCommandStack == null) {
-			return false;
-		}
-		return emfCommandStack.canRedo();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.commands.CommandStack#canUndo()
-	 */
-	public boolean canUndo() {
-		if (emfCommandStack == null) {
-			return false;
-		}
-		return emfCommandStack.canUndo();
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.commands.CommandStack#execute(org.eclipse.gef.commands.Command)
-	 */
-	public void execute(Command command) {
-		if (!(command instanceof EMFCommandGEFAdapter)) {
-			return;
-		}
-
-		org.eclipse.emf.common.command.Command emfCommand = ((EMFCommandGEFAdapter) command)
-				.getEMFCommand();
-		if (emfCommand != null) {
-			emfCommandStack.execute(emfCommand);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.commands.CommandStack#flush()
-	 */
-	public void flush() {
-		if (emfCommandStack == null) {
-			return;
-		}
-		emfCommandStack.flush();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.commands.CommandStack#getRedoCommand()
-	 */
-	public Command getRedoCommand() {
-		if (emfCommandStack == null || emfCommandStack.getRedoCommand() == null) {
-			return null;
-		}
-
-		return new EMFCommandGEFAdapter(emfCommandStack.getRedoCommand());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.commands.CommandStack#getUndoCommand()
-	 */
-	public Command getUndoCommand() {
-		if (emfCommandStack == null || emfCommandStack.getUndoCommand() == null) {
-			return null;
-		}
-
-		return new EMFCommandGEFAdapter(emfCommandStack.getUndoCommand());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.commands.CommandStack#isDirty()
-	 */
-	public boolean isDirty() {
-		if (emfCommandStack == null) {
-			return false;
-		}
-		return emfCommandStack.isSaveNeeded();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.commands.CommandStack#markSaveLocation()
-	 */
-	public void markSaveLocation() {
-		if (emfCommandStack == null) {
-			return;
-		}
-		emfCommandStack.saveIsDone();
-		super.markSaveLocation();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.commands.CommandStack#redo()
-	 */
-	public void redo() {
-		if (emfCommandStack == null) {
-			return;
-		}
-		emfCommandStack.redo();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.commands.CommandStack#undo()
-	 */
-	public void undo() {
-		if (emfCommandStack == null) {
-			return;
-		}
-		emfCommandStack.undo();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.command.CommandStackListener#commandStackChanged(java.util.EventObject)
-	 */
-	public void commandStackChanged(EventObject event) {
-		this.notifyListeners();
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/IPreExecuteCommand.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/IPreExecuteCommand.java
deleted file mode 100644
index 4bed8f6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/IPreExecuteCommand.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.command;
-
-/**
- * Command with pre execute checking.
- * 
- * @author Xiao-guang Zhang
- * 
- * 
- */
-/*package*/ interface IPreExecuteCommand {
-	/**
-	 * Do something pre-execution of the actual command execution.
-	 * 
-	 * @return - successful to do the pre-execution
-	 */
-	boolean preExecute();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/MoveBendpointCommand.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/MoveBendpointCommand.java
deleted file mode 100644
index dc1e0fa..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/MoveBendpointCommand.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.command;
-
-import java.util.Map;
-
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.PageflowMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowFactory;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLinkBendpoint;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage;
-
-/**
- * Move bend point command
- */
-public class MoveBendpointCommand extends BendpointCommand {
-	/**
-	 * old bend point of the link
-	 */
-	private PageflowLinkBendpoint oldBendpoint;
-
-	/**
-	 * Default constructor
-	 */
-	public MoveBendpointCommand() {
-		// Pageflow.Commands.MoveBendpointCommand.Label = Move Bendpoint
-		super(PageflowMessages.Pageflow_Commands_MoveBendpointCommand_Label);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see Command#execute()
-	 */
-	public void execute() {
-		Map registry = EPackage.Registry.INSTANCE;
-		String pageflowURI = PageflowPackage.eNS_URI;
-		PageflowPackage pageflowPackage = (PageflowPackage) registry
-				.get(pageflowURI);
-		PageflowFactory factory = pageflowPackage.getPageflowFactory();
-		PageflowLinkBendpoint _newBendpoint = factory.createPFLinkBendpoint();
-
-		_newBendpoint.setRelativeDimensions(getFirstRelativeDimension(),
-				getSecondRelativeDimension());
-		setOldBendpoint((PageflowLinkBendpoint) getPFLink().getBendPoints().get(
-				getIndex()));
-
-		getPFLink().setBendpoint(getIndex(), _newBendpoint);
-		super.execute();
-	}
-
-	/**
-	 * get the old bend point
-	 * 
-	 * @return - old bend point
-	 */
-	protected PageflowLinkBendpoint getOldBendpoint() {
-		return oldBendpoint;
-	}
-
-	/**
-	 * set the old bend point
-	 * 
-	 * @param bp -
-	 *            old bend point
-	 */
-	public void setOldBendpoint(PageflowLinkBendpoint bp) {
-		oldBendpoint = bp;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see Command#undo()
-	 */
-	public void undo() {
-		super.undo();
-		getPFLink().setBendpoint(getIndex(), getOldBendpoint());
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/OpenEditorCommand.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/OpenEditorCommand.java
deleted file mode 100644
index e293eb8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/OpenEditorCommand.java
+++ /dev/null
@@ -1,173 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.command;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.jst.jsf.facesconfig.ui.FacesConfigEditor;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.PageflowMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage;
-import org.eclipse.jst.jsf.facesconfig.ui.util.WebrootUtil;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.IEditorDescriptor;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.ide.IDE;
-import org.eclipse.ui.part.FileEditorInput;
-
-/**
- * 
- * This is the Command for opening a file in its default editor
- * 
- * @author Xiao-guang Zhang
- */
-public class OpenEditorCommand extends Command {
-
-	/** The edit part */
-	private EditPart part;
-
-	/** log instance */
-	private static final Logger log = EditorPlugin
-			.getLogger(FacesConfigEditor.class);
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see Command#canExecute()
-	 */
-	public boolean canExecute() {
-		return true;
-	}
-
-	/**
-	 * The constructor
-	 * 
-	 * @param part -
-	 *            the EditPart
-	 */
-	public OpenEditorCommand(EditPart part) {
-		// Pageflow.Commands.OpenEditorCommand.Label = Open Editor
-		super(PageflowMessages.Pageflow_Commands_OpenEditorCommand_Label);
-		this.part = part;
-	}
-
-	/**
-	 * open existed JSF file or call the wizard to create a new one.
-	 * 
-	 */
-	private void executeOpenPFPage() {
-		IWorkspaceRoot workspaceRoot = ResourcesPlugin.getWorkspace().getRoot();
-		String pagePath = ((PageflowPage) (part.getModel())).getPath();
-
-		// Check the fileName is empty or not
-		if (pagePath != null && pagePath.length() > 0) {
-			String resourceName = WebrootUtil.getProjectPath((EObject) part
-					.getModel(), pagePath);
-			Path resourcePath = new Path(resourceName);
-			if (resourcePath.getFileExtension() != null) {
-				final IFile file = (IFile) workspaceRoot
-						.findMember(resourcePath);
-				openExistingJSFFile(file);
-			} else {
-				// Pageflow.PageflowEditor.Alert.errorOpenEditor4JSFTitle =
-				// Open JSF File Error
-				// Pageflow.PageflowEditor.Alert.errorOpenEditor4JSFFolderInfo =
-				// Cannot open the page in the page editor.
-				EditorPlugin
-						.getAlerts()
-						.error(
-								"Pageflow.PageflowEditor.Alert.errorOpenEditor4JSFTitle", //$NON-NLS-1$
-								"Pageflow.PageflowEditor.Alert.errorOpenEditor4JSFFolderInfo"); //$NON-NLS-1$
-			}
-		} else
-		// if the fileName is empty, a new jsf file should be created!
-		{
-			// Pageflow.PageflowEditor.Alert.errorOpenEditor4JSFTitle = Open JSF
-			// File Error
-			// Pageflow.PageflowEditor.Alert.confirmCreateNewJSFFile = No jsp
-			// file is related with this page.
-			EditorPlugin.getAlerts().error(
-					"Pageflow.PageflowEditor.Alert.errorOpenEditor4JSFTitle", //$NON-NLS-1$
-					"Pageflow.PageflowEditor.Alert.confirmCreateNewJSFFile");// ) //$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * open existing jsf file in a new editor.
-	 * 
-	 * @param file
-	 */
-	private void openExistingJSFFile(final IFile file) {
-		// if the file is existed, open it.
-		if (null != file && file.exists()) {
-			Display display = PlatformUI.getWorkbench()
-					.getActiveWorkbenchWindow().getShell().getDisplay();
-			display.asyncExec(new Runnable() {
-				public void run() {
-					IDE.setDefaultEditor(file, null);
-					try {
-						IWorkbenchPage page = PlatformUI.getWorkbench()
-								.getActiveWorkbenchWindow().getActivePage();
-						IEditorDescriptor desc = IDE.getEditorDescriptor(file);
-						page.openEditor(new FileEditorInput(file),
-								desc.getId(), true, IWorkbenchPage.MATCH_INPUT
-										| IWorkbenchPage.MATCH_ID);
-					} catch (PartInitException e) {
-						// Pageflow.PageflowEditor.Error.CanNotOpenEditor4JSF =
-						// The jsf file can not be opened in the editor.
-						log
-								.error(
-										"Pageflow.PageflowEditor.Error.canNotOpenEditor4JSF", //$NON-NLS-1$
-										e);
-						// Pageflow.PageflowEditor.Alert.errorOpenEditor4JSFTitle
-						// = Open JSF File Error
-						EditorPlugin
-								.getAlerts()
-								.error(
-										"Pageflow.PageflowEditor.Alert.errorOpenEditor4JSFTitle", //$NON-NLS-1$
-										"Pageflow.PageflowEditor.Error.CanNotOpenEditor4JSF"); //$NON-NLS-1$
-					}
-				}
-			});
-		} else
-		// otherwise, pop-up a error message box
-		{
-			String pagePath = ((PageflowPage) (part.getModel())).getPath();
-			// Pageflow.PageflowEditor.Alert.errorOpenEditor4JSFTitle = Open JSF
-			// File Error
-			// Pageflow.PageflowEditor.Alert.errorOpenEditor4JSFInfo = The JSF
-			// file is not existed.
-			EditorPlugin.getAlerts().error(
-					"Pageflow.PageflowEditor.Alert.errorOpenEditor4JSFTitle", //$NON-NLS-1$
-					"Pageflow.PageflowEditor.Alert.errorOpenEditor4JSFInfo", //$NON-NLS-1$
-					pagePath);
-		}
-	}
-
-	/**
-	 * Executes the OpenEditorCommand and opens the editor
-	 */
-	public void execute() {
-		if (part.getModel() instanceof PageflowPage) {
-			executeOpenPFPage();
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/OrphanChildCommand.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/OrphanChildCommand.java
deleted file mode 100644
index a695c32..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/OrphanChildCommand.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.command;
-
-import java.util.List;
-
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.PageflowMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode;
-
-/**
- * This is the orphan child command for pageflow container
- * 
- */
-public class OrphanChildCommand extends Command {
-
-	/** old location of pageflow node */
-	private Point oldLocation;
-
-	/** the parent pageflow */
-	private Pageflow pageflow;
-
-	/** the child pageflow node */
-	private PageflowNode child;
-
-	/** the index of pageflow nodes */
-	private int index;
-
-	/**
-	 * Default constructor
-	 */
-	public OrphanChildCommand() {
-		// Pageflow.Commands.OrphanChildCommand.Label = Orphan Child
-		super(PageflowMessages.Pageflow_Commands_OrphanChildCommand_Label);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see Command#execute()
-	 */
-	public void execute() {
-		List children = pageflow.getNodes();
-		index = children.indexOf(child);
-		oldLocation = new Point(child.getX(), child.getY());
-		pageflow.getNodes().remove(child);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see Command#redo()
-	 */
-	public void redo() {
-		pageflow.getNodes().remove(child);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see Command#undo()
-	 */
-	public void undo() {
-		child.setX(oldLocation.x);
-		child.setY(oldLocation.y);
-		pageflow.getNodes().add(index, child);
-	}
-
-	/**
-	 * set the child pageflow node
-	 * 
-	 * @param child -
-	 *            child pageflow node
-	 */
-	public void setChild(PageflowNode child) {
-		this.child = child;
-	}
-
-	/**
-	 * set the parent pageflow
-	 * 
-	 * @param parent -
-	 *            parent pageflow
-	 */
-	public void setParent(Pageflow parent) {
-		pageflow = parent;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/PreExecuteCommandStack.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/PreExecuteCommandStack.java
deleted file mode 100644
index 2741862..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/PreExecuteCommandStack.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.command;
-
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.commands.CommandStack;
-
-/**
- * Before the command stack called execute to do the actual model modification,
- * it will call the command's IPreExecuteCommand inteface to check the command
- * can be execute or not.
- * 
- * 
- * @author Xiao-guang Zhang
- */
-public class PreExecuteCommandStack extends CommandStack {
-	/**
-	 * 
-	 */
-	public PreExecuteCommandStack() {
-		super();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.commands.CommandStack#execute(org.eclipse.gef.commands.Command)
-	 */
-	public void execute(Command command) {
-		if (command == null || !command.canExecute()) {
-			return;
-		}
-		if (command instanceof IPreExecuteCommand) {
-			if (!((IPreExecuteCommand) command).preExecute()) {
-				return;
-			}
-		}
-		super.execute(command);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/ReconnectConnectionCommand.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/ReconnectConnectionCommand.java
deleted file mode 100644
index 63519ca..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/ReconnectConnectionCommand.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.command;
-
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.util.PageflowValidation;
-
-/**
- * Change the end of a link.
- * 
- * @author hmeng
- * 
- */
-public class ReconnectConnectionCommand extends ConnectionCommand {
-
-	/**
-	 * Default constructor
-	 */
-	public ReconnectConnectionCommand() {
-		super();
-	}
-
-	public boolean canExecute() {
-		// if user didn't set PFLink object beforehand, this command can't be
-		// executed.
-		if (link == null || link.eContainer() == null) {
-			return false;
-		}
-
-		// Reconnect both source and target
-		if (oldSource != null && source != null && oldTarget != null
-				&& target != null) {
-			if (!PageflowValidation.getInstance().isValidLinkForCreation(
-					source, target)) {
-				return false;
-			}
-		}
-
-		// Reconnect source
-		if (oldSource != null && source != null) {
-			if (!PageflowValidation.getInstance().isValidLinkForCreation(
-					source, oldTarget)) {
-				return false;
-			}
-		}
-		// Reconnect target
-		if (oldTarget != null && target != null) {
-			if (!PageflowValidation.getInstance().isValidLinkForCreation(
-					oldSource, target)) {
-				return false;
-			}
-		}
-
-		return true;
-
-	}
-
-	public void doExecute() {
-		String outcome = null, action = null, largeIcon = null, smallIcon = null;
-		boolean isRedirect = false;
-		outcome = link.getOutcome();
-		action = link.getFromaction();
-		isRedirect = link.isRedirect();
-		largeIcon = link.getLargeicon();
-		smallIcon = link.getSmallicon();
-		// It is a reconnect source command
-		if (oldSource != null && source != null) {
-			link.setSource(source);
-		}
-		// It is a reconnect target command
-		if (oldTarget != null && target != null) {
-			link.setTarget(target);
-		}
-		link.setOutcome(outcome);
-		link.setFromaction(action);
-		link.setLargeicon(largeIcon);
-		link.setSmallicon(smallIcon);
-		link.setRedirect(isRedirect);
-	}
-
-	public void undo() {
-		if (canExecute()) {
-			// It was a reconnect source command
-			if (oldSource != null && source != null) {
-				// The link source must be replaced by the oldSource
-				if (link.getSource() != null) {
-					link.getSource().getOutlinks().remove(link);
-				}
-				source.getOutlinks().remove(link);
-				link.setSource(oldSource);
-			}
-			// It was a reconnect target command
-			if (oldTarget != null && target != null) {
-				// The link target must be replaced by the oldTarget
-				if (link.getTarget() != null) {
-					link.getTarget().getInlinks().remove(link);
-				}
-				target.getInlinks().remove(link);
-				link.setTarget(oldTarget);
-			}
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/RenameNodeCommand.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/RenameNodeCommand.java
deleted file mode 100644
index e3e5269..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/RenameNodeCommand.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.command;
-
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode;
-
-/**
- * Command to rename Node.
- * 
- * @author xgzhang
- */
-public class RenameNodeCommand extends Command {
-
-	/** new pageflow node */
-	private PageflowNode node;
-
-	/** new node name */
-	private String name;
-
-	/** old node name */
-	private String oldName;
-
-	/**
-	 * @see org.eclipse.gef.commands.Command#execute()
-	 */
-	public void execute() {
-		node.setName(name);
-	}
-
-	/**
-	 * Sets the new Activity name
-	 * 
-	 * @param string
-	 *            the new name
-	 */
-	public void setName(String string) {
-		name = string;
-	}
-
-	/**
-	 * Sets the old Activity name
-	 * 
-	 * @param string
-	 *            the old name
-	 */
-	public void setOldName(String string) {
-		oldName = string;
-	}
-
-	/**
-	 * Sets the source Activity
-	 * @param node 
-	 *            the source Activity
-	 */
-	public void setSource(PageflowNode node) {
-		this.node = node;
-	}
-
-	/**
-	 * @see org.eclipse.gef.commands.Command#undo()
-	 */
-	public void undo() {
-		node.setName(oldName);
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/SetConstraintCommand.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/SetConstraintCommand.java
deleted file mode 100644
index c36b929..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/SetConstraintCommand.java
+++ /dev/null
@@ -1,137 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.command;
-
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.PageflowMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement;
-
-/**
- * This is the SetConstraint command for XY layout edit policy
- * 
- */
-public class SetConstraintCommand extends Command {
-	/** location command label */
-	private static final String COMMAND_LABEL_LOCATION = PageflowMessages.SetConstraintCommand_Location;
-
-	/** resize command label */
-	private static final String COMMAND_LABEL_RESIZE = PageflowMessages.SetConstraintCommand_Resize;
-
-	/** new position */
-	private Point newPos;
-
-	/** new size */
-	private Dimension newSize;
-
-	/** olde position */
-	private Point oldPos;
-
-	/** old size */
-	private Dimension oldSize;
-
-	/** pageflow element */
-	private PageflowElement part;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see Command#execute()
-	 */
-	public void execute() {
-		oldSize = new Dimension(part.getWidth(), part.getHeight());
-		oldPos = new Point(part.getX(), part.getY());
-		part.setX(newPos.x);
-		part.setY(newPos.y);
-		part.setHeight(newSize.height);
-		part.setWidth(newSize.width);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see Command#redo()
-	 */
-	public void redo() {
-		part.setX(newPos.x);
-		part.setY(newPos.y);
-		part.setHeight(newSize.height);
-		part.setWidth(newSize.width);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see Command#undo()
-	 */
-	public void undo() {
-		part.setX(oldPos.x);
-		part.setY(oldPos.y);
-		part.setHeight(oldSize.height);
-		part.setWidth(oldSize.width);
-	}
-
-	/**
-	 * return the label of the constraints
-	 */
-	public String getLabel() {
-		if (oldSize.equals(newSize)) {
-			return COMMAND_LABEL_LOCATION;
-		}
-		return COMMAND_LABEL_RESIZE;
-	}
-
-	/**
-	 * set the new location using rectangle
-	 * 
-	 * @param r -
-	 *            new location
-	 */
-	public void setLocation(Rectangle r) {
-		setLocation(r.getLocation());
-		setSize(r.getSize());
-	}
-
-	/**
-	 * set the new location using point
-	 * 
-	 * @param p -
-	 *            new location point
-	 */
-	public void setLocation(Point p) {
-		newPos = p;
-	}
-
-	/**
-	 * set the pageflow element
-	 * 
-	 * @param part -
-	 *            pageflow element
-	 */
-	public void setPart(PageflowElement part) {
-		this.part = part;
-	}
-
-	/**
-	 * set the new size
-	 * 
-	 * @param p -
-	 *            new size
-	 */
-	public void setSize(Dimension p) {
-		newSize = p;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/ConfigurableRootEditPart.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/ConfigurableRootEditPart.java
deleted file mode 100644
index 083c65e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/ConfigurableRootEditPart.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.SimpleLoweredBorder;
-import org.eclipse.gef.editparts.ScalableFreeformRootEditPart;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-
-/**
- * This RootEditPart can set its own's background, fourground color, and font.
- * All this properties can be changed.
- * 
- * @author Xiao-guang Zhang
- * 
- */
-public class ConfigurableRootEditPart extends ScalableFreeformRootEditPart
-		implements IFigurePreference {
-	/**
-	 * 
-	 */
-	public ConfigurableRootEditPart() {
-		super();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#createFigure()
-	 */
-	protected IFigure createFigure() {
-		IFigure fig = super.createFigure();
-		fig.setOpaque(true);
-		fig.setBorder(new SimpleLoweredBorder());
-		return fig;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.editors.pageflow.editparts.IFigurePreference#setForegroundColor(org.eclipse.swt.graphics.Color)
-	 */
-	public void setForegroundColor(Color c) {
-		getFigure().setForegroundColor(c);
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.editors.pageflow.editparts.IFigurePreference#setBackgroundColor(org.eclipse.swt.graphics.Color)
-	 */
-	public void setBackgroundColor(Color c) {
-		getFigure().setBackgroundColor(c);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.editors.pageflow.editparts.IFigurePreference#setFont(org.eclipse.swt.graphics.Font)
-	 */
-	public void setFont(Font f) {
-		getFigure().setFont(f);
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/DirectEditCellEditorLocator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/DirectEditCellEditorLocator.java
deleted file mode 100644
index 4c71c04..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/DirectEditCellEditorLocator.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart;
-
-import org.eclipse.draw2d.Label;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.tools.CellEditorLocator;
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * CellEditorLocator for Pageflow Node.
- * 
- * @author - Xiaoguang Zhang
- */
-/*package*/ class DirectEditCellEditorLocator implements CellEditorLocator {
-	/** the source label */
-	private Label label;
-
-	/**
-	 * Creates a new DirectEditCellEditorLocator for the given Label
-	 * 
-	 * @param label
-	 *            the Label
-	 */
-	public DirectEditCellEditorLocator(Label label) {
-		setLabel(label);
-	}
-
-	/*
-	 * (non-javadoc)
-	 * 
-	 * @see CellEditorLocator#relocate(CellEditor)
-	 */
-	public void relocate(CellEditor celleditor) {
-		Text text = (Text) celleditor.getControl();
-		Point pref = text.computeSize(-1, -1);
-		// get the label's boundary
-		Rectangle rect = label.getTextBounds().getCopy();
-		label.translateToAbsolute(rect);
-
-		// because the label can be empty and the size is too small
-		// here get the prefered text size according to label's size and default
-		// size.
-		int width, height;
-		if (pref.x > rect.width) {
-			width = pref.x;
-		} else {
-			width = rect.width;
-		}
-
-		if (pref.y > rect.height) {
-			height = pref.y;
-		} else {
-			height = rect.height;
-		}
-
-		// set the boundary of the text control
-		text.setBounds(rect.x - 1, rect.y - 1, width + 1, height + 1);
-	}
-
-	/**
-	 * Returns the Label figure.
-	 * 
-	 * @return the Label
-	 */
-	protected Label getLabel() {
-		return label;
-	}
-
-	/**
-	 * Sets the label.
-	 * 
-	 * @param label
-	 *            The label to set
-	 */
-	protected void setLabel(Label label) {
-		this.label = label;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/IAnnotationEditPart.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/IAnnotationEditPart.java
deleted file mode 100644
index 2c29393..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/IAnnotationEditPart.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.jface.text.source.Annotation;
-
-/**
- * Edit part's Annotation interface
- * 
- * @author Xiao-guang Zhang
- * 
- */
-public interface IAnnotationEditPart {
-	/**
-	 * decorate current Edit Part.
-	 * @param annotation 
-	 */
-	void addAnnotation(Annotation annotation);
-
-	/**
-	 * un-decorate current EditPart
-	 * 
-	 */
-	void removeAnnotation();
-
-	/**
-	 * get the maker's resource instance.
-	 * 
-	 * @return marker resource
-	 */
-	IResource getMarkerResource();
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/IConnectionPreference.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/IConnectionPreference.java
deleted file mode 100644
index 8ff1b9a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/IConnectionPreference.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart;
-
-import org.eclipse.swt.graphics.Color;
-
-/**
- * This interface can be used to set Connection's preference
- * 
- * @author Xiaoguang Zhang
- * 
- */
-public interface IConnectionPreference extends IFigurePreference {
-
-	/**
-	 * set the connection line width
-	 * 
-	 * @param w
-	 */
-	void setLineWidth(int w);
-
-	/**
-	 * set the label visible or not
-	 * 
-	 * @param b
-	 */
-	void setLabelVisible(boolean b);
-
-	/**
-	 * set the label's foreground color
-	 * 
-	 * @param c
-	 */
-	void setLabelForegroundColor(Color c);
-
-	/**
-	 * set the label's background color
-	 * 
-	 * @param c
-	 */
-	void setLabelBackgroundColor(Color c);
-
-	/**
-	 * set the connection router's style, it can be LINE_ROUTING_MANUAL,
-	 * LINE_ROUTING_MANHATTAN
-	 * 
-	 * @param style -
-	 *            The new connection router's style
-	 */
-	void setConnectionRouterStyle(int style);
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/IFigurePreference.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/IFigurePreference.java
deleted file mode 100644
index 3dc924b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/IFigurePreference.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart;
-
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-
-/**
- * This interface can be implemented to set the figure's preferences
- * 
- * @author Xiao-guang Zhang
- * 
- */
-public interface IFigurePreference {
-	/**
-	 * Sets the foreground color.
-	 * 
-	 * @param c
-	 *            The new foreground color
-	 */
-	void setForegroundColor(Color c);
-
-	/**
-	 * Sets the background color.
-	 * 
-	 * @param c
-	 *            The new background color
-	 */
-	void setBackgroundColor(Color c);
-
-	/**
-	 * sets the new font
-	 * 
-	 * @param f
-	 */
-	void setFont(Font f);
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/ILayerPanePreference.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/ILayerPanePreference.java
deleted file mode 100644
index 91d2af6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/ILayerPanePreference.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart;
-
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.swt.graphics.Color;
-
-/**
- * LayerPane has muliple layers, this interface will be used to set different
- * layer's style.
- * 
- * @author Xiao-guang Zhang
- * 
- */
-public interface ILayerPanePreference extends IFigurePreference {
-	/**
-	 * Use manual line router 
-	 */
-	public static int LINE_ROUTING_MANUAL = 0;
-
-	/**
-	 * Use manhattan line router
-	 */
-	public static int LINE_ROUTING_MANHATTAN = 1;
-
-	/**
-	 * sets the grid to be shown or not
-	 * 
-	 * @param bVisible
-	 */
-	void setGridVisible(boolean bVisible);
-
-	/**
-	 * sets the grid's dimension
-	 * 
-	 * @param d
-	 *            The new grid spacing
-	 */
-	void setGridSpacing(Dimension d);
-
-	/**
-	 * set the grid's foregoundColor
-	 * 
-	 * @param c -
-	 *            The new foreground color
-	 */
-	void setGridForegroundColor(Color c);
-
-	/**
-	 * set the connection router's style, it can be LINE_ROUTING_MANUAL,
-	 * LINE_ROUTING_MANHATTAN
-	 * 
-	 * @param style -
-	 *            The new connection router's style
-	 */
-	void setConnectionRouterStyle(int style);
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/INodePreference.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/INodePreference.java
deleted file mode 100644
index 3a2a3f9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/INodePreference.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart;
-
-
-/**
- * This interface can be used to set NodeEditPart's preference
- * 
- * @author Xiaoguang Zhang
- * 
- */
-
-public interface INodePreference extends IFigurePreference {
-
-	/**
-	 * Sets the text placement of the label relative to its icon. The default is
-	 * {@link org.eclipse.draw2d.PositionConstants#EAST}. Other possible values are
-	 * {@link org.eclipse.draw2d.PositionConstants#NORTH}, {@link org.eclipse.draw2d.PositionConstants#SOUTH} and
-	 * {@link org.eclipse.draw2d.PositionConstants#WEST}.
-	 * 
-	 * @param where
-	 *            the text placement
-	 */
-	void setTextPlacement(int where);
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/PFValidator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/PFValidator.java
deleted file mode 100644
index 413a5a1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/PFValidator.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart;
-
-/**
- * @author hmeng
- */
-
-public interface PFValidator {
-	/**
-	 * Validate the current page flow
-	 */
-	void validate();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/PageflowContainerEditPart.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/PageflowContainerEditPart.java
deleted file mode 100644
index 83590a1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/PageflowContainerEditPart.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.gef.EditPolicy;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpolicy.PageflowContainerEditPolicy;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpolicy.PageflowXYLayoutEditPolicy;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.synchronization.PFBatchAdapter;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * abstract class for pageflow container.
- */
-abstract class PageflowContainerEditPart extends PageflowElementEditPart {
-
-	/**
-	 * @param element -
-	 *            pageflow model.
-	 */
-	public PageflowContainerEditPart(PageflowElement element) {
-		super(element);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see AbstractGraphicalEditPart#createFigure()
-	 */
-	protected IFigure createFigure() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see AbstractEditPart#createEditPolicies()
-	 */
-	protected void createEditPolicies() {
-		installEditPolicy(EditPolicy.CONTAINER_ROLE,
-				new PageflowContainerEditPolicy());
-		installEditPolicy(EditPolicy.LAYOUT_ROLE,
-				new PageflowXYLayoutEditPolicy());
-	}
-
-	public Adapter createEMFAdapter() {
-		return new PFBatchAdapter() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see PageflowElementEditPart#notifyChanged(Notification)
-			 */
-			public void doNotifyChanged(Notification notification) {
-				int type = notification.getEventType();
-
-				switch (type) {
-				case Notification.ADD:
-				case Notification.ADD_MANY:
-				case Notification.REMOVE:
-				case Notification.REMOVE_MANY:
-					refreshChildrenOnUIThread();
-					break;
-				case Notification.SET:
-					refreshVisualsOnUIThread();
-					break;
-				}
-				super.notifyChanged(notification);
-			}
-		};
-	}
-
-	private void refreshChildrenOnUIThread() {
-		if (Thread.currentThread() == PlatformUI.getWorkbench().getDisplay().getThread()) {
-			refreshChildren();
-		} else {
-			PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable(){
-				public void run() {
-					refreshChildren();
-				}			
-			});
-		}
-	}
-	
-	private void refreshVisualsOnUIThread() {
-		if (Thread.currentThread() == PlatformUI.getWorkbench().getDisplay().getThread()) {
-			refreshVisuals();
-		} else {
-			PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable(){
-				public void run() {
-					refreshVisuals();
-				}			
-			});
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/PageflowDirectEditManager.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/PageflowDirectEditManager.java
deleted file mode 100644
index 5fa56d1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/PageflowDirectEditManager.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.Label;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.tools.CellEditorLocator;
-import org.eclipse.gef.tools.DirectEditManager;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.VerifyEvent;
-import org.eclipse.swt.events.VerifyListener;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.FontData;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * DirectEditManager for Pageflow node
- * 
- * @author - Xiaoguang Zhang
- */
-/*package*/ final class PageflowDirectEditManager extends DirectEditManager {
-	/** text font */
-	private Font scaledFont;
-
-	/** verify listener for the text control */
-	private VerifyListener verifyListener;
-
-	/** the direct editor's parent label. */
-	private final Label label;
-
-	/**
-	 * Creates a new PageflowDirectEditManager with the given attributes.
-	 * 
-	 * @param source
-	 *            the source EditPart
-	 * @param editorType
-	 *            type of editor
-	 * @param locator
-	 *            the CellEditorLocator
-	 * @param label
-	 */
-	public PageflowDirectEditManager(GraphicalEditPart source,
-			Class editorType, CellEditorLocator locator, Label label) {
-		super(source, editorType, locator);
-		this.label = label;
-	}
-
-	/*
-	 * (non-javadoc)
-	 * 
-	 * @see org.eclipse.gef.tools.DirectEditManager#bringDown()
-	 */
-	protected void bringDown() {
-		// This method might be re-entered when super.bringDown() is called.
-		Font disposeFont = scaledFont;
-		scaledFont = null;
-		super.bringDown();
-		if (disposeFont != null && !disposeFont.isDisposed()) {
-			disposeFont.dispose();
-		}
-	}
-
-	/*
-	 * (non-javadoc)
-	 * 
-	 * @see org.eclipse.gef.tools.DirectEditManager#initCellEditor()
-	 */
-	protected void initCellEditor() {
-		Text text = (Text) getCellEditor().getControl();
-		verifyListener = new VerifyListener() {
-			public void verifyText(VerifyEvent event) {
-				Text text_ = (Text) getCellEditor().getControl();
-				String oldText = text_.getText();
-				// get the left string of the new input character
-				String leftText = oldText.substring(0, event.start);
-				// get the right string of the new input charactor
-				String rightText = oldText.substring(event.end, oldText
-						.length());
-
-				GC gc = new GC(text_);
-				Point size = gc.textExtent(leftText + event.text + rightText);
-				gc.dispose();
-				if (size.x != 0) {
-					size = text_.computeSize(size.x, SWT.DEFAULT);
-				}
-				getCellEditor().getControl().setSize(size.x, size.y);
-			}
-		};
-		text.addVerifyListener(verifyListener);
-
-		// set the initial text, font, to the direct editor
-		String initialLabelText = label.getText();
-		getCellEditor().setValue(initialLabelText);
-		IFigure figure = getEditPart().getFigure();
-		final Font figureFont = figure.getFont();
-        // take a copy of the font data for the label we are cell editing
-		FontData data = figureFont.getFontData()[0];
-		Dimension fontSize = new Dimension(0, data.getHeight());
-		label.translateToAbsolute(fontSize);
-		data.setHeight(fontSize.height);
-
-		if (scaledFont != null && !scaledFont.isDisposed())
-        {
-			scaledFont.dispose();
-        }
-		scaledFont = new Font(figureFont.getDevice(), data);
-
-		text.setFont(scaledFont);
-		text.selectAll();
-	}
-
-	/*
-	 * (non-javadoc)
-	 * 
-	 * @see org.eclipse.gef.tools.DirectEditManager#unhookListeners()
-	 */
-	protected void unhookListeners() {
-		super.unhookListeners();
-		Text text = (Text) getCellEditor().getControl();
-		text.removeVerifyListener(verifyListener);
-		verifyListener = null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/PageflowEditPart.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/PageflowEditPart.java
deleted file mode 100644
index 3f3a80f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/PageflowEditPart.java
+++ /dev/null
@@ -1,424 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-
-import org.eclipse.draw2d.BendpointConnectionRouter;
-import org.eclipse.draw2d.ConnectionLayer;
-import org.eclipse.draw2d.FanRouter;
-import org.eclipse.draw2d.FreeformLayer;
-import org.eclipse.draw2d.FreeformLayout;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.ManhattanConnectionRouter;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.TreeIterator;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.gef.CompoundSnapToHelper;
-import org.eclipse.gef.EditPolicy;
-import org.eclipse.gef.LayerConstants;
-import org.eclipse.gef.SnapToGeometry;
-import org.eclipse.gef.SnapToGrid;
-import org.eclipse.gef.SnapToGuides;
-import org.eclipse.gef.SnapToHelper;
-import org.eclipse.gef.editparts.AbstractEditPart;
-import org.eclipse.gef.editparts.GridLayer;
-import org.eclipse.gef.editpolicies.RootComponentEditPolicy;
-import org.eclipse.gef.editpolicies.SnapFeedbackPolicy;
-import org.eclipse.gef.rulers.RulerProvider;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.text.source.Annotation;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.synchronization.FC2PFTransformer;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.synchronization.PFBatchAdapter;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.util.PageflowAnnotationUtil;
-import org.eclipse.jst.jsf.facesconfig.ui.preference.GEMPreferences;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * The container editr part for the whole pageflow, which uses the
- * WindowFigure(GEM) as the container figure.
- * 
- */
-public class PageflowEditPart extends PageflowContainerEditPart implements
-		LayerConstants, ILayerPanePreference {
-	/** The seperation for the two possible coincided connections */
-	private static final int CONNECTION_SEPERATION = 20;
-
-	private int connectionStyle = -1;
-
-	/**
-	 * Creates a new PageflowEditPart instance.
-	 * 
-	 * @param pageflow -
-	 *            pageflow model
-	 */
-	protected PageflowEditPart(Pageflow pageflow) {
-		super(pageflow);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see AbstractGraphicalEditPart#createFigure()
-	 */
-	protected IFigure createFigure() {
-		FreeformLayer layer = new FreeformLayer();
-		// layer.setOpaque(true);
-		layer.setLayoutManager(new FreeformLayout());
-		return layer;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see AbstractEditPart#createEditPolicies()
-	 */
-	protected void createEditPolicies() {
-		super.createEditPolicies();
-
-		installEditPolicy(EditPolicy.NODE_ROLE, null);
-		installEditPolicy(EditPolicy.GRAPHICAL_NODE_ROLE, null);
-		// installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE, null);
-		installEditPolicy(EditPolicy.COMPONENT_ROLE,
-				new RootComponentEditPolicy());
-		installEditPolicy("Snap Feedback", new SnapFeedbackPolicy()); //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
-	 */
-	public Object getAdapter(Class key) {
-		if (key == SnapToHelper.class) {
-			IPreferenceStore store = EditorPlugin.getDefault()
-					.getPreferenceStore();
-
-			List snapStrategies = new ArrayList();
-			Boolean bRulerVisible = (Boolean) getViewer().getProperty(
-					RulerProvider.PROPERTY_RULER_VISIBILITY);
-			if (bRulerVisible != null && bRulerVisible.booleanValue()) {
-				snapStrategies.add(new SnapToGuides(this));
-			}
-
-			boolean bSnapToGeometry = store
-					.getBoolean(GEMPreferences.SNAP_TO_GEOMETRY);
-			if (bSnapToGeometry) {
-				snapStrategies.add(new SnapToGeometry(this));
-			}
-			boolean bSnapToGrid = store.getBoolean(GEMPreferences.SNAP_TO_GRID);
-			if (bSnapToGrid) {
-				snapStrategies.add(new SnapToGrid(this));
-			}
-
-			if (snapStrategies.size() == 0) {
-				return null;
-			}
-			if (snapStrategies.size() == 1) {
-				return snapStrategies.get(0);
-			}
-
-			SnapToHelper ss[] = new SnapToHelper[snapStrategies.size()];
-			for (int i = 0; i < snapStrategies.size(); i++) {
-				ss[i] = (SnapToHelper) snapStrategies.get(i);
-			}
-			return new CompoundSnapToHelper(ss);
-		}
-		return super.getAdapter(key);
-	}
-
-	/**
-	 * Returns the Pageflow.
-	 * 
-	 * @return the pageflow
-	 */
-	public Pageflow getPageflow() {
-		return (Pageflow) getPageflowElement();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see AbstractEditPart#getModelChildren()
-	 */
-	protected List getModelChildren() {
-		List allChildren = new LinkedList();
-		Iterator it;
-
-		it = getPageflow().getNodes().iterator();
-		while (it.hasNext()) {
-			allChildren.add(it.next());
-		}
-
-		return allChildren;
-	}
-
-	public Adapter createEMFAdapter() {
-		return new PFBatchAdapter() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see Adapter#notifyChanged(Notification)
-			 */
-			public void doNotifyChanged(Notification notification) {
-				int type = notification.getEventType();
-
-				// int featureId = notification.getFeatureID(
-				// PageflowPackage.class );
-				switch (type) {
-				case Notification.ADD:
-				case Notification.ADD_MANY:
-				case Notification.REMOVE:
-				case Notification.REMOVE_MANY:
-					if (Thread.currentThread() == PlatformUI.getWorkbench().getDisplay().getThread()) {
-						refreshChildren();
-					}
-					else {
-						PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
-	
-							public void run() {
-								refreshChildren();		
-							}
-							
-						});
-					}
-					break;
-
-				case Notification.SET:
-					if (Thread.currentThread() == PlatformUI.getWorkbench().getDisplay().getThread()) {
-						refreshChildren();
-						refreshVisuals();
-					}
-					else {
-						PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
-				
-							public void run() {
-								refreshChildren();	
-								refreshVisuals();
-							}
-							
-						});
-					}
-					break;
-				case FC2PFTransformer.MY_NOTIFICATION_TYPE1:
-					restore((Pageflow) getModel());
-					if (Thread.currentThread() == PlatformUI.getWorkbench().getDisplay().getThread()) {
-						refreshChildren();
-						refreshVisuals();
-					}
-					else {
-						PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
-				
-							public void run() {
-								refreshChildren();	
-								refreshVisuals();
-							}
-							
-						});
-					}
-					break;
-				// restore all children
-				case FC2PFTransformer.MY_NOTIFICATION_TYPE:
-					// stop all children
-					postPone((Pageflow) getModel());
-					break;
-				}
-			}
-
-			protected void restore(Pageflow pageflow) {
-				TreeIterator nodes;
-				// restore
-				nodes = pageflow.eAllContents();
-				while (nodes.hasNext()) {
-					setPostpone((EObject) nodes.next(), false);
-				}
-				setPostpone(pageflow, false);
-			}
-
-			void setPostpone(EObject node, boolean enable) {
-				List adapters = node.eAdapters();
-				for (int i = 0; i < adapters.size(); i++) {
-					if (adapters.get(i) instanceof PFBatchAdapter) {
-						((PFBatchAdapter) adapters.get(i))
-								.setNeedPostpone(enable);
-					}
-				}
-			}
-
-			protected void postPone(Pageflow pageflow) {
-				TreeIterator nodes;
-				// postpone
-				nodes = pageflow.eAllContents();
-				while (nodes.hasNext()) {
-					setPostpone((EObject) nodes.next(), true);
-				}
-				setPostpone(pageflow, true);
-			}
-
-		};
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.AbstractEditPart#refreshVisuals()
-	 */
-	protected void refreshVisuals() {
-		super.refreshVisuals();
-		for (int i = 0; i < this.getChildren().size(); i++) {
-			((AbstractEditPart) getChildren().get(i)).refresh();
-		}
-		ConnectionLayer cLayer = (ConnectionLayer) getLayer(CONNECTION_LAYER);
-
-		if (cLayer.getConnectionRouter() == null) {
-			setConnectionRouterStyle(getConnectionRouterStyle());
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.AbstractEditPart#refreshChildren()
-	 */
-	protected void refreshChildren() {
-		super.refreshChildren();
-		PageflowAnnotationUtil.validatePageflow(this);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.editors.pageflow.editparts.IFigurePreference#setFont(org.eclipse.swt.graphics.Font)
-	 */
-	public void setFont(Font f) {
-		getFigure().setFont(f);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.editors.pageflow.editparts.ILayerPanePreference#setConnectionRouterStyle(int)
-	 */
-	public void setConnectionRouterStyle(int style) {
-		//TODO does this need to be execed on UI thread only???
-		connectionStyle = style;
-		ConnectionLayer cLayer = (ConnectionLayer) getLayer(CONNECTION_LAYER);
-		if (style == ILayerPanePreference.LINE_ROUTING_MANHATTAN) {
-			FanRouter router = new FanRouter();
-			router.setSeparation(CONNECTION_SEPERATION);
-			router.setNextRouter(new ManhattanConnectionRouter());
-			cLayer.setConnectionRouter(router);
-		} else if (style == ILayerPanePreference.LINE_ROUTING_MANUAL) {
-			FanRouter router = new FanRouter();
-			router.setSeparation(CONNECTION_SEPERATION);
-			router.setNextRouter(new BendpointConnectionRouter());
-			cLayer.setConnectionRouter(router);
-		}
-	}
-
-	/**
-	 * get the foreground color from preference
-	 * @return the router style value
-	 * 
-	 */
-	public int getConnectionRouterStyle() {
-		if (this.connectionStyle == -1) {
-			IPreferenceStore store = EditorPlugin.getDefault()
-					.getPreferenceStore();
-			String connectionStyle_ = store
-					.getString(GEMPreferences.LINE_ROUTING);
-
-			if (GEMPreferences.LINE_ROUTING_MANHATTAN.equals(connectionStyle_)) {
-				this.connectionStyle = ILayerPanePreference.LINE_ROUTING_MANHATTAN;
-			} else {
-				this.connectionStyle = ILayerPanePreference.LINE_ROUTING_MANUAL;
-			}
-		}
-		return this.connectionStyle;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.editors.pageflow.editparts.IFigurePreference#setForegroundColor(org.eclipse.swt.graphics.Color)
-	 */
-	public void setForegroundColor(Color c) {
-		getFigure().setForegroundColor(c);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.editors.pageflow.editparts.IFigurePreference#setBackgroundColor(org.eclipse.swt.graphics.Color)
-	 */
-	public void setBackgroundColor(Color c) {
-		// getLayer(PRIMARY_LAYER).setOpaque(true);
-		getLayer(PRIMARY_LAYER).setBackgroundColor(c);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.editors.pageflow.editparts.IFigurePreference#setGridVisible(boolean)
-	 */
-	public void setGridVisible(boolean bVisible) {
-		GridLayer gl = (GridLayer) getLayer(GRID_LAYER);
-		gl.setVisible(bVisible);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.editors.pageflow.editparts.IFigurePreference#setGridSpacing(org.eclipse.draw2d.geometry.Dimension)
-	 */
-	public void setGridSpacing(Dimension d) {
-		GridLayer gl = (GridLayer) getLayer(GRID_LAYER);
-		gl.setSpacing(d);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.editors.pageflow.editparts.ILayerPanePreference#setGridForegroundColor(org.eclipse.swt.graphics.Color)
-	 */
-	public void setGridForegroundColor(Color c) {
-		GridLayer gl = (GridLayer) getLayer(GRID_LAYER);
-		gl.setForegroundColor(c);
-	}
-
-    protected void performDirectEdit() {
-        // do nothing
-    }
-
-    protected void performOpen() {
-        // do nothing
-    }
-
-    public void addAnnotation(Annotation annotation) {
-        // do nothing
-        
-    }
-
-    public void removeAnnotation() {
-        // do nothing
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/PageflowEditPartsFactory.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/PageflowEditPartsFactory.java
deleted file mode 100644
index fe57235..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/PageflowEditPartsFactory.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPartFactory;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode;
-
-/**
- * 
- * Edit part factory to create different pageflow elements.
- * 
- * 
- */
-public class PageflowEditPartsFactory implements EditPartFactory {
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see EditPartFactory#createEditPart(EditPart, Object)
-	 */
-	public EditPart createEditPart(EditPart context, Object obj) {
-		if (obj instanceof Pageflow) {
-			return new PageflowEditPart((Pageflow) obj);
-		} else if (obj instanceof PageflowNode) {
-			return new PageflowNodeEditPart((PageflowNode) obj);
-		} else if (obj instanceof PageflowLink) {
-			return new PageflowLinkEditPart((PageflowLink) obj);
-		}
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/PageflowElementEditPart.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/PageflowElementEditPart.java
deleted file mode 100644
index b897c5e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/PageflowElementEditPart.java
+++ /dev/null
@@ -1,362 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.RequestConstants;
-import org.eclipse.gef.editparts.AbstractGraphicalEditPart;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.text.source.Annotation;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.figure.PageflowNodeFigure;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties.PageflowElementPropertySource;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.synchronization.PFBatchAdapter;
-import org.eclipse.jst.jsf.facesconfig.ui.util.WebrootUtil;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.views.properties.IPropertySource;
-
-/**
- * 
- * 
- * <code>PageflowElementEditPart</code> is the base class for all the
- * EditParts in the application, whose model is a subclass of PageflowElement.
- * This class maintains the figure's size and location inresponse to changes in
- * the model, and registers as a listener on its model using the
- * <code>org.eclipse.emf.common.notify.Adapter</code> interface
- */
-public abstract class PageflowElementEditPart extends AbstractGraphicalEditPart
-		implements IAnnotationEditPart {
-	/** image description for different edit part */
-	public static final ImageDescriptor IMG_ACTION = EditorPlugin.getDefault()
-			.getImageDescriptor("facesconfig/Pageflow_Action16.gif"); //$NON-NLS-1$
-
-	private Adapter adapter;
-
-	/**
-	 * @return the emf adapter
-	 */
-	public Adapter createEMFAdapter() {
-		return new PFBatchAdapter() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see AbstractGraphicalEditPart#notifyChanged()
-			 */
-			public void doNotifyChanged(Notification notification) {
-				int type = notification.getEventType();
-				int featureId = notification
-						.getFeatureID(PageflowPackage.class);
-				if (type == Notification.SET) {
-					switch (featureId) {
-					case PageflowPackage.PAGEFLOW_ELEMENT__X:
-					case PageflowPackage.PAGEFLOW_ELEMENT__Y:
-					case PageflowPackage.PAGEFLOW_ELEMENT__WIDTH:
-					case PageflowPackage.PAGEFLOW_ELEMENT__HEIGHT:
-						refreshVisuals();
-						break;
-					}
-				}
-			}
-		};
-	}
-
-	private static final ImageDescriptor IMG_PAGE = EditorPlugin.getDefault()
-			.getImageDescriptor("facesconfig/Pageflow_Page.gif"); //$NON-NLS-1$
-
-	private static final ImageDescriptor IMG_NODE = EditorPlugin.getDefault()
-			.getImageDescriptor("facesconfig/FacesConfig_Pageflow16.gif"); //$NON-NLS-1$
-
-	/** property source of the pageflow element */
-	private IPropertySource propertySource = null;
-
-	private Image image = null;
-
-	/**
-	 * @param element
-	 */
-	protected PageflowElementEditPart(PageflowElement element) {
-		setModel(element);
-	}
-
-	/**
-	 * Returns the image for the pageflow element.
-	 * 
-	 * @param element -
-	 *            pageflow element
-	 * @return - the image for the pageflow element.
-	 */
-	public Image getImage(PageflowElement element) {
-		if (image == null) {
-			ImageDescriptor imageDescriptor = null;
-
-			if (element instanceof PageflowPage) {
-				imageDescriptor = IMG_PAGE;
-			} else {
-				imageDescriptor = IMG_NODE;
-			}
-
-			image = EditorPlugin.getDefault().getImageRegistry().get(
-					imageDescriptor.toString());
-			if (null == image) {
-				EditorPlugin.getDefault().getImageRegistry().put(
-						imageDescriptor.toString(), imageDescriptor);
-				image = EditorPlugin.getDefault().getImageRegistry().get(
-						imageDescriptor.toString());
-			}
-		}
-
-		return image;
-	}
-
-	/**
-	 * get the type name of the pageflow element
-	 * 
-	 * @param element -
-	 *            pageflow element
-	 * @return - the type name of the pageflow element
-	 */
-	public static String getTypeName(PageflowElement element) {
-		if (element instanceof Pageflow) {
-			return "Pageflow"; //$NON-NLS-1$
-		} else if (element instanceof PageflowPage) {
-			return "Page"; //$NON-NLS-1$
-		}
-
-		return "[unknown]"; //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see AbstractGraphicalEditPart#activate()
-	 */
-	public void activate() {
-		if (isActive()) {
-			return;
-		}
-
-		// start listening for changes in the model
-		hookIntoPageflowElement(getPageflowElement());
-
-		super.activate();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see AbstractGraphicalEditPart#deactivate()
-	 */
-	public void deactivate() {
-		if (!isActive()) {
-			return;
-		}
-
-		// stop listening for changes in the model
-		unhookFromPageflowElement(getPageflowElement());
-
-		super.deactivate();
-	}
-
-	/**
-	 * Returns the model as pageflow element.
-	 * 
-	 * @return - pageflow element
-	 */
-	public PageflowElement getPageflowElement() {
-		return (PageflowElement) getModel();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see AbstractEditPart#refreshVisuals()
-	 */
-	protected void refreshVisuals() {
-		if (getParent() != null) {
-			final AbstractGraphicalEditPart part = this;
-			//ensure that this is executed on the UI thread
-			if (Thread.currentThread() == PlatformUI.getWorkbench().getDisplay().getThread()) {
-				refreshVisuals(part);
-			} else {
-				PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable(){
-	
-					public void run() {
-						refreshVisuals(part);
-					}			
-				});
-			}
-		}
-	}
-	
-	private void refreshVisuals(AbstractGraphicalEditPart part) {
-		Point loc = new Point(getPageflowElement().getX(),
-				getPageflowElement().getY());
-		Dimension size = new Dimension(getPageflowElement().getWidth(),
-				getPageflowElement().getHeight());
-		Rectangle r = new Rectangle(loc, size);
-
-		((GraphicalEditPart) getParent()).setLayoutConstraint(part,
-				getFigure(), r);
-	}
-	
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see IAdaptable#getAdapter(Class)
-	 */
-	public Object getAdapter(Class key) {
-		/*
-		 * override the default behavior defined in AbstractEditPart which would
-		 * expect the model to be a property sourced. instead the editpart can
-		 * provide a property source
-		 */
-		if (key == IPropertySource.class) {
-			return getPropertySource();
-		}
-		if (key == Adapter.class) {
-			if (adapter == null) {
-				adapter = createEMFAdapter();
-			}
-			return adapter;
-		}
-		return super.getAdapter(key);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see PageflowElementEditPart#getPropertySource()
-	 */
-	private IPropertySource getPropertySource() {
-		if (propertySource == null) {
-			propertySource = new PageflowElementPropertySource(
-					getPageflowElement());
-		}
-		return propertySource;
-	}
-
-	/**
-	 * Registers this edit part as a listener for change notifications to the
-	 * specified pageflow element.
-	 * 
-	 * @param element
-	 *            the pagelfow element that should be observed for change
-	 *            notifications
-	 */
-	protected void hookIntoPageflowElement(PageflowElement element) {
-		if (null != element) {
-			if (!element.eAdapters().contains(getAdapter(Adapter.class))) {
-				element.eAdapters().add((Adapter) getAdapter(Adapter.class));
-			}
-		}
-	}
-
-	/**
-	 * Removes this edit part from the specified pageflow element. Thus, it will
-	 * no longe receive change notifications.
-	 * 
-	 * @param element
-	 *            the pagelfow element that should not be observed any more
-	 */
-	protected void unhookFromPageflowElement(PageflowElement element) {
-		if (null != element) {
-			element.eAdapters().remove(getAdapter(Adapter.class));
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see AbstractGraphicalEditPart#createFigure()
-	 */
-	protected IFigure createFigure() {
-		IFigure figure_ = null;
-		figure_ = new PageflowNodeFigure();
-		PageflowElement elm = getPageflowElement();
-		if (elm.getName() != null) {
-			((PageflowNodeFigure) figure_).setImageText(getImage(elm), elm
-					.getName());
-		} else {
-			((PageflowNodeFigure) figure_).setImageText(getImage(elm),
-					getTypeName(elm));
-		}
-		((PageflowNodeFigure) figure_).update();
-		return figure_;
-	}
-
-	/**
-	 * perform corresponding request related with double click or direct edit
-	 * click.
-	 * 
-	 * @param request :
-	 *            request composed by mouse click.
-	 */
-	public void performRequest(Request request) {
-		// the request is triggered by double clicked on a edit part
-		if (request.getType() == RequestConstants.REQ_OPEN) {
-			performOpen();
-		} else if (request.getType() == RequestConstants.REQ_DIRECT_EDIT) {
-			performDirectEdit();
-		}
-	}
-
-	/**
-	 * perfrom direct edit request
-	 * 
-	 */
-	protected abstract void performDirectEdit();
-
-	/**
-	 * perform double click request
-	 * 
-	 */
-	protected abstract void performOpen();
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.editors.pageflow.editparts.IEditPartDecorator#decorateEditPart()
-	 */
-	public abstract void addAnnotation(Annotation annotation);
-    
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.editors.pageflow.editparts.IEditPartDecorator#undecorateEditPart()
-	 */
-	public abstract void removeAnnotation();
-    
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.editors.pageflow.marker.IEditPartMarker#getMarkerResource()
-	 */
-	public IResource getMarkerResource() {
-		IResource resource = WebrootUtil.getResource((EObject) getModel());
-		return resource;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/PageflowElementTreeEditPart.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/PageflowElementTreeEditPart.java
deleted file mode 100644
index 9336e11..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/PageflowElementTreeEditPart.java
+++ /dev/null
@@ -1,257 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart;
-
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.Notifier;
-import org.eclipse.gef.editparts.AbstractTreeEditPart;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties.PageflowElementPropertySource;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.views.properties.IPropertySource;
-
-/**
- * This is the abstract base <code>TreeEditPart</code> for pageflow elements.
- */
-public class PageflowElementTreeEditPart extends AbstractTreeEditPart implements
-		Adapter {
-	/** Image descriptor of tree item for the different edit parts */
-	private static final ImageDescriptor IMG_PAGE = EditorPlugin.getDefault()
-			.getImageDescriptor("facesconfig/Pageflow_Page16.gif"); //$NON-NLS-1$
-
-	private static final ImageDescriptor IMG_NODE = EditorPlugin.getDefault()
-			.getImageDescriptor("facesconfig/FacesConfig_Pageflow16.gif"); //$NON-NLS-1$
-
-	/** Property resource for shared property view */
-	private IPropertySource propertySource = null;
-
-	/** notifer to pageflow element */
-	private Notifier target = null;
-
-	/**
-	 * Returns the image for the pageflow element.
-	 * 
-	 * @param element -
-	 *            pageflow element, such as Begin, End, Page, and Action.
-	 * @return - the image for the pageflow element
-	 */
-	public static Image getImage(PageflowElement element) {
-		ImageDescriptor imageDescriptor = null;
-
-		if (element instanceof PageflowPage) {
-			imageDescriptor = IMG_PAGE;
-		} else {
-			imageDescriptor = IMG_NODE;
-		}
-
-		if (null == imageDescriptor) {
-			return null;
-		}
-
-		Image image = EditorPlugin.getDefault().getImageRegistry().get(
-				imageDescriptor.toString());
-		if (null == image) {
-			EditorPlugin.getDefault().getImageRegistry().put(
-					imageDescriptor.toString(), imageDescriptor);
-			image = EditorPlugin.getDefault().getImageRegistry().get(
-					imageDescriptor.toString());
-		}
-
-		return image;
-	}
-
-	/**
-	 * Creates a new PageflowElementTreeEditPart instance.
-	 * 
-	 * @param pageflowElement -
-	 *            create a new edit part according to the pageflow model
-	 */
-	public PageflowElementTreeEditPart(PageflowElement pageflowElement) {
-		super(pageflowElement);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see IAdaptable#getAdapter(Class)
-	 */
-	public Object getAdapter(Class key) {
-		/*
-		 * override the default behavior defined in AbstractEditPart which would
-		 * expect the model to be a property sourced. instead the editpart can
-		 * provide a property source
-		 */
-		if (key == IPropertySource.class) {
-			return getPropertySource();
-		}
-		return super.getAdapter(key);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see AbstractTreeEditPart#getImage()
-	 */
-	protected Image getImage() {
-		return getImage(getPageflowElement());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see PageflowElementEditPart#getPropertySource()
-	 */
-	private IPropertySource getPropertySource() {
-		if (propertySource == null) {
-			propertySource = new PageflowElementPropertySource(
-					getPageflowElement());
-		}
-		return propertySource;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see Adapter#getTarget()
-	 */
-	public Notifier getTarget() {
-		return target;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see AbstractTreeEditPart#getText()
-	 */
-	protected String getText() {
-		return (null != getPageflowElement().getName() ? getPageflowElement()
-				.getName() : "[unnamed]"); //$NON-NLS-1$
-	}
-
-	/**
-	 * Returns the model as <code>PageflowElement</code>.
-	 * 
-	 * @return - the model as <code>PageflowElement</code>
-	 */
-	public PageflowElement getPageflowElement() {
-		return (PageflowElement) getModel();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see Adapter#isAdapterForType(Object)
-	 */
-	public boolean isAdapterForType(Object type) {
-		return type.equals(getModel().getClass());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see Adapter#notifyChanged(Notification)
-	 */
-	public void notifyChanged(Notification notification) {
-		int type = notification.getEventType();
-
-		switch (type) {
-		case Notification.ADD:
-		case Notification.ADD_MANY:
-		case Notification.REMOVE:
-		case Notification.REMOVE_MANY:
-		case Notification.SET:
-			if (Thread.currentThread() == PlatformUI.getWorkbench().getDisplay().getThread()) {
-				refreshVisuals();
-			} else {
-				PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable(){
-					public void run() {
-						refreshVisuals();
-					}
-				});
-			}
-			break;
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see Adapter#setTarget(Notifier)
-	 */
-	public void setTarget(Notifier newTarget) {
-		target = newTarget;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see AbstractGraphicalEditPart#activate()
-	 */
-	public void activate() {
-		if (isActive())
-			return;
-
-		// start listening for changes in the model
-		hookIntoPageflowElement(getPageflowElement());
-
-		super.activate();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see AbstractGraphicalEditPart#deactivate()
-	 */
-	public void deactivate() {
-		if (!isActive())
-			return;
-
-		// stop listening for changes in the model
-		unhookFromPageflowElement(getPageflowElement());
-
-		super.deactivate();
-	}
-
-	/**
-	 * Registers this edit part as a listener for change notifications to the
-	 * specified pageflow element.
-	 * 
-	 * @param element -
-	 *            the pagelfow element that should be observed for change
-	 *            notifications
-	 */
-	protected void hookIntoPageflowElement(PageflowElement element) {
-		if (null != element) {
-			element.eAdapters().add(this);
-		}
-	}
-
-	/**
-	 * Removes this edit part from the specified pageflow element. Thus, it will
-	 * no longe receive change notifications.
-	 * 
-	 * @param element
-	 *            -the pagelfow element that should not be observed
-	 */
-	protected void unhookFromPageflowElement(PageflowElement element) {
-		if (null != element) {
-			element.eAdapters().remove(this);
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/PageflowLinkEditPart.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/PageflowLinkEditPart.java
deleted file mode 100644
index f1bc513..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/PageflowLinkEditPart.java
+++ /dev/null
@@ -1,491 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.RelativeBendpoint;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.Notifier;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.gef.EditPolicy;
-import org.eclipse.gef.editparts.AbstractConnectionEditPart;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.text.source.Annotation;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.PageflowMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpolicy.PFLinkBendpointEditPolicy;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpolicy.PFLinkEditPolicy;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpolicy.PFLinkEndpointEditPolicy;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.figure.PFLinkFigure;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLinkBendpoint;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties.PageflowLinkPropertySource;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.synchronization.PFBatchAdapter;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.util.PageflowAnnotationUtil;
-import org.eclipse.jst.jsf.facesconfig.ui.preference.GEMPreferences;
-import org.eclipse.jst.jsf.facesconfig.ui.util.WebrootUtil;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.views.properties.IPropertySource;
-
-/**
- * <code>PFLinkEditPart</code> is the EditPart for PFLink model elements. The
- * figure for this EditPart is simply a PolylineConnection. Because both
- * AbstractConnectionEditPart and the Adapter interface have a getTarget method,
- * we use an inner class to implement the Adapter interface in order to work
- * around the name collision.
- * 
- * 
- */
-public class PageflowLinkEditPart extends AbstractConnectionEditPart implements
-		IConnectionPreference, IAnnotationEditPart, PFValidator {
-	private static final String PAGEFLOW_ERROR_IMAGE_FILE = "facesconfig/Pageflow_Quickfix_Error.gif"; //$NON-NLS-1$
-
-	/** adapter for notification */
-	private PFLinkAdapter adapter = new PFLinkAdapter();
-
-	/** property source of the pflink */
-	private IPropertySource propertySource = null;
-
-	/** image description for different edit part */
-	public static final ImageDescriptor IMG_WARNING = EditorPlugin.getDefault()
-			.getImageDescriptor(PAGEFLOW_ERROR_IMAGE_FILE);
-
-	private int connectionStyle = -1;
-
-	private PFLinkBendpointEditPolicy bendpointEditPolicy;
-
-	/**
-	 * @param element
-	 */
-	public PageflowLinkEditPart(PageflowLink element) {
-		super();
-		// element.getPageflow()
-		setModel(element);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see AbstractGraphicalEditPart#createFigure()
-	 */
-	protected IFigure createFigure() {
-		IFigure figure_ = new PFLinkFigure();
-		return figure_;
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see AbstractEditPart#createEditPolicies()
-	 */
-	protected void createEditPolicies() {
-		installEditPolicy(EditPolicy.CONNECTION_ENDPOINTS_ROLE,
-				new PFLinkEndpointEditPolicy());
-
-		if (getConnectionRouterStyle() == ILayerPanePreference.LINE_ROUTING_MANUAL) {
-			installEditPolicy(EditPolicy.CONNECTION_BENDPOINTS_ROLE,
-					getBendpointEditPolicy());
-		}
-		//PFLinkEditPolicy policy = new PFLinkEditPolicy();
-		// policy.setSseModel(model);
-		installEditPolicy(EditPolicy.CONNECTION_ROLE, new PFLinkEditPolicy());
-
-	}
-
-	private PFLinkBendpointEditPolicy getBendpointEditPolicy() {
-		if (bendpointEditPolicy == null) {
-			bendpointEditPolicy = new PFLinkBendpointEditPolicy();
-		}
-		return bendpointEditPolicy;
-	}
-
-	private PageflowLink getPFLink() {
-		return (PageflowLink) getModel();
-	}
-
-	private class PFLinkAdapter extends PFBatchAdapter {
-		private Notifier _newTarget = null;
-
-		// private IPropertySource _propertySource = null;
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.emf.common.notify.Adapter#getTarget()
-		 */
-		public Notifier getTarget() {
-			return _newTarget;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.emf.common.notify.Adapter#isAdapterForType(java.lang.Object)
-		 */
-		public boolean isAdapterForType(Object type) {
-			return getModel().getClass() == type;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.emf.common.notify.Adapter#notifyChanged(org.eclipse.emf.common.notify.Notification)
-		 */
-		public void doNotifyChanged(Notification notification) {
-			int type = notification.getEventType();
-			int featureId = notification.getFeatureID(PageflowPackage.class);
-			// FC2PFTransformer.getInstance().NotifyChanged(notification,
-			// getPFLink());
-			switch (type) {
-			case Notification.ADD:
-			case Notification.ADD_MANY:
-			case Notification.REMOVE:
-			case Notification.SET:
-				if (featureId == PageflowPackage.PF_LINK__OUTCOME
-						|| featureId == PageflowPackage.PF_LINK__SOURCE
-						|| featureId == PageflowPackage.PF_LINK__TARGET) {
-					PageflowAnnotationUtil
-							.validateLink(PageflowLinkEditPart.this);
-				}
-				
-				refreshVisualsOnUIThread();
-				break;
-			}
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.emf.common.notify.Adapter#setTarget(org.eclipse.emf.common.notify.Notifier)
-		 */
-		public void setTarget(Notifier newTarget) {
-			this._newTarget = newTarget;
-		}
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see EditPart#activate()
-	 */
-	public void activate() {
-		getPFLink().eAdapters().add(adapter);
-		//PageflowLink element = (PageflowLink) getModel();
-		super.activate();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see EditPart#deactivate()
-	 */
-	public void deactivate() {
-		// getPFLink().eAdapters().remove(adapter);
-		// PageflowLink element = (PageflowLink) getModel();
-		// NavigationCaseType navCase = ((NavigationCaseType) element
-		// .getFCElements().getData().get(0));
-		// navCase.eAdapters().remove(fcAdapter);
-		// TreeIterator iterator = navCase.eAllContents();
-		// while (iterator.hasNext()) {
-		// ((EObject) iterator.next()).eAdapters().remove(fcAdapter);
-		// }
-
-		super.deactivate();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see IAdaptable#getAdapter(java.lang.Class)
-	 */
-	public Object getAdapter(Class key) {
-		/*
-		 * override the default behavior defined in AbstractEditPart which would
-		 * expect the model to be a property sourced. instead the editpart can
-		 * provide a property source
-		 */
-		if (key == IPropertySource.class) {
-			return getPropertySource();
-		}
-		return super.getAdapter(key);
-	}
-
-	private IPropertySource getPropertySource() {
-		if (propertySource == null) {
-			propertySource = new PageflowLinkPropertySource(getPFLink());
-		}
-		return propertySource;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see AbstractEditPart#refreshVisuals()
-	 */
-	protected void refreshVisuals() {
-		super.refreshVisuals();
-		resetLabel();
-		if (getConnectionRouterStyle() == ILayerPanePreference.LINE_ROUTING_MANUAL) {
-			refreshBendpoints();
-		}
-	}
-	
-	private void refreshVisualsOnUIThread() {
-		if (Thread.currentThread() == PlatformUI.getWorkbench().getDisplay().getThread()) {
-			refreshVisuals();
-		} else {
-			PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable(){
-				public void run() {
-					refreshVisuals();
-				}			
-			});
-		}
-	}
-	
-	/**
-	 * set the bendpoint constraints of the pflink connection
-	 * 
-	 */
-	protected void refreshBendpoints() {
-		// bendpoints stored in pflink
-		List modelConstraint = getPFLink().getBendPoints();
-		// bendpoint constraint list
-		List figureConstraint = new ArrayList();
-		for (int i = 0; i < modelConstraint.size(); i++) {
-			PageflowLinkBendpoint wbp = (PageflowLinkBendpoint) modelConstraint
-					.get(i);
-			RelativeBendpoint rbp = new RelativeBendpoint(getConnectionFigure());
-			rbp.setRelativeDimensions(wbp.getFirstRelativeDimension(), wbp
-					.getSecondRelativeDimension());
-			rbp.setWeight((i + 1) / ((float) modelConstraint.size() + 1));
-			figureConstraint.add(rbp);
-		}
-		// set the router constaints.
-		getConnectionFigure().setRoutingConstraint(figureConstraint);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.editors.pageflow.editparts.IConnectionPreference#setLineWidth(int)
-	 */
-	public void setLineWidth(int w) {
-		((PFLinkFigure) getFigure()).setLineWidth(w);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.editors.pageflow.editparts.IConnectionPreference#setLabelVisible(boolean)
-	 */
-	public void setLabelVisible(boolean b) {
-		((PFLinkFigure) getFigure()).setLabelVisible(b);
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.editors.pageflow.editparts.IFigurePreference#setForegroundColor(org.eclipse.swt.graphics.Color)
-	 */
-	public void setForegroundColor(Color c) {
-		((PFLinkFigure) getFigure()).setForegroundColor(c);
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.editors.pageflow.editparts.IFigurePreference#setBackgroundColor(org.eclipse.swt.graphics.Color)
-	 */
-	public void setBackgroundColor(Color c) {
-		((PFLinkFigure) getFigure()).setBackgroundColor(c);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.editors.pageflow.editparts.IFigurePreference#setFont(org.eclipse.swt.graphics.Font)
-	 */
-	public void setFont(Font f) {
-		((PFLinkFigure) getFigure()).setFont(f);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.editors.pageflow.editparts.IConnectionPreference#setLabelForeground(org.eclipse.swt.graphics.Color)
-	 */
-	public void setLabelForegroundColor(Color c) {
-		((PFLinkFigure) getFigure()).setLabelForegroundColor(c);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.editors.pageflow.editparts.IConnectionPreference#setLabelBackground(org.eclipse.swt.graphics.Color)
-	 */
-	public void setLabelBackgroundColor(Color c) {
-		((PFLinkFigure) getFigure()).setLabelBackgroundColor(c);
-	}
-
-	private boolean needDrawingLabel() {
-		return (((PageflowLink) getModel()).getOutcome() != null && ((PageflowLink) getModel())
-				.getOutcome().trim().length() > 0);
-	}
-
-	private boolean needDrawingAction() {
-		return (((PageflowLink) getModel()).getFromaction() != null && ((PageflowLink) getModel())
-				.getFromaction().trim().length() > 0);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.editors.pageflow.editparts.IEditPartDecorator#decorateEditPart()
-	 */
-	public void addAnnotation(final Annotation annotation) {
-		getViewer().getControl().getDisplay().asyncExec(new Runnable() {
-			public void run() {
-				((PFLinkFigure) getFigure()).setImage(getImage(IMG_WARNING));
-				((PFLinkFigure) getFigure()).setToolTipText(annotation
-						.getText());
-			}
-		});
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.editors.pageflow.editparts.IEditPartDecorator#undecorateEditPart()
-	 */
-	public void removeAnnotation() {
-		if (Thread.currentThread() == getViewer().getControl().getDisplay().getThread()) {
-			((PFLinkFigure) getFigure()).clearIcon();
-			resetLabel();
-		} else {
-			getViewer().getControl().getDisplay().asyncExec(new Runnable() {
-				public void run() {
-					((PFLinkFigure) getFigure()).clearIcon();
-					resetLabel();
-				}
-			});
-		}
-	}
-
-	private void resetLabel() {
-		StringBuffer tip = new StringBuffer();
-		if (needDrawingAction()) {
-			((PFLinkFigure) getFigure()).setActionImage();
-			tip.append(PageflowMessages.PageflowLinkEditPart_FromAction).append(
-					((PageflowLink) getModel()).getFromaction());
-		} else if (((PFLinkFigure) getFigure()).getImage() != getImage(IMG_WARNING)) {
-			((PFLinkFigure) getFigure()).clearIcon();
-		}
-		if (needDrawingLabel()) {
-			((PFLinkFigure) getFigure()).setLabel(((PageflowLink) getModel())
-					.getOutcome());
-			if (tip.length() > 0)
-				tip.append("\n"); //$NON-NLS-1$
-			tip.append(PageflowMessages.PageflowLinkEditPart_FromOutcome).append(
-					((PageflowLink) getModel()).getOutcome());
-		} else {
-			((PFLinkFigure) getFigure()).clearOutcome();
-		}
-		((PFLinkFigure) getFigure()).setToolTipText(tip.toString());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.editors.pageflow.marker.IEditPartMarker#getMarkerResource()
-	 * 
-	 */
-	public IResource getMarkerResource() {
-		// IResource resource = null;
-		// if (getModel() instanceof PFLink)
-		// {
-		// resource =
-		// FacesConfigUtil.getFacesConfigResource(((PFLink)getModel()).getPageflow());
-		// }
-		// FIXME: it should be changed to link to faces-config file.
-		IResource resource = WebrootUtil.getResource((EObject) getModel());
-		return resource;
-	}
-
-	private static Image getImage(ImageDescriptor imageDescriptor) {
-		Image image = EditorPlugin.getDefault().getImageRegistry().get(
-				imageDescriptor.toString());
-		if (null == image) {
-			EditorPlugin.getDefault().getImageRegistry().put(
-					imageDescriptor.toString(), imageDescriptor);
-			image = EditorPlugin.getDefault().getImageRegistry().get(
-					imageDescriptor.toString());
-		}
-
-		return image;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.editors.pageflow.editparts.IConnectionPreference#setConnectionRouterStyle(int)
-	 */
-	public void setConnectionRouterStyle(int style) {
-		connectionStyle = style;
-		if (getConnectionRouterStyle() == ILayerPanePreference.LINE_ROUTING_MANUAL) {
-			installEditPolicy(EditPolicy.CONNECTION_BENDPOINTS_ROLE,
-					getBendpointEditPolicy());
-			refreshVisuals();
-		} else {
-			removeEditPolicy(EditPolicy.CONNECTION_BENDPOINTS_ROLE);
-			refreshVisuals();
-		}
-
-	}
-
-	/**
-	 * get the foreground color from preference
-	 * 
-	 */
-	private int getConnectionRouterStyle() {
-		if (this.connectionStyle == -1) {
-			IPreferenceStore store = EditorPlugin.getDefault()
-					.getPreferenceStore();
-			String connectionStyle_ = store
-					.getString(GEMPreferences.LINE_ROUTING);
-
-			if (GEMPreferences.LINE_ROUTING_MANHATTAN.equals(connectionStyle_)) {
-				this.connectionStyle = ILayerPanePreference.LINE_ROUTING_MANHATTAN;
-			} else {
-				this.connectionStyle = ILayerPanePreference.LINE_ROUTING_MANUAL;
-			}
-		}
-		return this.connectionStyle;
-	}
-
-	public void validate() {
-		PageflowAnnotationUtil.validateLink(this);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/PageflowNodeEditPart.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/PageflowNodeEditPart.java
deleted file mode 100644
index 8eac668..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/PageflowNodeEditPart.java
+++ /dev/null
@@ -1,502 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart;
-
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.draw2d.ConnectionAnchor;
-import org.eclipse.draw2d.Label;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.gef.ConnectionEditPart;
-import org.eclipse.gef.EditPolicy;
-import org.eclipse.gef.NodeEditPart;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.requests.DropRequest;
-import org.eclipse.gef.tools.DirectEditManager;
-import org.eclipse.jdt.ui.JavaElementImageDescriptor;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.text.source.Annotation;
-import org.eclipse.jface.viewers.TextCellEditor;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.command.OpenEditorCommand;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpolicy.PageflowElementEditPolicy;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpolicy.PageflowNodeDirectEditPolicy;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpolicy.PageflowNodeEditPolicy;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.figure.ILabelDecorator;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.figure.PageflowNodeFigure;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.synchronization.PFBatchAdapter;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.util.PageflowAnnotationUtil;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.PlatformUI;
-
-
-/**
- * The base class for the applications EditParts that represent
- * PageflowNode-derived objects in the model. This class implements the
- * NodeEditPart interface which supports:
- * <ul>
- * <li>feedback for Connections when they are being
- * <li>
- * <li>initially connected and when they are disonnected/reconnected</li>
- * </ul>
- * 
- * 
- */
-public class PageflowNodeEditPart extends PageflowElementEditPart implements
-		NodeEditPart, INodePreference, PFValidator {
-
-	/** property source of pageflow node */
-	// private IPropertySource propertySource = null;
-	protected DirectEditManager editManager;
-
-	private class ImageDecorator implements ILabelDecorator {
-		private Image decrateImage = null;
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see com.sybase.stf.jmt.editors.pageflow.figures.ILabelDecorator#decorateImage(org.eclipse.swt.graphics.Image,
-		 *      java.lang.Object)
-		 */
-		public Image decorateImage(Image image, Object element) {
-			dispose();
-			int adornmentFlags = computeAdornmentFlags(element);
-			if (adornmentFlags != 0) {
-				ImageDescriptor baseImage = ImageDescriptor.createFromImage(image);
-				org.eclipse.swt.graphics.Rectangle bounds = image.getBounds();
-				decrateImage = (new JavaElementImageDescriptor(baseImage,
-						adornmentFlags, new org.eclipse.swt.graphics.Point(
-								bounds.width, bounds.height))).createImage();
-				return decrateImage;
-			}
-			return image;
-		}
-
-		/**
-		 * Computes adornment flags for specified object.
-		 * 
-		 * Note: This method is for internal use only. Clients should not call
-		 * this method.
-		 * 
-		 * @param obj Object to complute flags for.
-		 * @return Adornment flags.
-		 */
-		protected int computeAdornmentFlags(Object obj) {
-			return JavaElementImageDescriptor.WARNING;
-		}
-
-		/**
-		 * Disposes this instance.
-		 */
-		public void dispose() {
-			if (decrateImage != null) {
-				decrateImage.dispose();
-			}
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see com.sybase.stf.jmt.editors.pageflow.figures.ILabelDecorator#decorateText(java.lang.String,
-		 *      java.lang.Object)
-		 */
-		public String decorateText(String text, Object element) {
-			// TODO Auto-generated method stub
-			return null;
-		}
-
-	}
-
-	/**
-	 * Disposes this instance.
-	 */
-	public void dispose() {
-		if (imageDecorator != null) {
-			imageDecorator.dispose();
-		}
-	}
-
-	private ImageDecorator imageDecorator = null;
-
-	/**
-	 * Creates a new PageflowNodeEditPart instance.
-	 * 
-	 * @param element -
-	 *            pageflow node
-	 */
-	public PageflowNodeEditPart(PageflowNode element) {
-		super(element);
-	}
-
-	/**
-	 * get the pageflow node
-	 * 
-	 * @return - pageflow node
-	 */
-	public PageflowNode getPageflowNode() {
-		return (PageflowNode) getModel();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see AbstractGraphicalEditPart#getModelSourceConnections()
-	 */
-	protected List getModelSourceConnections() {
-		return getPageflowNode().getOutlinks();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see AbstractGraphicalEditPart#getModelTargetConnections()
-	 */
-	protected List getModelTargetConnections() {
-		return getPageflowNode().getInlinks();
-	}
-
-	/**
-	 * Returns the Figure of this, as a node type figure.
-	 * 
-	 * @return - Figure as a NodeFigure.
-	 */
-	protected PageflowNodeFigure getPageflowNodeFigure() {
-		return (PageflowNodeFigure) getFigure();
-	}
-
-	public Adapter createEMFAdapter() {
-		return new PFBatchAdapter() {
-			/**
-			 * when ports are added to a PageflowNode, add this EditPart as a
-			 * listener on the port so that it gets notified of PFLinks being
-			 * added or removed. When links are added or removed from a port
-			 * owned by the PageflowNode of this EditPart, refresh the
-			 * connections.
-			 */
-			public void doNotifyChanged(Notification notification) {
-				int type = notification.getEventType();
-				// FC2PFTransformer.getInstance().NotifyChanged(notification,
-				// (PageflowElement) getModel());
-				switch (type) {
-				case Notification.ADD:
-				case Notification.ADD_MANY:
-				case Notification.REMOVE:
-				case Notification.REMOVE_MANY:
-					if (notification.getNewValue() instanceof PageflowLink) {
-						if (Thread.currentThread() == PlatformUI.getWorkbench().getDisplay().getThread()) {
-							refreshTargetConnections();
-							refreshSourceConnections();
-							validate();
-						} else {
-							PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable(){
-								public void run() {
-									refreshTargetConnections();
-									refreshSourceConnections();
-									validate();
-								}
-							});
-						}
-					}
-					break;
-
-				case Notification.SET:
-					int featureId = notification
-							.getFeatureID(PageflowPackage.class);
-					if (needValidation(featureId)) {
-						validate();
-					}
-					if (Thread.currentThread() == PlatformUI.getWorkbench().getDisplay().getThread()) {
-						refreshVisuals();
-					} else {
-						PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable(){
-							public void run() {
-								refreshVisuals();
-							}
-						});
-					}
-					break;
-				}
-			}
-		};
-	}
-
-	private boolean needValidation(int featureId) {
-		if (getModel() instanceof PageflowPage) {
-			if (featureId == PageflowPackage.PF_PAGE__PATH) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	public void validate() {
-		if (getModel() instanceof PageflowPage) {
-			PageflowAnnotationUtil.validatePage(this);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see AbstractEditPart#createEditPolicies()
-	 */
-	protected void createEditPolicies() {
-		// install the edit policy to handle connection creation
-		installEditPolicy(EditPolicy.GRAPHICAL_NODE_ROLE,
-				new PageflowNodeEditPolicy());
-
-		installEditPolicy(EditPolicy.COMPONENT_ROLE,
-				new PageflowElementEditPolicy());
-
-		// install the direct policy
-		installEditPolicy(EditPolicy.DIRECT_EDIT_ROLE,
-				new PageflowNodeDirectEditPolicy());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see NodeEditPart#getSourceConnectionAnchor(ConnectionEditPart)
-	 */
-	public ConnectionAnchor getSourceConnectionAnchor(
-			ConnectionEditPart connection) {
-		PageflowLink link = (PageflowLink) connection.getModel();
-		return getPageflowNodeFigure().getSourceConnectionAnchorAt(
-				new Point(link.getSource().getX(), link.getSource().getY()));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see NodeEditPart#getSourceConnectionAnchor(Request)
-	 */
-	public ConnectionAnchor getSourceConnectionAnchor(Request request) {
-		Point pt = new Point(((DropRequest) request).getLocation());
-		return getPageflowNodeFigure().getSourceConnectionAnchorAt(pt);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see NodeEditPart#getTargetConnectionAnchor(ConnectionEditPart)
-	 */
-	public ConnectionAnchor getTargetConnectionAnchor(
-			ConnectionEditPart connection) {
-		PageflowLink link = (PageflowLink) connection.getModel();
-		return getPageflowNodeFigure().getTargetConnectionAnchorAt(
-				new Point(link.getTarget().getX(), link.getTarget().getY()));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see NodeEditPart#getTargetConnectionAnchor(Request)
-	 */
-	public ConnectionAnchor getTargetConnectionAnchor(Request request) {
-		Point pt = new Point(((DropRequest) request).getLocation());
-		return getPageflowNodeFigure().getTargetConnectionAnchorAt(pt);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see AbstractEditPart#refreshVisuals()
-	 */
-	protected void refreshVisuals() {
-		super.refreshVisuals();
-
-		getPageflowNodeFigure().setText(getPageflowNode().getName());
-	}
-
-	/**
-	 * make this a listener on its ports
-	 */
-	public void activate() {
-		super.activate();
-
-		Iterator it;
-
-		it = getPageflowNode().getInlinks().iterator();
-		while (it.hasNext()) {
-			PageflowLink link = (PageflowLink) it.next();
-
-			hookIntoPageflowElement(link);
-		}
-
-		it = getPageflowNode().getOutlinks().iterator();
-		while (it.hasNext()) {
-			PageflowLink link = (PageflowLink) it.next();
-
-			hookIntoPageflowElement(link);
-		}
-	}
-
-	/**
-	 * remove this as a listener on its ports
-	 */
-	public void deactivate() {
-		super.deactivate();
-		dispose();
-		Iterator it;
-
-		it = getPageflowNode().getInlinks().iterator();
-		while (it.hasNext()) {
-			PageflowLink link = (PageflowLink) it.next();
-
-			unhookFromPageflowElement(link);
-		}
-
-		it = getPageflowNode().getOutlinks().iterator();
-		while (it.hasNext()) {
-			PageflowLink link = (PageflowLink) it.next();
-
-			unhookFromPageflowElement(link);
-		}
-	}
-
-	/**
-	 * perfrom direct edit request
-	 * 
-	 */
-	protected void performDirectEdit() {
-		if (editManager == null) {
-			Label l = ((PageflowNodeFigure) getFigure()).getLabel();
-			editManager = new PageflowDirectEditManager(this,
-					TextCellEditor.class, new DirectEditCellEditorLocator(l), l);
-		}
-		editManager.show();
-	}
-
-	/**
-	 * perform double click request
-	 * 
-	 */
-	protected void performOpen() {
-		// only Page and Action support the double-click commands
-		if (getModel() instanceof PageflowPage) {
-			// CommandStack stack =
-			// getViewer().getEditDomain().getCommandStack();
-			Command command = new OpenEditorCommand(this);
-			if (command != null && command.canExecute()) {
-				// stack.execute(command);
-				command.execute();
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.editors.pageflow.editparts.IFigurePreference#setForegroundColor(org.eclipse.swt.graphics.Color)
-	 */
-	public void setForegroundColor(Color c) {
-		getPageflowNodeFigure().setForegroundColor(c);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.editors.pageflow.editparts.IFigurePreference#setBackgroundColor(org.eclipse.swt.graphics.Color)
-	 */
-	public void setBackgroundColor(Color c) {
-		getPageflowNodeFigure().setBackgroundColor(c);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.editors.pageflow.editparts.IFigurePreference#setFont(org.eclipse.swt.graphics.Font)
-	 */
-	public void setFont(Font f) {
-		getPageflowNodeFigure().setFont(f);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.editors.pageflow.editparts.INodePreference#setTextPlacement(int)
-	 */
-	public void setTextPlacement(int where) {
-		getPageflowNodeFigure().setTextPlacement(where);
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.editors.pageflow.editparts.IEditPartDecorator#decorateEditPart()
-	 */
-	public void addAnnotation(final Annotation annotation) {
-		getViewer().getControl().getDisplay().asyncExec(new Runnable() {
-			/* (non-Javadoc)
-			 * @see java.lang.Runnable#run()
-			 */
-			public void run() {
-				getPageflowNodeFigure().setImage(
-						getDecoratedImage((PageflowElement) getModel()));
-				getPageflowNodeFigure().setToolTipText(annotation.getText());
-			}
-
-		});
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.editors.pageflow.editparts.IEditPartDecorator#undecorateEditPart()
-	 */
-	public void removeAnnotation() {
-		getViewer().getControl().getDisplay().asyncExec(new Runnable() {
-			public void run() {
-				getPageflowNodeFigure().setImage(
-						getImage((PageflowElement) getModel()));
-				getPageflowNodeFigure().setToolTipText(null);
-			}
-
-		});
-	}
-
-	/**
-	 * Returns the image for the pageflow element.
-	 * 
-	 * @param element -
-	 *            pageflow element
-	 * @return - the image for the pageflow element.
-	 */
-	private Image getDecoratedImage(PageflowElement element) {
-		Image decoratedImage = getImage(element);
-
-		decoratedImage = getImageDecorator().decorateImage(getImage(element),
-				null);
-
-		return decoratedImage;
-	}
-
-	private ImageDecorator getImageDecorator() {
-		if (imageDecorator == null) {
-			imageDecorator = new ImageDecorator();
-		}
-		return imageDecorator;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/PageflowTreeEditPart.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/PageflowTreeEditPart.java
deleted file mode 100644
index 34976d3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/PageflowTreeEditPart.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow;
-
-/**
- * The <code>TreeEditPart</code> implementation for a pageflow.
- * 
- * 
- */
-/*package*/ class PageflowTreeEditPart extends PageflowElementTreeEditPart {
-
-	/**
-	 * Creates a new PageflowTreeEditPart instance.
-	 * 
-	 * @param pageflow
-	 */
-	public PageflowTreeEditPart(Pageflow pageflow) {
-		super(pageflow);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see AbstractEditPart#getModelChildren()
-	 */
-	protected List getModelChildren() {
-		List children_ = getPageflow().getNodes();
-
-		return new ArrayList(children_);
-	}
-
-	/**
-	 * Returns the model as <code>Pageflow</code>.
-	 * 
-	 * @return the model as <code>Pageflow</code>
-	 */
-	public Pageflow getPageflow() {
-		return (Pageflow) getModel();
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/PageflowTreePartFactory.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/PageflowTreePartFactory.java
deleted file mode 100644
index 940113a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/PageflowTreePartFactory.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPartFactory;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement;
-
-/**
- * Edit Part Factory for creation pageflow tree parts
- *
- */
-public class PageflowTreePartFactory implements EditPartFactory {
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see EditPartFactory#createEditPart()
-	 */
-	public EditPart createEditPart(EditPart context, Object model) {
-
-		if (model instanceof Pageflow) {
-			return new PageflowTreeEditPart((Pageflow) model);
-
-		} else if (model instanceof PageflowElement) {
-			return new PageflowElementTreeEditPart((PageflowElement) model);
-		}
-
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpolicy/PFLinkBendpointEditPolicy.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpolicy/PFLinkBendpointEditPolicy.java
deleted file mode 100644
index 4dabafb..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpolicy/PFLinkBendpointEditPolicy.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpolicy;
-
-import org.eclipse.draw2d.Connection;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.editpolicies.BendpointEditPolicy;
-import org.eclipse.gef.requests.BendpointRequest;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.command.CreateBendpointCommand;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.command.DeleteBendpointCommand;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.command.MoveBendpointCommand;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink;
-
-/**
- * Customize the bendpoint edit policy fro pageflow link connections
- *
- */
-public class PFLinkBendpointEditPolicy extends BendpointEditPolicy {
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editpolicies.BendpointEditPolicy#getCreateBendpointCommand(org.eclipse.gef.requests.BendpointRequest)
-	 */
-	protected Command getCreateBendpointCommand(BendpointRequest request) {
-		CreateBendpointCommand createCmd = new CreateBendpointCommand();
-		Point p = request.getLocation();
-		Connection conn = getConnection();
-
-		conn.translateToRelative(p);
-
-		createCmd.setLocation(p);
-		Point ref1 = getConnection().getSourceAnchor().getReferencePoint();
-		Point ref2 = getConnection().getTargetAnchor().getReferencePoint();
-
-		conn.translateToRelative(ref1);
-		conn.translateToRelative(ref2);
-
-		createCmd.setRelativeDimensions(p.getDifference(ref1), p
-				.getDifference(ref2));
-		createCmd.setPFLink((PageflowLink) request.getSource().getModel());
-		createCmd.setIndex(request.getIndex());
-		return createCmd;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editpolicies.BendpointEditPolicy#getDeleteBendpointCommand(org.eclipse.gef.requests.BendpointRequest)
-	 */
-	protected Command getDeleteBendpointCommand(BendpointRequest request) {
-		DeleteBendpointCommand deleteCom = new DeleteBendpointCommand();
-		Point p = request.getLocation();
-		deleteCom.setLocation(p);
-		deleteCom.setPFLink((PageflowLink) request.getSource().getModel());
-		deleteCom.setIndex(request.getIndex());
-		return deleteCom;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editpolicies.BendpointEditPolicy#getMoveBendpointCommand(org.eclipse.gef.requests.BendpointRequest)
-	 */
-	protected Command getMoveBendpointCommand(BendpointRequest request) {
-		MoveBendpointCommand moveCmd = new MoveBendpointCommand();
-		Point p = request.getLocation();
-		Connection conn = getConnection();
-
-		conn.translateToRelative(p);
-
-		moveCmd.setLocation(p);
-
-		Point ref1 = getConnection().getSourceAnchor().getReferencePoint();
-		Point ref2 = getConnection().getTargetAnchor().getReferencePoint();
-
-		conn.translateToRelative(ref1);
-		conn.translateToRelative(ref2);
-
-		moveCmd.setRelativeDimensions(p.getDifference(ref1), p
-				.getDifference(ref2));
-		moveCmd.setPFLink((PageflowLink) request.getSource().getModel());
-		moveCmd.setIndex(request.getIndex());
-		return moveCmd;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpolicy/PFLinkEditPolicy.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpolicy/PFLinkEditPolicy.java
deleted file mode 100644
index d25b227..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpolicy/PFLinkEditPolicy.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpolicy;
-
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.editpolicies.ConnectionEditPolicy;
-import org.eclipse.gef.requests.GroupRequest;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.command.ConnectionCommand;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.command.DeleteConnectionCommand;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink;
-
-/**
- * Customize the connection edit policy for pageflow links
- *
- */
-public class PFLinkEditPolicy extends ConnectionEditPolicy {
-
-	/**
-	 * Default constructor
-	 */
-	public PFLinkEditPolicy() {
-		super();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ConnectionEditPolicy#getDeleteCommand
-	 */
-	protected Command getDeleteCommand(GroupRequest request) {
-		ConnectionCommand c = new DeleteConnectionCommand();
-		c.setPFLink((PageflowLink) getHost().getModel());
-		return c;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpolicy/PFLinkEndpointEditPolicy.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpolicy/PFLinkEndpointEditPolicy.java
deleted file mode 100644
index 59875db..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpolicy/PFLinkEndpointEditPolicy.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpolicy;
-
-import org.eclipse.draw2d.PolylineConnection;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.editpolicies.ConnectionEndpointEditPolicy;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.jst.jsf.facesconfig.ui.preference.GEMPreferences;
-
-/**
- * Customize the endpoint edit policy for pageflow links
- *
- */
-public class PFLinkEndpointEditPolicy extends ConnectionEndpointEditPolicy {
-	/**
-	 * 
-	 */
-	public PFLinkEndpointEditPolicy() {
-		super();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ConnectionEndpointEditPolicy#addSelectionHandles
-	 */
-	protected void addSelectionHandles() {
-		super.addSelectionHandles();
-		IPreferenceStore store = EditorPlugin.getDefault().getPreferenceStore();
-		int connectionWidth = store.getInt(GEMPreferences.LINE_WIDTH);
-		getConnectionFigure().setLineWidth(connectionWidth + 1);
-	}
-
-	private PolylineConnection getConnectionFigure() {
-		return (PolylineConnection) ((GraphicalEditPart) getHost()).getFigure();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ConnectionEndpointEditPolicy#removeSelectionHandles
-	 */
-	protected void removeSelectionHandles() {
-		super.removeSelectionHandles();
-		IPreferenceStore store = EditorPlugin.getDefault().getPreferenceStore();
-		int connectionWidth = store.getInt(GEMPreferences.LINE_WIDTH);
-		getConnectionFigure().setLineWidth(connectionWidth);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpolicy/PageflowContainerEditPolicy.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpolicy/PageflowContainerEditPolicy.java
deleted file mode 100644
index f392f25..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpolicy/PageflowContainerEditPolicy.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpolicy;
-
-import java.util.List;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.commands.CompoundCommand;
-import org.eclipse.gef.editpolicies.ContainerEditPolicy;
-import org.eclipse.gef.requests.CreateRequest;
-import org.eclipse.gef.requests.GroupRequest;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.PageflowMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.command.OrphanChildCommand;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode;
-
-/**
- * Customize the container policy for page flow containers
- *
- */
-public class PageflowContainerEditPolicy extends ContainerEditPolicy {
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ContainerEditPolicy#getCreateCommand()
-	 */
-	protected Command getCreateCommand(CreateRequest request) {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ContainerEditPolicy#getOrphanChildrenCommand()
-	 */
-	public Command getOrphanChildrenCommand(GroupRequest request) {
-		List parts = request.getEditParts();
-		CompoundCommand result = new CompoundCommand("orphanchildcommand"); //$NON-NLS-1$
-		for (int i = 0; i < parts.size(); i++) {
-			OrphanChildCommand orphan = new OrphanChildCommand();
-			orphan
-					.setChild((PageflowNode) ((EditPart) parts.get(i))
-							.getModel());
-			orphan.setParent((Pageflow) getHost().getModel());
-			orphan.setLabel(PageflowMessages.PageflowContainerEditPolicy_OrphanLabel);
-			result.add(orphan);
-		}
-		return result.unwrap();
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpolicy/PageflowElementEditPolicy.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpolicy/PageflowElementEditPolicy.java
deleted file mode 100644
index 04e86db..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpolicy/PageflowElementEditPolicy.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpolicy;
-
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.requests.GroupRequest;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.command.DeleteNodeCommand;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode;
-
-/**
- * Customize component edit policies for page flows
- *
- */
-public class PageflowElementEditPolicy extends
-		org.eclipse.gef.editpolicies.ComponentEditPolicy {
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ComponentEditPolicy#createDeleteCommand()
-	 */
-	protected Command createDeleteCommand(GroupRequest request) {
-		Object parent = getHost().getParent().getModel();
-		DeleteNodeCommand deleteCmd = new DeleteNodeCommand((Pageflow) parent);
-		deleteCmd.setParent((Pageflow) parent);
-		deleteCmd.setChild((PageflowNode) getHost().getModel());
-		return deleteCmd;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpolicy/PageflowNodeDirectEditPolicy.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpolicy/PageflowNodeDirectEditPolicy.java
deleted file mode 100644
index c89d648..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpolicy/PageflowNodeDirectEditPolicy.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpolicy;
-
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.editpolicies.DirectEditPolicy;
-import org.eclipse.gef.requests.DirectEditRequest;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.command.RenameNodeCommand;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode;
-
-/**
- * EditPolicy for the direct editing of pageflow node's name.
- * 
- * @author Xiaoguang Zhang
- */
-public class PageflowNodeDirectEditPolicy extends DirectEditPolicy {
-
-	/*
-	 * (non-javadoc)
-	 * 
-	 * @see DirectEditPolicy#getDirectEditCommand(DirectEditRequest)
-	 */
-	protected Command getDirectEditCommand(DirectEditRequest request) {
-		RenameNodeCommand cmd = new RenameNodeCommand();
-		cmd.setSource((PageflowNode) getHost().getModel());
-		cmd.setOldName(((PageflowNode) getHost().getModel()).getName());
-		cmd.setName((String) request.getCellEditor().getValue());
-		return cmd;
-	}
-
-	/*
-	 * (non-javadoc)
-	 * 
-	 * @see DirectEditPolicy#showCurrentEditValue(DirectEditRequest)
-	 */
-	protected void showCurrentEditValue(DirectEditRequest request) {
-		// String value = (String)request.getCellEditor().getValue();
-		// ((PageflowNodeFigure)getHostFigure()).setText(value);
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpolicy/PageflowNodeEditPolicy.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpolicy/PageflowNodeEditPolicy.java
deleted file mode 100644
index 192d818..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpolicy/PageflowNodeEditPolicy.java
+++ /dev/null
@@ -1,162 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpolicy;
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.Connection;
-import org.eclipse.draw2d.PolylineConnection;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.editpolicies.GraphicalNodeEditPolicy;
-import org.eclipse.gef.requests.CreateConnectionRequest;
-import org.eclipse.gef.requests.ReconnectRequest;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.action.OpenEditorAction;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.command.ConnectionCommand;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.command.ConnectionCommandFactory;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.command.OpenEditorCommand;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart.PageflowNodeEditPart;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.figure.PageflowNodeFigure;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode;
-import org.eclipse.jst.jsf.facesconfig.ui.preference.GEMPreferences;
-
-/**
- * Customizes conntection policies
- *
- */
-public class PageflowNodeEditPolicy extends GraphicalNodeEditPolicy {
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see GraphicalNodeEditPolicy#createDummyConnection()
-	 */
-	protected Connection createDummyConnection(Request req) {
-		PolylineConnection conn = new PolylineConnection();
-		conn.setLineWidth(getLineWidth());
-		conn.setForegroundColor(ColorConstants.black);
-
-		return conn;
-	}
-
-	/**
-	 * get the connection line width from preference.
-	 */
-	private int getLineWidth() {
-		IPreferenceStore store = EditorPlugin.getDefault().getPreferenceStore();
-		int lineWidth = store.getInt(GEMPreferences.LINE_WIDTH);
-		return lineWidth;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see GraphicalNodeEditPolicy#getConnectionCompleteCommand()
-	 */
-	protected Command getConnectionCompleteCommand(
-			CreateConnectionRequest request) {
-		ConnectionCommand command = (ConnectionCommand) request
-				.getStartCommand();
-		// ConnectionAnchor anchor =
-		// getPageflowNodeEditPart().getTargetConnectionAnchor(request);
-
-		command.setTarget(getPageflowNode());
-
-		return command;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see GraphicalNodeEditPolicy#getConnectionCreateCommand()
-	 */
-	protected Command getConnectionCreateCommand(CreateConnectionRequest request) {
-		ConnectionCommand command = ConnectionCommandFactory
-				.createCommand(request);
-		command.setPFLink((PageflowLink) request.getNewObject());
-		PageflowNode flowObject = getPageflowNode();
-		command.setSource(flowObject);
-		request.setStartCommand(command);
-		return command;
-	}
-
-	/**
-	 * get the edit part of pageflow node
-	 * 
-	 * @return - the edit part of pageflow node
-	 */
-	protected PageflowNodeEditPart getPageflowNodeEditPart() {
-		return (PageflowNodeEditPart) getHost();
-	}
-
-	/**
-	 * get the pageflow node
-	 * 
-	 * @return - the pageflow node
-	 */
-	protected PageflowNode getPageflowNode() {
-		return (PageflowNode) getHost().getModel();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see GraphicalNodeEditPolicy#getReconnectTargetCommand()
-	 */
-	protected Command getReconnectTargetCommand(ReconnectRequest request) {
-		ConnectionCommand cmd = ConnectionCommandFactory.createCommand(request);
-		cmd
-				.setPFLink((PageflowLink) request.getConnectionEditPart()
-						.getModel());
-		cmd.setTarget(getPageflowNode());
-		return cmd;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see GraphicalNodeEditPolicy#getReconnectSourceCommand()
-	 */
-	protected Command getReconnectSourceCommand(ReconnectRequest request) {
-		ConnectionCommand cmd = ConnectionCommandFactory.createCommand(request);
-		cmd
-				.setPFLink((PageflowLink) request.getConnectionEditPart()
-						.getModel());
-		cmd.setSource(getPageflowNode());
-		return cmd;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see GraphicalNodeEditPolicy#getCommand()
-	 */
-	public Command getCommand(Request request) {
-		if (OpenEditorAction.OPEN_EDITOR_REQUEST.equals(request.getType())) {
-			return new OpenEditorCommand(getHost());
-		}
-
-		return super.getCommand(request);
-	}
-
-	/**
-	 * return the pageflow node figure
-	 * 
-	 * @return - the pageflow node's figure
-	 */
-	protected PageflowNodeFigure getPageflowNodeFigure() {
-		return (PageflowNodeFigure) ((GraphicalEditPart) getHost()).getFigure();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpolicy/PageflowNodeSelectionEditPolicy.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpolicy/PageflowNodeSelectionEditPolicy.java
deleted file mode 100644
index fb0465d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpolicy/PageflowNodeSelectionEditPolicy.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpolicy;
-
-import org.eclipse.gef.editpolicies.NonResizableEditPolicy;
-
-/**
- * Handles selection of Node. Primary selection is denoted by highlight and a
- * focus rectangle. Normal selection is denoted by highlight only.
- * 
- * @author xgzhang
- */
-public class PageflowNodeSelectionEditPolicy extends NonResizableEditPolicy {
-
-//	private PageflowNodeFigure getFigure() {
-//		PageflowNodeEditPart part = (PageflowNodeEditPart) getHost();
-//		return ((PageflowNodeFigure) part.getFigure());
-//	}
-
-	/**
-	 * @see org.eclipse.gef.editpolicies.SelectionHandlesEditPolicy#hideSelection()
-	 */
-	protected void hideSelection() {
-		super.hideSelection();
-		// getFigure().setSelected(false);
-	}
-
-	/**
-	 * @see org.eclipse.gef.editpolicies.SelectionHandlesEditPolicy#showSelection()
-	 */
-	protected void showPrimarySelection() {
-		super.showPrimarySelection();
-		// getFigure().setSelected(true);
-	}
-
-	/**
-	 * @see org.eclipse.gef.editpolicies.SelectionHandlesEditPolicy#showSelection()
-	 */
-	protected void showSelection() {
-		super.showSelection();
-		// getFigure().setSelected(true);
-
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpolicy/PageflowXYLayoutEditPolicy.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpolicy/PageflowXYLayoutEditPolicy.java
deleted file mode 100644
index dccbfa6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpolicy/PageflowXYLayoutEditPolicy.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpolicy;
-
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPolicy;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.editpolicies.ResizableEditPolicy;
-import org.eclipse.gef.editpolicies.XYLayoutEditPolicy;
-import org.eclipse.gef.requests.CreateRequest;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.PageflowMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.command.AddNodeCommand;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.command.CreateNodeCommand;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.command.SetConstraintCommand;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart.PageflowNodeEditPart;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode;
-
-/**
- * Customize the layout policy for page flows
- *
- */
-public class PageflowXYLayoutEditPolicy extends XYLayoutEditPolicy {
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see XYLayoutEditPolicy#createAddCommand()
-	 */
-	protected Command createAddCommand(EditPart childEditPart, Object constraint) {
-		PageflowNode part = (PageflowNode) childEditPart.getModel();
-		Rectangle rect = (Rectangle) constraint;
-
-		AddNodeCommand add = new AddNodeCommand();
-		add.setParent((Pageflow) getHost().getModel());
-		add.setChild(part);
-		add.setLabel(PageflowMessages.PageflowXYLayoutEditPolicy_Add);
-		add.setDebugLabel("PageFlowXYEP add subpart"); //$NON-NLS-1$
-
-		SetConstraintCommand setConstraint = new SetConstraintCommand();
-
-		setConstraint.setLocation(rect);
-		setConstraint.setPart(part);
-		setConstraint.setLabel(PageflowMessages.PageflowXYLayoutEditPolicy_Add);
-		setConstraint.setDebugLabel("PageFlowXYEP setConstraint"); //$NON-NLS-1$
-		return add.chain(setConstraint);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see XYLayoutEditPolicy#createChangeConstraintCommand()
-	 */
-	protected Command createChangeConstraintCommand(EditPart child,
-			Object constraint) {
-		SetConstraintCommand locationCommand = new SetConstraintCommand();
-		locationCommand.setPart((PageflowNode) child.getModel());
-		locationCommand.setLocation((Rectangle) constraint);
-		return locationCommand;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see XYLayoutEditPolicy#createChildEditPolicy()
-	 */
-	protected EditPolicy createChildEditPolicy(EditPart child) {
-		if (child instanceof PageflowNodeEditPart) {
-			return new PageflowNodeSelectionEditPolicy();
-		}
-
-		return new ResizableEditPolicy();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see XYLayoutEditPolicy#getCreateCommand()
-	 */
-	protected Command getCreateCommand(CreateRequest request) {
-		CreateNodeCommand create = new CreateNodeCommand();
-		create.setParent((Pageflow) getHost().getModel());
-		create.setChild((PageflowNode) request.getNewObject());
-		Rectangle constraint = (Rectangle) getConstraintFor(request);
-		create.setLocation(constraint);
-		create.setLabel(PageflowMessages.PageflowXYLayoutEditPolicy_Add);
-		return create;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see XYLayoutEditPolicy#getDeleteDependantCommand()
-	 */
-	protected Command getDeleteDependantCommand(Request request) {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see XYLayoutEditPolicy#getOrphanChildrenCommand()
-	 */
-	protected Command getOrphanChildrenCommand(Request request) {
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/figure/ConnectionLabel.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/figure/ConnectionLabel.java
deleted file mode 100644
index 702e58e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/figure/ConnectionLabel.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.figure;
-
-import org.eclipse.draw2d.Label;
-import org.eclipse.draw2d.LineBorder;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * This label is used in connection figure, which has a border.
- * 
- * @author Xiao-guang Zhang
- * 
- */
-public class ConnectionLabel extends Label {
-	/**
-	 * 
-	 */
-	public ConnectionLabel() {
-		this(null, null);
-	}
-
-	/**
-	 * @param s
-	 */
-	public ConnectionLabel(String s) {
-		this(s, null);
-	}
-
-	/**
-	 * @param i
-	 */
-	public ConnectionLabel(Image i) {
-		this(null, i);
-	}
-
-	/**
-	 * @param s
-	 * @param i
-	 */
-	public ConnectionLabel(String s, Image i) {
-		super(s, i);
-
-		// setBorder(new LineBorder());
-		setOpaque(true);
-	}
-
-	/**
-	 * set the label's border's width
-	 * 
-	 * @param w
-	 */
-	public void setBorderWidth(int w) {
-		if (getBorder() != null) {
-			((LineBorder) getBorder()).setWidth(w);
-		}
-	}
-
-	/**
-	 * set the label's border's color
-	 * 
-	 * @param c
-	 */
-	public void setBorderColor(Color c) {
-		if (getBorder() != null) {
-			((LineBorder) getBorder()).setColor(c);
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/figure/ILabelDecorator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/figure/ILabelDecorator.java
deleted file mode 100644
index d1d0137..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/figure/ILabelDecorator.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.figure;
-
-import org.eclipse.swt.graphics.Image;
-
-/**
- * A label decorator decorates the label text and image for some element. The
- * original label text and image are obtained by some other means,
- * 
- * 
- * @author Xiao-guang Zhang
- */
-public interface ILabelDecorator {
-	/**
-	 * Returns an image that is based on the given image, but decorated with
-	 * additional information relating to the state of the provided element.
-	 * 
-	 * @param image
-	 *            the input image to decorate, or <code>null</code> if the
-	 *            element has no image
-	 * @param element
-	 *            the element whose image is being decorated
-	 * @return the decorated image, or <code>null</code> if no decoration is
-	 *         to be applied
-	 * 
-	 * @see org.eclipse.jface.resource.CompositeImageDescriptor
-	 */
-	public Image decorateImage(Image image, Object element);
-
-	/**
-	 * Returns a text label that is based on the given text label, but decorated
-	 * with additional information relating to the state of the provided
-	 * element.
-	 * 
-	 * 
-	 * @param text
-	 *            the input text label to decorate
-	 * @param element
-	 *            the element whose image is being decorated
-	 * @return the decorated text label, or <code>null</code> if no decoration
-	 *         is to be applied
-	 */
-	public String decorateText(String text, Object element);
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/figure/NodeLabel.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/figure/NodeLabel.java
deleted file mode 100644
index fa5764d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/figure/NodeLabel.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.figure;
-
-import org.eclipse.draw2d.Label;
-import org.eclipse.draw2d.MarginBorder;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * This derived label has simple tooltip support
- * 
- * @author Xiao-guang Zhang
- * 
- */
-public class NodeLabel extends Label {
-	/**
-	 * 
-	 */
-	public NodeLabel() {
-		super();
-	}
-
-	/**
-	 * @param s
-	 */
-	public NodeLabel(String s) {
-		super(s);
-	}
-
-	/**
-	 * @param i
-	 */
-	public NodeLabel(Image i) {
-		super(i);
-	}
-
-	/**
-	 * @param s
-	 * @param i
-	 */
-	public NodeLabel(String s, Image i) {
-		super(s, i);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.Label#setTextPlacement(int)
-	 */
-	public void setTextPlacement(int where) {
-		super.setTextPlacement(where);
-		layout();
-		invalidate();
-	}
-
-	/**
-	 * set tooltip text
-	 * 
-	 * @param text
-	 */
-	public void setToolTipText(String text) {
-		Label toolTipLabel = null;
-
-		if (text != null && text.length() > 0) {
-			toolTipLabel = new Label(text);
-			toolTipLabel.setBorder(new MarginBorder(3));
-		}
-
-		super.setToolTip(toolTipLabel);
-	}
-
-	/**
-	 * get tooltip's text
-	 * 
-	 * @return the tool tip text string
-	 */
-	public String getToolTipText() {
-		if (getToolTip() != null)
-			return ((Label) getToolTip()).getText();
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/figure/PFLinkFigure.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/figure/PFLinkFigure.java
deleted file mode 100644
index f9ecd41..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/figure/PFLinkFigure.java
+++ /dev/null
@@ -1,318 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.figure;
-
-import org.eclipse.draw2d.Label;
-import org.eclipse.draw2d.MarginBorder;
-import org.eclipse.draw2d.MidpointLocator;
-import org.eclipse.draw2d.PolygonDecoration;
-import org.eclipse.draw2d.PolylineConnection;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.preference.PreferenceConverter;
-import org.eclipse.jface.resource.FontRegistry;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart.PageflowElementEditPart;
-import org.eclipse.jst.jsf.facesconfig.ui.preference.GEMPreferences;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.FontData;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * 
- * The figure for pflink, used by pflink edit part, which is a polyline with a
- * label control on it, and with tooltip support.
- * 
- * @author Xiao-guang Zhang
- */
-public class PFLinkFigure extends PolylineConnection {
-	/** the label attached to the connection */
-	private ConnectionLabel textLabel = null;
-
-	//private ConnectionLabel iconLabel = null;
-
-	/** The label's background color */
-	private Color labelBgColor;
-
-	/** The label's foreground color */
-	private Color labelFgColor;
-
-	/** The label's visiblity */
-	private boolean bLabelVisible = false;
-
-	/** The connection's line width */
-	private int lineWidth = 0;
-
-	/** the polygon decoration for connection line */
-	private PolygonDecoration arrow;
-
-	/**
-	 * 
-	 */
-	public PFLinkFigure() {
-		arrow = new PolygonDecoration();
-		arrow.setTemplate(PolygonDecoration.TRIANGLE_TIP);
-		arrow.setScale(10, getLineWidth() * 2);
-		setTargetDecoration(arrow);
-		setForegroundColor(getForegroundColor());
-	}
-
-	/**
-	 * set the connection's label string
-	 * 
-	 * @param strLabel
-	 */
-	public void setLabel(String strLabel) {
-		if (null != strLabel) {
-			if (textLabel == null) {
-				textLabel = new ConnectionLabel();
-				textLabel.setFont(getLabelFont());
-				textLabel.setBackgroundColor(getLabelBackgroundColor());
-				textLabel.setForegroundColor(getLabelForegroundColor());
-				setLineWidth(getLineWidth());
-				setLabelVisible(getLabelVisible());
-				setForegroundColor(getForegroundColor());
-				add(textLabel, new MidpointLocator(this, 1));
-			}
-			// textLabel.setVisible(true);
-			textLabel.setText(strLabel);
-		}
-	}
-
-	/**
-	 * Set the icon image to null
-	 */
-	public void clearIcon() {
-		setImage(null);
-	}
-
-	/**
-	 * Set the label to empty string
-	 */
-	public void clearOutcome() {
-		setLabel(""); //$NON-NLS-1$
-	}
-
-	/**
-	 * set the connection's label string
-	 * 
-	 * @param image
-	 */
-	public void setImage(Image image) {
-		if (textLabel == null) {
-			textLabel = new ConnectionLabel();
-			textLabel.setFont(getLabelFont());
-			textLabel.setBackgroundColor(getLabelBackgroundColor());
-			textLabel.setForegroundColor(getLabelForegroundColor());
-			setLineWidth(getLineWidth());
-			setLabelVisible(getLabelVisible());
-			setForegroundColor(getForegroundColor());
-			add(textLabel, new MidpointLocator(this, 0));
-		}
-		textLabel.setIcon(image);
-	}
-
-	/**
-	 * Set the action image
-	 */
-	public void setActionImage() {
-		ImageDescriptor imageDescriptor = PageflowElementEditPart.IMG_ACTION;
-		Image image = EditorPlugin.getDefault().getImageRegistry().get(
-				imageDescriptor.toString());
-		if (null == image) {
-			EditorPlugin.getDefault().getImageRegistry().put(
-					imageDescriptor.toString(), imageDescriptor);
-			image = EditorPlugin.getDefault().getImageRegistry().get(
-					imageDescriptor.toString());
-		}
-		setImage(image);
-	}
-
-	/**
-	 * @return the icon image
-	 */
-	public Image getImage() {
-		if (textLabel != null)
-        {
-			return textLabel.getIcon();
-        }
-        return null;
-	}
-
-
-	/**
-	 * @param text
-	 */
-	public void setToolTipText(String text) {
-		Label toolTipLabel = null;
-
-		if (text != null && text.length() > 0) {
-			toolTipLabel = new Label(text);
-			toolTipLabel.setBorder(new MarginBorder(3));
-		}
-
-		super.setToolTip(toolTipLabel);
-	}
-
-	/**
-	 * @return the tool tip text or null if none
-	 */
-	public String getToolTipText() {
-		if (getToolTip() != null)
-		{
-			return ((Label) getToolTip()).getText();
-		}
-		return null;
-	}
-
-	/**
-	 * set the font including label's
-	 * 
-	 */
-	public void setFont(Font f) {
-		if (textLabel != null)
-			textLabel.setFont(f);
-		super.setFont(f);
-	}
-
-	/**
-	 * get the label's font from preference
-	 * 
-	 */
-	private Font getLabelFont() {
-		FontRegistry registry = JFaceResources.getFontRegistry();
-		IPreferenceStore store = EditorPlugin.getDefault().getPreferenceStore();
-		FontData fontData = PreferenceConverter.getFontData(store,
-				GEMPreferences.LINE_LABEL_FONT);
-		if (!registry.get(fontData.toString()).equals(registry.defaultFont()))
-			return registry.get(fontData.toString());
-		
-		registry.put(fontData.toString(), new FontData[] {fontData});
-		return registry.get(fontData.toString());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.Shape#setLineWidth(int)
-	 */
-	public void setLineWidth(int w) {
-		if (textLabel != null)
-			textLabel.setBorderWidth(w);
-		arrow.setScale(10, getLineWidth() * 2);
-		super.setLineWidth(w);
-	}
-
-	/**
-	 * get the connection line width from preference.
-	 */
-	public int getLineWidth() {
-		IPreferenceStore store = EditorPlugin.getDefault().getPreferenceStore();
-		lineWidth = store.getInt(GEMPreferences.LINE_WIDTH);
-		return lineWidth;
-	}
-
-	/**
-	 * set label's visibility
-	 * 
-	 * @param flag -
-	 *            visible or not.
-	 */
-	public void setLabelVisible(boolean flag) {
-		if (textLabel != null)
-			textLabel.setVisible(flag);
-	}
-
-	/**
-	 * get the label's visiblity from preference
-	 * 
-	 */
-	private boolean getLabelVisible() {
-		IPreferenceStore store = EditorPlugin.getDefault().getPreferenceStore();
-		bLabelVisible = store.getBoolean(GEMPreferences.SHOW_LINE_LABELS);
-		return bLabelVisible;
-	}
-
-	/**
-	 * set the label's foreground color
-	 * 
-	 * @param c
-	 */
-	public void setLabelForegroundColor(Color c) {
-		labelFgColor = c;
-		if (textLabel != null)
-			textLabel.setForegroundColor(c);
-	}
-
-	/**
-	 * get the label's foreground color from preference
-	 * 
-	 */
-	private Color getLabelForegroundColor() {
-		if (labelFgColor == null) {
-			IPreferenceStore store = EditorPlugin.getDefault()
-					.getPreferenceStore();
-			labelFgColor = GEMPreferences.getColor(store,
-					GEMPreferences.LINE_LABEL_FONT_COLOR);
-		}
-		return labelFgColor;
-	}
-
-	/**
-	 * set the label's background color
-	 * 
-	 * @param c
-	 */
-	public void setLabelBackgroundColor(Color c) {
-		labelBgColor = c;
-		if (textLabel != null)
-			textLabel.setBackgroundColor(c);
-	}
-
-	/**
-	 * get the label's background color from preference
-	 * 
-	 */
-	private Color getLabelBackgroundColor() {
-		if (labelBgColor == null) {
-			IPreferenceStore store = EditorPlugin.getDefault()
-					.getPreferenceStore();
-			labelBgColor = GEMPreferences.getColor(store,
-					GEMPreferences.LINE_LABEL_COLOR);
-		}
-		return labelBgColor;
-	}
-
-	/**
-	 * get the foreground color from preference
-	 * 
-	 */
-	public Color getForegroundColor() {
-		IPreferenceStore store = EditorPlugin.getDefault().getPreferenceStore();
-		final Color newFgColor = GEMPreferences.getColor(store, GEMPreferences.LINE_COLOR);
-        setForegroundColor(newFgColor);
-		return newFgColor;
-	}
-
-	/**
-	 * set the figure's foreground, which will also update the label's border's
-	 * color.
-	 */
-	public void setForegroundColor(Color c) {
-		if (textLabel != null)
-			textLabel.setBorderColor(c);
-		super.setForegroundColor(c);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/figure/PageflowNodeFigure.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/figure/PageflowNodeFigure.java
deleted file mode 100644
index 9a08273..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/figure/PageflowNodeFigure.java
+++ /dev/null
@@ -1,376 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.figure;
-
-import java.util.Vector;
-
-import org.eclipse.draw2d.ChopboxAnchor;
-import org.eclipse.draw2d.ConnectionAnchor;
-import org.eclipse.draw2d.Figure;
-import org.eclipse.draw2d.FlowLayout;
-import org.eclipse.draw2d.Label;
-import org.eclipse.draw2d.LabelAnchor;
-import org.eclipse.draw2d.MarginBorder;
-import org.eclipse.draw2d.PositionConstants;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.preference.PreferenceConverter;
-import org.eclipse.jface.resource.FontRegistry;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.jst.jsf.facesconfig.ui.preference.GEMPreferences;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.FontData;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * The figure for pageflow node, used by pageflow node edit part.
- * 
- */
-public class PageflowNodeFigure extends Figure {
-	/** Same connection anchors for source and target */
-	protected Vector connectionAnchors = new Vector(1);
-
-	/** label of the pageflow node figure */
-	private NodeLabel label;
-
-	/** the foreground color of Label */
-	private Color labelFgColor;
-
-	/** the background color of Label */
-//	private Color labelBgColor;  // TODO: variable is never read because getter is private
-
-	/** the text placement for the label */
-	private int textPlacement = PositionConstants.SOUTH;
-
-	/**
-	 * Default constructor
-	 */
-	public PageflowNodeFigure() {
-		setLayoutManager(new FlowLayout());
-
-		// initializeConnectionAnchors();
-	}
-
-	/**
-	 * get the source(output) anchor according to the input point.
-	 * 
-	 * @param p -
-	 *            the input point
-	 * @return - Source ConnectionAnchor
-	 */
-	public ConnectionAnchor getSourceConnectionAnchorAt(Point p) {
-		if (getSourceConnectionAnchors().size() == 0)
-			return null;
-		return (ConnectionAnchor) getSourceConnectionAnchors().get(0);
-	}
-
-	/**
-	 * get the default source anchor
-	 * 
-	 * @return - Source ConnectionAnchor
-	 */
-	public ConnectionAnchor getSourceConnectionAnchor() {
-		if (getSourceConnectionAnchors().size() == 0)
-			return null;
-		return (ConnectionAnchor) getSourceConnectionAnchors().get(0);
-	}
-
-	/**
-	 * Get the source connection anchors vector
-	 * 
-	 * @return - the vector
-	 */
-	private Vector getSourceConnectionAnchors() {
-		return connectionAnchors;
-	}
-
-	/**
-	 * get the target (input) connection Anchor according the input point
-	 * 
-	 * @param p -
-	 *            the input Point
-	 * @return - ConnectionAnchor
-	 */
-	public ConnectionAnchor getTargetConnectionAnchorAt(Point p) {
-		if (getTargetConnectionAnchors().size() == 0)
-			return null;
-		return (ConnectionAnchor) getTargetConnectionAnchors().get(0);
-	}
-
-	/**
-	 * get the default target (input) connection Anchor
-	 * 
-	 * @return - ConnectionAnchor
-	 */
-	public ConnectionAnchor getTargetConnectionAnchor() {
-		if (getTargetConnectionAnchors().size() == 0)
-			return null;
-		return (ConnectionAnchor) getTargetConnectionAnchors().get(0);
-	}
-
-	/**
-	 * Get the target connection anchors vector
-	 * 
-	 * @return - the vector
-	 */
-	private Vector getTargetConnectionAnchors() {
-		return connectionAnchors;
-	}
-
-	/**
-	 * update the anchors
-	 * 
-	 */
-	public void update() {
-		initializeConnectionAnchors();
-	}
-
-	/**
-	 * Initialize the connection anchors
-	 * 
-	 */
-	private void initializeConnectionAnchors() {
-		connectionAnchors.removeAllElements();
-		ChopboxAnchor inputConnectionAnchor = new LabelAnchor(label);
-		connectionAnchors.addElement(inputConnectionAnchor);
-	}
-
-	/**
-	 * get the text placement from preference.
-	 * 
-	 */
-	private int getTextPlacement() {
-		IPreferenceStore store = EditorPlugin.getDefault().getPreferenceStore();
-		String s = store.getString(GEMPreferences.LABEL_PLACEMENT);
-		if (GEMPreferences.LABEL_PLACEMENT_TOP.equals(s))
-			textPlacement = PositionConstants.NORTH;
-		else if (GEMPreferences.LABEL_PLACEMENT_BOTTOM.equals(s))
-			textPlacement = PositionConstants.SOUTH;
-		else if (GEMPreferences.LABEL_PLACEMENT_LEFT.equals(s))
-			textPlacement = PositionConstants.WEST;
-		else if (GEMPreferences.LABEL_PLACEMENT_RIGHT.equals(s))
-			textPlacement = PositionConstants.EAST;
-		return textPlacement;
-	}
-
-	/**
-	 * get the label's background color from preference.
-	 * 
-	 * @return
-	 */
-	 // TODO: dead code
-//	private Color getLabelBackgroundColor() {
-//		return labelBgColor;
-//	}
-
-	/**
-	 * get the label's foreground color from preference.
-	 * 
-	 * @return
-	 */
-	private Color getLabelForegroundColor() {
-		if (labelFgColor == null) {
-			IPreferenceStore store = EditorPlugin.getDefault()
-					.getPreferenceStore();
-			labelFgColor = GEMPreferences.getColor(store,
-					GEMPreferences.FIGURE_LABEL_FONT_COLOR);
-		}
-		return labelFgColor;
-	}
-
-	/**
-	 * get the labe's font from preference.
-	 * 
-	 * @return
-	 */
-	private Font getLabelFont() {
-		FontRegistry registry = JFaceResources.getFontRegistry();
-		IPreferenceStore store = EditorPlugin.getDefault().getPreferenceStore();
-		FontData fontData = PreferenceConverter.getFontData(store,
-				GEMPreferences.FIGURE_LABEL_FONT);
-		if (!registry.get(fontData.toString()).equals(registry.defaultFont()))
-			return registry.get(fontData.toString());
-		
-		registry.put(fontData.toString(), new FontData[] {fontData});
-		return registry.get(fontData.toString());
-	}
-
-	/**
-	 * set the image and text of the figure
-	 * 
-	 * @param image -
-	 *            the image
-	 * @param str -
-	 *            the label
-	 */
-	public void setImageText(Image image, String str) {
-		if (image == null)
-			setText(str);
-		else if (str == null)
-			setImage(image);
-		else {
-			if (label == null) {
-				label = new NodeLabel(str, image);
-				label.setTextPlacement(getTextPlacement());
-				label.setForegroundColor(getLabelForegroundColor());
-				label.setFont(getLabelFont());
-				add(label);
-				initializeConnectionAnchors();
-			} else {
-				label.setIcon(image);
-				label.setText(str);
-			}
-		}
-	}
-
-	/**
-	 * set the image of the figure
-	 * 
-	 * @param image -
-	 *            the image
-	 */
-	public void setImage(Image image) {
-		if (image == null)
-			return;
-		if (label == null) {
-			label = new NodeLabel(image);
-			label.setTextPlacement(getTextPlacement());
-			label.setForegroundColor(getLabelForegroundColor());
-			label.setFont(getLabelFont());
-			add(label);
-			initializeConnectionAnchors();
-		} else
-			label.setIcon(image);
-	}
-
-	/**
-	 * set the text of the figure
-	 * 
-	 * @param str -
-	 *            the text
-	 */
-	public void setText(String str) {
-		if (str == null)
-			return;
-		if (label == null) {
-			label = new NodeLabel(str);
-			label.setTextPlacement(getTextPlacement());
-			label.setForegroundColor(getLabelForegroundColor());
-			label.setFont(getLabelFont());
-			add(label);
-			initializeConnectionAnchors();
-		} else
-			label.setText(str);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.Figure#useLocalCoordinates()
-	 */
-	protected boolean useLocalCoordinates() {
-		return true;
-	}
-
-	/**
-	 * Returns the imageBounds.
-	 * 
-	 * @return - Rectangle of image
-	 */
-	public Rectangle getImageBounds() {
-		return label.getIconBounds();
-	}
-
-	/**
-	 * Returns the textBounds.
-	 * 
-	 * @return - Rectangle of text field
-	 */
-	public Rectangle getTextBounds() {
-		return label.getTextBounds();
-	}
-
-	/**
-	 * Returns the label.
-	 * 
-	 * @return - Label
-	 */
-	public Label getLabel() {
-		return label;
-	}
-
-	/**
-	 * set the label's backaground
-	 */
-	public void setBackgroundColor(Color bg) {
-//		TODO: var is never read: labelBgColor = bg;
-		if (label != null)
-			label.setBackgroundColor(bg);
-	}
-
-	/**
-	 * set the label's foreground
-	 */
-	public void setForegroundColor(Color fg) {
-		labelFgColor = fg;
-
-		if (label != null)
-			label.setForegroundColor(fg);
-	}
-
-	/**
-	 * Set the label's font
-	 */
-	public void setFont(Font f) {
-		if (label != null)
-			label.setFont(f);
-		super.setFont(f);
-	}
-
-	/**
-	 * Set the text placement for the label
-	 * 
-	 * @param where
-	 */
-	public void setTextPlacement(int where) {
-		textPlacement = where;
-		if (label != null)
-			label.setTextPlacement(where);
-	}
-
-
-	/**
-	 * @param text
-	 */
-	public void setToolTipText(String text) {
-		Label toolTipLabel = null;
-
-		if (text != null && text.length() > 0) {
-			toolTipLabel = new Label(text);
-			toolTipLabel.setBorder(new MarginBorder(3));
-		}
-
-		super.setToolTip(toolTipLabel);
-	}
-	/**
-	 * @return the figure's tool tip text or null if none
-	 */
-	public String getToolTipText() {
-		if (getToolTip() != null)
-			return ((Label) getToolTip()).getText();
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/layout/PageflowLayoutManager.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/layout/PageflowLayoutManager.java
deleted file mode 100644
index 74c3470..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/layout/PageflowLayoutManager.java
+++ /dev/null
@@ -1,550 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.layout;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.draw2d.geometry.Insets;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.draw2d.graph.DirectedGraph;
-import org.eclipse.draw2d.graph.DirectedGraphLayout;
-import org.eclipse.draw2d.graph.Edge;
-import org.eclipse.draw2d.graph.EdgeList;
-import org.eclipse.draw2d.graph.Node;
-import org.eclipse.draw2d.graph.NodeList;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowFactory;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLinkBendpoint;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.util.PageflowModelManager;
-
-/**
- * This class is a singleton adpater to create the directed graph for the
- * specified pageflow model or update the location information of pageflow model
- * according to directed graph layout algorithms.
- * 
- * @author Xiao-guang Zhang
- */
-public class PageflowLayoutManager {
-	/** node's default size */
-	private static final int NODE_DEFAULT_WIDTH = 50;
-
-	private static final int NODE_DEFAULT_HEIGHT = 50;
-
-	/**
-	 * the margin of the top and left , and margin between each connnected
-	 * directed graph.
-	 */
-	private static final int X_SPACE = 50;
-
-	private static final int Y_SPACE = 50;
-
-	/** node's default padding */
-	private static final int DEFAULT_PADDING = 30;
-
-	private static PageflowLayoutManager manager;
-
-	private Map copiedLinks = null;
-
-	/**
-	 * constructor of PageflowDirectedGraphAdapter
-	 * 
-	 */
-	private PageflowLayoutManager() {
-	    // no external instantiation
-	}
-
-	/**
-	 * return the singleton instance of PageflowDirectedGraphAdapter
-	 * 
-	 * @return - the singleton instance of PageflowDirectedGraphAdapter
-	 */
-	static public PageflowLayoutManager getInstance() {
-		if (manager == null) {
-			manager = new PageflowLayoutManager();
-		}
-		return manager;
-	}
-
-	/**
-	 * layout pageflow using directed graph layout algorithms
-	 * 
-	 * @param pageflow -
-	 *            pageflow model
-	 */
-	public void layoutPageflow(Pageflow pageflow) {
-		List selfLoopLinks = removeSelfLoopLinks(pageflow);
-
-		List lstGraph = createGraphs(pageflow);
-		for (Iterator iter = lstGraph.iterator(); iter.hasNext();) {
-			DirectedGraph graph = (DirectedGraph) iter.next();
-			new DirectedGraphLayout().visit(graph);// .visit(graph);
-		}
-		updatePageflow(lstGraph);
-
-		if (selfLoopLinks != null) {
-			addSelfLoopLinks(pageflow, selfLoopLinks);
-		}
-	}
-
-	/**
-	 * remove the self loop links from pageflow, because the layout algorithm
-	 * does not allow it.
-	 * 
-	 * @param pageflow
-	 * @return
-	 */
-	private List removeSelfLoopLinks(Pageflow pageflow) {
-		List selfLoopLinks = new ArrayList();
-
-		if (pageflow.getLinks() != null) {
-			for (Iterator iter = pageflow.getLinks().iterator(); iter.hasNext();) {
-				PageflowLink link = (PageflowLink) iter.next();
-
-				if (link.getSource() == link.getTarget()) {
-					iter.remove();
-					link.getBendPoints().clear();
-					selfLoopLinks.add(link);
-				}
-			}
-		}
-		return selfLoopLinks;
-	}
-
-	/**
-	 * add back the self loop links with updated bendpoints.
-	 * 
-	 * @param pageflow
-	 * @param selfLoopLinks
-	 */
-	private void addSelfLoopLinks(Pageflow pageflow, List selfLoopLinks) {
-		if (pageflow.getLinks() != null && selfLoopLinks != null
-				&& selfLoopLinks.size() > 0) {
-			EList links = pageflow.getLinks();
-			for (Iterator iter = selfLoopLinks.iterator(); iter.hasNext();) {
-				PageflowLink link = (PageflowLink) iter.next();
-				updateSelfLoopLink(link);
-				links.add(link);
-			}
-		}
-	}
-
-	/**
-	 * Update the bendpoints of the self loop link Follow the following style:
-	 * 
-	 * LeftTop-Top | | Left----Node
-	 * 
-	 * @param selfLoopLink
-	 */
-	public static void updateSelfLoopLink(PageflowLink selfLoopLink) {
-		PageflowNode sourceNode = selfLoopLink.getSource();
-		Rectangle rectNode = getPageflowNodeBounds(sourceNode);
-
-		EList outLinks = sourceNode.getOutlinks();
-		if (outLinks != null && outLinks.size() > 0) {
-			for (Iterator iter = outLinks.iterator(); iter.hasNext();) {
-				PageflowLink anotherSelfLoopLink = (PageflowLink) iter.next();
-				if (anotherSelfLoopLink != selfLoopLink
-						&& anotherSelfLoopLink.getTarget() == sourceNode) {
-					rectNode = getFitnessRectangle(rectNode,
-							anotherSelfLoopLink);
-				}
-			}
-		}
-
-		PageflowFactory factory = PageflowModelManager.getFactory();
-		PageflowLinkBendpoint bpTop = factory.createPFLinkBendpoint();
-		PageflowLinkBendpoint bpLeftTop = factory.createPFLinkBendpoint();
-		PageflowLinkBendpoint bpLeft = factory.createPFLinkBendpoint();
-
-		bpTop.setD1Height(-rectNode.height);
-		bpTop.setD2Height(-rectNode.height);
-
-		bpLeftTop.setD1Width(-rectNode.width);
-		bpLeftTop.setD1Height(-rectNode.height);
-		bpLeftTop.setD2Width(-rectNode.width);
-		bpLeftTop.setD2Height(-rectNode.height);
-
-		bpLeft.setD1Width(-rectNode.width);
-		bpLeft.setD2Width(-rectNode.width);
-
-		selfLoopLink.getBendPoints().add(bpTop);
-		selfLoopLink.getBendPoints().add(bpLeftTop);
-		selfLoopLink.getBendPoints().add(bpLeft);
-	}
-
-	/**
-	 * Calculate the fitness rectangle without conflict with the existing self
-	 * loop's rectangle.
-	 * 
-	 * @param rectDefault
-	 * @param anotherSelfLoopLink
-	 */
-	private static Rectangle getFitnessRectangle(Rectangle rectDefault,
-			PageflowLink anotherSelfLoopLink) {
-		EList bendPoints = anotherSelfLoopLink.getBendPoints();
-		if (bendPoints != null && bendPoints.size() > 0) {
-			for (Iterator iterBendPoint = bendPoints.iterator(); iterBendPoint
-					.hasNext();) {
-				PageflowLinkBendpoint bendPoint = (PageflowLinkBendpoint) iterBendPoint
-						.next();
-				if (bendPoint.getD1Width() == -rectDefault.width
-						&& bendPoint.getD1Height() == -rectDefault.height) {
-					rectDefault = new Rectangle(0, 0, rectDefault.width
-							+ DEFAULT_PADDING, rectDefault.height
-							+ DEFAULT_PADDING);
-					break;
-				}
-			}
-		}
-		return rectDefault;
-	}
-
-	/**
-	 * get the pageflow node's bounds, the orginal point is (0,0)
-	 * 
-	 * @param pfNode
-	 * @return
-	 */
-	private static Rectangle getPageflowNodeBounds(PageflowNode pfNode) {
-		return new Rectangle(0, 0, 64, 36);
-	}
-
-	/**
-	 * get the pageflow node's border rectangle
-	 * 
-	 * @param pfNode
-	 * @return
-	 */
-	private static Rectangle getPageflowNodeRectangle(PageflowNode pfNode) {
-		Rectangle rectNode = null;
-
-		Rectangle bounds = getPageflowNodeBounds(pfNode);
-
-		rectNode = new Rectangle(pfNode.getX(), pfNode.getY(), bounds.width,
-				bounds.height);
-
-		return rectNode;
-	}
-
-	/**
-	 * create the connected subgraphs for the pageflow model, because there
-	 * maybe more than one connected graph in one pageflow definition.
-	 * 
-	 * @param pageflow -
-	 *            Pageflow model
-	 * @return - the connected subgraphs
-	 */
-	private List createGraphs(Pageflow pageflow) {
-		/** the connected subgraphs */
-		List lstGraph = null;
-
-		if (pageflow != null) {
-			// Graph is not connected totally.
-			DirectedGraph graph = null;
-			HashMap nodesMap = new HashMap();
-
-			NodeList nodes = new NodeList();
-			EdgeList edges = new EdgeList();
-
-			// get all nodes in the pageflow
-			List pfNodes = pageflow.getNodes();
-			if (pfNodes != null) {
-				for (Iterator iter = pfNodes.iterator(); iter.hasNext();) {
-					PageflowNode pfNode = (PageflowNode) iter.next();
-					Node node = new Node(pfNode);
-					Rectangle rectNode = null;
-					rectNode = getPageflowNodeBounds(pfNode);
-					if (rectNode != null) {
-						node.width = rectNode.width * 2;
-						node.height = rectNode.height * 2;
-						node.setPadding(new Insets(node.height, node.width,
-								node.height, node.width));
-					} else {
-						node.width = NODE_DEFAULT_WIDTH;
-						node.height = NODE_DEFAULT_HEIGHT;
-						node.setPadding(new Insets(DEFAULT_PADDING));
-					}
-					nodesMap.put(pfNode, node);
-					nodes.add(node);
-				}
-			}
-			// get all edges in the pageflow
-			List pfLinks = pageflow.getLinks();
-			for (Iterator iter = pfLinks.iterator(); iter.hasNext();) {
-				PageflowLink link = (PageflowLink) iter.next();
-				PageflowNode source = link.getSource();
-				PageflowNode target = link.getTarget();
-				Node sourceNode = (Node) nodesMap.get(source);
-				Node targetNode = (Node) nodesMap.get(target);
-
-				if (sourceNode != null && targetNode != null) {
-					Edge edge = new Edge(sourceNode, targetNode);
-					edges.add(edge);
-				}
-			}
-
-			graph = new DirectedGraph();
-
-			graph.nodes = nodes;
-			graph.edges = edges;
-
-			// get the connected subgraphs.
-			lstGraph = new ArrayList();
-			lstGraph.add(graph);// ..getConnectedSubGraphs();
-		}
-		return lstGraph;
-	}
-
-	/**
-	 * update the pageflow according to layout results which are stored in the
-	 * connected subgraphs
-	 * 
-	 * @param lstGraph -
-	 *            connected subgraphs
-	 * 
-	 */
-	private void updatePageflow(List lstGraph) {
-		// y coordiantion of the subgraph's start point
-		int topSubGraph = 0;
-
-		for (Iterator iter = lstGraph.iterator(); iter.hasNext();) {
-			// sub graph's bottom
-			int bottomSubGraph = 0;
-			DirectedGraph graph = (DirectedGraph) iter.next();
-			for (int i = 0; i < graph.nodes.size(); i++) {
-				Node node = graph.nodes.getNode(i);
-				if (!(node.data instanceof PageflowNode)) {
-					continue;
-				}
-				PageflowNode pfNode = (PageflowNode) node.data;
-				pfNode.setX(X_SPACE + node.y);
-
-				pfNode.setY(Y_SPACE + node.x + topSubGraph);
-
-				if ((Y_SPACE + node.x + topSubGraph) > bottomSubGraph) {
-					bottomSubGraph = Y_SPACE + node.x + topSubGraph;
-				}
-			}
-			topSubGraph = bottomSubGraph + Y_SPACE;
-		}
-	}
-
-	/**
-	 * update new pageflow's layout using the existing one.
-	 * @param newPageflow 
-	 * @param oldPageflow 
-	 */
-	public void updatePageflowLayout(Pageflow newPageflow, Pageflow oldPageflow) {
-		List notUpdatedNodes = new ArrayList();
-
-		copiedLinks = new HashMap();
-
-		if (oldPageflow.getNodes().size() > 0) {
-			for (Iterator iter = newPageflow.getNodes().iterator(); iter
-					.hasNext();) {
-				PageflowNode newNode = (PageflowNode) iter.next();
-
-				if (!updatePageflowNode(newNode, oldPageflow)) {
-					notUpdatedNodes.add(newNode);
-				}
-			}
-		} else {
-			notUpdatedNodes.addAll(newPageflow.getNodes());
-		}
-
-		if (oldPageflow.getLinks().size() > 0) {
-			for (Iterator iter = newPageflow.getLinks().iterator(); iter
-					.hasNext();) {
-				PageflowLink newLink = (PageflowLink) iter.next();
-
-				updatePFLink(newLink, oldPageflow);
-			}
-		}
-
-		// if there are still some nodes which are not updated,
-		// they should be check whether there are some layout conflict.
-		if (notUpdatedNodes.size() > 0) {
-			resolveConflict(newPageflow, notUpdatedNodes);
-		}
-
-	}
-
-	/**
-	 * Update pageflow node using the same node
-	 * 
-	 * @param object
-	 * @return - the old pageflow node.
-	 */
-	private boolean updatePageflowNode(PageflowNode newNode,
-			Pageflow oldPageflow) {
-		for (Iterator iter = oldPageflow.getNodes().iterator(); iter.hasNext();) {
-			PageflowNode oldNode = (PageflowNode) iter.next();
-
-			if (oldNode instanceof PageflowPage
-					&& newNode instanceof PageflowPage) {
-				if (((PageflowPage) oldNode).getPath().trim().equals(
-						((PageflowPage) newNode).getPath().trim())) {
-					updatePageflowNode(newNode, oldNode);
-					return true;
-				}
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * Update pageflow node using the same node
-	 * 
-	 * @param object
-	 */
-	private void updatePageflowNode(PageflowNode newNode, PageflowNode node) {
-		newNode.setX(node.getX());
-		newNode.setY(node.getY());
-	}
-
-	/**
-	 * If there are conflict for the nodes, it will resolve it.
-	 * 
-	 * @param newPageflow
-	 * @param notUpdatedNodes
-	 */
-	private void resolveConflict(Pageflow newPageflow, List notUpdatedNodes) {
-		for (Iterator iter = notUpdatedNodes.iterator(); iter.hasNext();) {
-			resolveConflict(newPageflow, (PageflowNode) iter.next());
-		}
-	}
-
-	/**
-	 * Resolve the layout conflict
-	 * 
-	 * @param newPageflow
-	 * @param node
-	 */
-	private void resolveConflict(Pageflow newPageflow, PageflowNode node) {
-		Rectangle nodeRect = getPageflowNodeRectangle(node);
-		boolean bModified = false;
-		for (int i = 0, size = newPageflow.getNodes().size(); i < size; i++) {
-			PageflowNode fixedNode = (PageflowNode) newPageflow.getNodes().get(
-					i);
-			if (node == fixedNode) {
-				continue;
-			}
-			Rectangle fixedNodeRect = getPageflowNodeRectangle(fixedNode);
-			if (fixedNodeRect.intersects(nodeRect)) {
-				nodeRect.x += fixedNodeRect.width + X_SPACE;
-				nodeRect.y += fixedNodeRect.height + Y_SPACE;
-				bModified = true;
-			}
-		}
-		if (bModified) {
-			node.setX(nodeRect.x);
-			node.setY(nodeRect.y);
-		}
-	}
-
-	/**
-	 * Update the link using the same link in the old pageflow
-	 * 
-	 * @param newLink
-	 * @param oldPageflow
-	 */
-	private void updatePFLink(PageflowLink newLink, Pageflow oldPageflow) {
-		for (Iterator iter = oldPageflow.getLinks().iterator(); iter.hasNext();) {
-			PageflowLink oldLink = (PageflowLink) iter.next();
-
-			if (copiedLinks.get(oldLink) != null) {
-				continue;
-			}
-
-			if (isSameLink(newLink, oldLink)) {
-				updatePFLink(newLink, oldLink);
-				break;
-			}
-		}
-	}
-
-	/**
-	 * Check whether this two links in differnet pageflow are same or not.
-	 * 
-	 * @param newLink
-	 * @param oldLink
-	 * @return
-	 */
-	private boolean isSameLink(PageflowLink newLink, PageflowLink oldLink) {
-		PageflowNode newSource = newLink.getSource();
-		PageflowNode newTarget = newLink.getTarget();
-
-		PageflowNode oldSource = oldLink.getSource();
-		PageflowNode oldTarget = oldLink.getTarget();
-
-		// Page-Page
-		if (newSource instanceof PageflowPage
-				&& oldSource instanceof PageflowPage
-				&& newTarget instanceof PageflowPage
-				&& oldTarget instanceof PageflowPage) {
-			if (((PageflowPage) newSource).getPath().trim().equalsIgnoreCase(
-					((PageflowPage) oldSource).getPath().trim())
-					&& ((PageflowPage) newTarget)
-							.getPath()
-							.trim()
-							.equalsIgnoreCase(
-									((PageflowPage) oldTarget).getPath().trim())) {
-				if ((newLink.getOutcome() == null && oldLink.getOutcome() == null)
-						|| (newLink.getOutcome() != null
-								&& oldLink.getOutcome() != null && newLink
-								.getOutcome().trim().equals(
-										oldLink.getOutcome().trim()))) {
-					return true;
-				}
-			}
-		}
-
-		return false;
-	}
-
-	/**
-	 * Update the link using the same link
-	 * 
-	 * @param nodesMap
-	 * @param object
-	 * @return
-	 */
-	private PageflowLink updatePFLink(PageflowLink newLink, PageflowLink link) {
-		PageflowFactory factory = PageflowModelManager.getFactory();
-
-		newLink.getBendPoints().clear();
-
-		for (Iterator iter = link.getBendPoints().iterator(); iter.hasNext();) {
-			PageflowLinkBendpoint bendPoint = (PageflowLinkBendpoint) iter
-					.next();
-			PageflowLinkBendpoint newBendPoint = factory
-					.createPFLinkBendpoint();
-			newBendPoint.setD1Height(bendPoint.getD1Height());
-			newBendPoint.setD1Width(bendPoint.getD1Width());
-			newBendPoint.setD2Height(bendPoint.getD2Height());
-			newBendPoint.setD2Width(bendPoint.getD2Width());
-			newLink.getBendPoints().add(newBendPoint);
-		}
-
-		copiedLinks.put(link, link);
-		return newLink;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/Pageflow.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/Pageflow.java
deleted file mode 100644
index b76fdaf..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/Pageflow.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.model;
-
-import org.eclipse.emf.common.util.EList;
-
-/**
- * <!-- begin-user-doc --> A representation of the model object '<em><b>Pageflow</b></em>'.
- * <!-- end-user-doc -->
- * 
- * <p>
- * The following features are supported:
- * <ul>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow#getNodes <em>Nodes</em>}</li>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow#getLinks <em>Links</em>}</li>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow#getConfigfile <em>Configfile</em>}</li>
- * </ul>
- * </p>
- * 
- * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage#getPageflow()
- * @model
- * @generated
- */
-public interface Pageflow extends PageflowElement {
-	/**
-	 * Returns the value of the '<em><b>Nodes</b></em>' containment
-	 * reference list. The list contents are of type
-	 * {@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode}.
-	 * It is bidirectional and its opposite is '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode#getPageflow <em>Pageflow</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Nodes</em>' containment reference list
-	 * isn't clear, there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the value of the '<em>Nodes</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage#getPageflow_Nodes()
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode#getPageflow
-	 * @model type="org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode"
-	 *        opposite="pageflow" containment="true"
-	 * @generated
-	 */
-	EList getNodes();
-
-	/**
-	 * Returns the value of the '<em><b>Links</b></em>' containment
-	 * reference list. The list contents are of type
-	 * {@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink}. It
-	 * is bidirectional and its opposite is '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink#getPageflow <em>Pageflow</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Links</em>' containment reference list
-	 * isn't clear, there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the value of the '<em>Links</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage#getPageflow_Links()
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink#getPageflow
-	 * @model type="org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PFLink"
-	 *        opposite="pageflow" containment="true"
-	 * @generated
-	 */
-	EList getLinks();
-
-	/**
-	 * Returns the value of the '<em><b>Configfile</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Configfile</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the value of the '<em>Configfile</em>' attribute.
-	 * @see #setConfigfile(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage#getPageflow_Configfile()
-	 * @model
-	 * @generated
-	 */
-	String getConfigfile();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow#getConfigfile <em>Configfile</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @param value
-	 *            the new value of the '<em>Configfile</em>' attribute.
-	 * @see #getConfigfile()
-	 * @generated
-	 */
-	void setConfigfile(String value);
-
-	/**
-	 * 
-	 * @param source 
-	 * @param target 
-	 * @param link 
-	 * @generated NOT
-	 */
-	public void connect(PageflowNode source, PageflowNode target, PageflowLink link);
-
-	/**
-	 * 
-	 * @param nodeType 
-	 * @return the default node name
-	 * @generated NOT
-	 */
-	public String getDefaultNodeName(Class nodeType);
-}
-// Pageflow
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/PageflowElement.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/PageflowElement.java
deleted file mode 100644
index ba2ee9b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/PageflowElement.java
+++ /dev/null
@@ -1,292 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.model;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.ReferenceElement;
-
-/**
- * <!-- begin-user-doc --> A representation of the model object '<em><b>Element</b></em>'.
- * <!-- end-user-doc -->
- * 
- * <p>
- * The following features are supported:
- * <ul>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement#getName <em>Name</em>}</li>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement#getComment <em>Comment</em>}</li>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement#getX <em>X</em>}</li>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement#getY <em>Y</em>}</li>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement#getWidth <em>Width</em>}</li>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement#getHeight <em>Height</em>}</li>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- * 
- * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage#getPageflowElement()
- * @model abstract="true"
- * @generated
- */
-public interface PageflowElement extends EObject {
-	/**
-	 * The pageflow model is based on faces-config model, its elements will
-	 * reference faces-config elements with ReferenceElement.
-	 * @return the ref element
-	 * 
-	 * @generated NOT
-	 */
-	public ReferenceElement getFCElements();
-
-	/**
-	 * Returns the value of the '<em><b>Name</b></em>' attribute. The
-	 * default value is <code>"unnamed"</code>. <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Name</em>' attribute isn't clear, there
-	 * really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the value of the '<em>Name</em>' attribute.
-	 * @see #setName(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage#getPageflowElement_Name()
-	 * @model default="unnamed"
-	 * @generated
-	 */
-	String getName();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement#getName <em>Name</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @param value
-	 *            the new value of the '<em>Name</em>' attribute.
-	 * @see #getName()
-	 * @generated
-	 */
-	void setName(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Comment</b></em>' attribute. <!--
-	 * begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Comment</em>' attribute isn't clear, there
-	 * really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the value of the '<em>Comment</em>' attribute.
-	 * @see #setComment(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage#getPageflowElement_Comment()
-	 * @model
-	 * @generated
-	 */
-	String getComment();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement#getComment <em>Comment</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @param value
-	 *            the new value of the '<em>Comment</em>' attribute.
-	 * @see #getComment()
-	 * @generated
-	 */
-	void setComment(String value);
-
-	/**
-	 * Returns the value of the '<em><b>X</b></em>' attribute. The default
-	 * value is <code>"0"</code>. <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>X</em>' attribute isn't clear, there
-	 * really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the value of the '<em>X</em>' attribute.
-	 * @see #setX(int)
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage#getPageflowElement_X()
-	 * @model default="0"
-	 * @generated
-	 */
-	int getX();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement#getX <em>X</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @param value
-	 *            the new value of the '<em>X</em>' attribute.
-	 * @see #getX()
-	 * @generated
-	 */
-	void setX(int value);
-
-	/**
-	 * Returns the value of the '<em><b>Y</b></em>' attribute. The default
-	 * value is <code>"0"</code>. <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Y</em>' attribute isn't clear, there
-	 * really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the value of the '<em>Y</em>' attribute.
-	 * @see #setY(int)
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage#getPageflowElement_Y()
-	 * @model default="0"
-	 * @generated
-	 */
-	int getY();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement#getY <em>Y</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @param value
-	 *            the new value of the '<em>Y</em>' attribute.
-	 * @see #getY()
-	 * @generated
-	 */
-	void setY(int value);
-
-	/**
-	 * Returns the value of the '<em><b>Width</b></em>' attribute. The
-	 * default value is <code>"-1"</code>. <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Width</em>' attribute isn't clear, there
-	 * really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the value of the '<em>Width</em>' attribute.
-	 * @see #setWidth(int)
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage#getPageflowElement_Width()
-	 * @model default="-1"
-	 * @generated
-	 */
-	int getWidth();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement#getWidth <em>Width</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @param value
-	 *            the new value of the '<em>Width</em>' attribute.
-	 * @see #getWidth()
-	 * @generated
-	 */
-	void setWidth(int value);
-
-	/**
-	 * Returns the value of the '<em><b>Height</b></em>' attribute. The
-	 * default value is <code>"-1"</code>. <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Height</em>' attribute isn't clear, there
-	 * really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the value of the '<em>Height</em>' attribute.
-	 * @see #setHeight(int)
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage#getPageflowElement_Height()
-	 * @model default="-1"
-	 * @generated
-	 */
-	int getHeight();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement#getHeight <em>Height</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @param value
-	 *            the new value of the '<em>Height</em>' attribute.
-	 * @see #getHeight()
-	 * @generated
-	 */
-	void setHeight(int value);
-
-	/**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute. <!--
-	 * begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear, there
-	 * really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage#getPageflowElement_Id()
-	 * @model id="true" required="true" volatile="true"
-	 * @generated
-	 */
-	String getId();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement#getId <em>Id</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @param value
-	 *            the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Reference Link</b></em>' attribute.
-	 * The default value is <code>""</code>. <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Reference Link</em>' attribute isn't
-	 * clear, there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the value of the '<em>Reference Link</em>' attribute.
-	 * @see #setReferenceLink(String)
-	 * @model default="" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='attribute' name='referenceLink'"
-	 * @generated
-	 */
-	String getReferenceLink();
-
-	/**
-	 * Sets the value of the '{@link PageflowElement#getReferenceLink() <em>Reference Link</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @param value
-	 *            the new value of the '<em>Reference Link</em>' attribute.
-	 * @see #getReferenceLink()
-	 * @generated
-	 */
-	void setReferenceLink(String value);
-
-	/**
-	 * @param nofitification 
-	 * @generated NOT
-	 */
-	void notifyModelChanged(Notification nofitification);
-
-	/**
-	 * When the model is modified, the adapters or reference elements should be
-	 * updated.
-	 * 
-	 * @generated NOT
-	 */
-	void update();
-
-	/**
-	 * @generated NOT
-	 */
-	void dispose();
-}
-// PageflowElement
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/PageflowFactory.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/PageflowFactory.java
deleted file mode 100644
index 3d52525..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/PageflowFactory.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.model;
-
-import org.eclipse.emf.ecore.EFactory;
-
-/**
- * <!-- begin-user-doc --> The <b>Factory</b> for the model. It provides a
- * create method for each non-abstract class of the model. <!-- end-user-doc -->
- * 
- * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage
- * @generated
- */
-public interface PageflowFactory extends EFactory {
-	/**
-	 * The singleton instance of the factory. <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	PageflowFactory eINSTANCE = new org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowFactoryImpl();
-
-	/**
-	 * Returns a new object of class '<em>Pageflow</em>'. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return a new object of class '<em>Pageflow</em>'.
-	 * @generated
-	 */
-	Pageflow createPageflow();
-
-	/**
-	 * Returns a new object of class '<em>PF Link</em>'. <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-	 * 
-	 * @return a new object of class '<em>PF Link</em>'.
-	 * @generated
-	 */
-	PageflowLink createPFLink();
-
-	/**
-	 * Returns a new object of class '<em>PF Page</em>'. <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-	 * 
-	 * @return a new object of class '<em>PF Page</em>'.
-	 * @generated
-	 */
-	PageflowPage createPFPage();
-
-	/**
-	 * Returns a new object of class '<em>PF Link Bendpoint</em>'. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return a new object of class '<em>PF Link Bendpoint</em>'.
-	 * @generated
-	 */
-	PageflowLinkBendpoint createPFLinkBendpoint();
-
-	/**
-	 * Returns the package supported by this factory. <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the package supported by this factory.
-	 * @generated
-	 */
-	PageflowPackage getPageflowPackage();
-
-}
-// PageflowFactory
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/PageflowLink.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/PageflowLink.java
deleted file mode 100644
index ac22bcd..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/PageflowLink.java
+++ /dev/null
@@ -1,326 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.model;
-
-import java.util.Vector;
-
-import org.eclipse.emf.common.util.EList;
-
-/**
- * <!-- begin-user-doc --> A representation of the model object '<em><b>PF Link</b></em>'.
- * <!-- end-user-doc -->
- * 
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink#getPageflow <em>Pageflow</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink#getTarget <em>Target</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink#getSource <em>Source</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink#getSmallicon <em>Smallicon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink#getLargeicon <em>Largeicon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink#getFromaction <em>Fromaction</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink#getOutcome <em>Outcome</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink#isRedirect <em>Redirect</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink#getBendPoints <em>Bend Points</em>}</li>
- * </ul>
- * </p>
- * 
- * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage#getPFLink()
- * @model
- * @generated
- */
-public interface PageflowLink extends PageflowElement {
-	/**
-	 * Returns the value of the '<em><b>Pageflow</b></em>' container reference.
-	 * It is bidirectional and its opposite is '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow#getLinks <em>Links</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Pageflow</em>' container reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Pageflow</em>' container reference.
-	 * @see #setPageflow(Pageflow)
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage#getPFLink_Pageflow()
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow#getLinks
-	 * @model opposite="links" required="true"
-	 * @generated
-	 */
-	Pageflow getPageflow();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink#getPageflow <em>Pageflow</em>}' container reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Pageflow</em>' container reference.
-	 * @see #getPageflow()
-	 * @generated
-	 */
-	void setPageflow(Pageflow value);
-
-	/**
-	 * Returns the value of the '<em><b>Target</b></em>' reference.
-	 * It is bidirectional and its opposite is '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode#getInlinks <em>Inlinks</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Target</em>' reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Target</em>' reference.
-	 * @see #setTarget(PageflowNode)
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage#getPFLink_Target()
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode#getInlinks
-	 * @model opposite="inlinks" required="true"
-	 * @generated
-	 */
-	PageflowNode getTarget();
-
-	/**
-	 * @param path
-	 */
-	void setTargetPath(String path);
-
-	/**
-	 * @param path
-	 */
-	void setSourcePath(String path);
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink#getTarget <em>Target</em>}' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Target</em>' reference.
-	 * @see #getTarget()
-	 * @generated
-	 */
-	void setTarget(PageflowNode value);
-
-	/**
-	 * Returns the value of the '<em><b>Source</b></em>' reference.
-	 * It is bidirectional and its opposite is '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode#getOutlinks <em>Outlinks</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Source</em>' reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Source</em>' reference.
-	 * @see #setSource(PageflowNode)
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage#getPFLink_Source()
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode#getOutlinks
-	 * @model opposite="outlinks" required="true"
-	 * @generated
-	 */
-	PageflowNode getSource();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink#getSource <em>Source</em>}' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Source</em>' reference.
-	 * @see #getSource()
-	 * @generated
-	 */
-	void setSource(PageflowNode value);
-
-	/**
-	 * Returns the value of the '<em><b>Smallicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Smallicon</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Smallicon</em>' attribute.
-	 * @see #setSmallicon(String)
-	 * @model
-	 * @generated
-	 */
-	String getSmallicon();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink#getSmallicon <em>Smallicon</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Smallicon</em>' attribute.
-	 * @see #getSmallicon()
-	 * @generated
-	 */
-	void setSmallicon(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Largeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Largeicon</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Largeicon</em>' attribute.
-	 * @see #setLargeicon(String)
-	 * @model
-	 * @generated
-	 */
-	String getLargeicon();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink#getLargeicon <em>Largeicon</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Largeicon</em>' attribute.
-	 * @see #getLargeicon()
-	 * @generated
-	 */
-	void setLargeicon(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Fromaction</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Fromaction</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Fromaction</em>' attribute.
-	 * @see #setFromaction(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage#getPFLink_Fromaction()
-	 * @model
-	 * @generated
-	 */
-	String getFromaction();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink#getFromaction <em>Fromaction</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Fromaction</em>' attribute.
-	 * @see #getFromaction()
-	 * @generated
-	 */
-	void setFromaction(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Outcome</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Outcome</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Outcome</em>' attribute.
-	 * @see #setOutcome(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage#getPFLink_Outcome()
-	 * @model
-	 * @generated
-	 */
-	String getOutcome();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink#getOutcome <em>Outcome</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Outcome</em>' attribute.
-	 * @see #getOutcome()
-	 * @generated
-	 */
-	void setOutcome(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Redirect</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Redirect</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Redirect</em>' attribute.
-	 * @see #setRedirect(boolean)
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage#getPFLink_Redirect()
-	 * @model
-	 * @generated
-	 */
-	boolean isRedirect();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink#isRedirect <em>Redirect</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Redirect</em>' attribute.
-	 * @see #isRedirect()
-	 * @generated
-	 */
-	void setRedirect(boolean value);
-
-	/**
-	 * Returns the value of the '<em><b>Bend Points</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLinkBendpoint}.
-	 * It is bidirectional and its opposite is '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLinkBendpoint#getLink <em>Link</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Bend Points</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Bend Points</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage#getPFLink_BendPoints()
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLinkBendpoint#getLink
-	 * @model type="org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PFLinkBendpoint" opposite="link" containment="true"
-	 * @generated
-	 */
-	EList getBendPoints();
-
-	/**
-	 * <!-- begin-user-doc --> 
-	 * insert a new bendpoint to the link 
-	 * @param index 
-	 * @param point 
-	 * <!--end-user-doc -->
-	 * 
-	 * @generated NOT
-	 */
-	public void insertBendpoint(int index, PageflowLinkBendpoint point);
-
-	/**
-	 * <!-- begin-user-doc --> 
-	 * remove the current bendpoint 
-	 * @param index 
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated NOT
-	 */
-	public void removeBendpoint(int index);
-
-	/**
-	 * <!-- begin-user-doc --> 
-	 * Set the current bendpoint 
-	 * 
-	 * @param index 
-	 * @param point 
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated NOT
-	 */
-	public void setBendpoint(int index, PageflowLinkBendpoint point);
-
-	/**
-	 * <!-- begin-user-doc --> 
-	 * Set a group of bendpoints to reconstruct the link
-	 * @param points 
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated NOT
-	 */
-	public void setBendpoints(Vector points);
-
-}
-// PFLink
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/PageflowLinkBendpoint.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/PageflowLinkBendpoint.java
deleted file mode 100644
index 4e40709..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/PageflowLinkBendpoint.java
+++ /dev/null
@@ -1,237 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.model;
-
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc --> A representation of the model object '<em><b>PF Link Bendpoint</b></em>'.
- * <!-- end-user-doc -->
- * 
- * <p>
- * The following features are supported:
- * <ul>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLinkBendpoint#getD1Width <em>D1 Width</em>}</li>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLinkBendpoint#getD1Height <em>D1 Height</em>}</li>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLinkBendpoint#getD2Width <em>D2 Width</em>}</li>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLinkBendpoint#getD2Height <em>D2 Height</em>}</li>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLinkBendpoint#getWeight <em>Weight</em>}</li>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLinkBendpoint#getLink <em>Link</em>}</li>
- * </ul>
- * </p>
- * 
- * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage#getPFLinkBendpoint()
- * @model
- * @generated
- */
-public interface PageflowLinkBendpoint extends EObject {
-	/**
-	 * Returns the value of the '<em><b>D1 Width</b></em>' attribute. <!--
-	 * begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>D1 Width</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the value of the '<em>D1 Width</em>' attribute.
-	 * @see #setD1Width(int)
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage#getPFLinkBendpoint_D1Width()
-	 * @model
-	 * @generated
-	 */
-	int getD1Width();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLinkBendpoint#getD1Width <em>D1 Width</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @param value
-	 *            the new value of the '<em>D1 Width</em>' attribute.
-	 * @see #getD1Width()
-	 * @generated
-	 */
-	void setD1Width(int value);
-
-	/**
-	 * Returns the value of the '<em><b>D1 Height</b></em>' attribute. <!--
-	 * begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>D1 Height</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the value of the '<em>D1 Height</em>' attribute.
-	 * @see #setD1Height(int)
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage#getPFLinkBendpoint_D1Height()
-	 * @model
-	 * @generated
-	 */
-	int getD1Height();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLinkBendpoint#getD1Height <em>D1 Height</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @param value
-	 *            the new value of the '<em>D1 Height</em>' attribute.
-	 * @see #getD1Height()
-	 * @generated
-	 */
-	void setD1Height(int value);
-
-	/**
-	 * Returns the value of the '<em><b>D2 Width</b></em>' attribute. <!--
-	 * begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>D2 Width</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the value of the '<em>D2 Width</em>' attribute.
-	 * @see #setD2Width(int)
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage#getPFLinkBendpoint_D2Width()
-	 * @model
-	 * @generated
-	 */
-	int getD2Width();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLinkBendpoint#getD2Width <em>D2 Width</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @param value
-	 *            the new value of the '<em>D2 Width</em>' attribute.
-	 * @see #getD2Width()
-	 * @generated
-	 */
-	void setD2Width(int value);
-
-	/**
-	 * Returns the value of the '<em><b>D2 Height</b></em>' attribute. <!--
-	 * begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>D2 Height</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the value of the '<em>D2 Height</em>' attribute.
-	 * @see #setD2Height(int)
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage#getPFLinkBendpoint_D2Height()
-	 * @model
-	 * @generated
-	 */
-	int getD2Height();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLinkBendpoint#getD2Height <em>D2 Height</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @param value
-	 *            the new value of the '<em>D2 Height</em>' attribute.
-	 * @see #getD2Height()
-	 * @generated
-	 */
-	void setD2Height(int value);
-
-	/**
-	 * Returns the value of the '<em><b>Weight</b></em>' attribute. The
-	 * default value is <code>"0.5"</code>. <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Weight</em>' attribute isn't clear, there
-	 * really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the value of the '<em>Weight</em>' attribute.
-	 * @see #setWeight(float)
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage#getPFLinkBendpoint_Weight()
-	 * @model default="0.5"
-	 * @generated
-	 */
-	float getWeight();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLinkBendpoint#getWeight <em>Weight</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @param value
-	 *            the new value of the '<em>Weight</em>' attribute.
-	 * @see #getWeight()
-	 * @generated
-	 */
-	void setWeight(float value);
-
-	/**
-	 * Returns the value of the '<em><b>Link</b></em>' container reference.
-	 * It is bidirectional and its opposite is '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink#getBendPoints <em>Bend Points</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Link</em>' container reference isn't
-	 * clear, there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the value of the '<em>Link</em>' container reference.
-	 * @see #setLink(PageflowLink)
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage#getPFLinkBendpoint_Link()
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink#getBendPoints
-	 * @model opposite="bendPoints" required="true"
-	 * @generated
-	 */
-	PageflowLink getLink();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLinkBendpoint#getLink <em>Link</em>}'
-	 * container reference. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @param value
-	 *            the new value of the '<em>Link</em>' container reference.
-	 * @see #getLink()
-	 * @generated
-	 */
-	void setLink(PageflowLink value);
-
-	/**
-	 * <!-- begin-user-doc --> 
-	 * @return the first relative dim 
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated NOT
-	 */
-	public Dimension getFirstRelativeDimension();
-
-	/**
-	 * <!-- begin-user-doc --> 
-	 * @return the second relative dim 
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated NOT
-	 */
-	public Dimension getSecondRelativeDimension();
-
-	/**
-	 * <!-- begin-user-doc --> 
-	 * @param dim1 
-	 * @param dim2 
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated NOT
-	 */
-	public void setRelativeDimensions(Dimension dim1, Dimension dim2);
-
-}
-// PFLinkBendpoint
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/PageflowNode.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/PageflowNode.java
deleted file mode 100644
index 0559bad..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/PageflowNode.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.model;
-
-import org.eclipse.emf.common.util.EList;
-
-/**
- * <!-- begin-user-doc --> A representation of the model object '<em><b>Node</b></em>'.
- * <!-- end-user-doc -->
- * 
- * <p>
- * The following features are supported:
- * <ul>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode#getPageflow <em>Pageflow</em>}</li>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode#getOutlinks <em>Outlinks</em>}</li>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode#getInlinks <em>Inlinks</em>}</li>
- * </ul>
- * </p>
- * 
- * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage#getPageflowNode()
- * @model abstract="true"
- * @generated
- */
-public interface PageflowNode extends PageflowElement {
-	/**
-	 * Returns the value of the '<em><b>Pageflow</b></em>' container
-	 * reference. It is bidirectional and its opposite is '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow#getNodes <em>Nodes</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Pageflow</em>' container reference isn't
-	 * clear, there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the value of the '<em>Pageflow</em>' container reference.
-	 * @see #setPageflow(Pageflow)
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage#getPageflowNode_Pageflow()
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow#getNodes
-	 * @model opposite="nodes" required="true"
-	 * @generated
-	 */
-	Pageflow getPageflow();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode#getPageflow <em>Pageflow</em>}'
-	 * container reference. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @param value
-	 *            the new value of the '<em>Pageflow</em>' container
-	 *            reference.
-	 * @see #getPageflow()
-	 * @generated
-	 */
-	void setPageflow(Pageflow value);
-
-	/**
-	 * Returns the value of the '<em><b>Outlinks</b></em>' reference list.
-	 * The list contents are of type
-	 * {@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink}. It
-	 * is bidirectional and its opposite is '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink#getSource <em>Source</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Outlinks</em>' reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the value of the '<em>Outlinks</em>' reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage#getPageflowNode_Outlinks()
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink#getSource
-	 * @model type="org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PFLink"
-	 *        opposite="source"
-	 * @generated
-	 */
-	EList getOutlinks();
-
-	/**
-	 * Returns the value of the '<em><b>Inlinks</b></em>' reference list.
-	 * The list contents are of type
-	 * {@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink}. It
-	 * is bidirectional and its opposite is '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink#getTarget <em>Target</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Inlinks</em>' reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the value of the '<em>Inlinks</em>' reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage#getPageflowNode_Inlinks()
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink#getTarget
-	 * @model type="org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PFLink"
-	 *        opposite="target"
-	 * @generated
-	 */
-	EList getInlinks();
-
-	/**
-	 * @param target 
-	 * @return the page flow node
-	 * @generated NOT
-	 */
-	PageflowLink findLinkTo(PageflowNode target);
-
-}
-// PageflowNode
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/PageflowPackage.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/PageflowPackage.java
deleted file mode 100644
index e507142..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/PageflowPackage.java
+++ /dev/null
@@ -1,1161 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.model;
-
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.EReference;
-
-/**
- * <!-- begin-user-doc --> The <b>Package</b> for the model. It contains
- * accessors for the meta objects to represent
- * <ul>
- * <li>each class,</li>
- * <li>each feature of each class,</li>
- * <li>each enum,</li>
- * <li>and each data type</li>
- * </ul>
- * <!-- end-user-doc -->
- * 
- * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowFactory
- * @generated
- */
-public interface PageflowPackage extends EPackage {
-	/**
-	 * The package name. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	String eNAME = "pageflow"; //$NON-NLS-1$
-
-	/**
-	 * The package namespace URI. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	String eNS_URI = "http://www.sybase.com/suade/pageflow"; //$NON-NLS-1$
-
-	/**
-	 * The package namespace name. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	String eNS_PREFIX = "pageflow"; //$NON-NLS-1$
-
-	/**
-	 * The singleton instance of the package. <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	PageflowPackage eINSTANCE = org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowPackageImpl
-			.init();
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowElementImpl <em>Element</em>}'
-	 * class. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowElementImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowPackageImpl#getPageflowElement()
-	 * @generated
-	 */
-	int PAGEFLOW_ELEMENT = 3;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PAGEFLOW_ELEMENT__NAME = 0;
-
-	/**
-	 * The feature id for the '<em><b>Comment</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PAGEFLOW_ELEMENT__COMMENT = 1;
-
-	/**
-	 * The feature id for the '<em><b>X</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PAGEFLOW_ELEMENT__X = 2;
-
-	/**
-	 * The feature id for the '<em><b>Y</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PAGEFLOW_ELEMENT__Y = 3;
-
-	/**
-	 * The feature id for the '<em><b>Width</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PAGEFLOW_ELEMENT__WIDTH = 4;
-
-	/**
-	 * The feature id for the '<em><b>Height</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PAGEFLOW_ELEMENT__HEIGHT = 5;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PAGEFLOW_ELEMENT__ID = 6;
-
-	/**
-	 * The feature id for the '<em><b>Reference Link</b></em>' attribute.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PAGEFLOW_ELEMENT__REFERENCE_LINK = 7;
-
-	/**
-	 * The number of structural features of the the '<em>Element</em>'
-	 * class. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PAGEFLOW_ELEMENT_FEATURE_COUNT = 8;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowImpl <em>Pageflow</em>}'
-	 * class. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowPackageImpl#getPageflow()
-	 * @generated
-	 */
-	int PAGEFLOW = 0;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PAGEFLOW__NAME = PAGEFLOW_ELEMENT__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Comment</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PAGEFLOW__COMMENT = PAGEFLOW_ELEMENT__COMMENT;
-
-	/**
-	 * The feature id for the '<em><b>X</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PAGEFLOW__X = PAGEFLOW_ELEMENT__X;
-
-	/**
-	 * The feature id for the '<em><b>Y</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PAGEFLOW__Y = PAGEFLOW_ELEMENT__Y;
-
-	/**
-	 * The feature id for the '<em><b>Width</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PAGEFLOW__WIDTH = PAGEFLOW_ELEMENT__WIDTH;
-
-	/**
-	 * The feature id for the '<em><b>Height</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PAGEFLOW__HEIGHT = PAGEFLOW_ELEMENT__HEIGHT;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PAGEFLOW__ID = PAGEFLOW_ELEMENT__ID;
-
-	/**
-	 * The feature id for the '<em><b>Reference Link</b></em>' attribute.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PAGEFLOW__REFERENCE_LINK = PAGEFLOW_ELEMENT__REFERENCE_LINK;
-
-	/**
-	 * The feature id for the '<em><b>Nodes</b></em>' containment reference
-	 * list. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PAGEFLOW__NODES = PAGEFLOW_ELEMENT_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Links</b></em>' containment reference
-	 * list. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PAGEFLOW__LINKS = PAGEFLOW_ELEMENT_FEATURE_COUNT + 1;
-
-	/**
-	 * The feature id for the '<em><b>Configfile</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PAGEFLOW__CONFIGFILE = PAGEFLOW_ELEMENT_FEATURE_COUNT + 2;
-
-	/**
-	 * The number of structural features of the the '<em>Pageflow</em>'
-	 * class. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PAGEFLOW_FEATURE_COUNT = PAGEFLOW_ELEMENT_FEATURE_COUNT + 3;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowNodeImpl <em>Node</em>}'
-	 * class. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowNodeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowPackageImpl#getPageflowNode()
-	 * @generated
-	 */
-	int PAGEFLOW_NODE = 1;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PAGEFLOW_NODE__NAME = PAGEFLOW_ELEMENT__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Comment</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PAGEFLOW_NODE__COMMENT = PAGEFLOW_ELEMENT__COMMENT;
-
-	/**
-	 * The feature id for the '<em><b>X</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PAGEFLOW_NODE__X = PAGEFLOW_ELEMENT__X;
-
-	/**
-	 * The feature id for the '<em><b>Y</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PAGEFLOW_NODE__Y = PAGEFLOW_ELEMENT__Y;
-
-	/**
-	 * The feature id for the '<em><b>Width</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PAGEFLOW_NODE__WIDTH = PAGEFLOW_ELEMENT__WIDTH;
-
-	/**
-	 * The feature id for the '<em><b>Height</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PAGEFLOW_NODE__HEIGHT = PAGEFLOW_ELEMENT__HEIGHT;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PAGEFLOW_NODE__ID = PAGEFLOW_ELEMENT__ID;
-
-	/**
-	 * The feature id for the '<em><b>Reference Link</b></em>' attribute.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PAGEFLOW_NODE__REFERENCE_LINK = PAGEFLOW_ELEMENT__REFERENCE_LINK;
-
-	/**
-	 * The feature id for the '<em><b>Pageflow</b></em>' container
-	 * reference. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PAGEFLOW_NODE__PAGEFLOW = PAGEFLOW_ELEMENT_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Outlinks</b></em>' reference list.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PAGEFLOW_NODE__OUTLINKS = PAGEFLOW_ELEMENT_FEATURE_COUNT + 1;
-
-	/**
-	 * The feature id for the '<em><b>Inlinks</b></em>' reference list.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PAGEFLOW_NODE__INLINKS = PAGEFLOW_ELEMENT_FEATURE_COUNT + 2;
-
-	/**
-	 * The number of structural features of the the '<em>Node</em>' class.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PAGEFLOW_NODE_FEATURE_COUNT = PAGEFLOW_ELEMENT_FEATURE_COUNT + 3;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowLinkImpl <em>PF Link</em>}'
-	 * class. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowLinkImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowPackageImpl#getPFLink()
-	 * @generated
-	 */
-	int PF_LINK = 2;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_LINK__NAME = PAGEFLOW_ELEMENT__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Comment</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_LINK__COMMENT = PAGEFLOW_ELEMENT__COMMENT;
-
-	/**
-	 * The feature id for the '<em><b>X</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_LINK__X = PAGEFLOW_ELEMENT__X;
-
-	/**
-	 * The feature id for the '<em><b>Y</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_LINK__Y = PAGEFLOW_ELEMENT__Y;
-
-	/**
-	 * The feature id for the '<em><b>Width</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_LINK__WIDTH = PAGEFLOW_ELEMENT__WIDTH;
-
-	/**
-	 * The feature id for the '<em><b>Height</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_LINK__HEIGHT = PAGEFLOW_ELEMENT__HEIGHT;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_LINK__ID = PAGEFLOW_ELEMENT__ID;
-
-	/**
-	 * The feature id for the '<em><b>Reference Link</b></em>' attribute.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_LINK__REFERENCE_LINK = PAGEFLOW_ELEMENT__REFERENCE_LINK;
-
-	/**
-	 * The feature id for the '<em><b>Pageflow</b></em>' container
-	 * reference. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_LINK__PAGEFLOW = PAGEFLOW_ELEMENT_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Target</b></em>' reference. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_LINK__TARGET = PAGEFLOW_ELEMENT_FEATURE_COUNT + 1;
-
-	/**
-	 * The feature id for the '<em><b>Source</b></em>' reference. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_LINK__SOURCE = PAGEFLOW_ELEMENT_FEATURE_COUNT + 2;
-
-	/**
-	 * The feature id for the '<em><b>Outcome</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_LINK__OUTCOME = PAGEFLOW_ELEMENT_FEATURE_COUNT + 3;
-
-	/**
-	 * The feature id for the '<em><b>Redirect</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_LINK__REDIRECT = PAGEFLOW_ELEMENT_FEATURE_COUNT + 4;
-
-	/**
-	 * The feature id for the '<em><b>Bend Points</b></em>' containment
-	 * reference list. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_LINK__BEND_POINTS = PAGEFLOW_ELEMENT_FEATURE_COUNT + 5;
-
-	/**
-	 * The feature id for the '<em><b>Smallicon</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_LINK__SMALLICON = PAGEFLOW_ELEMENT_FEATURE_COUNT + 6;
-
-	/**
-	 * The feature id for the '<em><b>Largeicon</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_LINK__LARGEICON = PAGEFLOW_ELEMENT_FEATURE_COUNT + 7;
-
-	/**
-	 * The feature id for the '<em><b>Fromaction</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_LINK__FROMACTION = PAGEFLOW_ELEMENT_FEATURE_COUNT + 8;
-
-	/**
-	 * The number of structural features of the the '<em>PF Link</em>'
-	 * class. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_LINK_FEATURE_COUNT = PAGEFLOW_ELEMENT_FEATURE_COUNT + 9;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowPageImpl <em>PF Page</em>}'
-	 * class. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowPageImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowPackageImpl#getPFPage()
-	 * @generated
-	 */
-	int PF_PAGE = 5;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_PAGE__NAME = PAGEFLOW_NODE__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Comment</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_PAGE__COMMENT = PAGEFLOW_NODE__COMMENT;
-
-	/**
-	 * The feature id for the '<em><b>X</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_PAGE__X = PAGEFLOW_NODE__X;
-
-	/**
-	 * The feature id for the '<em><b>Y</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_PAGE__Y = PAGEFLOW_NODE__Y;
-
-	/**
-	 * The feature id for the '<em><b>Width</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_PAGE__WIDTH = PAGEFLOW_NODE__WIDTH;
-
-	/**
-	 * The feature id for the '<em><b>Height</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_PAGE__HEIGHT = PAGEFLOW_NODE__HEIGHT;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_PAGE__ID = PAGEFLOW_NODE__ID;
-
-	/**
-	 * The feature id for the '<em><b>Pageflow</b></em>' container
-	 * reference. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_PAGE__PAGEFLOW = PAGEFLOW_NODE__PAGEFLOW;
-
-	/**
-	 * The feature id for the '<em><b>Outlinks</b></em>' reference list.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_PAGE__OUTLINKS = PAGEFLOW_NODE__OUTLINKS;
-
-	/**
-	 * The feature id for the '<em><b>Inlinks</b></em>' reference list.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_PAGE__INLINKS = PAGEFLOW_NODE__INLINKS;
-
-	/**
-	 * The feature id for the '<em><b>Path</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_PAGE__PATH = PAGEFLOW_NODE_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Smallicon</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_PAGE__SMALLICON = PAGEFLOW_NODE_FEATURE_COUNT + 1;
-
-	/**
-	 * The feature id for the '<em><b>Largeicon</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_PAGE__LARGEICON = PAGEFLOW_NODE_FEATURE_COUNT + 2;
-
-	/**
-	 * The number of structural features of the the '<em>PF Page</em>'
-	 * class. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_PAGE_FEATURE_COUNT = PAGEFLOW_NODE_FEATURE_COUNT + 3;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowLinkBendpointImpl <em>PF Link Bendpoint</em>}'
-	 * class. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowLinkBendpointImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowPackageImpl#getPFLinkBendpoint()
-	 * @generated
-	 */
-	int PF_LINK_BENDPOINT = 8;
-
-	/**
-	 * The feature id for the '<em><b>D1 Width</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_LINK_BENDPOINT__D1_WIDTH = 0;
-
-	/**
-	 * The feature id for the '<em><b>D1 Height</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_LINK_BENDPOINT__D1_HEIGHT = 1;
-
-	/**
-	 * The feature id for the '<em><b>D2 Width</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_LINK_BENDPOINT__D2_WIDTH = 2;
-
-	/**
-	 * The feature id for the '<em><b>D2 Height</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_LINK_BENDPOINT__D2_HEIGHT = 3;
-
-	/**
-	 * The feature id for the '<em><b>Weight</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_LINK_BENDPOINT__WEIGHT = 4;
-
-	/**
-	 * The feature id for the '<em><b>Link</b></em>' container reference.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_LINK_BENDPOINT__LINK = 5;
-
-	/**
-	 * The number of structural features of the the '<em>PF Link Bendpoint</em>'
-	 * class. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_LINK_BENDPOINT_FEATURE_COUNT = 6;
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow <em>Pageflow</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for class '<em>Pageflow</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow
-	 * @generated
-	 */
-	EClass getPageflow();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow#getNodes <em>Nodes</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the containment reference list '<em>Nodes</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow#getNodes()
-	 * @see #getPageflow()
-	 * @generated
-	 */
-	EReference getPageflow_Nodes();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow#getLinks <em>Links</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the containment reference list '<em>Links</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow#getLinks()
-	 * @see #getPageflow()
-	 * @generated
-	 */
-	EReference getPageflow_Links();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow#getConfigfile <em>Configfile</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the attribute '<em>Configfile</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow#getConfigfile()
-	 * @see #getPageflow()
-	 * @generated
-	 */
-	EAttribute getPageflow_Configfile();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode <em>Node</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for class '<em>Node</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode
-	 * @generated
-	 */
-	EClass getPageflowNode();
-
-	/**
-	 * Returns the meta object for the container reference '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode#getPageflow <em>Pageflow</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the container reference '<em>Pageflow</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode#getPageflow()
-	 * @see #getPageflowNode()
-	 * @generated
-	 */
-	EReference getPageflowNode_Pageflow();
-
-	/**
-	 * Returns the meta object for the reference list '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode#getOutlinks <em>Outlinks</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the reference list '<em>Outlinks</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode#getOutlinks()
-	 * @see #getPageflowNode()
-	 * @generated
-	 */
-	EReference getPageflowNode_Outlinks();
-
-	/**
-	 * Returns the meta object for the reference list '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode#getInlinks <em>Inlinks</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the reference list '<em>Inlinks</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode#getInlinks()
-	 * @see #getPageflowNode()
-	 * @generated
-	 */
-	EReference getPageflowNode_Inlinks();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink <em>PF Link</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for class '<em>PF Link</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink
-	 * @generated
-	 */
-	EClass getPFLink();
-
-	/**
-	 * Returns the meta object for the container reference '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink#getPageflow <em>Pageflow</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the container reference '<em>Pageflow</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink#getPageflow()
-	 * @see #getPFLink()
-	 * @generated
-	 */
-	EReference getPFLink_Pageflow();
-
-	/**
-	 * Returns the meta object for the reference '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink#getTarget <em>Target</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the reference '<em>Target</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink#getTarget()
-	 * @see #getPFLink()
-	 * @generated
-	 */
-	EReference getPFLink_Target();
-
-	/**
-	 * Returns the meta object for the reference '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink#getSource <em>Source</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the reference '<em>Source</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink#getSource()
-	 * @see #getPFLink()
-	 * @generated
-	 */
-	EReference getPFLink_Source();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink#getOutcome <em>Outcome</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the attribute '<em>Outcome</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink#getOutcome()
-	 * @see #getPFLink()
-	 * @generated
-	 */
-	EAttribute getPFLink_Outcome();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink#getOutcome <em>Outcome</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the attribute '<em>Outcome</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink#getOutcome()
-	 * @see #getPFLink()
-	 * @generated
-	 */
-	EAttribute getPFLink_Fromaction();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink#isRedirect <em>Redirect</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the attribute '<em>Redirect</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink#isRedirect()
-	 * @see #getPFLink()
-	 * @generated
-	 */
-	EAttribute getPFLink_Redirect();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink#getBendPoints <em>Bend Points</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the containment reference list '<em>Bend Points</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink#getBendPoints()
-	 * @see #getPFLink()
-	 * @generated
-	 */
-	EReference getPFLink_BendPoints();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement <em>Element</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for class '<em>Element</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement
-	 * @generated
-	 */
-	EClass getPageflowElement();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement#getName <em>Name</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the attribute '<em>Name</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement#getName()
-	 * @see #getPageflowElement()
-	 * @generated
-	 */
-	EAttribute getPageflowElement_Name();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement#getComment <em>Comment</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the attribute '<em>Comment</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement#getComment()
-	 * @see #getPageflowElement()
-	 * @generated
-	 */
-	EAttribute getPageflowElement_Comment();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement#getX <em>X</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the attribute '<em>X</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement#getX()
-	 * @see #getPageflowElement()
-	 * @generated
-	 */
-	EAttribute getPageflowElement_X();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement#getY <em>Y</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the attribute '<em>Y</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement#getY()
-	 * @see #getPageflowElement()
-	 * @generated
-	 */
-	EAttribute getPageflowElement_Y();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement#getWidth <em>Width</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the attribute '<em>Width</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement#getWidth()
-	 * @see #getPageflowElement()
-	 * @generated
-	 */
-	EAttribute getPageflowElement_Width();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement#getHeight <em>Height</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the attribute '<em>Height</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement#getHeight()
-	 * @see #getPageflowElement()
-	 * @generated
-	 */
-	EAttribute getPageflowElement_Height();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement#getId()
-	 * @see #getPageflowElement()
-	 * @generated
-	 */
-	EAttribute getPageflowElement_Id();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage <em>PF Page</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for class '<em>PF Page</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage
-	 * @generated
-	 */
-	EClass getPFPage();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage#getPath <em>Path</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the attribute '<em>Path</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage#getPath()
-	 * @see #getPFPage()
-	 * @generated
-	 */
-	EAttribute getPFPage_Path();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage#getSmallicon <em>Smallicon</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the attribute '<em>Smallicon</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage#getSmallicon()
-	 * @see #getPFPage()
-	 * @generated
-	 */
-	EAttribute getPFPage_Smallicon();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage#getLargeicon <em>Largeicon</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the attribute '<em>Largeicon</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage#getLargeicon()
-	 * @see #getPFPage()
-	 * @generated
-	 */
-	EAttribute getPFPage_Largeicon();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLinkBendpoint <em>PF Link Bendpoint</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for class '<em>PF Link Bendpoint</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLinkBendpoint
-	 * @generated
-	 */
-	EClass getPFLinkBendpoint();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLinkBendpoint#getD1Width <em>D1 Width</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the attribute '<em>D1 Width</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLinkBendpoint#getD1Width()
-	 * @see #getPFLinkBendpoint()
-	 * @generated
-	 */
-	EAttribute getPFLinkBendpoint_D1Width();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLinkBendpoint#getD1Height <em>D1 Height</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the attribute '<em>D1 Height</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLinkBendpoint#getD1Height()
-	 * @see #getPFLinkBendpoint()
-	 * @generated
-	 */
-	EAttribute getPFLinkBendpoint_D1Height();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLinkBendpoint#getD2Width <em>D2 Width</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the attribute '<em>D2 Width</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLinkBendpoint#getD2Width()
-	 * @see #getPFLinkBendpoint()
-	 * @generated
-	 */
-	EAttribute getPFLinkBendpoint_D2Width();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLinkBendpoint#getD2Height <em>D2 Height</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the attribute '<em>D2 Height</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLinkBendpoint#getD2Height()
-	 * @see #getPFLinkBendpoint()
-	 * @generated
-	 */
-	EAttribute getPFLinkBendpoint_D2Height();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLinkBendpoint#getWeight <em>Weight</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the attribute '<em>Weight</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLinkBendpoint#getWeight()
-	 * @see #getPFLinkBendpoint()
-	 * @generated
-	 */
-	EAttribute getPFLinkBendpoint_Weight();
-
-	/**
-	 * Returns the meta object for the container reference '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLinkBendpoint#getLink <em>Link</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the container reference '<em>Link</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLinkBendpoint#getLink()
-	 * @see #getPFLinkBendpoint()
-	 * @generated
-	 */
-	EReference getPFLinkBendpoint_Link();
-
-	/**
-	 * Returns the factory that creates the instances of the model. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the factory that creates the instances of the model.
-	 * @generated
-	 */
-	PageflowFactory getPageflowFactory();
-
-}
-// PageflowPackage
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/PageflowPage.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/PageflowPage.java
deleted file mode 100644
index b6cecb5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/PageflowPage.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.model;
-
-/**
- * <!-- begin-user-doc --> A representation of the model object '<em><b>PF Page</b></em>'.
- * <!-- end-user-doc -->
- * 
- * <p>
- * The following features are supported:
- * <ul>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage#getPath <em>Path</em>}</li>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage#getSmallicon <em>Smallicon</em>}</li>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage#getLargeicon <em>Largeicon</em>}</li>
- * </ul>
- * </p>
- * 
- * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage#getPFPage()
- * @model
- * @generated
- */
-public interface PageflowPage extends PageflowNode {
-	/**
-	 * Returns the value of the '<em><b>Path</b></em>' attribute. <!--
-	 * begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Path</em>' attribute isn't clear, there
-	 * really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the value of the '<em>Path</em>' attribute.
-	 * @see #setPath(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage#getPFPage_Path()
-	 * @model
-	 * @generated
-	 */
-	String getPath();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage#getPath <em>Path</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @param value
-	 *            the new value of the '<em>Path</em>' attribute.
-	 * @see #getPath()
-	 * @generated
-	 */
-	void setPath(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Smallicon</b></em>' attribute. <!--
-	 * begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Smallicon</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the value of the '<em>Smallicon</em>' attribute.
-	 * @see #setSmallicon(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage#getPFPage_Smallicon()
-	 * @model
-	 * @generated
-	 */
-	String getSmallicon();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage#getSmallicon <em>Smallicon</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @param value
-	 *            the new value of the '<em>Smallicon</em>' attribute.
-	 * @see #getSmallicon()
-	 * @generated
-	 */
-	void setSmallicon(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Largeicon</b></em>' attribute. <!--
-	 * begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Largeicon</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the value of the '<em>Largeicon</em>' attribute.
-	 * @see #setLargeicon(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage#getPFPage_Largeicon()
-	 * @model
-	 * @generated
-	 */
-	String getLargeicon();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage#getLargeicon <em>Largeicon</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @param value
-	 *            the new value of the '<em>Largeicon</em>' attribute.
-	 * @see #getLargeicon()
-	 * @generated
-	 */
-	void setLargeicon(String value);
-
-}
-// PFPage
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/impl/LinkReferenceElement.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/impl/LinkReferenceElement.java
deleted file mode 100644
index 0ed483c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/impl/LinkReferenceElement.java
+++ /dev/null
@@ -1,274 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl;
-
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FromActionType;
-import org.eclipse.jst.jsf.facesconfig.emf.FromOutcomeType;
-import org.eclipse.jst.jsf.facesconfig.emf.IconType;
-import org.eclipse.jst.jsf.facesconfig.emf.LargeIconType;
-import org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType;
-import org.eclipse.jst.jsf.facesconfig.emf.RedirectType;
-import org.eclipse.jst.jsf.facesconfig.emf.SmallIconType;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.synchronization.TransformUtil;
-
-/**
- * The reference element represents a mapping from pageflow link to a navigation
- * case.
- * 
- * @author hmeng
- */
-
-public class LinkReferenceElement extends ReferenceElement {
-
-	public void add(EObject object) {
-		Assert.isTrue(object instanceof NavigationCaseType);
-		clear();
-		super.add(object);
-	}
-
-	/**
-	 * @param pageflowElement
-	 */
-	public LinkReferenceElement(PageflowElement pageflowElement) {
-		super(pageflowElement);
-	}
-
-	/**
-	 * @param pageflowElement
-	 * @param facesConfigObject
-	 */
-	public LinkReferenceElement(PageflowElement pageflowElement,
-			EObject facesConfigObject) {
-		super(pageflowElement, facesConfigObject);
-	}
-
-	public void update() {
-		for (Iterator nodes = getData().iterator(); nodes.hasNext();) {
-			Object next = nodes.next();
-			if (!TransformUtil.isValidFacesConfigElement((EObject) next)) {
-				nodes.remove();
-			}
-		}
-	}
-
-	public Object get(int eFeature) {
-		Object result = null;
-		switch (eFeature) {
-		case PageflowPackage.PF_LINK__COMMENT:
-			break;
-		case PageflowPackage.PF_LINK__OUTCOME:
-			if (!isEmpty()) {
-				FromOutcomeType outcome = ((NavigationCaseType) getData()
-						.get(0)).getFromOutcome();
-				if (outcome != null) {
-					result = outcome.getTextContent();
-				}
-			}
-			break;
-		case PageflowPackage.PF_LINK__NAME:
-			break;
-		case PageflowPackage.PF_LINK__REDIRECT:
-			result = new Boolean(false);
-			if (!isEmpty()) {
-				RedirectType outcome = ((NavigationCaseType) getData().get(0))
-						.getRedirect();
-				if (outcome != null) {
-					result = new Boolean(true);
-				}
-			}
-			break;
-
-		case PageflowPackage.PF_LINK__FROMACTION:
-			if (!isEmpty()) {
-				FromActionType fromActionType = ((NavigationCaseType) getData()
-						.get(0)).getFromAction();
-				if (fromActionType != null) {
-					result = fromActionType.getTextContent();
-				}
-			}
-			break;
-		case PageflowPackage.PF_LINK__SMALLICON:
-			if (!isEmpty()) {
-				List icons = ((NavigationCaseType) getData().get(0)).getIcon();
-				if (icons.size() > 0) {
-					result = ((IconType) icons.get(0)).getSmallIcon() != null ? ((IconType) icons
-							.get(0)).getSmallIcon().getTextContent()
-							: null;
-				}
-			}
-			break;
-		case PageflowPackage.PF_LINK__LARGEICON:
-			if (!isEmpty()) {
-				List icons = ((NavigationCaseType) getData().get(0)).getIcon();
-				if (icons.size() > 0) {
-					result = ((IconType) icons.get(0)).getLargeIcon() != null ? ((IconType) icons
-							.get(0)).getLargeIcon().getTextContent()
-							: null;
-				}
-			}
-			break;
-		}
-		return result;
-	}
-
-	public void set(EStructuralFeature eFeature, Object newVal) {
-		switch (eFeature.getFeatureID()) {
-		case PageflowPackage.PF_LINK__COMMENT:
-			break;
-		case PageflowPackage.PF_LINK__OUTCOME: {
-			FromOutcomeType oldOutcome = null;
-			FromOutcomeType newOutcome = null;
-			String newValue = (String) newVal;
-			if (!isEmpty()) {
-				oldOutcome = ((NavigationCaseType) getData().get(0))
-						.getFromOutcome();
-				if (newValue == null || newValue.length() == 0) {
-					((NavigationCaseType) getData().get(0))
-							.setFromOutcome(null);
-				} else {
-					if (oldOutcome == null) {
-						newOutcome = FacesConfigFactory.eINSTANCE
-								.createFromOutcomeType();
-						newOutcome.setTextContent(newValue);
-						((NavigationCaseType) getData().get(0))
-								.setFromOutcome(newOutcome);
-					} else {
-						oldOutcome.setTextContent(newValue);
-					}
-				}
-			}
-			break;
-		}
-		case PageflowPackage.PF_LINK__NAME:
-			break;
-		case PageflowPackage.PF_LINK__REDIRECT:
-			RedirectType redirect = null;
-			RedirectType oldRedirect = null;
-			boolean newRedirect = ((Boolean) newVal).booleanValue();
-			if (!isEmpty()) {
-				oldRedirect = ((NavigationCaseType) getData().get(0))
-						.getRedirect();
-				if (!newRedirect) {
-					redirect = null;
-				} else {
-					if (oldRedirect == null) {
-						redirect = FacesConfigFactory.eINSTANCE
-								.createRedirectType();
-					}
-				}
-				((NavigationCaseType) getData().get(0)).setRedirect(redirect);
-			}
-			break;
-		case PageflowPackage.PF_LINK__FROMACTION:
-			FromActionType oldFromActionType,
-			newFromActionType;
-			String newFromaction = (String) newVal;
-			if (!isEmpty()) {
-				oldFromActionType = ((NavigationCaseType) getData().get(0))
-						.getFromAction();
-				if (newFromaction == null || newFromaction.length() == 0) {
-					((NavigationCaseType) getData().get(0)).setFromAction(null);
-				} else {
-					if (oldFromActionType == null) {
-						newFromActionType = FacesConfigFactory.eINSTANCE
-								.createFromActionType();
-						newFromActionType.setTextContent(newFromaction);
-						((NavigationCaseType) getData().get(0))
-								.setFromAction(newFromActionType);
-					} else {
-						oldFromActionType.setTextContent(newFromaction);
-					}
-				}
-			}
-			break;
-		case PageflowPackage.PF_LINK__SMALLICON: {
-			SmallIconType oldSmallicon = null;
-			SmallIconType newSmallIconType = null;
-			IconType icon = null;
-			String newValue = (String) newVal;
-			if (!isEmpty()) {
-				List icons = ((NavigationCaseType) getData().get(0)).getIcon();
-				if (newValue == null || newValue.length() == 0) {
-					if (icons.size() > 0) {
-						if (((IconType) icons.get(0)).getSmallIcon() != null) {
-							((IconType) icons.get(0)).setSmallIcon(null);
-						}
-					}
-				} else {
-					if (icons.size() == 0) {
-						icon = FacesConfigFactory.eINSTANCE.createIconType();
-						newSmallIconType = FacesConfigFactory.eINSTANCE
-								.createSmallIconType();
-						newSmallIconType.setTextContent(newValue);
-						icon.setSmallIcon(newSmallIconType);
-						icons.add(icon);
-					} else if (((IconType) icons.get(0)).getSmallIcon() == null) {
-						newSmallIconType = FacesConfigFactory.eINSTANCE
-								.createSmallIconType();
-						newSmallIconType.setTextContent(newValue);
-						icon = ((IconType) icons.get(0));
-						icon.setSmallIcon(newSmallIconType);
-					} else {
-						oldSmallicon = ((IconType) icons.get(0)).getSmallIcon();
-						oldSmallicon.setTextContent(newValue);
-					}
-				}
-			}
-			break;
-		}
-		case PageflowPackage.PF_LINK__LARGEICON: {
-			String newValue = (String) newVal;
-			LargeIconType oldLargeIcon = null;
-			LargeIconType newLargeIconType = null;
-			IconType icon = null;
-			if (!isEmpty()) {
-				List icons = ((NavigationCaseType) getData().get(0)).getIcon();
-				if (newValue == null || newValue.length() == 0) {
-					if (icons.size() > 0) {
-						if (((IconType) icons.get(0)).getLargeIcon() != null) {
-							((IconType) icons.get(0)).setLargeIcon(null);
-						}
-					}
-				} else {
-					if (icons.size() == 0) {
-						icon = FacesConfigFactory.eINSTANCE.createIconType();
-						newLargeIconType = FacesConfigFactory.eINSTANCE
-								.createLargeIconType();
-						newLargeIconType.setTextContent(newValue);
-						icon.setLargeIcon(newLargeIconType);
-						icons.add(icon);
-					} else if (((IconType) icons.get(0)).getLargeIcon() == null) {
-						newLargeIconType = FacesConfigFactory.eINSTANCE
-								.createLargeIconType();
-						newLargeIconType.setTextContent(newValue);
-						icon = ((IconType) icons.get(0));
-						icon.setLargeIcon(newLargeIconType);
-					} else {
-						oldLargeIcon = ((IconType) icons.get(0)).getLargeIcon();
-						oldLargeIcon.setTextContent(newValue);
-					}
-				}
-			}
-			break;
-		}
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/impl/PageReferenceElement.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/impl/PageReferenceElement.java
deleted file mode 100644
index 0a81af6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/impl/PageReferenceElement.java
+++ /dev/null
@@ -1,400 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl;
-
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.DescriptionType;
-import org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FromViewIdType;
-import org.eclipse.jst.jsf.facesconfig.emf.IconType;
-import org.eclipse.jst.jsf.facesconfig.emf.LargeIconType;
-import org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType;
-import org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType;
-import org.eclipse.jst.jsf.facesconfig.emf.SmallIconType;
-import org.eclipse.jst.jsf.facesconfig.emf.ToViewIdType;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.synchronization.FC2PFTransformer;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.synchronization.TransformUtil;
-
-/**
- * The reference element represents a mapping from pageflow page to one or more
- * navigation rules/cases's view IDs (fromViewID or toViewID).
- * 
- * @author hmeng
- */
-
-public class PageReferenceElement extends ReferenceElement {
-
-	/**
-	 * @param pageflowElement
-	 */
-	public PageReferenceElement(PageflowElement pageflowElement) {
-		super(pageflowElement);
-	}
-
-	/**
-	 * @param pageflowElement
-	 * @param facesConfigObject
-	 */
-	public PageReferenceElement(PageflowElement pageflowElement,
-			EObject facesConfigObject) {
-		super(pageflowElement, facesConfigObject);
-	}
-
-	public void add(EObject object) {
-		Assert.isTrue(object instanceof FromViewIdType
-				|| object instanceof ToViewIdType);
-		super.add(object);
-	}
-
-	public void update() {
-		outer: for (Iterator nodes = getData().iterator(); nodes.hasNext();) {
-			Object next = nodes.next();
-			if (next instanceof FromViewIdType) {
-				if (!TransformUtil.isValidFacesConfigElement((EObject) next)) {
-					nodes.remove();
-					continue;
-				}
-				List links = ((PageflowPage) pageflowElement).getOutlinks();
-				for (int i = 0; i < links.size(); i++) {
-					PageflowLink link = (PageflowLink) links.get(i);
-					if (!link.getFCElements().isEmpty()
-							&& TransformUtil
-									.isValidFacesConfigElement((NavigationCaseType) ((PageflowLink) links
-											.get(i)).getFCElements().getData()
-											.get(0))) {
-						NavigationRuleType rule = (NavigationRuleType) ((NavigationCaseType) ((PageflowLink) links
-								.get(i)).getFCElements().getData().get(0))
-								.eContainer();
-						if (rule == null || rule.getFromViewId() == next) {
-							// There navigation case
-							// matching this end.
-							continue outer;
-						}
-					}
-				}
-				// No case contains this end.
-				nodes.remove();
-			} else if (next instanceof ToViewIdType) {
-				if (!TransformUtil.isValidFacesConfigElement((EObject) next)) {
-					nodes.remove();
-					continue;
-				}
-				// Verify this is case end.
-				List links = ((PageflowPage) pageflowElement).getInlinks();
-				for (int i = 0; i < links.size(); i++) {
-					PageflowLink link = (PageflowLink) links.get(i);
-					if (!link.getFCElements().isEmpty()
-							&& TransformUtil
-									.isValidFacesConfigElement((NavigationCaseType) link
-											.getFCElements().getData().get(0))) {
-						if (((NavigationCaseType) ((PageflowLink) links.get(i))
-								.getFCElements().getData().get(0))
-								.getToViewId() == next) {
-							// There navigation case
-							// matching this end.
-							continue outer;
-						}
-					}
-				}
-				// No case contains this end.
-				nodes.remove();
-			}
-		}
-	}
-
-	public Object get(int eFeature) {
-		Object result = null;
-		switch (eFeature) {
-		case PageflowPackage.PF_PAGE__COMMENT:
-			if (!isEmpty()) {
-				for (int i = 0, n = getData().size(); i < n; i++) {
-					NavigationRuleType rule = null;
-					if ((rule = resolveRuleFromFCElement(getData().get(i))) != null) {
-						List descriptions = rule.getDescription();
-						if (descriptions.size() > 0) {
-							result = ((DescriptionType) descriptions.get(0))
-									.getTextContent();
-							break;
-						}
-					}
-				}
-			}
-			break;
-		case PageflowPackage.PF_PAGE__LARGEICON:
-			if (!isEmpty()) {
-				for (int i = 0, n = getData().size(); i < n; i++) {
-					NavigationRuleType rule = null;
-					if ((rule = resolveRuleFromFCElement(getData().get(i))) != null) {
-						List icons = rule.getIcon();
-						if (icons.size() > 0) {
-							result = ((IconType) icons.get(0)).getLargeIcon() != null ? ((IconType) icons
-									.get(0)).getLargeIcon().getTextContent()
-									: null;
-							break;
-						}
-					}
-				}
-			}
-			break;
-		case PageflowPackage.PF_PAGE__NAME:
-			// To see if it is in navigation rule.
-			if (!isEmpty() && !isEndOnly()) {
-				for (int i = 0, n = getData().size(); i < n; i++) {
-					NavigationRuleType rule = null;
-					if ((rule = resolveRuleFromFCElement(getData().get(i))) != null) {
-						List displaynames = rule.getDisplayName();
-						if (displaynames.size() > 0) {
-							result = ((DisplayNameType) displaynames.get(0))
-									.getTextContent();
-							break;
-						}
-					}
-				}
-			}
-			break;
-		case PageflowPackage.PF_PAGE__PATH:
-			if (!isEmpty()) {
-				for (int i = 0, n = getData().size(); i < n; i++) {
-					if (getData().get(i) instanceof FromViewIdType) {
-						result = ((FromViewIdType) getData().get(i))
-								.getTextContent();
-						break;
-					}
-				}
-				if (result == null && getData().get(0) instanceof ToViewIdType) {
-					result = ((ToViewIdType) getData().get(0)).getTextContent();
-				}
-			}
-			break;
-		case PageflowPackage.PF_PAGE__SMALLICON:
-			if (!isEmpty()) {
-				for (int i = 0, n = getData().size(); i < n; i++) {
-					NavigationRuleType rule = null;
-					if ((rule = resolveRuleFromFCElement(getData().get(i))) != null) {
-						List icons = rule.getIcon();
-						if (icons.size() > 0) {
-							result = ((IconType) icons.get(0)).getSmallIcon() != null ? ((IconType) icons
-									.get(0)).getSmallIcon().getTextContent()
-									: null;
-							break;
-						}
-					}
-				}
-			}
-			break;
-		}
-		return result;
-	}
-
-	private NavigationRuleType resolveRuleFromFCElement(Object object) {
-		if (object instanceof FromViewIdType) {
-			return (NavigationRuleType) ((FromViewIdType) object).eContainer();
-		}
-		return null;
-	}
-
-	private NavigationRuleType resolveRuleFromPFElement(Object object) {
-		if (object instanceof PageflowLink) {
-			NavigationCaseType caseType = (NavigationCaseType) ((PageflowLink) object)
-					.getFCElements().getData().get(0);
-			return (NavigationRuleType) caseType.eContainer();
-		}
-		return null;
-	}
-
-	public void set(EStructuralFeature eFeature, Object newVal) {
-		switch (eFeature.getFeatureID()) {
-		case PageflowPackage.PF_PAGE__COMMENT: {
-			DescriptionType description = null;
-			String newValue = (String) newVal;
-			if (!isEmpty()) {
-				for (int i = 0, n = getData().size(); i < n; i++) {
-					NavigationRuleType rule = null;
-					if ((rule = resolveRuleFromFCElement(getData().get(i))) != null) {
-						rule.getDescription().clear();
-						description = FacesConfigFactory.eINSTANCE
-								.createDescriptionType();
-						description.setTextContent(newValue);
-						rule.getDescription().add(description);
-					}
-				}
-			}
-			break;
-		}
-		case PageflowPackage.PF_PAGE__LARGEICON: {
-			LargeIconType oldLargeIcon = null;
-			LargeIconType newLargeIconType = null;
-			IconType icon = null;
-			String newValue = (String) newVal;
-			if (!isEmpty()) {
-				for (int i = 0, n = getData().size(); i < n; i++) {
-					NavigationRuleType rule = null;
-					if ((rule = resolveRuleFromFCElement(getData().get(i))) != null) {
-						List icons = rule.getIcon();
-						if (newValue == null || newValue.length() == 0) {
-							if (icons.size() > 0) {
-								if (((IconType) icons.get(0)).getLargeIcon() != null) {
-									((IconType) icons.get(0))
-											.setLargeIcon(null);
-								}
-							}
-						} else {
-							if (icons.size() == 0) {
-								icon = FacesConfigFactory.eINSTANCE
-										.createIconType();
-								newLargeIconType = FacesConfigFactory.eINSTANCE
-										.createLargeIconType();
-								newLargeIconType.setTextContent(newValue);
-								icon.setLargeIcon(newLargeIconType);
-								icons.add(icon);
-							} else if (((IconType) icons.get(0)).getLargeIcon() == null) {
-								newLargeIconType = FacesConfigFactory.eINSTANCE
-										.createLargeIconType();
-								newLargeIconType.setTextContent(newValue);
-								icon = ((IconType) icons.get(0));
-								icon.setLargeIcon(newLargeIconType);
-							} else {
-								oldLargeIcon = ((IconType) icons.get(0))
-										.getLargeIcon();
-								oldLargeIcon.setTextContent(newValue);
-							}
-						}
-					}
-				}
-			}
-			break;
-		}
-		case PageflowPackage.PF_PAGE__NAME:
-			DisplayNameType newDisplayNameType = null;
-			String newName = (String) newVal;
-			if (!isEmpty()) {
-				for (int i = 0, n = getData().size(); i < n; i++) {
-					NavigationRuleType rule = null;
-					if ((rule = resolveRuleFromFCElement(getData().get(i))) != null) {
-						rule.getDisplayName().clear();
-						if (newName != null && newName.length() > 0) {
-							newDisplayNameType = FacesConfigFactory.eINSTANCE
-									.createDisplayNameType();
-							newDisplayNameType.setTextContent(newName);
-							rule.getDisplayName().add(newDisplayNameType);
-						}
-					}
-				}
-			}
-			break;
-		case PageflowPackage.PF_PAGE__PATH: {
-			Object oldPath = null;
-			Object newPath = null;
-			String newValue = (String) newVal;
-			if (!isEmpty()) {
-				for (int i = 0, n = getData().size(); i < n; i++) {
-					if (getData().get(i) instanceof FromViewIdType) {
-						oldPath = getData().get(i);
-						((FromViewIdType) oldPath).setTextContent(newValue);
-					} else if (getData().get(i) instanceof ToViewIdType) {
-						oldPath = getData().get(i);
-						((ToViewIdType) oldPath).setTextContent(newValue);
-					}
-				}
-			}
-			// Create new fromViewID or toViewID node as needed.
-			else if (newValue != null && !"*".equals(newValue)) { //$NON-NLS-1$
-				if (((PageflowPage) pageflowElement).getOutlinks().size() > 0) {
-					List links = ((PageflowPage) pageflowElement).getOutlinks();
-					for (int i = 0, n = links.size(); i < n; i++) {
-						PageflowLink link = (PageflowLink) links.get(i);
-						NavigationRuleType rule = resolveRuleFromPFElement(link);
-						newPath = FC2PFTransformer.createRLFromViewID(newValue);
-						rule.setFromViewId((FromViewIdType) newPath);
-						add((EObject) newPath);
-					}
-					links = ((PageflowPage) pageflowElement).getInlinks();
-					for (int i = 0, n = links.size(); i < n; i++) {
-						PageflowLink link = (PageflowLink) links.get(i);
-						NavigationCaseType caseType = (NavigationCaseType) link
-								.getFCElements().getData().get(0);
-						newPath = FC2PFTransformer.createFCToViewID(newValue);
-						caseType.setToViewId((ToViewIdType) newPath);
-						add((EObject) newPath);
-					}
-				}
-			}
-			break;
-		}
-		case PageflowPackage.PF_PAGE__SMALLICON: {
-			SmallIconType oldSmallicon = null;
-			SmallIconType newSmallIconType = null;
-			IconType icon = null;
-			String newValue = (String) newVal;
-			if (!isEmpty()) {
-				for (int i = 0, n = getData().size(); i < n; i++) {
-					NavigationRuleType rule = null;
-					if ((rule = resolveRuleFromFCElement(getData().get(i))) != null) {
-						List icons = rule.getIcon();
-						if (newValue == null || newValue.length() == 0) {
-							if (icons.size() > 0) {
-								if (((IconType) icons.get(0)).getSmallIcon() != null) {
-									((IconType) icons.get(0))
-											.setSmallIcon(null);
-								}
-							}
-						} else {
-							if (icons.size() == 0) {
-								icon = FacesConfigFactory.eINSTANCE
-										.createIconType();
-								newSmallIconType = FacesConfigFactory.eINSTANCE
-										.createSmallIconType();
-								newSmallIconType.setTextContent(newValue);
-								icon.setSmallIcon(newSmallIconType);
-								icons.add(icon);
-							} else if (((IconType) icons.get(0)).getSmallIcon() == null) {
-								newSmallIconType = FacesConfigFactory.eINSTANCE
-										.createSmallIconType();
-								newSmallIconType.setTextContent(newValue);
-								icon = ((IconType) icons.get(0));
-								icon.setSmallIcon(newSmallIconType);
-							} else {
-								oldSmallicon = ((IconType) icons.get(0))
-										.getSmallIcon();
-								oldSmallicon.setTextContent(newValue);
-							}
-						}
-					}
-				}
-			}
-			break;
-		}
-		}
-	}
-
-	/**
-	 * @return true if none of the data are from view id's
-	 */
-	public boolean isEndOnly() {
-		for (int i = 0, n = getData().size(); i < n; i++) {
-			if (getData().get(i) instanceof FromViewIdType) {
-				return false;
-			}
-		}
-		return true;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/impl/PageflowElementImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/impl/PageflowElementImpl.java
deleted file mode 100644
index 6948fd7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/impl/PageflowElementImpl.java
+++ /dev/null
@@ -1,616 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.synchronization.TransformUtil;
-
-/**
- * <!-- begin-user-doc --> An implementation of the model object '<em><b>Element</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowElementImpl#getName <em>Name</em>}</li>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowElementImpl#getComment <em>Comment</em>}</li>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowElementImpl#getX <em>X</em>}</li>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowElementImpl#getY <em>Y</em>}</li>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowElementImpl#getWidth <em>Width</em>}</li>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowElementImpl#getHeight <em>Height</em>}</li>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowElementImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- * 
- * @generated
- */
-public abstract class PageflowElementImpl extends EObjectImpl implements
-		PageflowElement {
-	private static final String idPrefix = "pf"; //$NON-NLS-1$
-
-	/**
-	 * @generated NOT
-	 */
-	private String id;
-
-	/**
-	 * @generated NOT
-	 */
-	private static int counter = 0;
-
-	/**
-	 * the reference element
-	 */
-	protected ReferenceElement refElement;
-
-	/**
-	 * The default value of the '{@link #getName() <em>Name</em>}' attribute.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getName()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String NAME_EDEFAULT = "unnamed"; //$NON-NLS-1$
-
-	/**
-	 * The cached value of the '{@link #getName() <em>Name</em>}' attribute.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getName()
-	 * @generated
-	 * @ordered
-	 */
-	protected String name = NAME_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getComment() <em>Comment</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getComment()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String COMMENT_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getComment() <em>Comment</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getComment()
-	 * @generated
-	 * @ordered
-	 */
-	protected String comment = COMMENT_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getX() <em>X</em>}' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getX()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final int X_EDEFAULT = 0;
-
-	/**
-	 * The cached value of the '{@link #getX() <em>X</em>}' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getX()
-	 * @generated
-	 * @ordered
-	 */
-	protected int x = X_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getY() <em>Y</em>}' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getY()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final int Y_EDEFAULT = 0;
-
-	/**
-	 * The cached value of the '{@link #getY() <em>Y</em>}' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getY()
-	 * @generated
-	 * @ordered
-	 */
-	protected int y = Y_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getWidth() <em>Width</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getWidth()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final int WIDTH_EDEFAULT = -1;
-
-	/**
-	 * The cached value of the '{@link #getWidth() <em>Width</em>}' attribute.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getWidth()
-	 * @generated
-	 * @ordered
-	 */
-	protected int width = WIDTH_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getHeight() <em>Height</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getHeight()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final int HEIGHT_EDEFAULT = -1;
-
-	/**
-	 * The default value of the '{@link #getReferenceLink() <em>Reference Link</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getReferenceLink()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String REFERENCE_LINK_EDEFAULT = ""; //$NON-NLS-1$
-
-	/**
-	 * The cached value of the '{@link #getReferenceLink() <em>Reference Link</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getReferenceLink()
-	 * @generated
-	 * @ordered
-	 */
-	protected String referenceLink = REFERENCE_LINK_EDEFAULT;
-
-	/**
-	 * The cached value of the '{@link #getHeight() <em>Height</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getHeight()
-	 * @generated
-	 * @ordered
-	 */
-	protected int height = HEIGHT_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected PageflowElementImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return PageflowPackage.eINSTANCE.getPageflowElement();
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public String getName() {
-		return name == null || name.length() == 0 ? NAME_EDEFAULT : name;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void setName(String newName) {
-		String oldName = name;
-		name = newName;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					PageflowPackage.PAGEFLOW_ELEMENT__NAME, oldName, name));
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public String getComment() {
-		return comment;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void setComment(String newComment) {
-		String oldComment = comment;
-		comment = newComment;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					PageflowPackage.PAGEFLOW_ELEMENT__COMMENT, oldComment,
-					comment));
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public int getX() {
-		return x;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void setX(int newX) {
-		int oldX = x;
-		x = newX;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					PageflowPackage.PAGEFLOW_ELEMENT__X, oldX, x));
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public int getY() {
-		return y;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void setY(int newY) {
-		int oldY = y;
-		y = newY;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					PageflowPackage.PAGEFLOW_ELEMENT__Y, oldY, y));
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public int getWidth() {
-		return width;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void setWidth(int newWidth) {
-		int oldWidth = width;
-		width = newWidth;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					PageflowPackage.PAGEFLOW_ELEMENT__WIDTH, oldWidth, width));
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public int getHeight() {
-		return height;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void setHeight(int newHeight) {
-		int oldHeight = height;
-		height = newHeight;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					PageflowPackage.PAGEFLOW_ELEMENT__HEIGHT, oldHeight, height));
-	}
-
-	/**
-	 * Generate (and cache) an id as needed
-	 * 
-	 * @generated NOT
-	 */
-	public String getId() {
-		if (id == null) {
-			id = generateId();
-		}
-		return id;
-	}
-
-	/**
-	 * Generate a random id based on the current time
-	 * 
-	 * @return the generated id
-	 * 
-	 * @generated NOT
-	 */
-	public synchronized String generateId() {
-		long current = System.currentTimeMillis();
-		return idPrefix + current + counter++;
-	}
-
-	/**
-	 * Set or generate an Id This method should not be called except when
-	 * populating from the serialization
-	 * 
-	 * @generated NOT
-	 */
-	public void setId(String newId) {
-		if (newId == null && id == null) {
-			id = generateId();
-		} else {
-			id = newId;
-		}
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public String getReferenceLink() {
-		return referenceLink;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void setReferenceLink(String newReferenceLink) {
-		String oldReferenceLink = referenceLink;
-		referenceLink = newReferenceLink;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					PageflowPackage.PAGEFLOW_ELEMENT__REFERENCE_LINK,
-					oldReferenceLink, referenceLink));
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public Object eGet(EStructuralFeature eFeature, boolean resolve) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-		case PageflowPackage.PAGEFLOW_ELEMENT__NAME:
-			return getName();
-		case PageflowPackage.PAGEFLOW_ELEMENT__COMMENT:
-			return getComment();
-		case PageflowPackage.PAGEFLOW_ELEMENT__X:
-			return new Integer(getX());
-		case PageflowPackage.PAGEFLOW_ELEMENT__Y:
-			return new Integer(getY());
-		case PageflowPackage.PAGEFLOW_ELEMENT__WIDTH:
-			return new Integer(getWidth());
-		case PageflowPackage.PAGEFLOW_ELEMENT__HEIGHT:
-			return new Integer(getHeight());
-		case PageflowPackage.PAGEFLOW_ELEMENT__ID:
-			return getId();
-		case PageflowPackage.PAGEFLOW_ELEMENT__REFERENCE_LINK:
-			return getReferenceLink();
-		}
-		return eDynamicGet(eFeature, resolve);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void eSet(EStructuralFeature eFeature, Object newValue) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-		case PageflowPackage.PAGEFLOW_ELEMENT__NAME:
-			setName((String) newValue);
-			return;
-		case PageflowPackage.PAGEFLOW_ELEMENT__COMMENT:
-			setComment((String) newValue);
-			return;
-		case PageflowPackage.PAGEFLOW_ELEMENT__X:
-			setX(((Integer) newValue).intValue());
-			return;
-		case PageflowPackage.PAGEFLOW_ELEMENT__Y:
-			setY(((Integer) newValue).intValue());
-			return;
-		case PageflowPackage.PAGEFLOW_ELEMENT__WIDTH:
-			setWidth(((Integer) newValue).intValue());
-			return;
-		case PageflowPackage.PAGEFLOW_ELEMENT__HEIGHT:
-			setHeight(((Integer) newValue).intValue());
-			return;
-		case PageflowPackage.PAGEFLOW_ELEMENT__ID:
-			setId((String) newValue);
-			return;
-		case PageflowPackage.PAGEFLOW_ELEMENT__REFERENCE_LINK:
-			setReferenceLink((String) newValue);
-			return;
-		}
-		eDynamicSet(eFeature, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void eUnset(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-		case PageflowPackage.PAGEFLOW_ELEMENT__NAME:
-			setName(NAME_EDEFAULT);
-			return;
-		case PageflowPackage.PAGEFLOW_ELEMENT__COMMENT:
-			setComment(COMMENT_EDEFAULT);
-			return;
-		case PageflowPackage.PAGEFLOW_ELEMENT__X:
-			setX(X_EDEFAULT);
-			return;
-		case PageflowPackage.PAGEFLOW_ELEMENT__Y:
-			setY(Y_EDEFAULT);
-			return;
-		case PageflowPackage.PAGEFLOW_ELEMENT__WIDTH:
-			setWidth(WIDTH_EDEFAULT);
-			return;
-		case PageflowPackage.PAGEFLOW_ELEMENT__HEIGHT:
-			setHeight(HEIGHT_EDEFAULT);
-			return;
-		case PageflowPackage.PAGEFLOW_ELEMENT__ID:
-			setId(ID_EDEFAULT);
-			return;
-		case PageflowPackage.PAGEFLOW_ELEMENT__REFERENCE_LINK:
-			setReferenceLink(REFERENCE_LINK_EDEFAULT);
-			return;
-		}
-		eDynamicUnset(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public boolean eIsSet(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-		case PageflowPackage.PAGEFLOW_ELEMENT__NAME:
-			return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT
-					.equals(name);
-		case PageflowPackage.PAGEFLOW_ELEMENT__COMMENT:
-			return COMMENT_EDEFAULT == null ? comment != null
-					: !COMMENT_EDEFAULT.equals(comment);
-		case PageflowPackage.PAGEFLOW_ELEMENT__X:
-			return x != X_EDEFAULT;
-		case PageflowPackage.PAGEFLOW_ELEMENT__Y:
-			return y != Y_EDEFAULT;
-		case PageflowPackage.PAGEFLOW_ELEMENT__WIDTH:
-			return width != WIDTH_EDEFAULT;
-		case PageflowPackage.PAGEFLOW_ELEMENT__HEIGHT:
-			return height != HEIGHT_EDEFAULT;
-		case PageflowPackage.PAGEFLOW_ELEMENT__ID:
-			return ID_EDEFAULT == null ? getId() != null : !ID_EDEFAULT
-					.equals(getId());
-		case PageflowPackage.PAGEFLOW_ELEMENT__REFERENCE_LINK:
-			return REFERENCE_LINK_EDEFAULT == null ? referenceLink != null
-					: !REFERENCE_LINK_EDEFAULT.equals(referenceLink);
-		}
-		return eDynamicIsSet(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy())
-			return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (name: "); //$NON-NLS-1$
-		result.append(name);
-		result.append(", comment: "); //$NON-NLS-1$
-		result.append(comment);
-		result.append(", x: "); //$NON-NLS-1$
-		result.append(x);
-		result.append(", y: "); //$NON-NLS-1$
-		result.append(y);
-		result.append(", width: "); //$NON-NLS-1$
-		result.append(width);
-		result.append(", height: "); //$NON-NLS-1$
-		result.append(height);
-		result.append(", referenceLink: "); //$NON-NLS-1$
-		result.append(referenceLink);
-		result.append(')');
-		return result.toString();
-	}
-
-	/**
-	 * The synchronizer will use this to notify adapters for the faces-config's
-	 * modification.
-	 * 
-	 * @generated NOT
-	 */
-	public void notifyModelChanged(Notification notification) {
-		if (eNotificationRequired())
-			eNotify(notification);
-	}
-
-	/**
-	 * @generated NOT
-	 */
-
-	public ReferenceElement getFCElements() {
-		return null;
-	}
-
-	/**
-	 * @generated NOT
-	 */
-	public void update() {
-		getFCElements().update();
-		if (!TransformUtil.isValidPageflowElement(this)) {
-			eAdapters().clear();
-		}
-	}
-
-	/**
-	 * @generated NOT
-	 */
-	public void dispose() {
-		getFCElements().dispose();
-		eAdapters.clear();
-	}
-
-}
-// PageflowElementImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/impl/PageflowFactoryImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/impl/PageflowFactoryImpl.java
deleted file mode 100644
index aabbe3e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/impl/PageflowFactoryImpl.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.impl.EFactoryImpl;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowFactory;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLinkBendpoint;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage;
-
-/**
- * <!-- begin-user-doc --> An implementation of the model <b>Factory</b>. <!--
- * end-user-doc -->
- * 
- * @generated
- */
-public class PageflowFactoryImpl extends EFactoryImpl implements
-		PageflowFactory {
-	/**
-	 * Creates and instance of the factory. <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public PageflowFactoryImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EObject create(EClass eClass) {
-		switch (eClass.getClassifierID()) {
-		case PageflowPackage.PAGEFLOW:
-			return createPageflow();
-		case PageflowPackage.PF_LINK:
-			return createPFLink();
-		case PageflowPackage.PF_PAGE:
-			return createPFPage();
-		case PageflowPackage.PF_LINK_BENDPOINT:
-			return createPFLinkBendpoint();
-		default:
-			throw new IllegalArgumentException("The class '" + eClass.getName() //$NON-NLS-1$
-					+ "' is not a valid classifier"); //$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public Pageflow createPageflow() {
-		PageflowImpl pageflow = new PageflowImpl();
-		return pageflow;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public PageflowLink createPFLink() {
-		PageflowLinkImpl pfLink = new PageflowLinkImpl();
-		return pfLink;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public PageflowPage createPFPage() {
-		PageflowPageImpl pfPage = new PageflowPageImpl();
-		return pfPage;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public PageflowLinkBendpoint createPFLinkBendpoint() {
-		PageflowLinkBendpointImpl pfLinkBendpoint = new PageflowLinkBendpointImpl();
-		return pfLinkBendpoint;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public PageflowPackage getPageflowPackage() {
-		return (PageflowPackage) getEPackage();
-	}
-}
-// PageflowFactoryImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/impl/PageflowImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/impl/PageflowImpl.java
deleted file mode 100644
index f637ac2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/impl/PageflowImpl.java
+++ /dev/null
@@ -1,472 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl;
-
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Iterator;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.common.util.TreeIterator;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentWithInverseEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.util.PageflowValidation;
-
-/**
- * <!-- begin-user-doc --> An implementation of the model object '<em><b>Pageflow</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowImpl#getNodes <em>Nodes</em>}</li>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowImpl#getLinks <em>Links</em>}</li>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowImpl#getConfigfile <em>Configfile</em>}</li>
- * </ul>
- * </p>
- * 
- * @generated
- */
-public class PageflowImpl extends PageflowElementImpl implements Pageflow {
-
-	/**
-	 * The cached value of the '{@link #getNodes() <em>Nodes</em>}'
-	 * containment reference list. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getNodes()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList nodes = null;
-
-	/**
-	 * The cached value of the '{@link #getLinks() <em>Links</em>}'
-	 * containment reference list. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getLinks()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList links = null;
-
-	/**
-	 * The default value of the '{@link #getConfigfile() <em>Configfile</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getConfigfile()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String CONFIGFILE_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getConfigfile() <em>Configfile</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getConfigfile()
-	 * @generated
-	 * @ordered
-	 */
-	protected String configfile = CONFIGFILE_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected PageflowImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return PageflowPackage.eINSTANCE.getPageflow();
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EList getNodes() {
-		if (nodes == null) {
-			nodes = new EObjectContainmentWithInverseEList(PageflowNode.class,
-					this, PageflowPackage.PAGEFLOW__NODES,
-					PageflowPackage.PAGEFLOW_NODE__PAGEFLOW);
-		}
-		return nodes;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EList getLinks() {
-		if (links == null) {
-			links = new EObjectContainmentWithInverseEList(PageflowLink.class,
-					this, PageflowPackage.PAGEFLOW__LINKS,
-					PageflowPackage.PF_LINK__PAGEFLOW);
-		}
-		return links;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public String getConfigfile() {
-		return configfile;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void setConfigfile(String newConfigfile) {
-		String oldConfigfile = configfile;
-		configfile = newConfigfile;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					PageflowPackage.PAGEFLOW__CONFIGFILE, oldConfigfile,
-					configfile));
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public NotificationChain eInverseAdd(InternalEObject otherEnd,
-			int featureID, Class baseClass, NotificationChain msgs) {
-		if (featureID >= 0) {
-			switch (eDerivedStructuralFeatureID(featureID, baseClass)) {
-			case PageflowPackage.PAGEFLOW__NODES:
-				return ((InternalEList) getNodes()).basicAdd(otherEnd, msgs);
-			case PageflowPackage.PAGEFLOW__LINKS:
-				return ((InternalEList) getLinks()).basicAdd(otherEnd, msgs);
-			default:
-				return eDynamicInverseAdd(otherEnd, featureID, baseClass, msgs);
-			}
-		}
-		if (eContainer != null)
-			msgs = eBasicRemoveFromContainer(msgs);
-		return eBasicSetContainer(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd,
-			int featureID, Class baseClass, NotificationChain msgs) {
-		if (featureID >= 0) {
-			switch (eDerivedStructuralFeatureID(featureID, baseClass)) {
-			case PageflowPackage.PAGEFLOW__NODES:
-				return ((InternalEList) getNodes()).basicRemove(otherEnd, msgs);
-			case PageflowPackage.PAGEFLOW__LINKS:
-				return ((InternalEList) getLinks()).basicRemove(otherEnd, msgs);
-			default:
-				return eDynamicInverseRemove(otherEnd, featureID, baseClass,
-						msgs);
-			}
-		}
-		return eBasicSetContainer(null, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public Object eGet(EStructuralFeature eFeature, boolean resolve) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-		case PageflowPackage.PAGEFLOW__NAME:
-			return getName();
-		case PageflowPackage.PAGEFLOW__COMMENT:
-			return getComment();
-		case PageflowPackage.PAGEFLOW__X:
-			return new Integer(getX());
-		case PageflowPackage.PAGEFLOW__Y:
-			return new Integer(getY());
-		case PageflowPackage.PAGEFLOW__WIDTH:
-			return new Integer(getWidth());
-		case PageflowPackage.PAGEFLOW__HEIGHT:
-			return new Integer(getHeight());
-		case PageflowPackage.PAGEFLOW__ID:
-			return getId();
-		case PageflowPackage.PAGEFLOW__NODES:
-			return getNodes();
-		case PageflowPackage.PAGEFLOW__LINKS:
-			return getLinks();
-		case PageflowPackage.PAGEFLOW__CONFIGFILE:
-			return getConfigfile();
-		}
-		return super.eGet(eFeature, resolve);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void eSet(EStructuralFeature eFeature, Object newValue) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-		case PageflowPackage.PAGEFLOW__NAME:
-			setName((String) newValue);
-			return;
-		case PageflowPackage.PAGEFLOW__COMMENT:
-			setComment((String) newValue);
-			return;
-		case PageflowPackage.PAGEFLOW__X:
-			setX(((Integer) newValue).intValue());
-			return;
-		case PageflowPackage.PAGEFLOW__Y:
-			setY(((Integer) newValue).intValue());
-			return;
-		case PageflowPackage.PAGEFLOW__WIDTH:
-			setWidth(((Integer) newValue).intValue());
-			return;
-		case PageflowPackage.PAGEFLOW__HEIGHT:
-			setHeight(((Integer) newValue).intValue());
-			return;
-		case PageflowPackage.PAGEFLOW__ID:
-			setId((String) newValue);
-			return;
-		case PageflowPackage.PAGEFLOW__NODES:
-			getNodes().clear();
-			getNodes().addAll((Collection) newValue);
-			return;
-		case PageflowPackage.PAGEFLOW__LINKS:
-			getLinks().clear();
-			getLinks().addAll((Collection) newValue);
-			return;
-		case PageflowPackage.PAGEFLOW__CONFIGFILE:
-			setConfigfile((String) newValue);
-			return;
-		}
-		super.eSet(eFeature, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void eUnset(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-		case PageflowPackage.PAGEFLOW__NAME:
-			setName(NAME_EDEFAULT);
-			return;
-		case PageflowPackage.PAGEFLOW__COMMENT:
-			setComment(COMMENT_EDEFAULT);
-			return;
-		case PageflowPackage.PAGEFLOW__X:
-			setX(X_EDEFAULT);
-			return;
-		case PageflowPackage.PAGEFLOW__Y:
-			setY(Y_EDEFAULT);
-			return;
-		case PageflowPackage.PAGEFLOW__WIDTH:
-			setWidth(WIDTH_EDEFAULT);
-			return;
-		case PageflowPackage.PAGEFLOW__HEIGHT:
-			setHeight(HEIGHT_EDEFAULT);
-			return;
-		case PageflowPackage.PAGEFLOW__ID:
-			setId(ID_EDEFAULT);
-			return;
-		case PageflowPackage.PAGEFLOW__NODES:
-			getNodes().clear();
-			return;
-		case PageflowPackage.PAGEFLOW__LINKS:
-			getLinks().clear();
-			return;
-		case PageflowPackage.PAGEFLOW__CONFIGFILE:
-			setConfigfile(CONFIGFILE_EDEFAULT);
-			return;
-		}
-		super.eUnset(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public boolean eIsSet(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-		case PageflowPackage.PAGEFLOW__NAME:
-			return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT
-					.equals(name);
-		case PageflowPackage.PAGEFLOW__COMMENT:
-			return COMMENT_EDEFAULT == null ? comment != null
-					: !COMMENT_EDEFAULT.equals(comment);
-		case PageflowPackage.PAGEFLOW__X:
-			return x != X_EDEFAULT;
-		case PageflowPackage.PAGEFLOW__Y:
-			return y != Y_EDEFAULT;
-		case PageflowPackage.PAGEFLOW__WIDTH:
-			return width != WIDTH_EDEFAULT;
-		case PageflowPackage.PAGEFLOW__HEIGHT:
-			return height != HEIGHT_EDEFAULT;
-		case PageflowPackage.PAGEFLOW__ID:
-			return ID_EDEFAULT == null ? getId() != null : !ID_EDEFAULT
-					.equals(getId());
-		case PageflowPackage.PAGEFLOW__NODES:
-			return nodes != null && !nodes.isEmpty();
-		case PageflowPackage.PAGEFLOW__LINKS:
-			return links != null && !links.isEmpty();
-		case PageflowPackage.PAGEFLOW__CONFIGFILE:
-			return CONFIGFILE_EDEFAULT == null ? configfile != null
-					: !CONFIGFILE_EDEFAULT.equals(configfile);
-		}
-		return super.eIsSet(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy())
-			return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (configfile: "); //$NON-NLS-1$
-		result.append(configfile);
-		result.append(')');
-		return result.toString();
-	}
-
-	/**
-	 * set the valid link's source and target node.
-	 * 
-	 * @generated NOT
-	 */
-	public void connect(PageflowNode source, PageflowNode target,
-			PageflowLink link) {
-		if (link != null) {
-			if (PageflowValidation.getInstance().isValidLinkForCreation(source,
-					target)) {
-				this.getLinks().add(link);
-				link.setSource(source);
-				link.setTarget(target);
-			}
-		}
-	}
-
-	/** node prefixs map */
-	private HashMap mapNodePrefix = null;
-
-	/**
-	 * get the prefix's map, and if the map is not existed, create it.
-	 * 
-	 * @return - map for prefix
-	 * 
-	 * @generated NOT
-	 */
-	private HashMap getNodePrefixMap() {
-		if (mapNodePrefix == null) {
-			mapNodePrefix = new HashMap();
-			mapNodePrefix.put(PageflowPageImpl.class, new String("Page")); //$NON-NLS-1$
-		}
-		return mapNodePrefix;
-	}
-
-	/**
-	 * get the default node name according current nodetype
-	 * 
-	 * @param nodeType -
-	 *            node type, such as PFBeginImpl, PFPageImpl, etc.
-	 * @return - the default node name.
-	 * 
-	 * @generated NOT
-	 */
-	public String getDefaultNodeName(Class nodeType) {
-		HashMap mapNodePrefix_ = getNodePrefixMap();
-
-		String strNodePrefix = (String) mapNodePrefix_.get(nodeType);
-
-		String strNodeName = null;
-		boolean bFound = true;
-		int numNode = 1;
-		while (bFound) {
-			strNodeName = strNodePrefix + numNode;
-			boolean bExisted = false;
-			for (Iterator iter = getNodes().iterator(); iter.hasNext();) {
-				PageflowNode node = (PageflowNode) iter.next();
-				if (strNodeName.equalsIgnoreCase(node.getName())) {
-					bExisted = true;
-					break;
-				}
-			}
-			if (!bExisted) {
-				bFound = false;
-			}
-			numNode++;
-		}
-
-		return strNodeName;
-
-	}
-
-	/**
-	 * When faces-config has been changed, the pageflow model will be notified
-	 * to enable refresher do some update in pageflow.
-	 * 
-	 * @generated NOT
-	 */
-	public void notifyModelChanged(Notification notification) {
-		TreeIterator children = eAllContents();
-		while (children.hasNext()) {
-			Object next = children.next();
-			if (next instanceof PageflowElement) {
-				((PageflowElement) next).update();
-			}
-		}
-		super.notifyModelChanged(notification);
-	}
-
-	/**
-	 * @generated NOT
-	 */
-	public void dispose() {
-		TreeIterator children = eAllContents();
-		while (children.hasNext()) {
-			Object next = children.next();
-			if (next instanceof PageflowElement) {
-				((PageflowElement) next).dispose();
-			}
-		}
-		eAdapters.clear();
-	}
-}
-// PageflowImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/impl/PageflowLinkBendpointImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/impl/PageflowLinkBendpointImpl.java
deleted file mode 100644
index bdb66fc..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/impl/PageflowLinkBendpointImpl.java
+++ /dev/null
@@ -1,552 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl;
-
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.PageflowMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLinkBendpoint;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage;
-import org.eclipse.osgi.util.NLS;
-
-/**
- * <!-- begin-user-doc --> An implementation of the model object '<em><b>PF Link Bendpoint</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowLinkBendpointImpl#getD1Width <em>D1 Width</em>}</li>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowLinkBendpointImpl#getD1Height <em>D1 Height</em>}</li>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowLinkBendpointImpl#getD2Width <em>D2 Width</em>}</li>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowLinkBendpointImpl#getD2Height <em>D2 Height</em>}</li>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowLinkBendpointImpl#getWeight <em>Weight</em>}</li>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowLinkBendpointImpl#getLink <em>Link</em>}</li>
- * </ul>
- * </p>
- * 
- * @generated
- */
-public class PageflowLinkBendpointImpl extends EObjectImpl implements PageflowLinkBendpoint {
-	/**
-	 * The default value of the '{@link #getD1Width() <em>D1 Width</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getD1Width()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final int D1_WIDTH_EDEFAULT = 0;
-
-	/**
-	 * The cached value of the '{@link #getD1Width() <em>D1 Width</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getD1Width()
-	 * @generated
-	 * @ordered
-	 */
-	protected int d1Width = D1_WIDTH_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getD1Height() <em>D1 Height</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getD1Height()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final int D1_HEIGHT_EDEFAULT = 0;
-
-	/**
-	 * The cached value of the '{@link #getD1Height() <em>D1 Height</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getD1Height()
-	 * @generated
-	 * @ordered
-	 */
-	protected int d1Height = D1_HEIGHT_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getD2Width() <em>D2 Width</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getD2Width()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final int D2_WIDTH_EDEFAULT = 0;
-
-	/**
-	 * The cached value of the '{@link #getD2Width() <em>D2 Width</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getD2Width()
-	 * @generated
-	 * @ordered
-	 */
-	protected int d2Width = D2_WIDTH_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getD2Height() <em>D2 Height</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getD2Height()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final int D2_HEIGHT_EDEFAULT = 0;
-
-	/**
-	 * The cached value of the '{@link #getD2Height() <em>D2 Height</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getD2Height()
-	 * @generated
-	 * @ordered
-	 */
-	protected int d2Height = D2_HEIGHT_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getWeight() <em>Weight</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getWeight()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final float WEIGHT_EDEFAULT = 0.5F;
-
-	/**
-	 * The cached value of the '{@link #getWeight() <em>Weight</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getWeight()
-	 * @generated
-	 * @ordered
-	 */
-	protected float weight = WEIGHT_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated NOT
-	 */
-	private Dimension dimStart, dimEnd;
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected PageflowLinkBendpointImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return PageflowPackage.eINSTANCE.getPFLinkBendpoint();
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public int getD1Width() {
-		return d1Width;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void setD1Width(int newD1Width) {
-		int oldD1Width = d1Width;
-		d1Width = newD1Width;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					PageflowPackage.PF_LINK_BENDPOINT__D1_WIDTH, oldD1Width,
-					d1Width));
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public int getD1Height() {
-		return d1Height;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void setD1Height(int newD1Height) {
-		int oldD1Height = d1Height;
-		d1Height = newD1Height;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					PageflowPackage.PF_LINK_BENDPOINT__D1_HEIGHT, oldD1Height,
-					d1Height));
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public int getD2Width() {
-		return d2Width;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void setD2Width(int newD2Width) {
-		int oldD2Width = d2Width;
-		d2Width = newD2Width;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					PageflowPackage.PF_LINK_BENDPOINT__D2_WIDTH, oldD2Width,
-					d2Width));
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public int getD2Height() {
-		return d2Height;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void setD2Height(int newD2Height) {
-		int oldD2Height = d2Height;
-		d2Height = newD2Height;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					PageflowPackage.PF_LINK_BENDPOINT__D2_HEIGHT, oldD2Height,
-					d2Height));
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public float getWeight() {
-		return weight;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void setWeight(float newWeight) {
-		float oldWeight = weight;
-		weight = newWeight;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					PageflowPackage.PF_LINK_BENDPOINT__WEIGHT, oldWeight,
-					weight));
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public PageflowLink getLink() {
-		if (eContainerFeatureID != PageflowPackage.PF_LINK_BENDPOINT__LINK)
-			return null;
-		return (PageflowLink) eContainer;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void setLink(PageflowLink newLink) {
-		if (newLink != eContainer
-				|| (eContainerFeatureID != PageflowPackage.PF_LINK_BENDPOINT__LINK && newLink != null)) {
-			if (EcoreUtil.isAncestor(this, newLink))
-				throw new IllegalArgumentException(
-						NLS.bind(PageflowMessages.PageflowNode_NoRecursiveContainment,toString()));
-			NotificationChain msgs = null;
-			if (eContainer != null)
-				msgs = eBasicRemoveFromContainer(msgs);
-			if (newLink != null)
-				msgs = ((InternalEObject) newLink).eInverseAdd(this,
-						PageflowPackage.PF_LINK__BEND_POINTS, PageflowLink.class,
-						msgs);
-			msgs = eBasicSetContainer((InternalEObject) newLink,
-					PageflowPackage.PF_LINK_BENDPOINT__LINK, msgs);
-			if (msgs != null)
-				msgs.dispatch();
-		} else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					PageflowPackage.PF_LINK_BENDPOINT__LINK, newLink, newLink));
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public NotificationChain eInverseAdd(InternalEObject otherEnd,
-			int featureID, Class baseClass, NotificationChain msgs) {
-		if (featureID >= 0) {
-			switch (eDerivedStructuralFeatureID(featureID, baseClass)) {
-			case PageflowPackage.PF_LINK_BENDPOINT__LINK:
-				if (eContainer != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return eBasicSetContainer(otherEnd,
-						PageflowPackage.PF_LINK_BENDPOINT__LINK, msgs);
-			default:
-				return eDynamicInverseAdd(otherEnd, featureID, baseClass, msgs);
-			}
-		}
-		if (eContainer != null)
-			msgs = eBasicRemoveFromContainer(msgs);
-		return eBasicSetContainer(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd,
-			int featureID, Class baseClass, NotificationChain msgs) {
-		if (featureID >= 0) {
-			switch (eDerivedStructuralFeatureID(featureID, baseClass)) {
-			case PageflowPackage.PF_LINK_BENDPOINT__LINK:
-				return eBasicSetContainer(null,
-						PageflowPackage.PF_LINK_BENDPOINT__LINK, msgs);
-			default:
-				return eDynamicInverseRemove(otherEnd, featureID, baseClass,
-						msgs);
-			}
-		}
-		return eBasicSetContainer(null, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public NotificationChain eBasicRemoveFromContainer(NotificationChain msgs) {
-		if (eContainerFeatureID >= 0) {
-			switch (eContainerFeatureID) {
-			case PageflowPackage.PF_LINK_BENDPOINT__LINK:
-				return eContainer.eInverseRemove(this,
-						PageflowPackage.PF_LINK__BEND_POINTS, PageflowLink.class,
-						msgs);
-			default:
-				return eDynamicBasicRemoveFromContainer(msgs);
-			}
-		}
-		return eContainer.eInverseRemove(this,
-				EOPPOSITE_FEATURE_BASE - eContainerFeatureID, null, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public Object eGet(EStructuralFeature eFeature, boolean resolve) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-		case PageflowPackage.PF_LINK_BENDPOINT__D1_WIDTH:
-			return new Integer(getD1Width());
-		case PageflowPackage.PF_LINK_BENDPOINT__D1_HEIGHT:
-			return new Integer(getD1Height());
-		case PageflowPackage.PF_LINK_BENDPOINT__D2_WIDTH:
-			return new Integer(getD2Width());
-		case PageflowPackage.PF_LINK_BENDPOINT__D2_HEIGHT:
-			return new Integer(getD2Height());
-		case PageflowPackage.PF_LINK_BENDPOINT__WEIGHT:
-			return new Float(getWeight());
-		case PageflowPackage.PF_LINK_BENDPOINT__LINK:
-			return getLink();
-		}
-		return eDynamicGet(eFeature, resolve);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void eSet(EStructuralFeature eFeature, Object newValue) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-		case PageflowPackage.PF_LINK_BENDPOINT__D1_WIDTH:
-			setD1Width(((Integer) newValue).intValue());
-			return;
-		case PageflowPackage.PF_LINK_BENDPOINT__D1_HEIGHT:
-			setD1Height(((Integer) newValue).intValue());
-			return;
-		case PageflowPackage.PF_LINK_BENDPOINT__D2_WIDTH:
-			setD2Width(((Integer) newValue).intValue());
-			return;
-		case PageflowPackage.PF_LINK_BENDPOINT__D2_HEIGHT:
-			setD2Height(((Integer) newValue).intValue());
-			return;
-		case PageflowPackage.PF_LINK_BENDPOINT__WEIGHT:
-			setWeight(((Float) newValue).floatValue());
-			return;
-		case PageflowPackage.PF_LINK_BENDPOINT__LINK:
-			setLink((PageflowLink) newValue);
-			return;
-		}
-		eDynamicSet(eFeature, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void eUnset(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-		case PageflowPackage.PF_LINK_BENDPOINT__D1_WIDTH:
-			setD1Width(D1_WIDTH_EDEFAULT);
-			return;
-		case PageflowPackage.PF_LINK_BENDPOINT__D1_HEIGHT:
-			setD1Height(D1_HEIGHT_EDEFAULT);
-			return;
-		case PageflowPackage.PF_LINK_BENDPOINT__D2_WIDTH:
-			setD2Width(D2_WIDTH_EDEFAULT);
-			return;
-		case PageflowPackage.PF_LINK_BENDPOINT__D2_HEIGHT:
-			setD2Height(D2_HEIGHT_EDEFAULT);
-			return;
-		case PageflowPackage.PF_LINK_BENDPOINT__WEIGHT:
-			setWeight(WEIGHT_EDEFAULT);
-			return;
-		case PageflowPackage.PF_LINK_BENDPOINT__LINK:
-			setLink((PageflowLink) null);
-			return;
-		}
-		eDynamicUnset(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public boolean eIsSet(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-		case PageflowPackage.PF_LINK_BENDPOINT__D1_WIDTH:
-			return d1Width != D1_WIDTH_EDEFAULT;
-		case PageflowPackage.PF_LINK_BENDPOINT__D1_HEIGHT:
-			return d1Height != D1_HEIGHT_EDEFAULT;
-		case PageflowPackage.PF_LINK_BENDPOINT__D2_WIDTH:
-			return d2Width != D2_WIDTH_EDEFAULT;
-		case PageflowPackage.PF_LINK_BENDPOINT__D2_HEIGHT:
-			return d2Height != D2_HEIGHT_EDEFAULT;
-		case PageflowPackage.PF_LINK_BENDPOINT__WEIGHT:
-			return weight != WEIGHT_EDEFAULT;
-		case PageflowPackage.PF_LINK_BENDPOINT__LINK:
-			return getLink() != null;
-		}
-		return eDynamicIsSet(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy())
-			return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (d1Width: "); //$NON-NLS-1$
-		result.append(d1Width);
-		result.append(", d1Height: "); //$NON-NLS-1$
-		result.append(d1Height);
-		result.append(", d2Width: "); //$NON-NLS-1$
-		result.append(d2Width);
-		result.append(", d2Height: "); //$NON-NLS-1$
-		result.append(d2Height);
-		result.append(", weight: "); //$NON-NLS-1$
-		result.append(weight);
-		result.append(')');
-		return result.toString();
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated NOT
-	 */
-	public Dimension getFirstRelativeDimension() {
-		dimStart = new Dimension(getD1Width(), getD1Height());
-		return dimStart;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated NOT
-	 */
-	public Dimension getSecondRelativeDimension() {
-		dimEnd = new Dimension(getD2Width(), getD2Height());
-		return dimEnd;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated NOT
-	 */
-	public void setRelativeDimensions(Dimension dim1, Dimension dim2) {
-		dimStart = dim1;
-		dimEnd = dim2;
-		setD1Width(dimStart.width);
-		setD1Height(dimStart.height);
-
-		setD2Width(dimEnd.width);
-		setD2Height(dimEnd.height);
-	}
-
-}
-// PFLinkBendpointImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/impl/PageflowLinkImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/impl/PageflowLinkImpl.java
deleted file mode 100644
index 61d45f8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/impl/PageflowLinkImpl.java
+++ /dev/null
@@ -1,893 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl;
-
-import java.util.Collection;
-import java.util.Vector;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentWithInverseEList;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.PageflowMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLinkBendpoint;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage;
-import org.eclipse.osgi.util.NLS;
-
-/**
- * <!-- begin-user-doc --> An implementation of the model object '<em><b>PF Link</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowLinkImpl#getPageflow <em>Pageflow</em>}</li>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowLinkImpl#getTarget <em>Target</em>}</li>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowLinkImpl#getSource <em>Source</em>}</li>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowLinkImpl#getOutcome <em>Outcome</em>}</li>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowLinkImpl#isRedirect <em>Redirect</em>}</li>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowLinkImpl#getBendPoints <em>Bend Points</em>}</li>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowLinkImpl#getSmallicon <em>Smallicon</em>}</li>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowLinkImpl#getLargeicon <em>Largeicon</em>}</li>
- * </ul>
- * </p>
- * 
- * @generated
- * 
- */
-public class PageflowLinkImpl extends PageflowElementImpl implements
-		PageflowLink {
-	/**
-	 * The cached value of the '{@link #getTarget() <em>Target</em>}'
-	 * reference. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getTarget()
-	 * @generated
-	 * @ordered
-	 */
-	protected PageflowNode target = null;
-
-	/**
-	 * The cached value of the '{@link #getSource() <em>Source</em>}'
-	 * reference. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getSource()
-	 * @generated
-	 * @ordered
-	 */
-	protected PageflowNode source = null;
-
-	/**
-	 * The default value of the '{@link #getOutcome() <em>Outcome</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getOutcome()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String OUTCOME_EDEFAULT = null;
-
-	/**
-	 * The default value of the '{@link #isRedirect() <em>Redirect</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #isRedirect()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean REDIRECT_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #getBendPoints() <em>Bend Points</em>}'
-	 * containment reference list. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getBendPoints()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList bendPoints = null;
-
-	/**
-	 * The default value of the '{@link #getSmallicon() <em>Smallicon</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getSmallicon()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String SMALLICON_EDEFAULT = null;
-
-	/**
-	 * The default value of the '{@link #getLargeicon() <em>Largeicon</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getLargeicon()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String LARGEICON_EDEFAULT = null;
-
-	/**
-	 * The default value of the '{@link #getFromaction() <em>Fromaction</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getFromaction()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String FROMACTION_EDEFAULT = null;
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected PageflowLinkImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return PageflowPackage.eINSTANCE.getPFLink();
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public Pageflow getPageflow() {
-		if (eContainerFeatureID != PageflowPackage.PF_LINK__PAGEFLOW)
-			return null;
-		return (Pageflow) eContainer;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void setPageflow(Pageflow newPageflow) {
-		if (newPageflow != eContainer
-				|| (eContainerFeatureID != PageflowPackage.PF_LINK__PAGEFLOW && newPageflow != null)) {
-			if (EcoreUtil.isAncestor(this, newPageflow))
-				throw new IllegalArgumentException(
-												NLS.bind(PageflowMessages.PageflowNode_NoRecursiveContainment,toString()));
-			NotificationChain msgs = null;
-			if (eContainer != null)
-				msgs = eBasicRemoveFromContainer(msgs);
-			if (newPageflow != null)
-				msgs = ((InternalEObject) newPageflow).eInverseAdd(this,
-						PageflowPackage.PAGEFLOW__LINKS, Pageflow.class, msgs);
-			msgs = eBasicSetContainer((InternalEObject) newPageflow,
-					PageflowPackage.PF_LINK__PAGEFLOW, msgs);
-			if (msgs != null)
-				msgs.dispatch();
-		} else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					PageflowPackage.PF_LINK__PAGEFLOW, newPageflow, newPageflow));
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public PageflowNode getTarget() {
-		if (target != null && target.eIsProxy()) {
-			PageflowNode oldTarget = target;
-			target = (PageflowNode) eResolveProxy((InternalEObject) target);
-			if (target != oldTarget) {
-				if (eNotificationRequired())
-					eNotify(new ENotificationImpl(this, Notification.RESOLVE,
-							PageflowPackage.PF_LINK__TARGET, oldTarget, target));
-			}
-		}
-		return target;
-	}
-
-	public void setSourcePath(String path) {
-		if (getSource() != null
-				&& path.equals(((PageflowPage) getSource()).getPath())) {
-			return;
-		}
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					PageflowPackage.PF_LINK__SOURCE, getSource(), path));
-	}
-
-	public void setTargetPath(String path) {
-		if (getTarget() != null
-				&& path.equals(((PageflowPage) getTarget()).getPath())) {
-			return;
-		}
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					PageflowPackage.PF_LINK__TARGET, getTarget(), path));
-	}
-
-	/**
-	 * <!-- begin-user-doc --> 
-	 * @return the target
-	 * <!-- end-user-doc -->
-	 *  
-	 * 
-	 * @generated
-	 */
-	public PageflowNode basicGetTarget() {
-		return target;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> 
- 	 * @param newTarget 
-	 * @param msgs 
-	 * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public NotificationChain basicSetTarget(PageflowNode newTarget,
-			NotificationChain msgs) {
-		PageflowNode oldTarget = target;
-		target = newTarget;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this,
-					Notification.SET, PageflowPackage.PF_LINK__TARGET,
-					oldTarget, newTarget);
-			if (msgs == null)
-				msgs = notification;
-			else
-				msgs.add(notification);
-		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void setTarget(PageflowNode newTarget) {
-		if (newTarget != target) {
-			NotificationChain msgs = null;
-			if (target != null)
-				msgs = ((InternalEObject) target).eInverseRemove(this,
-						PageflowPackage.PAGEFLOW_NODE__INLINKS,
-						PageflowNode.class, msgs);
-			if (newTarget != null)
-				msgs = ((InternalEObject) newTarget).eInverseAdd(this,
-						PageflowPackage.PAGEFLOW_NODE__INLINKS,
-						PageflowNode.class, msgs);
-			msgs = basicSetTarget(newTarget, msgs);
-			if (msgs != null)
-				msgs.dispatch();
-		} else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					PageflowPackage.PF_LINK__TARGET, newTarget, newTarget));
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public PageflowNode getSource() {
-		if (source != null && source.eIsProxy()) {
-			PageflowNode oldSource = source;
-			source = (PageflowNode) eResolveProxy((InternalEObject) source);
-			if (source != oldSource) {
-				if (eNotificationRequired())
-					eNotify(new ENotificationImpl(this, Notification.RESOLVE,
-							PageflowPackage.PF_LINK__SOURCE, oldSource, source));
-			}
-		}
-		return source;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> 
-	 * @return the pageflow node 
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public PageflowNode basicGetSource() {
-		return source;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> 
-	 * @param newSource 
-	 * @param msgs 
-	 * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public NotificationChain basicSetSource(PageflowNode newSource,
-			NotificationChain msgs) {
-		// Assert.isTrue(newSource != null);
-		PageflowNode oldSource = source;
-		source = newSource;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this,
-					Notification.SET, PageflowPackage.PF_LINK__SOURCE,
-					oldSource, newSource);
-			if (msgs == null)
-				msgs = notification;
-			else
-				msgs.add(notification);
-		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void setSource(PageflowNode newSource) {
-		// Assert.isTrue(newSource != null);
-		if (newSource != source) {
-			NotificationChain msgs = null;
-			if (source != null)
-				msgs = ((InternalEObject) source).eInverseRemove(this,
-						PageflowPackage.PAGEFLOW_NODE__OUTLINKS,
-						PageflowNode.class, msgs);
-			if (newSource != null)
-				msgs = ((InternalEObject) newSource).eInverseAdd(this,
-						PageflowPackage.PAGEFLOW_NODE__OUTLINKS,
-						PageflowNode.class, msgs);
-			msgs = basicSetSource(newSource, msgs);
-			if (msgs != null)
-				msgs.dispatch();
-		} else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					PageflowPackage.PF_LINK__SOURCE, newSource, newSource));
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EList getBendPoints() {
-		if (bendPoints == null) {
-			bendPoints = new EObjectContainmentWithInverseEList(
-					PageflowLinkBendpoint.class, this,
-					PageflowPackage.PF_LINK__BEND_POINTS,
-					PageflowPackage.PF_LINK_BENDPOINT__LINK);
-		}
-		return bendPoints;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public NotificationChain eInverseAdd(InternalEObject otherEnd,
-			int featureID, Class baseClass, NotificationChain msgs) {
-		if (featureID >= 0) {
-			switch (eDerivedStructuralFeatureID(featureID, baseClass)) {
-			case PageflowPackage.PF_LINK__PAGEFLOW:
-				if (eContainer != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return eBasicSetContainer(otherEnd,
-						PageflowPackage.PF_LINK__PAGEFLOW, msgs);
-			case PageflowPackage.PF_LINK__TARGET:
-				if (target != null)
-					msgs = ((InternalEObject) target).eInverseRemove(this,
-							PageflowPackage.PAGEFLOW_NODE__INLINKS,
-							PageflowNode.class, msgs);
-				return basicSetTarget((PageflowNode) otherEnd, msgs);
-			case PageflowPackage.PF_LINK__SOURCE:
-				if (source != null)
-					msgs = ((InternalEObject) source).eInverseRemove(this,
-							PageflowPackage.PAGEFLOW_NODE__OUTLINKS,
-							PageflowNode.class, msgs);
-				return basicSetSource((PageflowNode) otherEnd, msgs);
-			case PageflowPackage.PF_LINK__BEND_POINTS:
-				return ((InternalEList) getBendPoints()).basicAdd(otherEnd,
-						msgs);
-			default:
-				return eDynamicInverseAdd(otherEnd, featureID, baseClass, msgs);
-			}
-		}
-		if (eContainer != null)
-			msgs = eBasicRemoveFromContainer(msgs);
-		return eBasicSetContainer(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd,
-			int featureID, Class baseClass, NotificationChain msgs) {
-		if (featureID >= 0) {
-			switch (eDerivedStructuralFeatureID(featureID, baseClass)) {
-			case PageflowPackage.PF_LINK__PAGEFLOW:
-				return eBasicSetContainer(null,
-						PageflowPackage.PF_LINK__PAGEFLOW, msgs);
-			case PageflowPackage.PF_LINK__TARGET:
-				return basicSetTarget(null, msgs);
-			case PageflowPackage.PF_LINK__SOURCE:
-				return basicSetSource(null, msgs);
-			case PageflowPackage.PF_LINK__BEND_POINTS:
-				return ((InternalEList) getBendPoints()).basicRemove(otherEnd,
-						msgs);
-			default:
-				return eDynamicInverseRemove(otherEnd, featureID, baseClass,
-						msgs);
-			}
-		}
-		return eBasicSetContainer(null, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public NotificationChain eBasicRemoveFromContainer(NotificationChain msgs) {
-		if (eContainerFeatureID >= 0) {
-			switch (eContainerFeatureID) {
-			case PageflowPackage.PF_LINK__PAGEFLOW:
-				return eContainer.eInverseRemove(this,
-						PageflowPackage.PAGEFLOW__LINKS, Pageflow.class, msgs);
-			default:
-				return eDynamicBasicRemoveFromContainer(msgs);
-			}
-		}
-		return eContainer.eInverseRemove(this,
-				EOPPOSITE_FEATURE_BASE - eContainerFeatureID, null, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public Object eGet(EStructuralFeature eFeature, boolean resolve) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-		case PageflowPackage.PF_LINK__NAME:
-			return getName();
-		case PageflowPackage.PF_LINK__COMMENT:
-			return getComment();
-		case PageflowPackage.PF_LINK__X:
-			return new Integer(getX());
-		case PageflowPackage.PF_LINK__Y:
-			return new Integer(getY());
-		case PageflowPackage.PF_LINK__WIDTH:
-			return new Integer(getWidth());
-		case PageflowPackage.PF_LINK__HEIGHT:
-			return new Integer(getHeight());
-		case PageflowPackage.PF_LINK__ID:
-			return getId();
-		case PageflowPackage.PF_LINK__PAGEFLOW:
-			return getPageflow();
-		case PageflowPackage.PF_LINK__TARGET:
-			if (resolve)
-				return getTarget();
-			return basicGetTarget();
-		case PageflowPackage.PF_LINK__SOURCE:
-			if (resolve)
-				return getSource();
-			return basicGetSource();
-		case PageflowPackage.PF_LINK__OUTCOME:
-			return getOutcome();
-		case PageflowPackage.PF_LINK__REDIRECT:
-			return isRedirect() ? Boolean.TRUE : Boolean.FALSE;
-		case PageflowPackage.PF_LINK__BEND_POINTS:
-			return getBendPoints();
-		case PageflowPackage.PF_LINK__SMALLICON:
-			return getSmallicon();
-		case PageflowPackage.PF_LINK__LARGEICON:
-			return getLargeicon();
-		case PageflowPackage.PF_LINK__FROMACTION:
-			return getFromaction();
-		}
-		return super.eGet(eFeature, resolve);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void eSet(EStructuralFeature eFeature, Object newValue) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-		case PageflowPackage.PF_LINK__NAME:
-			setName((String) newValue);
-			return;
-		case PageflowPackage.PF_LINK__COMMENT:
-			setComment((String) newValue);
-			return;
-		case PageflowPackage.PF_LINK__X:
-			setX(((Integer) newValue).intValue());
-			return;
-		case PageflowPackage.PF_LINK__Y:
-			setY(((Integer) newValue).intValue());
-			return;
-		case PageflowPackage.PF_LINK__WIDTH:
-			setWidth(((Integer) newValue).intValue());
-			return;
-		case PageflowPackage.PF_LINK__HEIGHT:
-			setHeight(((Integer) newValue).intValue());
-			return;
-		case PageflowPackage.PF_LINK__ID:
-			setId((String) newValue);
-			return;
-		case PageflowPackage.PF_LINK__PAGEFLOW:
-			setPageflow((Pageflow) newValue);
-			return;
-		case PageflowPackage.PF_LINK__TARGET:
-			setTarget((PageflowNode) newValue);
-			return;
-		case PageflowPackage.PF_LINK__SOURCE:
-			setSource((PageflowNode) newValue);
-			return;
-		case PageflowPackage.PF_LINK__OUTCOME:
-			setOutcome((String) newValue);
-			return;
-		case PageflowPackage.PF_LINK__REDIRECT:
-			setRedirect(((Boolean) newValue).booleanValue());
-			return;
-		case PageflowPackage.PF_LINK__BEND_POINTS:
-			getBendPoints().clear();
-			getBendPoints().addAll((Collection) newValue);
-			return;
-		case PageflowPackage.PF_LINK__SMALLICON:
-			setSmallicon((String) newValue);
-			return;
-		case PageflowPackage.PF_LINK__LARGEICON:
-			setLargeicon((String) newValue);
-			return;
-		case PageflowPackage.PF_LINK__FROMACTION:
-			setFromaction((String) newValue);
-			return;
-		}
-		super.eSet(eFeature, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void eUnset(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-		case PageflowPackage.PF_LINK__NAME:
-			setName(NAME_EDEFAULT);
-			return;
-		case PageflowPackage.PF_LINK__COMMENT:
-			setComment(COMMENT_EDEFAULT);
-			return;
-		case PageflowPackage.PF_LINK__X:
-			setX(X_EDEFAULT);
-			return;
-		case PageflowPackage.PF_LINK__Y:
-			setY(Y_EDEFAULT);
-			return;
-		case PageflowPackage.PF_LINK__WIDTH:
-			setWidth(WIDTH_EDEFAULT);
-			return;
-		case PageflowPackage.PF_LINK__HEIGHT:
-			setHeight(HEIGHT_EDEFAULT);
-			return;
-		case PageflowPackage.PF_LINK__ID:
-			setId(ID_EDEFAULT);
-			return;
-		case PageflowPackage.PF_LINK__PAGEFLOW:
-			setPageflow((Pageflow) null);
-			return;
-		case PageflowPackage.PF_LINK__TARGET:
-			setTarget((PageflowNode) null);
-			return;
-		case PageflowPackage.PF_LINK__SOURCE:
-			setSource((PageflowNode) null);
-			return;
-		case PageflowPackage.PF_LINK__OUTCOME:
-			setOutcome(OUTCOME_EDEFAULT);
-			return;
-		case PageflowPackage.PF_LINK__REDIRECT:
-			setRedirect(REDIRECT_EDEFAULT);
-			return;
-		case PageflowPackage.PF_LINK__BEND_POINTS:
-			getBendPoints().clear();
-			return;
-		case PageflowPackage.PF_LINK__SMALLICON:
-			setSmallicon(SMALLICON_EDEFAULT);
-			return;
-		case PageflowPackage.PF_LINK__LARGEICON:
-			setLargeicon(LARGEICON_EDEFAULT);
-			return;
-		case PageflowPackage.PF_LINK__FROMACTION:
-			setFromaction(FROMACTION_EDEFAULT);
-			return;
-		}
-		super.eUnset(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public boolean eIsSet(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-		case PageflowPackage.PF_LINK__NAME:
-			return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT
-					.equals(name);
-		case PageflowPackage.PF_LINK__COMMENT:
-			return COMMENT_EDEFAULT == null ? comment != null
-					: !COMMENT_EDEFAULT.equals(comment);
-		case PageflowPackage.PF_LINK__X:
-			return x != X_EDEFAULT;
-		case PageflowPackage.PF_LINK__Y:
-			return y != Y_EDEFAULT;
-		case PageflowPackage.PF_LINK__WIDTH:
-			return width != WIDTH_EDEFAULT;
-		case PageflowPackage.PF_LINK__HEIGHT:
-			return height != HEIGHT_EDEFAULT;
-		case PageflowPackage.PF_LINK__ID:
-			return ID_EDEFAULT == null ? getId() != null : !ID_EDEFAULT
-					.equals(getId());
-		case PageflowPackage.PF_LINK__PAGEFLOW:
-			return getPageflow() != null;
-		case PageflowPackage.PF_LINK__TARGET:
-			return target != null;
-		case PageflowPackage.PF_LINK__SOURCE:
-			return source != null;
-		case PageflowPackage.PF_LINK__OUTCOME:
-			return OUTCOME_EDEFAULT == null ? getOutcome() != null
-					: !OUTCOME_EDEFAULT.equals(getOutcome());
-		case PageflowPackage.PF_LINK__REDIRECT:
-			return isRedirect() != REDIRECT_EDEFAULT;
-		case PageflowPackage.PF_LINK__BEND_POINTS:
-			return bendPoints != null && !bendPoints.isEmpty();
-		case PageflowPackage.PF_LINK__SMALLICON:
-			return SMALLICON_EDEFAULT == null ? getSmallicon() != null
-					: !SMALLICON_EDEFAULT.equals(getSmallicon());
-		case PageflowPackage.PF_LINK__LARGEICON:
-			return LARGEICON_EDEFAULT == null ? getLargeicon() != null
-					: !LARGEICON_EDEFAULT.equals(getLargeicon());
-		case PageflowPackage.PF_LINK__FROMACTION:
-			return FROMACTION_EDEFAULT == null ? getFromaction() != null
-					: !FROMACTION_EDEFAULT.equals(getFromaction());
-		}
-		return super.eIsSet(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy())
-			return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (smallicon: "); //$NON-NLS-1$
-		result.append(getSmallicon());
-		result.append(", largeicon: "); //$NON-NLS-1$
-		result.append(getLargeicon());
-		result.append(", fromaction: "); //$NON-NLS-1$
-		result.append(getFromaction());
-		result.append(", outcome: "); //$NON-NLS-1$
-		result.append(getOutcome());
-		result.append(", redirect: "); //$NON-NLS-1$
-		result.append(isRedirect());
-		result.append(')');
-		return result.toString();
-	}
-
-	/**
-	 * <!-- begin-user-doc --> insert a new bendpoint to the link <!--
-	 * end-user-doc -->
-	 * 
-	 * @generated NOT
-	 */
-	public void insertBendpoint(int index, PageflowLinkBendpoint point) {
-		getBendPoints().add(index, point);
-
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.ADD,
-					PageflowPackage.PF_LINK__BEND_POINTS, null, point));
-	}
-
-	/**
-	 * <!-- begin-user-doc --> remove the current bendpoint <!-- end-user-doc
-	 * -->
-	 * 
-	 * @generated NOT
-	 */
-	public void removeBendpoint(int index) {
-		getBendPoints().remove(index);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> Set the current bendpoint <!-- end-user-doc -->
-	 * 
-	 * @generated NOT
-	 */
-	public void setBendpoint(int index, PageflowLinkBendpoint point) {
-		getBendPoints().set(index, point);
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					PageflowPackage.PF_LINK__BEND_POINTS, null, point));
-
-	}
-
-	/**
-	 * <!-- begin-user-doc --> Set a group of bendpoints to reconstruct the link
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated NOT
-	 */
-	public void setBendpoints(Vector points) {
-		bendPoints = (EList) points;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.ADD_MANY,
-					PageflowPackage.PF_LINK__BEND_POINTS, null, points));
-
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated NOT
-	 */
-	public boolean isRedirect() {
-		Boolean result = (Boolean) getFCElements().get(
-				PageflowPackage.PF_LINK__REDIRECT);
-		return result.booleanValue();
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated NOT
-	 */
-	public void setRedirect(boolean newRedirect) {
-		Boolean oldRedirect = new Boolean(isRedirect());
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					PageflowPackage.PF_LINK__REDIRECT, oldRedirect,
-					new Boolean(newRedirect)));
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated NOT
-	 */
-	public String getOutcome() {
-		String result = (String) getFCElements().get(
-				PageflowPackage.PF_LINK__OUTCOME);
-
-		return result;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated NOT
-	 */
-	public void setOutcome(String newValue) {
-		String oldOutcome = getOutcome();
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					PageflowPackage.PF_LINK__OUTCOME, oldOutcome, newValue));
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated NOT
-	 */
-	public String getSmallicon() {
-		String result = (String) getFCElements().get(
-				PageflowPackage.PF_LINK__SMALLICON);
-		return result;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated NOT
-	 */
-	public void setSmallicon(String newValue) {
-		String oldSmallicon = getSmallicon();
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					PageflowPackage.PF_LINK__SMALLICON, oldSmallicon, newValue));
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated NOT
-	 */
-	public String getLargeicon() {
-		String result = (String) getFCElements().get(
-				PageflowPackage.PF_LINK__LARGEICON);
-
-		return result;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated NOT
-	 */
-	public void setLargeicon(String newValue) {
-		String oldLargeIcon = getLargeicon();
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					PageflowPackage.PF_LINK__LARGEICON, oldLargeIcon, newValue));
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated NOT
-	 */
-	public String getFromaction() {
-		String result = (String) getFCElements().get(
-				PageflowPackage.PF_LINK__FROMACTION);
-		return result;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated NOT
-	 */
-	public void setFromaction(String newFromaction) {
-		String oldFromActionType = getFromaction();
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					PageflowPackage.PF_LINK__FROMACTION, oldFromActionType,
-					newFromaction));
-	}
-
-	/**
-	 * @generated NOT
-	 */
-	public ReferenceElement getFCElements() {
-
-		if (refElement == null) {
-			refElement = new LinkReferenceElement(this);
-		}
-		return refElement;
-	}
-
-}
-// PFLinkImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/impl/PageflowNodeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/impl/PageflowNodeImpl.java
deleted file mode 100644
index 6e64d61..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/impl/PageflowNodeImpl.java
+++ /dev/null
@@ -1,390 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.util.EObjectWithInverseResolvingEList;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.PageflowMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage;
-import org.eclipse.osgi.util.NLS;
-
-/**
- * <!-- begin-user-doc --> An implementation of the model object '<em><b>Node</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowNodeImpl#getPageflow <em>Pageflow</em>}</li>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowNodeImpl#getOutlinks <em>Outlinks</em>}</li>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowNodeImpl#getInlinks <em>Inlinks</em>}</li>
- * </ul>
- * </p>
- * 
- * @generated
- */
-public abstract class PageflowNodeImpl extends PageflowElementImpl implements
-		PageflowNode {
-	/**
-	 * The cached value of the '{@link #getOutlinks() <em>Outlinks</em>}'
-	 * reference list. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getOutlinks()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList outlinks = null;
-
-	/**
-	 * The cached value of the '{@link #getInlinks() <em>Inlinks</em>}'
-	 * reference list. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getInlinks()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList inlinks = null;
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected PageflowNodeImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return PageflowPackage.eINSTANCE.getPageflowNode();
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public Pageflow getPageflow() {
-		if (eContainerFeatureID != PageflowPackage.PAGEFLOW_NODE__PAGEFLOW)
-			return null;
-		return (Pageflow) eContainer;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void setPageflow(Pageflow newPageflow) {
-		if (newPageflow != eContainer
-				|| (eContainerFeatureID != PageflowPackage.PAGEFLOW_NODE__PAGEFLOW && newPageflow != null)) {
-			if (EcoreUtil.isAncestor(this, newPageflow))
-				throw new IllegalArgumentException(
-												NLS.bind(PageflowMessages.PageflowNode_NoRecursiveContainment,toString()));
-			NotificationChain msgs = null;
-			if (eContainer != null)
-				msgs = eBasicRemoveFromContainer(msgs);
-			if (newPageflow != null)
-				msgs = ((InternalEObject) newPageflow).eInverseAdd(this,
-						PageflowPackage.PAGEFLOW__NODES, Pageflow.class, msgs);
-			msgs = eBasicSetContainer((InternalEObject) newPageflow,
-					PageflowPackage.PAGEFLOW_NODE__PAGEFLOW, msgs);
-			if (msgs != null)
-				msgs.dispatch();
-		} else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					PageflowPackage.PAGEFLOW_NODE__PAGEFLOW, newPageflow,
-					newPageflow));
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EList getOutlinks() {
-		if (outlinks == null) {
-			outlinks = new EObjectWithInverseResolvingEList(PageflowLink.class, this,
-					PageflowPackage.PAGEFLOW_NODE__OUTLINKS,
-					PageflowPackage.PF_LINK__SOURCE);
-		}
-		return outlinks;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EList getInlinks() {
-		if (inlinks == null) {
-			inlinks = new EObjectWithInverseResolvingEList(PageflowLink.class, this,
-					PageflowPackage.PAGEFLOW_NODE__INLINKS,
-					PageflowPackage.PF_LINK__TARGET);
-		}
-		return inlinks;
-	}
-
-	/**
-	 * @generated NOT
-	 */
-	public PageflowLink findLinkTo(PageflowNode target) {
-		//
-		java.util.Iterator i = this.getOutlinks().iterator();
-		while (i.hasNext()) {
-			PageflowLink link = (PageflowLink) i.next();
-			if (link.getTarget() == target)
-				return link;
-		}
-		return null;
-
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public NotificationChain eInverseAdd(InternalEObject otherEnd,
-			int featureID, Class baseClass, NotificationChain msgs) {
-		if (featureID >= 0) {
-			switch (eDerivedStructuralFeatureID(featureID, baseClass)) {
-			case PageflowPackage.PAGEFLOW_NODE__PAGEFLOW:
-				if (eContainer != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return eBasicSetContainer(otherEnd,
-						PageflowPackage.PAGEFLOW_NODE__PAGEFLOW, msgs);
-			case PageflowPackage.PAGEFLOW_NODE__OUTLINKS:
-				return ((InternalEList) getOutlinks()).basicAdd(otherEnd, msgs);
-			case PageflowPackage.PAGEFLOW_NODE__INLINKS:
-				return ((InternalEList) getInlinks()).basicAdd(otherEnd, msgs);
-			default:
-				return eDynamicInverseAdd(otherEnd, featureID, baseClass, msgs);
-			}
-		}
-		if (eContainer != null)
-			msgs = eBasicRemoveFromContainer(msgs);
-		return eBasicSetContainer(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd,
-			int featureID, Class baseClass, NotificationChain msgs) {
-		if (featureID >= 0) {
-			switch (eDerivedStructuralFeatureID(featureID, baseClass)) {
-			case PageflowPackage.PAGEFLOW_NODE__PAGEFLOW:
-				return eBasicSetContainer(null,
-						PageflowPackage.PAGEFLOW_NODE__PAGEFLOW, msgs);
-			case PageflowPackage.PAGEFLOW_NODE__OUTLINKS:
-				return ((InternalEList) getOutlinks()).basicRemove(otherEnd,
-						msgs);
-			case PageflowPackage.PAGEFLOW_NODE__INLINKS:
-				return ((InternalEList) getInlinks()).basicRemove(otherEnd,
-						msgs);
-			default:
-				return eDynamicInverseRemove(otherEnd, featureID, baseClass,
-						msgs);
-			}
-		}
-		return eBasicSetContainer(null, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public NotificationChain eBasicRemoveFromContainer(NotificationChain msgs) {
-		if (eContainerFeatureID >= 0) {
-			switch (eContainerFeatureID) {
-			case PageflowPackage.PAGEFLOW_NODE__PAGEFLOW:
-				return eContainer.eInverseRemove(this,
-						PageflowPackage.PAGEFLOW__NODES, Pageflow.class, msgs);
-			default:
-				return eDynamicBasicRemoveFromContainer(msgs);
-			}
-		}
-		return eContainer.eInverseRemove(this,
-				EOPPOSITE_FEATURE_BASE - eContainerFeatureID, null, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public Object eGet(EStructuralFeature eFeature, boolean resolve) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-		case PageflowPackage.PAGEFLOW_NODE__NAME:
-			return getName();
-		case PageflowPackage.PAGEFLOW_NODE__COMMENT:
-			return getComment();
-		case PageflowPackage.PAGEFLOW_NODE__X:
-			return new Integer(getX());
-		case PageflowPackage.PAGEFLOW_NODE__Y:
-			return new Integer(getY());
-		case PageflowPackage.PAGEFLOW_NODE__WIDTH:
-			return new Integer(getWidth());
-		case PageflowPackage.PAGEFLOW_NODE__HEIGHT:
-			return new Integer(getHeight());
-		case PageflowPackage.PAGEFLOW_NODE__ID:
-			return getId();
-		case PageflowPackage.PAGEFLOW_NODE__PAGEFLOW:
-			return getPageflow();
-		case PageflowPackage.PAGEFLOW_NODE__OUTLINKS:
-			return getOutlinks();
-		case PageflowPackage.PAGEFLOW_NODE__INLINKS:
-			return getInlinks();
-		}
-		return super.eGet(eFeature, resolve);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void eSet(EStructuralFeature eFeature, Object newValue) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-		case PageflowPackage.PAGEFLOW_NODE__NAME:
-			setName((String) newValue);
-			return;
-		case PageflowPackage.PAGEFLOW_NODE__COMMENT:
-			setComment((String) newValue);
-			return;
-		case PageflowPackage.PAGEFLOW_NODE__X:
-			setX(((Integer) newValue).intValue());
-			return;
-		case PageflowPackage.PAGEFLOW_NODE__Y:
-			setY(((Integer) newValue).intValue());
-			return;
-		case PageflowPackage.PAGEFLOW_NODE__WIDTH:
-			setWidth(((Integer) newValue).intValue());
-			return;
-		case PageflowPackage.PAGEFLOW_NODE__HEIGHT:
-			setHeight(((Integer) newValue).intValue());
-			return;
-		case PageflowPackage.PAGEFLOW_NODE__ID:
-			setId((String) newValue);
-			return;
-		case PageflowPackage.PAGEFLOW_NODE__PAGEFLOW:
-			setPageflow((Pageflow) newValue);
-			return;
-		case PageflowPackage.PAGEFLOW_NODE__OUTLINKS:
-			getOutlinks().clear();
-			getOutlinks().addAll((Collection) newValue);
-			return;
-		case PageflowPackage.PAGEFLOW_NODE__INLINKS:
-			getInlinks().clear();
-			getInlinks().addAll((Collection) newValue);
-			return;
-		}
-		super.eSet(eFeature, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void eUnset(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-		case PageflowPackage.PAGEFLOW_NODE__NAME:
-			setName(NAME_EDEFAULT);
-			return;
-		case PageflowPackage.PAGEFLOW_NODE__COMMENT:
-			setComment(COMMENT_EDEFAULT);
-			return;
-		case PageflowPackage.PAGEFLOW_NODE__X:
-			setX(X_EDEFAULT);
-			return;
-		case PageflowPackage.PAGEFLOW_NODE__Y:
-			setY(Y_EDEFAULT);
-			return;
-		case PageflowPackage.PAGEFLOW_NODE__WIDTH:
-			setWidth(WIDTH_EDEFAULT);
-			return;
-		case PageflowPackage.PAGEFLOW_NODE__HEIGHT:
-			setHeight(HEIGHT_EDEFAULT);
-			return;
-		case PageflowPackage.PAGEFLOW_NODE__ID:
-			setId(ID_EDEFAULT);
-			return;
-		case PageflowPackage.PAGEFLOW_NODE__PAGEFLOW:
-			setPageflow((Pageflow) null);
-			return;
-		case PageflowPackage.PAGEFLOW_NODE__OUTLINKS:
-			getOutlinks().clear();
-			return;
-		case PageflowPackage.PAGEFLOW_NODE__INLINKS:
-			getInlinks().clear();
-			return;
-		}
-		super.eUnset(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public boolean eIsSet(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-		case PageflowPackage.PAGEFLOW_NODE__NAME:
-			return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT
-					.equals(name);
-		case PageflowPackage.PAGEFLOW_NODE__COMMENT:
-			return COMMENT_EDEFAULT == null ? comment != null
-					: !COMMENT_EDEFAULT.equals(comment);
-		case PageflowPackage.PAGEFLOW_NODE__X:
-			return x != X_EDEFAULT;
-		case PageflowPackage.PAGEFLOW_NODE__Y:
-			return y != Y_EDEFAULT;
-		case PageflowPackage.PAGEFLOW_NODE__WIDTH:
-			return width != WIDTH_EDEFAULT;
-		case PageflowPackage.PAGEFLOW_NODE__HEIGHT:
-			return height != HEIGHT_EDEFAULT;
-		case PageflowPackage.PAGEFLOW_NODE__ID:
-			return ID_EDEFAULT == null ? getId() != null : !ID_EDEFAULT
-					.equals(getId());
-		case PageflowPackage.PAGEFLOW_NODE__PAGEFLOW:
-			return getPageflow() != null;
-		case PageflowPackage.PAGEFLOW_NODE__OUTLINKS:
-			return outlinks != null && !outlinks.isEmpty();
-		case PageflowPackage.PAGEFLOW_NODE__INLINKS:
-			return inlinks != null && !inlinks.isEmpty();
-		}
-		return super.eIsSet(eFeature);
-	}
-
-}
-// PageflowNodeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/impl/PageflowPackageImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/impl/PageflowPackageImpl.java
deleted file mode 100644
index f24f95b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/impl/PageflowPackageImpl.java
+++ /dev/null
@@ -1,782 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl;
-
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.EReference;
-import org.eclipse.emf.ecore.impl.EPackageImpl;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowFactory;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLinkBendpoint;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage;
-
-/**
- * <!-- begin-user-doc --> An implementation of the model <b>Package</b>. <!--
- * end-user-doc -->
- * 
- * @generated
- */
-public class PageflowPackageImpl extends EPackageImpl implements
-		PageflowPackage {
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	private EClass pageflowEClass = null;
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	private EClass pageflowNodeEClass = null;
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	private EClass pfLinkEClass = null;
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	private EClass pageflowElementEClass = null;
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	private EClass pfPageEClass = null;
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	private EClass pfLinkBendpointEClass = null;
-
-	/**
-	 * Creates an instance of the model <b>Package</b>, registered with
-	 * {@link org.eclipse.emf.ecore.EPackage.Registry EPackage.Registry} by the
-	 * package package URI value.
-	 * <p>
-	 * Note: the correct way to create the package is via the static factory
-	 * method {@link #init init()}, which also performs initialization of the
-	 * package, or returns the registered package, if one already exists. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see org.eclipse.emf.ecore.EPackage.Registry
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage#eNS_URI
-	 * @see #init()
-	 * @generated
-	 */
-	private PageflowPackageImpl() {
-		super(eNS_URI, PageflowFactory.eINSTANCE);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	private static boolean isInited = false;
-
-	/**
-	 * Creates, registers, and initializes the <b>Package</b> for this model,
-	 * and for any others upon which it depends. Simple dependencies are
-	 * satisfied by calling this method on all dependent packages before doing
-	 * anything else. This method drives initialization for interdependent
-	 * packages directly, in parallel with this package, itself.
-	 * <p>
-	 * Of this package and its interdependencies, all packages which have not
-	 * yet been registered by their URI values are first created and registered.
-	 * The packages are then initialized in two steps: meta-model objects for
-	 * all of the packages are created before any are initialized, since one
-	 * package's meta-model objects may refer to those of another.
-	 * <p>
-	 * Invocation of this method will not affect any packages that have already
-	 * been initialized. 
-	 * 
-	 * <!-- begin-user-doc --> 
- 	 * @return the package 
-	 * <!-- end-user-doc -->
-	 * 
-	 * @see #eNS_URI
-	 * @see #createPackageContents()
-	 * @see #initializePackageContents()
-	 * @generated
-	 */
-	public static PageflowPackage init() {
-		if (isInited)
-			return (PageflowPackage) EPackage.Registry.INSTANCE
-					.get(PageflowPackage.eNS_URI);
-
-		// Obtain or create and register package
-		PageflowPackageImpl thePageflowPackage = (PageflowPackageImpl) (EPackage.Registry.INSTANCE
-				.get(eNS_URI) instanceof PageflowPackageImpl ? EPackage.Registry.INSTANCE
-				.get(eNS_URI)
-				: new PageflowPackageImpl());
-
-		isInited = true;
-
-		// Create package meta-data objects
-		thePageflowPackage.createPackageContents();
-
-		// Initialize created meta-data
-		thePageflowPackage.initializePackageContents();
-
-		return thePageflowPackage;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EClass getPageflow() {
-		return pageflowEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EReference getPageflow_Nodes() {
-		return (EReference) pageflowEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EReference getPageflow_Links() {
-		return (EReference) pageflowEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EAttribute getPageflow_Configfile() {
-		return (EAttribute) pageflowEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EClass getPageflowNode() {
-		return pageflowNodeEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EReference getPageflowNode_Pageflow() {
-		return (EReference) pageflowNodeEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EReference getPageflowNode_Outlinks() {
-		return (EReference) pageflowNodeEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EReference getPageflowNode_Inlinks() {
-		return (EReference) pageflowNodeEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EClass getPFLink() {
-		return pfLinkEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EReference getPFLink_Pageflow() {
-		return (EReference) pfLinkEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EReference getPFLink_Target() {
-		return (EReference) pfLinkEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EReference getPFLink_Source() {
-		return (EReference) pfLinkEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EAttribute getPFLink_Outcome() {
-		return (EAttribute) pfLinkEClass.getEStructuralFeatures().get(3);
-	}
-
-		/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EAttribute getPFLink_Redirect() {
-		return (EAttribute) pfLinkEClass.getEStructuralFeatures().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EReference getPFLink_BendPoints() {
-		return (EReference) pfLinkEClass.getEStructuralFeatures().get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> 
-	 * @return the small icon eattribute 
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EAttribute getPFLink_Smallicon() {
-		return (EAttribute) pfLinkEClass.getEStructuralFeatures().get(6);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> 
-	 * @return the large icon attribute 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getPFLink_Largeicon() {
-		return (EAttribute) pfLinkEClass.getEStructuralFeatures().get(7);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EAttribute getPFLink_Fromaction() {
-		return (EAttribute) pfLinkEClass.getEStructuralFeatures().get(8);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> 
-	 * @return the reference link eattribute 
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EAttribute getPageflowElement_ReferenceLink() {
-		return (EAttribute) pageflowElementEClass.getEStructuralFeatures().get(
-				7);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EClass getPageflowElement() {
-		return pageflowElementEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EAttribute getPageflowElement_Name() {
-		return (EAttribute) pageflowElementEClass.getEStructuralFeatures().get(
-				0);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EAttribute getPageflowElement_Comment() {
-		return (EAttribute) pageflowElementEClass.getEStructuralFeatures().get(
-				1);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EAttribute getPageflowElement_X() {
-		return (EAttribute) pageflowElementEClass.getEStructuralFeatures().get(
-				2);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EAttribute getPageflowElement_Y() {
-		return (EAttribute) pageflowElementEClass.getEStructuralFeatures().get(
-				3);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EAttribute getPageflowElement_Width() {
-		return (EAttribute) pageflowElementEClass.getEStructuralFeatures().get(
-				4);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EAttribute getPageflowElement_Height() {
-		return (EAttribute) pageflowElementEClass.getEStructuralFeatures().get(
-				5);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EAttribute getPageflowElement_Id() {
-		return (EAttribute) pageflowElementEClass.getEStructuralFeatures().get(
-				6);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EClass getPFPage() {
-		return pfPageEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EAttribute getPFPage_Path() {
-		return (EAttribute) pfPageEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EAttribute getPFPage_Smallicon() {
-		return (EAttribute) pfPageEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EAttribute getPFPage_Largeicon() {
-		return (EAttribute) pfPageEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EClass getPFLinkBendpoint() {
-		return pfLinkBendpointEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EAttribute getPFLinkBendpoint_D1Width() {
-		return (EAttribute) pfLinkBendpointEClass.getEStructuralFeatures().get(
-				0);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EAttribute getPFLinkBendpoint_D1Height() {
-		return (EAttribute) pfLinkBendpointEClass.getEStructuralFeatures().get(
-				1);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EAttribute getPFLinkBendpoint_D2Width() {
-		return (EAttribute) pfLinkBendpointEClass.getEStructuralFeatures().get(
-				2);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EAttribute getPFLinkBendpoint_D2Height() {
-		return (EAttribute) pfLinkBendpointEClass.getEStructuralFeatures().get(
-				3);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EAttribute getPFLinkBendpoint_Weight() {
-		return (EAttribute) pfLinkBendpointEClass.getEStructuralFeatures().get(
-				4);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EReference getPFLinkBendpoint_Link() {
-		return (EReference) pfLinkBendpointEClass.getEStructuralFeatures().get(
-				5);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public PageflowFactory getPageflowFactory() {
-		return (PageflowFactory) getEFactoryInstance();
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	private boolean isCreated = false;
-
-	/**
-	 * Creates the meta-model objects for the package. This method is guarded to
-	 * have no affect on any invocation but its first. <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void createPackageContents() {
-		if (isCreated)
-			return;
-		isCreated = true;
-
-		// Create classes and their features
-		pageflowEClass = createEClass(PAGEFLOW);
-		createEReference(pageflowEClass, PAGEFLOW__NODES);
-		createEReference(pageflowEClass, PAGEFLOW__LINKS);
-		createEAttribute(pageflowEClass, PAGEFLOW__CONFIGFILE);
-
-		pageflowNodeEClass = createEClass(PAGEFLOW_NODE);
-		createEReference(pageflowNodeEClass, PAGEFLOW_NODE__PAGEFLOW);
-		createEReference(pageflowNodeEClass, PAGEFLOW_NODE__OUTLINKS);
-		createEReference(pageflowNodeEClass, PAGEFLOW_NODE__INLINKS);
-
-		pfLinkEClass = createEClass(PF_LINK);
-		createEReference(pfLinkEClass, PF_LINK__PAGEFLOW);
-		createEReference(pfLinkEClass, PF_LINK__TARGET);
-		createEReference(pfLinkEClass, PF_LINK__SOURCE);
-		createEAttribute(pfLinkEClass, PF_LINK__OUTCOME);
-		createEAttribute(pfLinkEClass, PF_LINK__REDIRECT);
-		createEReference(pfLinkEClass, PF_LINK__BEND_POINTS);
-		createEAttribute(pfLinkEClass, PF_LINK__SMALLICON);
-		createEAttribute(pfLinkEClass, PF_LINK__LARGEICON);
-		createEAttribute(pfLinkEClass, PF_LINK__FROMACTION);
-
-		pageflowElementEClass = createEClass(PAGEFLOW_ELEMENT);
-		createEAttribute(pageflowElementEClass, PAGEFLOW_ELEMENT__NAME);
-		createEAttribute(pageflowElementEClass, PAGEFLOW_ELEMENT__COMMENT);
-		createEAttribute(pageflowElementEClass, PAGEFLOW_ELEMENT__X);
-		createEAttribute(pageflowElementEClass, PAGEFLOW_ELEMENT__Y);
-		createEAttribute(pageflowElementEClass, PAGEFLOW_ELEMENT__WIDTH);
-		createEAttribute(pageflowElementEClass, PAGEFLOW_ELEMENT__HEIGHT);
-		createEAttribute(pageflowElementEClass, PAGEFLOW_ELEMENT__ID);
-		createEAttribute(pageflowElementEClass,
-				PAGEFLOW_ELEMENT__REFERENCE_LINK);
-
-		pfPageEClass = createEClass(PF_PAGE);
-		createEAttribute(pfPageEClass, PF_PAGE__PATH);
-		createEAttribute(pfPageEClass, PF_PAGE__SMALLICON);
-		createEAttribute(pfPageEClass, PF_PAGE__LARGEICON);
-
-		pfLinkBendpointEClass = createEClass(PF_LINK_BENDPOINT);
-		createEAttribute(pfLinkBendpointEClass, PF_LINK_BENDPOINT__D1_WIDTH);
-		createEAttribute(pfLinkBendpointEClass, PF_LINK_BENDPOINT__D1_HEIGHT);
-		createEAttribute(pfLinkBendpointEClass, PF_LINK_BENDPOINT__D2_WIDTH);
-		createEAttribute(pfLinkBendpointEClass, PF_LINK_BENDPOINT__D2_HEIGHT);
-		createEAttribute(pfLinkBendpointEClass, PF_LINK_BENDPOINT__WEIGHT);
-		createEReference(pfLinkBendpointEClass, PF_LINK_BENDPOINT__LINK);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	private boolean isInitialized = false;
-
-	/**
-	 * Complete the initialization of the package and its meta-model. This
-	 * method is guarded to have no affect on any invocation but its first. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void initializePackageContents() {
-		if (isInitialized)
-			return;
-		isInitialized = true;
-
-		// Initialize package
-		setName(eNAME);
-		setNsPrefix(eNS_PREFIX);
-		setNsURI(eNS_URI);
-
-		// Add supertypes to classes
-		pageflowEClass.getESuperTypes().add(this.getPageflowElement());
-		pageflowNodeEClass.getESuperTypes().add(this.getPageflowElement());
-		pfLinkEClass.getESuperTypes().add(this.getPageflowElement());
-		pfPageEClass.getESuperTypes().add(this.getPageflowNode());
-
-		// Initialize classes and features; add operations and parameters
-		initEClass(pageflowEClass, Pageflow.class, "Pageflow", !IS_ABSTRACT, //$NON-NLS-1$
-				!IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getPageflow_Nodes(), this.getPageflowNode(), this
-				.getPageflowNode_Pageflow(), "nodes", null, 0, -1, //$NON-NLS-1$
-				Pageflow.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE,
-				IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE,
-				!IS_DERIVED, IS_ORDERED);
-		initEReference(getPageflow_Links(), this.getPFLink(), this
-				.getPFLink_Pageflow(), "links", null, 0, -1, Pageflow.class, //$NON-NLS-1$
-				!IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE,
-				!IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED,
-				IS_ORDERED);
-		initEAttribute(getPageflow_Configfile(), ecorePackage.getEString(),
-				"configfile", null, 0, 1, Pageflow.class, !IS_TRANSIENT, //$NON-NLS-1$
-				!IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE,
-				!IS_DERIVED, IS_ORDERED);
-
-		initEClass(pageflowNodeEClass, PageflowNode.class, "PageflowNode", //$NON-NLS-1$
-				IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getPageflowNode_Pageflow(), this.getPageflow(), this
-				.getPageflow_Nodes(), "pageflow", null, 1, 1, //$NON-NLS-1$
-				PageflowNode.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE,
-				!IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE,
-				!IS_DERIVED, IS_ORDERED);
-		initEReference(getPageflowNode_Outlinks(), this.getPFLink(), this
-				.getPFLink_Source(), "outlinks", null, 0, -1, //$NON-NLS-1$
-				PageflowNode.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE,
-				!IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE,
-				!IS_DERIVED, IS_ORDERED);
-		initEReference(getPageflowNode_Inlinks(), this.getPFLink(), this
-				.getPFLink_Target(), "inlinks", null, 0, -1, //$NON-NLS-1$
-				PageflowNode.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE,
-				!IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE,
-				!IS_DERIVED, IS_ORDERED);
-
-		initEClass(pfLinkEClass, PageflowLink.class, "PFLink", !IS_ABSTRACT, //$NON-NLS-1$
-				!IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getPFLink_Pageflow(), this.getPageflow(), this
-				.getPageflow_Links(), "pageflow", null, 1, 1, //$NON-NLS-1$
-				PageflowLink.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE,
-				!IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE,
-				!IS_DERIVED, IS_ORDERED);
-		initEReference(getPFLink_Target(), this.getPageflowNode(), this
-				.getPageflowNode_Inlinks(), "target", null, 1, 1, //$NON-NLS-1$
-				PageflowLink.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE,
-				!IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE,
-				!IS_DERIVED, IS_ORDERED);
-		initEReference(getPFLink_Source(), this.getPageflowNode(), this
-				.getPageflowNode_Outlinks(), "source", null, 1, 1, //$NON-NLS-1$
-				PageflowLink.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE,
-				!IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE,
-				!IS_DERIVED, IS_ORDERED);
-		initEAttribute(getPFLink_Outcome(), ecorePackage.getEString(),
-				"outcome", null, 0, 1, PageflowLink.class, !IS_TRANSIENT, //$NON-NLS-1$
-				!IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE,
-				!IS_DERIVED, IS_ORDERED);
-		initEAttribute(getPFLink_Redirect(), ecorePackage.getEBoolean(),
-				"redirect", null, 0, 1, PageflowLink.class, !IS_TRANSIENT, //$NON-NLS-1$
-				!IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE,
-				!IS_DERIVED, IS_ORDERED);
-		initEReference(getPFLink_BendPoints(), this.getPFLinkBendpoint(), this
-				.getPFLinkBendpoint_Link(), "bendPoints", null, 0, -1, //$NON-NLS-1$
-				PageflowLink.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE,
-				IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE,
-				!IS_DERIVED, IS_ORDERED);
-		initEAttribute(getPFLink_Smallicon(), ecorePackage.getEString(),
-				"smallicon", null, 0, 1, PageflowLink.class, !IS_TRANSIENT, //$NON-NLS-1$
-				!IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE,
-				!IS_DERIVED, IS_ORDERED);
-		initEAttribute(getPFLink_Largeicon(), ecorePackage.getEString(),
-				"largeicon", null, 0, 1, PageflowLink.class, !IS_TRANSIENT, //$NON-NLS-1$
-				!IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE,
-				!IS_DERIVED, IS_ORDERED);
-		initEAttribute(getPFLink_Fromaction(), ecorePackage.getEString(),
-				"fromaction", null, 0, 1, PageflowLink.class, !IS_TRANSIENT, //$NON-NLS-1$
-				!IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE,
-				!IS_DERIVED, IS_ORDERED);
-
-		initEClass(pageflowElementEClass, PageflowElement.class,
-				"PageflowElement", IS_ABSTRACT, !IS_INTERFACE, //$NON-NLS-1$
-				IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getPageflowElement_Name(), ecorePackage.getEString(),
-				"name", "unnamed", 0, 1, PageflowElement.class, !IS_TRANSIENT, //$NON-NLS-1$ //$NON-NLS-2$
-				!IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE,
-				!IS_DERIVED, IS_ORDERED);
-		initEAttribute(getPageflowElement_Comment(), ecorePackage.getEString(),
-				"comment", null, 0, 1, PageflowElement.class, !IS_TRANSIENT, //$NON-NLS-1$
-				!IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE,
-				!IS_DERIVED, IS_ORDERED);
-		initEAttribute(getPageflowElement_X(), ecorePackage.getEInt(), "x", //$NON-NLS-1$
-				"0", 0, 1, PageflowElement.class, !IS_TRANSIENT, !IS_VOLATILE, //$NON-NLS-1$
-				IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED,
-				IS_ORDERED);
-		initEAttribute(getPageflowElement_Y(), ecorePackage.getEInt(), "y", //$NON-NLS-1$
-				"0", 0, 1, PageflowElement.class, !IS_TRANSIENT, !IS_VOLATILE, //$NON-NLS-1$
-				IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED,
-				IS_ORDERED);
-		initEAttribute(getPageflowElement_Width(), ecorePackage.getEInt(),
-				"width", "-1", 0, 1, PageflowElement.class, !IS_TRANSIENT, //$NON-NLS-1$ //$NON-NLS-2$
-				!IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE,
-				!IS_DERIVED, IS_ORDERED);
-		initEAttribute(getPageflowElement_Height(), ecorePackage.getEInt(),
-				"height", "-1", 0, 1, PageflowElement.class, !IS_TRANSIENT, //$NON-NLS-1$ //$NON-NLS-2$
-				!IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE,
-				!IS_DERIVED, IS_ORDERED);
-		initEAttribute(getPageflowElement_Id(), ecorePackage.getEString(),
-				"id", null, 1, 1, PageflowElement.class, !IS_TRANSIENT, //$NON-NLS-1$
-				IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, IS_UNIQUE,
-				!IS_DERIVED, IS_ORDERED);
-		initEAttribute(getPageflowElement_ReferenceLink(), ecorePackage
-				.getEString(), "referenceLink", "", 0, 1, //$NON-NLS-1$ //$NON-NLS-2$
-				PageflowElement.class, !IS_TRANSIENT, !IS_VOLATILE,
-				IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED,
-				IS_ORDERED);
-
-		initEClass(pfPageEClass, PageflowPage.class, "PFPage", !IS_ABSTRACT, //$NON-NLS-1$
-				!IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getPFPage_Path(), ecorePackage.getEString(), "path", //$NON-NLS-1$
-				null, 0, 1, PageflowPage.class, !IS_TRANSIENT, !IS_VOLATILE,
-				IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED,
-				IS_ORDERED);
-		initEAttribute(getPFPage_Smallicon(), ecorePackage.getEString(),
-				"smallicon", null, 0, 1, PageflowPage.class, !IS_TRANSIENT, //$NON-NLS-1$
-				!IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE,
-				!IS_DERIVED, IS_ORDERED);
-		initEAttribute(getPFPage_Largeicon(), ecorePackage.getEString(),
-				"largeicon", null, 0, 1, PageflowPage.class, !IS_TRANSIENT, //$NON-NLS-1$
-				!IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE,
-				!IS_DERIVED, IS_ORDERED);
-
-		initEClass(pfLinkBendpointEClass, PageflowLinkBendpoint.class,
-				"PFLinkBendpoint", !IS_ABSTRACT, !IS_INTERFACE, //$NON-NLS-1$
-				IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getPFLinkBendpoint_D1Width(), ecorePackage.getEInt(),
-				"d1Width", null, 0, 1, PageflowLinkBendpoint.class, //$NON-NLS-1$
-				!IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE,
-				!IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getPFLinkBendpoint_D1Height(), ecorePackage.getEInt(),
-				"d1Height", null, 0, 1, PageflowLinkBendpoint.class, //$NON-NLS-1$
-				!IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE,
-				!IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getPFLinkBendpoint_D2Width(), ecorePackage.getEInt(),
-				"d2Width", null, 0, 1, PageflowLinkBendpoint.class, //$NON-NLS-1$
-				!IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE,
-				!IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getPFLinkBendpoint_D2Height(), ecorePackage.getEInt(),
-				"d2Height", null, 0, 1, PageflowLinkBendpoint.class, //$NON-NLS-1$
-				!IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE,
-				!IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getPFLinkBendpoint_Weight(), ecorePackage.getEFloat(),
-				"weight", "0.5", 0, 1, PageflowLinkBendpoint.class, //$NON-NLS-1$ //$NON-NLS-2$
-				!IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE,
-				!IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getPFLinkBendpoint_Link(), this.getPFLink(), this
-				.getPFLink_BendPoints(), "link", null, 1, 1, //$NON-NLS-1$
-				PageflowLinkBendpoint.class, !IS_TRANSIENT, !IS_VOLATILE,
-				IS_CHANGEABLE, !IS_COMPOSITE, !IS_RESOLVE_PROXIES,
-				!IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		// Create resource
-		createResource(eNS_URI);
-	}
-
-}
-// PageflowPackageImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/impl/PageflowPageImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/impl/PageflowPageImpl.java
deleted file mode 100644
index eca7a66..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/impl/PageflowPageImpl.java
+++ /dev/null
@@ -1,531 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage;
-
-/**
- * <!-- begin-user-doc --> An implementation of the model object '<em><b>PF Page</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowPageImpl#getPath <em>Path</em>}</li>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowPageImpl#getSmallicon <em>Smallicon</em>}</li>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowPageImpl#getLargeicon <em>Largeicon</em>}</li>
- * </ul>
- * </p>
- * 
- * @generated
- */
-public class PageflowPageImpl extends PageflowNodeImpl implements PageflowPage {
-	private String path;
-
-	private String smallIcon;
-
-	private String largeIcon;
-
-	/**
-	 * The default value of the '{@link #getPath() <em>Path</em>}' attribute.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getPath()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String PATH_EDEFAULT = null;
-
-	/**
-	 * The default value of the '{@link #getSmallicon() <em>Smallicon</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getSmallicon()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String SMALLICON_EDEFAULT = null;
-
-	/**
-	 * The default value of the '{@link #getLargeicon() <em>Largeicon</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getLargeicon()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String LARGEICON_EDEFAULT = null;
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected PageflowPageImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return PageflowPackage.eINSTANCE.getPFPage();
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public String getPath() {
-		String result = (String) getFCElements().get(
-				PageflowPackage.PF_PAGE__PATH);
-		// Try to return reasonable result.
-		return result == null && getFCElements().isEmpty() ? path
-				: (result != null ? result : PATH_EDEFAULT);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated NOT
-	 */
-	public void setPath(String newValue) {
-		String oldPath = getPath();
-		path = newValue;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					PageflowPackage.PF_PAGE__PATH, oldPath, newValue));
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated NOT
-	 */
-
-	public void setComment(String newValue) {
-		super.setComment(newValue);
-		String oldComment = getComment();
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					PageflowPackage.PAGEFLOW_ELEMENT__COMMENT, oldComment,
-					newValue));
-
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated NOT
-	 */
-
-	public String getComment() {
-		String result = (String) getFCElements().get(
-				PageflowPackage.PF_PAGE__COMMENT);
-		return result == null
-				&& (getFCElements().isEmpty() || ((PageReferenceElement) getFCElements())
-						.isEndOnly()) ? super.getComment()
-				: (result != null ? result
-						: PageflowElementImpl.COMMENT_EDEFAULT);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated NOT
-	 */
-
-	public String getName() {
-		String result;
-		// To see if it is in navigation rule.
-		result = (String) getFCElements().get(PageflowPackage.PF_PAGE__NAME);
-		if (result == null) {
-			if (super.getName() == null || super.getName().trim().length() == 0) {
-				result = getPath();
-			} else {
-				result = super.getName();
-			}
-		}
-		return result == null
-				&& (getFCElements().isEmpty() || ((PageReferenceElement) getFCElements())
-						.isEndOnly()) ? PageflowElementImpl.NAME_EDEFAULT
-				: (result == null ? null : result);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated NOT
-	 */
-
-	public void setName(String newName) {
-		super.setName(newName);
-		String oldName = getName();
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					PageflowPackage.PF_PAGE__NAME, oldName, newName));
-
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated NOT
-	 */
-	public String getSmallicon() {
-		String result = (String) getFCElements().get(
-				PageflowPackage.PF_PAGE__SMALLICON);
-
-		return result == null
-				&& (getFCElements().isEmpty() || ((PageReferenceElement) getFCElements())
-						.isEndOnly()) ? smallIcon : (result != null ? result
-				: SMALLICON_EDEFAULT);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated NOT
-	 */
-	public void setSmallicon(String newValue) {
-		String oldSmallicon = getSmallicon();
-		smallIcon = newValue;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					PageflowPackage.PF_PAGE__SMALLICON, oldSmallicon, newValue));
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated NOT
-	 */
-	public String getLargeicon() {
-		String result = (String) getFCElements().get(
-				PageflowPackage.PF_PAGE__LARGEICON);
-
-		return result == null
-				&& (getFCElements().isEmpty() || ((PageReferenceElement) getFCElements())
-						.isEndOnly()) ? largeIcon : (result != null ? result
-				: LARGEICON_EDEFAULT);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated NOT
-	 */
-	public void setLargeicon(String newValue) {
-		String oldLargeIcon = getLargeicon();
-		largeIcon = newValue;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					PageflowPackage.PF_PAGE__LARGEICON, oldLargeIcon, newValue));
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public NotificationChain eInverseAdd(InternalEObject otherEnd,
-			int featureID, Class baseClass, NotificationChain msgs) {
-		if (featureID >= 0) {
-			switch (eDerivedStructuralFeatureID(featureID, baseClass)) {
-			case PageflowPackage.PF_PAGE__PAGEFLOW:
-				if (eContainer != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return eBasicSetContainer(otherEnd,
-						PageflowPackage.PF_PAGE__PAGEFLOW, msgs);
-			case PageflowPackage.PF_PAGE__OUTLINKS:
-				return ((InternalEList) getOutlinks()).basicAdd(otherEnd, msgs);
-			case PageflowPackage.PF_PAGE__INLINKS:
-				return ((InternalEList) getInlinks()).basicAdd(otherEnd, msgs);
-			default:
-				return eDynamicInverseAdd(otherEnd, featureID, baseClass, msgs);
-			}
-		}
-		if (eContainer != null)
-			msgs = eBasicRemoveFromContainer(msgs);
-		return eBasicSetContainer(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd,
-			int featureID, Class baseClass, NotificationChain msgs) {
-		if (featureID >= 0) {
-			switch (eDerivedStructuralFeatureID(featureID, baseClass)) {
-			case PageflowPackage.PF_PAGE__PAGEFLOW:
-				return eBasicSetContainer(null,
-						PageflowPackage.PF_PAGE__PAGEFLOW, msgs);
-			case PageflowPackage.PF_PAGE__OUTLINKS:
-				return ((InternalEList) getOutlinks()).basicRemove(otherEnd,
-						msgs);
-			case PageflowPackage.PF_PAGE__INLINKS:
-				return ((InternalEList) getInlinks()).basicRemove(otherEnd,
-						msgs);
-			default:
-				return eDynamicInverseRemove(otherEnd, featureID, baseClass,
-						msgs);
-			}
-		}
-		return eBasicSetContainer(null, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public NotificationChain eBasicRemoveFromContainer(NotificationChain msgs) {
-		if (eContainerFeatureID >= 0) {
-			switch (eContainerFeatureID) {
-			case PageflowPackage.PF_PAGE__PAGEFLOW:
-				return eContainer.eInverseRemove(this,
-						PageflowPackage.PAGEFLOW__NODES, Pageflow.class, msgs);
-			default:
-				return eDynamicBasicRemoveFromContainer(msgs);
-			}
-		}
-		return eContainer.eInverseRemove(this,
-				EOPPOSITE_FEATURE_BASE - eContainerFeatureID, null, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public Object eGet(EStructuralFeature eFeature, boolean resolve) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-		case PageflowPackage.PF_PAGE__NAME:
-			return getName();
-		case PageflowPackage.PF_PAGE__COMMENT:
-			return getComment();
-		case PageflowPackage.PF_PAGE__X:
-			return new Integer(getX());
-		case PageflowPackage.PF_PAGE__Y:
-			return new Integer(getY());
-		case PageflowPackage.PF_PAGE__WIDTH:
-			return new Integer(getWidth());
-		case PageflowPackage.PF_PAGE__HEIGHT:
-			return new Integer(getHeight());
-		case PageflowPackage.PF_PAGE__ID:
-			return getId();
-		case PageflowPackage.PF_PAGE__PAGEFLOW:
-			return getPageflow();
-		case PageflowPackage.PF_PAGE__OUTLINKS:
-			return getOutlinks();
-		case PageflowPackage.PF_PAGE__INLINKS:
-			return getInlinks();
-		case PageflowPackage.PF_PAGE__PATH:
-			return getPath();
-		case PageflowPackage.PF_PAGE__SMALLICON:
-			return getSmallicon();
-		case PageflowPackage.PF_PAGE__LARGEICON:
-			return getLargeicon();
-		}
-		return super.eGet(eFeature, resolve);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void eSet(EStructuralFeature eFeature, Object newValue) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-		case PageflowPackage.PF_PAGE__NAME:
-			setName((String) newValue);
-			return;
-		case PageflowPackage.PF_PAGE__COMMENT:
-			setComment((String) newValue);
-			return;
-		case PageflowPackage.PF_PAGE__X:
-			setX(((Integer) newValue).intValue());
-			return;
-		case PageflowPackage.PF_PAGE__Y:
-			setY(((Integer) newValue).intValue());
-			return;
-		case PageflowPackage.PF_PAGE__WIDTH:
-			setWidth(((Integer) newValue).intValue());
-			return;
-		case PageflowPackage.PF_PAGE__HEIGHT:
-			setHeight(((Integer) newValue).intValue());
-			return;
-		case PageflowPackage.PF_PAGE__ID:
-			setId((String) newValue);
-			return;
-		case PageflowPackage.PF_PAGE__PAGEFLOW:
-			setPageflow((Pageflow) newValue);
-			return;
-		case PageflowPackage.PF_PAGE__OUTLINKS:
-			getOutlinks().clear();
-			getOutlinks().addAll((Collection) newValue);
-			return;
-		case PageflowPackage.PF_PAGE__INLINKS:
-			getInlinks().clear();
-			getInlinks().addAll((Collection) newValue);
-			return;
-		case PageflowPackage.PF_PAGE__PATH:
-			setPath((String) newValue);
-			return;
-		case PageflowPackage.PF_PAGE__SMALLICON:
-			setSmallicon((String) newValue);
-			return;
-		case PageflowPackage.PF_PAGE__LARGEICON:
-			setLargeicon((String) newValue);
-			return;
-		}
-		super.eSet(eFeature, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void eUnset(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-		case PageflowPackage.PF_PAGE__NAME:
-			setName(NAME_EDEFAULT);
-			return;
-		case PageflowPackage.PF_PAGE__COMMENT:
-			setComment(COMMENT_EDEFAULT);
-			return;
-		case PageflowPackage.PF_PAGE__X:
-			setX(X_EDEFAULT);
-			return;
-		case PageflowPackage.PF_PAGE__Y:
-			setY(Y_EDEFAULT);
-			return;
-		case PageflowPackage.PF_PAGE__WIDTH:
-			setWidth(WIDTH_EDEFAULT);
-			return;
-		case PageflowPackage.PF_PAGE__HEIGHT:
-			setHeight(HEIGHT_EDEFAULT);
-			return;
-		case PageflowPackage.PF_PAGE__ID:
-			setId(ID_EDEFAULT);
-			return;
-		case PageflowPackage.PF_PAGE__PAGEFLOW:
-			setPageflow((Pageflow) null);
-			return;
-		case PageflowPackage.PF_PAGE__OUTLINKS:
-			getOutlinks().clear();
-			return;
-		case PageflowPackage.PF_PAGE__INLINKS:
-			getInlinks().clear();
-			return;
-		case PageflowPackage.PF_PAGE__PATH:
-			setPath(PATH_EDEFAULT);
-			return;
-		case PageflowPackage.PF_PAGE__SMALLICON:
-			setSmallicon(SMALLICON_EDEFAULT);
-			return;
-		case PageflowPackage.PF_PAGE__LARGEICON:
-			setLargeicon(LARGEICON_EDEFAULT);
-			return;
-		}
-		super.eUnset(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public boolean eIsSet(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-		case PageflowPackage.PF_PAGE__NAME:
-			return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT
-					.equals(name);
-		case PageflowPackage.PF_PAGE__COMMENT:
-			return COMMENT_EDEFAULT == null ? comment != null
-					: !COMMENT_EDEFAULT.equals(comment);
-		case PageflowPackage.PF_PAGE__X:
-			return x != X_EDEFAULT;
-		case PageflowPackage.PF_PAGE__Y:
-			return y != Y_EDEFAULT;
-		case PageflowPackage.PF_PAGE__WIDTH:
-			return width != WIDTH_EDEFAULT;
-		case PageflowPackage.PF_PAGE__HEIGHT:
-			return height != HEIGHT_EDEFAULT;
-		case PageflowPackage.PF_PAGE__ID:
-			return ID_EDEFAULT == null ? getId() != null : !ID_EDEFAULT
-					.equals(getId());
-		case PageflowPackage.PF_PAGE__PAGEFLOW:
-			return getPageflow() != null;
-		case PageflowPackage.PF_PAGE__OUTLINKS:
-			return outlinks != null && !outlinks.isEmpty();
-		case PageflowPackage.PF_PAGE__INLINKS:
-			return inlinks != null && !inlinks.isEmpty();
-		case PageflowPackage.PF_PAGE__PATH:
-			return PATH_EDEFAULT == null ? getPath() != null : !PATH_EDEFAULT
-					.equals(getPath());
-		case PageflowPackage.PF_PAGE__SMALLICON:
-			return SMALLICON_EDEFAULT == null ? getSmallicon() != null
-					: !SMALLICON_EDEFAULT.equals(getSmallicon());
-		case PageflowPackage.PF_PAGE__LARGEICON:
-			return LARGEICON_EDEFAULT == null ? getLargeicon() != null
-					: !LARGEICON_EDEFAULT.equals(getLargeicon());
-		}
-		return super.eIsSet(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy())
-			return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (path: "); //$NON-NLS-1$
-		result.append(getPath());
-		result.append(", smallicon: "); //$NON-NLS-1$
-		result.append(getSmallicon());
-		result.append(", largeicon: "); //$NON-NLS-1$
-		result.append(getLargeicon());
-		result.append(')');
-		return result.toString();
-	}
-
-	public ReferenceElement getFCElements() {
-
-		if (refElement == null) {
-			refElement = new PageReferenceElement(this);
-		}
-		return refElement;
-	}
-
-}
-// PFPageImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/impl/ReferenceElement.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/impl/ReferenceElement.java
deleted file mode 100644
index d013ee6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/impl/ReferenceElement.java
+++ /dev/null
@@ -1,168 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement;
-import org.eclipse.wst.common.internal.emf.resource.CompatibilityXMIResource;
-
-/**
- * The base class for mapping facesconfig node from pageflow node. The
- * ReferenceElement could be extended later to enable other model to be
- * referenced by pageflow.
- * 
- * @author hmeng
- * 
- */
-public abstract class ReferenceElement {
-
-	private List data = new ArrayList();
-
-	/**
-	 * the pageflow element
-	 */
-	protected PageflowElement pageflowElement;
-
-	/**
-	 * @param pageflowElement
-	 */
-	public ReferenceElement(PageflowElement pageflowElement) {
-		this.pageflowElement = pageflowElement;
-	}
-
-	/**
-	 * @param pageflowElement
-	 * @param facesConfigObject
-	 */
-	public ReferenceElement(PageflowElement pageflowElement,
-			EObject facesConfigObject) {
-		this(pageflowElement);
-		this.add(facesConfigObject);
-	}
-
-	/**
-	 * Add object to the list.
-	 * 
-	 * @param object
-	 */
-	public void add(EObject object) {
-		if (!data.contains(object)) {
-			data.add(object);
-		}
-	}
-
-
-	/**
-	 * The fragment path of a node.
-	 * 
-	 * @param object
-	 * @return the path
-	 */
-	public static String resolvePath(EObject object) {
-		if (object != null) {
-			((CompatibilityXMIResource) object.eResource())
-					.setFormat(CompatibilityXMIResource.FORMAT_EMF1);
-			String uriTarget = object.eResource().getURIFragment(object);
-			return uriTarget;
-		}
-        return ""; //$NON-NLS-1$
-	}
-
-	/**
-	 * Resolve each referenced data's path and combine the result into one
-	 * string, the path will be seperated with '|'.
-	 * 
-	 * @return the resolved string 
-	 */
-	public String resolveReferenceString() {
-		String result = ""; //$NON-NLS-1$
-		for (int i = 0, n = data.size(); i < n; i++) {
-			result += resolvePath((EObject) data.get(i)) + "|"; //$NON-NLS-1$
-		}
-		if (result.length() > 0) {
-			result = result.substring(0, result.length());
-		}
-		return result;
-	}
-
-	/**
-	 * The EMF paths of all referenced elements.
-	 * 
-	 * @return the list of resolved paths for the data elements
-	 */
-	public List getPaths() {
-		List paths = new ArrayList();
-		for (int i = 0, n = data.size(); i < n; i++) {
-			paths.add(resolvePath((EObject) data.get(i)));
-		}
-		return paths;
-	}
-
-	/**
-	 * The facesconfig elements that are referenced.
-	 * 
-	 * @return the list of elements
-	 */
-	public List getData() {
-		return data;
-	}
-
-	/**
-	 * Clear the data
-	 */
-	public void clear() {
-		if (!data.isEmpty()) {
-			data.clear();
-		}
-	}
-
-	/**
-	 * @return true if the data is empty
-	 */
-	public boolean isEmpty() {
-		return data.isEmpty();
-	}
-
-	/**
-	 * Dispose the element
-	 */
-	public void dispose() {
-		clear();
-	}
-
-	/**
-	 * Update the referenced faces-config elements.
-	 * 
-	 */
-	abstract public void update();
-
-	/**
-	 * Return a pageflow property's value with referenced faces-config element.
-	 * 
-	 * @param eFeature
-	 * @return the value for eFeature
-	 */
-	abstract public Object get(int eFeature);
-
-	/**
-	 * To set a pageflow property's value will result in seting a faces-config
-	 * element.
-	 * 
-	 * @param eFeature
-	 * @param newValue
-	 */
-	abstract public void set(EStructuralFeature eFeature, Object newValue);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/ActionDialogCellEditor.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/ActionDialogCellEditor.java
deleted file mode 100644
index a68e86c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/ActionDialogCellEditor.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties;
-
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-
-/**
- * 
- * Dialog Cell Editor for Action browser.
- * 
- * @author Xiao-guang Zhang
- */
-public class ActionDialogCellEditor extends EditableDialogCellEditor {
-
-
-	/**
-	 * Default constructor
-	 */
-	public ActionDialogCellEditor() {
-		super();
-	}
-
-
-	/**
-	 * @param parent
-	 */
-	public ActionDialogCellEditor(Composite parent) {
-		super(parent);
-	}
-
-	/**
-	 * @param parent
-	 * @param style
-	 */
-	public ActionDialogCellEditor(Composite parent, int style) {
-		super(parent, style);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see DialogCellEditor#openDialogBox(org.eclipse.swt.widgets.Control)
-	 */
-	protected Object openDialogBox(Control cellEditorWindow) {
-		String actionExpression = getDefaultText().getText();
-		// IStructuredSelection selectionToPass = StructuredSelection.EMPTY;
-		// Create a new jsf Wizard
-
-		// FIXME sfshi 2005-11-16
-		// ActionSelectionWizard actionSelectionWizard =
-		// new ActionSelectionWizard(ActionSelectionWizard.CONSIDER_METHODS);
-		// actionSelectionWizard.init(EditorPlugin.getDefault().getWorkbench(),
-		// selectionToPass);
-		// actionSelectionWizard.setActionExpression(actionExpression);
-		// //using a wizard dialog to display the new jsf wizard
-		// WizardDialog actionSelectionWizardDialog =
-		// new WizardDialog(cellEditorWindow.getShell(),actionSelectionWizard);
-		// if (actionSelectionWizardDialog.open() == WizardDialog.OK )
-		// {
-		// actionExpression = actionSelectionWizard.getActionExpression();
-		// }
-		return actionExpression;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/ActionOutcomeDialogCellEditor.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/ActionOutcomeDialogCellEditor.java
deleted file mode 100644
index 3c68341..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/ActionOutcomeDialogCellEditor.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties;
-
-import org.eclipse.jface.window.Window;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode;
-import org.eclipse.jst.jsf.facesconfig.ui.util.WebrootUtil;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-
-/**
- * 
- * Dialog Cell Editor for Action's outcome browser.
- * 
- * @author Xiao-guang Zhang
- */
-public class ActionOutcomeDialogCellEditor extends EditableDialogCellEditor {
-	/** the source PFLink element */
-	PageflowElement element;
-
-	/**
-	 * @param element
-	 */
-	public ActionOutcomeDialogCellEditor(PageflowElement element) {
-		super();
-		this.element = element;
-	}
-
-	/**
-	 * @param parent
-	 * @param element
-	 */
-	public ActionOutcomeDialogCellEditor(Composite parent,
-			PageflowElement element) {
-		super(parent);
-		this.element = element;
-	}
-
-
-	/**
-	 * @param parent
-	 * @param style
-	 * @param element
-	 */
-	public ActionOutcomeDialogCellEditor(Composite parent, int style,
-			PageflowElement element) {
-		super(parent, style);
-		this.element = element;
-	}
-
-	/**
-	 * get the previous JSP page, it can be null if the previous node is not
-	 * PFPage, but PFAction.
-	 * 
-	 * @param element_
-	 * @return
-	 */
-	private String getPreviousJSPPath(PageflowElement element_) {
-		String jspPath = null;
-		if (element_ instanceof PageflowLink) {
-			PageflowNode source = ((PageflowLink) element_).getSource();
-
-			if (source instanceof PageflowPage) {
-				jspPath = ((PageflowPage) source).getPath();
-			}
-		}
-		return jspPath;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see DialogCellEditor#openDialogBox(org.eclipse.swt.widgets.Control)
-	 */
-	protected Object openDialogBox(Control cellEditorWindow) {
-		String outcome = getDefaultText().getText();
-
-		String jspPathName = WebrootUtil.getProjectPath(element,
-				getPreviousJSPPath(element));
-
-		ActionOutcomeSelectionDialog selectionDialog = new ActionOutcomeSelectionDialog(
-				getControl().getShell(), outcome, jspPathName);
-
-		if (selectionDialog.open() == Window.OK) {
-			outcome = selectionDialog.getSelectedAction();
-		}
-
-		return outcome;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/ActionOutcomeSelectionDialog.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/ActionOutcomeSelectionDialog.java
deleted file mode 100644
index b788e53..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/ActionOutcomeSelectionDialog.java
+++ /dev/null
@@ -1,379 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties;
-
-import java.util.List;
-
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.viewers.ColumnPixelData;
-import org.eclipse.jface.viewers.TableLayout;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.Separator;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.PageflowMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.util.JSPUtil;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.swt.widgets.TableItem;
-import org.eclipse.swt.widgets.Text;
-import org.w3c.dom.Attr;
-import org.w3c.dom.Element;
-
-/**
- * This dialog is used to edit outcome property of link component of Pageflow
- * Designer.
- * 
- * @author Xiao-guang Zhang
- */
-public class ActionOutcomeSelectionDialog extends Dialog {
-
-	/** property's name text control */
-	private Text actionText;
-
-	/** linked source jsp file name */
-	private String jspName;
-
-	/** the current outcome */
-	private String outcome;
-
-	/** action table control */
-	private Table actionTable;
-
-	/** Column width of component name and action */
-	private static final int COMPONENT_COL_WIDTH = 160;
-
-	private static final int ACTION_COL_WIDTH = 160;
-
-	/** Dialog default height and width */
-	private static final int DIALOG_DEFAULT_WIDTH = 400;
-
-	private static final int DIALOG_DEFAULT_HEIGHT = 300;
-
-	private static String JSF_EL_LEFT_BRACE = "#{"; //$NON-NLS-1$
-
-	private static String JSF_EL_RIGHT_BRACE = "}"; //$NON-NLS-1$
-
-	/** the listener for the text modification */
-	private ModifyListener modifyListener;
-
-	/**
-	 * @param parentShell
-	 * @param outcome
-	 * @param jspName
-	 */
-	public ActionOutcomeSelectionDialog(Shell parentShell, String outcome,
-			String jspName) {
-		super(parentShell);
-		this.outcome = outcome;
-		this.jspName = jspName;
-
-		modifyListener = new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				verifyComplete();
-			}
-		};
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see Dialog#createDialogArea(Composite)
-	 */
-	protected Control createDialogArea(Composite parent) {
-		GridLayout gridLayout;
-
-		Composite container = (Composite) super.createDialogArea(parent);
-		gridLayout = new GridLayout();
-		gridLayout.numColumns = 1;
-		gridLayout.marginWidth = 10;
-		gridLayout.marginHeight = 10;
-		container.setLayout(gridLayout);
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		// gd.widthHint = 300;
-		gd.heightHint = DIALOG_DEFAULT_HEIGHT;
-		gd.widthHint = DIALOG_DEFAULT_WIDTH;
-		container.setLayoutData(gd);
-
-		Label choiceLabel = new Label(container, SWT.LEFT);
-		gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
-		// gd.widthHint = 100;
-		choiceLabel.setLayoutData(gd);
-		// Pageflow.Property.Action.OutcomeSelectionDialog.Choice = Enter the
-		// outcome or select one from action list below:
-		choiceLabel
-				.setText(PageflowMessages.Pageflow_Property_Action_OutcomeSelectionDialog_Choice);
-
-		createOutcomeSection(container);
-
-		createActionListSection(container);
-
-		return container;
-	}
-
-	/**
-	 * create a Outcome input section
-	 * 
-	 * @param container
-	 */
-	protected void createOutcomeSection(Composite container) {
-		Composite outcomeSection = new Composite(container, SWT.NONE);
-		GridLayout gl = new GridLayout();
-		gl.numColumns = 1;
-		gl.marginWidth = 0;
-		outcomeSection.setLayout(gl);
-		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-		outcomeSection.setLayoutData(gd);
-
-		actionText = new Text(outcomeSection, SWT.BORDER);
-		gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL
-				| GridData.FILL_HORIZONTAL);
-		actionText.setLayoutData(gd);
-
-		actionText.addModifyListener(modifyListener);
-
-		if (outcome != null && outcome.length() > 0) {
-			actionText.setText(outcome);
-		}
-	}
-
-	/**
-	 * create action list table section
-	 * 
-	 * @param container
-	 */
-	protected void createActionListSection(Composite container) {
-		final Group actionSection = new Group(container, SWT.NONE);
-		GridLayout gridLayout = new GridLayout();
-		gridLayout.numColumns = 1;
-		actionSection.setLayout(gridLayout);
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		actionSection.setLayoutData(gd);
-
-		String actionListTitle = null;
-		if (jspName != null && jspName.length() > 0) {
-			actionListTitle = NLS.bind(PageflowMessages.Pageflow_Property_Action_OutcomeSelectionDialog_ActionListTableWithJSP_Title, jspName);			
-		} else {
-			actionListTitle = PageflowMessages.Pageflow_Property_Action_OutcomeSelectionDialog_ActionListTable_Title;
-		}
-
-		// Pageflow.Property.Action.OutcomeSelectionDialog.ActionListTable.Title
-		// = Actions
-		actionSection.setText(actionListTitle);
-
-		actionTable = new Table(actionSection, SWT.BORDER | SWT.FULL_SELECTION);
-		actionTable.setLayoutData(new GridData(GridData.FILL_BOTH));
-		actionTable.setHeaderVisible(true);
-		actionTable.setLinesVisible(true);
-		TableLayout layout = new TableLayout();
-		actionTable.setLayout(layout);
-
-		layout.addColumnData(new ColumnPixelData(COMPONENT_COL_WIDTH));
-		layout.addColumnData(new ColumnPixelData(ACTION_COL_WIDTH));
-		TableColumn componentCol = new TableColumn(actionTable, SWT.NONE);
-		// Pageflow.Property.Action.OutcomeSelectionDialog.ActionListTable.Component
-		// = Component ID
-		componentCol
-				.setText(PageflowMessages.Pageflow_Property_Action_OutcomeSelectionDialog_ActionListTable_Component);
-		TableColumn actionCol = new TableColumn(actionTable, SWT.NONE);
-
-		// Pageflow.Property.Action.OutcomeSelectionDialog.ActionListTable.Action
-		// = Action
-		actionCol
-				.setText(PageflowMessages.Pageflow_Property_Action_OutcomeSelectionDialog_ActionListTable_Action);
-
-		actionTable.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				TableItem selItem = (TableItem) e.item;
-				String action = selItem.getText(1);
-				if (action != null && action.length() > 0)
-					actionText.setText(action);
-			}
-		});
-
-		addActionsInJSP();
-
-	}
-
-	/**
-	 * Creates a separator line. Expects a <code>GridLayout</code> with at
-	 * least 1 column.
-	 * 
-	 * @param composite
-	 *            the parent composite
-	 * @param nColumns
-	 *            number of columns to span
-	 */
-	protected void createSeparator(Composite composite, int nColumns) {
-		(new Separator(SWT.SEPARATOR | SWT.HORIZONTAL)).doFillIntoGrid(null,
-				composite, nColumns, convertHeightInCharsToPixels(1));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see Dialog#createButtonsForButtonBar(Composite)
-	 */
-	protected void createButtonsForButtonBar(Composite parent) {
-		createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL,
-				true);
-		createButton(parent, IDialogConstants.CANCEL_ID,
-				IDialogConstants.CANCEL_LABEL, false);
-
-		verifyComplete();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see Dialog#configureShell(Shell)
-	 */
-	protected void configureShell(Shell newShell) {
-		super.configureShell(newShell);
-
-		// Pageflow.Property.Action.OutcomeSelectionDialog.Title = Outcome
-		// Selection
-		newShell
-				.setText(PageflowMessages.Pageflow_Property_Action_OutcomeSelectionDialog_Title);
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see Dialog#buttonPressed(int)
-	 */
-	protected void buttonPressed(int buttonId) {
-		if (buttonId == IDialogConstants.CANCEL_ID) {
-			setReturnCode(CANCEL);
-			close();
-			return;
-		} else if (buttonId == IDialogConstants.OK_ID) {
-			setReturnCode(OK);
-
-			outcome = actionText.getText();
-
-			close();
-			return;
-		}
-		super.buttonPressed(buttonId);
-	}
-
-	/**
-	 * 
-	 * check the dialog inputs are complete or not, and set the OK button enable
-	 * or not.
-	 */
-	private void verifyComplete() {
-		if (getButton(IDialogConstants.OK_ID) != null) {
-			getButton(IDialogConstants.OK_ID).setEnabled(isDialogComplete());
-		}
-	}
-
-	/**
-	 * check the dialog inputs are complete or not.
-	 * 
-	 * @return
-	 */
-	private boolean isDialogComplete() {
-		return isValidName();
-	}
-
-	/**
-	 * the input name is valid or not
-	 * 
-	 * @return
-	 */
-	private boolean isValidName() {
-		return actionText.getText().length() > 0;
-	}
-
-	/**
-	 * get the selected action in the action table
-	 * 
-	 * @return - selected action
-	 */
-	public String getSelectedAction() {
-		return outcome;
-	}
-
-	/**
-	 * add actions in the source jsp file to the action list table control
-	 * 
-	 */
-	private void addActionsInJSP() {
-		List actionNodes = JSPUtil.getActionListInJSPFile(jspName);
-
-		if (actionNodes != null) {
-			for (int i = 0, n = actionNodes.size(); i < n; i++) {
-				Element node = (Element) actionNodes.get(i);
-				StringBuffer componentName = new StringBuffer();
-
-				Attr idAttr = node.getAttributeNode("id"); //$NON-NLS-1$
-				if (idAttr != null)
-					componentName.append(idAttr.getNodeValue());
-
-				componentName.append("(").append(node.getTagName()).append(")"); //$NON-NLS-1$ //$NON-NLS-2$
-
-				Attr actionAttr = node.getAttributeNode("action"); //$NON-NLS-1$
-				if (actionAttr != null) {
-					String action = actionAttr.getValue();
-					if (isValidEL(action))
-						addActionTableItem(componentName.toString(), action);
-				}
-			}
-		}
-	}
-
-	/**
-	 * @param expressionString
-	 * @return true if expressionString is valid EL
-	 */
-	public static boolean isValidEL(String expressionString) {
-		if (expressionString == null || expressionString.length() == 0)
-			return true;
-
-		return (expressionString.startsWith(JSF_EL_LEFT_BRACE) && expressionString
-				.endsWith(JSF_EL_RIGHT_BRACE))
-				|| (!expressionString.startsWith(JSF_EL_LEFT_BRACE) && !expressionString
-						.endsWith(JSF_EL_RIGHT_BRACE));
-	}
-
-	/**
-	 * add a new action item in the previous jsp page.
-	 * 
-	 * @param componentName -
-	 *            JSF component element
-	 * @param action -
-	 *            value of action's attribute
-	 */
-	private void addActionTableItem(String componentName, String action) {
-		if (componentName != null && componentName.length() > 0
-				&& action != null && action.length() > 0) {
-			TableItem item = new TableItem(actionTable, SWT.NONE);
-			item.setText(0, componentName);
-			item.setText(1, action);
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/ActionSectionDescriptor.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/ActionSectionDescriptor.java
deleted file mode 100644
index 85ff2e2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/ActionSectionDescriptor.java
+++ /dev/null
@@ -1,11 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties;
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/EditableDialogCellEditor.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/EditableDialogCellEditor.java
deleted file mode 100644
index ee2cd23..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/EditableDialogCellEditor.java
+++ /dev/null
@@ -1,147 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties;
-
-import java.text.MessageFormat;
-
-import org.eclipse.jface.viewers.DialogCellEditor;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.FocusAdapter;
-import org.eclipse.swt.events.FocusEvent;
-import org.eclipse.swt.events.KeyAdapter;
-import org.eclipse.swt.events.KeyEvent;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * @author Hong-tao Meng
- */
-public abstract class EditableDialogCellEditor extends DialogCellEditor {
-	private Text text;
-
-	/**
-	 * 
-	 */
-	public EditableDialogCellEditor() {
-		super();
-	}
-
-	/**
-	 * @param parent
-	 */
-	public EditableDialogCellEditor(Composite parent) {
-		super(parent);
-	}
-
-	/**
-	 * @param parent
-	 * @param style
-	 */
-	public EditableDialogCellEditor(Composite parent, int style) {
-		super(parent, style);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.DialogCellEditor#createContents(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Control createContents(Composite cell) {
-		text = new Text(cell, SWT.LEFT);
-		text.setFont(cell.getFont());
-		text.setBackground(cell.getBackground());
-		text.addKeyListener(new KeyAdapter() {
-			// hook key pressed - see PR 14201
-			public void keyPressed(KeyEvent e) {
-				keyReleaseOccured(e);
-				// disposed this cell editor
-				if ((getControl() == null) || getControl().isDisposed()) {
-					return;
-				}
-			}
-		});
-		// when the text control has focus, the cellEditor will deactive even
-		// when you press the button.
-		// Add the follow codes enable switch to the button control.
-		text.addFocusListener(new FocusAdapter() {
-			public void focusLost(FocusEvent e) {
-				boolean newValidState = isCorrect(text.getText());
-				if (newValidState) {
-					markDirty();
-					doSetValue(text.getText());
-				} else {
-					// try to insert the current value into the error message.
-					setErrorMessage(MessageFormat.format(getErrorMessage(),
-							new Object[] { text.getText().toString() }));
-				}
-			}
-		});
-
-		return text;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.CellEditor#doSetFocus()
-	 */
-	protected void doSetFocus() {
-		text.setFocus();
-		text.selectAll();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.DialogCellEditor#updateContents(java.lang.Object)
-	 */
-	protected void updateContents(Object value) {
-		if (text == null) {
-			return;
-		}
-
-		String text_ = "";//$NON-NLS-1$
-		if (value != null) {
-			text_ = value.toString();
-		}
-		this.text.setText(text_);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.CellEditor#keyReleaseOccured(org.eclipse.swt.events.KeyEvent)
-	 */
-	protected void keyReleaseOccured(KeyEvent keyEvent) {
-		if (keyEvent.character == '\r') {
-			boolean newValidState = isCorrect(text.getText());
-			if (newValidState) {
-				markDirty();
-				doSetValue(text.getText());
-			} else {
-				// try to insert the current value into the error message.
-				setErrorMessage(MessageFormat.format(getErrorMessage(),
-						new Object[] { text.getText().toString() }));
-			}
-			fireApplyEditorValue();
-		}
-		super.keyReleaseOccured(keyEvent);
-	}
-
-	/**
-	 * @return the default text
-	 */
-	public Text getDefaultText() {
-		return text;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/EditorSectionDescriptor.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/EditorSectionDescriptor.java
deleted file mode 100644
index 6628690..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/EditorSectionDescriptor.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties;
-
-import java.util.List;
-
-import org.eclipse.jface.viewers.IFilter;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart.PageflowEditPart;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties.section.EditorSection;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.views.properties.tabbed.ISection;
-import org.eclipse.ui.views.properties.tabbed.ISectionDescriptor;
-
-
-
-/**
- * @author jchoi
- */
-public class EditorSectionDescriptor implements ISectionDescriptor {
-	/**
-	 * constructor
-	 */
-	public EditorSectionDescriptor() {
-		super();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.ui.properties.internal.provisional.ISectionDescriptor#getId()
-	 */
-	public String getId() {
-		return ITabbedPropertiesConstants.EDITOR_SECTION;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.ui.properties.internal.provisional.ISectionDescriptor#getInputTypes()
-	 */
-	public List getInputTypes() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.ui.properties.internal.provisional.ISectionDescriptor#getSectionClass()
-	 */
-	public ISection getSectionClass() {
-		return new EditorSection();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.ui.properties.internal.provisional.ISectionDescriptor#getTargetTab()
-	 */
-	public String getTargetTab() {
-		return ITabbedPropertiesConstants.ATTRIBUTE_TAB_ID;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.ui.properties.internal.provisional.ISectionDescriptor#appliesTo(org.eclipse.ui.IWorkbenchPart,
-	 *      org.eclipse.jface.viewers.ISelection)
-	 */
-	public boolean appliesTo(IWorkbenchPart part, ISelection selection) {
-		Object object = null;
-		if (selection instanceof StructuredSelection) {
-			StructuredSelection structuredSelection = (StructuredSelection) selection;
-			object = structuredSelection.getFirstElement();
-			// The editor section in the attribute tab will be shown for only
-			// pageflow element
-			if (object instanceof PageflowEditPart) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.ui.properties.internal.provisional.ISectionDescriptor#getAfterSection()
-	 */
-	public String getAfterSection() {
-		return ITabbedPropertiesConstants.TOP_SECTION;
-	}
-
-	public int getEnablesFor() {
-		return ENABLES_FOR_ANY;
-	}
-
-	public IFilter getFilter() {
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/ExistingPagePathDialogCellEditor.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/ExistingPagePathDialogCellEditor.java
deleted file mode 100644
index 121a2da..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/ExistingPagePathDialogCellEditor.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import org.eclipse.jface.window.Window;
-import org.eclipse.jst.jsf.facesconfig.ui.dialog.ListChoiceDialog;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.PageflowMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-
-/**
- * The cell editor used to locate an existing pageflow page node in current
- * pageflow.
- * 
- * @author hmeng
- * 
- */
-public class ExistingPagePathDialogCellEditor extends EditableDialogCellEditor {
-	Pageflow pageflow;
-
-	/**
-	 * 
-	 */
-	public ExistingPagePathDialogCellEditor() {
-		super();
-	}
-
-	/**
-	 * @param parent
-	 * @param style
-	 */
-	public ExistingPagePathDialogCellEditor(Composite parent, int style) {
-		super(parent, style);
-	}
-
-	/**
-	 * @param parent
-	 * @param pageflow
-	 */
-	public ExistingPagePathDialogCellEditor(Composite parent, Pageflow pageflow) {
-		super(parent);
-		this.pageflow = pageflow;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see DialogCellEditor#openDialogBox(Control)
-	 */
-	protected Object openDialogBox(Control cellEditorWindow) {
-		String jsfSelection = ""; //$NON-NLS-1$
-		if (getDefaultText() != null && getDefaultText().getText().length() > 0) {
-			jsfSelection = getDefaultText().getText();
-		}
-		ListChoiceDialog dialog = new ListChoiceDialog(cellEditorWindow
-				.getShell(), getPagePaths(),
-				PageflowMessages.ExistingPagePathDialogCellEdito_LabelText);
-
-		if (dialog.open() == Window.OK) {
-			jsfSelection = dialog.getResult();
-		}
-		return jsfSelection;
-	}
-
-	/**
-	 * Collect page paths in current pageflow.
-	 * 
-	 * @return
-	 */
-	private String[] getPagePaths() {
-		List result = new ArrayList();
-		List list = pageflow.getNodes();
-		for (int i = 0; i < list.size(); i++) {
-			String path = ((PageflowPage) list.get(i)).getPath();
-			if (path != null && path.trim().length() > 0) {
-				result.add(path);
-			}
-		}
-		String[] r = (String[]) result.toArray(new String[result.size()]);
-		Arrays.sort(r);
-		return r;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/GeneralViewSection.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/GeneralViewSection.java
deleted file mode 100644
index 85884e3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/GeneralViewSection.java
+++ /dev/null
@@ -1,379 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties;
-
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.part.MultiPageEditorPart;
-import org.eclipse.ui.part.PageBook;
-import org.eclipse.ui.views.properties.IPropertySheetPage;
-import org.eclipse.ui.views.properties.PropertySheetPage;
-import org.eclipse.ui.views.properties.tabbed.ISection;
-import org.eclipse.ui.views.properties.tabbed.ITabbedPropertyConstants;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
-import org.eclipse.wst.sse.ui.StructuredTextEditor;
-
-/**
- * This class defines the general tab for pageflow attributes. This class
- * defines the controls shown in this sectin and their event handler. For
- * MultiPageEditorPart, if it support getAdapter(IEditorPart.class) to get the
- * current active editor, then, this section can get the different
- * PropertySheetPage for different sub EditorPart.
- * 
- * @author Xiao-guang Zhang
- */
-public class GeneralViewSection implements ISection, 
-		ISelectionChangedListener {
-	/** the pagebook */
-	private PageBook pageBook = null;
-
-	/**
-	 * A data structure used to store the information about a single page within
-	 * a MultiPageEditorPart
-	 */
-	protected static class PageRec {
-
-		/**
-		 * The part including editorpart, or Control
-		 */
-		public IWorkbenchPart part;
-
-		/**
-		 * The page.
-		 */
-		public IPropertySheetPage page;
-
-		/**
-		 * Creates a new page record initialized to the given part and page.
-		 * 
-		 * @param part
-		 * @param page
-		 */
-		public PageRec(IWorkbenchPart part, IPropertySheetPage page) {
-			this.part = part;
-			this.page = page;
-		}
-
-		/**
-		 * Disposes of this page record by <code>null</code>ing its fields.
-		 */
-		public void dispose() {
-			part = null;
-			page = null;
-		}
-	}
-
-	/**
-	 * Map from parts to part records (key type: <code>IWorkbenchPart</code>;
-	 * value type: <code>PartRec</code>).
-	 */
-	private Map mapPartToRec = new HashMap();
-
-	/**
-	 * The page record for the default page.
-	 */
-	private PageRec defaultPageRec;
-
-	/**
-	 * The page rec which provided the current page or <code>null</code>
-	 */
-	private PageRec activeRec;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.createControls(Composite, TabbedPropertySheetPage)
-	 */
-	public void createControls(Composite parent,
-			TabbedPropertySheetPage tabbedPropertySheetPage) {
-		FillLayout layout = new FillLayout();
-		layout.marginWidth = ITabbedPropertyConstants.HSPACE;
-		layout.marginHeight = ITabbedPropertyConstants.VSPACE;
-
-		// composite.setLayout(layout);
-		parent.setLayout(layout);
-		// pagebook
-		pageBook = new PageBook(parent, SWT.BORDER);
-
-		// create a default property page.
-		createDefaultPage();
-
-		// Show the default page
-		if (defaultPageRec != null) {
-			showPageRec(defaultPageRec);
-		}
-	}
-
-	/**
-	 * Shows page contained in the given page record in this view. The page
-	 * record must be one from this pagebook view.
-	 * <p>
-	 * The <code>PageBookView</code> implementation of this method asks the
-	 * pagebook control to show the given page's control, and records that the
-	 * given page is now current. Subclasses may extend.
-	 * </p>
-	 * 
-	 * @param pageRec
-	 *            the page record containing the page to show
-	 */
-	protected void showPageRec(PageRec pageRec) {
-		// If already showing do nothing
-		if (activeRec == pageRec) {
-			return;
-		}
-		// If the page is the same, just set activeRec to pageRec
-		if (activeRec != null && pageRec != null
-				&& activeRec.page == pageRec.page) {
-			activeRec = pageRec;
-			return;
-		}
-
-		// Show new page.
-		activeRec = pageRec;
-		Control pageControl = activeRec.page.getControl();
-		if (pageControl != null && !pageControl.isDisposed()) {
-			// Verify that the page control is not disposed
-			// If we are closing, it may have already been disposed
-			pageBook.showPage(pageControl);
-		}
-	}
-
-	/**
-	 * Creates a page for a given part. Adds it to the pagebook but does not
-	 * show it.
-	 * 
-	 * @param part
-	 *            The part we are making a page for.
-	 * @return IWorkbenchPart
-	 */
-	private PageRec createPage(IWorkbenchPart part) {
-		PageRec rec = doCreatePage(part);
-		if (rec != null) {
-			mapPartToRec.put(part, rec);
-		}
-		return rec;
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on PageBookView.
-	 */
-	/**
-	 * @param part
-	 * @return PageRec for part
-	 */
-	protected PageRec doCreatePage(IWorkbenchPart part) {
-		// FIXME: Because the PropertySheetPage of StructuredTextEditor has a
-		// bug:
-		// the editor can't be opened twice if the property view is shown.
-		// This bug only exists in WTP 1.0.0 version.
-		if (part instanceof StructuredTextEditor) {
-			return null;
-		}
-		// Try to get an property page.
-		Object obj = part.getAdapter(IPropertySheetPage.class);
-		if (obj instanceof IPropertySheetPage) {
-			IPropertySheetPage page = (IPropertySheetPage) obj;
-
-			page.createControl(getPageBook());
-
-			return new PageRec(part, page);
-		}
-		// There is no content property page
-		return null;
-	}
-
-	private void createDefaultPage() {
-		// Create the default PropertySheetPage rec.
-		IPropertySheetPage defaultPage = new PropertySheetPage();
-		defaultPage.createControl(getPageBook());
-
-		defaultPageRec = new PageRec(null, defaultPage);
-	}
-
-	/**
-	 * Returns the pagebook control for this view.
-	 * 
-	 * @return the pagebook control, or <code>null</code> if not initialized
-	 */
-	protected PageBook getPageBook() {
-		return pageBook;
-	}
-
-	/**
-	 * Returns the page record for the given part.
-	 * 
-	 * @param part
-	 *            the part
-	 * @return the corresponding page record, or <code>null</code> if not
-	 *         found
-	 */
-	protected PageRec getPageRec(Object part) {
-		return (PageRec) mapPartToRec.get(part);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ISection#setInput(IWorkbenchPart, ISelection)
-	 */
-	public void setInput(IWorkbenchPart part, ISelection selection) {
-		if (part instanceof MultiPageEditorPart) {
-			IEditorPart subPage = (IEditorPart) part
-					.getAdapter(IEditorPart.class);
-			if (subPage != null) {
-				// get or Create a PropertySheetPage for the part.
-				PageRec rec = getPageRec(subPage);
-				if (rec == null) {
-					rec = createPage(subPage);
-				}
-
-				// Show the page.
-				if (rec != null) {
-					showPageRec(rec);
-				} else {
-					showPageRec(defaultPageRec);
-				}
-			}
-		}
-		activeRec.page.selectionChanged(part, selection);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ISection#aboutToBeShown()
-	 */
-	public void aboutToBeShown() {
-		refresh();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ISection#aboutToBeHidden()
-	 */
-	public void aboutToBeHidden() {
-	    // do nothing
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ISection#dispose()
-	 */
-	public void dispose() {
-		// Deref all of the pages.
-		activeRec = null;
-		if (defaultPageRec != null) {
-			// check for null since the default page may not have
-			// been created (ex. perspective never visible)
-			defaultPageRec.page.dispose();
-			defaultPageRec = null;
-		}
-		Map clone = (Map) ((HashMap) mapPartToRec).clone();
-		Iterator iter = clone.values().iterator();
-		while (iter.hasNext()) {
-			PageRec rec = (PageRec) iter.next();
-			removePage(rec);
-		}
-	}
-
-	/**
-	 * Removes a page record. If it is the last reference to the page dispose of
-	 * it - otherwise just decrement the reference count.
-	 * 
-	 * @param rec
-	 */
-	private void removePage(PageRec rec) {
-		mapPartToRec.remove(rec.part);
-
-		Control control = rec.page.getControl();
-		if (control != null && !control.isDisposed()) {
-			// Dispose the page's control so pages don't have to do this in
-			// their
-			// dispose method.
-			// The page's control is a child of this view's control so if this
-			// view
-			// is closed, the page's control will already be disposed.
-			control.dispose();
-		}
-
-		// free the page
-		doDestroyPage(rec.part, rec);
-	}
-
-	/**
-	 * Destroys a page in the pagebook for a particular part.
-	 * 
-	 * @param part
-	 *            the input part
-	 * @param rec
-	 *            a page record for the part
-	 */
-	protected void doDestroyPage(IWorkbenchPart part, PageRec rec) {
-		IPropertySheetPage page = rec.page;
-		page.dispose();
-		rec.dispose();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ISection#getMinimumHeight()
-	 */
-	public int getMinimumHeight() {
-		return SWT.DEFAULT;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.xtools.common.ui.properties.ISection#shouldUseExtraSpace()
-	 */
-	public boolean shouldUseExtraSpace() {
-		/**
-		 * here should return true, otherwise, the component controls will not
-		 * fill the whole panel of the tab.
-		 */
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.xtools.common.ui.properties.ISection#refresh()
-	 */
-	public void refresh() {
-		return;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
-	 */
-	public void selectionChanged(SelectionChangedEvent event) {
-		setInput((IWorkbenchPart) event.getSource(), event.getSelection());
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/GeneralViewSectionDescriptor.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/GeneralViewSectionDescriptor.java
deleted file mode 100644
index 4a75028..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/GeneralViewSectionDescriptor.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties;
-
-import java.util.List;
-
-import org.eclipse.jface.text.ITextSelection;
-import org.eclipse.jface.viewers.IFilter;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart.PageflowElementEditPart;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart.PageflowElementTreeEditPart;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart.PageflowLinkEditPart;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.util.PageflowValidation;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.views.properties.tabbed.ISection;
-import org.eclipse.ui.views.properties.tabbed.ISectionDescriptor;
-
-/**
- * This class defines the section descriptor for pageflow attributes. Following
- * is the typical function of SectionDescriptor for tabbed property views. 1. In
- * tabbed property view, there are multiple sections, one or more than one
- * sections can be composed of one tab. 2. Each of section has an ID, and their
- * relationship is defined by the function "getAfterSection". 3. Not all
- * sections are enabled always. They are enabled according to current
- * WorkbenchPart and selection, which is defined in function "appliesTo".
- * 
- * @author Xiao-guang Zhang
- */
-public class GeneralViewSectionDescriptor implements ISectionDescriptor {
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ISectionDescriptor#getId()
-	 */
-	public String getId() {
-		return ITabbedPropertiesConstants.GENERAL_TAB_ID;
-	}
-
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ISectionDescriptor#getInputTypes()
-	 */
-	public List getInputTypes() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ISectionDescriptor#getSectionClass()
-	 */
-	public ISection getSectionClass() {
-		return new GeneralViewSection();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.xtools.common.ui.properties.ISectionDescriptor#getTargetTab()
-	 */
-	public String getTargetTab() {
-		return ITabbedPropertiesConstants.GENERAL_TAB_ID;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ISectionDescriptor#appliesTo(IWorkbenchPart, ISelection)
-	 */
-	public boolean appliesTo(IWorkbenchPart part, ISelection selection) {
-		Object object = null;
-		// FIXME: Should move the appliesTo to differnt page of
-		// MultiPageEditorPart.
-		if (selection instanceof StructuredSelection) {
-			StructuredSelection structuredSelection = (StructuredSelection) selection;
-			object = structuredSelection.getFirstElement();
-			// The general tab will be shown for only pageflow element and
-			// pageflow link editparts
-			if (object instanceof PageflowElementEditPart
-					|| object instanceof PageflowElementTreeEditPart) {
-				return true;
-			} else if (object instanceof PageflowLinkEditPart) {
-				PageflowLink pfLink = (PageflowLink) ((PageflowLinkEditPart) object)
-						.getModel();
-				if (PageflowValidation.getInstance().isValidLinkForProperty(
-						pfLink)) {
-					return true;
-				}
-			} else {
-				return true;
-			}
-		} else if (selection instanceof ITextSelection) {
-			return true;
-		}
-
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ISectionDescriptor#getAfterSection()
-	 */
-	public String getAfterSection() {
-		return ""; //$NON-NLS-1$
-	}
-
-	public int getEnablesFor() {
-		return ENABLES_FOR_ANY;
-	}
-
-
-	public IFilter getFilter() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/ITabbedPropertiesConstants.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/ITabbedPropertiesConstants.java
deleted file mode 100644
index 54e6e75..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/ITabbedPropertiesConstants.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties;
-
-/**
- * @author jchoi
- * @version
- */
-public interface ITabbedPropertiesConstants {
-	/**
-	 * used to set grid data height hints on dialog fields
-	 */
-	public static int BROWSE_HEIGHT = 18;
-
-	/**
-	 * used to set grid data width hints on dialog fields
-	 */
-	public static int BROWSE_WIDTH = 20;
-
-	/**
-	 * the general tag id
-	 */
-	public static final String GENERAL_TAB_ID = "org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties.general"; //$NON-NLS-1$
-
-	/**
-	 * the attribute tag id
-	 */
-	public static final String ATTRIBUTE_TAB_ID = "org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties.attribute"; //$NON-NLS-1$
-
-	/**
-	 * the link section id
-	 */
-	public static final String LINK_SECTION = "attribute.link"; // 4 //$NON-NLS-1$
-
-	/**
-	 * the page section id
-	 */
-	public static final String PAGE_SECTION = "attribute.page"; // 3 //$NON-NLS-1$
-
-	/**
-	 * the editor section id
-	 */
-	public static final String EDITOR_SECTION = "attribute.editor"; // 1 //$NON-NLS-1$
-
-	/**
-	 * the top section id
-	 */
-	public static final String TOP_SECTION = "top"; // 0 //$NON-NLS-1$
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/LinkSectionDescriptor.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/LinkSectionDescriptor.java
deleted file mode 100644
index d0cc430..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/LinkSectionDescriptor.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties;
-
-import java.util.List;
-
-import org.eclipse.jface.viewers.IFilter;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart.PageflowLinkEditPart;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties.section.LinkSection;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.util.PageflowValidation;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.views.properties.tabbed.ISection;
-import org.eclipse.ui.views.properties.tabbed.ISectionDescriptor;
-
-/**
- * @author jchoi
- * @version
- */
-public class LinkSectionDescriptor implements ISectionDescriptor {
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.ui.properties.internal.provisional.ISectionDescriptor#getId()
-	 */
-	public String getId() {
-		return ITabbedPropertiesConstants.LINK_SECTION;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.ui.properties.internal.provisional.ISectionDescriptor#getInputTypes()
-	 */
-	public List getInputTypes() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.ui.properties.internal.provisional.ISectionDescriptor#getSectionClass()
-	 */
-	public ISection getSectionClass() {
-		return new LinkSection();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.ui.properties.internal.provisional.ISectionDescriptor#getTargetTab()
-	 */
-	public String getTargetTab() {
-		return ITabbedPropertiesConstants.ATTRIBUTE_TAB_ID;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.ui.properties.internal.provisional.ISectionDescriptor#appliesTo(org.eclipse.ui.IWorkbenchPart,
-	 *      org.eclipse.jface.viewers.ISelection)
-	 */
-	public boolean appliesTo(IWorkbenchPart part, ISelection selection) {
-		Object object = null;
-		if (selection instanceof StructuredSelection) {
-			StructuredSelection structuredSelection = (StructuredSelection) selection;
-			object = structuredSelection.getFirstElement();
-			if (object instanceof PageflowLinkEditPart) {
-				PageflowLink pfLink = (PageflowLink) ((PageflowLinkEditPart) object).getModel();
-				if (PageflowValidation.getInstance().isValidLinkForProperty(
-						pfLink)) {
-
-					return true;
-				}
-
-			}
-		}
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.ui.properties.internal.provisional.ISectionDescriptor#getAfterSection()
-	 */
-	public String getAfterSection() {
-		return ITabbedPropertiesConstants.TOP_SECTION;
-	}
-
-	public int getEnablesFor() {
-		return ENABLES_FOR_ANY;
-	}
-
-	public IFilter getFilter() {
-		return null;
-	}
-
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/PagePathDialogCellEditor.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/PagePathDialogCellEditor.java
deleted file mode 100644
index fbe5502..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/PagePathDialogCellEditor.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jface.window.Window;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage;
-import org.eclipse.jst.jsf.facesconfig.ui.util.WebrootUtil;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-
-/**
- * Dialog Cell Editor for Page path browser.
- * 
- * @author Xiao-guang Zhang
- */
-public class PagePathDialogCellEditor extends EditableDialogCellEditor {
-	PageflowPage element;
-
-	/**
-	 * Default constructor
-	 */
-	public PagePathDialogCellEditor() {
-		super();
-	}
-
-	/**
-	 * @param parent
-	 * @param element
-	 */
-	public PagePathDialogCellEditor(Composite parent, PageflowPage element) {
-		super(parent);
-		this.element = element;
-	}
-
-
-	/**
-	 * @param parent
-	 * @param style
-	 */
-	public PagePathDialogCellEditor(Composite parent, int style) {
-		super(parent, style);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see DialogCellEditor#openDialogBox(Control)
-	 */
-	protected Object openDialogBox(Control cellEditorWindow) {
-		String jsfSelection = ""; //$NON-NLS-1$
-		if (getDefaultText() != null && getDefaultText().getText().length() > 0) {
-			jsfSelection = getDefaultText().getText();
-			IProject project = WebrootUtil.getProject(element);
-			ProjectWebPageSelectionDialog dlg = new ProjectWebPageSelectionDialog(
-					cellEditorWindow.getShell(), project);
-			if (dlg.open() == Window.OK) {
-				jsfSelection = dlg.getResultFilePath();
-			}
-		}
-		return jsfSelection;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/PageSectionDescriptor.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/PageSectionDescriptor.java
deleted file mode 100644
index 4e7fc80..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/PageSectionDescriptor.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties;
-
-import java.util.List;
-
-import org.eclipse.jface.viewers.IFilter;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart.PageflowNodeEditPart;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowPageImpl;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties.section.PageSection;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.views.properties.tabbed.ISection;
-import org.eclipse.ui.views.properties.tabbed.ISectionDescriptor;
-
-/**
- * @author jchoi
- * @version
- */
-public class PageSectionDescriptor implements ISectionDescriptor {
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.ui.properties.internal.provisional.ISectionDescriptor#getId()
-	 */
-	public String getId() {
-		return ITabbedPropertiesConstants.PAGE_SECTION;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.ui.properties.internal.provisional.ISectionDescriptor#getInputTypes()
-	 */
-	public List getInputTypes() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.ui.properties.internal.provisional.ISectionDescriptor#getSectionClass()
-	 */
-	public ISection getSectionClass() {
-		return new PageSection();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.ui.properties.internal.provisional.ISectionDescriptor#getTargetTab()
-	 */
-	public String getTargetTab() {
-		return ITabbedPropertiesConstants.ATTRIBUTE_TAB_ID;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.ui.properties.internal.provisional.ISectionDescriptor#appliesTo(org.eclipse.ui.IWorkbenchPart,
-	 *      org.eclipse.jface.viewers.ISelection)
-	 */
-	public boolean appliesTo(IWorkbenchPart part, ISelection selection) {
-		Object object = null;
-		if (selection instanceof StructuredSelection) {
-			StructuredSelection structuredSelection = (StructuredSelection) selection;
-			object = structuredSelection.getFirstElement();
-			if (object instanceof PageflowNodeEditPart) {
-				Object model = ((PageflowNodeEditPart) object).getModel();
-				if (model instanceof PageflowPageImpl) {
-					return true;
-				}
-			}
-		}
-		return false;
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.ui.properties.internal.provisional.ISectionDescriptor#getAfterSection()
-	 */
-	public String getAfterSection() {
-		return ITabbedPropertiesConstants.TOP_SECTION;
-	}
-
-	public int getEnablesFor() {
-		return ENABLES_FOR_ANY;
-	}
-
-
-	public IFilter getFilter() {
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/PageflowElementPropertySource.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/PageflowElementPropertySource.java
deleted file mode 100644
index 8eebce5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/PageflowElementPropertySource.java
+++ /dev/null
@@ -1,478 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties;
-
-import java.util.Iterator;
-import java.util.List;
-import java.util.Vector;
-
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EDataType;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jface.viewers.ICellEditorValidator;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.PageflowMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.util.PageflowValidation;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.views.properties.ComboBoxPropertyDescriptor;
-import org.eclipse.ui.views.properties.IPropertyDescriptor;
-import org.eclipse.ui.views.properties.IPropertySource;
-import org.eclipse.ui.views.properties.PropertyDescriptor;
-import org.eclipse.ui.views.properties.TextPropertyDescriptor;
-
-/**
- * This class is intended to be a generic property source for all the objects in
- * the application's model. It currently only supports String and boolean types,
- * and doesn't support reset or nested properties. It uses information in the
- * EMF EAttribute and EDataType classes to get the id, display name, and type
- * information.
- * 
- * @author Xiao-guang Zhang
- */
-public class PageflowElementPropertySource implements IPropertySource {
-	/** attribute name of "path" and "action", which have special property editor */
-	private static final String PAGEFLOW_PATH = "path"; //$NON-NLS-1$    
-
-	static final String PAGEFLOW_NAME = "name"; //$NON-NLS-1$
-
-	static final String PAGEFLOW_COMMENT = "comment"; //$NON-NLS-1$
-
-	private static final String PAGEFLOW_CONFIG_FILE = "configfile"; //$NON-NLS-1$
-
-	/** pageflow elememt */
-	PageflowElement element;
-
-	/** boolean value's label */
-	private static final String P_VALUE_TRUE_LABEL = PageflowMessages.Pageflow_Label_True;
-
-	private static final String P_VALUE_FALSE_LABEL = PageflowMessages.Pageflow_Label_False;
-
-	/** Integer value for boolean type */
-	private static final int P_VALUE_TRUE = 0;
-
-	private static final int P_VALUE_FALSE = 1;
-
-	static class BooleanLabelProvider extends LabelProvider {
-		public String getText(Object element) {
-			String[] values = new String[] { P_VALUE_TRUE_LABEL,
-					P_VALUE_FALSE_LABEL };
-			return values[((Integer) element).intValue()];
-		}
-
-		public Image getImage(Object element) {
-			return EditorPlugin.getDefault().getImage(
-					"facesconfig/Pageflow_BooleanValue.gif"); //$NON-NLS-1$
-		}
-	}
-
-	static class PageflowLabelProvider extends LabelProvider {
-
-		public Image getImage(Object element) {
-			if (element instanceof String) {
-				return EditorPlugin.getDefault().getImage(
-						"facesconfig/Pageflow_TextValue.gif");//$NON-NLS-1$
-			} else if (element instanceof Integer) {
-				return EditorPlugin.getDefault().getImage(
-						"facesconfig/Pageflow_IntegralValue.gif");//$NON-NLS-1$
-			} else {
-				return EditorPlugin.getDefault().getImage(
-						"facesconfig/Pageflow_GenericValue.gif");//$NON-NLS-1$
-			}
-		}
-	}
-
-	/**
-	 * constructor
-	 * 
-	 * @param element -
-	 *            pageflow element model.
-	 */
-	public PageflowElementPropertySource(PageflowElement element) {
-		this.element = element;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see IPropertySource#getEditableValue()
-	 */
-	public Object getEditableValue() {
-		return element;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see IPropertySource#getPropertyDescriptors()
-	 */
-	public IPropertyDescriptor[] getPropertyDescriptors() {
-		// property descriptors
-		List propertyDescriptors = new Vector();
-
-		// if (element instanceof PageflowLink) {
-		// return getLinkPropertyDescriptors();
-		// }
-
-		Iterator it;
-		EClass cls = element.eClass();
-
-		it = cls.getEAllAttributes().iterator();
-		while (it.hasNext()) {
-			EAttribute attr = (EAttribute) it.next();
-			if (attr.isID()
-					|| attr.getFeatureID() == PageflowPackage.PAGEFLOW__REFERENCE_LINK) {
-				continue;
-			}
-			EDataType type = attr.getEAttributeType();
-			if (type.getInstanceClass() == String.class) {
-				PropertyDescriptor propertyDescriptor;
-				if (attr.getName().equalsIgnoreCase(PAGEFLOW_PATH)) {
-					propertyDescriptor = getPagePathPropertyDescriptor(attr);
-				} else if (attr.getName()
-						.equalsIgnoreCase(PAGEFLOW_CONFIG_FILE)) {
-					propertyDescriptor = null;
-				} else {
-					propertyDescriptor = new TextPropertyDescriptor(Integer
-							.toString(attr.getFeatureID()), getString(attr
-							.getName()));
-				}
-				if (propertyDescriptor != null) {
-					propertyDescriptor
-							.setLabelProvider(new PageflowLabelProvider());
-					propertyDescriptors.add(propertyDescriptor);
-				}
-
-			} else if (type.getInstanceClass() == boolean.class) {
-				PropertyDescriptor propertyDescriptor;
-				propertyDescriptor = getBooleanTypePropertyDescriptor(attr);
-				propertyDescriptor.setLabelProvider(new BooleanLabelProvider());
-				propertyDescriptors.add(propertyDescriptor);
-			}
-		}
-
-		return (IPropertyDescriptor[]) propertyDescriptors
-				.toArray(new IPropertyDescriptor[] {});
-	}
-
-	/**
-	 * @return
-	 */
-    // TODO: method not used; dead?
-//	private IPropertyDescriptor[] getLinkPropertyDescriptors() {
-//		// property descriptors
-//		List propertyDescriptors = new Vector();
-//
-//		Iterator it;
-//		EClass cls = element.eClass();
-//
-//		it = cls.getEAllAttributes().iterator();
-//		while (it.hasNext()) {
-//			EAttribute attr = (EAttribute) it.next();
-//			if (attr.isID()
-//					|| attr.getName().equalsIgnoreCase(PAGEFLOW_NAME)
-//					|| attr.getName().equalsIgnoreCase(PAGEFLOW_COMMENT)
-//					|| attr.getFeatureID() == PageflowPackage.PAGEFLOW__REFERENCE_LINK) {
-//				continue;
-//			}
-//
-//			EDataType type = attr.getEAttributeType();
-//			if (type.getInstanceClass() == String.class) {
-//				PropertyDescriptor propertyDescriptor;
-//
-//				propertyDescriptor = new TextPropertyDescriptor(Integer
-//						.toString(attr.getFeatureID()), getString(attr
-//						.getName()));
-//
-//				if (propertyDescriptor != null) {
-//					propertyDescriptor
-//							.setLabelProvider(new PageflowLabelProvider());
-//					propertyDescriptors.add(propertyDescriptor);
-//				}
-//
-//			} else if (type.getInstanceClass() == boolean.class) {
-//				PropertyDescriptor propertyDescriptor;
-//				propertyDescriptor = getBooleanTypePropertyDescriptor(attr);
-//				propertyDescriptor.setLabelProvider(new BooleanLabelProvider());
-//				propertyDescriptors.add(propertyDescriptor);
-//			}
-//		}
-//
-//		return (IPropertyDescriptor[]) propertyDescriptors
-//				.toArray(new IPropertyDescriptor[] {});
-//	}
-
-	/**
-	 * get the property descriptor for the attribute "path" of page component
-	 * 
-	 * @param attr -
-	 *            EAttribute
-	 * @return
-	 */
-	private PropertyDescriptor getPagePathPropertyDescriptor(EAttribute attr) {
-		PropertyDescriptor propertyDescriptor = new PropertyDescriptor(Integer
-				.toString(attr.getFeatureID()), getString(attr.getName())) {
-			public CellEditor createPropertyEditor(Composite parent) {
-				CellEditor editor = new PagePathDialogCellEditor(parent,
-						(PageflowPage) element);
-				if (getValidator() != null) {
-					editor.setValidator(getValidator());
-				}
-				return editor;
-			}
-
-			/**
-			 * Returns the input validator for editing the property.
-			 * 
-			 * @return the validator used to verify correct values for this
-			 *         property, or <code>null</code>
-			 */
-			protected ICellEditorValidator getValidator() {
-				return new ICellEditorValidator() {
-					public String isValid(Object value) {
-						if (((PageflowPage) element).getPath() != null
-								&& value != null
-								&& !((PageflowPage) element).getPath()
-										.equalsIgnoreCase((String) value)) {
-							if (PageflowValidation.getInstance().isExistedPage(
-									((PageflowPage) element).getPageflow(),
-									(String) value)) {
-								// Pageflow.PageflowEditor.Alert.DNDResourceTitle
-								// = Pageflow Creation Error
-								// Pageflow.PageflowEditor.Alert.ExistingPage =
-								// The web page {0} is already existed in
-								// current PageFlow.
-								EditorPlugin
-										.getAlerts()
-										.error(
-												"Pageflow.PageflowEditor.Alert.DNDResourceTitle", //$NON-NLS-1$
-												"Pageflow.PageflowEditor.Alert.ExistingPage", //$NON-NLS-1$
-												value);
-
-								return EditorPlugin
-										.getResourceString("Pageflow.PageflowEditor.Alert.ExistingPage"); //$NON-NLS-1$
-							}
-						}
-						return null;
-					}
-
-				};
-			}
-
-		};
-		return propertyDescriptor;
-	}
-
-	/**
-	 * get the property descriptor for the attribute "action" of Action
-	 * component
-	 * 
-	 * @param attr -
-	 *            EAttribute
-	 * @return
-	 */
-    // TODO: method not used; dead?
-//	private PropertyDescriptor getActionPropertyDescriptor(EAttribute attr) {
-//		PropertyDescriptor propertyDescriptor = new PropertyDescriptor(Integer
-//				.toString(attr.getFeatureID()), getString(attr.getName())) {
-//			public CellEditor createPropertyEditor(Composite parent) {
-//				CellEditor editor = new ActionDialogCellEditor(parent);
-//				if (getValidator() != null) {
-//					editor.setValidator(getValidator());
-//				}
-//				return editor;
-//			}
-//
-//			/**
-//			 * Returns the input validator for editing the property.
-//			 * 
-//			 * @return the validator used to verify correct values for this
-//			 *         property, or <code>null</code>
-//			 */
-//			protected ICellEditorValidator getValidator() {
-//				return new ICellEditorValidator() {
-//					public String isValid(Object value) {
-//
-//						return null;
-//					}
-//
-//				};
-//			}
-//		};
-//		return propertyDescriptor;
-//	}
-
-	/**
-	 * get the property descriptor for the attribute "outcome" of Link component
-	 * 
-	 * @param attr -
-	 *            EAttribute
-	 * @return
-	 */
-    // TODO: method not used; dead?
-//	private PropertyDescriptor getActionOutcomePropertyDescriptor(
-//			EAttribute attr) {
-//		PropertyDescriptor propertyDescriptor = new PropertyDescriptor(Integer
-//				.toString(attr.getFeatureID()), getString(attr.getName())) {
-//			public CellEditor createPropertyEditor(Composite parent) {
-//				CellEditor editor = new ActionOutcomeDialogCellEditor(parent,
-//						element);
-//				if (getValidator() != null) {
-//					editor.setValidator(getValidator());
-//				}
-//				return editor;
-//			}
-//		};
-//		return propertyDescriptor;
-//	}
-
-	/**
-	 * get property descriptor for the attribute with the boolean type
-	 * 
-	 * @param attr -
-	 *            EAttribute
-	 * @return
-	 */
-	PropertyDescriptor getBooleanTypePropertyDescriptor(EAttribute attr) {
-		PropertyDescriptor propertyDescriptor;
-		propertyDescriptor = new ComboBoxPropertyDescriptor(Integer
-				.toString(attr.getFeatureID()), getString(attr.getName()),
-				new String[] { P_VALUE_TRUE_LABEL, P_VALUE_FALSE_LABEL });
-		return propertyDescriptor;
-	}
-
-	/**
-	 * Get a translated string from the resource locator.
-	 * @param key 
-	 * @return the string for the key
-	 */
-	protected final String getString(String key) {
-		if ("comment".equals(key)) { //$NON-NLS-1$
-			return PageflowMessages.Pageflow_Model_Attributes_comment;
-		}
-
-		if ("name".equals(key)) { //$NON-NLS-1$
-			return PageflowMessages.Pageflow_Model_Attributes_name;
-		}
-
-		if ("largeicon".equals(key)) { //$NON-NLS-1$
-			return PageflowMessages.Pageflow_Model_Attributes_largeicon;
-		}
-
-		if ("smallicon".equals(key)) { //$NON-NLS-1$
-			return PageflowMessages.Pageflow_Model_Attributes_smallicon;
-		}
-		
-		if ("source".equals(key)) { //$NON-NLS-1$
-			return PageflowMessages.Pageflow_Model_Attributes_source;
-		}
-		
-		if ("target".equals(key)) { //$NON-NLS-1$
-			return PageflowMessages.Pageflow_Model_Attributes_target;
-		}
-
-		if ("fromaction".equals(key)) { //$NON-NLS-1$
-			return PageflowMessages.Pageflow_Model_Attributes_fromaction;
-		}
-
-		if ("path".equals(key)) { //$NON-NLS-1$
-			return PageflowMessages.Pageflow_Model_Attributes_path;
-		}
-		if ("begin".equals(key)) { //$NON-NLS-1$
-			return PageflowMessages.Pageflow_Model_Attributes_begin;
-		}
-		if ("end".equals(key)) { //$NON-NLS-1$
-			return PageflowMessages.Pageflow_Model_Attributes_end;
-		}
-		if ("configfile".equals(key)) { //$NON-NLS-1$
-			return PageflowMessages.Pageflow_Model_Attributes_configfile;
-		}
-		if ("outcome".equals(key)) { //$NON-NLS-1$
-			return PageflowMessages.Pageflow_Model_Attributes_outcome;
-		}
-		if ("redirect".equals(key)) { //$NON-NLS-1$
-			return PageflowMessages.Pageflow_Model_Attributes_redirect;
-		}
-
-		return ""; //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see IPropertySource#getPropertyValue(Object)
-	 */
-	public Object getPropertyValue(Object id) {
-		EStructuralFeature feature = element.eClass().getEStructuralFeature(
-				Integer.parseInt((String) id));
-
-		Object result = element.eGet(feature);
-
-		if (result instanceof Boolean) {
-			if (result == Boolean.TRUE) {
-				result = new Integer(P_VALUE_TRUE);
-			} else {
-				result = new Integer(P_VALUE_FALSE);
-			}
-		}
-
-		return result != null ? result : ""; //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see IPropertySource#isPropertySet(Object)
-	 */
-	public boolean isPropertySet(Object id) {
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see IPropertySouce#resetPropertyValue(Object)
-	 */
-	public void resetPropertyValue(Object id) {
-        // do nothing
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see IPropertySource#setPropertyValue(Object, Object)
-	 */
-	public void setPropertyValue(Object id, Object value) {
-		EStructuralFeature feature = element.eClass().getEStructuralFeature(
-				Integer.parseInt((String) id));
-
-		Object result = element.eGet(feature);
-		// if the attribute is boolean type, the value should be changed from
-		// string "true" or "false"
-		// to Boolean.TRUE or Boolean.FALSE
-		if (result instanceof Boolean) {
-			if (value.equals(new Integer(P_VALUE_TRUE))) {
-				value = Boolean.TRUE;
-			} else {
-				value = Boolean.FALSE;
-			}
-		}
-		element.eSet(feature, value);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/PageflowLinkPropertySource.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/PageflowLinkPropertySource.java
deleted file mode 100644
index e3c1f30..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/PageflowLinkPropertySource.java
+++ /dev/null
@@ -1,189 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties;
-
-import java.util.Iterator;
-import java.util.List;
-import java.util.Vector;
-
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EDataType;
-import org.eclipse.emf.ecore.EReference;
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jface.viewers.ICellEditorValidator;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.PageflowMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.util.PageflowValidation;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.views.properties.IPropertyDescriptor;
-import org.eclipse.ui.views.properties.PropertyDescriptor;
-import org.eclipse.ui.views.properties.TextPropertyDescriptor;
-
-/**
- * The property source for Pageflow Link.
- * 
- * @author hmeng
- */
-
-public class PageflowLinkPropertySource extends PageflowElementPropertySource {
-
-	/**
-	 * @param element
-	 */
-	public PageflowLinkPropertySource(PageflowElement element) {
-		super(element);
-	}
-
-	public Object getPropertyValue(Object id) {
-		Object result = super.getPropertyValue(id);
-		if (Integer.parseInt((String) id) == PageflowPackage.PF_LINK__SOURCE
-				|| Integer.parseInt((String) id) == PageflowPackage.PF_LINK__TARGET) {
-			result = ((PageflowPage) result).getPath();
-		}
-		return result;
-	}
-
-	public void setPropertyValue(Object id, Object value) {
-		if (Integer.parseInt((String) id) == PageflowPackage.PF_LINK__SOURCE) {
-			((PageflowLink) element).setSourcePath((String) value);
-
-		} else if (Integer.parseInt((String) id) == PageflowPackage.PF_LINK__TARGET) {
-			((PageflowLink) element).setTargetPath((String) value);
-		} else {
-			super.setPropertyValue(id, value);
-		}
-	}
-
-	public IPropertyDescriptor[] getPropertyDescriptors() {
-		// property descriptors
-		List propertyDescriptors = new Vector();
-
-		Iterator it;
-		EClass cls = element.eClass();
-
-		it = cls.getEAllAttributes().iterator();
-		while (it.hasNext()) {
-			EAttribute attr = (EAttribute) it.next();
-			if (attr.isID()
-					|| attr.getName().equalsIgnoreCase(PAGEFLOW_NAME)
-					|| attr.getName().equalsIgnoreCase(PAGEFLOW_COMMENT)
-					|| attr.getFeatureID() == PageflowPackage.PAGEFLOW__REFERENCE_LINK) {
-				continue;
-			}
-
-			EDataType type = attr.getEAttributeType();
-			if (type.getInstanceClass() == String.class) {
-				PropertyDescriptor propertyDescriptor;
-
-				propertyDescriptor = new TextPropertyDescriptor(Integer
-						.toString(attr.getFeatureID()),
-						getString(attr.getName()));
-
-				if (propertyDescriptor != null) {
-					propertyDescriptor
-							.setLabelProvider(new PageflowLabelProvider());
-					propertyDescriptors.add(propertyDescriptor);
-				}
-
-			} else if (type.getInstanceClass() == boolean.class) {
-				PropertyDescriptor propertyDescriptor;
-				propertyDescriptor = getBooleanTypePropertyDescriptor(attr);
-				propertyDescriptor.setLabelProvider(new BooleanLabelProvider());
-				propertyDescriptors.add(propertyDescriptor);
-			}
-		}
-		it = cls.getEReferences().iterator();
-		while (it.hasNext()) {
-			EReference attr = (EReference) it.next();
-			if (attr.getFeatureID() == PageflowPackage.PF_LINK__SOURCE
-					|| attr.getFeatureID() == PageflowPackage.PF_LINK__TARGET) {
-
-				PropertyDescriptor propertyDescriptor;
-
-				propertyDescriptor = getExistingPagePathPropertyDescriptor(attr);
-
-				if (propertyDescriptor != null) {
-					propertyDescriptor
-							.setLabelProvider(new PageflowLabelProvider());
-					propertyDescriptors.add(propertyDescriptor);
-				}
-			}
-		}
-
-		return (IPropertyDescriptor[]) propertyDescriptors
-				.toArray(new IPropertyDescriptor[] {});
-	}
-
-	/**
-	 * The link's ends can be modified to another page existing in current pageflow.
-	 * @param attr
-	 * @return
-	 */
-	private PropertyDescriptor getExistingPagePathPropertyDescriptor(
-			EReference attr) {
-		PropertyDescriptor propertyDescriptor = new PropertyDescriptor(Integer
-				.toString(attr.getFeatureID()), getString(attr.getName())) {
-			public CellEditor createPropertyEditor(Composite parent) {
-				CellEditor editor = new ExistingPagePathDialogCellEditor(
-						parent, (Pageflow) element.eContainer());
-				if (getValidator() != null) {
-					editor.setValidator(getValidator());
-				}
-				return editor;
-			}
-
-			/**
-			 * Returns the input validator for editing the property.
-			 * 
-			 * @return the validator used to verify correct values for this
-			 *         property, or <code>null</code>
-			 */
-			protected ICellEditorValidator getValidator() {
-				return new ICellEditorValidator() {
-					public String isValid(Object value) {
-						if (value != null) {
-							if (!PageflowValidation.getInstance()
-									.isExistedPage(
-											((Pageflow) element.eContainer()),
-											(String) value)) {
-								// Pageflow.PageflowEditor.Alert.DNDResourceTitle
-								// = Pageflow Creation Error
-								// Pageflow.PageflowEditor.Alert.ExistingPage =
-								// The web page {0} is already existed in
-								// current PageFlow.
-								EditorPlugin.getAlerts().info(PageflowMessages.PageflowLinkPropertySource_Title,
-										PageflowMessages.PageflowLinkPropertySource_Text);
-								// "Pageflow.PageflowEditor.Alert.DNDResourceTitle",
-								// "Pageflow.PageflowEditor.Alert.ExistingPage",
-								// (String) value);
-
-								return EditorPlugin
-										.getResourceString("Pageflow.PageflowEditor.Alert.ExistingPage"); //$NON-NLS-1$
-							}
-						}
-						return null;
-					}
-
-				};
-			}
-
-		};
-		return propertyDescriptor;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/PageflowSectionDescriptorProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/PageflowSectionDescriptorProvider.java
deleted file mode 100644
index e36d282..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/PageflowSectionDescriptorProvider.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties;
-
-import org.eclipse.ui.views.properties.tabbed.ISectionDescriptor;
-import org.eclipse.ui.views.properties.tabbed.ISectionDescriptorProvider;
-
-/**
- * this class defines all section descriptors for pageflow. Similar with
- * PropertyDescriptors, this class defines all sections used by pageflow through
- * SectionDescriptor.
- * 
- */
-public class PageflowSectionDescriptorProvider implements
-		ISectionDescriptorProvider {
-	/**
-	 * Default constructor
-	 */
-	public PageflowSectionDescriptorProvider() {
-		super();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ISectionDescriptorProvider#getSectionDescriptors()
-	 */
-	public ISectionDescriptor[] getSectionDescriptors() {
-		ISectionDescriptor[] descriptors = new ISectionDescriptor[] {
-				new LinkSectionDescriptor(), new PageSectionDescriptor(),
-				new EditorSectionDescriptor(),
-				new GeneralViewSectionDescriptor() };
-		return descriptors;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/PageflowSectionLabelProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/PageflowSectionLabelProvider.java
deleted file mode 100644
index 1c72dae..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/PageflowSectionLabelProvider.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties;
-
-import org.eclipse.gef.editparts.AbstractEditPart;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.PageflowMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart.PageflowElementEditPart;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart.PageflowElementTreeEditPart;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart.PageflowLinkEditPart;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * This class defines label provider for the property view's title. Tabbed
- * property view has a common area as a Title. Different decription and image
- * can be shown according to Different selection.
- * 
- */
-public class PageflowSectionLabelProvider extends LabelProvider {
-
-	private static final String PAGEFLOW_IMAGE_FILE = "facesconfig/FacesConfig_Pageflow16.gif"; //$NON-NLS-1$
-
-	/**
-	 * Default constructor
-	 */
-	public PageflowSectionLabelProvider() {
-		super();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see getImage(java.lang.Object)
-	 */
-	public Image getImage(Object object) {
-		Image result = EditorPlugin.getDefault().getImage(
-				PAGEFLOW_IMAGE_FILE);
-
-		return result;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see getText(java.lang.Object)
-	 */
-	public String getText(Object object) {
-		String result = null;
-		if (object instanceof StructuredSelection) {
-			StructuredSelection structuredSelection = (StructuredSelection) object;
-			Object pageflow = structuredSelection.getFirstElement();
-			if (pageflow instanceof PageflowElementEditPart
-					|| pageflow instanceof PageflowLinkEditPart
-					|| pageflow instanceof PageflowElementTreeEditPart) {
-
-				if (((PageflowElement) ((AbstractEditPart) pageflow).getModel())
-						.eClass() == PageflowPackage.eINSTANCE.getPageflow()) {
-					result = PageflowMessages.Pageflow_Model_Items_Pageflow;
-				} else if (((PageflowElement) ((AbstractEditPart) pageflow)
-						.getModel()).eClass() == PageflowPackage.eINSTANCE
-						.getPFPage()) {
-					result = PageflowMessages.Pageflow_Model_Items_PFPage;
-				} else if (((PageflowElement) ((AbstractEditPart) pageflow)
-						.getModel()).eClass() == PageflowPackage.eINSTANCE
-						.getPFLink()) {
-					result = PageflowMessages.Pageflow_Model_Items_PFLink;
-				}
-			}
-		}
-		return result;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/ProjectWebPageSelectionDialog.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/ProjectWebPageSelectionDialog.java
deleted file mode 100644
index 7d668d7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/ProjectWebPageSelectionDialog.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.jst.jsf.common.ui.internal.dialogs.CommonResourceDialog;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.PageflowMessages;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * @author hmeng
- */
-
-public class ProjectWebPageSelectionDialog extends CommonResourceDialog {
-
-	/**
-	 * @param parentShell
-	 * @param project
-	 * @param style
-	 */
-	public ProjectWebPageSelectionDialog(Shell parentShell, IProject project,
-			int style) {
-		super(parentShell, project, style);
-		init();
-	}
-
-	/**
-	 * @param parentShell
-	 * @param project
-	 */
-	public ProjectWebPageSelectionDialog(Shell parentShell, IProject project) {
-		super(parentShell, project);
-		init();
-	}
-
-	private void init() {
-		setResourceDescription(PageflowMessages.ProjectWebPageSelectionDialog_Description);
-		setSuffixs(new String[] { "jsp", "jspx", "jsf", "html", "htm" }); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
-	}
-
-	/**
-	 * @return the rseult file path
-	 */
-	public String getResultFilePath() {
-		String result = ""; //$NON-NLS-1$
-		IFile selectedFile = (IFile) getResult()[0];
-		IPath path = selectedFile.getProjectRelativePath();
-		path = path.removeFirstSegments(1);
-		result = "/" + path.toString(); //$NON-NLS-1$
-		return result;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/PropertyMessages.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/PropertyMessages.java
deleted file mode 100644
index d8fb04d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/PropertyMessages.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * NLS Message bundle for properties
- *
- */
-public final class PropertyMessages extends NLS {
-
-	private static final String BUNDLE_NAME = "org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties.PropertyMessages"; //$NON-NLS-1$
-
-	private PropertyMessages() {
-		// Do not instantiate
-	}
-
-	static {
-		NLS.initializeMessages(BUNDLE_NAME, PropertyMessages.class);
-	}
-
-	/**
-	 * see PropertyMessages.properties
-	 */
-	public static String property_displayName;
-	/**
-	 * see PropertyMessages.properties
-	 */
-	public static String property_description;
-	/**
-	 * see PropertyMessages.properties
-	 */
-	public static String property_configFile;
-	/**
-	 * see PropertyMessages.properties
-	 */
-	public static String property_largeIcon;
-
-	/**
-	 * see PropertyMessages.properties
-	 */
-	public static String property_smallIcon;
-
-	/**
-	 * see PropertyMessages.properties
-	 */
-	public static String property_fromAction;
-
-	/**
-	 * see PropertyMessages.properties
-	 */
-	public static String property_fromView;
-
-	/**
-	 * see PropertyMessages.properties
-	 */
-	public static String property_fromOutcome;
-
-	/**
-	 * see PropertyMessages.properties
-	 */
-	public static String property_redirect;
-
-	/**
-	 * see PropertyMessages.properties
-	 */
-	public static String property_browseButton;
-
-	/**
-	 * see PropertyMessages.properties
-	 */
-	public static String property_Command_SetValue;
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/PropertyMessages.properties b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/PropertyMessages.properties
deleted file mode 100644
index 3de4f3a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/PropertyMessages.properties
+++ /dev/null
@@ -1,22 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-property_displayName=Display Name:
-property_description=Description:
-property_configFile=Faces-config file:
-property_largeIcon=Large Icon:
-property_smallIcon=Small Icon:
-property_fromAction=From Action:
-property_fromView=Page Path:
-property_fromOutcome=From Outcome:
-property_redirect=Redirect:
-property_browseButton=...
-
-property_Command_SetValue=Set {0} Property
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/section/AbstractEditPartGroup.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/section/AbstractEditPartGroup.java
deleted file mode 100644
index 6ccbc2c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/section/AbstractEditPartGroup.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties.section;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogFieldGroup;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.StringDialogField;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties.PropertyMessages;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * @author jchoi
- * @version
- */
-/*package*/ abstract class AbstractEditPartGroup extends DialogFieldGroup {
-
-	private StringDialogField descField;
-
-	private StringDialogField displayNameField;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.common.dialogfield.DialogFieldGroup#initialize()
-	 */
-	public void initialize() {
-		displayNameField = new StringDialogField();
-		displayNameField.setLabelText(PropertyMessages.property_displayName);
-		displayNameField
-				.setDialogFieldChangeListener(getDefaultChangeListener());
-		descField = new StringDialogField();
-
-		descField.setLabelText(PropertyMessages.property_description);
-		descField.setDialogFieldChangeListener(getDefaultChangeListener());
-
-	}
-
-
-	/**
-	 * @param toolkit
-	 * @param parent
-	 * @param col
-	 */
-	protected void layoutDialogFields(FormToolkit toolkit, Composite parent,
-			int col) {
-		displayNameField.doFillIntoGrid(toolkit, parent, col);
-		descField.doFillIntoGrid(toolkit, parent, col);
-
-	}
-
-	/**
-	 * @param elem
-	 */
-	protected void refreshData(PageflowElement elem) {
-		descField.setTextWithoutUpdate(elem.getComment());
-		displayNameField.setTextWithoutUpdate(elem.getName());
-	}
-
-	/**
-	 * @return the description field
-	 */
-	protected StringDialogField getDescField() {
-		return descField;
-	}
-
-	/**
-	 * @return the display name field
-	 */
-	protected StringDialogField getDisplayNameField() {
-		return displayNameField;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.common.dialogfield.DialogFieldGroup#initialize()
-	 */
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.common.dialogfield.DialogFieldGroup#validateDialogFields()
-	 */
-	public IStatus[] validateDialogFields() {
-
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/section/AbstractEditPartSection.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/section/AbstractEditPartSection.java
deleted file mode 100644
index 00dcfca..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/section/AbstractEditPartSection.java
+++ /dev/null
@@ -1,238 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties.section;
-
-import java.util.EventObject;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.commands.CommandStack;
-import org.eclipse.gef.commands.CommandStackListener;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogFieldChangeListener;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.views.properties.IPropertySource;
-import org.eclipse.ui.views.properties.tabbed.AbstractPropertySection;
-
-/**
- * This is base section, which support GEF command stack to redo/undo setting
- * properties.
- * 
- * @author jchoi, Xiao-guang Zhang
- */
-/*package*/ abstract class AbstractEditPartSection extends AbstractPropertySection {
-
-	IDialogFieldChangeListener changeListener = new IDialogFieldChangeListener() {
-		public void dialogFieldChanged(DialogField field) {
-			validate();
-		}
-	};
-
-	/** property source of edit part */
-	private IPropertySource propertySource;
-
-	/** EditPart instance */
-	private EditPart editPart;
-
-	/** map for property registry to store a map between the property id and name */
-	private Map propertyRegistry;
-
-	/** GEF command stack */
-	private CommandStack commandStack;
-
-	/** command stack listener to refresh the section */
-	private CommandStackListener commandStackListener;
-
-	/**
-	 * 
-	 */
-	public AbstractEditPartSection() {
-		super();
-	}
-
-	/**
-	 * refresh the whole section
-	 * 
-	 */
-	public void refreshData() {
-		super.refresh();
-	}
-
-	/**
-	 * TODO: this method seems unused
-	 */
-	public abstract void validate();
-
-	/**
-	 * dispose the command stack listener
-	 */
-	public void dispose() {
-		super.dispose();
-		if (getCommandStack() != null) {
-			getCommandStack().removeCommandStackListener(
-					getCommandStackListener());
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.ui.properties.internal.provisional.ISection#setInput(org.eclipse.ui.IWorkbenchPart,
-	 *      org.eclipse.jface.viewers.ISelection)
-	 */
-	public void setInput(IWorkbenchPart part, ISelection selection) {
-		if (part != null) {
-			if (part.getAdapter(CommandStack.class) != null) {
-				setCommandStack((CommandStack) part
-						.getAdapter(CommandStack.class));
-			}
-
-			if (selection instanceof StructuredSelection) {
-				StructuredSelection structuredSelection = (StructuredSelection) selection;
-				if (structuredSelection.getFirstElement() instanceof EditPart) {
-					editPart = (EditPart) structuredSelection.getFirstElement();
-				}
-
-				if (editPart != null
-						&& ((IAdaptable) editPart)
-								.getAdapter(IPropertySource.class) != null) {
-					propertySource = (IPropertySource) ((IAdaptable) editPart)
-							.getAdapter(IPropertySource.class);
-				}
-
-			}
-		}
-
-		super.setInput(part, selection);
-	}
-
-	/**
-	 * get the commandstacklistener, if not existed, create a new one.
-	 * 
-	 * @return
-	 */
-	private CommandStackListener getCommandStackListener() {
-		if (commandStackListener == null) {
-			commandStackListener = new CommandStackListener() {
-				public void commandStackChanged(EventObject e) {
-					refreshData();
-				}
-			};
-		}
-		return commandStackListener;
-	}
-
-	/**
-	 * set a <code>CommandStack</code> forthis section, and add a
-	 * <code>CommandStackListener</code> for this commandstack
-	 * 
-	 * @param stack
-	 */
-	public void setCommandStack(CommandStack stack) {
-		commandStack = stack;
-		stack.addCommandStackListener(getCommandStackListener());
-	}
-
-	/**
-	 * get the <code>CommandStack</code>
-	 * 
-	 * @return the command stack
-	 */
-	public CommandStack getCommandStack() {
-		return commandStack;
-	}
-
-	/**
-	 * get the property source registered for current editpart
-	 * 
-	 * @return the property source
-	 */
-	public IPropertySource getPropertySource() {
-		return propertySource;
-	}
-
-	/**
-	 * get the property's EMF featureID based on property name.
-	 * 
-	 * @param propertyName
-	 * @return the feature id for propertyName
-	 */
-	protected Object getFeatureID(String propertyName) {
-		if (editPart != null && !(editPart.getModel() instanceof EObject)) {
-			return null;
-		}
-
-		Object propertyID = getPropertyRegistry().get(propertyName);
-		if (propertyID == null) {
-
-			EClass cls = ((EObject) editPart.getModel()).eClass();
-			for (Iterator it = cls.getEAllAttributes().iterator(); it.hasNext();) {
-				EAttribute attr = (EAttribute) it.next();
-				if (attr.getName().equalsIgnoreCase(propertyName)) {
-					propertyID = Integer.toString(attr.getFeatureID());
-					getPropertyRegistry().put(propertyName, propertyID);
-					break;
-				}
-			}
-		}
-		return propertyID;
-	}
-
-	/**
-	 * @return the property registry
-	 */
-	protected Map getPropertyRegistry() {
-		if (propertyRegistry == null) {
-			propertyRegistry = new HashMap();
-		}
-		return propertyRegistry;
-	}
-
-	/**
-	 * get the input edit part
-	 * 
-	 * @return the input
-	 */
-	public Object getInput() {
-		return editPart;
-	}
-
-	/**
-	 * set the value of property
-	 * 
-	 * @param propertyName
-	 * @param propertyValue
-	 */
-	public void setValue(String propertyName, Object propertyValue) {
-		if (propertyName != null && propertyValue != null
-				&& getPropertySource() != null) {
-			SetPropertyValueCommand setCommand = new SetPropertyValueCommand(
-					propertyName);
-			setCommand.setTarget(getPropertySource());
-			setCommand.setPropertyId(getFeatureID(propertyName));
-			setCommand.setPropertyValue(propertyValue);
-			if (getCommandStack() != null) {
-				getCommandStack().execute(setCommand);
-			} else {
-				setCommand.execute();
-			}
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/section/EditorGroup.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/section/EditorGroup.java
deleted file mode 100644
index dd6bea9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/section/EditorGroup.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties.section;
-
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * @author jchoi
- * @version
- */
-/*package*/ class EditorGroup extends AbstractEditPartGroup {
-	private Pageflow pageflow = null;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.common.dialogfield.DialogFieldGroup#initialize()
-	 */
-	public void initialize() {
-		super.initialize();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.common.dialogfield.DialogFieldGroup#refreshData()
-	 */
-	public void refreshData() {
-		if (pageflow != null) {
-			super.refreshData(pageflow);
-		}
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.common.dialogfield.DialogFieldGroup#layoutDialogFields(org.eclipse.ui.forms.widgets.FormToolkit,
-	 *      org.eclipse.swt.widgets.Composite)
-	 */
-	public void layoutDialogFields(FormToolkit toolkit, Composite parent) {
-		Composite top;
-		if (toolkit == null) {
-			top = new Composite(parent, SWT.NONE);
-		} else {
-			top = toolkit.createComposite(parent);
-		}
-		FillLayout fillLayout = new FillLayout(SWT.VERTICAL);
-		parent.setLayout(fillLayout);
-
-		GridLayout layout = new GridLayout();
-		layout.numColumns = 3;
-		top.setLayout(layout);
-
-		Label separator = toolkit.createSeparator(top, SWT.HORIZONTAL);
-		GridData data = new GridData(GridData.FILL_HORIZONTAL);
-		data.horizontalSpan = 3;
-		separator.setLayoutData(data);
-		super.layoutDialogFields(toolkit, top, 3);
-
-	}
-
-	/**
-	 * @param elem 
-	 */
-	public void setPropertyProvider(Pageflow elem) {
-		pageflow = elem;
-		this.refreshData();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/section/EditorSection.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/section/EditorSection.java
deleted file mode 100644
index 1b9d62c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/section/EditorSection.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties.section;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogFieldApplyListener;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart.PageflowEditPart;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowPackageImpl;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetWidgetFactory;
-
-/**
- * Edit section for Pagflow (EditPart)
- * 
- * @author jchoi, Xiao-guang Zhang
- */
-public class EditorSection extends AbstractEditPartSection {
-	/** edit group */
-	private EditorGroup group;
-
-	/** the emf model for Pageflow */
-	private Pageflow pageflow;
-
-	/**
-	 * 
-	 */
-	public EditorSection() {
-		super();
-		group = new EditorGroup();
-		group.setDefaultChangeListener(changeListener);
-		group.initialize();
-
-		group.getDisplayNameField().setDialogFieldApplyListener(
-				new IDialogFieldApplyListener() {
-					public void dialogFieldApplied(DialogField field) {
-						EditorSection.this.setValue(
-								PageflowPackageImpl.eINSTANCE
-										.getPageflowElement_Name().getName(),
-								group.getDisplayNameField().getText());
-					}
-				});
-
-		group.getDescField().setDialogFieldApplyListener(
-				new IDialogFieldApplyListener() {
-					public void dialogFieldApplied(DialogField field) {
-						EditorSection.this
-								.setValue(
-										PageflowPackageImpl.eINSTANCE
-												.getPageflowElement_Comment()
-												.getName(), group
-												.getDescField().getText());
-					}
-				});
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.ui.properties.internal.provisional.ISection#createControls(org.eclipse.swt.widgets.Composite,
-	 *      org.eclipse.wst.common.ui.properties.internal.provisional.TabbedPropertySheetPage)
-	 */
-	public void createControls(Composite parent,
-			TabbedPropertySheetPage aTabbedPropertySheetPage) {
-		super.createControls(parent, aTabbedPropertySheetPage);
-		TabbedPropertySheetWidgetFactory factory = aTabbedPropertySheetPage
-				.getWidgetFactory();
-		Composite top = factory.createFlatFormComposite(parent);
-
-		group.layoutDialogFields(factory, top);
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.ui.properties.internal.provisional.ISection#setInput(org.eclipse.ui.IWorkbenchPart,
-	 *      org.eclipse.jface.viewers.ISelection)
-	 */
-	public void setInput(IWorkbenchPart part, ISelection selection) {
-		super.setInput(part, selection);
-
-		if (getInput() != null && getInput() instanceof PageflowEditPart) {
-			Object model = ((PageflowEditPart) getInput()).getModel();
-			if (model instanceof Pageflow) {
-				pageflow = (Pageflow) model;
-				refreshData();
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.editors.pageflow.properties.sections.AbstractEditPartSection#refreshData()
-	 */
-	public void refreshData() {
-		super.refreshData();
-		group.setPropertyProvider(pageflow);
-	}
-
-    public void validate() {
-        // do nothing.
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/section/LinkGroup.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/section/LinkGroup.java
deleted file mode 100644
index bfe0d87..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/section/LinkGroup.java
+++ /dev/null
@@ -1,216 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties.section;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jface.window.Window;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.ComboDialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.IStringButtonAdapter;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.LayoutUtil;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.StringButtonDialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.StringDialogField;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties.ActionOutcomeSelectionDialog;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties.ITabbedPropertiesConstants;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties.PropertyMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.util.WebrootUtil;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * @author jchoi
- * @version
- */
-/*package*/ class LinkGroup extends AbstractEditPartGroup {
-	private StringButtonDialogField fromOutcomeField;
-
-	private StringDialogField fromActionField;
-
-	private ComboDialogField redirectField;
-
-	private PageflowLink pfLink;
-
-	/** Integer value for boolean type */
-	private static final Integer P_VALUE_TRUE = new Integer(0);
-
-	private static final Integer P_VALUE_FALSE = new Integer(1);
-
-	private class StringButtonAdapter implements IStringButtonAdapter {
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jst.jsf.facesconfig.ui.common.dialogfield.IStringButtonAdapter#changeControlPressed(org.eclipse.jst.jsf.facesconfig.ui.common.dialogfield.DialogField)
-		 */
-		public void changeControlPressed(DialogField field) {
-			String outcome = ""; //$NON-NLS-1$
-			String jspPage = ""; //$NON-NLS-1$
-			Shell shell = field.getLabelControl(null, null).getShell();
-			if (pfLink != null) {
-				outcome = pfLink.getOutcome();
-				jspPage = WebrootUtil.getProjectPath(pfLink,
-						getPreviousJSPPath(pfLink));
-				ActionOutcomeSelectionDialog actionDialog = new ActionOutcomeSelectionDialog(
-						shell, outcome, jspPage);
-				if (actionDialog.open() == Window.OK) {
-					outcome = actionDialog.getSelectedAction();
-					fromOutcomeField.setText(outcome);
-					pfLink.setOutcome(outcome);
-					refreshData();
-				}
-			}
-		}
-
-		/**
-		 * @param _element
-		 * @return
-		 */
-		private String getPreviousJSPPath(PageflowElement element) {
-			String jspPath = null;
-			if (element instanceof PageflowLink) {
-				PageflowNode source = ((PageflowLink) element).getSource();
-				if (source instanceof PageflowPage) {
-					jspPath = ((PageflowPage) source).getPath();
-				}
-			}
-			return jspPath;
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.common.dialogfield.DialogFieldGroup#initialize()
-	 */
-	public void initialize() {
-		fromOutcomeField = new StringButtonDialogField(
-				new StringButtonAdapter());
-		fromOutcomeField.setLabelText(PropertyMessages.property_fromOutcome);
-		fromOutcomeField.setButtonLabel(PropertyMessages.property_browseButton);
-		fromOutcomeField
-				.setDialogFieldChangeListener(getDefaultChangeListener());
-		fromActionField = new StringDialogField();
-		fromActionField.setLabelText(PropertyMessages.property_fromAction);
-		fromActionField
-				.setDialogFieldChangeListener(getDefaultChangeListener());
-		redirectField = new ComboDialogField(SWT.DROP_DOWN | SWT.READ_ONLY);
-		redirectField.setLabelText(PropertyMessages.property_redirect);
-		redirectField
-				.setDialogFieldChangeListener((getDefaultChangeListener()));
-		List redirectList;
-		redirectList = new ArrayList();
-		redirectList.add(Boolean.TRUE.toString());
-		redirectList.add(Boolean.FALSE.toString());
-		redirectField.setItems((String[]) redirectList.toArray(new String[0]));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.common.dialogfield.DialogFieldGroup#refreshData()
-	 */
-	public void refreshData() {
-		if (pfLink != null) {
-			fromOutcomeField.setTextWithoutUpdate(pfLink.getOutcome());
-			fromActionField.setTextWithoutUpdate(pfLink.getFromaction());
-			if (pfLink.isRedirect()) {
-				redirectField.setTextWithoutUpdate(Boolean.TRUE.toString());
-			} else {
-				redirectField.setTextWithoutUpdate(Boolean.FALSE.toString());
-			}
-		}
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.common.dialogfield.DialogFieldGroup#layoutDialogFields(org.eclipse.ui.forms.widgets.FormToolkit,
-	 *      org.eclipse.swt.widgets.Composite)
-	 */
-	public void layoutDialogFields(FormToolkit toolkit, Composite parent) {
-		Composite top;
-		if (toolkit == null) {
-			top = new Composite(parent, SWT.NONE);
-		} else {
-			top = toolkit.createComposite(parent);
-		}
-		FillLayout fillLayout = new FillLayout(SWT.VERTICAL);
-		parent.setLayout(fillLayout);
-
-		int numberOfColumns = 4;
-		GridLayout layout = new GridLayout(numberOfColumns, false);
-		top.setLayout(layout);
-
-		fromActionField.doFillIntoGrid(toolkit, top, numberOfColumns);
-		fromOutcomeField.doFillIntoGrid(toolkit, top, numberOfColumns);
-		redirectField.doFillIntoGrid(toolkit, top, numberOfColumns);
-
-		LayoutUtil.setHorizontalGrabbing(fromOutcomeField.getTextControl(
-				toolkit, top));
-		GridData data = new GridData();
-		data.widthHint = ITabbedPropertiesConstants.BROWSE_WIDTH;
-		data.heightHint = ITabbedPropertiesConstants.BROWSE_HEIGHT;
-
-		fromOutcomeField.getChangeControl(toolkit, top).setLayoutData(data);
-
-	}
-
-	/**
-	 * @param elem
-	 */
-	public void setPropertyProvider(PageflowLink elem) {
-		pfLink = elem;
-		this.refreshData();
-	}
-
-	/**
-	 * @return the outcome field
-	 */
-	public StringButtonDialogField getFromOutcomeField() {
-		return fromOutcomeField;
-	}
-
-	/**
-	 * @return the fromAction field
-	 */
-	public StringDialogField getFromActionField() {
-		return fromActionField;
-	}
-
-	/**
-	 * @return the redirect field
-	 */
-	public ComboDialogField getRedirectField() {
-		return redirectField;
-	}
-
-	/**
-	 * @return the redirect value
-	 */
-	public Integer getRedirectValue() {
-		if (redirectField.getText().equalsIgnoreCase(Boolean.TRUE.toString())) {
-			return LinkGroup.P_VALUE_TRUE;
-		}
-        return LinkGroup.P_VALUE_FALSE;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/section/LinkSection.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/section/LinkSection.java
deleted file mode 100644
index c6b0dce..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/section/LinkSection.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties.section;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogFieldApplyListener;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart.PageflowLinkEditPart;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowPackageImpl;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.util.PageflowValidation;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetWidgetFactory;
-
-/**
- * Edit section for Pagflow Link element (EditPart)
- * 
- * @author jchoi
- */
-public class LinkSection extends AbstractEditPartSection {
-	/** edit group */
-	private LinkGroup group;
-
-	/** the emf model for Pageflow link */
-	private PageflowLink pfLink;
-
-	/**
-	 * 
-	 */
-	public LinkSection() {
-		super();
-		group = new LinkGroup();
-		group.setDefaultChangeListener(changeListener);
-		group.initialize();
-
-		group.getFromOutcomeField().setDialogFieldApplyListener(
-				new IDialogFieldApplyListener() {
-					public void dialogFieldApplied(DialogField field) {
-						LinkSection.this.setValue(PageflowPackageImpl.eINSTANCE
-								.getPFLink_Outcome().getName(), group
-								.getFromOutcomeField().getText());
-					}
-				});
-
-		group.getRedirectField().setDialogFieldApplyListener(
-				new IDialogFieldApplyListener() {
-					public void dialogFieldApplied(DialogField field) {
-						LinkSection.this.setValue(PageflowPackageImpl.eINSTANCE
-								.getPFLink_Redirect().getName(), group
-								.getRedirectValue());
-					}
-				});
-		group.getFromActionField().setDialogFieldApplyListener(
-				new IDialogFieldApplyListener() {
-					public void dialogFieldApplied(DialogField field) {
-						LinkSection.this.setValue(PageflowPackageImpl.eINSTANCE
-								.getPFLink_Fromaction().getName(), group
-								.getFromActionField().getText());
-					}
-				});
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.ui.properties.internal.provisional.ISection#createControls(org.eclipse.swt.widgets.Composite,
-	 *      org.eclipse.wst.common.ui.properties.internal.provisional.TabbedPropertySheetPage)
-	 */
-	public void createControls(Composite parent,
-			TabbedPropertySheetPage aTabbedPropertySheetPage) {
-		super.createControls(parent, aTabbedPropertySheetPage);
-		TabbedPropertySheetWidgetFactory factory = aTabbedPropertySheetPage
-				.getWidgetFactory();
-		Composite top = factory.createFlatFormComposite(parent);
-
-		group.layoutDialogFields(factory, top);
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.ui.properties.internal.provisional.ISection#setInput(org.eclipse.ui.IWorkbenchPart,
-	 *      org.eclipse.jface.viewers.ISelection)
-	 */
-	public void setInput(IWorkbenchPart part, ISelection selection) {
-		super.setInput(part, selection);
-
-		if (getInput() != null && getInput() instanceof PageflowLinkEditPart) {
-			Object model = ((PageflowLinkEditPart) getInput()).getModel();
-			if (model instanceof PageflowLink) {
-				pfLink = (PageflowLink) model;
-				if (PageflowValidation.getInstance().isValidLinkForProperty(
-						pfLink)) {
-					refreshData();
-				}
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.editors.pageflow.properties.sections.AbstractEditPartSection#refreshData()
-	 */
-	public void refreshData() {
-		super.refresh();
-		group.setPropertyProvider(pfLink);
-	}
-
-    public void validate() {
-        // do nothing
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/section/PageGroup.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/section/PageGroup.java
deleted file mode 100644
index 6d3252b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/section/PageGroup.java
+++ /dev/null
@@ -1,173 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties.section;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jface.window.Window;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.IStringButtonAdapter;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.LayoutUtil;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.StringButtonDialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.StringDialogField;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties.ITabbedPropertiesConstants;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties.ProjectWebPageSelectionDialog;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties.PropertyMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.util.WebrootUtil;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * @author jchoi
- * @version
- */
-/*package*/ class PageGroup extends AbstractEditPartGroup {
-
-	private StringButtonDialogField fromViewField;
-
-	private PageflowPage pfPage = null;
-
-	private StringDialogField largeIconField;
-
-	private StringDialogField smallIconField;
-
-	class StringButtonAdapter implements IStringButtonAdapter {
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jst.jsf.facesconfig.ui.common.dialogfield.IStringButtonAdapter#changeControlPressed(org.eclipse.jst.jsf.facesconfig.ui.common.dialogfield.DialogField)
-		 */
-		public void changeControlPressed(DialogField field) {
-			IProject project = WebrootUtil.getProject(pfPage);
-			ProjectWebPageSelectionDialog dlg = new ProjectWebPageSelectionDialog(
-					field.getLabelControl(null, null).getShell(), project);
-			if (dlg.open() == Window.OK) {
-				fromViewField.setText(dlg.getResultFilePath());
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.common.dialogfield.DialogFieldGroup#initialize()
-	 */
-	public void initialize() {
-		fromViewField = new StringButtonDialogField(new StringButtonAdapter());
-		fromViewField.setLabelText(PropertyMessages.property_fromView);
-		fromViewField.setButtonLabel(PropertyMessages.property_browseButton);
-		fromViewField.setDialogFieldChangeListener(getDefaultChangeListener());
-
-		largeIconField = new StringDialogField();
-		largeIconField.setLabelText(PropertyMessages.property_largeIcon);
-		largeIconField
-				.setDialogFieldChangeListener((getDefaultChangeListener()));
-		smallIconField = new StringDialogField();
-		smallIconField.setLabelText(PropertyMessages.property_smallIcon);
-		smallIconField
-				.setDialogFieldChangeListener((getDefaultChangeListener()));
-		super.initialize();
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.common.dialogfield.DialogFieldGroup#refreshData()
-	 */
-	public void refreshData() {
-		if (pfPage != null) {
-			fromViewField.setTextWithoutUpdate(assertString(pfPage.getPath()));
-			largeIconField.setTextWithoutUpdate(assertString(pfPage
-					.getLargeicon()));
-			smallIconField.setTextWithoutUpdate(assertString(pfPage
-					.getSmallicon()));
-			super.refreshData(pfPage);
-
-		}
-
-	}
-	/**
-	 * @param value
-	 * @return the assertion string
-	 */
-	private static String assertString(String value) {
-		return value == null ? "" : value; //$NON-NLS-1$
-	}
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.common.dialogfield.DialogFieldGroup#layoutDialogFields(org.eclipse.ui.forms.widgets.FormToolkit,
-	 *      org.eclipse.swt.widgets.Composite)
-	 */
-	public void layoutDialogFields(FormToolkit toolkit, Composite parent) {
-		Composite top;
-		if (toolkit == null) {
-			top = new Composite(parent, SWT.NONE);
-		} else {
-			top = toolkit.createComposite(parent);
-		}
-		FillLayout fillLayout = new FillLayout(SWT.VERTICAL);
-		parent.setLayout(fillLayout);
-
-		int numberOfColumns = 4;
-		GridLayout layout = new GridLayout(numberOfColumns, false);
-		top.setLayout(layout);
-
-		fromViewField.doFillIntoGrid(toolkit, top, numberOfColumns);
-		LayoutUtil.setHorizontalGrabbing(fromViewField.getTextControl(toolkit,
-				top));
-		largeIconField.doFillIntoGrid(toolkit, top, numberOfColumns);
-		smallIconField.doFillIntoGrid(toolkit, top, numberOfColumns);
-		super.layoutDialogFields(toolkit, top, 4);
-
-		GridData data = new GridData();
-		data.widthHint = ITabbedPropertiesConstants.BROWSE_WIDTH;
-		data.heightHint = ITabbedPropertiesConstants.BROWSE_HEIGHT;
-
-		fromViewField.getChangeControl(toolkit, top).setLayoutData(data);
-	}
-
-	/**
-	 * @param elem
-	 */
-	public void setPropertyProvider(PageflowPage elem) {
-		pfPage = elem;
-		this.refreshData();
-	}
-
-	/**
-	 * @return the fromView field
-	 */
-	public StringButtonDialogField getFromViewField() {
-		return fromViewField;
-	}
-
-	/**
-	 * @return the large icon field
-	 */
-	public StringDialogField getLargeIconField() {
-		return largeIconField;
-	}
-
-	/**
-	 * @return the small icon field
-	 */
-	public StringDialogField getSmallIconField() {
-		return smallIconField;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/section/PageSection.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/section/PageSection.java
deleted file mode 100644
index 5a09203..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/section/PageSection.java
+++ /dev/null
@@ -1,168 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties.section;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogFieldApplyListener;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart.PageflowNodeEditPart;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowPackageImpl;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.util.PageflowValidation;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetWidgetFactory;
-
-/**
- * Edit section for Pagflow Page Element (EditPart)
- * 
- * @author jchoi, Xiao-guang Zhang
- */
-public class PageSection extends AbstractEditPartSection {
-	/** edit group */
-	private PageGroup group;
-
-	/** the emf model for Pageflow page */
-	private PageflowPage pfPage = null;
-
-	/**
-	 * 
-	 */
-	public PageSection() {
-		super();
-		group = new PageGroup();
-		group.setDefaultChangeListener(changeListener);
-		group.initialize();
-
-		group.getFromViewField().setDialogFieldApplyListener(
-				new IDialogFieldApplyListener() {
-
-					public void dialogFieldApplied(DialogField field) {
-						if (pfPage != null) {
-							String jsfNew = group.getFromViewField().getText();
-							if (jsfNew != null && jsfNew.length() > 0) {
-								if (PageflowValidation.getInstance()
-										.isExistedPage(pfPage.getPageflow(),
-												jsfNew)) {
-									// Pageflow.PageflowEditor.Alert.DNDResourceTitle
-									// = Pageflow Creation Error
-									// Pageflow.PageflowEditor.Alert.ExistingPage
-									// = The web page {0} is already existed in
-									// current PageFlow.
-									EditorPlugin
-											.getAlerts()
-											.error(
-													"Pageflow.PageflowEditor.Alert.DNDResourceTitle", //$NON-NLS-1$
-													"Pageflow.PageflowEditor.Alert.ExistingPage", //$NON-NLS-1$
-													jsfNew);
-								} else {
-									PageSection.this
-											.setValue(
-													PageflowPackageImpl.eINSTANCE
-															.getPFPage_Path()
-															.getName(), jsfNew);
-								}
-							}
-						}
-					}
-				});
-
-		group.getLargeIconField().setDialogFieldApplyListener(
-				new IDialogFieldApplyListener() {
-
-					public void dialogFieldApplied(DialogField field) {
-						PageSection.this.setValue(PageflowPackageImpl.eINSTANCE
-								.getPFPage_Largeicon().getName(), group
-								.getLargeIconField().getText());
-					}
-				});
-		group.getSmallIconField().setDialogFieldApplyListener(
-				new IDialogFieldApplyListener() {
-
-					public void dialogFieldApplied(DialogField field) {
-						PageSection.this.setValue(PageflowPackageImpl.eINSTANCE
-								.getPFPage_Smallicon().getName(), group
-								.getSmallIconField().getText());
-					}
-				});
-
-		group.getDescField().setDialogFieldApplyListener(
-				new IDialogFieldApplyListener() {
-
-					public void dialogFieldApplied(DialogField field) {
-						PageSection.this.setValue(PageflowPackageImpl.eINSTANCE
-								.getPageflowElement_Comment().getName(), group
-								.getDescField().getText());
-					}
-				});
-
-		group.getDisplayNameField().setDialogFieldApplyListener(
-				new IDialogFieldApplyListener() {
-
-					public void dialogFieldApplied(DialogField field) {
-						PageSection.this.setValue(PageflowPackageImpl.eINSTANCE
-								.getPageflowElement_Name().getName(), group
-								.getDisplayNameField().getText());
-					}
-				});
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.ui.properties.internal.provisional.ISection#createControls(org.eclipse.swt.widgets.Composite,
-	 *      org.eclipse.wst.common.ui.properties.internal.provisional.TabbedPropertySheetPage)
-	 */
-	public void createControls(Composite parent,
-			TabbedPropertySheetPage aTabbedPropertySheetPage) {
-		super.createControls(parent, aTabbedPropertySheetPage);
-		TabbedPropertySheetWidgetFactory factory = aTabbedPropertySheetPage
-				.getWidgetFactory();
-		Composite top = factory.createFlatFormComposite(parent);
-
-		group.layoutDialogFields(factory, top);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.ui.properties.internal.provisional.ISection#setInput(org.eclipse.ui.IWorkbenchPart,
-	 *      org.eclipse.jface.viewers.ISelection)
-	 */
-	public void setInput(IWorkbenchPart part, ISelection selection) {
-		super.setInput(part, selection);
-
-		if (getInput() != null && getInput() instanceof PageflowNodeEditPart) {
-			Object model = ((PageflowNodeEditPart) getInput()).getModel();
-			if (model instanceof PageflowPage) {
-				pfPage = (PageflowPage) model;
-				refreshData();
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.editors.pageflow.properties.sections.AbstractEditPartSection#refreshData()
-	 */
-	public void refreshData() {
-		super.refreshData();
-		group.setPropertyProvider(pfPage);
-	}
-
-    public void validate() {
-        // do nothing
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/section/SetPropertyValueCommand.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/section/SetPropertyValueCommand.java
deleted file mode 100644
index 96d2276..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/section/SetPropertyValueCommand.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties.section;
-
-import java.text.MessageFormat;
-
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties.PropertyMessages;
-import org.eclipse.ui.views.properties.IPropertySource;
-
-/*package*/ class SetPropertyValueCommand extends Command {
-
-	private Object propertyValue;
-
-	private Object propertyID;
-
-	private Object undoValue;
-
-	private boolean resetOnUndo;
-
-	private IPropertySource target;
-
-	/**
-	 * @param propLabel
-	 */
-	public SetPropertyValueCommand(String propLabel) {
-		super(MessageFormat.format(
-				PropertyMessages.property_Command_SetValue,
-				new Object[] { propLabel }).trim());
-	}
-
-	public boolean canExecute() {
-		return true;
-	}
-
-	public void execute() {
-		boolean wasPropertySet = getTarget().isPropertySet(propertyID);
-		undoValue = getTarget().getPropertyValue(propertyID);
-		if (undoValue instanceof IPropertySource) {
-			undoValue = ((IPropertySource) undoValue).getEditableValue();
-		}
-		if (propertyValue instanceof IPropertySource) {
-			propertyValue = ((IPropertySource) propertyValue)
-					.getEditableValue();
-		}
-		getTarget().setPropertyValue(propertyID, propertyValue);
-		resetOnUndo = wasPropertySet != getTarget().isPropertySet(propertyID);
-		if (resetOnUndo) {
-			undoValue = null;
-		}
-	}
-
-	/**
-	 * @return the target
-	 */
-	private IPropertySource getTarget() {
-		return target;
-	}
-
-	void setTarget(IPropertySource aTarget) {
-		target = aTarget;
-	}
-
-	public void redo() {
-		execute();
-	}
-
-	void setPropertyId(Object pName) {
-		propertyID = pName;
-	}
-
-	void setPropertyValue(Object val) {
-		propertyValue = val;
-	}
-
-	public void undo() {
-		if (resetOnUndo) {
-			getTarget().resetPropertyValue(propertyID);
-		} else {
-			getTarget().setPropertyValue(propertyID, undoValue);
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/synchronization/FC2PFSynchronizer.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/synchronization/FC2PFSynchronizer.java
deleted file mode 100644
index 2cc7a13..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/synchronization/FC2PFSynchronizer.java
+++ /dev/null
@@ -1,271 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.synchronization;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.Notifier;
-import org.eclipse.emf.common.notify.impl.AdapterImpl;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.FromViewIdType;
-import org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType;
-import org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType;
-import org.eclipse.jst.jsf.facesconfig.emf.ToViewIdType;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage;
-
-/**
- * The adapter that listens to modification of faces-config and updates pageflow
- * as needed.
- * 
- * @author hmeng
- * 
- */
-
-public class FC2PFSynchronizer extends AdapterImpl {
-	private final boolean DEBUG = false;
-
-	FC2PFTransformer transformer;
-
-	private static final Logger logger = EditorPlugin
-			.getLogger(FC2PFSynchronizer.class);
-
-	/**
-	 * @param transformer
-	 */
-	public FC2PFSynchronizer(FC2PFTransformer transformer) {
-		this.transformer = transformer;
-	}
-
-	public Notifier getTarget() {
-		// can't set target so return null
-		return null;
-	}
-
-	public void setTarget(Notifier newTarget) {
-        // do nothing
-	}
-
-	public boolean isAdapterForType(Object type) {
-		return type == FC2PFSynchronizer.class;
-	}
-
-	public void notifyChanged(Notification notification) {
-		if (!isProcessorFor(notification)) {
-			return;
-		}
-		transformer.setInEvent(true);
-		try {
-			int type = notification.getEventType();
-			switch (type) {
-			case Notification.ADD: {
-				processAdd(notification);
-				notifyPageflow(notification);
-				break;
-			}
-			case Notification.SET: {
-				processSet(notification);
-				notifyPageflow(notification);
-				break;
-			}
-			case Notification.REMOVE:
-				processRemove(notification);
-				notifyPageflow(notification);
-				break;
-			}
-		} catch (Exception e) {
-			logger.error(e);
-		} finally {
-			if (notification.getEventType() != Notification.REMOVING_ADAPTER) {
-				transformer.refreshFCAdapter((EObject) notification
-						.getNotifier());
-				transformer.refreshPFAdapter(transformer.getPageflow());
-			}
-			transformer.setInEvent(false);
-		}
-	}
-
-	private boolean isProcessorFor(Notification notification) {
-		boolean result = false;
-		if (transformer.isListenToNotify()
-				&& (notification.getNotifier() instanceof EObject)) {
-			if (notification.getNotifier() == transformer.getFacesConfig()) {
-				// For faces-config, only navigation rule's change is awared.
-				if (notification.getFeature() == FacesConfigPackage.eINSTANCE
-						.getFacesConfigType_NavigationRule()) {
-					result = true;
-				}
-			} else {
-				result = true;
-			}
-		}
-		return result;
-	}
-
-	private void processAdd(Notification notification) {
-		Object feature = notification.getFeature();
-		if (feature == FacesConfigPackage.eINSTANCE
-				.getNavigationRuleType_NavigationCase()) {
-			if (DEBUG)
-				System.out.println("New navigation case"); //$NON-NLS-1$
-			NavigationCaseType newCase = (NavigationCaseType) notification
-					.getNewValue();
-			transformer.updatePageflowElements(transformer.getPageflow(),
-					newCase);
-		} else if (feature == FacesConfigPackage.eINSTANCE
-				.getFacesConfigType_NavigationRule()) {
-			NavigationRuleType newRule = (NavigationRuleType) notification
-					.getNewValue();
-			if (newRule.getNavigationCase().size() > 0) {
-				for (int i = 0; i < newRule.getNavigationCase().size(); i++) {
-					transformer.updatePageflowElements(transformer
-							.getPageflow(), (NavigationCaseType) newRule
-							.getNavigationCase().get(i));
-				}
-			}
-			if (DEBUG)
-				System.out.println("New navigation rule"); //$NON-NLS-1$
-		} else if (DEBUG)
-			System.out.println("Something is added"); //$NON-NLS-1$
-	}
-
-	/**
-	 * Notify pageflow the changes.
-	 * 
-	 * @param notification
-	 */
-	private void notifyPageflow(Notification notification) {
-		Assert.isTrue(notification.getNotifier() instanceof InternalEObject);
-		transformer.getPageflow().notifyModelChanged(
-				new ENotificationImpl((InternalEObject) notification
-						.getNotifier(), Notification.SET,
-						PageflowPackage.PAGEFLOW, null, null));
-	}
-
-	/**
-	 * Deal with the case when some element is removed.
-	 * 
-	 * @param notification
-	 */
-	private void processRemove(Notification notification) {
-		if (notification.getFeature() == FacesConfigPackage.eINSTANCE
-				.getNavigationRuleType_NavigationCase()) {
-			if (notification.getOldValue() instanceof NavigationCaseType) {
-				NavigationCaseType caseType = (NavigationCaseType) notification
-						.getOldValue();
-				transformer.removeLink(caseType);
-			}
-			if (DEBUG)
-				System.out.println("Navigation case"); //$NON-NLS-1$
-		} else if (notification.getFeature() == FacesConfigPackage.eINSTANCE
-				.getNavigationCaseType()) {
-			if (notification.getOldValue() instanceof NavigationRuleType) {
-				NavigationRuleType rule = (NavigationRuleType) notification
-						.getOldValue();
-				for (int i = 0; i < rule.getNavigationCase().size(); i++) {
-					NavigationCaseType caseType = (NavigationCaseType) rule
-							.getNavigationCase().get(i);
-					transformer.refreshLink(caseType);
-				}
-			}
-			if (DEBUG)
-				System.out.println("navigation rule"); //$NON-NLS-1$
-		} else if (notification.getFeature() == FacesConfigPackage.eINSTANCE
-				.getFacesConfigType_NavigationRule()) {
-			if (notification.getOldValue() instanceof NavigationRuleType) {
-				NavigationRuleType rule = (NavigationRuleType) notification
-						.getOldValue();
-				for (int i = 0; i < rule.getNavigationCase().size(); i++) {
-					NavigationCaseType caseType = (NavigationCaseType) rule
-							.getNavigationCase().get(i);
-					transformer.refreshLink(caseType);
-				}
-			}
-		}
-		if (DEBUG)
-			System.out.println("Something is removed"); //$NON-NLS-1$
-	}
-
-	/**
-	 * Deal with property change.
-	 * 
-	 * @param notification
-	 */
-	private void processSet(Notification notification) {
-		Object feature = notification.getFeature();
-		if (feature == FacesConfigPackage.eINSTANCE
-				.getFromViewIdType_TextContent()
-				|| feature == FacesConfigPackage.eINSTANCE
-						.getNavigationRuleType_FromViewId()) {
-			fromViewIdChanged(notification);
-		} else if (feature == FacesConfigPackage.eINSTANCE
-				.getToViewIdType_TextContent()
-				|| feature == FacesConfigPackage.eINSTANCE
-						.getNavigationCaseType_ToViewId()) {
-			toViewIdChanged(notification);
-		}
-		if (DEBUG)
-			System.out.println("Something is set"); //$NON-NLS-1$
-	}
-
-	private void fromViewIdChanged(Notification notification) {
-		// remove
-		Object feature = notification.getFeature();
-		if (feature == FacesConfigPackage.eINSTANCE
-				.getNavigationRuleType_FromViewId()
-				&& notification.getNewValue() == null
-				&& notification.getOldValue() instanceof FromViewIdType) {
-			NavigationRuleType rule = (NavigationRuleType) notification
-					.getNotifier();
-			for (int i = 0; i < rule.getNavigationCase().size(); i++) {
-				NavigationCaseType caseType = (NavigationCaseType) rule
-						.getNavigationCase().get(i);
-				transformer.refreshLink(caseType);
-			}
-		}
-		// add or change
-		else if (feature == FacesConfigPackage.eINSTANCE
-				.getFromViewIdType_TextContent()) {
-			NavigationRuleType rule = (NavigationRuleType) ((EObject) notification
-					.getNotifier()).eContainer();
-			for (int i = 0; i < rule.getNavigationCase().size(); i++) {
-				NavigationCaseType caseType = (NavigationCaseType) rule
-						.getNavigationCase().get(i);
-				transformer.refreshLink(caseType);
-			}
-		}
-	}
-
-	private void toViewIdChanged(Notification notification) {
-		// remove
-		Object feature = notification.getFeature();
-		if (feature == FacesConfigPackage.eINSTANCE
-				.getNavigationCaseType_ToViewId()
-				&& notification.getNewValue() == null
-				&& notification.getOldValue() instanceof ToViewIdType) {
-			NavigationCaseType caseType = (NavigationCaseType) notification
-					.getNotifier();
-			transformer.refreshLink(caseType);
-		}
-		// add or change
-		else if (feature == FacesConfigPackage.eINSTANCE
-				.getToViewIdType_TextContent()) {
-			NavigationCaseType caseType = (NavigationCaseType) ((EObject) notification
-					.getNotifier()).eContainer();
-			transformer.refreshLink(caseType);
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/synchronization/FC2PFTransformer.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/synchronization/FC2PFTransformer.java
deleted file mode 100644
index e2a9fb0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/synchronization/FC2PFTransformer.java
+++ /dev/null
@@ -1,983 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.synchronization;
-
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.Notifier;
-import org.eclipse.emf.common.notify.impl.AdapterImpl;
-import org.eclipse.emf.common.util.TreeIterator;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.DescriptionType;
-import org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType;
-import org.eclipse.jst.jsf.facesconfig.emf.FromViewIdType;
-import org.eclipse.jst.jsf.facesconfig.emf.IconType;
-import org.eclipse.jst.jsf.facesconfig.emf.LargeIconType;
-import org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType;
-import org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType;
-import org.eclipse.jst.jsf.facesconfig.emf.SmallIconType;
-import org.eclipse.jst.jsf.facesconfig.emf.ToViewIdType;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowFactory;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageReferenceElement;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.ReferenceElement;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.util.PageflowModelManager;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.util.PageflowTransform;
-import org.eclipse.jst.jsf.facesconfig.ui.util.WebrootUtil;
-
-/**
- * Update and synchronize pageflow from faces-config or vice-versa.
- * 
- * @author hmeng
- * 
- */
-
-public class FC2PFTransformer extends AdapterImpl {
-
-	// For code debug.
-	private static final boolean DEBUG = false;
-
-	/**
-	 * the first notification event type after the defaults
-	 */
-	public static final int MY_NOTIFICATION_TYPE = Notification.EVENT_TYPE_COUNT + 1;
-
-	/**
-	 * the first notification event type after MY_NOTIFICATION_TYPE
-	 */
-	public static final int MY_NOTIFICATION_TYPE1 = MY_NOTIFICATION_TYPE + 1;
-
-	/**
-	 * The listener is active.
-	 */
-	private boolean listenToNotify;
-
-	/**
-	 * Avoid redundent event.
-	 */
-	private boolean isInEvent;
-
-	boolean pageflowChanged = false;
-
-	/**
-	 * Perform operations batched.
-	 */
-	boolean needBatchOperations = false;
-
-	/**
-	 * Catches
-	 */
-	private Map mapPaths2PF = new HashMap();
-
-	private Map mapCases2Links = new HashMap();
-
-	/**
-	 * The pageflow model.
-	 */
-	private Pageflow pageflow;
-
-	/**
-	 * The faces-config model.
-	 */
-	FacesConfigType facesConfig;
-
-	/**
-	 * Default constructor
-	 */
-	public FC2PFTransformer() {
-		super();
-		// TODO Auto-generated constructor stub
-	}
-
-	/**
-	 * @param listenToNotify
-	 */
-	public void setListenToNotify(boolean listenToNotify) {
-		this.listenToNotify = listenToNotify;
-	}
-
-	private void postEMFChanged() {
-		startFCNotify();
-		// Refresh all facesConfig?
-		facesConfig.eNotify(new ENotificationImpl(
-				(InternalEObject) facesConfig, Notification.REMOVE,
-				FacesConfigPackage.FACES_CONFIG_TYPE__NAVIGATION_RULE, null,
-				null));
-		List rules;
-		rules = facesConfig.getNavigationRule();
-		for (int i = 0; i < rules.size(); i++) {
-			((NavigationRuleType) rules.get(i)).eNotify(new ENotificationImpl(
-					(InternalEObject) rules.get(i), Notification.REMOVE,
-					FacesConfigPackage.NAVIGATION_RULE_TYPE__NAVIGATION_CASE,
-					null, null));
-		}
-	}
-
-	/**
-	 * Set notify adapters.
-	 * 
-	 */
-	private void startFCNotify() {
-		TreeIterator iterator = facesConfig.eAllContents();
-		while (iterator.hasNext()) {
-			EObject object = (EObject) iterator.next();
-			object.eSetDeliver(true);
-		}
-		facesConfig.eSetDeliver(true);
-	}
-
-	/**
-	 * Set not notify adapters
-	 * 
-	 * @return
-	 */
-	private TreeIterator stopFCNotify() {
-		TreeIterator iterator = facesConfig.eAllContents();
-		// Stop the listener
-		while (iterator.hasNext()) {
-			EObject object = (EObject) iterator.next();
-			object.eSetDeliver(false);
-		}
-		facesConfig.eSetDeliver(false);
-		return iterator;
-	}
-
-	/**
-	 * For performance issue, we are going to update DOM only after the EMF
-	 * modifications are done.
-	 */
-	boolean isNeedBatchOperations() {
-		return needBatchOperations;
-	}
-
-	/**
-	 * @param enable
-	 */
-	public void setNeedBatchOperations(boolean enable) {
-		this.needBatchOperations = enable;
-		if (!enable) {
-			isInEvent = true;
-			postEMFChanged();
-			isInEvent = false;
-		} else {
-			stopFCNotify();
-		}
-	}
-
-	private void updateFacesRule(NavigationRuleType navigationRule,
-			PageflowPage pageSource) {
-		FacesConfigFactory factory = FacesConfigFactory.eINSTANCE;
-		if (pageSource.getComment() != null) {
-			DescriptionType description = factory.createDescriptionType();
-			description.setTextContent(pageSource.getComment());
-			navigationRule.getDescription().clear();
-			navigationRule.getDescription().add(description);
-		}
-		// set the navigation rule's icon
-		if (pageSource.getLargeicon() != null
-				|| pageSource.getSmallicon() != null) {
-			IconType icon = factory.createIconType();
-			if (pageSource.getLargeicon() != null) {
-				LargeIconType largeicon = factory.createLargeIconType();
-				largeicon.setTextContent(pageSource.getLargeicon());
-				icon.setLargeIcon(largeicon);
-			}
-
-			if (pageSource.getSmallicon() != null) {
-				SmallIconType smallicon = factory.createSmallIconType();
-				smallicon.setTextContent(pageSource.getSmallicon());
-				icon.setSmallIcon(smallicon);
-			}
-			navigationRule.getIcon().clear();
-			navigationRule.getIcon().add(icon);
-		}
-		if (pageSource.getName() != null) {
-			DisplayNameType displayName = factory.createDisplayNameType();
-			displayName.setTextContent(pageSource.getName());
-			navigationRule.getDisplayName().clear();
-			navigationRule.getDisplayName().add(displayName);
-		}
-	}
-
-	/**
-	 * TODO: If we cache the case's properties in a link, then we can restore
-	 * them.
-	 * 
-	 * @param navigationCase
-	 * @param link
-	 */
-    // TODO: not used, dead?
-//	private void updateFacesCase(NavigationCaseType navigationCase,
-//			PageflowLink link) {
-//		FacesConfigFactory factory = FacesConfigFactory.eINSTANCE;
-//		if (link.getComment() != null) {
-//			DescriptionType description = factory.createDescriptionType();
-//			description.setTextContent(link.getComment());
-//			navigationCase.getDescription().clear();
-//			navigationCase.getDescription().add(description);
-//		}
-//		// set the navigation rule's icon
-//		if (link.getLargeicon() != null || link.getSmallicon() != null) {
-//			IconType icon = factory.createIconType();
-//			if (link.getLargeicon() != null) {
-//				LargeIconType largeicon = factory.createLargeIconType();
-//				largeicon.setTextContent(link.getLargeicon());
-//				icon.setLargeIcon(largeicon);
-//			}
-//
-//			if (link.getSmallicon() != null) {
-//				SmallIconType smallicon = factory.createSmallIconType();
-//				smallicon.setTextContent(link.getSmallicon());
-//				icon.setSmallIcon(smallicon);
-//			}
-//			navigationCase.getIcon().clear();
-//			navigationCase.getIcon().add(icon);
-//		}
-//		if (link.getFromaction() != null) {
-//			FromActionType fromAction = factory.createFromActionType();
-//			fromAction.setTextContent(link.getFromaction());
-//			navigationCase.setFromAction(fromAction);
-//		}
-//		if (link.getOutcome() != null) {
-//			FromOutcomeType fromOutcome = factory.createFromOutcomeType();
-//			fromOutcome.setTextContent(link.getOutcome());
-//			navigationCase.setFromOutcome(fromOutcome);
-//		}
-//	}
-
-	private void createFacesCase(PageflowLink link, PageflowPage source,
-			PageflowPage target_) {
-		NavigationRuleType rule = FacesConfigFactory.eINSTANCE
-				.createNavigationRuleType();
-		FromViewIdType from = FacesConfigFactory.eINSTANCE
-				.createFromViewIdType();
-		from.setTextContent((source).getPath());
-		rule.setFromViewId(from);
-		NavigationCaseType navCase = FacesConfigFactory.eINSTANCE
-				.createNavigationCaseType();
-		ToViewIdType toView = FacesConfigFactory.eINSTANCE.createToViewIdType();
-		toView.setTextContent((target_).getPath());
-		navCase.setToViewId(toView);
-		rule.getNavigationCase().add(navCase);
-		facesConfig.getNavigationRule().add(rule);
-		updateFacesRule(rule, source);
-		source.getFCElements().add(from);
-		target_.getFCElements().add(toView);
-		link.getFCElements().add(navCase);
-		mapCases2Links.put(navCase, link);
-	}
-
-	private void removePageflowPage(PageflowPage source) {
-		Assert.isTrue(source.getOutlinks().size() == 0
-				&& source.getInlinks().size() == 0);
-		pageflow.getNodes().remove(source);
-	}
-
-	void removeCase(NavigationCaseType navCase) {
-		NavigationRuleType rule = (NavigationRuleType) navCase.eContainer();
-		(rule).getNavigationCase().remove(navCase);
-		if (rule.getNavigationCase().size() == 0) {
-			facesConfig.getNavigationRule().remove(rule);
-		}
-	}
-
-	/**
-	 * Remove a link in pageflow model.
-	 * 
-	 * @param pLink
-	 */
-	private void removeLink(PageflowLink pLink) {
-		// Link
-		PageflowPage source = (PageflowPage) pLink.getSource();
-		PageflowPage target_ = (PageflowPage) pLink.getTarget();
-		pLink.getPageflow().getLinks().remove(pLink);
-		source.getOutlinks().remove(pLink);
-		target_.getInlinks().remove(pLink);
-		// Navigation case
-		pLink.getFCElements().clear();
-		cleanPage(source);
-		cleanPage(target_);
-	}
-
-	/**
-	 * Remove a link in pageflow model.
-	 * 
-	 * @param pLink
-	 */
-	void changePFLinkStart(PageflowLink pLink, String newValue) {
-		PageflowPage newPage = null;
-		if ((newPage = getValidPFPageInCache(newValue)) != null) {
-			if (newValue.equals(((PageflowPage) pLink.getSource()).getPath())) {
-				return;
-			}
-		} else if ((newPage = TransformUtil.findPage(newValue, pageflow)) == null) {
-			return;
-		}
-
-		// remove old case
-		NavigationCaseType caseType = (NavigationCaseType) pLink
-				.getFCElements().getData().get(0);
-		//NavigationRuleType rule = (NavigationRuleType) caseType.eContainer();
-		removeCase(caseType);
-
-		// create new rule / case
-		NavigationCaseType newCase = FacesConfigFactory.eINSTANCE
-				.createNavigationCaseType();
-		ToViewIdType toView = FacesConfigFactory.eINSTANCE.createToViewIdType();
-		toView.setTextContent(caseType.getToViewId().getTextContent());
-		newCase.setToViewId(toView);
-
-		NavigationRuleType newRule = FacesConfigFactory.eINSTANCE
-				.createNavigationRuleType();
-		FromViewIdType fromView = FacesConfigFactory.eINSTANCE
-				.createFromViewIdType();
-		fromView.setTextContent(newValue);
-		newRule.setFromViewId(fromView);
-		newRule.getNavigationCase().add(newCase);
-		facesConfig.getNavigationRule().add(newRule);
-
-		// update
-		// updateNode(rule, newRule);
-		updateNode(caseType, newCase);
-
-		pLink.getFCElements().clear();
-		pLink.getFCElements().add(newCase);
-		pLink.setSource(newPage);
-
-		updatePageflowElements(pageflow, newCase);
-	}
-
-	private void updateNode(EObject old, EObject newOne) {
-		if (old instanceof NavigationRuleType) {
-			((NavigationRuleType) newOne).getDescription().clear();
-			((NavigationRuleType) newOne).getDescription().addAll(
-					((NavigationRuleType) old).getDescription());
-			((NavigationRuleType) newOne).getDisplayName().clear();
-			((NavigationRuleType) newOne).getDisplayName().addAll(
-					((NavigationRuleType) old).getDisplayName());
-			((NavigationRuleType) newOne).getDescription().clear();
-			((NavigationRuleType) newOne).getIcon().clear();
-			((NavigationRuleType) newOne).getIcon().addAll(
-					((NavigationRuleType) old).getIcon());
-		} else if (old instanceof NavigationCaseType) {
-			((NavigationCaseType) newOne).getDescription().clear();
-			((NavigationCaseType) newOne).getDescription().addAll(
-					((NavigationCaseType) old).getDescription());
-			((NavigationCaseType) newOne).getDisplayName().clear();
-			((NavigationCaseType) newOne).getDisplayName().addAll(
-					((NavigationCaseType) old).getDisplayName());
-			((NavigationCaseType) newOne).getDescription().clear();
-			((NavigationCaseType) newOne).getIcon().clear();
-			((NavigationCaseType) newOne).getIcon().addAll(
-					((NavigationCaseType) old).getIcon());
-			((NavigationCaseType) newOne)
-					.setFromAction(((NavigationCaseType) old).getFromAction());
-			((NavigationCaseType) newOne)
-					.setFromOutcome(((NavigationCaseType) old).getFromOutcome());
-		}
-	}
-
-	void changePFLinkEnd(PageflowLink pLink, String newValue) {
-		PageflowPage newPage = null;
-		if ((newPage = getValidPFPageInCache(newValue)) != null) {
-			if (newValue.equals(((PageflowPage) pLink.getSource()).getPath())) {
-				return;
-			}
-		} else if ((newPage = TransformUtil.findPage(newValue, pageflow)) == null) {
-			return;
-		}
-
-		// remove old case
-		NavigationCaseType caseType = (NavigationCaseType) pLink
-				.getFCElements().getData().get(0);
-		ToViewIdType toView = caseType.getToViewId(); // FacesConfigFactory.eINSTANCE.createToViewIdType();
-		if (toView == null) {
-			toView = FacesConfigFactory.eINSTANCE.createToViewIdType();
-		}
-		toView.setTextContent(newValue);
-		caseType.setToViewId(toView);
-
-		pLink.setTarget(newPage);
-
-		updatePageflowElements(pageflow, caseType);
-	}
-
-	void removeLink(NavigationCaseType caseType) {
-		PageflowLink link = (PageflowLink) mapCases2Links.get(caseType);
-		if (link != null) {
-			removeLink(link);
-		}
-	}
-
-	void addLink(PageflowPage source, PageflowPage target_, PageflowLink value) {
-		if (source != null && target_ != null && value != null) {
-			createFacesCase(value, source, target_);
-		}
-	}
-
-	private void cleanPage(PageflowPage source) {
-		if (source.getInlinks().size() == 0 && source.getOutlinks().size() == 0) {
-			removePageflowPage(source);
-		}
-		source.update();
-	}
-
-	void refreshPFAdapter(EObject object) {
-		TreeIterator content = object.eAllContents();
-		while (content.hasNext()) {
-			Object next = content.next();
-			adapt((EObject) next);
-		}
-		adapt(object);
-	}
-
-	void refreshFCAdapter(EObject object) {
-		List rules = facesConfig.getNavigationRule();
-		if (rules != null) {
-			for (int i = 0; i < rules.size(); i++) {
-				NavigationRuleType rule = (NavigationRuleType) rules.get(i);
-				adapt(rule);
-				TreeIterator children = rule.eAllContents();
-				while (children.hasNext()) {
-					adapt((EObject) children.next());
-				}
-			}
-		}
-		adapt(facesConfig);
-	}
-
-	/**
-	 * @param facesConfig
-	 */
-	public void setFacesConfig(FacesConfigType facesConfig) {
-		this.facesConfig = facesConfig;
-		refreshFCAdapter(facesConfig);
-	}
-
-	/**
-	 * @param pageflow
-	 */
-	public void setPageflow(Pageflow pageflow) {
-		this.pageflow = pageflow;
-		pageflow.eAdapters().add(this);
-		refreshPFAdapter(pageflow);
-	}
-
-	/**
-	 * Install compatible synchronization adapter for particular object.
-	 * 
-	 * @param object
-	 */
-	public void adapt(EObject object) {
-		if (object != null && !isAdapted(object)) {
-			if (object instanceof PageflowElement) {
-				object.eAdapters().add(new PF2FCSynchronizer(this));
-			} else {
-				object.eAdapters().add(new FC2PFSynchronizer(this));
-			}
-		}
-	}
-
-	/**
-	 * Remove the synchronization adapter.
-	 * 
-	 * @param object
-	 */
-	public void unAdapt(EObject object) {
-		Iterator adapters = object.eAdapters().iterator();
-		while (adapters.hasNext()) {
-			Object adapter = adapters.next();
-			if (adapter instanceof FC2PFSynchronizer
-					|| adapter instanceof PF2FCSynchronizer) {
-				adapters.remove();
-			}
-		}
-	}
-
-	/**
-	 * @param object
-	 * @return true if this transformer adapts object
-	 */
-	public boolean isAdapted(EObject object) {
-		if (object != null) {
-			Iterator adapters = object.eAdapters().iterator();
-			while (adapters.hasNext()) {
-				Object adapter = adapters.next();
-				if (adapter instanceof FC2PFSynchronizer
-						|| adapter instanceof PF2FCSynchronizer) {
-					return true;
-				}
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * clear the internal maps
-	 */
-	public void clearCaches() {
-		mapPaths2PF.clear();
-		mapCases2Links.clear();
-	}
-
-	/**
-	 * dispose of this object.
-	 */
-	public void dispose() {
-		clearCaches();
-		Pageflow pageFlow = getPageflow();
-		
-		if (pageFlow != null)
-		{
-		    pageFlow.dispose();
-		}
-	}
-
-	public Notifier getTarget() {
-		return null;
-	}
-
-	public boolean isAdapterForType(Object type) {
-		return false;
-	}
-
-	public void setTarget(Notifier newTarget) {
-	    // do nothing
-	}
-
-	/**
-	 * @param caseType
-	 * @return the from view id in caseType
-	 */
-	public static FromViewIdType getSource(NavigationCaseType caseType) {
-		if (caseType.eContainer() instanceof NavigationRuleType) {
-			NavigationRuleType rule = (NavigationRuleType) caseType
-					.eContainer();
-			return rule.getFromViewId();
-		}
-		return null;
-	}
-
-	private PageflowPage getOrCreateStartPage(NavigationCaseType navCase) {// FromViewIdType
-		PageflowPage startPageflowNode = null;
-		String path = "*"; //$NON-NLS-1$
-		NavigationRuleType rule = (NavigationRuleType) navCase.eContainer();
-		FromViewIdType source = getSource(navCase);
-		if (source != null) {
-			path = source.getTextContent();
-		}
-		if (getValidPFPageInCache(path) == null) {
-			startPageflowNode = TransformUtil.findPage(path, pageflow);
-
-			if (startPageflowNode == null) {
-				// not exist or is "*"
-				if (DEBUG)
-					System.out.println("Create new start page"); //$NON-NLS-1$
-				startPageflowNode = createPFPage(path);
-				pageflowChanged = true;
-			}
-			mapPaths2PF.put(path, startPageflowNode);
-			PageflowTransform.getInstance().updatePageflowSourcePage(
-					startPageflowNode, rule);
-		} else {
-			startPageflowNode = (PageflowPage) mapPaths2PF.get(path);
-		}
-		if (source != null) {
-			ReferenceElement element = new PageReferenceElement(
-					startPageflowNode);
-			element.add(source);
-			startPageflowNode
-					.setReferenceLink(element.resolveReferenceString());
-			startPageflowNode.getFCElements().add(source);
-		}
-		return startPageflowNode;
-	}
-
-	/**
-	 * Search for an existing pageflow page matching to navigation case's
-	 * target, if there is no such page existing, create one.
-	 * 
-	 * @param navCase
-	 * @return
-	 */
-	private PageflowPage getOrCreateEndPage(NavigationCaseType navCase) {
-		PageflowPage endPageflowNode = null;
-		ToViewIdType target_ = navCase.getToViewId();
-		if (target_ != null) {
-			String path = target_.getTextContent();
-			if (getValidPFPageInCache(path) == null) {
-				endPageflowNode = TransformUtil.findPage(path, pageflow);
-				if (endPageflowNode == null) {
-					endPageflowNode = createPFPage(path);
-					if (DEBUG)
-						System.out.println("Create new end page"); //$NON-NLS-1$
-					pageflowChanged = true;
-				}
-				mapPaths2PF.put(path, endPageflowNode);
-				PageflowTransform.getInstance().updatePageflowTargetPage(
-						endPageflowNode, navCase);
-			} else {
-				endPageflowNode = (PageflowPage) mapPaths2PF.get(path);
-			}
-			if (target_ != null) {
-				ReferenceElement element = new PageReferenceElement(
-						endPageflowNode);
-				element.add(target_);
-				endPageflowNode.setReferenceLink(element
-						.resolveReferenceString());
-				endPageflowNode.getFCElements().add(target_);
-			}
-		}
-		return endPageflowNode;
-	}
-
-	/**
-	 * Return a valid cached pageflow node.
-	 * 
-	 * @param key
-	 * @return
-	 */
-	private PageflowPage getValidPFPageInCache(Object key) {
-		EObject element = (EObject) mapPaths2PF.get(key);
-		if (!TransformUtil.isValidPageflowElement(element)
-				|| !(element instanceof PageflowPage)
-				|| !((PageflowPage) element).getPath().equals(key)) {
-			mapPaths2PF.remove(key);
-			element = null;
-		}
-		return (PageflowPage) element;
-	}
-
-	/**
-	 * Return a valid cached pageflow link.
-	 * 
-	 * @param caseType
-	 * @return
-	 */
-	private PageflowLink getValidPFLinkInCache(EObject caseType) {
-		PageflowLink link = (PageflowLink) mapCases2Links.get(caseType);
-		if (!TransformUtil.isValidLink(link)) {
-			mapCases2Links.remove(caseType);
-			link = null;
-		}
-		return link;
-
-	}
-
-	/**
-	 * Update pageflow model elements against faces-config navigation case.
-	 * @param pageflow_ 
-	 * @param caseFC 
-	 * @return true if the pageflow was changed
-	 */
-	public boolean updatePageflowElements(Pageflow pageflow_,
-			NavigationCaseType caseFC) {
-		this.pageflowChanged = false;
-		this.pageflow = pageflow_;
-		ToViewIdType target_ = caseFC.getToViewId();
-		if (target_ == null) {
-			return false;
-		}
-
-		PageflowPage start = null, end = null;
-		// start page
-		start = getOrCreateStartPage(caseFC);
-		String action = null;
-		// action
-		if (caseFC.getFromAction() != null) {
-			action = caseFC.getFromAction().getTextContent();
-		}
-		// from outcome
-		String fromOutCome = null;
-		if (caseFC.getFromOutcome() != null) {
-			fromOutCome = caseFC.getFromOutcome().getTextContent();
-		}
-		// end page
-		end = getOrCreateEndPage(caseFC);
-		// link
-		// Is there a link in pageflow model?
-		PageflowLink link = null;
-		if ((link = findUnmappedLink(start, end, caseFC)) == null) {
-			if (end != null) {
-				if (DEBUG)
-					System.out.println("Create new link"); //$NON-NLS-1$
-				link = createPFLink(start, end, action, fromOutCome);
-				pageflowChanged = true;
-			}
-		}
-		if (link != null) {
-			link.getFCElements().clear();
-			link.getFCElements().add(caseFC);
-			mapCases2Links.put(caseFC, link);
-		}
-		adapt(start);
-		adapt(end);
-		adapt(caseFC);
-		adapt(link);
-		return pageflowChanged;
-	}
-
-	private boolean cleanPageflowNavigationRule(Pageflow pageflow_) {
-		boolean dirty = false;
-		List links = pageflow_.getLinks();
-		Iterator linksIterator = links.iterator();
-		while (linksIterator.hasNext()) {
-			PageflowLink link = (PageflowLink) linksIterator.next();
-			if (link.getFCElements().isEmpty()) {
-				linksIterator.remove();
-				if (link.getSource() != null) {
-					link.getSource().getOutlinks().remove(link);
-				}
-				if (link.getTarget() != null) {
-					link.getTarget().getInlinks().remove(link);
-				}
-				dirty = true;
-			}
-		}
-		return dirty;
-	}
-
-	/**
-	 * merge the two navigation rules list between pageflow and face-config
-	 * file. merge rule: 1. if the from-view-id, from-action, and from-outcome
-	 * are same, they are the same navigation case, then the navigation case in
-	 * face-config file should be updated by one in the pageflow. 2. otherwise
-	 * the new navigation case should be created.
-	 * 
-	 * FIXME: Not merge, only update page flow from faces-config.
-	 * 
-	 * @param rulesFC -
-	 *            navigation rules in faces-config.
-	 * @param navigationRulesInPageflow -
-	 *            navigation rules in pageflow model.
-	 * 
-	 * @return boolean - whether add a new rule or not.
-	 */
-	private boolean updateNavigationRulesInPageflowFromFacesConfig(List rulesFC) {
-		boolean isNew = false;
-		// if the faces-config file is empty, the links should be removed.
-		if (rulesFC == null || rulesFC.isEmpty()) {
-			for (Iterator iterLink = pageflow.getLinks().iterator(); iterLink
-					.hasNext();) {
-				PageflowLink link = (PageflowLink) iterLink.next();
-				link.getSource().getOutlinks().remove(link);
-				link.getTarget().getInlinks().remove(link);
-			}
-			pageflow.getLinks().clear();
-		} else {
-			// Rule - Cases
-			for (Iterator iterRulesFC = rulesFC.iterator(); iterRulesFC
-					.hasNext();) {
-				NavigationRuleType ruleFC = (NavigationRuleType) iterRulesFC
-						.next();
-
-				List casesFC = ruleFC.getNavigationCase();
-				for (Iterator iterCasesFC = casesFC.iterator(); iterCasesFC
-						.hasNext();) {
-					NavigationCaseType navigationCaseFC = (NavigationCaseType) iterCasesFC
-							.next();
-					isNew |= updatePageflowElements(pageflow, navigationCaseFC);
-				}
-			}
-		}
-		isNew |= cleanPageflowNavigationRule(pageflow);
-		return isNew;
-	}
-
-	/**
-	 * Find a pageflow link that is not linked to a faces-config element. Since
-	 * user might edit faces-config file with other editor, so the path is not
-	 * always valid, here we still try to match link and navigation case. TODO:
-	 * should we always resolve mapping from referenceLink on PageflowElement?
-	 */
-	private PageflowLink findUnmappedLink(PageflowPage start, PageflowPage end,
-			NavigationCaseType caseFC) {
-		List links = start.getOutlinks();
-		for (int i = 0, n = links.size(); i < n; i++) {
-			PageflowLink link = (PageflowLink) links.get(i);
-			if (link.getSource() == start && link.getTarget() == end) {
-				link.update();
-				if (link.getFCElements().isEmpty()
-						|| link.getFCElements().getData().get(0) == caseFC) {
-					return link;
-				}
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * create a new PFLink object according to fromOutcome attribute
-	 * 
-	 * @param fromOutcome -
-	 *            PFLink's fromOutcome attribute
-	 * @return - new PFLink object
-	 */
-	public PageflowLink createPFLink(String fromOutcome) {
-		PageflowLink link = null;
-		link = PageflowModelManager.getFactory().createPFLink();
-		if (fromOutcome != null && fromOutcome.length() > 0) {
-			link.setOutcome(fromOutcome.trim());
-		}
-		pageflow.getLinks().add(link);
-		return link;
-	}
-
-	/**
-	 * create a new PFLink object according to fromOutcome attribute
-	 * @param start 
-	 * @param target_ 
-	 * @param action 
-	 * 
-	 * @param fromOutcome -
-	 *            PFLink's fromOutcome attribute
-	 * @return - new PFLink object
-	 */
-	public PageflowLink createPFLink(PageflowNode start, PageflowNode target_,
-			String action, String fromOutcome) {
-		Assert.isTrue(start != null && target_ != null);
-		PageflowLink link = null;
-		link = createPFLink(fromOutcome);
-		link.setFromaction(action);
-		link.setSource(start);
-		link.setTarget(target_);
-		start.getOutlinks().add(link);
-		target_.getInlinks().add(link);
-		return link;
-	}
-
-	/**
-	 * Create a new PFPage according to from-view-id
-	 * 
-	 * @param fromViewID -
-	 *            page's from-view-id
-	 * @return the page flow page
-	 */
-	public PageflowPage createPFPage(String fromViewID) {
-		PageflowPage page = PageflowFactory.eINSTANCE.createPFPage();
-		if (fromViewID != null && fromViewID.length() > 0) {
-			page.setPath(fromViewID.trim());
-			page.setName(WebrootUtil.getPageNameFromWebPath(fromViewID.trim()));
-		}
-		this.pageflow.getNodes().add(page);
-		return page;
-	}
-
-	/**
-	 * update pageflow model according to the face-config model
-	 * 
-	 * @author sfshi
-	 * @return true if new rules were added
-	 */
-	public boolean updatePageflowModelFromEMF() {
-		if (pageflow != null && facesConfig != null) {
-			List navigationRulesInFacesconfig = facesConfig.getNavigationRule();
-			clearCaches();
-			// if add new one, we can relayout the current pageflow.
-			return updateNavigationRulesInPageflowFromFacesConfig(navigationRulesInFacesconfig);
-		}
-		return false;
-	}
-
-	void refreshLink(NavigationCaseType caseType) {
-		PageflowLink link = getValidPFLinkInCache(caseType);
-		if (link != null) {
-			removeLink(link);
-		}
-		// update pageflow
-		if (TransformUtil.isValidFacesConfigElement(caseType)) {
-			updatePageflowElements(pageflow, caseType);
-		}
-	}
-
-	public void notifyChanged(Notification msg) {
-		int type = msg.getEventType();
-		switch (type) {
-		case MY_NOTIFICATION_TYPE:
-			setNeedBatchOperations(true);
-			break;
-		case MY_NOTIFICATION_TYPE1:
-			setNeedBatchOperations(false);
-		}
-	}
-
-	/**
-	 * @return true if is listening to notifications and not
-	 * currently in an event
-	 */
-	public boolean isListenToNotify() {
-		return listenToNotify && !isInEvent;
-	}
-
-	/**
-	 * @return true if in event
-	 */
-//	public boolean isInEvent() {
-//		return isInEvent;
-//	}
-
-	/**
-	 * @param isInEvent
-	 */
-	public void setInEvent(boolean isInEvent) {
-		this.isInEvent = isInEvent;
-	}
-
-	/**
-	 * @return the faces config model
-	 */
-	public FacesConfigType getFacesConfig() {
-		return facesConfig;
-	}
-
-	/**
-	 * @return the root page flow
-	 */
-	public Pageflow getPageflow() {
-		return pageflow;
-	}
-
-	/**
-	 * @param value
-	 * @return a new fromViewId with the text content set to value
-	 */
-	public static FromViewIdType createRLFromViewID(String value) {
-		FromViewIdType fromView = FacesConfigFactory.eINSTANCE
-				.createFromViewIdType();
-		fromView.setTextContent(value);
-		return fromView;
-	}
-
-	/**
-	 * @param value
-	 * @return a new to view with the text content set to value
-	 */
-	public static ToViewIdType createFCToViewID(String value) {
-		ToViewIdType toView = FacesConfigFactory.eINSTANCE.createToViewIdType();
-		toView.setTextContent(value);
-		return toView;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/synchronization/PF2FCSynchronizer.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/synchronization/PF2FCSynchronizer.java
deleted file mode 100644
index 88b4953..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/synchronization/PF2FCSynchronizer.java
+++ /dev/null
@@ -1,218 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.synchronization;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.Notifier;
-import org.eclipse.emf.common.notify.impl.AdapterImpl;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage;
-
-/**
- * The adapter that listens to modification of pageflow and updates faces-config
- * as needed.
- * 
- * @author hmeng
- * 
- */
-public class PF2FCSynchronizer extends AdapterImpl {
-	FC2PFTransformer tranformer;
-
-	private final boolean DEBUG = false;
-
-	private static final Logger logger = EditorPlugin
-			.getLogger(PF2FCSynchronizer.class);
-
-	/**
-	 * @param tranformer
-	 */
-	public PF2FCSynchronizer(FC2PFTransformer tranformer) {
-		this.tranformer = tranformer;
-	}
-
-	public Notifier getTarget() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	public void setTarget(Notifier newTarget) {
-		// TODO Auto-generated method stub
-
-	}
-
-	public boolean isAdapterForType(Object type) {
-		return type == PF2FCSynchronizer.class;
-	}
-
-	public void notifyChanged(Notification notification) {
-		if (!isProcessorFor(notification)) {
-			return;
-		}
-		tranformer.setInEvent(true);
-		try {
-			if (!(notification.getNotifier() instanceof PageflowElement)) {
-				return;
-			}
-			processChange(notification);
-		} catch (Exception e) {
-			logger.error(e);
-		} finally {
-			if (notification.getEventType() != Notification.REMOVING_ADAPTER) {
-				tranformer.refreshPFAdapter(tranformer.getPageflow());
-				tranformer.refreshFCAdapter(tranformer.getFacesConfig());
-			}
-			tranformer.setInEvent(false);
-		}
-	}
-
-	private boolean isProcessorFor(Notification notification) {
-		return tranformer.isListenToNotify();
-	}
-
-	private void processChange(Notification notification) {
-		PageflowElement element;
-		element = (PageflowElement) notification.getNotifier();
-		int type = notification.getEventType();
-		switch (type) {
-		case Notification.ADD: {
-			int featureId = notification.getFeatureID(PageflowPackage.class);
-			switch (featureId) {
-			case PageflowPackage.PAGEFLOW_NODE__OUTLINKS:
-				addOutLink(notification, element);
-				break;
-			case PageflowPackage.PAGEFLOW_NODE__INLINKS:
-				addInLink(notification, element);
-				break;
-			case PageflowPackage.PAGEFLOW:
-				break;
-			}
-			if (!tranformer.isNeedBatchOperations()) {
-				updateAndNotify(notification);
-			}
-			break;
-		}
-		case Notification.SET:
-			if (notification.getNewValue() != null) {
-				processSet(notification, element);
-				updateAndNotify(notification);
-			}
-			break;
-		case Notification.REMOVE:
-		case Notification.REMOVE_MANY: {
-			int featureId = notification.getFeatureID(PageflowPackage.class);
-			switch (featureId) {
-			case PageflowPackage.PF_PAGE:
-				// removePage(notification, (PageflowPage) element);
-				break;
-			case PageflowPackage.PAGEFLOW_NODE__OUTLINKS:
-			case PageflowPackage.PAGEFLOW_NODE__INLINKS:
-				removeLink(notification, element);
-				break;
-			}
-			if (!tranformer.isNeedBatchOperations()) {
-				updateAndNotify(notification);
-			}
-			break;
-		}
-		}
-	}
-
-	private void processSet(Notification notification, PageflowElement element) {
-		if (notification.getNewValue() != null) {
-			int value = notification.getFeatureID(PageflowPackage.class);
-			if (element instanceof PageflowPage) {
-				setProperties(notification, element, value);
-			} else if (element instanceof PageflowLink) {
-				if (DEBUG)
-					System.out.println("The link property is changed"); //$NON-NLS-1$
-				setProperties(notification, element, value);
-			}
-		}
-	}
-
-	private void setProperties(Notification notification,
-			PageflowElement element, int value) {
-		if (notification.getFeature() == PageflowPackage.eINSTANCE
-				.getPFLink_Source()) {
-			if (notification.getNewValue() instanceof String) {
-				tranformer.changePFLinkStart((PageflowLink) element,
-						(String) notification.getNewValue());
-			}
-		} else if (notification.getFeature() == PageflowPackage.eINSTANCE
-				.getPFLink_Target()) {
-			if (notification.getNewValue() instanceof String) {
-				tranformer.changePFLinkEnd((PageflowLink) element,
-						(String) notification.getNewValue());
-			}
-		} else {
-			element.getFCElements().set(
-					(EStructuralFeature) notification.getFeature(),
-					notification.getNewValue());
-		}
-	}
-
-	private void addInLink(Notification notification, PageflowElement element) {
-		Object value = notification.getNewValue();
-		PageflowLink link = (PageflowLink) value;
-		if (element instanceof PageflowPage) {
-			PageflowNode source = link.getSource();
-			if (source instanceof PageflowPage) {
-				tranformer.addLink((PageflowPage) source,
-						(PageflowPage) element, link);
-			}
-		}
-
-	}
-
-	private void addOutLink(Notification notification, PageflowElement element) {
-		Object value = notification.getNewValue();
-		// for outLink remove, only target is referenced.
-		PageflowLink link = (PageflowLink) value;
-		if (element instanceof PageflowPage) {
-			PageflowNode target_ = link.getTarget();
-			// page->page
-			if (target_ instanceof PageflowPage) {
-				tranformer.addLink((PageflowPage) element,
-						(PageflowPage) target_, link);
-			}
-		}
-	}
-
-	private void removeLink(Notification notification, PageflowElement element) {
-		Object value = notification.getOldValue();
-		PageflowLink link = (PageflowLink) value;
-
-		if (!link.getFCElements().isEmpty()) {
-			NavigationCaseType caseFC = (NavigationCaseType) link
-					.getFCElements().getData().get(0);
-			if (caseFC != null)
-				tranformer.removeCase(caseFC);
-		}
-		link.update();
-	}
-
-	private void updateAndNotify(Notification notification) {
-		tranformer.getPageflow().notifyModelChanged(
-				new ENotificationImpl((InternalEObject) notification
-						.getNotifier(), Notification.SET,
-						PageflowPackage.PAGEFLOW, null, null));
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/synchronization/PFBatchAdapter.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/synchronization/PFBatchAdapter.java
deleted file mode 100644
index d30e7d1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/synchronization/PFBatchAdapter.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.synchronization;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.impl.AdapterImpl;
-import org.eclipse.gef.editparts.AbstractGraphicalEditPart;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * @author hmeng
- */
-
-public abstract class PFBatchAdapter extends AdapterImpl {
-	private boolean needPostpone;
-
-	AbstractGraphicalEditPart editPart;
-
-	/**
-	 * @param msg
-	 * @return true postponement needed
-	 */
-	public boolean isNeedPostpone(Notification msg) {
-		return needPostpone
-				&& !(msg.getEventType() == FC2PFTransformer.MY_NOTIFICATION_TYPE || msg
-						.getEventType() == FC2PFTransformer.MY_NOTIFICATION_TYPE1);
-	}
-
-	/**
-	 * @param needPostpone
-	 */
-	public void setNeedPostpone(boolean needPostpone) {
-		this.needPostpone = needPostpone;
-	}
-
-	final public void notifyChanged(final Notification msg) {
-		if (!isNeedPostpone(msg)) {
-			if (Thread.currentThread() == PlatformUI.getWorkbench().getDisplay().getThread())
-				doNotifyChanged(msg);
-			else {
-				PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
-					public void run() {
-						doNotifyChanged(msg);
-					}
-				});
-			}
-		}
-	}
-
-	/**
-	 * @param notification
-	 */
-	abstract public void doNotifyChanged(Notification notification);
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/synchronization/TransformUtil.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/synchronization/TransformUtil.java
deleted file mode 100644
index d2b40b9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/synchronization/TransformUtil.java
+++ /dev/null
@@ -1,131 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.synchronization;
-
-import java.util.List;
-
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType;
-import org.eclipse.jst.jsf.facesconfig.emf.FromOutcomeType;
-import org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType;
-import org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage;
-
-/**
- * The util for pageflow and faces-config transforming
- * 
- * @author hmeng
- */
-
-public class TransformUtil {
-
-	/**
-	 * To see if the faces-config element is on a valid hirachy.
-	 * @param object 
-	 * @return true if object's root ancestor is a facesConfig model
-	 */
-	public static boolean isValidFacesConfigElement(EObject object) {
-		EObject parent = EcoreUtil.getRootContainer(object);
-		boolean result = parent instanceof FacesConfigType;
-		return result;
-	}
-
-	/**
-	 * To see if the pageflow element is on a valid hirachy.
-	 * @param element 
-	 * @return true if element's root ancestor is a page flow element
-	 */
-	public static boolean isValidPageflowElement(EObject element) {
-		EObject root = EcoreUtil.getRootContainer(element);
-		boolean result = root instanceof Pageflow;
-		return result;
-	}
-
-	/**
-	 * @param link
-	 * @return true the link is valid
-	 */
-	public static boolean isValidLink(PageflowLink link) {
-		return isValidPageflowElement(link) && link.getSource() != null
-				&& link.getTarget() != null;
-	}
-
-	/**
-	 * @param rule
-	 * @return gets the from-view-id from rule
-	 */
-	public static String getFromViewID(NavigationRuleType rule) {
-		String result = "*"; //$NON-NLS-1$
-		if (rule.getFromViewId() != null) {
-			result = rule.getFromViewId().getTextContent();
-		}
-		return result;
-	}
-
-	/**
-	 * @param navCase
-	 * @return gets the to-view-id from navCase
-	 */
-	public static String getToViewID(NavigationCaseType navCase) {
-		String result = "*"; //$NON-NLS-1$
-		if (navCase.getToViewId() != null) {
-			result = navCase.getToViewId().getTextContent();
-		}
-		return result;
-	}
-
-	/**
-	 * @param path
-	 * @param pageflow
-	 * @return get pageflowpage in pageflow corresponding to path
-	 */
-	public static PageflowPage findPage(String path, Pageflow pageflow) {
-		List nodes = pageflow.getNodes();
-		for (int i = 0; i < nodes.size(); i++) {
-			if (nodes.get(i) instanceof PageflowPage) {
-				if (path != null) {
-					if (path.equals(((PageflowPage) nodes.get(i)).getPath())) {
-						return (PageflowPage) nodes.get(i);
-					}
-				}
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * @param action
-	 * @param outcome
-	 * @param pageflow
-	 * @return find the end case
-	 */
-	public static PageflowNode findCaseEnd(PageflowPage action,
-			FromOutcomeType outcome, Pageflow pageflow) {
-		// TODO: find a case end in pageflow model
-		List links = action.getOutlinks();
-		for (int i = 0; i < links.size(); i++) {
-			PageflowLink link = (PageflowLink) links.get(i);
-			String outcomeStr = ""; //$NON-NLS-1$
-			if (outcome != null) {
-				outcomeStr = outcome.getTextContent();
-			}
-			if (link.getOutcome().equals(outcomeStr)) {
-				return link.getTarget();
-			}
-		}
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/EditPartMarkerUtil.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/EditPartMarkerUtil.java
deleted file mode 100644
index a1e3c64..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/EditPartMarkerUtil.java
+++ /dev/null
@@ -1,216 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.util;
-
-import java.util.Iterator;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement;
-import org.eclipse.jst.jsf.facesconfig.ui.util.WebrootUtil;
-
-/**
- * 
- * Utility class to add and remove edit part markers.
- * 
- * FIXME: add the identification mechanism of the model and remove the
- * dependency on the PageflowElement
- * 
- * @author Xiao-guang Zhang
- * 
- * 
- */
-public class EditPartMarkerUtil {
-
-	/**
-	 * Removes all markers that were created using createMarker()
-	 * 
-	 * @param model -
-	 *            the emf model related with edit part
-	 * @throws CoreException 
-	 */
-	public static void removeAllMarkers(EObject model) throws CoreException {
-		IResource resource = getResource(model);
-
-		if (resource != null) {
-			String markerTypes[] = { IMarker.PROBLEM, IMarker.TASK };
-
-			for (int iMT = 0; iMT < markerTypes.length; iMT++) {
-				IMarker[] markers = resource.findMarkers(markerTypes[iMT],
-						false, IResource.DEPTH_ONE);
-
-				for (int iMark = 0; iMark < markers.length; iMark++) {
-					markers[iMark].delete();
-				}
-			}
-		}
-	}
-
-	/**
-	 * Removes a specific problem marker type with the given severity.
-	 * 
-	 * @param model -
-	 *            the model related with this edit part.
-	 * @param sMarkerType -
-	 *            the marker type, either IMarker.PROBLEM or IMarker.TASK
-	 * @param iSeverity -
-	 *            severity/priority: if sMarkerType is IMarker.PROBLEM, then
-	 *            this value is one of the PROBLEM severities; if sMarkerType is
-	 *            IMarker.TASK, this is a task priority.
-	 * @throws CoreException
-	 *             passed on from IResource.findMarkers()
-	 */
-	public static void removeAllMarkers(EObject model, String sMarkerType,
-			int iSeverity) throws CoreException {
-		IResource resource = getResource(model);
-
-		if (resource != null) {
-			IMarker[] markers = resource.findMarkers(sMarkerType, false,
-					IResource.DEPTH_ONE);
-
-			for (int i = 0; i < markers.length; i++) {
-				IMarker marker = markers[i];
-				int iMarkerSeverity = marker.getAttribute(IMarker.SEVERITY,
-						IMarker.SEVERITY_ERROR);
-
-				if (iMarkerSeverity == iSeverity || iSeverity == -1) {
-					markers[i].delete();
-				}
-			}
-		}
-	}
-
-	/**
-	 * get the resouce according to part or model.
-	 * 
-	 * @param part
-	 * @param model
-	 * @return
-	 */
-	private static IResource getResource(EObject model) {
-		IResource resource = null;
-		resource = WebrootUtil.getResource(model);
-		return resource;
-	}
-
-	/**
-	 * Create a problem marker.
-	 * 
-	 * @param model -
-	 *            the model related with this edit part.
-	 * @param sMarkerType 
-	 * @param severity -
-	 *            the problem severity, one of IMarker.SEVERITY_ERROR,
-	 *            IMarker.SEVERITY_WARNING or IMarker.SEVERITY_INFO
-	 * @param message -
-	 *            the text associated with this marker
-	 * @param location -
-	 *            a unique ID that the application can use to locate the
-	 *            editpart
-	 * 
-	 * that corresponds to this marker; this is typically the DiagramElement's
-	 * ID string
-	 * @throws CoreException
-	 */
-	public static void createMarker(EObject model, String sMarkerType,
-			int severity, String message, String location) throws CoreException {
-		IResource resource = getResource(model);
-
-		if (resource != null) {
-			IMarker marker = resource.createMarker(sMarkerType);
-			marker.setAttribute(IMarker.MESSAGE, message);
-			marker.setAttribute(IMarker.SEVERITY, severity);
-			// The problem view doesn't show the location - only the line number
-			// is shown in the "location" column. Doh!
-			if (location != null && location.length() > 0) {
-				marker.setAttribute(IMarker.LOCATION, location);
-			}
-		}
-	}
-
-	/**
-	 * Removes a specific problem marker type with the given severity.
-	 * 
-	 * @param model -
-	 *            the model related with this edit part.
-	 * @param sMarkerType -
-	 *            the marker type, either IMarker.PROBLEM or IMarker.TASK
-	 * @throws CoreException
-	 *             passed on from IResource.findMarkers()
-	 */
-	public static void removeMarker(EObject model, String sMarkerType)
-			throws CoreException {
-		IResource resource = getResource(model);
-		if (resource != null) {
-			IMarker[] markers = resource.findMarkers(sMarkerType, false,
-					IResource.DEPTH_ONE);
-
-			for (int i = 0; i < markers.length; i++) {
-				IMarker marker = markers[i];
-				// get the marker's location
-				Object id = marker.getAttribute(IMarker.LOCATION);
-
-				if (model instanceof PageflowElement) {
-					if (((PageflowElement) model).getId().equals(id)) {
-						markers[i].delete();
-					}
-				}
-			}
-		}
-	}
-
-	/**
-	 * Searches the hierarchy starting at the given EditPart for a given model
-	 * object ID string (the DiagramElement.ID value) and returns that EditPart
-	 * 
-	 * @param containerPart
-	 * @param id
-	 * @return the EditPart that corresponds to the given ID string, or null if
-	 *         not found
-	 */
-	public static GraphicalEditPart findEditPart(
-			GraphicalEditPart containerPart, String id) {
-		Object model = containerPart.getModel();
-		if (model instanceof PageflowElement) {
-			String modelId = ((PageflowElement) model).getId();
-			if (modelId != null && modelId.equals(id)) {
-				return containerPart;
-			}
-		}
-
-		Iterator iterNode = containerPart.getChildren().iterator();
-		while (iterNode.hasNext()) {
-			GraphicalEditPart child = (GraphicalEditPart) iterNode.next();
-			GraphicalEditPart foundPart = findEditPart(child, id);
-			if (foundPart != null) {
-				return foundPart;
-			}
-		}
-
-		Iterator iterConnection = containerPart.getSourceConnections()
-				.iterator();
-		while (iterConnection.hasNext()) {
-			GraphicalEditPart child = (GraphicalEditPart) iterConnection.next();
-			GraphicalEditPart foundPart = findEditPart(child, id);
-			if (foundPart != null) {
-				return foundPart;
-			}
-		}
-
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/JSPDomAdapter.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/JSPDomAdapter.java
deleted file mode 100644
index 36845dc..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/JSPDomAdapter.java
+++ /dev/null
@@ -1,216 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.util;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.ITaglibContextResolver;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.internal.IStructuredDocumentContextResolverFactory2;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContextFactory;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.wst.sse.core.StructuredModelManager;
-import org.eclipse.wst.sse.core.internal.provisional.IModelManager;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.w3c.dom.Document;
-import org.w3c.dom.NodeList;
-
-/**
- * This class is defined as a simple adapter to JSP DOM model. User can get the
- * taglib prefix, and get the needed element by element tage name, and
- * namespace(prefix) Usage: User should initialize this class instance before
- * using it. Following is a typical example: JSPDomAdapter jspAdapter = new
- * JSPDomAdapter(); IFile jspFile =
- * ResourcesPlugin.getWorkspace().getRoot().getFile(jspPath); if
- * (_jspAdapter.initialize(jspFile)) { //the prefix of JSF HTML TagLib String
- * prefix = _jspAdapter.getTagLibPrefix(JSPDomAdapter.JSF_HTML_TAGLIB); }
- * 
- * @author Xiao-guang Zhang
- */
-public class JSPDomAdapter {
-    /** log instance */
-    private static final Logger log = EditorPlugin
-    .getLogger(JSPDomAdapter.class);
-
-    /** JSP Taglib's tag name */
-    public static String JSP_TAGLIB_TAG = "jsp:directive.taglib"; //$NON-NLS-1$
-
-    /** JSF HTML TagLib name */
-    public static String JSF_HTML_TAGLIB = "http://java.sun.com/jsf/html"; //$NON-NLS-1$
-
-    /** singleton model manager */
-    private static IModelManager modelManager;
-
-    /** source jsp file */
-    private IFile jspFile;
-
-    /** Structured Model of JSP File */
-    private IStructuredModel model;
-
-    /** Root Document (Node) of JSP file */
-    private Document document;
-
-    /**
-     * 
-     */
-    public JSPDomAdapter() {
-        super();
-
-    }
-
-    /**
-     * initialize this adapter to get the StructuredModel for the input file.
-     * At last user should call releaseModel() method to release the Structured Model.
-     * 
-     * @param file -
-     *            JSP file
-     * @return - True means sucessfully load jsp file.
-     */
-    public boolean initialize(final IFile file) {
-        jspFile = file;
-
-        if (jspFile != null && jspFile.exists()) {
-            try {
-                model = getModel(jspFile);
-            } catch (final IOException e) {
-                // PageFlow.JSPDomAdapter.FailToGetStructuredModel = Failed to
-                // get the structured model
-                log.error("PageFlow.JSPDomAdapter.FailToGetStructuredModel", e); //$NON-NLS-1$
-            } catch (final CoreException e) {
-                // PageFlow.JSPDomAdapter.FailToGetStructuredModel = Failed to
-                // get the structured model
-                log.error("PageFlow.JSPDomAdapter.FailToGetStructuredModel", e);//$NON-NLS-1$
-            }
-
-            if (model != null && model instanceof IDOMModel) {
-                return true;
-            }
-        }
-
-        return false;
-    }
-
-    /**
-     * get the prefix for the input taglib URI, e.g.,
-     * http://java.sun.com/jsf/html -> "h"
-     * 
-     * @param taglibURI
-     * @return the prefix
-     */
-    public String getTagLibPrefix(final String taglibURI) {
-        String prefix = null;
-
-        final IStructuredDocument sdocument = model.getStructuredDocument();
-
-        if (sdocument != null)
-        {
-            IStructuredDocumentContext context =
-                IStructuredDocumentContextFactory.INSTANCE.getContext(sdocument, -1);
-            ITaglibContextResolver resolver =
-            IStructuredDocumentContextResolverFactory2.INSTANCE.getTaglibContextResolverFromDelegates(context);
-            prefix = resolver.getTagPrefixForURI(taglibURI);
-        }
-
-        return prefix;
-    }
-
-    /**
-     * get the elements by the namespace and its tag name, e.g., h and
-     * commandButton.
-     * 
-     * @param namespace -
-     *            namespace for the taglib, e.g., h for
-     *            http://java.sun.com/jsf/html
-     * @param elementName -
-     *            element Tag Name, e.g., h
-     * @return - Element Node list.
-     */
-    public List getElementsByTagNameNS(final String namespace, final String elementName) {
-        List nodes = null;
-
-        if (getDocument() != null) {
-            NodeList listNodes = null;
-            if (namespace != null) {
-                listNodes = getDocument().getElementsByTagName(
-                        namespace + ":" + elementName); //$NON-NLS-1$
-            } else {
-                listNodes = getDocument().getElementsByTagName(elementName);
-            }
-
-            if (listNodes != null && listNodes.getLength() > 0) {
-                nodes = new ArrayList();
-                for (int i = 0; i < listNodes.getLength(); i++) {
-                    nodes.add(listNodes.item(i));
-                }
-            }
-        }
-        return nodes;
-    }
-
-    /**
-     * get the singleton model manager.
-     * 
-     * @return
-     */
-    private IModelManager getModelManager() {
-        if (modelManager == null) {
-            modelManager = StructuredModelManager.getModelManager();
-        }
-        return modelManager;
-    }
-
-    /**
-     * get the structured model for the JSP file
-     * 
-     * @param file -
-     *            JSP File
-     * @return - IStructuredModel
-     * @throws IOException
-     * @throws CoreException
-     */
-    private IStructuredModel getModel(final IFile file) throws IOException,
-    CoreException {
-        return getModelManager().getModelForRead(file);
-    }
-
-    /**
-     * get the root docuement for the StructuredModel
-     * 
-     * @return
-     */
-    private Document getDocument() {
-        if (document == null) {
-            if (model != null && model instanceof IDOMModel) {
-                document = ((IDOMModel) model).getDocument();
-            }
-        }
-        return document;
-    }
-
-
-    /**
-     * signal we are done with the model
-     */
-    public void releaseModel() {
-        if (model != null) {
-            model.releaseFromRead();
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/JSPUtil.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/JSPUtil.java
deleted file mode 100644
index 7b1414b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/JSPUtil.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.util;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-
-/**
- * utility class for JSP related information.
- * 
- * @author Yang Liu
- */
-public class JSPUtil {
-
-	/**
-	 * get the action list in the jsp file
-	 * @param jspFileName 
-	 * 
-	 * @return - action list
-	 */
-	public static List getActionListInJSPFile(String jspFileName) {
-		/** jsp dom adapter */
-
-        List actions = new ArrayList();
-
-        // convert the relative directory to project directory, e.g., /a.jsp to
-        // /testproject/webroot/a.sjp
-        String physicalJspPath = jspFileName;
-        if (physicalJspPath != null && physicalJspPath.length() > 0)
-        {
-            IPath jspPath = new Path(physicalJspPath);
-            IFile jspFile = ResourcesPlugin.getWorkspace().getRoot().getFile(
-                    jspPath);
-
-            if (jspFile != null && jspFile.exists())
-            {
-                JSPDomAdapter jspAdapter = null;
-                try
-                {
-                    jspAdapter = new JSPDomAdapter();
-                    // initialize the adapter to initialize the model of jsp
-                    if (jspAdapter.initialize(jspFile))
-                    {
-                        // the prefix of JSF HTML TagLib
-                        String prefix = jspAdapter
-                                .getTagLibPrefix(JSPDomAdapter.JSF_HTML_TAGLIB);
-
-                        // get the command butonns
-                        List buttonActions = jspAdapter.getElementsByTagNameNS(
-                                prefix, "commandButton");//$NON-NLS-1$
-                        if (buttonActions != null)
-                            actions.addAll(buttonActions);
-
-                        // get the command links
-                        List linkActions = jspAdapter.getElementsByTagNameNS(
-                                prefix, "commandLink");//$NON-NLS-1$
-                        if (linkActions != null)
-                            actions.addAll(linkActions);
-                    }
-                }
-                finally
-                {
-                    if (jspAdapter != null)
-                    {
-                        jspAdapter.releaseModel();
-                    }
-                }
-            }
-        }
-        return actions;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/ModelCreationFactory.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/ModelCreationFactory.java
deleted file mode 100644
index b869353..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/ModelCreationFactory.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.util;
-
-import org.eclipse.gef.requests.CreationFactory;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowFactory;
-
-/**
- * This class implements the CreationFactory used by the CreationTool. It in
- * turn uses the EMF-generated factories to create the model instances
- * 
- * @author Xiao-guang Zhang
- */
-public class ModelCreationFactory implements CreationFactory {
-	private Class targetClass;
-
-	/**
-	 * @param targetClass
-	 */
-	public ModelCreationFactory(Class targetClass) {
-		this.targetClass = targetClass;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.requests.CreationFactory#getNewObject()
-	 */
-	public Object getNewObject() {
-		PageflowFactory factory = PageflowModelManager.getFactory();
-
-		Object result = null;
-
-		if (targetClass.equals(PageflowLink.class)) {
-			result = factory.createPFLink();
-
-		} else if (targetClass.equals(PageflowPage.class)) {
-			result = factory.createPFPage();
-		}
-
-		return result;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.requests.CreationFactory#getObjectType()
-	 */
-	public Object getObjectType() {
-		return targetClass;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/PageflowAdapterFactory.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/PageflowAdapterFactory.java
deleted file mode 100644
index 8da99bf..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/PageflowAdapterFactory.java
+++ /dev/null
@@ -1,256 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.util;
-
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.common.notify.Notifier;
-import org.eclipse.emf.common.notify.impl.AdapterFactoryImpl;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLinkBendpoint;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage;
-
-/**
- * <!-- begin-user-doc --> The <b>Adapter Factory</b> for the model. It
- * provides an adapter <code>createXXX</code> method for each class of the
- * model. <!-- end-user-doc -->
- * 
- * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage
- * @generated
- */
-// FIXME: this appears to be a dead class.
-public class PageflowAdapterFactory extends AdapterFactoryImpl {
-	/**
-	 * The cached model package. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected static PageflowPackage modelPackage;
-
-	/**
-	 * Creates an instance of the adapter factory. <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public PageflowAdapterFactory() {
-		if (modelPackage == null) {
-			modelPackage = PageflowPackage.eINSTANCE;
-		}
-	}
-
-	/**
-	 * Returns whether this factory is applicable for the type of the object.
-	 * <!-- begin-user-doc --> This implementation returns <code>true</code>
-	 * if the object is either the model's package or is an instance object of
-	 * the model. <!-- end-user-doc -->
-	 * 
-	 * @return whether this factory is applicable for the type of the object.
-	 * @generated
-	 */
-	public boolean isFactoryForType(Object object) {
-		if (object == modelPackage) {
-			return true;
-		}
-		if (object instanceof EObject) {
-			return ((EObject) object).eClass().getEPackage() == modelPackage;
-		}
-		return false;
-	}
-
-	/**
-	 * The switch the delegates to the <code>createXXX</code> methods. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected PageflowSwitch modelSwitch = new PageflowSwitch() {
-		public Object casePageflow(Pageflow object) {
-			return createPageflowAdapter();
-		}
-
-		public Object casePageflowNode(PageflowNode object) {
-			return createPageflowNodeAdapter();
-		}
-
-		public Object casePFLink(PageflowLink object) {
-			return createPFLinkAdapter();
-		}
-
-		public Object casePageflowElement(PageflowElement object) {
-			return createPageflowElementAdapter();
-		}
-
-		public Object casePFPage(PageflowPage object) {
-			return createPFPageAdapter();
-		}
-
-		public Object casePFLinkBendpoint(PageflowLinkBendpoint object) {
-			return createPFLinkBendpointAdapter();
-		}
-
-		public Object defaultCase(EObject object) {
-			return createEObjectAdapter();
-		}
-	};
-
-	/**
-	 * Creates an adapter for the <code>target</code>. <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-	 * 
-	 * @param target
-	 *            the object to adapt.
-	 * @return the adapter for the <code>target</code>.
-	 * @generated
-	 */
-	public Adapter createAdapter(Notifier target) {
-		return (Adapter) modelSwitch.doSwitch((EObject) target);
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow <em>Pageflow</em>}'.
-	 * <!-- begin-user-doc --> This default implementation returns null so that
-	 * we can easily ignore cases; it's useful to ignore a case when inheritance
-	 * will catch all the cases anyway. <!-- end-user-doc -->
-	 * 
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow
-	 * @generated
-	 */
-	public Adapter createPageflowAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode <em>Node</em>}'.
-	 * <!-- begin-user-doc --> This default implementation returns null so that
-	 * we can easily ignore cases; it's useful to ignore a case when inheritance
-	 * will catch all the cases anyway. <!-- end-user-doc -->
-	 * 
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode
-	 * @generated
-	 */
-	public Adapter createPageflowNodeAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink <em>PF Link</em>}'.
-	 * <!-- begin-user-doc --> This default implementation returns null so that
-	 * we can easily ignore cases; it's useful to ignore a case when inheritance
-	 * will catch all the cases anyway. <!-- end-user-doc -->
-	 * 
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink
-	 * @generated
-	 */
-	public Adapter createPFLinkAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement <em>Element</em>}'.
-	 * <!-- begin-user-doc --> This default implementation returns null so that
-	 * we can easily ignore cases; it's useful to ignore a case when inheritance
-	 * will catch all the cases anyway. <!-- end-user-doc -->
-	 * 
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement
-	 * @generated
-	 */
-	public Adapter createPageflowElementAdapter() {
-		return null;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> This default implementation returns null so that
-	 * we can easily ignore cases; it's useful to ignore a case when inheritance
-	 * will catch all the cases anyway. <!-- end-user-doc -->
-	 * 
-	 * @return the new adapter.
-	 * @generated
-	 */
-	public Adapter createPFActionAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage <em>PF Page</em>}'.
-	 * <!-- begin-user-doc --> This default implementation returns null so that
-	 * we can easily ignore cases; it's useful to ignore a case when inheritance
-	 * will catch all the cases anyway. <!-- end-user-doc -->
-	 * 
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage
-	 * @generated
-	 */
-	public Adapter createPFPageAdapter() {
-		return null;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> This default implementation returns null so that
-	 * we can easily ignore cases; it's useful to ignore a case when inheritance
-	 * will catch all the cases anyway. <!-- end-user-doc -->
-	 * 
-	 * @return the new adapter.
-	 * @generated
-	 */
-	public Adapter createPFBeginAdapter() {
-		return null;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> This default implementation returns null so that
-	 * we can easily ignore cases; it's useful to ignore a case when inheritance
-	 * will catch all the cases anyway. <!-- end-user-doc -->
-	 * 
-	 * @return the new adapter.
-	 * @generated
-	 */
-	public Adapter createPFEndAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLinkBendpoint <em>PF Link Bendpoint</em>}'.
-	 * <!-- begin-user-doc --> This default implementation returns null so that
-	 * we can easily ignore cases; it's useful to ignore a case when inheritance
-	 * will catch all the cases anyway. <!-- end-user-doc -->
-	 * 
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLinkBendpoint
-	 * @generated
-	 */
-	public Adapter createPFLinkBendpointAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for the default case. <!-- begin-user-doc --> This
-	 * default implementation returns null. <!-- end-user-doc -->
-	 * 
-	 * @return the new adapter.
-	 * @generated
-	 */
-	public Adapter createEObjectAdapter() {
-		return null;
-	}
-
-}
-// PageflowAdapterFactory
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/PageflowAnnotationUtil.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/PageflowAnnotationUtil.java
deleted file mode 100644
index b6a2362..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/PageflowAnnotationUtil.java
+++ /dev/null
@@ -1,168 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.util;
-
-import java.util.Iterator;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.jface.text.source.Annotation;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart.IAnnotationEditPart;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart.PFValidator;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart.PageflowElementEditPart;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart.PageflowLinkEditPart;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart.PageflowNodeEditPart;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage;
-
-/**
- * This class can be used to add annotation for the current pageflow model and
- * decoration for view.
- * 
- * @author Xiao-guang Zhang
- * 
- * 
- */
-public class PageflowAnnotationUtil {
-
-    /**
-     * 
-     * validate the pageflow and its edit part
-     * 
-     * @param containerPart -
-     *            it can be null, then the edit part will not be updated
-     */
-    public static void validatePageflow(final GraphicalEditPart containerPart) {
-        if (containerPart == null) {
-            return;
-        }
-
-        // removeAllAnnotations(containerPart);
-
-        // validate the nodes including page and actions.
-        final Iterator iterChild = containerPart.getChildren().iterator();
-        while (iterChild.hasNext()) {
-
-            final PageflowElementEditPart element = (PageflowElementEditPart) iterChild
-            .next();
-            // String errorMessage = null;
-            if (element instanceof PFValidator) {
-                ((PFValidator) element).validate();
-            }
-            // if (element.getModel() instanceof PageflowPage) {
-            // errorMessage = PageflowValidation.getInstance().getNotifyMessage(
-            // (PageflowPage) element.getModel());
-            // }
-
-            // if (errorMessage != null) {
-            // addAnnotation(element, errorMessage);
-            // } else {
-            // removeAnnotation(element);
-            // }
-
-            // validate the connections.
-            final Iterator iterLinks = element.getSourceConnections().iterator();
-            while (iterLinks.hasNext()) {
-                final PageflowLinkEditPart link = (PageflowLinkEditPart) iterLinks
-                .next();
-                link.validate();
-                // validateLink(link);
-            }
-        }
-
-    }
-
-    /**
-     * validate the page based on model and its's edit part.
-     * 
-     * @param pagePart -
-     *            it can be null, then the edit part will not be updated
-     */
-    public static void validatePage(final PageflowNodeEditPart pagePart) {
-        if (pagePart != null && pagePart.getParent() != null) {
-            return;
-        }
-
-        String errorMessage = null;
-
-        removeAnnotation(pagePart);
-
-        errorMessage = PageflowValidation.getInstance().getNotifyMessage(
-                (PageflowPage) pagePart.getModel());
-
-        if (errorMessage != null) {
-            addAnnotation(pagePart, errorMessage);
-        } else {
-            removeAnnotation(pagePart);
-        }
-
-        // validate the connections.
-        // Iterator iterLinks = pagePart.getSourceConnections().iterator();
-        // while (iterLinks.hasNext()) {
-        // PageflowLinkEditPart link = (PageflowLinkEditPart) iterLinks.next();
-        //
-        // validateLink(link);
-        // }
-    }
-
-    /**
-     * validate the link based on model and its's edit part.
-     * 
-     * @param linkPart -
-     *            it can be null, then the edit part will not be updated
-     */
-    public static void validateLink(final PageflowLinkEditPart linkPart) {
-        if (linkPart != null && linkPart.getParent() != null) {
-            String errorMessage = null;
-
-            removeAnnotation(linkPart);
-
-            errorMessage = PageflowValidation.getInstance().isValidLink(
-                    (PageflowLink) linkPart.getModel());
-
-            if (errorMessage != null) {
-                addAnnotation(linkPart, errorMessage);
-            } else {
-                removeAnnotation(linkPart);
-            }
-        }
-    }
-
-    /**
-     * add a marker with IMarker.PROBLEM type, IMarker.SEVERITY_ERROR severity,
-     * and message.
-     * 
-     * @param editPart
-     * @param model
-     * @param message
-     */
-    private static void addAnnotation(final GraphicalEditPart editPart, final String message) {
-        if (editPart != null && editPart instanceof IAnnotationEditPart) {
-            final Annotation annotation = new Annotation(IMarker.PROBLEM, false,
-                    message);
-            ((IAnnotationEditPart) editPart).addAnnotation(annotation);
-        }
-    }
-
-    /**
-     * remove a marker
-     * 
-     * @param editPart
-     * @param model
-     */
-    private static void removeAnnotation(final GraphicalEditPart editPart) {
-        if (editPart != null && editPart instanceof IAnnotationEditPart) {
-            ((IAnnotationEditPart) editPart).removeAnnotation();
-        }
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/PageflowModelManager.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/PageflowModelManager.java
deleted file mode 100644
index 5e2689a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/PageflowModelManager.java
+++ /dev/null
@@ -1,279 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.util;
-
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.resource.ResourceSet;
-import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
-import org.eclipse.emf.ecore.xmi.XMLResource;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowFactory;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowPackageImpl;
-
-/**
- * Drives the model. Acts as the model entry point, including create, load, save
- * operations.
- * 
- * @author Xiao-guang Zhang
- */
-public class PageflowModelManager {
-	/**
-	 * In EMF, a resource provides the way to have access to the model content.
-	 */
-	private Resource resourcePageflow = null;
-
-	/**
-	 * the path of current pageflow model resource provides the way to have
-	 * access to the model content.
-	 */
-	private IPath pathPageflow = null;
-
-	/**
-	 * Contains the factory associated with the model.
-	 */
-	private static PageflowFactory pageflowFactory = null;
-
-	/**
-	 * Gives access to the top level pageflow contained in the resource.
-	 */
-	private Pageflow pageflow = null;
-
-	/**
-	 * resource set
-	 */
-	private ResourceSet resourceSet = null;
-
-	/** unicode encoding UTF-8 support */
-	private static HashMap defaultSaveOptions = new HashMap();
-
-	static {
-		defaultSaveOptions.put(XMLResource.OPTION_ENCODING, "UTF-8"); //$NON-NLS-1$
-	}
-
-	/**
-	 * Uses lazy initialization.
-	 * 
-	 * @param path -
-	 *            pageflow file name
-	 * @return the resource containing the pageflow
-	 */
-	public Resource getResource(IPath path) {
-		if (resourcePageflow == null) {
-			pathPageflow = path;
-			ResourceSet resSet = getResourceSet();
-			resourcePageflow = resSet.getResource(URI.createPlatformResourceURI(path
-					.toString(), false), true);
-		}
-
-		return resourcePageflow;
-	}
-
-	/**
-	 * 
-	 * @return the top level pageflow model
-	 */
-	public Pageflow getModel() {
-		if (null == pageflow) {
-			EList l = resourcePageflow.getContents();
-			Iterator i = l.iterator();
-			while (i.hasNext()) {
-				Object o = i.next();
-				if (o instanceof Pageflow) {
-					pageflow = (Pageflow) o;
-				}
-			}
-		}
-		return pageflow;
-	}
-
-	/**
-	 * Creates a resource to contain the network. The resource file does not
-	 * exist yet.
-	 * 
-	 * @param path
-	 * @return
-	 */
-	private Resource createResource(IPath path) {
-		if (resourcePageflow == null) {
-			pathPageflow = path;
-			ResourceSet resSet = getResourceSet();
-			resourcePageflow = resSet.createResource(URI.createPlatformResourceURI(path
-					.toString(), false));
-		}
-		return resourcePageflow;
-	}
-
-	/**
-	 * Returns the resource set.
-	 * 
-	 * @param
-	 * @return
-	 */
-	private ResourceSet getResourceSet() {
-		if (null == resourceSet) {
-			// Initialize the pageflow package, this line can not be removed.
-			PageflowPackageImpl.init();
-			// Register the XML resource factory for the .pageflow extension
-			Resource.Factory.Registry reg = Resource.Factory.Registry.INSTANCE;
-			Map regMap = reg.getExtensionToFactoryMap();
-			// m.put("pageflow", new XMIResourceFactoryImpl());
-			regMap.put("pageflow", new PageflowResourceFactoryImpl()); //$NON-NLS-1$
-
-			resourceSet = new ResourceSetImpl();
-		}
-
-		return resourceSet;
-	}
-
-	/**
-	 * Returns the factory associated with the model. Object creation are made
-	 * through that factory.
-	 * 
-	 * @return - pageflow factory
-	 */
-	static public PageflowFactory getFactory() {
-		if (pageflowFactory == null) {
-			// Access the factory (needed to create instances)
-			Map registry = EPackage.Registry.INSTANCE;
-			String pageflowURI = PageflowPackage.eNS_URI;
-			PageflowPackage pageflowPackage = (PageflowPackage) registry
-					.get(pageflowURI);
-			pageflowFactory = pageflowPackage.getPageflowFactory();
-		}
-		return pageflowFactory;
-	}
-
-	/**
-	 * Creates a new pageflow model with begin and end nodes.
-	 * 
-	 * @param path -
-	 *            the new pageflow file name
-	 * @return - new pageflow model
-	 */
-	public Pageflow createPageflow(IPath path) {
-		createResource(path);
-		// Create a new pageflow model
-		Map registry = EPackage.Registry.INSTANCE;
-		String pageflowURI = PageflowPackage.eNS_URI;
-		PageflowPackage nPackage = (PageflowPackage) registry.get(pageflowURI);
-		PageflowFactory nFactory = nPackage.getPageflowFactory();
-		pageflow = nFactory.createPageflow();
-
-		resourcePageflow.getContents().add(pageflow);
-		return pageflow;
-	}
-
-	/**
-	 * Loads the content of the model from the file.
-	 * 
-	 * @param path
-	 */
-	public void load(IPath path) {
-		getResource(path);
-	}
-
-	/**
-	 * reloads the content of the model from the file.
-	 * 
-	 * @param path
-	 */
-	public void reload(IPath path) {
-		getResource(path).unload();
-		load(path);
-	}
-
-	/**
-	 * Saves the content of the model to the file.
-	 * 
-	 * @param path
-	 * @throws IOException 
-	 */
-	public void save(final IPath path) throws IOException {
-		if (!pathPageflow.toString().equalsIgnoreCase(path.toString())) {
-			pathPageflow = path;
-			URI fileURI = URI.createPlatformResourceURI(path.toString(), false);
-			resourcePageflow.setURI(fileURI);
-		}
-		resourcePageflow.save(defaultSaveOptions);
-	}
-
-	/**
-	 * get the file path of current pageflow resource
-	 * 
-	 * @return - the file path
-	 */
-	public IPath getPath() {
-		return pathPageflow;
-	}
-
-	/**
-	 * @param webPath
-	 * @return found page node according the web path.
-	 */
-	public PageflowPage foundPage(String webPath) {
-		PageflowPage page = null;
-
-		if (getModel() != null) {
-			Iterator iterNodes = getModel().getNodes().iterator();
-			while (iterNodes.hasNext()) {
-				PageflowNode node = (PageflowNode) iterNodes.next();
-				if (node instanceof PageflowPage) {
-					if (((PageflowPage) node).getPath().equalsIgnoreCase(webPath)) {
-						page = (PageflowPage) node;
-						break;
-					}
-				}
-			}
-		}
-
-		return page;
-	}
-
-	/**
-	 * 
-	 * Build a path for the resource in the .metadata directory given the path
-	 * of the model resource. For example, given a model resource path of
-	 * \test\folder\filename.ext the resulting Pageflow path name will be
-	 * \test\.metadata\folder\filename.pageflow
-	 * 
-	 * @param pathFacesConfig -
-	 *            faces-config file path.
-	 * 
-	 * @return the ipath
-	 */
-	public static IPath makePageflowPath(IPath pathFacesConfig) {
-		IPath pageflowPath;
-		String[] segs = pathFacesConfig.removeFileExtension().segments();
-		pageflowPath = new Path(segs[0]).makeAbsolute();
-		pageflowPath = pageflowPath.append(".metadata"); //$NON-NLS-1$
-		for (int i = 1; i < segs.length; i++) {
-			pageflowPath = pageflowPath.append(segs[i]);
-		}
-		// pageflowPath.removeFileExtension();
-		pageflowPath = pageflowPath.addFileExtension("pageflow"); //$NON-NLS-1$
-		return pageflowPath;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/PageflowResourceFactory.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/PageflowResourceFactory.java
deleted file mode 100644
index 24f995c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/PageflowResourceFactory.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.util;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.gef.requests.CreationFactory;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowFactory;
-import org.eclipse.jst.jsf.facesconfig.ui.util.WebrootUtil;
-
-/**
- * 
- * This is the Page Flow Resource Factory for resource drag and drop
- * 
- * @author Xiao-guang Zhang
- */
-public class PageflowResourceFactory implements CreationFactory {
-	/** resource */
-	private IResource resource;
-
-	/**
-	 * @param resource
-	 */
-	public PageflowResourceFactory(IResource resource) {
-		this.resource = resource;
-	}
-
-	/*
-	 * (non-javadoc)
-	 * 
-	 * @see Factory#getNewObject()
-	 */
-	public Object getNewObject() {
-		if (null == resource) {
-			return null;
-		}
-
-		String strWebPath = WebrootUtil.getWebPath(resource.getFullPath());
-		if (strWebPath.length() > 0) {
-			PageflowFactory factory = PageflowModelManager.getFactory();
-			Object result = factory.createPFPage();
-			PageflowPage page = (PageflowPage) result;
-			page.setPath(strWebPath);
-			page.setName(WebrootUtil.getPageNameFromWebPath(strWebPath));
-			return page;
-		}
-        
-        EditorPlugin
-        		.getAlerts()
-        		.error(
-        				"Pageflow.Error.DNDResourceTitle", //$NON-NLS-1$
-        				EditorPlugin
-        						.getResourceString("Pageflow.Error.InvalidResource") //$NON-NLS-1$
-        						+ resource.getName());
-
-		return null;
-	}
-
-	/*
-	 * (non-javadoc)
-	 * 
-	 * @see Factory#getObjectType()
-	 */
-	public Object getObjectType() {
-		return resource;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/PageflowResourceFactoryImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/PageflowResourceFactoryImpl.java
deleted file mode 100644
index 1181474..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/PageflowResourceFactoryImpl.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.util;
-
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.xmi.impl.XMLResourceFactoryImpl;
-
-/**
- * The <b>Resource Factory</b> associated with the package.
- * 
- * @author Xiao-guang Zhang
- */
-public class PageflowResourceFactoryImpl extends XMLResourceFactoryImpl {
-	/**
-	 * Creates an instance of the resource factory.
-	 */
-	public PageflowResourceFactoryImpl() {
-		super();
-	}
-
-	/**
-	 * Creates an instance of the resource.
-	 */
-	public Resource createResource(URI uri) {
-		Resource result = new PageflowResourceImpl(uri);
-		return result;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/PageflowResourceImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/PageflowResourceImpl.java
deleted file mode 100644
index 07e13ee..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/PageflowResourceImpl.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.util;
-
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.xmi.impl.XMLResourceImpl;
-
-/**
- * 
- * The <b>Resource </b> associated with the package.
- * 
- * @author Xiao-guang Zhang
- */
-public class PageflowResourceImpl extends XMLResourceImpl {
-	/**
-	 * Creates an instance of the resource. <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * 
-	 * @param uri
-	 *            the URI of the new resource.
-	 * @generated
-	 */
-	public PageflowResourceImpl(URI uri) {
-		super(uri);
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/PageflowSwitch.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/PageflowSwitch.java
deleted file mode 100644
index 3487f12..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/PageflowSwitch.java
+++ /dev/null
@@ -1,262 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.util;
-
-import java.util.List;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLinkBendpoint;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage;
-
-/**
- * <!-- begin-user-doc --> The <b>Switch</b> for the model's inheritance
- * hierarchy. It supports the call {@link #doSwitch(EObject)} to invoke
- * the <code>caseXXX</code> method for each class of the model, starting with
- * the actual class of the object and proceeding up the inheritance hierarchy
- * until a non-null result is returned, which is the result of the switch. <!--
- * end-user-doc -->
- * 
- * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage
- * @generated
- */
-public class PageflowSwitch {
-	/**
-	 * The cached model package <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected static PageflowPackage modelPackage;
-
-	/**
-	 * Creates an instance of the switch. <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public PageflowSwitch() {
-		if (modelPackage == null) {
-			modelPackage = PageflowPackage.eINSTANCE;
-		}
-	}
-
-	/**
-	 * Calls <code>caseXXX</code> for each class of the model until one
-	 * returns a non null result; it yields that result. 
-	 * 
-	 * <!-- begin-user-doc -->
-	 * @param theEObject 
-	 * 
-	 * @return the first non-null result returned by a <code>caseXXX</code>
-	 *         call.
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object doSwitch(EObject theEObject) {
-		return doSwitch(theEObject.eClass(), theEObject);
-	}
-
-	/**
-	 * Calls <code>caseXXX</code> for each class of the model until one
-	 * returns a non null result; it yields that result. 
-	 * 
-	 * <!-- begin-user-doc -->
-	 * @param theEClass 
-	 * @param theEObject 
-	 * 
-	 * @return the first non-null result returned by a <code>caseXXX</code>
-	 *         call.
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected Object doSwitch(EClass theEClass, EObject theEObject) {
-		if (theEClass.eContainer() == modelPackage) {
-			return doSwitch(theEClass.getClassifierID(), theEObject);
-		}
-        List eSuperTypes = theEClass.getESuperTypes();
-        return eSuperTypes.isEmpty() ? defaultCase(theEObject) : doSwitch(
-        		(EClass) eSuperTypes.get(0), theEObject);
-	}
-
-	/**
-	 * Calls <code>caseXXX</code> for each class of the model until one
-	 * returns a non null result; it yields that result. 
-	 * 
-	 * <!-- begin-user-doc -->
-	 * @param classifierID 
-	 * @param theEObject 
-	 * 
-	 * @return the first non-null result returned by a <code>caseXXX</code>
-	 *         call.
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected Object doSwitch(int classifierID, EObject theEObject) {
-		switch (classifierID) {
-		case PageflowPackage.PAGEFLOW: {
-			Pageflow pageflow = (Pageflow) theEObject;
-			Object result = casePageflow(pageflow);
-			if (result == null)
-				result = casePageflowElement(pageflow);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case PageflowPackage.PF_LINK: {
-			PageflowLink pfLink = (PageflowLink) theEObject;
-			Object result = casePFLink(pfLink);
-			if (result == null)
-				result = casePageflowElement(pfLink);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-
-		case PageflowPackage.PF_PAGE: {
-			PageflowPage pfPage = (PageflowPage) theEObject;
-			Object result = casePFPage(pfPage);
-			if (result == null)
-				result = casePageflowNode(pfPage);
-			if (result == null)
-				result = casePageflowElement(pfPage);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-
-		case PageflowPackage.PF_LINK_BENDPOINT: {
-			PageflowLinkBendpoint pfLinkBendpoint = (PageflowLinkBendpoint) theEObject;
-			Object result = casePFLinkBendpoint(pfLinkBendpoint);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		default:
-			return defaultCase(theEObject);
-		}
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Pageflow</em>'.
-	 * <!-- begin-user-doc --> This implementation returns null; returning a
-	 * non-null result will terminate the switch. <!-- end-user-doc -->
-	 * 
-	 * @param object
-	 *            the target of the switch.
-	 * @return the result of interpretting the object as an instance of '<em>Pageflow</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object casePageflow(Pageflow object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Node</em>'.
-	 * <!-- begin-user-doc --> This implementation returns null; returning a
-	 * non-null result will terminate the switch. <!-- end-user-doc -->
-	 * 
-	 * @param object
-	 *            the target of the switch.
-	 * @return the result of interpretting the object as an instance of '<em>Node</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object casePageflowNode(PageflowNode object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>PF Link</em>'.
-	 * <!-- begin-user-doc --> This implementation returns null; returning a
-	 * non-null result will terminate the switch. <!-- end-user-doc -->
-	 * 
-	 * @param object
-	 *            the target of the switch.
-	 * @return the result of interpretting the object as an instance of '<em>PF Link</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object casePFLink(PageflowLink object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Element</em>'.
-	 * <!-- begin-user-doc --> This implementation returns null; returning a
-	 * non-null result will terminate the switch. <!-- end-user-doc -->
-	 * 
-	 * @param object
-	 *            the target of the switch.
-	 * @return the result of interpretting the object as an instance of '<em>Element</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object casePageflowElement(PageflowElement object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>PF Page</em>'.
-	 * <!-- begin-user-doc --> This implementation returns null; returning a
-	 * non-null result will terminate the switch. <!-- end-user-doc -->
-	 * 
-	 * @param object
-	 *            the target of the switch.
-	 * @return the result of interpretting the object as an instance of '<em>PF Page</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object casePFPage(PageflowPage object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>PF Link Bendpoint</em>'.
-	 * <!-- begin-user-doc --> This implementation returns null; returning a
-	 * non-null result will terminate the switch. <!-- end-user-doc -->
-	 * 
-	 * @param object
-	 *            the target of the switch.
-	 * @return the result of interpretting the object as an instance of '<em>PF Link Bendpoint</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object casePFLinkBendpoint(PageflowLinkBendpoint object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>EObject</em>'.
-	 * <!-- begin-user-doc --> This implementation returns null; returning a
-	 * non-null result will terminate the switch, but this is the last case
-	 * anyway. <!-- end-user-doc -->
-	 * 
-	 * @param object
-	 *            the target of the switch.
-	 * @return the result of interpretting the object as an instance of '<em>EObject</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject)
-	 * @generated
-	 */
-	public Object defaultCase(EObject object) {
-		return null;
-	}
-
-}
-// PageflowSwitch
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/PageflowTransform.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/PageflowTransform.java
deleted file mode 100644
index 327af05..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/PageflowTransform.java
+++ /dev/null
@@ -1,164 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.util;
-
-import org.eclipse.jst.jsf.facesconfig.emf.DescriptionType;
-import org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.IconType;
-import org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType;
-import org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage;
-
-/**
- * The tranform between pageflow and navigation rules in faces-config file.
- * 
- * @author Xiao-guang Zhang
- */
-public class PageflowTransform {
-
-	/** The shared singleton instance. */
-	private static PageflowTransform transform;
-
-	private PageflowTransform() {
-		// private contructor
-	}
-
-	/**
-	 * Returns the shared singleton instance.
-	 * @return  the singleton transform instance
-	 */
-	public static PageflowTransform getInstance() {
-		if (transform == null) {
-			transform = new PageflowTransform();
-		}
-		return transform;
-	}
-
-	/**
-	 * Update source PFPage with Faces-config model.
-	 * 
-	 * @param sourcePage
-	 * @param navigationRuleFC
-	 * @author sfshi
-	 */
-	public void updatePageflowSourcePage(PageflowPage sourcePage,
-			NavigationRuleType navigationRuleFC) {
-		// set the descriiption of link
-		if (navigationRuleFC.getDescription() != null
-				&& navigationRuleFC.getDescription().size() > 0) {
-			String description = ((DescriptionType) navigationRuleFC
-					.getDescription().get(0)).getTextContent();
-			sourcePage.setComment(description);
-		}
-		// set the display-name of link
-		if (navigationRuleFC.getDisplayName() != null
-				&& navigationRuleFC.getDisplayName().size() > 0) {
-			String displayName = ((DisplayNameType) navigationRuleFC
-					.getDisplayName().get(0)).getTextContent();
-			sourcePage.setName(displayName);
-		}
-
-		// Set the icon of link
-		if (navigationRuleFC.getIcon() != null
-				&& navigationRuleFC.getIcon().size() > 0) {
-			boolean largeUpdated = false;
-			boolean smallUpdated = false;
-			for (int i = 0; i < navigationRuleFC.getIcon().size(); i++) {
-				IconType icon = (IconType) navigationRuleFC.getIcon().get(i);
-				if (!largeUpdated && icon.getLargeIcon() != null) {
-					sourcePage.setLargeicon(icon.getLargeIcon()
-							.getTextContent());
-					largeUpdated = true;
-				}
-
-				if (!smallUpdated && icon.getSmallIcon() != null) {
-					sourcePage.setSmallicon(icon.getSmallIcon()
-							.getTextContent());
-					smallUpdated = true;
-				}
-				if (largeUpdated && smallUpdated) {
-					return;
-				}
-			}
-		}
-	}
-
-	/**
-	 * Update target PFPage with Faces-config model.
-	 * 
-	 * @param targetPage
-	 * @param navigationCaseFC
-	 * @author sfshi
-	 */
-	public void updatePageflowTargetPage(PageflowPage targetPage,
-			NavigationCaseType navigationCaseFC) {
-		// set the descriiption of link
-		if (navigationCaseFC.getDescription() != null
-				&& navigationCaseFC.getDescription().size() > 0) {
-			String description = ((DescriptionType) navigationCaseFC
-					.getDescription().get(0)).getTextContent();
-			targetPage.setComment(description);
-		}
-		// set the display-name of link
-		if (navigationCaseFC.getDisplayName() != null
-				&& navigationCaseFC.getDisplayName().size() > 0) {
-			String displayName = ((DisplayNameType) navigationCaseFC
-					.getDisplayName().get(0)).getTextContent();
-			targetPage.setName(displayName);
-		}
-
-		// Set the icon of link
-		if (navigationCaseFC.getIcon() != null
-				&& navigationCaseFC.getIcon().size() > 0) {
-			boolean largeUpdated = false;
-			boolean smallUpdated = false;
-			for (int i = 0; i < navigationCaseFC.getIcon().size(); i++) {
-				IconType icon = (IconType) navigationCaseFC.getIcon().get(0);
-				if (!largeUpdated && icon.getLargeIcon() != null) {
-					targetPage.setLargeicon(icon.getLargeIcon()
-							.getTextContent());
-					largeUpdated = true;
-				}
-
-				if (!smallUpdated && icon.getSmallIcon() != null) {
-					targetPage.setSmallicon(icon.getSmallIcon()
-							.getTextContent());
-					smallUpdated = true;
-				}
-				if (largeUpdated && smallUpdated) {
-					return;
-				}
-			}
-		}
-	}
-
-	/**
-	 * update the pageflow model 's information, including pageflow's name,
-	 * description and related config file
-	 * 
-	 * @param newPageflow
-	 * @param oldPageflow
-	 */
-	public static void updatePageflowModelInfo(Pageflow newPageflow,
-			Pageflow oldPageflow) {
-		if (newPageflow == null || oldPageflow == null) {
-			return;
-		}
-		newPageflow.setName(oldPageflow.getName());
-		newPageflow.setComment(oldPageflow.getComment());
-		newPageflow.setConfigfile(oldPageflow.getConfigfile());
-
-	}
-}
-// PageflowTransform
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/PageflowValidation.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/PageflowValidation.java
deleted file mode 100644
index 7f69a64..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/PageflowValidation.java
+++ /dev/null
@@ -1,288 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.util;
-
-import java.util.Iterator;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.PageflowMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage;
-import org.eclipse.jst.jsf.facesconfig.ui.util.WebrootUtil;
-import org.eclipse.osgi.util.NLS;
-
-/**
- * Pageflow's validation functions
- * 
- * @author Xiao-guang Zhang
- */
-public class PageflowValidation {
-	/** PageflowValidation singleton instance */
-	private static PageflowValidation instance;
-
-	/** constructor */
-	private PageflowValidation() {
-	    // no external instantiation
-	}
-
-	/**
-	 * get the singleton instance of pageflow validation
-	 * 
-	 * @return the singleton instance of pageflow validation
-	 */
-	public static PageflowValidation getInstance() {
-		if (instance == null) {
-			instance = new PageflowValidation();
-		}
-		return instance;
-	}
-
-	/**
-	 * check whether the source and target pageflow node are allowed to create a
-	 * new link NOT allowed source and target: 1. target node is Begin or source
-	 * node is End 2. both of source and target node are Action. 3. double
-	 * connection from the same source to target
-	 * 
-	 * @param source -
-	 *            source pageflow node
-	 * @param target -
-	 *            target pageflow node
-	 * @return - is valid link or not.
-	 * 
-	 */
-	public boolean isValidLinkForCreation(PageflowNode source,
-			PageflowNode target) {
-		// Source and target must be pointing to some real pageflow node
-		if (source == null || target == null) {
-			return false;
-		}
-		return true;
-	}
-
-	/**
-	 * determine the pflink is valid or not for property souce. in our model,
-	 * there are five types of invalid pflinke for property source. 1. link
-	 * between page and action 2. the source of link is Begin or End node 3. the
-	 * target of link is Begin or End node.
-	 * @param link 
-	 * 
-	 * @return - valid link or not.
-	 * 
-	 */
-	public boolean isValidLinkForProperty(PageflowLink link) {
-		return true;
-	}
-
-	/**
-	 * determine the pflink is valid or not for face-config rule in our model,
-	 * there are four types of invalid pflinke. 1. the source of link is Begin
-	 * or End node 2. the target of link is Begin or End node.
-	 * @param link 
-	 * 
-	 * @return - valid link or not.
-	 * 
-	 */
-	public boolean isValidLinkForNavigationRule(PageflowLink link) {
-		return true;
-	}
-
-	/**
-	 * determine the pflink is valid or not for face-config rule in our model,
-	 * there are four types of invalid pflinke.
-	 * @param link 
-	 * 
-	 * @return - valid link or not.
-	 * 
-	 */
-	public String isValidLink(PageflowLink link) {
-		String errorMessage = null;
-		// action-page style
-		// TODO: it should guarantee that outcome should be defined in the
-		// managed bean's method.
-
-		if (link.getSource() instanceof PageflowPage
-				&& link.getTarget() instanceof PageflowPage) {
-			String outcome = link.getOutcome();
-			if (outcome != null && outcome.length() >= 0) {
-				// if (isValidServiceOutcome(outcome))
-				// {
-				// return errorMessage;
-				// }
-				String webPath = ((PageflowPage) link.getSource()).getPath();
-				if (webPath != null) {
-					String projectPath = WebrootUtil.getProjectPath(link,
-							webPath);
-
-					Path resourcePath = new Path(projectPath);
-					IWorkspaceRoot workspaceRoot = ResourcesPlugin
-							.getWorkspace().getRoot();
-					final IResource resource = workspaceRoot
-							.findMember(resourcePath);
-
-					if (resource == null || !resource.exists()) {
-						// Pageflow.Validation.NotExistedSourcePage = The source
-						// page {0} is not existed.
-						errorMessage = NLS
-								.bind(
-										PageflowMessages.Pageflow_Validation_UndefinedOutcome,
-										outcome, webPath);
-					}
-				} else {
-					// Pageflow.Validation.MissingSourcePage = The source page
-					// should be specified.
-					errorMessage = PageflowMessages.Pageflow_Validation_MissingSourcePage;
-				}
-			}
-		}
-		return errorMessage;
-	}
-
-	/**
-	 * Check whether the page is already existed in the pageflow.
-	 * 
-	 * @param pageflow
-	 * @param page
-	 * @return true if page exists (?)
-	 */
-	public boolean isExistedPage(Pageflow pageflow, PageflowPage page) {
-		if (pageflow == null || page == null || page.getPath() == null) {
-			return false;
-		}
-
-		return isExistedPage(pageflow, page.getPath());
-	}
-
-	/**
-	 * Check whether the page is already existed in the pageflow.
-	 * 
-	 * @param pageflow
-	 * @param pagePath
-	 * @return true if pageflow's path is equal to pagePath
-	 */
-	public boolean isExistedPage(Pageflow pageflow, String pagePath) {
-		if (pageflow == null || pagePath == null) {
-			return false;
-		}
-
-		Iterator iter = pageflow.getNodes().iterator();
-
-		while (iter.hasNext()) {
-			PageflowNode existedNode = (PageflowNode) iter.next();
-
-			if (existedNode instanceof PageflowPage) {
-				if (((PageflowPage) existedNode).getPath() != null
-						&& ((PageflowPage) existedNode).getPath()
-								.equalsIgnoreCase(pagePath)) {
-					return true;
-				}
-			}
-		}
-
-		return false;
-	}
-
-	/**
-	 * Check whether the page is valid or not validate page is : 1. if the page
-	 * is general jsp page, it should physically existed. 2. if the page is in
-	 * the form of /foldername/* (it contains the folder), the folder should be
-	 * existed.
-	 * 
-	 * @param page
-	 * @return the notify message for page
-	 */
-	public String getNotifyMessage(PageflowPage page) {
-		String errorMessage = null;
-		IWorkspaceRoot workspaceRoot = ResourcesPlugin.getWorkspace().getRoot();
-		String pagePath = page.getPath();
-
-		// Check the path is empty or not
-		if (pagePath != null && pagePath.length() > 0) {
-			String resourceName = WebrootUtil.getProjectPath(page, pagePath);
-			Path resourcePath = new Path(resourceName);
-
-			final IResource resource = workspaceRoot.findMember(resourcePath);
-
-			if (resource != null && resource.exists()) {
-				// This page is related with jsp file
-				if (resourcePath.getFileExtension() != null) {
-					if (!WebrootUtil.isValidWebFile(resourcePath)) {
-						// Pageflow.Validation.InvalidWebPage = the file {0} is
-						// not valid web file.
-						errorMessage = NLS
-								.bind(
-										PageflowMessages.Pageflow_Validation_InvalidWebPage,
-										pagePath);
-					}
-				}
-			} else {
-				// Pageflow.Validation.NotExitedWebPage = the web page {0} is
-				// not existed.
-				errorMessage = NLS.bind(
-						PageflowMessages.Pageflow_Validation_NotExitedWebPage,
-						pagePath);
-			}
-		} else {
-			// Pageflow.Validation.MissingWebPage = the web page's path should
-			// be specified.
-			errorMessage = PageflowMessages.Pageflow_Validation_MissingWebPage;
-		}
-		return errorMessage;
-	}
-
-	/**
-	 * check that the action is valid EL or not,
-	 * 
-	 * @param actionEL -
-	 *            action string, it should be in the form of #{...}
-	 * @return - True or False
-	 */
-	public static boolean isValidActionEL(String actionEL) {
-		if (actionEL != null && actionEL.length() > 3) {
-			// action is defined in JSF expression language, e.g,
-			// #{beanname.methodname}
-			if (actionEL.substring(0, 2).equalsIgnoreCase("#{")//$NON-NLS-1$
-					&& actionEL.substring(actionEL.length() - 1,
-							actionEL.length()).equalsIgnoreCase("}"))//$NON-NLS-1$
-			{
-				// Check the bean is existed or not.
-				return true;
-			}
-
-		}
-		return false;
-	}
-
-	/**
-	 * get the managed bean from action's expression, e.g., beanName.methodName.
-	 * The return will be beanName.
-	 * 
-	 * @param actionEL
-	 * @return the managed bean name
-	 */
-	public static String getManagedBeanforAction(String actionEL) {
-		String managedBeanName = null;
-		if (isValidActionEL(actionEL)) {
-			actionEL = actionEL.substring(2, actionEL.length() - 1);
-			String[] actionParts = actionEL.split("[.]"); //$NON-NLS-1$
-			managedBeanName = actionParts[0];
-		}
-
-		return managedBeanName;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/BaseFigureDecorator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/BaseFigureDecorator.java
deleted file mode 100644
index ffe8a64..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/BaseFigureDecorator.java
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/BaseNodeFigure.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/BaseNodeFigure.java
deleted file mode 100644
index 096bef9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/BaseNodeFigure.java
+++ /dev/null
@@ -1,946 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.preference;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.Enumeration;
-import java.util.Hashtable;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Vector;
-
-import org.eclipse.draw2d.ConnectionAnchor;
-import org.eclipse.draw2d.Figure;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.Layer;
-import org.eclipse.draw2d.LayoutManager;
-import org.eclipse.draw2d.PolylineConnection;
-import org.eclipse.draw2d.PositionConstants;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.Insets;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * The <code>BaseNodeFigure</code> class is the base class for all the figures
- * representing DiagramNodes, ie those that can have ports with maxConnections
- * to other nodes.
- * 
- * Assumes that all NodeFigures have some number of input and output ports
- * 
- * @author ddean
- * 
- */
-/*package*/ class BaseNodeFigure extends Figure implements IBaseFigure {
-	private IBaseFigure baseFigure;
-
-	private boolean anchorsVisible = true;
-
-	private Hashtable connectionAnchors = new Hashtable(7);
-
-	private Vector inputConnectionAnchors = new Vector(2, 2);
-
-	private Vector outputConnectionAnchors = new Vector(2, 2);
-
-	private Vector topConnectionAnchors = new Vector();
-
-	private Vector bottomConnectionAnchors = new Vector();
-
-	private Vector leftConnectionAnchors = new Vector();
-
-	private Vector rightConnectionAnchors = new Vector();
-
-	/**
-	 * @param figure
-	 */
-	public BaseNodeFigure(IBaseFigure figure) {
-		setBaseFigure(figure);
-		ObserveVisibleXYLayout layout = new ObserveVisibleXYLayout();
-		layout.setObserveVisibility(true);
-		setLayoutManager(layout);
-	}
-
-	/**
-	 * @param figure
-	 */
-	public void setBaseFigure(IBaseFigure figure) {
-		setBaseFigure(figure, new Rectangle(0, 0, -1, -1));
-	}
-
-	public void setHighlight(boolean flag) {
-		if (baseFigure != null) {
-			moveToTop(this, baseFigure);
-			baseFigure.setHighlight(flag);
-		}
-	}
-
-	/**
-	 * @param figure
-	 * @param constraint
-	 */
-	public void setBaseFigure(IBaseFigure figure, Rectangle constraint) {
-		if (!getChildren().contains(figure)) {
-			if (getChildren().contains(baseFigure))
-				remove(baseFigure);
-
-			baseFigure = figure;
-			if (!getChildren().contains(baseFigure)) {
-				// CR389070: Figures are abbreviating rule figures names and
-				// making them unreadable
-				if (getParent() != null
-						&& getParent().getLayoutManager() != null) {
-					Rectangle r = getBounds().getCopy();
-					r.width = -1;
-					r.height = -1;
-					getParent().getLayoutManager().setConstraint(this, r);
-				}
-				// CR389495: Working with nested complex activities causes in
-				// the BP editor causes lockup
-				// ensure that constraints are set on figure before add() - this
-				// will cause a layout()
-				this.add(baseFigure, constraint, 0);
-			}
-		}
-	}
-
-	/**
-	 * @return the base figure
-	 */
-	public IBaseFigure getBaseFigure() {
-		return baseFigure;
-	}
-
-	/***************************************************************************
-	 * Input/Output Ports
-	 **************************************************************************/
-
-	/**
-	 * Add an input port and its anchor
-	 * 
-	 * @param portName
-	 *            unique name to refer to the port
-	 */
-	public void addInput(String portName) {
-		InputPortFigure inputPort = new InputPortFigure();
-		add(inputPort);
-		inputPort.setToolTipText(portName);
-
-		PortConnectionAnchor anchor = new PortConnectionAnchor(inputPort);
-		getTargetConnectionAnchors().add(anchor);
-		connectionAnchors.put(portName, anchor);
-	}
-
-	/**
-	 * Add an output port and its anchor
-	 * 
-	 * @param portName
-	 *            unique name to refer to the port
-	 * @return the connection anchor
-	 */
-	public PortConnectionAnchor addOutput(String portName) {
-		OutputPortFigure outputPort = new OutputPortFigure();
-		add(outputPort);
-		outputPort.setToolTipText(portName);
-
-		PortConnectionAnchor anchor = new PortConnectionAnchor(outputPort);
-		getSourceConnectionAnchors().add(anchor);
-		connectionAnchors.put(portName, anchor);
-		return anchor;
-	}
-
-	/**
-	 * Searches for and returns the anchor on this figure that is closest to the
-	 * reference point <code>p</code>
-	 * 
-	 * @param p
-	 *            the reference point
-	 * @return the anchor on this figure that is closest to <code>p</code>
-	 */
-	public ConnectionAnchor connectionAnchorAt(Point p) {
-		ConnectionAnchor closest = null;
-		long min = Long.MAX_VALUE;
-
-		Enumeration e = getSourceConnectionAnchors().elements();
-		while (e.hasMoreElements()) {
-			ConnectionAnchor c = (ConnectionAnchor) e.nextElement();
-			Point p2 = c.getLocation(null);
-			long d = p.getDistance2(p2);
-			if (d < min) {
-				min = d;
-				closest = c;
-			}
-		}
-		e = getTargetConnectionAnchors().elements();
-		while (e.hasMoreElements()) {
-			ConnectionAnchor c = (ConnectionAnchor) e.nextElement();
-			Point p2 = c.getLocation(null);
-			long d = p.getDistance2(p2);
-			if (d < min) {
-				min = d;
-				closest = c;
-			}
-		}
-		return closest;
-	}
-
-	/**
-	 * returns an anchor given its name
-	 * 
-	 * @param portName
-	 *            name of the anchor
-	 * @return the anchor with the name <code>portName</code>
-	 */
-	public ConnectionAnchor getConnectionAnchor(String portName) {
-		return (ConnectionAnchor) connectionAnchors.get(portName);
-	}
-
-	/**
-	 * returns the name of the specified anchor
-	 * 
-	 * @param c
-	 *            the anchor whose name is requested
-	 * @return the name of the specifed anchor
-	 */
-	public String getConnectionAnchorName(ConnectionAnchor c) {
-		Enumeration enumer = connectionAnchors.keys();
-		String key;
-		while (enumer.hasMoreElements()) {
-			key = (String) enumer.nextElement();
-			if (connectionAnchors.get(key).equals(c))
-				return key;
-		}
-		return null;
-	}
-
-	/**
-	 * returns the source connection anchor that is closest to the reference
-	 * point
-	 * 
-	 * @param p
-	 *            the reference point
-	 * @return the closest connection anchor to <code>p</code>
-	 */
-	public ConnectionAnchor getSourceConnectionAnchorAt(Point p) {
-		ConnectionAnchor closest = null;
-		long min = Long.MAX_VALUE;
-
-		Enumeration e = getSourceConnectionAnchors().elements();
-		while (e.hasMoreElements()) {
-			ConnectionAnchor c = (ConnectionAnchor) e.nextElement();
-			Point p2 = c.getLocation(null);
-			long d = p.getDistance2(p2);
-			if (d < min) {
-				min = d;
-				closest = c;
-			}
-		}
-		return closest;
-	}
-
-	/**
-	 * returns all the source connection anchors on this node figure
-	 * 
-	 * @return a vector of all the source connection anchors for this figure
-	 */
-	public Vector getSourceConnectionAnchors() {
-		return outputConnectionAnchors;
-	}
-
-	/**
-	 * returns the target connection anchor that is closest to the reference
-	 * point
-	 * 
-	 * @param p
-	 *            the reference point
-	 * @return the closest target connection anchor to <code>p</code>
-	 */
-	public ConnectionAnchor getTargetConnectionAnchorAt(Point p) {
-		ConnectionAnchor closest = null;
-		long min = Long.MAX_VALUE;
-
-		Enumeration e = getTargetConnectionAnchors().elements();
-		while (e.hasMoreElements()) {
-			ConnectionAnchor c = (ConnectionAnchor) e.nextElement();
-			Point p2 = c.getLocation(null);
-			long d = p.getDistance2(p2);
-			if (d < min) {
-				min = d;
-				closest = c;
-			}
-		}
-		return closest;
-	}
-
-	/**
-	 * returns all the target connection anchors on this node figure
-	 * 
-	 * @return a vector of all the target connection anchors for this figure
-	 */
-	public Vector getTargetConnectionAnchors() {
-		return inputConnectionAnchors;
-	}
-
-	/**
-	 * Returns the name of the specified anchor
-	 * 
-	 * @param anchor
-	 *            the connectio anchor whose name is requested
-	 * @return the anchor's name
-	 */
-	public String getNameForAnchor(ConnectionAnchor anchor) {
-		if (anchor != null) {
-			Iterator it = connectionAnchors.keySet().iterator();
-			String name;
-
-			while (it.hasNext()) {
-				name = (String) it.next();
-
-				if (anchor.equals(connectionAnchors.get(name))) {
-					return name;
-				}
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * @param visible
-	 */
-	public void setAnchorsVisible(boolean visible) {
-		if (anchorsVisible != visible) {
-			anchorsVisible = visible;
-			//ConnectionAnchor port;
-			List all = new ArrayList();
-			all.addAll(getTargetConnectionAnchors());
-			all.addAll(getSourceConnectionAnchors());
-			Iterator it = all.iterator();
-			while (it.hasNext()) {
-				IFigure fig = ((ConnectionAnchor) it.next()).getOwner();
-				fig.setVisible(visible);
-			}
-			validate();
-		}
-	}
-
-	/**
-	 * Determine which side of the figure to place each anchor based on the
-	 * relative position (north, south, east or west) of the connection line's
-	 * opposite anchor. If the anchor is not connected to anything else, the
-	 * default is to place target (input) anchors on the left and source
-	 * (output) anchors on the right.
-	 */
-	private void determineAnchorPositions() {
-		Iterator it;
-		topConnectionAnchors.clear();
-		bottomConnectionAnchors.clear();
-		leftConnectionAnchors.clear();
-		rightConnectionAnchors.clear();
-
-		if (anchorsVisible) {
-			//final Dimension size = baseFigure.getPreferredSize();
-			PortConnectionAnchor port;
-
-			// start with outputs
-			it = getSourceConnectionAnchors().iterator();
-			while (it.hasNext()) {
-				port = (PortConnectionAnchor) it.next();
-				// CR386077: SplitActivity True and False outputs switch
-				// positions based on their targets
-				int direction = port.getOrientation();
-				if (direction == PositionConstants.NONE) {
-					Point loc = port.getOwner().getParent().getBounds()
-							.getLocation();
-					// loc.x += size.width/2;
-					// loc.y += size.height/2;
-					Iterator itc = port.getConnections().iterator();
-					if (itc.hasNext()) {
-						while (itc.hasNext()) {
-							PolylineConnection conn = (PolylineConnection) itc
-									.next();
-							ConnectionAnchor otherPort;
-							if (port == conn.getSourceAnchor())
-								otherPort = conn.getTargetAnchor();
-							else
-								otherPort = conn.getSourceAnchor();
-							if (otherPort.getOwner() == null)
-								continue;
-							Point otherLoc = otherPort.getOwner().getParent()
-									.getBounds().getLocation();
-							// Dimension otherSize =
-							// ((BaseNodeFigure)otherPort.getOwner().getParent()).getBaseFigure().getPreferredSize();
-							// otherLoc.x += otherSize.width/2;
-							// otherLoc.y += otherSize.height/2;
-							direction = loc.getPosition(otherLoc);
-							if (direction == PositionConstants.NORTH)
-								topConnectionAnchors.add(port);
-							else if (direction == PositionConstants.SOUTH)
-								bottomConnectionAnchors.add(port);
-							else if (direction == PositionConstants.WEST)
-								leftConnectionAnchors.add(port);
-							else
-								rightConnectionAnchors.add(port);
-							((PortFigure) port.getOwner())
-									.setOrientation(direction);
-							break; // currently, only the first connection is
-									// considered
-						}
-					} else {
-						rightConnectionAnchors.add(port);
-						((PortFigure) port.getOwner())
-								.setOrientation(PositionConstants.EAST);
-					}
-				} else {
-					// CR386077: SplitActivity True and False outputs switch
-					// positions based on their targets
-					if (direction == PositionConstants.NORTH)
-						topConnectionAnchors.add(port);
-					else if (direction == PositionConstants.SOUTH)
-						bottomConnectionAnchors.add(port);
-					else if (direction == PositionConstants.WEST)
-						leftConnectionAnchors.add(port);
-					else
-						rightConnectionAnchors.add(port);
-				}
-			}
-			it = getTargetConnectionAnchors().iterator();
-			while (it.hasNext()) {
-				port = (PortConnectionAnchor) it.next();
-				// CR386077: SplitActivity True and False outputs switch
-				// positions based on their targets
-				int direction = port.getOrientation();
-				if (direction == PositionConstants.NONE) {
-					Point loc = port.getOwner().getParent().getBounds()
-							.getLocation();
-					// loc.x += size.width/2;
-					// loc.y += size.height/2;
-					Iterator itc = port.getConnections().iterator();
-					if (itc.hasNext()) {
-						while (itc.hasNext()) {
-							PolylineConnection conn = (PolylineConnection) itc
-									.next();
-							ConnectionAnchor otherPort;
-							if (port == conn.getSourceAnchor())
-								otherPort = conn.getTargetAnchor();
-							else
-								otherPort = conn.getSourceAnchor();
-							if (otherPort.getOwner() == null)
-								continue;
-							Point otherLoc = otherPort.getOwner().getParent()
-									.getBounds().getLocation();
-							// Dimension otherSize =
-							// ((BaseNodeFigure)otherPort.getOwner().getParent()).getBaseFigure().getPreferredSize();
-							// otherLoc.x += otherSize.width/2;
-							// otherLoc.y += otherSize.height/2;
-							direction = loc.getPosition(otherLoc);
-							if (direction == PositionConstants.NORTH)
-								topConnectionAnchors.add(port);
-							else if (direction == PositionConstants.SOUTH)
-								bottomConnectionAnchors.add(port);
-							else if (direction == PositionConstants.EAST)
-								rightConnectionAnchors.add(port);
-							else
-								leftConnectionAnchors.add(port);
-							((PortFigure) port.getOwner())
-									.setOrientation(direction);
-							break; // currently, only the first connection is
-									// considered
-						}
-					} else {
-						leftConnectionAnchors.add(port);
-						((PortFigure) port.getOwner())
-								.setOrientation(PositionConstants.WEST);
-					}
-				} else {
-					// CR386077: SplitActivity True and False outputs switch
-					// positions based on their targets
-					if (direction == PositionConstants.NORTH)
-						topConnectionAnchors.add(port);
-					else if (direction == PositionConstants.SOUTH)
-						bottomConnectionAnchors.add(port);
-					else if (direction == PositionConstants.EAST)
-						rightConnectionAnchors.add(port);
-					else
-						leftConnectionAnchors.add(port);
-				}
-			}
-
-			Comparator comparePorts = new Comparator() {
-				public int compare(Object arg0, Object arg1) {
-					PortConnectionAnchor port0 = (PortConnectionAnchor) arg0;
-					if (port0.getConnections().size() < 1)
-						return 0;
-					PortConnectionAnchor port1 = (PortConnectionAnchor) arg1;
-					if (port1.getConnections().size() < 1)
-						return 0;
-					// CR386077: SplitActivity True and False outputs switch
-					// positions based on their targets
-					if (port0.getOrientation() != PositionConstants.NONE)
-						return 0;
-					if (port1.getOrientation() != PositionConstants.NONE)
-						return 0;
-
-					PolylineConnection conn0 = (PolylineConnection) port0
-							.getConnections().get(0);
-					ConnectionAnchor otherPort0;
-					if (port0 == conn0.getSourceAnchor())
-						otherPort0 = conn0.getTargetAnchor();
-					else
-						otherPort0 = conn0.getSourceAnchor();
-					Point otherLoc0 = otherPort0.getOwner().getParent()
-							.getBounds().getLocation();
-					// Dimension otherSize0 =
-					// ((BaseNodeFigure)otherPort0.getOwner().getParent()).getBaseFigure().getPreferredSize();
-					// otherLoc0.x += otherSize0.width/2;
-					// otherLoc0.y += otherSize0.height/2;
-
-					PolylineConnection conn1 = (PolylineConnection) port1
-							.getConnections().get(0);
-					ConnectionAnchor otherPort1;
-					if (port1 == conn1.getSourceAnchor())
-						otherPort1 = conn1.getTargetAnchor();
-					else
-						otherPort1 = conn1.getSourceAnchor();
-					Point otherLoc1 = otherPort1.getOwner().getParent()
-							.getBounds().getLocation();
-//					Dimension otherSize1 = ((BaseNodeFigure) otherPort1
-//							.getOwner().getParent()).getBaseFigure()
-//							.getPreferredSize();
-					// otherLoc1.x += otherSize1.width/2;
-					// otherLoc1.y += otherSize1.height/2;
-
-					switch (((PortFigure) port0.getOwner()).getOrientation()) {
-					case PositionConstants.NORTH:
-					case PositionConstants.SOUTH:
-						return otherLoc0.x - otherLoc1.x;
-					case PositionConstants.EAST:
-					case PositionConstants.WEST:
-						return otherLoc0.y - otherLoc1.y;
-					}
-					return 0;
-				}
-			};
-
-			// order the anchors on each side so connection lines don't cross
-			Collections.sort(topConnectionAnchors, comparePorts);
-			Collections.sort(leftConnectionAnchors, comparePorts);
-			Collections.sort(bottomConnectionAnchors, comparePorts);
-			Collections.sort(rightConnectionAnchors, comparePorts);
-		}
-	}
-
-	private void placeAnchors() {
-		determineAnchorPositions();
-		if (anchorsVisible) {
-			Iterator it;
-			PortConnectionAnchor port;
-			int y, x;
-
-			Dimension sz = baseFigure.getPreferredSize();
-			LayoutManager layout = getLayoutManager();
-			// CR389070: Figures are abbreviating rule figures names and making
-			// them unreadable
-			Dimension d = getAnchorSize();
-
-			// left ports
-			x = 0;
-			y = FigureConstants.PORT_SPACING / 2;
-			// CR374981: Long activity labels do not get wrapped or truncated
-			// keep a constant inset on all 4 sides of the icon
-			// if ( topConnectionAnchors.size()>0 )
-			y += d.height;
-			y += (sz.height - (leftConnectionAnchors.size() * (d.height + FigureConstants.PORT_SPACING))) / 2;
-			it = leftConnectionAnchors.iterator();
-			while (it.hasNext()) {
-				port = (PortConnectionAnchor) it.next();
-
-				Rectangle r = new Rectangle(x, y, -1, -1);
-				Rectangle oldrect = (Rectangle) layout.getConstraint(port
-						.getOwner());
-				if (!r.equals(oldrect))
-					layout.setConstraint(port.getOwner(), new Rectangle(x, y,
-							-1, -1));
-
-				y += d.height + FigureConstants.PORT_SPACING;
-			}
-
-			// right ports
-			x = sz.width;
-			// CR374981: Long activity labels do not get wrapped or truncated
-			// if ( leftConnectionAnchors.size()>0 )
-			x += d.width;
-			y = FigureConstants.PORT_SPACING / 2;
-			// CR374981: Long activity labels do not get wrapped or truncated
-			// if ( topConnectionAnchors.size()>0 )
-			y += d.height;
-			y += (sz.height - (rightConnectionAnchors.size() * (d.height + FigureConstants.PORT_SPACING))) / 2;
-			it = rightConnectionAnchors.iterator();
-			while (it.hasNext()) {
-				port = (PortConnectionAnchor) it.next();
-
-				Rectangle r = new Rectangle(x, y, -1, -1);
-				Rectangle oldrect = (Rectangle) layout.getConstraint(port
-						.getOwner());
-				if (!r.equals(oldrect))
-					layout.setConstraint(port.getOwner(), new Rectangle(x, y,
-							-1, -1));
-
-				y += d.height + FigureConstants.PORT_SPACING;
-			}
-
-			// top ports
-			y = 0;
-			x = FigureConstants.PORT_SPACING / 2;
-			// CR374981: Long activity labels do not get wrapped or truncated
-			// if ( leftConnectionAnchors.size()>0 )
-			x += d.width;
-			x += (sz.width - (topConnectionAnchors.size() * (d.width + FigureConstants.PORT_SPACING))) / 2;
-			it = topConnectionAnchors.iterator();
-			while (it.hasNext()) {
-				port = (PortConnectionAnchor) it.next();
-
-				Rectangle r = new Rectangle(x, y, -1, -1);
-				Rectangle oldrect = (Rectangle) layout.getConstraint(port
-						.getOwner());
-				if (!r.equals(oldrect))
-					layout.setConstraint(port.getOwner(), new Rectangle(x, y,
-							-1, -1));
-
-				x += d.width + FigureConstants.PORT_SPACING;
-			}
-
-			// bottom ports
-			y = sz.height;
-			// CR374981: Long activity labels do not get wrapped or truncated
-			// if ( topConnectionAnchors.size()>0 )
-			y += d.height;
-			x = FigureConstants.PORT_SPACING / 2;
-			// CR374981: Long activity labels do not get wrapped or truncated
-			// if ( leftConnectionAnchors.size()>0 )
-			x += d.width;
-			x += (sz.width - (bottomConnectionAnchors.size() * (d.width + FigureConstants.PORT_SPACING))) / 2;
-			it = bottomConnectionAnchors.iterator();
-			while (it.hasNext()) {
-				port = (PortConnectionAnchor) it.next();
-
-				Rectangle r = new Rectangle(x, y, -1, -1);
-				Rectangle oldrect = (Rectangle) layout.getConstraint(port
-						.getOwner());
-				if (!r.equals(oldrect))
-					layout.setConstraint(port.getOwner(), new Rectangle(x, y,
-							-1, -1));
-
-				x += d.width + FigureConstants.PORT_SPACING;
-			}
-		}
-	}
-
-	/**
-	 * CR389070: Figures are abbreviating rule figures names and making them
-	 * unreadable Anchor size is now dependent on icon size, not constant. Asks
-	 * the connection anchor for its size.
-	 */
-	private Dimension getAnchorSize() {
-		Dimension d = new Dimension(FigureConstants.PORT_SIDE,
-				FigureConstants.PORT_SIDE);
-		if (!connectionAnchors.isEmpty()) {
-			Iterator iter = connectionAnchors.values().iterator();
-			PortConnectionAnchor a = (PortConnectionAnchor) iter.next();
-			d = a.getOwner().getPreferredSize();
-		}
-		return d;
-	}
-
-	/**
-	 * @return the anchor insets
-	 */
-	protected final Insets getAnchorInsets() {
-		Insets in = new Insets(0, 0, 0, 0);
-		// CR389070: Figures are abbreviating rule figures names and making them
-		// unreadable
-		Dimension d = getAnchorSize();
-		// CR374981: Long activity labels do not get wrapped or truncated
-		// if ( leftConnectionAnchors.size()>0 )
-		in.left = d.width;
-		// CR374981: Long activity labels do not get wrapped or truncated
-		// if ( rightConnectionAnchors.size()>0 )
-		in.right = d.width;
-		// CR374981: Long activity labels do not get wrapped or truncated
-		// if ( topConnectionAnchors.size()>0 )
-		in.top = d.height;
-		// CR374981: Long activity labels do not get wrapped or truncated
-		// if ( bottomConnectionAnchors.size()>0 )
-		in.bottom = d.height;
-		return in;
-	}
-
-	public void invalidate() {
-		super.invalidate();
-	}
-
-	/**
-	 * validate method override to arrange the input and output ports around the
-	 * links of the node figures
-	 */
-	public void validate() {
-		placeAnchors();
-		// CR389070: Figures are abbreviating rule figures names and making them
-		// unreadable
-		int x = 0;
-		int y = 0;
-		// if anchors are not visible (CompoundNodeFigure is maximized) always
-		// set position at 0,0
-		if (anchorsVisible) {
-			Dimension d = getAnchorSize();
-			// CR374981: Long activity labels do not get wrapped or truncated
-			// if ( leftConnectionAnchors.size()>0 )
-			x = d.width;
-			// CR374981: Long activity labels do not get wrapped or truncated
-			// if ( topConnectionAnchors.size()>0 )
-			y = d.height;
-		}
-		getLayoutManager().setConstraint(baseFigure,
-				new Rectangle(x, y, -1, -1));
-		layout();
-		super.validate();
-	}
-
-	/***************************************************************************
-	 * Miscellaneous
-	 **************************************************************************/
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.Figure#useLocalCoordinates()
-	 */
-	protected boolean useLocalCoordinates() {
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.IFigure#setBounds(org.eclipse.draw2d.geometry.Rectangle)
-	 */
-	public void setBounds(Rectangle rect) {
-		Rectangle r = rect.getCopy();
-		r.x = 0;
-		r.y = 0;
-		if (anchorsVisible) {
-			// CR389070: Figures are abbreviating rule figures names and making
-			// them unreadable
-			Dimension d = getAnchorSize();
-			// CR374981: Long activity labels do not get wrapped or truncated
-			// if ( leftConnectionAnchors.size()>0 )
-			{
-				r.x += d.width;
-				r.width -= d.width;
-			}
-			// CR374981: Long activity labels do not get wrapped or truncated
-			// if ( rightConnectionAnchors.size()>0 )
-			r.width -= d.width;
-			// CR374981: Long activity labels do not get wrapped or truncated
-			// if ( topConnectionAnchors.size()>0 )
-			{
-				r.y += d.height;
-				r.height -= d.height;
-			}
-			// CR374981: Long activity labels do not get wrapped or truncated
-			// if ( bottomConnectionAnchors.size()>0 )
-			r.height -= d.height;
-		}
-		baseFigure.setBounds(r);
-		r.setLocation(rect.getLocation());
-		super.setBounds(r);
-	}
-
-	public Rectangle getBounds() {
-		Dimension size = baseFigure.getBounds().getSize();
-		if (anchorsVisible) {
-			// CR389070: Figures are abbreviating rule figures names and making
-			// them unreadable
-			Dimension d = getAnchorSize();
-			// CR374981: Long activity labels do not get wrapped or truncated
-			// if ( leftConnectionAnchors.size()>0 )
-			size.width += d.width;
-			// CR374981: Long activity labels do not get wrapped or truncated
-			// if ( rightConnectionAnchors.size()>0 )
-			size.width += d.width;
-			// CR374981: Long activity labels do not get wrapped or truncated
-			// if ( topConnectionAnchors.size()>0 )
-			size.height += d.height;
-			// CR374981: Long activity labels do not get wrapped or truncated
-			// if ( bottomConnectionAnchors.size()>0 )
-			size.height += d.height;
-		}
-		Rectangle r = super.getBounds();
-		r.setSize(size);
-		return r;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.IFigure#getPreferredSize(int, int)
-	 */
-	public Dimension getPreferredSize(int wHint, int hHint) {
-		Dimension size = baseFigure.getPreferredSize(wHint, hHint).getCopy();
-		if (anchorsVisible) {
-			// CR389070: Figures are abbreviating rule figures names and making
-			// them unreadable
-			Dimension d = getAnchorSize();
-			// CR374981: Long activity labels do not get wrapped or truncated
-			// if ( leftConnectionAnchors.size()>0 )
-			size.width += d.width;
-			// CR374981: Long activity labels do not get wrapped or truncated
-			// if ( rightConnectionAnchors.size()>0 )
-			size.width += d.width;
-			// CR374981: Long activity labels do not get wrapped or truncated
-			// if ( topConnectionAnchors.size()>0 )
-			size.height += d.height;
-			// CR374981: Long activity labels do not get wrapped or truncated
-			// if ( bottomConnectionAnchors.size()>0 )
-			size.height += d.height;
-		}
-		return size;
-	}
-
-	private static void moveToTop(IFigure parent, IFigure child) {
-		parent.getChildren().remove(child);
-		parent.getChildren().add(child);
-	}
-
-	/**
-	 * move to top layer
-	 */
-	protected final void moveToTop() {
-		IFigure parent = getParent();
-		IFigure child = this;
-		while (parent != null && !(parent instanceof Layer)) {
-			child = parent;
-			parent = parent.getParent();
-		}
-		if (parent instanceof Layer) {
-			parent.getChildren().remove(child);
-			parent.getChildren().add(child);
-		}
-	}
-
-	/***************************************************************************
-	 * IBaseFigure methods delegate to the baseFigure
-	 **************************************************************************/
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.gem.diagram.editor.figures.IBaseFigure#setText(java.lang.String)
-	 */
-	public void setText(String text) {
-		baseFigure.setText(text);
-	}
-
-	public void setIcon(Image image) {
-		baseFigure.setIcon(image);
-	}
-
-	/**
-	 * The description property of a DiagramNode is displayed as a tool tip.
-	 * This method is used to set it. Passing a null or zero-length string will
-	 * remove the tool tip
-	 * 
-	 * @param text
-	 *            the description to use for this node's tool tip
-	 * 
-	 * @see IBaseFigure#setToolTipText(java.lang.String)
-	 */
-	public void setToolTipText(String text) {
-		baseFigure.setToolTipText(text);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.gem.diagram.editor.figures.IBaseFigure#addDecorator(com.sybase.stf.gem.diagram.editor.figures.BaseFigureDecorator)
-	 */
-	public void addDecorator(BaseFigureDecorator decorator) {
-		baseFigure.addDecorator(decorator);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.gem.diagram.editor.figures.IBaseFigure#removeDecorator()
-	 */
-	public void removeDecorator() {
-		baseFigure.removeDecorator();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.gem.diagram.editor.figures.IBaseFigure#removeDecorator(int)
-	 */
-	public void removeDecorator(int position) {
-		baseFigure.removeDecorator(position);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.gem.diagram.editor.figures.IBaseFigure#getDecorators()
-	 */
-	public List getDecorators() {
-		return baseFigure.getDecorators();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.gem.diagram.editor.figures.IBaseFigure#getText()
-	 */
-	public String getText() {
-		return baseFigure.getText();
-	}
-
-	/*
-	 * CR374981: Long activity labels do not get wrapped or truncated This
-	 * method was added to the IBaseFigure interface to support direct edit of
-	 * figure labels on the canvas.
-	 */
-	public Rectangle getTextBounds() {
-		Rectangle r = baseFigure.getTextBounds().getCopy();
-		r.x += getBounds().x;
-		r.y += getBounds().y;
-		return r;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.gem.diagram.editor.figures.IBaseFigure#getIcon()
-	 */
-	public Image getIcon() {
-		return baseFigure.getIcon();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.gem.diagram.editor.figures.IBaseFigure#getToolTipText()
-	 */
-	public String getToolTipText() {
-		return baseFigure.getToolTipText();
-	}
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/ColorFontFieldEditor.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/ColorFontFieldEditor.java
deleted file mode 100644
index f67bbaa..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/ColorFontFieldEditor.java
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/ComboFieldEditor.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/ComboFieldEditor.java
deleted file mode 100644
index 53ce7b2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/ComboFieldEditor.java
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/CompoundFigureListener.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/CompoundFigureListener.java
deleted file mode 100644
index c264648..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/CompoundFigureListener.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.preference;
-
-/**
- * @author bbrodt
- * 
- * Interface definition for listeners of CompoundFigure events. Events are
- * generated when a user presses a different tab (tabChanged event) or presses
- * one of the minimize/maximize/restore buttons (stateChanged event)
- */
-/*package*/ interface CompoundFigureListener extends WindowFigureListener {
-	/**
-	 * @param oldState
-	 * @param newState
-	 */
-	void stateChanged(int oldState, int newState);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/CompoundNodeFigure.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/CompoundNodeFigure.java
deleted file mode 100644
index 8de3c5e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/CompoundNodeFigure.java
+++ /dev/null
@@ -1,480 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.preference;
-
-import java.util.Iterator;
-
-import org.eclipse.draw2d.ActionEvent;
-import org.eclipse.draw2d.ActionListener;
-import org.eclipse.draw2d.FreeformFigure;
-import org.eclipse.draw2d.FreeformListener;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.Label;
-import org.eclipse.draw2d.Layer;
-import org.eclipse.draw2d.LayoutManager;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.Insets;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * The figure for Compound nodes
- */
-/*package*/ class CompoundNodeFigure extends BaseNodeFigure implements
-		FreeformFigure, IContainerFigure {
-	
-	private static final String RESTORE_HILITE_IMAGE_FILE = "restore_hilite.gif"; //$NON-NLS-1$
-
-	private static final String RESTORE_IMAGE_FILE = "restore.gif"; //$NON-NLS-1$
-
-	private static final String MAXIMIZE_HILITE_IMAGE_FILE = "maximize_hilite.gif"; //$NON-NLS-1$
-
-	private static final String MAXIMIZE_IMAGE_FILE = "maximize.gif"; //$NON-NLS-1$
-
-	private static final String MINIMIZE_HILITE_IMAGE_FILE = "minimize_hilite.gif"; //$NON-NLS-1$
-
-	private static final String MINIMIZE_IMAGE_FILE = "minimize.gif"; //$NON-NLS-1$
-
-	private final static int MINIMIZED = 1;
-
-	final static int RESTORED = 2;
-
-	private final static int MAXIMIZED = 3;
-
-	private int state = RESTORED;
-
-	private TitleBarButton minButton;
-
-	private TitleBarButton maxButton;
-
-	private IconFigure iconFigure;
-
-	private WindowFigure windowFigure;
-
-	private static String DEFAULT_NAME = "CompoundNode"; //$NON-NLS-1$
-
-	private static String DEFAULT_ICON = "editor/CompoundNode.gif"; //$NON-NLS-1$
-
-	private static Image minimizeImage = EditorPlugin.getDefault().getImage(
-			MINIMIZE_IMAGE_FILE);
-
-	private static Image minimizeHiliteImage = EditorPlugin.getDefault()
-			.getImage(MINIMIZE_HILITE_IMAGE_FILE);
-
-	private static Image maximizeImage = EditorPlugin.getDefault().getImage(
-			MAXIMIZE_IMAGE_FILE);
-
-	private static Image maximizeHiliteImage = EditorPlugin.getDefault()
-			.getImage(MAXIMIZE_HILITE_IMAGE_FILE);
-
-	private static Image restoreImage = EditorPlugin.getDefault().getImage(
-			RESTORE_IMAGE_FILE);
-
-	private static Image restoreHiliteImage = EditorPlugin.getDefault()
-			.getImage(RESTORE_HILITE_IMAGE_FILE);
-
-	/**
-	 * Default constructor
-	 */
-	public CompoundNodeFigure() {
-		// create all of the figures and adornments:
-		// the icon figure
-		super(new IconFigure(DEFAULT_NAME, EditorPlugin.getDefault().getImage(
-				DEFAULT_ICON)));
-		iconFigure = (IconFigure) getBaseFigure();
-		// and the window figure
-		windowFigure = new WindowFigure();
-		windowFigure.setForegroundColor(IconFigure.defaultForegroundColor);
-		windowFigure.setFont(IconFigure.defaultFont);
-
-		// then the minimize/maximize buttons.
-		// Note that the maxButton is also used for the "Restore" action
-		// TODO:
-		// The reason for putting these buttons in CompoundNodeFigure instead of
-		// WindowFigure where they really belong, is that the TitleBarButton is
-		// a
-		// draw2d Button (which subclasses Figure) and these must be placed in
-		// the
-		// titlebar (i.e. a SchemeBorder) because that's where they belong. The
-		// problem
-		// with this is that the Figure.paint() method first draws all of its
-		// children
-		// figures, then the border which means that the buttons would be
-		// obscured.
-		// This should be fixed as time allows and the WindowFigureListener
-		// interface
-		// should then also be modified to include a buttonPressed()
-		// notification
-		// for which CompoundNodeFigure can be a listener.
-		minButton = new TitleBarButton(minimizeImage, minimizeHiliteImage,
-				null, null);
-		maxButton = new TitleBarButton(maximizeImage, maximizeHiliteImage,
-				restoreImage, restoreHiliteImage);
-
-		add(minButton);
-		add(maxButton);
-
-		minButton.addActionListener(new ActionListener() {
-			public void actionPerformed(ActionEvent event) {
-				setState(CompoundNodeFigure.MINIMIZED);
-			}
-		});
-		maxButton.addActionListener(new ActionListener() {
-			public void actionPerformed(ActionEvent event) {
-				setState(maxButton.getState() ? CompoundNodeFigure.MAXIMIZED
-						: CompoundNodeFigure.RESTORED);
-			}
-		});
-
-		// show as a normal window initially
-		showIcon();
-
-		// testing BaseFigureDecorators:
-		// BaseFigureDecorator decorator;
-		// decorator = new
-		// BaseFigureDecorator(EditorPlugin.getDefault().getGEMImage("delete.gif"),
-		// "top right",
-		// PositionConstants.NORTH_EAST);
-		// addDecorator(decorator);
-		// decorator = new
-		// BaseFigureDecorator(EditorPlugin.getDefault().getGEMImage("delete.gif"),
-		// "top left",
-		// PositionConstants.NORTH_WEST);
-		// addDecorator(decorator);
-		// decorator = new
-		// BaseFigureDecorator(EditorPlugin.getDefault().getGEMImage("delete.gif"),
-		// "bottom right",
-		// PositionConstants.SOUTH_EAST);
-		// addDecorator(decorator);
-		// decorator = new
-		// BaseFigureDecorator(EditorPlugin.getDefault().getGEMImage("delete.gif"),
-		// "bottom left",
-		// PositionConstants.SOUTH_WEST);
-		// addDecorator(decorator);
-	}
-
-	public void setOpaque(boolean flag) {
-		windowFigure.setOpaque(flag);
-	}
-
-	/*
-	 * Remove the window figure and its buttons and replace them with the icon
-	 * figure.
-	 */
-	private void showIcon() {
-		// CR400779: GEM minimizing a complex activity sometimes leaves junk on
-		// the screen
-		setVisible(false);
-		minButton.setVisible(false);
-		maxButton.setVisible(false);
-		super.setBaseFigure(iconFigure);
-
-		setAnchorsVisible(true);
-		// CR400779: GEM minimizing a complex activity sometimes leaves junk on
-		// the screen
-		setVisible(true);
-	}
-
-	/*
-	 * Remove the icon figure and replace with the window figure. Make sure the
-	 * buttons are reset to their correct states.
-	 */
-	private void showWindow() {
-		// CR400779: GEM minimizing a complex activity sometimes leaves junk on
-		// the screen
-		setVisible(false);
-		if (state == RESTORED) {
-			super.setBaseFigure(windowFigure);
-
-			minButton.setVisible(true);
-			minButton.setState(false);
-			minButton.setToolTip(new Label(PreferenceMessages.CompoundNodeFigure_MinimizeLabel));
-
-			maxButton.setVisible(true);
-			maxButton.setState(false);
-			maxButton.setToolTip(new Label(PreferenceMessages.CompoundNodeFigure_MaximizeLabel));
-
-			setAnchorsVisible(true);
-		} else if (state == MAXIMIZED) {
-			setAnchorsVisible(false);
-
-			Rectangle constraint = new Rectangle(0, 0, -1, -1);
-			IFigure parent = getParent();
-			if (parent != null) {
-				constraint = parent.getBounds().getCopy();
-				constraint.width += constraint.x;
-				constraint.height += constraint.y;
-				constraint.x = 0;
-				constraint.y = 0;
-			}
-
-			super.setBaseFigure(windowFigure, constraint);
-			if (parent != null && parent.getLayoutManager() != null) {
-				// System.out.println("CompoundNode.showWindow: maximize
-				// "+constraint);
-				parent.getLayoutManager().setConstraint(this, constraint);
-			}
-
-			// the maximize button is used for both Maximize and Restore actions
-			minButton.setVisible(false);
-
-			maxButton.setVisible(true);
-			maxButton.setState(true);
-			maxButton.setToolTip(new Label(PreferenceMessages.CompoundNodeFigure_RestoreLabel));
-		}
-		// CR400779: GEM minimizing a complex activity sometimes leaves junk on
-		// the screen
-		setVisible(true);
-	}
-
-	public void addDecorator(BaseFigureDecorator decorator) {
-		iconFigure.addDecorator(decorator);
-	}
-
-	public void removeDecorator() {
-		iconFigure.removeDecorator();
-	}
-
-	public void removeDecorator(int position) {
-		iconFigure.removeDecorator(position);
-	}
-
-	/**
-	 * @param flag
-	 */
-	public void setHilight(boolean flag) {
-		windowFigure.setHighlight(flag);
-		if (flag)
-			moveToTop();
-	}
-
-	public void setText(String name) {
-		iconFigure.setText(name);
-		windowFigure.setText(name);
-	}
-
-	public void setIcon(Image image) {
-		iconFigure.setIcon(image);
-	}
-
-	public void setToolTipText(String text) {
-		iconFigure.setToolTipText(text);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.Figure#layout()
-	 */
-	public void validate() {
-		LayoutManager layout = getLayoutManager();
-		if (state == MINIMIZED) {
-			// iconFigure.validate();
-		} else if (state == RESTORED) {
-			Rectangle r = windowFigure.getBounds().getCopy();
-			Insets i = windowFigure.getInsets();
-			Dimension dm = maxButton.getSize();
-			Insets p = windowFigure.getTabbedTitleBarBorder().getPadding();
-			layout.setConstraint(maxButton, new Rectangle(r.x + r.width
-					- dm.width - p.right - i.right, r.y + p.top + i.top
-					- dm.height - i.bottom, -1, -1));
-			layout.setConstraint(minButton, new Rectangle(r.x + r.width - 2
-					* dm.width - 2 * p.right - i.right, r.y + p.top + i.top
-					- dm.height - i.bottom, -1, -1));
-		} else if (state == MAXIMIZED) {
-			// CR387660: restore icon on complex activity bounces around
-			// we need to use the parent's bounds when maximized instead of
-			// current window bounds
-			if (getParent() == null)
-				return;
-			Rectangle r = getParent().getBounds().getCopy();
-			Insets i = windowFigure.getInsets();
-			Dimension dm = maxButton.getSize();
-			Insets p = windowFigure.getTabbedTitleBarBorder().getPadding();
-			layout.setConstraint(maxButton, new Rectangle(r.x + r.width
-					- dm.width - p.right - i.right, r.y + p.top, -1, -1));
-		}
-		super.validate();
-	}
-	/**
-	 * @return the window figure
-	 */
-	public WindowFigure getWindowFigure() {
-		return windowFigure;
-	}
-
-	public void setFont(Font f) {
-		iconFigure.setFont(f);
-		windowFigure.setFont(f);
-	}
-
-	public void setForegroundColor(Color c) {
-		iconFigure.setForegroundColor(c);
-		windowFigure.setForegroundColor(c);
-	}
-
-	public void setBackgroundColor(Color c) {
-		iconFigure.setBackgroundColor(c);
-		windowFigure.setBackgroundColor(c);
-	}
-
-	/**
-	 * @return the state
-	 */
-	public int getState() {
-		return state;
-	}
-
-	/**
-	 * @param newState
-	 */
-	public void setState(int newState) {
-		int oldState = state;
-		state = newState;
-
-		if (state == CompoundNodeFigure.MINIMIZED) {
-			if (getParent() != null && getParent().getLayoutManager() != null) {
-				Rectangle constraint = (Rectangle) getParent()
-						.getLayoutManager().getConstraint(this);
-				constraint.width = -1;
-				constraint.height = -1;
-			}
-			showIcon();
-		} else if (state == CompoundNodeFigure.MAXIMIZED) {
-			if (getParent() != null && getParent().getLayoutManager() != null) {
-				Rectangle constraint = (Rectangle) getParent()
-						.getLayoutManager().getConstraint(this);
-				constraint.x = 0;
-				constraint.y = 0;
-				constraint.width = -1;
-				constraint.height = -1;
-			}
-			showWindow();
-		} else if (state == CompoundNodeFigure.RESTORED) {
-			if (getParent() != null && getParent().getLayoutManager() != null) {
-				Rectangle constraint = (Rectangle) getParent()
-						.getLayoutManager().getConstraint(this);
-				constraint.setSize(windowFigure.getBounds().getSize());
-			}
-			showWindow();
-		}
-		fireStateChanged(oldState, newState);
-	}
-
-	private void fireStateChanged(int oldState, int newState) {
-		Object l[] = windowFigure.getTabbedTitleBarBorder().getListeners();
-		for (int i = 0; i < l.length; ++i) {
-			if (l[i] instanceof CompoundFigureListener)
-				((CompoundFigureListener) l[i])
-						.stateChanged(oldState, newState);
-		}
-	}
-
-	public Dimension getMinimumSize(int wHint, int hHint) {
-		if (getState() == CompoundNodeFigure.RESTORED) {
-			Dimension d = windowFigure.getMinimumSize(wHint, hHint);
-			d.width += minButton.getSize().width
-					+ maxButton.getSize().width
-					+ 2
-					* windowFigure.getTabbedTitleBarBorder().getPadding()
-							.getWidth();
-			return d;
-		}
-		if (getState() == CompoundNodeFigure.MINIMIZED)
-			return iconFigure.getMinimumSize(wHint, hHint);
-		return super.getMinimumSize(wHint, hHint);
-	}
-
-	// //////////////////////////////////////////////////////////////////////
-	// FreeformFigure methods
-	// //////////////////////////////////////////////////////////////////////
-
-	private WindowFreeformHelper helper = new WindowFreeformHelper(this);
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.FreeformFigure#addFreeformListener(org.eclipse.draw2d.FreeformListener)
-	 */
-	public void addFreeformListener(FreeformListener listener) {
-		addListener(FreeformListener.class, listener);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.FreeformFigure#fireExtentChanged()
-	 */
-	public void fireExtentChanged() {
-		// CR389495: Working with nested complex activities causes in the BP
-		// editor causes lockup
-		// not specifically related to this CR, but caused a problem when
-		// compound node
-		// was moved beyond viewport's client area and de-selected - this would
-		// resize
-		// the viewport so that compound node no longer participated in bounds
-		// calculation.
-		if (state == MAXIMIZED) {
-			Iterator iter = getListeners(FreeformListener.class);
-			while (iter.hasNext())
-				((FreeformListener) iter.next()).notifyFreeformExtentChanged();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.FreeformFigure#getFreeformExtent()
-	 */
-	public Rectangle getFreeformExtent() {
-		// CR389495: Working with nested complex activities causes in the BP
-		// editor causes lockup
-		// same as above
-		if (state == MAXIMIZED)
-			return helper.getFreeformExtent();
-		return getBounds();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.FreeformFigure#removeFreeformListener(org.eclipse.draw2d.FreeformListener)
-	 */
-	public void removeFreeformListener(FreeformListener listener) {
-		removeListener(FreeformListener.class, listener);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.FreeformFigure#setFreeformBounds(org.eclipse.draw2d.geometry.Rectangle)
-	 */
-	public void setFreeformBounds(Rectangle bounds) {
-		if (getState() == MAXIMIZED)
-			helper.setFreeformBounds(bounds);
-	}
-
-	/*
-	 * CR389070: Figures are abbreviating rule figures names and making them
-	 * unreadable New Method on IContainerFigure
-	 * 
-	 * @see com.sybase.stf.gem.diagram.editor.figures.IContainerFigure#getLayer(java.lang.Object)
-	 */
-	public Layer getLayer(Object key) {
-		if (windowFigure != null && windowFigure.isVisible())
-			return windowFigure.getLayer(key);
-		return null;
-	}
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/FigureConstants.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/FigureConstants.java
deleted file mode 100644
index bb57abe..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/FigureConstants.java
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/GEMPreferences.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/GEMPreferences.java
deleted file mode 100644
index 790f2c5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/GEMPreferences.java
+++ /dev/null
@@ -1,834 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.preference;
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.jface.preference.BooleanFieldEditor;
-import org.eclipse.jface.preference.ColorFieldEditor;
-import org.eclipse.jface.preference.FieldEditorPreferencePage;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.preference.IntegerFieldEditor;
-import org.eclipse.jface.preference.PreferenceConverter;
-import org.eclipse.jface.resource.ColorRegistry;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.accessibility.AccessibleAdapter;
-import org.eclipse.swt.accessibility.AccessibleEvent;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.RGB;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPreferencePage;
-
-/**
- * This class represents a preference page that is contributed to the
- * Preferences dialog. By subclassing <samp>FieldEditorPreferencePage </samp>,
- * we can use the field support built into JFace that allows us to create a page
- * that is small and knows how to save, restore and apply itself.
- * <p>
- * This page is used to modify preferences only. They are stored in the
- * preference store that belongs to the main plug-in class. That way,
- * preferences can be accessed directly via the preference store.
- */
-
-public final class GEMPreferences extends FieldEditorPreferencePage implements
-		IWorkbenchPreferencePage {
-	// appearance
-    /**
-     * Key for preference for whether or not the intro editor should be shown
-     */
-    public final static String SHOW_INTRO_EDITOR = "ShowIntroEditor"; //$NON-NLS-1$
-    
-	/**
-	 * use system colors preference
-	 */
-	public final static String USE_SYSTEM_COLORS = "UseSystemColors"; //$NON-NLS-1$
-
-	/**
-	 * canvas color preference
-	 */
-	public final static String CANVAS_COLOR = "CanvasColor"; //$NON-NLS-1$
-
-	/**
-	 * figure label font
-	 */
-	public final static String FIGURE_LABEL_FONT = "FigureLabelFont"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public final static String FIGURE_LABEL_FONT_COLOR = "FigureLabelFontColor"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public final static String LABEL_PLACEMENT = "LabelPlacement"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public final static String INPUT_PORT_COLOR = "InputPortColor"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public final static String OUTPUT_PORT_COLOR = "OutputPortColor"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public final static String SHOW_LINE_LABELS = "ShowLineLabels"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public final static String LINE_LABEL_FONT = "LineLabelFont"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public final static String LINE_LABEL_FONT_COLOR = "LineLabelFontColor"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public final static String LINE_LABEL_COLOR = "LineLabelColor"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public final static String LINE_WIDTH = "LineWidth"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public final static String LINE_COLOR = "LineColor"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public final static String LINE_ROUTING = "LineRouting"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public final static String SNAP_TO_GRID = "SnapToGrid"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public final static String SNAP_TO_GEOMETRY = "SnapToGeometry"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public final static String GRID_WIDTH = "GridWidth"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public final static String GRID_HEIGHT = "GridHeight"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public final static String GRID_COLOR = "GridColor"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public final static String LABEL_PLACEMENT_TOP = "Top"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public final static String LABEL_PLACEMENT_BOTTOM = "Bottom"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public final static String LABEL_PLACEMENT_LEFT = "Left"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public final static String LABEL_PLACEMENT_RIGHT = "Right"; //$NON-NLS-1$
-
-	// 
-	/**
-	 * "Direct" routing was intended for connections lines without bendpoints;
-	 * this has been removed because it is unnecessary.
-	 * public final static String LINE_ROUTING_DIRECT = "Direct";
-	 * "Manhattan" line routing creates orthogonal lines
-	 */
-	public final static String LINE_ROUTING_MANHATTAN = "Manhattan"; //$NON-NLS-1$
-
-	/**
-	 * "Manual" routing allows user to create bendpoints
-	 */
-	public final static String LINE_ROUTING_MANUAL = "Manaul"; //$NON-NLS-1$
-
-	private final static String[][] m_lineRoutingLabels = {
-			// display, key
-			// { GEMPlugin.getResourceString("CanvasPreferences.LABEL.Direct"),
-			// LINE_ROUTING_DIRECT }, //$NON-NLS-1$ //$NON-NLS-2$
-			{
-				PreferenceMessages.CanvasPreferences_LABEL_Manual, LINE_ROUTING_MANUAL },
-			{
-					PreferenceMessages.CanvasPreferences_LABEL_Manhattan, LINE_ROUTING_MANHATTAN }
-	};
-
-	private final static String[][] m_labelPlacementLabels = {
-			{
-				PreferenceMessages.CanvasPreferences_LABEL_Top, LABEL_PLACEMENT_TOP },
-			{
-					PreferenceMessages.CanvasPreferences_LABEL_Bottom, LABEL_PLACEMENT_BOTTOM },
-			{
-						PreferenceMessages.CanvasPreferences_LABEL_Left, LABEL_PLACEMENT_LEFT },
-			{
-							PreferenceMessages.CanvasPreferences_LABEL_Right, LABEL_PLACEMENT_RIGHT }
-	};
-
-	private Group canvasGroup;
-
-	private Group iconGroup;
-
-	private Group lineGroup;
-
-	private BooleanField useSystemColors;
-
-	private ColorFieldEditor canvasColor;
-
-	private BooleanField snapToGrid;
-
-	private IntegerFieldEditor gridWidth;
-
-	private IntegerFieldEditor gridHeight;
-
-	private ColorFieldEditor gridColor;
-
-	private BooleanField showLineLabels;
-
-	private ColorFieldEditor lineLabelColor;
-
-	private ColorFieldEditor lineColor;
-
-	private ColorFontFieldEditor iconFont;
-
-	private ColorFontFieldEditor lineFont;
-
-	// private ColorFieldEditor inputPortColor;
-	//
-	// private ColorFieldEditor outputPortColor;
-
-	// CR392586: resource leaks
-	// at least keep leaks bounded...
-//	private static Hashtable resourceRegistry = new Hashtable();
-
-	private class BooleanField extends BooleanFieldEditor {
-		private Composite parent;
-
-		/**
-		 * @param name
-		 * @param label
-		 * @param parent
-		 */
-		public BooleanField(String name, String label, Composite parent) {
-			super(name, label, parent);
-			this.parent = parent;
-		}
-
-		/**
-		 * @return the change control button
-		 */
-		public Button getButton() {
-			return getChangeControl(parent);
-		}
-	}
-
-	/**
-	 * Constructor
-	 */
-	public GEMPreferences() {
-		super(GRID);
-		// FIXME: we should be encapsulating what pref store is used for all callers of this class
-		setPreferenceStore(EditorPlugin.getDefault().getPreferenceStore());
-		setDescription(PreferenceMessages.GEMPreferences_description);
-	}
-
-	/**
-	 * Sets the default values of the preferences.
-	 */
-	public static void initializeDefaults() {
-		IPreferenceStore store = EditorPlugin.getDefault().getPreferenceStore();
-		Font f = JFaceResources.getFontRegistry().get(
-				JFaceResources.DEFAULT_FONT);
-
-		store.setDefault(SHOW_INTRO_EDITOR, true);
-		store.setDefault(USE_SYSTEM_COLORS, true);
-		PreferenceConverter.setDefault(store, CANVAS_COLOR, new RGB(255, 255,
-				255));
-		PreferenceConverter.setDefault(store, FIGURE_LABEL_FONT, f
-				.getFontData());
-		store.setDefault(LINE_WIDTH, 1);
-		store.setDefault(LINE_ROUTING, getLineRoutingLabels()[0][1]);
-		store.setDefault(SHOW_LINE_LABELS, true);
-		PreferenceConverter.setDefault(store, LINE_COLOR, new RGB(0, 0, 0));
-		PreferenceConverter.setDefault(store, LINE_LABEL_COLOR, new RGB(255,
-				255, 255));
-		PreferenceConverter.setDefault(store, LINE_LABEL_FONT, f.getFontData());
-		store.setDefault(SNAP_TO_GEOMETRY, true);
-		store.setDefault(SNAP_TO_GRID, true);
-		store.setDefault(GRID_WIDTH, 12);
-		store.setDefault(GRID_HEIGHT, 12);
-		PreferenceConverter.setDefault(store, GRID_COLOR,
-				new RGB(230, 230, 230));
-		store.setDefault(LABEL_PLACEMENT, LABEL_PLACEMENT_BOTTOM);
-	}
-
-	/**
-	 * Creates the field editors. Field editors are abstractions of the common
-	 * GUI blocks needed to manipulate various types of preferences. Each field
-	 * editor knows how to save and restore itself.
-	 */
-
-	public void createFieldEditors() {
-	    
-	    // note, we aren't saving the reference.  It's assumed that parent
-	    // worries about destruction, persistence etc.
-	    addBooleanField(
-	            SHOW_INTRO_EDITOR,
-	            PreferenceMessages.EditorPreferences_LABEL_ShowIntroEditor,
-	            getFieldEditorParent());
-	            
-		useSystemColors = addBooleanField(
-				USE_SYSTEM_COLORS,
-				PreferenceMessages.CanvasPreferenceTab_LABEL_UseSystemColors,
-				getFieldEditorParent());
-
-		canvasGroup = new Group(getFieldEditorParent(), SWT.NULL);
-		lineGroup = new Group(getFieldEditorParent(), SWT.NULL);
-		iconGroup = new Group(getFieldEditorParent(), SWT.NULL);
-
-		canvasGroup.setText(PreferenceMessages.CanvasPreferenceTab_LABEL_Canvas);
-		canvasColor = addColorField(
-				CANVAS_COLOR,
-				PreferenceMessages.CanvasPreferenceTab_LABEL_BackgroundColor, canvasGroup);
-        // Fix for Bug 268443: [hotbug] FacesConfig Editor preferences page needs more info for screen readers
-        // https://bugs.eclipse.org/bugs/show_bug.cgi?id=268443
-        canvasColor.getColorSelector().getButton().getAccessible().addAccessibleListener(
-                new AccessibleAdapter () {         
-                    public void getName (final AccessibleEvent e) {
-                        e.result = PreferenceMessages.CanvasPreferenceTab_LABEL_BackgroundColor;
-                    }
-                });
-
-		addBooleanField(
-				SNAP_TO_GEOMETRY,
-				PreferenceMessages.CanvasPreferenceTab_LABEL_SnapToGeometry, canvasGroup);
-		snapToGrid = addBooleanField(
-				SNAP_TO_GRID,
-				PreferenceMessages.CanvasPreferenceTab_LABEL_SnapToGrid, canvasGroup);
-		gridColor = addColorField(
-				GRID_COLOR,
-				PreferenceMessages.CanvasPreferenceTab_LABEL_GridLineColor, canvasGroup);
-        gridColor.getColorSelector().getButton().getAccessible().addAccessibleListener(
-                new AccessibleAdapter () {         
-                    public void getName (final AccessibleEvent e) {
-                        e.result = PreferenceMessages.CanvasPreferenceTab_LABEL_GridLineColor;
-                    }
-                });
-        gridWidth = addIntegerField(
-				GRID_WIDTH,
-				PreferenceMessages.CanvasPreferenceTab_LABEL_GridWidth, canvasGroup);
-		gridHeight = addIntegerField(
-				GRID_HEIGHT,
-				PreferenceMessages.CanvasPreferenceTab_LABEL_GridHeight, canvasGroup);
-
-		iconGroup.setText(PreferenceMessages.CanvasPreferenceTab_LABEL_IconGroup);
-		iconFont = addFontField(
-				FIGURE_LABEL_FONT,
-				PreferenceMessages.CanvasPreferenceTab_LABEL_IconLabelFont, iconGroup);
-        iconFont.getChangeControl(iconGroup).getAccessible().addAccessibleListener(
-                new AccessibleAdapter () {         
-                    public void getName (final AccessibleEvent e) {
-                        e.result = PreferenceMessages.CanvasPreferenceTab_LABEL_IconLabelFont;
-                    }
-                });
-		addComboField(LABEL_PLACEMENT, PreferenceMessages.CanvasPreferenceTab_LABEL_LabelPlacement,
-				getLabelPlacementLabels(), iconGroup);
-		// inputPortColor = addColorField(
-		// INPUT_PORT_COLOR,
-		// EditorPlugin
-		// .getResourceString("CanvasPreferenceTab.LABEL.InputPortColor"),
-		// iconGroup); //$NON-NLS-1$
-		// outputPortColor = addColorField(
-		// OUTPUT_PORT_COLOR,
-		// EditorPlugin
-		// .getResourceString("CanvasPreferenceTab.LABEL.OutputPortColor"),
-		// iconGroup); //$NON-NLS-1$
-
-		lineGroup.setText(PreferenceMessages.CanvasPreferenceTab_LABEL_LineGroup);
-		showLineLabels = addBooleanField(SHOW_LINE_LABELS, PreferenceMessages.CanvasPreferenceTab_LABEL_ShowLineLabels,
-				lineGroup);
-		lineFont = addFontField(
-				LINE_LABEL_FONT,
-				 PreferenceMessages.CanvasPreferenceTab_LABEL_LineLabelFont, lineGroup);
-        lineFont.getChangeControl(lineGroup).getAccessible().addAccessibleListener(
-                new AccessibleAdapter () {         
-                    public void getName (final AccessibleEvent e) {
-                        e.result = PreferenceMessages.CanvasPreferenceTab_LABEL_LineLabelFont;
-                    }
-                });
-		lineLabelColor = addColorField(
-				LINE_LABEL_COLOR,
-				 PreferenceMessages.CanvasPreferenceTab_LABEL_LineLabelColor, lineGroup);
-        lineLabelColor.getColorSelector().getButton().getAccessible().addAccessibleListener(
-                new AccessibleAdapter () {         
-                    public void getName (final AccessibleEvent e) {
-                        e.result = PreferenceMessages.CanvasPreferenceTab_LABEL_LineLabelColor;
-                    }
-                });
-		
-		lineColor = addColorField(
-				LINE_COLOR,
-				 PreferenceMessages.CanvasPreferenceTab_LABEL_LineColor, lineGroup);
-        lineColor.getColorSelector().getButton().getAccessible().addAccessibleListener(
-                new AccessibleAdapter () {         
-                    public void getName (final AccessibleEvent e) {
-                        e.result = PreferenceMessages.CanvasPreferenceTab_LABEL_LineColor;
-                    }
-                });
-		addIntegerField(
-				LINE_WIDTH,
-				 PreferenceMessages.CanvasPreferenceTab_LABEL_LineWidth, lineGroup);
-		addComboField(LINE_ROUTING,  PreferenceMessages.CanvasPreferenceTab_LABEL_LineRouting,
-				getLineRoutingLabels(), lineGroup);
-	}
-
-	protected void initialize() {
-		// Color use: Default canvas colors should pick up system defaults
-		// enable or disable all of the color and font selection controls in the
-		// preference dialog
-		// depending on whether the "Use System Colors" checkbox is selected.
-		super.initialize();
-
-		((GridLayout) getFieldEditorParent().getLayout()).numColumns = 2;
-
-		canvasGroup.setLayout(new GridLayout(3, false));
-		canvasGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING));
-		canvasColor.fillIntoGrid(canvasGroup, 3);
-		gridColor.fillIntoGrid(canvasGroup, 3);
-
-		iconGroup.setLayout(new GridLayout(3, false));
-		iconGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING));
-		iconFont.fillIntoGrid(iconGroup, 3);
-
-		lineGroup.setLayout(new GridLayout(3, false));
-		lineGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING));
-		lineColor.fillIntoGrid(lineGroup, 3);
-		lineLabelColor.fillIntoGrid(lineGroup, 3);
-		lineFont.fillIntoGrid(lineGroup, 3);
-
-		boolean userColorsValue = !useSystemColors.getBooleanValue();
-		boolean showLineLabelsValue = showLineLabels.getBooleanValue();
-		boolean snapToGridValue = snapToGrid.getBooleanValue();
-		canvasColor.setEnabled(userColorsValue, canvasGroup);
-		gridColor.setEnabled(snapToGridValue && userColorsValue, canvasGroup);
-		iconFont.setEnabled(userColorsValue, iconGroup);
-		// inputPortColor.setEnabled(userColorsValue, iconGroup);
-		// outputPortColor.setEnabled(userColorsValue, iconGroup);
-		lineColor.setEnabled(userColorsValue, lineGroup);
-		lineLabelColor.setEnabled(showLineLabelsValue && userColorsValue,
-				lineGroup);
-		lineFont.setEnabled(showLineLabelsValue && userColorsValue, lineGroup);
-		gridWidth.setEnabled(snapToGridValue, canvasGroup);
-		gridHeight.setEnabled(snapToGridValue, canvasGroup);
-
-		useSystemColors.getButton().addSelectionListener(
-				new SelectionAdapter() {
-					public void widgetSelected(SelectionEvent e) {
-						boolean userColorsValue_ = !useSystemColors
-								.getBooleanValue();
-						boolean showLineLabelsValue_ = showLineLabels
-								.getBooleanValue();
-						boolean snapToGridValue_ = snapToGrid.getBooleanValue();
-
-						canvasColor.setEnabled(userColorsValue_, canvasGroup);
-						gridColor
-								.setEnabled(snapToGridValue_ && userColorsValue_,
-										canvasGroup);
-						iconFont.setEnabled(userColorsValue_, iconGroup);
-						// inputPortColor.setEnabled(userColorsValue,
-						// iconGroup);
-						// outputPortColor.setEnabled(userColorsValue,
-						// iconGroup);
-						lineColor.setEnabled(userColorsValue_, lineGroup);
-						lineLabelColor.setEnabled(showLineLabelsValue_
-								&& userColorsValue_, lineGroup);
-						lineFont.setEnabled(showLineLabelsValue_
-								&& userColorsValue_, lineGroup);
-					}
-				});
-
-		showLineLabels.getButton().addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				boolean userColorsValue_ = !useSystemColors.getBooleanValue();
-				boolean showLineLabelsValue_ = showLineLabels.getBooleanValue();
-				lineLabelColor.setEnabled(showLineLabelsValue_
-						&& userColorsValue_, lineGroup);
-				lineFont.setEnabled(showLineLabelsValue_ && userColorsValue_,
-						lineGroup);
-			}
-		});
-
-		snapToGrid.getButton().addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				boolean userColorsValue_ = !useSystemColors.getBooleanValue();
-				boolean snapToGridValue_ = snapToGrid.getBooleanValue();
-
-				gridColor.setEnabled(snapToGridValue_ && userColorsValue_,
-						canvasGroup);
-				gridWidth.setEnabled(snapToGridValue_, canvasGroup);
-				gridHeight.setEnabled(snapToGridValue_, canvasGroup);
-			}
-		});
-
-	}
-
-	public void init(IWorkbench workbench) {
-        // no initialization
-	}
-
-	private ColorFieldEditor addColorField(String name, String labelText,
-			Composite parent) {
-		ColorFieldEditor f = new ColorFieldEditor(name, labelText, parent);
-		addField(f);
-		return f;
-	}
-
-	private ComboFieldEditor addComboField(String name, String labelText,
-			String[][] entryNamesAndValues, Composite parent) {
-		ComboFieldEditor f = new ComboFieldEditor(name, labelText,
-				entryNamesAndValues, parent);
-		addField(f);
-		return f;
-	}
-
-	private IntegerFieldEditor addIntegerField(String name, String labelText,
-			Composite parent) {
-		IntegerFieldEditor f = new IntegerFieldEditor(name, labelText, parent);
-		addField(f);
-		return f;
-	}
-
-	private BooleanField addBooleanField(String name, String labelText,
-			Composite parent) {
-		BooleanField f = new BooleanField(name, labelText, parent);
-		addField(f);
-		return f;
-	}
-
-//	private StringFieldEditor addStringField(String name, String labelText,
-//			Composite parent) {
-//		StringFieldEditor f = new StringFieldEditor(name, labelText, parent);
-//		addField(f);
-//		return f;
-//	}
-
-	// protected NumberField addNumberField(String name, String labelText,
-	// Composite parent)
-	// {
-	// NumberField f = new NumberField(name,labelText,parent);
-	// addField(f);
-	// return f;
-	// }
-
-	private ColorFontFieldEditor addFontField(String name, String labelText,
-			Composite parent) {
-		ColorFontFieldEditor f = new ColorFontFieldEditor(name, labelText,
-				parent);
-		addField(f);
-		return f;
-	}
-
-	private static String[][] getLineRoutingLabels() {
-		return m_lineRoutingLabels;
-	}
-
-	private static String[][] getLabelPlacementLabels() {
-		return m_labelPlacementLabels;
-	}
-
-//	private static void propagateProperty(String property, EditPart part) {
-//		Iterator iter = part.getChildren().iterator();
-//		while (iter.hasNext()) {
-//			EditPart child = (EditPart) iter.next();
-//			Figure fig = (Figure) ((GraphicalEditPart) child).getFigure();
-//			GEMPreferences.propagateProperty(property, fig);
-//			propagateProperty(property, child);
-//		}
-//	}
-
-	/**
-	 * @return true if the preference is set to show the introduction
-	 * editor.  false otherwise.
-	 */
-	public static boolean getShowIntroEditor()
-	{
-	    IPreferenceStore store = EditorPlugin.getDefault().getPreferenceStore();
-	    return store.getBoolean(SHOW_INTRO_EDITOR);
-	}
-	
-	/**
-	 * @param store
-	 * @param property
-	 * @return the color property for the key 'property'
-	 */
-	public static Color getColor(IPreferenceStore store, String property) {
-		boolean useSystemColors = store.getBoolean(USE_SYSTEM_COLORS);
-
-		Color c = ColorConstants.black;
-		if (useSystemColors) {
-			if (GRID_COLOR.equals(property))
-				// c = ColorConstants.buttonDarkest;
-				c = ColorConstants.button;
-			if (LINE_COLOR.equals(property))
-				c = ColorConstants.listForeground;
-			if (LINE_LABEL_FONT_COLOR.equals(property))
-				c = ColorConstants.listForeground;
-			if (LINE_LABEL_COLOR.equals(property))
-				c = ColorConstants.listBackground;
-			if (CANVAS_COLOR.equals(property))
-				c = ColorConstants.listBackground;
-			if (INPUT_PORT_COLOR.equals(property))
-				c = ColorConstants.listForeground;
-			if (OUTPUT_PORT_COLOR.equals(property))
-				c = ColorConstants.listForeground;
-			if (FIGURE_LABEL_FONT_COLOR.equals(property))
-				c = ColorConstants.listForeground;
-		} else {
-			// CR392586: resource leaks
-			RGB rgb = PreferenceConverter.getColor(store, property);
-			ColorRegistry registry = JFaceResources.getColorRegistry();
-			if (registry.get(rgb.toString()) != null)
-				return registry.get(rgb.toString());
-			registry.put(rgb.toString(), rgb);
-			c = registry.get(rgb.toString());
-		}
-		return c;
-	}
-
-//	// CR392586: resource leaks
-//	private static Font getFont(IPreferenceStore store, String property) {
-//		FontData fd = PreferenceConverter.getFontData(store, property);
-//		FontRegistry registry = JFaceResources.getFontRegistry();
-//		if (!registry.get(fd.toString()).equals(registry.defaultFont()))
-//			return registry.get(fd.toString());
-//
-//		registry.put(fd.toString(), new FontData[] {fd});
-//		return registry.get(fd.toString());
-//	}
-
-//	private static void propagateProperty(String property, Figure fig) {
-//		IPreferenceStore store = EditorPlugin.getDefault().getPreferenceStore();
-//		WindowFigure window = null;
-//		IconFigure icon = null;
-//		LinkFigure link = null;
-//		if (fig instanceof CompoundNodeFigure) {
-//			window = ((CompoundNodeFigure) fig).getWindowFigure();
-//			icon = ((CompoundNodeFigure) fig).getIconFigure();
-//		} else if (fig instanceof WindowFigure)
-//			window = (WindowFigure) fig;
-//		else if (fig instanceof LinkFigure)
-//			link = (LinkFigure) fig;
-//
-//		if (property != null && property.equals(USE_SYSTEM_COLORS))
-//			// reload all properties - it's easiest
-//			property = null;
-//
-//		if (property == null || SNAP_TO_GRID.equals(property)) {
-//			boolean b = store.getBoolean(SNAP_TO_GRID);
-//			WindowFigure.defaultGridEnabled = b;
-//
-//			if (window != null)
-//				window.getGridLayer().setVisible(b);
-//		}
-//
-//		if (property == null || GRID_WIDTH.equals(property)
-//				|| GRID_HEIGHT.equals(property)) {
-//			Dimension d = new Dimension(store.getInt(GRID_WIDTH), store
-//					.getInt(GRID_HEIGHT));
-//			WindowFigure.defaultGridSpacing = d;
-//
-//			if (window != null)
-//				window.getGridLayer().setSpacing(d);
-//		}
-//
-//		if (property == null || GRID_COLOR.equals(property)) {
-//			Color c = getColor(store, GRID_COLOR);
-//			WindowFigure.defaultGridColor = c;
-//
-//			if (window != null)
-//				window.getGridLayer().setForegroundColor(c);
-//		}
-//
-//		// TODO: since the line router is managed by the EditPart for the
-//		// container figure, setting the line routing style in the WindowFigure
-//		// does not change the line routing immediately. The editor must be
-//		// restarted for line routing to take effect.
-//		if (property == null || LINE_ROUTING.equals(property)) {
-//			String s = store.getString(LINE_ROUTING);
-//			int style;
-//			if (LINE_ROUTING_MANHATTAN.equals(s))
-//				style = WindowFigure.LINE_ROUTING_MANHATTAN;
-//			else
-//				style = WindowFigure.LINE_ROUTING_MANUAL;
-//
-//			WindowFigure.defaultLineRoutingStyle = style;
-//			if (window != null)
-//				window.setLineRoutingStyle(style);
-//		}
-//
-//		if (property == null || LINE_WIDTH.equals(property)) {
-//			int w = store.getInt(LINE_WIDTH);
-//			LinkFigure.defaultLineWidth = w;
-//
-//			if (link != null)
-//				link.setLineWidth(w);
-//		}
-//
-//		if (property == null || LINE_COLOR.equals(property)) {
-//			Color c = getColor(store, LINE_COLOR);
-//			LinkFigure.defaultLineColor = c;
-//
-//			if (link != null)
-//				link.setForegroundColor(c);
-//		}
-//
-//		if (property == null || SHOW_LINE_LABELS.equals(property)) {
-//			boolean b = store.getBoolean(SHOW_LINE_LABELS);
-//			LinkFigure.defaultLabelVisible = b;
-//
-//			if (link != null)
-//				link.setLabelVisible(b);
-//		}
-//
-//		if (property == null || LINE_LABEL_FONT.equals(property)
-//				|| LINE_LABEL_FONT_COLOR.equals(property)) {
-//			// CR392586: resource leaks
-//			Font f = getFont(store, LINE_LABEL_FONT);
-//			Color c = getColor(store, LINE_LABEL_FONT_COLOR);
-//			LinkFigure.defaultFont = f;
-//			LinkFigure.defaultLabelForeground = c;
-//
-//			if (link != null) {
-//				link.setFont(f);
-//				link.setLabelForeground(c);
-//			}
-//		}
-//
-//		if (property == null || LINE_LABEL_COLOR.equals(property)) {
-//			Color c = getColor(store, LINE_LABEL_COLOR);
-//			LinkFigure.defaultLabelBackground = c;
-//
-//			if (link != null)
-//				link.setLabelBackground(c);
-//		}
-//
-//		if (property == null || CANVAS_COLOR.equals(property)) {
-//			Color c = getColor(store, CANVAS_COLOR);
-//			WindowFigure.defaultBackgroundColor = c;
-//
-//			if (window != null)
-//				window.setBackgroundColor(c);
-//			if (icon != null)
-//				icon.setBackgroundColor(c);
-//		}
-//
-//		if (property == null || INPUT_PORT_COLOR.equals(property)) {
-//			Color c = getColor(store, INPUT_PORT_COLOR);
-//			InputPortFigure.defaultForegroundColor = c;
-//
-//			if (fig instanceof InputPortFigure)
-//				fig.setForegroundColor(c);
-//		}
-//
-//		if (property == null || OUTPUT_PORT_COLOR.equals(property)) {
-//			Color c = getColor(store, OUTPUT_PORT_COLOR);
-//			OutputPortFigure.defaultForegroundColor = c;
-//
-//			if (fig instanceof OutputPortFigure)
-//				fig.setForegroundColor(c);
-//		}
-//
-//		if (property == null || FIGURE_LABEL_FONT.equals(property)
-//				|| FIGURE_LABEL_FONT_COLOR.equals(property)) {
-//			// CR392586: resource leaks
-//			Font f = getFont(store, FIGURE_LABEL_FONT);
-//			Color c = getColor(store, FIGURE_LABEL_FONT_COLOR);
-//			IconFigure.defaultFont = f;
-//			IconFigure.defaultForegroundColor = c;
-//			WindowFigure.defaultFont = f;
-//			WindowFigure.defaultForegroundColor = c;
-//
-//			if (window != null) {
-//				window.setFont(f);
-//				window.setForegroundColor(c);
-//			}
-//			if (icon != null) {
-//				icon.setFont(f);
-//				icon.setForegroundColor(c);
-//			}
-//			if (fig instanceof IconFigure) {
-//				fig.setFont(f);
-//				fig.setForegroundColor(c);
-//			}
-//		}
-//
-//		if (property == null || LABEL_PLACEMENT.equals(property)) {
-//			int placement = PositionConstants.SOUTH;
-//			String s = store.getString(LABEL_PLACEMENT);
-//			if (LABEL_PLACEMENT_TOP.equals(s))
-//				placement = PositionConstants.NORTH;
-//			if (LABEL_PLACEMENT_BOTTOM.equals(s))
-//				placement = PositionConstants.SOUTH;
-//			if (LABEL_PLACEMENT_LEFT.equals(s))
-//				placement = PositionConstants.WEST;
-//			if (LABEL_PLACEMENT_RIGHT.equals(s))
-//				placement = PositionConstants.EAST;
-//			IconFigure.defaultTextPlacement = placement;
-//
-//			if (icon != null)
-//				icon.setTextPlacement(placement);
-//			if (fig instanceof IconFigure)
-//				((IconFigure) fig).setTextPlacement(placement);
-//		}
-//
-//		Iterator iter = fig.getChildren().iterator();
-//		while (iter.hasNext()) {
-//			Figure child = (Figure) iter.next();
-//			propagateProperty(property, child);
-//		}
-//	}
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/IBaseFigure.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/IBaseFigure.java
deleted file mode 100644
index 4119636..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/IBaseFigure.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.preference;
-
-import java.util.List;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * @author Bob
- */
-/*package*/ interface IBaseFigure extends IFigure 
-{
-	/**
-	 * @param text
-	 */
-	public abstract void setText(String text);
-
-	/**
-	 * @return the text
-	 */
-	public abstract String getText();
-
-	/**
-	 * CR374981: Long activity labels do not get wrapped or truncated This
-	 * method was added to the IBaseFigure interface to support direct edit of
-	 * figure labels on the canvas.
-	 * @return the text bounds rectangle
-	 */
-	public abstract Rectangle getTextBounds();
-
-	/**
-	 * @param image
-	 */
-	public abstract void setIcon(Image image);
-
-	/**
-	 * @return the icon
-	 */
-	public abstract Image getIcon();
-
-	/**
-	 * @param text
-	 */
-	public abstract void setToolTipText(String text);
-
-	/**
-	 * @return the tool tip text
-	 */
-	public abstract String getToolTipText();
-
-	/**
-	 * @param flag
-	 */
-	public abstract void setHighlight(boolean flag);
-
-	/**
-	 * Add decorator.  May
-	 * cause the figure to become invalidated
-	 * @param decorator
-	 */
-	public abstract void addDecorator(BaseFigureDecorator decorator);
-
-	/**
-	 * Remove the decorator
-	 */
-	public abstract void removeDecorator();
-
-	/**
-	 * @param position
-	 */
-	public abstract void removeDecorator(int position);
-
-	/**
-	 * @return the list of decoractors
-	 */
-	public abstract List getDecorators();
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/IContainerFigure.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/IContainerFigure.java
deleted file mode 100644
index 4de2acb..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/IContainerFigure.java
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/IconFigure.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/IconFigure.java
deleted file mode 100644
index 1336edc..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/IconFigure.java
+++ /dev/null
@@ -1,415 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.preference;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.draw2d.AncestorListener;
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.Label;
-import org.eclipse.draw2d.Layer;
-import org.eclipse.draw2d.MarginBorder;
-import org.eclipse.draw2d.PositionConstants;
-import org.eclipse.draw2d.XYLayout;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * And IconFigure consists of a bitmap image with a text label below it.
- * 
- * @author bbrodt
- */
-/*package*/ class IconFigure extends Label implements IBaseFigure {
-	private static int defaultTextPlacement = PositionConstants.SOUTH;
-
-	static Font defaultFont = JFaceResources.getFontRegistry().get(
-			JFaceResources.DEFAULT_FONT);
-
-	static Color defaultForegroundColor = ColorConstants.black;
-
-	private ArrayList decorators;
-
-	private IconLabel iconLabel = null;
-
-	// CR389070: Figures are abbreviating rule figures names and making them
-	// unreadable
-	// New class that implements a separate "floating" label which is NOT
-	// included in bounds calculations for this IconFigure
-	private class IconLabel extends Label {
-		private LabelLocator locator;
-
-		private IconFigure host;
-
-		/**
-		 * @param host
-		 * @param text
-		 */
-		public IconLabel(IconFigure host, String text) {
-			super(text);
-			this.host = host;
-			locator = new LabelLocator(this);
-		}
-
-		/**
-		 * @return the icon figure
-		 */
-		public IconFigure getHost() {
-			return host;
-		}
-
-		public Dimension getPreferredSize(int wHint, int hHing) {
-			return host.getTextBounds().getSize();
-		}
-
-		public void setText(String text) {
-			super.setText(text);
-			if (locator != null)
-				locator.setConstraints();
-		}
-
-		public void invalidate() {
-			if (locator != null)
-				locator.setConstraints();
-			super.invalidate();
-		}
-	}
-
-	// CR389070: Figures are abbreviating rule figures names and making them
-	// unreadable
-	// helper class that relocates the IconLabel whenever ancestor is moved or
-	// added/removed
-	private class LabelLocator implements AncestorListener {
-		IconLabel label;
-
-		/**
-		 * @param label
-		 */
-		public LabelLocator(IconLabel label) {
-			this.label = label;
-			label.getHost().addAncestorListener(this);
-		}
-
-		// CR408950: BP Save problems
-		// fixed icon label refresh problems
-		private Layer getParentLayer() {
-			IFigure fig = label.getHost();
-			while (fig != null) {
-				if (fig instanceof Layer)
-					return (Layer) fig;
-				fig = fig.getParent();
-			}
-			return null;
-		}
-
-		public void ancestorAdded(IFigure ancestor) {
-			Layer layer = getParentLayer();
-			if (layer != null && !layer.getChildren().contains(label)) {
-				layer.add(label);
-				setConstraints();
-			}
-		}
-
-		public void ancestorMoved(IFigure ancestor) {
-			setConstraints();
-		}
-
-		public void ancestorRemoved(IFigure ancestor) {
-			// CR400779: GEM minimizing a complex activity sometimes leaves junk
-			// on the screen
-			if (label.getParent() != null
-					&& label.getParent().getChildren().contains(label))
-				label.getParent().remove(label);
-		}
-
-		/**
-		 * 
-		 */
-		public void setConstraints() {
-			Layer layer = getParentLayer();
-			if (layer != null && layer.getLayoutManager() != null
-					&& layer.getChildren().contains(label)) {
-				Rectangle r = IconFigure.this.getParent().getBounds().getCopy();
-				r.translate(IconFigure.this.getBounds().getLocation());
-				r.translate(IconFigure.this.getTextLocation());
-				r.width = -1;
-				r.height = -1;
-				Rectangle oldr = (Rectangle) layer.getLayoutManager()
-						.getConstraint(label);
-				if (oldr == null || oldr.x != r.x || oldr.y != r.y)
-					layer.setConstraint(label, r);
-			}
-		}
-	}
-
-	/**
-	 * @param name 
-	 * @param icon 
-	 */
-	public IconFigure(String name, Image icon) {
-		super(name, icon);
-		setTextPlacement(defaultTextPlacement);
-		setOpaque(false);
-		setIcon(icon);
-		setIconTextGap(0);
-		setForegroundColor(defaultForegroundColor);
-		// CR396303: DND in RulePanel does not get correct location if viewer is
-		// scrolled
-		setBackgroundColor(ColorConstants.titleGradient);
-		XYLayout layout = new XYLayout();
-		setLayoutManager(layout);
-
-		// CR389070: Figures are abbreviating rule figures names and making them
-		// unreadable
-		iconLabel = new IconLabel(this, name);
-		iconLabel.setFont(getFont());
-	}
-
-	// CR389070: Figures are abbreviating rule figures names and making them
-	// unreadable
-	/**
-	 * @return the label
-	 */
-	public Label getLabel() {
-		return iconLabel;
-	}
-
-	public List getDecorators() {
-		if (decorators == null)
-			decorators = new ArrayList();
-		return decorators;
-	}
-
-	public Font getFont() {
-		if (defaultFont == null)
-        {
-			defaultFont = JFaceResources.getFontRegistry().get(
-					JFaceResources.DEFAULT_FONT);
-        }
-        
-		if (getLocalFont() == null)
-        {
-            // TODO: replaced a deprecated assignment to font
-            // with this, but the behaviour is a little different
-			setFont(defaultFont);
-        }
-        
-		return getLocalFont();
-	}
-
-	public void setFont(Font f) {
-        Font localFont = getLocalFont();
-		if (localFont != f) {
-			iconLabel.setFont(f);
-		}
-        super.setFont(f);
-	}
-
-	public void setVisible(boolean visible) {
-		super.setVisible(visible);
-		iconLabel.setVisible(visible);
-	}
-
-	public void setText(String text) {
-		super.setText(text);
-		// CR389070: Figures are abbreviating rule figures names and making them
-		// unreadable
-		if (iconLabel != null && iconLabel.isVisible()) {
-			iconLabel.setText(text);
-			iconLabel.setFont(getFont());
-			// labelLocator.setConstraints();
-		}
-	}
-
-	public void setToolTipText(String text) {
-		Label toolTipLabel = null;
-
-		if (text != null && text.length() > 0) {
-			toolTipLabel = new Label(text);
-			toolTipLabel.setBorder(new MarginBorder(3));
-		}
-
-		super.setToolTip(toolTipLabel);
-	}
-
-	public String getToolTipText() {
-		if (getToolTip() != null)
-			return ((Label) getToolTip()).getText();
-		return null;
-	}
-
-	public void setHighlight(boolean flag) {
-		if (flag)
-			setOpaque(true);
-		else
-			setOpaque(false);
-	}
-
-	// CR389070: Figures are abbreviating rule figures names and making them
-	// unreadable
-	protected Dimension getSubStringTextSize() {
-		return getTextSize();
-	}
-
-	/*
-	 * CR374981: Long activity labels do not get wrapped or truncated We must
-	 * override this so that the label gets truncated
-	 */
-	public Dimension getPreferredSize(int wHint, int hHint) {
-		if (prefSize == null) {
-			super.getPreferredSize(-1, -1);
-			prefSize.width = getIconBounds().getSize().width;
-			Dimension minSize_ = getMinimumSize(wHint, hHint);
-			if (prefSize.width < minSize_.width)
-				prefSize.width = minSize_.width;
-			if (prefSize.height < minSize_.height)
-				prefSize.height = minSize_.height;
-		}
-		return prefSize;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.IFigure#getMinimumSize(int, int)
-	 */
-	public Dimension getMinimumSize(int w, int h) {
-		return new Dimension(8, 8);
-	}
-
-	public void addDecorator(BaseFigureDecorator decorator) {
-		removeDecorator(decorator.getPosition());
-		getDecorators().add(decorator);
-		add(decorator);
-		invalidate();
-	}
-
-	public void removeDecorator() {
-		removeDecorator(BaseFigureDecorator.DEFAULT_DECORATOR_POSITION);
-	}
-
-	public void removeDecorator(int position) {
-		Iterator it = getDecorators().iterator();
-		while (it.hasNext()) {
-			BaseFigureDecorator d = (BaseFigureDecorator) it.next();
-			if (d.getPosition() == position) {
-				it.remove();
-				remove(d);
-				invalidate();
-				break;
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.Label#setTextPlacement(int)
-	 */
-	public void setTextPlacement(int where) {
-		super.setTextPlacement(where);
-		layout();
-		invalidate();
-	}
-
-	public void invalidate() {
-		// CR405873: F111-Error decorator missing
-		// this was moved to paintFigure()
-		// placeDecorators();
-		super.invalidate();
-	}
-
-	private void placeDecorators() {
-		Point o = getLocation();
-		Point p = getIconBounds().getLocation();
-		Dimension size = this.getIconBounds().getSize();
-		Iterator it = getDecorators().iterator();
-		while (it.hasNext()) {
-			int x = p.x - o.x, y = p.y - o.y;
-			BaseFigureDecorator decorator = (BaseFigureDecorator) it.next();
-			Dimension decoratorSize = decorator.getPreferredSize();
-			switch (decorator.getPosition()) {
-			case (PositionConstants.CENTER | PositionConstants.MIDDLE):
-				// CR378889: Case of decoration that should be right in the
-				// middle.
-				// Had to add a fudge factor because it's not exactly where I
-				// want it.
-				int fudge = 4;
-				y += size.height / 2 - decoratorSize.height / 2 + fudge;
-				x += size.width / 2 - decoratorSize.width / 2;
-				break;
-			case PositionConstants.NORTH:
-				x += size.width / 2 - decoratorSize.width / 2;
-				break;
-			case PositionConstants.NORTH_EAST:
-				x += size.width - decoratorSize.width;
-				break;
-			case PositionConstants.EAST:
-				x += size.width - decoratorSize.width;
-				y += size.height / 2 - decoratorSize.height / 2;
-				break;
-			case PositionConstants.SOUTH_EAST:
-				x += size.width - decoratorSize.width;
-				y += size.height - decoratorSize.height;
-				break;
-			case PositionConstants.SOUTH:
-				x += size.width / 2 - decoratorSize.width / 2;
-				y += size.height - decoratorSize.height;
-				break;
-			case PositionConstants.SOUTH_WEST:
-				y += size.height - decoratorSize.height;
-				break;
-			case PositionConstants.WEST:
-				y += size.height / 2 - decoratorSize.height / 2;
-				break;
-			case PositionConstants.NORTH_WEST:
-				break;
-			}
-			getLayoutManager().setConstraint(decorator,
-					new Rectangle(x, y, -1, -1));
-		}
-		layout();
-	}
-
-	// CR389070: Figures are abbreviating rule figures names and making them
-	// unreadable
-	protected void paintFigure(Graphics graphics) {
-		if (isOpaque())
-			super.paintFigure(graphics);
-		// CR405873: F111-Error decorator missing
-		placeDecorators();
-		Rectangle bounds_ = getBounds();
-		graphics.translate(bounds_.x, bounds_.y);
-		if (getIcon() != null)
-			graphics.drawImage(getIcon(), getIconLocation());
-		if (iconLabel == null || !iconLabel.isVisible()) {
-			if (!isEnabled()) {
-				graphics.translate(1, 1);
-				graphics.setForegroundColor(ColorConstants.buttonLightest);
-				graphics.drawText(getSubStringText(), getTextLocation());
-				graphics.translate(-1, -1);
-				graphics.setForegroundColor(ColorConstants.buttonDarker);
-			}
-			graphics.drawText(getSubStringText(), getTextLocation());
-		}
-		graphics.translate(-bounds_.x, -bounds_.y);
-	}
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/InputPortFigure.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/InputPortFigure.java
deleted file mode 100644
index 66ca25b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/InputPortFigure.java
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/LinkFigure.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/LinkFigure.java
deleted file mode 100644
index 11e0a80..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/LinkFigure.java
+++ /dev/null
@@ -1,336 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.preference;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.Label;
-import org.eclipse.draw2d.LineBorder;
-import org.eclipse.draw2d.MarginBorder;
-import org.eclipse.draw2d.MidpointLocator;
-import org.eclipse.draw2d.PolylineConnection;
-import org.eclipse.draw2d.PositionConstants;
-import org.eclipse.draw2d.geometry.PointList;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * @author Bob
- */
-/*package*/ class LinkFigure extends PolylineConnection implements IBaseFigure {
-    private final static Color defaultLineColor = ColorConstants.black;
-
-    private final static int defaultLineWidth = 1;
-
-    private final static boolean defaultLabelVisible = false;
-
-    private final static Color defaultLabelForeground = ColorConstants.black;
-
-    private final static Color defaultLabelBackground = ColorConstants.white;
-
-    private final static Font defaultFont = JFaceResources.getFontRegistry().get(
-            JFaceResources.DEFAULT_FONT);
-
-    private LinkLabel label;
-
-    /**
-     * Default constructor
-     */
-    public LinkFigure() {
-        super();
-        setLineWidth(defaultLineWidth);
-        setForegroundColor(defaultLineColor);
-
-        // BaseFigureDecorator decorator;
-        // decorator = new
-        // BaseFigureDecorator(GEMPlugin.getDefault().getGEMImage("delete.gif"),"target",PositionConstants.WEST);
-        // addDecorator(decorator);
-        // decorator = new
-        // BaseFigureDecorator(GEMPlugin.getDefault().getGEMImage("delete.gif"),"target",PositionConstants.EAST);
-        // addDecorator(decorator);
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see com.sybase.stf.gem.diagram.editor.figures.IBaseFigure#setToolTipText()
-     */
-    public void setToolTipText(final String text) {
-        Label toolTip_ = null;
-
-        if (text != null && text.length() > 0) {
-            toolTip_ = new Label(text);
-            toolTip_.setBorder(new MarginBorder(3));
-        }
-
-        super.setToolTip(toolTip_);
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see com.sybase.stf.gem.diagram.editor.figures.IBaseFigure#getToolTipText()
-     */
-    public String getToolTipText() {
-        if (getToolTip() != null)
-        {
-            return ((Label) getToolTip()).getText();
-        }
-        return null;
-    }
-
-    public void setHighlight(final boolean flag) {
-        if (flag) {
-            setForegroundColor(ColorConstants.titleBackground);
-            // setLineWidth(defaultLineWidth * 2);
-        } else {
-            setForegroundColor(defaultLineColor);
-            // setLineWidth(defaultLineWidth);
-        }
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see com.sybase.stf.gem.diagram.editor.figures.IBaseFigure#setText()
-     */
-    public void setText(final String text) {
-        if (text != null && text.length() == 0) {
-            if (label != null) {
-                remove(label);
-                label = null;
-            }
-        } else {
-            getLabel().setText(text);
-        }
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see com.sybase.stf.gem.diagram.editor.figures.IBaseFigure#getText()
-     */
-    public String getText() {
-        if (label == null)
-        {
-            return null;
-        }
-        return label.getText();
-    }
-
-    /*
-     * CR374981: Long activity labels do not get wrapped or truncated This
-     * method was added to the IBaseFigure interface to support direct edit of
-     * figure labels on the canvas.
-     */
-    public Rectangle getTextBounds() {
-        return label.getTextBounds();
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see com.sybase.stf.gem.diagram.editor.figures.IBaseFigure#setIcon(org.eclipse.swt.graphics.Image)
-     */
-    public void setIcon(final Image image) {
-        getLabel().setIcon(image);
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see com.sybase.stf.gem.diagram.editor.figures.IBaseFigure#getIcon()
-     */
-    public Image getIcon() {
-        return getLabel().getIcon();
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see com.sybase.stf.gem.diagram.editor.figures.IBaseFigure#addDecorator(com.sybase.stf.gem.diagram.editor.figures.BaseFigureDecorator)
-     */
-    public void addDecorator(final BaseFigureDecorator decorator) {
-        final int pos = decorator.getPosition();
-        if (pos == BaseFigureDecorator.DEFAULT_DECORATOR_POSITION
-                || pos == PositionConstants.WEST
-                || pos == PositionConstants.LEFT) {
-            setTargetDecoration(decorator);
-        } else if (pos == PositionConstants.EAST
-                || pos == PositionConstants.RIGHT) {
-            setSourceDecoration(decorator);
-        }
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see com.sybase.stf.gem.diagram.editor.figures.IBaseFigure#removeDecorator()
-     */
-    public void removeDecorator() {
-        removeDecorator(BaseFigureDecorator.DEFAULT_DECORATOR_POSITION);
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see com.sybase.stf.gem.diagram.editor.figures.IBaseFigure#removeDecorator(int)
-     */
-    public void removeDecorator(final int position) {
-        if (position == BaseFigureDecorator.DEFAULT_DECORATOR_POSITION)
-        {
-            setTargetDecoration(null);
-        }
-        else
-        {
-            setSourceDecoration(null);
-        }
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see com.sybase.stf.gem.diagram.editor.figures.IBaseFigure#getDecorators()
-     */
-    public List getDecorators() {
-        final List list = new ArrayList(2);
-        Object d;
-        d = getSourceDecoration();
-        if (d != null)
-        {
-            list.add(d);
-        }
-        d = getTargetDecoration();
-        if (d != null)
-        {
-            list.add(d);
-        }
-        return list;
-    }
-
-    private LinkLabel getLabel() {
-        if (label == null) {
-            label = new LinkLabel();
-            add(label, new MidpointLocator(this, 0));
-        }
-        return label;
-    }
-
-    @Override
-    public void setFont(final Font f) {
-        getLabel().setFont(f);
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.draw2d.Shape#setLineWidth(int)
-     */
-    @Override
-    public void setLineWidth(final int w) {
-        getLabel().setBorderWidth(w);
-        super.setLineWidth(w);
-    }
-
-    @Override
-    public void setForegroundColor(final Color c) {
-        getLabel().setBorderColor(c);
-        super.setForegroundColor(c);
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.draw2d.Polyline#setPoints(org.eclipse.draw2d.geometry.PointList)
-     */
-    @Override
-    public void setPoints(final PointList points) {
-        super.setPoints(points);
-        if (label != null) {
-            int i = getPoints().size() / 2 - 1;
-            if (i < 0)
-            {
-                i = 0;
-            }
-            if (getLayoutManager() != null)
-            {
-                getLayoutManager().setConstraint(label,
-                        new MidpointLocator(this, i));
-            }
-        }
-    }
-
-    @Override
-    public Rectangle getBounds() {
-        if (bounds == null) {
-            if (bounds == null) {
-                bounds = getPoints().getBounds().getExpanded(lineWidth / 2,
-                        lineWidth / 2);
-            }
-            // CR382243: Clicking on the node icon selects the connection line
-            // rather than the node
-            // NOTE: expanding the bounds to include children (in this case,
-            // the Link labels) causes problems when the connection line becomes
-            // short (i.e., when the 2 anchor figures at each end of the
-            // connection are
-            // close together) because the bounds of this link figure will be
-            // greater
-            // than the actual length of the line. This causes the link figure
-            // to
-            // be hit-tested beyond its visual size.
-            if (getLabel().isVisible()) {
-                for (int i = 0; i < getChildren().size(); i++) {
-                    final IFigure child = (IFigure) getChildren().get(i);
-                    bounds.union(child.getBounds());
-                }
-            }
-        }
-        return bounds;
-    }
-
-    /*
-     * Helper class for line labels.
-     */
-    private static class LinkLabel extends Label {
-        LinkLabel() {
-            setBorder(new LineBorder());
-            setOpaque(true);
-            setForegroundColor(defaultLabelForeground);
-            setBackgroundColor(defaultLabelBackground);
-            setFont(defaultFont);
-            final LineBorder border_ = new LineBorder(defaultLineWidth);
-            setBorder(border_);
-            border_.setColor(defaultLineColor);
-            setVisible(defaultLabelVisible);
-        }
-
-        void setBorderWidth(final int w) {
-            ((LineBorder) getBorder()).setWidth(w);
-        }
-
-        void setBorderColor(final Color c) {
-            ((LineBorder) getBorder()).setColor(c);
-        }
-
-        @Override
-        protected boolean useLocalCoordinates() {
-            return false;
-        }
-    }
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/ObserveVisibleXYLayout.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/ObserveVisibleXYLayout.java
deleted file mode 100644
index bee006f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/ObserveVisibleXYLayout.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.preference;
-
-import java.util.Iterator;
-import java.util.ListIterator;
-
-import org.eclipse.draw2d.FreeformLayout;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.Insets;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.Rectangle;
-
-/**
- * @author Bob Brodt
- * 
- * This is an XY layout that actually observes visiblity of children figures
- * when doint its layout.
- * 
- * Apparently there is a bug in the GEF XYLayout class because it does not
- * observe visibility.
- * 
- * @see org.eclipse.draw2d.AbstractLayout#isObservingVisibility()
- */
-/*package*/ class ObserveVisibleXYLayout extends FreeformLayout {
-	protected Dimension calculatePreferredSize(IFigure f, int wHint, int hHint) {
-		Rectangle rect = new Rectangle();
-		ListIterator children = f.getChildren().listIterator();
-		while (children.hasNext()) {
-			IFigure child = (IFigure) children.next();
-			// bug fix
-			if (isObservingVisibility() && !child.isVisible())
-				continue;
-			Rectangle r = (Rectangle) constraints.get(child);
-			if (r == null)
-				continue;
-
-			if (r.width == -1 || r.height == -1) {
-				Dimension preferredSize_ = child.getPreferredSize(r.width,
-						r.height);
-				r = r.getCopy();
-				if (r.width == -1)
-					r.width = preferredSize_.width;
-				if (r.height == -1)
-					r.height = preferredSize_.height;
-			}
-			rect.union(r);
-		}
-		Dimension d = rect.getSize();
-		Insets insets = f.getInsets();
-		return new Dimension(d.width + insets.getWidth(), d.height
-				+ insets.getHeight()).union(getBorderPreferredSize(f));
-	}
-
-	public void layout(IFigure parent) {
-		Iterator children = parent.getChildren().iterator();
-		Point offset = getOrigin(parent);
-		IFigure f;
-		while (children.hasNext()) {
-			f = (IFigure) children.next();
-			// bug fix
-			if (isObservingVisibility() && !f.isVisible())
-				continue;
-			Rectangle bounds = (Rectangle) getConstraint(f);
-			if (bounds == null)
-				continue;
-
-			if (bounds.width == -1 || bounds.height == -1) {
-				Dimension preferredSize_ = f.getPreferredSize(bounds.width,
-						bounds.height);
-				bounds = bounds.getCopy();
-				if (bounds.width == -1)
-					bounds.width = preferredSize_.width;
-				if (bounds.height == -1)
-					bounds.height = preferredSize_.height;
-			}
-			bounds = bounds.getTranslated(offset);
-			f.setBounds(bounds);
-		}
-	}
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/OutputPortFigure.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/OutputPortFigure.java
deleted file mode 100644
index 49d9201..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/OutputPortFigure.java
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/PortConnectionAnchor.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/PortConnectionAnchor.java
deleted file mode 100644
index f81c507..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/PortConnectionAnchor.java
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/PortFigure.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/PortFigure.java
deleted file mode 100644
index f992902..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/PortFigure.java
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/PreferenceMessages.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/PreferenceMessages.java
deleted file mode 100644
index e9220c1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/PreferenceMessages.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-
-package org.eclipse.jst.jsf.facesconfig.ui.preference;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * The NLS message manager for PreferenceMessages
- * 
- */
-/*package*/ final class PreferenceMessages extends NLS {
-
-	private static final String BUNDLE_NAME = "org.eclipse.jst.jsf.facesconfig.ui.preference.PreferenceMessages"; //$NON-NLS-1$
-
-	private PreferenceMessages() {
-		// Do not instantiate
-	}
-
-	static {
-		NLS.initializeMessages(BUNDLE_NAME, PreferenceMessages.class);
-	}
-
-	/**
-	 * see PreferenceMessages.properties
-	 */
-	public static String CanvasPreferenceTab_LABEL_UseSystemColors;
-
-    /**
-     * see PreferenceMessages.properties
-     */
-	public static String CanvasPreferenceTab_LABEL_BackgroundColor;
-
-    /**
-     * see PreferenceMessages.properties
-     */
-	public static String CanvasPreferenceTab_LABEL_Canvas;
-
-    /**
-     * see PreferenceMessages.properties
-     */
-	public static String CanvasPreferenceTab_LABEL_GridHeight;
-
-    /**
-     * see PreferenceMessages.properties
-     */
-	public static String CanvasPreferenceTab_LABEL_GridLineColor;
-
-    /**
-     * see PreferenceMessages.properties
-     */
-	public static String CanvasPreferenceTab_LABEL_GridWidth;
-
-    /**
-     * see PreferenceMessages.properties
-     */
-	public static String CanvasPreferenceTab_LABEL_IconLabelFont;
-
-    /**
-     * see PreferenceMessages.properties
-     */
-	public static String CanvasPreferenceTab_LABEL_IconGroup;
-
-    /**
-     * see PreferenceMessages.properties
-     */
-	public static String CanvasPreferenceTab_LABEL_InputPortColor;
-
-    /**
-     * see PreferenceMessages.properties
-     */
-	public static String CanvasPreferenceTab_LABEL_OutputPortColor;
-
-    /**
-     * see PreferenceMessages.properties
-     */
-	public static String CanvasPreferenceTab_LABEL_LineGroup;
-
-    /**
-     * see PreferenceMessages.properties
-     */
-	public static String CanvasPreferenceTab_LABEL_LineColor;
-
-    /**
-     * see PreferenceMessages.properties
-     */
-	public static String CanvasPreferenceTab_LABEL_ShowLineLabels;
-
-    /**
-     * see PreferenceMessages.properties
-     */
-	public static String CanvasPreferenceTab_LABEL_LineLabelColor;
-
-    /**
-     * see PreferenceMessages.properties
-     */
-	public static String CanvasPreferenceTab_LABEL_LineLabelFont;
-
-    /**
-     * see PreferenceMessages.properties
-     */
-	public static String CanvasPreferenceTab_LABEL_LineRouting;
-
-    /**
-     * see PreferenceMessages.properties
-     */
-	public static String CanvasPreferenceTab_LABEL_LineWidth;
-
-    /**
-     * see PreferenceMessages.properties
-     */
-	public static String CanvasPreferenceTab_LABEL_SnapToGeometry;
-
-    /**
-     * see PreferenceMessages.properties
-     */
-	public static String CanvasPreferenceTab_LABEL_SnapToGrid;
-
-    /**
-     * see PreferenceMessages.properties
-     */
-	public static String CanvasPreferenceTab_LABEL_UndoStackSize;
-
-    /**
-     * see PreferenceMessages.properties
-     */
-	public static String CanvasPreferences_LABEL_Direct;
-
-    /**
-     * see PreferenceMessages.properties
-     */
-	public static String CanvasPreferences_LABEL_Manhattan;
-
-    /**
-     * see PreferenceMessages.properties
-     */
-	public static String CanvasPreferences_LABEL_Manual;
-
-    /**
-     * see PreferenceMessages.properties
-     */
-	public static String CanvasPreferenceTab_LABEL_LabelPlacement;
-
-    /**
-     * see PreferenceMessages.properties
-     */
-	public static String CanvasPreferences_LABEL_Top;
-
-    /**
-     * see PreferenceMessages.properties
-     */
-	public static String CanvasPreferences_LABEL_Bottom;
-
-    /**
-     * see PreferenceMessages.properties
-     */
-	public static String CanvasPreferences_LABEL_Left;
-
-    /**
-     * see PreferenceMessages.properties
-     */
-	public static String CanvasPreferences_LABEL_Right;
-
-    /**
-     * see PreferenceMessages.properties
-     */
-	public static String CanvasPreferenceTab_LABEL_IconSize;
-
-    /**
-     * see PreferenceMessages.properties
-     */
-	public static String CanvasPreferences_LABEL_Small;
-
-    /**
-     * see PreferenceMessages.properties
-     */
-	public static String CanvasPreferences_LABEL_Medium;
-
-    /**
-     * see PreferenceMessages.properties
-     */
-	public static String CanvasPreferences_LABEL_Large;
-
-    /**
-     * label property for check box that selects whether or not
-     * the introduction section editor should be loaded.
-     */
-    public static String EditorPreferences_LABEL_ShowIntroEditor;
-
-	/**
-	 * see PreferenceMessages.properties
-	 */
-	public static String GEMPreferences_description;
-	/**
-	 * see PreferenceMessages.properties
-	 */
-	public static String CompoundNodeFigure_MaximizeLabel;
-	/**
-	 * see PreferenceMessages.properties
-	 */
-	public static String CompoundNodeFigure_MinimizeLabel;
-	/**
-	 * see PreferenceMessages.properties
-	 */
-	public static String CompoundNodeFigure_RestoreLabel;
-	/**
-	 * see PreferenceMessages.properties
-	 */
-	public static String WindowFigure_NoTitleText;
-	/**
-	 * see PreferenceMessages.properties
-	 */
-	public static String WindowFigure_Title;
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/PreferenceMessages.properties b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/PreferenceMessages.properties
deleted file mode 100644
index 5a91a37..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/PreferenceMessages.properties
+++ /dev/null
@@ -1,54 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-#
-# Appearance preference labels
-#
-CanvasPreferenceTab_LABEL_UseSystemColors=Use System colors
-EditorPreferences_LABEL_ShowIntroEditor=Show Introduction Tab (open editors must be reloaded to take effect)
-CanvasPreferenceTab_LABEL_BackgroundColor=Background color:
-CanvasPreferenceTab_LABEL_Canvas=Canvas
-CanvasPreferenceTab_LABEL_GridHeight=Grid height:
-CanvasPreferenceTab_LABEL_GridLineColor=Grid color:
-CanvasPreferenceTab_LABEL_GridWidth=Grid width:
-CanvasPreferenceTab_LABEL_IconLabelFont=Label font:
-CanvasPreferenceTab_LABEL_IconGroup=Icons
-CanvasPreferenceTab_LABEL_InputPortColor=Input Port color:
-CanvasPreferenceTab_LABEL_OutputPortColor=Output Port color:
-CanvasPreferenceTab_LABEL_LineGroup=Connection Lines
-CanvasPreferenceTab_LABEL_LineColor=Line color:
-CanvasPreferenceTab_LABEL_ShowLineLabels=Show labels
-CanvasPreferenceTab_LABEL_LineLabelColor=Label color:
-CanvasPreferenceTab_LABEL_LineLabelFont=Label font:
-CanvasPreferenceTab_LABEL_LineRouting=Line Routing:
-CanvasPreferenceTab_LABEL_LineWidth=Line width:
-CanvasPreferenceTab_LABEL_SnapToGeometry=Snap to geometry
-CanvasPreferenceTab_LABEL_SnapToGrid=Snap to grid
-CanvasPreferenceTab_LABEL_UndoStackSize="Undo\" stack size:
-CanvasPreferences_LABEL_Direct=Direct
-CanvasPreferences_LABEL_Manhattan=Manhattan
-CanvasPreferences_LABEL_Manual=Manual
-CanvasPreferenceTab_LABEL_LabelPlacement=Label Placement:
-CanvasPreferences_LABEL_Top=Top
-CanvasPreferences_LABEL_Bottom=Bottom
-CanvasPreferences_LABEL_Left=Left
-CanvasPreferences_LABEL_Right=Right
-CanvasPreferenceTab_LABEL_IconSize=Icon Size:
-CanvasPreferences_LABEL_Small=Small
-CanvasPreferences_LABEL_Medium=Medium
-CanvasPreferences_LABEL_Large=Large
-GEMPreferences_description=Preferences for the graphical page of FacesConfig editor.
-
-#################################################
-CompoundNodeFigure_MaximizeLabel=Maximize
-CompoundNodeFigure_MinimizeLabel=Minimize
-CompoundNodeFigure_RestoreLabel=Restore
-WindowFigure_NoTitleText=??
-WindowFigure_Title=Window
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/PrintedPageLayer.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/PrintedPageLayer.java
deleted file mode 100644
index 566958f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/PrintedPageLayer.java
+++ /dev/null
@@ -1,177 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.preference;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.draw2d.Figure;
-import org.eclipse.draw2d.FreeformLayer;
-import org.eclipse.draw2d.FreeformLayeredPane;
-import org.eclipse.draw2d.RectangleFigure;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.LayerConstants;
-
-/**
- * This is a printable layer that draws page outline tiles enclosing all of the
- * printable child figures. The page outlines represent complete pages as they
- * would appear if they were printed on dead trees, thus the pageSize set on
- * this layer should be the currently selected printer's page resolution.
- * 
- * The reason this needs to be added to the printable layers is so that it will
- * show up in the content outline viewer.
- */
-/*package*/ class PrintedPageLayer extends FreeformLayer {
-	// our layer name
-	static final String PRINTED_PAGE_LAYER = "Printed Page"; //$NON-NLS-1$
-
-	// the size of the page tiles (this should be the printer's resolution)
-	private Dimension pageSize = new Dimension(850, 1100);
-
-	// the WindowFigure that owns this layer
-	private final WindowFigure host;
-
-	// flag to lock out multiple calls to setFreeformBounds() when adding
-	// and removing PrintedPageFigures.
-	private boolean busy;
-
-	// A simple page outline figure. We can get fancy later with turned-up
-	// dogears, page numbers, titles and whatnot...
-	static class PrintedPageFigure extends RectangleFigure {
-		PrintedPageFigure() {
-			super();
-			setFill(false);
-			setOutline(true);
-			setLineWidth(1);
-		}
-	}
-
-	/**
-	 * @param figure
-	 */
-	public PrintedPageLayer(WindowFigure figure) {
-		super();
-		this.host = figure;
-	}
-
-	/**
-	 * @param x
-	 * @param y
-	 * @return the print page figure
-	 */
-	protected PrintedPageFigure createPage(int x, int y) {
-		PrintedPageFigure page = new PrintedPageFigure();
-		page.setBounds(new Rectangle(x, y, pageSize.width, pageSize.height));
-		return page;
-	}
-
-	/**
-	 * Sets the page width and height. This should be the currently selected
-	 * printer's page size.
-	 * 
-	 * @param d
-	 */
-	public void setPageSize(Dimension d) {
-		pageSize = d.getCopy();
-	}
-
-	/**
-	 * @see org.eclipse.draw2d.FreeformFigure#setFreeformBounds(Rectangle)
-	 */
-	public void setFreeformBounds(Rectangle bounds) {
-		if (!busy && getParent() instanceof FreeformLayeredPane
-				&& pageSize.width > 0 && pageSize.height > 0) {
-			busy = true;
-
-			// build the new printing layer extent by looking at only the
-			// contents of the Primary, Connection and Feedback layers
-			Rectangle b;
-			FreeformLayer layer;
-			layer = (FreeformLayer) host.getLayer(LayerConstants.PRIMARY_LAYER);
-			b = layer.getFreeformExtent().getCopy();
-			layer = (FreeformLayer) host
-					.getLayer(LayerConstants.CONNECTION_LAYER);
-			b = b.union(layer.getFreeformExtent());
-			layer = (FreeformLayer) host
-					.getLayer(LayerConstants.FEEDBACK_LAYER);
-			b = b.union(layer.getFreeformExtent());
-
-			// calculate x and y for the page tiles
-			int x = 0, y = 0;
-			if (b.x < 0) {
-				while (x > b.x)
-					x -= pageSize.width;
-			} else {
-				while (x + pageSize.width < b.x)
-					x += pageSize.width;
-			}
-			if (b.y < 0) {
-				while (y > b.y)
-					y -= pageSize.height;
-			} else {
-				while (y + pageSize.height < b.y)
-					y += pageSize.height;
-			}
-
-			// get list of pagefigures that intersect the new extent
-			// and a list of those that don't
-			List keepers = new ArrayList();
-			List trash = new ArrayList();
-			Iterator iter = getChildren().iterator();
-			while (iter.hasNext()) {
-				Figure child = (Figure) iter.next();
-				if (child.getBounds().intersects(b))
-					keepers.add(child);
-				else
-					trash.add(child);
-			}
-
-			// calculate width and height
-			int w = 0, h = 0;
-			while (x + w < b.x + b.width)
-				w += pageSize.width;
-			while (y + h < b.y + b.height)
-				h += pageSize.height;
-
-			// determine the required pagefigures
-			for (int xi = x; xi < x + w; xi += pageSize.width) {
-				for (int yi = y; yi < y + h; yi += pageSize.height) {
-					boolean found = false;
-					iter = keepers.iterator();
-					while (iter.hasNext()) {
-						Figure child = (Figure) iter.next();
-						Point p = child.getBounds().getLocation();
-						if (p.x == xi && p.y == yi) {
-							found = true;
-							break;
-						}
-					}
-					if (!found) {
-						// add the new page
-						add(createPage(xi, yi));
-					}
-				}
-			}
-
-			// remove all the old pages
-			iter = trash.iterator();
-			while (iter.hasNext())
-				remove((Figure) iter.next());
-
-			busy = false;
-		}
-		super.setFreeformBounds(bounds);
-	}
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/RectangleList.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/RectangleList.java
deleted file mode 100644
index 03aadbb..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/RectangleList.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.preference;
-
-import java.util.ArrayList;
-
-import org.eclipse.draw2d.geometry.Rectangle;
-
-/**
- * A List<Rectangle> implementation with a coordinate-based
- * convenience method for adding rectangles.
- *
- */
-class RectangleList extends ArrayList<Rectangle>
-{
-	private static final long serialVersionUID = -4088355285820327890L;
-
-	/**
-	 * Default constructor
-	 */
-	public RectangleList() {
-		super();
-	}
-
-	/**
-	 * @param x1
-	 * @param y1
-	 * @param x2
-	 * @param y2
-	 */
-	public void addRectangle(int x1, int y1, int x2, int y2) {
-		add(new Rectangle(x1, y1, x2 - x1, y2 - y1));
-	}
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/TabbedTitleBarBorder.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/TabbedTitleBarBorder.java
deleted file mode 100644
index 60cd979..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/TabbedTitleBarBorder.java
+++ /dev/null
@@ -1,591 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.preference;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.runtime.ListenerList;
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.FigureUtilities;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.MouseEvent;
-import org.eclipse.draw2d.MouseListener;
-import org.eclipse.draw2d.SchemeBorder;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.Insets;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.widgets.Composite;
-
-/**
- * A border for the tabbed title bar
- *
- */
-/*package*/ class TabbedTitleBarBorder extends SchemeBorder {
-	// private int state = CompoundFigureListener.RESTORED;
-
-	private IFigure parent;
-
-	private ListenerList listenerList;
-
-	private List tabList;
-
-	private int currentTab;
-
-	private Font font;
-
-	private boolean visible = true;
-
-	// from TitleBarBorder:
-	private Color textColor = ColorConstants.black;
-
-	private Color bgColor = ColorConstants.menuBackground;
-
-	private Insets insets;
-
-	private Insets padding = new Insets(2, 2, 2, 2);
-
-	/**
-	 * Constructs a TitleBarBorder with its label set to the name of this class.
-	 * @param parent 
-	 * 
-	 * @since 2.0
-	 */
-	public TabbedTitleBarBorder(final IFigure parent) {
-		super(SCHEMES.LOWERED);
-
-		this.parent = parent;
-
-		parent.addMouseListener(new MouseListener() {
-			public void mousePressed(MouseEvent me) {
-				Insets padding_ = getPadding();
-				Point mp = me.getLocation();
-				mp.x -= padding_.left;
-				mp.y -= padding_.top + 3; // 3==width of the outer border
-				Point pp = parent.getBounds().getLocation();
-				Rectangle tr = new Rectangle(pp.x, pp.y, 0, 0);
-				//int activeIndex = -1;
-
-				for (int i = 0; i < getTabList().size(); ++i) {
-					Tab t = (Tab) tabList.get(i);
-					Dimension d = t.getTextExtents();
-					d.height += padding_.top + padding_.bottom;
-					d.width += padding_.left;
-					tr.setSize(d);
-					if (tr.contains(mp)) {
-						setCurrentTab(i);
-						return;
-					}
-					tr.x += d.width;
-				}
-			}
-
-			public void mouseReleased(MouseEvent me) {
-                // do nothing: not handling release
-			}
-
-			public void mouseDoubleClicked(MouseEvent me) {
-                // do nothing: not handling release
-			}
-		});
-	}
-
-	/**
-	 * @return the tab list
-	 */
-	protected List getTabList() {
-		if (tabList == null)
-			tabList = new ArrayList();
-		return tabList;
-	}
-
-	/**
-	 * Add a new tab with the text
-	 * @param text
-	 * @return the previous number of tabs
-	 */
-	public int addTab(String text) {
-		getTabList().add(new Tab(text));
-		return getTabList().size() - 1;
-	}
-
-	/**
-	 * @param index
-	 */
-	public void removeTab(int index) {
-		if (index >= 0 && index < getTabList().size()) {
-			tabList.remove(index);
-			if (index >= tabList.size())
-				index = tabList.size() - 1;
-			setCurrentTab(index);
-		}
-	}
-
-	/**
-	 * @param newIndex
-	 */
-	public void setCurrentTab(int newIndex) {
-		if (newIndex >= 0 && newIndex < getTabList().size()) {
-			Tab newTab = (Tab) tabList.get(newIndex);
-			int oldIndex = -1;
-			for (int i = 0; i < tabList.size(); ++i) {
-				Tab t = (Tab) tabList.get(i);
-				if (t.isActive()) {
-					oldIndex = i;
-					t.setActive(false);
-					break;
-				}
-			}
-			newTab.setActive(true);
-			if (parent != null) {
-				parent.invalidate();
-				parent.repaint();
-			}
-			currentTab = newIndex;
-			fireTabChanged(oldIndex, newIndex);
-		}
-	}
-
-	/**
-	 * @return the index of the current tab
-	 */
-	public int getCurrentTab() {
-		return currentTab;
-	}
-
-	/**
-	 * @param index
-	 * @return the contents object of the tab at index
-	 * or null if  index is out of range
-	 */
-	public Object getContents(int index) {
-		if (index >= 0 && index < getTabList().size())
-			return ((Tab) tabList.get(index)).getContents();
-		return null;
-	}
-
-	/**
-	 * @param index
-	 * @param contents
-	 */
-	public void setContents(int index, Object contents) {
-		if (index >= 0 && index < getTabList().size())
-			((Tab) tabList.get(index)).setContents(contents);
-	}
-
-	/**
-	 * @param listener
-	 */
-	public void addTabbedWindowListener(WindowFigureListener listener) {
-		if (listenerList == null)
-			listenerList = new ListenerList(ListenerList.IDENTITY);
-		listenerList.add(listener);
-	}
-
-	/**
-	 * @param listener
-	 */
-	public void removeTabbedWindowListener(WindowFigureListener listener) {
-		if (listenerList != null)
-			listenerList.remove(listener);
-	}
-
-	/**
-	 * @return the listeners
-	 */
-	public Object[] getListeners() {
-		return listenerList.getListeners();
-	}
-
-	/**
-	 * @param oldIndex
-	 * @param newIndex
-	 */
-	protected void fireTabChanged(int oldIndex, int newIndex) {
-		Object l[] = listenerList.getListeners();
-		for (int i = 0; i < l.length; ++i) {
-			if (l[i] instanceof WindowFigureListener)
-				((WindowFigureListener) l[i]).tabChanged(oldIndex, newIndex);
-		}
-	}
-
-	/**
-	 * @return Returns the font.
-	 */
-	public Font getFont() {
-		if (font == null) {
-			font = parent.getFont();
-			if (font == null)
-				font = JFaceResources.getFontRegistry().get(
-						JFaceResources.DEFAULT_FONT);
-		}
-		return font;
-	}
-
-	/**
-	 * @param font
-	 *            The font to set.
-	 */
-	public void setFont(Font font) {
-		this.font = font;
-		invalidate();
-	}
-
-	/**
-	 * @return Returns the insets.
-	 */
-	public Insets getInsets() {
-		return insets;
-	}
-
-	/**
-	 * @param c
-	 */
-	public void setTextColor(Color c) {
-		textColor = c;
-	}
-
-	/**
-	 * @return the text color
-	 */
-	public Color getTextColor() {
-		return textColor;
-	}
-
-	/**
-	 * @param c
-	 */
-	public void setBackgroundColor(Color c) {
-		bgColor = c;
-	}
-
-	/**
-	 * @return the background color
-	 */
-	public Color getBackgroundColor() {
-		return bgColor;
-	}
-
-	/**
-	 * @param p
-	 */
-	public void setPadding(Insets p) {
-		padding = p;
-		invalidate();
-	}
-
-	/**
-	 * @return the padding insets
-	 */
-	public Insets getPadding() {
-		return padding;
-	}
-
-	/**
-	 * @param text
-	 */
-	public void setLabel(String text) {
-		setLabel(currentTab, text);
-	}
-
-	/**
-	 * @param index
-	 * @param text
-	 */
-	public void setLabel(int index, String text) {
-		if (index >= 0 && index < getTabList().size())
-			((Tab) tabList.get(index)).setLabel(text);
-	}
-
-	/**
-	 * @return the label
-	 */
-	public String getLabel() {
-		return getLabel(currentTab);
-	}
-
-	/**
-	 * @param index
-	 * @return the label
-	 */
-	public String getLabel(int index) {
-		if (index >= 0 && index < getTabList().size())
-			return ((Tab) tabList.get(index)).getLabel();
-		return ""; //$NON-NLS-1$
-	}
-
-	/**
-	 * @return the parent figureb
-	 */
-	public IFigure getParent() {
-		return parent;
-	}
-
-	/**
-	 * validate each of the tabs
-	 */
-	public void invalidate() {
-		insets = null;
-		for (int i = 0; i < getTabList().size(); ++i) {
-			Tab t = (Tab) tabList.get(i);
-			t.invalidate();
-		}
-	}
-
-	/**
-	 * @param f
-	 * @return the text extends
-	 */
-	public Dimension getTextExtents(IFigure f) {
-		Dimension d = new Dimension(0, 0);
-		for (int i = 0; i < getTabList().size(); ++i) {
-			Tab t = (Tab) tabList.get(i);
-			if (d.height == 0)
-				d = t.getTextExtents();
-			else
-				d.width += t.getTextExtents().width;
-		}
-		return d;
-	}
-
-	/**
-	 * Sets the min/max buttons visible
-	 * 
-	 * @param flag -
-	 *            if true, buttons are made visible.
-	 */
-	public void setVisible(boolean flag) {
-		visible = flag;
-	}
-
-	/**
-	 * Calculates and returns the Insets for this border.
-	 * 
-	 * @param figure
-	 *            the figure on which Insets calculations are based
-	 * @return the calculated Insets
-	 * @since 2.0
-	 */
-	protected Insets calculateInsets(IFigure figure) {
-		insets = new Insets(super.getInsets(figure));
-		insets.top = getTextExtents(figure).height;
-		return insets;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.Border#getInsets(org.eclipse.draw2d.IFigure)
-	 */
-	public Insets getInsets(IFigure figure) {
-		if (insets == null)
-			calculateInsets(figure);
-		return insets;
-	}
-
-	/**
-	 * @see org.eclipse.draw2d.Border#paint(IFigure, Graphics, Insets)
-	 */
-	public void paint(IFigure figure, Graphics g, Insets in) {
-		if (!visible)
-			return;
-
-		Insets is = new Insets(in);
-		getInsets(figure);
-		is.top += insets.top;
-		super.paint(figure, g, is);
-		// Insets insets = getInsets(pane);
-		// Insets padding = getPadding();
-		// Insets in = new Insets(figureInsets);
-		// in.top += insets.top;
-		// super.paint(pane, g, in);
-
-		tempRect.setBounds(getPaintRectangle(figure, in));
-		Rectangle r = tempRect;
-		r.height = Math.min(r.height, getTextExtents(figure).height);
-
-		g.clipRect(r);
-		g.setBackgroundColor(getBackgroundColor());
-		g.fillRectangle(r);
-		int x = r.x;
-		int y = r.y;
-
-		Iterator iter = getTabList().iterator();
-		while (iter.hasNext()) {
-			Tab t = (Tab) iter.next();
-			t.paint(g, figure, x, y);
-			x += t.getTextExtents().width;
-		}
-
-		g.setBackgroundColor(getBackgroundColor());
-	}
-
-	/**
-	 * @param wHint
-	 * @param hHint
-	 * @return the minimum size
-	 */
-	public Dimension getMinimumSize(int wHint, int hHint) {
-		Dimension d = getTextExtents(parent);
-		getInsets(parent);
-		d.expand(insets.left + insets.right, insets.top + insets.bottom);
-		// add enough width for the min/max buttons
-		// d.width += minButton.getSize().width + maxButton.getSize().width;
-		return d;
-	}
-
-	private class Tab {
-		private String label = ""; //$NON-NLS-1$
-
-		private Object contents = null;
-
-		private Dimension textExtents;
-
-		private boolean active;
-
-		/**
-		 * @param text
-		 */
-		public Tab(String text) {
-			this.label = text;
-		}
-
-		/**
-		 * @param contents
-		 */
-		public void setContents(Object contents) {
-			this.contents = contents;
-		}
-
-		/**
-		 * @return the contents
-		 */
-		public Object getContents() {
-			return contents;
-		}
-
-		/**
-		 * @param active
-		 */
-		public void setActive(boolean active) {
-			this.active = active;
-		}
-
-		/**
-		 * @return the active state
-		 */
-		public boolean isActive() {
-			return active;
-		}
-
-		/**
-		 * @return the label
-		 */
-		public String getLabel() {
-			return label;
-		}
-
-		/**
-		 * @param text
-		 */
-		public void setLabel(String text) {
-			if (text == null)
-				this.label = ""; //$NON-NLS-1$
-			else
-				this.label = text;
-			textExtents = null;
-		}
-
-		/**
-		 * @return the text extents
-		 */
-		public Dimension calculateTextExtents() {
-			textExtents = FigureUtilities.getTextExtents(label == null ? "W" //$NON-NLS-1$
-					: label, getFont());
-			textExtents.width += getPadding().getWidth();
-			textExtents.height += getPadding().getHeight();
-			return textExtents;
-		}
-
-		/**
-		 * @return the text extents.  A copy is returned based on what
-		 * is cached internall by calculateTextExtents
-		 */
-		public Dimension getTextExtents() {
-			if (textExtents == null)
-				calculateTextExtents();
-			return textExtents.getCopy();
-		}
-
-		/**
-		 * 
-		 */
-		public void invalidate() {
-			textExtents = null;
-		}
-
-		/**
-		 * @param g
-		 * @param f
-		 * @param x
-		 * @param y
-		 */
-		public void paint(Graphics g, IFigure f, int x, int y) {
-			if (contents instanceof Composite) {
-				return;
-			}
-			IFigure pane = (IFigure) contents;
-			getTextExtents();
-
-			Insets p = getPadding();
-			int w = textExtents.width;
-			int h = textExtents.height;
-			int radius = Math.max(p.getWidth(), p.getHeight()) + 2;
-
-			// CR408950: BP Save problems
-			// fixed icon label refresh problems
-			if (getTabList().size() > 1) {
-				// only draw tabList if there are more than 1
-				if (active)
-					g.setBackgroundColor(pane == null ? ColorConstants.white
-							: pane.getBackgroundColor());
-				else
-					g.setBackgroundColor(getBackgroundColor());
-
-				--w;
-				g.setForegroundColor(active ? ColorConstants.buttonDarkest
-						: ColorConstants.buttonDarker);
-				// g.setForegroundColor(ColorConstants.red);
-				g.drawRectangle(x, y + h / 2, w, h);
-				// g.setBackgroundColor(ColorConstants.green);
-				g.fillRoundRectangle(new Rectangle(x, y, w, h), radius, radius);
-				// g.setForegroundColor(ColorConstants.blue);
-				g.drawRoundRectangle(new Rectangle(x, y, w, h), radius, radius);
-				// g.setBackgroundColor(ColorConstants.yellow);
-				g.fillRectangle(x + 1, y + h / 2, w - 1, h);
-			} else
-				g.setBackgroundColor(getBackgroundColor());
-
-			g.setFont(getFont());
-			g.setForegroundColor(getTextColor());
-			if (label != null)
-				g.drawString(label, x + padding.left + 1, y + padding.top);
-		}
-	}
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/TabbedWindowBorder.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/TabbedWindowBorder.java
deleted file mode 100644
index 6d41870..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/TabbedWindowBorder.java
+++ /dev/null
@@ -1,252 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.preference;
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.FigureUtilities;
-import org.eclipse.draw2d.FrameBorder;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.SchemeBorder;
-import org.eclipse.draw2d.geometry.Insets;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.widgets.Composite;
-
-/**
- * A frame border for a tabbed window
- * 
- */
-/* package */final class TabbedWindowBorder extends FrameBorder
-{
-    private boolean isVisible = true;
-
-    // CR392586: resource leaks
-    private static MySchemeBorder normalBorder = new MySchemeBorder(
-            new MySchemeBorder.MyScheme(new Color[]
-                                                  { ColorConstants.button, ColorConstants.buttonLightest,
-                    ColorConstants.button }, new Color[]
-                                                       { ColorConstants.buttonDarkest, ColorConstants.buttonDarker,
-                    ColorConstants.button }));
-
-    // CR392586: resource leaks
-    private static MySchemeBorder highlightBorder = new MySchemeBorder(
-            new MySchemeBorder.MyScheme(new Color[]
-                                                  { FigureUtilities.lighter(ColorConstants.titleBackground),
-                    ColorConstants.titleBackground,
-                    FigureUtilities.darker(ColorConstants.titleBackground) },
-                    new Color[]
-                              {
-                    FigureUtilities
-                    .darker(ColorConstants.titleGradient),
-                    ColorConstants.titleGradient,
-                    FigureUtilities
-                    .lighter(ColorConstants.titleGradient) }));
-
-    /**
-     * A border scheme
-     * 
-     */
-    private static class MySchemeBorder extends SchemeBorder
-    {
-        private static class MyScheme extends SchemeBorder.Scheme
-        {
-            /**
-             * @param highlight
-             * @param shadow
-             */
-            public MyScheme(final Color[] highlight, final Color[] shadow)
-            {
-                super(highlight, shadow);
-            }
-
-            @Override
-            public Color[] getHighlight()
-            {
-                return super.getHighlight();
-            }
-
-            @Override
-            public Color[] getShadow()
-            {
-                return super.getHighlight();
-            }
-        }
-
-        MySchemeBorder(final MyScheme scheme)
-        {
-            super(scheme);
-        }
-
-        /**
-         * @return the scheme
-         */
-        public MyScheme getMyScheme()
-        {
-            return (MyScheme) super.getScheme();
-        }
-
-        /**
-         * @see org.eclipse.draw2d.Border#paint(IFigure, Graphics, Insets)
-         * @param comp
-         * @param gc
-         * @param insets
-         */
-        public void paint(final Composite comp, final GC gc, final Insets insets)
-        {
-            final Color[] tl = getMyScheme().getHighlight();
-            final Color[] br = getMyScheme().getShadow();
-            paint(comp, gc, insets, tl, br);
-        }
-
-        /**
-         * Paints the border using the information in the set Scheme and the
-         * inputs given. Side widths are determined by the number of colors in
-         * the Scheme for each side.
-         * 
-         * @param comp
-         *            the composit whose rect should be used for the inset
-         *            bounds
-         * @param gc
-         *            the graphics object
-         * @param insets
-         *            the insets
-         * @param tl
-         *            the highlight (top/left) colors
-         * @param br
-         *            the shadow (bottom/right) colors
-         */
-        protected void paint(final Composite comp, final GC gc, final Insets insets, final Color[] tl,
-                final Color[] br)
-        {
-            final org.eclipse.swt.graphics.Rectangle rect = comp.getBounds();
-
-            gc.setLineWidth(1);
-            gc.setLineStyle(SWT.LINE_SOLID);
-
-            final int top = rect.y - insets.top;
-            final int left = rect.x - insets.left;
-            int bottom = rect.y + rect.height + insets.bottom;
-            int right = rect.x + rect.width + insets.right;
-            gc.setClipping(new org.eclipse.swt.graphics.Rectangle(left, top,
-                    right - left, bottom - top));
-
-            final Color color = ColorConstants.red;
-            gc.setForeground(color);
-            gc.drawLine(left, top, right, bottom);
-
-            for (int i = 0; i < br.length; i++)
-            {
-                // color = br[i];
-                gc.setForeground(color);
-                gc.drawLine(right - i, bottom - i, right - i, top + i);
-                gc.drawLine(right - i, bottom - i, left + i, bottom - i);
-            }
-
-            right--;
-            bottom--;
-
-            for (int i = 0; i < tl.length; i++)
-            {
-                // color = tl[i];
-                gc.setForeground(color);
-                gc.drawLine(left + i, top + i, right - i, top + i);
-                gc.drawLine(left + i, top + i, left + i, bottom - i);
-            }
-            color.dispose();
-        }
-    }
-
-    /**
-     * @param parent
-     */
-    public TabbedWindowBorder(final IFigure parent)
-    {
-        // apparently paint() gets called before createBorders() has had
-        // a chance to create the borders, so we just create them here
-        inner = new TabbedTitleBarBorder(parent);
-        outer = normalBorder;
-    }
-
-    /**
-     * @param flag
-     */
-    public void setVisible(final boolean flag)
-    {
-        if (isVisible != flag)
-        {
-            isVisible = flag;
-            ((TabbedTitleBarBorder) inner).setVisible(flag);
-            if (flag)
-            {
-                ((TabbedTitleBarBorder) inner).getParent().repaint();
-            }
-        }
-    }
-
-    /**
-     * @param flag
-     */
-    public void setHighlight(final boolean flag)
-    {
-        if (flag)
-        {
-            outer = highlightBorder;
-        }
-        else
-        {
-            outer = normalBorder;
-        }
-        ((TabbedTitleBarBorder) inner).getParent().repaint();
-    }
-
-    @Override
-    protected void createBorders()
-    {
-        // TODO: NOTE: this is overriding default border creation
-    }
-
-    @Override
-    public void paint(final IFigure figure, final Graphics g, final Insets insets)
-    {
-        if (isVisible)
-        {
-            if (comp != null)
-            {
-                final GC gc = new GC(comp);
-                paint(comp, gc, insets);
-                gc.dispose();
-            }
-            else
-            {
-                super.paint(figure, g, insets);
-            }
-        }
-    }
-
-    private Composite comp;
-
-    /**
-     * @param comp_
-     * @param gc
-     * @param insets
-     */
-    public void paint(final Composite comp_, final GC gc, final Insets insets)
-    {
-        this.comp = comp_;
-        if (isVisible)
-        {
-            ((MySchemeBorder) outer).paint(comp_, gc, insets);
-        }
-    }
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/TitleBarButton.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/TitleBarButton.java
deleted file mode 100644
index 1496ca4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/TitleBarButton.java
+++ /dev/null
@@ -1,240 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.preference;
-
-import java.util.Iterator;
-
-import org.eclipse.draw2d.ActionEvent;
-import org.eclipse.draw2d.ActionListener;
-import org.eclipse.draw2d.Button;
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.Cursors;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.MouseEvent;
-import org.eclipse.draw2d.MouseMotionListener;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * A title bar button
- *
- */
-/*package*/ final class TitleBarButton extends Button {
-	private boolean state = false;
-
-	private Image uncheckedImage;
-
-	private Image checkedImage;
-
-	private Image uncheckedHiliteImage;
-
-	private Image checkedHiliteImage;
-
-	private RectangleList uncheckedRects;
-
-	private RectangleList checkedRects;
-
-	private boolean hilite = false;
-
-
-
-	/**
-	 * @param unchecked
-	 * @param uncheckedHilite
-	 * @param checked
-	 * @param checkedHilite
-	 */
-	public TitleBarButton(Image unchecked, Image uncheckedHilite,
-			Image checked, Image checkedHilite) {
-		super();
-		uncheckedImage = unchecked;
-		if (uncheckedHilite == null)
-			uncheckedHiliteImage = unchecked;
-		else
-			uncheckedHiliteImage = uncheckedHilite;
-		if (checked == null)
-			checkedImage = unchecked;
-		else
-			checkedImage = checked;
-		if (checkedHilite == null)
-			checkedHiliteImage = unchecked;
-		else
-			checkedHiliteImage = checkedHilite;
-		initialize();
-	}
-
-	/**
-	 * @param rects
-	 */
-	public TitleBarButton(RectangleList rects) {
-		super();
-		uncheckedRects = rects;
-		initialize();
-	}
-
-	/**
-	 * @param unchecked
-	 * @param checked
-	 */
-	public TitleBarButton(RectangleList unchecked, RectangleList checked) {
-		super();
-		uncheckedRects = unchecked;
-		checkedRects = checked;
-		initialize();
-	}
-
-	/**
-	 * @return the state
-	 */
-	public boolean getState() {
-		return state;
-	}
-
-	/**
-	 * @param newState
-	 */
-	public void setState(boolean newState) {
-		state = newState;
-		hilite = false;
-	}
-
-	private void initialize() {
-		setRequestFocusEnabled(true);
-		setFocusTraversable(true);
-
-		if (uncheckedImage != null) {
-			org.eclipse.swt.graphics.Rectangle r = uncheckedImage.getBounds();
-			setBounds(new Rectangle(0, 0, r.width, r.height));
-			prefSize = new Dimension(r.width, r.height);
-		} else {
-			setForegroundColor(ColorConstants.black);
-			setBackgroundColor(ColorConstants.white);
-			calculatePreferredSize();
-			setBounds(new Rectangle(0, 0, prefSize.width, prefSize.height));
-		}
-		setCursor(Cursors.ARROW);
-		setBorder(null);
-		setFont(JFaceResources.getFontRegistry().get(
-				JFaceResources.DEFAULT_FONT));
-
-		addActionListener(new ActionListener() {
-			public void actionPerformed(ActionEvent event) {
-				setState(!state);
-			}
-		});
-		this.addMouseMotionListener(new MouseMotionListener() {
-
-			public void mouseDragged(MouseEvent me) {
-				// TODO Auto-generated method stub
-
-			}
-
-			public void mouseEntered(MouseEvent me) {
-				hilite = true;
-				repaint();
-			}
-
-			public void mouseExited(MouseEvent me) {
-				hilite = false;
-				repaint();
-			}
-
-			public void mouseHover(MouseEvent me) {
-				// TODO Auto-generated method stub
-
-			}
-
-			public void mouseMoved(MouseEvent me) {
-				// TODO Auto-generated method stub
-
-			}
-		});
-	}
-
-	/**
-	 * @return the preferred size dimensions
-	 */
-	public Dimension calculatePreferredSize() {
-		if (prefSize == null) {
-			Rectangle rect = new Rectangle(0, 0, 0, 0);
-			if (uncheckedRects != null) {
-				Iterator<Rectangle> iter = uncheckedRects.iterator();
-				while (iter.hasNext()) {
-					/*Point p =*/ getLocation();
-					Rectangle r = iter.next().getCopy();
-					rect = rect.getUnion(r);
-				}
-			}
-			if (checkedRects != null) {
-				Iterator<Rectangle> iter = checkedRects.iterator();
-				while (iter.hasNext()) {
-					/*Point p =*/ getLocation();
-					Rectangle r = iter.next().getCopy();
-					rect = rect.getUnion(r);
-				}
-			}
-			prefSize = rect.getSize();
-			if (prefSize.width > prefSize.height)
-				prefSize.height = prefSize.width;
-			else if (prefSize.height > prefSize.width)
-				prefSize.width = prefSize.height;
-			prefSize.width += 4;
-			prefSize.height += 4;
-		}
-		return prefSize;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.IFigure#paint(org.eclipse.draw2d.Graphics)
-	 */
-	public void paint(Graphics graphics) {
-		if (!isVisible())
-			return;
-		if (uncheckedImage != null) {
-			if (hilite) {
-				if (state == false)
-					graphics.drawImage(uncheckedHiliteImage, getLocation());
-				else
-					graphics.drawImage(checkedHiliteImage, getLocation());
-			} else {
-				if (state == false)
-					graphics.drawImage(uncheckedImage, getLocation());
-				else
-					graphics.drawImage(checkedImage, getLocation());
-			}
-		} else {
-			Iterator<Rectangle> iter = null;
-			if (state == false)
-				iter = uncheckedRects.iterator();
-			else
-				iter = checkedRects.iterator();
-			while (iter.hasNext()) {
-				Point p = getLocation();
-				Rectangle r = iter.next().getCopy();
-				r = r.translate(p.x, p.y);
-				graphics.setForegroundColor(getForegroundColor());
-				if (hilite)
-					graphics.setBackgroundColor(ColorConstants.lightBlue);
-				else
-					graphics.setBackgroundColor(ColorConstants.white);
-				graphics.fillRectangle(r);
-				graphics.drawRectangle(r);
-			}
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/WindowFigure.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/WindowFigure.java
deleted file mode 100644
index 0734023..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/WindowFigure.java
+++ /dev/null
@@ -1,621 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.preference;
-
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.draw2d.AncestorListener;
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.ConnectionLayer;
-import org.eclipse.draw2d.FreeformFigure;
-import org.eclipse.draw2d.FreeformLayer;
-import org.eclipse.draw2d.FreeformLayeredPane;
-import org.eclipse.draw2d.FreeformLayout;
-import org.eclipse.draw2d.FreeformListener;
-import org.eclipse.draw2d.FreeformViewport;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.Layer;
-import org.eclipse.draw2d.LayeredPane;
-import org.eclipse.draw2d.ScalableFreeformLayeredPane;
-import org.eclipse.draw2d.ScrollPane;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.Insets;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.LayerConstants;
-import org.eclipse.gef.editparts.GridLayer;
-import org.eclipse.gef.editparts.GuideLayer;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Composite;
-
-/**
- * A ScollPane used as figure container
- *
- */
-/*package*/ class WindowFigure extends ScrollPane implements IContainerFigure,
-		LayerConstants, FreeformFigure {
-	private TabbedWindowBorder windowBorder;
-
-	private TabbedTitleBarBorder titleBarBorder;
-
-	private FreeformViewport myViewport;
-
-	// private FreeformLayeredPane layeredPane;
-
-	private ScalableFreeformLayeredPane scaledLayers;
-
-	private LayeredPane innerLayers;
-
-	private LayeredPane printableLayers;
-
-	private FreeformLayer primaryLayer;
-
-	private final static Font defaultFont = JFaceResources.getFontRegistry().get(
-			JFaceResources.DEFAULT_FONT);
-
-	private final static Color defaultForegroundColor = ColorConstants.black;
-
-	private final static Color defaultBackgroundColor = ColorConstants.white;
-
-	private final static Color defaultGridColor = ColorConstants.lightGray;
-
-	private final static Dimension defaultGridSpacing = null;
-
-	private final static boolean defaultGridEnabled = false;
-
-	// Line Routing is not used within the WindowFigure class; it just serves as
-	// a storage
-	// location for communicating between the GEMPreferences and EditParts that
-	// actually
-	// create the line routers.
-	private final static int LINE_ROUTING_MANUAL = 0;
-
-	// TODO: should this really be static?
-	private static int defaultLineRoutingStyle = LINE_ROUTING_MANUAL;
-
-	private class MyGridLayer extends GridLayer {
-	    
-//		public Point getOrigin() {
-//			return origin.getCopy();
-//		}
-	}
-
-	private class MyFeedbackLayer extends FreeformLayer {
-		MyFeedbackLayer() {
-			setEnabled(false);
-		}
-	}
-
-	/**
-	 * Default constructor
-	 */
-	public WindowFigure() {
-		super();
-
-		windowBorder = new TabbedWindowBorder(this);
-		titleBarBorder = (TabbedTitleBarBorder) windowBorder.getInnerBorder();
-		setBorder(windowBorder);
-		setFont(defaultFont);
-		setForegroundColor(defaultForegroundColor);
-		setBackgroundColor(defaultBackgroundColor);
-
-		innerLayers = new FreeformLayeredPane();
-		createLayers(innerLayers);
-
-		myViewport = new FreeformViewport();
-		myViewport.setContents(innerLayers);
-
-		setViewport(myViewport);
-
-		// CR389495: Working with nested complex activities causes in the BP
-		// editor causes lockup
-		// not related to this CR but discovered while working on it:
-		// make sure we observe grid visibility from preferences
-		getGridLayer().setVisible(defaultGridEnabled);
-		getGridLayer().setSpacing(defaultGridSpacing);
-		getGridLayer().setForegroundColor(defaultGridColor);
-
-		setText(PreferenceMessages.WindowFigure_Title);
-
-		addTabbedWindowListener(new WindowFigureListener() {
-			public void tabChanged(int oldIndex, int newIndex) {
-				internalSetCurrentTab(newIndex);
-				validate();
-			}
-		});
-		addAncestorListener(new AncestorListener() {
-
-			public void ancestorAdded(IFigure ancestor) {
-				setVisible(true);
-			}
-
-			public void ancestorMoved(IFigure ancestor) {
-				// validateComposite();
-			}
-
-			public void ancestorRemoved(IFigure ancestor) {
-				setVisible(false);
-			}
-		});
-	}
-
-	// //////////////////////////////////////////////////////////////////////////
-	// Layer management
-	// //////////////////////////////////////////////////////////////////////////
-
-	/**
-	 * @param layeredPane
-	 */
-	protected void createLayers(LayeredPane layeredPane) {
-		layeredPane.add(getScaledLayers(), SCALABLE_LAYERS);
-		layeredPane.add(new FreeformLayer(), HANDLE_LAYER);
-		// CR377650: Horizontal scrolling needs to be improved
-		// moved the feedback layer into printable layers so it shows up in
-		// content outline
-		// layeredPane.add(new MyFeedbackLayer(), FEEDBACK_LAYER);
-		layeredPane.add(new GuideLayer(), GUIDE_LAYER);
-	}
-
-	/**
-	 * @return the pane
-	 */
-	protected ScalableFreeformLayeredPane createScaledLayers() {
-		ScalableFreeformLayeredPane layers = new ScalableFreeformLayeredPane();
-		layers.add(createGridLayer(), GRID_LAYER);
-		layers.add(getPrintableLayers(), PRINTABLE_LAYERS);
-		// CR389070: Figures are abbreviating rule figures names and making them
-		// unreadable
-		// not needed (?)
-		// layers.add(new MyFeedbackLayer(), SCALED_FEEDBACK_LAYER);
-		return layers;
-	}
-
-	/**
-	 * @return layered pane
-	 */
-	protected LayeredPane getScaledLayers() {
-		if (scaledLayers == null)
-			scaledLayers = createScaledLayers();
-		return scaledLayers;
-	}
-
-	/**
-	 * @return layered pane
-	 */
-	protected LayeredPane createPrintableLayers() {
-		FreeformLayeredPane layeredPane = new FreeformLayeredPane();
-
-		PrintedPageLayer pageTileLayer = new PrintedPageLayer(this);
-		// TODO: get the printer page size from printer preferences
-		// and set into the PageTileLayer.
-		pageTileLayer.setPageSize(new Dimension(0, 0));
-		layeredPane.add(pageTileLayer, PrintedPageLayer.PRINTED_PAGE_LAYER, -1);
-
-		// CR400208: Lines bleed from the bp canvas through the Fault handler
-		// window
-		// changed z-order of connection layer so that it is below figures
-		layeredPane.add(new ConnectionLayer(), CONNECTION_LAYER, -1);
-		primaryLayer = new FreeformLayer();
-		layeredPane.add(primaryLayer, PRIMARY_LAYER, -1);
-		primaryLayer.setLayoutManager(new FreeformLayout());
-
-		// CR377650: Horizontal scrolling needs to be improved
-		// let's put the feedback layer in with the printable layers so
-		// we can see the feedback figures in the content outline viewer
-		layeredPane.add(new MyFeedbackLayer(), FEEDBACK_LAYER);
-		return layeredPane;
-	}
-
-	/**
-	 * @return the layered pane
-	 */
-	protected LayeredPane getPrintableLayers() {
-		if (printableLayers == null)
-			printableLayers = createPrintableLayers();
-		return printableLayers;
-	}
-
-	/**
-	 * @return the grid layer
-	 */
-	protected GridLayer createGridLayer() {
-		return new MyGridLayer();
-	}
-
-	/**
-	 * @return the grid layer
-	 */
-	public GridLayer getGridLayer() {
-		return (GridLayer) getLayer(GRID_LAYER);
-	}
-
-	public Layer getLayer(Object key) {
-		// ScalableFreeformRootEditPart:
-		Layer layer = null;
-		if (scaledLayers != null)
-			layer = scaledLayers.getLayer(key);
-		if (layer != null)
-			return layer;
-		// FreeformGraphicalRootEditPart:
-		if (innerLayers == null)
-			return null;
-		layer = innerLayers.getLayer(key);
-		if (layer != null)
-			return layer;
-		if (printableLayers == null)
-			return null;
-		return printableLayers.getLayer(key);
-	}
-
-	// //////////////////////////////////////////////////////////////////////////
-	// Properties
-	// //////////////////////////////////////////////////////////////////////////
-
-	/**
-	 * @return the scroll position
-	 */
-	public Point getScrollPosition() {
-		int x = getHorizontalScrollBar().getRangeModel().getValue();
-		int y = getVerticalScrollBar().getRangeModel().getValue();
-		return new Point(x, y);
-	}
-
-	/**
-	 * @return the border
-	 */
-	public TabbedTitleBarBorder getTabbedTitleBarBorder() {
-		return titleBarBorder;
-	}
-
-	/**
-	 * @return the border
-	 */
-	public TabbedWindowBorder getTabbedWindowBorder() {
-		return windowBorder;
-	}
-
-	/**
-	 * @param listener
-	 */
-	public void addTabbedWindowListener(WindowFigureListener listener) {
-		titleBarBorder.addTabbedWindowListener(listener);
-	}
-
-	/**
-	 * @param listener
-	 */
-	public void removeTabbedWindowListener(WindowFigureListener listener) {
-		titleBarBorder.removeTabbedWindowListener(listener);
-	}
-
-	public Dimension getMinimumSize(int wHint, int hHint) {
-		Dimension d = titleBarBorder.getMinimumSize(wHint, hHint);
-		d.expand(getInsets().getWidth(), getInsets().getHeight());
-		return d;
-	}
-
-	/**
-	 * @param s
-	 * @return the previous number of tabs
-	 */
-	public int addTab(String s) {
-		return titleBarBorder.addTab(s);
-	}
-
-	/**
-	 * @param index
-	 */
-	public void removeTab(int index) {
-		titleBarBorder.removeTab(index);
-		internalSetCurrentTab(titleBarBorder.getCurrentTab());
-	}
-
-	private void internalSetCurrentTab(int index) {
-		// Object contents = titleBarBorder.getContents(index);
-		// if (contents instanceof IFigure)
-		// setContents((IFigure) contents);
-	}
-
-	/**
-	 * @param index
-	 */
-	public void setCurrentTab(int index) {
-		internalSetCurrentTab(index);
-		titleBarBorder.setCurrentTab(index);
-	}
-
-	/**
-	 * @return the current tab index
-	 */
-	public int getCurrentTab() {
-		return titleBarBorder.getCurrentTab();
-	}
-
-	public void setContents(IFigure figure) {
-		titleBarBorder.setContents(0, figure);
-		super.setContents(figure);
-	}
-
-	/**
-	 * @param index
-	 * @param contents
-	 */
-	public void setContents(int index, Object contents) {
-		if (contents instanceof IFigure)
-			setContents((IFigure) contents);
-		titleBarBorder.setContents(index, contents);
-	}
-
-	/**
-	 * @param index
-	 * @return the content object of the index
-	 */
-	public Object getContents(int index) {
-		return titleBarBorder.getContents(index);
-	}
-
-	public void setVisible(boolean flag) {
-		super.setVisible(flag);
-		windowBorder.setVisible(flag);
-		// hide/show the window contents if it's a SWT composite
-		Object contents = getContents();
-		if (contents instanceof Composite)
-			((Composite) contents).setVisible(flag);
-	}
-
-	public void setHighlight(boolean flag) {
-		windowBorder.setHighlight(flag);
-	}
-
-	public void setFont(Font f) {
-		titleBarBorder.setFont(f);
-	}
-
-	public void setForegroundColor(Color c) {
-		titleBarBorder.setTextColor(c);
-	}
-
-	/**
-	 * @param style
-	 */
-	public void setLineRoutingStyle(int style) {
-		defaultLineRoutingStyle = style;
-		revalidate();
-	}
-
-	/**
-	 * @return the line routing style
-	 */
-	public int getLineRoutingStyle() {
-		return defaultLineRoutingStyle;
-	}
-
-	public Dimension getPreferredSize(int wHint, int hHint) {
-		if (prefSize == null) {
-			IFigure parent = getParent();
-			prefSize = parent.getSize();
-			this.getLayoutManager().invalidate();
-			Dimension m = super.getPreferredSize(wHint, hHint);
-			if (getParent() instanceof CompoundNodeFigure) {
-				if (((CompoundNodeFigure) parent).getState() == CompoundNodeFigure.RESTORED) {
-					Insets in = ((CompoundNodeFigure) getParent())
-							.getAnchorInsets();
-					prefSize.width -= in.getWidth();
-					prefSize.height -= in.getHeight();
-				}
-			} else {
-				if (m.width > prefSize.width)
-					prefSize.width = m.width;
-				if (m.height > prefSize.height)
-					prefSize.height = m.height;
-			}
-		}
-		return prefSize;
-	}
-
-	protected boolean isValidationRoot() {
-		return true;
-	}
-
-	// private void validateComposite() {
-	// Object contents = getContents();
-	// // System.out.println("validate: "+titleBarBorder.getLabel(0)+"
-	// // "+contents);
-	// if (contents instanceof Composite) {
-	// if (getParent() == null) {
-	// System.err.println("TabbedWindowFigure.validate() - ERROR");
-	// return;
-	// }
-	// Rectangle r = getBounds().getCopy();
-	// r.crop(getInsets());
-	// Dimension ps = getParent().getParent().getPreferredSize();
-	// Rectangle pr = getParent().getParent().getBounds();
-	// titleBarBorder.invalidate();
-	// titleBarBorder.getInsets(this);
-	// Insets in = getParent().getParent().getInsets();
-	// Composite comp = (Composite) getContents();
-	// comp.setBounds(pr.x + r.x + in.left, pr.y + r.y, r.width, r.height);
-	// comp.moveAbove(null);
-	// }
-	// }
-
-	public void invalidate() {
-		prefSize = null;
-		super.invalidate();
-	}
-
-	// //////////////////////////////////////////////////////////////////////
-	// IBaseFigure methods
-	// //////////////////////////////////////////////////////////////////////
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.gem.diagram.editor.figures.IBaseFigure#setText(String
-	 *      text)
-	 */
-	public void setText(String name) {
-		titleBarBorder.setLabel(name);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.gem.diagram.editor.figures.IBaseFigure#getText()
-	 */
-	public String getText() {
-		if (titleBarBorder == null)
-			return PreferenceMessages.WindowFigure_NoTitleText;
-		return titleBarBorder.getLabel();
-	}
-
-	/*
-	 * CR374981: Long activity labels do not get wrapped or truncated This
-	 * method was added to the IBaseFigure interface to support direct edit of
-	 * figure labels on the canvas.
-	 */
-	public Rectangle getTextBounds() {
-		Rectangle r = getClientArea().getCopy();
-		r.height = titleBarBorder.getTextExtents(this).height;
-		r.x += getInsets().left;
-		r.y -= getInsets().top;
-		return r;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.gem.diagram.editor.figures.IBaseFigure#getIcon()
-	 */
-	public Image getIcon() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.gem.diagram.editor.figures.IBaseFigure#setIcon(org.eclipse.swt.graphics.Image)
-	 */
-	public void setIcon(Image image) {
-        // do nothing
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.gem.diagram.editor.figures.IBaseFigure#setToolTipText(java.lang.String)
-	 */
-	public void setToolTipText(String text) {
-        // do nothing
-	}
-
-	public String getToolTipText() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.gem.diagram.editor.figures.IBaseFigure#addDecorator(com.sybase.stf.gem.diagram.editor.figures.BaseFigureDecorator)
-	 */
-	public void addDecorator(BaseFigureDecorator decorator) {
-        // do nothing
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.gem.diagram.editor.figures.IBaseFigure#removeDecorator()
-	 */
-	public void removeDecorator() {
-        // do nothing
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.gem.diagram.editor.figures.IBaseFigure#removeDecorator(int)
-	 */
-	public void removeDecorator(int position) {
-        // do nothing
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.gem.diagram.editor.figures.IBaseFigure#getDecorators()
-	 */
-	public List getDecorators() {
-		return null;
-	}
-
-	// //////////////////////////////////////////////////////////////////////
-	// FreeformFigure methods
-	// //////////////////////////////////////////////////////////////////////
-
-	private WindowFreeformHelper helper = new WindowFreeformHelper(this);
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.FreeformFigure#addFreeformListener(org.eclipse.draw2d.FreeformListener)
-	 */
-	public void addFreeformListener(FreeformListener listener) {
-		addListener(FreeformListener.class, listener);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.FreeformFigure#fireExtentChanged()
-	 */
-	public void fireExtentChanged() {
-		Iterator iter = getListeners(FreeformListener.class);
-		while (iter.hasNext())
-			((FreeformListener) iter.next()).notifyFreeformExtentChanged();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.FreeformFigure#getFreeformExtent()
-	 */
-	public Rectangle getFreeformExtent() {
-		Rectangle r = helper.getFreeformExtent();
-		r.x = 0;
-		r.y = 0;
-		return r;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.FreeformFigure#removeFreeformListener(org.eclipse.draw2d.FreeformListener)
-	 */
-	public void removeFreeformListener(FreeformListener listener) {
-		removeListener(FreeformListener.class, listener);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.FreeformFigure#setFreeformBounds(org.eclipse.draw2d.geometry.Rectangle)
-	 */
-	public void setFreeformBounds(Rectangle bounds) {
-		helper.setFreeformBounds(bounds);
-	}
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/WindowFigureListener.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/WindowFigureListener.java
deleted file mode 100644
index e263904..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/WindowFigureListener.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.preference;
-
-/**
- * @author Bob Brodt
- * 
- * Defines an interface for notifying listeners of page switches on a tabbed
- * window figure.
- */
-/*package*/ interface WindowFigureListener {
-	/**
-	 * @param oldIndex
-	 * @param newIndex
-	 */
-	void tabChanged(int oldIndex, int newIndex);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/WindowFreeformHelper.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/WindowFreeformHelper.java
deleted file mode 100644
index 55be3a4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/WindowFreeformHelper.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.preference;
-
-import java.util.List;
-
-import org.eclipse.draw2d.FigureListener;
-import org.eclipse.draw2d.FreeformFigure;
-import org.eclipse.draw2d.FreeformLayeredPane;
-import org.eclipse.draw2d.FreeformListener;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.geometry.Insets;
-import org.eclipse.draw2d.geometry.Rectangle;
-
-/**
- * Stolen from org.eclipse.draw2d.FreeformHelper. See also FreeformLayeredPane.
- * 
- * @author bbrodt
- */
-/*package*/ class WindowFreeformHelper implements FreeformListener {
-	FreeformLayeredPane x;
-
-	class ChildTracker implements FigureListener {
-		public void figureMoved(IFigure source) {
-			invalidate();
-		}
-	}
-
-	private FreeformFigure host;
-
-	private Rectangle freeformExtent;
-
-	private FigureListener figureListener = new ChildTracker();
-
-	/**
-	 * @param host
-	 */
-	public WindowFreeformHelper(FreeformFigure host) {
-		this.host = host;
-	}
-
-	/**
-	 * @return the freeform extent
-	 */
-	public Rectangle getFreeformExtent() {
-		if (freeformExtent != null)
-			return freeformExtent;
-		Rectangle r;
-		List children = host.getChildren();
-		for (int i = 0; i < children.size(); i++) {
-			IFigure child = (IFigure) children.get(i);
-			if (child instanceof FreeformFigure)
-				r = ((FreeformFigure) child).getFreeformExtent();
-			else
-				r = child.getBounds();
-			if (freeformExtent == null)
-				freeformExtent = r.getCopy();
-			else
-				freeformExtent.union(r);
-		}
-		Insets insets = host.getInsets();
-		if (freeformExtent == null)
-			freeformExtent = new Rectangle(0, 0, insets.getWidth(), insets
-					.getHeight());
-		else {
-			host.translateToParent(freeformExtent);
-			freeformExtent.expand(insets);
-		}
-		// System.out.println("New extent calculated for " + host + " = " +
-		// freeformExtent);
-		return freeformExtent;
-	}
-
-	/**
-	 * @param child
-	 */
-	public void hookChild(IFigure child) {
-		invalidate();
-		if (child instanceof FreeformFigure)
-			((FreeformFigure) child).addFreeformListener(this);
-		else
-			child.addFigureListener(figureListener);
-	}
-
-	void invalidate() {
-		freeformExtent = null;
-		host.fireExtentChanged();
-		if (host.getParent() != null)
-			host.getParent().revalidate();
-		else
-			host.revalidate();
-	}
-
-	public void notifyFreeformExtentChanged() {
-		// A childs freeform extent has changed, therefore this extent must be
-		// recalculated
-		invalidate();
-	}
-
-	/**
-	 * @param bounds
-	 */
-	public void setFreeformBounds(Rectangle bounds) {
-		host.setBounds(bounds);
-		bounds = bounds.getCopy();
-		host.translateFromParent(bounds);
-		List children = host.getChildren();
-		for (int i = 0; i < children.size(); i++) {
-			IFigure child = (IFigure) children.get(i);
-			if (child instanceof FreeformFigure)
-				((FreeformFigure) child).setFreeformBounds(bounds);
-		}
-		// CR420954: Compensation Handler canvas goes blank after Variables
-		// Sections is expanded
-		host.getLayoutManager().layout(host);
-	}
-
-	/**
-	 * @param child
-	 */
-	public void unhookChild(IFigure child) {
-		invalidate();
-		if (child instanceof FreeformFigure)
-			((FreeformFigure) child).removeFreeformListener(this);
-		else
-			child.removeFigureListener(figureListener);
-	}
-
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/provider/ManagedBeanContentProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/provider/ManagedBeanContentProvider.java
deleted file mode 100644
index 45d15b4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/provider/ManagedBeanContentProvider.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.provider;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType;
-import org.eclipse.jst.jsf.facesconfig.ui.section.ManagedBeanScopeTreeItem;
-
-/**
- * Managed bean Content Provider.
- * <p>
- * <b>Provides grouping by Scope.</b>
- * </p>
- * 
- * @author Xiao-guang Zhang, sfshi
- * @version 1.5
- */
-public class ManagedBeanContentProvider implements ITreeContentProvider {
-
-	private List scopeItemList = null;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(Object
-	 *      parent)
-	 */
-	public Object[] getChildren(Object parent) {
-
-		if (parent instanceof FacesConfigType) {
-			if (scopeItemList == null) {
-				scopeItemList = new ArrayList();
-				for (int i = 0; i < ManagedBeanScopeTreeItem.scopeItems.length; i++) {
-					ManagedBeanScopeTreeItem scopeTreeItem = new ManagedBeanScopeTreeItem(
-							ManagedBeanScopeTreeItem.scopeItems[i],
-							(FacesConfigType) parent);
-					scopeItemList.add(scopeTreeItem);
-				}
-			}
-			return scopeItemList.toArray();
-		} else if (parent instanceof ManagedBeanScopeTreeItem) {
-			return ((ManagedBeanScopeTreeItem) parent).getChildren().toArray();
-		}
-
-		return new Object[0];
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ITreeContentProvider#getElements(Object
-	 *      parent)
-	 */
-	public Object[] getElements(Object inputElement) {
-		return getChildren(inputElement);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object)
-	 */
-	public Object getParent(Object element) {
-		if (element instanceof ManagedBeanScopeTreeItem) {
-			return ((ManagedBeanScopeTreeItem) element).getParent();
-		} else if (element instanceof ManagedBeanType) {
-			String scope = null;
-			if (((ManagedBeanType) element).getManagedBeanScope() != null) {
-				scope = ((ManagedBeanType) element).getManagedBeanScope()
-						.getTextContent();
-			}
-
-			if (scope != null) {
-				for (int i = 0; i < scopeItemList.size(); i++) {
-					if (((ManagedBeanScopeTreeItem) scopeItemList.get(i))
-							.getScope().equals(scope)) {
-						return scopeItemList.get(i);
-					}
-
-				}
-			}
-		}
-
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object)
-	 */
-	public boolean hasChildren(Object element) {
-		if (element instanceof FacesConfigType) {
-			return true;
-		} else if (element instanceof ManagedBeanScopeTreeItem) {
-			return ((ManagedBeanScopeTreeItem) element).hasChildren();
-		}
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-	 */
-	public void dispose() {
-		// TODO Auto-generated method stub
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer,
-	 *      java.lang.Object, java.lang.Object)
-	 */
-	public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-		if (newInput != null) {
-//			initialize(newInput);
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/provider/ManagedBeanLabelProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/provider/ManagedBeanLabelProvider.java
deleted file mode 100644
index 8a51f08..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/provider/ManagedBeanLabelProvider.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.provider;
-
-import java.util.Hashtable;
-import java.util.Map;
-
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.jst.jsf.facesconfig.ui.IFacesConfigConstants;
-import org.eclipse.jst.jsf.facesconfig.ui.section.ManagedBeanScopeTreeItem;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * The Managed Bean Page's TreeViewer Label Provider
- * 
- * @author Xiao-guang Zhang, sfshi
- * @version 1.5
- */
-public class ManagedBeanLabelProvider extends LabelProvider {
-	
-	private static final String SCOPE_IMAGE_FILE = "Scope.gif"; //$NON-NLS-1$
-	private static final String SCOPE_NONE_IMAGE_FILE = "Scope_None.gif"; //$NON-NLS-1$
-	private static final String SCOPE_APPLICATION_IMAGE_FILE = "Scope_Application.gif"; //$NON-NLS-1$
-	private static final String SCOPE_REQUEST_IMAGE_FILE = "Scope_Request.gif"; //$NON-NLS-1$
-	private static final String SCOPE_SESSION_IMAGE_FILE = "Scope_Session.gif"; //$NON-NLS-1$
-	private static final String MANAGED_BEAN_IMAGE_FILE = "facesconfig/FacesConfig_ManagedBean.gif"; //$NON-NLS-1$
-	
-	/** Cache of images that have been dispensed by this provider */
-	private Map imageTable;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.LabelProvider#getText(Object obj)
-	 */
-	public String getText(Object obj) {
-		String text = ""; //$NON-NLS-1$
-
-		if (obj instanceof ManagedBeanType) {
-			ManagedBeanType bean = (ManagedBeanType) obj;
-			if (bean.getManagedBeanName() != null) {
-				text = bean.getManagedBeanName().getTextContent();
-
-			}
-			if (text == null || text.length() < 1) {
-				if (bean.getManagedBeanClass() != null)
-					text = bean.getManagedBeanClass().getTextContent();
-			}
-		} else if (obj instanceof ManagedBeanScopeTreeItem) {
-			text = ((ManagedBeanScopeTreeItem) obj).getScope();
-		}
-
-		return text;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.LabelProvider#getImage(Object obj)
-	 */
-	public Image getImage(Object obj) {
-		ImageDescriptor imageDesc = null;
-		if (obj instanceof ManagedBeanType) {
-
-			imageDesc = EditorPlugin.getDefault().getImageDescriptor(
-					MANAGED_BEAN_IMAGE_FILE);
-
-		} else if (obj instanceof ManagedBeanScopeTreeItem) {
-			ManagedBeanScopeTreeItem scopeTreeItem = (ManagedBeanScopeTreeItem) obj;
-			if (IFacesConfigConstants.MANAGED_BEAN_SCOPE_SESSION
-					.equals(scopeTreeItem.getScope())) {
-				imageDesc = EditorPlugin.getDefault().getImageDescriptor(
-						SCOPE_SESSION_IMAGE_FILE);
-			} else if (IFacesConfigConstants.MANAGED_BEAN_SCOPE_REQUEST
-					.equals(scopeTreeItem.getScope())) {
-				imageDesc = EditorPlugin.getDefault().getImageDescriptor(
-						SCOPE_REQUEST_IMAGE_FILE);
-			} else if (IFacesConfigConstants.MANAGED_BEAN_SCOPE_APPLICATION
-					.equals(scopeTreeItem.getScope())) {
-				imageDesc = EditorPlugin.getDefault().getImageDescriptor(
-						SCOPE_APPLICATION_IMAGE_FILE);
-			} else if (IFacesConfigConstants.MANAGED_BEAN_SCOPE_NONE
-					.equals(scopeTreeItem.getScope())) {
-				imageDesc = EditorPlugin.getDefault().getImageDescriptor(
-						SCOPE_NONE_IMAGE_FILE);
-			} else {
-				imageDesc = EditorPlugin.getDefault().getImageDescriptor(
-						SCOPE_IMAGE_FILE);
-			}
-		}
-
-		if (imageDesc != null) {
-			// Obtain the cached image corresponding to the descriptor
-			if (imageTable == null) {
-				imageTable = new Hashtable(40);
-			}
-			Image image = (Image) imageTable.get(imageDesc);
-			if (image == null) {
-				image = imageDesc.createImage();
-				imageTable.put(imageDesc, image);
-			}
-			return image;
-		}
-		return PlatformUI.getWorkbench().getSharedImages().getImage(
-				ISharedImages.IMG_OBJ_ELEMENT);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/AbstractFacesConfigSection.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/AbstractFacesConfigSection.java
deleted file mode 100644
index 88dc8d8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/AbstractFacesConfigSection.java
+++ /dev/null
@@ -1,295 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.section;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.help.HelpSystem;
-import org.eclipse.help.IContext;
-import org.eclipse.help.IHelpResource;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.jst.jsf.facesconfig.ui.page.IFacesConfigPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.SectionPart;
-import org.eclipse.ui.forms.events.HyperlinkAdapter;
-import org.eclipse.ui.forms.events.HyperlinkEvent;
-import org.eclipse.ui.forms.widgets.ExpandableComposite;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.forms.widgets.ImageHyperlink;
-import org.eclipse.ui.forms.widgets.Section;
-
-
-/**
- * The abstract implementation of IFacesConfigSection.
- * 
- * 
- * @author jchoi, xgzhang, sfshi
- * 
- * @version 1.0
- */
-public abstract class AbstractFacesConfigSection extends SectionPart implements
-		IFacesConfigSection, ISelectionProvider, ISelectionChangedListener {
-	/** tool kit */
-	private FormToolkit toolkit;
-
-	/** help context id */
-	private String helpContextId = null;
-
-	/** help tool tip string */
-	private String helpTooltip = null;
-
-	/** model object */
-	private Object input = null;
-
-	private IFacesConfigPage page;
-
-	private List selectionChangedListeners = new ArrayList();
-
-	/** help image */
-	private final static Image HELP_IMAGE = EditorPlugin.getDefault().getImage(
-			"help.gif"); //$NON-NLS-1$
-
-	/**
-	 * Constructor with help option.
-
-	 * @param parent 
-	 * @param managedForm
-	 * @param page 
-	 * @param toolkit
-	 * @param helpContextId
-	 * @param helpTooltip
-	 */
-	public AbstractFacesConfigSection(Composite parent,
-			IManagedForm managedForm, IFacesConfigPage page,
-			FormToolkit toolkit, String helpContextId, String helpTooltip) {
-		super(parent, toolkit, ExpandableComposite.TITLE_BAR
-				| ExpandableComposite.TWISTIE | Section.DESCRIPTION
-				| ExpandableComposite.EXPANDED);
-		super.initialize(managedForm);
-		this.page = page;
-		this.toolkit = toolkit;
-		this.helpContextId = helpContextId;
-		this.helpTooltip = helpTooltip;
-	}
-
-	public void dispose() {
-		selectionChangedListeners.clear();
-		if (input != null) 
-			removeAdaptersFromInput(input);		
-		super.dispose();
-	}
-	/**
-	 * 
-	 */
-	public void initialize() {
-		if (helpContextId != null) {
-			createTextClientWithHelp();
-		}
-
-		getSection().setLayout(new GridLayout());
-
-		Composite clientContainer = toolkit.createComposite(getSection());
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		clientContainer.setLayoutData(gd);
-
-		createContents(clientContainer, toolkit);
-		getSection().setClient(clientContainer);
-
-	}
-
-	/**
-	 * 
-	 * 
-	 */
-	private void createTextClientWithHelp() {
-		ImageHyperlink helpImage = new ImageHyperlink(getSection(), SWT.NULL);
-
-		toolkit.adapt(helpImage, true, true);
-
-		helpImage.setImage(HELP_IMAGE);
-
-		helpImage.setBackground(getSection().getTitleBarGradientBackground());
-		if (helpTooltip != null) {
-			helpImage.setToolTipText(helpTooltip);
-		}
-
-		helpImage.addHyperlinkListener(new HyperlinkAdapter() {
-			public void linkActivated(HyperlinkEvent e) {
-				IContext context = HelpSystem.getContext(helpContextId);
-				if (context != null) {
-					IHelpResource[] topics = context.getRelatedTopics();
-					if (topics != null && topics.length == 1) {
-						EditorPlugin.getDefault().getWorkbench()
-								.getHelpSystem().displayHelpResource(
-										topics[0].getHref());
-					} else {
-						EditorPlugin.getDefault().getWorkbench()
-								.getHelpSystem().displayHelp(helpContextId);
-					}
-				}
-			}
-		});
-
-		getSection().setTextClient(helpImage);
-	}
-
-	/**
-	 * The sub calss should implement this method to create and fill the
-	 * contents in the section
-	 * 
-	 * @param container
-	 * @param toolkit_
-	 */
-	protected abstract void createContents(Composite container,
-			FormToolkit toolkit_);
-
-	/**
-	 * get the input object of this section.
-	 */
-	public Object getInput() {
-		return input;
-	}
-
-	/**
-	 * set input object for this section.
-	 */
-	public void setInput(Object newInput) {
-		if (input != null)
-			removeAdaptersFromInput(input);
-
-		input = newInput;
-
-		if (newInput != null)
-			addAdaptersOntoInput(newInput);
-		// if (this.getSection().isExpanded())
-		refreshAll();
-	}
-
-	/**
-	 * Remove adapters from the input object when the section changes it's
-	 * input. Sub classes should overwrite this method to remove the adapters
-	 * that they added on.
-	 * 
-	 * @param oldInput
-	 */
-	protected void removeAdaptersFromInput(Object oldInput) {
-	    // do nothing; subs should override
-	}
-
-	/**
-	 * Add adapters onto the input object when the section has new input. Sub
-	 * classes should their own adapters.
-	 * 
-	 * @param newInput
-	 */
-	protected void addAdaptersOntoInput(Object newInput) {
-        // do nothing; subs should override
-	}
-
-	/**
-	 * @return the page that this section lies in.
-	 */
-	public IFacesConfigPage getPage() {
-		return page;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#getSelection()
-	 */
-	public ISelection getSelection() {
-		return StructuredSelection.EMPTY;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#setSelection(org.eclipse.jface.viewers.ISelection)
-	 */
-	public void setSelection(ISelection selection) {
-	    // do nothing: no selection change
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#addSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
-	 */
-	public void addSelectionChangedListener(ISelectionChangedListener listener) {
-		selectionChangedListeners.add(listener);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#removeSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
-	 */
-	public void removeSelectionChangedListener(
-			ISelectionChangedListener listener) {
-		selectionChangedListeners.remove(listener);
-	}
-
-	/**
-	 * transfer the selection changed event to detail part.
-	 */
-	public void selectionChanged(SelectionChangedEvent event) {
-
-		for (Iterator listeners = selectionChangedListeners.iterator(); listeners
-				.hasNext();) {
-			ISelectionChangedListener listener = (ISelectionChangedListener) listeners
-					.next();
-			listener.selectionChanged(new SelectionChangedEvent(this,
-					event != null ? event.getSelection()
-							: StructuredSelection.EMPTY));
-		}
-	}
-
-	/**
-	 * the convenient method to get the AdapterFactory instance of the editor;
-	 * 
-	 * @return the AdapterFactory instance.
-	 */
-	public AdapterFactory getAdapterFactory() {
-		return (AdapterFactory) getPage().getEditor().getAdapter(
-				AdapterFactory.class);
-	}
-
-	/**
-	 * the convenient method to get the EditingDomain instance of the editor;
-	 * 
-	 * @return the EditingDomain instance.
-	 */
-	public EditingDomain getEditingDomain() {
-		return (EditingDomain) getPage().getEditor().getAdapter(
-				EditingDomain.class);
-	}
-    
-    public void clearAll()
-    {
-        // do nothing, sub-classes may choose to override to clear their contents
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/AbstractOverviewSection.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/AbstractOverviewSection.java
deleted file mode 100644
index b8e13ba..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/AbstractOverviewSection.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.section;
-
-import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jst.jsf.common.ui.internal.actions.OpenPageAction;
-import org.eclipse.jst.jsf.facesconfig.ui.page.IFacesConfigPage;
-import org.eclipse.swt.events.MouseAdapter;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * @author sfshi
- * 
- */
-public abstract class AbstractOverviewSection extends
-		AbstractFacesConfigSection {
-
-	/**
-	 * the common table viewer used for  the contents
-	 */
-	protected TableViewer tableViewer;
-
-	private String targetPageID;
-
-	/**
-	 * 
-	 * @param parent
-	 * @param managedForm
-	 * @param page
-	 * @param toolkit
-	 * @param targetPageID
-	 * @param title
-	 * @param description
-	 * @param helpContextId
-	 * @param helpTooltip
-	 */
-	public AbstractOverviewSection(Composite parent, IManagedForm managedForm,
-			IFacesConfigPage page, FormToolkit toolkit, String targetPageID,
-			String title, String description, String helpContextId,
-			String helpTooltip) {
-		super(parent, managedForm, page, toolkit, helpContextId, helpTooltip);
-		this.targetPageID = targetPageID;
-		getSection().setText(title);
-		getSection().setDescription(description);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.section.AbstractFacesConfigSection#createContents(org.eclipse.swt.widgets.Composite,
-	 *      org.eclipse.ui.forms.widgets.FormToolkit)
-	 */
-	protected void createContents(Composite container, FormToolkit toolkit) {
-
-		GridLayout layout = new GridLayout();
-		layout.numColumns = 1;
-		layout.marginHeight = 2;
-		layout.marginWidth = 2;
-		layout.verticalSpacing = 5;
-		layout.horizontalSpacing = 6;
-		container.setLayout(layout);
-		toolkit.paintBordersFor(container);
-		Table table = createTable(container);
-		if (targetPageID != null) {
-			table.addMouseListener(new MouseAdapter() {
-				public void mouseDoubleClick(MouseEvent e) {
-					if (((IStructuredSelection) tableViewer.getSelection())
-							.size() == 1) {
-						OpenPageAction action = new OpenPageAction();
-						action.setPageName(targetPageID);
-						action.setSelection(tableViewer.getSelection());
-						action.run();
-					}
-				}
-			});
-		}
-		tableViewer = new TableViewer(table);
-		tableViewer.setContentProvider(new AdapterFactoryContentProvider(
-				getAdapterFactory()));
-		ComposedAdapterFactory factory = (ComposedAdapterFactory)getAdapterFactory();
-		tableViewer.setLabelProvider(new AdapterFactoryLabelProvider(factory));
-		configTableViewer(tableViewer);
-	}
-
-	/**
-	 * 
-	 * @param container 
-	 * @return the table
-	 */
-	abstract protected Table createTable(Composite container);
-
-	/**
-	 * 
-	 * @param tableViewer1
-	 */
-	abstract protected void configTableViewer(TableViewer tableViewer1);
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.section.IFacesConfigSection#clearAll()
-	 */
-	public void clearAll() {
-		tableViewer.setInput(null);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.section.IFacesConfigSection#refreshAll()
-	 */
-	public void refreshAll() {
-		tableViewer.setInput(getInput());
-
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ApplicationSection.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ApplicationSection.java
deleted file mode 100644
index b121d0e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ApplicationSection.java
+++ /dev/null
@@ -1,216 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.section;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.command.CompoundCommand;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.command.AddCommand;
-import org.eclipse.jdt.ui.IJavaElementSearchConstants;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.jst.jsf.facesconfig.emf.ApplicationType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType;
-import org.eclipse.jst.jsf.facesconfig.ui.dialog.DialogUtil;
-import org.eclipse.jst.jsf.facesconfig.ui.page.IFacesConfigPage;
-import org.eclipse.jst.jsf.facesconfig.ui.page.OthersPage;
-import org.eclipse.jst.jsf.facesconfig.ui.util.ModelUtil;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * A common <code>IFacesConfigSection</code> implementation for the sections that editing
- * the child elements of <application>, including: <action-listener>,
- * <default-render-kit-id>, <message-bundle>, <navigation-handler>,
- * <view-handler>,<state-manager>, <property-resolver>, <variable-resolver> and
- * <locale-config>. This sections will use the EClass object of these elements
- * as the key.
- * 
- * @author Zhi-peng Zhang, sfshi
- * @version
- */
-public class ApplicationSection extends OthersPageBaseSection {
-
-	/** The Eclass object this Section operated */
-	private EClass applicationChildClass;
-
-	/**
-	 * 
-	 * @param applicationChildClass
-	 * @param parent
-	 * @param managedForm
-	 * @param page
-	 * @param toolkit
-	 * @param helpContextId
-	 * @param helpTooltip
-	 */
-	public ApplicationSection(EClass applicationChildClass, Composite parent,
-			IManagedForm managedForm, IFacesConfigPage page,
-			FormToolkit toolkit, String helpContextId, String helpTooltip) {
-		super(parent, managedForm, page, toolkit, helpContextId, helpTooltip);
-		this.applicationChildClass = applicationChildClass;
-	}
-
-	/**
-	 * 
-	 * @param componentClass
-	 * @param parent
-	 * @param managedForm
-	 * @param page
-	 * @param toolkit
-	 */
-	public ApplicationSection(EClass componentClass, Composite parent,
-			IManagedForm managedForm, IFacesConfigPage page, FormToolkit toolkit) {
-		this(componentClass, parent, managedForm, page, toolkit, null, null);
-	}
-
-	/**
-	 * Create an object which is instance of <code>applicationChildClass</code>.
-	 * 
-	 * @return the child class object
-	 */
-	public EObject createApplicationChildObject() {
-		String textValue = null;
-		IProject project = (IProject) this.getPage().getEditor().getAdapter(
-				IProject.class);
-		FacesConfigType facesConfig = (FacesConfigType) this.getPage()
-				.getInput();
-		if (applicationChildClass == FacesConfigPackage.eINSTANCE
-				.getDefaultRenderKitIdType()) {
-
-			/** Open a dialog to select a render-kit of this faces config. */
-			textValue = DialogUtil.openRenderKitDialog(getSection().getShell(),
-					facesConfig);
-		} else if (applicationChildClass == FacesConfigPackage.eINSTANCE
-				.getMessageBundleType()) {
-			/**
-			 * Open a dialog the select the message bundles that in current
-			 * project. If user select a bundle that already declared in this
-			 * faces config, then shows a warning message.
-			 */
-			List bundles = new ArrayList();
-			if (facesConfig.getApplication().size() > 0) {
-				ApplicationType applicationType = (ApplicationType) facesConfig
-						.getApplication().get(0);
-				bundles = applicationType.getMessageBundle();
-			}
-
-			textValue = DialogUtil.openMessageBundleDialog(getSection()
-					.getShell(), project, bundles);
-
-		} else {
-			/**
-			 * For other types children, open a ClassDialog to select a class in
-			 * current project.
-			 */
-			String superType = ModelUtil.getSuperType(applicationChildClass);
-			textValue = DialogUtil.openClassDialog(getSection().getShell(),
-					project, superType,
-					IJavaElementSearchConstants.CONSIDER_ALL_TYPES);
-		}
-		if (textValue != null && textValue.length() > 0) {
-			EObject component = FacesConfigFactory.eINSTANCE
-					.create(applicationChildClass);
-			// set text content.
-			EStructuralFeature feature = applicationChildClass
-					.getEStructuralFeatures().get(0);
-			component.eSet(feature, textValue);
-			return component;
-		}
-		return null;
-	}
-
-	/**
-	 * Set the <application> element as the structuredViewer's input.
-	 * 
-	 * @param input
-	 */
-	protected void setViewerInput(Object input) {
-		if (input instanceof ApplicationType) {
-			tableViewer.setInput(input);
-		} else
-			tableViewer.setInput(null);
-	}
-
-	/**
-	 * Add a filter on the table viewer. Only the elements that is a instance of
-	 * <code>applicationChildClass</code> could be selected.
-	 */
-	protected void configTableViewer(TableViewer tableViewer1) {
-		tableViewer1.addFilter(new ViewerFilter() {
-			public boolean select(Viewer viewer, Object parentElement,
-					Object element) {
-				return applicationChildClass.isInstance(element);
-			}
-		});
-	}
-
-	/**
-	 * Perform some actions to create new child object and append it to the
-	 * <application> element.
-	 */
-	void addButtonSelected(SelectionEvent e) {
-		/** Create such a new object. */
-		EObject obj = createApplicationChildObject();
-		if (obj != null) {
-
-			boolean needRefreshAll = false;
-			Command command = null;
-			if (getInput() instanceof ApplicationType) {
-				/**
-				 * The input is a <application> element and not null, append the
-				 * new object to it.
-				 */
-				ApplicationType application = (ApplicationType) getInput();
-				command = AddCommand.create(getEditingDomain(), application,
-						null, obj);
-			} else {
-				/**
-				 * The input is null, create a <application> element and append
-				 * it to <faces-config>.
-				 */
-				needRefreshAll = true;
-
-				List list = new ArrayList(2);
-				ApplicationType application = FacesConfigFactory.eINSTANCE
-						.createApplicationType();
-				Command cmd1 = AddCommand.create(getEditingDomain(),
-						application, null, obj);
-				list.add(cmd1);
-				Command cmd2 = AddCommand.create(getEditingDomain(), this
-						.getPage().getInput(), null, application);
-				list.add(cmd2);
-				command = new CompoundCommand(list);
-			}
-
-			if (command.canExecute()) {
-				getEditingDomain().getCommandStack().execute(command);
-				if (needRefreshAll) {
-					/** reset the application input. */
-					((OthersPage) this.getPage()).resetApplicationInput();
-				}
-			}
-		}
-
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/AttributeSection.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/AttributeSection.java
deleted file mode 100644
index 687ffcf..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/AttributeSection.java
+++ /dev/null
@@ -1,509 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.section;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.command.CompoundCommand;
-import org.eclipse.emf.edit.command.AddCommand;
-import org.eclipse.emf.edit.command.RemoveCommand;
-import org.eclipse.emf.edit.command.SetCommand;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.viewers.ColumnWeightData;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.TableLayout;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.jst.jsf.facesconfig.emf.AttributeClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.AttributeNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.AttributeType;
-import org.eclipse.jst.jsf.facesconfig.emf.DefaultValueType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.SuggestedValueType;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.dialog.AddEditAttributeDialog;
-import org.eclipse.jst.jsf.facesconfig.ui.page.IFacesConfigPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.MouseAdapter;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * Attribute section
- *
- */
-public class AttributeSection extends AbstractFacesConfigSection  {
-
-	private static final int TABLE_DEFAULT_HEIGHT = 160;
-
-	private TableViewer tableViewer;
-
-	private Button removeButton;
-
-	private Button editButton;	
-
-	/**
-	 * 
-	 * @param parent
-	 * @param managedForm
-	 * @param page
-	 * @param toolkit
-	 */
-	public AttributeSection(Composite parent, IManagedForm managedForm,
-			IFacesConfigPage page, FormToolkit toolkit) {
-		super(parent, managedForm, page, toolkit, null, null);
-		this.getSection().setText(EditorMessages.AttributeSection_Name);
-		this.getSection().setDescription(
-				EditorMessages.AttributeSection_Description);
-
-	}
-
-	/**
-	 * 
-	 */
-	protected void createContents(Composite container, FormToolkit toolkit) {
-		GridLayout gl = new GridLayout();
-		gl.horizontalSpacing = 0;
-		gl.marginWidth = 0;
-		gl.numColumns = 2;
-		container.setLayout(gl);
-		GridData td = new GridData(GridData.FILL_BOTH);
-		container.setLayoutData(td);
-
-		toolkit.paintBordersFor(container);
-
-		Composite attributeSection = toolkit.createComposite(container);
-		GridLayout gl2 = new GridLayout();
-		gl2.horizontalSpacing = 0;
-		gl2.verticalSpacing = 0;
-		gl2.marginWidth = 0;
-		gl2.marginHeight = 0;
-		gl2.numColumns = 2;
-		attributeSection.setLayout(gl2);
-		GridData gd = new GridData(GridData.FILL_BOTH
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		attributeSection.setLayoutData(gd);
-
-		createTableSection(attributeSection, toolkit);
-		createButtonsSection(attributeSection, toolkit);
-		
-	}
-
-	/**
-	 * create table section
-	 * 
-	 * @param container
-	 * @param toolkit
-	 */
-	private void createTableSection(Composite container, FormToolkit toolkit) {
-		Composite tableContainer = toolkit.createComposite(container);
-		GridData gd = new GridData(GridData.FILL_BOTH
-				| GridData.GRAB_HORIZONTAL);
-		tableContainer.setLayoutData(gd);
-		toolkit.paintBordersFor(tableContainer);
-
-		GridLayout gl = new GridLayout();
-		tableContainer.setLayout(gl);
-
-		Table table = new Table(tableContainer, SWT.H_SCROLL | SWT.V_SCROLL
-				| SWT.FULL_SELECTION | SWT.BORDER);
-		gd = new GridData(GridData.FILL_BOTH);
-		gd.horizontalSpan = 1;
-		gd.heightHint = TABLE_DEFAULT_HEIGHT;
-		table.setLayoutData(gd);
-
-		table.setHeaderVisible(true);
-		table.setLinesVisible(true);
-		TableLayout layout = new TableLayout();
-		table.setLayout(layout);
-
-		TableColumn nameCol = new TableColumn(table, SWT.NONE);
-		layout.addColumnData(new ColumnWeightData(1, true));
-		nameCol
-				.setText(EditorMessages.AttributeSection_Table_NameColumn);
-
-		TableColumn classCol = new TableColumn(table, SWT.NONE);
-		layout.addColumnData(new ColumnWeightData(1, true));
-		classCol
-				.setText(EditorMessages.AttributeSection_Table_ClassColumn);
-
-		TableColumn valueCol = new TableColumn(table, SWT.NONE);
-		layout.addColumnData(new ColumnWeightData(1, true));
-		valueCol
-				.setText(EditorMessages.AttributeSection_Table_DefaultValueColumn);
-
-		TableColumn suggestedValueCol = new TableColumn(table, SWT.NONE);
-		layout.addColumnData(new ColumnWeightData(1, true));
-		suggestedValueCol
-				.setText(EditorMessages.AttributeSection_Table_SuggestedValueColumn);
-
-		table.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				updateButtons();
-			}
-		});
-
-		table.addMouseListener(new MouseAdapter() {
-			public void mouseDoubleClick(MouseEvent e) {
-				if (((IStructuredSelection) tableViewer.getSelection()).size() > 0)
-					editButtonSelected();
-			}
-		});
-
-		tableViewer = new TableViewer(table);
-		tableViewer.setContentProvider(new AdapterFactoryContentProvider(
-				getAdapterFactory()));
-		tableViewer.setLabelProvider(new AdapterFactoryLabelProvider(
-				getAdapterFactory()));
-
-		tableViewer.addFilter(new ViewerFilter() {
-			public boolean select(Viewer viewer, Object parentElement,
-					Object element) {
-				return FacesConfigPackage.eINSTANCE.getAttributeType()
-						.isInstance(element);
-			}
-		});
-		
-		tableViewer.addSelectionChangedListener(this);
-	}
-
-	/**
-	 * Update the buttons' enable and disable status
-	 */
-	private void updateButtons() {
-		if (((IStructuredSelection) tableViewer.getSelection()).size() > 0) {
-			editButton.setEnabled(true);
-			removeButton.setEnabled(true);
-		} else {
-			editButton.setEnabled(false);
-			removeButton.setEnabled(false);
-		}
-	}
-
-	/**
-	 * create buttons
-	 * 
-	 * @param container
-	 * @param toolkit
-	 */
-	private void createButtonsSection(Composite container, FormToolkit toolkit) {
-		// create operation buttons's container
-		Composite operationContainer = toolkit.createComposite(container);
-		GridData gd = new GridData(GridData.FILL_VERTICAL
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		operationContainer.setLayoutData(gd);
-		GridLayout gl = new GridLayout();
-		operationContainer.setLayout(gl);
-
-		Button addButton = toolkit.createButton(operationContainer,
-				EditorMessages.UI_Button_Add_more,
-				SWT.PUSH);
-		gd = new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		gd.grabExcessHorizontalSpace = false;
-		addButton.setLayoutData(gd);
-
-		editButton = toolkit.createButton(operationContainer,
-				EditorMessages.UI_Button_Edit_more,
-				SWT.PUSH);
-		gd = new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		gd.grabExcessHorizontalSpace = false;
-		editButton.setLayoutData(gd);
-
-		removeButton = toolkit.createButton(operationContainer,
-				EditorMessages.UI_Button_Remove,
-				SWT.PUSH);
-		gd = new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		gd.grabExcessHorizontalSpace = false;
-		removeButton.setLayoutData(gd);
-
-		addButton.addSelectionListener(new SelectionAdapter() {
-
-			public void widgetSelected(SelectionEvent e) {
-				addButtonSelected();
-			}
-
-		});
-
-		editButton.addSelectionListener(new SelectionAdapter() {
-
-			public void widgetSelected(SelectionEvent e) {
-				editButtonSelected();
-			}
-
-		});
-		removeButton.addSelectionListener(new SelectionAdapter() {
-
-			public void widgetSelected(SelectionEvent e) {
-				removeButtonSelected();
-			}
-
-		});
-	}
-
-	/**
-	 * 
-	 */
-	public void refreshAll() {
-		tableViewer.setInput(getInput());
-		updateButtons();
-
-	}
-
-	/**
-	 * 
-	 */
-	public void refresh() {
-		super.refresh();
-		tableViewer.refresh();
-		updateButtons();
-	}
-
-	/**
-	 * add an attribute.
-	 * 
-	 */
-	private void addButtonSelected() {
-		Shell shell = EditorPlugin.getActiveShell();
-
-		AddEditAttributeDialog dialog = new AddEditAttributeDialog(shell, true);
-		dialog.setProject((IProject) getPage().getEditor().getAdapter(
-				IProject.class));
-		if (dialog.open() == Dialog.OK) {
-
-			// AttributeType newAttribute = dialog.getResult();
-			AttributeType newAttribute = FacesConfigFactory.eINSTANCE
-					.createAttributeType();
-
-			if (dialog.getAttributeName().length() > 0) {
-				AttributeNameType attributeNameType = FacesConfigFactory.eINSTANCE
-						.createAttributeNameType();
-				attributeNameType.setTextContent(dialog.getAttributeName());
-				newAttribute.setAttributeName(attributeNameType);
-			}
-
-			if (dialog.getAttributeClass().length() > 0) {
-				AttributeClassType attributeClassType = FacesConfigFactory.eINSTANCE
-						.createAttributeClassType();
-				attributeClassType.setTextContent(dialog.getAttributeClass());
-				newAttribute.setAttributeClass(attributeClassType);
-			}
-
-			if (dialog.getDefaultValue().length() > 0) {
-				DefaultValueType defaultValueType = FacesConfigFactory.eINSTANCE
-						.createDefaultValueType();
-				defaultValueType.setTextContent(dialog.getDefaultValue());
-				newAttribute.setDefaultValue(defaultValueType);
-			}
-
-			if (dialog.getSuggestedValue().length() > 0) {
-				SuggestedValueType suggestedValueType = FacesConfigFactory.eINSTANCE
-						.createSuggestedValueType();
-				suggestedValueType.setTextContent(dialog.getSuggestedValue());
-				newAttribute.setSuggestedValue(suggestedValueType);
-			}
-
-			Command addCommand = AddCommand.create(this.getEditingDomain(),
-					getInput(), null, newAttribute); // getEReference(),
-														// newAttribute);
-			if (addCommand.canExecute()) {
-				this.getEditingDomain().getCommandStack().execute(addCommand);
-
-			}
-		}
-
-	}
-
-	/**
-	 * edit an attribute.
-	 * 
-	 */
-	private void editButtonSelected() {
-
-		AttributeType attribute = (AttributeType) ((IStructuredSelection) tableViewer
-				.getSelection()).getFirstElement();
-
-		Assert.isNotNull(attribute);
-
-		Shell shell = EditorPlugin.getActiveShell();
-
-		AddEditAttributeDialog dialog = new AddEditAttributeDialog(shell, false);
-		dialog.setProject((IProject) getPage().getEditor().getAdapter(
-				IProject.class));
-		if (attribute.getAttributeName() != null) {
-			dialog.setAttributeName(attribute.getAttributeName()
-					.getTextContent());
-		}
-
-		if (attribute.getAttributeClass() != null) {
-			dialog.setAttributeClass(attribute.getAttributeClass()
-					.getTextContent());
-		}
-
-		if (attribute.getDefaultValue() != null) {
-			dialog
-					.setDefaultValue(attribute.getDefaultValue()
-							.getTextContent());
-		}
-
-		if (attribute.getSuggestedValue() != null) {
-			dialog.setSuggestedValue(attribute.getSuggestedValue()
-					.getTextContent());
-		}
-
-		if (dialog.open() == Dialog.OK) {
-			List commands = new ArrayList(4);
-
-			if (attribute.getAttributeName() != null) {
-				Command cmd1 = SetCommand.create(this.getEditingDomain(),
-						attribute.getAttributeName(),
-						FacesConfigPackage.eINSTANCE
-								.getAttributeNameType_TextContent(), dialog
-								.getAttributeName());
-				commands.add(cmd1);
-			} else if (dialog.getAttributeName().length() > 0) {
-				AttributeNameType attributeNameType = FacesConfigFactory.eINSTANCE
-						.createAttributeNameType();
-				attributeNameType.setTextContent(dialog.getAttributeName());
-
-				Command cmd2 = AddCommand.create(this.getEditingDomain(),
-						attribute, FacesConfigPackage.eINSTANCE
-								.getAttributeType_AttributeName(),
-						attributeNameType);
-				commands.add(cmd2);
-			}
-
-			if (attribute.getAttributeClass() != null) {
-				Command cmd3 = SetCommand.create(this.getEditingDomain(),
-						attribute.getAttributeClass(),
-						FacesConfigPackage.eINSTANCE
-								.getAttributeClassType_TextContent(), dialog
-								.getAttributeClass());
-				commands.add(cmd3);
-			} else if (dialog.getAttributeClass().length() > 0) {
-				AttributeClassType attributeClassType = FacesConfigFactory.eINSTANCE
-						.createAttributeClassType();
-				attributeClassType.setTextContent(dialog.getAttributeClass());
-
-				Command cmd4 = AddCommand.create(this.getEditingDomain(),
-						attribute, FacesConfigPackage.eINSTANCE
-								.getAttributeType_AttributeClass(),
-						attributeClassType);
-				commands.add(cmd4);
-			}
-
-			if (attribute.getDefaultValue() != null) {
-				Command cmd5 = SetCommand.create(this.getEditingDomain(),
-						attribute.getDefaultValue(),
-						FacesConfigPackage.eINSTANCE
-								.getDefaultValueType_TextContent(), dialog
-								.getDefaultValue());
-				commands.add(cmd5);
-
-			} else if (dialog.getDefaultValue().length() > 0) {
-				DefaultValueType defaultValueType = FacesConfigFactory.eINSTANCE
-						.createDefaultValueType();
-				defaultValueType.setTextContent(dialog.getDefaultValue());
-				Command cmd6 = AddCommand.create(this.getEditingDomain(),
-						attribute, FacesConfigPackage.eINSTANCE
-								.getAttributeType_DefaultValue(),
-						defaultValueType);
-				commands.add(cmd6);
-			}
-
-			if (attribute.getSuggestedValue() != null) {
-				Command cmd7 = SetCommand.create(this.getEditingDomain(),
-						attribute.getSuggestedValue(),
-						FacesConfigPackage.eINSTANCE
-								.getSuggestedValueType_TextContent(), dialog
-								.getSuggestedValue());
-				commands.add(cmd7);
-			} else if (dialog.getSuggestedValue().length() > 0) {
-				SuggestedValueType suggestedValueType = FacesConfigFactory.eINSTANCE
-						.createSuggestedValueType();
-				suggestedValueType.setTextContent(dialog.getSuggestedValue());
-				Command cmd8 = AddCommand.create(this.getEditingDomain(),
-						attribute, FacesConfigPackage.eINSTANCE
-								.getAttributeType_SuggestedValue(),
-						suggestedValueType);
-				commands.add(cmd8);
-			}
-
-			CompoundCommand command = new CompoundCommand(commands);
-			if (command.canExecute()) {
-				this.getEditingDomain().getCommandStack().execute(command);
-				tableViewer.refresh(attribute);
-
-			}
-		}
-
-	}
-
-	/**
-	 * remove an attribute.
-	 * 
-	 */
-	private void removeButtonSelected() {
-		AttributeType attribute = (AttributeType) ((IStructuredSelection) tableViewer
-				.getSelection()).getFirstElement();
-
-		Assert.isNotNull(attribute);
-
-		Command removeCommand = RemoveCommand.create(this.getEditingDomain(),
-				getInput(), null, attribute);// getEReference(), attribute);
-
-		if (removeCommand.canExecute()) {
-			this.getEditingDomain().getCommandStack().execute(removeCommand);
-			refreshAll();
-		}
-
-	}
-
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#getSelection()
-	 */
-	public ISelection getSelection() {
-		return tableViewer.getSelection();
-	}
-
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#setSelection(org.eclipse.jface.viewers.ISelection)
-	 */
-	public void setSelection(ISelection selection) {
-
-		tableViewer.setSelection(selection);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ComponentGeneralSection.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ComponentGeneralSection.java
deleted file mode 100644
index d3c84e9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ComponentGeneralSection.java
+++ /dev/null
@@ -1,406 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.section;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.impl.AdapterImpl;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.emf.edit.command.AddCommand;
-import org.eclipse.emf.edit.command.SetCommand;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.ClassButtonDialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogFieldApplyListener;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.LayoutUtil;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.StringDialogField;
-import org.eclipse.jst.jsf.facesconfig.emf.ComponentClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.ComponentType;
-import org.eclipse.jst.jsf.facesconfig.emf.ComponentTypeType;
-import org.eclipse.jst.jsf.facesconfig.emf.DescriptionType;
-import org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.IFacesConfigConstants;
-import org.eclipse.jst.jsf.facesconfig.ui.page.IFacesConfigPage;
-import org.eclipse.jst.jsf.facesconfig.ui.util.ModelUtil;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * The sections that used for displaying and editing the general information of
- * a component, the information includs display name, description, component
- * type and component class.
- * 
- * @author sfshi
- * 
- */
-public class ComponentGeneralSection extends AbstractFacesConfigSection {
-
-	private StringDialogField displayNameField;
-
-	private StringDialogField descriptionField;
-
-	private StringDialogField componentTypeField;
-
-	private ClassButtonDialogField componentClassField;
-
-	private ComponentGeneralAdapter componentGeneralAdapter;
-
-	/**
-	 * 
-	 * @param parent
-	 * @param managedForm
-	 * @param page
-	 * @param toolkit
-	 */
-	public ComponentGeneralSection(Composite parent, IManagedForm managedForm,
-			IFacesConfigPage page, FormToolkit toolkit) {
-		super(parent, managedForm, page, toolkit, null, null);
-		getSection()
-				.setText(EditorMessages.ComponentGeneralSection_Name);
-		getSection().setDescription(
-				EditorMessages.ComponentGeneralSection_Description);
-	}
-
-	/**
-	 * Create the UI fields.
-	 */
-	protected void createContents(Composite container, FormToolkit toolkit) {
-		int numberOfColumns = 4;
-		GridLayout layout = new GridLayout(numberOfColumns, false);
-		container.setLayout(layout);
-		GridData td = new GridData(GridData.FILL_HORIZONTAL);
-		container.setLayoutData(td);
-
-		toolkit.paintBordersFor(container);
-		displayNameField = new StringDialogField();
-		displayNameField
-				.setLabelText(EditorMessages.ComponentGeneralSection_Label_DisplayName);
-		displayNameField.doFillIntoGrid(toolkit, container, numberOfColumns);
-
-		displayNameField
-				.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
-
-					public void dialogFieldApplied(DialogField field) {
-						String newDisplayNameValue = ((StringDialogField) field)
-								.getText().trim();
-						Command cmd = null;
-						ComponentType component = (ComponentType) getInput();
-						EditingDomain editingDomain = getEditingDomain();
-						if (component.getDisplayName().size() > 0) {
-							DisplayNameType displayName = (DisplayNameType) component
-									.getDisplayName().get(0);
-							cmd = SetCommand.create(editingDomain, displayName,
-									FacesConfigPackage.eINSTANCE
-											.getDisplayNameType_TextContent(),
-									newDisplayNameValue);
-						} else {
-							DisplayNameType displayNameType = FacesConfigFactory.eINSTANCE
-									.createDisplayNameType();
-							displayNameType.setTextContent(newDisplayNameValue);
-
-							/** For the new displayname object, add the adapter. */
-							displayNameType.eAdapters().add(
-									getComponentGeneralAdapter());
-							cmd = AddCommand.create(editingDomain, component,
-									FacesConfigPackage.eINSTANCE
-											.getComponentType_DisplayName(),
-									displayNameType);
-						}
-						if (cmd.canExecute()) {
-							editingDomain.getCommandStack().execute(cmd);
-						}
-					}
-
-				});
-
-		descriptionField = new StringDialogField(2);
-		descriptionField
-				.setLabelText(EditorMessages.ComponentGeneralSection_Label_Description);
-		descriptionField.doFillIntoGrid(toolkit, container, numberOfColumns);
-
-		descriptionField
-				.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
-					public void dialogFieldApplied(DialogField field) {
-						String newDescriptionValue = ((StringDialogField) field)
-								.getText().trim();
-
-						newDescriptionValue = ModelUtil
-								.escapeEntities(newDescriptionValue);
-						Command cmd = null;
-						ComponentType component = (ComponentType) getInput();
-						EditingDomain editingDomain = getEditingDomain();
-						if (component.getDescription().size() > 0) {
-							DescriptionType description = (DescriptionType) component
-									.getDescription().get(0);
-							cmd = SetCommand.create(editingDomain, description,
-									FacesConfigPackage.eINSTANCE
-											.getDescriptionType_TextContent(),
-									newDescriptionValue);
-						} else {
-							DescriptionType description = FacesConfigFactory.eINSTANCE
-									.createDescriptionType();
-							description.setTextContent(newDescriptionValue);
-							/** For the new description object, add the adapter. */
-							description.eAdapters().add(
-									getComponentGeneralAdapter());
-
-							cmd = AddCommand.create(editingDomain, component,
-									FacesConfigPackage.eINSTANCE
-											.getComponentType_Description(),
-									description);
-						}
-						if (cmd.canExecute()) {
-							editingDomain.getCommandStack().execute(cmd);
-						}
-					}
-				});
-
-		componentTypeField = new StringDialogField();
-		componentTypeField
-				.setLabelText(EditorMessages.ComponentGeneralSection_Label_ComponentType);
-		componentTypeField.doFillIntoGrid(toolkit, container, numberOfColumns);
-		componentTypeField
-				.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
-					public void dialogFieldApplied(DialogField field) {
-						ComponentTypeType componentType = FacesConfigFactory.eINSTANCE
-								.createComponentTypeType();
-						componentType
-								.setTextContent(((StringDialogField) field)
-										.getText());
-
-						EditingDomain editingDomain = getEditingDomain();
-						if (editingDomain != null) {
-							Command command = SetCommand.create(editingDomain,
-									getInput(), FacesConfigPackage.eINSTANCE
-											.getComponentType_ComponentType(),
-									componentType);
-							if (command.canExecute()) {
-								editingDomain.getCommandStack()
-										.execute(command);
-							}
-						}
-					}
-				});
-
-		componentClassField = new ClassButtonDialogField(null);
-		componentClassField
-				.setLabelText(EditorMessages.ComponentGeneralSection_Label_ComponentClass);
-		componentClassField.doFillIntoGrid(toolkit, container, numberOfColumns);
-		LayoutUtil.setHorizontalGrabbing(componentClassField.getTextControl(
-				toolkit, container));
-		componentClassField.setProject((IProject) getPage().getEditor()
-				.getAdapter(IProject.class));
-		componentClassField
-				.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
-					public void dialogFieldApplied(DialogField field) {
-
-						ComponentClassType componentClass = FacesConfigFactory.eINSTANCE
-								.createComponentClassType();
-						componentClass
-								.setTextContent(((StringDialogField) field)
-										.getText());
-						EditingDomain editingDomain = getEditingDomain();
-						if (editingDomain != null) {
-							Command command = SetCommand.create(editingDomain,
-									getInput(), FacesConfigPackage.eINSTANCE
-											.getComponentType_ComponentClass(),
-									componentClass);
-							if (command.canExecute()) {
-								editingDomain.getCommandStack()
-										.execute(command);
-							}
-						}
-
-					}
-				});
-		componentClassField
-				.setSuperClassName(IFacesConfigConstants.COMPONENT_SUPER_CLASS);
-	}
-
-	/**
-	 * 
-	 */
-	public void refreshAll() {
-		refresh();
-	}
-
-	/**
-	 * Refresh the content on this section.
-	 */
-	public void refresh() {
-		super.refresh();
-		Object input = this.getInput();
-		if (input instanceof ComponentType) {			
-			final ComponentType component = (ComponentType) input;
-			refreshControls(component);
-		}
-	}
-
-	private void refreshControls(ComponentType component) {
-		if (component.getDisplayName().size() > 0) {
-			DisplayNameType displayName = (DisplayNameType) component
-					.getDisplayName().get(0);
-			displayNameField.setTextWithoutUpdate(displayName
-					.getTextContent());
-		} else {
-			displayNameField.setTextWithoutUpdate(""); //$NON-NLS-1$
-		}
-
-		if (component.getDescription().size() > 0) {
-			DescriptionType description = (DescriptionType) component
-					.getDescription().get(0);
-			String descriptionString = description.getTextContent();
-			descriptionString = ModelUtil.unEscapeEntities(descriptionString);
-			descriptionField.setTextWithoutUpdate(descriptionString);
-		} else {
-			descriptionField.setTextWithoutUpdate(""); //$NON-NLS-1$
-		}
-
-		if (component.getComponentType() != null) {
-			componentTypeField.setTextWithoutUpdate(component
-					.getComponentType().getTextContent());
-		} else {
-			componentTypeField.setTextWithoutUpdate(""); //$NON-NLS-1$
-		}
-
-		if (component.getComponentClass() != null) {
-			componentClassField.setTextWithoutUpdate(component
-					.getComponentClass().getTextContent());
-		} else {
-			componentClassField.setTextWithoutUpdate(""); //$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * Add ComponentGeneralAdapter onto <component> and the first <display-name>
-	 * and <description> elements.
-	 */
-	protected void addAdaptersOntoInput(Object newInput) {
-		ComponentType component = (ComponentType) newInput;
-		if (EcoreUtil.getExistingAdapter(component,
-				ComponentGeneralSection.class) == null) {
-
-			component.eAdapters().add(getComponentGeneralAdapter());
-		}
-
-		if (component.getDisplayName().size() > 0) {
-			DisplayNameType displayName = (DisplayNameType) component
-					.getDisplayName().get(0);
-			if (EcoreUtil.getExistingAdapter(displayName,
-					ComponentGeneralSection.class) == null) {
-
-				displayName.eAdapters().add(getComponentGeneralAdapter());
-			}
-		}
-
-		if (component.getDescription().size() > 0) {
-			DescriptionType description = (DescriptionType) component
-					.getDescription().get(0);
-			if (EcoreUtil.getExistingAdapter(description,
-					ComponentGeneralSection.class) == null) {
-
-				description.eAdapters().add(getComponentGeneralAdapter());
-			}
-		}
-	}
-
-	/**
-	 * Remove ComponentGeneralAdapter from <component> and the first
-	 * <display-name> and <description> elements.
-	 */
-	protected void removeAdaptersFromInput(Object oldInput) {
-		ComponentType component = (ComponentType) oldInput;
-		if (EcoreUtil.getExistingAdapter(component,
-				ComponentGeneralSection.class) != null) {
-			component.eAdapters().remove(getComponentGeneralAdapter());
-		}
-		if (component.getDisplayName().size() > 0) {
-			DisplayNameType displayName = (DisplayNameType) component
-					.getDisplayName().get(0);
-			if (EcoreUtil.getExistingAdapter(displayName,
-					ComponentGeneralSection.class) != null) {
-
-				displayName.eAdapters().remove(getComponentGeneralAdapter());
-			}
-		}
-
-		if (component.getDescription().size() > 0) {
-			DescriptionType description = (DescriptionType) component
-					.getDescription().get(0);
-			if (EcoreUtil.getExistingAdapter(description,
-					ComponentGeneralSection.class) != null) {
-
-				description.eAdapters().remove(getComponentGeneralAdapter());
-			}
-		}
-	}
-
-	/**
-	 * 
-	 * @return
-	 */
-	private Adapter getComponentGeneralAdapter() {
-
-		if (componentGeneralAdapter == null) {
-			componentGeneralAdapter = new ComponentGeneralAdapter();
-		}
-		return componentGeneralAdapter;
-	}
-
-	/**
-	 * The adapter that will be added onto <component> element, to listen the
-	 * events of the children that are displayed in this section, notify the
-	 * section to refresh.
-	 * 
-	 * @author sfshi
-	 * 
-	 */
-	class ComponentGeneralAdapter extends AdapterImpl {
-
-		public boolean isAdapterForType(Object type) {
-			if (type == ComponentGeneralSection.class)
-				return true;
-			return false;
-		}
-
-		public void notifyChanged(Notification msg) {
-
-			if (msg.getEventType() == Notification.ADD
-					|| msg.getEventType() == Notification.REMOVE
-					|| msg.getEventType() == Notification.SET) {
-				if (msg.getFeature() == FacesConfigPackage.eINSTANCE
-						.getComponentType_ComponentClass()
-						|| msg.getFeature() == FacesConfigPackage.eINSTANCE
-								.getComponentType_ComponentType()
-						|| msg.getFeature() == FacesConfigPackage.eINSTANCE
-								.getComponentType_DisplayName()
-						|| msg.getFeature() == FacesConfigPackage.eINSTANCE
-								.getComponentType_Description()) {
-					refresh();
-				} else if (msg.getFeature() == FacesConfigPackage.eINSTANCE
-						.getDisplayNameType_TextContent()
-						|| msg.getFeature() == FacesConfigPackage.eINSTANCE
-								.getDescriptionType_TextContent()) {
-					refresh();
-				}
-			}
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ComponentMasterSection.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ComponentMasterSection.java
deleted file mode 100644
index ca2c0ac..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ComponentMasterSection.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.section;
-
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.edit.command.AddCommand;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.jst.jsf.facesconfig.emf.ComponentType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.page.FacesConfigMasterDetailPage;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * 
- * @author sfshi
- * 
- */
-public class ComponentMasterSection extends FacesConfigMasterSection {
-
-	/**
-	 * 
-	 * @param parent
-	 * @param managedForm
-	 * @param toolkit
-	 * @param page
-	 */
-	public ComponentMasterSection(Composite parent, IManagedForm managedForm,
-			FormToolkit toolkit, FacesConfigMasterDetailPage page) {
-		super(parent, managedForm, toolkit, page, null, null);
-		getSection().setText(EditorMessages.ComponentMasterSection_Name);
-		getSection().setDescription(
-				EditorMessages.ComponentMasterSection_Description);
-	}
-
-	/**
-	 * Config the table viwer, set a filter for it, only the object of
-	 * ComponentType will be selected.
-	 */
-	protected void configViewer(StructuredViewer structuredViewer) {
-		super.configViewer(structuredViewer);
-		structuredViewer.addFilter(new ViewerFilter() {
-			public boolean select(Viewer viewer, Object parentElement,
-					Object element) {
-				return FacesConfigPackage.eINSTANCE.getComponentType()
-						.isInstance(element);
-			}
-		});
-
-	}
-
-	/**
-	 * Create a new component.
-	 */
-	protected void addButtonSelected(SelectionEvent e) {
-		ComponentType component = FacesConfigFactory.eINSTANCE
-				.createComponentType();
-
-		Command command = AddCommand.create(getEditingDomain(),
-				this.getInput(), FacesConfigPackage.eINSTANCE
-						.getFacesConfigType_Component(), component);
-
-		if (command.canExecute()) {
-			getEditingDomain().getCommandStack().execute(command);
-			IStructuredSelection selection = new StructuredSelection(component);
-			getStructuredViewer().refresh();
-			getStructuredViewer().setSelection(selection);
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ConverterGeneralSection.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ConverterGeneralSection.java
deleted file mode 100644
index 0e74050..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ConverterGeneralSection.java
+++ /dev/null
@@ -1,490 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.section;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.command.CompoundCommand;
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.impl.AdapterImpl;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.emf.edit.command.AddCommand;
-import org.eclipse.emf.edit.command.SetCommand;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.ClassButtonDialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogFieldApplyListener;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.LayoutUtil;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.StringDialogField;
-import org.eclipse.jst.jsf.facesconfig.emf.ConverterClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.ConverterForClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.ConverterIdType;
-import org.eclipse.jst.jsf.facesconfig.emf.ConverterType;
-import org.eclipse.jst.jsf.facesconfig.emf.DescriptionType;
-import org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.IFacesConfigConstants;
-import org.eclipse.jst.jsf.facesconfig.ui.page.IFacesConfigPage;
-import org.eclipse.jst.jsf.facesconfig.ui.util.ModelUtil;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * @author Bryan Yang
- * 
- */
-public class ConverterGeneralSection extends AbstractFacesConfigSection {
-
-	private StringDialogField displayNameField;
-
-	private StringDialogField descriptionField;
-
-	private StringDialogField converterIdField;
-
-	private ClassButtonDialogField converterForClassField;
-
-	private ClassButtonDialogField converterClassField;
-
-	private ConverterGeneralAdapter converterGeneralAdapter;
-
-	/**
-	 * 
-	 * @param parent
-	 * @param managedForm
-	 * @param page
-	 * @param toolkit
-	 */
-	public ConverterGeneralSection(Composite parent, IManagedForm managedForm,
-			IFacesConfigPage page, FormToolkit toolkit) {
-		super(parent, managedForm, page, toolkit, null, null);
-		getSection()
-				.setText(EditorMessages.ConverterGeneralSection_Name);
-		getSection().setDescription(
-				EditorMessages.ConverterGeneralSection_Description);
-	}
-
-	/**
-	 * 
-	 */
-	protected void createContents(Composite container, FormToolkit toolkit) {
-		int numberOfColumns = 4;
-		GridLayout layout = new GridLayout(numberOfColumns, false);
-		container.setLayout(layout);
-		GridData td = new GridData(GridData.FILL_HORIZONTAL);
-		container.setLayoutData(td);
-
-		toolkit.paintBordersFor(container);
-		displayNameField = new StringDialogField();
-		displayNameField
-				.setLabelText(EditorMessages.ConverterGeneralSection_Label_DisplayName);
-		displayNameField.doFillIntoGrid(toolkit, container, numberOfColumns);
-
-		displayNameField
-				.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
-
-					public void dialogFieldApplied(DialogField field) {
-						String newDisplayNameValue = ((StringDialogField) field)
-								.getText().trim();
-						Command cmd = null;
-						ConverterType Converter = (ConverterType) getInput();
-						EditingDomain editingDomain = getEditingDomain();
-						if (Converter.getDisplayName().size() > 0) {
-							DisplayNameType displayName = (DisplayNameType) Converter
-									.getDisplayName().get(0);
-							cmd = SetCommand.create(editingDomain, displayName,
-									FacesConfigPackage.eINSTANCE
-											.getDisplayNameType_TextContent(),
-									newDisplayNameValue);
-						} else {
-							DisplayNameType displayNameType = FacesConfigFactory.eINSTANCE
-									.createDisplayNameType();
-							displayNameType.setTextContent(newDisplayNameValue);
-
-							displayNameType.eAdapters().add(
-									getConverterGeneralAdapter());
-							cmd = AddCommand.create(editingDomain, Converter,
-									FacesConfigPackage.eINSTANCE
-											.getConverterType_DisplayName(),
-									displayNameType);
-						}
-						if (cmd.canExecute()) {
-							editingDomain.getCommandStack().execute(cmd);
-						}
-					}
-
-				});
-
-		descriptionField = new StringDialogField(2);
-		descriptionField
-				.setLabelText(EditorMessages.ConverterGeneralSection_Label_Description);
-		descriptionField.doFillIntoGrid(toolkit, container, numberOfColumns);
-
-		descriptionField
-				.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
-					public void dialogFieldApplied(DialogField field) {
-						String newDescriptionValue = ((StringDialogField) field)
-								.getText().trim();
-
-						newDescriptionValue = ModelUtil
-								.escapeEntities(newDescriptionValue);
-						Command cmd = null;
-						ConverterType Converter = (ConverterType) getInput();
-						EditingDomain editingDomain = getEditingDomain();
-						if (Converter.getDescription().size() > 0) {
-							DescriptionType description = (DescriptionType) Converter
-									.getDescription().get(0);
-							cmd = SetCommand.create(editingDomain, description,
-									FacesConfigPackage.eINSTANCE
-											.getDescriptionType_TextContent(),
-									newDescriptionValue);
-						} else {
-							DescriptionType description = FacesConfigFactory.eINSTANCE
-									.createDescriptionType();
-							description.setTextContent(newDescriptionValue);
-
-							description.eAdapters().add(
-									getConverterGeneralAdapter());
-							cmd = AddCommand.create(editingDomain, Converter,
-									FacesConfigPackage.eINSTANCE
-											.getConverterType_Description(),
-									description);
-						}
-						if (cmd.canExecute()) {
-							editingDomain.getCommandStack().execute(cmd);
-						}
-					}
-				});
-
-		converterIdField = new StringDialogField();
-		// converterIdField.setRequired(true);
-		converterIdField
-				.setLabelText(EditorMessages.ConverterGeneralSection_Label_ConverterID);
-		converterIdField.doFillIntoGrid(toolkit, container, numberOfColumns);
-		converterIdField
-				.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
-					public void dialogFieldApplied(DialogField field) {
-						ConverterIdType converterIdType = FacesConfigFactory.eINSTANCE
-								.createConverterIdType();
-
-						converterIdType
-								.setTextContent(((StringDialogField) field)
-										.getText());
-
-						EditingDomain editingDomain = getEditingDomain();
-						List commands = new ArrayList(2);
-						Command cmd1 = SetCommand.create(editingDomain,
-								getInput(), FacesConfigPackage.eINSTANCE
-										.getConverterType_ConverterForClass(),
-								SetCommand.UNSET_VALUE);
-						commands.add(cmd1);
-						Command cmd2 = SetCommand.create(editingDomain,
-								getInput(), FacesConfigPackage.eINSTANCE
-										.getConverterType_ConverterId(),
-								converterIdType);
-						commands.add(cmd2);
-						Command command = new CompoundCommand(commands);
-						if (editingDomain != null) {
-							if (command.canExecute()) {
-								editingDomain.getCommandStack()
-										.execute(command);
-								refresh();
-							}
-						}
-					}
-				});
-
-		converterForClassField = new ClassButtonDialogField(null);
-		// converterForClassField.setRequired(true);
-		converterForClassField
-				.setLabelText(EditorMessages.ConverterGeneralSection_Label_ConverterForClass);
-		converterForClassField.setProject((IProject) getPage().getEditor()
-				.getAdapter(IProject.class));
-		converterForClassField.doFillIntoGrid(toolkit, container,
-				numberOfColumns);
-		LayoutUtil.setHorizontalGrabbing(converterForClassField.getTextControl(
-				toolkit, container));
-
-		converterForClassField
-				.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
-					public void dialogFieldApplied(DialogField field) {
-
-						ConverterForClassType converterForClass = FacesConfigFactory.eINSTANCE
-								.createConverterForClassType();
-						converterForClass
-								.setTextContent(((StringDialogField) field)
-										.getText());
-						EditingDomain editingDomain = getEditingDomain();
-						List commands = new ArrayList(2);
-						Command cmd1 = SetCommand.create(editingDomain,
-								getInput(), FacesConfigPackage.eINSTANCE
-										.getConverterType_ConverterId(),
-								SetCommand.UNSET_VALUE);
-						commands.add(cmd1);
-						Command cmd2 = SetCommand.create(editingDomain,
-								getInput(), FacesConfigPackage.eINSTANCE
-										.getConverterType_ConverterForClass(),
-								converterForClass);
-						commands.add(cmd2);
-						Command command = new CompoundCommand(commands);
-						if (editingDomain != null) {
-							if (command.canExecute()) {
-								editingDomain.getCommandStack()
-										.execute(command);
-								refresh();
-							}
-						}
-
-					}
-				});
-
-		converterClassField = new ClassButtonDialogField(null);
-		// converterClassField.setRequired(true);
-		converterClassField
-				.setLabelText(EditorMessages.ConverterGeneralSection_Label_ConverterClass);
-		converterClassField.setProject((IProject) getPage().getEditor()
-				.getAdapter(IProject.class));
-		converterClassField.doFillIntoGrid(toolkit, container, numberOfColumns);
-		LayoutUtil.setHorizontalGrabbing(converterClassField.getTextControl(
-				toolkit, container));
-
-		converterClassField
-				.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
-					public void dialogFieldApplied(DialogField field) {
-
-						ConverterClassType ConverterClass = FacesConfigFactory.eINSTANCE
-								.createConverterClassType();
-						ConverterClass
-								.setTextContent(((StringDialogField) field)
-										.getText());
-						EditingDomain editingDomain = getEditingDomain();
-						if (editingDomain != null) {
-							Command command = SetCommand.create(editingDomain,
-									getInput(), FacesConfigPackage.eINSTANCE
-											.getConverterType_ConverterClass(),
-									ConverterClass);
-							if (command.canExecute()) {
-								editingDomain.getCommandStack()
-										.execute(command);
-							}
-						}
-
-					}
-				});
-		converterClassField
-				.setInterface(IFacesConfigConstants.CONVERTER_INTERFACE);
-	}
-
-	/**
-	 * 
-	 */
-	public void refreshAll() {
-		refresh();
-	}
-
-	/**
-	 * 
-	 */
-	public void refresh() {
-		super.refresh();
-		Object input = this.getInput();
-		if (input instanceof ConverterType) {
-			final ConverterType converter = (ConverterType) input;
-			refreshControls(converter);
-		}
-	}
-
-	private void refreshControls(ConverterType converter) {
-		if (converter.getDisplayName().size() > 0) {
-			DisplayNameType displayName = (DisplayNameType) converter
-					.getDisplayName().get(0);
-			displayNameField.setTextWithoutUpdate(displayName
-					.getTextContent());
-		} else {
-			displayNameField.setTextWithoutUpdate(""); //$NON-NLS-1$
-		}
-
-		if (converter.getDescription().size() > 0) {
-			DescriptionType description = (DescriptionType) converter
-					.getDescription().get(0);
-			String descriptionString = description.getTextContent();
-			descriptionString = ModelUtil
-					.unEscapeEntities(descriptionString);
-			descriptionField.setTextWithoutUpdate(descriptionString);
-		} else {
-			descriptionField.setTextWithoutUpdate(""); //$NON-NLS-1$
-		}
-
-		if (converter.getConverterId() != null) {
-			converterIdField.setTextWithoutUpdate(converter
-					.getConverterId().getTextContent());
-		} else {
-			converterIdField.setTextWithoutUpdate(""); //$NON-NLS-1$
-		}
-
-		if (converter.getConverterForClass() != null) {
-			converterForClassField.setTextWithoutUpdate(converter
-					.getConverterForClass().getTextContent());
-		} else {
-			converterForClassField.setTextWithoutUpdate(""); //$NON-NLS-1$
-		}
-
-		if (converter.getConverterClass() != null) {
-			converterClassField.setTextWithoutUpdate(converter
-					.getConverterClass().getTextContent());
-		} else {
-			converterClassField.setTextWithoutUpdate(""); //$NON-NLS-1$
-		}
-	}
-	/**
-	 * Add ConverterGeneralAdapter onto <converter> and the first <display-name>
-	 * and <description> elements.
-	 */
-	protected void addAdaptersOntoInput(Object newInput) {
-		ConverterType converter = (ConverterType) newInput;
-		if (EcoreUtil.getExistingAdapter(converter,
-				ConverterGeneralSection.class) == null) {
-
-			converter.eAdapters().add(getConverterGeneralAdapter());
-		}
-
-		if (converter.getDisplayName().size() > 0) {
-			DisplayNameType displayName = (DisplayNameType) converter
-					.getDisplayName().get(0);
-			if (EcoreUtil.getExistingAdapter(displayName,
-					ConverterGeneralSection.class) == null) {
-
-				displayName.eAdapters().add(getConverterGeneralAdapter());
-			}
-		}
-
-		if (converter.getDescription().size() > 0) {
-			DescriptionType description = (DescriptionType) converter
-					.getDescription().get(0);
-			if (EcoreUtil.getExistingAdapter(description,
-					ConverterGeneralSection.class) == null) {
-
-				description.eAdapters().add(getConverterGeneralAdapter());
-			}
-		}
-	}
-
-	/**
-	 * Remove ConverterGeneralAdapter from <converter> and the first
-	 * <display-name> and <description> elements.
-	 */
-	protected void removeAdaptersFromInput(Object oldInput) {
-		ConverterType converter = (ConverterType) oldInput;
-		if (EcoreUtil.getExistingAdapter(converter,
-				ConverterGeneralSection.class) != null) {
-			converter.eAdapters().remove(getConverterGeneralAdapter());
-		}
-		if (converter.getDisplayName().size() > 0) {
-			DisplayNameType displayName = (DisplayNameType) converter
-					.getDisplayName().get(0);
-			if (EcoreUtil.getExistingAdapter(displayName,
-					ConverterGeneralSection.class) != null) {
-
-				displayName.eAdapters().remove(getConverterGeneralAdapter());
-			}
-		}
-
-		if (converter.getDescription().size() > 0) {
-			DescriptionType description = (DescriptionType) converter
-					.getDescription().get(0);
-			if (EcoreUtil.getExistingAdapter(description,
-					ConverterGeneralSection.class) != null) {
-
-				description.eAdapters().remove(getConverterGeneralAdapter());
-			}
-		}
-	}
-
-	/**
-	 * 
-	 * @return
-	 */
-	private Adapter getConverterGeneralAdapter() {
-
-		if (converterGeneralAdapter == null) {
-			converterGeneralAdapter = new ConverterGeneralAdapter();
-		}
-		return converterGeneralAdapter;
-	}
-
-	/**
-	 * The adapter that will be added onto <converter> element, to listen the
-	 * events of the children that are displayed in this section, notify the
-	 * section to refresh.
-	 * 
-	 * @author sfshi
-	 * 
-	 */
-	class ConverterGeneralAdapter extends AdapterImpl {
-
-		public boolean isAdapterForType(Object type) {
-			if (type == ConverterGeneralSection.class)
-				return true;
-			return false;
-		}
-
-		public void notifyChanged(Notification msg) {
-
-			if (msg.getEventType() == Notification.ADD
-					|| msg.getEventType() == Notification.REMOVE
-					|| msg.getEventType() == Notification.SET) {
-				if (msg.getFeature() == FacesConfigPackage.eINSTANCE
-						.getConverterType_ConverterId()
-						|| msg.getFeature() == FacesConfigPackage.eINSTANCE
-								.getConverterType_ConverterClass()
-						|| msg.getFeature() == FacesConfigPackage.eINSTANCE
-								.getConverterType_ConverterForClass()
-						|| msg.getFeature() == FacesConfigPackage.eINSTANCE
-								.getConverterType_Description()
-						|| msg.getFeature() == FacesConfigPackage.eINSTANCE
-								.getConverterType_DisplayName()) {
-					if (Thread.currentThread() == PlatformUI.getWorkbench().getDisplay().getThread()) {
-						refresh();
-					} else {						
-						PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
-							public void run() {
-								refresh();
-							}
-						});
-					}
-				} else if (msg.getFeature() == FacesConfigPackage.eINSTANCE
-						.getDisplayNameType_TextContent()
-						|| msg.getFeature() == FacesConfigPackage.eINSTANCE
-								.getDescriptionType_TextContent()) {
-					if (Thread.currentThread() == PlatformUI.getWorkbench().getDisplay().getThread()) {
-						refresh();
-					} else {						
-						PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
-							public void run() {
-								refresh();
-							}
-						});
-					}
-				}
-			}
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ConverterMasterSection.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ConverterMasterSection.java
deleted file mode 100644
index 4a84924..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ConverterMasterSection.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.section;
-
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.edit.command.AddCommand;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.jst.jsf.facesconfig.emf.ConverterType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.page.FacesConfigMasterDetailPage;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * @author Bryan Yang
- * 
- */
-public class ConverterMasterSection extends FacesConfigMasterSection {
-
-	/**
-	 * 
-	 * @param parent
-	 * @param managedForm
-	 * @param toolkit
-	 * @param page
-	 */
-	public ConverterMasterSection(Composite parent, IManagedForm managedForm,
-			FormToolkit toolkit, FacesConfigMasterDetailPage page) {
-		super(parent, managedForm, toolkit, page, null, null);
-		getSection().setText(EditorMessages.ConverterMasterSection_Name);
-		getSection().setDescription(
-				EditorMessages.ConverterMasterSection_Description);
-	}
-
-	/**
-	 * Config the table viwer, set a filter for it, only the object of
-	 * ConverterType will be selected.
-	 */
-	protected void configViewer(StructuredViewer structuredViewer) {
-		super.configViewer(structuredViewer);
-		structuredViewer.addFilter(new ViewerFilter() {
-			public boolean select(Viewer viewer, Object parentElement,
-					Object element) {
-				return FacesConfigPackage.eINSTANCE.getConverterType()
-						.isInstance(element);
-			}
-		});
-
-	}
-
-	/**
-	 * Create a new Converter.
-	 */
-	protected void addButtonSelected(SelectionEvent e) {
-		ConverterType Converter = FacesConfigFactory.eINSTANCE
-				.createConverterType();
-
-		Command command = AddCommand.create(getEditingDomain(),
-				this.getInput(), FacesConfigPackage.eINSTANCE
-						.getFacesConfigType_Converter(), Converter);
-
-		if (command.canExecute()) {
-			getEditingDomain().getCommandStack().execute(command);
-			IStructuredSelection selection = new StructuredSelection(Converter);
-			getStructuredViewer().refresh();
-			getStructuredViewer().setSelection(selection);
-		}
-	}
-
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/FacesConfigMasterSection.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/FacesConfigMasterSection.java
deleted file mode 100644
index 91b11c7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/FacesConfigMasterSection.java
+++ /dev/null
@@ -1,325 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.section;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.command.CompoundCommand;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.edit.command.RemoveCommand;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.page.FacesConfigMasterDetailPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * An default implementation of AbstractFacesConfigSection for Master Section.
- * 
- * @author sfshi
- * 
- */
-public abstract class FacesConfigMasterSection extends AbstractFacesConfigSection {
-
-	private StructuredViewer structuredViewer;
-
-	private Button removeButton;
-
-	/**
-	 * 
-	 * @param parent
-	 * @param managedForm
-	 * @param toolkit
-	 * @param page
-	 * @param helpContextId
-	 * @param helpTooltip
-	 */
-	public FacesConfigMasterSection(Composite parent, IManagedForm managedForm,
-			FormToolkit toolkit, FacesConfigMasterDetailPage page,
-			String helpContextId, String helpTooltip) {
-		super(parent, managedForm, page, toolkit, helpContextId, helpTooltip);
-	}
-
-	public void dispose() {
-		structuredViewer.removeSelectionChangedListener(this);
-		super.dispose();
-	}
-	
-	/**
-	 * 
-	 */
-	protected void createContents(Composite container, FormToolkit toolkit) {
-		GridLayout layout = new GridLayout();
-		layout.numColumns = 2;
-		layout.marginWidth = layout.marginHeight = 5;
-		container.setLayout(layout);
-		structuredViewer = createViewer(container, toolkit);
-		structuredViewer.addSelectionChangedListener(this);
-		createOperationSection(container, toolkit);
-	}
-
-	/**
-	 * Create the structured viewer, set up content & label provider for it.
-	 * Defaultly create a tableviewer.
-	 * 
-	 * @param parent
-	 * @param toolkit
-	 * @return the structured viewer
-	 */
-	protected StructuredViewer createViewer(Composite parent,
-			FormToolkit toolkit) {
-		Composite tableContainer = toolkit.createComposite(parent);
-		toolkit.paintBordersFor(tableContainer);
-
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		gd.heightHint = 200;
-		tableContainer.setLayoutData(gd);
-		GridLayout layout = new GridLayout();
-		tableContainer.setLayout(layout);
-
-		TableViewer tableViewer = new TableViewer(tableContainer, SWT.SINGLE
-				| SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
-		gd = new GridData(GridData.FILL_BOTH);
-		tableViewer.getControl().setLayoutData(gd);
-
-		tableViewer.setContentProvider(new AdapterFactoryContentProvider(
-				getAdapterFactory()));
-		tableViewer.setLabelProvider(new AdapterFactoryLabelProvider(
-				getAdapterFactory()));
-
-		configViewer(tableViewer);
-
-		return tableViewer;
-	}
-
-	/**
-	 * Config the viewer, such as set a filter and so on. Sub classes should
-	 * override this method to add filter.
-	 * 
-	 * @param viewer
-	 */
-	protected void configViewer(StructuredViewer viewer) {
-        // do nothing; subs may override
-	}
-
-	/**
-	 * Defaultly we create a "New" button and a "Remove" button. Sub classes can
-	 * overwrite this method if need other functions.
-	 * 
-	 * @param parent
-	 * @param toolkit
-	 */
-	protected void createOperationSection(Composite parent, FormToolkit toolkit) {
-		Composite operationContainer = toolkit.createComposite(parent);
-		GridData gd = new GridData(GridData.FILL_VERTICAL);
-		operationContainer.setLayoutData(gd);
-		GridLayout layout = new GridLayout();
-
-		operationContainer.setLayout(layout);
-
-		Button addButton = toolkit.createButton(operationContainer,
-				EditorMessages.UI_Button_Add, SWT.PUSH);
-		gd = new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		gd.grabExcessHorizontalSpace = false;
-		addButton.setLayoutData(gd);
-
-		addButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				addButtonSelected(e);
-			}
-		});
-
-		setRemoveButton(toolkit.createButton(operationContainer,
-				EditorMessages.UI_Button_Remove, SWT.PUSH));
-
-		gd = new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		gd.grabExcessHorizontalSpace = false;
-		getRemoveButton().setLayoutData(gd);
-		getRemoveButton().addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				removeButtonSelected(e);
-			}
-		});
-	}
-    
-    /**
-	 * 
-	 * @param e
-	 */
-    protected abstract void addButtonSelected(SelectionEvent e);
-
-	/**
-	 * 
-	 * @param e
-	 */
-	protected void removeButtonSelected(SelectionEvent e) {
-
-		IStructuredSelection ssel = StructuredSelection.EMPTY;
-		ISelection selection = getSelection();
-		if (selection instanceof IStructuredSelection) {
-			ssel = (IStructuredSelection) selection;
-		}
-
-		if (!ssel.isEmpty()) {
-			List commands = new ArrayList(ssel.size());
-			for (Iterator iter = ssel.iterator(); iter.hasNext();) {
-				EObject element = (EObject) iter.next();
-				Command command = RemoveCommand.create(getEditingDomain(),
-						element);
-				commands.add(command);
-			}
-
-			CompoundCommand command = new CompoundCommand(commands);
-			if (command.canExecute()) {
-				getEditingDomain().getCommandStack().execute(command);
-			}
-		}
-
-	}
-
-	/**
-	 * 
-	 * update the buttons' enable state.
-	 */
-	protected void updateButtons() {
-		IStructuredSelection ssel = (IStructuredSelection) structuredViewer
-				.getSelection();
-
-		getRemoveButton().setEnabled(!ssel.isEmpty());
-	}
-
-	/**
-	 * 
-	 */
-	public ISelection getSelection() {
-		return structuredViewer.getSelection();
-	}
-
-	/**
-	 * 
-	 */
-	public void setSelection(ISelection selection) {
-		structuredViewer.setSelection(selection);
-	}
-
-	/**
-	 * refresh the display of this section.
-	 */
-	public void refresh() {
-		super.refresh();
-		structuredViewer.refresh();
-		updateButtons();
-	}
-
-	/**
-	 * 
-	 */
-	public void refreshAll() {
-		// master section refresh all:
-		setViewerInput(getInput());
-		updateButtons();
-
-		// detial sections refresh:
-		// fire an event to the detail sections, let them
-		// refresh.
-		selectionChanged(null);
-	}
-
-	/**
-	 * set the structuredViewer's input
-	 * 
-	 * @param input
-	 */
-	private void setViewerInput(Object input) {
-		structuredViewer.setInput(input);
-	}
-
-	/**
-	 * 
-	 */
-	protected void expansionStateChanged(boolean expanded) {
-		if (expanded) {
-			if (structuredViewer.getInput() == null) {
-				refreshAll();
-			}
-			structuredViewer.refresh(true);
-			structuredViewer.setSelection(structuredViewer.getSelection());
-		} else {
-			structuredViewer.setSelection(null);
-		}
-		super.expansionStateChanged(expanded);
-	}
-
-	/**
-	 * 
-	 */
-	protected void expansionStateChanging(boolean expanding) {
-		if (!expanding) {
-			GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-			this.getSection().setLayoutData(gd);
-		} else {
-			((FacesConfigMasterDetailPage) getPage()).closeOtherSections(this);
-
-			GridData gd = new GridData(GridData.FILL_BOTH);
-			this.getSection().setLayoutData(gd);
-		}
-
-		super.expansionStateChanging(expanding);
-	}
-
-	/**
-	 * get the viewer.
-	 * 
-	 * @return the viewer
-	 */
-	public StructuredViewer getStructuredViewer() {
-		return structuredViewer;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.section.AbstractFacesConfigSection#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
-	 */
-	public void selectionChanged(SelectionChangedEvent event) {
-		super.selectionChanged(event);
-		updateButtons();
-	}
-
-    private void setRemoveButton(Button removeButton) {
-        this.removeButton = removeButton;
-    }
-
-    /**
-     * @return the remove button
-     */
-    protected Button getRemoveButton() {
-        return removeButton;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/FacetSection.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/FacetSection.java
deleted file mode 100644
index 8ec7fb0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/FacetSection.java
+++ /dev/null
@@ -1,455 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.section;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.command.CompoundCommand;
-import org.eclipse.emf.edit.command.AddCommand;
-import org.eclipse.emf.edit.command.RemoveCommand;
-import org.eclipse.emf.edit.command.SetCommand;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.viewers.ColumnWeightData;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.TableLayout;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.jst.jsf.facesconfig.emf.DescriptionType;
-import org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.FacetNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacetType;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.dialog.AddEditFacetDialog;
-import org.eclipse.jst.jsf.facesconfig.ui.page.IFacesConfigPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.MouseAdapter;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * Section for facets
- *
- */
-public class FacetSection extends AbstractFacesConfigSection {
-
-	private static final int TABLE_DEFAULT_HEIGHT = 160;
-
-	private TableViewer tableViewer;
-
-	private Button removeButton;
-
-	private Button editButton;
-
-	/**
-	 * 
-	 * @param parent
-	 * @param managedForm
-	 * @param page
-	 * @param toolkit
-	 */
-	public FacetSection(Composite parent, IManagedForm managedForm,
-			IFacesConfigPage page, FormToolkit toolkit) {
-		super(parent, managedForm, page, toolkit, null, null);
-		this.getSection().setText(EditorMessages.FacetSection_Name);
-		this.getSection().setDescription(
-				EditorMessages.FacetSection_Description);
-
-	}
-
-	/**
-	 * 
-	 */
-	protected void createContents(Composite container, FormToolkit toolkit) {
-		GridLayout gl = new GridLayout();
-		gl.horizontalSpacing = 0;
-		gl.marginWidth = 0;
-		gl.numColumns = 2;
-		container.setLayout(gl);
-		GridData td = new GridData(GridData.FILL_BOTH);
-		container.setLayoutData(td);
-
-		toolkit.paintBordersFor(container);
-
-		Composite facetSection = toolkit.createComposite(container);
-		GridLayout gl2 = new GridLayout();
-		gl2.horizontalSpacing = 0;
-		gl2.marginWidth = 0;
-		gl2.numColumns = 2;
-		facetSection.setLayout(gl2);
-		GridData gd = new GridData(GridData.FILL_BOTH
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		facetSection.setLayoutData(gd);
-
-		createTableSection(facetSection, toolkit);
-		createButtonsSection(facetSection, toolkit);
-
-	}
-
-	/**
-	 * create facet table section
-	 * 
-	 * @param container
-	 * @param toolkit
-	 */
-	private void createTableSection(Composite container, FormToolkit toolkit) {
-		Composite tableContainer = toolkit.createComposite(container);
-		GridData gd = new GridData(GridData.FILL_BOTH
-				| GridData.GRAB_HORIZONTAL);
-		tableContainer.setLayoutData(gd);
-		toolkit.paintBordersFor(tableContainer);
-
-		GridLayout gl = new GridLayout();
-		tableContainer.setLayout(gl);
-
-		Table table = new Table(tableContainer, SWT.H_SCROLL | SWT.V_SCROLL
-				| SWT.FULL_SELECTION | SWT.BORDER);
-		gd = new GridData(GridData.FILL_BOTH);
-		gd.horizontalSpan = 1;
-		gd.heightHint = TABLE_DEFAULT_HEIGHT;
-		table.setLayoutData(gd);
-
-		table.setHeaderVisible(true);
-		table.setLinesVisible(true);
-		TableLayout layout = new TableLayout();
-		table.setLayout(layout);
-
-		TableColumn facetNameCol = new TableColumn(table, SWT.NONE);
-		layout.addColumnData(new ColumnWeightData(1, true));
-		facetNameCol
-				.setText(EditorMessages.FacetSection_Table_FacetNameColumn);
-		TableColumn displayNameCol = new TableColumn(table, SWT.NONE);
-		layout.addColumnData(new ColumnWeightData(1, true));
-		displayNameCol
-				.setText(EditorMessages.FacetSection_Table_DisplayNameColumn);
-
-		TableColumn descriptionCol = new TableColumn(table, SWT.NONE);
-		layout.addColumnData(new ColumnWeightData(1, true));
-		descriptionCol
-				.setText(EditorMessages.FacetSection_Table_DescriptionColumn);
-
-		table.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				updateButtons();
-			}
-		});
-
-		table.addMouseListener(new MouseAdapter() {
-			public void mouseDoubleClick(MouseEvent e) {
-				if (((IStructuredSelection) tableViewer.getSelection()).size() > 0)
-					editButtonSelected();
-			}
-		});
-
-		tableViewer = new TableViewer(table);
-		tableViewer.setContentProvider(new AdapterFactoryContentProvider(
-				getAdapterFactory()));
-		tableViewer.setLabelProvider(new AdapterFactoryLabelProvider(
-				getAdapterFactory()));
-
-		tableViewer.addFilter(new ViewerFilter() {
-			public boolean select(Viewer viewer, Object parentElement,
-					Object element) {
-				return FacesConfigPackage.eINSTANCE.getFacetType().isInstance(
-						element);
-			}
-		});
-		
-		tableViewer.addSelectionChangedListener(this);
-	}
-
-	/**
-	 * create buttons
-	 * 
-	 * @param container
-	 * @param toolkit
-	 */
-	private void createButtonsSection(Composite container, FormToolkit toolkit) {
-		// create operation buttons's container
-		Composite operationContainer = toolkit.createComposite(container);
-		GridData gd = new GridData(GridData.FILL_VERTICAL
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		operationContainer.setLayoutData(gd);
-		GridLayout gl = new GridLayout();
-		operationContainer.setLayout(gl);
-
-		Button addButton = toolkit.createButton(operationContainer,
-				EditorMessages.UI_Button_Add_more,
-				SWT.PUSH);
-		gd = new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		gd.grabExcessHorizontalSpace = false;
-		addButton.setLayoutData(gd);
-
-		editButton = toolkit.createButton(operationContainer,
-				EditorMessages.UI_Button_Edit_more,
-				SWT.PUSH);
-		gd = new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		gd.grabExcessHorizontalSpace = false;
-		editButton.setLayoutData(gd);
-
-		removeButton = toolkit.createButton(operationContainer,
-				EditorMessages.UI_Button_Remove,
-				SWT.PUSH);
-		gd = new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		gd.grabExcessHorizontalSpace = false;
-		removeButton.setLayoutData(gd);
-
-		addButton.addSelectionListener(new SelectionAdapter() {
-
-			public void widgetSelected(SelectionEvent e) {
-				addButtonSelected();
-			}
-		});
-
-		editButton.addSelectionListener(new SelectionAdapter() {
-
-			public void widgetSelected(SelectionEvent e) {
-				editButtonSelected();
-			}
-		});
-		removeButton.addSelectionListener(new SelectionAdapter() {
-
-			public void widgetSelected(SelectionEvent e) {
-				removeButtonSelected();
-			}
-		});
-	}
-
-	/**
-	 * refresh the table viewer and update buttons.
-	 */
-	public void refresh() {
-		super.refresh();
-		tableViewer.refresh();
-		updateButtons();
-	}
-
-	public void refreshAll() {
-		tableViewer.setInput(getInput());
-		updateButtons();
-	}
-
-	/**
-	 * Update the buttons' enable status.
-	 */
-	private void updateButtons() {
-		if (((IStructuredSelection) tableViewer.getSelection()).size() > 0) {
-			editButton.setEnabled(true);
-			removeButton.setEnabled(true);
-		} else {
-			editButton.setEnabled(false);
-			removeButton.setEnabled(false);
-		}
-	}
-
-	/**
-	 * add a facet.
-	 * 
-	 */
-	private void addButtonSelected() {
-
-		Shell shell = EditorPlugin.getActiveShell();
-
-		AddEditFacetDialog dialog = new AddEditFacetDialog(shell, true);
-		if (dialog.open() == Dialog.OK) {
-
-			String newFacetName = dialog.getFacetName();
-			String newDisplayName = dialog.getDisplayName();
-			String newDescription = dialog.getDescription();
-
-			FacetType newFacet = FacesConfigFactory.eINSTANCE.createFacetType();
-			if (newFacetName.length() > 0) {
-				FacetNameType facetNameType = FacesConfigFactory.eINSTANCE
-						.createFacetNameType();
-				facetNameType.setTextContent(newFacetName);
-				newFacet.setFacetName(facetNameType);
-			}
-
-			if (newDisplayName.length() > 0) {
-				DisplayNameType displayNameType = FacesConfigFactory.eINSTANCE
-						.createDisplayNameType();
-				displayNameType.setTextContent(newDisplayName);
-				newFacet.getDisplayName().add(displayNameType);
-			}
-
-			if (newDescription.length() > 0) {
-				DescriptionType descriptionType = FacesConfigFactory.eINSTANCE
-						.createDescriptionType();
-				descriptionType.setTextContent(newDescription);
-				newFacet.getDescription().add(descriptionType);
-			}
-
-			Command addCommand = AddCommand.create(this.getEditingDomain(),
-					getInput(), FacesConfigPackage.eINSTANCE
-							.getComponentType_Facet(), newFacet);
-			if (addCommand.canExecute()) {
-				this.getEditingDomain().getCommandStack().execute(addCommand);
-
-			}
-		}
-
-	}
-
-	/**
-	 * edit a facet.
-	 * 
-	 */
-	private void editButtonSelected() {
-		FacetType facet = (FacetType) ((IStructuredSelection) tableViewer
-				.getSelection()).getFirstElement();
-
-		Assert.isNotNull(facet);
-
-		Shell shell = EditorPlugin.getActiveShell();
-
-		AddEditFacetDialog dialog = new AddEditFacetDialog(shell, false);
-		if (facet.getFacetName() != null)
-			dialog.setFacetName(facet.getFacetName().getTextContent());
-
-		if (facet.getDisplayName().size() > 0) {
-			dialog.setDisplayName(((DisplayNameType) facet.getDisplayName()
-					.get(0)).getTextContent());
-		}
-
-		if (facet.getDescription().size() > 0) {
-			dialog.setDescription(((DescriptionType) facet.getDescription()
-					.get(0)).getTextContent());
-		}
-
-		if (dialog.open() == Dialog.OK) {
-			List commands = new ArrayList(3);
-
-			String newFacetName = dialog.getFacetName();
-			String newDisplayName = dialog.getDisplayName();
-			String newDescription = dialog.getDescription();
-			if (facet.getFacetName() != null) {
-				Command cmd1 = SetCommand.create(getEditingDomain(), facet
-						.getFacetName(), FacesConfigPackage.eINSTANCE
-						.getFacetNameType_TextContent(), newFacetName);
-				commands.add(cmd1);
-			} else if (newFacetName.length() > 0) {
-				FacetNameType newFacetNameType = FacesConfigFactory.eINSTANCE
-						.createFacetNameType();
-				newFacetNameType.setTextContent(newFacetName);
-				Command cmd2 = AddCommand.create(getEditingDomain(), facet,
-						FacesConfigPackage.eINSTANCE.getFacetType_FacetName(),
-						newFacetNameType);
-				commands.add(cmd2);
-			}
-
-			if (facet.getDisplayName().size() > 0) {
-				DisplayNameType displayNameType = (DisplayNameType) facet
-						.getDisplayName().get(0);
-				Command cmd3 = SetCommand.create(this.getEditingDomain(),
-						displayNameType, FacesConfigPackage.eINSTANCE
-								.getDisplayNameType_TextContent(),
-						newDisplayName);
-				commands.add(cmd3);
-			} else if (newDisplayName.length() > 0) {
-				DisplayNameType newDisplayNameType = FacesConfigFactory.eINSTANCE
-						.createDisplayNameType();
-				newDisplayNameType.setTextContent(newDisplayName);
-				Command cmd4 = AddCommand
-						.create(this.getEditingDomain(), facet,
-								FacesConfigPackage.eINSTANCE
-										.getFacetType_DisplayName(),
-								newDisplayNameType);
-				commands.add(cmd4);
-			}
-
-			if (facet.getDescription().size() > 0) {
-				DescriptionType descriptionType = (DescriptionType) facet
-						.getDescription().get(0);
-				Command cmd5 = SetCommand.create(this.getEditingDomain(),
-						descriptionType, FacesConfigPackage.eINSTANCE
-								.getDescriptionType_TextContent(),
-						newDescription);
-				commands.add(cmd5);
-			} else if (newDescription.length() > 0) {
-				DescriptionType newDescriptionType = FacesConfigFactory.eINSTANCE
-						.createDescriptionType();
-				newDescriptionType.setTextContent(newDescription);
-				Command cmd6 = AddCommand
-						.create(this.getEditingDomain(), facet,
-								FacesConfigPackage.eINSTANCE
-										.getFacetType_Description(),
-								newDescriptionType);
-				commands.add(cmd6);
-			}
-
-			CompoundCommand command = new CompoundCommand(commands);
-			if (command.canExecute()) {
-				getEditingDomain().getCommandStack().execute(command);
-				tableViewer.refresh(facet);
-			}
-		}
-
-	}
-
-	/**
-	 * remove a facet.
-	 * 
-	 */
-	private void removeButtonSelected() {
-		FacetType facet = (FacetType) ((IStructuredSelection) tableViewer
-				.getSelection()).getFirstElement();
-
-		Assert.isNotNull(facet);
-		Command removeCommand = RemoveCommand.create(this.getEditingDomain(),
-				getInput(), FacesConfigPackage.eINSTANCE
-						.getComponentType_Facet(), facet);
-
-		if (removeCommand.canExecute()) {
-			this.getEditingDomain().getCommandStack().execute(removeCommand);
-			refreshAll();
-		}
-
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#getSelection()
-	 */
-	public ISelection getSelection() {
-		return tableViewer.getSelection();
-	}
-
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#setSelection(org.eclipse.jface.viewers.ISelection)
-	 */
-	public void setSelection(ISelection selection) {
-
-		tableViewer.setSelection(selection);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/FactorySection.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/FactorySection.java
deleted file mode 100644
index 2ffe62a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/FactorySection.java
+++ /dev/null
@@ -1,169 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.section;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.command.CompoundCommand;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.command.AddCommand;
-import org.eclipse.jdt.ui.IJavaElementSearchConstants;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FactoryType;
-import org.eclipse.jst.jsf.facesconfig.ui.dialog.DialogUtil;
-import org.eclipse.jst.jsf.facesconfig.ui.page.IFacesConfigPage;
-import org.eclipse.jst.jsf.facesconfig.ui.page.OthersPage;
-import org.eclipse.jst.jsf.facesconfig.ui.util.ModelUtil;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * @author Zhi-peng Zhang, sfshi
- * @version
- */
-public class FactorySection extends OthersPageBaseSection {
-	/** The Eclass object this Section operated */
-	private EClass factoryChildClass;
-
-	/**
-	 * 
-	 * @param factoryChildClass
-	 * @param parent
-	 * @param managedForm
-	 * @param page
-	 * @param toolkit
-	 * @param helpContextId
-	 * @param helpTooltip
-	 */
-	public FactorySection(EClass factoryChildClass, Composite parent,
-			IManagedForm managedForm, IFacesConfigPage page,
-			FormToolkit toolkit, String helpContextId, String helpTooltip) {
-		super(parent, managedForm, page, toolkit, helpContextId, helpTooltip);
-		this.factoryChildClass = factoryChildClass;
-	}
-
-	/**
-	 * 
-	 * @param factoryChildClass
-	 * @param parent
-	 * @param managedForm
-	 * @param page
-	 * @param toolkit
-	 */
-	public FactorySection(EClass factoryChildClass, Composite parent,
-			IManagedForm managedForm, IFacesConfigPage page, FormToolkit toolkit) {
-		this(factoryChildClass, parent, managedForm, page, toolkit, null, null);
-	}
-
-	/**
-	 * @return an new object which is instance of <code>factoryChildClass</code>.
-	 */
-	public EObject createFactoryChildObject() {
-		String superType = ModelUtil.getSuperType(factoryChildClass);
-		IProject project = (IProject) this.getPage().getEditor().getAdapter(
-				IProject.class);
-		String result = DialogUtil.openClassDialog(getSection().getShell(),
-				project, superType,
-				IJavaElementSearchConstants.CONSIDER_ALL_TYPES);
-
-		if (result != null) {
-			EObject component = FacesConfigFactory.eINSTANCE
-					.create(factoryChildClass);
-			// set the text content value.
-			EStructuralFeature feature = factoryChildClass
-					.getEStructuralFeatures().get(0);
-			component.eSet(feature, result);
-			return component;
-		}
-		return null;
-	}
-
-	/**
-	 * Set the <factory> element as the structuredViewer's input.
-	 * 
-	 * @param input
-	 */
-	protected void setViewerInput(Object input) {
-		if (input instanceof FactoryType) {
-			tableViewer.setInput(input);
-		} else
-			tableViewer.setInput(null);
-	}
-
-	/**
-	 * Add a filter on the table viewer. Only the elements that is a instance of
-	 * <code>factoryChildClass</code> could be selected.
-	 */
-	protected void configTableViewer(TableViewer tableViewer1) {
-		tableViewer1.addFilter(new ViewerFilter() {
-			public boolean select(Viewer viewer, Object parentElement,
-					Object element) {
-				return factoryChildClass.isInstance(element);
-			}
-		});
-	}
-
-	/**
-	 * Perform some actions to create new child object and append it to the
-	 * <factory> element.
-	 */
-	void addButtonSelected(SelectionEvent e) {
-		/** Create a new object which is instance of factoryChildClass. */
-		EObject obj = createFactoryChildObject();
-		if (obj != null) {
-			boolean needRefreshAll = false;
-			Command command = null;
-			if (getInput() instanceof FactoryType) {
-				/**
-				 * The input is a <factory> element and not null, append the new
-				 * object to it.
-				 */
-				FactoryType factory = (FactoryType) getInput();
-				command = AddCommand.create(getEditingDomain(), factory, null,
-						obj);
-			} else {
-				/**
-				 * The input is null, create a <factory> element and append it
-				 * to <faces-config>.
-				 */
-				needRefreshAll = true;
-				List list = new ArrayList(2);
-				FactoryType factory = FacesConfigFactory.eINSTANCE
-						.createFactoryType();
-				Command cmd1 = AddCommand.create(getEditingDomain(), factory,
-						null, obj);
-				list.add(cmd1);
-				Command cmd2 = AddCommand.create(getEditingDomain(), this
-						.getPage().getInput(), null, factory);
-				list.add(cmd2);
-				command = new CompoundCommand(list);
-			}
-
-			if (command.canExecute()) {
-				getEditingDomain().getCommandStack().execute(command);
-				if (needRefreshAll)
-					((OthersPage) this.getPage()).resetFactoryInput();
-			}
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/IDialogFieldGroup.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/IDialogFieldGroup.java
deleted file mode 100644
index 5c5b7c5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/IDialogFieldGroup.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.section;
-
-/**
- * This interface is used to build relation between model SSEModel and
- * controller DialogFieldGroup
- * 
- * @author Xiao-guang Zhang
- * @version
- */
-public interface IDialogFieldGroup {
-	/**
-	 * set the input of this section
-	 * 
-	 * @param newInput
-	 */
-	void setInput(Object newInput);
-
-	/**
-	 * @return the input of this section 
-	 */
-	Object getInput();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/IFacesConfigSection.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/IFacesConfigSection.java
deleted file mode 100644
index 4fb65dc..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/IFacesConfigSection.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.section;
-
-
-/**
- * Section interface to build relation between model and adapter
- * 
- * @author sfshi
- * 
- */
-public interface IFacesConfigSection {
-	/**
-	 * set the input of this section
-	 * 
-	 * @param newInput
-	 */
-	void setInput(Object newInput);
-
-	/**
-	 * @return the input of this section
-	 */
-	Object getInput();
-	
-	/**
-	 * initialize current section based on the input
-	 * 
-	 */
-	void initialize();
-
-	/**
-	 * clear all section's contents.
-	 * 
-	 */
-	void clearAll();
-
-	/**
-	 * refresh the needed parts of the section
-	 * 
-	 */
-	void refresh();
-
-	/**
-	 * refresh all parts of the section
-	 * 
-	 */
-	void refreshAll();
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/InitializationSection.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/InitializationSection.java
deleted file mode 100644
index 2029efa..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/InitializationSection.java
+++ /dev/null
@@ -1,363 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.section;
-
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.edit.command.SetCommand;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogFieldApplyListener;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.RadiosDialogField;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.jst.jsf.facesconfig.ui.IFacesConfigConstants;
-import org.eclipse.jst.jsf.facesconfig.ui.page.IFacesConfigPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.part.PageBook;
-
-/**
- * This section handles managed bean's initialization, including general class
- * type, map and list type managed bean.
- * 
- * @author Xiao-guang Zhang, sfshi
- */
-public class InitializationSection extends AbstractFacesConfigSection {
-	private static final String MANAGEDBEAN_GENERAL_CLASS = EditorMessages.InitializationSection_ClassType_General;
-
-	private static final String MANAGEDBEAN_MAP = EditorMessages.InitializationSection_ClassType_Map;
-
-	private static final String MANAGEDBEAN_LIST = EditorMessages.InitializationSection_ClassType_List;
-
-	/** property initiliazation container composite */
-	private Composite propertySection;
-
-	/** property initiliazation DialogFieldGroup */
-	private ManagedPropertyEditGroup managedPropertyGroup;
-
-	/** map entries initiliazation container composite */
-	private Composite mapSection;
-
-	/** map entries initiliazation DialogFieldGroup */
-	private MapEntriesEditGroup mapEntryGroup;
-
-	/** list entries initiliazation container composite */
-	private Composite listSection;
-
-	/** list entries initiliazation DialogFieldGroup */
-	private ListEntriesEditGroup listEntryGroup;
-
-	/** the PageBook control for three kinds of managed bean */
-	private PageBook pageBook;
-
-	/** RadiosDialogField for three kinds of managed bean */
-	private RadiosDialogField beanTypeField;
-
-	/** current pages selection */
-	private int currentPageIndex = 0;
-
-	/**
-	 * @param parent 
-	 * @param managedForm
-	 * @param page 
-	 * @param toolkit
-	 */
-	public InitializationSection(Composite parent, IManagedForm managedForm,
-			IFacesConfigPage page, FormToolkit toolkit) {
-		super(parent, managedForm, page, toolkit, null, null);
-		getSection().setText(EditorMessages.InitializationSection_Name);
-		getSection().setDescription(
-				EditorMessages.InitializationSection_Description);
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.editors.pageflow.managedbean.sections.BaseSectionPart#createClient(org.eclipse.swt.widgets.Composite,
-	 *      org.eclipse.ui.forms.widgets.FormToolkit)
-	 */
-	protected void createContents(Composite container, FormToolkit toolkit) {
-		int numberOfColumns = 3;
-		GridLayout gl = new GridLayout(numberOfColumns, false);
-		gl.horizontalSpacing = 0;
-		gl.marginWidth = 0;
-		container.setLayout(gl);
-		toolkit.paintBordersFor(container);
-
-		createBeanTypeEntry(container, toolkit, numberOfColumns);
-		createInitializationEntry(container, toolkit, numberOfColumns);
-	}
-
-	/**
-	 * create the bean type selection section
-	 * 
-	 * @param container
-	 * @param toolkit
-	 */
-	private void createBeanTypeEntry(Composite container, FormToolkit toolkit,
-			int numberOfColumns) {
-		beanTypeField = new RadiosDialogField();
-		String[] items = { MANAGEDBEAN_GENERAL_CLASS, MANAGEDBEAN_MAP,
-				MANAGEDBEAN_LIST };
-		beanTypeField
-				.setLabelText(EditorMessages.InitializationSection_ClassType);
-		beanTypeField.setItems(items);
-		beanTypeField.doFillIntoGrid(toolkit, container, numberOfColumns);
-		beanTypeField
-				.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
-					public void dialogFieldApplied(DialogField field) {
-						RadiosDialogField beanTypeField1 = (RadiosDialogField) field;
-
-						boolean bChangedSuccess = false;
-						if (beanTypeField1.getSelectedIndex() == 0) {
-							bChangedSuccess = switchPage(
-									IFacesConfigConstants.MANAGED_PROPERTY,
-									false);
-						} else if (beanTypeField1.getSelectedIndex() == 1) {
-							bChangedSuccess = switchPage(
-									IFacesConfigConstants.MAP_ENTRIES, false);
-						} else if (beanTypeField1.getSelectedIndex() == 2) {
-							bChangedSuccess = switchPage(
-									IFacesConfigConstants.LIST_ENTRIES, false);
-						}
-
-						if (bChangedSuccess) {
-							currentPageIndex = beanTypeField1.getSelectedIndex();
-						} else {
-							beanTypeField1.setSelectedIndexWithoutUpdate(-1);
-							beanTypeField1
-									.setSelectedIndexWithoutUpdate(currentPageIndex);
-						}
-					}
-				});
-	}
-
-	/**
-	 * switch to general property, map-entries, or list-entries group If
-	 * bForceClear equals to true, the others page will be cleared without user
-	 * confirmation. if bForceClear equals to false, the confirmation dialog
-	 * will pop up and let user determine whether this page is cleared or not.
-	 * 
-	 * @param pageID -
-	 *            IFacesConfigConstants.MANAGED_PROPERTY,
-	 *            MAP_ENTRIES,LIST_ENTRIES
-	 * @param bForceClearOthers -
-	 *            Force to clear other pages.
-	 */
-	private boolean switchPage(String pageID, boolean bForceClearOthers) {
-		if (pageID == IFacesConfigConstants.MANAGED_PROPERTY) {
-			if (clearPage(IFacesConfigConstants.MAP_ENTRIES, bForceClearOthers)
-					&& clearPage(IFacesConfigConstants.LIST_ENTRIES,
-							bForceClearOthers)) {
-				managedPropertyGroup.refreshAll();
-				pageBook.showPage(propertySection);
-				// FIXME: there should be some other methods to resize the whole
-				// section.
-				InitializationSection.this.getSection().setExpanded(false);
-				InitializationSection.this.getSection().setExpanded(true);
-				return true;
-			}
-		} else if (pageID == IFacesConfigConstants.MAP_ENTRIES) {
-			if (clearPage(IFacesConfigConstants.MANAGED_PROPERTY,
-					bForceClearOthers)
-					&& clearPage(IFacesConfigConstants.LIST_ENTRIES,
-							bForceClearOthers)) {
-				mapEntryGroup.refreshAll();
-				pageBook.showPage(mapSection);
-				// FIXME: there should be some other methods to resize the whole
-				// section.
-				InitializationSection.this.getSection().setExpanded(false);
-				InitializationSection.this.getSection().setExpanded(true);
-				return true;
-			}
-		} else if (pageID == IFacesConfigConstants.LIST_ENTRIES) {
-			if (clearPage(IFacesConfigConstants.MANAGED_PROPERTY,
-					bForceClearOthers)
-					&& clearPage(IFacesConfigConstants.MAP_ENTRIES,
-							bForceClearOthers)) {
-				listEntryGroup.refreshAll();
-				pageBook.showPage(listSection);
-				// FIXME: there should be some other methods to resize the whole
-				// section.
-				InitializationSection.this.getSection().setExpanded(false);
-				InitializationSection.this.getSection().setExpanded(true);
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * clear one specified page according to pageID if bForceClear equals to
-	 * false, the confirmation dialog will pop up and let user determine whether
-	 * this page is cleared or not.
-	 * 
-	 * @param pageID -
-	 *            IFacesConfigConstants.MANAGED_PROPERTY,
-	 *            MAP_ENTRIES,LIST_ENTRIES
-	 * @param bForceClear -
-	 *            force to clear current page.
-	 * @return
-	 */
-	private boolean clearPage(String pageID, boolean bForceClear) {
-		ManagedBeanType managedBean = (ManagedBeanType) getInput();
-
-		if (pageID == IFacesConfigConstants.MANAGED_PROPERTY) {
-			if (managedBean.getManagedProperty().size() == 0) {
-				return true;
-			}
-
-			if (bForceClear
-					|| EditorPlugin
-							.getAlerts()
-							.confirm(
-									"ManagedBeanInitializationSection.Remove.Title", //$NON-NLS-1$
-									"ManagedBeanInitializationSection.RemoveManagedProperty")) { //$NON-NLS-1$
-				Command cmd = SetCommand.create(this.getEditingDomain(),
-						managedBean, FacesConfigPackage.eINSTANCE
-								.getManagedBeanType_ManagedProperty(),
-						SetCommand.UNSET_VALUE);
-				if (cmd.canExecute()) {
-					getEditingDomain().getCommandStack().execute(cmd);
-					return true;
-				}
-
-				return false;
-			}
-		} else if (pageID == IFacesConfigConstants.MAP_ENTRIES) {
-			if (managedBean.getMapEntries() == null) {
-				return true;
-			}
-
-			if (bForceClear
-					|| EditorPlugin
-							.getAlerts()
-							.confirm(
-									"ManagedBeanInitializationSection.Remove.Title", //$NON-NLS-1$
-									"ManagedBeanInitializationSection.RemoveMapEntries")) { //$NON-NLS-1$
-				Command cmd = SetCommand.create(this.getEditingDomain(),
-						managedBean, FacesConfigPackage.eINSTANCE
-								.getManagedBeanType_MapEntries(),
-						SetCommand.UNSET_VALUE);
-				if (cmd.canExecute()) {
-					getEditingDomain().getCommandStack().execute(cmd);
-					return true;
-				}
-			}
-		} else if (pageID == IFacesConfigConstants.LIST_ENTRIES) {
-			if (managedBean.getListEntries() == null) {
-				return true;
-			}
-
-			if (bForceClear
-					|| EditorPlugin
-							.getAlerts()
-							.confirm(
-									"ManagedBeanInitializationSection.Remove.Title", //$NON-NLS-1$
-									"ManagedBeanInitializationSection.RemoveListEntries")) { //$NON-NLS-1$
-				Command cmd = SetCommand.create(this.getEditingDomain(),
-						managedBean, FacesConfigPackage.eINSTANCE
-								.getManagedBeanType_ListEntries(),
-						SetCommand.UNSET_VALUE);
-				if (cmd.canExecute()) {
-					getEditingDomain().getCommandStack().execute(cmd);
-					return true;
-				}
-			}
-		}
-
-		return false;
-	}
-
-	/**
-	 * create property initialization section
-	 * 
-	 * @param container
-	 * @param toolkit
-	 */
-	private void createInitializationEntry(Composite container,
-			FormToolkit toolkit, int numberOfColumns) {
-		pageBook = new PageBook(container, SWT.NONE);
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		gd.horizontalSpan = numberOfColumns;
-		pageBook.setLayoutData(gd);
-		toolkit.paintBordersFor(pageBook);
-
-		managedPropertyGroup = new ManagedPropertyEditGroup(this);
-		managedPropertyGroup.initialize();
-		managedPropertyGroup.addSelectionChangedListener(this);
-		
-		mapEntryGroup = new MapEntriesEditGroup(this);
-		mapEntryGroup.initialize();
-		mapEntryGroup.addSelectionChangedListener(this);
-		
-		listEntryGroup = new ListEntriesEditGroup(this);
-		listEntryGroup.initialize();
-		listEntryGroup.addSelectionChangedListener(this);
-		
-		propertySection = toolkit.createComposite(pageBook);
-		GridLayout gl = new GridLayout();
-		gl.horizontalSpacing = 0;
-		gl.marginWidth = 0;
-		propertySection.setLayout(gl);
-		gd = new GridData(GridData.FILL_BOTH);
-		propertySection.setLayoutData(gd);
-		managedPropertyGroup.layoutDialogFields(toolkit, propertySection);
-		
-		mapSection = toolkit.createComposite(pageBook);
-		mapEntryGroup.layoutDialogFields(toolkit, mapSection);
-		
-		listSection = toolkit.createComposite(pageBook);
-		listEntryGroup.layoutDialogFields(toolkit, listSection);
-		
-		pageBook.showPage(propertySection);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.editors.pageflow.managedbean.sections.ISSESection#setInput(java.lang.Object)
-	 */
-	public void setInput(Object newInput) {
-		super.setInput(newInput);
-		refreshAll();
-	}
-
-	public void refreshAll() {
-		if (getInput() instanceof ManagedBeanType) {
-			ManagedBeanType managedBean = (ManagedBeanType) getInput();
-			managedPropertyGroup.setInput(managedBean);
-			mapEntryGroup.setInput(managedBean);
-			listEntryGroup.setInput(managedBean);
-			if (managedBean.getManagedProperty().size() > 0) {
-				beanTypeField.setSelectedIndexWithoutUpdate(-1);
-				beanTypeField.setSelectedIndex(0);
-			} else if (managedBean.getMapEntries() != null) {
-				beanTypeField.setSelectedIndexWithoutUpdate(-1);
-				beanTypeField.setSelectedIndex(1);
-			} else if (managedBean.getListEntries() != null) {
-				beanTypeField.setSelectedIndexWithoutUpdate(-1);
-				beanTypeField.setSelectedIndex(2);
-			} else {
-				beanTypeField.setSelectedIndexWithoutUpdate(-1);
-				beanTypeField.setSelectedIndex(0);
-			}
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/LifecycleSection.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/LifecycleSection.java
deleted file mode 100644
index 50e529c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/LifecycleSection.java
+++ /dev/null
@@ -1,159 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.section;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.command.AddCommand;
-import org.eclipse.jdt.ui.IJavaElementSearchConstants;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.LifecycleType;
-import org.eclipse.jst.jsf.facesconfig.ui.dialog.DialogUtil;
-import org.eclipse.jst.jsf.facesconfig.ui.page.IFacesConfigPage;
-import org.eclipse.jst.jsf.facesconfig.ui.page.OthersPage;
-import org.eclipse.jst.jsf.facesconfig.ui.util.ModelUtil;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * @author Zhi-peng Zhang
- * @version
- */
-public class LifecycleSection extends OthersPageBaseSection {
-
-	/**
-	 * The Eclass object this Section operated. Since lifecycle only has one
-	 * type child: phase-listener, so this object should always equals
-	 * <code>FacesConfigPackage.eINSTANCE
-	 .getPhaseListenerType()</code>.
-	 */
-	private EClass lifecycleChildClass;
-
-	/**
-	 * 
-	 * @param lifecycleChildClass
-	 * @param parent
-	 * @param managedForm
-	 * @param page
-	 * @param toolkit
-	 * @param helpContextId
-	 * @param helpTooltip
-	 */
-	public LifecycleSection(EClass lifecycleChildClass, Composite parent,
-			IManagedForm managedForm, IFacesConfigPage page,
-			FormToolkit toolkit, String helpContextId, String helpTooltip) {
-		super(parent, managedForm, page, toolkit, helpContextId, helpTooltip);
-		this.lifecycleChildClass = lifecycleChildClass;
-	}
-
-	/**
-	 * 
-	 * @param lifecycleChildClass
-	 * @param parent
-	 * @param managedForm
-	 * @param page
-	 * @param toolkit
-	 */
-	public LifecycleSection(EClass lifecycleChildClass, Composite parent,
-			IManagedForm managedForm, IFacesConfigPage page, FormToolkit toolkit) {
-		this(lifecycleChildClass, parent, managedForm, page, toolkit, null,
-				null);
-	}
-
-	/**
-	 * @return the lifecycle child
-	 */
-	public EObject createLifecycleChildObject() {
-		String superType = ModelUtil.getSuperType(lifecycleChildClass);
-		IProject project = (IProject) this.getPage().getEditor().getAdapter(
-				IProject.class);
-		String result = DialogUtil.openClassDialog(getSection().getShell(),
-				project, superType,
-				IJavaElementSearchConstants.CONSIDER_ALL_TYPES);
-
-		if (result != null) {
-			EObject component = FacesConfigFactory.eINSTANCE
-					.create(lifecycleChildClass);
-			EStructuralFeature feature = lifecycleChildClass
-					.getEStructuralFeatures().get(0);
-			component.eSet(feature, result);
-			return component;
-		}
-		return null;
-	}
-
-	/**
-	 * Set the <lifecycle> element as the structuredViewer's input.
-	 * 
-	 * @param input
-	 */
-	protected void setViewerInput(Object input) {
-		if (input instanceof LifecycleType) {
-			tableViewer.setInput(input);
-		} else
-			tableViewer.setInput(null);
-	}
-
-	/**
-	 * Add a filter on the table viewer. Only the elements that is a instance of
-	 * <code>lifecycleChildClass</code> could be selected.
-	 */
-	protected void configTableViewer(TableViewer tableViewer1) {
-		tableViewer1.addFilter(new ViewerFilter() {
-			public boolean select(Viewer viewer, Object parentElement,
-					Object element) {
-				return lifecycleChildClass.isInstance(element);
-			}
-		});
-	}
-
-	/**
-	 * Perform some actions to create new child object and append it to the
-	 * <lifecycle> element.
-	 */
-	void addButtonSelected(SelectionEvent e) {
-		EObject obj = createLifecycleChildObject();
-		if (obj != null) {
-
-			boolean needRefreshAll = false;
-			Command command = null;
-			if (getInput() instanceof LifecycleType) {
-				LifecycleType lifeCycle = (LifecycleType) getInput();
-				command = AddCommand.create(getEditingDomain(), lifeCycle,
-						null, obj);
-			} else {
-				needRefreshAll = true;
-				LifecycleType lifeCycle = FacesConfigFactory.eINSTANCE
-						.createLifecycleType();
-				lifeCycle.getPhaseListener().add(obj);
-				command = AddCommand.create(getEditingDomain(), this.getPage()
-						.getInput(), null, lifeCycle);
-			}
-
-			if (command.canExecute()) {
-				getEditingDomain().getCommandStack().execute(command);
-				if (needRefreshAll)
-					((OthersPage) this.getPage()).resetLifecycleInput();
-			}
-		}
-
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ListEntriesEditGroup.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ListEntriesEditGroup.java
deleted file mode 100644
index 3a1d0ef..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ListEntriesEditGroup.java
+++ /dev/null
@@ -1,626 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.section;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.command.CompoundCommand;
-import org.eclipse.emf.edit.command.AddCommand;
-import org.eclipse.emf.edit.command.RemoveCommand;
-import org.eclipse.emf.edit.command.SetCommand;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.viewers.ColumnWeightData;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.TableLayout;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.ClassButtonDialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogFieldBase;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogFieldGroup;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogFieldApplyListener;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.LayoutUtil;
-import org.eclipse.jst.jsf.common.ui.internal.guiutils.SWTUtils;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ListEntriesType;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType;
-import org.eclipse.jst.jsf.facesconfig.emf.NullValueType;
-import org.eclipse.jst.jsf.facesconfig.emf.ValueClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.ValueType;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.jst.jsf.facesconfig.ui.dialog.EditValueDialog;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.MouseAdapter;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * ListEntries editing DialogFieldGroup
- * 
- * @author Xiao-guang Zhang, sfshi
- * @version
- */
-public class ListEntriesEditGroup extends DialogFieldGroup implements
-		IDialogFieldGroup, ISelectionProvider, ISelectionChangedListener {
-
-	private ClassButtonDialogField valueClassField;
-
-	private static final int TABLE_DEFAULT_HEIGHT = 160;
-
-	private IProject currentProject;
-
-	private TableViewer tableViewer;
-
-	private Button removeButton;
-
-	private Button editButton;
-
-	private ManagedBeanType managedBean;
-
-	private AbstractFacesConfigSection section;
-
-	private List selectionChangedListeners = new ArrayList();
-
-	/**
-	 * @param section 
-	 */
-	public ListEntriesEditGroup(AbstractFacesConfigSection section) {
-		super();
-		this.section = section;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.common.dialogfield.DialogFieldGroup#initialize()
-	 */
-	public void initialize() {
-	    // TODO: initialize?
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.common.dialogfield.DialogFieldGroup#refreshData()
-	 */
-	public void refreshData() {
-        // TODO: initialize?
-    }
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.common.dialogfield.DialogFieldGroup#layoutDialogFields(org.eclipse.ui.forms.widgets.FormToolkit,
-	 *      org.eclipse.swt.widgets.Composite)
-	 */
-	public void layoutDialogFields(FormToolkit toolkit, Composite parent) {
-		GridData data = new GridData(GridData.FILL_BOTH);
-		parent.setLayoutData(data);
-
-		GridLayout gl = new GridLayout();
-		gl.verticalSpacing = 0;
-		gl.marginHeight = 0;
-		parent.setLayout(gl);
-
-		layoutListTypeSelectionSection(toolkit, parent);
-
-		createAndLayoutListValueSection(toolkit, parent);
-	}
-
-	/**
-	 * 
-	 */
-	private void layoutListTypeSelectionSection(FormToolkit toolkit,
-			Composite container) {
-		Composite typeSelectionSection = null;
-		if (toolkit != null) {
-			typeSelectionSection = toolkit.createComposite(container);
-			toolkit.paintBordersFor(typeSelectionSection);
-		} else {
-			typeSelectionSection = SWTUtils
-					.createComposite(container, SWT.NONE);
-		}
-
-		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-		typeSelectionSection.setLayoutData(gd);
-
-		int numberOfColumns = 4;
-		GridLayout gl = new GridLayout(numberOfColumns, false);
-		typeSelectionSection.setLayout(gl);
-		valueClassField = new ClassButtonDialogField(getProject());
-
-		valueClassField
-				.setLabelText(EditorMessages.InitializationSection_MapType_ValueClass);
-		valueClassField
-				.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
-
-					public void dialogFieldApplied(DialogField field) {
-						ManagedBeanType managedBean_ = (ManagedBeanType) getInput();
-						String className = ((ClassButtonDialogField) field)
-								.getText();
-						ValueClassType valueClass = FacesConfigFactory.eINSTANCE
-								.createValueClassType();
-						valueClass.setTextContent(className);
-						EditingDomain editingDomain = section
-								.getEditingDomain();
-						Command cmd;
-						boolean isNew;
-						if (managedBean_.getListEntries() == null) {
-							isNew = true;
-							ListEntriesType listEntries = FacesConfigFactory.eINSTANCE
-									.createListEntriesType();
-							listEntries.setValueClass(valueClass);
-							cmd = SetCommand.create(editingDomain, managedBean_,
-									FacesConfigPackage.eINSTANCE
-											.getManagedBeanType_ListEntries(),
-									listEntries);
-						} else {
-							isNew = false;
-							ListEntriesType listEntries = managedBean_
-									.getListEntries();
-							cmd = SetCommand.create(editingDomain, listEntries,
-									FacesConfigPackage.eINSTANCE
-											.getListEntriesType_ValueClass(),
-									valueClass);
-						}
-
-						if (cmd.canExecute()) {
-							editingDomain.getCommandStack().execute(cmd);
-							if (isNew)
-								refreshAll();
-						}
-
-					}
-				});
-		valueClassField.doFillIntoGrid(toolkit, typeSelectionSection,
-				numberOfColumns);
-		LayoutUtil.setHorizontalGrabbing(valueClassField.getTextControl(
-				toolkit, container));
-	}
-
-	/**
-	 * @param toolkit
-	 * @param parent
-	 */
-	private void createAndLayoutListValueSection(FormToolkit toolkit,
-			Composite parent) {
-		Composite listValueSection = null;
-		if (toolkit != null) {
-			listValueSection = toolkit.createComposite(parent);
-			toolkit.paintBordersFor(listValueSection);
-		} else {
-			listValueSection = SWTUtils.createComposite(parent, SWT.NONE);
-		}
-
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		listValueSection.setLayoutData(gd);
-
-		int numberOfColumns = 3;
-		GridLayout gl = new GridLayout(numberOfColumns, false);
-		listValueSection.setLayout(gl);
-		DialogFieldBase valuesTitle = new DialogFieldBase();
-		valuesTitle
-				.setLabelText(EditorMessages.InitializationSection_MapTable_Title);    
-		valuesTitle.doFillIntoGrid(toolkit, listValueSection, numberOfColumns);
-
-		// list's value table
-		Table listTable;
-		if (toolkit == null) {
-			listTable = new Table(listValueSection, SWT.H_SCROLL | SWT.V_SCROLL
-					| SWT.FULL_SELECTION | SWT.BORDER);
-		} else {
-			listTable = new Table(listValueSection, SWT.H_SCROLL | SWT.V_SCROLL
-					| SWT.FULL_SELECTION | SWT.BORDER);
-		}
-
-		listTable.addSelectionListener(new SelectionListener() {
-			public void widgetSelected(SelectionEvent e) {
-				updateButtons();
-			}
-
-			public void widgetDefaultSelected(SelectionEvent e) {
-				updateButtons();
-			}
-
-		});
-		gd = new GridData(GridData.FILL_BOTH);
-		gd.horizontalSpan = 1;
-		gd.heightHint = TABLE_DEFAULT_HEIGHT;
-		listTable.setLayoutData(gd);
-		listTable.setHeaderVisible(true);
-		listTable.setLinesVisible(true);
-		TableLayout layout = new TableLayout();
-		layout.addColumnData(new ColumnWeightData(1, true));
-		listTable.setLayout(layout);
-		TableColumn valueCol = new TableColumn(listTable, SWT.NONE);
-		layout.addColumnData(new ColumnWeightData(1, true));
-		valueCol
-				.setText(EditorMessages.InitializationSection_MapTable_Value);
-		valueCol.setResizable(true);
-
-		listTable.addMouseListener(new MouseAdapter() {
-			public void mouseDoubleClick(MouseEvent e) {
-				if (((IStructuredSelection) tableViewer.getSelection()).size() > 0)
-					editButtonSelected();
-			}
-		});
-		tableViewer = new TableViewer(listTable);
-		tableViewer.setContentProvider(new AdapterFactoryContentProvider(
-				section.getAdapterFactory()));
-		tableViewer.setLabelProvider(new AdapterFactoryLabelProvider(section
-				.getAdapterFactory()));
-
-		tableViewer.addFilter(new ViewerFilter() {
-			public boolean select(Viewer viewer, Object parentElement,
-					Object element) {
-				return FacesConfigPackage.eINSTANCE.getValueType().isInstance(
-						element)
-						|| FacesConfigPackage.eINSTANCE.getNullValueType()
-								.isInstance(element);
-			}
-		});
-		tableViewer.addSelectionChangedListener(this);
-
-		Composite operationContainer = null;
-		if (toolkit != null) {
-			operationContainer = toolkit.createComposite(listValueSection);
-		} else {
-			operationContainer = SWTUtils.createComposite(listValueSection,
-					SWT.NONE);
-		}
-		gd = new GridData(GridData.FILL_VERTICAL);
-		operationContainer.setLayoutData(gd);
-		gl = new GridLayout();
-		operationContainer.setLayout(gl);
-
-		Button addButton = null;
-		if (toolkit != null) {
-			addButton = toolkit.createButton(operationContainer,
-					EditorMessages.UI_Button_Add_more,
-					SWT.PUSH);
-		} else {
-			addButton = SWTUtils.createPushButton(operationContainer,
-					EditorMessages.UI_Button_Add_more);
-		}
-		gd = new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		gd.grabExcessHorizontalSpace = false;
-		addButton.setLayoutData(gd);
-
-		editButton = null;
-		if (toolkit != null) {
-			editButton = toolkit.createButton(operationContainer,
-					EditorMessages.UI_Button_Edit_more, SWT.PUSH);
-		} else {
-			editButton = SWTUtils.createPushButton(operationContainer,
-					EditorMessages.UI_Button_Edit_more);
-		}
-
-		gd = new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		gd.grabExcessHorizontalSpace = false;
-		editButton.setLayoutData(gd);
-
-		removeButton = null;
-		if (toolkit != null) {
-			removeButton = toolkit.createButton(operationContainer,
-					EditorMessages.UI_Button_Remove,
-					SWT.PUSH);
-		} else {
-			removeButton = SWTUtils.createPushButton(operationContainer,
-					EditorMessages.UI_Button_Remove);
-		}
-
-		gd = new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		gd.grabExcessHorizontalSpace = false;
-		removeButton.setLayoutData(gd);
-
-		addButton.addSelectionListener(new SelectionAdapter() {
-
-			public void widgetSelected(SelectionEvent e) {
-				addButtonSelected();
-			}
-
-		});
-
-		editButton.addSelectionListener(new SelectionAdapter() {
-
-			public void widgetSelected(SelectionEvent e) {
-				editButtonSelected();
-			}
-		});
-		removeButton.addSelectionListener(new SelectionAdapter() {
-
-			public void widgetSelected(SelectionEvent e) {
-				removeButtonSelected();
-			}
-		});
-	}
-
-	private void addButtonSelected() {
-		EditValueDialog dialog = new EditValueDialog(EditorPlugin
-				.getActiveShell(), true, false, null);
-		if (dialog.open() == Dialog.OK) {
-
-			EditingDomain editingDomain = section.getEditingDomain();
-			if (this.managedBean.getListEntries() == null) {
-				ListEntriesType listEntries = FacesConfigFactory.eINSTANCE
-						.createListEntriesType();
-				if (dialog.isNullValue()) {
-					NullValueType nullValue = FacesConfigFactory.eINSTANCE
-							.createNullValueType();
-					listEntries.getNullValue().add(nullValue);
-				} else {
-					ValueType value = FacesConfigFactory.eINSTANCE
-							.createValueType();
-					value.setTextContent((String) dialog.getResultData());
-					listEntries.getValue().add(value);
-				}
-
-				Command cmd1 = SetCommand.create(editingDomain, managedBean,
-						FacesConfigPackage.eINSTANCE
-								.getManagedBeanType_ListEntries(), listEntries);
-				if (cmd1.canExecute()) {
-					editingDomain.getCommandStack().execute(cmd1);
-					refreshAll();
-				}
-			} else {
-				ListEntriesType listEntries = managedBean.getListEntries();
-				Command cmd;
-				if (dialog.isNullValue()) {
-					NullValueType nullValue = FacesConfigFactory.eINSTANCE
-							.createNullValueType();
-					cmd = AddCommand.create(editingDomain, listEntries,
-							FacesConfigPackage.eINSTANCE
-									.getListEntriesType_NullValue(), nullValue);
-				} else {
-					ValueType value = FacesConfigFactory.eINSTANCE
-							.createValueType();
-					value.setTextContent((String) dialog.getResultData());
-					cmd = AddCommand.create(editingDomain, listEntries,
-							FacesConfigPackage.eINSTANCE
-									.getListEntriesType_Value(), value);
-				}
-				if (cmd.canExecute()) {
-					editingDomain.getCommandStack().execute(cmd);
-				}
-			}
-
-		}
-	}
-
-	private void editButtonSelected() {
-		Object select = ((IStructuredSelection) tableViewer.getSelection())
-				.getFirstElement();
-		boolean isNullValue;
-		String valueText = null;
-		if (select instanceof NullValueType)
-			isNullValue = true;
-		else {
-			isNullValue = false;
-			valueText = ((ValueType) select).getTextContent();
-		}
-		ListEntriesType listEntries = managedBean.getListEntries();
-		EditValueDialog dialog = new EditValueDialog(EditorPlugin
-				.getActiveShell(), true, isNullValue, valueText);
-		if (dialog.open() == Dialog.OK) {
-			EditingDomain editingDomain = section.getEditingDomain();
-			Command cmd = null;
-			if (isNullValue && !dialog.isNullValue()) {
-				List commands = new ArrayList();
-				Command cmd1 = RemoveCommand.create(editingDomain, listEntries,
-						FacesConfigPackage.eINSTANCE
-								.getListEntriesType_NullValue(), select);
-				commands.add(cmd1);
-
-				// listEntries.getNullValue().remove(select);
-				ValueType value = FacesConfigFactory.eINSTANCE
-						.createValueType();
-				value.setTextContent((String) dialog.getResultData());
-				Command cmd2 = AddCommand
-						.create(editingDomain, listEntries,
-								FacesConfigPackage.eINSTANCE
-										.getListEntriesType_Value(), value);
-				commands.add(cmd2);
-				cmd = new CompoundCommand(commands);
-			} else if (!isNullValue && dialog.isNullValue()) {
-				List commands = new ArrayList();
-				Command cmd1 = RemoveCommand
-						.create(editingDomain, listEntries,
-								FacesConfigPackage.eINSTANCE
-										.getListEntriesType_Value(), select);
-				commands.add(cmd1);
-				NullValueType nullValue = FacesConfigFactory.eINSTANCE
-						.createNullValueType();
-				Command cmd2 = AddCommand.create(editingDomain, listEntries,
-						FacesConfigPackage.eINSTANCE
-								.getListEntriesType_NullValue(), nullValue);
-				commands.add(cmd2);
-				cmd = new CompoundCommand(commands);
-			} else if (!isNullValue && !dialog.isNullValue()) {
-				cmd = SetCommand
-						.create(editingDomain, select,
-								FacesConfigPackage.eINSTANCE
-										.getValueType_TextContent(), dialog
-										.getResultData());
-			}
-
-			if (cmd != null && cmd.canExecute()) {
-				editingDomain.getCommandStack().execute(cmd);
-			}
-		}
-	}
-
-	private void removeButtonSelected() {
-		Object select = ((IStructuredSelection) tableViewer.getSelection())
-				.getFirstElement();
-		ListEntriesType listEntries = managedBean.getListEntries();
-		EditingDomain editingDomain = section.getEditingDomain();
-		Command cmd;
-		if (select instanceof NullValueType) {
-			cmd = RemoveCommand
-					.create(editingDomain, listEntries,
-							FacesConfigPackage.eINSTANCE
-									.getListEntriesType_NullValue(), select);
-		} else {
-			cmd = RemoveCommand.create(editingDomain, listEntries,
-					FacesConfigPackage.eINSTANCE.getListEntriesType_Value(),
-					select);
-		}
-		if (cmd.canExecute()) {
-			editingDomain.getCommandStack().execute(cmd);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.editors.pageflow.managedbean.sections.wizards.IDialogFieldGroup#setInput(java.lang.Object)
-	 */
-	public void setInput(Object newInput) {
-		if (newInput != null && newInput instanceof ManagedBeanType) {
-			managedBean = (ManagedBeanType) newInput;
-			if (managedBean.getListEntries() != null)
-				refreshAll();
-		}
-
-	}
-
-	/**
-	 * 
-	 */
-	public void refreshAll() {
-		if (managedBean.getListEntries() != null
-				&& managedBean.getListEntries().getValueClass() != null) {
-			this.valueClassField.setTextWithoutUpdate(managedBean
-					.getListEntries().getValueClass().getTextContent());
-		} else {
-			valueClassField.setTextWithoutUpdate(null);
-		}
-		tableViewer.setInput(((ManagedBeanType) getInput()).getListEntries());
-		updateButtons();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.editors.pageflow.managedbean.sections.wizards.IDialogFieldGroup#getInput()
-	 */
-	public Object getInput() {
-		return managedBean;
-	}
-
-	private IProject getProject() {
-		if (currentProject == null) {
-			currentProject = (IProject) section.getPage().getEditor()
-					.getAdapter(IProject.class);
-		}
-		return currentProject;
-	}
-
-	private void updateButtons() {
-		if (((IStructuredSelection) tableViewer.getSelection()).size() > 0) {
-			editButton.setEnabled(true);
-			removeButton.setEnabled(true);
-		} else {
-			editButton.setEnabled(false);
-			removeButton.setEnabled(false);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.common.dialogfield.DialogFieldGroup#validateDialogFields()
-	 */
-	public IStatus[] validateDialogFields() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#addSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
-	 */
-	public void addSelectionChangedListener(ISelectionChangedListener listener) {
-		selectionChangedListeners.add(listener);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#getSelection()
-	 */
-	public ISelection getSelection() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#removeSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
-	 */
-	public void removeSelectionChangedListener(
-			ISelectionChangedListener listener) {
-		selectionChangedListeners.remove(listener);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#setSelection(org.eclipse.jface.viewers.ISelection)
-	 */
-	public void setSelection(ISelection selection) {
-	    // do nothing
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
-	 */
-	public void selectionChanged(SelectionChangedEvent event) {
-		for (Iterator listeners = selectionChangedListeners.iterator(); listeners
-				.hasNext();) {
-			ISelectionChangedListener listener = (ISelectionChangedListener) listeners
-					.next();
-			listener.selectionChanged(new SelectionChangedEvent(this, event
-					.getSelection()));
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/LocaleConfigSection.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/LocaleConfigSection.java
deleted file mode 100644
index 3ac917a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/LocaleConfigSection.java
+++ /dev/null
@@ -1,421 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.section;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.command.CompoundCommand;
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.impl.AdapterImpl;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.emf.edit.command.AddCommand;
-import org.eclipse.emf.edit.command.RemoveCommand;
-import org.eclipse.emf.edit.command.SetCommand;
-import org.eclipse.jface.viewers.CheckStateChangedEvent;
-import org.eclipse.jface.viewers.CheckboxTableViewer;
-import org.eclipse.jface.viewers.ICheckStateListener;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.jface.viewers.ViewerSorter;
-import org.eclipse.jst.jsf.facesconfig.emf.ApplicationType;
-import org.eclipse.jst.jsf.facesconfig.emf.DefaultLocaleType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.LocaleConfigType;
-import org.eclipse.jst.jsf.facesconfig.emf.SupportedLocaleType;
-import org.eclipse.jst.jsf.facesconfig.ui.dialog.DialogUtil;
-import org.eclipse.jst.jsf.facesconfig.ui.page.IFacesConfigPage;
-import org.eclipse.jst.jsf.facesconfig.ui.page.OthersPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * @author Zhi-peng Zhang, sfshi
- * @version
- */
-public class LocaleConfigSection extends ApplicationSection implements
-		ICheckStateListener {
-	private LocaleConfigAdapter _localeConfigAdapter;
-
-	/**
-	 * 
-	 * @param componentClass
-	 * @param parent
-	 * @param managedForm
-	 * @param page
-	 * @param toolkit
-	 * @param helpContextId
-	 * @param helpTooltip
-	 */
-	public LocaleConfigSection(EClass componentClass, Composite parent,
-			IManagedForm managedForm, IFacesConfigPage page,
-			FormToolkit toolkit, String helpContextId, String helpTooltip) {
-		super(componentClass, parent, managedForm, page, toolkit,
-				helpContextId, helpTooltip);
-	}
-
-	/**
-	 * 
-	 * @param componentClass
-	 * @param parent
-	 * @param managedForm
-	 * @param page
-	 * @param toolkit
-	 */
-	public LocaleConfigSection(EClass componentClass, Composite parent,
-			IManagedForm managedForm, IFacesConfigPage page, FormToolkit toolkit) {
-		this(componentClass, parent, managedForm, page, toolkit, null, null);
-	}
-
-	public void dispose() {
-		((CheckboxTableViewer)tableViewer).removeCheckStateListener(this);
-		super.dispose();		
-	}
-	/**
-	 * create a CheckboxTableViewer for this section.
-	 */
-	protected TableViewer createTableViewer(Composite parent) {
-		CheckboxTableViewer tableViewer1 = CheckboxTableViewer.newCheckList(
-				parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
-		tableViewer1.addCheckStateListener(this);
-		tableViewer1.setSorter(new ViewerSorter());
-		return tableViewer1;
-	}
-
-	/**
-	 * Add a filter for this table viewer, only <supported-locale> and
-	 * <default-locale> elements would be listed.
-	 */
-	protected void configTableViewer(TableViewer tableViewer1) {
-		tableViewer1.addFilter(new ViewerFilter() {
-			public boolean select(Viewer viewer, Object parentElement,
-					Object element) {
-				return FacesConfigPackage.eINSTANCE.getSupportedLocaleType()
-						.isInstance(element)
-						|| FacesConfigPackage.eINSTANCE.getDefaultLocaleType()
-								.isInstance(element);
-			}
-		});
-	}
-
-	/**
-	 * Pop up a dialog for user to select a locale string, then create a
-	 * <supported-locale> element with the string as value.
-	 * 
-	 * @return the supported locale object
-	 */
-	public SupportedLocaleType createSupportedLocaleObject() {
-		ArrayList locales = new ArrayList();
-
-		/**
-		 * Compute the locales that already declared in this <locale-config>
-		 * element. If user select a locale that already declared, then a
-		 * warning message will be shown in the dialog.
-		 */
-
-		if (getInput() instanceof ApplicationType
-				&& ((ApplicationType) getInput()).getLocaleConfig().size() > 0) {
-			LocaleConfigType localeConfigType = (LocaleConfigType) ((ApplicationType) getInput())
-					.getLocaleConfig().get(0);
-			if (localeConfigType.getDefaultLocale() != null) {
-				String locale = localeConfigType.getDefaultLocale()
-						.getTextContent();
-				if (locale != null) {
-					locales.add(locale);
-				}
-			}
-			List list = localeConfigType.getSupportedLocale();
-			for (int i = 0, n = list.size(); i < n; i++) {
-				String locale = ((SupportedLocaleType) list.get(i))
-						.getTextContent();
-				if (locale != null) {
-					locales.add(locale);
-				}
-			}
-		}
-		String result = DialogUtil.openLocaleDialog(getSection().getShell(),
-				locales);
-		if (result != null) {
-			SupportedLocaleType component = FacesConfigFactory.eINSTANCE
-					.createSupportedLocaleType();
-			component.setTextContent(result);
-			return component;
-		}
-		return null;
-	}
-
-	/**
-	 * When user click "Add" button on this section, pop up a dialog to create a
-	 * <supported-locale> element, then add it onto <locale-config> element, if
-	 * the <locale-config> or <application> doesn't exist, create them together.
-	 */
-	void addButtonSelected(SelectionEvent e) {
-		SupportedLocaleType obj = createSupportedLocaleObject();
-		if (obj != null) {
-
-			boolean needRefreshAll = false;
-			Command command = null;
-
-			if (getInput() instanceof ApplicationType) {
-				/** the <application> element exists. */
-				ApplicationType application = (ApplicationType) getInput();
-				if (application.getLocaleConfig().size() > 0) {
-					/** the <locale-config> element exists. */
-					LocaleConfigType localeConfig = (LocaleConfigType) application
-							.getLocaleConfig().get(0);
-					command = AddCommand.create(this.getEditingDomain(),
-							localeConfig, null, obj);
-				} else {
-					/** the <locale-config> element doesn't exist, create it. */
-					LocaleConfigType localeConfig = FacesConfigFactory.eINSTANCE
-							.createLocaleConfigType();
-					localeConfig.getSupportedLocale().add(obj);
-					command = AddCommand.create(getEditingDomain(),
-							application, null, localeConfig);
-				}
-			} else {
-				/**
-				 * the <application> element doesn't exist, then create it,
-				 * after execute, reset the input for all the application
-				 * sections.
-				 */
-				needRefreshAll = true;
-				ApplicationType application = FacesConfigFactory.eINSTANCE
-						.createApplicationType();
-				LocaleConfigType localeConfig = FacesConfigFactory.eINSTANCE
-						.createLocaleConfigType();
-				localeConfig.getSupportedLocale().add(obj);
-				application.getLocaleConfig().add(localeConfig);
-				command = AddCommand.create(getEditingDomain(), this.getPage()
-						.getInput(), null, application);
-			}
-
-			if (command.canExecute()) {
-				getEditingDomain().getCommandStack().execute(command);
-				if (needRefreshAll)
-					/** reset input for all the application sections. */
-					((OthersPage) this.getPage()).resetApplicationInput();
-			}
-		}
-
-	}
-
-	/**
-	 * when user click on the CheckboxTableViewer, perform some actions to
-	 * set/unset <default-locale> and <supported-locale> elements.
-	 * 
-	 * If an item is selected, that means it's a <default-locale>, otherwise
-	 * it's a <supported-locale>.
-	 * 
-	 * @see org.eclipse.jface.viewers.ICheckStateListener#checkStateChanged(org.eclipse.jface.viewers.CheckStateChangedEvent)
-	 */
-	public void checkStateChanged(CheckStateChangedEvent event) {
-		boolean checked = event.getChecked();
-
-		if (event.getElement() == null) {
-			return;
-		}
-
-		EObject node = (EObject) event.getElement();
-		LocaleConfigType localeConfigType = (LocaleConfigType) ((ApplicationType) getInput())
-				.getLocaleConfig().get(0);
-		CompoundCommand compoundCommand = new CompoundCommand();
-
-		if (checked) {
-			/** user checked one item, going to set it as <default-locale>. */
-			if (localeConfigType.getDefaultLocale() != null) {
-				/**
-				 * Change the <default-locale> value to <supported-locale>.
-				 */
-				Command command = RemoveCommand.create(getEditingDomain(),
-						localeConfigType, null, localeConfigType
-								.getDefaultLocale());
-
-				compoundCommand.append(command);
-
-				SupportedLocaleType supportedLocale = FacesConfigFactory.eINSTANCE
-						.createSupportedLocaleType();
-				supportedLocale.setTextContent(localeConfigType
-						.getDefaultLocale().getTextContent());
-				command = AddCommand.create(getEditingDomain(),
-						localeConfigType, FacesConfigPackage.eINSTANCE
-								.getLocaleConfigType_SupportedLocale(),
-						supportedLocale);
-				compoundCommand.append(command);
-			}
-
-			/**
-			 * Change the selected item from <supported-locale> to
-			 * <default-locale>
-			 */
-			SupportedLocaleType supportedLocale = (SupportedLocaleType) node;
-			Command command = RemoveCommand.create(getEditingDomain(),
-					localeConfigType, FacesConfigPackage.eINSTANCE
-							.getLocaleConfigType_SupportedLocale(),
-					supportedLocale);
-			compoundCommand.append(command);
-
-			DefaultLocaleType defaultLocale = FacesConfigFactory.eINSTANCE
-					.createDefaultLocaleType();
-			defaultLocale.setTextContent(supportedLocale.getTextContent());
-			command = SetCommand
-					.create(getEditingDomain(), localeConfigType,
-							FacesConfigPackage.eINSTANCE
-									.getLocaleConfigType_DefaultLocale(),
-							defaultLocale);
-			compoundCommand.append(command);
-
-		} else {
-			/**
-			 * User unchecked one item, going to change it from <default-locale>
-			 * to <supported-locale>.
-			 */
-			DefaultLocaleType defaultLocale = (DefaultLocaleType) node;
-			Command command = RemoveCommand.create(getEditingDomain(),
-					localeConfigType, null, defaultLocale);
-			compoundCommand.append(command);
-
-			SupportedLocaleType supportedLocale = FacesConfigFactory.eINSTANCE
-					.createSupportedLocaleType();
-			supportedLocale.setTextContent(defaultLocale.getTextContent());
-			command = AddCommand.create(getEditingDomain(), localeConfigType,
-					null, supportedLocale);
-			compoundCommand.append(command);
-		}
-
-		if (compoundCommand.canExecute()) {
-			getEditingDomain().getCommandStack().execute(compoundCommand);
-			this.refresh();
-			setTableViewerCheckedState();
-		}
-	}
-
-	/**
-	 * Set the checked state for items in the checkbox table viewer. This method
-	 * could be used for refresh the checked state of the table viewer.
-	 */
-	private void setTableViewerCheckedState() {
-		if (getInput() instanceof ApplicationType) {
-			ApplicationType application = (ApplicationType) getInput();
-			if (application.getLocaleConfig().size() > 0) {
-
-				LocaleConfigType localeConfigType = (LocaleConfigType) application
-						.getLocaleConfig().get(0);
-				if (localeConfigType.getDefaultLocale() != null) {
-					((CheckboxTableViewer) getTableViewer()).setChecked(
-							localeConfigType.getDefaultLocale(), true);
-				}
-			}
-		}
-	}
-
-	@Override
-	protected void addAdaptersOntoInput(Object input) {
-		super.addAdaptersOntoInput(input);
-		if (input != null && input instanceof ApplicationType) {
-			ApplicationType application = (ApplicationType) input;
-			if (EcoreUtil.getExistingAdapter(application,
-					LocaleConfigSection.class) == null) {
-				application.eAdapters().add(getLocaleConfigAdapter());
-			}
-		}
-	}
-
-	private Adapter getLocaleConfigAdapter() {
-		if (_localeConfigAdapter == null) {
-			_localeConfigAdapter = new LocaleConfigAdapter();
-		}
-		return _localeConfigAdapter;
-	}
-
-	@Override
-	protected void removeAdaptersFromInput(Object input) {
-		if (input != null && input instanceof ApplicationType && _localeConfigAdapter != null) {
-			ApplicationType application = (ApplicationType) input;			
-			application.eAdapters().remove(_localeConfigAdapter);			
-		}
-		super.removeAdaptersFromInput(input);
-	}
-
-	/**
-	 * set the structuredViewer's input. Set the first LocaleConfig as input.
-	 * 
-	 * @param input
-	 */
-	protected void setViewerInput(Object input) {
-		if (input instanceof ApplicationType) {
-			ApplicationType application = (ApplicationType) input;
-			if (application.getLocaleConfig().size() > 0) {
-				tableViewer.setInput(application.getLocaleConfig().get(0));
-			} else
-				tableViewer.setInput(null);
-		} else
-			tableViewer.setInput(null);
-
-	}
-
-	public void refreshAll() {
-		super.refreshAll();
-		setTableViewerCheckedState();
-	}
-
-	/**
-	 * A listener that is be adapted on the input <application> element, to
-	 * listen the event that the first <locale-config> being created and
-	 * removed, then reset the input of the tabel viewer.
-	 * 
-	 * @author sfshi
-	 * 
-	 */
-	class LocaleConfigAdapter extends AdapterImpl {
-		public boolean isAdapterForType(Object type) {
-			if (type == LocaleConfigSection.class)
-				return true;
-			return false;
-		}
-
-		public void notifyChanged(Notification msg) {
-			if (msg.getEventType() == Notification.ADD
-					|| msg.getEventType() == Notification.REMOVE) {
-				if (msg.getFeature() == FacesConfigPackage.eINSTANCE
-						.getApplicationType_LocaleConfig()) {
-					/**
-					 * a <locale-config> was created or removed, notify this
-					 * section to reset it's input.
-					 */
-					
-					if (Thread.currentThread() == PlatformUI.getWorkbench().getDisplay().getThread()) {
-						setInput(getInput());
-					} else {							
-						PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
-							public void run() {
-								setInput(getInput());
-							}
-						});
-					}
-
-				}
-			}
-		}
-
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ManagedBeanGeneralSection.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ManagedBeanGeneralSection.java
deleted file mode 100644
index 6df0d53..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ManagedBeanGeneralSection.java
+++ /dev/null
@@ -1,330 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.section;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.impl.AdapterImpl;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.emf.edit.command.SetCommand;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.ClassButtonDialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.ComboDialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogFieldApplyListener;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogFieldChangeListener;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.LayoutUtil;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.StringDialogField;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanScopeType;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.IFacesConfigConstants;
-import org.eclipse.jst.jsf.facesconfig.ui.page.IFacesConfigPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * 
- * @author sfshi
- * 
- */
-public class ManagedBeanGeneralSection extends AbstractFacesConfigSection {
-
-	private StringDialogField mbNameField;
-
-	private ClassButtonDialogField mbClassField;
-
-	private ComboDialogField mbScopeField;
-
-	private ManagedBeanGeneralSectionAdapter managedBeanGeneralSectionAdapter;
-
-	/**
-	 * 
-	 * @param parent
-	 * @param managedForm
-	 * @param page
-	 * @param toolkit
-	 */
-	public ManagedBeanGeneralSection(Composite parent,
-			IManagedForm managedForm, IFacesConfigPage page, FormToolkit toolkit) {
-		super(parent, managedForm, page, toolkit, null, null);
-		getSection().setText(
-				EditorMessages.ManagedBeanGeneralSection_Name);
-		getSection().setDescription(
-				EditorMessages.ManagedBeanGeneralSection_Desc);
-	}
-
-	protected void createContents(Composite container, FormToolkit toolkit) {
-		int numberOfColumns = 4;
-		GridLayout layout = new GridLayout(numberOfColumns, false);
-		container.setLayout(layout);
-
-		toolkit.paintBordersFor(container);
-
-		createMBNameEntry(container, toolkit, numberOfColumns);
-
-		createMBClassEntry(container, toolkit, numberOfColumns);
-
-		createMBScopeEntry(container, toolkit, numberOfColumns);
-
-	}
-
-	/**
-	 * create managed bean's name editing field
-	 * 
-	 * @param container
-	 * @param toolkit
-	 */
-	private void createMBNameEntry(Composite container, FormToolkit toolkit,
-			int numberOfColumns) {
-		mbNameField = new StringDialogField();
-		mbNameField
-				.setLabelText(EditorMessages.ManagedBeanGeneralSection_ManagedBeanName);
-		mbNameField.doFillIntoGrid(toolkit, container, numberOfColumns);
-		LayoutUtil.setHorizontalGrabbing(mbNameField.getTextControl(toolkit,
-				container));
-		mbNameField
-				.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
-					public void dialogFieldApplied(DialogField field) {
-						String mbNameValue = ((StringDialogField) field)
-								.getText();
-						Command cmd = null;
-						ManagedBeanType managedBean = (ManagedBeanType) getInput();
-						// if (managedBean.getManagedBeanName() != null) {
-						// cmd = SetCommand
-						// .create(
-						// getEditingDomain(),
-						// managedBean.getManagedBeanName(),
-						// FacesConfigPackage.eINSTANCE
-						// .getManagedBeanNameType_TextContent(),
-						// mbNameValue);
-						// } else {
-						ManagedBeanNameType newManagedBeanName = FacesConfigFactory.eINSTANCE
-								.createManagedBeanNameType();
-						newManagedBeanName.setTextContent(mbNameValue);
-						cmd = SetCommand.create(getEditingDomain(),
-								managedBean, FacesConfigPackage.eINSTANCE
-										.getManagedBeanType_ManagedBeanName(),
-								newManagedBeanName);
-						// }
-						if (cmd.canExecute()) {
-							getEditingDomain().getCommandStack().execute(cmd);
-						}
-					}
-				});
-	}
-
-	/**
-	 * create managed bean's class field.
-	 * 
-	 * @param container
-	 * @param toolkit
-	 */
-	private void createMBClassEntry(final Composite container,
-			final FormToolkit toolkit, int numberOfColumns) {
-		mbClassField = new ClassButtonDialogField(null);
-		mbClassField
-				.setLabelText(EditorMessages.ManagedBeanGeneralSection_ManagedBeanClass);
-		mbClassField.setProject((IProject) getPage().getEditor().getAdapter(
-				IProject.class));
-		mbClassField.doFillIntoGrid(toolkit, container, numberOfColumns);
-		LayoutUtil.setHorizontalGrabbing(mbClassField.getTextControl(toolkit,
-				container));
-
-		mbClassField
-				.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
-					public void dialogFieldApplied(DialogField field) {
-						String newValue = ((StringDialogField) field).getText();
-						Command cmd = null;
-						ManagedBeanType managedBean = (ManagedBeanType) getInput();
-						// if (managedBean.getManagedBeanClass() != null) {
-						// cmd = SetCommand
-						// .create(
-						// getEditingDomain(),
-						// managedBean.getManagedBeanClass(),
-						// FacesConfigPackage.eINSTANCE
-						// .getManagedBeanClassType_TextContent(),
-						// newValue);
-						// } else {
-						ManagedBeanClassType newManagedBeanClass = FacesConfigFactory.eINSTANCE
-								.createManagedBeanClassType();
-						newManagedBeanClass.setTextContent(newValue);
-						cmd = SetCommand.create(getEditingDomain(),
-								managedBean, FacesConfigPackage.eINSTANCE
-										.getManagedBeanType_ManagedBeanClass(),
-								newManagedBeanClass);
-						// }
-						if (cmd.canExecute()) {
-							getEditingDomain().getCommandStack().execute(cmd);
-						}
-					}
-				});
-	}
-
-	/**
-	 * create managed bean's scope field
-	 * 
-	 * @param container
-	 * @param toolkit
-	 */
-	private void createMBScopeEntry(Composite container, FormToolkit toolkit,
-			int numberOfColumns) {
-		mbScopeField = new ComboDialogField(SWT.DROP_DOWN | SWT.READ_ONLY | SWT.BORDER);
-		mbScopeField
-				.setLabelText(EditorMessages.ManagedBeanGeneralSection_ManagedBeanScope);
-		mbScopeField.doFillIntoGrid(toolkit, container, numberOfColumns);
-		LayoutUtil.setHorizontalGrabbing(mbScopeField.getComboControl(toolkit,
-				container));
-
-		mbScopeField.setItems(ManagedBeanScopeTreeItem.scopeItems);
-
-		mbScopeField
-				.setDialogFieldChangeListener(new IDialogFieldChangeListener() {
-					public void dialogFieldChanged(DialogField field) {
-						String newValue = ((ComboDialogField) field).getText();
-						Command cmd = null;
-						ManagedBeanType managedBean = (ManagedBeanType) getInput();
-						// if (managedBean.getManagedBeanScope() != null) {
-						// cmd = SetCommand
-						// .create(
-						// getEditingDomain(),
-						// managedBean.getManagedBeanScope(),
-						// FacesConfigPackage.eINSTANCE
-						// .getManagedBeanScopeType_TextContent(),
-						// newValue);
-						// } else {
-						ManagedBeanScopeType newManagedBeanScope = FacesConfigFactory.eINSTANCE
-								.createManagedBeanScopeType();
-						newManagedBeanScope.setTextContent(newValue);
-						cmd = SetCommand.create(getEditingDomain(),
-								managedBean, FacesConfigPackage.eINSTANCE
-										.getManagedBeanType_ManagedBeanScope(),
-								newManagedBeanScope);
-						// }
-						if (cmd.canExecute()) {
-							getEditingDomain().getCommandStack().execute(cmd);
-						}
-					}
-				});
-	}
-
-	public void refreshAll() {
-		refresh();
-	}
-
-	/**
-	 * 
-	 */
-	public void refresh() {
-		super.refresh();
-		Object input = this.getInput();
-		if (input instanceof ManagedBeanType) {
-			final ManagedBeanType component = (ManagedBeanType) input;
-			refreshControls(component);
-		}
-	}
-
-	private void refreshControls(ManagedBeanType component) {
-		if (component.getManagedBeanName() != null) {
-			mbNameField.setTextWithoutUpdate(component.getManagedBeanName()
-					.getTextContent());
-		} else {
-			mbNameField.setTextWithoutUpdate(""); //$NON-NLS-1$
-		}
-
-		if (component.getManagedBeanClass() != null) {
-			mbClassField.setTextWithoutUpdate(component
-					.getManagedBeanClass().getTextContent());
-		} else {
-			mbClassField.setTextWithoutUpdate(""); //$NON-NLS-1$
-		}
-
-		if (component.getManagedBeanScope() != null) {
-			mbScopeField.setTextWithoutUpdate(component
-					.getManagedBeanScope().getTextContent());
-		} else {
-			// defaultly set it's scope to "session";
-			mbScopeField
-					.setTextWithoutUpdate(IFacesConfigConstants.MANAGED_BEAN_SCOPE_SESSION);
-		}
-	
-	}
-	protected void addAdaptersOntoInput(Object newInput) {
-		super.addAdaptersOntoInput(newInput);
-		ManagedBeanType managedBean = (ManagedBeanType) newInput;
-		if (EcoreUtil.getExistingAdapter(managedBean,
-				ManagedBeanGeneralSection.class) == null) {
-			managedBean.eAdapters().add(getManagedBeanGeneralSectionAdatper());
-		}
-
-	}
-
-	protected void removeAdaptersFromInput(Object oldInput) {
-		super.removeAdaptersFromInput(oldInput);
-		ManagedBeanType managedBean = (ManagedBeanType) oldInput;
-		if (EcoreUtil.getExistingAdapter(managedBean,
-				ManagedBeanGeneralSection.class) != null) {
-			managedBean.eAdapters().remove(
-					getManagedBeanGeneralSectionAdatper());
-		}
-	}
-
-	private ManagedBeanGeneralSectionAdapter getManagedBeanGeneralSectionAdatper() {
-		if (managedBeanGeneralSectionAdapter == null) {
-			managedBeanGeneralSectionAdapter = new ManagedBeanGeneralSectionAdapter();
-		}
-		return managedBeanGeneralSectionAdapter;
-	}
-
-	class ManagedBeanGeneralSectionAdapter extends AdapterImpl {
-
-		public boolean isAdapterForType(Object type) {
-
-			if (type == ManagedBeanGeneralSection.class)
-				return true;
-			return false;
-		}
-
-		public void notifyChanged(Notification msg) {
-			if (msg.getEventType() == Notification.ADD
-					|| msg.getEventType() == Notification.REMOVE
-					|| msg.getEventType() == Notification.SET) {
-				if (msg.getFeature() == FacesConfigPackage.eINSTANCE
-						.getManagedBeanType_ManagedBeanName()
-						|| msg.getFeature() == FacesConfigPackage.eINSTANCE
-								.getManagedBeanType_ManagedBeanClass()
-						|| msg.getFeature() == FacesConfigPackage.eINSTANCE
-								.getManagedBeanType_ManagedBeanScope()) {
-					if (Thread.currentThread() == PlatformUI.getWorkbench().getDisplay().getThread()) {
-						refresh();
-					} else {
-						PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
-							public void run() {
-								refresh();
-							}
-						});
-					}
-				}
-			}
-		}
-
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ManagedBeanMasterSection.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ManagedBeanMasterSection.java
deleted file mode 100644
index 5d67eb7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ManagedBeanMasterSection.java
+++ /dev/null
@@ -1,375 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.section;
-
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.impl.AdapterImpl;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.emf.edit.command.AddCommand;
-import org.eclipse.emf.edit.command.RemoveCommand;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.window.Window;
-import org.eclipse.jface.wizard.WizardDialog;
-import org.eclipse.jst.jsf.facesconfig.emf.DescriptionType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanScopeType;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.jst.jsf.facesconfig.ui.page.FacesConfigMasterDetailPage;
-import org.eclipse.jst.jsf.facesconfig.ui.provider.ManagedBeanContentProvider;
-import org.eclipse.jst.jsf.facesconfig.ui.provider.ManagedBeanLabelProvider;
-import org.eclipse.jst.jsf.facesconfig.ui.wizard.NewManagedBeanWizard;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * @author sfshi
- */
-public class ManagedBeanMasterSection extends FacesConfigMasterSection {
-
-	private ManagedBeanMasterSectionAdapter managedBeanMasterSectionAdapter;
-
-	/**
-	 * @param parent
-	 * @param managedForm
-	 * @param toolkit
-	 * @param page
-	 */
-	public ManagedBeanMasterSection(Composite parent, IManagedForm managedForm,
-			FormToolkit toolkit, FacesConfigMasterDetailPage page) {
-		super(parent, managedForm, toolkit, page, null, null);
-		getSection().setText(EditorMessages.ManagedBeanMasterSection_Name);
-		getSection().setDescription(
-				EditorMessages.ManagedBeanMasterSection_Description);
-	}
-
-	protected StructuredViewer createViewer(Composite parent,
-			FormToolkit toolkit) {
-		Composite treeContainer = toolkit.createComposite(parent);
-		toolkit.paintBordersFor(treeContainer);
-
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		treeContainer.setLayoutData(gd);
-		GridLayout layout = new GridLayout();
-		treeContainer.setLayout(layout);
-
-		// Create tree viewer
-		TreeViewer treeViewer = new TreeViewer(treeContainer, SWT.SINGLE
-				| SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
-		gd = new GridData(GridData.FILL_BOTH);
-		treeViewer.getControl().setLayoutData(gd);
-
-		treeViewer.setContentProvider(new ManagedBeanContentProvider());
-		treeViewer.setLabelProvider(new ManagedBeanLabelProvider());
-		treeViewer.addSelectionChangedListener(this);
-
-		treeViewer.setAutoExpandLevel(3);
-		return treeViewer;
-	}
-
-	protected void addButtonSelected(SelectionEvent e) {
-		IProject project = (IProject) this.getPage().getEditor().getAdapter(
-				IProject.class);
-
-		NewManagedBeanWizard wizard = new NewManagedBeanWizard(project);
-		IStructuredSelection selection = (IStructuredSelection) this
-				.getSelection();
-		if (selection.getFirstElement() instanceof ManagedBeanScopeTreeItem) {
-			// if user is selecting a scope tree item, then use this scope as
-			// the default scope for the new managed bean.
-			ManagedBeanScopeTreeItem scopeTreeItem = (ManagedBeanScopeTreeItem) selection
-					.getFirstElement();
-			wizard.setDefaultScope(scopeTreeItem.getScope());
-		}
-
-		wizard.setForcePreviousAndNextButtons(true);
-
-		Shell shell = EditorPlugin.getActiveShell();
-		WizardDialog wizardDialog = new WizardDialog(shell, wizard);
-		wizardDialog.create();
-		wizardDialog.setBlockOnOpen(true);
-		if (wizardDialog.open() == Window.OK) {
-			ManagedBeanType managedBean = FacesConfigFactory.eINSTANCE
-					.createManagedBeanType();
-
-			ManagedBeanNameType name = FacesConfigFactory.eINSTANCE
-					.createManagedBeanNameType();
-			name.setTextContent(wizard.getManagedBeanName());
-			managedBean.setManagedBeanName(name);
-
-			ManagedBeanClassType clazz = FacesConfigFactory.eINSTANCE
-					.createManagedBeanClassType();
-			clazz.setTextContent(wizard.getManagedBeanClass());
-			managedBean.setManagedBeanClass(clazz);
-
-			ManagedBeanScopeType scope = FacesConfigFactory.eINSTANCE
-					.createManagedBeanScopeType();
-			scope.setTextContent(wizard.getManagedBeanScope());
-			managedBean.setManagedBeanScope(scope);
-
-			String desc = wizard.getManagedBeanDescription();
-			if (desc != null && desc.trim().length() > 0) {
-				DescriptionType description = FacesConfigFactory.eINSTANCE
-						.createDescriptionType();
-				description.setTextContent(wizard.getManagedBeanDescription());
-				managedBean.getDescription().add(description);
-			}
-
-			Command cmd = AddCommand.create(getEditingDomain(), getInput(),
-					null, managedBean);
-			if (cmd.canExecute()) {
-				this.getEditingDomain().getCommandStack().execute(cmd);
-			}
-		}
-
-	}
-
-	protected void removeButtonSelected(SelectionEvent e) {
-		IStructuredSelection ssel = StructuredSelection.EMPTY;
-		ISelection selection = getSelection();
-		if (selection instanceof IStructuredSelection) {
-			ssel = (IStructuredSelection) selection;
-		}
-
-		if (!ssel.isEmpty()) {
-			if (ssel.getFirstElement() instanceof ManagedBeanType) {
-				ManagedBeanType element = (ManagedBeanType) ssel
-						.getFirstElement();
-				Command command = RemoveCommand.create(getEditingDomain(), this
-						.getInput(), FacesConfigPackage.eINSTANCE
-						.getFacesConfigType_ManagedBean(), element);
-				if (command.canExecute()) {
-					getEditingDomain().getCommandStack().execute(command);
-				}
-			}
-		}
-	}
-
-	protected void updateButtons() {
-		IStructuredSelection ssel = (IStructuredSelection) getStructuredViewer()
-				.getSelection();
-		boolean isRemoveEnable = false;
-		if (!ssel.isEmpty()) {
-			Object s1 = ssel.getFirstElement();
-			if (s1 instanceof ManagedBeanType) {
-				isRemoveEnable = true;
-			}
-		}
-		getRemoveButton().setEnabled(isRemoveEnable);
-	}
-
-	/**
-	 * Override the super method to ignore the selection on ScopeTreeItem.
-	 */
-	public void selectionChanged(SelectionChangedEvent event) {
-
-		if (event != null
-				&& event.getSelection() != null
-				&& ((IStructuredSelection) event.getSelection())
-						.getFirstElement() instanceof ManagedBeanScopeTreeItem) {
-
-			event = new SelectionChangedEvent(this, StructuredSelection.EMPTY);
-		}
-		super.selectionChanged(event);
-		updateButtons();
-
-	}
-
-	protected void addAdaptersOntoInput(Object newInput) {
-		super.addAdaptersOntoInput(newInput);
-
-		FacesConfigType facesConfig = (FacesConfigType) newInput;
-		if (EcoreUtil.getExistingAdapter(facesConfig,
-				ManagedBeanMasterSection.class) == null) {
-
-			facesConfig.eAdapters().add(getManagedBeanMasterSectionAdapter());
-		}
-
-		List managedbeans = facesConfig.getManagedBean();
-		for (Iterator it = managedbeans.iterator(); it.hasNext();) {
-			ManagedBeanType managedbean = (ManagedBeanType) it.next();
-			if (EcoreUtil.getExistingAdapter(managedbean,
-					ManagedBeanMasterSection.class) == null) {
-
-				managedbean.eAdapters().add(
-						getManagedBeanMasterSectionAdapter());
-			}
-		}
-	}
-
-	protected void removeAdaptersFromInput(Object oldInput) {		
-		FacesConfigType facesConfig = (FacesConfigType) oldInput;
-		if (EcoreUtil.getExistingAdapter(facesConfig,
-				ManagedBeanMasterSection.class) != null) {
-
-			facesConfig.eAdapters()
-					.remove(getManagedBeanMasterSectionAdapter());
-		}
-
-		List managedbeans = facesConfig.getManagedBean();
-		for (Iterator it = managedbeans.iterator(); it.hasNext();) {
-			ManagedBeanType managedbean = (ManagedBeanType) it.next();
-			if (EcoreUtil.getExistingAdapter(managedbean,
-					ManagedBeanMasterSection.class) != null) {
-
-				managedbean.eAdapters().remove(
-						getManagedBeanMasterSectionAdapter());
-			}
-		}
-		super.removeAdaptersFromInput(oldInput);
-	}
-
-	private ManagedBeanMasterSectionAdapter getManagedBeanMasterSectionAdapter() {
-		if (managedBeanMasterSectionAdapter == null) {
-			managedBeanMasterSectionAdapter = new ManagedBeanMasterSectionAdapter();
-		}
-		return managedBeanMasterSectionAdapter;
-	}
-
-	class ManagedBeanMasterSectionAdapter extends AdapterImpl {
-
-		public boolean isAdapterForType(Object type) {
-			if (type == ManagedBeanMasterSection.class)
-				return true;
-			return false;
-		}
-
-		public void notifyChanged(Notification msg) {
-			super.notifyChanged(msg);
-
-			if (msg.getFeature() == FacesConfigPackage.eINSTANCE
-					.getFacesConfigType_ManagedBean()) {
-				if (msg.getEventType() == Notification.ADD) {
-					final EObject mbean = (EObject) msg.getNewValue();
-					if (EcoreUtil.getExistingAdapter(mbean,
-							ManagedBeanMasterSection.class) == null) {
-
-						mbean.eAdapters().add(
-								getManagedBeanMasterSectionAdapter());
-					}
-					if (Thread.currentThread() == PlatformUI.getWorkbench().getDisplay().getThread()) {
-						getStructuredViewer().refresh(true);
-						IStructuredSelection selection = new StructuredSelection(
-								mbean);
-						getStructuredViewer().setSelection(selection);
-					} else {
-						PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
-							public void run() {
-								getStructuredViewer().refresh(true);
-								IStructuredSelection selection = new StructuredSelection(
-										mbean);
-								getStructuredViewer().setSelection(selection);
-							}
-						});
-					}
-				} else if (msg.getEventType() == Notification.REMOVE) {
-					final EObject mbean = (EObject) msg.getOldValue();
-					if (Thread.currentThread() == PlatformUI.getWorkbench().getDisplay().getThread()) {
-						getStructuredViewer().refresh(true);
-						if (EcoreUtil.getExistingAdapter(mbean,
-								ManagedBeanMasterSection.class) == null) {
-				
-								mbean.eAdapters().remove(
-										getManagedBeanMasterSectionAdapter());
-							}
-					} else {
-						PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
-							public void run() {
-								getStructuredViewer().refresh(true);
-								if (EcoreUtil.getExistingAdapter(mbean,
-										ManagedBeanMasterSection.class) == null) {
-						
-										mbean.eAdapters().remove(
-												getManagedBeanMasterSectionAdapter());
-									}
-							}
-						});
-					}
-
-				} else if (msg.getEventType() == Notification.SET) {
-					final Object mbean = msg.getNewValue();
-					if (Thread.currentThread() == PlatformUI.getWorkbench().getDisplay().getThread()) {
-						getStructuredViewer().refresh(mbean, true);
-					} else {
-						PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
-						public void run() {
-							getStructuredViewer().refresh(mbean, true);
-						}
-					});
-				}
-			}
-
-			if (msg.getFeature() == FacesConfigPackage.eINSTANCE
-					.getManagedBeanType_ManagedBeanClass()
-					|| msg.getFeature() == FacesConfigPackage.eINSTANCE
-							.getManagedBeanType_ManagedBeanName()) {
-
-				final Object bean = msg.getNotifier();
-				if (Thread.currentThread() == PlatformUI.getWorkbench().getDisplay().getThread()) {
-					getStructuredViewer().refresh(bean, true);
-				} else {
-					PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
-						public void run() {
-							getStructuredViewer().refresh(bean, true);
-						}	
-					});
-				}
-				
-
-			} else if (msg.getFeature() == FacesConfigPackage.eINSTANCE
-					.getManagedBeanType_ManagedBeanScope()) {
-
-				final Object mbean = msg.getNotifier();
-				if (Thread.currentThread() == PlatformUI.getWorkbench().getDisplay().getThread()) {
-					getStructuredViewer().refresh();
-					IStructuredSelection selection = new StructuredSelection(
-							mbean);
-					getStructuredViewer().setSelection(selection);
-				} else {	
-					PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
-						public void run() {
-							getStructuredViewer().refresh();
-							IStructuredSelection selection = new StructuredSelection(
-									mbean);
-							getStructuredViewer().setSelection(selection);
-						}
-					});
-				}				
-			}
-		}
-	}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ManagedBeanScopeTreeItem.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ManagedBeanScopeTreeItem.java
deleted file mode 100644
index 4101d9e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ManagedBeanScopeTreeItem.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.section;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType;
-import org.eclipse.jst.jsf.facesconfig.ui.IFacesConfigConstants;
-
-/**
- * @author Xiao-guang Zhang, sfshi
- * @version
- */
-public class ManagedBeanScopeTreeItem {
-
-	/**
-	 * Possible values for bean scope
-	 */
-	public static final String[] scopeItems = {
-			IFacesConfigConstants.MANAGED_BEAN_SCOPE_SESSION,
-			IFacesConfigConstants.MANAGED_BEAN_SCOPE_REQUEST,
-			IFacesConfigConstants.MANAGED_BEAN_SCOPE_APPLICATION,
-			IFacesConfigConstants.MANAGED_BEAN_SCOPE_NONE };
-
-	private String scope;
-
-	private FacesConfigType facesConfig;
-
-	/**
-	 * 
-	 * @param managedBeanScope
-	 * @param facesConfig
-	 */
-	public ManagedBeanScopeTreeItem(String managedBeanScope,
-			FacesConfigType facesConfig) {
-		super();
-		this.scope = managedBeanScope;
-
-		this.facesConfig = facesConfig;
-	}
-
-	/**
-	 * @return the parent object
-	 */
-	public Object getParent() {
-		return facesConfig;
-	}
-
-	/**
-	 * @return true if this node has children
-	 */
-	public boolean hasChildren() {
-		return !getChildren().isEmpty();
-	}
-
-	/**
-	 * @return the scope
-	 */
-	public String getScope() {
-		return scope;
-	}
-
-	/**
-	 * @return the list of children.  List may be empty.
-	 */
-	public List getChildren() {
-		List result = new ArrayList();
-		List managedBeans = facesConfig.getManagedBean();
-		for (Iterator it = managedBeans.iterator(); it.hasNext();) {
-			ManagedBeanType managedBean = (ManagedBeanType) it.next();
-
-			if (managedBean.getManagedBeanScope() != null) {
-				if (scope.equals(managedBean.getManagedBeanScope()
-						.getTextContent())) {
-					result.add(managedBean);
-				}
-			}
-		}
-
-		return result;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ManagedPropertyEditGroup.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ManagedPropertyEditGroup.java
deleted file mode 100644
index c0112a1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ManagedPropertyEditGroup.java
+++ /dev/null
@@ -1,575 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.section;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.command.CompoundCommand;
-import org.eclipse.emf.edit.command.AddCommand;
-import org.eclipse.emf.edit.command.RemoveCommand;
-import org.eclipse.emf.edit.command.SetCommand;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.viewers.ColumnWeightData;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.TableLayout;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogFieldGroup;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ListEntriesType;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType;
-import org.eclipse.jst.jsf.facesconfig.emf.MapEntriesType;
-import org.eclipse.jst.jsf.facesconfig.emf.NullValueType;
-import org.eclipse.jst.jsf.facesconfig.emf.PropertyClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.PropertyNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.ValueType;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.jst.jsf.facesconfig.ui.IFacesConfigConstants;
-import org.eclipse.jst.jsf.facesconfig.ui.dialog.AddEditManagedPropertyDialog;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.MouseAdapter;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * @author sfshi
- * @version
- */
-public class ManagedPropertyEditGroup extends DialogFieldGroup implements
-		IDialogFieldGroup, ISelectionProvider, ISelectionChangedListener {
-
-	private TableViewer tableViewer;
-
-	private static final int TABLE_DEFAULT_HEIGHT = 160;
-
-	private Button removeButton;
-
-	private Button editButton;
-
-	private ManagedBeanType managedBean;
-
-	private AbstractFacesConfigSection section;
-
-	private List selectionChangedListeners = new ArrayList();
-
-	/**
-	 * @param section 
-	 * 
-	 */
-	public ManagedPropertyEditGroup(AbstractFacesConfigSection section) {
-		super();
-		this.section = section;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.common.dialogfield.DialogFieldGroup#initialize()
-	 */
-	public void initialize() {
-		// do nothing
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.common.dialogfield.DialogFieldGroup#refreshData()
-	 */
-	public void refreshData() {
-		refresh();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.common.dialogfield.DialogFieldGroup#layoutDialogFields(org.eclipse.ui.forms.widgets.FormToolkit,
-	 *      org.eclipse.swt.widgets.Composite)
-	 */
-	public void layoutDialogFields(FormToolkit toolkit, Composite parent) {
-		createGeneralClassPage(parent, toolkit);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.common.dialogfield.DialogFieldGroup#validateDialogFields()
-	 */
-	public IStatus[] validateDialogFields() {
-		return null;
-	}
-
-	/**
-	 * create general class initialization section
-	 * 
-	 * @param container
-	 * @param toolkit
-	 */
-	private void createGeneralClassPage(Composite container, FormToolkit toolkit) {
-		Composite generalSection = toolkit.createComposite(container);
-		generalSection.setLayoutData(new GridData(GridData.FILL_BOTH));
-		toolkit.paintBordersFor(generalSection);
-
-		GridLayout gl = new GridLayout();
-		gl.horizontalSpacing = 0;
-		gl.marginWidth = 0;
-		gl.numColumns = 2;
-		generalSection.setLayout(gl);
-
-		createTableSection(generalSection, toolkit);
-
-		createButtonsSection(generalSection, toolkit);
-	}
-
-	/**
-	 * create proeprty table section
-	 * 
-	 * @param container
-	 * @param toolkit
-	 */
-	private void createTableSection(Composite container, FormToolkit toolkit) {
-		// create property container
-		Composite propertyContainer = toolkit.createComposite(container);
-		GridData gd = new GridData(GridData.FILL_BOTH
-				| GridData.GRAB_HORIZONTAL);
-		propertyContainer.setLayoutData(gd);
-		toolkit.paintBordersFor(propertyContainer);
-
-		GridLayout gl = new GridLayout();
-		propertyContainer.setLayout(gl);
-
-		// Create property table
-		Table table = new Table(propertyContainer, SWT.H_SCROLL | SWT.V_SCROLL
-				| SWT.FULL_SELECTION | SWT.BORDER);
-		TableLayout layout = new TableLayout();
-		table.setLayout(layout);
-		gd = new GridData(GridData.FILL_BOTH);
-		gd.horizontalSpan = 1;
-		gd.heightHint = TABLE_DEFAULT_HEIGHT;
-		table.setLayoutData(gd);
-
-		table.setHeaderVisible(true);
-		table.setLinesVisible(true);
-		TableColumn propertyCol = new TableColumn(table, SWT.NONE);
-		layout.addColumnData(new ColumnWeightData(1, true));
-		propertyCol
-				.setText(EditorMessages.InitializationSection_PropertyTable_Name);
-		propertyCol.setResizable(true);
-
-		TableColumn classCol = new TableColumn(table, SWT.NONE);
-		layout.addColumnData(new ColumnWeightData(1, true));
-		classCol
-				.setText(EditorMessages.InitializationSection_PropertyTable_Class);
-		classCol.setResizable(true);
-
-		TableColumn valueCol = new TableColumn(table, SWT.NONE);
-		layout.addColumnData(new ColumnWeightData(1, true));
-		valueCol
-				.setText(EditorMessages.InitializationSection_PropertyTable_Value);
-		valueCol.setResizable(true);
-
-		table.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				updateButtons();
-			}
-		});
-
-		table.addMouseListener(new MouseAdapter() {
-			public void mouseDoubleClick(MouseEvent e) {
-				if (((IStructuredSelection) tableViewer.getSelection()).size() > 0)
-					editButtonSelected();
-			}
-		});
-
-		tableViewer = new TableViewer(table);
-		tableViewer.setContentProvider(new AdapterFactoryContentProvider(
-				section.getAdapterFactory()));
-		tableViewer.setLabelProvider(new AdapterFactoryLabelProvider(section
-				.getAdapterFactory()));
-
-		tableViewer.addFilter(new ViewerFilter() {
-			public boolean select(Viewer viewer, Object parentElement,
-					Object element) {
-				return FacesConfigPackage.eINSTANCE.getManagedPropertyType()
-						.isInstance(element);
-			}
-		});
-		
-		tableViewer.addSelectionChangedListener(this);
-	}
-
-	/**
-	 * Update the buttons' enable and disable status
-	 */
-	private void updateButtons() {
-		if (((IStructuredSelection) tableViewer.getSelection()).size() > 0) {
-			editButton.setEnabled(true);
-			removeButton.setEnabled(true);
-		} else {
-			editButton.setEnabled(false);
-			removeButton.setEnabled(false);
-		}
-	}
-
-	/**
-	 * create property's editing buttons
-	 * 
-	 * @param container
-	 * @param toolkit
-	 */
-	private void createButtonsSection(Composite container, FormToolkit toolkit) {
-		// create operation buttons's container
-		Composite operationContainer = toolkit.createComposite(container);
-		GridData gd = new GridData(GridData.FILL_VERTICAL
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		operationContainer.setLayoutData(gd);
-		GridLayout gl = new GridLayout();
-		operationContainer.setLayout(gl);
-
-		// create list operation buttons
-		Button addButton = toolkit.createButton(operationContainer,
-				EditorMessages.UI_Button_Add_more, SWT.PUSH);
-		gd = new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		gd.grabExcessHorizontalSpace = false;
-		addButton.setLayoutData(gd);
-
-		editButton = toolkit.createButton(operationContainer,
-				EditorMessages.UI_Button_Edit_more,
-				SWT.PUSH);
-		gd = new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		gd.grabExcessHorizontalSpace = false;
-		editButton.setLayoutData(gd);
-
-		removeButton = toolkit.createButton(operationContainer,
-				EditorMessages.UI_Button_Remove,
-				SWT.PUSH);
-		gd = new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		gd.grabExcessHorizontalSpace = false;
-		removeButton.setLayoutData(gd);
-
-		addButton.addSelectionListener(new SelectionAdapter() {
-
-			public void widgetSelected(SelectionEvent e) {
-				addButtonSelected();
-			}
-
-		});
-
-		editButton.addSelectionListener(new SelectionAdapter() {
-
-			public void widgetSelected(SelectionEvent e) {
-				editButtonSelected();
-			}
-		});
-		removeButton.addSelectionListener(new SelectionAdapter() {
-
-			public void widgetSelected(SelectionEvent e) {
-				removeButtonSelected();
-			}
-		});
-
-	}
-
-	private void addButtonSelected() {
-		Shell shell = EditorPlugin.getActiveShell();
-
-		AddEditManagedPropertyDialog dialog = new AddEditManagedPropertyDialog(
-				shell, managedBean, section);
-		if (dialog.open() == Dialog.OK) {
-
-			ManagedPropertyType managedProperty = createManagedPropertyFromDialog(dialog);
-			Command addCommand = AddCommand.create(this.getEditingDomain(),
-					getInput(), FacesConfigPackage.eINSTANCE
-							.getManagedBeanType_ManagedProperty(),
-					managedProperty);
-			if (addCommand.canExecute()) {
-				this.getEditingDomain().getCommandStack().execute(addCommand);
-
-			}
-		}
-
-	}
-
-	private void editButtonSelected() {
-		ManagedPropertyType managedProperty = (ManagedPropertyType) ((IStructuredSelection) tableViewer
-				.getSelection()).getFirstElement();
-		Shell shell = EditorPlugin.getActiveShell();
-		AddEditManagedPropertyDialog dialog = new AddEditManagedPropertyDialog(
-				shell, managedProperty, section);
-		if (dialog.open() == Dialog.OK) {
-			List commands = new ArrayList();
-			String propertyName = dialog.getPropertyName();
-			String propertyClass = dialog.getPropertyClass();
-			PropertyNameType propertyNameType = FacesConfigFactory.eINSTANCE
-					.createPropertyNameType();
-			propertyNameType.setTextContent(propertyName);
-			Command cmd1 = SetCommand.create(this.getEditingDomain(),
-					managedProperty, FacesConfigPackage.eINSTANCE
-							.getManagedPropertyType_PropertyName(),
-					propertyNameType);
-			commands.add(cmd1);
-
-			PropertyClassType propertyClassType = FacesConfigFactory.eINSTANCE
-					.createPropertyClassType();
-			propertyClassType.setTextContent(propertyClass);
-			Command cmd2 = SetCommand.create(this.getEditingDomain(),
-					managedProperty, FacesConfigPackage.eINSTANCE
-							.getManagedPropertyType_PropertyClass(),
-					propertyClassType);
-			commands.add(cmd2);
-
-			// remove value, null-value, map-entries and list-entries element:
-			if (managedProperty.getNullValue() != null) {
-				Command rmCmd = SetCommand.create(this.getEditingDomain(),
-						managedProperty, FacesConfigPackage.eINSTANCE
-								.getManagedPropertyType_NullValue(),
-						SetCommand.UNSET_VALUE);
-				commands.add(rmCmd);
-			}
-			if (managedProperty.getListEntries() != null) {
-				Command rmCmd = SetCommand.create(this.getEditingDomain(),
-						managedProperty, FacesConfigPackage.eINSTANCE
-								.getManagedPropertyType_ListEntries(),
-						SetCommand.UNSET_VALUE);
-				commands.add(rmCmd);
-			}
-			if (managedProperty.getValue() != null) {
-				Command rmCmd = SetCommand.create(this.getEditingDomain(),
-						managedProperty, FacesConfigPackage.eINSTANCE
-								.getManagedPropertyType_Value(),
-						SetCommand.UNSET_VALUE);
-				commands.add(rmCmd);
-			}
-			if (managedProperty.getMapEntries() != null) {
-				Command rmCmd = SetCommand.create(this.getEditingDomain(),
-						managedProperty, FacesConfigPackage.eINSTANCE
-								.getManagedPropertyType_MapEntries(),
-						SetCommand.UNSET_VALUE);
-				commands.add(rmCmd);
-			}
-
-			Object valueObject = dialog.getValueObject();
-			if (valueObject != null) {
-				String valueType = dialog.getValueType();
-				if (valueType.equals(IFacesConfigConstants.VALUE)) {
-
-					ValueType value = FacesConfigFactory.eINSTANCE
-							.createValueType();
-					value.setTextContent((String) valueObject);
-					managedProperty.setValue(value);
-					Command cmd3 = SetCommand.create(this.getEditingDomain(),
-							managedProperty, FacesConfigPackage.eINSTANCE
-									.getManagedPropertyType_Value(), value);
-					commands.add(cmd3);
-
-				} else if (valueType.equals(IFacesConfigConstants.MAP_ENTRIES)) {
-
-					MapEntriesType mapEntriesType = (MapEntriesType) valueObject;
-					Command cmd3 = SetCommand.create(this.getEditingDomain(),
-							managedProperty, FacesConfigPackage.eINSTANCE
-									.getManagedPropertyType_MapEntries(),
-							mapEntriesType);
-					commands.add(cmd3);
-				} else if (valueType.equals(IFacesConfigConstants.LIST_ENTRIES)) {
-
-					ListEntriesType listEntriesType = (ListEntriesType) valueObject;
-					Command cmd3 = SetCommand.create(this.getEditingDomain(),
-							managedProperty, FacesConfigPackage.eINSTANCE
-									.getManagedPropertyType_ListEntries(),
-							listEntriesType);
-					commands.add(cmd3);
-				} else if (valueType.equals(IFacesConfigConstants.NULL_VALUE)) {
-
-					NullValueType nullValue = (NullValueType) valueObject;
-					Command cmd3 = SetCommand.create(this.getEditingDomain(),
-							managedProperty, FacesConfigPackage.eINSTANCE
-									.getManagedPropertyType_NullValue(),
-							nullValue);
-					commands.add(cmd3);
-				}
-			}
-			CompoundCommand command = new CompoundCommand(commands);
-			if (command.canExecute()) {
-				getEditingDomain().getCommandStack().execute(command);
-			}
-		}
-	}
-
-	private ManagedPropertyType createManagedPropertyFromDialog(
-			AddEditManagedPropertyDialog dialog) {
-
-		String propertyName = dialog.getPropertyName();
-		String propertyClass = dialog.getPropertyClass();
-
-		ManagedPropertyType managedProperty = FacesConfigFactory.eINSTANCE
-				.createManagedPropertyType();
-		PropertyNameType propertyNameType = FacesConfigFactory.eINSTANCE
-				.createPropertyNameType();
-		propertyNameType.setTextContent(propertyName);
-		PropertyClassType propertyClassType = FacesConfigFactory.eINSTANCE
-				.createPropertyClassType();
-		propertyClassType.setTextContent(propertyClass);
-		managedProperty.setPropertyName(propertyNameType);
-		managedProperty.setPropertyClass(propertyClassType);
-
-		Object valueObject = dialog.getValueObject();
-		if (valueObject != null) {
-			String valueType = dialog.getValueType();
-			if (valueType.equals(IFacesConfigConstants.VALUE)) {
-				ValueType value = FacesConfigFactory.eINSTANCE
-						.createValueType();
-				value.setTextContent((String) valueObject);
-				managedProperty.setValue(value);
-			} else if (valueType.equals(IFacesConfigConstants.MAP_ENTRIES)) {
-				MapEntriesType mapEntriesType = (MapEntriesType) dialog
-						.getValueObject();
-				managedProperty.setMapEntries(mapEntriesType);
-			} else if (valueType.equals(IFacesConfigConstants.LIST_ENTRIES)) {
-				ListEntriesType listEntriesType = (ListEntriesType) dialog
-						.getValueObject();
-				managedProperty.setListEntries(listEntriesType);
-			} else if (valueType.equals(IFacesConfigConstants.NULL_VALUE)) {
-				NullValueType nullValue = (NullValueType) dialog
-						.getValueObject();
-				managedProperty.setNullValue(nullValue);
-			}
-		}
-		return managedProperty;
-	}
-
-	private void removeButtonSelected() {
-		ManagedPropertyType managedProperty = (ManagedPropertyType) ((IStructuredSelection) tableViewer
-				.getSelection()).getFirstElement();
-		Assert.isNotNull(managedProperty);
-
-		Command removeCommand = RemoveCommand.create(this.getEditingDomain(),
-				this.getInput(), FacesConfigPackage.eINSTANCE
-						.getManagedBeanType_ManagedProperty(), managedProperty);
-
-		if (removeCommand.canExecute()) {
-			this.getEditingDomain().getCommandStack().execute(removeCommand);
-			refreshAll();
-		}
-	}
-
-	public void setInput(Object newInput) {
-		if (newInput != null && newInput instanceof ManagedBeanType) {
-			managedBean = (ManagedBeanType) newInput;
-			refreshAll();
-		}
-	}
-
-	/**
-	 * 
-	 */
-	public void refreshAll() {
-		tableViewer.setInput(getInput());
-		updateButtons();
-
-	}
-
-	/**
-	 * 
-	 */
-	public void refresh() {
-		tableViewer.refresh();
-		updateButtons();
-	}
-
-	public Object getInput() {
-		return managedBean;
-	}
-
-	private EditingDomain getEditingDomain() {
-		return section.getEditingDomain();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#addSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
-	 */
-	public void addSelectionChangedListener(ISelectionChangedListener listener) {
-		selectionChangedListeners.add(listener);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#getSelection()
-	 */
-	public ISelection getSelection() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#removeSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
-	 */
-	public void removeSelectionChangedListener(
-			ISelectionChangedListener listener) {
-		selectionChangedListeners.remove(listener);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#setSelection(org.eclipse.jface.viewers.ISelection)
-	 */
-	public void setSelection(ISelection selection) {
-		// do nothing
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
-	 */
-	public void selectionChanged(SelectionChangedEvent event) {
-		for (Iterator listeners = selectionChangedListeners.iterator(); listeners
-				.hasNext();) {
-			ISelectionChangedListener listener = (ISelectionChangedListener) listeners
-					.next();
-			listener.selectionChanged(new SelectionChangedEvent(this, event
-					.getSelection()));
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/MapEntriesEditGroup.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/MapEntriesEditGroup.java
deleted file mode 100644
index e5a41b2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/MapEntriesEditGroup.java
+++ /dev/null
@@ -1,692 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.section;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.command.CompoundCommand;
-import org.eclipse.emf.edit.command.AddCommand;
-import org.eclipse.emf.edit.command.RemoveCommand;
-import org.eclipse.emf.edit.command.SetCommand;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.viewers.ColumnWeightData;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.TableLayout;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.ClassButtonDialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogFieldBase;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogFieldGroup;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogFieldApplyListener;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.LayoutUtil;
-import org.eclipse.jst.jsf.common.ui.internal.guiutils.SWTUtils;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.KeyClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.KeyType;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType;
-import org.eclipse.jst.jsf.facesconfig.emf.MapEntriesType;
-import org.eclipse.jst.jsf.facesconfig.emf.MapEntryType;
-import org.eclipse.jst.jsf.facesconfig.emf.NullValueType;
-import org.eclipse.jst.jsf.facesconfig.emf.ValueClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.ValueType;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.jst.jsf.facesconfig.ui.dialog.AddEditMapEntryDialog;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.MouseAdapter;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * MapEntries Editing DialogFieldGroup
- * 
- * @author sfshi
- * @version
- */
-public class MapEntriesEditGroup extends DialogFieldGroup implements
-		IDialogFieldGroup, ISelectionProvider, ISelectionChangedListener {
-	private ClassButtonDialogField keyClassField;
-
-	private ClassButtonDialogField valueClassField;
-
-	private TableViewer tableViewer;
-
-	private static final int TABLE_DEFAULT_HEIGHT = 160;
-
-	private IProject currentProject;
-
-	private Button removeButton;
-
-	private Button editButton;
-
-	private ManagedBeanType managedBean;
-
-	private AbstractFacesConfigSection section;
-
-	private List selectionChangedListeners = new ArrayList();
-
-	/**
-	 * @param section 
-	 */
-	public MapEntriesEditGroup(AbstractFacesConfigSection section) {
-		super();
-		this.section = section;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.common.dialogfield.DialogFieldGroup#initialize()
-	 */
-	public void initialize() {
-        // TODO: initialize?
-	}
-
-	private void updateButtons() {
-		if (((IStructuredSelection) tableViewer.getSelection()).size() > 0) {
-			editButton.setEnabled(true);
-			removeButton.setEnabled(true);
-		} else {
-			editButton.setEnabled(false);
-			removeButton.setEnabled(false);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.common.dialogfield.DialogFieldGroup#layoutDialogFields(org.eclipse.ui.forms.widgets.FormToolkit,
-	 *      org.eclipse.swt.widgets.Composite)
-	 */
-	public void layoutDialogFields(FormToolkit toolkit, Composite parent) {
-		GridData data = new GridData(GridData.FILL_BOTH);
-		parent.setLayoutData(data);
-
-		GridLayout gl = new GridLayout();
-		gl.verticalSpacing = 0;
-		gl.marginHeight = 0;
-		parent.setLayout(gl);
-
-		layoutMapTypeSelectionSection(toolkit, parent);
-
-		createAndLayoutMapValueSection(toolkit, parent);
-	}
-
-	/**
-	 * 
-	 */
-	private void layoutMapTypeSelectionSection(FormToolkit toolkit,
-			Composite container) {
-
-		Composite typeSelectionSection = null;
-		if (toolkit != null) {
-			typeSelectionSection = toolkit.createComposite(container);
-			toolkit.paintBordersFor(typeSelectionSection);
-		} else {
-			typeSelectionSection = SWTUtils
-					.createComposite(container, SWT.NONE);
-		}
-
-		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-		typeSelectionSection.setLayoutData(gd);
-
-		int numberOfColumns = 4;
-		GridLayout gl = new GridLayout(numberOfColumns, false);
-		typeSelectionSection.setLayout(gl);
-		keyClassField = new ClassButtonDialogField(getProject());
-		keyClassField
-				.setLabelText(EditorMessages.InitializationSection_MapType_KeyClass);
-		keyClassField
-				.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
-
-					public void dialogFieldApplied(DialogField field) {
-						ManagedBeanType managedBean1 = (ManagedBeanType) getInput();
-						String className = ((ClassButtonDialogField) field)
-								.getText();
-						KeyClassType keyClass = FacesConfigFactory.eINSTANCE
-								.createKeyClassType();
-						keyClass.setTextContent(className);
-						EditingDomain editingDomain = section
-								.getEditingDomain();
-						Command cmd;
-						boolean isNew;
-						if (managedBean1.getMapEntries() == null) {
-							isNew = true;
-							MapEntriesType mapEntries = FacesConfigFactory.eINSTANCE
-									.createMapEntriesType();
-							mapEntries.setKeyClass(keyClass);
-							cmd = SetCommand.create(editingDomain, managedBean1,
-									FacesConfigPackage.eINSTANCE
-											.getManagedBeanType_MapEntries(),
-									mapEntries);
-						} else {
-							isNew = false;
-							cmd = SetCommand.create(editingDomain, managedBean1
-									.getMapEntries(),
-									FacesConfigPackage.eINSTANCE
-											.getMapEntriesType_KeyClass(),
-									keyClass);
-						}
-
-						if (cmd.canExecute()) {
-							editingDomain.getCommandStack().execute(cmd);
-							if (isNew)
-								refreshAll();
-						}
-
-					}
-				});
-
-		valueClassField = new ClassButtonDialogField(getProject());
-
-		valueClassField
-				.setLabelText(EditorMessages.InitializationSection_MapType_ValueClass);
-		valueClassField
-				.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
-
-					public void dialogFieldApplied(DialogField field) {
-						ManagedBeanType managedBean1 = (ManagedBeanType) getInput();
-						String className = ((ClassButtonDialogField) field)
-								.getText();
-						ValueClassType valueClass = FacesConfigFactory.eINSTANCE
-								.createValueClassType();
-						valueClass.setTextContent(className);
-						EditingDomain editingDomain = section
-								.getEditingDomain();
-						Command cmd;
-						boolean isNew;
-						if (managedBean1.getMapEntries() == null) {
-							isNew = true;
-							MapEntriesType mapEntries = FacesConfigFactory.eINSTANCE
-									.createMapEntriesType();
-							mapEntries.setValueClass(valueClass);
-							cmd = SetCommand.create(editingDomain, managedBean1,
-									FacesConfigPackage.eINSTANCE
-											.getManagedBeanType_MapEntries(),
-									mapEntries);
-						} else {
-							isNew = false;
-							cmd = SetCommand.create(editingDomain, managedBean1
-									.getMapEntries(),
-									FacesConfigPackage.eINSTANCE
-											.getMapEntriesType_ValueClass(),
-									valueClass);
-						}
-
-						if (cmd.canExecute()) {
-							editingDomain.getCommandStack().execute(cmd);
-							if (isNew)
-								refreshAll();
-						}
-
-					}
-				});
-
-		keyClassField.doFillIntoGrid(toolkit, typeSelectionSection,
-				numberOfColumns);
-		LayoutUtil.setHorizontalGrabbing(keyClassField.getTextControl(toolkit,
-				container));
-
-		valueClassField.doFillIntoGrid(toolkit, typeSelectionSection,
-				numberOfColumns);
-	}
-
-	/**
-	 * @param toolkit
-	 * @param parent
-	 */
-	private void createAndLayoutMapValueSection(FormToolkit toolkit,
-			Composite parent) {
-		Composite mapValueSection = null;
-		if (toolkit != null) {
-			mapValueSection = toolkit.createComposite(parent);
-			toolkit.paintBordersFor(mapValueSection);
-		} else {
-			mapValueSection = SWTUtils.createComposite(parent, SWT.NONE);
-		}
-
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		mapValueSection.setLayoutData(gd);
-
-		int numberOfColumns = 3;
-		GridLayout gl = new GridLayout(numberOfColumns, false);
-		mapValueSection.setLayout(gl);
-		DialogField valuesTitle = new DialogFieldBase();
-		valuesTitle
-				.setLabelText(EditorMessages.InitializationSection_MapTable_Title);    
-
-		valuesTitle.doFillIntoGrid(toolkit, mapValueSection, numberOfColumns);
-		Table table;
-		if (toolkit == null) {
-			table = new Table(mapValueSection, SWT.FULL_SELECTION
-					| SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
-		} else {
-			table = new Table(mapValueSection, SWT.H_SCROLL | SWT.V_SCROLL
-					| SWT.FULL_SELECTION | SWT.BORDER);
-		}
-
-		table.addSelectionListener(new SelectionAdapter() {
-
-			public void widgetSelected(SelectionEvent e) {
-				updateButtons();
-
-			}
-		});
-		gd = new GridData(GridData.FILL_BOTH);
-		gd.horizontalSpan = 1;
-		gd.heightHint = TABLE_DEFAULT_HEIGHT;
-		table.setLayoutData(gd);
-		table.setHeaderVisible(true);
-		table.setLinesVisible(true);
-		TableLayout layout = new TableLayout();
-		table.setLayout(layout);
-
-		TableColumn keyCol = new TableColumn(table, SWT.NONE);
-		keyCol.setText(EditorMessages.InitializationSection_MapTable_Key);
-		layout.addColumnData(new ColumnWeightData(1, true));
-		keyCol.setResizable(true);
-
-		TableColumn valueCol = new TableColumn(table, SWT.NONE);
-		layout.addColumnData(new ColumnWeightData(1, true));
-		valueCol.setText(EditorMessages.InitializationSection_MapTable_Value);
-		valueCol.setResizable(true);
-		table.addMouseListener(new MouseAdapter() {
-			public void mouseDoubleClick(MouseEvent e) {
-				if (((IStructuredSelection) tableViewer.getSelection()).size() > 0)
-					editButtonSelected();
-			}
-		});
-		tableViewer = new TableViewer(table);
-		tableViewer.setContentProvider(new AdapterFactoryContentProvider(
-				section.getAdapterFactory()));
-		tableViewer.setLabelProvider(new AdapterFactoryLabelProvider(section
-				.getAdapterFactory()));
-
-		tableViewer.addFilter(new ViewerFilter() {
-			public boolean select(Viewer viewer, Object parentElement,
-					Object element) {
-				return FacesConfigPackage.eINSTANCE.getMapEntryType()
-						.isInstance(element);
-			}
-		});
-
-		tableViewer.addSelectionChangedListener(this);
-
-		Composite operationContainer = null;
-		if (toolkit != null) {
-			operationContainer = toolkit.createComposite(mapValueSection);
-		} else {
-			operationContainer = SWTUtils.createComposite(mapValueSection,
-					SWT.NONE);
-		}
-		gd = new GridData(GridData.FILL_VERTICAL);
-		operationContainer.setLayoutData(gd);
-		gl = new GridLayout();
-		operationContainer.setLayout(gl);
-
-		Button addButton = null;
-		if (toolkit != null) {
-			addButton = toolkit.createButton(operationContainer,
-					EditorMessages.UI_Button_Add_more,
-					SWT.PUSH);
-		} else {
-			addButton = SWTUtils.createPushButton(operationContainer,
-					EditorMessages.UI_Button_Add_more);
-		}
-		gd = new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		gd.grabExcessHorizontalSpace = false;
-		addButton.setLayoutData(gd);
-
-		if (toolkit != null) {
-			editButton = toolkit.createButton(operationContainer,
-					EditorMessages.UI_Button_Edit_more, SWT.PUSH);
-		} else {
-			editButton = SWTUtils.createPushButton(operationContainer,
-					EditorMessages.UI_Button_Edit_more);
-		}
-		gd = new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		gd.grabExcessHorizontalSpace = false;
-		editButton.setLayoutData(gd);
-
-		if (toolkit != null) {
-			removeButton = toolkit.createButton(operationContainer,
-					EditorMessages.UI_Button_Remove,
-					SWT.PUSH);
-		} else {
-			removeButton = SWTUtils.createPushButton(operationContainer,
-					EditorMessages.UI_Button_Remove);
-		}
-		gd = new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		gd.grabExcessHorizontalSpace = false;
-		removeButton.setLayoutData(gd);
-		addButton.addSelectionListener(new SelectionAdapter() {
-
-			public void widgetSelected(SelectionEvent e) {
-				addButtonSelected();
-			}
-
-		});
-
-		editButton.addSelectionListener(new SelectionAdapter() {
-
-			public void widgetSelected(SelectionEvent e) {
-				editButtonSelected();
-			}
-		});
-		removeButton.addSelectionListener(new SelectionAdapter() {
-
-			public void widgetSelected(SelectionEvent e) {
-				removeButtonSelected();
-			}
-		});
-	}
-
-	private void addButtonSelected() {
-		AddEditMapEntryDialog dialog = new AddEditMapEntryDialog(EditorPlugin
-				.getActiveShell(), true);
-		if (dialog.open() == Dialog.OK) {
-			MapEntryType mapEntry = FacesConfigFactory.eINSTANCE
-					.createMapEntryType();
-			if (dialog.getKey() != null) {
-				KeyType key = FacesConfigFactory.eINSTANCE.createKeyType();
-				key.setTextContent(dialog.getKey());
-				mapEntry.setKey(key);
-			}
-			if (dialog.isNullValue()) {
-				NullValueType nullValue = FacesConfigFactory.eINSTANCE
-						.createNullValueType();
-				mapEntry.setNullValue(nullValue);
-			} else {
-				ValueType value = FacesConfigFactory.eINSTANCE
-						.createValueType();
-				value.setTextContent(dialog.getValue());
-				mapEntry.setValue(value);
-			}
-
-			EditingDomain editingDomain = section.getEditingDomain();
-			Command command;
-			boolean isNewMapEntries = false;
-			if (managedBean.getMapEntries() == null) {
-				MapEntriesType mapEntriesType = FacesConfigFactory.eINSTANCE
-						.createMapEntriesType();
-				mapEntriesType.getMapEntry().add(mapEntry);
-				command = SetCommand.create(editingDomain, managedBean,
-						FacesConfigPackage.eINSTANCE
-								.getManagedBeanType_MapEntries(),
-						mapEntriesType);
-				isNewMapEntries = true;
-			} else {
-				MapEntriesType mapEntries = managedBean.getMapEntries();
-
-				command = AddCommand.create(editingDomain, mapEntries,
-						FacesConfigPackage.eINSTANCE
-								.getMapEntriesType_MapEntry(), mapEntry);
-			}
-
-			if (command.canExecute()) {
-				editingDomain.getCommandStack().execute(command);
-				if (isNewMapEntries)
-					refreshAll();
-			}
-
-		}
-	}
-
-	private void editButtonSelected() {
-		if (tableViewer.getSelection() == null
-				|| ((IStructuredSelection) tableViewer.getSelection())
-						.isEmpty()) {
-			return;
-		}
-		MapEntryType mapEntry = (MapEntryType) ((IStructuredSelection) tableViewer
-				.getSelection()).getFirstElement();
-		AddEditMapEntryDialog dialog = new AddEditMapEntryDialog(EditorPlugin
-				.getActiveShell(), false);
-		if (mapEntry.getKey() != null)
-			dialog.setKey(mapEntry.getKey().getTextContent());
-		if (mapEntry.getNullValue() != null)
-			dialog.setNullValue(true);
-		else if (mapEntry.getValue() != null)
-			dialog.setValue(mapEntry.getValue().getTextContent());
-
-		if (dialog.open() == Dialog.OK) {
-			EditingDomain editingDomain = section.getEditingDomain();
-			List commands = new ArrayList();
-
-			if (mapEntry.getKey() != null) {
-				Command cmd1 = SetCommand.create(editingDomain, mapEntry
-						.getKey(), FacesConfigPackage.eINSTANCE
-						.getKeyType_TextContent(), dialog.getKey());
-				commands.add(cmd1);
-
-			} else {
-				KeyType keyType = FacesConfigFactory.eINSTANCE.createKeyType();
-				keyType.setTextContent(dialog.getKey());
-				Command cmd2 = SetCommand.create(editingDomain, mapEntry,
-						FacesConfigPackage.eINSTANCE.getMapEntryType_Key(),
-						keyType);
-				commands.add(cmd2);
-			}
-
-			if (dialog.isNullValue()) {
-				if (mapEntry.getValue() != null) {
-					Command cmd3 = SetCommand.create(editingDomain, mapEntry,
-							FacesConfigPackage.eINSTANCE
-									.getMapEntryType_Value(),
-							SetCommand.UNSET_VALUE);
-					commands.add(cmd3);
-				}
-				Command cmd4 = SetCommand.create(editingDomain, mapEntry,
-						FacesConfigPackage.eINSTANCE
-								.getMapEntryType_NullValue(),
-						FacesConfigFactory.eINSTANCE.createNullValueType());
-
-				commands.add(cmd4);
-			} else {
-				if (mapEntry.getNullValue() != null) {
-					Command cmd5 = SetCommand.create(editingDomain, mapEntry,
-							FacesConfigPackage.eINSTANCE
-									.getMapEntryType_NullValue(),
-							SetCommand.UNSET_VALUE);
-					commands.add(cmd5);
-				}
-
-				if (mapEntry.getValue() != null) {
-					Command cmd6 = SetCommand.create(editingDomain, mapEntry
-							.getValue(), FacesConfigPackage.eINSTANCE
-							.getValueType_TextContent(), dialog.getValue());
-					commands.add(cmd6);
-				} else {
-					ValueType value = FacesConfigFactory.eINSTANCE
-							.createValueType();
-					value.setTextContent(dialog.getValue());
-					Command cmd7 = SetCommand.create(editingDomain, mapEntry,
-							FacesConfigPackage.eINSTANCE
-									.getMapEntryType_Value(), value);
-					commands.add(cmd7);
-				}
-
-			}
-
-			Command command = new CompoundCommand(commands);
-			if (command.canExecute()) {
-				editingDomain.getCommandStack().execute(command);
-				tableViewer.refresh(mapEntry);
-			}
-
-		}
-
-	}
-
-	private void removeButtonSelected() {
-
-		MapEntryType mapEntry = (MapEntryType) ((IStructuredSelection) tableViewer
-				.getSelection()).getFirstElement();
-		EditingDomain editingDomain = section.getEditingDomain();
-		Command cmd = RemoveCommand.create(editingDomain, mapEntry);
-		if (cmd.canExecute()) {
-			editingDomain.getCommandStack().execute(cmd);
-			refresh();
-		}
-	}
-
-	/**
-	 * get the project according to current xml node.
-	 * 
-	 * @return
-	 */
-	private IProject getProject() {
-		if (currentProject == null) {
-			currentProject = (IProject) section.getPage().getEditor()
-					.getAdapter(IProject.class);
-		}
-		return currentProject;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.common.dialogfield.DialogFieldGroup#validateDialogFields()
-	 */
-	public IStatus[] validateDialogFields() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.section.IDialogFieldGroup#setInput(java.lang.Object)
-	 */
-	public void setInput(Object newInput) {
-		if (newInput != null && newInput instanceof ManagedBeanType) {
-			managedBean = (ManagedBeanType) newInput;
-			if (managedBean.getMapEntries() != null)
-				refreshAll();
-		}
-	}
-
-	/*package*/ void refreshAll() {
-		if (managedBean.getMapEntries() != null
-				&& managedBean.getMapEntries().getKeyClass() != null) {
-			this.keyClassField.setTextWithoutUpdate(managedBean.getMapEntries()
-					.getKeyClass().getTextContent());
-		} else {
-			this.keyClassField.setTextWithoutUpdate(null);
-		}
-
-		if (managedBean.getMapEntries() != null
-				&& managedBean.getMapEntries().getValueClass() != null) {
-			this.valueClassField.setTextWithoutUpdate(managedBean
-					.getMapEntries().getValueClass().getTextContent());
-		} else {
-			this.valueClassField.setTextWithoutUpdate(null);
-		}
-
-		tableViewer.setInput(((ManagedBeanType) getInput()).getMapEntries());
-		updateButtons();
-	}
-
-	public Object getInput() {
-		return this.managedBean;
-	}
-
-	public void refreshData() {
-		refresh();
-
-	}
-
-	/**
-	 * 
-	 */
-	public void refresh() {
-		tableViewer.refresh();
-		updateButtons();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#addSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
-	 */
-	public void addSelectionChangedListener(ISelectionChangedListener listener) {
-		selectionChangedListeners.add(listener);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#getSelection()
-	 */
-	public ISelection getSelection() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#removeSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
-	 */
-	public void removeSelectionChangedListener(
-			ISelectionChangedListener listener) {
-		selectionChangedListeners.remove(listener);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#setSelection(org.eclipse.jface.viewers.ISelection)
-	 */
-	public void setSelection(ISelection selection) {
-        // do nothing
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
-	 */
-	public void selectionChanged(SelectionChangedEvent event) {
-		for (Iterator listeners = selectionChangedListeners.iterator(); listeners
-				.hasNext();) {
-			ISelectionChangedListener listener = (ISelectionChangedListener) listeners
-					.next();
-			listener.selectionChanged(new SelectionChangedEvent(this, event
-					.getSelection()));
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/OthersPageBaseSection.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/OthersPageBaseSection.java
deleted file mode 100644
index 4eeca69..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/OthersPageBaseSection.java
+++ /dev/null
@@ -1,320 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.section;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.command.CompoundCommand;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.edit.command.RemoveCommand;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.page.IFacesConfigPage;
-import org.eclipse.jst.jsf.facesconfig.ui.page.OthersPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * @author Zhi-peng Zhang
- * @version
- */
-/**
- * The base class for the Sections in Others Page.
- */
-public abstract class OthersPageBaseSection extends AbstractFacesConfigSection {
-
-	/**
-	 * Table viewer for all sections based on this calss
-	 */
-	protected TableViewer tableViewer;
-
-	private Button removeButton;
-
-	/**
-	 * 
-	 * @param parent
-	 * @param managedForm
-	 * @param page
-	 * @param toolkit
-	 * @param helpContextId
-	 * @param helpTooltip
-	 */
-	public OthersPageBaseSection(Composite parent, IManagedForm managedForm,
-			IFacesConfigPage page, FormToolkit toolkit, String helpContextId,
-			String helpTooltip) {
-		super(parent, managedForm, page, toolkit, helpContextId, helpTooltip);
-	}
-
-	/**
-	 * @param parent
-	 * @param managedForm
-	 * @param page
-	 * @param toolkit
-	 */
-	public OthersPageBaseSection(Composite parent, IManagedForm managedForm,
-			IFacesConfigPage page, FormToolkit toolkit) {
-		this(parent, managedForm, page, toolkit, null, null);
-	}
-
-	public void dispose() {
-		tableViewer.removeSelectionChangedListener(this);
-		tableViewer = null;
-		super.dispose();
-	}
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.section.AbstractFacesConfigSection#createContents(org.eclipse.swt.widgets.Composite,
-	 *      org.eclipse.ui.forms.widgets.FormToolkit)
-	 */
-	protected void createContents(Composite container, FormToolkit toolkit) {
-		GridLayout layout = new GridLayout();
-		layout.numColumns = 2;
-		layout.marginWidth = layout.marginHeight = 5;
-		container.setLayout(layout);
-		createViewer(container, toolkit);
-		createOperationSection(container, toolkit);
-	}
-
-	/**
-	 * create TableViewer for this section. sub-class may override it to return
-	 * a new type tableViewer. for example CheckboxTableViewer.
-	 * 
-	 * @param parent
-	 * @return the table viewer for this section
-	 */
-	protected TableViewer createTableViewer(Composite parent) {
-		return new TableViewer(parent, SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL
-				| SWT.BORDER);
-	}
-
-	/**
-	 * Config the viewer, such as set a filter and so on. Sub classes should
-	 * override this method to add filter.
-	 * 
-	 * @param tableViewer1
-	 */
-	protected abstract void configTableViewer(TableViewer tableViewer1);
-
-	/**
-	 * 
-	 * @param parent
-	 * @param toolkit
-	 */
-	protected void createViewer(Composite parent, FormToolkit toolkit) {
-		Composite tableContainer = toolkit.createComposite(parent);
-		toolkit.paintBordersFor(tableContainer);
-
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		gd.heightHint = 200;
-		tableContainer.setLayoutData(gd);
-		tableContainer.setLayout(new GridLayout());
-
-		tableViewer = createTableViewer(tableContainer);
-		tableViewer.getControl()
-				.setLayoutData(new GridData(GridData.FILL_BOTH));
-		tableViewer.setContentProvider(new AdapterFactoryContentProvider(
-				getAdapterFactory()));
-		tableViewer.setLabelProvider(new AdapterFactoryLabelProvider(
-				getAdapterFactory()));
-		configTableViewer(tableViewer);
-
-		tableViewer.addSelectionChangedListener(this);
-	}
-
-	/**
-	 * 
-	 * @param parent
-	 * @param toolkit
-	 */
-	protected void createOperationSection(Composite parent, FormToolkit toolkit) {
-		Composite operationContainer = toolkit.createComposite(parent);
-		operationContainer.setLayoutData(new GridData(GridData.FILL_VERTICAL));
-
-		operationContainer.setLayout(new GridLayout());
-
-		Button addButton = toolkit.createButton(operationContainer,
-				EditorMessages.UI_Button_Add, SWT.PUSH);
-		GridData gd = new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		gd.grabExcessHorizontalSpace = false;
-		addButton.setLayoutData(gd);
-
-		addButton.addSelectionListener(new SelectionListener() {
-			public void widgetSelected(SelectionEvent e) {
-				addButtonSelected(e);
-			}
-
-			public void widgetDefaultSelected(SelectionEvent e) {
-				addButtonSelected(e);
-			}
-		});
-
-		setRemoveButton(toolkit.createButton(operationContainer,
-				EditorMessages.UI_Button_Remove, SWT.PUSH));
-
-		getRemoveButton().setEnabled(true);
-		gd = new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		gd.grabExcessHorizontalSpace = false;
-		getRemoveButton().setLayoutData(gd);
-		getRemoveButton().addSelectionListener(new SelectionListener() {
-			public void widgetSelected(SelectionEvent e) {
-				removeButtonSelected(e);
-			}
-
-			public void widgetDefaultSelected(SelectionEvent e) {
-				removeButtonSelected(e);
-			}
-		});
-	}
-
-
-	abstract void addButtonSelected(SelectionEvent e);
-
-	/**
-	 * Respond to selection of the remove button
-	 * @param e
-	 */
-	protected void removeButtonSelected(SelectionEvent e) {
-		IStructuredSelection ssel = StructuredSelection.EMPTY;
-		ISelection selection = getSelection();
-		if (selection instanceof IStructuredSelection) {
-			ssel = (IStructuredSelection) selection;
-		}
-
-		if (!ssel.isEmpty()) {
-			List commands = new ArrayList(ssel.size());
-			for (Iterator iter = ssel.iterator(); iter.hasNext();) {
-				EObject element = (EObject) iter.next();
-				if (element.eContainer().eContents().size() == 1) {
-					// if the parent only have this one child, then remove it
-					// together.
-					element = element.eContainer();
-				}
-				Command command = RemoveCommand.create(getEditingDomain(),
-						element);
-				commands.add(command);
-
-			}
-
-			CompoundCommand command = new CompoundCommand(commands);
-			if (command.canExecute()) {
-				getEditingDomain().getCommandStack().execute(command);
-			}
-		}
-	}
-
-	public ISelection getSelection() {
-		return tableViewer.getSelection();
-	}
-
-	/**
-	 * update all buttons with the current selection
-	 */
-	protected void updateButtons() {
-		if (!getRemoveButton().isDisposed()) {
-			IStructuredSelection ssel = (IStructuredSelection) getSelection();
-			getRemoveButton().setEnabled(!ssel.isEmpty());
-		}
-	}
-
-	public void refresh() {
-		super.refresh();
-		tableViewer.refresh();
-		updateButtons();
-	}
-
-	public void setSelection(ISelection selection) {
-		tableViewer.setSelection(selection);
-	}
-
-	/**
-	 * @return Returns the tableViewer.
-	 */
-	public TableViewer getTableViewer() {
-		return tableViewer;
-	}
-
-	public void refreshAll() {
-		setViewerInput(getInput());
-		updateButtons();
-	}
-
-	/**
-	 * set the structuredViewer's input
-	 * 
-	 * @param input
-	 */
-	abstract protected void setViewerInput(Object input);
-
-	public void expansionStateChanged(boolean expanded) {
-		if (expanded) {
-			if (tableViewer.getInput() == null) {
-				refreshAll();
-			}
-			tableViewer.setSelection(tableViewer.getSelection());
-		} else {
-			tableViewer.setSelection(null);
-		}
-		super.expansionStateChanged(expanded);
-	}
-
-	protected void expansionStateChanging(boolean expanding) {
-		if (!expanding) {
-			GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-			this.getSection().setLayoutData(gd);
-		} else {
-			((OthersPage) getPage()).closeOtherSections(this);
-
-			GridData gd = new GridData(GridData.FILL_BOTH);
-			this.getSection().setLayoutData(gd);
-		}
-
-		super.expansionStateChanging(expanding);
-	}
-
-	public void selectionChanged(SelectionChangedEvent event) {
-		super.selectionChanged(event);
-		updateButtons();
-	}
-
-    /**
-     * @param removeButton
-     */
-    protected void setRemoveButton(Button removeButton) {
-        this.removeButton = removeButton;
-    }
-
-    /**
-     * @return the button widget
-     */
-    protected Button getRemoveButton() {
-        return removeButton;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/OverviewComponentsSection.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/OverviewComponentsSection.java
deleted file mode 100644
index 4ef59aa..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/OverviewComponentsSection.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.section;
-
-import org.eclipse.jface.viewers.ColumnWeightData;
-import org.eclipse.jface.viewers.TableLayout;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.page.ComponentsPage;
-import org.eclipse.jst.jsf.facesconfig.ui.page.IFacesConfigPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * @author sfshi
- * @version
- */
-public class OverviewComponentsSection extends AbstractOverviewSection {
-
-	/**
-	 * 
-	 * @param parent
-	 * @param managedForm
-	 * @param page
-	 * @param toolkit
-	 */
-	public OverviewComponentsSection(Composite parent,
-			IManagedForm managedForm, IFacesConfigPage page, FormToolkit toolkit) {
-		super(parent, managedForm, page, toolkit, ComponentsPage.PAGE_ID,
-				EditorMessages.OverviewPage_ComponentsSection_name,
-				EditorMessages.OverviewPage_ComponentsSection_description,
-				null, null);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.section.AbstractOverviewSection#configTableViewer(org.eclipse.jface.viewers.TableViewer)
-	 */
-	protected void configTableViewer(TableViewer tableViewer1) {
-		tableViewer1.addFilter(new ViewerFilter() {
-			public boolean select(Viewer viewer, Object parentElement,
-					Object element) {
-				return FacesConfigPackage.eINSTANCE.getComponentType()
-						.isInstance(element)
-						|| FacesConfigPackage.eINSTANCE.getConverterType()
-								.isInstance(element)
-						|| FacesConfigPackage.eINSTANCE.getRenderKitType()
-								.isInstance(element)
-						|| FacesConfigPackage.eINSTANCE.getValidatorType()
-								.isInstance(element);
-			}
-		});
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.section.AbstractOverviewSection#createTable(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Table createTable(Composite container) {
-		Table table = new Table(container, SWT.H_SCROLL | SWT.V_SCROLL
-				| SWT.FULL_SELECTION | SWT.BORDER);
-
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		gd.horizontalSpan = 1;
-		gd.heightHint = 100;
-		table.setLayoutData(gd);
-
-		table.setLinesVisible(true);
-		table.setHeaderVisible(true);
-		TableLayout tablelayout = new TableLayout();
-		table.setLayout(tablelayout);
-
-		TableColumn typecol = new TableColumn(table, SWT.LEFT);
-		tablelayout.addColumnData(new ColumnWeightData(1, true));
-		typecol
-				.setText(EditorMessages.OverviewPage_ComponentsSection_table_namecol);
-		typecol.setResizable(true);
-
-		TableColumn namecol = new TableColumn(table, SWT.LEFT);
-		tablelayout.addColumnData(new ColumnWeightData(1, true));
-		namecol
-				.setText(EditorMessages.OverviewPage_ComponentsSection_table_typecol);
-		namecol.setResizable(true);
-
-		return table;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/OverviewGeneralSection.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/OverviewGeneralSection.java
deleted file mode 100644
index 8de1c9e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/OverviewGeneralSection.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.section;
-
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.page.IFacesConfigPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.part.FileEditorInput;
-
-/**
- * @author jchoi, Xiao-guang Zhang
- * @version
- */
-public class OverviewGeneralSection extends AbstractFacesConfigSection {
-
-	private Text versionText;
-
-	/**
-	 * @param parent
-	 * @param managedForm 
-	 * @param page 
-	 * @param toolkit
-	 */
-	public OverviewGeneralSection(Composite parent, IManagedForm managedForm,
-			IFacesConfigPage page, FormToolkit toolkit) {
-		super(parent, managedForm, page, toolkit, null, null);
-
-		getSection().setText(
-				EditorMessages.OverviewPage_GeneralSection_name);
-		getSection().setDescription(
-				EditorMessages.OverviewPage_GeneralSection_description);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.update.ui.forms.internal.FormSection#createClient(org.eclipse.swt.widgets.Composite,
-	 *      org.eclipse.update.ui.forms.internal.FormWidgetFactory)
-	 */
-	public void createContents(Composite container, FormToolkit toolkit) {
-		GridLayout layout = new GridLayout();
-		layout.numColumns = 2;
-		container.setLayout(layout);
-
-		IEditorInput editorInput = this.getPage().getEditor().getEditorInput();
-
-		toolkit.createLabel(container,
-				EditorMessages.OverviewPage_GeneralSection_label_name); 	 
-		Text typeText = toolkit.createText(container, ((FileEditorInput)editorInput).getName());
-		typeText.setEditable(false);
-		GridData data = new GridData(GridData.FILL_HORIZONTAL);
-		typeText.setLayoutData(data);
-
-		toolkit.createLabel(container,
-				EditorMessages.OverviewPage_GeneralSection_label_version);
-		versionText = toolkit.createText(container, ""); //$NON-NLS-1$
-		versionText.setLayoutData(data);
-		versionText.setEditable(false);
-
-		// set the service type description
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		versionText.setLayoutData(data);
-
-		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-		gd.horizontalSpan = 2;
-		Label sep = toolkit.createSeparator(container, SWT.HORIZONTAL);
-		sep.setLayoutData(gd);
-		toolkit.paintBordersFor(container);
-
-		// return container;
-	}
-
-	public void refreshAll() {
-		if (getInput() == null || !(getInput() instanceof EObject)) {
-			return;
-		}
-		
-//		FacesConfigType facesConfig = (FacesConfigType)getInput();
-		// TODO get the version and display it.
-		// String version = FacesConfigUtil
-		// .getFacesConfigVersion((IDOMModel) getInput());
-		//
-		// if (null == version) {
-		// Document document = ((IDOMModel) getInput()).getDocument();
-		// DocumentType doctype = document.getDoctype();
-		// if (doctype != null) {
-		// String pid = doctype.getPublicId();
-		// version = pid.substring(PUBLIC_ID.length() + 1);
-		// version = version.substring(version.indexOf(VERSION_PREFIX)
-		// + VERSION_PREFIX.length() + 1, version.indexOf("//"));
-		// }
-		// if (null == version) {
-		// version = "";
-		// }
-		// }
-		// versionText.setText(version);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/OverviewManagedBeanSection.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/OverviewManagedBeanSection.java
deleted file mode 100644
index c066246..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/OverviewManagedBeanSection.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.section;
-
-import org.eclipse.jface.viewers.ColumnWeightData;
-import org.eclipse.jface.viewers.TableLayout;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.page.IFacesConfigPage;
-import org.eclipse.jst.jsf.facesconfig.ui.page.ManagedBeanPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * @author sfshi
- * @version
- */
-public class OverviewManagedBeanSection extends AbstractOverviewSection {
-
-
-	/**
-	 * 
-	 * @param parent
-	 * @param managedForm
-	 * @param page
-	 * @param toolkit
-	 */
-	public OverviewManagedBeanSection(Composite parent,
-			IManagedForm managedForm, IFacesConfigPage page, FormToolkit toolkit) {
-		super(parent, managedForm, page, toolkit, ManagedBeanPage.PAGE_ID,
-				EditorMessages.OverviewPage_ManagedBeanSection_name,
-				EditorMessages.OverviewPage_ManagedBeanSection_description,
-				null, null);
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.section.AbstractOverviewSection#configTableViewer(org.eclipse.jface.viewers.TableViewer)
-	 */
-	protected void configTableViewer(TableViewer tableViewer1) {
-		tableViewer1.addFilter(new ViewerFilter() {
-			public boolean select(Viewer viewer, Object parentElement,
-					Object element) {
-				return FacesConfigPackage.eINSTANCE.getManagedBeanType()
-						.isInstance(element);
-			}
-		});
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.section.AbstractOverviewSection#createTable()
-	 */
-	protected Table createTable(Composite container) {
-		Table table = new Table(container, SWT.H_SCROLL | SWT.V_SCROLL
-				| SWT.FULL_SELECTION | SWT.BORDER);
-
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		gd.horizontalSpan = 1;
-		gd.heightHint = 100;
-		table.setLayoutData(gd);
-
-		table.setLinesVisible(true);
-		table.setHeaderVisible(true);
-		TableLayout tablelayout = new TableLayout();
-		table.setLayout(tablelayout);
-
-		TableColumn namecol = new TableColumn(table, SWT.LEFT);
-		namecol
-				.setText(EditorMessages.OverviewPage_ManagedBeanSection_table_namecol);
-		tablelayout.addColumnData(new ColumnWeightData(1, true));
-		namecol.setResizable(true);
-
-		TableColumn scopecol = new TableColumn(table, SWT.LEFT);
-		scopecol
-				.setText(EditorMessages.OverviewPage_ManagedBeanSection_table_scopecol);
-		tablelayout.addColumnData(new ColumnWeightData(1, true));
-		scopecol.setResizable(true);
-
-		TableColumn classcol = new TableColumn(table, SWT.LEFT);
-		classcol
-				.setText(EditorMessages.OverviewPage_ManagedBeanSection_table_classcol);
-		tablelayout.addColumnData(new ColumnWeightData(1, true));
-		classcol.setResizable(true);
-
-		return table;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/OverviewNavigationSection.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/OverviewNavigationSection.java
deleted file mode 100644
index ae4bd8a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/OverviewNavigationSection.java
+++ /dev/null
@@ -1,403 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.section;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.impl.AdapterImpl;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.jface.viewers.ColumnWeightData;
-import org.eclipse.jface.viewers.ILabelProviderListener;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.ITableLabelProvider;
-import org.eclipse.jface.viewers.TableLayout;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType;
-import org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType;
-import org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.page.IFacesConfigPage;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.PageflowEditor;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * @author sfshi
- * 
- */
-public class OverviewNavigationSection extends AbstractOverviewSection {
-
-	private static final int COLUMN_WITH = 70;
-
-	private OverviewNavigationSectionAdapter overviewNavigationSectionAdapter;
-
-	/**
-	 * 
-	 * @param parent
-	 * @param managedForm
-	 * @param page
-	 * @param toolkit
-	 */
-	public OverviewNavigationSection(Composite parent,
-			IManagedForm managedForm, IFacesConfigPage page, FormToolkit toolkit) {
-		super(parent, managedForm, page, toolkit, PageflowEditor.PAGE_ID,
-				EditorMessages.OverviewPage_NavigationSection_name,
-				EditorMessages.OverviewPage_NavigationSection_description,
-				null, null);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.section.AbstractOverviewSection#configTableViewer(org.eclipse.jface.viewers.TableViewer)
-	 */
-	protected void configTableViewer(TableViewer tableViewer1) {
-		tableViewer1.setContentProvider(new IStructuredContentProvider() {
-
-			public Object[] getElements(Object inputElement) {
-				List navigationCaseList = (List) inputElement;
-				return navigationCaseList.toArray();
-			}
-
-			public void dispose() {
-			    // nothing to dispose
-			}
-
-			public void inputChanged(Viewer viewer, Object oldInput,
-					Object newInput) {
-			    // do nothing
-			}
-		});
-
-		tableViewer1.setLabelProvider(new ITableLabelProvider() {
-
-			public Image getColumnImage(Object element, int columnIndex) {
-				return null;
-			}
-
-			public String getColumnText(Object element, int columnIndex) {
-				NavigationCaseType navigationCase = (NavigationCaseType) element;
-				switch (columnIndex) {
-
-				case 0:
-					return ((NavigationRuleType) navigationCase.eContainer())
-							.getFromViewId() == null ? "" //$NON-NLS-1$
-							: ((NavigationRuleType) navigationCase.eContainer())
-									.getFromViewId().getTextContent();
-
-				case 1:
-					return navigationCase.getFromOutcome() == null ? "" //$NON-NLS-1$
-							: navigationCase.getFromOutcome().getTextContent();
-
-				case 2:
-					return navigationCase.getToViewId() == null ? "" //$NON-NLS-1$
-							: navigationCase.getToViewId().getTextContent();
-				}
-				return null;
-			}
-
-			public void addListener(ILabelProviderListener listener) {
-			    // no listeners?
-			}
-
-			public void dispose() {
-			    // do nothing
-			}
-
-			public boolean isLabelProperty(Object element, String property) {
-				return false;
-			}
-
-			public void removeListener(ILabelProviderListener listener) {
-			    // no listeners?
-			}
-		});
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.section.AbstractOverviewSection#createTable(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Table createTable(Composite container) {
-		Table table = new Table(container, SWT.H_SCROLL | SWT.V_SCROLL
-				| SWT.FULL_SELECTION | SWT.BORDER | SWT.BORDER);
-
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		gd.horizontalSpan = 1;
-		gd.heightHint = 100;
-		table.setLayoutData(gd);
-
-		table.setLinesVisible(true);
-		table.setHeaderVisible(true);
-		TableLayout tablelayout = new TableLayout();
-		table.setLayout(tablelayout);
-
-		TableColumn column1 = new TableColumn(table, SWT.LEFT);
-		column1
-				.setText(EditorMessages.OverviewPage_NavigationSection_table_col1);
-		// column1.setWidth(COLUMN_WITH);
-		tablelayout.addColumnData(new ColumnWeightData(1, COLUMN_WITH, true));
-		// tablelayout.addColumnData(new ColumnWeightData(1, true));
-		column1.setResizable(true);
-
-		TableColumn column2 = new TableColumn(table, SWT.LEFT);
-		column2
-				.setText(EditorMessages.OverviewPage_NavigationSection_table_col2);
-		tablelayout.addColumnData(new ColumnWeightData(1, COLUMN_WITH, true));
-		// tablelayout.addColumnData(new ColumnWeightData(1, true));
-		column2.setResizable(true);
-		// column2.setWidth(COLUMN_WITH);
-
-		TableColumn column3 = new TableColumn(table, SWT.LEFT);
-		column3
-				.setText(EditorMessages.OverviewPage_NavigationSection_table_col3);
-		tablelayout.addColumnData(new ColumnWeightData(1, COLUMN_WITH, true));
-		// tablelayout.addColumnData(new ColumnWeightData(1, true));
-		column3.setResizable(true);
-		// column3.setWidth(COLUMN_WITH);
-
-		return table;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.section.IFacesConfigSection#refreshAll()
-	 */
-	public void refreshAll() {			
-		List navigationCaseList = new ArrayList();
-		if (getInput() instanceof FacesConfigType) {
-			List navigationRules = ((FacesConfigType) getInput())
-					.getNavigationRule();
-			for (int i = 0, n = navigationRules.size(); i < n; i++) {
-				NavigationRuleType navigationRule = (NavigationRuleType) navigationRules
-						.get(i);
-				navigationCaseList.addAll(navigationRule.getNavigationCase());
-			}
-		}
-
-		tableViewer.setInput(navigationCaseList);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.section.AbstractFacesConfigSection#addAdaptersOntoInput(java.lang.Object)
-	 */
-	protected void addAdaptersOntoInput(Object newInput) {
-		FacesConfigType facesConfig = (FacesConfigType) newInput;
-		addOverviewNavigationSectionAdapter(facesConfig);
-
-		for (Iterator it = facesConfig.getNavigationRule().iterator(); it
-				.hasNext();) {
-			NavigationRuleType navigationRule = (NavigationRuleType) it.next();
-
-			addOverviewNavigationSectionAdapter(navigationRule);
-
-			if (navigationRule.getFromViewId() != null) {
-				addOverviewNavigationSectionAdapter(navigationRule
-						.getFromViewId());
-			}
-
-			for (Iterator it2 = navigationRule.getNavigationCase().iterator(); it2
-					.hasNext();) {
-				NavigationCaseType navigationCase = (NavigationCaseType) it2
-						.next();
-				addOverviewNavigationSectionAdapter(navigationCase);
-
-				if (navigationCase.getFromOutcome() != null) {
-					addOverviewNavigationSectionAdapter(navigationCase
-							.getFromOutcome());
-				}
-
-				if (navigationCase.getToViewId() != null) {
-					addOverviewNavigationSectionAdapter(navigationCase
-							.getToViewId());
-				}
-			}
-		}
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.section.AbstractFacesConfigSection#removeAdaptersFromInput(java.lang.Object)
-	 */
-	protected void removeAdaptersFromInput(Object oldInput) {
-		super.removeAdaptersFromInput(oldInput);		
-		FacesConfigType facesConfig = (FacesConfigType) oldInput;
-		removeOverviewNavigationSectionAdapter(facesConfig);
-		
-		for (Iterator it = facesConfig.getNavigationRule().iterator(); it
-				.hasNext();) {
-			NavigationRuleType navigationRule = (NavigationRuleType) it.next();
-
-			removeOverviewNavigationSectionAdapter(navigationRule);
-
-			if (navigationRule.getFromViewId() != null) {
-				removeOverviewNavigationSectionAdapter(navigationRule
-						.getFromViewId());
-			}
-
-			for (Iterator it2 = navigationRule.getNavigationCase().iterator(); it2
-					.hasNext();) {
-				NavigationCaseType navigationCase = (NavigationCaseType) it2
-						.next();
-				removeOverviewNavigationSectionAdapter(navigationCase);
-
-				if (navigationCase.getFromOutcome() != null) {
-					removeOverviewNavigationSectionAdapter(navigationCase
-							.getFromOutcome());
-				}
-
-				if (navigationCase.getToViewId() != null) {
-					removeOverviewNavigationSectionAdapter(navigationCase
-							.getToViewId());
-				}
-			}
-		}
-
-	}
-
-	private void addOverviewNavigationSectionAdapter(EObject object) {
-		if (EcoreUtil.getExistingAdapter(object,
-				OverviewNavigationSection.class) == null) {
-			object.eAdapters().add(getOverviewNavigationSectionAdapter());
-		}
-
-	}
-	
-	private void removeOverviewNavigationSectionAdapter(EObject object) {
-		if (object != null && EcoreUtil.getExistingAdapter(object,
-				OverviewNavigationSection.class) != null) {
-			object.eAdapters().remove(getOverviewNavigationSectionAdapter());
-		}
-	}
-
-	private OverviewNavigationSectionAdapter getOverviewNavigationSectionAdapter() {
-		if (overviewNavigationSectionAdapter == null)
-			overviewNavigationSectionAdapter = new OverviewNavigationSectionAdapter();
-		return overviewNavigationSectionAdapter;
-	}
-
-	class OverviewNavigationSectionAdapter extends AdapterImpl {
-
-		public boolean isAdapterForType(Object type) {
-			if (type == OverviewNavigationSection.class)
-				return true;
-			return false;
-		}
-
-		public void notifyChanged(Notification msg) {
-
-			if ((msg.getFeature() == FacesConfigPackage.eINSTANCE
-					.getFacesConfigType_NavigationRule()
-					|| msg.getFeature() == FacesConfigPackage.eINSTANCE
-							.getNavigationRuleType_NavigationCase()
-					|| msg.getFeature() == FacesConfigPackage.eINSTANCE
-							.getNavigationRuleType_FromViewId() || msg
-					.getFeature() == FacesConfigPackage.eINSTANCE
-					.getFromViewIdType_TextContent())) {
-				if (msg.getEventType() == Notification.ADD
-						|| msg.getEventType() == Notification.SET) {
-					if (msg.getNewValue() instanceof EObject) {
-						EObject newObject = (EObject) msg.getNewValue();
-						addOverviewNavigationSectionAdapter(newObject);
-					}
-				}
-				if (msg.getEventType() == Notification.ADD
-						|| msg.getEventType() == Notification.REMOVE
-						|| msg.getEventType() == Notification.SET)
-					if (Thread.currentThread() == PlatformUI.getWorkbench().getDisplay().getThread()) {
-						refreshAll();
-					} else {
-						PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
-							public void run() {
-								refreshAll();
-							}	
-						});
-					}
-					return;
-			}
-
-			if (msg.getFeature() == FacesConfigPackage.eINSTANCE
-					.getNavigationCaseType_FromOutcome()
-					|| msg.getFeature() == FacesConfigPackage.eINSTANCE
-							.getNavigationCaseType_ToViewId()) {
-
-				if (msg.getEventType() == Notification.ADD
-						|| msg.getEventType() == Notification.SET) {
-					if (msg.getNewValue() instanceof EObject) {
-						EObject newObject = (EObject) msg.getNewValue();
-						addOverviewNavigationSectionAdapter(newObject);
-					}
-				}
-				if (msg.getEventType() == Notification.ADD
-
-				|| msg.getEventType() == Notification.REMOVE
-						|| msg.getEventType() == Notification.SET) {
-
-					NavigationCaseType navigationCase = (NavigationCaseType) msg
-							.getNotifier();
-					refreshViewerOnUIThread(navigationCase);
-				}
-				return;
-			}
-
-			if (msg.getFeature() == FacesConfigPackage.eINSTANCE
-					.getFromOutcomeType_TextContent()
-					|| msg.getFeature() == FacesConfigPackage.eINSTANCE
-							.getToViewIdType_TextContent()) {
-
-				if (msg.getEventType() == Notification.ADD
-						|| msg.getEventType() == Notification.REMOVE
-						|| msg.getEventType() == Notification.SET) {
-					NavigationCaseType navigationCase = (NavigationCaseType) ((EObject) msg
-							.getNotifier()).eContainer();
-					refreshViewerOnUIThread(navigationCase);
-				}
-				return;
-			}
-
-		}
-
-		private void refreshViewerOnUIThread(final NavigationCaseType navigationCase) {
-			if (Thread.currentThread() == PlatformUI.getWorkbench().getDisplay().getThread()) {
-					tableViewer.refresh(navigationCase);
-			} else {
-				PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
-					public void run() {
-						tableViewer.refresh(navigationCase);
-					}
-				});
-			}
-			
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/OverviewOthersSection.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/OverviewOthersSection.java
deleted file mode 100644
index a1179bc..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/OverviewOthersSection.java
+++ /dev/null
@@ -1,361 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.section;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.impl.AdapterImpl;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.jface.viewers.ColumnWeightData;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.TableLayout;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jst.jsf.facesconfig.emf.ApplicationType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType;
-import org.eclipse.jst.jsf.facesconfig.emf.FactoryType;
-import org.eclipse.jst.jsf.facesconfig.emf.LifecycleType;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.page.IFacesConfigPage;
-import org.eclipse.jst.jsf.facesconfig.ui.page.OthersPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * @author sfshi
- * 
- */
-public class OverviewOthersSection extends AbstractOverviewSection {
-
-	private static final int COLUMN_WITH = 100;
-
-	private OverviewOthersSectionAdapter overviewOthersSectionAdapter;
-
-	/**
-	 * 
-	 * @param parent
-	 * @param managedForm
-	 * @param page
-	 * @param toolkit
-	 */
-	public OverviewOthersSection(Composite parent, IManagedForm managedForm,
-			IFacesConfigPage page, FormToolkit toolkit) {
-		super(parent, managedForm, page, toolkit, OthersPage.PAGE_ID,
-				EditorMessages.OverviewPage_OthersSection_name,
-				EditorMessages.OverviewPage_OthersSection_description,
-				null, null);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.section.AbstractOverviewSection#configTableViewer(org.eclipse.jface.viewers.TableViewer)
-	 */
-	protected void configTableViewer(TableViewer tableViewer1) {
-		tableViewer1.setContentProvider(new IStructuredContentProvider() {
-
-			public Object[] getElements(Object inputElement) {
-				List othersNodesList = (List) inputElement;
-				return othersNodesList.toArray();
-			}
-
-			public void dispose() {
-                // do nothing
-			}
-
-			public void inputChanged(Viewer viewer, Object oldInput,
-					Object newInput) {
-			    // do nothing
-			}
-		});
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.section.AbstractOverviewSection#createTable(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Table createTable(Composite container) {
-		Table table = new Table(container, SWT.H_SCROLL | SWT.V_SCROLL
-				| SWT.FULL_SELECTION | SWT.BORDER);
-
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		gd.horizontalSpan = 1;
-		gd.heightHint = 100;
-		table.setLayoutData(gd);
-
-		table.setLinesVisible(true);
-		table.setHeaderVisible(true);
-		TableLayout tablelayout = new TableLayout();
-		table.setLayout(tablelayout);
-
-		TableColumn valuecol = new TableColumn(table, SWT.NONE);
-		tablelayout.addColumnData(new ColumnWeightData(1, COLUMN_WITH, true));
-		valuecol
-				.setText(EditorMessages.OverviewPage_OthersSection_table_valuecol);
-		valuecol.setResizable(true);
-
-		TableColumn typecol = new TableColumn(table, SWT.NONE);
-		tablelayout.addColumnData(new ColumnWeightData(1, COLUMN_WITH, true));
-		typecol
-				.setText(EditorMessages.OverviewPage_OthersSection_table_typecol);
-		typecol.setResizable(true);
-
-		return table;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.section.AbstractOverviewSection#refreshAll()
-	 */
-	public void refreshAll() {
-		if(getSection() == null || getSection().isDisposed()) {
-			return;
-		}
-		List othersNodesList = new ArrayList();
-		if (getInput() instanceof FacesConfigType) {
-			Object[] applicationNodes = null;
-			Object[] factoryNodes = null;
-			Object[] lifecycleNodes = null;
-			FacesConfigType facesConfig = (FacesConfigType) getInput();
-			IStructuredContentProvider contentProvider = new AdapterFactoryContentProvider(
-					getAdapterFactory());
-			if (facesConfig.getApplication().size() > 0) {
-
-				ApplicationType application = (ApplicationType) facesConfig
-						.getApplication().get(0);
-				applicationNodes = contentProvider.getElements(application);
-
-			}
-
-			if (facesConfig.getFactory().size() > 0) {
-				FactoryType factory = (FactoryType) facesConfig.getFactory()
-						.get(0);
-				factoryNodes = contentProvider.getElements(factory);
-			}
-
-			if (facesConfig.getLifecycle().size() > 0) {
-				LifecycleType lifecycle = (LifecycleType) facesConfig
-						.getLifecycle().get(0);
-				lifecycleNodes = contentProvider.getElements(lifecycle);
-			}
-
-			if (applicationNodes != null) {
-				for (int i = 0, n = applicationNodes.length; i < n; i++) {
-					othersNodesList.add(applicationNodes[i]);
-				}
-			}
-
-			if (factoryNodes != null) {
-				for (int i = 0, n = factoryNodes.length; i < n; i++) {
-					othersNodesList.add(factoryNodes[i]);
-				}
-			}
-
-			if (lifecycleNodes != null) {
-				for (int i = 0, n = lifecycleNodes.length; i < n; i++) {
-					othersNodesList.add(lifecycleNodes[i]);
-				}
-			}
-		}
-
-		tableViewer.setInput(othersNodesList);
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.section.AbstractFacesConfigSection#addAdaptersOntoInput(java.lang.Object)
-	 */
-	protected void addAdaptersOntoInput(Object newInput) {
-		FacesConfigType facesConfig = (FacesConfigType) newInput;
-		addOverviewOthersSectionAdapter(facesConfig);
-		IStructuredContentProvider contentProvider = new AdapterFactoryContentProvider(
-				getAdapterFactory());
-		if (facesConfig.getApplication().size() > 0) {
-			ApplicationType application = (ApplicationType) facesConfig
-					.getApplication().get(0);
-			addOverviewOthersSectionAdapter(application);
-
-			Object[] applicationNodes = contentProvider
-					.getElements(application);
-			for (int i = 0, n = applicationNodes.length; i < n; i++) {
-				addOverviewOthersSectionAdapter((EObject) applicationNodes[i]);
-			}
-
-		}
-
-		if (facesConfig.getFactory().size() > 0) {
-			FactoryType factory = (FactoryType) facesConfig.getFactory().get(0);
-			addOverviewOthersSectionAdapter(factory);
-
-			Object[] factoryNodes = contentProvider.getElements(factory);
-			for (int i = 0, n = factoryNodes.length; i < n; i++) {
-				addOverviewOthersSectionAdapter((EObject) factoryNodes[i]);
-			}
-
-		}
-
-		if (facesConfig.getLifecycle().size() > 0) {
-			LifecycleType lifecycle = (LifecycleType) facesConfig
-					.getLifecycle().get(0);
-			addOverviewOthersSectionAdapter(lifecycle);
-
-			Object[] lifecycleNodes = contentProvider.getElements(lifecycle);
-			for (int i = 0, n = lifecycleNodes.length; i < n; i++) {
-				addOverviewOthersSectionAdapter((EObject) lifecycleNodes[i]);
-			}
-
-		}
-
-	}
-
-	private void addOverviewOthersSectionAdapter(EObject object) {
-		if (EcoreUtil.getExistingAdapter(object, OverviewOthersSection.class) == null) {
-			object.eAdapters().add(getOverviewOthersSectionAdapter());
-		}
-
-	}
-
-	private void removeOverviewOthersSectionAdapter(EObject object) {
-		if (EcoreUtil.getExistingAdapter(object, OverviewOthersSection.class) != null) {
-			object.eAdapters().remove(getOverviewOthersSectionAdapter());
-		}
-	}
-
-	private OverviewOthersSectionAdapter getOverviewOthersSectionAdapter() {
-		if (overviewOthersSectionAdapter == null) {
-			overviewOthersSectionAdapter = new OverviewOthersSectionAdapter();
-		}
-
-		return overviewOthersSectionAdapter;
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.section.AbstractFacesConfigSection#removeAdaptersFromInput(java.lang.Object)
-	 */
-	protected void removeAdaptersFromInput(Object oldInput) {
-
-		FacesConfigType facesConfig = (FacesConfigType) oldInput;
-		removeOverviewOthersSectionAdapter(facesConfig);
-		IStructuredContentProvider contentProvider = new AdapterFactoryContentProvider(
-				getAdapterFactory());
-		if (facesConfig.getApplication().size() > 0) {
-			ApplicationType application = (ApplicationType) facesConfig
-					.getApplication().get(0);
-			removeOverviewOthersSectionAdapter(application);
-
-			Object[] applicationNodes = contentProvider
-					.getElements(application);
-			for (int i = 0, n = applicationNodes.length; i < n; i++) {
-				removeOverviewOthersSectionAdapter((EObject) applicationNodes[i]);
-			}
-
-		}
-
-		if (facesConfig.getFactory().size() > 0) {
-			FactoryType factory = (FactoryType) facesConfig.getFactory().get(0);
-			removeOverviewOthersSectionAdapter(factory);
-
-			Object[] factoryNodes = contentProvider.getElements(factory);
-			for (int i = 0, n = factoryNodes.length; i < n; i++) {
-				removeOverviewOthersSectionAdapter((EObject) factoryNodes[i]);
-			}
-
-		}
-
-		if (facesConfig.getLifecycle().size() > 0) {
-			LifecycleType lifecycle = (LifecycleType) facesConfig
-					.getLifecycle().get(0);
-			removeOverviewOthersSectionAdapter(lifecycle);
-
-			Object[] lifecycleNodes = contentProvider.getElements(lifecycle);
-			for (int i = 0, n = lifecycleNodes.length; i < n; i++) {
-				removeOverviewOthersSectionAdapter((EObject) lifecycleNodes[i]);
-			}
-
-		}
-
-	}
-
-	class OverviewOthersSectionAdapter extends AdapterImpl {
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.emf.common.notify.impl.AdapterImpl#isAdapterForType(java.lang.Object)
-		 */
-		public boolean isAdapterForType(Object type) {
-			if (type == OverviewOthersSection.class)
-				return true;
-			return false;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.emf.common.notify.impl.AdapterImpl#notifyChanged(org.eclipse.emf.common.notify.Notification)
-		 */
-		public void notifyChanged(Notification msg) {
-			if (msg.getFeature() == FacesConfigPackage.eINSTANCE
-					.getFacesConfigType_Application()
-					|| msg.getFeature() == FacesConfigPackage.eINSTANCE
-							.getFacesConfigType_Factory()
-					|| msg.getFeature() == FacesConfigPackage.eINSTANCE
-							.getFacesConfigType_Lifecycle()
-					|| msg.getNotifier() instanceof ApplicationType
-					|| msg.getNotifier() instanceof FactoryType
-					|| msg.getNotifier() instanceof LifecycleType) {
-
-				if (msg.getEventType() == Notification.ADD) {
-					EObject newObject = (EObject) msg.getNewValue();
-					if (newObject != null) {
-						addOverviewOthersSectionAdapter(newObject);
-					}
-				}
-
-				if (msg.getEventType() == Notification.ADD
-						|| msg.getEventType() == Notification.REMOVE
-						|| msg.getEventType() == Notification.SET) {
-					
-					if (Thread.currentThread() == PlatformUI.getWorkbench().getDisplay().getThread()) {
-						refreshAll();
-					} else {
-						PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
-							public void run() {
-								refreshAll();
-							}
-						});
-					}
-				}
-			}
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/PropertySection.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/PropertySection.java
deleted file mode 100644
index e3ca1a1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/PropertySection.java
+++ /dev/null
@@ -1,505 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.section;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.command.CompoundCommand;
-import org.eclipse.emf.edit.command.AddCommand;
-import org.eclipse.emf.edit.command.RemoveCommand;
-import org.eclipse.emf.edit.command.SetCommand;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.viewers.ColumnWeightData;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.TableLayout;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.jst.jsf.facesconfig.emf.DefaultValueType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.PropertyClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.PropertyNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.PropertyType;
-import org.eclipse.jst.jsf.facesconfig.emf.SuggestedValueType;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.dialog.AddEditPropertyDialog;
-import org.eclipse.jst.jsf.facesconfig.ui.page.IFacesConfigPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.MouseAdapter;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * Section for properties
- *
- */
-public class PropertySection extends AbstractFacesConfigSection {
-
-	private static final int TABLE_DEFAULT_HEIGHT = 160;
-
-	private TableViewer tableViewer;
-
-	private Button removeButton;
-
-	private Button editButton;
-
-	/**
-	 * 
-	 * @param parent
-	 * @param managedForm
-	 * @param page
-	 * @param toolkit
-	 */
-	public PropertySection(Composite parent, IManagedForm managedForm,
-			IFacesConfigPage page, FormToolkit toolkit) {
-		super(parent, managedForm, page, toolkit, null, null);
-		this.getSection().setText(EditorMessages.PropertySection_Name);
-		this.getSection().setDescription(
-				EditorMessages.PropertySection_Description);
-
-	}
-
-	/**
-	 * @param container
-	 * @param toolkit
-	 */
-	protected void createContents(Composite container, FormToolkit toolkit) {
-		GridLayout gl = new GridLayout();
-		gl.horizontalSpacing = 0;
-		gl.marginWidth = 0;
-		gl.numColumns = 2;
-		container.setLayout(gl);
-		GridData td = new GridData(GridData.FILL_BOTH);
-		container.setLayoutData(td);
-
-		toolkit.paintBordersFor(container);
-
-		Composite propertySection = toolkit.createComposite(container);
-		GridLayout gl2 = new GridLayout();
-		gl2.horizontalSpacing = 0;
-		gl2.verticalSpacing = 0;
-		gl2.marginWidth = 0;
-		gl2.marginHeight = 0;
-		gl2.numColumns = 2;
-		propertySection.setLayout(gl2);
-		GridData gd = new GridData(GridData.FILL_BOTH
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		propertySection.setLayoutData(gd);
-
-		createTableSection(propertySection, toolkit);
-		createButtonsSection(propertySection, toolkit);
-
-	}
-
-	/**
-	 * create table section
-	 * 
-	 * @param container
-	 * @param toolkit
-	 */
-	private void createTableSection(Composite container, FormToolkit toolkit) {
-		Composite tableContainer = toolkit.createComposite(container);
-		GridData gd = new GridData(GridData.FILL_BOTH
-				| GridData.GRAB_HORIZONTAL);
-		tableContainer.setLayoutData(gd);
-		toolkit.paintBordersFor(tableContainer);
-
-		GridLayout gl = new GridLayout();
-		tableContainer.setLayout(gl);
-
-		Table table = new Table(tableContainer, SWT.H_SCROLL | SWT.V_SCROLL
-				| SWT.FULL_SELECTION | SWT.BORDER);
-		gd = new GridData(GridData.FILL_BOTH);
-		gd.horizontalSpan = 1;
-		gd.heightHint = TABLE_DEFAULT_HEIGHT;
-		table.setLayoutData(gd);
-
-		table.setHeaderVisible(true);
-		table.setLinesVisible(true);
-		TableLayout layout = new TableLayout();
-		table.setLayout(layout);
-
-		TableColumn nameCol = new TableColumn(table, SWT.NONE);
-		layout.addColumnData(new ColumnWeightData(1, true));
-		nameCol.setText(EditorMessages.PropertySection_Table_NameColumn);
-
-		TableColumn classCol = new TableColumn(table, SWT.NONE);
-		layout.addColumnData(new ColumnWeightData(1, true));
-		classCol
-				.setText(EditorMessages.PropertySection_Table_ClassColumn);
-
-		TableColumn valueCol = new TableColumn(table, SWT.NONE);
-		layout.addColumnData(new ColumnWeightData(1, true));
-		valueCol
-				.setText(EditorMessages.PropertySection_Table_DefaultValueColumn);
-
-		TableColumn suggestedValueCol = new TableColumn(table, SWT.NONE);
-		layout.addColumnData(new ColumnWeightData(1, true));
-		suggestedValueCol
-				.setText(EditorMessages.PropertySection_Table_SuggestedValueColumn);
-
-		table.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				updateButtons();
-			}
-		});
-
-		table.addMouseListener(new MouseAdapter() {
-			public void mouseDoubleClick(MouseEvent e) {
-				if (((IStructuredSelection) tableViewer.getSelection()).size() > 0)
-					editButtonSelected();
-			}
-		});
-
-		tableViewer = new TableViewer(table);
-		tableViewer.setContentProvider(new AdapterFactoryContentProvider(
-				getAdapterFactory()));
-		tableViewer.setLabelProvider(new AdapterFactoryLabelProvider(
-				getAdapterFactory()));
-
-		tableViewer.addFilter(new ViewerFilter() {
-			public boolean select(Viewer viewer, Object parentElement,
-					Object element) {
-				return FacesConfigPackage.eINSTANCE.getPropertyType()
-						.isInstance(element);
-			}
-		});
-		tableViewer.addSelectionChangedListener(this);
-	}
-
-	/**
-	 * Update the buttons' enable and disable status
-	 */
-	private void updateButtons() {
-		if (((IStructuredSelection) tableViewer.getSelection()).size() > 0) {
-			editButton.setEnabled(true);
-			removeButton.setEnabled(true);
-		} else {
-			editButton.setEnabled(false);
-			removeButton.setEnabled(false);
-		}
-	}
-
-	/**
-	 * create property's editing buttons
-	 * 
-	 * @param container
-	 * @param toolkit
-	 */
-	private void createButtonsSection(Composite container, FormToolkit toolkit) {
-		// create operation buttons's container
-		Composite operationContainer = toolkit.createComposite(container);
-		GridData gd = new GridData(GridData.FILL_VERTICAL
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		operationContainer.setLayoutData(gd);
-		GridLayout gl = new GridLayout();
-		operationContainer.setLayout(gl);
-
-		Button addButton = toolkit.createButton(operationContainer,
-				EditorMessages.UI_Button_Add_more,
-				SWT.PUSH);
-		gd = new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		gd.grabExcessHorizontalSpace = false;
-		addButton.setLayoutData(gd);
-
-		editButton = toolkit.createButton(operationContainer,
-				EditorMessages.UI_Button_Edit_more,
-				SWT.PUSH);
-		gd = new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		gd.grabExcessHorizontalSpace = false;
-		editButton.setLayoutData(gd);
-
-		removeButton = toolkit.createButton(operationContainer,
-				EditorMessages.UI_Button_Remove,
-				SWT.PUSH);
-		gd = new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		gd.grabExcessHorizontalSpace = false;
-		removeButton.setLayoutData(gd);
-
-		addButton.addSelectionListener(new SelectionAdapter() {
-
-			public void widgetSelected(SelectionEvent e) {
-				addButtonSelected();
-			}
-
-		});
-
-		editButton.addSelectionListener(new SelectionAdapter() {
-
-			public void widgetSelected(SelectionEvent e) {
-				editButtonSelected();
-			}
-
-		});
-		removeButton.addSelectionListener(new SelectionAdapter() {
-
-			public void widgetSelected(SelectionEvent e) {
-				removeButtonSelected();
-			}
-
-		});
-	}
-
-	/**
-	 * refresh the table viewer and update buttons.
-	 */
-	public void refresh() {
-		super.refresh();
-		tableViewer.refresh();
-		updateButtons();
-	}
-
-	/**
-	 * 
-	 */
-	public void refreshAll() {
-		tableViewer.setInput(getInput());
-		updateButtons();
-
-	}
-
-	/**
-	 * add a property.
-	 * 
-	 */
-	private void addButtonSelected() {
-
-		Shell shell = EditorPlugin.getActiveShell();
-
-		AddEditPropertyDialog dialog = new AddEditPropertyDialog(shell, true);
-		dialog.setProject((IProject) getPage().getEditor().getAdapter(
-				IProject.class));
-		if (dialog.open() == Dialog.OK) {
-
-			PropertyType newProperty = FacesConfigFactory.eINSTANCE
-					.createPropertyType();
-
-			if (dialog.getPropertyName().length() > 0) {
-				PropertyNameType propertyNameType = FacesConfigFactory.eINSTANCE
-						.createPropertyNameType();
-				propertyNameType.setTextContent(dialog.getPropertyName());
-				newProperty.setPropertyName(propertyNameType);
-			}
-
-			if (dialog.getPropertyClass().length() > 0) {
-				PropertyClassType propertyClassType = FacesConfigFactory.eINSTANCE
-						.createPropertyClassType();
-				propertyClassType.setTextContent(dialog.getPropertyClass());
-				newProperty.setPropertyClass(propertyClassType);
-			}
-
-			if (dialog.getDefaultValue().length() > 0) {
-				DefaultValueType defaultValueType = FacesConfigFactory.eINSTANCE
-						.createDefaultValueType();
-				defaultValueType.setTextContent(dialog.getDefaultValue());
-				newProperty.setDefaultValue(defaultValueType);
-			}
-
-			if (dialog.getSuggestedValue().length() > 0) {
-				SuggestedValueType suggestedValueType = FacesConfigFactory.eINSTANCE
-						.createSuggestedValueType();
-				suggestedValueType.setTextContent(dialog.getSuggestedValue());
-				newProperty.setSuggestedValue(suggestedValueType);
-			}
-
-			Command addCommand = AddCommand.create(this.getEditingDomain(),
-					getInput(), null, newProperty);
-			if (addCommand.canExecute()) {
-				this.getEditingDomain().getCommandStack().execute(addCommand);
-
-			}
-		}
-
-	}
-
-	/**
-	 * edit a property.
-	 * 
-	 */
-	private void editButtonSelected() {
-
-		PropertyType property = (PropertyType) ((IStructuredSelection) tableViewer
-				.getSelection()).getFirstElement();
-
-		Assert.isNotNull(property);
-
-		Shell shell = EditorPlugin.getActiveShell();
-
-		AddEditPropertyDialog dialog = new AddEditPropertyDialog(shell, false);
-		dialog.setProject((IProject) getPage().getEditor().getAdapter(
-				IProject.class));
-		if (property.getPropertyName() != null) {
-			dialog.setPropertyName(property.getPropertyName().getTextContent());
-		}
-
-		if (property.getPropertyClass() != null) {
-			dialog.setPropertyClass(property.getPropertyClass()
-					.getTextContent());
-		}
-
-		if (property.getDefaultValue() != null) {
-			dialog.setDefaultValue(property.getDefaultValue().getTextContent());
-		}
-
-		if (property.getSuggestedValue() != null) {
-			dialog.setSuggestedValue(property.getSuggestedValue()
-					.getTextContent());
-		}
-
-		if (dialog.open() == Dialog.OK) {
-			List commands = new ArrayList(4);
-
-			if (property.getPropertyName() != null) {
-				Command cmd1 = SetCommand.create(this.getEditingDomain(),
-						property.getPropertyName(),
-						FacesConfigPackage.eINSTANCE
-								.getPropertyNameType_TextContent(), dialog
-								.getPropertyName());
-				commands.add(cmd1);
-			} else if (dialog.getPropertyName().length() > 0) {
-				PropertyNameType propertyNameType = FacesConfigFactory.eINSTANCE
-						.createPropertyNameType();
-				propertyNameType.setTextContent(dialog.getPropertyName());
-
-				Command cmd2 = AddCommand.create(this.getEditingDomain(),
-						property, FacesConfigPackage.eINSTANCE
-								.getPropertyType_PropertyName(),
-						propertyNameType);
-				commands.add(cmd2);
-			}
-
-			if (property.getPropertyClass() != null) {
-				Command cmd3 = SetCommand.create(this.getEditingDomain(),
-						property.getPropertyClass(),
-						FacesConfigPackage.eINSTANCE
-								.getPropertyClassType_TextContent(), dialog
-								.getPropertyClass());
-				commands.add(cmd3);
-			} else if (dialog.getPropertyClass().length() > 0) {
-				PropertyClassType propertyClassType = FacesConfigFactory.eINSTANCE
-						.createPropertyClassType();
-				propertyClassType.setTextContent(dialog.getPropertyClass());
-
-				Command cmd4 = AddCommand.create(this.getEditingDomain(),
-						property, FacesConfigPackage.eINSTANCE
-								.getPropertyType_PropertyClass(),
-						propertyClassType);
-				commands.add(cmd4);
-			}
-
-			if (property.getDefaultValue() != null) {
-				Command cmd5 = SetCommand.create(this.getEditingDomain(),
-						property.getDefaultValue(),
-						FacesConfigPackage.eINSTANCE
-								.getDefaultValueType_TextContent(), dialog
-								.getDefaultValue());
-				commands.add(cmd5);
-
-			} else if (dialog.getDefaultValue().length() > 0) {
-				DefaultValueType defaultValueType = FacesConfigFactory.eINSTANCE
-						.createDefaultValueType();
-				defaultValueType.setTextContent(dialog.getDefaultValue());
-				Command cmd6 = AddCommand.create(this.getEditingDomain(),
-						property, FacesConfigPackage.eINSTANCE
-								.getPropertyType_DefaultValue(),
-						defaultValueType);
-				commands.add(cmd6);
-			}
-
-			if (property.getSuggestedValue() != null) {
-				Command cmd7 = SetCommand.create(this.getEditingDomain(),
-						property.getSuggestedValue(),
-						FacesConfigPackage.eINSTANCE
-								.getSuggestedValueType_TextContent(), dialog
-								.getSuggestedValue());
-				commands.add(cmd7);
-			} else if (dialog.getSuggestedValue().length() > 0) {
-				SuggestedValueType suggestedValueType = FacesConfigFactory.eINSTANCE
-						.createSuggestedValueType();
-				suggestedValueType.setTextContent(dialog.getSuggestedValue());
-				Command cmd8 = AddCommand.create(this.getEditingDomain(),
-						property, FacesConfigPackage.eINSTANCE
-								.getPropertyType_SuggestedValue(),
-						suggestedValueType);
-				commands.add(cmd8);
-			}
-
-			CompoundCommand command = new CompoundCommand(commands);
-			if (command.canExecute()) {
-				this.getEditingDomain().getCommandStack().execute(command);
-				tableViewer.refresh(property);
-
-			}
-		}
-
-	}
-
-	/**
-	 * remove a property.
-	 * 
-	 */
-	private void removeButtonSelected() {
-		PropertyType property = (PropertyType) ((IStructuredSelection) tableViewer
-				.getSelection()).getFirstElement();
-
-		Assert.isNotNull(property);
-
-		Command removeCommand = RemoveCommand.create(this.getEditingDomain(),
-				getInput(), null, property);
-
-		if (removeCommand.canExecute()) {
-			this.getEditingDomain().getCommandStack().execute(removeCommand);
-			refreshAll();
-		}
-
-	}
-	
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#getSelection()
-	 */
-	public ISelection getSelection() {
-		return tableViewer.getSelection();
-	}
-
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#setSelection(org.eclipse.jface.viewers.ISelection)
-	 */
-	public void setSelection(ISelection selection) {
-
-		tableViewer.setSelection(selection);
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/RendererSection.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/RendererSection.java
deleted file mode 100644
index 0d16483..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/RendererSection.java
+++ /dev/null
@@ -1,531 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.section;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.command.CompoundCommand;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EReference;
-import org.eclipse.emf.edit.command.AddCommand;
-import org.eclipse.emf.edit.command.RemoveCommand;
-import org.eclipse.emf.edit.command.SetCommand;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.viewers.ColumnWeightData;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.TableLayout;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.jst.jsf.facesconfig.emf.ComponentFamilyType;
-import org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.RenderKitType;
-import org.eclipse.jst.jsf.facesconfig.emf.RendererClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.RendererType;
-import org.eclipse.jst.jsf.facesconfig.emf.RendererTypeType;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.dialog.AddEditRendererDialog;
-import org.eclipse.jst.jsf.facesconfig.ui.page.IFacesConfigPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.MouseAdapter;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * @author Bryan Yang
- * 
- */
-public class RendererSection extends AbstractFacesConfigSection {
-
-	private static final int TABLE_DEFAULT_HEIGHT = 160;
-
-	private TableViewer tableViewer;
-
-	private Button removeButton;
-
-	private Button editButton;
-
-	/**
-	 * 
-	 * @param parent
-	 * @param managedForm
-	 * @param page
-	 * @param toolkit
-	 */
-	public RendererSection(Composite parent, IManagedForm managedForm,
-			IFacesConfigPage page, FormToolkit toolkit) {
-		super(parent, managedForm, page, toolkit, null, null);
-		this.getSection().setText(EditorMessages.RendererSection_Name);
-		this.getSection().setDescription(
-				EditorMessages.RendererSection_Description);
-
-	}
-
-	/**
-	 * 
-	 */
-	protected void createContents(Composite container, FormToolkit toolkit) {
-		GridLayout gl = new GridLayout();
-		gl.horizontalSpacing = 0;
-		gl.marginWidth = 0;
-		gl.numColumns = 2;
-		container.setLayout(gl);
-		GridData td = new GridData(GridData.FILL_BOTH);
-		container.setLayoutData(td);
-
-		toolkit.paintBordersFor(container);
-
-		Composite RendererSection = toolkit.createComposite(container);
-		GridLayout gl2 = new GridLayout();
-		gl2.horizontalSpacing = 0;
-		gl2.verticalSpacing = 0;
-		gl2.marginWidth = 0;
-		gl2.marginHeight = 0;
-		gl2.numColumns = 2;
-		RendererSection.setLayout(gl2);
-		GridData gd = new GridData(GridData.FILL_BOTH
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		RendererSection.setLayoutData(gd);
-
-		createTableSection(RendererSection, toolkit);
-		createButtonsSection(RendererSection, toolkit);
-
-	}
-
-	/**
-	 * create table section
-	 * 
-	 * @param container
-	 * @param toolkit
-	 */
-	private void createTableSection(Composite container, FormToolkit toolkit) {
-		Composite tableContainer = toolkit.createComposite(container);
-		GridData gd = new GridData(GridData.FILL_BOTH
-				| GridData.GRAB_HORIZONTAL);
-		tableContainer.setLayoutData(gd);
-		toolkit.paintBordersFor(tableContainer);
-
-		GridLayout gl = new GridLayout();
-		tableContainer.setLayout(gl);
-
-		Table table = new Table(tableContainer, SWT.H_SCROLL | SWT.V_SCROLL
-				| SWT.FULL_SELECTION | SWT.BORDER);
-		gd = new GridData(GridData.FILL_BOTH);
-		gd.horizontalSpan = 1;
-		gd.heightHint = TABLE_DEFAULT_HEIGHT;
-		table.setLayoutData(gd);
-
-		table.setHeaderVisible(true);
-		table.setLinesVisible(true);
-		TableLayout layout = new TableLayout();
-		table.setLayout(layout);
-
-		TableColumn nameCol = new TableColumn(table, SWT.NONE);
-		layout.addColumnData(new ColumnWeightData(1, true));
-		nameCol.setText(EditorMessages.RendererSection_Table_NameColumn);
-
-		TableColumn valueCol = new TableColumn(table, SWT.NONE);
-		layout.addColumnData(new ColumnWeightData(1, true));
-		valueCol
-				.setText(EditorMessages.RendererSection_Table_ComponentFamilyColumn);
-
-		TableColumn suggestedValueCol = new TableColumn(table, SWT.NONE);
-		layout.addColumnData(new ColumnWeightData(1, true));
-		suggestedValueCol
-				.setText(EditorMessages.RendererSection_Table_TypeColumn);
-
-		TableColumn classCol = new TableColumn(table, SWT.NONE);
-		layout.addColumnData(new ColumnWeightData(1, true));
-		classCol.setText(EditorMessages.RendererSection_Table_ClassColumn);
-
-		table.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				updateButtons();
-			}
-		});
-
-		table.addMouseListener(new MouseAdapter() {
-			public void mouseDoubleClick(MouseEvent e) {
-				if (((IStructuredSelection) tableViewer.getSelection()).size() > 0)
-					editButtonSelected();
-			}
-		});
-
-		tableViewer = new TableViewer(table);
-		tableViewer.setContentProvider(new AdapterFactoryContentProvider(
-				getAdapterFactory()));
-		tableViewer.setLabelProvider(new AdapterFactoryLabelProvider(
-				getAdapterFactory()));
-
-		tableViewer.addFilter(new ViewerFilter() {
-			public boolean select(Viewer viewer, Object parentElement,
-					Object element) {
-				return FacesConfigPackage.eINSTANCE.getRendererType()
-						.isInstance(element);
-			}
-		});
-		
-		tableViewer.addSelectionChangedListener(this);
-	}
-
-	/**
-	 * Update the buttons' enable and disable status
-	 */
-	private void updateButtons() {
-		if (((IStructuredSelection) tableViewer.getSelection()).size() > 0) {
-			editButton.setEnabled(true);
-			removeButton.setEnabled(true);
-		} else {
-			editButton.setEnabled(false);
-			removeButton.setEnabled(false);
-		}
-	}
-
-	/**
-	 * create buttons
-	 * 
-	 * @param container
-	 * @param toolkit
-	 */
-	private void createButtonsSection(Composite container, FormToolkit toolkit) {
-		// create operation buttons's container
-		Composite operationContainer = toolkit.createComposite(container);
-		GridData gd = new GridData(GridData.FILL_VERTICAL
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		operationContainer.setLayoutData(gd);
-		GridLayout gl = new GridLayout();
-		operationContainer.setLayout(gl);
-
-		Button addButton = toolkit.createButton(operationContainer,
-				EditorMessages.UI_Button_Add_more,
-				SWT.PUSH);
-		gd = new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		gd.grabExcessHorizontalSpace = false;
-		addButton.setLayoutData(gd);
-
-		editButton = toolkit.createButton(operationContainer,
-				EditorMessages.UI_Button_Edit_more,
-				SWT.PUSH);
-		gd = new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		gd.grabExcessHorizontalSpace = false;
-		editButton.setLayoutData(gd);
-
-		removeButton = toolkit.createButton(operationContainer,
-				EditorMessages.UI_Button_Remove,
-				SWT.PUSH);
-		gd = new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		gd.grabExcessHorizontalSpace = false;
-		removeButton.setLayoutData(gd);
-
-		addButton.addSelectionListener(new SelectionAdapter() {
-
-			public void widgetSelected(SelectionEvent e) {
-				addButtonSelected();
-			}
-
-		});
-
-		editButton.addSelectionListener(new SelectionAdapter() {
-
-			public void widgetSelected(SelectionEvent e) {
-				editButtonSelected();
-			}
-
-		});
-		removeButton.addSelectionListener(new SelectionAdapter() {
-
-			public void widgetSelected(SelectionEvent e) {
-				removeButtonSelected();
-			}
-
-		});
-	}
-
-	/**
-	 * 
-	 * @return
-	 */
-	private EReference getEReference() {
-		EReference reference = null;
-		if (getInput() instanceof RenderKitType) {
-			reference = FacesConfigPackage.eINSTANCE
-					.getRenderKitType_Renderer();
-		}
-		return reference;
-	}
-
-
-	/**
-	 * 
-	 */
-	public void refreshAll() {
-		tableViewer.setInput(getInput());
-		updateButtons();
-
-	}
-
-	/**
-	 * 
-	 */
-	public void refresh() {
-		super.refresh();
-		tableViewer.refresh();
-		updateButtons();
-	}
-
-	/**
-	 * add an Renderer.
-	 * 
-	 */
-	private void addButtonSelected() {
-		Shell shell = EditorPlugin.getActiveShell();
-
-		AddEditRendererDialog dialog = new AddEditRendererDialog(shell, this
-				.getPage(), true);
-		dialog.setProject((IProject) getPage().getEditor().getAdapter(
-				IProject.class));
-		if (dialog.open() == Dialog.OK) {
-
-			// RendererType newRenderer = dialog.getResult();
-			RendererType newRenderer = FacesConfigFactory.eINSTANCE
-					.createRendererType();
-
-			if (dialog.getRendererName().length() > 0) {
-				DisplayNameType diaplayName = FacesConfigFactory.eINSTANCE
-						.createDisplayNameType();
-				diaplayName.setTextContent(dialog.getRendererName());
-				newRenderer.getDisplayName().add(diaplayName);
-			}
-
-			if (dialog.getRendererClass().length() > 0) {
-				RendererClassType RendererClassType = FacesConfigFactory.eINSTANCE
-						.createRendererClassType();
-				RendererClassType.setTextContent(dialog.getRendererClass());
-				newRenderer.setRendererClass(RendererClassType);
-			}
-
-			if (dialog.getComponentFamily().length() > 0) {
-				ComponentFamilyType componentFamilyType = FacesConfigFactory.eINSTANCE
-						.createComponentFamilyType();
-				componentFamilyType.setTextContent(dialog.getComponentFamily());
-				newRenderer.setComponentFamily(componentFamilyType);
-			}
-
-			if (dialog.getRendererType().length() > 0) {
-				RendererTypeType rendererType = FacesConfigFactory.eINSTANCE
-						.createRendererTypeType();
-				rendererType.setTextContent(dialog.getRendererType());
-				newRenderer.setRendererType(rendererType);
-			}
-
-			Command addCommand = AddCommand.create(this.getEditingDomain(),
-					getInput(), getEReference(), newRenderer);
-			if (addCommand.canExecute()) {
-				this.getEditingDomain().getCommandStack().execute(addCommand);
-
-			}
-		}
-
-	}
-
-	/**
-	 * edit an Renderer.
-	 * 
-	 */
-	private void editButtonSelected() {
-
-		RendererType renderer = (RendererType) ((IStructuredSelection) tableViewer
-				.getSelection()).getFirstElement();
-
-		Assert.isNotNull(renderer);
-
-		Shell shell = EditorPlugin.getActiveShell();
-
-		AddEditRendererDialog dialog = new AddEditRendererDialog(shell, this
-				.getPage(), false);
-		dialog.setProject((IProject) getPage().getEditor().getAdapter(
-				IProject.class));
-		if (renderer.getDisplayName() != null
-				&& renderer.getDisplayName().size() > 0) {
-			String name = ((DisplayNameType) (renderer.getDisplayName().get(0)))
-					.getTextContent();
-			if (name == null) {
-				name = ""; //$NON-NLS-1$
-			}
-			dialog.setRendererName(name);
-		}
-
-		if (renderer.getRendererClass() != null) {
-			dialog.setRendererClass(renderer.getRendererClass()
-					.getTextContent());
-		}
-
-		if (renderer.getComponentFamily() != null) {
-			dialog.setComponentFamily(renderer.getComponentFamily()
-					.getTextContent());
-		}
-
-		if (renderer.getRendererType() != null) {
-			dialog.setRendererType(renderer.getRendererType().getTextContent());
-		}
-
-		if (dialog.open() == Dialog.OK) {
-			List commands = new ArrayList(4);
-
-			if (renderer.getDisplayName() != null
-					&& renderer.getDisplayName().size() > 0) {
-				DisplayNameType diaplayName = FacesConfigFactory.eINSTANCE
-						.createDisplayNameType();
-				diaplayName.setTextContent(dialog.getRendererName());
-
-				Command cmd1 = SetCommand.create(this.getEditingDomain(),
-						renderer.getDisplayName().get(0),
-						FacesConfigPackage.eINSTANCE
-								.getRendererType_DisplayName(), diaplayName);
-				commands.add(cmd1);
-			} else if (dialog.getRendererName().length() > 0) {
-				DisplayNameType displayName = FacesConfigFactory.eINSTANCE
-						.createDisplayNameType();
-				displayName.setTextContent(dialog.getRendererName());
-
-				EList dl = renderer.getDisplayName();
-				dl.add(displayName);
-				Command cmd2 = AddCommand.create(this.getEditingDomain(),
-						renderer.getDisplayName(), FacesConfigPackage.eINSTANCE
-								.getRendererType_DisplayName(), dl);
-				commands.add(cmd2);
-			}
-
-			if (renderer.getRendererClass() != null) {
-				Command cmd3 = SetCommand.create(this.getEditingDomain(),
-						renderer.getRendererClass(),
-						FacesConfigPackage.eINSTANCE
-								.getRendererClassType_TextContent(), dialog
-								.getRendererClass());
-				commands.add(cmd3);
-			} else if (dialog.getRendererClass().length() > 0) {
-				RendererClassType RendererClassType = FacesConfigFactory.eINSTANCE
-						.createRendererClassType();
-				RendererClassType.setTextContent(dialog.getRendererClass());
-
-				Command cmd4 = AddCommand.create(this.getEditingDomain(),
-						renderer, FacesConfigPackage.eINSTANCE
-								.getRendererType_RendererClass(),
-						RendererClassType);
-				commands.add(cmd4);
-			}
-
-			if (renderer.getComponentFamily() != null) {
-				Command cmd5 = SetCommand.create(this.getEditingDomain(),
-						renderer.getComponentFamily(),
-						FacesConfigPackage.eINSTANCE
-								.getDefaultValueType_TextContent(), dialog
-								.getComponentFamily());
-				commands.add(cmd5);
-
-			} else if (dialog.getComponentFamily().length() > 0) {
-				ComponentFamilyType componentFamily = FacesConfigFactory.eINSTANCE
-						.createComponentFamilyType();
-				componentFamily.setTextContent(dialog.getComponentFamily());
-				Command cmd6 = AddCommand.create(this.getEditingDomain(),
-						renderer, FacesConfigPackage.eINSTANCE
-								.getRendererType_ComponentFamily(),
-						componentFamily);
-				commands.add(cmd6);
-			}
-
-			if (renderer.getRendererType() != null) {
-				Command cmd7 = SetCommand.create(this.getEditingDomain(),
-						renderer.getRendererType(),
-						FacesConfigPackage.eINSTANCE
-								.getSuggestedValueType_TextContent(), dialog
-								.getRendererType());
-				commands.add(cmd7);
-			} else if (dialog.getRendererType().length() > 0) {
-				RendererTypeType rendererType = FacesConfigFactory.eINSTANCE
-						.createRendererTypeType();
-				rendererType.setTextContent(dialog.getRendererType());
-				Command cmd8 = AddCommand.create(this.getEditingDomain(),
-						renderer, FacesConfigPackage.eINSTANCE
-								.getRendererType_RendererType(), rendererType);
-				commands.add(cmd8);
-			}
-
-			CompoundCommand command = new CompoundCommand(commands);
-			if (command.canExecute()) {
-				this.getEditingDomain().getCommandStack().execute(command);
-				tableViewer.refresh(renderer);
-
-			}
-		}
-
-	}
-
-	/**
-	 * remove an Renderer.
-	 * 
-	 */
-	private void removeButtonSelected() {
-		RendererType Renderer = (RendererType) ((IStructuredSelection) tableViewer
-				.getSelection()).getFirstElement();
-
-		Assert.isNotNull(Renderer);
-
-		Command removeCommand = RemoveCommand.create(this.getEditingDomain(),
-				getInput(), getEReference(), Renderer);
-
-		if (removeCommand.canExecute()) {
-			this.getEditingDomain().getCommandStack().execute(removeCommand);
-			refreshAll();
-		}
-
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#getSelection()
-	 */
-	public ISelection getSelection() {
-		return tableViewer.getSelection();
-	}
-
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#setSelection(org.eclipse.jface.viewers.ISelection)
-	 */
-	public void setSelection(ISelection selection) {
-
-		tableViewer.setSelection(selection);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/RenderkitGeneralSection.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/RenderkitGeneralSection.java
deleted file mode 100644
index 58e83e7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/RenderkitGeneralSection.java
+++ /dev/null
@@ -1,416 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.section;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.impl.AdapterImpl;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.emf.edit.command.AddCommand;
-import org.eclipse.emf.edit.command.SetCommand;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.ClassButtonDialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogFieldApplyListener;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.LayoutUtil;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.StringDialogField;
-import org.eclipse.jst.jsf.facesconfig.emf.DescriptionType;
-import org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.RenderKitClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.RenderKitIdType;
-import org.eclipse.jst.jsf.facesconfig.emf.RenderKitType;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.IFacesConfigConstants;
-import org.eclipse.jst.jsf.facesconfig.ui.page.IFacesConfigPage;
-import org.eclipse.jst.jsf.facesconfig.ui.util.ModelUtil;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * @author Bryan Yang
- * 
- */
-public class RenderkitGeneralSection extends AbstractFacesConfigSection {
-
-	private StringDialogField displayNameField;
-
-	private StringDialogField descriptionField;
-
-	private StringDialogField renderkitIdField;
-
-	private ClassButtonDialogField renderkitClassField;
-
-	private RenderKitGeneralAdapter renderKitGeneralAdapter;
-
-	/**
-	 * 
-	 * @param parent
-	 * @param managedForm
-	 * @param page
-	 * @param toolkit
-	 */
-	public RenderkitGeneralSection(Composite parent, IManagedForm managedForm,
-			IFacesConfigPage page, FormToolkit toolkit) {
-		super(parent, managedForm, page, toolkit, null, null);
-		getSection()
-				.setText(EditorMessages.RenderKitGeneralSection_Name);
-		getSection().setDescription(
-				EditorMessages.RenderKitGeneralSection_Description);
-	}
-
-	/**
-	 * 
-	 */
-	protected void createContents(Composite container, FormToolkit toolkit) {
-		int numberOfColumns = 4;
-		GridLayout layout = new GridLayout(numberOfColumns, false);
-		container.setLayout(layout);
-		GridData td = new GridData(GridData.FILL_HORIZONTAL);
-		container.setLayoutData(td);
-
-		toolkit.paintBordersFor(container);
-		displayNameField = new StringDialogField();
-		displayNameField
-				.setLabelText(EditorMessages.RenderKitGeneralSection_Label_DisplayName);
-		displayNameField.doFillIntoGrid(toolkit, container, numberOfColumns);
-
-		displayNameField
-				.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
-
-					public void dialogFieldApplied(DialogField field) {
-						String newDisplayNameValue = ((StringDialogField) field)
-								.getText().trim();
-						Command cmd = null;
-						RenderKitType Renderkit = (RenderKitType) getInput();
-						EditingDomain editingDomain = getEditingDomain();
-						if (Renderkit.getDisplayName().size() > 0) {
-							DisplayNameType displayName = (DisplayNameType) Renderkit
-									.getDisplayName().get(0);
-							cmd = SetCommand.create(editingDomain, displayName,
-									FacesConfigPackage.eINSTANCE
-											.getDisplayNameType_TextContent(),
-									newDisplayNameValue);
-						} else {
-							DisplayNameType displayNameType = FacesConfigFactory.eINSTANCE
-									.createDisplayNameType();
-							displayNameType.setTextContent(newDisplayNameValue);
-							displayNameType.eAdapters().add(
-									getRenderKitGeneralAdapter());
-
-							cmd = AddCommand.create(editingDomain, Renderkit,
-									FacesConfigPackage.eINSTANCE
-											.getRenderKitType_DisplayName(),
-									displayNameType);
-						}
-						if (cmd.canExecute()) {
-							editingDomain.getCommandStack().execute(cmd);
-						}
-					}
-
-				});
-
-		descriptionField = new StringDialogField(2);
-		descriptionField
-				.setLabelText(EditorMessages.RenderKitGeneralSection_Label_Description);
-		descriptionField.doFillIntoGrid(toolkit, container, numberOfColumns);
-
-		descriptionField
-				.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
-					public void dialogFieldApplied(DialogField field) {
-						String newDescriptionValue = ((StringDialogField) field)
-								.getText().trim();
-						newDescriptionValue = ModelUtil
-								.escapeEntities(newDescriptionValue);
-						Command cmd = null;
-						RenderKitType Renderkit = (RenderKitType) getInput();
-						EditingDomain editingDomain = getEditingDomain();
-						if (Renderkit.getDescription().size() > 0) {
-							DescriptionType description = (DescriptionType) Renderkit
-									.getDescription().get(0);
-							cmd = SetCommand.create(editingDomain, description,
-									FacesConfigPackage.eINSTANCE
-											.getDescriptionType_TextContent(),
-									newDescriptionValue);
-						} else {
-							DescriptionType description = FacesConfigFactory.eINSTANCE
-									.createDescriptionType();
-							description.setTextContent(newDescriptionValue);
-							description.eAdapters().add(
-									getRenderKitGeneralAdapter());
-
-							cmd = AddCommand.create(editingDomain, Renderkit,
-									FacesConfigPackage.eINSTANCE
-											.getRenderKitType_Description(),
-									description);
-						}
-						if (cmd.canExecute()) {
-							editingDomain.getCommandStack().execute(cmd);
-						}
-					}
-				});
-
-		renderkitIdField = new StringDialogField();
-		// renderkitIdField.setRequired(true);
-		renderkitIdField
-				.setLabelText(EditorMessages.RenderKitGeneralSection_Label_RenderKitID);
-		renderkitIdField.doFillIntoGrid(toolkit, container, numberOfColumns);
-		renderkitIdField
-				.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
-					public void dialogFieldApplied(DialogField field) {
-						RenderKitIdType RenderkitId = FacesConfigFactory.eINSTANCE
-								.createRenderKitIdType();
-						RenderkitId.setTextContent(((StringDialogField) field)
-								.getText());
-
-						EditingDomain editingDomain = getEditingDomain();
-						if (editingDomain != null) {
-							Command command = SetCommand.create(editingDomain,
-									getInput(), FacesConfigPackage.eINSTANCE
-											.getRenderKitType_RenderKitId(),
-									RenderkitId);
-							if (command.canExecute()) {
-								editingDomain.getCommandStack()
-										.execute(command);
-							}
-						}
-					}
-				});
-
-		renderkitClassField = new ClassButtonDialogField(null);
-		// renderkitClassField.setRequired(true);
-		renderkitClassField
-				.setLabelText(EditorMessages.RenderKitGeneralSection_Label_RenderKitClass);
-		renderkitClassField.doFillIntoGrid(toolkit, container, numberOfColumns);
-		renderkitClassField.setProject((IProject) getPage().getEditor()
-				.getAdapter(IProject.class));
-		LayoutUtil.setHorizontalGrabbing(renderkitClassField.getTextControl(
-				toolkit, container));
-
-		renderkitClassField
-				.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
-					public void dialogFieldApplied(DialogField field) {
-
-						RenderKitClassType RenderkitClass = FacesConfigFactory.eINSTANCE
-								.createRenderKitClassType();
-						RenderkitClass
-								.setTextContent(((StringDialogField) field)
-										.getText());
-						EditingDomain editingDomain = getEditingDomain();
-						if (editingDomain != null) {
-							Command command = SetCommand.create(editingDomain,
-									getInput(), FacesConfigPackage.eINSTANCE
-											.getRenderKitType_RenderKitClass(),
-									RenderkitClass);
-							if (command.canExecute()) {
-								editingDomain.getCommandStack()
-										.execute(command);
-							}
-						}
-
-					}
-				});
-		renderkitClassField
-				.setSuperClassName(IFacesConfigConstants.RENDER_KIT_SUPER_CLASS);
-	}
-
-	/**
-	 * 
-	 */
-	public void refreshAll() {
-		refresh();
-	}
-
-	/**
-	 * 
-	 */
-	public void refresh() {
-		super.refresh();
-		Object input = this.getInput();
-		if (input instanceof RenderKitType) {
-			final RenderKitType renderkit = (RenderKitType) input;
-			refreshControls(renderkit);
-		}
-	}
-
-	private void refreshControls(RenderKitType renderkit) {
-		if (renderkit.getDisplayName().size() > 0) {
-			DisplayNameType displayName = (DisplayNameType) renderkit
-					.getDisplayName().get(0);
-			displayNameField.setTextWithoutUpdate(displayName
-					.getTextContent());
-		} else {
-			displayNameField.setTextWithoutUpdate(""); //$NON-NLS-1$
-		}
-
-		if (renderkit.getDescription().size() > 0) {
-			DescriptionType description = (DescriptionType) renderkit
-					.getDescription().get(0);
-			String descriptionString = description.getTextContent();
-			descriptionString = ModelUtil
-					.unEscapeEntities(descriptionString);
-			descriptionField.setTextWithoutUpdate(descriptionString);
-		} else {
-			descriptionField.setTextWithoutUpdate(""); //$NON-NLS-1$
-		}
-
-		if (renderkit.getRenderKitId() != null) {
-			renderkitIdField.setTextWithoutUpdate(renderkit
-					.getRenderKitId().getTextContent());
-		} else {
-			renderkitIdField.setTextWithoutUpdate(""); //$NON-NLS-1$
-		}
-
-		if (renderkit.getRenderKitClass() != null) {
-			renderkitClassField.setTextWithoutUpdate(renderkit
-					.getRenderKitClass().getTextContent());
-		} else {
-			renderkitClassField.setTextWithoutUpdate(""); //$NON-NLS-1$
-		}
-
-	}
-	/**
-	 * Add RenderKitGeneralAdapter onto <render-kit> and the first
-	 * <display-name> and <description> elements.
-	 */
-	protected void addAdaptersOntoInput(Object newInput) {
-		RenderKitType renderkit = (RenderKitType) newInput;
-		if (EcoreUtil.getExistingAdapter(renderkit,
-				RenderkitGeneralSection.class) == null) {
-
-			renderkit.eAdapters().add(getRenderKitGeneralAdapter());
-		}
-
-		if (renderkit.getDisplayName().size() > 0) {
-			DisplayNameType displayName = (DisplayNameType) renderkit
-					.getDisplayName().get(0);
-			if (EcoreUtil.getExistingAdapter(displayName,
-					RenderkitGeneralSection.class) == null) {
-
-				displayName.eAdapters().add(getRenderKitGeneralAdapter());
-			}
-		}
-
-		if (renderkit.getDescription().size() > 0) {
-			DescriptionType description = (DescriptionType) renderkit
-					.getDescription().get(0);
-			if (EcoreUtil.getExistingAdapter(description,
-					RenderkitGeneralSection.class) == null) {
-
-				description.eAdapters().add(getRenderKitGeneralAdapter());
-			}
-		}
-	}
-
-	/**
-	 * Remove RenderKitGeneralAdapter from <render-kit> and the first
-	 * <display-name> and <description> elements.
-	 */
-	protected void removeAdaptersFromInput(Object oldInput) {
-		RenderKitType renderkit = (RenderKitType) oldInput;
-		if (EcoreUtil.getExistingAdapter(renderkit,
-				RenderkitGeneralSection.class) != null) {
-			renderkit.eAdapters().remove(getRenderKitGeneralAdapter());
-		}
-		if (renderkit.getDisplayName().size() > 0) {
-			DisplayNameType displayName = (DisplayNameType) renderkit
-					.getDisplayName().get(0);
-			if (EcoreUtil.getExistingAdapter(displayName,
-					RenderkitGeneralSection.class) != null) {
-
-				displayName.eAdapters().remove(getRenderKitGeneralAdapter());
-			}
-		}
-
-		if (renderkit.getDescription().size() > 0) {
-			DescriptionType description = (DescriptionType) renderkit
-					.getDescription().get(0);
-			if (EcoreUtil.getExistingAdapter(description,
-					RenderkitGeneralSection.class) != null) {
-
-				description.eAdapters().remove(getRenderKitGeneralAdapter());
-			}
-		}
-	}
-
-	/**
-	 * 
-	 * @return
-	 */
-	private Adapter getRenderKitGeneralAdapter() {
-
-		if (renderKitGeneralAdapter == null) {
-			renderKitGeneralAdapter = new RenderKitGeneralAdapter();
-		}
-		return renderKitGeneralAdapter;
-	}
-
-	/**
-	 * The adapter that will be added onto <render-kit> element, to listen the
-	 * events of the children that are displayed in this section, notify the
-	 * section to refresh.
-	 * 
-	 * @author sfshi
-	 * 
-	 */
-	class RenderKitGeneralAdapter extends AdapterImpl {
-
-		public boolean isAdapterForType(Object type) {
-			if (type == RenderkitGeneralSection.class)
-				return true;
-			return false;
-		}
-
-		public void notifyChanged(Notification msg) {
-
-			if (msg.getEventType() == Notification.ADD
-					|| msg.getEventType() == Notification.REMOVE
-					|| msg.getEventType() == Notification.SET) {
-				if (msg.getFeature() == FacesConfigPackage.eINSTANCE
-						.getRenderKitType_RenderKitId()
-						|| msg.getFeature() == FacesConfigPackage.eINSTANCE
-								.getRenderKitType_RenderKitClass()
-						|| msg.getFeature() == FacesConfigPackage.eINSTANCE
-								.getRenderKitType_Description()
-						|| msg.getFeature() == FacesConfigPackage.eINSTANCE
-								.getRenderKitType_DisplayName()) {
-					refreshInUIThread();
-				} else if (msg.getFeature() == FacesConfigPackage.eINSTANCE
-						.getDisplayNameType_TextContent()
-						|| msg.getFeature() == FacesConfigPackage.eINSTANCE
-								.getDescriptionType_TextContent()) {
-					refreshInUIThread();
-				}
-			}
-		}
-
-		private void refreshInUIThread() {
-			if (Thread.currentThread() == PlatformUI.getWorkbench().getDisplay().getThread()) {
-				refresh();
-			} else {				
-				PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
-					public void run() {
-						refresh();
-					}
-				});
-			}		
-		}
-	}
-	
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/RenderkitMasterSection.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/RenderkitMasterSection.java
deleted file mode 100644
index 513426c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/RenderkitMasterSection.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.section;
-
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.edit.command.AddCommand;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.RenderKitType;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.page.FacesConfigMasterDetailPage;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * @author Bryan Yang
- * 
- */
-public class RenderkitMasterSection extends FacesConfigMasterSection {
-
-	/**
-	 * 
-	 * @param parent
-	 * @param managedForm
-	 * @param toolkit
-	 * @param page
-	 */
-	public RenderkitMasterSection(Composite parent, IManagedForm managedForm,
-			FormToolkit toolkit, FacesConfigMasterDetailPage page) {
-		super(parent, managedForm, toolkit, page, null, null);
-		getSection().setText(EditorMessages.RenderKitMasterSection_Name);
-		getSection().setDescription(
-				EditorMessages.RenderKitMasterSection_Description);
-	}
-
-	/**
-	 * Config the table viwer, set a filter for it, only the object of
-	 * RenderKitType will be selected.
-	 */
-	protected void configViewer(StructuredViewer structuredViewer) {
-		super.configViewer(structuredViewer);
-		structuredViewer.addFilter(new ViewerFilter() {
-			public boolean select(Viewer viewer, Object parentElement,
-					Object element) {
-				return FacesConfigPackage.eINSTANCE.getRenderKitType()
-						.isInstance(element);
-			}
-		});
-
-	}
-
-	/**
-	 * Create a new render kit.
-	 */
-	protected void addButtonSelected(SelectionEvent e) {
-		RenderKitType Renderkit = FacesConfigFactory.eINSTANCE
-				.createRenderKitType();
-
-		Command command = AddCommand.create(getEditingDomain(),
-				this.getInput(), FacesConfigPackage.eINSTANCE
-						.getFacesConfigType_RenderKit(), Renderkit);
-
-		if (command.canExecute()) {
-			getEditingDomain().getCommandStack().execute(command);
-			IStructuredSelection selection = new StructuredSelection(Renderkit);
-			getStructuredViewer().refresh();
-			getStructuredViewer().setSelection(selection);
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ValidatorGeneralSection.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ValidatorGeneralSection.java
deleted file mode 100644
index 3b478ec..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ValidatorGeneralSection.java
+++ /dev/null
@@ -1,416 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.section;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.impl.AdapterImpl;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.emf.edit.command.AddCommand;
-import org.eclipse.emf.edit.command.SetCommand;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.ClassButtonDialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogFieldApplyListener;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.LayoutUtil;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.StringDialogField;
-import org.eclipse.jst.jsf.facesconfig.emf.DescriptionType;
-import org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ValidatorClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.ValidatorIdType;
-import org.eclipse.jst.jsf.facesconfig.emf.ValidatorType;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.IFacesConfigConstants;
-import org.eclipse.jst.jsf.facesconfig.ui.page.IFacesConfigPage;
-import org.eclipse.jst.jsf.facesconfig.ui.util.ModelUtil;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * @author Bryan Yang
- * 
- */
-public class ValidatorGeneralSection extends AbstractFacesConfigSection {
-
-	private StringDialogField displayNameField;
-
-	private StringDialogField descriptionField;
-
-	private StringDialogField validatorIDField;
-
-	private ClassButtonDialogField validatorClassField;
-
-	private ValidatorGeneralAdapter validatorGeneralAdapter;
-
-	/**
-	 * 
-	 * @param parent
-	 * @param managedForm
-	 * @param page
-	 * @param toolkit
-	 */
-	public ValidatorGeneralSection(Composite parent, IManagedForm managedForm,
-			IFacesConfigPage page, FormToolkit toolkit) {
-		super(parent, managedForm, page, toolkit, null, null);
-		getSection()
-				.setText(EditorMessages.ValidatorGeneralSection_Name);
-		getSection().setDescription(
-				EditorMessages.ValidatorGeneralSection_Description);
-	}
-
-	/**
-	 * 
-	 */
-	protected void createContents(Composite container, FormToolkit toolkit) {
-		int numberOfColumns = 4;
-		GridLayout layout = new GridLayout(numberOfColumns, false);
-		container.setLayout(layout);
-		GridData td = new GridData(GridData.FILL_HORIZONTAL);
-		container.setLayoutData(td);
-
-		toolkit.paintBordersFor(container);
-		displayNameField = new StringDialogField();
-		displayNameField
-				.setLabelText(EditorMessages.ValidatorGeneralSection_Label_DisplayName);
-		displayNameField.doFillIntoGrid(toolkit, container, numberOfColumns);
-
-		displayNameField
-				.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
-
-					public void dialogFieldApplied(DialogField field) {
-						String newDisplayNameValue = ((StringDialogField) field)
-								.getText().trim();
-						Command cmd = null;
-						ValidatorType validator = (ValidatorType) getInput();
-						EditingDomain editingDomain = getEditingDomain();
-						if (validator.getDisplayName().size() > 0) {
-							DisplayNameType displayName = (DisplayNameType) validator
-									.getDisplayName().get(0);
-							cmd = SetCommand.create(editingDomain, displayName,
-									FacesConfigPackage.eINSTANCE
-											.getDisplayNameType_TextContent(),
-									newDisplayNameValue);
-						} else {
-							DisplayNameType displayNameType = FacesConfigFactory.eINSTANCE
-									.createDisplayNameType();
-							displayNameType.setTextContent(newDisplayNameValue);
-							displayNameType.eAdapters().add(
-									getValidatorGeneralAdapter());
-
-							cmd = AddCommand.create(editingDomain, validator,
-									FacesConfigPackage.eINSTANCE
-											.getValidatorType_DisplayName(),
-									displayNameType);
-						}
-						if (cmd.canExecute()) {
-							editingDomain.getCommandStack().execute(cmd);
-						}
-					}
-
-				});
-
-		descriptionField = new StringDialogField(2);
-		descriptionField
-				.setLabelText(EditorMessages.ValidatorGeneralSection_Label_Description);
-		descriptionField.doFillIntoGrid(toolkit, container, numberOfColumns);
-
-		descriptionField
-				.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
-					public void dialogFieldApplied(DialogField field) {
-						String newDescriptionValue = ((StringDialogField) field)
-								.getText().trim();
-						newDescriptionValue = ModelUtil
-								.escapeEntities(newDescriptionValue);
-						Command cmd = null;
-						ValidatorType validator = (ValidatorType) getInput();
-						EditingDomain editingDomain = getEditingDomain();
-						if (validator.getDescription().size() > 0) {
-							DescriptionType description = (DescriptionType) validator
-									.getDescription().get(0);
-							cmd = SetCommand.create(editingDomain, description,
-									FacesConfigPackage.eINSTANCE
-											.getDescriptionType_TextContent(),
-									newDescriptionValue);
-						} else {
-							DescriptionType description = FacesConfigFactory.eINSTANCE
-									.createDescriptionType();
-							description.setTextContent(newDescriptionValue);
-							description.eAdapters().add(
-									getValidatorGeneralAdapter());
-
-							cmd = AddCommand.create(editingDomain, validator,
-									FacesConfigPackage.eINSTANCE
-											.getValidatorType_Description(),
-									description);
-						}
-						if (cmd.canExecute()) {
-							editingDomain.getCommandStack().execute(cmd);
-						}
-					}
-				});
-
-		validatorIDField = new StringDialogField();
-		// validatorIDField.setRequired(true);
-		validatorIDField
-				.setLabelText(EditorMessages.ValidatorGeneralSection_Label_ValidatorID);
-		validatorIDField.doFillIntoGrid(toolkit, container, numberOfColumns);
-		validatorIDField
-				.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
-					public void dialogFieldApplied(DialogField field) {
-						ValidatorIdType ValidatorType = FacesConfigFactory.eINSTANCE
-								.createValidatorIdType();
-						ValidatorType
-								.setTextContent(((StringDialogField) field)
-										.getText());
-
-						EditingDomain editingDomain = getEditingDomain();
-						if (editingDomain != null) {
-							Command command = SetCommand.create(editingDomain,
-									getInput(), FacesConfigPackage.eINSTANCE
-											.getValidatorType_ValidatorId(),
-									ValidatorType);
-							if (command.canExecute()) {
-								editingDomain.getCommandStack()
-										.execute(command);
-							}
-						}
-					}
-				});
-
-		validatorClassField = new ClassButtonDialogField(null);
-		// validatorClassField.setRequired(true);
-		validatorClassField
-				.setLabelText(EditorMessages.ValidatorGeneralSection_Label_ValidatorClass);
-		validatorClassField.setProject((IProject) getPage().getEditor()
-				.getAdapter(IProject.class));
-		validatorClassField.doFillIntoGrid(toolkit, container, numberOfColumns);
-		LayoutUtil.setHorizontalGrabbing(validatorClassField.getTextControl(
-				toolkit, container));
-
-		validatorClassField
-				.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
-					public void dialogFieldApplied(DialogField field) {
-
-						ValidatorClassType ValidatorClass = FacesConfigFactory.eINSTANCE
-								.createValidatorClassType();
-						ValidatorClass
-								.setTextContent(((StringDialogField) field)
-										.getText());
-						EditingDomain editingDomain = getEditingDomain();
-						if (editingDomain != null) {
-							Command command = SetCommand.create(editingDomain,
-									getInput(), FacesConfigPackage.eINSTANCE
-											.getValidatorType_ValidatorClass(),
-									ValidatorClass);
-							if (command.canExecute()) {
-								editingDomain.getCommandStack()
-										.execute(command);
-							}
-						}
-
-					}
-				});
-		validatorClassField
-				.setInterface(IFacesConfigConstants.VALIDATOR_INTERFACE);
-	}
-
-	/**
-	 * 
-	 */
-	public void refreshAll() {
-		refresh();
-	}
-
-	/**
-	 * 
-	 */
-	public void refresh() {
-		super.refresh();
-		Object input = this.getInput();
-		if (input instanceof ValidatorType) {
-			final ValidatorType validator = (ValidatorType) input;
-			refreshControls(validator);
-		}
-	}
-	
-	private void refreshControls(final ValidatorType validator) {
-		if (validator.getDisplayName().size() > 0) {
-			DisplayNameType displayName = (DisplayNameType) validator
-					.getDisplayName().get(0);
-			displayNameField.setTextWithoutUpdate(displayName
-					.getTextContent());
-		} else {
-			displayNameField.setTextWithoutUpdate(""); //$NON-NLS-1$
-		}
-
-		if (validator.getDescription().size() > 0) {
-			DescriptionType description = (DescriptionType) validator
-					.getDescription().get(0);
-			String descriptionString = description.getTextContent();
-			descriptionString = ModelUtil
-					.unEscapeEntities(descriptionString);
-			descriptionField.setTextWithoutUpdate(descriptionString);
-		} else {
-			descriptionField.setTextWithoutUpdate(""); //$NON-NLS-1$
-		}
-
-		if (validator.getValidatorId() != null) {
-			validatorIDField.setTextWithoutUpdate(validator
-					.getValidatorId().getTextContent());
-		} else {
-			validatorIDField.setTextWithoutUpdate(""); //$NON-NLS-1$
-		}
-
-		if (validator.getValidatorClass() != null) {
-			validatorClassField.setTextWithoutUpdate(validator
-					.getValidatorClass().getTextContent());
-		} else {
-			validatorClassField.setTextWithoutUpdate(""); //$NON-NLS-1$
-		}
-
-	}
-
-	/**
-	 * Add ValidatorGeneralAdapter onto <validator> and the first <display-name>
-	 * and <description> elements.
-	 */
-	protected void addAdaptersOntoInput(Object newInput) {
-		ValidatorType validator = (ValidatorType) newInput;
-		if (EcoreUtil.getExistingAdapter(validator,
-				ValidatorGeneralSection.class) == null) {
-
-			validator.eAdapters().add(getValidatorGeneralAdapter());
-		}
-
-		if (validator.getDisplayName().size() > 0) {
-			DisplayNameType displayName = (DisplayNameType) validator
-					.getDisplayName().get(0);
-			if (EcoreUtil.getExistingAdapter(displayName,
-					ValidatorGeneralSection.class) == null) {
-
-				displayName.eAdapters().add(getValidatorGeneralAdapter());
-			}
-		}
-
-		if (validator.getDescription().size() > 0) {
-			DescriptionType description = (DescriptionType) validator
-					.getDescription().get(0);
-			if (EcoreUtil.getExistingAdapter(description,
-					ValidatorGeneralSection.class) == null) {
-
-				description.eAdapters().add(getValidatorGeneralAdapter());
-			}
-		}
-	}
-
-	/**
-	 * Remove ValidatorGeneralAdapter from <validator> and the first
-	 * <display-name> and <description> elements.
-	 */
-	protected void removeAdaptersFromInput(Object oldInput) {
-		ValidatorType validator = (ValidatorType) oldInput;
-		if (EcoreUtil.getExistingAdapter(validator,
-				ValidatorGeneralSection.class) != null) {
-			validator.eAdapters().remove(getValidatorGeneralAdapter());
-		}
-		if (validator.getDisplayName().size() > 0) {
-			DisplayNameType displayName = (DisplayNameType) validator
-					.getDisplayName().get(0);
-			if (EcoreUtil.getExistingAdapter(displayName,
-					ValidatorGeneralSection.class) != null) {
-
-				displayName.eAdapters().remove(getValidatorGeneralAdapter());
-			}
-		}
-
-		if (validator.getDescription().size() > 0) {
-			DescriptionType description = (DescriptionType) validator
-					.getDescription().get(0);
-			if (EcoreUtil.getExistingAdapter(description,
-					ValidatorGeneralSection.class) != null) {
-
-				description.eAdapters().remove(getValidatorGeneralAdapter());
-			}
-		}
-	}
-
-	/**
-	 * 
-	 * @return
-	 */
-	private Adapter getValidatorGeneralAdapter() {
-
-		if (validatorGeneralAdapter == null) {
-			validatorGeneralAdapter = new ValidatorGeneralAdapter();
-		}
-		return validatorGeneralAdapter;
-	}
-
-	/**
-	 * The adapter that will be added onto <validator> element, to listen the
-	 * events of the children that are displayed in this section, notify the
-	 * section to refresh.
-	 * 
-	 * @author sfshi
-	 * 
-	 */
-	class ValidatorGeneralAdapter extends AdapterImpl {
-
-		public boolean isAdapterForType(Object type) {
-			if (type == ValidatorGeneralSection.class)
-				return true;
-			return false;
-		}
-
-		public void notifyChanged(Notification msg) {
-
-			if (msg.getEventType() == Notification.ADD
-					|| msg.getEventType() == Notification.REMOVE
-					|| msg.getEventType() == Notification.SET) {
-				if (msg.getFeature() == FacesConfigPackage.eINSTANCE
-						.getValidatorType_ValidatorId()
-						|| msg.getFeature() == FacesConfigPackage.eINSTANCE
-								.getValidatorType_ValidatorClass()
-						|| msg.getFeature() == FacesConfigPackage.eINSTANCE
-								.getValidatorType_Description()
-						|| msg.getFeature() == FacesConfigPackage.eINSTANCE
-								.getValidatorType_DisplayName()) {
-					refreshInUIThread();
-				} else if (msg.getFeature() == FacesConfigPackage.eINSTANCE
-						.getDisplayNameType_TextContent()
-						|| msg.getFeature() == FacesConfigPackage.eINSTANCE
-								.getDescriptionType_TextContent()) {
-					refreshInUIThread();
-				}
-			}
-		}
-		private void refreshInUIThread() {
-			if (Thread.currentThread() == PlatformUI.getWorkbench().getDisplay().getThread()) {
-				refresh();
-			} else {				
-				PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
-					public void run() {
-						refresh();
-					}
-				});
-			}		
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ValidatorMasterSection.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ValidatorMasterSection.java
deleted file mode 100644
index 89f3298..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ValidatorMasterSection.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.section;
-
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.edit.command.AddCommand;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ValidatorType;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.page.FacesConfigMasterDetailPage;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * @author Bryan Yang
- * 
- */
-public class ValidatorMasterSection extends FacesConfigMasterSection {
-
-	/**
-	 * 
-	 * @param parent
-	 * @param managedForm
-	 * @param toolkit
-	 * @param page
-	 */
-	public ValidatorMasterSection(Composite parent, IManagedForm managedForm,
-			FormToolkit toolkit, FacesConfigMasterDetailPage page) {
-		super(parent, managedForm, toolkit, page, null, null);
-		getSection().setText(EditorMessages.ValidatorMasterSection_Name);
-		getSection().setDescription(
-				EditorMessages.ValidatorMasterSection_Description);
-	}
-
-	/**
-	 * Config the table viwer, set a filter for it, only the object of
-	 * ValidatorType will be selected.
-	 */
-	protected void configViewer(StructuredViewer structuredViewer) {
-		super.configViewer(structuredViewer);
-		structuredViewer.addFilter(new ViewerFilter() {
-			public boolean select(Viewer viewer, Object parentElement,
-					Object element) {
-				return FacesConfigPackage.eINSTANCE.getValidatorType()
-						.isInstance(element);
-			}
-		});
-
-	}
-
-	/**
-	 * Create a new Validator.
-	 */
-	protected void addButtonSelected(SelectionEvent e) {
-		ValidatorType Validator = FacesConfigFactory.eINSTANCE
-				.createValidatorType();
-
-		Command command = AddCommand.create(getEditingDomain(),
-				this.getInput(), FacesConfigPackage.eINSTANCE
-						.getFacesConfigType_Validator(), Validator);
-
-		if (command.canExecute()) {
-			getEditingDomain().getCommandStack().execute(command);
-			IStructuredSelection selection = new StructuredSelection(Validator);
-			getStructuredViewer().refresh();
-			getStructuredViewer().setSelection(selection);
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/util/JavaBeanProperty.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/util/JavaBeanProperty.java
deleted file mode 100644
index fcd01ca..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/util/JavaBeanProperty.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.util;
-
-import org.eclipse.jdt.core.IMethod;
-
-/**
- * This class is used to encapsulate the property following the java bean's
- * spec.
- * 
- * @author xgzhang
- * @version
- */
-public class JavaBeanProperty {
-	private String name;
-
-	private String qualifiedType;
-
-	private String signatureType;
-
-	private IMethod getterMethod;
-
-	private IMethod setterMethod;
-
-	/**
-	 * @param name 
-	 * @param signatureType 
-	 * @param getterMethod 
-	 * @param setterMethod 
-	 */
-	public JavaBeanProperty(String name, String signatureType,
-			IMethod getterMethod, IMethod setterMethod) {
-		this.name = name;
-		this.signatureType = signatureType;
-
-		this.getterMethod = getterMethod;
-		this.setterMethod = setterMethod;
-	}
-
-	/**
-	 * @return Returns the name.
-	 */
-	public String getName() {
-		return name;
-	}
-
-	/**
-	 * @return Returns the setterMethod.
-	 */
-	public IMethod getSetterMethod() {
-		return setterMethod;
-	}
-
-	/**
-	 * @return Returns the setterMethod.
-	 */
-	public IMethod getGetterMethod() {
-		return getterMethod;
-	}
-
-	/**
-	 * @return Returns the type.
-	 */
-	public String getQualifiedType() {
-		if (qualifiedType == null) {
-			IMethod getterSetterMethod = getterMethod != null ? getterMethod
-					: setterMethod;
-
-			qualifiedType = JavaClassUtils.getQualifiedTypeNameInTypeHierarchy(
-					getterSetterMethod.getDeclaringType(), signatureType);
-		}
-		return qualifiedType;
-	}
-
-	/**
-	 * @return Returns the signatureType.
-	 */
-	public String getSignatureType() {
-		return signatureType;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/util/JavaBeanUtils.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/util/JavaBeanUtils.java
deleted file mode 100644
index 83c36cf..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/util/JavaBeanUtils.java
+++ /dev/null
@@ -1,775 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.util;
-
-import java.beans.Introspector;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.jdt.core.IMethod;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.ITypeHierarchy;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jdt.core.Signature;
-import org.eclipse.jst.jsf.common.ui.internal.utils.JavaModelUtil;
-
-/**
- * This utility class is used to access java bean class, e.g., get java bean's
- * property
- * 
- * @author xgzhang
- * @version
- */
-public final class JavaBeanUtils {
-	/**
-	 * fully qualified name of a List
-	 */
-	private static final String JAVA_UTIL_LIST = "java.util.List"; //$NON-NLS-1$
-
-	/**
-	 * fully qualifed name of a Map
-	 */
-	private static final String JAVA_UTIL_MAP = "java.util.Map"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	private JavaBeanUtils() {
-		super();
-	}
-
-	/**
-	 * get the getter method according to property name
-	 * 
-	 * @param type
-	 * @param propertyName
-	 * @return - can be <b>null</b>, if not found
-	 * @throws JavaModelException
-	 * @throws JavaModelException
-	 */
-	private static IMethod getPropertyGetterMethod(IType type,
-			String propertyName)  {
-		if (type == null || !type.exists() || propertyName == null) {
-			return null;
-		}
-		IMethod getterMethod = null;
-
-		String methodBaseName = null;
-		// Uppercase 1st letter
-		if (propertyName.length() == 1) {
-			methodBaseName = propertyName.substring(0, 1).toUpperCase();
-		} else {
-			methodBaseName = propertyName.substring(0, 1).toUpperCase()
-					+ propertyName.substring(1);
-		}
-
-		String getterMethodName = "get" + methodBaseName; //$NON-NLS-1$
-
-		getterMethod = type.getMethod(getterMethodName, null);
-		if (getterMethod == null || !getterMethod.exists()
-				|| !JavaClassUtils.isPublicMethod(getterMethod)) {
-			getterMethodName = "is" + methodBaseName; //$NON-NLS-1$
-			getterMethod = type.getMethod(getterMethodName, null);
-
-			if (getterMethod == null || !getterMethod.exists()
-					|| !JavaClassUtils.isPublicMethod(getterMethod)) {
-				getterMethod = null;
-			}
-		}
-		return getterMethod;
-	}
-
-	/**
-	 * get the getter method in the type hierarchy according to property name
-	 * 
-	 * @param type
-	 * @param propertyName
-	 * @return - can be <b>null</b>, if not found
-	 * @throws JavaModelException
-	 * @throws JavaModelException
-	 */
-	private static IMethod getPropertyGetterMethodInTypeHierarchy(IType type,
-			String propertyName) throws JavaModelException {
-		if (type == null || !type.exists() || propertyName == null) {
-			return null;
-		}
-		IMethod getterMethod = null;
-
-		getterMethod = getPropertyGetterMethod(type, propertyName);
-
-		if (getterMethod == null) {
-			ITypeHierarchy typeHierarchy = null;
-			typeHierarchy = type.newSupertypeHierarchy(null);
-
-			if (typeHierarchy == null) {
-				return null;
-			}
-
-			IType[] superTypes = typeHierarchy.getAllSuperclasses(type);
-
-			if (superTypes == null || superTypes.length == 0) {
-				return null;
-			}
-			for (int i = 0; i < superTypes.length; i++) {
-				if (!superTypes[i].getFullyQualifiedName().equals(
-						"java.lang.Object")) { //$NON-NLS-1$
-					getterMethod = getPropertyGetterMethod(superTypes[i],
-							propertyName);
-					if (getterMethod != null) {
-						break;
-					}
-				}
-			}
-		}
-		return getterMethod;
-	}
-
-	/**
-	 * get the setter method in the type hierarchy according to property name
-	 * 
-	 * @param type
-	 * @param propertyName
-	 * @return - can be <b>null</b>, if not found
-	 * @throws JavaModelException
-	 */
-	private static IMethod getPropertySetterMethodInTypeHierarchy(IType type,
-			String propertyName) throws JavaModelException {
-		if (type == null || !type.exists() || propertyName == null) {
-			return null;
-		}
-		IMethod setterMethod = null;
-
-		setterMethod = getPropertySetterMethod(type, propertyName);
-
-		if (setterMethod == null) {
-			ITypeHierarchy typeHierarchy = null;
-			typeHierarchy = type.newSupertypeHierarchy(null);
-
-			if (typeHierarchy == null) {
-				return null;
-			}
-
-			IType[] superTypes = typeHierarchy.getAllSuperclasses(type);
-
-			if (superTypes == null || superTypes.length == 0) {
-				return null;
-			}
-			for (int i = 0; i < superTypes.length; i++) {
-				if (!superTypes[i].getFullyQualifiedName().equals(
-						"java.lang.Object")) { //$NON-NLS-1$
-					setterMethod = getPropertySetterMethod(superTypes[i],
-							propertyName);
-					if (setterMethod != null) {
-						break;
-					}
-				}
-			}
-		}
-
-		return setterMethod;
-	}
-
-	/**
-	 * get the setter method according to property name
-	 * 
-	 * @param type
-	 * @param propertyName
-	 * @return - can be <b>null</b>, if not found
-	 * @throws JavaModelException
-	 */
-	private static IMethod getPropertySetterMethod(IType type,
-			String propertyName) throws JavaModelException {
-		if (type == null || !type.exists() || propertyName == null) {
-			return null;
-		}
-		IMethod setterMethod = null;
-
-		String methodBaseName = null;
-		// Uppercase 1st letter
-		if (propertyName.length() == 1) {
-			methodBaseName = propertyName.substring(0, 1).toUpperCase();
-		} else {
-			methodBaseName = propertyName.substring(0, 1).toUpperCase()
-					+ propertyName.substring(1);
-		}
-
-		String setterMethodName = "set" + methodBaseName; //$NON-NLS-1$
-
-		IMethod[] methods = null;
-
-		methods = type.getMethods();
-
-		if (methods == null || methods.length == 0) {
-			return null;
-		}
-
-		for (int i = 0; i < methods.length; i++) {
-			if (methods[i].getElementName().equals(setterMethodName)) {
-				if (methods[i] == null || !methods[i].exists()
-						|| !JavaClassUtils.isPublicMethod(methods[i])) {
-					continue;
-				}
-
-				// Method must return void
-				String returnType = methods[i].getReturnType();
-				if (!returnType.equals(Signature.SIG_VOID)) {
-					continue;
-				}
-
-				String params[] = methods[i].getParameterTypes();
-				// method must have only one argument
-				if (params.length != 1) {
-					continue;
-				}
-				setterMethod = methods[i];
-			}
-		}
-
-		return setterMethod;
-	}
-
-	/**
-	 * Check whether the propertyName is bean's property or not.
-	 * 
-	 * @param baseType
-	 * @param propertyName
-	 * 
-	 * @return - True means the property name is valid bean's property,
-	 *         otherwise, not.
-	 * 
-	 */
-	public static boolean isBeanProperty(IType baseType, String propertyName)
-    {
-		if (baseType == null || !baseType.exists() || propertyName == null) {
-			return false;
-		}
-
-		return (getBeanPropertyType(baseType, propertyName) != null);
-	}
-
-	/**
-	 * get the bean's property type
-	 * 
-	 * @param baseType
-	 * @param propertyName
-	 * @return - can be <b>null</b>, if not found
-	 * 
-	 */
-	public static IType getBeanPropertyType(IType baseType, String propertyName) {
-		if (baseType == null || !baseType.exists() || propertyName == null) {
-			return null;
-		}
-
-		String typeSignature = null;
-		IMethod getterMethod = null;
-		IMethod setterMethod = null;
-
-		IType declaredType = baseType;
-		try {
-			getterMethod = getPropertyGetterMethodInTypeHierarchy(baseType,
-					propertyName);
-			setterMethod = getPropertySetterMethodInTypeHierarchy(baseType,
-					propertyName);
-		} catch (JavaModelException e1) {
-			// Need not any error handling.
-		}
-
-		if (getterMethod != null && setterMethod == null) {
-			declaredType = getterMethod.getDeclaringType();
-			try {
-				typeSignature = getterMethod.getReturnType();
-			} catch (JavaModelException e2) {
-				// Need not any error handling.
-			}
-		} else if (setterMethod != null && getterMethod == null) {
-			declaredType = setterMethod.getDeclaringType();
-			typeSignature = setterMethod.getParameterTypes()[0];
-		} else if (setterMethod != null && getterMethod != null) {
-			declaredType = getterMethod.getDeclaringType();
-			try {
-				// FIXME: should check the type hierachy
-				if (getterMethod.getReturnType().equals(
-						setterMethod.getParameterTypes()[0])) {
-					typeSignature = getterMethod.getReturnType();
-				}
-			} catch (JavaModelException e2) {
-				// Need not any error handling.
-			}
-		}
-
-		if (typeSignature == null) {
-			return null;
-		}
-
-		IType type = null;
-
-		try {
-			String typeName = JavaModelUtil.getResolvedTypeName(typeSignature,
-					declaredType);
-			if (typeName != null) {
-				type = baseType.getJavaProject().findType(typeName);
-			}
-		} catch (JavaModelException e) {
-			// Need not any error handling.
-		}
-		return type;
-	}
-
-	/**
-	 * get the bean's property's getter and setter methods.
-	 * 
-	 * @param baseType
-	 * @param propertyName
-	 * @return - IMethod[], the first is getter and the second is setter method,
-	 *         however, both of them can be null.
-	 */
-	public static IMethod[] getBeanPropertyMethods(IType baseType,
-			String propertyName) {
-		if (baseType == null || !baseType.exists() || propertyName == null) {
-			return null;
-		}
-
-		IMethod[] methods = new IMethod[2];
-
-		IMethod getterMethod = null;
-		IMethod setterMethod = null;
-		try {
-			getterMethod = getPropertyGetterMethodInTypeHierarchy(baseType,
-					propertyName);
-
-			setterMethod = getPropertySetterMethodInTypeHierarchy(baseType,
-					propertyName);
-		} catch (JavaModelException e) {
-			// Need not any error handling.
-		}
-
-		if (getterMethod != null && setterMethod == null) {
-			methods[0] = getterMethod;
-		} else if (setterMethod != null && getterMethod == null) {
-			methods[1] = setterMethod;
-		} else if (setterMethod != null && getterMethod != null) {
-			try {
-				// FIXME: should check the type hierachy
-				if (getterMethod.getReturnType().equals(
-						setterMethod.getParameterTypes()[0])) {
-					methods[0] = getterMethod;
-					methods[1] = setterMethod;
-				}
-			} catch (JavaModelException e1) {
-				// Need not any error handling.
-			}
-		}
-
-		return methods;
-	}
-
-	/**
-	 * check whether the type implements <code>java.util.List</code>
-	 * 
-	 * @param type
-	 * @return - True if the type is the sub class of
-	 *         <code>java.util.List</code>, otherwise, not.
-	 */
-	public static boolean isListType(IType type) {
-		if (type == null) {
-			return false;
-		}
-		if (type.getFullyQualifiedName().equalsIgnoreCase(JAVA_UTIL_LIST)) {
-			return true;
-		}
-
-		return JavaClassUtils.isSubClassOf(type.getJavaProject(), type
-				.getFullyQualifiedName(), JAVA_UTIL_LIST);
-	}
-
-	/**
-	 * check whether the type implements <code>java.util.Map</code>
-	 * 
-	 * @param type
-	 * @return - True if the type is the sub class of <code>java.uitl.Map</code>,
-	 *         otherwise, not.
-	 */
-	public static boolean isMapType(IType type) {
-		if (type == null) {
-			return false;
-		}
-		if (type.getFullyQualifiedName().equalsIgnoreCase(JAVA_UTIL_MAP)) {
-			return true;
-		}
-
-		return JavaClassUtils.isSubClassOf(type.getJavaProject(), type
-				.getFullyQualifiedName(), JAVA_UTIL_MAP);
-	}
-
-	/**
-	 * Test for method inclusion in bindings list.
-	 * <p>
-	 * This test has the following conditions:
-	 * </p>
-	 * <ul>
-	 * <li>method starts with <code>get</code></li>
-	 * <li>method has no arguments</li>
-	 * <li>method does not return void</li>
-	 * </ul>
-	 * 
-	 * @param method -
-	 *            the IMethod to examine
-	 * @return boolean - true, if method satisfies the condition test
-	 */
-	public static boolean isGetterMethod(IMethod method) {
-		try {
-			if (!JavaClassUtils.isPublicMethod(method)) {
-				return false;
-			}
-			String params[] = method.getParameterTypes();
-			// Has no arguments
-			if (params.length > 0) {
-				return false;
-			}
-
-			// Starts with "get"
-			if (!(method.getElementName().startsWith("get") || method.getElementName().startsWith("is"))) //$NON-NLS-1$ //$NON-NLS-2$
-			{
-				return false;
-			}
-			// Does not return void
-			String rtn = method.getReturnType();
-			if (!rtn.equals(Signature.SIG_VOID)) {
-				return true;
-			}
-		} catch (JavaModelException e) {
-			// Need not any error handling.
-		}
-		return false;
-	}
-
-	/**
-	 * Test for method inclusion in bindings list.
-	 * <p>
-	 * This test has the following conditions:
-	 * </p>
-	 * <ul>
-	 * <li>method starts with <code>set</code></li>
-	 * <li>method returns void</li>
-	 * </ul>
-	 * 
-	 * @param method -
-	 *            the IMethod to examine
-	 * @return boolean - true, if method satisfies the condition test
-	 */
-	public static boolean isSetterMethod(IMethod method) {
-		try {
-			if (!JavaClassUtils.isPublicMethod(method)) {
-				return false;
-			}
-			// Starts with "set"
-			if (!method.getElementName().startsWith("set")) //$NON-NLS-1$
-			{
-				return false;
-			}
-
-			// the parameter's number should be one.
-			if (method.getParameterTypes().length != 1) {
-				return false;
-			}
-			// Returns void
-			String rtn = method.getReturnType();
-			if (rtn.equals(Signature.SIG_VOID)) {
-				return true;
-			}
-		} catch (JavaModelException e) {
-			// Need not any error handling.
-		}
-		return false;
-	}
-
-	/**
-	 * set the first character into low case.
-	 * 
-	 * @param str
-	 * @return str with the first char lower cased
-	 */
-	public static String toLowCaseFirstChar(String str) {
-		// change the first alphabet to lowcase.
-		if (str != null && str.length() > 0) {
-			if (str.length() == 1) {
-				str = str.toLowerCase();
-			} else {
-				str = str.substring(0, 1).toLowerCase() + str.substring(1);
-			}
-		}
-		return str;
-	}
-
-	/**
-	 * set the first character into low case.
-	 * 
-	 * @param str
-	 * @return str with the first char upper-cased
-	 */
-	public static String toUpperCaseFirstChar(String str) {
-		// change the first alphabet to lowcase.
-		if (str != null && str.length() > 0) {
-			if (str.length() == 1) {
-				str = str.toUpperCase();
-			} else {
-				str = str.substring(0, 1).toUpperCase() + str.substring(1);
-			}
-		}
-		return str;
-	}
-
-	/**
-	 * get property name from getter method.
-	 * 
-	 * @param method
-	 * @return - can be <b>null</b>, if the method is not a valid getter method
-	 */
-	public static String getPropertyNameFromGetterMethod(IMethod method) {
-		if (!isGetterMethod(method)) {
-			return null;
-		}
-		String methodName = method.getElementName();
-		String propertyName = null;
-		// Starts with "get"
-		if (methodName.startsWith("get") && methodName.length() > 3) { //$NON-NLS-1$
-			propertyName = methodName.substring(3);
-		} else if (methodName.startsWith("is") && methodName.length() > 2) // Starts //$NON-NLS-1$
-		// with
-		// "is"
-		{
-			propertyName = methodName.substring(2);
-		}
-		propertyName = Introspector.decapitalize(propertyName);
-		return propertyName;
-	}
-
-	/**
-	 * get property name from setter class.
-	 * 
-	 * @param method
-	 * @return - can be <b>null</b>, if the method is not a valid setter method
-	 */
-	public static String getPropertyNameFromSetterMethod(IMethod method) {
-		if (!isSetterMethod(method)) {
-			return null;
-		}
-		String methodName = method.getElementName();
-		String propertyName = null;
-		// Starts with "get"
-		if (methodName.startsWith("set") && methodName.length() > 3) { //$NON-NLS-1$
-			propertyName = methodName.substring(3);
-		}
-		propertyName = Introspector.decapitalize(propertyName);
-		return propertyName;
-	}
-
-	/**
-	 * get the method with the same parameters
-	 * 
-	 * @param methods
-	 * @param visitedMethods
-	 * @param foundMethod
-	 * @param foundMethodName
-	 * @param foundParamTypes
-	 * @return
-	 */
-	private static IMethod getMethodWithSameParamters(IMethod[] methods,
-			Map visitedMethods, IMethod foundMethod, String foundMethodName,
-			String[] foundParamTypes) {
-		// get all qualified type name for the found method's parameters.
-		String[] foundParamQulifiedTypeNames = null;
-		if (foundParamTypes != null && foundParamTypes.length > 0) {
-			foundParamQulifiedTypeNames = new String[foundParamTypes.length];
-			for (int i = 0; i < foundParamTypes.length; i++) {
-				foundParamQulifiedTypeNames[i] = JavaClassUtils
-						.getQualifiedTypeNameInTypeHierarchy(foundMethod
-								.getDeclaringType(), foundParamTypes[i]);
-			}
-		}
-		for (int i = 0; i < methods.length; i++) {
-			if (visitedMethods.get(methods[i]) != null) {
-				continue;
-			}
-
-			if (!methods[i].getElementName().equals(foundMethodName)) {
-				continue;
-			}
-			if (methods[i].getParameterTypes() == null
-					&& foundParamTypes == null) {
-				return methods[i];
-			} else if (methods[i].getParameterTypes() != null
-					&& foundParamTypes != null
-					&& foundParamTypes.length == methods[i].getParameterTypes().length) {
-				boolean bSameParams = true;
-				String[] methodParamTypes = methods[i].getParameterTypes();
-				for (int j = 0; j < foundParamQulifiedTypeNames.length; j++) {
-					String methodParamQualifiedTypeName = JavaClassUtils
-							.getQualifiedTypeNameInTypeHierarchy(methods[i]
-									.getDeclaringType(), methodParamTypes[j]);
-					// if the qualified type name is not same or not subclass or
-					// supper class between each other.
-					if (!methodParamQualifiedTypeName
-							.equals(foundParamQulifiedTypeNames[j])
-							&& !JavaClassUtils.isSubClassOf(methods[i]
-									.getJavaProject(),
-									methodParamQualifiedTypeName,
-									foundParamQulifiedTypeNames[j])
-							&& !JavaClassUtils.isSubClassOf(methods[i]
-									.getJavaProject(),
-									foundParamQulifiedTypeNames[j],
-									methodParamQualifiedTypeName)) {
-						bSameParams = false;
-						break;
-					}
-				}
-				if (bSameParams) {
-					return methods[i];
-				}
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Creates an array of bean properties
-	 * 
-	 * 
-	 * @param classType
-	 * @return it can be <b>null</b>, if property is not found.
-	 */
-	public static JavaBeanProperty[] getBeanProperties(IType classType) {
-		IMethod[] methods;
-		try {
-			methods = JavaClassUtils.getMethods(classType);
-		} catch (JavaModelException e2) {
-			return null;
-		}
-
-		return getBeanProperties(classType, methods);
-	}
-
-	/**
-	 * Creates an array of bean properties
-	 * 
-	 * @param type
-	 * @param methods
-	 * 
-	 * @return - the array of java bean properties.
-	 */
-	public static JavaBeanProperty[] getBeanProperties(IType type,
-			IMethod[] methods) {
-		if (methods == null || methods.length == 0) {
-			return null;
-		}
-
-		List properties = new ArrayList();
-		Map visitedMethods = new HashMap();
-		for (int m = 0; m < methods.length; m++) {
-			String propertyName = null;
-			// if a property's getter method or setter method already visited,
-			// just skip it.
-			if (visitedMethods.get(methods[m]) != null) {
-				continue;
-			}
-
-			visitedMethods.put(methods[m], methods[m]);
-
-			// Check getter firstly
-			propertyName = JavaBeanUtils
-					.getPropertyNameFromGetterMethod(methods[m]);
-
-			if (propertyName != null && propertyName.length() > 0)
-			{
-				String setterMethodName = "set" //$NON-NLS-1$
-						+ JavaBeanUtils.toUpperCaseFirstChar(propertyName);
-
-				String getterReturnType = null;
-				try {
-					getterReturnType = methods[m].getReturnType();
-				} catch (JavaModelException e1) {
-					continue;
-				}
-				IMethod setterMethod = getMethodWithSameParamters(methods,
-						visitedMethods, methods[m], setterMethodName,
-						new String[] { getterReturnType });
-				if (setterMethod != null && setterMethod.exists()) {
-					visitedMethods.put(setterMethod, setterMethod);
-				}
-
-				properties.add(new JavaBeanProperty(propertyName,
-						getterReturnType, methods[m], setterMethod));
-				continue;
-			}
-
-			// Check setter secondly.
-			propertyName = JavaBeanUtils
-					.getPropertyNameFromSetterMethod(methods[m]);
-
-			if (propertyName != null && propertyName.length() > 0)
-			{
-				// first form of getter method, "get..."
-				String getterMethodName = "get" //$NON-NLS-1$
-						+ JavaBeanUtils.toUpperCaseFirstChar(propertyName);
-				IMethod getterMethod = getMethodWithSameParamters(methods,
-						visitedMethods, methods[m], getterMethodName, null);
-
-				if (getterMethod != null && getterMethod.exists()) {
-					try {
-						if (getterMethod.getReturnType().equals(
-								methods[m].getParameterTypes()[0])) {
-							visitedMethods.put(getterMethod, getterMethod);
-						}
-					} catch (JavaModelException e) {
-						// need not error logging
-					}
-				} else {
-					// another form of getter method, "is...".
-					getterMethodName = "is" //$NON-NLS-1$
-							+ JavaBeanUtils.toUpperCaseFirstChar(propertyName);
-					getterMethod = getMethodWithSameParamters(methods,
-							visitedMethods, methods[m], getterMethodName, null);
-					try {
-						if (getterMethod != null
-								&& getterMethod.exists()
-								&& getterMethod.getReturnType().equals(
-										methods[m].getParameterTypes()[0])) {
-							visitedMethods.put(getterMethod, getterMethod);
-						}
-					} catch (JavaModelException e) {
-						// need not error logging
-					}
-				}
-
-				properties.add(new JavaBeanProperty(propertyName, methods[m]
-						.getParameterTypes()[0], getterMethod, methods[m]));
-				continue;
-			}
-		}
-
-		JavaBeanProperty[] propertyArray = (JavaBeanProperty[]) properties
-				.toArray(new JavaBeanProperty[properties.size()]);
-
-		Arrays.sort(propertyArray, new Comparator() {
-			public int compare(Object o1, Object o2) {
-				String name1 = ((JavaBeanProperty) o1).getName();
-				String name2 = ((JavaBeanProperty) o2).getName();
-				return name1.compareTo(name2);
-			}
-		});
-		return propertyArray;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/util/JavaClassUtils.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/util/JavaClassUtils.java
deleted file mode 100644
index 6d24899..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/util/JavaClassUtils.java
+++ /dev/null
@@ -1,529 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.util;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Comparator;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jdt.core.Flags;
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IMethod;
-import org.eclipse.jdt.core.IPackageDeclaration;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.ITypeHierarchy;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jdt.core.Signature;
-import org.eclipse.jdt.ui.JavaUI;
-import org.eclipse.jst.jsf.common.ui.IFileFolderConstants;
-import org.eclipse.jst.jsf.common.ui.internal.utils.JavaModelUtil;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.PartInitException;
-
-/**
- * This utility class defines typical operations on java class, such as check
- * public constructor, and check type is primitive or not, etc.
- * 
- * @author Jane Cantz, Xiao-guang Zhang
- */
-public class JavaClassUtils {
-	/**
-	 * Determines if a string contains any illegal characters
-	 * 
-	 * @param text -
-	 *            the string to test
-	 * @return boolean - true if an illegal character is found, otherwise false
-	 */
-	public static boolean hasIllegalCharacters(String text) {
-		if (text.length() == 0
-				|| !Character.isJavaIdentifierStart(text.charAt(0))) {
-			return true;
-		}
-		for (int i = 1; i < text.length(); i++) {
-			if (!Character.isJavaIdentifierPart(text.charAt(i))) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * Test for constructor.
-	 * <p>
-	 * This test determines if the class has any constructors
-	 * </p>
-	 * 
-	 * @param methods -
-	 *            the IMethod array to examine
-	 * @return boolean - true, if method has no constructors
-	 */
-	public static boolean hasNoConstructor(IMethod[] methods) {
-		for (int m = 0; m < methods.length; m++) {
-			try {
-				if (methods[m].isConstructor()) {
-					return false;
-				}
-			} catch (JavaModelException e) {
-                // suppress: this is possible; fall through
-			}
-		}
-		return true;
-	}
-
-	/**
-	 * check whether the method is public or not.
-	 * 
-	 * @param method
-	 * @return true if method is public
-	 */
-	public static boolean isPublicMethod(IMethod method) {
-		int accessFlags = 0;
-
-		try {
-			accessFlags = method.getFlags();
-		} catch (JavaModelException e) {
-			return false;
-		}
-
-		boolean isPublic = Flags.isPublic(accessFlags);
-		if ((!Flags.isPrivate(accessFlags))
-				&& (!Flags.isProtected(accessFlags))
-				&& (!Flags.isPublic(accessFlags))) {
-			// No specific modifier was set, so assume to be public
-			isPublic = true;
-		}
-		if (!isPublic) {
-			return false;
-		}
-		return true;
-	}
-
-	/**
-	 * Test for constructor.
-	 * <p>
-	 * This test has the following conditions:
-	 * </p>
-	 * <ul>
-	 * <li>method takes 0 arguments and the method name is the class name:
-	 * <ul>
-	 * <li>takes 0 arguments</li>
-	 * <li>the method name is the class name</li>
-	 * <li>the method returns void</code></li>
-	 * </ul>
-	 * </li>
-	 * </ul>
-	 * 
-	 * @param methods -
-	 *            the IMethod array to examine
-	 * @return boolean - true, if method is a constructor
-	 */
-	public static boolean hasPublicConstructor(IMethod[] methods) {
-		for (int m = 0; m < methods.length; m++) {
-			try {
-				if (methods[m].isConstructor() && isPublicMethod(methods[m])) {
-					// Constructor must have the following 0 arguments
-					String[] params = methods[m].getParameterTypes();
-					if (params.length == 0) {
-						// And must return a void
-						String rtn = methods[m].getReturnType();
-						if (rtn.equals(Signature.SIG_VOID)) {
-							return true;
-						}
-						break;
-					}
-				}
-			} catch (JavaModelException e) {
-				// Nothing to do.
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * Determines if a datatype is primitive type or part of java.lang or
-	 * java.util package. If not, it is considered to be a bean reference
-	 * 
-	 * @param classType -
-	 *            the parent class compilation unit
-	 * @param signatureName -
-	 *            the datatype of the property
-	 * @return boolean - true, if the datatype is primitive or part of java.lang
-	 *         or java.util package
-	 */
-	public static boolean isPrimitiveType(IType classType, String signatureName) {
-		while (signatureName.startsWith("[")) { //$NON-NLS-1$
-			signatureName = signatureName.substring(1);
-		}
-		int kind = Signature.getTypeSignatureKind(signatureName);
-		if (kind == Signature.BASE_TYPE_SIGNATURE
-				|| signatureName.equals(Signature.SIG_VOID)) {
-			// These are true primitive types
-			return true;
-		}
-
-		String qualifiedName = getQualifiedTypeNameInTypeHierarchy(classType,
-				signatureName);
-
-		if ((qualifiedName.startsWith("java.lang")) || (qualifiedName.startsWith("java.util"))) //$NON-NLS-1$ //$NON-NLS-2$
-		{
-			return true;
-		}
-		return false;
-	}
-
-	/**
-	 * get the type from the input class name
-	 * 
-	 * @param project
-	 * @param className
-	 * @return - can be null.
-	 */
-	public static IType getType(IProject project, String className) {
-		if (project == null) {
-			return null;
-		}
-		IType cunit = null;
-		if (className.length() > 0) {
-
-			IJavaProject jProject = JavaCore.create(project);
-			try {
-				cunit = jProject.findType(className);
-			} catch (JavaModelException e) {
-                // suppress: fall-through and return null
-			}
-		}
-		return cunit;
-	}
-
-	/**
-	 * open the type in the editor.
-	 * 
-	 * @param type
-	 * @return true if the type could opened in an editor
-	 */
-	public static boolean openType(IType type) {
-		if (type == null || !type.exists()) {
-			return false;
-		}
-
-		try {
-			IEditorPart editorPart = JavaUI.openInEditor(type
-					.getPrimaryElement());
-			if (editorPart != null) {
-				JavaUI.revealInEditor(editorPart, type.getPrimaryElement());
-				return true;
-			}
-		} catch (PartInitException e) {
-			// ignore this error.
-		} catch (JavaModelException e) {
-			// ignore this error.
-		}
-		return false;
-	}
-
-	/**
-	 * get package name from java source file
-	 * 
-	 * @param javaFile
-	 * @return - can be null.
-	 */
-	public static String getPackageName(IFile javaFile) {
-		if (javaFile == null) {
-			return null;
-		}
-		String ext = "." + javaFile.getFileExtension(); //$NON-NLS-1$
-		// See if the file is a java file
-		if (!ext.equalsIgnoreCase(IFileFolderConstants.EXT_JAVA)) {
-			return null;
-		}
-		String packagename = new String();
-		ICompilationUnit cunit = JavaCore.createCompilationUnitFrom(javaFile);
-		try {
-			IPackageDeclaration[] packages = cunit.getPackageDeclarations();
-			if (packages.length == 0) {
-				packagename = new String();
-			} else {
-				packagename = packages[0].getElementName();
-			}
-		} catch (JavaModelException jme) {
-            // suppress: fall-through and return an empty string?? TODO:?
-		}
-		return packagename;
-	}
-
-	/**
-	 * copy the array to the list.
-	 * 
-	 * @param methodList
-	 * @param methods
-	 */
-	private static void copyToMethodList(List methodList, IMethod[] methods) {
-		if (methods != null && methods.length > 0) {
-			for (int i = 0; i < methods.length; i++) {
-				if (!isDuplicateMethod(methodList, methods[i])) {
-					methodList.add(methods[i]);
-				}
-			}
-		}
-	}
-
-	/**
-	 * check whether this method is duplicated or not in the existing method
-	 * list.
-	 * 
-	 * @param methodList
-	 * @param method
-	 * @return
-	 */
-	private static boolean isDuplicateMethod(List methodList, IMethod method) {
-		if (method == null || !method.exists()) {
-			return false;
-		}
-
-		String[] paramTypes = method.getParameterTypes();
-		String methodName = method.getElementName();
-
-		for (Iterator iter = methodList.iterator(); iter.hasNext();) {
-			IMethod existedMethod = (IMethod) iter.next();
-			if (isSameMethodSignature(methodName, paramTypes, existedMethod)) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * Tests if a method equals to the given signature. Parameter types are only
-	 * compared by the simple name, no resolving for the fully qualified type
-	 * name is done. Constructors are only compared by parameters, not the name.
-	 * 
-	 * @param name
-	 *            Name of the method
-	 * @param paramTypes
-	 *            The type signatures of the parameters e.g.
-	 *            <code>{"QString;","I"}</code>
-	 * @param curr 
-	 * @return Returns <code>true</code> if the method has the given name and
-	 *         parameter types and constructor state.
-	 */
-	public static boolean isSameMethodSignature(String name,
-			String[] paramTypes, IMethod curr) {
-		if (name.equals(curr.getElementName())) {
-			String[] currParamTypes = curr.getParameterTypes();
-			if (paramTypes.length == currParamTypes.length) {
-				for (int i = 0; i < paramTypes.length; i++) {
-					String t1 = Signature.getSimpleName(Signature
-							.toString(paramTypes[i]));
-					String t2 = Signature.getSimpleName(Signature
-							.toString(currParamTypes[i]));
-					if (!t1.equals(t2)) {
-						return false;
-					}
-				}
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * get methods for the class Type including its super class
-	 * 
-	 * @param classType
-	 * @return - can be null
-	 * @throws JavaModelException
-	 */
-	public static IMethod[] getMethods(IType classType)
-			throws JavaModelException {
-		if (classType == null) {
-			return null;
-		}
-		List methodList = new ArrayList();
-		IMethod[] methods = classType.getMethods();
-		copyToMethodList(methodList, methods);
-
-		ITypeHierarchy typeHierarchy = classType.newSupertypeHierarchy(null);
-
-		if (typeHierarchy != null) {
-			IType[] superTypes = typeHierarchy.getAllSuperclasses(classType);
-
-			if (superTypes != null && superTypes.length > 0) {
-				for (int i = 0; i < superTypes.length; i++) {
-					if (!superTypes[i].getFullyQualifiedName().equals(
-							"java.lang.Object")) { //$NON-NLS-1$
-						methods = superTypes[i].getMethods();
-
-						copyToMethodList(methodList, methods);
-					}
-				}
-			}
-		}
-
-		if (methodList != null && methodList.size() > 0) {
-			IMethod[] validMethods = (IMethod[]) methodList
-					.toArray(new IMethod[methodList.size()]);
-
-			Arrays.sort(validMethods, new Comparator() {
-				public int compare(Object o1, Object o2) {
-					String name1 = ((IMethod) o1).getElementName();
-					String name2 = ((IMethod) o2).getElementName();
-					return name1.compareTo(name2);
-				}
-			});
-			return validMethods;
-		}
-		return null;
-	}
-
-	/**
-	 * resolve and get the qualified name for the incomplete typename
-	 * 
-	 * @param classType
-	 * @param signatureName
-	 * @return - at least equal to Signature.toString(signatureName).
-	 */
-	public static String getQualifiedTypeNameInTypeHierarchy(IType classType,
-			String signatureName) {
-		int arrayNum = 0;
-		while (signatureName.startsWith("[")) { //$NON-NLS-1$
-			arrayNum++;
-			signatureName = signatureName.substring(1);
-		}
-
-		String qualifiedTypeName = Signature.toString(signatureName);
-		int kind = Signature.getTypeSignatureKind(signatureName);
-		if (kind == Signature.BASE_TYPE_SIGNATURE
-				|| signatureName.equals(Signature.SIG_VOID)) {
-			// Add back array identifiers
-			while (arrayNum > 0) {
-				qualifiedTypeName = qualifiedTypeName + "[]"; //$NON-NLS-1$
-				arrayNum--;
-			}
-			return qualifiedTypeName;
-		}
-
-		String typeName = Signature.toString(signatureName);
-
-		String foundName = getQualifiedTypeName(classType, typeName);
-		// if found in current type
-		if (foundName != null) {
-			qualifiedTypeName = foundName;
-		} else // else found in the type hierachy.
-		{
-			ITypeHierarchy typeHierarchy = null;
-			try {
-				typeHierarchy = classType.newSupertypeHierarchy(null);
-			} catch (JavaModelException e) {
-				// Nothing to do.
-			}
-			if (typeHierarchy != null) {
-				IType[] superTypes = typeHierarchy.getAllSupertypes(classType);
-
-				if (superTypes != null && superTypes.length > 0) {
-					for (int i = 0; i < superTypes.length; i++) {
-						if (!superTypes[i].getFullyQualifiedName().equals(
-								"java.lang.Object")) { //$NON-NLS-1$
-							foundName = getQualifiedTypeName(superTypes[i],
-									typeName);
-							if (foundName != null) {
-								qualifiedTypeName = foundName;
-								break;
-							}
-						}
-					}
-				}
-			}
-		}
-
-		// Add back array identifiers
-		while (arrayNum > 0) {
-			qualifiedTypeName = qualifiedTypeName + "[]"; //$NON-NLS-1$
-			arrayNum--;
-		}
-		return qualifiedTypeName;
-	}
-
-	/**
-	 * resolve and get the qualified name for the incomplete typename
-	 * 
-	 * @param classType
-	 * @param typeName
-	 * @return can be null.
-	 */
-	public static String getQualifiedTypeName(IType classType, String typeName) {
-		String qualifiedTypeName = null;
-
-		try {
-			String[][] resolvedNames = classType.resolveType(typeName);
-			if (resolvedNames != null && resolvedNames.length > 0) {
-				qualifiedTypeName = JavaModelUtil.concatenateName(
-						resolvedNames[0][0], resolvedNames[0][1]);
-			}
-		} catch (JavaModelException e1) {
-			// Nothing to do.
-		}
-
-		return qualifiedTypeName;
-	}
-
-	/**
-	 * check whether subclass is sub class of supperclass
-	 * 
-	 * @param jProject
-	 * @param subClass -
-	 *            fully qualified name of sub class
-	 * @param superClass -
-	 *            fully qualified name of super class
-	 * 
-	 * @return true if subClass is a sub  of  superClass
-	 */
-	public static boolean isSubClassOf(IJavaProject jProject, String subClass,
-			String superClass) {
-		if (jProject == null || subClass == null || superClass == null) {
-			return false;
-		}
-
-		try {
-			IType subClassType = jProject.findType(subClass);
-
-			if (subClassType != null) {
-				ITypeHierarchy typeHierarchy = null;
-				try {
-					typeHierarchy = subClassType.newSupertypeHierarchy(null);
-				} catch (JavaModelException e) {
-					// Nothing to do.
-				}
-				IType[] superTypes = typeHierarchy
-						.getAllSupertypes(subClassType);
-
-				if (superTypes != null && superTypes.length > 0) {
-					for (int i = 0; i < superTypes.length; i++) {
-						if (superTypes[i].getFullyQualifiedName().equals(
-								superClass)) {
-							return true;
-						}
-					}
-				}
-			}
-		} catch (JavaModelException e) {
-			// Nothing to do.
-		}
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/util/ManagedBeanUtil.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/util/ManagedBeanUtil.java
deleted file mode 100644
index 337fe22..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/util/ManagedBeanUtil.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.util;
-
-import java.util.List;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jst.jsf.core.jsfappconfig.internal.IJSFAppConfigManager;
-import org.eclipse.jst.jsf.core.jsfappconfig.internal.JSFAppConfigManagerFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType;
-
-/**
- * 
- * @author sfshi
- * 
- */
-public class ManagedBeanUtil {
-
-	/**
-	 * Determines if the new bean to be added is already a member of the
-	 * configuration set.
-	 * @param project 
-	 * 
-	 * @param beanName -
-	 *            The name of the bean being added
-	 * @return int - 0 if bean doesn't exist, otherwise the choice from the
-	 *         Duplicate Bean dialog
-	 */
-	public static boolean isBeanDuplicate(final IProject project, final String beanName) 
-    {
-	    final IJSFAppConfigManager appCfgMgr = JSFAppConfigManagerFactory.getJSFAppConfigManagerInstance(project);
-        
-		if (appCfgMgr != null) 
-        {
-			final List<ManagedBeanType> beans = appCfgMgr.getManagedBeans();
-
-			// Iterate through the bean list
-			for (final ManagedBeanType mbti : beans) {
-				if (mbti.getManagedBeanName() != null) {
-					final String name = mbti.getManagedBeanName()
-							.getTextContent();
-					if (name != null && name.equals(beanName)) {
-						return true;
-					}
-				}
-			}
-
-		}
-		return false;
-	}
-
-	/**
-	 * get the default managed bean name in the current project according to
-	 * reference name
-	 * 
-	 * @param project -
-	 *            current project
-	 * @param refName -
-	 *            seed reference name
-	 * @return String - default managed bean name
-	 */
-	public static String getDefaultManagedBeanName(final IProject project,
-			final String refName) {
-		String defaultName = refName;
-
-		int newRefNameIndex = 1;
-		while (isBeanDuplicate(project, defaultName)) {
-			defaultName = refName + newRefNameIndex;
-			newRefNameIndex++;
-		}
-		return defaultName;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/util/ModelUtil.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/util/ModelUtil.java
deleted file mode 100644
index a468136..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/util/ModelUtil.java
+++ /dev/null
@@ -1,189 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.util;
-
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.ui.IFacesConfigConstants;
-
-/**
- * @author Zhi-peng Zhang
- * @version
- */
-public class ModelUtil {
-
-	private static final String ENTITY_NEWLINE = "&#xA;"; //$NON-NLS-1$
-	private static final String ENTITY_TAB = "&#x9;"; //$NON-NLS-1$
-	private static final String ENTITY_CARRIAGE_RETURN = "&#xD;"; //$NON-NLS-1$
-	private static final String ENTITY_AMPERSAND = "&amp;"; //$NON-NLS-1$
-	private static final String ENTITY_DOUBLE_QUOTE = "&quot;"; //$NON-NLS-1$
-	private static final String ENTITY_SINGLE_QUOTE = "&apos;"; //$NON-NLS-1$
-	private static final String ENTITY_GREATER_THAN = "&gt;"; //$NON-NLS-1$
-	private static final String ENTITY_LESS_THAN = "&lt;"; //$NON-NLS-1$
-
-	/**
-	 * Get the super class's name of certain element. For example, a class for
-	 * <action-listener> should implement interface
-	 * "javax.faces.event.ActionListener".
-	 * 
-	 * 
-	 * 
-	 * @param key
-	 *            the EClass object of the application child.
-	 * @return the expected super type for a particular element
-	 * TODO: could make common with the faces-config validator
-	 */
-	public static String getSuperType(Object key) {
-		if (key == FacesConfigPackage.eINSTANCE.getActionListenerType()) {
-			return IFacesConfigConstants.ACTION_LISTENER_INTERFACE;
-		}
-		if (key == FacesConfigPackage.eINSTANCE.getNavigationHandlerType()) {
-			return IFacesConfigConstants.NAVIGATION_HANDLE_SUPER_CLASS;
-		}
-		if (key == FacesConfigPackage.eINSTANCE.getPropertyResolverType()) {
-			return IFacesConfigConstants.PROPERTY_RESOLVER_SUPER_CLASS;
-		}
-		if (key == FacesConfigPackage.eINSTANCE.getStateManagerType()) {
-			return IFacesConfigConstants.STATE_MANAGER_SUPER_CLASS;
-		}
-		if (key == FacesConfigPackage.eINSTANCE.getVariableResolverType()) {
-			return IFacesConfigConstants.VARIABLE_RESOLVER_SUPER_CLASS;
-		}
-		if (key == FacesConfigPackage.eINSTANCE.getViewHandlerType()) {
-			return IFacesConfigConstants.VIEW_HANDLER_SUPER_CLASS;
-		}
-
-		if (key == FacesConfigPackage.eINSTANCE.getApplicationFactoryType()) {
-			return IFacesConfigConstants.APPLICATION_FACTORY_SUPER_CLASS;
-		}
-		if (key == FacesConfigPackage.eINSTANCE.getFacesContextFactoryType()) {
-			return IFacesConfigConstants.FACES_CONTEXT_FACTORY_SUPER_CLASS;
-		}
-		if (key == FacesConfigPackage.eINSTANCE.getLifecycleFactoryType()) {
-			return IFacesConfigConstants.LIFECYCLE_FACTORY_SUPER_CLASS;
-		}
-		if (key == FacesConfigPackage.eINSTANCE.getRenderKitFactoryType()) {
-			return IFacesConfigConstants.RENDER_KIT_FACTORY_SUPER_CLASS;
-		}
-
-		if (key == FacesConfigPackage.eINSTANCE.getPhaseListenerType()) {
-			return IFacesConfigConstants.PHASE_LISTENER_INTERFACE;
-		}
-
-		return null;
-	}
-	
-
-	/**
-	 * This will take the three pre-defined entities in XML 1.0 (used
-	 * specifically in XML elements) and convert their character representation
-	 * to the appropriate entity reference, suitable for XML element content.
-	 * 
-	 * @param str
-	 *            <code>String</code> input to escape.
-	 * @return <code>String</code> with escaped content.
-	 */
-	public static String escapeEntities(String str) {
-		if (isEmptyString(str)) {
-			return ""; //$NON-NLS-1$
-		}
-
-		StringBuffer buffer;
-		char ch;
-		String entity;
-
-		buffer = null;
-		for (int i = 0, n = str.length(); i < n; i++) {
-			ch = str.charAt(i);
-			switch (ch) {
-			case '<':
-				entity = ENTITY_LESS_THAN;
-				break;
-			case '>':
-				entity = ENTITY_GREATER_THAN;
-				break;
-			case '\'':
-				entity = ENTITY_SINGLE_QUOTE;
-				break;
-			case '\"':
-				entity = ENTITY_DOUBLE_QUOTE;
-				break;
-			case '&':
-				entity = ENTITY_AMPERSAND;
-				break;
-			case '\r':
-				entity = ENTITY_CARRIAGE_RETURN;
-				break;
-			case '\t':
-				entity = ENTITY_TAB;
-				break;
-			case '\n':
-				entity = ENTITY_NEWLINE;
-				break;
-			default:
-				entity = null;
-				break;
-			}
-			if (buffer == null) {
-				if (entity != null) {
-					// An entity occurred, so we'll have to use StringBuffer
-					// (allocate room for it plus a few more entities).
-					buffer = new StringBuffer(str.length() + 20);
-					// Copy previous skipped characters and fall through
-					// to pickup current character
-					buffer.append(str.substring(0, i));
-					buffer.append(entity);
-				}
-			} else {
-				if (entity == null) {
-					buffer.append(ch);
-				} else {
-					buffer.append(entity);
-				}
-			}
-		}
-
-		// If there were any entities, return the escaped characters
-		// that we put in the StringBuffer. Otherwise, just return
-		// the unmodified input string.
-		return (buffer == null) ? str : buffer.toString();
-	}
-
-	/**
-	 * @param str
-	 * @return removes XML/HTML escaped characters from str.
-	 */
-	public static String unEscapeEntities(String str) {
-		if (isEmptyString(str)) {
-			return ""; //$NON-NLS-1$
-		}
-
-		String result = new String(str);
-
-		result = result.replaceAll(ENTITY_AMPERSAND, "&"); //$NON-NLS-1$
-		result = result.replaceAll(ENTITY_LESS_THAN, "<"); //$NON-NLS-1$
-		result = result.replaceAll(ENTITY_GREATER_THAN, ">"); //$NON-NLS-1$
-		result = result.replaceAll(ENTITY_SINGLE_QUOTE, "\'"); //$NON-NLS-1$
-		result = result.replaceAll(ENTITY_DOUBLE_QUOTE, "\""); //$NON-NLS-1$
-		result = result.replaceAll(ENTITY_CARRIAGE_RETURN, "\r"); //$NON-NLS-1$
-		result = result.replaceAll(ENTITY_TAB, "\t"); //$NON-NLS-1$
-		result = result.replaceAll(ENTITY_NEWLINE, "\n"); //$NON-NLS-1$
-
-		return result;
-	}
-
-	private static boolean isEmptyString(String value) {
-		if (value == null || value.length() == 0) {
-			return true;
-		}
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/util/WebrootUtil.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/util/WebrootUtil.java
deleted file mode 100644
index 0f3ada6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/util/WebrootUtil.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.util;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.EObject;
-
-
-/**
- * This utility class is used to make a bridge between the relative path from
- * webroot and physical path in the project.
- * 
- * @author Xiao-guang Zhang
- * 
- */
-public class WebrootUtil extends
-            org.eclipse.jst.jsf.common.ui.internal.utils.WebrootUtil {
-
-	/**
-	 * get the the project path for webpath The project path is something like
-	 * "/projectname/webroot/filename.jsp", or "/projectname/webroot/folder".
-	 * The project information should be removed from project path, e.g,
-	 * "/filename.jsp" or "/folder/*";
-	 * @param model 
-	 * 
-	 * @param strPath -
-	 *            the web path
-	 * @return - project path from "/projectname/webroot"
-	 */
-	static public String getProjectPath(EObject model, String strPath) {
-
-		IProject project = getProject(model);
-
-		String strProjectPath = ""; //$NON-NLS-1$
-		if (strPath != null) {
-			IPath path = new Path(strPath);
-			// jsp file
-			if (path.getFileExtension() != null) {
-				IPath webContentPath = getWebContentPath(project);
-				if (webContentPath != null)
-					strProjectPath = webContentPath.toString() + strPath;
-
-			} else
-			// jsp folder
-			{
-				strPath = new String(strPath.getBytes(), 0,
-						strPath.length() - 1);
-				IPath webContentPath = getWebContentPath(project);
-				if (webContentPath != null)
-					strProjectPath = webContentPath.toString() + strPath;
-			}
-		}
-		return strProjectPath;
-	}
-
-	/**
-	 * @param model -
-	 *            emf model
-	 * @return the current resource according to EMF model
-	 */
-	static public IResource getResource(EObject model) {
-		IResource resource = null;
-
-		if (model != null && model.eResource() != null) {
-			URI uri = model.eResource().getURI();
-			IPath path = new Path(URI.decode(uri.devicePath()));
-
-			// since the uri format is "platform:/resource/..."
-			// we will remove the first part
-			path = path.removeFirstSegments(1);
-
-			IWorkspaceRoot workspaceRoot = ResourcesPlugin.getWorkspace()
-					.getRoot();
-			resource = workspaceRoot.findMember(path);
-		}
-
-		return resource;
-	}
-
-	/**
-	 * get the current project according to EMF model
-	 * 
-	 * @param model -
-	 *            emf model
-	 * @return the current project according to EMF model
-	 */
-	static public IProject getProject(EObject model) {
-		IProject project = null;
-
-		IResource resource = getResource(model);
-
-		if (resource != null) {
-			project = resource.getProject();
-		}
-
-		return project;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/wizard/ISummaryDataSource.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/wizard/ISummaryDataSource.java
deleted file mode 100644
index ae1fa5e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/wizard/ISummaryDataSource.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.wizard;
-
-import java.util.List;
-
-/**
- * Specifies behavior for a datasource that client wizards use to communicate
- * summary information to summary page.
- * 
- * @author plevin
- * @version 1.0
- */
-public interface ISummaryDataSource {
-	/**
-	 * Returns key-value summary data.
-	 * 
-	 * @return List - Summary data.
-	 */
-	public List getSummaryData();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/wizard/ManagedBeanClassSelectionPage.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/wizard/ManagedBeanClassSelectionPage.java
deleted file mode 100644
index c2306cf..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/wizard/ManagedBeanClassSelectionPage.java
+++ /dev/null
@@ -1,322 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others. All rights reserved. This
- * program and the accompanying materials are made available under the terms of
- * the Eclipse Public License v1.0 which accompanies this distribution, and is
- * available at http://www.eclipse.org/legal/epl-v10.html Contributors: Sybase,
- * Inc. - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.wizard;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.JavaConventions;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.wizard.WizardPage;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.ClassButtonDialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogFieldChangeListener;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.LayoutUtil;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.jst.jsf.facesconfig.ui.util.JavaClassUtils;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Label;
-
-/**
- * This class used to select an existing java class or generate a new one.
- * However, the actural generated new java class is left to other pages.
- * 
- * @author Xiao-guang Zhang
- */
-public class ManagedBeanClassSelectionPage extends WizardPage {
-	private static final int HORIZONTAL_INDENT_DEFAULT = 25;
-
-	/** the class name */
-	private String className;
-
-	/**
-	 * Search Section, including radio button, label, text and browser button.
-	 */
-	private Button searchRadioButton;
-
-	private ClassButtonDialogField classSearchDialogField;
-
-	/** selected type */
-	private IType searchedType;
-
-	/** Generate radio button */
-	private Button createRadioButton;
-
-	private IProject currentProject;
-
-	/**
-	 * Constructor.
-	 * 
-	 * @param project
-	 *            The project.
-	 */
-	public ManagedBeanClassSelectionPage(IProject project) {
-		super("JavaSelectionWizardPage"); //$NON-NLS-1$
-
-		currentProject = project;
-		setTitle(WizardMessages.JavaSelectionWizardPage_Title);
-		setDescription(WizardMessages.JavaSelectionWizardPage_Description);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
-	 */
-	public void createControl(Composite parent) {
-		Composite container = new Composite(parent, SWT.NULL);
-		GridLayout layout = new GridLayout();
-		layout.marginWidth = 10;
-		layout.marginHeight = 5;
-		container.setLayout(layout);
-		container.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
-		final Group group = new Group(container, SWT.NONE);
-
-		group.setLayout(new GridLayout());
-
-		group.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
-		createSearchSection(group);
-		createGenerateSection(group);
-
-		setControl(container);
-		Dialog.applyDialogFont(container);
-		setPageComplete(classSearchDialogField.getText().length() > 0);
-		EditorPlugin.getDefault().getWorkbench().getHelpSystem().setHelp(
-				container,
-				WizardMessages.JavaSelectionWizardPage_HelpContextID);
-	}
-
-	/**
-	 * enabled or disabled the search section including the labels and texts
-	 * 
-	 * @param enabled -
-	 *            enabled or disabled the search section
-	 */
-	private void enableSearchSection(boolean enabled) {
-		classSearchDialogField.setEnabled(enabled);
-	}
-
-	/**
-	 * Create the search section including the labels, texts, and browser
-	 * buttons
-	 * 
-	 * @param parent -
-	 *            parent composite control
-	 */
-	private void createSearchSection(Composite parent) {
-		searchRadioButton = new Button(parent, SWT.RADIO);
-		// JavaSelectionWizardPage.Search = Using an existing Java class
-		searchRadioButton
-				.setText(WizardMessages.JavaSelectionWizardPage_Search);
-		searchRadioButton.setSelection(true);
-		searchRadioButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				createRadioButton.setSelection(!searchRadioButton
-						.getSelection());
-				enableSearchSection(searchRadioButton.getSelection());
-				verifyComplete();
-			}
-		});
-
-		Composite searchSection = new Composite(parent, SWT.NULL);
-
-		classSearchDialogField = new ClassButtonDialogField(currentProject);
-		classSearchDialogField.setHyperLink(null);
-		int numberOfControls = classSearchDialogField.getNumberOfControls();
-
-		GridLayout layout = new GridLayout();
-		layout.numColumns = numberOfControls;
-		layout.verticalSpacing = 9;
-		searchSection.setLayout(layout);
-		searchSection.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
-		classSearchDialogField.doFillIntoGrid(null, searchSection,
-				numberOfControls);
-
-		GridData gd = (GridData) classSearchDialogField.getLabelControl(null,
-				searchSection).getLayoutData();
-		gd.horizontalIndent = HORIZONTAL_INDENT_DEFAULT;
-
-		// JavaSelectionWizardPage.Search.ClassName = Qulified class name:
-		classSearchDialogField
-				.setLabelText(WizardMessages.JavaSelectionWizardPage_Search_ClassName);
-
-		LayoutUtil.setHorizontalGrabbing(classSearchDialogField.getTextControl(
-				null, searchSection));
-
-		classSearchDialogField
-				.setDialogFieldChangeListener(new IDialogFieldChangeListener() {
-					public void dialogFieldChanged(DialogField field) {
-						className = classSearchDialogField.getText();
-						verifyComplete();
-					}
-
-				});
-
-		Label searchDesp = new Label(searchSection, SWT.NONE);
-		searchDesp
-				.setText(WizardMessages.JavaSelectionWizardPage_Search_Description);
-
-		gd = new GridData();
-		gd.horizontalSpan = numberOfControls;
-		gd.horizontalIndent = HORIZONTAL_INDENT_DEFAULT;
-		searchDesp.setLayoutData(gd);
-	}
-
-	/**
-	 * Create the generation section including the labels, texts, and browser
-	 * buttons
-	 * 
-	 * @param parent -
-	 *            parent composite control
-	 */
-	private void createGenerateSection(Composite parent) {
-		createRadioButton = new Button(parent, SWT.RADIO);
-		createRadioButton
-				.setText(WizardMessages.JavaSelectionWizardPage_Create);
-		createRadioButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				searchRadioButton.setSelection(!createRadioButton
-						.getSelection());
-				enableSearchSection(!createRadioButton.getSelection());
-				verifyComplete();
-			}
-		});
-
-		Composite createSection = new Composite(parent, SWT.NULL);
-		GridLayout layout = new GridLayout();
-		layout.numColumns = 3;
-		layout.verticalSpacing = 9;
-		createSection.setLayout(layout);
-		createSection.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
-		Label createDesp = new Label(createSection, SWT.NONE);
-		createDesp
-				.setText(WizardMessages.JavaSelectionWizardPage_Create_Description);
-
-		GridData gd = new GridData();
-		gd.horizontalIndent = HORIZONTAL_INDENT_DEFAULT;
-		createDesp.setLayoutData(gd);
-	}
-
-	/**
-	 * create a new java class or not
-	 * 
-	 * @return true if the create new java class radio button is selected
-	 */
-	public boolean isCreateNewJavaClass() {
-		return createRadioButton.getSelection();
-	}
-
-	/**
-	 * get the selected java type
-	 * 
-	 * @return - type
-	 */
-	public IType getSelectedType() {
-		searchedType = JavaClassUtils.getType(currentProject,
-				classSearchDialogField.getText());
-
-		return searchedType;
-	}
-
-	/**
-	 * @return the class name
-	 */
-	public String getClassName() {
-		return className;
-	}
-
-	/**
-	 * validate the selected or input java type name
-	 * 
-	 * @return
-	 */
-	private IStatus validateJavaTypeName() {
-		IStatus status = null;
-		if (classSearchDialogField.getText().length() == 0) {
-			status = new Status(
-					IStatus.ERROR,
-					EditorPlugin.getPluginId(),
-					-1,
-					NLS
-							.bind(
-									WizardMessages.JavaSelectionWizardPage_Error_ClassIsEmpty,
-									classSearchDialogField.getText()), null);
-		} else {
-			// ensure the name follows the java conventsions.
-			status = JavaConventions
-					    .validateJavaTypeName(classSearchDialogField.getText(), JavaCore.VERSION_1_3,JavaCore.VERSION_1_3);
-			if (status.getSeverity() != IStatus.ERROR) {
-				// ensure the input or selected type is defined in the current
-				// project
-				if (getSelectedType() == null) {
-					status = new Status(
-							IStatus.ERROR,
-							EditorPlugin.getPluginId(),
-							-1,
-							NLS
-									.bind(
-											WizardMessages.JavaSelectionWizardPage_Error_ClassIsNotDefined,
-											classSearchDialogField.getText()),
-							null);
-				}
-			}
-		}
-		return status;
-	}
-
-	/**
-	 * verify and update the complete status
-	 */
-	private void verifyComplete() {
-		IStatus status = null;
-
-		if (isCreateNewJavaClass()) {
-			setPageComplete(true);
-			setMessage(null);
-			setErrorMessage(null);
-		} else {
-			if (searchRadioButton.getSelection()) {
-				status = validateJavaTypeName();
-			}
-			String errorMessage = null;
-			setPageComplete(status.getSeverity() != IStatus.ERROR);
-
-			if (status.getSeverity() == IStatus.ERROR) {
-				errorMessage = status.getMessage();
-			}
-
-			if (errorMessage != null) {
-				setErrorMessage(errorMessage);
-			} else {
-				setErrorMessage(null);
-			}
-
-			if (status.getSeverity() != IStatus.OK) {
-				setMessage(status.getMessage());
-			} else {
-				setMessage(null);
-			}
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/wizard/ManagedBeanPropertyPage.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/wizard/ManagedBeanPropertyPage.java
deleted file mode 100644
index cf221a0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/wizard/ManagedBeanPropertyPage.java
+++ /dev/null
@@ -1,321 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others. All rights reserved. This
- * program and the accompanying materials are made available under the terms of
- * the Eclipse Public License v1.0 which accompanies this distribution, and is
- * available at http://www.eclipse.org/legal/epl-v10.html Contributors: Sybase,
- * Inc. - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.wizard;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jface.wizard.IWizardPage;
-import org.eclipse.jface.wizard.WizardPage;
-import org.eclipse.jst.jsf.common.ui.internal.guiutils.SWTUtils;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.jst.jsf.facesconfig.ui.IFacesConfigConstants;
-import org.eclipse.jst.jsf.facesconfig.ui.util.JavaClassUtils;
-import org.eclipse.jst.jsf.facesconfig.ui.util.ManagedBeanUtil;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * ManangedBeanProperty wizard page used to show properties of the previous
- * selected java class, suade services. and set the default values for each
- * property.
- * 
- * @author Xiao-guang Zhang, sfshi
- */
-public class ManagedBeanPropertyPage extends WizardPage implements ISummaryDataSource {
-	/** Default height of description Text Control */
-	private static final int DESCRIPTION_TEXT_HEIGHT = 60;
-
-	private static final int DEFAULT_WIDTHHINT = 10;
-
-	/** The Text control for managed bean instance name */
-	private Text managedBeanNameText;
-
-	/** The Combo control for Project Selection */
-	private Combo scopeCombo;
-
-	/** The Text control for managed bean's description */
-	private Text managedBeanDescriptionText;
-
-	private String helpID = null;
-
-	private IProject currentProject;
-
-	private String defaultScope;
-
-	/**
-	 * @param defaultScope
-	 *            the default scope, if be null, then use "session".
-	 * @param project
-	 */
-	public ManagedBeanPropertyPage(String defaultScope, IProject project) {
-		super("ManagedBeanPropertyWizardPage"); //$NON-NLS-1$);
-
-		this.defaultScope = defaultScope;
-		currentProject = project;
-		setTitle(WizardMessages.ManagedBeanPropertyWizardPage_Title);
-		setDescription(WizardMessages.ManagedBeanPropertyWizardPage_Description);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see WizardPage#createControl(Composite)
-	 */
-	public void createControl(Composite parent) {
-		initializeDialogUnits(parent);
-
-		Composite container = new Composite(parent, SWT.NONE);
-		GridLayout gl = new GridLayout();
-		gl.numColumns = 1;
-		container.setLayout(gl);
-		GridData gridData = new GridData(GridData.FILL_BOTH);
-		container.setLayoutData(gridData);
-
-		createGeneralSection(container);
-
-		setControl(container);
-
-		setPageComplete(false);
-
-		if (helpID != null) {
-			EditorPlugin.getDefault().getWorkbench().getHelpSystem().setHelp(
-					getControl(), helpID);
-		}
-	}
-
-	/**
-	 * create managed bean 's configuration group
-	 * 
-	 * @param container
-	 */
-	private void createGeneralSection(Composite container) {
-		Group generalSection = new Group(container, SWT.NONE);
-
-		// ManagedBeanPropertyWizardPage.General = General
-		generalSection
-				.setText(WizardMessages.ManagedBeanPropertyWizardPage_General);
-
-		GridLayout gl = new GridLayout();
-		// gl.marginHeight = 20;
-		gl.numColumns = 2;
-		generalSection.setLayout(gl);
-		GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
-		generalSection.setLayoutData(gridData);
-
-		SWTUtils
-				.createLabel(
-						generalSection,
-						WizardMessages.ManagedBeanPropertyWizardPage_ManagedBeanName,
-						1);
-
-		managedBeanNameText = SWTUtils.createTextBox(generalSection, 1);
-		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-		gd.horizontalSpan = 1;
-		gd.widthHint = DEFAULT_WIDTHHINT;
-		managedBeanNameText.setLayoutData(gd);
-
-		managedBeanNameText.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				// dialogChanged();
-				if (isValidManagedBeanName(true)) {
-					setPageComplete(true);
-				} else {
-					setPageComplete(false);
-				}
-			}
-		});
-
-		SWTUtils
-				.createLabel(
-						generalSection,
-						WizardMessages.ManagedBeanPropertyWizardPage_ManagedBeanScope,
-						1);
-
-		String[] items = {
-				IFacesConfigConstants.MANAGED_BEAN_SCOPE_APPLICATION,
-				IFacesConfigConstants.MANAGED_BEAN_SCOPE_SESSION,
-				IFacesConfigConstants.MANAGED_BEAN_SCOPE_REQUEST,
-				IFacesConfigConstants.MANAGED_BEAN_SCOPE_NONE };
-
-		scopeCombo = SWTUtils.createCombo(generalSection, items, 1);
-		gd = new GridData(GridData.FILL_HORIZONTAL);
-		gd.horizontalSpan = 1;
-		gd.widthHint = DEFAULT_WIDTHHINT;
-		scopeCombo.setLayoutData(gd);
-
-		Label labelDesp = SWTUtils
-				.createLabel(
-						generalSection,
-						WizardMessages.ManagedBeanPropertyWizardPage_ManagedBeanDescription,
-						1);
-
-		gd = new GridData(GridData.VERTICAL_ALIGN_BEGINNING);
-		labelDesp.setLayoutData(gd);
-
-		managedBeanDescriptionText = SWTUtils.createTextBoxScrollable(
-				generalSection, 1, -1, DESCRIPTION_TEXT_HEIGHT);
-
-	}
-
-	/**
-	 * Validates the managed bean Name entry
-	 * 
-	 * @param reportError -
-	 *            true, to report errors.
-	 * @return boolean - the valid state of the data entered
-	 */
-	private boolean isValidManagedBeanName(boolean reportError) {
-		if (managedBeanNameText.getText().length() == 0) {
-			if (reportError) {
-				setErrorMessage(WizardMessages.ManagedBeanPropertyWizardPage_Warning_MissingManagedBeanName);
-			}
-			return false;
-		} else if (JavaClassUtils.hasIllegalCharacters(managedBeanNameText
-				.getText())) {
-			if (reportError) {
-				setErrorMessage(WizardMessages.ManagedBeanPropertyWizardPage_Warning_InvalidManagedBeanName);
-			}
-			return false;
-		} else {
-			if (ManagedBeanUtil.isBeanDuplicate(currentProject,
-					managedBeanNameText.getText())) {
-				if (reportError) {
-					setErrorMessage(WizardMessages.ManagedBeanPropertyWizardPage_Warning_DuplicateManagedBeanName);
-				}
-				return false;
-			}
-
-		}
-
-		setErrorMessage(null);
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.wizard.IWizardPage#setPreviousPage(org.eclipse.jface.wizard.IWizardPage)
-	 */
-	public void setPreviousPage(IWizardPage page) {
-		super.setPreviousPage(page);
-		initialize();
-	}
-
-	private void initialize() {
-		if (defaultScope != null && defaultScope.length() > 0)
-			scopeCombo.setText(defaultScope);
-		else
-			scopeCombo.setText("session"); //$NON-NLS-1$
-
-		if (((NewManagedBeanWizard) getWizard()).getSuggestedBeanName() != null) {
-			this.managedBeanNameText
-					.setText(((NewManagedBeanWizard) getWizard())
-							.getSuggestedBeanName());
-		} else {
-			String beanName;
-			if (this.getPreviousPage() instanceof ManagedBeanClassSelectionPage) {
-				beanName = ((ManagedBeanClassSelectionPage) this.getPreviousPage())
-						.getClassName();
-			} else {
-				beanName = ((NewJavaClassPage) this.getPreviousPage())
-						.getTypeName();
-			}
-			beanName = beanName.substring(beanName.lastIndexOf(".") + 1); //$NON-NLS-1$
-			if (beanName != null && beanName.length() > 0) {
-				beanName = (beanName.substring(0, 1)).toLowerCase()
-						+ (beanName.substring(1));
-
-				beanName = ManagedBeanUtil.getDefaultManagedBeanName(
-						currentProject, beanName);
-
-			} else
-				beanName = ""; //$NON-NLS-1$
-			managedBeanNameText.setText(beanName);
-		}
-	}
-
-	/**
-	 * Returns key-value summary data.
-	 * 
-	 * @return List - Summary data.
-	 */
-	public List getSummaryData() {
-		List data = new ArrayList();
-
-		data
-				.add(new String[] {
-						WizardMessages.NewJavaManagedBeanWizard_Summary_ManagedBeanName,
-						getManagedBeanName() });
-		data
-				.add(new String[] {
-						WizardMessages.NewJavaManagedBeanWizard_Summary_ManagedBeanScope,
-						getManagedBeanScope() });
-		data.add(new String[] {
-				WizardMessages.NewJavaManagedBeanWizard_Summary_ClassName,
-				getManagedBeanClass() });
-
-		data
-				.add(new String[] {
-						WizardMessages.NewJavaManagedBeanWizard_Summary_Description,
-						getManagedBeanDescription() });
-		return data;
-	}
-
-	/**
-	 * @return the name of the managed bean
-	 */
-	public String getManagedBeanName() {
-		return this.managedBeanNameText.getText().trim();
-	}
-
-	/**
-	 * @return the managed bean class name
-	 */
-	public String getManagedBeanClass() {
-		if (this.getPreviousPage() instanceof ManagedBeanClassSelectionPage) {
-			return ((ManagedBeanClassSelectionPage) this.getPreviousPage()).getClassName();
-		} else if (this.getPreviousPage() instanceof NewJavaClassPage) {
-			NewJavaClassPage newJavaClassPage = (NewJavaClassPage) this.getPreviousPage();
-			StringBuffer buffer = new StringBuffer();
-			if (newJavaClassPage.getPackageText() != null
-					&& newJavaClassPage.getPackageText().length() > 0) {
-				buffer.append(newJavaClassPage.getPackageText());
-				buffer.append("."); //$NON-NLS-1$
-			}
-			buffer.append(newJavaClassPage.getTypeName());
-			return buffer.toString();
-		}
-
-		return "";//$NON-NLS-1$
-	}
-
-	/**
-	 * @return the managed bean scope
-	 */
-	public String getManagedBeanScope() {
-		return this.scopeCombo.getText().trim();
-	}
-
-	/**
-	 * @return the managed bean description
-	 */
-	public String getManagedBeanDescription() {
-		return this.managedBeanDescriptionText.getText().trim();
-	}
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/wizard/NewJavaClassPage.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/wizard/NewJavaClassPage.java
deleted file mode 100644
index 4cc972c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/wizard/NewJavaClassPage.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.wizard;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.wizard.IWizardPage;
-
-/**
- * Wizard page to create a new class.
- * 
- * @author Xiao-guang Zhang
- * 
- */
-public class NewJavaClassPage extends org.eclipse.jdt.ui.wizards.NewClassWizardPage
-		implements ISummaryDataSource {
-
-	private final IProject currentProject;
-
-	/**
-	 * @param project
-	 */
-	public NewJavaClassPage(IProject project) {
-		super();
-		currentProject = project;
-		setPageComplete(false);
-	}
-
-	private void initialize() {
-		if (getPackageFragmentRoot() == null
-				|| currentProject != getPackageFragmentRoot().getJavaProject()
-						.getProject()) {
-			IJavaProject jProject = JavaCore.create(currentProject);
-			StructuredSelection selection = new StructuredSelection(jProject);
-			init(selection);
-		}
-	}
-
-	private boolean isSkipped() {
-		if ((getPreviousPage() instanceof ManagedBeanClassSelectionPage)
-				&& !((ManagedBeanClassSelectionPage) getPreviousPage()).isCreateNewJavaClass())
-			return true;
-		return false;
-	}
-
-	public List getSummaryData() {
-		List data = new ArrayList();
-
-		if (!isSkipped()) {
-			data
-					.add(new String[] {
-							WizardMessages.NewJavaManagedBeanWizard_Summary_SourceFolder,
-							getPackageFragmentRootText(), });
-
-			data
-					.add(new String[] {
-							WizardMessages.NewJavaManagedBeanWizard_Summary_PackageName,
-							getPackageText(), });
-
-			data
-					.add(new String[] {
-							WizardMessages.NewJavaManagedBeanWizard_Summary_TypeName,
-							getTypeName() }); 
-		}
-		return data;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.wizard.IWizardPage#setPreviousPage(org.eclipse.jface.wizard.IWizardPage)
-	 */
-	public void setPreviousPage(IWizardPage page) {
-		super.setPreviousPage(page);
-		initialize();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/wizard/NewManagedBeanWizard.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/wizard/NewManagedBeanWizard.java
deleted file mode 100644
index 4226952..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/wizard/NewManagedBeanWizard.java
+++ /dev/null
@@ -1,229 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others. All rights reserved. This
- * program and the accompanying materials are made available under the terms of
- * the Eclipse Public License v1.0 which accompanies this distribution, and is
- * available at http://www.eclipse.org/legal/epl-v10.html Contributors: Sybase,
- * Inc. - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.wizard;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.jface.wizard.IWizardPage;
-import org.eclipse.jface.wizard.Wizard;
-import org.eclipse.jface.wizard.WizardPage;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-
-/**
- * The wizard for creating a managed bean on faces config model.
- * 
- * @author Xiao-guang Zhang, sfshi
- */
-public class NewManagedBeanWizard extends Wizard implements ISummaryDataSource {
-
-	/** log instance */
-	private static final Logger log = EditorPlugin
-			.getLogger(NewManagedBeanWizard.class);
-
-	/**
-	 * The wizard page where user can select a Java class for the managed bean
-	 * to be created.
-	 */
-	private ManagedBeanClassSelectionPage managedBeanClassSelectionPage;
-
-	/**
-	 * The wizard page where user can create a new Java class for the managed
-	 * bean to be created.
-	 */
-	private NewJavaClassPage newJavaClassPage;
-
-	private ManagedBeanPropertyPage managedBeanPropertyPage;
-
-	private String managedBeanName;
-
-	private String managedBeanScope;
-
-	private String managedBeanClass;
-
-	private String managedBeanDescription;
-
-	private IProject project;
-
-	/**
-	 * the suggested name for the managed bean, if setted, then use it in
-	 * ManagedBeanPropertyWizardPage.
-	 */
-	private String suggestedBeanName;
-
-	private String defaultScope;
-
-	/**
-	 * Constructor
-	 * 
-	 * @param project
-	 *            The project.
-	 */
-	public NewManagedBeanWizard(IProject project) {
-		super();
-		setWindowTitle(WizardMessages.NewManagedBeanWizardBase_Title);
-		this.project = project;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.wizards.NewWizard#addPages()
-	 */
-	public void addPages() {
-		setDialogSettings(EditorPlugin.getDefault().getDialogSettings());
-
-		// add java source selection page.
-		managedBeanClassSelectionPage = new ManagedBeanClassSelectionPage(project);
-		addPage(managedBeanClassSelectionPage);
-
-		// add the class type page
-		newJavaClassPage = new NewJavaClassPage(project);
-		addPage(newJavaClassPage);
-
-		managedBeanPropertyPage = new ManagedBeanPropertyPage(defaultScope, project);
-		addPage(managedBeanPropertyPage);
-
-		// // add the summary page
-		SummaryPage summaryPage = new SummaryPage(this);
-		addPage(summaryPage);
-		summaryPage
-				.setDescription(WizardMessages.NewJavaManagedBeanWizard_SummaryPage_Description);
-	}
-
-	/**
-	 * Skip the NewJavaClassPage when user select "Using an existing class" on the
-	 * ManagedBeanClassSelectionPage.
-	 */
-	public IWizardPage getNextPage(IWizardPage page) {
-		IWizardPage nextPage = super.getNextPage(page);
-		if (page instanceof ManagedBeanClassSelectionPage
-				&& !((ManagedBeanClassSelectionPage) page).isCreateNewJavaClass()) {
-			((WizardPage) nextPage).setPageComplete(true);
-			return getNextPage(nextPage);
-		}
-		return nextPage;
-	}
-
-	public boolean performFinish() {
-
-		managedBeanName = managedBeanPropertyPage.getManagedBeanName();
-		managedBeanClass = managedBeanPropertyPage.getManagedBeanClass();
-		managedBeanScope = managedBeanPropertyPage.getManagedBeanScope();
-		managedBeanDescription = managedBeanPropertyPage.getManagedBeanDescription();
-		if (managedBeanClassSelectionPage.isCreateNewJavaClass())
-			createNewJavaClass();
-
-		return true;
-	}
-
-	/**
-	 * create a new java class according to current inputs in
-	 * NewClassWizardPage.
-	 */
-	private void createNewJavaClass() {
-		try {
-			newJavaClassPage.createType(new NullProgressMonitor());
-		} catch (CoreException e) {
-			log.info("NewJavaManagedBeanWizard.Error.CreateType", e); //$NON-NLS-1$
-
-			EditorPlugin.getAlerts().error(
-					"NewJavaManagedBeanWizard.Alert.CreateType.Title", //$NON-NLS-1$
-					"NewJavaManagedBeanWizard.Alert.CreateType.Description"); //$NON-NLS-1$
-			return;
-		} catch (InterruptedException e) {
-			log.info("NewJavaManagedBeanWizard.Error.CreateType", e); //$NON-NLS-1$
-			EditorPlugin.getAlerts().error(
-					"NewJavaManagedBeanWizard.Alert.CreateType.Title", //$NON-NLS-1$
-					"NewJavaManagedBeanWizard.Alert.CreateType.Description"); //$NON-NLS-1$
-			return;
-		}
-		newJavaClassPage.getCreatedType();
-	}
-
-	/**
-	 * @return the suggested bean name
-	 */
-	public String getSuggestedBeanName() {
-		return suggestedBeanName;
-	}
-
-	/**
-	 * Set a name for the new managed bean, this name will be shown in the
-	 * ManagedBeanPropertyWizardPage. If don't set the name, then will get a
-	 * default bean name from the managed bean class name.
-	 * 
-	 * @param suggestedBeanName
-	 */
-	public void setSuggestedBeanName(String suggestedBeanName) {
-		this.suggestedBeanName = suggestedBeanName;
-	}
-
-	/**
-	 * @return the default scope value
-	 */
-	public String getDefaultScope() {
-		return defaultScope;
-	}
-
-	/**
-	 * set a default scope value for this new managed bean.
-	 * 
-	 * @param defaultScope
-	 */
-	public void setDefaultScope(String defaultScope) {
-		this.defaultScope = defaultScope;
-	}
-
-	/**
-	 * @return the class name
-	 */
-	public String getManagedBeanClass() {
-		return managedBeanClass;
-	}
-
-	/**
-	 * @return the bean description
-	 */
-	public String getManagedBeanDescription() {
-		return managedBeanDescription;
-	}
-
-	/**
-	 * @return the managed bean's symbolic name
-	 */
-	public String getManagedBeanName() {
-		return managedBeanName;
-	}
-
-	/**
-	 * @return the managed bean's scope
-	 */
-	public String getManagedBeanScope() {
-		return managedBeanScope;
-	}
-
-	public List getSummaryData() {
-		List data = new ArrayList();
-		IWizardPage[] pages = getPages();
-
-		for (int i = 0; i < pages.length; i++) {
-			if (pages[i] instanceof ISummaryDataSource) {
-
-				data.addAll(((ISummaryDataSource) pages[i]).getSummaryData());
-			}
-		}
-		return data;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/wizard/SummaryPage.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/wizard/SummaryPage.java
deleted file mode 100644
index e917466..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/wizard/SummaryPage.java
+++ /dev/null
@@ -1,147 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others. All rights reserved. This
- * program and the accompanying materials are made available under the terms of
- * the Eclipse Public License v1.0 which accompanies this distribution, and is
- * available at http://www.eclipse.org/legal/epl-v10.html Contributors: Sybase,
- * Inc. - initial API and implementation
- ******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.wizard;
-
-import org.eclipse.jface.viewers.ColumnPixelData;
-import org.eclipse.jface.viewers.TableLayout;
-import org.eclipse.jface.wizard.WizardPage;
-import org.eclipse.jst.jsf.common.ui.internal.guiutils.SWTUtils;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.swt.widgets.TableItem;
-
-/**
- * Common wizard page used to summarize information entered in previous pages.
- * 
- * @author plevin
- * @version 1.0
- */
-public class SummaryPage extends WizardPage
-{
-	private static final String WIZARD_SUMMARY_PAGE = "WizardSummaryPage"; //$NON-NLS-1$
-
-	/** The source of the summary items */
-	private ISummaryDataSource source;
-
-	/** The table control that displays the summary items */
-	private Table table;
-
-	/**
-	 * This Constructor creates the summary page
-	 */
-	public SummaryPage()
-	{
-		super( WIZARD_SUMMARY_PAGE );
-		setTitle( WizardMessages.WizardSummaryPage_Title_WizardSummary );
-		setDescription( WizardMessages.WizardSummaryPage_Summary_SummaryDesc );
-	}
-
-	/**
-	 * This Constructor initializes the data source.
-	 * 
-	 * @param source -
-	 *            Summary data source
-	 */
-	public SummaryPage( ISummaryDataSource source )
-	{
-		this();
-		this.source = source;
-	}
-
-	/**
-	 * Determines if the wizard can enable the Next button
-	 * 
-	 * @return boolean - the state of the Next button
-	 */
-	public boolean canFlipToNextPage()
-	{
-		return false;
-	}
-
-	/**
-	 * Creates the page controls
-	 * 
-	 * @param parent -
-	 *            the wizard composite
-	 */
-	public void createControl( Composite parent )
-	{
-
-		Composite composite = SWTUtils.createComposite( parent, 1 );
-
-		table = new Table( composite, SWT.BORDER );
-		table.setLayoutData( new GridData( GridData.FILL_BOTH ) );
-		table.setHeaderVisible( true );
-		table.setLinesVisible( true );
-
-		TableLayout layout = new TableLayout();
-		table.setLayout( layout );
-
-		layout.addColumnData( new ColumnPixelData( 163 ) );
-		layout.addColumnData( new ColumnPixelData( 350 ) );
-
-		TableColumn keyCol = new TableColumn( table, SWT.NONE );
-		keyCol.setText( WizardMessages.WizardSummaryPage_Label_Field );
-
-		TableColumn valueCol = new TableColumn( table, SWT.NONE );
-		valueCol
-				.setText( WizardMessages.WizardSummaryPage_Label_Value );
-
-		setControl( composite );
-		setPageComplete( true );
-	}
-
-	/**
-	 * Populates the table with summary information.
-	 */
-	public void loadSummaryData()
-	{
-		if ( source == null )
-		{
-			return;
-		}
-		Object[] data = source.getSummaryData().toArray();
-		table.removeAll();
-		for ( int i = 0; i < data.length; i++ )
-		{
-			TableItem item = new TableItem( table, SWT.NONE );
-			item.setText( (String[]) data[i] );
-		}
-		return;
-	}
-
-	/**
-	 * Sets summary page data source.
-	 * 
-	 * @param s -
-	 *            Data source.
-	 */
-	public void setSummaryDataSource( ISummaryDataSource s )
-	{
-		source = s;
-	}
-
-	/**
-	 * Populates the table with summary items when the page becomes visible.
-	 * 
-	 * @param visible -
-	 *            the visible state of the page
-	 */
-	public void setVisible( boolean visible )
-	{
-		super.setVisible( visible );
-
-		if ( visible == true )
-		{
-			loadSummaryData();
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/wizard/WizardMessages.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/wizard/WizardMessages.java
deleted file mode 100644
index b128bfd..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/wizard/WizardMessages.java
+++ /dev/null
@@ -1,461 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.wizard;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * Message bundle for wizards
- *
- */
-public final class WizardMessages extends NLS {
-
-	private static final String BUNDLE_NAME = "org.eclipse.jst.jsf.facesconfig.ui.wizard.WizardMessages"; //$NON-NLS-1$
-
-	private WizardMessages() {
-		// Do not instantiate
-	}
-
-	static {
-		NLS.initializeMessages(BUNDLE_NAME, WizardMessages.class);
-	}
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String NewManagedBeanWizardBase_Type;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String NewManagedBeanWizardBase_Description;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String NewManagedBeanWizardBase_Title;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String NewManagedBeanCreationWizard_Title;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String IntroWizardPage_Title;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String IntroWizardPage_Intro;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String ManagedBeanWizardSelectionPage_Title;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String ManagedBeanWizardSelectionPage_Description;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String ManagedBeanWizardSelectionPage_Group;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String ManagedBeanWizardSelectionPage_HelpContextID;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String Registry_LoadWizard_Error;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String NewWizard_Title_WizardDefault;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String ManagedBeanPropertyWizardPage_Title;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String ManagedBeanPropertyWizardPage_Description;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String ManagedBeanPropertyWizardPage_General;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String ManagedBeanPropertyWizardPage_ManagedBeanName;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String ManagedBeanPropertyWizardPage_ManagedBeanScope;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String ManagedBeanPropertyWizardPage_ManagedBeanDescription;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String ManagedBeanPropertyWizardPage_ManagedBeanProperty;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String ManagedBeanPropertyWizardPage_PropertyName;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String ManagedBeanPropertyWizardPage_Type;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String ManagedBeanPropertyWizardPage_Value;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String ManagedBeanPropertyWizardPage_Button_Add;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String ManagedBeanPropertyWizardPage_Button_Edit;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String ManagedBeanPropertyWizardPage_Button_Remove;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String ManagedBeanPropertyWizardPage_Warning_MissingManagedBeanName;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String ManagedBeanPropertyWizardPage_Warning_InvalidManagedBeanName;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String ManagedBeanPropertyWizardPage_Warning_DuplicateManagedBeanName;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String ManagedBeanPropertyEditDialog_PropertyName;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String ManagedBeanPropertyEditDialog_DataType;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String ManagedBeanPropertyEditDialog_InitialValue;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String ManagedBeanPropertyEditDialog_Title_NewPropertyEntry;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String ManagedBeanPropertyEditDialog_Title_ExistingPropertyEntry;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String FacesConfigSelectionWizardPage_Title;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String FacesConfigSelectionWizardPage_Description;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String FacesConfigSelectionWizardPage_Project;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String FacesConfigSelectionWizardPage_FacesConfig;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String FacesConfigSelectionWizardPage_FacesConfig_Browser;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String FacesConfigSelectionWizardPage_Warning_MissingProjectName;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String FacesConfigSelectionWizardPage_Warning_MissingFacesConfigName;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String FacesConfigSelectionWizardPage_Warning_InvalidFacesConfigName;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String FacesConfigSelectionWizardPage_Warning_InvalidFacesConfigContent;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String FacesConfigSelectionWizardPage_Warning_FacesConfigNotDefinedInWebDotXML;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String FacesConfigSelectionWizardPage_HelpContextID;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String FacesConfigFileSelectionDialog_Title;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String FacesConfigFileSelectionDialog_Description;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String JavaSelectionWizardPage_Title;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String JavaSelectionWizardPage_Description;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String JavaSelectionWizardPage_Group;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String JavaSelectionWizardPage_Search;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String JavaSelectionWizardPage_Search_Description;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String JavaSelectionWizardPage_Search_ClassName;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String JavaSelectionWizardPage_Search_ClassName_Browse;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String JavaSelectionWizardPage_Create;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String JavaSelectionWizardPage_Create_Description;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String JavaSelectionWizardPage_FindType;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String JavaSelectionWizardPage_FindType_Filter;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String JavaSelectionWizardPage_Error_ClassIsEmpty;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String JavaSelectionWizardPage_Error_ClassIsNotDefined;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String JavaSelectionWizardPage_HelpContextID;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String NewJavaManagedBeanWizard_Summary_ProjectName;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String NewJavaManagedBeanWizard_Summary_FacesConfigFileName;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String NewJavaManagedBeanWizard_Summary_TypeName;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String NewJavaManagedBeanWizard_Summary_PackageName;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String NewJavaManagedBeanWizard_Summary_SourceFolder;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String NewJavaManagedBeanWizard_Summary_ManagedBeanName;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String NewJavaManagedBeanWizard_Summary_ManagedBeanScope;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String NewJavaManagedBeanWizard_Summary_ClassName;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String NewJavaManagedBeanWizard_Summary_Description;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String NewJavaManagedBeanWizard_SummaryPage_Description;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String NewJavaManagedBeanWizard_Task_CreateNewManagedBean;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String NewJavaManagedBeanWizard_Task_CreateNewJavaClass;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String DuplicateBeanWizard_Title;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String DuplicateBeanPage_Title;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String DuplicateBeanPage_Description;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String DuplicateBeanGroup_Group_Label;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String DuplicateBeanGroup_OverwriteButton_Text;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String DuplicateBeanGroup_NewButton_Text;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String DuplicateBeanGroup_NewNameDialogField_Label;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String DuplicateBeanGroup_Error_EmptyManagedBeanName;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String DuplicateBeanGroup_Error_InvalidManagedBeanName;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String DuplicateBeanGroup_Error_DuplicatedManagedBeanName;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String WizardSummaryPage_Title_WizardSummary;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String WizardSummaryPage_Summary_SummaryDesc;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String WizardSummaryPage_Label_Field;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String WizardSummaryPage_Label_Value;
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/wizard/WizardMessages.properties b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/wizard/WizardMessages.properties
deleted file mode 100644
index e594ea8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/wizard/WizardMessages.properties
+++ /dev/null
@@ -1,128 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-NewManagedBeanWizardBase_Type = ManagedBeanTypeName
-NewManagedBeanWizardBase_Description = ManagedBeanTypeDescription
-NewManagedBeanWizardBase_Title = New Managed Bean Wizard
-
-NewManagedBeanCreationWizard_Title = Create a Managed Bean
-
-IntroWizardPage_Title = Introduction Page
-IntroWizardPage_Intro = This wizard walks through the steps to create a managed bean.
-
-ManagedBeanWizardSelectionPage_Title = Managed Bean Selection Page
-ManagedBeanWizardSelectionPage_Description = Select a managed bean type to proceed
-ManagedBeanWizardSelectionPage_Group = Please select the managed bean type:
-ManagedBeanWizardSelectionPage_HelpContextID = com.sybase.stf.jmt.new_managedbean_wizard
-
-Registry_LoadWizard_Error = Error loading wizard element, couldn't initialize!
-####################################################
-# Resource message for NewWizard
-####################################################
-NewWizard_Title_WizardDefault = call setWindowTitle(String) in your wizard sub-class
-
-##################################################################
-# Resource message for NewJavaManagedBeanWizards and its' pages.
-##################################################################
-ManagedBeanPropertyWizardPage_Title = Managed Bean Configuration
-ManagedBeanPropertyWizardPage_Description = Set managed bean's name and scope, and create or update Managed Bean's properties, their types and default values.
-
-ManagedBeanPropertyWizardPage_General = General
-
-ManagedBeanPropertyWizardPage_ManagedBeanName = Name:
-ManagedBeanPropertyWizardPage_ManagedBeanScope = Scope:
-ManagedBeanPropertyWizardPage_ManagedBeanDescription = Description:
-
-ManagedBeanPropertyWizardPage_ManagedBeanProperty = Properties:
-ManagedBeanPropertyWizardPage_PropertyName = Property Name
-ManagedBeanPropertyWizardPage_Type = Property Type
-ManagedBeanPropertyWizardPage_Value = Value
-ManagedBeanPropertyWizardPage_Button_Add = Add...
-ManagedBeanPropertyWizardPage_Button_Edit = Edit...
-ManagedBeanPropertyWizardPage_Button_Remove = Remove
-
-ManagedBeanPropertyWizardPage_Warning_MissingManagedBeanName = Managed bean name must be entered!
-ManagedBeanPropertyWizardPage_Warning_InvalidManagedBeanName = Managed bean name is not valid!
-ManagedBeanPropertyWizardPage_Warning_DuplicateManagedBeanName = Managed bean name can not be duplicate!
-
-ManagedBeanPropertyEditDialog_PropertyName = Property name:
-ManagedBeanPropertyEditDialog_DataType = Data type:
-ManagedBeanPropertyEditDialog_InitialValue = Initial value:
-
-ManagedBeanPropertyEditDialog_Title_NewPropertyEntry = New Property Entry
-ManagedBeanPropertyEditDialog_Title_ExistingPropertyEntry = Existing Property Entry
-
-FacesConfigSelectionWizardPage_Title = Faces-Config File
-FacesConfigSelectionWizardPage_Description = Select an existing faces-config file, such as faces-config.xml, to save the new managed bean.
-
-FacesConfigSelectionWizardPage_Project = Project name:
-FacesConfigSelectionWizardPage_FacesConfig = Faces-Config file:
-FacesConfigSelectionWizardPage_FacesConfig_Browser = Browse...
-
-FacesConfigSelectionWizardPage_Warning_MissingProjectName = Project name must be entered!
-FacesConfigSelectionWizardPage_Warning_MissingFacesConfigName = Faces-Config file name must be entered!
-FacesConfigSelectionWizardPage_Warning_InvalidFacesConfigName = Faces-config file name does not exist!
-FacesConfigSelectionWizardPage_Warning_InvalidFacesConfigContent = ''{0}'' is not a valid faces-config file!
-FacesConfigSelectionWizardPage_Warning_FacesConfigNotDefinedInWebDotXML = ''{0}'' is not specified in web.xml file!
-FacesConfigSelectionWizardPage_HelpContextID = com.sybase.stf.jmt.select_facesconfig_page
-
-FacesConfigFileSelectionDialog_Title = Faces-config File Selection
-FacesConfigFileSelectionDialog_Description = Select a faces-config file in the current project.
-
-JavaSelectionWizardPage_Title = Java Class Selection
-JavaSelectionWizardPage_Description = Search for an existing class or generate a new one.
-JavaSelectionWizardPage_Group = Source type for Java class
-JavaSelectionWizardPage_Search = Using an existing Java class
-JavaSelectionWizardPage_Search_Description = (This option will use an existing java class as managed bean's type.)
-JavaSelectionWizardPage_Search_ClassName = Qualified class name:
-JavaSelectionWizardPage_Search_ClassName_Browse = Browse...
-JavaSelectionWizardPage_Create = Create a new Java class
-JavaSelectionWizardPage_Create_Description = (This option will create a new java class in the next wizard page.)
-
-JavaSelectionWizardPage_FindType = Find Type
-JavaSelectionWizardPage_FindType_Filter = Choose a type (?=any character, *=any string):
-JavaSelectionWizardPage_Error_ClassIsEmpty = The type name should not be empty.
-JavaSelectionWizardPage_Error_ClassIsNotDefined = The type name ''{0}'' does not exist.
-JavaSelectionWizardPage_HelpContextID = com.sybase.stf.jmt.new_java_managedbean_wizard
-
-NewJavaManagedBeanWizard_Summary_ProjectName = Project name
-NewJavaManagedBeanWizard_Summary_FacesConfigFileName = Faces-Config file name
-NewJavaManagedBeanWizard_Summary_TypeName = Type name
-NewJavaManagedBeanWizard_Summary_PackageName = Package name
-NewJavaManagedBeanWizard_Summary_SourceFolder = Source folder
-NewJavaManagedBeanWizard_Summary_ManagedBeanName = Managed bean name
-NewJavaManagedBeanWizard_Summary_ManagedBeanScope = Managed bean scope
-NewJavaManagedBeanWizard_Summary_ClassName = Managed bean class
-NewJavaManagedBeanWizard_Summary_Description = Description
-NewJavaManagedBeanWizard_SummaryPage_Description = A new java managed bean will be created.
-
-NewJavaManagedBeanWizard_Task_CreateNewManagedBean = Creating a new managed bean
-NewJavaManagedBeanWizard_Task_CreateNewJavaClass = Creating a new java class
-
-DuplicateBeanWizard_Title = Set Duplicated Managed Bean
-DuplicateBeanPage_Title = Set duplicated managed bean
-DuplicateBeanPage_Description = Overwrite the duplicated managed bean or create a new one.
-
-DuplicateBeanGroup_Group_Label = Duplicated Managed Bean Options
-DuplicateBeanGroup_OverwriteButton_Text = Overwrite an existing managed bean using the new one
-
-DuplicateBeanGroup_NewButton_Text = Create a new managed bean
-DuplicateBeanGroup_NewNameDialogField_Label = New managed bean name:
-
-DuplicateBeanGroup_Error_EmptyManagedBeanName = The managed bean name can not be empty.
-DuplicateBeanGroup_Error_InvalidManagedBeanName = The managed bean name ''{0}'' contains invalid string, such as #,!.
-DuplicateBeanGroup_Error_DuplicatedManagedBeanName = The managed bean name ''{0}'' is duplicated.
-
-WizardSummaryPage_Title_WizardSummary = Wizard Summarys
-WizardSummaryPage_Summary_SummaryDesc = A new java managed bean will be created.
-WizardSummaryPage_Label_Field = Field
-WizardSummaryPage_Label_Value = Value
-
-
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/.classpath b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/.classpath
deleted file mode 100644
index eb95f1a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="facesconfig"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/.cvsignore b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/.cvsignore
deleted file mode 100644
index 96a949c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/.cvsignore
+++ /dev/null
@@ -1,4 +0,0 @@
-bin
-build.xml
-javaCompiler...args
-@dot
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/.project b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/.project
deleted file mode 100644
index 2b7e076..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.jst.jsf.facesconfig</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/.settings/org.eclipse.core.resources.prefs b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/.settings/org.eclipse.core.resources.prefs
deleted file mode 100644
index 2a4d55b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/.settings/org.eclipse.core.resources.prefs
+++ /dev/null
@@ -1,3 +0,0 @@
-#Sun May 27 16:03:03 EDT 2007
-eclipse.preferences.version=1
-encoding/<project>=ISO-8859-1
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/.settings/org.eclipse.jdt.core.prefs b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 46bff72..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,88 +0,0 @@
-#Tue Mar 16 20:45:27 PDT 2010
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=disabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.5
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.doc.comment.support=enabled
-org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.autoboxing=warning
-org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
-org.eclipse.jdt.core.compiler.problem.deadCode=warning
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=ignore
-org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
-org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
-org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
-org.eclipse.jdt.core.compiler.problem.invalidJavadoc=error
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocComments=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.missingJavadocTags=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
-org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=warning
-org.eclipse.jdt.core.compiler.problem.nullReference=ignore
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
-org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore
-org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=ignore
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=ignore
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=error
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=error
-org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
-org.eclipse.jdt.core.compiler.problem.unusedLocal=error
-org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore
-org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
-org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
-org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.5
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/.settings/org.eclipse.jdt.ui.prefs b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644
index 82eb6c1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,3 +0,0 @@
-#Fri Apr 06 18:25:15 PDT 2007
-eclipse.preferences.version=1
-org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8"?><templates/>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/.settings/org.eclipse.pde.prefs b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/.settings/org.eclipse.pde.prefs
deleted file mode 100644
index 669d251..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/.settings/org.eclipse.pde.prefs
+++ /dev/null
@@ -1,22 +0,0 @@
-#Fri May 30 11:55:28 PDT 2008
-compilers.f.unresolved-features=1
-compilers.f.unresolved-plugins=1
-compilers.incompatible-environment=1
-compilers.p.build=1
-compilers.p.deprecated=1
-compilers.p.discouraged-class=1
-compilers.p.internal=1
-compilers.p.missing-packages=0
-compilers.p.no-required-att=0
-compilers.p.not-externalized-att=0
-compilers.p.unknown-attribute=1
-compilers.p.unknown-class=1
-compilers.p.unknown-element=1
-compilers.p.unknown-identifier=1
-compilers.p.unknown-resource=1
-compilers.p.unresolved-ex-points=0
-compilers.p.unresolved-import=0
-compilers.s.create-docs=false
-compilers.s.doc-folder=doc
-compilers.s.open-tags=1
-eclipse.preferences.version=1
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/META-INF/MANIFEST.MF b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/META-INF/MANIFEST.MF
deleted file mode 100644
index 5783abc..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,30 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %plugin.name
-Bundle-SymbolicName: org.eclipse.jst.jsf.facesconfig; singleton:=true
-Bundle-Version: 1.2.0.qualifier
-Bundle-Activator: org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin$Implementation
-Bundle-Vendor: %plugin.provider
-Bundle-Localization: plugin
-Require-Bundle: org.eclipse.core.resources;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.core.runtime;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.jst.j2ee;bundle-version="[1.1.0,1.2.0)",
- org.eclipse.emf.ecore.xmi;bundle-version="[2.2.0,3.0.0)",
- org.eclipse.wst.common.emf;bundle-version="[1.1.103,2.0.0)",
- org.eclipse.emf.edit.ui;bundle-version="[2.2.0,3.0.0)",
- org.eclipse.wst.xml.core;bundle-version="[1.1.0,1.2.0)",
- org.eclipse.wst.common.uriresolver;bundle-version="[1.1.0,1.2.0)",
- org.eclipse.wst.sse.core;bundle-version="[1.1.0,1.2.0)",
- org.eclipse.wst.common.emfworkbench.integration;bundle-version="[1.1.0,2.0.0)",
- org.eclipse.jst.common.frameworks;bundle-version="[1.1.0,2.0.0)"
-Bundle-ActivationPolicy: lazy
-Export-Package: org.eclipse.jst.jsf.facesconfig,
- org.eclipse.jst.jsf.facesconfig.edit.provider,
- org.eclipse.jst.jsf.facesconfig.emf,
- org.eclipse.jst.jsf.facesconfig.emf.impl,
- org.eclipse.jst.jsf.facesconfig.emf.util,
- org.eclipse.jst.jsf.facesconfig.internal;x-internal:=true,
- org.eclipse.jst.jsf.facesconfig.internal.nls;x-internal:=true,
- org.eclipse.jst.jsf.facesconfig.internal.translator;x-internal:=true,
- org.eclipse.jst.jsf.facesconfig.util
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/about.html b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/about.html
deleted file mode 100644
index 8e56059..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/about.html
+++ /dev/null
@@ -1,22 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<head>
-<title>About</title>
-<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>June, 2008</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise indicated below, the Content is provided to you under the terms and conditions of the
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content.</p>
-
-</body>
-</html>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/build.properties b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/build.properties
deleted file mode 100644
index a8eeb89..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/build.properties
+++ /dev/null
@@ -1,24 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-
-
-bin.includes = .,\
-               model/,\
-               META-INF/,\
-               plugin.xml,\
-               plugin.properties,\
-               about.html,\
-               icons/
-jars.compile.order = .
-source.. = facesconfig/
-output.. = bin/
-javacSource=1.5
-javacTarget=1.5
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/FacesConfigPlugin.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/FacesConfigPlugin.java
deleted file mode 100644
index a13bdb0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/FacesConfigPlugin.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig;
-
-import org.eclipse.emf.common.EMFPlugin;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl;
-import org.eclipse.jst.jsf.facesconfig.util.FacesConfigResourceFactory;
-import org.osgi.framework.BundleContext;
-
-
-/**
- * This class should not be extended by clients.
- * 
- * The main plugin class to be used in the desktop.
- */
-public final class FacesConfigPlugin extends EMFPlugin {
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * Editor id string.  TODO: broken?
-	 */
-	public static final String FACES_CONFIG_EDITOR_ID = "org.eclipse.jst.jsf.facesconfig.internal.presentation.FacesConfigEditor"; //$NON-NLS-1$
-
-	/**
-	 * The plugin instance
-	 */
-	public static final FacesConfigPlugin INSTANCE = new FacesConfigPlugin();
-	private static Implementation plugin;
-
-    private FacesConfigPlugin() {
-	    super(new ResourceLocator[] {});
-    }
-
-    public ResourceLocator getPluginResourceLocator() {
-      return plugin;
-    }
-
-    /**
-     * Returns the singleton instance of the Eclipse plugin.
-     * @return the singleton instance.
-     */
-    public static Implementation getPlugin() {
-      return plugin;
-    }
-
-    /**
-     * Returns the singleton instance of the Eclipse plugin.
-     * @param exception 
-     */
-    public static void write(Exception exception)
-    {
-      INSTANCE.log(exception);
-    }
-
-	/**
-	 * The actual implementation of the Eclipse <b>Plugin</b>.
-	 */
-	public final static class Implementation extends EMFPlugin.EclipsePlugin {
-		/**
-		 * Internal constructor
-		 */
-		public Implementation() {
-			super();
-			// Remember the static instance.
-			plugin = this;
-		}
-		public void start(BundleContext context) throws Exception {
-			super.start(context);
-			// Init Faces Config Package
-			FacesConfigPackageImpl.init();
-
-			getFacesconfigPackage();
-			
-			// TODO: XN: no sure whether this line is needed
-			FacesConfigResourceFactory.registerDtds();
-			
-			FacesConfigResourceFactory.register();
-		}
-
-		/**
-		 * @return The faces config package instance
-		 * TODO: used?
-		 */
-		public FacesConfigPackage getFacesconfigPackage() {
-			return FacesConfigPackage.eINSTANCE;
-		}
-		
-		/**
-		 * @return the faces config factory instance.
-		 * TODO: used?
-		 */
-		public FacesConfigFactory getFacesconfigFactory() {
-			return (FacesConfigFactory) getFacesconfigPackage().getEFactoryInstance();
-		}
-
-	}
-}
-
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/AbsoluteOrderingTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/AbsoluteOrderingTypeItemProvider.java
deleted file mode 100644
index 40c500f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/AbsoluteOrderingTypeItemProvider.java
+++ /dev/null
@@ -1,179 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.AbsoluteOrderingType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.AbsoluteOrderingType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class AbsoluteOrderingTypeItemProvider
-	extends ItemProviderAdapter
-	implements
-		IEditingDomainItemProvider,
-		IStructuredItemContentProvider,
-		ITreeItemContentProvider,
-		IItemLabelProvider,
-		IItemPropertySource {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param adapterFactory 
-	 * @generated NOT
-	 */
-	public AbsoluteOrderingTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures.add(FacesConfigPackage.Literals.ABSOLUTE_ORDERING_TYPE__NAME);
-			childrenFeatures.add(FacesConfigPackage.Literals.ABSOLUTE_ORDERING_TYPE__OTHERS);
-		}
-		return childrenFeatures;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-		// Check the type of the specified child object and return the proper feature to use for
-		// adding (see {@link AddCommand}) it as a child.
-
-		return super.getChildFeature(object, child);
-	}
-
-	/**
-	 * This returns AbsoluteOrderingType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/AbsoluteOrderingType")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String getText(Object object) {
-		return getString("_UI_AbsoluteOrderingType_type"); //$NON-NLS-1$
-	}
-
-	/**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(AbsoluteOrderingType.class)) {
-			case FacesConfigPackage.ABSOLUTE_ORDERING_TYPE__NAME:
-			case FacesConfigPackage.ABSOLUTE_ORDERING_TYPE__OTHERS:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-	/**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.ABSOLUTE_ORDERING_TYPE__NAME,
-				 FacesConfigFactory.eINSTANCE.createNameType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.ABSOLUTE_ORDERING_TYPE__OTHERS,
-				 FacesConfigFactory.eINSTANCE.createOrderingOthersType()));
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ActionListenerTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ActionListenerTypeItemProvider.java
deleted file mode 100644
index f27e6fd..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ActionListenerTypeItemProvider.java
+++ /dev/null
@@ -1,211 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITableItemLabelProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.ActionListenerType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * This is the item provider adapter for a
- * {@link org.eclipse.jst.jsf.facesconfig.emf.ActionListenerType} object. <!--
- * begin-user-doc --> 
- * @extends ITableItemLabelProvider
- * <!-- end-user-doc -->
- * 
- * @generated
- */
-@SuppressWarnings("nls")
-public class ActionListenerTypeItemProvider extends ItemProviderAdapter
-		implements IEditingDomainItemProvider, IStructuredItemContentProvider, ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource, ITableItemLabelProvider {
-    /**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!--begin-user-doc --> 
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ActionListenerTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc --> 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Text Content feature. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * @param object 
-	 * 
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ActionListenerType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ActionListenerType_textContent_feature", "_UI_ActionListenerType_type"),
-				 FacesConfigPackage.Literals.ACTION_LISTENER_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc>
-     * @param object
-	 * <!-- end-user-doc --> 
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ActionListenerType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ActionListenerType_id_feature", "_UI_ActionListenerType_type"),
-				 FacesConfigPackage.Literals.ACTION_LISTENER_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns ActionListenerType.gif.
-	 * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/ActionListenerType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String getText(Object object) {
-		String label = ((ActionListenerType) object).getTextContent();
-		return label == null || label.length() == 0 ? getString("_UI_ActionListenerType_type")
-				: label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(ActionListenerType.class)) {
-			case FacesConfigPackage.ACTION_LISTENER_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.ACTION_LISTENER_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnImage(java.lang.Object, int)
-	 */
-	public Object getColumnImage(Object object, int columnIndex) {
-		if(columnIndex ==0)
-			return getImage(object);
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnText(java.lang.Object, int)
-	 */
-	public String getColumnText(Object object, int columnIndex) {
-
-		switch (columnIndex) {
-
-		case 0:
-			return getText(object);
-		case 1:
-			return getString("_UI_ActionListenerType_type"); //$NON-NLS-1$
-		}
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ApplicationExtensionTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ApplicationExtensionTypeItemProvider.java
deleted file mode 100644
index 59ddbc8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ApplicationExtensionTypeItemProvider.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.jst.jsf.facesconfig.emf.ApplicationExtensionType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationExtensionType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class ApplicationExtensionTypeItemProvider
-    extends ExtensionTypeItemProvider
-    implements	
-        IEditingDomainItemProvider,	
-        IStructuredItemContentProvider,	
-        ITreeItemContentProvider,	
-        IItemLabelProvider,	
-        IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    @SuppressWarnings("hiding")
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public ApplicationExtensionTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This returns ApplicationExtensionType.gif.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-    public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/ApplicationExtensionType")); //$NON-NLS-1$
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-    public String getText(Object object) {
-		String label = ((ApplicationExtensionType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_ApplicationExtensionType_type") : //$NON-NLS-1$
-			getString("_UI_ApplicationExtensionType_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ApplicationFactoryTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ApplicationFactoryTypeItemProvider.java
deleted file mode 100644
index f2da630..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ApplicationFactoryTypeItemProvider.java
+++ /dev/null
@@ -1,214 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITableItemLabelProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.ApplicationFactoryType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationFactoryType} object.
- * <!-- begin-user-doc --> 
- * @extends {@link ITableItemLabelProvider}
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class ApplicationFactoryTypeItemProvider
-extends ItemProviderAdapter
-implements
-	IEditingDomainItemProvider, IStructuredItemContentProvider, ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource, ITableItemLabelProvider {
-    /**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc --> 
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ApplicationFactoryTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!--begin-user-doc --> 
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ApplicationFactoryType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ApplicationFactoryType_textContent_feature", "_UI_ApplicationFactoryType_type"),
-				 FacesConfigPackage.Literals.APPLICATION_FACTORY_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc --> 
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ApplicationFactoryType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ApplicationFactoryType_id_feature", "_UI_ApplicationFactoryType_type"),
-				 FacesConfigPackage.Literals.APPLICATION_FACTORY_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns ApplicationFactoryType.gif.
-	 * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/ApplicationFactoryType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String getText(Object object) {
-		String label = ((ApplicationFactoryType) object).getTextContent();
-		return label == null || label.length() == 0 ? getString("_UI_ApplicationFactoryType_type")
-				: label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(ApplicationFactoryType.class)) {
-			case FacesConfigPackage.APPLICATION_FACTORY_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.APPLICATION_FACTORY_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-
-	/**
-	 * @param object
-	 * @param columnIndex
-	 * @return the column image
-	 */
-	public Object getColumnImage(Object object, int columnIndex) {
-		if(columnIndex ==0)
-			return getImage(object);
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnText(java.lang.Object, int)
-	 */
-	public String getColumnText(Object object, int columnIndex) {
-		switch (columnIndex) {
-
-		case 0:
-			return getText(object);
-		case 1:
-			return getString("_UI_ApplicationFactoryType_type"); //$NON-NLS-1$
-		}
-
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ApplicationTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ApplicationTypeItemProvider.java
deleted file mode 100644
index 85d5c1f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ApplicationTypeItemProvider.java
+++ /dev/null
@@ -1,388 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.ApplicationType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class ApplicationTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ApplicationTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addELResolverPropertyDescriptor(object);
-			addSystemEventListenerPropertyDescriptor(object);
-			addResourceBundlePropertyDescriptor(object);
-			addApplicationExtensionPropertyDescriptor(object);
-			addDefaultValidatorsPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ApplicationType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ApplicationType_id_feature", "_UI_ApplicationType_type"),
-				 FacesConfigPackage.Literals.APPLICATION_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the EL Resolver feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void addELResolverPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ApplicationType_eLResolver_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ApplicationType_eLResolver_feature", "_UI_ApplicationType_type"),
-				 FacesConfigPackage.Literals.APPLICATION_TYPE__EL_RESOLVER,
-				 true,
-				 false,
-				 true,
-				 null,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the System Event Listener feature.
-	 * <!-- begin-user-doc -->
-	 * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addSystemEventListenerPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ApplicationType_systemEventListener_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ApplicationType_systemEventListener_feature", "_UI_ApplicationType_type"),
-				 FacesConfigPackage.Literals.APPLICATION_TYPE__SYSTEM_EVENT_LISTENER,
-				 true,
-				 false,
-				 true,
-				 null,
-				 null,
-				 null));
-	}
-
-				/**
-	 * This adds a property descriptor for the Resource Bundle feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void addResourceBundlePropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ApplicationType_resourceBundle_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ApplicationType_resourceBundle_feature", "_UI_ApplicationType_type"),
-				 FacesConfigPackage.Literals.APPLICATION_TYPE__RESOURCE_BUNDLE,
-				 true,
-				 false,
-				 true,
-				 null,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Application Extension feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void addApplicationExtensionPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ApplicationType_applicationExtension_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ApplicationType_applicationExtension_feature", "_UI_ApplicationType_type"),
-				 FacesConfigPackage.Literals.APPLICATION_TYPE__APPLICATION_EXTENSION,
-				 true,
-				 false,
-				 true,
-				 null,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Default Validators feature.
-	 * <!-- begin-user-doc -->
-	 * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addDefaultValidatorsPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ApplicationType_defaultValidators_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ApplicationType_defaultValidators_feature", "_UI_ApplicationType_type"),
-				 FacesConfigPackage.Literals.APPLICATION_TYPE__DEFAULT_VALIDATORS,
-				 true,
-				 false,
-				 true,
-				 null,
-				 null,
-				 null));
-	}
-
-				/**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures.add(FacesConfigPackage.Literals.APPLICATION_TYPE__ACTION_LISTENER);
-			childrenFeatures.add(FacesConfigPackage.Literals.APPLICATION_TYPE__DEFAULT_RENDER_KIT_ID);
-			childrenFeatures.add(FacesConfigPackage.Literals.APPLICATION_TYPE__MESSAGE_BUNDLE);
-			childrenFeatures.add(FacesConfigPackage.Literals.APPLICATION_TYPE__NAVIGATION_HANDLER);
-			childrenFeatures.add(FacesConfigPackage.Literals.APPLICATION_TYPE__VIEW_HANDLER);
-			childrenFeatures.add(FacesConfigPackage.Literals.APPLICATION_TYPE__STATE_MANAGER);
-			childrenFeatures.add(FacesConfigPackage.Literals.APPLICATION_TYPE__PROPERTY_RESOLVER);
-			childrenFeatures.add(FacesConfigPackage.Literals.APPLICATION_TYPE__VARIABLE_RESOLVER);
-			childrenFeatures.add(FacesConfigPackage.Literals.APPLICATION_TYPE__RESOURCE_HANDLER);
-			childrenFeatures.add(FacesConfigPackage.Literals.APPLICATION_TYPE__LOCALE_CONFIG);
-		}
-		return childrenFeatures;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-		// Check the type of the specified child object and return the proper feature to use for
-		// adding (see {@link AddCommand}) it as a child.
-
-		return super.getChildFeature(object, child);
-	}
-
-    /**
-	 * This returns ApplicationType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/ApplicationType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((ApplicationType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_ApplicationType_type") :
-			getString("_UI_ApplicationType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(ApplicationType.class)) {
-			case FacesConfigPackage.APPLICATION_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-			case FacesConfigPackage.APPLICATION_TYPE__ACTION_LISTENER:
-			case FacesConfigPackage.APPLICATION_TYPE__DEFAULT_RENDER_KIT_ID:
-			case FacesConfigPackage.APPLICATION_TYPE__MESSAGE_BUNDLE:
-			case FacesConfigPackage.APPLICATION_TYPE__NAVIGATION_HANDLER:
-			case FacesConfigPackage.APPLICATION_TYPE__VIEW_HANDLER:
-			case FacesConfigPackage.APPLICATION_TYPE__STATE_MANAGER:
-			case FacesConfigPackage.APPLICATION_TYPE__PROPERTY_RESOLVER:
-			case FacesConfigPackage.APPLICATION_TYPE__VARIABLE_RESOLVER:
-			case FacesConfigPackage.APPLICATION_TYPE__RESOURCE_HANDLER:
-			case FacesConfigPackage.APPLICATION_TYPE__LOCALE_CONFIG:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.APPLICATION_TYPE__ACTION_LISTENER,
-				 FacesConfigFactory.eINSTANCE.createActionListenerType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.APPLICATION_TYPE__DEFAULT_RENDER_KIT_ID,
-				 FacesConfigFactory.eINSTANCE.createDefaultRenderKitIdType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.APPLICATION_TYPE__MESSAGE_BUNDLE,
-				 FacesConfigFactory.eINSTANCE.createMessageBundleType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.APPLICATION_TYPE__NAVIGATION_HANDLER,
-				 FacesConfigFactory.eINSTANCE.createNavigationHandlerType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.APPLICATION_TYPE__VIEW_HANDLER,
-				 FacesConfigFactory.eINSTANCE.createViewHandlerType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.APPLICATION_TYPE__STATE_MANAGER,
-				 FacesConfigFactory.eINSTANCE.createStateManagerType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.APPLICATION_TYPE__PROPERTY_RESOLVER,
-				 FacesConfigFactory.eINSTANCE.createPropertyResolverType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.APPLICATION_TYPE__VARIABLE_RESOLVER,
-				 FacesConfigFactory.eINSTANCE.createVariableResolverType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.APPLICATION_TYPE__RESOURCE_HANDLER,
-				 FacesConfigFactory.eINSTANCE.createResourceHandlerType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.APPLICATION_TYPE__LOCALE_CONFIG,
-				 FacesConfigFactory.eINSTANCE.createLocaleConfigType()));
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/AttributeClassTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/AttributeClassTypeItemProvider.java
deleted file mode 100644
index a920fda..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/AttributeClassTypeItemProvider.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.AttributeClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.AttributeClassType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class AttributeClassTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public AttributeClassTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_AttributeClassType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_AttributeClassType_textContent_feature", "_UI_AttributeClassType_type"),
-				 FacesConfigPackage.Literals.ATTRIBUTE_CLASS_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_AttributeClassType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_AttributeClassType_id_feature", "_UI_AttributeClassType_type"),
-				 FacesConfigPackage.Literals.ATTRIBUTE_CLASS_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns AttributeClassType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/AttributeClassType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((AttributeClassType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_AttributeClassType_type") :
-			getString("_UI_AttributeClassType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(AttributeClassType.class)) {
-			case FacesConfigPackage.ATTRIBUTE_CLASS_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.ATTRIBUTE_CLASS_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/AttributeExtensionTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/AttributeExtensionTypeItemProvider.java
deleted file mode 100644
index 3c77533..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/AttributeExtensionTypeItemProvider.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.jst.jsf.facesconfig.emf.AttributeExtensionType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.AttributeExtensionType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class AttributeExtensionTypeItemProvider
-	extends ExtensionTypeItemProvider
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@SuppressWarnings("hiding")
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public AttributeExtensionTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This returns AttributeExtensionType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/AttributeExtensionType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((AttributeExtensionType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_AttributeExtensionType_type") :
-			getString("_UI_AttributeExtensionType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/AttributeNameTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/AttributeNameTypeItemProvider.java
deleted file mode 100644
index 0cbbe4a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/AttributeNameTypeItemProvider.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.AttributeNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.AttributeNameType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class AttributeNameTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public AttributeNameTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_AttributeNameType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_AttributeNameType_textContent_feature", "_UI_AttributeNameType_type"),
-				 FacesConfigPackage.Literals.ATTRIBUTE_NAME_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_AttributeNameType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_AttributeNameType_id_feature", "_UI_AttributeNameType_type"),
-				 FacesConfigPackage.Literals.ATTRIBUTE_NAME_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns AttributeNameType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/AttributeNameType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((AttributeNameType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_AttributeNameType_type") :
-			getString("_UI_AttributeNameType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(AttributeNameType.class)) {
-			case FacesConfigPackage.ATTRIBUTE_NAME_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.ATTRIBUTE_NAME_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/AttributeTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/AttributeTypeItemProvider.java
deleted file mode 100644
index 8b3edb3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/AttributeTypeItemProvider.java
+++ /dev/null
@@ -1,281 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITableItemLabelProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.AttributeType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.AttributeType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * 
- */
-@SuppressWarnings("nls")
-public class AttributeTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource,
-		ITableItemLabelProvider{
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public AttributeTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_AttributeType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_AttributeType_id_feature", "_UI_AttributeType_type"),
-				 FacesConfigPackage.Literals.ATTRIBUTE_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures.add(FacesConfigPackage.Literals.ATTRIBUTE_TYPE__DESCRIPTION);
-			childrenFeatures.add(FacesConfigPackage.Literals.ATTRIBUTE_TYPE__DISPLAY_NAME);
-			childrenFeatures.add(FacesConfigPackage.Literals.ATTRIBUTE_TYPE__ICON);
-			childrenFeatures.add(FacesConfigPackage.Literals.ATTRIBUTE_TYPE__ATTRIBUTE_NAME);
-			childrenFeatures.add(FacesConfigPackage.Literals.ATTRIBUTE_TYPE__ATTRIBUTE_CLASS);
-			childrenFeatures.add(FacesConfigPackage.Literals.ATTRIBUTE_TYPE__DEFAULT_VALUE);
-			childrenFeatures.add(FacesConfigPackage.Literals.ATTRIBUTE_TYPE__SUGGESTED_VALUE);
-			childrenFeatures.add(FacesConfigPackage.Literals.ATTRIBUTE_TYPE__ATTRIBUTE_EXTENSION);
-		}
-		return childrenFeatures;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-		// Check the type of the specified child object and return the proper feature to use for
-		// adding (see {@link AddCommand}) it as a child.
-
-		return super.getChildFeature(object, child);
-	}
-
-    /**
-	 * This returns AttributeType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/AttributeType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((AttributeType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_AttributeType_type") :
-			getString("_UI_AttributeType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(AttributeType.class)) {
-			case FacesConfigPackage.ATTRIBUTE_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-			case FacesConfigPackage.ATTRIBUTE_TYPE__DESCRIPTION:
-			case FacesConfigPackage.ATTRIBUTE_TYPE__DISPLAY_NAME:
-			case FacesConfigPackage.ATTRIBUTE_TYPE__ICON:
-			case FacesConfigPackage.ATTRIBUTE_TYPE__ATTRIBUTE_NAME:
-			case FacesConfigPackage.ATTRIBUTE_TYPE__ATTRIBUTE_CLASS:
-			case FacesConfigPackage.ATTRIBUTE_TYPE__DEFAULT_VALUE:
-			case FacesConfigPackage.ATTRIBUTE_TYPE__SUGGESTED_VALUE:
-			case FacesConfigPackage.ATTRIBUTE_TYPE__ATTRIBUTE_EXTENSION:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.ATTRIBUTE_TYPE__DESCRIPTION,
-				 FacesConfigFactory.eINSTANCE.createDescriptionType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.ATTRIBUTE_TYPE__DISPLAY_NAME,
-				 FacesConfigFactory.eINSTANCE.createDisplayNameType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.ATTRIBUTE_TYPE__ICON,
-				 FacesConfigFactory.eINSTANCE.createIconType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.ATTRIBUTE_TYPE__ATTRIBUTE_NAME,
-				 FacesConfigFactory.eINSTANCE.createAttributeNameType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.ATTRIBUTE_TYPE__ATTRIBUTE_CLASS,
-				 FacesConfigFactory.eINSTANCE.createAttributeClassType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.ATTRIBUTE_TYPE__DEFAULT_VALUE,
-				 FacesConfigFactory.eINSTANCE.createDefaultValueType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.ATTRIBUTE_TYPE__SUGGESTED_VALUE,
-				 FacesConfigFactory.eINSTANCE.createSuggestedValueType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.ATTRIBUTE_TYPE__ATTRIBUTE_EXTENSION,
-				 FacesConfigFactory.eINSTANCE.createAttributeExtensionType()));
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-	public String getColumnText(Object object, int columnIndex) {
-		AttributeType attribute = (AttributeType) object;
-		switch (columnIndex) {
-
-		case 0:
-			return attribute.getAttributeName() == null ? "" : attribute //$NON-NLS-1$
-					.getAttributeName().getTextContent();
-		case 1:
-			return attribute.getAttributeClass() == null ? "" : attribute //$NON-NLS-1$
-					.getAttributeClass().getTextContent();
-		case 2:
-			return attribute.getDefaultValue() == null ? "" : attribute //$NON-NLS-1$
-					.getDefaultValue().getTextContent();
-		case 3:
-			return attribute.getSuggestedValue() == null ? "" : attribute //$NON-NLS-1$
-					.getSuggestedValue().getTextContent();
-		}
-		return null;
-	}
-
-	public Object getColumnImage(Object object, int columnIndex) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/BaseNameTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/BaseNameTypeItemProvider.java
deleted file mode 100644
index 5fbe1f2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/BaseNameTypeItemProvider.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.BaseNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.BaseNameType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class BaseNameTypeItemProvider
-    extends ItemProviderAdapter
-    implements	
-        IEditingDomainItemProvider,	
-        IStructuredItemContentProvider,	
-        ITreeItemContentProvider,	
-        IItemLabelProvider,	
-        IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public BaseNameTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_BaseNameType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_BaseNameType_textContent_feature", "_UI_BaseNameType_type"),
-				 FacesConfigPackage.Literals.BASE_NAME_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_BaseNameType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_BaseNameType_id_feature", "_UI_BaseNameType_type"),
-				 FacesConfigPackage.Literals.BASE_NAME_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns BaseNameType.gif.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/BaseNameType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public String getText(Object object) {
-		String label = ((BaseNameType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_BaseNameType_type") :
-			getString("_UI_BaseNameType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(BaseNameType.class)) {
-			case FacesConfigPackage.BASE_NAME_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.BASE_NAME_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/BehaviorClassTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/BehaviorClassTypeItemProvider.java
deleted file mode 100644
index 12a7b9c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/BehaviorClassTypeItemProvider.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.BehaviorClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.BehaviorClassType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class BehaviorClassTypeItemProvider
-	extends ItemProviderAdapter
-	implements
-		IEditingDomainItemProvider,
-		IStructuredItemContentProvider,
-		ITreeItemContentProvider,
-		IItemLabelProvider,
-		IItemPropertySource {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * 	 * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BehaviorClassTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-	 * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_BehaviorClassType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_BehaviorClassType_textContent_feature", "_UI_BehaviorClassType_type"),
-				 FacesConfigPackage.Literals.BEHAVIOR_CLASS_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-	 * @param object  
-	 * <!-- end-user-doc --> 
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_BehaviorClassType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_BehaviorClassType_id_feature", "_UI_BehaviorClassType_type"),
-				 FacesConfigPackage.Literals.BEHAVIOR_CLASS_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This returns BehaviorClassType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/BehaviorClassType"));
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((BehaviorClassType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_BehaviorClassType_type") :
-			getString("_UI_BehaviorClassType_type") + " " + label;
-	}
-
-	/**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(BehaviorClassType.class)) {
-			case FacesConfigPackage.BEHAVIOR_CLASS_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.BEHAVIOR_CLASS_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-	/**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/BehaviorExtensionTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/BehaviorExtensionTypeItemProvider.java
deleted file mode 100644
index 0e7a513..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/BehaviorExtensionTypeItemProvider.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.jst.jsf.facesconfig.emf.BehaviorExtensionType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.BehaviorExtensionType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class BehaviorExtensionTypeItemProvider
-	extends ExtensionTypeItemProvider
-	implements
-		IEditingDomainItemProvider,
-		IStructuredItemContentProvider,
-		ITreeItemContentProvider,
-		IItemLabelProvider,
-		IItemPropertySource {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@SuppressWarnings("hiding")
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BehaviorExtensionTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This returns BehaviorExtensionType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/BehaviorExtensionType")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String getText(Object object) {
-		String label = ((BehaviorExtensionType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_BehaviorExtensionType_type") : //$NON-NLS-1$
-			getString("_UI_BehaviorExtensionType_type") + " " + label;  //$NON-NLS-1$//$NON-NLS-2$
-	}
-
-	/**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-		super.notifyChanged(notification);
-	}
-
-	/**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/BehaviorIdTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/BehaviorIdTypeItemProvider.java
deleted file mode 100644
index b6fe2d1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/BehaviorIdTypeItemProvider.java
+++ /dev/null
@@ -1,193 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.BehaviorIdType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.BehaviorIdType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class BehaviorIdTypeItemProvider
-	extends ItemProviderAdapter
-	implements
-		IEditingDomainItemProvider,
-		IStructuredItemContentProvider,
-		ITreeItemContentProvider,
-		IItemLabelProvider,
-		IItemPropertySource {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * @param adapterFactory 
-	 * <!-- end-user-doc -->
-
-	 * @generated
-	 */
-	public BehaviorIdTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-	 * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_BehaviorIdType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_BehaviorIdType_textContent_feature", "_UI_BehaviorIdType_type"),
-				 FacesConfigPackage.Literals.BEHAVIOR_ID_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-	 * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_BehaviorIdType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_BehaviorIdType_id_feature", "_UI_BehaviorIdType_type"),
-				 FacesConfigPackage.Literals.BEHAVIOR_ID_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This returns BehaviorIdType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/BehaviorIdType")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String getText(Object object) {
-		String label = ((BehaviorIdType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_BehaviorIdType_type") : //$NON-NLS-1$
-			getString("_UI_BehaviorIdType_type") + " " + label;  //$NON-NLS-1$//$NON-NLS-2$
-	}
-
-	/**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(BehaviorIdType.class)) {
-			case FacesConfigPackage.BEHAVIOR_ID_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.BEHAVIOR_ID_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-	/**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/BehaviorTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/BehaviorTypeItemProvider.java
deleted file mode 100644
index 1deaa16..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/BehaviorTypeItemProvider.java
+++ /dev/null
@@ -1,221 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.BehaviorType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.BehaviorType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class BehaviorTypeItemProvider
-	extends ItemProviderAdapter
-	implements
-		IEditingDomainItemProvider,
-		IStructuredItemContentProvider,
-		ITreeItemContentProvider,
-		IItemLabelProvider,
-		IItemPropertySource {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BehaviorTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures.add(FacesConfigPackage.Literals.BEHAVIOR_TYPE__DESCRIPTION);
-			childrenFeatures.add(FacesConfigPackage.Literals.BEHAVIOR_TYPE__DISPLAY_NAME);
-			childrenFeatures.add(FacesConfigPackage.Literals.BEHAVIOR_TYPE__ICON);
-			childrenFeatures.add(FacesConfigPackage.Literals.BEHAVIOR_TYPE__BEHAVIOR_ID);
-			childrenFeatures.add(FacesConfigPackage.Literals.BEHAVIOR_TYPE__BEHAVIOR_CLASS);
-			childrenFeatures.add(FacesConfigPackage.Literals.BEHAVIOR_TYPE__ATTRIBUTE);
-			childrenFeatures.add(FacesConfigPackage.Literals.BEHAVIOR_TYPE__PROPERTY);
-			childrenFeatures.add(FacesConfigPackage.Literals.BEHAVIOR_TYPE__BEHAVIOR_EXTENSION);
-		}
-		return childrenFeatures;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-		// Check the type of the specified child object and return the proper feature to use for
-		// adding (see {@link AddCommand}) it as a child.
-
-		return super.getChildFeature(object, child);
-	}
-
-	/**
-	 * This returns BehaviorType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/BehaviorType")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String getText(Object object) {
-		return getString("_UI_BehaviorType_type"); //$NON-NLS-1$
-	}
-
-	/**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(BehaviorType.class)) {
-			case FacesConfigPackage.BEHAVIOR_TYPE__DESCRIPTION:
-			case FacesConfigPackage.BEHAVIOR_TYPE__DISPLAY_NAME:
-			case FacesConfigPackage.BEHAVIOR_TYPE__ICON:
-			case FacesConfigPackage.BEHAVIOR_TYPE__BEHAVIOR_ID:
-			case FacesConfigPackage.BEHAVIOR_TYPE__BEHAVIOR_CLASS:
-			case FacesConfigPackage.BEHAVIOR_TYPE__ATTRIBUTE:
-			case FacesConfigPackage.BEHAVIOR_TYPE__PROPERTY:
-			case FacesConfigPackage.BEHAVIOR_TYPE__BEHAVIOR_EXTENSION:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-	/**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.BEHAVIOR_TYPE__DESCRIPTION,
-				 FacesConfigFactory.eINSTANCE.createDescriptionType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.BEHAVIOR_TYPE__DISPLAY_NAME,
-				 FacesConfigFactory.eINSTANCE.createDisplayNameType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.BEHAVIOR_TYPE__ICON,
-				 FacesConfigFactory.eINSTANCE.createIconType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.BEHAVIOR_TYPE__BEHAVIOR_ID,
-				 FacesConfigFactory.eINSTANCE.createBehaviorIdType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.BEHAVIOR_TYPE__BEHAVIOR_CLASS,
-				 FacesConfigFactory.eINSTANCE.createBehaviorClassType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.BEHAVIOR_TYPE__ATTRIBUTE,
-				 FacesConfigFactory.eINSTANCE.createAttributeType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.BEHAVIOR_TYPE__PROPERTY,
-				 FacesConfigFactory.eINSTANCE.createPropertyType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.BEHAVIOR_TYPE__BEHAVIOR_EXTENSION,
-				 FacesConfigFactory.eINSTANCE.createBehaviorExtensionType()));
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ClientBehaviorRendererClassTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ClientBehaviorRendererClassTypeItemProvider.java
deleted file mode 100644
index b553b27..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ClientBehaviorRendererClassTypeItemProvider.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererClassType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class ClientBehaviorRendererClassTypeItemProvider
-	extends ItemProviderAdapter
-	implements
-		IEditingDomainItemProvider,
-		IStructuredItemContentProvider,
-		ITreeItemContentProvider,
-		IItemLabelProvider,
-		IItemPropertySource {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ClientBehaviorRendererClassTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-	 * @param object
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ClientBehaviorRendererClassType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ClientBehaviorRendererClassType_textContent_feature", "_UI_ClientBehaviorRendererClassType_type"),
-				 FacesConfigPackage.Literals.CLIENT_BEHAVIOR_RENDERER_CLASS_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc --> 
-	 * @param object
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ClientBehaviorRendererClassType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ClientBehaviorRendererClassType_id_feature", "_UI_ClientBehaviorRendererClassType_type"),
-				 FacesConfigPackage.Literals.CLIENT_BEHAVIOR_RENDERER_CLASS_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This returns ClientBehaviorRendererClassType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/ClientBehaviorRendererClassType"));
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((ClientBehaviorRendererClassType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_ClientBehaviorRendererClassType_type") :
-			getString("_UI_ClientBehaviorRendererClassType_type") + " " + label;
-	}
-
-	/**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(ClientBehaviorRendererClassType.class)) {
-			case FacesConfigPackage.CLIENT_BEHAVIOR_RENDERER_CLASS_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.CLIENT_BEHAVIOR_RENDERER_CLASS_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-	/**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ClientBehaviorRendererTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ClientBehaviorRendererTypeItemProvider.java
deleted file mode 100644
index 04b041e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ClientBehaviorRendererTypeItemProvider.java
+++ /dev/null
@@ -1,179 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class ClientBehaviorRendererTypeItemProvider
-	extends ItemProviderAdapter
-	implements
-		IEditingDomainItemProvider,
-		IStructuredItemContentProvider,
-		ITreeItemContentProvider,
-		IItemLabelProvider,
-		IItemPropertySource {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ClientBehaviorRendererTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures.add(FacesConfigPackage.Literals.CLIENT_BEHAVIOR_RENDERER_TYPE__CLIENT_BEHAVIOR_RENDERER_TYPE);
-			childrenFeatures.add(FacesConfigPackage.Literals.CLIENT_BEHAVIOR_RENDERER_TYPE__CLIENT_BEHAVIOR_RENDERER_CLASS);
-		}
-		return childrenFeatures;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-		// Check the type of the specified child object and return the proper feature to use for
-		// adding (see {@link AddCommand}) it as a child.
-
-		return super.getChildFeature(object, child);
-	}
-
-	/**
-	 * This returns ClientBehaviorRendererType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/ClientBehaviorRendererType")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String getText(Object object) {
-		return getString("_UI_ClientBehaviorRendererType_type"); //$NON-NLS-1$
-	}
-
-	/**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(ClientBehaviorRendererType.class)) {
-			case FacesConfigPackage.CLIENT_BEHAVIOR_RENDERER_TYPE__CLIENT_BEHAVIOR_RENDERER_TYPE:
-			case FacesConfigPackage.CLIENT_BEHAVIOR_RENDERER_TYPE__CLIENT_BEHAVIOR_RENDERER_CLASS:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-	/**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.CLIENT_BEHAVIOR_RENDERER_TYPE__CLIENT_BEHAVIOR_RENDERER_TYPE,
-				 FacesConfigFactory.eINSTANCE.createClientBehaviorRendererTypeType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.CLIENT_BEHAVIOR_RENDERER_TYPE__CLIENT_BEHAVIOR_RENDERER_CLASS,
-				 FacesConfigFactory.eINSTANCE.createClientBehaviorRendererClassType()));
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ClientBehaviorRendererTypeTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ClientBehaviorRendererTypeTypeItemProvider.java
deleted file mode 100644
index 4133218..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ClientBehaviorRendererTypeTypeItemProvider.java
+++ /dev/null
@@ -1,193 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererTypeType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererTypeType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class ClientBehaviorRendererTypeTypeItemProvider
-	extends ItemProviderAdapter
-	implements
-		IEditingDomainItemProvider,
-		IStructuredItemContentProvider,
-		ITreeItemContentProvider,
-		IItemLabelProvider,
-		IItemPropertySource {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * @param adapterFactory
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ClientBehaviorRendererTypeTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-	 * @param object 
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated NOT
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ClientBehaviorRendererTypeType_textContent_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_ClientBehaviorRendererTypeType_textContent_feature", "_UI_ClientBehaviorRendererTypeType_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 FacesConfigPackage.Literals.CLIENT_BEHAVIOR_RENDERER_TYPE_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-	 * @param object
-	 * <!-- end-user-doc -->
-	 *  
-	 * @generated NOT
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ClientBehaviorRendererTypeType_id_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_ClientBehaviorRendererTypeType_id_feature", "_UI_ClientBehaviorRendererTypeType_type"),  //$NON-NLS-1$ //$NON-NLS-2$//$NON-NLS-3$
-				 FacesConfigPackage.Literals.CLIENT_BEHAVIOR_RENDERER_TYPE_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This returns ClientBehaviorRendererTypeType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/ClientBehaviorRendererTypeType")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String getText(Object object) {
-		String label = ((ClientBehaviorRendererTypeType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_ClientBehaviorRendererTypeType_type") : //$NON-NLS-1$
-			getString("_UI_ClientBehaviorRendererTypeType_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(ClientBehaviorRendererTypeType.class)) {
-			case FacesConfigPackage.CLIENT_BEHAVIOR_RENDERER_TYPE_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.CLIENT_BEHAVIOR_RENDERER_TYPE_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-	/**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ComponentClassTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ComponentClassTypeItemProvider.java
deleted file mode 100644
index f5011bf..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ComponentClassTypeItemProvider.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.ComponentClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ComponentClassType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class ComponentClassTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ComponentClassTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ComponentClassType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ComponentClassType_textContent_feature", "_UI_ComponentClassType_type"),
-				 FacesConfigPackage.Literals.COMPONENT_CLASS_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ComponentClassType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ComponentClassType_id_feature", "_UI_ComponentClassType_type"),
-				 FacesConfigPackage.Literals.COMPONENT_CLASS_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns ComponentClassType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/ComponentClassType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((ComponentClassType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_ComponentClassType_type") :
-			getString("_UI_ComponentClassType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(ComponentClassType.class)) {
-			case FacesConfigPackage.COMPONENT_CLASS_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.COMPONENT_CLASS_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ComponentExtensionTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ComponentExtensionTypeItemProvider.java
deleted file mode 100644
index 90ae0fe..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ComponentExtensionTypeItemProvider.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.jst.jsf.facesconfig.emf.ComponentExtensionType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ComponentExtensionType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class ComponentExtensionTypeItemProvider
-	extends ExtensionTypeItemProvider
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@SuppressWarnings("hiding")
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ComponentExtensionTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This returns ComponentExtensionType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/ComponentExtensionType")); //$NON-NLS-1$
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String getText(Object object) {
-		String label = ((ComponentExtensionType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_ComponentExtensionType_type") : //$NON-NLS-1$
-			getString("_UI_ComponentExtensionType_type") + " " + label;  //$NON-NLS-1$//$NON-NLS-2$
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ComponentFamilyTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ComponentFamilyTypeItemProvider.java
deleted file mode 100644
index 2865fff..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ComponentFamilyTypeItemProvider.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.ComponentFamilyType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ComponentFamilyType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class ComponentFamilyTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ComponentFamilyTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ComponentFamilyType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ComponentFamilyType_textContent_feature", "_UI_ComponentFamilyType_type"),
-				 FacesConfigPackage.Literals.COMPONENT_FAMILY_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ComponentFamilyType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ComponentFamilyType_id_feature", "_UI_ComponentFamilyType_type"),
-				 FacesConfigPackage.Literals.COMPONENT_FAMILY_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns ComponentFamilyType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/ComponentFamilyType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((ComponentFamilyType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_ComponentFamilyType_type") :
-			getString("_UI_ComponentFamilyType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(ComponentFamilyType.class)) {
-			case FacesConfigPackage.COMPONENT_FAMILY_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.COMPONENT_FAMILY_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ComponentTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ComponentTypeItemProvider.java
deleted file mode 100644
index c823f2e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ComponentTypeItemProvider.java
+++ /dev/null
@@ -1,322 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITableItemLabelProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.ComponentType;
-import org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ComponentType} object.
- * <!-- begin-user-doc --> 
- * @extends ITableItemLabelProvider
- * <!-- end-user-doc -->
- * @generated
- */
-public class ComponentTypeItemProvider extends ItemProviderAdapter implements
-		IEditingDomainItemProvider, IStructuredItemContentProvider, ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource, ITableItemLabelProvider {
-    /**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * @param adapterFactory 
-	 * 
-	 * @generated
-	 */
-	public ComponentTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc --> 
-	 * 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * @param object
-	 */
-	protected void addComponentClassPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add(createItemPropertyDescriptor(
-				((ComposeableAdapterFactory) adapterFactory)
-						.getRootAdapterFactory(), getResourceLocator(),
-				getString("_UI_ComponentType_componentClass_feature"), //$NON-NLS-1$
-				getString("_UI_PropertyDescriptor_description", //$NON-NLS-1$
-						"_UI_ComponentType_componentClass_feature", //$NON-NLS-1$
-						"_UI_ComponentType_type"), FacesConfigPackage.eINSTANCE //$NON-NLS-1$
-						.getComponentType_ComponentClass(), true, null, null,
-				null));
-	}
-	
-	/**
-	 * @param object
-	 */
-	protected void addComponentTypePropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add(createItemPropertyDescriptor(
-				((ComposeableAdapterFactory) adapterFactory)
-						.getRootAdapterFactory(), getResourceLocator(),
-				getString("_UI_ComponentType_componentType_feature"), //$NON-NLS-1$
-				getString("_UI_PropertyDescriptor_description", //$NON-NLS-1$
-						"_UI_ComponentType_componentType_feature", //$NON-NLS-1$
-						"_UI_ComponentType_type"), FacesConfigPackage.eINSTANCE //$NON-NLS-1$
-						.getComponentType_ComponentType(), true, null, null,
-				null));
-	}
-	
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc --> 
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ComponentType_id_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_ComponentType_id_feature", "_UI_ComponentType_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 FacesConfigPackage.Literals.COMPONENT_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures.add(FacesConfigPackage.Literals.COMPONENT_TYPE__DESCRIPTION);
-			childrenFeatures.add(FacesConfigPackage.Literals.COMPONENT_TYPE__DISPLAY_NAME);
-			childrenFeatures.add(FacesConfigPackage.Literals.COMPONENT_TYPE__ICON);
-			childrenFeatures.add(FacesConfigPackage.Literals.COMPONENT_TYPE__COMPONENT_TYPE);
-			childrenFeatures.add(FacesConfigPackage.Literals.COMPONENT_TYPE__COMPONENT_CLASS);
-			childrenFeatures.add(FacesConfigPackage.Literals.COMPONENT_TYPE__FACET);
-			childrenFeatures.add(FacesConfigPackage.Literals.COMPONENT_TYPE__ATTRIBUTE);
-			childrenFeatures.add(FacesConfigPackage.Literals.COMPONENT_TYPE__PROPERTY);
-			childrenFeatures.add(FacesConfigPackage.Literals.COMPONENT_TYPE__COMPONENT_EXTENSION);
-		}
-		return childrenFeatures;
-	}
-
-    /**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-		// Check the type of the specified child object and return the proper feature to use for
-		// adding (see {@link AddCommand}) it as a child.
-
-		return super.getChildFeature(object, child);
-	}
-
-	/**
-	 * This returns ComponentType.gif. <!-- begin-user-doc --> <!-- end-user-doc
-	 * -->
-	 * 
-	 * @generated NOT
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/ComponentType")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class. <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-	 * @generated NOT
-	 * 
-	 */
-	public String getText(Object object) {
-		String label = null;
-		if (((ComponentType) object).getDisplayName() != null
-				&& ((ComponentType) object).getDisplayName().size() > 0) {
-			label = ((DisplayNameType) ((ComponentType) object)
-					.getDisplayName().get(0)).getTextContent();
-		}
-
-		if (label == null || label.length() == 0) {
-			if (((ComponentType) object).getComponentClass() != null) {
-				label = ((ComponentType) object).getComponentClass()
-						.getTextContent();
-			}
-		}
-		
-		return label == null || label.length() == 0 ? getString("_UI_ComponentType_type") //$NON-NLS-1$
-				: label;
-//				: getString("_UI_ComponentType_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(ComponentType.class)) {
-			case FacesConfigPackage.COMPONENT_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-			case FacesConfigPackage.COMPONENT_TYPE__DESCRIPTION:
-			case FacesConfigPackage.COMPONENT_TYPE__DISPLAY_NAME:
-			case FacesConfigPackage.COMPONENT_TYPE__ICON:
-			case FacesConfigPackage.COMPONENT_TYPE__COMPONENT_TYPE:
-			case FacesConfigPackage.COMPONENT_TYPE__COMPONENT_CLASS:
-			case FacesConfigPackage.COMPONENT_TYPE__FACET:
-			case FacesConfigPackage.COMPONENT_TYPE__ATTRIBUTE:
-			case FacesConfigPackage.COMPONENT_TYPE__PROPERTY:
-			case FacesConfigPackage.COMPONENT_TYPE__COMPONENT_EXTENSION:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.COMPONENT_TYPE__DESCRIPTION,
-				 FacesConfigFactory.eINSTANCE.createDescriptionType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.COMPONENT_TYPE__DISPLAY_NAME,
-				 FacesConfigFactory.eINSTANCE.createDisplayNameType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.COMPONENT_TYPE__ICON,
-				 FacesConfigFactory.eINSTANCE.createIconType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.COMPONENT_TYPE__COMPONENT_TYPE,
-				 FacesConfigFactory.eINSTANCE.createComponentTypeType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.COMPONENT_TYPE__COMPONENT_CLASS,
-				 FacesConfigFactory.eINSTANCE.createComponentClassType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.COMPONENT_TYPE__FACET,
-				 FacesConfigFactory.eINSTANCE.createFacetType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.COMPONENT_TYPE__ATTRIBUTE,
-				 FacesConfigFactory.eINSTANCE.createAttributeType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.COMPONENT_TYPE__PROPERTY,
-				 FacesConfigFactory.eINSTANCE.createPropertyType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.COMPONENT_TYPE__COMPONENT_EXTENSION,
-				 FacesConfigFactory.eINSTANCE.createComponentExtensionType()));
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnImage(java.lang.Object, int)
-	 */
-	public Object getColumnImage(Object object, int columnIndex) {
-		// TODO Auto-generated method stub
-		if(columnIndex ==0)
-			return getImage(object);
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnText(java.lang.Object, int)
-	 */
-	public String getColumnText(Object object, int columnIndex) {
-		switch (columnIndex) {
-
-		case 0:
-			return getText(object);
-		case 1:
-			return getString("_UI_ComponentType_type"); //$NON-NLS-1$
-		}
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ComponentTypeTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ComponentTypeTypeItemProvider.java
deleted file mode 100644
index 20927a9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ComponentTypeTypeItemProvider.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.ComponentTypeType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ComponentTypeType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class ComponentTypeTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ComponentTypeTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ComponentTypeType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ComponentTypeType_textContent_feature", "_UI_ComponentTypeType_type"),
-				 FacesConfigPackage.Literals.COMPONENT_TYPE_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ComponentTypeType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ComponentTypeType_id_feature", "_UI_ComponentTypeType_type"),
-				 FacesConfigPackage.Literals.COMPONENT_TYPE_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns ComponentTypeType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/ComponentTypeType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((ComponentTypeType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_ComponentTypeType_type") :
-			getString("_UI_ComponentTypeType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(ComponentTypeType.class)) {
-			case FacesConfigPackage.COMPONENT_TYPE_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.COMPONENT_TYPE_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ConverterClassTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ConverterClassTypeItemProvider.java
deleted file mode 100644
index a9f940e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ConverterClassTypeItemProvider.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.ConverterClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ConverterClassType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class ConverterClassTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ConverterClassTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ConverterClassType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ConverterClassType_textContent_feature", "_UI_ConverterClassType_type"),
-				 FacesConfigPackage.Literals.CONVERTER_CLASS_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ConverterClassType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ConverterClassType_id_feature", "_UI_ConverterClassType_type"),
-				 FacesConfigPackage.Literals.CONVERTER_CLASS_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns ConverterClassType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/ConverterClassType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((ConverterClassType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_ConverterClassType_type") :
-			getString("_UI_ConverterClassType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(ConverterClassType.class)) {
-			case FacesConfigPackage.CONVERTER_CLASS_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.CONVERTER_CLASS_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ConverterExtensionTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ConverterExtensionTypeItemProvider.java
deleted file mode 100644
index f0f5080..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ConverterExtensionTypeItemProvider.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.jst.jsf.facesconfig.emf.ConverterExtensionType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ConverterExtensionType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class ConverterExtensionTypeItemProvider
-    extends ExtensionTypeItemProvider
-    implements	
-        IEditingDomainItemProvider,	
-        IStructuredItemContentProvider,	
-        ITreeItemContentProvider,	
-        IItemLabelProvider,	
-        IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    @SuppressWarnings("hiding")
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public ConverterExtensionTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This returns ConverterExtensionType.gif.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-    public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/ConverterExtensionType")); //$NON-NLS-1$
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-    public String getText(Object object) {
-		String label = ((ConverterExtensionType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_ConverterExtensionType_type") : //$NON-NLS-1$
-			getString("_UI_ConverterExtensionType_type") + " " + label;  //$NON-NLS-1$//$NON-NLS-2$
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ConverterForClassTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ConverterForClassTypeItemProvider.java
deleted file mode 100644
index 7539298..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ConverterForClassTypeItemProvider.java
+++ /dev/null
@@ -1,191 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.ConverterForClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ConverterForClassType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class ConverterForClassTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ConverterForClassTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ConverterForClassType_textContent_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_ConverterForClassType_textContent_feature", "_UI_ConverterForClassType_type"),  //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$
-				 FacesConfigPackage.Literals.CONVERTER_FOR_CLASS_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ConverterForClassType_id_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_ConverterForClassType_id_feature", "_UI_ConverterForClassType_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 FacesConfigPackage.Literals.CONVERTER_FOR_CLASS_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns ConverterForClassType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/ConverterForClassType")); //$NON-NLS-1$
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String getText(Object object) {
-		String label = ((ConverterForClassType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_ConverterForClassType_type") : //$NON-NLS-1$
-			getString("_UI_ConverterForClassType_type") + " " + label;  //$NON-NLS-1$//$NON-NLS-2$
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(ConverterForClassType.class)) {
-			case FacesConfigPackage.CONVERTER_FOR_CLASS_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.CONVERTER_FOR_CLASS_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ConverterIdTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ConverterIdTypeItemProvider.java
deleted file mode 100644
index 7a5edf0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ConverterIdTypeItemProvider.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.ConverterIdType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ConverterIdType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class ConverterIdTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ConverterIdTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ConverterIdType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ConverterIdType_textContent_feature", "_UI_ConverterIdType_type"),
-				 FacesConfigPackage.Literals.CONVERTER_ID_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ConverterIdType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ConverterIdType_id_feature", "_UI_ConverterIdType_type"),
-				 FacesConfigPackage.Literals.CONVERTER_ID_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns ConverterIdType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/ConverterIdType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((ConverterIdType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_ConverterIdType_type") :
-			getString("_UI_ConverterIdType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(ConverterIdType.class)) {
-			case FacesConfigPackage.CONVERTER_ID_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.CONVERTER_ID_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ConverterTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ConverterTypeItemProvider.java
deleted file mode 100644
index 1ad9ab6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ConverterTypeItemProvider.java
+++ /dev/null
@@ -1,297 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITableItemLabelProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.ConverterType;
-import org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ConverterType} object.
- * <!-- begin-user-doc --> 
- * @extends ITableItemLabelProvider
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class ConverterTypeItemProvider extends ItemProviderAdapter implements
-		IEditingDomainItemProvider, IStructuredItemContentProvider, ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource, ITableItemLabelProvider {
-    /**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc --> 
- 	 * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ConverterTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc --> 
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ConverterType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ConverterType_id_feature", "_UI_ConverterType_type"),
-				 FacesConfigPackage.Literals.CONVERTER_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures.add(FacesConfigPackage.Literals.CONVERTER_TYPE__DESCRIPTION);
-			childrenFeatures.add(FacesConfigPackage.Literals.CONVERTER_TYPE__DISPLAY_NAME);
-			childrenFeatures.add(FacesConfigPackage.Literals.CONVERTER_TYPE__ICON);
-			childrenFeatures.add(FacesConfigPackage.Literals.CONVERTER_TYPE__CONVERTER_ID);
-			childrenFeatures.add(FacesConfigPackage.Literals.CONVERTER_TYPE__CONVERTER_FOR_CLASS);
-			childrenFeatures.add(FacesConfigPackage.Literals.CONVERTER_TYPE__CONVERTER_CLASS);
-			childrenFeatures.add(FacesConfigPackage.Literals.CONVERTER_TYPE__ATTRIBUTE);
-			childrenFeatures.add(FacesConfigPackage.Literals.CONVERTER_TYPE__PROPERTY);
-			childrenFeatures.add(FacesConfigPackage.Literals.CONVERTER_TYPE__CONVERTER_EXTENSION);
-		}
-		return childrenFeatures;
-	}
-
-    /**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-		// Check the type of the specified child object and return the proper feature to use for
-		// adding (see {@link AddCommand}) it as a child.
-
-		return super.getChildFeature(object, child);
-	}
-
-	/**
-	 * This returns ConverterType.gif. <!-- begin-user-doc --> <!-- end-user-doc
-	 * -->
-	 * 
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/ConverterType"));
-	}
-
-	/**
-	 * This returns the label text for the adapted class. <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-	 * 
-	 * @generated NOT
-	 */
-	public String getText(Object object) {
-		String label = null;
-		
-		if (((ConverterType) object).getDisplayName() != null
-				&& ((ConverterType) object).getDisplayName().size() > 0) {
-			label = ((DisplayNameType) ((ConverterType) object)
-					.getDisplayName().get(0)).getTextContent();
-		}
-		
-		if (label == null && ((ConverterType) object).getConverterId() != null) {
-			label = ((ConverterType) object).getConverterId().getTextContent();
-		}
-
-		if (label == null || label.length() == 0) {
-			if (((ConverterType) object).getConverterClass() != null)
-				label = ((ConverterType) object).getConverterClass()
-						.getTextContent();
-		}
-		if (label == null || label.length() ==0) {
-			label = ((ConverterType) object).getId();
-		}
-
-		return label == null || label.length() == 0 ? getString("_UI_ConverterType_type") 
-				: label;
-//				: getString("_UI_ConverterType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(ConverterType.class)) {
-			case FacesConfigPackage.CONVERTER_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-			case FacesConfigPackage.CONVERTER_TYPE__DESCRIPTION:
-			case FacesConfigPackage.CONVERTER_TYPE__DISPLAY_NAME:
-			case FacesConfigPackage.CONVERTER_TYPE__ICON:
-			case FacesConfigPackage.CONVERTER_TYPE__CONVERTER_ID:
-			case FacesConfigPackage.CONVERTER_TYPE__CONVERTER_FOR_CLASS:
-			case FacesConfigPackage.CONVERTER_TYPE__CONVERTER_CLASS:
-			case FacesConfigPackage.CONVERTER_TYPE__ATTRIBUTE:
-			case FacesConfigPackage.CONVERTER_TYPE__PROPERTY:
-			case FacesConfigPackage.CONVERTER_TYPE__CONVERTER_EXTENSION:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.CONVERTER_TYPE__DESCRIPTION,
-				 FacesConfigFactory.eINSTANCE.createDescriptionType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.CONVERTER_TYPE__DISPLAY_NAME,
-				 FacesConfigFactory.eINSTANCE.createDisplayNameType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.CONVERTER_TYPE__ICON,
-				 FacesConfigFactory.eINSTANCE.createIconType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.CONVERTER_TYPE__CONVERTER_ID,
-				 FacesConfigFactory.eINSTANCE.createConverterIdType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.CONVERTER_TYPE__CONVERTER_FOR_CLASS,
-				 FacesConfigFactory.eINSTANCE.createConverterForClassType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.CONVERTER_TYPE__CONVERTER_CLASS,
-				 FacesConfigFactory.eINSTANCE.createConverterClassType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.CONVERTER_TYPE__ATTRIBUTE,
-				 FacesConfigFactory.eINSTANCE.createAttributeType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.CONVERTER_TYPE__PROPERTY,
-				 FacesConfigFactory.eINSTANCE.createPropertyType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.CONVERTER_TYPE__CONVERTER_EXTENSION,
-				 FacesConfigFactory.eINSTANCE.createConverterExtensionType()));
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnImage(java.lang.Object, int)
-	 */
-	public Object getColumnImage(Object object, int columnIndex) {
-		if(columnIndex ==0)
-			return getImage(object);
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnText(java.lang.Object, int)
-	 */
-	public String getColumnText(Object object, int columnIndex) {
-		switch (columnIndex) {
-
-		case 0:
-			return getText(object);
-		case 1:
-			return getString("_UI_ConverterType_type"); //$NON-NLS-1$
-		}
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/DefaultLocaleTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/DefaultLocaleTypeItemProvider.java
deleted file mode 100644
index 8777aa4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/DefaultLocaleTypeItemProvider.java
+++ /dev/null
@@ -1,186 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.DefaultLocaleType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * This is the item provider adapter for a
- * {@link org.eclipse.jst.jsf.facesconfig.emf.DefaultLocaleType} object. <!--
- * begin-user-doc --> <!-- end-user-doc -->
- * 
- * @generated
- */
-@SuppressWarnings("nls")
-public class DefaultLocaleTypeItemProvider extends ItemProviderAdapter
-		implements IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc --> 
- 	 * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public DefaultLocaleTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc --> 
- 	 * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_DefaultLocaleType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_DefaultLocaleType_textContent_feature", "_UI_DefaultLocaleType_type"),
-				 FacesConfigPackage.Literals.DEFAULT_LOCALE_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc --> 
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_DefaultLocaleType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_DefaultLocaleType_id_feature", "_UI_DefaultLocaleType_type"),
-				 FacesConfigPackage.Literals.DEFAULT_LOCALE_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns DefaultLocaleType.gif.
-	 * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/DefaultLocaleType"));
-	}
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-     * @generated NOT
-     */
-	public String getText(Object object) {
-        String label = ((DefaultLocaleType)object).getTextContent();
-        return label == null || label.length() == 0 ?
-            getString("_UI_DefaultLocaleType_type") : //$NON-NLS-1$
-            label;
-    }
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(DefaultLocaleType.class)) {
-			case FacesConfigPackage.DEFAULT_LOCALE_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.DEFAULT_LOCALE_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/DefaultRenderKitIdTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/DefaultRenderKitIdTypeItemProvider.java
deleted file mode 100644
index 82efd15..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/DefaultRenderKitIdTypeItemProvider.java
+++ /dev/null
@@ -1,208 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITableItemLabelProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.DefaultRenderKitIdType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.DefaultRenderKitIdType} object.
- * <!-- begin-user-doc -->
- * @extends ITableItemLabelProvider
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class DefaultRenderKitIdTypeItemProvider extends ItemProviderAdapter
-		implements IEditingDomainItemProvider, IStructuredItemContentProvider, ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource, ITableItemLabelProvider {
-    /**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc --> 
-	 * @param adapterFactory
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public DefaultRenderKitIdTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-	 * @param object
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_DefaultRenderKitIdType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_DefaultRenderKitIdType_textContent_feature", "_UI_DefaultRenderKitIdType_type"),
-				 FacesConfigPackage.Literals.DEFAULT_RENDER_KIT_ID_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc --> 
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_DefaultRenderKitIdType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_DefaultRenderKitIdType_id_feature", "_UI_DefaultRenderKitIdType_type"),
-				 FacesConfigPackage.Literals.DEFAULT_RENDER_KIT_ID_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns DefaultRenderKitIdType.gif.
-	 * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/DefaultRenderKitIdType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String getText(Object object) {
-		String label = ((DefaultRenderKitIdType) object).getTextContent();
-		return label == null || label.length() == 0 ? getString("_UI_DefaultRenderKitIdType_type")
-				: label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(DefaultRenderKitIdType.class)) {
-			case FacesConfigPackage.DEFAULT_RENDER_KIT_ID_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.DEFAULT_RENDER_KIT_ID_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnImage(java.lang.Object, int)
-	 */
-	public Object getColumnImage(Object object, int columnIndex) {
-		if(columnIndex ==0)
-			return getImage(object);
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnText(java.lang.Object, int)
-	 */
-	public String getColumnText(Object object, int columnIndex) {
-		switch (columnIndex) {
-
-		case 0:
-			return getText(object);
-		case 1:
-			return getString("_UI_DefaultRenderKitIdType_type"); //$NON-NLS-1$
-		}
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/DefaultValidatorsTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/DefaultValidatorsTypeItemProvider.java
deleted file mode 100644
index 67afedd..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/DefaultValidatorsTypeItemProvider.java
+++ /dev/null
@@ -1,205 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.DefaultValidatorsType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.DefaultValidatorsType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class DefaultValidatorsTypeItemProvider
-	extends ItemProviderAdapter
-	implements
-		IEditingDomainItemProvider,
-		IStructuredItemContentProvider,
-		ITreeItemContentProvider,
-		IItemLabelProvider,
-		IItemPropertySource {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * @param adapterFactory
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public DefaultValidatorsTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-	 * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_DefaultValidatorsType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_DefaultValidatorsType_id_feature", "_UI_DefaultValidatorsType_type"),
-				 FacesConfigPackage.Literals.DEFAULT_VALIDATORS_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures.add(FacesConfigPackage.Literals.DEFAULT_VALIDATORS_TYPE__VALIDATOR_ID);
-		}
-		return childrenFeatures;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-		// Check the type of the specified child object and return the proper feature to use for
-		// adding (see {@link AddCommand}) it as a child.
-
-		return super.getChildFeature(object, child);
-	}
-
-	/**
-	 * This returns DefaultValidatorsType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/DefaultValidatorsType"));
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((DefaultValidatorsType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_DefaultValidatorsType_type") :
-			getString("_UI_DefaultValidatorsType_type") + " " + label;
-	}
-
-	/**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(DefaultValidatorsType.class)) {
-			case FacesConfigPackage.DEFAULT_VALIDATORS_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-			case FacesConfigPackage.DEFAULT_VALIDATORS_TYPE__VALIDATOR_ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-	/**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DEFAULT_VALIDATORS_TYPE__VALIDATOR_ID,
-				 FacesConfigFactory.eINSTANCE.createValidatorIdType()));
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/DefaultValueTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/DefaultValueTypeItemProvider.java
deleted file mode 100644
index b830289..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/DefaultValueTypeItemProvider.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.DefaultValueType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.DefaultValueType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class DefaultValueTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public DefaultValueTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_DefaultValueType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_DefaultValueType_textContent_feature", "_UI_DefaultValueType_type"),
-				 FacesConfigPackage.Literals.DEFAULT_VALUE_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_DefaultValueType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_DefaultValueType_id_feature", "_UI_DefaultValueType_type"),
-				 FacesConfigPackage.Literals.DEFAULT_VALUE_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns DefaultValueType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/DefaultValueType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((DefaultValueType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_DefaultValueType_type") :
-			getString("_UI_DefaultValueType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(DefaultValueType.class)) {
-			case FacesConfigPackage.DEFAULT_VALUE_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.DEFAULT_VALUE_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/DescriptionTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/DescriptionTypeItemProvider.java
deleted file mode 100644
index 4bf86c2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/DescriptionTypeItemProvider.java
+++ /dev/null
@@ -1,217 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.DescriptionType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.DescriptionType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class DescriptionTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public DescriptionTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addLangPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_DescriptionType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_DescriptionType_textContent_feature", "_UI_DescriptionType_type"),
-				 FacesConfigPackage.Literals.DESCRIPTION_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Lang feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addLangPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_DescriptionType_lang_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_DescriptionType_lang_feature", "_UI_DescriptionType_type"),
-				 FacesConfigPackage.Literals.DESCRIPTION_TYPE__LANG,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_DescriptionType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_DescriptionType_id_feature", "_UI_DescriptionType_type"),
-				 FacesConfigPackage.Literals.DESCRIPTION_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns DescriptionType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/DescriptionType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((DescriptionType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_DescriptionType_type") :
-			getString("_UI_DescriptionType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(DescriptionType.class)) {
-			case FacesConfigPackage.DESCRIPTION_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.DESCRIPTION_TYPE__LANG:
-			case FacesConfigPackage.DESCRIPTION_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/DisplayNameTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/DisplayNameTypeItemProvider.java
deleted file mode 100644
index 91d43b5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/DisplayNameTypeItemProvider.java
+++ /dev/null
@@ -1,217 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class DisplayNameTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public DisplayNameTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addLangPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_DisplayNameType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_DisplayNameType_textContent_feature", "_UI_DisplayNameType_type"),
-				 FacesConfigPackage.Literals.DISPLAY_NAME_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Lang feature.
-	 * <!-- begin-user-doc -->
-	 * @param object
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addLangPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_DisplayNameType_lang_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_DisplayNameType_lang_feature", "_UI_DisplayNameType_type"),
-				 FacesConfigPackage.Literals.DISPLAY_NAME_TYPE__LANG,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-	 * @param object
-	 * <!-- end-user-doc --> 
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_DisplayNameType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_DisplayNameType_id_feature", "_UI_DisplayNameType_type"),
-				 FacesConfigPackage.Literals.DISPLAY_NAME_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns DisplayNameType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/DisplayNameType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((DisplayNameType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_DisplayNameType_type") :
-			getString("_UI_DisplayNameType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(DisplayNameType.class)) {
-			case FacesConfigPackage.DISPLAY_NAME_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.DISPLAY_NAME_TYPE__LANG:
-			case FacesConfigPackage.DISPLAY_NAME_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/DocumentRootItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/DocumentRootItemProvider.java
deleted file mode 100644
index 09acd88..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/DocumentRootItemProvider.java
+++ /dev/null
@@ -1,886 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class DocumentRootItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public DocumentRootItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__ABSOLUTE_ORDERING);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__ACTION_LISTENER);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__APPLICATION);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__APPLICATION_FACTORY);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__ATTRIBUTE);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__ATTRIBUTE_CLASS);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__ATTRIBUTE_EXTENSION);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__ATTRIBUTE_NAME);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__BEHAVIOR);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__BEHAVIOR_CLASS);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__BEHAVIOR_ID);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__BEHAVIOR_EXTENSION);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__COMPONENT);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__COMPONENT_CLASS);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__COMPONENT_EXTENSION);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__COMPONENT_FAMILY);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__COMPONENT_TYPE);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__CONVERTER);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__CONVERTER_CLASS);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__CONVERTER_FOR_CLASS);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__CONVERTER_ID);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__DEFAULT_LOCALE);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__DEFAULT_RENDER_KIT_ID);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__DEFAULT_VALIDATORS);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__DEFAULT_VALUE);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__DESCRIPTION);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__DISPLAY_NAME);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__EXCEPTION_HANDLER_FACTORY);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__EXTERNAL_CONTEXT_FACTORY);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__FACES_CONFIG);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__FACES_CONTEXT_FACTORY);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__FACET);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__FACET_EXTENSION);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__FACET_NAME);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__FACTORY);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__FROM_ACTION);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__FROM_OUTCOME);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__FROM_VIEW_ID);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__ICON);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__IF);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__KEY);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__KEY_CLASS);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__LARGE_ICON);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__LIFECYCLE);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__LIFECYCLE_FACTORY);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__LIST_ENTRIES);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__LOCALE_CONFIG);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__MANAGED_BEAN);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__MANAGED_BEAN_CLASS);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__MANAGED_BEAN_NAME);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__MANAGED_BEAN_SCOPE);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__MANAGED_PROPERTY);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__MAP_ENTRIES);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__MAP_ENTRY);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__MESSAGE_BUNDLE);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__NAME);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__NAVIGATION_CASE);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__NAVIGATION_HANDLER);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__NAVIGATION_RULE);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__NULL_VALUE);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__ORDERING);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__ORDERING_ORDERING);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__OTHERS);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__PARTIAL_VIEW_CONTEXT_FACTORY);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__PHASE_LISTENER);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__PROPERTY);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__PROPERTY_CLASS);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__PROPERTY_EXTENSION);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__PROPERTY_NAME);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__PROPERTY_RESOLVER);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__REDIRECT);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__REDIRECT_VIEW_PARAM);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__REFERENCED_BEAN);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__REFERENCED_BEAN_CLASS);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__REFERENCED_BEAN_NAME);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__RENDERER);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__RENDERER_CLASS);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__RENDERER_EXTENSION);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__RENDERER_TYPE);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__RENDER_KIT);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__RENDER_KIT_CLASS);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__RENDER_KIT_FACTORY);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__RENDER_KIT_ID);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__RESOURCE_HANDLER);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__SMALL_ICON);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__SOURCE_CLASS);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__STATE_MANAGER);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__SUGGESTED_VALUE);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__SUPPORTED_LOCALE);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__SYSTEM_EVENT_CLASS);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__SYSTEM_EVENT_LISTENER);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__SYSTEM_EVENT_LISTENER_CLASS);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__TAG_HANDLER_DELEGATE_FACTORY);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__TO_VIEW_ID);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__VALIDATOR);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__VALIDATOR_CLASS);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__VALIDATOR_ID);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__VALUE);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__VALUE_CLASS);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__VARIABLE_RESOLVER);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__VIEW_DECLARATION_LANGUAGE_FACTORY);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__VIEW_HANDLER);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__VISIT_CONTEXT_FACTORY);
-		}
-		return childrenFeatures;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-		// Check the type of the specified child object and return the proper feature to use for
-		// adding (see {@link AddCommand}) it as a child.
-
-		return super.getChildFeature(object, child);
-	}
-
-				/**
-	 * This returns DocumentRoot.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/DocumentRoot")); //$NON-NLS-1$
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String getText(Object object) {
-		return getString("_UI_DocumentRoot_type"); //$NON-NLS-1$
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(DocumentRoot.class)) {
-			case FacesConfigPackage.DOCUMENT_ROOT__ABSOLUTE_ORDERING:
-			case FacesConfigPackage.DOCUMENT_ROOT__ACTION_LISTENER:
-			case FacesConfigPackage.DOCUMENT_ROOT__APPLICATION:
-			case FacesConfigPackage.DOCUMENT_ROOT__APPLICATION_FACTORY:
-			case FacesConfigPackage.DOCUMENT_ROOT__ATTRIBUTE:
-			case FacesConfigPackage.DOCUMENT_ROOT__ATTRIBUTE_CLASS:
-			case FacesConfigPackage.DOCUMENT_ROOT__ATTRIBUTE_EXTENSION:
-			case FacesConfigPackage.DOCUMENT_ROOT__ATTRIBUTE_NAME:
-			case FacesConfigPackage.DOCUMENT_ROOT__BEHAVIOR:
-			case FacesConfigPackage.DOCUMENT_ROOT__BEHAVIOR_CLASS:
-			case FacesConfigPackage.DOCUMENT_ROOT__BEHAVIOR_ID:
-			case FacesConfigPackage.DOCUMENT_ROOT__BEHAVIOR_EXTENSION:
-			case FacesConfigPackage.DOCUMENT_ROOT__COMPONENT:
-			case FacesConfigPackage.DOCUMENT_ROOT__COMPONENT_CLASS:
-			case FacesConfigPackage.DOCUMENT_ROOT__COMPONENT_EXTENSION:
-			case FacesConfigPackage.DOCUMENT_ROOT__COMPONENT_FAMILY:
-			case FacesConfigPackage.DOCUMENT_ROOT__COMPONENT_TYPE:
-			case FacesConfigPackage.DOCUMENT_ROOT__CONVERTER:
-			case FacesConfigPackage.DOCUMENT_ROOT__CONVERTER_CLASS:
-			case FacesConfigPackage.DOCUMENT_ROOT__CONVERTER_FOR_CLASS:
-			case FacesConfigPackage.DOCUMENT_ROOT__CONVERTER_ID:
-			case FacesConfigPackage.DOCUMENT_ROOT__DEFAULT_LOCALE:
-			case FacesConfigPackage.DOCUMENT_ROOT__DEFAULT_RENDER_KIT_ID:
-			case FacesConfigPackage.DOCUMENT_ROOT__DEFAULT_VALIDATORS:
-			case FacesConfigPackage.DOCUMENT_ROOT__DEFAULT_VALUE:
-			case FacesConfigPackage.DOCUMENT_ROOT__DESCRIPTION:
-			case FacesConfigPackage.DOCUMENT_ROOT__DISPLAY_NAME:
-			case FacesConfigPackage.DOCUMENT_ROOT__EXCEPTION_HANDLER_FACTORY:
-			case FacesConfigPackage.DOCUMENT_ROOT__EXTERNAL_CONTEXT_FACTORY:
-			case FacesConfigPackage.DOCUMENT_ROOT__FACES_CONFIG:
-			case FacesConfigPackage.DOCUMENT_ROOT__FACES_CONTEXT_FACTORY:
-			case FacesConfigPackage.DOCUMENT_ROOT__FACET:
-			case FacesConfigPackage.DOCUMENT_ROOT__FACET_EXTENSION:
-			case FacesConfigPackage.DOCUMENT_ROOT__FACET_NAME:
-			case FacesConfigPackage.DOCUMENT_ROOT__FACTORY:
-			case FacesConfigPackage.DOCUMENT_ROOT__FROM_ACTION:
-			case FacesConfigPackage.DOCUMENT_ROOT__FROM_OUTCOME:
-			case FacesConfigPackage.DOCUMENT_ROOT__FROM_VIEW_ID:
-			case FacesConfigPackage.DOCUMENT_ROOT__ICON:
-			case FacesConfigPackage.DOCUMENT_ROOT__IF:
-			case FacesConfigPackage.DOCUMENT_ROOT__KEY:
-			case FacesConfigPackage.DOCUMENT_ROOT__KEY_CLASS:
-			case FacesConfigPackage.DOCUMENT_ROOT__LARGE_ICON:
-			case FacesConfigPackage.DOCUMENT_ROOT__LIFECYCLE:
-			case FacesConfigPackage.DOCUMENT_ROOT__LIFECYCLE_FACTORY:
-			case FacesConfigPackage.DOCUMENT_ROOT__LIST_ENTRIES:
-			case FacesConfigPackage.DOCUMENT_ROOT__LOCALE_CONFIG:
-			case FacesConfigPackage.DOCUMENT_ROOT__MANAGED_BEAN:
-			case FacesConfigPackage.DOCUMENT_ROOT__MANAGED_BEAN_CLASS:
-			case FacesConfigPackage.DOCUMENT_ROOT__MANAGED_BEAN_NAME:
-			case FacesConfigPackage.DOCUMENT_ROOT__MANAGED_BEAN_SCOPE:
-			case FacesConfigPackage.DOCUMENT_ROOT__MANAGED_PROPERTY:
-			case FacesConfigPackage.DOCUMENT_ROOT__MAP_ENTRIES:
-			case FacesConfigPackage.DOCUMENT_ROOT__MAP_ENTRY:
-			case FacesConfigPackage.DOCUMENT_ROOT__MESSAGE_BUNDLE:
-			case FacesConfigPackage.DOCUMENT_ROOT__NAME:
-			case FacesConfigPackage.DOCUMENT_ROOT__NAVIGATION_CASE:
-			case FacesConfigPackage.DOCUMENT_ROOT__NAVIGATION_HANDLER:
-			case FacesConfigPackage.DOCUMENT_ROOT__NAVIGATION_RULE:
-			case FacesConfigPackage.DOCUMENT_ROOT__NULL_VALUE:
-			case FacesConfigPackage.DOCUMENT_ROOT__ORDERING:
-			case FacesConfigPackage.DOCUMENT_ROOT__ORDERING_ORDERING:
-			case FacesConfigPackage.DOCUMENT_ROOT__OTHERS:
-			case FacesConfigPackage.DOCUMENT_ROOT__PARTIAL_VIEW_CONTEXT_FACTORY:
-			case FacesConfigPackage.DOCUMENT_ROOT__PHASE_LISTENER:
-			case FacesConfigPackage.DOCUMENT_ROOT__PROPERTY:
-			case FacesConfigPackage.DOCUMENT_ROOT__PROPERTY_CLASS:
-			case FacesConfigPackage.DOCUMENT_ROOT__PROPERTY_EXTENSION:
-			case FacesConfigPackage.DOCUMENT_ROOT__PROPERTY_NAME:
-			case FacesConfigPackage.DOCUMENT_ROOT__PROPERTY_RESOLVER:
-			case FacesConfigPackage.DOCUMENT_ROOT__REDIRECT:
-			case FacesConfigPackage.DOCUMENT_ROOT__REDIRECT_VIEW_PARAM:
-			case FacesConfigPackage.DOCUMENT_ROOT__REFERENCED_BEAN:
-			case FacesConfigPackage.DOCUMENT_ROOT__REFERENCED_BEAN_CLASS:
-			case FacesConfigPackage.DOCUMENT_ROOT__REFERENCED_BEAN_NAME:
-			case FacesConfigPackage.DOCUMENT_ROOT__RENDERER:
-			case FacesConfigPackage.DOCUMENT_ROOT__RENDERER_CLASS:
-			case FacesConfigPackage.DOCUMENT_ROOT__RENDERER_EXTENSION:
-			case FacesConfigPackage.DOCUMENT_ROOT__RENDERER_TYPE:
-			case FacesConfigPackage.DOCUMENT_ROOT__RENDER_KIT:
-			case FacesConfigPackage.DOCUMENT_ROOT__RENDER_KIT_CLASS:
-			case FacesConfigPackage.DOCUMENT_ROOT__RENDER_KIT_FACTORY:
-			case FacesConfigPackage.DOCUMENT_ROOT__RENDER_KIT_ID:
-			case FacesConfigPackage.DOCUMENT_ROOT__RESOURCE_HANDLER:
-			case FacesConfigPackage.DOCUMENT_ROOT__SMALL_ICON:
-			case FacesConfigPackage.DOCUMENT_ROOT__SOURCE_CLASS:
-			case FacesConfigPackage.DOCUMENT_ROOT__STATE_MANAGER:
-			case FacesConfigPackage.DOCUMENT_ROOT__SUGGESTED_VALUE:
-			case FacesConfigPackage.DOCUMENT_ROOT__SUPPORTED_LOCALE:
-			case FacesConfigPackage.DOCUMENT_ROOT__SYSTEM_EVENT_CLASS:
-			case FacesConfigPackage.DOCUMENT_ROOT__SYSTEM_EVENT_LISTENER:
-			case FacesConfigPackage.DOCUMENT_ROOT__SYSTEM_EVENT_LISTENER_CLASS:
-			case FacesConfigPackage.DOCUMENT_ROOT__TAG_HANDLER_DELEGATE_FACTORY:
-			case FacesConfigPackage.DOCUMENT_ROOT__TO_VIEW_ID:
-			case FacesConfigPackage.DOCUMENT_ROOT__VALIDATOR:
-			case FacesConfigPackage.DOCUMENT_ROOT__VALIDATOR_CLASS:
-			case FacesConfigPackage.DOCUMENT_ROOT__VALIDATOR_ID:
-			case FacesConfigPackage.DOCUMENT_ROOT__VALUE:
-			case FacesConfigPackage.DOCUMENT_ROOT__VALUE_CLASS:
-			case FacesConfigPackage.DOCUMENT_ROOT__VARIABLE_RESOLVER:
-			case FacesConfigPackage.DOCUMENT_ROOT__VIEW_DECLARATION_LANGUAGE_FACTORY:
-			case FacesConfigPackage.DOCUMENT_ROOT__VIEW_HANDLER:
-			case FacesConfigPackage.DOCUMENT_ROOT__VISIT_CONTEXT_FACTORY:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__ABSOLUTE_ORDERING,
-				 FacesConfigFactory.eINSTANCE.createAbsoluteOrderingType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__ACTION_LISTENER,
-				 FacesConfigFactory.eINSTANCE.createActionListenerType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__APPLICATION,
-				 FacesConfigFactory.eINSTANCE.createApplicationType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__APPLICATION_FACTORY,
-				 FacesConfigFactory.eINSTANCE.createApplicationFactoryType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__ATTRIBUTE,
-				 FacesConfigFactory.eINSTANCE.createAttributeType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__ATTRIBUTE_CLASS,
-				 FacesConfigFactory.eINSTANCE.createAttributeClassType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__ATTRIBUTE_EXTENSION,
-				 FacesConfigFactory.eINSTANCE.createAttributeExtensionType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__ATTRIBUTE_NAME,
-				 FacesConfigFactory.eINSTANCE.createAttributeNameType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__BEHAVIOR,
-				 FacesConfigFactory.eINSTANCE.createBehaviorType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__BEHAVIOR_CLASS,
-				 FacesConfigFactory.eINSTANCE.createBehaviorClassType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__BEHAVIOR_ID,
-				 FacesConfigFactory.eINSTANCE.createBehaviorIdType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__BEHAVIOR_EXTENSION,
-				 FacesConfigFactory.eINSTANCE.createBehaviorExtensionType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__COMPONENT,
-				 FacesConfigFactory.eINSTANCE.createComponentType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__COMPONENT_CLASS,
-				 FacesConfigFactory.eINSTANCE.createComponentClassType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__COMPONENT_EXTENSION,
-				 FacesConfigFactory.eINSTANCE.createComponentExtensionType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__COMPONENT_FAMILY,
-				 FacesConfigFactory.eINSTANCE.createComponentFamilyType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__COMPONENT_TYPE,
-				 FacesConfigFactory.eINSTANCE.createComponentTypeType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__CONVERTER,
-				 FacesConfigFactory.eINSTANCE.createConverterType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__CONVERTER_CLASS,
-				 FacesConfigFactory.eINSTANCE.createConverterClassType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__CONVERTER_FOR_CLASS,
-				 FacesConfigFactory.eINSTANCE.createConverterForClassType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__CONVERTER_ID,
-				 FacesConfigFactory.eINSTANCE.createConverterIdType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__DEFAULT_LOCALE,
-				 FacesConfigFactory.eINSTANCE.createDefaultLocaleType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__DEFAULT_RENDER_KIT_ID,
-				 FacesConfigFactory.eINSTANCE.createDefaultRenderKitIdType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__DEFAULT_VALIDATORS,
-				 FacesConfigFactory.eINSTANCE.createDefaultValidatorsType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__DEFAULT_VALUE,
-				 FacesConfigFactory.eINSTANCE.createDefaultValueType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__DESCRIPTION,
-				 FacesConfigFactory.eINSTANCE.createDescriptionType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__DISPLAY_NAME,
-				 FacesConfigFactory.eINSTANCE.createDisplayNameType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__EXCEPTION_HANDLER_FACTORY,
-				 FacesConfigFactory.eINSTANCE.createExceptionHandlerFactoryType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__EXTERNAL_CONTEXT_FACTORY,
-				 FacesConfigFactory.eINSTANCE.createExternalContextFactoryType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__FACES_CONFIG,
-				 FacesConfigFactory.eINSTANCE.createFacesConfigType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__FACES_CONTEXT_FACTORY,
-				 FacesConfigFactory.eINSTANCE.createFacesContextFactoryType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__FACET,
-				 FacesConfigFactory.eINSTANCE.createFacetType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__FACET_EXTENSION,
-				 FacesConfigFactory.eINSTANCE.createFacetExtensionType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__FACET_NAME,
-				 FacesConfigFactory.eINSTANCE.createFacetNameType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__FACTORY,
-				 FacesConfigFactory.eINSTANCE.createFactoryType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__FROM_ACTION,
-				 FacesConfigFactory.eINSTANCE.createFromActionType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__FROM_OUTCOME,
-				 FacesConfigFactory.eINSTANCE.createFromOutcomeType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__FROM_VIEW_ID,
-				 FacesConfigFactory.eINSTANCE.createFromViewIdType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__ICON,
-				 FacesConfigFactory.eINSTANCE.createIconType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__IF,
-				 FacesConfigFactory.eINSTANCE.createIfType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__KEY,
-				 FacesConfigFactory.eINSTANCE.createKeyType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__KEY_CLASS,
-				 FacesConfigFactory.eINSTANCE.createKeyClassType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__LARGE_ICON,
-				 FacesConfigFactory.eINSTANCE.createLargeIconType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__LIFECYCLE,
-				 FacesConfigFactory.eINSTANCE.createLifecycleType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__LIFECYCLE_FACTORY,
-				 FacesConfigFactory.eINSTANCE.createLifecycleFactoryType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__LIST_ENTRIES,
-				 FacesConfigFactory.eINSTANCE.createListEntriesType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__LOCALE_CONFIG,
-				 FacesConfigFactory.eINSTANCE.createLocaleConfigType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__MANAGED_BEAN,
-				 FacesConfigFactory.eINSTANCE.createManagedBeanType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__MANAGED_BEAN_CLASS,
-				 FacesConfigFactory.eINSTANCE.createManagedBeanClassType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__MANAGED_BEAN_NAME,
-				 FacesConfigFactory.eINSTANCE.createManagedBeanNameType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__MANAGED_BEAN_SCOPE,
-				 FacesConfigFactory.eINSTANCE.createManagedBeanScopeType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__MANAGED_PROPERTY,
-				 FacesConfigFactory.eINSTANCE.createManagedPropertyType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__MAP_ENTRIES,
-				 FacesConfigFactory.eINSTANCE.createMapEntriesType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__MAP_ENTRY,
-				 FacesConfigFactory.eINSTANCE.createMapEntryType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__MESSAGE_BUNDLE,
-				 FacesConfigFactory.eINSTANCE.createMessageBundleType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__NAME,
-				 FacesConfigFactory.eINSTANCE.createNameType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__NAVIGATION_CASE,
-				 FacesConfigFactory.eINSTANCE.createNavigationCaseType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__NAVIGATION_HANDLER,
-				 FacesConfigFactory.eINSTANCE.createNavigationHandlerType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__NAVIGATION_RULE,
-				 FacesConfigFactory.eINSTANCE.createNavigationRuleType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__NULL_VALUE,
-				 FacesConfigFactory.eINSTANCE.createNullValueType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__ORDERING,
-				 FacesConfigFactory.eINSTANCE.createOrderingType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__ORDERING_ORDERING,
-				 FacesConfigFactory.eINSTANCE.createOrderingOrderingType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__OTHERS,
-				 FacesConfigFactory.eINSTANCE.createOrderingOthersType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__PARTIAL_VIEW_CONTEXT_FACTORY,
-				 FacesConfigFactory.eINSTANCE.createPartialViewContextFactoryType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__PHASE_LISTENER,
-				 FacesConfigFactory.eINSTANCE.createPhaseListenerType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__PROPERTY,
-				 FacesConfigFactory.eINSTANCE.createPropertyType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__PROPERTY_CLASS,
-				 FacesConfigFactory.eINSTANCE.createPropertyClassType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__PROPERTY_EXTENSION,
-				 FacesConfigFactory.eINSTANCE.createPropertyExtensionType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__PROPERTY_NAME,
-				 FacesConfigFactory.eINSTANCE.createPropertyNameType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__PROPERTY_RESOLVER,
-				 FacesConfigFactory.eINSTANCE.createPropertyResolverType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__REDIRECT,
-				 FacesConfigFactory.eINSTANCE.createRedirectType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__REDIRECT_VIEW_PARAM,
-				 FacesConfigFactory.eINSTANCE.createRedirectViewParamType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__REFERENCED_BEAN,
-				 FacesConfigFactory.eINSTANCE.createReferencedBeanType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__REFERENCED_BEAN_CLASS,
-				 FacesConfigFactory.eINSTANCE.createReferencedBeanClassType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__REFERENCED_BEAN_NAME,
-				 FacesConfigFactory.eINSTANCE.createReferencedBeanNameType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__RENDERER,
-				 FacesConfigFactory.eINSTANCE.createRendererType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__RENDERER_CLASS,
-				 FacesConfigFactory.eINSTANCE.createRendererClassType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__RENDERER_EXTENSION,
-				 FacesConfigFactory.eINSTANCE.createRendererExtensionType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__RENDERER_TYPE,
-				 FacesConfigFactory.eINSTANCE.createRendererTypeType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__RENDER_KIT,
-				 FacesConfigFactory.eINSTANCE.createRenderKitType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__RENDER_KIT_CLASS,
-				 FacesConfigFactory.eINSTANCE.createRenderKitClassType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__RENDER_KIT_FACTORY,
-				 FacesConfigFactory.eINSTANCE.createRenderKitFactoryType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__RENDER_KIT_ID,
-				 FacesConfigFactory.eINSTANCE.createRenderKitIdType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__RESOURCE_HANDLER,
-				 FacesConfigFactory.eINSTANCE.createResourceHandlerType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__SMALL_ICON,
-				 FacesConfigFactory.eINSTANCE.createSmallIconType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__SOURCE_CLASS,
-				 FacesConfigFactory.eINSTANCE.createSourceClassType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__STATE_MANAGER,
-				 FacesConfigFactory.eINSTANCE.createStateManagerType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__SUGGESTED_VALUE,
-				 FacesConfigFactory.eINSTANCE.createSuggestedValueType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__SUPPORTED_LOCALE,
-				 FacesConfigFactory.eINSTANCE.createSupportedLocaleType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__SYSTEM_EVENT_CLASS,
-				 FacesConfigFactory.eINSTANCE.createSystemEventClassType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__SYSTEM_EVENT_LISTENER,
-				 FacesConfigFactory.eINSTANCE.createSystemEventListenerType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__SYSTEM_EVENT_LISTENER_CLASS,
-				 FacesConfigFactory.eINSTANCE.createSystemEventListenerClassType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__TAG_HANDLER_DELEGATE_FACTORY,
-				 FacesConfigFactory.eINSTANCE.createTagHandlerDelegateFactoryType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__TO_VIEW_ID,
-				 FacesConfigFactory.eINSTANCE.createToViewIdType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__VALIDATOR,
-				 FacesConfigFactory.eINSTANCE.createValidatorType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__VALIDATOR_CLASS,
-				 FacesConfigFactory.eINSTANCE.createValidatorClassType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__VALIDATOR_ID,
-				 FacesConfigFactory.eINSTANCE.createValidatorIdType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__VALUE,
-				 FacesConfigFactory.eINSTANCE.createValueType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__VALUE_CLASS,
-				 FacesConfigFactory.eINSTANCE.createValueClassType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__VARIABLE_RESOLVER,
-				 FacesConfigFactory.eINSTANCE.createVariableResolverType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__VIEW_DECLARATION_LANGUAGE_FACTORY,
-				 FacesConfigFactory.eINSTANCE.createViewDeclarationLanguageFactoryType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__VIEW_HANDLER,
-				 FacesConfigFactory.eINSTANCE.createViewHandlerType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__VISIT_CONTEXT_FACTORY,
-				 FacesConfigFactory.eINSTANCE.createVisitContextFactoryType()));
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/DynamicAttributeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/DynamicAttributeItemProvider.java
deleted file mode 100644
index e44c452..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/DynamicAttributeItemProvider.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.DynamicAttribute;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.DynamicAttribute} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class DynamicAttributeItemProvider
-    extends ItemProviderAdapter
-    implements	
-        IEditingDomainItemProvider,	
-        IStructuredItemContentProvider,	
-        ITreeItemContentProvider,	
-        IItemLabelProvider,	
-        IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public DynamicAttributeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addNamePropertyDescriptor(object);
-			addValuePropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Name feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void addNamePropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_DynamicAttribute_name_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_DynamicAttribute_name_feature", "_UI_DynamicAttribute_type"),
-				 FacesConfigPackage.Literals.DYNAMIC_ATTRIBUTE__NAME,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Value feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void addValuePropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_DynamicAttribute_value_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_DynamicAttribute_value_feature", "_UI_DynamicAttribute_type"),
-				 FacesConfigPackage.Literals.DYNAMIC_ATTRIBUTE__VALUE,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns DynamicAttribute.gif.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/DynamicAttribute"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public String getText(Object object) {
-		String label = ((DynamicAttribute)object).getName();
-		return label == null || label.length() == 0 ?
-			getString("_UI_DynamicAttribute_type") :
-			getString("_UI_DynamicAttribute_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(DynamicAttribute.class)) {
-			case FacesConfigPackage.DYNAMIC_ATTRIBUTE__NAME:
-			case FacesConfigPackage.DYNAMIC_ATTRIBUTE__VALUE:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/DynamicElementItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/DynamicElementItemProvider.java
deleted file mode 100644
index cd537af..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/DynamicElementItemProvider.java
+++ /dev/null
@@ -1,254 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.DynamicElement;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.DynamicElement} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class DynamicElementItemProvider
-    extends ItemProviderAdapter
-    implements	
-        IEditingDomainItemProvider,	
-        IStructuredItemContentProvider,	
-        ITreeItemContentProvider,	
-        IItemLabelProvider,	
-        IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public DynamicElementItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addNamePropertyDescriptor(object);
-			addAttributesPropertyDescriptor(object);
-			addTextContentPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Attributes feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void addAttributesPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_DynamicElement_attributes_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_DynamicElement_attributes_feature", "_UI_DynamicElement_type"),
-				 FacesConfigPackage.Literals.DYNAMIC_ELEMENT__ATTRIBUTES,
-				 true,
-				 false,
-				 true,
-				 null,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_DynamicElement_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_DynamicElement_textContent_feature", "_UI_DynamicElement_type"),
-				 FacesConfigPackage.Literals.DYNAMIC_ELEMENT__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Name feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void addNamePropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_DynamicElement_name_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_DynamicElement_name_feature", "_UI_DynamicElement_type"),
-				 FacesConfigPackage.Literals.DYNAMIC_ELEMENT__NAME,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures.add(FacesConfigPackage.Literals.DYNAMIC_ELEMENT__CHILD_NODES);
-		}
-		return childrenFeatures;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-		// Check the type of the specified child object and return the proper feature to use for
-		// adding (see {@link AddCommand}) it as a child.
-
-		return super.getChildFeature(object, child);
-	}
-
-				/**
-	 * This returns DynamicElement.gif.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/DynamicElement"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public String getText(Object object) {
-		String label = ((DynamicElement)object).getName();
-		return label == null || label.length() == 0 ?
-			getString("_UI_DynamicElement_type") :
-			getString("_UI_DynamicElement_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(DynamicElement.class)) {
-			case FacesConfigPackage.DYNAMIC_ELEMENT__NAME:
-			case FacesConfigPackage.DYNAMIC_ELEMENT__TEXT_CONTENT:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-			case FacesConfigPackage.DYNAMIC_ELEMENT__CHILD_NODES:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DYNAMIC_ELEMENT__CHILD_NODES,
-				 FacesConfigFactory.eINSTANCE.createDynamicElement()));
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ELResolverTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ELResolverTypeItemProvider.java
deleted file mode 100644
index cb209a1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ELResolverTypeItemProvider.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.ELResolverType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ELResolverType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class ELResolverTypeItemProvider
-    extends ItemProviderAdapter
-    implements	
-        IEditingDomainItemProvider,	
-        IStructuredItemContentProvider,	
-        ITreeItemContentProvider,	
-        IItemLabelProvider,	
-        IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public ELResolverTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ELResolverType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ELResolverType_textContent_feature", "_UI_ELResolverType_type"),
-				 FacesConfigPackage.Literals.EL_RESOLVER_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ELResolverType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ELResolverType_id_feature", "_UI_ELResolverType_type"),
-				 FacesConfigPackage.Literals.EL_RESOLVER_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns ELResolverType.gif.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/ELResolverType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public String getText(Object object) {
-		String label = ((ELResolverType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_ELResolverType_type") :
-			getString("_UI_ELResolverType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(ELResolverType.class)) {
-			case FacesConfigPackage.EL_RESOLVER_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.EL_RESOLVER_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ExceptionHandlerFactoryTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ExceptionHandlerFactoryTypeItemProvider.java
deleted file mode 100644
index 654f40f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ExceptionHandlerFactoryTypeItemProvider.java
+++ /dev/null
@@ -1,216 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITableItemLabelProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.ExceptionHandlerFactoryType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ExceptionHandlerFactoryType} object.
- * <!-- begin-user-doc -->
- * @extends ITableItemLabelProvider
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class ExceptionHandlerFactoryTypeItemProvider
-	extends ItemProviderAdapter
-	implements
-		IEditingDomainItemProvider,
-		IStructuredItemContentProvider,
-		ITreeItemContentProvider,
-		IItemLabelProvider,
-		IItemPropertySource,
-		ITableItemLabelProvider{
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ExceptionHandlerFactoryTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-	 * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ExceptionHandlerFactoryType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ExceptionHandlerFactoryType_textContent_feature", "_UI_ExceptionHandlerFactoryType_type"),
-				 FacesConfigPackage.Literals.EXCEPTION_HANDLER_FACTORY_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-	 * @param object
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ExceptionHandlerFactoryType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ExceptionHandlerFactoryType_id_feature", "_UI_ExceptionHandlerFactoryType_type"),
-				 FacesConfigPackage.Literals.EXCEPTION_HANDLER_FACTORY_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This returns ExceptionHandlerFactoryType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/ExceptionHandlerFactoryType"));
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String getText(Object object) {
-		String label = ((ExceptionHandlerFactoryType) object).getTextContent();
-		return label == null || label.length() == 0 ? getString("_UI_ExceptionHandlerFactoryType_type")
-				: label;
-	}
-
-	/**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(ExceptionHandlerFactoryType.class)) {
-			case FacesConfigPackage.EXCEPTION_HANDLER_FACTORY_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.EXCEPTION_HANDLER_FACTORY_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-	/**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnImage(java.lang.Object, int)
-	 */
-	public Object getColumnImage(Object object, int columnIndex) {
-		// TODO Auto-generated method stub
-		if(columnIndex ==0)
-			return getImage(object);
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnText(java.lang.Object, int)
-	 */
-	public String getColumnText(Object object, int columnIndex) {
-		switch (columnIndex) {
-
-		case 0:
-			return getText(object);
-		case 1:
-			return getString("_UI_ExceptionHandlerFactoryType_type"); //$NON-NLS-1$
-		}
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ExtensionTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ExtensionTypeItemProvider.java
deleted file mode 100644
index 66bcdb8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ExtensionTypeItemProvider.java
+++ /dev/null
@@ -1,206 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.ExtensionType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ExtensionType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class ExtensionTypeItemProvider
-    extends ItemProviderAdapter
-    implements	
-        IEditingDomainItemProvider,	
-        IStructuredItemContentProvider,	
-        ITreeItemContentProvider,	
-        IItemLabelProvider,	
-        IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public ExtensionTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addChildNodesPropertyDescriptor(object);
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Child Nodes feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void addChildNodesPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ExtensionType_childNodes_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ExtensionType_childNodes_feature", "_UI_ExtensionType_type"),
-				 FacesConfigPackage.Literals.EXTENSION_TYPE__CHILD_NODES,
-				 true,
-				 false,
-				 true,
-				 null,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ExtensionType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ExtensionType_textContent_feature", "_UI_ExtensionType_type"),
-				 FacesConfigPackage.Literals.EXTENSION_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ExtensionType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ExtensionType_id_feature", "_UI_ExtensionType_type"),
-				 FacesConfigPackage.Literals.EXTENSION_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public String getText(Object object) {
-		String label = ((ExtensionType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_ExtensionType_type") :
-			getString("_UI_ExtensionType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(ExtensionType.class)) {
-			case FacesConfigPackage.EXTENSION_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.EXTENSION_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ExternalContextFactoryTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ExternalContextFactoryTypeItemProvider.java
deleted file mode 100644
index 6e2d0e3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ExternalContextFactoryTypeItemProvider.java
+++ /dev/null
@@ -1,218 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITableItemLabelProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.ExternalContextFactoryType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ExternalContextFactoryType} object.
- * <!-- begin-user-doc -->
- * @extends ITableItemLabelProvider
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class ExternalContextFactoryTypeItemProvider
-	extends ItemProviderAdapter
-	implements
-		IEditingDomainItemProvider,
-		IStructuredItemContentProvider,
-		ITreeItemContentProvider,
-		IItemLabelProvider,
-		IItemPropertySource,
-		ITableItemLabelProvider{
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * @param adapterFactory
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ExternalContextFactoryTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc --> 
-	 * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ExternalContextFactoryType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ExternalContextFactoryType_textContent_feature", "_UI_ExternalContextFactoryType_type"),
-				 FacesConfigPackage.Literals.EXTERNAL_CONTEXT_FACTORY_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-	 * @param object
-	 * <!-- end-user-doc --> 
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ExternalContextFactoryType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ExternalContextFactoryType_id_feature", "_UI_ExternalContextFactoryType_type"),
-				 FacesConfigPackage.Literals.EXTERNAL_CONTEXT_FACTORY_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This returns ExternalContextFactoryType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/ExternalContextFactoryType"));
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String getText(Object object) {
-		String label = ((ExternalContextFactoryType) object).getTextContent();
-		return label == null || label.length() == 0 ? getString("_UI_ExternalContextFactoryType_type")
-				: label;
-	}
-
-	/**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(ExternalContextFactoryType.class)) {
-			case FacesConfigPackage.EXTERNAL_CONTEXT_FACTORY_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.EXTERNAL_CONTEXT_FACTORY_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-	/**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnImage(java.lang.Object, int)
-	 */
-	public Object getColumnImage(Object object, int columnIndex) {
-		// TODO Auto-generated method stub
-		if(columnIndex ==0)
-			return getImage(object);
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnText(java.lang.Object, int)
-	 */
-	public String getColumnText(Object object, int columnIndex) {
-		switch (columnIndex) {
-
-		case 0:
-			return getText(object);
-		case 1:
-			return getString("_UI_ExternalContextFactoryType_type"); //$NON-NLS-1$
-		}
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FacesConfigEditPlugin.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FacesConfigEditPlugin.java
deleted file mode 100644
index 05c525e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FacesConfigEditPlugin.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-import org.eclipse.emf.common.EMFPlugin;
-import org.eclipse.emf.common.util.ResourceLocator;
-
-/**
- * This is the central singleton for the FacesConfig edit plugin.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public final class FacesConfigEditPlugin extends EMFPlugin {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * Keep track of the singleton.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final FacesConfigEditPlugin INSTANCE = new FacesConfigEditPlugin();
-
-	/**
-	 * Keep track of the singleton.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static Implementation plugin;
-
-	/**
-	 * Create the instance.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FacesConfigEditPlugin() {
-		super
-		  (new ResourceLocator [] {
-		   });
-	}
-
-	/**
-	 * Returns the singleton instance of the Eclipse plugin.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the singleton instance.
-	 * @generated
-	 */
-	public ResourceLocator getPluginResourceLocator() {
-		return plugin;
-	}
-
-	/**
-	 * Returns the singleton instance of the Eclipse plugin.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the singleton instance.
-	 * @generated
-	 */
-	public static Implementation getPlugin() {
-		return plugin;
-	}
-
-	/**
-	 * The actual implementation of the Eclipse <b>Plugin</b>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static class Implementation extends EclipsePlugin {
-		/**
-		 * Creates an instance.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		public Implementation() {
-			super();
-
-			// Remember the static instance.
-			//
-			plugin = this;
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FacesConfigExtensionTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FacesConfigExtensionTypeItemProvider.java
deleted file mode 100644
index 1767f9f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FacesConfigExtensionTypeItemProvider.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigExtensionType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigExtensionType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class FacesConfigExtensionTypeItemProvider
-    extends ExtensionTypeItemProvider
-    implements	
-        IEditingDomainItemProvider,	
-        IStructuredItemContentProvider,	
-        ITreeItemContentProvider,	
-        IItemLabelProvider,	
-        IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    @SuppressWarnings("hiding")
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public FacesConfigExtensionTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This returns FacesConfigExtensionType.gif.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-    public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/FacesConfigExtensionType")); //$NON-NLS-1$
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-    public String getText(Object object) {
-		String label = ((FacesConfigExtensionType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_FacesConfigExtensionType_type") : //$NON-NLS-1$
-			getString("_UI_FacesConfigExtensionType_type") + " " + label;  //$NON-NLS-1$//$NON-NLS-2$
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FacesConfigItemProviderAdapterFactory.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FacesConfigItemProviderAdapterFactory.java
deleted file mode 100644
index b196519..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FacesConfigItemProviderAdapterFactory.java
+++ /dev/null
@@ -1,2995 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-import java.util.ArrayList;
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.Notifier;
-import org.eclipse.emf.edit.provider.ChangeNotifier;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
-import org.eclipse.emf.edit.provider.IChangeNotifier;
-import org.eclipse.emf.edit.provider.IDisposable;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.INotifyChangedListener;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITableItemLabelProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.jst.jsf.facesconfig.emf.util.FacesConfigAdapterFactory;
-
-/**
- * This is the factory that is used to provide the interfaces needed to support Viewers.
- * The adapters generated by this factory convert EMF adapter notifications into calls to {@link #fireNotifyChanged fireNotifyChanged}.
- * The adapters also support Eclipse property sheets.
- * Note that most of the adapters are shared among multiple instances.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class FacesConfigItemProviderAdapterFactory extends FacesConfigAdapterFactory implements ComposeableAdapterFactory, IChangeNotifier, IDisposable {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@SuppressWarnings("hiding")
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This keeps track of the root adapter factory that delegates to this adapter factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ComposedAdapterFactory parentAdapterFactory;
-
-    /**
-	 * This is used to implement {@link org.eclipse.emf.edit.provider.IChangeNotifier}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected IChangeNotifier changeNotifier = new ChangeNotifier();
-
-    /**
-	 * This keeps track of all the supported types checked by {@link #isFactoryForType isFactoryForType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected Collection supportedTypes = new ArrayList();
-
-    /**
-     * This constructs an instance.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated NOT
-     */
-	public FacesConfigItemProviderAdapterFactory() {
-        supportedTypes.add(IEditingDomainItemProvider.class);
-        supportedTypes.add(IStructuredItemContentProvider.class);
-        supportedTypes.add(ITreeItemContentProvider.class);
-        supportedTypes.add(IItemLabelProvider.class);
-        supportedTypes.add(IItemPropertySource.class);		
-        supportedTypes.add(ITableItemLabelProvider.class);
-    }
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.AbsoluteOrderingType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected AbsoluteOrderingTypeItemProvider absoluteOrderingTypeItemProvider;
-
-				/**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.AbsoluteOrderingType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createAbsoluteOrderingTypeAdapter() {
-		if (absoluteOrderingTypeItemProvider == null) {
-			absoluteOrderingTypeItemProvider = new AbsoluteOrderingTypeItemProvider(this);
-		}
-
-		return absoluteOrderingTypeItemProvider;
-	}
-
-				/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ActionListenerType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ActionListenerTypeItemProvider actionListenerTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ActionListenerType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createActionListenerTypeAdapter() {
-		if (actionListenerTypeItemProvider == null) {
-			actionListenerTypeItemProvider = new ActionListenerTypeItemProvider(this);
-		}
-
-		return actionListenerTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationFactoryType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ApplicationFactoryTypeItemProvider applicationFactoryTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationFactoryType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createApplicationFactoryTypeAdapter() {
-		if (applicationFactoryTypeItemProvider == null) {
-			applicationFactoryTypeItemProvider = new ApplicationFactoryTypeItemProvider(this);
-		}
-
-		return applicationFactoryTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ApplicationTypeItemProvider applicationTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createApplicationTypeAdapter() {
-		if (applicationTypeItemProvider == null) {
-			applicationTypeItemProvider = new ApplicationTypeItemProvider(this);
-		}
-
-		return applicationTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.AttributeClassType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected AttributeClassTypeItemProvider attributeClassTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.AttributeClassType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createAttributeClassTypeAdapter() {
-		if (attributeClassTypeItemProvider == null) {
-			attributeClassTypeItemProvider = new AttributeClassTypeItemProvider(this);
-		}
-
-		return attributeClassTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.AttributeExtensionType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected AttributeExtensionTypeItemProvider attributeExtensionTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.AttributeExtensionType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createAttributeExtensionTypeAdapter() {
-		if (attributeExtensionTypeItemProvider == null) {
-			attributeExtensionTypeItemProvider = new AttributeExtensionTypeItemProvider(this);
-		}
-
-		return attributeExtensionTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.AttributeNameType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected AttributeNameTypeItemProvider attributeNameTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.AttributeNameType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createAttributeNameTypeAdapter() {
-		if (attributeNameTypeItemProvider == null) {
-			attributeNameTypeItemProvider = new AttributeNameTypeItemProvider(this);
-		}
-
-		return attributeNameTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.AttributeType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected AttributeTypeItemProvider attributeTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.AttributeType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createAttributeTypeAdapter() {
-		if (attributeTypeItemProvider == null) {
-			attributeTypeItemProvider = new AttributeTypeItemProvider(this);
-		}
-
-		return attributeTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.BehaviorClassType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected BehaviorClassTypeItemProvider behaviorClassTypeItemProvider;
-
-				/**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.BehaviorClassType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createBehaviorClassTypeAdapter() {
-		if (behaviorClassTypeItemProvider == null) {
-			behaviorClassTypeItemProvider = new BehaviorClassTypeItemProvider(this);
-		}
-
-		return behaviorClassTypeItemProvider;
-	}
-
-				/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.BehaviorIdType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected BehaviorIdTypeItemProvider behaviorIdTypeItemProvider;
-
-				/**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.BehaviorIdType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createBehaviorIdTypeAdapter() {
-		if (behaviorIdTypeItemProvider == null) {
-			behaviorIdTypeItemProvider = new BehaviorIdTypeItemProvider(this);
-		}
-
-		return behaviorIdTypeItemProvider;
-	}
-
-				/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.BehaviorType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected BehaviorTypeItemProvider behaviorTypeItemProvider;
-
-				/**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.BehaviorType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createBehaviorTypeAdapter() {
-		if (behaviorTypeItemProvider == null) {
-			behaviorTypeItemProvider = new BehaviorTypeItemProvider(this);
-		}
-
-		return behaviorTypeItemProvider;
-	}
-
-				/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.BehaviorExtensionType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected BehaviorExtensionTypeItemProvider behaviorExtensionTypeItemProvider;
-
-				/**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.BehaviorExtensionType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createBehaviorExtensionTypeAdapter() {
-		if (behaviorExtensionTypeItemProvider == null) {
-			behaviorExtensionTypeItemProvider = new BehaviorExtensionTypeItemProvider(this);
-		}
-
-		return behaviorExtensionTypeItemProvider;
-	}
-
-				/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererClassType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ClientBehaviorRendererClassTypeItemProvider clientBehaviorRendererClassTypeItemProvider;
-
-				/**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererClassType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createClientBehaviorRendererClassTypeAdapter() {
-		if (clientBehaviorRendererClassTypeItemProvider == null) {
-			clientBehaviorRendererClassTypeItemProvider = new ClientBehaviorRendererClassTypeItemProvider(this);
-		}
-
-		return clientBehaviorRendererClassTypeItemProvider;
-	}
-
-				/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ClientBehaviorRendererTypeItemProvider clientBehaviorRendererTypeItemProvider;
-
-				/**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createClientBehaviorRendererTypeAdapter() {
-		if (clientBehaviorRendererTypeItemProvider == null) {
-			clientBehaviorRendererTypeItemProvider = new ClientBehaviorRendererTypeItemProvider(this);
-		}
-
-		return clientBehaviorRendererTypeItemProvider;
-	}
-
-				/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererTypeType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ClientBehaviorRendererTypeTypeItemProvider clientBehaviorRendererTypeTypeItemProvider;
-
-				/**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererTypeType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createClientBehaviorRendererTypeTypeAdapter() {
-		if (clientBehaviorRendererTypeTypeItemProvider == null) {
-			clientBehaviorRendererTypeTypeItemProvider = new ClientBehaviorRendererTypeTypeItemProvider(this);
-		}
-
-		return clientBehaviorRendererTypeTypeItemProvider;
-	}
-
-				/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ComponentClassType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ComponentClassTypeItemProvider componentClassTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ComponentClassType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createComponentClassTypeAdapter() {
-		if (componentClassTypeItemProvider == null) {
-			componentClassTypeItemProvider = new ComponentClassTypeItemProvider(this);
-		}
-
-		return componentClassTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ComponentExtensionType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ComponentExtensionTypeItemProvider componentExtensionTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ComponentExtensionType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createComponentExtensionTypeAdapter() {
-		if (componentExtensionTypeItemProvider == null) {
-			componentExtensionTypeItemProvider = new ComponentExtensionTypeItemProvider(this);
-		}
-
-		return componentExtensionTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ComponentFamilyType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ComponentFamilyTypeItemProvider componentFamilyTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ComponentFamilyType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createComponentFamilyTypeAdapter() {
-		if (componentFamilyTypeItemProvider == null) {
-			componentFamilyTypeItemProvider = new ComponentFamilyTypeItemProvider(this);
-		}
-
-		return componentFamilyTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ComponentType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ComponentTypeItemProvider componentTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ComponentType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createComponentTypeAdapter() {
-		if (componentTypeItemProvider == null) {
-			componentTypeItemProvider = new ComponentTypeItemProvider(this);
-		}
-
-		return componentTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ComponentTypeType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ComponentTypeTypeItemProvider componentTypeTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ComponentTypeType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createComponentTypeTypeAdapter() {
-		if (componentTypeTypeItemProvider == null) {
-			componentTypeTypeItemProvider = new ComponentTypeTypeItemProvider(this);
-		}
-
-		return componentTypeTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ConverterClassType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ConverterClassTypeItemProvider converterClassTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ConverterClassType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createConverterClassTypeAdapter() {
-		if (converterClassTypeItemProvider == null) {
-			converterClassTypeItemProvider = new ConverterClassTypeItemProvider(this);
-		}
-
-		return converterClassTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ConverterForClassType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ConverterForClassTypeItemProvider converterForClassTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ConverterForClassType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createConverterForClassTypeAdapter() {
-		if (converterForClassTypeItemProvider == null) {
-			converterForClassTypeItemProvider = new ConverterForClassTypeItemProvider(this);
-		}
-
-		return converterForClassTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ConverterIdType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ConverterIdTypeItemProvider converterIdTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ConverterIdType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createConverterIdTypeAdapter() {
-		if (converterIdTypeItemProvider == null) {
-			converterIdTypeItemProvider = new ConverterIdTypeItemProvider(this);
-		}
-
-		return converterIdTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ConverterType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ConverterTypeItemProvider converterTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ConverterType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createConverterTypeAdapter() {
-		if (converterTypeItemProvider == null) {
-			converterTypeItemProvider = new ConverterTypeItemProvider(this);
-		}
-
-		return converterTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.DefaultLocaleType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected DefaultLocaleTypeItemProvider defaultLocaleTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.DefaultLocaleType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createDefaultLocaleTypeAdapter() {
-		if (defaultLocaleTypeItemProvider == null) {
-			defaultLocaleTypeItemProvider = new DefaultLocaleTypeItemProvider(this);
-		}
-
-		return defaultLocaleTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.DefaultRenderKitIdType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected DefaultRenderKitIdTypeItemProvider defaultRenderKitIdTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.DefaultRenderKitIdType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createDefaultRenderKitIdTypeAdapter() {
-		if (defaultRenderKitIdTypeItemProvider == null) {
-			defaultRenderKitIdTypeItemProvider = new DefaultRenderKitIdTypeItemProvider(this);
-		}
-
-		return defaultRenderKitIdTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.DefaultValidatorsType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected DefaultValidatorsTypeItemProvider defaultValidatorsTypeItemProvider;
-
-				/**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.DefaultValidatorsType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createDefaultValidatorsTypeAdapter() {
-		if (defaultValidatorsTypeItemProvider == null) {
-			defaultValidatorsTypeItemProvider = new DefaultValidatorsTypeItemProvider(this);
-		}
-
-		return defaultValidatorsTypeItemProvider;
-	}
-
-				/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.DefaultValueType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected DefaultValueTypeItemProvider defaultValueTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.DefaultValueType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createDefaultValueTypeAdapter() {
-		if (defaultValueTypeItemProvider == null) {
-			defaultValueTypeItemProvider = new DefaultValueTypeItemProvider(this);
-		}
-
-		return defaultValueTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.DescriptionType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected DescriptionTypeItemProvider descriptionTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.DescriptionType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createDescriptionTypeAdapter() {
-		if (descriptionTypeItemProvider == null) {
-			descriptionTypeItemProvider = new DescriptionTypeItemProvider(this);
-		}
-
-		return descriptionTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected DisplayNameTypeItemProvider displayNameTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createDisplayNameTypeAdapter() {
-		if (displayNameTypeItemProvider == null) {
-			displayNameTypeItemProvider = new DisplayNameTypeItemProvider(this);
-		}
-
-		return displayNameTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected DocumentRootItemProvider documentRootItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createDocumentRootAdapter() {
-		if (documentRootItemProvider == null) {
-			documentRootItemProvider = new DocumentRootItemProvider(this);
-		}
-
-		return documentRootItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.DynamicAttribute} instances.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected DynamicAttributeItemProvider dynamicAttributeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.DynamicAttribute}.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Adapter createDynamicAttributeAdapter() {
-		if (dynamicAttributeItemProvider == null) {
-			dynamicAttributeItemProvider = new DynamicAttributeItemProvider(this);
-		}
-
-		return dynamicAttributeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.DynamicElement} instances.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected DynamicElementItemProvider dynamicElementItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.DynamicElement}.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Adapter createDynamicElementAdapter() {
-		if (dynamicElementItemProvider == null) {
-			dynamicElementItemProvider = new DynamicElementItemProvider(this);
-		}
-
-		return dynamicElementItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ELResolverType} instances.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected ELResolverTypeItemProvider elResolverTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ELResolverType}.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Adapter createELResolverTypeAdapter() {
-		if (elResolverTypeItemProvider == null) {
-			elResolverTypeItemProvider = new ELResolverTypeItemProvider(this);
-		}
-
-		return elResolverTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ExceptionHandlerFactoryType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ExceptionHandlerFactoryTypeItemProvider exceptionHandlerFactoryTypeItemProvider;
-
-				/**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ExceptionHandlerFactoryType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createExceptionHandlerFactoryTypeAdapter() {
-		if (exceptionHandlerFactoryTypeItemProvider == null) {
-			exceptionHandlerFactoryTypeItemProvider = new ExceptionHandlerFactoryTypeItemProvider(this);
-		}
-
-		return exceptionHandlerFactoryTypeItemProvider;
-	}
-
-				/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ExternalContextFactoryType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ExternalContextFactoryTypeItemProvider externalContextFactoryTypeItemProvider;
-
-				/**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ExternalContextFactoryType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createExternalContextFactoryTypeAdapter() {
-		if (externalContextFactoryTypeItemProvider == null) {
-			externalContextFactoryTypeItemProvider = new ExternalContextFactoryTypeItemProvider(this);
-		}
-
-		return externalContextFactoryTypeItemProvider;
-	}
-
-				/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigExtensionType} instances.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected FacesConfigExtensionTypeItemProvider facesConfigExtensionTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigExtensionType}.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Adapter createFacesConfigExtensionTypeAdapter() {
-		if (facesConfigExtensionTypeItemProvider == null) {
-			facesConfigExtensionTypeItemProvider = new FacesConfigExtensionTypeItemProvider(this);
-		}
-
-		return facesConfigExtensionTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.FactoryExtensionType} instances.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected FactoryExtensionTypeItemProvider factoryExtensionTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.FactoryExtensionType}.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Adapter createFactoryExtensionTypeAdapter() {
-		if (factoryExtensionTypeItemProvider == null) {
-			factoryExtensionTypeItemProvider = new FactoryExtensionTypeItemProvider(this);
-		}
-
-		return factoryExtensionTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.LifecycleExtensionType} instances.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected LifecycleExtensionTypeItemProvider lifecycleExtensionTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.LifecycleExtensionType}.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Adapter createLifecycleExtensionTypeAdapter() {
-		if (lifecycleExtensionTypeItemProvider == null) {
-			lifecycleExtensionTypeItemProvider = new LifecycleExtensionTypeItemProvider(this);
-		}
-
-		return lifecycleExtensionTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanExtensionType} instances.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected ManagedBeanExtensionTypeItemProvider managedBeanExtensionTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanExtensionType}.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Adapter createManagedBeanExtensionTypeAdapter() {
-		if (managedBeanExtensionTypeItemProvider == null) {
-			managedBeanExtensionTypeItemProvider = new ManagedBeanExtensionTypeItemProvider(this);
-		}
-
-		return managedBeanExtensionTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleExtensionType} instances.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected NavigationRuleExtensionTypeItemProvider navigationRuleExtensionTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleExtensionType}.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Adapter createNavigationRuleExtensionTypeAdapter() {
-		if (navigationRuleExtensionTypeItemProvider == null) {
-			navigationRuleExtensionTypeItemProvider = new NavigationRuleExtensionTypeItemProvider(this);
-		}
-
-		return navigationRuleExtensionTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorExtensionType} instances.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected ValidatorExtensionTypeItemProvider validatorExtensionTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorExtensionType}.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Adapter createValidatorExtensionTypeAdapter() {
-		if (validatorExtensionTypeItemProvider == null) {
-			validatorExtensionTypeItemProvider = new ValidatorExtensionTypeItemProvider(this);
-		}
-
-		return validatorExtensionTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected FacesConfigTypeItemProvider facesConfigTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createFacesConfigTypeAdapter() {
-		if (facesConfigTypeItemProvider == null) {
-			facesConfigTypeItemProvider = new FacesConfigTypeItemProvider(this);
-		}
-
-		return facesConfigTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.FacesContextFactoryType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected FacesContextFactoryTypeItemProvider facesContextFactoryTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.FacesContextFactoryType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createFacesContextFactoryTypeAdapter() {
-		if (facesContextFactoryTypeItemProvider == null) {
-			facesContextFactoryTypeItemProvider = new FacesContextFactoryTypeItemProvider(this);
-		}
-
-		return facesContextFactoryTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.FacetExtensionType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected FacetExtensionTypeItemProvider facetExtensionTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.FacetExtensionType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createFacetExtensionTypeAdapter() {
-		if (facetExtensionTypeItemProvider == null) {
-			facetExtensionTypeItemProvider = new FacetExtensionTypeItemProvider(this);
-		}
-
-		return facetExtensionTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.FacetNameType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected FacetNameTypeItemProvider facetNameTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.FacetNameType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createFacetNameTypeAdapter() {
-		if (facetNameTypeItemProvider == null) {
-			facetNameTypeItemProvider = new FacetNameTypeItemProvider(this);
-		}
-
-		return facetNameTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.FacetType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected FacetTypeItemProvider facetTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.FacetType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createFacetTypeAdapter() {
-		if (facetTypeItemProvider == null) {
-			facetTypeItemProvider = new FacetTypeItemProvider(this);
-		}
-
-		return facetTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.FactoryType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected FactoryTypeItemProvider factoryTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.FactoryType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createFactoryTypeAdapter() {
-		if (factoryTypeItemProvider == null) {
-			factoryTypeItemProvider = new FactoryTypeItemProvider(this);
-		}
-
-		return factoryTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.FromActionType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected FromActionTypeItemProvider fromActionTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.FromActionType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createFromActionTypeAdapter() {
-		if (fromActionTypeItemProvider == null) {
-			fromActionTypeItemProvider = new FromActionTypeItemProvider(this);
-		}
-
-		return fromActionTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.FromOutcomeType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected FromOutcomeTypeItemProvider fromOutcomeTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.FromOutcomeType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createFromOutcomeTypeAdapter() {
-		if (fromOutcomeTypeItemProvider == null) {
-			fromOutcomeTypeItemProvider = new FromOutcomeTypeItemProvider(this);
-		}
-
-		return fromOutcomeTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.FromViewIdType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected FromViewIdTypeItemProvider fromViewIdTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.FromViewIdType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createFromViewIdTypeAdapter() {
-		if (fromViewIdTypeItemProvider == null) {
-			fromViewIdTypeItemProvider = new FromViewIdTypeItemProvider(this);
-		}
-
-		return fromViewIdTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.IconType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected IconTypeItemProvider iconTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.IconType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createIconTypeAdapter() {
-		if (iconTypeItemProvider == null) {
-			iconTypeItemProvider = new IconTypeItemProvider(this);
-		}
-
-		return iconTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.IfType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected IfTypeItemProvider ifTypeItemProvider;
-
-				/**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.IfType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createIfTypeAdapter() {
-		if (ifTypeItemProvider == null) {
-			ifTypeItemProvider = new IfTypeItemProvider(this);
-		}
-
-		return ifTypeItemProvider;
-	}
-
-				/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.KeyClassType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected KeyClassTypeItemProvider keyClassTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.KeyClassType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createKeyClassTypeAdapter() {
-		if (keyClassTypeItemProvider == null) {
-			keyClassTypeItemProvider = new KeyClassTypeItemProvider(this);
-		}
-
-		return keyClassTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.KeyType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected KeyTypeItemProvider keyTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.KeyType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createKeyTypeAdapter() {
-		if (keyTypeItemProvider == null) {
-			keyTypeItemProvider = new KeyTypeItemProvider(this);
-		}
-
-		return keyTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.LargeIconType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected LargeIconTypeItemProvider largeIconTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.LargeIconType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createLargeIconTypeAdapter() {
-		if (largeIconTypeItemProvider == null) {
-			largeIconTypeItemProvider = new LargeIconTypeItemProvider(this);
-		}
-
-		return largeIconTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.LifecycleFactoryType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected LifecycleFactoryTypeItemProvider lifecycleFactoryTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.LifecycleFactoryType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createLifecycleFactoryTypeAdapter() {
-		if (lifecycleFactoryTypeItemProvider == null) {
-			lifecycleFactoryTypeItemProvider = new LifecycleFactoryTypeItemProvider(this);
-		}
-
-		return lifecycleFactoryTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.LifecycleType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected LifecycleTypeItemProvider lifecycleTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.LifecycleType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createLifecycleTypeAdapter() {
-		if (lifecycleTypeItemProvider == null) {
-			lifecycleTypeItemProvider = new LifecycleTypeItemProvider(this);
-		}
-
-		return lifecycleTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ListEntriesType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ListEntriesTypeItemProvider listEntriesTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ListEntriesType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createListEntriesTypeAdapter() {
-		if (listEntriesTypeItemProvider == null) {
-			listEntriesTypeItemProvider = new ListEntriesTypeItemProvider(this);
-		}
-
-		return listEntriesTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.LocaleConfigType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected LocaleConfigTypeItemProvider localeConfigTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.LocaleConfigType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createLocaleConfigTypeAdapter() {
-		if (localeConfigTypeItemProvider == null) {
-			localeConfigTypeItemProvider = new LocaleConfigTypeItemProvider(this);
-		}
-
-		return localeConfigTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanClassType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ManagedBeanClassTypeItemProvider managedBeanClassTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanClassType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createManagedBeanClassTypeAdapter() {
-		if (managedBeanClassTypeItemProvider == null) {
-			managedBeanClassTypeItemProvider = new ManagedBeanClassTypeItemProvider(this);
-		}
-
-		return managedBeanClassTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanNameType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ManagedBeanNameTypeItemProvider managedBeanNameTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanNameType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createManagedBeanNameTypeAdapter() {
-		if (managedBeanNameTypeItemProvider == null) {
-			managedBeanNameTypeItemProvider = new ManagedBeanNameTypeItemProvider(this);
-		}
-
-		return managedBeanNameTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanScopeType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ManagedBeanScopeTypeItemProvider managedBeanScopeTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanScopeType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createManagedBeanScopeTypeAdapter() {
-		if (managedBeanScopeTypeItemProvider == null) {
-			managedBeanScopeTypeItemProvider = new ManagedBeanScopeTypeItemProvider(this);
-		}
-
-		return managedBeanScopeTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ManagedBeanTypeItemProvider managedBeanTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createManagedBeanTypeAdapter() {
-		if (managedBeanTypeItemProvider == null) {
-			managedBeanTypeItemProvider = new ManagedBeanTypeItemProvider(this);
-		}
-
-		return managedBeanTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ManagedPropertyTypeItemProvider managedPropertyTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createManagedPropertyTypeAdapter() {
-		if (managedPropertyTypeItemProvider == null) {
-			managedPropertyTypeItemProvider = new ManagedPropertyTypeItemProvider(this);
-		}
-
-		return managedPropertyTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.MapEntriesType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected MapEntriesTypeItemProvider mapEntriesTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.MapEntriesType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createMapEntriesTypeAdapter() {
-		if (mapEntriesTypeItemProvider == null) {
-			mapEntriesTypeItemProvider = new MapEntriesTypeItemProvider(this);
-		}
-
-		return mapEntriesTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.MapEntryType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected MapEntryTypeItemProvider mapEntryTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.MapEntryType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createMapEntryTypeAdapter() {
-		if (mapEntryTypeItemProvider == null) {
-			mapEntryTypeItemProvider = new MapEntryTypeItemProvider(this);
-		}
-
-		return mapEntryTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.MessageBundleType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected MessageBundleTypeItemProvider messageBundleTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.MessageBundleType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createMessageBundleTypeAdapter() {
-		if (messageBundleTypeItemProvider == null) {
-			messageBundleTypeItemProvider = new MessageBundleTypeItemProvider(this);
-		}
-
-		return messageBundleTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.NameType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected NameTypeItemProvider nameTypeItemProvider;
-
-				/**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.NameType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createNameTypeAdapter() {
-		if (nameTypeItemProvider == null) {
-			nameTypeItemProvider = new NameTypeItemProvider(this);
-		}
-
-		return nameTypeItemProvider;
-	}
-
-				/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected NavigationCaseTypeItemProvider navigationCaseTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createNavigationCaseTypeAdapter() {
-		if (navigationCaseTypeItemProvider == null) {
-			navigationCaseTypeItemProvider = new NavigationCaseTypeItemProvider(this);
-		}
-
-		return navigationCaseTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.NavigationHandlerType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected NavigationHandlerTypeItemProvider navigationHandlerTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.NavigationHandlerType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createNavigationHandlerTypeAdapter() {
-		if (navigationHandlerTypeItemProvider == null) {
-			navigationHandlerTypeItemProvider = new NavigationHandlerTypeItemProvider(this);
-		}
-
-		return navigationHandlerTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected NavigationRuleTypeItemProvider navigationRuleTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createNavigationRuleTypeAdapter() {
-		if (navigationRuleTypeItemProvider == null) {
-			navigationRuleTypeItemProvider = new NavigationRuleTypeItemProvider(this);
-		}
-
-		return navigationRuleTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.NullValueType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected NullValueTypeItemProvider nullValueTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.NullValueType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createNullValueTypeAdapter() {
-		if (nullValueTypeItemProvider == null) {
-			nullValueTypeItemProvider = new NullValueTypeItemProvider(this);
-		}
-
-		return nullValueTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.OrderingType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected OrderingTypeItemProvider orderingTypeItemProvider;
-
-				/**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.OrderingType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createOrderingTypeAdapter() {
-		if (orderingTypeItemProvider == null) {
-			orderingTypeItemProvider = new OrderingTypeItemProvider(this);
-		}
-
-		return orderingTypeItemProvider;
-	}
-
-				/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.OrderingOrderingType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected OrderingOrderingTypeItemProvider orderingOrderingTypeItemProvider;
-
-				/**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.OrderingOrderingType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createOrderingOrderingTypeAdapter() {
-		if (orderingOrderingTypeItemProvider == null) {
-			orderingOrderingTypeItemProvider = new OrderingOrderingTypeItemProvider(this);
-		}
-
-		return orderingOrderingTypeItemProvider;
-	}
-
-				/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.OrderingOthersType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected OrderingOthersTypeItemProvider orderingOthersTypeItemProvider;
-
-				/**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.OrderingOthersType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createOrderingOthersTypeAdapter() {
-		if (orderingOthersTypeItemProvider == null) {
-			orderingOthersTypeItemProvider = new OrderingOthersTypeItemProvider(this);
-		}
-
-		return orderingOthersTypeItemProvider;
-	}
-
-				/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.PartialViewContextFactoryType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected PartialViewContextFactoryTypeItemProvider partialViewContextFactoryTypeItemProvider;
-
-				/**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.PartialViewContextFactoryType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createPartialViewContextFactoryTypeAdapter() {
-		if (partialViewContextFactoryTypeItemProvider == null) {
-			partialViewContextFactoryTypeItemProvider = new PartialViewContextFactoryTypeItemProvider(this);
-		}
-
-		return partialViewContextFactoryTypeItemProvider;
-	}
-
-				/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.PhaseListenerType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected PhaseListenerTypeItemProvider phaseListenerTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.PhaseListenerType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createPhaseListenerTypeAdapter() {
-		if (phaseListenerTypeItemProvider == null) {
-			phaseListenerTypeItemProvider = new PhaseListenerTypeItemProvider(this);
-		}
-
-		return phaseListenerTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.PropertyClassType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected PropertyClassTypeItemProvider propertyClassTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.PropertyClassType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createPropertyClassTypeAdapter() {
-		if (propertyClassTypeItemProvider == null) {
-			propertyClassTypeItemProvider = new PropertyClassTypeItemProvider(this);
-		}
-
-		return propertyClassTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.PropertyExtensionType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected PropertyExtensionTypeItemProvider propertyExtensionTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.PropertyExtensionType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createPropertyExtensionTypeAdapter() {
-		if (propertyExtensionTypeItemProvider == null) {
-			propertyExtensionTypeItemProvider = new PropertyExtensionTypeItemProvider(this);
-		}
-
-		return propertyExtensionTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.PropertyNameType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected PropertyNameTypeItemProvider propertyNameTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.PropertyNameType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createPropertyNameTypeAdapter() {
-		if (propertyNameTypeItemProvider == null) {
-			propertyNameTypeItemProvider = new PropertyNameTypeItemProvider(this);
-		}
-
-		return propertyNameTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.PropertyResolverType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected PropertyResolverTypeItemProvider propertyResolverTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.PropertyResolverType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createPropertyResolverTypeAdapter() {
-		if (propertyResolverTypeItemProvider == null) {
-			propertyResolverTypeItemProvider = new PropertyResolverTypeItemProvider(this);
-		}
-
-		return propertyResolverTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.PropertyType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected PropertyTypeItemProvider propertyTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.PropertyType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createPropertyTypeAdapter() {
-		if (propertyTypeItemProvider == null) {
-			propertyTypeItemProvider = new PropertyTypeItemProvider(this);
-		}
-
-		return propertyTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.RedirectType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected RedirectTypeItemProvider redirectTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.RedirectType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createRedirectTypeAdapter() {
-		if (redirectTypeItemProvider == null) {
-			redirectTypeItemProvider = new RedirectTypeItemProvider(this);
-		}
-
-		return redirectTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.RedirectViewParamType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected RedirectViewParamTypeItemProvider redirectViewParamTypeItemProvider;
-
-				/**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.RedirectViewParamType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createRedirectViewParamTypeAdapter() {
-		if (redirectViewParamTypeItemProvider == null) {
-			redirectViewParamTypeItemProvider = new RedirectViewParamTypeItemProvider(this);
-		}
-
-		return redirectViewParamTypeItemProvider;
-	}
-
-				/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanClassType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ReferencedBeanClassTypeItemProvider referencedBeanClassTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanClassType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createReferencedBeanClassTypeAdapter() {
-		if (referencedBeanClassTypeItemProvider == null) {
-			referencedBeanClassTypeItemProvider = new ReferencedBeanClassTypeItemProvider(this);
-		}
-
-		return referencedBeanClassTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanNameType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ReferencedBeanNameTypeItemProvider referencedBeanNameTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanNameType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createReferencedBeanNameTypeAdapter() {
-		if (referencedBeanNameTypeItemProvider == null) {
-			referencedBeanNameTypeItemProvider = new ReferencedBeanNameTypeItemProvider(this);
-		}
-
-		return referencedBeanNameTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ReferencedBeanTypeItemProvider referencedBeanTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createReferencedBeanTypeAdapter() {
-		if (referencedBeanTypeItemProvider == null) {
-			referencedBeanTypeItemProvider = new ReferencedBeanTypeItemProvider(this);
-		}
-
-		return referencedBeanTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.RendererClassType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected RendererClassTypeItemProvider rendererClassTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.RendererClassType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createRendererClassTypeAdapter() {
-		if (rendererClassTypeItemProvider == null) {
-			rendererClassTypeItemProvider = new RendererClassTypeItemProvider(this);
-		}
-
-		return rendererClassTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.RendererExtensionType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected RendererExtensionTypeItemProvider rendererExtensionTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.RendererExtensionType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createRendererExtensionTypeAdapter() {
-		if (rendererExtensionTypeItemProvider == null) {
-			rendererExtensionTypeItemProvider = new RendererExtensionTypeItemProvider(this);
-		}
-
-		return rendererExtensionTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.RendererType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected RendererTypeItemProvider rendererTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.RendererType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createRendererTypeAdapter() {
-		if (rendererTypeItemProvider == null) {
-			rendererTypeItemProvider = new RendererTypeItemProvider(this);
-		}
-
-		return rendererTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.RendererTypeType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected RendererTypeTypeItemProvider rendererTypeTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.RendererTypeType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createRendererTypeTypeAdapter() {
-		if (rendererTypeTypeItemProvider == null) {
-			rendererTypeTypeItemProvider = new RendererTypeTypeItemProvider(this);
-		}
-
-		return rendererTypeTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitClassType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected RenderKitClassTypeItemProvider renderKitClassTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitClassType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createRenderKitClassTypeAdapter() {
-		if (renderKitClassTypeItemProvider == null) {
-			renderKitClassTypeItemProvider = new RenderKitClassTypeItemProvider(this);
-		}
-
-		return renderKitClassTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitFactoryType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected RenderKitFactoryTypeItemProvider renderKitFactoryTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitFactoryType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createRenderKitFactoryTypeAdapter() {
-		if (renderKitFactoryTypeItemProvider == null) {
-			renderKitFactoryTypeItemProvider = new RenderKitFactoryTypeItemProvider(this);
-		}
-
-		return renderKitFactoryTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitIdType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected RenderKitIdTypeItemProvider renderKitIdTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitIdType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createRenderKitIdTypeAdapter() {
-		if (renderKitIdTypeItemProvider == null) {
-			renderKitIdTypeItemProvider = new RenderKitIdTypeItemProvider(this);
-		}
-
-		return renderKitIdTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected RenderKitTypeItemProvider renderKitTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createRenderKitTypeAdapter() {
-		if (renderKitTypeItemProvider == null) {
-			renderKitTypeItemProvider = new RenderKitTypeItemProvider(this);
-		}
-
-		return renderKitTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.SmallIconType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected SmallIconTypeItemProvider smallIconTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.SmallIconType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createSmallIconTypeAdapter() {
-		if (smallIconTypeItemProvider == null) {
-			smallIconTypeItemProvider = new SmallIconTypeItemProvider(this);
-		}
-
-		return smallIconTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.SourceClassType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected SourceClassTypeItemProvider sourceClassTypeItemProvider;
-
-				/**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.SourceClassType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createSourceClassTypeAdapter() {
-		if (sourceClassTypeItemProvider == null) {
-			sourceClassTypeItemProvider = new SourceClassTypeItemProvider(this);
-		}
-
-		return sourceClassTypeItemProvider;
-	}
-
-				/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.StateManagerType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected StateManagerTypeItemProvider stateManagerTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.StateManagerType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createStateManagerTypeAdapter() {
-		if (stateManagerTypeItemProvider == null) {
-			stateManagerTypeItemProvider = new StateManagerTypeItemProvider(this);
-		}
-
-		return stateManagerTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.SuggestedValueType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected SuggestedValueTypeItemProvider suggestedValueTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.SuggestedValueType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createSuggestedValueTypeAdapter() {
-		if (suggestedValueTypeItemProvider == null) {
-			suggestedValueTypeItemProvider = new SuggestedValueTypeItemProvider(this);
-		}
-
-		return suggestedValueTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.SupportedLocaleType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected SupportedLocaleTypeItemProvider supportedLocaleTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.SupportedLocaleType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createSupportedLocaleTypeAdapter() {
-		if (supportedLocaleTypeItemProvider == null) {
-			supportedLocaleTypeItemProvider = new SupportedLocaleTypeItemProvider(this);
-		}
-
-		return supportedLocaleTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.SystemEventClassType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected SystemEventClassTypeItemProvider systemEventClassTypeItemProvider;
-
-				/**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.SystemEventClassType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createSystemEventClassTypeAdapter() {
-		if (systemEventClassTypeItemProvider == null) {
-			systemEventClassTypeItemProvider = new SystemEventClassTypeItemProvider(this);
-		}
-
-		return systemEventClassTypeItemProvider;
-	}
-
-				/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.SystemEventListenerClassType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected SystemEventListenerClassTypeItemProvider systemEventListenerClassTypeItemProvider;
-
-				/**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.SystemEventListenerClassType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createSystemEventListenerClassTypeAdapter() {
-		if (systemEventListenerClassTypeItemProvider == null) {
-			systemEventListenerClassTypeItemProvider = new SystemEventListenerClassTypeItemProvider(this);
-		}
-
-		return systemEventListenerClassTypeItemProvider;
-	}
-
-				/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.SystemEventListenerType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected SystemEventListenerTypeItemProvider systemEventListenerTypeItemProvider;
-
-				/**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.SystemEventListenerType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createSystemEventListenerTypeAdapter() {
-		if (systemEventListenerTypeItemProvider == null) {
-			systemEventListenerTypeItemProvider = new SystemEventListenerTypeItemProvider(this);
-		}
-
-		return systemEventListenerTypeItemProvider;
-	}
-
-				/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.TagHandlerDelegateFactoryType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected TagHandlerDelegateFactoryTypeItemProvider tagHandlerDelegateFactoryTypeItemProvider;
-
-				/**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.TagHandlerDelegateFactoryType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createTagHandlerDelegateFactoryTypeAdapter() {
-		if (tagHandlerDelegateFactoryTypeItemProvider == null) {
-			tagHandlerDelegateFactoryTypeItemProvider = new TagHandlerDelegateFactoryTypeItemProvider(this);
-		}
-
-		return tagHandlerDelegateFactoryTypeItemProvider;
-	}
-
-				/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ToViewIdType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ToViewIdTypeItemProvider toViewIdTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ToViewIdType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createToViewIdTypeAdapter() {
-		if (toViewIdTypeItemProvider == null) {
-			toViewIdTypeItemProvider = new ToViewIdTypeItemProvider(this);
-		}
-
-		return toViewIdTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorClassType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ValidatorClassTypeItemProvider validatorClassTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorClassType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createValidatorClassTypeAdapter() {
-		if (validatorClassTypeItemProvider == null) {
-			validatorClassTypeItemProvider = new ValidatorClassTypeItemProvider(this);
-		}
-
-		return validatorClassTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorIdType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ValidatorIdTypeItemProvider validatorIdTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorIdType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createValidatorIdTypeAdapter() {
-		if (validatorIdTypeItemProvider == null) {
-			validatorIdTypeItemProvider = new ValidatorIdTypeItemProvider(this);
-		}
-
-		return validatorIdTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ValidatorTypeItemProvider validatorTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createValidatorTypeAdapter() {
-		if (validatorTypeItemProvider == null) {
-			validatorTypeItemProvider = new ValidatorTypeItemProvider(this);
-		}
-
-		return validatorTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ValueClassType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ValueClassTypeItemProvider valueClassTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ValueClassType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createValueClassTypeAdapter() {
-		if (valueClassTypeItemProvider == null) {
-			valueClassTypeItemProvider = new ValueClassTypeItemProvider(this);
-		}
-
-		return valueClassTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ValueType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ValueTypeItemProvider valueTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ValueType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createValueTypeAdapter() {
-		if (valueTypeItemProvider == null) {
-			valueTypeItemProvider = new ValueTypeItemProvider(this);
-		}
-
-		return valueTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.VariableResolverType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected VariableResolverTypeItemProvider variableResolverTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.VariableResolverType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createVariableResolverTypeAdapter() {
-		if (variableResolverTypeItemProvider == null) {
-			variableResolverTypeItemProvider = new VariableResolverTypeItemProvider(this);
-		}
-
-		return variableResolverTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ViewHandlerType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ViewHandlerTypeItemProvider viewHandlerTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ViewHandlerType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createViewHandlerTypeAdapter() {
-		if (viewHandlerTypeItemProvider == null) {
-			viewHandlerTypeItemProvider = new ViewHandlerTypeItemProvider(this);
-		}
-
-		return viewHandlerTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationExtensionType} instances.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected ApplicationExtensionTypeItemProvider applicationExtensionTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationExtensionType}.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Adapter createApplicationExtensionTypeAdapter() {
-		if (applicationExtensionTypeItemProvider == null) {
-			applicationExtensionTypeItemProvider = new ApplicationExtensionTypeItemProvider(this);
-		}
-
-		return applicationExtensionTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ConverterExtensionType} instances.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected ConverterExtensionTypeItemProvider converterExtensionTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ConverterExtensionType}.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Adapter createConverterExtensionTypeAdapter() {
-		if (converterExtensionTypeItemProvider == null) {
-			converterExtensionTypeItemProvider = new ConverterExtensionTypeItemProvider(this);
-		}
-
-		return converterExtensionTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ResourceBundleType} instances.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected ResourceBundleTypeItemProvider resourceBundleTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ResourceBundleType}.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Adapter createResourceBundleTypeAdapter() {
-		if (resourceBundleTypeItemProvider == null) {
-			resourceBundleTypeItemProvider = new ResourceBundleTypeItemProvider(this);
-		}
-
-		return resourceBundleTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.BaseNameType} instances.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected BaseNameTypeItemProvider baseNameTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.BaseNameType}.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Adapter createBaseNameTypeAdapter() {
-		if (baseNameTypeItemProvider == null) {
-			baseNameTypeItemProvider = new BaseNameTypeItemProvider(this);
-		}
-
-		return baseNameTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.VarType} instances.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected VarTypeItemProvider varTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.VarType}.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Adapter createVarTypeAdapter() {
-		if (varTypeItemProvider == null) {
-			varTypeItemProvider = new VarTypeItemProvider(this);
-		}
-
-		return varTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ViewDeclarationLanguageFactoryType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ViewDeclarationLanguageFactoryTypeItemProvider viewDeclarationLanguageFactoryTypeItemProvider;
-
-				/**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ViewDeclarationLanguageFactoryType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createViewDeclarationLanguageFactoryTypeAdapter() {
-		if (viewDeclarationLanguageFactoryTypeItemProvider == null) {
-			viewDeclarationLanguageFactoryTypeItemProvider = new ViewDeclarationLanguageFactoryTypeItemProvider(this);
-		}
-
-		return viewDeclarationLanguageFactoryTypeItemProvider;
-	}
-
-				/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.VisitContextFactoryType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected VisitContextFactoryTypeItemProvider visitContextFactoryTypeItemProvider;
-
-				/**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.VisitContextFactoryType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createVisitContextFactoryTypeAdapter() {
-		if (visitContextFactoryTypeItemProvider == null) {
-			visitContextFactoryTypeItemProvider = new VisitContextFactoryTypeItemProvider(this);
-		}
-
-		return visitContextFactoryTypeItemProvider;
-	}
-
-				/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitExtensionType} instances.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected RenderKitExtensionTypeItemProvider renderKitExtensionTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitExtensionType}.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Adapter createRenderKitExtensionTypeAdapter() {
-		if (renderKitExtensionTypeItemProvider == null) {
-			renderKitExtensionTypeItemProvider = new RenderKitExtensionTypeItemProvider(this);
-		}
-
-		return renderKitExtensionTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ResourceHandlerType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ResourceHandlerTypeItemProvider resourceHandlerTypeItemProvider;
-
-				/**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ResourceHandlerType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createResourceHandlerTypeAdapter() {
-		if (resourceHandlerTypeItemProvider == null) {
-			resourceHandlerTypeItemProvider = new ResourceHandlerTypeItemProvider(this);
-		}
-
-		return resourceHandlerTypeItemProvider;
-	}
-
-				/**
-	 * This returns the root adapter factory that contains this factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ComposeableAdapterFactory getRootAdapterFactory() {
-		return parentAdapterFactory == null ? this : parentAdapterFactory.getRootAdapterFactory();
-	}
-
-    /**
-	 * This sets the composed adapter factory that contains this factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setParentAdapterFactory(ComposedAdapterFactory parentAdapterFactory) {
-		this.parentAdapterFactory = parentAdapterFactory;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isFactoryForType(Object type) {
-		return supportedTypes.contains(type) || super.isFactoryForType(type);
-	}
-
-    /**
-	 * This implementation substitutes the factory itself as the key for the adapter.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter adapt(Notifier notifier, Object type) {
-		return super.adapt(notifier, this);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object adapt(Object object, Object type) {
-		if (isFactoryForType(type)) {
-			Object adapter = super.adapt(object, type);
-			if (!(type instanceof Class) || (((Class)type).isInstance(adapter))) {
-				return adapter;
-			}
-		}
-
-		return null;
-	}
-
-    /**
-	 * This adds a listener.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void addListener(INotifyChangedListener notifyChangedListener) {
-		changeNotifier.addListener(notifyChangedListener);
-	}
-
-    /**
-	 * This removes a listener.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void removeListener(INotifyChangedListener notifyChangedListener) {
-		changeNotifier.removeListener(notifyChangedListener);
-	}
-
-    /**
-	 * This delegates to {@link #changeNotifier} and to {@link #parentAdapterFactory}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void fireNotifyChanged(Notification notification) {
-		changeNotifier.fireNotifyChanged(notification);
-
-		if (parentAdapterFactory != null) {
-			parentAdapterFactory.fireNotifyChanged(notification);
-		}
-	}
-
-    /**
-	 * This disposes all of the item providers created by this factory. 
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void dispose() {
-		if (absoluteOrderingTypeItemProvider != null) absoluteOrderingTypeItemProvider.dispose();
-		if (actionListenerTypeItemProvider != null) actionListenerTypeItemProvider.dispose();
-		if (applicationFactoryTypeItemProvider != null) applicationFactoryTypeItemProvider.dispose();
-		if (applicationTypeItemProvider != null) applicationTypeItemProvider.dispose();
-		if (applicationExtensionTypeItemProvider != null) applicationExtensionTypeItemProvider.dispose();
-		if (attributeClassTypeItemProvider != null) attributeClassTypeItemProvider.dispose();
-		if (attributeExtensionTypeItemProvider != null) attributeExtensionTypeItemProvider.dispose();
-		if (attributeNameTypeItemProvider != null) attributeNameTypeItemProvider.dispose();
-		if (attributeTypeItemProvider != null) attributeTypeItemProvider.dispose();
-		if (behaviorClassTypeItemProvider != null) behaviorClassTypeItemProvider.dispose();
-		if (behaviorIdTypeItemProvider != null) behaviorIdTypeItemProvider.dispose();
-		if (behaviorTypeItemProvider != null) behaviorTypeItemProvider.dispose();
-		if (behaviorExtensionTypeItemProvider != null) behaviorExtensionTypeItemProvider.dispose();
-		if (clientBehaviorRendererClassTypeItemProvider != null) clientBehaviorRendererClassTypeItemProvider.dispose();
-		if (clientBehaviorRendererTypeItemProvider != null) clientBehaviorRendererTypeItemProvider.dispose();
-		if (clientBehaviorRendererTypeTypeItemProvider != null) clientBehaviorRendererTypeTypeItemProvider.dispose();
-		if (componentClassTypeItemProvider != null) componentClassTypeItemProvider.dispose();
-		if (componentExtensionTypeItemProvider != null) componentExtensionTypeItemProvider.dispose();
-		if (componentFamilyTypeItemProvider != null) componentFamilyTypeItemProvider.dispose();
-		if (componentTypeItemProvider != null) componentTypeItemProvider.dispose();
-		if (componentTypeTypeItemProvider != null) componentTypeTypeItemProvider.dispose();
-		if (converterClassTypeItemProvider != null) converterClassTypeItemProvider.dispose();
-		if (converterForClassTypeItemProvider != null) converterForClassTypeItemProvider.dispose();
-		if (converterIdTypeItemProvider != null) converterIdTypeItemProvider.dispose();
-		if (converterTypeItemProvider != null) converterTypeItemProvider.dispose();
-		if (converterExtensionTypeItemProvider != null) converterExtensionTypeItemProvider.dispose();
-		if (defaultLocaleTypeItemProvider != null) defaultLocaleTypeItemProvider.dispose();
-		if (defaultRenderKitIdTypeItemProvider != null) defaultRenderKitIdTypeItemProvider.dispose();
-		if (defaultValidatorsTypeItemProvider != null) defaultValidatorsTypeItemProvider.dispose();
-		if (defaultValueTypeItemProvider != null) defaultValueTypeItemProvider.dispose();
-		if (descriptionTypeItemProvider != null) descriptionTypeItemProvider.dispose();
-		if (displayNameTypeItemProvider != null) displayNameTypeItemProvider.dispose();
-		if (documentRootItemProvider != null) documentRootItemProvider.dispose();
-		if (dynamicAttributeItemProvider != null) dynamicAttributeItemProvider.dispose();
-		if (dynamicElementItemProvider != null) dynamicElementItemProvider.dispose();
-		if (elResolverTypeItemProvider != null) elResolverTypeItemProvider.dispose();
-		if (exceptionHandlerFactoryTypeItemProvider != null) exceptionHandlerFactoryTypeItemProvider.dispose();
-		if (externalContextFactoryTypeItemProvider != null) externalContextFactoryTypeItemProvider.dispose();
-		if (facesConfigTypeItemProvider != null) facesConfigTypeItemProvider.dispose();
-		if (facesConfigExtensionTypeItemProvider != null) facesConfigExtensionTypeItemProvider.dispose();
-		if (facesContextFactoryTypeItemProvider != null) facesContextFactoryTypeItemProvider.dispose();
-		if (facetExtensionTypeItemProvider != null) facetExtensionTypeItemProvider.dispose();
-		if (facetNameTypeItemProvider != null) facetNameTypeItemProvider.dispose();
-		if (facetTypeItemProvider != null) facetTypeItemProvider.dispose();
-		if (factoryTypeItemProvider != null) factoryTypeItemProvider.dispose();
-		if (factoryExtensionTypeItemProvider != null) factoryExtensionTypeItemProvider.dispose();
-		if (fromActionTypeItemProvider != null) fromActionTypeItemProvider.dispose();
-		if (fromOutcomeTypeItemProvider != null) fromOutcomeTypeItemProvider.dispose();
-		if (fromViewIdTypeItemProvider != null) fromViewIdTypeItemProvider.dispose();
-		if (iconTypeItemProvider != null) iconTypeItemProvider.dispose();
-		if (ifTypeItemProvider != null) ifTypeItemProvider.dispose();
-		if (keyClassTypeItemProvider != null) keyClassTypeItemProvider.dispose();
-		if (keyTypeItemProvider != null) keyTypeItemProvider.dispose();
-		if (largeIconTypeItemProvider != null) largeIconTypeItemProvider.dispose();
-		if (lifecycleFactoryTypeItemProvider != null) lifecycleFactoryTypeItemProvider.dispose();
-		if (lifecycleTypeItemProvider != null) lifecycleTypeItemProvider.dispose();
-		if (lifecycleExtensionTypeItemProvider != null) lifecycleExtensionTypeItemProvider.dispose();
-		if (listEntriesTypeItemProvider != null) listEntriesTypeItemProvider.dispose();
-		if (localeConfigTypeItemProvider != null) localeConfigTypeItemProvider.dispose();
-		if (managedBeanClassTypeItemProvider != null) managedBeanClassTypeItemProvider.dispose();
-		if (managedBeanNameTypeItemProvider != null) managedBeanNameTypeItemProvider.dispose();
-		if (managedBeanScopeTypeItemProvider != null) managedBeanScopeTypeItemProvider.dispose();
-		if (managedBeanTypeItemProvider != null) managedBeanTypeItemProvider.dispose();
-		if (managedBeanExtensionTypeItemProvider != null) managedBeanExtensionTypeItemProvider.dispose();
-		if (managedPropertyTypeItemProvider != null) managedPropertyTypeItemProvider.dispose();
-		if (mapEntriesTypeItemProvider != null) mapEntriesTypeItemProvider.dispose();
-		if (mapEntryTypeItemProvider != null) mapEntryTypeItemProvider.dispose();
-		if (messageBundleTypeItemProvider != null) messageBundleTypeItemProvider.dispose();
-		if (nameTypeItemProvider != null) nameTypeItemProvider.dispose();
-		if (navigationCaseTypeItemProvider != null) navigationCaseTypeItemProvider.dispose();
-		if (navigationHandlerTypeItemProvider != null) navigationHandlerTypeItemProvider.dispose();
-		if (navigationRuleTypeItemProvider != null) navigationRuleTypeItemProvider.dispose();
-		if (navigationRuleExtensionTypeItemProvider != null) navigationRuleExtensionTypeItemProvider.dispose();
-		if (nullValueTypeItemProvider != null) nullValueTypeItemProvider.dispose();
-		if (orderingTypeItemProvider != null) orderingTypeItemProvider.dispose();
-		if (orderingOrderingTypeItemProvider != null) orderingOrderingTypeItemProvider.dispose();
-		if (orderingOthersTypeItemProvider != null) orderingOthersTypeItemProvider.dispose();
-		if (partialViewContextFactoryTypeItemProvider != null) partialViewContextFactoryTypeItemProvider.dispose();
-		if (phaseListenerTypeItemProvider != null) phaseListenerTypeItemProvider.dispose();
-		if (propertyClassTypeItemProvider != null) propertyClassTypeItemProvider.dispose();
-		if (propertyExtensionTypeItemProvider != null) propertyExtensionTypeItemProvider.dispose();
-		if (propertyNameTypeItemProvider != null) propertyNameTypeItemProvider.dispose();
-		if (propertyResolverTypeItemProvider != null) propertyResolverTypeItemProvider.dispose();
-		if (propertyTypeItemProvider != null) propertyTypeItemProvider.dispose();
-		if (redirectTypeItemProvider != null) redirectTypeItemProvider.dispose();
-		if (redirectViewParamTypeItemProvider != null) redirectViewParamTypeItemProvider.dispose();
-		if (referencedBeanClassTypeItemProvider != null) referencedBeanClassTypeItemProvider.dispose();
-		if (referencedBeanNameTypeItemProvider != null) referencedBeanNameTypeItemProvider.dispose();
-		if (referencedBeanTypeItemProvider != null) referencedBeanTypeItemProvider.dispose();
-		if (rendererClassTypeItemProvider != null) rendererClassTypeItemProvider.dispose();
-		if (rendererExtensionTypeItemProvider != null) rendererExtensionTypeItemProvider.dispose();
-		if (rendererTypeItemProvider != null) rendererTypeItemProvider.dispose();
-		if (rendererTypeTypeItemProvider != null) rendererTypeTypeItemProvider.dispose();
-		if (renderKitClassTypeItemProvider != null) renderKitClassTypeItemProvider.dispose();
-		if (renderKitFactoryTypeItemProvider != null) renderKitFactoryTypeItemProvider.dispose();
-		if (renderKitIdTypeItemProvider != null) renderKitIdTypeItemProvider.dispose();
-		if (renderKitTypeItemProvider != null) renderKitTypeItemProvider.dispose();
-		if (renderKitExtensionTypeItemProvider != null) renderKitExtensionTypeItemProvider.dispose();
-		if (resourceHandlerTypeItemProvider != null) resourceHandlerTypeItemProvider.dispose();
-		if (smallIconTypeItemProvider != null) smallIconTypeItemProvider.dispose();
-		if (sourceClassTypeItemProvider != null) sourceClassTypeItemProvider.dispose();
-		if (stateManagerTypeItemProvider != null) stateManagerTypeItemProvider.dispose();
-		if (suggestedValueTypeItemProvider != null) suggestedValueTypeItemProvider.dispose();
-		if (supportedLocaleTypeItemProvider != null) supportedLocaleTypeItemProvider.dispose();
-		if (systemEventClassTypeItemProvider != null) systemEventClassTypeItemProvider.dispose();
-		if (systemEventListenerClassTypeItemProvider != null) systemEventListenerClassTypeItemProvider.dispose();
-		if (systemEventListenerTypeItemProvider != null) systemEventListenerTypeItemProvider.dispose();
-		if (tagHandlerDelegateFactoryTypeItemProvider != null) tagHandlerDelegateFactoryTypeItemProvider.dispose();
-		if (toViewIdTypeItemProvider != null) toViewIdTypeItemProvider.dispose();
-		if (validatorClassTypeItemProvider != null) validatorClassTypeItemProvider.dispose();
-		if (validatorIdTypeItemProvider != null) validatorIdTypeItemProvider.dispose();
-		if (validatorTypeItemProvider != null) validatorTypeItemProvider.dispose();
-		if (validatorExtensionTypeItemProvider != null) validatorExtensionTypeItemProvider.dispose();
-		if (valueClassTypeItemProvider != null) valueClassTypeItemProvider.dispose();
-		if (valueTypeItemProvider != null) valueTypeItemProvider.dispose();
-		if (variableResolverTypeItemProvider != null) variableResolverTypeItemProvider.dispose();
-		if (viewHandlerTypeItemProvider != null) viewHandlerTypeItemProvider.dispose();
-		if (resourceBundleTypeItemProvider != null) resourceBundleTypeItemProvider.dispose();
-		if (baseNameTypeItemProvider != null) baseNameTypeItemProvider.dispose();
-		if (varTypeItemProvider != null) varTypeItemProvider.dispose();
-		if (viewDeclarationLanguageFactoryTypeItemProvider != null) viewDeclarationLanguageFactoryTypeItemProvider.dispose();
-		if (visitContextFactoryTypeItemProvider != null) visitContextFactoryTypeItemProvider.dispose();
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FacesConfigTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FacesConfigTypeItemProvider.java
deleted file mode 100644
index 6160d6f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FacesConfigTypeItemProvider.java
+++ /dev/null
@@ -1,370 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class FacesConfigTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FacesConfigTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addFacesConfigExtensionPropertyDescriptor(object);
-			addXmlnsPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-			addMetadataCompletePropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Faces Config Extension feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void addFacesConfigExtensionPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_FacesConfigType_facesConfigExtension_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_FacesConfigType_facesConfigExtension_feature", "_UI_FacesConfigType_type"),
-				 FacesConfigPackage.Literals.FACES_CONFIG_TYPE__FACES_CONFIG_EXTENSION,
-				 true,
-				 false,
-				 true,
-				 null,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Xmlns feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addXmlnsPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_FacesConfigType_xmlns_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_FacesConfigType_xmlns_feature", "_UI_FacesConfigType_type"),
-				 FacesConfigPackage.Literals.FACES_CONFIG_TYPE__XMLNS,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_FacesConfigType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_FacesConfigType_id_feature", "_UI_FacesConfigType_type"),
-				 FacesConfigPackage.Literals.FACES_CONFIG_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Metadata Complete feature.
-	 * <!-- begin-user-doc -->
-	 * @param object
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addMetadataCompletePropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_FacesConfigType_metadataComplete_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_FacesConfigType_metadataComplete_feature", "_UI_FacesConfigType_type"),
-				 FacesConfigPackage.Literals.FACES_CONFIG_TYPE__METADATA_COMPLETE,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.BOOLEAN_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-				/**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures.add(FacesConfigPackage.Literals.FACES_CONFIG_TYPE__APPLICATION);
-			childrenFeatures.add(FacesConfigPackage.Literals.FACES_CONFIG_TYPE__ORDERING);
-			childrenFeatures.add(FacesConfigPackage.Literals.FACES_CONFIG_TYPE__ABSOLUTE_ORDERING);
-			childrenFeatures.add(FacesConfigPackage.Literals.FACES_CONFIG_TYPE__FACTORY);
-			childrenFeatures.add(FacesConfigPackage.Literals.FACES_CONFIG_TYPE__COMPONENT);
-			childrenFeatures.add(FacesConfigPackage.Literals.FACES_CONFIG_TYPE__CONVERTER);
-			childrenFeatures.add(FacesConfigPackage.Literals.FACES_CONFIG_TYPE__MANAGED_BEAN);
-			childrenFeatures.add(FacesConfigPackage.Literals.FACES_CONFIG_TYPE__NAME);
-			childrenFeatures.add(FacesConfigPackage.Literals.FACES_CONFIG_TYPE__NAVIGATION_RULE);
-			childrenFeatures.add(FacesConfigPackage.Literals.FACES_CONFIG_TYPE__REFERENCED_BEAN);
-			childrenFeatures.add(FacesConfigPackage.Literals.FACES_CONFIG_TYPE__RENDER_KIT);
-			childrenFeatures.add(FacesConfigPackage.Literals.FACES_CONFIG_TYPE__LIFECYCLE);
-			childrenFeatures.add(FacesConfigPackage.Literals.FACES_CONFIG_TYPE__VALIDATOR);
-			childrenFeatures.add(FacesConfigPackage.Literals.FACES_CONFIG_TYPE__BEHAVIOR);
-		}
-		return childrenFeatures;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-		// Check the type of the specified child object and return the proper feature to use for
-		// adding (see {@link AddCommand}) it as a child.
-
-		return super.getChildFeature(object, child);
-	}
-
-    /**
-	 * This returns FacesConfigType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/FacesConfigType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((FacesConfigType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_FacesConfigType_type") :
-			getString("_UI_FacesConfigType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(FacesConfigType.class)) {
-			case FacesConfigPackage.FACES_CONFIG_TYPE__XMLNS:
-			case FacesConfigPackage.FACES_CONFIG_TYPE__ID:
-			case FacesConfigPackage.FACES_CONFIG_TYPE__METADATA_COMPLETE:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-			case FacesConfigPackage.FACES_CONFIG_TYPE__APPLICATION:
-			case FacesConfigPackage.FACES_CONFIG_TYPE__ORDERING:
-			case FacesConfigPackage.FACES_CONFIG_TYPE__ABSOLUTE_ORDERING:
-			case FacesConfigPackage.FACES_CONFIG_TYPE__FACTORY:
-			case FacesConfigPackage.FACES_CONFIG_TYPE__COMPONENT:
-			case FacesConfigPackage.FACES_CONFIG_TYPE__CONVERTER:
-			case FacesConfigPackage.FACES_CONFIG_TYPE__MANAGED_BEAN:
-			case FacesConfigPackage.FACES_CONFIG_TYPE__NAME:
-			case FacesConfigPackage.FACES_CONFIG_TYPE__NAVIGATION_RULE:
-			case FacesConfigPackage.FACES_CONFIG_TYPE__REFERENCED_BEAN:
-			case FacesConfigPackage.FACES_CONFIG_TYPE__RENDER_KIT:
-			case FacesConfigPackage.FACES_CONFIG_TYPE__LIFECYCLE:
-			case FacesConfigPackage.FACES_CONFIG_TYPE__VALIDATOR:
-			case FacesConfigPackage.FACES_CONFIG_TYPE__BEHAVIOR:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.FACES_CONFIG_TYPE__APPLICATION,
-				 FacesConfigFactory.eINSTANCE.createApplicationType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.FACES_CONFIG_TYPE__ORDERING,
-				 FacesConfigFactory.eINSTANCE.createOrderingType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.FACES_CONFIG_TYPE__ABSOLUTE_ORDERING,
-				 FacesConfigFactory.eINSTANCE.createAbsoluteOrderingType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.FACES_CONFIG_TYPE__FACTORY,
-				 FacesConfigFactory.eINSTANCE.createFactoryType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.FACES_CONFIG_TYPE__COMPONENT,
-				 FacesConfigFactory.eINSTANCE.createComponentType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.FACES_CONFIG_TYPE__CONVERTER,
-				 FacesConfigFactory.eINSTANCE.createConverterType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.FACES_CONFIG_TYPE__MANAGED_BEAN,
-				 FacesConfigFactory.eINSTANCE.createManagedBeanType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.FACES_CONFIG_TYPE__NAME,
-				 FacesConfigFactory.eINSTANCE.createNameType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.FACES_CONFIG_TYPE__NAVIGATION_RULE,
-				 FacesConfigFactory.eINSTANCE.createNavigationRuleType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.FACES_CONFIG_TYPE__REFERENCED_BEAN,
-				 FacesConfigFactory.eINSTANCE.createReferencedBeanType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.FACES_CONFIG_TYPE__RENDER_KIT,
-				 FacesConfigFactory.eINSTANCE.createRenderKitType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.FACES_CONFIG_TYPE__LIFECYCLE,
-				 FacesConfigFactory.eINSTANCE.createLifecycleType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.FACES_CONFIG_TYPE__VALIDATOR,
-				 FacesConfigFactory.eINSTANCE.createValidatorType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.FACES_CONFIG_TYPE__BEHAVIOR,
-				 FacesConfigFactory.eINSTANCE.createBehaviorType()));
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FacesContextFactoryTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FacesContextFactoryTypeItemProvider.java
deleted file mode 100644
index 2fe6e23..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FacesContextFactoryTypeItemProvider.java
+++ /dev/null
@@ -1,209 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITableItemLabelProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesContextFactoryType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.FacesContextFactoryType} object.
- * <!-- begin-user-doc --> 
- * @extends ITableItemLabelProvider 
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class FacesContextFactoryTypeItemProvider extends ItemProviderAdapter
-		implements IEditingDomainItemProvider, IStructuredItemContentProvider, ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource, ITableItemLabelProvider{
-    /**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc --> 
-	 * @param adapterFactory
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FacesContextFactoryTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc --> 
-	 * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_FacesContextFactoryType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_FacesContextFactoryType_textContent_feature", "_UI_FacesContextFactoryType_type"),
-				 FacesConfigPackage.Literals.FACES_CONTEXT_FACTORY_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc--> 
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_FacesContextFactoryType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_FacesContextFactoryType_id_feature", "_UI_FacesContextFactoryType_type"),
-				 FacesConfigPackage.Literals.FACES_CONTEXT_FACTORY_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns FacesContextFactoryType.gif.
-	 * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/FacesContextFactoryType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String getText(Object object) {
-		String label = ((FacesContextFactoryType) object).getTextContent();
-		return label == null || label.length() == 0 ? getString("_UI_FacesContextFactoryType_type")
-				: label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(FacesContextFactoryType.class)) {
-			case FacesConfigPackage.FACES_CONTEXT_FACTORY_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.FACES_CONTEXT_FACTORY_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnImage(java.lang.Object, int)
-	 */
-	public Object getColumnImage(Object object, int columnIndex) {
-		if(columnIndex ==0)
-			return getImage(object);
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnText(java.lang.Object, int)
-	 */
-	public String getColumnText(Object object, int columnIndex) {
-		switch (columnIndex) {
-
-		case 0:
-			return getText(object);
-		case 1:
-			return getString("_UI_FacesContextFactoryType_type"); //$NON-NLS-1$
-		}
-
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FacetExtensionTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FacetExtensionTypeItemProvider.java
deleted file mode 100644
index 913fa62..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FacetExtensionTypeItemProvider.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.jst.jsf.facesconfig.emf.FacetExtensionType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.FacetExtensionType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class FacetExtensionTypeItemProvider
-	extends ExtensionTypeItemProvider
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@SuppressWarnings("hiding")
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FacetExtensionTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This returns FacetExtensionType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/FacetExtensionType")); //$NON-NLS-1$
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String getText(Object object) {
-		String label = ((FacetExtensionType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_FacetExtensionType_type") : //$NON-NLS-1$
-			getString("_UI_FacetExtensionType_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FacetNameTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FacetNameTypeItemProvider.java
deleted file mode 100644
index a7e1a60..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FacetNameTypeItemProvider.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.FacetNameType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.FacetNameType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class FacetNameTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FacetNameTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_FacetNameType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_FacetNameType_textContent_feature", "_UI_FacetNameType_type"),
-				 FacesConfigPackage.Literals.FACET_NAME_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_FacetNameType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_FacetNameType_id_feature", "_UI_FacetNameType_type"),
-				 FacesConfigPackage.Literals.FACET_NAME_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns FacetNameType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/FacetNameType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((FacetNameType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_FacetNameType_type") :
-			getString("_UI_FacetNameType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(FacetNameType.class)) {
-			case FacesConfigPackage.FACET_NAME_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.FACET_NAME_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FacetTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FacetTypeItemProvider.java
deleted file mode 100644
index d060438..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FacetTypeItemProvider.java
+++ /dev/null
@@ -1,259 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITableItemLabelProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.DescriptionType;
-import org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.FacetType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.FacetType} object.
- * <!-- begin-user-doc -->
- * @extends ITableItemLabelProvider
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class FacetTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource,
-		ITableItemLabelProvider{
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FacetTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_FacetType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_FacetType_id_feature", "_UI_FacetType_type"),
-				 FacesConfigPackage.Literals.FACET_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures.add(FacesConfigPackage.Literals.FACET_TYPE__DESCRIPTION);
-			childrenFeatures.add(FacesConfigPackage.Literals.FACET_TYPE__DISPLAY_NAME);
-			childrenFeatures.add(FacesConfigPackage.Literals.FACET_TYPE__ICON);
-			childrenFeatures.add(FacesConfigPackage.Literals.FACET_TYPE__FACET_NAME);
-			childrenFeatures.add(FacesConfigPackage.Literals.FACET_TYPE__FACET_EXTENSION);
-		}
-		return childrenFeatures;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-		// Check the type of the specified child object and return the proper feature to use for
-		// adding (see {@link AddCommand}) it as a child.
-
-		return super.getChildFeature(object, child);
-	}
-
-    /**
-	 * This returns FacetType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/FacetType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((FacetType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_FacetType_type") :
-			getString("_UI_FacetType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(FacetType.class)) {
-			case FacesConfigPackage.FACET_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-			case FacesConfigPackage.FACET_TYPE__DESCRIPTION:
-			case FacesConfigPackage.FACET_TYPE__DISPLAY_NAME:
-			case FacesConfigPackage.FACET_TYPE__ICON:
-			case FacesConfigPackage.FACET_TYPE__FACET_NAME:
-			case FacesConfigPackage.FACET_TYPE__FACET_EXTENSION:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.FACET_TYPE__DESCRIPTION,
-				 FacesConfigFactory.eINSTANCE.createDescriptionType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.FACET_TYPE__DISPLAY_NAME,
-				 FacesConfigFactory.eINSTANCE.createDisplayNameType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.FACET_TYPE__ICON,
-				 FacesConfigFactory.eINSTANCE.createIconType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.FACET_TYPE__FACET_NAME,
-				 FacesConfigFactory.eINSTANCE.createFacetNameType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.FACET_TYPE__FACET_EXTENSION,
-				 FacesConfigFactory.eINSTANCE.createFacetExtensionType()));
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-	public String getColumnText(Object object, int columnIndex) {
-		FacetType facet = (FacetType) object;
-		switch (columnIndex) {
-
-		case 0:
-			return facet.getFacetName() == null ? "" : facet.getFacetName() //$NON-NLS-1$
-					.getTextContent();
-		case 1:
-			return facet.getDisplayName().size() > 0 ? ((DisplayNameType) facet
-					.getDisplayName().get(0)).getTextContent() : ""; //$NON-NLS-1$
-		case 2:
-			return facet.getDescription().size() > 0 ? ((DescriptionType) facet
-					.getDescription().get(0)).getTextContent() : ""; //$NON-NLS-1$
-		}
-		return null;
-	}
-
-	public Object getColumnImage(Object object, int columnIndex) {
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FactoryExtensionTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FactoryExtensionTypeItemProvider.java
deleted file mode 100644
index 20b75ac..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FactoryExtensionTypeItemProvider.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.jst.jsf.facesconfig.emf.FactoryExtensionType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.FactoryExtensionType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class FactoryExtensionTypeItemProvider
-    extends ExtensionTypeItemProvider
-    implements	
-        IEditingDomainItemProvider,	
-        IStructuredItemContentProvider,	
-        ITreeItemContentProvider,	
-        IItemLabelProvider,	
-        IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    @SuppressWarnings("hiding")
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public FactoryExtensionTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This returns FactoryExtensionType.gif.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-    public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/FactoryExtensionType")); //$NON-NLS-1$
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-    public String getText(Object object) {
-		String label = ((FactoryExtensionType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_FactoryExtensionType_type") : //$NON-NLS-1$
-			getString("_UI_FactoryExtensionType_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FactoryTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FactoryTypeItemProvider.java
deleted file mode 100644
index 3b64b58..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FactoryTypeItemProvider.java
+++ /dev/null
@@ -1,292 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.FactoryType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.FactoryType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class FactoryTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FactoryTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addFactoryExtensionPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Factory Extension feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void addFactoryExtensionPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_FactoryType_factoryExtension_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_FactoryType_factoryExtension_feature", "_UI_FactoryType_type"),
-				 FacesConfigPackage.Literals.FACTORY_TYPE__FACTORY_EXTENSION,
-				 true,
-				 false,
-				 true,
-				 null,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_FactoryType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_FactoryType_id_feature", "_UI_FactoryType_type"),
-				 FacesConfigPackage.Literals.FACTORY_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures.add(FacesConfigPackage.Literals.FACTORY_TYPE__APPLICATION_FACTORY);
-			childrenFeatures.add(FacesConfigPackage.Literals.FACTORY_TYPE__EXCEPTION_HANDLER_FACTORY);
-			childrenFeatures.add(FacesConfigPackage.Literals.FACTORY_TYPE__EXTERNAL_CONTEXT_FACTORY);
-			childrenFeatures.add(FacesConfigPackage.Literals.FACTORY_TYPE__FACES_CONTEXT_FACTORY);
-			childrenFeatures.add(FacesConfigPackage.Literals.FACTORY_TYPE__PARTIAL_VIEW_CONTEXT_FACTORY);
-			childrenFeatures.add(FacesConfigPackage.Literals.FACTORY_TYPE__LIFECYCLE_FACTORY);
-			childrenFeatures.add(FacesConfigPackage.Literals.FACTORY_TYPE__VIEW_DECLARATION_LANGUAGE_FACTORY);
-			childrenFeatures.add(FacesConfigPackage.Literals.FACTORY_TYPE__TAG_HANDLER_DELEGATE_FACTORY);
-			childrenFeatures.add(FacesConfigPackage.Literals.FACTORY_TYPE__RENDER_KIT_FACTORY);
-			childrenFeatures.add(FacesConfigPackage.Literals.FACTORY_TYPE__VISIT_CONTEXT_FACTORY);
-		}
-		return childrenFeatures;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-		// Check the type of the specified child object and return the proper feature to use for
-		// adding (see {@link AddCommand}) it as a child.
-
-		return super.getChildFeature(object, child);
-	}
-
-    /**
-	 * This returns FactoryType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/FactoryType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((FactoryType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_FactoryType_type") :
-			getString("_UI_FactoryType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(FactoryType.class)) {
-			case FacesConfigPackage.FACTORY_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-			case FacesConfigPackage.FACTORY_TYPE__APPLICATION_FACTORY:
-			case FacesConfigPackage.FACTORY_TYPE__EXCEPTION_HANDLER_FACTORY:
-			case FacesConfigPackage.FACTORY_TYPE__EXTERNAL_CONTEXT_FACTORY:
-			case FacesConfigPackage.FACTORY_TYPE__FACES_CONTEXT_FACTORY:
-			case FacesConfigPackage.FACTORY_TYPE__PARTIAL_VIEW_CONTEXT_FACTORY:
-			case FacesConfigPackage.FACTORY_TYPE__LIFECYCLE_FACTORY:
-			case FacesConfigPackage.FACTORY_TYPE__VIEW_DECLARATION_LANGUAGE_FACTORY:
-			case FacesConfigPackage.FACTORY_TYPE__TAG_HANDLER_DELEGATE_FACTORY:
-			case FacesConfigPackage.FACTORY_TYPE__RENDER_KIT_FACTORY:
-			case FacesConfigPackage.FACTORY_TYPE__VISIT_CONTEXT_FACTORY:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.FACTORY_TYPE__APPLICATION_FACTORY,
-				 FacesConfigFactory.eINSTANCE.createApplicationFactoryType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.FACTORY_TYPE__EXCEPTION_HANDLER_FACTORY,
-				 FacesConfigFactory.eINSTANCE.createExceptionHandlerFactoryType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.FACTORY_TYPE__EXTERNAL_CONTEXT_FACTORY,
-				 FacesConfigFactory.eINSTANCE.createExternalContextFactoryType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.FACTORY_TYPE__FACES_CONTEXT_FACTORY,
-				 FacesConfigFactory.eINSTANCE.createFacesContextFactoryType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.FACTORY_TYPE__PARTIAL_VIEW_CONTEXT_FACTORY,
-				 FacesConfigFactory.eINSTANCE.createPartialViewContextFactoryType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.FACTORY_TYPE__LIFECYCLE_FACTORY,
-				 FacesConfigFactory.eINSTANCE.createLifecycleFactoryType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.FACTORY_TYPE__VIEW_DECLARATION_LANGUAGE_FACTORY,
-				 FacesConfigFactory.eINSTANCE.createViewDeclarationLanguageFactoryType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.FACTORY_TYPE__TAG_HANDLER_DELEGATE_FACTORY,
-				 FacesConfigFactory.eINSTANCE.createTagHandlerDelegateFactoryType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.FACTORY_TYPE__RENDER_KIT_FACTORY,
-				 FacesConfigFactory.eINSTANCE.createRenderKitFactoryType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.FACTORY_TYPE__VISIT_CONTEXT_FACTORY,
-				 FacesConfigFactory.eINSTANCE.createVisitContextFactoryType()));
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FromActionTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FromActionTypeItemProvider.java
deleted file mode 100644
index eb0491d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FromActionTypeItemProvider.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.FromActionType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.FromActionType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class FromActionTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FromActionTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_FromActionType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_FromActionType_textContent_feature", "_UI_FromActionType_type"),
-				 FacesConfigPackage.Literals.FROM_ACTION_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_FromActionType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_FromActionType_id_feature", "_UI_FromActionType_type"),
-				 FacesConfigPackage.Literals.FROM_ACTION_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns FromActionType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/FromActionType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((FromActionType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_FromActionType_type") :
-			getString("_UI_FromActionType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(FromActionType.class)) {
-			case FacesConfigPackage.FROM_ACTION_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.FROM_ACTION_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FromOutcomeTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FromOutcomeTypeItemProvider.java
deleted file mode 100644
index 5ec950b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FromOutcomeTypeItemProvider.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.FromOutcomeType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.FromOutcomeType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class FromOutcomeTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FromOutcomeTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_FromOutcomeType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_FromOutcomeType_textContent_feature", "_UI_FromOutcomeType_type"),
-				 FacesConfigPackage.Literals.FROM_OUTCOME_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_FromOutcomeType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_FromOutcomeType_id_feature", "_UI_FromOutcomeType_type"),
-				 FacesConfigPackage.Literals.FROM_OUTCOME_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns FromOutcomeType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/FromOutcomeType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((FromOutcomeType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_FromOutcomeType_type") :
-			getString("_UI_FromOutcomeType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(FromOutcomeType.class)) {
-			case FacesConfigPackage.FROM_OUTCOME_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.FROM_OUTCOME_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FromViewIdTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FromViewIdTypeItemProvider.java
deleted file mode 100644
index 06d9901..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FromViewIdTypeItemProvider.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.FromViewIdType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.FromViewIdType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class FromViewIdTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FromViewIdTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_FromViewIdType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_FromViewIdType_textContent_feature", "_UI_FromViewIdType_type"),
-				 FacesConfigPackage.Literals.FROM_VIEW_ID_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_FromViewIdType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_FromViewIdType_id_feature", "_UI_FromViewIdType_type"),
-				 FacesConfigPackage.Literals.FROM_VIEW_ID_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns FromViewIdType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/FromViewIdType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((FromViewIdType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_FromViewIdType_type") :
-			getString("_UI_FromViewIdType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(FromViewIdType.class)) {
-			case FacesConfigPackage.FROM_VIEW_ID_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.FROM_VIEW_ID_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/IconTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/IconTypeItemProvider.java
deleted file mode 100644
index 0f4ad44..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/IconTypeItemProvider.java
+++ /dev/null
@@ -1,237 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.IconType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.IconType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class IconTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public IconTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addLangPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Lang feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addLangPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_IconType_lang_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_IconType_lang_feature", "_UI_IconType_type"),
-				 FacesConfigPackage.Literals.ICON_TYPE__LANG,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_IconType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_IconType_id_feature", "_UI_IconType_type"),
-				 FacesConfigPackage.Literals.ICON_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures.add(FacesConfigPackage.Literals.ICON_TYPE__SMALL_ICON);
-			childrenFeatures.add(FacesConfigPackage.Literals.ICON_TYPE__LARGE_ICON);
-		}
-		return childrenFeatures;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-		// Check the type of the specified child object and return the proper feature to use for
-		// adding (see {@link AddCommand}) it as a child.
-
-		return super.getChildFeature(object, child);
-	}
-
-				/**
-	 * This returns IconType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/IconType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((IconType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_IconType_type") :
-			getString("_UI_IconType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(IconType.class)) {
-			case FacesConfigPackage.ICON_TYPE__LANG:
-			case FacesConfigPackage.ICON_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-			case FacesConfigPackage.ICON_TYPE__SMALL_ICON:
-			case FacesConfigPackage.ICON_TYPE__LARGE_ICON:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.ICON_TYPE__SMALL_ICON,
-				 FacesConfigFactory.eINSTANCE.createSmallIconType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.ICON_TYPE__LARGE_ICON,
-				 FacesConfigFactory.eINSTANCE.createLargeIconType()));
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/IfTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/IfTypeItemProvider.java
deleted file mode 100644
index 37a725c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/IfTypeItemProvider.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.IfType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.IfType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class IfTypeItemProvider
-	extends ItemProviderAdapter
-	implements
-		IEditingDomainItemProvider,
-		IStructuredItemContentProvider,
-		ITreeItemContentProvider,
-		IItemLabelProvider,
-		IItemPropertySource {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public IfTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-	 * @param object
-	 * <!-- end-user-doc --> 
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_IfType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_IfType_textContent_feature", "_UI_IfType_type"),
-				 FacesConfigPackage.Literals.IF_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-	 * @param object
-	 * <!-- end-user-doc --> 
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_IfType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_IfType_id_feature", "_UI_IfType_type"),
-				 FacesConfigPackage.Literals.IF_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This returns IfType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/IfType"));
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((IfType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_IfType_type") :
-			getString("_UI_IfType_type") + " " + label;
-	}
-
-	/**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(IfType.class)) {
-			case FacesConfigPackage.IF_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.IF_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-	/**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/KeyClassTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/KeyClassTypeItemProvider.java
deleted file mode 100644
index 264b281..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/KeyClassTypeItemProvider.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.KeyClassType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.KeyClassType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class KeyClassTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public KeyClassTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_KeyClassType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_KeyClassType_textContent_feature", "_UI_KeyClassType_type"),
-				 FacesConfigPackage.Literals.KEY_CLASS_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_KeyClassType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_KeyClassType_id_feature", "_UI_KeyClassType_type"),
-				 FacesConfigPackage.Literals.KEY_CLASS_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns KeyClassType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/KeyClassType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((KeyClassType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_KeyClassType_type") :
-			getString("_UI_KeyClassType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(KeyClassType.class)) {
-			case FacesConfigPackage.KEY_CLASS_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.KEY_CLASS_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/KeyTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/KeyTypeItemProvider.java
deleted file mode 100644
index 62c5d35..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/KeyTypeItemProvider.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.KeyType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.KeyType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class KeyTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public KeyTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_KeyType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_KeyType_textContent_feature", "_UI_KeyType_type"),
-				 FacesConfigPackage.Literals.KEY_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_KeyType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_KeyType_id_feature", "_UI_KeyType_type"),
-				 FacesConfigPackage.Literals.KEY_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns KeyType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/KeyType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((KeyType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_KeyType_type") :
-			getString("_UI_KeyType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(KeyType.class)) {
-			case FacesConfigPackage.KEY_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.KEY_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/LargeIconTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/LargeIconTypeItemProvider.java
deleted file mode 100644
index caca793..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/LargeIconTypeItemProvider.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.LargeIconType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.LargeIconType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class LargeIconTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public LargeIconTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_LargeIconType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_LargeIconType_textContent_feature", "_UI_LargeIconType_type"),
-				 FacesConfigPackage.Literals.LARGE_ICON_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_LargeIconType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_LargeIconType_id_feature", "_UI_LargeIconType_type"),
-				 FacesConfigPackage.Literals.LARGE_ICON_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns LargeIconType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/LargeIconType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((LargeIconType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_LargeIconType_type") :
-			getString("_UI_LargeIconType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(LargeIconType.class)) {
-			case FacesConfigPackage.LARGE_ICON_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.LARGE_ICON_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/LifecycleExtensionTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/LifecycleExtensionTypeItemProvider.java
deleted file mode 100644
index fa06c39..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/LifecycleExtensionTypeItemProvider.java
+++ /dev/null
@@ -1,145 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITableItemLabelProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.jst.jsf.facesconfig.emf.LifecycleExtensionType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.LifecycleExtensionType} object.
- * <!-- begin-user-doc -->
- * @extends ITableItemLabelProvider
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class LifecycleExtensionTypeItemProvider
-    extends ExtensionTypeItemProvider
-    implements	
-        IEditingDomainItemProvider,	
-        IStructuredItemContentProvider,	
-        ITreeItemContentProvider,	
-        IItemLabelProvider,	
-        IItemPropertySource,
-        ITableItemLabelProvider{
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    @SuppressWarnings("hiding")
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public LifecycleExtensionTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This returns LifecycleExtensionType.gif.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/LifecycleExtensionType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String getText(Object object) {
-		String label = ((LifecycleExtensionType) object).getTextContent();
-		return label == null || label.length() == 0 ? getString("_UI_LifecycleExtensionType_type")
-				: label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnImage(java.lang.Object, int)
-	 */
-	public Object getColumnImage(Object object, int columnIndex) {
-		// TODO Auto-generated method stub
-		if(columnIndex ==0)
-			return getImage(object);
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnText(java.lang.Object, int)
-	 */
-	public String getColumnText(Object object, int columnIndex) {
-		switch (columnIndex) {
-
-		case 0:
-			return getText(object);
-		case 1:
-			return getString("_UI_LifecycleExtensionType_type"); //$NON-NLS-1$
-		}
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/LifecycleFactoryTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/LifecycleFactoryTypeItemProvider.java
deleted file mode 100644
index 58fbeca..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/LifecycleFactoryTypeItemProvider.java
+++ /dev/null
@@ -1,210 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITableItemLabelProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.LifecycleFactoryType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.LifecycleFactoryType} object.
- * <!-- begin-user-doc --> 
- * @extends ITableItemLabelProvider
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class LifecycleFactoryTypeItemProvider extends ItemProviderAdapter
-		implements IEditingDomainItemProvider, IStructuredItemContentProvider, ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource, ITableItemLabelProvider {
-    /**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!--begin-user-doc --> 
-	 * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public LifecycleFactoryTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc --> 
- 	 * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_LifecycleFactoryType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_LifecycleFactoryType_textContent_feature", "_UI_LifecycleFactoryType_type"),
-				 FacesConfigPackage.Literals.LIFECYCLE_FACTORY_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc --> 
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_LifecycleFactoryType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_LifecycleFactoryType_id_feature", "_UI_LifecycleFactoryType_type"),
-				 FacesConfigPackage.Literals.LIFECYCLE_FACTORY_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns LifecycleFactoryType.gif.
-	 * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/LifecycleFactoryType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String getText(Object object) {
-		String label = ((LifecycleFactoryType) object).getTextContent();
-		return label == null || label.length() == 0 ? getString("_UI_LifecycleFactoryType_type")
-				: label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(LifecycleFactoryType.class)) {
-			case FacesConfigPackage.LIFECYCLE_FACTORY_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.LIFECYCLE_FACTORY_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnImage(java.lang.Object, int)
-	 */
-	public Object getColumnImage(Object object, int columnIndex) {
-		if(columnIndex ==0)
-			return getImage(object);
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnText(java.lang.Object, int)
-	 */
-	public String getColumnText(Object object, int columnIndex) {
-
-		switch (columnIndex) {
-
-			case 0:
-				return getText(object);
-			case 1:
-				return getString("_UI_LifecycleFactoryType_type"); //$NON-NLS-1$
-			}
-
-			return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/LifecycleTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/LifecycleTypeItemProvider.java
deleted file mode 100644
index 611aaf6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/LifecycleTypeItemProvider.java
+++ /dev/null
@@ -1,212 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.LifecycleType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.LifecycleType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class LifecycleTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public LifecycleTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_LifecycleType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_LifecycleType_id_feature", "_UI_LifecycleType_type"),
-				 FacesConfigPackage.Literals.LIFECYCLE_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures.add(FacesConfigPackage.Literals.LIFECYCLE_TYPE__PHASE_LISTENER);
-			childrenFeatures.add(FacesConfigPackage.Literals.LIFECYCLE_TYPE__LIFECYCLE_EXTENSION);
-		}
-		return childrenFeatures;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected EStructuralFeature getChildFeature(Object object, Object child) {
-		// Check the type of the specified child object and return the proper feature to use for
-		// adding (see {@link AddCommand}) it as a child.
-
-		return super.getChildFeature(object, child);
-	}
-
-    /**
-	 * This returns LifecycleType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/LifecycleType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((LifecycleType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_LifecycleType_type") :
-			getString("_UI_LifecycleType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(LifecycleType.class)) {
-			case FacesConfigPackage.LIFECYCLE_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-			case FacesConfigPackage.LIFECYCLE_TYPE__PHASE_LISTENER:
-			case FacesConfigPackage.LIFECYCLE_TYPE__LIFECYCLE_EXTENSION:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.LIFECYCLE_TYPE__PHASE_LISTENER,
-				 FacesConfigFactory.eINSTANCE.createPhaseListenerType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.LIFECYCLE_TYPE__LIFECYCLE_EXTENSION,
-				 FacesConfigFactory.eINSTANCE.createLifecycleExtensionType()));
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ListEntriesTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ListEntriesTypeItemProvider.java
deleted file mode 100644
index b7c6c79..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ListEntriesTypeItemProvider.java
+++ /dev/null
@@ -1,219 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ListEntriesType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ListEntriesType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class ListEntriesTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ListEntriesTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ListEntriesType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ListEntriesType_id_feature", "_UI_ListEntriesType_type"),
-				 FacesConfigPackage.Literals.LIST_ENTRIES_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures.add(FacesConfigPackage.Literals.LIST_ENTRIES_TYPE__VALUE_CLASS);
-			childrenFeatures.add(FacesConfigPackage.Literals.LIST_ENTRIES_TYPE__NULL_VALUE);
-			childrenFeatures.add(FacesConfigPackage.Literals.LIST_ENTRIES_TYPE__VALUE);
-		}
-		return childrenFeatures;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-		// Check the type of the specified child object and return the proper feature to use for
-		// adding (see {@link AddCommand}) it as a child.
-
-		return super.getChildFeature(object, child);
-	}
-
-    /**
-	 * This returns ListEntriesType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/ListEntriesType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((ListEntriesType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_ListEntriesType_type") :
-			getString("_UI_ListEntriesType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(ListEntriesType.class)) {
-			case FacesConfigPackage.LIST_ENTRIES_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-			case FacesConfigPackage.LIST_ENTRIES_TYPE__VALUE_CLASS:
-			case FacesConfigPackage.LIST_ENTRIES_TYPE__NULL_VALUE:
-			case FacesConfigPackage.LIST_ENTRIES_TYPE__VALUE:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.LIST_ENTRIES_TYPE__VALUE_CLASS,
-				 FacesConfigFactory.eINSTANCE.createValueClassType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.LIST_ENTRIES_TYPE__NULL_VALUE,
-				 FacesConfigFactory.eINSTANCE.createNullValueType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.LIST_ENTRIES_TYPE__VALUE,
-				 FacesConfigFactory.eINSTANCE.createValueType()));
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/Literals.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/Literals.java
deleted file mode 100644
index 678a586..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/Literals.java
+++ /dev/null
@@ -1,3595 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EReference;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * Literal package types
- * 
- * @author cbateman
- *
- */
-public interface Literals {
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ActionListenerTypeImpl <em>Action Listener Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ActionListenerTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getActionListenerType()
-	 * @generated
-	 */
-	EClass ACTION_LISTENER_TYPE = FacesConfigPackage.eINSTANCE.getActionListenerType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute ACTION_LISTENER_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getActionListenerType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute ACTION_LISTENER_TYPE__ID = FacesConfigPackage.eINSTANCE.getActionListenerType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ApplicationFactoryTypeImpl <em>Application Factory Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ApplicationFactoryTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getApplicationFactoryType()
-	 * @generated
-	 */
-	EClass APPLICATION_FACTORY_TYPE = FacesConfigPackage.eINSTANCE.getApplicationFactoryType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute APPLICATION_FACTORY_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getApplicationFactoryType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute APPLICATION_FACTORY_TYPE__ID = FacesConfigPackage.eINSTANCE.getApplicationFactoryType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ApplicationTypeImpl <em>Application Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ApplicationTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getApplicationType()
-	 * @generated
-	 */
-	EClass APPLICATION_TYPE = FacesConfigPackage.eINSTANCE.getApplicationType();
-
-	/**
-	 * The meta object literal for the '<em><b>Action Listener</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference APPLICATION_TYPE__ACTION_LISTENER = FacesConfigPackage.eINSTANCE.getApplicationType_ActionListener();
-
-	/**
-	 * The meta object literal for the '<em><b>Default Render Kit Id</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference APPLICATION_TYPE__DEFAULT_RENDER_KIT_ID = FacesConfigPackage.eINSTANCE.getApplicationType_DefaultRenderKitId();
-
-	/**
-	 * The meta object literal for the '<em><b>Message Bundle</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference APPLICATION_TYPE__MESSAGE_BUNDLE = FacesConfigPackage.eINSTANCE.getApplicationType_MessageBundle();
-
-	/**
-	 * The meta object literal for the '<em><b>Navigation Handler</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference APPLICATION_TYPE__NAVIGATION_HANDLER = FacesConfigPackage.eINSTANCE.getApplicationType_NavigationHandler();
-
-	/**
-	 * The meta object literal for the '<em><b>View Handler</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference APPLICATION_TYPE__VIEW_HANDLER = FacesConfigPackage.eINSTANCE.getApplicationType_ViewHandler();
-
-	/**
-	 * The meta object literal for the '<em><b>State Manager</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference APPLICATION_TYPE__STATE_MANAGER = FacesConfigPackage.eINSTANCE.getApplicationType_StateManager();
-
-	/**
-	 * The meta object literal for the '<em><b>Property Resolver</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference APPLICATION_TYPE__PROPERTY_RESOLVER = FacesConfigPackage.eINSTANCE.getApplicationType_PropertyResolver();
-
-	/**
-	 * The meta object literal for the '<em><b>Variable Resolver</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference APPLICATION_TYPE__VARIABLE_RESOLVER = FacesConfigPackage.eINSTANCE.getApplicationType_VariableResolver();
-
-	/**
-	 * The meta object literal for the '<em><b>Locale Config</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference APPLICATION_TYPE__LOCALE_CONFIG = FacesConfigPackage.eINSTANCE.getApplicationType_LocaleConfig();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute APPLICATION_TYPE__ID = FacesConfigPackage.eINSTANCE.getApplicationType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeClassTypeImpl <em>Attribute Class Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeClassTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getAttributeClassType()
-	 * @generated
-	 */
-	EClass ATTRIBUTE_CLASS_TYPE = FacesConfigPackage.eINSTANCE.getAttributeClassType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute ATTRIBUTE_CLASS_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getAttributeClassType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute ATTRIBUTE_CLASS_TYPE__ID = FacesConfigPackage.eINSTANCE.getAttributeClassType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeExtensionTypeImpl <em>Attribute Extension Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeExtensionTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getAttributeExtensionType()
-	 * @generated
-	 */
-	EClass ATTRIBUTE_EXTENSION_TYPE = FacesConfigPackage.eINSTANCE.getAttributeExtensionType();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeNameTypeImpl <em>Attribute Name Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeNameTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getAttributeNameType()
-	 * @generated
-	 */
-	EClass ATTRIBUTE_NAME_TYPE = FacesConfigPackage.eINSTANCE.getAttributeNameType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute ATTRIBUTE_NAME_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getAttributeNameType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute ATTRIBUTE_NAME_TYPE__ID = FacesConfigPackage.eINSTANCE.getAttributeNameType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeTypeImpl <em>Attribute Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getAttributeType()
-	 * @generated
-	 */
-	EClass ATTRIBUTE_TYPE = FacesConfigPackage.eINSTANCE.getAttributeType();
-
-	/**
-	 * The meta object literal for the '<em><b>Description</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference ATTRIBUTE_TYPE__DESCRIPTION = FacesConfigPackage.eINSTANCE.getAttributeType_Description();
-
-	/**
-	 * The meta object literal for the '<em><b>Display Name</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference ATTRIBUTE_TYPE__DISPLAY_NAME = FacesConfigPackage.eINSTANCE.getAttributeType_DisplayName();
-
-	/**
-	 * The meta object literal for the '<em><b>Icon</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference ATTRIBUTE_TYPE__ICON = FacesConfigPackage.eINSTANCE.getAttributeType_Icon();
-
-	/**
-	 * The meta object literal for the '<em><b>Attribute Name</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference ATTRIBUTE_TYPE__ATTRIBUTE_NAME = FacesConfigPackage.eINSTANCE.getAttributeType_AttributeName();
-
-	/**
-	 * The meta object literal for the '<em><b>Attribute Class</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference ATTRIBUTE_TYPE__ATTRIBUTE_CLASS = FacesConfigPackage.eINSTANCE.getAttributeType_AttributeClass();
-
-	/**
-	 * The meta object literal for the '<em><b>Default Value</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference ATTRIBUTE_TYPE__DEFAULT_VALUE = FacesConfigPackage.eINSTANCE.getAttributeType_DefaultValue();
-
-	/**
-	 * The meta object literal for the '<em><b>Suggested Value</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference ATTRIBUTE_TYPE__SUGGESTED_VALUE = FacesConfigPackage.eINSTANCE.getAttributeType_SuggestedValue();
-
-	/**
-	 * The meta object literal for the '<em><b>Attribute Extension</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference ATTRIBUTE_TYPE__ATTRIBUTE_EXTENSION = FacesConfigPackage.eINSTANCE.getAttributeType_AttributeExtension();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute ATTRIBUTE_TYPE__ID = FacesConfigPackage.eINSTANCE.getAttributeType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentClassTypeImpl <em>Component Class Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentClassTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getComponentClassType()
-	 * @generated
-	 */
-	EClass COMPONENT_CLASS_TYPE = FacesConfigPackage.eINSTANCE.getComponentClassType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute COMPONENT_CLASS_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getComponentClassType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute COMPONENT_CLASS_TYPE__ID = FacesConfigPackage.eINSTANCE.getComponentClassType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentExtensionTypeImpl <em>Component Extension Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentExtensionTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getComponentExtensionType()
-	 * @generated
-	 */
-	EClass COMPONENT_EXTENSION_TYPE = FacesConfigPackage.eINSTANCE.getComponentExtensionType();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentFamilyTypeImpl <em>Component Family Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentFamilyTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getComponentFamilyType()
-	 * @generated
-	 */
-	EClass COMPONENT_FAMILY_TYPE = FacesConfigPackage.eINSTANCE.getComponentFamilyType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute COMPONENT_FAMILY_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getComponentFamilyType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute COMPONENT_FAMILY_TYPE__ID = FacesConfigPackage.eINSTANCE.getComponentFamilyType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentTypeImpl <em>Component Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getComponentType()
-	 * @generated
-	 */
-	EClass COMPONENT_TYPE = FacesConfigPackage.eINSTANCE.getComponentType();
-
-	/**
-	 * The meta object literal for the '<em><b>Description</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference COMPONENT_TYPE__DESCRIPTION = FacesConfigPackage.eINSTANCE.getComponentType_Description();
-
-	/**
-	 * The meta object literal for the '<em><b>Display Name</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference COMPONENT_TYPE__DISPLAY_NAME = FacesConfigPackage.eINSTANCE.getComponentType_DisplayName();
-
-	/**
-	 * The meta object literal for the '<em><b>Icon</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference COMPONENT_TYPE__ICON = FacesConfigPackage.eINSTANCE.getComponentType_Icon();
-
-	/**
-	 * The meta object literal for the '<em><b>Component Type</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference COMPONENT_TYPE__COMPONENT_TYPE = FacesConfigPackage.eINSTANCE.getComponentType_ComponentType();
-
-	/**
-	 * The meta object literal for the '<em><b>Component Class</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference COMPONENT_TYPE__COMPONENT_CLASS = FacesConfigPackage.eINSTANCE.getComponentType_ComponentClass();
-
-	/**
-	 * The meta object literal for the '<em><b>Facet</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference COMPONENT_TYPE__FACET = FacesConfigPackage.eINSTANCE.getComponentType_Facet();
-
-	/**
-	 * The meta object literal for the '<em><b>Attribute</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference COMPONENT_TYPE__ATTRIBUTE = FacesConfigPackage.eINSTANCE.getComponentType_Attribute();
-
-	/**
-	 * The meta object literal for the '<em><b>Property</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference COMPONENT_TYPE__PROPERTY = FacesConfigPackage.eINSTANCE.getComponentType_Property();
-
-	/**
-	 * The meta object literal for the '<em><b>Component Extension</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference COMPONENT_TYPE__COMPONENT_EXTENSION = FacesConfigPackage.eINSTANCE.getComponentType_ComponentExtension();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute COMPONENT_TYPE__ID = FacesConfigPackage.eINSTANCE.getComponentType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentTypeTypeImpl <em>Component Type Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentTypeTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getComponentTypeType()
-	 * @generated
-	 */
-	EClass COMPONENT_TYPE_TYPE = FacesConfigPackage.eINSTANCE.getComponentTypeType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute COMPONENT_TYPE_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getComponentTypeType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute COMPONENT_TYPE_TYPE__ID = FacesConfigPackage.eINSTANCE.getComponentTypeType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterClassTypeImpl <em>Converter Class Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterClassTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getConverterClassType()
-	 * @generated
-	 */
-	EClass CONVERTER_CLASS_TYPE = FacesConfigPackage.eINSTANCE.getConverterClassType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute CONVERTER_CLASS_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getConverterClassType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute CONVERTER_CLASS_TYPE__ID = FacesConfigPackage.eINSTANCE.getConverterClassType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterForClassTypeImpl <em>Converter For Class Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterForClassTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getConverterForClassType()
-	 * @generated
-	 */
-	EClass CONVERTER_FOR_CLASS_TYPE = FacesConfigPackage.eINSTANCE.getConverterForClassType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute CONVERTER_FOR_CLASS_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getConverterForClassType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute CONVERTER_FOR_CLASS_TYPE__ID = FacesConfigPackage.eINSTANCE.getConverterForClassType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterIdTypeImpl <em>Converter Id Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterIdTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getConverterIdType()
-	 * @generated
-	 */
-	EClass CONVERTER_ID_TYPE = FacesConfigPackage.eINSTANCE.getConverterIdType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute CONVERTER_ID_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getConverterIdType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute CONVERTER_ID_TYPE__ID = FacesConfigPackage.eINSTANCE.getConverterIdType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterTypeImpl <em>Converter Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getConverterType()
-	 * @generated
-	 */
-	EClass CONVERTER_TYPE = FacesConfigPackage.eINSTANCE.getConverterType();
-
-	/**
-	 * The meta object literal for the '<em><b>Description</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference CONVERTER_TYPE__DESCRIPTION = FacesConfigPackage.eINSTANCE.getConverterType_Description();
-
-	/**
-	 * The meta object literal for the '<em><b>Display Name</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference CONVERTER_TYPE__DISPLAY_NAME = FacesConfigPackage.eINSTANCE.getConverterType_DisplayName();
-
-	/**
-	 * The meta object literal for the '<em><b>Icon</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference CONVERTER_TYPE__ICON = FacesConfigPackage.eINSTANCE.getConverterType_Icon();
-
-	/**
-	 * The meta object literal for the '<em><b>Converter Id</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference CONVERTER_TYPE__CONVERTER_ID = FacesConfigPackage.eINSTANCE.getConverterType_ConverterId();
-
-	/**
-	 * The meta object literal for the '<em><b>Converter For Class</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference CONVERTER_TYPE__CONVERTER_FOR_CLASS = FacesConfigPackage.eINSTANCE.getConverterType_ConverterForClass();
-
-	/**
-	 * The meta object literal for the '<em><b>Converter Class</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference CONVERTER_TYPE__CONVERTER_CLASS = FacesConfigPackage.eINSTANCE.getConverterType_ConverterClass();
-
-	/**
-	 * The meta object literal for the '<em><b>Attribute</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference CONVERTER_TYPE__ATTRIBUTE = FacesConfigPackage.eINSTANCE.getConverterType_Attribute();
-
-	/**
-	 * The meta object literal for the '<em><b>Property</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference CONVERTER_TYPE__PROPERTY = FacesConfigPackage.eINSTANCE.getConverterType_Property();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute CONVERTER_TYPE__ID = FacesConfigPackage.eINSTANCE.getConverterType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DefaultLocaleTypeImpl <em>Default Locale Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.DefaultLocaleTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getDefaultLocaleType()
-	 * @generated
-	 */
-	EClass DEFAULT_LOCALE_TYPE = FacesConfigPackage.eINSTANCE.getDefaultLocaleType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute DEFAULT_LOCALE_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getDefaultLocaleType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute DEFAULT_LOCALE_TYPE__ID = FacesConfigPackage.eINSTANCE.getDefaultLocaleType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DefaultRenderKitIdTypeImpl <em>Default Render Kit Id Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.DefaultRenderKitIdTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getDefaultRenderKitIdType()
-	 * @generated
-	 */
-	EClass DEFAULT_RENDER_KIT_ID_TYPE = FacesConfigPackage.eINSTANCE.getDefaultRenderKitIdType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute DEFAULT_RENDER_KIT_ID_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getDefaultRenderKitIdType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute DEFAULT_RENDER_KIT_ID_TYPE__ID = FacesConfigPackage.eINSTANCE.getDefaultRenderKitIdType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DefaultValueTypeImpl <em>Default Value Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.DefaultValueTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getDefaultValueType()
-	 * @generated
-	 */
-	EClass DEFAULT_VALUE_TYPE = FacesConfigPackage.eINSTANCE.getDefaultValueType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute DEFAULT_VALUE_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getDefaultValueType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute DEFAULT_VALUE_TYPE__ID = FacesConfigPackage.eINSTANCE.getDefaultValueType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DescriptionTypeImpl <em>Description Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.DescriptionTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getDescriptionType()
-	 * @generated
-	 */
-	EClass DESCRIPTION_TYPE = FacesConfigPackage.eINSTANCE.getDescriptionType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute DESCRIPTION_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getDescriptionType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Lang</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute DESCRIPTION_TYPE__LANG = FacesConfigPackage.eINSTANCE.getDescriptionType_Lang();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute DESCRIPTION_TYPE__ID = FacesConfigPackage.eINSTANCE.getDescriptionType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DisplayNameTypeImpl <em>Display Name Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.DisplayNameTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getDisplayNameType()
-	 * @generated
-	 */
-	EClass DISPLAY_NAME_TYPE = FacesConfigPackage.eINSTANCE.getDisplayNameType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute DISPLAY_NAME_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getDisplayNameType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Lang</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute DISPLAY_NAME_TYPE__LANG = FacesConfigPackage.eINSTANCE.getDisplayNameType_Lang();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute DISPLAY_NAME_TYPE__ID = FacesConfigPackage.eINSTANCE.getDisplayNameType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl <em>Document Root</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getDocumentRoot()
-	 * @generated
-	 */
-	EClass DOCUMENT_ROOT = FacesConfigPackage.eINSTANCE.getDocumentRoot();
-
-	/**
-	 * The meta object literal for the '<em><b>Mixed</b></em>' attribute list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute DOCUMENT_ROOT__MIXED = FacesConfigPackage.eINSTANCE.getDocumentRoot_Mixed();
-
-	/**
-	 * The meta object literal for the '<em><b>XMLNS Prefix Map</b></em>' map feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__XMLNS_PREFIX_MAP = FacesConfigPackage.eINSTANCE.getDocumentRoot_XMLNSPrefixMap();
-
-	/**
-	 * The meta object literal for the '<em><b>XSI Schema Location</b></em>' map feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__XSI_SCHEMA_LOCATION = FacesConfigPackage.eINSTANCE.getDocumentRoot_XSISchemaLocation();
-
-	/**
-	 * The meta object literal for the '<em><b>Action Listener</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__ACTION_LISTENER = FacesConfigPackage.eINSTANCE.getDocumentRoot_ActionListener();
-
-	/**
-	 * The meta object literal for the '<em><b>Application</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__APPLICATION = FacesConfigPackage.eINSTANCE.getDocumentRoot_Application();
-
-	/**
-	 * The meta object literal for the '<em><b>Application Factory</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__APPLICATION_FACTORY = FacesConfigPackage.eINSTANCE.getDocumentRoot_ApplicationFactory();
-
-	/**
-	 * The meta object literal for the '<em><b>Attribute</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__ATTRIBUTE = FacesConfigPackage.eINSTANCE.getDocumentRoot_Attribute();
-
-	/**
-	 * The meta object literal for the '<em><b>Attribute Class</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__ATTRIBUTE_CLASS = FacesConfigPackage.eINSTANCE.getDocumentRoot_AttributeClass();
-
-	/**
-	 * The meta object literal for the '<em><b>Attribute Extension</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__ATTRIBUTE_EXTENSION = FacesConfigPackage.eINSTANCE.getDocumentRoot_AttributeExtension();
-
-	/**
-	 * The meta object literal for the '<em><b>Attribute Name</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__ATTRIBUTE_NAME = FacesConfigPackage.eINSTANCE.getDocumentRoot_AttributeName();
-
-	/**
-	 * The meta object literal for the '<em><b>Component</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__COMPONENT = FacesConfigPackage.eINSTANCE.getDocumentRoot_Component();
-
-	/**
-	 * The meta object literal for the '<em><b>Component Class</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__COMPONENT_CLASS = FacesConfigPackage.eINSTANCE.getDocumentRoot_ComponentClass();
-
-	/**
-	 * The meta object literal for the '<em><b>Component Extension</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__COMPONENT_EXTENSION = FacesConfigPackage.eINSTANCE.getDocumentRoot_ComponentExtension();
-
-	/**
-	 * The meta object literal for the '<em><b>Component Family</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__COMPONENT_FAMILY = FacesConfigPackage.eINSTANCE.getDocumentRoot_ComponentFamily();
-
-	/**
-	 * The meta object literal for the '<em><b>Component Type</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__COMPONENT_TYPE = FacesConfigPackage.eINSTANCE.getDocumentRoot_ComponentType();
-
-	/**
-	 * The meta object literal for the '<em><b>Converter</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__CONVERTER = FacesConfigPackage.eINSTANCE.getDocumentRoot_Converter();
-
-	/**
-	 * The meta object literal for the '<em><b>Converter Class</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__CONVERTER_CLASS = FacesConfigPackage.eINSTANCE.getDocumentRoot_ConverterClass();
-
-	/**
-	 * The meta object literal for the '<em><b>Converter For Class</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__CONVERTER_FOR_CLASS = FacesConfigPackage.eINSTANCE.getDocumentRoot_ConverterForClass();
-
-	/**
-	 * The meta object literal for the '<em><b>Converter Id</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__CONVERTER_ID = FacesConfigPackage.eINSTANCE.getDocumentRoot_ConverterId();
-
-	/**
-	 * The meta object literal for the '<em><b>Default Locale</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__DEFAULT_LOCALE = FacesConfigPackage.eINSTANCE.getDocumentRoot_DefaultLocale();
-
-	/**
-	 * The meta object literal for the '<em><b>Default Render Kit Id</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__DEFAULT_RENDER_KIT_ID = FacesConfigPackage.eINSTANCE.getDocumentRoot_DefaultRenderKitId();
-
-	/**
-	 * The meta object literal for the '<em><b>Default Value</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__DEFAULT_VALUE = FacesConfigPackage.eINSTANCE.getDocumentRoot_DefaultValue();
-
-	/**
-	 * The meta object literal for the '<em><b>Description</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__DESCRIPTION = FacesConfigPackage.eINSTANCE.getDocumentRoot_Description();
-
-	/**
-	 * The meta object literal for the '<em><b>Display Name</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__DISPLAY_NAME = FacesConfigPackage.eINSTANCE.getDocumentRoot_DisplayName();
-
-	/**
-	 * The meta object literal for the '<em><b>Faces Config</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__FACES_CONFIG = FacesConfigPackage.eINSTANCE.getDocumentRoot_FacesConfig();
-
-	/**
-	 * The meta object literal for the '<em><b>Faces Context Factory</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__FACES_CONTEXT_FACTORY = FacesConfigPackage.eINSTANCE.getDocumentRoot_FacesContextFactory();
-
-	/**
-	 * The meta object literal for the '<em><b>Facet</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__FACET = FacesConfigPackage.eINSTANCE.getDocumentRoot_Facet();
-
-	/**
-	 * The meta object literal for the '<em><b>Facet Extension</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__FACET_EXTENSION = FacesConfigPackage.eINSTANCE.getDocumentRoot_FacetExtension();
-
-	/**
-	 * The meta object literal for the '<em><b>Facet Name</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__FACET_NAME = FacesConfigPackage.eINSTANCE.getDocumentRoot_FacetName();
-
-	/**
-	 * The meta object literal for the '<em><b>Factory</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__FACTORY = FacesConfigPackage.eINSTANCE.getDocumentRoot_Factory();
-
-	/**
-	 * The meta object literal for the '<em><b>From Action</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__FROM_ACTION = FacesConfigPackage.eINSTANCE.getDocumentRoot_FromAction();
-
-	/**
-	 * The meta object literal for the '<em><b>From Outcome</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__FROM_OUTCOME = FacesConfigPackage.eINSTANCE.getDocumentRoot_FromOutcome();
-
-	/**
-	 * The meta object literal for the '<em><b>From View Id</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__FROM_VIEW_ID = FacesConfigPackage.eINSTANCE.getDocumentRoot_FromViewId();
-
-	/**
-	 * The meta object literal for the '<em><b>Icon</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__ICON = FacesConfigPackage.eINSTANCE.getDocumentRoot_Icon();
-
-	/**
-	 * The meta object literal for the '<em><b>Key</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__KEY = FacesConfigPackage.eINSTANCE.getDocumentRoot_Key();
-
-	/**
-	 * The meta object literal for the '<em><b>Key Class</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__KEY_CLASS = FacesConfigPackage.eINSTANCE.getDocumentRoot_KeyClass();
-
-	/**
-	 * The meta object literal for the '<em><b>Large Icon</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__LARGE_ICON = FacesConfigPackage.eINSTANCE.getDocumentRoot_LargeIcon();
-
-	/**
-	 * The meta object literal for the '<em><b>Lifecycle</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__LIFECYCLE = FacesConfigPackage.eINSTANCE.getDocumentRoot_Lifecycle();
-
-	/**
-	 * The meta object literal for the '<em><b>Lifecycle Factory</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__LIFECYCLE_FACTORY = FacesConfigPackage.eINSTANCE.getDocumentRoot_LifecycleFactory();
-
-	/**
-	 * The meta object literal for the '<em><b>List Entries</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__LIST_ENTRIES = FacesConfigPackage.eINSTANCE.getDocumentRoot_ListEntries();
-
-	/**
-	 * The meta object literal for the '<em><b>Locale Config</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__LOCALE_CONFIG = FacesConfigPackage.eINSTANCE.getDocumentRoot_LocaleConfig();
-
-	/**
-	 * The meta object literal for the '<em><b>Managed Bean</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__MANAGED_BEAN = FacesConfigPackage.eINSTANCE.getDocumentRoot_ManagedBean();
-
-	/**
-	 * The meta object literal for the '<em><b>Managed Bean Class</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__MANAGED_BEAN_CLASS = FacesConfigPackage.eINSTANCE.getDocumentRoot_ManagedBeanClass();
-
-	/**
-	 * The meta object literal for the '<em><b>Managed Bean Name</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__MANAGED_BEAN_NAME = FacesConfigPackage.eINSTANCE.getDocumentRoot_ManagedBeanName();
-
-	/**
-	 * The meta object literal for the '<em><b>Managed Bean Scope</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__MANAGED_BEAN_SCOPE = FacesConfigPackage.eINSTANCE.getDocumentRoot_ManagedBeanScope();
-
-	/**
-	 * The meta object literal for the '<em><b>Managed Property</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__MANAGED_PROPERTY = FacesConfigPackage.eINSTANCE.getDocumentRoot_ManagedProperty();
-
-	/**
-	 * The meta object literal for the '<em><b>Map Entries</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__MAP_ENTRIES = FacesConfigPackage.eINSTANCE.getDocumentRoot_MapEntries();
-
-	/**
-	 * The meta object literal for the '<em><b>Map Entry</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__MAP_ENTRY = FacesConfigPackage.eINSTANCE.getDocumentRoot_MapEntry();
-
-	/**
-	 * The meta object literal for the '<em><b>Message Bundle</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__MESSAGE_BUNDLE = FacesConfigPackage.eINSTANCE.getDocumentRoot_MessageBundle();
-
-	/**
-	 * The meta object literal for the '<em><b>Navigation Case</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__NAVIGATION_CASE = FacesConfigPackage.eINSTANCE.getDocumentRoot_NavigationCase();
-
-	/**
-	 * The meta object literal for the '<em><b>Navigation Handler</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__NAVIGATION_HANDLER = FacesConfigPackage.eINSTANCE.getDocumentRoot_NavigationHandler();
-
-	/**
-	 * The meta object literal for the '<em><b>Navigation Rule</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__NAVIGATION_RULE = FacesConfigPackage.eINSTANCE.getDocumentRoot_NavigationRule();
-
-	/**
-	 * The meta object literal for the '<em><b>Null Value</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__NULL_VALUE = FacesConfigPackage.eINSTANCE.getDocumentRoot_NullValue();
-
-	/**
-	 * The meta object literal for the '<em><b>Phase Listener</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__PHASE_LISTENER = FacesConfigPackage.eINSTANCE.getDocumentRoot_PhaseListener();
-
-	/**
-	 * The meta object literal for the '<em><b>Property</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__PROPERTY = FacesConfigPackage.eINSTANCE.getDocumentRoot_Property();
-
-	/**
-	 * The meta object literal for the '<em><b>Property Class</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__PROPERTY_CLASS = FacesConfigPackage.eINSTANCE.getDocumentRoot_PropertyClass();
-
-	/**
-	 * The meta object literal for the '<em><b>Property Extension</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__PROPERTY_EXTENSION = FacesConfigPackage.eINSTANCE.getDocumentRoot_PropertyExtension();
-
-	/**
-	 * The meta object literal for the '<em><b>Property Name</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__PROPERTY_NAME = FacesConfigPackage.eINSTANCE.getDocumentRoot_PropertyName();
-
-	/**
-	 * The meta object literal for the '<em><b>Property Resolver</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__PROPERTY_RESOLVER = FacesConfigPackage.eINSTANCE.getDocumentRoot_PropertyResolver();
-
-	/**
-	 * The meta object literal for the '<em><b>Redirect</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__REDIRECT = FacesConfigPackage.eINSTANCE.getDocumentRoot_Redirect();
-
-	/**
-	 * The meta object literal for the '<em><b>Referenced Bean</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__REFERENCED_BEAN = FacesConfigPackage.eINSTANCE.getDocumentRoot_ReferencedBean();
-
-	/**
-	 * The meta object literal for the '<em><b>Referenced Bean Class</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__REFERENCED_BEAN_CLASS = FacesConfigPackage.eINSTANCE.getDocumentRoot_ReferencedBeanClass();
-
-	/**
-	 * The meta object literal for the '<em><b>Referenced Bean Name</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__REFERENCED_BEAN_NAME = FacesConfigPackage.eINSTANCE.getDocumentRoot_ReferencedBeanName();
-
-	/**
-	 * The meta object literal for the '<em><b>Renderer</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__RENDERER = FacesConfigPackage.eINSTANCE.getDocumentRoot_Renderer();
-
-	/**
-	 * The meta object literal for the '<em><b>Renderer Class</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__RENDERER_CLASS = FacesConfigPackage.eINSTANCE.getDocumentRoot_RendererClass();
-
-	/**
-	 * The meta object literal for the '<em><b>Renderer Extension</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__RENDERER_EXTENSION = FacesConfigPackage.eINSTANCE.getDocumentRoot_RendererExtension();
-
-	/**
-	 * The meta object literal for the '<em><b>Renderer Type</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__RENDERER_TYPE = FacesConfigPackage.eINSTANCE.getDocumentRoot_RendererType();
-
-	/**
-	 * The meta object literal for the '<em><b>Render Kit</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__RENDER_KIT = FacesConfigPackage.eINSTANCE.getDocumentRoot_RenderKit();
-
-	/**
-	 * The meta object literal for the '<em><b>Render Kit Class</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__RENDER_KIT_CLASS = FacesConfigPackage.eINSTANCE.getDocumentRoot_RenderKitClass();
-
-	/**
-	 * The meta object literal for the '<em><b>Render Kit Factory</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__RENDER_KIT_FACTORY = FacesConfigPackage.eINSTANCE.getDocumentRoot_RenderKitFactory();
-
-	/**
-	 * The meta object literal for the '<em><b>Render Kit Id</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__RENDER_KIT_ID = FacesConfigPackage.eINSTANCE.getDocumentRoot_RenderKitId();
-
-	/**
-	 * The meta object literal for the '<em><b>Small Icon</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__SMALL_ICON = FacesConfigPackage.eINSTANCE.getDocumentRoot_SmallIcon();
-
-	/**
-	 * The meta object literal for the '<em><b>State Manager</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__STATE_MANAGER = FacesConfigPackage.eINSTANCE.getDocumentRoot_StateManager();
-
-	/**
-	 * The meta object literal for the '<em><b>Suggested Value</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__SUGGESTED_VALUE = FacesConfigPackage.eINSTANCE.getDocumentRoot_SuggestedValue();
-
-	/**
-	 * The meta object literal for the '<em><b>Supported Locale</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__SUPPORTED_LOCALE = FacesConfigPackage.eINSTANCE.getDocumentRoot_SupportedLocale();
-
-	/**
-	 * The meta object literal for the '<em><b>To View Id</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__TO_VIEW_ID = FacesConfigPackage.eINSTANCE.getDocumentRoot_ToViewId();
-
-	/**
-	 * The meta object literal for the '<em><b>Validator</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__VALIDATOR = FacesConfigPackage.eINSTANCE.getDocumentRoot_Validator();
-
-	/**
-	 * The meta object literal for the '<em><b>Validator Class</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__VALIDATOR_CLASS = FacesConfigPackage.eINSTANCE.getDocumentRoot_ValidatorClass();
-
-	/**
-	 * The meta object literal for the '<em><b>Validator Id</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__VALIDATOR_ID = FacesConfigPackage.eINSTANCE.getDocumentRoot_ValidatorId();
-
-	/**
-	 * The meta object literal for the '<em><b>Value</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__VALUE = FacesConfigPackage.eINSTANCE.getDocumentRoot_Value();
-
-	/**
-	 * The meta object literal for the '<em><b>Value Class</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__VALUE_CLASS = FacesConfigPackage.eINSTANCE.getDocumentRoot_ValueClass();
-
-	/**
-	 * The meta object literal for the '<em><b>Variable Resolver</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__VARIABLE_RESOLVER = FacesConfigPackage.eINSTANCE.getDocumentRoot_VariableResolver();
-
-	/**
-	 * The meta object literal for the '<em><b>View Handler</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__VIEW_HANDLER = FacesConfigPackage.eINSTANCE.getDocumentRoot_ViewHandler();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigTypeImpl <em>Faces Config Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getFacesConfigType()
-	 * @generated
-	 */
-	EClass FACES_CONFIG_TYPE = FacesConfigPackage.eINSTANCE.getFacesConfigType();
-
-	/**
-	 * The meta object literal for the '<em><b>Application</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference FACES_CONFIG_TYPE__APPLICATION = FacesConfigPackage.eINSTANCE.getFacesConfigType_Application();
-
-	/**
-	 * The meta object literal for the '<em><b>Factory</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference FACES_CONFIG_TYPE__FACTORY = FacesConfigPackage.eINSTANCE.getFacesConfigType_Factory();
-
-	/**
-	 * The meta object literal for the '<em><b>Component</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference FACES_CONFIG_TYPE__COMPONENT = FacesConfigPackage.eINSTANCE.getFacesConfigType_Component();
-
-	/**
-	 * The meta object literal for the '<em><b>Converter</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference FACES_CONFIG_TYPE__CONVERTER = FacesConfigPackage.eINSTANCE.getFacesConfigType_Converter();
-
-	/**
-	 * The meta object literal for the '<em><b>Managed Bean</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference FACES_CONFIG_TYPE__MANAGED_BEAN = FacesConfigPackage.eINSTANCE.getFacesConfigType_ManagedBean();
-
-	/**
-	 * The meta object literal for the '<em><b>Navigation Rule</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference FACES_CONFIG_TYPE__NAVIGATION_RULE = FacesConfigPackage.eINSTANCE.getFacesConfigType_NavigationRule();
-
-	/**
-	 * The meta object literal for the '<em><b>Referenced Bean</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference FACES_CONFIG_TYPE__REFERENCED_BEAN = FacesConfigPackage.eINSTANCE.getFacesConfigType_ReferencedBean();
-
-	/**
-	 * The meta object literal for the '<em><b>Render Kit</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference FACES_CONFIG_TYPE__RENDER_KIT = FacesConfigPackage.eINSTANCE.getFacesConfigType_RenderKit();
-
-	/**
-	 * The meta object literal for the '<em><b>Lifecycle</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference FACES_CONFIG_TYPE__LIFECYCLE = FacesConfigPackage.eINSTANCE.getFacesConfigType_Lifecycle();
-
-	/**
-	 * The meta object literal for the '<em><b>Validator</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference FACES_CONFIG_TYPE__VALIDATOR = FacesConfigPackage.eINSTANCE.getFacesConfigType_Validator();
-
-	/**
-	 * The meta object literal for the '<em><b>Xmlns</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute FACES_CONFIG_TYPE__XMLNS = FacesConfigPackage.eINSTANCE.getFacesConfigType_Xmlns();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute FACES_CONFIG_TYPE__ID = FacesConfigPackage.eINSTANCE.getFacesConfigType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacesContextFactoryTypeImpl <em>Faces Context Factory Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesContextFactoryTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getFacesContextFactoryType()
-	 * @generated
-	 */
-	EClass FACES_CONTEXT_FACTORY_TYPE = FacesConfigPackage.eINSTANCE.getFacesContextFactoryType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute FACES_CONTEXT_FACTORY_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getFacesContextFactoryType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute FACES_CONTEXT_FACTORY_TYPE__ID = FacesConfigPackage.eINSTANCE.getFacesContextFactoryType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacetExtensionTypeImpl <em>Facet Extension Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacetExtensionTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getFacetExtensionType()
-	 * @generated
-	 */
-	EClass FACET_EXTENSION_TYPE = FacesConfigPackage.eINSTANCE.getFacetExtensionType();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacetNameTypeImpl <em>Facet Name Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacetNameTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getFacetNameType()
-	 * @generated
-	 */
-	EClass FACET_NAME_TYPE = FacesConfigPackage.eINSTANCE.getFacetNameType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute FACET_NAME_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getFacetNameType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute FACET_NAME_TYPE__ID = FacesConfigPackage.eINSTANCE.getFacetNameType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacetTypeImpl <em>Facet Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacetTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getFacetType()
-	 * @generated
-	 */
-	EClass FACET_TYPE = FacesConfigPackage.eINSTANCE.getFacetType();
-
-	/**
-	 * The meta object literal for the '<em><b>Description</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference FACET_TYPE__DESCRIPTION = FacesConfigPackage.eINSTANCE.getFacetType_Description();
-
-	/**
-	 * The meta object literal for the '<em><b>Display Name</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference FACET_TYPE__DISPLAY_NAME = FacesConfigPackage.eINSTANCE.getFacetType_DisplayName();
-
-	/**
-	 * The meta object literal for the '<em><b>Icon</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference FACET_TYPE__ICON = FacesConfigPackage.eINSTANCE.getFacetType_Icon();
-
-	/**
-	 * The meta object literal for the '<em><b>Facet Name</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference FACET_TYPE__FACET_NAME = FacesConfigPackage.eINSTANCE.getFacetType_FacetName();
-
-	/**
-	 * The meta object literal for the '<em><b>Facet Extension</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference FACET_TYPE__FACET_EXTENSION = FacesConfigPackage.eINSTANCE.getFacetType_FacetExtension();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute FACET_TYPE__ID = FacesConfigPackage.eINSTANCE.getFacetType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FactoryTypeImpl <em>Factory Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FactoryTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getFactoryType()
-	 * @generated
-	 */
-	EClass FACTORY_TYPE = FacesConfigPackage.eINSTANCE.getFactoryType();
-
-	/**
-	 * The meta object literal for the '<em><b>Application Factory</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference FACTORY_TYPE__APPLICATION_FACTORY = FacesConfigPackage.eINSTANCE.getFactoryType_ApplicationFactory();
-
-	/**
-	 * The meta object literal for the '<em><b>Faces Context Factory</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference FACTORY_TYPE__FACES_CONTEXT_FACTORY = FacesConfigPackage.eINSTANCE.getFactoryType_FacesContextFactory();
-
-	/**
-	 * The meta object literal for the '<em><b>Lifecycle Factory</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference FACTORY_TYPE__LIFECYCLE_FACTORY = FacesConfigPackage.eINSTANCE.getFactoryType_LifecycleFactory();
-
-	/**
-	 * The meta object literal for the '<em><b>Render Kit Factory</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference FACTORY_TYPE__RENDER_KIT_FACTORY = FacesConfigPackage.eINSTANCE.getFactoryType_RenderKitFactory();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute FACTORY_TYPE__ID = FacesConfigPackage.eINSTANCE.getFactoryType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FromActionTypeImpl <em>From Action Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FromActionTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getFromActionType()
-	 * @generated
-	 */
-	EClass FROM_ACTION_TYPE = FacesConfigPackage.eINSTANCE.getFromActionType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute FROM_ACTION_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getFromActionType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute FROM_ACTION_TYPE__ID = FacesConfigPackage.eINSTANCE.getFromActionType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FromOutcomeTypeImpl <em>From Outcome Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FromOutcomeTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getFromOutcomeType()
-	 * @generated
-	 */
-	EClass FROM_OUTCOME_TYPE = FacesConfigPackage.eINSTANCE.getFromOutcomeType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute FROM_OUTCOME_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getFromOutcomeType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute FROM_OUTCOME_TYPE__ID = FacesConfigPackage.eINSTANCE.getFromOutcomeType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FromViewIdTypeImpl <em>From View Id Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FromViewIdTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getFromViewIdType()
-	 * @generated
-	 */
-	EClass FROM_VIEW_ID_TYPE = FacesConfigPackage.eINSTANCE.getFromViewIdType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute FROM_VIEW_ID_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getFromViewIdType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute FROM_VIEW_ID_TYPE__ID = FacesConfigPackage.eINSTANCE.getFromViewIdType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.IconTypeImpl <em>Icon Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.IconTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getIconType()
-	 * @generated
-	 */
-	EClass ICON_TYPE = FacesConfigPackage.eINSTANCE.getIconType();
-
-	/**
-	 * The meta object literal for the '<em><b>Small Icon</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference ICON_TYPE__SMALL_ICON = FacesConfigPackage.eINSTANCE.getIconType_SmallIcon();
-
-	/**
-	 * The meta object literal for the '<em><b>Large Icon</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference ICON_TYPE__LARGE_ICON = FacesConfigPackage.eINSTANCE.getIconType_LargeIcon();
-
-	/**
-	 * The meta object literal for the '<em><b>Lang</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute ICON_TYPE__LANG = FacesConfigPackage.eINSTANCE.getIconType_Lang();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute ICON_TYPE__ID = FacesConfigPackage.eINSTANCE.getIconType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.KeyClassTypeImpl <em>Key Class Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.KeyClassTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getKeyClassType()
-	 * @generated
-	 */
-	EClass KEY_CLASS_TYPE = FacesConfigPackage.eINSTANCE.getKeyClassType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute KEY_CLASS_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getKeyClassType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute KEY_CLASS_TYPE__ID = FacesConfigPackage.eINSTANCE.getKeyClassType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.KeyTypeImpl <em>Key Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.KeyTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getKeyType()
-	 * @generated
-	 */
-	EClass KEY_TYPE = FacesConfigPackage.eINSTANCE.getKeyType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute KEY_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getKeyType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute KEY_TYPE__ID = FacesConfigPackage.eINSTANCE.getKeyType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.LargeIconTypeImpl <em>Large Icon Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.LargeIconTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getLargeIconType()
-	 * @generated
-	 */
-	EClass LARGE_ICON_TYPE = FacesConfigPackage.eINSTANCE.getLargeIconType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute LARGE_ICON_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getLargeIconType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute LARGE_ICON_TYPE__ID = FacesConfigPackage.eINSTANCE.getLargeIconType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.LifecycleFactoryTypeImpl <em>Lifecycle Factory Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.LifecycleFactoryTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getLifecycleFactoryType()
-	 * @generated
-	 */
-	EClass LIFECYCLE_FACTORY_TYPE = FacesConfigPackage.eINSTANCE.getLifecycleFactoryType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute LIFECYCLE_FACTORY_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getLifecycleFactoryType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute LIFECYCLE_FACTORY_TYPE__ID = FacesConfigPackage.eINSTANCE.getLifecycleFactoryType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.LifecycleTypeImpl <em>Lifecycle Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.LifecycleTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getLifecycleType()
-	 * @generated
-	 */
-	EClass LIFECYCLE_TYPE = FacesConfigPackage.eINSTANCE.getLifecycleType();
-
-	/**
-	 * The meta object literal for the '<em><b>Phase Listener</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference LIFECYCLE_TYPE__PHASE_LISTENER = FacesConfigPackage.eINSTANCE.getLifecycleType_PhaseListener();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute LIFECYCLE_TYPE__ID = FacesConfigPackage.eINSTANCE.getLifecycleType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ListEntriesTypeImpl <em>List Entries Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ListEntriesTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getListEntriesType()
-	 * @generated
-	 */
-	EClass LIST_ENTRIES_TYPE = FacesConfigPackage.eINSTANCE.getListEntriesType();
-
-	/**
-	 * The meta object literal for the '<em><b>Value Class</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference LIST_ENTRIES_TYPE__VALUE_CLASS = FacesConfigPackage.eINSTANCE.getListEntriesType_ValueClass();
-
-	/**
-	 * The meta object literal for the '<em><b>Null Value</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference LIST_ENTRIES_TYPE__NULL_VALUE = FacesConfigPackage.eINSTANCE.getListEntriesType_NullValue();
-
-	/**
-	 * The meta object literal for the '<em><b>Value</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference LIST_ENTRIES_TYPE__VALUE = FacesConfigPackage.eINSTANCE.getListEntriesType_Value();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute LIST_ENTRIES_TYPE__ID = FacesConfigPackage.eINSTANCE.getListEntriesType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.LocaleConfigTypeImpl <em>Locale Config Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.LocaleConfigTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getLocaleConfigType()
-	 * @generated
-	 */
-	EClass LOCALE_CONFIG_TYPE = FacesConfigPackage.eINSTANCE.getLocaleConfigType();
-
-	/**
-	 * The meta object literal for the '<em><b>Default Locale</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference LOCALE_CONFIG_TYPE__DEFAULT_LOCALE = FacesConfigPackage.eINSTANCE.getLocaleConfigType_DefaultLocale();
-
-	/**
-	 * The meta object literal for the '<em><b>Supported Locale</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference LOCALE_CONFIG_TYPE__SUPPORTED_LOCALE = FacesConfigPackage.eINSTANCE.getLocaleConfigType_SupportedLocale();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute LOCALE_CONFIG_TYPE__ID = FacesConfigPackage.eINSTANCE.getLocaleConfigType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanClassTypeImpl <em>Managed Bean Class Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanClassTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getManagedBeanClassType()
-	 * @generated
-	 */
-	EClass MANAGED_BEAN_CLASS_TYPE = FacesConfigPackage.eINSTANCE.getManagedBeanClassType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute MANAGED_BEAN_CLASS_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getManagedBeanClassType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute MANAGED_BEAN_CLASS_TYPE__ID = FacesConfigPackage.eINSTANCE.getManagedBeanClassType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanNameTypeImpl <em>Managed Bean Name Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanNameTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getManagedBeanNameType()
-	 * @generated
-	 */
-	EClass MANAGED_BEAN_NAME_TYPE = FacesConfigPackage.eINSTANCE.getManagedBeanNameType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute MANAGED_BEAN_NAME_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getManagedBeanNameType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute MANAGED_BEAN_NAME_TYPE__ID = FacesConfigPackage.eINSTANCE.getManagedBeanNameType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanScopeTypeImpl <em>Managed Bean Scope Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanScopeTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getManagedBeanScopeType()
-	 * @generated
-	 */
-	EClass MANAGED_BEAN_SCOPE_TYPE = FacesConfigPackage.eINSTANCE.getManagedBeanScopeType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute MANAGED_BEAN_SCOPE_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getManagedBeanScopeType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute MANAGED_BEAN_SCOPE_TYPE__ID = FacesConfigPackage.eINSTANCE.getManagedBeanScopeType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanTypeImpl <em>Managed Bean Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getManagedBeanType()
-	 * @generated
-	 */
-	EClass MANAGED_BEAN_TYPE = FacesConfigPackage.eINSTANCE.getManagedBeanType();
-
-	/**
-	 * The meta object literal for the '<em><b>Description</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference MANAGED_BEAN_TYPE__DESCRIPTION = FacesConfigPackage.eINSTANCE.getManagedBeanType_Description();
-
-	/**
-	 * The meta object literal for the '<em><b>Display Name</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference MANAGED_BEAN_TYPE__DISPLAY_NAME = FacesConfigPackage.eINSTANCE.getManagedBeanType_DisplayName();
-
-	/**
-	 * The meta object literal for the '<em><b>Icon</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference MANAGED_BEAN_TYPE__ICON = FacesConfigPackage.eINSTANCE.getManagedBeanType_Icon();
-
-	/**
-	 * The meta object literal for the '<em><b>Managed Bean Name</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference MANAGED_BEAN_TYPE__MANAGED_BEAN_NAME = FacesConfigPackage.eINSTANCE.getManagedBeanType_ManagedBeanName();
-
-	/**
-	 * The meta object literal for the '<em><b>Managed Bean Class</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference MANAGED_BEAN_TYPE__MANAGED_BEAN_CLASS = FacesConfigPackage.eINSTANCE.getManagedBeanType_ManagedBeanClass();
-
-	/**
-	 * The meta object literal for the '<em><b>Managed Bean Scope</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference MANAGED_BEAN_TYPE__MANAGED_BEAN_SCOPE = FacesConfigPackage.eINSTANCE.getManagedBeanType_ManagedBeanScope();
-
-	/**
-	 * The meta object literal for the '<em><b>Managed Property</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference MANAGED_BEAN_TYPE__MANAGED_PROPERTY = FacesConfigPackage.eINSTANCE.getManagedBeanType_ManagedProperty();
-
-	/**
-	 * The meta object literal for the '<em><b>Map Entries</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference MANAGED_BEAN_TYPE__MAP_ENTRIES = FacesConfigPackage.eINSTANCE.getManagedBeanType_MapEntries();
-
-	/**
-	 * The meta object literal for the '<em><b>List Entries</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference MANAGED_BEAN_TYPE__LIST_ENTRIES = FacesConfigPackage.eINSTANCE.getManagedBeanType_ListEntries();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute MANAGED_BEAN_TYPE__ID = FacesConfigPackage.eINSTANCE.getManagedBeanType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedPropertyTypeImpl <em>Managed Property Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedPropertyTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getManagedPropertyType()
-	 * @generated
-	 */
-	EClass MANAGED_PROPERTY_TYPE = FacesConfigPackage.eINSTANCE.getManagedPropertyType();
-
-	/**
-	 * The meta object literal for the '<em><b>Description</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference MANAGED_PROPERTY_TYPE__DESCRIPTION = FacesConfigPackage.eINSTANCE.getManagedPropertyType_Description();
-
-	/**
-	 * The meta object literal for the '<em><b>Display Name</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference MANAGED_PROPERTY_TYPE__DISPLAY_NAME = FacesConfigPackage.eINSTANCE.getManagedPropertyType_DisplayName();
-
-	/**
-	 * The meta object literal for the '<em><b>Icon</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference MANAGED_PROPERTY_TYPE__ICON = FacesConfigPackage.eINSTANCE.getManagedPropertyType_Icon();
-
-	/**
-	 * The meta object literal for the '<em><b>Property Name</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference MANAGED_PROPERTY_TYPE__PROPERTY_NAME = FacesConfigPackage.eINSTANCE.getManagedPropertyType_PropertyName();
-
-	/**
-	 * The meta object literal for the '<em><b>Property Class</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference MANAGED_PROPERTY_TYPE__PROPERTY_CLASS = FacesConfigPackage.eINSTANCE.getManagedPropertyType_PropertyClass();
-
-	/**
-	 * The meta object literal for the '<em><b>Map Entries</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference MANAGED_PROPERTY_TYPE__MAP_ENTRIES = FacesConfigPackage.eINSTANCE.getManagedPropertyType_MapEntries();
-
-	/**
-	 * The meta object literal for the '<em><b>Null Value</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference MANAGED_PROPERTY_TYPE__NULL_VALUE = FacesConfigPackage.eINSTANCE.getManagedPropertyType_NullValue();
-
-	/**
-	 * The meta object literal for the '<em><b>Value</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference MANAGED_PROPERTY_TYPE__VALUE = FacesConfigPackage.eINSTANCE.getManagedPropertyType_Value();
-
-	/**
-	 * The meta object literal for the '<em><b>List Entries</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference MANAGED_PROPERTY_TYPE__LIST_ENTRIES = FacesConfigPackage.eINSTANCE.getManagedPropertyType_ListEntries();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute MANAGED_PROPERTY_TYPE__ID = FacesConfigPackage.eINSTANCE.getManagedPropertyType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.MapEntriesTypeImpl <em>Map Entries Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.MapEntriesTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getMapEntriesType()
-	 * @generated
-	 */
-	EClass MAP_ENTRIES_TYPE = FacesConfigPackage.eINSTANCE.getMapEntriesType();
-
-	/**
-	 * The meta object literal for the '<em><b>Key Class</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference MAP_ENTRIES_TYPE__KEY_CLASS = FacesConfigPackage.eINSTANCE.getMapEntriesType_KeyClass();
-
-	/**
-	 * The meta object literal for the '<em><b>Value Class</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference MAP_ENTRIES_TYPE__VALUE_CLASS = FacesConfigPackage.eINSTANCE.getMapEntriesType_ValueClass();
-
-	/**
-	 * The meta object literal for the '<em><b>Map Entry</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference MAP_ENTRIES_TYPE__MAP_ENTRY = FacesConfigPackage.eINSTANCE.getMapEntriesType_MapEntry();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute MAP_ENTRIES_TYPE__ID = FacesConfigPackage.eINSTANCE.getMapEntriesType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.MapEntryTypeImpl <em>Map Entry Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.MapEntryTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getMapEntryType()
-	 * @generated
-	 */
-	EClass MAP_ENTRY_TYPE = FacesConfigPackage.eINSTANCE.getMapEntryType();
-
-	/**
-	 * The meta object literal for the '<em><b>Key</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference MAP_ENTRY_TYPE__KEY = FacesConfigPackage.eINSTANCE.getMapEntryType_Key();
-
-	/**
-	 * The meta object literal for the '<em><b>Null Value</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference MAP_ENTRY_TYPE__NULL_VALUE = FacesConfigPackage.eINSTANCE.getMapEntryType_NullValue();
-
-	/**
-	 * The meta object literal for the '<em><b>Value</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference MAP_ENTRY_TYPE__VALUE = FacesConfigPackage.eINSTANCE.getMapEntryType_Value();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute MAP_ENTRY_TYPE__ID = FacesConfigPackage.eINSTANCE.getMapEntryType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.MessageBundleTypeImpl <em>Message Bundle Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.MessageBundleTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getMessageBundleType()
-	 * @generated
-	 */
-	EClass MESSAGE_BUNDLE_TYPE = FacesConfigPackage.eINSTANCE.getMessageBundleType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute MESSAGE_BUNDLE_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getMessageBundleType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute MESSAGE_BUNDLE_TYPE__ID = FacesConfigPackage.eINSTANCE.getMessageBundleType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationCaseTypeImpl <em>Navigation Case Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationCaseTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getNavigationCaseType()
-	 * @generated
-	 */
-	EClass NAVIGATION_CASE_TYPE = FacesConfigPackage.eINSTANCE.getNavigationCaseType();
-
-	/**
-	 * The meta object literal for the '<em><b>Description</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference NAVIGATION_CASE_TYPE__DESCRIPTION = FacesConfigPackage.eINSTANCE.getNavigationCaseType_Description();
-
-	/**
-	 * The meta object literal for the '<em><b>Display Name</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference NAVIGATION_CASE_TYPE__DISPLAY_NAME = FacesConfigPackage.eINSTANCE.getNavigationCaseType_DisplayName();
-
-	/**
-	 * The meta object literal for the '<em><b>Icon</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference NAVIGATION_CASE_TYPE__ICON = FacesConfigPackage.eINSTANCE.getNavigationCaseType_Icon();
-
-	/**
-	 * The meta object literal for the '<em><b>From Action</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference NAVIGATION_CASE_TYPE__FROM_ACTION = FacesConfigPackage.eINSTANCE.getNavigationCaseType_FromAction();
-
-	/**
-	 * The meta object literal for the '<em><b>From Outcome</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference NAVIGATION_CASE_TYPE__FROM_OUTCOME = FacesConfigPackage.eINSTANCE.getNavigationCaseType_FromOutcome();
-
-	/**
-	 * The meta object literal for the '<em><b>To View Id</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference NAVIGATION_CASE_TYPE__TO_VIEW_ID = FacesConfigPackage.eINSTANCE.getNavigationCaseType_ToViewId();
-
-	/**
-	 * The meta object literal for the '<em><b>Redirect</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference NAVIGATION_CASE_TYPE__REDIRECT = FacesConfigPackage.eINSTANCE.getNavigationCaseType_Redirect();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute NAVIGATION_CASE_TYPE__ID = FacesConfigPackage.eINSTANCE.getNavigationCaseType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationHandlerTypeImpl <em>Navigation Handler Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationHandlerTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getNavigationHandlerType()
-	 * @generated
-	 */
-	EClass NAVIGATION_HANDLER_TYPE = FacesConfigPackage.eINSTANCE.getNavigationHandlerType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute NAVIGATION_HANDLER_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getNavigationHandlerType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute NAVIGATION_HANDLER_TYPE__ID = FacesConfigPackage.eINSTANCE.getNavigationHandlerType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationRuleTypeImpl <em>Navigation Rule Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationRuleTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getNavigationRuleType()
-	 * @generated
-	 */
-	EClass NAVIGATION_RULE_TYPE = FacesConfigPackage.eINSTANCE.getNavigationRuleType();
-
-	/**
-	 * The meta object literal for the '<em><b>Description</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference NAVIGATION_RULE_TYPE__DESCRIPTION = FacesConfigPackage.eINSTANCE.getNavigationRuleType_Description();
-
-	/**
-	 * The meta object literal for the '<em><b>Display Name</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference NAVIGATION_RULE_TYPE__DISPLAY_NAME = FacesConfigPackage.eINSTANCE.getNavigationRuleType_DisplayName();
-
-	/**
-	 * The meta object literal for the '<em><b>Icon</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference NAVIGATION_RULE_TYPE__ICON = FacesConfigPackage.eINSTANCE.getNavigationRuleType_Icon();
-
-	/**
-	 * The meta object literal for the '<em><b>From View Id</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference NAVIGATION_RULE_TYPE__FROM_VIEW_ID = FacesConfigPackage.eINSTANCE.getNavigationRuleType_FromViewId();
-
-	/**
-	 * The meta object literal for the '<em><b>Navigation Case</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference NAVIGATION_RULE_TYPE__NAVIGATION_CASE = FacesConfigPackage.eINSTANCE.getNavigationRuleType_NavigationCase();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute NAVIGATION_RULE_TYPE__ID = FacesConfigPackage.eINSTANCE.getNavigationRuleType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.NullValueTypeImpl <em>Null Value Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.NullValueTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getNullValueType()
-	 * @generated
-	 */
-	EClass NULL_VALUE_TYPE = FacesConfigPackage.eINSTANCE.getNullValueType();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute NULL_VALUE_TYPE__ID = FacesConfigPackage.eINSTANCE.getNullValueType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PhaseListenerTypeImpl <em>Phase Listener Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.PhaseListenerTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getPhaseListenerType()
-	 * @generated
-	 */
-	EClass PHASE_LISTENER_TYPE = FacesConfigPackage.eINSTANCE.getPhaseListenerType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute PHASE_LISTENER_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getPhaseListenerType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute PHASE_LISTENER_TYPE__ID = FacesConfigPackage.eINSTANCE.getPhaseListenerType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyClassTypeImpl <em>Property Class Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyClassTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getPropertyClassType()
-	 * @generated
-	 */
-	EClass PROPERTY_CLASS_TYPE = FacesConfigPackage.eINSTANCE.getPropertyClassType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute PROPERTY_CLASS_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getPropertyClassType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute PROPERTY_CLASS_TYPE__ID = FacesConfigPackage.eINSTANCE.getPropertyClassType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyExtensionTypeImpl <em>Property Extension Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyExtensionTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getPropertyExtensionType()
-	 * @generated
-	 */
-	EClass PROPERTY_EXTENSION_TYPE = FacesConfigPackage.eINSTANCE.getPropertyExtensionType();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyNameTypeImpl <em>Property Name Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyNameTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getPropertyNameType()
-	 * @generated
-	 */
-	EClass PROPERTY_NAME_TYPE = FacesConfigPackage.eINSTANCE.getPropertyNameType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute PROPERTY_NAME_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getPropertyNameType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute PROPERTY_NAME_TYPE__ID = FacesConfigPackage.eINSTANCE.getPropertyNameType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyResolverTypeImpl <em>Property Resolver Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyResolverTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getPropertyResolverType()
-	 * @generated
-	 */
-	EClass PROPERTY_RESOLVER_TYPE = FacesConfigPackage.eINSTANCE.getPropertyResolverType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute PROPERTY_RESOLVER_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getPropertyResolverType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute PROPERTY_RESOLVER_TYPE__ID = FacesConfigPackage.eINSTANCE.getPropertyResolverType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyTypeImpl <em>Property Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getPropertyType()
-	 * @generated
-	 */
-	EClass PROPERTY_TYPE = FacesConfigPackage.eINSTANCE.getPropertyType();
-
-	/**
-	 * The meta object literal for the '<em><b>Description</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference PROPERTY_TYPE__DESCRIPTION = FacesConfigPackage.eINSTANCE.getPropertyType_Description();
-
-	/**
-	 * The meta object literal for the '<em><b>Display Name</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference PROPERTY_TYPE__DISPLAY_NAME = FacesConfigPackage.eINSTANCE.getPropertyType_DisplayName();
-
-	/**
-	 * The meta object literal for the '<em><b>Icon</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference PROPERTY_TYPE__ICON = FacesConfigPackage.eINSTANCE.getPropertyType_Icon();
-
-	/**
-	 * The meta object literal for the '<em><b>Property Name</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference PROPERTY_TYPE__PROPERTY_NAME = FacesConfigPackage.eINSTANCE.getPropertyType_PropertyName();
-
-	/**
-	 * The meta object literal for the '<em><b>Property Class</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference PROPERTY_TYPE__PROPERTY_CLASS = FacesConfigPackage.eINSTANCE.getPropertyType_PropertyClass();
-
-	/**
-	 * The meta object literal for the '<em><b>Default Value</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference PROPERTY_TYPE__DEFAULT_VALUE = FacesConfigPackage.eINSTANCE.getPropertyType_DefaultValue();
-
-	/**
-	 * The meta object literal for the '<em><b>Suggested Value</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference PROPERTY_TYPE__SUGGESTED_VALUE = FacesConfigPackage.eINSTANCE.getPropertyType_SuggestedValue();
-
-	/**
-	 * The meta object literal for the '<em><b>Property Extension</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference PROPERTY_TYPE__PROPERTY_EXTENSION = FacesConfigPackage.eINSTANCE.getPropertyType_PropertyExtension();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute PROPERTY_TYPE__ID = FacesConfigPackage.eINSTANCE.getPropertyType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RedirectTypeImpl <em>Redirect Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.RedirectTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getRedirectType()
-	 * @generated
-	 */
-	EClass REDIRECT_TYPE = FacesConfigPackage.eINSTANCE.getRedirectType();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute REDIRECT_TYPE__ID = FacesConfigPackage.eINSTANCE.getRedirectType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ReferencedBeanClassTypeImpl <em>Referenced Bean Class Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ReferencedBeanClassTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getReferencedBeanClassType()
-	 * @generated
-	 */
-	EClass REFERENCED_BEAN_CLASS_TYPE = FacesConfigPackage.eINSTANCE.getReferencedBeanClassType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute REFERENCED_BEAN_CLASS_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getReferencedBeanClassType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute REFERENCED_BEAN_CLASS_TYPE__ID = FacesConfigPackage.eINSTANCE.getReferencedBeanClassType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ReferencedBeanNameTypeImpl <em>Referenced Bean Name Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ReferencedBeanNameTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getReferencedBeanNameType()
-	 * @generated
-	 */
-	EClass REFERENCED_BEAN_NAME_TYPE = FacesConfigPackage.eINSTANCE.getReferencedBeanNameType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute REFERENCED_BEAN_NAME_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getReferencedBeanNameType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute REFERENCED_BEAN_NAME_TYPE__ID = FacesConfigPackage.eINSTANCE.getReferencedBeanNameType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ReferencedBeanTypeImpl <em>Referenced Bean Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ReferencedBeanTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getReferencedBeanType()
-	 * @generated
-	 */
-	EClass REFERENCED_BEAN_TYPE = FacesConfigPackage.eINSTANCE.getReferencedBeanType();
-
-	/**
-	 * The meta object literal for the '<em><b>Description</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference REFERENCED_BEAN_TYPE__DESCRIPTION = FacesConfigPackage.eINSTANCE.getReferencedBeanType_Description();
-
-	/**
-	 * The meta object literal for the '<em><b>Display Name</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference REFERENCED_BEAN_TYPE__DISPLAY_NAME = FacesConfigPackage.eINSTANCE.getReferencedBeanType_DisplayName();
-
-	/**
-	 * The meta object literal for the '<em><b>Icon</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference REFERENCED_BEAN_TYPE__ICON = FacesConfigPackage.eINSTANCE.getReferencedBeanType_Icon();
-
-	/**
-	 * The meta object literal for the '<em><b>Referenced Bean Name</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference REFERENCED_BEAN_TYPE__REFERENCED_BEAN_NAME = FacesConfigPackage.eINSTANCE.getReferencedBeanType_ReferencedBeanName();
-
-	/**
-	 * The meta object literal for the '<em><b>Referenced Bean Class</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference REFERENCED_BEAN_TYPE__REFERENCED_BEAN_CLASS = FacesConfigPackage.eINSTANCE.getReferencedBeanType_ReferencedBeanClass();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute REFERENCED_BEAN_TYPE__ID = FacesConfigPackage.eINSTANCE.getReferencedBeanType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RendererClassTypeImpl <em>Renderer Class Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.RendererClassTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getRendererClassType()
-	 * @generated
-	 */
-	EClass RENDERER_CLASS_TYPE = FacesConfigPackage.eINSTANCE.getRendererClassType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute RENDERER_CLASS_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getRendererClassType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute RENDERER_CLASS_TYPE__ID = FacesConfigPackage.eINSTANCE.getRendererClassType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RendererExtensionTypeImpl <em>Renderer Extension Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.RendererExtensionTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getRendererExtensionType()
-	 * @generated
-	 */
-	EClass RENDERER_EXTENSION_TYPE = FacesConfigPackage.eINSTANCE.getRendererExtensionType();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RendererTypeImpl <em>Renderer Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.RendererTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getRendererType()
-	 * @generated
-	 */
-	EClass RENDERER_TYPE = FacesConfigPackage.eINSTANCE.getRendererType();
-
-	/**
-	 * The meta object literal for the '<em><b>Description</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference RENDERER_TYPE__DESCRIPTION = FacesConfigPackage.eINSTANCE.getRendererType_Description();
-
-	/**
-	 * The meta object literal for the '<em><b>Display Name</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference RENDERER_TYPE__DISPLAY_NAME = FacesConfigPackage.eINSTANCE.getRendererType_DisplayName();
-
-	/**
-	 * The meta object literal for the '<em><b>Icon</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference RENDERER_TYPE__ICON = FacesConfigPackage.eINSTANCE.getRendererType_Icon();
-
-	/**
-	 * The meta object literal for the '<em><b>Component Family</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference RENDERER_TYPE__COMPONENT_FAMILY = FacesConfigPackage.eINSTANCE.getRendererType_ComponentFamily();
-
-	/**
-	 * The meta object literal for the '<em><b>Renderer Type</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference RENDERER_TYPE__RENDERER_TYPE = FacesConfigPackage.eINSTANCE.getRendererType_RendererType();
-
-	/**
-	 * The meta object literal for the '<em><b>Renderer Class</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference RENDERER_TYPE__RENDERER_CLASS = FacesConfigPackage.eINSTANCE.getRendererType_RendererClass();
-
-	/**
-	 * The meta object literal for the '<em><b>Facet</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference RENDERER_TYPE__FACET = FacesConfigPackage.eINSTANCE.getRendererType_Facet();
-
-	/**
-	 * The meta object literal for the '<em><b>Attribute</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference RENDERER_TYPE__ATTRIBUTE = FacesConfigPackage.eINSTANCE.getRendererType_Attribute();
-
-	/**
-	 * The meta object literal for the '<em><b>Renderer Extension</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference RENDERER_TYPE__RENDERER_EXTENSION = FacesConfigPackage.eINSTANCE.getRendererType_RendererExtension();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute RENDERER_TYPE__ID = FacesConfigPackage.eINSTANCE.getRendererType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RendererTypeTypeImpl <em>Renderer Type Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.RendererTypeTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getRendererTypeType()
-	 * @generated
-	 */
-	EClass RENDERER_TYPE_TYPE = FacesConfigPackage.eINSTANCE.getRendererTypeType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute RENDERER_TYPE_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getRendererTypeType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute RENDERER_TYPE_TYPE__ID = FacesConfigPackage.eINSTANCE.getRendererTypeType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitClassTypeImpl <em>Render Kit Class Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitClassTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getRenderKitClassType()
-	 * @generated
-	 */
-	EClass RENDER_KIT_CLASS_TYPE = FacesConfigPackage.eINSTANCE.getRenderKitClassType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute RENDER_KIT_CLASS_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getRenderKitClassType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute RENDER_KIT_CLASS_TYPE__ID = FacesConfigPackage.eINSTANCE.getRenderKitClassType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitFactoryTypeImpl <em>Render Kit Factory Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitFactoryTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getRenderKitFactoryType()
-	 * @generated
-	 */
-	EClass RENDER_KIT_FACTORY_TYPE = FacesConfigPackage.eINSTANCE.getRenderKitFactoryType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute RENDER_KIT_FACTORY_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getRenderKitFactoryType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute RENDER_KIT_FACTORY_TYPE__ID = FacesConfigPackage.eINSTANCE.getRenderKitFactoryType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitIdTypeImpl <em>Render Kit Id Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitIdTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getRenderKitIdType()
-	 * @generated
-	 */
-	EClass RENDER_KIT_ID_TYPE = FacesConfigPackage.eINSTANCE.getRenderKitIdType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute RENDER_KIT_ID_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getRenderKitIdType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute RENDER_KIT_ID_TYPE__ID = FacesConfigPackage.eINSTANCE.getRenderKitIdType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitTypeImpl <em>Render Kit Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getRenderKitType()
-	 * @generated
-	 */
-	EClass RENDER_KIT_TYPE = FacesConfigPackage.eINSTANCE.getRenderKitType();
-
-	/**
-	 * The meta object literal for the '<em><b>Description</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference RENDER_KIT_TYPE__DESCRIPTION = FacesConfigPackage.eINSTANCE.getRenderKitType_Description();
-
-	/**
-	 * The meta object literal for the '<em><b>Display Name</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference RENDER_KIT_TYPE__DISPLAY_NAME = FacesConfigPackage.eINSTANCE.getRenderKitType_DisplayName();
-
-	/**
-	 * The meta object literal for the '<em><b>Icon</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference RENDER_KIT_TYPE__ICON = FacesConfigPackage.eINSTANCE.getRenderKitType_Icon();
-
-	/**
-	 * The meta object literal for the '<em><b>Render Kit Id</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference RENDER_KIT_TYPE__RENDER_KIT_ID = FacesConfigPackage.eINSTANCE.getRenderKitType_RenderKitId();
-
-	/**
-	 * The meta object literal for the '<em><b>Render Kit Class</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference RENDER_KIT_TYPE__RENDER_KIT_CLASS = FacesConfigPackage.eINSTANCE.getRenderKitType_RenderKitClass();
-
-	/**
-	 * The meta object literal for the '<em><b>Renderer</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference RENDER_KIT_TYPE__RENDERER = FacesConfigPackage.eINSTANCE.getRenderKitType_Renderer();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute RENDER_KIT_TYPE__ID = FacesConfigPackage.eINSTANCE.getRenderKitType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.SmallIconTypeImpl <em>Small Icon Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.SmallIconTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getSmallIconType()
-	 * @generated
-	 */
-	EClass SMALL_ICON_TYPE = FacesConfigPackage.eINSTANCE.getSmallIconType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute SMALL_ICON_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getSmallIconType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute SMALL_ICON_TYPE__ID = FacesConfigPackage.eINSTANCE.getSmallIconType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.StateManagerTypeImpl <em>State Manager Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.StateManagerTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getStateManagerType()
-	 * @generated
-	 */
-	EClass STATE_MANAGER_TYPE = FacesConfigPackage.eINSTANCE.getStateManagerType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute STATE_MANAGER_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getStateManagerType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute STATE_MANAGER_TYPE__ID = FacesConfigPackage.eINSTANCE.getStateManagerType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.SuggestedValueTypeImpl <em>Suggested Value Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.SuggestedValueTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getSuggestedValueType()
-	 * @generated
-	 */
-	EClass SUGGESTED_VALUE_TYPE = FacesConfigPackage.eINSTANCE.getSuggestedValueType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute SUGGESTED_VALUE_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getSuggestedValueType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute SUGGESTED_VALUE_TYPE__ID = FacesConfigPackage.eINSTANCE.getSuggestedValueType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.SupportedLocaleTypeImpl <em>Supported Locale Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.SupportedLocaleTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getSupportedLocaleType()
-	 * @generated
-	 */
-	EClass SUPPORTED_LOCALE_TYPE = FacesConfigPackage.eINSTANCE.getSupportedLocaleType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute SUPPORTED_LOCALE_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getSupportedLocaleType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute SUPPORTED_LOCALE_TYPE__ID = FacesConfigPackage.eINSTANCE.getSupportedLocaleType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ToViewIdTypeImpl <em>To View Id Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ToViewIdTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getToViewIdType()
-	 * @generated
-	 */
-	EClass TO_VIEW_ID_TYPE = FacesConfigPackage.eINSTANCE.getToViewIdType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute TO_VIEW_ID_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getToViewIdType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute TO_VIEW_ID_TYPE__ID = FacesConfigPackage.eINSTANCE.getToViewIdType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ValidatorClassTypeImpl <em>Validator Class Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ValidatorClassTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getValidatorClassType()
-	 * @generated
-	 */
-	EClass VALIDATOR_CLASS_TYPE = FacesConfigPackage.eINSTANCE.getValidatorClassType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute VALIDATOR_CLASS_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getValidatorClassType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute VALIDATOR_CLASS_TYPE__ID = FacesConfigPackage.eINSTANCE.getValidatorClassType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ValidatorIdTypeImpl <em>Validator Id Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ValidatorIdTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getValidatorIdType()
-	 * @generated
-	 */
-	EClass VALIDATOR_ID_TYPE = FacesConfigPackage.eINSTANCE.getValidatorIdType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute VALIDATOR_ID_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getValidatorIdType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute VALIDATOR_ID_TYPE__ID = FacesConfigPackage.eINSTANCE.getValidatorIdType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ValidatorTypeImpl <em>Validator Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ValidatorTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getValidatorType()
-	 * @generated
-	 */
-	EClass VALIDATOR_TYPE = FacesConfigPackage.eINSTANCE.getValidatorType();
-
-	/**
-	 * The meta object literal for the '<em><b>Description</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference VALIDATOR_TYPE__DESCRIPTION = FacesConfigPackage.eINSTANCE.getValidatorType_Description();
-
-	/**
-	 * The meta object literal for the '<em><b>Display Name</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference VALIDATOR_TYPE__DISPLAY_NAME = FacesConfigPackage.eINSTANCE.getValidatorType_DisplayName();
-
-	/**
-	 * The meta object literal for the '<em><b>Icon</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference VALIDATOR_TYPE__ICON = FacesConfigPackage.eINSTANCE.getValidatorType_Icon();
-
-	/**
-	 * The meta object literal for the '<em><b>Validator Id</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference VALIDATOR_TYPE__VALIDATOR_ID = FacesConfigPackage.eINSTANCE.getValidatorType_ValidatorId();
-
-	/**
-	 * The meta object literal for the '<em><b>Validator Class</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference VALIDATOR_TYPE__VALIDATOR_CLASS = FacesConfigPackage.eINSTANCE.getValidatorType_ValidatorClass();
-
-	/**
-	 * The meta object literal for the '<em><b>Attribute</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference VALIDATOR_TYPE__ATTRIBUTE = FacesConfigPackage.eINSTANCE.getValidatorType_Attribute();
-
-	/**
-	 * The meta object literal for the '<em><b>Property</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference VALIDATOR_TYPE__PROPERTY = FacesConfigPackage.eINSTANCE.getValidatorType_Property();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute VALIDATOR_TYPE__ID = FacesConfigPackage.eINSTANCE.getValidatorType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ValueClassTypeImpl <em>Value Class Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ValueClassTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getValueClassType()
-	 * @generated
-	 */
-	EClass VALUE_CLASS_TYPE = FacesConfigPackage.eINSTANCE.getValueClassType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute VALUE_CLASS_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getValueClassType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute VALUE_CLASS_TYPE__ID = FacesConfigPackage.eINSTANCE.getValueClassType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ValueTypeImpl <em>Value Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ValueTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getValueType()
-	 * @generated
-	 */
-	EClass VALUE_TYPE = FacesConfigPackage.eINSTANCE.getValueType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute VALUE_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getValueType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute VALUE_TYPE__ID = FacesConfigPackage.eINSTANCE.getValueType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.VariableResolverTypeImpl <em>Variable Resolver Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.VariableResolverTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getVariableResolverType()
-	 * @generated
-	 */
-	EClass VARIABLE_RESOLVER_TYPE = FacesConfigPackage.eINSTANCE.getVariableResolverType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute VARIABLE_RESOLVER_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getVariableResolverType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute VARIABLE_RESOLVER_TYPE__ID = FacesConfigPackage.eINSTANCE.getVariableResolverType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ViewHandlerTypeImpl <em>View Handler Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ViewHandlerTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getViewHandlerType()
-	 * @generated
-	 */
-	EClass VIEW_HANDLER_TYPE = FacesConfigPackage.eINSTANCE.getViewHandlerType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute VIEW_HANDLER_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getViewHandlerType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute VIEW_HANDLER_TYPE__ID = FacesConfigPackage.eINSTANCE.getViewHandlerType_Id();
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/LocaleConfigTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/LocaleConfigTypeItemProvider.java
deleted file mode 100644
index adc2f0e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/LocaleConfigTypeItemProvider.java
+++ /dev/null
@@ -1,254 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITableItemLabelProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.LocaleConfigType;
-import org.eclipse.jst.jsf.facesconfig.emf.SupportedLocaleType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.LocaleConfigType} object.
- * <!-- begin-user-doc -->
- * @extends ITableItemLabelProvider
- * <!-- end-user-doc -->
- * @generated
- */
-public class LocaleConfigTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider, IStructuredItemContentProvider, ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource, ITableItemLabelProvider {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public LocaleConfigTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_LocaleConfigType_id_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_LocaleConfigType_id_feature", "_UI_LocaleConfigType_type"),  //$NON-NLS-1$ //$NON-NLS-2$//$NON-NLS-3$
-				 FacesConfigPackage.Literals.LOCALE_CONFIG_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures.add(FacesConfigPackage.Literals.LOCALE_CONFIG_TYPE__DEFAULT_LOCALE);
-			childrenFeatures.add(FacesConfigPackage.Literals.LOCALE_CONFIG_TYPE__SUPPORTED_LOCALE);
-		}
-		return childrenFeatures;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-		// Check the type of the specified child object and return the proper feature to use for
-		// adding (see {@link AddCommand}) it as a child.
-
-		return super.getChildFeature(object, child);
-	}
-
-    /**
-	 * This returns LocaleConfigType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/LocaleConfigType")); //$NON-NLS-1$
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String getText(Object object) {
-		String label = null;
-		
-		final StringBuffer buf = new StringBuffer();
-		final LocaleConfigType l = (LocaleConfigType)object;
-		
-		if (l.getDefaultLocale() != null)
-			buf.append(l.getDefaultLocale().getTextContent());
-
-		for (final Object locObj : l.getSupportedLocale()) {
-			final SupportedLocaleType loc = (SupportedLocaleType)locObj;
-			if (loc.getTextContent() != null) {
-				if (buf.toString() != null) {
-					buf.append(',');
-				}
-				buf.append(loc.getTextContent());
-			}
-		}
-		label = buf.toString();
-		
-		return label == null || label.length() == 0 ?
-				getString("_UI_LocaleConfigType_type")  //$NON-NLS-1$
-				: label;
-
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(LocaleConfigType.class)) {
-			case FacesConfigPackage.LOCALE_CONFIG_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-			case FacesConfigPackage.LOCALE_CONFIG_TYPE__DEFAULT_LOCALE:
-			case FacesConfigPackage.LOCALE_CONFIG_TYPE__SUPPORTED_LOCALE:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.LOCALE_CONFIG_TYPE__DEFAULT_LOCALE,
-				 FacesConfigFactory.eINSTANCE.createDefaultLocaleType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.LOCALE_CONFIG_TYPE__SUPPORTED_LOCALE,
-				 FacesConfigFactory.eINSTANCE.createSupportedLocaleType()));
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnImage(java.lang.Object, int)
-	 */
-	public Object getColumnImage(Object object, int columnIndex) {
-		// TODO Auto-generated method stub
-		if(columnIndex ==0)
-			return getImage(object);
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnText(java.lang.Object, int)
-	 */
-	public String getColumnText(Object object, int columnIndex) {
-		switch (columnIndex) {
-
-		case 0:
-			return getText(object);
-		case 1:
-			return getString("_UI_LocaleConfigType_type"); //$NON-NLS-1$
-		}
-
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ManagedBeanClassTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ManagedBeanClassTypeItemProvider.java
deleted file mode 100644
index 79c2e98..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ManagedBeanClassTypeItemProvider.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanClassType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanClassType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class ManagedBeanClassTypeItemProvider
-    extends ItemProviderAdapter
-    implements	
-        IEditingDomainItemProvider,	
-        IStructuredItemContentProvider,	
-        ITreeItemContentProvider,	
-        IItemLabelProvider,	
-        IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public ManagedBeanClassTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ManagedBeanClassType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ManagedBeanClassType_textContent_feature", "_UI_ManagedBeanClassType_type"),
-				 FacesConfigPackage.Literals.MANAGED_BEAN_CLASS_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ManagedBeanClassType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ManagedBeanClassType_id_feature", "_UI_ManagedBeanClassType_type"),
-				 FacesConfigPackage.Literals.MANAGED_BEAN_CLASS_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns ManagedBeanClassType.gif.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/ManagedBeanClassType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public String getText(Object object) {
-		String label = ((ManagedBeanClassType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_ManagedBeanClassType_type") :
-			getString("_UI_ManagedBeanClassType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(ManagedBeanClassType.class)) {
-			case FacesConfigPackage.MANAGED_BEAN_CLASS_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.MANAGED_BEAN_CLASS_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ManagedBeanExtensionTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ManagedBeanExtensionTypeItemProvider.java
deleted file mode 100644
index 844f736..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ManagedBeanExtensionTypeItemProvider.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanExtensionType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanExtensionType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class ManagedBeanExtensionTypeItemProvider
-    extends ExtensionTypeItemProvider
-    implements	
-        IEditingDomainItemProvider,	
-        IStructuredItemContentProvider,	
-        ITreeItemContentProvider,	
-        IItemLabelProvider,	
-        IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    @SuppressWarnings("hiding")
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public ManagedBeanExtensionTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This returns ManagedBeanExtensionType.gif.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/ManagedBeanExtensionType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public String getText(Object object) {
-		String label = ((ManagedBeanExtensionType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_ManagedBeanExtensionType_type") :
-			getString("_UI_ManagedBeanExtensionType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ManagedBeanNameTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ManagedBeanNameTypeItemProvider.java
deleted file mode 100644
index 8393274..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ManagedBeanNameTypeItemProvider.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanNameType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanNameType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class ManagedBeanNameTypeItemProvider
-    extends ItemProviderAdapter
-    implements	
-        IEditingDomainItemProvider,	
-        IStructuredItemContentProvider,	
-        ITreeItemContentProvider,	
-        IItemLabelProvider,	
-        IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public ManagedBeanNameTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ManagedBeanNameType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ManagedBeanNameType_textContent_feature", "_UI_ManagedBeanNameType_type"),
-				 FacesConfigPackage.Literals.MANAGED_BEAN_NAME_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ManagedBeanNameType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ManagedBeanNameType_id_feature", "_UI_ManagedBeanNameType_type"),
-				 FacesConfigPackage.Literals.MANAGED_BEAN_NAME_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns ManagedBeanNameType.gif.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/ManagedBeanNameType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public String getText(Object object) {
-		String label = ((ManagedBeanNameType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_ManagedBeanNameType_type") :
-			getString("_UI_ManagedBeanNameType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(ManagedBeanNameType.class)) {
-			case FacesConfigPackage.MANAGED_BEAN_NAME_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.MANAGED_BEAN_NAME_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ManagedBeanScopeTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ManagedBeanScopeTypeItemProvider.java
deleted file mode 100644
index a402249..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ManagedBeanScopeTypeItemProvider.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanScopeType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanScopeType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class ManagedBeanScopeTypeItemProvider
-    extends ItemProviderAdapter
-    implements	
-        IEditingDomainItemProvider,	
-        IStructuredItemContentProvider,	
-        ITreeItemContentProvider,	
-        IItemLabelProvider,	
-        IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public ManagedBeanScopeTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ManagedBeanScopeType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ManagedBeanScopeType_textContent_feature", "_UI_ManagedBeanScopeType_type"),
-				 FacesConfigPackage.Literals.MANAGED_BEAN_SCOPE_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ManagedBeanScopeType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ManagedBeanScopeType_id_feature", "_UI_ManagedBeanScopeType_type"),
-				 FacesConfigPackage.Literals.MANAGED_BEAN_SCOPE_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns ManagedBeanScopeType.gif.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/ManagedBeanScopeType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public String getText(Object object) {
-		String label = ((ManagedBeanScopeType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_ManagedBeanScopeType_type") :
-			getString("_UI_ManagedBeanScopeType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(ManagedBeanScopeType.class)) {
-			case FacesConfigPackage.MANAGED_BEAN_SCOPE_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.MANAGED_BEAN_SCOPE_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ManagedBeanTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ManagedBeanTypeItemProvider.java
deleted file mode 100644
index e3238b3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ManagedBeanTypeItemProvider.java
+++ /dev/null
@@ -1,324 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITableItemLabelProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType} object.
- * <!-- begin-user-doc -->
- * @extends ITableItemLabelProvider
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class ManagedBeanTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider, IStructuredItemContentProvider, ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource, ITableItemLabelProvider {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ManagedBeanTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addIdPropertyDescriptor(object);
-			addEagerPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ManagedBeanType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ManagedBeanType_id_feature", "_UI_ManagedBeanType_type"),
-				 FacesConfigPackage.Literals.MANAGED_BEAN_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Eager feature.
-	 * <!-- begin-user-doc -->
-	 * @param object
-	 * <!-- end-user-doc --> 
-	 * @generated
-	 */
-	protected void addEagerPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ManagedBeanType_eager_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ManagedBeanType_eager_feature", "_UI_ManagedBeanType_type"),
-				 FacesConfigPackage.Literals.MANAGED_BEAN_TYPE__EAGER,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.BOOLEAN_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-				/**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures.add(FacesConfigPackage.Literals.MANAGED_BEAN_TYPE__DESCRIPTION);
-			childrenFeatures.add(FacesConfigPackage.Literals.MANAGED_BEAN_TYPE__DISPLAY_NAME);
-			childrenFeatures.add(FacesConfigPackage.Literals.MANAGED_BEAN_TYPE__ICON);
-			childrenFeatures.add(FacesConfigPackage.Literals.MANAGED_BEAN_TYPE__MANAGED_BEAN_NAME);
-			childrenFeatures.add(FacesConfigPackage.Literals.MANAGED_BEAN_TYPE__MANAGED_BEAN_CLASS);
-			childrenFeatures.add(FacesConfigPackage.Literals.MANAGED_BEAN_TYPE__MANAGED_BEAN_SCOPE);
-			childrenFeatures.add(FacesConfigPackage.Literals.MANAGED_BEAN_TYPE__MANAGED_PROPERTY);
-			childrenFeatures.add(FacesConfigPackage.Literals.MANAGED_BEAN_TYPE__MAP_ENTRIES);
-			childrenFeatures.add(FacesConfigPackage.Literals.MANAGED_BEAN_TYPE__LIST_ENTRIES);
-			childrenFeatures.add(FacesConfigPackage.Literals.MANAGED_BEAN_TYPE__MANAGED_BEAN_EXTENSION);
-		}
-		return childrenFeatures;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-		// Check the type of the specified child object and return the proper feature to use for
-		// adding (see {@link AddCommand}) it as a child.
-
-		return super.getChildFeature(object, child);
-	}
-
-    /**
-	 * This returns ManagedBeanType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/ManagedBeanType"));
-	}
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated NOT
-     */
-	public String getText(Object object) {
-        String label = null;
-        if (((ManagedBeanType) object).getManagedBeanName() != null)
-        {
-            label = ((ManagedBeanType) object).getManagedBeanName()
-                    .getTextContent();
-        }
-        if (label == null || label.length() == 0) {
-            if (((ManagedBeanType) object).getManagedBeanClass() != null)
-                label = ((ManagedBeanType) object).getManagedBeanClass()
-                        .getTextContent();
-        }
-        return label == null || label.length() == 0 ? getString("_UI_ManagedBeanType_type") //$NON-NLS-1$
-                : label;
-    }
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(ManagedBeanType.class)) {
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__ID:
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__EAGER:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__DESCRIPTION:
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__DISPLAY_NAME:
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__ICON:
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_BEAN_NAME:
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_BEAN_CLASS:
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_BEAN_SCOPE:
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_PROPERTY:
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__MAP_ENTRIES:
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__LIST_ENTRIES:
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_BEAN_EXTENSION:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.MANAGED_BEAN_TYPE__DESCRIPTION,
-				 FacesConfigFactory.eINSTANCE.createDescriptionType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.MANAGED_BEAN_TYPE__DISPLAY_NAME,
-				 FacesConfigFactory.eINSTANCE.createDisplayNameType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.MANAGED_BEAN_TYPE__ICON,
-				 FacesConfigFactory.eINSTANCE.createIconType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.MANAGED_BEAN_TYPE__MANAGED_BEAN_NAME,
-				 FacesConfigFactory.eINSTANCE.createManagedBeanNameType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.MANAGED_BEAN_TYPE__MANAGED_BEAN_CLASS,
-				 FacesConfigFactory.eINSTANCE.createManagedBeanClassType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.MANAGED_BEAN_TYPE__MANAGED_BEAN_SCOPE,
-				 FacesConfigFactory.eINSTANCE.createManagedBeanScopeType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.MANAGED_BEAN_TYPE__MANAGED_PROPERTY,
-				 FacesConfigFactory.eINSTANCE.createManagedPropertyType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.MANAGED_BEAN_TYPE__MAP_ENTRIES,
-				 FacesConfigFactory.eINSTANCE.createMapEntriesType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.MANAGED_BEAN_TYPE__LIST_ENTRIES,
-				 FacesConfigFactory.eINSTANCE.createListEntriesType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.MANAGED_BEAN_TYPE__MANAGED_BEAN_EXTENSION,
-				 FacesConfigFactory.eINSTANCE.createManagedBeanExtensionType()));
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-	public Object getColumnImage(Object object, int columnIndex) {
-		if(columnIndex ==0)
-			return getImage(object);
-		return null;
-	}
-
-	public String getColumnText(Object object, int columnIndex) {
-		ManagedBeanType managedBean = (ManagedBeanType) object;
-		switch (columnIndex) {
-
-		case 0:
-			return managedBean.getManagedBeanName() == null ? "" : managedBean //$NON-NLS-1$
-					.getManagedBeanName().getTextContent();
-		case 1:
-			return managedBean.getManagedBeanScope() == null ? "" : managedBean //$NON-NLS-1$
-					.getManagedBeanScope().getTextContent();
-
-		case 2:
-			return managedBean.getManagedBeanClass() == null ? "" : managedBean //$NON-NLS-1$
-					.getManagedBeanClass().getTextContent();
-		}
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ManagedPropertyTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ManagedPropertyTypeItemProvider.java
deleted file mode 100644
index 2b05a4f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ManagedPropertyTypeItemProvider.java
+++ /dev/null
@@ -1,293 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITableItemLabelProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType} object.
- * <!-- begin-user-doc -->
- * @extends ITableItemLabelProvider
- * <!-- end-user-doc -->
- * @generated
- */
-public class ManagedPropertyTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider, IStructuredItemContentProvider, ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource, ITableItemLabelProvider{
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ManagedPropertyTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ManagedPropertyType_id_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_ManagedPropertyType_id_feature", "_UI_ManagedPropertyType_type"),  //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$
-				 FacesConfigPackage.Literals.MANAGED_PROPERTY_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures.add(FacesConfigPackage.Literals.MANAGED_PROPERTY_TYPE__DESCRIPTION);
-			childrenFeatures.add(FacesConfigPackage.Literals.MANAGED_PROPERTY_TYPE__DISPLAY_NAME);
-			childrenFeatures.add(FacesConfigPackage.Literals.MANAGED_PROPERTY_TYPE__ICON);
-			childrenFeatures.add(FacesConfigPackage.Literals.MANAGED_PROPERTY_TYPE__PROPERTY_NAME);
-			childrenFeatures.add(FacesConfigPackage.Literals.MANAGED_PROPERTY_TYPE__PROPERTY_CLASS);
-			childrenFeatures.add(FacesConfigPackage.Literals.MANAGED_PROPERTY_TYPE__MAP_ENTRIES);
-			childrenFeatures.add(FacesConfigPackage.Literals.MANAGED_PROPERTY_TYPE__NULL_VALUE);
-			childrenFeatures.add(FacesConfigPackage.Literals.MANAGED_PROPERTY_TYPE__VALUE);
-			childrenFeatures.add(FacesConfigPackage.Literals.MANAGED_PROPERTY_TYPE__LIST_ENTRIES);
-		}
-		return childrenFeatures;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-		// Check the type of the specified child object and return the proper feature to use for
-		// adding (see {@link AddCommand}) it as a child.
-
-		return super.getChildFeature(object, child);
-	}
-
-    /**
-	 * This returns ManagedPropertyType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/ManagedPropertyType")); //$NON-NLS-1$
-	}
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated NOT
-     */
-	public String getText(Object object) {
-        String label = ((ManagedPropertyType) object).getId();
-        if (((ManagedPropertyType) object).getPropertyName() != null) {
-            label = ((ManagedPropertyType) object).getPropertyName()
-                    .getTextContent();
-        }
-        return label == null || label.length() == 0 ? getString("_UI_ManagedPropertyType_type") //$NON-NLS-1$
-                : label;
-
-    }
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(ManagedPropertyType.class)) {
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__DESCRIPTION:
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__DISPLAY_NAME:
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__ICON:
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__PROPERTY_NAME:
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__PROPERTY_CLASS:
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__MAP_ENTRIES:
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__NULL_VALUE:
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__VALUE:
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__LIST_ENTRIES:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.MANAGED_PROPERTY_TYPE__DESCRIPTION,
-				 FacesConfigFactory.eINSTANCE.createDescriptionType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.MANAGED_PROPERTY_TYPE__DISPLAY_NAME,
-				 FacesConfigFactory.eINSTANCE.createDisplayNameType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.MANAGED_PROPERTY_TYPE__ICON,
-				 FacesConfigFactory.eINSTANCE.createIconType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.MANAGED_PROPERTY_TYPE__PROPERTY_NAME,
-				 FacesConfigFactory.eINSTANCE.createPropertyNameType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.MANAGED_PROPERTY_TYPE__PROPERTY_CLASS,
-				 FacesConfigFactory.eINSTANCE.createPropertyClassType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.MANAGED_PROPERTY_TYPE__MAP_ENTRIES,
-				 FacesConfigFactory.eINSTANCE.createMapEntriesType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.MANAGED_PROPERTY_TYPE__NULL_VALUE,
-				 FacesConfigFactory.eINSTANCE.createNullValueType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.MANAGED_PROPERTY_TYPE__VALUE,
-				 FacesConfigFactory.eINSTANCE.createValueType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.MANAGED_PROPERTY_TYPE__LIST_ENTRIES,
-				 FacesConfigFactory.eINSTANCE.createListEntriesType()));
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-	public String getColumnText(Object object, int columnIndex) {
-		ManagedPropertyType attribute = (ManagedPropertyType) object;
-		switch (columnIndex) {
-
-		case 0:
-			return attribute.getPropertyName() == null ? "" : attribute //$NON-NLS-1$
-					.getPropertyName().getTextContent();
-		case 1:
-			return attribute.getPropertyClass() == null ? "" : attribute //$NON-NLS-1$
-					.getPropertyClass().getTextContent();
-		case 2:
-			if(attribute.getValue() != null)
-			{
-				return attribute.getValue().getTextContent();
-			}
-			else if(attribute.getNullValue() != null)
-				return "<null-value>"; //$NON-NLS-1$
-			else if(attribute.getMapEntries() != null)
-				return "<map-entries>"; //$NON-NLS-1$
-			else if(attribute.getListEntries() != null)
-				return "<list-entries>"; //$NON-NLS-1$
-			return ""; //$NON-NLS-1$
-		}
-		return null;
-	}
-
-	public Object getColumnImage(Object object, int columnIndex) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/MapEntriesTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/MapEntriesTypeItemProvider.java
deleted file mode 100644
index 652dab8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/MapEntriesTypeItemProvider.java
+++ /dev/null
@@ -1,219 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.MapEntriesType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.MapEntriesType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class MapEntriesTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public MapEntriesTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_MapEntriesType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_MapEntriesType_id_feature", "_UI_MapEntriesType_type"),
-				 FacesConfigPackage.Literals.MAP_ENTRIES_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures.add(FacesConfigPackage.Literals.MAP_ENTRIES_TYPE__KEY_CLASS);
-			childrenFeatures.add(FacesConfigPackage.Literals.MAP_ENTRIES_TYPE__VALUE_CLASS);
-			childrenFeatures.add(FacesConfigPackage.Literals.MAP_ENTRIES_TYPE__MAP_ENTRY);
-		}
-		return childrenFeatures;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-		// Check the type of the specified child object and return the proper feature to use for
-		// adding (see {@link AddCommand}) it as a child.
-
-		return super.getChildFeature(object, child);
-	}
-
-				/**
-	 * This returns MapEntriesType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/MapEntriesType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((MapEntriesType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_MapEntriesType_type") :
-			getString("_UI_MapEntriesType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(MapEntriesType.class)) {
-			case FacesConfigPackage.MAP_ENTRIES_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-			case FacesConfigPackage.MAP_ENTRIES_TYPE__KEY_CLASS:
-			case FacesConfigPackage.MAP_ENTRIES_TYPE__VALUE_CLASS:
-			case FacesConfigPackage.MAP_ENTRIES_TYPE__MAP_ENTRY:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.MAP_ENTRIES_TYPE__KEY_CLASS,
-				 FacesConfigFactory.eINSTANCE.createKeyClassType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.MAP_ENTRIES_TYPE__VALUE_CLASS,
-				 FacesConfigFactory.eINSTANCE.createValueClassType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.MAP_ENTRIES_TYPE__MAP_ENTRY,
-				 FacesConfigFactory.eINSTANCE.createMapEntryType()));
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/MapEntryTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/MapEntryTypeItemProvider.java
deleted file mode 100644
index 13b4bbb..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/MapEntryTypeItemProvider.java
+++ /dev/null
@@ -1,247 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITableItemLabelProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.KeyType;
-import org.eclipse.jst.jsf.facesconfig.emf.MapEntryType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.MapEntryType} object.
- * <!-- begin-user-doc -->
- * @extends ITableItemLabelProvider
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class MapEntryTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource,
-		ITableItemLabelProvider{
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public MapEntryTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_MapEntryType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_MapEntryType_id_feature", "_UI_MapEntryType_type"),
-				 FacesConfigPackage.Literals.MAP_ENTRY_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures.add(FacesConfigPackage.Literals.MAP_ENTRY_TYPE__KEY);
-			childrenFeatures.add(FacesConfigPackage.Literals.MAP_ENTRY_TYPE__NULL_VALUE);
-			childrenFeatures.add(FacesConfigPackage.Literals.MAP_ENTRY_TYPE__VALUE);
-		}
-		return childrenFeatures;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-		// Check the type of the specified child object and return the proper feature to use for
-		// adding (see {@link AddCommand}) it as a child.
-
-		return super.getChildFeature(object, child);
-	}
-
-				/**
-	 * This returns MapEntryType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/MapEntryType"));
-	}
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated NOT
-     */
-	public String getText(Object object) {
-        KeyType key = ((MapEntryType)object).getKey();
-        
-        String label = key != null ? key.getTextContent() : null;
-        return label == null || label.length() == 0 ?
-            getString("_UI_MapEntryType_type") : label; //$NON-NLS-1$
-    }
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(MapEntryType.class)) {
-			case FacesConfigPackage.MAP_ENTRY_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-			case FacesConfigPackage.MAP_ENTRY_TYPE__KEY:
-			case FacesConfigPackage.MAP_ENTRY_TYPE__NULL_VALUE:
-			case FacesConfigPackage.MAP_ENTRY_TYPE__VALUE:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.MAP_ENTRY_TYPE__KEY,
-				 FacesConfigFactory.eINSTANCE.createKeyType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.MAP_ENTRY_TYPE__NULL_VALUE,
-				 FacesConfigFactory.eINSTANCE.createNullValueType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.MAP_ENTRY_TYPE__VALUE,
-				 FacesConfigFactory.eINSTANCE.createValueType()));
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-	public String getColumnText(Object object, int columnIndex) {
-
-		MapEntryType mapEntry = (MapEntryType) object;
-		switch (columnIndex) {
-
-		case 0:
-			return mapEntry.getKey() == null ? "" : mapEntry.getKey() //$NON-NLS-1$
-					.getTextContent();
-		case 1:
-			if (mapEntry.getNullValue() != null)
-            {
-				return "<null-value>"; //$NON-NLS-1$
-            }
-			return mapEntry.getValue() == null ? "" : mapEntry.getValue() //$NON-NLS-1$
-					.getTextContent();
-		}
-		return null;
-	}	
-    public Object getColumnImage(Object object, int columnIndex) {
-		// no column images
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/MessageBundleTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/MessageBundleTypeItemProvider.java
deleted file mode 100644
index 56d4ce0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/MessageBundleTypeItemProvider.java
+++ /dev/null
@@ -1,209 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITableItemLabelProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.MessageBundleType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.MessageBundleType} object.
- * <!-- begin-user-doc -->
- * @extends ITableItemLabelProvider
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class MessageBundleTypeItemProvider extends ItemProviderAdapter
-		implements IEditingDomainItemProvider, IStructuredItemContentProvider, ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource, ITableItemLabelProvider {
-    /**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc --> 
- 	 * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public MessageBundleTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc --> 
-	 * @param object
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_MessageBundleType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_MessageBundleType_textContent_feature", "_UI_MessageBundleType_type"),
-				 FacesConfigPackage.Literals.MESSAGE_BUNDLE_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc--> 
-     * @param object
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_MessageBundleType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_MessageBundleType_id_feature", "_UI_MessageBundleType_type"),
-				 FacesConfigPackage.Literals.MESSAGE_BUNDLE_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns MessageBundleType.gif.
-	 * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/MessageBundleType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String getText(Object object) {
-		String label = ((MessageBundleType) object).getTextContent();
-		return label == null || label.length() == 0 ? getString("_UI_MessageBundleType_type")
-				: label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(MessageBundleType.class)) {
-			case FacesConfigPackage.MESSAGE_BUNDLE_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.MESSAGE_BUNDLE_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnImage(java.lang.Object, int)
-	 */
-	public Object getColumnImage(Object object, int columnIndex) {
-		if(columnIndex ==0)
-			return getImage(object);
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnText(java.lang.Object, int)
-	 */
-	public String getColumnText(Object object, int columnIndex) {
-		switch (columnIndex) {
-
-		case 0:
-			return getText(object);
-		case 1:
-			return getString("_UI_MessageBundleType_type"); //$NON-NLS-1$
-		}
-
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/NameTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/NameTypeItemProvider.java
deleted file mode 100644
index 1f8f3bf..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/NameTypeItemProvider.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.NameType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.NameType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class NameTypeItemProvider
-	extends ItemProviderAdapter
-	implements
-		IEditingDomainItemProvider,
-		IStructuredItemContentProvider,
-		ITreeItemContentProvider,
-		IItemLabelProvider,
-		IItemPropertySource {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * @param adapterFactory
-	 * <!-- end-user-doc --> 
-	 * @generated
-	 */
-	public NameTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-	 * @param object
-	 * <!-- end-user-doc --> 
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_NameType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_NameType_textContent_feature", "_UI_NameType_type"),
-				 FacesConfigPackage.Literals.NAME_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-	 * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_NameType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_NameType_id_feature", "_UI_NameType_type"),
-				 FacesConfigPackage.Literals.NAME_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This returns NameType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/NameType"));
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((NameType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_NameType_type") :
-			getString("_UI_NameType_type") + " " + label;
-	}
-
-	/**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(NameType.class)) {
-			case FacesConfigPackage.NAME_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.NAME_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-	/**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/NavigationCaseTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/NavigationCaseTypeItemProvider.java
deleted file mode 100644
index 1247a1b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/NavigationCaseTypeItemProvider.java
+++ /dev/null
@@ -1,282 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITableItemLabelProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType;
-import org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType} object.
- * <!-- begin-user-doc -->
- * @extends ITableItemLabelProvider
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class NavigationCaseTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider, IStructuredItemContentProvider, ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource, ITableItemLabelProvider {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NavigationCaseTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_NavigationCaseType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_NavigationCaseType_id_feature", "_UI_NavigationCaseType_type"),
-				 FacesConfigPackage.Literals.NAVIGATION_CASE_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures.add(FacesConfigPackage.Literals.NAVIGATION_CASE_TYPE__DESCRIPTION);
-			childrenFeatures.add(FacesConfigPackage.Literals.NAVIGATION_CASE_TYPE__DISPLAY_NAME);
-			childrenFeatures.add(FacesConfigPackage.Literals.NAVIGATION_CASE_TYPE__ICON);
-			childrenFeatures.add(FacesConfigPackage.Literals.NAVIGATION_CASE_TYPE__FROM_ACTION);
-			childrenFeatures.add(FacesConfigPackage.Literals.NAVIGATION_CASE_TYPE__FROM_OUTCOME);
-			childrenFeatures.add(FacesConfigPackage.Literals.NAVIGATION_CASE_TYPE__IF);
-			childrenFeatures.add(FacesConfigPackage.Literals.NAVIGATION_CASE_TYPE__TO_VIEW_ID);
-			childrenFeatures.add(FacesConfigPackage.Literals.NAVIGATION_CASE_TYPE__REDIRECT);
-		}
-		return childrenFeatures;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-		// Check the type of the specified child object and return the proper feature to use for
-		// adding (see {@link AddCommand}) it as a child.
-
-		return super.getChildFeature(object, child);
-	}
-
-    /**
-	 * This returns NavigationCaseType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/NavigationCaseType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((NavigationCaseType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_NavigationCaseType_type") :
-			getString("_UI_NavigationCaseType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(NavigationCaseType.class)) {
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE__DESCRIPTION:
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE__DISPLAY_NAME:
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE__ICON:
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE__FROM_ACTION:
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE__FROM_OUTCOME:
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE__IF:
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE__TO_VIEW_ID:
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE__REDIRECT:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.NAVIGATION_CASE_TYPE__DESCRIPTION,
-				 FacesConfigFactory.eINSTANCE.createDescriptionType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.NAVIGATION_CASE_TYPE__DISPLAY_NAME,
-				 FacesConfigFactory.eINSTANCE.createDisplayNameType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.NAVIGATION_CASE_TYPE__ICON,
-				 FacesConfigFactory.eINSTANCE.createIconType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.NAVIGATION_CASE_TYPE__FROM_ACTION,
-				 FacesConfigFactory.eINSTANCE.createFromActionType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.NAVIGATION_CASE_TYPE__FROM_OUTCOME,
-				 FacesConfigFactory.eINSTANCE.createFromOutcomeType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.NAVIGATION_CASE_TYPE__IF,
-				 FacesConfigFactory.eINSTANCE.createIfType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.NAVIGATION_CASE_TYPE__TO_VIEW_ID,
-				 FacesConfigFactory.eINSTANCE.createToViewIdType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.NAVIGATION_CASE_TYPE__REDIRECT,
-				 FacesConfigFactory.eINSTANCE.createRedirectType()));
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnImage(java.lang.Object, int)
-	 */
-	public Object getColumnImage(Object object, int columnIndex) {
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnText(java.lang.Object, int)
-	 */
-	public String getColumnText(Object object, int columnIndex) {
-		NavigationCaseType navigationcase = (NavigationCaseType) object;
-		switch (columnIndex) {
-
-		case 0:
-			return ((NavigationRuleType) navigationcase.eContainer())
-					.getFromViewId() == null ? "" //$NON-NLS-1$
-					: ((NavigationRuleType) navigationcase.eContainer())
-							.getFromViewId().getTextContent();
-		case 1:
-			return navigationcase.getFromOutcome() == null ? "" : navigationcase //$NON-NLS-1$
-					.getFromOutcome().getTextContent();
-		case 2:
-			return navigationcase.getToViewId() == null ? "" : navigationcase //$NON-NLS-1$
-					.getToViewId().getTextContent();
-		}
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/NavigationHandlerTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/NavigationHandlerTypeItemProvider.java
deleted file mode 100644
index c61240b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/NavigationHandlerTypeItemProvider.java
+++ /dev/null
@@ -1,209 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITableItemLabelProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.NavigationHandlerType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.NavigationHandlerType} object.
- * <!-- begin-user-doc --> 
- * @extends ITableItemLabelProvider
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class NavigationHandlerTypeItemProvider extends ItemProviderAdapter
-		implements IEditingDomainItemProvider, IStructuredItemContentProvider, ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource, ITableItemLabelProvider {
-    /**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc --> 
-	 * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NavigationHandlerTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc --> 
-	 * @param object
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_NavigationHandlerType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_NavigationHandlerType_textContent_feature", "_UI_NavigationHandlerType_type"),
-				 FacesConfigPackage.Literals.NAVIGATION_HANDLER_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc --> 
-     * @param object
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_NavigationHandlerType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_NavigationHandlerType_id_feature", "_UI_NavigationHandlerType_type"),
-				 FacesConfigPackage.Literals.NAVIGATION_HANDLER_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns NavigationHandlerType.gif.
-	 * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/NavigationHandlerType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String getText(Object object) {
-		String label = ((NavigationHandlerType) object).getTextContent();
-		return label == null || label.length() == 0 ? getString("_UI_NavigationHandlerType_type")
-				: label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(NavigationHandlerType.class)) {
-			case FacesConfigPackage.NAVIGATION_HANDLER_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.NAVIGATION_HANDLER_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnImage(java.lang.Object, int)
-	 */
-	public Object getColumnImage(Object object, int columnIndex) {
-		if(columnIndex ==0)
-			return getImage(object);
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnText(java.lang.Object, int)
-	 */
-	public String getColumnText(Object object, int columnIndex) {
-		switch (columnIndex) {
-
-		case 0:
-			return getText(object);
-		case 1:
-			return getString("_UI_NavigationHandlerType_type"); //$NON-NLS-1$
-		}
-
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/NavigationRuleExtensionTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/NavigationRuleExtensionTypeItemProvider.java
deleted file mode 100644
index 5570808..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/NavigationRuleExtensionTypeItemProvider.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleExtensionType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleExtensionType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class NavigationRuleExtensionTypeItemProvider
-    extends ExtensionTypeItemProvider
-    implements	
-        IEditingDomainItemProvider,	
-        IStructuredItemContentProvider,	
-        ITreeItemContentProvider,	
-        IItemLabelProvider,	
-        IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    @SuppressWarnings("hiding")
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public NavigationRuleExtensionTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This returns NavigationRuleExtensionType.gif.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-    public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/NavigationRuleExtensionType")); //$NON-NLS-1$
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-    public String getText(Object object) {
-		String label = ((NavigationRuleExtensionType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_NavigationRuleExtensionType_type") : //$NON-NLS-1$
-			getString("_UI_NavigationRuleExtensionType_type") + " " + label;  //$NON-NLS-1$//$NON-NLS-2$
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/NavigationRuleTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/NavigationRuleTypeItemProvider.java
deleted file mode 100644
index 485aee4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/NavigationRuleTypeItemProvider.java
+++ /dev/null
@@ -1,254 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITableItemLabelProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType} object.
- * <!-- begin-user-doc -->
- * @extends ITableItemLabelProvider
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class NavigationRuleTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider, IStructuredItemContentProvider, ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource, ITableItemLabelProvider{
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NavigationRuleTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_NavigationRuleType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_NavigationRuleType_id_feature", "_UI_NavigationRuleType_type"),
-				 FacesConfigPackage.Literals.NAVIGATION_RULE_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures.add(FacesConfigPackage.Literals.NAVIGATION_RULE_TYPE__DESCRIPTION);
-			childrenFeatures.add(FacesConfigPackage.Literals.NAVIGATION_RULE_TYPE__DISPLAY_NAME);
-			childrenFeatures.add(FacesConfigPackage.Literals.NAVIGATION_RULE_TYPE__ICON);
-			childrenFeatures.add(FacesConfigPackage.Literals.NAVIGATION_RULE_TYPE__FROM_VIEW_ID);
-			childrenFeatures.add(FacesConfigPackage.Literals.NAVIGATION_RULE_TYPE__NAVIGATION_CASE);
-			childrenFeatures.add(FacesConfigPackage.Literals.NAVIGATION_RULE_TYPE__NAVIGATION_RULE_EXTENSION);
-		}
-		return childrenFeatures;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-		// Check the type of the specified child object and return the proper feature to use for
-		// adding (see {@link AddCommand}) it as a child.
-
-		return super.getChildFeature(object, child);
-	}
-
-    /**
-	 * This returns NavigationRuleType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/NavigationRuleType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((NavigationRuleType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_NavigationRuleType_type") :
-			getString("_UI_NavigationRuleType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(NavigationRuleType.class)) {
-			case FacesConfigPackage.NAVIGATION_RULE_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-			case FacesConfigPackage.NAVIGATION_RULE_TYPE__DESCRIPTION:
-			case FacesConfigPackage.NAVIGATION_RULE_TYPE__DISPLAY_NAME:
-			case FacesConfigPackage.NAVIGATION_RULE_TYPE__ICON:
-			case FacesConfigPackage.NAVIGATION_RULE_TYPE__FROM_VIEW_ID:
-			case FacesConfigPackage.NAVIGATION_RULE_TYPE__NAVIGATION_CASE:
-			case FacesConfigPackage.NAVIGATION_RULE_TYPE__NAVIGATION_RULE_EXTENSION:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.NAVIGATION_RULE_TYPE__DESCRIPTION,
-				 FacesConfigFactory.eINSTANCE.createDescriptionType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.NAVIGATION_RULE_TYPE__DISPLAY_NAME,
-				 FacesConfigFactory.eINSTANCE.createDisplayNameType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.NAVIGATION_RULE_TYPE__ICON,
-				 FacesConfigFactory.eINSTANCE.createIconType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.NAVIGATION_RULE_TYPE__FROM_VIEW_ID,
-				 FacesConfigFactory.eINSTANCE.createFromViewIdType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.NAVIGATION_RULE_TYPE__NAVIGATION_CASE,
-				 FacesConfigFactory.eINSTANCE.createNavigationCaseType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.NAVIGATION_RULE_TYPE__NAVIGATION_RULE_EXTENSION,
-				 FacesConfigFactory.eINSTANCE.createNavigationRuleExtensionType()));
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnImage(java.lang.Object, int)
-	 */
-	public Object getColumnImage(Object object, int columnIndex) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnText(java.lang.Object, int)
-	 */
-	public String getColumnText(Object object, int columnIndex) {
-		
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/NullValueTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/NullValueTypeItemProvider.java
deleted file mode 100644
index 7ce6233..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/NullValueTypeItemProvider.java
+++ /dev/null
@@ -1,173 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITableItemLabelProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.NullValueType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.NullValueType} object.
- * <!-- begin-user-doc -->
- * @extends ITableItemLabelProvider
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class NullValueTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider, IStructuredItemContentProvider, ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource, ITableItemLabelProvider {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NullValueTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_NullValueType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_NullValueType_id_feature", "_UI_NullValueType_type"),
-				 FacesConfigPackage.Literals.NULL_VALUE_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns NullValueType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/NullValueType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((NullValueType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_NullValueType_type") :
-			getString("_UI_NullValueType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(NullValueType.class)) {
-			case FacesConfigPackage.NULL_VALUE_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-	public String getColumnText(Object object, int columnIndex) {
-		return "<null-value>"; //$NON-NLS-1$
-	}
-
-	public Object getColumnImage(Object object, int columnIndex) {
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/OrderingOrderingTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/OrderingOrderingTypeItemProvider.java
deleted file mode 100644
index d351827..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/OrderingOrderingTypeItemProvider.java
+++ /dev/null
@@ -1,179 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.OrderingOrderingType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.OrderingOrderingType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class OrderingOrderingTypeItemProvider
-	extends ItemProviderAdapter
-	implements
-		IEditingDomainItemProvider,
-		IStructuredItemContentProvider,
-		ITreeItemContentProvider,
-		IItemLabelProvider,
-		IItemPropertySource {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * @param adapterFactory
-	 * <!-- end-user-doc --> 
-	 * @generated
-	 */
-	public OrderingOrderingTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures.add(FacesConfigPackage.Literals.ORDERING_ORDERING_TYPE__NAME);
-			childrenFeatures.add(FacesConfigPackage.Literals.ORDERING_ORDERING_TYPE__OTHERS);
-		}
-		return childrenFeatures;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-		// Check the type of the specified child object and return the proper feature to use for
-		// adding (see {@link AddCommand}) it as a child.
-
-		return super.getChildFeature(object, child);
-	}
-
-	/**
-	 * This returns OrderingOrderingType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/OrderingOrderingType")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String getText(Object object) {
-		return getString("_UI_OrderingOrderingType_type"); //$NON-NLS-1$
-	}
-
-	/**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(OrderingOrderingType.class)) {
-			case FacesConfigPackage.ORDERING_ORDERING_TYPE__NAME:
-			case FacesConfigPackage.ORDERING_ORDERING_TYPE__OTHERS:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-	/**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.ORDERING_ORDERING_TYPE__NAME,
-				 FacesConfigFactory.eINSTANCE.createNameType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.ORDERING_ORDERING_TYPE__OTHERS,
-				 FacesConfigFactory.eINSTANCE.createOrderingOthersType()));
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/OrderingOthersTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/OrderingOthersTypeItemProvider.java
deleted file mode 100644
index 4790f6b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/OrderingOthersTypeItemProvider.java
+++ /dev/null
@@ -1,167 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.OrderingOthersType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.OrderingOthersType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class OrderingOthersTypeItemProvider
-	extends ItemProviderAdapter
-	implements
-		IEditingDomainItemProvider,
-		IStructuredItemContentProvider,
-		ITreeItemContentProvider,
-		IItemLabelProvider,
-		IItemPropertySource {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * @param adapterFactory
-	 * <!-- end-user-doc --> 
-	 * @generated
-	 */
-	public OrderingOthersTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-	 * @param object
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_OrderingOthersType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_OrderingOthersType_id_feature", "_UI_OrderingOthersType_type"),
-				 FacesConfigPackage.Literals.ORDERING_OTHERS_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This returns OrderingOthersType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/OrderingOthersType"));
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((OrderingOthersType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_OrderingOthersType_type") :
-			getString("_UI_OrderingOthersType_type") + " " + label;
-	}
-
-	/**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(OrderingOthersType.class)) {
-			case FacesConfigPackage.ORDERING_OTHERS_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-	/**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/OrderingTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/OrderingTypeItemProvider.java
deleted file mode 100644
index 5e21cd1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/OrderingTypeItemProvider.java
+++ /dev/null
@@ -1,201 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.OrderingType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.OrderingType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class OrderingTypeItemProvider
-	extends ItemProviderAdapter
-	implements
-		IEditingDomainItemProvider,
-		IStructuredItemContentProvider,
-		ITreeItemContentProvider,
-		IItemLabelProvider,
-		IItemPropertySource {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * @param adapterFactory
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public OrderingTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures.add(FacesConfigPackage.Literals.ORDERING_TYPE__BEFORE);
-			childrenFeatures.add(FacesConfigPackage.Literals.ORDERING_TYPE__AFTER);
-		}
-		return childrenFeatures;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-		// Check the type of the specified child object and return the proper feature to use for
-		// adding (see {@link AddCommand}) it as a child.
-
-		return super.getChildFeature(object, child);
-	}
-
-	/**
-	 * This returns OrderingType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/OrderingType")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String getText(Object object) {
-		return getString("_UI_OrderingType_type"); //$NON-NLS-1$
-	}
-
-	/**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(OrderingType.class)) {
-			case FacesConfigPackage.ORDERING_TYPE__BEFORE:
-			case FacesConfigPackage.ORDERING_TYPE__AFTER:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-	/**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.ORDERING_TYPE__BEFORE,
-				 FacesConfigFactory.eINSTANCE.createOrderingOrderingType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.ORDERING_TYPE__AFTER,
-				 FacesConfigFactory.eINSTANCE.createOrderingOrderingType()));
-	}
-
-	/**
-	 * This returns the label text for {@link org.eclipse.emf.edit.command.CreateChildCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String getCreateChildText(Object owner, Object feature, Object child, Collection selection) {
-		Object childFeature = feature;
-		Object childObject = child;
-
-		boolean qualify =
-			childFeature == FacesConfigPackage.Literals.ORDERING_TYPE__BEFORE ||
-			childFeature == FacesConfigPackage.Literals.ORDERING_TYPE__AFTER;
-
-		if (qualify) {
-			return getString
-				("_UI_CreateChild_text2", //$NON-NLS-1$
-				 new Object[] { getTypeText(childObject), getFeatureText(childFeature), getTypeText(owner) });
-		}
-		return super.getCreateChildText(owner, feature, child, selection);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/PartialViewContextFactoryTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/PartialViewContextFactoryTypeItemProvider.java
deleted file mode 100644
index 228d214..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/PartialViewContextFactoryTypeItemProvider.java
+++ /dev/null
@@ -1,216 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITableItemLabelProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.PartialViewContextFactoryType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.PartialViewContextFactoryType} object.
- * <!-- begin-user-doc -->
- * @extends ITableItemLabelProvider
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class PartialViewContextFactoryTypeItemProvider
-	extends ItemProviderAdapter
-	implements
-		IEditingDomainItemProvider,
-		IStructuredItemContentProvider,
-		ITreeItemContentProvider,
-		IItemLabelProvider,
-		IItemPropertySource,
-		ITableItemLabelProvider{
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public PartialViewContextFactoryTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-	 * @param object
-	 * <!-- end-user-doc -->	 
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_PartialViewContextFactoryType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_PartialViewContextFactoryType_textContent_feature", "_UI_PartialViewContextFactoryType_type"),
-				 FacesConfigPackage.Literals.PARTIAL_VIEW_CONTEXT_FACTORY_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-	 * @param object
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_PartialViewContextFactoryType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_PartialViewContextFactoryType_id_feature", "_UI_PartialViewContextFactoryType_type"),
-				 FacesConfigPackage.Literals.PARTIAL_VIEW_CONTEXT_FACTORY_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This returns PartialViewContextFactoryType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/PartialViewContextFactoryType"));
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String getText(Object object) {
-		String label = ((PartialViewContextFactoryType) object).getTextContent();
-		return label == null || label.length() == 0 ? getString("_UI_PartialViewContextFactoryType_type")
-				: label;
-	}
-
-	/**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(PartialViewContextFactoryType.class)) {
-			case FacesConfigPackage.PARTIAL_VIEW_CONTEXT_FACTORY_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.PARTIAL_VIEW_CONTEXT_FACTORY_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-	/**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnImage(java.lang.Object, int)
-	 */
-	public Object getColumnImage(Object object, int columnIndex) {
-		// TODO Auto-generated method stub
-		if(columnIndex ==0)
-			return getImage(object);
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnText(java.lang.Object, int)
-	 */
-	public String getColumnText(Object object, int columnIndex) {
-		switch (columnIndex) {
-
-		case 0:
-			return getText(object);
-		case 1:
-			return getString("_UI_PartialViewContextFactoryType_type"); //$NON-NLS-1$
-		}
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/PhaseListenerTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/PhaseListenerTypeItemProvider.java
deleted file mode 100644
index 9eec941..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/PhaseListenerTypeItemProvider.java
+++ /dev/null
@@ -1,210 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITableItemLabelProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.PhaseListenerType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.PhaseListenerType} object.
- * <!-- begin-user-doc --> 
- * @extends ITableItemLabelProvider
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class PhaseListenerTypeItemProvider extends ItemProviderAdapter
-		implements IEditingDomainItemProvider, IStructuredItemContentProvider, ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource, ITableItemLabelProvider {
-    /**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc --> 
- 	 * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public PhaseListenerTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc --> 
- 	 * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_PhaseListenerType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_PhaseListenerType_textContent_feature", "_UI_PhaseListenerType_type"),
-				 FacesConfigPackage.Literals.PHASE_LISTENER_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc --> 
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_PhaseListenerType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_PhaseListenerType_id_feature", "_UI_PhaseListenerType_type"),
-				 FacesConfigPackage.Literals.PHASE_LISTENER_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns PhaseListenerType.gif.
-	 * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/PhaseListenerType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String getText(Object object) {
-		String label = ((PhaseListenerType) object).getTextContent();
-		return label == null || label.length() == 0 ? getString("_UI_PhaseListenerType_type")
-				: label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(PhaseListenerType.class)) {
-			case FacesConfigPackage.PHASE_LISTENER_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.PHASE_LISTENER_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnImage(java.lang.Object, int)
-	 */
-	public Object getColumnImage(Object object, int columnIndex) {
-		if(columnIndex ==0)
-			return getImage(object);
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnText(java.lang.Object, int)
-	 */
-	public String getColumnText(Object object, int columnIndex) {
-
-		switch (columnIndex) {
-
-			case 0:
-				return getText(object);
-			case 1:
-				return getString("_UI_ActionListenerType_type"); //$NON-NLS-1$
-			}
-
-			return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/PropertyClassTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/PropertyClassTypeItemProvider.java
deleted file mode 100644
index c58a1f5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/PropertyClassTypeItemProvider.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.PropertyClassType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.PropertyClassType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class PropertyClassTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public PropertyClassTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_PropertyClassType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_PropertyClassType_textContent_feature", "_UI_PropertyClassType_type"),
-				 FacesConfigPackage.Literals.PROPERTY_CLASS_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_PropertyClassType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_PropertyClassType_id_feature", "_UI_PropertyClassType_type"),
-				 FacesConfigPackage.Literals.PROPERTY_CLASS_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns PropertyClassType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/PropertyClassType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((PropertyClassType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_PropertyClassType_type") :
-			getString("_UI_PropertyClassType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(PropertyClassType.class)) {
-			case FacesConfigPackage.PROPERTY_CLASS_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.PROPERTY_CLASS_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/PropertyExtensionTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/PropertyExtensionTypeItemProvider.java
deleted file mode 100644
index 6ee9752..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/PropertyExtensionTypeItemProvider.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.jst.jsf.facesconfig.emf.PropertyExtensionType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.PropertyExtensionType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class PropertyExtensionTypeItemProvider
-	extends ExtensionTypeItemProvider
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@SuppressWarnings("hiding")
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public PropertyExtensionTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This returns PropertyExtensionType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/PropertyExtensionType")); //$NON-NLS-1$
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String getText(Object object) {
-		String label = ((PropertyExtensionType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_PropertyExtensionType_type") : //$NON-NLS-1$
-			getString("_UI_PropertyExtensionType_type") + " " + label;  //$NON-NLS-1$//$NON-NLS-2$
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/PropertyNameTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/PropertyNameTypeItemProvider.java
deleted file mode 100644
index 708ac34..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/PropertyNameTypeItemProvider.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.PropertyNameType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.PropertyNameType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class PropertyNameTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public PropertyNameTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_PropertyNameType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_PropertyNameType_textContent_feature", "_UI_PropertyNameType_type"),
-				 FacesConfigPackage.Literals.PROPERTY_NAME_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_PropertyNameType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_PropertyNameType_id_feature", "_UI_PropertyNameType_type"),
-				 FacesConfigPackage.Literals.PROPERTY_NAME_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns PropertyNameType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/PropertyNameType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((PropertyNameType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_PropertyNameType_type") :
-			getString("_UI_PropertyNameType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(PropertyNameType.class)) {
-			case FacesConfigPackage.PROPERTY_NAME_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.PROPERTY_NAME_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/PropertyResolverTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/PropertyResolverTypeItemProvider.java
deleted file mode 100644
index e26873d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/PropertyResolverTypeItemProvider.java
+++ /dev/null
@@ -1,210 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITableItemLabelProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.PropertyResolverType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.PropertyResolverType} object.
- * <!-- begin-user-doc --> 
- * @extends ITableItemLabelProvider
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class PropertyResolverTypeItemProvider extends ItemProviderAdapter
-		implements IEditingDomainItemProvider, IStructuredItemContentProvider, ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource, ITableItemLabelProvider {
-    /**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc --> 
-	 * @param adapterFactory
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public PropertyResolverTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc --> 
-	 * @param object
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_PropertyResolverType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_PropertyResolverType_textContent_feature", "_UI_PropertyResolverType_type"),
-				 FacesConfigPackage.Literals.PROPERTY_RESOLVER_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc--> 
-     * @param object
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_PropertyResolverType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_PropertyResolverType_id_feature", "_UI_PropertyResolverType_type"),
-				 FacesConfigPackage.Literals.PROPERTY_RESOLVER_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns PropertyResolverType.gif.
-	 * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/PropertyResolverType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String getText(Object object) {
-		String label = ((PropertyResolverType) object).getTextContent();
-		return label == null || label.length() == 0 ? getString("_UI_PropertyResolverType_type")
-				: label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(PropertyResolverType.class)) {
-			case FacesConfigPackage.PROPERTY_RESOLVER_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.PROPERTY_RESOLVER_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnImage(java.lang.Object, int)
-	 */
-	public Object getColumnImage(Object object, int columnIndex) {
-		// TODO Auto-generated method stub
-		if(columnIndex ==0)
-			return getImage(object);
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnText(java.lang.Object, int)
-	 */
-	public String getColumnText(Object object, int columnIndex) {
-		switch (columnIndex) {
-
-		case 0:
-			return getText(object);
-		case 1:
-			return getString("_UI_PropertyResolverType_type"); //$NON-NLS-1$
-		}
-
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/PropertyTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/PropertyTypeItemProvider.java
deleted file mode 100644
index c635925..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/PropertyTypeItemProvider.java
+++ /dev/null
@@ -1,282 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITableItemLabelProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.PropertyType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.PropertyType} object.
- * <!-- begin-user-doc -->
- * @extends ITableItemLabelProvider
- * <!-- end-user-doc -->
- * 
- * @gemerated
- */
-public class PropertyTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource, 
-		ITableItemLabelProvider{
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public PropertyTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_PropertyType_id_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_PropertyType_id_feature", "_UI_PropertyType_type"),  //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$
-				 FacesConfigPackage.Literals.PROPERTY_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures.add(FacesConfigPackage.Literals.PROPERTY_TYPE__DESCRIPTION);
-			childrenFeatures.add(FacesConfigPackage.Literals.PROPERTY_TYPE__DISPLAY_NAME);
-			childrenFeatures.add(FacesConfigPackage.Literals.PROPERTY_TYPE__ICON);
-			childrenFeatures.add(FacesConfigPackage.Literals.PROPERTY_TYPE__PROPERTY_NAME);
-			childrenFeatures.add(FacesConfigPackage.Literals.PROPERTY_TYPE__PROPERTY_CLASS);
-			childrenFeatures.add(FacesConfigPackage.Literals.PROPERTY_TYPE__DEFAULT_VALUE);
-			childrenFeatures.add(FacesConfigPackage.Literals.PROPERTY_TYPE__SUGGESTED_VALUE);
-			childrenFeatures.add(FacesConfigPackage.Literals.PROPERTY_TYPE__PROPERTY_EXTENSION);
-		}
-		return childrenFeatures;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-		// Check the type of the specified child object and return the proper feature to use for
-		// adding (see {@link AddCommand}) it as a child.
-
-		return super.getChildFeature(object, child);
-	}
-
-    /**
-	 * This returns PropertyType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/PropertyType")); //$NON-NLS-1$
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String getText(Object object) {
-		String label = ((PropertyType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_PropertyType_type") : //$NON-NLS-1$
-			getString("_UI_PropertyType_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(PropertyType.class)) {
-			case FacesConfigPackage.PROPERTY_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-			case FacesConfigPackage.PROPERTY_TYPE__DESCRIPTION:
-			case FacesConfigPackage.PROPERTY_TYPE__DISPLAY_NAME:
-			case FacesConfigPackage.PROPERTY_TYPE__ICON:
-			case FacesConfigPackage.PROPERTY_TYPE__PROPERTY_NAME:
-			case FacesConfigPackage.PROPERTY_TYPE__PROPERTY_CLASS:
-			case FacesConfigPackage.PROPERTY_TYPE__DEFAULT_VALUE:
-			case FacesConfigPackage.PROPERTY_TYPE__SUGGESTED_VALUE:
-			case FacesConfigPackage.PROPERTY_TYPE__PROPERTY_EXTENSION:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.PROPERTY_TYPE__DESCRIPTION,
-				 FacesConfigFactory.eINSTANCE.createDescriptionType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.PROPERTY_TYPE__DISPLAY_NAME,
-				 FacesConfigFactory.eINSTANCE.createDisplayNameType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.PROPERTY_TYPE__ICON,
-				 FacesConfigFactory.eINSTANCE.createIconType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.PROPERTY_TYPE__PROPERTY_NAME,
-				 FacesConfigFactory.eINSTANCE.createPropertyNameType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.PROPERTY_TYPE__PROPERTY_CLASS,
-				 FacesConfigFactory.eINSTANCE.createPropertyClassType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.PROPERTY_TYPE__DEFAULT_VALUE,
-				 FacesConfigFactory.eINSTANCE.createDefaultValueType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.PROPERTY_TYPE__SUGGESTED_VALUE,
-				 FacesConfigFactory.eINSTANCE.createSuggestedValueType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.PROPERTY_TYPE__PROPERTY_EXTENSION,
-				 FacesConfigFactory.eINSTANCE.createPropertyExtensionType()));
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-	public String getColumnText(Object object, int columnIndex) {
-		PropertyType property = (PropertyType) object;
-		switch (columnIndex) {
-
-		case 0:
-			return property.getPropertyName() == null ? "" : property //$NON-NLS-1$
-					.getPropertyName().getTextContent();
-		case 1:
-			return property.getPropertyClass() == null ? "" : property //$NON-NLS-1$
-					.getPropertyClass().getTextContent();
-		case 2:
-			return property.getDefaultValue() == null ? "" : property //$NON-NLS-1$
-					.getDefaultValue().getTextContent();
-		case 3:
-			return property.getSuggestedValue() == null ? "" : property //$NON-NLS-1$
-					.getSuggestedValue().getTextContent();
-		}
-		return null;
-	}
-
-	public Object getColumnImage(Object object, int columnIndex) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/RedirectTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/RedirectTypeItemProvider.java
deleted file mode 100644
index b2599d7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/RedirectTypeItemProvider.java
+++ /dev/null
@@ -1,230 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.RedirectType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.RedirectType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class RedirectTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public RedirectTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addIdPropertyDescriptor(object);
-			addIncludeViewParamsPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_RedirectType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_RedirectType_id_feature", "_UI_RedirectType_type"),
-				 FacesConfigPackage.Literals.REDIRECT_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Include View Params feature.
-	 * <!-- begin-user-doc -->
-	 * @param object
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIncludeViewParamsPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_RedirectType_includeViewParams_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_RedirectType_includeViewParams_feature", "_UI_RedirectType_type"),
-				 FacesConfigPackage.Literals.REDIRECT_TYPE__INCLUDE_VIEW_PARAMS,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.BOOLEAN_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-				/**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures.add(FacesConfigPackage.Literals.REDIRECT_TYPE__VIEW_PARAM);
-		}
-		return childrenFeatures;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-		// Check the type of the specified child object and return the proper feature to use for
-		// adding (see {@link AddCommand}) it as a child.
-
-		return super.getChildFeature(object, child);
-	}
-
-				/**
-	 * This returns RedirectType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/RedirectType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((RedirectType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_RedirectType_type") :
-			getString("_UI_RedirectType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(RedirectType.class)) {
-			case FacesConfigPackage.REDIRECT_TYPE__ID:
-			case FacesConfigPackage.REDIRECT_TYPE__INCLUDE_VIEW_PARAMS:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-			case FacesConfigPackage.REDIRECT_TYPE__VIEW_PARAM:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.REDIRECT_TYPE__VIEW_PARAM,
-				 FacesConfigFactory.eINSTANCE.createRedirectViewParamType()));
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/RedirectViewParamTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/RedirectViewParamTypeItemProvider.java
deleted file mode 100644
index 83ebec0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/RedirectViewParamTypeItemProvider.java
+++ /dev/null
@@ -1,212 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.RedirectViewParamType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.RedirectViewParamType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class RedirectViewParamTypeItemProvider
-	extends ItemProviderAdapter
-	implements
-		IEditingDomainItemProvider,
-		IStructuredItemContentProvider,
-		ITreeItemContentProvider,
-		IItemLabelProvider,
-		IItemPropertySource {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public RedirectViewParamTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-	 * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_RedirectViewParamType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_RedirectViewParamType_id_feature", "_UI_RedirectViewParamType_type"),
-				 FacesConfigPackage.Literals.REDIRECT_VIEW_PARAM_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures.add(FacesConfigPackage.Literals.REDIRECT_VIEW_PARAM_TYPE__NAME);
-			childrenFeatures.add(FacesConfigPackage.Literals.REDIRECT_VIEW_PARAM_TYPE__VALUE);
-		}
-		return childrenFeatures;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-		// Check the type of the specified child object and return the proper feature to use for
-		// adding (see {@link AddCommand}) it as a child.
-
-		return super.getChildFeature(object, child);
-	}
-
-	/**
-	 * This returns RedirectViewParamType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/RedirectViewParamType"));
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((RedirectViewParamType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_RedirectViewParamType_type") :
-			getString("_UI_RedirectViewParamType_type") + " " + label;
-	}
-
-	/**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(RedirectViewParamType.class)) {
-			case FacesConfigPackage.REDIRECT_VIEW_PARAM_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-			case FacesConfigPackage.REDIRECT_VIEW_PARAM_TYPE__NAME:
-			case FacesConfigPackage.REDIRECT_VIEW_PARAM_TYPE__VALUE:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-	/**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.REDIRECT_VIEW_PARAM_TYPE__NAME,
-				 FacesConfigFactory.eINSTANCE.createNameType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.REDIRECT_VIEW_PARAM_TYPE__VALUE,
-				 FacesConfigFactory.eINSTANCE.createValueType()));
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ReferencedBeanClassTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ReferencedBeanClassTypeItemProvider.java
deleted file mode 100644
index 36aa462..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ReferencedBeanClassTypeItemProvider.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanClassType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanClassType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class ReferencedBeanClassTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ReferencedBeanClassTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ReferencedBeanClassType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ReferencedBeanClassType_textContent_feature", "_UI_ReferencedBeanClassType_type"),
-				 FacesConfigPackage.Literals.REFERENCED_BEAN_CLASS_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ReferencedBeanClassType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ReferencedBeanClassType_id_feature", "_UI_ReferencedBeanClassType_type"),
-				 FacesConfigPackage.Literals.REFERENCED_BEAN_CLASS_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns ReferencedBeanClassType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/ReferencedBeanClassType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((ReferencedBeanClassType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_ReferencedBeanClassType_type") :
-			getString("_UI_ReferencedBeanClassType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(ReferencedBeanClassType.class)) {
-			case FacesConfigPackage.REFERENCED_BEAN_CLASS_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.REFERENCED_BEAN_CLASS_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ReferencedBeanNameTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ReferencedBeanNameTypeItemProvider.java
deleted file mode 100644
index 5709669..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ReferencedBeanNameTypeItemProvider.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanNameType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanNameType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class ReferencedBeanNameTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ReferencedBeanNameTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ReferencedBeanNameType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ReferencedBeanNameType_textContent_feature", "_UI_ReferencedBeanNameType_type"),
-				 FacesConfigPackage.Literals.REFERENCED_BEAN_NAME_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ReferencedBeanNameType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ReferencedBeanNameType_id_feature", "_UI_ReferencedBeanNameType_type"),
-				 FacesConfigPackage.Literals.REFERENCED_BEAN_NAME_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns ReferencedBeanNameType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/ReferencedBeanNameType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((ReferencedBeanNameType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_ReferencedBeanNameType_type") :
-			getString("_UI_ReferencedBeanNameType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(ReferencedBeanNameType.class)) {
-			case FacesConfigPackage.REFERENCED_BEAN_NAME_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.REFERENCED_BEAN_NAME_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ReferencedBeanTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ReferencedBeanTypeItemProvider.java
deleted file mode 100644
index 8ca747c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ReferencedBeanTypeItemProvider.java
+++ /dev/null
@@ -1,233 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class ReferencedBeanTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ReferencedBeanTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ReferencedBeanType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ReferencedBeanType_id_feature", "_UI_ReferencedBeanType_type"),
-				 FacesConfigPackage.Literals.REFERENCED_BEAN_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures.add(FacesConfigPackage.Literals.REFERENCED_BEAN_TYPE__DESCRIPTION);
-			childrenFeatures.add(FacesConfigPackage.Literals.REFERENCED_BEAN_TYPE__DISPLAY_NAME);
-			childrenFeatures.add(FacesConfigPackage.Literals.REFERENCED_BEAN_TYPE__ICON);
-			childrenFeatures.add(FacesConfigPackage.Literals.REFERENCED_BEAN_TYPE__REFERENCED_BEAN_NAME);
-			childrenFeatures.add(FacesConfigPackage.Literals.REFERENCED_BEAN_TYPE__REFERENCED_BEAN_CLASS);
-		}
-		return childrenFeatures;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-		// Check the type of the specified child object and return the proper feature to use for
-		// adding (see {@link AddCommand}) it as a child.
-
-		return super.getChildFeature(object, child);
-	}
-
-    /**
-	 * This returns ReferencedBeanType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/ReferencedBeanType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((ReferencedBeanType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_ReferencedBeanType_type") :
-			getString("_UI_ReferencedBeanType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(ReferencedBeanType.class)) {
-			case FacesConfigPackage.REFERENCED_BEAN_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-			case FacesConfigPackage.REFERENCED_BEAN_TYPE__DESCRIPTION:
-			case FacesConfigPackage.REFERENCED_BEAN_TYPE__DISPLAY_NAME:
-			case FacesConfigPackage.REFERENCED_BEAN_TYPE__ICON:
-			case FacesConfigPackage.REFERENCED_BEAN_TYPE__REFERENCED_BEAN_NAME:
-			case FacesConfigPackage.REFERENCED_BEAN_TYPE__REFERENCED_BEAN_CLASS:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.REFERENCED_BEAN_TYPE__DESCRIPTION,
-				 FacesConfigFactory.eINSTANCE.createDescriptionType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.REFERENCED_BEAN_TYPE__DISPLAY_NAME,
-				 FacesConfigFactory.eINSTANCE.createDisplayNameType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.REFERENCED_BEAN_TYPE__ICON,
-				 FacesConfigFactory.eINSTANCE.createIconType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.REFERENCED_BEAN_TYPE__REFERENCED_BEAN_NAME,
-				 FacesConfigFactory.eINSTANCE.createReferencedBeanNameType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.REFERENCED_BEAN_TYPE__REFERENCED_BEAN_CLASS,
-				 FacesConfigFactory.eINSTANCE.createReferencedBeanClassType()));
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/RenderKitClassTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/RenderKitClassTypeItemProvider.java
deleted file mode 100644
index d13060b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/RenderKitClassTypeItemProvider.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.RenderKitClassType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitClassType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class RenderKitClassTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public RenderKitClassTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_RenderKitClassType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_RenderKitClassType_textContent_feature", "_UI_RenderKitClassType_type"),
-				 FacesConfigPackage.Literals.RENDER_KIT_CLASS_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_RenderKitClassType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_RenderKitClassType_id_feature", "_UI_RenderKitClassType_type"),
-				 FacesConfigPackage.Literals.RENDER_KIT_CLASS_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns RenderKitClassType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/RenderKitClassType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((RenderKitClassType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_RenderKitClassType_type") :
-			getString("_UI_RenderKitClassType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(RenderKitClassType.class)) {
-			case FacesConfigPackage.RENDER_KIT_CLASS_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.RENDER_KIT_CLASS_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/RenderKitExtensionTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/RenderKitExtensionTypeItemProvider.java
deleted file mode 100644
index 359661f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/RenderKitExtensionTypeItemProvider.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.jst.jsf.facesconfig.emf.RenderKitExtensionType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitExtensionType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class RenderKitExtensionTypeItemProvider
-    extends ExtensionTypeItemProvider
-    implements	
-        IEditingDomainItemProvider,	
-        IStructuredItemContentProvider,	
-        ITreeItemContentProvider,	
-        IItemLabelProvider,	
-        IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    @SuppressWarnings("hiding")
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public RenderKitExtensionTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This returns RenderKitExtensionType.gif.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/RenderKitExtensionType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public String getText(Object object) {
-		String label = ((RenderKitExtensionType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_RenderKitExtensionType_type") :
-			getString("_UI_RenderKitExtensionType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/RenderKitFactoryTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/RenderKitFactoryTypeItemProvider.java
deleted file mode 100644
index 804431a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/RenderKitFactoryTypeItemProvider.java
+++ /dev/null
@@ -1,210 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITableItemLabelProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.RenderKitFactoryType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitFactoryType} object.
- * <!-- begin-user-doc --> 
- * @extends ITableItemLabelProvider
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class RenderKitFactoryTypeItemProvider extends ItemProviderAdapter
-		implements IEditingDomainItemProvider, IStructuredItemContentProvider, ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource, ITableItemLabelProvider {
-    /**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc --> 
-	 * @param adapterFactory
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public RenderKitFactoryTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc --> 
-	 * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_RenderKitFactoryType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_RenderKitFactoryType_textContent_feature", "_UI_RenderKitFactoryType_type"),
-				 FacesConfigPackage.Literals.RENDER_KIT_FACTORY_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc --> 
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_RenderKitFactoryType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_RenderKitFactoryType_id_feature", "_UI_RenderKitFactoryType_type"),
-				 FacesConfigPackage.Literals.RENDER_KIT_FACTORY_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns RenderKitFactoryType.gif.
-	 * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/RenderKitFactoryType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String getText(Object object) {
-		String label = ((RenderKitFactoryType) object).getTextContent();
-		return label == null || label.length() == 0 ? getString("_UI_RenderKitFactoryType_type")
-				: label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(RenderKitFactoryType.class)) {
-			case FacesConfigPackage.RENDER_KIT_FACTORY_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.RENDER_KIT_FACTORY_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnImage(java.lang.Object, int)
-	 */
-	public Object getColumnImage(Object object, int columnIndex) {
-		if(columnIndex ==0)
-			return getImage(object);
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnText(java.lang.Object, int)
-	 */
-	public String getColumnText(Object object, int columnIndex) {
-
-		switch (columnIndex) {
-
-			case 0:
-				return getText(object);
-			case 1:
-				return getString("_UI_RenderKitFactoryType_type"); //$NON-NLS-1$
-			}
-
-			return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/RenderKitIdTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/RenderKitIdTypeItemProvider.java
deleted file mode 100644
index 4f96da3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/RenderKitIdTypeItemProvider.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.RenderKitIdType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitIdType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class RenderKitIdTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public RenderKitIdTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_RenderKitIdType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_RenderKitIdType_textContent_feature", "_UI_RenderKitIdType_type"),
-				 FacesConfigPackage.Literals.RENDER_KIT_ID_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_RenderKitIdType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_RenderKitIdType_id_feature", "_UI_RenderKitIdType_type"),
-				 FacesConfigPackage.Literals.RENDER_KIT_ID_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns RenderKitIdType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/RenderKitIdType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((RenderKitIdType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_RenderKitIdType_type") :
-			getString("_UI_RenderKitIdType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(RenderKitIdType.class)) {
-			case FacesConfigPackage.RENDER_KIT_ID_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.RENDER_KIT_ID_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/RenderKitTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/RenderKitTypeItemProvider.java
deleted file mode 100644
index 560e7a1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/RenderKitTypeItemProvider.java
+++ /dev/null
@@ -1,303 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITableItemLabelProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.RenderKitType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitType} object.
- * <!-- begin-user-doc --> 
- * @extends ITableItemLabelProvider
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class RenderKitTypeItemProvider extends ItemProviderAdapter implements
-		IEditingDomainItemProvider, IStructuredItemContentProvider, ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource, ITableItemLabelProvider {
-    /**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc --> 
-	 * @param adapterFactory
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public RenderKitTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc --> 
-     * @param object
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_RenderKitType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_RenderKitType_id_feature", "_UI_RenderKitType_type"),
-				 FacesConfigPackage.Literals.RENDER_KIT_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures.add(FacesConfigPackage.Literals.RENDER_KIT_TYPE__DESCRIPTION);
-			childrenFeatures.add(FacesConfigPackage.Literals.RENDER_KIT_TYPE__DISPLAY_NAME);
-			childrenFeatures.add(FacesConfigPackage.Literals.RENDER_KIT_TYPE__ICON);
-			childrenFeatures.add(FacesConfigPackage.Literals.RENDER_KIT_TYPE__RENDER_KIT_ID);
-			childrenFeatures.add(FacesConfigPackage.Literals.RENDER_KIT_TYPE__RENDER_KIT_CLASS);
-			childrenFeatures.add(FacesConfigPackage.Literals.RENDER_KIT_TYPE__RENDERER);
-			childrenFeatures.add(FacesConfigPackage.Literals.RENDER_KIT_TYPE__CLIENT_BEHAVIOR_RENDERER);
-			childrenFeatures.add(FacesConfigPackage.Literals.RENDER_KIT_TYPE__RENDER_KIT_EXTENSION);
-		}
-		return childrenFeatures;
-	}
-
-    /**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-		// Check the type of the specified child object and return the proper feature to use for
-		// adding (see {@link AddCommand}) it as a child.
-
-		return super.getChildFeature(object, child);
-	}
-
-	/**
-	 * This returns RenderKitType.gif. <!-- begin-user-doc --> <!-- end-user-doc
-	 * -->
-	 * 
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/RenderKitType"));
-	}
-
-	/**
-	 * This returns the label text for the adapted class. <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-	 * 
-	 * @generated NOT
-	 */
-	public String getText(Object object) {
-
-		String label = null;
-		
-		if (((RenderKitType) object).getDisplayName() != null
-				&& ((RenderKitType) object).getDisplayName().size() > 0) {
-			label = ((DisplayNameType) ((RenderKitType) object)
-					.getDisplayName().get(0)).getTextContent();
-		}
-
-		if ((label == null || label.length() == 0) && ((RenderKitType) object).getRenderKitId() != null
-				&& ((RenderKitType) object).getRenderKitId().getTextContent() != null) {
-			label = ((RenderKitType) object).getRenderKitId().getTextContent();
-		}
-
-		if (label == null || label.length() == 0) {
-			if (((RenderKitType) object).getRenderKitClass() != null)
-				label = ((RenderKitType) object).getRenderKitClass()
-						.getTextContent();
-		}
-		
-		if (label == null || label.length() == 0) {
-			label = ((RenderKitType) object).getId();
-		}
-
-		return label == null || label.length() == 0 ? getString("_UI_RenderKitType_type")
-				: label;
-//				: getString("_UI_RenderKitType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(RenderKitType.class)) {
-			case FacesConfigPackage.RENDER_KIT_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-			case FacesConfigPackage.RENDER_KIT_TYPE__DESCRIPTION:
-			case FacesConfigPackage.RENDER_KIT_TYPE__DISPLAY_NAME:
-			case FacesConfigPackage.RENDER_KIT_TYPE__ICON:
-			case FacesConfigPackage.RENDER_KIT_TYPE__RENDER_KIT_ID:
-			case FacesConfigPackage.RENDER_KIT_TYPE__RENDER_KIT_CLASS:
-			case FacesConfigPackage.RENDER_KIT_TYPE__RENDERER:
-			case FacesConfigPackage.RENDER_KIT_TYPE__CLIENT_BEHAVIOR_RENDERER:
-			case FacesConfigPackage.RENDER_KIT_TYPE__RENDER_KIT_EXTENSION:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.RENDER_KIT_TYPE__DESCRIPTION,
-				 FacesConfigFactory.eINSTANCE.createDescriptionType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.RENDER_KIT_TYPE__DISPLAY_NAME,
-				 FacesConfigFactory.eINSTANCE.createDisplayNameType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.RENDER_KIT_TYPE__ICON,
-				 FacesConfigFactory.eINSTANCE.createIconType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.RENDER_KIT_TYPE__RENDER_KIT_ID,
-				 FacesConfigFactory.eINSTANCE.createRenderKitIdType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.RENDER_KIT_TYPE__RENDER_KIT_CLASS,
-				 FacesConfigFactory.eINSTANCE.createRenderKitClassType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.RENDER_KIT_TYPE__RENDERER,
-				 FacesConfigFactory.eINSTANCE.createRendererType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.RENDER_KIT_TYPE__CLIENT_BEHAVIOR_RENDERER,
-				 FacesConfigFactory.eINSTANCE.createClientBehaviorRendererType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.RENDER_KIT_TYPE__RENDER_KIT_EXTENSION,
-				 FacesConfigFactory.eINSTANCE.createRenderKitExtensionType()));
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnImage(java.lang.Object, int)
-	 */
-	public Object getColumnImage(Object object, int columnIndex) {
-		// TODO Auto-generated method stub
-		if(columnIndex ==0)
-			return getImage(object);
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnText(java.lang.Object, int)
-	 */
-	public String getColumnText(Object object, int columnIndex) {
-//		RenderKitType renderkit = (RenderKitType) object;
-//		switch (columnIndex) {
-//		case 0:
-//			return getText(object);
-//		case 1:
-//			return renderkit.getRenderKitClass() == null ? "" : renderkit //$NON-NLS-1$
-//					.getRenderKitClass().getTextContent();
-//		}
-//		return null;
-//		RenderKitType renderkit = (RenderKitType) object;
-		switch (columnIndex) {
-		case 0:
-			return getText(object);
-		case 1:
-			return getString("_UI_RenderKitType_type"); //$NON-NLS-1$
-		}
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/RendererClassTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/RendererClassTypeItemProvider.java
deleted file mode 100644
index 77eabbe..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/RendererClassTypeItemProvider.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.RendererClassType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.RendererClassType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class RendererClassTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public RendererClassTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_RendererClassType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_RendererClassType_textContent_feature", "_UI_RendererClassType_type"),
-				 FacesConfigPackage.Literals.RENDERER_CLASS_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_RendererClassType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_RendererClassType_id_feature", "_UI_RendererClassType_type"),
-				 FacesConfigPackage.Literals.RENDERER_CLASS_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns RendererClassType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/RendererClassType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((RendererClassType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_RendererClassType_type") :
-			getString("_UI_RendererClassType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(RendererClassType.class)) {
-			case FacesConfigPackage.RENDERER_CLASS_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.RENDERER_CLASS_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/RendererExtensionTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/RendererExtensionTypeItemProvider.java
deleted file mode 100644
index 16659ad..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/RendererExtensionTypeItemProvider.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.jst.jsf.facesconfig.emf.RendererExtensionType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.RendererExtensionType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class RendererExtensionTypeItemProvider
-	extends ExtensionTypeItemProvider
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@SuppressWarnings("hiding")
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public RendererExtensionTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This returns RendererExtensionType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/RendererExtensionType")); //$NON-NLS-1$
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String getText(Object object) {
-		String label = ((RendererExtensionType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_RendererExtensionType_type") : //$NON-NLS-1$
-			getString("_UI_RendererExtensionType_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/RendererTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/RendererTypeItemProvider.java
deleted file mode 100644
index e851182..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/RendererTypeItemProvider.java
+++ /dev/null
@@ -1,284 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITableItemLabelProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.RendererType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.RendererType} object.
- * <!-- begin-user-doc -->
- * @extends ITableItemLabelProvider
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class RendererTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider, IStructuredItemContentProvider, ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource, ITableItemLabelProvider {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public RendererTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_RendererType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_RendererType_id_feature", "_UI_RendererType_type"),
-				 FacesConfigPackage.Literals.RENDERER_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures.add(FacesConfigPackage.Literals.RENDERER_TYPE__DESCRIPTION);
-			childrenFeatures.add(FacesConfigPackage.Literals.RENDERER_TYPE__DISPLAY_NAME);
-			childrenFeatures.add(FacesConfigPackage.Literals.RENDERER_TYPE__ICON);
-			childrenFeatures.add(FacesConfigPackage.Literals.RENDERER_TYPE__COMPONENT_FAMILY);
-			childrenFeatures.add(FacesConfigPackage.Literals.RENDERER_TYPE__RENDERER_TYPE);
-			childrenFeatures.add(FacesConfigPackage.Literals.RENDERER_TYPE__RENDERER_CLASS);
-			childrenFeatures.add(FacesConfigPackage.Literals.RENDERER_TYPE__FACET);
-			childrenFeatures.add(FacesConfigPackage.Literals.RENDERER_TYPE__ATTRIBUTE);
-			childrenFeatures.add(FacesConfigPackage.Literals.RENDERER_TYPE__RENDERER_EXTENSION);
-		}
-		return childrenFeatures;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-		// Check the type of the specified child object and return the proper feature to use for
-		// adding (see {@link AddCommand}) it as a child.
-
-		return super.getChildFeature(object, child);
-	}
-
-    /**
-	 * This returns RendererType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/RendererType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((RendererType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_RendererType_type") :
-			getString("_UI_RendererType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(RendererType.class)) {
-			case FacesConfigPackage.RENDERER_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-			case FacesConfigPackage.RENDERER_TYPE__DESCRIPTION:
-			case FacesConfigPackage.RENDERER_TYPE__DISPLAY_NAME:
-			case FacesConfigPackage.RENDERER_TYPE__ICON:
-			case FacesConfigPackage.RENDERER_TYPE__COMPONENT_FAMILY:
-			case FacesConfigPackage.RENDERER_TYPE__RENDERER_TYPE:
-			case FacesConfigPackage.RENDERER_TYPE__RENDERER_CLASS:
-			case FacesConfigPackage.RENDERER_TYPE__FACET:
-			case FacesConfigPackage.RENDERER_TYPE__ATTRIBUTE:
-			case FacesConfigPackage.RENDERER_TYPE__RENDERER_EXTENSION:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.RENDERER_TYPE__DESCRIPTION,
-				 FacesConfigFactory.eINSTANCE.createDescriptionType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.RENDERER_TYPE__DISPLAY_NAME,
-				 FacesConfigFactory.eINSTANCE.createDisplayNameType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.RENDERER_TYPE__ICON,
-				 FacesConfigFactory.eINSTANCE.createIconType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.RENDERER_TYPE__COMPONENT_FAMILY,
-				 FacesConfigFactory.eINSTANCE.createComponentFamilyType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.RENDERER_TYPE__RENDERER_TYPE,
-				 FacesConfigFactory.eINSTANCE.createRendererTypeType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.RENDERER_TYPE__RENDERER_CLASS,
-				 FacesConfigFactory.eINSTANCE.createRendererClassType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.RENDERER_TYPE__FACET,
-				 FacesConfigFactory.eINSTANCE.createFacetType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.RENDERER_TYPE__ATTRIBUTE,
-				 FacesConfigFactory.eINSTANCE.createAttributeType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.RENDERER_TYPE__RENDERER_EXTENSION,
-				 FacesConfigFactory.eINSTANCE.createRendererExtensionType()));
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-	public String getColumnText(Object object, int columnIndex) {
-		RendererType renderer = (RendererType) object;
-		switch (columnIndex) {
-
-		case 0:
-			return renderer.getDisplayName() == null || renderer.getDisplayName().size()==0 ? "" //$NON-NLS-1$
-					: ((DisplayNameType) renderer.getDisplayName().get(0)).getTextContent();
-		case 1:
-			return renderer.getComponentFamily() == null ? "" //$NON-NLS-1$
-					: renderer.getComponentFamily().getTextContent();
-		case 2:
-			return renderer.getRendererType()==null  ? "" //$NON-NLS-1$
-					: renderer.getRendererType().getTextContent();
-		case 3:
-			return renderer.getRendererClass() == null ? "" : renderer //$NON-NLS-1$
-					.getRendererClass().getTextContent();
-		}
-		return null;
-	}
-
-	public Object getColumnImage(Object object, int columnIndex) {
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/RendererTypeTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/RendererTypeTypeItemProvider.java
deleted file mode 100644
index ed7fbb0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/RendererTypeTypeItemProvider.java
+++ /dev/null
@@ -1,212 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITableItemLabelProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.RendererType;
-import org.eclipse.jst.jsf.facesconfig.emf.RendererTypeType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.RendererTypeType} object.
- * <!-- begin-user-doc -->
- * @extends ITableItemLabelProvider 
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class RendererTypeTypeItemProvider extends ItemProviderAdapter implements
-		IEditingDomainItemProvider, IStructuredItemContentProvider, ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource, ITableItemLabelProvider {
-    /**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
- 	 * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public RendererTypeTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc --> 
-	 * @param object
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_RendererTypeType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_RendererTypeType_textContent_feature", "_UI_RendererTypeType_type"),
-				 FacesConfigPackage.Literals.RENDERER_TYPE_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc --> 
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_RendererTypeType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_RendererTypeType_id_feature", "_UI_RendererTypeType_type"),
-				 FacesConfigPackage.Literals.RENDERER_TYPE_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns RendererTypeType.gif.
-	 * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/RendererTypeType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((RendererTypeType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_RendererTypeType_type") :
-			getString("_UI_RendererTypeType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(RendererTypeType.class)) {
-			case FacesConfigPackage.RENDERER_TYPE_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.RENDERER_TYPE_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-	public String getColumnText(Object object, int columnIndex) {
-		RendererType renderer = (RendererType) object;
-		switch (columnIndex) {
-
-		case 0:
-			return renderer.getDisplayName().get(0) == null ? "" //$NON-NLS-1$
-					: (String) renderer.getDisplayName().get(0);
-		case 1:
-			return renderer.getRendererClass() == null ? "" : renderer //$NON-NLS-1$
-					.getRendererClass().getTextContent();
-		case 2:
-			return renderer.getComponentFamily().getTextContent() == null ? "" //$NON-NLS-1$
-					: renderer.getComponentFamily().getTextContent();
-		case 3:
-			return renderer.getRendererType().getTextContent() == null ? "" //$NON-NLS-1$
-					: renderer.getRendererType().getTextContent();
-		}
-		return null;
-	}
-
-	public Object getColumnImage(Object object, int columnIndex) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ResourceBundleTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ResourceBundleTypeItemProvider.java
deleted file mode 100644
index 8df4e92..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ResourceBundleTypeItemProvider.java
+++ /dev/null
@@ -1,267 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ResourceBundleType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ResourceBundleType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class ResourceBundleTypeItemProvider
-    extends ItemProviderAdapter
-    implements	
-        IEditingDomainItemProvider,	
-        IStructuredItemContentProvider,	
-        ITreeItemContentProvider,	
-        IItemLabelProvider,	
-        IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public ResourceBundleTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addBaseNamePropertyDescriptor(object);
-			addVarPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Base Name feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void addBaseNamePropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ResourceBundleType_baseName_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ResourceBundleType_baseName_feature", "_UI_ResourceBundleType_type"),
-				 FacesConfigPackage.Literals.RESOURCE_BUNDLE_TYPE__BASE_NAME,
-				 true,
-				 false,
-				 true,
-				 null,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Var feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void addVarPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ResourceBundleType_var_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ResourceBundleType_var_feature", "_UI_ResourceBundleType_type"),
-				 FacesConfigPackage.Literals.RESOURCE_BUNDLE_TYPE__VAR,
-				 true,
-				 false,
-				 true,
-				 null,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ResourceBundleType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ResourceBundleType_id_feature", "_UI_ResourceBundleType_type"),
-				 FacesConfigPackage.Literals.RESOURCE_BUNDLE_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures.add(FacesConfigPackage.Literals.RESOURCE_BUNDLE_TYPE__DESCRIPTION);
-			childrenFeatures.add(FacesConfigPackage.Literals.RESOURCE_BUNDLE_TYPE__DISPLAY_NAME);
-			childrenFeatures.add(FacesConfigPackage.Literals.RESOURCE_BUNDLE_TYPE__ICON);
-		}
-		return childrenFeatures;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected EStructuralFeature getChildFeature(Object object, Object child) {
-		// Check the type of the specified child object and return the proper feature to use for
-		// adding (see {@link AddCommand}) it as a child.
-
-		return super.getChildFeature(object, child);
-	}
-
-    /**
-	 * This returns ResourceBundleType.gif.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/ResourceBundleType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public String getText(Object object) {
-		String label = ((ResourceBundleType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_ResourceBundleType_type") :
-			getString("_UI_ResourceBundleType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(ResourceBundleType.class)) {
-			case FacesConfigPackage.RESOURCE_BUNDLE_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-			case FacesConfigPackage.RESOURCE_BUNDLE_TYPE__DESCRIPTION:
-			case FacesConfigPackage.RESOURCE_BUNDLE_TYPE__DISPLAY_NAME:
-			case FacesConfigPackage.RESOURCE_BUNDLE_TYPE__ICON:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.RESOURCE_BUNDLE_TYPE__DESCRIPTION,
-				 FacesConfigFactory.eINSTANCE.createDescriptionType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.RESOURCE_BUNDLE_TYPE__DISPLAY_NAME,
-				 FacesConfigFactory.eINSTANCE.createDisplayNameType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.RESOURCE_BUNDLE_TYPE__ICON,
-				 FacesConfigFactory.eINSTANCE.createIconType()));
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ResourceHandlerTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ResourceHandlerTypeItemProvider.java
deleted file mode 100644
index 0324d21..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ResourceHandlerTypeItemProvider.java
+++ /dev/null
@@ -1,216 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITableItemLabelProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ResourceHandlerType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ResourceHandlerType} object.
- * <!-- begin-user-doc -->
- * @extends ITableItemLabelProvider
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class ResourceHandlerTypeItemProvider
-	extends ItemProviderAdapter
-	implements
-		IEditingDomainItemProvider,
-		IStructuredItemContentProvider,
-		ITreeItemContentProvider,
-		IItemLabelProvider,
-		IItemPropertySource,
-		ITableItemLabelProvider{
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * @param adapterFactory
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceHandlerTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-	 * @param object
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ResourceHandlerType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ResourceHandlerType_textContent_feature", "_UI_ResourceHandlerType_type"),
-				 FacesConfigPackage.Literals.RESOURCE_HANDLER_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-	 * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ResourceHandlerType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ResourceHandlerType_id_feature", "_UI_ResourceHandlerType_type"),
-				 FacesConfigPackage.Literals.RESOURCE_HANDLER_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This returns ResourceHandlerType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/ResourceHandlerType"));
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String getText(Object object) {
-		String label = ((ResourceHandlerType) object).getTextContent();
-		return label == null || label.length() == 0 ? getString("_UI_ResourceHandlerType_type")
-				: label;
-	}
-
-	/**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(ResourceHandlerType.class)) {
-			case FacesConfigPackage.RESOURCE_HANDLER_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.RESOURCE_HANDLER_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-	/**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnImage(java.lang.Object, int)
-	 */
-	public Object getColumnImage(Object object, int columnIndex) {
-		// TODO Auto-generated method stub
-		if(columnIndex ==0)
-			return getImage(object);
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnText(java.lang.Object, int)
-	 */
-	public String getColumnText(Object object, int columnIndex) {
-		switch (columnIndex) {
-
-		case 0:
-			return getText(object);
-		case 1:
-			return getString("_UI_ResourceHandlerType_type"); //$NON-NLS-1$
-		}
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/SmallIconTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/SmallIconTypeItemProvider.java
deleted file mode 100644
index 3972ae6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/SmallIconTypeItemProvider.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.SmallIconType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.SmallIconType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class SmallIconTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public SmallIconTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_SmallIconType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_SmallIconType_textContent_feature", "_UI_SmallIconType_type"),
-				 FacesConfigPackage.Literals.SMALL_ICON_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_SmallIconType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_SmallIconType_id_feature", "_UI_SmallIconType_type"),
-				 FacesConfigPackage.Literals.SMALL_ICON_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns SmallIconType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/SmallIconType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((SmallIconType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_SmallIconType_type") :
-			getString("_UI_SmallIconType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(SmallIconType.class)) {
-			case FacesConfigPackage.SMALL_ICON_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.SMALL_ICON_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/SourceClassTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/SourceClassTypeItemProvider.java
deleted file mode 100644
index ad36381..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/SourceClassTypeItemProvider.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.SourceClassType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.SourceClassType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class SourceClassTypeItemProvider
-	extends ItemProviderAdapter
-	implements
-		IEditingDomainItemProvider,
-		IStructuredItemContentProvider,
-		ITreeItemContentProvider,
-		IItemLabelProvider,
-		IItemPropertySource {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public SourceClassTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-	 * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_SourceClassType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_SourceClassType_textContent_feature", "_UI_SourceClassType_type"),
-				 FacesConfigPackage.Literals.SOURCE_CLASS_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-	 * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_SourceClassType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_SourceClassType_id_feature", "_UI_SourceClassType_type"),
-				 FacesConfigPackage.Literals.SOURCE_CLASS_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This returns SourceClassType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/SourceClassType"));
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((SourceClassType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_SourceClassType_type") :
-			getString("_UI_SourceClassType_type") + " " + label;
-	}
-
-	/**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(SourceClassType.class)) {
-			case FacesConfigPackage.SOURCE_CLASS_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.SOURCE_CLASS_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-	/**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/StateManagerTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/StateManagerTypeItemProvider.java
deleted file mode 100644
index 2e9cd5b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/StateManagerTypeItemProvider.java
+++ /dev/null
@@ -1,209 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITableItemLabelProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.StateManagerType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.StateManagerType} object.
- * <!-- begin-user-doc --> 
- * @extends ITableItemLabelProvider
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class StateManagerTypeItemProvider extends ItemProviderAdapter implements
-		IEditingDomainItemProvider, IStructuredItemContentProvider, ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource, ITableItemLabelProvider {
-    /**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc --> 
-	 * @param adapterFactory
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public StateManagerTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc --> 
-	 * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_StateManagerType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_StateManagerType_textContent_feature", "_UI_StateManagerType_type"),
-				 FacesConfigPackage.Literals.STATE_MANAGER_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc --> 
-     * @param object
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_StateManagerType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_StateManagerType_id_feature", "_UI_StateManagerType_type"),
-				 FacesConfigPackage.Literals.STATE_MANAGER_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns StateManagerType.gif.
-	 * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/StateManagerType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String getText(Object object) {
-		String label = ((StateManagerType) object).getTextContent();
-		return label == null || label.length() == 0 ? getString("_UI_StateManagerType_type")
-				: label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(StateManagerType.class)) {
-			case FacesConfigPackage.STATE_MANAGER_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.STATE_MANAGER_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnImage(java.lang.Object, int)
-	 */
-	public Object getColumnImage(Object object, int columnIndex) {
-		if(columnIndex ==0)
-			return getImage(object);
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnText(java.lang.Object, int)
-	 */
-	public String getColumnText(Object object, int columnIndex) {
-		switch (columnIndex) {
-
-		case 0:
-			return getText(object);
-		case 1:
-			return getString("_UI_StateManagerType_type"); //$NON-NLS-1$
-		}
-
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/SuggestedValueTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/SuggestedValueTypeItemProvider.java
deleted file mode 100644
index 28da5cd..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/SuggestedValueTypeItemProvider.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.SuggestedValueType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.SuggestedValueType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class SuggestedValueTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public SuggestedValueTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_SuggestedValueType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_SuggestedValueType_textContent_feature", "_UI_SuggestedValueType_type"),
-				 FacesConfigPackage.Literals.SUGGESTED_VALUE_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_SuggestedValueType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_SuggestedValueType_id_feature", "_UI_SuggestedValueType_type"),
-				 FacesConfigPackage.Literals.SUGGESTED_VALUE_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns SuggestedValueType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/SuggestedValueType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((SuggestedValueType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_SuggestedValueType_type") :
-			getString("_UI_SuggestedValueType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(SuggestedValueType.class)) {
-			case FacesConfigPackage.SUGGESTED_VALUE_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.SUGGESTED_VALUE_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/SupportedLocaleTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/SupportedLocaleTypeItemProvider.java
deleted file mode 100644
index ed772f8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/SupportedLocaleTypeItemProvider.java
+++ /dev/null
@@ -1,186 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.SupportedLocaleType;
-
-/**
- * This is the item provider adapter for a
- * {@link org.eclipse.jst.jsf.facesconfig.emf.SupportedLocaleType} object. <!--
- * begin-user-doc --> <!-- end-user-doc -->
- * 
- * @generated
- */
-@SuppressWarnings("nls")
-public class SupportedLocaleTypeItemProvider extends ItemProviderAdapter
-		implements IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc --> 
-	 * @param adapterFactory
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public SupportedLocaleTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc --> 
-	 * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_SupportedLocaleType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_SupportedLocaleType_textContent_feature", "_UI_SupportedLocaleType_type"),
-				 FacesConfigPackage.Literals.SUPPORTED_LOCALE_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc --> 
-     * @param object
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_SupportedLocaleType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_SupportedLocaleType_id_feature", "_UI_SupportedLocaleType_type"),
-				 FacesConfigPackage.Literals.SUPPORTED_LOCALE_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns SupportedLocaleType.gif.
-	 * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/SupportedLocaleType"));
-	}
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-     * @generated NOT
-     */
-	public String getText(Object object) {
-        String label = ((SupportedLocaleType)object).getTextContent();
-        return label == null || label.length() == 0 ?
-            getString("_UI_SupportedLocaleType_type") : //$NON-NLS-1$
-            label;
-    }
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(SupportedLocaleType.class)) {
-			case FacesConfigPackage.SUPPORTED_LOCALE_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.SUPPORTED_LOCALE_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/SystemEventClassTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/SystemEventClassTypeItemProvider.java
deleted file mode 100644
index d25776b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/SystemEventClassTypeItemProvider.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.SystemEventClassType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.SystemEventClassType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class SystemEventClassTypeItemProvider
-	extends ItemProviderAdapter
-	implements
-		IEditingDomainItemProvider,
-		IStructuredItemContentProvider,
-		ITreeItemContentProvider,
-		IItemLabelProvider,
-		IItemPropertySource {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public SystemEventClassTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-	 * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_SystemEventClassType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_SystemEventClassType_textContent_feature", "_UI_SystemEventClassType_type"),
-				 FacesConfigPackage.Literals.SYSTEM_EVENT_CLASS_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-	 * @param object
-	 * <!-- end-user-doc --> 
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_SystemEventClassType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_SystemEventClassType_id_feature", "_UI_SystemEventClassType_type"),
-				 FacesConfigPackage.Literals.SYSTEM_EVENT_CLASS_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This returns SystemEventClassType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/SystemEventClassType"));
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((SystemEventClassType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_SystemEventClassType_type") :
-			getString("_UI_SystemEventClassType_type") + " " + label;
-	}
-
-	/**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(SystemEventClassType.class)) {
-			case FacesConfigPackage.SYSTEM_EVENT_CLASS_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.SYSTEM_EVENT_CLASS_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-	/**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/SystemEventListenerClassTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/SystemEventListenerClassTypeItemProvider.java
deleted file mode 100644
index be6cfb7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/SystemEventListenerClassTypeItemProvider.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.SystemEventListenerClassType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.SystemEventListenerClassType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class SystemEventListenerClassTypeItemProvider
-	extends ItemProviderAdapter
-	implements
-		IEditingDomainItemProvider,
-		IStructuredItemContentProvider,
-		ITreeItemContentProvider,
-		IItemLabelProvider,
-		IItemPropertySource {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public SystemEventListenerClassTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-	 * @param object
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_SystemEventListenerClassType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_SystemEventListenerClassType_textContent_feature", "_UI_SystemEventListenerClassType_type"),
-				 FacesConfigPackage.Literals.SYSTEM_EVENT_LISTENER_CLASS_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-	 * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_SystemEventListenerClassType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_SystemEventListenerClassType_id_feature", "_UI_SystemEventListenerClassType_type"),
-				 FacesConfigPackage.Literals.SYSTEM_EVENT_LISTENER_CLASS_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This returns SystemEventListenerClassType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/SystemEventListenerClassType"));
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((SystemEventListenerClassType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_SystemEventListenerClassType_type") :
-			getString("_UI_SystemEventListenerClassType_type") + " " + label;
-	}
-
-	/**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(SystemEventListenerClassType.class)) {
-			case FacesConfigPackage.SYSTEM_EVENT_LISTENER_CLASS_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.SYSTEM_EVENT_LISTENER_CLASS_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-	/**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/SystemEventListenerTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/SystemEventListenerTypeItemProvider.java
deleted file mode 100644
index 7197cab..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/SystemEventListenerTypeItemProvider.java
+++ /dev/null
@@ -1,219 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.SystemEventListenerType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.SystemEventListenerType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class SystemEventListenerTypeItemProvider
-	extends ItemProviderAdapter
-	implements
-		IEditingDomainItemProvider,
-		IStructuredItemContentProvider,
-		ITreeItemContentProvider,
-		IItemLabelProvider,
-		IItemPropertySource {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * @param adapterFactory
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public SystemEventListenerTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-	 * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_SystemEventListenerType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_SystemEventListenerType_id_feature", "_UI_SystemEventListenerType_type"),
-				 FacesConfigPackage.Literals.SYSTEM_EVENT_LISTENER_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures.add(FacesConfigPackage.Literals.SYSTEM_EVENT_LISTENER_TYPE__SYSTEM_EVENT_LISTENER_CLASS);
-			childrenFeatures.add(FacesConfigPackage.Literals.SYSTEM_EVENT_LISTENER_TYPE__SYSTEM_EVENT_CLASS);
-			childrenFeatures.add(FacesConfigPackage.Literals.SYSTEM_EVENT_LISTENER_TYPE__SOURCE_CLASS);
-		}
-		return childrenFeatures;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-		// Check the type of the specified child object and return the proper feature to use for
-		// adding (see {@link AddCommand}) it as a child.
-
-		return super.getChildFeature(object, child);
-	}
-
-	/**
-	 * This returns SystemEventListenerType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/SystemEventListenerType"));
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((SystemEventListenerType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_SystemEventListenerType_type") :
-			getString("_UI_SystemEventListenerType_type") + " " + label;
-	}
-
-	/**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(SystemEventListenerType.class)) {
-			case FacesConfigPackage.SYSTEM_EVENT_LISTENER_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-			case FacesConfigPackage.SYSTEM_EVENT_LISTENER_TYPE__SYSTEM_EVENT_LISTENER_CLASS:
-			case FacesConfigPackage.SYSTEM_EVENT_LISTENER_TYPE__SYSTEM_EVENT_CLASS:
-			case FacesConfigPackage.SYSTEM_EVENT_LISTENER_TYPE__SOURCE_CLASS:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-	/**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.SYSTEM_EVENT_LISTENER_TYPE__SYSTEM_EVENT_LISTENER_CLASS,
-				 FacesConfigFactory.eINSTANCE.createSystemEventListenerClassType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.SYSTEM_EVENT_LISTENER_TYPE__SYSTEM_EVENT_CLASS,
-				 FacesConfigFactory.eINSTANCE.createSystemEventClassType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.SYSTEM_EVENT_LISTENER_TYPE__SOURCE_CLASS,
-				 FacesConfigFactory.eINSTANCE.createSourceClassType()));
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/TagHandlerDelegateFactoryTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/TagHandlerDelegateFactoryTypeItemProvider.java
deleted file mode 100644
index c13c9e7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/TagHandlerDelegateFactoryTypeItemProvider.java
+++ /dev/null
@@ -1,217 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITableItemLabelProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.TagHandlerDelegateFactoryType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.TagHandlerDelegateFactoryType} object.
- * <!-- begin-user-doc -->
- * @extends ITableItemLabelProvider
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class TagHandlerDelegateFactoryTypeItemProvider
-	extends ItemProviderAdapter
-	implements
-		IEditingDomainItemProvider,
-		IStructuredItemContentProvider,
-		ITreeItemContentProvider,
-		IItemLabelProvider,
-		IItemPropertySource,
-		ITableItemLabelProvider{
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * @param adapterFactory
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public TagHandlerDelegateFactoryTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-	 * @param object
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_TagHandlerDelegateFactoryType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_TagHandlerDelegateFactoryType_textContent_feature", "_UI_TagHandlerDelegateFactoryType_type"),
-				 FacesConfigPackage.Literals.TAG_HANDLER_DELEGATE_FACTORY_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-	 * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_TagHandlerDelegateFactoryType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_TagHandlerDelegateFactoryType_id_feature", "_UI_TagHandlerDelegateFactoryType_type"),
-				 FacesConfigPackage.Literals.TAG_HANDLER_DELEGATE_FACTORY_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This returns TagHandlerDelegateFactoryType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/TagHandlerDelegateFactoryType"));
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String getText(Object object) {
-		String label = ((TagHandlerDelegateFactoryType) object).getTextContent();
-		return label == null || label.length() == 0 ? getString("_UI_TagHandlerDelegateFactoryType_type")
-				: label;
-	}
-
-	/**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(TagHandlerDelegateFactoryType.class)) {
-			case FacesConfigPackage.TAG_HANDLER_DELEGATE_FACTORY_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.TAG_HANDLER_DELEGATE_FACTORY_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-	/**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnImage(java.lang.Object, int)
-	 */
-	public Object getColumnImage(Object object, int columnIndex) {
-		// TODO Auto-generated method stub
-		if(columnIndex ==0)
-			return getImage(object);
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnText(java.lang.Object, int)
-	 */
-	public String getColumnText(Object object, int columnIndex) {
-		switch (columnIndex) {
-
-		case 0:
-			return getText(object);
-		case 1:
-			return getString("_UI_TagHandlerDelegateFactoryType_type"); //$NON-NLS-1$
-		}
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ToViewIdTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ToViewIdTypeItemProvider.java
deleted file mode 100644
index dc2c6c7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ToViewIdTypeItemProvider.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ToViewIdType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ToViewIdType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class ToViewIdTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ToViewIdTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ToViewIdType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ToViewIdType_textContent_feature", "_UI_ToViewIdType_type"),
-				 FacesConfigPackage.Literals.TO_VIEW_ID_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ToViewIdType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ToViewIdType_id_feature", "_UI_ToViewIdType_type"),
-				 FacesConfigPackage.Literals.TO_VIEW_ID_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns ToViewIdType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/ToViewIdType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((ToViewIdType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_ToViewIdType_type") :
-			getString("_UI_ToViewIdType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(ToViewIdType.class)) {
-			case FacesConfigPackage.TO_VIEW_ID_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.TO_VIEW_ID_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ValidatorClassTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ValidatorClassTypeItemProvider.java
deleted file mode 100644
index 9a6788e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ValidatorClassTypeItemProvider.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ValidatorClassType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorClassType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class ValidatorClassTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ValidatorClassTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ValidatorClassType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ValidatorClassType_textContent_feature", "_UI_ValidatorClassType_type"),
-				 FacesConfigPackage.Literals.VALIDATOR_CLASS_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ValidatorClassType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ValidatorClassType_id_feature", "_UI_ValidatorClassType_type"),
-				 FacesConfigPackage.Literals.VALIDATOR_CLASS_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns ValidatorClassType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/ValidatorClassType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((ValidatorClassType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_ValidatorClassType_type") :
-			getString("_UI_ValidatorClassType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(ValidatorClassType.class)) {
-			case FacesConfigPackage.VALIDATOR_CLASS_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.VALIDATOR_CLASS_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ValidatorExtensionTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ValidatorExtensionTypeItemProvider.java
deleted file mode 100644
index aba55e2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ValidatorExtensionTypeItemProvider.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.jst.jsf.facesconfig.emf.ValidatorExtensionType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorExtensionType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class ValidatorExtensionTypeItemProvider
-    extends ExtensionTypeItemProvider
-    implements	
-        IEditingDomainItemProvider,	
-        IStructuredItemContentProvider,	
-        ITreeItemContentProvider,	
-        IItemLabelProvider,	
-        IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    @SuppressWarnings("hiding")
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public ValidatorExtensionTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This returns ValidatorExtensionType.gif.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-    public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/ValidatorExtensionType")); //$NON-NLS-1$
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-    public String getText(Object object) {
-		String label = ((ValidatorExtensionType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_ValidatorExtensionType_type") : //$NON-NLS-1$
-			getString("_UI_ValidatorExtensionType_type") + " " + label;  //$NON-NLS-1$//$NON-NLS-2$
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ValidatorIdTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ValidatorIdTypeItemProvider.java
deleted file mode 100644
index b71789f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ValidatorIdTypeItemProvider.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ValidatorIdType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorIdType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class ValidatorIdTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ValidatorIdTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ValidatorIdType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ValidatorIdType_textContent_feature", "_UI_ValidatorIdType_type"),
-				 FacesConfigPackage.Literals.VALIDATOR_ID_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ValidatorIdType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ValidatorIdType_id_feature", "_UI_ValidatorIdType_type"),
-				 FacesConfigPackage.Literals.VALIDATOR_ID_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns ValidatorIdType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/ValidatorIdType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((ValidatorIdType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_ValidatorIdType_type") :
-			getString("_UI_ValidatorIdType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(ValidatorIdType.class)) {
-			case FacesConfigPackage.VALIDATOR_ID_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.VALIDATOR_ID_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ValidatorTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ValidatorTypeItemProvider.java
deleted file mode 100644
index 59cbdc7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ValidatorTypeItemProvider.java
+++ /dev/null
@@ -1,291 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITableItemLabelProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ValidatorType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorType} object.
- * <!-- begin-user-doc --> 
- * @extends ITableItemLabelProvider
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class ValidatorTypeItemProvider extends ItemProviderAdapter implements
-		IEditingDomainItemProvider, IStructuredItemContentProvider, ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource, ITableItemLabelProvider {
-    /**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc --> 
-	 * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ValidatorTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc --> 
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ValidatorType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ValidatorType_id_feature", "_UI_ValidatorType_type"),
-				 FacesConfigPackage.Literals.VALIDATOR_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures.add(FacesConfigPackage.Literals.VALIDATOR_TYPE__DESCRIPTION);
-			childrenFeatures.add(FacesConfigPackage.Literals.VALIDATOR_TYPE__DISPLAY_NAME);
-			childrenFeatures.add(FacesConfigPackage.Literals.VALIDATOR_TYPE__ICON);
-			childrenFeatures.add(FacesConfigPackage.Literals.VALIDATOR_TYPE__VALIDATOR_ID);
-			childrenFeatures.add(FacesConfigPackage.Literals.VALIDATOR_TYPE__VALIDATOR_CLASS);
-			childrenFeatures.add(FacesConfigPackage.Literals.VALIDATOR_TYPE__ATTRIBUTE);
-			childrenFeatures.add(FacesConfigPackage.Literals.VALIDATOR_TYPE__PROPERTY);
-			childrenFeatures.add(FacesConfigPackage.Literals.VALIDATOR_TYPE__VALIDATOR_EXTENSION);
-		}
-		return childrenFeatures;
-	}
-
-    /**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-		// Check the type of the specified child object and return the proper feature to use for
-		// adding (see {@link AddCommand}) it as a child.
-
-		return super.getChildFeature(object, child);
-	}
-
-	/**
-	 * This returns ValidatorType.gif. <!-- begin-user-doc --> <!-- end-user-doc
-	 * -->
-	 * 
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/ValidatorType"));
-	}
-
-	/**
-	 * This returns the label text for the adapted class. <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-	 * 
-	 * @generated NOT
-	 */
-	public String getText(Object object) {
-		String label = null;
-
-		if (((ValidatorType) object).getDisplayName() != null
-				&& ((ValidatorType) object).getDisplayName().size() > 0) {
-			label = ((DisplayNameType) ((ValidatorType) object)
-					.getDisplayName().get(0)).getTextContent();
-		}
-		
-		if ((label == null || label.length() == 0) && ((ValidatorType) object).getValidatorId() != null
-				&& ((ValidatorType) object).getValidatorId().getTextContent() != null) {
-			label = ((ValidatorType) object).getValidatorId().getTextContent();
-		}
-
-		if (label == null || label.length() == 0) {
-			if (((ValidatorType) object).getValidatorClass() != null)
-				label = ((ValidatorType) object).getValidatorClass()
-						.getTextContent();
-		}
-		if (label == null || label.length() == 0) {
-			label = ((ValidatorType) object).getId();
-		}
-		return label == null || label.length() == 0 ? getString("_UI_ValidatorType_type")
-				: label;
-//				: getString("_UI_ValidatorType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(ValidatorType.class)) {
-			case FacesConfigPackage.VALIDATOR_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-			case FacesConfigPackage.VALIDATOR_TYPE__DESCRIPTION:
-			case FacesConfigPackage.VALIDATOR_TYPE__DISPLAY_NAME:
-			case FacesConfigPackage.VALIDATOR_TYPE__ICON:
-			case FacesConfigPackage.VALIDATOR_TYPE__VALIDATOR_ID:
-			case FacesConfigPackage.VALIDATOR_TYPE__VALIDATOR_CLASS:
-			case FacesConfigPackage.VALIDATOR_TYPE__ATTRIBUTE:
-			case FacesConfigPackage.VALIDATOR_TYPE__PROPERTY:
-			case FacesConfigPackage.VALIDATOR_TYPE__VALIDATOR_EXTENSION:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.VALIDATOR_TYPE__DESCRIPTION,
-				 FacesConfigFactory.eINSTANCE.createDescriptionType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.VALIDATOR_TYPE__DISPLAY_NAME,
-				 FacesConfigFactory.eINSTANCE.createDisplayNameType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.VALIDATOR_TYPE__ICON,
-				 FacesConfigFactory.eINSTANCE.createIconType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.VALIDATOR_TYPE__VALIDATOR_ID,
-				 FacesConfigFactory.eINSTANCE.createValidatorIdType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.VALIDATOR_TYPE__VALIDATOR_CLASS,
-				 FacesConfigFactory.eINSTANCE.createValidatorClassType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.VALIDATOR_TYPE__ATTRIBUTE,
-				 FacesConfigFactory.eINSTANCE.createAttributeType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.VALIDATOR_TYPE__PROPERTY,
-				 FacesConfigFactory.eINSTANCE.createPropertyType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.VALIDATOR_TYPE__VALIDATOR_EXTENSION,
-				 FacesConfigFactory.eINSTANCE.createValidatorExtensionType()));
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnImage(java.lang.Object, int)
-	 */
-	public Object getColumnImage(Object object, int columnIndex) {
-		// TODO Auto-generated method stub
-		if(columnIndex ==0)
-			return getImage(object);
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnText(java.lang.Object, int)
-	 */
-	public String getColumnText(Object object, int columnIndex) {
-		switch (columnIndex) {
-
-		case 0:
-			return getText(object);
-		case 1:
-			return getString("_UI_ValidatorType_type"); //$NON-NLS-1$
-		}
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ValueClassTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ValueClassTypeItemProvider.java
deleted file mode 100644
index 39c7d6d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ValueClassTypeItemProvider.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ValueClassType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ValueClassType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class ValueClassTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ValueClassTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ValueClassType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ValueClassType_textContent_feature", "_UI_ValueClassType_type"),
-				 FacesConfigPackage.Literals.VALUE_CLASS_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ValueClassType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ValueClassType_id_feature", "_UI_ValueClassType_type"),
-				 FacesConfigPackage.Literals.VALUE_CLASS_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns ValueClassType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/ValueClassType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((ValueClassType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_ValueClassType_type") :
-			getString("_UI_ValueClassType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(ValueClassType.class)) {
-			case FacesConfigPackage.VALUE_CLASS_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.VALUE_CLASS_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ValueTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ValueTypeItemProvider.java
deleted file mode 100644
index 1230800..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ValueTypeItemProvider.java
+++ /dev/null
@@ -1,200 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITableItemLabelProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ValueType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ValueType} object.
- * <!-- begin-user-doc -->
- * @extends ITableItemLabelProvider
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class ValueTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider, IStructuredItemContentProvider, ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource, ITableItemLabelProvider {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ValueTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ValueType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ValueType_textContent_feature", "_UI_ValueType_type"),
-				 FacesConfigPackage.Literals.VALUE_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ValueType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ValueType_id_feature", "_UI_ValueType_type"),
-				 FacesConfigPackage.Literals.VALUE_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns ValueType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/ValueType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((ValueType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_ValueType_type") :
-			getString("_UI_ValueType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(ValueType.class)) {
-			case FacesConfigPackage.VALUE_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.VALUE_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-	public String getColumnText(Object object, int columnIndex) {
-
-		ValueType value = (ValueType)object;
-		return value.getTextContent();
-	}
-
-	public Object getColumnImage(Object object, int columnIndex) {
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/VarTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/VarTypeItemProvider.java
deleted file mode 100644
index 91b1d96..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/VarTypeItemProvider.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.VarType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.VarType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class VarTypeItemProvider
-    extends ItemProviderAdapter
-    implements	
-        IEditingDomainItemProvider,	
-        IStructuredItemContentProvider,	
-        ITreeItemContentProvider,	
-        IItemLabelProvider,	
-        IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public VarTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_VarType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_VarType_textContent_feature", "_UI_VarType_type"),
-				 FacesConfigPackage.Literals.VAR_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_VarType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_VarType_id_feature", "_UI_VarType_type"),
-				 FacesConfigPackage.Literals.VAR_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns VarType.gif.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/VarType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public String getText(Object object) {
-		String label = ((VarType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_VarType_type") :
-			getString("_UI_VarType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(VarType.class)) {
-			case FacesConfigPackage.VAR_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.VAR_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/VariableResolverTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/VariableResolverTypeItemProvider.java
deleted file mode 100644
index 38b6260..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/VariableResolverTypeItemProvider.java
+++ /dev/null
@@ -1,209 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITableItemLabelProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.VariableResolverType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.VariableResolverType} object.
- * <!-- begin-user-doc --> 
- * @extends ITableItemLabelProvider
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class VariableResolverTypeItemProvider extends ItemProviderAdapter
-		implements IEditingDomainItemProvider, IStructuredItemContentProvider, ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource, ITableItemLabelProvider {
-    /**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc --> 
- 	 * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public VariableResolverTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc --> 
-	 * @param object
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_VariableResolverType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_VariableResolverType_textContent_feature", "_UI_VariableResolverType_type"),
-				 FacesConfigPackage.Literals.VARIABLE_RESOLVER_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc --> 
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_VariableResolverType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_VariableResolverType_id_feature", "_UI_VariableResolverType_type"),
-				 FacesConfigPackage.Literals.VARIABLE_RESOLVER_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns VariableResolverType.gif.
-	 * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/VariableResolverType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String getText(Object object) {
-		String label = ((VariableResolverType) object).getTextContent();
-		return label == null || label.length() == 0 ? getString("_UI_VariableResolverType_type")
-				: label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(VariableResolverType.class)) {
-			case FacesConfigPackage.VARIABLE_RESOLVER_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.VARIABLE_RESOLVER_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnImage(java.lang.Object, int)
-	 */
-	public Object getColumnImage(Object object, int columnIndex) {
-		if(columnIndex ==0)
-			return getImage(object);
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnText(java.lang.Object, int)
-	 */
-	public String getColumnText(Object object, int columnIndex) {
-		switch (columnIndex) {
-
-		case 0:
-			return getText(object);
-		case 1:
-			return getString("_UI_VariableResolverType_type"); //$NON-NLS-1$
-		}
-
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ViewDeclarationLanguageFactoryTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ViewDeclarationLanguageFactoryTypeItemProvider.java
deleted file mode 100644
index 7e2b6d8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ViewDeclarationLanguageFactoryTypeItemProvider.java
+++ /dev/null
@@ -1,217 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITableItemLabelProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ViewDeclarationLanguageFactoryType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ViewDeclarationLanguageFactoryType} object.
- * <!-- begin-user-doc -->
- * @extends ITableItemLabelProvider
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class ViewDeclarationLanguageFactoryTypeItemProvider
-	extends ItemProviderAdapter
-	implements
-		IEditingDomainItemProvider,
-		IStructuredItemContentProvider,
-		ITreeItemContentProvider,
-		IItemLabelProvider,
-		IItemPropertySource,
-		ITableItemLabelProvider{
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ViewDeclarationLanguageFactoryTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-	 * @param object
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ViewDeclarationLanguageFactoryType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ViewDeclarationLanguageFactoryType_textContent_feature", "_UI_ViewDeclarationLanguageFactoryType_type"),
-				 FacesConfigPackage.Literals.VIEW_DECLARATION_LANGUAGE_FACTORY_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-	 * @param object
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ViewDeclarationLanguageFactoryType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ViewDeclarationLanguageFactoryType_id_feature", "_UI_ViewDeclarationLanguageFactoryType_type"),
-				 FacesConfigPackage.Literals.VIEW_DECLARATION_LANGUAGE_FACTORY_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This returns ViewDeclarationLanguageFactoryType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/ViewDeclarationLanguageFactoryType"));
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String getText(Object object) {
-		String label = ((ViewDeclarationLanguageFactoryType) object).getTextContent();
-		return label == null || label.length() == 0 ? getString("_UI_ViewDeclarationLanguageFactoryType_type")
-				: label;
-	}
-
-	/**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(ViewDeclarationLanguageFactoryType.class)) {
-			case FacesConfigPackage.VIEW_DECLARATION_LANGUAGE_FACTORY_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.VIEW_DECLARATION_LANGUAGE_FACTORY_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-	/**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnImage(java.lang.Object, int)
-	 */
-	public Object getColumnImage(Object object, int columnIndex) {
-		// TODO Auto-generated method stub
-		if(columnIndex ==0)
-			return getImage(object);
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnText(java.lang.Object, int)
-	 */
-	public String getColumnText(Object object, int columnIndex) {
-		switch (columnIndex) {
-
-		case 0:
-			return getText(object);
-		case 1:
-			return getString("_UI_ViewDeclarationLanguageFactoryType_type"); //$NON-NLS-1$
-		}
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ViewHandlerTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ViewHandlerTypeItemProvider.java
deleted file mode 100644
index 8cd0a0d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ViewHandlerTypeItemProvider.java
+++ /dev/null
@@ -1,209 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITableItemLabelProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ViewHandlerType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ViewHandlerType} object.
- * <!-- begin-user-doc --> 
- * @extends ITableItemLabelProvider
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class ViewHandlerTypeItemProvider extends ItemProviderAdapter implements
-		IEditingDomainItemProvider, IStructuredItemContentProvider, ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource, ITableItemLabelProvider {
-    /**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc --> 
-	 * @param adapterFactory
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ViewHandlerTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc --> 
-	 * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ViewHandlerType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ViewHandlerType_textContent_feature", "_UI_ViewHandlerType_type"),
-				 FacesConfigPackage.Literals.VIEW_HANDLER_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc --> 
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ViewHandlerType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ViewHandlerType_id_feature", "_UI_ViewHandlerType_type"),
-				 FacesConfigPackage.Literals.VIEW_HANDLER_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns ViewHandlerType.gif.
-	 * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/ViewHandlerType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String getText(Object object) {
-		String label = ((ViewHandlerType) object).getTextContent();
-		return label == null || label.length() == 0 ? getString("_UI_ViewHandlerType_type")
-				: label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(ViewHandlerType.class)) {
-			case FacesConfigPackage.VIEW_HANDLER_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.VIEW_HANDLER_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnImage(java.lang.Object, int)
-	 */
-	public Object getColumnImage(Object object, int columnIndex) {
-		if(columnIndex ==0)
-			return getImage(object);
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnText(java.lang.Object, int)
-	 */
-	public String getColumnText(Object object, int columnIndex) {
-		switch (columnIndex) {
-
-		case 0:
-			return getText(object);
-		case 1:
-			return getString("_UI_ViewHandlerType_type"); //$NON-NLS-1$
-		}
-
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/VisitContextFactoryTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/VisitContextFactoryTypeItemProvider.java
deleted file mode 100644
index a2acdb4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/VisitContextFactoryTypeItemProvider.java
+++ /dev/null
@@ -1,217 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITableItemLabelProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.VisitContextFactoryType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.VisitContextFactoryType} object.
- * <!-- begin-user-doc -->
- * @extends ITableItemLabelProvider
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class VisitContextFactoryTypeItemProvider
-	extends ItemProviderAdapter
-	implements
-		IEditingDomainItemProvider,
-		IStructuredItemContentProvider,
-		ITreeItemContentProvider,
-		IItemLabelProvider,
-		IItemPropertySource,
-		ITableItemLabelProvider{
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public VisitContextFactoryTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc --> 
-	 * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_VisitContextFactoryType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_VisitContextFactoryType_textContent_feature", "_UI_VisitContextFactoryType_type"),
-				 FacesConfigPackage.Literals.VISIT_CONTEXT_FACTORY_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc --> 
-	 * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_VisitContextFactoryType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_VisitContextFactoryType_id_feature", "_UI_VisitContextFactoryType_type"),
-				 FacesConfigPackage.Literals.VISIT_CONTEXT_FACTORY_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This returns VisitContextFactoryType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/VisitContextFactoryType"));
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String getText(Object object) {
-		String label = ((VisitContextFactoryType) object).getTextContent();
-		return label == null || label.length() == 0 ? getString("_UI_VisitContextFactoryType_type")
-				: label;
-	}
-
-	/**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(VisitContextFactoryType.class)) {
-			case FacesConfigPackage.VISIT_CONTEXT_FACTORY_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.VISIT_CONTEXT_FACTORY_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-	/**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnImage(java.lang.Object, int)
-	 */
-	public Object getColumnImage(Object object, int columnIndex) {
-		// TODO Auto-generated method stub
-		if(columnIndex ==0)
-			return getImage(object);
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnText(java.lang.Object, int)
-	 */
-	public String getColumnText(Object object, int columnIndex) {
-		switch (columnIndex) {
-
-		case 0:
-			return getText(object);
-		case 1:
-			return getString("_UI_VisitContextFactoryType_type"); //$NON-NLS-1$
-		}
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/package-info.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/package-info.java
deleted file mode 100644
index 71a1afa..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/package-info.java
+++ /dev/null
@@ -1,16 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-/**
- * EMF providers for JSF application configuration model. 
- */
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/AbsoluteOrderingType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/AbsoluteOrderingType.java
deleted file mode 100644
index c874529..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/AbsoluteOrderingType.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Absolute Ordering Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.AbsoluteOrderingType#getName <em>Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.AbsoluteOrderingType#getOthers <em>Others</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getAbsoluteOrderingType()
- * @model extendedMetaData="name='absolute-ordering_._type' kind='elementOnly'"
- * @generated
- */
-public interface AbsoluteOrderingType extends EObject {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * Returns the value of the '<em><b>Name</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.NameType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Name</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Name</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getAbsoluteOrderingType_Name()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.NameType" containment="true"
-	 *        extendedMetaData="kind='element' name='name' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getName();
-
-	/**
-	 * Returns the value of the '<em><b>Others</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Others</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Others</em>' containment reference.
-	 * @see #setOthers(OrderingOthersType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getAbsoluteOrderingType_Others()
-	 * @model containment="true"
-	 *        extendedMetaData="kind='element' name='others' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	OrderingOthersType getOthers();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.AbsoluteOrderingType#getOthers <em>Others</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Others</em>' containment reference.
-	 * @see #getOthers()
-	 * @generated
-	 */
-	void setOthers(OrderingOthersType value);
-
-} // AbsoluteOrderingType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ActionListenerType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ActionListenerType.java
deleted file mode 100644
index 272bb43..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ActionListenerType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Action Listener Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ActionListenerType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ActionListenerType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getActionListenerType()
- * @model extendedMetaData="name='action-listener_._type' kind='simple'"
- * @generated
- */
-public interface ActionListenerType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getActionListenerType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ActionListenerType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getActionListenerType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ActionListenerType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // ActionListenerType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ApplicationExtensionType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ApplicationExtensionType.java
deleted file mode 100644
index 09e2e93..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ApplicationExtensionType.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Application Extension Type</b></em>'.
- * <!-- end-user-doc -->
- *
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getApplicationExtensionType()
- * @model extendedMetaData="name='application-extension_._type'"
- * @generated
- */
-public interface ApplicationExtensionType extends ExtensionType {
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-} // ApplicationExtensionType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ApplicationFactoryType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ApplicationFactoryType.java
deleted file mode 100644
index 72c50ca..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ApplicationFactoryType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Application Factory Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationFactoryType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationFactoryType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getApplicationFactoryType()
- * @model extendedMetaData="name='application-factory_._type' kind='simple'"
- * @generated
- */
-public interface ApplicationFactoryType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getApplicationFactoryType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationFactoryType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getApplicationFactoryType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationFactoryType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // ApplicationFactoryType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ApplicationType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ApplicationType.java
deleted file mode 100644
index ea98ef6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ApplicationType.java
+++ /dev/null
@@ -1,338 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Application Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getActionListener <em>Action Listener</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getDefaultRenderKitId <em>Default Render Kit Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getMessageBundle <em>Message Bundle</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getNavigationHandler <em>Navigation Handler</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getViewHandler <em>View Handler</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getStateManager <em>State Manager</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getELResolver <em>EL Resolver</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getPropertyResolver <em>Property Resolver</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getVariableResolver <em>Variable Resolver</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getResourceHandler <em>Resource Handler</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getSystemEventListener <em>System Event Listener</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getLocaleConfig <em>Locale Config</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getResourceBundle <em>Resource Bundle</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getApplicationExtension <em>Application Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getDefaultValidators <em>Default Validators</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getApplicationType()
- * @model extendedMetaData="name='application_._type' kind='elementOnly'"
- * @generated
- */
-public interface ApplicationType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Action Listener</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.ActionListenerType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Action Listener</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Action Listener</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getApplicationType_ActionListener()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.ActionListenerType" containment="true"
-	 *        extendedMetaData="kind='element' name='action-listener' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getActionListener();
-
-    /**
-	 * Returns the value of the '<em><b>Default Render Kit Id</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.DefaultRenderKitIdType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Default Render Kit Id</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Default Render Kit Id</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getApplicationType_DefaultRenderKitId()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.DefaultRenderKitIdType" containment="true"
-	 *        extendedMetaData="kind='element' name='default-render-kit-id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getDefaultRenderKitId();
-
-    /**
-	 * Returns the value of the '<em><b>Message Bundle</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.MessageBundleType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Message Bundle</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Message Bundle</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getApplicationType_MessageBundle()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.MessageBundleType" containment="true"
-	 *        extendedMetaData="kind='element' name='message-bundle' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getMessageBundle();
-
-    /**
-	 * Returns the value of the '<em><b>Navigation Handler</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.NavigationHandlerType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Navigation Handler</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Navigation Handler</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getApplicationType_NavigationHandler()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.NavigationHandlerType" containment="true"
-	 *        extendedMetaData="kind='element' name='navigation-handler' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getNavigationHandler();
-
-    /**
-	 * Returns the value of the '<em><b>View Handler</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.ViewHandlerType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>View Handler</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>View Handler</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getApplicationType_ViewHandler()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.ViewHandlerType" containment="true"
-	 *        extendedMetaData="kind='element' name='view-handler' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getViewHandler();
-
-    /**
-	 * Returns the value of the '<em><b>State Manager</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.StateManagerType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>State Manager</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>State Manager</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getApplicationType_StateManager()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.StateManagerType" containment="true"
-	 *        extendedMetaData="kind='element' name='state-manager' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getStateManager();
-
-    /**
-	 * Returns the value of the '<em><b>Property Resolver</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.PropertyResolverType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Property Resolver</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Property Resolver</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getApplicationType_PropertyResolver()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.PropertyResolverType" containment="true"
-	 *        extendedMetaData="kind='element' name='property-resolver' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getPropertyResolver();
-
-    /**
-	 * Returns the value of the '<em><b>Variable Resolver</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.VariableResolverType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Variable Resolver</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Variable Resolver</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getApplicationType_VariableResolver()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.VariableResolverType" containment="true"
-	 *        extendedMetaData="kind='element' name='variable-resolver' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getVariableResolver();
-
-    /**
-	 * Returns the value of the '<em><b>Resource Handler</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.ResourceHandlerType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Resource Handler</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Resource Handler</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getApplicationType_ResourceHandler()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.ResourceHandlerType" containment="true"
-	 *        extendedMetaData="kind='element' name='resource-handler' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getResourceHandler();
-
-				/**
-	 * Returns the value of the '<em><b>System Event Listener</b></em>' reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.SystemEventListenerType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>System Event Listener</em>' reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>System Event Listener</em>' reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getApplicationType_SystemEventListener()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.SystemEventListenerType"
-	 *        extendedMetaData="kind='element' name='system-event-listener' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getSystemEventListener();
-
-				/**
-	 * Returns the value of the '<em><b>Locale Config</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.LocaleConfigType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Locale Config</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Locale Config</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getApplicationType_LocaleConfig()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.LocaleConfigType" containment="true"
-	 *        extendedMetaData="kind='element' name='locale-config' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getLocaleConfig();
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getApplicationType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-    /**
-	 * Returns the value of the '<em><b>EL Resolver</b></em>' reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.ELResolverType}.
-	 * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>EL Resolver</em>' reference list isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-	 * @return the value of the '<em>EL Resolver</em>' reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getApplicationType_ELResolver()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.ELResolverType"
-	 *        extendedMetaData="kind='element' name='el-resolver' namespace='##targetNamespace'"
-	 * @generated
-	 */
-    EList getELResolver();
-
-    /**
-	 * Returns the value of the '<em><b>Resource Bundle</b></em>' reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.ResourceBundleType}.
-	 * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Resource Bundle</em>' reference list isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-	 * @return the value of the '<em>Resource Bundle</em>' reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getApplicationType_ResourceBundle()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.ResourceBundleType"
-	 *        extendedMetaData="kind='element' name='resource-bundle' namespace='##targetNamespace'"
-	 * @generated
-	 */
-    EList getResourceBundle();
-
-    /**
-	 * Returns the value of the '<em><b>Application Extension</b></em>' reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationExtensionType}.
-	 * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Application Extension</em>' reference list isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-	 * @return the value of the '<em>Application Extension</em>' reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getApplicationType_ApplicationExtension()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.ApplicationExtensionType"
-	 *        extendedMetaData="kind='element' name='application-extension' namespace='##targetNamespace'"
-	 * @generated
-	 */
-    EList getApplicationExtension();
-
-				/**
-	 * Returns the value of the '<em><b>Default Validators</b></em>' reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.DefaultValidatorsType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Default Validators</em>' reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Default Validators</em>' reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getApplicationType_DefaultValidators()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.DefaultValidatorsType"
-	 *        extendedMetaData="kind='element' name='default-validators' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getDefaultValidators();
-
-} // ApplicationType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/AttributeClassType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/AttributeClassType.java
deleted file mode 100644
index a19aa9e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/AttributeClassType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Attribute Class Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeClassType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeClassType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getAttributeClassType()
- * @model extendedMetaData="name='attribute-class_._type' kind='simple'"
- * @generated
- */
-public interface AttributeClassType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getAttributeClassType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeClassType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getAttributeClassType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeClassType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // AttributeClassType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/AttributeExtensionType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/AttributeExtensionType.java
deleted file mode 100644
index 422dcc5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/AttributeExtensionType.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Attribute Extension Type</b></em>'.
- * <!-- end-user-doc -->
- *
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getAttributeExtensionType()
- * @model extendedMetaData="name='attribute-extension_._type'"
- * @generated
- */
-public interface AttributeExtensionType extends ExtensionType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-} // AttributeExtensionType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/AttributeNameType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/AttributeNameType.java
deleted file mode 100644
index c44d47f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/AttributeNameType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Attribute Name Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeNameType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeNameType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getAttributeNameType()
- * @model extendedMetaData="name='attribute-name_._type' kind='simple'"
- * @generated
- */
-public interface AttributeNameType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getAttributeNameType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeNameType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getAttributeNameType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeNameType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // AttributeNameType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/AttributeType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/AttributeType.java
deleted file mode 100644
index 0fb14f6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/AttributeType.java
+++ /dev/null
@@ -1,252 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Attribute Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeType#getDescription <em>Description</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeType#getDisplayName <em>Display Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeType#getIcon <em>Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeType#getAttributeName <em>Attribute Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeType#getAttributeClass <em>Attribute Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeType#getDefaultValue <em>Default Value</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeType#getSuggestedValue <em>Suggested Value</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeType#getAttributeExtension <em>Attribute Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getAttributeType()
- * @model extendedMetaData="name='attribute_._type' kind='elementOnly'"
- * @generated
- */
-public interface AttributeType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Description</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.DescriptionType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Description</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Description</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getAttributeType_Description()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.DescriptionType" containment="true"
-	 *        extendedMetaData="kind='element' name='description' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getDescription();
-
-    /**
-	 * Returns the value of the '<em><b>Display Name</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Display Name</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Display Name</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getAttributeType_DisplayName()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType" containment="true"
-	 *        extendedMetaData="kind='element' name='display-name' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getDisplayName();
-
-    /**
-	 * Returns the value of the '<em><b>Icon</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.IconType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Icon</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Icon</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getAttributeType_Icon()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.IconType" containment="true"
-	 *        extendedMetaData="kind='element' name='icon' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getIcon();
-
-    /**
-	 * Returns the value of the '<em><b>Attribute Name</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Attribute Name</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Attribute Name</em>' containment reference.
-	 * @see #setAttributeName(AttributeNameType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getAttributeType_AttributeName()
-	 * @model containment="true" required="true"
-	 *        extendedMetaData="kind='element' name='attribute-name' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	AttributeNameType getAttributeName();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeType#getAttributeName <em>Attribute Name</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Attribute Name</em>' containment reference.
-	 * @see #getAttributeName()
-	 * @generated
-	 */
-	void setAttributeName(AttributeNameType value);
-
-    /**
-	 * Returns the value of the '<em><b>Attribute Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Attribute Class</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Attribute Class</em>' containment reference.
-	 * @see #setAttributeClass(AttributeClassType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getAttributeType_AttributeClass()
-	 * @model containment="true" required="true"
-	 *        extendedMetaData="kind='element' name='attribute-class' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	AttributeClassType getAttributeClass();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeType#getAttributeClass <em>Attribute Class</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Attribute Class</em>' containment reference.
-	 * @see #getAttributeClass()
-	 * @generated
-	 */
-	void setAttributeClass(AttributeClassType value);
-
-    /**
-	 * Returns the value of the '<em><b>Default Value</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Default Value</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Default Value</em>' containment reference.
-	 * @see #setDefaultValue(DefaultValueType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getAttributeType_DefaultValue()
-	 * @model containment="true"
-	 *        extendedMetaData="kind='element' name='default-value' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	DefaultValueType getDefaultValue();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeType#getDefaultValue <em>Default Value</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Default Value</em>' containment reference.
-	 * @see #getDefaultValue()
-	 * @generated
-	 */
-	void setDefaultValue(DefaultValueType value);
-
-    /**
-	 * Returns the value of the '<em><b>Suggested Value</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Suggested Value</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Suggested Value</em>' containment reference.
-	 * @see #setSuggestedValue(SuggestedValueType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getAttributeType_SuggestedValue()
-	 * @model containment="true"
-	 *        extendedMetaData="kind='element' name='suggested-value' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	SuggestedValueType getSuggestedValue();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeType#getSuggestedValue <em>Suggested Value</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Suggested Value</em>' containment reference.
-	 * @see #getSuggestedValue()
-	 * @generated
-	 */
-	void setSuggestedValue(SuggestedValueType value);
-
-    /**
-	 * Returns the value of the '<em><b>Attribute Extension</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.AttributeExtensionType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Attribute Extension</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Attribute Extension</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getAttributeType_AttributeExtension()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.AttributeExtensionType" containment="true"
-	 *        extendedMetaData="kind='element' name='attribute-extension' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getAttributeExtension();
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getAttributeType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // AttributeType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/BaseNameType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/BaseNameType.java
deleted file mode 100644
index 7fe6f63..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/BaseNameType.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Base Name Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.BaseNameType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.BaseNameType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getBaseNameType()
- * @model extendedMetaData="name='base-name_._type' kind='simple'"
- * @generated
- */
-public interface BaseNameType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getBaseNameType_TextContent()
-	 * @model extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-    String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.BaseNameType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-    void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Id</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getBaseNameType_Id()
-	 * @model id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-    String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.BaseNameType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-    void setId(String value);
-
-} // BaseNameType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/BehaviorClassType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/BehaviorClassType.java
deleted file mode 100644
index 78ffb25..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/BehaviorClassType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Behavior Class Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.BehaviorClassType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.BehaviorClassType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getBehaviorClassType()
- * @model extendedMetaData="name='behavior-class_._type' kind='simple'"
- * @generated
- */
-public interface BehaviorClassType extends EObject {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getBehaviorClassType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.BehaviorClassType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getBehaviorClassType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.BehaviorClassType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // BehaviorClassType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/BehaviorExtensionType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/BehaviorExtensionType.java
deleted file mode 100644
index 699e5ce..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/BehaviorExtensionType.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Behavior Extension Type</b></em>'.
- * <!-- end-user-doc -->
- *
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getBehaviorExtensionType()
- * @model extendedMetaData="name='behavior-extension_._type'"
- * @generated
- */
-public interface BehaviorExtensionType extends ExtensionType {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-} // BehaviorExtensionType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/BehaviorIdType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/BehaviorIdType.java
deleted file mode 100644
index cacea62..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/BehaviorIdType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Behavior Id Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.BehaviorIdType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.BehaviorIdType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getBehaviorIdType()
- * @model extendedMetaData="name='behavior-id_._type' kind='simple'"
- * @generated
- */
-public interface BehaviorIdType extends EObject {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getBehaviorIdType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.BehaviorIdType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getBehaviorIdType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.BehaviorIdType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // BehaviorIdType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/BehaviorType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/BehaviorType.java
deleted file mode 100644
index a9eb3df..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/BehaviorType.java
+++ /dev/null
@@ -1,204 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Behavior Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.BehaviorType#getDescription <em>Description</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.BehaviorType#getDisplayName <em>Display Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.BehaviorType#getIcon <em>Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.BehaviorType#getBehaviorId <em>Behavior Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.BehaviorType#getBehaviorClass <em>Behavior Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.BehaviorType#getAttribute <em>Attribute</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.BehaviorType#getProperty <em>Property</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.BehaviorType#getBehaviorExtension <em>Behavior Extension</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getBehaviorType()
- * @model extendedMetaData="name='behavior_._type' kind='elementOnly'"
- * @generated
- */
-public interface BehaviorType extends EObject {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * Returns the value of the '<em><b>Description</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.DescriptionType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Description</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Description</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getBehaviorType_Description()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.DescriptionType" containment="true"
-	 *        extendedMetaData="kind='element' name='description' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getDescription();
-
-	/**
-	 * Returns the value of the '<em><b>Display Name</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Display Name</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Display Name</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getBehaviorType_DisplayName()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType" containment="true"
-	 *        extendedMetaData="kind='element' name='display-name' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getDisplayName();
-
-	/**
-	 * Returns the value of the '<em><b>Icon</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.IconType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Icon</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Icon</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getBehaviorType_Icon()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.IconType" containment="true"
-	 *        extendedMetaData="kind='element' name='icon' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getIcon();
-
-	/**
-	 * Returns the value of the '<em><b>Behavior Id</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Behavior Id</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Behavior Id</em>' containment reference.
-	 * @see #setBehaviorId(BehaviorIdType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getBehaviorType_BehaviorId()
-	 * @model containment="true" required="true"
-	 *        extendedMetaData="kind='element' name='behavior-id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BehaviorIdType getBehaviorId();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.BehaviorType#getBehaviorId <em>Behavior Id</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Behavior Id</em>' containment reference.
-	 * @see #getBehaviorId()
-	 * @generated
-	 */
-	void setBehaviorId(BehaviorIdType value);
-
-	/**
-	 * Returns the value of the '<em><b>Behavior Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Behavior Class</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Behavior Class</em>' containment reference.
-	 * @see #setBehaviorClass(BehaviorClassType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getBehaviorType_BehaviorClass()
-	 * @model containment="true" required="true"
-	 *        extendedMetaData="kind='element' name='behavior-class' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BehaviorClassType getBehaviorClass();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.BehaviorType#getBehaviorClass <em>Behavior Class</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Behavior Class</em>' containment reference.
-	 * @see #getBehaviorClass()
-	 * @generated
-	 */
-	void setBehaviorClass(BehaviorClassType value);
-
-	/**
-	 * Returns the value of the '<em><b>Attribute</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.AttributeType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Attribute</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Attribute</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getBehaviorType_Attribute()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.AttributeType" containment="true"
-	 *        extendedMetaData="kind='element' name='attribute' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getAttribute();
-
-	/**
-	 * Returns the value of the '<em><b>Property</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.PropertyType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Property</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Property</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getBehaviorType_Property()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.PropertyType" containment="true"
-	 *        extendedMetaData="kind='element' name='property' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getProperty();
-
-	/**
-	 * Returns the value of the '<em><b>Behavior Extension</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.BehaviorExtensionType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Behavior Extension</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Behavior Extension</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getBehaviorType_BehaviorExtension()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.BehaviorExtensionType" containment="true"
-	 *        extendedMetaData="kind='element' name='behavior-extension' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getBehaviorExtension();
-
-} // BehaviorType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ClientBehaviorRendererClassType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ClientBehaviorRendererClassType.java
deleted file mode 100644
index b99d00f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ClientBehaviorRendererClassType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Client Behavior Renderer Class Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererClassType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererClassType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getClientBehaviorRendererClassType()
- * @model extendedMetaData="name='client-behavior-renderer-class_._type' kind='simple'"
- * @generated
- */
-public interface ClientBehaviorRendererClassType extends EObject {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getClientBehaviorRendererClassType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererClassType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getClientBehaviorRendererClassType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererClassType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // ClientBehaviorRendererClassType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ClientBehaviorRendererType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ClientBehaviorRendererType.java
deleted file mode 100644
index 9428d03..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ClientBehaviorRendererType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Client Behavior Renderer Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererType#getClientBehaviorRendererType <em>Client Behavior Renderer Type</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererType#getClientBehaviorRendererClass <em>Client Behavior Renderer Class</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getClientBehaviorRendererType()
- * @model extendedMetaData="name='client-behavior-renderer_._type' kind='elementOnly'"
- * @generated
- */
-public interface ClientBehaviorRendererType extends EObject {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * Returns the value of the '<em><b>Client Behavior Renderer Type</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Client Behavior Renderer Type</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Client Behavior Renderer Type</em>' containment reference.
-	 * @see #setClientBehaviorRendererType(ClientBehaviorRendererTypeType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getClientBehaviorRendererType_ClientBehaviorRendererType()
-	 * @model containment="true" required="true"
-	 *        extendedMetaData="kind='element' name='client-behavior-renderer-type' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ClientBehaviorRendererTypeType getClientBehaviorRendererType();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererType#getClientBehaviorRendererType <em>Client Behavior Renderer Type</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Client Behavior Renderer Type</em>' containment reference.
-	 * @see #getClientBehaviorRendererType()
-	 * @generated
-	 */
-	void setClientBehaviorRendererType(ClientBehaviorRendererTypeType value);
-
-	/**
-	 * Returns the value of the '<em><b>Client Behavior Renderer Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Client Behavior Renderer Class</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Client Behavior Renderer Class</em>' containment reference.
-	 * @see #setClientBehaviorRendererClass(ClientBehaviorRendererClassType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getClientBehaviorRendererType_ClientBehaviorRendererClass()
-	 * @model containment="true" required="true"
-	 *        extendedMetaData="kind='element' name='client-behavior-renderer-class' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ClientBehaviorRendererClassType getClientBehaviorRendererClass();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererType#getClientBehaviorRendererClass <em>Client Behavior Renderer Class</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Client Behavior Renderer Class</em>' containment reference.
-	 * @see #getClientBehaviorRendererClass()
-	 * @generated
-	 */
-	void setClientBehaviorRendererClass(ClientBehaviorRendererClassType value);
-
-} // ClientBehaviorRendererType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ClientBehaviorRendererTypeType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ClientBehaviorRendererTypeType.java
deleted file mode 100644
index 5b6c47a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ClientBehaviorRendererTypeType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Client Behavior Renderer Type Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererTypeType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererTypeType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getClientBehaviorRendererTypeType()
- * @model extendedMetaData="name='client-behavior-renderer-type_._type' kind='simple'"
- * @generated
- */
-public interface ClientBehaviorRendererTypeType extends EObject {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getClientBehaviorRendererTypeType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererTypeType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getClientBehaviorRendererTypeType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererTypeType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // ClientBehaviorRendererTypeType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ComponentClassType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ComponentClassType.java
deleted file mode 100644
index d970637..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ComponentClassType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Component Class Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentClassType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentClassType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getComponentClassType()
- * @model extendedMetaData="name='component-class_._type' kind='simple'"
- * @generated
- */
-public interface ComponentClassType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getComponentClassType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentClassType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getComponentClassType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentClassType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // ComponentClassType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ComponentExtensionType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ComponentExtensionType.java
deleted file mode 100644
index efd1b71..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ComponentExtensionType.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Component Extension Type</b></em>'.
- * <!-- end-user-doc -->
- *
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getComponentExtensionType()
- * @model extendedMetaData="name='component-extension_._type'"
- * @generated
- */
-public interface ComponentExtensionType extends ExtensionType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-} // ComponentExtensionType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ComponentFamilyType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ComponentFamilyType.java
deleted file mode 100644
index 4079ca0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ComponentFamilyType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Component Family Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentFamilyType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentFamilyType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getComponentFamilyType()
- * @model extendedMetaData="name='component-family_._type' kind='simple'"
- * @generated
- */
-public interface ComponentFamilyType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getComponentFamilyType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentFamilyType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getComponentFamilyType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentFamilyType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // ComponentFamilyType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ComponentType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ComponentType.java
deleted file mode 100644
index bbd4673..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ComponentType.java
+++ /dev/null
@@ -1,250 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Component Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentType#getDescription <em>Description</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentType#getDisplayName <em>Display Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentType#getIcon <em>Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentType#getComponentType <em>Component Type</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentType#getComponentClass <em>Component Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentType#getFacet <em>Facet</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentType#getAttribute <em>Attribute</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentType#getProperty <em>Property</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentType#getComponentExtension <em>Component Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getComponentType()
- * @model extendedMetaData="name='component_._type' kind='elementOnly'"
- * @generated
- */
-public interface ComponentType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Description</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.DescriptionType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Description</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Description</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getComponentType_Description()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.DescriptionType" containment="true"
-	 *        extendedMetaData="kind='element' name='description' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getDescription();
-
-    /**
-	 * Returns the value of the '<em><b>Display Name</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Display Name</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Display Name</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getComponentType_DisplayName()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType" containment="true"
-	 *        extendedMetaData="kind='element' name='display-name' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getDisplayName();
-
-    /**
-	 * Returns the value of the '<em><b>Icon</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.IconType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Icon</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Icon</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getComponentType_Icon()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.IconType" containment="true"
-	 *        extendedMetaData="kind='element' name='icon' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getIcon();
-
-    /**
-	 * Returns the value of the '<em><b>Component Type</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Component Type</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Component Type</em>' containment reference.
-	 * @see #setComponentType(ComponentTypeType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getComponentType_ComponentType()
-	 * @model containment="true" required="true"
-	 *        extendedMetaData="kind='element' name='component-type' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ComponentTypeType getComponentType();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentType#getComponentType <em>Component Type</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Component Type</em>' containment reference.
-	 * @see #getComponentType()
-	 * @generated
-	 */
-	void setComponentType(ComponentTypeType value);
-
-    /**
-	 * Returns the value of the '<em><b>Component Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Component Class</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Component Class</em>' containment reference.
-	 * @see #setComponentClass(ComponentClassType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getComponentType_ComponentClass()
-	 * @model containment="true" required="true"
-	 *        extendedMetaData="kind='element' name='component-class' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ComponentClassType getComponentClass();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentType#getComponentClass <em>Component Class</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Component Class</em>' containment reference.
-	 * @see #getComponentClass()
-	 * @generated
-	 */
-	void setComponentClass(ComponentClassType value);
-
-    /**
-	 * Returns the value of the '<em><b>Facet</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.FacetType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Facet</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Facet</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getComponentType_Facet()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.FacetType" containment="true"
-	 *        extendedMetaData="kind='element' name='facet' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getFacet();
-
-    /**
-	 * Returns the value of the '<em><b>Attribute</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.AttributeType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Attribute</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Attribute</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getComponentType_Attribute()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.AttributeType" containment="true"
-	 *        extendedMetaData="kind='element' name='attribute' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getAttribute();
-
-    /**
-	 * Returns the value of the '<em><b>Property</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.PropertyType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Property</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Property</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getComponentType_Property()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.PropertyType" containment="true"
-	 *        extendedMetaData="kind='element' name='property' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getProperty();
-
-    /**
-	 * Returns the value of the '<em><b>Component Extension</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.ComponentExtensionType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Component Extension</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Component Extension</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getComponentType_ComponentExtension()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.ComponentExtensionType" containment="true"
-	 *        extendedMetaData="kind='element' name='component-extension' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getComponentExtension();
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getComponentType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // ComponentType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ComponentTypeType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ComponentTypeType.java
deleted file mode 100644
index be947b9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ComponentTypeType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Component Type Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentTypeType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentTypeType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getComponentTypeType()
- * @model extendedMetaData="name='component-type_._type' kind='simple'"
- * @generated
- */
-public interface ComponentTypeType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getComponentTypeType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentTypeType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getComponentTypeType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentTypeType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // ComponentTypeType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ConverterClassType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ConverterClassType.java
deleted file mode 100644
index f2b2dd2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ConverterClassType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Converter Class Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterClassType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterClassType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getConverterClassType()
- * @model extendedMetaData="name='converter-class_._type' kind='simple'"
- * @generated
- */
-public interface ConverterClassType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getConverterClassType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterClassType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getConverterClassType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterClassType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // ConverterClassType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ConverterExtensionType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ConverterExtensionType.java
deleted file mode 100644
index 018aade..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ConverterExtensionType.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Converter Extension Type</b></em>'.
- * <!-- end-user-doc -->
- *
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getConverterExtensionType()
- * @model extendedMetaData="name='converter-extension_._type'"
- * @generated
- */
-public interface ConverterExtensionType extends ExtensionType {
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-} // ConverterExtensionType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ConverterForClassType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ConverterForClassType.java
deleted file mode 100644
index 90348e7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ConverterForClassType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Converter For Class Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterForClassType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterForClassType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getConverterForClassType()
- * @model extendedMetaData="name='converter-for-class_._type' kind='simple'"
- * @generated
- */
-public interface ConverterForClassType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getConverterForClassType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterForClassType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getConverterForClassType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterForClassType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // ConverterForClassType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ConverterIdType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ConverterIdType.java
deleted file mode 100644
index 2adfd4e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ConverterIdType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Converter Id Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterIdType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterIdType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getConverterIdType()
- * @model extendedMetaData="name='converter-id_._type' kind='simple'"
- * @generated
- */
-public interface ConverterIdType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getConverterIdType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterIdType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getConverterIdType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterIdType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // ConverterIdType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ConverterType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ConverterType.java
deleted file mode 100644
index 90eba92..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ConverterType.java
+++ /dev/null
@@ -1,260 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Converter Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterType#getDescription <em>Description</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterType#getDisplayName <em>Display Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterType#getIcon <em>Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterType#getConverterId <em>Converter Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterType#getConverterForClass <em>Converter For Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterType#getConverterClass <em>Converter Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterType#getAttribute <em>Attribute</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterType#getProperty <em>Property</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterType#getConverterExtension <em>Converter Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getConverterType()
- * @model extendedMetaData="name='converter_._type' kind='elementOnly'"
- * @generated
- */
-public interface ConverterType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Description</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.DescriptionType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Description</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Description</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getConverterType_Description()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.DescriptionType" containment="true"
-	 *        extendedMetaData="kind='element' name='description' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getDescription();
-
-    /**
-	 * Returns the value of the '<em><b>Display Name</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Display Name</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Display Name</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getConverterType_DisplayName()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType" containment="true"
-	 *        extendedMetaData="kind='element' name='display-name' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getDisplayName();
-
-    /**
-	 * Returns the value of the '<em><b>Icon</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.IconType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Icon</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Icon</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getConverterType_Icon()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.IconType" containment="true"
-	 *        extendedMetaData="kind='element' name='icon' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getIcon();
-
-    /**
-	 * Returns the value of the '<em><b>Converter Id</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Converter Id</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Converter Id</em>' containment reference.
-	 * @see #setConverterId(ConverterIdType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getConverterType_ConverterId()
-	 * @model containment="true"
-	 *        extendedMetaData="kind='element' name='converter-id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ConverterIdType getConverterId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterType#getConverterId <em>Converter Id</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Converter Id</em>' containment reference.
-	 * @see #getConverterId()
-	 * @generated
-	 */
-	void setConverterId(ConverterIdType value);
-
-    /**
-	 * Returns the value of the '<em><b>Converter For Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Converter For Class</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Converter For Class</em>' containment reference.
-	 * @see #setConverterForClass(ConverterForClassType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getConverterType_ConverterForClass()
-	 * @model containment="true"
-	 *        extendedMetaData="kind='element' name='converter-for-class' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ConverterForClassType getConverterForClass();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterType#getConverterForClass <em>Converter For Class</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Converter For Class</em>' containment reference.
-	 * @see #getConverterForClass()
-	 * @generated
-	 */
-	void setConverterForClass(ConverterForClassType value);
-
-    /**
-	 * Returns the value of the '<em><b>Converter Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Converter Class</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Converter Class</em>' containment reference.
-	 * @see #setConverterClass(ConverterClassType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getConverterType_ConverterClass()
-	 * @model containment="true" required="true"
-	 *        extendedMetaData="kind='element' name='converter-class' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ConverterClassType getConverterClass();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterType#getConverterClass <em>Converter Class</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Converter Class</em>' containment reference.
-	 * @see #getConverterClass()
-	 * @generated
-	 */
-	void setConverterClass(ConverterClassType value);
-
-    /**
-	 * Returns the value of the '<em><b>Attribute</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.AttributeType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Attribute</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Attribute</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getConverterType_Attribute()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.AttributeType" containment="true"
-	 *        extendedMetaData="kind='element' name='attribute' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getAttribute();
-
-    /**
-	 * Returns the value of the '<em><b>Property</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.PropertyType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Property</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Property</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getConverterType_Property()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.PropertyType" containment="true"
-	 *        extendedMetaData="kind='element' name='property' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getProperty();
-
-    /**
-	 * Returns the value of the '<em><b>Converter Extension</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.ConverterExtensionType}.
-	 * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Converter Extension</em>' containment reference list isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-	 * @return the value of the '<em>Converter Extension</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getConverterType_ConverterExtension()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.ConverterExtensionType" containment="true"
-	 *        extendedMetaData="kind='element' name='converter-extension' namespace='##targetNamespace'"
-	 * @generated
-	 */
-    EList getConverterExtension();
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getConverterType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // ConverterType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/DefaultLocaleType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/DefaultLocaleType.java
deleted file mode 100644
index c58b3f2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/DefaultLocaleType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Default Locale Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DefaultLocaleType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DefaultLocaleType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDefaultLocaleType()
- * @model extendedMetaData="name='default-locale_._type' kind='simple'"
- * @generated
- */
-public interface DefaultLocaleType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDefaultLocaleType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DefaultLocaleType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDefaultLocaleType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DefaultLocaleType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // DefaultLocaleType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/DefaultRenderKitIdType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/DefaultRenderKitIdType.java
deleted file mode 100644
index 3f9ddda..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/DefaultRenderKitIdType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Default Render Kit Id Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DefaultRenderKitIdType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DefaultRenderKitIdType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDefaultRenderKitIdType()
- * @model extendedMetaData="name='default-render-kit-id_._type' kind='simple'"
- * @generated
- */
-public interface DefaultRenderKitIdType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDefaultRenderKitIdType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DefaultRenderKitIdType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDefaultRenderKitIdType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DefaultRenderKitIdType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // DefaultRenderKitIdType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/DefaultValidatorsType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/DefaultValidatorsType.java
deleted file mode 100644
index 18d4e8a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/DefaultValidatorsType.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Default Validators Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DefaultValidatorsType#getValidatorId <em>Validator Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DefaultValidatorsType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDefaultValidatorsType()
- * @model extendedMetaData="name='default-validators_._type' kind='elementOnly'"
- * @generated
- */
-public interface DefaultValidatorsType extends EObject {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * Returns the value of the '<em><b>Validator Id</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorIdType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Validator Id</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Validator Id</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDefaultValidatorsType_ValidatorId()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.ValidatorIdType" containment="true"
-	 *        extendedMetaData="kind='element' name='validator-id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getValidatorId();
-
-	/**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDefaultValidatorsType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DefaultValidatorsType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // DefaultValidatorsType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/DefaultValueType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/DefaultValueType.java
deleted file mode 100644
index 50950fd..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/DefaultValueType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Default Value Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DefaultValueType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DefaultValueType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDefaultValueType()
- * @model extendedMetaData="name='default-value_._type' kind='simple'"
- * @generated
- */
-public interface DefaultValueType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDefaultValueType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DefaultValueType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDefaultValueType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DefaultValueType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // DefaultValueType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/DescriptionType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/DescriptionType.java
deleted file mode 100644
index 004c2aa..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/DescriptionType.java
+++ /dev/null
@@ -1,123 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Description Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DescriptionType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DescriptionType#getLang <em>Lang</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DescriptionType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDescriptionType()
- * @model extendedMetaData="name='description_._type' kind='simple'"
- * @generated
- */
-public interface DescriptionType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDescriptionType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DescriptionType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Lang</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Lang</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Lang</em>' attribute.
-	 * @see #setLang(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDescriptionType_Lang()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Language"
-	 *        extendedMetaData="kind='attribute' name='lang' namespace='http://www.w3.org/XML/1998/namespace'"
-	 * @generated
-	 */
-	String getLang();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DescriptionType#getLang <em>Lang</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Lang</em>' attribute.
-	 * @see #getLang()
-	 * @generated
-	 */
-	void setLang(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDescriptionType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DescriptionType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // DescriptionType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/DisplayNameType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/DisplayNameType.java
deleted file mode 100644
index 0e47ccc..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/DisplayNameType.java
+++ /dev/null
@@ -1,123 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Display Name Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType#getLang <em>Lang</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDisplayNameType()
- * @model extendedMetaData="name='display-name_._type' kind='simple'"
- * @generated
- */
-public interface DisplayNameType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDisplayNameType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Lang</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Lang</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Lang</em>' attribute.
-	 * @see #setLang(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDisplayNameType_Lang()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Language"
-	 *        extendedMetaData="kind='attribute' name='lang' namespace='http://www.w3.org/XML/1998/namespace'"
-	 * @generated
-	 */
-	String getLang();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType#getLang <em>Lang</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Lang</em>' attribute.
-	 * @see #getLang()
-	 * @generated
-	 */
-	void setLang(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDisplayNameType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // DisplayNameType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/DocumentRoot.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/DocumentRoot.java
deleted file mode 100644
index d6fe20b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/DocumentRoot.java
+++ /dev/null
@@ -1,3208 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.common.util.EMap;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.util.FeatureMap;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Document Root</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getMixed <em>Mixed</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getXMLNSPrefixMap <em>XMLNS Prefix Map</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getXSISchemaLocation <em>XSI Schema Location</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getAbsoluteOrdering <em>Absolute Ordering</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getActionListener <em>Action Listener</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getApplication <em>Application</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getApplicationFactory <em>Application Factory</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getAttribute <em>Attribute</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getAttributeClass <em>Attribute Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getAttributeExtension <em>Attribute Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getAttributeName <em>Attribute Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getBehavior <em>Behavior</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getBehaviorClass <em>Behavior Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getBehaviorId <em>Behavior Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getBehaviorExtension <em>Behavior Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getComponent <em>Component</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getComponentClass <em>Component Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getComponentExtension <em>Component Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getComponentFamily <em>Component Family</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getComponentType <em>Component Type</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getConverter <em>Converter</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getConverterClass <em>Converter Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getConverterForClass <em>Converter For Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getConverterId <em>Converter Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getDefaultLocale <em>Default Locale</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getDefaultRenderKitId <em>Default Render Kit Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getDefaultValidators <em>Default Validators</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getDefaultValue <em>Default Value</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getDescription <em>Description</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getDisplayName <em>Display Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getExceptionHandlerFactory <em>Exception Handler Factory</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getExternalContextFactory <em>External Context Factory</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getFacesConfig <em>Faces Config</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getFacesContextFactory <em>Faces Context Factory</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getFacet <em>Facet</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getFacetExtension <em>Facet Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getFacetName <em>Facet Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getFactory <em>Factory</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getFromAction <em>From Action</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getFromOutcome <em>From Outcome</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getFromViewId <em>From View Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getIcon <em>Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getIf <em>If</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getKey <em>Key</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getKeyClass <em>Key Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getLargeIcon <em>Large Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getLifecycle <em>Lifecycle</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getLifecycleFactory <em>Lifecycle Factory</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getListEntries <em>List Entries</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getLocaleConfig <em>Locale Config</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getManagedBean <em>Managed Bean</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getManagedBeanClass <em>Managed Bean Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getManagedBeanName <em>Managed Bean Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getManagedBeanScope <em>Managed Bean Scope</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getManagedProperty <em>Managed Property</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getMapEntries <em>Map Entries</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getMapEntry <em>Map Entry</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getMessageBundle <em>Message Bundle</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getName <em>Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getNavigationCase <em>Navigation Case</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getNavigationHandler <em>Navigation Handler</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getNavigationRule <em>Navigation Rule</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getNullValue <em>Null Value</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getOrdering <em>Ordering</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getOrderingOrdering <em>Ordering Ordering</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getOthers <em>Others</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getPartialViewContextFactory <em>Partial View Context Factory</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getPhaseListener <em>Phase Listener</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getProperty <em>Property</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getPropertyClass <em>Property Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getPropertyExtension <em>Property Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getPropertyName <em>Property Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getPropertyResolver <em>Property Resolver</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRedirect <em>Redirect</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRedirectViewParam <em>Redirect View Param</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getReferencedBean <em>Referenced Bean</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getReferencedBeanClass <em>Referenced Bean Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getReferencedBeanName <em>Referenced Bean Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRenderer <em>Renderer</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRendererClass <em>Renderer Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRendererExtension <em>Renderer Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRendererType <em>Renderer Type</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRenderKit <em>Render Kit</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRenderKitClass <em>Render Kit Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRenderKitFactory <em>Render Kit Factory</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRenderKitId <em>Render Kit Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getResourceHandler <em>Resource Handler</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getSmallIcon <em>Small Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getSourceClass <em>Source Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getStateManager <em>State Manager</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getSuggestedValue <em>Suggested Value</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getSupportedLocale <em>Supported Locale</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getSystemEventClass <em>System Event Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getSystemEventListener <em>System Event Listener</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getSystemEventListenerClass <em>System Event Listener Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getTagHandlerDelegateFactory <em>Tag Handler Delegate Factory</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getToViewId <em>To View Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getValidator <em>Validator</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getValidatorClass <em>Validator Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getValidatorId <em>Validator Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getValue <em>Value</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getValueClass <em>Value Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getVariableResolver <em>Variable Resolver</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getViewDeclarationLanguageFactory <em>View Declaration Language Factory</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getViewHandler <em>View Handler</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getVisitContextFactory <em>Visit Context Factory</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot()
- * @model extendedMetaData="name='' kind='mixed'"
- * @generated
- */
-public interface DocumentRoot extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Mixed</b></em>' attribute list.
-	 * The list contents are of type {@link org.eclipse.emf.ecore.util.FeatureMap.Entry}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Mixed</em>' attribute list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Mixed</em>' attribute list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_Mixed()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.EFeatureMapEntry" many="true"
-	 *        extendedMetaData="kind='elementWildcard' name=':mixed'"
-	 * @generated
-	 */
-	FeatureMap getMixed();
-
-    /**
-	 * Returns the value of the '<em><b>XMLNS Prefix Map</b></em>' map.
-	 * The key is of type {@link java.lang.String},
-	 * and the value is of type {@link java.lang.String},
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>XMLNS Prefix Map</em>' map isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>XMLNS Prefix Map</em>' map.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_XMLNSPrefixMap()
-	 * @model mapType="org.eclipse.emf.ecore.EStringToStringMapEntry" keyType="java.lang.String" valueType="java.lang.String" transient="true"
-	 *        extendedMetaData="kind='attribute' name='xmlns:prefix'"
-	 * @generated
-	 */
-	EMap getXMLNSPrefixMap();
-
-    /**
-	 * Returns the value of the '<em><b>XSI Schema Location</b></em>' map.
-	 * The key is of type {@link java.lang.String},
-	 * and the value is of type {@link java.lang.String},
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>XSI Schema Location</em>' map isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>XSI Schema Location</em>' map.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_XSISchemaLocation()
-	 * @model mapType="org.eclipse.emf.ecore.EStringToStringMapEntry" keyType="java.lang.String" valueType="java.lang.String" transient="true"
-	 *        extendedMetaData="kind='attribute' name='xsi:schemaLocation'"
-	 * @generated
-	 */
-	EMap getXSISchemaLocation();
-
-    /**
-	 * Returns the value of the '<em><b>Absolute Ordering</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Absolute Ordering</em>' containment reference.
-	 * @see #setAbsoluteOrdering(AbsoluteOrderingType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_AbsoluteOrdering()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='absolute-ordering' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	AbsoluteOrderingType getAbsoluteOrdering();
-
-				/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getAbsoluteOrdering <em>Absolute Ordering</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Absolute Ordering</em>' containment reference.
-	 * @see #getAbsoluteOrdering()
-	 * @generated
-	 */
-	void setAbsoluteOrdering(AbsoluteOrderingType value);
-
-				/**
-	 * Returns the value of the '<em><b>Action Listener</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *  ==================== Subordinate
-	 *                 Elements ============================       The
-	 *                 "action-listener" element contains the fully
-	 *                 qualified class name     of the concrete ActionListener
-	 *                 implementation class that will be called     during the
-	 *                 Invoke Application phase of the request processing
-	 *                 lifecycle.     It must be of type "ClassName". 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Action Listener</em>' containment reference.
-	 * @see #setActionListener(ActionListenerType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_ActionListener()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='action-listener' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ActionListenerType getActionListener();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getActionListener <em>Action Listener</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Action Listener</em>' containment reference.
-	 * @see #getActionListener()
-	 * @generated
-	 */
-	void setActionListener(ActionListenerType value);
-
-    /**
-	 * Returns the value of the '<em><b>Application</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *  ==================== Definition Elements
-	 *                 =============================       The
-	 *                 "application" element provides a mechanism to
-	 *                 define the various     per-application-singleton
-	 *                 implementation classes for a particular web
-	 *                 application that is utilizing JavaServer Faces.  For
-	 *                 nested elements     that are not specified, the JSF
-	 *                 implementation must provide a suitable     default. 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Application</em>' containment reference.
-	 * @see #setApplication(ApplicationType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_Application()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='application' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ApplicationType getApplication();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getApplication <em>Application</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Application</em>' containment reference.
-	 * @see #getApplication()
-	 * @generated
-	 */
-	void setApplication(ApplicationType value);
-
-    /**
-	 * Returns the value of the '<em><b>Application Factory</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *      The "application-factory"
-	 *                 element contains the fully qualified class     name of
-	 *                 the concrete ApplicationFactory implementation class
-	 *                 that     will be called when
-	 *                 FactoryFinder.getFactory(APPLICATION_FACTORY) is
-	 *                 called. It must be of type "ClassName". 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Application Factory</em>' containment reference.
-	 * @see #setApplicationFactory(ApplicationFactoryType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_ApplicationFactory()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='application-factory' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ApplicationFactoryType getApplicationFactory();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getApplicationFactory <em>Application Factory</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Application Factory</em>' containment reference.
-	 * @see #getApplicationFactory()
-	 * @generated
-	 */
-	void setApplicationFactory(ApplicationFactoryType value);
-
-    /**
-	 * Returns the value of the '<em><b>Attribute</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *      The "attribute" element
-	 *                 represents a named, typed, value associated with     the
-	 *                 parent UIComponent via the generic attributes mechanism.
-	 *                 Attribute names must be unique within the scope of the
-	 *                 parent (or related)     component. 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Attribute</em>' containment reference.
-	 * @see #setAttribute(AttributeType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_Attribute()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='attribute' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	AttributeType getAttribute();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getAttribute <em>Attribute</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Attribute</em>' containment reference.
-	 * @see #getAttribute()
-	 * @generated
-	 */
-	void setAttribute(AttributeType value);
-
-    /**
-	 * Returns the value of the '<em><b>Attribute Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *     The "attribute-class" element represents the Java type of the value
-	 *     associated with this attribute name.  It must be of type "ClassName".
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Attribute Class</em>' containment reference.
-	 * @see #setAttributeClass(AttributeClassType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_AttributeClass()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='attribute-class' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	AttributeClassType getAttributeClass();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getAttributeClass <em>Attribute Class</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Attribute Class</em>' containment reference.
-	 * @see #getAttributeClass()
-	 * @generated
-	 */
-	void setAttributeClass(AttributeClassType value);
-
-    /**
-	 * Returns the value of the '<em><b>Attribute Extension</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *       Extension element for attribute.
-	 *                 May contain implementation     specific content. 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Attribute Extension</em>' containment reference.
-	 * @see #setAttributeExtension(AttributeExtensionType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_AttributeExtension()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='attribute-extension' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	AttributeExtensionType getAttributeExtension();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getAttributeExtension <em>Attribute Extension</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Attribute Extension</em>' containment reference.
-	 * @see #getAttributeExtension()
-	 * @generated
-	 */
-	void setAttributeExtension(AttributeExtensionType value);
-
-    /**
-	 * Returns the value of the '<em><b>Attribute Name</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *      The "attribute-name"
-	 *                 element represents the name under which the
-	 *                 corresponding value will be stored, in the generic
-	 *                 attributes of the     UIComponent we are related to. 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Attribute Name</em>' containment reference.
-	 * @see #setAttributeName(AttributeNameType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_AttributeName()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='attribute-name' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	AttributeNameType getAttributeName();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getAttributeName <em>Attribute Name</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Attribute Name</em>' containment reference.
-	 * @see #getAttributeName()
-	 * @generated
-	 */
-	void setAttributeName(AttributeNameType value);
-
-    /**
-	 * Returns the value of the '<em><b>Behavior</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Behavior</em>' containment reference.
-	 * @see #setBehavior(BehaviorType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_Behavior()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='behavior' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BehaviorType getBehavior();
-
-				/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getBehavior <em>Behavior</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Behavior</em>' containment reference.
-	 * @see #getBehavior()
-	 * @generated
-	 */
-	void setBehavior(BehaviorType value);
-
-				/**
-	 * Returns the value of the '<em><b>Behavior Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Behavior Class</em>' containment reference.
-	 * @see #setBehaviorClass(BehaviorClassType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_BehaviorClass()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='behavior-class' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BehaviorClassType getBehaviorClass();
-
-				/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getBehaviorClass <em>Behavior Class</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Behavior Class</em>' containment reference.
-	 * @see #getBehaviorClass()
-	 * @generated
-	 */
-	void setBehaviorClass(BehaviorClassType value);
-
-				/**
-	 * Returns the value of the '<em><b>Behavior Id</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Behavior Id</em>' containment reference.
-	 * @see #setBehaviorId(BehaviorIdType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_BehaviorId()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='behavior-id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BehaviorIdType getBehaviorId();
-
-				/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getBehaviorId <em>Behavior Id</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Behavior Id</em>' containment reference.
-	 * @see #getBehaviorId()
-	 * @generated
-	 */
-	void setBehaviorId(BehaviorIdType value);
-
-				/**
-	 * Returns the value of the '<em><b>Behavior Extension</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Behavior Extension</em>' containment reference.
-	 * @see #setBehaviorExtension(BehaviorExtensionType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_BehaviorExtension()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='behavior-extension' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BehaviorExtensionType getBehaviorExtension();
-
-				/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getBehaviorExtension <em>Behavior Extension</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Behavior Extension</em>' containment reference.
-	 * @see #getBehaviorExtension()
-	 * @generated
-	 */
-	void setBehaviorExtension(BehaviorExtensionType value);
-
-				/**
-	 * Returns the value of the '<em><b>Component</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *      The "component" element
-	 *                 represents a concrete UIComponent implementation
-	 *                 class that should be registered under the specified type
-	 *                 identifier,     along with its associated properties and
-	 *                 attributes.  Component types must     be unique within
-	 *                 the entire web application.      Nested
-	 *                 "attribute" elements identify generic
-	 *                 attributes that are recognized     by the implementation
-	 *                 logic of this component.  Nested "property"
-	 *                 elements     identify JavaBeans properties of the
-	 *                 component class that may be exposed     for manipulation
-	 *                 via tools. 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Component</em>' containment reference.
-	 * @see #setComponent(ComponentType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_Component()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='component' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ComponentType getComponent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getComponent <em>Component</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Component</em>' containment reference.
-	 * @see #getComponent()
-	 * @generated
-	 */
-	void setComponent(ComponentType value);
-
-    /**
-	 * Returns the value of the '<em><b>Component Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *      The "component-class"
-	 *                 element represents the fully qualified class name     of
-	 *                 a concrete UIComponent implementation class.  It must be
-	 *                 of     type "ClassName". 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Component Class</em>' containment reference.
-	 * @see #setComponentClass(ComponentClassType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_ComponentClass()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='component-class' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ComponentClassType getComponentClass();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getComponentClass <em>Component Class</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Component Class</em>' containment reference.
-	 * @see #getComponentClass()
-	 * @generated
-	 */
-	void setComponentClass(ComponentClassType value);
-
-    /**
-	 * Returns the value of the '<em><b>Component Extension</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *       Extension element for component.
-	 *                 May contain implementation     specific content. 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Component Extension</em>' containment reference.
-	 * @see #setComponentExtension(ComponentExtensionType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_ComponentExtension()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='component-extension' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ComponentExtensionType getComponentExtension();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getComponentExtension <em>Component Extension</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Component Extension</em>' containment reference.
-	 * @see #getComponentExtension()
-	 * @generated
-	 */
-	void setComponentExtension(ComponentExtensionType value);
-
-    /**
-	 * Returns the value of the '<em><b>Component Family</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *     The "component-family" element represents the component family for
-	 *     which the Renderer represented by the parent "renderer" element will be
-	 *     used.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Component Family</em>' containment reference.
-	 * @see #setComponentFamily(ComponentFamilyType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_ComponentFamily()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='component-family' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ComponentFamilyType getComponentFamily();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getComponentFamily <em>Component Family</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Component Family</em>' containment reference.
-	 * @see #getComponentFamily()
-	 * @generated
-	 */
-	void setComponentFamily(ComponentFamilyType value);
-
-    /**
-	 * Returns the value of the '<em><b>Component Type</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *      The "component-type"
-	 *                 element represents the name under which the
-	 *                 corresponding UIComponent class should be registered. 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Component Type</em>' containment reference.
-	 * @see #setComponentType(ComponentTypeType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_ComponentType()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='component-type' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ComponentTypeType getComponentType();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getComponentType <em>Component Type</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Component Type</em>' containment reference.
-	 * @see #getComponentType()
-	 * @generated
-	 */
-	void setComponentType(ComponentTypeType value);
-
-    /**
-	 * Returns the value of the '<em><b>Converter</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *      The "converter" element
-	 *                 represents a concrete Converter implementation     class
-	 *                 that should be registered under the specified converter
-	 *                 identifier.     Converter identifiers must be unique
-	 *                 within the entire web application.      Nested
-	 *                 "attribute" elements identify generic
-	 *                 attributes that may be     configured on the
-	 *                 corresponding UIComponent in order to affect the
-	 *                 operation of the Converter.  Nested "property"
-	 *                 elements identify JavaBeans     properties of the
-	 *                 Converter implementation class that may be configured
-	 *                 to affect the operation of the Converter. 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Converter</em>' containment reference.
-	 * @see #setConverter(ConverterType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_Converter()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='converter' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ConverterType getConverter();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getConverter <em>Converter</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Converter</em>' containment reference.
-	 * @see #getConverter()
-	 * @generated
-	 */
-	void setConverter(ConverterType value);
-
-    /**
-	 * Returns the value of the '<em><b>Converter Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *     The "converter-class" element represents the fully qualified class name
-	 *     of a concrete Converter implementation class.  It must be of
-	 *     type "ClassName".
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Converter Class</em>' containment reference.
-	 * @see #setConverterClass(ConverterClassType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_ConverterClass()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='converter-class' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ConverterClassType getConverterClass();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getConverterClass <em>Converter Class</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Converter Class</em>' containment reference.
-	 * @see #getConverterClass()
-	 * @generated
-	 */
-	void setConverterClass(ConverterClassType value);
-
-    /**
-	 * Returns the value of the '<em><b>Converter For Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *     The "converter-for-class" element represents the fully qualified class name
-	 *     for which a Converter class will be registered.  It must be of
-	 *     type "ClassName".
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Converter For Class</em>' containment reference.
-	 * @see #setConverterForClass(ConverterForClassType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_ConverterForClass()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='converter-for-class' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ConverterForClassType getConverterForClass();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getConverterForClass <em>Converter For Class</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Converter For Class</em>' containment reference.
-	 * @see #getConverterForClass()
-	 * @generated
-	 */
-	void setConverterForClass(ConverterForClassType value);
-
-    /**
-	 * Returns the value of the '<em><b>Converter Id</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *     The "converter-id" element represents the identifier under which the
-	 *     corresponding Converter class should be registered.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Converter Id</em>' containment reference.
-	 * @see #setConverterId(ConverterIdType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_ConverterId()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='converter-id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ConverterIdType getConverterId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getConverterId <em>Converter Id</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Converter Id</em>' containment reference.
-	 * @see #getConverterId()
-	 * @generated
-	 */
-	void setConverterId(ConverterIdType value);
-
-    /**
-	 * Returns the value of the '<em><b>Default Locale</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *       The "default-locale"
-	 *                 element declares the default locale for this
-	 *                 application instance.  It must be specified as
-	 *                 :language:[_:country:[_:variant:]] without the colons,
-	 *                 for example      "ja_JP_SJIS".  The separators
-	 *                 between the segments may be '-' or
-	 *                 '_'. 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Default Locale</em>' containment reference.
-	 * @see #setDefaultLocale(DefaultLocaleType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_DefaultLocale()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='default-locale' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	DefaultLocaleType getDefaultLocale();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getDefaultLocale <em>Default Locale</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Default Locale</em>' containment reference.
-	 * @see #getDefaultLocale()
-	 * @generated
-	 */
-	void setDefaultLocale(DefaultLocaleType value);
-
-    /**
-	 * Returns the value of the '<em><b>Default Render Kit Id</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *     The "default-render-kit-id" element allows the application to define
-	 *     a renderkit to be used other than the standard one. 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Default Render Kit Id</em>' containment reference.
-	 * @see #setDefaultRenderKitId(DefaultRenderKitIdType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_DefaultRenderKitId()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='default-render-kit-id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	DefaultRenderKitIdType getDefaultRenderKitId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getDefaultRenderKitId <em>Default Render Kit Id</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Default Render Kit Id</em>' containment reference.
-	 * @see #getDefaultRenderKitId()
-	 * @generated
-	 */
-	void setDefaultRenderKitId(DefaultRenderKitIdType value);
-
-    /**
-	 * Returns the value of the '<em><b>Default Validators</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Default Validators</em>' containment reference.
-	 * @see #setDefaultValidators(DefaultValidatorsType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_DefaultValidators()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='default-validators' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	DefaultValidatorsType getDefaultValidators();
-
-				/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getDefaultValidators <em>Default Validators</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Default Validators</em>' containment reference.
-	 * @see #getDefaultValidators()
-	 * @generated
-	 */
-	void setDefaultValidators(DefaultValidatorsType value);
-
-				/**
-	 * Returns the value of the '<em><b>Default Value</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *     The "default-value" contains the value for the property or attribute
-	 *     in which this element resides.  This value differs from the
-	 *     "suggested-value" in that the property or attribute must take the
-	 *     value, whereas in "suggested-value" taking the value is optional.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Default Value</em>' containment reference.
-	 * @see #setDefaultValue(DefaultValueType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_DefaultValue()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='default-value' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	DefaultValueType getDefaultValue();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getDefaultValue <em>Default Value</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Default Value</em>' containment reference.
-	 * @see #getDefaultValue()
-	 * @generated
-	 */
-	void setDefaultValue(DefaultValueType value);
-
-    /**
-	 * Returns the value of the '<em><b>Description</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *      The "description" element
-	 *                 contains a textual description of the element     it is
-	 *                 nested in, optionally flagged with a language code using
-	 *                 the     "xml:lang" attribute. 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Description</em>' containment reference.
-	 * @see #setDescription(DescriptionType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_Description()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='description' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	DescriptionType getDescription();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getDescription <em>Description</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Description</em>' containment reference.
-	 * @see #getDescription()
-	 * @generated
-	 */
-	void setDescription(DescriptionType value);
-
-    /**
-	 * Returns the value of the '<em><b>Display Name</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *      The "display-name" element
-	 *                 is a short descriptive name describing the     entity
-	 *                 associated with the element it is nested in, intended to
-	 *                 be     displayed by tools, and optionally flagged with a
-	 *                 language code using     the "xml:lang"
-	 *                 attribute. 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Display Name</em>' containment reference.
-	 * @see #setDisplayName(DisplayNameType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_DisplayName()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='display-name' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	DisplayNameType getDisplayName();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getDisplayName <em>Display Name</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Display Name</em>' containment reference.
-	 * @see #getDisplayName()
-	 * @generated
-	 */
-	void setDisplayName(DisplayNameType value);
-
-    /**
-	 * Returns the value of the '<em><b>Exception Handler Factory</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Exception Handler Factory</em>' containment reference.
-	 * @see #setExceptionHandlerFactory(ExceptionHandlerFactoryType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_ExceptionHandlerFactory()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='exception-handler-factory' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ExceptionHandlerFactoryType getExceptionHandlerFactory();
-
-				/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getExceptionHandlerFactory <em>Exception Handler Factory</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Exception Handler Factory</em>' containment reference.
-	 * @see #getExceptionHandlerFactory()
-	 * @generated
-	 */
-	void setExceptionHandlerFactory(ExceptionHandlerFactoryType value);
-
-				/**
-	 * Returns the value of the '<em><b>External Context Factory</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>External Context Factory</em>' containment reference.
-	 * @see #setExternalContextFactory(ExternalContextFactoryType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_ExternalContextFactory()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='external-context-factory' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ExternalContextFactoryType getExternalContextFactory();
-
-				/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getExternalContextFactory <em>External Context Factory</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>External Context Factory</em>' containment reference.
-	 * @see #getExternalContextFactory()
-	 * @generated
-	 */
-	void setExternalContextFactory(ExternalContextFactoryType value);
-
-				/**
-	 * Returns the value of the '<em><b>Faces Config</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *  ==================== Top Level Elements
-	 *                 ==============================       The
-	 *                 "faces-config" element is the root of the
-	 *                 configuration information     hierarchy, and contains
-	 *                 nested elements for all of the other configuration
-	 *                 settings. 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Faces Config</em>' containment reference.
-	 * @see #setFacesConfig(FacesConfigType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_FacesConfig()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='faces-config' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	FacesConfigType getFacesConfig();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getFacesConfig <em>Faces Config</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Faces Config</em>' containment reference.
-	 * @see #getFacesConfig()
-	 * @generated
-	 */
-	void setFacesConfig(FacesConfigType value);
-
-    /**
-	 * Returns the value of the '<em><b>Faces Context Factory</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *      The
-	 *                 "faces-context-factory" element contains the
-	 *                 fully qualified     class name of the concrete
-	 *                 FacesContextFactory implementation class     that will
-	 *                 be called when
-	 *                 FactoryFinder.getFactory(FACES_CONTEXT_FACTORY) is
-	 *                 called. It must     be of type "ClassName". 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Faces Context Factory</em>' containment reference.
-	 * @see #setFacesContextFactory(FacesContextFactoryType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_FacesContextFactory()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='faces-context-factory' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	FacesContextFactoryType getFacesContextFactory();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getFacesContextFactory <em>Faces Context Factory</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Faces Context Factory</em>' containment reference.
-	 * @see #getFacesContextFactory()
-	 * @generated
-	 */
-	void setFacesContextFactory(FacesContextFactoryType value);
-
-    /**
-	 * Returns the value of the '<em><b>Facet</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *    Define the name and other design-time information for a facet that is
-	 *    associated with a renderer or a component.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Facet</em>' containment reference.
-	 * @see #setFacet(FacetType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_Facet()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='facet' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	FacetType getFacet();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getFacet <em>Facet</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Facet</em>' containment reference.
-	 * @see #getFacet()
-	 * @generated
-	 */
-	void setFacet(FacetType value);
-
-    /**
-	 * Returns the value of the '<em><b>Facet Extension</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *     Extension element for facet.  May contain implementation
-	 *     specific content.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Facet Extension</em>' containment reference.
-	 * @see #setFacetExtension(FacetExtensionType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_FacetExtension()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='facet-extension' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	FacetExtensionType getFacetExtension();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getFacetExtension <em>Facet Extension</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Facet Extension</em>' containment reference.
-	 * @see #getFacetExtension()
-	 * @generated
-	 */
-	void setFacetExtension(FacetExtensionType value);
-
-    /**
-	 * Returns the value of the '<em><b>Facet Name</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *     The "facet-name" element represents the facet name under which a
-	 *     UIComponent will be added to its parent.  It must be of type
-	 *     "Identifier".
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Facet Name</em>' containment reference.
-	 * @see #setFacetName(FacetNameType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_FacetName()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='facet-name' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	FacetNameType getFacetName();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getFacetName <em>Facet Name</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Facet Name</em>' containment reference.
-	 * @see #getFacetName()
-	 * @generated
-	 */
-	void setFacetName(FacetNameType value);
-
-    /**
-	 * Returns the value of the '<em><b>Factory</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *      The "factory" element
-	 *                 provides a mechanism to define the various     Factories
-	 *                 that comprise parts of the implementation of JavaServer
-	 *                 Faces.  For nested elements that are not specified, the
-	 *                 JSF     implementation must provide a suitable default. 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Factory</em>' containment reference.
-	 * @see #setFactory(FactoryType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_Factory()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='factory' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	FactoryType getFactory();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getFactory <em>Factory</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Factory</em>' containment reference.
-	 * @see #getFactory()
-	 * @generated
-	 */
-	void setFactory(FactoryType value);
-
-    /**
-	 * Returns the value of the '<em><b>From Action</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *     The "from-action" element contains an action reference expression
-	 *     that must have been executed (by the default ActionListener for handling
-	 *     application level events) in order to select this navigation rule.  If
-	 *     not specified, this rule will be relevant no matter which action reference
-	 *     was executed (or if no action reference was executed).
-	 * 
-	 *     This value must be of type "Action".
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>From Action</em>' containment reference.
-	 * @see #setFromAction(FromActionType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_FromAction()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='from-action' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	FromActionType getFromAction();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getFromAction <em>From Action</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>From Action</em>' containment reference.
-	 * @see #getFromAction()
-	 * @generated
-	 */
-	void setFromAction(FromActionType value);
-
-    /**
-	 * Returns the value of the '<em><b>From Outcome</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *     The "from-outcome" element contains a logical outcome string returned
-	 *     by the execution of an application action method selected via an
-	 *     "actionRef" property (or a literal value specified by an "action"
-	 *     property) of a UICommand component.  If specified, this rule will be
-	 *     relevant only if the outcome value matches this element's value.  If
-	 *     not specified, this rule will be relevant no matter what the outcome
-	 *     value was.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>From Outcome</em>' containment reference.
-	 * @see #setFromOutcome(FromOutcomeType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_FromOutcome()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='from-outcome' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	FromOutcomeType getFromOutcome();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getFromOutcome <em>From Outcome</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>From Outcome</em>' containment reference.
-	 * @see #getFromOutcome()
-	 * @generated
-	 */
-	void setFromOutcome(FromOutcomeType value);
-
-    /**
-	 * Returns the value of the '<em><b>From View Id</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *     The "from-view-id" element contains the view identifier of the view
-	 *     for which the containing navigation rule is relevant.  If no
-	 *     "from-view" element is specified, this rule applies to navigation
-	 *     decisions on all views.  If this element is not specified, a value
-	 *     of "*" is assumed, meaning that this navigation rule applies to all
-	 *     views.
-	 * 
-	 *     This value must be of type "ViewIdPattern".
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>From View Id</em>' containment reference.
-	 * @see #setFromViewId(FromViewIdType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_FromViewId()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='from-view-id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	FromViewIdType getFromViewId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getFromViewId <em>From View Id</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>From View Id</em>' containment reference.
-	 * @see #getFromViewId()
-	 * @generated
-	 */
-	void setFromViewId(FromViewIdType value);
-
-    /**
-	 * Returns the value of the '<em><b>Icon</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *      The "icon" element
-	 *                 contains "small-icon" and
-	 *                 "large-icon" elements that     specify the
-	 *                 resoruce paths for small and large GIF or JPG icon
-	 *                 images     used to represent the parent element in a GUI
-	 *                 tool. 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Icon</em>' containment reference.
-	 * @see #setIcon(IconType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_Icon()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='icon' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	IconType getIcon();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getIcon <em>Icon</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Icon</em>' containment reference.
-	 * @see #getIcon()
-	 * @generated
-	 */
-	void setIcon(IconType value);
-
-    /**
-	 * Returns the value of the '<em><b>If</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>If</em>' containment reference.
-	 * @see #setIf(IfType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_If()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='if' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	IfType getIf();
-
-				/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getIf <em>If</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>If</em>' containment reference.
-	 * @see #getIf()
-	 * @generated
-	 */
-	void setIf(IfType value);
-
-				/**
-	 * Returns the value of the '<em><b>Key</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *     The "key" element is the String representation of a map key that
-	 *     will be stored in a managed property of type java.util.Map.  
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Key</em>' containment reference.
-	 * @see #setKey(KeyType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_Key()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='key' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	KeyType getKey();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getKey <em>Key</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Key</em>' containment reference.
-	 * @see #getKey()
-	 * @generated
-	 */
-	void setKey(KeyType value);
-
-    /**
-	 * Returns the value of the '<em><b>Key Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *     The "key-class" element defines the Java type to which each "key"
-	 *     element in a set of "map-entry" elements will be converted to.  It
-	 *     must be of type "ClassName".  If omitted, "java.lang.String"
-	 *     is assumed.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Key Class</em>' containment reference.
-	 * @see #setKeyClass(KeyClassType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_KeyClass()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='key-class' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	KeyClassType getKeyClass();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getKeyClass <em>Key Class</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Key Class</em>' containment reference.
-	 * @see #getKeyClass()
-	 * @generated
-	 */
-	void setKeyClass(KeyClassType value);
-
-    /**
-	 * Returns the value of the '<em><b>Large Icon</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *     The "large-icon" element contains the resource path to a large (32x32)
-	 *     icon image.  The image may be in either GIF or JPG format.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Large Icon</em>' containment reference.
-	 * @see #setLargeIcon(LargeIconType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_LargeIcon()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='large-icon' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	LargeIconType getLargeIcon();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getLargeIcon <em>Large Icon</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Large Icon</em>' containment reference.
-	 * @see #getLargeIcon()
-	 * @generated
-	 */
-	void setLargeIcon(LargeIconType value);
-
-    /**
-	 * Returns the value of the '<em><b>Lifecycle</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *      The "lifecycle" element
-	 *                 provides a mechanism to specify     modifications to the
-	 *                 behaviour of the default Lifecycle     implementation
-	 *                 for this web application. 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Lifecycle</em>' containment reference.
-	 * @see #setLifecycle(LifecycleType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_Lifecycle()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='lifecycle' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	LifecycleType getLifecycle();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getLifecycle <em>Lifecycle</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Lifecycle</em>' containment reference.
-	 * @see #getLifecycle()
-	 * @generated
-	 */
-	void setLifecycle(LifecycleType value);
-
-    /**
-	 * Returns the value of the '<em><b>Lifecycle Factory</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *      The "lifecycle-factory"
-	 *                 element contains the fully qualified class name     of
-	 *                 the concrete LifecycleFactory implementation class that
-	 *                 will be called     when
-	 *                 FactoryFinder.getFactory(LIFECYCLE_FACTORY) is called.
-	 *                 It must be      of type "ClassName". 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Lifecycle Factory</em>' containment reference.
-	 * @see #setLifecycleFactory(LifecycleFactoryType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_LifecycleFactory()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='lifecycle-factory' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	LifecycleFactoryType getLifecycleFactory();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getLifecycleFactory <em>Lifecycle Factory</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Lifecycle Factory</em>' containment reference.
-	 * @see #getLifecycleFactory()
-	 * @generated
-	 */
-	void setLifecycleFactory(LifecycleFactoryType value);
-
-    /**
-	 * Returns the value of the '<em><b>List Entries</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *      The "list-entries" element
-	 *                 represents a set of initialization     elements for a
-	 *                 managed property that is a java.util.List or an
-	 *                 array.  In the former case, the "value-class"
-	 *                 element can optionally     be used to declare the Java
-	 *                 type to which each value should be     converted before
-	 *                 adding it to the Collection. 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>List Entries</em>' containment reference.
-	 * @see #setListEntries(ListEntriesType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_ListEntries()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='list-entries' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ListEntriesType getListEntries();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getListEntries <em>List Entries</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>List Entries</em>' containment reference.
-	 * @see #getListEntries()
-	 * @generated
-	 */
-	void setListEntries(ListEntriesType value);
-
-    /**
-	 * Returns the value of the '<em><b>Locale Config</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *       The "locale-config"
-	 *                 element allows the app developer to declare the
-	 *                 supported locales for this application.   
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Locale Config</em>' containment reference.
-	 * @see #setLocaleConfig(LocaleConfigType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_LocaleConfig()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='locale-config' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	LocaleConfigType getLocaleConfig();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getLocaleConfig <em>Locale Config</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Locale Config</em>' containment reference.
-	 * @see #getLocaleConfig()
-	 * @generated
-	 */
-	void setLocaleConfig(LocaleConfigType value);
-
-    /**
-	 * Returns the value of the '<em><b>Managed Bean</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *      The "managed-bean" element
-	 *                 represents a JavaBean, of a particular class,     that
-	 *                 will be dynamically instantiated at runtime (by the
-	 *                 default     VariableResolver implementation) if it is
-	 *                 referenced as the first element     of a value reference
-	 *                 expression, and no corresponding bean can be
-	 *                 identified in any scope.  In addition to the creation of
-	 *                 the managed bean,     and the optional storing of it
-	 *                 into the specified scope, the nested
-	 *                 managed-property elements can be used to initialize the
-	 *                 contents of     settable JavaBeans properties of the
-	 *                 created instance. 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Managed Bean</em>' containment reference.
-	 * @see #setManagedBean(ManagedBeanType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_ManagedBean()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='managed-bean' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ManagedBeanType getManagedBean();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getManagedBean <em>Managed Bean</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Managed Bean</em>' containment reference.
-	 * @see #getManagedBean()
-	 * @generated
-	 */
-	void setManagedBean(ManagedBeanType value);
-
-    /**
-	 * Returns the value of the '<em><b>Managed Bean Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *     The "managed-bean-class" element represents the fully qualified class
-	 *     name of the Java class that will be used to instantiate a new instance
-	 *     if creation of the specified managed bean is requested.  It must be of
-	 *     type "ClassName".
-	 * 
-	 *     The specified class must conform to standard JavaBeans conventions.
-	 *     In particular, it must have a public zero-arguments constructor, and
-	 *     zero or more public property setters.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Managed Bean Class</em>' containment reference.
-	 * @see #setManagedBeanClass(ManagedBeanClassType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_ManagedBeanClass()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='managed-bean-class' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ManagedBeanClassType getManagedBeanClass();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getManagedBeanClass <em>Managed Bean Class</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Managed Bean Class</em>' containment reference.
-	 * @see #getManagedBeanClass()
-	 * @generated
-	 */
-	void setManagedBeanClass(ManagedBeanClassType value);
-
-    /**
-	 * Returns the value of the '<em><b>Managed Bean Name</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *     The "managed-bean-name" element represents the attribute name under
-	 *     which a managed bean will be searched for, as well as stored (unless
-	 *     the "managed-bean-scope" value is "none").  It must be of type
-	 *     "Identifier".
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Managed Bean Name</em>' containment reference.
-	 * @see #setManagedBeanName(ManagedBeanNameType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_ManagedBeanName()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='managed-bean-name' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ManagedBeanNameType getManagedBeanName();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getManagedBeanName <em>Managed Bean Name</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Managed Bean Name</em>' containment reference.
-	 * @see #getManagedBeanName()
-	 * @generated
-	 */
-	void setManagedBeanName(ManagedBeanNameType value);
-
-    /**
-	 * Returns the value of the '<em><b>Managed Bean Scope</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *     The "managed-bean-scope" element represents the scope into which a newly
-	 *     created instance of the specified managed bean will be stored (unless
-	 *     the value is "none").  It must be of type "ScopeOrNone".
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Managed Bean Scope</em>' containment reference.
-	 * @see #setManagedBeanScope(ManagedBeanScopeType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_ManagedBeanScope()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='managed-bean-scope' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ManagedBeanScopeType getManagedBeanScope();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getManagedBeanScope <em>Managed Bean Scope</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Managed Bean Scope</em>' containment reference.
-	 * @see #getManagedBeanScope()
-	 * @generated
-	 */
-	void setManagedBeanScope(ManagedBeanScopeType value);
-
-    /**
-	 * Returns the value of the '<em><b>Managed Property</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *      The "managed-property"
-	 *                 element represents an individual property of a
-	 *                 managed bean that will be configured to the specified
-	 *                 value (or value set)     if the corresponding managed
-	 *                 bean is automatically created. 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Managed Property</em>' containment reference.
-	 * @see #setManagedProperty(ManagedPropertyType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_ManagedProperty()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='managed-property' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ManagedPropertyType getManagedProperty();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getManagedProperty <em>Managed Property</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Managed Property</em>' containment reference.
-	 * @see #getManagedProperty()
-	 * @generated
-	 */
-	void setManagedProperty(ManagedPropertyType value);
-
-    /**
-	 * Returns the value of the '<em><b>Map Entries</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *      The "map-entries' element
-	 *                 represents a set of key-entry pairs that     will be
-	 *                 added to the computed value of a managed property of
-	 *                 type     java.util.Map.  In addition, the Java class
-	 *                 types of the key and entry     values may be optionally
-	 *                 declared. 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Map Entries</em>' containment reference.
-	 * @see #setMapEntries(MapEntriesType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_MapEntries()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='map-entries' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	MapEntriesType getMapEntries();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getMapEntries <em>Map Entries</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Map Entries</em>' containment reference.
-	 * @see #getMapEntries()
-	 * @generated
-	 */
-	void setMapEntries(MapEntriesType value);
-
-    /**
-	 * Returns the value of the '<em><b>Map Entry</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *      The "map-entry" element
-	 *                 reprsents a single key-entry pair that     will be added
-	 *                 to the computed value of a managed property of type
-	 *                 java.util.Map. 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Map Entry</em>' containment reference.
-	 * @see #setMapEntry(MapEntryType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_MapEntry()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='map-entry' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	MapEntryType getMapEntry();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getMapEntry <em>Map Entry</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Map Entry</em>' containment reference.
-	 * @see #getMapEntry()
-	 * @generated
-	 */
-	void setMapEntry(MapEntryType value);
-
-    /**
-	 * Returns the value of the '<em><b>Message Bundle</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *      The base name of a resource bundle
-	 *                 representing the message resources     for this
-	 *                 application.  See the JavaDocs for the
-	 *                 "java.util.ResourceBundle"     class for more
-	 *                 information on the syntax of resource bundle names. 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Message Bundle</em>' containment reference.
-	 * @see #setMessageBundle(MessageBundleType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_MessageBundle()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='message-bundle' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	MessageBundleType getMessageBundle();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getMessageBundle <em>Message Bundle</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Message Bundle</em>' containment reference.
-	 * @see #getMessageBundle()
-	 * @generated
-	 */
-	void setMessageBundle(MessageBundleType value);
-
-    /**
-	 * Returns the value of the '<em><b>Name</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Name</em>' containment reference.
-	 * @see #setName(NameType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_Name()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='name' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	NameType getName();
-
-				/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getName <em>Name</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Name</em>' containment reference.
-	 * @see #getName()
-	 * @generated
-	 */
-	void setName(NameType value);
-
-				/**
-	 * Returns the value of the '<em><b>Navigation Case</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *      The "navigation-case"
-	 *                 element describes a particular combination of
-	 *                 conditions that must match for this case to be executed,
-	 *                 and the     view id of the component tree that should be
-	 *                 selected next. 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Navigation Case</em>' containment reference.
-	 * @see #setNavigationCase(NavigationCaseType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_NavigationCase()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='navigation-case' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	NavigationCaseType getNavigationCase();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getNavigationCase <em>Navigation Case</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Navigation Case</em>' containment reference.
-	 * @see #getNavigationCase()
-	 * @generated
-	 */
-	void setNavigationCase(NavigationCaseType value);
-
-    /**
-	 * Returns the value of the '<em><b>Navigation Handler</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *      The "navigation-handler"
-	 *                 element contains the fully qualified class name     of
-	 *                 the concrete NavigationHandler implementation class that
-	 *                 will be called     during the Invoke Application phase
-	 *                 of the request processing lifecycle,     if the default
-	 *                 ActionListener (provided by the JSF implementation) is
-	 *                 used.     It must be of type "ClassName". 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Navigation Handler</em>' containment reference.
-	 * @see #setNavigationHandler(NavigationHandlerType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_NavigationHandler()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='navigation-handler' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	NavigationHandlerType getNavigationHandler();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getNavigationHandler <em>Navigation Handler</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Navigation Handler</em>' containment reference.
-	 * @see #getNavigationHandler()
-	 * @generated
-	 */
-	void setNavigationHandler(NavigationHandlerType value);
-
-    /**
-	 * Returns the value of the '<em><b>Navigation Rule</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *      The "navigation-rule"
-	 *                 element represents an individual decision rule     that
-	 *                 will be utilized by the default NavigationHandler
-	 *                 implementation to make decisions on what view should be
-	 *                 displayed     next, based on the view id being
-	 *                 processed. 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Navigation Rule</em>' containment reference.
-	 * @see #setNavigationRule(NavigationRuleType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_NavigationRule()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='navigation-rule' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	NavigationRuleType getNavigationRule();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getNavigationRule <em>Navigation Rule</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Navigation Rule</em>' containment reference.
-	 * @see #getNavigationRule()
-	 * @generated
-	 */
-	void setNavigationRule(NavigationRuleType value);
-
-    /**
-	 * Returns the value of the '<em><b>Null Value</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *      The "null-value" element
-	 *                 indicates that the managed property in which we     are
-	 *                 nested will be explicitly set to null if our managed
-	 *                 bean is     automatically created.  This is different
-	 *                 from omitting the managed     property element entirely,
-	 *                 which will cause no property setter to be     called for
-	 *                 this property.      The "null-value" element
-	 *                 can only be used when the associated
-	 *                 "property-class" identifies a Java class, not
-	 *                 a Java primitive. 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Null Value</em>' containment reference.
-	 * @see #setNullValue(NullValueType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_NullValue()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='null-value' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	NullValueType getNullValue();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getNullValue <em>Null Value</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Null Value</em>' containment reference.
-	 * @see #getNullValue()
-	 * @generated
-	 */
-	void setNullValue(NullValueType value);
-
-    /**
-	 * Returns the value of the '<em><b>Ordering</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Ordering</em>' containment reference.
-	 * @see #setOrdering(OrderingType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_Ordering()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='ordering' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	OrderingType getOrdering();
-
-				/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getOrdering <em>Ordering</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Ordering</em>' containment reference.
-	 * @see #getOrdering()
-	 * @generated
-	 */
-	void setOrdering(OrderingType value);
-
-				/**
-	 * Returns the value of the '<em><b>Ordering Ordering</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Ordering Ordering</em>' containment reference.
-	 * @see #setOrderingOrdering(OrderingOrderingType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_OrderingOrdering()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='ordering-ordering' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	OrderingOrderingType getOrderingOrdering();
-
-				/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getOrderingOrdering <em>Ordering Ordering</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Ordering Ordering</em>' containment reference.
-	 * @see #getOrderingOrdering()
-	 * @generated
-	 */
-	void setOrderingOrdering(OrderingOrderingType value);
-
-				/**
-	 * Returns the value of the '<em><b>Others</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Others</em>' containment reference.
-	 * @see #setOthers(OrderingOthersType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_Others()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='others' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	OrderingOthersType getOthers();
-
-				/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getOthers <em>Others</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Others</em>' containment reference.
-	 * @see #getOthers()
-	 * @generated
-	 */
-	void setOthers(OrderingOthersType value);
-
-				/**
-	 * Returns the value of the '<em><b>Partial View Context Factory</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Partial View Context Factory</em>' containment reference.
-	 * @see #setPartialViewContextFactory(PartialViewContextFactoryType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_PartialViewContextFactory()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='partial-view-context-factory' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	PartialViewContextFactoryType getPartialViewContextFactory();
-
-				/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getPartialViewContextFactory <em>Partial View Context Factory</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Partial View Context Factory</em>' containment reference.
-	 * @see #getPartialViewContextFactory()
-	 * @generated
-	 */
-	void setPartialViewContextFactory(PartialViewContextFactoryType value);
-
-				/**
-	 * Returns the value of the '<em><b>Phase Listener</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *  The "phase-listener" element
-	 *                 contains the fully qualified class name of the concrete
-	 *                 PhaseListener implementation class that will be
-	 *                 registered on the Lifecycle. It must be of type
-	 *                 "ClassName". 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Phase Listener</em>' containment reference.
-	 * @see #setPhaseListener(PhaseListenerType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_PhaseListener()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='phase-listener' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	PhaseListenerType getPhaseListener();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getPhaseListener <em>Phase Listener</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Phase Listener</em>' containment reference.
-	 * @see #getPhaseListener()
-	 * @generated
-	 */
-	void setPhaseListener(PhaseListenerType value);
-
-    /**
-	 * Returns the value of the '<em><b>Property</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *      The "property" element
-	 *                 represents a JavaBean property of the Java class
-	 *                 represented by our parent element.      Property names
-	 *                 must be unique within the scope of the Java class
-	 *                 that is represented by the parent element, and must
-	 *                 correspond to     property names that will be recognized
-	 *                 when performing introspection     against that class via
-	 *                 java.beans.Introspector. 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Property</em>' containment reference.
-	 * @see #setProperty(PropertyType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_Property()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='property' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	PropertyType getProperty();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getProperty <em>Property</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Property</em>' containment reference.
-	 * @see #getProperty()
-	 * @generated
-	 */
-	void setProperty(PropertyType value);
-
-    /**
-	 * Returns the value of the '<em><b>Property Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *     The "property-class" element represents the Java type of the value
-	 *     associated with this property name.  It must be of type "JavaType".
-	 *     If not specified, it can be inferred from existing classes; however,
-	 *     this element should be specified if the configuration file is going
-	 *     to be the source for generating the corresponding classes.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Property Class</em>' containment reference.
-	 * @see #setPropertyClass(PropertyClassType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_PropertyClass()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='property-class' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	PropertyClassType getPropertyClass();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getPropertyClass <em>Property Class</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Property Class</em>' containment reference.
-	 * @see #getPropertyClass()
-	 * @generated
-	 */
-	void setPropertyClass(PropertyClassType value);
-
-    /**
-	 * Returns the value of the '<em><b>Property Extension</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *       Extension element for property.
-	 *                 May contain implementation     specific content. 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Property Extension</em>' containment reference.
-	 * @see #setPropertyExtension(PropertyExtensionType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_PropertyExtension()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='property-extension' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	PropertyExtensionType getPropertyExtension();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getPropertyExtension <em>Property Extension</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Property Extension</em>' containment reference.
-	 * @see #getPropertyExtension()
-	 * @generated
-	 */
-	void setPropertyExtension(PropertyExtensionType value);
-
-    /**
-	 * Returns the value of the '<em><b>Property Name</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *     The "property-name" element represents the JavaBeans property name
-	 *     under which the corresponding value may be stored.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Property Name</em>' containment reference.
-	 * @see #setPropertyName(PropertyNameType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_PropertyName()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='property-name' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	PropertyNameType getPropertyName();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getPropertyName <em>Property Name</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Property Name</em>' containment reference.
-	 * @see #getPropertyName()
-	 * @generated
-	 */
-	void setPropertyName(PropertyNameType value);
-
-    /**
-	 * Returns the value of the '<em><b>Property Resolver</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *      The "property-resolver"
-	 *                 element contains the fully qualified class name     of
-	 *                 the concrete PropertyResolver implementation class that
-	 *                 will be used     during the processing of value
-	 *                 reference expressions.     It must be of type
-	 *                 "ClassName". 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Property Resolver</em>' containment reference.
-	 * @see #setPropertyResolver(PropertyResolverType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_PropertyResolver()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='property-resolver' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	PropertyResolverType getPropertyResolver();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getPropertyResolver <em>Property Resolver</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Property Resolver</em>' containment reference.
-	 * @see #getPropertyResolver()
-	 * @generated
-	 */
-	void setPropertyResolver(PropertyResolverType value);
-
-    /**
-	 * Returns the value of the '<em><b>Redirect</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *      The "redirect" element
-	 *                 indicates that navigation to the specified
-	 *                 "to-view-id" should be accomplished by
-	 *                 performing an HTTP redirect     rather than the usual
-	 *                 ViewHandler mechanisms. 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Redirect</em>' containment reference.
-	 * @see #setRedirect(RedirectType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_Redirect()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='redirect' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	RedirectType getRedirect();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRedirect <em>Redirect</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Redirect</em>' containment reference.
-	 * @see #getRedirect()
-	 * @generated
-	 */
-	void setRedirect(RedirectType value);
-
-    /**
-	 * Returns the value of the '<em><b>Redirect View Param</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Redirect View Param</em>' containment reference.
-	 * @see #setRedirectViewParam(RedirectViewParamType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_RedirectViewParam()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='view-param' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	RedirectViewParamType getRedirectViewParam();
-
-				/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRedirectViewParam <em>Redirect View Param</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Redirect View Param</em>' containment reference.
-	 * @see #getRedirectViewParam()
-	 * @generated
-	 */
-	void setRedirectViewParam(RedirectViewParamType value);
-
-				/**
-	 * Returns the value of the '<em><b>Referenced Bean</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *      The "referenced-bean"
-	 *                 element represents at design time the promise     that a
-	 *                 Java object of the specified type will exist at runtime
-	 *                 in some     scope, under the specified key.  This can be
-	 *                 used by design time tools     to construct user
-	 *                 interface dialogs based on the properties of the
-	 *                 specified class.  The presence or absence of a
-	 *                 referenced bean     element has no impact on the
-	 *                 JavaServer Faces runtime environment     inside a web
-	 *                 application. 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Referenced Bean</em>' containment reference.
-	 * @see #setReferencedBean(ReferencedBeanType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_ReferencedBean()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='referenced-bean' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ReferencedBeanType getReferencedBean();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getReferencedBean <em>Referenced Bean</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Referenced Bean</em>' containment reference.
-	 * @see #getReferencedBean()
-	 * @generated
-	 */
-	void setReferencedBean(ReferencedBeanType value);
-
-    /**
-	 * Returns the value of the '<em><b>Referenced Bean Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *     The "referenced-bean-class" element represents the fully qualified class
-	 *     name of the Java class (either abstract or concrete) or Java interface
-	 *     implemented by the corresponding referenced bean.  It must be of type
-	 *     "ClassName".
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Referenced Bean Class</em>' containment reference.
-	 * @see #setReferencedBeanClass(ReferencedBeanClassType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_ReferencedBeanClass()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='referenced-bean-class' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ReferencedBeanClassType getReferencedBeanClass();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getReferencedBeanClass <em>Referenced Bean Class</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Referenced Bean Class</em>' containment reference.
-	 * @see #getReferencedBeanClass()
-	 * @generated
-	 */
-	void setReferencedBeanClass(ReferencedBeanClassType value);
-
-    /**
-	 * Returns the value of the '<em><b>Referenced Bean Name</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *     The "referenced-bean-name" element represents the attribute name under
-	 *     which the corresponding referenced bean may be assumed to be stored,
-	 *     in one of the scopes defined by the "Scope" type.  It must be of type
-	 *     "Identifier".
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Referenced Bean Name</em>' containment reference.
-	 * @see #setReferencedBeanName(ReferencedBeanNameType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_ReferencedBeanName()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='referenced-bean-name' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ReferencedBeanNameType getReferencedBeanName();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getReferencedBeanName <em>Referenced Bean Name</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Referenced Bean Name</em>' containment reference.
-	 * @see #getReferencedBeanName()
-	 * @generated
-	 */
-	void setReferencedBeanName(ReferencedBeanNameType value);
-
-    /**
-	 * Returns the value of the '<em><b>Renderer</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *      The "renderer" element
-	 *                 represents a concrete Renderer implementation     class
-	 *                 that should be registered under the specified type
-	 *                 identifier,     in the RenderKit associated with the
-	 *                 parent render-kit element.  Renderer     types must be
-	 *                 unique within the RenderKit associated with the parent
-	 *                 "render-kit" element.      Nested
-	 *                 "attribute" elements identify generic
-	 *                 component attributes that     are recognized by this
-	 *                 renderer.  Nested "supported-component-type"
-	 *                 and     "supported-component-class" elements
-	 *                 identify supported component classes,     by their type
-	 *                 identifiers or the implementation class name,
-	 *                 respectively,     that are supported by this Renderer. 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Renderer</em>' containment reference.
-	 * @see #setRenderer(RendererType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_Renderer()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='renderer' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	RendererType getRenderer();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRenderer <em>Renderer</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Renderer</em>' containment reference.
-	 * @see #getRenderer()
-	 * @generated
-	 */
-	void setRenderer(RendererType value);
-
-    /**
-	 * Returns the value of the '<em><b>Renderer Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *     The "renderer-class" element represents the fully qualified class name
-	 *     of a concrete Renderer implementation class.  It must be of
-	 *     type "ClassName".
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Renderer Class</em>' containment reference.
-	 * @see #setRendererClass(RendererClassType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_RendererClass()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='renderer-class' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	RendererClassType getRendererClass();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRendererClass <em>Renderer Class</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Renderer Class</em>' containment reference.
-	 * @see #getRendererClass()
-	 * @generated
-	 */
-	void setRendererClass(RendererClassType value);
-
-    /**
-	 * Returns the value of the '<em><b>Renderer Extension</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *       Extension element for renderer.
-	 *                 May contain implementation     specific content. 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Renderer Extension</em>' containment reference.
-	 * @see #setRendererExtension(RendererExtensionType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_RendererExtension()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='renderer-extension' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	RendererExtensionType getRendererExtension();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRendererExtension <em>Renderer Extension</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Renderer Extension</em>' containment reference.
-	 * @see #getRendererExtension()
-	 * @generated
-	 */
-	void setRendererExtension(RendererExtensionType value);
-
-    /**
-	 * Returns the value of the '<em><b>Renderer Type</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *     The "renderer-type" element represents a renderer type identifier for the
-	 *     Renderer represented by the parent "renderer" element.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Renderer Type</em>' containment reference.
-	 * @see #setRendererType(RendererTypeType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_RendererType()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='renderer-type' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	RendererTypeType getRendererType();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRendererType <em>Renderer Type</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Renderer Type</em>' containment reference.
-	 * @see #getRendererType()
-	 * @generated
-	 */
-	void setRendererType(RendererTypeType value);
-
-    /**
-	 * Returns the value of the '<em><b>Render Kit</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *      The "render-kit" element
-	 *                 represents a concrete RenderKit implementation     that
-	 *                 should be registered under the specified render-kit-id.
-	 *                 If no     render-kit-id is specified, the identifier of
-	 *                 the default RenderKit
-	 *                 (RenderKitFactory.DEFAULT_RENDER_KIT) is assumed. 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Render Kit</em>' containment reference.
-	 * @see #setRenderKit(RenderKitType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_RenderKit()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='render-kit' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	RenderKitType getRenderKit();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRenderKit <em>Render Kit</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Render Kit</em>' containment reference.
-	 * @see #getRenderKit()
-	 * @generated
-	 */
-	void setRenderKit(RenderKitType value);
-
-    /**
-	 * Returns the value of the '<em><b>Render Kit Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *     The "render-kit-class" element represents the fully qualified class name
-	 *     of a concrete RenderKit implementation class.  It must be of
-	 *     type "ClassName".
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Render Kit Class</em>' containment reference.
-	 * @see #setRenderKitClass(RenderKitClassType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_RenderKitClass()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='render-kit-class' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	RenderKitClassType getRenderKitClass();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRenderKitClass <em>Render Kit Class</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Render Kit Class</em>' containment reference.
-	 * @see #getRenderKitClass()
-	 * @generated
-	 */
-	void setRenderKitClass(RenderKitClassType value);
-
-    /**
-	 * Returns the value of the '<em><b>Render Kit Factory</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *      The "render-kit-factory"
-	 *                 element contains the fully qualified class name     of
-	 *                 the concrete RenderKitFactory implementation class that
-	 *                 will be called     when
-	 *                 FactoryFinder.getFactory(RENDER_KIT_FACTORY) is called.
-	 *                 It must be      of type "ClassName". 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Render Kit Factory</em>' containment reference.
-	 * @see #setRenderKitFactory(RenderKitFactoryType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_RenderKitFactory()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='render-kit-factory' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	RenderKitFactoryType getRenderKitFactory();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRenderKitFactory <em>Render Kit Factory</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Render Kit Factory</em>' containment reference.
-	 * @see #getRenderKitFactory()
-	 * @generated
-	 */
-	void setRenderKitFactory(RenderKitFactoryType value);
-
-    /**
-	 * Returns the value of the '<em><b>Render Kit Id</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *     The "render-kit-id" element represents an identifier for the
-	 *     RenderKit represented by the parent "render-kit" element.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Render Kit Id</em>' containment reference.
-	 * @see #setRenderKitId(RenderKitIdType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_RenderKitId()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='render-kit-id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	RenderKitIdType getRenderKitId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRenderKitId <em>Render Kit Id</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Render Kit Id</em>' containment reference.
-	 * @see #getRenderKitId()
-	 * @generated
-	 */
-	void setRenderKitId(RenderKitIdType value);
-
-    /**
-	 * Returns the value of the '<em><b>Resource Handler</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Resource Handler</em>' containment reference.
-	 * @see #setResourceHandler(ResourceHandlerType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_ResourceHandler()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='resource-handler' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ResourceHandlerType getResourceHandler();
-
-				/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getResourceHandler <em>Resource Handler</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Resource Handler</em>' containment reference.
-	 * @see #getResourceHandler()
-	 * @generated
-	 */
-	void setResourceHandler(ResourceHandlerType value);
-
-				/**
-	 * Returns the value of the '<em><b>Small Icon</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *     The "small-icon" element contains the resource path to a small (16x16)
-	 *     icon image.  The image may be in either GIF or JPG format.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Small Icon</em>' containment reference.
-	 * @see #setSmallIcon(SmallIconType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_SmallIcon()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='small-icon' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	SmallIconType getSmallIcon();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getSmallIcon <em>Small Icon</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Small Icon</em>' containment reference.
-	 * @see #getSmallIcon()
-	 * @generated
-	 */
-	void setSmallIcon(SmallIconType value);
-
-    /**
-	 * Returns the value of the '<em><b>Source Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Source Class</em>' containment reference.
-	 * @see #setSourceClass(SourceClassType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_SourceClass()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='source-class' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	SourceClassType getSourceClass();
-
-				/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getSourceClass <em>Source Class</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Source Class</em>' containment reference.
-	 * @see #getSourceClass()
-	 * @generated
-	 */
-	void setSourceClass(SourceClassType value);
-
-				/**
-	 * Returns the value of the '<em><b>State Manager</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *       The "state-manager"
-	 *                 element contains the fully qualified class name     of
-	 *                 the concrete StateManager implementation class that will
-	 *                 be called     during the Restore View and Render
-	 *                 Response phases of the request     processing lifecycle.
-	 *                 The faces implementation must provide a     default
-	 *                 implementation of this class 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>State Manager</em>' containment reference.
-	 * @see #setStateManager(StateManagerType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_StateManager()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='state-manager' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	StateManagerType getStateManager();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getStateManager <em>State Manager</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>State Manager</em>' containment reference.
-	 * @see #getStateManager()
-	 * @generated
-	 */
-	void setStateManager(StateManagerType value);
-
-    /**
-	 * Returns the value of the '<em><b>Suggested Value</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *     The "suggested-value" contains the value for the property or
-	 *     attribute in which this element resides.  This value is advisory
-	 *     only and is intended for tools to use when populating pallettes.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Suggested Value</em>' containment reference.
-	 * @see #setSuggestedValue(SuggestedValueType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_SuggestedValue()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='suggested-value' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	SuggestedValueType getSuggestedValue();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getSuggestedValue <em>Suggested Value</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Suggested Value</em>' containment reference.
-	 * @see #getSuggestedValue()
-	 * @generated
-	 */
-	void setSuggestedValue(SuggestedValueType value);
-
-    /**
-	 * Returns the value of the '<em><b>Supported Locale</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *       The "supported-locale"
-	 *                 element allows authors to declare which      locales are
-	 *                 supported in this application instance.       It must be
-	 *                 specified as :language:[_:country:[_:variant:]] without
-	 *                 the colons, for example "ja_JP_SJIS".  The
-	 *                 separators between the      segments may be
-	 *                 '-' or '_'. 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Supported Locale</em>' containment reference.
-	 * @see #setSupportedLocale(SupportedLocaleType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_SupportedLocale()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='supported-locale' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	SupportedLocaleType getSupportedLocale();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getSupportedLocale <em>Supported Locale</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Supported Locale</em>' containment reference.
-	 * @see #getSupportedLocale()
-	 * @generated
-	 */
-	void setSupportedLocale(SupportedLocaleType value);
-
-    /**
-	 * Returns the value of the '<em><b>System Event Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>System Event Class</em>' containment reference.
-	 * @see #setSystemEventClass(SystemEventClassType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_SystemEventClass()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='system-event-class' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	SystemEventClassType getSystemEventClass();
-
-				/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getSystemEventClass <em>System Event Class</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>System Event Class</em>' containment reference.
-	 * @see #getSystemEventClass()
-	 * @generated
-	 */
-	void setSystemEventClass(SystemEventClassType value);
-
-				/**
-	 * Returns the value of the '<em><b>System Event Listener</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>System Event Listener</em>' containment reference.
-	 * @see #setSystemEventListener(SystemEventListenerType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_SystemEventListener()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='system-event-listener' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	SystemEventListenerType getSystemEventListener();
-
-				/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getSystemEventListener <em>System Event Listener</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>System Event Listener</em>' containment reference.
-	 * @see #getSystemEventListener()
-	 * @generated
-	 */
-	void setSystemEventListener(SystemEventListenerType value);
-
-				/**
-	 * Returns the value of the '<em><b>System Event Listener Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>System Event Listener Class</em>' containment reference.
-	 * @see #setSystemEventListenerClass(SystemEventListenerClassType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_SystemEventListenerClass()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='system-event-listener-class' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	SystemEventListenerClassType getSystemEventListenerClass();
-
-				/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getSystemEventListenerClass <em>System Event Listener Class</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>System Event Listener Class</em>' containment reference.
-	 * @see #getSystemEventListenerClass()
-	 * @generated
-	 */
-	void setSystemEventListenerClass(SystemEventListenerClassType value);
-
-				/**
-	 * Returns the value of the '<em><b>Tag Handler Delegate Factory</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Tag Handler Delegate Factory</em>' containment reference.
-	 * @see #setTagHandlerDelegateFactory(TagHandlerDelegateFactoryType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_TagHandlerDelegateFactory()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='tag-handler-delegate-factory' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	TagHandlerDelegateFactoryType getTagHandlerDelegateFactory();
-
-				/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getTagHandlerDelegateFactory <em>Tag Handler Delegate Factory</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Tag Handler Delegate Factory</em>' containment reference.
-	 * @see #getTagHandlerDelegateFactory()
-	 * @generated
-	 */
-	void setTagHandlerDelegateFactory(TagHandlerDelegateFactoryType value);
-
-				/**
-	 * Returns the value of the '<em><b>To View Id</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *     The "to-view" element contains the view identifier of the next view
-	 *     that should be displayed if this navigation rule is matched.  It
-	 *     must be of type "ViewId".
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>To View Id</em>' containment reference.
-	 * @see #setToViewId(ToViewIdType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_ToViewId()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='to-view-id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ToViewIdType getToViewId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getToViewId <em>To View Id</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>To View Id</em>' containment reference.
-	 * @see #getToViewId()
-	 * @generated
-	 */
-	void setToViewId(ToViewIdType value);
-
-    /**
-	 * Returns the value of the '<em><b>Validator</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *      The "validator" element
-	 *                 represents a concrete Validator implementation     class
-	 *                 that should be registered under the specified validator
-	 *                 identifier.     Validator identifiers must be unique
-	 *                 within the entire web application.      Nested
-	 *                 "attribute" elements identify generic
-	 *                 attributes that may be     configured on the
-	 *                 corresponding UIComponent in order to affect the
-	 *                 operation of the Validator.  Nested "property"
-	 *                 elements identify JavaBeans     properties of the
-	 *                 Validator implementation class that may be configured
-	 *                 to affect the operation of the Validator. 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Validator</em>' containment reference.
-	 * @see #setValidator(ValidatorType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_Validator()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='validator' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ValidatorType getValidator();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getValidator <em>Validator</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Validator</em>' containment reference.
-	 * @see #getValidator()
-	 * @generated
-	 */
-	void setValidator(ValidatorType value);
-
-    /**
-	 * Returns the value of the '<em><b>Validator Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *     The "validator-class" element represents the fully qualified class name
-	 *     of a concrete Validator implementation class.  It must be of
-	 *     type "ClassName".
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Validator Class</em>' containment reference.
-	 * @see #setValidatorClass(ValidatorClassType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_ValidatorClass()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='validator-class' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ValidatorClassType getValidatorClass();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getValidatorClass <em>Validator Class</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Validator Class</em>' containment reference.
-	 * @see #getValidatorClass()
-	 * @generated
-	 */
-	void setValidatorClass(ValidatorClassType value);
-
-    /**
-	 * Returns the value of the '<em><b>Validator Id</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *     The "validator-id" element represents the identifier under which the
-	 *     corresponding Validator class should be registered.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Validator Id</em>' containment reference.
-	 * @see #setValidatorId(ValidatorIdType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_ValidatorId()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='validator-id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ValidatorIdType getValidatorId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getValidatorId <em>Validator Id</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Validator Id</em>' containment reference.
-	 * @see #getValidatorId()
-	 * @generated
-	 */
-	void setValidatorId(ValidatorIdType value);
-
-    /**
-	 * Returns the value of the '<em><b>Value</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *      The "value" element is the
-	 *                 String representation of a literal     value to which a
-	 *                 scalar managed property will be set, or a value
-	 *                 reference expression ("#{...}") that will be
-	 *                 used to calculate the     required value.  It will be
-	 *                 converted as specified for the actual     property type. 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Value</em>' containment reference.
-	 * @see #setValue(ValueType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_Value()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='value' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ValueType getValue();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getValue <em>Value</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Value</em>' containment reference.
-	 * @see #getValue()
-	 * @generated
-	 */
-	void setValue(ValueType value);
-
-    /**
-	 * Returns the value of the '<em><b>Value Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *     The "value-class" element defines the Java type to which each
-	 *     "value" element's value will be converted to, prior to adding it to
-	 *     the "list-entries" list for a managed property that is a
-	 *     java.util.List, or a "map-entries" map for a managed property that
-	 *     is a java.util.Map.  It must be of type "ClassName".  If omitted,
-	 *     "java.lang.String" is assumed.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Value Class</em>' containment reference.
-	 * @see #setValueClass(ValueClassType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_ValueClass()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='value-class' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ValueClassType getValueClass();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getValueClass <em>Value Class</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Value Class</em>' containment reference.
-	 * @see #getValueClass()
-	 * @generated
-	 */
-	void setValueClass(ValueClassType value);
-
-    /**
-	 * Returns the value of the '<em><b>Variable Resolver</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *      The "variable-resolver"
-	 *                 element contains the fully qualified class name     of
-	 *                 the concrete VariableResolver implementation class that
-	 *                 will be used     during the processing of value
-	 *                 reference expressions.     It must be of type
-	 *                 "ClassName". 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Variable Resolver</em>' containment reference.
-	 * @see #setVariableResolver(VariableResolverType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_VariableResolver()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='variable-resolver' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	VariableResolverType getVariableResolver();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getVariableResolver <em>Variable Resolver</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Variable Resolver</em>' containment reference.
-	 * @see #getVariableResolver()
-	 * @generated
-	 */
-	void setVariableResolver(VariableResolverType value);
-
-    /**
-	 * Returns the value of the '<em><b>View Declaration Language Factory</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>View Declaration Language Factory</em>' containment reference.
-	 * @see #setViewDeclarationLanguageFactory(ViewDeclarationLanguageFactoryType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_ViewDeclarationLanguageFactory()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='view-declaration-language-factory' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ViewDeclarationLanguageFactoryType getViewDeclarationLanguageFactory();
-
-				/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getViewDeclarationLanguageFactory <em>View Declaration Language Factory</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>View Declaration Language Factory</em>' containment reference.
-	 * @see #getViewDeclarationLanguageFactory()
-	 * @generated
-	 */
-	void setViewDeclarationLanguageFactory(ViewDeclarationLanguageFactoryType value);
-
-				/**
-	 * Returns the value of the '<em><b>View Handler</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *       The "view-handler"
-	 *                 element contains the fully qualified class name     of
-	 *                 the concrete ViewHandler implementation class that will
-	 *                 be called     during the Restore View and Render
-	 *                 Response phases of the request     processing lifecycle.
-	 *                 The faces implementation must provide a     default
-	 *                 implementation of this class 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>View Handler</em>' containment reference.
-	 * @see #setViewHandler(ViewHandlerType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_ViewHandler()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='view-handler' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ViewHandlerType getViewHandler();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getViewHandler <em>View Handler</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>View Handler</em>' containment reference.
-	 * @see #getViewHandler()
-	 * @generated
-	 */
-	void setViewHandler(ViewHandlerType value);
-
-				/**
-	 * Returns the value of the '<em><b>Visit Context Factory</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Visit Context Factory</em>' containment reference.
-	 * @see #setVisitContextFactory(VisitContextFactoryType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_VisitContextFactory()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='visit-context-factory' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	VisitContextFactoryType getVisitContextFactory();
-
-				/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getVisitContextFactory <em>Visit Context Factory</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Visit Context Factory</em>' containment reference.
-	 * @see #getVisitContextFactory()
-	 * @generated
-	 */
-	void setVisitContextFactory(VisitContextFactoryType value);
-
-} // DocumentRoot
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/DynamicAttribute.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/DynamicAttribute.java
deleted file mode 100644
index 4eac574..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/DynamicAttribute.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Dynamic Attribute</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DynamicAttribute#getName <em>Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DynamicAttribute#getValue <em>Value</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDynamicAttribute()
- * @model
- * @generated
- */
-public interface DynamicAttribute extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Name</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-	 * @return the value of the '<em>Name</em>' attribute.
-	 * @see #setName(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDynamicAttribute_Name()
-	 * @model
-	 * @generated
-	 */
-    String getName();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DynamicAttribute#getName <em>Name</em>}' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Name</em>' attribute.
-	 * @see #getName()
-	 * @generated
-	 */
-    void setName(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Value</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Value</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-	 * @return the value of the '<em>Value</em>' attribute.
-	 * @see #setValue(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDynamicAttribute_Value()
-	 * @model
-	 * @generated
-	 */
-    String getValue();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DynamicAttribute#getValue <em>Value</em>}' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Value</em>' attribute.
-	 * @see #getValue()
-	 * @generated
-	 */
-    void setValue(String value);
-
-} // DynamicAttribute
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/DynamicElement.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/DynamicElement.java
deleted file mode 100644
index 3197969..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/DynamicElement.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Dynamic Element</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DynamicElement#getChildNodes <em>Child Nodes</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DynamicElement#getName <em>Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DynamicElement#getAttributes <em>Attributes</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DynamicElement#getTextContent <em>Text Content</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDynamicElement()
- * @model
- * @generated
- */
-public interface DynamicElement extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Child Nodes</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.DynamicElement}.
-	 * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Child Nodes</em>' containment reference list isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-	 * @return the value of the '<em>Child Nodes</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDynamicElement_ChildNodes()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.DynamicElement" containment="true"
-	 * @generated
-	 */
-    EList getChildNodes();
-
-    /**
-	 * Returns the value of the '<em><b>Attributes</b></em>' reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.DynamicAttribute}.
-	 * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Attributes</em>' attribute list isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-	 * @return the value of the '<em>Attributes</em>' reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDynamicElement_Attributes()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.DynamicAttribute"
-	 * @generated
-	 */
-    EList getAttributes();
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDynamicElement_TextContent()
-	 * @model
-	 * @generated
-	 */
-    String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DynamicElement#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-    void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Name</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-	 * @return the value of the '<em>Name</em>' attribute.
-	 * @see #setName(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDynamicElement_Name()
-	 * @model
-	 * @generated
-	 */
-    String getName();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DynamicElement#getName <em>Name</em>}' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Name</em>' attribute.
-	 * @see #getName()
-	 * @generated
-	 */
-    void setName(String value);
-
-} // DynamicElement
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ELResolverType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ELResolverType.java
deleted file mode 100644
index 793bfb0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ELResolverType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>EL Resolver Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ELResolverType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ELResolverType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getELResolverType()
- * @model extendedMetaData="name='el-resolver_._type' kind='simple'"
- * @generated
- */
-public interface ELResolverType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getELResolverType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-    String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ELResolverType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-    void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Id</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getELResolverType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-    String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ELResolverType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-    void setId(String value);
-
-} // ELResolverType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ExceptionHandlerFactoryType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ExceptionHandlerFactoryType.java
deleted file mode 100644
index de6e30f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ExceptionHandlerFactoryType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Exception Handler Factory Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ExceptionHandlerFactoryType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ExceptionHandlerFactoryType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getExceptionHandlerFactoryType()
- * @model extendedMetaData="name='exception-handler-factory_._type' kind='simple'"
- * @generated
- */
-public interface ExceptionHandlerFactoryType extends EObject {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getExceptionHandlerFactoryType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ExceptionHandlerFactoryType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getExceptionHandlerFactoryType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ExceptionHandlerFactoryType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // ExceptionHandlerFactoryType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ExtensionType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ExtensionType.java
deleted file mode 100644
index 613fa11..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ExtensionType.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Extension Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ExtensionType#getChildNodes <em>Child Nodes</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ExtensionType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ExtensionType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getExtensionType()
- * @model abstract="true"
- * @generated
- */
-public interface ExtensionType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Child Nodes</b></em>' reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.DynamicElement}.
-	 * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Child Nodes</em>' reference list isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-	 * @return the value of the '<em>Child Nodes</em>' reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getExtensionType_ChildNodes()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.DynamicElement"
-	 * @generated
-	 */
-    EList getChildNodes();
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getExtensionType_TextContent()
-	 * @model extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-    String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ExtensionType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-    void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Id</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getExtensionType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-    String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ExtensionType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-    void setId(String value);
-
-} // ExtensionType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ExternalContextFactoryType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ExternalContextFactoryType.java
deleted file mode 100644
index 563f9b7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ExternalContextFactoryType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>External Context Factory Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ExternalContextFactoryType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ExternalContextFactoryType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getExternalContextFactoryType()
- * @model extendedMetaData="name='external-context-factory_._type' kind='simple'"
- * @generated
- */
-public interface ExternalContextFactoryType extends EObject {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getExternalContextFactoryType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ExternalContextFactoryType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getExternalContextFactoryType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ExternalContextFactoryType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // ExternalContextFactoryType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FacesConfigExtensionType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FacesConfigExtensionType.java
deleted file mode 100644
index 2044448..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FacesConfigExtensionType.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Extension Type</b></em>'.
- * <!-- end-user-doc -->
- *
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFacesConfigExtensionType()
- * @model extendedMetaData="name='faces-config-extension_._type'"
- * @generated
- */
-public interface FacesConfigExtensionType extends ExtensionType {
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-} // FacesConfigExtensionType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FacesConfigFactory.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FacesConfigFactory.java
deleted file mode 100644
index c01c1f3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FacesConfigFactory.java
+++ /dev/null
@@ -1,1147 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EFactory;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Factory</b> for the model.
- * It provides a create method for each non-abstract class of the model.
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage
- * @generated
- */
-public interface FacesConfigFactory extends EFactory {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The singleton instance of the factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	FacesConfigFactory eINSTANCE = org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigFactoryImpl.init();
-
-    /**
-	 * Returns a new object of class '<em>Absolute Ordering Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Absolute Ordering Type</em>'.
-	 * @generated
-	 */
-	AbsoluteOrderingType createAbsoluteOrderingType();
-
-				/**
-	 * Returns a new object of class '<em>Action Listener Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Action Listener Type</em>'.
-	 * @generated
-	 */
-	ActionListenerType createActionListenerType();
-
-    /**
-	 * Returns a new object of class '<em>Application Factory Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Application Factory Type</em>'.
-	 * @generated
-	 */
-	ApplicationFactoryType createApplicationFactoryType();
-
-    /**
-	 * Returns a new object of class '<em>Application Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Application Type</em>'.
-	 * @generated
-	 */
-	ApplicationType createApplicationType();
-
-    /**
-	 * Returns a new object of class '<em>Attribute Class Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Attribute Class Type</em>'.
-	 * @generated
-	 */
-	AttributeClassType createAttributeClassType();
-
-    /**
-	 * Returns a new object of class '<em>Attribute Extension Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Attribute Extension Type</em>'.
-	 * @generated
-	 */
-	AttributeExtensionType createAttributeExtensionType();
-
-    /**
-	 * Returns a new object of class '<em>Attribute Name Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Attribute Name Type</em>'.
-	 * @generated
-	 */
-	AttributeNameType createAttributeNameType();
-
-    /**
-	 * Returns a new object of class '<em>Attribute Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Attribute Type</em>'.
-	 * @generated
-	 */
-	AttributeType createAttributeType();
-
-    /**
-	 * Returns a new object of class '<em>Behavior Class Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Behavior Class Type</em>'.
-	 * @generated
-	 */
-	BehaviorClassType createBehaviorClassType();
-
-				/**
-	 * Returns a new object of class '<em>Behavior Id Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Behavior Id Type</em>'.
-	 * @generated
-	 */
-	BehaviorIdType createBehaviorIdType();
-
-				/**
-	 * Returns a new object of class '<em>Behavior Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Behavior Type</em>'.
-	 * @generated
-	 */
-	BehaviorType createBehaviorType();
-
-				/**
-	 * Returns a new object of class '<em>Behavior Extension Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Behavior Extension Type</em>'.
-	 * @generated
-	 */
-	BehaviorExtensionType createBehaviorExtensionType();
-
-				/**
-	 * Returns a new object of class '<em>Client Behavior Renderer Class Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Client Behavior Renderer Class Type</em>'.
-	 * @generated
-	 */
-	ClientBehaviorRendererClassType createClientBehaviorRendererClassType();
-
-				/**
-	 * Returns a new object of class '<em>Client Behavior Renderer Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Client Behavior Renderer Type</em>'.
-	 * @generated
-	 */
-	ClientBehaviorRendererType createClientBehaviorRendererType();
-
-				/**
-	 * Returns a new object of class '<em>Client Behavior Renderer Type Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Client Behavior Renderer Type Type</em>'.
-	 * @generated
-	 */
-	ClientBehaviorRendererTypeType createClientBehaviorRendererTypeType();
-
-				/**
-	 * Returns a new object of class '<em>Component Class Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Component Class Type</em>'.
-	 * @generated
-	 */
-	ComponentClassType createComponentClassType();
-
-    /**
-	 * Returns a new object of class '<em>Component Extension Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Component Extension Type</em>'.
-	 * @generated
-	 */
-	ComponentExtensionType createComponentExtensionType();
-
-    /**
-	 * Returns a new object of class '<em>Component Family Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Component Family Type</em>'.
-	 * @generated
-	 */
-	ComponentFamilyType createComponentFamilyType();
-
-    /**
-	 * Returns a new object of class '<em>Component Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Component Type</em>'.
-	 * @generated
-	 */
-	ComponentType createComponentType();
-
-    /**
-	 * Returns a new object of class '<em>Component Type Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Component Type Type</em>'.
-	 * @generated
-	 */
-	ComponentTypeType createComponentTypeType();
-
-    /**
-	 * Returns a new object of class '<em>Converter Class Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Converter Class Type</em>'.
-	 * @generated
-	 */
-	ConverterClassType createConverterClassType();
-
-    /**
-	 * Returns a new object of class '<em>Converter For Class Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Converter For Class Type</em>'.
-	 * @generated
-	 */
-	ConverterForClassType createConverterForClassType();
-
-    /**
-	 * Returns a new object of class '<em>Converter Id Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Converter Id Type</em>'.
-	 * @generated
-	 */
-	ConverterIdType createConverterIdType();
-
-    /**
-	 * Returns a new object of class '<em>Converter Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Converter Type</em>'.
-	 * @generated
-	 */
-	ConverterType createConverterType();
-
-    /**
-	 * Returns a new object of class '<em>Default Locale Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Default Locale Type</em>'.
-	 * @generated
-	 */
-	DefaultLocaleType createDefaultLocaleType();
-
-    /**
-	 * Returns a new object of class '<em>Default Render Kit Id Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Default Render Kit Id Type</em>'.
-	 * @generated
-	 */
-	DefaultRenderKitIdType createDefaultRenderKitIdType();
-
-    /**
-	 * Returns a new object of class '<em>Default Validators Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Default Validators Type</em>'.
-	 * @generated
-	 */
-	DefaultValidatorsType createDefaultValidatorsType();
-
-				/**
-	 * Returns a new object of class '<em>Default Value Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Default Value Type</em>'.
-	 * @generated
-	 */
-	DefaultValueType createDefaultValueType();
-
-    /**
-	 * Returns a new object of class '<em>Description Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Description Type</em>'.
-	 * @generated
-	 */
-	DescriptionType createDescriptionType();
-
-    /**
-	 * Returns a new object of class '<em>Display Name Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Display Name Type</em>'.
-	 * @generated
-	 */
-	DisplayNameType createDisplayNameType();
-
-    /**
-	 * Returns a new object of class '<em>Document Root</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Document Root</em>'.
-	 * @generated
-	 */
-	DocumentRoot createDocumentRoot();
-
-    /**
-	 * Returns a new object of class '<em>Dynamic Attribute</em>'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Dynamic Attribute</em>'.
-	 * @generated
-	 */
-    DynamicAttribute createDynamicAttribute();
-
-    /**
-	 * Returns a new object of class '<em>Dynamic Element</em>'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Dynamic Element</em>'.
-	 * @generated
-	 */
-    DynamicElement createDynamicElement();
-
-    /**
-	 * Returns a new object of class '<em>EL Resolver Type</em>'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return a new object of class '<em>EL Resolver Type</em>'.
-	 * @generated
-	 */
-    ELResolverType createELResolverType();
-
-    /**
-	 * Returns a new object of class '<em>Exception Handler Factory Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Exception Handler Factory Type</em>'.
-	 * @generated
-	 */
-	ExceptionHandlerFactoryType createExceptionHandlerFactoryType();
-
-				/**
-	 * Returns a new object of class '<em>External Context Factory Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>External Context Factory Type</em>'.
-	 * @generated
-	 */
-	ExternalContextFactoryType createExternalContextFactoryType();
-
-				/**
-	 * Returns a new object of class '<em>Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Type</em>'.
-	 * @generated
-	 */
-	FacesConfigType createFacesConfigType();
-
-    /**
-	 * Returns a new object of class '<em>Faces Context Factory Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Faces Context Factory Type</em>'.
-	 * @generated
-	 */
-	FacesContextFactoryType createFacesContextFactoryType();
-
-    /**
-	 * Returns a new object of class '<em>Facet Extension Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Facet Extension Type</em>'.
-	 * @generated
-	 */
-	FacetExtensionType createFacetExtensionType();
-
-    /**
-	 * Returns a new object of class '<em>Facet Name Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Facet Name Type</em>'.
-	 * @generated
-	 */
-	FacetNameType createFacetNameType();
-
-    /**
-	 * Returns a new object of class '<em>Facet Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Facet Type</em>'.
-	 * @generated
-	 */
-	FacetType createFacetType();
-
-    /**
-	 * Returns a new object of class '<em>Factory Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Factory Type</em>'.
-	 * @generated
-	 */
-	FactoryType createFactoryType();
-
-    /**
-	 * Returns a new object of class '<em>From Action Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>From Action Type</em>'.
-	 * @generated
-	 */
-	FromActionType createFromActionType();
-
-    /**
-	 * Returns a new object of class '<em>From Outcome Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>From Outcome Type</em>'.
-	 * @generated
-	 */
-	FromOutcomeType createFromOutcomeType();
-
-    /**
-	 * Returns a new object of class '<em>From View Id Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>From View Id Type</em>'.
-	 * @generated
-	 */
-	FromViewIdType createFromViewIdType();
-
-    /**
-	 * Returns a new object of class '<em>Icon Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Icon Type</em>'.
-	 * @generated
-	 */
-	IconType createIconType();
-
-    /**
-	 * Returns a new object of class '<em>If Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>If Type</em>'.
-	 * @generated
-	 */
-	IfType createIfType();
-
-				/**
-	 * Returns a new object of class '<em>Key Class Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Key Class Type</em>'.
-	 * @generated
-	 */
-	KeyClassType createKeyClassType();
-
-    /**
-	 * Returns a new object of class '<em>Key Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Key Type</em>'.
-	 * @generated
-	 */
-	KeyType createKeyType();
-
-    /**
-	 * Returns a new object of class '<em>Large Icon Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Large Icon Type</em>'.
-	 * @generated
-	 */
-	LargeIconType createLargeIconType();
-
-    /**
-	 * Returns a new object of class '<em>Lifecycle Factory Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Lifecycle Factory Type</em>'.
-	 * @generated
-	 */
-	LifecycleFactoryType createLifecycleFactoryType();
-
-    /**
-	 * Returns a new object of class '<em>Lifecycle Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Lifecycle Type</em>'.
-	 * @generated
-	 */
-	LifecycleType createLifecycleType();
-
-    /**
-	 * Returns a new object of class '<em>List Entries Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>List Entries Type</em>'.
-	 * @generated
-	 */
-	ListEntriesType createListEntriesType();
-
-    /**
-	 * Returns a new object of class '<em>Locale Config Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Locale Config Type</em>'.
-	 * @generated
-	 */
-	LocaleConfigType createLocaleConfigType();
-
-    /**
-	 * Returns a new object of class '<em>Managed Bean Class Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Managed Bean Class Type</em>'.
-	 * @generated
-	 */
-	ManagedBeanClassType createManagedBeanClassType();
-
-    /**
-	 * Returns a new object of class '<em>Managed Bean Name Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Managed Bean Name Type</em>'.
-	 * @generated
-	 */
-	ManagedBeanNameType createManagedBeanNameType();
-
-    /**
-	 * Returns a new object of class '<em>Managed Bean Scope Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Managed Bean Scope Type</em>'.
-	 * @generated
-	 */
-	ManagedBeanScopeType createManagedBeanScopeType();
-
-    /**
-	 * Returns a new object of class '<em>Managed Bean Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Managed Bean Type</em>'.
-	 * @generated
-	 */
-	ManagedBeanType createManagedBeanType();
-
-    /**
-	 * Returns a new object of class '<em>Managed Property Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Managed Property Type</em>'.
-	 * @generated
-	 */
-	ManagedPropertyType createManagedPropertyType();
-
-    /**
-	 * Returns a new object of class '<em>Map Entries Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Map Entries Type</em>'.
-	 * @generated
-	 */
-	MapEntriesType createMapEntriesType();
-
-    /**
-	 * Returns a new object of class '<em>Map Entry Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Map Entry Type</em>'.
-	 * @generated
-	 */
-	MapEntryType createMapEntryType();
-
-    /**
-	 * Returns a new object of class '<em>Message Bundle Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Message Bundle Type</em>'.
-	 * @generated
-	 */
-	MessageBundleType createMessageBundleType();
-
-    /**
-	 * Returns a new object of class '<em>Name Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Name Type</em>'.
-	 * @generated
-	 */
-	NameType createNameType();
-
-				/**
-	 * Returns a new object of class '<em>Navigation Case Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Navigation Case Type</em>'.
-	 * @generated
-	 */
-	NavigationCaseType createNavigationCaseType();
-
-    /**
-	 * Returns a new object of class '<em>Navigation Handler Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Navigation Handler Type</em>'.
-	 * @generated
-	 */
-	NavigationHandlerType createNavigationHandlerType();
-
-    /**
-	 * Returns a new object of class '<em>Navigation Rule Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Navigation Rule Type</em>'.
-	 * @generated
-	 */
-	NavigationRuleType createNavigationRuleType();
-
-    /**
-	 * Returns a new object of class '<em>Null Value Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Null Value Type</em>'.
-	 * @generated
-	 */
-	NullValueType createNullValueType();
-
-    /**
-	 * Returns a new object of class '<em>Ordering Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Ordering Type</em>'.
-	 * @generated
-	 */
-	OrderingType createOrderingType();
-
-				/**
-	 * Returns a new object of class '<em>Ordering Ordering Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Ordering Ordering Type</em>'.
-	 * @generated
-	 */
-	OrderingOrderingType createOrderingOrderingType();
-
-				/**
-	 * Returns a new object of class '<em>Ordering Others Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Ordering Others Type</em>'.
-	 * @generated
-	 */
-	OrderingOthersType createOrderingOthersType();
-
-				/**
-	 * Returns a new object of class '<em>Partial View Context Factory Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Partial View Context Factory Type</em>'.
-	 * @generated
-	 */
-	PartialViewContextFactoryType createPartialViewContextFactoryType();
-
-				/**
-	 * Returns a new object of class '<em>Phase Listener Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Phase Listener Type</em>'.
-	 * @generated
-	 */
-	PhaseListenerType createPhaseListenerType();
-
-    /**
-	 * Returns a new object of class '<em>Property Class Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Property Class Type</em>'.
-	 * @generated
-	 */
-	PropertyClassType createPropertyClassType();
-
-    /**
-	 * Returns a new object of class '<em>Property Extension Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Property Extension Type</em>'.
-	 * @generated
-	 */
-	PropertyExtensionType createPropertyExtensionType();
-
-    /**
-	 * Returns a new object of class '<em>Property Name Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Property Name Type</em>'.
-	 * @generated
-	 */
-	PropertyNameType createPropertyNameType();
-
-    /**
-	 * Returns a new object of class '<em>Property Resolver Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Property Resolver Type</em>'.
-	 * @generated
-	 */
-	PropertyResolverType createPropertyResolverType();
-
-    /**
-	 * Returns a new object of class '<em>Property Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Property Type</em>'.
-	 * @generated
-	 */
-	PropertyType createPropertyType();
-
-    /**
-	 * Returns a new object of class '<em>Redirect Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Redirect Type</em>'.
-	 * @generated
-	 */
-	RedirectType createRedirectType();
-
-    /**
-	 * Returns a new object of class '<em>Redirect View Param Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Redirect View Param Type</em>'.
-	 * @generated
-	 */
-	RedirectViewParamType createRedirectViewParamType();
-
-				/**
-	 * Returns a new object of class '<em>Referenced Bean Class Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Referenced Bean Class Type</em>'.
-	 * @generated
-	 */
-	ReferencedBeanClassType createReferencedBeanClassType();
-
-    /**
-	 * Returns a new object of class '<em>Referenced Bean Name Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Referenced Bean Name Type</em>'.
-	 * @generated
-	 */
-	ReferencedBeanNameType createReferencedBeanNameType();
-
-    /**
-	 * Returns a new object of class '<em>Referenced Bean Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Referenced Bean Type</em>'.
-	 * @generated
-	 */
-	ReferencedBeanType createReferencedBeanType();
-
-    /**
-	 * Returns a new object of class '<em>Renderer Class Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Renderer Class Type</em>'.
-	 * @generated
-	 */
-	RendererClassType createRendererClassType();
-
-    /**
-	 * Returns a new object of class '<em>Renderer Extension Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Renderer Extension Type</em>'.
-	 * @generated
-	 */
-	RendererExtensionType createRendererExtensionType();
-
-    /**
-	 * Returns a new object of class '<em>Renderer Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Renderer Type</em>'.
-	 * @generated
-	 */
-	RendererType createRendererType();
-
-    /**
-	 * Returns a new object of class '<em>Renderer Type Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Renderer Type Type</em>'.
-	 * @generated
-	 */
-	RendererTypeType createRendererTypeType();
-
-    /**
-	 * Returns a new object of class '<em>Render Kit Class Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Render Kit Class Type</em>'.
-	 * @generated
-	 */
-	RenderKitClassType createRenderKitClassType();
-
-    /**
-	 * Returns a new object of class '<em>Render Kit Factory Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Render Kit Factory Type</em>'.
-	 * @generated
-	 */
-	RenderKitFactoryType createRenderKitFactoryType();
-
-    /**
-	 * Returns a new object of class '<em>Render Kit Id Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Render Kit Id Type</em>'.
-	 * @generated
-	 */
-	RenderKitIdType createRenderKitIdType();
-
-    /**
-	 * Returns a new object of class '<em>Render Kit Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Render Kit Type</em>'.
-	 * @generated
-	 */
-	RenderKitType createRenderKitType();
-
-    /**
-	 * Returns a new object of class '<em>Small Icon Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Small Icon Type</em>'.
-	 * @generated
-	 */
-	SmallIconType createSmallIconType();
-
-    /**
-	 * Returns a new object of class '<em>Source Class Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Source Class Type</em>'.
-	 * @generated
-	 */
-	SourceClassType createSourceClassType();
-
-				/**
-	 * Returns a new object of class '<em>State Manager Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>State Manager Type</em>'.
-	 * @generated
-	 */
-	StateManagerType createStateManagerType();
-
-    /**
-	 * Returns a new object of class '<em>Suggested Value Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Suggested Value Type</em>'.
-	 * @generated
-	 */
-	SuggestedValueType createSuggestedValueType();
-
-    /**
-	 * Returns a new object of class '<em>Supported Locale Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Supported Locale Type</em>'.
-	 * @generated
-	 */
-	SupportedLocaleType createSupportedLocaleType();
-
-    /**
-	 * Returns a new object of class '<em>System Event Class Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>System Event Class Type</em>'.
-	 * @generated
-	 */
-	SystemEventClassType createSystemEventClassType();
-
-				/**
-	 * Returns a new object of class '<em>System Event Listener Class Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>System Event Listener Class Type</em>'.
-	 * @generated
-	 */
-	SystemEventListenerClassType createSystemEventListenerClassType();
-
-				/**
-	 * Returns a new object of class '<em>System Event Listener Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>System Event Listener Type</em>'.
-	 * @generated
-	 */
-	SystemEventListenerType createSystemEventListenerType();
-
-				/**
-	 * Returns a new object of class '<em>Tag Handler Delegate Factory Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Tag Handler Delegate Factory Type</em>'.
-	 * @generated
-	 */
-	TagHandlerDelegateFactoryType createTagHandlerDelegateFactoryType();
-
-				/**
-	 * Returns a new object of class '<em>To View Id Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>To View Id Type</em>'.
-	 * @generated
-	 */
-	ToViewIdType createToViewIdType();
-
-    /**
-	 * Returns a new object of class '<em>Validator Class Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Validator Class Type</em>'.
-	 * @generated
-	 */
-	ValidatorClassType createValidatorClassType();
-
-    /**
-	 * Returns a new object of class '<em>Validator Id Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Validator Id Type</em>'.
-	 * @generated
-	 */
-	ValidatorIdType createValidatorIdType();
-
-    /**
-	 * Returns a new object of class '<em>Validator Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Validator Type</em>'.
-	 * @generated
-	 */
-	ValidatorType createValidatorType();
-
-    /**
-	 * Returns a new object of class '<em>Value Class Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Value Class Type</em>'.
-	 * @generated
-	 */
-	ValueClassType createValueClassType();
-
-    /**
-	 * Returns a new object of class '<em>Value Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Value Type</em>'.
-	 * @generated
-	 */
-	ValueType createValueType();
-
-    /**
-	 * Returns a new object of class '<em>Variable Resolver Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Variable Resolver Type</em>'.
-	 * @generated
-	 */
-	VariableResolverType createVariableResolverType();
-
-    /**
-	 * Returns a new object of class '<em>View Handler Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>View Handler Type</em>'.
-	 * @generated
-	 */
-	ViewHandlerType createViewHandlerType();
-
-    /**
-	 * Returns a new object of class '<em>Application Extension Type</em>'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Application Extension Type</em>'.
-	 * @generated
-	 */
-    ApplicationExtensionType createApplicationExtensionType();
-
-    /**
-	 * Returns a new object of class '<em>Resource Bundle Type</em>'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Resource Bundle Type</em>'.
-	 * @generated
-	 */
-    ResourceBundleType createResourceBundleType();
-
-    /**
-	 * Returns a new object of class '<em>Base Name Type</em>'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Base Name Type</em>'.
-	 * @generated
-	 */
-    BaseNameType createBaseNameType();
-
-    /**
-	 * Returns a new object of class '<em>Var Type</em>'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Var Type</em>'.
-	 * @generated
-	 */
-    VarType createVarType();
-
-    /**
-	 * Returns a new object of class '<em>View Declaration Language Factory Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>View Declaration Language Factory Type</em>'.
-	 * @generated
-	 */
-	ViewDeclarationLanguageFactoryType createViewDeclarationLanguageFactoryType();
-
-				/**
-	 * Returns a new object of class '<em>Visit Context Factory Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Visit Context Factory Type</em>'.
-	 * @generated
-	 */
-	VisitContextFactoryType createVisitContextFactoryType();
-
-				/**
-	 * Returns a new object of class '<em>Render Kit Extension Type</em>'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Render Kit Extension Type</em>'.
-	 * @generated
-	 */
-    RenderKitExtensionType createRenderKitExtensionType();
-
-    /**
-	 * Returns a new object of class '<em>Resource Handler Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Resource Handler Type</em>'.
-	 * @generated
-	 */
-	ResourceHandlerType createResourceHandlerType();
-
-				/**
-	 * Returns a new object of class '<em>Navigation Rule Extension Type</em>'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Navigation Rule Extension Type</em>'.
-	 * @generated
-	 */
-    NavigationRuleExtensionType createNavigationRuleExtensionType();
-
-    /**
-	 * Returns a new object of class '<em>Validator Extension Type</em>'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Validator Extension Type</em>'.
-	 * @generated
-	 */
-    ValidatorExtensionType createValidatorExtensionType();
-
-    /**
-	 * Returns a new object of class '<em>Extension Type</em>'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Extension Type</em>'.
-	 * @generated
-	 */
-    FacesConfigExtensionType createFacesConfigExtensionType();
-
-    /**
-	 * Returns a new object of class '<em>Factory Extension Type</em>'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Factory Extension Type</em>'.
-	 * @generated
-	 */
-    FactoryExtensionType createFactoryExtensionType();
-
-    /**
-	 * Returns a new object of class '<em>Lifecycle Extension Type</em>'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Lifecycle Extension Type</em>'.
-	 * @generated
-	 */
-    LifecycleExtensionType createLifecycleExtensionType();
-
-    /**
-	 * Returns a new object of class '<em>Managed Bean Extension Type</em>'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Managed Bean Extension Type</em>'.
-	 * @generated
-	 */
-    ManagedBeanExtensionType createManagedBeanExtensionType();
-
-    /**
-	 * Returns a new object of class '<em>Converter Extension Type</em>'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Converter Extension Type</em>'.
-	 * @generated
-	 */
-    ConverterExtensionType createConverterExtensionType();
-
-    /**
-	 * Returns the package supported by this factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the package supported by this factory.
-	 * @generated
-	 */
-	FacesConfigPackage getFacesConfigPackage();
-
-} //FacesConfigFactory
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FacesConfigPackage.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FacesConfigPackage.java
deleted file mode 100644
index c2a356e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FacesConfigPackage.java
+++ /dev/null
@@ -1,18749 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.EReference;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Package</b> for the model.
- * It contains accessors for the meta objects to represent
- * <ul>
- *   <li>each class,</li>
- *   <li>each feature of each class,</li>
- *   <li>each enum,</li>
- *   <li>and each data type</li>
- * </ul>
- * <!-- end-user-doc -->
- * <!-- begin-model-doc -->
- * 
- *    See http://www.w3.org/XML/1998/namespace.html and
- *    http://www.w3.org/TR/REC-xml for information about this namespace.
- * 
- *     This schema document describes the XML namespace, in a form
- *     suitable for import by other schema documents.  
- * 
- *     Note that local names in this namespace are intended to be defined
- *     only by the World Wide Web Consortium or its subgroups.  The
- *     following names are currently defined in this namespace and should
- *     not be used with conflicting semantics by any Working Group,
- *     specification, or document instance:
- * 
- *     base (as an attribute name): denotes an attribute whose value
- *          provides a URI to be used as the base for interpreting any
- *          relative URIs in the scope of the element on which it
- *          appears; its value is inherited.  This name is reserved
- *          by virtue of its definition in the XML Base specification.
- * 
- *     id   (as an attribute name): denotes an attribute whose value
- *          should be interpreted as if declared to be of type ID.
- *          The xml:id specification is not yet a W3C Recommendation,
- *          but this attribute is included here to facilitate experimentation
- *          with the mechanisms it proposes.  Note that it is _not_ included
- *          in the specialAttrs attribute group.
- * 
- *     lang (as an attribute name): denotes an attribute whose value
- *          is a language code for the natural language of the content of
- *          any element; its value is inherited.  This name is reserved
- *          by virtue of its definition in the XML specification.
- *   
- *     space (as an attribute name): denotes an attribute whose
- *          value is a keyword indicating what whitespace processing
- *          discipline is intended for the content of the element; its
- *          value is inherited.  This name is reserved by virtue of its
- *          definition in the XML specification.
- * 
- *     Father (in any context at all): denotes Jon Bosak, the chair of 
- *          the original XML Working Group.  This name is reserved by 
- *          the following decision of the W3C XML Plenary and 
- *          XML Coordination groups:
- * 
- *              In appreciation for his vision, leadership and dedication
- *              the W3C XML Plenary on this 10th day of February, 2000
- *              reserves for Jon Bosak in perpetuity the XML name
- *              xml:Father
- *   
- * This schema defines attributes and an attribute group
- *         suitable for use by
- *         schemas wishing to allow xml:base, xml:lang, xml:space or xml:id
- *         attributes on elements they define.
- * 
- *         To enable this, such a schema must import this schema
- *         for the XML namespace, e.g. as follows:
- *         &lt;schema . . .&gt;
- *          . . .
- *          &lt;import namespace="http://www.w3.org/XML/1998/namespace"
- *                     schemaLocation="http://www.w3.org/2001/xml.xsd"/&gt;
- * 
- *         Subsequently, qualified reference to any of the attributes
- *         or the group defined below will have the desired effect, e.g.
- * 
- *         &lt;type . . .&gt;
- *          . . .
- *          &lt;attributeGroup ref="xml:specialAttrs"/&gt;
- *  
- *          will define a type which will schema-validate an instance
- *          element with any of those attributes
- * In keeping with the XML Schema WG's standard versioning
- *    policy, this schema document will persist at
- *    http://www.w3.org/2005/08/xml.xsd.
- *    At the date of issue it can also be found at
- *    http://www.w3.org/2001/xml.xsd.
- *    The schema document at that URI may however change in the future,
- *    in order to remain compatible with the latest version of XML Schema
- *    itself, or with the XML namespace itself.  In other words, if the XML
- *    Schema or XML namespaces change, the version of this document at
- *    http://www.w3.org/2001/xml.xsd will change
- *    accordingly; the version at
- *    http://www.w3.org/2005/08/xml.xsd will not change.
- *   
- * <!-- end-model-doc -->
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory
- * @model kind="package"
- *        extendedMetaData="qualified='false'"
- * @generated
- */
-@SuppressWarnings("hiding")
-public interface FacesConfigPackage extends EPackage {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The package name.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String eNAME = "facesconfig"; //$NON-NLS-1$
-
-    /**
-	 * The package namespace URI.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String eNS_URI = "http://www.eclipse.org/webtools/jsf/schema/facesconfig.xsd"; //$NON-NLS-1$
-
-    /**
-	 * The package namespace name.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String eNS_PREFIX = "facesconfig"; //$NON-NLS-1$
-
-    /**
-	 * The singleton instance of the package.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	FacesConfigPackage eINSTANCE = org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl.init();
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.AbsoluteOrderingTypeImpl <em>Absolute Ordering Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.AbsoluteOrderingTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getAbsoluteOrderingType()
-	 * @generated
-	 */
-	int ABSOLUTE_ORDERING_TYPE = 0;
-
-				/**
-	 * The feature id for the '<em><b>Name</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ABSOLUTE_ORDERING_TYPE__NAME = 0;
-
-				/**
-	 * The feature id for the '<em><b>Others</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ABSOLUTE_ORDERING_TYPE__OTHERS = 1;
-
-				/**
-	 * The number of structural features of the '<em>Absolute Ordering Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ABSOLUTE_ORDERING_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ActionListenerTypeImpl <em>Action Listener Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ActionListenerTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getActionListenerType()
-	 * @generated
-	 */
-	int ACTION_LISTENER_TYPE = 1;
-
-    /**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTION_LISTENER_TYPE__TEXT_CONTENT = 0;
-
-    /**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTION_LISTENER_TYPE__ID = 1;
-
-    /**
-	 * The number of structural features of the '<em>Action Listener Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTION_LISTENER_TYPE_FEATURE_COUNT = 2;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ApplicationFactoryTypeImpl <em>Application Factory Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ApplicationFactoryTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getApplicationFactoryType()
-	 * @generated
-	 */
-	int APPLICATION_FACTORY_TYPE = 2;
-
-    /**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int APPLICATION_FACTORY_TYPE__TEXT_CONTENT = 0;
-
-    /**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int APPLICATION_FACTORY_TYPE__ID = 1;
-
-    /**
-	 * The number of structural features of the '<em>Application Factory Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int APPLICATION_FACTORY_TYPE_FEATURE_COUNT = 2;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ApplicationTypeImpl <em>Application Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ApplicationTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getApplicationType()
-	 * @generated
-	 */
-	int APPLICATION_TYPE = 3;
-
-    /**
-	 * The feature id for the '<em><b>Action Listener</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int APPLICATION_TYPE__ACTION_LISTENER = 0;
-
-    /**
-	 * The feature id for the '<em><b>Default Render Kit Id</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int APPLICATION_TYPE__DEFAULT_RENDER_KIT_ID = 1;
-
-    /**
-	 * The feature id for the '<em><b>Message Bundle</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int APPLICATION_TYPE__MESSAGE_BUNDLE = 2;
-
-    /**
-	 * The feature id for the '<em><b>Navigation Handler</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int APPLICATION_TYPE__NAVIGATION_HANDLER = 3;
-
-    /**
-	 * The feature id for the '<em><b>View Handler</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int APPLICATION_TYPE__VIEW_HANDLER = 4;
-
-    /**
-	 * The feature id for the '<em><b>State Manager</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int APPLICATION_TYPE__STATE_MANAGER = 5;
-
-    /**
-	 * The feature id for the '<em><b>EL Resolver</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int APPLICATION_TYPE__EL_RESOLVER = 6;
-
-				/**
-	 * The feature id for the '<em><b>Property Resolver</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int APPLICATION_TYPE__PROPERTY_RESOLVER = 7;
-
-				/**
-	 * The feature id for the '<em><b>Variable Resolver</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int APPLICATION_TYPE__VARIABLE_RESOLVER = 8;
-
-				/**
-	 * The feature id for the '<em><b>Resource Handler</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int APPLICATION_TYPE__RESOURCE_HANDLER = 9;
-
-				/**
-	 * The feature id for the '<em><b>System Event Listener</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int APPLICATION_TYPE__SYSTEM_EVENT_LISTENER = 10;
-
-				/**
-	 * The feature id for the '<em><b>Locale Config</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int APPLICATION_TYPE__LOCALE_CONFIG = 11;
-
-    /**
-	 * The feature id for the '<em><b>Resource Bundle</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int APPLICATION_TYPE__RESOURCE_BUNDLE = 12;
-
-    /**
-	 * The feature id for the '<em><b>Application Extension</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int APPLICATION_TYPE__APPLICATION_EXTENSION = 13;
-
-    /**
-	 * The feature id for the '<em><b>Default Validators</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int APPLICATION_TYPE__DEFAULT_VALIDATORS = 14;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int APPLICATION_TYPE__ID = 15;
-
-				/**
-	 * The number of structural features of the '<em>Application Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int APPLICATION_TYPE_FEATURE_COUNT = 16;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeClassTypeImpl <em>Attribute Class Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeClassTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getAttributeClassType()
-	 * @generated
-	 */
-	int ATTRIBUTE_CLASS_TYPE = 5;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeExtensionTypeImpl <em>Attribute Extension Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeExtensionTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getAttributeExtensionType()
-	 * @generated
-	 */
-	int ATTRIBUTE_EXTENSION_TYPE = 6;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeNameTypeImpl <em>Attribute Name Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeNameTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getAttributeNameType()
-	 * @generated
-	 */
-	int ATTRIBUTE_NAME_TYPE = 7;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeTypeImpl <em>Attribute Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getAttributeType()
-	 * @generated
-	 */
-	int ATTRIBUTE_TYPE = 8;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentClassTypeImpl <em>Component Class Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentClassTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getComponentClassType()
-	 * @generated
-	 */
-	int COMPONENT_CLASS_TYPE = 16;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ExtensionTypeImpl <em>Extension Type</em>}' class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ExtensionTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getExtensionType()
-	 * @generated
-	 */
-    int EXTENSION_TYPE = 37;
-
-    /**
-	 * The feature id for the '<em><b>Child Nodes</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int EXTENSION_TYPE__CHILD_NODES = 0;
-
-    /**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int EXTENSION_TYPE__TEXT_CONTENT = 1;
-
-    /**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int EXTENSION_TYPE__ID = 2;
-
-    /**
-	 * The number of structural features of the '<em>Extension Type</em>' class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int EXTENSION_TYPE_FEATURE_COUNT = 3;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.BehaviorClassTypeImpl <em>Behavior Class Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.BehaviorClassTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getBehaviorClassType()
-	 * @generated
-	 */
-	int BEHAVIOR_CLASS_TYPE = 9;
-
-				/**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.BehaviorIdTypeImpl <em>Behavior Id Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.BehaviorIdTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getBehaviorIdType()
-	 * @generated
-	 */
-	int BEHAVIOR_ID_TYPE = 10;
-
-				/**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.BehaviorTypeImpl <em>Behavior Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.BehaviorTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getBehaviorType()
-	 * @generated
-	 */
-	int BEHAVIOR_TYPE = 11;
-
-				/**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.BehaviorExtensionTypeImpl <em>Behavior Extension Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.BehaviorExtensionTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getBehaviorExtensionType()
-	 * @generated
-	 */
-	int BEHAVIOR_EXTENSION_TYPE = 12;
-
-				/**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ClientBehaviorRendererClassTypeImpl <em>Client Behavior Renderer Class Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ClientBehaviorRendererClassTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getClientBehaviorRendererClassType()
-	 * @generated
-	 */
-	int CLIENT_BEHAVIOR_RENDERER_CLASS_TYPE = 13;
-
-				/**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ClientBehaviorRendererTypeImpl <em>Client Behavior Renderer Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ClientBehaviorRendererTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getClientBehaviorRendererType()
-	 * @generated
-	 */
-	int CLIENT_BEHAVIOR_RENDERER_TYPE = 14;
-
-				/**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ClientBehaviorRendererTypeTypeImpl <em>Client Behavior Renderer Type Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ClientBehaviorRendererTypeTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getClientBehaviorRendererTypeType()
-	 * @generated
-	 */
-	int CLIENT_BEHAVIOR_RENDERER_TYPE_TYPE = 15;
-
-				/**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentExtensionTypeImpl <em>Component Extension Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentExtensionTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getComponentExtensionType()
-	 * @generated
-	 */
-	int COMPONENT_EXTENSION_TYPE = 17;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentFamilyTypeImpl <em>Component Family Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentFamilyTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getComponentFamilyType()
-	 * @generated
-	 */
-	int COMPONENT_FAMILY_TYPE = 18;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentTypeImpl <em>Component Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getComponentType()
-	 * @generated
-	 */
-	int COMPONENT_TYPE = 19;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentTypeTypeImpl <em>Component Type Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentTypeTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getComponentTypeType()
-	 * @generated
-	 */
-	int COMPONENT_TYPE_TYPE = 20;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterClassTypeImpl <em>Converter Class Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterClassTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getConverterClassType()
-	 * @generated
-	 */
-	int CONVERTER_CLASS_TYPE = 21;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterForClassTypeImpl <em>Converter For Class Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterForClassTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getConverterForClassType()
-	 * @generated
-	 */
-	int CONVERTER_FOR_CLASS_TYPE = 22;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterIdTypeImpl <em>Converter Id Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterIdTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getConverterIdType()
-	 * @generated
-	 */
-	int CONVERTER_ID_TYPE = 23;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterTypeImpl <em>Converter Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getConverterType()
-	 * @generated
-	 */
-	int CONVERTER_TYPE = 24;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DefaultLocaleTypeImpl <em>Default Locale Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.DefaultLocaleTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getDefaultLocaleType()
-	 * @generated
-	 */
-	int DEFAULT_LOCALE_TYPE = 26;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DefaultRenderKitIdTypeImpl <em>Default Render Kit Id Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.DefaultRenderKitIdTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getDefaultRenderKitIdType()
-	 * @generated
-	 */
-	int DEFAULT_RENDER_KIT_ID_TYPE = 27;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DefaultValidatorsTypeImpl <em>Default Validators Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.DefaultValidatorsTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getDefaultValidatorsType()
-	 * @generated
-	 */
-	int DEFAULT_VALIDATORS_TYPE = 28;
-
-				/**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DefaultValueTypeImpl <em>Default Value Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.DefaultValueTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getDefaultValueType()
-	 * @generated
-	 */
-	int DEFAULT_VALUE_TYPE = 29;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DescriptionTypeImpl <em>Description Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.DescriptionTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getDescriptionType()
-	 * @generated
-	 */
-	int DESCRIPTION_TYPE = 30;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DisplayNameTypeImpl <em>Display Name Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.DisplayNameTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getDisplayNameType()
-	 * @generated
-	 */
-	int DISPLAY_NAME_TYPE = 31;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl <em>Document Root</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getDocumentRoot()
-	 * @generated
-	 */
-	int DOCUMENT_ROOT = 32;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DynamicAttributeImpl <em>Dynamic Attribute</em>}' class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.DynamicAttributeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getDynamicAttribute()
-	 * @generated
-	 */
-    int DYNAMIC_ATTRIBUTE = 33;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DynamicElementImpl <em>Dynamic Element</em>}' class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.DynamicElementImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getDynamicElement()
-	 * @generated
-	 */
-    int DYNAMIC_ELEMENT = 34;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ELResolverTypeImpl <em>EL Resolver Type</em>}' class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ELResolverTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getELResolverType()
-	 * @generated
-	 */
-    int EL_RESOLVER_TYPE = 35;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigTypeImpl <em>Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getFacesConfigType()
-	 * @generated
-	 */
-	int FACES_CONFIG_TYPE = 39;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacesContextFactoryTypeImpl <em>Faces Context Factory Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesContextFactoryTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getFacesContextFactoryType()
-	 * @generated
-	 */
-	int FACES_CONTEXT_FACTORY_TYPE = 41;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacetExtensionTypeImpl <em>Facet Extension Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacetExtensionTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getFacetExtensionType()
-	 * @generated
-	 */
-	int FACET_EXTENSION_TYPE = 42;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacetNameTypeImpl <em>Facet Name Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacetNameTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getFacetNameType()
-	 * @generated
-	 */
-	int FACET_NAME_TYPE = 43;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacetTypeImpl <em>Facet Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacetTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getFacetType()
-	 * @generated
-	 */
-	int FACET_TYPE = 44;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FactoryTypeImpl <em>Factory Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FactoryTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getFactoryType()
-	 * @generated
-	 */
-	int FACTORY_TYPE = 45;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FromActionTypeImpl <em>From Action Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FromActionTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getFromActionType()
-	 * @generated
-	 */
-	int FROM_ACTION_TYPE = 47;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FromOutcomeTypeImpl <em>From Outcome Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FromOutcomeTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getFromOutcomeType()
-	 * @generated
-	 */
-	int FROM_OUTCOME_TYPE = 48;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FromViewIdTypeImpl <em>From View Id Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FromViewIdTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getFromViewIdType()
-	 * @generated
-	 */
-	int FROM_VIEW_ID_TYPE = 49;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.IconTypeImpl <em>Icon Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.IconTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getIconType()
-	 * @generated
-	 */
-	int ICON_TYPE = 50;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.IfTypeImpl <em>If Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.IfTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getIfType()
-	 * @generated
-	 */
-	int IF_TYPE = 51;
-
-				/**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.KeyClassTypeImpl <em>Key Class Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.KeyClassTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getKeyClassType()
-	 * @generated
-	 */
-	int KEY_CLASS_TYPE = 52;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.KeyTypeImpl <em>Key Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.KeyTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getKeyType()
-	 * @generated
-	 */
-	int KEY_TYPE = 53;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.LargeIconTypeImpl <em>Large Icon Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.LargeIconTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getLargeIconType()
-	 * @generated
-	 */
-	int LARGE_ICON_TYPE = 54;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.LifecycleFactoryTypeImpl <em>Lifecycle Factory Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.LifecycleFactoryTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getLifecycleFactoryType()
-	 * @generated
-	 */
-	int LIFECYCLE_FACTORY_TYPE = 55;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.LifecycleTypeImpl <em>Lifecycle Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.LifecycleTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getLifecycleType()
-	 * @generated
-	 */
-	int LIFECYCLE_TYPE = 56;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ListEntriesTypeImpl <em>List Entries Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ListEntriesTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getListEntriesType()
-	 * @generated
-	 */
-	int LIST_ENTRIES_TYPE = 58;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.LocaleConfigTypeImpl <em>Locale Config Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.LocaleConfigTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getLocaleConfigType()
-	 * @generated
-	 */
-	int LOCALE_CONFIG_TYPE = 59;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanClassTypeImpl <em>Managed Bean Class Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanClassTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getManagedBeanClassType()
-	 * @generated
-	 */
-	int MANAGED_BEAN_CLASS_TYPE = 60;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanNameTypeImpl <em>Managed Bean Name Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanNameTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getManagedBeanNameType()
-	 * @generated
-	 */
-	int MANAGED_BEAN_NAME_TYPE = 61;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanScopeTypeImpl <em>Managed Bean Scope Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanScopeTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getManagedBeanScopeType()
-	 * @generated
-	 */
-	int MANAGED_BEAN_SCOPE_TYPE = 62;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanTypeImpl <em>Managed Bean Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getManagedBeanType()
-	 * @generated
-	 */
-	int MANAGED_BEAN_TYPE = 63;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedPropertyTypeImpl <em>Managed Property Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedPropertyTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getManagedPropertyType()
-	 * @generated
-	 */
-	int MANAGED_PROPERTY_TYPE = 65;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.MapEntriesTypeImpl <em>Map Entries Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.MapEntriesTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getMapEntriesType()
-	 * @generated
-	 */
-	int MAP_ENTRIES_TYPE = 66;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.MapEntryTypeImpl <em>Map Entry Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.MapEntryTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getMapEntryType()
-	 * @generated
-	 */
-	int MAP_ENTRY_TYPE = 67;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.MessageBundleTypeImpl <em>Message Bundle Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.MessageBundleTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getMessageBundleType()
-	 * @generated
-	 */
-	int MESSAGE_BUNDLE_TYPE = 68;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.NameTypeImpl <em>Name Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.NameTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getNameType()
-	 * @generated
-	 */
-	int NAME_TYPE = 69;
-
-				/**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationCaseTypeImpl <em>Navigation Case Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationCaseTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getNavigationCaseType()
-	 * @generated
-	 */
-	int NAVIGATION_CASE_TYPE = 70;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationHandlerTypeImpl <em>Navigation Handler Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationHandlerTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getNavigationHandlerType()
-	 * @generated
-	 */
-	int NAVIGATION_HANDLER_TYPE = 71;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationRuleTypeImpl <em>Navigation Rule Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationRuleTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getNavigationRuleType()
-	 * @generated
-	 */
-	int NAVIGATION_RULE_TYPE = 72;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.NullValueTypeImpl <em>Null Value Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.NullValueTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getNullValueType()
-	 * @generated
-	 */
-	int NULL_VALUE_TYPE = 74;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.OrderingTypeImpl <em>Ordering Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.OrderingTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getOrderingType()
-	 * @generated
-	 */
-	int ORDERING_TYPE = 75;
-
-				/**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.OrderingOrderingTypeImpl <em>Ordering Ordering Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.OrderingOrderingTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getOrderingOrderingType()
-	 * @generated
-	 */
-	int ORDERING_ORDERING_TYPE = 76;
-
-				/**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.OrderingOthersTypeImpl <em>Ordering Others Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.OrderingOthersTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getOrderingOthersType()
-	 * @generated
-	 */
-	int ORDERING_OTHERS_TYPE = 77;
-
-				/**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PartialViewContextFactoryTypeImpl <em>Partial View Context Factory Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.PartialViewContextFactoryTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getPartialViewContextFactoryType()
-	 * @generated
-	 */
-	int PARTIAL_VIEW_CONTEXT_FACTORY_TYPE = 78;
-
-				/**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PhaseListenerTypeImpl <em>Phase Listener Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.PhaseListenerTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getPhaseListenerType()
-	 * @generated
-	 */
-	int PHASE_LISTENER_TYPE = 79;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyClassTypeImpl <em>Property Class Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyClassTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getPropertyClassType()
-	 * @generated
-	 */
-	int PROPERTY_CLASS_TYPE = 80;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyExtensionTypeImpl <em>Property Extension Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyExtensionTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getPropertyExtensionType()
-	 * @generated
-	 */
-	int PROPERTY_EXTENSION_TYPE = 81;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyNameTypeImpl <em>Property Name Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyNameTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getPropertyNameType()
-	 * @generated
-	 */
-	int PROPERTY_NAME_TYPE = 82;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyResolverTypeImpl <em>Property Resolver Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyResolverTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getPropertyResolverType()
-	 * @generated
-	 */
-	int PROPERTY_RESOLVER_TYPE = 83;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyTypeImpl <em>Property Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getPropertyType()
-	 * @generated
-	 */
-	int PROPERTY_TYPE = 84;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RedirectTypeImpl <em>Redirect Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.RedirectTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getRedirectType()
-	 * @generated
-	 */
-	int REDIRECT_TYPE = 85;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RedirectViewParamTypeImpl <em>Redirect View Param Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.RedirectViewParamTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getRedirectViewParamType()
-	 * @generated
-	 */
-	int REDIRECT_VIEW_PARAM_TYPE = 86;
-
-				/**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ReferencedBeanClassTypeImpl <em>Referenced Bean Class Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ReferencedBeanClassTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getReferencedBeanClassType()
-	 * @generated
-	 */
-	int REFERENCED_BEAN_CLASS_TYPE = 87;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ReferencedBeanNameTypeImpl <em>Referenced Bean Name Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ReferencedBeanNameTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getReferencedBeanNameType()
-	 * @generated
-	 */
-	int REFERENCED_BEAN_NAME_TYPE = 88;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ReferencedBeanTypeImpl <em>Referenced Bean Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ReferencedBeanTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getReferencedBeanType()
-	 * @generated
-	 */
-	int REFERENCED_BEAN_TYPE = 89;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RendererClassTypeImpl <em>Renderer Class Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.RendererClassTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getRendererClassType()
-	 * @generated
-	 */
-	int RENDERER_CLASS_TYPE = 90;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RendererExtensionTypeImpl <em>Renderer Extension Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.RendererExtensionTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getRendererExtensionType()
-	 * @generated
-	 */
-	int RENDERER_EXTENSION_TYPE = 91;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RendererTypeImpl <em>Renderer Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.RendererTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getRendererType()
-	 * @generated
-	 */
-	int RENDERER_TYPE = 92;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RendererTypeTypeImpl <em>Renderer Type Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.RendererTypeTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getRendererTypeType()
-	 * @generated
-	 */
-	int RENDERER_TYPE_TYPE = 93;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitClassTypeImpl <em>Render Kit Class Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitClassTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getRenderKitClassType()
-	 * @generated
-	 */
-	int RENDER_KIT_CLASS_TYPE = 94;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitFactoryTypeImpl <em>Render Kit Factory Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitFactoryTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getRenderKitFactoryType()
-	 * @generated
-	 */
-	int RENDER_KIT_FACTORY_TYPE = 95;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitIdTypeImpl <em>Render Kit Id Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitIdTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getRenderKitIdType()
-	 * @generated
-	 */
-	int RENDER_KIT_ID_TYPE = 96;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitTypeImpl <em>Render Kit Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getRenderKitType()
-	 * @generated
-	 */
-	int RENDER_KIT_TYPE = 97;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.SmallIconTypeImpl <em>Small Icon Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.SmallIconTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getSmallIconType()
-	 * @generated
-	 */
-	int SMALL_ICON_TYPE = 100;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.SourceClassTypeImpl <em>Source Class Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.SourceClassTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getSourceClassType()
-	 * @generated
-	 */
-	int SOURCE_CLASS_TYPE = 101;
-
-				/**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.StateManagerTypeImpl <em>State Manager Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.StateManagerTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getStateManagerType()
-	 * @generated
-	 */
-	int STATE_MANAGER_TYPE = 102;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.SuggestedValueTypeImpl <em>Suggested Value Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.SuggestedValueTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getSuggestedValueType()
-	 * @generated
-	 */
-	int SUGGESTED_VALUE_TYPE = 103;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.SupportedLocaleTypeImpl <em>Supported Locale Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.SupportedLocaleTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getSupportedLocaleType()
-	 * @generated
-	 */
-	int SUPPORTED_LOCALE_TYPE = 104;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.SystemEventClassTypeImpl <em>System Event Class Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.SystemEventClassTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getSystemEventClassType()
-	 * @generated
-	 */
-	int SYSTEM_EVENT_CLASS_TYPE = 105;
-
-				/**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.SystemEventListenerClassTypeImpl <em>System Event Listener Class Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.SystemEventListenerClassTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getSystemEventListenerClassType()
-	 * @generated
-	 */
-	int SYSTEM_EVENT_LISTENER_CLASS_TYPE = 106;
-
-				/**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.SystemEventListenerTypeImpl <em>System Event Listener Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.SystemEventListenerTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getSystemEventListenerType()
-	 * @generated
-	 */
-	int SYSTEM_EVENT_LISTENER_TYPE = 107;
-
-				/**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.TagHandlerDelegateFactoryTypeImpl <em>Tag Handler Delegate Factory Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.TagHandlerDelegateFactoryTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getTagHandlerDelegateFactoryType()
-	 * @generated
-	 */
-	int TAG_HANDLER_DELEGATE_FACTORY_TYPE = 108;
-
-				/**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ToViewIdTypeImpl <em>To View Id Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ToViewIdTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getToViewIdType()
-	 * @generated
-	 */
-	int TO_VIEW_ID_TYPE = 109;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ValidatorClassTypeImpl <em>Validator Class Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ValidatorClassTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getValidatorClassType()
-	 * @generated
-	 */
-	int VALIDATOR_CLASS_TYPE = 110;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ValidatorIdTypeImpl <em>Validator Id Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ValidatorIdTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getValidatorIdType()
-	 * @generated
-	 */
-	int VALIDATOR_ID_TYPE = 111;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ValidatorTypeImpl <em>Validator Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ValidatorTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getValidatorType()
-	 * @generated
-	 */
-	int VALIDATOR_TYPE = 112;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ValueClassTypeImpl <em>Value Class Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ValueClassTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getValueClassType()
-	 * @generated
-	 */
-	int VALUE_CLASS_TYPE = 114;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ValueTypeImpl <em>Value Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ValueTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getValueType()
-	 * @generated
-	 */
-	int VALUE_TYPE = 115;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.VariableResolverTypeImpl <em>Variable Resolver Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.VariableResolverTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getVariableResolverType()
-	 * @generated
-	 */
-	int VARIABLE_RESOLVER_TYPE = 116;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ViewHandlerTypeImpl <em>View Handler Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ViewHandlerTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getViewHandlerType()
-	 * @generated
-	 */
-	int VIEW_HANDLER_TYPE = 117;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ApplicationExtensionTypeImpl <em>Application Extension Type</em>}' class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ApplicationExtensionTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getApplicationExtensionType()
-	 * @generated
-	 */
-    int APPLICATION_EXTENSION_TYPE = 4;
-
-    /**
-	 * The feature id for the '<em><b>Child Nodes</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int APPLICATION_EXTENSION_TYPE__CHILD_NODES = EXTENSION_TYPE__CHILD_NODES;
-
-    /**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int APPLICATION_EXTENSION_TYPE__TEXT_CONTENT = EXTENSION_TYPE__TEXT_CONTENT;
-
-    /**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int APPLICATION_EXTENSION_TYPE__ID = EXTENSION_TYPE__ID;
-
-    /**
-	 * The number of structural features of the '<em>Application Extension Type</em>' class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int APPLICATION_EXTENSION_TYPE_FEATURE_COUNT = EXTENSION_TYPE_FEATURE_COUNT + 0;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ATTRIBUTE_CLASS_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ATTRIBUTE_CLASS_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Attribute Class Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ATTRIBUTE_CLASS_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Child Nodes</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int ATTRIBUTE_EXTENSION_TYPE__CHILD_NODES = EXTENSION_TYPE__CHILD_NODES;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int ATTRIBUTE_EXTENSION_TYPE__TEXT_CONTENT = EXTENSION_TYPE__TEXT_CONTENT;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ATTRIBUTE_EXTENSION_TYPE__ID = EXTENSION_TYPE__ID;
-
-				/**
-	 * The number of structural features of the '<em>Attribute Extension Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ATTRIBUTE_EXTENSION_TYPE_FEATURE_COUNT = EXTENSION_TYPE_FEATURE_COUNT + 0;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ATTRIBUTE_NAME_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ATTRIBUTE_NAME_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Attribute Name Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ATTRIBUTE_NAME_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Description</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ATTRIBUTE_TYPE__DESCRIPTION = 0;
-
-				/**
-	 * The feature id for the '<em><b>Display Name</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ATTRIBUTE_TYPE__DISPLAY_NAME = 1;
-
-				/**
-	 * The feature id for the '<em><b>Icon</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ATTRIBUTE_TYPE__ICON = 2;
-
-				/**
-	 * The feature id for the '<em><b>Attribute Name</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ATTRIBUTE_TYPE__ATTRIBUTE_NAME = 3;
-
-				/**
-	 * The feature id for the '<em><b>Attribute Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ATTRIBUTE_TYPE__ATTRIBUTE_CLASS = 4;
-
-				/**
-	 * The feature id for the '<em><b>Default Value</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ATTRIBUTE_TYPE__DEFAULT_VALUE = 5;
-
-				/**
-	 * The feature id for the '<em><b>Suggested Value</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ATTRIBUTE_TYPE__SUGGESTED_VALUE = 6;
-
-				/**
-	 * The feature id for the '<em><b>Attribute Extension</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ATTRIBUTE_TYPE__ATTRIBUTE_EXTENSION = 7;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ATTRIBUTE_TYPE__ID = 8;
-
-				/**
-	 * The number of structural features of the '<em>Attribute Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ATTRIBUTE_TYPE_FEATURE_COUNT = 9;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BEHAVIOR_CLASS_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BEHAVIOR_CLASS_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Behavior Class Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BEHAVIOR_CLASS_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BEHAVIOR_ID_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BEHAVIOR_ID_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Behavior Id Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BEHAVIOR_ID_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Description</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BEHAVIOR_TYPE__DESCRIPTION = 0;
-
-				/**
-	 * The feature id for the '<em><b>Display Name</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BEHAVIOR_TYPE__DISPLAY_NAME = 1;
-
-				/**
-	 * The feature id for the '<em><b>Icon</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BEHAVIOR_TYPE__ICON = 2;
-
-				/**
-	 * The feature id for the '<em><b>Behavior Id</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BEHAVIOR_TYPE__BEHAVIOR_ID = 3;
-
-				/**
-	 * The feature id for the '<em><b>Behavior Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BEHAVIOR_TYPE__BEHAVIOR_CLASS = 4;
-
-				/**
-	 * The feature id for the '<em><b>Attribute</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BEHAVIOR_TYPE__ATTRIBUTE = 5;
-
-				/**
-	 * The feature id for the '<em><b>Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BEHAVIOR_TYPE__PROPERTY = 6;
-
-				/**
-	 * The feature id for the '<em><b>Behavior Extension</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BEHAVIOR_TYPE__BEHAVIOR_EXTENSION = 7;
-
-				/**
-	 * The number of structural features of the '<em>Behavior Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BEHAVIOR_TYPE_FEATURE_COUNT = 8;
-
-				/**
-	 * The feature id for the '<em><b>Child Nodes</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BEHAVIOR_EXTENSION_TYPE__CHILD_NODES = EXTENSION_TYPE__CHILD_NODES;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BEHAVIOR_EXTENSION_TYPE__TEXT_CONTENT = EXTENSION_TYPE__TEXT_CONTENT;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BEHAVIOR_EXTENSION_TYPE__ID = EXTENSION_TYPE__ID;
-
-				/**
-	 * The number of structural features of the '<em>Behavior Extension Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BEHAVIOR_EXTENSION_TYPE_FEATURE_COUNT = EXTENSION_TYPE_FEATURE_COUNT + 0;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CLIENT_BEHAVIOR_RENDERER_CLASS_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CLIENT_BEHAVIOR_RENDERER_CLASS_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Client Behavior Renderer Class Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CLIENT_BEHAVIOR_RENDERER_CLASS_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Client Behavior Renderer Type</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CLIENT_BEHAVIOR_RENDERER_TYPE__CLIENT_BEHAVIOR_RENDERER_TYPE = 0;
-
-				/**
-	 * The feature id for the '<em><b>Client Behavior Renderer Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CLIENT_BEHAVIOR_RENDERER_TYPE__CLIENT_BEHAVIOR_RENDERER_CLASS = 1;
-
-				/**
-	 * The number of structural features of the '<em>Client Behavior Renderer Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CLIENT_BEHAVIOR_RENDERER_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CLIENT_BEHAVIOR_RENDERER_TYPE_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CLIENT_BEHAVIOR_RENDERER_TYPE_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Client Behavior Renderer Type Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CLIENT_BEHAVIOR_RENDERER_TYPE_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COMPONENT_CLASS_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COMPONENT_CLASS_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Component Class Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COMPONENT_CLASS_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Child Nodes</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int COMPONENT_EXTENSION_TYPE__CHILD_NODES = EXTENSION_TYPE__CHILD_NODES;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int COMPONENT_EXTENSION_TYPE__TEXT_CONTENT = EXTENSION_TYPE__TEXT_CONTENT;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COMPONENT_EXTENSION_TYPE__ID = EXTENSION_TYPE__ID;
-
-				/**
-	 * The number of structural features of the '<em>Component Extension Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COMPONENT_EXTENSION_TYPE_FEATURE_COUNT = EXTENSION_TYPE_FEATURE_COUNT + 0;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COMPONENT_FAMILY_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COMPONENT_FAMILY_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Component Family Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COMPONENT_FAMILY_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Description</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COMPONENT_TYPE__DESCRIPTION = 0;
-
-				/**
-	 * The feature id for the '<em><b>Display Name</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COMPONENT_TYPE__DISPLAY_NAME = 1;
-
-				/**
-	 * The feature id for the '<em><b>Icon</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COMPONENT_TYPE__ICON = 2;
-
-				/**
-	 * The feature id for the '<em><b>Component Type</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COMPONENT_TYPE__COMPONENT_TYPE = 3;
-
-				/**
-	 * The feature id for the '<em><b>Component Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COMPONENT_TYPE__COMPONENT_CLASS = 4;
-
-				/**
-	 * The feature id for the '<em><b>Facet</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COMPONENT_TYPE__FACET = 5;
-
-				/**
-	 * The feature id for the '<em><b>Attribute</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COMPONENT_TYPE__ATTRIBUTE = 6;
-
-				/**
-	 * The feature id for the '<em><b>Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COMPONENT_TYPE__PROPERTY = 7;
-
-				/**
-	 * The feature id for the '<em><b>Component Extension</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COMPONENT_TYPE__COMPONENT_EXTENSION = 8;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COMPONENT_TYPE__ID = 9;
-
-				/**
-	 * The number of structural features of the '<em>Component Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COMPONENT_TYPE_FEATURE_COUNT = 10;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COMPONENT_TYPE_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COMPONENT_TYPE_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Component Type Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COMPONENT_TYPE_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONVERTER_CLASS_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONVERTER_CLASS_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Converter Class Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONVERTER_CLASS_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONVERTER_FOR_CLASS_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONVERTER_FOR_CLASS_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Converter For Class Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONVERTER_FOR_CLASS_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONVERTER_ID_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONVERTER_ID_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Converter Id Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONVERTER_ID_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Description</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONVERTER_TYPE__DESCRIPTION = 0;
-
-				/**
-	 * The feature id for the '<em><b>Display Name</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONVERTER_TYPE__DISPLAY_NAME = 1;
-
-				/**
-	 * The feature id for the '<em><b>Icon</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONVERTER_TYPE__ICON = 2;
-
-				/**
-	 * The feature id for the '<em><b>Converter Id</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONVERTER_TYPE__CONVERTER_ID = 3;
-
-				/**
-	 * The feature id for the '<em><b>Converter For Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONVERTER_TYPE__CONVERTER_FOR_CLASS = 4;
-
-				/**
-	 * The feature id for the '<em><b>Converter Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONVERTER_TYPE__CONVERTER_CLASS = 5;
-
-				/**
-	 * The feature id for the '<em><b>Attribute</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONVERTER_TYPE__ATTRIBUTE = 6;
-
-				/**
-	 * The feature id for the '<em><b>Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONVERTER_TYPE__PROPERTY = 7;
-
-				/**
-	 * The feature id for the '<em><b>Converter Extension</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int CONVERTER_TYPE__CONVERTER_EXTENSION = 8;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONVERTER_TYPE__ID = 9;
-
-				/**
-	 * The number of structural features of the '<em>Converter Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONVERTER_TYPE_FEATURE_COUNT = 10;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ResourceBundleTypeImpl <em>Resource Bundle Type</em>}' class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ResourceBundleTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getResourceBundleType()
-	 * @generated
-	 */
-    int RESOURCE_BUNDLE_TYPE = 118;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.BaseNameTypeImpl <em>Base Name Type</em>}' class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.BaseNameTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getBaseNameType()
-	 * @generated
-	 */
-    int BASE_NAME_TYPE = 119;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.VarTypeImpl <em>Var Type</em>}' class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.VarTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getVarType()
-	 * @generated
-	 */
-    int VAR_TYPE = 120;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigExtensionTypeImpl <em>Extension Type</em>}' class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigExtensionTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getFacesConfigExtensionType()
-	 * @generated
-	 */
-    int FACES_CONFIG_EXTENSION_TYPE = 40;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FactoryExtensionTypeImpl <em>Factory Extension Type</em>}' class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FactoryExtensionTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getFactoryExtensionType()
-	 * @generated
-	 */
-    int FACTORY_EXTENSION_TYPE = 46;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.LifecycleExtensionTypeImpl <em>Lifecycle Extension Type</em>}' class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.LifecycleExtensionTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getLifecycleExtensionType()
-	 * @generated
-	 */
-    int LIFECYCLE_EXTENSION_TYPE = 57;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterExtensionTypeImpl <em>Converter Extension Type</em>}' class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterExtensionTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getConverterExtensionType()
-	 * @generated
-	 */
-    int CONVERTER_EXTENSION_TYPE = 25;
-
-    /**
-	 * The feature id for the '<em><b>Child Nodes</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int CONVERTER_EXTENSION_TYPE__CHILD_NODES = EXTENSION_TYPE__CHILD_NODES;
-
-    /**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int CONVERTER_EXTENSION_TYPE__TEXT_CONTENT = EXTENSION_TYPE__TEXT_CONTENT;
-
-    /**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int CONVERTER_EXTENSION_TYPE__ID = EXTENSION_TYPE__ID;
-
-    /**
-	 * The number of structural features of the '<em>Converter Extension Type</em>' class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int CONVERTER_EXTENSION_TYPE_FEATURE_COUNT = EXTENSION_TYPE_FEATURE_COUNT + 0;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DEFAULT_LOCALE_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DEFAULT_LOCALE_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Default Locale Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DEFAULT_LOCALE_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DEFAULT_RENDER_KIT_ID_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DEFAULT_RENDER_KIT_ID_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Default Render Kit Id Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DEFAULT_RENDER_KIT_ID_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Validator Id</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DEFAULT_VALIDATORS_TYPE__VALIDATOR_ID = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DEFAULT_VALIDATORS_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Default Validators Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DEFAULT_VALIDATORS_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DEFAULT_VALUE_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DEFAULT_VALUE_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Default Value Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DEFAULT_VALUE_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIPTION_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Lang</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIPTION_TYPE__LANG = 1;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIPTION_TYPE__ID = 2;
-
-				/**
-	 * The number of structural features of the '<em>Description Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIPTION_TYPE_FEATURE_COUNT = 3;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DISPLAY_NAME_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Lang</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DISPLAY_NAME_TYPE__LANG = 1;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DISPLAY_NAME_TYPE__ID = 2;
-
-				/**
-	 * The number of structural features of the '<em>Display Name Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DISPLAY_NAME_TYPE_FEATURE_COUNT = 3;
-
-				/**
-	 * The feature id for the '<em><b>Mixed</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__MIXED = 0;
-
-				/**
-	 * The feature id for the '<em><b>XMLNS Prefix Map</b></em>' map.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__XMLNS_PREFIX_MAP = 1;
-
-				/**
-	 * The feature id for the '<em><b>XSI Schema Location</b></em>' map.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__XSI_SCHEMA_LOCATION = 2;
-
-				/**
-	 * The feature id for the '<em><b>Absolute Ordering</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__ABSOLUTE_ORDERING = 3;
-
-				/**
-	 * The feature id for the '<em><b>Action Listener</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__ACTION_LISTENER = 4;
-
-				/**
-	 * The feature id for the '<em><b>Application</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__APPLICATION = 5;
-
-				/**
-	 * The feature id for the '<em><b>Application Factory</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__APPLICATION_FACTORY = 6;
-
-				/**
-	 * The feature id for the '<em><b>Attribute</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__ATTRIBUTE = 7;
-
-				/**
-	 * The feature id for the '<em><b>Attribute Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__ATTRIBUTE_CLASS = 8;
-
-				/**
-	 * The feature id for the '<em><b>Attribute Extension</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__ATTRIBUTE_EXTENSION = 9;
-
-				/**
-	 * The feature id for the '<em><b>Attribute Name</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__ATTRIBUTE_NAME = 10;
-
-				/**
-	 * The feature id for the '<em><b>Behavior</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__BEHAVIOR = 11;
-
-				/**
-	 * The feature id for the '<em><b>Behavior Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__BEHAVIOR_CLASS = 12;
-
-				/**
-	 * The feature id for the '<em><b>Behavior Id</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__BEHAVIOR_ID = 13;
-
-				/**
-	 * The feature id for the '<em><b>Behavior Extension</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__BEHAVIOR_EXTENSION = 14;
-
-				/**
-	 * The feature id for the '<em><b>Component</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__COMPONENT = 15;
-
-				/**
-	 * The feature id for the '<em><b>Component Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__COMPONENT_CLASS = 16;
-
-				/**
-	 * The feature id for the '<em><b>Component Extension</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__COMPONENT_EXTENSION = 17;
-
-				/**
-	 * The feature id for the '<em><b>Component Family</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__COMPONENT_FAMILY = 18;
-
-				/**
-	 * The feature id for the '<em><b>Component Type</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__COMPONENT_TYPE = 19;
-
-				/**
-	 * The feature id for the '<em><b>Converter</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__CONVERTER = 20;
-
-				/**
-	 * The feature id for the '<em><b>Converter Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__CONVERTER_CLASS = 21;
-
-				/**
-	 * The feature id for the '<em><b>Converter For Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__CONVERTER_FOR_CLASS = 22;
-
-				/**
-	 * The feature id for the '<em><b>Converter Id</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__CONVERTER_ID = 23;
-
-				/**
-	 * The feature id for the '<em><b>Default Locale</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__DEFAULT_LOCALE = 24;
-
-				/**
-	 * The feature id for the '<em><b>Default Render Kit Id</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__DEFAULT_RENDER_KIT_ID = 25;
-
-				/**
-	 * The feature id for the '<em><b>Default Validators</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__DEFAULT_VALIDATORS = 26;
-
-				/**
-	 * The feature id for the '<em><b>Default Value</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__DEFAULT_VALUE = 27;
-
-				/**
-	 * The feature id for the '<em><b>Description</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__DESCRIPTION = 28;
-
-				/**
-	 * The feature id for the '<em><b>Display Name</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__DISPLAY_NAME = 29;
-
-				/**
-	 * The feature id for the '<em><b>Exception Handler Factory</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__EXCEPTION_HANDLER_FACTORY = 30;
-
-				/**
-	 * The feature id for the '<em><b>External Context Factory</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__EXTERNAL_CONTEXT_FACTORY = 31;
-
-				/**
-	 * The feature id for the '<em><b>Faces Config</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__FACES_CONFIG = 32;
-
-				/**
-	 * The feature id for the '<em><b>Faces Context Factory</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__FACES_CONTEXT_FACTORY = 33;
-
-				/**
-	 * The feature id for the '<em><b>Facet</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__FACET = 34;
-
-				/**
-	 * The feature id for the '<em><b>Facet Extension</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__FACET_EXTENSION = 35;
-
-				/**
-	 * The feature id for the '<em><b>Facet Name</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__FACET_NAME = 36;
-
-				/**
-	 * The feature id for the '<em><b>Factory</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__FACTORY = 37;
-
-				/**
-	 * The feature id for the '<em><b>From Action</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__FROM_ACTION = 38;
-
-				/**
-	 * The feature id for the '<em><b>From Outcome</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__FROM_OUTCOME = 39;
-
-				/**
-	 * The feature id for the '<em><b>From View Id</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__FROM_VIEW_ID = 40;
-
-				/**
-	 * The feature id for the '<em><b>Icon</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__ICON = 41;
-
-				/**
-	 * The feature id for the '<em><b>If</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__IF = 42;
-
-				/**
-	 * The feature id for the '<em><b>Key</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__KEY = 43;
-
-				/**
-	 * The feature id for the '<em><b>Key Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__KEY_CLASS = 44;
-
-				/**
-	 * The feature id for the '<em><b>Large Icon</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__LARGE_ICON = 45;
-
-				/**
-	 * The feature id for the '<em><b>Lifecycle</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__LIFECYCLE = 46;
-
-				/**
-	 * The feature id for the '<em><b>Lifecycle Factory</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__LIFECYCLE_FACTORY = 47;
-
-				/**
-	 * The feature id for the '<em><b>List Entries</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__LIST_ENTRIES = 48;
-
-				/**
-	 * The feature id for the '<em><b>Locale Config</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__LOCALE_CONFIG = 49;
-
-				/**
-	 * The feature id for the '<em><b>Managed Bean</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__MANAGED_BEAN = 50;
-
-				/**
-	 * The feature id for the '<em><b>Managed Bean Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__MANAGED_BEAN_CLASS = 51;
-
-				/**
-	 * The feature id for the '<em><b>Managed Bean Name</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__MANAGED_BEAN_NAME = 52;
-
-				/**
-	 * The feature id for the '<em><b>Managed Bean Scope</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__MANAGED_BEAN_SCOPE = 53;
-
-				/**
-	 * The feature id for the '<em><b>Managed Property</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__MANAGED_PROPERTY = 54;
-
-				/**
-	 * The feature id for the '<em><b>Map Entries</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__MAP_ENTRIES = 55;
-
-				/**
-	 * The feature id for the '<em><b>Map Entry</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__MAP_ENTRY = 56;
-
-				/**
-	 * The feature id for the '<em><b>Message Bundle</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__MESSAGE_BUNDLE = 57;
-
-				/**
-	 * The feature id for the '<em><b>Name</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__NAME = 58;
-
-				/**
-	 * The feature id for the '<em><b>Navigation Case</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__NAVIGATION_CASE = 59;
-
-				/**
-	 * The feature id for the '<em><b>Navigation Handler</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__NAVIGATION_HANDLER = 60;
-
-				/**
-	 * The feature id for the '<em><b>Navigation Rule</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__NAVIGATION_RULE = 61;
-
-				/**
-	 * The feature id for the '<em><b>Null Value</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__NULL_VALUE = 62;
-
-				/**
-	 * The feature id for the '<em><b>Ordering</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__ORDERING = 63;
-
-				/**
-	 * The feature id for the '<em><b>Ordering Ordering</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__ORDERING_ORDERING = 64;
-
-				/**
-	 * The feature id for the '<em><b>Others</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__OTHERS = 65;
-
-				/**
-	 * The feature id for the '<em><b>Partial View Context Factory</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__PARTIAL_VIEW_CONTEXT_FACTORY = 66;
-
-				/**
-	 * The feature id for the '<em><b>Phase Listener</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__PHASE_LISTENER = 67;
-
-				/**
-	 * The feature id for the '<em><b>Property</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__PROPERTY = 68;
-
-				/**
-	 * The feature id for the '<em><b>Property Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__PROPERTY_CLASS = 69;
-
-				/**
-	 * The feature id for the '<em><b>Property Extension</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__PROPERTY_EXTENSION = 70;
-
-				/**
-	 * The feature id for the '<em><b>Property Name</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__PROPERTY_NAME = 71;
-
-				/**
-	 * The feature id for the '<em><b>Property Resolver</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__PROPERTY_RESOLVER = 72;
-
-				/**
-	 * The feature id for the '<em><b>Redirect</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__REDIRECT = 73;
-
-				/**
-	 * The feature id for the '<em><b>Redirect View Param</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__REDIRECT_VIEW_PARAM = 74;
-
-				/**
-	 * The feature id for the '<em><b>Referenced Bean</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__REFERENCED_BEAN = 75;
-
-				/**
-	 * The feature id for the '<em><b>Referenced Bean Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__REFERENCED_BEAN_CLASS = 76;
-
-				/**
-	 * The feature id for the '<em><b>Referenced Bean Name</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__REFERENCED_BEAN_NAME = 77;
-
-				/**
-	 * The feature id for the '<em><b>Renderer</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__RENDERER = 78;
-
-				/**
-	 * The feature id for the '<em><b>Renderer Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__RENDERER_CLASS = 79;
-
-				/**
-	 * The feature id for the '<em><b>Renderer Extension</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__RENDERER_EXTENSION = 80;
-
-				/**
-	 * The feature id for the '<em><b>Renderer Type</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__RENDERER_TYPE = 81;
-
-				/**
-	 * The feature id for the '<em><b>Render Kit</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__RENDER_KIT = 82;
-
-				/**
-	 * The feature id for the '<em><b>Render Kit Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__RENDER_KIT_CLASS = 83;
-
-				/**
-	 * The feature id for the '<em><b>Render Kit Factory</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__RENDER_KIT_FACTORY = 84;
-
-				/**
-	 * The feature id for the '<em><b>Render Kit Id</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__RENDER_KIT_ID = 85;
-
-				/**
-	 * The feature id for the '<em><b>Resource Handler</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__RESOURCE_HANDLER = 86;
-
-				/**
-	 * The feature id for the '<em><b>Small Icon</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__SMALL_ICON = 87;
-
-				/**
-	 * The feature id for the '<em><b>Source Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__SOURCE_CLASS = 88;
-
-				/**
-	 * The feature id for the '<em><b>State Manager</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__STATE_MANAGER = 89;
-
-				/**
-	 * The feature id for the '<em><b>Suggested Value</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__SUGGESTED_VALUE = 90;
-
-				/**
-	 * The feature id for the '<em><b>Supported Locale</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__SUPPORTED_LOCALE = 91;
-
-				/**
-	 * The feature id for the '<em><b>System Event Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__SYSTEM_EVENT_CLASS = 92;
-
-				/**
-	 * The feature id for the '<em><b>System Event Listener</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__SYSTEM_EVENT_LISTENER = 93;
-
-				/**
-	 * The feature id for the '<em><b>System Event Listener Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__SYSTEM_EVENT_LISTENER_CLASS = 94;
-
-				/**
-	 * The feature id for the '<em><b>Tag Handler Delegate Factory</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__TAG_HANDLER_DELEGATE_FACTORY = 95;
-
-				/**
-	 * The feature id for the '<em><b>To View Id</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__TO_VIEW_ID = 96;
-
-				/**
-	 * The feature id for the '<em><b>Validator</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__VALIDATOR = 97;
-
-				/**
-	 * The feature id for the '<em><b>Validator Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__VALIDATOR_CLASS = 98;
-
-				/**
-	 * The feature id for the '<em><b>Validator Id</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__VALIDATOR_ID = 99;
-
-				/**
-	 * The feature id for the '<em><b>Value</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__VALUE = 100;
-
-				/**
-	 * The feature id for the '<em><b>Value Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__VALUE_CLASS = 101;
-
-				/**
-	 * The feature id for the '<em><b>Variable Resolver</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__VARIABLE_RESOLVER = 102;
-
-				/**
-	 * The feature id for the '<em><b>View Declaration Language Factory</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__VIEW_DECLARATION_LANGUAGE_FACTORY = 103;
-
-				/**
-	 * The feature id for the '<em><b>View Handler</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__VIEW_HANDLER = 104;
-
-				/**
-	 * The feature id for the '<em><b>Visit Context Factory</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__VISIT_CONTEXT_FACTORY = 105;
-
-				/**
-	 * The number of structural features of the '<em>Document Root</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT_FEATURE_COUNT = 106;
-
-				/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int DYNAMIC_ATTRIBUTE__NAME = 0;
-
-				/**
-	 * The feature id for the '<em><b>Value</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int DYNAMIC_ATTRIBUTE__VALUE = 1;
-
-				/**
-	 * The number of structural features of the '<em>Dynamic Attribute</em>' class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int DYNAMIC_ATTRIBUTE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Child Nodes</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int DYNAMIC_ELEMENT__CHILD_NODES = 0;
-
-				/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int DYNAMIC_ELEMENT__NAME = 1;
-
-				/**
-	 * The feature id for the '<em><b>Attributes</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int DYNAMIC_ELEMENT__ATTRIBUTES = 2;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int DYNAMIC_ELEMENT__TEXT_CONTENT = 3;
-
-				/**
-	 * The number of structural features of the '<em>Dynamic Element</em>' class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int DYNAMIC_ELEMENT_FEATURE_COUNT = 4;
-
-
-    /**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int EL_RESOLVER_TYPE__TEXT_CONTENT = 0;
-
-    /**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int EL_RESOLVER_TYPE__ID = 1;
-
-    /**
-	 * The number of structural features of the '<em>EL Resolver Type</em>' class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int EL_RESOLVER_TYPE_FEATURE_COUNT = 2;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ExceptionHandlerFactoryTypeImpl <em>Exception Handler Factory Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ExceptionHandlerFactoryTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getExceptionHandlerFactoryType()
-	 * @generated
-	 */
-	int EXCEPTION_HANDLER_FACTORY_TYPE = 36;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int EXCEPTION_HANDLER_FACTORY_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int EXCEPTION_HANDLER_FACTORY_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Exception Handler Factory Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int EXCEPTION_HANDLER_FACTORY_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ExternalContextFactoryTypeImpl <em>External Context Factory Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ExternalContextFactoryTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getExternalContextFactoryType()
-	 * @generated
-	 */
-	int EXTERNAL_CONTEXT_FACTORY_TYPE = 38;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int EXTERNAL_CONTEXT_FACTORY_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int EXTERNAL_CONTEXT_FACTORY_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>External Context Factory Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int EXTERNAL_CONTEXT_FACTORY_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Application</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FACES_CONFIG_TYPE__APPLICATION = 0;
-
-				/**
-	 * The feature id for the '<em><b>Ordering</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FACES_CONFIG_TYPE__ORDERING = 1;
-
-				/**
-	 * The feature id for the '<em><b>Absolute Ordering</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FACES_CONFIG_TYPE__ABSOLUTE_ORDERING = 2;
-
-				/**
-	 * The feature id for the '<em><b>Factory</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FACES_CONFIG_TYPE__FACTORY = 3;
-
-				/**
-	 * The feature id for the '<em><b>Component</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FACES_CONFIG_TYPE__COMPONENT = 4;
-
-				/**
-	 * The feature id for the '<em><b>Converter</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FACES_CONFIG_TYPE__CONVERTER = 5;
-
-				/**
-	 * The feature id for the '<em><b>Managed Bean</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FACES_CONFIG_TYPE__MANAGED_BEAN = 6;
-
-				/**
-	 * The feature id for the '<em><b>Name</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FACES_CONFIG_TYPE__NAME = 7;
-
-				/**
-	 * The feature id for the '<em><b>Navigation Rule</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FACES_CONFIG_TYPE__NAVIGATION_RULE = 8;
-
-				/**
-	 * The feature id for the '<em><b>Referenced Bean</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FACES_CONFIG_TYPE__REFERENCED_BEAN = 9;
-
-				/**
-	 * The feature id for the '<em><b>Render Kit</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FACES_CONFIG_TYPE__RENDER_KIT = 10;
-
-				/**
-	 * The feature id for the '<em><b>Lifecycle</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FACES_CONFIG_TYPE__LIFECYCLE = 11;
-
-				/**
-	 * The feature id for the '<em><b>Validator</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FACES_CONFIG_TYPE__VALIDATOR = 12;
-
-				/**
-	 * The feature id for the '<em><b>Behavior</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FACES_CONFIG_TYPE__BEHAVIOR = 13;
-
-				/**
-	 * The feature id for the '<em><b>Faces Config Extension</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int FACES_CONFIG_TYPE__FACES_CONFIG_EXTENSION = 14;
-
-				/**
-	 * The feature id for the '<em><b>Xmlns</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FACES_CONFIG_TYPE__XMLNS = 15;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FACES_CONFIG_TYPE__ID = 16;
-
-				/**
-	 * The feature id for the '<em><b>Metadata Complete</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FACES_CONFIG_TYPE__METADATA_COMPLETE = 17;
-
-				/**
-	 * The number of structural features of the '<em>Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FACES_CONFIG_TYPE_FEATURE_COUNT = 18;
-
-				/**
-	 * The feature id for the '<em><b>Child Nodes</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int FACES_CONFIG_EXTENSION_TYPE__CHILD_NODES = EXTENSION_TYPE__CHILD_NODES;
-
-    /**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int FACES_CONFIG_EXTENSION_TYPE__TEXT_CONTENT = EXTENSION_TYPE__TEXT_CONTENT;
-
-    /**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int FACES_CONFIG_EXTENSION_TYPE__ID = EXTENSION_TYPE__ID;
-
-    /**
-	 * The number of structural features of the '<em>Extension Type</em>' class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int FACES_CONFIG_EXTENSION_TYPE_FEATURE_COUNT = EXTENSION_TYPE_FEATURE_COUNT + 0;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FACES_CONTEXT_FACTORY_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FACES_CONTEXT_FACTORY_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Faces Context Factory Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FACES_CONTEXT_FACTORY_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Child Nodes</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int FACET_EXTENSION_TYPE__CHILD_NODES = EXTENSION_TYPE__CHILD_NODES;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int FACET_EXTENSION_TYPE__TEXT_CONTENT = EXTENSION_TYPE__TEXT_CONTENT;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FACET_EXTENSION_TYPE__ID = EXTENSION_TYPE__ID;
-
-				/**
-	 * The number of structural features of the '<em>Facet Extension Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FACET_EXTENSION_TYPE_FEATURE_COUNT = EXTENSION_TYPE_FEATURE_COUNT + 0;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FACET_NAME_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FACET_NAME_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Facet Name Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FACET_NAME_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Description</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FACET_TYPE__DESCRIPTION = 0;
-
-				/**
-	 * The feature id for the '<em><b>Display Name</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FACET_TYPE__DISPLAY_NAME = 1;
-
-				/**
-	 * The feature id for the '<em><b>Icon</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FACET_TYPE__ICON = 2;
-
-				/**
-	 * The feature id for the '<em><b>Facet Name</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FACET_TYPE__FACET_NAME = 3;
-
-				/**
-	 * The feature id for the '<em><b>Facet Extension</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FACET_TYPE__FACET_EXTENSION = 4;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FACET_TYPE__ID = 5;
-
-				/**
-	 * The number of structural features of the '<em>Facet Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FACET_TYPE_FEATURE_COUNT = 6;
-
-				/**
-	 * The feature id for the '<em><b>Application Factory</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FACTORY_TYPE__APPLICATION_FACTORY = 0;
-
-				/**
-	 * The feature id for the '<em><b>Exception Handler Factory</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FACTORY_TYPE__EXCEPTION_HANDLER_FACTORY = 1;
-
-				/**
-	 * The feature id for the '<em><b>External Context Factory</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FACTORY_TYPE__EXTERNAL_CONTEXT_FACTORY = 2;
-
-				/**
-	 * The feature id for the '<em><b>Faces Context Factory</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FACTORY_TYPE__FACES_CONTEXT_FACTORY = 3;
-
-				/**
-	 * The feature id for the '<em><b>Partial View Context Factory</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FACTORY_TYPE__PARTIAL_VIEW_CONTEXT_FACTORY = 4;
-
-				/**
-	 * The feature id for the '<em><b>Lifecycle Factory</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FACTORY_TYPE__LIFECYCLE_FACTORY = 5;
-
-				/**
-	 * The feature id for the '<em><b>View Declaration Language Factory</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FACTORY_TYPE__VIEW_DECLARATION_LANGUAGE_FACTORY = 6;
-
-				/**
-	 * The feature id for the '<em><b>Tag Handler Delegate Factory</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FACTORY_TYPE__TAG_HANDLER_DELEGATE_FACTORY = 7;
-
-				/**
-	 * The feature id for the '<em><b>Render Kit Factory</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FACTORY_TYPE__RENDER_KIT_FACTORY = 8;
-
-				/**
-	 * The feature id for the '<em><b>Visit Context Factory</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FACTORY_TYPE__VISIT_CONTEXT_FACTORY = 9;
-
-				/**
-	 * The feature id for the '<em><b>Factory Extension</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int FACTORY_TYPE__FACTORY_EXTENSION = 10;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FACTORY_TYPE__ID = 11;
-
-				/**
-	 * The number of structural features of the '<em>Factory Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FACTORY_TYPE_FEATURE_COUNT = 12;
-
-
-    /**
-	 * The feature id for the '<em><b>Child Nodes</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int FACTORY_EXTENSION_TYPE__CHILD_NODES = EXTENSION_TYPE__CHILD_NODES;
-
-    /**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int FACTORY_EXTENSION_TYPE__TEXT_CONTENT = EXTENSION_TYPE__TEXT_CONTENT;
-
-    /**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int FACTORY_EXTENSION_TYPE__ID = EXTENSION_TYPE__ID;
-
-    /**
-	 * The number of structural features of the '<em>Factory Extension Type</em>' class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int FACTORY_EXTENSION_TYPE_FEATURE_COUNT = EXTENSION_TYPE_FEATURE_COUNT + 0;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FROM_ACTION_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FROM_ACTION_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>From Action Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FROM_ACTION_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FROM_OUTCOME_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FROM_OUTCOME_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>From Outcome Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FROM_OUTCOME_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FROM_VIEW_ID_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FROM_VIEW_ID_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>From View Id Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FROM_VIEW_ID_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Small Icon</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ICON_TYPE__SMALL_ICON = 0;
-
-				/**
-	 * The feature id for the '<em><b>Large Icon</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ICON_TYPE__LARGE_ICON = 1;
-
-				/**
-	 * The feature id for the '<em><b>Lang</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ICON_TYPE__LANG = 2;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ICON_TYPE__ID = 3;
-
-				/**
-	 * The number of structural features of the '<em>Icon Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ICON_TYPE_FEATURE_COUNT = 4;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int IF_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int IF_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>If Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int IF_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int KEY_CLASS_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int KEY_CLASS_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Key Class Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int KEY_CLASS_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int KEY_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int KEY_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Key Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int KEY_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int LARGE_ICON_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int LARGE_ICON_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Large Icon Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int LARGE_ICON_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int LIFECYCLE_FACTORY_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int LIFECYCLE_FACTORY_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Lifecycle Factory Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int LIFECYCLE_FACTORY_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Phase Listener</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int LIFECYCLE_TYPE__PHASE_LISTENER = 0;
-
-				/**
-	 * The feature id for the '<em><b>Lifecycle Extension</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int LIFECYCLE_TYPE__LIFECYCLE_EXTENSION = 1;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int LIFECYCLE_TYPE__ID = 2;
-
-				/**
-	 * The number of structural features of the '<em>Lifecycle Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int LIFECYCLE_TYPE_FEATURE_COUNT = 3;
-
-
-    /**
-	 * The feature id for the '<em><b>Child Nodes</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int LIFECYCLE_EXTENSION_TYPE__CHILD_NODES = EXTENSION_TYPE__CHILD_NODES;
-
-    /**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int LIFECYCLE_EXTENSION_TYPE__TEXT_CONTENT = EXTENSION_TYPE__TEXT_CONTENT;
-
-    /**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int LIFECYCLE_EXTENSION_TYPE__ID = EXTENSION_TYPE__ID;
-
-    /**
-	 * The number of structural features of the '<em>Lifecycle Extension Type</em>' class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int LIFECYCLE_EXTENSION_TYPE_FEATURE_COUNT = EXTENSION_TYPE_FEATURE_COUNT + 0;
-
-				/**
-	 * The feature id for the '<em><b>Value Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int LIST_ENTRIES_TYPE__VALUE_CLASS = 0;
-
-				/**
-	 * The feature id for the '<em><b>Null Value</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int LIST_ENTRIES_TYPE__NULL_VALUE = 1;
-
-				/**
-	 * The feature id for the '<em><b>Value</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int LIST_ENTRIES_TYPE__VALUE = 2;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int LIST_ENTRIES_TYPE__ID = 3;
-
-				/**
-	 * The number of structural features of the '<em>List Entries Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int LIST_ENTRIES_TYPE_FEATURE_COUNT = 4;
-
-				/**
-	 * The feature id for the '<em><b>Default Locale</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int LOCALE_CONFIG_TYPE__DEFAULT_LOCALE = 0;
-
-				/**
-	 * The feature id for the '<em><b>Supported Locale</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int LOCALE_CONFIG_TYPE__SUPPORTED_LOCALE = 1;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int LOCALE_CONFIG_TYPE__ID = 2;
-
-				/**
-	 * The number of structural features of the '<em>Locale Config Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int LOCALE_CONFIG_TYPE_FEATURE_COUNT = 3;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MANAGED_BEAN_CLASS_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MANAGED_BEAN_CLASS_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Managed Bean Class Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MANAGED_BEAN_CLASS_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MANAGED_BEAN_NAME_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MANAGED_BEAN_NAME_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Managed Bean Name Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MANAGED_BEAN_NAME_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MANAGED_BEAN_SCOPE_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MANAGED_BEAN_SCOPE_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Managed Bean Scope Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MANAGED_BEAN_SCOPE_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Description</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MANAGED_BEAN_TYPE__DESCRIPTION = 0;
-
-				/**
-	 * The feature id for the '<em><b>Display Name</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MANAGED_BEAN_TYPE__DISPLAY_NAME = 1;
-
-				/**
-	 * The feature id for the '<em><b>Icon</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MANAGED_BEAN_TYPE__ICON = 2;
-
-				/**
-	 * The feature id for the '<em><b>Managed Bean Name</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MANAGED_BEAN_TYPE__MANAGED_BEAN_NAME = 3;
-
-				/**
-	 * The feature id for the '<em><b>Managed Bean Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MANAGED_BEAN_TYPE__MANAGED_BEAN_CLASS = 4;
-
-				/**
-	 * The feature id for the '<em><b>Managed Bean Scope</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MANAGED_BEAN_TYPE__MANAGED_BEAN_SCOPE = 5;
-
-				/**
-	 * The feature id for the '<em><b>Managed Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MANAGED_BEAN_TYPE__MANAGED_PROPERTY = 6;
-
-				/**
-	 * The feature id for the '<em><b>Map Entries</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MANAGED_BEAN_TYPE__MAP_ENTRIES = 7;
-
-				/**
-	 * The feature id for the '<em><b>List Entries</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MANAGED_BEAN_TYPE__LIST_ENTRIES = 8;
-
-				/**
-	 * The feature id for the '<em><b>Managed Bean Extension</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int MANAGED_BEAN_TYPE__MANAGED_BEAN_EXTENSION = 9;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MANAGED_BEAN_TYPE__ID = 10;
-
-				/**
-	 * The feature id for the '<em><b>Eager</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MANAGED_BEAN_TYPE__EAGER = 11;
-
-				/**
-	 * The number of structural features of the '<em>Managed Bean Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MANAGED_BEAN_TYPE_FEATURE_COUNT = 12;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanExtensionTypeImpl <em>Managed Bean Extension Type</em>}' class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanExtensionTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getManagedBeanExtensionType()
-	 * @generated
-	 */
-    int MANAGED_BEAN_EXTENSION_TYPE = 64;
-
-    /**
-	 * The feature id for the '<em><b>Child Nodes</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int MANAGED_BEAN_EXTENSION_TYPE__CHILD_NODES = EXTENSION_TYPE__CHILD_NODES;
-
-    /**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int MANAGED_BEAN_EXTENSION_TYPE__TEXT_CONTENT = EXTENSION_TYPE__TEXT_CONTENT;
-
-    /**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int MANAGED_BEAN_EXTENSION_TYPE__ID = EXTENSION_TYPE__ID;
-
-    /**
-	 * The number of structural features of the '<em>Managed Bean Extension Type</em>' class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int MANAGED_BEAN_EXTENSION_TYPE_FEATURE_COUNT = EXTENSION_TYPE_FEATURE_COUNT + 0;
-
-				/**
-	 * The feature id for the '<em><b>Description</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MANAGED_PROPERTY_TYPE__DESCRIPTION = 0;
-
-				/**
-	 * The feature id for the '<em><b>Display Name</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MANAGED_PROPERTY_TYPE__DISPLAY_NAME = 1;
-
-				/**
-	 * The feature id for the '<em><b>Icon</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MANAGED_PROPERTY_TYPE__ICON = 2;
-
-				/**
-	 * The feature id for the '<em><b>Property Name</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MANAGED_PROPERTY_TYPE__PROPERTY_NAME = 3;
-
-				/**
-	 * The feature id for the '<em><b>Property Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MANAGED_PROPERTY_TYPE__PROPERTY_CLASS = 4;
-
-				/**
-	 * The feature id for the '<em><b>Map Entries</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MANAGED_PROPERTY_TYPE__MAP_ENTRIES = 5;
-
-				/**
-	 * The feature id for the '<em><b>Null Value</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MANAGED_PROPERTY_TYPE__NULL_VALUE = 6;
-
-				/**
-	 * The feature id for the '<em><b>Value</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MANAGED_PROPERTY_TYPE__VALUE = 7;
-
-				/**
-	 * The feature id for the '<em><b>List Entries</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MANAGED_PROPERTY_TYPE__LIST_ENTRIES = 8;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MANAGED_PROPERTY_TYPE__ID = 9;
-
-				/**
-	 * The number of structural features of the '<em>Managed Property Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MANAGED_PROPERTY_TYPE_FEATURE_COUNT = 10;
-
-				/**
-	 * The feature id for the '<em><b>Key Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MAP_ENTRIES_TYPE__KEY_CLASS = 0;
-
-				/**
-	 * The feature id for the '<em><b>Value Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MAP_ENTRIES_TYPE__VALUE_CLASS = 1;
-
-				/**
-	 * The feature id for the '<em><b>Map Entry</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MAP_ENTRIES_TYPE__MAP_ENTRY = 2;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MAP_ENTRIES_TYPE__ID = 3;
-
-				/**
-	 * The number of structural features of the '<em>Map Entries Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MAP_ENTRIES_TYPE_FEATURE_COUNT = 4;
-
-				/**
-	 * The feature id for the '<em><b>Key</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MAP_ENTRY_TYPE__KEY = 0;
-
-				/**
-	 * The feature id for the '<em><b>Null Value</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MAP_ENTRY_TYPE__NULL_VALUE = 1;
-
-				/**
-	 * The feature id for the '<em><b>Value</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MAP_ENTRY_TYPE__VALUE = 2;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MAP_ENTRY_TYPE__ID = 3;
-
-				/**
-	 * The number of structural features of the '<em>Map Entry Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MAP_ENTRY_TYPE_FEATURE_COUNT = 4;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MESSAGE_BUNDLE_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MESSAGE_BUNDLE_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Message Bundle Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MESSAGE_BUNDLE_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int NAME_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int NAME_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Name Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int NAME_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Description</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int NAVIGATION_CASE_TYPE__DESCRIPTION = 0;
-
-				/**
-	 * The feature id for the '<em><b>Display Name</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int NAVIGATION_CASE_TYPE__DISPLAY_NAME = 1;
-
-				/**
-	 * The feature id for the '<em><b>Icon</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int NAVIGATION_CASE_TYPE__ICON = 2;
-
-				/**
-	 * The feature id for the '<em><b>From Action</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int NAVIGATION_CASE_TYPE__FROM_ACTION = 3;
-
-				/**
-	 * The feature id for the '<em><b>From Outcome</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int NAVIGATION_CASE_TYPE__FROM_OUTCOME = 4;
-
-				/**
-	 * The feature id for the '<em><b>If</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int NAVIGATION_CASE_TYPE__IF = 5;
-
-				/**
-	 * The feature id for the '<em><b>To View Id</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int NAVIGATION_CASE_TYPE__TO_VIEW_ID = 6;
-
-				/**
-	 * The feature id for the '<em><b>Redirect</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int NAVIGATION_CASE_TYPE__REDIRECT = 7;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int NAVIGATION_CASE_TYPE__ID = 8;
-
-				/**
-	 * The number of structural features of the '<em>Navigation Case Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int NAVIGATION_CASE_TYPE_FEATURE_COUNT = 9;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int NAVIGATION_HANDLER_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int NAVIGATION_HANDLER_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Navigation Handler Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int NAVIGATION_HANDLER_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Description</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int NAVIGATION_RULE_TYPE__DESCRIPTION = 0;
-
-				/**
-	 * The feature id for the '<em><b>Display Name</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int NAVIGATION_RULE_TYPE__DISPLAY_NAME = 1;
-
-				/**
-	 * The feature id for the '<em><b>Icon</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int NAVIGATION_RULE_TYPE__ICON = 2;
-
-				/**
-	 * The feature id for the '<em><b>From View Id</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int NAVIGATION_RULE_TYPE__FROM_VIEW_ID = 3;
-
-				/**
-	 * The feature id for the '<em><b>Navigation Case</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int NAVIGATION_RULE_TYPE__NAVIGATION_CASE = 4;
-
-				/**
-	 * The feature id for the '<em><b>Navigation Rule Extension</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int NAVIGATION_RULE_TYPE__NAVIGATION_RULE_EXTENSION = 5;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int NAVIGATION_RULE_TYPE__ID = 6;
-
-				/**
-	 * The number of structural features of the '<em>Navigation Rule Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int NAVIGATION_RULE_TYPE_FEATURE_COUNT = 7;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationRuleExtensionTypeImpl <em>Navigation Rule Extension Type</em>}' class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationRuleExtensionTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getNavigationRuleExtensionType()
-	 * @generated
-	 */
-    int NAVIGATION_RULE_EXTENSION_TYPE = 73;
-
-    /**
-	 * The feature id for the '<em><b>Child Nodes</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int NAVIGATION_RULE_EXTENSION_TYPE__CHILD_NODES = EXTENSION_TYPE__CHILD_NODES;
-
-    /**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int NAVIGATION_RULE_EXTENSION_TYPE__TEXT_CONTENT = EXTENSION_TYPE__TEXT_CONTENT;
-
-    /**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int NAVIGATION_RULE_EXTENSION_TYPE__ID = EXTENSION_TYPE__ID;
-
-    /**
-	 * The number of structural features of the '<em>Navigation Rule Extension Type</em>' class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int NAVIGATION_RULE_EXTENSION_TYPE_FEATURE_COUNT = EXTENSION_TYPE_FEATURE_COUNT + 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int NULL_VALUE_TYPE__ID = 0;
-
-				/**
-	 * The number of structural features of the '<em>Null Value Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int NULL_VALUE_TYPE_FEATURE_COUNT = 1;
-
-				/**
-	 * The feature id for the '<em><b>Before</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ORDERING_TYPE__BEFORE = 0;
-
-				/**
-	 * The feature id for the '<em><b>After</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ORDERING_TYPE__AFTER = 1;
-
-				/**
-	 * The number of structural features of the '<em>Ordering Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ORDERING_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Name</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ORDERING_ORDERING_TYPE__NAME = 0;
-
-				/**
-	 * The feature id for the '<em><b>Others</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ORDERING_ORDERING_TYPE__OTHERS = 1;
-
-				/**
-	 * The number of structural features of the '<em>Ordering Ordering Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ORDERING_ORDERING_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ORDERING_OTHERS_TYPE__ID = 0;
-
-				/**
-	 * The number of structural features of the '<em>Ordering Others Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ORDERING_OTHERS_TYPE_FEATURE_COUNT = 1;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PARTIAL_VIEW_CONTEXT_FACTORY_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PARTIAL_VIEW_CONTEXT_FACTORY_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Partial View Context Factory Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PARTIAL_VIEW_CONTEXT_FACTORY_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PHASE_LISTENER_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PHASE_LISTENER_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Phase Listener Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PHASE_LISTENER_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROPERTY_CLASS_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROPERTY_CLASS_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Property Class Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROPERTY_CLASS_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Child Nodes</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int PROPERTY_EXTENSION_TYPE__CHILD_NODES = EXTENSION_TYPE__CHILD_NODES;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int PROPERTY_EXTENSION_TYPE__TEXT_CONTENT = EXTENSION_TYPE__TEXT_CONTENT;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROPERTY_EXTENSION_TYPE__ID = EXTENSION_TYPE__ID;
-
-				/**
-	 * The number of structural features of the '<em>Property Extension Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROPERTY_EXTENSION_TYPE_FEATURE_COUNT = EXTENSION_TYPE_FEATURE_COUNT + 0;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROPERTY_NAME_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROPERTY_NAME_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Property Name Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROPERTY_NAME_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROPERTY_RESOLVER_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROPERTY_RESOLVER_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Property Resolver Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROPERTY_RESOLVER_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Description</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROPERTY_TYPE__DESCRIPTION = 0;
-
-				/**
-	 * The feature id for the '<em><b>Display Name</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROPERTY_TYPE__DISPLAY_NAME = 1;
-
-				/**
-	 * The feature id for the '<em><b>Icon</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROPERTY_TYPE__ICON = 2;
-
-				/**
-	 * The feature id for the '<em><b>Property Name</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROPERTY_TYPE__PROPERTY_NAME = 3;
-
-				/**
-	 * The feature id for the '<em><b>Property Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROPERTY_TYPE__PROPERTY_CLASS = 4;
-
-				/**
-	 * The feature id for the '<em><b>Default Value</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROPERTY_TYPE__DEFAULT_VALUE = 5;
-
-				/**
-	 * The feature id for the '<em><b>Suggested Value</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROPERTY_TYPE__SUGGESTED_VALUE = 6;
-
-				/**
-	 * The feature id for the '<em><b>Property Extension</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROPERTY_TYPE__PROPERTY_EXTENSION = 7;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROPERTY_TYPE__ID = 8;
-
-				/**
-	 * The number of structural features of the '<em>Property Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROPERTY_TYPE_FEATURE_COUNT = 9;
-
-				/**
-	 * The feature id for the '<em><b>View Param</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REDIRECT_TYPE__VIEW_PARAM = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REDIRECT_TYPE__ID = 1;
-
-				/**
-	 * The feature id for the '<em><b>Include View Params</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REDIRECT_TYPE__INCLUDE_VIEW_PARAMS = 2;
-
-				/**
-	 * The number of structural features of the '<em>Redirect Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REDIRECT_TYPE_FEATURE_COUNT = 3;
-
-				/**
-	 * The feature id for the '<em><b>Name</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REDIRECT_VIEW_PARAM_TYPE__NAME = 0;
-
-				/**
-	 * The feature id for the '<em><b>Value</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REDIRECT_VIEW_PARAM_TYPE__VALUE = 1;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REDIRECT_VIEW_PARAM_TYPE__ID = 2;
-
-				/**
-	 * The number of structural features of the '<em>Redirect View Param Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REDIRECT_VIEW_PARAM_TYPE_FEATURE_COUNT = 3;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REFERENCED_BEAN_CLASS_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REFERENCED_BEAN_CLASS_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Referenced Bean Class Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REFERENCED_BEAN_CLASS_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REFERENCED_BEAN_NAME_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REFERENCED_BEAN_NAME_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Referenced Bean Name Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REFERENCED_BEAN_NAME_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Description</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REFERENCED_BEAN_TYPE__DESCRIPTION = 0;
-
-				/**
-	 * The feature id for the '<em><b>Display Name</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REFERENCED_BEAN_TYPE__DISPLAY_NAME = 1;
-
-				/**
-	 * The feature id for the '<em><b>Icon</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REFERENCED_BEAN_TYPE__ICON = 2;
-
-				/**
-	 * The feature id for the '<em><b>Referenced Bean Name</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REFERENCED_BEAN_TYPE__REFERENCED_BEAN_NAME = 3;
-
-				/**
-	 * The feature id for the '<em><b>Referenced Bean Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REFERENCED_BEAN_TYPE__REFERENCED_BEAN_CLASS = 4;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REFERENCED_BEAN_TYPE__ID = 5;
-
-				/**
-	 * The number of structural features of the '<em>Referenced Bean Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REFERENCED_BEAN_TYPE_FEATURE_COUNT = 6;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RENDERER_CLASS_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RENDERER_CLASS_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Renderer Class Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RENDERER_CLASS_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Child Nodes</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int RENDERER_EXTENSION_TYPE__CHILD_NODES = EXTENSION_TYPE__CHILD_NODES;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int RENDERER_EXTENSION_TYPE__TEXT_CONTENT = EXTENSION_TYPE__TEXT_CONTENT;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RENDERER_EXTENSION_TYPE__ID = EXTENSION_TYPE__ID;
-
-				/**
-	 * The number of structural features of the '<em>Renderer Extension Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RENDERER_EXTENSION_TYPE_FEATURE_COUNT = EXTENSION_TYPE_FEATURE_COUNT + 0;
-
-				/**
-	 * The feature id for the '<em><b>Description</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RENDERER_TYPE__DESCRIPTION = 0;
-
-				/**
-	 * The feature id for the '<em><b>Display Name</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RENDERER_TYPE__DISPLAY_NAME = 1;
-
-				/**
-	 * The feature id for the '<em><b>Icon</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RENDERER_TYPE__ICON = 2;
-
-				/**
-	 * The feature id for the '<em><b>Component Family</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RENDERER_TYPE__COMPONENT_FAMILY = 3;
-
-				/**
-	 * The feature id for the '<em><b>Renderer Type</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RENDERER_TYPE__RENDERER_TYPE = 4;
-
-				/**
-	 * The feature id for the '<em><b>Renderer Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RENDERER_TYPE__RENDERER_CLASS = 5;
-
-				/**
-	 * The feature id for the '<em><b>Facet</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RENDERER_TYPE__FACET = 6;
-
-				/**
-	 * The feature id for the '<em><b>Attribute</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RENDERER_TYPE__ATTRIBUTE = 7;
-
-				/**
-	 * The feature id for the '<em><b>Renderer Extension</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RENDERER_TYPE__RENDERER_EXTENSION = 8;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RENDERER_TYPE__ID = 9;
-
-				/**
-	 * The number of structural features of the '<em>Renderer Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RENDERER_TYPE_FEATURE_COUNT = 10;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RENDERER_TYPE_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RENDERER_TYPE_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Renderer Type Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RENDERER_TYPE_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RENDER_KIT_CLASS_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RENDER_KIT_CLASS_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Render Kit Class Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RENDER_KIT_CLASS_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RENDER_KIT_FACTORY_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RENDER_KIT_FACTORY_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Render Kit Factory Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RENDER_KIT_FACTORY_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RENDER_KIT_ID_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RENDER_KIT_ID_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Render Kit Id Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RENDER_KIT_ID_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Description</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RENDER_KIT_TYPE__DESCRIPTION = 0;
-
-				/**
-	 * The feature id for the '<em><b>Display Name</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RENDER_KIT_TYPE__DISPLAY_NAME = 1;
-
-				/**
-	 * The feature id for the '<em><b>Icon</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RENDER_KIT_TYPE__ICON = 2;
-
-				/**
-	 * The feature id for the '<em><b>Render Kit Id</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RENDER_KIT_TYPE__RENDER_KIT_ID = 3;
-
-				/**
-	 * The feature id for the '<em><b>Render Kit Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RENDER_KIT_TYPE__RENDER_KIT_CLASS = 4;
-
-				/**
-	 * The feature id for the '<em><b>Renderer</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RENDER_KIT_TYPE__RENDERER = 5;
-
-				/**
-	 * The feature id for the '<em><b>Client Behavior Renderer</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RENDER_KIT_TYPE__CLIENT_BEHAVIOR_RENDERER = 6;
-
-				/**
-	 * The feature id for the '<em><b>Render Kit Extension</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int RENDER_KIT_TYPE__RENDER_KIT_EXTENSION = 7;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RENDER_KIT_TYPE__ID = 8;
-
-				/**
-	 * The number of structural features of the '<em>Render Kit Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RENDER_KIT_TYPE_FEATURE_COUNT = 9;
-
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ValidatorExtensionTypeImpl <em>Validator Extension Type</em>}' class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ValidatorExtensionTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getValidatorExtensionType()
-	 * @generated
-	 */
-    int VALIDATOR_EXTENSION_TYPE = 113;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ViewDeclarationLanguageFactoryTypeImpl <em>View Declaration Language Factory Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ViewDeclarationLanguageFactoryTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getViewDeclarationLanguageFactoryType()
-	 * @generated
-	 */
-	int VIEW_DECLARATION_LANGUAGE_FACTORY_TYPE = 121;
-
-				/**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.VisitContextFactoryTypeImpl <em>Visit Context Factory Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.VisitContextFactoryTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getVisitContextFactoryType()
-	 * @generated
-	 */
-	int VISIT_CONTEXT_FACTORY_TYPE = 122;
-
-
-				/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.AbsoluteOrderingType <em>Absolute Ordering Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Absolute Ordering Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.AbsoluteOrderingType
-	 * @generated
-	 */
-	EClass getAbsoluteOrderingType();
-
-				/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.AbsoluteOrderingType#getName <em>Name</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Name</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.AbsoluteOrderingType#getName()
-	 * @see #getAbsoluteOrderingType()
-	 * @generated
-	 */
-	EReference getAbsoluteOrderingType_Name();
-
-				/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.AbsoluteOrderingType#getOthers <em>Others</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Others</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.AbsoluteOrderingType#getOthers()
-	 * @see #getAbsoluteOrderingType()
-	 * @generated
-	 */
-	EReference getAbsoluteOrderingType_Others();
-
-				/**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitExtensionTypeImpl <em>Render Kit Extension Type</em>}' class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitExtensionTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getRenderKitExtensionType()
-	 * @generated
-	 */
-    int RENDER_KIT_EXTENSION_TYPE = 98;
-
-    /**
-	 * The feature id for the '<em><b>Child Nodes</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int RENDER_KIT_EXTENSION_TYPE__CHILD_NODES = EXTENSION_TYPE__CHILD_NODES;
-
-    /**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int RENDER_KIT_EXTENSION_TYPE__TEXT_CONTENT = EXTENSION_TYPE__TEXT_CONTENT;
-
-    /**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int RENDER_KIT_EXTENSION_TYPE__ID = EXTENSION_TYPE__ID;
-
-    /**
-	 * The number of structural features of the '<em>Render Kit Extension Type</em>' class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int RENDER_KIT_EXTENSION_TYPE_FEATURE_COUNT = EXTENSION_TYPE_FEATURE_COUNT + 0;
-
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ResourceHandlerTypeImpl <em>Resource Handler Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ResourceHandlerTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getResourceHandlerType()
-	 * @generated
-	 */
-	int RESOURCE_HANDLER_TYPE = 99;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RESOURCE_HANDLER_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RESOURCE_HANDLER_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Resource Handler Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RESOURCE_HANDLER_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SMALL_ICON_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SMALL_ICON_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Small Icon Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SMALL_ICON_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SOURCE_CLASS_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SOURCE_CLASS_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Source Class Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SOURCE_CLASS_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int STATE_MANAGER_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int STATE_MANAGER_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>State Manager Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int STATE_MANAGER_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SUGGESTED_VALUE_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SUGGESTED_VALUE_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Suggested Value Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SUGGESTED_VALUE_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SUPPORTED_LOCALE_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SUPPORTED_LOCALE_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Supported Locale Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SUPPORTED_LOCALE_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SYSTEM_EVENT_CLASS_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SYSTEM_EVENT_CLASS_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>System Event Class Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SYSTEM_EVENT_CLASS_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SYSTEM_EVENT_LISTENER_CLASS_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SYSTEM_EVENT_LISTENER_CLASS_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>System Event Listener Class Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SYSTEM_EVENT_LISTENER_CLASS_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>System Event Listener Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SYSTEM_EVENT_LISTENER_TYPE__SYSTEM_EVENT_LISTENER_CLASS = 0;
-
-				/**
-	 * The feature id for the '<em><b>System Event Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SYSTEM_EVENT_LISTENER_TYPE__SYSTEM_EVENT_CLASS = 1;
-
-				/**
-	 * The feature id for the '<em><b>Source Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SYSTEM_EVENT_LISTENER_TYPE__SOURCE_CLASS = 2;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SYSTEM_EVENT_LISTENER_TYPE__ID = 3;
-
-				/**
-	 * The number of structural features of the '<em>System Event Listener Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SYSTEM_EVENT_LISTENER_TYPE_FEATURE_COUNT = 4;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TAG_HANDLER_DELEGATE_FACTORY_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TAG_HANDLER_DELEGATE_FACTORY_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Tag Handler Delegate Factory Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TAG_HANDLER_DELEGATE_FACTORY_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TO_VIEW_ID_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TO_VIEW_ID_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>To View Id Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TO_VIEW_ID_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int VALIDATOR_CLASS_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int VALIDATOR_CLASS_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Validator Class Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int VALIDATOR_CLASS_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int VALIDATOR_ID_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int VALIDATOR_ID_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Validator Id Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int VALIDATOR_ID_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Description</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int VALIDATOR_TYPE__DESCRIPTION = 0;
-
-				/**
-	 * The feature id for the '<em><b>Display Name</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int VALIDATOR_TYPE__DISPLAY_NAME = 1;
-
-				/**
-	 * The feature id for the '<em><b>Icon</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int VALIDATOR_TYPE__ICON = 2;
-
-				/**
-	 * The feature id for the '<em><b>Validator Id</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int VALIDATOR_TYPE__VALIDATOR_ID = 3;
-
-				/**
-	 * The feature id for the '<em><b>Validator Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int VALIDATOR_TYPE__VALIDATOR_CLASS = 4;
-
-				/**
-	 * The feature id for the '<em><b>Attribute</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int VALIDATOR_TYPE__ATTRIBUTE = 5;
-
-				/**
-	 * The feature id for the '<em><b>Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int VALIDATOR_TYPE__PROPERTY = 6;
-
-				/**
-	 * The feature id for the '<em><b>Validator Extension</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int VALIDATOR_TYPE__VALIDATOR_EXTENSION = 7;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int VALIDATOR_TYPE__ID = 8;
-
-				/**
-	 * The number of structural features of the '<em>Validator Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int VALIDATOR_TYPE_FEATURE_COUNT = 9;
-
-				/**
-	 * The feature id for the '<em><b>Child Nodes</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int VALIDATOR_EXTENSION_TYPE__CHILD_NODES = EXTENSION_TYPE__CHILD_NODES;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int VALIDATOR_EXTENSION_TYPE__TEXT_CONTENT = EXTENSION_TYPE__TEXT_CONTENT;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int VALIDATOR_EXTENSION_TYPE__ID = EXTENSION_TYPE__ID;
-
-				/**
-	 * The number of structural features of the '<em>Validator Extension Type</em>' class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int VALIDATOR_EXTENSION_TYPE_FEATURE_COUNT = EXTENSION_TYPE_FEATURE_COUNT + 0;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int VALUE_CLASS_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int VALUE_CLASS_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Value Class Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int VALUE_CLASS_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int VALUE_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int VALUE_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Value Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int VALUE_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int VARIABLE_RESOLVER_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int VARIABLE_RESOLVER_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Variable Resolver Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int VARIABLE_RESOLVER_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int VIEW_HANDLER_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int VIEW_HANDLER_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>View Handler Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int VIEW_HANDLER_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Description</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int RESOURCE_BUNDLE_TYPE__DESCRIPTION = 0;
-
-				/**
-	 * The feature id for the '<em><b>Display Name</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int RESOURCE_BUNDLE_TYPE__DISPLAY_NAME = 1;
-
-				/**
-	 * The feature id for the '<em><b>Icon</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int RESOURCE_BUNDLE_TYPE__ICON = 2;
-
-				/**
-	 * The feature id for the '<em><b>Base Name</b></em>' reference.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int RESOURCE_BUNDLE_TYPE__BASE_NAME = 3;
-
-				/**
-	 * The feature id for the '<em><b>Var</b></em>' reference.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int RESOURCE_BUNDLE_TYPE__VAR = 4;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int RESOURCE_BUNDLE_TYPE__ID = 5;
-
-				/**
-	 * The number of structural features of the '<em>Resource Bundle Type</em>' class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int RESOURCE_BUNDLE_TYPE_FEATURE_COUNT = 6;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int BASE_NAME_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int BASE_NAME_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Base Name Type</em>' class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int BASE_NAME_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int VAR_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int VAR_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Var Type</em>' class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int VAR_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int VIEW_DECLARATION_LANGUAGE_FACTORY_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int VIEW_DECLARATION_LANGUAGE_FACTORY_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>View Declaration Language Factory Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int VIEW_DECLARATION_LANGUAGE_FACTORY_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int VISIT_CONTEXT_FACTORY_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int VISIT_CONTEXT_FACTORY_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Visit Context Factory Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int VISIT_CONTEXT_FACTORY_TYPE_FEATURE_COUNT = 2;
-
-
-				/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ActionListenerType <em>Action Listener Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Action Listener Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ActionListenerType
-	 * @generated
-	 */
-	EClass getActionListenerType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ActionListenerType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ActionListenerType#getTextContent()
-	 * @see #getActionListenerType()
-	 * @generated
-	 */
-	EAttribute getActionListenerType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ActionListenerType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ActionListenerType#getId()
-	 * @see #getActionListenerType()
-	 * @generated
-	 */
-	EAttribute getActionListenerType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationFactoryType <em>Application Factory Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Application Factory Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ApplicationFactoryType
-	 * @generated
-	 */
-	EClass getApplicationFactoryType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationFactoryType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ApplicationFactoryType#getTextContent()
-	 * @see #getApplicationFactoryType()
-	 * @generated
-	 */
-	EAttribute getApplicationFactoryType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationFactoryType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ApplicationFactoryType#getId()
-	 * @see #getApplicationFactoryType()
-	 * @generated
-	 */
-	EAttribute getApplicationFactoryType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType <em>Application Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Application Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ApplicationType
-	 * @generated
-	 */
-	EClass getApplicationType();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getActionListener <em>Action Listener</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Action Listener</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getActionListener()
-	 * @see #getApplicationType()
-	 * @generated
-	 */
-	EReference getApplicationType_ActionListener();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getDefaultRenderKitId <em>Default Render Kit Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Default Render Kit Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getDefaultRenderKitId()
-	 * @see #getApplicationType()
-	 * @generated
-	 */
-	EReference getApplicationType_DefaultRenderKitId();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getMessageBundle <em>Message Bundle</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Message Bundle</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getMessageBundle()
-	 * @see #getApplicationType()
-	 * @generated
-	 */
-	EReference getApplicationType_MessageBundle();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getNavigationHandler <em>Navigation Handler</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Navigation Handler</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getNavigationHandler()
-	 * @see #getApplicationType()
-	 * @generated
-	 */
-	EReference getApplicationType_NavigationHandler();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getViewHandler <em>View Handler</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>View Handler</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getViewHandler()
-	 * @see #getApplicationType()
-	 * @generated
-	 */
-	EReference getApplicationType_ViewHandler();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getStateManager <em>State Manager</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>State Manager</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getStateManager()
-	 * @see #getApplicationType()
-	 * @generated
-	 */
-	EReference getApplicationType_StateManager();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getPropertyResolver <em>Property Resolver</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Property Resolver</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getPropertyResolver()
-	 * @see #getApplicationType()
-	 * @generated
-	 */
-	EReference getApplicationType_PropertyResolver();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getVariableResolver <em>Variable Resolver</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Variable Resolver</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getVariableResolver()
-	 * @see #getApplicationType()
-	 * @generated
-	 */
-	EReference getApplicationType_VariableResolver();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getResourceHandler <em>Resource Handler</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Resource Handler</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getResourceHandler()
-	 * @see #getApplicationType()
-	 * @generated
-	 */
-	EReference getApplicationType_ResourceHandler();
-
-				/**
-	 * Returns the meta object for the reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getSystemEventListener <em>System Event Listener</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference list '<em>System Event Listener</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getSystemEventListener()
-	 * @see #getApplicationType()
-	 * @generated
-	 */
-	EReference getApplicationType_SystemEventListener();
-
-				/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getLocaleConfig <em>Locale Config</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Locale Config</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getLocaleConfig()
-	 * @see #getApplicationType()
-	 * @generated
-	 */
-	EReference getApplicationType_LocaleConfig();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getId()
-	 * @see #getApplicationType()
-	 * @generated
-	 */
-	EAttribute getApplicationType_Id();
-
-    /**
-	 * Returns the meta object for the reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getELResolver <em>EL Resolver</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for the reference list '<em>EL Resolver</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getELResolver()
-	 * @see #getApplicationType()
-	 * @generated
-	 */
-    EReference getApplicationType_ELResolver();
-
-    /**
-	 * Returns the meta object for the reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getResourceBundle <em>Resource Bundle</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for the reference list '<em>Resource Bundle</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getResourceBundle()
-	 * @see #getApplicationType()
-	 * @generated
-	 */
-    EReference getApplicationType_ResourceBundle();
-
-    /**
-	 * Returns the meta object for the reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getApplicationExtension <em>Application Extension</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for the reference list '<em>Application Extension</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getApplicationExtension()
-	 * @see #getApplicationType()
-	 * @generated
-	 */
-    EReference getApplicationType_ApplicationExtension();
-
-    /**
-	 * Returns the meta object for the reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getDefaultValidators <em>Default Validators</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference list '<em>Default Validators</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getDefaultValidators()
-	 * @see #getApplicationType()
-	 * @generated
-	 */
-	EReference getApplicationType_DefaultValidators();
-
-				/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeClassType <em>Attribute Class Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Attribute Class Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.AttributeClassType
-	 * @generated
-	 */
-	EClass getAttributeClassType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeClassType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.AttributeClassType#getTextContent()
-	 * @see #getAttributeClassType()
-	 * @generated
-	 */
-	EAttribute getAttributeClassType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeClassType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.AttributeClassType#getId()
-	 * @see #getAttributeClassType()
-	 * @generated
-	 */
-	EAttribute getAttributeClassType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeExtensionType <em>Attribute Extension Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Attribute Extension Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.AttributeExtensionType
-	 * @generated
-	 */
-	EClass getAttributeExtensionType();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeNameType <em>Attribute Name Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Attribute Name Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.AttributeNameType
-	 * @generated
-	 */
-	EClass getAttributeNameType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeNameType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.AttributeNameType#getTextContent()
-	 * @see #getAttributeNameType()
-	 * @generated
-	 */
-	EAttribute getAttributeNameType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeNameType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.AttributeNameType#getId()
-	 * @see #getAttributeNameType()
-	 * @generated
-	 */
-	EAttribute getAttributeNameType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeType <em>Attribute Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Attribute Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.AttributeType
-	 * @generated
-	 */
-	EClass getAttributeType();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeType#getDescription <em>Description</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Description</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.AttributeType#getDescription()
-	 * @see #getAttributeType()
-	 * @generated
-	 */
-	EReference getAttributeType_Description();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeType#getDisplayName <em>Display Name</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Display Name</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.AttributeType#getDisplayName()
-	 * @see #getAttributeType()
-	 * @generated
-	 */
-	EReference getAttributeType_DisplayName();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeType#getIcon <em>Icon</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Icon</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.AttributeType#getIcon()
-	 * @see #getAttributeType()
-	 * @generated
-	 */
-	EReference getAttributeType_Icon();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeType#getAttributeName <em>Attribute Name</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Attribute Name</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.AttributeType#getAttributeName()
-	 * @see #getAttributeType()
-	 * @generated
-	 */
-	EReference getAttributeType_AttributeName();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeType#getAttributeClass <em>Attribute Class</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Attribute Class</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.AttributeType#getAttributeClass()
-	 * @see #getAttributeType()
-	 * @generated
-	 */
-	EReference getAttributeType_AttributeClass();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeType#getDefaultValue <em>Default Value</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Default Value</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.AttributeType#getDefaultValue()
-	 * @see #getAttributeType()
-	 * @generated
-	 */
-	EReference getAttributeType_DefaultValue();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeType#getSuggestedValue <em>Suggested Value</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Suggested Value</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.AttributeType#getSuggestedValue()
-	 * @see #getAttributeType()
-	 * @generated
-	 */
-	EReference getAttributeType_SuggestedValue();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeType#getAttributeExtension <em>Attribute Extension</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Attribute Extension</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.AttributeType#getAttributeExtension()
-	 * @see #getAttributeType()
-	 * @generated
-	 */
-	EReference getAttributeType_AttributeExtension();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.AttributeType#getId()
-	 * @see #getAttributeType()
-	 * @generated
-	 */
-	EAttribute getAttributeType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.BehaviorClassType <em>Behavior Class Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Behavior Class Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.BehaviorClassType
-	 * @generated
-	 */
-	EClass getBehaviorClassType();
-
-				/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.BehaviorClassType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.BehaviorClassType#getTextContent()
-	 * @see #getBehaviorClassType()
-	 * @generated
-	 */
-	EAttribute getBehaviorClassType_TextContent();
-
-				/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.BehaviorClassType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.BehaviorClassType#getId()
-	 * @see #getBehaviorClassType()
-	 * @generated
-	 */
-	EAttribute getBehaviorClassType_Id();
-
-				/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.BehaviorIdType <em>Behavior Id Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Behavior Id Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.BehaviorIdType
-	 * @generated
-	 */
-	EClass getBehaviorIdType();
-
-				/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.BehaviorIdType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.BehaviorIdType#getTextContent()
-	 * @see #getBehaviorIdType()
-	 * @generated
-	 */
-	EAttribute getBehaviorIdType_TextContent();
-
-				/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.BehaviorIdType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.BehaviorIdType#getId()
-	 * @see #getBehaviorIdType()
-	 * @generated
-	 */
-	EAttribute getBehaviorIdType_Id();
-
-				/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.BehaviorType <em>Behavior Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Behavior Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.BehaviorType
-	 * @generated
-	 */
-	EClass getBehaviorType();
-
-				/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.BehaviorType#getDescription <em>Description</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Description</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.BehaviorType#getDescription()
-	 * @see #getBehaviorType()
-	 * @generated
-	 */
-	EReference getBehaviorType_Description();
-
-				/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.BehaviorType#getDisplayName <em>Display Name</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Display Name</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.BehaviorType#getDisplayName()
-	 * @see #getBehaviorType()
-	 * @generated
-	 */
-	EReference getBehaviorType_DisplayName();
-
-				/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.BehaviorType#getIcon <em>Icon</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Icon</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.BehaviorType#getIcon()
-	 * @see #getBehaviorType()
-	 * @generated
-	 */
-	EReference getBehaviorType_Icon();
-
-				/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.BehaviorType#getBehaviorId <em>Behavior Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Behavior Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.BehaviorType#getBehaviorId()
-	 * @see #getBehaviorType()
-	 * @generated
-	 */
-	EReference getBehaviorType_BehaviorId();
-
-				/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.BehaviorType#getBehaviorClass <em>Behavior Class</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Behavior Class</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.BehaviorType#getBehaviorClass()
-	 * @see #getBehaviorType()
-	 * @generated
-	 */
-	EReference getBehaviorType_BehaviorClass();
-
-				/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.BehaviorType#getAttribute <em>Attribute</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Attribute</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.BehaviorType#getAttribute()
-	 * @see #getBehaviorType()
-	 * @generated
-	 */
-	EReference getBehaviorType_Attribute();
-
-				/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.BehaviorType#getProperty <em>Property</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Property</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.BehaviorType#getProperty()
-	 * @see #getBehaviorType()
-	 * @generated
-	 */
-	EReference getBehaviorType_Property();
-
-				/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.BehaviorType#getBehaviorExtension <em>Behavior Extension</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Behavior Extension</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.BehaviorType#getBehaviorExtension()
-	 * @see #getBehaviorType()
-	 * @generated
-	 */
-	EReference getBehaviorType_BehaviorExtension();
-
-				/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.BehaviorExtensionType <em>Behavior Extension Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Behavior Extension Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.BehaviorExtensionType
-	 * @generated
-	 */
-	EClass getBehaviorExtensionType();
-
-				/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererClassType <em>Client Behavior Renderer Class Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Client Behavior Renderer Class Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererClassType
-	 * @generated
-	 */
-	EClass getClientBehaviorRendererClassType();
-
-				/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererClassType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererClassType#getTextContent()
-	 * @see #getClientBehaviorRendererClassType()
-	 * @generated
-	 */
-	EAttribute getClientBehaviorRendererClassType_TextContent();
-
-				/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererClassType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererClassType#getId()
-	 * @see #getClientBehaviorRendererClassType()
-	 * @generated
-	 */
-	EAttribute getClientBehaviorRendererClassType_Id();
-
-				/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererType <em>Client Behavior Renderer Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Client Behavior Renderer Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererType
-	 * @generated
-	 */
-	EClass getClientBehaviorRendererType();
-
-				/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererType#getClientBehaviorRendererType <em>Client Behavior Renderer Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Client Behavior Renderer Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererType#getClientBehaviorRendererType()
-	 * @see #getClientBehaviorRendererType()
-	 * @generated
-	 */
-	EReference getClientBehaviorRendererType_ClientBehaviorRendererType();
-
-				/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererType#getClientBehaviorRendererClass <em>Client Behavior Renderer Class</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Client Behavior Renderer Class</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererType#getClientBehaviorRendererClass()
-	 * @see #getClientBehaviorRendererType()
-	 * @generated
-	 */
-	EReference getClientBehaviorRendererType_ClientBehaviorRendererClass();
-
-				/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererTypeType <em>Client Behavior Renderer Type Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Client Behavior Renderer Type Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererTypeType
-	 * @generated
-	 */
-	EClass getClientBehaviorRendererTypeType();
-
-				/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererTypeType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererTypeType#getTextContent()
-	 * @see #getClientBehaviorRendererTypeType()
-	 * @generated
-	 */
-	EAttribute getClientBehaviorRendererTypeType_TextContent();
-
-				/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererTypeType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererTypeType#getId()
-	 * @see #getClientBehaviorRendererTypeType()
-	 * @generated
-	 */
-	EAttribute getClientBehaviorRendererTypeType_Id();
-
-				/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentClassType <em>Component Class Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Component Class Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ComponentClassType
-	 * @generated
-	 */
-	EClass getComponentClassType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentClassType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ComponentClassType#getTextContent()
-	 * @see #getComponentClassType()
-	 * @generated
-	 */
-	EAttribute getComponentClassType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentClassType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ComponentClassType#getId()
-	 * @see #getComponentClassType()
-	 * @generated
-	 */
-	EAttribute getComponentClassType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentExtensionType <em>Component Extension Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Component Extension Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ComponentExtensionType
-	 * @generated
-	 */
-	EClass getComponentExtensionType();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentFamilyType <em>Component Family Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Component Family Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ComponentFamilyType
-	 * @generated
-	 */
-	EClass getComponentFamilyType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentFamilyType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ComponentFamilyType#getTextContent()
-	 * @see #getComponentFamilyType()
-	 * @generated
-	 */
-	EAttribute getComponentFamilyType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentFamilyType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ComponentFamilyType#getId()
-	 * @see #getComponentFamilyType()
-	 * @generated
-	 */
-	EAttribute getComponentFamilyType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentType <em>Component Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Component Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ComponentType
-	 * @generated
-	 */
-	EClass getComponentType();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentType#getDescription <em>Description</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Description</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ComponentType#getDescription()
-	 * @see #getComponentType()
-	 * @generated
-	 */
-	EReference getComponentType_Description();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentType#getDisplayName <em>Display Name</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Display Name</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ComponentType#getDisplayName()
-	 * @see #getComponentType()
-	 * @generated
-	 */
-	EReference getComponentType_DisplayName();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentType#getIcon <em>Icon</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Icon</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ComponentType#getIcon()
-	 * @see #getComponentType()
-	 * @generated
-	 */
-	EReference getComponentType_Icon();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentType#getComponentType <em>Component Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Component Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ComponentType#getComponentType()
-	 * @see #getComponentType()
-	 * @generated
-	 */
-	EReference getComponentType_ComponentType();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentType#getComponentClass <em>Component Class</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Component Class</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ComponentType#getComponentClass()
-	 * @see #getComponentType()
-	 * @generated
-	 */
-	EReference getComponentType_ComponentClass();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentType#getFacet <em>Facet</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Facet</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ComponentType#getFacet()
-	 * @see #getComponentType()
-	 * @generated
-	 */
-	EReference getComponentType_Facet();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentType#getAttribute <em>Attribute</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Attribute</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ComponentType#getAttribute()
-	 * @see #getComponentType()
-	 * @generated
-	 */
-	EReference getComponentType_Attribute();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentType#getProperty <em>Property</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Property</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ComponentType#getProperty()
-	 * @see #getComponentType()
-	 * @generated
-	 */
-	EReference getComponentType_Property();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentType#getComponentExtension <em>Component Extension</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Component Extension</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ComponentType#getComponentExtension()
-	 * @see #getComponentType()
-	 * @generated
-	 */
-	EReference getComponentType_ComponentExtension();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ComponentType#getId()
-	 * @see #getComponentType()
-	 * @generated
-	 */
-	EAttribute getComponentType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentTypeType <em>Component Type Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Component Type Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ComponentTypeType
-	 * @generated
-	 */
-	EClass getComponentTypeType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentTypeType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ComponentTypeType#getTextContent()
-	 * @see #getComponentTypeType()
-	 * @generated
-	 */
-	EAttribute getComponentTypeType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentTypeType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ComponentTypeType#getId()
-	 * @see #getComponentTypeType()
-	 * @generated
-	 */
-	EAttribute getComponentTypeType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterClassType <em>Converter Class Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Converter Class Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ConverterClassType
-	 * @generated
-	 */
-	EClass getConverterClassType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterClassType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ConverterClassType#getTextContent()
-	 * @see #getConverterClassType()
-	 * @generated
-	 */
-	EAttribute getConverterClassType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterClassType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ConverterClassType#getId()
-	 * @see #getConverterClassType()
-	 * @generated
-	 */
-	EAttribute getConverterClassType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterForClassType <em>Converter For Class Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Converter For Class Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ConverterForClassType
-	 * @generated
-	 */
-	EClass getConverterForClassType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterForClassType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ConverterForClassType#getTextContent()
-	 * @see #getConverterForClassType()
-	 * @generated
-	 */
-	EAttribute getConverterForClassType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterForClassType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ConverterForClassType#getId()
-	 * @see #getConverterForClassType()
-	 * @generated
-	 */
-	EAttribute getConverterForClassType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterIdType <em>Converter Id Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Converter Id Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ConverterIdType
-	 * @generated
-	 */
-	EClass getConverterIdType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterIdType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ConverterIdType#getTextContent()
-	 * @see #getConverterIdType()
-	 * @generated
-	 */
-	EAttribute getConverterIdType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterIdType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ConverterIdType#getId()
-	 * @see #getConverterIdType()
-	 * @generated
-	 */
-	EAttribute getConverterIdType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterType <em>Converter Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Converter Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ConverterType
-	 * @generated
-	 */
-	EClass getConverterType();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterType#getDescription <em>Description</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Description</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ConverterType#getDescription()
-	 * @see #getConverterType()
-	 * @generated
-	 */
-	EReference getConverterType_Description();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterType#getDisplayName <em>Display Name</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Display Name</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ConverterType#getDisplayName()
-	 * @see #getConverterType()
-	 * @generated
-	 */
-	EReference getConverterType_DisplayName();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterType#getIcon <em>Icon</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Icon</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ConverterType#getIcon()
-	 * @see #getConverterType()
-	 * @generated
-	 */
-	EReference getConverterType_Icon();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterType#getConverterId <em>Converter Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Converter Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ConverterType#getConverterId()
-	 * @see #getConverterType()
-	 * @generated
-	 */
-	EReference getConverterType_ConverterId();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterType#getConverterForClass <em>Converter For Class</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Converter For Class</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ConverterType#getConverterForClass()
-	 * @see #getConverterType()
-	 * @generated
-	 */
-	EReference getConverterType_ConverterForClass();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterType#getConverterClass <em>Converter Class</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Converter Class</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ConverterType#getConverterClass()
-	 * @see #getConverterType()
-	 * @generated
-	 */
-	EReference getConverterType_ConverterClass();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterType#getAttribute <em>Attribute</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Attribute</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ConverterType#getAttribute()
-	 * @see #getConverterType()
-	 * @generated
-	 */
-	EReference getConverterType_Attribute();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterType#getProperty <em>Property</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Property</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ConverterType#getProperty()
-	 * @see #getConverterType()
-	 * @generated
-	 */
-	EReference getConverterType_Property();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterType#getConverterExtension <em>Converter Extension</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Converter Extension</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ConverterType#getConverterExtension()
-	 * @see #getConverterType()
-	 * @generated
-	 */
-    EReference getConverterType_ConverterExtension();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ConverterType#getId()
-	 * @see #getConverterType()
-	 * @generated
-	 */
-	EAttribute getConverterType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.DefaultLocaleType <em>Default Locale Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Default Locale Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DefaultLocaleType
-	 * @generated
-	 */
-	EClass getDefaultLocaleType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.DefaultLocaleType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DefaultLocaleType#getTextContent()
-	 * @see #getDefaultLocaleType()
-	 * @generated
-	 */
-	EAttribute getDefaultLocaleType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.DefaultLocaleType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DefaultLocaleType#getId()
-	 * @see #getDefaultLocaleType()
-	 * @generated
-	 */
-	EAttribute getDefaultLocaleType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.DefaultRenderKitIdType <em>Default Render Kit Id Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Default Render Kit Id Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DefaultRenderKitIdType
-	 * @generated
-	 */
-	EClass getDefaultRenderKitIdType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.DefaultRenderKitIdType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DefaultRenderKitIdType#getTextContent()
-	 * @see #getDefaultRenderKitIdType()
-	 * @generated
-	 */
-	EAttribute getDefaultRenderKitIdType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.DefaultRenderKitIdType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DefaultRenderKitIdType#getId()
-	 * @see #getDefaultRenderKitIdType()
-	 * @generated
-	 */
-	EAttribute getDefaultRenderKitIdType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.DefaultValidatorsType <em>Default Validators Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Default Validators Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DefaultValidatorsType
-	 * @generated
-	 */
-	EClass getDefaultValidatorsType();
-
-				/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.DefaultValidatorsType#getValidatorId <em>Validator Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Validator Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DefaultValidatorsType#getValidatorId()
-	 * @see #getDefaultValidatorsType()
-	 * @generated
-	 */
-	EReference getDefaultValidatorsType_ValidatorId();
-
-				/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.DefaultValidatorsType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DefaultValidatorsType#getId()
-	 * @see #getDefaultValidatorsType()
-	 * @generated
-	 */
-	EAttribute getDefaultValidatorsType_Id();
-
-				/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.DefaultValueType <em>Default Value Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Default Value Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DefaultValueType
-	 * @generated
-	 */
-	EClass getDefaultValueType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.DefaultValueType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DefaultValueType#getTextContent()
-	 * @see #getDefaultValueType()
-	 * @generated
-	 */
-	EAttribute getDefaultValueType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.DefaultValueType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DefaultValueType#getId()
-	 * @see #getDefaultValueType()
-	 * @generated
-	 */
-	EAttribute getDefaultValueType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.DescriptionType <em>Description Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Description Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DescriptionType
-	 * @generated
-	 */
-	EClass getDescriptionType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.DescriptionType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DescriptionType#getTextContent()
-	 * @see #getDescriptionType()
-	 * @generated
-	 */
-	EAttribute getDescriptionType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.DescriptionType#getLang <em>Lang</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Lang</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DescriptionType#getLang()
-	 * @see #getDescriptionType()
-	 * @generated
-	 */
-	EAttribute getDescriptionType_Lang();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.DescriptionType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DescriptionType#getId()
-	 * @see #getDescriptionType()
-	 * @generated
-	 */
-	EAttribute getDescriptionType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType <em>Display Name Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Display Name Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType
-	 * @generated
-	 */
-	EClass getDisplayNameType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType#getTextContent()
-	 * @see #getDisplayNameType()
-	 * @generated
-	 */
-	EAttribute getDisplayNameType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType#getLang <em>Lang</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Lang</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType#getLang()
-	 * @see #getDisplayNameType()
-	 * @generated
-	 */
-	EAttribute getDisplayNameType_Lang();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType#getId()
-	 * @see #getDisplayNameType()
-	 * @generated
-	 */
-	EAttribute getDisplayNameType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot <em>Document Root</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Document Root</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot
-	 * @generated
-	 */
-	EClass getDocumentRoot();
-
-    /**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getMixed <em>Mixed</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Mixed</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getMixed()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EAttribute getDocumentRoot_Mixed();
-
-    /**
-	 * Returns the meta object for the map '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getXMLNSPrefixMap <em>XMLNS Prefix Map</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the map '<em>XMLNS Prefix Map</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getXMLNSPrefixMap()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_XMLNSPrefixMap();
-
-    /**
-	 * Returns the meta object for the map '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getXSISchemaLocation <em>XSI Schema Location</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the map '<em>XSI Schema Location</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getXSISchemaLocation()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_XSISchemaLocation();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getAbsoluteOrdering <em>Absolute Ordering</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Absolute Ordering</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getAbsoluteOrdering()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_AbsoluteOrdering();
-
-				/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getActionListener <em>Action Listener</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Action Listener</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getActionListener()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_ActionListener();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getApplication <em>Application</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Application</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getApplication()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_Application();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getApplicationFactory <em>Application Factory</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Application Factory</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getApplicationFactory()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_ApplicationFactory();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getAttribute <em>Attribute</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Attribute</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getAttribute()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_Attribute();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getAttributeClass <em>Attribute Class</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Attribute Class</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getAttributeClass()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_AttributeClass();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getAttributeExtension <em>Attribute Extension</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Attribute Extension</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getAttributeExtension()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_AttributeExtension();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getAttributeName <em>Attribute Name</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Attribute Name</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getAttributeName()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_AttributeName();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getBehavior <em>Behavior</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Behavior</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getBehavior()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_Behavior();
-
-				/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getBehaviorClass <em>Behavior Class</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Behavior Class</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getBehaviorClass()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_BehaviorClass();
-
-				/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getBehaviorId <em>Behavior Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Behavior Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getBehaviorId()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_BehaviorId();
-
-				/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getBehaviorExtension <em>Behavior Extension</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Behavior Extension</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getBehaviorExtension()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_BehaviorExtension();
-
-				/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getComponent <em>Component</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Component</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getComponent()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_Component();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getComponentClass <em>Component Class</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Component Class</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getComponentClass()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_ComponentClass();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getComponentExtension <em>Component Extension</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Component Extension</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getComponentExtension()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_ComponentExtension();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getComponentFamily <em>Component Family</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Component Family</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getComponentFamily()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_ComponentFamily();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getComponentType <em>Component Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Component Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getComponentType()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_ComponentType();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getConverter <em>Converter</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Converter</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getConverter()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_Converter();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getConverterClass <em>Converter Class</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Converter Class</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getConverterClass()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_ConverterClass();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getConverterForClass <em>Converter For Class</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Converter For Class</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getConverterForClass()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_ConverterForClass();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getConverterId <em>Converter Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Converter Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getConverterId()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_ConverterId();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getDefaultLocale <em>Default Locale</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Default Locale</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getDefaultLocale()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_DefaultLocale();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getDefaultRenderKitId <em>Default Render Kit Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Default Render Kit Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getDefaultRenderKitId()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_DefaultRenderKitId();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getDefaultValidators <em>Default Validators</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Default Validators</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getDefaultValidators()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_DefaultValidators();
-
-				/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getDefaultValue <em>Default Value</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Default Value</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getDefaultValue()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_DefaultValue();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getDescription <em>Description</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Description</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getDescription()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_Description();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getDisplayName <em>Display Name</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Display Name</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getDisplayName()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_DisplayName();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getExceptionHandlerFactory <em>Exception Handler Factory</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Exception Handler Factory</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getExceptionHandlerFactory()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_ExceptionHandlerFactory();
-
-				/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getExternalContextFactory <em>External Context Factory</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>External Context Factory</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getExternalContextFactory()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_ExternalContextFactory();
-
-				/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getFacesConfig <em>Faces Config</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Faces Config</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getFacesConfig()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_FacesConfig();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getFacesContextFactory <em>Faces Context Factory</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Faces Context Factory</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getFacesContextFactory()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_FacesContextFactory();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getFacet <em>Facet</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Facet</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getFacet()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_Facet();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getFacetExtension <em>Facet Extension</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Facet Extension</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getFacetExtension()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_FacetExtension();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getFacetName <em>Facet Name</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Facet Name</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getFacetName()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_FacetName();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getFactory <em>Factory</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Factory</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getFactory()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_Factory();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getFromAction <em>From Action</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>From Action</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getFromAction()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_FromAction();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getFromOutcome <em>From Outcome</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>From Outcome</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getFromOutcome()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_FromOutcome();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getFromViewId <em>From View Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>From View Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getFromViewId()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_FromViewId();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getIcon <em>Icon</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Icon</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getIcon()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_Icon();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getIf <em>If</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>If</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getIf()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_If();
-
-				/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getKey <em>Key</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Key</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getKey()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_Key();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getKeyClass <em>Key Class</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Key Class</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getKeyClass()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_KeyClass();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getLargeIcon <em>Large Icon</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Large Icon</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getLargeIcon()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_LargeIcon();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getLifecycle <em>Lifecycle</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Lifecycle</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getLifecycle()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_Lifecycle();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getLifecycleFactory <em>Lifecycle Factory</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Lifecycle Factory</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getLifecycleFactory()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_LifecycleFactory();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getListEntries <em>List Entries</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>List Entries</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getListEntries()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_ListEntries();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getLocaleConfig <em>Locale Config</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Locale Config</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getLocaleConfig()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_LocaleConfig();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getManagedBean <em>Managed Bean</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Managed Bean</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getManagedBean()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_ManagedBean();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getManagedBeanClass <em>Managed Bean Class</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Managed Bean Class</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getManagedBeanClass()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_ManagedBeanClass();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getManagedBeanName <em>Managed Bean Name</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Managed Bean Name</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getManagedBeanName()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_ManagedBeanName();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getManagedBeanScope <em>Managed Bean Scope</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Managed Bean Scope</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getManagedBeanScope()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_ManagedBeanScope();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getManagedProperty <em>Managed Property</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Managed Property</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getManagedProperty()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_ManagedProperty();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getMapEntries <em>Map Entries</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Map Entries</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getMapEntries()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_MapEntries();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getMapEntry <em>Map Entry</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Map Entry</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getMapEntry()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_MapEntry();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getMessageBundle <em>Message Bundle</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Message Bundle</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getMessageBundle()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_MessageBundle();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getName <em>Name</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Name</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getName()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_Name();
-
-				/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getNavigationCase <em>Navigation Case</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Navigation Case</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getNavigationCase()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_NavigationCase();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getNavigationHandler <em>Navigation Handler</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Navigation Handler</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getNavigationHandler()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_NavigationHandler();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getNavigationRule <em>Navigation Rule</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Navigation Rule</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getNavigationRule()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_NavigationRule();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getNullValue <em>Null Value</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Null Value</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getNullValue()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_NullValue();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getOrdering <em>Ordering</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Ordering</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getOrdering()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_Ordering();
-
-				/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getOrderingOrdering <em>Ordering Ordering</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Ordering Ordering</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getOrderingOrdering()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_OrderingOrdering();
-
-				/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getOthers <em>Others</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Others</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getOthers()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_Others();
-
-				/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getPartialViewContextFactory <em>Partial View Context Factory</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Partial View Context Factory</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getPartialViewContextFactory()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_PartialViewContextFactory();
-
-				/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getPhaseListener <em>Phase Listener</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Phase Listener</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getPhaseListener()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_PhaseListener();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getProperty <em>Property</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Property</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getProperty()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_Property();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getPropertyClass <em>Property Class</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Property Class</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getPropertyClass()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_PropertyClass();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getPropertyExtension <em>Property Extension</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Property Extension</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getPropertyExtension()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_PropertyExtension();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getPropertyName <em>Property Name</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Property Name</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getPropertyName()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_PropertyName();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getPropertyResolver <em>Property Resolver</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Property Resolver</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getPropertyResolver()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_PropertyResolver();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRedirect <em>Redirect</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Redirect</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRedirect()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_Redirect();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRedirectViewParam <em>Redirect View Param</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Redirect View Param</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRedirectViewParam()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_RedirectViewParam();
-
-				/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getReferencedBean <em>Referenced Bean</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Referenced Bean</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getReferencedBean()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_ReferencedBean();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getReferencedBeanClass <em>Referenced Bean Class</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Referenced Bean Class</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getReferencedBeanClass()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_ReferencedBeanClass();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getReferencedBeanName <em>Referenced Bean Name</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Referenced Bean Name</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getReferencedBeanName()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_ReferencedBeanName();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRenderer <em>Renderer</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Renderer</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRenderer()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_Renderer();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRendererClass <em>Renderer Class</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Renderer Class</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRendererClass()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_RendererClass();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRendererExtension <em>Renderer Extension</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Renderer Extension</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRendererExtension()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_RendererExtension();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRendererType <em>Renderer Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Renderer Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRendererType()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_RendererType();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRenderKit <em>Render Kit</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Render Kit</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRenderKit()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_RenderKit();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRenderKitClass <em>Render Kit Class</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Render Kit Class</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRenderKitClass()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_RenderKitClass();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRenderKitFactory <em>Render Kit Factory</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Render Kit Factory</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRenderKitFactory()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_RenderKitFactory();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRenderKitId <em>Render Kit Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Render Kit Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRenderKitId()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_RenderKitId();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getResourceHandler <em>Resource Handler</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Resource Handler</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getResourceHandler()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_ResourceHandler();
-
-				/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getSmallIcon <em>Small Icon</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Small Icon</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getSmallIcon()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_SmallIcon();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getSourceClass <em>Source Class</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Source Class</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getSourceClass()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_SourceClass();
-
-				/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getStateManager <em>State Manager</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>State Manager</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getStateManager()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_StateManager();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getSuggestedValue <em>Suggested Value</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Suggested Value</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getSuggestedValue()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_SuggestedValue();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getSupportedLocale <em>Supported Locale</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Supported Locale</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getSupportedLocale()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_SupportedLocale();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getSystemEventClass <em>System Event Class</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>System Event Class</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getSystemEventClass()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_SystemEventClass();
-
-				/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getSystemEventListener <em>System Event Listener</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>System Event Listener</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getSystemEventListener()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_SystemEventListener();
-
-				/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getSystemEventListenerClass <em>System Event Listener Class</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>System Event Listener Class</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getSystemEventListenerClass()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_SystemEventListenerClass();
-
-				/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getTagHandlerDelegateFactory <em>Tag Handler Delegate Factory</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Tag Handler Delegate Factory</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getTagHandlerDelegateFactory()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_TagHandlerDelegateFactory();
-
-				/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getToViewId <em>To View Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>To View Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getToViewId()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_ToViewId();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getValidator <em>Validator</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Validator</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getValidator()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_Validator();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getValidatorClass <em>Validator Class</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Validator Class</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getValidatorClass()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_ValidatorClass();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getValidatorId <em>Validator Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Validator Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getValidatorId()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_ValidatorId();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getValue <em>Value</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Value</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getValue()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_Value();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getValueClass <em>Value Class</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Value Class</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getValueClass()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_ValueClass();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getVariableResolver <em>Variable Resolver</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Variable Resolver</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getVariableResolver()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_VariableResolver();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getViewDeclarationLanguageFactory <em>View Declaration Language Factory</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>View Declaration Language Factory</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getViewDeclarationLanguageFactory()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_ViewDeclarationLanguageFactory();
-
-				/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getViewHandler <em>View Handler</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>View Handler</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getViewHandler()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_ViewHandler();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getVisitContextFactory <em>Visit Context Factory</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Visit Context Factory</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getVisitContextFactory()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_VisitContextFactory();
-
-				/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.DynamicAttribute <em>Dynamic Attribute</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Dynamic Attribute</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DynamicAttribute
-	 * @generated
-	 */
-    EClass getDynamicAttribute();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.DynamicAttribute#getName <em>Name</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Name</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DynamicAttribute#getName()
-	 * @see #getDynamicAttribute()
-	 * @generated
-	 */
-    EAttribute getDynamicAttribute_Name();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.DynamicAttribute#getValue <em>Value</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Value</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DynamicAttribute#getValue()
-	 * @see #getDynamicAttribute()
-	 * @generated
-	 */
-    EAttribute getDynamicAttribute_Value();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.DynamicElement <em>Dynamic Element</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Dynamic Element</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DynamicElement
-	 * @generated
-	 */
-    EClass getDynamicElement();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.DynamicElement#getChildNodes <em>Child Nodes</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Child Nodes</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DynamicElement#getChildNodes()
-	 * @see #getDynamicElement()
-	 * @generated
-	 */
-    EReference getDynamicElement_ChildNodes();
-
-    /**
-	 * Returns the meta object for the reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.DynamicElement#getAttributes <em>Attributes</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for the reference list '<em>Attributes</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DynamicElement#getAttributes()
-	 * @see #getDynamicElement()
-	 * @generated
-	 */
-    EReference getDynamicElement_Attributes();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.DynamicElement#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DynamicElement#getTextContent()
-	 * @see #getDynamicElement()
-	 * @generated
-	 */
-    EAttribute getDynamicElement_TextContent();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ELResolverType <em>EL Resolver Type</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>EL Resolver Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ELResolverType
-	 * @generated
-	 */
-    EClass getELResolverType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ELResolverType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ELResolverType#getTextContent()
-	 * @see #getELResolverType()
-	 * @generated
-	 */
-    EAttribute getELResolverType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ELResolverType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ELResolverType#getId()
-	 * @see #getELResolverType()
-	 * @generated
-	 */
-    EAttribute getELResolverType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ExceptionHandlerFactoryType <em>Exception Handler Factory Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Exception Handler Factory Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ExceptionHandlerFactoryType
-	 * @generated
-	 */
-	EClass getExceptionHandlerFactoryType();
-
-				/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ExceptionHandlerFactoryType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ExceptionHandlerFactoryType#getTextContent()
-	 * @see #getExceptionHandlerFactoryType()
-	 * @generated
-	 */
-	EAttribute getExceptionHandlerFactoryType_TextContent();
-
-				/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ExceptionHandlerFactoryType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ExceptionHandlerFactoryType#getId()
-	 * @see #getExceptionHandlerFactoryType()
-	 * @generated
-	 */
-	EAttribute getExceptionHandlerFactoryType_Id();
-
-				/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.DynamicElement#getName <em>Name</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Name</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DynamicElement#getName()
-	 * @see #getDynamicElement()
-	 * @generated
-	 */
-    EAttribute getDynamicElement_Name();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType <em>Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType
-	 * @generated
-	 */
-	EClass getFacesConfigType();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getApplication <em>Application</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Application</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getApplication()
-	 * @see #getFacesConfigType()
-	 * @generated
-	 */
-	EReference getFacesConfigType_Application();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getOrdering <em>Ordering</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Ordering</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getOrdering()
-	 * @see #getFacesConfigType()
-	 * @generated
-	 */
-	EReference getFacesConfigType_Ordering();
-
-				/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getAbsoluteOrdering <em>Absolute Ordering</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Absolute Ordering</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getAbsoluteOrdering()
-	 * @see #getFacesConfigType()
-	 * @generated
-	 */
-	EReference getFacesConfigType_AbsoluteOrdering();
-
-				/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getFactory <em>Factory</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Factory</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getFactory()
-	 * @see #getFacesConfigType()
-	 * @generated
-	 */
-	EReference getFacesConfigType_Factory();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getComponent <em>Component</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Component</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getComponent()
-	 * @see #getFacesConfigType()
-	 * @generated
-	 */
-	EReference getFacesConfigType_Component();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getConverter <em>Converter</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Converter</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getConverter()
-	 * @see #getFacesConfigType()
-	 * @generated
-	 */
-	EReference getFacesConfigType_Converter();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getManagedBean <em>Managed Bean</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Managed Bean</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getManagedBean()
-	 * @see #getFacesConfigType()
-	 * @generated
-	 */
-	EReference getFacesConfigType_ManagedBean();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getName <em>Name</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Name</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getName()
-	 * @see #getFacesConfigType()
-	 * @generated
-	 */
-	EReference getFacesConfigType_Name();
-
-				/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getNavigationRule <em>Navigation Rule</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Navigation Rule</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getNavigationRule()
-	 * @see #getFacesConfigType()
-	 * @generated
-	 */
-	EReference getFacesConfigType_NavigationRule();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getReferencedBean <em>Referenced Bean</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Referenced Bean</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getReferencedBean()
-	 * @see #getFacesConfigType()
-	 * @generated
-	 */
-	EReference getFacesConfigType_ReferencedBean();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getRenderKit <em>Render Kit</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Render Kit</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getRenderKit()
-	 * @see #getFacesConfigType()
-	 * @generated
-	 */
-	EReference getFacesConfigType_RenderKit();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getLifecycle <em>Lifecycle</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Lifecycle</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getLifecycle()
-	 * @see #getFacesConfigType()
-	 * @generated
-	 */
-	EReference getFacesConfigType_Lifecycle();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getValidator <em>Validator</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Validator</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getValidator()
-	 * @see #getFacesConfigType()
-	 * @generated
-	 */
-	EReference getFacesConfigType_Validator();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getBehavior <em>Behavior</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Behavior</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getBehavior()
-	 * @see #getFacesConfigType()
-	 * @generated
-	 */
-	EReference getFacesConfigType_Behavior();
-
-				/**
-	 * Returns the meta object for the reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getFacesConfigExtension <em>Faces Config Extension</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for the reference list '<em>Faces Config Extension</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getFacesConfigExtension()
-	 * @see #getFacesConfigType()
-	 * @generated
-	 */
-    EReference getFacesConfigType_FacesConfigExtension();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getXmlns <em>Xmlns</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Xmlns</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getXmlns()
-	 * @see #getFacesConfigType()
-	 * @generated
-	 */
-	EAttribute getFacesConfigType_Xmlns();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getId()
-	 * @see #getFacesConfigType()
-	 * @generated
-	 */
-	EAttribute getFacesConfigType_Id();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#isMetadataComplete <em>Metadata Complete</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Metadata Complete</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#isMetadataComplete()
-	 * @see #getFacesConfigType()
-	 * @generated
-	 */
-	EAttribute getFacesConfigType_MetadataComplete();
-
-				/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.FacesContextFactoryType <em>Faces Context Factory Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Faces Context Factory Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesContextFactoryType
-	 * @generated
-	 */
-	EClass getFacesContextFactoryType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.FacesContextFactoryType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesContextFactoryType#getTextContent()
-	 * @see #getFacesContextFactoryType()
-	 * @generated
-	 */
-	EAttribute getFacesContextFactoryType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.FacesContextFactoryType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesContextFactoryType#getId()
-	 * @see #getFacesContextFactoryType()
-	 * @generated
-	 */
-	EAttribute getFacesContextFactoryType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.FacetExtensionType <em>Facet Extension Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Facet Extension Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacetExtensionType
-	 * @generated
-	 */
-	EClass getFacetExtensionType();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.FacetNameType <em>Facet Name Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Facet Name Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacetNameType
-	 * @generated
-	 */
-	EClass getFacetNameType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.FacetNameType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacetNameType#getTextContent()
-	 * @see #getFacetNameType()
-	 * @generated
-	 */
-	EAttribute getFacetNameType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.FacetNameType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacetNameType#getId()
-	 * @see #getFacetNameType()
-	 * @generated
-	 */
-	EAttribute getFacetNameType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.FacetType <em>Facet Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Facet Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacetType
-	 * @generated
-	 */
-	EClass getFacetType();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.FacetType#getDescription <em>Description</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Description</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacetType#getDescription()
-	 * @see #getFacetType()
-	 * @generated
-	 */
-	EReference getFacetType_Description();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.FacetType#getDisplayName <em>Display Name</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Display Name</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacetType#getDisplayName()
-	 * @see #getFacetType()
-	 * @generated
-	 */
-	EReference getFacetType_DisplayName();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.FacetType#getIcon <em>Icon</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Icon</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacetType#getIcon()
-	 * @see #getFacetType()
-	 * @generated
-	 */
-	EReference getFacetType_Icon();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.FacetType#getFacetName <em>Facet Name</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Facet Name</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacetType#getFacetName()
-	 * @see #getFacetType()
-	 * @generated
-	 */
-	EReference getFacetType_FacetName();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.FacetType#getFacetExtension <em>Facet Extension</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Facet Extension</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacetType#getFacetExtension()
-	 * @see #getFacetType()
-	 * @generated
-	 */
-	EReference getFacetType_FacetExtension();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.FacetType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacetType#getId()
-	 * @see #getFacetType()
-	 * @generated
-	 */
-	EAttribute getFacetType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.FactoryType <em>Factory Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Factory Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FactoryType
-	 * @generated
-	 */
-	EClass getFactoryType();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.FactoryType#getApplicationFactory <em>Application Factory</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Application Factory</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FactoryType#getApplicationFactory()
-	 * @see #getFactoryType()
-	 * @generated
-	 */
-	EReference getFactoryType_ApplicationFactory();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.FactoryType#getExceptionHandlerFactory <em>Exception Handler Factory</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Exception Handler Factory</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FactoryType#getExceptionHandlerFactory()
-	 * @see #getFactoryType()
-	 * @generated
-	 */
-	EReference getFactoryType_ExceptionHandlerFactory();
-
-				/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.FactoryType#getExternalContextFactory <em>External Context Factory</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>External Context Factory</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FactoryType#getExternalContextFactory()
-	 * @see #getFactoryType()
-	 * @generated
-	 */
-	EReference getFactoryType_ExternalContextFactory();
-
-				/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.FactoryType#getFacesContextFactory <em>Faces Context Factory</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Faces Context Factory</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FactoryType#getFacesContextFactory()
-	 * @see #getFactoryType()
-	 * @generated
-	 */
-	EReference getFactoryType_FacesContextFactory();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.FactoryType#getPartialViewContextFactory <em>Partial View Context Factory</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Partial View Context Factory</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FactoryType#getPartialViewContextFactory()
-	 * @see #getFactoryType()
-	 * @generated
-	 */
-	EReference getFactoryType_PartialViewContextFactory();
-
-				/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.FactoryType#getLifecycleFactory <em>Lifecycle Factory</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Lifecycle Factory</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FactoryType#getLifecycleFactory()
-	 * @see #getFactoryType()
-	 * @generated
-	 */
-	EReference getFactoryType_LifecycleFactory();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.FactoryType#getViewDeclarationLanguageFactory <em>View Declaration Language Factory</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>View Declaration Language Factory</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FactoryType#getViewDeclarationLanguageFactory()
-	 * @see #getFactoryType()
-	 * @generated
-	 */
-	EReference getFactoryType_ViewDeclarationLanguageFactory();
-
-				/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.FactoryType#getTagHandlerDelegateFactory <em>Tag Handler Delegate Factory</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Tag Handler Delegate Factory</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FactoryType#getTagHandlerDelegateFactory()
-	 * @see #getFactoryType()
-	 * @generated
-	 */
-	EReference getFactoryType_TagHandlerDelegateFactory();
-
-				/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.FactoryType#getRenderKitFactory <em>Render Kit Factory</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Render Kit Factory</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FactoryType#getRenderKitFactory()
-	 * @see #getFactoryType()
-	 * @generated
-	 */
-	EReference getFactoryType_RenderKitFactory();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.FactoryType#getVisitContextFactory <em>Visit Context Factory</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Visit Context Factory</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FactoryType#getVisitContextFactory()
-	 * @see #getFactoryType()
-	 * @generated
-	 */
-	EReference getFactoryType_VisitContextFactory();
-
-				/**
-	 * Returns the meta object for the reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.FactoryType#getFactoryExtension <em>Factory Extension</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for the reference list '<em>Factory Extension</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FactoryType#getFactoryExtension()
-	 * @see #getFactoryType()
-	 * @generated
-	 */
-    EReference getFactoryType_FactoryExtension();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.FactoryType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FactoryType#getId()
-	 * @see #getFactoryType()
-	 * @generated
-	 */
-	EAttribute getFactoryType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.FromActionType <em>From Action Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>From Action Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FromActionType
-	 * @generated
-	 */
-	EClass getFromActionType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.FromActionType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FromActionType#getTextContent()
-	 * @see #getFromActionType()
-	 * @generated
-	 */
-	EAttribute getFromActionType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.FromActionType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FromActionType#getId()
-	 * @see #getFromActionType()
-	 * @generated
-	 */
-	EAttribute getFromActionType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.FromOutcomeType <em>From Outcome Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>From Outcome Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FromOutcomeType
-	 * @generated
-	 */
-	EClass getFromOutcomeType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.FromOutcomeType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FromOutcomeType#getTextContent()
-	 * @see #getFromOutcomeType()
-	 * @generated
-	 */
-	EAttribute getFromOutcomeType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.FromOutcomeType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FromOutcomeType#getId()
-	 * @see #getFromOutcomeType()
-	 * @generated
-	 */
-	EAttribute getFromOutcomeType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.FromViewIdType <em>From View Id Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>From View Id Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FromViewIdType
-	 * @generated
-	 */
-	EClass getFromViewIdType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.FromViewIdType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FromViewIdType#getTextContent()
-	 * @see #getFromViewIdType()
-	 * @generated
-	 */
-	EAttribute getFromViewIdType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.FromViewIdType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FromViewIdType#getId()
-	 * @see #getFromViewIdType()
-	 * @generated
-	 */
-	EAttribute getFromViewIdType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.IconType <em>Icon Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Icon Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.IconType
-	 * @generated
-	 */
-	EClass getIconType();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.IconType#getSmallIcon <em>Small Icon</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Small Icon</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.IconType#getSmallIcon()
-	 * @see #getIconType()
-	 * @generated
-	 */
-	EReference getIconType_SmallIcon();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.IconType#getLargeIcon <em>Large Icon</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Large Icon</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.IconType#getLargeIcon()
-	 * @see #getIconType()
-	 * @generated
-	 */
-	EReference getIconType_LargeIcon();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.IconType#getLang <em>Lang</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Lang</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.IconType#getLang()
-	 * @see #getIconType()
-	 * @generated
-	 */
-	EAttribute getIconType_Lang();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.IconType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.IconType#getId()
-	 * @see #getIconType()
-	 * @generated
-	 */
-	EAttribute getIconType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.IfType <em>If Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>If Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.IfType
-	 * @generated
-	 */
-	EClass getIfType();
-
-				/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.IfType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.IfType#getTextContent()
-	 * @see #getIfType()
-	 * @generated
-	 */
-	EAttribute getIfType_TextContent();
-
-				/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.IfType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.IfType#getId()
-	 * @see #getIfType()
-	 * @generated
-	 */
-	EAttribute getIfType_Id();
-
-				/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.KeyClassType <em>Key Class Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Key Class Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.KeyClassType
-	 * @generated
-	 */
-	EClass getKeyClassType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.KeyClassType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.KeyClassType#getTextContent()
-	 * @see #getKeyClassType()
-	 * @generated
-	 */
-	EAttribute getKeyClassType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.KeyClassType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.KeyClassType#getId()
-	 * @see #getKeyClassType()
-	 * @generated
-	 */
-	EAttribute getKeyClassType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.KeyType <em>Key Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Key Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.KeyType
-	 * @generated
-	 */
-	EClass getKeyType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.KeyType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.KeyType#getTextContent()
-	 * @see #getKeyType()
-	 * @generated
-	 */
-	EAttribute getKeyType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.KeyType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.KeyType#getId()
-	 * @see #getKeyType()
-	 * @generated
-	 */
-	EAttribute getKeyType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.LargeIconType <em>Large Icon Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Large Icon Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.LargeIconType
-	 * @generated
-	 */
-	EClass getLargeIconType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.LargeIconType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.LargeIconType#getTextContent()
-	 * @see #getLargeIconType()
-	 * @generated
-	 */
-	EAttribute getLargeIconType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.LargeIconType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.LargeIconType#getId()
-	 * @see #getLargeIconType()
-	 * @generated
-	 */
-	EAttribute getLargeIconType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.LifecycleFactoryType <em>Lifecycle Factory Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Lifecycle Factory Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.LifecycleFactoryType
-	 * @generated
-	 */
-	EClass getLifecycleFactoryType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.LifecycleFactoryType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.LifecycleFactoryType#getTextContent()
-	 * @see #getLifecycleFactoryType()
-	 * @generated
-	 */
-	EAttribute getLifecycleFactoryType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.LifecycleFactoryType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.LifecycleFactoryType#getId()
-	 * @see #getLifecycleFactoryType()
-	 * @generated
-	 */
-	EAttribute getLifecycleFactoryType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.LifecycleType <em>Lifecycle Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Lifecycle Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.LifecycleType
-	 * @generated
-	 */
-	EClass getLifecycleType();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.LifecycleType#getPhaseListener <em>Phase Listener</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Phase Listener</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.LifecycleType#getPhaseListener()
-	 * @see #getLifecycleType()
-	 * @generated
-	 */
-	EReference getLifecycleType_PhaseListener();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.LifecycleType#getLifecycleExtension <em>Lifecycle Extension</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Lifecycle Extension</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.LifecycleType#getLifecycleExtension()
-	 * @see #getLifecycleType()
-	 * @generated
-	 */
-    EReference getLifecycleType_LifecycleExtension();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.LifecycleType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.LifecycleType#getId()
-	 * @see #getLifecycleType()
-	 * @generated
-	 */
-	EAttribute getLifecycleType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ListEntriesType <em>List Entries Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>List Entries Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ListEntriesType
-	 * @generated
-	 */
-	EClass getListEntriesType();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.ListEntriesType#getValueClass <em>Value Class</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Value Class</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ListEntriesType#getValueClass()
-	 * @see #getListEntriesType()
-	 * @generated
-	 */
-	EReference getListEntriesType_ValueClass();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ListEntriesType#getNullValue <em>Null Value</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Null Value</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ListEntriesType#getNullValue()
-	 * @see #getListEntriesType()
-	 * @generated
-	 */
-	EReference getListEntriesType_NullValue();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ListEntriesType#getValue <em>Value</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Value</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ListEntriesType#getValue()
-	 * @see #getListEntriesType()
-	 * @generated
-	 */
-	EReference getListEntriesType_Value();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ListEntriesType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ListEntriesType#getId()
-	 * @see #getListEntriesType()
-	 * @generated
-	 */
-	EAttribute getListEntriesType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.LocaleConfigType <em>Locale Config Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Locale Config Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.LocaleConfigType
-	 * @generated
-	 */
-	EClass getLocaleConfigType();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.LocaleConfigType#getDefaultLocale <em>Default Locale</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Default Locale</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.LocaleConfigType#getDefaultLocale()
-	 * @see #getLocaleConfigType()
-	 * @generated
-	 */
-	EReference getLocaleConfigType_DefaultLocale();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.LocaleConfigType#getSupportedLocale <em>Supported Locale</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Supported Locale</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.LocaleConfigType#getSupportedLocale()
-	 * @see #getLocaleConfigType()
-	 * @generated
-	 */
-	EReference getLocaleConfigType_SupportedLocale();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.LocaleConfigType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.LocaleConfigType#getId()
-	 * @see #getLocaleConfigType()
-	 * @generated
-	 */
-	EAttribute getLocaleConfigType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanClassType <em>Managed Bean Class Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Managed Bean Class Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanClassType
-	 * @generated
-	 */
-	EClass getManagedBeanClassType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanClassType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanClassType#getTextContent()
-	 * @see #getManagedBeanClassType()
-	 * @generated
-	 */
-	EAttribute getManagedBeanClassType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanClassType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanClassType#getId()
-	 * @see #getManagedBeanClassType()
-	 * @generated
-	 */
-	EAttribute getManagedBeanClassType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanNameType <em>Managed Bean Name Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Managed Bean Name Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanNameType
-	 * @generated
-	 */
-	EClass getManagedBeanNameType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanNameType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanNameType#getTextContent()
-	 * @see #getManagedBeanNameType()
-	 * @generated
-	 */
-	EAttribute getManagedBeanNameType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanNameType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanNameType#getId()
-	 * @see #getManagedBeanNameType()
-	 * @generated
-	 */
-	EAttribute getManagedBeanNameType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanScopeType <em>Managed Bean Scope Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Managed Bean Scope Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanScopeType
-	 * @generated
-	 */
-	EClass getManagedBeanScopeType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanScopeType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanScopeType#getTextContent()
-	 * @see #getManagedBeanScopeType()
-	 * @generated
-	 */
-	EAttribute getManagedBeanScopeType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanScopeType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanScopeType#getId()
-	 * @see #getManagedBeanScopeType()
-	 * @generated
-	 */
-	EAttribute getManagedBeanScopeType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType <em>Managed Bean Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Managed Bean Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType
-	 * @generated
-	 */
-	EClass getManagedBeanType();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getDescription <em>Description</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Description</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getDescription()
-	 * @see #getManagedBeanType()
-	 * @generated
-	 */
-	EReference getManagedBeanType_Description();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getDisplayName <em>Display Name</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Display Name</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getDisplayName()
-	 * @see #getManagedBeanType()
-	 * @generated
-	 */
-	EReference getManagedBeanType_DisplayName();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getIcon <em>Icon</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Icon</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getIcon()
-	 * @see #getManagedBeanType()
-	 * @generated
-	 */
-	EReference getManagedBeanType_Icon();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getManagedBeanName <em>Managed Bean Name</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Managed Bean Name</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getManagedBeanName()
-	 * @see #getManagedBeanType()
-	 * @generated
-	 */
-	EReference getManagedBeanType_ManagedBeanName();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getManagedBeanClass <em>Managed Bean Class</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Managed Bean Class</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getManagedBeanClass()
-	 * @see #getManagedBeanType()
-	 * @generated
-	 */
-	EReference getManagedBeanType_ManagedBeanClass();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getManagedBeanScope <em>Managed Bean Scope</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Managed Bean Scope</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getManagedBeanScope()
-	 * @see #getManagedBeanType()
-	 * @generated
-	 */
-	EReference getManagedBeanType_ManagedBeanScope();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getManagedProperty <em>Managed Property</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Managed Property</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getManagedProperty()
-	 * @see #getManagedBeanType()
-	 * @generated
-	 */
-	EReference getManagedBeanType_ManagedProperty();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getMapEntries <em>Map Entries</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Map Entries</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getMapEntries()
-	 * @see #getManagedBeanType()
-	 * @generated
-	 */
-	EReference getManagedBeanType_MapEntries();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getListEntries <em>List Entries</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>List Entries</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getListEntries()
-	 * @see #getManagedBeanType()
-	 * @generated
-	 */
-	EReference getManagedBeanType_ListEntries();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getManagedBeanExtension <em>Managed Bean Extension</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Managed Bean Extension</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getManagedBeanExtension()
-	 * @see #getManagedBeanType()
-	 * @generated
-	 */
-    EReference getManagedBeanType_ManagedBeanExtension();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getId()
-	 * @see #getManagedBeanType()
-	 * @generated
-	 */
-	EAttribute getManagedBeanType_Id();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#isEager <em>Eager</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Eager</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#isEager()
-	 * @see #getManagedBeanType()
-	 * @generated
-	 */
-	EAttribute getManagedBeanType_Eager();
-
-				/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType <em>Managed Property Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Managed Property Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType
-	 * @generated
-	 */
-	EClass getManagedPropertyType();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getDescription <em>Description</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Description</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getDescription()
-	 * @see #getManagedPropertyType()
-	 * @generated
-	 */
-	EReference getManagedPropertyType_Description();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getDisplayName <em>Display Name</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Display Name</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getDisplayName()
-	 * @see #getManagedPropertyType()
-	 * @generated
-	 */
-	EReference getManagedPropertyType_DisplayName();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getIcon <em>Icon</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Icon</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getIcon()
-	 * @see #getManagedPropertyType()
-	 * @generated
-	 */
-	EReference getManagedPropertyType_Icon();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getPropertyName <em>Property Name</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Property Name</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getPropertyName()
-	 * @see #getManagedPropertyType()
-	 * @generated
-	 */
-	EReference getManagedPropertyType_PropertyName();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getPropertyClass <em>Property Class</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Property Class</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getPropertyClass()
-	 * @see #getManagedPropertyType()
-	 * @generated
-	 */
-	EReference getManagedPropertyType_PropertyClass();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getMapEntries <em>Map Entries</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Map Entries</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getMapEntries()
-	 * @see #getManagedPropertyType()
-	 * @generated
-	 */
-	EReference getManagedPropertyType_MapEntries();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getNullValue <em>Null Value</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Null Value</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getNullValue()
-	 * @see #getManagedPropertyType()
-	 * @generated
-	 */
-	EReference getManagedPropertyType_NullValue();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getValue <em>Value</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Value</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getValue()
-	 * @see #getManagedPropertyType()
-	 * @generated
-	 */
-	EReference getManagedPropertyType_Value();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getListEntries <em>List Entries</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>List Entries</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getListEntries()
-	 * @see #getManagedPropertyType()
-	 * @generated
-	 */
-	EReference getManagedPropertyType_ListEntries();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getId()
-	 * @see #getManagedPropertyType()
-	 * @generated
-	 */
-	EAttribute getManagedPropertyType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.MapEntriesType <em>Map Entries Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Map Entries Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.MapEntriesType
-	 * @generated
-	 */
-	EClass getMapEntriesType();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.MapEntriesType#getKeyClass <em>Key Class</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Key Class</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.MapEntriesType#getKeyClass()
-	 * @see #getMapEntriesType()
-	 * @generated
-	 */
-	EReference getMapEntriesType_KeyClass();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.MapEntriesType#getValueClass <em>Value Class</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Value Class</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.MapEntriesType#getValueClass()
-	 * @see #getMapEntriesType()
-	 * @generated
-	 */
-	EReference getMapEntriesType_ValueClass();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.MapEntriesType#getMapEntry <em>Map Entry</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Map Entry</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.MapEntriesType#getMapEntry()
-	 * @see #getMapEntriesType()
-	 * @generated
-	 */
-	EReference getMapEntriesType_MapEntry();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.MapEntriesType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.MapEntriesType#getId()
-	 * @see #getMapEntriesType()
-	 * @generated
-	 */
-	EAttribute getMapEntriesType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.MapEntryType <em>Map Entry Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Map Entry Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.MapEntryType
-	 * @generated
-	 */
-	EClass getMapEntryType();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.MapEntryType#getKey <em>Key</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Key</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.MapEntryType#getKey()
-	 * @see #getMapEntryType()
-	 * @generated
-	 */
-	EReference getMapEntryType_Key();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.MapEntryType#getNullValue <em>Null Value</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Null Value</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.MapEntryType#getNullValue()
-	 * @see #getMapEntryType()
-	 * @generated
-	 */
-	EReference getMapEntryType_NullValue();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.MapEntryType#getValue <em>Value</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Value</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.MapEntryType#getValue()
-	 * @see #getMapEntryType()
-	 * @generated
-	 */
-	EReference getMapEntryType_Value();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.MapEntryType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.MapEntryType#getId()
-	 * @see #getMapEntryType()
-	 * @generated
-	 */
-	EAttribute getMapEntryType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.MessageBundleType <em>Message Bundle Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Message Bundle Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.MessageBundleType
-	 * @generated
-	 */
-	EClass getMessageBundleType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.MessageBundleType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.MessageBundleType#getTextContent()
-	 * @see #getMessageBundleType()
-	 * @generated
-	 */
-	EAttribute getMessageBundleType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.MessageBundleType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.MessageBundleType#getId()
-	 * @see #getMessageBundleType()
-	 * @generated
-	 */
-	EAttribute getMessageBundleType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.NameType <em>Name Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Name Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.NameType
-	 * @generated
-	 */
-	EClass getNameType();
-
-				/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.NameType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.NameType#getTextContent()
-	 * @see #getNameType()
-	 * @generated
-	 */
-	EAttribute getNameType_TextContent();
-
-				/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.NameType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.NameType#getId()
-	 * @see #getNameType()
-	 * @generated
-	 */
-	EAttribute getNameType_Id();
-
-				/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType <em>Navigation Case Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Navigation Case Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType
-	 * @generated
-	 */
-	EClass getNavigationCaseType();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType#getDescription <em>Description</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Description</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType#getDescription()
-	 * @see #getNavigationCaseType()
-	 * @generated
-	 */
-	EReference getNavigationCaseType_Description();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType#getDisplayName <em>Display Name</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Display Name</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType#getDisplayName()
-	 * @see #getNavigationCaseType()
-	 * @generated
-	 */
-	EReference getNavigationCaseType_DisplayName();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType#getIcon <em>Icon</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Icon</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType#getIcon()
-	 * @see #getNavigationCaseType()
-	 * @generated
-	 */
-	EReference getNavigationCaseType_Icon();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType#getFromAction <em>From Action</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>From Action</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType#getFromAction()
-	 * @see #getNavigationCaseType()
-	 * @generated
-	 */
-	EReference getNavigationCaseType_FromAction();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType#getFromOutcome <em>From Outcome</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>From Outcome</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType#getFromOutcome()
-	 * @see #getNavigationCaseType()
-	 * @generated
-	 */
-	EReference getNavigationCaseType_FromOutcome();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType#getIf <em>If</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>If</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType#getIf()
-	 * @see #getNavigationCaseType()
-	 * @generated
-	 */
-	EReference getNavigationCaseType_If();
-
-				/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType#getToViewId <em>To View Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>To View Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType#getToViewId()
-	 * @see #getNavigationCaseType()
-	 * @generated
-	 */
-	EReference getNavigationCaseType_ToViewId();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType#getRedirect <em>Redirect</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Redirect</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType#getRedirect()
-	 * @see #getNavigationCaseType()
-	 * @generated
-	 */
-	EReference getNavigationCaseType_Redirect();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType#getId()
-	 * @see #getNavigationCaseType()
-	 * @generated
-	 */
-	EAttribute getNavigationCaseType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationHandlerType <em>Navigation Handler Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Navigation Handler Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.NavigationHandlerType
-	 * @generated
-	 */
-	EClass getNavigationHandlerType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationHandlerType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.NavigationHandlerType#getTextContent()
-	 * @see #getNavigationHandlerType()
-	 * @generated
-	 */
-	EAttribute getNavigationHandlerType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationHandlerType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.NavigationHandlerType#getId()
-	 * @see #getNavigationHandlerType()
-	 * @generated
-	 */
-	EAttribute getNavigationHandlerType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType <em>Navigation Rule Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Navigation Rule Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType
-	 * @generated
-	 */
-	EClass getNavigationRuleType();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType#getDescription <em>Description</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Description</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType#getDescription()
-	 * @see #getNavigationRuleType()
-	 * @generated
-	 */
-	EReference getNavigationRuleType_Description();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType#getDisplayName <em>Display Name</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Display Name</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType#getDisplayName()
-	 * @see #getNavigationRuleType()
-	 * @generated
-	 */
-	EReference getNavigationRuleType_DisplayName();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType#getIcon <em>Icon</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Icon</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType#getIcon()
-	 * @see #getNavigationRuleType()
-	 * @generated
-	 */
-	EReference getNavigationRuleType_Icon();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType#getFromViewId <em>From View Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>From View Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType#getFromViewId()
-	 * @see #getNavigationRuleType()
-	 * @generated
-	 */
-	EReference getNavigationRuleType_FromViewId();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType#getNavigationCase <em>Navigation Case</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Navigation Case</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType#getNavigationCase()
-	 * @see #getNavigationRuleType()
-	 * @generated
-	 */
-	EReference getNavigationRuleType_NavigationCase();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType#getNavigationRuleExtension <em>Navigation Rule Extension</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Navigation Rule Extension</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType#getNavigationRuleExtension()
-	 * @see #getNavigationRuleType()
-	 * @generated
-	 */
-    EReference getNavigationRuleType_NavigationRuleExtension();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType#getId()
-	 * @see #getNavigationRuleType()
-	 * @generated
-	 */
-	EAttribute getNavigationRuleType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.NullValueType <em>Null Value Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Null Value Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.NullValueType
-	 * @generated
-	 */
-	EClass getNullValueType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.NullValueType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.NullValueType#getId()
-	 * @see #getNullValueType()
-	 * @generated
-	 */
-	EAttribute getNullValueType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.OrderingType <em>Ordering Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Ordering Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.OrderingType
-	 * @generated
-	 */
-	EClass getOrderingType();
-
-				/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.OrderingType#getBefore <em>Before</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Before</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.OrderingType#getBefore()
-	 * @see #getOrderingType()
-	 * @generated
-	 */
-	EReference getOrderingType_Before();
-
-				/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.OrderingType#getAfter <em>After</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>After</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.OrderingType#getAfter()
-	 * @see #getOrderingType()
-	 * @generated
-	 */
-	EReference getOrderingType_After();
-
-				/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.OrderingOrderingType <em>Ordering Ordering Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Ordering Ordering Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.OrderingOrderingType
-	 * @generated
-	 */
-	EClass getOrderingOrderingType();
-
-				/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.OrderingOrderingType#getName <em>Name</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Name</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.OrderingOrderingType#getName()
-	 * @see #getOrderingOrderingType()
-	 * @generated
-	 */
-	EReference getOrderingOrderingType_Name();
-
-				/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.OrderingOrderingType#getOthers <em>Others</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Others</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.OrderingOrderingType#getOthers()
-	 * @see #getOrderingOrderingType()
-	 * @generated
-	 */
-	EReference getOrderingOrderingType_Others();
-
-				/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.OrderingOthersType <em>Ordering Others Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Ordering Others Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.OrderingOthersType
-	 * @generated
-	 */
-	EClass getOrderingOthersType();
-
-				/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.OrderingOthersType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.OrderingOthersType#getId()
-	 * @see #getOrderingOthersType()
-	 * @generated
-	 */
-	EAttribute getOrderingOthersType_Id();
-
-				/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.PartialViewContextFactoryType <em>Partial View Context Factory Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Partial View Context Factory Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.PartialViewContextFactoryType
-	 * @generated
-	 */
-	EClass getPartialViewContextFactoryType();
-
-				/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.PartialViewContextFactoryType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.PartialViewContextFactoryType#getTextContent()
-	 * @see #getPartialViewContextFactoryType()
-	 * @generated
-	 */
-	EAttribute getPartialViewContextFactoryType_TextContent();
-
-				/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.PartialViewContextFactoryType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.PartialViewContextFactoryType#getId()
-	 * @see #getPartialViewContextFactoryType()
-	 * @generated
-	 */
-	EAttribute getPartialViewContextFactoryType_Id();
-
-				/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.PhaseListenerType <em>Phase Listener Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Phase Listener Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.PhaseListenerType
-	 * @generated
-	 */
-	EClass getPhaseListenerType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.PhaseListenerType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.PhaseListenerType#getTextContent()
-	 * @see #getPhaseListenerType()
-	 * @generated
-	 */
-	EAttribute getPhaseListenerType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.PhaseListenerType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.PhaseListenerType#getId()
-	 * @see #getPhaseListenerType()
-	 * @generated
-	 */
-	EAttribute getPhaseListenerType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyClassType <em>Property Class Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Property Class Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.PropertyClassType
-	 * @generated
-	 */
-	EClass getPropertyClassType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyClassType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.PropertyClassType#getTextContent()
-	 * @see #getPropertyClassType()
-	 * @generated
-	 */
-	EAttribute getPropertyClassType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyClassType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.PropertyClassType#getId()
-	 * @see #getPropertyClassType()
-	 * @generated
-	 */
-	EAttribute getPropertyClassType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyExtensionType <em>Property Extension Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Property Extension Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.PropertyExtensionType
-	 * @generated
-	 */
-	EClass getPropertyExtensionType();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyNameType <em>Property Name Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Property Name Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.PropertyNameType
-	 * @generated
-	 */
-	EClass getPropertyNameType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyNameType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.PropertyNameType#getTextContent()
-	 * @see #getPropertyNameType()
-	 * @generated
-	 */
-	EAttribute getPropertyNameType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyNameType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.PropertyNameType#getId()
-	 * @see #getPropertyNameType()
-	 * @generated
-	 */
-	EAttribute getPropertyNameType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyResolverType <em>Property Resolver Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Property Resolver Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.PropertyResolverType
-	 * @generated
-	 */
-	EClass getPropertyResolverType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyResolverType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.PropertyResolverType#getTextContent()
-	 * @see #getPropertyResolverType()
-	 * @generated
-	 */
-	EAttribute getPropertyResolverType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyResolverType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.PropertyResolverType#getId()
-	 * @see #getPropertyResolverType()
-	 * @generated
-	 */
-	EAttribute getPropertyResolverType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyType <em>Property Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Property Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.PropertyType
-	 * @generated
-	 */
-	EClass getPropertyType();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyType#getDescription <em>Description</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Description</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.PropertyType#getDescription()
-	 * @see #getPropertyType()
-	 * @generated
-	 */
-	EReference getPropertyType_Description();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyType#getDisplayName <em>Display Name</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Display Name</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.PropertyType#getDisplayName()
-	 * @see #getPropertyType()
-	 * @generated
-	 */
-	EReference getPropertyType_DisplayName();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyType#getIcon <em>Icon</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Icon</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.PropertyType#getIcon()
-	 * @see #getPropertyType()
-	 * @generated
-	 */
-	EReference getPropertyType_Icon();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyType#getPropertyName <em>Property Name</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Property Name</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.PropertyType#getPropertyName()
-	 * @see #getPropertyType()
-	 * @generated
-	 */
-	EReference getPropertyType_PropertyName();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyType#getPropertyClass <em>Property Class</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Property Class</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.PropertyType#getPropertyClass()
-	 * @see #getPropertyType()
-	 * @generated
-	 */
-	EReference getPropertyType_PropertyClass();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyType#getDefaultValue <em>Default Value</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Default Value</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.PropertyType#getDefaultValue()
-	 * @see #getPropertyType()
-	 * @generated
-	 */
-	EReference getPropertyType_DefaultValue();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyType#getSuggestedValue <em>Suggested Value</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Suggested Value</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.PropertyType#getSuggestedValue()
-	 * @see #getPropertyType()
-	 * @generated
-	 */
-	EReference getPropertyType_SuggestedValue();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyType#getPropertyExtension <em>Property Extension</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Property Extension</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.PropertyType#getPropertyExtension()
-	 * @see #getPropertyType()
-	 * @generated
-	 */
-	EReference getPropertyType_PropertyExtension();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.PropertyType#getId()
-	 * @see #getPropertyType()
-	 * @generated
-	 */
-	EAttribute getPropertyType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.RedirectType <em>Redirect Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Redirect Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RedirectType
-	 * @generated
-	 */
-	EClass getRedirectType();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.RedirectType#getViewParam <em>View Param</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>View Param</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RedirectType#getViewParam()
-	 * @see #getRedirectType()
-	 * @generated
-	 */
-	EReference getRedirectType_ViewParam();
-
-				/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.RedirectType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RedirectType#getId()
-	 * @see #getRedirectType()
-	 * @generated
-	 */
-	EAttribute getRedirectType_Id();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.RedirectType#isIncludeViewParams <em>Include View Params</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Include View Params</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RedirectType#isIncludeViewParams()
-	 * @see #getRedirectType()
-	 * @generated
-	 */
-	EAttribute getRedirectType_IncludeViewParams();
-
-				/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.RedirectViewParamType <em>Redirect View Param Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Redirect View Param Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RedirectViewParamType
-	 * @generated
-	 */
-	EClass getRedirectViewParamType();
-
-				/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.RedirectViewParamType#getName <em>Name</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Name</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RedirectViewParamType#getName()
-	 * @see #getRedirectViewParamType()
-	 * @generated
-	 */
-	EReference getRedirectViewParamType_Name();
-
-				/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.RedirectViewParamType#getValue <em>Value</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Value</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RedirectViewParamType#getValue()
-	 * @see #getRedirectViewParamType()
-	 * @generated
-	 */
-	EReference getRedirectViewParamType_Value();
-
-				/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.RedirectViewParamType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RedirectViewParamType#getId()
-	 * @see #getRedirectViewParamType()
-	 * @generated
-	 */
-	EAttribute getRedirectViewParamType_Id();
-
-				/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanClassType <em>Referenced Bean Class Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Referenced Bean Class Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanClassType
-	 * @generated
-	 */
-	EClass getReferencedBeanClassType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanClassType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanClassType#getTextContent()
-	 * @see #getReferencedBeanClassType()
-	 * @generated
-	 */
-	EAttribute getReferencedBeanClassType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanClassType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanClassType#getId()
-	 * @see #getReferencedBeanClassType()
-	 * @generated
-	 */
-	EAttribute getReferencedBeanClassType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanNameType <em>Referenced Bean Name Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Referenced Bean Name Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanNameType
-	 * @generated
-	 */
-	EClass getReferencedBeanNameType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanNameType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanNameType#getTextContent()
-	 * @see #getReferencedBeanNameType()
-	 * @generated
-	 */
-	EAttribute getReferencedBeanNameType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanNameType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanNameType#getId()
-	 * @see #getReferencedBeanNameType()
-	 * @generated
-	 */
-	EAttribute getReferencedBeanNameType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanType <em>Referenced Bean Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Referenced Bean Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanType
-	 * @generated
-	 */
-	EClass getReferencedBeanType();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanType#getDescription <em>Description</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Description</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanType#getDescription()
-	 * @see #getReferencedBeanType()
-	 * @generated
-	 */
-	EReference getReferencedBeanType_Description();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanType#getDisplayName <em>Display Name</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Display Name</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanType#getDisplayName()
-	 * @see #getReferencedBeanType()
-	 * @generated
-	 */
-	EReference getReferencedBeanType_DisplayName();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanType#getIcon <em>Icon</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Icon</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanType#getIcon()
-	 * @see #getReferencedBeanType()
-	 * @generated
-	 */
-	EReference getReferencedBeanType_Icon();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanType#getReferencedBeanName <em>Referenced Bean Name</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Referenced Bean Name</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanType#getReferencedBeanName()
-	 * @see #getReferencedBeanType()
-	 * @generated
-	 */
-	EReference getReferencedBeanType_ReferencedBeanName();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanType#getReferencedBeanClass <em>Referenced Bean Class</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Referenced Bean Class</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanType#getReferencedBeanClass()
-	 * @see #getReferencedBeanType()
-	 * @generated
-	 */
-	EReference getReferencedBeanType_ReferencedBeanClass();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanType#getId()
-	 * @see #getReferencedBeanType()
-	 * @generated
-	 */
-	EAttribute getReferencedBeanType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.RendererClassType <em>Renderer Class Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Renderer Class Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RendererClassType
-	 * @generated
-	 */
-	EClass getRendererClassType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.RendererClassType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RendererClassType#getTextContent()
-	 * @see #getRendererClassType()
-	 * @generated
-	 */
-	EAttribute getRendererClassType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.RendererClassType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RendererClassType#getId()
-	 * @see #getRendererClassType()
-	 * @generated
-	 */
-	EAttribute getRendererClassType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.RendererExtensionType <em>Renderer Extension Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Renderer Extension Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RendererExtensionType
-	 * @generated
-	 */
-	EClass getRendererExtensionType();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.RendererType <em>Renderer Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Renderer Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RendererType
-	 * @generated
-	 */
-	EClass getRendererType();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.RendererType#getDescription <em>Description</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Description</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RendererType#getDescription()
-	 * @see #getRendererType()
-	 * @generated
-	 */
-	EReference getRendererType_Description();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.RendererType#getDisplayName <em>Display Name</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Display Name</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RendererType#getDisplayName()
-	 * @see #getRendererType()
-	 * @generated
-	 */
-	EReference getRendererType_DisplayName();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.RendererType#getIcon <em>Icon</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Icon</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RendererType#getIcon()
-	 * @see #getRendererType()
-	 * @generated
-	 */
-	EReference getRendererType_Icon();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.RendererType#getComponentFamily <em>Component Family</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Component Family</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RendererType#getComponentFamily()
-	 * @see #getRendererType()
-	 * @generated
-	 */
-	EReference getRendererType_ComponentFamily();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.RendererType#getRendererType <em>Renderer Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Renderer Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RendererType#getRendererType()
-	 * @see #getRendererType()
-	 * @generated
-	 */
-	EReference getRendererType_RendererType();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.RendererType#getRendererClass <em>Renderer Class</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Renderer Class</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RendererType#getRendererClass()
-	 * @see #getRendererType()
-	 * @generated
-	 */
-	EReference getRendererType_RendererClass();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.RendererType#getFacet <em>Facet</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Facet</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RendererType#getFacet()
-	 * @see #getRendererType()
-	 * @generated
-	 */
-	EReference getRendererType_Facet();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.RendererType#getAttribute <em>Attribute</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Attribute</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RendererType#getAttribute()
-	 * @see #getRendererType()
-	 * @generated
-	 */
-	EReference getRendererType_Attribute();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.RendererType#getRendererExtension <em>Renderer Extension</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Renderer Extension</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RendererType#getRendererExtension()
-	 * @see #getRendererType()
-	 * @generated
-	 */
-	EReference getRendererType_RendererExtension();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.RendererType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RendererType#getId()
-	 * @see #getRendererType()
-	 * @generated
-	 */
-	EAttribute getRendererType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.RendererTypeType <em>Renderer Type Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Renderer Type Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RendererTypeType
-	 * @generated
-	 */
-	EClass getRendererTypeType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.RendererTypeType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RendererTypeType#getTextContent()
-	 * @see #getRendererTypeType()
-	 * @generated
-	 */
-	EAttribute getRendererTypeType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.RendererTypeType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RendererTypeType#getId()
-	 * @see #getRendererTypeType()
-	 * @generated
-	 */
-	EAttribute getRendererTypeType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitClassType <em>Render Kit Class Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Render Kit Class Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RenderKitClassType
-	 * @generated
-	 */
-	EClass getRenderKitClassType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitClassType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RenderKitClassType#getTextContent()
-	 * @see #getRenderKitClassType()
-	 * @generated
-	 */
-	EAttribute getRenderKitClassType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitClassType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RenderKitClassType#getId()
-	 * @see #getRenderKitClassType()
-	 * @generated
-	 */
-	EAttribute getRenderKitClassType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitFactoryType <em>Render Kit Factory Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Render Kit Factory Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RenderKitFactoryType
-	 * @generated
-	 */
-	EClass getRenderKitFactoryType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitFactoryType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RenderKitFactoryType#getTextContent()
-	 * @see #getRenderKitFactoryType()
-	 * @generated
-	 */
-	EAttribute getRenderKitFactoryType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitFactoryType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RenderKitFactoryType#getId()
-	 * @see #getRenderKitFactoryType()
-	 * @generated
-	 */
-	EAttribute getRenderKitFactoryType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitIdType <em>Render Kit Id Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Render Kit Id Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RenderKitIdType
-	 * @generated
-	 */
-	EClass getRenderKitIdType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitIdType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RenderKitIdType#getTextContent()
-	 * @see #getRenderKitIdType()
-	 * @generated
-	 */
-	EAttribute getRenderKitIdType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitIdType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RenderKitIdType#getId()
-	 * @see #getRenderKitIdType()
-	 * @generated
-	 */
-	EAttribute getRenderKitIdType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitType <em>Render Kit Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Render Kit Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RenderKitType
-	 * @generated
-	 */
-	EClass getRenderKitType();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitType#getDescription <em>Description</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Description</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RenderKitType#getDescription()
-	 * @see #getRenderKitType()
-	 * @generated
-	 */
-	EReference getRenderKitType_Description();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitType#getDisplayName <em>Display Name</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Display Name</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RenderKitType#getDisplayName()
-	 * @see #getRenderKitType()
-	 * @generated
-	 */
-	EReference getRenderKitType_DisplayName();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitType#getIcon <em>Icon</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Icon</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RenderKitType#getIcon()
-	 * @see #getRenderKitType()
-	 * @generated
-	 */
-	EReference getRenderKitType_Icon();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitType#getRenderKitId <em>Render Kit Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Render Kit Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RenderKitType#getRenderKitId()
-	 * @see #getRenderKitType()
-	 * @generated
-	 */
-	EReference getRenderKitType_RenderKitId();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitType#getRenderKitClass <em>Render Kit Class</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Render Kit Class</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RenderKitType#getRenderKitClass()
-	 * @see #getRenderKitType()
-	 * @generated
-	 */
-	EReference getRenderKitType_RenderKitClass();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitType#getRenderer <em>Renderer</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Renderer</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RenderKitType#getRenderer()
-	 * @see #getRenderKitType()
-	 * @generated
-	 */
-	EReference getRenderKitType_Renderer();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitType#getClientBehaviorRenderer <em>Client Behavior Renderer</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Client Behavior Renderer</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RenderKitType#getClientBehaviorRenderer()
-	 * @see #getRenderKitType()
-	 * @generated
-	 */
-	EReference getRenderKitType_ClientBehaviorRenderer();
-
-				/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitType#getRenderKitExtension <em>Render Kit Extension</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Render Kit Extension</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RenderKitType#getRenderKitExtension()
-	 * @see #getRenderKitType()
-	 * @generated
-	 */
-    EReference getRenderKitType_RenderKitExtension();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RenderKitType#getId()
-	 * @see #getRenderKitType()
-	 * @generated
-	 */
-	EAttribute getRenderKitType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.SmallIconType <em>Small Icon Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Small Icon Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.SmallIconType
-	 * @generated
-	 */
-	EClass getSmallIconType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.SmallIconType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.SmallIconType#getTextContent()
-	 * @see #getSmallIconType()
-	 * @generated
-	 */
-	EAttribute getSmallIconType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.SmallIconType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.SmallIconType#getId()
-	 * @see #getSmallIconType()
-	 * @generated
-	 */
-	EAttribute getSmallIconType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.SourceClassType <em>Source Class Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Source Class Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.SourceClassType
-	 * @generated
-	 */
-	EClass getSourceClassType();
-
-				/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.SourceClassType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.SourceClassType#getTextContent()
-	 * @see #getSourceClassType()
-	 * @generated
-	 */
-	EAttribute getSourceClassType_TextContent();
-
-				/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.SourceClassType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.SourceClassType#getId()
-	 * @see #getSourceClassType()
-	 * @generated
-	 */
-	EAttribute getSourceClassType_Id();
-
-				/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.StateManagerType <em>State Manager Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>State Manager Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.StateManagerType
-	 * @generated
-	 */
-	EClass getStateManagerType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.StateManagerType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.StateManagerType#getTextContent()
-	 * @see #getStateManagerType()
-	 * @generated
-	 */
-	EAttribute getStateManagerType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.StateManagerType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.StateManagerType#getId()
-	 * @see #getStateManagerType()
-	 * @generated
-	 */
-	EAttribute getStateManagerType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.SuggestedValueType <em>Suggested Value Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Suggested Value Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.SuggestedValueType
-	 * @generated
-	 */
-	EClass getSuggestedValueType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.SuggestedValueType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.SuggestedValueType#getTextContent()
-	 * @see #getSuggestedValueType()
-	 * @generated
-	 */
-	EAttribute getSuggestedValueType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.SuggestedValueType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.SuggestedValueType#getId()
-	 * @see #getSuggestedValueType()
-	 * @generated
-	 */
-	EAttribute getSuggestedValueType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.SupportedLocaleType <em>Supported Locale Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Supported Locale Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.SupportedLocaleType
-	 * @generated
-	 */
-	EClass getSupportedLocaleType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.SupportedLocaleType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.SupportedLocaleType#getTextContent()
-	 * @see #getSupportedLocaleType()
-	 * @generated
-	 */
-	EAttribute getSupportedLocaleType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.SupportedLocaleType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.SupportedLocaleType#getId()
-	 * @see #getSupportedLocaleType()
-	 * @generated
-	 */
-	EAttribute getSupportedLocaleType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.SystemEventClassType <em>System Event Class Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>System Event Class Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.SystemEventClassType
-	 * @generated
-	 */
-	EClass getSystemEventClassType();
-
-				/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.SystemEventClassType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.SystemEventClassType#getTextContent()
-	 * @see #getSystemEventClassType()
-	 * @generated
-	 */
-	EAttribute getSystemEventClassType_TextContent();
-
-				/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.SystemEventClassType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.SystemEventClassType#getId()
-	 * @see #getSystemEventClassType()
-	 * @generated
-	 */
-	EAttribute getSystemEventClassType_Id();
-
-				/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.SystemEventListenerClassType <em>System Event Listener Class Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>System Event Listener Class Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.SystemEventListenerClassType
-	 * @generated
-	 */
-	EClass getSystemEventListenerClassType();
-
-				/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.SystemEventListenerClassType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.SystemEventListenerClassType#getTextContent()
-	 * @see #getSystemEventListenerClassType()
-	 * @generated
-	 */
-	EAttribute getSystemEventListenerClassType_TextContent();
-
-				/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.SystemEventListenerClassType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.SystemEventListenerClassType#getId()
-	 * @see #getSystemEventListenerClassType()
-	 * @generated
-	 */
-	EAttribute getSystemEventListenerClassType_Id();
-
-				/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.SystemEventListenerType <em>System Event Listener Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>System Event Listener Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.SystemEventListenerType
-	 * @generated
-	 */
-	EClass getSystemEventListenerType();
-
-				/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.SystemEventListenerType#getSystemEventListenerClass <em>System Event Listener Class</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>System Event Listener Class</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.SystemEventListenerType#getSystemEventListenerClass()
-	 * @see #getSystemEventListenerType()
-	 * @generated
-	 */
-	EReference getSystemEventListenerType_SystemEventListenerClass();
-
-				/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.SystemEventListenerType#getSystemEventClass <em>System Event Class</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>System Event Class</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.SystemEventListenerType#getSystemEventClass()
-	 * @see #getSystemEventListenerType()
-	 * @generated
-	 */
-	EReference getSystemEventListenerType_SystemEventClass();
-
-				/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.SystemEventListenerType#getSourceClass <em>Source Class</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Source Class</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.SystemEventListenerType#getSourceClass()
-	 * @see #getSystemEventListenerType()
-	 * @generated
-	 */
-	EReference getSystemEventListenerType_SourceClass();
-
-				/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.SystemEventListenerType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.SystemEventListenerType#getId()
-	 * @see #getSystemEventListenerType()
-	 * @generated
-	 */
-	EAttribute getSystemEventListenerType_Id();
-
-				/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.TagHandlerDelegateFactoryType <em>Tag Handler Delegate Factory Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Tag Handler Delegate Factory Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.TagHandlerDelegateFactoryType
-	 * @generated
-	 */
-	EClass getTagHandlerDelegateFactoryType();
-
-				/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.TagHandlerDelegateFactoryType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.TagHandlerDelegateFactoryType#getTextContent()
-	 * @see #getTagHandlerDelegateFactoryType()
-	 * @generated
-	 */
-	EAttribute getTagHandlerDelegateFactoryType_TextContent();
-
-				/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.TagHandlerDelegateFactoryType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.TagHandlerDelegateFactoryType#getId()
-	 * @see #getTagHandlerDelegateFactoryType()
-	 * @generated
-	 */
-	EAttribute getTagHandlerDelegateFactoryType_Id();
-
-				/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ToViewIdType <em>To View Id Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>To View Id Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ToViewIdType
-	 * @generated
-	 */
-	EClass getToViewIdType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ToViewIdType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ToViewIdType#getTextContent()
-	 * @see #getToViewIdType()
-	 * @generated
-	 */
-	EAttribute getToViewIdType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ToViewIdType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ToViewIdType#getId()
-	 * @see #getToViewIdType()
-	 * @generated
-	 */
-	EAttribute getToViewIdType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorClassType <em>Validator Class Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Validator Class Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ValidatorClassType
-	 * @generated
-	 */
-	EClass getValidatorClassType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorClassType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ValidatorClassType#getTextContent()
-	 * @see #getValidatorClassType()
-	 * @generated
-	 */
-	EAttribute getValidatorClassType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorClassType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ValidatorClassType#getId()
-	 * @see #getValidatorClassType()
-	 * @generated
-	 */
-	EAttribute getValidatorClassType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorIdType <em>Validator Id Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Validator Id Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ValidatorIdType
-	 * @generated
-	 */
-	EClass getValidatorIdType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorIdType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ValidatorIdType#getTextContent()
-	 * @see #getValidatorIdType()
-	 * @generated
-	 */
-	EAttribute getValidatorIdType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorIdType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ValidatorIdType#getId()
-	 * @see #getValidatorIdType()
-	 * @generated
-	 */
-	EAttribute getValidatorIdType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorType <em>Validator Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Validator Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ValidatorType
-	 * @generated
-	 */
-	EClass getValidatorType();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorType#getDescription <em>Description</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Description</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ValidatorType#getDescription()
-	 * @see #getValidatorType()
-	 * @generated
-	 */
-	EReference getValidatorType_Description();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorType#getDisplayName <em>Display Name</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Display Name</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ValidatorType#getDisplayName()
-	 * @see #getValidatorType()
-	 * @generated
-	 */
-	EReference getValidatorType_DisplayName();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorType#getIcon <em>Icon</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Icon</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ValidatorType#getIcon()
-	 * @see #getValidatorType()
-	 * @generated
-	 */
-	EReference getValidatorType_Icon();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorType#getValidatorId <em>Validator Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Validator Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ValidatorType#getValidatorId()
-	 * @see #getValidatorType()
-	 * @generated
-	 */
-	EReference getValidatorType_ValidatorId();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorType#getValidatorClass <em>Validator Class</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Validator Class</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ValidatorType#getValidatorClass()
-	 * @see #getValidatorType()
-	 * @generated
-	 */
-	EReference getValidatorType_ValidatorClass();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorType#getAttribute <em>Attribute</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Attribute</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ValidatorType#getAttribute()
-	 * @see #getValidatorType()
-	 * @generated
-	 */
-	EReference getValidatorType_Attribute();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorType#getProperty <em>Property</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Property</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ValidatorType#getProperty()
-	 * @see #getValidatorType()
-	 * @generated
-	 */
-	EReference getValidatorType_Property();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorType#getValidatorExtension <em>Validator Extension</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Validator Extension</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ValidatorType#getValidatorExtension()
-	 * @see #getValidatorType()
-	 * @generated
-	 */
-    EReference getValidatorType_ValidatorExtension();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ValidatorType#getId()
-	 * @see #getValidatorType()
-	 * @generated
-	 */
-	EAttribute getValidatorType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ValueClassType <em>Value Class Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Value Class Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ValueClassType
-	 * @generated
-	 */
-	EClass getValueClassType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ValueClassType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ValueClassType#getTextContent()
-	 * @see #getValueClassType()
-	 * @generated
-	 */
-	EAttribute getValueClassType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ValueClassType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ValueClassType#getId()
-	 * @see #getValueClassType()
-	 * @generated
-	 */
-	EAttribute getValueClassType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ValueType <em>Value Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Value Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ValueType
-	 * @generated
-	 */
-	EClass getValueType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ValueType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ValueType#getTextContent()
-	 * @see #getValueType()
-	 * @generated
-	 */
-	EAttribute getValueType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ValueType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ValueType#getId()
-	 * @see #getValueType()
-	 * @generated
-	 */
-	EAttribute getValueType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.VariableResolverType <em>Variable Resolver Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Variable Resolver Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.VariableResolverType
-	 * @generated
-	 */
-	EClass getVariableResolverType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.VariableResolverType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.VariableResolverType#getTextContent()
-	 * @see #getVariableResolverType()
-	 * @generated
-	 */
-	EAttribute getVariableResolverType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.VariableResolverType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.VariableResolverType#getId()
-	 * @see #getVariableResolverType()
-	 * @generated
-	 */
-	EAttribute getVariableResolverType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ViewHandlerType <em>View Handler Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>View Handler Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ViewHandlerType
-	 * @generated
-	 */
-	EClass getViewHandlerType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ViewHandlerType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ViewHandlerType#getTextContent()
-	 * @see #getViewHandlerType()
-	 * @generated
-	 */
-	EAttribute getViewHandlerType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ViewHandlerType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ViewHandlerType#getId()
-	 * @see #getViewHandlerType()
-	 * @generated
-	 */
-	EAttribute getViewHandlerType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ResourceBundleType <em>Resource Bundle Type</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Resource Bundle Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ResourceBundleType
-	 * @generated
-	 */
-    EClass getResourceBundleType();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ResourceBundleType#getDescription <em>Description</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Description</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ResourceBundleType#getDescription()
-	 * @see #getResourceBundleType()
-	 * @generated
-	 */
-    EReference getResourceBundleType_Description();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ResourceBundleType#getDisplayName <em>Display Name</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Display Name</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ResourceBundleType#getDisplayName()
-	 * @see #getResourceBundleType()
-	 * @generated
-	 */
-    EReference getResourceBundleType_DisplayName();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ResourceBundleType#getIcon <em>Icon</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Icon</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ResourceBundleType#getIcon()
-	 * @see #getResourceBundleType()
-	 * @generated
-	 */
-    EReference getResourceBundleType_Icon();
-
-    /**
-	 * Returns the meta object for the reference '{@link org.eclipse.jst.jsf.facesconfig.emf.ResourceBundleType#getBaseName <em>Base Name</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for the reference '<em>Base Name</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ResourceBundleType#getBaseName()
-	 * @see #getResourceBundleType()
-	 * @generated
-	 */
-    EReference getResourceBundleType_BaseName();
-
-    /**
-	 * Returns the meta object for the reference '{@link org.eclipse.jst.jsf.facesconfig.emf.ResourceBundleType#getVar <em>Var</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for the reference '<em>Var</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ResourceBundleType#getVar()
-	 * @see #getResourceBundleType()
-	 * @generated
-	 */
-    EReference getResourceBundleType_Var();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ResourceBundleType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ResourceBundleType#getId()
-	 * @see #getResourceBundleType()
-	 * @generated
-	 */
-    EAttribute getResourceBundleType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.BaseNameType <em>Base Name Type</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Base Name Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.BaseNameType
-	 * @generated
-	 */
-    EClass getBaseNameType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.BaseNameType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.BaseNameType#getTextContent()
-	 * @see #getBaseNameType()
-	 * @generated
-	 */
-    EAttribute getBaseNameType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.BaseNameType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.BaseNameType#getId()
-	 * @see #getBaseNameType()
-	 * @generated
-	 */
-    EAttribute getBaseNameType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.VarType <em>Var Type</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Var Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.VarType
-	 * @generated
-	 */
-    EClass getVarType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.VarType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.VarType#getTextContent()
-	 * @see #getVarType()
-	 * @generated
-	 */
-    EAttribute getVarType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.VarType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.VarType#getId()
-	 * @see #getVarType()
-	 * @generated
-	 */
-    EAttribute getVarType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ViewDeclarationLanguageFactoryType <em>View Declaration Language Factory Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>View Declaration Language Factory Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ViewDeclarationLanguageFactoryType
-	 * @generated
-	 */
-	EClass getViewDeclarationLanguageFactoryType();
-
-				/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ViewDeclarationLanguageFactoryType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ViewDeclarationLanguageFactoryType#getTextContent()
-	 * @see #getViewDeclarationLanguageFactoryType()
-	 * @generated
-	 */
-	EAttribute getViewDeclarationLanguageFactoryType_TextContent();
-
-				/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ViewDeclarationLanguageFactoryType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ViewDeclarationLanguageFactoryType#getId()
-	 * @see #getViewDeclarationLanguageFactoryType()
-	 * @generated
-	 */
-	EAttribute getViewDeclarationLanguageFactoryType_Id();
-
-				/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.VisitContextFactoryType <em>Visit Context Factory Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Visit Context Factory Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.VisitContextFactoryType
-	 * @generated
-	 */
-	EClass getVisitContextFactoryType();
-
-				/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.VisitContextFactoryType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.VisitContextFactoryType#getTextContent()
-	 * @see #getVisitContextFactoryType()
-	 * @generated
-	 */
-	EAttribute getVisitContextFactoryType_TextContent();
-
-				/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.VisitContextFactoryType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.VisitContextFactoryType#getId()
-	 * @see #getVisitContextFactoryType()
-	 * @generated
-	 */
-	EAttribute getVisitContextFactoryType_Id();
-
-				/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitExtensionType <em>Render Kit Extension Type</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Render Kit Extension Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RenderKitExtensionType
-	 * @generated
-	 */
-    EClass getRenderKitExtensionType();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ResourceHandlerType <em>Resource Handler Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Resource Handler Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ResourceHandlerType
-	 * @generated
-	 */
-	EClass getResourceHandlerType();
-
-				/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ResourceHandlerType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ResourceHandlerType#getTextContent()
-	 * @see #getResourceHandlerType()
-	 * @generated
-	 */
-	EAttribute getResourceHandlerType_TextContent();
-
-				/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ResourceHandlerType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ResourceHandlerType#getId()
-	 * @see #getResourceHandlerType()
-	 * @generated
-	 */
-	EAttribute getResourceHandlerType_Id();
-
-				/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleExtensionType <em>Navigation Rule Extension Type</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Navigation Rule Extension Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleExtensionType
-	 * @generated
-	 */
-    EClass getNavigationRuleExtensionType();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorExtensionType <em>Validator Extension Type</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Validator Extension Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ValidatorExtensionType
-	 * @generated
-	 */
-    EClass getValidatorExtensionType();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigExtensionType <em>Extension Type</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Extension Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigExtensionType
-	 * @generated
-	 */
-    EClass getFacesConfigExtensionType();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.FactoryExtensionType <em>Factory Extension Type</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Factory Extension Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FactoryExtensionType
-	 * @generated
-	 */
-    EClass getFactoryExtensionType();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.LifecycleExtensionType <em>Lifecycle Extension Type</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Lifecycle Extension Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.LifecycleExtensionType
-	 * @generated
-	 */
-    EClass getLifecycleExtensionType();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanExtensionType <em>Managed Bean Extension Type</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Managed Bean Extension Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanExtensionType
-	 * @generated
-	 */
-    EClass getManagedBeanExtensionType();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterExtensionType <em>Converter Extension Type</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Converter Extension Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ConverterExtensionType
-	 * @generated
-	 */
-    EClass getConverterExtensionType();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ExtensionType <em>Extension Type</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Extension Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ExtensionType
-	 * @generated
-	 */
-    EClass getExtensionType();
-
-    /**
-	 * Returns the meta object for the reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ExtensionType#getChildNodes <em>Child Nodes</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for the reference list '<em>Child Nodes</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ExtensionType#getChildNodes()
-	 * @see #getExtensionType()
-	 * @generated
-	 */
-    EReference getExtensionType_ChildNodes();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ExtensionType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ExtensionType#getTextContent()
-	 * @see #getExtensionType()
-	 * @generated
-	 */
-    EAttribute getExtensionType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ExtensionType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ExtensionType#getId()
-	 * @see #getExtensionType()
-	 * @generated
-	 */
-    EAttribute getExtensionType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ExternalContextFactoryType <em>External Context Factory Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>External Context Factory Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ExternalContextFactoryType
-	 * @generated
-	 */
-	EClass getExternalContextFactoryType();
-
-				/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ExternalContextFactoryType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ExternalContextFactoryType#getTextContent()
-	 * @see #getExternalContextFactoryType()
-	 * @generated
-	 */
-	EAttribute getExternalContextFactoryType_TextContent();
-
-				/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ExternalContextFactoryType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ExternalContextFactoryType#getId()
-	 * @see #getExternalContextFactoryType()
-	 * @generated
-	 */
-	EAttribute getExternalContextFactoryType_Id();
-
-				/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationExtensionType <em>Application Extension Type</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Application Extension Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ApplicationExtensionType
-	 * @generated
-	 */
-    EClass getApplicationExtensionType();
-
-    /**
-	 * Returns the factory that creates the instances of the model.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the factory that creates the instances of the model.
-	 * @generated
-	 */
-	FacesConfigFactory getFacesConfigFactory();
-
-    /**
-	 * <!-- begin-user-doc -->
-     * Defines literals for the meta objects that represent
-     * <ul>
-     *   <li>each class,</li>
-     *   <li>each feature of each class,</li>
-     *   <li>each enum,</li>
-     *   <li>and each data type</li>
-     * </ul>
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-//    @SuppressWarnings("hiding")
-    interface Literals  {
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.AbsoluteOrderingTypeImpl <em>Absolute Ordering Type</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.AbsoluteOrderingTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getAbsoluteOrderingType()
-		 * @generated
-		 */
-		EClass ABSOLUTE_ORDERING_TYPE = eINSTANCE.getAbsoluteOrderingType();
-
-					/**
-		 * The meta object literal for the '<em><b>Name</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference ABSOLUTE_ORDERING_TYPE__NAME = eINSTANCE.getAbsoluteOrderingType_Name();
-
-					/**
-		 * The meta object literal for the '<em><b>Others</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference ABSOLUTE_ORDERING_TYPE__OTHERS = eINSTANCE.getAbsoluteOrderingType_Others();
-
-								/**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ActionListenerTypeImpl <em>Action Listener Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ActionListenerTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getActionListenerType()
-		 * @generated
-		 */
-        EClass ACTION_LISTENER_TYPE = eINSTANCE.getActionListenerType();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute ACTION_LISTENER_TYPE__TEXT_CONTENT = eINSTANCE.getActionListenerType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute ACTION_LISTENER_TYPE__ID = eINSTANCE.getActionListenerType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ApplicationFactoryTypeImpl <em>Application Factory Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ApplicationFactoryTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getApplicationFactoryType()
-		 * @generated
-		 */
-        EClass APPLICATION_FACTORY_TYPE = eINSTANCE.getApplicationFactoryType();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute APPLICATION_FACTORY_TYPE__TEXT_CONTENT = eINSTANCE.getApplicationFactoryType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute APPLICATION_FACTORY_TYPE__ID = eINSTANCE.getApplicationFactoryType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ApplicationTypeImpl <em>Application Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ApplicationTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getApplicationType()
-		 * @generated
-		 */
-        EClass APPLICATION_TYPE = eINSTANCE.getApplicationType();
-
-        /**
-		 * The meta object literal for the '<em><b>Action Listener</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference APPLICATION_TYPE__ACTION_LISTENER = eINSTANCE.getApplicationType_ActionListener();
-
-        /**
-		 * The meta object literal for the '<em><b>Default Render Kit Id</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference APPLICATION_TYPE__DEFAULT_RENDER_KIT_ID = eINSTANCE.getApplicationType_DefaultRenderKitId();
-
-        /**
-		 * The meta object literal for the '<em><b>Message Bundle</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference APPLICATION_TYPE__MESSAGE_BUNDLE = eINSTANCE.getApplicationType_MessageBundle();
-
-        /**
-		 * The meta object literal for the '<em><b>Navigation Handler</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference APPLICATION_TYPE__NAVIGATION_HANDLER = eINSTANCE.getApplicationType_NavigationHandler();
-
-        /**
-		 * The meta object literal for the '<em><b>View Handler</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference APPLICATION_TYPE__VIEW_HANDLER = eINSTANCE.getApplicationType_ViewHandler();
-
-        /**
-		 * The meta object literal for the '<em><b>State Manager</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference APPLICATION_TYPE__STATE_MANAGER = eINSTANCE.getApplicationType_StateManager();
-
-        /**
-		 * The meta object literal for the '<em><b>Property Resolver</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference APPLICATION_TYPE__PROPERTY_RESOLVER = eINSTANCE.getApplicationType_PropertyResolver();
-
-        /**
-		 * The meta object literal for the '<em><b>Variable Resolver</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference APPLICATION_TYPE__VARIABLE_RESOLVER = eINSTANCE.getApplicationType_VariableResolver();
-
-        /**
-		 * The meta object literal for the '<em><b>Resource Handler</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference APPLICATION_TYPE__RESOURCE_HANDLER = eINSTANCE.getApplicationType_ResourceHandler();
-
-								/**
-		 * The meta object literal for the '<em><b>System Event Listener</b></em>' reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference APPLICATION_TYPE__SYSTEM_EVENT_LISTENER = eINSTANCE.getApplicationType_SystemEventListener();
-
-								/**
-		 * The meta object literal for the '<em><b>Locale Config</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference APPLICATION_TYPE__LOCALE_CONFIG = eINSTANCE.getApplicationType_LocaleConfig();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute APPLICATION_TYPE__ID = eINSTANCE.getApplicationType_Id();
-
-        /**
-		 * The meta object literal for the '<em><b>EL Resolver</b></em>' reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference APPLICATION_TYPE__EL_RESOLVER = eINSTANCE.getApplicationType_ELResolver();
-
-        /**
-		 * The meta object literal for the '<em><b>Resource Bundle</b></em>' reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference APPLICATION_TYPE__RESOURCE_BUNDLE = eINSTANCE.getApplicationType_ResourceBundle();
-
-        /**
-		 * The meta object literal for the '<em><b>Application Extension</b></em>' reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference APPLICATION_TYPE__APPLICATION_EXTENSION = eINSTANCE.getApplicationType_ApplicationExtension();
-
-        /**
-		 * The meta object literal for the '<em><b>Default Validators</b></em>' reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference APPLICATION_TYPE__DEFAULT_VALIDATORS = eINSTANCE.getApplicationType_DefaultValidators();
-
-								/**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeClassTypeImpl <em>Attribute Class Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeClassTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getAttributeClassType()
-		 * @generated
-		 */
-        EClass ATTRIBUTE_CLASS_TYPE = eINSTANCE.getAttributeClassType();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute ATTRIBUTE_CLASS_TYPE__TEXT_CONTENT = eINSTANCE.getAttributeClassType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute ATTRIBUTE_CLASS_TYPE__ID = eINSTANCE.getAttributeClassType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeExtensionTypeImpl <em>Attribute Extension Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeExtensionTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getAttributeExtensionType()
-		 * @generated
-		 */
-        EClass ATTRIBUTE_EXTENSION_TYPE = eINSTANCE.getAttributeExtensionType();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeNameTypeImpl <em>Attribute Name Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeNameTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getAttributeNameType()
-		 * @generated
-		 */
-        EClass ATTRIBUTE_NAME_TYPE = eINSTANCE.getAttributeNameType();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute ATTRIBUTE_NAME_TYPE__TEXT_CONTENT = eINSTANCE.getAttributeNameType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute ATTRIBUTE_NAME_TYPE__ID = eINSTANCE.getAttributeNameType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeTypeImpl <em>Attribute Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getAttributeType()
-		 * @generated
-		 */
-        EClass ATTRIBUTE_TYPE = eINSTANCE.getAttributeType();
-
-        /**
-		 * The meta object literal for the '<em><b>Description</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference ATTRIBUTE_TYPE__DESCRIPTION = eINSTANCE.getAttributeType_Description();
-
-        /**
-		 * The meta object literal for the '<em><b>Display Name</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference ATTRIBUTE_TYPE__DISPLAY_NAME = eINSTANCE.getAttributeType_DisplayName();
-
-        /**
-		 * The meta object literal for the '<em><b>Icon</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference ATTRIBUTE_TYPE__ICON = eINSTANCE.getAttributeType_Icon();
-
-        /**
-		 * The meta object literal for the '<em><b>Attribute Name</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference ATTRIBUTE_TYPE__ATTRIBUTE_NAME = eINSTANCE.getAttributeType_AttributeName();
-
-        /**
-		 * The meta object literal for the '<em><b>Attribute Class</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference ATTRIBUTE_TYPE__ATTRIBUTE_CLASS = eINSTANCE.getAttributeType_AttributeClass();
-
-        /**
-		 * The meta object literal for the '<em><b>Default Value</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference ATTRIBUTE_TYPE__DEFAULT_VALUE = eINSTANCE.getAttributeType_DefaultValue();
-
-        /**
-		 * The meta object literal for the '<em><b>Suggested Value</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference ATTRIBUTE_TYPE__SUGGESTED_VALUE = eINSTANCE.getAttributeType_SuggestedValue();
-
-        /**
-		 * The meta object literal for the '<em><b>Attribute Extension</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference ATTRIBUTE_TYPE__ATTRIBUTE_EXTENSION = eINSTANCE.getAttributeType_AttributeExtension();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute ATTRIBUTE_TYPE__ID = eINSTANCE.getAttributeType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.BehaviorClassTypeImpl <em>Behavior Class Type</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.BehaviorClassTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getBehaviorClassType()
-		 * @generated
-		 */
-		EClass BEHAVIOR_CLASS_TYPE = eINSTANCE.getBehaviorClassType();
-
-								/**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute BEHAVIOR_CLASS_TYPE__TEXT_CONTENT = eINSTANCE.getBehaviorClassType_TextContent();
-
-								/**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute BEHAVIOR_CLASS_TYPE__ID = eINSTANCE.getBehaviorClassType_Id();
-
-								/**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.BehaviorIdTypeImpl <em>Behavior Id Type</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.BehaviorIdTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getBehaviorIdType()
-		 * @generated
-		 */
-		EClass BEHAVIOR_ID_TYPE = eINSTANCE.getBehaviorIdType();
-
-								/**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute BEHAVIOR_ID_TYPE__TEXT_CONTENT = eINSTANCE.getBehaviorIdType_TextContent();
-
-								/**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute BEHAVIOR_ID_TYPE__ID = eINSTANCE.getBehaviorIdType_Id();
-
-								/**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.BehaviorTypeImpl <em>Behavior Type</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.BehaviorTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getBehaviorType()
-		 * @generated
-		 */
-		EClass BEHAVIOR_TYPE = eINSTANCE.getBehaviorType();
-
-								/**
-		 * The meta object literal for the '<em><b>Description</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference BEHAVIOR_TYPE__DESCRIPTION = eINSTANCE.getBehaviorType_Description();
-
-								/**
-		 * The meta object literal for the '<em><b>Display Name</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference BEHAVIOR_TYPE__DISPLAY_NAME = eINSTANCE.getBehaviorType_DisplayName();
-
-								/**
-		 * The meta object literal for the '<em><b>Icon</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference BEHAVIOR_TYPE__ICON = eINSTANCE.getBehaviorType_Icon();
-
-								/**
-		 * The meta object literal for the '<em><b>Behavior Id</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference BEHAVIOR_TYPE__BEHAVIOR_ID = eINSTANCE.getBehaviorType_BehaviorId();
-
-								/**
-		 * The meta object literal for the '<em><b>Behavior Class</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference BEHAVIOR_TYPE__BEHAVIOR_CLASS = eINSTANCE.getBehaviorType_BehaviorClass();
-
-								/**
-		 * The meta object literal for the '<em><b>Attribute</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference BEHAVIOR_TYPE__ATTRIBUTE = eINSTANCE.getBehaviorType_Attribute();
-
-								/**
-		 * The meta object literal for the '<em><b>Property</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference BEHAVIOR_TYPE__PROPERTY = eINSTANCE.getBehaviorType_Property();
-
-								/**
-		 * The meta object literal for the '<em><b>Behavior Extension</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference BEHAVIOR_TYPE__BEHAVIOR_EXTENSION = eINSTANCE.getBehaviorType_BehaviorExtension();
-
-								/**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.BehaviorExtensionTypeImpl <em>Behavior Extension Type</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.BehaviorExtensionTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getBehaviorExtensionType()
-		 * @generated
-		 */
-		EClass BEHAVIOR_EXTENSION_TYPE = eINSTANCE.getBehaviorExtensionType();
-
-								/**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ClientBehaviorRendererClassTypeImpl <em>Client Behavior Renderer Class Type</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ClientBehaviorRendererClassTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getClientBehaviorRendererClassType()
-		 * @generated
-		 */
-		EClass CLIENT_BEHAVIOR_RENDERER_CLASS_TYPE = eINSTANCE.getClientBehaviorRendererClassType();
-
-								/**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute CLIENT_BEHAVIOR_RENDERER_CLASS_TYPE__TEXT_CONTENT = eINSTANCE.getClientBehaviorRendererClassType_TextContent();
-
-								/**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute CLIENT_BEHAVIOR_RENDERER_CLASS_TYPE__ID = eINSTANCE.getClientBehaviorRendererClassType_Id();
-
-								/**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ClientBehaviorRendererTypeImpl <em>Client Behavior Renderer Type</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ClientBehaviorRendererTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getClientBehaviorRendererType()
-		 * @generated
-		 */
-		EClass CLIENT_BEHAVIOR_RENDERER_TYPE = eINSTANCE.getClientBehaviorRendererType();
-
-								/**
-		 * The meta object literal for the '<em><b>Client Behavior Renderer Type</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference CLIENT_BEHAVIOR_RENDERER_TYPE__CLIENT_BEHAVIOR_RENDERER_TYPE = eINSTANCE.getClientBehaviorRendererType_ClientBehaviorRendererType();
-
-								/**
-		 * The meta object literal for the '<em><b>Client Behavior Renderer Class</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference CLIENT_BEHAVIOR_RENDERER_TYPE__CLIENT_BEHAVIOR_RENDERER_CLASS = eINSTANCE.getClientBehaviorRendererType_ClientBehaviorRendererClass();
-
-								/**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ClientBehaviorRendererTypeTypeImpl <em>Client Behavior Renderer Type Type</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ClientBehaviorRendererTypeTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getClientBehaviorRendererTypeType()
-		 * @generated
-		 */
-		EClass CLIENT_BEHAVIOR_RENDERER_TYPE_TYPE = eINSTANCE.getClientBehaviorRendererTypeType();
-
-								/**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute CLIENT_BEHAVIOR_RENDERER_TYPE_TYPE__TEXT_CONTENT = eINSTANCE.getClientBehaviorRendererTypeType_TextContent();
-
-								/**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute CLIENT_BEHAVIOR_RENDERER_TYPE_TYPE__ID = eINSTANCE.getClientBehaviorRendererTypeType_Id();
-
-								/**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentClassTypeImpl <em>Component Class Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentClassTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getComponentClassType()
-		 * @generated
-		 */
-        EClass COMPONENT_CLASS_TYPE = eINSTANCE.getComponentClassType();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute COMPONENT_CLASS_TYPE__TEXT_CONTENT = eINSTANCE.getComponentClassType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute COMPONENT_CLASS_TYPE__ID = eINSTANCE.getComponentClassType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentExtensionTypeImpl <em>Component Extension Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentExtensionTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getComponentExtensionType()
-		 * @generated
-		 */
-        EClass COMPONENT_EXTENSION_TYPE = eINSTANCE.getComponentExtensionType();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentFamilyTypeImpl <em>Component Family Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentFamilyTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getComponentFamilyType()
-		 * @generated
-		 */
-        EClass COMPONENT_FAMILY_TYPE = eINSTANCE.getComponentFamilyType();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute COMPONENT_FAMILY_TYPE__TEXT_CONTENT = eINSTANCE.getComponentFamilyType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute COMPONENT_FAMILY_TYPE__ID = eINSTANCE.getComponentFamilyType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentTypeImpl <em>Component Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getComponentType()
-		 * @generated
-		 */
-        EClass COMPONENT_TYPE = eINSTANCE.getComponentType();
-
-        /**
-		 * The meta object literal for the '<em><b>Description</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference COMPONENT_TYPE__DESCRIPTION = eINSTANCE.getComponentType_Description();
-
-        /**
-		 * The meta object literal for the '<em><b>Display Name</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference COMPONENT_TYPE__DISPLAY_NAME = eINSTANCE.getComponentType_DisplayName();
-
-        /**
-		 * The meta object literal for the '<em><b>Icon</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference COMPONENT_TYPE__ICON = eINSTANCE.getComponentType_Icon();
-
-        /**
-		 * The meta object literal for the '<em><b>Component Type</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference COMPONENT_TYPE__COMPONENT_TYPE = eINSTANCE.getComponentType_ComponentType();
-
-        /**
-		 * The meta object literal for the '<em><b>Component Class</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference COMPONENT_TYPE__COMPONENT_CLASS = eINSTANCE.getComponentType_ComponentClass();
-
-        /**
-		 * The meta object literal for the '<em><b>Facet</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference COMPONENT_TYPE__FACET = eINSTANCE.getComponentType_Facet();
-
-        /**
-		 * The meta object literal for the '<em><b>Attribute</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference COMPONENT_TYPE__ATTRIBUTE = eINSTANCE.getComponentType_Attribute();
-
-        /**
-		 * The meta object literal for the '<em><b>Property</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference COMPONENT_TYPE__PROPERTY = eINSTANCE.getComponentType_Property();
-
-        /**
-		 * The meta object literal for the '<em><b>Component Extension</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference COMPONENT_TYPE__COMPONENT_EXTENSION = eINSTANCE.getComponentType_ComponentExtension();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute COMPONENT_TYPE__ID = eINSTANCE.getComponentType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentTypeTypeImpl <em>Component Type Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentTypeTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getComponentTypeType()
-		 * @generated
-		 */
-        EClass COMPONENT_TYPE_TYPE = eINSTANCE.getComponentTypeType();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute COMPONENT_TYPE_TYPE__TEXT_CONTENT = eINSTANCE.getComponentTypeType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute COMPONENT_TYPE_TYPE__ID = eINSTANCE.getComponentTypeType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterClassTypeImpl <em>Converter Class Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterClassTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getConverterClassType()
-		 * @generated
-		 */
-        EClass CONVERTER_CLASS_TYPE = eINSTANCE.getConverterClassType();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute CONVERTER_CLASS_TYPE__TEXT_CONTENT = eINSTANCE.getConverterClassType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute CONVERTER_CLASS_TYPE__ID = eINSTANCE.getConverterClassType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterForClassTypeImpl <em>Converter For Class Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterForClassTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getConverterForClassType()
-		 * @generated
-		 */
-        EClass CONVERTER_FOR_CLASS_TYPE = eINSTANCE.getConverterForClassType();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute CONVERTER_FOR_CLASS_TYPE__TEXT_CONTENT = eINSTANCE.getConverterForClassType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute CONVERTER_FOR_CLASS_TYPE__ID = eINSTANCE.getConverterForClassType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterIdTypeImpl <em>Converter Id Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterIdTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getConverterIdType()
-		 * @generated
-		 */
-        EClass CONVERTER_ID_TYPE = eINSTANCE.getConverterIdType();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute CONVERTER_ID_TYPE__TEXT_CONTENT = eINSTANCE.getConverterIdType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute CONVERTER_ID_TYPE__ID = eINSTANCE.getConverterIdType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterTypeImpl <em>Converter Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getConverterType()
-		 * @generated
-		 */
-        EClass CONVERTER_TYPE = eINSTANCE.getConverterType();
-
-        /**
-		 * The meta object literal for the '<em><b>Description</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference CONVERTER_TYPE__DESCRIPTION = eINSTANCE.getConverterType_Description();
-
-        /**
-		 * The meta object literal for the '<em><b>Display Name</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference CONVERTER_TYPE__DISPLAY_NAME = eINSTANCE.getConverterType_DisplayName();
-
-        /**
-		 * The meta object literal for the '<em><b>Icon</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference CONVERTER_TYPE__ICON = eINSTANCE.getConverterType_Icon();
-
-        /**
-		 * The meta object literal for the '<em><b>Converter Id</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference CONVERTER_TYPE__CONVERTER_ID = eINSTANCE.getConverterType_ConverterId();
-
-        /**
-		 * The meta object literal for the '<em><b>Converter For Class</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference CONVERTER_TYPE__CONVERTER_FOR_CLASS = eINSTANCE.getConverterType_ConverterForClass();
-
-        /**
-		 * The meta object literal for the '<em><b>Converter Class</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference CONVERTER_TYPE__CONVERTER_CLASS = eINSTANCE.getConverterType_ConverterClass();
-
-        /**
-		 * The meta object literal for the '<em><b>Attribute</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference CONVERTER_TYPE__ATTRIBUTE = eINSTANCE.getConverterType_Attribute();
-
-        /**
-		 * The meta object literal for the '<em><b>Property</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference CONVERTER_TYPE__PROPERTY = eINSTANCE.getConverterType_Property();
-
-        /**
-		 * The meta object literal for the '<em><b>Converter Extension</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference CONVERTER_TYPE__CONVERTER_EXTENSION = eINSTANCE.getConverterType_ConverterExtension();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute CONVERTER_TYPE__ID = eINSTANCE.getConverterType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DefaultLocaleTypeImpl <em>Default Locale Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.DefaultLocaleTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getDefaultLocaleType()
-		 * @generated
-		 */
-        EClass DEFAULT_LOCALE_TYPE = eINSTANCE.getDefaultLocaleType();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute DEFAULT_LOCALE_TYPE__TEXT_CONTENT = eINSTANCE.getDefaultLocaleType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute DEFAULT_LOCALE_TYPE__ID = eINSTANCE.getDefaultLocaleType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DefaultRenderKitIdTypeImpl <em>Default Render Kit Id Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.DefaultRenderKitIdTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getDefaultRenderKitIdType()
-		 * @generated
-		 */
-        EClass DEFAULT_RENDER_KIT_ID_TYPE = eINSTANCE.getDefaultRenderKitIdType();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute DEFAULT_RENDER_KIT_ID_TYPE__TEXT_CONTENT = eINSTANCE.getDefaultRenderKitIdType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute DEFAULT_RENDER_KIT_ID_TYPE__ID = eINSTANCE.getDefaultRenderKitIdType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DefaultValidatorsTypeImpl <em>Default Validators Type</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.DefaultValidatorsTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getDefaultValidatorsType()
-		 * @generated
-		 */
-		EClass DEFAULT_VALIDATORS_TYPE = eINSTANCE.getDefaultValidatorsType();
-
-								/**
-		 * The meta object literal for the '<em><b>Validator Id</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference DEFAULT_VALIDATORS_TYPE__VALIDATOR_ID = eINSTANCE.getDefaultValidatorsType_ValidatorId();
-
-								/**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute DEFAULT_VALIDATORS_TYPE__ID = eINSTANCE.getDefaultValidatorsType_Id();
-
-								/**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DefaultValueTypeImpl <em>Default Value Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.DefaultValueTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getDefaultValueType()
-		 * @generated
-		 */
-        EClass DEFAULT_VALUE_TYPE = eINSTANCE.getDefaultValueType();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute DEFAULT_VALUE_TYPE__TEXT_CONTENT = eINSTANCE.getDefaultValueType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute DEFAULT_VALUE_TYPE__ID = eINSTANCE.getDefaultValueType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DescriptionTypeImpl <em>Description Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.DescriptionTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getDescriptionType()
-		 * @generated
-		 */
-        EClass DESCRIPTION_TYPE = eINSTANCE.getDescriptionType();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute DESCRIPTION_TYPE__TEXT_CONTENT = eINSTANCE.getDescriptionType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Lang</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute DESCRIPTION_TYPE__LANG = eINSTANCE.getDescriptionType_Lang();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute DESCRIPTION_TYPE__ID = eINSTANCE.getDescriptionType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DisplayNameTypeImpl <em>Display Name Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.DisplayNameTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getDisplayNameType()
-		 * @generated
-		 */
-        EClass DISPLAY_NAME_TYPE = eINSTANCE.getDisplayNameType();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute DISPLAY_NAME_TYPE__TEXT_CONTENT = eINSTANCE.getDisplayNameType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Lang</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute DISPLAY_NAME_TYPE__LANG = eINSTANCE.getDisplayNameType_Lang();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute DISPLAY_NAME_TYPE__ID = eINSTANCE.getDisplayNameType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl <em>Document Root</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getDocumentRoot()
-		 * @generated
-		 */
-        EClass DOCUMENT_ROOT = eINSTANCE.getDocumentRoot();
-
-        /**
-		 * The meta object literal for the '<em><b>Mixed</b></em>' attribute list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute DOCUMENT_ROOT__MIXED = eINSTANCE.getDocumentRoot_Mixed();
-
-        /**
-		 * The meta object literal for the '<em><b>XMLNS Prefix Map</b></em>' map feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__XMLNS_PREFIX_MAP = eINSTANCE.getDocumentRoot_XMLNSPrefixMap();
-
-        /**
-		 * The meta object literal for the '<em><b>XSI Schema Location</b></em>' map feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__XSI_SCHEMA_LOCATION = eINSTANCE.getDocumentRoot_XSISchemaLocation();
-
-        /**
-		 * The meta object literal for the '<em><b>Absolute Ordering</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference DOCUMENT_ROOT__ABSOLUTE_ORDERING = eINSTANCE.getDocumentRoot_AbsoluteOrdering();
-
-								/**
-		 * The meta object literal for the '<em><b>Action Listener</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__ACTION_LISTENER = eINSTANCE.getDocumentRoot_ActionListener();
-
-        /**
-		 * The meta object literal for the '<em><b>Application</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__APPLICATION = eINSTANCE.getDocumentRoot_Application();
-
-        /**
-		 * The meta object literal for the '<em><b>Application Factory</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__APPLICATION_FACTORY = eINSTANCE.getDocumentRoot_ApplicationFactory();
-
-        /**
-		 * The meta object literal for the '<em><b>Attribute</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__ATTRIBUTE = eINSTANCE.getDocumentRoot_Attribute();
-
-        /**
-		 * The meta object literal for the '<em><b>Attribute Class</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__ATTRIBUTE_CLASS = eINSTANCE.getDocumentRoot_AttributeClass();
-
-        /**
-		 * The meta object literal for the '<em><b>Attribute Extension</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__ATTRIBUTE_EXTENSION = eINSTANCE.getDocumentRoot_AttributeExtension();
-
-        /**
-		 * The meta object literal for the '<em><b>Attribute Name</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__ATTRIBUTE_NAME = eINSTANCE.getDocumentRoot_AttributeName();
-
-        /**
-		 * The meta object literal for the '<em><b>Behavior</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference DOCUMENT_ROOT__BEHAVIOR = eINSTANCE.getDocumentRoot_Behavior();
-
-								/**
-		 * The meta object literal for the '<em><b>Behavior Class</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference DOCUMENT_ROOT__BEHAVIOR_CLASS = eINSTANCE.getDocumentRoot_BehaviorClass();
-
-								/**
-		 * The meta object literal for the '<em><b>Behavior Id</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference DOCUMENT_ROOT__BEHAVIOR_ID = eINSTANCE.getDocumentRoot_BehaviorId();
-
-								/**
-		 * The meta object literal for the '<em><b>Behavior Extension</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference DOCUMENT_ROOT__BEHAVIOR_EXTENSION = eINSTANCE.getDocumentRoot_BehaviorExtension();
-
-								/**
-		 * The meta object literal for the '<em><b>Component</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__COMPONENT = eINSTANCE.getDocumentRoot_Component();
-
-        /**
-		 * The meta object literal for the '<em><b>Component Class</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__COMPONENT_CLASS = eINSTANCE.getDocumentRoot_ComponentClass();
-
-        /**
-		 * The meta object literal for the '<em><b>Component Extension</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__COMPONENT_EXTENSION = eINSTANCE.getDocumentRoot_ComponentExtension();
-
-        /**
-		 * The meta object literal for the '<em><b>Component Family</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__COMPONENT_FAMILY = eINSTANCE.getDocumentRoot_ComponentFamily();
-
-        /**
-		 * The meta object literal for the '<em><b>Component Type</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__COMPONENT_TYPE = eINSTANCE.getDocumentRoot_ComponentType();
-
-        /**
-		 * The meta object literal for the '<em><b>Converter</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__CONVERTER = eINSTANCE.getDocumentRoot_Converter();
-
-        /**
-		 * The meta object literal for the '<em><b>Converter Class</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__CONVERTER_CLASS = eINSTANCE.getDocumentRoot_ConverterClass();
-
-        /**
-		 * The meta object literal for the '<em><b>Converter For Class</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__CONVERTER_FOR_CLASS = eINSTANCE.getDocumentRoot_ConverterForClass();
-
-        /**
-		 * The meta object literal for the '<em><b>Converter Id</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__CONVERTER_ID = eINSTANCE.getDocumentRoot_ConverterId();
-
-        /**
-		 * The meta object literal for the '<em><b>Default Locale</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__DEFAULT_LOCALE = eINSTANCE.getDocumentRoot_DefaultLocale();
-
-        /**
-		 * The meta object literal for the '<em><b>Default Render Kit Id</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__DEFAULT_RENDER_KIT_ID = eINSTANCE.getDocumentRoot_DefaultRenderKitId();
-
-        /**
-		 * The meta object literal for the '<em><b>Default Validators</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference DOCUMENT_ROOT__DEFAULT_VALIDATORS = eINSTANCE.getDocumentRoot_DefaultValidators();
-
-								/**
-		 * The meta object literal for the '<em><b>Default Value</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__DEFAULT_VALUE = eINSTANCE.getDocumentRoot_DefaultValue();
-
-        /**
-		 * The meta object literal for the '<em><b>Description</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__DESCRIPTION = eINSTANCE.getDocumentRoot_Description();
-
-        /**
-		 * The meta object literal for the '<em><b>Display Name</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__DISPLAY_NAME = eINSTANCE.getDocumentRoot_DisplayName();
-
-        /**
-		 * The meta object literal for the '<em><b>Exception Handler Factory</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference DOCUMENT_ROOT__EXCEPTION_HANDLER_FACTORY = eINSTANCE.getDocumentRoot_ExceptionHandlerFactory();
-
-								/**
-		 * The meta object literal for the '<em><b>External Context Factory</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference DOCUMENT_ROOT__EXTERNAL_CONTEXT_FACTORY = eINSTANCE.getDocumentRoot_ExternalContextFactory();
-
-								/**
-		 * The meta object literal for the '<em><b>Faces Config</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__FACES_CONFIG = eINSTANCE.getDocumentRoot_FacesConfig();
-
-        /**
-		 * The meta object literal for the '<em><b>Faces Context Factory</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__FACES_CONTEXT_FACTORY = eINSTANCE.getDocumentRoot_FacesContextFactory();
-
-        /**
-		 * The meta object literal for the '<em><b>Facet</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__FACET = eINSTANCE.getDocumentRoot_Facet();
-
-        /**
-		 * The meta object literal for the '<em><b>Facet Extension</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__FACET_EXTENSION = eINSTANCE.getDocumentRoot_FacetExtension();
-
-        /**
-		 * The meta object literal for the '<em><b>Facet Name</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__FACET_NAME = eINSTANCE.getDocumentRoot_FacetName();
-
-        /**
-		 * The meta object literal for the '<em><b>Factory</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__FACTORY = eINSTANCE.getDocumentRoot_Factory();
-
-        /**
-		 * The meta object literal for the '<em><b>From Action</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__FROM_ACTION = eINSTANCE.getDocumentRoot_FromAction();
-
-        /**
-		 * The meta object literal for the '<em><b>From Outcome</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__FROM_OUTCOME = eINSTANCE.getDocumentRoot_FromOutcome();
-
-        /**
-		 * The meta object literal for the '<em><b>From View Id</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__FROM_VIEW_ID = eINSTANCE.getDocumentRoot_FromViewId();
-
-        /**
-		 * The meta object literal for the '<em><b>Icon</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__ICON = eINSTANCE.getDocumentRoot_Icon();
-
-        /**
-		 * The meta object literal for the '<em><b>If</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference DOCUMENT_ROOT__IF = eINSTANCE.getDocumentRoot_If();
-
-								/**
-		 * The meta object literal for the '<em><b>Key</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__KEY = eINSTANCE.getDocumentRoot_Key();
-
-        /**
-		 * The meta object literal for the '<em><b>Key Class</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__KEY_CLASS = eINSTANCE.getDocumentRoot_KeyClass();
-
-        /**
-		 * The meta object literal for the '<em><b>Large Icon</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__LARGE_ICON = eINSTANCE.getDocumentRoot_LargeIcon();
-
-        /**
-		 * The meta object literal for the '<em><b>Lifecycle</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__LIFECYCLE = eINSTANCE.getDocumentRoot_Lifecycle();
-
-        /**
-		 * The meta object literal for the '<em><b>Lifecycle Factory</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__LIFECYCLE_FACTORY = eINSTANCE.getDocumentRoot_LifecycleFactory();
-
-        /**
-		 * The meta object literal for the '<em><b>List Entries</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__LIST_ENTRIES = eINSTANCE.getDocumentRoot_ListEntries();
-
-        /**
-		 * The meta object literal for the '<em><b>Locale Config</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__LOCALE_CONFIG = eINSTANCE.getDocumentRoot_LocaleConfig();
-
-        /**
-		 * The meta object literal for the '<em><b>Managed Bean</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__MANAGED_BEAN = eINSTANCE.getDocumentRoot_ManagedBean();
-
-        /**
-		 * The meta object literal for the '<em><b>Managed Bean Class</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__MANAGED_BEAN_CLASS = eINSTANCE.getDocumentRoot_ManagedBeanClass();
-
-        /**
-		 * The meta object literal for the '<em><b>Managed Bean Name</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__MANAGED_BEAN_NAME = eINSTANCE.getDocumentRoot_ManagedBeanName();
-
-        /**
-		 * The meta object literal for the '<em><b>Managed Bean Scope</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__MANAGED_BEAN_SCOPE = eINSTANCE.getDocumentRoot_ManagedBeanScope();
-
-        /**
-		 * The meta object literal for the '<em><b>Managed Property</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__MANAGED_PROPERTY = eINSTANCE.getDocumentRoot_ManagedProperty();
-
-        /**
-		 * The meta object literal for the '<em><b>Map Entries</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__MAP_ENTRIES = eINSTANCE.getDocumentRoot_MapEntries();
-
-        /**
-		 * The meta object literal for the '<em><b>Map Entry</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__MAP_ENTRY = eINSTANCE.getDocumentRoot_MapEntry();
-
-        /**
-		 * The meta object literal for the '<em><b>Message Bundle</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__MESSAGE_BUNDLE = eINSTANCE.getDocumentRoot_MessageBundle();
-
-        /**
-		 * The meta object literal for the '<em><b>Name</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference DOCUMENT_ROOT__NAME = eINSTANCE.getDocumentRoot_Name();
-
-								/**
-		 * The meta object literal for the '<em><b>Navigation Case</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__NAVIGATION_CASE = eINSTANCE.getDocumentRoot_NavigationCase();
-
-        /**
-		 * The meta object literal for the '<em><b>Navigation Handler</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__NAVIGATION_HANDLER = eINSTANCE.getDocumentRoot_NavigationHandler();
-
-        /**
-		 * The meta object literal for the '<em><b>Navigation Rule</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__NAVIGATION_RULE = eINSTANCE.getDocumentRoot_NavigationRule();
-
-        /**
-		 * The meta object literal for the '<em><b>Null Value</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__NULL_VALUE = eINSTANCE.getDocumentRoot_NullValue();
-
-        /**
-		 * The meta object literal for the '<em><b>Ordering</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference DOCUMENT_ROOT__ORDERING = eINSTANCE.getDocumentRoot_Ordering();
-
-								/**
-		 * The meta object literal for the '<em><b>Ordering Ordering</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference DOCUMENT_ROOT__ORDERING_ORDERING = eINSTANCE.getDocumentRoot_OrderingOrdering();
-
-								/**
-		 * The meta object literal for the '<em><b>Others</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference DOCUMENT_ROOT__OTHERS = eINSTANCE.getDocumentRoot_Others();
-
-								/**
-		 * The meta object literal for the '<em><b>Partial View Context Factory</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference DOCUMENT_ROOT__PARTIAL_VIEW_CONTEXT_FACTORY = eINSTANCE.getDocumentRoot_PartialViewContextFactory();
-
-								/**
-		 * The meta object literal for the '<em><b>Phase Listener</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__PHASE_LISTENER = eINSTANCE.getDocumentRoot_PhaseListener();
-
-        /**
-		 * The meta object literal for the '<em><b>Property</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__PROPERTY = eINSTANCE.getDocumentRoot_Property();
-
-        /**
-		 * The meta object literal for the '<em><b>Property Class</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__PROPERTY_CLASS = eINSTANCE.getDocumentRoot_PropertyClass();
-
-        /**
-		 * The meta object literal for the '<em><b>Property Extension</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__PROPERTY_EXTENSION = eINSTANCE.getDocumentRoot_PropertyExtension();
-
-        /**
-		 * The meta object literal for the '<em><b>Property Name</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__PROPERTY_NAME = eINSTANCE.getDocumentRoot_PropertyName();
-
-        /**
-		 * The meta object literal for the '<em><b>Property Resolver</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__PROPERTY_RESOLVER = eINSTANCE.getDocumentRoot_PropertyResolver();
-
-        /**
-		 * The meta object literal for the '<em><b>Redirect</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__REDIRECT = eINSTANCE.getDocumentRoot_Redirect();
-
-        /**
-		 * The meta object literal for the '<em><b>Redirect View Param</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference DOCUMENT_ROOT__REDIRECT_VIEW_PARAM = eINSTANCE.getDocumentRoot_RedirectViewParam();
-
-								/**
-		 * The meta object literal for the '<em><b>Referenced Bean</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__REFERENCED_BEAN = eINSTANCE.getDocumentRoot_ReferencedBean();
-
-        /**
-		 * The meta object literal for the '<em><b>Referenced Bean Class</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__REFERENCED_BEAN_CLASS = eINSTANCE.getDocumentRoot_ReferencedBeanClass();
-
-        /**
-		 * The meta object literal for the '<em><b>Referenced Bean Name</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__REFERENCED_BEAN_NAME = eINSTANCE.getDocumentRoot_ReferencedBeanName();
-
-        /**
-		 * The meta object literal for the '<em><b>Renderer</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__RENDERER = eINSTANCE.getDocumentRoot_Renderer();
-
-        /**
-		 * The meta object literal for the '<em><b>Renderer Class</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__RENDERER_CLASS = eINSTANCE.getDocumentRoot_RendererClass();
-
-        /**
-		 * The meta object literal for the '<em><b>Renderer Extension</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__RENDERER_EXTENSION = eINSTANCE.getDocumentRoot_RendererExtension();
-
-        /**
-		 * The meta object literal for the '<em><b>Renderer Type</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__RENDERER_TYPE = eINSTANCE.getDocumentRoot_RendererType();
-
-        /**
-		 * The meta object literal for the '<em><b>Render Kit</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__RENDER_KIT = eINSTANCE.getDocumentRoot_RenderKit();
-
-        /**
-		 * The meta object literal for the '<em><b>Render Kit Class</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__RENDER_KIT_CLASS = eINSTANCE.getDocumentRoot_RenderKitClass();
-
-        /**
-		 * The meta object literal for the '<em><b>Render Kit Factory</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__RENDER_KIT_FACTORY = eINSTANCE.getDocumentRoot_RenderKitFactory();
-
-        /**
-		 * The meta object literal for the '<em><b>Render Kit Id</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__RENDER_KIT_ID = eINSTANCE.getDocumentRoot_RenderKitId();
-
-        /**
-		 * The meta object literal for the '<em><b>Resource Handler</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference DOCUMENT_ROOT__RESOURCE_HANDLER = eINSTANCE.getDocumentRoot_ResourceHandler();
-
-								/**
-		 * The meta object literal for the '<em><b>Small Icon</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__SMALL_ICON = eINSTANCE.getDocumentRoot_SmallIcon();
-
-        /**
-		 * The meta object literal for the '<em><b>Source Class</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference DOCUMENT_ROOT__SOURCE_CLASS = eINSTANCE.getDocumentRoot_SourceClass();
-
-								/**
-		 * The meta object literal for the '<em><b>State Manager</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__STATE_MANAGER = eINSTANCE.getDocumentRoot_StateManager();
-
-        /**
-		 * The meta object literal for the '<em><b>Suggested Value</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__SUGGESTED_VALUE = eINSTANCE.getDocumentRoot_SuggestedValue();
-
-        /**
-		 * The meta object literal for the '<em><b>Supported Locale</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__SUPPORTED_LOCALE = eINSTANCE.getDocumentRoot_SupportedLocale();
-
-        /**
-		 * The meta object literal for the '<em><b>System Event Class</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference DOCUMENT_ROOT__SYSTEM_EVENT_CLASS = eINSTANCE.getDocumentRoot_SystemEventClass();
-
-								/**
-		 * The meta object literal for the '<em><b>System Event Listener</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference DOCUMENT_ROOT__SYSTEM_EVENT_LISTENER = eINSTANCE.getDocumentRoot_SystemEventListener();
-
-								/**
-		 * The meta object literal for the '<em><b>System Event Listener Class</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference DOCUMENT_ROOT__SYSTEM_EVENT_LISTENER_CLASS = eINSTANCE.getDocumentRoot_SystemEventListenerClass();
-
-								/**
-		 * The meta object literal for the '<em><b>Tag Handler Delegate Factory</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference DOCUMENT_ROOT__TAG_HANDLER_DELEGATE_FACTORY = eINSTANCE.getDocumentRoot_TagHandlerDelegateFactory();
-
-								/**
-		 * The meta object literal for the '<em><b>To View Id</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__TO_VIEW_ID = eINSTANCE.getDocumentRoot_ToViewId();
-
-        /**
-		 * The meta object literal for the '<em><b>Validator</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__VALIDATOR = eINSTANCE.getDocumentRoot_Validator();
-
-        /**
-		 * The meta object literal for the '<em><b>Validator Class</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__VALIDATOR_CLASS = eINSTANCE.getDocumentRoot_ValidatorClass();
-
-        /**
-		 * The meta object literal for the '<em><b>Validator Id</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__VALIDATOR_ID = eINSTANCE.getDocumentRoot_ValidatorId();
-
-        /**
-		 * The meta object literal for the '<em><b>Value</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__VALUE = eINSTANCE.getDocumentRoot_Value();
-
-        /**
-		 * The meta object literal for the '<em><b>Value Class</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__VALUE_CLASS = eINSTANCE.getDocumentRoot_ValueClass();
-
-        /**
-		 * The meta object literal for the '<em><b>Variable Resolver</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__VARIABLE_RESOLVER = eINSTANCE.getDocumentRoot_VariableResolver();
-
-        /**
-		 * The meta object literal for the '<em><b>View Declaration Language Factory</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference DOCUMENT_ROOT__VIEW_DECLARATION_LANGUAGE_FACTORY = eINSTANCE.getDocumentRoot_ViewDeclarationLanguageFactory();
-
-								/**
-		 * The meta object literal for the '<em><b>View Handler</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__VIEW_HANDLER = eINSTANCE.getDocumentRoot_ViewHandler();
-
-        /**
-		 * The meta object literal for the '<em><b>Visit Context Factory</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference DOCUMENT_ROOT__VISIT_CONTEXT_FACTORY = eINSTANCE.getDocumentRoot_VisitContextFactory();
-
-								/**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DynamicAttributeImpl <em>Dynamic Attribute</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.DynamicAttributeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getDynamicAttribute()
-		 * @generated
-		 */
-        EClass DYNAMIC_ATTRIBUTE = eINSTANCE.getDynamicAttribute();
-
-        /**
-		 * The meta object literal for the '<em><b>Name</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute DYNAMIC_ATTRIBUTE__NAME = eINSTANCE.getDynamicAttribute_Name();
-
-        /**
-		 * The meta object literal for the '<em><b>Value</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute DYNAMIC_ATTRIBUTE__VALUE = eINSTANCE.getDynamicAttribute_Value();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DynamicElementImpl <em>Dynamic Element</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.DynamicElementImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getDynamicElement()
-		 * @generated
-		 */
-        EClass DYNAMIC_ELEMENT = eINSTANCE.getDynamicElement();
-
-        /**
-		 * The meta object literal for the '<em><b>Child Nodes</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DYNAMIC_ELEMENT__CHILD_NODES = eINSTANCE.getDynamicElement_ChildNodes();
-
-        /**
-		 * The meta object literal for the '<em><b>Attributes</b></em>' reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DYNAMIC_ELEMENT__ATTRIBUTES = eINSTANCE.getDynamicElement_Attributes();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute DYNAMIC_ELEMENT__TEXT_CONTENT = eINSTANCE.getDynamicElement_TextContent();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ELResolverTypeImpl <em>EL Resolver Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ELResolverTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getELResolverType()
-		 * @generated
-		 */
-        EClass EL_RESOLVER_TYPE = eINSTANCE.getELResolverType();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute EL_RESOLVER_TYPE__TEXT_CONTENT = eINSTANCE.getELResolverType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute EL_RESOLVER_TYPE__ID = eINSTANCE.getELResolverType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ExceptionHandlerFactoryTypeImpl <em>Exception Handler Factory Type</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ExceptionHandlerFactoryTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getExceptionHandlerFactoryType()
-		 * @generated
-		 */
-		EClass EXCEPTION_HANDLER_FACTORY_TYPE = eINSTANCE.getExceptionHandlerFactoryType();
-
-								/**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute EXCEPTION_HANDLER_FACTORY_TYPE__TEXT_CONTENT = eINSTANCE.getExceptionHandlerFactoryType_TextContent();
-
-								/**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute EXCEPTION_HANDLER_FACTORY_TYPE__ID = eINSTANCE.getExceptionHandlerFactoryType_Id();
-
-								/**
-		 * The meta object literal for the '<em><b>Name</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute DYNAMIC_ELEMENT__NAME = eINSTANCE.getDynamicElement_Name();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigTypeImpl <em>Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getFacesConfigType()
-		 * @generated
-		 */
-        EClass FACES_CONFIG_TYPE = eINSTANCE.getFacesConfigType();
-
-        /**
-		 * The meta object literal for the '<em><b>Application</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference FACES_CONFIG_TYPE__APPLICATION = eINSTANCE.getFacesConfigType_Application();
-
-        /**
-		 * The meta object literal for the '<em><b>Ordering</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference FACES_CONFIG_TYPE__ORDERING = eINSTANCE.getFacesConfigType_Ordering();
-
-								/**
-		 * The meta object literal for the '<em><b>Absolute Ordering</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference FACES_CONFIG_TYPE__ABSOLUTE_ORDERING = eINSTANCE.getFacesConfigType_AbsoluteOrdering();
-
-								/**
-		 * The meta object literal for the '<em><b>Factory</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference FACES_CONFIG_TYPE__FACTORY = eINSTANCE.getFacesConfigType_Factory();
-
-        /**
-		 * The meta object literal for the '<em><b>Component</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference FACES_CONFIG_TYPE__COMPONENT = eINSTANCE.getFacesConfigType_Component();
-
-        /**
-		 * The meta object literal for the '<em><b>Converter</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference FACES_CONFIG_TYPE__CONVERTER = eINSTANCE.getFacesConfigType_Converter();
-
-        /**
-		 * The meta object literal for the '<em><b>Managed Bean</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference FACES_CONFIG_TYPE__MANAGED_BEAN = eINSTANCE.getFacesConfigType_ManagedBean();
-
-        /**
-		 * The meta object literal for the '<em><b>Name</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference FACES_CONFIG_TYPE__NAME = eINSTANCE.getFacesConfigType_Name();
-
-								/**
-		 * The meta object literal for the '<em><b>Navigation Rule</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference FACES_CONFIG_TYPE__NAVIGATION_RULE = eINSTANCE.getFacesConfigType_NavigationRule();
-
-        /**
-		 * The meta object literal for the '<em><b>Referenced Bean</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference FACES_CONFIG_TYPE__REFERENCED_BEAN = eINSTANCE.getFacesConfigType_ReferencedBean();
-
-        /**
-		 * The meta object literal for the '<em><b>Render Kit</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference FACES_CONFIG_TYPE__RENDER_KIT = eINSTANCE.getFacesConfigType_RenderKit();
-
-        /**
-		 * The meta object literal for the '<em><b>Lifecycle</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference FACES_CONFIG_TYPE__LIFECYCLE = eINSTANCE.getFacesConfigType_Lifecycle();
-
-        /**
-		 * The meta object literal for the '<em><b>Validator</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference FACES_CONFIG_TYPE__VALIDATOR = eINSTANCE.getFacesConfigType_Validator();
-
-        /**
-		 * The meta object literal for the '<em><b>Behavior</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference FACES_CONFIG_TYPE__BEHAVIOR = eINSTANCE.getFacesConfigType_Behavior();
-
-								/**
-		 * The meta object literal for the '<em><b>Faces Config Extension</b></em>' reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference FACES_CONFIG_TYPE__FACES_CONFIG_EXTENSION = eINSTANCE.getFacesConfigType_FacesConfigExtension();
-
-        /**
-		 * The meta object literal for the '<em><b>Xmlns</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute FACES_CONFIG_TYPE__XMLNS = eINSTANCE.getFacesConfigType_Xmlns();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute FACES_CONFIG_TYPE__ID = eINSTANCE.getFacesConfigType_Id();
-
-        /**
-		 * The meta object literal for the '<em><b>Metadata Complete</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute FACES_CONFIG_TYPE__METADATA_COMPLETE = eINSTANCE.getFacesConfigType_MetadataComplete();
-
-								/**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacesContextFactoryTypeImpl <em>Faces Context Factory Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesContextFactoryTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getFacesContextFactoryType()
-		 * @generated
-		 */
-        EClass FACES_CONTEXT_FACTORY_TYPE = eINSTANCE.getFacesContextFactoryType();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute FACES_CONTEXT_FACTORY_TYPE__TEXT_CONTENT = eINSTANCE.getFacesContextFactoryType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute FACES_CONTEXT_FACTORY_TYPE__ID = eINSTANCE.getFacesContextFactoryType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacetExtensionTypeImpl <em>Facet Extension Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacetExtensionTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getFacetExtensionType()
-		 * @generated
-		 */
-        EClass FACET_EXTENSION_TYPE = eINSTANCE.getFacetExtensionType();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacetNameTypeImpl <em>Facet Name Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacetNameTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getFacetNameType()
-		 * @generated
-		 */
-        EClass FACET_NAME_TYPE = eINSTANCE.getFacetNameType();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute FACET_NAME_TYPE__TEXT_CONTENT = eINSTANCE.getFacetNameType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute FACET_NAME_TYPE__ID = eINSTANCE.getFacetNameType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacetTypeImpl <em>Facet Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacetTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getFacetType()
-		 * @generated
-		 */
-        EClass FACET_TYPE = eINSTANCE.getFacetType();
-
-        /**
-		 * The meta object literal for the '<em><b>Description</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference FACET_TYPE__DESCRIPTION = eINSTANCE.getFacetType_Description();
-
-        /**
-		 * The meta object literal for the '<em><b>Display Name</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference FACET_TYPE__DISPLAY_NAME = eINSTANCE.getFacetType_DisplayName();
-
-        /**
-		 * The meta object literal for the '<em><b>Icon</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference FACET_TYPE__ICON = eINSTANCE.getFacetType_Icon();
-
-        /**
-		 * The meta object literal for the '<em><b>Facet Name</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference FACET_TYPE__FACET_NAME = eINSTANCE.getFacetType_FacetName();
-
-        /**
-		 * The meta object literal for the '<em><b>Facet Extension</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference FACET_TYPE__FACET_EXTENSION = eINSTANCE.getFacetType_FacetExtension();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute FACET_TYPE__ID = eINSTANCE.getFacetType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FactoryTypeImpl <em>Factory Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FactoryTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getFactoryType()
-		 * @generated
-		 */
-        EClass FACTORY_TYPE = eINSTANCE.getFactoryType();
-
-        /**
-		 * The meta object literal for the '<em><b>Application Factory</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference FACTORY_TYPE__APPLICATION_FACTORY = eINSTANCE.getFactoryType_ApplicationFactory();
-
-        /**
-		 * The meta object literal for the '<em><b>Exception Handler Factory</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference FACTORY_TYPE__EXCEPTION_HANDLER_FACTORY = eINSTANCE.getFactoryType_ExceptionHandlerFactory();
-
-								/**
-		 * The meta object literal for the '<em><b>External Context Factory</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference FACTORY_TYPE__EXTERNAL_CONTEXT_FACTORY = eINSTANCE.getFactoryType_ExternalContextFactory();
-
-								/**
-		 * The meta object literal for the '<em><b>Faces Context Factory</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference FACTORY_TYPE__FACES_CONTEXT_FACTORY = eINSTANCE.getFactoryType_FacesContextFactory();
-
-        /**
-		 * The meta object literal for the '<em><b>Partial View Context Factory</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference FACTORY_TYPE__PARTIAL_VIEW_CONTEXT_FACTORY = eINSTANCE.getFactoryType_PartialViewContextFactory();
-
-								/**
-		 * The meta object literal for the '<em><b>Lifecycle Factory</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference FACTORY_TYPE__LIFECYCLE_FACTORY = eINSTANCE.getFactoryType_LifecycleFactory();
-
-        /**
-		 * The meta object literal for the '<em><b>View Declaration Language Factory</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference FACTORY_TYPE__VIEW_DECLARATION_LANGUAGE_FACTORY = eINSTANCE.getFactoryType_ViewDeclarationLanguageFactory();
-
-								/**
-		 * The meta object literal for the '<em><b>Tag Handler Delegate Factory</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference FACTORY_TYPE__TAG_HANDLER_DELEGATE_FACTORY = eINSTANCE.getFactoryType_TagHandlerDelegateFactory();
-
-								/**
-		 * The meta object literal for the '<em><b>Render Kit Factory</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference FACTORY_TYPE__RENDER_KIT_FACTORY = eINSTANCE.getFactoryType_RenderKitFactory();
-
-        /**
-		 * The meta object literal for the '<em><b>Visit Context Factory</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference FACTORY_TYPE__VISIT_CONTEXT_FACTORY = eINSTANCE.getFactoryType_VisitContextFactory();
-
-								/**
-		 * The meta object literal for the '<em><b>Factory Extension</b></em>' reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference FACTORY_TYPE__FACTORY_EXTENSION = eINSTANCE.getFactoryType_FactoryExtension();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute FACTORY_TYPE__ID = eINSTANCE.getFactoryType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FromActionTypeImpl <em>From Action Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FromActionTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getFromActionType()
-		 * @generated
-		 */
-        EClass FROM_ACTION_TYPE = eINSTANCE.getFromActionType();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute FROM_ACTION_TYPE__TEXT_CONTENT = eINSTANCE.getFromActionType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute FROM_ACTION_TYPE__ID = eINSTANCE.getFromActionType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FromOutcomeTypeImpl <em>From Outcome Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FromOutcomeTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getFromOutcomeType()
-		 * @generated
-		 */
-        EClass FROM_OUTCOME_TYPE = eINSTANCE.getFromOutcomeType();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute FROM_OUTCOME_TYPE__TEXT_CONTENT = eINSTANCE.getFromOutcomeType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute FROM_OUTCOME_TYPE__ID = eINSTANCE.getFromOutcomeType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FromViewIdTypeImpl <em>From View Id Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FromViewIdTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getFromViewIdType()
-		 * @generated
-		 */
-        EClass FROM_VIEW_ID_TYPE = eINSTANCE.getFromViewIdType();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute FROM_VIEW_ID_TYPE__TEXT_CONTENT = eINSTANCE.getFromViewIdType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute FROM_VIEW_ID_TYPE__ID = eINSTANCE.getFromViewIdType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.IconTypeImpl <em>Icon Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.IconTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getIconType()
-		 * @generated
-		 */
-        EClass ICON_TYPE = eINSTANCE.getIconType();
-
-        /**
-		 * The meta object literal for the '<em><b>Small Icon</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference ICON_TYPE__SMALL_ICON = eINSTANCE.getIconType_SmallIcon();
-
-        /**
-		 * The meta object literal for the '<em><b>Large Icon</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference ICON_TYPE__LARGE_ICON = eINSTANCE.getIconType_LargeIcon();
-
-        /**
-		 * The meta object literal for the '<em><b>Lang</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute ICON_TYPE__LANG = eINSTANCE.getIconType_Lang();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute ICON_TYPE__ID = eINSTANCE.getIconType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.IfTypeImpl <em>If Type</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.IfTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getIfType()
-		 * @generated
-		 */
-		EClass IF_TYPE = eINSTANCE.getIfType();
-
-								/**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute IF_TYPE__TEXT_CONTENT = eINSTANCE.getIfType_TextContent();
-
-								/**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute IF_TYPE__ID = eINSTANCE.getIfType_Id();
-
-								/**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.KeyClassTypeImpl <em>Key Class Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.KeyClassTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getKeyClassType()
-		 * @generated
-		 */
-        EClass KEY_CLASS_TYPE = eINSTANCE.getKeyClassType();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute KEY_CLASS_TYPE__TEXT_CONTENT = eINSTANCE.getKeyClassType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute KEY_CLASS_TYPE__ID = eINSTANCE.getKeyClassType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.KeyTypeImpl <em>Key Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.KeyTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getKeyType()
-		 * @generated
-		 */
-        EClass KEY_TYPE = eINSTANCE.getKeyType();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute KEY_TYPE__TEXT_CONTENT = eINSTANCE.getKeyType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute KEY_TYPE__ID = eINSTANCE.getKeyType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.LargeIconTypeImpl <em>Large Icon Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.LargeIconTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getLargeIconType()
-		 * @generated
-		 */
-        EClass LARGE_ICON_TYPE = eINSTANCE.getLargeIconType();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute LARGE_ICON_TYPE__TEXT_CONTENT = eINSTANCE.getLargeIconType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute LARGE_ICON_TYPE__ID = eINSTANCE.getLargeIconType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.LifecycleFactoryTypeImpl <em>Lifecycle Factory Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.LifecycleFactoryTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getLifecycleFactoryType()
-		 * @generated
-		 */
-        EClass LIFECYCLE_FACTORY_TYPE = eINSTANCE.getLifecycleFactoryType();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute LIFECYCLE_FACTORY_TYPE__TEXT_CONTENT = eINSTANCE.getLifecycleFactoryType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute LIFECYCLE_FACTORY_TYPE__ID = eINSTANCE.getLifecycleFactoryType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.LifecycleTypeImpl <em>Lifecycle Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.LifecycleTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getLifecycleType()
-		 * @generated
-		 */
-        EClass LIFECYCLE_TYPE = eINSTANCE.getLifecycleType();
-
-        /**
-		 * The meta object literal for the '<em><b>Phase Listener</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference LIFECYCLE_TYPE__PHASE_LISTENER = eINSTANCE.getLifecycleType_PhaseListener();
-
-        /**
-		 * The meta object literal for the '<em><b>Lifecycle Extension</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference LIFECYCLE_TYPE__LIFECYCLE_EXTENSION = eINSTANCE.getLifecycleType_LifecycleExtension();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute LIFECYCLE_TYPE__ID = eINSTANCE.getLifecycleType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ListEntriesTypeImpl <em>List Entries Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ListEntriesTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getListEntriesType()
-		 * @generated
-		 */
-        EClass LIST_ENTRIES_TYPE = eINSTANCE.getListEntriesType();
-
-        /**
-		 * The meta object literal for the '<em><b>Value Class</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference LIST_ENTRIES_TYPE__VALUE_CLASS = eINSTANCE.getListEntriesType_ValueClass();
-
-        /**
-		 * The meta object literal for the '<em><b>Null Value</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference LIST_ENTRIES_TYPE__NULL_VALUE = eINSTANCE.getListEntriesType_NullValue();
-
-        /**
-		 * The meta object literal for the '<em><b>Value</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference LIST_ENTRIES_TYPE__VALUE = eINSTANCE.getListEntriesType_Value();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute LIST_ENTRIES_TYPE__ID = eINSTANCE.getListEntriesType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.LocaleConfigTypeImpl <em>Locale Config Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.LocaleConfigTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getLocaleConfigType()
-		 * @generated
-		 */
-        EClass LOCALE_CONFIG_TYPE = eINSTANCE.getLocaleConfigType();
-
-        /**
-		 * The meta object literal for the '<em><b>Default Locale</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference LOCALE_CONFIG_TYPE__DEFAULT_LOCALE = eINSTANCE.getLocaleConfigType_DefaultLocale();
-
-        /**
-		 * The meta object literal for the '<em><b>Supported Locale</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference LOCALE_CONFIG_TYPE__SUPPORTED_LOCALE = eINSTANCE.getLocaleConfigType_SupportedLocale();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute LOCALE_CONFIG_TYPE__ID = eINSTANCE.getLocaleConfigType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanClassTypeImpl <em>Managed Bean Class Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanClassTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getManagedBeanClassType()
-		 * @generated
-		 */
-        EClass MANAGED_BEAN_CLASS_TYPE = eINSTANCE.getManagedBeanClassType();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute MANAGED_BEAN_CLASS_TYPE__TEXT_CONTENT = eINSTANCE.getManagedBeanClassType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute MANAGED_BEAN_CLASS_TYPE__ID = eINSTANCE.getManagedBeanClassType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanNameTypeImpl <em>Managed Bean Name Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanNameTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getManagedBeanNameType()
-		 * @generated
-		 */
-        EClass MANAGED_BEAN_NAME_TYPE = eINSTANCE.getManagedBeanNameType();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute MANAGED_BEAN_NAME_TYPE__TEXT_CONTENT = eINSTANCE.getManagedBeanNameType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute MANAGED_BEAN_NAME_TYPE__ID = eINSTANCE.getManagedBeanNameType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanScopeTypeImpl <em>Managed Bean Scope Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanScopeTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getManagedBeanScopeType()
-		 * @generated
-		 */
-        EClass MANAGED_BEAN_SCOPE_TYPE = eINSTANCE.getManagedBeanScopeType();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute MANAGED_BEAN_SCOPE_TYPE__TEXT_CONTENT = eINSTANCE.getManagedBeanScopeType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute MANAGED_BEAN_SCOPE_TYPE__ID = eINSTANCE.getManagedBeanScopeType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanTypeImpl <em>Managed Bean Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getManagedBeanType()
-		 * @generated
-		 */
-        EClass MANAGED_BEAN_TYPE = eINSTANCE.getManagedBeanType();
-
-        /**
-		 * The meta object literal for the '<em><b>Description</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference MANAGED_BEAN_TYPE__DESCRIPTION = eINSTANCE.getManagedBeanType_Description();
-
-        /**
-		 * The meta object literal for the '<em><b>Display Name</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference MANAGED_BEAN_TYPE__DISPLAY_NAME = eINSTANCE.getManagedBeanType_DisplayName();
-
-        /**
-		 * The meta object literal for the '<em><b>Icon</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference MANAGED_BEAN_TYPE__ICON = eINSTANCE.getManagedBeanType_Icon();
-
-        /**
-		 * The meta object literal for the '<em><b>Managed Bean Name</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference MANAGED_BEAN_TYPE__MANAGED_BEAN_NAME = eINSTANCE.getManagedBeanType_ManagedBeanName();
-
-        /**
-		 * The meta object literal for the '<em><b>Managed Bean Class</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference MANAGED_BEAN_TYPE__MANAGED_BEAN_CLASS = eINSTANCE.getManagedBeanType_ManagedBeanClass();
-
-        /**
-		 * The meta object literal for the '<em><b>Managed Bean Scope</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference MANAGED_BEAN_TYPE__MANAGED_BEAN_SCOPE = eINSTANCE.getManagedBeanType_ManagedBeanScope();
-
-        /**
-		 * The meta object literal for the '<em><b>Managed Property</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference MANAGED_BEAN_TYPE__MANAGED_PROPERTY = eINSTANCE.getManagedBeanType_ManagedProperty();
-
-        /**
-		 * The meta object literal for the '<em><b>Map Entries</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference MANAGED_BEAN_TYPE__MAP_ENTRIES = eINSTANCE.getManagedBeanType_MapEntries();
-
-        /**
-		 * The meta object literal for the '<em><b>List Entries</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference MANAGED_BEAN_TYPE__LIST_ENTRIES = eINSTANCE.getManagedBeanType_ListEntries();
-
-        /**
-		 * The meta object literal for the '<em><b>Managed Bean Extension</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference MANAGED_BEAN_TYPE__MANAGED_BEAN_EXTENSION = eINSTANCE.getManagedBeanType_ManagedBeanExtension();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute MANAGED_BEAN_TYPE__ID = eINSTANCE.getManagedBeanType_Id();
-
-        /**
-		 * The meta object literal for the '<em><b>Eager</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute MANAGED_BEAN_TYPE__EAGER = eINSTANCE.getManagedBeanType_Eager();
-
-								/**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedPropertyTypeImpl <em>Managed Property Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedPropertyTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getManagedPropertyType()
-		 * @generated
-		 */
-        EClass MANAGED_PROPERTY_TYPE = eINSTANCE.getManagedPropertyType();
-
-        /**
-		 * The meta object literal for the '<em><b>Description</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference MANAGED_PROPERTY_TYPE__DESCRIPTION = eINSTANCE.getManagedPropertyType_Description();
-
-        /**
-		 * The meta object literal for the '<em><b>Display Name</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference MANAGED_PROPERTY_TYPE__DISPLAY_NAME = eINSTANCE.getManagedPropertyType_DisplayName();
-
-        /**
-		 * The meta object literal for the '<em><b>Icon</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference MANAGED_PROPERTY_TYPE__ICON = eINSTANCE.getManagedPropertyType_Icon();
-
-        /**
-		 * The meta object literal for the '<em><b>Property Name</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference MANAGED_PROPERTY_TYPE__PROPERTY_NAME = eINSTANCE.getManagedPropertyType_PropertyName();
-
-        /**
-		 * The meta object literal for the '<em><b>Property Class</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference MANAGED_PROPERTY_TYPE__PROPERTY_CLASS = eINSTANCE.getManagedPropertyType_PropertyClass();
-
-        /**
-		 * The meta object literal for the '<em><b>Map Entries</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference MANAGED_PROPERTY_TYPE__MAP_ENTRIES = eINSTANCE.getManagedPropertyType_MapEntries();
-
-        /**
-		 * The meta object literal for the '<em><b>Null Value</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference MANAGED_PROPERTY_TYPE__NULL_VALUE = eINSTANCE.getManagedPropertyType_NullValue();
-
-        /**
-		 * The meta object literal for the '<em><b>Value</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference MANAGED_PROPERTY_TYPE__VALUE = eINSTANCE.getManagedPropertyType_Value();
-
-        /**
-		 * The meta object literal for the '<em><b>List Entries</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference MANAGED_PROPERTY_TYPE__LIST_ENTRIES = eINSTANCE.getManagedPropertyType_ListEntries();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute MANAGED_PROPERTY_TYPE__ID = eINSTANCE.getManagedPropertyType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.MapEntriesTypeImpl <em>Map Entries Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.MapEntriesTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getMapEntriesType()
-		 * @generated
-		 */
-        EClass MAP_ENTRIES_TYPE = eINSTANCE.getMapEntriesType();
-
-        /**
-		 * The meta object literal for the '<em><b>Key Class</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference MAP_ENTRIES_TYPE__KEY_CLASS = eINSTANCE.getMapEntriesType_KeyClass();
-
-        /**
-		 * The meta object literal for the '<em><b>Value Class</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference MAP_ENTRIES_TYPE__VALUE_CLASS = eINSTANCE.getMapEntriesType_ValueClass();
-
-        /**
-		 * The meta object literal for the '<em><b>Map Entry</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference MAP_ENTRIES_TYPE__MAP_ENTRY = eINSTANCE.getMapEntriesType_MapEntry();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute MAP_ENTRIES_TYPE__ID = eINSTANCE.getMapEntriesType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.MapEntryTypeImpl <em>Map Entry Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.MapEntryTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getMapEntryType()
-		 * @generated
-		 */
-        EClass MAP_ENTRY_TYPE = eINSTANCE.getMapEntryType();
-
-        /**
-		 * The meta object literal for the '<em><b>Key</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference MAP_ENTRY_TYPE__KEY = eINSTANCE.getMapEntryType_Key();
-
-        /**
-		 * The meta object literal for the '<em><b>Null Value</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference MAP_ENTRY_TYPE__NULL_VALUE = eINSTANCE.getMapEntryType_NullValue();
-
-        /**
-		 * The meta object literal for the '<em><b>Value</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference MAP_ENTRY_TYPE__VALUE = eINSTANCE.getMapEntryType_Value();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute MAP_ENTRY_TYPE__ID = eINSTANCE.getMapEntryType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.MessageBundleTypeImpl <em>Message Bundle Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.MessageBundleTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getMessageBundleType()
-		 * @generated
-		 */
-        EClass MESSAGE_BUNDLE_TYPE = eINSTANCE.getMessageBundleType();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute MESSAGE_BUNDLE_TYPE__TEXT_CONTENT = eINSTANCE.getMessageBundleType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute MESSAGE_BUNDLE_TYPE__ID = eINSTANCE.getMessageBundleType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.NameTypeImpl <em>Name Type</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.NameTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getNameType()
-		 * @generated
-		 */
-		EClass NAME_TYPE = eINSTANCE.getNameType();
-
-								/**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute NAME_TYPE__TEXT_CONTENT = eINSTANCE.getNameType_TextContent();
-
-								/**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute NAME_TYPE__ID = eINSTANCE.getNameType_Id();
-
-								/**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationCaseTypeImpl <em>Navigation Case Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationCaseTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getNavigationCaseType()
-		 * @generated
-		 */
-        EClass NAVIGATION_CASE_TYPE = eINSTANCE.getNavigationCaseType();
-
-        /**
-		 * The meta object literal for the '<em><b>Description</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference NAVIGATION_CASE_TYPE__DESCRIPTION = eINSTANCE.getNavigationCaseType_Description();
-
-        /**
-		 * The meta object literal for the '<em><b>Display Name</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference NAVIGATION_CASE_TYPE__DISPLAY_NAME = eINSTANCE.getNavigationCaseType_DisplayName();
-
-        /**
-		 * The meta object literal for the '<em><b>Icon</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference NAVIGATION_CASE_TYPE__ICON = eINSTANCE.getNavigationCaseType_Icon();
-
-        /**
-		 * The meta object literal for the '<em><b>From Action</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference NAVIGATION_CASE_TYPE__FROM_ACTION = eINSTANCE.getNavigationCaseType_FromAction();
-
-        /**
-		 * The meta object literal for the '<em><b>From Outcome</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference NAVIGATION_CASE_TYPE__FROM_OUTCOME = eINSTANCE.getNavigationCaseType_FromOutcome();
-
-        /**
-		 * The meta object literal for the '<em><b>If</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference NAVIGATION_CASE_TYPE__IF = eINSTANCE.getNavigationCaseType_If();
-
-								/**
-		 * The meta object literal for the '<em><b>To View Id</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference NAVIGATION_CASE_TYPE__TO_VIEW_ID = eINSTANCE.getNavigationCaseType_ToViewId();
-
-        /**
-		 * The meta object literal for the '<em><b>Redirect</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference NAVIGATION_CASE_TYPE__REDIRECT = eINSTANCE.getNavigationCaseType_Redirect();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute NAVIGATION_CASE_TYPE__ID = eINSTANCE.getNavigationCaseType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationHandlerTypeImpl <em>Navigation Handler Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationHandlerTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getNavigationHandlerType()
-		 * @generated
-		 */
-        EClass NAVIGATION_HANDLER_TYPE = eINSTANCE.getNavigationHandlerType();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute NAVIGATION_HANDLER_TYPE__TEXT_CONTENT = eINSTANCE.getNavigationHandlerType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute NAVIGATION_HANDLER_TYPE__ID = eINSTANCE.getNavigationHandlerType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationRuleTypeImpl <em>Navigation Rule Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationRuleTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getNavigationRuleType()
-		 * @generated
-		 */
-        EClass NAVIGATION_RULE_TYPE = eINSTANCE.getNavigationRuleType();
-
-        /**
-		 * The meta object literal for the '<em><b>Description</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference NAVIGATION_RULE_TYPE__DESCRIPTION = eINSTANCE.getNavigationRuleType_Description();
-
-        /**
-		 * The meta object literal for the '<em><b>Display Name</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference NAVIGATION_RULE_TYPE__DISPLAY_NAME = eINSTANCE.getNavigationRuleType_DisplayName();
-
-        /**
-		 * The meta object literal for the '<em><b>Icon</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference NAVIGATION_RULE_TYPE__ICON = eINSTANCE.getNavigationRuleType_Icon();
-
-        /**
-		 * The meta object literal for the '<em><b>From View Id</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference NAVIGATION_RULE_TYPE__FROM_VIEW_ID = eINSTANCE.getNavigationRuleType_FromViewId();
-
-        /**
-		 * The meta object literal for the '<em><b>Navigation Case</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference NAVIGATION_RULE_TYPE__NAVIGATION_CASE = eINSTANCE.getNavigationRuleType_NavigationCase();
-
-        /**
-		 * The meta object literal for the '<em><b>Navigation Rule Extension</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference NAVIGATION_RULE_TYPE__NAVIGATION_RULE_EXTENSION = eINSTANCE.getNavigationRuleType_NavigationRuleExtension();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute NAVIGATION_RULE_TYPE__ID = eINSTANCE.getNavigationRuleType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.NullValueTypeImpl <em>Null Value Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.NullValueTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getNullValueType()
-		 * @generated
-		 */
-        EClass NULL_VALUE_TYPE = eINSTANCE.getNullValueType();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute NULL_VALUE_TYPE__ID = eINSTANCE.getNullValueType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.OrderingTypeImpl <em>Ordering Type</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.OrderingTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getOrderingType()
-		 * @generated
-		 */
-		EClass ORDERING_TYPE = eINSTANCE.getOrderingType();
-
-								/**
-		 * The meta object literal for the '<em><b>Before</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference ORDERING_TYPE__BEFORE = eINSTANCE.getOrderingType_Before();
-
-								/**
-		 * The meta object literal for the '<em><b>After</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference ORDERING_TYPE__AFTER = eINSTANCE.getOrderingType_After();
-
-								/**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.OrderingOrderingTypeImpl <em>Ordering Ordering Type</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.OrderingOrderingTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getOrderingOrderingType()
-		 * @generated
-		 */
-		EClass ORDERING_ORDERING_TYPE = eINSTANCE.getOrderingOrderingType();
-
-								/**
-		 * The meta object literal for the '<em><b>Name</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference ORDERING_ORDERING_TYPE__NAME = eINSTANCE.getOrderingOrderingType_Name();
-
-								/**
-		 * The meta object literal for the '<em><b>Others</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference ORDERING_ORDERING_TYPE__OTHERS = eINSTANCE.getOrderingOrderingType_Others();
-
-								/**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.OrderingOthersTypeImpl <em>Ordering Others Type</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.OrderingOthersTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getOrderingOthersType()
-		 * @generated
-		 */
-		EClass ORDERING_OTHERS_TYPE = eINSTANCE.getOrderingOthersType();
-
-								/**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute ORDERING_OTHERS_TYPE__ID = eINSTANCE.getOrderingOthersType_Id();
-
-								/**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PartialViewContextFactoryTypeImpl <em>Partial View Context Factory Type</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.PartialViewContextFactoryTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getPartialViewContextFactoryType()
-		 * @generated
-		 */
-		EClass PARTIAL_VIEW_CONTEXT_FACTORY_TYPE = eINSTANCE.getPartialViewContextFactoryType();
-
-								/**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute PARTIAL_VIEW_CONTEXT_FACTORY_TYPE__TEXT_CONTENT = eINSTANCE.getPartialViewContextFactoryType_TextContent();
-
-								/**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute PARTIAL_VIEW_CONTEXT_FACTORY_TYPE__ID = eINSTANCE.getPartialViewContextFactoryType_Id();
-
-								/**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PhaseListenerTypeImpl <em>Phase Listener Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.PhaseListenerTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getPhaseListenerType()
-		 * @generated
-		 */
-        EClass PHASE_LISTENER_TYPE = eINSTANCE.getPhaseListenerType();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute PHASE_LISTENER_TYPE__TEXT_CONTENT = eINSTANCE.getPhaseListenerType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute PHASE_LISTENER_TYPE__ID = eINSTANCE.getPhaseListenerType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyClassTypeImpl <em>Property Class Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyClassTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getPropertyClassType()
-		 * @generated
-		 */
-        EClass PROPERTY_CLASS_TYPE = eINSTANCE.getPropertyClassType();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute PROPERTY_CLASS_TYPE__TEXT_CONTENT = eINSTANCE.getPropertyClassType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute PROPERTY_CLASS_TYPE__ID = eINSTANCE.getPropertyClassType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyExtensionTypeImpl <em>Property Extension Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyExtensionTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getPropertyExtensionType()
-		 * @generated
-		 */
-        EClass PROPERTY_EXTENSION_TYPE = eINSTANCE.getPropertyExtensionType();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyNameTypeImpl <em>Property Name Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyNameTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getPropertyNameType()
-		 * @generated
-		 */
-        EClass PROPERTY_NAME_TYPE = eINSTANCE.getPropertyNameType();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute PROPERTY_NAME_TYPE__TEXT_CONTENT = eINSTANCE.getPropertyNameType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute PROPERTY_NAME_TYPE__ID = eINSTANCE.getPropertyNameType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyResolverTypeImpl <em>Property Resolver Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyResolverTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getPropertyResolverType()
-		 * @generated
-		 */
-        EClass PROPERTY_RESOLVER_TYPE = eINSTANCE.getPropertyResolverType();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute PROPERTY_RESOLVER_TYPE__TEXT_CONTENT = eINSTANCE.getPropertyResolverType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute PROPERTY_RESOLVER_TYPE__ID = eINSTANCE.getPropertyResolverType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyTypeImpl <em>Property Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getPropertyType()
-		 * @generated
-		 */
-        EClass PROPERTY_TYPE = eINSTANCE.getPropertyType();
-
-        /**
-		 * The meta object literal for the '<em><b>Description</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference PROPERTY_TYPE__DESCRIPTION = eINSTANCE.getPropertyType_Description();
-
-        /**
-		 * The meta object literal for the '<em><b>Display Name</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference PROPERTY_TYPE__DISPLAY_NAME = eINSTANCE.getPropertyType_DisplayName();
-
-        /**
-		 * The meta object literal for the '<em><b>Icon</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference PROPERTY_TYPE__ICON = eINSTANCE.getPropertyType_Icon();
-
-        /**
-		 * The meta object literal for the '<em><b>Property Name</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference PROPERTY_TYPE__PROPERTY_NAME = eINSTANCE.getPropertyType_PropertyName();
-
-        /**
-		 * The meta object literal for the '<em><b>Property Class</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference PROPERTY_TYPE__PROPERTY_CLASS = eINSTANCE.getPropertyType_PropertyClass();
-
-        /**
-		 * The meta object literal for the '<em><b>Default Value</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference PROPERTY_TYPE__DEFAULT_VALUE = eINSTANCE.getPropertyType_DefaultValue();
-
-        /**
-		 * The meta object literal for the '<em><b>Suggested Value</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference PROPERTY_TYPE__SUGGESTED_VALUE = eINSTANCE.getPropertyType_SuggestedValue();
-
-        /**
-		 * The meta object literal for the '<em><b>Property Extension</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference PROPERTY_TYPE__PROPERTY_EXTENSION = eINSTANCE.getPropertyType_PropertyExtension();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute PROPERTY_TYPE__ID = eINSTANCE.getPropertyType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RedirectTypeImpl <em>Redirect Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.RedirectTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getRedirectType()
-		 * @generated
-		 */
-        EClass REDIRECT_TYPE = eINSTANCE.getRedirectType();
-
-        /**
-		 * The meta object literal for the '<em><b>View Param</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference REDIRECT_TYPE__VIEW_PARAM = eINSTANCE.getRedirectType_ViewParam();
-
-								/**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute REDIRECT_TYPE__ID = eINSTANCE.getRedirectType_Id();
-
-        /**
-		 * The meta object literal for the '<em><b>Include View Params</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute REDIRECT_TYPE__INCLUDE_VIEW_PARAMS = eINSTANCE.getRedirectType_IncludeViewParams();
-
-								/**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RedirectViewParamTypeImpl <em>Redirect View Param Type</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.RedirectViewParamTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getRedirectViewParamType()
-		 * @generated
-		 */
-		EClass REDIRECT_VIEW_PARAM_TYPE = eINSTANCE.getRedirectViewParamType();
-
-								/**
-		 * The meta object literal for the '<em><b>Name</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference REDIRECT_VIEW_PARAM_TYPE__NAME = eINSTANCE.getRedirectViewParamType_Name();
-
-								/**
-		 * The meta object literal for the '<em><b>Value</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference REDIRECT_VIEW_PARAM_TYPE__VALUE = eINSTANCE.getRedirectViewParamType_Value();
-
-								/**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute REDIRECT_VIEW_PARAM_TYPE__ID = eINSTANCE.getRedirectViewParamType_Id();
-
-								/**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ReferencedBeanClassTypeImpl <em>Referenced Bean Class Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ReferencedBeanClassTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getReferencedBeanClassType()
-		 * @generated
-		 */
-        EClass REFERENCED_BEAN_CLASS_TYPE = eINSTANCE.getReferencedBeanClassType();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute REFERENCED_BEAN_CLASS_TYPE__TEXT_CONTENT = eINSTANCE.getReferencedBeanClassType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute REFERENCED_BEAN_CLASS_TYPE__ID = eINSTANCE.getReferencedBeanClassType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ReferencedBeanNameTypeImpl <em>Referenced Bean Name Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ReferencedBeanNameTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getReferencedBeanNameType()
-		 * @generated
-		 */
-        EClass REFERENCED_BEAN_NAME_TYPE = eINSTANCE.getReferencedBeanNameType();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute REFERENCED_BEAN_NAME_TYPE__TEXT_CONTENT = eINSTANCE.getReferencedBeanNameType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute REFERENCED_BEAN_NAME_TYPE__ID = eINSTANCE.getReferencedBeanNameType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ReferencedBeanTypeImpl <em>Referenced Bean Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ReferencedBeanTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getReferencedBeanType()
-		 * @generated
-		 */
-        EClass REFERENCED_BEAN_TYPE = eINSTANCE.getReferencedBeanType();
-
-        /**
-		 * The meta object literal for the '<em><b>Description</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference REFERENCED_BEAN_TYPE__DESCRIPTION = eINSTANCE.getReferencedBeanType_Description();
-
-        /**
-		 * The meta object literal for the '<em><b>Display Name</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference REFERENCED_BEAN_TYPE__DISPLAY_NAME = eINSTANCE.getReferencedBeanType_DisplayName();
-
-        /**
-		 * The meta object literal for the '<em><b>Icon</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference REFERENCED_BEAN_TYPE__ICON = eINSTANCE.getReferencedBeanType_Icon();
-
-        /**
-		 * The meta object literal for the '<em><b>Referenced Bean Name</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference REFERENCED_BEAN_TYPE__REFERENCED_BEAN_NAME = eINSTANCE.getReferencedBeanType_ReferencedBeanName();
-
-        /**
-		 * The meta object literal for the '<em><b>Referenced Bean Class</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference REFERENCED_BEAN_TYPE__REFERENCED_BEAN_CLASS = eINSTANCE.getReferencedBeanType_ReferencedBeanClass();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute REFERENCED_BEAN_TYPE__ID = eINSTANCE.getReferencedBeanType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RendererClassTypeImpl <em>Renderer Class Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.RendererClassTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getRendererClassType()
-		 * @generated
-		 */
-        EClass RENDERER_CLASS_TYPE = eINSTANCE.getRendererClassType();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute RENDERER_CLASS_TYPE__TEXT_CONTENT = eINSTANCE.getRendererClassType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute RENDERER_CLASS_TYPE__ID = eINSTANCE.getRendererClassType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RendererExtensionTypeImpl <em>Renderer Extension Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.RendererExtensionTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getRendererExtensionType()
-		 * @generated
-		 */
-        EClass RENDERER_EXTENSION_TYPE = eINSTANCE.getRendererExtensionType();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RendererTypeImpl <em>Renderer Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.RendererTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getRendererType()
-		 * @generated
-		 */
-        EClass RENDERER_TYPE = eINSTANCE.getRendererType();
-
-        /**
-		 * The meta object literal for the '<em><b>Description</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference RENDERER_TYPE__DESCRIPTION = eINSTANCE.getRendererType_Description();
-
-        /**
-		 * The meta object literal for the '<em><b>Display Name</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference RENDERER_TYPE__DISPLAY_NAME = eINSTANCE.getRendererType_DisplayName();
-
-        /**
-		 * The meta object literal for the '<em><b>Icon</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference RENDERER_TYPE__ICON = eINSTANCE.getRendererType_Icon();
-
-        /**
-		 * The meta object literal for the '<em><b>Component Family</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference RENDERER_TYPE__COMPONENT_FAMILY = eINSTANCE.getRendererType_ComponentFamily();
-
-        /**
-		 * The meta object literal for the '<em><b>Renderer Type</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference RENDERER_TYPE__RENDERER_TYPE = eINSTANCE.getRendererType_RendererType();
-
-        /**
-		 * The meta object literal for the '<em><b>Renderer Class</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference RENDERER_TYPE__RENDERER_CLASS = eINSTANCE.getRendererType_RendererClass();
-
-        /**
-		 * The meta object literal for the '<em><b>Facet</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference RENDERER_TYPE__FACET = eINSTANCE.getRendererType_Facet();
-
-        /**
-		 * The meta object literal for the '<em><b>Attribute</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference RENDERER_TYPE__ATTRIBUTE = eINSTANCE.getRendererType_Attribute();
-
-        /**
-		 * The meta object literal for the '<em><b>Renderer Extension</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference RENDERER_TYPE__RENDERER_EXTENSION = eINSTANCE.getRendererType_RendererExtension();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute RENDERER_TYPE__ID = eINSTANCE.getRendererType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RendererTypeTypeImpl <em>Renderer Type Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.RendererTypeTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getRendererTypeType()
-		 * @generated
-		 */
-        EClass RENDERER_TYPE_TYPE = eINSTANCE.getRendererTypeType();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute RENDERER_TYPE_TYPE__TEXT_CONTENT = eINSTANCE.getRendererTypeType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute RENDERER_TYPE_TYPE__ID = eINSTANCE.getRendererTypeType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitClassTypeImpl <em>Render Kit Class Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitClassTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getRenderKitClassType()
-		 * @generated
-		 */
-        EClass RENDER_KIT_CLASS_TYPE = eINSTANCE.getRenderKitClassType();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute RENDER_KIT_CLASS_TYPE__TEXT_CONTENT = eINSTANCE.getRenderKitClassType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute RENDER_KIT_CLASS_TYPE__ID = eINSTANCE.getRenderKitClassType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitFactoryTypeImpl <em>Render Kit Factory Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitFactoryTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getRenderKitFactoryType()
-		 * @generated
-		 */
-        EClass RENDER_KIT_FACTORY_TYPE = eINSTANCE.getRenderKitFactoryType();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute RENDER_KIT_FACTORY_TYPE__TEXT_CONTENT = eINSTANCE.getRenderKitFactoryType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute RENDER_KIT_FACTORY_TYPE__ID = eINSTANCE.getRenderKitFactoryType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitIdTypeImpl <em>Render Kit Id Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitIdTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getRenderKitIdType()
-		 * @generated
-		 */
-        EClass RENDER_KIT_ID_TYPE = eINSTANCE.getRenderKitIdType();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute RENDER_KIT_ID_TYPE__TEXT_CONTENT = eINSTANCE.getRenderKitIdType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute RENDER_KIT_ID_TYPE__ID = eINSTANCE.getRenderKitIdType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitTypeImpl <em>Render Kit Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getRenderKitType()
-		 * @generated
-		 */
-        EClass RENDER_KIT_TYPE = eINSTANCE.getRenderKitType();
-
-        /**
-		 * The meta object literal for the '<em><b>Description</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference RENDER_KIT_TYPE__DESCRIPTION = eINSTANCE.getRenderKitType_Description();
-
-        /**
-		 * The meta object literal for the '<em><b>Display Name</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference RENDER_KIT_TYPE__DISPLAY_NAME = eINSTANCE.getRenderKitType_DisplayName();
-
-        /**
-		 * The meta object literal for the '<em><b>Icon</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference RENDER_KIT_TYPE__ICON = eINSTANCE.getRenderKitType_Icon();
-
-        /**
-		 * The meta object literal for the '<em><b>Render Kit Id</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference RENDER_KIT_TYPE__RENDER_KIT_ID = eINSTANCE.getRenderKitType_RenderKitId();
-
-        /**
-		 * The meta object literal for the '<em><b>Render Kit Class</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference RENDER_KIT_TYPE__RENDER_KIT_CLASS = eINSTANCE.getRenderKitType_RenderKitClass();
-
-        /**
-		 * The meta object literal for the '<em><b>Renderer</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference RENDER_KIT_TYPE__RENDERER = eINSTANCE.getRenderKitType_Renderer();
-
-        /**
-		 * The meta object literal for the '<em><b>Client Behavior Renderer</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference RENDER_KIT_TYPE__CLIENT_BEHAVIOR_RENDERER = eINSTANCE.getRenderKitType_ClientBehaviorRenderer();
-
-								/**
-		 * The meta object literal for the '<em><b>Render Kit Extension</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference RENDER_KIT_TYPE__RENDER_KIT_EXTENSION = eINSTANCE.getRenderKitType_RenderKitExtension();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute RENDER_KIT_TYPE__ID = eINSTANCE.getRenderKitType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.SmallIconTypeImpl <em>Small Icon Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.SmallIconTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getSmallIconType()
-		 * @generated
-		 */
-        EClass SMALL_ICON_TYPE = eINSTANCE.getSmallIconType();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute SMALL_ICON_TYPE__TEXT_CONTENT = eINSTANCE.getSmallIconType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute SMALL_ICON_TYPE__ID = eINSTANCE.getSmallIconType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.SourceClassTypeImpl <em>Source Class Type</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.SourceClassTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getSourceClassType()
-		 * @generated
-		 */
-		EClass SOURCE_CLASS_TYPE = eINSTANCE.getSourceClassType();
-
-								/**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute SOURCE_CLASS_TYPE__TEXT_CONTENT = eINSTANCE.getSourceClassType_TextContent();
-
-								/**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute SOURCE_CLASS_TYPE__ID = eINSTANCE.getSourceClassType_Id();
-
-								/**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.StateManagerTypeImpl <em>State Manager Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.StateManagerTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getStateManagerType()
-		 * @generated
-		 */
-        EClass STATE_MANAGER_TYPE = eINSTANCE.getStateManagerType();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute STATE_MANAGER_TYPE__TEXT_CONTENT = eINSTANCE.getStateManagerType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute STATE_MANAGER_TYPE__ID = eINSTANCE.getStateManagerType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.SuggestedValueTypeImpl <em>Suggested Value Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.SuggestedValueTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getSuggestedValueType()
-		 * @generated
-		 */
-        EClass SUGGESTED_VALUE_TYPE = eINSTANCE.getSuggestedValueType();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute SUGGESTED_VALUE_TYPE__TEXT_CONTENT = eINSTANCE.getSuggestedValueType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute SUGGESTED_VALUE_TYPE__ID = eINSTANCE.getSuggestedValueType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.SupportedLocaleTypeImpl <em>Supported Locale Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.SupportedLocaleTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getSupportedLocaleType()
-		 * @generated
-		 */
-        EClass SUPPORTED_LOCALE_TYPE = eINSTANCE.getSupportedLocaleType();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute SUPPORTED_LOCALE_TYPE__TEXT_CONTENT = eINSTANCE.getSupportedLocaleType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute SUPPORTED_LOCALE_TYPE__ID = eINSTANCE.getSupportedLocaleType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.SystemEventClassTypeImpl <em>System Event Class Type</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.SystemEventClassTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getSystemEventClassType()
-		 * @generated
-		 */
-		EClass SYSTEM_EVENT_CLASS_TYPE = eINSTANCE.getSystemEventClassType();
-
-								/**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute SYSTEM_EVENT_CLASS_TYPE__TEXT_CONTENT = eINSTANCE.getSystemEventClassType_TextContent();
-
-								/**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute SYSTEM_EVENT_CLASS_TYPE__ID = eINSTANCE.getSystemEventClassType_Id();
-
-								/**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.SystemEventListenerClassTypeImpl <em>System Event Listener Class Type</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.SystemEventListenerClassTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getSystemEventListenerClassType()
-		 * @generated
-		 */
-		EClass SYSTEM_EVENT_LISTENER_CLASS_TYPE = eINSTANCE.getSystemEventListenerClassType();
-
-								/**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute SYSTEM_EVENT_LISTENER_CLASS_TYPE__TEXT_CONTENT = eINSTANCE.getSystemEventListenerClassType_TextContent();
-
-								/**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute SYSTEM_EVENT_LISTENER_CLASS_TYPE__ID = eINSTANCE.getSystemEventListenerClassType_Id();
-
-								/**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.SystemEventListenerTypeImpl <em>System Event Listener Type</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.SystemEventListenerTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getSystemEventListenerType()
-		 * @generated
-		 */
-		EClass SYSTEM_EVENT_LISTENER_TYPE = eINSTANCE.getSystemEventListenerType();
-
-								/**
-		 * The meta object literal for the '<em><b>System Event Listener Class</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference SYSTEM_EVENT_LISTENER_TYPE__SYSTEM_EVENT_LISTENER_CLASS = eINSTANCE.getSystemEventListenerType_SystemEventListenerClass();
-
-								/**
-		 * The meta object literal for the '<em><b>System Event Class</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference SYSTEM_EVENT_LISTENER_TYPE__SYSTEM_EVENT_CLASS = eINSTANCE.getSystemEventListenerType_SystemEventClass();
-
-								/**
-		 * The meta object literal for the '<em><b>Source Class</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference SYSTEM_EVENT_LISTENER_TYPE__SOURCE_CLASS = eINSTANCE.getSystemEventListenerType_SourceClass();
-
-								/**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute SYSTEM_EVENT_LISTENER_TYPE__ID = eINSTANCE.getSystemEventListenerType_Id();
-
-								/**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.TagHandlerDelegateFactoryTypeImpl <em>Tag Handler Delegate Factory Type</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.TagHandlerDelegateFactoryTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getTagHandlerDelegateFactoryType()
-		 * @generated
-		 */
-		EClass TAG_HANDLER_DELEGATE_FACTORY_TYPE = eINSTANCE.getTagHandlerDelegateFactoryType();
-
-								/**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute TAG_HANDLER_DELEGATE_FACTORY_TYPE__TEXT_CONTENT = eINSTANCE.getTagHandlerDelegateFactoryType_TextContent();
-
-								/**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute TAG_HANDLER_DELEGATE_FACTORY_TYPE__ID = eINSTANCE.getTagHandlerDelegateFactoryType_Id();
-
-								/**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ToViewIdTypeImpl <em>To View Id Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ToViewIdTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getToViewIdType()
-		 * @generated
-		 */
-        EClass TO_VIEW_ID_TYPE = eINSTANCE.getToViewIdType();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute TO_VIEW_ID_TYPE__TEXT_CONTENT = eINSTANCE.getToViewIdType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute TO_VIEW_ID_TYPE__ID = eINSTANCE.getToViewIdType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ValidatorClassTypeImpl <em>Validator Class Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ValidatorClassTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getValidatorClassType()
-		 * @generated
-		 */
-        EClass VALIDATOR_CLASS_TYPE = eINSTANCE.getValidatorClassType();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute VALIDATOR_CLASS_TYPE__TEXT_CONTENT = eINSTANCE.getValidatorClassType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute VALIDATOR_CLASS_TYPE__ID = eINSTANCE.getValidatorClassType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ValidatorIdTypeImpl <em>Validator Id Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ValidatorIdTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getValidatorIdType()
-		 * @generated
-		 */
-        EClass VALIDATOR_ID_TYPE = eINSTANCE.getValidatorIdType();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute VALIDATOR_ID_TYPE__TEXT_CONTENT = eINSTANCE.getValidatorIdType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute VALIDATOR_ID_TYPE__ID = eINSTANCE.getValidatorIdType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ValidatorTypeImpl <em>Validator Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ValidatorTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getValidatorType()
-		 * @generated
-		 */
-        EClass VALIDATOR_TYPE = eINSTANCE.getValidatorType();
-
-        /**
-		 * The meta object literal for the '<em><b>Description</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference VALIDATOR_TYPE__DESCRIPTION = eINSTANCE.getValidatorType_Description();
-
-        /**
-		 * The meta object literal for the '<em><b>Display Name</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference VALIDATOR_TYPE__DISPLAY_NAME = eINSTANCE.getValidatorType_DisplayName();
-
-        /**
-		 * The meta object literal for the '<em><b>Icon</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference VALIDATOR_TYPE__ICON = eINSTANCE.getValidatorType_Icon();
-
-        /**
-		 * The meta object literal for the '<em><b>Validator Id</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference VALIDATOR_TYPE__VALIDATOR_ID = eINSTANCE.getValidatorType_ValidatorId();
-
-        /**
-		 * The meta object literal for the '<em><b>Validator Class</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference VALIDATOR_TYPE__VALIDATOR_CLASS = eINSTANCE.getValidatorType_ValidatorClass();
-
-        /**
-		 * The meta object literal for the '<em><b>Attribute</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference VALIDATOR_TYPE__ATTRIBUTE = eINSTANCE.getValidatorType_Attribute();
-
-        /**
-		 * The meta object literal for the '<em><b>Property</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference VALIDATOR_TYPE__PROPERTY = eINSTANCE.getValidatorType_Property();
-
-        /**
-		 * The meta object literal for the '<em><b>Validator Extension</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference VALIDATOR_TYPE__VALIDATOR_EXTENSION = eINSTANCE.getValidatorType_ValidatorExtension();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute VALIDATOR_TYPE__ID = eINSTANCE.getValidatorType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ValueClassTypeImpl <em>Value Class Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ValueClassTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getValueClassType()
-		 * @generated
-		 */
-        EClass VALUE_CLASS_TYPE = eINSTANCE.getValueClassType();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute VALUE_CLASS_TYPE__TEXT_CONTENT = eINSTANCE.getValueClassType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute VALUE_CLASS_TYPE__ID = eINSTANCE.getValueClassType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ValueTypeImpl <em>Value Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ValueTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getValueType()
-		 * @generated
-		 */
-        EClass VALUE_TYPE = eINSTANCE.getValueType();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute VALUE_TYPE__TEXT_CONTENT = eINSTANCE.getValueType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute VALUE_TYPE__ID = eINSTANCE.getValueType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.VariableResolverTypeImpl <em>Variable Resolver Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.VariableResolverTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getVariableResolverType()
-		 * @generated
-		 */
-        EClass VARIABLE_RESOLVER_TYPE = eINSTANCE.getVariableResolverType();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute VARIABLE_RESOLVER_TYPE__TEXT_CONTENT = eINSTANCE.getVariableResolverType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute VARIABLE_RESOLVER_TYPE__ID = eINSTANCE.getVariableResolverType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ViewHandlerTypeImpl <em>View Handler Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ViewHandlerTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getViewHandlerType()
-		 * @generated
-		 */
-        EClass VIEW_HANDLER_TYPE = eINSTANCE.getViewHandlerType();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute VIEW_HANDLER_TYPE__TEXT_CONTENT = eINSTANCE.getViewHandlerType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute VIEW_HANDLER_TYPE__ID = eINSTANCE.getViewHandlerType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ResourceBundleTypeImpl <em>Resource Bundle Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ResourceBundleTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getResourceBundleType()
-		 * @generated
-		 */
-        EClass RESOURCE_BUNDLE_TYPE = eINSTANCE.getResourceBundleType();
-
-        /**
-		 * The meta object literal for the '<em><b>Description</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference RESOURCE_BUNDLE_TYPE__DESCRIPTION = eINSTANCE.getResourceBundleType_Description();
-
-        /**
-		 * The meta object literal for the '<em><b>Display Name</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference RESOURCE_BUNDLE_TYPE__DISPLAY_NAME = eINSTANCE.getResourceBundleType_DisplayName();
-
-        /**
-		 * The meta object literal for the '<em><b>Icon</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference RESOURCE_BUNDLE_TYPE__ICON = eINSTANCE.getResourceBundleType_Icon();
-
-        /**
-		 * The meta object literal for the '<em><b>Base Name</b></em>' reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference RESOURCE_BUNDLE_TYPE__BASE_NAME = eINSTANCE.getResourceBundleType_BaseName();
-
-        /**
-		 * The meta object literal for the '<em><b>Var</b></em>' reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference RESOURCE_BUNDLE_TYPE__VAR = eINSTANCE.getResourceBundleType_Var();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute RESOURCE_BUNDLE_TYPE__ID = eINSTANCE.getResourceBundleType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.BaseNameTypeImpl <em>Base Name Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.BaseNameTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getBaseNameType()
-		 * @generated
-		 */
-        EClass BASE_NAME_TYPE = eINSTANCE.getBaseNameType();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute BASE_NAME_TYPE__TEXT_CONTENT = eINSTANCE.getBaseNameType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute BASE_NAME_TYPE__ID = eINSTANCE.getBaseNameType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.VarTypeImpl <em>Var Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.VarTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getVarType()
-		 * @generated
-		 */
-        EClass VAR_TYPE = eINSTANCE.getVarType();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute VAR_TYPE__TEXT_CONTENT = eINSTANCE.getVarType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute VAR_TYPE__ID = eINSTANCE.getVarType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ViewDeclarationLanguageFactoryTypeImpl <em>View Declaration Language Factory Type</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ViewDeclarationLanguageFactoryTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getViewDeclarationLanguageFactoryType()
-		 * @generated
-		 */
-		EClass VIEW_DECLARATION_LANGUAGE_FACTORY_TYPE = eINSTANCE.getViewDeclarationLanguageFactoryType();
-
-								/**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute VIEW_DECLARATION_LANGUAGE_FACTORY_TYPE__TEXT_CONTENT = eINSTANCE.getViewDeclarationLanguageFactoryType_TextContent();
-
-								/**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute VIEW_DECLARATION_LANGUAGE_FACTORY_TYPE__ID = eINSTANCE.getViewDeclarationLanguageFactoryType_Id();
-
-								/**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.VisitContextFactoryTypeImpl <em>Visit Context Factory Type</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.VisitContextFactoryTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getVisitContextFactoryType()
-		 * @generated
-		 */
-		EClass VISIT_CONTEXT_FACTORY_TYPE = eINSTANCE.getVisitContextFactoryType();
-
-								/**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute VISIT_CONTEXT_FACTORY_TYPE__TEXT_CONTENT = eINSTANCE.getVisitContextFactoryType_TextContent();
-
-								/**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute VISIT_CONTEXT_FACTORY_TYPE__ID = eINSTANCE.getVisitContextFactoryType_Id();
-
-								/**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitExtensionTypeImpl <em>Render Kit Extension Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitExtensionTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getRenderKitExtensionType()
-		 * @generated
-		 */
-        EClass RENDER_KIT_EXTENSION_TYPE = eINSTANCE.getRenderKitExtensionType();
-
-            /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ResourceHandlerTypeImpl <em>Resource Handler Type</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ResourceHandlerTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getResourceHandlerType()
-		 * @generated
-		 */
-		EClass RESOURCE_HANDLER_TYPE = eINSTANCE.getResourceHandlerType();
-
-								/**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute RESOURCE_HANDLER_TYPE__TEXT_CONTENT = eINSTANCE.getResourceHandlerType_TextContent();
-
-								/**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute RESOURCE_HANDLER_TYPE__ID = eINSTANCE.getResourceHandlerType_Id();
-
-												/**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationRuleExtensionTypeImpl <em>Navigation Rule Extension Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationRuleExtensionTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getNavigationRuleExtensionType()
-		 * @generated
-		 */
-        EClass NAVIGATION_RULE_EXTENSION_TYPE = eINSTANCE.getNavigationRuleExtensionType();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ValidatorExtensionTypeImpl <em>Validator Extension Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ValidatorExtensionTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getValidatorExtensionType()
-		 * @generated
-		 */
-        EClass VALIDATOR_EXTENSION_TYPE = eINSTANCE.getValidatorExtensionType();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigExtensionTypeImpl <em>Extension Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigExtensionTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getFacesConfigExtensionType()
-		 * @generated
-		 */
-        EClass FACES_CONFIG_EXTENSION_TYPE = eINSTANCE.getFacesConfigExtensionType();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FactoryExtensionTypeImpl <em>Factory Extension Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FactoryExtensionTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getFactoryExtensionType()
-		 * @generated
-		 */
-        EClass FACTORY_EXTENSION_TYPE = eINSTANCE.getFactoryExtensionType();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.LifecycleExtensionTypeImpl <em>Lifecycle Extension Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.LifecycleExtensionTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getLifecycleExtensionType()
-		 * @generated
-		 */
-        EClass LIFECYCLE_EXTENSION_TYPE = eINSTANCE.getLifecycleExtensionType();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanExtensionTypeImpl <em>Managed Bean Extension Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanExtensionTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getManagedBeanExtensionType()
-		 * @generated
-		 */
-        EClass MANAGED_BEAN_EXTENSION_TYPE = eINSTANCE.getManagedBeanExtensionType();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterExtensionTypeImpl <em>Converter Extension Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterExtensionTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getConverterExtensionType()
-		 * @generated
-		 */
-        EClass CONVERTER_EXTENSION_TYPE = eINSTANCE.getConverterExtensionType();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ExtensionTypeImpl <em>Extension Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ExtensionTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getExtensionType()
-		 * @generated
-		 */
-        EClass EXTENSION_TYPE = eINSTANCE.getExtensionType();
-
-        /**
-		 * The meta object literal for the '<em><b>Child Nodes</b></em>' reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference EXTENSION_TYPE__CHILD_NODES = eINSTANCE.getExtensionType_ChildNodes();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute EXTENSION_TYPE__TEXT_CONTENT = eINSTANCE.getExtensionType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute EXTENSION_TYPE__ID = eINSTANCE.getExtensionType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ExternalContextFactoryTypeImpl <em>External Context Factory Type</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ExternalContextFactoryTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getExternalContextFactoryType()
-		 * @generated
-		 */
-		EClass EXTERNAL_CONTEXT_FACTORY_TYPE = eINSTANCE.getExternalContextFactoryType();
-
-								/**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute EXTERNAL_CONTEXT_FACTORY_TYPE__TEXT_CONTENT = eINSTANCE.getExternalContextFactoryType_TextContent();
-
-								/**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute EXTERNAL_CONTEXT_FACTORY_TYPE__ID = eINSTANCE.getExternalContextFactoryType_Id();
-
-								/**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ApplicationExtensionTypeImpl <em>Application Extension Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ApplicationExtensionTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getApplicationExtensionType()
-		 * @generated
-		 */
-        EClass APPLICATION_EXTENSION_TYPE = eINSTANCE.getApplicationExtensionType();
-
-}
-
-} //FacesConfigPackage
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FacesConfigType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FacesConfigType.java
deleted file mode 100644
index 825bac3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FacesConfigType.java
+++ /dev/null
@@ -1,442 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getApplication <em>Application</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getOrdering <em>Ordering</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getAbsoluteOrdering <em>Absolute Ordering</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getFactory <em>Factory</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getComponent <em>Component</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getConverter <em>Converter</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getManagedBean <em>Managed Bean</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getName <em>Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getNavigationRule <em>Navigation Rule</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getReferencedBean <em>Referenced Bean</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getRenderKit <em>Render Kit</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getLifecycle <em>Lifecycle</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getValidator <em>Validator</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getBehavior <em>Behavior</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getFacesConfigExtension <em>Faces Config Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getXmlns <em>Xmlns</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getId <em>Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#isMetadataComplete <em>Metadata Complete</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFacesConfigType()
- * @model extendedMetaData="name='faces-config_._type' kind='elementOnly'"
- * @generated
- */
-public interface FacesConfigType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Application</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Application</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Application</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFacesConfigType_Application()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.ApplicationType" containment="true"
-	 *        extendedMetaData="kind='element' name='application' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getApplication();
-
-    /**
-	 * Returns the value of the '<em><b>Ordering</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.OrderingType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Ordering</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Ordering</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFacesConfigType_Ordering()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.OrderingType" containment="true"
-	 *        extendedMetaData="kind='element' name='ordering' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getOrdering();
-
-				/**
-	 * Returns the value of the '<em><b>Absolute Ordering</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Absolute Ordering</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Absolute Ordering</em>' containment reference.
-	 * @see #setAbsoluteOrdering(AbsoluteOrderingType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFacesConfigType_AbsoluteOrdering()
-	 * @model containment="true"
-	 *        extendedMetaData="kind='element' name='absolute-ordering' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	AbsoluteOrderingType getAbsoluteOrdering();
-
-				/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getAbsoluteOrdering <em>Absolute Ordering</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Absolute Ordering</em>' containment reference.
-	 * @see #getAbsoluteOrdering()
-	 * @generated
-	 */
-	void setAbsoluteOrdering(AbsoluteOrderingType value);
-
-				/**
-	 * Returns the value of the '<em><b>Factory</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.FactoryType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Factory</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Factory</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFacesConfigType_Factory()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.FactoryType" containment="true"
-	 *        extendedMetaData="kind='element' name='factory' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getFactory();
-
-    /**
-	 * Returns the value of the '<em><b>Component</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.ComponentType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Component</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Component</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFacesConfigType_Component()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.ComponentType" containment="true"
-	 *        extendedMetaData="kind='element' name='component' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getComponent();
-
-    /**
-	 * Returns the value of the '<em><b>Converter</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.ConverterType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Converter</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Converter</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFacesConfigType_Converter()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.ConverterType" containment="true"
-	 *        extendedMetaData="kind='element' name='converter' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getConverter();
-
-    /**
-	 * Returns the value of the '<em><b>Managed Bean</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Managed Bean</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Managed Bean</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFacesConfigType_ManagedBean()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType" containment="true"
-	 *        extendedMetaData="kind='element' name='managed-bean' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getManagedBean();
-
-    /**
-	 * Returns the value of the '<em><b>Name</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Name</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Name</em>' containment reference.
-	 * @see #setName(NameType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFacesConfigType_Name()
-	 * @model containment="true"
-	 *        extendedMetaData="kind='element' name='name' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	NameType getName();
-
-				/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getName <em>Name</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Name</em>' containment reference.
-	 * @see #getName()
-	 * @generated
-	 */
-	void setName(NameType value);
-
-				/**
-	 * Returns the value of the '<em><b>Navigation Rule</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Navigation Rule</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Navigation Rule</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFacesConfigType_NavigationRule()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType" containment="true"
-	 *        extendedMetaData="kind='element' name='navigation-rule' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getNavigationRule();
-
-    /**
-	 * Returns the value of the '<em><b>Referenced Bean</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Referenced Bean</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Referenced Bean</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFacesConfigType_ReferencedBean()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanType" containment="true"
-	 *        extendedMetaData="kind='element' name='referenced-bean' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getReferencedBean();
-
-    /**
-	 * Returns the value of the '<em><b>Render Kit</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Render Kit</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Render Kit</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFacesConfigType_RenderKit()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.RenderKitType" containment="true"
-	 *        extendedMetaData="kind='element' name='render-kit' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getRenderKit();
-
-    /**
-	 * Returns the value of the '<em><b>Lifecycle</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.LifecycleType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Lifecycle</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Lifecycle</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFacesConfigType_Lifecycle()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.LifecycleType" containment="true"
-	 *        extendedMetaData="kind='element' name='lifecycle' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getLifecycle();
-
-    /**
-	 * Returns the value of the '<em><b>Validator</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Validator</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Validator</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFacesConfigType_Validator()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.ValidatorType" containment="true"
-	 *        extendedMetaData="kind='element' name='validator' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getValidator();
-
-    /**
-	 * Returns the value of the '<em><b>Behavior</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.BehaviorType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Behavior</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Behavior</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFacesConfigType_Behavior()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.BehaviorType" containment="true"
-	 *        extendedMetaData="kind='element' name='behavior' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getBehavior();
-
-				/**
-	 * Returns the value of the '<em><b>Faces Config Extension</b></em>' reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigExtensionType}.
-	 * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Faces Config Extension</em>' reference list isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-	 * @return the value of the '<em>Faces Config Extension</em>' reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFacesConfigType_FacesConfigExtension()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.FacesConfigExtensionType"
-	 *        extendedMetaData="kind='element' name='faces-config-extension' namespace='##targetNamespace'"
-	 * @generated
-	 */
-    EList getFacesConfigExtension();
-
-    /**
-	 * Returns the value of the '<em><b>Xmlns</b></em>' attribute.
-	 * The default value is <code>"http://java.sun.com/JSF/Configuration"</code>.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Xmlns</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Xmlns</em>' attribute.
-	 * @see #isSetXmlns()
-	 * @see #unsetXmlns()
-	 * @see #setXmlns(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFacesConfigType_Xmlns()
-	 * @model default="http://java.sun.com/JSF/Configuration" unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='attribute' name='xmlns' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getXmlns();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getXmlns <em>Xmlns</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Xmlns</em>' attribute.
-	 * @see #isSetXmlns()
-	 * @see #unsetXmlns()
-	 * @see #getXmlns()
-	 * @generated
-	 */
-	void setXmlns(String value);
-
-    /**
-	 * Unsets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getXmlns <em>Xmlns</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetXmlns()
-	 * @see #getXmlns()
-	 * @see #setXmlns(String)
-	 * @generated
-	 */
-	void unsetXmlns();
-
-    /**
-	 * Returns whether the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getXmlns <em>Xmlns</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>Xmlns</em>' attribute is set.
-	 * @see #unsetXmlns()
-	 * @see #getXmlns()
-	 * @see #setXmlns(String)
-	 * @generated
-	 */
-	boolean isSetXmlns();
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFacesConfigType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-				/**
-	 * Returns the value of the '<em><b>Metadata Complete</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Metadata Complete</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Metadata Complete</em>' attribute.
-	 * @see #setMetadataComplete(boolean)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFacesConfigType_MetadataComplete()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Boolean"
-	 *        extendedMetaData="kind='attribute' name='metadata-complete' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	boolean isMetadataComplete();
-
-				/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#isMetadataComplete <em>Metadata Complete</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Metadata Complete</em>' attribute.
-	 * @see #isMetadataComplete()
-	 * @generated
-	 */
-	void setMetadataComplete(boolean value);
-
-} // FacesConfigType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FacesContextFactoryType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FacesContextFactoryType.java
deleted file mode 100644
index a520c01..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FacesContextFactoryType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Faces Context Factory Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FacesContextFactoryType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FacesContextFactoryType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFacesContextFactoryType()
- * @model extendedMetaData="name='faces-context-factory_._type' kind='simple'"
- * @generated
- */
-public interface FacesContextFactoryType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFacesContextFactoryType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.FacesContextFactoryType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFacesContextFactoryType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.FacesContextFactoryType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // FacesContextFactoryType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FacetExtensionType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FacetExtensionType.java
deleted file mode 100644
index 9f7d387..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FacetExtensionType.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Facet Extension Type</b></em>'.
- * <!-- end-user-doc -->
- *
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFacetExtensionType()
- * @model extendedMetaData="name='facet-extension_._type'"
- * @generated
- */
-public interface FacetExtensionType extends ExtensionType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-} // FacetExtensionType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FacetNameType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FacetNameType.java
deleted file mode 100644
index 5732733..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FacetNameType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Facet Name Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FacetNameType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FacetNameType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFacetNameType()
- * @model extendedMetaData="name='facet-name_._type' kind='simple'"
- * @generated
- */
-public interface FacetNameType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFacetNameType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.FacetNameType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFacetNameType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.FacetNameType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // FacetNameType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FacetType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FacetType.java
deleted file mode 100644
index 9cb62f3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FacetType.java
+++ /dev/null
@@ -1,168 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Facet Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FacetType#getDescription <em>Description</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FacetType#getDisplayName <em>Display Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FacetType#getIcon <em>Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FacetType#getFacetName <em>Facet Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FacetType#getFacetExtension <em>Facet Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FacetType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFacetType()
- * @model extendedMetaData="name='facet_._type' kind='elementOnly'"
- * @generated
- */
-public interface FacetType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Description</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.DescriptionType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Description</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Description</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFacetType_Description()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.DescriptionType" containment="true"
-	 *        extendedMetaData="kind='element' name='description' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getDescription();
-
-    /**
-	 * Returns the value of the '<em><b>Display Name</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Display Name</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Display Name</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFacetType_DisplayName()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType" containment="true"
-	 *        extendedMetaData="kind='element' name='display-name' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getDisplayName();
-
-    /**
-	 * Returns the value of the '<em><b>Icon</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.IconType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Icon</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Icon</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFacetType_Icon()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.IconType" containment="true"
-	 *        extendedMetaData="kind='element' name='icon' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getIcon();
-
-    /**
-	 * Returns the value of the '<em><b>Facet Name</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Facet Name</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Facet Name</em>' containment reference.
-	 * @see #setFacetName(FacetNameType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFacetType_FacetName()
-	 * @model containment="true" required="true"
-	 *        extendedMetaData="kind='element' name='facet-name' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	FacetNameType getFacetName();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.FacetType#getFacetName <em>Facet Name</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Facet Name</em>' containment reference.
-	 * @see #getFacetName()
-	 * @generated
-	 */
-	void setFacetName(FacetNameType value);
-
-    /**
-	 * Returns the value of the '<em><b>Facet Extension</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.FacetExtensionType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Facet Extension</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Facet Extension</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFacetType_FacetExtension()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.FacetExtensionType" containment="true"
-	 *        extendedMetaData="kind='element' name='facet-extension' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getFacetExtension();
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFacetType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.FacetType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // FacetType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FactoryExtensionType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FactoryExtensionType.java
deleted file mode 100644
index 67d67f5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FactoryExtensionType.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Factory Extension Type</b></em>'.
- * <!-- end-user-doc -->
- *
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFactoryExtensionType()
- * @model extendedMetaData="name='factory-extension_._type'"
- * @generated
- */
-public interface FactoryExtensionType extends ExtensionType {
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-} // FactoryExtensionType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FactoryType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FactoryType.java
deleted file mode 100644
index e2b9880..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FactoryType.java
+++ /dev/null
@@ -1,266 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Factory Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FactoryType#getApplicationFactory <em>Application Factory</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FactoryType#getExceptionHandlerFactory <em>Exception Handler Factory</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FactoryType#getExternalContextFactory <em>External Context Factory</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FactoryType#getFacesContextFactory <em>Faces Context Factory</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FactoryType#getPartialViewContextFactory <em>Partial View Context Factory</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FactoryType#getLifecycleFactory <em>Lifecycle Factory</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FactoryType#getViewDeclarationLanguageFactory <em>View Declaration Language Factory</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FactoryType#getTagHandlerDelegateFactory <em>Tag Handler Delegate Factory</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FactoryType#getRenderKitFactory <em>Render Kit Factory</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FactoryType#getVisitContextFactory <em>Visit Context Factory</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FactoryType#getFactoryExtension <em>Factory Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FactoryType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFactoryType()
- * @model extendedMetaData="name='factory_._type' kind='elementOnly'"
- * @generated
- */
-public interface FactoryType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Application Factory</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationFactoryType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Application Factory</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Application Factory</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFactoryType_ApplicationFactory()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.ApplicationFactoryType" containment="true"
-	 *        extendedMetaData="kind='element' name='application-factory' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getApplicationFactory();
-
-    /**
-	 * Returns the value of the '<em><b>Exception Handler Factory</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.ExceptionHandlerFactoryType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Exception Handler Factory</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Exception Handler Factory</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFactoryType_ExceptionHandlerFactory()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.ExceptionHandlerFactoryType" containment="true"
-	 *        extendedMetaData="kind='element' name='exception-handler-factory' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getExceptionHandlerFactory();
-
-				/**
-	 * Returns the value of the '<em><b>External Context Factory</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.ExternalContextFactoryType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>External Context Factory</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>External Context Factory</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFactoryType_ExternalContextFactory()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.ExternalContextFactoryType" containment="true"
-	 *        extendedMetaData="kind='element' name='external-context-factory' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getExternalContextFactory();
-
-				/**
-	 * Returns the value of the '<em><b>Faces Context Factory</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.FacesContextFactoryType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Faces Context Factory</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Faces Context Factory</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFactoryType_FacesContextFactory()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.FacesContextFactoryType" containment="true"
-	 *        extendedMetaData="kind='element' name='faces-context-factory' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getFacesContextFactory();
-
-    /**
-	 * Returns the value of the '<em><b>Partial View Context Factory</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.PartialViewContextFactoryType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Partial View Context Factory</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Partial View Context Factory</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFactoryType_PartialViewContextFactory()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.PartialViewContextFactoryType" containment="true"
-	 *        extendedMetaData="kind='element' name='partial-view-context-factory' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getPartialViewContextFactory();
-
-				/**
-	 * Returns the value of the '<em><b>Lifecycle Factory</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.LifecycleFactoryType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Lifecycle Factory</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Lifecycle Factory</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFactoryType_LifecycleFactory()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.LifecycleFactoryType" containment="true"
-	 *        extendedMetaData="kind='element' name='lifecycle-factory' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getLifecycleFactory();
-
-    /**
-	 * Returns the value of the '<em><b>View Declaration Language Factory</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.ViewDeclarationLanguageFactoryType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>View Declaration Language Factory</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>View Declaration Language Factory</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFactoryType_ViewDeclarationLanguageFactory()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.ViewDeclarationLanguageFactoryType" containment="true"
-	 *        extendedMetaData="kind='element' name='view-declaration-language-factory' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getViewDeclarationLanguageFactory();
-
-				/**
-	 * Returns the value of the '<em><b>Tag Handler Delegate Factory</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.TagHandlerDelegateFactoryType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Tag Handler Delegate Factory</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Tag Handler Delegate Factory</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFactoryType_TagHandlerDelegateFactory()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.TagHandlerDelegateFactoryType" containment="true"
-	 *        extendedMetaData="kind='element' name='tag-handler-delegate-factory' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getTagHandlerDelegateFactory();
-
-				/**
-	 * Returns the value of the '<em><b>Render Kit Factory</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitFactoryType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Render Kit Factory</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Render Kit Factory</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFactoryType_RenderKitFactory()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.RenderKitFactoryType" containment="true"
-	 *        extendedMetaData="kind='element' name='render-kit-factory' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getRenderKitFactory();
-
-    /**
-	 * Returns the value of the '<em><b>Visit Context Factory</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.VisitContextFactoryType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Visit Context Factory</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Visit Context Factory</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFactoryType_VisitContextFactory()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.VisitContextFactoryType" containment="true"
-	 *        extendedMetaData="kind='element' name='visit-context-factory' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getVisitContextFactory();
-
-				/**
-	 * Returns the value of the '<em><b>Factory Extension</b></em>' reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.FactoryExtensionType}.
-	 * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Factory Extension</em>' reference list isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-	 * @return the value of the '<em>Factory Extension</em>' reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFactoryType_FactoryExtension()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.FactoryExtensionType"
-	 *        extendedMetaData="kind='element' name='factory-type' namespace='##targetNamespace'"
-	 * @generated
-	 */
-    EList getFactoryExtension();
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFactoryType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.FactoryType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // FactoryType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FromActionType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FromActionType.java
deleted file mode 100644
index e1db0f8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FromActionType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>From Action Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FromActionType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FromActionType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFromActionType()
- * @model extendedMetaData="name='from-action_._type' kind='simple'"
- * @generated
- */
-public interface FromActionType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFromActionType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.FromActionType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFromActionType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.FromActionType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // FromActionType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FromOutcomeType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FromOutcomeType.java
deleted file mode 100644
index 051d4ee..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FromOutcomeType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>From Outcome Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FromOutcomeType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FromOutcomeType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFromOutcomeType()
- * @model extendedMetaData="name='from-outcome_._type' kind='simple'"
- * @generated
- */
-public interface FromOutcomeType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFromOutcomeType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.FromOutcomeType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFromOutcomeType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.FromOutcomeType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // FromOutcomeType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FromViewIdType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FromViewIdType.java
deleted file mode 100644
index 30dadc1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FromViewIdType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>From View Id Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FromViewIdType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FromViewIdType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFromViewIdType()
- * @model extendedMetaData="name='from-view-id_._type' kind='simple'"
- * @generated
- */
-public interface FromViewIdType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFromViewIdType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.FromViewIdType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFromViewIdType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.FromViewIdType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // FromViewIdType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/IconType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/IconType.java
deleted file mode 100644
index aca11c3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/IconType.java
+++ /dev/null
@@ -1,151 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Icon Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.IconType#getSmallIcon <em>Small Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.IconType#getLargeIcon <em>Large Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.IconType#getLang <em>Lang</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.IconType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getIconType()
- * @model extendedMetaData="name='icon_._type' kind='empty'"
- * @generated
- */
-public interface IconType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Small Icon</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Small Icon</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Small Icon</em>' containment reference.
-	 * @see #setSmallIcon(SmallIconType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getIconType_SmallIcon()
-	 * @model containment="true"
-	 *        extendedMetaData="kind='element' name='small-icon' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	SmallIconType getSmallIcon();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.IconType#getSmallIcon <em>Small Icon</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Small Icon</em>' containment reference.
-	 * @see #getSmallIcon()
-	 * @generated
-	 */
-	void setSmallIcon(SmallIconType value);
-
-    /**
-	 * Returns the value of the '<em><b>Large Icon</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Large Icon</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Large Icon</em>' containment reference.
-	 * @see #setLargeIcon(LargeIconType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getIconType_LargeIcon()
-	 * @model containment="true"
-	 *        extendedMetaData="kind='element' name='large-icon' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	LargeIconType getLargeIcon();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.IconType#getLargeIcon <em>Large Icon</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Large Icon</em>' containment reference.
-	 * @see #getLargeIcon()
-	 * @generated
-	 */
-	void setLargeIcon(LargeIconType value);
-
-    /**
-	 * Returns the value of the '<em><b>Lang</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Lang</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Lang</em>' attribute.
-	 * @see #setLang(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getIconType_Lang()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Language"
-	 *        extendedMetaData="kind='attribute' name='lang' namespace='http://www.w3.org/XML/1998/namespace'"
-	 * @generated
-	 */
-	String getLang();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.IconType#getLang <em>Lang</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Lang</em>' attribute.
-	 * @see #getLang()
-	 * @generated
-	 */
-	void setLang(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getIconType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.IconType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // IconType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/IfType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/IfType.java
deleted file mode 100644
index a7025d2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/IfType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>If Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.IfType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.IfType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getIfType()
- * @model extendedMetaData="name='if_._type' kind='simple'"
- * @generated
- */
-public interface IfType extends EObject {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getIfType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.IfType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getIfType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.IfType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // IfType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/KeyClassType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/KeyClassType.java
deleted file mode 100644
index 353f56d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/KeyClassType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Key Class Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.KeyClassType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.KeyClassType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getKeyClassType()
- * @model extendedMetaData="name='key-class_._type' kind='simple'"
- * @generated
- */
-public interface KeyClassType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getKeyClassType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.KeyClassType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getKeyClassType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.KeyClassType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // KeyClassType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/KeyType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/KeyType.java
deleted file mode 100644
index c5793b6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/KeyType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Key Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.KeyType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.KeyType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getKeyType()
- * @model extendedMetaData="name='key_._type' kind='simple'"
- * @generated
- */
-public interface KeyType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getKeyType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.KeyType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getKeyType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.KeyType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // KeyType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/LargeIconType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/LargeIconType.java
deleted file mode 100644
index 5d3c8ec..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/LargeIconType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Large Icon Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.LargeIconType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.LargeIconType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getLargeIconType()
- * @model extendedMetaData="name='large-icon_._type' kind='simple'"
- * @generated
- */
-public interface LargeIconType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getLargeIconType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.LargeIconType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getLargeIconType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.LargeIconType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // LargeIconType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/LifecycleExtensionType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/LifecycleExtensionType.java
deleted file mode 100644
index 94f9ca9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/LifecycleExtensionType.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Lifecycle Extension Type</b></em>'.
- * <!-- end-user-doc -->
- *
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getLifecycleExtensionType()
- * @model extendedMetaData="name='lifecycle-extension_._type'"
- * @generated
- */
-public interface LifecycleExtensionType extends ExtensionType {
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-} // LifecycleExtensionType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/LifecycleFactoryType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/LifecycleFactoryType.java
deleted file mode 100644
index 4f64a99..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/LifecycleFactoryType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Lifecycle Factory Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.LifecycleFactoryType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.LifecycleFactoryType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getLifecycleFactoryType()
- * @model extendedMetaData="name='lifecycle-factory_._type' kind='simple'"
- * @generated
- */
-public interface LifecycleFactoryType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getLifecycleFactoryType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.LifecycleFactoryType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getLifecycleFactoryType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.LifecycleFactoryType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // LifecycleFactoryType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/LifecycleType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/LifecycleType.java
deleted file mode 100644
index 6273ca4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/LifecycleType.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Lifecycle Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.LifecycleType#getPhaseListener <em>Phase Listener</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.LifecycleType#getLifecycleExtension <em>Lifecycle Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.LifecycleType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getLifecycleType()
- * @model extendedMetaData="name='lifecycle_._type' kind='elementOnly'"
- * @generated
- */
-public interface LifecycleType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Phase Listener</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.PhaseListenerType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Phase Listener</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Phase Listener</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getLifecycleType_PhaseListener()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.PhaseListenerType" containment="true"
-	 *        extendedMetaData="kind='element' name='phase-listener' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getPhaseListener();
-
-    /**
-	 * Returns the value of the '<em><b>Lifecycle Extension</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.LifecycleExtensionType}.
-	 * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Lifecycle Extension</em>' containment reference list isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-	 * @return the value of the '<em>Lifecycle Extension</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getLifecycleType_LifecycleExtension()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.LifecycleExtensionType" containment="true"
-	 *        extendedMetaData="kind='element' name='lifecycle-extension' namespace='##targetNamespace'"
-	 * @generated
-	 */
-    EList getLifecycleExtension();
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getLifecycleType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.LifecycleType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // LifecycleType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ListEntriesType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ListEntriesType.java
deleted file mode 100644
index 43109f4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ListEntriesType.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>List Entries Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ListEntriesType#getValueClass <em>Value Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ListEntriesType#getNullValue <em>Null Value</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ListEntriesType#getValue <em>Value</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ListEntriesType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getListEntriesType()
- * @model extendedMetaData="name='list-entries_._type' kind='elementOnly'"
- * @generated
- */
-public interface ListEntriesType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Value Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Value Class</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Value Class</em>' containment reference.
-	 * @see #setValueClass(ValueClassType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getListEntriesType_ValueClass()
-	 * @model containment="true"
-	 *        extendedMetaData="kind='element' name='value-class' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ValueClassType getValueClass();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ListEntriesType#getValueClass <em>Value Class</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Value Class</em>' containment reference.
-	 * @see #getValueClass()
-	 * @generated
-	 */
-	void setValueClass(ValueClassType value);
-
-    /**
-	 * Returns the value of the '<em><b>Null Value</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.NullValueType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Null Value</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Null Value</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getListEntriesType_NullValue()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.NullValueType" containment="true"
-	 *        extendedMetaData="kind='element' name='null-value' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getNullValue();
-
-    /**
-	 * Returns the value of the '<em><b>Value</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.ValueType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Value</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Value</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getListEntriesType_Value()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.ValueType" containment="true"
-	 *        extendedMetaData="kind='element' name='value' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getValue();
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getListEntriesType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ListEntriesType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // ListEntriesType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/LocaleConfigType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/LocaleConfigType.java
deleted file mode 100644
index a92adf2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/LocaleConfigType.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Locale Config Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.LocaleConfigType#getDefaultLocale <em>Default Locale</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.LocaleConfigType#getSupportedLocale <em>Supported Locale</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.LocaleConfigType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getLocaleConfigType()
- * @model extendedMetaData="name='locale-config_._type' kind='elementOnly'"
- * @generated
- */
-public interface LocaleConfigType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Default Locale</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Default Locale</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Default Locale</em>' containment reference.
-	 * @see #setDefaultLocale(DefaultLocaleType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getLocaleConfigType_DefaultLocale()
-	 * @model containment="true"
-	 *        extendedMetaData="kind='element' name='default-locale' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	DefaultLocaleType getDefaultLocale();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.LocaleConfigType#getDefaultLocale <em>Default Locale</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Default Locale</em>' containment reference.
-	 * @see #getDefaultLocale()
-	 * @generated
-	 */
-	void setDefaultLocale(DefaultLocaleType value);
-
-    /**
-	 * Returns the value of the '<em><b>Supported Locale</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.SupportedLocaleType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Supported Locale</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Supported Locale</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getLocaleConfigType_SupportedLocale()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.SupportedLocaleType" containment="true"
-	 *        extendedMetaData="kind='element' name='supported-locale' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getSupportedLocale();
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getLocaleConfigType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.LocaleConfigType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // LocaleConfigType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ManagedBeanClassType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ManagedBeanClassType.java
deleted file mode 100644
index 0860211..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ManagedBeanClassType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Managed Bean Class Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanClassType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanClassType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getManagedBeanClassType()
- * @model extendedMetaData="name='managed-bean-class_._type' kind='simple'"
- * @generated
- */
-public interface ManagedBeanClassType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getManagedBeanClassType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanClassType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getManagedBeanClassType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanClassType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // ManagedBeanClassType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ManagedBeanExtensionType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ManagedBeanExtensionType.java
deleted file mode 100644
index 597491e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ManagedBeanExtensionType.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Managed Bean Extension Type</b></em>'.
- * <!-- end-user-doc -->
- *
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getManagedBeanExtensionType()
- * @model extendedMetaData="name='managed-bean-extension_._type'"
- * @generated
- */
-public interface ManagedBeanExtensionType extends ExtensionType {
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-} // ManagedBeanExtensionType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ManagedBeanNameType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ManagedBeanNameType.java
deleted file mode 100644
index 8ff695b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ManagedBeanNameType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Managed Bean Name Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanNameType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanNameType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getManagedBeanNameType()
- * @model extendedMetaData="name='managed-bean-name_._type' kind='simple'"
- * @generated
- */
-public interface ManagedBeanNameType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getManagedBeanNameType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanNameType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getManagedBeanNameType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanNameType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // ManagedBeanNameType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ManagedBeanScopeType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ManagedBeanScopeType.java
deleted file mode 100644
index 3c71f87..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ManagedBeanScopeType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Managed Bean Scope Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanScopeType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanScopeType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getManagedBeanScopeType()
- * @model extendedMetaData="name='managed-bean-scope_._type' kind='simple'"
- * @generated
- */
-public interface ManagedBeanScopeType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getManagedBeanScopeType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanScopeType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getManagedBeanScopeType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanScopeType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // ManagedBeanScopeType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ManagedBeanType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ManagedBeanType.java
deleted file mode 100644
index f1e392a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ManagedBeanType.java
+++ /dev/null
@@ -1,326 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Managed Bean Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getDescription <em>Description</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getDisplayName <em>Display Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getIcon <em>Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getManagedBeanName <em>Managed Bean Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getManagedBeanClass <em>Managed Bean Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getManagedBeanScope <em>Managed Bean Scope</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getManagedProperty <em>Managed Property</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getMapEntries <em>Map Entries</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getListEntries <em>List Entries</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getManagedBeanExtension <em>Managed Bean Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getId <em>Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#isEager <em>Eager</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getManagedBeanType()
- * @model extendedMetaData="name='managed-bean_._type' kind='elementOnly'"
- * @generated
- */
-public interface ManagedBeanType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Description</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.DescriptionType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Description</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Description</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getManagedBeanType_Description()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.DescriptionType" containment="true"
-	 *        extendedMetaData="kind='element' name='description' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getDescription();
-
-    /**
-	 * Returns the value of the '<em><b>Display Name</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Display Name</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Display Name</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getManagedBeanType_DisplayName()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType" containment="true"
-	 *        extendedMetaData="kind='element' name='display-name' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getDisplayName();
-
-    /**
-	 * Returns the value of the '<em><b>Icon</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.IconType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Icon</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Icon</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getManagedBeanType_Icon()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.IconType" containment="true"
-	 *        extendedMetaData="kind='element' name='icon' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getIcon();
-
-    /**
-	 * Returns the value of the '<em><b>Managed Bean Name</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Managed Bean Name</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Managed Bean Name</em>' containment reference.
-	 * @see #setManagedBeanName(ManagedBeanNameType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getManagedBeanType_ManagedBeanName()
-	 * @model containment="true" required="true"
-	 *        extendedMetaData="kind='element' name='managed-bean-name' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ManagedBeanNameType getManagedBeanName();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getManagedBeanName <em>Managed Bean Name</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Managed Bean Name</em>' containment reference.
-	 * @see #getManagedBeanName()
-	 * @generated
-	 */
-	void setManagedBeanName(ManagedBeanNameType value);
-
-    /**
-	 * Returns the value of the '<em><b>Managed Bean Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Managed Bean Class</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Managed Bean Class</em>' containment reference.
-	 * @see #setManagedBeanClass(ManagedBeanClassType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getManagedBeanType_ManagedBeanClass()
-	 * @model containment="true" required="true"
-	 *        extendedMetaData="kind='element' name='managed-bean-class' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ManagedBeanClassType getManagedBeanClass();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getManagedBeanClass <em>Managed Bean Class</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Managed Bean Class</em>' containment reference.
-	 * @see #getManagedBeanClass()
-	 * @generated
-	 */
-	void setManagedBeanClass(ManagedBeanClassType value);
-
-    /**
-	 * Returns the value of the '<em><b>Managed Bean Scope</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Managed Bean Scope</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Managed Bean Scope</em>' containment reference.
-	 * @see #setManagedBeanScope(ManagedBeanScopeType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getManagedBeanType_ManagedBeanScope()
-	 * @model containment="true" required="true"
-	 *        extendedMetaData="kind='element' name='managed-bean-scope' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ManagedBeanScopeType getManagedBeanScope();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getManagedBeanScope <em>Managed Bean Scope</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Managed Bean Scope</em>' containment reference.
-	 * @see #getManagedBeanScope()
-	 * @generated
-	 */
-	void setManagedBeanScope(ManagedBeanScopeType value);
-
-    /**
-	 * Returns the value of the '<em><b>Managed Property</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Managed Property</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Managed Property</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getManagedBeanType_ManagedProperty()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType" containment="true"
-	 *        extendedMetaData="kind='element' name='managed-property' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getManagedProperty();
-
-    /**
-	 * Returns the value of the '<em><b>Map Entries</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Map Entries</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Map Entries</em>' containment reference.
-	 * @see #setMapEntries(MapEntriesType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getManagedBeanType_MapEntries()
-	 * @model containment="true"
-	 *        extendedMetaData="kind='element' name='map-entries' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	MapEntriesType getMapEntries();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getMapEntries <em>Map Entries</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Map Entries</em>' containment reference.
-	 * @see #getMapEntries()
-	 * @generated
-	 */
-	void setMapEntries(MapEntriesType value);
-
-    /**
-	 * Returns the value of the '<em><b>List Entries</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>List Entries</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>List Entries</em>' containment reference.
-	 * @see #setListEntries(ListEntriesType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getManagedBeanType_ListEntries()
-	 * @model containment="true"
-	 *        extendedMetaData="kind='element' name='list-entries' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ListEntriesType getListEntries();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getListEntries <em>List Entries</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>List Entries</em>' containment reference.
-	 * @see #getListEntries()
-	 * @generated
-	 */
-	void setListEntries(ListEntriesType value);
-
-    /**
-	 * Returns the value of the '<em><b>Managed Bean Extension</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanExtensionType}.
-	 * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Managed Bean Extension</em>' containment reference list isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-	 * @return the value of the '<em>Managed Bean Extension</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getManagedBeanType_ManagedBeanExtension()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanExtensionType" containment="true"
-	 *        extendedMetaData="kind='element' name='managed-bean-extension' namespace='##targetNamespace'"
-	 * @generated
-	 */
-    EList getManagedBeanExtension();
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getManagedBeanType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-				/**
-	 * Returns the value of the '<em><b>Eager</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Eager</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Eager</em>' attribute.
-	 * @see #setEager(boolean)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getManagedBeanType_Eager()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Boolean"
-	 *        extendedMetaData="kind='attribute' name='eager' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	boolean isEager();
-
-				/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#isEager <em>Eager</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Eager</em>' attribute.
-	 * @see #isEager()
-	 * @generated
-	 */
-	void setEager(boolean value);
-
-} // ManagedBeanType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ManagedPropertyType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ManagedPropertyType.java
deleted file mode 100644
index 4a06a39..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ManagedPropertyType.java
+++ /dev/null
@@ -1,290 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Managed Property Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getDescription <em>Description</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getDisplayName <em>Display Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getIcon <em>Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getPropertyName <em>Property Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getPropertyClass <em>Property Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getMapEntries <em>Map Entries</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getNullValue <em>Null Value</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getValue <em>Value</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getListEntries <em>List Entries</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getManagedPropertyType()
- * @model extendedMetaData="name='managed-property_._type' kind='elementOnly'"
- * @generated
- */
-public interface ManagedPropertyType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Description</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.DescriptionType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Description</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Description</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getManagedPropertyType_Description()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.DescriptionType" containment="true"
-	 *        extendedMetaData="kind='element' name='description' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getDescription();
-
-    /**
-	 * Returns the value of the '<em><b>Display Name</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Display Name</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Display Name</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getManagedPropertyType_DisplayName()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType" containment="true"
-	 *        extendedMetaData="kind='element' name='display-name' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getDisplayName();
-
-    /**
-	 * Returns the value of the '<em><b>Icon</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.IconType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Icon</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Icon</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getManagedPropertyType_Icon()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.IconType" containment="true"
-	 *        extendedMetaData="kind='element' name='icon' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getIcon();
-
-    /**
-	 * Returns the value of the '<em><b>Property Name</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Property Name</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Property Name</em>' containment reference.
-	 * @see #setPropertyName(PropertyNameType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getManagedPropertyType_PropertyName()
-	 * @model containment="true" required="true"
-	 *        extendedMetaData="kind='element' name='property-name' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	PropertyNameType getPropertyName();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getPropertyName <em>Property Name</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Property Name</em>' containment reference.
-	 * @see #getPropertyName()
-	 * @generated
-	 */
-	void setPropertyName(PropertyNameType value);
-
-    /**
-	 * Returns the value of the '<em><b>Property Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Property Class</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Property Class</em>' containment reference.
-	 * @see #setPropertyClass(PropertyClassType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getManagedPropertyType_PropertyClass()
-	 * @model containment="true"
-	 *        extendedMetaData="kind='element' name='property-class' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	PropertyClassType getPropertyClass();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getPropertyClass <em>Property Class</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Property Class</em>' containment reference.
-	 * @see #getPropertyClass()
-	 * @generated
-	 */
-	void setPropertyClass(PropertyClassType value);
-
-    /**
-	 * Returns the value of the '<em><b>Map Entries</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Map Entries</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Map Entries</em>' containment reference.
-	 * @see #setMapEntries(MapEntriesType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getManagedPropertyType_MapEntries()
-	 * @model containment="true"
-	 *        extendedMetaData="kind='element' name='map-entries' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	MapEntriesType getMapEntries();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getMapEntries <em>Map Entries</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Map Entries</em>' containment reference.
-	 * @see #getMapEntries()
-	 * @generated
-	 */
-	void setMapEntries(MapEntriesType value);
-
-    /**
-	 * Returns the value of the '<em><b>Null Value</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Null Value</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Null Value</em>' containment reference.
-	 * @see #setNullValue(NullValueType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getManagedPropertyType_NullValue()
-	 * @model containment="true"
-	 *        extendedMetaData="kind='element' name='null-value' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	NullValueType getNullValue();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getNullValue <em>Null Value</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Null Value</em>' containment reference.
-	 * @see #getNullValue()
-	 * @generated
-	 */
-	void setNullValue(NullValueType value);
-
-    /**
-	 * Returns the value of the '<em><b>Value</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Value</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Value</em>' containment reference.
-	 * @see #setValue(ValueType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getManagedPropertyType_Value()
-	 * @model containment="true"
-	 *        extendedMetaData="kind='element' name='value' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ValueType getValue();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getValue <em>Value</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Value</em>' containment reference.
-	 * @see #getValue()
-	 * @generated
-	 */
-	void setValue(ValueType value);
-
-    /**
-	 * Returns the value of the '<em><b>List Entries</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>List Entries</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>List Entries</em>' containment reference.
-	 * @see #setListEntries(ListEntriesType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getManagedPropertyType_ListEntries()
-	 * @model containment="true"
-	 *        extendedMetaData="kind='element' name='list-entries' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ListEntriesType getListEntries();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getListEntries <em>List Entries</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>List Entries</em>' containment reference.
-	 * @see #getListEntries()
-	 * @generated
-	 */
-	void setListEntries(ListEntriesType value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getManagedPropertyType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // ManagedPropertyType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/MapEntriesType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/MapEntriesType.java
deleted file mode 100644
index f09502f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/MapEntriesType.java
+++ /dev/null
@@ -1,142 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Map Entries Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.MapEntriesType#getKeyClass <em>Key Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.MapEntriesType#getValueClass <em>Value Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.MapEntriesType#getMapEntry <em>Map Entry</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.MapEntriesType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getMapEntriesType()
- * @model extendedMetaData="name='map-entries_._type' kind='elementOnly'"
- * @generated
- */
-public interface MapEntriesType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Key Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Key Class</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Key Class</em>' containment reference.
-	 * @see #setKeyClass(KeyClassType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getMapEntriesType_KeyClass()
-	 * @model containment="true"
-	 *        extendedMetaData="kind='element' name='key-class' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	KeyClassType getKeyClass();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.MapEntriesType#getKeyClass <em>Key Class</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Key Class</em>' containment reference.
-	 * @see #getKeyClass()
-	 * @generated
-	 */
-	void setKeyClass(KeyClassType value);
-
-    /**
-	 * Returns the value of the '<em><b>Value Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Value Class</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Value Class</em>' containment reference.
-	 * @see #setValueClass(ValueClassType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getMapEntriesType_ValueClass()
-	 * @model containment="true"
-	 *        extendedMetaData="kind='element' name='value-class' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ValueClassType getValueClass();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.MapEntriesType#getValueClass <em>Value Class</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Value Class</em>' containment reference.
-	 * @see #getValueClass()
-	 * @generated
-	 */
-	void setValueClass(ValueClassType value);
-
-    /**
-	 * Returns the value of the '<em><b>Map Entry</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.MapEntryType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Map Entry</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Map Entry</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getMapEntriesType_MapEntry()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.MapEntryType" containment="true"
-	 *        extendedMetaData="kind='element' name='map-entry' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getMapEntry();
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getMapEntriesType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.MapEntriesType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // MapEntriesType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/MapEntryType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/MapEntryType.java
deleted file mode 100644
index 11e832e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/MapEntryType.java
+++ /dev/null
@@ -1,151 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Map Entry Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.MapEntryType#getKey <em>Key</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.MapEntryType#getNullValue <em>Null Value</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.MapEntryType#getValue <em>Value</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.MapEntryType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getMapEntryType()
- * @model extendedMetaData="name='map-entry_._type' kind='empty'"
- * @generated
- */
-public interface MapEntryType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Key</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Key</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Key</em>' containment reference.
-	 * @see #setKey(KeyType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getMapEntryType_Key()
-	 * @model containment="true" required="true"
-	 *        extendedMetaData="kind='element' name='key' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	KeyType getKey();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.MapEntryType#getKey <em>Key</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Key</em>' containment reference.
-	 * @see #getKey()
-	 * @generated
-	 */
-	void setKey(KeyType value);
-
-    /**
-	 * Returns the value of the '<em><b>Null Value</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Null Value</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Null Value</em>' containment reference.
-	 * @see #setNullValue(NullValueType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getMapEntryType_NullValue()
-	 * @model containment="true"
-	 *        extendedMetaData="kind='element' name='null-value' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	NullValueType getNullValue();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.MapEntryType#getNullValue <em>Null Value</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Null Value</em>' containment reference.
-	 * @see #getNullValue()
-	 * @generated
-	 */
-	void setNullValue(NullValueType value);
-
-    /**
-	 * Returns the value of the '<em><b>Value</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Value</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Value</em>' containment reference.
-	 * @see #setValue(ValueType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getMapEntryType_Value()
-	 * @model containment="true"
-	 *        extendedMetaData="kind='element' name='value' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ValueType getValue();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.MapEntryType#getValue <em>Value</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Value</em>' containment reference.
-	 * @see #getValue()
-	 * @generated
-	 */
-	void setValue(ValueType value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getMapEntryType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.MapEntryType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // MapEntryType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/MessageBundleType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/MessageBundleType.java
deleted file mode 100644
index 0dbf441..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/MessageBundleType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Message Bundle Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.MessageBundleType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.MessageBundleType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getMessageBundleType()
- * @model extendedMetaData="name='message-bundle_._type' kind='simple'"
- * @generated
- */
-public interface MessageBundleType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getMessageBundleType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.MessageBundleType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getMessageBundleType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.MessageBundleType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // MessageBundleType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/NameType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/NameType.java
deleted file mode 100644
index 2d93c6e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/NameType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Name Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.NameType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.NameType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getNameType()
- * @model extendedMetaData="name='name_._type' kind='simple'"
- * @generated
- */
-public interface NameType extends EObject {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getNameType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.NameType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getNameType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.NameType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // NameType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/NavigationCaseType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/NavigationCaseType.java
deleted file mode 100644
index a208e38..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/NavigationCaseType.java
+++ /dev/null
@@ -1,262 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Navigation Case Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType#getDescription <em>Description</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType#getDisplayName <em>Display Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType#getIcon <em>Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType#getFromAction <em>From Action</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType#getFromOutcome <em>From Outcome</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType#getIf <em>If</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType#getToViewId <em>To View Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType#getRedirect <em>Redirect</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getNavigationCaseType()
- * @model extendedMetaData="name='navigation-case_._type' kind='elementOnly'"
- * @generated
- */
-public interface NavigationCaseType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Description</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.DescriptionType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Description</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Description</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getNavigationCaseType_Description()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.DescriptionType" containment="true"
-	 *        extendedMetaData="kind='element' name='description' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getDescription();
-
-    /**
-	 * Returns the value of the '<em><b>Display Name</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Display Name</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Display Name</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getNavigationCaseType_DisplayName()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType" containment="true"
-	 *        extendedMetaData="kind='element' name='display-name' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getDisplayName();
-
-    /**
-	 * Returns the value of the '<em><b>Icon</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.IconType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Icon</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Icon</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getNavigationCaseType_Icon()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.IconType" containment="true"
-	 *        extendedMetaData="kind='element' name='icon' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getIcon();
-
-    /**
-	 * Returns the value of the '<em><b>From Action</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>From Action</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>From Action</em>' containment reference.
-	 * @see #setFromAction(FromActionType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getNavigationCaseType_FromAction()
-	 * @model containment="true"
-	 *        extendedMetaData="kind='element' name='from-action' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	FromActionType getFromAction();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType#getFromAction <em>From Action</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>From Action</em>' containment reference.
-	 * @see #getFromAction()
-	 * @generated
-	 */
-	void setFromAction(FromActionType value);
-
-    /**
-	 * Returns the value of the '<em><b>From Outcome</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>From Outcome</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>From Outcome</em>' containment reference.
-	 * @see #setFromOutcome(FromOutcomeType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getNavigationCaseType_FromOutcome()
-	 * @model containment="true"
-	 *        extendedMetaData="kind='element' name='from-outcome' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	FromOutcomeType getFromOutcome();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType#getFromOutcome <em>From Outcome</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>From Outcome</em>' containment reference.
-	 * @see #getFromOutcome()
-	 * @generated
-	 */
-	void setFromOutcome(FromOutcomeType value);
-
-    /**
-	 * Returns the value of the '<em><b>If</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>If</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>If</em>' containment reference.
-	 * @see #setIf(IfType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getNavigationCaseType_If()
-	 * @model containment="true"
-	 *        extendedMetaData="kind='element' name='if' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	IfType getIf();
-
-				/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType#getIf <em>If</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>If</em>' containment reference.
-	 * @see #getIf()
-	 * @generated
-	 */
-	void setIf(IfType value);
-
-				/**
-	 * Returns the value of the '<em><b>To View Id</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>To View Id</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>To View Id</em>' containment reference.
-	 * @see #setToViewId(ToViewIdType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getNavigationCaseType_ToViewId()
-	 * @model containment="true" required="true"
-	 *        extendedMetaData="kind='element' name='to-view-id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ToViewIdType getToViewId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType#getToViewId <em>To View Id</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>To View Id</em>' containment reference.
-	 * @see #getToViewId()
-	 * @generated
-	 */
-	void setToViewId(ToViewIdType value);
-
-    /**
-	 * Returns the value of the '<em><b>Redirect</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Redirect</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Redirect</em>' containment reference.
-	 * @see #setRedirect(RedirectType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getNavigationCaseType_Redirect()
-	 * @model containment="true"
-	 *        extendedMetaData="kind='element' name='redirect' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	RedirectType getRedirect();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType#getRedirect <em>Redirect</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Redirect</em>' containment reference.
-	 * @see #getRedirect()
-	 * @generated
-	 */
-	void setRedirect(RedirectType value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getNavigationCaseType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // NavigationCaseType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/NavigationHandlerType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/NavigationHandlerType.java
deleted file mode 100644
index 0744840..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/NavigationHandlerType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Navigation Handler Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationHandlerType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationHandlerType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getNavigationHandlerType()
- * @model extendedMetaData="name='navigation-handler_._type' kind='simple'"
- * @generated
- */
-public interface NavigationHandlerType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getNavigationHandlerType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationHandlerType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getNavigationHandlerType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationHandlerType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // NavigationHandlerType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/NavigationRuleExtensionType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/NavigationRuleExtensionType.java
deleted file mode 100644
index 7a0fdec..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/NavigationRuleExtensionType.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Navigation Rule Extension Type</b></em>'.
- * <!-- end-user-doc -->
- *
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getNavigationRuleExtensionType()
- * @model extendedMetaData="name='navigation-rule-extension_._type'"
- * @generated
- */
-public interface NavigationRuleExtensionType extends ExtensionType {
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-} // NavigationRuleExtensionType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/NavigationRuleType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/NavigationRuleType.java
deleted file mode 100644
index c36b87d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/NavigationRuleType.java
+++ /dev/null
@@ -1,186 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Navigation Rule Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType#getDescription <em>Description</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType#getDisplayName <em>Display Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType#getIcon <em>Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType#getFromViewId <em>From View Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType#getNavigationCase <em>Navigation Case</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType#getNavigationRuleExtension <em>Navigation Rule Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getNavigationRuleType()
- * @model extendedMetaData="name='navigation-rule_._type' kind='elementOnly'"
- * @generated
- */
-public interface NavigationRuleType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Description</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.DescriptionType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Description</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Description</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getNavigationRuleType_Description()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.DescriptionType" containment="true"
-	 *        extendedMetaData="kind='element' name='description' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getDescription();
-
-    /**
-	 * Returns the value of the '<em><b>Display Name</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Display Name</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Display Name</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getNavigationRuleType_DisplayName()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType" containment="true"
-	 *        extendedMetaData="kind='element' name='display-name' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getDisplayName();
-
-    /**
-	 * Returns the value of the '<em><b>Icon</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.IconType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Icon</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Icon</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getNavigationRuleType_Icon()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.IconType" containment="true"
-	 *        extendedMetaData="kind='element' name='icon' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getIcon();
-
-    /**
-	 * Returns the value of the '<em><b>From View Id</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>From View Id</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>From View Id</em>' containment reference.
-	 * @see #setFromViewId(FromViewIdType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getNavigationRuleType_FromViewId()
-	 * @model containment="true"
-	 *        extendedMetaData="kind='element' name='from-view-id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	FromViewIdType getFromViewId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType#getFromViewId <em>From View Id</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>From View Id</em>' containment reference.
-	 * @see #getFromViewId()
-	 * @generated
-	 */
-	void setFromViewId(FromViewIdType value);
-
-    /**
-	 * Returns the value of the '<em><b>Navigation Case</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Navigation Case</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Navigation Case</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getNavigationRuleType_NavigationCase()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType" containment="true"
-	 *        extendedMetaData="kind='element' name='navigation-case' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getNavigationCase();
-
-    /**
-	 * Returns the value of the '<em><b>Navigation Rule Extension</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleExtensionType}.
-	 * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Navigation Rule Extension</em>' containment reference list isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-	 * @return the value of the '<em>Navigation Rule Extension</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getNavigationRuleType_NavigationRuleExtension()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleExtensionType" containment="true"
-	 *        extendedMetaData="kind='element' name='navigation-rule-extension' namespace='##targetNamespace'"
-	 * @generated
-	 */
-    EList getNavigationRuleExtension();
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getNavigationRuleType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // NavigationRuleType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/NullValueType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/NullValueType.java
deleted file mode 100644
index 390fb1a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/NullValueType.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Null Value Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.NullValueType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getNullValueType()
- * @model extendedMetaData="name='null-value_._type' kind='empty'"
- * @generated
- */
-public interface NullValueType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getNullValueType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.NullValueType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // NullValueType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/OrderingOrderingType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/OrderingOrderingType.java
deleted file mode 100644
index 5eeabde..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/OrderingOrderingType.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Ordering Ordering Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.OrderingOrderingType#getName <em>Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.OrderingOrderingType#getOthers <em>Others</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getOrderingOrderingType()
- * @model extendedMetaData="name='ordering-ordering_._type' kind='elementOnly'"
- * @generated
- */
-public interface OrderingOrderingType extends EObject {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * Returns the value of the '<em><b>Name</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.NameType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Name</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Name</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getOrderingOrderingType_Name()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.NameType" containment="true"
-	 *        extendedMetaData="kind='element' name='name' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getName();
-
-	/**
-	 * Returns the value of the '<em><b>Others</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Others</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Others</em>' containment reference.
-	 * @see #setOthers(OrderingOthersType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getOrderingOrderingType_Others()
-	 * @model containment="true"
-	 *        extendedMetaData="kind='element' name='others' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	OrderingOthersType getOthers();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.OrderingOrderingType#getOthers <em>Others</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Others</em>' containment reference.
-	 * @see #getOthers()
-	 * @generated
-	 */
-	void setOthers(OrderingOthersType value);
-
-} // OrderingOrderingType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/OrderingOthersType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/OrderingOthersType.java
deleted file mode 100644
index 9251006..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/OrderingOthersType.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Ordering Others Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.OrderingOthersType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getOrderingOthersType()
- * @model extendedMetaData="name='others_._type' kind='elementOnly'"
- * @generated
- */
-public interface OrderingOthersType extends EObject {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getOrderingOthersType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.OrderingOthersType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // OrderingOthersType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/OrderingType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/OrderingType.java
deleted file mode 100644
index b145ddd..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/OrderingType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Ordering Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.OrderingType#getBefore <em>Before</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.OrderingType#getAfter <em>After</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getOrderingType()
- * @model extendedMetaData="name='ordering_._type' kind='elementOnly'"
- * @generated
- */
-public interface OrderingType extends EObject {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * Returns the value of the '<em><b>Before</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Before</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Before</em>' containment reference.
-	 * @see #setBefore(OrderingOrderingType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getOrderingType_Before()
-	 * @model containment="true"
-	 *        extendedMetaData="kind='element' name='before' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	OrderingOrderingType getBefore();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.OrderingType#getBefore <em>Before</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Before</em>' containment reference.
-	 * @see #getBefore()
-	 * @generated
-	 */
-	void setBefore(OrderingOrderingType value);
-
-	/**
-	 * Returns the value of the '<em><b>After</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>After</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>After</em>' containment reference.
-	 * @see #setAfter(OrderingOrderingType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getOrderingType_After()
-	 * @model containment="true"
-	 *        extendedMetaData="kind='element' name='after' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	OrderingOrderingType getAfter();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.OrderingType#getAfter <em>After</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>After</em>' containment reference.
-	 * @see #getAfter()
-	 * @generated
-	 */
-	void setAfter(OrderingOrderingType value);
-
-} // OrderingType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/PartialViewContextFactoryType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/PartialViewContextFactoryType.java
deleted file mode 100644
index e10d1d5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/PartialViewContextFactoryType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Partial View Context Factory Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.PartialViewContextFactoryType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.PartialViewContextFactoryType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getPartialViewContextFactoryType()
- * @model extendedMetaData="name='partial-view-context-factory_._type' kind='simple'"
- * @generated
- */
-public interface PartialViewContextFactoryType extends EObject {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getPartialViewContextFactoryType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.PartialViewContextFactoryType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getPartialViewContextFactoryType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.PartialViewContextFactoryType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // PartialViewContextFactoryType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/PhaseListenerType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/PhaseListenerType.java
deleted file mode 100644
index b175658..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/PhaseListenerType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Phase Listener Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.PhaseListenerType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.PhaseListenerType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getPhaseListenerType()
- * @model extendedMetaData="name='phase-listener_._type' kind='simple'"
- * @generated
- */
-public interface PhaseListenerType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getPhaseListenerType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.PhaseListenerType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getPhaseListenerType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.PhaseListenerType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // PhaseListenerType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/PropertyClassType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/PropertyClassType.java
deleted file mode 100644
index 42ddc6b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/PropertyClassType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Property Class Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyClassType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyClassType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getPropertyClassType()
- * @model extendedMetaData="name='property-class_._type' kind='simple'"
- * @generated
- */
-public interface PropertyClassType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getPropertyClassType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyClassType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getPropertyClassType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyClassType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // PropertyClassType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/PropertyExtensionType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/PropertyExtensionType.java
deleted file mode 100644
index c31c1e5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/PropertyExtensionType.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Property Extension Type</b></em>'.
- * <!-- end-user-doc -->
- *
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getPropertyExtensionType()
- * @model extendedMetaData="name='property-extension_._type'"
- * @generated
- */
-public interface PropertyExtensionType extends ExtensionType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-} // PropertyExtensionType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/PropertyNameType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/PropertyNameType.java
deleted file mode 100644
index 45432b6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/PropertyNameType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Property Name Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyNameType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyNameType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getPropertyNameType()
- * @model extendedMetaData="name='property-name_._type' kind='simple'"
- * @generated
- */
-public interface PropertyNameType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getPropertyNameType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyNameType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getPropertyNameType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyNameType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // PropertyNameType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/PropertyResolverType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/PropertyResolverType.java
deleted file mode 100644
index 6ec2e5e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/PropertyResolverType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Property Resolver Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyResolverType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyResolverType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getPropertyResolverType()
- * @model extendedMetaData="name='property-resolver_._type' kind='simple'"
- * @generated
- */
-public interface PropertyResolverType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getPropertyResolverType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyResolverType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getPropertyResolverType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyResolverType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // PropertyResolverType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/PropertyType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/PropertyType.java
deleted file mode 100644
index fcee95f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/PropertyType.java
+++ /dev/null
@@ -1,252 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Property Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyType#getDescription <em>Description</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyType#getDisplayName <em>Display Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyType#getIcon <em>Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyType#getPropertyName <em>Property Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyType#getPropertyClass <em>Property Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyType#getDefaultValue <em>Default Value</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyType#getSuggestedValue <em>Suggested Value</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyType#getPropertyExtension <em>Property Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getPropertyType()
- * @model extendedMetaData="name='property_._type' kind='elementOnly'"
- * @generated
- */
-public interface PropertyType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Description</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.DescriptionType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Description</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Description</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getPropertyType_Description()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.DescriptionType" containment="true"
-	 *        extendedMetaData="kind='element' name='description' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getDescription();
-
-    /**
-	 * Returns the value of the '<em><b>Display Name</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Display Name</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Display Name</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getPropertyType_DisplayName()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType" containment="true"
-	 *        extendedMetaData="kind='element' name='display-name' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getDisplayName();
-
-    /**
-	 * Returns the value of the '<em><b>Icon</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.IconType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Icon</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Icon</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getPropertyType_Icon()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.IconType" containment="true"
-	 *        extendedMetaData="kind='element' name='icon' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getIcon();
-
-    /**
-	 * Returns the value of the '<em><b>Property Name</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Property Name</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Property Name</em>' containment reference.
-	 * @see #setPropertyName(PropertyNameType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getPropertyType_PropertyName()
-	 * @model containment="true" required="true"
-	 *        extendedMetaData="kind='element' name='property-name' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	PropertyNameType getPropertyName();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyType#getPropertyName <em>Property Name</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Property Name</em>' containment reference.
-	 * @see #getPropertyName()
-	 * @generated
-	 */
-	void setPropertyName(PropertyNameType value);
-
-    /**
-	 * Returns the value of the '<em><b>Property Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Property Class</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Property Class</em>' containment reference.
-	 * @see #setPropertyClass(PropertyClassType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getPropertyType_PropertyClass()
-	 * @model containment="true" required="true"
-	 *        extendedMetaData="kind='element' name='property-class' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	PropertyClassType getPropertyClass();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyType#getPropertyClass <em>Property Class</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Property Class</em>' containment reference.
-	 * @see #getPropertyClass()
-	 * @generated
-	 */
-	void setPropertyClass(PropertyClassType value);
-
-    /**
-	 * Returns the value of the '<em><b>Default Value</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Default Value</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Default Value</em>' containment reference.
-	 * @see #setDefaultValue(DefaultValueType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getPropertyType_DefaultValue()
-	 * @model containment="true"
-	 *        extendedMetaData="kind='element' name='default-value' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	DefaultValueType getDefaultValue();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyType#getDefaultValue <em>Default Value</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Default Value</em>' containment reference.
-	 * @see #getDefaultValue()
-	 * @generated
-	 */
-	void setDefaultValue(DefaultValueType value);
-
-    /**
-	 * Returns the value of the '<em><b>Suggested Value</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Suggested Value</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Suggested Value</em>' containment reference.
-	 * @see #setSuggestedValue(SuggestedValueType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getPropertyType_SuggestedValue()
-	 * @model containment="true"
-	 *        extendedMetaData="kind='element' name='suggested-value' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	SuggestedValueType getSuggestedValue();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyType#getSuggestedValue <em>Suggested Value</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Suggested Value</em>' containment reference.
-	 * @see #getSuggestedValue()
-	 * @generated
-	 */
-	void setSuggestedValue(SuggestedValueType value);
-
-    /**
-	 * Returns the value of the '<em><b>Property Extension</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.PropertyExtensionType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Property Extension</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Property Extension</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getPropertyType_PropertyExtension()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.PropertyExtensionType" containment="true"
-	 *        extendedMetaData="kind='element' name='property-extension' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getPropertyExtension();
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getPropertyType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // PropertyType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/RedirectType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/RedirectType.java
deleted file mode 100644
index dc7d1cc..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/RedirectType.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Redirect Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.RedirectType#getViewParam <em>View Param</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.RedirectType#getId <em>Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.RedirectType#isIncludeViewParams <em>Include View Params</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRedirectType()
- * @model extendedMetaData="name='redirect_._type' kind='empty'"
- * @generated
- */
-public interface RedirectType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>View Param</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.RedirectViewParamType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>View Param</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>View Param</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRedirectType_ViewParam()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.RedirectViewParamType" containment="true"
-	 *        extendedMetaData="kind='element' name='view-param' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getViewParam();
-
-				/**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRedirectType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.RedirectType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-				/**
-	 * Returns the value of the '<em><b>Include View Params</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Include View Params</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Include View Params</em>' attribute.
-	 * @see #setIncludeViewParams(boolean)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRedirectType_IncludeViewParams()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Boolean"
-	 *        extendedMetaData="kind='attribute' name='include-view-params' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	boolean isIncludeViewParams();
-
-				/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.RedirectType#isIncludeViewParams <em>Include View Params</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Include View Params</em>' attribute.
-	 * @see #isIncludeViewParams()
-	 * @generated
-	 */
-	void setIncludeViewParams(boolean value);
-
-} // RedirectType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/RedirectViewParamType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/RedirectViewParamType.java
deleted file mode 100644
index f7b5360..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/RedirectViewParamType.java
+++ /dev/null
@@ -1,123 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Redirect View Param Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.RedirectViewParamType#getName <em>Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.RedirectViewParamType#getValue <em>Value</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.RedirectViewParamType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRedirectViewParamType()
- * @model extendedMetaData="name='redirect-viewParam_._type' kind='empty'"
- * @generated
- */
-public interface RedirectViewParamType extends EObject {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * Returns the value of the '<em><b>Name</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Name</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Name</em>' containment reference.
-	 * @see #setName(NameType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRedirectViewParamType_Name()
-	 * @model containment="true" required="true"
-	 *        extendedMetaData="kind='element' name='name' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	NameType getName();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.RedirectViewParamType#getName <em>Name</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Name</em>' containment reference.
-	 * @see #getName()
-	 * @generated
-	 */
-	void setName(NameType value);
-
-	/**
-	 * Returns the value of the '<em><b>Value</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Value</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Value</em>' containment reference.
-	 * @see #setValue(ValueType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRedirectViewParamType_Value()
-	 * @model containment="true" required="true"
-	 *        extendedMetaData="kind='element' name='value' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ValueType getValue();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.RedirectViewParamType#getValue <em>Value</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Value</em>' containment reference.
-	 * @see #getValue()
-	 * @generated
-	 */
-	void setValue(ValueType value);
-
-	/**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRedirectViewParamType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.RedirectViewParamType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // RedirectViewParamType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ReferencedBeanClassType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ReferencedBeanClassType.java
deleted file mode 100644
index 91d9c42..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ReferencedBeanClassType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Referenced Bean Class Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanClassType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanClassType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getReferencedBeanClassType()
- * @model extendedMetaData="name='referenced-bean-class_._type' kind='simple'"
- * @generated
- */
-public interface ReferencedBeanClassType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getReferencedBeanClassType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanClassType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getReferencedBeanClassType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanClassType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // ReferencedBeanClassType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ReferencedBeanNameType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ReferencedBeanNameType.java
deleted file mode 100644
index bb47210..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ReferencedBeanNameType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Referenced Bean Name Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanNameType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanNameType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getReferencedBeanNameType()
- * @model extendedMetaData="name='referenced-bean-name_._type' kind='simple'"
- * @generated
- */
-public interface ReferencedBeanNameType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getReferencedBeanNameType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanNameType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getReferencedBeanNameType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanNameType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // ReferencedBeanNameType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ReferencedBeanType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ReferencedBeanType.java
deleted file mode 100644
index 00049aa..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ReferencedBeanType.java
+++ /dev/null
@@ -1,178 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Referenced Bean Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanType#getDescription <em>Description</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanType#getDisplayName <em>Display Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanType#getIcon <em>Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanType#getReferencedBeanName <em>Referenced Bean Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanType#getReferencedBeanClass <em>Referenced Bean Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getReferencedBeanType()
- * @model extendedMetaData="name='referenced-bean_._type' kind='elementOnly'"
- * @generated
- */
-public interface ReferencedBeanType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Description</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.DescriptionType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Description</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Description</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getReferencedBeanType_Description()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.DescriptionType" containment="true"
-	 *        extendedMetaData="kind='element' name='description' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getDescription();
-
-    /**
-	 * Returns the value of the '<em><b>Display Name</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Display Name</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Display Name</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getReferencedBeanType_DisplayName()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType" containment="true"
-	 *        extendedMetaData="kind='element' name='display-name' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getDisplayName();
-
-    /**
-	 * Returns the value of the '<em><b>Icon</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.IconType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Icon</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Icon</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getReferencedBeanType_Icon()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.IconType" containment="true"
-	 *        extendedMetaData="kind='element' name='icon' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getIcon();
-
-    /**
-	 * Returns the value of the '<em><b>Referenced Bean Name</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Referenced Bean Name</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Referenced Bean Name</em>' containment reference.
-	 * @see #setReferencedBeanName(ReferencedBeanNameType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getReferencedBeanType_ReferencedBeanName()
-	 * @model containment="true" required="true"
-	 *        extendedMetaData="kind='element' name='referenced-bean-name' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ReferencedBeanNameType getReferencedBeanName();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanType#getReferencedBeanName <em>Referenced Bean Name</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Referenced Bean Name</em>' containment reference.
-	 * @see #getReferencedBeanName()
-	 * @generated
-	 */
-	void setReferencedBeanName(ReferencedBeanNameType value);
-
-    /**
-	 * Returns the value of the '<em><b>Referenced Bean Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Referenced Bean Class</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Referenced Bean Class</em>' containment reference.
-	 * @see #setReferencedBeanClass(ReferencedBeanClassType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getReferencedBeanType_ReferencedBeanClass()
-	 * @model containment="true" required="true"
-	 *        extendedMetaData="kind='element' name='referenced-bean-class' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ReferencedBeanClassType getReferencedBeanClass();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanType#getReferencedBeanClass <em>Referenced Bean Class</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Referenced Bean Class</em>' containment reference.
-	 * @see #getReferencedBeanClass()
-	 * @generated
-	 */
-	void setReferencedBeanClass(ReferencedBeanClassType value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getReferencedBeanType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // ReferencedBeanType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/RenderKitClassType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/RenderKitClassType.java
deleted file mode 100644
index 863cb61..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/RenderKitClassType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Render Kit Class Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitClassType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitClassType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRenderKitClassType()
- * @model extendedMetaData="name='render-kit-class_._type' kind='simple'"
- * @generated
- */
-public interface RenderKitClassType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRenderKitClassType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitClassType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRenderKitClassType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitClassType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // RenderKitClassType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/RenderKitExtensionType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/RenderKitExtensionType.java
deleted file mode 100644
index 0d4d365..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/RenderKitExtensionType.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Render Kit Extension Type</b></em>'.
- * <!-- end-user-doc -->
- *
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRenderKitExtensionType()
- * @model extendedMetaData="name='render-kit-extension_._type'"
- * @generated
- */
-public interface RenderKitExtensionType extends ExtensionType {
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-} // RenderKitExtensionType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/RenderKitFactoryType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/RenderKitFactoryType.java
deleted file mode 100644
index c1e1284..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/RenderKitFactoryType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Render Kit Factory Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitFactoryType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitFactoryType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRenderKitFactoryType()
- * @model extendedMetaData="name='render-kit-factory_._type' kind='simple'"
- * @generated
- */
-public interface RenderKitFactoryType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRenderKitFactoryType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitFactoryType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRenderKitFactoryType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitFactoryType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // RenderKitFactoryType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/RenderKitIdType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/RenderKitIdType.java
deleted file mode 100644
index e4c9b08..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/RenderKitIdType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Render Kit Id Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitIdType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitIdType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRenderKitIdType()
- * @model extendedMetaData="name='render-kit-id_._type' kind='simple'"
- * @generated
- */
-public interface RenderKitIdType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRenderKitIdType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitIdType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRenderKitIdType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitIdType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // RenderKitIdType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/RenderKitType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/RenderKitType.java
deleted file mode 100644
index 05e3119..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/RenderKitType.java
+++ /dev/null
@@ -1,232 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Render Kit Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitType#getDescription <em>Description</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitType#getDisplayName <em>Display Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitType#getIcon <em>Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitType#getRenderKitId <em>Render Kit Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitType#getRenderKitClass <em>Render Kit Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitType#getRenderer <em>Renderer</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitType#getClientBehaviorRenderer <em>Client Behavior Renderer</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitType#getRenderKitExtension <em>Render Kit Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRenderKitType()
- * @model extendedMetaData="name='render-kit_._type' kind='elementOnly'"
- * @generated
- */
-public interface RenderKitType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Description</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.DescriptionType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Description</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Description</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRenderKitType_Description()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.DescriptionType" containment="true"
-	 *        extendedMetaData="kind='element' name='description' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getDescription();
-
-    /**
-	 * Returns the value of the '<em><b>Display Name</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Display Name</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Display Name</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRenderKitType_DisplayName()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType" containment="true"
-	 *        extendedMetaData="kind='element' name='display-name' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getDisplayName();
-
-    /**
-	 * Returns the value of the '<em><b>Icon</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.IconType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Icon</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Icon</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRenderKitType_Icon()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.IconType" containment="true"
-	 *        extendedMetaData="kind='element' name='icon' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getIcon();
-
-    /**
-	 * Returns the value of the '<em><b>Render Kit Id</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Render Kit Id</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Render Kit Id</em>' containment reference.
-	 * @see #setRenderKitId(RenderKitIdType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRenderKitType_RenderKitId()
-	 * @model containment="true"
-	 *        extendedMetaData="kind='element' name='render-kit-id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	RenderKitIdType getRenderKitId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitType#getRenderKitId <em>Render Kit Id</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Render Kit Id</em>' containment reference.
-	 * @see #getRenderKitId()
-	 * @generated
-	 */
-	void setRenderKitId(RenderKitIdType value);
-
-    /**
-	 * Returns the value of the '<em><b>Render Kit Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Render Kit Class</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Render Kit Class</em>' containment reference.
-	 * @see #setRenderKitClass(RenderKitClassType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRenderKitType_RenderKitClass()
-	 * @model containment="true"
-	 *        extendedMetaData="kind='element' name='render-kit-class' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	RenderKitClassType getRenderKitClass();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitType#getRenderKitClass <em>Render Kit Class</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Render Kit Class</em>' containment reference.
-	 * @see #getRenderKitClass()
-	 * @generated
-	 */
-	void setRenderKitClass(RenderKitClassType value);
-
-    /**
-	 * Returns the value of the '<em><b>Renderer</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.RendererType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Renderer</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Renderer</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRenderKitType_Renderer()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.RendererType" containment="true"
-	 *        extendedMetaData="kind='element' name='renderer' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getRenderer();
-
-    /**
-	 * Returns the value of the '<em><b>Client Behavior Renderer</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Client Behavior Renderer</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Client Behavior Renderer</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRenderKitType_ClientBehaviorRenderer()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererType" containment="true"
-	 *        extendedMetaData="kind='element' name='client-behavior-renderer' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getClientBehaviorRenderer();
-
-				/**
-	 * Returns the value of the '<em><b>Render Kit Extension</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitExtensionType}.
-	 * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Render Kit Extension</em>' containment reference list isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-	 * @return the value of the '<em>Render Kit Extension</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRenderKitType_RenderKitExtension()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.RenderKitExtensionType" containment="true"
-	 *        extendedMetaData="kind='element' name='render-kit-extension' namespace='##targetNamespace'"
-	 * @generated
-	 */
-    EList getRenderKitExtension();
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRenderKitType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // RenderKitType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/RendererClassType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/RendererClassType.java
deleted file mode 100644
index e19bf9f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/RendererClassType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Renderer Class Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.RendererClassType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.RendererClassType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRendererClassType()
- * @model extendedMetaData="name='renderer-class_._type' kind='simple'"
- * @generated
- */
-public interface RendererClassType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRendererClassType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.RendererClassType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRendererClassType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.RendererClassType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // RendererClassType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/RendererExtensionType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/RendererExtensionType.java
deleted file mode 100644
index 3513b44..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/RendererExtensionType.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Renderer Extension Type</b></em>'.
- * <!-- end-user-doc -->
- *
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRendererExtensionType()
- * @model extendedMetaData="name='renderer-extension_._type'"
- * @generated
- */
-public interface RendererExtensionType extends ExtensionType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-} // RendererExtensionType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/RendererType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/RendererType.java
deleted file mode 100644
index a299c67..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/RendererType.java
+++ /dev/null
@@ -1,260 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Renderer Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.RendererType#getDescription <em>Description</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.RendererType#getDisplayName <em>Display Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.RendererType#getIcon <em>Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.RendererType#getComponentFamily <em>Component Family</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.RendererType#getRendererType <em>Renderer Type</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.RendererType#getRendererClass <em>Renderer Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.RendererType#getFacet <em>Facet</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.RendererType#getAttribute <em>Attribute</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.RendererType#getRendererExtension <em>Renderer Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.RendererType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRendererType()
- * @model extendedMetaData="name='renderer_._type' kind='elementOnly'"
- * @generated
- */
-public interface RendererType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Description</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.DescriptionType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Description</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Description</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRendererType_Description()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.DescriptionType" containment="true"
-	 *        extendedMetaData="kind='element' name='description' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getDescription();
-
-    /**
-	 * Returns the value of the '<em><b>Display Name</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Display Name</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Display Name</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRendererType_DisplayName()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType" containment="true"
-	 *        extendedMetaData="kind='element' name='display-name' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getDisplayName();
-
-    /**
-	 * Returns the value of the '<em><b>Icon</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.IconType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Icon</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Icon</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRendererType_Icon()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.IconType" containment="true"
-	 *        extendedMetaData="kind='element' name='icon' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getIcon();
-
-    /**
-	 * Returns the value of the '<em><b>Component Family</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Component Family</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Component Family</em>' containment reference.
-	 * @see #setComponentFamily(ComponentFamilyType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRendererType_ComponentFamily()
-	 * @model containment="true" required="true"
-	 *        extendedMetaData="kind='element' name='component-family' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ComponentFamilyType getComponentFamily();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.RendererType#getComponentFamily <em>Component Family</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Component Family</em>' containment reference.
-	 * @see #getComponentFamily()
-	 * @generated
-	 */
-	void setComponentFamily(ComponentFamilyType value);
-
-    /**
-	 * Returns the value of the '<em><b>Renderer Type</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Renderer Type</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Renderer Type</em>' containment reference.
-	 * @see #setRendererType(RendererTypeType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRendererType_RendererType()
-	 * @model containment="true" required="true"
-	 *        extendedMetaData="kind='element' name='renderer-type' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	RendererTypeType getRendererType();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.RendererType#getRendererType <em>Renderer Type</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Renderer Type</em>' containment reference.
-	 * @see #getRendererType()
-	 * @generated
-	 */
-	void setRendererType(RendererTypeType value);
-
-    /**
-	 * Returns the value of the '<em><b>Renderer Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Renderer Class</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Renderer Class</em>' containment reference.
-	 * @see #setRendererClass(RendererClassType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRendererType_RendererClass()
-	 * @model containment="true" required="true"
-	 *        extendedMetaData="kind='element' name='renderer-class' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	RendererClassType getRendererClass();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.RendererType#getRendererClass <em>Renderer Class</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Renderer Class</em>' containment reference.
-	 * @see #getRendererClass()
-	 * @generated
-	 */
-	void setRendererClass(RendererClassType value);
-
-    /**
-	 * Returns the value of the '<em><b>Facet</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.FacetType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Facet</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Facet</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRendererType_Facet()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.FacetType" containment="true"
-	 *        extendedMetaData="kind='element' name='facet' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getFacet();
-
-    /**
-	 * Returns the value of the '<em><b>Attribute</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.AttributeType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Attribute</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Attribute</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRendererType_Attribute()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.AttributeType" containment="true"
-	 *        extendedMetaData="kind='element' name='attribute' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getAttribute();
-
-    /**
-	 * Returns the value of the '<em><b>Renderer Extension</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.RendererExtensionType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Renderer Extension</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Renderer Extension</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRendererType_RendererExtension()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.RendererExtensionType" containment="true"
-	 *        extendedMetaData="kind='element' name='renderer-extension' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getRendererExtension();
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRendererType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.RendererType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // RendererType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/RendererTypeType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/RendererTypeType.java
deleted file mode 100644
index bc5aafe..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/RendererTypeType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Renderer Type Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.RendererTypeType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.RendererTypeType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRendererTypeType()
- * @model extendedMetaData="name='renderer-type_._type' kind='simple'"
- * @generated
- */
-public interface RendererTypeType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRendererTypeType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.RendererTypeType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRendererTypeType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.RendererTypeType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // RendererTypeType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ResourceBundleType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ResourceBundleType.java
deleted file mode 100644
index ee2cd8c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ResourceBundleType.java
+++ /dev/null
@@ -1,176 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Resource Bundle Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ResourceBundleType#getDescription <em>Description</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ResourceBundleType#getDisplayName <em>Display Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ResourceBundleType#getIcon <em>Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ResourceBundleType#getBaseName <em>Base Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ResourceBundleType#getVar <em>Var</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ResourceBundleType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getResourceBundleType()
- * @model extendedMetaData="name='resourceBundle_._type' kind='elementOnly'"
- * @generated
- */
-public interface ResourceBundleType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Description</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.DescriptionType}.
-	 * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Description</em>' containment reference list isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-	 * @return the value of the '<em>Description</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getResourceBundleType_Description()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.DescriptionType" containment="true"
-	 *        extendedMetaData="kind='element' name='description' namespace='##targetNamespace'"
-	 * @generated
-	 */
-    EList getDescription();
-
-    /**
-	 * Returns the value of the '<em><b>Display Name</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType}.
-	 * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Display Name</em>' containment reference list isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-	 * @return the value of the '<em>Display Name</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getResourceBundleType_DisplayName()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType" containment="true"
-	 *        extendedMetaData="kind='element' name='display-name' namespace='##targetNamespace'"
-	 * @generated
-	 */
-    EList getDisplayName();
-
-    /**
-	 * Returns the value of the '<em><b>Icon</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.IconType}.
-	 * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Icon</em>' containment reference list isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-	 * @return the value of the '<em>Icon</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getResourceBundleType_Icon()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.IconType" containment="true"
-	 *        extendedMetaData="kind='element' name='icon' namespace='##targetNamespace'"
-	 * @generated
-	 */
-    EList getIcon();
-
-    /**
-	 * Returns the value of the '<em><b>Base Name</b></em>' reference.
-	 * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Base Name</em>' reference isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-	 * @return the value of the '<em>Base Name</em>' reference.
-	 * @see #setBaseName(BaseNameType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getResourceBundleType_BaseName()
-	 * @model extendedMetaData="kind='element' name='base-name' namespace='##targetNamespace'"
-	 * @generated
-	 */
-    BaseNameType getBaseName();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ResourceBundleType#getBaseName <em>Base Name</em>}' reference.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Base Name</em>' reference.
-	 * @see #getBaseName()
-	 * @generated
-	 */
-    void setBaseName(BaseNameType value);
-
-    /**
-	 * Returns the value of the '<em><b>Var</b></em>' reference.
-	 * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Var</em>' reference isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-	 * @return the value of the '<em>Var</em>' reference.
-	 * @see #setVar(VarType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getResourceBundleType_Var()
-	 * @model extendedMetaData="kind='element' name='var' namespace='##targetNamespace'"
-	 * @generated
-	 */
-    VarType getVar();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ResourceBundleType#getVar <em>Var</em>}' reference.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Var</em>' reference.
-	 * @see #getVar()
-	 * @generated
-	 */
-    void setVar(VarType value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Id</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getResourceBundleType_Id()
-	 * @model id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-    String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ResourceBundleType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-    void setId(String value);
-
-} // ResourceBundleType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ResourceHandlerType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ResourceHandlerType.java
deleted file mode 100644
index a78949b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ResourceHandlerType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Resource Handler Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ResourceHandlerType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ResourceHandlerType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getResourceHandlerType()
- * @model extendedMetaData="name='resource-handler_._type' kind='simple'"
- * @generated
- */
-public interface ResourceHandlerType extends EObject {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getResourceHandlerType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ResourceHandlerType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getResourceHandlerType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ResourceHandlerType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // ResourceHandlerType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/SmallIconType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/SmallIconType.java
deleted file mode 100644
index 910de54..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/SmallIconType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Small Icon Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.SmallIconType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.SmallIconType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getSmallIconType()
- * @model extendedMetaData="name='small-icon_._type' kind='simple'"
- * @generated
- */
-public interface SmallIconType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getSmallIconType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.SmallIconType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getSmallIconType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.SmallIconType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // SmallIconType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/SourceClassType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/SourceClassType.java
deleted file mode 100644
index f5522ea..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/SourceClassType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Source Class Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.SourceClassType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.SourceClassType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getSourceClassType()
- * @model extendedMetaData="name='source-class_._type' kind='simple'"
- * @generated
- */
-public interface SourceClassType extends EObject {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getSourceClassType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.SourceClassType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getSourceClassType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.SourceClassType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // SourceClassType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/StateManagerType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/StateManagerType.java
deleted file mode 100644
index 46ec765..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/StateManagerType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>State Manager Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.StateManagerType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.StateManagerType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getStateManagerType()
- * @model extendedMetaData="name='state-manager_._type' kind='simple'"
- * @generated
- */
-public interface StateManagerType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getStateManagerType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.StateManagerType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getStateManagerType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.StateManagerType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // StateManagerType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/SuggestedValueType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/SuggestedValueType.java
deleted file mode 100644
index 3b98fa3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/SuggestedValueType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Suggested Value Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.SuggestedValueType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.SuggestedValueType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getSuggestedValueType()
- * @model extendedMetaData="name='suggested-value_._type' kind='simple'"
- * @generated
- */
-public interface SuggestedValueType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getSuggestedValueType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.SuggestedValueType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getSuggestedValueType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.SuggestedValueType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // SuggestedValueType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/SupportedLocaleType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/SupportedLocaleType.java
deleted file mode 100644
index 2f5c394..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/SupportedLocaleType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Supported Locale Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.SupportedLocaleType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.SupportedLocaleType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getSupportedLocaleType()
- * @model extendedMetaData="name='supported-locale_._type' kind='simple'"
- * @generated
- */
-public interface SupportedLocaleType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getSupportedLocaleType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.SupportedLocaleType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getSupportedLocaleType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.SupportedLocaleType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // SupportedLocaleType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/SystemEventClassType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/SystemEventClassType.java
deleted file mode 100644
index a98e192..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/SystemEventClassType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>System Event Class Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.SystemEventClassType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.SystemEventClassType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getSystemEventClassType()
- * @model extendedMetaData="name='system-event-class_._type' kind='simple'"
- * @generated
- */
-public interface SystemEventClassType extends EObject {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getSystemEventClassType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.SystemEventClassType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getSystemEventClassType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.SystemEventClassType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // SystemEventClassType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/SystemEventListenerClassType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/SystemEventListenerClassType.java
deleted file mode 100644
index fe5ebb1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/SystemEventListenerClassType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>System Event Listener Class Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.SystemEventListenerClassType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.SystemEventListenerClassType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getSystemEventListenerClassType()
- * @model extendedMetaData="name='system-event-listener-class_._type' kind='simple'"
- * @generated
- */
-public interface SystemEventListenerClassType extends EObject {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getSystemEventListenerClassType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.SystemEventListenerClassType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getSystemEventListenerClassType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.SystemEventListenerClassType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // SystemEventListenerClassType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/SystemEventListenerType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/SystemEventListenerType.java
deleted file mode 100644
index 3abb1d7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/SystemEventListenerType.java
+++ /dev/null
@@ -1,151 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>System Event Listener Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.SystemEventListenerType#getSystemEventListenerClass <em>System Event Listener Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.SystemEventListenerType#getSystemEventClass <em>System Event Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.SystemEventListenerType#getSourceClass <em>Source Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.SystemEventListenerType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getSystemEventListenerType()
- * @model extendedMetaData="name='system-event-listener_._type' kind='elementOnly'"
- * @generated
- */
-public interface SystemEventListenerType extends EObject {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * Returns the value of the '<em><b>System Event Listener Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>System Event Listener Class</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>System Event Listener Class</em>' containment reference.
-	 * @see #setSystemEventListenerClass(SystemEventListenerClassType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getSystemEventListenerType_SystemEventListenerClass()
-	 * @model containment="true" required="true"
-	 *        extendedMetaData="kind='element' name='system-event-listener-class' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	SystemEventListenerClassType getSystemEventListenerClass();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.SystemEventListenerType#getSystemEventListenerClass <em>System Event Listener Class</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>System Event Listener Class</em>' containment reference.
-	 * @see #getSystemEventListenerClass()
-	 * @generated
-	 */
-	void setSystemEventListenerClass(SystemEventListenerClassType value);
-
-	/**
-	 * Returns the value of the '<em><b>System Event Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>System Event Class</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>System Event Class</em>' containment reference.
-	 * @see #setSystemEventClass(SystemEventClassType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getSystemEventListenerType_SystemEventClass()
-	 * @model containment="true" required="true"
-	 *        extendedMetaData="kind='element' name='system-event-class' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	SystemEventClassType getSystemEventClass();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.SystemEventListenerType#getSystemEventClass <em>System Event Class</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>System Event Class</em>' containment reference.
-	 * @see #getSystemEventClass()
-	 * @generated
-	 */
-	void setSystemEventClass(SystemEventClassType value);
-
-	/**
-	 * Returns the value of the '<em><b>Source Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Source Class</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Source Class</em>' containment reference.
-	 * @see #setSourceClass(SourceClassType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getSystemEventListenerType_SourceClass()
-	 * @model containment="true"
-	 *        extendedMetaData="kind='element' name='source-class' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	SourceClassType getSourceClass();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.SystemEventListenerType#getSourceClass <em>Source Class</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Source Class</em>' containment reference.
-	 * @see #getSourceClass()
-	 * @generated
-	 */
-	void setSourceClass(SourceClassType value);
-
-	/**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getSystemEventListenerType_Id()
-	 * @model id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.SystemEventListenerType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // SystemEventListenerType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/TagHandlerDelegateFactoryType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/TagHandlerDelegateFactoryType.java
deleted file mode 100644
index 7049c7d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/TagHandlerDelegateFactoryType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Tag Handler Delegate Factory Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.TagHandlerDelegateFactoryType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.TagHandlerDelegateFactoryType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getTagHandlerDelegateFactoryType()
- * @model extendedMetaData="name='tag-handler-delegate-factory_._type' kind='simple'"
- * @generated
- */
-public interface TagHandlerDelegateFactoryType extends EObject {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getTagHandlerDelegateFactoryType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.TagHandlerDelegateFactoryType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getTagHandlerDelegateFactoryType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.TagHandlerDelegateFactoryType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // TagHandlerDelegateFactoryType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ToViewIdType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ToViewIdType.java
deleted file mode 100644
index 1050610..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ToViewIdType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>To View Id Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ToViewIdType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ToViewIdType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getToViewIdType()
- * @model extendedMetaData="name='to-view-id_._type' kind='simple'"
- * @generated
- */
-public interface ToViewIdType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getToViewIdType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ToViewIdType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getToViewIdType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ToViewIdType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // ToViewIdType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ValidatorClassType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ValidatorClassType.java
deleted file mode 100644
index bbbecb8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ValidatorClassType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Validator Class Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorClassType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorClassType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getValidatorClassType()
- * @model extendedMetaData="name='validator-class_._type' kind='simple'"
- * @generated
- */
-public interface ValidatorClassType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getValidatorClassType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorClassType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getValidatorClassType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorClassType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // ValidatorClassType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ValidatorExtensionType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ValidatorExtensionType.java
deleted file mode 100644
index 181de8a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ValidatorExtensionType.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Validator Extension Type</b></em>'.
- * <!-- end-user-doc -->
- *
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getValidatorExtensionType()
- * @model extendedMetaData="name='validator-extension_._type'"
- * @generated
- */
-public interface ValidatorExtensionType extends ExtensionType {
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-} // ValidatorExtensionType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ValidatorIdType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ValidatorIdType.java
deleted file mode 100644
index fadc127..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ValidatorIdType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Validator Id Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorIdType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorIdType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getValidatorIdType()
- * @model extendedMetaData="name='validator-id_._type' kind='simple'"
- * @generated
- */
-public interface ValidatorIdType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getValidatorIdType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorIdType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getValidatorIdType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorIdType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // ValidatorIdType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ValidatorType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ValidatorType.java
deleted file mode 100644
index 38e6e5b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ValidatorType.java
+++ /dev/null
@@ -1,232 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Validator Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorType#getDescription <em>Description</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorType#getDisplayName <em>Display Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorType#getIcon <em>Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorType#getValidatorId <em>Validator Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorType#getValidatorClass <em>Validator Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorType#getAttribute <em>Attribute</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorType#getProperty <em>Property</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorType#getValidatorExtension <em>Validator Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getValidatorType()
- * @model extendedMetaData="name='validator_._type' kind='elementOnly'"
- * @generated
- */
-public interface ValidatorType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Description</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.DescriptionType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Description</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Description</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getValidatorType_Description()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.DescriptionType" containment="true"
-	 *        extendedMetaData="kind='element' name='description' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getDescription();
-
-    /**
-	 * Returns the value of the '<em><b>Display Name</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Display Name</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Display Name</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getValidatorType_DisplayName()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType" containment="true"
-	 *        extendedMetaData="kind='element' name='display-name' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getDisplayName();
-
-    /**
-	 * Returns the value of the '<em><b>Icon</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.IconType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Icon</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Icon</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getValidatorType_Icon()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.IconType" containment="true"
-	 *        extendedMetaData="kind='element' name='icon' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getIcon();
-
-    /**
-	 * Returns the value of the '<em><b>Validator Id</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Validator Id</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Validator Id</em>' containment reference.
-	 * @see #setValidatorId(ValidatorIdType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getValidatorType_ValidatorId()
-	 * @model containment="true" required="true"
-	 *        extendedMetaData="kind='element' name='validator-id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ValidatorIdType getValidatorId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorType#getValidatorId <em>Validator Id</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Validator Id</em>' containment reference.
-	 * @see #getValidatorId()
-	 * @generated
-	 */
-	void setValidatorId(ValidatorIdType value);
-
-    /**
-	 * Returns the value of the '<em><b>Validator Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Validator Class</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Validator Class</em>' containment reference.
-	 * @see #setValidatorClass(ValidatorClassType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getValidatorType_ValidatorClass()
-	 * @model containment="true" required="true"
-	 *        extendedMetaData="kind='element' name='validator-class' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ValidatorClassType getValidatorClass();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorType#getValidatorClass <em>Validator Class</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Validator Class</em>' containment reference.
-	 * @see #getValidatorClass()
-	 * @generated
-	 */
-	void setValidatorClass(ValidatorClassType value);
-
-    /**
-	 * Returns the value of the '<em><b>Attribute</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.AttributeType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Attribute</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Attribute</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getValidatorType_Attribute()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.AttributeType" containment="true"
-	 *        extendedMetaData="kind='element' name='attribute' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getAttribute();
-
-    /**
-	 * Returns the value of the '<em><b>Property</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.PropertyType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Property</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Property</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getValidatorType_Property()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.PropertyType" containment="true"
-	 *        extendedMetaData="kind='element' name='property' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getProperty();
-
-    /**
-	 * Returns the value of the '<em><b>Validator Extension</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorExtensionType}.
-	 * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Validator Extension</em>' containment reference list isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-	 * @return the value of the '<em>Validator Extension</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getValidatorType_ValidatorExtension()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.ValidatorExtensionType" containment="true"
-	 *        extendedMetaData="kind='element' name='validator-extension' namespace='##targetNamespace'"
-	 * @generated
-	 */
-    EList getValidatorExtension();
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getValidatorType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // ValidatorType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ValueClassType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ValueClassType.java
deleted file mode 100644
index d13be62..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ValueClassType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Value Class Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ValueClassType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ValueClassType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getValueClassType()
- * @model extendedMetaData="name='value-class_._type' kind='simple'"
- * @generated
- */
-public interface ValueClassType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getValueClassType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ValueClassType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getValueClassType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ValueClassType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // ValueClassType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ValueType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ValueType.java
deleted file mode 100644
index 5b95e85..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ValueType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Value Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ValueType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ValueType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getValueType()
- * @model extendedMetaData="name='value_._type' kind='simple'"
- * @generated
- */
-public interface ValueType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getValueType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ValueType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getValueType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ValueType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // ValueType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/VarType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/VarType.java
deleted file mode 100644
index e23d09e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/VarType.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Var Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.VarType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.VarType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getVarType()
- * @model extendedMetaData="name='var_._type' kind='simple'"
- * @generated
- */
-public interface VarType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getVarType_TextContent()
-	 * @model extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-    String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.VarType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-    void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Id</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getVarType_Id()
-	 * @model id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-    String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.VarType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-    void setId(String value);
-
-} // VarType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/VariableResolverType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/VariableResolverType.java
deleted file mode 100644
index dda6b9e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/VariableResolverType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Variable Resolver Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.VariableResolverType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.VariableResolverType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getVariableResolverType()
- * @model extendedMetaData="name='variable-resolver_._type' kind='simple'"
- * @generated
- */
-public interface VariableResolverType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getVariableResolverType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.VariableResolverType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getVariableResolverType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.VariableResolverType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // VariableResolverType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ViewDeclarationLanguageFactoryType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ViewDeclarationLanguageFactoryType.java
deleted file mode 100644
index 191e462..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ViewDeclarationLanguageFactoryType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>View Declaration Language Factory Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ViewDeclarationLanguageFactoryType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ViewDeclarationLanguageFactoryType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getViewDeclarationLanguageFactoryType()
- * @model extendedMetaData="name='view-declaration-language-factory_._type' kind='simple'"
- * @generated
- */
-public interface ViewDeclarationLanguageFactoryType extends EObject {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getViewDeclarationLanguageFactoryType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ViewDeclarationLanguageFactoryType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getViewDeclarationLanguageFactoryType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ViewDeclarationLanguageFactoryType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // ViewDeclarationLanguageFactoryType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ViewHandlerType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ViewHandlerType.java
deleted file mode 100644
index 83819f2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ViewHandlerType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>View Handler Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ViewHandlerType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ViewHandlerType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getViewHandlerType()
- * @model extendedMetaData="name='view-handler_._type' kind='simple'"
- * @generated
- */
-public interface ViewHandlerType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getViewHandlerType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ViewHandlerType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getViewHandlerType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ViewHandlerType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // ViewHandlerType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/VisitContextFactoryType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/VisitContextFactoryType.java
deleted file mode 100644
index 97b50d5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/VisitContextFactoryType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Visit Context Factory Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.VisitContextFactoryType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.VisitContextFactoryType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getVisitContextFactoryType()
- * @model extendedMetaData="name='visit-context-factory_._type' kind='simple'"
- * @generated
- */
-public interface VisitContextFactoryType extends EObject {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getVisitContextFactoryType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.VisitContextFactoryType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getVisitContextFactoryType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.VisitContextFactoryType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // VisitContextFactoryType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/AbsoluteOrderingTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/AbsoluteOrderingTypeImpl.java
deleted file mode 100644
index c3347fd..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/AbsoluteOrderingTypeImpl.java
+++ /dev/null
@@ -1,250 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.facesconfig.emf.AbsoluteOrderingType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.NameType;
-import org.eclipse.jst.jsf.facesconfig.emf.OrderingOthersType;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Absolute Ordering Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.AbsoluteOrderingTypeImpl#getName <em>Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.AbsoluteOrderingTypeImpl#getOthers <em>Others</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class AbsoluteOrderingTypeImpl extends EObjectImpl implements AbsoluteOrderingType {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * The cached value of the '{@link #getName() <em>Name</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getName()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList name;
-
-	/**
-	 * The cached value of the '{@link #getOthers() <em>Others</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getOthers()
-	 * @generated
-	 * @ordered
-	 */
-	protected OrderingOthersType others;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected AbsoluteOrderingTypeImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.ABSOLUTE_ORDERING_TYPE;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getName() {
-		if (name == null) {
-			name = new EObjectContainmentEList(NameType.class, this, FacesConfigPackage.ABSOLUTE_ORDERING_TYPE__NAME);
-		}
-		return name;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public OrderingOthersType getOthers() {
-		return others;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param newOthers 
-	 * @param msgs 
-	 * @return NotificationChain
-	 * @generated NOT
-	 */
-	public NotificationChain basicSetOthers(OrderingOthersType newOthers, NotificationChain msgs) {
-		OrderingOthersType oldOthers = others;
-		others = newOthers;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.ABSOLUTE_ORDERING_TYPE__OTHERS, oldOthers, newOthers);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setOthers(OrderingOthersType newOthers) {
-		if (newOthers != others) {
-			NotificationChain msgs = null;
-			if (others != null)
-				msgs = ((InternalEObject)others).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.ABSOLUTE_ORDERING_TYPE__OTHERS, null, msgs);
-			if (newOthers != null)
-				msgs = ((InternalEObject)newOthers).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.ABSOLUTE_ORDERING_TYPE__OTHERS, null, msgs);
-			msgs = basicSetOthers(newOthers, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.ABSOLUTE_ORDERING_TYPE__OTHERS, newOthers, newOthers));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case FacesConfigPackage.ABSOLUTE_ORDERING_TYPE__NAME:
-				return ((InternalEList)getName()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.ABSOLUTE_ORDERING_TYPE__OTHERS:
-				return basicSetOthers(null, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.ABSOLUTE_ORDERING_TYPE__NAME:
-				return getName();
-			case FacesConfigPackage.ABSOLUTE_ORDERING_TYPE__OTHERS:
-				return getOthers();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.ABSOLUTE_ORDERING_TYPE__NAME:
-				getName().clear();
-				getName().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.ABSOLUTE_ORDERING_TYPE__OTHERS:
-				setOthers((OrderingOthersType)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.ABSOLUTE_ORDERING_TYPE__NAME:
-				getName().clear();
-				return;
-			case FacesConfigPackage.ABSOLUTE_ORDERING_TYPE__OTHERS:
-				setOthers((OrderingOthersType)null);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.ABSOLUTE_ORDERING_TYPE__NAME:
-				return name != null && !name.isEmpty();
-			case FacesConfigPackage.ABSOLUTE_ORDERING_TYPE__OTHERS:
-				return others != null;
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (names: "); //$NON-NLS-1$
-		for (final Object oname : getName()) {
-			NameType nameType = (NameType)oname;
-			result.append(nameType.getTextContent());
-			result.append(',');
-		}
-		result.append(')');
-//		result.append(" (id: "); //$NON-NLS-1$
-//		result.append(id);
-//		result.append(')');
-		return result.toString();
-	}
-
-} //AbsoluteOrderingTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ActionListenerTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ActionListenerTypeImpl.java
deleted file mode 100644
index ad8360e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ActionListenerTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.ActionListenerType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Action Listener Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ActionListenerTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ActionListenerTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ActionListenerTypeImpl extends EObjectImpl implements ActionListenerType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ActionListenerTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.ACTION_LISTENER_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.ACTION_LISTENER_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.ACTION_LISTENER_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.ACTION_LISTENER_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.ACTION_LISTENER_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.ACTION_LISTENER_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.ACTION_LISTENER_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.ACTION_LISTENER_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.ACTION_LISTENER_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.ACTION_LISTENER_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.ACTION_LISTENER_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: ");//$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: ");//$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ActionListenerTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ApplicationExtensionTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ApplicationExtensionTypeImpl.java
deleted file mode 100644
index 2b74cf4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ApplicationExtensionTypeImpl.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.jst.jsf.facesconfig.emf.ApplicationExtensionType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Application Extension Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * </p>
- *
- * @generated
- */
-public class ApplicationExtensionTypeImpl extends ExtensionTypeImpl implements ApplicationExtensionType {
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    @SuppressWarnings("hiding")
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected ApplicationExtensionTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.APPLICATION_EXTENSION_TYPE;
-	}
-
-} //ApplicationExtensionTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ApplicationFactoryTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ApplicationFactoryTypeImpl.java
deleted file mode 100644
index 4280a62..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ApplicationFactoryTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.ApplicationFactoryType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Application Factory Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ApplicationFactoryTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ApplicationFactoryTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ApplicationFactoryTypeImpl extends EObjectImpl implements ApplicationFactoryType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ApplicationFactoryTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.APPLICATION_FACTORY_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.APPLICATION_FACTORY_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.APPLICATION_FACTORY_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.APPLICATION_FACTORY_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.APPLICATION_FACTORY_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.APPLICATION_FACTORY_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.APPLICATION_FACTORY_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.APPLICATION_FACTORY_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.APPLICATION_FACTORY_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.APPLICATION_FACTORY_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.APPLICATION_FACTORY_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: ");//$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: ");//$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ApplicationFactoryTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ApplicationTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ApplicationTypeImpl.java
deleted file mode 100644
index de8affd..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ApplicationTypeImpl.java
+++ /dev/null
@@ -1,735 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.EObjectResolvingEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.facesconfig.emf.ActionListenerType;
-import org.eclipse.jst.jsf.facesconfig.emf.ApplicationExtensionType;
-import org.eclipse.jst.jsf.facesconfig.emf.ApplicationType;
-import org.eclipse.jst.jsf.facesconfig.emf.DefaultRenderKitIdType;
-import org.eclipse.jst.jsf.facesconfig.emf.DefaultValidatorsType;
-import org.eclipse.jst.jsf.facesconfig.emf.ELResolverType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.LocaleConfigType;
-import org.eclipse.jst.jsf.facesconfig.emf.MessageBundleType;
-import org.eclipse.jst.jsf.facesconfig.emf.NavigationHandlerType;
-import org.eclipse.jst.jsf.facesconfig.emf.PropertyResolverType;
-import org.eclipse.jst.jsf.facesconfig.emf.ResourceBundleType;
-import org.eclipse.jst.jsf.facesconfig.emf.ResourceHandlerType;
-import org.eclipse.jst.jsf.facesconfig.emf.StateManagerType;
-import org.eclipse.jst.jsf.facesconfig.emf.SystemEventListenerType;
-import org.eclipse.jst.jsf.facesconfig.emf.VariableResolverType;
-import org.eclipse.jst.jsf.facesconfig.emf.ViewHandlerType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Application Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ApplicationTypeImpl#getActionListener <em>Action Listener</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ApplicationTypeImpl#getDefaultRenderKitId <em>Default Render Kit Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ApplicationTypeImpl#getMessageBundle <em>Message Bundle</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ApplicationTypeImpl#getNavigationHandler <em>Navigation Handler</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ApplicationTypeImpl#getViewHandler <em>View Handler</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ApplicationTypeImpl#getStateManager <em>State Manager</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ApplicationTypeImpl#getELResolver <em>EL Resolver</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ApplicationTypeImpl#getPropertyResolver <em>Property Resolver</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ApplicationTypeImpl#getVariableResolver <em>Variable Resolver</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ApplicationTypeImpl#getResourceHandler <em>Resource Handler</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ApplicationTypeImpl#getSystemEventListener <em>System Event Listener</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ApplicationTypeImpl#getLocaleConfig <em>Locale Config</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ApplicationTypeImpl#getResourceBundle <em>Resource Bundle</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ApplicationTypeImpl#getApplicationExtension <em>Application Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ApplicationTypeImpl#getDefaultValidators <em>Default Validators</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ApplicationTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ApplicationTypeImpl extends EObjectImpl implements ApplicationType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The cached value of the '{@link #getActionListener() <em>Action Listener</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getActionListener()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList actionListener;
-
-    /**
-	 * The cached value of the '{@link #getDefaultRenderKitId() <em>Default Render Kit Id</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDefaultRenderKitId()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList defaultRenderKitId;
-
-    /**
-	 * The cached value of the '{@link #getMessageBundle() <em>Message Bundle</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getMessageBundle()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList messageBundle;
-
-    /**
-	 * The cached value of the '{@link #getNavigationHandler() <em>Navigation Handler</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getNavigationHandler()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList navigationHandler;
-
-    /**
-	 * The cached value of the '{@link #getViewHandler() <em>View Handler</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getViewHandler()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList viewHandler;
-
-    /**
-	 * The cached value of the '{@link #getStateManager() <em>State Manager</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getStateManager()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList stateManager;
-
-    /**
-	 * The cached value of the '{@link #getELResolver() <em>EL Resolver</em>}' reference list.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see #getELResolver()
-	 * @generated
-	 * @ordered
-	 */
-    protected EList eLResolver;
-
-				/**
-	 * The cached value of the '{@link #getPropertyResolver() <em>Property Resolver</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPropertyResolver()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList propertyResolver;
-
-				/**
-	 * The cached value of the '{@link #getVariableResolver() <em>Variable Resolver</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getVariableResolver()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList variableResolver;
-
-				/**
-	 * The cached value of the '{@link #getResourceHandler() <em>Resource Handler</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getResourceHandler()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList resourceHandler;
-
-				/**
-	 * The cached value of the '{@link #getSystemEventListener() <em>System Event Listener</em>}' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getSystemEventListener()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList systemEventListener;
-
-				/**
-	 * The cached value of the '{@link #getLocaleConfig() <em>Locale Config</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getLocaleConfig()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList localeConfig;
-
-    /**
-	 * The cached value of the '{@link #getResourceBundle() <em>Resource Bundle</em>}' reference list.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see #getResourceBundle()
-	 * @generated
-	 * @ordered
-	 */
-    protected EList resourceBundle;
-
-    /**
-	 * The cached value of the '{@link #getApplicationExtension() <em>Application Extension</em>}' reference list.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see #getApplicationExtension()
-	 * @generated
-	 * @ordered
-	 */
-    protected EList applicationExtension;
-
-    /**
-	 * The cached value of the '{@link #getDefaultValidators() <em>Default Validators</em>}' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDefaultValidators()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList defaultValidators;
-
-				/**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-				/**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ApplicationTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.APPLICATION_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getActionListener() {
-		if (actionListener == null) {
-			actionListener = new EObjectContainmentEList(ActionListenerType.class, this, FacesConfigPackage.APPLICATION_TYPE__ACTION_LISTENER);
-		}
-		return actionListener;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getDefaultRenderKitId() {
-		if (defaultRenderKitId == null) {
-			defaultRenderKitId = new EObjectContainmentEList(DefaultRenderKitIdType.class, this, FacesConfigPackage.APPLICATION_TYPE__DEFAULT_RENDER_KIT_ID);
-		}
-		return defaultRenderKitId;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getMessageBundle() {
-		if (messageBundle == null) {
-			messageBundle = new EObjectContainmentEList(MessageBundleType.class, this, FacesConfigPackage.APPLICATION_TYPE__MESSAGE_BUNDLE);
-		}
-		return messageBundle;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getNavigationHandler() {
-		if (navigationHandler == null) {
-			navigationHandler = new EObjectContainmentEList(NavigationHandlerType.class, this, FacesConfigPackage.APPLICATION_TYPE__NAVIGATION_HANDLER);
-		}
-		return navigationHandler;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getViewHandler() {
-		if (viewHandler == null) {
-			viewHandler = new EObjectContainmentEList(ViewHandlerType.class, this, FacesConfigPackage.APPLICATION_TYPE__VIEW_HANDLER);
-		}
-		return viewHandler;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getStateManager() {
-		if (stateManager == null) {
-			stateManager = new EObjectContainmentEList(StateManagerType.class, this, FacesConfigPackage.APPLICATION_TYPE__STATE_MANAGER);
-		}
-		return stateManager;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getPropertyResolver() {
-		if (propertyResolver == null) {
-			propertyResolver = new EObjectContainmentEList(PropertyResolverType.class, this, FacesConfigPackage.APPLICATION_TYPE__PROPERTY_RESOLVER);
-		}
-		return propertyResolver;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getVariableResolver() {
-		if (variableResolver == null) {
-			variableResolver = new EObjectContainmentEList(VariableResolverType.class, this, FacesConfigPackage.APPLICATION_TYPE__VARIABLE_RESOLVER);
-		}
-		return variableResolver;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getResourceHandler() {
-		if (resourceHandler == null) {
-			resourceHandler = new EObjectContainmentEList(ResourceHandlerType.class, this, FacesConfigPackage.APPLICATION_TYPE__RESOURCE_HANDLER);
-		}
-		return resourceHandler;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getSystemEventListener() {
-		if (systemEventListener == null) {
-			systemEventListener = new EObjectResolvingEList(SystemEventListenerType.class, this, FacesConfigPackage.APPLICATION_TYPE__SYSTEM_EVENT_LISTENER);
-		}
-		return systemEventListener;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getLocaleConfig() {
-		if (localeConfig == null) {
-			localeConfig = new EObjectContainmentEList(LocaleConfigType.class, this, FacesConfigPackage.APPLICATION_TYPE__LOCALE_CONFIG);
-		}
-		return localeConfig;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.APPLICATION_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EList getELResolver() {
-		if (eLResolver == null) {
-			eLResolver = new EObjectResolvingEList(ELResolverType.class, this, FacesConfigPackage.APPLICATION_TYPE__EL_RESOLVER);
-		}
-		return eLResolver;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EList getResourceBundle() {
-		if (resourceBundle == null) {
-			resourceBundle = new EObjectResolvingEList(ResourceBundleType.class, this, FacesConfigPackage.APPLICATION_TYPE__RESOURCE_BUNDLE);
-		}
-		return resourceBundle;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EList getApplicationExtension() {
-		if (applicationExtension == null) {
-			applicationExtension = new EObjectResolvingEList(ApplicationExtensionType.class, this, FacesConfigPackage.APPLICATION_TYPE__APPLICATION_EXTENSION);
-		}
-		return applicationExtension;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getDefaultValidators() {
-		if (defaultValidators == null) {
-			defaultValidators = new EObjectResolvingEList(DefaultValidatorsType.class, this, FacesConfigPackage.APPLICATION_TYPE__DEFAULT_VALIDATORS);
-		}
-		return defaultValidators;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case FacesConfigPackage.APPLICATION_TYPE__ACTION_LISTENER:
-				return ((InternalEList)getActionListener()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.APPLICATION_TYPE__DEFAULT_RENDER_KIT_ID:
-				return ((InternalEList)getDefaultRenderKitId()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.APPLICATION_TYPE__MESSAGE_BUNDLE:
-				return ((InternalEList)getMessageBundle()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.APPLICATION_TYPE__NAVIGATION_HANDLER:
-				return ((InternalEList)getNavigationHandler()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.APPLICATION_TYPE__VIEW_HANDLER:
-				return ((InternalEList)getViewHandler()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.APPLICATION_TYPE__STATE_MANAGER:
-				return ((InternalEList)getStateManager()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.APPLICATION_TYPE__PROPERTY_RESOLVER:
-				return ((InternalEList)getPropertyResolver()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.APPLICATION_TYPE__VARIABLE_RESOLVER:
-				return ((InternalEList)getVariableResolver()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.APPLICATION_TYPE__RESOURCE_HANDLER:
-				return ((InternalEList)getResourceHandler()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.APPLICATION_TYPE__LOCALE_CONFIG:
-				return ((InternalEList)getLocaleConfig()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.APPLICATION_TYPE__ACTION_LISTENER:
-				return getActionListener();
-			case FacesConfigPackage.APPLICATION_TYPE__DEFAULT_RENDER_KIT_ID:
-				return getDefaultRenderKitId();
-			case FacesConfigPackage.APPLICATION_TYPE__MESSAGE_BUNDLE:
-				return getMessageBundle();
-			case FacesConfigPackage.APPLICATION_TYPE__NAVIGATION_HANDLER:
-				return getNavigationHandler();
-			case FacesConfigPackage.APPLICATION_TYPE__VIEW_HANDLER:
-				return getViewHandler();
-			case FacesConfigPackage.APPLICATION_TYPE__STATE_MANAGER:
-				return getStateManager();
-			case FacesConfigPackage.APPLICATION_TYPE__EL_RESOLVER:
-				return getELResolver();
-			case FacesConfigPackage.APPLICATION_TYPE__PROPERTY_RESOLVER:
-				return getPropertyResolver();
-			case FacesConfigPackage.APPLICATION_TYPE__VARIABLE_RESOLVER:
-				return getVariableResolver();
-			case FacesConfigPackage.APPLICATION_TYPE__RESOURCE_HANDLER:
-				return getResourceHandler();
-			case FacesConfigPackage.APPLICATION_TYPE__SYSTEM_EVENT_LISTENER:
-				return getSystemEventListener();
-			case FacesConfigPackage.APPLICATION_TYPE__LOCALE_CONFIG:
-				return getLocaleConfig();
-			case FacesConfigPackage.APPLICATION_TYPE__RESOURCE_BUNDLE:
-				return getResourceBundle();
-			case FacesConfigPackage.APPLICATION_TYPE__APPLICATION_EXTENSION:
-				return getApplicationExtension();
-			case FacesConfigPackage.APPLICATION_TYPE__DEFAULT_VALIDATORS:
-				return getDefaultValidators();
-			case FacesConfigPackage.APPLICATION_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.APPLICATION_TYPE__ACTION_LISTENER:
-				getActionListener().clear();
-				getActionListener().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.APPLICATION_TYPE__DEFAULT_RENDER_KIT_ID:
-				getDefaultRenderKitId().clear();
-				getDefaultRenderKitId().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.APPLICATION_TYPE__MESSAGE_BUNDLE:
-				getMessageBundle().clear();
-				getMessageBundle().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.APPLICATION_TYPE__NAVIGATION_HANDLER:
-				getNavigationHandler().clear();
-				getNavigationHandler().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.APPLICATION_TYPE__VIEW_HANDLER:
-				getViewHandler().clear();
-				getViewHandler().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.APPLICATION_TYPE__STATE_MANAGER:
-				getStateManager().clear();
-				getStateManager().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.APPLICATION_TYPE__EL_RESOLVER:
-				getELResolver().clear();
-				getELResolver().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.APPLICATION_TYPE__PROPERTY_RESOLVER:
-				getPropertyResolver().clear();
-				getPropertyResolver().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.APPLICATION_TYPE__VARIABLE_RESOLVER:
-				getVariableResolver().clear();
-				getVariableResolver().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.APPLICATION_TYPE__RESOURCE_HANDLER:
-				getResourceHandler().clear();
-				getResourceHandler().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.APPLICATION_TYPE__SYSTEM_EVENT_LISTENER:
-				getSystemEventListener().clear();
-				getSystemEventListener().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.APPLICATION_TYPE__LOCALE_CONFIG:
-				getLocaleConfig().clear();
-				getLocaleConfig().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.APPLICATION_TYPE__RESOURCE_BUNDLE:
-				getResourceBundle().clear();
-				getResourceBundle().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.APPLICATION_TYPE__APPLICATION_EXTENSION:
-				getApplicationExtension().clear();
-				getApplicationExtension().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.APPLICATION_TYPE__DEFAULT_VALIDATORS:
-				getDefaultValidators().clear();
-				getDefaultValidators().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.APPLICATION_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.APPLICATION_TYPE__ACTION_LISTENER:
-				getActionListener().clear();
-				return;
-			case FacesConfigPackage.APPLICATION_TYPE__DEFAULT_RENDER_KIT_ID:
-				getDefaultRenderKitId().clear();
-				return;
-			case FacesConfigPackage.APPLICATION_TYPE__MESSAGE_BUNDLE:
-				getMessageBundle().clear();
-				return;
-			case FacesConfigPackage.APPLICATION_TYPE__NAVIGATION_HANDLER:
-				getNavigationHandler().clear();
-				return;
-			case FacesConfigPackage.APPLICATION_TYPE__VIEW_HANDLER:
-				getViewHandler().clear();
-				return;
-			case FacesConfigPackage.APPLICATION_TYPE__STATE_MANAGER:
-				getStateManager().clear();
-				return;
-			case FacesConfigPackage.APPLICATION_TYPE__EL_RESOLVER:
-				getELResolver().clear();
-				return;
-			case FacesConfigPackage.APPLICATION_TYPE__PROPERTY_RESOLVER:
-				getPropertyResolver().clear();
-				return;
-			case FacesConfigPackage.APPLICATION_TYPE__VARIABLE_RESOLVER:
-				getVariableResolver().clear();
-				return;
-			case FacesConfigPackage.APPLICATION_TYPE__RESOURCE_HANDLER:
-				getResourceHandler().clear();
-				return;
-			case FacesConfigPackage.APPLICATION_TYPE__SYSTEM_EVENT_LISTENER:
-				getSystemEventListener().clear();
-				return;
-			case FacesConfigPackage.APPLICATION_TYPE__LOCALE_CONFIG:
-				getLocaleConfig().clear();
-				return;
-			case FacesConfigPackage.APPLICATION_TYPE__RESOURCE_BUNDLE:
-				getResourceBundle().clear();
-				return;
-			case FacesConfigPackage.APPLICATION_TYPE__APPLICATION_EXTENSION:
-				getApplicationExtension().clear();
-				return;
-			case FacesConfigPackage.APPLICATION_TYPE__DEFAULT_VALIDATORS:
-				getDefaultValidators().clear();
-				return;
-			case FacesConfigPackage.APPLICATION_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.APPLICATION_TYPE__ACTION_LISTENER:
-				return actionListener != null && !actionListener.isEmpty();
-			case FacesConfigPackage.APPLICATION_TYPE__DEFAULT_RENDER_KIT_ID:
-				return defaultRenderKitId != null && !defaultRenderKitId.isEmpty();
-			case FacesConfigPackage.APPLICATION_TYPE__MESSAGE_BUNDLE:
-				return messageBundle != null && !messageBundle.isEmpty();
-			case FacesConfigPackage.APPLICATION_TYPE__NAVIGATION_HANDLER:
-				return navigationHandler != null && !navigationHandler.isEmpty();
-			case FacesConfigPackage.APPLICATION_TYPE__VIEW_HANDLER:
-				return viewHandler != null && !viewHandler.isEmpty();
-			case FacesConfigPackage.APPLICATION_TYPE__STATE_MANAGER:
-				return stateManager != null && !stateManager.isEmpty();
-			case FacesConfigPackage.APPLICATION_TYPE__EL_RESOLVER:
-				return eLResolver != null && !eLResolver.isEmpty();
-			case FacesConfigPackage.APPLICATION_TYPE__PROPERTY_RESOLVER:
-				return propertyResolver != null && !propertyResolver.isEmpty();
-			case FacesConfigPackage.APPLICATION_TYPE__VARIABLE_RESOLVER:
-				return variableResolver != null && !variableResolver.isEmpty();
-			case FacesConfigPackage.APPLICATION_TYPE__RESOURCE_HANDLER:
-				return resourceHandler != null && !resourceHandler.isEmpty();
-			case FacesConfigPackage.APPLICATION_TYPE__SYSTEM_EVENT_LISTENER:
-				return systemEventListener != null && !systemEventListener.isEmpty();
-			case FacesConfigPackage.APPLICATION_TYPE__LOCALE_CONFIG:
-				return localeConfig != null && !localeConfig.isEmpty();
-			case FacesConfigPackage.APPLICATION_TYPE__RESOURCE_BUNDLE:
-				return resourceBundle != null && !resourceBundle.isEmpty();
-			case FacesConfigPackage.APPLICATION_TYPE__APPLICATION_EXTENSION:
-				return applicationExtension != null && !applicationExtension.isEmpty();
-			case FacesConfigPackage.APPLICATION_TYPE__DEFAULT_VALIDATORS:
-				return defaultValidators != null && !defaultValidators.isEmpty();
-			case FacesConfigPackage.APPLICATION_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ApplicationTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/AttributeClassTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/AttributeClassTypeImpl.java
deleted file mode 100644
index 5f390f7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/AttributeClassTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.AttributeClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Attribute Class Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeClassTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeClassTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class AttributeClassTypeImpl extends EObjectImpl implements AttributeClassType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected AttributeClassTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.ATTRIBUTE_CLASS_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.ATTRIBUTE_CLASS_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.ATTRIBUTE_CLASS_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.ATTRIBUTE_CLASS_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.ATTRIBUTE_CLASS_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.ATTRIBUTE_CLASS_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.ATTRIBUTE_CLASS_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.ATTRIBUTE_CLASS_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.ATTRIBUTE_CLASS_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.ATTRIBUTE_CLASS_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.ATTRIBUTE_CLASS_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: ");//$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: ");//$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //AttributeClassTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/AttributeExtensionTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/AttributeExtensionTypeImpl.java
deleted file mode 100644
index af1ea26..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/AttributeExtensionTypeImpl.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.jst.jsf.facesconfig.emf.AttributeExtensionType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Attribute Extension Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * </p>
- *
- * @generated
- */
-public class AttributeExtensionTypeImpl extends ExtensionTypeImpl implements AttributeExtensionType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@SuppressWarnings("hiding")
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected AttributeExtensionTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.ATTRIBUTE_EXTENSION_TYPE;
-	}
-
-} //AttributeExtensionTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/AttributeNameTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/AttributeNameTypeImpl.java
deleted file mode 100644
index 87f3a86..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/AttributeNameTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.AttributeNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Attribute Name Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeNameTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeNameTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class AttributeNameTypeImpl extends EObjectImpl implements AttributeNameType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected AttributeNameTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.ATTRIBUTE_NAME_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.ATTRIBUTE_NAME_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.ATTRIBUTE_NAME_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.ATTRIBUTE_NAME_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.ATTRIBUTE_NAME_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.ATTRIBUTE_NAME_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.ATTRIBUTE_NAME_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.ATTRIBUTE_NAME_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.ATTRIBUTE_NAME_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.ATTRIBUTE_NAME_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.ATTRIBUTE_NAME_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: "); //$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //AttributeNameTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/AttributeTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/AttributeTypeImpl.java
deleted file mode 100644
index d7e8709..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/AttributeTypeImpl.java
+++ /dev/null
@@ -1,617 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.facesconfig.emf.AttributeClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.AttributeExtensionType;
-import org.eclipse.jst.jsf.facesconfig.emf.AttributeNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.AttributeType;
-import org.eclipse.jst.jsf.facesconfig.emf.DefaultValueType;
-import org.eclipse.jst.jsf.facesconfig.emf.DescriptionType;
-import org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.IconType;
-import org.eclipse.jst.jsf.facesconfig.emf.SuggestedValueType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Attribute Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeTypeImpl#getDescription <em>Description</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeTypeImpl#getDisplayName <em>Display Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeTypeImpl#getIcon <em>Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeTypeImpl#getAttributeName <em>Attribute Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeTypeImpl#getAttributeClass <em>Attribute Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeTypeImpl#getDefaultValue <em>Default Value</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeTypeImpl#getSuggestedValue <em>Suggested Value</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeTypeImpl#getAttributeExtension <em>Attribute Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class AttributeTypeImpl extends EObjectImpl implements AttributeType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The cached value of the '{@link #getDescription() <em>Description</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDescription()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList description;
-
-    /**
-	 * The cached value of the '{@link #getDisplayName() <em>Display Name</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDisplayName()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList displayName;
-
-    /**
-	 * The cached value of the '{@link #getIcon() <em>Icon</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getIcon()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList icon;
-
-    /**
-	 * The cached value of the '{@link #getAttributeName() <em>Attribute Name</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getAttributeName()
-	 * @generated
-	 * @ordered
-	 */
-	protected AttributeNameType attributeName;
-
-    /**
-	 * The cached value of the '{@link #getAttributeClass() <em>Attribute Class</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getAttributeClass()
-	 * @generated
-	 * @ordered
-	 */
-	protected AttributeClassType attributeClass;
-
-    /**
-	 * The cached value of the '{@link #getDefaultValue() <em>Default Value</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDefaultValue()
-	 * @generated
-	 * @ordered
-	 */
-	protected DefaultValueType defaultValue;
-
-    /**
-	 * The cached value of the '{@link #getSuggestedValue() <em>Suggested Value</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getSuggestedValue()
-	 * @generated
-	 * @ordered
-	 */
-	protected SuggestedValueType suggestedValue;
-
-    /**
-	 * The cached value of the '{@link #getAttributeExtension() <em>Attribute Extension</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getAttributeExtension()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList attributeExtension;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected AttributeTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.ATTRIBUTE_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getDescription() {
-		if (description == null) {
-			description = new EObjectContainmentEList(DescriptionType.class, this, FacesConfigPackage.ATTRIBUTE_TYPE__DESCRIPTION);
-		}
-		return description;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getDisplayName() {
-		if (displayName == null) {
-			displayName = new EObjectContainmentEList(DisplayNameType.class, this, FacesConfigPackage.ATTRIBUTE_TYPE__DISPLAY_NAME);
-		}
-		return displayName;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getIcon() {
-		if (icon == null) {
-			icon = new EObjectContainmentEList(IconType.class, this, FacesConfigPackage.ATTRIBUTE_TYPE__ICON);
-		}
-		return icon;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public AttributeNameType getAttributeName() {
-		return attributeName;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newAttributeName 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetAttributeName(AttributeNameType newAttributeName, NotificationChain msgs) {
-		AttributeNameType oldAttributeName = attributeName;
-		attributeName = newAttributeName;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.ATTRIBUTE_TYPE__ATTRIBUTE_NAME, oldAttributeName, newAttributeName);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setAttributeName(AttributeNameType newAttributeName) {
-		if (newAttributeName != attributeName) {
-			NotificationChain msgs = null;
-			if (attributeName != null)
-				msgs = ((InternalEObject)attributeName).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.ATTRIBUTE_TYPE__ATTRIBUTE_NAME, null, msgs);
-			if (newAttributeName != null)
-				msgs = ((InternalEObject)newAttributeName).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.ATTRIBUTE_TYPE__ATTRIBUTE_NAME, null, msgs);
-			msgs = basicSetAttributeName(newAttributeName, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.ATTRIBUTE_TYPE__ATTRIBUTE_NAME, newAttributeName, newAttributeName));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public AttributeClassType getAttributeClass() {
-		return attributeClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newAttributeClass 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetAttributeClass(AttributeClassType newAttributeClass, NotificationChain msgs) {
-		AttributeClassType oldAttributeClass = attributeClass;
-		attributeClass = newAttributeClass;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.ATTRIBUTE_TYPE__ATTRIBUTE_CLASS, oldAttributeClass, newAttributeClass);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setAttributeClass(AttributeClassType newAttributeClass) {
-		if (newAttributeClass != attributeClass) {
-			NotificationChain msgs = null;
-			if (attributeClass != null)
-				msgs = ((InternalEObject)attributeClass).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.ATTRIBUTE_TYPE__ATTRIBUTE_CLASS, null, msgs);
-			if (newAttributeClass != null)
-				msgs = ((InternalEObject)newAttributeClass).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.ATTRIBUTE_TYPE__ATTRIBUTE_CLASS, null, msgs);
-			msgs = basicSetAttributeClass(newAttributeClass, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.ATTRIBUTE_TYPE__ATTRIBUTE_CLASS, newAttributeClass, newAttributeClass));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public DefaultValueType getDefaultValue() {
-		return defaultValue;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newDefaultValue 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetDefaultValue(DefaultValueType newDefaultValue, NotificationChain msgs) {
-		DefaultValueType oldDefaultValue = defaultValue;
-		defaultValue = newDefaultValue;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.ATTRIBUTE_TYPE__DEFAULT_VALUE, oldDefaultValue, newDefaultValue);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setDefaultValue(DefaultValueType newDefaultValue) {
-		if (newDefaultValue != defaultValue) {
-			NotificationChain msgs = null;
-			if (defaultValue != null)
-				msgs = ((InternalEObject)defaultValue).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.ATTRIBUTE_TYPE__DEFAULT_VALUE, null, msgs);
-			if (newDefaultValue != null)
-				msgs = ((InternalEObject)newDefaultValue).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.ATTRIBUTE_TYPE__DEFAULT_VALUE, null, msgs);
-			msgs = basicSetDefaultValue(newDefaultValue, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.ATTRIBUTE_TYPE__DEFAULT_VALUE, newDefaultValue, newDefaultValue));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public SuggestedValueType getSuggestedValue() {
-		return suggestedValue;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newSuggestedValue 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetSuggestedValue(SuggestedValueType newSuggestedValue, NotificationChain msgs) {
-		SuggestedValueType oldSuggestedValue = suggestedValue;
-		suggestedValue = newSuggestedValue;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.ATTRIBUTE_TYPE__SUGGESTED_VALUE, oldSuggestedValue, newSuggestedValue);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setSuggestedValue(SuggestedValueType newSuggestedValue) {
-		if (newSuggestedValue != suggestedValue) {
-			NotificationChain msgs = null;
-			if (suggestedValue != null)
-				msgs = ((InternalEObject)suggestedValue).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.ATTRIBUTE_TYPE__SUGGESTED_VALUE, null, msgs);
-			if (newSuggestedValue != null)
-				msgs = ((InternalEObject)newSuggestedValue).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.ATTRIBUTE_TYPE__SUGGESTED_VALUE, null, msgs);
-			msgs = basicSetSuggestedValue(newSuggestedValue, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.ATTRIBUTE_TYPE__SUGGESTED_VALUE, newSuggestedValue, newSuggestedValue));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getAttributeExtension() {
-		if (attributeExtension == null) {
-			attributeExtension = new EObjectContainmentEList(AttributeExtensionType.class, this, FacesConfigPackage.ATTRIBUTE_TYPE__ATTRIBUTE_EXTENSION);
-		}
-		return attributeExtension;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.ATTRIBUTE_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case FacesConfigPackage.ATTRIBUTE_TYPE__DESCRIPTION:
-				return ((InternalEList)getDescription()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.ATTRIBUTE_TYPE__DISPLAY_NAME:
-				return ((InternalEList)getDisplayName()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.ATTRIBUTE_TYPE__ICON:
-				return ((InternalEList)getIcon()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.ATTRIBUTE_TYPE__ATTRIBUTE_NAME:
-				return basicSetAttributeName(null, msgs);
-			case FacesConfigPackage.ATTRIBUTE_TYPE__ATTRIBUTE_CLASS:
-				return basicSetAttributeClass(null, msgs);
-			case FacesConfigPackage.ATTRIBUTE_TYPE__DEFAULT_VALUE:
-				return basicSetDefaultValue(null, msgs);
-			case FacesConfigPackage.ATTRIBUTE_TYPE__SUGGESTED_VALUE:
-				return basicSetSuggestedValue(null, msgs);
-			case FacesConfigPackage.ATTRIBUTE_TYPE__ATTRIBUTE_EXTENSION:
-				return ((InternalEList)getAttributeExtension()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.ATTRIBUTE_TYPE__DESCRIPTION:
-				return getDescription();
-			case FacesConfigPackage.ATTRIBUTE_TYPE__DISPLAY_NAME:
-				return getDisplayName();
-			case FacesConfigPackage.ATTRIBUTE_TYPE__ICON:
-				return getIcon();
-			case FacesConfigPackage.ATTRIBUTE_TYPE__ATTRIBUTE_NAME:
-				return getAttributeName();
-			case FacesConfigPackage.ATTRIBUTE_TYPE__ATTRIBUTE_CLASS:
-				return getAttributeClass();
-			case FacesConfigPackage.ATTRIBUTE_TYPE__DEFAULT_VALUE:
-				return getDefaultValue();
-			case FacesConfigPackage.ATTRIBUTE_TYPE__SUGGESTED_VALUE:
-				return getSuggestedValue();
-			case FacesConfigPackage.ATTRIBUTE_TYPE__ATTRIBUTE_EXTENSION:
-				return getAttributeExtension();
-			case FacesConfigPackage.ATTRIBUTE_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.ATTRIBUTE_TYPE__DESCRIPTION:
-				getDescription().clear();
-				getDescription().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.ATTRIBUTE_TYPE__DISPLAY_NAME:
-				getDisplayName().clear();
-				getDisplayName().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.ATTRIBUTE_TYPE__ICON:
-				getIcon().clear();
-				getIcon().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.ATTRIBUTE_TYPE__ATTRIBUTE_NAME:
-				setAttributeName((AttributeNameType)newValue);
-				return;
-			case FacesConfigPackage.ATTRIBUTE_TYPE__ATTRIBUTE_CLASS:
-				setAttributeClass((AttributeClassType)newValue);
-				return;
-			case FacesConfigPackage.ATTRIBUTE_TYPE__DEFAULT_VALUE:
-				setDefaultValue((DefaultValueType)newValue);
-				return;
-			case FacesConfigPackage.ATTRIBUTE_TYPE__SUGGESTED_VALUE:
-				setSuggestedValue((SuggestedValueType)newValue);
-				return;
-			case FacesConfigPackage.ATTRIBUTE_TYPE__ATTRIBUTE_EXTENSION:
-				getAttributeExtension().clear();
-				getAttributeExtension().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.ATTRIBUTE_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.ATTRIBUTE_TYPE__DESCRIPTION:
-				getDescription().clear();
-				return;
-			case FacesConfigPackage.ATTRIBUTE_TYPE__DISPLAY_NAME:
-				getDisplayName().clear();
-				return;
-			case FacesConfigPackage.ATTRIBUTE_TYPE__ICON:
-				getIcon().clear();
-				return;
-			case FacesConfigPackage.ATTRIBUTE_TYPE__ATTRIBUTE_NAME:
-				setAttributeName((AttributeNameType)null);
-				return;
-			case FacesConfigPackage.ATTRIBUTE_TYPE__ATTRIBUTE_CLASS:
-				setAttributeClass((AttributeClassType)null);
-				return;
-			case FacesConfigPackage.ATTRIBUTE_TYPE__DEFAULT_VALUE:
-				setDefaultValue((DefaultValueType)null);
-				return;
-			case FacesConfigPackage.ATTRIBUTE_TYPE__SUGGESTED_VALUE:
-				setSuggestedValue((SuggestedValueType)null);
-				return;
-			case FacesConfigPackage.ATTRIBUTE_TYPE__ATTRIBUTE_EXTENSION:
-				getAttributeExtension().clear();
-				return;
-			case FacesConfigPackage.ATTRIBUTE_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.ATTRIBUTE_TYPE__DESCRIPTION:
-				return description != null && !description.isEmpty();
-			case FacesConfigPackage.ATTRIBUTE_TYPE__DISPLAY_NAME:
-				return displayName != null && !displayName.isEmpty();
-			case FacesConfigPackage.ATTRIBUTE_TYPE__ICON:
-				return icon != null && !icon.isEmpty();
-			case FacesConfigPackage.ATTRIBUTE_TYPE__ATTRIBUTE_NAME:
-				return attributeName != null;
-			case FacesConfigPackage.ATTRIBUTE_TYPE__ATTRIBUTE_CLASS:
-				return attributeClass != null;
-			case FacesConfigPackage.ATTRIBUTE_TYPE__DEFAULT_VALUE:
-				return defaultValue != null;
-			case FacesConfigPackage.ATTRIBUTE_TYPE__SUGGESTED_VALUE:
-				return suggestedValue != null;
-			case FacesConfigPackage.ATTRIBUTE_TYPE__ATTRIBUTE_EXTENSION:
-				return attributeExtension != null && !attributeExtension.isEmpty();
-			case FacesConfigPackage.ATTRIBUTE_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (id: ");//$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //AttributeTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/BaseNameTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/BaseNameTypeImpl.java
deleted file mode 100644
index 91ce976..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/BaseNameTypeImpl.java
+++ /dev/null
@@ -1,224 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.BaseNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Base Name Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.BaseNameTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.BaseNameTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class BaseNameTypeImpl extends EObjectImpl implements BaseNameType {
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-    protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-    protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-    protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-    protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected BaseNameTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.BASE_NAME_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.BASE_NAME_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.BASE_NAME_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.BASE_NAME_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.BASE_NAME_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.BASE_NAME_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.BASE_NAME_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.BASE_NAME_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.BASE_NAME_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.BASE_NAME_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.BASE_NAME_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-    public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: ");//$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: ");//$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //BaseNameTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/BehaviorClassTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/BehaviorClassTypeImpl.java
deleted file mode 100644
index 2909d63..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/BehaviorClassTypeImpl.java
+++ /dev/null
@@ -1,224 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.BehaviorClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Behavior Class Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.BehaviorClassTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.BehaviorClassTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class BehaviorClassTypeImpl extends EObjectImpl implements BehaviorClassType {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected BehaviorClassTypeImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.BEHAVIOR_CLASS_TYPE;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.BEHAVIOR_CLASS_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.BEHAVIOR_CLASS_TYPE__ID, oldId, id));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.BEHAVIOR_CLASS_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.BEHAVIOR_CLASS_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.BEHAVIOR_CLASS_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.BEHAVIOR_CLASS_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.BEHAVIOR_CLASS_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.BEHAVIOR_CLASS_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.BEHAVIOR_CLASS_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.BEHAVIOR_CLASS_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: ");//$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: ");//$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //BehaviorClassTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/BehaviorExtensionTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/BehaviorExtensionTypeImpl.java
deleted file mode 100644
index 902b255..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/BehaviorExtensionTypeImpl.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.jst.jsf.facesconfig.emf.BehaviorExtensionType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Behavior Extension Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * </p>
- *
- * @generated
- */
-public class BehaviorExtensionTypeImpl extends ExtensionTypeImpl implements BehaviorExtensionType {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@SuppressWarnings("hiding")
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected BehaviorExtensionTypeImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.BEHAVIOR_EXTENSION_TYPE;
-	}
-
-} //BehaviorExtensionTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/BehaviorIdTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/BehaviorIdTypeImpl.java
deleted file mode 100644
index 7eae39c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/BehaviorIdTypeImpl.java
+++ /dev/null
@@ -1,224 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.BehaviorIdType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Behavior Id Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.BehaviorIdTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.BehaviorIdTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class BehaviorIdTypeImpl extends EObjectImpl implements BehaviorIdType {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected BehaviorIdTypeImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.BEHAVIOR_ID_TYPE;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.BEHAVIOR_ID_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.BEHAVIOR_ID_TYPE__ID, oldId, id));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.BEHAVIOR_ID_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.BEHAVIOR_ID_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.BEHAVIOR_ID_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.BEHAVIOR_ID_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.BEHAVIOR_ID_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.BEHAVIOR_ID_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.BEHAVIOR_ID_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.BEHAVIOR_ID_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: ");//$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: ");//$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //BehaviorIdTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/BehaviorTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/BehaviorTypeImpl.java
deleted file mode 100644
index f37d470..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/BehaviorTypeImpl.java
+++ /dev/null
@@ -1,483 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.facesconfig.emf.AttributeType;
-import org.eclipse.jst.jsf.facesconfig.emf.BehaviorClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.BehaviorExtensionType;
-import org.eclipse.jst.jsf.facesconfig.emf.BehaviorIdType;
-import org.eclipse.jst.jsf.facesconfig.emf.BehaviorType;
-import org.eclipse.jst.jsf.facesconfig.emf.DescriptionType;
-import org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.IconType;
-import org.eclipse.jst.jsf.facesconfig.emf.PropertyType;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Behavior Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.BehaviorTypeImpl#getDescription <em>Description</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.BehaviorTypeImpl#getDisplayName <em>Display Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.BehaviorTypeImpl#getIcon <em>Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.BehaviorTypeImpl#getBehaviorId <em>Behavior Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.BehaviorTypeImpl#getBehaviorClass <em>Behavior Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.BehaviorTypeImpl#getAttribute <em>Attribute</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.BehaviorTypeImpl#getProperty <em>Property</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.BehaviorTypeImpl#getBehaviorExtension <em>Behavior Extension</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class BehaviorTypeImpl extends EObjectImpl implements BehaviorType {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * The cached value of the '{@link #getDescription() <em>Description</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDescription()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList description;
-
-	/**
-	 * The cached value of the '{@link #getDisplayName() <em>Display Name</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDisplayName()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList displayName;
-
-	/**
-	 * The cached value of the '{@link #getIcon() <em>Icon</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getIcon()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList icon;
-
-	/**
-	 * The cached value of the '{@link #getBehaviorId() <em>Behavior Id</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getBehaviorId()
-	 * @generated
-	 * @ordered
-	 */
-	protected BehaviorIdType behaviorId;
-
-	/**
-	 * The cached value of the '{@link #getBehaviorClass() <em>Behavior Class</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getBehaviorClass()
-	 * @generated
-	 * @ordered
-	 */
-	protected BehaviorClassType behaviorClass;
-
-	/**
-	 * The cached value of the '{@link #getAttribute() <em>Attribute</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getAttribute()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList attribute;
-
-	/**
-	 * The cached value of the '{@link #getProperty() <em>Property</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getProperty()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList property;
-
-	/**
-	 * The cached value of the '{@link #getBehaviorExtension() <em>Behavior Extension</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getBehaviorExtension()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList behaviorExtension;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected BehaviorTypeImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.BEHAVIOR_TYPE;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getDescription() {
-		if (description == null) {
-			description = new EObjectContainmentEList(DescriptionType.class, this, FacesConfigPackage.BEHAVIOR_TYPE__DESCRIPTION);
-		}
-		return description;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getDisplayName() {
-		if (displayName == null) {
-			displayName = new EObjectContainmentEList(DisplayNameType.class, this, FacesConfigPackage.BEHAVIOR_TYPE__DISPLAY_NAME);
-		}
-		return displayName;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getIcon() {
-		if (icon == null) {
-			icon = new EObjectContainmentEList(IconType.class, this, FacesConfigPackage.BEHAVIOR_TYPE__ICON);
-		}
-		return icon;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BehaviorIdType getBehaviorId() {
-		return behaviorId;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param newBehaviorId 
-	 * @param msgs 
-	 * @return NotificationChain
-	 * @generated NOT
-	 */
-	public NotificationChain basicSetBehaviorId(BehaviorIdType newBehaviorId, NotificationChain msgs) {
-		BehaviorIdType oldBehaviorId = behaviorId;
-		behaviorId = newBehaviorId;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.BEHAVIOR_TYPE__BEHAVIOR_ID, oldBehaviorId, newBehaviorId);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setBehaviorId(BehaviorIdType newBehaviorId) {
-		if (newBehaviorId != behaviorId) {
-			NotificationChain msgs = null;
-			if (behaviorId != null)
-				msgs = ((InternalEObject)behaviorId).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.BEHAVIOR_TYPE__BEHAVIOR_ID, null, msgs);
-			if (newBehaviorId != null)
-				msgs = ((InternalEObject)newBehaviorId).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.BEHAVIOR_TYPE__BEHAVIOR_ID, null, msgs);
-			msgs = basicSetBehaviorId(newBehaviorId, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.BEHAVIOR_TYPE__BEHAVIOR_ID, newBehaviorId, newBehaviorId));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BehaviorClassType getBehaviorClass() {
-		return behaviorClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param newBehaviorClass 
-	 * @param msgs 
-	 * @return NotificationChain
-	 * @generated NOT
-	 */
-	public NotificationChain basicSetBehaviorClass(BehaviorClassType newBehaviorClass, NotificationChain msgs) {
-		BehaviorClassType oldBehaviorClass = behaviorClass;
-		behaviorClass = newBehaviorClass;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.BEHAVIOR_TYPE__BEHAVIOR_CLASS, oldBehaviorClass, newBehaviorClass);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setBehaviorClass(BehaviorClassType newBehaviorClass) {
-		if (newBehaviorClass != behaviorClass) {
-			NotificationChain msgs = null;
-			if (behaviorClass != null)
-				msgs = ((InternalEObject)behaviorClass).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.BEHAVIOR_TYPE__BEHAVIOR_CLASS, null, msgs);
-			if (newBehaviorClass != null)
-				msgs = ((InternalEObject)newBehaviorClass).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.BEHAVIOR_TYPE__BEHAVIOR_CLASS, null, msgs);
-			msgs = basicSetBehaviorClass(newBehaviorClass, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.BEHAVIOR_TYPE__BEHAVIOR_CLASS, newBehaviorClass, newBehaviorClass));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getAttribute() {
-		if (attribute == null) {
-			attribute = new EObjectContainmentEList(AttributeType.class, this, FacesConfigPackage.BEHAVIOR_TYPE__ATTRIBUTE);
-		}
-		return attribute;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getProperty() {
-		if (property == null) {
-			property = new EObjectContainmentEList(PropertyType.class, this, FacesConfigPackage.BEHAVIOR_TYPE__PROPERTY);
-		}
-		return property;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getBehaviorExtension() {
-		if (behaviorExtension == null) {
-			behaviorExtension = new EObjectContainmentEList(BehaviorExtensionType.class, this, FacesConfigPackage.BEHAVIOR_TYPE__BEHAVIOR_EXTENSION);
-		}
-		return behaviorExtension;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case FacesConfigPackage.BEHAVIOR_TYPE__DESCRIPTION:
-				return ((InternalEList)getDescription()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.BEHAVIOR_TYPE__DISPLAY_NAME:
-				return ((InternalEList)getDisplayName()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.BEHAVIOR_TYPE__ICON:
-				return ((InternalEList)getIcon()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.BEHAVIOR_TYPE__BEHAVIOR_ID:
-				return basicSetBehaviorId(null, msgs);
-			case FacesConfigPackage.BEHAVIOR_TYPE__BEHAVIOR_CLASS:
-				return basicSetBehaviorClass(null, msgs);
-			case FacesConfigPackage.BEHAVIOR_TYPE__ATTRIBUTE:
-				return ((InternalEList)getAttribute()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.BEHAVIOR_TYPE__PROPERTY:
-				return ((InternalEList)getProperty()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.BEHAVIOR_TYPE__BEHAVIOR_EXTENSION:
-				return ((InternalEList)getBehaviorExtension()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.BEHAVIOR_TYPE__DESCRIPTION:
-				return getDescription();
-			case FacesConfigPackage.BEHAVIOR_TYPE__DISPLAY_NAME:
-				return getDisplayName();
-			case FacesConfigPackage.BEHAVIOR_TYPE__ICON:
-				return getIcon();
-			case FacesConfigPackage.BEHAVIOR_TYPE__BEHAVIOR_ID:
-				return getBehaviorId();
-			case FacesConfigPackage.BEHAVIOR_TYPE__BEHAVIOR_CLASS:
-				return getBehaviorClass();
-			case FacesConfigPackage.BEHAVIOR_TYPE__ATTRIBUTE:
-				return getAttribute();
-			case FacesConfigPackage.BEHAVIOR_TYPE__PROPERTY:
-				return getProperty();
-			case FacesConfigPackage.BEHAVIOR_TYPE__BEHAVIOR_EXTENSION:
-				return getBehaviorExtension();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.BEHAVIOR_TYPE__DESCRIPTION:
-				getDescription().clear();
-				getDescription().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.BEHAVIOR_TYPE__DISPLAY_NAME:
-				getDisplayName().clear();
-				getDisplayName().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.BEHAVIOR_TYPE__ICON:
-				getIcon().clear();
-				getIcon().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.BEHAVIOR_TYPE__BEHAVIOR_ID:
-				setBehaviorId((BehaviorIdType)newValue);
-				return;
-			case FacesConfigPackage.BEHAVIOR_TYPE__BEHAVIOR_CLASS:
-				setBehaviorClass((BehaviorClassType)newValue);
-				return;
-			case FacesConfigPackage.BEHAVIOR_TYPE__ATTRIBUTE:
-				getAttribute().clear();
-				getAttribute().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.BEHAVIOR_TYPE__PROPERTY:
-				getProperty().clear();
-				getProperty().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.BEHAVIOR_TYPE__BEHAVIOR_EXTENSION:
-				getBehaviorExtension().clear();
-				getBehaviorExtension().addAll((Collection)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.BEHAVIOR_TYPE__DESCRIPTION:
-				getDescription().clear();
-				return;
-			case FacesConfigPackage.BEHAVIOR_TYPE__DISPLAY_NAME:
-				getDisplayName().clear();
-				return;
-			case FacesConfigPackage.BEHAVIOR_TYPE__ICON:
-				getIcon().clear();
-				return;
-			case FacesConfigPackage.BEHAVIOR_TYPE__BEHAVIOR_ID:
-				setBehaviorId((BehaviorIdType)null);
-				return;
-			case FacesConfigPackage.BEHAVIOR_TYPE__BEHAVIOR_CLASS:
-				setBehaviorClass((BehaviorClassType)null);
-				return;
-			case FacesConfigPackage.BEHAVIOR_TYPE__ATTRIBUTE:
-				getAttribute().clear();
-				return;
-			case FacesConfigPackage.BEHAVIOR_TYPE__PROPERTY:
-				getProperty().clear();
-				return;
-			case FacesConfigPackage.BEHAVIOR_TYPE__BEHAVIOR_EXTENSION:
-				getBehaviorExtension().clear();
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.BEHAVIOR_TYPE__DESCRIPTION:
-				return description != null && !description.isEmpty();
-			case FacesConfigPackage.BEHAVIOR_TYPE__DISPLAY_NAME:
-				return displayName != null && !displayName.isEmpty();
-			case FacesConfigPackage.BEHAVIOR_TYPE__ICON:
-				return icon != null && !icon.isEmpty();
-			case FacesConfigPackage.BEHAVIOR_TYPE__BEHAVIOR_ID:
-				return behaviorId != null;
-			case FacesConfigPackage.BEHAVIOR_TYPE__BEHAVIOR_CLASS:
-				return behaviorClass != null;
-			case FacesConfigPackage.BEHAVIOR_TYPE__ATTRIBUTE:
-				return attribute != null && !attribute.isEmpty();
-			case FacesConfigPackage.BEHAVIOR_TYPE__PROPERTY:
-				return property != null && !property.isEmpty();
-			case FacesConfigPackage.BEHAVIOR_TYPE__BEHAVIOR_EXTENSION:
-				return behaviorExtension != null && !behaviorExtension.isEmpty();
-		}
-		return super.eIsSet(featureID);
-	}
-
-} //BehaviorTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ClientBehaviorRendererClassTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ClientBehaviorRendererClassTypeImpl.java
deleted file mode 100644
index 1190621..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ClientBehaviorRendererClassTypeImpl.java
+++ /dev/null
@@ -1,224 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Client Behavior Renderer Class Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ClientBehaviorRendererClassTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ClientBehaviorRendererClassTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ClientBehaviorRendererClassTypeImpl extends EObjectImpl implements ClientBehaviorRendererClassType {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ClientBehaviorRendererClassTypeImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.CLIENT_BEHAVIOR_RENDERER_CLASS_TYPE;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.CLIENT_BEHAVIOR_RENDERER_CLASS_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.CLIENT_BEHAVIOR_RENDERER_CLASS_TYPE__ID, oldId, id));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.CLIENT_BEHAVIOR_RENDERER_CLASS_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.CLIENT_BEHAVIOR_RENDERER_CLASS_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.CLIENT_BEHAVIOR_RENDERER_CLASS_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.CLIENT_BEHAVIOR_RENDERER_CLASS_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.CLIENT_BEHAVIOR_RENDERER_CLASS_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.CLIENT_BEHAVIOR_RENDERER_CLASS_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.CLIENT_BEHAVIOR_RENDERER_CLASS_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.CLIENT_BEHAVIOR_RENDERER_CLASS_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: ");//$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: ");//$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ClientBehaviorRendererClassTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ClientBehaviorRendererTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ClientBehaviorRendererTypeImpl.java
deleted file mode 100644
index 96921d7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ClientBehaviorRendererTypeImpl.java
+++ /dev/null
@@ -1,258 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererType;
-import org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererTypeType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Client Behavior Renderer Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ClientBehaviorRendererTypeImpl#getClientBehaviorRendererType <em>Client Behavior Renderer Type</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ClientBehaviorRendererTypeImpl#getClientBehaviorRendererClass <em>Client Behavior Renderer Class</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ClientBehaviorRendererTypeImpl extends EObjectImpl implements ClientBehaviorRendererType {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * The cached value of the '{@link #getClientBehaviorRendererType() <em>Client Behavior Renderer Type</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getClientBehaviorRendererType()
-	 * @generated
-	 * @ordered
-	 */
-	protected ClientBehaviorRendererTypeType clientBehaviorRendererType;
-
-	/**
-	 * The cached value of the '{@link #getClientBehaviorRendererClass() <em>Client Behavior Renderer Class</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getClientBehaviorRendererClass()
-	 * @generated
-	 * @ordered
-	 */
-	protected ClientBehaviorRendererClassType clientBehaviorRendererClass;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ClientBehaviorRendererTypeImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.CLIENT_BEHAVIOR_RENDERER_TYPE;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ClientBehaviorRendererTypeType getClientBehaviorRendererType() {
-		return clientBehaviorRendererType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * 
-	 * @param newClientBehaviorRendererType 
-	 * @param msgs 
-	 * @return NotificationChain
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetClientBehaviorRendererType(ClientBehaviorRendererTypeType newClientBehaviorRendererType, NotificationChain msgs) {
-		ClientBehaviorRendererTypeType oldClientBehaviorRendererType = clientBehaviorRendererType;
-		clientBehaviorRendererType = newClientBehaviorRendererType;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.CLIENT_BEHAVIOR_RENDERER_TYPE__CLIENT_BEHAVIOR_RENDERER_TYPE, oldClientBehaviorRendererType, newClientBehaviorRendererType);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setClientBehaviorRendererType(ClientBehaviorRendererTypeType newClientBehaviorRendererType) {
-		if (newClientBehaviorRendererType != clientBehaviorRendererType) {
-			NotificationChain msgs = null;
-			if (clientBehaviorRendererType != null)
-				msgs = ((InternalEObject)clientBehaviorRendererType).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.CLIENT_BEHAVIOR_RENDERER_TYPE__CLIENT_BEHAVIOR_RENDERER_TYPE, null, msgs);
-			if (newClientBehaviorRendererType != null)
-				msgs = ((InternalEObject)newClientBehaviorRendererType).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.CLIENT_BEHAVIOR_RENDERER_TYPE__CLIENT_BEHAVIOR_RENDERER_TYPE, null, msgs);
-			msgs = basicSetClientBehaviorRendererType(newClientBehaviorRendererType, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.CLIENT_BEHAVIOR_RENDERER_TYPE__CLIENT_BEHAVIOR_RENDERER_TYPE, newClientBehaviorRendererType, newClientBehaviorRendererType));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ClientBehaviorRendererClassType getClientBehaviorRendererClass() {
-		return clientBehaviorRendererClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * 
-	 * @param newClientBehaviorRendererClass 
-	 * @param msgs 
-	 * @return NotificationChain
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetClientBehaviorRendererClass(ClientBehaviorRendererClassType newClientBehaviorRendererClass, NotificationChain msgs) {
-		ClientBehaviorRendererClassType oldClientBehaviorRendererClass = clientBehaviorRendererClass;
-		clientBehaviorRendererClass = newClientBehaviorRendererClass;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.CLIENT_BEHAVIOR_RENDERER_TYPE__CLIENT_BEHAVIOR_RENDERER_CLASS, oldClientBehaviorRendererClass, newClientBehaviorRendererClass);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setClientBehaviorRendererClass(ClientBehaviorRendererClassType newClientBehaviorRendererClass) {
-		if (newClientBehaviorRendererClass != clientBehaviorRendererClass) {
-			NotificationChain msgs = null;
-			if (clientBehaviorRendererClass != null)
-				msgs = ((InternalEObject)clientBehaviorRendererClass).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.CLIENT_BEHAVIOR_RENDERER_TYPE__CLIENT_BEHAVIOR_RENDERER_CLASS, null, msgs);
-			if (newClientBehaviorRendererClass != null)
-				msgs = ((InternalEObject)newClientBehaviorRendererClass).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.CLIENT_BEHAVIOR_RENDERER_TYPE__CLIENT_BEHAVIOR_RENDERER_CLASS, null, msgs);
-			msgs = basicSetClientBehaviorRendererClass(newClientBehaviorRendererClass, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.CLIENT_BEHAVIOR_RENDERER_TYPE__CLIENT_BEHAVIOR_RENDERER_CLASS, newClientBehaviorRendererClass, newClientBehaviorRendererClass));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case FacesConfigPackage.CLIENT_BEHAVIOR_RENDERER_TYPE__CLIENT_BEHAVIOR_RENDERER_TYPE:
-				return basicSetClientBehaviorRendererType(null, msgs);
-			case FacesConfigPackage.CLIENT_BEHAVIOR_RENDERER_TYPE__CLIENT_BEHAVIOR_RENDERER_CLASS:
-				return basicSetClientBehaviorRendererClass(null, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.CLIENT_BEHAVIOR_RENDERER_TYPE__CLIENT_BEHAVIOR_RENDERER_TYPE:
-				return getClientBehaviorRendererType();
-			case FacesConfigPackage.CLIENT_BEHAVIOR_RENDERER_TYPE__CLIENT_BEHAVIOR_RENDERER_CLASS:
-				return getClientBehaviorRendererClass();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.CLIENT_BEHAVIOR_RENDERER_TYPE__CLIENT_BEHAVIOR_RENDERER_TYPE:
-				setClientBehaviorRendererType((ClientBehaviorRendererTypeType)newValue);
-				return;
-			case FacesConfigPackage.CLIENT_BEHAVIOR_RENDERER_TYPE__CLIENT_BEHAVIOR_RENDERER_CLASS:
-				setClientBehaviorRendererClass((ClientBehaviorRendererClassType)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.CLIENT_BEHAVIOR_RENDERER_TYPE__CLIENT_BEHAVIOR_RENDERER_TYPE:
-				setClientBehaviorRendererType((ClientBehaviorRendererTypeType)null);
-				return;
-			case FacesConfigPackage.CLIENT_BEHAVIOR_RENDERER_TYPE__CLIENT_BEHAVIOR_RENDERER_CLASS:
-				setClientBehaviorRendererClass((ClientBehaviorRendererClassType)null);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.CLIENT_BEHAVIOR_RENDERER_TYPE__CLIENT_BEHAVIOR_RENDERER_TYPE:
-				return clientBehaviorRendererType != null;
-			case FacesConfigPackage.CLIENT_BEHAVIOR_RENDERER_TYPE__CLIENT_BEHAVIOR_RENDERER_CLASS:
-				return clientBehaviorRendererClass != null;
-		}
-		return super.eIsSet(featureID);
-	}
-
-} //ClientBehaviorRendererTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ClientBehaviorRendererTypeTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ClientBehaviorRendererTypeTypeImpl.java
deleted file mode 100644
index 5ee57a7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ClientBehaviorRendererTypeTypeImpl.java
+++ /dev/null
@@ -1,224 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererTypeType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Client Behavior Renderer Type Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ClientBehaviorRendererTypeTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ClientBehaviorRendererTypeTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ClientBehaviorRendererTypeTypeImpl extends EObjectImpl implements ClientBehaviorRendererTypeType {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ClientBehaviorRendererTypeTypeImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.CLIENT_BEHAVIOR_RENDERER_TYPE_TYPE;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.CLIENT_BEHAVIOR_RENDERER_TYPE_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.CLIENT_BEHAVIOR_RENDERER_TYPE_TYPE__ID, oldId, id));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.CLIENT_BEHAVIOR_RENDERER_TYPE_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.CLIENT_BEHAVIOR_RENDERER_TYPE_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.CLIENT_BEHAVIOR_RENDERER_TYPE_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.CLIENT_BEHAVIOR_RENDERER_TYPE_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.CLIENT_BEHAVIOR_RENDERER_TYPE_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.CLIENT_BEHAVIOR_RENDERER_TYPE_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.CLIENT_BEHAVIOR_RENDERER_TYPE_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.CLIENT_BEHAVIOR_RENDERER_TYPE_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: ");//$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: ");//$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ClientBehaviorRendererTypeTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ComponentClassTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ComponentClassTypeImpl.java
deleted file mode 100644
index 54b1f1a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ComponentClassTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.ComponentClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Component Class Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentClassTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentClassTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ComponentClassTypeImpl extends EObjectImpl implements ComponentClassType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ComponentClassTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.COMPONENT_CLASS_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.COMPONENT_CLASS_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.COMPONENT_CLASS_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.COMPONENT_CLASS_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.COMPONENT_CLASS_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.COMPONENT_CLASS_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.COMPONENT_CLASS_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.COMPONENT_CLASS_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.COMPONENT_CLASS_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.COMPONENT_CLASS_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.COMPONENT_CLASS_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: ");//$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: ");//$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ComponentClassTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ComponentExtensionTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ComponentExtensionTypeImpl.java
deleted file mode 100644
index f55a19d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ComponentExtensionTypeImpl.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.jst.jsf.facesconfig.emf.ComponentExtensionType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Component Extension Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * </p>
- *
- * @generated
- */
-public class ComponentExtensionTypeImpl extends ExtensionTypeImpl implements ComponentExtensionType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@SuppressWarnings("hiding")
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ComponentExtensionTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.COMPONENT_EXTENSION_TYPE;
-	}
-
-} //ComponentExtensionTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ComponentFamilyTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ComponentFamilyTypeImpl.java
deleted file mode 100644
index 7f3bdb1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ComponentFamilyTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.ComponentFamilyType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Component Family Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentFamilyTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentFamilyTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ComponentFamilyTypeImpl extends EObjectImpl implements ComponentFamilyType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ComponentFamilyTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.COMPONENT_FAMILY_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.COMPONENT_FAMILY_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.COMPONENT_FAMILY_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.COMPONENT_FAMILY_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.COMPONENT_FAMILY_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.COMPONENT_FAMILY_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.COMPONENT_FAMILY_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.COMPONENT_FAMILY_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.COMPONENT_FAMILY_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.COMPONENT_FAMILY_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.COMPONENT_FAMILY_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: ");//$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: ");//$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ComponentFamilyTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ComponentTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ComponentTypeImpl.java
deleted file mode 100644
index 304ebe4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ComponentTypeImpl.java
+++ /dev/null
@@ -1,588 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.facesconfig.emf.AttributeType;
-import org.eclipse.jst.jsf.facesconfig.emf.ComponentClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.ComponentExtensionType;
-import org.eclipse.jst.jsf.facesconfig.emf.ComponentType;
-import org.eclipse.jst.jsf.facesconfig.emf.ComponentTypeType;
-import org.eclipse.jst.jsf.facesconfig.emf.DescriptionType;
-import org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.FacetType;
-import org.eclipse.jst.jsf.facesconfig.emf.IconType;
-import org.eclipse.jst.jsf.facesconfig.emf.PropertyType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Component Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentTypeImpl#getDescription <em>Description</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentTypeImpl#getDisplayName <em>Display Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentTypeImpl#getIcon <em>Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentTypeImpl#getComponentType <em>Component Type</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentTypeImpl#getComponentClass <em>Component Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentTypeImpl#getFacet <em>Facet</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentTypeImpl#getAttribute <em>Attribute</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentTypeImpl#getProperty <em>Property</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentTypeImpl#getComponentExtension <em>Component Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ComponentTypeImpl extends EObjectImpl implements ComponentType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The cached value of the '{@link #getDescription() <em>Description</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDescription()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList description;
-
-    /**
-	 * The cached value of the '{@link #getDisplayName() <em>Display Name</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDisplayName()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList displayName;
-
-    /**
-	 * The cached value of the '{@link #getIcon() <em>Icon</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getIcon()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList icon;
-
-    /**
-	 * The cached value of the '{@link #getComponentType() <em>Component Type</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getComponentType()
-	 * @generated
-	 * @ordered
-	 */
-	protected ComponentTypeType componentType;
-
-    /**
-	 * The cached value of the '{@link #getComponentClass() <em>Component Class</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getComponentClass()
-	 * @generated
-	 * @ordered
-	 */
-	protected ComponentClassType componentClass;
-
-    /**
-	 * The cached value of the '{@link #getFacet() <em>Facet</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getFacet()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList facet;
-
-    /**
-	 * The cached value of the '{@link #getAttribute() <em>Attribute</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getAttribute()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList attribute;
-
-    /**
-	 * The cached value of the '{@link #getProperty() <em>Property</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getProperty()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList property;
-
-    /**
-	 * The cached value of the '{@link #getComponentExtension() <em>Component Extension</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getComponentExtension()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList componentExtension;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ComponentTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.COMPONENT_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getDescription() {
-		if (description == null) {
-			description = new EObjectContainmentEList(DescriptionType.class, this, FacesConfigPackage.COMPONENT_TYPE__DESCRIPTION);
-		}
-		return description;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getDisplayName() {
-		if (displayName == null) {
-			displayName = new EObjectContainmentEList(DisplayNameType.class, this, FacesConfigPackage.COMPONENT_TYPE__DISPLAY_NAME);
-		}
-		return displayName;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getIcon() {
-		if (icon == null) {
-			icon = new EObjectContainmentEList(IconType.class, this, FacesConfigPackage.COMPONENT_TYPE__ICON);
-		}
-		return icon;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ComponentTypeType getComponentType() {
-		return componentType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newComponentType 
-     * @param msgs 
-     * @return the notification chain
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetComponentType(ComponentTypeType newComponentType, NotificationChain msgs) {
-		ComponentTypeType oldComponentType = componentType;
-		componentType = newComponentType;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.COMPONENT_TYPE__COMPONENT_TYPE, oldComponentType, newComponentType);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setComponentType(ComponentTypeType newComponentType) {
-		if (newComponentType != componentType) {
-			NotificationChain msgs = null;
-			if (componentType != null)
-				msgs = ((InternalEObject)componentType).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.COMPONENT_TYPE__COMPONENT_TYPE, null, msgs);
-			if (newComponentType != null)
-				msgs = ((InternalEObject)newComponentType).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.COMPONENT_TYPE__COMPONENT_TYPE, null, msgs);
-			msgs = basicSetComponentType(newComponentType, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.COMPONENT_TYPE__COMPONENT_TYPE, newComponentType, newComponentType));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ComponentClassType getComponentClass() {
-		return componentClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newComponentClass 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetComponentClass(ComponentClassType newComponentClass, NotificationChain msgs) {
-		ComponentClassType oldComponentClass = componentClass;
-		componentClass = newComponentClass;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.COMPONENT_TYPE__COMPONENT_CLASS, oldComponentClass, newComponentClass);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setComponentClass(ComponentClassType newComponentClass) {
-		if (newComponentClass != componentClass) {
-			NotificationChain msgs = null;
-			if (componentClass != null)
-				msgs = ((InternalEObject)componentClass).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.COMPONENT_TYPE__COMPONENT_CLASS, null, msgs);
-			if (newComponentClass != null)
-				msgs = ((InternalEObject)newComponentClass).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.COMPONENT_TYPE__COMPONENT_CLASS, null, msgs);
-			msgs = basicSetComponentClass(newComponentClass, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.COMPONENT_TYPE__COMPONENT_CLASS, newComponentClass, newComponentClass));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getFacet() {
-		if (facet == null) {
-			facet = new EObjectContainmentEList(FacetType.class, this, FacesConfigPackage.COMPONENT_TYPE__FACET);
-		}
-		return facet;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getAttribute() {
-		if (attribute == null) {
-			attribute = new EObjectContainmentEList(AttributeType.class, this, FacesConfigPackage.COMPONENT_TYPE__ATTRIBUTE);
-		}
-		return attribute;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getProperty() {
-		if (property == null) {
-			property = new EObjectContainmentEList(PropertyType.class, this, FacesConfigPackage.COMPONENT_TYPE__PROPERTY);
-		}
-		return property;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getComponentExtension() {
-		if (componentExtension == null) {
-			componentExtension = new EObjectContainmentEList(ComponentExtensionType.class, this, FacesConfigPackage.COMPONENT_TYPE__COMPONENT_EXTENSION);
-		}
-		return componentExtension;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.COMPONENT_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case FacesConfigPackage.COMPONENT_TYPE__DESCRIPTION:
-				return ((InternalEList)getDescription()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.COMPONENT_TYPE__DISPLAY_NAME:
-				return ((InternalEList)getDisplayName()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.COMPONENT_TYPE__ICON:
-				return ((InternalEList)getIcon()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.COMPONENT_TYPE__COMPONENT_TYPE:
-				return basicSetComponentType(null, msgs);
-			case FacesConfigPackage.COMPONENT_TYPE__COMPONENT_CLASS:
-				return basicSetComponentClass(null, msgs);
-			case FacesConfigPackage.COMPONENT_TYPE__FACET:
-				return ((InternalEList)getFacet()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.COMPONENT_TYPE__ATTRIBUTE:
-				return ((InternalEList)getAttribute()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.COMPONENT_TYPE__PROPERTY:
-				return ((InternalEList)getProperty()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.COMPONENT_TYPE__COMPONENT_EXTENSION:
-				return ((InternalEList)getComponentExtension()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.COMPONENT_TYPE__DESCRIPTION:
-				return getDescription();
-			case FacesConfigPackage.COMPONENT_TYPE__DISPLAY_NAME:
-				return getDisplayName();
-			case FacesConfigPackage.COMPONENT_TYPE__ICON:
-				return getIcon();
-			case FacesConfigPackage.COMPONENT_TYPE__COMPONENT_TYPE:
-				return getComponentType();
-			case FacesConfigPackage.COMPONENT_TYPE__COMPONENT_CLASS:
-				return getComponentClass();
-			case FacesConfigPackage.COMPONENT_TYPE__FACET:
-				return getFacet();
-			case FacesConfigPackage.COMPONENT_TYPE__ATTRIBUTE:
-				return getAttribute();
-			case FacesConfigPackage.COMPONENT_TYPE__PROPERTY:
-				return getProperty();
-			case FacesConfigPackage.COMPONENT_TYPE__COMPONENT_EXTENSION:
-				return getComponentExtension();
-			case FacesConfigPackage.COMPONENT_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.COMPONENT_TYPE__DESCRIPTION:
-				getDescription().clear();
-				getDescription().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.COMPONENT_TYPE__DISPLAY_NAME:
-				getDisplayName().clear();
-				getDisplayName().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.COMPONENT_TYPE__ICON:
-				getIcon().clear();
-				getIcon().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.COMPONENT_TYPE__COMPONENT_TYPE:
-				setComponentType((ComponentTypeType)newValue);
-				return;
-			case FacesConfigPackage.COMPONENT_TYPE__COMPONENT_CLASS:
-				setComponentClass((ComponentClassType)newValue);
-				return;
-			case FacesConfigPackage.COMPONENT_TYPE__FACET:
-				getFacet().clear();
-				getFacet().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.COMPONENT_TYPE__ATTRIBUTE:
-				getAttribute().clear();
-				getAttribute().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.COMPONENT_TYPE__PROPERTY:
-				getProperty().clear();
-				getProperty().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.COMPONENT_TYPE__COMPONENT_EXTENSION:
-				getComponentExtension().clear();
-				getComponentExtension().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.COMPONENT_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.COMPONENT_TYPE__DESCRIPTION:
-				getDescription().clear();
-				return;
-			case FacesConfigPackage.COMPONENT_TYPE__DISPLAY_NAME:
-				getDisplayName().clear();
-				return;
-			case FacesConfigPackage.COMPONENT_TYPE__ICON:
-				getIcon().clear();
-				return;
-			case FacesConfigPackage.COMPONENT_TYPE__COMPONENT_TYPE:
-				setComponentType((ComponentTypeType)null);
-				return;
-			case FacesConfigPackage.COMPONENT_TYPE__COMPONENT_CLASS:
-				setComponentClass((ComponentClassType)null);
-				return;
-			case FacesConfigPackage.COMPONENT_TYPE__FACET:
-				getFacet().clear();
-				return;
-			case FacesConfigPackage.COMPONENT_TYPE__ATTRIBUTE:
-				getAttribute().clear();
-				return;
-			case FacesConfigPackage.COMPONENT_TYPE__PROPERTY:
-				getProperty().clear();
-				return;
-			case FacesConfigPackage.COMPONENT_TYPE__COMPONENT_EXTENSION:
-				getComponentExtension().clear();
-				return;
-			case FacesConfigPackage.COMPONENT_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.COMPONENT_TYPE__DESCRIPTION:
-				return description != null && !description.isEmpty();
-			case FacesConfigPackage.COMPONENT_TYPE__DISPLAY_NAME:
-				return displayName != null && !displayName.isEmpty();
-			case FacesConfigPackage.COMPONENT_TYPE__ICON:
-				return icon != null && !icon.isEmpty();
-			case FacesConfigPackage.COMPONENT_TYPE__COMPONENT_TYPE:
-				return componentType != null;
-			case FacesConfigPackage.COMPONENT_TYPE__COMPONENT_CLASS:
-				return componentClass != null;
-			case FacesConfigPackage.COMPONENT_TYPE__FACET:
-				return facet != null && !facet.isEmpty();
-			case FacesConfigPackage.COMPONENT_TYPE__ATTRIBUTE:
-				return attribute != null && !attribute.isEmpty();
-			case FacesConfigPackage.COMPONENT_TYPE__PROPERTY:
-				return property != null && !property.isEmpty();
-			case FacesConfigPackage.COMPONENT_TYPE__COMPONENT_EXTENSION:
-				return componentExtension != null && !componentExtension.isEmpty();
-			case FacesConfigPackage.COMPONENT_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ComponentTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ComponentTypeTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ComponentTypeTypeImpl.java
deleted file mode 100644
index 56bfb41..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ComponentTypeTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.ComponentTypeType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Component Type Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentTypeTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentTypeTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ComponentTypeTypeImpl extends EObjectImpl implements ComponentTypeType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ComponentTypeTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.COMPONENT_TYPE_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.COMPONENT_TYPE_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.COMPONENT_TYPE_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.COMPONENT_TYPE_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.COMPONENT_TYPE_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.COMPONENT_TYPE_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.COMPONENT_TYPE_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.COMPONENT_TYPE_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.COMPONENT_TYPE_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.COMPONENT_TYPE_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.COMPONENT_TYPE_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: ");//$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: ");//$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ComponentTypeTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ConverterClassTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ConverterClassTypeImpl.java
deleted file mode 100644
index f57f9f8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ConverterClassTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.ConverterClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Converter Class Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterClassTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterClassTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ConverterClassTypeImpl extends EObjectImpl implements ConverterClassType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ConverterClassTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.CONVERTER_CLASS_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.CONVERTER_CLASS_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.CONVERTER_CLASS_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.CONVERTER_CLASS_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.CONVERTER_CLASS_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.CONVERTER_CLASS_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.CONVERTER_CLASS_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.CONVERTER_CLASS_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.CONVERTER_CLASS_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.CONVERTER_CLASS_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.CONVERTER_CLASS_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: ");//$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: ");//$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ConverterClassTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ConverterExtensionTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ConverterExtensionTypeImpl.java
deleted file mode 100644
index 3b8b38d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ConverterExtensionTypeImpl.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.jst.jsf.facesconfig.emf.ConverterExtensionType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Converter Extension Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * </p>
- *
- * @generated
- */
-public class ConverterExtensionTypeImpl extends ExtensionTypeImpl implements ConverterExtensionType {
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    @SuppressWarnings("hiding")
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected ConverterExtensionTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.CONVERTER_EXTENSION_TYPE;
-	}
-
-} //ConverterExtensionTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ConverterForClassTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ConverterForClassTypeImpl.java
deleted file mode 100644
index 659359c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ConverterForClassTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.ConverterForClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Converter For Class Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterForClassTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterForClassTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ConverterForClassTypeImpl extends EObjectImpl implements ConverterForClassType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ConverterForClassTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.CONVERTER_FOR_CLASS_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.CONVERTER_FOR_CLASS_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.CONVERTER_FOR_CLASS_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.CONVERTER_FOR_CLASS_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.CONVERTER_FOR_CLASS_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.CONVERTER_FOR_CLASS_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.CONVERTER_FOR_CLASS_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.CONVERTER_FOR_CLASS_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.CONVERTER_FOR_CLASS_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.CONVERTER_FOR_CLASS_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.CONVERTER_FOR_CLASS_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: ");//$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: ");//$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ConverterForClassTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ConverterIdTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ConverterIdTypeImpl.java
deleted file mode 100644
index 82a4997..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ConverterIdTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.ConverterIdType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Converter Id Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterIdTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterIdTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ConverterIdTypeImpl extends EObjectImpl implements ConverterIdType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ConverterIdTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.CONVERTER_ID_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.CONVERTER_ID_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.CONVERTER_ID_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.CONVERTER_ID_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.CONVERTER_ID_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.CONVERTER_ID_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.CONVERTER_ID_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.CONVERTER_ID_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.CONVERTER_ID_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.CONVERTER_ID_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.CONVERTER_ID_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: ");//$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: ");//$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ConverterIdTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ConverterTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ConverterTypeImpl.java
deleted file mode 100644
index fe331ee..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ConverterTypeImpl.java
+++ /dev/null
@@ -1,621 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.facesconfig.emf.AttributeType;
-import org.eclipse.jst.jsf.facesconfig.emf.ConverterClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.ConverterExtensionType;
-import org.eclipse.jst.jsf.facesconfig.emf.ConverterForClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.ConverterIdType;
-import org.eclipse.jst.jsf.facesconfig.emf.ConverterType;
-import org.eclipse.jst.jsf.facesconfig.emf.DescriptionType;
-import org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.IconType;
-import org.eclipse.jst.jsf.facesconfig.emf.PropertyType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Converter Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterTypeImpl#getDescription <em>Description</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterTypeImpl#getDisplayName <em>Display Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterTypeImpl#getIcon <em>Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterTypeImpl#getConverterId <em>Converter Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterTypeImpl#getConverterForClass <em>Converter For Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterTypeImpl#getConverterClass <em>Converter Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterTypeImpl#getAttribute <em>Attribute</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterTypeImpl#getProperty <em>Property</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterTypeImpl#getConverterExtension <em>Converter Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ConverterTypeImpl extends EObjectImpl implements ConverterType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The cached value of the '{@link #getDescription() <em>Description</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDescription()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList description;
-
-    /**
-	 * The cached value of the '{@link #getDisplayName() <em>Display Name</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDisplayName()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList displayName;
-
-    /**
-	 * The cached value of the '{@link #getIcon() <em>Icon</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getIcon()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList icon;
-
-    /**
-	 * The cached value of the '{@link #getConverterId() <em>Converter Id</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getConverterId()
-	 * @generated
-	 * @ordered
-	 */
-	protected ConverterIdType converterId;
-
-    /**
-	 * The cached value of the '{@link #getConverterForClass() <em>Converter For Class</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getConverterForClass()
-	 * @generated
-	 * @ordered
-	 */
-	protected ConverterForClassType converterForClass;
-
-    /**
-	 * The cached value of the '{@link #getConverterClass() <em>Converter Class</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getConverterClass()
-	 * @generated
-	 * @ordered
-	 */
-	protected ConverterClassType converterClass;
-
-    /**
-	 * The cached value of the '{@link #getAttribute() <em>Attribute</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getAttribute()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList attribute;
-
-    /**
-	 * The cached value of the '{@link #getProperty() <em>Property</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getProperty()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList property;
-
-    /**
-	 * The cached value of the '{@link #getConverterExtension() <em>Converter Extension</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see #getConverterExtension()
-	 * @generated
-	 * @ordered
-	 */
-    protected EList converterExtension;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ConverterTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.CONVERTER_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getDescription() {
-		if (description == null) {
-			description = new EObjectContainmentEList(DescriptionType.class, this, FacesConfigPackage.CONVERTER_TYPE__DESCRIPTION);
-		}
-		return description;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getDisplayName() {
-		if (displayName == null) {
-			displayName = new EObjectContainmentEList(DisplayNameType.class, this, FacesConfigPackage.CONVERTER_TYPE__DISPLAY_NAME);
-		}
-		return displayName;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getIcon() {
-		if (icon == null) {
-			icon = new EObjectContainmentEList(IconType.class, this, FacesConfigPackage.CONVERTER_TYPE__ICON);
-		}
-		return icon;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ConverterIdType getConverterId() {
-		return converterId;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newConverterId 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetConverterId(ConverterIdType newConverterId, NotificationChain msgs) {
-		ConverterIdType oldConverterId = converterId;
-		converterId = newConverterId;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.CONVERTER_TYPE__CONVERTER_ID, oldConverterId, newConverterId);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setConverterId(ConverterIdType newConverterId) {
-		if (newConverterId != converterId) {
-			NotificationChain msgs = null;
-			if (converterId != null)
-				msgs = ((InternalEObject)converterId).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.CONVERTER_TYPE__CONVERTER_ID, null, msgs);
-			if (newConverterId != null)
-				msgs = ((InternalEObject)newConverterId).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.CONVERTER_TYPE__CONVERTER_ID, null, msgs);
-			msgs = basicSetConverterId(newConverterId, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.CONVERTER_TYPE__CONVERTER_ID, newConverterId, newConverterId));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ConverterForClassType getConverterForClass() {
-		return converterForClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newConverterForClass 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetConverterForClass(ConverterForClassType newConverterForClass, NotificationChain msgs) {
-		ConverterForClassType oldConverterForClass = converterForClass;
-		converterForClass = newConverterForClass;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.CONVERTER_TYPE__CONVERTER_FOR_CLASS, oldConverterForClass, newConverterForClass);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setConverterForClass(ConverterForClassType newConverterForClass) {
-		if (newConverterForClass != converterForClass) {
-			NotificationChain msgs = null;
-			if (converterForClass != null)
-				msgs = ((InternalEObject)converterForClass).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.CONVERTER_TYPE__CONVERTER_FOR_CLASS, null, msgs);
-			if (newConverterForClass != null)
-				msgs = ((InternalEObject)newConverterForClass).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.CONVERTER_TYPE__CONVERTER_FOR_CLASS, null, msgs);
-			msgs = basicSetConverterForClass(newConverterForClass, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.CONVERTER_TYPE__CONVERTER_FOR_CLASS, newConverterForClass, newConverterForClass));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ConverterClassType getConverterClass() {
-		return converterClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newConverterClass 
-     * @param msgs 
-     * @return  
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetConverterClass(ConverterClassType newConverterClass, NotificationChain msgs) {
-		ConverterClassType oldConverterClass = converterClass;
-		converterClass = newConverterClass;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.CONVERTER_TYPE__CONVERTER_CLASS, oldConverterClass, newConverterClass);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setConverterClass(ConverterClassType newConverterClass) {
-		if (newConverterClass != converterClass) {
-			NotificationChain msgs = null;
-			if (converterClass != null)
-				msgs = ((InternalEObject)converterClass).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.CONVERTER_TYPE__CONVERTER_CLASS, null, msgs);
-			if (newConverterClass != null)
-				msgs = ((InternalEObject)newConverterClass).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.CONVERTER_TYPE__CONVERTER_CLASS, null, msgs);
-			msgs = basicSetConverterClass(newConverterClass, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.CONVERTER_TYPE__CONVERTER_CLASS, newConverterClass, newConverterClass));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getAttribute() {
-		if (attribute == null) {
-			attribute = new EObjectContainmentEList(AttributeType.class, this, FacesConfigPackage.CONVERTER_TYPE__ATTRIBUTE);
-		}
-		return attribute;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getProperty() {
-		if (property == null) {
-			property = new EObjectContainmentEList(PropertyType.class, this, FacesConfigPackage.CONVERTER_TYPE__PROPERTY);
-		}
-		return property;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EList getConverterExtension() {
-		if (converterExtension == null) {
-			converterExtension = new EObjectContainmentEList(ConverterExtensionType.class, this, FacesConfigPackage.CONVERTER_TYPE__CONVERTER_EXTENSION);
-		}
-		return converterExtension;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.CONVERTER_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case FacesConfigPackage.CONVERTER_TYPE__DESCRIPTION:
-				return ((InternalEList)getDescription()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.CONVERTER_TYPE__DISPLAY_NAME:
-				return ((InternalEList)getDisplayName()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.CONVERTER_TYPE__ICON:
-				return ((InternalEList)getIcon()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.CONVERTER_TYPE__CONVERTER_ID:
-				return basicSetConverterId(null, msgs);
-			case FacesConfigPackage.CONVERTER_TYPE__CONVERTER_FOR_CLASS:
-				return basicSetConverterForClass(null, msgs);
-			case FacesConfigPackage.CONVERTER_TYPE__CONVERTER_CLASS:
-				return basicSetConverterClass(null, msgs);
-			case FacesConfigPackage.CONVERTER_TYPE__ATTRIBUTE:
-				return ((InternalEList)getAttribute()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.CONVERTER_TYPE__PROPERTY:
-				return ((InternalEList)getProperty()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.CONVERTER_TYPE__CONVERTER_EXTENSION:
-				return ((InternalEList)getConverterExtension()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.CONVERTER_TYPE__DESCRIPTION:
-				return getDescription();
-			case FacesConfigPackage.CONVERTER_TYPE__DISPLAY_NAME:
-				return getDisplayName();
-			case FacesConfigPackage.CONVERTER_TYPE__ICON:
-				return getIcon();
-			case FacesConfigPackage.CONVERTER_TYPE__CONVERTER_ID:
-				return getConverterId();
-			case FacesConfigPackage.CONVERTER_TYPE__CONVERTER_FOR_CLASS:
-				return getConverterForClass();
-			case FacesConfigPackage.CONVERTER_TYPE__CONVERTER_CLASS:
-				return getConverterClass();
-			case FacesConfigPackage.CONVERTER_TYPE__ATTRIBUTE:
-				return getAttribute();
-			case FacesConfigPackage.CONVERTER_TYPE__PROPERTY:
-				return getProperty();
-			case FacesConfigPackage.CONVERTER_TYPE__CONVERTER_EXTENSION:
-				return getConverterExtension();
-			case FacesConfigPackage.CONVERTER_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.CONVERTER_TYPE__DESCRIPTION:
-				getDescription().clear();
-				getDescription().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.CONVERTER_TYPE__DISPLAY_NAME:
-				getDisplayName().clear();
-				getDisplayName().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.CONVERTER_TYPE__ICON:
-				getIcon().clear();
-				getIcon().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.CONVERTER_TYPE__CONVERTER_ID:
-				setConverterId((ConverterIdType)newValue);
-				return;
-			case FacesConfigPackage.CONVERTER_TYPE__CONVERTER_FOR_CLASS:
-				setConverterForClass((ConverterForClassType)newValue);
-				return;
-			case FacesConfigPackage.CONVERTER_TYPE__CONVERTER_CLASS:
-				setConverterClass((ConverterClassType)newValue);
-				return;
-			case FacesConfigPackage.CONVERTER_TYPE__ATTRIBUTE:
-				getAttribute().clear();
-				getAttribute().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.CONVERTER_TYPE__PROPERTY:
-				getProperty().clear();
-				getProperty().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.CONVERTER_TYPE__CONVERTER_EXTENSION:
-				getConverterExtension().clear();
-				getConverterExtension().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.CONVERTER_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.CONVERTER_TYPE__DESCRIPTION:
-				getDescription().clear();
-				return;
-			case FacesConfigPackage.CONVERTER_TYPE__DISPLAY_NAME:
-				getDisplayName().clear();
-				return;
-			case FacesConfigPackage.CONVERTER_TYPE__ICON:
-				getIcon().clear();
-				return;
-			case FacesConfigPackage.CONVERTER_TYPE__CONVERTER_ID:
-				setConverterId((ConverterIdType)null);
-				return;
-			case FacesConfigPackage.CONVERTER_TYPE__CONVERTER_FOR_CLASS:
-				setConverterForClass((ConverterForClassType)null);
-				return;
-			case FacesConfigPackage.CONVERTER_TYPE__CONVERTER_CLASS:
-				setConverterClass((ConverterClassType)null);
-				return;
-			case FacesConfigPackage.CONVERTER_TYPE__ATTRIBUTE:
-				getAttribute().clear();
-				return;
-			case FacesConfigPackage.CONVERTER_TYPE__PROPERTY:
-				getProperty().clear();
-				return;
-			case FacesConfigPackage.CONVERTER_TYPE__CONVERTER_EXTENSION:
-				getConverterExtension().clear();
-				return;
-			case FacesConfigPackage.CONVERTER_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.CONVERTER_TYPE__DESCRIPTION:
-				return description != null && !description.isEmpty();
-			case FacesConfigPackage.CONVERTER_TYPE__DISPLAY_NAME:
-				return displayName != null && !displayName.isEmpty();
-			case FacesConfigPackage.CONVERTER_TYPE__ICON:
-				return icon != null && !icon.isEmpty();
-			case FacesConfigPackage.CONVERTER_TYPE__CONVERTER_ID:
-				return converterId != null;
-			case FacesConfigPackage.CONVERTER_TYPE__CONVERTER_FOR_CLASS:
-				return converterForClass != null;
-			case FacesConfigPackage.CONVERTER_TYPE__CONVERTER_CLASS:
-				return converterClass != null;
-			case FacesConfigPackage.CONVERTER_TYPE__ATTRIBUTE:
-				return attribute != null && !attribute.isEmpty();
-			case FacesConfigPackage.CONVERTER_TYPE__PROPERTY:
-				return property != null && !property.isEmpty();
-			case FacesConfigPackage.CONVERTER_TYPE__CONVERTER_EXTENSION:
-				return converterExtension != null && !converterExtension.isEmpty();
-			case FacesConfigPackage.CONVERTER_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (id: ");//$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ConverterTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/DefaultLocaleTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/DefaultLocaleTypeImpl.java
deleted file mode 100644
index 78cb7b6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/DefaultLocaleTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.DefaultLocaleType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Default Locale Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DefaultLocaleTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DefaultLocaleTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class DefaultLocaleTypeImpl extends EObjectImpl implements DefaultLocaleType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected DefaultLocaleTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.DEFAULT_LOCALE_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.DEFAULT_LOCALE_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.DEFAULT_LOCALE_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.DEFAULT_LOCALE_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.DEFAULT_LOCALE_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.DEFAULT_LOCALE_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.DEFAULT_LOCALE_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.DEFAULT_LOCALE_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.DEFAULT_LOCALE_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.DEFAULT_LOCALE_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.DEFAULT_LOCALE_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: "); //$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: ");//$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //DefaultLocaleTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/DefaultRenderKitIdTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/DefaultRenderKitIdTypeImpl.java
deleted file mode 100644
index 7091636..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/DefaultRenderKitIdTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.DefaultRenderKitIdType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Default Render Kit Id Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DefaultRenderKitIdTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DefaultRenderKitIdTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class DefaultRenderKitIdTypeImpl extends EObjectImpl implements DefaultRenderKitIdType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected DefaultRenderKitIdTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.DEFAULT_RENDER_KIT_ID_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.DEFAULT_RENDER_KIT_ID_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.DEFAULT_RENDER_KIT_ID_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.DEFAULT_RENDER_KIT_ID_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.DEFAULT_RENDER_KIT_ID_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.DEFAULT_RENDER_KIT_ID_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.DEFAULT_RENDER_KIT_ID_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.DEFAULT_RENDER_KIT_ID_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.DEFAULT_RENDER_KIT_ID_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.DEFAULT_RENDER_KIT_ID_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.DEFAULT_RENDER_KIT_ID_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: ");//$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: ");//$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //DefaultRenderKitIdTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/DefaultValidatorsTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/DefaultValidatorsTypeImpl.java
deleted file mode 100644
index dc222bf..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/DefaultValidatorsTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.facesconfig.emf.DefaultValidatorsType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ValidatorIdType;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Default Validators Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DefaultValidatorsTypeImpl#getValidatorId <em>Validator Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DefaultValidatorsTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class DefaultValidatorsTypeImpl extends EObjectImpl implements DefaultValidatorsType {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * The cached value of the '{@link #getValidatorId() <em>Validator Id</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getValidatorId()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList validatorId;
-
-	/**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected DefaultValidatorsTypeImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.DEFAULT_VALIDATORS_TYPE;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getValidatorId() {
-		if (validatorId == null) {
-			validatorId = new EObjectContainmentEList(ValidatorIdType.class, this, FacesConfigPackage.DEFAULT_VALIDATORS_TYPE__VALIDATOR_ID);
-		}
-		return validatorId;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.DEFAULT_VALIDATORS_TYPE__ID, oldId, id));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case FacesConfigPackage.DEFAULT_VALIDATORS_TYPE__VALIDATOR_ID:
-				return ((InternalEList)getValidatorId()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.DEFAULT_VALIDATORS_TYPE__VALIDATOR_ID:
-				return getValidatorId();
-			case FacesConfigPackage.DEFAULT_VALIDATORS_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.DEFAULT_VALIDATORS_TYPE__VALIDATOR_ID:
-				getValidatorId().clear();
-				getValidatorId().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.DEFAULT_VALIDATORS_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.DEFAULT_VALIDATORS_TYPE__VALIDATOR_ID:
-				getValidatorId().clear();
-				return;
-			case FacesConfigPackage.DEFAULT_VALIDATORS_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.DEFAULT_VALIDATORS_TYPE__VALIDATOR_ID:
-				return validatorId != null && !validatorId.isEmpty();
-			case FacesConfigPackage.DEFAULT_VALIDATORS_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (id: ");//$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //DefaultValidatorsTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/DefaultValueTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/DefaultValueTypeImpl.java
deleted file mode 100644
index c5da609..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/DefaultValueTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.DefaultValueType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Default Value Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DefaultValueTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DefaultValueTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class DefaultValueTypeImpl extends EObjectImpl implements DefaultValueType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected DefaultValueTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.DEFAULT_VALUE_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.DEFAULT_VALUE_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.DEFAULT_VALUE_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.DEFAULT_VALUE_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.DEFAULT_VALUE_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.DEFAULT_VALUE_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.DEFAULT_VALUE_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.DEFAULT_VALUE_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.DEFAULT_VALUE_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.DEFAULT_VALUE_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.DEFAULT_VALUE_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: ");//$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: ");//$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //DefaultValueTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/DescriptionTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/DescriptionTypeImpl.java
deleted file mode 100644
index 31368c7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/DescriptionTypeImpl.java
+++ /dev/null
@@ -1,279 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.DescriptionType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Description Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DescriptionTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DescriptionTypeImpl#getLang <em>Lang</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DescriptionTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class DescriptionTypeImpl extends EObjectImpl implements DescriptionType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getLang() <em>Lang</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getLang()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String LANG_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getLang() <em>Lang</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getLang()
-	 * @generated
-	 * @ordered
-	 */
-	protected String lang = LANG_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected DescriptionTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.DESCRIPTION_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.DESCRIPTION_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getLang() {
-		return lang;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setLang(String newLang) {
-		String oldLang = lang;
-		lang = newLang;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.DESCRIPTION_TYPE__LANG, oldLang, lang));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.DESCRIPTION_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.DESCRIPTION_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.DESCRIPTION_TYPE__LANG:
-				return getLang();
-			case FacesConfigPackage.DESCRIPTION_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.DESCRIPTION_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.DESCRIPTION_TYPE__LANG:
-				setLang((String)newValue);
-				return;
-			case FacesConfigPackage.DESCRIPTION_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.DESCRIPTION_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.DESCRIPTION_TYPE__LANG:
-				setLang(LANG_EDEFAULT);
-				return;
-			case FacesConfigPackage.DESCRIPTION_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.DESCRIPTION_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.DESCRIPTION_TYPE__LANG:
-				return LANG_EDEFAULT == null ? lang != null : !LANG_EDEFAULT.equals(lang);
-			case FacesConfigPackage.DESCRIPTION_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: ");//$NON-NLS-1$
-		result.append(textContent);
-		result.append(", lang: ");//$NON-NLS-1$
-		result.append(lang);
-		result.append(", id: ");//$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //DescriptionTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/DisplayNameTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/DisplayNameTypeImpl.java
deleted file mode 100644
index 85b8ea0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/DisplayNameTypeImpl.java
+++ /dev/null
@@ -1,279 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Display Name Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DisplayNameTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DisplayNameTypeImpl#getLang <em>Lang</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DisplayNameTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class DisplayNameTypeImpl extends EObjectImpl implements DisplayNameType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getLang() <em>Lang</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getLang()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String LANG_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getLang() <em>Lang</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getLang()
-	 * @generated
-	 * @ordered
-	 */
-	protected String lang = LANG_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected DisplayNameTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.DISPLAY_NAME_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.DISPLAY_NAME_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getLang() {
-		return lang;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setLang(String newLang) {
-		String oldLang = lang;
-		lang = newLang;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.DISPLAY_NAME_TYPE__LANG, oldLang, lang));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.DISPLAY_NAME_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.DISPLAY_NAME_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.DISPLAY_NAME_TYPE__LANG:
-				return getLang();
-			case FacesConfigPackage.DISPLAY_NAME_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.DISPLAY_NAME_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.DISPLAY_NAME_TYPE__LANG:
-				setLang((String)newValue);
-				return;
-			case FacesConfigPackage.DISPLAY_NAME_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.DISPLAY_NAME_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.DISPLAY_NAME_TYPE__LANG:
-				setLang(LANG_EDEFAULT);
-				return;
-			case FacesConfigPackage.DISPLAY_NAME_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.DISPLAY_NAME_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.DISPLAY_NAME_TYPE__LANG:
-				return LANG_EDEFAULT == null ? lang != null : !LANG_EDEFAULT.equals(lang);
-			case FacesConfigPackage.DISPLAY_NAME_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: ");//$NON-NLS-1$
-		result.append(textContent);
-		result.append(", lang: ");//$NON-NLS-1$
-		result.append(lang);
-		result.append(", id: ");//$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //DisplayNameTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/DocumentRootImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/DocumentRootImpl.java
deleted file mode 100644
index 43083da..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/DocumentRootImpl.java
+++ /dev/null
@@ -1,4674 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EMap;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.EcorePackage;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.impl.EStringToStringMapEntryImpl;
-import org.eclipse.emf.ecore.util.BasicFeatureMap;
-import org.eclipse.emf.ecore.util.EcoreEMap;
-import org.eclipse.emf.ecore.util.FeatureMap;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.facesconfig.emf.*;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Document Root</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getMixed <em>Mixed</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getXMLNSPrefixMap <em>XMLNS Prefix Map</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getXSISchemaLocation <em>XSI Schema Location</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getAbsoluteOrdering <em>Absolute Ordering</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getActionListener <em>Action Listener</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getApplication <em>Application</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getApplicationFactory <em>Application Factory</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getAttribute <em>Attribute</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getAttributeClass <em>Attribute Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getAttributeExtension <em>Attribute Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getAttributeName <em>Attribute Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getBehavior <em>Behavior</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getBehaviorClass <em>Behavior Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getBehaviorId <em>Behavior Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getBehaviorExtension <em>Behavior Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getComponent <em>Component</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getComponentClass <em>Component Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getComponentExtension <em>Component Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getComponentFamily <em>Component Family</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getComponentType <em>Component Type</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getConverter <em>Converter</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getConverterClass <em>Converter Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getConverterForClass <em>Converter For Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getConverterId <em>Converter Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getDefaultLocale <em>Default Locale</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getDefaultRenderKitId <em>Default Render Kit Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getDefaultValidators <em>Default Validators</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getDefaultValue <em>Default Value</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getDescription <em>Description</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getDisplayName <em>Display Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getExceptionHandlerFactory <em>Exception Handler Factory</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getExternalContextFactory <em>External Context Factory</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getFacesConfig <em>Faces Config</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getFacesContextFactory <em>Faces Context Factory</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getFacet <em>Facet</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getFacetExtension <em>Facet Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getFacetName <em>Facet Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getFactory <em>Factory</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getFromAction <em>From Action</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getFromOutcome <em>From Outcome</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getFromViewId <em>From View Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getIcon <em>Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getIf <em>If</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getKey <em>Key</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getKeyClass <em>Key Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getLargeIcon <em>Large Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getLifecycle <em>Lifecycle</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getLifecycleFactory <em>Lifecycle Factory</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getListEntries <em>List Entries</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getLocaleConfig <em>Locale Config</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getManagedBean <em>Managed Bean</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getManagedBeanClass <em>Managed Bean Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getManagedBeanName <em>Managed Bean Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getManagedBeanScope <em>Managed Bean Scope</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getManagedProperty <em>Managed Property</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getMapEntries <em>Map Entries</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getMapEntry <em>Map Entry</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getMessageBundle <em>Message Bundle</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getName <em>Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getNavigationCase <em>Navigation Case</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getNavigationHandler <em>Navigation Handler</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getNavigationRule <em>Navigation Rule</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getNullValue <em>Null Value</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getOrdering <em>Ordering</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getOrderingOrdering <em>Ordering Ordering</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getOthers <em>Others</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getPartialViewContextFactory <em>Partial View Context Factory</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getPhaseListener <em>Phase Listener</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getProperty <em>Property</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getPropertyClass <em>Property Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getPropertyExtension <em>Property Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getPropertyName <em>Property Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getPropertyResolver <em>Property Resolver</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getRedirect <em>Redirect</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getRedirectViewParam <em>Redirect View Param</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getReferencedBean <em>Referenced Bean</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getReferencedBeanClass <em>Referenced Bean Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getReferencedBeanName <em>Referenced Bean Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getRenderer <em>Renderer</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getRendererClass <em>Renderer Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getRendererExtension <em>Renderer Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getRendererType <em>Renderer Type</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getRenderKit <em>Render Kit</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getRenderKitClass <em>Render Kit Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getRenderKitFactory <em>Render Kit Factory</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getRenderKitId <em>Render Kit Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getResourceHandler <em>Resource Handler</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getSmallIcon <em>Small Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getSourceClass <em>Source Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getStateManager <em>State Manager</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getSuggestedValue <em>Suggested Value</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getSupportedLocale <em>Supported Locale</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getSystemEventClass <em>System Event Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getSystemEventListener <em>System Event Listener</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getSystemEventListenerClass <em>System Event Listener Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getTagHandlerDelegateFactory <em>Tag Handler Delegate Factory</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getToViewId <em>To View Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getValidator <em>Validator</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getValidatorClass <em>Validator Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getValidatorId <em>Validator Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getValue <em>Value</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getValueClass <em>Value Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getVariableResolver <em>Variable Resolver</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getViewDeclarationLanguageFactory <em>View Declaration Language Factory</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getViewHandler <em>View Handler</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getVisitContextFactory <em>Visit Context Factory</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class DocumentRootImpl extends EObjectImpl implements DocumentRoot {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The cached value of the '{@link #getMixed() <em>Mixed</em>}' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getMixed()
-	 * @generated
-	 * @ordered
-	 */
-	protected FeatureMap mixed;
-
-    /**
-	 * The cached value of the '{@link #getXMLNSPrefixMap() <em>XMLNS Prefix Map</em>}' map.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getXMLNSPrefixMap()
-	 * @generated
-	 * @ordered
-	 */
-	protected EMap xMLNSPrefixMap;
-
-    /**
-	 * The cached value of the '{@link #getXSISchemaLocation() <em>XSI Schema Location</em>}' map.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getXSISchemaLocation()
-	 * @generated
-	 * @ordered
-	 */
-	protected EMap xSISchemaLocation;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected DocumentRootImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.DOCUMENT_ROOT;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FeatureMap getMixed() {
-		if (mixed == null) {
-			mixed = new BasicFeatureMap(this, FacesConfigPackage.DOCUMENT_ROOT__MIXED);
-		}
-		return mixed;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EMap getXMLNSPrefixMap() {
-		if (xMLNSPrefixMap == null) {
-			xMLNSPrefixMap = new EcoreEMap(EcorePackage.Literals.ESTRING_TO_STRING_MAP_ENTRY, EStringToStringMapEntryImpl.class, this, FacesConfigPackage.DOCUMENT_ROOT__XMLNS_PREFIX_MAP);
-		}
-		return xMLNSPrefixMap;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EMap getXSISchemaLocation() {
-		if (xSISchemaLocation == null) {
-			xSISchemaLocation = new EcoreEMap(EcorePackage.Literals.ESTRING_TO_STRING_MAP_ENTRY, EStringToStringMapEntryImpl.class, this, FacesConfigPackage.DOCUMENT_ROOT__XSI_SCHEMA_LOCATION);
-		}
-		return xSISchemaLocation;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public AbsoluteOrderingType getAbsoluteOrdering() {
-		return (AbsoluteOrderingType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__ABSOLUTE_ORDERING, true);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * @param newAbsoluteOrdering 
-	 * @param msgs 
-	 * @return  NotficationChain
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetAbsoluteOrdering(AbsoluteOrderingType newAbsoluteOrdering, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__ABSOLUTE_ORDERING, newAbsoluteOrdering, msgs);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setAbsoluteOrdering(AbsoluteOrderingType newAbsoluteOrdering) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__ABSOLUTE_ORDERING, newAbsoluteOrdering);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ActionListenerType getActionListener() {
-		return (ActionListenerType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__ACTION_LISTENER, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newActionListener 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetActionListener(ActionListenerType newActionListener, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__ACTION_LISTENER, newActionListener, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setActionListener(ActionListenerType newActionListener) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__ACTION_LISTENER, newActionListener);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ApplicationType getApplication() {
-		return (ApplicationType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__APPLICATION, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newApplication 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetApplication(ApplicationType newApplication, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__APPLICATION, newApplication, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setApplication(ApplicationType newApplication) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__APPLICATION, newApplication);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ApplicationFactoryType getApplicationFactory() {
-		return (ApplicationFactoryType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__APPLICATION_FACTORY, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newApplicationFactory 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetApplicationFactory(ApplicationFactoryType newApplicationFactory, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__APPLICATION_FACTORY, newApplicationFactory, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setApplicationFactory(ApplicationFactoryType newApplicationFactory) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__APPLICATION_FACTORY, newApplicationFactory);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public AttributeType getAttribute() {
-		return (AttributeType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__ATTRIBUTE, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newAttribute 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetAttribute(AttributeType newAttribute, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__ATTRIBUTE, newAttribute, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setAttribute(AttributeType newAttribute) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__ATTRIBUTE, newAttribute);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public AttributeClassType getAttributeClass() {
-		return (AttributeClassType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__ATTRIBUTE_CLASS, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newAttributeClass 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetAttributeClass(AttributeClassType newAttributeClass, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__ATTRIBUTE_CLASS, newAttributeClass, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setAttributeClass(AttributeClassType newAttributeClass) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__ATTRIBUTE_CLASS, newAttributeClass);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public AttributeExtensionType getAttributeExtension() {
-		return (AttributeExtensionType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__ATTRIBUTE_EXTENSION, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newAttributeExtension 
-     * @param msgs 
-     * @return the notification chiain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetAttributeExtension(AttributeExtensionType newAttributeExtension, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__ATTRIBUTE_EXTENSION, newAttributeExtension, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setAttributeExtension(AttributeExtensionType newAttributeExtension) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__ATTRIBUTE_EXTENSION, newAttributeExtension);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public AttributeNameType getAttributeName() {
-		return (AttributeNameType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__ATTRIBUTE_NAME, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newAttributeName 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetAttributeName(AttributeNameType newAttributeName, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__ATTRIBUTE_NAME, newAttributeName, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setAttributeName(AttributeNameType newAttributeName) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__ATTRIBUTE_NAME, newAttributeName);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BehaviorType getBehavior() {
-		return (BehaviorType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__BEHAVIOR, true);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * @param newBehavior 
-	 * @param msgs NotificationChain
-	 * @return 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetBehavior(BehaviorType newBehavior, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__BEHAVIOR, newBehavior, msgs);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setBehavior(BehaviorType newBehavior) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__BEHAVIOR, newBehavior);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BehaviorClassType getBehaviorClass() {
-		return (BehaviorClassType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__BEHAVIOR_CLASS, true);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * @param newBehaviorClass 
-	 * @param msgs 
-	 * @return NotificationChain
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetBehaviorClass(BehaviorClassType newBehaviorClass, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__BEHAVIOR_CLASS, newBehaviorClass, msgs);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setBehaviorClass(BehaviorClassType newBehaviorClass) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__BEHAVIOR_CLASS, newBehaviorClass);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BehaviorIdType getBehaviorId() {
-		return (BehaviorIdType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__BEHAVIOR_ID, true);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * @param newBehaviorId 
-	 * @param msgs 
-	 * @return NotificationChain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetBehaviorId(BehaviorIdType newBehaviorId, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__BEHAVIOR_ID, newBehaviorId, msgs);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setBehaviorId(BehaviorIdType newBehaviorId) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__BEHAVIOR_ID, newBehaviorId);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BehaviorExtensionType getBehaviorExtension() {
-		return (BehaviorExtensionType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__BEHAVIOR_EXTENSION, true);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * @param newBehaviorExtension 
-	 * @param msgs 
-	 * @return NotificationChain
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetBehaviorExtension(BehaviorExtensionType newBehaviorExtension, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__BEHAVIOR_EXTENSION, newBehaviorExtension, msgs);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setBehaviorExtension(BehaviorExtensionType newBehaviorExtension) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__BEHAVIOR_EXTENSION, newBehaviorExtension);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ComponentType getComponent() {
-		return (ComponentType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__COMPONENT, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newComponent 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetComponent(ComponentType newComponent, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__COMPONENT, newComponent, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setComponent(ComponentType newComponent) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__COMPONENT, newComponent);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ComponentClassType getComponentClass() {
-		return (ComponentClassType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__COMPONENT_CLASS, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newComponentClass 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetComponentClass(ComponentClassType newComponentClass, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__COMPONENT_CLASS, newComponentClass, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setComponentClass(ComponentClassType newComponentClass) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__COMPONENT_CLASS, newComponentClass);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ComponentExtensionType getComponentExtension() {
-		return (ComponentExtensionType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__COMPONENT_EXTENSION, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newComponentExtension 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetComponentExtension(ComponentExtensionType newComponentExtension, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__COMPONENT_EXTENSION, newComponentExtension, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setComponentExtension(ComponentExtensionType newComponentExtension) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__COMPONENT_EXTENSION, newComponentExtension);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ComponentFamilyType getComponentFamily() {
-		return (ComponentFamilyType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__COMPONENT_FAMILY, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newComponentFamily 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetComponentFamily(ComponentFamilyType newComponentFamily, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__COMPONENT_FAMILY, newComponentFamily, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setComponentFamily(ComponentFamilyType newComponentFamily) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__COMPONENT_FAMILY, newComponentFamily);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ComponentTypeType getComponentType() {
-		return (ComponentTypeType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__COMPONENT_TYPE, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newComponentType 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetComponentType(ComponentTypeType newComponentType, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__COMPONENT_TYPE, newComponentType, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setComponentType(ComponentTypeType newComponentType) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__COMPONENT_TYPE, newComponentType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ConverterType getConverter() {
-		return (ConverterType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__CONVERTER, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newConverter 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetConverter(ConverterType newConverter, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__CONVERTER, newConverter, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setConverter(ConverterType newConverter) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__CONVERTER, newConverter);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ConverterClassType getConverterClass() {
-		return (ConverterClassType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__CONVERTER_CLASS, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newConverterClass 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetConverterClass(ConverterClassType newConverterClass, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__CONVERTER_CLASS, newConverterClass, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setConverterClass(ConverterClassType newConverterClass) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__CONVERTER_CLASS, newConverterClass);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ConverterForClassType getConverterForClass() {
-		return (ConverterForClassType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__CONVERTER_FOR_CLASS, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newConverterForClass 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetConverterForClass(ConverterForClassType newConverterForClass, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__CONVERTER_FOR_CLASS, newConverterForClass, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setConverterForClass(ConverterForClassType newConverterForClass) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__CONVERTER_FOR_CLASS, newConverterForClass);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ConverterIdType getConverterId() {
-		return (ConverterIdType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__CONVERTER_ID, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newConverterId 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetConverterId(ConverterIdType newConverterId, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__CONVERTER_ID, newConverterId, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setConverterId(ConverterIdType newConverterId) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__CONVERTER_ID, newConverterId);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public DefaultLocaleType getDefaultLocale() {
-		return (DefaultLocaleType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__DEFAULT_LOCALE, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newDefaultLocale 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetDefaultLocale(DefaultLocaleType newDefaultLocale, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__DEFAULT_LOCALE, newDefaultLocale, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setDefaultLocale(DefaultLocaleType newDefaultLocale) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__DEFAULT_LOCALE, newDefaultLocale);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public DefaultRenderKitIdType getDefaultRenderKitId() {
-		return (DefaultRenderKitIdType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__DEFAULT_RENDER_KIT_ID, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newDefaultRenderKitId 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetDefaultRenderKitId(DefaultRenderKitIdType newDefaultRenderKitId, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__DEFAULT_RENDER_KIT_ID, newDefaultRenderKitId, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setDefaultRenderKitId(DefaultRenderKitIdType newDefaultRenderKitId) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__DEFAULT_RENDER_KIT_ID, newDefaultRenderKitId);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public DefaultValidatorsType getDefaultValidators() {
-		return (DefaultValidatorsType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__DEFAULT_VALIDATORS, true);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * @param newDefaultValidators 
-	 * @param msgs 
-	 * @return NotificationChain
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetDefaultValidators(DefaultValidatorsType newDefaultValidators, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__DEFAULT_VALIDATORS, newDefaultValidators, msgs);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setDefaultValidators(DefaultValidatorsType newDefaultValidators) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__DEFAULT_VALIDATORS, newDefaultValidators);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public DefaultValueType getDefaultValue() {
-		return (DefaultValueType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__DEFAULT_VALUE, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newDefaultValue 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetDefaultValue(DefaultValueType newDefaultValue, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__DEFAULT_VALUE, newDefaultValue, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setDefaultValue(DefaultValueType newDefaultValue) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__DEFAULT_VALUE, newDefaultValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public DescriptionType getDescription() {
-		return (DescriptionType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__DESCRIPTION, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newDescription 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetDescription(DescriptionType newDescription, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__DESCRIPTION, newDescription, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setDescription(DescriptionType newDescription) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__DESCRIPTION, newDescription);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public DisplayNameType getDisplayName() {
-		return (DisplayNameType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__DISPLAY_NAME, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newDisplayName 
-     * @param msgs 
-     * @return the notification 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetDisplayName(DisplayNameType newDisplayName, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__DISPLAY_NAME, newDisplayName, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setDisplayName(DisplayNameType newDisplayName) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__DISPLAY_NAME, newDisplayName);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ExceptionHandlerFactoryType getExceptionHandlerFactory() {
-		return (ExceptionHandlerFactoryType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__EXCEPTION_HANDLER_FACTORY, true);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * @param newExceptionHandlerFactory 
-	 * @param msgs 
-	 * @return NotificationChain
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetExceptionHandlerFactory(ExceptionHandlerFactoryType newExceptionHandlerFactory, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__EXCEPTION_HANDLER_FACTORY, newExceptionHandlerFactory, msgs);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setExceptionHandlerFactory(ExceptionHandlerFactoryType newExceptionHandlerFactory) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__EXCEPTION_HANDLER_FACTORY, newExceptionHandlerFactory);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ExternalContextFactoryType getExternalContextFactory() {
-		return (ExternalContextFactoryType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__EXTERNAL_CONTEXT_FACTORY, true);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * @param newExternalContextFactory 
-	 * @param msgs 
-	 * @return NotificationChain
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetExternalContextFactory(ExternalContextFactoryType newExternalContextFactory, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__EXTERNAL_CONTEXT_FACTORY, newExternalContextFactory, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setExternalContextFactory(ExternalContextFactoryType newExternalContextFactory) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__EXTERNAL_CONTEXT_FACTORY, newExternalContextFactory);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FacesConfigType getFacesConfig() {
-		return (FacesConfigType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__FACES_CONFIG, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newFacesConfig 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetFacesConfig(FacesConfigType newFacesConfig, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__FACES_CONFIG, newFacesConfig, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setFacesConfig(FacesConfigType newFacesConfig) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__FACES_CONFIG, newFacesConfig);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FacesContextFactoryType getFacesContextFactory() {
-		return (FacesContextFactoryType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__FACES_CONTEXT_FACTORY, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newFacesContextFactory 
-     * @param msgs 
-     * @return NotificationChain
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetFacesContextFactory(FacesContextFactoryType newFacesContextFactory, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__FACES_CONTEXT_FACTORY, newFacesContextFactory, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setFacesContextFactory(FacesContextFactoryType newFacesContextFactory) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__FACES_CONTEXT_FACTORY, newFacesContextFactory);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FacetType getFacet() {
-		return (FacetType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__FACET, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newFacet 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetFacet(FacetType newFacet, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__FACET, newFacet, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setFacet(FacetType newFacet) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__FACET, newFacet);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FacetExtensionType getFacetExtension() {
-		return (FacetExtensionType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__FACET_EXTENSION, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newFacetExtension 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetFacetExtension(FacetExtensionType newFacetExtension, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__FACET_EXTENSION, newFacetExtension, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setFacetExtension(FacetExtensionType newFacetExtension) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__FACET_EXTENSION, newFacetExtension);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FacetNameType getFacetName() {
-		return (FacetNameType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__FACET_NAME, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newFacetName 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetFacetName(FacetNameType newFacetName, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__FACET_NAME, newFacetName, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setFacetName(FacetNameType newFacetName) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__FACET_NAME, newFacetName);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FactoryType getFactory() {
-		return (FactoryType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__FACTORY, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newFactory 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetFactory(FactoryType newFactory, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__FACTORY, newFactory, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setFactory(FactoryType newFactory) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__FACTORY, newFactory);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FromActionType getFromAction() {
-		return (FromActionType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__FROM_ACTION, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newFromAction 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetFromAction(FromActionType newFromAction, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__FROM_ACTION, newFromAction, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setFromAction(FromActionType newFromAction) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__FROM_ACTION, newFromAction);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FromOutcomeType getFromOutcome() {
-		return (FromOutcomeType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__FROM_OUTCOME, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newFromOutcome 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetFromOutcome(FromOutcomeType newFromOutcome, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__FROM_OUTCOME, newFromOutcome, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setFromOutcome(FromOutcomeType newFromOutcome) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__FROM_OUTCOME, newFromOutcome);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FromViewIdType getFromViewId() {
-		return (FromViewIdType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__FROM_VIEW_ID, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newFromViewId 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetFromViewId(FromViewIdType newFromViewId, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__FROM_VIEW_ID, newFromViewId, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setFromViewId(FromViewIdType newFromViewId) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__FROM_VIEW_ID, newFromViewId);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public IconType getIcon() {
-		return (IconType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__ICON, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newIcon 
-     * @param msgs 
-     * @return the notification  chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetIcon(IconType newIcon, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__ICON, newIcon, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setIcon(IconType newIcon) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__ICON, newIcon);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public IfType getIf() {
-		return (IfType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__IF, true);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * @param newIf 
-	 * @param msgs 
-	 * @return NotificationChain
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetIf(IfType newIf, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__IF, newIf, msgs);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setIf(IfType newIf) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__IF, newIf);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public KeyType getKey() {
-		return (KeyType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__KEY, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newKey 
-     * @param msgs 
-     * @return the notification chiainn 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetKey(KeyType newKey, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__KEY, newKey, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setKey(KeyType newKey) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__KEY, newKey);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public KeyClassType getKeyClass() {
-		return (KeyClassType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__KEY_CLASS, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newKeyClass 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetKeyClass(KeyClassType newKeyClass, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__KEY_CLASS, newKeyClass, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setKeyClass(KeyClassType newKeyClass) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__KEY_CLASS, newKeyClass);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public LargeIconType getLargeIcon() {
-		return (LargeIconType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__LARGE_ICON, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newLargeIcon 
-     * @param msgs 
-     * @return the notification  chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetLargeIcon(LargeIconType newLargeIcon, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__LARGE_ICON, newLargeIcon, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setLargeIcon(LargeIconType newLargeIcon) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__LARGE_ICON, newLargeIcon);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public LifecycleType getLifecycle() {
-		return (LifecycleType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__LIFECYCLE, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newLifecycle 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetLifecycle(LifecycleType newLifecycle, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__LIFECYCLE, newLifecycle, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setLifecycle(LifecycleType newLifecycle) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__LIFECYCLE, newLifecycle);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public LifecycleFactoryType getLifecycleFactory() {
-		return (LifecycleFactoryType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__LIFECYCLE_FACTORY, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newLifecycleFactory 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetLifecycleFactory(LifecycleFactoryType newLifecycleFactory, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__LIFECYCLE_FACTORY, newLifecycleFactory, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setLifecycleFactory(LifecycleFactoryType newLifecycleFactory) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__LIFECYCLE_FACTORY, newLifecycleFactory);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ListEntriesType getListEntries() {
-		return (ListEntriesType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__LIST_ENTRIES, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newListEntries 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetListEntries(ListEntriesType newListEntries, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__LIST_ENTRIES, newListEntries, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setListEntries(ListEntriesType newListEntries) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__LIST_ENTRIES, newListEntries);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public LocaleConfigType getLocaleConfig() {
-		return (LocaleConfigType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__LOCALE_CONFIG, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newLocaleConfig 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetLocaleConfig(LocaleConfigType newLocaleConfig, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__LOCALE_CONFIG, newLocaleConfig, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setLocaleConfig(LocaleConfigType newLocaleConfig) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__LOCALE_CONFIG, newLocaleConfig);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ManagedBeanType getManagedBean() {
-		return (ManagedBeanType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__MANAGED_BEAN, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newManagedBean 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetManagedBean(ManagedBeanType newManagedBean, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__MANAGED_BEAN, newManagedBean, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setManagedBean(ManagedBeanType newManagedBean) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__MANAGED_BEAN, newManagedBean);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ManagedBeanClassType getManagedBeanClass() {
-		return (ManagedBeanClassType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__MANAGED_BEAN_CLASS, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newManagedBeanClass 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetManagedBeanClass(ManagedBeanClassType newManagedBeanClass, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__MANAGED_BEAN_CLASS, newManagedBeanClass, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setManagedBeanClass(ManagedBeanClassType newManagedBeanClass) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__MANAGED_BEAN_CLASS, newManagedBeanClass);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ManagedBeanNameType getManagedBeanName() {
-		return (ManagedBeanNameType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__MANAGED_BEAN_NAME, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newManagedBeanName 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetManagedBeanName(ManagedBeanNameType newManagedBeanName, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__MANAGED_BEAN_NAME, newManagedBeanName, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setManagedBeanName(ManagedBeanNameType newManagedBeanName) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__MANAGED_BEAN_NAME, newManagedBeanName);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ManagedBeanScopeType getManagedBeanScope() {
-		return (ManagedBeanScopeType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__MANAGED_BEAN_SCOPE, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newManagedBeanScope 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetManagedBeanScope(ManagedBeanScopeType newManagedBeanScope, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__MANAGED_BEAN_SCOPE, newManagedBeanScope, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setManagedBeanScope(ManagedBeanScopeType newManagedBeanScope) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__MANAGED_BEAN_SCOPE, newManagedBeanScope);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ManagedPropertyType getManagedProperty() {
-		return (ManagedPropertyType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__MANAGED_PROPERTY, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newManagedProperty 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetManagedProperty(ManagedPropertyType newManagedProperty, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__MANAGED_PROPERTY, newManagedProperty, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setManagedProperty(ManagedPropertyType newManagedProperty) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__MANAGED_PROPERTY, newManagedProperty);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public MapEntriesType getMapEntries() {
-		return (MapEntriesType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__MAP_ENTRIES, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newMapEntries 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetMapEntries(MapEntriesType newMapEntries, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__MAP_ENTRIES, newMapEntries, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setMapEntries(MapEntriesType newMapEntries) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__MAP_ENTRIES, newMapEntries);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public MapEntryType getMapEntry() {
-		return (MapEntryType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__MAP_ENTRY, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newMapEntry 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetMapEntry(MapEntryType newMapEntry, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__MAP_ENTRY, newMapEntry, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setMapEntry(MapEntryType newMapEntry) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__MAP_ENTRY, newMapEntry);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public MessageBundleType getMessageBundle() {
-		return (MessageBundleType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__MESSAGE_BUNDLE, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newMessageBundle 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetMessageBundle(MessageBundleType newMessageBundle, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__MESSAGE_BUNDLE, newMessageBundle, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setMessageBundle(MessageBundleType newMessageBundle) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__MESSAGE_BUNDLE, newMessageBundle);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NameType getName() {
-		return (NameType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__NAME, true);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * @param newName 
-	 * @param msgs 
-	 * @return NotificationChain
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetName(NameType newName, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__NAME, newName, msgs);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setName(NameType newName) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__NAME, newName);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NavigationCaseType getNavigationCase() {
-		return (NavigationCaseType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__NAVIGATION_CASE, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newNavigationCase 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetNavigationCase(NavigationCaseType newNavigationCase, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__NAVIGATION_CASE, newNavigationCase, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setNavigationCase(NavigationCaseType newNavigationCase) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__NAVIGATION_CASE, newNavigationCase);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NavigationHandlerType getNavigationHandler() {
-		return (NavigationHandlerType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__NAVIGATION_HANDLER, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newNavigationHandler 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetNavigationHandler(NavigationHandlerType newNavigationHandler, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__NAVIGATION_HANDLER, newNavigationHandler, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setNavigationHandler(NavigationHandlerType newNavigationHandler) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__NAVIGATION_HANDLER, newNavigationHandler);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NavigationRuleType getNavigationRule() {
-		return (NavigationRuleType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__NAVIGATION_RULE, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newNavigationRule 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetNavigationRule(NavigationRuleType newNavigationRule, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__NAVIGATION_RULE, newNavigationRule, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setNavigationRule(NavigationRuleType newNavigationRule) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__NAVIGATION_RULE, newNavigationRule);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NullValueType getNullValue() {
-		return (NullValueType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__NULL_VALUE, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newNullValue 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetNullValue(NullValueType newNullValue, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__NULL_VALUE, newNullValue, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setNullValue(NullValueType newNullValue) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__NULL_VALUE, newNullValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public OrderingType getOrdering() {
-		return (OrderingType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__ORDERING, true);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * @param newOrdering 
-	 * @param msgs 
-	 * @return NotificationChain
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetOrdering(OrderingType newOrdering, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__ORDERING, newOrdering, msgs);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setOrdering(OrderingType newOrdering) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__ORDERING, newOrdering);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public OrderingOrderingType getOrderingOrdering() {
-		return (OrderingOrderingType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__ORDERING_ORDERING, true);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * @param newOrderingOrdering 
-	 * @param msgs 
-	 * @return NotificationChain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetOrderingOrdering(OrderingOrderingType newOrderingOrdering, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__ORDERING_ORDERING, newOrderingOrdering, msgs);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setOrderingOrdering(OrderingOrderingType newOrderingOrdering) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__ORDERING_ORDERING, newOrderingOrdering);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public OrderingOthersType getOthers() {
-		return (OrderingOthersType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__OTHERS, true);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * @param newOthers 
-	 * @param msgs 
-	 * @return NotificationChain
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetOthers(OrderingOthersType newOthers, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__OTHERS, newOthers, msgs);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setOthers(OrderingOthersType newOthers) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__OTHERS, newOthers);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public PartialViewContextFactoryType getPartialViewContextFactory() {
-		return (PartialViewContextFactoryType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__PARTIAL_VIEW_CONTEXT_FACTORY, true);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * @param newPartialViewContextFactory 
-	 * @param msgs 
-	 * @return NotificationChain
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetPartialViewContextFactory(PartialViewContextFactoryType newPartialViewContextFactory, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__PARTIAL_VIEW_CONTEXT_FACTORY, newPartialViewContextFactory, msgs);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setPartialViewContextFactory(PartialViewContextFactoryType newPartialViewContextFactory) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__PARTIAL_VIEW_CONTEXT_FACTORY, newPartialViewContextFactory);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public PhaseListenerType getPhaseListener() {
-		return (PhaseListenerType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__PHASE_LISTENER, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newPhaseListener 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetPhaseListener(PhaseListenerType newPhaseListener, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__PHASE_LISTENER, newPhaseListener, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setPhaseListener(PhaseListenerType newPhaseListener) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__PHASE_LISTENER, newPhaseListener);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public PropertyType getProperty() {
-		return (PropertyType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__PROPERTY, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newProperty 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetProperty(PropertyType newProperty, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__PROPERTY, newProperty, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setProperty(PropertyType newProperty) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__PROPERTY, newProperty);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public PropertyClassType getPropertyClass() {
-		return (PropertyClassType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__PROPERTY_CLASS, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newPropertyClass 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetPropertyClass(PropertyClassType newPropertyClass, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__PROPERTY_CLASS, newPropertyClass, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setPropertyClass(PropertyClassType newPropertyClass) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__PROPERTY_CLASS, newPropertyClass);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public PropertyExtensionType getPropertyExtension() {
-		return (PropertyExtensionType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__PROPERTY_EXTENSION, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newPropertyExtension 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetPropertyExtension(PropertyExtensionType newPropertyExtension, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__PROPERTY_EXTENSION, newPropertyExtension, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setPropertyExtension(PropertyExtensionType newPropertyExtension) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__PROPERTY_EXTENSION, newPropertyExtension);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public PropertyNameType getPropertyName() {
-		return (PropertyNameType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__PROPERTY_NAME, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newPropertyName 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetPropertyName(PropertyNameType newPropertyName, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__PROPERTY_NAME, newPropertyName, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setPropertyName(PropertyNameType newPropertyName) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__PROPERTY_NAME, newPropertyName);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public PropertyResolverType getPropertyResolver() {
-		return (PropertyResolverType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__PROPERTY_RESOLVER, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newPropertyResolver 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetPropertyResolver(PropertyResolverType newPropertyResolver, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__PROPERTY_RESOLVER, newPropertyResolver, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setPropertyResolver(PropertyResolverType newPropertyResolver) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__PROPERTY_RESOLVER, newPropertyResolver);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public RedirectType getRedirect() {
-		return (RedirectType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__REDIRECT, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newRedirect 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetRedirect(RedirectType newRedirect, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__REDIRECT, newRedirect, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setRedirect(RedirectType newRedirect) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__REDIRECT, newRedirect);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public RedirectViewParamType getRedirectViewParam() {
-		return (RedirectViewParamType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__REDIRECT_VIEW_PARAM, true);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * @param newRedirectViewParam 
-	 * @param msgs 
-	 * @return NotificationChain
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetRedirectViewParam(RedirectViewParamType newRedirectViewParam, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__REDIRECT_VIEW_PARAM, newRedirectViewParam, msgs);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setRedirectViewParam(RedirectViewParamType newRedirectViewParam) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__REDIRECT_VIEW_PARAM, newRedirectViewParam);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ReferencedBeanType getReferencedBean() {
-		return (ReferencedBeanType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__REFERENCED_BEAN, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newReferencedBean 
-     * @param msgs 
-     * @return the notification chai 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetReferencedBean(ReferencedBeanType newReferencedBean, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__REFERENCED_BEAN, newReferencedBean, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setReferencedBean(ReferencedBeanType newReferencedBean) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__REFERENCED_BEAN, newReferencedBean);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ReferencedBeanClassType getReferencedBeanClass() {
-		return (ReferencedBeanClassType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__REFERENCED_BEAN_CLASS, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newReferencedBeanClass 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetReferencedBeanClass(ReferencedBeanClassType newReferencedBeanClass, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__REFERENCED_BEAN_CLASS, newReferencedBeanClass, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setReferencedBeanClass(ReferencedBeanClassType newReferencedBeanClass) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__REFERENCED_BEAN_CLASS, newReferencedBeanClass);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ReferencedBeanNameType getReferencedBeanName() {
-		return (ReferencedBeanNameType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__REFERENCED_BEAN_NAME, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newReferencedBeanName 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetReferencedBeanName(ReferencedBeanNameType newReferencedBeanName, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__REFERENCED_BEAN_NAME, newReferencedBeanName, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setReferencedBeanName(ReferencedBeanNameType newReferencedBeanName) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__REFERENCED_BEAN_NAME, newReferencedBeanName);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public RendererType getRenderer() {
-		return (RendererType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__RENDERER, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newRenderer 
-     * @param msgs 
-     * @return the notification chain
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetRenderer(RendererType newRenderer, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__RENDERER, newRenderer, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setRenderer(RendererType newRenderer) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__RENDERER, newRenderer);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public RendererClassType getRendererClass() {
-		return (RendererClassType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__RENDERER_CLASS, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newRendererClass 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetRendererClass(RendererClassType newRendererClass, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__RENDERER_CLASS, newRendererClass, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setRendererClass(RendererClassType newRendererClass) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__RENDERER_CLASS, newRendererClass);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public RendererExtensionType getRendererExtension() {
-		return (RendererExtensionType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__RENDERER_EXTENSION, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newRendererExtension 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetRendererExtension(RendererExtensionType newRendererExtension, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__RENDERER_EXTENSION, newRendererExtension, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setRendererExtension(RendererExtensionType newRendererExtension) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__RENDERER_EXTENSION, newRendererExtension);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public RendererTypeType getRendererType() {
-		return (RendererTypeType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__RENDERER_TYPE, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newRendererType 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetRendererType(RendererTypeType newRendererType, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__RENDERER_TYPE, newRendererType, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setRendererType(RendererTypeType newRendererType) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__RENDERER_TYPE, newRendererType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public RenderKitType getRenderKit() {
-		return (RenderKitType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__RENDER_KIT, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newRenderKit 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetRenderKit(RenderKitType newRenderKit, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__RENDER_KIT, newRenderKit, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setRenderKit(RenderKitType newRenderKit) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__RENDER_KIT, newRenderKit);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public RenderKitClassType getRenderKitClass() {
-		return (RenderKitClassType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__RENDER_KIT_CLASS, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newRenderKitClass 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetRenderKitClass(RenderKitClassType newRenderKitClass, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__RENDER_KIT_CLASS, newRenderKitClass, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setRenderKitClass(RenderKitClassType newRenderKitClass) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__RENDER_KIT_CLASS, newRenderKitClass);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public RenderKitFactoryType getRenderKitFactory() {
-		return (RenderKitFactoryType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__RENDER_KIT_FACTORY, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newRenderKitFactory 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetRenderKitFactory(RenderKitFactoryType newRenderKitFactory, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__RENDER_KIT_FACTORY, newRenderKitFactory, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setRenderKitFactory(RenderKitFactoryType newRenderKitFactory) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__RENDER_KIT_FACTORY, newRenderKitFactory);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public RenderKitIdType getRenderKitId() {
-		return (RenderKitIdType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__RENDER_KIT_ID, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newRenderKitId 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetRenderKitId(RenderKitIdType newRenderKitId, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__RENDER_KIT_ID, newRenderKitId, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setRenderKitId(RenderKitIdType newRenderKitId) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__RENDER_KIT_ID, newRenderKitId);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceHandlerType getResourceHandler() {
-		return (ResourceHandlerType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__RESOURCE_HANDLER, true);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * @param newResourceHandler 
-	 * @param msgs 
-	 * @return NotificationChain
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetResourceHandler(ResourceHandlerType newResourceHandler, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__RESOURCE_HANDLER, newResourceHandler, msgs);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setResourceHandler(ResourceHandlerType newResourceHandler) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__RESOURCE_HANDLER, newResourceHandler);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public SmallIconType getSmallIcon() {
-		return (SmallIconType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__SMALL_ICON, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newSmallIcon 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetSmallIcon(SmallIconType newSmallIcon, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__SMALL_ICON, newSmallIcon, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setSmallIcon(SmallIconType newSmallIcon) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__SMALL_ICON, newSmallIcon);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public SourceClassType getSourceClass() {
-		return (SourceClassType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__SOURCE_CLASS, true);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * @param newSourceClass 
-	 * @param msgs 
-	 * @return NotificationChain
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetSourceClass(SourceClassType newSourceClass, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__SOURCE_CLASS, newSourceClass, msgs);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setSourceClass(SourceClassType newSourceClass) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__SOURCE_CLASS, newSourceClass);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public StateManagerType getStateManager() {
-		return (StateManagerType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__STATE_MANAGER, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newStateManager 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetStateManager(StateManagerType newStateManager, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__STATE_MANAGER, newStateManager, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setStateManager(StateManagerType newStateManager) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__STATE_MANAGER, newStateManager);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public SuggestedValueType getSuggestedValue() {
-		return (SuggestedValueType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__SUGGESTED_VALUE, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newSuggestedValue 
-     * @param msgs 
-     * @return the notification chain
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetSuggestedValue(SuggestedValueType newSuggestedValue, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__SUGGESTED_VALUE, newSuggestedValue, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setSuggestedValue(SuggestedValueType newSuggestedValue) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__SUGGESTED_VALUE, newSuggestedValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public SupportedLocaleType getSupportedLocale() {
-		return (SupportedLocaleType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__SUPPORTED_LOCALE, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newSupportedLocale 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetSupportedLocale(SupportedLocaleType newSupportedLocale, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__SUPPORTED_LOCALE, newSupportedLocale, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setSupportedLocale(SupportedLocaleType newSupportedLocale) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__SUPPORTED_LOCALE, newSupportedLocale);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public SystemEventClassType getSystemEventClass() {
-		return (SystemEventClassType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__SYSTEM_EVENT_CLASS, true);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @param newSystemEventClass 
-	 * @param msgs 
-	 * @return NotificationChain
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetSystemEventClass(SystemEventClassType newSystemEventClass, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__SYSTEM_EVENT_CLASS, newSystemEventClass, msgs);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setSystemEventClass(SystemEventClassType newSystemEventClass) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__SYSTEM_EVENT_CLASS, newSystemEventClass);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public SystemEventListenerType getSystemEventListener() {
-		return (SystemEventListenerType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__SYSTEM_EVENT_LISTENER, true);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * @param newSystemEventListener 
-	 * @param msgs 
-	 * @return NotificationChain
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetSystemEventListener(SystemEventListenerType newSystemEventListener, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__SYSTEM_EVENT_LISTENER, newSystemEventListener, msgs);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setSystemEventListener(SystemEventListenerType newSystemEventListener) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__SYSTEM_EVENT_LISTENER, newSystemEventListener);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public SystemEventListenerClassType getSystemEventListenerClass() {
-		return (SystemEventListenerClassType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__SYSTEM_EVENT_LISTENER_CLASS, true);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * @param newSystemEventListenerClass 
-	 * @param msgs 
-	 * @return NotificationChain
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetSystemEventListenerClass(SystemEventListenerClassType newSystemEventListenerClass, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__SYSTEM_EVENT_LISTENER_CLASS, newSystemEventListenerClass, msgs);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setSystemEventListenerClass(SystemEventListenerClassType newSystemEventListenerClass) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__SYSTEM_EVENT_LISTENER_CLASS, newSystemEventListenerClass);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public TagHandlerDelegateFactoryType getTagHandlerDelegateFactory() {
-		return (TagHandlerDelegateFactoryType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__TAG_HANDLER_DELEGATE_FACTORY, true);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * @param newTagHandlerDelegateFactory 
-	 * @param msgs 
-	 * @return NotificationChain
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetTagHandlerDelegateFactory(TagHandlerDelegateFactoryType newTagHandlerDelegateFactory, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__TAG_HANDLER_DELEGATE_FACTORY, newTagHandlerDelegateFactory, msgs);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTagHandlerDelegateFactory(TagHandlerDelegateFactoryType newTagHandlerDelegateFactory) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__TAG_HANDLER_DELEGATE_FACTORY, newTagHandlerDelegateFactory);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ToViewIdType getToViewId() {
-		return (ToViewIdType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__TO_VIEW_ID, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newToViewId 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetToViewId(ToViewIdType newToViewId, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__TO_VIEW_ID, newToViewId, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setToViewId(ToViewIdType newToViewId) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__TO_VIEW_ID, newToViewId);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ValidatorType getValidator() {
-		return (ValidatorType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__VALIDATOR, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newValidator 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetValidator(ValidatorType newValidator, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__VALIDATOR, newValidator, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setValidator(ValidatorType newValidator) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__VALIDATOR, newValidator);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ValidatorClassType getValidatorClass() {
-		return (ValidatorClassType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__VALIDATOR_CLASS, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newValidatorClass 
-     * @param msgs 
-     * @return NotificationChain
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetValidatorClass(ValidatorClassType newValidatorClass, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__VALIDATOR_CLASS, newValidatorClass, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setValidatorClass(ValidatorClassType newValidatorClass) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__VALIDATOR_CLASS, newValidatorClass);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ValidatorIdType getValidatorId() {
-		return (ValidatorIdType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__VALIDATOR_ID, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newValidatorId 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetValidatorId(ValidatorIdType newValidatorId, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__VALIDATOR_ID, newValidatorId, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setValidatorId(ValidatorIdType newValidatorId) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__VALIDATOR_ID, newValidatorId);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ValueType getValue() {
-		return (ValueType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__VALUE, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newValue 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetValue(ValueType newValue, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__VALUE, newValue, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setValue(ValueType newValue) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__VALUE, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ValueClassType getValueClass() {
-		return (ValueClassType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__VALUE_CLASS, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newValueClass 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetValueClass(ValueClassType newValueClass, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__VALUE_CLASS, newValueClass, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setValueClass(ValueClassType newValueClass) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__VALUE_CLASS, newValueClass);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public VariableResolverType getVariableResolver() {
-		return (VariableResolverType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__VARIABLE_RESOLVER, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newVariableResolver 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetVariableResolver(VariableResolverType newVariableResolver, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__VARIABLE_RESOLVER, newVariableResolver, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setVariableResolver(VariableResolverType newVariableResolver) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__VARIABLE_RESOLVER, newVariableResolver);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ViewDeclarationLanguageFactoryType getViewDeclarationLanguageFactory() {
-		return (ViewDeclarationLanguageFactoryType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__VIEW_DECLARATION_LANGUAGE_FACTORY, true);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * @param newViewDeclarationLanguageFactory 
-	 * @param msgs 
-	 * @return NotificationChain
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetViewDeclarationLanguageFactory(ViewDeclarationLanguageFactoryType newViewDeclarationLanguageFactory, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__VIEW_DECLARATION_LANGUAGE_FACTORY, newViewDeclarationLanguageFactory, msgs);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setViewDeclarationLanguageFactory(ViewDeclarationLanguageFactoryType newViewDeclarationLanguageFactory) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__VIEW_DECLARATION_LANGUAGE_FACTORY, newViewDeclarationLanguageFactory);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ViewHandlerType getViewHandler() {
-		return (ViewHandlerType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__VIEW_HANDLER, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newViewHandler 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetViewHandler(ViewHandlerType newViewHandler, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__VIEW_HANDLER, newViewHandler, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setViewHandler(ViewHandlerType newViewHandler) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__VIEW_HANDLER, newViewHandler);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public VisitContextFactoryType getVisitContextFactory() {
-		return (VisitContextFactoryType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__VISIT_CONTEXT_FACTORY, true);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * @param newVisitContextFactory 
-	 * @param msgs 
-	 * @return NotificationChain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetVisitContextFactory(VisitContextFactoryType newVisitContextFactory, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__VISIT_CONTEXT_FACTORY, newVisitContextFactory, msgs);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setVisitContextFactory(VisitContextFactoryType newVisitContextFactory) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__VISIT_CONTEXT_FACTORY, newVisitContextFactory);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case FacesConfigPackage.DOCUMENT_ROOT__MIXED:
-				return ((InternalEList)getMixed()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__XMLNS_PREFIX_MAP:
-				return ((InternalEList)getXMLNSPrefixMap()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__XSI_SCHEMA_LOCATION:
-				return ((InternalEList)getXSISchemaLocation()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__ABSOLUTE_ORDERING:
-				return basicSetAbsoluteOrdering(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__ACTION_LISTENER:
-				return basicSetActionListener(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__APPLICATION:
-				return basicSetApplication(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__APPLICATION_FACTORY:
-				return basicSetApplicationFactory(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__ATTRIBUTE:
-				return basicSetAttribute(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__ATTRIBUTE_CLASS:
-				return basicSetAttributeClass(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__ATTRIBUTE_EXTENSION:
-				return basicSetAttributeExtension(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__ATTRIBUTE_NAME:
-				return basicSetAttributeName(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__BEHAVIOR:
-				return basicSetBehavior(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__BEHAVIOR_CLASS:
-				return basicSetBehaviorClass(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__BEHAVIOR_ID:
-				return basicSetBehaviorId(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__BEHAVIOR_EXTENSION:
-				return basicSetBehaviorExtension(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__COMPONENT:
-				return basicSetComponent(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__COMPONENT_CLASS:
-				return basicSetComponentClass(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__COMPONENT_EXTENSION:
-				return basicSetComponentExtension(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__COMPONENT_FAMILY:
-				return basicSetComponentFamily(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__COMPONENT_TYPE:
-				return basicSetComponentType(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__CONVERTER:
-				return basicSetConverter(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__CONVERTER_CLASS:
-				return basicSetConverterClass(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__CONVERTER_FOR_CLASS:
-				return basicSetConverterForClass(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__CONVERTER_ID:
-				return basicSetConverterId(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__DEFAULT_LOCALE:
-				return basicSetDefaultLocale(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__DEFAULT_RENDER_KIT_ID:
-				return basicSetDefaultRenderKitId(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__DEFAULT_VALIDATORS:
-				return basicSetDefaultValidators(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__DEFAULT_VALUE:
-				return basicSetDefaultValue(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__DESCRIPTION:
-				return basicSetDescription(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__DISPLAY_NAME:
-				return basicSetDisplayName(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__EXCEPTION_HANDLER_FACTORY:
-				return basicSetExceptionHandlerFactory(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__EXTERNAL_CONTEXT_FACTORY:
-				return basicSetExternalContextFactory(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__FACES_CONFIG:
-				return basicSetFacesConfig(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__FACES_CONTEXT_FACTORY:
-				return basicSetFacesContextFactory(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__FACET:
-				return basicSetFacet(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__FACET_EXTENSION:
-				return basicSetFacetExtension(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__FACET_NAME:
-				return basicSetFacetName(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__FACTORY:
-				return basicSetFactory(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__FROM_ACTION:
-				return basicSetFromAction(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__FROM_OUTCOME:
-				return basicSetFromOutcome(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__FROM_VIEW_ID:
-				return basicSetFromViewId(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__ICON:
-				return basicSetIcon(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__IF:
-				return basicSetIf(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__KEY:
-				return basicSetKey(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__KEY_CLASS:
-				return basicSetKeyClass(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__LARGE_ICON:
-				return basicSetLargeIcon(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__LIFECYCLE:
-				return basicSetLifecycle(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__LIFECYCLE_FACTORY:
-				return basicSetLifecycleFactory(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__LIST_ENTRIES:
-				return basicSetListEntries(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__LOCALE_CONFIG:
-				return basicSetLocaleConfig(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__MANAGED_BEAN:
-				return basicSetManagedBean(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__MANAGED_BEAN_CLASS:
-				return basicSetManagedBeanClass(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__MANAGED_BEAN_NAME:
-				return basicSetManagedBeanName(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__MANAGED_BEAN_SCOPE:
-				return basicSetManagedBeanScope(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__MANAGED_PROPERTY:
-				return basicSetManagedProperty(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__MAP_ENTRIES:
-				return basicSetMapEntries(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__MAP_ENTRY:
-				return basicSetMapEntry(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__MESSAGE_BUNDLE:
-				return basicSetMessageBundle(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__NAME:
-				return basicSetName(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__NAVIGATION_CASE:
-				return basicSetNavigationCase(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__NAVIGATION_HANDLER:
-				return basicSetNavigationHandler(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__NAVIGATION_RULE:
-				return basicSetNavigationRule(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__NULL_VALUE:
-				return basicSetNullValue(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__ORDERING:
-				return basicSetOrdering(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__ORDERING_ORDERING:
-				return basicSetOrderingOrdering(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__OTHERS:
-				return basicSetOthers(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__PARTIAL_VIEW_CONTEXT_FACTORY:
-				return basicSetPartialViewContextFactory(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__PHASE_LISTENER:
-				return basicSetPhaseListener(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__PROPERTY:
-				return basicSetProperty(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__PROPERTY_CLASS:
-				return basicSetPropertyClass(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__PROPERTY_EXTENSION:
-				return basicSetPropertyExtension(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__PROPERTY_NAME:
-				return basicSetPropertyName(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__PROPERTY_RESOLVER:
-				return basicSetPropertyResolver(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__REDIRECT:
-				return basicSetRedirect(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__REDIRECT_VIEW_PARAM:
-				return basicSetRedirectViewParam(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__REFERENCED_BEAN:
-				return basicSetReferencedBean(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__REFERENCED_BEAN_CLASS:
-				return basicSetReferencedBeanClass(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__REFERENCED_BEAN_NAME:
-				return basicSetReferencedBeanName(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__RENDERER:
-				return basicSetRenderer(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__RENDERER_CLASS:
-				return basicSetRendererClass(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__RENDERER_EXTENSION:
-				return basicSetRendererExtension(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__RENDERER_TYPE:
-				return basicSetRendererType(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__RENDER_KIT:
-				return basicSetRenderKit(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__RENDER_KIT_CLASS:
-				return basicSetRenderKitClass(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__RENDER_KIT_FACTORY:
-				return basicSetRenderKitFactory(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__RENDER_KIT_ID:
-				return basicSetRenderKitId(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__RESOURCE_HANDLER:
-				return basicSetResourceHandler(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__SMALL_ICON:
-				return basicSetSmallIcon(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__SOURCE_CLASS:
-				return basicSetSourceClass(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__STATE_MANAGER:
-				return basicSetStateManager(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__SUGGESTED_VALUE:
-				return basicSetSuggestedValue(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__SUPPORTED_LOCALE:
-				return basicSetSupportedLocale(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__SYSTEM_EVENT_CLASS:
-				return basicSetSystemEventClass(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__SYSTEM_EVENT_LISTENER:
-				return basicSetSystemEventListener(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__SYSTEM_EVENT_LISTENER_CLASS:
-				return basicSetSystemEventListenerClass(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__TAG_HANDLER_DELEGATE_FACTORY:
-				return basicSetTagHandlerDelegateFactory(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__TO_VIEW_ID:
-				return basicSetToViewId(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__VALIDATOR:
-				return basicSetValidator(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__VALIDATOR_CLASS:
-				return basicSetValidatorClass(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__VALIDATOR_ID:
-				return basicSetValidatorId(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__VALUE:
-				return basicSetValue(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__VALUE_CLASS:
-				return basicSetValueClass(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__VARIABLE_RESOLVER:
-				return basicSetVariableResolver(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__VIEW_DECLARATION_LANGUAGE_FACTORY:
-				return basicSetViewDeclarationLanguageFactory(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__VIEW_HANDLER:
-				return basicSetViewHandler(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__VISIT_CONTEXT_FACTORY:
-				return basicSetVisitContextFactory(null, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.DOCUMENT_ROOT__MIXED:
-				if (coreType) return getMixed();
-				return ((FeatureMap.Internal)getMixed()).getWrapper();
-			case FacesConfigPackage.DOCUMENT_ROOT__XMLNS_PREFIX_MAP:
-				if (coreType) return getXMLNSPrefixMap();
-				    return getXMLNSPrefixMap().map();
-			case FacesConfigPackage.DOCUMENT_ROOT__XSI_SCHEMA_LOCATION:
-				if (coreType) return getXSISchemaLocation();
-				     return getXSISchemaLocation().map();
-			case FacesConfigPackage.DOCUMENT_ROOT__ABSOLUTE_ORDERING:
-				return getAbsoluteOrdering();
-			case FacesConfigPackage.DOCUMENT_ROOT__ACTION_LISTENER:
-				return getActionListener();
-			case FacesConfigPackage.DOCUMENT_ROOT__APPLICATION:
-				return getApplication();
-			case FacesConfigPackage.DOCUMENT_ROOT__APPLICATION_FACTORY:
-				return getApplicationFactory();
-			case FacesConfigPackage.DOCUMENT_ROOT__ATTRIBUTE:
-				return getAttribute();
-			case FacesConfigPackage.DOCUMENT_ROOT__ATTRIBUTE_CLASS:
-				return getAttributeClass();
-			case FacesConfigPackage.DOCUMENT_ROOT__ATTRIBUTE_EXTENSION:
-				return getAttributeExtension();
-			case FacesConfigPackage.DOCUMENT_ROOT__ATTRIBUTE_NAME:
-				return getAttributeName();
-			case FacesConfigPackage.DOCUMENT_ROOT__BEHAVIOR:
-				return getBehavior();
-			case FacesConfigPackage.DOCUMENT_ROOT__BEHAVIOR_CLASS:
-				return getBehaviorClass();
-			case FacesConfigPackage.DOCUMENT_ROOT__BEHAVIOR_ID:
-				return getBehaviorId();
-			case FacesConfigPackage.DOCUMENT_ROOT__BEHAVIOR_EXTENSION:
-				return getBehaviorExtension();
-			case FacesConfigPackage.DOCUMENT_ROOT__COMPONENT:
-				return getComponent();
-			case FacesConfigPackage.DOCUMENT_ROOT__COMPONENT_CLASS:
-				return getComponentClass();
-			case FacesConfigPackage.DOCUMENT_ROOT__COMPONENT_EXTENSION:
-				return getComponentExtension();
-			case FacesConfigPackage.DOCUMENT_ROOT__COMPONENT_FAMILY:
-				return getComponentFamily();
-			case FacesConfigPackage.DOCUMENT_ROOT__COMPONENT_TYPE:
-				return getComponentType();
-			case FacesConfigPackage.DOCUMENT_ROOT__CONVERTER:
-				return getConverter();
-			case FacesConfigPackage.DOCUMENT_ROOT__CONVERTER_CLASS:
-				return getConverterClass();
-			case FacesConfigPackage.DOCUMENT_ROOT__CONVERTER_FOR_CLASS:
-				return getConverterForClass();
-			case FacesConfigPackage.DOCUMENT_ROOT__CONVERTER_ID:
-				return getConverterId();
-			case FacesConfigPackage.DOCUMENT_ROOT__DEFAULT_LOCALE:
-				return getDefaultLocale();
-			case FacesConfigPackage.DOCUMENT_ROOT__DEFAULT_RENDER_KIT_ID:
-				return getDefaultRenderKitId();
-			case FacesConfigPackage.DOCUMENT_ROOT__DEFAULT_VALIDATORS:
-				return getDefaultValidators();
-			case FacesConfigPackage.DOCUMENT_ROOT__DEFAULT_VALUE:
-				return getDefaultValue();
-			case FacesConfigPackage.DOCUMENT_ROOT__DESCRIPTION:
-				return getDescription();
-			case FacesConfigPackage.DOCUMENT_ROOT__DISPLAY_NAME:
-				return getDisplayName();
-			case FacesConfigPackage.DOCUMENT_ROOT__EXCEPTION_HANDLER_FACTORY:
-				return getExceptionHandlerFactory();
-			case FacesConfigPackage.DOCUMENT_ROOT__EXTERNAL_CONTEXT_FACTORY:
-				return getExternalContextFactory();
-			case FacesConfigPackage.DOCUMENT_ROOT__FACES_CONFIG:
-				return getFacesConfig();
-			case FacesConfigPackage.DOCUMENT_ROOT__FACES_CONTEXT_FACTORY:
-				return getFacesContextFactory();
-			case FacesConfigPackage.DOCUMENT_ROOT__FACET:
-				return getFacet();
-			case FacesConfigPackage.DOCUMENT_ROOT__FACET_EXTENSION:
-				return getFacetExtension();
-			case FacesConfigPackage.DOCUMENT_ROOT__FACET_NAME:
-				return getFacetName();
-			case FacesConfigPackage.DOCUMENT_ROOT__FACTORY:
-				return getFactory();
-			case FacesConfigPackage.DOCUMENT_ROOT__FROM_ACTION:
-				return getFromAction();
-			case FacesConfigPackage.DOCUMENT_ROOT__FROM_OUTCOME:
-				return getFromOutcome();
-			case FacesConfigPackage.DOCUMENT_ROOT__FROM_VIEW_ID:
-				return getFromViewId();
-			case FacesConfigPackage.DOCUMENT_ROOT__ICON:
-				return getIcon();
-			case FacesConfigPackage.DOCUMENT_ROOT__IF:
-				return getIf();
-			case FacesConfigPackage.DOCUMENT_ROOT__KEY:
-				return getKey();
-			case FacesConfigPackage.DOCUMENT_ROOT__KEY_CLASS:
-				return getKeyClass();
-			case FacesConfigPackage.DOCUMENT_ROOT__LARGE_ICON:
-				return getLargeIcon();
-			case FacesConfigPackage.DOCUMENT_ROOT__LIFECYCLE:
-				return getLifecycle();
-			case FacesConfigPackage.DOCUMENT_ROOT__LIFECYCLE_FACTORY:
-				return getLifecycleFactory();
-			case FacesConfigPackage.DOCUMENT_ROOT__LIST_ENTRIES:
-				return getListEntries();
-			case FacesConfigPackage.DOCUMENT_ROOT__LOCALE_CONFIG:
-				return getLocaleConfig();
-			case FacesConfigPackage.DOCUMENT_ROOT__MANAGED_BEAN:
-				return getManagedBean();
-			case FacesConfigPackage.DOCUMENT_ROOT__MANAGED_BEAN_CLASS:
-				return getManagedBeanClass();
-			case FacesConfigPackage.DOCUMENT_ROOT__MANAGED_BEAN_NAME:
-				return getManagedBeanName();
-			case FacesConfigPackage.DOCUMENT_ROOT__MANAGED_BEAN_SCOPE:
-				return getManagedBeanScope();
-			case FacesConfigPackage.DOCUMENT_ROOT__MANAGED_PROPERTY:
-				return getManagedProperty();
-			case FacesConfigPackage.DOCUMENT_ROOT__MAP_ENTRIES:
-				return getMapEntries();
-			case FacesConfigPackage.DOCUMENT_ROOT__MAP_ENTRY:
-				return getMapEntry();
-			case FacesConfigPackage.DOCUMENT_ROOT__MESSAGE_BUNDLE:
-				return getMessageBundle();
-			case FacesConfigPackage.DOCUMENT_ROOT__NAME:
-				return getName();
-			case FacesConfigPackage.DOCUMENT_ROOT__NAVIGATION_CASE:
-				return getNavigationCase();
-			case FacesConfigPackage.DOCUMENT_ROOT__NAVIGATION_HANDLER:
-				return getNavigationHandler();
-			case FacesConfigPackage.DOCUMENT_ROOT__NAVIGATION_RULE:
-				return getNavigationRule();
-			case FacesConfigPackage.DOCUMENT_ROOT__NULL_VALUE:
-				return getNullValue();
-			case FacesConfigPackage.DOCUMENT_ROOT__ORDERING:
-				return getOrdering();
-			case FacesConfigPackage.DOCUMENT_ROOT__ORDERING_ORDERING:
-				return getOrderingOrdering();
-			case FacesConfigPackage.DOCUMENT_ROOT__OTHERS:
-				return getOthers();
-			case FacesConfigPackage.DOCUMENT_ROOT__PARTIAL_VIEW_CONTEXT_FACTORY:
-				return getPartialViewContextFactory();
-			case FacesConfigPackage.DOCUMENT_ROOT__PHASE_LISTENER:
-				return getPhaseListener();
-			case FacesConfigPackage.DOCUMENT_ROOT__PROPERTY:
-				return getProperty();
-			case FacesConfigPackage.DOCUMENT_ROOT__PROPERTY_CLASS:
-				return getPropertyClass();
-			case FacesConfigPackage.DOCUMENT_ROOT__PROPERTY_EXTENSION:
-				return getPropertyExtension();
-			case FacesConfigPackage.DOCUMENT_ROOT__PROPERTY_NAME:
-				return getPropertyName();
-			case FacesConfigPackage.DOCUMENT_ROOT__PROPERTY_RESOLVER:
-				return getPropertyResolver();
-			case FacesConfigPackage.DOCUMENT_ROOT__REDIRECT:
-				return getRedirect();
-			case FacesConfigPackage.DOCUMENT_ROOT__REDIRECT_VIEW_PARAM:
-				return getRedirectViewParam();
-			case FacesConfigPackage.DOCUMENT_ROOT__REFERENCED_BEAN:
-				return getReferencedBean();
-			case FacesConfigPackage.DOCUMENT_ROOT__REFERENCED_BEAN_CLASS:
-				return getReferencedBeanClass();
-			case FacesConfigPackage.DOCUMENT_ROOT__REFERENCED_BEAN_NAME:
-				return getReferencedBeanName();
-			case FacesConfigPackage.DOCUMENT_ROOT__RENDERER:
-				return getRenderer();
-			case FacesConfigPackage.DOCUMENT_ROOT__RENDERER_CLASS:
-				return getRendererClass();
-			case FacesConfigPackage.DOCUMENT_ROOT__RENDERER_EXTENSION:
-				return getRendererExtension();
-			case FacesConfigPackage.DOCUMENT_ROOT__RENDERER_TYPE:
-				return getRendererType();
-			case FacesConfigPackage.DOCUMENT_ROOT__RENDER_KIT:
-				return getRenderKit();
-			case FacesConfigPackage.DOCUMENT_ROOT__RENDER_KIT_CLASS:
-				return getRenderKitClass();
-			case FacesConfigPackage.DOCUMENT_ROOT__RENDER_KIT_FACTORY:
-				return getRenderKitFactory();
-			case FacesConfigPackage.DOCUMENT_ROOT__RENDER_KIT_ID:
-				return getRenderKitId();
-			case FacesConfigPackage.DOCUMENT_ROOT__RESOURCE_HANDLER:
-				return getResourceHandler();
-			case FacesConfigPackage.DOCUMENT_ROOT__SMALL_ICON:
-				return getSmallIcon();
-			case FacesConfigPackage.DOCUMENT_ROOT__SOURCE_CLASS:
-				return getSourceClass();
-			case FacesConfigPackage.DOCUMENT_ROOT__STATE_MANAGER:
-				return getStateManager();
-			case FacesConfigPackage.DOCUMENT_ROOT__SUGGESTED_VALUE:
-				return getSuggestedValue();
-			case FacesConfigPackage.DOCUMENT_ROOT__SUPPORTED_LOCALE:
-				return getSupportedLocale();
-			case FacesConfigPackage.DOCUMENT_ROOT__SYSTEM_EVENT_CLASS:
-				return getSystemEventClass();
-			case FacesConfigPackage.DOCUMENT_ROOT__SYSTEM_EVENT_LISTENER:
-				return getSystemEventListener();
-			case FacesConfigPackage.DOCUMENT_ROOT__SYSTEM_EVENT_LISTENER_CLASS:
-				return getSystemEventListenerClass();
-			case FacesConfigPackage.DOCUMENT_ROOT__TAG_HANDLER_DELEGATE_FACTORY:
-				return getTagHandlerDelegateFactory();
-			case FacesConfigPackage.DOCUMENT_ROOT__TO_VIEW_ID:
-				return getToViewId();
-			case FacesConfigPackage.DOCUMENT_ROOT__VALIDATOR:
-				return getValidator();
-			case FacesConfigPackage.DOCUMENT_ROOT__VALIDATOR_CLASS:
-				return getValidatorClass();
-			case FacesConfigPackage.DOCUMENT_ROOT__VALIDATOR_ID:
-				return getValidatorId();
-			case FacesConfigPackage.DOCUMENT_ROOT__VALUE:
-				return getValue();
-			case FacesConfigPackage.DOCUMENT_ROOT__VALUE_CLASS:
-				return getValueClass();
-			case FacesConfigPackage.DOCUMENT_ROOT__VARIABLE_RESOLVER:
-				return getVariableResolver();
-			case FacesConfigPackage.DOCUMENT_ROOT__VIEW_DECLARATION_LANGUAGE_FACTORY:
-				return getViewDeclarationLanguageFactory();
-			case FacesConfigPackage.DOCUMENT_ROOT__VIEW_HANDLER:
-				return getViewHandler();
-			case FacesConfigPackage.DOCUMENT_ROOT__VISIT_CONTEXT_FACTORY:
-				return getVisitContextFactory();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.DOCUMENT_ROOT__MIXED:
-				((FeatureMap.Internal)getMixed()).set(newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__XMLNS_PREFIX_MAP:
-				((EStructuralFeature.Setting)getXMLNSPrefixMap()).set(newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__XSI_SCHEMA_LOCATION:
-				((EStructuralFeature.Setting)getXSISchemaLocation()).set(newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__ABSOLUTE_ORDERING:
-				setAbsoluteOrdering((AbsoluteOrderingType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__ACTION_LISTENER:
-				setActionListener((ActionListenerType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__APPLICATION:
-				setApplication((ApplicationType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__APPLICATION_FACTORY:
-				setApplicationFactory((ApplicationFactoryType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__ATTRIBUTE:
-				setAttribute((AttributeType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__ATTRIBUTE_CLASS:
-				setAttributeClass((AttributeClassType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__ATTRIBUTE_EXTENSION:
-				setAttributeExtension((AttributeExtensionType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__ATTRIBUTE_NAME:
-				setAttributeName((AttributeNameType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__BEHAVIOR:
-				setBehavior((BehaviorType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__BEHAVIOR_CLASS:
-				setBehaviorClass((BehaviorClassType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__BEHAVIOR_ID:
-				setBehaviorId((BehaviorIdType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__BEHAVIOR_EXTENSION:
-				setBehaviorExtension((BehaviorExtensionType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__COMPONENT:
-				setComponent((ComponentType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__COMPONENT_CLASS:
-				setComponentClass((ComponentClassType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__COMPONENT_EXTENSION:
-				setComponentExtension((ComponentExtensionType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__COMPONENT_FAMILY:
-				setComponentFamily((ComponentFamilyType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__COMPONENT_TYPE:
-				setComponentType((ComponentTypeType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__CONVERTER:
-				setConverter((ConverterType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__CONVERTER_CLASS:
-				setConverterClass((ConverterClassType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__CONVERTER_FOR_CLASS:
-				setConverterForClass((ConverterForClassType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__CONVERTER_ID:
-				setConverterId((ConverterIdType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__DEFAULT_LOCALE:
-				setDefaultLocale((DefaultLocaleType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__DEFAULT_RENDER_KIT_ID:
-				setDefaultRenderKitId((DefaultRenderKitIdType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__DEFAULT_VALIDATORS:
-				setDefaultValidators((DefaultValidatorsType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__DEFAULT_VALUE:
-				setDefaultValue((DefaultValueType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__DESCRIPTION:
-				setDescription((DescriptionType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__DISPLAY_NAME:
-				setDisplayName((DisplayNameType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__EXCEPTION_HANDLER_FACTORY:
-				setExceptionHandlerFactory((ExceptionHandlerFactoryType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__EXTERNAL_CONTEXT_FACTORY:
-				setExternalContextFactory((ExternalContextFactoryType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__FACES_CONFIG:
-				setFacesConfig((FacesConfigType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__FACES_CONTEXT_FACTORY:
-				setFacesContextFactory((FacesContextFactoryType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__FACET:
-				setFacet((FacetType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__FACET_EXTENSION:
-				setFacetExtension((FacetExtensionType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__FACET_NAME:
-				setFacetName((FacetNameType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__FACTORY:
-				setFactory((FactoryType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__FROM_ACTION:
-				setFromAction((FromActionType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__FROM_OUTCOME:
-				setFromOutcome((FromOutcomeType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__FROM_VIEW_ID:
-				setFromViewId((FromViewIdType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__ICON:
-				setIcon((IconType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__IF:
-				setIf((IfType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__KEY:
-				setKey((KeyType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__KEY_CLASS:
-				setKeyClass((KeyClassType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__LARGE_ICON:
-				setLargeIcon((LargeIconType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__LIFECYCLE:
-				setLifecycle((LifecycleType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__LIFECYCLE_FACTORY:
-				setLifecycleFactory((LifecycleFactoryType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__LIST_ENTRIES:
-				setListEntries((ListEntriesType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__LOCALE_CONFIG:
-				setLocaleConfig((LocaleConfigType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__MANAGED_BEAN:
-				setManagedBean((ManagedBeanType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__MANAGED_BEAN_CLASS:
-				setManagedBeanClass((ManagedBeanClassType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__MANAGED_BEAN_NAME:
-				setManagedBeanName((ManagedBeanNameType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__MANAGED_BEAN_SCOPE:
-				setManagedBeanScope((ManagedBeanScopeType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__MANAGED_PROPERTY:
-				setManagedProperty((ManagedPropertyType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__MAP_ENTRIES:
-				setMapEntries((MapEntriesType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__MAP_ENTRY:
-				setMapEntry((MapEntryType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__MESSAGE_BUNDLE:
-				setMessageBundle((MessageBundleType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__NAME:
-				setName((NameType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__NAVIGATION_CASE:
-				setNavigationCase((NavigationCaseType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__NAVIGATION_HANDLER:
-				setNavigationHandler((NavigationHandlerType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__NAVIGATION_RULE:
-				setNavigationRule((NavigationRuleType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__NULL_VALUE:
-				setNullValue((NullValueType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__ORDERING:
-				setOrdering((OrderingType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__ORDERING_ORDERING:
-				setOrderingOrdering((OrderingOrderingType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__OTHERS:
-				setOthers((OrderingOthersType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__PARTIAL_VIEW_CONTEXT_FACTORY:
-				setPartialViewContextFactory((PartialViewContextFactoryType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__PHASE_LISTENER:
-				setPhaseListener((PhaseListenerType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__PROPERTY:
-				setProperty((PropertyType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__PROPERTY_CLASS:
-				setPropertyClass((PropertyClassType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__PROPERTY_EXTENSION:
-				setPropertyExtension((PropertyExtensionType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__PROPERTY_NAME:
-				setPropertyName((PropertyNameType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__PROPERTY_RESOLVER:
-				setPropertyResolver((PropertyResolverType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__REDIRECT:
-				setRedirect((RedirectType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__REDIRECT_VIEW_PARAM:
-				setRedirectViewParam((RedirectViewParamType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__REFERENCED_BEAN:
-				setReferencedBean((ReferencedBeanType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__REFERENCED_BEAN_CLASS:
-				setReferencedBeanClass((ReferencedBeanClassType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__REFERENCED_BEAN_NAME:
-				setReferencedBeanName((ReferencedBeanNameType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__RENDERER:
-				setRenderer((RendererType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__RENDERER_CLASS:
-				setRendererClass((RendererClassType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__RENDERER_EXTENSION:
-				setRendererExtension((RendererExtensionType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__RENDERER_TYPE:
-				setRendererType((RendererTypeType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__RENDER_KIT:
-				setRenderKit((RenderKitType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__RENDER_KIT_CLASS:
-				setRenderKitClass((RenderKitClassType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__RENDER_KIT_FACTORY:
-				setRenderKitFactory((RenderKitFactoryType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__RENDER_KIT_ID:
-				setRenderKitId((RenderKitIdType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__RESOURCE_HANDLER:
-				setResourceHandler((ResourceHandlerType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__SMALL_ICON:
-				setSmallIcon((SmallIconType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__SOURCE_CLASS:
-				setSourceClass((SourceClassType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__STATE_MANAGER:
-				setStateManager((StateManagerType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__SUGGESTED_VALUE:
-				setSuggestedValue((SuggestedValueType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__SUPPORTED_LOCALE:
-				setSupportedLocale((SupportedLocaleType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__SYSTEM_EVENT_CLASS:
-				setSystemEventClass((SystemEventClassType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__SYSTEM_EVENT_LISTENER:
-				setSystemEventListener((SystemEventListenerType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__SYSTEM_EVENT_LISTENER_CLASS:
-				setSystemEventListenerClass((SystemEventListenerClassType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__TAG_HANDLER_DELEGATE_FACTORY:
-				setTagHandlerDelegateFactory((TagHandlerDelegateFactoryType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__TO_VIEW_ID:
-				setToViewId((ToViewIdType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__VALIDATOR:
-				setValidator((ValidatorType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__VALIDATOR_CLASS:
-				setValidatorClass((ValidatorClassType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__VALIDATOR_ID:
-				setValidatorId((ValidatorIdType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__VALUE:
-				setValue((ValueType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__VALUE_CLASS:
-				setValueClass((ValueClassType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__VARIABLE_RESOLVER:
-				setVariableResolver((VariableResolverType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__VIEW_DECLARATION_LANGUAGE_FACTORY:
-				setViewDeclarationLanguageFactory((ViewDeclarationLanguageFactoryType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__VIEW_HANDLER:
-				setViewHandler((ViewHandlerType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__VISIT_CONTEXT_FACTORY:
-				setVisitContextFactory((VisitContextFactoryType)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.DOCUMENT_ROOT__MIXED:
-				getMixed().clear();
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__XMLNS_PREFIX_MAP:
-				getXMLNSPrefixMap().clear();
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__XSI_SCHEMA_LOCATION:
-				getXSISchemaLocation().clear();
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__ABSOLUTE_ORDERING:
-				setAbsoluteOrdering((AbsoluteOrderingType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__ACTION_LISTENER:
-				setActionListener((ActionListenerType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__APPLICATION:
-				setApplication((ApplicationType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__APPLICATION_FACTORY:
-				setApplicationFactory((ApplicationFactoryType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__ATTRIBUTE:
-				setAttribute((AttributeType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__ATTRIBUTE_CLASS:
-				setAttributeClass((AttributeClassType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__ATTRIBUTE_EXTENSION:
-				setAttributeExtension((AttributeExtensionType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__ATTRIBUTE_NAME:
-				setAttributeName((AttributeNameType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__BEHAVIOR:
-				setBehavior((BehaviorType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__BEHAVIOR_CLASS:
-				setBehaviorClass((BehaviorClassType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__BEHAVIOR_ID:
-				setBehaviorId((BehaviorIdType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__BEHAVIOR_EXTENSION:
-				setBehaviorExtension((BehaviorExtensionType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__COMPONENT:
-				setComponent((ComponentType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__COMPONENT_CLASS:
-				setComponentClass((ComponentClassType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__COMPONENT_EXTENSION:
-				setComponentExtension((ComponentExtensionType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__COMPONENT_FAMILY:
-				setComponentFamily((ComponentFamilyType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__COMPONENT_TYPE:
-				setComponentType((ComponentTypeType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__CONVERTER:
-				setConverter((ConverterType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__CONVERTER_CLASS:
-				setConverterClass((ConverterClassType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__CONVERTER_FOR_CLASS:
-				setConverterForClass((ConverterForClassType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__CONVERTER_ID:
-				setConverterId((ConverterIdType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__DEFAULT_LOCALE:
-				setDefaultLocale((DefaultLocaleType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__DEFAULT_RENDER_KIT_ID:
-				setDefaultRenderKitId((DefaultRenderKitIdType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__DEFAULT_VALIDATORS:
-				setDefaultValidators((DefaultValidatorsType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__DEFAULT_VALUE:
-				setDefaultValue((DefaultValueType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__DESCRIPTION:
-				setDescription((DescriptionType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__DISPLAY_NAME:
-				setDisplayName((DisplayNameType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__EXCEPTION_HANDLER_FACTORY:
-				setExceptionHandlerFactory((ExceptionHandlerFactoryType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__EXTERNAL_CONTEXT_FACTORY:
-				setExternalContextFactory((ExternalContextFactoryType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__FACES_CONFIG:
-				setFacesConfig((FacesConfigType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__FACES_CONTEXT_FACTORY:
-				setFacesContextFactory((FacesContextFactoryType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__FACET:
-				setFacet((FacetType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__FACET_EXTENSION:
-				setFacetExtension((FacetExtensionType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__FACET_NAME:
-				setFacetName((FacetNameType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__FACTORY:
-				setFactory((FactoryType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__FROM_ACTION:
-				setFromAction((FromActionType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__FROM_OUTCOME:
-				setFromOutcome((FromOutcomeType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__FROM_VIEW_ID:
-				setFromViewId((FromViewIdType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__ICON:
-				setIcon((IconType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__IF:
-				setIf((IfType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__KEY:
-				setKey((KeyType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__KEY_CLASS:
-				setKeyClass((KeyClassType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__LARGE_ICON:
-				setLargeIcon((LargeIconType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__LIFECYCLE:
-				setLifecycle((LifecycleType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__LIFECYCLE_FACTORY:
-				setLifecycleFactory((LifecycleFactoryType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__LIST_ENTRIES:
-				setListEntries((ListEntriesType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__LOCALE_CONFIG:
-				setLocaleConfig((LocaleConfigType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__MANAGED_BEAN:
-				setManagedBean((ManagedBeanType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__MANAGED_BEAN_CLASS:
-				setManagedBeanClass((ManagedBeanClassType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__MANAGED_BEAN_NAME:
-				setManagedBeanName((ManagedBeanNameType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__MANAGED_BEAN_SCOPE:
-				setManagedBeanScope((ManagedBeanScopeType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__MANAGED_PROPERTY:
-				setManagedProperty((ManagedPropertyType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__MAP_ENTRIES:
-				setMapEntries((MapEntriesType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__MAP_ENTRY:
-				setMapEntry((MapEntryType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__MESSAGE_BUNDLE:
-				setMessageBundle((MessageBundleType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__NAME:
-				setName((NameType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__NAVIGATION_CASE:
-				setNavigationCase((NavigationCaseType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__NAVIGATION_HANDLER:
-				setNavigationHandler((NavigationHandlerType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__NAVIGATION_RULE:
-				setNavigationRule((NavigationRuleType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__NULL_VALUE:
-				setNullValue((NullValueType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__ORDERING:
-				setOrdering((OrderingType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__ORDERING_ORDERING:
-				setOrderingOrdering((OrderingOrderingType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__OTHERS:
-				setOthers((OrderingOthersType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__PARTIAL_VIEW_CONTEXT_FACTORY:
-				setPartialViewContextFactory((PartialViewContextFactoryType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__PHASE_LISTENER:
-				setPhaseListener((PhaseListenerType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__PROPERTY:
-				setProperty((PropertyType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__PROPERTY_CLASS:
-				setPropertyClass((PropertyClassType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__PROPERTY_EXTENSION:
-				setPropertyExtension((PropertyExtensionType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__PROPERTY_NAME:
-				setPropertyName((PropertyNameType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__PROPERTY_RESOLVER:
-				setPropertyResolver((PropertyResolverType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__REDIRECT:
-				setRedirect((RedirectType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__REDIRECT_VIEW_PARAM:
-				setRedirectViewParam((RedirectViewParamType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__REFERENCED_BEAN:
-				setReferencedBean((ReferencedBeanType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__REFERENCED_BEAN_CLASS:
-				setReferencedBeanClass((ReferencedBeanClassType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__REFERENCED_BEAN_NAME:
-				setReferencedBeanName((ReferencedBeanNameType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__RENDERER:
-				setRenderer((RendererType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__RENDERER_CLASS:
-				setRendererClass((RendererClassType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__RENDERER_EXTENSION:
-				setRendererExtension((RendererExtensionType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__RENDERER_TYPE:
-				setRendererType((RendererTypeType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__RENDER_KIT:
-				setRenderKit((RenderKitType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__RENDER_KIT_CLASS:
-				setRenderKitClass((RenderKitClassType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__RENDER_KIT_FACTORY:
-				setRenderKitFactory((RenderKitFactoryType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__RENDER_KIT_ID:
-				setRenderKitId((RenderKitIdType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__RESOURCE_HANDLER:
-				setResourceHandler((ResourceHandlerType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__SMALL_ICON:
-				setSmallIcon((SmallIconType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__SOURCE_CLASS:
-				setSourceClass((SourceClassType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__STATE_MANAGER:
-				setStateManager((StateManagerType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__SUGGESTED_VALUE:
-				setSuggestedValue((SuggestedValueType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__SUPPORTED_LOCALE:
-				setSupportedLocale((SupportedLocaleType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__SYSTEM_EVENT_CLASS:
-				setSystemEventClass((SystemEventClassType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__SYSTEM_EVENT_LISTENER:
-				setSystemEventListener((SystemEventListenerType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__SYSTEM_EVENT_LISTENER_CLASS:
-				setSystemEventListenerClass((SystemEventListenerClassType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__TAG_HANDLER_DELEGATE_FACTORY:
-				setTagHandlerDelegateFactory((TagHandlerDelegateFactoryType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__TO_VIEW_ID:
-				setToViewId((ToViewIdType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__VALIDATOR:
-				setValidator((ValidatorType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__VALIDATOR_CLASS:
-				setValidatorClass((ValidatorClassType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__VALIDATOR_ID:
-				setValidatorId((ValidatorIdType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__VALUE:
-				setValue((ValueType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__VALUE_CLASS:
-				setValueClass((ValueClassType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__VARIABLE_RESOLVER:
-				setVariableResolver((VariableResolverType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__VIEW_DECLARATION_LANGUAGE_FACTORY:
-				setViewDeclarationLanguageFactory((ViewDeclarationLanguageFactoryType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__VIEW_HANDLER:
-				setViewHandler((ViewHandlerType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__VISIT_CONTEXT_FACTORY:
-				setVisitContextFactory((VisitContextFactoryType)null);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.DOCUMENT_ROOT__MIXED:
-				return mixed != null && !mixed.isEmpty();
-			case FacesConfigPackage.DOCUMENT_ROOT__XMLNS_PREFIX_MAP:
-				return xMLNSPrefixMap != null && !xMLNSPrefixMap.isEmpty();
-			case FacesConfigPackage.DOCUMENT_ROOT__XSI_SCHEMA_LOCATION:
-				return xSISchemaLocation != null && !xSISchemaLocation.isEmpty();
-			case FacesConfigPackage.DOCUMENT_ROOT__ABSOLUTE_ORDERING:
-				return getAbsoluteOrdering() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__ACTION_LISTENER:
-				return getActionListener() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__APPLICATION:
-				return getApplication() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__APPLICATION_FACTORY:
-				return getApplicationFactory() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__ATTRIBUTE:
-				return getAttribute() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__ATTRIBUTE_CLASS:
-				return getAttributeClass() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__ATTRIBUTE_EXTENSION:
-				return getAttributeExtension() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__ATTRIBUTE_NAME:
-				return getAttributeName() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__BEHAVIOR:
-				return getBehavior() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__BEHAVIOR_CLASS:
-				return getBehaviorClass() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__BEHAVIOR_ID:
-				return getBehaviorId() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__BEHAVIOR_EXTENSION:
-				return getBehaviorExtension() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__COMPONENT:
-				return getComponent() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__COMPONENT_CLASS:
-				return getComponentClass() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__COMPONENT_EXTENSION:
-				return getComponentExtension() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__COMPONENT_FAMILY:
-				return getComponentFamily() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__COMPONENT_TYPE:
-				return getComponentType() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__CONVERTER:
-				return getConverter() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__CONVERTER_CLASS:
-				return getConverterClass() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__CONVERTER_FOR_CLASS:
-				return getConverterForClass() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__CONVERTER_ID:
-				return getConverterId() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__DEFAULT_LOCALE:
-				return getDefaultLocale() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__DEFAULT_RENDER_KIT_ID:
-				return getDefaultRenderKitId() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__DEFAULT_VALIDATORS:
-				return getDefaultValidators() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__DEFAULT_VALUE:
-				return getDefaultValue() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__DESCRIPTION:
-				return getDescription() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__DISPLAY_NAME:
-				return getDisplayName() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__EXCEPTION_HANDLER_FACTORY:
-				return getExceptionHandlerFactory() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__EXTERNAL_CONTEXT_FACTORY:
-				return getExternalContextFactory() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__FACES_CONFIG:
-				return getFacesConfig() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__FACES_CONTEXT_FACTORY:
-				return getFacesContextFactory() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__FACET:
-				return getFacet() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__FACET_EXTENSION:
-				return getFacetExtension() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__FACET_NAME:
-				return getFacetName() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__FACTORY:
-				return getFactory() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__FROM_ACTION:
-				return getFromAction() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__FROM_OUTCOME:
-				return getFromOutcome() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__FROM_VIEW_ID:
-				return getFromViewId() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__ICON:
-				return getIcon() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__IF:
-				return getIf() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__KEY:
-				return getKey() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__KEY_CLASS:
-				return getKeyClass() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__LARGE_ICON:
-				return getLargeIcon() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__LIFECYCLE:
-				return getLifecycle() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__LIFECYCLE_FACTORY:
-				return getLifecycleFactory() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__LIST_ENTRIES:
-				return getListEntries() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__LOCALE_CONFIG:
-				return getLocaleConfig() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__MANAGED_BEAN:
-				return getManagedBean() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__MANAGED_BEAN_CLASS:
-				return getManagedBeanClass() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__MANAGED_BEAN_NAME:
-				return getManagedBeanName() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__MANAGED_BEAN_SCOPE:
-				return getManagedBeanScope() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__MANAGED_PROPERTY:
-				return getManagedProperty() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__MAP_ENTRIES:
-				return getMapEntries() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__MAP_ENTRY:
-				return getMapEntry() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__MESSAGE_BUNDLE:
-				return getMessageBundle() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__NAME:
-				return getName() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__NAVIGATION_CASE:
-				return getNavigationCase() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__NAVIGATION_HANDLER:
-				return getNavigationHandler() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__NAVIGATION_RULE:
-				return getNavigationRule() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__NULL_VALUE:
-				return getNullValue() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__ORDERING:
-				return getOrdering() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__ORDERING_ORDERING:
-				return getOrderingOrdering() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__OTHERS:
-				return getOthers() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__PARTIAL_VIEW_CONTEXT_FACTORY:
-				return getPartialViewContextFactory() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__PHASE_LISTENER:
-				return getPhaseListener() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__PROPERTY:
-				return getProperty() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__PROPERTY_CLASS:
-				return getPropertyClass() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__PROPERTY_EXTENSION:
-				return getPropertyExtension() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__PROPERTY_NAME:
-				return getPropertyName() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__PROPERTY_RESOLVER:
-				return getPropertyResolver() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__REDIRECT:
-				return getRedirect() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__REDIRECT_VIEW_PARAM:
-				return getRedirectViewParam() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__REFERENCED_BEAN:
-				return getReferencedBean() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__REFERENCED_BEAN_CLASS:
-				return getReferencedBeanClass() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__REFERENCED_BEAN_NAME:
-				return getReferencedBeanName() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__RENDERER:
-				return getRenderer() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__RENDERER_CLASS:
-				return getRendererClass() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__RENDERER_EXTENSION:
-				return getRendererExtension() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__RENDERER_TYPE:
-				return getRendererType() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__RENDER_KIT:
-				return getRenderKit() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__RENDER_KIT_CLASS:
-				return getRenderKitClass() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__RENDER_KIT_FACTORY:
-				return getRenderKitFactory() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__RENDER_KIT_ID:
-				return getRenderKitId() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__RESOURCE_HANDLER:
-				return getResourceHandler() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__SMALL_ICON:
-				return getSmallIcon() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__SOURCE_CLASS:
-				return getSourceClass() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__STATE_MANAGER:
-				return getStateManager() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__SUGGESTED_VALUE:
-				return getSuggestedValue() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__SUPPORTED_LOCALE:
-				return getSupportedLocale() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__SYSTEM_EVENT_CLASS:
-				return getSystemEventClass() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__SYSTEM_EVENT_LISTENER:
-				return getSystemEventListener() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__SYSTEM_EVENT_LISTENER_CLASS:
-				return getSystemEventListenerClass() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__TAG_HANDLER_DELEGATE_FACTORY:
-				return getTagHandlerDelegateFactory() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__TO_VIEW_ID:
-				return getToViewId() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__VALIDATOR:
-				return getValidator() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__VALIDATOR_CLASS:
-				return getValidatorClass() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__VALIDATOR_ID:
-				return getValidatorId() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__VALUE:
-				return getValue() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__VALUE_CLASS:
-				return getValueClass() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__VARIABLE_RESOLVER:
-				return getVariableResolver() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__VIEW_DECLARATION_LANGUAGE_FACTORY:
-				return getViewDeclarationLanguageFactory() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__VIEW_HANDLER:
-				return getViewHandler() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__VISIT_CONTEXT_FACTORY:
-				return getVisitContextFactory() != null;
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (mixed: ");//$NON-NLS-1$
-		result.append(mixed);
-		result.append(')');
-		return result.toString();
-	}
-
-} //DocumentRootImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/DynamicAttributeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/DynamicAttributeImpl.java
deleted file mode 100644
index 0105411..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/DynamicAttributeImpl.java
+++ /dev/null
@@ -1,224 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.DynamicAttribute;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Dynamic Attribute</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DynamicAttributeImpl#getName <em>Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DynamicAttributeImpl#getValue <em>Value</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class DynamicAttributeImpl extends EObjectImpl implements DynamicAttribute {
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getName() <em>Name</em>}' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see #getName()
-	 * @generated
-	 * @ordered
-	 */
-    protected static final String NAME_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getName() <em>Name</em>}' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see #getName()
-	 * @generated
-	 * @ordered
-	 */
-    protected String name = NAME_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getValue() <em>Value</em>}' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see #getValue()
-	 * @generated
-	 * @ordered
-	 */
-    protected static final String VALUE_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getValue() <em>Value</em>}' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see #getValue()
-	 * @generated
-	 * @ordered
-	 */
-    protected String value = VALUE_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected DynamicAttributeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.DYNAMIC_ATTRIBUTE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public String getName() {
-		return name;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void setName(String newName) {
-		String oldName = name;
-		name = newName;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.DYNAMIC_ATTRIBUTE__NAME, oldName, name));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public String getValue() {
-		return value;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void setValue(String newValue) {
-		String oldValue = value;
-		value = newValue;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.DYNAMIC_ATTRIBUTE__VALUE, oldValue, value));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.DYNAMIC_ATTRIBUTE__NAME:
-				return getName();
-			case FacesConfigPackage.DYNAMIC_ATTRIBUTE__VALUE:
-				return getValue();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.DYNAMIC_ATTRIBUTE__NAME:
-				setName((String)newValue);
-				return;
-			case FacesConfigPackage.DYNAMIC_ATTRIBUTE__VALUE:
-				setValue((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.DYNAMIC_ATTRIBUTE__NAME:
-				setName(NAME_EDEFAULT);
-				return;
-			case FacesConfigPackage.DYNAMIC_ATTRIBUTE__VALUE:
-				setValue(VALUE_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.DYNAMIC_ATTRIBUTE__NAME:
-				return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT.equals(name);
-			case FacesConfigPackage.DYNAMIC_ATTRIBUTE__VALUE:
-				return VALUE_EDEFAULT == null ? value != null : !VALUE_EDEFAULT.equals(value);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-    public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (name: ");//$NON-NLS-1$
-		result.append(name);
-		result.append(", value: ");//$NON-NLS-1$
-		result.append(value);
-		result.append(')');
-		return result.toString();
-	}
-
-} //DynamicAttributeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/DynamicElementImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/DynamicElementImpl.java
deleted file mode 100644
index 46b6e8a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/DynamicElementImpl.java
+++ /dev/null
@@ -1,314 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.EObjectResolvingEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.facesconfig.emf.DynamicAttribute;
-import org.eclipse.jst.jsf.facesconfig.emf.DynamicElement;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Dynamic Element</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DynamicElementImpl#getChildNodes <em>Child Nodes</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DynamicElementImpl#getName <em>Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DynamicElementImpl#getAttributes <em>Attributes</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DynamicElementImpl#getTextContent <em>Text Content</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class DynamicElementImpl extends EObjectImpl implements DynamicElement {
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The cached value of the '{@link #getChildNodes() <em>Child Nodes</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see #getChildNodes()
-	 * @generated
-	 * @ordered
-	 */
-    protected EList childNodes;
-
-    /**
-	 * The default value of the '{@link #getName() <em>Name</em>}' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see #getName()
-	 * @generated
-	 * @ordered
-	 */
-    protected static final String NAME_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getName() <em>Name</em>}' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see #getName()
-	 * @generated
-	 * @ordered
-	 */
-    protected String name = NAME_EDEFAULT;
-
-    /**
-	 * The cached value of the '{@link #getAttributes() <em>Attributes</em>}' reference list.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see #getAttributes()
-	 * @generated
-	 * @ordered
-	 */
-    protected EList attributes;
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-    protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-    protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected DynamicElementImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.DYNAMIC_ELEMENT;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EList getChildNodes() {
-		if (childNodes == null) {
-			childNodes = new EObjectContainmentEList(DynamicElement.class, this, FacesConfigPackage.DYNAMIC_ELEMENT__CHILD_NODES);
-		}
-		return childNodes;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EList getAttributes() {
-		if (attributes == null) {
-			attributes = new EObjectResolvingEList(DynamicAttribute.class, this, FacesConfigPackage.DYNAMIC_ELEMENT__ATTRIBUTES);
-		}
-		return attributes;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.DYNAMIC_ELEMENT__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public String getName() {
-		return name;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void setName(String newName) {
-		String oldName = name;
-		name = newName;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.DYNAMIC_ELEMENT__NAME, oldName, name));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case FacesConfigPackage.DYNAMIC_ELEMENT__CHILD_NODES:
-				return ((InternalEList)getChildNodes()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.DYNAMIC_ELEMENT__CHILD_NODES:
-				return getChildNodes();
-			case FacesConfigPackage.DYNAMIC_ELEMENT__NAME:
-				return getName();
-			case FacesConfigPackage.DYNAMIC_ELEMENT__ATTRIBUTES:
-				return getAttributes();
-			case FacesConfigPackage.DYNAMIC_ELEMENT__TEXT_CONTENT:
-				return getTextContent();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.DYNAMIC_ELEMENT__CHILD_NODES:
-				getChildNodes().clear();
-				getChildNodes().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.DYNAMIC_ELEMENT__NAME:
-				setName((String)newValue);
-				return;
-			case FacesConfigPackage.DYNAMIC_ELEMENT__ATTRIBUTES:
-				getAttributes().clear();
-				getAttributes().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.DYNAMIC_ELEMENT__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.DYNAMIC_ELEMENT__CHILD_NODES:
-				getChildNodes().clear();
-				return;
-			case FacesConfigPackage.DYNAMIC_ELEMENT__NAME:
-				setName(NAME_EDEFAULT);
-				return;
-			case FacesConfigPackage.DYNAMIC_ELEMENT__ATTRIBUTES:
-				getAttributes().clear();
-				return;
-			case FacesConfigPackage.DYNAMIC_ELEMENT__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.DYNAMIC_ELEMENT__CHILD_NODES:
-				return childNodes != null && !childNodes.isEmpty();
-			case FacesConfigPackage.DYNAMIC_ELEMENT__NAME:
-				return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT.equals(name);
-			case FacesConfigPackage.DYNAMIC_ELEMENT__ATTRIBUTES:
-				return attributes != null && !attributes.isEmpty();
-			case FacesConfigPackage.DYNAMIC_ELEMENT__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-    public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (name: ");//$NON-NLS-1$
-		result.append(name);
-		result.append(", textContent: ");//$NON-NLS-1$
-		result.append(textContent);
-		result.append(')');
-		return result.toString();
-	}
-
-} //DynamicElementImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ELResolverTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ELResolverTypeImpl.java
deleted file mode 100644
index 60006fc..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ELResolverTypeImpl.java
+++ /dev/null
@@ -1,224 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.ELResolverType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>EL Resolver Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ELResolverTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ELResolverTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ELResolverTypeImpl extends EObjectImpl implements ELResolverType {
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-    protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-    protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-    protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-    protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected ELResolverTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.EL_RESOLVER_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.EL_RESOLVER_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.EL_RESOLVER_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.EL_RESOLVER_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.EL_RESOLVER_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.EL_RESOLVER_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.EL_RESOLVER_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.EL_RESOLVER_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.EL_RESOLVER_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.EL_RESOLVER_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.EL_RESOLVER_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-    public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: ");//$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: ");//$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ELResolverTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ExceptionHandlerFactoryTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ExceptionHandlerFactoryTypeImpl.java
deleted file mode 100644
index fa5e031..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ExceptionHandlerFactoryTypeImpl.java
+++ /dev/null
@@ -1,224 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.ExceptionHandlerFactoryType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Exception Handler Factory Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ExceptionHandlerFactoryTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ExceptionHandlerFactoryTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ExceptionHandlerFactoryTypeImpl extends EObjectImpl implements ExceptionHandlerFactoryType {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ExceptionHandlerFactoryTypeImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.EXCEPTION_HANDLER_FACTORY_TYPE;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.EXCEPTION_HANDLER_FACTORY_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.EXCEPTION_HANDLER_FACTORY_TYPE__ID, oldId, id));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.EXCEPTION_HANDLER_FACTORY_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.EXCEPTION_HANDLER_FACTORY_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.EXCEPTION_HANDLER_FACTORY_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.EXCEPTION_HANDLER_FACTORY_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.EXCEPTION_HANDLER_FACTORY_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.EXCEPTION_HANDLER_FACTORY_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.EXCEPTION_HANDLER_FACTORY_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.EXCEPTION_HANDLER_FACTORY_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: ");//$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: ");//$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ExceptionHandlerFactoryTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ExtensionTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ExtensionTypeImpl.java
deleted file mode 100644
index acecd7c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ExtensionTypeImpl.java
+++ /dev/null
@@ -1,263 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EObjectResolvingEList;
-import org.eclipse.jst.jsf.facesconfig.emf.DynamicElement;
-import org.eclipse.jst.jsf.facesconfig.emf.ExtensionType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Extension Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ExtensionTypeImpl#getChildNodes <em>Child Nodes</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ExtensionTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ExtensionTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public abstract class ExtensionTypeImpl extends EObjectImpl implements ExtensionType {
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The cached value of the '{@link #getChildNodes() <em>Child Nodes</em>}' reference list.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see #getChildNodes()
-	 * @generated
-	 * @ordered
-	 */
-    protected EList childNodes;
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-    protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-    protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-    protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-    protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected ExtensionTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.EXTENSION_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EList getChildNodes() {
-		if (childNodes == null) {
-			childNodes = new EObjectResolvingEList(DynamicElement.class, this, FacesConfigPackage.EXTENSION_TYPE__CHILD_NODES);
-		}
-		return childNodes;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.EXTENSION_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.EXTENSION_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.EXTENSION_TYPE__CHILD_NODES:
-				return getChildNodes();
-			case FacesConfigPackage.EXTENSION_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.EXTENSION_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.EXTENSION_TYPE__CHILD_NODES:
-				getChildNodes().clear();
-				getChildNodes().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.EXTENSION_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.EXTENSION_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.EXTENSION_TYPE__CHILD_NODES:
-				getChildNodes().clear();
-				return;
-			case FacesConfigPackage.EXTENSION_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.EXTENSION_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.EXTENSION_TYPE__CHILD_NODES:
-				return childNodes != null && !childNodes.isEmpty();
-			case FacesConfigPackage.EXTENSION_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.EXTENSION_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-    public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: ");//$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: ");//$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ExtensionTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ExternalContextFactoryTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ExternalContextFactoryTypeImpl.java
deleted file mode 100644
index f9d3685..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ExternalContextFactoryTypeImpl.java
+++ /dev/null
@@ -1,224 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.ExternalContextFactoryType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>External Context Factory Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ExternalContextFactoryTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ExternalContextFactoryTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ExternalContextFactoryTypeImpl extends EObjectImpl implements ExternalContextFactoryType {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ExternalContextFactoryTypeImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.EXTERNAL_CONTEXT_FACTORY_TYPE;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.EXTERNAL_CONTEXT_FACTORY_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.EXTERNAL_CONTEXT_FACTORY_TYPE__ID, oldId, id));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.EXTERNAL_CONTEXT_FACTORY_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.EXTERNAL_CONTEXT_FACTORY_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.EXTERNAL_CONTEXT_FACTORY_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.EXTERNAL_CONTEXT_FACTORY_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.EXTERNAL_CONTEXT_FACTORY_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.EXTERNAL_CONTEXT_FACTORY_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.EXTERNAL_CONTEXT_FACTORY_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.EXTERNAL_CONTEXT_FACTORY_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: ");//$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: ");//$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ExternalContextFactoryTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FacesConfigExtensionTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FacesConfigExtensionTypeImpl.java
deleted file mode 100644
index 6f08de3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FacesConfigExtensionTypeImpl.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigExtensionType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Extension Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * </p>
- *
- * @generated
- */
-public class FacesConfigExtensionTypeImpl extends ExtensionTypeImpl implements FacesConfigExtensionType {
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    @SuppressWarnings("hiding")
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected FacesConfigExtensionTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.FACES_CONFIG_EXTENSION_TYPE;
-	}
-
-} //FacesConfigExtensionTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FacesConfigFactoryImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FacesConfigFactoryImpl.java
deleted file mode 100644
index 9411297..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FacesConfigFactoryImpl.java
+++ /dev/null
@@ -1,1440 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.impl.EFactoryImpl;
-import org.eclipse.emf.ecore.plugin.EcorePlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.*;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model <b>Factory</b>.
- * <!-- end-user-doc -->
- * @generated
- */
-public class FacesConfigFactoryImpl extends EFactoryImpl implements FacesConfigFactory {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Creates the default factory implementation.
-	 * <!-- begin-user-doc -->
-     * @return the factory instance 
-     * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-    public static FacesConfigFactory init() {
-		try {
-			FacesConfigFactory theFacesConfigFactory = (FacesConfigFactory)EPackage.Registry.INSTANCE.getEFactory("http://www.eclipse.org/webtools/jsf/schema/facesconfig.xsd"); //$NON-NLS-1$ 
-			if (theFacesConfigFactory != null) {
-				return theFacesConfigFactory;
-			}
-		}
-		catch (Exception exception) {
-			EcorePlugin.INSTANCE.log(exception);
-		}
-		return new FacesConfigFactoryImpl();
-	}
-
-    /**
-	 * Creates an instance of the factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FacesConfigFactoryImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EObject create(EClass eClass) {
-		switch (eClass.getClassifierID()) {
-			case FacesConfigPackage.ABSOLUTE_ORDERING_TYPE: return createAbsoluteOrderingType();
-			case FacesConfigPackage.ACTION_LISTENER_TYPE: return createActionListenerType();
-			case FacesConfigPackage.APPLICATION_FACTORY_TYPE: return createApplicationFactoryType();
-			case FacesConfigPackage.APPLICATION_TYPE: return createApplicationType();
-			case FacesConfigPackage.APPLICATION_EXTENSION_TYPE: return createApplicationExtensionType();
-			case FacesConfigPackage.ATTRIBUTE_CLASS_TYPE: return createAttributeClassType();
-			case FacesConfigPackage.ATTRIBUTE_EXTENSION_TYPE: return createAttributeExtensionType();
-			case FacesConfigPackage.ATTRIBUTE_NAME_TYPE: return createAttributeNameType();
-			case FacesConfigPackage.ATTRIBUTE_TYPE: return createAttributeType();
-			case FacesConfigPackage.BEHAVIOR_CLASS_TYPE: return createBehaviorClassType();
-			case FacesConfigPackage.BEHAVIOR_ID_TYPE: return createBehaviorIdType();
-			case FacesConfigPackage.BEHAVIOR_TYPE: return createBehaviorType();
-			case FacesConfigPackage.BEHAVIOR_EXTENSION_TYPE: return createBehaviorExtensionType();
-			case FacesConfigPackage.CLIENT_BEHAVIOR_RENDERER_CLASS_TYPE: return createClientBehaviorRendererClassType();
-			case FacesConfigPackage.CLIENT_BEHAVIOR_RENDERER_TYPE: return createClientBehaviorRendererType();
-			case FacesConfigPackage.CLIENT_BEHAVIOR_RENDERER_TYPE_TYPE: return createClientBehaviorRendererTypeType();
-			case FacesConfigPackage.COMPONENT_CLASS_TYPE: return createComponentClassType();
-			case FacesConfigPackage.COMPONENT_EXTENSION_TYPE: return createComponentExtensionType();
-			case FacesConfigPackage.COMPONENT_FAMILY_TYPE: return createComponentFamilyType();
-			case FacesConfigPackage.COMPONENT_TYPE: return createComponentType();
-			case FacesConfigPackage.COMPONENT_TYPE_TYPE: return createComponentTypeType();
-			case FacesConfigPackage.CONVERTER_CLASS_TYPE: return createConverterClassType();
-			case FacesConfigPackage.CONVERTER_FOR_CLASS_TYPE: return createConverterForClassType();
-			case FacesConfigPackage.CONVERTER_ID_TYPE: return createConverterIdType();
-			case FacesConfigPackage.CONVERTER_TYPE: return createConverterType();
-			case FacesConfigPackage.CONVERTER_EXTENSION_TYPE: return createConverterExtensionType();
-			case FacesConfigPackage.DEFAULT_LOCALE_TYPE: return createDefaultLocaleType();
-			case FacesConfigPackage.DEFAULT_RENDER_KIT_ID_TYPE: return createDefaultRenderKitIdType();
-			case FacesConfigPackage.DEFAULT_VALIDATORS_TYPE: return createDefaultValidatorsType();
-			case FacesConfigPackage.DEFAULT_VALUE_TYPE: return createDefaultValueType();
-			case FacesConfigPackage.DESCRIPTION_TYPE: return createDescriptionType();
-			case FacesConfigPackage.DISPLAY_NAME_TYPE: return createDisplayNameType();
-			case FacesConfigPackage.DOCUMENT_ROOT: return createDocumentRoot();
-			case FacesConfigPackage.DYNAMIC_ATTRIBUTE: return createDynamicAttribute();
-			case FacesConfigPackage.DYNAMIC_ELEMENT: return createDynamicElement();
-			case FacesConfigPackage.EL_RESOLVER_TYPE: return createELResolverType();
-			case FacesConfigPackage.EXCEPTION_HANDLER_FACTORY_TYPE: return createExceptionHandlerFactoryType();
-			case FacesConfigPackage.EXTERNAL_CONTEXT_FACTORY_TYPE: return createExternalContextFactoryType();
-			case FacesConfigPackage.FACES_CONFIG_TYPE: return createFacesConfigType();
-			case FacesConfigPackage.FACES_CONFIG_EXTENSION_TYPE: return createFacesConfigExtensionType();
-			case FacesConfigPackage.FACES_CONTEXT_FACTORY_TYPE: return createFacesContextFactoryType();
-			case FacesConfigPackage.FACET_EXTENSION_TYPE: return createFacetExtensionType();
-			case FacesConfigPackage.FACET_NAME_TYPE: return createFacetNameType();
-			case FacesConfigPackage.FACET_TYPE: return createFacetType();
-			case FacesConfigPackage.FACTORY_TYPE: return createFactoryType();
-			case FacesConfigPackage.FACTORY_EXTENSION_TYPE: return createFactoryExtensionType();
-			case FacesConfigPackage.FROM_ACTION_TYPE: return createFromActionType();
-			case FacesConfigPackage.FROM_OUTCOME_TYPE: return createFromOutcomeType();
-			case FacesConfigPackage.FROM_VIEW_ID_TYPE: return createFromViewIdType();
-			case FacesConfigPackage.ICON_TYPE: return createIconType();
-			case FacesConfigPackage.IF_TYPE: return createIfType();
-			case FacesConfigPackage.KEY_CLASS_TYPE: return createKeyClassType();
-			case FacesConfigPackage.KEY_TYPE: return createKeyType();
-			case FacesConfigPackage.LARGE_ICON_TYPE: return createLargeIconType();
-			case FacesConfigPackage.LIFECYCLE_FACTORY_TYPE: return createLifecycleFactoryType();
-			case FacesConfigPackage.LIFECYCLE_TYPE: return createLifecycleType();
-			case FacesConfigPackage.LIFECYCLE_EXTENSION_TYPE: return createLifecycleExtensionType();
-			case FacesConfigPackage.LIST_ENTRIES_TYPE: return createListEntriesType();
-			case FacesConfigPackage.LOCALE_CONFIG_TYPE: return createLocaleConfigType();
-			case FacesConfigPackage.MANAGED_BEAN_CLASS_TYPE: return createManagedBeanClassType();
-			case FacesConfigPackage.MANAGED_BEAN_NAME_TYPE: return createManagedBeanNameType();
-			case FacesConfigPackage.MANAGED_BEAN_SCOPE_TYPE: return createManagedBeanScopeType();
-			case FacesConfigPackage.MANAGED_BEAN_TYPE: return createManagedBeanType();
-			case FacesConfigPackage.MANAGED_BEAN_EXTENSION_TYPE: return createManagedBeanExtensionType();
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE: return createManagedPropertyType();
-			case FacesConfigPackage.MAP_ENTRIES_TYPE: return createMapEntriesType();
-			case FacesConfigPackage.MAP_ENTRY_TYPE: return createMapEntryType();
-			case FacesConfigPackage.MESSAGE_BUNDLE_TYPE: return createMessageBundleType();
-			case FacesConfigPackage.NAME_TYPE: return createNameType();
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE: return createNavigationCaseType();
-			case FacesConfigPackage.NAVIGATION_HANDLER_TYPE: return createNavigationHandlerType();
-			case FacesConfigPackage.NAVIGATION_RULE_TYPE: return createNavigationRuleType();
-			case FacesConfigPackage.NAVIGATION_RULE_EXTENSION_TYPE: return createNavigationRuleExtensionType();
-			case FacesConfigPackage.NULL_VALUE_TYPE: return createNullValueType();
-			case FacesConfigPackage.ORDERING_TYPE: return createOrderingType();
-			case FacesConfigPackage.ORDERING_ORDERING_TYPE: return createOrderingOrderingType();
-			case FacesConfigPackage.ORDERING_OTHERS_TYPE: return createOrderingOthersType();
-			case FacesConfigPackage.PARTIAL_VIEW_CONTEXT_FACTORY_TYPE: return createPartialViewContextFactoryType();
-			case FacesConfigPackage.PHASE_LISTENER_TYPE: return createPhaseListenerType();
-			case FacesConfigPackage.PROPERTY_CLASS_TYPE: return createPropertyClassType();
-			case FacesConfigPackage.PROPERTY_EXTENSION_TYPE: return createPropertyExtensionType();
-			case FacesConfigPackage.PROPERTY_NAME_TYPE: return createPropertyNameType();
-			case FacesConfigPackage.PROPERTY_RESOLVER_TYPE: return createPropertyResolverType();
-			case FacesConfigPackage.PROPERTY_TYPE: return createPropertyType();
-			case FacesConfigPackage.REDIRECT_TYPE: return createRedirectType();
-			case FacesConfigPackage.REDIRECT_VIEW_PARAM_TYPE: return createRedirectViewParamType();
-			case FacesConfigPackage.REFERENCED_BEAN_CLASS_TYPE: return createReferencedBeanClassType();
-			case FacesConfigPackage.REFERENCED_BEAN_NAME_TYPE: return createReferencedBeanNameType();
-			case FacesConfigPackage.REFERENCED_BEAN_TYPE: return createReferencedBeanType();
-			case FacesConfigPackage.RENDERER_CLASS_TYPE: return createRendererClassType();
-			case FacesConfigPackage.RENDERER_EXTENSION_TYPE: return createRendererExtensionType();
-			case FacesConfigPackage.RENDERER_TYPE: return createRendererType();
-			case FacesConfigPackage.RENDERER_TYPE_TYPE: return createRendererTypeType();
-			case FacesConfigPackage.RENDER_KIT_CLASS_TYPE: return createRenderKitClassType();
-			case FacesConfigPackage.RENDER_KIT_FACTORY_TYPE: return createRenderKitFactoryType();
-			case FacesConfigPackage.RENDER_KIT_ID_TYPE: return createRenderKitIdType();
-			case FacesConfigPackage.RENDER_KIT_TYPE: return createRenderKitType();
-			case FacesConfigPackage.RENDER_KIT_EXTENSION_TYPE: return createRenderKitExtensionType();
-			case FacesConfigPackage.RESOURCE_HANDLER_TYPE: return createResourceHandlerType();
-			case FacesConfigPackage.SMALL_ICON_TYPE: return createSmallIconType();
-			case FacesConfigPackage.SOURCE_CLASS_TYPE: return createSourceClassType();
-			case FacesConfigPackage.STATE_MANAGER_TYPE: return createStateManagerType();
-			case FacesConfigPackage.SUGGESTED_VALUE_TYPE: return createSuggestedValueType();
-			case FacesConfigPackage.SUPPORTED_LOCALE_TYPE: return createSupportedLocaleType();
-			case FacesConfigPackage.SYSTEM_EVENT_CLASS_TYPE: return createSystemEventClassType();
-			case FacesConfigPackage.SYSTEM_EVENT_LISTENER_CLASS_TYPE: return createSystemEventListenerClassType();
-			case FacesConfigPackage.SYSTEM_EVENT_LISTENER_TYPE: return createSystemEventListenerType();
-			case FacesConfigPackage.TAG_HANDLER_DELEGATE_FACTORY_TYPE: return createTagHandlerDelegateFactoryType();
-			case FacesConfigPackage.TO_VIEW_ID_TYPE: return createToViewIdType();
-			case FacesConfigPackage.VALIDATOR_CLASS_TYPE: return createValidatorClassType();
-			case FacesConfigPackage.VALIDATOR_ID_TYPE: return createValidatorIdType();
-			case FacesConfigPackage.VALIDATOR_TYPE: return createValidatorType();
-			case FacesConfigPackage.VALIDATOR_EXTENSION_TYPE: return createValidatorExtensionType();
-			case FacesConfigPackage.VALUE_CLASS_TYPE: return createValueClassType();
-			case FacesConfigPackage.VALUE_TYPE: return createValueType();
-			case FacesConfigPackage.VARIABLE_RESOLVER_TYPE: return createVariableResolverType();
-			case FacesConfigPackage.VIEW_HANDLER_TYPE: return createViewHandlerType();
-			case FacesConfigPackage.RESOURCE_BUNDLE_TYPE: return createResourceBundleType();
-			case FacesConfigPackage.BASE_NAME_TYPE: return createBaseNameType();
-			case FacesConfigPackage.VAR_TYPE: return createVarType();
-			case FacesConfigPackage.VIEW_DECLARATION_LANGUAGE_FACTORY_TYPE: return createViewDeclarationLanguageFactoryType();
-			case FacesConfigPackage.VISIT_CONTEXT_FACTORY_TYPE: return createVisitContextFactoryType();
-			default:
-				throw new IllegalArgumentException("The class '" + eClass.getName() + "' is not a valid classifier"); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public AbsoluteOrderingType createAbsoluteOrderingType() {
-		AbsoluteOrderingTypeImpl absoluteOrderingType = new AbsoluteOrderingTypeImpl();
-		return absoluteOrderingType;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ActionListenerType createActionListenerType() {
-		ActionListenerTypeImpl actionListenerType = new ActionListenerTypeImpl();
-		return actionListenerType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ApplicationFactoryType createApplicationFactoryType() {
-		ApplicationFactoryTypeImpl applicationFactoryType = new ApplicationFactoryTypeImpl();
-		return applicationFactoryType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ApplicationType createApplicationType() {
-		ApplicationTypeImpl applicationType = new ApplicationTypeImpl();
-		return applicationType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public AttributeClassType createAttributeClassType() {
-		AttributeClassTypeImpl attributeClassType = new AttributeClassTypeImpl();
-		return attributeClassType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public AttributeExtensionType createAttributeExtensionType() {
-		AttributeExtensionTypeImpl attributeExtensionType = new AttributeExtensionTypeImpl();
-		return attributeExtensionType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public AttributeNameType createAttributeNameType() {
-		AttributeNameTypeImpl attributeNameType = new AttributeNameTypeImpl();
-		return attributeNameType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public AttributeType createAttributeType() {
-		AttributeTypeImpl attributeType = new AttributeTypeImpl();
-		return attributeType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BehaviorClassType createBehaviorClassType() {
-		BehaviorClassTypeImpl behaviorClassType = new BehaviorClassTypeImpl();
-		return behaviorClassType;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BehaviorIdType createBehaviorIdType() {
-		BehaviorIdTypeImpl behaviorIdType = new BehaviorIdTypeImpl();
-		return behaviorIdType;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BehaviorType createBehaviorType() {
-		BehaviorTypeImpl behaviorType = new BehaviorTypeImpl();
-		return behaviorType;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BehaviorExtensionType createBehaviorExtensionType() {
-		BehaviorExtensionTypeImpl behaviorExtensionType = new BehaviorExtensionTypeImpl();
-		return behaviorExtensionType;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ClientBehaviorRendererClassType createClientBehaviorRendererClassType() {
-		ClientBehaviorRendererClassTypeImpl clientBehaviorRendererClassType = new ClientBehaviorRendererClassTypeImpl();
-		return clientBehaviorRendererClassType;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ClientBehaviorRendererType createClientBehaviorRendererType() {
-		ClientBehaviorRendererTypeImpl clientBehaviorRendererType = new ClientBehaviorRendererTypeImpl();
-		return clientBehaviorRendererType;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ClientBehaviorRendererTypeType createClientBehaviorRendererTypeType() {
-		ClientBehaviorRendererTypeTypeImpl clientBehaviorRendererTypeType = new ClientBehaviorRendererTypeTypeImpl();
-		return clientBehaviorRendererTypeType;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ComponentClassType createComponentClassType() {
-		ComponentClassTypeImpl componentClassType = new ComponentClassTypeImpl();
-		return componentClassType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ComponentExtensionType createComponentExtensionType() {
-		ComponentExtensionTypeImpl componentExtensionType = new ComponentExtensionTypeImpl();
-		return componentExtensionType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ComponentFamilyType createComponentFamilyType() {
-		ComponentFamilyTypeImpl componentFamilyType = new ComponentFamilyTypeImpl();
-		return componentFamilyType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ComponentType createComponentType() {
-		ComponentTypeImpl componentType = new ComponentTypeImpl();
-		return componentType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ComponentTypeType createComponentTypeType() {
-		ComponentTypeTypeImpl componentTypeType = new ComponentTypeTypeImpl();
-		return componentTypeType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ConverterClassType createConverterClassType() {
-		ConverterClassTypeImpl converterClassType = new ConverterClassTypeImpl();
-		return converterClassType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ConverterForClassType createConverterForClassType() {
-		ConverterForClassTypeImpl converterForClassType = new ConverterForClassTypeImpl();
-		return converterForClassType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ConverterIdType createConverterIdType() {
-		ConverterIdTypeImpl converterIdType = new ConverterIdTypeImpl();
-		return converterIdType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ConverterType createConverterType() {
-		ConverterTypeImpl converterType = new ConverterTypeImpl();
-		return converterType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public DefaultLocaleType createDefaultLocaleType() {
-		DefaultLocaleTypeImpl defaultLocaleType = new DefaultLocaleTypeImpl();
-		return defaultLocaleType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public DefaultRenderKitIdType createDefaultRenderKitIdType() {
-		DefaultRenderKitIdTypeImpl defaultRenderKitIdType = new DefaultRenderKitIdTypeImpl();
-		return defaultRenderKitIdType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public DefaultValidatorsType createDefaultValidatorsType() {
-		DefaultValidatorsTypeImpl defaultValidatorsType = new DefaultValidatorsTypeImpl();
-		return defaultValidatorsType;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public DefaultValueType createDefaultValueType() {
-		DefaultValueTypeImpl defaultValueType = new DefaultValueTypeImpl();
-		return defaultValueType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public DescriptionType createDescriptionType() {
-		DescriptionTypeImpl descriptionType = new DescriptionTypeImpl();
-		return descriptionType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public DisplayNameType createDisplayNameType() {
-		DisplayNameTypeImpl displayNameType = new DisplayNameTypeImpl();
-		return displayNameType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public DocumentRoot createDocumentRoot() {
-		DocumentRootImpl documentRoot = new DocumentRootImpl();
-		return documentRoot;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public DynamicAttribute createDynamicAttribute() {
-		DynamicAttributeImpl dynamicAttribute = new DynamicAttributeImpl();
-		return dynamicAttribute;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public DynamicElement createDynamicElement() {
-		DynamicElementImpl dynamicElement = new DynamicElementImpl();
-		return dynamicElement;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public ELResolverType createELResolverType() {
-		ELResolverTypeImpl elResolverType = new ELResolverTypeImpl();
-		return elResolverType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ExceptionHandlerFactoryType createExceptionHandlerFactoryType() {
-		ExceptionHandlerFactoryTypeImpl exceptionHandlerFactoryType = new ExceptionHandlerFactoryTypeImpl();
-		return exceptionHandlerFactoryType;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ExternalContextFactoryType createExternalContextFactoryType() {
-		ExternalContextFactoryTypeImpl externalContextFactoryType = new ExternalContextFactoryTypeImpl();
-		return externalContextFactoryType;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FacesConfigType createFacesConfigType() {
-		FacesConfigTypeImpl facesConfigType = new FacesConfigTypeImpl();
-		return facesConfigType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FacesContextFactoryType createFacesContextFactoryType() {
-		FacesContextFactoryTypeImpl facesContextFactoryType = new FacesContextFactoryTypeImpl();
-		return facesContextFactoryType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FacetExtensionType createFacetExtensionType() {
-		FacetExtensionTypeImpl facetExtensionType = new FacetExtensionTypeImpl();
-		return facetExtensionType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FacetNameType createFacetNameType() {
-		FacetNameTypeImpl facetNameType = new FacetNameTypeImpl();
-		return facetNameType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FacetType createFacetType() {
-		FacetTypeImpl facetType = new FacetTypeImpl();
-		return facetType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FactoryType createFactoryType() {
-		FactoryTypeImpl factoryType = new FactoryTypeImpl();
-		return factoryType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FromActionType createFromActionType() {
-		FromActionTypeImpl fromActionType = new FromActionTypeImpl();
-		return fromActionType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FromOutcomeType createFromOutcomeType() {
-		FromOutcomeTypeImpl fromOutcomeType = new FromOutcomeTypeImpl();
-		return fromOutcomeType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FromViewIdType createFromViewIdType() {
-		FromViewIdTypeImpl fromViewIdType = new FromViewIdTypeImpl();
-		return fromViewIdType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public IconType createIconType() {
-		IconTypeImpl iconType = new IconTypeImpl();
-		return iconType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public IfType createIfType() {
-		IfTypeImpl ifType = new IfTypeImpl();
-		return ifType;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public KeyClassType createKeyClassType() {
-		KeyClassTypeImpl keyClassType = new KeyClassTypeImpl();
-		return keyClassType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public KeyType createKeyType() {
-		KeyTypeImpl keyType = new KeyTypeImpl();
-		return keyType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public LargeIconType createLargeIconType() {
-		LargeIconTypeImpl largeIconType = new LargeIconTypeImpl();
-		return largeIconType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public LifecycleFactoryType createLifecycleFactoryType() {
-		LifecycleFactoryTypeImpl lifecycleFactoryType = new LifecycleFactoryTypeImpl();
-		return lifecycleFactoryType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public LifecycleType createLifecycleType() {
-		LifecycleTypeImpl lifecycleType = new LifecycleTypeImpl();
-		return lifecycleType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ListEntriesType createListEntriesType() {
-		ListEntriesTypeImpl listEntriesType = new ListEntriesTypeImpl();
-		return listEntriesType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public LocaleConfigType createLocaleConfigType() {
-		LocaleConfigTypeImpl localeConfigType = new LocaleConfigTypeImpl();
-		return localeConfigType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ManagedBeanClassType createManagedBeanClassType() {
-		ManagedBeanClassTypeImpl managedBeanClassType = new ManagedBeanClassTypeImpl();
-		return managedBeanClassType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ManagedBeanNameType createManagedBeanNameType() {
-		ManagedBeanNameTypeImpl managedBeanNameType = new ManagedBeanNameTypeImpl();
-		return managedBeanNameType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ManagedBeanScopeType createManagedBeanScopeType() {
-		ManagedBeanScopeTypeImpl managedBeanScopeType = new ManagedBeanScopeTypeImpl();
-		return managedBeanScopeType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ManagedBeanType createManagedBeanType() {
-		ManagedBeanTypeImpl managedBeanType = new ManagedBeanTypeImpl();
-		return managedBeanType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ManagedPropertyType createManagedPropertyType() {
-		ManagedPropertyTypeImpl managedPropertyType = new ManagedPropertyTypeImpl();
-		return managedPropertyType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public MapEntriesType createMapEntriesType() {
-		MapEntriesTypeImpl mapEntriesType = new MapEntriesTypeImpl();
-		return mapEntriesType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public MapEntryType createMapEntryType() {
-		MapEntryTypeImpl mapEntryType = new MapEntryTypeImpl();
-		return mapEntryType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public MessageBundleType createMessageBundleType() {
-		MessageBundleTypeImpl messageBundleType = new MessageBundleTypeImpl();
-		return messageBundleType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NameType createNameType() {
-		NameTypeImpl nameType = new NameTypeImpl();
-		return nameType;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NavigationCaseType createNavigationCaseType() {
-		NavigationCaseTypeImpl navigationCaseType = new NavigationCaseTypeImpl();
-		return navigationCaseType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NavigationHandlerType createNavigationHandlerType() {
-		NavigationHandlerTypeImpl navigationHandlerType = new NavigationHandlerTypeImpl();
-		return navigationHandlerType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NavigationRuleType createNavigationRuleType() {
-		NavigationRuleTypeImpl navigationRuleType = new NavigationRuleTypeImpl();
-		return navigationRuleType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NullValueType createNullValueType() {
-		NullValueTypeImpl nullValueType = new NullValueTypeImpl();
-		return nullValueType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public OrderingType createOrderingType() {
-		OrderingTypeImpl orderingType = new OrderingTypeImpl();
-		return orderingType;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public OrderingOrderingType createOrderingOrderingType() {
-		OrderingOrderingTypeImpl orderingOrderingType = new OrderingOrderingTypeImpl();
-		return orderingOrderingType;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public OrderingOthersType createOrderingOthersType() {
-		OrderingOthersTypeImpl orderingOthersType = new OrderingOthersTypeImpl();
-		return orderingOthersType;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public PartialViewContextFactoryType createPartialViewContextFactoryType() {
-		PartialViewContextFactoryTypeImpl partialViewContextFactoryType = new PartialViewContextFactoryTypeImpl();
-		return partialViewContextFactoryType;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public PhaseListenerType createPhaseListenerType() {
-		PhaseListenerTypeImpl phaseListenerType = new PhaseListenerTypeImpl();
-		return phaseListenerType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public PropertyClassType createPropertyClassType() {
-		PropertyClassTypeImpl propertyClassType = new PropertyClassTypeImpl();
-		return propertyClassType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public PropertyExtensionType createPropertyExtensionType() {
-		PropertyExtensionTypeImpl propertyExtensionType = new PropertyExtensionTypeImpl();
-		return propertyExtensionType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public PropertyNameType createPropertyNameType() {
-		PropertyNameTypeImpl propertyNameType = new PropertyNameTypeImpl();
-		return propertyNameType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public PropertyResolverType createPropertyResolverType() {
-		PropertyResolverTypeImpl propertyResolverType = new PropertyResolverTypeImpl();
-		return propertyResolverType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public PropertyType createPropertyType() {
-		PropertyTypeImpl propertyType = new PropertyTypeImpl();
-		return propertyType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public RedirectType createRedirectType() {
-		RedirectTypeImpl redirectType = new RedirectTypeImpl();
-		return redirectType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public RedirectViewParamType createRedirectViewParamType() {
-		RedirectViewParamTypeImpl redirectViewParamType = new RedirectViewParamTypeImpl();
-		return redirectViewParamType;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ReferencedBeanClassType createReferencedBeanClassType() {
-		ReferencedBeanClassTypeImpl referencedBeanClassType = new ReferencedBeanClassTypeImpl();
-		return referencedBeanClassType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ReferencedBeanNameType createReferencedBeanNameType() {
-		ReferencedBeanNameTypeImpl referencedBeanNameType = new ReferencedBeanNameTypeImpl();
-		return referencedBeanNameType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ReferencedBeanType createReferencedBeanType() {
-		ReferencedBeanTypeImpl referencedBeanType = new ReferencedBeanTypeImpl();
-		return referencedBeanType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public RendererClassType createRendererClassType() {
-		RendererClassTypeImpl rendererClassType = new RendererClassTypeImpl();
-		return rendererClassType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public RendererExtensionType createRendererExtensionType() {
-		RendererExtensionTypeImpl rendererExtensionType = new RendererExtensionTypeImpl();
-		return rendererExtensionType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public RendererType createRendererType() {
-		RendererTypeImpl rendererType = new RendererTypeImpl();
-		return rendererType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public RendererTypeType createRendererTypeType() {
-		RendererTypeTypeImpl rendererTypeType = new RendererTypeTypeImpl();
-		return rendererTypeType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public RenderKitClassType createRenderKitClassType() {
-		RenderKitClassTypeImpl renderKitClassType = new RenderKitClassTypeImpl();
-		return renderKitClassType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public RenderKitFactoryType createRenderKitFactoryType() {
-		RenderKitFactoryTypeImpl renderKitFactoryType = new RenderKitFactoryTypeImpl();
-		return renderKitFactoryType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public RenderKitIdType createRenderKitIdType() {
-		RenderKitIdTypeImpl renderKitIdType = new RenderKitIdTypeImpl();
-		return renderKitIdType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public RenderKitType createRenderKitType() {
-		RenderKitTypeImpl renderKitType = new RenderKitTypeImpl();
-		return renderKitType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public SmallIconType createSmallIconType() {
-		SmallIconTypeImpl smallIconType = new SmallIconTypeImpl();
-		return smallIconType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public SourceClassType createSourceClassType() {
-		SourceClassTypeImpl sourceClassType = new SourceClassTypeImpl();
-		return sourceClassType;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public StateManagerType createStateManagerType() {
-		StateManagerTypeImpl stateManagerType = new StateManagerTypeImpl();
-		return stateManagerType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public SuggestedValueType createSuggestedValueType() {
-		SuggestedValueTypeImpl suggestedValueType = new SuggestedValueTypeImpl();
-		return suggestedValueType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public SupportedLocaleType createSupportedLocaleType() {
-		SupportedLocaleTypeImpl supportedLocaleType = new SupportedLocaleTypeImpl();
-		return supportedLocaleType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public SystemEventClassType createSystemEventClassType() {
-		SystemEventClassTypeImpl systemEventClassType = new SystemEventClassTypeImpl();
-		return systemEventClassType;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public SystemEventListenerClassType createSystemEventListenerClassType() {
-		SystemEventListenerClassTypeImpl systemEventListenerClassType = new SystemEventListenerClassTypeImpl();
-		return systemEventListenerClassType;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public SystemEventListenerType createSystemEventListenerType() {
-		SystemEventListenerTypeImpl systemEventListenerType = new SystemEventListenerTypeImpl();
-		return systemEventListenerType;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public TagHandlerDelegateFactoryType createTagHandlerDelegateFactoryType() {
-		TagHandlerDelegateFactoryTypeImpl tagHandlerDelegateFactoryType = new TagHandlerDelegateFactoryTypeImpl();
-		return tagHandlerDelegateFactoryType;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ToViewIdType createToViewIdType() {
-		ToViewIdTypeImpl toViewIdType = new ToViewIdTypeImpl();
-		return toViewIdType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ValidatorClassType createValidatorClassType() {
-		ValidatorClassTypeImpl validatorClassType = new ValidatorClassTypeImpl();
-		return validatorClassType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ValidatorIdType createValidatorIdType() {
-		ValidatorIdTypeImpl validatorIdType = new ValidatorIdTypeImpl();
-		return validatorIdType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ValidatorType createValidatorType() {
-		ValidatorTypeImpl validatorType = new ValidatorTypeImpl();
-		return validatorType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ValueClassType createValueClassType() {
-		ValueClassTypeImpl valueClassType = new ValueClassTypeImpl();
-		return valueClassType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ValueType createValueType() {
-		ValueTypeImpl valueType = new ValueTypeImpl();
-		return valueType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public VariableResolverType createVariableResolverType() {
-		VariableResolverTypeImpl variableResolverType = new VariableResolverTypeImpl();
-		return variableResolverType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ViewHandlerType createViewHandlerType() {
-		ViewHandlerTypeImpl viewHandlerType = new ViewHandlerTypeImpl();
-		return viewHandlerType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public ApplicationExtensionType createApplicationExtensionType() {
-		ApplicationExtensionTypeImpl applicationExtensionType = new ApplicationExtensionTypeImpl();
-		return applicationExtensionType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public ResourceBundleType createResourceBundleType() {
-		ResourceBundleTypeImpl resourceBundleType = new ResourceBundleTypeImpl();
-		return resourceBundleType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public BaseNameType createBaseNameType() {
-		BaseNameTypeImpl baseNameType = new BaseNameTypeImpl();
-		return baseNameType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public VarType createVarType() {
-		VarTypeImpl varType = new VarTypeImpl();
-		return varType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ViewDeclarationLanguageFactoryType createViewDeclarationLanguageFactoryType() {
-		ViewDeclarationLanguageFactoryTypeImpl viewDeclarationLanguageFactoryType = new ViewDeclarationLanguageFactoryTypeImpl();
-		return viewDeclarationLanguageFactoryType;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public VisitContextFactoryType createVisitContextFactoryType() {
-		VisitContextFactoryTypeImpl visitContextFactoryType = new VisitContextFactoryTypeImpl();
-		return visitContextFactoryType;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public RenderKitExtensionType createRenderKitExtensionType() {
-		RenderKitExtensionTypeImpl renderKitExtensionType = new RenderKitExtensionTypeImpl();
-		return renderKitExtensionType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceHandlerType createResourceHandlerType() {
-		ResourceHandlerTypeImpl resourceHandlerType = new ResourceHandlerTypeImpl();
-		return resourceHandlerType;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public NavigationRuleExtensionType createNavigationRuleExtensionType() {
-		NavigationRuleExtensionTypeImpl navigationRuleExtensionType = new NavigationRuleExtensionTypeImpl();
-		return navigationRuleExtensionType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public ValidatorExtensionType createValidatorExtensionType() {
-		ValidatorExtensionTypeImpl validatorExtensionType = new ValidatorExtensionTypeImpl();
-		return validatorExtensionType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public FacesConfigExtensionType createFacesConfigExtensionType() {
-		FacesConfigExtensionTypeImpl facesConfigExtensionType = new FacesConfigExtensionTypeImpl();
-		return facesConfigExtensionType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public FactoryExtensionType createFactoryExtensionType() {
-		FactoryExtensionTypeImpl factoryExtensionType = new FactoryExtensionTypeImpl();
-		return factoryExtensionType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public LifecycleExtensionType createLifecycleExtensionType() {
-		LifecycleExtensionTypeImpl lifecycleExtensionType = new LifecycleExtensionTypeImpl();
-		return lifecycleExtensionType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public ManagedBeanExtensionType createManagedBeanExtensionType() {
-		ManagedBeanExtensionTypeImpl managedBeanExtensionType = new ManagedBeanExtensionTypeImpl();
-		return managedBeanExtensionType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public ConverterExtensionType createConverterExtensionType() {
-		ConverterExtensionTypeImpl converterExtensionType = new ConverterExtensionTypeImpl();
-		return converterExtensionType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FacesConfigPackage getFacesConfigPackage() {
-		return (FacesConfigPackage)getEPackage();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @return the package 
-	 * <!-- end-user-doc -->
-	 * @deprecated
-	 * @generated
-	 */
-	public static FacesConfigPackage getPackage() {
-		return FacesConfigPackage.eINSTANCE;
-	}
-
-} //FacesConfigFactoryImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FacesConfigPackageImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FacesConfigPackageImpl.java
deleted file mode 100644
index 3a9ae60..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FacesConfigPackageImpl.java
+++ /dev/null
@@ -1,12418 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.EReference;
-import org.eclipse.emf.ecore.impl.EPackageImpl;
-import org.eclipse.emf.ecore.xml.type.XMLTypePackage;
-import org.eclipse.jst.jsf.facesconfig.emf.*;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model <b>Package</b>.
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class FacesConfigPackageImpl extends EPackageImpl implements FacesConfigPackage {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; 
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass absoluteOrderingTypeEClass = null;
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass actionListenerTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass applicationFactoryTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass applicationTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass attributeClassTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass attributeExtensionTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass attributeNameTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass attributeTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass behaviorClassTypeEClass = null;
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass behaviorIdTypeEClass = null;
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass behaviorTypeEClass = null;
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass behaviorExtensionTypeEClass = null;
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass clientBehaviorRendererClassTypeEClass = null;
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass clientBehaviorRendererTypeEClass = null;
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass clientBehaviorRendererTypeTypeEClass = null;
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass componentClassTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass componentExtensionTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass componentFamilyTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass componentTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass componentTypeTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass converterClassTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass converterForClassTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass converterIdTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass converterTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass defaultLocaleTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass defaultRenderKitIdTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass defaultValidatorsTypeEClass = null;
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass defaultValueTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass descriptionTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass displayNameTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass documentRootEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    private EClass dynamicAttributeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    private EClass dynamicElementEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    private EClass elResolverTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass exceptionHandlerFactoryTypeEClass = null;
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass facesConfigTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass facesContextFactoryTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass facetExtensionTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass facetNameTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass facetTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass factoryTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass fromActionTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass fromOutcomeTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass fromViewIdTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass iconTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass ifTypeEClass = null;
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass keyClassTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass keyTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass largeIconTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass lifecycleFactoryTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass lifecycleTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass listEntriesTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass localeConfigTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass managedBeanClassTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass managedBeanNameTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass managedBeanScopeTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass managedBeanTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass managedPropertyTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass mapEntriesTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass mapEntryTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass messageBundleTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass nameTypeEClass = null;
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass navigationCaseTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass navigationHandlerTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass navigationRuleTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass nullValueTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass orderingTypeEClass = null;
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass orderingOrderingTypeEClass = null;
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass orderingOthersTypeEClass = null;
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass partialViewContextFactoryTypeEClass = null;
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass phaseListenerTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass propertyClassTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass propertyExtensionTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass propertyNameTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass propertyResolverTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass propertyTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass redirectTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass redirectViewParamTypeEClass = null;
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass referencedBeanClassTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass referencedBeanNameTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass referencedBeanTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass rendererClassTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass rendererExtensionTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass rendererTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass rendererTypeTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass renderKitClassTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass renderKitFactoryTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass renderKitIdTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass renderKitTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass smallIconTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass sourceClassTypeEClass = null;
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass stateManagerTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass suggestedValueTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass supportedLocaleTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass systemEventClassTypeEClass = null;
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass systemEventListenerClassTypeEClass = null;
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass systemEventListenerTypeEClass = null;
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass tagHandlerDelegateFactoryTypeEClass = null;
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass toViewIdTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass validatorClassTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass validatorIdTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass validatorTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass valueClassTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass valueTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass variableResolverTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass viewHandlerTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    private EClass resourceBundleTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    private EClass baseNameTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    private EClass varTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass viewDeclarationLanguageFactoryTypeEClass = null;
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass visitContextFactoryTypeEClass = null;
-
-				/**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    private EClass renderKitExtensionTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass resourceHandlerTypeEClass = null;
-
-				/**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    private EClass navigationRuleExtensionTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    private EClass validatorExtensionTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    private EClass facesConfigExtensionTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    private EClass factoryExtensionTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    private EClass lifecycleExtensionTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    private EClass managedBeanExtensionTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    private EClass converterExtensionTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    private EClass extensionTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass externalContextFactoryTypeEClass = null;
-
-				/**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    private EClass applicationExtensionTypeEClass = null;
-
-    /**
-	 * Creates an instance of the model <b>Package</b>, registered with
-	 * {@link org.eclipse.emf.ecore.EPackage.Registry EPackage.Registry} by the package
-	 * package URI value.
-	 * <p>Note: the correct way to create the package is via the static
-	 * factory method {@link #init init()}, which also performs
-	 * initialization of the package, or returns the registered package,
-	 * if one already exists.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.emf.ecore.EPackage.Registry
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#eNS_URI
-	 * @see #init()
-	 * @generated
-	 */
-	private FacesConfigPackageImpl() {
-		super(eNS_URI, FacesConfigFactory.eINSTANCE);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static boolean isInited = false;
-
-    /**
-	 * Creates, registers, and initializes the <b>Package</b> for this model, and for any others upon which it depends.
-	 * 
-	 * <p>This method is used to initialize {@link FacesConfigPackage#eINSTANCE} when that field is accessed.
-	 * Clients should not invoke it directly. Instead, they should simply access that field to obtain the package.
-	 * <!-- begin-user-doc -->
-     * @return the package 
-	 * <!-- end-user-doc -->
-	 * @see #eNS_URI
-	 * @see #createPackageContents()
-	 * @see #initializePackageContents()
-	 * @generated
-	 */
-	public static FacesConfigPackage init() {
-		if (isInited) return (FacesConfigPackage)EPackage.Registry.INSTANCE.getEPackage(FacesConfigPackage.eNS_URI);
-
-		// Obtain or create and register package
-		FacesConfigPackageImpl theFacesConfigPackage = (FacesConfigPackageImpl)(EPackage.Registry.INSTANCE.get(eNS_URI) instanceof FacesConfigPackageImpl ? EPackage.Registry.INSTANCE.get(eNS_URI) : new FacesConfigPackageImpl());
-
-		isInited = true;
-
-		// Initialize simple dependencies
-		XMLTypePackage.eINSTANCE.eClass();
-
-		// Create package meta-data objects
-		theFacesConfigPackage.createPackageContents();
-
-		// Initialize created meta-data
-		theFacesConfigPackage.initializePackageContents();
-
-		// Mark meta-data to indicate it can't be changed
-		theFacesConfigPackage.freeze();
-
-  
-		// Update the registry and return the package
-		EPackage.Registry.INSTANCE.put(FacesConfigPackage.eNS_URI, theFacesConfigPackage);
-		return theFacesConfigPackage;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getAbsoluteOrderingType() {
-		return absoluteOrderingTypeEClass;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getAbsoluteOrderingType_Name() {
-		return (EReference)absoluteOrderingTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getAbsoluteOrderingType_Others() {
-		return (EReference)absoluteOrderingTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getActionListenerType() {
-		return actionListenerTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getActionListenerType_TextContent() {
-		return (EAttribute)actionListenerTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getActionListenerType_Id() {
-		return (EAttribute)actionListenerTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getApplicationFactoryType() {
-		return applicationFactoryTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getApplicationFactoryType_TextContent() {
-		return (EAttribute)applicationFactoryTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getApplicationFactoryType_Id() {
-		return (EAttribute)applicationFactoryTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getApplicationType() {
-		return applicationTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getApplicationType_ActionListener() {
-		return (EReference)applicationTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getApplicationType_DefaultRenderKitId() {
-		return (EReference)applicationTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getApplicationType_MessageBundle() {
-		return (EReference)applicationTypeEClass.getEStructuralFeatures().get(2);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getApplicationType_NavigationHandler() {
-		return (EReference)applicationTypeEClass.getEStructuralFeatures().get(3);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getApplicationType_ViewHandler() {
-		return (EReference)applicationTypeEClass.getEStructuralFeatures().get(4);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getApplicationType_StateManager() {
-		return (EReference)applicationTypeEClass.getEStructuralFeatures().get(5);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getApplicationType_PropertyResolver() {
-		return (EReference)applicationTypeEClass.getEStructuralFeatures().get(7);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getApplicationType_VariableResolver() {
-		return (EReference)applicationTypeEClass.getEStructuralFeatures().get(8);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getApplicationType_ResourceHandler() {
-		return (EReference)applicationTypeEClass.getEStructuralFeatures().get(9);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getApplicationType_SystemEventListener() {
-		return (EReference)applicationTypeEClass.getEStructuralFeatures().get(10);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getApplicationType_LocaleConfig() {
-		return (EReference)applicationTypeEClass.getEStructuralFeatures().get(11);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getApplicationType_Id() {
-		return (EAttribute)applicationTypeEClass.getEStructuralFeatures().get(15);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EReference getApplicationType_ELResolver() {
-		return (EReference)applicationTypeEClass.getEStructuralFeatures().get(6);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EReference getApplicationType_ResourceBundle() {
-		return (EReference)applicationTypeEClass.getEStructuralFeatures().get(12);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EReference getApplicationType_ApplicationExtension() {
-		return (EReference)applicationTypeEClass.getEStructuralFeatures().get(13);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getApplicationType_DefaultValidators() {
-		return (EReference)applicationTypeEClass.getEStructuralFeatures().get(14);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getAttributeClassType() {
-		return attributeClassTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getAttributeClassType_TextContent() {
-		return (EAttribute)attributeClassTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getAttributeClassType_Id() {
-		return (EAttribute)attributeClassTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getAttributeExtensionType() {
-		return attributeExtensionTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getAttributeNameType() {
-		return attributeNameTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getAttributeNameType_TextContent() {
-		return (EAttribute)attributeNameTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getAttributeNameType_Id() {
-		return (EAttribute)attributeNameTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getAttributeType() {
-		return attributeTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getAttributeType_Description() {
-		return (EReference)attributeTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getAttributeType_DisplayName() {
-		return (EReference)attributeTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getAttributeType_Icon() {
-		return (EReference)attributeTypeEClass.getEStructuralFeatures().get(2);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getAttributeType_AttributeName() {
-		return (EReference)attributeTypeEClass.getEStructuralFeatures().get(3);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getAttributeType_AttributeClass() {
-		return (EReference)attributeTypeEClass.getEStructuralFeatures().get(4);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getAttributeType_DefaultValue() {
-		return (EReference)attributeTypeEClass.getEStructuralFeatures().get(5);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getAttributeType_SuggestedValue() {
-		return (EReference)attributeTypeEClass.getEStructuralFeatures().get(6);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getAttributeType_AttributeExtension() {
-		return (EReference)attributeTypeEClass.getEStructuralFeatures().get(7);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getAttributeType_Id() {
-		return (EAttribute)attributeTypeEClass.getEStructuralFeatures().get(8);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getBehaviorClassType() {
-		return behaviorClassTypeEClass;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getBehaviorClassType_TextContent() {
-		return (EAttribute)behaviorClassTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getBehaviorClassType_Id() {
-		return (EAttribute)behaviorClassTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getBehaviorIdType() {
-		return behaviorIdTypeEClass;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getBehaviorIdType_TextContent() {
-		return (EAttribute)behaviorIdTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getBehaviorIdType_Id() {
-		return (EAttribute)behaviorIdTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getBehaviorType() {
-		return behaviorTypeEClass;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getBehaviorType_Description() {
-		return (EReference)behaviorTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getBehaviorType_DisplayName() {
-		return (EReference)behaviorTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getBehaviorType_Icon() {
-		return (EReference)behaviorTypeEClass.getEStructuralFeatures().get(2);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getBehaviorType_BehaviorId() {
-		return (EReference)behaviorTypeEClass.getEStructuralFeatures().get(3);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getBehaviorType_BehaviorClass() {
-		return (EReference)behaviorTypeEClass.getEStructuralFeatures().get(4);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getBehaviorType_Attribute() {
-		return (EReference)behaviorTypeEClass.getEStructuralFeatures().get(5);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getBehaviorType_Property() {
-		return (EReference)behaviorTypeEClass.getEStructuralFeatures().get(6);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getBehaviorType_BehaviorExtension() {
-		return (EReference)behaviorTypeEClass.getEStructuralFeatures().get(7);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getBehaviorExtensionType() {
-		return behaviorExtensionTypeEClass;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getClientBehaviorRendererClassType() {
-		return clientBehaviorRendererClassTypeEClass;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getClientBehaviorRendererClassType_TextContent() {
-		return (EAttribute)clientBehaviorRendererClassTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getClientBehaviorRendererClassType_Id() {
-		return (EAttribute)clientBehaviorRendererClassTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getClientBehaviorRendererType() {
-		return clientBehaviorRendererTypeEClass;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getClientBehaviorRendererType_ClientBehaviorRendererType() {
-		return (EReference)clientBehaviorRendererTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getClientBehaviorRendererType_ClientBehaviorRendererClass() {
-		return (EReference)clientBehaviorRendererTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getClientBehaviorRendererTypeType() {
-		return clientBehaviorRendererTypeTypeEClass;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getClientBehaviorRendererTypeType_TextContent() {
-		return (EAttribute)clientBehaviorRendererTypeTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getClientBehaviorRendererTypeType_Id() {
-		return (EAttribute)clientBehaviorRendererTypeTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getComponentClassType() {
-		return componentClassTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getComponentClassType_TextContent() {
-		return (EAttribute)componentClassTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getComponentClassType_Id() {
-		return (EAttribute)componentClassTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getComponentExtensionType() {
-		return componentExtensionTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getComponentFamilyType() {
-		return componentFamilyTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getComponentFamilyType_TextContent() {
-		return (EAttribute)componentFamilyTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getComponentFamilyType_Id() {
-		return (EAttribute)componentFamilyTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getComponentType() {
-		return componentTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getComponentType_Description() {
-		return (EReference)componentTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getComponentType_DisplayName() {
-		return (EReference)componentTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getComponentType_Icon() {
-		return (EReference)componentTypeEClass.getEStructuralFeatures().get(2);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getComponentType_ComponentType() {
-		return (EReference)componentTypeEClass.getEStructuralFeatures().get(3);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getComponentType_ComponentClass() {
-		return (EReference)componentTypeEClass.getEStructuralFeatures().get(4);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getComponentType_Facet() {
-		return (EReference)componentTypeEClass.getEStructuralFeatures().get(5);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getComponentType_Attribute() {
-		return (EReference)componentTypeEClass.getEStructuralFeatures().get(6);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getComponentType_Property() {
-		return (EReference)componentTypeEClass.getEStructuralFeatures().get(7);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getComponentType_ComponentExtension() {
-		return (EReference)componentTypeEClass.getEStructuralFeatures().get(8);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getComponentType_Id() {
-		return (EAttribute)componentTypeEClass.getEStructuralFeatures().get(9);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getComponentTypeType() {
-		return componentTypeTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getComponentTypeType_TextContent() {
-		return (EAttribute)componentTypeTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getComponentTypeType_Id() {
-		return (EAttribute)componentTypeTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getConverterClassType() {
-		return converterClassTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getConverterClassType_TextContent() {
-		return (EAttribute)converterClassTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getConverterClassType_Id() {
-		return (EAttribute)converterClassTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getConverterForClassType() {
-		return converterForClassTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getConverterForClassType_TextContent() {
-		return (EAttribute)converterForClassTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getConverterForClassType_Id() {
-		return (EAttribute)converterForClassTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getConverterIdType() {
-		return converterIdTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getConverterIdType_TextContent() {
-		return (EAttribute)converterIdTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getConverterIdType_Id() {
-		return (EAttribute)converterIdTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getConverterType() {
-		return converterTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getConverterType_Description() {
-		return (EReference)converterTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getConverterType_DisplayName() {
-		return (EReference)converterTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getConverterType_Icon() {
-		return (EReference)converterTypeEClass.getEStructuralFeatures().get(2);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getConverterType_ConverterId() {
-		return (EReference)converterTypeEClass.getEStructuralFeatures().get(3);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getConverterType_ConverterForClass() {
-		return (EReference)converterTypeEClass.getEStructuralFeatures().get(4);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getConverterType_ConverterClass() {
-		return (EReference)converterTypeEClass.getEStructuralFeatures().get(5);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getConverterType_Attribute() {
-		return (EReference)converterTypeEClass.getEStructuralFeatures().get(6);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getConverterType_Property() {
-		return (EReference)converterTypeEClass.getEStructuralFeatures().get(7);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EReference getConverterType_ConverterExtension() {
-		return (EReference)converterTypeEClass.getEStructuralFeatures().get(8);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getConverterType_Id() {
-		return (EAttribute)converterTypeEClass.getEStructuralFeatures().get(9);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getDefaultLocaleType() {
-		return defaultLocaleTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getDefaultLocaleType_TextContent() {
-		return (EAttribute)defaultLocaleTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getDefaultLocaleType_Id() {
-		return (EAttribute)defaultLocaleTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getDefaultRenderKitIdType() {
-		return defaultRenderKitIdTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getDefaultRenderKitIdType_TextContent() {
-		return (EAttribute)defaultRenderKitIdTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getDefaultRenderKitIdType_Id() {
-		return (EAttribute)defaultRenderKitIdTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getDefaultValidatorsType() {
-		return defaultValidatorsTypeEClass;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDefaultValidatorsType_ValidatorId() {
-		return (EReference)defaultValidatorsTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getDefaultValidatorsType_Id() {
-		return (EAttribute)defaultValidatorsTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getDefaultValueType() {
-		return defaultValueTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getDefaultValueType_TextContent() {
-		return (EAttribute)defaultValueTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getDefaultValueType_Id() {
-		return (EAttribute)defaultValueTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getDescriptionType() {
-		return descriptionTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getDescriptionType_TextContent() {
-		return (EAttribute)descriptionTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getDescriptionType_Lang() {
-		return (EAttribute)descriptionTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getDescriptionType_Id() {
-		return (EAttribute)descriptionTypeEClass.getEStructuralFeatures().get(2);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getDisplayNameType() {
-		return displayNameTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getDisplayNameType_TextContent() {
-		return (EAttribute)displayNameTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getDisplayNameType_Lang() {
-		return (EAttribute)displayNameTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getDisplayNameType_Id() {
-		return (EAttribute)displayNameTypeEClass.getEStructuralFeatures().get(2);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getDocumentRoot() {
-		return documentRootEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getDocumentRoot_Mixed() {
-		return (EAttribute)documentRootEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_XMLNSPrefixMap() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_XSISchemaLocation() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(2);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_AbsoluteOrdering() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(3);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_ActionListener() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(4);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_Application() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(5);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_ApplicationFactory() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(6);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_Attribute() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(7);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_AttributeClass() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(8);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_AttributeExtension() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(9);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_AttributeName() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(10);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_Behavior() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(11);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_BehaviorClass() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(12);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_BehaviorId() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(13);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_BehaviorExtension() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(14);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_Component() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(15);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_ComponentClass() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(16);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_ComponentExtension() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(17);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_ComponentFamily() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(18);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_ComponentType() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(19);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_Converter() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(20);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_ConverterClass() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(21);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_ConverterForClass() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(22);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_ConverterId() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(23);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_DefaultLocale() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(24);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_DefaultRenderKitId() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(25);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_DefaultValidators() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(26);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_DefaultValue() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(27);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_Description() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(28);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_DisplayName() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(29);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_ExceptionHandlerFactory() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(30);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_ExternalContextFactory() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(31);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_FacesConfig() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(32);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_FacesContextFactory() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(33);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_Facet() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(34);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_FacetExtension() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(35);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_FacetName() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(36);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_Factory() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(37);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_FromAction() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(38);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_FromOutcome() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(39);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_FromViewId() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(40);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_Icon() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(41);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_If() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(42);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_Key() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(43);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_KeyClass() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(44);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_LargeIcon() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(45);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_Lifecycle() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(46);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_LifecycleFactory() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(47);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_ListEntries() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(48);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_LocaleConfig() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(49);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_ManagedBean() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(50);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_ManagedBeanClass() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(51);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_ManagedBeanName() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(52);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_ManagedBeanScope() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(53);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_ManagedProperty() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(54);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_MapEntries() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(55);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_MapEntry() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(56);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_MessageBundle() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(57);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_Name() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(58);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_NavigationCase() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(59);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_NavigationHandler() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(60);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_NavigationRule() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(61);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_NullValue() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(62);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_Ordering() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(63);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_OrderingOrdering() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(64);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_Others() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(65);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_PartialViewContextFactory() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(66);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_PhaseListener() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(67);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_Property() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(68);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_PropertyClass() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(69);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_PropertyExtension() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(70);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_PropertyName() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(71);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_PropertyResolver() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(72);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_Redirect() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(73);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_RedirectViewParam() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(74);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_ReferencedBean() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(75);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_ReferencedBeanClass() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(76);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_ReferencedBeanName() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(77);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_Renderer() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(78);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_RendererClass() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(79);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_RendererExtension() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(80);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_RendererType() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(81);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_RenderKit() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(82);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_RenderKitClass() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(83);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_RenderKitFactory() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(84);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_RenderKitId() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(85);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_ResourceHandler() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(86);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_SmallIcon() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(87);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_SourceClass() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(88);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_StateManager() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(89);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_SuggestedValue() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(90);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_SupportedLocale() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(91);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_SystemEventClass() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(92);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_SystemEventListener() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(93);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_SystemEventListenerClass() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(94);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_TagHandlerDelegateFactory() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(95);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_ToViewId() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(96);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_Validator() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(97);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_ValidatorClass() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(98);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_ValidatorId() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(99);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_Value() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(100);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_ValueClass() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(101);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_VariableResolver() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(102);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_ViewDeclarationLanguageFactory() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(103);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_ViewHandler() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(104);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_VisitContextFactory() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(105);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EClass getDynamicAttribute() {
-		return dynamicAttributeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EAttribute getDynamicAttribute_Name() {
-		return (EAttribute)dynamicAttributeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EAttribute getDynamicAttribute_Value() {
-		return (EAttribute)dynamicAttributeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EClass getDynamicElement() {
-		return dynamicElementEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EReference getDynamicElement_ChildNodes() {
-		return (EReference)dynamicElementEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EReference getDynamicElement_Attributes() {
-		return (EReference)dynamicElementEClass.getEStructuralFeatures().get(2);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EAttribute getDynamicElement_TextContent() {
-		return (EAttribute)dynamicElementEClass.getEStructuralFeatures().get(3);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EClass getELResolverType() {
-		return elResolverTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EAttribute getELResolverType_TextContent() {
-		return (EAttribute)elResolverTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EAttribute getELResolverType_Id() {
-		return (EAttribute)elResolverTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getExceptionHandlerFactoryType() {
-		return exceptionHandlerFactoryTypeEClass;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getExceptionHandlerFactoryType_TextContent() {
-		return (EAttribute)exceptionHandlerFactoryTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getExceptionHandlerFactoryType_Id() {
-		return (EAttribute)exceptionHandlerFactoryTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EAttribute getDynamicElement_Name() {
-		return (EAttribute)dynamicElementEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getFacesConfigType() {
-		return facesConfigTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getFacesConfigType_Application() {
-		return (EReference)facesConfigTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getFacesConfigType_Ordering() {
-		return (EReference)facesConfigTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getFacesConfigType_AbsoluteOrdering() {
-		return (EReference)facesConfigTypeEClass.getEStructuralFeatures().get(2);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getFacesConfigType_Factory() {
-		return (EReference)facesConfigTypeEClass.getEStructuralFeatures().get(3);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getFacesConfigType_Component() {
-		return (EReference)facesConfigTypeEClass.getEStructuralFeatures().get(4);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getFacesConfigType_Converter() {
-		return (EReference)facesConfigTypeEClass.getEStructuralFeatures().get(5);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getFacesConfigType_ManagedBean() {
-		return (EReference)facesConfigTypeEClass.getEStructuralFeatures().get(6);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getFacesConfigType_Name() {
-		return (EReference)facesConfigTypeEClass.getEStructuralFeatures().get(7);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getFacesConfigType_NavigationRule() {
-		return (EReference)facesConfigTypeEClass.getEStructuralFeatures().get(8);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getFacesConfigType_ReferencedBean() {
-		return (EReference)facesConfigTypeEClass.getEStructuralFeatures().get(9);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getFacesConfigType_RenderKit() {
-		return (EReference)facesConfigTypeEClass.getEStructuralFeatures().get(10);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getFacesConfigType_Lifecycle() {
-		return (EReference)facesConfigTypeEClass.getEStructuralFeatures().get(11);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getFacesConfigType_Validator() {
-		return (EReference)facesConfigTypeEClass.getEStructuralFeatures().get(12);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getFacesConfigType_Behavior() {
-		return (EReference)facesConfigTypeEClass.getEStructuralFeatures().get(13);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EReference getFacesConfigType_FacesConfigExtension() {
-		return (EReference)facesConfigTypeEClass.getEStructuralFeatures().get(14);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getFacesConfigType_Xmlns() {
-		return (EAttribute)facesConfigTypeEClass.getEStructuralFeatures().get(15);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getFacesConfigType_Id() {
-		return (EAttribute)facesConfigTypeEClass.getEStructuralFeatures().get(16);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getFacesConfigType_MetadataComplete() {
-		return (EAttribute)facesConfigTypeEClass.getEStructuralFeatures().get(17);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getFacesContextFactoryType() {
-		return facesContextFactoryTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getFacesContextFactoryType_TextContent() {
-		return (EAttribute)facesContextFactoryTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getFacesContextFactoryType_Id() {
-		return (EAttribute)facesContextFactoryTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getFacetExtensionType() {
-		return facetExtensionTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getFacetNameType() {
-		return facetNameTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getFacetNameType_TextContent() {
-		return (EAttribute)facetNameTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getFacetNameType_Id() {
-		return (EAttribute)facetNameTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getFacetType() {
-		return facetTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getFacetType_Description() {
-		return (EReference)facetTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getFacetType_DisplayName() {
-		return (EReference)facetTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getFacetType_Icon() {
-		return (EReference)facetTypeEClass.getEStructuralFeatures().get(2);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getFacetType_FacetName() {
-		return (EReference)facetTypeEClass.getEStructuralFeatures().get(3);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getFacetType_FacetExtension() {
-		return (EReference)facetTypeEClass.getEStructuralFeatures().get(4);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getFacetType_Id() {
-		return (EAttribute)facetTypeEClass.getEStructuralFeatures().get(5);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getFactoryType() {
-		return factoryTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getFactoryType_ApplicationFactory() {
-		return (EReference)factoryTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getFactoryType_ExceptionHandlerFactory() {
-		return (EReference)factoryTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getFactoryType_ExternalContextFactory() {
-		return (EReference)factoryTypeEClass.getEStructuralFeatures().get(2);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getFactoryType_FacesContextFactory() {
-		return (EReference)factoryTypeEClass.getEStructuralFeatures().get(3);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getFactoryType_PartialViewContextFactory() {
-		return (EReference)factoryTypeEClass.getEStructuralFeatures().get(4);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getFactoryType_LifecycleFactory() {
-		return (EReference)factoryTypeEClass.getEStructuralFeatures().get(5);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getFactoryType_ViewDeclarationLanguageFactory() {
-		return (EReference)factoryTypeEClass.getEStructuralFeatures().get(6);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getFactoryType_TagHandlerDelegateFactory() {
-		return (EReference)factoryTypeEClass.getEStructuralFeatures().get(7);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getFactoryType_RenderKitFactory() {
-		return (EReference)factoryTypeEClass.getEStructuralFeatures().get(8);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getFactoryType_VisitContextFactory() {
-		return (EReference)factoryTypeEClass.getEStructuralFeatures().get(9);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EReference getFactoryType_FactoryExtension() {
-		return (EReference)factoryTypeEClass.getEStructuralFeatures().get(10);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getFactoryType_Id() {
-		return (EAttribute)factoryTypeEClass.getEStructuralFeatures().get(11);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getFromActionType() {
-		return fromActionTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getFromActionType_TextContent() {
-		return (EAttribute)fromActionTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getFromActionType_Id() {
-		return (EAttribute)fromActionTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getFromOutcomeType() {
-		return fromOutcomeTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getFromOutcomeType_TextContent() {
-		return (EAttribute)fromOutcomeTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getFromOutcomeType_Id() {
-		return (EAttribute)fromOutcomeTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getFromViewIdType() {
-		return fromViewIdTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getFromViewIdType_TextContent() {
-		return (EAttribute)fromViewIdTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getFromViewIdType_Id() {
-		return (EAttribute)fromViewIdTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getIconType() {
-		return iconTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getIconType_SmallIcon() {
-		return (EReference)iconTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getIconType_LargeIcon() {
-		return (EReference)iconTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getIconType_Lang() {
-		return (EAttribute)iconTypeEClass.getEStructuralFeatures().get(2);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getIconType_Id() {
-		return (EAttribute)iconTypeEClass.getEStructuralFeatures().get(3);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getIfType() {
-		return ifTypeEClass;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getIfType_TextContent() {
-		return (EAttribute)ifTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getIfType_Id() {
-		return (EAttribute)ifTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getKeyClassType() {
-		return keyClassTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getKeyClassType_TextContent() {
-		return (EAttribute)keyClassTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getKeyClassType_Id() {
-		return (EAttribute)keyClassTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getKeyType() {
-		return keyTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getKeyType_TextContent() {
-		return (EAttribute)keyTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getKeyType_Id() {
-		return (EAttribute)keyTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getLargeIconType() {
-		return largeIconTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getLargeIconType_TextContent() {
-		return (EAttribute)largeIconTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getLargeIconType_Id() {
-		return (EAttribute)largeIconTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getLifecycleFactoryType() {
-		return lifecycleFactoryTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getLifecycleFactoryType_TextContent() {
-		return (EAttribute)lifecycleFactoryTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getLifecycleFactoryType_Id() {
-		return (EAttribute)lifecycleFactoryTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getLifecycleType() {
-		return lifecycleTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getLifecycleType_PhaseListener() {
-		return (EReference)lifecycleTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EReference getLifecycleType_LifecycleExtension() {
-		return (EReference)lifecycleTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getLifecycleType_Id() {
-		return (EAttribute)lifecycleTypeEClass.getEStructuralFeatures().get(2);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getListEntriesType() {
-		return listEntriesTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getListEntriesType_ValueClass() {
-		return (EReference)listEntriesTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getListEntriesType_NullValue() {
-		return (EReference)listEntriesTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getListEntriesType_Value() {
-		return (EReference)listEntriesTypeEClass.getEStructuralFeatures().get(2);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getListEntriesType_Id() {
-		return (EAttribute)listEntriesTypeEClass.getEStructuralFeatures().get(3);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getLocaleConfigType() {
-		return localeConfigTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getLocaleConfigType_DefaultLocale() {
-		return (EReference)localeConfigTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getLocaleConfigType_SupportedLocale() {
-		return (EReference)localeConfigTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getLocaleConfigType_Id() {
-		return (EAttribute)localeConfigTypeEClass.getEStructuralFeatures().get(2);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getManagedBeanClassType() {
-		return managedBeanClassTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getManagedBeanClassType_TextContent() {
-		return (EAttribute)managedBeanClassTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getManagedBeanClassType_Id() {
-		return (EAttribute)managedBeanClassTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getManagedBeanNameType() {
-		return managedBeanNameTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getManagedBeanNameType_TextContent() {
-		return (EAttribute)managedBeanNameTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getManagedBeanNameType_Id() {
-		return (EAttribute)managedBeanNameTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getManagedBeanScopeType() {
-		return managedBeanScopeTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getManagedBeanScopeType_TextContent() {
-		return (EAttribute)managedBeanScopeTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getManagedBeanScopeType_Id() {
-		return (EAttribute)managedBeanScopeTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getManagedBeanType() {
-		return managedBeanTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getManagedBeanType_Description() {
-		return (EReference)managedBeanTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getManagedBeanType_DisplayName() {
-		return (EReference)managedBeanTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getManagedBeanType_Icon() {
-		return (EReference)managedBeanTypeEClass.getEStructuralFeatures().get(2);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getManagedBeanType_ManagedBeanName() {
-		return (EReference)managedBeanTypeEClass.getEStructuralFeatures().get(3);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getManagedBeanType_ManagedBeanClass() {
-		return (EReference)managedBeanTypeEClass.getEStructuralFeatures().get(4);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getManagedBeanType_ManagedBeanScope() {
-		return (EReference)managedBeanTypeEClass.getEStructuralFeatures().get(5);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getManagedBeanType_ManagedProperty() {
-		return (EReference)managedBeanTypeEClass.getEStructuralFeatures().get(6);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getManagedBeanType_MapEntries() {
-		return (EReference)managedBeanTypeEClass.getEStructuralFeatures().get(7);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getManagedBeanType_ListEntries() {
-		return (EReference)managedBeanTypeEClass.getEStructuralFeatures().get(8);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EReference getManagedBeanType_ManagedBeanExtension() {
-		return (EReference)managedBeanTypeEClass.getEStructuralFeatures().get(9);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getManagedBeanType_Id() {
-		return (EAttribute)managedBeanTypeEClass.getEStructuralFeatures().get(10);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getManagedBeanType_Eager() {
-		return (EAttribute)managedBeanTypeEClass.getEStructuralFeatures().get(11);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getManagedPropertyType() {
-		return managedPropertyTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getManagedPropertyType_Description() {
-		return (EReference)managedPropertyTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getManagedPropertyType_DisplayName() {
-		return (EReference)managedPropertyTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getManagedPropertyType_Icon() {
-		return (EReference)managedPropertyTypeEClass.getEStructuralFeatures().get(2);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getManagedPropertyType_PropertyName() {
-		return (EReference)managedPropertyTypeEClass.getEStructuralFeatures().get(3);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getManagedPropertyType_PropertyClass() {
-		return (EReference)managedPropertyTypeEClass.getEStructuralFeatures().get(4);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getManagedPropertyType_MapEntries() {
-		return (EReference)managedPropertyTypeEClass.getEStructuralFeatures().get(5);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getManagedPropertyType_NullValue() {
-		return (EReference)managedPropertyTypeEClass.getEStructuralFeatures().get(6);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getManagedPropertyType_Value() {
-		return (EReference)managedPropertyTypeEClass.getEStructuralFeatures().get(7);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getManagedPropertyType_ListEntries() {
-		return (EReference)managedPropertyTypeEClass.getEStructuralFeatures().get(8);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getManagedPropertyType_Id() {
-		return (EAttribute)managedPropertyTypeEClass.getEStructuralFeatures().get(9);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getMapEntriesType() {
-		return mapEntriesTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getMapEntriesType_KeyClass() {
-		return (EReference)mapEntriesTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getMapEntriesType_ValueClass() {
-		return (EReference)mapEntriesTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getMapEntriesType_MapEntry() {
-		return (EReference)mapEntriesTypeEClass.getEStructuralFeatures().get(2);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getMapEntriesType_Id() {
-		return (EAttribute)mapEntriesTypeEClass.getEStructuralFeatures().get(3);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getMapEntryType() {
-		return mapEntryTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getMapEntryType_Key() {
-		return (EReference)mapEntryTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getMapEntryType_NullValue() {
-		return (EReference)mapEntryTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getMapEntryType_Value() {
-		return (EReference)mapEntryTypeEClass.getEStructuralFeatures().get(2);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getMapEntryType_Id() {
-		return (EAttribute)mapEntryTypeEClass.getEStructuralFeatures().get(3);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getMessageBundleType() {
-		return messageBundleTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getMessageBundleType_TextContent() {
-		return (EAttribute)messageBundleTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getMessageBundleType_Id() {
-		return (EAttribute)messageBundleTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getNameType() {
-		return nameTypeEClass;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getNameType_TextContent() {
-		return (EAttribute)nameTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getNameType_Id() {
-		return (EAttribute)nameTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getNavigationCaseType() {
-		return navigationCaseTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getNavigationCaseType_Description() {
-		return (EReference)navigationCaseTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getNavigationCaseType_DisplayName() {
-		return (EReference)navigationCaseTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getNavigationCaseType_Icon() {
-		return (EReference)navigationCaseTypeEClass.getEStructuralFeatures().get(2);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getNavigationCaseType_FromAction() {
-		return (EReference)navigationCaseTypeEClass.getEStructuralFeatures().get(3);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getNavigationCaseType_FromOutcome() {
-		return (EReference)navigationCaseTypeEClass.getEStructuralFeatures().get(4);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getNavigationCaseType_If() {
-		return (EReference)navigationCaseTypeEClass.getEStructuralFeatures().get(5);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getNavigationCaseType_ToViewId() {
-		return (EReference)navigationCaseTypeEClass.getEStructuralFeatures().get(6);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getNavigationCaseType_Redirect() {
-		return (EReference)navigationCaseTypeEClass.getEStructuralFeatures().get(7);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getNavigationCaseType_Id() {
-		return (EAttribute)navigationCaseTypeEClass.getEStructuralFeatures().get(8);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getNavigationHandlerType() {
-		return navigationHandlerTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getNavigationHandlerType_TextContent() {
-		return (EAttribute)navigationHandlerTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getNavigationHandlerType_Id() {
-		return (EAttribute)navigationHandlerTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getNavigationRuleType() {
-		return navigationRuleTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getNavigationRuleType_Description() {
-		return (EReference)navigationRuleTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getNavigationRuleType_DisplayName() {
-		return (EReference)navigationRuleTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getNavigationRuleType_Icon() {
-		return (EReference)navigationRuleTypeEClass.getEStructuralFeatures().get(2);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getNavigationRuleType_FromViewId() {
-		return (EReference)navigationRuleTypeEClass.getEStructuralFeatures().get(3);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getNavigationRuleType_NavigationCase() {
-		return (EReference)navigationRuleTypeEClass.getEStructuralFeatures().get(4);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EReference getNavigationRuleType_NavigationRuleExtension() {
-		return (EReference)navigationRuleTypeEClass.getEStructuralFeatures().get(5);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getNavigationRuleType_Id() {
-		return (EAttribute)navigationRuleTypeEClass.getEStructuralFeatures().get(6);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getNullValueType() {
-		return nullValueTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getNullValueType_Id() {
-		return (EAttribute)nullValueTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getOrderingType() {
-		return orderingTypeEClass;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getOrderingType_Before() {
-		return (EReference)orderingTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getOrderingType_After() {
-		return (EReference)orderingTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getOrderingOrderingType() {
-		return orderingOrderingTypeEClass;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getOrderingOrderingType_Name() {
-		return (EReference)orderingOrderingTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getOrderingOrderingType_Others() {
-		return (EReference)orderingOrderingTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getOrderingOthersType() {
-		return orderingOthersTypeEClass;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getOrderingOthersType_Id() {
-		return (EAttribute)orderingOthersTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getPartialViewContextFactoryType() {
-		return partialViewContextFactoryTypeEClass;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getPartialViewContextFactoryType_TextContent() {
-		return (EAttribute)partialViewContextFactoryTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getPartialViewContextFactoryType_Id() {
-		return (EAttribute)partialViewContextFactoryTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getPhaseListenerType() {
-		return phaseListenerTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getPhaseListenerType_TextContent() {
-		return (EAttribute)phaseListenerTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getPhaseListenerType_Id() {
-		return (EAttribute)phaseListenerTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getPropertyClassType() {
-		return propertyClassTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getPropertyClassType_TextContent() {
-		return (EAttribute)propertyClassTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getPropertyClassType_Id() {
-		return (EAttribute)propertyClassTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getPropertyExtensionType() {
-		return propertyExtensionTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getPropertyNameType() {
-		return propertyNameTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getPropertyNameType_TextContent() {
-		return (EAttribute)propertyNameTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getPropertyNameType_Id() {
-		return (EAttribute)propertyNameTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getPropertyResolverType() {
-		return propertyResolverTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getPropertyResolverType_TextContent() {
-		return (EAttribute)propertyResolverTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getPropertyResolverType_Id() {
-		return (EAttribute)propertyResolverTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getPropertyType() {
-		return propertyTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getPropertyType_Description() {
-		return (EReference)propertyTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getPropertyType_DisplayName() {
-		return (EReference)propertyTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getPropertyType_Icon() {
-		return (EReference)propertyTypeEClass.getEStructuralFeatures().get(2);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getPropertyType_PropertyName() {
-		return (EReference)propertyTypeEClass.getEStructuralFeatures().get(3);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getPropertyType_PropertyClass() {
-		return (EReference)propertyTypeEClass.getEStructuralFeatures().get(4);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getPropertyType_DefaultValue() {
-		return (EReference)propertyTypeEClass.getEStructuralFeatures().get(5);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getPropertyType_SuggestedValue() {
-		return (EReference)propertyTypeEClass.getEStructuralFeatures().get(6);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getPropertyType_PropertyExtension() {
-		return (EReference)propertyTypeEClass.getEStructuralFeatures().get(7);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getPropertyType_Id() {
-		return (EAttribute)propertyTypeEClass.getEStructuralFeatures().get(8);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getRedirectType() {
-		return redirectTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getRedirectType_ViewParam() {
-		return (EReference)redirectTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getRedirectType_Id() {
-		return (EAttribute)redirectTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getRedirectType_IncludeViewParams() {
-		return (EAttribute)redirectTypeEClass.getEStructuralFeatures().get(2);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getRedirectViewParamType() {
-		return redirectViewParamTypeEClass;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getRedirectViewParamType_Name() {
-		return (EReference)redirectViewParamTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getRedirectViewParamType_Value() {
-		return (EReference)redirectViewParamTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getRedirectViewParamType_Id() {
-		return (EAttribute)redirectViewParamTypeEClass.getEStructuralFeatures().get(2);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getReferencedBeanClassType() {
-		return referencedBeanClassTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getReferencedBeanClassType_TextContent() {
-		return (EAttribute)referencedBeanClassTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getReferencedBeanClassType_Id() {
-		return (EAttribute)referencedBeanClassTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getReferencedBeanNameType() {
-		return referencedBeanNameTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getReferencedBeanNameType_TextContent() {
-		return (EAttribute)referencedBeanNameTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getReferencedBeanNameType_Id() {
-		return (EAttribute)referencedBeanNameTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getReferencedBeanType() {
-		return referencedBeanTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getReferencedBeanType_Description() {
-		return (EReference)referencedBeanTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getReferencedBeanType_DisplayName() {
-		return (EReference)referencedBeanTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getReferencedBeanType_Icon() {
-		return (EReference)referencedBeanTypeEClass.getEStructuralFeatures().get(2);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getReferencedBeanType_ReferencedBeanName() {
-		return (EReference)referencedBeanTypeEClass.getEStructuralFeatures().get(3);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getReferencedBeanType_ReferencedBeanClass() {
-		return (EReference)referencedBeanTypeEClass.getEStructuralFeatures().get(4);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getReferencedBeanType_Id() {
-		return (EAttribute)referencedBeanTypeEClass.getEStructuralFeatures().get(5);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getRendererClassType() {
-		return rendererClassTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getRendererClassType_TextContent() {
-		return (EAttribute)rendererClassTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getRendererClassType_Id() {
-		return (EAttribute)rendererClassTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getRendererExtensionType() {
-		return rendererExtensionTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getRendererType() {
-		return rendererTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getRendererType_Description() {
-		return (EReference)rendererTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getRendererType_DisplayName() {
-		return (EReference)rendererTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getRendererType_Icon() {
-		return (EReference)rendererTypeEClass.getEStructuralFeatures().get(2);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getRendererType_ComponentFamily() {
-		return (EReference)rendererTypeEClass.getEStructuralFeatures().get(3);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getRendererType_RendererType() {
-		return (EReference)rendererTypeEClass.getEStructuralFeatures().get(4);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getRendererType_RendererClass() {
-		return (EReference)rendererTypeEClass.getEStructuralFeatures().get(5);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getRendererType_Facet() {
-		return (EReference)rendererTypeEClass.getEStructuralFeatures().get(6);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getRendererType_Attribute() {
-		return (EReference)rendererTypeEClass.getEStructuralFeatures().get(7);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getRendererType_RendererExtension() {
-		return (EReference)rendererTypeEClass.getEStructuralFeatures().get(8);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getRendererType_Id() {
-		return (EAttribute)rendererTypeEClass.getEStructuralFeatures().get(9);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getRendererTypeType() {
-		return rendererTypeTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getRendererTypeType_TextContent() {
-		return (EAttribute)rendererTypeTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getRendererTypeType_Id() {
-		return (EAttribute)rendererTypeTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getRenderKitClassType() {
-		return renderKitClassTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getRenderKitClassType_TextContent() {
-		return (EAttribute)renderKitClassTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getRenderKitClassType_Id() {
-		return (EAttribute)renderKitClassTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getRenderKitFactoryType() {
-		return renderKitFactoryTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getRenderKitFactoryType_TextContent() {
-		return (EAttribute)renderKitFactoryTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getRenderKitFactoryType_Id() {
-		return (EAttribute)renderKitFactoryTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getRenderKitIdType() {
-		return renderKitIdTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getRenderKitIdType_TextContent() {
-		return (EAttribute)renderKitIdTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getRenderKitIdType_Id() {
-		return (EAttribute)renderKitIdTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getRenderKitType() {
-		return renderKitTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getRenderKitType_Description() {
-		return (EReference)renderKitTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getRenderKitType_DisplayName() {
-		return (EReference)renderKitTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getRenderKitType_Icon() {
-		return (EReference)renderKitTypeEClass.getEStructuralFeatures().get(2);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getRenderKitType_RenderKitId() {
-		return (EReference)renderKitTypeEClass.getEStructuralFeatures().get(3);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getRenderKitType_RenderKitClass() {
-		return (EReference)renderKitTypeEClass.getEStructuralFeatures().get(4);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getRenderKitType_Renderer() {
-		return (EReference)renderKitTypeEClass.getEStructuralFeatures().get(5);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getRenderKitType_ClientBehaviorRenderer() {
-		return (EReference)renderKitTypeEClass.getEStructuralFeatures().get(6);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EReference getRenderKitType_RenderKitExtension() {
-		return (EReference)renderKitTypeEClass.getEStructuralFeatures().get(7);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getRenderKitType_Id() {
-		return (EAttribute)renderKitTypeEClass.getEStructuralFeatures().get(8);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getSmallIconType() {
-		return smallIconTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getSmallIconType_TextContent() {
-		return (EAttribute)smallIconTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getSmallIconType_Id() {
-		return (EAttribute)smallIconTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getSourceClassType() {
-		return sourceClassTypeEClass;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getSourceClassType_TextContent() {
-		return (EAttribute)sourceClassTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getSourceClassType_Id() {
-		return (EAttribute)sourceClassTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getStateManagerType() {
-		return stateManagerTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getStateManagerType_TextContent() {
-		return (EAttribute)stateManagerTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getStateManagerType_Id() {
-		return (EAttribute)stateManagerTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getSuggestedValueType() {
-		return suggestedValueTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getSuggestedValueType_TextContent() {
-		return (EAttribute)suggestedValueTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getSuggestedValueType_Id() {
-		return (EAttribute)suggestedValueTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getSupportedLocaleType() {
-		return supportedLocaleTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getSupportedLocaleType_TextContent() {
-		return (EAttribute)supportedLocaleTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getSupportedLocaleType_Id() {
-		return (EAttribute)supportedLocaleTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getSystemEventClassType() {
-		return systemEventClassTypeEClass;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getSystemEventClassType_TextContent() {
-		return (EAttribute)systemEventClassTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getSystemEventClassType_Id() {
-		return (EAttribute)systemEventClassTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getSystemEventListenerClassType() {
-		return systemEventListenerClassTypeEClass;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getSystemEventListenerClassType_TextContent() {
-		return (EAttribute)systemEventListenerClassTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getSystemEventListenerClassType_Id() {
-		return (EAttribute)systemEventListenerClassTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getSystemEventListenerType() {
-		return systemEventListenerTypeEClass;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getSystemEventListenerType_SystemEventListenerClass() {
-		return (EReference)systemEventListenerTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getSystemEventListenerType_SystemEventClass() {
-		return (EReference)systemEventListenerTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getSystemEventListenerType_SourceClass() {
-		return (EReference)systemEventListenerTypeEClass.getEStructuralFeatures().get(2);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getSystemEventListenerType_Id() {
-		return (EAttribute)systemEventListenerTypeEClass.getEStructuralFeatures().get(3);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getTagHandlerDelegateFactoryType() {
-		return tagHandlerDelegateFactoryTypeEClass;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTagHandlerDelegateFactoryType_TextContent() {
-		return (EAttribute)tagHandlerDelegateFactoryTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTagHandlerDelegateFactoryType_Id() {
-		return (EAttribute)tagHandlerDelegateFactoryTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getToViewIdType() {
-		return toViewIdTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getToViewIdType_TextContent() {
-		return (EAttribute)toViewIdTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getToViewIdType_Id() {
-		return (EAttribute)toViewIdTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getValidatorClassType() {
-		return validatorClassTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getValidatorClassType_TextContent() {
-		return (EAttribute)validatorClassTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getValidatorClassType_Id() {
-		return (EAttribute)validatorClassTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getValidatorIdType() {
-		return validatorIdTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getValidatorIdType_TextContent() {
-		return (EAttribute)validatorIdTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getValidatorIdType_Id() {
-		return (EAttribute)validatorIdTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getValidatorType() {
-		return validatorTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getValidatorType_Description() {
-		return (EReference)validatorTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getValidatorType_DisplayName() {
-		return (EReference)validatorTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getValidatorType_Icon() {
-		return (EReference)validatorTypeEClass.getEStructuralFeatures().get(2);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getValidatorType_ValidatorId() {
-		return (EReference)validatorTypeEClass.getEStructuralFeatures().get(3);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getValidatorType_ValidatorClass() {
-		return (EReference)validatorTypeEClass.getEStructuralFeatures().get(4);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getValidatorType_Attribute() {
-		return (EReference)validatorTypeEClass.getEStructuralFeatures().get(5);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getValidatorType_Property() {
-		return (EReference)validatorTypeEClass.getEStructuralFeatures().get(6);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EReference getValidatorType_ValidatorExtension() {
-		return (EReference)validatorTypeEClass.getEStructuralFeatures().get(7);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getValidatorType_Id() {
-		return (EAttribute)validatorTypeEClass.getEStructuralFeatures().get(8);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getValueClassType() {
-		return valueClassTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getValueClassType_TextContent() {
-		return (EAttribute)valueClassTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getValueClassType_Id() {
-		return (EAttribute)valueClassTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getValueType() {
-		return valueTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getValueType_TextContent() {
-		return (EAttribute)valueTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getValueType_Id() {
-		return (EAttribute)valueTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getVariableResolverType() {
-		return variableResolverTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getVariableResolverType_TextContent() {
-		return (EAttribute)variableResolverTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getVariableResolverType_Id() {
-		return (EAttribute)variableResolverTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getViewHandlerType() {
-		return viewHandlerTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getViewHandlerType_TextContent() {
-		return (EAttribute)viewHandlerTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getViewHandlerType_Id() {
-		return (EAttribute)viewHandlerTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EClass getResourceBundleType() {
-		return resourceBundleTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EReference getResourceBundleType_Description() {
-		return (EReference)resourceBundleTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EReference getResourceBundleType_DisplayName() {
-		return (EReference)resourceBundleTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EReference getResourceBundleType_Icon() {
-		return (EReference)resourceBundleTypeEClass.getEStructuralFeatures().get(2);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EReference getResourceBundleType_BaseName() {
-		return (EReference)resourceBundleTypeEClass.getEStructuralFeatures().get(3);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EReference getResourceBundleType_Var() {
-		return (EReference)resourceBundleTypeEClass.getEStructuralFeatures().get(4);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EAttribute getResourceBundleType_Id() {
-		return (EAttribute)resourceBundleTypeEClass.getEStructuralFeatures().get(5);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EClass getBaseNameType() {
-		return baseNameTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EAttribute getBaseNameType_TextContent() {
-		return (EAttribute)baseNameTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EAttribute getBaseNameType_Id() {
-		return (EAttribute)baseNameTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EClass getVarType() {
-		return varTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EAttribute getVarType_TextContent() {
-		return (EAttribute)varTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EAttribute getVarType_Id() {
-		return (EAttribute)varTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getViewDeclarationLanguageFactoryType() {
-		return viewDeclarationLanguageFactoryTypeEClass;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getViewDeclarationLanguageFactoryType_TextContent() {
-		return (EAttribute)viewDeclarationLanguageFactoryTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getViewDeclarationLanguageFactoryType_Id() {
-		return (EAttribute)viewDeclarationLanguageFactoryTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getVisitContextFactoryType() {
-		return visitContextFactoryTypeEClass;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getVisitContextFactoryType_TextContent() {
-		return (EAttribute)visitContextFactoryTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getVisitContextFactoryType_Id() {
-		return (EAttribute)visitContextFactoryTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EClass getRenderKitExtensionType() {
-		return renderKitExtensionTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getResourceHandlerType() {
-		return resourceHandlerTypeEClass;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getResourceHandlerType_TextContent() {
-		return (EAttribute)resourceHandlerTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getResourceHandlerType_Id() {
-		return (EAttribute)resourceHandlerTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EClass getNavigationRuleExtensionType() {
-		return navigationRuleExtensionTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EClass getValidatorExtensionType() {
-		return validatorExtensionTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EClass getFacesConfigExtensionType() {
-		return facesConfigExtensionTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EClass getFactoryExtensionType() {
-		return factoryExtensionTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EClass getLifecycleExtensionType() {
-		return lifecycleExtensionTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EClass getManagedBeanExtensionType() {
-		return managedBeanExtensionTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EClass getConverterExtensionType() {
-		return converterExtensionTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EClass getExtensionType() {
-		return extensionTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EReference getExtensionType_ChildNodes() {
-		return (EReference)extensionTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EAttribute getExtensionType_TextContent() {
-		return (EAttribute)extensionTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EAttribute getExtensionType_Id() {
-		return (EAttribute)extensionTypeEClass.getEStructuralFeatures().get(2);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getExternalContextFactoryType() {
-		return externalContextFactoryTypeEClass;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getExternalContextFactoryType_TextContent() {
-		return (EAttribute)externalContextFactoryTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getExternalContextFactoryType_Id() {
-		return (EAttribute)externalContextFactoryTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EClass getApplicationExtensionType() {
-		return applicationExtensionTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FacesConfigFactory getFacesConfigFactory() {
-		return (FacesConfigFactory)getEFactoryInstance();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private boolean isCreated = false;
-
-    /**
-	 * Creates the meta-model objects for the package.  This method is
-	 * guarded to have no affect on any invocation but its first.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void createPackageContents() {
-		if (isCreated) return;
-		isCreated = true;
-
-		// Create classes and their features
-		absoluteOrderingTypeEClass = createEClass(ABSOLUTE_ORDERING_TYPE);
-		createEReference(absoluteOrderingTypeEClass, ABSOLUTE_ORDERING_TYPE__NAME);
-		createEReference(absoluteOrderingTypeEClass, ABSOLUTE_ORDERING_TYPE__OTHERS);
-
-		actionListenerTypeEClass = createEClass(ACTION_LISTENER_TYPE);
-		createEAttribute(actionListenerTypeEClass, ACTION_LISTENER_TYPE__TEXT_CONTENT);
-		createEAttribute(actionListenerTypeEClass, ACTION_LISTENER_TYPE__ID);
-
-		applicationFactoryTypeEClass = createEClass(APPLICATION_FACTORY_TYPE);
-		createEAttribute(applicationFactoryTypeEClass, APPLICATION_FACTORY_TYPE__TEXT_CONTENT);
-		createEAttribute(applicationFactoryTypeEClass, APPLICATION_FACTORY_TYPE__ID);
-
-		applicationTypeEClass = createEClass(APPLICATION_TYPE);
-		createEReference(applicationTypeEClass, APPLICATION_TYPE__ACTION_LISTENER);
-		createEReference(applicationTypeEClass, APPLICATION_TYPE__DEFAULT_RENDER_KIT_ID);
-		createEReference(applicationTypeEClass, APPLICATION_TYPE__MESSAGE_BUNDLE);
-		createEReference(applicationTypeEClass, APPLICATION_TYPE__NAVIGATION_HANDLER);
-		createEReference(applicationTypeEClass, APPLICATION_TYPE__VIEW_HANDLER);
-		createEReference(applicationTypeEClass, APPLICATION_TYPE__STATE_MANAGER);
-		createEReference(applicationTypeEClass, APPLICATION_TYPE__EL_RESOLVER);
-		createEReference(applicationTypeEClass, APPLICATION_TYPE__PROPERTY_RESOLVER);
-		createEReference(applicationTypeEClass, APPLICATION_TYPE__VARIABLE_RESOLVER);
-		createEReference(applicationTypeEClass, APPLICATION_TYPE__RESOURCE_HANDLER);
-		createEReference(applicationTypeEClass, APPLICATION_TYPE__SYSTEM_EVENT_LISTENER);
-		createEReference(applicationTypeEClass, APPLICATION_TYPE__LOCALE_CONFIG);
-		createEReference(applicationTypeEClass, APPLICATION_TYPE__RESOURCE_BUNDLE);
-		createEReference(applicationTypeEClass, APPLICATION_TYPE__APPLICATION_EXTENSION);
-		createEReference(applicationTypeEClass, APPLICATION_TYPE__DEFAULT_VALIDATORS);
-		createEAttribute(applicationTypeEClass, APPLICATION_TYPE__ID);
-
-		applicationExtensionTypeEClass = createEClass(APPLICATION_EXTENSION_TYPE);
-
-		attributeClassTypeEClass = createEClass(ATTRIBUTE_CLASS_TYPE);
-		createEAttribute(attributeClassTypeEClass, ATTRIBUTE_CLASS_TYPE__TEXT_CONTENT);
-		createEAttribute(attributeClassTypeEClass, ATTRIBUTE_CLASS_TYPE__ID);
-
-		attributeExtensionTypeEClass = createEClass(ATTRIBUTE_EXTENSION_TYPE);
-
-		attributeNameTypeEClass = createEClass(ATTRIBUTE_NAME_TYPE);
-		createEAttribute(attributeNameTypeEClass, ATTRIBUTE_NAME_TYPE__TEXT_CONTENT);
-		createEAttribute(attributeNameTypeEClass, ATTRIBUTE_NAME_TYPE__ID);
-
-		attributeTypeEClass = createEClass(ATTRIBUTE_TYPE);
-		createEReference(attributeTypeEClass, ATTRIBUTE_TYPE__DESCRIPTION);
-		createEReference(attributeTypeEClass, ATTRIBUTE_TYPE__DISPLAY_NAME);
-		createEReference(attributeTypeEClass, ATTRIBUTE_TYPE__ICON);
-		createEReference(attributeTypeEClass, ATTRIBUTE_TYPE__ATTRIBUTE_NAME);
-		createEReference(attributeTypeEClass, ATTRIBUTE_TYPE__ATTRIBUTE_CLASS);
-		createEReference(attributeTypeEClass, ATTRIBUTE_TYPE__DEFAULT_VALUE);
-		createEReference(attributeTypeEClass, ATTRIBUTE_TYPE__SUGGESTED_VALUE);
-		createEReference(attributeTypeEClass, ATTRIBUTE_TYPE__ATTRIBUTE_EXTENSION);
-		createEAttribute(attributeTypeEClass, ATTRIBUTE_TYPE__ID);
-
-		behaviorClassTypeEClass = createEClass(BEHAVIOR_CLASS_TYPE);
-		createEAttribute(behaviorClassTypeEClass, BEHAVIOR_CLASS_TYPE__TEXT_CONTENT);
-		createEAttribute(behaviorClassTypeEClass, BEHAVIOR_CLASS_TYPE__ID);
-
-		behaviorIdTypeEClass = createEClass(BEHAVIOR_ID_TYPE);
-		createEAttribute(behaviorIdTypeEClass, BEHAVIOR_ID_TYPE__TEXT_CONTENT);
-		createEAttribute(behaviorIdTypeEClass, BEHAVIOR_ID_TYPE__ID);
-
-		behaviorTypeEClass = createEClass(BEHAVIOR_TYPE);
-		createEReference(behaviorTypeEClass, BEHAVIOR_TYPE__DESCRIPTION);
-		createEReference(behaviorTypeEClass, BEHAVIOR_TYPE__DISPLAY_NAME);
-		createEReference(behaviorTypeEClass, BEHAVIOR_TYPE__ICON);
-		createEReference(behaviorTypeEClass, BEHAVIOR_TYPE__BEHAVIOR_ID);
-		createEReference(behaviorTypeEClass, BEHAVIOR_TYPE__BEHAVIOR_CLASS);
-		createEReference(behaviorTypeEClass, BEHAVIOR_TYPE__ATTRIBUTE);
-		createEReference(behaviorTypeEClass, BEHAVIOR_TYPE__PROPERTY);
-		createEReference(behaviorTypeEClass, BEHAVIOR_TYPE__BEHAVIOR_EXTENSION);
-
-		behaviorExtensionTypeEClass = createEClass(BEHAVIOR_EXTENSION_TYPE);
-
-		clientBehaviorRendererClassTypeEClass = createEClass(CLIENT_BEHAVIOR_RENDERER_CLASS_TYPE);
-		createEAttribute(clientBehaviorRendererClassTypeEClass, CLIENT_BEHAVIOR_RENDERER_CLASS_TYPE__TEXT_CONTENT);
-		createEAttribute(clientBehaviorRendererClassTypeEClass, CLIENT_BEHAVIOR_RENDERER_CLASS_TYPE__ID);
-
-		clientBehaviorRendererTypeEClass = createEClass(CLIENT_BEHAVIOR_RENDERER_TYPE);
-		createEReference(clientBehaviorRendererTypeEClass, CLIENT_BEHAVIOR_RENDERER_TYPE__CLIENT_BEHAVIOR_RENDERER_TYPE);
-		createEReference(clientBehaviorRendererTypeEClass, CLIENT_BEHAVIOR_RENDERER_TYPE__CLIENT_BEHAVIOR_RENDERER_CLASS);
-
-		clientBehaviorRendererTypeTypeEClass = createEClass(CLIENT_BEHAVIOR_RENDERER_TYPE_TYPE);
-		createEAttribute(clientBehaviorRendererTypeTypeEClass, CLIENT_BEHAVIOR_RENDERER_TYPE_TYPE__TEXT_CONTENT);
-		createEAttribute(clientBehaviorRendererTypeTypeEClass, CLIENT_BEHAVIOR_RENDERER_TYPE_TYPE__ID);
-
-		componentClassTypeEClass = createEClass(COMPONENT_CLASS_TYPE);
-		createEAttribute(componentClassTypeEClass, COMPONENT_CLASS_TYPE__TEXT_CONTENT);
-		createEAttribute(componentClassTypeEClass, COMPONENT_CLASS_TYPE__ID);
-
-		componentExtensionTypeEClass = createEClass(COMPONENT_EXTENSION_TYPE);
-
-		componentFamilyTypeEClass = createEClass(COMPONENT_FAMILY_TYPE);
-		createEAttribute(componentFamilyTypeEClass, COMPONENT_FAMILY_TYPE__TEXT_CONTENT);
-		createEAttribute(componentFamilyTypeEClass, COMPONENT_FAMILY_TYPE__ID);
-
-		componentTypeEClass = createEClass(COMPONENT_TYPE);
-		createEReference(componentTypeEClass, COMPONENT_TYPE__DESCRIPTION);
-		createEReference(componentTypeEClass, COMPONENT_TYPE__DISPLAY_NAME);
-		createEReference(componentTypeEClass, COMPONENT_TYPE__ICON);
-		createEReference(componentTypeEClass, COMPONENT_TYPE__COMPONENT_TYPE);
-		createEReference(componentTypeEClass, COMPONENT_TYPE__COMPONENT_CLASS);
-		createEReference(componentTypeEClass, COMPONENT_TYPE__FACET);
-		createEReference(componentTypeEClass, COMPONENT_TYPE__ATTRIBUTE);
-		createEReference(componentTypeEClass, COMPONENT_TYPE__PROPERTY);
-		createEReference(componentTypeEClass, COMPONENT_TYPE__COMPONENT_EXTENSION);
-		createEAttribute(componentTypeEClass, COMPONENT_TYPE__ID);
-
-		componentTypeTypeEClass = createEClass(COMPONENT_TYPE_TYPE);
-		createEAttribute(componentTypeTypeEClass, COMPONENT_TYPE_TYPE__TEXT_CONTENT);
-		createEAttribute(componentTypeTypeEClass, COMPONENT_TYPE_TYPE__ID);
-
-		converterClassTypeEClass = createEClass(CONVERTER_CLASS_TYPE);
-		createEAttribute(converterClassTypeEClass, CONVERTER_CLASS_TYPE__TEXT_CONTENT);
-		createEAttribute(converterClassTypeEClass, CONVERTER_CLASS_TYPE__ID);
-
-		converterForClassTypeEClass = createEClass(CONVERTER_FOR_CLASS_TYPE);
-		createEAttribute(converterForClassTypeEClass, CONVERTER_FOR_CLASS_TYPE__TEXT_CONTENT);
-		createEAttribute(converterForClassTypeEClass, CONVERTER_FOR_CLASS_TYPE__ID);
-
-		converterIdTypeEClass = createEClass(CONVERTER_ID_TYPE);
-		createEAttribute(converterIdTypeEClass, CONVERTER_ID_TYPE__TEXT_CONTENT);
-		createEAttribute(converterIdTypeEClass, CONVERTER_ID_TYPE__ID);
-
-		converterTypeEClass = createEClass(CONVERTER_TYPE);
-		createEReference(converterTypeEClass, CONVERTER_TYPE__DESCRIPTION);
-		createEReference(converterTypeEClass, CONVERTER_TYPE__DISPLAY_NAME);
-		createEReference(converterTypeEClass, CONVERTER_TYPE__ICON);
-		createEReference(converterTypeEClass, CONVERTER_TYPE__CONVERTER_ID);
-		createEReference(converterTypeEClass, CONVERTER_TYPE__CONVERTER_FOR_CLASS);
-		createEReference(converterTypeEClass, CONVERTER_TYPE__CONVERTER_CLASS);
-		createEReference(converterTypeEClass, CONVERTER_TYPE__ATTRIBUTE);
-		createEReference(converterTypeEClass, CONVERTER_TYPE__PROPERTY);
-		createEReference(converterTypeEClass, CONVERTER_TYPE__CONVERTER_EXTENSION);
-		createEAttribute(converterTypeEClass, CONVERTER_TYPE__ID);
-
-		converterExtensionTypeEClass = createEClass(CONVERTER_EXTENSION_TYPE);
-
-		defaultLocaleTypeEClass = createEClass(DEFAULT_LOCALE_TYPE);
-		createEAttribute(defaultLocaleTypeEClass, DEFAULT_LOCALE_TYPE__TEXT_CONTENT);
-		createEAttribute(defaultLocaleTypeEClass, DEFAULT_LOCALE_TYPE__ID);
-
-		defaultRenderKitIdTypeEClass = createEClass(DEFAULT_RENDER_KIT_ID_TYPE);
-		createEAttribute(defaultRenderKitIdTypeEClass, DEFAULT_RENDER_KIT_ID_TYPE__TEXT_CONTENT);
-		createEAttribute(defaultRenderKitIdTypeEClass, DEFAULT_RENDER_KIT_ID_TYPE__ID);
-
-		defaultValidatorsTypeEClass = createEClass(DEFAULT_VALIDATORS_TYPE);
-		createEReference(defaultValidatorsTypeEClass, DEFAULT_VALIDATORS_TYPE__VALIDATOR_ID);
-		createEAttribute(defaultValidatorsTypeEClass, DEFAULT_VALIDATORS_TYPE__ID);
-
-		defaultValueTypeEClass = createEClass(DEFAULT_VALUE_TYPE);
-		createEAttribute(defaultValueTypeEClass, DEFAULT_VALUE_TYPE__TEXT_CONTENT);
-		createEAttribute(defaultValueTypeEClass, DEFAULT_VALUE_TYPE__ID);
-
-		descriptionTypeEClass = createEClass(DESCRIPTION_TYPE);
-		createEAttribute(descriptionTypeEClass, DESCRIPTION_TYPE__TEXT_CONTENT);
-		createEAttribute(descriptionTypeEClass, DESCRIPTION_TYPE__LANG);
-		createEAttribute(descriptionTypeEClass, DESCRIPTION_TYPE__ID);
-
-		displayNameTypeEClass = createEClass(DISPLAY_NAME_TYPE);
-		createEAttribute(displayNameTypeEClass, DISPLAY_NAME_TYPE__TEXT_CONTENT);
-		createEAttribute(displayNameTypeEClass, DISPLAY_NAME_TYPE__LANG);
-		createEAttribute(displayNameTypeEClass, DISPLAY_NAME_TYPE__ID);
-
-		documentRootEClass = createEClass(DOCUMENT_ROOT);
-		createEAttribute(documentRootEClass, DOCUMENT_ROOT__MIXED);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__XMLNS_PREFIX_MAP);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__XSI_SCHEMA_LOCATION);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__ABSOLUTE_ORDERING);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__ACTION_LISTENER);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__APPLICATION);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__APPLICATION_FACTORY);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__ATTRIBUTE);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__ATTRIBUTE_CLASS);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__ATTRIBUTE_EXTENSION);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__ATTRIBUTE_NAME);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__BEHAVIOR);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__BEHAVIOR_CLASS);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__BEHAVIOR_ID);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__BEHAVIOR_EXTENSION);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__COMPONENT);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__COMPONENT_CLASS);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__COMPONENT_EXTENSION);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__COMPONENT_FAMILY);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__COMPONENT_TYPE);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__CONVERTER);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__CONVERTER_CLASS);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__CONVERTER_FOR_CLASS);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__CONVERTER_ID);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__DEFAULT_LOCALE);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__DEFAULT_RENDER_KIT_ID);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__DEFAULT_VALIDATORS);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__DEFAULT_VALUE);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__DESCRIPTION);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__DISPLAY_NAME);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__EXCEPTION_HANDLER_FACTORY);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__EXTERNAL_CONTEXT_FACTORY);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__FACES_CONFIG);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__FACES_CONTEXT_FACTORY);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__FACET);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__FACET_EXTENSION);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__FACET_NAME);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__FACTORY);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__FROM_ACTION);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__FROM_OUTCOME);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__FROM_VIEW_ID);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__ICON);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__IF);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__KEY);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__KEY_CLASS);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__LARGE_ICON);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__LIFECYCLE);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__LIFECYCLE_FACTORY);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__LIST_ENTRIES);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__LOCALE_CONFIG);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__MANAGED_BEAN);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__MANAGED_BEAN_CLASS);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__MANAGED_BEAN_NAME);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__MANAGED_BEAN_SCOPE);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__MANAGED_PROPERTY);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__MAP_ENTRIES);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__MAP_ENTRY);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__MESSAGE_BUNDLE);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__NAME);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__NAVIGATION_CASE);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__NAVIGATION_HANDLER);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__NAVIGATION_RULE);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__NULL_VALUE);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__ORDERING);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__ORDERING_ORDERING);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__OTHERS);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__PARTIAL_VIEW_CONTEXT_FACTORY);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__PHASE_LISTENER);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__PROPERTY);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__PROPERTY_CLASS);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__PROPERTY_EXTENSION);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__PROPERTY_NAME);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__PROPERTY_RESOLVER);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__REDIRECT);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__REDIRECT_VIEW_PARAM);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__REFERENCED_BEAN);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__REFERENCED_BEAN_CLASS);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__REFERENCED_BEAN_NAME);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__RENDERER);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__RENDERER_CLASS);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__RENDERER_EXTENSION);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__RENDERER_TYPE);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__RENDER_KIT);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__RENDER_KIT_CLASS);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__RENDER_KIT_FACTORY);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__RENDER_KIT_ID);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__RESOURCE_HANDLER);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__SMALL_ICON);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__SOURCE_CLASS);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__STATE_MANAGER);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__SUGGESTED_VALUE);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__SUPPORTED_LOCALE);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__SYSTEM_EVENT_CLASS);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__SYSTEM_EVENT_LISTENER);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__SYSTEM_EVENT_LISTENER_CLASS);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__TAG_HANDLER_DELEGATE_FACTORY);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__TO_VIEW_ID);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__VALIDATOR);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__VALIDATOR_CLASS);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__VALIDATOR_ID);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__VALUE);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__VALUE_CLASS);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__VARIABLE_RESOLVER);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__VIEW_DECLARATION_LANGUAGE_FACTORY);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__VIEW_HANDLER);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__VISIT_CONTEXT_FACTORY);
-
-		dynamicAttributeEClass = createEClass(DYNAMIC_ATTRIBUTE);
-		createEAttribute(dynamicAttributeEClass, DYNAMIC_ATTRIBUTE__NAME);
-		createEAttribute(dynamicAttributeEClass, DYNAMIC_ATTRIBUTE__VALUE);
-
-		dynamicElementEClass = createEClass(DYNAMIC_ELEMENT);
-		createEReference(dynamicElementEClass, DYNAMIC_ELEMENT__CHILD_NODES);
-		createEAttribute(dynamicElementEClass, DYNAMIC_ELEMENT__NAME);
-		createEReference(dynamicElementEClass, DYNAMIC_ELEMENT__ATTRIBUTES);
-		createEAttribute(dynamicElementEClass, DYNAMIC_ELEMENT__TEXT_CONTENT);
-
-		elResolverTypeEClass = createEClass(EL_RESOLVER_TYPE);
-		createEAttribute(elResolverTypeEClass, EL_RESOLVER_TYPE__TEXT_CONTENT);
-		createEAttribute(elResolverTypeEClass, EL_RESOLVER_TYPE__ID);
-
-		exceptionHandlerFactoryTypeEClass = createEClass(EXCEPTION_HANDLER_FACTORY_TYPE);
-		createEAttribute(exceptionHandlerFactoryTypeEClass, EXCEPTION_HANDLER_FACTORY_TYPE__TEXT_CONTENT);
-		createEAttribute(exceptionHandlerFactoryTypeEClass, EXCEPTION_HANDLER_FACTORY_TYPE__ID);
-
-		extensionTypeEClass = createEClass(EXTENSION_TYPE);
-		createEReference(extensionTypeEClass, EXTENSION_TYPE__CHILD_NODES);
-		createEAttribute(extensionTypeEClass, EXTENSION_TYPE__TEXT_CONTENT);
-		createEAttribute(extensionTypeEClass, EXTENSION_TYPE__ID);
-
-		externalContextFactoryTypeEClass = createEClass(EXTERNAL_CONTEXT_FACTORY_TYPE);
-		createEAttribute(externalContextFactoryTypeEClass, EXTERNAL_CONTEXT_FACTORY_TYPE__TEXT_CONTENT);
-		createEAttribute(externalContextFactoryTypeEClass, EXTERNAL_CONTEXT_FACTORY_TYPE__ID);
-
-		facesConfigTypeEClass = createEClass(FACES_CONFIG_TYPE);
-		createEReference(facesConfigTypeEClass, FACES_CONFIG_TYPE__APPLICATION);
-		createEReference(facesConfigTypeEClass, FACES_CONFIG_TYPE__ORDERING);
-		createEReference(facesConfigTypeEClass, FACES_CONFIG_TYPE__ABSOLUTE_ORDERING);
-		createEReference(facesConfigTypeEClass, FACES_CONFIG_TYPE__FACTORY);
-		createEReference(facesConfigTypeEClass, FACES_CONFIG_TYPE__COMPONENT);
-		createEReference(facesConfigTypeEClass, FACES_CONFIG_TYPE__CONVERTER);
-		createEReference(facesConfigTypeEClass, FACES_CONFIG_TYPE__MANAGED_BEAN);
-		createEReference(facesConfigTypeEClass, FACES_CONFIG_TYPE__NAME);
-		createEReference(facesConfigTypeEClass, FACES_CONFIG_TYPE__NAVIGATION_RULE);
-		createEReference(facesConfigTypeEClass, FACES_CONFIG_TYPE__REFERENCED_BEAN);
-		createEReference(facesConfigTypeEClass, FACES_CONFIG_TYPE__RENDER_KIT);
-		createEReference(facesConfigTypeEClass, FACES_CONFIG_TYPE__LIFECYCLE);
-		createEReference(facesConfigTypeEClass, FACES_CONFIG_TYPE__VALIDATOR);
-		createEReference(facesConfigTypeEClass, FACES_CONFIG_TYPE__BEHAVIOR);
-		createEReference(facesConfigTypeEClass, FACES_CONFIG_TYPE__FACES_CONFIG_EXTENSION);
-		createEAttribute(facesConfigTypeEClass, FACES_CONFIG_TYPE__XMLNS);
-		createEAttribute(facesConfigTypeEClass, FACES_CONFIG_TYPE__ID);
-		createEAttribute(facesConfigTypeEClass, FACES_CONFIG_TYPE__METADATA_COMPLETE);
-
-		facesConfigExtensionTypeEClass = createEClass(FACES_CONFIG_EXTENSION_TYPE);
-
-		facesContextFactoryTypeEClass = createEClass(FACES_CONTEXT_FACTORY_TYPE);
-		createEAttribute(facesContextFactoryTypeEClass, FACES_CONTEXT_FACTORY_TYPE__TEXT_CONTENT);
-		createEAttribute(facesContextFactoryTypeEClass, FACES_CONTEXT_FACTORY_TYPE__ID);
-
-		facetExtensionTypeEClass = createEClass(FACET_EXTENSION_TYPE);
-
-		facetNameTypeEClass = createEClass(FACET_NAME_TYPE);
-		createEAttribute(facetNameTypeEClass, FACET_NAME_TYPE__TEXT_CONTENT);
-		createEAttribute(facetNameTypeEClass, FACET_NAME_TYPE__ID);
-
-		facetTypeEClass = createEClass(FACET_TYPE);
-		createEReference(facetTypeEClass, FACET_TYPE__DESCRIPTION);
-		createEReference(facetTypeEClass, FACET_TYPE__DISPLAY_NAME);
-		createEReference(facetTypeEClass, FACET_TYPE__ICON);
-		createEReference(facetTypeEClass, FACET_TYPE__FACET_NAME);
-		createEReference(facetTypeEClass, FACET_TYPE__FACET_EXTENSION);
-		createEAttribute(facetTypeEClass, FACET_TYPE__ID);
-
-		factoryTypeEClass = createEClass(FACTORY_TYPE);
-		createEReference(factoryTypeEClass, FACTORY_TYPE__APPLICATION_FACTORY);
-		createEReference(factoryTypeEClass, FACTORY_TYPE__EXCEPTION_HANDLER_FACTORY);
-		createEReference(factoryTypeEClass, FACTORY_TYPE__EXTERNAL_CONTEXT_FACTORY);
-		createEReference(factoryTypeEClass, FACTORY_TYPE__FACES_CONTEXT_FACTORY);
-		createEReference(factoryTypeEClass, FACTORY_TYPE__PARTIAL_VIEW_CONTEXT_FACTORY);
-		createEReference(factoryTypeEClass, FACTORY_TYPE__LIFECYCLE_FACTORY);
-		createEReference(factoryTypeEClass, FACTORY_TYPE__VIEW_DECLARATION_LANGUAGE_FACTORY);
-		createEReference(factoryTypeEClass, FACTORY_TYPE__TAG_HANDLER_DELEGATE_FACTORY);
-		createEReference(factoryTypeEClass, FACTORY_TYPE__RENDER_KIT_FACTORY);
-		createEReference(factoryTypeEClass, FACTORY_TYPE__VISIT_CONTEXT_FACTORY);
-		createEReference(factoryTypeEClass, FACTORY_TYPE__FACTORY_EXTENSION);
-		createEAttribute(factoryTypeEClass, FACTORY_TYPE__ID);
-
-		factoryExtensionTypeEClass = createEClass(FACTORY_EXTENSION_TYPE);
-
-		fromActionTypeEClass = createEClass(FROM_ACTION_TYPE);
-		createEAttribute(fromActionTypeEClass, FROM_ACTION_TYPE__TEXT_CONTENT);
-		createEAttribute(fromActionTypeEClass, FROM_ACTION_TYPE__ID);
-
-		fromOutcomeTypeEClass = createEClass(FROM_OUTCOME_TYPE);
-		createEAttribute(fromOutcomeTypeEClass, FROM_OUTCOME_TYPE__TEXT_CONTENT);
-		createEAttribute(fromOutcomeTypeEClass, FROM_OUTCOME_TYPE__ID);
-
-		fromViewIdTypeEClass = createEClass(FROM_VIEW_ID_TYPE);
-		createEAttribute(fromViewIdTypeEClass, FROM_VIEW_ID_TYPE__TEXT_CONTENT);
-		createEAttribute(fromViewIdTypeEClass, FROM_VIEW_ID_TYPE__ID);
-
-		iconTypeEClass = createEClass(ICON_TYPE);
-		createEReference(iconTypeEClass, ICON_TYPE__SMALL_ICON);
-		createEReference(iconTypeEClass, ICON_TYPE__LARGE_ICON);
-		createEAttribute(iconTypeEClass, ICON_TYPE__LANG);
-		createEAttribute(iconTypeEClass, ICON_TYPE__ID);
-
-		ifTypeEClass = createEClass(IF_TYPE);
-		createEAttribute(ifTypeEClass, IF_TYPE__TEXT_CONTENT);
-		createEAttribute(ifTypeEClass, IF_TYPE__ID);
-
-		keyClassTypeEClass = createEClass(KEY_CLASS_TYPE);
-		createEAttribute(keyClassTypeEClass, KEY_CLASS_TYPE__TEXT_CONTENT);
-		createEAttribute(keyClassTypeEClass, KEY_CLASS_TYPE__ID);
-
-		keyTypeEClass = createEClass(KEY_TYPE);
-		createEAttribute(keyTypeEClass, KEY_TYPE__TEXT_CONTENT);
-		createEAttribute(keyTypeEClass, KEY_TYPE__ID);
-
-		largeIconTypeEClass = createEClass(LARGE_ICON_TYPE);
-		createEAttribute(largeIconTypeEClass, LARGE_ICON_TYPE__TEXT_CONTENT);
-		createEAttribute(largeIconTypeEClass, LARGE_ICON_TYPE__ID);
-
-		lifecycleFactoryTypeEClass = createEClass(LIFECYCLE_FACTORY_TYPE);
-		createEAttribute(lifecycleFactoryTypeEClass, LIFECYCLE_FACTORY_TYPE__TEXT_CONTENT);
-		createEAttribute(lifecycleFactoryTypeEClass, LIFECYCLE_FACTORY_TYPE__ID);
-
-		lifecycleTypeEClass = createEClass(LIFECYCLE_TYPE);
-		createEReference(lifecycleTypeEClass, LIFECYCLE_TYPE__PHASE_LISTENER);
-		createEReference(lifecycleTypeEClass, LIFECYCLE_TYPE__LIFECYCLE_EXTENSION);
-		createEAttribute(lifecycleTypeEClass, LIFECYCLE_TYPE__ID);
-
-		lifecycleExtensionTypeEClass = createEClass(LIFECYCLE_EXTENSION_TYPE);
-
-		listEntriesTypeEClass = createEClass(LIST_ENTRIES_TYPE);
-		createEReference(listEntriesTypeEClass, LIST_ENTRIES_TYPE__VALUE_CLASS);
-		createEReference(listEntriesTypeEClass, LIST_ENTRIES_TYPE__NULL_VALUE);
-		createEReference(listEntriesTypeEClass, LIST_ENTRIES_TYPE__VALUE);
-		createEAttribute(listEntriesTypeEClass, LIST_ENTRIES_TYPE__ID);
-
-		localeConfigTypeEClass = createEClass(LOCALE_CONFIG_TYPE);
-		createEReference(localeConfigTypeEClass, LOCALE_CONFIG_TYPE__DEFAULT_LOCALE);
-		createEReference(localeConfigTypeEClass, LOCALE_CONFIG_TYPE__SUPPORTED_LOCALE);
-		createEAttribute(localeConfigTypeEClass, LOCALE_CONFIG_TYPE__ID);
-
-		managedBeanClassTypeEClass = createEClass(MANAGED_BEAN_CLASS_TYPE);
-		createEAttribute(managedBeanClassTypeEClass, MANAGED_BEAN_CLASS_TYPE__TEXT_CONTENT);
-		createEAttribute(managedBeanClassTypeEClass, MANAGED_BEAN_CLASS_TYPE__ID);
-
-		managedBeanNameTypeEClass = createEClass(MANAGED_BEAN_NAME_TYPE);
-		createEAttribute(managedBeanNameTypeEClass, MANAGED_BEAN_NAME_TYPE__TEXT_CONTENT);
-		createEAttribute(managedBeanNameTypeEClass, MANAGED_BEAN_NAME_TYPE__ID);
-
-		managedBeanScopeTypeEClass = createEClass(MANAGED_BEAN_SCOPE_TYPE);
-		createEAttribute(managedBeanScopeTypeEClass, MANAGED_BEAN_SCOPE_TYPE__TEXT_CONTENT);
-		createEAttribute(managedBeanScopeTypeEClass, MANAGED_BEAN_SCOPE_TYPE__ID);
-
-		managedBeanTypeEClass = createEClass(MANAGED_BEAN_TYPE);
-		createEReference(managedBeanTypeEClass, MANAGED_BEAN_TYPE__DESCRIPTION);
-		createEReference(managedBeanTypeEClass, MANAGED_BEAN_TYPE__DISPLAY_NAME);
-		createEReference(managedBeanTypeEClass, MANAGED_BEAN_TYPE__ICON);
-		createEReference(managedBeanTypeEClass, MANAGED_BEAN_TYPE__MANAGED_BEAN_NAME);
-		createEReference(managedBeanTypeEClass, MANAGED_BEAN_TYPE__MANAGED_BEAN_CLASS);
-		createEReference(managedBeanTypeEClass, MANAGED_BEAN_TYPE__MANAGED_BEAN_SCOPE);
-		createEReference(managedBeanTypeEClass, MANAGED_BEAN_TYPE__MANAGED_PROPERTY);
-		createEReference(managedBeanTypeEClass, MANAGED_BEAN_TYPE__MAP_ENTRIES);
-		createEReference(managedBeanTypeEClass, MANAGED_BEAN_TYPE__LIST_ENTRIES);
-		createEReference(managedBeanTypeEClass, MANAGED_BEAN_TYPE__MANAGED_BEAN_EXTENSION);
-		createEAttribute(managedBeanTypeEClass, MANAGED_BEAN_TYPE__ID);
-		createEAttribute(managedBeanTypeEClass, MANAGED_BEAN_TYPE__EAGER);
-
-		managedBeanExtensionTypeEClass = createEClass(MANAGED_BEAN_EXTENSION_TYPE);
-
-		managedPropertyTypeEClass = createEClass(MANAGED_PROPERTY_TYPE);
-		createEReference(managedPropertyTypeEClass, MANAGED_PROPERTY_TYPE__DESCRIPTION);
-		createEReference(managedPropertyTypeEClass, MANAGED_PROPERTY_TYPE__DISPLAY_NAME);
-		createEReference(managedPropertyTypeEClass, MANAGED_PROPERTY_TYPE__ICON);
-		createEReference(managedPropertyTypeEClass, MANAGED_PROPERTY_TYPE__PROPERTY_NAME);
-		createEReference(managedPropertyTypeEClass, MANAGED_PROPERTY_TYPE__PROPERTY_CLASS);
-		createEReference(managedPropertyTypeEClass, MANAGED_PROPERTY_TYPE__MAP_ENTRIES);
-		createEReference(managedPropertyTypeEClass, MANAGED_PROPERTY_TYPE__NULL_VALUE);
-		createEReference(managedPropertyTypeEClass, MANAGED_PROPERTY_TYPE__VALUE);
-		createEReference(managedPropertyTypeEClass, MANAGED_PROPERTY_TYPE__LIST_ENTRIES);
-		createEAttribute(managedPropertyTypeEClass, MANAGED_PROPERTY_TYPE__ID);
-
-		mapEntriesTypeEClass = createEClass(MAP_ENTRIES_TYPE);
-		createEReference(mapEntriesTypeEClass, MAP_ENTRIES_TYPE__KEY_CLASS);
-		createEReference(mapEntriesTypeEClass, MAP_ENTRIES_TYPE__VALUE_CLASS);
-		createEReference(mapEntriesTypeEClass, MAP_ENTRIES_TYPE__MAP_ENTRY);
-		createEAttribute(mapEntriesTypeEClass, MAP_ENTRIES_TYPE__ID);
-
-		mapEntryTypeEClass = createEClass(MAP_ENTRY_TYPE);
-		createEReference(mapEntryTypeEClass, MAP_ENTRY_TYPE__KEY);
-		createEReference(mapEntryTypeEClass, MAP_ENTRY_TYPE__NULL_VALUE);
-		createEReference(mapEntryTypeEClass, MAP_ENTRY_TYPE__VALUE);
-		createEAttribute(mapEntryTypeEClass, MAP_ENTRY_TYPE__ID);
-
-		messageBundleTypeEClass = createEClass(MESSAGE_BUNDLE_TYPE);
-		createEAttribute(messageBundleTypeEClass, MESSAGE_BUNDLE_TYPE__TEXT_CONTENT);
-		createEAttribute(messageBundleTypeEClass, MESSAGE_BUNDLE_TYPE__ID);
-
-		nameTypeEClass = createEClass(NAME_TYPE);
-		createEAttribute(nameTypeEClass, NAME_TYPE__TEXT_CONTENT);
-		createEAttribute(nameTypeEClass, NAME_TYPE__ID);
-
-		navigationCaseTypeEClass = createEClass(NAVIGATION_CASE_TYPE);
-		createEReference(navigationCaseTypeEClass, NAVIGATION_CASE_TYPE__DESCRIPTION);
-		createEReference(navigationCaseTypeEClass, NAVIGATION_CASE_TYPE__DISPLAY_NAME);
-		createEReference(navigationCaseTypeEClass, NAVIGATION_CASE_TYPE__ICON);
-		createEReference(navigationCaseTypeEClass, NAVIGATION_CASE_TYPE__FROM_ACTION);
-		createEReference(navigationCaseTypeEClass, NAVIGATION_CASE_TYPE__FROM_OUTCOME);
-		createEReference(navigationCaseTypeEClass, NAVIGATION_CASE_TYPE__IF);
-		createEReference(navigationCaseTypeEClass, NAVIGATION_CASE_TYPE__TO_VIEW_ID);
-		createEReference(navigationCaseTypeEClass, NAVIGATION_CASE_TYPE__REDIRECT);
-		createEAttribute(navigationCaseTypeEClass, NAVIGATION_CASE_TYPE__ID);
-
-		navigationHandlerTypeEClass = createEClass(NAVIGATION_HANDLER_TYPE);
-		createEAttribute(navigationHandlerTypeEClass, NAVIGATION_HANDLER_TYPE__TEXT_CONTENT);
-		createEAttribute(navigationHandlerTypeEClass, NAVIGATION_HANDLER_TYPE__ID);
-
-		navigationRuleTypeEClass = createEClass(NAVIGATION_RULE_TYPE);
-		createEReference(navigationRuleTypeEClass, NAVIGATION_RULE_TYPE__DESCRIPTION);
-		createEReference(navigationRuleTypeEClass, NAVIGATION_RULE_TYPE__DISPLAY_NAME);
-		createEReference(navigationRuleTypeEClass, NAVIGATION_RULE_TYPE__ICON);
-		createEReference(navigationRuleTypeEClass, NAVIGATION_RULE_TYPE__FROM_VIEW_ID);
-		createEReference(navigationRuleTypeEClass, NAVIGATION_RULE_TYPE__NAVIGATION_CASE);
-		createEReference(navigationRuleTypeEClass, NAVIGATION_RULE_TYPE__NAVIGATION_RULE_EXTENSION);
-		createEAttribute(navigationRuleTypeEClass, NAVIGATION_RULE_TYPE__ID);
-
-		navigationRuleExtensionTypeEClass = createEClass(NAVIGATION_RULE_EXTENSION_TYPE);
-
-		nullValueTypeEClass = createEClass(NULL_VALUE_TYPE);
-		createEAttribute(nullValueTypeEClass, NULL_VALUE_TYPE__ID);
-
-		orderingTypeEClass = createEClass(ORDERING_TYPE);
-		createEReference(orderingTypeEClass, ORDERING_TYPE__BEFORE);
-		createEReference(orderingTypeEClass, ORDERING_TYPE__AFTER);
-
-		orderingOrderingTypeEClass = createEClass(ORDERING_ORDERING_TYPE);
-		createEReference(orderingOrderingTypeEClass, ORDERING_ORDERING_TYPE__NAME);
-		createEReference(orderingOrderingTypeEClass, ORDERING_ORDERING_TYPE__OTHERS);
-
-		orderingOthersTypeEClass = createEClass(ORDERING_OTHERS_TYPE);
-		createEAttribute(orderingOthersTypeEClass, ORDERING_OTHERS_TYPE__ID);
-
-		partialViewContextFactoryTypeEClass = createEClass(PARTIAL_VIEW_CONTEXT_FACTORY_TYPE);
-		createEAttribute(partialViewContextFactoryTypeEClass, PARTIAL_VIEW_CONTEXT_FACTORY_TYPE__TEXT_CONTENT);
-		createEAttribute(partialViewContextFactoryTypeEClass, PARTIAL_VIEW_CONTEXT_FACTORY_TYPE__ID);
-
-		phaseListenerTypeEClass = createEClass(PHASE_LISTENER_TYPE);
-		createEAttribute(phaseListenerTypeEClass, PHASE_LISTENER_TYPE__TEXT_CONTENT);
-		createEAttribute(phaseListenerTypeEClass, PHASE_LISTENER_TYPE__ID);
-
-		propertyClassTypeEClass = createEClass(PROPERTY_CLASS_TYPE);
-		createEAttribute(propertyClassTypeEClass, PROPERTY_CLASS_TYPE__TEXT_CONTENT);
-		createEAttribute(propertyClassTypeEClass, PROPERTY_CLASS_TYPE__ID);
-
-		propertyExtensionTypeEClass = createEClass(PROPERTY_EXTENSION_TYPE);
-
-		propertyNameTypeEClass = createEClass(PROPERTY_NAME_TYPE);
-		createEAttribute(propertyNameTypeEClass, PROPERTY_NAME_TYPE__TEXT_CONTENT);
-		createEAttribute(propertyNameTypeEClass, PROPERTY_NAME_TYPE__ID);
-
-		propertyResolverTypeEClass = createEClass(PROPERTY_RESOLVER_TYPE);
-		createEAttribute(propertyResolverTypeEClass, PROPERTY_RESOLVER_TYPE__TEXT_CONTENT);
-		createEAttribute(propertyResolverTypeEClass, PROPERTY_RESOLVER_TYPE__ID);
-
-		propertyTypeEClass = createEClass(PROPERTY_TYPE);
-		createEReference(propertyTypeEClass, PROPERTY_TYPE__DESCRIPTION);
-		createEReference(propertyTypeEClass, PROPERTY_TYPE__DISPLAY_NAME);
-		createEReference(propertyTypeEClass, PROPERTY_TYPE__ICON);
-		createEReference(propertyTypeEClass, PROPERTY_TYPE__PROPERTY_NAME);
-		createEReference(propertyTypeEClass, PROPERTY_TYPE__PROPERTY_CLASS);
-		createEReference(propertyTypeEClass, PROPERTY_TYPE__DEFAULT_VALUE);
-		createEReference(propertyTypeEClass, PROPERTY_TYPE__SUGGESTED_VALUE);
-		createEReference(propertyTypeEClass, PROPERTY_TYPE__PROPERTY_EXTENSION);
-		createEAttribute(propertyTypeEClass, PROPERTY_TYPE__ID);
-
-		redirectTypeEClass = createEClass(REDIRECT_TYPE);
-		createEReference(redirectTypeEClass, REDIRECT_TYPE__VIEW_PARAM);
-		createEAttribute(redirectTypeEClass, REDIRECT_TYPE__ID);
-		createEAttribute(redirectTypeEClass, REDIRECT_TYPE__INCLUDE_VIEW_PARAMS);
-
-		redirectViewParamTypeEClass = createEClass(REDIRECT_VIEW_PARAM_TYPE);
-		createEReference(redirectViewParamTypeEClass, REDIRECT_VIEW_PARAM_TYPE__NAME);
-		createEReference(redirectViewParamTypeEClass, REDIRECT_VIEW_PARAM_TYPE__VALUE);
-		createEAttribute(redirectViewParamTypeEClass, REDIRECT_VIEW_PARAM_TYPE__ID);
-
-		referencedBeanClassTypeEClass = createEClass(REFERENCED_BEAN_CLASS_TYPE);
-		createEAttribute(referencedBeanClassTypeEClass, REFERENCED_BEAN_CLASS_TYPE__TEXT_CONTENT);
-		createEAttribute(referencedBeanClassTypeEClass, REFERENCED_BEAN_CLASS_TYPE__ID);
-
-		referencedBeanNameTypeEClass = createEClass(REFERENCED_BEAN_NAME_TYPE);
-		createEAttribute(referencedBeanNameTypeEClass, REFERENCED_BEAN_NAME_TYPE__TEXT_CONTENT);
-		createEAttribute(referencedBeanNameTypeEClass, REFERENCED_BEAN_NAME_TYPE__ID);
-
-		referencedBeanTypeEClass = createEClass(REFERENCED_BEAN_TYPE);
-		createEReference(referencedBeanTypeEClass, REFERENCED_BEAN_TYPE__DESCRIPTION);
-		createEReference(referencedBeanTypeEClass, REFERENCED_BEAN_TYPE__DISPLAY_NAME);
-		createEReference(referencedBeanTypeEClass, REFERENCED_BEAN_TYPE__ICON);
-		createEReference(referencedBeanTypeEClass, REFERENCED_BEAN_TYPE__REFERENCED_BEAN_NAME);
-		createEReference(referencedBeanTypeEClass, REFERENCED_BEAN_TYPE__REFERENCED_BEAN_CLASS);
-		createEAttribute(referencedBeanTypeEClass, REFERENCED_BEAN_TYPE__ID);
-
-		rendererClassTypeEClass = createEClass(RENDERER_CLASS_TYPE);
-		createEAttribute(rendererClassTypeEClass, RENDERER_CLASS_TYPE__TEXT_CONTENT);
-		createEAttribute(rendererClassTypeEClass, RENDERER_CLASS_TYPE__ID);
-
-		rendererExtensionTypeEClass = createEClass(RENDERER_EXTENSION_TYPE);
-
-		rendererTypeEClass = createEClass(RENDERER_TYPE);
-		createEReference(rendererTypeEClass, RENDERER_TYPE__DESCRIPTION);
-		createEReference(rendererTypeEClass, RENDERER_TYPE__DISPLAY_NAME);
-		createEReference(rendererTypeEClass, RENDERER_TYPE__ICON);
-		createEReference(rendererTypeEClass, RENDERER_TYPE__COMPONENT_FAMILY);
-		createEReference(rendererTypeEClass, RENDERER_TYPE__RENDERER_TYPE);
-		createEReference(rendererTypeEClass, RENDERER_TYPE__RENDERER_CLASS);
-		createEReference(rendererTypeEClass, RENDERER_TYPE__FACET);
-		createEReference(rendererTypeEClass, RENDERER_TYPE__ATTRIBUTE);
-		createEReference(rendererTypeEClass, RENDERER_TYPE__RENDERER_EXTENSION);
-		createEAttribute(rendererTypeEClass, RENDERER_TYPE__ID);
-
-		rendererTypeTypeEClass = createEClass(RENDERER_TYPE_TYPE);
-		createEAttribute(rendererTypeTypeEClass, RENDERER_TYPE_TYPE__TEXT_CONTENT);
-		createEAttribute(rendererTypeTypeEClass, RENDERER_TYPE_TYPE__ID);
-
-		renderKitClassTypeEClass = createEClass(RENDER_KIT_CLASS_TYPE);
-		createEAttribute(renderKitClassTypeEClass, RENDER_KIT_CLASS_TYPE__TEXT_CONTENT);
-		createEAttribute(renderKitClassTypeEClass, RENDER_KIT_CLASS_TYPE__ID);
-
-		renderKitFactoryTypeEClass = createEClass(RENDER_KIT_FACTORY_TYPE);
-		createEAttribute(renderKitFactoryTypeEClass, RENDER_KIT_FACTORY_TYPE__TEXT_CONTENT);
-		createEAttribute(renderKitFactoryTypeEClass, RENDER_KIT_FACTORY_TYPE__ID);
-
-		renderKitIdTypeEClass = createEClass(RENDER_KIT_ID_TYPE);
-		createEAttribute(renderKitIdTypeEClass, RENDER_KIT_ID_TYPE__TEXT_CONTENT);
-		createEAttribute(renderKitIdTypeEClass, RENDER_KIT_ID_TYPE__ID);
-
-		renderKitTypeEClass = createEClass(RENDER_KIT_TYPE);
-		createEReference(renderKitTypeEClass, RENDER_KIT_TYPE__DESCRIPTION);
-		createEReference(renderKitTypeEClass, RENDER_KIT_TYPE__DISPLAY_NAME);
-		createEReference(renderKitTypeEClass, RENDER_KIT_TYPE__ICON);
-		createEReference(renderKitTypeEClass, RENDER_KIT_TYPE__RENDER_KIT_ID);
-		createEReference(renderKitTypeEClass, RENDER_KIT_TYPE__RENDER_KIT_CLASS);
-		createEReference(renderKitTypeEClass, RENDER_KIT_TYPE__RENDERER);
-		createEReference(renderKitTypeEClass, RENDER_KIT_TYPE__CLIENT_BEHAVIOR_RENDERER);
-		createEReference(renderKitTypeEClass, RENDER_KIT_TYPE__RENDER_KIT_EXTENSION);
-		createEAttribute(renderKitTypeEClass, RENDER_KIT_TYPE__ID);
-
-		renderKitExtensionTypeEClass = createEClass(RENDER_KIT_EXTENSION_TYPE);
-
-		resourceHandlerTypeEClass = createEClass(RESOURCE_HANDLER_TYPE);
-		createEAttribute(resourceHandlerTypeEClass, RESOURCE_HANDLER_TYPE__TEXT_CONTENT);
-		createEAttribute(resourceHandlerTypeEClass, RESOURCE_HANDLER_TYPE__ID);
-
-		smallIconTypeEClass = createEClass(SMALL_ICON_TYPE);
-		createEAttribute(smallIconTypeEClass, SMALL_ICON_TYPE__TEXT_CONTENT);
-		createEAttribute(smallIconTypeEClass, SMALL_ICON_TYPE__ID);
-
-		sourceClassTypeEClass = createEClass(SOURCE_CLASS_TYPE);
-		createEAttribute(sourceClassTypeEClass, SOURCE_CLASS_TYPE__TEXT_CONTENT);
-		createEAttribute(sourceClassTypeEClass, SOURCE_CLASS_TYPE__ID);
-
-		stateManagerTypeEClass = createEClass(STATE_MANAGER_TYPE);
-		createEAttribute(stateManagerTypeEClass, STATE_MANAGER_TYPE__TEXT_CONTENT);
-		createEAttribute(stateManagerTypeEClass, STATE_MANAGER_TYPE__ID);
-
-		suggestedValueTypeEClass = createEClass(SUGGESTED_VALUE_TYPE);
-		createEAttribute(suggestedValueTypeEClass, SUGGESTED_VALUE_TYPE__TEXT_CONTENT);
-		createEAttribute(suggestedValueTypeEClass, SUGGESTED_VALUE_TYPE__ID);
-
-		supportedLocaleTypeEClass = createEClass(SUPPORTED_LOCALE_TYPE);
-		createEAttribute(supportedLocaleTypeEClass, SUPPORTED_LOCALE_TYPE__TEXT_CONTENT);
-		createEAttribute(supportedLocaleTypeEClass, SUPPORTED_LOCALE_TYPE__ID);
-
-		systemEventClassTypeEClass = createEClass(SYSTEM_EVENT_CLASS_TYPE);
-		createEAttribute(systemEventClassTypeEClass, SYSTEM_EVENT_CLASS_TYPE__TEXT_CONTENT);
-		createEAttribute(systemEventClassTypeEClass, SYSTEM_EVENT_CLASS_TYPE__ID);
-
-		systemEventListenerClassTypeEClass = createEClass(SYSTEM_EVENT_LISTENER_CLASS_TYPE);
-		createEAttribute(systemEventListenerClassTypeEClass, SYSTEM_EVENT_LISTENER_CLASS_TYPE__TEXT_CONTENT);
-		createEAttribute(systemEventListenerClassTypeEClass, SYSTEM_EVENT_LISTENER_CLASS_TYPE__ID);
-
-		systemEventListenerTypeEClass = createEClass(SYSTEM_EVENT_LISTENER_TYPE);
-		createEReference(systemEventListenerTypeEClass, SYSTEM_EVENT_LISTENER_TYPE__SYSTEM_EVENT_LISTENER_CLASS);
-		createEReference(systemEventListenerTypeEClass, SYSTEM_EVENT_LISTENER_TYPE__SYSTEM_EVENT_CLASS);
-		createEReference(systemEventListenerTypeEClass, SYSTEM_EVENT_LISTENER_TYPE__SOURCE_CLASS);
-		createEAttribute(systemEventListenerTypeEClass, SYSTEM_EVENT_LISTENER_TYPE__ID);
-
-		tagHandlerDelegateFactoryTypeEClass = createEClass(TAG_HANDLER_DELEGATE_FACTORY_TYPE);
-		createEAttribute(tagHandlerDelegateFactoryTypeEClass, TAG_HANDLER_DELEGATE_FACTORY_TYPE__TEXT_CONTENT);
-		createEAttribute(tagHandlerDelegateFactoryTypeEClass, TAG_HANDLER_DELEGATE_FACTORY_TYPE__ID);
-
-		toViewIdTypeEClass = createEClass(TO_VIEW_ID_TYPE);
-		createEAttribute(toViewIdTypeEClass, TO_VIEW_ID_TYPE__TEXT_CONTENT);
-		createEAttribute(toViewIdTypeEClass, TO_VIEW_ID_TYPE__ID);
-
-		validatorClassTypeEClass = createEClass(VALIDATOR_CLASS_TYPE);
-		createEAttribute(validatorClassTypeEClass, VALIDATOR_CLASS_TYPE__TEXT_CONTENT);
-		createEAttribute(validatorClassTypeEClass, VALIDATOR_CLASS_TYPE__ID);
-
-		validatorIdTypeEClass = createEClass(VALIDATOR_ID_TYPE);
-		createEAttribute(validatorIdTypeEClass, VALIDATOR_ID_TYPE__TEXT_CONTENT);
-		createEAttribute(validatorIdTypeEClass, VALIDATOR_ID_TYPE__ID);
-
-		validatorTypeEClass = createEClass(VALIDATOR_TYPE);
-		createEReference(validatorTypeEClass, VALIDATOR_TYPE__DESCRIPTION);
-		createEReference(validatorTypeEClass, VALIDATOR_TYPE__DISPLAY_NAME);
-		createEReference(validatorTypeEClass, VALIDATOR_TYPE__ICON);
-		createEReference(validatorTypeEClass, VALIDATOR_TYPE__VALIDATOR_ID);
-		createEReference(validatorTypeEClass, VALIDATOR_TYPE__VALIDATOR_CLASS);
-		createEReference(validatorTypeEClass, VALIDATOR_TYPE__ATTRIBUTE);
-		createEReference(validatorTypeEClass, VALIDATOR_TYPE__PROPERTY);
-		createEReference(validatorTypeEClass, VALIDATOR_TYPE__VALIDATOR_EXTENSION);
-		createEAttribute(validatorTypeEClass, VALIDATOR_TYPE__ID);
-
-		validatorExtensionTypeEClass = createEClass(VALIDATOR_EXTENSION_TYPE);
-
-		valueClassTypeEClass = createEClass(VALUE_CLASS_TYPE);
-		createEAttribute(valueClassTypeEClass, VALUE_CLASS_TYPE__TEXT_CONTENT);
-		createEAttribute(valueClassTypeEClass, VALUE_CLASS_TYPE__ID);
-
-		valueTypeEClass = createEClass(VALUE_TYPE);
-		createEAttribute(valueTypeEClass, VALUE_TYPE__TEXT_CONTENT);
-		createEAttribute(valueTypeEClass, VALUE_TYPE__ID);
-
-		variableResolverTypeEClass = createEClass(VARIABLE_RESOLVER_TYPE);
-		createEAttribute(variableResolverTypeEClass, VARIABLE_RESOLVER_TYPE__TEXT_CONTENT);
-		createEAttribute(variableResolverTypeEClass, VARIABLE_RESOLVER_TYPE__ID);
-
-		viewHandlerTypeEClass = createEClass(VIEW_HANDLER_TYPE);
-		createEAttribute(viewHandlerTypeEClass, VIEW_HANDLER_TYPE__TEXT_CONTENT);
-		createEAttribute(viewHandlerTypeEClass, VIEW_HANDLER_TYPE__ID);
-
-		resourceBundleTypeEClass = createEClass(RESOURCE_BUNDLE_TYPE);
-		createEReference(resourceBundleTypeEClass, RESOURCE_BUNDLE_TYPE__DESCRIPTION);
-		createEReference(resourceBundleTypeEClass, RESOURCE_BUNDLE_TYPE__DISPLAY_NAME);
-		createEReference(resourceBundleTypeEClass, RESOURCE_BUNDLE_TYPE__ICON);
-		createEReference(resourceBundleTypeEClass, RESOURCE_BUNDLE_TYPE__BASE_NAME);
-		createEReference(resourceBundleTypeEClass, RESOURCE_BUNDLE_TYPE__VAR);
-		createEAttribute(resourceBundleTypeEClass, RESOURCE_BUNDLE_TYPE__ID);
-
-		baseNameTypeEClass = createEClass(BASE_NAME_TYPE);
-		createEAttribute(baseNameTypeEClass, BASE_NAME_TYPE__TEXT_CONTENT);
-		createEAttribute(baseNameTypeEClass, BASE_NAME_TYPE__ID);
-
-		varTypeEClass = createEClass(VAR_TYPE);
-		createEAttribute(varTypeEClass, VAR_TYPE__TEXT_CONTENT);
-		createEAttribute(varTypeEClass, VAR_TYPE__ID);
-
-		viewDeclarationLanguageFactoryTypeEClass = createEClass(VIEW_DECLARATION_LANGUAGE_FACTORY_TYPE);
-		createEAttribute(viewDeclarationLanguageFactoryTypeEClass, VIEW_DECLARATION_LANGUAGE_FACTORY_TYPE__TEXT_CONTENT);
-		createEAttribute(viewDeclarationLanguageFactoryTypeEClass, VIEW_DECLARATION_LANGUAGE_FACTORY_TYPE__ID);
-
-		visitContextFactoryTypeEClass = createEClass(VISIT_CONTEXT_FACTORY_TYPE);
-		createEAttribute(visitContextFactoryTypeEClass, VISIT_CONTEXT_FACTORY_TYPE__TEXT_CONTENT);
-		createEAttribute(visitContextFactoryTypeEClass, VISIT_CONTEXT_FACTORY_TYPE__ID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private boolean isInitialized = false;
-
-    /**
-	 * Complete the initialization of the package and its meta-model.  This
-	 * method is guarded to have no affect on any invocation but its first.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void initializePackageContents() {
-		if (isInitialized) return;
-		isInitialized = true;
-
-		// Initialize package
-		setName(eNAME);
-		setNsPrefix(eNS_PREFIX);
-		setNsURI(eNS_URI);
-
-		// Obtain other dependent packages
-		XMLTypePackage theXMLTypePackage = (XMLTypePackage)EPackage.Registry.INSTANCE.getEPackage(XMLTypePackage.eNS_URI);
-
-		// Add supertypes to classes
-		applicationExtensionTypeEClass.getESuperTypes().add(this.getExtensionType());
-		attributeExtensionTypeEClass.getESuperTypes().add(this.getExtensionType());
-		behaviorExtensionTypeEClass.getESuperTypes().add(this.getExtensionType());
-		componentExtensionTypeEClass.getESuperTypes().add(this.getExtensionType());
-		converterExtensionTypeEClass.getESuperTypes().add(this.getExtensionType());
-		facesConfigExtensionTypeEClass.getESuperTypes().add(this.getExtensionType());
-		facetExtensionTypeEClass.getESuperTypes().add(this.getExtensionType());
-		factoryExtensionTypeEClass.getESuperTypes().add(this.getExtensionType());
-		lifecycleExtensionTypeEClass.getESuperTypes().add(this.getExtensionType());
-		managedBeanExtensionTypeEClass.getESuperTypes().add(this.getExtensionType());
-		navigationRuleExtensionTypeEClass.getESuperTypes().add(this.getExtensionType());
-		propertyExtensionTypeEClass.getESuperTypes().add(this.getExtensionType());
-		rendererExtensionTypeEClass.getESuperTypes().add(this.getExtensionType());
-		renderKitExtensionTypeEClass.getESuperTypes().add(this.getExtensionType());
-		validatorExtensionTypeEClass.getESuperTypes().add(this.getExtensionType());
-
-		// Initialize classes and features; add operations and parameters
-		initEClass(absoluteOrderingTypeEClass, AbsoluteOrderingType.class, "AbsoluteOrderingType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getAbsoluteOrderingType_Name(), this.getNameType(), null, "name", null, 0, -1, AbsoluteOrderingType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getAbsoluteOrderingType_Others(), this.getOrderingOthersType(), null, "others", null, 0, 1, AbsoluteOrderingType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(actionListenerTypeEClass, ActionListenerType.class, "ActionListenerType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getActionListenerType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, ActionListenerType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getActionListenerType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, ActionListenerType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(applicationFactoryTypeEClass, ApplicationFactoryType.class, "ApplicationFactoryType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getApplicationFactoryType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, ApplicationFactoryType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getApplicationFactoryType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, ApplicationFactoryType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(applicationTypeEClass, ApplicationType.class, "ApplicationType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getApplicationType_ActionListener(), this.getActionListenerType(), null, "actionListener", null, 0, -1, ApplicationType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getApplicationType_DefaultRenderKitId(), this.getDefaultRenderKitIdType(), null, "defaultRenderKitId", null, 0, -1, ApplicationType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getApplicationType_MessageBundle(), this.getMessageBundleType(), null, "messageBundle", null, 0, -1, ApplicationType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getApplicationType_NavigationHandler(), this.getNavigationHandlerType(), null, "navigationHandler", null, 0, -1, ApplicationType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getApplicationType_ViewHandler(), this.getViewHandlerType(), null, "viewHandler", null, 0, -1, ApplicationType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getApplicationType_StateManager(), this.getStateManagerType(), null, "stateManager", null, 0, -1, ApplicationType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getApplicationType_ELResolver(), this.getELResolverType(), null, "eLResolver", null, 0, -1, ApplicationType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getApplicationType_PropertyResolver(), this.getPropertyResolverType(), null, "propertyResolver", null, 0, -1, ApplicationType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getApplicationType_VariableResolver(), this.getVariableResolverType(), null, "variableResolver", null, 0, -1, ApplicationType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getApplicationType_ResourceHandler(), this.getResourceHandlerType(), null, "resourceHandler", null, 0, -1, ApplicationType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getApplicationType_SystemEventListener(), this.getSystemEventListenerType(), null, "systemEventListener", null, 0, -1, ApplicationType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getApplicationType_LocaleConfig(), this.getLocaleConfigType(), null, "localeConfig", null, 0, -1, ApplicationType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getApplicationType_ResourceBundle(), this.getResourceBundleType(), null, "resourceBundle", null, 0, -1, ApplicationType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getApplicationType_ApplicationExtension(), this.getApplicationExtensionType(), null, "applicationExtension", null, 0, -1, ApplicationType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getApplicationType_DefaultValidators(), this.getDefaultValidatorsType(), null, "defaultValidators", null, 0, -1, ApplicationType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getApplicationType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, ApplicationType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(applicationExtensionTypeEClass, ApplicationExtensionType.class, "ApplicationExtensionType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-
-		initEClass(attributeClassTypeEClass, AttributeClassType.class, "AttributeClassType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getAttributeClassType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, AttributeClassType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getAttributeClassType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, AttributeClassType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(attributeExtensionTypeEClass, AttributeExtensionType.class, "AttributeExtensionType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-
-		initEClass(attributeNameTypeEClass, AttributeNameType.class, "AttributeNameType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getAttributeNameType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, AttributeNameType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getAttributeNameType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, AttributeNameType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(attributeTypeEClass, AttributeType.class, "AttributeType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getAttributeType_Description(), this.getDescriptionType(), null, "description", null, 0, -1, AttributeType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getAttributeType_DisplayName(), this.getDisplayNameType(), null, "displayName", null, 0, -1, AttributeType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getAttributeType_Icon(), this.getIconType(), null, "icon", null, 0, -1, AttributeType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getAttributeType_AttributeName(), this.getAttributeNameType(), null, "attributeName", null, 1, 1, AttributeType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getAttributeType_AttributeClass(), this.getAttributeClassType(), null, "attributeClass", null, 1, 1, AttributeType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getAttributeType_DefaultValue(), this.getDefaultValueType(), null, "defaultValue", null, 0, 1, AttributeType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getAttributeType_SuggestedValue(), this.getSuggestedValueType(), null, "suggestedValue", null, 0, 1, AttributeType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getAttributeType_AttributeExtension(), this.getAttributeExtensionType(), null, "attributeExtension", null, 0, -1, AttributeType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getAttributeType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, AttributeType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(behaviorClassTypeEClass, BehaviorClassType.class, "BehaviorClassType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getBehaviorClassType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, BehaviorClassType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getBehaviorClassType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, BehaviorClassType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(behaviorIdTypeEClass, BehaviorIdType.class, "BehaviorIdType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getBehaviorIdType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, BehaviorIdType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getBehaviorIdType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, BehaviorIdType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(behaviorTypeEClass, BehaviorType.class, "BehaviorType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getBehaviorType_Description(), this.getDescriptionType(), null, "description", null, 0, -1, BehaviorType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getBehaviorType_DisplayName(), this.getDisplayNameType(), null, "displayName", null, 0, -1, BehaviorType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getBehaviorType_Icon(), this.getIconType(), null, "icon", null, 0, -1, BehaviorType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getBehaviorType_BehaviorId(), this.getBehaviorIdType(), null, "behaviorId", null, 1, 1, BehaviorType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getBehaviorType_BehaviorClass(), this.getBehaviorClassType(), null, "behaviorClass", null, 1, 1, BehaviorType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getBehaviorType_Attribute(), this.getAttributeType(), null, "attribute", null, 0, -1, BehaviorType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getBehaviorType_Property(), this.getPropertyType(), null, "property", null, 0, -1, BehaviorType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getBehaviorType_BehaviorExtension(), this.getBehaviorExtensionType(), null, "behaviorExtension", null, 0, -1, BehaviorType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(behaviorExtensionTypeEClass, BehaviorExtensionType.class, "BehaviorExtensionType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-
-		initEClass(clientBehaviorRendererClassTypeEClass, ClientBehaviorRendererClassType.class, "ClientBehaviorRendererClassType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getClientBehaviorRendererClassType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, ClientBehaviorRendererClassType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getClientBehaviorRendererClassType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, ClientBehaviorRendererClassType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(clientBehaviorRendererTypeEClass, ClientBehaviorRendererType.class, "ClientBehaviorRendererType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getClientBehaviorRendererType_ClientBehaviorRendererType(), this.getClientBehaviorRendererTypeType(), null, "clientBehaviorRendererType", null, 1, 1, ClientBehaviorRendererType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getClientBehaviorRendererType_ClientBehaviorRendererClass(), this.getClientBehaviorRendererClassType(), null, "clientBehaviorRendererClass", null, 1, 1, ClientBehaviorRendererType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(clientBehaviorRendererTypeTypeEClass, ClientBehaviorRendererTypeType.class, "ClientBehaviorRendererTypeType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getClientBehaviorRendererTypeType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, ClientBehaviorRendererTypeType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getClientBehaviorRendererTypeType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, ClientBehaviorRendererTypeType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(componentClassTypeEClass, ComponentClassType.class, "ComponentClassType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getComponentClassType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, ComponentClassType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getComponentClassType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, ComponentClassType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(componentExtensionTypeEClass, ComponentExtensionType.class, "ComponentExtensionType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-
-		initEClass(componentFamilyTypeEClass, ComponentFamilyType.class, "ComponentFamilyType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getComponentFamilyType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, ComponentFamilyType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getComponentFamilyType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, ComponentFamilyType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(componentTypeEClass, ComponentType.class, "ComponentType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getComponentType_Description(), this.getDescriptionType(), null, "description", null, 0, -1, ComponentType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getComponentType_DisplayName(), this.getDisplayNameType(), null, "displayName", null, 0, -1, ComponentType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getComponentType_Icon(), this.getIconType(), null, "icon", null, 0, -1, ComponentType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getComponentType_ComponentType(), this.getComponentTypeType(), null, "componentType", null, 1, 1, ComponentType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getComponentType_ComponentClass(), this.getComponentClassType(), null, "componentClass", null, 1, 1, ComponentType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getComponentType_Facet(), this.getFacetType(), null, "facet", null, 0, -1, ComponentType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getComponentType_Attribute(), this.getAttributeType(), null, "attribute", null, 0, -1, ComponentType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getComponentType_Property(), this.getPropertyType(), null, "property", null, 0, -1, ComponentType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getComponentType_ComponentExtension(), this.getComponentExtensionType(), null, "componentExtension", null, 0, -1, ComponentType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getComponentType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, ComponentType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(componentTypeTypeEClass, ComponentTypeType.class, "ComponentTypeType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getComponentTypeType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, ComponentTypeType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getComponentTypeType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, ComponentTypeType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(converterClassTypeEClass, ConverterClassType.class, "ConverterClassType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getConverterClassType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, ConverterClassType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getConverterClassType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, ConverterClassType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(converterForClassTypeEClass, ConverterForClassType.class, "ConverterForClassType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getConverterForClassType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, ConverterForClassType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getConverterForClassType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, ConverterForClassType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(converterIdTypeEClass, ConverterIdType.class, "ConverterIdType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getConverterIdType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, ConverterIdType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getConverterIdType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, ConverterIdType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(converterTypeEClass, ConverterType.class, "ConverterType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getConverterType_Description(), this.getDescriptionType(), null, "description", null, 0, -1, ConverterType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getConverterType_DisplayName(), this.getDisplayNameType(), null, "displayName", null, 0, -1, ConverterType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getConverterType_Icon(), this.getIconType(), null, "icon", null, 0, -1, ConverterType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getConverterType_ConverterId(), this.getConverterIdType(), null, "converterId", null, 0, 1, ConverterType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getConverterType_ConverterForClass(), this.getConverterForClassType(), null, "converterForClass", null, 0, 1, ConverterType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getConverterType_ConverterClass(), this.getConverterClassType(), null, "converterClass", null, 1, 1, ConverterType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getConverterType_Attribute(), this.getAttributeType(), null, "attribute", null, 0, -1, ConverterType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getConverterType_Property(), this.getPropertyType(), null, "property", null, 0, -1, ConverterType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getConverterType_ConverterExtension(), this.getConverterExtensionType(), null, "converterExtension", null, 0, -1, ConverterType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getConverterType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, ConverterType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(converterExtensionTypeEClass, ConverterExtensionType.class, "ConverterExtensionType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-
-		initEClass(defaultLocaleTypeEClass, DefaultLocaleType.class, "DefaultLocaleType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getDefaultLocaleType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, DefaultLocaleType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getDefaultLocaleType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, DefaultLocaleType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(defaultRenderKitIdTypeEClass, DefaultRenderKitIdType.class, "DefaultRenderKitIdType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getDefaultRenderKitIdType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, DefaultRenderKitIdType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getDefaultRenderKitIdType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, DefaultRenderKitIdType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(defaultValidatorsTypeEClass, DefaultValidatorsType.class, "DefaultValidatorsType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getDefaultValidatorsType_ValidatorId(), this.getValidatorIdType(), null, "validatorId", null, 0, -1, DefaultValidatorsType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getDefaultValidatorsType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, DefaultValidatorsType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(defaultValueTypeEClass, DefaultValueType.class, "DefaultValueType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getDefaultValueType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, DefaultValueType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getDefaultValueType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, DefaultValueType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(descriptionTypeEClass, DescriptionType.class, "DescriptionType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getDescriptionType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, DescriptionType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getDescriptionType_Lang(), theXMLTypePackage.getLanguage(), "lang", null, 0, 1, DescriptionType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getDescriptionType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, DescriptionType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(displayNameTypeEClass, DisplayNameType.class, "DisplayNameType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getDisplayNameType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, DisplayNameType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getDisplayNameType_Lang(), theXMLTypePackage.getLanguage(), "lang", null, 0, 1, DisplayNameType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getDisplayNameType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, DisplayNameType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(documentRootEClass, DocumentRoot.class, "DocumentRoot", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getDocumentRoot_Mixed(), ecorePackage.getEFeatureMapEntry(), "mixed", null, 0, -1, null, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_XMLNSPrefixMap(), ecorePackage.getEStringToStringMapEntry(), null, "xMLNSPrefixMap", null, 0, -1, null, IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_XSISchemaLocation(), ecorePackage.getEStringToStringMapEntry(), null, "xSISchemaLocation", null, 0, -1, null, IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_AbsoluteOrdering(), this.getAbsoluteOrderingType(), null, "absoluteOrdering", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_ActionListener(), this.getActionListenerType(), null, "actionListener", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_Application(), this.getApplicationType(), null, "application", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_ApplicationFactory(), this.getApplicationFactoryType(), null, "applicationFactory", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_Attribute(), this.getAttributeType(), null, "attribute", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_AttributeClass(), this.getAttributeClassType(), null, "attributeClass", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_AttributeExtension(), this.getAttributeExtensionType(), null, "attributeExtension", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_AttributeName(), this.getAttributeNameType(), null, "attributeName", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_Behavior(), this.getBehaviorType(), null, "behavior", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_BehaviorClass(), this.getBehaviorClassType(), null, "behaviorClass", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_BehaviorId(), this.getBehaviorIdType(), null, "behaviorId", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_BehaviorExtension(), this.getBehaviorExtensionType(), null, "behaviorExtension", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_Component(), this.getComponentType(), null, "component", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_ComponentClass(), this.getComponentClassType(), null, "componentClass", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_ComponentExtension(), this.getComponentExtensionType(), null, "componentExtension", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_ComponentFamily(), this.getComponentFamilyType(), null, "componentFamily", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_ComponentType(), this.getComponentTypeType(), null, "componentType", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_Converter(), this.getConverterType(), null, "converter", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_ConverterClass(), this.getConverterClassType(), null, "converterClass", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_ConverterForClass(), this.getConverterForClassType(), null, "converterForClass", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_ConverterId(), this.getConverterIdType(), null, "converterId", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_DefaultLocale(), this.getDefaultLocaleType(), null, "defaultLocale", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_DefaultRenderKitId(), this.getDefaultRenderKitIdType(), null, "defaultRenderKitId", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_DefaultValidators(), this.getDefaultValidatorsType(), null, "defaultValidators", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_DefaultValue(), this.getDefaultValueType(), null, "defaultValue", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_Description(), this.getDescriptionType(), null, "description", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_DisplayName(), this.getDisplayNameType(), null, "displayName", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_ExceptionHandlerFactory(), this.getExceptionHandlerFactoryType(), null, "exceptionHandlerFactory", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_ExternalContextFactory(), this.getExternalContextFactoryType(), null, "externalContextFactory", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_FacesConfig(), this.getFacesConfigType(), null, "facesConfig", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_FacesContextFactory(), this.getFacesContextFactoryType(), null, "facesContextFactory", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_Facet(), this.getFacetType(), null, "facet", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_FacetExtension(), this.getFacetExtensionType(), null, "facetExtension", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_FacetName(), this.getFacetNameType(), null, "facetName", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_Factory(), this.getFactoryType(), null, "factory", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_FromAction(), this.getFromActionType(), null, "fromAction", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_FromOutcome(), this.getFromOutcomeType(), null, "fromOutcome", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_FromViewId(), this.getFromViewIdType(), null, "fromViewId", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_Icon(), this.getIconType(), null, "icon", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_If(), this.getIfType(), null, "if", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_Key(), this.getKeyType(), null, "key", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_KeyClass(), this.getKeyClassType(), null, "keyClass", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_LargeIcon(), this.getLargeIconType(), null, "largeIcon", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_Lifecycle(), this.getLifecycleType(), null, "lifecycle", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_LifecycleFactory(), this.getLifecycleFactoryType(), null, "lifecycleFactory", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_ListEntries(), this.getListEntriesType(), null, "listEntries", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_LocaleConfig(), this.getLocaleConfigType(), null, "localeConfig", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_ManagedBean(), this.getManagedBeanType(), null, "managedBean", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_ManagedBeanClass(), this.getManagedBeanClassType(), null, "managedBeanClass", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_ManagedBeanName(), this.getManagedBeanNameType(), null, "managedBeanName", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_ManagedBeanScope(), this.getManagedBeanScopeType(), null, "managedBeanScope", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_ManagedProperty(), this.getManagedPropertyType(), null, "managedProperty", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_MapEntries(), this.getMapEntriesType(), null, "mapEntries", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_MapEntry(), this.getMapEntryType(), null, "mapEntry", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_MessageBundle(), this.getMessageBundleType(), null, "messageBundle", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_Name(), this.getNameType(), null, "name", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_NavigationCase(), this.getNavigationCaseType(), null, "navigationCase", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_NavigationHandler(), this.getNavigationHandlerType(), null, "navigationHandler", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_NavigationRule(), this.getNavigationRuleType(), null, "navigationRule", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_NullValue(), this.getNullValueType(), null, "nullValue", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_Ordering(), this.getOrderingType(), null, "ordering", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_OrderingOrdering(), this.getOrderingOrderingType(), null, "orderingOrdering", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_Others(), this.getOrderingOthersType(), null, "others", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_PartialViewContextFactory(), this.getPartialViewContextFactoryType(), null, "partialViewContextFactory", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_PhaseListener(), this.getPhaseListenerType(), null, "phaseListener", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_Property(), this.getPropertyType(), null, "property", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_PropertyClass(), this.getPropertyClassType(), null, "propertyClass", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_PropertyExtension(), this.getPropertyExtensionType(), null, "propertyExtension", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_PropertyName(), this.getPropertyNameType(), null, "propertyName", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_PropertyResolver(), this.getPropertyResolverType(), null, "propertyResolver", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_Redirect(), this.getRedirectType(), null, "redirect", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_RedirectViewParam(), this.getRedirectViewParamType(), null, "redirectViewParam", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_ReferencedBean(), this.getReferencedBeanType(), null, "referencedBean", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_ReferencedBeanClass(), this.getReferencedBeanClassType(), null, "referencedBeanClass", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_ReferencedBeanName(), this.getReferencedBeanNameType(), null, "referencedBeanName", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_Renderer(), this.getRendererType(), null, "renderer", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_RendererClass(), this.getRendererClassType(), null, "rendererClass", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_RendererExtension(), this.getRendererExtensionType(), null, "rendererExtension", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_RendererType(), this.getRendererTypeType(), null, "rendererType", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_RenderKit(), this.getRenderKitType(), null, "renderKit", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_RenderKitClass(), this.getRenderKitClassType(), null, "renderKitClass", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_RenderKitFactory(), this.getRenderKitFactoryType(), null, "renderKitFactory", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_RenderKitId(), this.getRenderKitIdType(), null, "renderKitId", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_ResourceHandler(), this.getResourceHandlerType(), null, "resourceHandler", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_SmallIcon(), this.getSmallIconType(), null, "smallIcon", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_SourceClass(), this.getSourceClassType(), null, "sourceClass", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_StateManager(), this.getStateManagerType(), null, "stateManager", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_SuggestedValue(), this.getSuggestedValueType(), null, "suggestedValue", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_SupportedLocale(), this.getSupportedLocaleType(), null, "supportedLocale", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_SystemEventClass(), this.getSystemEventClassType(), null, "systemEventClass", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_SystemEventListener(), this.getSystemEventListenerType(), null, "systemEventListener", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_SystemEventListenerClass(), this.getSystemEventListenerClassType(), null, "systemEventListenerClass", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_TagHandlerDelegateFactory(), this.getTagHandlerDelegateFactoryType(), null, "tagHandlerDelegateFactory", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_ToViewId(), this.getToViewIdType(), null, "toViewId", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_Validator(), this.getValidatorType(), null, "validator", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_ValidatorClass(), this.getValidatorClassType(), null, "validatorClass", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_ValidatorId(), this.getValidatorIdType(), null, "validatorId", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_Value(), this.getValueType(), null, "value", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_ValueClass(), this.getValueClassType(), null, "valueClass", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_VariableResolver(), this.getVariableResolverType(), null, "variableResolver", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_ViewDeclarationLanguageFactory(), this.getViewDeclarationLanguageFactoryType(), null, "viewDeclarationLanguageFactory", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_ViewHandler(), this.getViewHandlerType(), null, "viewHandler", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_VisitContextFactory(), this.getVisitContextFactoryType(), null, "visitContextFactory", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-
-		initEClass(dynamicAttributeEClass, DynamicAttribute.class, "DynamicAttribute", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getDynamicAttribute_Name(), ecorePackage.getEString(), "name", null, 0, 1, DynamicAttribute.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getDynamicAttribute_Value(), ecorePackage.getEString(), "value", null, 0, 1, DynamicAttribute.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(dynamicElementEClass, DynamicElement.class, "DynamicElement", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getDynamicElement_ChildNodes(), this.getDynamicElement(), null, "childNodes", null, 0, -1, DynamicElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getDynamicElement_Name(), ecorePackage.getEString(), "name", null, 0, 1, DynamicElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getDynamicElement_Attributes(), this.getDynamicAttribute(), null, "attributes", null, 0, -1, DynamicElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getDynamicElement_TextContent(), ecorePackage.getEString(), "textContent", null, 0, 1, DynamicElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(elResolverTypeEClass, ELResolverType.class, "ELResolverType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getELResolverType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, ELResolverType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getELResolverType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, ELResolverType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(exceptionHandlerFactoryTypeEClass, ExceptionHandlerFactoryType.class, "ExceptionHandlerFactoryType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getExceptionHandlerFactoryType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, ExceptionHandlerFactoryType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getExceptionHandlerFactoryType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, ExceptionHandlerFactoryType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(extensionTypeEClass, ExtensionType.class, "ExtensionType", IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getExtensionType_ChildNodes(), this.getDynamicElement(), null, "childNodes", null, 0, -1, ExtensionType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getExtensionType_TextContent(), ecorePackage.getEString(), "textContent", null, 0, 1, ExtensionType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getExtensionType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, ExtensionType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(externalContextFactoryTypeEClass, ExternalContextFactoryType.class, "ExternalContextFactoryType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getExternalContextFactoryType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, ExternalContextFactoryType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getExternalContextFactoryType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, ExternalContextFactoryType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(facesConfigTypeEClass, FacesConfigType.class, "FacesConfigType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getFacesConfigType_Application(), this.getApplicationType(), null, "application", null, 0, -1, FacesConfigType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getFacesConfigType_Ordering(), this.getOrderingType(), null, "ordering", null, 0, -1, FacesConfigType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getFacesConfigType_AbsoluteOrdering(), this.getAbsoluteOrderingType(), null, "absoluteOrdering", null, 0, 1, FacesConfigType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getFacesConfigType_Factory(), this.getFactoryType(), null, "factory", null, 0, -1, FacesConfigType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getFacesConfigType_Component(), this.getComponentType(), null, "component", null, 0, -1, FacesConfigType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getFacesConfigType_Converter(), this.getConverterType(), null, "converter", null, 0, -1, FacesConfigType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getFacesConfigType_ManagedBean(), this.getManagedBeanType(), null, "managedBean", null, 0, -1, FacesConfigType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getFacesConfigType_Name(), this.getNameType(), null, "name", null, 0, 1, FacesConfigType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getFacesConfigType_NavigationRule(), this.getNavigationRuleType(), null, "navigationRule", null, 0, -1, FacesConfigType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getFacesConfigType_ReferencedBean(), this.getReferencedBeanType(), null, "referencedBean", null, 0, -1, FacesConfigType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getFacesConfigType_RenderKit(), this.getRenderKitType(), null, "renderKit", null, 0, -1, FacesConfigType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getFacesConfigType_Lifecycle(), this.getLifecycleType(), null, "lifecycle", null, 0, -1, FacesConfigType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getFacesConfigType_Validator(), this.getValidatorType(), null, "validator", null, 0, -1, FacesConfigType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getFacesConfigType_Behavior(), this.getBehaviorType(), null, "behavior", null, 0, -1, FacesConfigType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getFacesConfigType_FacesConfigExtension(), this.getFacesConfigExtensionType(), null, "facesConfigExtension", null, 0, -1, FacesConfigType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getFacesConfigType_Xmlns(), theXMLTypePackage.getString(), "xmlns", "http://java.sun.com/JSF/Configuration", 0, 1, FacesConfigType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getFacesConfigType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, FacesConfigType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getFacesConfigType_MetadataComplete(), theXMLTypePackage.getBoolean(), "metadataComplete", null, 0, 1, FacesConfigType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(facesConfigExtensionTypeEClass, FacesConfigExtensionType.class, "FacesConfigExtensionType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-
-		initEClass(facesContextFactoryTypeEClass, FacesContextFactoryType.class, "FacesContextFactoryType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getFacesContextFactoryType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, FacesContextFactoryType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getFacesContextFactoryType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, FacesContextFactoryType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(facetExtensionTypeEClass, FacetExtensionType.class, "FacetExtensionType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-
-		initEClass(facetNameTypeEClass, FacetNameType.class, "FacetNameType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getFacetNameType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, FacetNameType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getFacetNameType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, FacetNameType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(facetTypeEClass, FacetType.class, "FacetType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getFacetType_Description(), this.getDescriptionType(), null, "description", null, 0, -1, FacetType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getFacetType_DisplayName(), this.getDisplayNameType(), null, "displayName", null, 0, -1, FacetType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getFacetType_Icon(), this.getIconType(), null, "icon", null, 0, -1, FacetType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getFacetType_FacetName(), this.getFacetNameType(), null, "facetName", null, 1, 1, FacetType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getFacetType_FacetExtension(), this.getFacetExtensionType(), null, "facetExtension", null, 0, -1, FacetType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getFacetType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, FacetType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(factoryTypeEClass, FactoryType.class, "FactoryType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getFactoryType_ApplicationFactory(), this.getApplicationFactoryType(), null, "applicationFactory", null, 0, -1, FactoryType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getFactoryType_ExceptionHandlerFactory(), this.getExceptionHandlerFactoryType(), null, "exceptionHandlerFactory", null, 0, -1, FactoryType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getFactoryType_ExternalContextFactory(), this.getExternalContextFactoryType(), null, "externalContextFactory", null, 0, -1, FactoryType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getFactoryType_FacesContextFactory(), this.getFacesContextFactoryType(), null, "facesContextFactory", null, 0, -1, FactoryType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getFactoryType_PartialViewContextFactory(), this.getPartialViewContextFactoryType(), null, "partialViewContextFactory", null, 0, -1, FactoryType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getFactoryType_LifecycleFactory(), this.getLifecycleFactoryType(), null, "lifecycleFactory", null, 0, -1, FactoryType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getFactoryType_ViewDeclarationLanguageFactory(), this.getViewDeclarationLanguageFactoryType(), null, "viewDeclarationLanguageFactory", null, 0, -1, FactoryType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getFactoryType_TagHandlerDelegateFactory(), this.getTagHandlerDelegateFactoryType(), null, "tagHandlerDelegateFactory", null, 0, -1, FactoryType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getFactoryType_RenderKitFactory(), this.getRenderKitFactoryType(), null, "renderKitFactory", null, 0, -1, FactoryType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getFactoryType_VisitContextFactory(), this.getVisitContextFactoryType(), null, "visitContextFactory", null, 0, -1, FactoryType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getFactoryType_FactoryExtension(), this.getFactoryExtensionType(), null, "factoryExtension", null, 0, -1, FactoryType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getFactoryType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, FactoryType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(factoryExtensionTypeEClass, FactoryExtensionType.class, "FactoryExtensionType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-
-		initEClass(fromActionTypeEClass, FromActionType.class, "FromActionType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getFromActionType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, FromActionType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getFromActionType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, FromActionType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(fromOutcomeTypeEClass, FromOutcomeType.class, "FromOutcomeType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getFromOutcomeType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, FromOutcomeType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getFromOutcomeType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, FromOutcomeType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(fromViewIdTypeEClass, FromViewIdType.class, "FromViewIdType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getFromViewIdType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, FromViewIdType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getFromViewIdType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, FromViewIdType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(iconTypeEClass, IconType.class, "IconType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getIconType_SmallIcon(), this.getSmallIconType(), null, "smallIcon", null, 0, 1, IconType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getIconType_LargeIcon(), this.getLargeIconType(), null, "largeIcon", null, 0, 1, IconType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getIconType_Lang(), theXMLTypePackage.getLanguage(), "lang", null, 0, 1, IconType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getIconType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, IconType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(ifTypeEClass, IfType.class, "IfType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getIfType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, IfType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getIfType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, IfType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(keyClassTypeEClass, KeyClassType.class, "KeyClassType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getKeyClassType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, KeyClassType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getKeyClassType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, KeyClassType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(keyTypeEClass, KeyType.class, "KeyType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getKeyType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, KeyType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getKeyType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, KeyType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(largeIconTypeEClass, LargeIconType.class, "LargeIconType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getLargeIconType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, LargeIconType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getLargeIconType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, LargeIconType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(lifecycleFactoryTypeEClass, LifecycleFactoryType.class, "LifecycleFactoryType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getLifecycleFactoryType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, LifecycleFactoryType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getLifecycleFactoryType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, LifecycleFactoryType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(lifecycleTypeEClass, LifecycleType.class, "LifecycleType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getLifecycleType_PhaseListener(), this.getPhaseListenerType(), null, "phaseListener", null, 0, -1, LifecycleType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getLifecycleType_LifecycleExtension(), this.getLifecycleExtensionType(), null, "lifecycleExtension", null, 0, -1, LifecycleType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getLifecycleType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, LifecycleType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(lifecycleExtensionTypeEClass, LifecycleExtensionType.class, "LifecycleExtensionType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-
-		initEClass(listEntriesTypeEClass, ListEntriesType.class, "ListEntriesType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getListEntriesType_ValueClass(), this.getValueClassType(), null, "valueClass", null, 0, 1, ListEntriesType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getListEntriesType_NullValue(), this.getNullValueType(), null, "nullValue", null, 0, -1, ListEntriesType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getListEntriesType_Value(), this.getValueType(), null, "value", null, 0, -1, ListEntriesType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getListEntriesType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, ListEntriesType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(localeConfigTypeEClass, LocaleConfigType.class, "LocaleConfigType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getLocaleConfigType_DefaultLocale(), this.getDefaultLocaleType(), null, "defaultLocale", null, 0, 1, LocaleConfigType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getLocaleConfigType_SupportedLocale(), this.getSupportedLocaleType(), null, "supportedLocale", null, 0, -1, LocaleConfigType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getLocaleConfigType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, LocaleConfigType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(managedBeanClassTypeEClass, ManagedBeanClassType.class, "ManagedBeanClassType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getManagedBeanClassType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, ManagedBeanClassType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getManagedBeanClassType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, ManagedBeanClassType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(managedBeanNameTypeEClass, ManagedBeanNameType.class, "ManagedBeanNameType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getManagedBeanNameType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, ManagedBeanNameType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getManagedBeanNameType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, ManagedBeanNameType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(managedBeanScopeTypeEClass, ManagedBeanScopeType.class, "ManagedBeanScopeType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getManagedBeanScopeType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, ManagedBeanScopeType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getManagedBeanScopeType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, ManagedBeanScopeType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(managedBeanTypeEClass, ManagedBeanType.class, "ManagedBeanType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getManagedBeanType_Description(), this.getDescriptionType(), null, "description", null, 0, -1, ManagedBeanType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getManagedBeanType_DisplayName(), this.getDisplayNameType(), null, "displayName", null, 0, -1, ManagedBeanType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getManagedBeanType_Icon(), this.getIconType(), null, "icon", null, 0, -1, ManagedBeanType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getManagedBeanType_ManagedBeanName(), this.getManagedBeanNameType(), null, "managedBeanName", null, 1, 1, ManagedBeanType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getManagedBeanType_ManagedBeanClass(), this.getManagedBeanClassType(), null, "managedBeanClass", null, 1, 1, ManagedBeanType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getManagedBeanType_ManagedBeanScope(), this.getManagedBeanScopeType(), null, "managedBeanScope", null, 1, 1, ManagedBeanType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getManagedBeanType_ManagedProperty(), this.getManagedPropertyType(), null, "managedProperty", null, 0, -1, ManagedBeanType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getManagedBeanType_MapEntries(), this.getMapEntriesType(), null, "mapEntries", null, 0, 1, ManagedBeanType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getManagedBeanType_ListEntries(), this.getListEntriesType(), null, "listEntries", null, 0, 1, ManagedBeanType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getManagedBeanType_ManagedBeanExtension(), this.getManagedBeanExtensionType(), null, "managedBeanExtension", null, 0, -1, ManagedBeanType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getManagedBeanType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, ManagedBeanType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getManagedBeanType_Eager(), theXMLTypePackage.getBoolean(), "eager", null, 0, 1, ManagedBeanType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(managedBeanExtensionTypeEClass, ManagedBeanExtensionType.class, "ManagedBeanExtensionType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-
-		initEClass(managedPropertyTypeEClass, ManagedPropertyType.class, "ManagedPropertyType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getManagedPropertyType_Description(), this.getDescriptionType(), null, "description", null, 0, -1, ManagedPropertyType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getManagedPropertyType_DisplayName(), this.getDisplayNameType(), null, "displayName", null, 0, -1, ManagedPropertyType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getManagedPropertyType_Icon(), this.getIconType(), null, "icon", null, 0, -1, ManagedPropertyType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getManagedPropertyType_PropertyName(), this.getPropertyNameType(), null, "propertyName", null, 1, 1, ManagedPropertyType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getManagedPropertyType_PropertyClass(), this.getPropertyClassType(), null, "propertyClass", null, 0, 1, ManagedPropertyType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getManagedPropertyType_MapEntries(), this.getMapEntriesType(), null, "mapEntries", null, 0, 1, ManagedPropertyType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getManagedPropertyType_NullValue(), this.getNullValueType(), null, "nullValue", null, 0, 1, ManagedPropertyType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getManagedPropertyType_Value(), this.getValueType(), null, "value", null, 0, 1, ManagedPropertyType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getManagedPropertyType_ListEntries(), this.getListEntriesType(), null, "listEntries", null, 0, 1, ManagedPropertyType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getManagedPropertyType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, ManagedPropertyType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(mapEntriesTypeEClass, MapEntriesType.class, "MapEntriesType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getMapEntriesType_KeyClass(), this.getKeyClassType(), null, "keyClass", null, 0, 1, MapEntriesType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getMapEntriesType_ValueClass(), this.getValueClassType(), null, "valueClass", null, 0, 1, MapEntriesType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getMapEntriesType_MapEntry(), this.getMapEntryType(), null, "mapEntry", null, 0, -1, MapEntriesType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getMapEntriesType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, MapEntriesType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(mapEntryTypeEClass, MapEntryType.class, "MapEntryType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getMapEntryType_Key(), this.getKeyType(), null, "key", null, 1, 1, MapEntryType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getMapEntryType_NullValue(), this.getNullValueType(), null, "nullValue", null, 0, 1, MapEntryType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getMapEntryType_Value(), this.getValueType(), null, "value", null, 0, 1, MapEntryType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getMapEntryType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, MapEntryType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(messageBundleTypeEClass, MessageBundleType.class, "MessageBundleType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getMessageBundleType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, MessageBundleType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getMessageBundleType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, MessageBundleType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(nameTypeEClass, NameType.class, "NameType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getNameType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, NameType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getNameType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, NameType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(navigationCaseTypeEClass, NavigationCaseType.class, "NavigationCaseType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getNavigationCaseType_Description(), this.getDescriptionType(), null, "description", null, 0, -1, NavigationCaseType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getNavigationCaseType_DisplayName(), this.getDisplayNameType(), null, "displayName", null, 0, -1, NavigationCaseType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getNavigationCaseType_Icon(), this.getIconType(), null, "icon", null, 0, -1, NavigationCaseType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getNavigationCaseType_FromAction(), this.getFromActionType(), null, "fromAction", null, 0, 1, NavigationCaseType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getNavigationCaseType_FromOutcome(), this.getFromOutcomeType(), null, "fromOutcome", null, 0, 1, NavigationCaseType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getNavigationCaseType_If(), this.getIfType(), null, "if", null, 0, 1, NavigationCaseType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getNavigationCaseType_ToViewId(), this.getToViewIdType(), null, "toViewId", null, 1, 1, NavigationCaseType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getNavigationCaseType_Redirect(), this.getRedirectType(), null, "redirect", null, 0, 1, NavigationCaseType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getNavigationCaseType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, NavigationCaseType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(navigationHandlerTypeEClass, NavigationHandlerType.class, "NavigationHandlerType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getNavigationHandlerType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, NavigationHandlerType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getNavigationHandlerType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, NavigationHandlerType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(navigationRuleTypeEClass, NavigationRuleType.class, "NavigationRuleType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getNavigationRuleType_Description(), this.getDescriptionType(), null, "description", null, 0, -1, NavigationRuleType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getNavigationRuleType_DisplayName(), this.getDisplayNameType(), null, "displayName", null, 0, -1, NavigationRuleType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getNavigationRuleType_Icon(), this.getIconType(), null, "icon", null, 0, -1, NavigationRuleType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getNavigationRuleType_FromViewId(), this.getFromViewIdType(), null, "fromViewId", null, 0, 1, NavigationRuleType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getNavigationRuleType_NavigationCase(), this.getNavigationCaseType(), null, "navigationCase", null, 0, -1, NavigationRuleType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getNavigationRuleType_NavigationRuleExtension(), this.getNavigationRuleExtensionType(), null, "navigationRuleExtension", null, 0, -1, NavigationRuleType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getNavigationRuleType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, NavigationRuleType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(navigationRuleExtensionTypeEClass, NavigationRuleExtensionType.class, "NavigationRuleExtensionType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-
-		initEClass(nullValueTypeEClass, NullValueType.class, "NullValueType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getNullValueType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, NullValueType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(orderingTypeEClass, OrderingType.class, "OrderingType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getOrderingType_Before(), this.getOrderingOrderingType(), null, "before", null, 0, 1, OrderingType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getOrderingType_After(), this.getOrderingOrderingType(), null, "after", null, 0, 1, OrderingType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(orderingOrderingTypeEClass, OrderingOrderingType.class, "OrderingOrderingType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getOrderingOrderingType_Name(), this.getNameType(), null, "name", null, 0, -1, OrderingOrderingType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getOrderingOrderingType_Others(), this.getOrderingOthersType(), null, "others", null, 0, 1, OrderingOrderingType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(orderingOthersTypeEClass, OrderingOthersType.class, "OrderingOthersType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getOrderingOthersType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, OrderingOthersType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(partialViewContextFactoryTypeEClass, PartialViewContextFactoryType.class, "PartialViewContextFactoryType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getPartialViewContextFactoryType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, PartialViewContextFactoryType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getPartialViewContextFactoryType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, PartialViewContextFactoryType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(phaseListenerTypeEClass, PhaseListenerType.class, "PhaseListenerType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getPhaseListenerType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, PhaseListenerType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getPhaseListenerType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, PhaseListenerType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(propertyClassTypeEClass, PropertyClassType.class, "PropertyClassType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getPropertyClassType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, PropertyClassType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getPropertyClassType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, PropertyClassType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(propertyExtensionTypeEClass, PropertyExtensionType.class, "PropertyExtensionType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-
-		initEClass(propertyNameTypeEClass, PropertyNameType.class, "PropertyNameType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getPropertyNameType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, PropertyNameType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getPropertyNameType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, PropertyNameType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(propertyResolverTypeEClass, PropertyResolverType.class, "PropertyResolverType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getPropertyResolverType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, PropertyResolverType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getPropertyResolverType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, PropertyResolverType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(propertyTypeEClass, PropertyType.class, "PropertyType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getPropertyType_Description(), this.getDescriptionType(), null, "description", null, 0, -1, PropertyType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getPropertyType_DisplayName(), this.getDisplayNameType(), null, "displayName", null, 0, -1, PropertyType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getPropertyType_Icon(), this.getIconType(), null, "icon", null, 0, -1, PropertyType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getPropertyType_PropertyName(), this.getPropertyNameType(), null, "propertyName", null, 1, 1, PropertyType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getPropertyType_PropertyClass(), this.getPropertyClassType(), null, "propertyClass", null, 1, 1, PropertyType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getPropertyType_DefaultValue(), this.getDefaultValueType(), null, "defaultValue", null, 0, 1, PropertyType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getPropertyType_SuggestedValue(), this.getSuggestedValueType(), null, "suggestedValue", null, 0, 1, PropertyType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getPropertyType_PropertyExtension(), this.getPropertyExtensionType(), null, "propertyExtension", null, 0, -1, PropertyType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getPropertyType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, PropertyType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(redirectTypeEClass, RedirectType.class, "RedirectType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getRedirectType_ViewParam(), this.getRedirectViewParamType(), null, "viewParam", null, 0, -1, RedirectType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getRedirectType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, RedirectType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getRedirectType_IncludeViewParams(), theXMLTypePackage.getBoolean(), "includeViewParams", null, 0, 1, RedirectType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(redirectViewParamTypeEClass, RedirectViewParamType.class, "RedirectViewParamType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getRedirectViewParamType_Name(), this.getNameType(), null, "name", null, 1, 1, RedirectViewParamType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getRedirectViewParamType_Value(), this.getValueType(), null, "value", null, 1, 1, RedirectViewParamType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getRedirectViewParamType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, RedirectViewParamType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(referencedBeanClassTypeEClass, ReferencedBeanClassType.class, "ReferencedBeanClassType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getReferencedBeanClassType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, ReferencedBeanClassType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getReferencedBeanClassType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, ReferencedBeanClassType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(referencedBeanNameTypeEClass, ReferencedBeanNameType.class, "ReferencedBeanNameType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getReferencedBeanNameType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, ReferencedBeanNameType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getReferencedBeanNameType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, ReferencedBeanNameType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(referencedBeanTypeEClass, ReferencedBeanType.class, "ReferencedBeanType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getReferencedBeanType_Description(), this.getDescriptionType(), null, "description", null, 0, -1, ReferencedBeanType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getReferencedBeanType_DisplayName(), this.getDisplayNameType(), null, "displayName", null, 0, -1, ReferencedBeanType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getReferencedBeanType_Icon(), this.getIconType(), null, "icon", null, 0, -1, ReferencedBeanType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getReferencedBeanType_ReferencedBeanName(), this.getReferencedBeanNameType(), null, "referencedBeanName", null, 1, 1, ReferencedBeanType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getReferencedBeanType_ReferencedBeanClass(), this.getReferencedBeanClassType(), null, "referencedBeanClass", null, 1, 1, ReferencedBeanType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getReferencedBeanType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, ReferencedBeanType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(rendererClassTypeEClass, RendererClassType.class, "RendererClassType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getRendererClassType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, RendererClassType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getRendererClassType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, RendererClassType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(rendererExtensionTypeEClass, RendererExtensionType.class, "RendererExtensionType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-
-		initEClass(rendererTypeEClass, RendererType.class, "RendererType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getRendererType_Description(), this.getDescriptionType(), null, "description", null, 0, -1, RendererType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getRendererType_DisplayName(), this.getDisplayNameType(), null, "displayName", null, 0, -1, RendererType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getRendererType_Icon(), this.getIconType(), null, "icon", null, 0, -1, RendererType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getRendererType_ComponentFamily(), this.getComponentFamilyType(), null, "componentFamily", null, 1, 1, RendererType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getRendererType_RendererType(), this.getRendererTypeType(), null, "rendererType", null, 1, 1, RendererType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getRendererType_RendererClass(), this.getRendererClassType(), null, "rendererClass", null, 1, 1, RendererType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getRendererType_Facet(), this.getFacetType(), null, "facet", null, 0, -1, RendererType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getRendererType_Attribute(), this.getAttributeType(), null, "attribute", null, 0, -1, RendererType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getRendererType_RendererExtension(), this.getRendererExtensionType(), null, "rendererExtension", null, 0, -1, RendererType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getRendererType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, RendererType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(rendererTypeTypeEClass, RendererTypeType.class, "RendererTypeType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getRendererTypeType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, RendererTypeType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getRendererTypeType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, RendererTypeType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(renderKitClassTypeEClass, RenderKitClassType.class, "RenderKitClassType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getRenderKitClassType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, RenderKitClassType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getRenderKitClassType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, RenderKitClassType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(renderKitFactoryTypeEClass, RenderKitFactoryType.class, "RenderKitFactoryType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getRenderKitFactoryType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, RenderKitFactoryType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getRenderKitFactoryType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, RenderKitFactoryType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(renderKitIdTypeEClass, RenderKitIdType.class, "RenderKitIdType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getRenderKitIdType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, RenderKitIdType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getRenderKitIdType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, RenderKitIdType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(renderKitTypeEClass, RenderKitType.class, "RenderKitType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getRenderKitType_Description(), this.getDescriptionType(), null, "description", null, 0, -1, RenderKitType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getRenderKitType_DisplayName(), this.getDisplayNameType(), null, "displayName", null, 0, -1, RenderKitType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getRenderKitType_Icon(), this.getIconType(), null, "icon", null, 0, -1, RenderKitType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getRenderKitType_RenderKitId(), this.getRenderKitIdType(), null, "renderKitId", null, 0, 1, RenderKitType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getRenderKitType_RenderKitClass(), this.getRenderKitClassType(), null, "renderKitClass", null, 0, 1, RenderKitType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getRenderKitType_Renderer(), this.getRendererType(), null, "renderer", null, 0, -1, RenderKitType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getRenderKitType_ClientBehaviorRenderer(), this.getClientBehaviorRendererType(), null, "clientBehaviorRenderer", null, 0, -1, RenderKitType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getRenderKitType_RenderKitExtension(), this.getRenderKitExtensionType(), null, "renderKitExtension", null, 0, -1, RenderKitType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getRenderKitType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, RenderKitType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(renderKitExtensionTypeEClass, RenderKitExtensionType.class, "RenderKitExtensionType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-
-		initEClass(resourceHandlerTypeEClass, ResourceHandlerType.class, "ResourceHandlerType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getResourceHandlerType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, ResourceHandlerType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getResourceHandlerType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, ResourceHandlerType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(smallIconTypeEClass, SmallIconType.class, "SmallIconType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getSmallIconType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, SmallIconType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getSmallIconType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, SmallIconType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(sourceClassTypeEClass, SourceClassType.class, "SourceClassType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getSourceClassType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, SourceClassType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getSourceClassType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, SourceClassType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(stateManagerTypeEClass, StateManagerType.class, "StateManagerType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getStateManagerType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, StateManagerType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getStateManagerType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, StateManagerType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(suggestedValueTypeEClass, SuggestedValueType.class, "SuggestedValueType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getSuggestedValueType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, SuggestedValueType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getSuggestedValueType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, SuggestedValueType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(supportedLocaleTypeEClass, SupportedLocaleType.class, "SupportedLocaleType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getSupportedLocaleType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, SupportedLocaleType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getSupportedLocaleType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, SupportedLocaleType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(systemEventClassTypeEClass, SystemEventClassType.class, "SystemEventClassType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getSystemEventClassType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, SystemEventClassType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getSystemEventClassType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, SystemEventClassType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(systemEventListenerClassTypeEClass, SystemEventListenerClassType.class, "SystemEventListenerClassType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getSystemEventListenerClassType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, SystemEventListenerClassType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getSystemEventListenerClassType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, SystemEventListenerClassType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(systemEventListenerTypeEClass, SystemEventListenerType.class, "SystemEventListenerType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getSystemEventListenerType_SystemEventListenerClass(), this.getSystemEventListenerClassType(), null, "systemEventListenerClass", null, 1, 1, SystemEventListenerType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getSystemEventListenerType_SystemEventClass(), this.getSystemEventClassType(), null, "systemEventClass", null, 1, 1, SystemEventListenerType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getSystemEventListenerType_SourceClass(), this.getSourceClassType(), null, "sourceClass", null, 0, 1, SystemEventListenerType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getSystemEventListenerType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, SystemEventListenerType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(tagHandlerDelegateFactoryTypeEClass, TagHandlerDelegateFactoryType.class, "TagHandlerDelegateFactoryType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getTagHandlerDelegateFactoryType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, TagHandlerDelegateFactoryType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getTagHandlerDelegateFactoryType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, TagHandlerDelegateFactoryType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(toViewIdTypeEClass, ToViewIdType.class, "ToViewIdType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getToViewIdType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, ToViewIdType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getToViewIdType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, ToViewIdType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(validatorClassTypeEClass, ValidatorClassType.class, "ValidatorClassType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getValidatorClassType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, ValidatorClassType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getValidatorClassType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, ValidatorClassType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(validatorIdTypeEClass, ValidatorIdType.class, "ValidatorIdType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getValidatorIdType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, ValidatorIdType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getValidatorIdType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, ValidatorIdType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(validatorTypeEClass, ValidatorType.class, "ValidatorType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getValidatorType_Description(), this.getDescriptionType(), null, "description", null, 0, -1, ValidatorType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getValidatorType_DisplayName(), this.getDisplayNameType(), null, "displayName", null, 0, -1, ValidatorType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getValidatorType_Icon(), this.getIconType(), null, "icon", null, 0, -1, ValidatorType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getValidatorType_ValidatorId(), this.getValidatorIdType(), null, "validatorId", null, 1, 1, ValidatorType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getValidatorType_ValidatorClass(), this.getValidatorClassType(), null, "validatorClass", null, 1, 1, ValidatorType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getValidatorType_Attribute(), this.getAttributeType(), null, "attribute", null, 0, -1, ValidatorType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getValidatorType_Property(), this.getPropertyType(), null, "property", null, 0, -1, ValidatorType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getValidatorType_ValidatorExtension(), this.getValidatorExtensionType(), null, "validatorExtension", null, 0, -1, ValidatorType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getValidatorType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, ValidatorType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(validatorExtensionTypeEClass, ValidatorExtensionType.class, "ValidatorExtensionType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-
-		initEClass(valueClassTypeEClass, ValueClassType.class, "ValueClassType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getValueClassType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, ValueClassType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getValueClassType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, ValueClassType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(valueTypeEClass, ValueType.class, "ValueType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getValueType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, ValueType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getValueType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, ValueType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(variableResolverTypeEClass, VariableResolverType.class, "VariableResolverType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getVariableResolverType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, VariableResolverType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getVariableResolverType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, VariableResolverType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(viewHandlerTypeEClass, ViewHandlerType.class, "ViewHandlerType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getViewHandlerType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, ViewHandlerType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getViewHandlerType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, ViewHandlerType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(resourceBundleTypeEClass, ResourceBundleType.class, "ResourceBundleType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getResourceBundleType_Description(), this.getDescriptionType(), null, "description", null, 0, -1, ResourceBundleType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getResourceBundleType_DisplayName(), this.getDisplayNameType(), null, "displayName", null, 0, -1, ResourceBundleType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getResourceBundleType_Icon(), this.getIconType(), null, "icon", null, 0, -1, ResourceBundleType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getResourceBundleType_BaseName(), this.getBaseNameType(), null, "baseName", null, 0, 1, ResourceBundleType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getResourceBundleType_Var(), this.getVarType(), null, "var", null, 0, 1, ResourceBundleType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getResourceBundleType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, ResourceBundleType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(baseNameTypeEClass, BaseNameType.class, "BaseNameType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getBaseNameType_TextContent(), ecorePackage.getEString(), "textContent", null, 0, 1, BaseNameType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getBaseNameType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, BaseNameType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(varTypeEClass, VarType.class, "VarType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getVarType_TextContent(), ecorePackage.getEString(), "textContent", null, 0, 1, VarType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getVarType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, VarType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(viewDeclarationLanguageFactoryTypeEClass, ViewDeclarationLanguageFactoryType.class, "ViewDeclarationLanguageFactoryType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getViewDeclarationLanguageFactoryType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, ViewDeclarationLanguageFactoryType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getViewDeclarationLanguageFactoryType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, ViewDeclarationLanguageFactoryType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(visitContextFactoryTypeEClass, VisitContextFactoryType.class, "VisitContextFactoryType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getVisitContextFactoryType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, VisitContextFactoryType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getVisitContextFactoryType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, VisitContextFactoryType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		// Create resource
-		createResource(eNS_URI);
-
-		// Create annotations
-		// http:///org/eclipse/emf/ecore/util/ExtendedMetaData
-		createExtendedMetaDataAnnotations();
-	}
-
-    /**
-	 * Initializes the annotations for <b>http:///org/eclipse/emf/ecore/util/ExtendedMetaData</b>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void createExtendedMetaDataAnnotations() {
-		String source = "http:///org/eclipse/emf/ecore/util/ExtendedMetaData";			
-		addAnnotation
-		  (this, 
-		   source, 
-		   new String[] {
-			 "qualified", "false"
-		   });		
-		addAnnotation
-		  (absoluteOrderingTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "absolute-ordering_._type",
-			 "kind", "elementOnly"
-		   });		
-		addAnnotation
-		  (getAbsoluteOrderingType_Name(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "name",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getAbsoluteOrderingType_Others(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "others",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (actionListenerTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "action-listener_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getActionListenerType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getActionListenerType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (applicationFactoryTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "application-factory_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getApplicationFactoryType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getApplicationFactoryType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (applicationTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "application_._type",
-			 "kind", "elementOnly"
-		   });		
-		addAnnotation
-		  (getApplicationType_ActionListener(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "action-listener",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getApplicationType_DefaultRenderKitId(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "default-render-kit-id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getApplicationType_MessageBundle(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "message-bundle",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getApplicationType_NavigationHandler(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "navigation-handler",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getApplicationType_ViewHandler(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "view-handler",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getApplicationType_StateManager(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "state-manager",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getApplicationType_ELResolver(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "el-resolver",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getApplicationType_PropertyResolver(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "property-resolver",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getApplicationType_VariableResolver(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "variable-resolver",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getApplicationType_ResourceHandler(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "resource-handler",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getApplicationType_SystemEventListener(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "system-event-listener",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getApplicationType_LocaleConfig(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "locale-config",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getApplicationType_ResourceBundle(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "resource-bundle",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getApplicationType_ApplicationExtension(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "application-extension",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getApplicationType_DefaultValidators(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "default-validators",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getApplicationType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (applicationExtensionTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "application-extension_._type"
-		   });		
-		addAnnotation
-		  (attributeClassTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "attribute-class_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getAttributeClassType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getAttributeClassType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (attributeExtensionTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "attribute-extension_._type"
-		   });		
-		addAnnotation
-		  (attributeNameTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "attribute-name_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getAttributeNameType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getAttributeNameType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (attributeTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "attribute_._type",
-			 "kind", "elementOnly"
-		   });		
-		addAnnotation
-		  (getAttributeType_Description(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "description",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getAttributeType_DisplayName(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "display-name",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getAttributeType_Icon(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "icon",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getAttributeType_AttributeName(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "attribute-name",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getAttributeType_AttributeClass(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "attribute-class",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getAttributeType_DefaultValue(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "default-value",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getAttributeType_SuggestedValue(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "suggested-value",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getAttributeType_AttributeExtension(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "attribute-extension",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getAttributeType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (behaviorClassTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "behavior-class_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getBehaviorClassType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getBehaviorClassType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (behaviorIdTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "behavior-id_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getBehaviorIdType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getBehaviorIdType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (behaviorTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "behavior_._type",
-			 "kind", "elementOnly"
-		   });		
-		addAnnotation
-		  (getBehaviorType_Description(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "description",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getBehaviorType_DisplayName(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "display-name",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getBehaviorType_Icon(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "icon",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getBehaviorType_BehaviorId(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "behavior-id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getBehaviorType_BehaviorClass(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "behavior-class",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getBehaviorType_Attribute(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "attribute",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getBehaviorType_Property(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "property",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getBehaviorType_BehaviorExtension(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "behavior-extension",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (behaviorExtensionTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "behavior-extension_._type"
-		   });		
-		addAnnotation
-		  (clientBehaviorRendererClassTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "client-behavior-renderer-class_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getClientBehaviorRendererClassType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getClientBehaviorRendererClassType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (clientBehaviorRendererTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "client-behavior-renderer_._type",
-			 "kind", "elementOnly"
-		   });		
-		addAnnotation
-		  (getClientBehaviorRendererType_ClientBehaviorRendererType(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "client-behavior-renderer-type",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getClientBehaviorRendererType_ClientBehaviorRendererClass(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "client-behavior-renderer-class",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (clientBehaviorRendererTypeTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "client-behavior-renderer-type_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getClientBehaviorRendererTypeType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getClientBehaviorRendererTypeType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (componentClassTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "component-class_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getComponentClassType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getComponentClassType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (componentExtensionTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "component-extension_._type"
-		   });		
-		addAnnotation
-		  (componentFamilyTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "component-family_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getComponentFamilyType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getComponentFamilyType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (componentTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "component_._type",
-			 "kind", "elementOnly"
-		   });		
-		addAnnotation
-		  (getComponentType_Description(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "description",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getComponentType_DisplayName(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "display-name",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getComponentType_Icon(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "icon",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getComponentType_ComponentType(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "component-type",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getComponentType_ComponentClass(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "component-class",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getComponentType_Facet(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "facet",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getComponentType_Attribute(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "attribute",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getComponentType_Property(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "property",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getComponentType_ComponentExtension(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "component-extension",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getComponentType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (componentTypeTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "component-type_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getComponentTypeType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getComponentTypeType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (converterClassTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "converter-class_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getConverterClassType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getConverterClassType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (converterForClassTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "converter-for-class_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getConverterForClassType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getConverterForClassType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (converterIdTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "converter-id_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getConverterIdType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getConverterIdType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (converterTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "converter_._type",
-			 "kind", "elementOnly"
-		   });		
-		addAnnotation
-		  (getConverterType_Description(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "description",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getConverterType_DisplayName(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "display-name",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getConverterType_Icon(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "icon",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getConverterType_ConverterId(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "converter-id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getConverterType_ConverterForClass(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "converter-for-class",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getConverterType_ConverterClass(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "converter-class",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getConverterType_Attribute(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "attribute",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getConverterType_Property(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "property",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getConverterType_ConverterExtension(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "converter-extension",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getConverterType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (converterExtensionTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "converter-extension_._type"
-		   });		
-		addAnnotation
-		  (defaultLocaleTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "default-locale_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getDefaultLocaleType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getDefaultLocaleType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (defaultRenderKitIdTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "default-render-kit-id_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getDefaultRenderKitIdType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getDefaultRenderKitIdType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (defaultValidatorsTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "default-validators_._type",
-			 "kind", "elementOnly"
-		   });		
-		addAnnotation
-		  (getDefaultValidatorsType_ValidatorId(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "validator-id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getDefaultValidatorsType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (defaultValueTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "default-value_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getDefaultValueType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getDefaultValueType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (descriptionTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "description_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getDescriptionType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getDescriptionType_Lang(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "lang",
-			 "namespace", "http://www.w3.org/XML/1998/namespace"
-		   });		
-		addAnnotation
-		  (getDescriptionType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (displayNameTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "display-name_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getDisplayNameType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getDisplayNameType_Lang(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "lang",
-			 "namespace", "http://www.w3.org/XML/1998/namespace"
-		   });		
-		addAnnotation
-		  (getDisplayNameType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (documentRootEClass, 
-		   source, 
-		   new String[] {
-			 "name", "",
-			 "kind", "mixed"
-		   });		
-		addAnnotation
-		  (getDocumentRoot_Mixed(), 
-		   source, 
-		   new String[] {
-			 "kind", "elementWildcard",
-			 "name", ":mixed"
-		   });		
-		addAnnotation
-		  (getDocumentRoot_XMLNSPrefixMap(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "xmlns:prefix"
-		   });		
-		addAnnotation
-		  (getDocumentRoot_XSISchemaLocation(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "xsi:schemaLocation"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_AbsoluteOrdering(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "absolute-ordering",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_ActionListener(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "action-listener",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_Application(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "application",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_ApplicationFactory(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "application-factory",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_Attribute(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "attribute",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_AttributeClass(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "attribute-class",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_AttributeExtension(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "attribute-extension",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_AttributeName(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "attribute-name",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_Behavior(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "behavior",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_BehaviorClass(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "behavior-class",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_BehaviorId(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "behavior-id",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_BehaviorExtension(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "behavior-extension",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_Component(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "component",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_ComponentClass(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "component-class",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_ComponentExtension(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "component-extension",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_ComponentFamily(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "component-family",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_ComponentType(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "component-type",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_Converter(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "converter",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_ConverterClass(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "converter-class",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_ConverterForClass(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "converter-for-class",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_ConverterId(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "converter-id",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_DefaultLocale(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "default-locale",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_DefaultRenderKitId(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "default-render-kit-id",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_DefaultValidators(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "default-validators",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_DefaultValue(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "default-value",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_Description(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "description",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_DisplayName(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "display-name",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_ExceptionHandlerFactory(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "exception-handler-factory",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_ExternalContextFactory(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "external-context-factory",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_FacesConfig(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "faces-config",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_FacesContextFactory(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "faces-context-factory",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_Facet(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "facet",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_FacetExtension(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "facet-extension",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_FacetName(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "facet-name",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_Factory(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "factory",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_FromAction(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "from-action",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_FromOutcome(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "from-outcome",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_FromViewId(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "from-view-id",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_Icon(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "icon",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_If(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "if",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_Key(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "key",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_KeyClass(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "key-class",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_LargeIcon(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "large-icon",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_Lifecycle(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "lifecycle",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_LifecycleFactory(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "lifecycle-factory",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_ListEntries(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "list-entries",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_LocaleConfig(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "locale-config",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_ManagedBean(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "managed-bean",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_ManagedBeanClass(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "managed-bean-class",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_ManagedBeanName(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "managed-bean-name",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_ManagedBeanScope(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "managed-bean-scope",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_ManagedProperty(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "managed-property",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_MapEntries(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "map-entries",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_MapEntry(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "map-entry",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_MessageBundle(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "message-bundle",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_Name(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "name",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_NavigationCase(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "navigation-case",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_NavigationHandler(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "navigation-handler",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_NavigationRule(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "navigation-rule",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_NullValue(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "null-value",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_Ordering(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "ordering",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_OrderingOrdering(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "ordering-ordering",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_Others(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "others",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_PartialViewContextFactory(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "partial-view-context-factory",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_PhaseListener(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "phase-listener",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_Property(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "property",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_PropertyClass(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "property-class",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_PropertyExtension(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "property-extension",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_PropertyName(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "property-name",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_PropertyResolver(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "property-resolver",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_Redirect(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "redirect",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_RedirectViewParam(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "view-param",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_ReferencedBean(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "referenced-bean",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_ReferencedBeanClass(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "referenced-bean-class",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_ReferencedBeanName(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "referenced-bean-name",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_Renderer(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "renderer",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_RendererClass(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "renderer-class",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_RendererExtension(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "renderer-extension",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_RendererType(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "renderer-type",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_RenderKit(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "render-kit",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_RenderKitClass(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "render-kit-class",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_RenderKitFactory(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "render-kit-factory",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_RenderKitId(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "render-kit-id",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_ResourceHandler(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "resource-handler",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_SmallIcon(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "small-icon",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_SourceClass(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "source-class",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_StateManager(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "state-manager",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_SuggestedValue(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "suggested-value",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_SupportedLocale(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "supported-locale",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_SystemEventClass(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "system-event-class",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_SystemEventListener(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "system-event-listener",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_SystemEventListenerClass(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "system-event-listener-class",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_TagHandlerDelegateFactory(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "tag-handler-delegate-factory",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_ToViewId(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "to-view-id",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_Validator(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "validator",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_ValidatorClass(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "validator-class",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_ValidatorId(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "validator-id",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_Value(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "value",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_ValueClass(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "value-class",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_VariableResolver(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "variable-resolver",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_ViewDeclarationLanguageFactory(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "view-declaration-language-factory",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_ViewHandler(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "view-handler",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_VisitContextFactory(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "visit-context-factory",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (elResolverTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "el-resolver_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getELResolverType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getELResolverType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (exceptionHandlerFactoryTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "exception-handler-factory_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getExceptionHandlerFactoryType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getExceptionHandlerFactoryType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getExtensionType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getExtensionType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (externalContextFactoryTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "external-context-factory_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getExternalContextFactoryType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getExternalContextFactoryType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (facesConfigTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "faces-config_._type",
-			 "kind", "elementOnly"
-		   });		
-		addAnnotation
-		  (getFacesConfigType_Application(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "application",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getFacesConfigType_Ordering(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "ordering",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getFacesConfigType_AbsoluteOrdering(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "absolute-ordering",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getFacesConfigType_Factory(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "factory",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getFacesConfigType_Component(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "component",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getFacesConfigType_Converter(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "converter",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getFacesConfigType_ManagedBean(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "managed-bean",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getFacesConfigType_Name(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "name",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getFacesConfigType_NavigationRule(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "navigation-rule",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getFacesConfigType_ReferencedBean(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "referenced-bean",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getFacesConfigType_RenderKit(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "render-kit",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getFacesConfigType_Lifecycle(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "lifecycle",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getFacesConfigType_Validator(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "validator",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getFacesConfigType_Behavior(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "behavior",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getFacesConfigType_FacesConfigExtension(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "faces-config-extension",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getFacesConfigType_Xmlns(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "xmlns",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getFacesConfigType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getFacesConfigType_MetadataComplete(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "metadata-complete",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (facesConfigExtensionTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "faces-config-extension_._type"
-		   });		
-		addAnnotation
-		  (facesContextFactoryTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "faces-context-factory_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getFacesContextFactoryType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getFacesContextFactoryType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (facetExtensionTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "facet-extension_._type"
-		   });		
-		addAnnotation
-		  (facetNameTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "facet-name_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getFacetNameType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getFacetNameType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (facetTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "facet_._type",
-			 "kind", "elementOnly"
-		   });		
-		addAnnotation
-		  (getFacetType_Description(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "description",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getFacetType_DisplayName(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "display-name",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getFacetType_Icon(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "icon",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getFacetType_FacetName(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "facet-name",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getFacetType_FacetExtension(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "facet-extension",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getFacetType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (factoryTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "factory_._type",
-			 "kind", "elementOnly"
-		   });		
-		addAnnotation
-		  (getFactoryType_ApplicationFactory(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "application-factory",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getFactoryType_ExceptionHandlerFactory(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "exception-handler-factory",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getFactoryType_ExternalContextFactory(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "external-context-factory",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getFactoryType_FacesContextFactory(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "faces-context-factory",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getFactoryType_PartialViewContextFactory(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "partial-view-context-factory",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getFactoryType_LifecycleFactory(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "lifecycle-factory",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getFactoryType_ViewDeclarationLanguageFactory(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "view-declaration-language-factory",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getFactoryType_TagHandlerDelegateFactory(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "tag-handler-delegate-factory",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getFactoryType_RenderKitFactory(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "render-kit-factory",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getFactoryType_VisitContextFactory(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "visit-context-factory",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getFactoryType_FactoryExtension(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "factory-type",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getFactoryType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (factoryExtensionTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "factory-extension_._type"
-		   });		
-		addAnnotation
-		  (fromActionTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "from-action_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getFromActionType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getFromActionType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (fromOutcomeTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "from-outcome_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getFromOutcomeType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getFromOutcomeType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (fromViewIdTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "from-view-id_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getFromViewIdType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getFromViewIdType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (iconTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "icon_._type",
-			 "kind", "empty"
-		   });		
-		addAnnotation
-		  (getIconType_SmallIcon(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "small-icon",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getIconType_LargeIcon(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "large-icon",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getIconType_Lang(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "lang",
-			 "namespace", "http://www.w3.org/XML/1998/namespace"
-		   });		
-		addAnnotation
-		  (getIconType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (ifTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "if_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getIfType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getIfType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (keyClassTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "key-class_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getKeyClassType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getKeyClassType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (keyTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "key_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getKeyType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getKeyType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (largeIconTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "large-icon_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getLargeIconType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getLargeIconType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (lifecycleFactoryTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "lifecycle-factory_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getLifecycleFactoryType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getLifecycleFactoryType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (lifecycleTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "lifecycle_._type",
-			 "kind", "elementOnly"
-		   });		
-		addAnnotation
-		  (getLifecycleType_PhaseListener(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "phase-listener",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getLifecycleType_LifecycleExtension(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "lifecycle-extension",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getLifecycleType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (lifecycleExtensionTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "lifecycle-extension_._type"
-		   });		
-		addAnnotation
-		  (listEntriesTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "list-entries_._type",
-			 "kind", "elementOnly"
-		   });		
-		addAnnotation
-		  (getListEntriesType_ValueClass(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "value-class",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getListEntriesType_NullValue(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "null-value",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getListEntriesType_Value(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "value",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getListEntriesType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (localeConfigTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "locale-config_._type",
-			 "kind", "elementOnly"
-		   });		
-		addAnnotation
-		  (getLocaleConfigType_DefaultLocale(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "default-locale",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getLocaleConfigType_SupportedLocale(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "supported-locale",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getLocaleConfigType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (managedBeanClassTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "managed-bean-class_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getManagedBeanClassType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getManagedBeanClassType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (managedBeanNameTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "managed-bean-name_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getManagedBeanNameType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getManagedBeanNameType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (managedBeanScopeTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "managed-bean-scope_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getManagedBeanScopeType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getManagedBeanScopeType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (managedBeanTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "managed-bean_._type",
-			 "kind", "elementOnly"
-		   });		
-		addAnnotation
-		  (getManagedBeanType_Description(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "description",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getManagedBeanType_DisplayName(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "display-name",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getManagedBeanType_Icon(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "icon",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getManagedBeanType_ManagedBeanName(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "managed-bean-name",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getManagedBeanType_ManagedBeanClass(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "managed-bean-class",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getManagedBeanType_ManagedBeanScope(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "managed-bean-scope",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getManagedBeanType_ManagedProperty(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "managed-property",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getManagedBeanType_MapEntries(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "map-entries",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getManagedBeanType_ListEntries(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "list-entries",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getManagedBeanType_ManagedBeanExtension(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "managed-bean-extension",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getManagedBeanType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getManagedBeanType_Eager(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "eager",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (managedBeanExtensionTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "managed-bean-extension_._type"
-		   });		
-		addAnnotation
-		  (managedPropertyTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "managed-property_._type",
-			 "kind", "elementOnly"
-		   });		
-		addAnnotation
-		  (getManagedPropertyType_Description(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "description",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getManagedPropertyType_DisplayName(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "display-name",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getManagedPropertyType_Icon(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "icon",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getManagedPropertyType_PropertyName(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "property-name",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getManagedPropertyType_PropertyClass(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "property-class",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getManagedPropertyType_MapEntries(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "map-entries",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getManagedPropertyType_NullValue(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "null-value",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getManagedPropertyType_Value(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "value",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getManagedPropertyType_ListEntries(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "list-entries",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getManagedPropertyType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (mapEntriesTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "map-entries_._type",
-			 "kind", "elementOnly"
-		   });		
-		addAnnotation
-		  (getMapEntriesType_KeyClass(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "key-class",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getMapEntriesType_ValueClass(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "value-class",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getMapEntriesType_MapEntry(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "map-entry",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getMapEntriesType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (mapEntryTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "map-entry_._type",
-			 "kind", "empty"
-		   });		
-		addAnnotation
-		  (getMapEntryType_Key(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "key",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getMapEntryType_NullValue(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "null-value",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getMapEntryType_Value(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "value",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getMapEntryType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (messageBundleTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "message-bundle_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getMessageBundleType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getMessageBundleType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (nameTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "name_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getNameType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getNameType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (navigationCaseTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "navigation-case_._type",
-			 "kind", "elementOnly"
-		   });		
-		addAnnotation
-		  (getNavigationCaseType_Description(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "description",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getNavigationCaseType_DisplayName(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "display-name",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getNavigationCaseType_Icon(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "icon",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getNavigationCaseType_FromAction(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "from-action",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getNavigationCaseType_FromOutcome(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "from-outcome",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getNavigationCaseType_If(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "if",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getNavigationCaseType_ToViewId(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "to-view-id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getNavigationCaseType_Redirect(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "redirect",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getNavigationCaseType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (navigationHandlerTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "navigation-handler_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getNavigationHandlerType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getNavigationHandlerType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (navigationRuleTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "navigation-rule_._type",
-			 "kind", "elementOnly"
-		   });		
-		addAnnotation
-		  (getNavigationRuleType_Description(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "description",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getNavigationRuleType_DisplayName(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "display-name",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getNavigationRuleType_Icon(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "icon",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getNavigationRuleType_FromViewId(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "from-view-id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getNavigationRuleType_NavigationCase(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "navigation-case",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getNavigationRuleType_NavigationRuleExtension(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "navigation-rule-extension",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getNavigationRuleType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (navigationRuleExtensionTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "navigation-rule-extension_._type"
-		   });		
-		addAnnotation
-		  (nullValueTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "null-value_._type",
-			 "kind", "empty"
-		   });		
-		addAnnotation
-		  (getNullValueType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (orderingTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "ordering_._type",
-			 "kind", "elementOnly"
-		   });		
-		addAnnotation
-		  (getOrderingType_Before(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "before",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getOrderingType_After(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "after",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (orderingOrderingTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "ordering-ordering_._type",
-			 "kind", "elementOnly"
-		   });		
-		addAnnotation
-		  (getOrderingOrderingType_Name(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "name",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getOrderingOrderingType_Others(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "others",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (orderingOthersTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "others_._type",
-			 "kind", "elementOnly"
-		   });		
-		addAnnotation
-		  (getOrderingOthersType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (partialViewContextFactoryTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "partial-view-context-factory_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getPartialViewContextFactoryType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getPartialViewContextFactoryType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (phaseListenerTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "phase-listener_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getPhaseListenerType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getPhaseListenerType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (propertyClassTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "property-class_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getPropertyClassType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getPropertyClassType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (propertyExtensionTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "property-extension_._type"
-		   });		
-		addAnnotation
-		  (propertyNameTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "property-name_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getPropertyNameType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getPropertyNameType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (propertyResolverTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "property-resolver_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getPropertyResolverType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getPropertyResolverType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (propertyTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "property_._type",
-			 "kind", "elementOnly"
-		   });		
-		addAnnotation
-		  (getPropertyType_Description(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "description",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getPropertyType_DisplayName(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "display-name",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getPropertyType_Icon(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "icon",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getPropertyType_PropertyName(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "property-name",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getPropertyType_PropertyClass(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "property-class",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getPropertyType_DefaultValue(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "default-value",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getPropertyType_SuggestedValue(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "suggested-value",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getPropertyType_PropertyExtension(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "property-extension",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getPropertyType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (redirectTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "redirect_._type",
-			 "kind", "empty"
-		   });		
-		addAnnotation
-		  (getRedirectType_ViewParam(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "view-param",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getRedirectType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getRedirectType_IncludeViewParams(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "include-view-params",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (redirectViewParamTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "redirect-viewParam_._type",
-			 "kind", "empty"
-		   });		
-		addAnnotation
-		  (getRedirectViewParamType_Name(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "name",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getRedirectViewParamType_Value(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "value",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getRedirectViewParamType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (referencedBeanClassTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "referenced-bean-class_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getReferencedBeanClassType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getReferencedBeanClassType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (referencedBeanNameTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "referenced-bean-name_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getReferencedBeanNameType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getReferencedBeanNameType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (referencedBeanTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "referenced-bean_._type",
-			 "kind", "elementOnly"
-		   });		
-		addAnnotation
-		  (getReferencedBeanType_Description(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "description",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getReferencedBeanType_DisplayName(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "display-name",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getReferencedBeanType_Icon(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "icon",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getReferencedBeanType_ReferencedBeanName(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "referenced-bean-name",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getReferencedBeanType_ReferencedBeanClass(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "referenced-bean-class",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getReferencedBeanType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (rendererClassTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "renderer-class_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getRendererClassType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getRendererClassType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (rendererExtensionTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "renderer-extension_._type"
-		   });		
-		addAnnotation
-		  (rendererTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "renderer_._type",
-			 "kind", "elementOnly"
-		   });		
-		addAnnotation
-		  (getRendererType_Description(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "description",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getRendererType_DisplayName(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "display-name",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getRendererType_Icon(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "icon",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getRendererType_ComponentFamily(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "component-family",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getRendererType_RendererType(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "renderer-type",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getRendererType_RendererClass(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "renderer-class",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getRendererType_Facet(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "facet",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getRendererType_Attribute(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "attribute",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getRendererType_RendererExtension(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "renderer-extension",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getRendererType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (rendererTypeTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "renderer-type_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getRendererTypeType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getRendererTypeType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (renderKitClassTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "render-kit-class_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getRenderKitClassType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getRenderKitClassType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (renderKitFactoryTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "render-kit-factory_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getRenderKitFactoryType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getRenderKitFactoryType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (renderKitIdTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "render-kit-id_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getRenderKitIdType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getRenderKitIdType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (renderKitTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "render-kit_._type",
-			 "kind", "elementOnly"
-		   });		
-		addAnnotation
-		  (getRenderKitType_Description(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "description",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getRenderKitType_DisplayName(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "display-name",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getRenderKitType_Icon(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "icon",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getRenderKitType_RenderKitId(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "render-kit-id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getRenderKitType_RenderKitClass(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "render-kit-class",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getRenderKitType_Renderer(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "renderer",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getRenderKitType_ClientBehaviorRenderer(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "client-behavior-renderer",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getRenderKitType_RenderKitExtension(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "render-kit-extension",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getRenderKitType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (renderKitExtensionTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "render-kit-extension_._type"
-		   });		
-		addAnnotation
-		  (resourceHandlerTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "resource-handler_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getResourceHandlerType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getResourceHandlerType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (smallIconTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "small-icon_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getSmallIconType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getSmallIconType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (sourceClassTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "source-class_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getSourceClassType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getSourceClassType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (stateManagerTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "state-manager_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getStateManagerType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getStateManagerType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (suggestedValueTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "suggested-value_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getSuggestedValueType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getSuggestedValueType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (supportedLocaleTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "supported-locale_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getSupportedLocaleType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getSupportedLocaleType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (systemEventClassTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "system-event-class_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getSystemEventClassType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getSystemEventClassType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (systemEventListenerClassTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "system-event-listener-class_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getSystemEventListenerClassType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getSystemEventListenerClassType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (systemEventListenerTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "system-event-listener_._type",
-			 "kind", "elementOnly"
-		   });		
-		addAnnotation
-		  (getSystemEventListenerType_SystemEventListenerClass(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "system-event-listener-class",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getSystemEventListenerType_SystemEventClass(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "system-event-class",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getSystemEventListenerType_SourceClass(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "source-class",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getSystemEventListenerType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (tagHandlerDelegateFactoryTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "tag-handler-delegate-factory_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getTagHandlerDelegateFactoryType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getTagHandlerDelegateFactoryType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (toViewIdTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "to-view-id_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getToViewIdType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getToViewIdType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (validatorClassTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "validator-class_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getValidatorClassType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getValidatorClassType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (validatorIdTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "validator-id_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getValidatorIdType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getValidatorIdType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (validatorTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "validator_._type",
-			 "kind", "elementOnly"
-		   });		
-		addAnnotation
-		  (getValidatorType_Description(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "description",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getValidatorType_DisplayName(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "display-name",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getValidatorType_Icon(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "icon",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getValidatorType_ValidatorId(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "validator-id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getValidatorType_ValidatorClass(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "validator-class",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getValidatorType_Attribute(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "attribute",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getValidatorType_Property(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "property",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getValidatorType_ValidatorExtension(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "validator-extension",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getValidatorType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (validatorExtensionTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "validator-extension_._type"
-		   });		
-		addAnnotation
-		  (valueClassTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "value-class_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getValueClassType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getValueClassType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (valueTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "value_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getValueType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getValueType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (variableResolverTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "variable-resolver_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getVariableResolverType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getVariableResolverType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (viewHandlerTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "view-handler_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getViewHandlerType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getViewHandlerType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (resourceBundleTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "resourceBundle_._type",
-			 "kind", "elementOnly"
-		   });		
-		addAnnotation
-		  (getResourceBundleType_Description(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "description",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getResourceBundleType_DisplayName(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "display-name",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getResourceBundleType_Icon(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "icon",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getResourceBundleType_BaseName(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "base-name",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getResourceBundleType_Var(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "var",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getResourceBundleType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (baseNameTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "base-name_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getBaseNameType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getBaseNameType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (varTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "var_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getVarType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getVarType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (viewDeclarationLanguageFactoryTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "view-declaration-language-factory_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getViewDeclarationLanguageFactoryType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getViewDeclarationLanguageFactoryType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (visitContextFactoryTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "visit-context-factory_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getVisitContextFactoryType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getVisitContextFactoryType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });
-	}
-
-} //FacesConfigPackageImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FacesConfigTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FacesConfigTypeImpl.java
deleted file mode 100644
index e658cf1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FacesConfigTypeImpl.java
+++ /dev/null
@@ -1,951 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.EObjectResolvingEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.facesconfig.emf.AbsoluteOrderingType;
-import org.eclipse.jst.jsf.facesconfig.emf.ApplicationType;
-import org.eclipse.jst.jsf.facesconfig.emf.BehaviorType;
-import org.eclipse.jst.jsf.facesconfig.emf.ComponentType;
-import org.eclipse.jst.jsf.facesconfig.emf.ConverterType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigExtensionType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType;
-import org.eclipse.jst.jsf.facesconfig.emf.FactoryType;
-import org.eclipse.jst.jsf.facesconfig.emf.LifecycleType;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType;
-import org.eclipse.jst.jsf.facesconfig.emf.NameType;
-import org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType;
-import org.eclipse.jst.jsf.facesconfig.emf.OrderingType;
-import org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanType;
-import org.eclipse.jst.jsf.facesconfig.emf.RenderKitType;
-import org.eclipse.jst.jsf.facesconfig.emf.ValidatorType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigTypeImpl#getApplication <em>Application</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigTypeImpl#getOrdering <em>Ordering</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigTypeImpl#getAbsoluteOrdering <em>Absolute Ordering</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigTypeImpl#getFactory <em>Factory</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigTypeImpl#getComponent <em>Component</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigTypeImpl#getConverter <em>Converter</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigTypeImpl#getManagedBean <em>Managed Bean</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigTypeImpl#getName <em>Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigTypeImpl#getNavigationRule <em>Navigation Rule</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigTypeImpl#getReferencedBean <em>Referenced Bean</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigTypeImpl#getRenderKit <em>Render Kit</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigTypeImpl#getLifecycle <em>Lifecycle</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigTypeImpl#getValidator <em>Validator</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigTypeImpl#getBehavior <em>Behavior</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigTypeImpl#getFacesConfigExtension <em>Faces Config Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigTypeImpl#getXmlns <em>Xmlns</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigTypeImpl#getId <em>Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigTypeImpl#isMetadataComplete <em>Metadata Complete</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class FacesConfigTypeImpl extends EObjectImpl implements FacesConfigType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The cached value of the '{@link #getApplication() <em>Application</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getApplication()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList application;
-
-    /**
-	 * The cached value of the '{@link #getOrdering() <em>Ordering</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getOrdering()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList ordering;
-
-				/**
-	 * The cached value of the '{@link #getAbsoluteOrdering() <em>Absolute Ordering</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getAbsoluteOrdering()
-	 * @generated
-	 * @ordered
-	 */
-	protected AbsoluteOrderingType absoluteOrdering;
-
-				/**
-	 * The cached value of the '{@link #getFactory() <em>Factory</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getFactory()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList factory;
-
-    /**
-	 * The cached value of the '{@link #getComponent() <em>Component</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getComponent()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList component;
-
-    /**
-	 * The cached value of the '{@link #getConverter() <em>Converter</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getConverter()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList converter;
-
-    /**
-	 * The cached value of the '{@link #getManagedBean() <em>Managed Bean</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getManagedBean()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList managedBean;
-
-    /**
-	 * The cached value of the '{@link #getName() <em>Name</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getName()
-	 * @generated
-	 * @ordered
-	 */
-	protected NameType name;
-
-				/**
-	 * The cached value of the '{@link #getNavigationRule() <em>Navigation Rule</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getNavigationRule()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList navigationRule;
-
-    /**
-	 * The cached value of the '{@link #getReferencedBean() <em>Referenced Bean</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getReferencedBean()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList referencedBean;
-
-    /**
-	 * The cached value of the '{@link #getRenderKit() <em>Render Kit</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRenderKit()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList renderKit;
-
-    /**
-	 * The cached value of the '{@link #getLifecycle() <em>Lifecycle</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getLifecycle()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList lifecycle;
-
-    /**
-	 * The cached value of the '{@link #getValidator() <em>Validator</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getValidator()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList validator;
-
-    /**
-	 * The cached value of the '{@link #getBehavior() <em>Behavior</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getBehavior()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList behavior;
-
-				/**
-	 * The cached value of the '{@link #getFacesConfigExtension() <em>Faces Config Extension</em>}' reference list.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see #getFacesConfigExtension()
-	 * @generated
-	 * @ordered
-	 */
-    protected EList facesConfigExtension;
-
-    /**
-	 * The default value of the '{@link #getXmlns() <em>Xmlns</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getXmlns()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String XMLNS_EDEFAULT = "http://java.sun.com/JSF/Configuration"; //$NON-NLS-1$
-
-    /**
-	 * The cached value of the '{@link #getXmlns() <em>Xmlns</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getXmlns()
-	 * @generated
-	 * @ordered
-	 */
-	protected String xmlns = XMLNS_EDEFAULT;
-
-    /**
-	 * This is true if the Xmlns attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean xmlnsESet;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #isMetadataComplete() <em>Metadata Complete</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isMetadataComplete()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean METADATA_COMPLETE_EDEFAULT = false;
-
-				/**
-	 * The cached value of the '{@link #isMetadataComplete() <em>Metadata Complete</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isMetadataComplete()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean metadataComplete = METADATA_COMPLETE_EDEFAULT;
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected FacesConfigTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.FACES_CONFIG_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getApplication() {
-		if (application == null) {
-			application = new EObjectContainmentEList(ApplicationType.class, this, FacesConfigPackage.FACES_CONFIG_TYPE__APPLICATION);
-		}
-		return application;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getOrdering() {
-		if (ordering == null) {
-			ordering = new EObjectContainmentEList(OrderingType.class, this, FacesConfigPackage.FACES_CONFIG_TYPE__ORDERING);
-		}
-		return ordering;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public AbsoluteOrderingType getAbsoluteOrdering() {
-		return absoluteOrdering;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * @param newAbsoluteOrdering 
-	 * @param msgs 
-	 * @return NotificationChain
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetAbsoluteOrdering(AbsoluteOrderingType newAbsoluteOrdering, NotificationChain msgs) {
-		AbsoluteOrderingType oldAbsoluteOrdering = absoluteOrdering;
-		absoluteOrdering = newAbsoluteOrdering;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.FACES_CONFIG_TYPE__ABSOLUTE_ORDERING, oldAbsoluteOrdering, newAbsoluteOrdering);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setAbsoluteOrdering(AbsoluteOrderingType newAbsoluteOrdering) {
-		if (newAbsoluteOrdering != absoluteOrdering) {
-			NotificationChain msgs = null;
-			if (absoluteOrdering != null)
-				msgs = ((InternalEObject)absoluteOrdering).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.FACES_CONFIG_TYPE__ABSOLUTE_ORDERING, null, msgs);
-			if (newAbsoluteOrdering != null)
-				msgs = ((InternalEObject)newAbsoluteOrdering).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.FACES_CONFIG_TYPE__ABSOLUTE_ORDERING, null, msgs);
-			msgs = basicSetAbsoluteOrdering(newAbsoluteOrdering, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.FACES_CONFIG_TYPE__ABSOLUTE_ORDERING, newAbsoluteOrdering, newAbsoluteOrdering));
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getFactory() {
-		if (factory == null) {
-			factory = new EObjectContainmentEList(FactoryType.class, this, FacesConfigPackage.FACES_CONFIG_TYPE__FACTORY);
-		}
-		return factory;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getComponent() {
-		if (component == null) {
-			component = new EObjectContainmentEList(ComponentType.class, this, FacesConfigPackage.FACES_CONFIG_TYPE__COMPONENT);
-		}
-		return component;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getConverter() {
-		if (converter == null) {
-			converter = new EObjectContainmentEList(ConverterType.class, this, FacesConfigPackage.FACES_CONFIG_TYPE__CONVERTER);
-		}
-		return converter;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getManagedBean() {
-		if (managedBean == null) {
-			managedBean = new EObjectContainmentEList(ManagedBeanType.class, this, FacesConfigPackage.FACES_CONFIG_TYPE__MANAGED_BEAN);
-		}
-		return managedBean;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NameType getName() {
-		return name;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @param newName 
-	 * @param msgs 
-	 * @return NotificationChain
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetName(NameType newName, NotificationChain msgs) {
-		NameType oldName = name;
-		name = newName;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.FACES_CONFIG_TYPE__NAME, oldName, newName);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setName(NameType newName) {
-		if (newName != name) {
-			NotificationChain msgs = null;
-			if (name != null)
-				msgs = ((InternalEObject)name).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.FACES_CONFIG_TYPE__NAME, null, msgs);
-			if (newName != null)
-				msgs = ((InternalEObject)newName).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.FACES_CONFIG_TYPE__NAME, null, msgs);
-			msgs = basicSetName(newName, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.FACES_CONFIG_TYPE__NAME, newName, newName));
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getNavigationRule() {
-		if (navigationRule == null) {
-			navigationRule = new EObjectContainmentEList(NavigationRuleType.class, this, FacesConfigPackage.FACES_CONFIG_TYPE__NAVIGATION_RULE);
-		}
-		return navigationRule;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getReferencedBean() {
-		if (referencedBean == null) {
-			referencedBean = new EObjectContainmentEList(ReferencedBeanType.class, this, FacesConfigPackage.FACES_CONFIG_TYPE__REFERENCED_BEAN);
-		}
-		return referencedBean;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getRenderKit() {
-		if (renderKit == null) {
-			renderKit = new EObjectContainmentEList(RenderKitType.class, this, FacesConfigPackage.FACES_CONFIG_TYPE__RENDER_KIT);
-		}
-		return renderKit;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getLifecycle() {
-		if (lifecycle == null) {
-			lifecycle = new EObjectContainmentEList(LifecycleType.class, this, FacesConfigPackage.FACES_CONFIG_TYPE__LIFECYCLE);
-		}
-		return lifecycle;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getValidator() {
-		if (validator == null) {
-			validator = new EObjectContainmentEList(ValidatorType.class, this, FacesConfigPackage.FACES_CONFIG_TYPE__VALIDATOR);
-		}
-		return validator;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getBehavior() {
-		if (behavior == null) {
-			behavior = new EObjectContainmentEList(BehaviorType.class, this, FacesConfigPackage.FACES_CONFIG_TYPE__BEHAVIOR);
-		}
-		return behavior;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EList getFacesConfigExtension() {
-		if (facesConfigExtension == null) {
-			facesConfigExtension = new EObjectResolvingEList(FacesConfigExtensionType.class, this, FacesConfigPackage.FACES_CONFIG_TYPE__FACES_CONFIG_EXTENSION);
-		}
-		return facesConfigExtension;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getXmlns() {
-		return xmlns;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setXmlns(String newXmlns) {
-		String oldXmlns = xmlns;
-		xmlns = newXmlns;
-		boolean oldXmlnsESet = xmlnsESet;
-		xmlnsESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.FACES_CONFIG_TYPE__XMLNS, oldXmlns, xmlns, !oldXmlnsESet));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetXmlns() {
-		String oldXmlns = xmlns;
-		boolean oldXmlnsESet = xmlnsESet;
-		xmlns = XMLNS_EDEFAULT;
-		xmlnsESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, FacesConfigPackage.FACES_CONFIG_TYPE__XMLNS, oldXmlns, XMLNS_EDEFAULT, oldXmlnsESet));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetXmlns() {
-		return xmlnsESet;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.FACES_CONFIG_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isMetadataComplete() {
-		return metadataComplete;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setMetadataComplete(boolean newMetadataComplete) {
-		boolean oldMetadataComplete = metadataComplete;
-		metadataComplete = newMetadataComplete;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.FACES_CONFIG_TYPE__METADATA_COMPLETE, oldMetadataComplete, metadataComplete));
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case FacesConfigPackage.FACES_CONFIG_TYPE__APPLICATION:
-				return ((InternalEList)getApplication()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.FACES_CONFIG_TYPE__ORDERING:
-				return ((InternalEList)getOrdering()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.FACES_CONFIG_TYPE__ABSOLUTE_ORDERING:
-				return basicSetAbsoluteOrdering(null, msgs);
-			case FacesConfigPackage.FACES_CONFIG_TYPE__FACTORY:
-				return ((InternalEList)getFactory()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.FACES_CONFIG_TYPE__COMPONENT:
-				return ((InternalEList)getComponent()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.FACES_CONFIG_TYPE__CONVERTER:
-				return ((InternalEList)getConverter()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.FACES_CONFIG_TYPE__MANAGED_BEAN:
-				return ((InternalEList)getManagedBean()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.FACES_CONFIG_TYPE__NAME:
-				return basicSetName(null, msgs);
-			case FacesConfigPackage.FACES_CONFIG_TYPE__NAVIGATION_RULE:
-				return ((InternalEList)getNavigationRule()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.FACES_CONFIG_TYPE__REFERENCED_BEAN:
-				return ((InternalEList)getReferencedBean()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.FACES_CONFIG_TYPE__RENDER_KIT:
-				return ((InternalEList)getRenderKit()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.FACES_CONFIG_TYPE__LIFECYCLE:
-				return ((InternalEList)getLifecycle()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.FACES_CONFIG_TYPE__VALIDATOR:
-				return ((InternalEList)getValidator()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.FACES_CONFIG_TYPE__BEHAVIOR:
-				return ((InternalEList)getBehavior()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.FACES_CONFIG_TYPE__APPLICATION:
-				return getApplication();
-			case FacesConfigPackage.FACES_CONFIG_TYPE__ORDERING:
-				return getOrdering();
-			case FacesConfigPackage.FACES_CONFIG_TYPE__ABSOLUTE_ORDERING:
-				return getAbsoluteOrdering();
-			case FacesConfigPackage.FACES_CONFIG_TYPE__FACTORY:
-				return getFactory();
-			case FacesConfigPackage.FACES_CONFIG_TYPE__COMPONENT:
-				return getComponent();
-			case FacesConfigPackage.FACES_CONFIG_TYPE__CONVERTER:
-				return getConverter();
-			case FacesConfigPackage.FACES_CONFIG_TYPE__MANAGED_BEAN:
-				return getManagedBean();
-			case FacesConfigPackage.FACES_CONFIG_TYPE__NAME:
-				return getName();
-			case FacesConfigPackage.FACES_CONFIG_TYPE__NAVIGATION_RULE:
-				return getNavigationRule();
-			case FacesConfigPackage.FACES_CONFIG_TYPE__REFERENCED_BEAN:
-				return getReferencedBean();
-			case FacesConfigPackage.FACES_CONFIG_TYPE__RENDER_KIT:
-				return getRenderKit();
-			case FacesConfigPackage.FACES_CONFIG_TYPE__LIFECYCLE:
-				return getLifecycle();
-			case FacesConfigPackage.FACES_CONFIG_TYPE__VALIDATOR:
-				return getValidator();
-			case FacesConfigPackage.FACES_CONFIG_TYPE__BEHAVIOR:
-				return getBehavior();
-			case FacesConfigPackage.FACES_CONFIG_TYPE__FACES_CONFIG_EXTENSION:
-				return getFacesConfigExtension();
-			case FacesConfigPackage.FACES_CONFIG_TYPE__XMLNS:
-				return getXmlns();
-			case FacesConfigPackage.FACES_CONFIG_TYPE__ID:
-				return getId();
-			case FacesConfigPackage.FACES_CONFIG_TYPE__METADATA_COMPLETE:
-				return isMetadataComplete() ? Boolean.TRUE : Boolean.FALSE;
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.FACES_CONFIG_TYPE__APPLICATION:
-				getApplication().clear();
-				getApplication().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.FACES_CONFIG_TYPE__ORDERING:
-				getOrdering().clear();
-				getOrdering().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.FACES_CONFIG_TYPE__ABSOLUTE_ORDERING:
-				setAbsoluteOrdering((AbsoluteOrderingType)newValue);
-				return;
-			case FacesConfigPackage.FACES_CONFIG_TYPE__FACTORY:
-				getFactory().clear();
-				getFactory().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.FACES_CONFIG_TYPE__COMPONENT:
-				getComponent().clear();
-				getComponent().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.FACES_CONFIG_TYPE__CONVERTER:
-				getConverter().clear();
-				getConverter().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.FACES_CONFIG_TYPE__MANAGED_BEAN:
-				getManagedBean().clear();
-				getManagedBean().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.FACES_CONFIG_TYPE__NAME:
-				setName((NameType)newValue);
-				return;
-			case FacesConfigPackage.FACES_CONFIG_TYPE__NAVIGATION_RULE:
-				getNavigationRule().clear();
-				getNavigationRule().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.FACES_CONFIG_TYPE__REFERENCED_BEAN:
-				getReferencedBean().clear();
-				getReferencedBean().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.FACES_CONFIG_TYPE__RENDER_KIT:
-				getRenderKit().clear();
-				getRenderKit().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.FACES_CONFIG_TYPE__LIFECYCLE:
-				getLifecycle().clear();
-				getLifecycle().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.FACES_CONFIG_TYPE__VALIDATOR:
-				getValidator().clear();
-				getValidator().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.FACES_CONFIG_TYPE__BEHAVIOR:
-				getBehavior().clear();
-				getBehavior().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.FACES_CONFIG_TYPE__FACES_CONFIG_EXTENSION:
-				getFacesConfigExtension().clear();
-				getFacesConfigExtension().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.FACES_CONFIG_TYPE__XMLNS:
-				setXmlns((String)newValue);
-				return;
-			case FacesConfigPackage.FACES_CONFIG_TYPE__ID:
-				setId((String)newValue);
-				return;
-			case FacesConfigPackage.FACES_CONFIG_TYPE__METADATA_COMPLETE:
-				setMetadataComplete(((Boolean)newValue).booleanValue());
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.FACES_CONFIG_TYPE__APPLICATION:
-				getApplication().clear();
-				return;
-			case FacesConfigPackage.FACES_CONFIG_TYPE__ORDERING:
-				getOrdering().clear();
-				return;
-			case FacesConfigPackage.FACES_CONFIG_TYPE__ABSOLUTE_ORDERING:
-				setAbsoluteOrdering((AbsoluteOrderingType)null);
-				return;
-			case FacesConfigPackage.FACES_CONFIG_TYPE__FACTORY:
-				getFactory().clear();
-				return;
-			case FacesConfigPackage.FACES_CONFIG_TYPE__COMPONENT:
-				getComponent().clear();
-				return;
-			case FacesConfigPackage.FACES_CONFIG_TYPE__CONVERTER:
-				getConverter().clear();
-				return;
-			case FacesConfigPackage.FACES_CONFIG_TYPE__MANAGED_BEAN:
-				getManagedBean().clear();
-				return;
-			case FacesConfigPackage.FACES_CONFIG_TYPE__NAME:
-				setName((NameType)null);
-				return;
-			case FacesConfigPackage.FACES_CONFIG_TYPE__NAVIGATION_RULE:
-				getNavigationRule().clear();
-				return;
-			case FacesConfigPackage.FACES_CONFIG_TYPE__REFERENCED_BEAN:
-				getReferencedBean().clear();
-				return;
-			case FacesConfigPackage.FACES_CONFIG_TYPE__RENDER_KIT:
-				getRenderKit().clear();
-				return;
-			case FacesConfigPackage.FACES_CONFIG_TYPE__LIFECYCLE:
-				getLifecycle().clear();
-				return;
-			case FacesConfigPackage.FACES_CONFIG_TYPE__VALIDATOR:
-				getValidator().clear();
-				return;
-			case FacesConfigPackage.FACES_CONFIG_TYPE__BEHAVIOR:
-				getBehavior().clear();
-				return;
-			case FacesConfigPackage.FACES_CONFIG_TYPE__FACES_CONFIG_EXTENSION:
-				getFacesConfigExtension().clear();
-				return;
-			case FacesConfigPackage.FACES_CONFIG_TYPE__XMLNS:
-				unsetXmlns();
-				return;
-			case FacesConfigPackage.FACES_CONFIG_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-			case FacesConfigPackage.FACES_CONFIG_TYPE__METADATA_COMPLETE:
-				setMetadataComplete(METADATA_COMPLETE_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.FACES_CONFIG_TYPE__APPLICATION:
-				return application != null && !application.isEmpty();
-			case FacesConfigPackage.FACES_CONFIG_TYPE__ORDERING:
-				return ordering != null && !ordering.isEmpty();
-			case FacesConfigPackage.FACES_CONFIG_TYPE__ABSOLUTE_ORDERING:
-				return absoluteOrdering != null;
-			case FacesConfigPackage.FACES_CONFIG_TYPE__FACTORY:
-				return factory != null && !factory.isEmpty();
-			case FacesConfigPackage.FACES_CONFIG_TYPE__COMPONENT:
-				return component != null && !component.isEmpty();
-			case FacesConfigPackage.FACES_CONFIG_TYPE__CONVERTER:
-				return converter != null && !converter.isEmpty();
-			case FacesConfigPackage.FACES_CONFIG_TYPE__MANAGED_BEAN:
-				return managedBean != null && !managedBean.isEmpty();
-			case FacesConfigPackage.FACES_CONFIG_TYPE__NAME:
-				return name != null;
-			case FacesConfigPackage.FACES_CONFIG_TYPE__NAVIGATION_RULE:
-				return navigationRule != null && !navigationRule.isEmpty();
-			case FacesConfigPackage.FACES_CONFIG_TYPE__REFERENCED_BEAN:
-				return referencedBean != null && !referencedBean.isEmpty();
-			case FacesConfigPackage.FACES_CONFIG_TYPE__RENDER_KIT:
-				return renderKit != null && !renderKit.isEmpty();
-			case FacesConfigPackage.FACES_CONFIG_TYPE__LIFECYCLE:
-				return lifecycle != null && !lifecycle.isEmpty();
-			case FacesConfigPackage.FACES_CONFIG_TYPE__VALIDATOR:
-				return validator != null && !validator.isEmpty();
-			case FacesConfigPackage.FACES_CONFIG_TYPE__BEHAVIOR:
-				return behavior != null && !behavior.isEmpty();
-			case FacesConfigPackage.FACES_CONFIG_TYPE__FACES_CONFIG_EXTENSION:
-				return facesConfigExtension != null && !facesConfigExtension.isEmpty();
-			case FacesConfigPackage.FACES_CONFIG_TYPE__XMLNS:
-				return isSetXmlns();
-			case FacesConfigPackage.FACES_CONFIG_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-			case FacesConfigPackage.FACES_CONFIG_TYPE__METADATA_COMPLETE:
-				return metadataComplete != METADATA_COMPLETE_EDEFAULT;
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (xmlns: "); //$NON-NLS-1$
-		if (xmlnsESet) result.append(xmlns); else result.append("<unset>"); //$NON-NLS-1$
-		result.append(", id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(", metadataComplete: "); //$NON-NLS-1$
-		result.append(metadataComplete);
-		result.append(')');
-		return result.toString();
-	}
-
-} //FacesConfigTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FacesContextFactoryTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FacesContextFactoryTypeImpl.java
deleted file mode 100644
index 4ab342a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FacesContextFactoryTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesContextFactoryType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Faces Context Factory Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacesContextFactoryTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacesContextFactoryTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class FacesContextFactoryTypeImpl extends EObjectImpl implements FacesContextFactoryType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected FacesContextFactoryTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.FACES_CONTEXT_FACTORY_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.FACES_CONTEXT_FACTORY_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.FACES_CONTEXT_FACTORY_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.FACES_CONTEXT_FACTORY_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.FACES_CONTEXT_FACTORY_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.FACES_CONTEXT_FACTORY_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.FACES_CONTEXT_FACTORY_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.FACES_CONTEXT_FACTORY_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.FACES_CONTEXT_FACTORY_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.FACES_CONTEXT_FACTORY_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.FACES_CONTEXT_FACTORY_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: "); //$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //FacesContextFactoryTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FacetExtensionTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FacetExtensionTypeImpl.java
deleted file mode 100644
index 6e99b46..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FacetExtensionTypeImpl.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.FacetExtensionType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Facet Extension Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * </p>
- *
- * @generated
- */
-public class FacetExtensionTypeImpl extends ExtensionTypeImpl implements FacetExtensionType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@SuppressWarnings("hiding")
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected FacetExtensionTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.FACET_EXTENSION_TYPE;
-	}
-
-} //FacetExtensionTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FacetNameTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FacetNameTypeImpl.java
deleted file mode 100644
index cab6a24..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FacetNameTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.FacetNameType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Facet Name Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacetNameTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacetNameTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class FacetNameTypeImpl extends EObjectImpl implements FacetNameType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected FacetNameTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.FACET_NAME_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.FACET_NAME_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.FACET_NAME_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.FACET_NAME_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.FACET_NAME_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.FACET_NAME_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.FACET_NAME_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.FACET_NAME_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.FACET_NAME_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.FACET_NAME_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.FACET_NAME_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: "); //$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //FacetNameTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FacetTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FacetTypeImpl.java
deleted file mode 100644
index 5d5e586..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FacetTypeImpl.java
+++ /dev/null
@@ -1,407 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.facesconfig.emf.DescriptionType;
-import org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.FacetExtensionType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacetNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacetType;
-import org.eclipse.jst.jsf.facesconfig.emf.IconType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Facet Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacetTypeImpl#getDescription <em>Description</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacetTypeImpl#getDisplayName <em>Display Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacetTypeImpl#getIcon <em>Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacetTypeImpl#getFacetName <em>Facet Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacetTypeImpl#getFacetExtension <em>Facet Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacetTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class FacetTypeImpl extends EObjectImpl implements FacetType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The cached value of the '{@link #getDescription() <em>Description</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDescription()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList description;
-
-    /**
-	 * The cached value of the '{@link #getDisplayName() <em>Display Name</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDisplayName()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList displayName;
-
-    /**
-	 * The cached value of the '{@link #getIcon() <em>Icon</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getIcon()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList icon;
-
-    /**
-	 * The cached value of the '{@link #getFacetName() <em>Facet Name</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getFacetName()
-	 * @generated
-	 * @ordered
-	 */
-	protected FacetNameType facetName;
-
-    /**
-	 * The cached value of the '{@link #getFacetExtension() <em>Facet Extension</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getFacetExtension()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList facetExtension;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected FacetTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.FACET_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getDescription() {
-		if (description == null) {
-			description = new EObjectContainmentEList(DescriptionType.class, this, FacesConfigPackage.FACET_TYPE__DESCRIPTION);
-		}
-		return description;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getDisplayName() {
-		if (displayName == null) {
-			displayName = new EObjectContainmentEList(DisplayNameType.class, this, FacesConfigPackage.FACET_TYPE__DISPLAY_NAME);
-		}
-		return displayName;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getIcon() {
-		if (icon == null) {
-			icon = new EObjectContainmentEList(IconType.class, this, FacesConfigPackage.FACET_TYPE__ICON);
-		}
-		return icon;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FacetNameType getFacetName() {
-		return facetName;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newFacetName 
-     * @param msgs 
-     * @return NotificationChain
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetFacetName(FacetNameType newFacetName, NotificationChain msgs) {
-		FacetNameType oldFacetName = facetName;
-		facetName = newFacetName;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.FACET_TYPE__FACET_NAME, oldFacetName, newFacetName);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setFacetName(FacetNameType newFacetName) {
-		if (newFacetName != facetName) {
-			NotificationChain msgs = null;
-			if (facetName != null)
-				msgs = ((InternalEObject)facetName).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.FACET_TYPE__FACET_NAME, null, msgs);
-			if (newFacetName != null)
-				msgs = ((InternalEObject)newFacetName).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.FACET_TYPE__FACET_NAME, null, msgs);
-			msgs = basicSetFacetName(newFacetName, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.FACET_TYPE__FACET_NAME, newFacetName, newFacetName));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getFacetExtension() {
-		if (facetExtension == null) {
-			facetExtension = new EObjectContainmentEList(FacetExtensionType.class, this, FacesConfigPackage.FACET_TYPE__FACET_EXTENSION);
-		}
-		return facetExtension;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.FACET_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case FacesConfigPackage.FACET_TYPE__DESCRIPTION:
-				return ((InternalEList)getDescription()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.FACET_TYPE__DISPLAY_NAME:
-				return ((InternalEList)getDisplayName()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.FACET_TYPE__ICON:
-				return ((InternalEList)getIcon()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.FACET_TYPE__FACET_NAME:
-				return basicSetFacetName(null, msgs);
-			case FacesConfigPackage.FACET_TYPE__FACET_EXTENSION:
-				return ((InternalEList)getFacetExtension()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.FACET_TYPE__DESCRIPTION:
-				return getDescription();
-			case FacesConfigPackage.FACET_TYPE__DISPLAY_NAME:
-				return getDisplayName();
-			case FacesConfigPackage.FACET_TYPE__ICON:
-				return getIcon();
-			case FacesConfigPackage.FACET_TYPE__FACET_NAME:
-				return getFacetName();
-			case FacesConfigPackage.FACET_TYPE__FACET_EXTENSION:
-				return getFacetExtension();
-			case FacesConfigPackage.FACET_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.FACET_TYPE__DESCRIPTION:
-				getDescription().clear();
-				getDescription().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.FACET_TYPE__DISPLAY_NAME:
-				getDisplayName().clear();
-				getDisplayName().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.FACET_TYPE__ICON:
-				getIcon().clear();
-				getIcon().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.FACET_TYPE__FACET_NAME:
-				setFacetName((FacetNameType)newValue);
-				return;
-			case FacesConfigPackage.FACET_TYPE__FACET_EXTENSION:
-				getFacetExtension().clear();
-				getFacetExtension().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.FACET_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.FACET_TYPE__DESCRIPTION:
-				getDescription().clear();
-				return;
-			case FacesConfigPackage.FACET_TYPE__DISPLAY_NAME:
-				getDisplayName().clear();
-				return;
-			case FacesConfigPackage.FACET_TYPE__ICON:
-				getIcon().clear();
-				return;
-			case FacesConfigPackage.FACET_TYPE__FACET_NAME:
-				setFacetName((FacetNameType)null);
-				return;
-			case FacesConfigPackage.FACET_TYPE__FACET_EXTENSION:
-				getFacetExtension().clear();
-				return;
-			case FacesConfigPackage.FACET_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.FACET_TYPE__DESCRIPTION:
-				return description != null && !description.isEmpty();
-			case FacesConfigPackage.FACET_TYPE__DISPLAY_NAME:
-				return displayName != null && !displayName.isEmpty();
-			case FacesConfigPackage.FACET_TYPE__ICON:
-				return icon != null && !icon.isEmpty();
-			case FacesConfigPackage.FACET_TYPE__FACET_NAME:
-				return facetName != null;
-			case FacesConfigPackage.FACET_TYPE__FACET_EXTENSION:
-				return facetExtension != null && !facetExtension.isEmpty();
-			case FacesConfigPackage.FACET_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //FacetTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FactoryExtensionTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FactoryExtensionTypeImpl.java
deleted file mode 100644
index 6bec8fd..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FactoryExtensionTypeImpl.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.FactoryExtensionType;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Factory Extension Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * </p>
- *
- * @generated
- */
-public class FactoryExtensionTypeImpl extends ExtensionTypeImpl implements FactoryExtensionType {
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    @SuppressWarnings("hiding")
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected FactoryExtensionTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.FACTORY_EXTENSION_TYPE;
-	}
-
-} //FactoryExtensionTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FactoryTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FactoryTypeImpl.java
deleted file mode 100644
index e7b00cf..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FactoryTypeImpl.java
+++ /dev/null
@@ -1,595 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.EObjectResolvingEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.facesconfig.emf.ApplicationFactoryType;
-import org.eclipse.jst.jsf.facesconfig.emf.ExceptionHandlerFactoryType;
-import org.eclipse.jst.jsf.facesconfig.emf.ExternalContextFactoryType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesContextFactoryType;
-import org.eclipse.jst.jsf.facesconfig.emf.FactoryExtensionType;
-import org.eclipse.jst.jsf.facesconfig.emf.FactoryType;
-import org.eclipse.jst.jsf.facesconfig.emf.LifecycleFactoryType;
-import org.eclipse.jst.jsf.facesconfig.emf.PartialViewContextFactoryType;
-import org.eclipse.jst.jsf.facesconfig.emf.RenderKitFactoryType;
-import org.eclipse.jst.jsf.facesconfig.emf.TagHandlerDelegateFactoryType;
-import org.eclipse.jst.jsf.facesconfig.emf.ViewDeclarationLanguageFactoryType;
-import org.eclipse.jst.jsf.facesconfig.emf.VisitContextFactoryType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Factory Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FactoryTypeImpl#getApplicationFactory <em>Application Factory</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FactoryTypeImpl#getExceptionHandlerFactory <em>Exception Handler Factory</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FactoryTypeImpl#getExternalContextFactory <em>External Context Factory</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FactoryTypeImpl#getFacesContextFactory <em>Faces Context Factory</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FactoryTypeImpl#getPartialViewContextFactory <em>Partial View Context Factory</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FactoryTypeImpl#getLifecycleFactory <em>Lifecycle Factory</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FactoryTypeImpl#getViewDeclarationLanguageFactory <em>View Declaration Language Factory</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FactoryTypeImpl#getTagHandlerDelegateFactory <em>Tag Handler Delegate Factory</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FactoryTypeImpl#getRenderKitFactory <em>Render Kit Factory</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FactoryTypeImpl#getVisitContextFactory <em>Visit Context Factory</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FactoryTypeImpl#getFactoryExtension <em>Factory Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FactoryTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class FactoryTypeImpl extends EObjectImpl implements FactoryType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The cached value of the '{@link #getApplicationFactory() <em>Application Factory</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getApplicationFactory()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList applicationFactory;
-
-    /**
-	 * The cached value of the '{@link #getExceptionHandlerFactory() <em>Exception Handler Factory</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getExceptionHandlerFactory()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList exceptionHandlerFactory;
-
-				/**
-	 * The cached value of the '{@link #getExternalContextFactory() <em>External Context Factory</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getExternalContextFactory()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList externalContextFactory;
-
-				/**
-	 * The cached value of the '{@link #getFacesContextFactory() <em>Faces Context Factory</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getFacesContextFactory()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList facesContextFactory;
-
-    /**
-	 * The cached value of the '{@link #getPartialViewContextFactory() <em>Partial View Context Factory</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPartialViewContextFactory()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList partialViewContextFactory;
-
-				/**
-	 * The cached value of the '{@link #getLifecycleFactory() <em>Lifecycle Factory</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getLifecycleFactory()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList lifecycleFactory;
-
-    /**
-	 * The cached value of the '{@link #getViewDeclarationLanguageFactory() <em>View Declaration Language Factory</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getViewDeclarationLanguageFactory()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList viewDeclarationLanguageFactory;
-
-				/**
-	 * The cached value of the '{@link #getTagHandlerDelegateFactory() <em>Tag Handler Delegate Factory</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTagHandlerDelegateFactory()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList tagHandlerDelegateFactory;
-
-				/**
-	 * The cached value of the '{@link #getRenderKitFactory() <em>Render Kit Factory</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRenderKitFactory()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList renderKitFactory;
-
-    /**
-	 * The cached value of the '{@link #getVisitContextFactory() <em>Visit Context Factory</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getVisitContextFactory()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList visitContextFactory;
-
-				/**
-	 * The cached value of the '{@link #getFactoryExtension() <em>Factory Extension</em>}' reference list.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see #getFactoryExtension()
-	 * @generated
-	 * @ordered
-	 */
-    protected EList factoryExtension;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected FactoryTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.FACTORY_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getApplicationFactory() {
-		if (applicationFactory == null) {
-			applicationFactory = new EObjectContainmentEList(ApplicationFactoryType.class, this, FacesConfigPackage.FACTORY_TYPE__APPLICATION_FACTORY);
-		}
-		return applicationFactory;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getExceptionHandlerFactory() {
-		if (exceptionHandlerFactory == null) {
-			exceptionHandlerFactory = new EObjectContainmentEList(ExceptionHandlerFactoryType.class, this, FacesConfigPackage.FACTORY_TYPE__EXCEPTION_HANDLER_FACTORY);
-		}
-		return exceptionHandlerFactory;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getExternalContextFactory() {
-		if (externalContextFactory == null) {
-			externalContextFactory = new EObjectContainmentEList(ExternalContextFactoryType.class, this, FacesConfigPackage.FACTORY_TYPE__EXTERNAL_CONTEXT_FACTORY);
-		}
-		return externalContextFactory;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getFacesContextFactory() {
-		if (facesContextFactory == null) {
-			facesContextFactory = new EObjectContainmentEList(FacesContextFactoryType.class, this, FacesConfigPackage.FACTORY_TYPE__FACES_CONTEXT_FACTORY);
-		}
-		return facesContextFactory;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getPartialViewContextFactory() {
-		if (partialViewContextFactory == null) {
-			partialViewContextFactory = new EObjectContainmentEList(PartialViewContextFactoryType.class, this, FacesConfigPackage.FACTORY_TYPE__PARTIAL_VIEW_CONTEXT_FACTORY);
-		}
-		return partialViewContextFactory;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getLifecycleFactory() {
-		if (lifecycleFactory == null) {
-			lifecycleFactory = new EObjectContainmentEList(LifecycleFactoryType.class, this, FacesConfigPackage.FACTORY_TYPE__LIFECYCLE_FACTORY);
-		}
-		return lifecycleFactory;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getViewDeclarationLanguageFactory() {
-		if (viewDeclarationLanguageFactory == null) {
-			viewDeclarationLanguageFactory = new EObjectContainmentEList(ViewDeclarationLanguageFactoryType.class, this, FacesConfigPackage.FACTORY_TYPE__VIEW_DECLARATION_LANGUAGE_FACTORY);
-		}
-		return viewDeclarationLanguageFactory;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getTagHandlerDelegateFactory() {
-		if (tagHandlerDelegateFactory == null) {
-			tagHandlerDelegateFactory = new EObjectContainmentEList(TagHandlerDelegateFactoryType.class, this, FacesConfigPackage.FACTORY_TYPE__TAG_HANDLER_DELEGATE_FACTORY);
-		}
-		return tagHandlerDelegateFactory;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getRenderKitFactory() {
-		if (renderKitFactory == null) {
-			renderKitFactory = new EObjectContainmentEList(RenderKitFactoryType.class, this, FacesConfigPackage.FACTORY_TYPE__RENDER_KIT_FACTORY);
-		}
-		return renderKitFactory;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getVisitContextFactory() {
-		if (visitContextFactory == null) {
-			visitContextFactory = new EObjectContainmentEList(VisitContextFactoryType.class, this, FacesConfigPackage.FACTORY_TYPE__VISIT_CONTEXT_FACTORY);
-		}
-		return visitContextFactory;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EList getFactoryExtension() {
-		if (factoryExtension == null) {
-			factoryExtension = new EObjectResolvingEList(FactoryExtensionType.class, this, FacesConfigPackage.FACTORY_TYPE__FACTORY_EXTENSION);
-		}
-		return factoryExtension;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.FACTORY_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case FacesConfigPackage.FACTORY_TYPE__APPLICATION_FACTORY:
-				return ((InternalEList)getApplicationFactory()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.FACTORY_TYPE__EXCEPTION_HANDLER_FACTORY:
-				return ((InternalEList)getExceptionHandlerFactory()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.FACTORY_TYPE__EXTERNAL_CONTEXT_FACTORY:
-				return ((InternalEList)getExternalContextFactory()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.FACTORY_TYPE__FACES_CONTEXT_FACTORY:
-				return ((InternalEList)getFacesContextFactory()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.FACTORY_TYPE__PARTIAL_VIEW_CONTEXT_FACTORY:
-				return ((InternalEList)getPartialViewContextFactory()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.FACTORY_TYPE__LIFECYCLE_FACTORY:
-				return ((InternalEList)getLifecycleFactory()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.FACTORY_TYPE__VIEW_DECLARATION_LANGUAGE_FACTORY:
-				return ((InternalEList)getViewDeclarationLanguageFactory()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.FACTORY_TYPE__TAG_HANDLER_DELEGATE_FACTORY:
-				return ((InternalEList)getTagHandlerDelegateFactory()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.FACTORY_TYPE__RENDER_KIT_FACTORY:
-				return ((InternalEList)getRenderKitFactory()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.FACTORY_TYPE__VISIT_CONTEXT_FACTORY:
-				return ((InternalEList)getVisitContextFactory()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.FACTORY_TYPE__APPLICATION_FACTORY:
-				return getApplicationFactory();
-			case FacesConfigPackage.FACTORY_TYPE__EXCEPTION_HANDLER_FACTORY:
-				return getExceptionHandlerFactory();
-			case FacesConfigPackage.FACTORY_TYPE__EXTERNAL_CONTEXT_FACTORY:
-				return getExternalContextFactory();
-			case FacesConfigPackage.FACTORY_TYPE__FACES_CONTEXT_FACTORY:
-				return getFacesContextFactory();
-			case FacesConfigPackage.FACTORY_TYPE__PARTIAL_VIEW_CONTEXT_FACTORY:
-				return getPartialViewContextFactory();
-			case FacesConfigPackage.FACTORY_TYPE__LIFECYCLE_FACTORY:
-				return getLifecycleFactory();
-			case FacesConfigPackage.FACTORY_TYPE__VIEW_DECLARATION_LANGUAGE_FACTORY:
-				return getViewDeclarationLanguageFactory();
-			case FacesConfigPackage.FACTORY_TYPE__TAG_HANDLER_DELEGATE_FACTORY:
-				return getTagHandlerDelegateFactory();
-			case FacesConfigPackage.FACTORY_TYPE__RENDER_KIT_FACTORY:
-				return getRenderKitFactory();
-			case FacesConfigPackage.FACTORY_TYPE__VISIT_CONTEXT_FACTORY:
-				return getVisitContextFactory();
-			case FacesConfigPackage.FACTORY_TYPE__FACTORY_EXTENSION:
-				return getFactoryExtension();
-			case FacesConfigPackage.FACTORY_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.FACTORY_TYPE__APPLICATION_FACTORY:
-				getApplicationFactory().clear();
-				getApplicationFactory().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.FACTORY_TYPE__EXCEPTION_HANDLER_FACTORY:
-				getExceptionHandlerFactory().clear();
-				getExceptionHandlerFactory().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.FACTORY_TYPE__EXTERNAL_CONTEXT_FACTORY:
-				getExternalContextFactory().clear();
-				getExternalContextFactory().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.FACTORY_TYPE__FACES_CONTEXT_FACTORY:
-				getFacesContextFactory().clear();
-				getFacesContextFactory().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.FACTORY_TYPE__PARTIAL_VIEW_CONTEXT_FACTORY:
-				getPartialViewContextFactory().clear();
-				getPartialViewContextFactory().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.FACTORY_TYPE__LIFECYCLE_FACTORY:
-				getLifecycleFactory().clear();
-				getLifecycleFactory().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.FACTORY_TYPE__VIEW_DECLARATION_LANGUAGE_FACTORY:
-				getViewDeclarationLanguageFactory().clear();
-				getViewDeclarationLanguageFactory().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.FACTORY_TYPE__TAG_HANDLER_DELEGATE_FACTORY:
-				getTagHandlerDelegateFactory().clear();
-				getTagHandlerDelegateFactory().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.FACTORY_TYPE__RENDER_KIT_FACTORY:
-				getRenderKitFactory().clear();
-				getRenderKitFactory().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.FACTORY_TYPE__VISIT_CONTEXT_FACTORY:
-				getVisitContextFactory().clear();
-				getVisitContextFactory().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.FACTORY_TYPE__FACTORY_EXTENSION:
-				getFactoryExtension().clear();
-				getFactoryExtension().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.FACTORY_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.FACTORY_TYPE__APPLICATION_FACTORY:
-				getApplicationFactory().clear();
-				return;
-			case FacesConfigPackage.FACTORY_TYPE__EXCEPTION_HANDLER_FACTORY:
-				getExceptionHandlerFactory().clear();
-				return;
-			case FacesConfigPackage.FACTORY_TYPE__EXTERNAL_CONTEXT_FACTORY:
-				getExternalContextFactory().clear();
-				return;
-			case FacesConfigPackage.FACTORY_TYPE__FACES_CONTEXT_FACTORY:
-				getFacesContextFactory().clear();
-				return;
-			case FacesConfigPackage.FACTORY_TYPE__PARTIAL_VIEW_CONTEXT_FACTORY:
-				getPartialViewContextFactory().clear();
-				return;
-			case FacesConfigPackage.FACTORY_TYPE__LIFECYCLE_FACTORY:
-				getLifecycleFactory().clear();
-				return;
-			case FacesConfigPackage.FACTORY_TYPE__VIEW_DECLARATION_LANGUAGE_FACTORY:
-				getViewDeclarationLanguageFactory().clear();
-				return;
-			case FacesConfigPackage.FACTORY_TYPE__TAG_HANDLER_DELEGATE_FACTORY:
-				getTagHandlerDelegateFactory().clear();
-				return;
-			case FacesConfigPackage.FACTORY_TYPE__RENDER_KIT_FACTORY:
-				getRenderKitFactory().clear();
-				return;
-			case FacesConfigPackage.FACTORY_TYPE__VISIT_CONTEXT_FACTORY:
-				getVisitContextFactory().clear();
-				return;
-			case FacesConfigPackage.FACTORY_TYPE__FACTORY_EXTENSION:
-				getFactoryExtension().clear();
-				return;
-			case FacesConfigPackage.FACTORY_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.FACTORY_TYPE__APPLICATION_FACTORY:
-				return applicationFactory != null && !applicationFactory.isEmpty();
-			case FacesConfigPackage.FACTORY_TYPE__EXCEPTION_HANDLER_FACTORY:
-				return exceptionHandlerFactory != null && !exceptionHandlerFactory.isEmpty();
-			case FacesConfigPackage.FACTORY_TYPE__EXTERNAL_CONTEXT_FACTORY:
-				return externalContextFactory != null && !externalContextFactory.isEmpty();
-			case FacesConfigPackage.FACTORY_TYPE__FACES_CONTEXT_FACTORY:
-				return facesContextFactory != null && !facesContextFactory.isEmpty();
-			case FacesConfigPackage.FACTORY_TYPE__PARTIAL_VIEW_CONTEXT_FACTORY:
-				return partialViewContextFactory != null && !partialViewContextFactory.isEmpty();
-			case FacesConfigPackage.FACTORY_TYPE__LIFECYCLE_FACTORY:
-				return lifecycleFactory != null && !lifecycleFactory.isEmpty();
-			case FacesConfigPackage.FACTORY_TYPE__VIEW_DECLARATION_LANGUAGE_FACTORY:
-				return viewDeclarationLanguageFactory != null && !viewDeclarationLanguageFactory.isEmpty();
-			case FacesConfigPackage.FACTORY_TYPE__TAG_HANDLER_DELEGATE_FACTORY:
-				return tagHandlerDelegateFactory != null && !tagHandlerDelegateFactory.isEmpty();
-			case FacesConfigPackage.FACTORY_TYPE__RENDER_KIT_FACTORY:
-				return renderKitFactory != null && !renderKitFactory.isEmpty();
-			case FacesConfigPackage.FACTORY_TYPE__VISIT_CONTEXT_FACTORY:
-				return visitContextFactory != null && !visitContextFactory.isEmpty();
-			case FacesConfigPackage.FACTORY_TYPE__FACTORY_EXTENSION:
-				return factoryExtension != null && !factoryExtension.isEmpty();
-			case FacesConfigPackage.FACTORY_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //FactoryTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FromActionTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FromActionTypeImpl.java
deleted file mode 100644
index 92c0eca..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FromActionTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.FromActionType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>From Action Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FromActionTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FromActionTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class FromActionTypeImpl extends EObjectImpl implements FromActionType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected FromActionTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.FROM_ACTION_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.FROM_ACTION_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.FROM_ACTION_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.FROM_ACTION_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.FROM_ACTION_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.FROM_ACTION_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.FROM_ACTION_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.FROM_ACTION_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.FROM_ACTION_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.FROM_ACTION_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.FROM_ACTION_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: "); //$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //FromActionTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FromOutcomeTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FromOutcomeTypeImpl.java
deleted file mode 100644
index 85ebefb..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FromOutcomeTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.FromOutcomeType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>From Outcome Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FromOutcomeTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FromOutcomeTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class FromOutcomeTypeImpl extends EObjectImpl implements FromOutcomeType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected FromOutcomeTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.FROM_OUTCOME_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.FROM_OUTCOME_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.FROM_OUTCOME_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.FROM_OUTCOME_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.FROM_OUTCOME_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.FROM_OUTCOME_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.FROM_OUTCOME_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.FROM_OUTCOME_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.FROM_OUTCOME_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.FROM_OUTCOME_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.FROM_OUTCOME_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: "); //$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //FromOutcomeTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FromViewIdTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FromViewIdTypeImpl.java
deleted file mode 100644
index 6205448..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FromViewIdTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.FromViewIdType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>From View Id Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FromViewIdTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FromViewIdTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class FromViewIdTypeImpl extends EObjectImpl implements FromViewIdType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected FromViewIdTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.FROM_VIEW_ID_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.FROM_VIEW_ID_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.FROM_VIEW_ID_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.FROM_VIEW_ID_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.FROM_VIEW_ID_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.FROM_VIEW_ID_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.FROM_VIEW_ID_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.FROM_VIEW_ID_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.FROM_VIEW_ID_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.FROM_VIEW_ID_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.FROM_VIEW_ID_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: "); //$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //FromViewIdTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/IconTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/IconTypeImpl.java
deleted file mode 100644
index c567901..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/IconTypeImpl.java
+++ /dev/null
@@ -1,378 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.IconType;
-import org.eclipse.jst.jsf.facesconfig.emf.LargeIconType;
-import org.eclipse.jst.jsf.facesconfig.emf.SmallIconType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Icon Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.IconTypeImpl#getSmallIcon <em>Small Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.IconTypeImpl#getLargeIcon <em>Large Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.IconTypeImpl#getLang <em>Lang</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.IconTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class IconTypeImpl extends EObjectImpl implements IconType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The cached value of the '{@link #getSmallIcon() <em>Small Icon</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getSmallIcon()
-	 * @generated
-	 * @ordered
-	 */
-	protected SmallIconType smallIcon;
-
-    /**
-	 * The cached value of the '{@link #getLargeIcon() <em>Large Icon</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getLargeIcon()
-	 * @generated
-	 * @ordered
-	 */
-	protected LargeIconType largeIcon;
-
-    /**
-	 * The default value of the '{@link #getLang() <em>Lang</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getLang()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String LANG_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getLang() <em>Lang</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getLang()
-	 * @generated
-	 * @ordered
-	 */
-	protected String lang = LANG_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected IconTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.ICON_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public SmallIconType getSmallIcon() {
-		return smallIcon;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newSmallIcon 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetSmallIcon(SmallIconType newSmallIcon, NotificationChain msgs) {
-		SmallIconType oldSmallIcon = smallIcon;
-		smallIcon = newSmallIcon;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.ICON_TYPE__SMALL_ICON, oldSmallIcon, newSmallIcon);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setSmallIcon(SmallIconType newSmallIcon) {
-		if (newSmallIcon != smallIcon) {
-			NotificationChain msgs = null;
-			if (smallIcon != null)
-				msgs = ((InternalEObject)smallIcon).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.ICON_TYPE__SMALL_ICON, null, msgs);
-			if (newSmallIcon != null)
-				msgs = ((InternalEObject)newSmallIcon).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.ICON_TYPE__SMALL_ICON, null, msgs);
-			msgs = basicSetSmallIcon(newSmallIcon, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.ICON_TYPE__SMALL_ICON, newSmallIcon, newSmallIcon));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public LargeIconType getLargeIcon() {
-		return largeIcon;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newLargeIcon 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetLargeIcon(LargeIconType newLargeIcon, NotificationChain msgs) {
-		LargeIconType oldLargeIcon = largeIcon;
-		largeIcon = newLargeIcon;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.ICON_TYPE__LARGE_ICON, oldLargeIcon, newLargeIcon);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setLargeIcon(LargeIconType newLargeIcon) {
-		if (newLargeIcon != largeIcon) {
-			NotificationChain msgs = null;
-			if (largeIcon != null)
-				msgs = ((InternalEObject)largeIcon).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.ICON_TYPE__LARGE_ICON, null, msgs);
-			if (newLargeIcon != null)
-				msgs = ((InternalEObject)newLargeIcon).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.ICON_TYPE__LARGE_ICON, null, msgs);
-			msgs = basicSetLargeIcon(newLargeIcon, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.ICON_TYPE__LARGE_ICON, newLargeIcon, newLargeIcon));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getLang() {
-		return lang;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setLang(String newLang) {
-		String oldLang = lang;
-		lang = newLang;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.ICON_TYPE__LANG, oldLang, lang));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.ICON_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case FacesConfigPackage.ICON_TYPE__SMALL_ICON:
-				return basicSetSmallIcon(null, msgs);
-			case FacesConfigPackage.ICON_TYPE__LARGE_ICON:
-				return basicSetLargeIcon(null, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.ICON_TYPE__SMALL_ICON:
-				return getSmallIcon();
-			case FacesConfigPackage.ICON_TYPE__LARGE_ICON:
-				return getLargeIcon();
-			case FacesConfigPackage.ICON_TYPE__LANG:
-				return getLang();
-			case FacesConfigPackage.ICON_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.ICON_TYPE__SMALL_ICON:
-				setSmallIcon((SmallIconType)newValue);
-				return;
-			case FacesConfigPackage.ICON_TYPE__LARGE_ICON:
-				setLargeIcon((LargeIconType)newValue);
-				return;
-			case FacesConfigPackage.ICON_TYPE__LANG:
-				setLang((String)newValue);
-				return;
-			case FacesConfigPackage.ICON_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.ICON_TYPE__SMALL_ICON:
-				setSmallIcon((SmallIconType)null);
-				return;
-			case FacesConfigPackage.ICON_TYPE__LARGE_ICON:
-				setLargeIcon((LargeIconType)null);
-				return;
-			case FacesConfigPackage.ICON_TYPE__LANG:
-				setLang(LANG_EDEFAULT);
-				return;
-			case FacesConfigPackage.ICON_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.ICON_TYPE__SMALL_ICON:
-				return smallIcon != null;
-			case FacesConfigPackage.ICON_TYPE__LARGE_ICON:
-				return largeIcon != null;
-			case FacesConfigPackage.ICON_TYPE__LANG:
-				return LANG_EDEFAULT == null ? lang != null : !LANG_EDEFAULT.equals(lang);
-			case FacesConfigPackage.ICON_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (lang: "); //$NON-NLS-1$
-		result.append(lang);
-		result.append(", id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //IconTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/IfTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/IfTypeImpl.java
deleted file mode 100644
index 8615aa0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/IfTypeImpl.java
+++ /dev/null
@@ -1,224 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.IfType;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>If Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.IfTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.IfTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class IfTypeImpl extends EObjectImpl implements IfType {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected IfTypeImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.IF_TYPE;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.IF_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.IF_TYPE__ID, oldId, id));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.IF_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.IF_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.IF_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.IF_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.IF_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.IF_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.IF_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.IF_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: "); //$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //IfTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/KeyClassTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/KeyClassTypeImpl.java
deleted file mode 100644
index 943a8ef..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/KeyClassTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.KeyClassType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Key Class Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.KeyClassTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.KeyClassTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class KeyClassTypeImpl extends EObjectImpl implements KeyClassType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected KeyClassTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.KEY_CLASS_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.KEY_CLASS_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.KEY_CLASS_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.KEY_CLASS_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.KEY_CLASS_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.KEY_CLASS_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.KEY_CLASS_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.KEY_CLASS_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.KEY_CLASS_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.KEY_CLASS_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.KEY_CLASS_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: "); //$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //KeyClassTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/KeyTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/KeyTypeImpl.java
deleted file mode 100644
index 3a58b50..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/KeyTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.KeyType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Key Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.KeyTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.KeyTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class KeyTypeImpl extends EObjectImpl implements KeyType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected KeyTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.KEY_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.KEY_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.KEY_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.KEY_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.KEY_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.KEY_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.KEY_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.KEY_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.KEY_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.KEY_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.KEY_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: "); //$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //KeyTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/LargeIconTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/LargeIconTypeImpl.java
deleted file mode 100644
index 153fa49..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/LargeIconTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.LargeIconType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Large Icon Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.LargeIconTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.LargeIconTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class LargeIconTypeImpl extends EObjectImpl implements LargeIconType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected LargeIconTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.LARGE_ICON_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.LARGE_ICON_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.LARGE_ICON_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.LARGE_ICON_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.LARGE_ICON_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.LARGE_ICON_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.LARGE_ICON_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.LARGE_ICON_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.LARGE_ICON_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.LARGE_ICON_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.LARGE_ICON_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: "); //$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //LargeIconTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/LifecycleExtensionTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/LifecycleExtensionTypeImpl.java
deleted file mode 100644
index 19262a0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/LifecycleExtensionTypeImpl.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.LifecycleExtensionType;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Lifecycle Extension Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * </p>
- *
- * @generated
- */
-public class LifecycleExtensionTypeImpl extends ExtensionTypeImpl implements LifecycleExtensionType {
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    @SuppressWarnings("hiding")
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected LifecycleExtensionTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.LIFECYCLE_EXTENSION_TYPE;
-	}
-
-} //LifecycleExtensionTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/LifecycleFactoryTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/LifecycleFactoryTypeImpl.java
deleted file mode 100644
index 562c38c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/LifecycleFactoryTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.LifecycleFactoryType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Lifecycle Factory Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.LifecycleFactoryTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.LifecycleFactoryTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class LifecycleFactoryTypeImpl extends EObjectImpl implements LifecycleFactoryType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected LifecycleFactoryTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.LIFECYCLE_FACTORY_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.LIFECYCLE_FACTORY_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.LIFECYCLE_FACTORY_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.LIFECYCLE_FACTORY_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.LIFECYCLE_FACTORY_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.LIFECYCLE_FACTORY_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.LIFECYCLE_FACTORY_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.LIFECYCLE_FACTORY_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.LIFECYCLE_FACTORY_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.LIFECYCLE_FACTORY_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.LIFECYCLE_FACTORY_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: "); //$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //LifecycleFactoryTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/LifecycleTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/LifecycleTypeImpl.java
deleted file mode 100644
index a01a5f6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/LifecycleTypeImpl.java
+++ /dev/null
@@ -1,263 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.LifecycleExtensionType;
-import org.eclipse.jst.jsf.facesconfig.emf.LifecycleType;
-import org.eclipse.jst.jsf.facesconfig.emf.PhaseListenerType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Lifecycle Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.LifecycleTypeImpl#getPhaseListener <em>Phase Listener</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.LifecycleTypeImpl#getLifecycleExtension <em>Lifecycle Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.LifecycleTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class LifecycleTypeImpl extends EObjectImpl implements LifecycleType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The cached value of the '{@link #getPhaseListener() <em>Phase Listener</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPhaseListener()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList phaseListener;
-
-    /**
-	 * The cached value of the '{@link #getLifecycleExtension() <em>Lifecycle Extension</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see #getLifecycleExtension()
-	 * @generated
-	 * @ordered
-	 */
-    protected EList lifecycleExtension;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected LifecycleTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.LIFECYCLE_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getPhaseListener() {
-		if (phaseListener == null) {
-			phaseListener = new EObjectContainmentEList(PhaseListenerType.class, this, FacesConfigPackage.LIFECYCLE_TYPE__PHASE_LISTENER);
-		}
-		return phaseListener;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EList getLifecycleExtension() {
-		if (lifecycleExtension == null) {
-			lifecycleExtension = new EObjectContainmentEList(LifecycleExtensionType.class, this, FacesConfigPackage.LIFECYCLE_TYPE__LIFECYCLE_EXTENSION);
-		}
-		return lifecycleExtension;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.LIFECYCLE_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case FacesConfigPackage.LIFECYCLE_TYPE__PHASE_LISTENER:
-				return ((InternalEList)getPhaseListener()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.LIFECYCLE_TYPE__LIFECYCLE_EXTENSION:
-				return ((InternalEList)getLifecycleExtension()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.LIFECYCLE_TYPE__PHASE_LISTENER:
-				return getPhaseListener();
-			case FacesConfigPackage.LIFECYCLE_TYPE__LIFECYCLE_EXTENSION:
-				return getLifecycleExtension();
-			case FacesConfigPackage.LIFECYCLE_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.LIFECYCLE_TYPE__PHASE_LISTENER:
-				getPhaseListener().clear();
-				getPhaseListener().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.LIFECYCLE_TYPE__LIFECYCLE_EXTENSION:
-				getLifecycleExtension().clear();
-				getLifecycleExtension().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.LIFECYCLE_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.LIFECYCLE_TYPE__PHASE_LISTENER:
-				getPhaseListener().clear();
-				return;
-			case FacesConfigPackage.LIFECYCLE_TYPE__LIFECYCLE_EXTENSION:
-				getLifecycleExtension().clear();
-				return;
-			case FacesConfigPackage.LIFECYCLE_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.LIFECYCLE_TYPE__PHASE_LISTENER:
-				return phaseListener != null && !phaseListener.isEmpty();
-			case FacesConfigPackage.LIFECYCLE_TYPE__LIFECYCLE_EXTENSION:
-				return lifecycleExtension != null && !lifecycleExtension.isEmpty();
-			case FacesConfigPackage.LIFECYCLE_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //LifecycleTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ListEntriesTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ListEntriesTypeImpl.java
deleted file mode 100644
index fd40f96..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ListEntriesTypeImpl.java
+++ /dev/null
@@ -1,333 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ListEntriesType;
-import org.eclipse.jst.jsf.facesconfig.emf.NullValueType;
-import org.eclipse.jst.jsf.facesconfig.emf.ValueClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.ValueType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>List Entries Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ListEntriesTypeImpl#getValueClass <em>Value Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ListEntriesTypeImpl#getNullValue <em>Null Value</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ListEntriesTypeImpl#getValue <em>Value</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ListEntriesTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ListEntriesTypeImpl extends EObjectImpl implements ListEntriesType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The cached value of the '{@link #getValueClass() <em>Value Class</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getValueClass()
-	 * @generated
-	 * @ordered
-	 */
-	protected ValueClassType valueClass;
-
-    /**
-	 * The cached value of the '{@link #getNullValue() <em>Null Value</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getNullValue()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList nullValue;
-
-    /**
-	 * The cached value of the '{@link #getValue() <em>Value</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getValue()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList value;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ListEntriesTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.LIST_ENTRIES_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ValueClassType getValueClass() {
-		return valueClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newValueClass 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetValueClass(ValueClassType newValueClass, NotificationChain msgs) {
-		ValueClassType oldValueClass = valueClass;
-		valueClass = newValueClass;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.LIST_ENTRIES_TYPE__VALUE_CLASS, oldValueClass, newValueClass);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setValueClass(ValueClassType newValueClass) {
-		if (newValueClass != valueClass) {
-			NotificationChain msgs = null;
-			if (valueClass != null)
-				msgs = ((InternalEObject)valueClass).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.LIST_ENTRIES_TYPE__VALUE_CLASS, null, msgs);
-			if (newValueClass != null)
-				msgs = ((InternalEObject)newValueClass).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.LIST_ENTRIES_TYPE__VALUE_CLASS, null, msgs);
-			msgs = basicSetValueClass(newValueClass, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.LIST_ENTRIES_TYPE__VALUE_CLASS, newValueClass, newValueClass));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getNullValue() {
-		if (nullValue == null) {
-			nullValue = new EObjectContainmentEList(NullValueType.class, this, FacesConfigPackage.LIST_ENTRIES_TYPE__NULL_VALUE);
-		}
-		return nullValue;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getValue() {
-		if (value == null) {
-			value = new EObjectContainmentEList(ValueType.class, this, FacesConfigPackage.LIST_ENTRIES_TYPE__VALUE);
-		}
-		return value;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.LIST_ENTRIES_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case FacesConfigPackage.LIST_ENTRIES_TYPE__VALUE_CLASS:
-				return basicSetValueClass(null, msgs);
-			case FacesConfigPackage.LIST_ENTRIES_TYPE__NULL_VALUE:
-				return ((InternalEList)getNullValue()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.LIST_ENTRIES_TYPE__VALUE:
-				return ((InternalEList)getValue()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.LIST_ENTRIES_TYPE__VALUE_CLASS:
-				return getValueClass();
-			case FacesConfigPackage.LIST_ENTRIES_TYPE__NULL_VALUE:
-				return getNullValue();
-			case FacesConfigPackage.LIST_ENTRIES_TYPE__VALUE:
-				return getValue();
-			case FacesConfigPackage.LIST_ENTRIES_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.LIST_ENTRIES_TYPE__VALUE_CLASS:
-				setValueClass((ValueClassType)newValue);
-				return;
-			case FacesConfigPackage.LIST_ENTRIES_TYPE__NULL_VALUE:
-				getNullValue().clear();
-				getNullValue().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.LIST_ENTRIES_TYPE__VALUE:
-				getValue().clear();
-				getValue().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.LIST_ENTRIES_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.LIST_ENTRIES_TYPE__VALUE_CLASS:
-				setValueClass((ValueClassType)null);
-				return;
-			case FacesConfigPackage.LIST_ENTRIES_TYPE__NULL_VALUE:
-				getNullValue().clear();
-				return;
-			case FacesConfigPackage.LIST_ENTRIES_TYPE__VALUE:
-				getValue().clear();
-				return;
-			case FacesConfigPackage.LIST_ENTRIES_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.LIST_ENTRIES_TYPE__VALUE_CLASS:
-				return valueClass != null;
-			case FacesConfigPackage.LIST_ENTRIES_TYPE__NULL_VALUE:
-				return nullValue != null && !nullValue.isEmpty();
-			case FacesConfigPackage.LIST_ENTRIES_TYPE__VALUE:
-				return value != null && !value.isEmpty();
-			case FacesConfigPackage.LIST_ENTRIES_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ListEntriesTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/LocaleConfigTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/LocaleConfigTypeImpl.java
deleted file mode 100644
index 9f17d16..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/LocaleConfigTypeImpl.java
+++ /dev/null
@@ -1,296 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.facesconfig.emf.DefaultLocaleType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.LocaleConfigType;
-import org.eclipse.jst.jsf.facesconfig.emf.SupportedLocaleType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Locale Config Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.LocaleConfigTypeImpl#getDefaultLocale <em>Default Locale</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.LocaleConfigTypeImpl#getSupportedLocale <em>Supported Locale</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.LocaleConfigTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class LocaleConfigTypeImpl extends EObjectImpl implements LocaleConfigType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The cached value of the '{@link #getDefaultLocale() <em>Default Locale</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDefaultLocale()
-	 * @generated
-	 * @ordered
-	 */
-	protected DefaultLocaleType defaultLocale;
-
-    /**
-	 * The cached value of the '{@link #getSupportedLocale() <em>Supported Locale</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getSupportedLocale()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList supportedLocale;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected LocaleConfigTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.LOCALE_CONFIG_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public DefaultLocaleType getDefaultLocale() {
-		return defaultLocale;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newDefaultLocale 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetDefaultLocale(DefaultLocaleType newDefaultLocale, NotificationChain msgs) {
-		DefaultLocaleType oldDefaultLocale = defaultLocale;
-		defaultLocale = newDefaultLocale;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.LOCALE_CONFIG_TYPE__DEFAULT_LOCALE, oldDefaultLocale, newDefaultLocale);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setDefaultLocale(DefaultLocaleType newDefaultLocale) {
-		if (newDefaultLocale != defaultLocale) {
-			NotificationChain msgs = null;
-			if (defaultLocale != null)
-				msgs = ((InternalEObject)defaultLocale).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.LOCALE_CONFIG_TYPE__DEFAULT_LOCALE, null, msgs);
-			if (newDefaultLocale != null)
-				msgs = ((InternalEObject)newDefaultLocale).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.LOCALE_CONFIG_TYPE__DEFAULT_LOCALE, null, msgs);
-			msgs = basicSetDefaultLocale(newDefaultLocale, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.LOCALE_CONFIG_TYPE__DEFAULT_LOCALE, newDefaultLocale, newDefaultLocale));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getSupportedLocale() {
-		if (supportedLocale == null) {
-			supportedLocale = new EObjectContainmentEList(SupportedLocaleType.class, this, FacesConfigPackage.LOCALE_CONFIG_TYPE__SUPPORTED_LOCALE);
-		}
-		return supportedLocale;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.LOCALE_CONFIG_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case FacesConfigPackage.LOCALE_CONFIG_TYPE__DEFAULT_LOCALE:
-				return basicSetDefaultLocale(null, msgs);
-			case FacesConfigPackage.LOCALE_CONFIG_TYPE__SUPPORTED_LOCALE:
-				return ((InternalEList)getSupportedLocale()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.LOCALE_CONFIG_TYPE__DEFAULT_LOCALE:
-				return getDefaultLocale();
-			case FacesConfigPackage.LOCALE_CONFIG_TYPE__SUPPORTED_LOCALE:
-				return getSupportedLocale();
-			case FacesConfigPackage.LOCALE_CONFIG_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.LOCALE_CONFIG_TYPE__DEFAULT_LOCALE:
-				setDefaultLocale((DefaultLocaleType)newValue);
-				return;
-			case FacesConfigPackage.LOCALE_CONFIG_TYPE__SUPPORTED_LOCALE:
-				getSupportedLocale().clear();
-				getSupportedLocale().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.LOCALE_CONFIG_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.LOCALE_CONFIG_TYPE__DEFAULT_LOCALE:
-				setDefaultLocale((DefaultLocaleType)null);
-				return;
-			case FacesConfigPackage.LOCALE_CONFIG_TYPE__SUPPORTED_LOCALE:
-				getSupportedLocale().clear();
-				return;
-			case FacesConfigPackage.LOCALE_CONFIG_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.LOCALE_CONFIG_TYPE__DEFAULT_LOCALE:
-				return defaultLocale != null;
-			case FacesConfigPackage.LOCALE_CONFIG_TYPE__SUPPORTED_LOCALE:
-				return supportedLocale != null && !supportedLocale.isEmpty();
-			case FacesConfigPackage.LOCALE_CONFIG_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //LocaleConfigTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ManagedBeanClassTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ManagedBeanClassTypeImpl.java
deleted file mode 100644
index 0e48234..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ManagedBeanClassTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanClassType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Managed Bean Class Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanClassTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanClassTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ManagedBeanClassTypeImpl extends EObjectImpl implements ManagedBeanClassType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ManagedBeanClassTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.MANAGED_BEAN_CLASS_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MANAGED_BEAN_CLASS_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MANAGED_BEAN_CLASS_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.MANAGED_BEAN_CLASS_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.MANAGED_BEAN_CLASS_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.MANAGED_BEAN_CLASS_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.MANAGED_BEAN_CLASS_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.MANAGED_BEAN_CLASS_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.MANAGED_BEAN_CLASS_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.MANAGED_BEAN_CLASS_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.MANAGED_BEAN_CLASS_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: "); //$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ManagedBeanClassTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ManagedBeanExtensionTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ManagedBeanExtensionTypeImpl.java
deleted file mode 100644
index e8f3be1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ManagedBeanExtensionTypeImpl.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanExtensionType;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Managed Bean Extension Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * </p>
- *
- * @generated
- */
-public class ManagedBeanExtensionTypeImpl extends ExtensionTypeImpl implements ManagedBeanExtensionType {
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    @SuppressWarnings("hiding")
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected ManagedBeanExtensionTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.MANAGED_BEAN_EXTENSION_TYPE;
-	}
-
-} //ManagedBeanExtensionTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ManagedBeanNameTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ManagedBeanNameTypeImpl.java
deleted file mode 100644
index 202ab74..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ManagedBeanNameTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanNameType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Managed Bean Name Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanNameTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanNameTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ManagedBeanNameTypeImpl extends EObjectImpl implements ManagedBeanNameType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ManagedBeanNameTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.MANAGED_BEAN_NAME_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MANAGED_BEAN_NAME_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MANAGED_BEAN_NAME_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.MANAGED_BEAN_NAME_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.MANAGED_BEAN_NAME_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.MANAGED_BEAN_NAME_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.MANAGED_BEAN_NAME_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.MANAGED_BEAN_NAME_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.MANAGED_BEAN_NAME_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.MANAGED_BEAN_NAME_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.MANAGED_BEAN_NAME_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: "); //$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ManagedBeanNameTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ManagedBeanScopeTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ManagedBeanScopeTypeImpl.java
deleted file mode 100644
index 3091a77..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ManagedBeanScopeTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanScopeType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Managed Bean Scope Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanScopeTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanScopeTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ManagedBeanScopeTypeImpl extends EObjectImpl implements ManagedBeanScopeType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ManagedBeanScopeTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.MANAGED_BEAN_SCOPE_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MANAGED_BEAN_SCOPE_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MANAGED_BEAN_SCOPE_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.MANAGED_BEAN_SCOPE_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.MANAGED_BEAN_SCOPE_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.MANAGED_BEAN_SCOPE_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.MANAGED_BEAN_SCOPE_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.MANAGED_BEAN_SCOPE_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.MANAGED_BEAN_SCOPE_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.MANAGED_BEAN_SCOPE_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.MANAGED_BEAN_SCOPE_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: "); //$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ManagedBeanScopeTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ManagedBeanTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ManagedBeanTypeImpl.java
deleted file mode 100644
index 4a21aa8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ManagedBeanTypeImpl.java
+++ /dev/null
@@ -1,778 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.facesconfig.emf.DescriptionType;
-import org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.IconType;
-import org.eclipse.jst.jsf.facesconfig.emf.ListEntriesType;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanExtensionType;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanScopeType;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType;
-import org.eclipse.jst.jsf.facesconfig.emf.MapEntriesType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Managed Bean Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanTypeImpl#getDescription <em>Description</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanTypeImpl#getDisplayName <em>Display Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanTypeImpl#getIcon <em>Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanTypeImpl#getManagedBeanName <em>Managed Bean Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanTypeImpl#getManagedBeanClass <em>Managed Bean Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanTypeImpl#getManagedBeanScope <em>Managed Bean Scope</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanTypeImpl#getManagedProperty <em>Managed Property</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanTypeImpl#getMapEntries <em>Map Entries</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanTypeImpl#getListEntries <em>List Entries</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanTypeImpl#getManagedBeanExtension <em>Managed Bean Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanTypeImpl#getId <em>Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanTypeImpl#isEager <em>Eager</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ManagedBeanTypeImpl extends EObjectImpl implements ManagedBeanType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The cached value of the '{@link #getDescription() <em>Description</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDescription()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList description;
-
-    /**
-	 * The cached value of the '{@link #getDisplayName() <em>Display Name</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDisplayName()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList displayName;
-
-    /**
-	 * The cached value of the '{@link #getIcon() <em>Icon</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getIcon()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList icon;
-
-    /**
-	 * The cached value of the '{@link #getManagedBeanName() <em>Managed Bean Name</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getManagedBeanName()
-	 * @generated
-	 * @ordered
-	 */
-	protected ManagedBeanNameType managedBeanName;
-
-    /**
-	 * The cached value of the '{@link #getManagedBeanClass() <em>Managed Bean Class</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getManagedBeanClass()
-	 * @generated
-	 * @ordered
-	 */
-	protected ManagedBeanClassType managedBeanClass;
-
-    /**
-	 * The cached value of the '{@link #getManagedBeanScope() <em>Managed Bean Scope</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getManagedBeanScope()
-	 * @generated
-	 * @ordered
-	 */
-	protected ManagedBeanScopeType managedBeanScope;
-
-    /**
-	 * The cached value of the '{@link #getManagedProperty() <em>Managed Property</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getManagedProperty()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList managedProperty;
-
-    /**
-	 * The cached value of the '{@link #getMapEntries() <em>Map Entries</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getMapEntries()
-	 * @generated
-	 * @ordered
-	 */
-	protected MapEntriesType mapEntries;
-
-    /**
-	 * The cached value of the '{@link #getListEntries() <em>List Entries</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getListEntries()
-	 * @generated
-	 * @ordered
-	 */
-	protected ListEntriesType listEntries;
-
-    /**
-	 * The cached value of the '{@link #getManagedBeanExtension() <em>Managed Bean Extension</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see #getManagedBeanExtension()
-	 * @generated
-	 * @ordered
-	 */
-    protected EList managedBeanExtension;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #isEager() <em>Eager</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isEager()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean EAGER_EDEFAULT = false;
-
-				/**
-	 * The cached value of the '{@link #isEager() <em>Eager</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isEager()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean eager = EAGER_EDEFAULT;
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ManagedBeanTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.MANAGED_BEAN_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getDescription() {
-		if (description == null) {
-			description = new EObjectContainmentEList(DescriptionType.class, this, FacesConfigPackage.MANAGED_BEAN_TYPE__DESCRIPTION);
-		}
-		return description;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getDisplayName() {
-		if (displayName == null) {
-			displayName = new EObjectContainmentEList(DisplayNameType.class, this, FacesConfigPackage.MANAGED_BEAN_TYPE__DISPLAY_NAME);
-		}
-		return displayName;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getIcon() {
-		if (icon == null) {
-			icon = new EObjectContainmentEList(IconType.class, this, FacesConfigPackage.MANAGED_BEAN_TYPE__ICON);
-		}
-		return icon;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ManagedBeanNameType getManagedBeanName() {
-		return managedBeanName;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newManagedBeanName 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetManagedBeanName(ManagedBeanNameType newManagedBeanName, NotificationChain msgs) {
-		ManagedBeanNameType oldManagedBeanName = managedBeanName;
-		managedBeanName = newManagedBeanName;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_BEAN_NAME, oldManagedBeanName, newManagedBeanName);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setManagedBeanName(ManagedBeanNameType newManagedBeanName) {
-		if (newManagedBeanName != managedBeanName) {
-			NotificationChain msgs = null;
-			if (managedBeanName != null)
-				msgs = ((InternalEObject)managedBeanName).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_BEAN_NAME, null, msgs);
-			if (newManagedBeanName != null)
-				msgs = ((InternalEObject)newManagedBeanName).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_BEAN_NAME, null, msgs);
-			msgs = basicSetManagedBeanName(newManagedBeanName, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_BEAN_NAME, newManagedBeanName, newManagedBeanName));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ManagedBeanClassType getManagedBeanClass() {
-		return managedBeanClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newManagedBeanClass 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetManagedBeanClass(ManagedBeanClassType newManagedBeanClass, NotificationChain msgs) {
-		ManagedBeanClassType oldManagedBeanClass = managedBeanClass;
-		managedBeanClass = newManagedBeanClass;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_BEAN_CLASS, oldManagedBeanClass, newManagedBeanClass);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setManagedBeanClass(ManagedBeanClassType newManagedBeanClass) {
-		if (newManagedBeanClass != managedBeanClass) {
-			NotificationChain msgs = null;
-			if (managedBeanClass != null)
-				msgs = ((InternalEObject)managedBeanClass).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_BEAN_CLASS, null, msgs);
-			if (newManagedBeanClass != null)
-				msgs = ((InternalEObject)newManagedBeanClass).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_BEAN_CLASS, null, msgs);
-			msgs = basicSetManagedBeanClass(newManagedBeanClass, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_BEAN_CLASS, newManagedBeanClass, newManagedBeanClass));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ManagedBeanScopeType getManagedBeanScope() {
-		return managedBeanScope;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newManagedBeanScope 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetManagedBeanScope(ManagedBeanScopeType newManagedBeanScope, NotificationChain msgs) {
-		ManagedBeanScopeType oldManagedBeanScope = managedBeanScope;
-		managedBeanScope = newManagedBeanScope;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_BEAN_SCOPE, oldManagedBeanScope, newManagedBeanScope);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setManagedBeanScope(ManagedBeanScopeType newManagedBeanScope) {
-		if (newManagedBeanScope != managedBeanScope) {
-			NotificationChain msgs = null;
-			if (managedBeanScope != null)
-				msgs = ((InternalEObject)managedBeanScope).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_BEAN_SCOPE, null, msgs);
-			if (newManagedBeanScope != null)
-				msgs = ((InternalEObject)newManagedBeanScope).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_BEAN_SCOPE, null, msgs);
-			msgs = basicSetManagedBeanScope(newManagedBeanScope, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_BEAN_SCOPE, newManagedBeanScope, newManagedBeanScope));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getManagedProperty() {
-		if (managedProperty == null) {
-			managedProperty = new EObjectContainmentEList(ManagedPropertyType.class, this, FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_PROPERTY);
-		}
-		return managedProperty;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public MapEntriesType getMapEntries() {
-		return mapEntries;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newMapEntries 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetMapEntries(MapEntriesType newMapEntries, NotificationChain msgs) {
-		MapEntriesType oldMapEntries = mapEntries;
-		mapEntries = newMapEntries;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MANAGED_BEAN_TYPE__MAP_ENTRIES, oldMapEntries, newMapEntries);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setMapEntries(MapEntriesType newMapEntries) {
-		if (newMapEntries != mapEntries) {
-			NotificationChain msgs = null;
-			if (mapEntries != null)
-				msgs = ((InternalEObject)mapEntries).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.MANAGED_BEAN_TYPE__MAP_ENTRIES, null, msgs);
-			if (newMapEntries != null)
-				msgs = ((InternalEObject)newMapEntries).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.MANAGED_BEAN_TYPE__MAP_ENTRIES, null, msgs);
-			msgs = basicSetMapEntries(newMapEntries, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MANAGED_BEAN_TYPE__MAP_ENTRIES, newMapEntries, newMapEntries));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ListEntriesType getListEntries() {
-		return listEntries;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newListEntries 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetListEntries(ListEntriesType newListEntries, NotificationChain msgs) {
-		ListEntriesType oldListEntries = listEntries;
-		listEntries = newListEntries;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MANAGED_BEAN_TYPE__LIST_ENTRIES, oldListEntries, newListEntries);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setListEntries(ListEntriesType newListEntries) {
-		if (newListEntries != listEntries) {
-			NotificationChain msgs = null;
-			if (listEntries != null)
-				msgs = ((InternalEObject)listEntries).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.MANAGED_BEAN_TYPE__LIST_ENTRIES, null, msgs);
-			if (newListEntries != null)
-				msgs = ((InternalEObject)newListEntries).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.MANAGED_BEAN_TYPE__LIST_ENTRIES, null, msgs);
-			msgs = basicSetListEntries(newListEntries, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MANAGED_BEAN_TYPE__LIST_ENTRIES, newListEntries, newListEntries));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EList getManagedBeanExtension() {
-		if (managedBeanExtension == null) {
-			managedBeanExtension = new EObjectContainmentEList(ManagedBeanExtensionType.class, this, FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_BEAN_EXTENSION);
-		}
-		return managedBeanExtension;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MANAGED_BEAN_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isEager() {
-		return eager;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setEager(boolean newEager) {
-		boolean oldEager = eager;
-		eager = newEager;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MANAGED_BEAN_TYPE__EAGER, oldEager, eager));
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__DESCRIPTION:
-				return ((InternalEList)getDescription()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__DISPLAY_NAME:
-				return ((InternalEList)getDisplayName()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__ICON:
-				return ((InternalEList)getIcon()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_BEAN_NAME:
-				return basicSetManagedBeanName(null, msgs);
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_BEAN_CLASS:
-				return basicSetManagedBeanClass(null, msgs);
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_BEAN_SCOPE:
-				return basicSetManagedBeanScope(null, msgs);
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_PROPERTY:
-				return ((InternalEList)getManagedProperty()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__MAP_ENTRIES:
-				return basicSetMapEntries(null, msgs);
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__LIST_ENTRIES:
-				return basicSetListEntries(null, msgs);
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_BEAN_EXTENSION:
-				return ((InternalEList)getManagedBeanExtension()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__DESCRIPTION:
-				return getDescription();
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__DISPLAY_NAME:
-				return getDisplayName();
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__ICON:
-				return getIcon();
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_BEAN_NAME:
-				return getManagedBeanName();
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_BEAN_CLASS:
-				return getManagedBeanClass();
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_BEAN_SCOPE:
-				return getManagedBeanScope();
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_PROPERTY:
-				return getManagedProperty();
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__MAP_ENTRIES:
-				return getMapEntries();
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__LIST_ENTRIES:
-				return getListEntries();
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_BEAN_EXTENSION:
-				return getManagedBeanExtension();
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__ID:
-				return getId();
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__EAGER:
-				return isEager() ? Boolean.TRUE : Boolean.FALSE;
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__DESCRIPTION:
-				getDescription().clear();
-				getDescription().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__DISPLAY_NAME:
-				getDisplayName().clear();
-				getDisplayName().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__ICON:
-				getIcon().clear();
-				getIcon().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_BEAN_NAME:
-				setManagedBeanName((ManagedBeanNameType)newValue);
-				return;
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_BEAN_CLASS:
-				setManagedBeanClass((ManagedBeanClassType)newValue);
-				return;
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_BEAN_SCOPE:
-				setManagedBeanScope((ManagedBeanScopeType)newValue);
-				return;
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_PROPERTY:
-				getManagedProperty().clear();
-				getManagedProperty().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__MAP_ENTRIES:
-				setMapEntries((MapEntriesType)newValue);
-				return;
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__LIST_ENTRIES:
-				setListEntries((ListEntriesType)newValue);
-				return;
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_BEAN_EXTENSION:
-				getManagedBeanExtension().clear();
-				getManagedBeanExtension().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__ID:
-				setId((String)newValue);
-				return;
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__EAGER:
-				setEager(((Boolean)newValue).booleanValue());
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__DESCRIPTION:
-				getDescription().clear();
-				return;
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__DISPLAY_NAME:
-				getDisplayName().clear();
-				return;
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__ICON:
-				getIcon().clear();
-				return;
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_BEAN_NAME:
-				setManagedBeanName((ManagedBeanNameType)null);
-				return;
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_BEAN_CLASS:
-				setManagedBeanClass((ManagedBeanClassType)null);
-				return;
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_BEAN_SCOPE:
-				setManagedBeanScope((ManagedBeanScopeType)null);
-				return;
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_PROPERTY:
-				getManagedProperty().clear();
-				return;
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__MAP_ENTRIES:
-				setMapEntries((MapEntriesType)null);
-				return;
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__LIST_ENTRIES:
-				setListEntries((ListEntriesType)null);
-				return;
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_BEAN_EXTENSION:
-				getManagedBeanExtension().clear();
-				return;
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__EAGER:
-				setEager(EAGER_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__DESCRIPTION:
-				return description != null && !description.isEmpty();
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__DISPLAY_NAME:
-				return displayName != null && !displayName.isEmpty();
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__ICON:
-				return icon != null && !icon.isEmpty();
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_BEAN_NAME:
-				return managedBeanName != null;
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_BEAN_CLASS:
-				return managedBeanClass != null;
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_BEAN_SCOPE:
-				return managedBeanScope != null;
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_PROPERTY:
-				return managedProperty != null && !managedProperty.isEmpty();
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__MAP_ENTRIES:
-				return mapEntries != null;
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__LIST_ENTRIES:
-				return listEntries != null;
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_BEAN_EXTENSION:
-				return managedBeanExtension != null && !managedBeanExtension.isEmpty();
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__EAGER:
-				return eager != EAGER_EDEFAULT;
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(", eager: "); //$NON-NLS-1$
-		result.append(eager);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ManagedBeanTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ManagedPropertyTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ManagedPropertyTypeImpl.java
deleted file mode 100644
index 979e640..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ManagedPropertyTypeImpl.java
+++ /dev/null
@@ -1,720 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.facesconfig.emf.DescriptionType;
-import org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.IconType;
-import org.eclipse.jst.jsf.facesconfig.emf.ListEntriesType;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType;
-import org.eclipse.jst.jsf.facesconfig.emf.MapEntriesType;
-import org.eclipse.jst.jsf.facesconfig.emf.NullValueType;
-import org.eclipse.jst.jsf.facesconfig.emf.PropertyClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.PropertyNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.ValueType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Managed Property Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedPropertyTypeImpl#getDescription <em>Description</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedPropertyTypeImpl#getDisplayName <em>Display Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedPropertyTypeImpl#getIcon <em>Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedPropertyTypeImpl#getPropertyName <em>Property Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedPropertyTypeImpl#getPropertyClass <em>Property Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedPropertyTypeImpl#getMapEntries <em>Map Entries</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedPropertyTypeImpl#getNullValue <em>Null Value</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedPropertyTypeImpl#getValue <em>Value</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedPropertyTypeImpl#getListEntries <em>List Entries</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedPropertyTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ManagedPropertyTypeImpl extends EObjectImpl implements ManagedPropertyType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The cached value of the '{@link #getDescription() <em>Description</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDescription()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList description;
-
-    /**
-	 * The cached value of the '{@link #getDisplayName() <em>Display Name</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDisplayName()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList displayName;
-
-    /**
-	 * The cached value of the '{@link #getIcon() <em>Icon</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getIcon()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList icon;
-
-    /**
-	 * The cached value of the '{@link #getPropertyName() <em>Property Name</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPropertyName()
-	 * @generated
-	 * @ordered
-	 */
-	protected PropertyNameType propertyName;
-
-    /**
-	 * The cached value of the '{@link #getPropertyClass() <em>Property Class</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPropertyClass()
-	 * @generated
-	 * @ordered
-	 */
-	protected PropertyClassType propertyClass;
-
-    /**
-	 * The cached value of the '{@link #getMapEntries() <em>Map Entries</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getMapEntries()
-	 * @generated
-	 * @ordered
-	 */
-	protected MapEntriesType mapEntries;
-
-    /**
-	 * The cached value of the '{@link #getNullValue() <em>Null Value</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getNullValue()
-	 * @generated
-	 * @ordered
-	 */
-	protected NullValueType nullValue;
-
-    /**
-	 * The cached value of the '{@link #getValue() <em>Value</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getValue()
-	 * @generated
-	 * @ordered
-	 */
-	protected ValueType value;
-
-    /**
-	 * The cached value of the '{@link #getListEntries() <em>List Entries</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getListEntries()
-	 * @generated
-	 * @ordered
-	 */
-	protected ListEntriesType listEntries;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ManagedPropertyTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.MANAGED_PROPERTY_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getDescription() {
-		if (description == null) {
-			description = new EObjectContainmentEList(DescriptionType.class, this, FacesConfigPackage.MANAGED_PROPERTY_TYPE__DESCRIPTION);
-		}
-		return description;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getDisplayName() {
-		if (displayName == null) {
-			displayName = new EObjectContainmentEList(DisplayNameType.class, this, FacesConfigPackage.MANAGED_PROPERTY_TYPE__DISPLAY_NAME);
-		}
-		return displayName;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getIcon() {
-		if (icon == null) {
-			icon = new EObjectContainmentEList(IconType.class, this, FacesConfigPackage.MANAGED_PROPERTY_TYPE__ICON);
-		}
-		return icon;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public PropertyNameType getPropertyName() {
-		return propertyName;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newPropertyName 
-     * @param msgs 
-     * @return  the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetPropertyName(PropertyNameType newPropertyName, NotificationChain msgs) {
-		PropertyNameType oldPropertyName = propertyName;
-		propertyName = newPropertyName;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MANAGED_PROPERTY_TYPE__PROPERTY_NAME, oldPropertyName, newPropertyName);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setPropertyName(PropertyNameType newPropertyName) {
-		if (newPropertyName != propertyName) {
-			NotificationChain msgs = null;
-			if (propertyName != null)
-				msgs = ((InternalEObject)propertyName).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.MANAGED_PROPERTY_TYPE__PROPERTY_NAME, null, msgs);
-			if (newPropertyName != null)
-				msgs = ((InternalEObject)newPropertyName).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.MANAGED_PROPERTY_TYPE__PROPERTY_NAME, null, msgs);
-			msgs = basicSetPropertyName(newPropertyName, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MANAGED_PROPERTY_TYPE__PROPERTY_NAME, newPropertyName, newPropertyName));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public PropertyClassType getPropertyClass() {
-		return propertyClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newPropertyClass 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetPropertyClass(PropertyClassType newPropertyClass, NotificationChain msgs) {
-		PropertyClassType oldPropertyClass = propertyClass;
-		propertyClass = newPropertyClass;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MANAGED_PROPERTY_TYPE__PROPERTY_CLASS, oldPropertyClass, newPropertyClass);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setPropertyClass(PropertyClassType newPropertyClass) {
-		if (newPropertyClass != propertyClass) {
-			NotificationChain msgs = null;
-			if (propertyClass != null)
-				msgs = ((InternalEObject)propertyClass).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.MANAGED_PROPERTY_TYPE__PROPERTY_CLASS, null, msgs);
-			if (newPropertyClass != null)
-				msgs = ((InternalEObject)newPropertyClass).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.MANAGED_PROPERTY_TYPE__PROPERTY_CLASS, null, msgs);
-			msgs = basicSetPropertyClass(newPropertyClass, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MANAGED_PROPERTY_TYPE__PROPERTY_CLASS, newPropertyClass, newPropertyClass));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public MapEntriesType getMapEntries() {
-		return mapEntries;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newMapEntries 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetMapEntries(MapEntriesType newMapEntries, NotificationChain msgs) {
-		MapEntriesType oldMapEntries = mapEntries;
-		mapEntries = newMapEntries;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MANAGED_PROPERTY_TYPE__MAP_ENTRIES, oldMapEntries, newMapEntries);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setMapEntries(MapEntriesType newMapEntries) {
-		if (newMapEntries != mapEntries) {
-			NotificationChain msgs = null;
-			if (mapEntries != null)
-				msgs = ((InternalEObject)mapEntries).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.MANAGED_PROPERTY_TYPE__MAP_ENTRIES, null, msgs);
-			if (newMapEntries != null)
-				msgs = ((InternalEObject)newMapEntries).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.MANAGED_PROPERTY_TYPE__MAP_ENTRIES, null, msgs);
-			msgs = basicSetMapEntries(newMapEntries, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MANAGED_PROPERTY_TYPE__MAP_ENTRIES, newMapEntries, newMapEntries));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NullValueType getNullValue() {
-		return nullValue;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newNullValue 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetNullValue(NullValueType newNullValue, NotificationChain msgs) {
-		NullValueType oldNullValue = nullValue;
-		nullValue = newNullValue;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MANAGED_PROPERTY_TYPE__NULL_VALUE, oldNullValue, newNullValue);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setNullValue(NullValueType newNullValue) {
-		if (newNullValue != nullValue) {
-			NotificationChain msgs = null;
-			if (nullValue != null)
-				msgs = ((InternalEObject)nullValue).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.MANAGED_PROPERTY_TYPE__NULL_VALUE, null, msgs);
-			if (newNullValue != null)
-				msgs = ((InternalEObject)newNullValue).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.MANAGED_PROPERTY_TYPE__NULL_VALUE, null, msgs);
-			msgs = basicSetNullValue(newNullValue, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MANAGED_PROPERTY_TYPE__NULL_VALUE, newNullValue, newNullValue));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ValueType getValue() {
-		return value;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newValue 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetValue(ValueType newValue, NotificationChain msgs) {
-		ValueType oldValue = value;
-		value = newValue;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MANAGED_PROPERTY_TYPE__VALUE, oldValue, newValue);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setValue(ValueType newValue) {
-		if (newValue != value) {
-			NotificationChain msgs = null;
-			if (value != null)
-				msgs = ((InternalEObject)value).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.MANAGED_PROPERTY_TYPE__VALUE, null, msgs);
-			if (newValue != null)
-				msgs = ((InternalEObject)newValue).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.MANAGED_PROPERTY_TYPE__VALUE, null, msgs);
-			msgs = basicSetValue(newValue, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MANAGED_PROPERTY_TYPE__VALUE, newValue, newValue));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ListEntriesType getListEntries() {
-		return listEntries;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newListEntries 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetListEntries(ListEntriesType newListEntries, NotificationChain msgs) {
-		ListEntriesType oldListEntries = listEntries;
-		listEntries = newListEntries;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MANAGED_PROPERTY_TYPE__LIST_ENTRIES, oldListEntries, newListEntries);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setListEntries(ListEntriesType newListEntries) {
-		if (newListEntries != listEntries) {
-			NotificationChain msgs = null;
-			if (listEntries != null)
-				msgs = ((InternalEObject)listEntries).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.MANAGED_PROPERTY_TYPE__LIST_ENTRIES, null, msgs);
-			if (newListEntries != null)
-				msgs = ((InternalEObject)newListEntries).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.MANAGED_PROPERTY_TYPE__LIST_ENTRIES, null, msgs);
-			msgs = basicSetListEntries(newListEntries, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MANAGED_PROPERTY_TYPE__LIST_ENTRIES, newListEntries, newListEntries));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MANAGED_PROPERTY_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__DESCRIPTION:
-				return ((InternalEList)getDescription()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__DISPLAY_NAME:
-				return ((InternalEList)getDisplayName()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__ICON:
-				return ((InternalEList)getIcon()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__PROPERTY_NAME:
-				return basicSetPropertyName(null, msgs);
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__PROPERTY_CLASS:
-				return basicSetPropertyClass(null, msgs);
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__MAP_ENTRIES:
-				return basicSetMapEntries(null, msgs);
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__NULL_VALUE:
-				return basicSetNullValue(null, msgs);
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__VALUE:
-				return basicSetValue(null, msgs);
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__LIST_ENTRIES:
-				return basicSetListEntries(null, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__DESCRIPTION:
-				return getDescription();
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__DISPLAY_NAME:
-				return getDisplayName();
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__ICON:
-				return getIcon();
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__PROPERTY_NAME:
-				return getPropertyName();
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__PROPERTY_CLASS:
-				return getPropertyClass();
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__MAP_ENTRIES:
-				return getMapEntries();
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__NULL_VALUE:
-				return getNullValue();
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__VALUE:
-				return getValue();
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__LIST_ENTRIES:
-				return getListEntries();
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__DESCRIPTION:
-				getDescription().clear();
-				getDescription().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__DISPLAY_NAME:
-				getDisplayName().clear();
-				getDisplayName().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__ICON:
-				getIcon().clear();
-				getIcon().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__PROPERTY_NAME:
-				setPropertyName((PropertyNameType)newValue);
-				return;
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__PROPERTY_CLASS:
-				setPropertyClass((PropertyClassType)newValue);
-				return;
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__MAP_ENTRIES:
-				setMapEntries((MapEntriesType)newValue);
-				return;
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__NULL_VALUE:
-				setNullValue((NullValueType)newValue);
-				return;
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__VALUE:
-				setValue((ValueType)newValue);
-				return;
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__LIST_ENTRIES:
-				setListEntries((ListEntriesType)newValue);
-				return;
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__DESCRIPTION:
-				getDescription().clear();
-				return;
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__DISPLAY_NAME:
-				getDisplayName().clear();
-				return;
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__ICON:
-				getIcon().clear();
-				return;
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__PROPERTY_NAME:
-				setPropertyName((PropertyNameType)null);
-				return;
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__PROPERTY_CLASS:
-				setPropertyClass((PropertyClassType)null);
-				return;
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__MAP_ENTRIES:
-				setMapEntries((MapEntriesType)null);
-				return;
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__NULL_VALUE:
-				setNullValue((NullValueType)null);
-				return;
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__VALUE:
-				setValue((ValueType)null);
-				return;
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__LIST_ENTRIES:
-				setListEntries((ListEntriesType)null);
-				return;
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__DESCRIPTION:
-				return description != null && !description.isEmpty();
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__DISPLAY_NAME:
-				return displayName != null && !displayName.isEmpty();
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__ICON:
-				return icon != null && !icon.isEmpty();
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__PROPERTY_NAME:
-				return propertyName != null;
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__PROPERTY_CLASS:
-				return propertyClass != null;
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__MAP_ENTRIES:
-				return mapEntries != null;
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__NULL_VALUE:
-				return nullValue != null;
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__VALUE:
-				return value != null;
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__LIST_ENTRIES:
-				return listEntries != null;
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ManagedPropertyTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/MapEntriesTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/MapEntriesTypeImpl.java
deleted file mode 100644
index 26efec3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/MapEntriesTypeImpl.java
+++ /dev/null
@@ -1,366 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.KeyClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.MapEntriesType;
-import org.eclipse.jst.jsf.facesconfig.emf.MapEntryType;
-import org.eclipse.jst.jsf.facesconfig.emf.ValueClassType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Map Entries Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.MapEntriesTypeImpl#getKeyClass <em>Key Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.MapEntriesTypeImpl#getValueClass <em>Value Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.MapEntriesTypeImpl#getMapEntry <em>Map Entry</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.MapEntriesTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class MapEntriesTypeImpl extends EObjectImpl implements MapEntriesType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The cached value of the '{@link #getKeyClass() <em>Key Class</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getKeyClass()
-	 * @generated
-	 * @ordered
-	 */
-	protected KeyClassType keyClass;
-
-    /**
-	 * The cached value of the '{@link #getValueClass() <em>Value Class</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getValueClass()
-	 * @generated
-	 * @ordered
-	 */
-	protected ValueClassType valueClass;
-
-    /**
-	 * The cached value of the '{@link #getMapEntry() <em>Map Entry</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getMapEntry()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList mapEntry;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected MapEntriesTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.MAP_ENTRIES_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public KeyClassType getKeyClass() {
-		return keyClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newKeyClass 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetKeyClass(KeyClassType newKeyClass, NotificationChain msgs) {
-		KeyClassType oldKeyClass = keyClass;
-		keyClass = newKeyClass;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MAP_ENTRIES_TYPE__KEY_CLASS, oldKeyClass, newKeyClass);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setKeyClass(KeyClassType newKeyClass) {
-		if (newKeyClass != keyClass) {
-			NotificationChain msgs = null;
-			if (keyClass != null)
-				msgs = ((InternalEObject)keyClass).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.MAP_ENTRIES_TYPE__KEY_CLASS, null, msgs);
-			if (newKeyClass != null)
-				msgs = ((InternalEObject)newKeyClass).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.MAP_ENTRIES_TYPE__KEY_CLASS, null, msgs);
-			msgs = basicSetKeyClass(newKeyClass, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MAP_ENTRIES_TYPE__KEY_CLASS, newKeyClass, newKeyClass));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ValueClassType getValueClass() {
-		return valueClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newValueClass 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetValueClass(ValueClassType newValueClass, NotificationChain msgs) {
-		ValueClassType oldValueClass = valueClass;
-		valueClass = newValueClass;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MAP_ENTRIES_TYPE__VALUE_CLASS, oldValueClass, newValueClass);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setValueClass(ValueClassType newValueClass) {
-		if (newValueClass != valueClass) {
-			NotificationChain msgs = null;
-			if (valueClass != null)
-				msgs = ((InternalEObject)valueClass).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.MAP_ENTRIES_TYPE__VALUE_CLASS, null, msgs);
-			if (newValueClass != null)
-				msgs = ((InternalEObject)newValueClass).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.MAP_ENTRIES_TYPE__VALUE_CLASS, null, msgs);
-			msgs = basicSetValueClass(newValueClass, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MAP_ENTRIES_TYPE__VALUE_CLASS, newValueClass, newValueClass));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getMapEntry() {
-		if (mapEntry == null) {
-			mapEntry = new EObjectContainmentEList(MapEntryType.class, this, FacesConfigPackage.MAP_ENTRIES_TYPE__MAP_ENTRY);
-		}
-		return mapEntry;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MAP_ENTRIES_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case FacesConfigPackage.MAP_ENTRIES_TYPE__KEY_CLASS:
-				return basicSetKeyClass(null, msgs);
-			case FacesConfigPackage.MAP_ENTRIES_TYPE__VALUE_CLASS:
-				return basicSetValueClass(null, msgs);
-			case FacesConfigPackage.MAP_ENTRIES_TYPE__MAP_ENTRY:
-				return ((InternalEList)getMapEntry()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.MAP_ENTRIES_TYPE__KEY_CLASS:
-				return getKeyClass();
-			case FacesConfigPackage.MAP_ENTRIES_TYPE__VALUE_CLASS:
-				return getValueClass();
-			case FacesConfigPackage.MAP_ENTRIES_TYPE__MAP_ENTRY:
-				return getMapEntry();
-			case FacesConfigPackage.MAP_ENTRIES_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.MAP_ENTRIES_TYPE__KEY_CLASS:
-				setKeyClass((KeyClassType)newValue);
-				return;
-			case FacesConfigPackage.MAP_ENTRIES_TYPE__VALUE_CLASS:
-				setValueClass((ValueClassType)newValue);
-				return;
-			case FacesConfigPackage.MAP_ENTRIES_TYPE__MAP_ENTRY:
-				getMapEntry().clear();
-				getMapEntry().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.MAP_ENTRIES_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.MAP_ENTRIES_TYPE__KEY_CLASS:
-				setKeyClass((KeyClassType)null);
-				return;
-			case FacesConfigPackage.MAP_ENTRIES_TYPE__VALUE_CLASS:
-				setValueClass((ValueClassType)null);
-				return;
-			case FacesConfigPackage.MAP_ENTRIES_TYPE__MAP_ENTRY:
-				getMapEntry().clear();
-				return;
-			case FacesConfigPackage.MAP_ENTRIES_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.MAP_ENTRIES_TYPE__KEY_CLASS:
-				return keyClass != null;
-			case FacesConfigPackage.MAP_ENTRIES_TYPE__VALUE_CLASS:
-				return valueClass != null;
-			case FacesConfigPackage.MAP_ENTRIES_TYPE__MAP_ENTRY:
-				return mapEntry != null && !mapEntry.isEmpty();
-			case FacesConfigPackage.MAP_ENTRIES_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //MapEntriesTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/MapEntryTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/MapEntryTypeImpl.java
deleted file mode 100644
index 74ceff0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/MapEntryTypeImpl.java
+++ /dev/null
@@ -1,394 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.KeyType;
-import org.eclipse.jst.jsf.facesconfig.emf.MapEntryType;
-import org.eclipse.jst.jsf.facesconfig.emf.NullValueType;
-import org.eclipse.jst.jsf.facesconfig.emf.ValueType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Map Entry Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.MapEntryTypeImpl#getKey <em>Key</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.MapEntryTypeImpl#getNullValue <em>Null Value</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.MapEntryTypeImpl#getValue <em>Value</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.MapEntryTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class MapEntryTypeImpl extends EObjectImpl implements MapEntryType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The cached value of the '{@link #getKey() <em>Key</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getKey()
-	 * @generated
-	 * @ordered
-	 */
-	protected KeyType key;
-
-    /**
-	 * The cached value of the '{@link #getNullValue() <em>Null Value</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getNullValue()
-	 * @generated
-	 * @ordered
-	 */
-	protected NullValueType nullValue;
-
-    /**
-	 * The cached value of the '{@link #getValue() <em>Value</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getValue()
-	 * @generated
-	 * @ordered
-	 */
-	protected ValueType value;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected MapEntryTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.MAP_ENTRY_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public KeyType getKey() {
-		return key;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newKey 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetKey(KeyType newKey, NotificationChain msgs) {
-		KeyType oldKey = key;
-		key = newKey;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MAP_ENTRY_TYPE__KEY, oldKey, newKey);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setKey(KeyType newKey) {
-		if (newKey != key) {
-			NotificationChain msgs = null;
-			if (key != null)
-				msgs = ((InternalEObject)key).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.MAP_ENTRY_TYPE__KEY, null, msgs);
-			if (newKey != null)
-				msgs = ((InternalEObject)newKey).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.MAP_ENTRY_TYPE__KEY, null, msgs);
-			msgs = basicSetKey(newKey, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MAP_ENTRY_TYPE__KEY, newKey, newKey));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NullValueType getNullValue() {
-		return nullValue;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newNullValue 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetNullValue(NullValueType newNullValue, NotificationChain msgs) {
-		NullValueType oldNullValue = nullValue;
-		nullValue = newNullValue;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MAP_ENTRY_TYPE__NULL_VALUE, oldNullValue, newNullValue);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setNullValue(NullValueType newNullValue) {
-		if (newNullValue != nullValue) {
-			NotificationChain msgs = null;
-			if (nullValue != null)
-				msgs = ((InternalEObject)nullValue).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.MAP_ENTRY_TYPE__NULL_VALUE, null, msgs);
-			if (newNullValue != null)
-				msgs = ((InternalEObject)newNullValue).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.MAP_ENTRY_TYPE__NULL_VALUE, null, msgs);
-			msgs = basicSetNullValue(newNullValue, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MAP_ENTRY_TYPE__NULL_VALUE, newNullValue, newNullValue));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ValueType getValue() {
-		return value;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newValue 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetValue(ValueType newValue, NotificationChain msgs) {
-		ValueType oldValue = value;
-		value = newValue;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MAP_ENTRY_TYPE__VALUE, oldValue, newValue);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setValue(ValueType newValue) {
-		if (newValue != value) {
-			NotificationChain msgs = null;
-			if (value != null)
-				msgs = ((InternalEObject)value).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.MAP_ENTRY_TYPE__VALUE, null, msgs);
-			if (newValue != null)
-				msgs = ((InternalEObject)newValue).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.MAP_ENTRY_TYPE__VALUE, null, msgs);
-			msgs = basicSetValue(newValue, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MAP_ENTRY_TYPE__VALUE, newValue, newValue));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MAP_ENTRY_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case FacesConfigPackage.MAP_ENTRY_TYPE__KEY:
-				return basicSetKey(null, msgs);
-			case FacesConfigPackage.MAP_ENTRY_TYPE__NULL_VALUE:
-				return basicSetNullValue(null, msgs);
-			case FacesConfigPackage.MAP_ENTRY_TYPE__VALUE:
-				return basicSetValue(null, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.MAP_ENTRY_TYPE__KEY:
-				return getKey();
-			case FacesConfigPackage.MAP_ENTRY_TYPE__NULL_VALUE:
-				return getNullValue();
-			case FacesConfigPackage.MAP_ENTRY_TYPE__VALUE:
-				return getValue();
-			case FacesConfigPackage.MAP_ENTRY_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.MAP_ENTRY_TYPE__KEY:
-				setKey((KeyType)newValue);
-				return;
-			case FacesConfigPackage.MAP_ENTRY_TYPE__NULL_VALUE:
-				setNullValue((NullValueType)newValue);
-				return;
-			case FacesConfigPackage.MAP_ENTRY_TYPE__VALUE:
-				setValue((ValueType)newValue);
-				return;
-			case FacesConfigPackage.MAP_ENTRY_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.MAP_ENTRY_TYPE__KEY:
-				setKey((KeyType)null);
-				return;
-			case FacesConfigPackage.MAP_ENTRY_TYPE__NULL_VALUE:
-				setNullValue((NullValueType)null);
-				return;
-			case FacesConfigPackage.MAP_ENTRY_TYPE__VALUE:
-				setValue((ValueType)null);
-				return;
-			case FacesConfigPackage.MAP_ENTRY_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.MAP_ENTRY_TYPE__KEY:
-				return key != null;
-			case FacesConfigPackage.MAP_ENTRY_TYPE__NULL_VALUE:
-				return nullValue != null;
-			case FacesConfigPackage.MAP_ENTRY_TYPE__VALUE:
-				return value != null;
-			case FacesConfigPackage.MAP_ENTRY_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //MapEntryTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/MessageBundleTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/MessageBundleTypeImpl.java
deleted file mode 100644
index 92eda01..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/MessageBundleTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.MessageBundleType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Message Bundle Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.MessageBundleTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.MessageBundleTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class MessageBundleTypeImpl extends EObjectImpl implements MessageBundleType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected MessageBundleTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.MESSAGE_BUNDLE_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MESSAGE_BUNDLE_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MESSAGE_BUNDLE_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.MESSAGE_BUNDLE_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.MESSAGE_BUNDLE_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.MESSAGE_BUNDLE_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.MESSAGE_BUNDLE_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.MESSAGE_BUNDLE_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.MESSAGE_BUNDLE_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.MESSAGE_BUNDLE_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.MESSAGE_BUNDLE_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: "); //$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //MessageBundleTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/NameTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/NameTypeImpl.java
deleted file mode 100644
index 511b347..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/NameTypeImpl.java
+++ /dev/null
@@ -1,224 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.NameType;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Name Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.NameTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.NameTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class NameTypeImpl extends EObjectImpl implements NameType {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected NameTypeImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.NAME_TYPE;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.NAME_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.NAME_TYPE__ID, oldId, id));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.NAME_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.NAME_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.NAME_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.NAME_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.NAME_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.NAME_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.NAME_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.NAME_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: "); //$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //NameTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/NavigationCaseTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/NavigationCaseTypeImpl.java
deleted file mode 100644
index ce9d461..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/NavigationCaseTypeImpl.java
+++ /dev/null
@@ -1,650 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.facesconfig.emf.DescriptionType;
-import org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.FromActionType;
-import org.eclipse.jst.jsf.facesconfig.emf.FromOutcomeType;
-import org.eclipse.jst.jsf.facesconfig.emf.IconType;
-import org.eclipse.jst.jsf.facesconfig.emf.IfType;
-import org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType;
-import org.eclipse.jst.jsf.facesconfig.emf.RedirectType;
-import org.eclipse.jst.jsf.facesconfig.emf.ToViewIdType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Navigation Case Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationCaseTypeImpl#getDescription <em>Description</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationCaseTypeImpl#getDisplayName <em>Display Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationCaseTypeImpl#getIcon <em>Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationCaseTypeImpl#getFromAction <em>From Action</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationCaseTypeImpl#getFromOutcome <em>From Outcome</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationCaseTypeImpl#getIf <em>If</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationCaseTypeImpl#getToViewId <em>To View Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationCaseTypeImpl#getRedirect <em>Redirect</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationCaseTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class NavigationCaseTypeImpl extends EObjectImpl implements NavigationCaseType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The cached value of the '{@link #getDescription() <em>Description</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDescription()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList description;
-
-    /**
-	 * The cached value of the '{@link #getDisplayName() <em>Display Name</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDisplayName()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList displayName;
-
-    /**
-	 * The cached value of the '{@link #getIcon() <em>Icon</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getIcon()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList icon;
-
-    /**
-	 * The cached value of the '{@link #getFromAction() <em>From Action</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getFromAction()
-	 * @generated
-	 * @ordered
-	 */
-	protected FromActionType fromAction;
-
-    /**
-	 * The cached value of the '{@link #getFromOutcome() <em>From Outcome</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getFromOutcome()
-	 * @generated
-	 * @ordered
-	 */
-	protected FromOutcomeType fromOutcome;
-
-    /**
-	 * The cached value of the '{@link #getIf() <em>If</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getIf()
-	 * @generated
-	 * @ordered
-	 */
-	protected IfType if_;
-
-				/**
-	 * The cached value of the '{@link #getToViewId() <em>To View Id</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getToViewId()
-	 * @generated
-	 * @ordered
-	 */
-	protected ToViewIdType toViewId;
-
-    /**
-	 * The cached value of the '{@link #getRedirect() <em>Redirect</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRedirect()
-	 * @generated
-	 * @ordered
-	 */
-	protected RedirectType redirect;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected NavigationCaseTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.NAVIGATION_CASE_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getDescription() {
-		if (description == null) {
-			description = new EObjectContainmentEList(DescriptionType.class, this, FacesConfigPackage.NAVIGATION_CASE_TYPE__DESCRIPTION);
-		}
-		return description;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getDisplayName() {
-		if (displayName == null) {
-			displayName = new EObjectContainmentEList(DisplayNameType.class, this, FacesConfigPackage.NAVIGATION_CASE_TYPE__DISPLAY_NAME);
-		}
-		return displayName;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getIcon() {
-		if (icon == null) {
-			icon = new EObjectContainmentEList(IconType.class, this, FacesConfigPackage.NAVIGATION_CASE_TYPE__ICON);
-		}
-		return icon;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FromActionType getFromAction() {
-		return fromAction;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newFromAction 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetFromAction(FromActionType newFromAction, NotificationChain msgs) {
-		FromActionType oldFromAction = fromAction;
-		fromAction = newFromAction;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.NAVIGATION_CASE_TYPE__FROM_ACTION, oldFromAction, newFromAction);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setFromAction(FromActionType newFromAction) {
-		if (newFromAction != fromAction) {
-			NotificationChain msgs = null;
-			if (fromAction != null)
-				msgs = ((InternalEObject)fromAction).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.NAVIGATION_CASE_TYPE__FROM_ACTION, null, msgs);
-			if (newFromAction != null)
-				msgs = ((InternalEObject)newFromAction).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.NAVIGATION_CASE_TYPE__FROM_ACTION, null, msgs);
-			msgs = basicSetFromAction(newFromAction, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.NAVIGATION_CASE_TYPE__FROM_ACTION, newFromAction, newFromAction));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FromOutcomeType getFromOutcome() {
-		return fromOutcome;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newFromOutcome 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetFromOutcome(FromOutcomeType newFromOutcome, NotificationChain msgs) {
-		FromOutcomeType oldFromOutcome = fromOutcome;
-		fromOutcome = newFromOutcome;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.NAVIGATION_CASE_TYPE__FROM_OUTCOME, oldFromOutcome, newFromOutcome);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setFromOutcome(FromOutcomeType newFromOutcome) {
-		if (newFromOutcome != fromOutcome) {
-			NotificationChain msgs = null;
-			if (fromOutcome != null)
-				msgs = ((InternalEObject)fromOutcome).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.NAVIGATION_CASE_TYPE__FROM_OUTCOME, null, msgs);
-			if (newFromOutcome != null)
-				msgs = ((InternalEObject)newFromOutcome).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.NAVIGATION_CASE_TYPE__FROM_OUTCOME, null, msgs);
-			msgs = basicSetFromOutcome(newFromOutcome, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.NAVIGATION_CASE_TYPE__FROM_OUTCOME, newFromOutcome, newFromOutcome));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public IfType getIf() {
-		return if_;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * @param newIf 
-	 * @param msgs 
-	 * @return NotificationChain
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetIf(IfType newIf, NotificationChain msgs) {
-		IfType oldIf = if_;
-		if_ = newIf;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.NAVIGATION_CASE_TYPE__IF, oldIf, newIf);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setIf(IfType newIf) {
-		if (newIf != if_) {
-			NotificationChain msgs = null;
-			if (if_ != null)
-				msgs = ((InternalEObject)if_).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.NAVIGATION_CASE_TYPE__IF, null, msgs);
-			if (newIf != null)
-				msgs = ((InternalEObject)newIf).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.NAVIGATION_CASE_TYPE__IF, null, msgs);
-			msgs = basicSetIf(newIf, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.NAVIGATION_CASE_TYPE__IF, newIf, newIf));
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ToViewIdType getToViewId() {
-		return toViewId;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newToViewId 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetToViewId(ToViewIdType newToViewId, NotificationChain msgs) {
-		ToViewIdType oldToViewId = toViewId;
-		toViewId = newToViewId;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.NAVIGATION_CASE_TYPE__TO_VIEW_ID, oldToViewId, newToViewId);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setToViewId(ToViewIdType newToViewId) {
-		if (newToViewId != toViewId) {
-			NotificationChain msgs = null;
-			if (toViewId != null)
-				msgs = ((InternalEObject)toViewId).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.NAVIGATION_CASE_TYPE__TO_VIEW_ID, null, msgs);
-			if (newToViewId != null)
-				msgs = ((InternalEObject)newToViewId).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.NAVIGATION_CASE_TYPE__TO_VIEW_ID, null, msgs);
-			msgs = basicSetToViewId(newToViewId, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.NAVIGATION_CASE_TYPE__TO_VIEW_ID, newToViewId, newToViewId));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public RedirectType getRedirect() {
-		return redirect;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newRedirect 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetRedirect(RedirectType newRedirect, NotificationChain msgs) {
-		RedirectType oldRedirect = redirect;
-		redirect = newRedirect;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.NAVIGATION_CASE_TYPE__REDIRECT, oldRedirect, newRedirect);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setRedirect(RedirectType newRedirect) {
-		if (newRedirect != redirect) {
-			NotificationChain msgs = null;
-			if (redirect != null)
-				msgs = ((InternalEObject)redirect).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.NAVIGATION_CASE_TYPE__REDIRECT, null, msgs);
-			if (newRedirect != null)
-				msgs = ((InternalEObject)newRedirect).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.NAVIGATION_CASE_TYPE__REDIRECT, null, msgs);
-			msgs = basicSetRedirect(newRedirect, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.NAVIGATION_CASE_TYPE__REDIRECT, newRedirect, newRedirect));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.NAVIGATION_CASE_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE__DESCRIPTION:
-				return ((InternalEList)getDescription()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE__DISPLAY_NAME:
-				return ((InternalEList)getDisplayName()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE__ICON:
-				return ((InternalEList)getIcon()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE__FROM_ACTION:
-				return basicSetFromAction(null, msgs);
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE__FROM_OUTCOME:
-				return basicSetFromOutcome(null, msgs);
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE__IF:
-				return basicSetIf(null, msgs);
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE__TO_VIEW_ID:
-				return basicSetToViewId(null, msgs);
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE__REDIRECT:
-				return basicSetRedirect(null, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE__DESCRIPTION:
-				return getDescription();
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE__DISPLAY_NAME:
-				return getDisplayName();
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE__ICON:
-				return getIcon();
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE__FROM_ACTION:
-				return getFromAction();
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE__FROM_OUTCOME:
-				return getFromOutcome();
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE__IF:
-				return getIf();
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE__TO_VIEW_ID:
-				return getToViewId();
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE__REDIRECT:
-				return getRedirect();
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE__DESCRIPTION:
-				getDescription().clear();
-				getDescription().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE__DISPLAY_NAME:
-				getDisplayName().clear();
-				getDisplayName().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE__ICON:
-				getIcon().clear();
-				getIcon().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE__FROM_ACTION:
-				setFromAction((FromActionType)newValue);
-				return;
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE__FROM_OUTCOME:
-				setFromOutcome((FromOutcomeType)newValue);
-				return;
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE__IF:
-				setIf((IfType)newValue);
-				return;
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE__TO_VIEW_ID:
-				setToViewId((ToViewIdType)newValue);
-				return;
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE__REDIRECT:
-				setRedirect((RedirectType)newValue);
-				return;
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE__DESCRIPTION:
-				getDescription().clear();
-				return;
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE__DISPLAY_NAME:
-				getDisplayName().clear();
-				return;
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE__ICON:
-				getIcon().clear();
-				return;
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE__FROM_ACTION:
-				setFromAction((FromActionType)null);
-				return;
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE__FROM_OUTCOME:
-				setFromOutcome((FromOutcomeType)null);
-				return;
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE__IF:
-				setIf((IfType)null);
-				return;
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE__TO_VIEW_ID:
-				setToViewId((ToViewIdType)null);
-				return;
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE__REDIRECT:
-				setRedirect((RedirectType)null);
-				return;
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE__DESCRIPTION:
-				return description != null && !description.isEmpty();
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE__DISPLAY_NAME:
-				return displayName != null && !displayName.isEmpty();
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE__ICON:
-				return icon != null && !icon.isEmpty();
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE__FROM_ACTION:
-				return fromAction != null;
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE__FROM_OUTCOME:
-				return fromOutcome != null;
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE__IF:
-				return if_ != null;
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE__TO_VIEW_ID:
-				return toViewId != null;
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE__REDIRECT:
-				return redirect != null;
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //NavigationCaseTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/NavigationHandlerTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/NavigationHandlerTypeImpl.java
deleted file mode 100644
index 814a158..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/NavigationHandlerTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.NavigationHandlerType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Navigation Handler Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationHandlerTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationHandlerTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class NavigationHandlerTypeImpl extends EObjectImpl implements NavigationHandlerType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected NavigationHandlerTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.NAVIGATION_HANDLER_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.NAVIGATION_HANDLER_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.NAVIGATION_HANDLER_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.NAVIGATION_HANDLER_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.NAVIGATION_HANDLER_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.NAVIGATION_HANDLER_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.NAVIGATION_HANDLER_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.NAVIGATION_HANDLER_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.NAVIGATION_HANDLER_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.NAVIGATION_HANDLER_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.NAVIGATION_HANDLER_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: "); //$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //NavigationHandlerTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/NavigationRuleExtensionTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/NavigationRuleExtensionTypeImpl.java
deleted file mode 100644
index b05ec70..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/NavigationRuleExtensionTypeImpl.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleExtensionType;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Navigation Rule Extension Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * </p>
- *
- * @generated
- */
-public class NavigationRuleExtensionTypeImpl extends ExtensionTypeImpl implements NavigationRuleExtensionType {
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    @SuppressWarnings("hiding")
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected NavigationRuleExtensionTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.NAVIGATION_RULE_EXTENSION_TYPE;
-	}
-
-} //NavigationRuleExtensionTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/NavigationRuleTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/NavigationRuleTypeImpl.java
deleted file mode 100644
index 3007f16..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/NavigationRuleTypeImpl.java
+++ /dev/null
@@ -1,444 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.facesconfig.emf.DescriptionType;
-import org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.FromViewIdType;
-import org.eclipse.jst.jsf.facesconfig.emf.IconType;
-import org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType;
-import org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleExtensionType;
-import org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Navigation Rule Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationRuleTypeImpl#getDescription <em>Description</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationRuleTypeImpl#getDisplayName <em>Display Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationRuleTypeImpl#getIcon <em>Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationRuleTypeImpl#getFromViewId <em>From View Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationRuleTypeImpl#getNavigationCase <em>Navigation Case</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationRuleTypeImpl#getNavigationRuleExtension <em>Navigation Rule Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationRuleTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class NavigationRuleTypeImpl extends EObjectImpl implements NavigationRuleType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The cached value of the '{@link #getDescription() <em>Description</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDescription()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList description;
-
-    /**
-	 * The cached value of the '{@link #getDisplayName() <em>Display Name</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDisplayName()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList displayName;
-
-    /**
-	 * The cached value of the '{@link #getIcon() <em>Icon</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getIcon()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList icon;
-
-    /**
-	 * The cached value of the '{@link #getFromViewId() <em>From View Id</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getFromViewId()
-	 * @generated
-	 * @ordered
-	 */
-	protected FromViewIdType fromViewId;
-
-    /**
-	 * The cached value of the '{@link #getNavigationCase() <em>Navigation Case</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getNavigationCase()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList navigationCase;
-
-    /**
-	 * The cached value of the '{@link #getNavigationRuleExtension() <em>Navigation Rule Extension</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see #getNavigationRuleExtension()
-	 * @generated
-	 * @ordered
-	 */
-    protected EList navigationRuleExtension;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected NavigationRuleTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.NAVIGATION_RULE_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getDescription() {
-		if (description == null) {
-			description = new EObjectContainmentEList(DescriptionType.class, this, FacesConfigPackage.NAVIGATION_RULE_TYPE__DESCRIPTION);
-		}
-		return description;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getDisplayName() {
-		if (displayName == null) {
-			displayName = new EObjectContainmentEList(DisplayNameType.class, this, FacesConfigPackage.NAVIGATION_RULE_TYPE__DISPLAY_NAME);
-		}
-		return displayName;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getIcon() {
-		if (icon == null) {
-			icon = new EObjectContainmentEList(IconType.class, this, FacesConfigPackage.NAVIGATION_RULE_TYPE__ICON);
-		}
-		return icon;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FromViewIdType getFromViewId() {
-		return fromViewId;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newFromViewId 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetFromViewId(FromViewIdType newFromViewId, NotificationChain msgs) {
-		FromViewIdType oldFromViewId = fromViewId;
-		fromViewId = newFromViewId;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.NAVIGATION_RULE_TYPE__FROM_VIEW_ID, oldFromViewId, newFromViewId);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setFromViewId(FromViewIdType newFromViewId) {
-		if (newFromViewId != fromViewId) {
-			NotificationChain msgs = null;
-			if (fromViewId != null)
-				msgs = ((InternalEObject)fromViewId).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.NAVIGATION_RULE_TYPE__FROM_VIEW_ID, null, msgs);
-			if (newFromViewId != null)
-				msgs = ((InternalEObject)newFromViewId).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.NAVIGATION_RULE_TYPE__FROM_VIEW_ID, null, msgs);
-			msgs = basicSetFromViewId(newFromViewId, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.NAVIGATION_RULE_TYPE__FROM_VIEW_ID, newFromViewId, newFromViewId));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getNavigationCase() {
-		if (navigationCase == null) {
-			navigationCase = new EObjectContainmentEList(NavigationCaseType.class, this, FacesConfigPackage.NAVIGATION_RULE_TYPE__NAVIGATION_CASE);
-		}
-		return navigationCase;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EList getNavigationRuleExtension() {
-		if (navigationRuleExtension == null) {
-			navigationRuleExtension = new EObjectContainmentEList(NavigationRuleExtensionType.class, this, FacesConfigPackage.NAVIGATION_RULE_TYPE__NAVIGATION_RULE_EXTENSION);
-		}
-		return navigationRuleExtension;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.NAVIGATION_RULE_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case FacesConfigPackage.NAVIGATION_RULE_TYPE__DESCRIPTION:
-				return ((InternalEList)getDescription()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.NAVIGATION_RULE_TYPE__DISPLAY_NAME:
-				return ((InternalEList)getDisplayName()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.NAVIGATION_RULE_TYPE__ICON:
-				return ((InternalEList)getIcon()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.NAVIGATION_RULE_TYPE__FROM_VIEW_ID:
-				return basicSetFromViewId(null, msgs);
-			case FacesConfigPackage.NAVIGATION_RULE_TYPE__NAVIGATION_CASE:
-				return ((InternalEList)getNavigationCase()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.NAVIGATION_RULE_TYPE__NAVIGATION_RULE_EXTENSION:
-				return ((InternalEList)getNavigationRuleExtension()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.NAVIGATION_RULE_TYPE__DESCRIPTION:
-				return getDescription();
-			case FacesConfigPackage.NAVIGATION_RULE_TYPE__DISPLAY_NAME:
-				return getDisplayName();
-			case FacesConfigPackage.NAVIGATION_RULE_TYPE__ICON:
-				return getIcon();
-			case FacesConfigPackage.NAVIGATION_RULE_TYPE__FROM_VIEW_ID:
-				return getFromViewId();
-			case FacesConfigPackage.NAVIGATION_RULE_TYPE__NAVIGATION_CASE:
-				return getNavigationCase();
-			case FacesConfigPackage.NAVIGATION_RULE_TYPE__NAVIGATION_RULE_EXTENSION:
-				return getNavigationRuleExtension();
-			case FacesConfigPackage.NAVIGATION_RULE_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.NAVIGATION_RULE_TYPE__DESCRIPTION:
-				getDescription().clear();
-				getDescription().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.NAVIGATION_RULE_TYPE__DISPLAY_NAME:
-				getDisplayName().clear();
-				getDisplayName().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.NAVIGATION_RULE_TYPE__ICON:
-				getIcon().clear();
-				getIcon().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.NAVIGATION_RULE_TYPE__FROM_VIEW_ID:
-				setFromViewId((FromViewIdType)newValue);
-				return;
-			case FacesConfigPackage.NAVIGATION_RULE_TYPE__NAVIGATION_CASE:
-				getNavigationCase().clear();
-				getNavigationCase().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.NAVIGATION_RULE_TYPE__NAVIGATION_RULE_EXTENSION:
-				getNavigationRuleExtension().clear();
-				getNavigationRuleExtension().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.NAVIGATION_RULE_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.NAVIGATION_RULE_TYPE__DESCRIPTION:
-				getDescription().clear();
-				return;
-			case FacesConfigPackage.NAVIGATION_RULE_TYPE__DISPLAY_NAME:
-				getDisplayName().clear();
-				return;
-			case FacesConfigPackage.NAVIGATION_RULE_TYPE__ICON:
-				getIcon().clear();
-				return;
-			case FacesConfigPackage.NAVIGATION_RULE_TYPE__FROM_VIEW_ID:
-				setFromViewId((FromViewIdType)null);
-				return;
-			case FacesConfigPackage.NAVIGATION_RULE_TYPE__NAVIGATION_CASE:
-				getNavigationCase().clear();
-				return;
-			case FacesConfigPackage.NAVIGATION_RULE_TYPE__NAVIGATION_RULE_EXTENSION:
-				getNavigationRuleExtension().clear();
-				return;
-			case FacesConfigPackage.NAVIGATION_RULE_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.NAVIGATION_RULE_TYPE__DESCRIPTION:
-				return description != null && !description.isEmpty();
-			case FacesConfigPackage.NAVIGATION_RULE_TYPE__DISPLAY_NAME:
-				return displayName != null && !displayName.isEmpty();
-			case FacesConfigPackage.NAVIGATION_RULE_TYPE__ICON:
-				return icon != null && !icon.isEmpty();
-			case FacesConfigPackage.NAVIGATION_RULE_TYPE__FROM_VIEW_ID:
-				return fromViewId != null;
-			case FacesConfigPackage.NAVIGATION_RULE_TYPE__NAVIGATION_CASE:
-				return navigationCase != null && !navigationCase.isEmpty();
-			case FacesConfigPackage.NAVIGATION_RULE_TYPE__NAVIGATION_RULE_EXTENSION:
-				return navigationRuleExtension != null && !navigationRuleExtension.isEmpty();
-			case FacesConfigPackage.NAVIGATION_RULE_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //NavigationRuleTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/NullValueTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/NullValueTypeImpl.java
deleted file mode 100644
index e42c2b8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/NullValueTypeImpl.java
+++ /dev/null
@@ -1,171 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.NullValueType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Null Value Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.NullValueTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class NullValueTypeImpl extends EObjectImpl implements NullValueType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected NullValueTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.NULL_VALUE_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.NULL_VALUE_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.NULL_VALUE_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.NULL_VALUE_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.NULL_VALUE_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.NULL_VALUE_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //NullValueTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/OrderingOrderingTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/OrderingOrderingTypeImpl.java
deleted file mode 100644
index 8e118cb..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/OrderingOrderingTypeImpl.java
+++ /dev/null
@@ -1,228 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.NameType;
-import org.eclipse.jst.jsf.facesconfig.emf.OrderingOrderingType;
-import org.eclipse.jst.jsf.facesconfig.emf.OrderingOthersType;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Ordering Ordering Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.OrderingOrderingTypeImpl#getName <em>Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.OrderingOrderingTypeImpl#getOthers <em>Others</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class OrderingOrderingTypeImpl extends EObjectImpl implements OrderingOrderingType {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * The cached value of the '{@link #getName() <em>Name</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getName()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList name;
-
-	/**
-	 * The cached value of the '{@link #getOthers() <em>Others</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getOthers()
-	 * @generated
-	 * @ordered
-	 */
-	protected OrderingOthersType others;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected OrderingOrderingTypeImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.ORDERING_ORDERING_TYPE;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getName() {
-		if (name == null) {
-			name = new EObjectContainmentEList(NameType.class, this, FacesConfigPackage.ORDERING_ORDERING_TYPE__NAME);
-		}
-		return name;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public OrderingOthersType getOthers() {
-		return others;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @param newOthers 
-	 * @param msgs 
-	 * @return NotificationChain
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetOthers(OrderingOthersType newOthers, NotificationChain msgs) {
-		OrderingOthersType oldOthers = others;
-		others = newOthers;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.ORDERING_ORDERING_TYPE__OTHERS, oldOthers, newOthers);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setOthers(OrderingOthersType newOthers) {
-		if (newOthers != others) {
-			NotificationChain msgs = null;
-			if (others != null)
-				msgs = ((InternalEObject)others).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.ORDERING_ORDERING_TYPE__OTHERS, null, msgs);
-			if (newOthers != null)
-				msgs = ((InternalEObject)newOthers).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.ORDERING_ORDERING_TYPE__OTHERS, null, msgs);
-			msgs = basicSetOthers(newOthers, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.ORDERING_ORDERING_TYPE__OTHERS, newOthers, newOthers));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case FacesConfigPackage.ORDERING_ORDERING_TYPE__NAME:
-				return ((InternalEList)getName()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.ORDERING_ORDERING_TYPE__OTHERS:
-				return basicSetOthers(null, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.ORDERING_ORDERING_TYPE__NAME:
-				return getName();
-			case FacesConfigPackage.ORDERING_ORDERING_TYPE__OTHERS:
-				return getOthers();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.ORDERING_ORDERING_TYPE__NAME:
-				getName().clear();
-				getName().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.ORDERING_ORDERING_TYPE__OTHERS:
-				setOthers((OrderingOthersType)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.ORDERING_ORDERING_TYPE__NAME:
-				getName().clear();
-				return;
-			case FacesConfigPackage.ORDERING_ORDERING_TYPE__OTHERS:
-				setOthers((OrderingOthersType)null);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.ORDERING_ORDERING_TYPE__NAME:
-				return name != null && !name.isEmpty();
-			case FacesConfigPackage.ORDERING_ORDERING_TYPE__OTHERS:
-				return others != null;
-		}
-		return super.eIsSet(featureID);
-	}
-
-} //OrderingOrderingTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/OrderingOthersTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/OrderingOthersTypeImpl.java
deleted file mode 100644
index fe8c019..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/OrderingOthersTypeImpl.java
+++ /dev/null
@@ -1,170 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.OrderingOthersType;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Ordering Others Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.OrderingOthersTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class OrderingOthersTypeImpl extends EObjectImpl implements OrderingOthersType {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected OrderingOthersTypeImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.ORDERING_OTHERS_TYPE;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.ORDERING_OTHERS_TYPE__ID, oldId, id));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.ORDERING_OTHERS_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.ORDERING_OTHERS_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.ORDERING_OTHERS_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.ORDERING_OTHERS_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //OrderingOthersTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/OrderingTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/OrderingTypeImpl.java
deleted file mode 100644
index a5402e6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/OrderingTypeImpl.java
+++ /dev/null
@@ -1,255 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.OrderingOrderingType;
-import org.eclipse.jst.jsf.facesconfig.emf.OrderingType;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Ordering Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.OrderingTypeImpl#getBefore <em>Before</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.OrderingTypeImpl#getAfter <em>After</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class OrderingTypeImpl extends EObjectImpl implements OrderingType {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * The cached value of the '{@link #getBefore() <em>Before</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getBefore()
-	 * @generated
-	 * @ordered
-	 */
-	protected OrderingOrderingType before;
-
-	/**
-	 * The cached value of the '{@link #getAfter() <em>After</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getAfter()
-	 * @generated
-	 * @ordered
-	 */
-	protected OrderingOrderingType after;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected OrderingTypeImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.ORDERING_TYPE;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public OrderingOrderingType getBefore() {
-		return before;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @param newBefore 
-	 * @param msgs 
-	 * @return NotificationChain
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetBefore(OrderingOrderingType newBefore, NotificationChain msgs) {
-		OrderingOrderingType oldBefore = before;
-		before = newBefore;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.ORDERING_TYPE__BEFORE, oldBefore, newBefore);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setBefore(OrderingOrderingType newBefore) {
-		if (newBefore != before) {
-			NotificationChain msgs = null;
-			if (before != null)
-				msgs = ((InternalEObject)before).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.ORDERING_TYPE__BEFORE, null, msgs);
-			if (newBefore != null)
-				msgs = ((InternalEObject)newBefore).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.ORDERING_TYPE__BEFORE, null, msgs);
-			msgs = basicSetBefore(newBefore, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.ORDERING_TYPE__BEFORE, newBefore, newBefore));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public OrderingOrderingType getAfter() {
-		return after;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @param newAfter 
-	 * @param msgs 
-	 * @return NotificationChain
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetAfter(OrderingOrderingType newAfter, NotificationChain msgs) {
-		OrderingOrderingType oldAfter = after;
-		after = newAfter;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.ORDERING_TYPE__AFTER, oldAfter, newAfter);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setAfter(OrderingOrderingType newAfter) {
-		if (newAfter != after) {
-			NotificationChain msgs = null;
-			if (after != null)
-				msgs = ((InternalEObject)after).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.ORDERING_TYPE__AFTER, null, msgs);
-			if (newAfter != null)
-				msgs = ((InternalEObject)newAfter).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.ORDERING_TYPE__AFTER, null, msgs);
-			msgs = basicSetAfter(newAfter, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.ORDERING_TYPE__AFTER, newAfter, newAfter));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case FacesConfigPackage.ORDERING_TYPE__BEFORE:
-				return basicSetBefore(null, msgs);
-			case FacesConfigPackage.ORDERING_TYPE__AFTER:
-				return basicSetAfter(null, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.ORDERING_TYPE__BEFORE:
-				return getBefore();
-			case FacesConfigPackage.ORDERING_TYPE__AFTER:
-				return getAfter();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.ORDERING_TYPE__BEFORE:
-				setBefore((OrderingOrderingType)newValue);
-				return;
-			case FacesConfigPackage.ORDERING_TYPE__AFTER:
-				setAfter((OrderingOrderingType)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.ORDERING_TYPE__BEFORE:
-				setBefore((OrderingOrderingType)null);
-				return;
-			case FacesConfigPackage.ORDERING_TYPE__AFTER:
-				setAfter((OrderingOrderingType)null);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.ORDERING_TYPE__BEFORE:
-				return before != null;
-			case FacesConfigPackage.ORDERING_TYPE__AFTER:
-				return after != null;
-		}
-		return super.eIsSet(featureID);
-	}
-
-} //OrderingTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/PartialViewContextFactoryTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/PartialViewContextFactoryTypeImpl.java
deleted file mode 100644
index 7c77fd8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/PartialViewContextFactoryTypeImpl.java
+++ /dev/null
@@ -1,224 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.PartialViewContextFactoryType;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Partial View Context Factory Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PartialViewContextFactoryTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PartialViewContextFactoryTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class PartialViewContextFactoryTypeImpl extends EObjectImpl implements PartialViewContextFactoryType {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected PartialViewContextFactoryTypeImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.PARTIAL_VIEW_CONTEXT_FACTORY_TYPE;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.PARTIAL_VIEW_CONTEXT_FACTORY_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.PARTIAL_VIEW_CONTEXT_FACTORY_TYPE__ID, oldId, id));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.PARTIAL_VIEW_CONTEXT_FACTORY_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.PARTIAL_VIEW_CONTEXT_FACTORY_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.PARTIAL_VIEW_CONTEXT_FACTORY_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.PARTIAL_VIEW_CONTEXT_FACTORY_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.PARTIAL_VIEW_CONTEXT_FACTORY_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.PARTIAL_VIEW_CONTEXT_FACTORY_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.PARTIAL_VIEW_CONTEXT_FACTORY_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.PARTIAL_VIEW_CONTEXT_FACTORY_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: "); //$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //PartialViewContextFactoryTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/PhaseListenerTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/PhaseListenerTypeImpl.java
deleted file mode 100644
index 18fe290..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/PhaseListenerTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.PhaseListenerType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Phase Listener Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PhaseListenerTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PhaseListenerTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class PhaseListenerTypeImpl extends EObjectImpl implements PhaseListenerType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected PhaseListenerTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.PHASE_LISTENER_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.PHASE_LISTENER_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.PHASE_LISTENER_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.PHASE_LISTENER_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.PHASE_LISTENER_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.PHASE_LISTENER_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.PHASE_LISTENER_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.PHASE_LISTENER_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.PHASE_LISTENER_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.PHASE_LISTENER_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.PHASE_LISTENER_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: "); //$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //PhaseListenerTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/PropertyClassTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/PropertyClassTypeImpl.java
deleted file mode 100644
index aa19cde..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/PropertyClassTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.PropertyClassType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Property Class Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyClassTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyClassTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class PropertyClassTypeImpl extends EObjectImpl implements PropertyClassType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected PropertyClassTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.PROPERTY_CLASS_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.PROPERTY_CLASS_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.PROPERTY_CLASS_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.PROPERTY_CLASS_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.PROPERTY_CLASS_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.PROPERTY_CLASS_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.PROPERTY_CLASS_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.PROPERTY_CLASS_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.PROPERTY_CLASS_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.PROPERTY_CLASS_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.PROPERTY_CLASS_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: "); //$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //PropertyClassTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/PropertyExtensionTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/PropertyExtensionTypeImpl.java
deleted file mode 100644
index 1c6d84e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/PropertyExtensionTypeImpl.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.PropertyExtensionType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Property Extension Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * </p>
- *
- * @generated
- */
-public class PropertyExtensionTypeImpl extends ExtensionTypeImpl implements PropertyExtensionType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@SuppressWarnings("hiding")
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected PropertyExtensionTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.PROPERTY_EXTENSION_TYPE;
-	}
-
-} //PropertyExtensionTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/PropertyNameTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/PropertyNameTypeImpl.java
deleted file mode 100644
index 76ecad7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/PropertyNameTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.PropertyNameType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Property Name Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyNameTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyNameTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class PropertyNameTypeImpl extends EObjectImpl implements PropertyNameType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected PropertyNameTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.PROPERTY_NAME_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.PROPERTY_NAME_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.PROPERTY_NAME_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.PROPERTY_NAME_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.PROPERTY_NAME_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.PROPERTY_NAME_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.PROPERTY_NAME_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.PROPERTY_NAME_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.PROPERTY_NAME_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.PROPERTY_NAME_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.PROPERTY_NAME_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: "); //$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //PropertyNameTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/PropertyResolverTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/PropertyResolverTypeImpl.java
deleted file mode 100644
index 954da7d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/PropertyResolverTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.PropertyResolverType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Property Resolver Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyResolverTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyResolverTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class PropertyResolverTypeImpl extends EObjectImpl implements PropertyResolverType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected PropertyResolverTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.PROPERTY_RESOLVER_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.PROPERTY_RESOLVER_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.PROPERTY_RESOLVER_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.PROPERTY_RESOLVER_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.PROPERTY_RESOLVER_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.PROPERTY_RESOLVER_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.PROPERTY_RESOLVER_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.PROPERTY_RESOLVER_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.PROPERTY_RESOLVER_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.PROPERTY_RESOLVER_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.PROPERTY_RESOLVER_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: "); //$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //PropertyResolverTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/PropertyTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/PropertyTypeImpl.java
deleted file mode 100644
index a1ace9c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/PropertyTypeImpl.java
+++ /dev/null
@@ -1,617 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.facesconfig.emf.DefaultValueType;
-import org.eclipse.jst.jsf.facesconfig.emf.DescriptionType;
-import org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.IconType;
-import org.eclipse.jst.jsf.facesconfig.emf.PropertyClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.PropertyExtensionType;
-import org.eclipse.jst.jsf.facesconfig.emf.PropertyNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.PropertyType;
-import org.eclipse.jst.jsf.facesconfig.emf.SuggestedValueType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Property Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyTypeImpl#getDescription <em>Description</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyTypeImpl#getDisplayName <em>Display Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyTypeImpl#getIcon <em>Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyTypeImpl#getPropertyName <em>Property Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyTypeImpl#getPropertyClass <em>Property Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyTypeImpl#getDefaultValue <em>Default Value</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyTypeImpl#getSuggestedValue <em>Suggested Value</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyTypeImpl#getPropertyExtension <em>Property Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class PropertyTypeImpl extends EObjectImpl implements PropertyType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The cached value of the '{@link #getDescription() <em>Description</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDescription()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList description;
-
-    /**
-	 * The cached value of the '{@link #getDisplayName() <em>Display Name</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDisplayName()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList displayName;
-
-    /**
-	 * The cached value of the '{@link #getIcon() <em>Icon</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getIcon()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList icon;
-
-    /**
-	 * The cached value of the '{@link #getPropertyName() <em>Property Name</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPropertyName()
-	 * @generated
-	 * @ordered
-	 */
-	protected PropertyNameType propertyName;
-
-    /**
-	 * The cached value of the '{@link #getPropertyClass() <em>Property Class</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPropertyClass()
-	 * @generated
-	 * @ordered
-	 */
-	protected PropertyClassType propertyClass;
-
-    /**
-	 * The cached value of the '{@link #getDefaultValue() <em>Default Value</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDefaultValue()
-	 * @generated
-	 * @ordered
-	 */
-	protected DefaultValueType defaultValue;
-
-    /**
-	 * The cached value of the '{@link #getSuggestedValue() <em>Suggested Value</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getSuggestedValue()
-	 * @generated
-	 * @ordered
-	 */
-	protected SuggestedValueType suggestedValue;
-
-    /**
-	 * The cached value of the '{@link #getPropertyExtension() <em>Property Extension</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPropertyExtension()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList propertyExtension;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected PropertyTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.PROPERTY_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getDescription() {
-		if (description == null) {
-			description = new EObjectContainmentEList(DescriptionType.class, this, FacesConfigPackage.PROPERTY_TYPE__DESCRIPTION);
-		}
-		return description;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getDisplayName() {
-		if (displayName == null) {
-			displayName = new EObjectContainmentEList(DisplayNameType.class, this, FacesConfigPackage.PROPERTY_TYPE__DISPLAY_NAME);
-		}
-		return displayName;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getIcon() {
-		if (icon == null) {
-			icon = new EObjectContainmentEList(IconType.class, this, FacesConfigPackage.PROPERTY_TYPE__ICON);
-		}
-		return icon;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public PropertyNameType getPropertyName() {
-		return propertyName;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newPropertyName 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetPropertyName(PropertyNameType newPropertyName, NotificationChain msgs) {
-		PropertyNameType oldPropertyName = propertyName;
-		propertyName = newPropertyName;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.PROPERTY_TYPE__PROPERTY_NAME, oldPropertyName, newPropertyName);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setPropertyName(PropertyNameType newPropertyName) {
-		if (newPropertyName != propertyName) {
-			NotificationChain msgs = null;
-			if (propertyName != null)
-				msgs = ((InternalEObject)propertyName).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.PROPERTY_TYPE__PROPERTY_NAME, null, msgs);
-			if (newPropertyName != null)
-				msgs = ((InternalEObject)newPropertyName).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.PROPERTY_TYPE__PROPERTY_NAME, null, msgs);
-			msgs = basicSetPropertyName(newPropertyName, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.PROPERTY_TYPE__PROPERTY_NAME, newPropertyName, newPropertyName));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public PropertyClassType getPropertyClass() {
-		return propertyClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newPropertyClass 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetPropertyClass(PropertyClassType newPropertyClass, NotificationChain msgs) {
-		PropertyClassType oldPropertyClass = propertyClass;
-		propertyClass = newPropertyClass;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.PROPERTY_TYPE__PROPERTY_CLASS, oldPropertyClass, newPropertyClass);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setPropertyClass(PropertyClassType newPropertyClass) {
-		if (newPropertyClass != propertyClass) {
-			NotificationChain msgs = null;
-			if (propertyClass != null)
-				msgs = ((InternalEObject)propertyClass).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.PROPERTY_TYPE__PROPERTY_CLASS, null, msgs);
-			if (newPropertyClass != null)
-				msgs = ((InternalEObject)newPropertyClass).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.PROPERTY_TYPE__PROPERTY_CLASS, null, msgs);
-			msgs = basicSetPropertyClass(newPropertyClass, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.PROPERTY_TYPE__PROPERTY_CLASS, newPropertyClass, newPropertyClass));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public DefaultValueType getDefaultValue() {
-		return defaultValue;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newDefaultValue 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetDefaultValue(DefaultValueType newDefaultValue, NotificationChain msgs) {
-		DefaultValueType oldDefaultValue = defaultValue;
-		defaultValue = newDefaultValue;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.PROPERTY_TYPE__DEFAULT_VALUE, oldDefaultValue, newDefaultValue);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setDefaultValue(DefaultValueType newDefaultValue) {
-		if (newDefaultValue != defaultValue) {
-			NotificationChain msgs = null;
-			if (defaultValue != null)
-				msgs = ((InternalEObject)defaultValue).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.PROPERTY_TYPE__DEFAULT_VALUE, null, msgs);
-			if (newDefaultValue != null)
-				msgs = ((InternalEObject)newDefaultValue).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.PROPERTY_TYPE__DEFAULT_VALUE, null, msgs);
-			msgs = basicSetDefaultValue(newDefaultValue, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.PROPERTY_TYPE__DEFAULT_VALUE, newDefaultValue, newDefaultValue));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public SuggestedValueType getSuggestedValue() {
-		return suggestedValue;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newSuggestedValue 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetSuggestedValue(SuggestedValueType newSuggestedValue, NotificationChain msgs) {
-		SuggestedValueType oldSuggestedValue = suggestedValue;
-		suggestedValue = newSuggestedValue;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.PROPERTY_TYPE__SUGGESTED_VALUE, oldSuggestedValue, newSuggestedValue);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setSuggestedValue(SuggestedValueType newSuggestedValue) {
-		if (newSuggestedValue != suggestedValue) {
-			NotificationChain msgs = null;
-			if (suggestedValue != null)
-				msgs = ((InternalEObject)suggestedValue).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.PROPERTY_TYPE__SUGGESTED_VALUE, null, msgs);
-			if (newSuggestedValue != null)
-				msgs = ((InternalEObject)newSuggestedValue).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.PROPERTY_TYPE__SUGGESTED_VALUE, null, msgs);
-			msgs = basicSetSuggestedValue(newSuggestedValue, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.PROPERTY_TYPE__SUGGESTED_VALUE, newSuggestedValue, newSuggestedValue));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getPropertyExtension() {
-		if (propertyExtension == null) {
-			propertyExtension = new EObjectContainmentEList(PropertyExtensionType.class, this, FacesConfigPackage.PROPERTY_TYPE__PROPERTY_EXTENSION);
-		}
-		return propertyExtension;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.PROPERTY_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case FacesConfigPackage.PROPERTY_TYPE__DESCRIPTION:
-				return ((InternalEList)getDescription()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.PROPERTY_TYPE__DISPLAY_NAME:
-				return ((InternalEList)getDisplayName()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.PROPERTY_TYPE__ICON:
-				return ((InternalEList)getIcon()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.PROPERTY_TYPE__PROPERTY_NAME:
-				return basicSetPropertyName(null, msgs);
-			case FacesConfigPackage.PROPERTY_TYPE__PROPERTY_CLASS:
-				return basicSetPropertyClass(null, msgs);
-			case FacesConfigPackage.PROPERTY_TYPE__DEFAULT_VALUE:
-				return basicSetDefaultValue(null, msgs);
-			case FacesConfigPackage.PROPERTY_TYPE__SUGGESTED_VALUE:
-				return basicSetSuggestedValue(null, msgs);
-			case FacesConfigPackage.PROPERTY_TYPE__PROPERTY_EXTENSION:
-				return ((InternalEList)getPropertyExtension()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.PROPERTY_TYPE__DESCRIPTION:
-				return getDescription();
-			case FacesConfigPackage.PROPERTY_TYPE__DISPLAY_NAME:
-				return getDisplayName();
-			case FacesConfigPackage.PROPERTY_TYPE__ICON:
-				return getIcon();
-			case FacesConfigPackage.PROPERTY_TYPE__PROPERTY_NAME:
-				return getPropertyName();
-			case FacesConfigPackage.PROPERTY_TYPE__PROPERTY_CLASS:
-				return getPropertyClass();
-			case FacesConfigPackage.PROPERTY_TYPE__DEFAULT_VALUE:
-				return getDefaultValue();
-			case FacesConfigPackage.PROPERTY_TYPE__SUGGESTED_VALUE:
-				return getSuggestedValue();
-			case FacesConfigPackage.PROPERTY_TYPE__PROPERTY_EXTENSION:
-				return getPropertyExtension();
-			case FacesConfigPackage.PROPERTY_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.PROPERTY_TYPE__DESCRIPTION:
-				getDescription().clear();
-				getDescription().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.PROPERTY_TYPE__DISPLAY_NAME:
-				getDisplayName().clear();
-				getDisplayName().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.PROPERTY_TYPE__ICON:
-				getIcon().clear();
-				getIcon().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.PROPERTY_TYPE__PROPERTY_NAME:
-				setPropertyName((PropertyNameType)newValue);
-				return;
-			case FacesConfigPackage.PROPERTY_TYPE__PROPERTY_CLASS:
-				setPropertyClass((PropertyClassType)newValue);
-				return;
-			case FacesConfigPackage.PROPERTY_TYPE__DEFAULT_VALUE:
-				setDefaultValue((DefaultValueType)newValue);
-				return;
-			case FacesConfigPackage.PROPERTY_TYPE__SUGGESTED_VALUE:
-				setSuggestedValue((SuggestedValueType)newValue);
-				return;
-			case FacesConfigPackage.PROPERTY_TYPE__PROPERTY_EXTENSION:
-				getPropertyExtension().clear();
-				getPropertyExtension().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.PROPERTY_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.PROPERTY_TYPE__DESCRIPTION:
-				getDescription().clear();
-				return;
-			case FacesConfigPackage.PROPERTY_TYPE__DISPLAY_NAME:
-				getDisplayName().clear();
-				return;
-			case FacesConfigPackage.PROPERTY_TYPE__ICON:
-				getIcon().clear();
-				return;
-			case FacesConfigPackage.PROPERTY_TYPE__PROPERTY_NAME:
-				setPropertyName((PropertyNameType)null);
-				return;
-			case FacesConfigPackage.PROPERTY_TYPE__PROPERTY_CLASS:
-				setPropertyClass((PropertyClassType)null);
-				return;
-			case FacesConfigPackage.PROPERTY_TYPE__DEFAULT_VALUE:
-				setDefaultValue((DefaultValueType)null);
-				return;
-			case FacesConfigPackage.PROPERTY_TYPE__SUGGESTED_VALUE:
-				setSuggestedValue((SuggestedValueType)null);
-				return;
-			case FacesConfigPackage.PROPERTY_TYPE__PROPERTY_EXTENSION:
-				getPropertyExtension().clear();
-				return;
-			case FacesConfigPackage.PROPERTY_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.PROPERTY_TYPE__DESCRIPTION:
-				return description != null && !description.isEmpty();
-			case FacesConfigPackage.PROPERTY_TYPE__DISPLAY_NAME:
-				return displayName != null && !displayName.isEmpty();
-			case FacesConfigPackage.PROPERTY_TYPE__ICON:
-				return icon != null && !icon.isEmpty();
-			case FacesConfigPackage.PROPERTY_TYPE__PROPERTY_NAME:
-				return propertyName != null;
-			case FacesConfigPackage.PROPERTY_TYPE__PROPERTY_CLASS:
-				return propertyClass != null;
-			case FacesConfigPackage.PROPERTY_TYPE__DEFAULT_VALUE:
-				return defaultValue != null;
-			case FacesConfigPackage.PROPERTY_TYPE__SUGGESTED_VALUE:
-				return suggestedValue != null;
-			case FacesConfigPackage.PROPERTY_TYPE__PROPERTY_EXTENSION:
-				return propertyExtension != null && !propertyExtension.isEmpty();
-			case FacesConfigPackage.PROPERTY_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //PropertyTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/RedirectTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/RedirectTypeImpl.java
deleted file mode 100644
index dc35c6f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/RedirectTypeImpl.java
+++ /dev/null
@@ -1,280 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.RedirectType;
-import org.eclipse.jst.jsf.facesconfig.emf.RedirectViewParamType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Redirect Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RedirectTypeImpl#getViewParam <em>View Param</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RedirectTypeImpl#getId <em>Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RedirectTypeImpl#isIncludeViewParams <em>Include View Params</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class RedirectTypeImpl extends EObjectImpl implements RedirectType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The cached value of the '{@link #getViewParam() <em>View Param</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getViewParam()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList viewParam;
-
-				/**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #isIncludeViewParams() <em>Include View Params</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isIncludeViewParams()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean INCLUDE_VIEW_PARAMS_EDEFAULT = false;
-
-				/**
-	 * The cached value of the '{@link #isIncludeViewParams() <em>Include View Params</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isIncludeViewParams()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean includeViewParams = INCLUDE_VIEW_PARAMS_EDEFAULT;
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected RedirectTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.REDIRECT_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getViewParam() {
-		if (viewParam == null) {
-			viewParam = new EObjectContainmentEList(RedirectViewParamType.class, this, FacesConfigPackage.REDIRECT_TYPE__VIEW_PARAM);
-		}
-		return viewParam;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.REDIRECT_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isIncludeViewParams() {
-		return includeViewParams;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setIncludeViewParams(boolean newIncludeViewParams) {
-		boolean oldIncludeViewParams = includeViewParams;
-		includeViewParams = newIncludeViewParams;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.REDIRECT_TYPE__INCLUDE_VIEW_PARAMS, oldIncludeViewParams, includeViewParams));
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case FacesConfigPackage.REDIRECT_TYPE__VIEW_PARAM:
-				return ((InternalEList)getViewParam()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.REDIRECT_TYPE__VIEW_PARAM:
-				return getViewParam();
-			case FacesConfigPackage.REDIRECT_TYPE__ID:
-				return getId();
-			case FacesConfigPackage.REDIRECT_TYPE__INCLUDE_VIEW_PARAMS:
-				return isIncludeViewParams() ? Boolean.TRUE : Boolean.FALSE;
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.REDIRECT_TYPE__VIEW_PARAM:
-				getViewParam().clear();
-				getViewParam().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.REDIRECT_TYPE__ID:
-				setId((String)newValue);
-				return;
-			case FacesConfigPackage.REDIRECT_TYPE__INCLUDE_VIEW_PARAMS:
-				setIncludeViewParams(((Boolean)newValue).booleanValue());
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.REDIRECT_TYPE__VIEW_PARAM:
-				getViewParam().clear();
-				return;
-			case FacesConfigPackage.REDIRECT_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-			case FacesConfigPackage.REDIRECT_TYPE__INCLUDE_VIEW_PARAMS:
-				setIncludeViewParams(INCLUDE_VIEW_PARAMS_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.REDIRECT_TYPE__VIEW_PARAM:
-				return viewParam != null && !viewParam.isEmpty();
-			case FacesConfigPackage.REDIRECT_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-			case FacesConfigPackage.REDIRECT_TYPE__INCLUDE_VIEW_PARAMS:
-				return includeViewParams != INCLUDE_VIEW_PARAMS_EDEFAULT;
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(", includeViewParams: "); //$NON-NLS-1$
-		result.append(includeViewParams);
-		result.append(')');
-		return result.toString();
-	}
-
-} //RedirectTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/RedirectViewParamTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/RedirectViewParamTypeImpl.java
deleted file mode 100644
index ac34d57..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/RedirectViewParamTypeImpl.java
+++ /dev/null
@@ -1,323 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.NameType;
-import org.eclipse.jst.jsf.facesconfig.emf.RedirectViewParamType;
-import org.eclipse.jst.jsf.facesconfig.emf.ValueType;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Redirect View Param Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RedirectViewParamTypeImpl#getName <em>Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RedirectViewParamTypeImpl#getValue <em>Value</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RedirectViewParamTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class RedirectViewParamTypeImpl extends EObjectImpl implements RedirectViewParamType {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * The cached value of the '{@link #getName() <em>Name</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getName()
-	 * @generated
-	 * @ordered
-	 */
-	protected NameType name;
-
-	/**
-	 * The cached value of the '{@link #getValue() <em>Value</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getValue()
-	 * @generated
-	 * @ordered
-	 */
-	protected ValueType value;
-
-	/**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected RedirectViewParamTypeImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.REDIRECT_VIEW_PARAM_TYPE;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NameType getName() {
-		return name;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @param newName 
-	 * @param msgs 
-	 * @return NotificationChain
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetName(NameType newName, NotificationChain msgs) {
-		NameType oldName = name;
-		name = newName;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.REDIRECT_VIEW_PARAM_TYPE__NAME, oldName, newName);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setName(NameType newName) {
-		if (newName != name) {
-			NotificationChain msgs = null;
-			if (name != null)
-				msgs = ((InternalEObject)name).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.REDIRECT_VIEW_PARAM_TYPE__NAME, null, msgs);
-			if (newName != null)
-				msgs = ((InternalEObject)newName).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.REDIRECT_VIEW_PARAM_TYPE__NAME, null, msgs);
-			msgs = basicSetName(newName, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.REDIRECT_VIEW_PARAM_TYPE__NAME, newName, newName));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ValueType getValue() {
-		return value;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @param newValue 
-	 * @param msgs 
-	 * @return NotificationChain
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetValue(ValueType newValue, NotificationChain msgs) {
-		ValueType oldValue = value;
-		value = newValue;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.REDIRECT_VIEW_PARAM_TYPE__VALUE, oldValue, newValue);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setValue(ValueType newValue) {
-		if (newValue != value) {
-			NotificationChain msgs = null;
-			if (value != null)
-				msgs = ((InternalEObject)value).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.REDIRECT_VIEW_PARAM_TYPE__VALUE, null, msgs);
-			if (newValue != null)
-				msgs = ((InternalEObject)newValue).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.REDIRECT_VIEW_PARAM_TYPE__VALUE, null, msgs);
-			msgs = basicSetValue(newValue, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.REDIRECT_VIEW_PARAM_TYPE__VALUE, newValue, newValue));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.REDIRECT_VIEW_PARAM_TYPE__ID, oldId, id));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case FacesConfigPackage.REDIRECT_VIEW_PARAM_TYPE__NAME:
-				return basicSetName(null, msgs);
-			case FacesConfigPackage.REDIRECT_VIEW_PARAM_TYPE__VALUE:
-				return basicSetValue(null, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.REDIRECT_VIEW_PARAM_TYPE__NAME:
-				return getName();
-			case FacesConfigPackage.REDIRECT_VIEW_PARAM_TYPE__VALUE:
-				return getValue();
-			case FacesConfigPackage.REDIRECT_VIEW_PARAM_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.REDIRECT_VIEW_PARAM_TYPE__NAME:
-				setName((NameType)newValue);
-				return;
-			case FacesConfigPackage.REDIRECT_VIEW_PARAM_TYPE__VALUE:
-				setValue((ValueType)newValue);
-				return;
-			case FacesConfigPackage.REDIRECT_VIEW_PARAM_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.REDIRECT_VIEW_PARAM_TYPE__NAME:
-				setName((NameType)null);
-				return;
-			case FacesConfigPackage.REDIRECT_VIEW_PARAM_TYPE__VALUE:
-				setValue((ValueType)null);
-				return;
-			case FacesConfigPackage.REDIRECT_VIEW_PARAM_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.REDIRECT_VIEW_PARAM_TYPE__NAME:
-				return name != null;
-			case FacesConfigPackage.REDIRECT_VIEW_PARAM_TYPE__VALUE:
-				return value != null;
-			case FacesConfigPackage.REDIRECT_VIEW_PARAM_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //RedirectViewParamTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ReferencedBeanClassTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ReferencedBeanClassTypeImpl.java
deleted file mode 100644
index 8689119..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ReferencedBeanClassTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanClassType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Referenced Bean Class Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ReferencedBeanClassTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ReferencedBeanClassTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ReferencedBeanClassTypeImpl extends EObjectImpl implements ReferencedBeanClassType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ReferencedBeanClassTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.REFERENCED_BEAN_CLASS_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.REFERENCED_BEAN_CLASS_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.REFERENCED_BEAN_CLASS_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.REFERENCED_BEAN_CLASS_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.REFERENCED_BEAN_CLASS_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.REFERENCED_BEAN_CLASS_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.REFERENCED_BEAN_CLASS_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.REFERENCED_BEAN_CLASS_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.REFERENCED_BEAN_CLASS_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.REFERENCED_BEAN_CLASS_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.REFERENCED_BEAN_CLASS_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: "); //$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ReferencedBeanClassTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ReferencedBeanNameTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ReferencedBeanNameTypeImpl.java
deleted file mode 100644
index d0b1911..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ReferencedBeanNameTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanNameType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Referenced Bean Name Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ReferencedBeanNameTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ReferencedBeanNameTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ReferencedBeanNameTypeImpl extends EObjectImpl implements ReferencedBeanNameType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ReferencedBeanNameTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.REFERENCED_BEAN_NAME_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.REFERENCED_BEAN_NAME_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.REFERENCED_BEAN_NAME_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.REFERENCED_BEAN_NAME_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.REFERENCED_BEAN_NAME_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.REFERENCED_BEAN_NAME_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.REFERENCED_BEAN_NAME_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.REFERENCED_BEAN_NAME_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.REFERENCED_BEAN_NAME_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.REFERENCED_BEAN_NAME_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.REFERENCED_BEAN_NAME_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: "); //$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ReferencedBeanNameTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ReferencedBeanTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ReferencedBeanTypeImpl.java
deleted file mode 100644
index cb35f50..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ReferencedBeanTypeImpl.java
+++ /dev/null
@@ -1,440 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.facesconfig.emf.DescriptionType;
-import org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.IconType;
-import org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Referenced Bean Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ReferencedBeanTypeImpl#getDescription <em>Description</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ReferencedBeanTypeImpl#getDisplayName <em>Display Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ReferencedBeanTypeImpl#getIcon <em>Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ReferencedBeanTypeImpl#getReferencedBeanName <em>Referenced Bean Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ReferencedBeanTypeImpl#getReferencedBeanClass <em>Referenced Bean Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ReferencedBeanTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ReferencedBeanTypeImpl extends EObjectImpl implements ReferencedBeanType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The cached value of the '{@link #getDescription() <em>Description</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDescription()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList description;
-
-    /**
-	 * The cached value of the '{@link #getDisplayName() <em>Display Name</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDisplayName()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList displayName;
-
-    /**
-	 * The cached value of the '{@link #getIcon() <em>Icon</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getIcon()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList icon;
-
-    /**
-	 * The cached value of the '{@link #getReferencedBeanName() <em>Referenced Bean Name</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getReferencedBeanName()
-	 * @generated
-	 * @ordered
-	 */
-	protected ReferencedBeanNameType referencedBeanName;
-
-    /**
-	 * The cached value of the '{@link #getReferencedBeanClass() <em>Referenced Bean Class</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getReferencedBeanClass()
-	 * @generated
-	 * @ordered
-	 */
-	protected ReferencedBeanClassType referencedBeanClass;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ReferencedBeanTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.REFERENCED_BEAN_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getDescription() {
-		if (description == null) {
-			description = new EObjectContainmentEList(DescriptionType.class, this, FacesConfigPackage.REFERENCED_BEAN_TYPE__DESCRIPTION);
-		}
-		return description;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getDisplayName() {
-		if (displayName == null) {
-			displayName = new EObjectContainmentEList(DisplayNameType.class, this, FacesConfigPackage.REFERENCED_BEAN_TYPE__DISPLAY_NAME);
-		}
-		return displayName;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getIcon() {
-		if (icon == null) {
-			icon = new EObjectContainmentEList(IconType.class, this, FacesConfigPackage.REFERENCED_BEAN_TYPE__ICON);
-		}
-		return icon;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ReferencedBeanNameType getReferencedBeanName() {
-		return referencedBeanName;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newReferencedBeanName 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetReferencedBeanName(ReferencedBeanNameType newReferencedBeanName, NotificationChain msgs) {
-		ReferencedBeanNameType oldReferencedBeanName = referencedBeanName;
-		referencedBeanName = newReferencedBeanName;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.REFERENCED_BEAN_TYPE__REFERENCED_BEAN_NAME, oldReferencedBeanName, newReferencedBeanName);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setReferencedBeanName(ReferencedBeanNameType newReferencedBeanName) {
-		if (newReferencedBeanName != referencedBeanName) {
-			NotificationChain msgs = null;
-			if (referencedBeanName != null)
-				msgs = ((InternalEObject)referencedBeanName).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.REFERENCED_BEAN_TYPE__REFERENCED_BEAN_NAME, null, msgs);
-			if (newReferencedBeanName != null)
-				msgs = ((InternalEObject)newReferencedBeanName).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.REFERENCED_BEAN_TYPE__REFERENCED_BEAN_NAME, null, msgs);
-			msgs = basicSetReferencedBeanName(newReferencedBeanName, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.REFERENCED_BEAN_TYPE__REFERENCED_BEAN_NAME, newReferencedBeanName, newReferencedBeanName));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ReferencedBeanClassType getReferencedBeanClass() {
-		return referencedBeanClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newReferencedBeanClass 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetReferencedBeanClass(ReferencedBeanClassType newReferencedBeanClass, NotificationChain msgs) {
-		ReferencedBeanClassType oldReferencedBeanClass = referencedBeanClass;
-		referencedBeanClass = newReferencedBeanClass;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.REFERENCED_BEAN_TYPE__REFERENCED_BEAN_CLASS, oldReferencedBeanClass, newReferencedBeanClass);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setReferencedBeanClass(ReferencedBeanClassType newReferencedBeanClass) {
-		if (newReferencedBeanClass != referencedBeanClass) {
-			NotificationChain msgs = null;
-			if (referencedBeanClass != null)
-				msgs = ((InternalEObject)referencedBeanClass).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.REFERENCED_BEAN_TYPE__REFERENCED_BEAN_CLASS, null, msgs);
-			if (newReferencedBeanClass != null)
-				msgs = ((InternalEObject)newReferencedBeanClass).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.REFERENCED_BEAN_TYPE__REFERENCED_BEAN_CLASS, null, msgs);
-			msgs = basicSetReferencedBeanClass(newReferencedBeanClass, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.REFERENCED_BEAN_TYPE__REFERENCED_BEAN_CLASS, newReferencedBeanClass, newReferencedBeanClass));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.REFERENCED_BEAN_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case FacesConfigPackage.REFERENCED_BEAN_TYPE__DESCRIPTION:
-				return ((InternalEList)getDescription()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.REFERENCED_BEAN_TYPE__DISPLAY_NAME:
-				return ((InternalEList)getDisplayName()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.REFERENCED_BEAN_TYPE__ICON:
-				return ((InternalEList)getIcon()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.REFERENCED_BEAN_TYPE__REFERENCED_BEAN_NAME:
-				return basicSetReferencedBeanName(null, msgs);
-			case FacesConfigPackage.REFERENCED_BEAN_TYPE__REFERENCED_BEAN_CLASS:
-				return basicSetReferencedBeanClass(null, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.REFERENCED_BEAN_TYPE__DESCRIPTION:
-				return getDescription();
-			case FacesConfigPackage.REFERENCED_BEAN_TYPE__DISPLAY_NAME:
-				return getDisplayName();
-			case FacesConfigPackage.REFERENCED_BEAN_TYPE__ICON:
-				return getIcon();
-			case FacesConfigPackage.REFERENCED_BEAN_TYPE__REFERENCED_BEAN_NAME:
-				return getReferencedBeanName();
-			case FacesConfigPackage.REFERENCED_BEAN_TYPE__REFERENCED_BEAN_CLASS:
-				return getReferencedBeanClass();
-			case FacesConfigPackage.REFERENCED_BEAN_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.REFERENCED_BEAN_TYPE__DESCRIPTION:
-				getDescription().clear();
-				getDescription().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.REFERENCED_BEAN_TYPE__DISPLAY_NAME:
-				getDisplayName().clear();
-				getDisplayName().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.REFERENCED_BEAN_TYPE__ICON:
-				getIcon().clear();
-				getIcon().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.REFERENCED_BEAN_TYPE__REFERENCED_BEAN_NAME:
-				setReferencedBeanName((ReferencedBeanNameType)newValue);
-				return;
-			case FacesConfigPackage.REFERENCED_BEAN_TYPE__REFERENCED_BEAN_CLASS:
-				setReferencedBeanClass((ReferencedBeanClassType)newValue);
-				return;
-			case FacesConfigPackage.REFERENCED_BEAN_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.REFERENCED_BEAN_TYPE__DESCRIPTION:
-				getDescription().clear();
-				return;
-			case FacesConfigPackage.REFERENCED_BEAN_TYPE__DISPLAY_NAME:
-				getDisplayName().clear();
-				return;
-			case FacesConfigPackage.REFERENCED_BEAN_TYPE__ICON:
-				getIcon().clear();
-				return;
-			case FacesConfigPackage.REFERENCED_BEAN_TYPE__REFERENCED_BEAN_NAME:
-				setReferencedBeanName((ReferencedBeanNameType)null);
-				return;
-			case FacesConfigPackage.REFERENCED_BEAN_TYPE__REFERENCED_BEAN_CLASS:
-				setReferencedBeanClass((ReferencedBeanClassType)null);
-				return;
-			case FacesConfigPackage.REFERENCED_BEAN_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.REFERENCED_BEAN_TYPE__DESCRIPTION:
-				return description != null && !description.isEmpty();
-			case FacesConfigPackage.REFERENCED_BEAN_TYPE__DISPLAY_NAME:
-				return displayName != null && !displayName.isEmpty();
-			case FacesConfigPackage.REFERENCED_BEAN_TYPE__ICON:
-				return icon != null && !icon.isEmpty();
-			case FacesConfigPackage.REFERENCED_BEAN_TYPE__REFERENCED_BEAN_NAME:
-				return referencedBeanName != null;
-			case FacesConfigPackage.REFERENCED_BEAN_TYPE__REFERENCED_BEAN_CLASS:
-				return referencedBeanClass != null;
-			case FacesConfigPackage.REFERENCED_BEAN_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ReferencedBeanTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/RenderKitClassTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/RenderKitClassTypeImpl.java
deleted file mode 100644
index d908748..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/RenderKitClassTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.RenderKitClassType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Render Kit Class Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitClassTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitClassTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class RenderKitClassTypeImpl extends EObjectImpl implements RenderKitClassType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected RenderKitClassTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.RENDER_KIT_CLASS_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.RENDER_KIT_CLASS_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.RENDER_KIT_CLASS_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.RENDER_KIT_CLASS_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.RENDER_KIT_CLASS_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.RENDER_KIT_CLASS_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.RENDER_KIT_CLASS_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.RENDER_KIT_CLASS_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.RENDER_KIT_CLASS_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.RENDER_KIT_CLASS_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.RENDER_KIT_CLASS_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: "); //$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //RenderKitClassTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/RenderKitExtensionTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/RenderKitExtensionTypeImpl.java
deleted file mode 100644
index e0fcbc3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/RenderKitExtensionTypeImpl.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.RenderKitExtensionType;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Render Kit Extension Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * </p>
- *
- * @generated
- */
-public class RenderKitExtensionTypeImpl extends ExtensionTypeImpl implements RenderKitExtensionType {
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    @SuppressWarnings("hiding")
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected RenderKitExtensionTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.RENDER_KIT_EXTENSION_TYPE;
-	}
-
-} //RenderKitExtensionTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/RenderKitFactoryTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/RenderKitFactoryTypeImpl.java
deleted file mode 100644
index d2a2804..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/RenderKitFactoryTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.RenderKitFactoryType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Render Kit Factory Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitFactoryTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitFactoryTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class RenderKitFactoryTypeImpl extends EObjectImpl implements RenderKitFactoryType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected RenderKitFactoryTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.RENDER_KIT_FACTORY_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.RENDER_KIT_FACTORY_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.RENDER_KIT_FACTORY_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.RENDER_KIT_FACTORY_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.RENDER_KIT_FACTORY_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.RENDER_KIT_FACTORY_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.RENDER_KIT_FACTORY_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.RENDER_KIT_FACTORY_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.RENDER_KIT_FACTORY_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.RENDER_KIT_FACTORY_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.RENDER_KIT_FACTORY_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: "); //$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //RenderKitFactoryTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/RenderKitIdTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/RenderKitIdTypeImpl.java
deleted file mode 100644
index 5f9c6cd..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/RenderKitIdTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.RenderKitIdType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Render Kit Id Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitIdTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitIdTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class RenderKitIdTypeImpl extends EObjectImpl implements RenderKitIdType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected RenderKitIdTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.RENDER_KIT_ID_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.RENDER_KIT_ID_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.RENDER_KIT_ID_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.RENDER_KIT_ID_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.RENDER_KIT_ID_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.RENDER_KIT_ID_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.RENDER_KIT_ID_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.RENDER_KIT_ID_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.RENDER_KIT_ID_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.RENDER_KIT_ID_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.RENDER_KIT_ID_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: "); //$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //RenderKitIdTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/RenderKitTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/RenderKitTypeImpl.java
deleted file mode 100644
index 55d5742..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/RenderKitTypeImpl.java
+++ /dev/null
@@ -1,551 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererType;
-import org.eclipse.jst.jsf.facesconfig.emf.DescriptionType;
-import org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.IconType;
-import org.eclipse.jst.jsf.facesconfig.emf.RenderKitClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.RenderKitExtensionType;
-import org.eclipse.jst.jsf.facesconfig.emf.RenderKitIdType;
-import org.eclipse.jst.jsf.facesconfig.emf.RenderKitType;
-import org.eclipse.jst.jsf.facesconfig.emf.RendererType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Render Kit Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitTypeImpl#getDescription <em>Description</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitTypeImpl#getDisplayName <em>Display Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitTypeImpl#getIcon <em>Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitTypeImpl#getRenderKitId <em>Render Kit Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitTypeImpl#getRenderKitClass <em>Render Kit Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitTypeImpl#getRenderer <em>Renderer</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitTypeImpl#getClientBehaviorRenderer <em>Client Behavior Renderer</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitTypeImpl#getRenderKitExtension <em>Render Kit Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class RenderKitTypeImpl extends EObjectImpl implements RenderKitType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The cached value of the '{@link #getDescription() <em>Description</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDescription()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList description;
-
-    /**
-	 * The cached value of the '{@link #getDisplayName() <em>Display Name</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDisplayName()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList displayName;
-
-    /**
-	 * The cached value of the '{@link #getIcon() <em>Icon</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getIcon()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList icon;
-
-    /**
-	 * The cached value of the '{@link #getRenderKitId() <em>Render Kit Id</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRenderKitId()
-	 * @generated
-	 * @ordered
-	 */
-	protected RenderKitIdType renderKitId;
-
-    /**
-	 * The cached value of the '{@link #getRenderKitClass() <em>Render Kit Class</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRenderKitClass()
-	 * @generated
-	 * @ordered
-	 */
-	protected RenderKitClassType renderKitClass;
-
-    /**
-	 * The cached value of the '{@link #getRenderer() <em>Renderer</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRenderer()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList renderer;
-
-    /**
-	 * The cached value of the '{@link #getClientBehaviorRenderer() <em>Client Behavior Renderer</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getClientBehaviorRenderer()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList clientBehaviorRenderer;
-
-				/**
-	 * The cached value of the '{@link #getRenderKitExtension() <em>Render Kit Extension</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see #getRenderKitExtension()
-	 * @generated
-	 * @ordered
-	 */
-    protected EList renderKitExtension;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected RenderKitTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.RENDER_KIT_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getDescription() {
-		if (description == null) {
-			description = new EObjectContainmentEList(DescriptionType.class, this, FacesConfigPackage.RENDER_KIT_TYPE__DESCRIPTION);
-		}
-		return description;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getDisplayName() {
-		if (displayName == null) {
-			displayName = new EObjectContainmentEList(DisplayNameType.class, this, FacesConfigPackage.RENDER_KIT_TYPE__DISPLAY_NAME);
-		}
-		return displayName;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getIcon() {
-		if (icon == null) {
-			icon = new EObjectContainmentEList(IconType.class, this, FacesConfigPackage.RENDER_KIT_TYPE__ICON);
-		}
-		return icon;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public RenderKitIdType getRenderKitId() {
-		return renderKitId;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newRenderKitId 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetRenderKitId(RenderKitIdType newRenderKitId, NotificationChain msgs) {
-		RenderKitIdType oldRenderKitId = renderKitId;
-		renderKitId = newRenderKitId;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.RENDER_KIT_TYPE__RENDER_KIT_ID, oldRenderKitId, newRenderKitId);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setRenderKitId(RenderKitIdType newRenderKitId) {
-		if (newRenderKitId != renderKitId) {
-			NotificationChain msgs = null;
-			if (renderKitId != null)
-				msgs = ((InternalEObject)renderKitId).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.RENDER_KIT_TYPE__RENDER_KIT_ID, null, msgs);
-			if (newRenderKitId != null)
-				msgs = ((InternalEObject)newRenderKitId).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.RENDER_KIT_TYPE__RENDER_KIT_ID, null, msgs);
-			msgs = basicSetRenderKitId(newRenderKitId, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.RENDER_KIT_TYPE__RENDER_KIT_ID, newRenderKitId, newRenderKitId));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public RenderKitClassType getRenderKitClass() {
-		return renderKitClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newRenderKitClass 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetRenderKitClass(RenderKitClassType newRenderKitClass, NotificationChain msgs) {
-		RenderKitClassType oldRenderKitClass = renderKitClass;
-		renderKitClass = newRenderKitClass;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.RENDER_KIT_TYPE__RENDER_KIT_CLASS, oldRenderKitClass, newRenderKitClass);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setRenderKitClass(RenderKitClassType newRenderKitClass) {
-		if (newRenderKitClass != renderKitClass) {
-			NotificationChain msgs = null;
-			if (renderKitClass != null)
-				msgs = ((InternalEObject)renderKitClass).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.RENDER_KIT_TYPE__RENDER_KIT_CLASS, null, msgs);
-			if (newRenderKitClass != null)
-				msgs = ((InternalEObject)newRenderKitClass).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.RENDER_KIT_TYPE__RENDER_KIT_CLASS, null, msgs);
-			msgs = basicSetRenderKitClass(newRenderKitClass, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.RENDER_KIT_TYPE__RENDER_KIT_CLASS, newRenderKitClass, newRenderKitClass));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getRenderer() {
-		if (renderer == null) {
-			renderer = new EObjectContainmentEList(RendererType.class, this, FacesConfigPackage.RENDER_KIT_TYPE__RENDERER);
-		}
-		return renderer;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getClientBehaviorRenderer() {
-		if (clientBehaviorRenderer == null) {
-			clientBehaviorRenderer = new EObjectContainmentEList(ClientBehaviorRendererType.class, this, FacesConfigPackage.RENDER_KIT_TYPE__CLIENT_BEHAVIOR_RENDERER);
-		}
-		return clientBehaviorRenderer;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EList getRenderKitExtension() {
-		if (renderKitExtension == null) {
-			renderKitExtension = new EObjectContainmentEList(RenderKitExtensionType.class, this, FacesConfigPackage.RENDER_KIT_TYPE__RENDER_KIT_EXTENSION);
-		}
-		return renderKitExtension;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.RENDER_KIT_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case FacesConfigPackage.RENDER_KIT_TYPE__DESCRIPTION:
-				return ((InternalEList)getDescription()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.RENDER_KIT_TYPE__DISPLAY_NAME:
-				return ((InternalEList)getDisplayName()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.RENDER_KIT_TYPE__ICON:
-				return ((InternalEList)getIcon()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.RENDER_KIT_TYPE__RENDER_KIT_ID:
-				return basicSetRenderKitId(null, msgs);
-			case FacesConfigPackage.RENDER_KIT_TYPE__RENDER_KIT_CLASS:
-				return basicSetRenderKitClass(null, msgs);
-			case FacesConfigPackage.RENDER_KIT_TYPE__RENDERER:
-				return ((InternalEList)getRenderer()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.RENDER_KIT_TYPE__CLIENT_BEHAVIOR_RENDERER:
-				return ((InternalEList)getClientBehaviorRenderer()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.RENDER_KIT_TYPE__RENDER_KIT_EXTENSION:
-				return ((InternalEList)getRenderKitExtension()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.RENDER_KIT_TYPE__DESCRIPTION:
-				return getDescription();
-			case FacesConfigPackage.RENDER_KIT_TYPE__DISPLAY_NAME:
-				return getDisplayName();
-			case FacesConfigPackage.RENDER_KIT_TYPE__ICON:
-				return getIcon();
-			case FacesConfigPackage.RENDER_KIT_TYPE__RENDER_KIT_ID:
-				return getRenderKitId();
-			case FacesConfigPackage.RENDER_KIT_TYPE__RENDER_KIT_CLASS:
-				return getRenderKitClass();
-			case FacesConfigPackage.RENDER_KIT_TYPE__RENDERER:
-				return getRenderer();
-			case FacesConfigPackage.RENDER_KIT_TYPE__CLIENT_BEHAVIOR_RENDERER:
-				return getClientBehaviorRenderer();
-			case FacesConfigPackage.RENDER_KIT_TYPE__RENDER_KIT_EXTENSION:
-				return getRenderKitExtension();
-			case FacesConfigPackage.RENDER_KIT_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.RENDER_KIT_TYPE__DESCRIPTION:
-				getDescription().clear();
-				getDescription().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.RENDER_KIT_TYPE__DISPLAY_NAME:
-				getDisplayName().clear();
-				getDisplayName().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.RENDER_KIT_TYPE__ICON:
-				getIcon().clear();
-				getIcon().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.RENDER_KIT_TYPE__RENDER_KIT_ID:
-				setRenderKitId((RenderKitIdType)newValue);
-				return;
-			case FacesConfigPackage.RENDER_KIT_TYPE__RENDER_KIT_CLASS:
-				setRenderKitClass((RenderKitClassType)newValue);
-				return;
-			case FacesConfigPackage.RENDER_KIT_TYPE__RENDERER:
-				getRenderer().clear();
-				getRenderer().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.RENDER_KIT_TYPE__CLIENT_BEHAVIOR_RENDERER:
-				getClientBehaviorRenderer().clear();
-				getClientBehaviorRenderer().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.RENDER_KIT_TYPE__RENDER_KIT_EXTENSION:
-				getRenderKitExtension().clear();
-				getRenderKitExtension().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.RENDER_KIT_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.RENDER_KIT_TYPE__DESCRIPTION:
-				getDescription().clear();
-				return;
-			case FacesConfigPackage.RENDER_KIT_TYPE__DISPLAY_NAME:
-				getDisplayName().clear();
-				return;
-			case FacesConfigPackage.RENDER_KIT_TYPE__ICON:
-				getIcon().clear();
-				return;
-			case FacesConfigPackage.RENDER_KIT_TYPE__RENDER_KIT_ID:
-				setRenderKitId((RenderKitIdType)null);
-				return;
-			case FacesConfigPackage.RENDER_KIT_TYPE__RENDER_KIT_CLASS:
-				setRenderKitClass((RenderKitClassType)null);
-				return;
-			case FacesConfigPackage.RENDER_KIT_TYPE__RENDERER:
-				getRenderer().clear();
-				return;
-			case FacesConfigPackage.RENDER_KIT_TYPE__CLIENT_BEHAVIOR_RENDERER:
-				getClientBehaviorRenderer().clear();
-				return;
-			case FacesConfigPackage.RENDER_KIT_TYPE__RENDER_KIT_EXTENSION:
-				getRenderKitExtension().clear();
-				return;
-			case FacesConfigPackage.RENDER_KIT_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.RENDER_KIT_TYPE__DESCRIPTION:
-				return description != null && !description.isEmpty();
-			case FacesConfigPackage.RENDER_KIT_TYPE__DISPLAY_NAME:
-				return displayName != null && !displayName.isEmpty();
-			case FacesConfigPackage.RENDER_KIT_TYPE__ICON:
-				return icon != null && !icon.isEmpty();
-			case FacesConfigPackage.RENDER_KIT_TYPE__RENDER_KIT_ID:
-				return renderKitId != null;
-			case FacesConfigPackage.RENDER_KIT_TYPE__RENDER_KIT_CLASS:
-				return renderKitClass != null;
-			case FacesConfigPackage.RENDER_KIT_TYPE__RENDERER:
-				return renderer != null && !renderer.isEmpty();
-			case FacesConfigPackage.RENDER_KIT_TYPE__CLIENT_BEHAVIOR_RENDERER:
-				return clientBehaviorRenderer != null && !clientBehaviorRenderer.isEmpty();
-			case FacesConfigPackage.RENDER_KIT_TYPE__RENDER_KIT_EXTENSION:
-				return renderKitExtension != null && !renderKitExtension.isEmpty();
-			case FacesConfigPackage.RENDER_KIT_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //RenderKitTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/RendererClassTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/RendererClassTypeImpl.java
deleted file mode 100644
index 817f53d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/RendererClassTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.RendererClassType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Renderer Class Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RendererClassTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RendererClassTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class RendererClassTypeImpl extends EObjectImpl implements RendererClassType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected RendererClassTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.RENDERER_CLASS_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.RENDERER_CLASS_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.RENDERER_CLASS_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.RENDERER_CLASS_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.RENDERER_CLASS_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.RENDERER_CLASS_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.RENDERER_CLASS_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.RENDERER_CLASS_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.RENDERER_CLASS_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.RENDERER_CLASS_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.RENDERER_CLASS_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: "); //$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //RendererClassTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/RendererExtensionTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/RendererExtensionTypeImpl.java
deleted file mode 100644
index f62d4ed..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/RendererExtensionTypeImpl.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.RendererExtensionType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Renderer Extension Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * </p>
- *
- * @generated
- */
-public class RendererExtensionTypeImpl extends ExtensionTypeImpl implements RendererExtensionType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@SuppressWarnings("hiding")
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected RendererExtensionTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.RENDERER_EXTENSION_TYPE;
-	}
-
-} //RendererExtensionTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/RendererTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/RendererTypeImpl.java
deleted file mode 100644
index 60662d2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/RendererTypeImpl.java
+++ /dev/null
@@ -1,621 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.facesconfig.emf.AttributeType;
-import org.eclipse.jst.jsf.facesconfig.emf.ComponentFamilyType;
-import org.eclipse.jst.jsf.facesconfig.emf.DescriptionType;
-import org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.FacetType;
-import org.eclipse.jst.jsf.facesconfig.emf.IconType;
-import org.eclipse.jst.jsf.facesconfig.emf.RendererClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.RendererExtensionType;
-import org.eclipse.jst.jsf.facesconfig.emf.RendererType;
-import org.eclipse.jst.jsf.facesconfig.emf.RendererTypeType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Renderer Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RendererTypeImpl#getDescription <em>Description</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RendererTypeImpl#getDisplayName <em>Display Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RendererTypeImpl#getIcon <em>Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RendererTypeImpl#getComponentFamily <em>Component Family</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RendererTypeImpl#getRendererType <em>Renderer Type</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RendererTypeImpl#getRendererClass <em>Renderer Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RendererTypeImpl#getFacet <em>Facet</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RendererTypeImpl#getAttribute <em>Attribute</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RendererTypeImpl#getRendererExtension <em>Renderer Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RendererTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class RendererTypeImpl extends EObjectImpl implements RendererType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The cached value of the '{@link #getDescription() <em>Description</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDescription()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList description;
-
-    /**
-	 * The cached value of the '{@link #getDisplayName() <em>Display Name</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDisplayName()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList displayName;
-
-    /**
-	 * The cached value of the '{@link #getIcon() <em>Icon</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getIcon()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList icon;
-
-    /**
-	 * The cached value of the '{@link #getComponentFamily() <em>Component Family</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getComponentFamily()
-	 * @generated
-	 * @ordered
-	 */
-	protected ComponentFamilyType componentFamily;
-
-    /**
-	 * The cached value of the '{@link #getRendererType() <em>Renderer Type</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRendererType()
-	 * @generated
-	 * @ordered
-	 */
-	protected RendererTypeType rendererType;
-
-    /**
-	 * The cached value of the '{@link #getRendererClass() <em>Renderer Class</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRendererClass()
-	 * @generated
-	 * @ordered
-	 */
-	protected RendererClassType rendererClass;
-
-    /**
-	 * The cached value of the '{@link #getFacet() <em>Facet</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getFacet()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList facet;
-
-    /**
-	 * The cached value of the '{@link #getAttribute() <em>Attribute</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getAttribute()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList attribute;
-
-    /**
-	 * The cached value of the '{@link #getRendererExtension() <em>Renderer Extension</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRendererExtension()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList rendererExtension;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected RendererTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.RENDERER_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getDescription() {
-		if (description == null) {
-			description = new EObjectContainmentEList(DescriptionType.class, this, FacesConfigPackage.RENDERER_TYPE__DESCRIPTION);
-		}
-		return description;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getDisplayName() {
-		if (displayName == null) {
-			displayName = new EObjectContainmentEList(DisplayNameType.class, this, FacesConfigPackage.RENDERER_TYPE__DISPLAY_NAME);
-		}
-		return displayName;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getIcon() {
-		if (icon == null) {
-			icon = new EObjectContainmentEList(IconType.class, this, FacesConfigPackage.RENDERER_TYPE__ICON);
-		}
-		return icon;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ComponentFamilyType getComponentFamily() {
-		return componentFamily;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newComponentFamily 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetComponentFamily(ComponentFamilyType newComponentFamily, NotificationChain msgs) {
-		ComponentFamilyType oldComponentFamily = componentFamily;
-		componentFamily = newComponentFamily;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.RENDERER_TYPE__COMPONENT_FAMILY, oldComponentFamily, newComponentFamily);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setComponentFamily(ComponentFamilyType newComponentFamily) {
-		if (newComponentFamily != componentFamily) {
-			NotificationChain msgs = null;
-			if (componentFamily != null)
-				msgs = ((InternalEObject)componentFamily).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.RENDERER_TYPE__COMPONENT_FAMILY, null, msgs);
-			if (newComponentFamily != null)
-				msgs = ((InternalEObject)newComponentFamily).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.RENDERER_TYPE__COMPONENT_FAMILY, null, msgs);
-			msgs = basicSetComponentFamily(newComponentFamily, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.RENDERER_TYPE__COMPONENT_FAMILY, newComponentFamily, newComponentFamily));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public RendererTypeType getRendererType() {
-		return rendererType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newRendererType 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetRendererType(RendererTypeType newRendererType, NotificationChain msgs) {
-		RendererTypeType oldRendererType = rendererType;
-		rendererType = newRendererType;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.RENDERER_TYPE__RENDERER_TYPE, oldRendererType, newRendererType);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setRendererType(RendererTypeType newRendererType) {
-		if (newRendererType != rendererType) {
-			NotificationChain msgs = null;
-			if (rendererType != null)
-				msgs = ((InternalEObject)rendererType).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.RENDERER_TYPE__RENDERER_TYPE, null, msgs);
-			if (newRendererType != null)
-				msgs = ((InternalEObject)newRendererType).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.RENDERER_TYPE__RENDERER_TYPE, null, msgs);
-			msgs = basicSetRendererType(newRendererType, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.RENDERER_TYPE__RENDERER_TYPE, newRendererType, newRendererType));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public RendererClassType getRendererClass() {
-		return rendererClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newRendererClass 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetRendererClass(RendererClassType newRendererClass, NotificationChain msgs) {
-		RendererClassType oldRendererClass = rendererClass;
-		rendererClass = newRendererClass;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.RENDERER_TYPE__RENDERER_CLASS, oldRendererClass, newRendererClass);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setRendererClass(RendererClassType newRendererClass) {
-		if (newRendererClass != rendererClass) {
-			NotificationChain msgs = null;
-			if (rendererClass != null)
-				msgs = ((InternalEObject)rendererClass).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.RENDERER_TYPE__RENDERER_CLASS, null, msgs);
-			if (newRendererClass != null)
-				msgs = ((InternalEObject)newRendererClass).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.RENDERER_TYPE__RENDERER_CLASS, null, msgs);
-			msgs = basicSetRendererClass(newRendererClass, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.RENDERER_TYPE__RENDERER_CLASS, newRendererClass, newRendererClass));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getFacet() {
-		if (facet == null) {
-			facet = new EObjectContainmentEList(FacetType.class, this, FacesConfigPackage.RENDERER_TYPE__FACET);
-		}
-		return facet;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getAttribute() {
-		if (attribute == null) {
-			attribute = new EObjectContainmentEList(AttributeType.class, this, FacesConfigPackage.RENDERER_TYPE__ATTRIBUTE);
-		}
-		return attribute;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getRendererExtension() {
-		if (rendererExtension == null) {
-			rendererExtension = new EObjectContainmentEList(RendererExtensionType.class, this, FacesConfigPackage.RENDERER_TYPE__RENDERER_EXTENSION);
-		}
-		return rendererExtension;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.RENDERER_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case FacesConfigPackage.RENDERER_TYPE__DESCRIPTION:
-				return ((InternalEList)getDescription()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.RENDERER_TYPE__DISPLAY_NAME:
-				return ((InternalEList)getDisplayName()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.RENDERER_TYPE__ICON:
-				return ((InternalEList)getIcon()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.RENDERER_TYPE__COMPONENT_FAMILY:
-				return basicSetComponentFamily(null, msgs);
-			case FacesConfigPackage.RENDERER_TYPE__RENDERER_TYPE:
-				return basicSetRendererType(null, msgs);
-			case FacesConfigPackage.RENDERER_TYPE__RENDERER_CLASS:
-				return basicSetRendererClass(null, msgs);
-			case FacesConfigPackage.RENDERER_TYPE__FACET:
-				return ((InternalEList)getFacet()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.RENDERER_TYPE__ATTRIBUTE:
-				return ((InternalEList)getAttribute()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.RENDERER_TYPE__RENDERER_EXTENSION:
-				return ((InternalEList)getRendererExtension()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.RENDERER_TYPE__DESCRIPTION:
-				return getDescription();
-			case FacesConfigPackage.RENDERER_TYPE__DISPLAY_NAME:
-				return getDisplayName();
-			case FacesConfigPackage.RENDERER_TYPE__ICON:
-				return getIcon();
-			case FacesConfigPackage.RENDERER_TYPE__COMPONENT_FAMILY:
-				return getComponentFamily();
-			case FacesConfigPackage.RENDERER_TYPE__RENDERER_TYPE:
-				return getRendererType();
-			case FacesConfigPackage.RENDERER_TYPE__RENDERER_CLASS:
-				return getRendererClass();
-			case FacesConfigPackage.RENDERER_TYPE__FACET:
-				return getFacet();
-			case FacesConfigPackage.RENDERER_TYPE__ATTRIBUTE:
-				return getAttribute();
-			case FacesConfigPackage.RENDERER_TYPE__RENDERER_EXTENSION:
-				return getRendererExtension();
-			case FacesConfigPackage.RENDERER_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.RENDERER_TYPE__DESCRIPTION:
-				getDescription().clear();
-				getDescription().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.RENDERER_TYPE__DISPLAY_NAME:
-				getDisplayName().clear();
-				getDisplayName().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.RENDERER_TYPE__ICON:
-				getIcon().clear();
-				getIcon().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.RENDERER_TYPE__COMPONENT_FAMILY:
-				setComponentFamily((ComponentFamilyType)newValue);
-				return;
-			case FacesConfigPackage.RENDERER_TYPE__RENDERER_TYPE:
-				setRendererType((RendererTypeType)newValue);
-				return;
-			case FacesConfigPackage.RENDERER_TYPE__RENDERER_CLASS:
-				setRendererClass((RendererClassType)newValue);
-				return;
-			case FacesConfigPackage.RENDERER_TYPE__FACET:
-				getFacet().clear();
-				getFacet().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.RENDERER_TYPE__ATTRIBUTE:
-				getAttribute().clear();
-				getAttribute().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.RENDERER_TYPE__RENDERER_EXTENSION:
-				getRendererExtension().clear();
-				getRendererExtension().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.RENDERER_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.RENDERER_TYPE__DESCRIPTION:
-				getDescription().clear();
-				return;
-			case FacesConfigPackage.RENDERER_TYPE__DISPLAY_NAME:
-				getDisplayName().clear();
-				return;
-			case FacesConfigPackage.RENDERER_TYPE__ICON:
-				getIcon().clear();
-				return;
-			case FacesConfigPackage.RENDERER_TYPE__COMPONENT_FAMILY:
-				setComponentFamily((ComponentFamilyType)null);
-				return;
-			case FacesConfigPackage.RENDERER_TYPE__RENDERER_TYPE:
-				setRendererType((RendererTypeType)null);
-				return;
-			case FacesConfigPackage.RENDERER_TYPE__RENDERER_CLASS:
-				setRendererClass((RendererClassType)null);
-				return;
-			case FacesConfigPackage.RENDERER_TYPE__FACET:
-				getFacet().clear();
-				return;
-			case FacesConfigPackage.RENDERER_TYPE__ATTRIBUTE:
-				getAttribute().clear();
-				return;
-			case FacesConfigPackage.RENDERER_TYPE__RENDERER_EXTENSION:
-				getRendererExtension().clear();
-				return;
-			case FacesConfigPackage.RENDERER_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.RENDERER_TYPE__DESCRIPTION:
-				return description != null && !description.isEmpty();
-			case FacesConfigPackage.RENDERER_TYPE__DISPLAY_NAME:
-				return displayName != null && !displayName.isEmpty();
-			case FacesConfigPackage.RENDERER_TYPE__ICON:
-				return icon != null && !icon.isEmpty();
-			case FacesConfigPackage.RENDERER_TYPE__COMPONENT_FAMILY:
-				return componentFamily != null;
-			case FacesConfigPackage.RENDERER_TYPE__RENDERER_TYPE:
-				return rendererType != null;
-			case FacesConfigPackage.RENDERER_TYPE__RENDERER_CLASS:
-				return rendererClass != null;
-			case FacesConfigPackage.RENDERER_TYPE__FACET:
-				return facet != null && !facet.isEmpty();
-			case FacesConfigPackage.RENDERER_TYPE__ATTRIBUTE:
-				return attribute != null && !attribute.isEmpty();
-			case FacesConfigPackage.RENDERER_TYPE__RENDERER_EXTENSION:
-				return rendererExtension != null && !rendererExtension.isEmpty();
-			case FacesConfigPackage.RENDERER_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //RendererTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/RendererTypeTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/RendererTypeTypeImpl.java
deleted file mode 100644
index 115a166..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/RendererTypeTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.RendererTypeType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Renderer Type Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RendererTypeTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RendererTypeTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class RendererTypeTypeImpl extends EObjectImpl implements RendererTypeType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected RendererTypeTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.RENDERER_TYPE_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.RENDERER_TYPE_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.RENDERER_TYPE_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.RENDERER_TYPE_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.RENDERER_TYPE_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.RENDERER_TYPE_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.RENDERER_TYPE_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.RENDERER_TYPE_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.RENDERER_TYPE_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.RENDERER_TYPE_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.RENDERER_TYPE_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: "); //$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //RendererTypeTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ResourceBundleTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ResourceBundleTypeImpl.java
deleted file mode 100644
index 78418e0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ResourceBundleTypeImpl.java
+++ /dev/null
@@ -1,423 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.facesconfig.emf.BaseNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.DescriptionType;
-import org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.IconType;
-import org.eclipse.jst.jsf.facesconfig.emf.ResourceBundleType;
-import org.eclipse.jst.jsf.facesconfig.emf.VarType;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Resource Bundle Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ResourceBundleTypeImpl#getDescription <em>Description</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ResourceBundleTypeImpl#getDisplayName <em>Display Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ResourceBundleTypeImpl#getIcon <em>Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ResourceBundleTypeImpl#getBaseName <em>Base Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ResourceBundleTypeImpl#getVar <em>Var</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ResourceBundleTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ResourceBundleTypeImpl extends EObjectImpl implements ResourceBundleType {
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The cached value of the '{@link #getDescription() <em>Description</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see #getDescription()
-	 * @generated
-	 * @ordered
-	 */
-    protected EList description;
-
-    /**
-	 * The cached value of the '{@link #getDisplayName() <em>Display Name</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see #getDisplayName()
-	 * @generated
-	 * @ordered
-	 */
-    protected EList displayName;
-
-    /**
-	 * The cached value of the '{@link #getIcon() <em>Icon</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see #getIcon()
-	 * @generated
-	 * @ordered
-	 */
-    protected EList icon;
-
-    /**
-	 * The cached value of the '{@link #getBaseName() <em>Base Name</em>}' reference.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see #getBaseName()
-	 * @generated
-	 * @ordered
-	 */
-    protected BaseNameType baseName;
-
-    /**
-	 * The cached value of the '{@link #getVar() <em>Var</em>}' reference.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see #getVar()
-	 * @generated
-	 * @ordered
-	 */
-    protected VarType var;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-    protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-    protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected ResourceBundleTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.RESOURCE_BUNDLE_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EList getDescription() {
-		if (description == null) {
-			description = new EObjectContainmentEList(DescriptionType.class, this, FacesConfigPackage.RESOURCE_BUNDLE_TYPE__DESCRIPTION);
-		}
-		return description;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EList getDisplayName() {
-		if (displayName == null) {
-			displayName = new EObjectContainmentEList(DisplayNameType.class, this, FacesConfigPackage.RESOURCE_BUNDLE_TYPE__DISPLAY_NAME);
-		}
-		return displayName;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EList getIcon() {
-		if (icon == null) {
-			icon = new EObjectContainmentEList(IconType.class, this, FacesConfigPackage.RESOURCE_BUNDLE_TYPE__ICON);
-		}
-		return icon;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public BaseNameType getBaseName() {
-		if (baseName != null && baseName.eIsProxy()) {
-			InternalEObject oldBaseName = (InternalEObject)baseName;
-			baseName = (BaseNameType)eResolveProxy(oldBaseName);
-			if (baseName != oldBaseName) {
-				if (eNotificationRequired())
-					eNotify(new ENotificationImpl(this, Notification.RESOLVE, FacesConfigPackage.RESOURCE_BUNDLE_TYPE__BASE_NAME, oldBaseName, baseName));
-			}
-		}
-		return baseName;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @return the base name 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public BaseNameType basicGetBaseName() {
-		return baseName;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void setBaseName(BaseNameType newBaseName) {
-		BaseNameType oldBaseName = baseName;
-		baseName = newBaseName;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.RESOURCE_BUNDLE_TYPE__BASE_NAME, oldBaseName, baseName));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public VarType getVar() {
-		if (var != null && var.eIsProxy()) {
-			InternalEObject oldVar = (InternalEObject)var;
-			var = (VarType)eResolveProxy(oldVar);
-			if (var != oldVar) {
-				if (eNotificationRequired())
-					eNotify(new ENotificationImpl(this, Notification.RESOLVE, FacesConfigPackage.RESOURCE_BUNDLE_TYPE__VAR, oldVar, var));
-			}
-		}
-		return var;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @return the variable 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public VarType basicGetVar() {
-		return var;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void setVar(VarType newVar) {
-		VarType oldVar = var;
-		var = newVar;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.RESOURCE_BUNDLE_TYPE__VAR, oldVar, var));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.RESOURCE_BUNDLE_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case FacesConfigPackage.RESOURCE_BUNDLE_TYPE__DESCRIPTION:
-				return ((InternalEList)getDescription()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.RESOURCE_BUNDLE_TYPE__DISPLAY_NAME:
-				return ((InternalEList)getDisplayName()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.RESOURCE_BUNDLE_TYPE__ICON:
-				return ((InternalEList)getIcon()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.RESOURCE_BUNDLE_TYPE__DESCRIPTION:
-				return getDescription();
-			case FacesConfigPackage.RESOURCE_BUNDLE_TYPE__DISPLAY_NAME:
-				return getDisplayName();
-			case FacesConfigPackage.RESOURCE_BUNDLE_TYPE__ICON:
-				return getIcon();
-			case FacesConfigPackage.RESOURCE_BUNDLE_TYPE__BASE_NAME:
-				if (resolve) return getBaseName();
-				return basicGetBaseName();
-			case FacesConfigPackage.RESOURCE_BUNDLE_TYPE__VAR:
-				if (resolve) return getVar();
-				return basicGetVar();
-			case FacesConfigPackage.RESOURCE_BUNDLE_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.RESOURCE_BUNDLE_TYPE__DESCRIPTION:
-				getDescription().clear();
-				getDescription().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.RESOURCE_BUNDLE_TYPE__DISPLAY_NAME:
-				getDisplayName().clear();
-				getDisplayName().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.RESOURCE_BUNDLE_TYPE__ICON:
-				getIcon().clear();
-				getIcon().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.RESOURCE_BUNDLE_TYPE__BASE_NAME:
-				setBaseName((BaseNameType)newValue);
-				return;
-			case FacesConfigPackage.RESOURCE_BUNDLE_TYPE__VAR:
-				setVar((VarType)newValue);
-				return;
-			case FacesConfigPackage.RESOURCE_BUNDLE_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.RESOURCE_BUNDLE_TYPE__DESCRIPTION:
-				getDescription().clear();
-				return;
-			case FacesConfigPackage.RESOURCE_BUNDLE_TYPE__DISPLAY_NAME:
-				getDisplayName().clear();
-				return;
-			case FacesConfigPackage.RESOURCE_BUNDLE_TYPE__ICON:
-				getIcon().clear();
-				return;
-			case FacesConfigPackage.RESOURCE_BUNDLE_TYPE__BASE_NAME:
-				setBaseName((BaseNameType)null);
-				return;
-			case FacesConfigPackage.RESOURCE_BUNDLE_TYPE__VAR:
-				setVar((VarType)null);
-				return;
-			case FacesConfigPackage.RESOURCE_BUNDLE_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.RESOURCE_BUNDLE_TYPE__DESCRIPTION:
-				return description != null && !description.isEmpty();
-			case FacesConfigPackage.RESOURCE_BUNDLE_TYPE__DISPLAY_NAME:
-				return displayName != null && !displayName.isEmpty();
-			case FacesConfigPackage.RESOURCE_BUNDLE_TYPE__ICON:
-				return icon != null && !icon.isEmpty();
-			case FacesConfigPackage.RESOURCE_BUNDLE_TYPE__BASE_NAME:
-				return baseName != null;
-			case FacesConfigPackage.RESOURCE_BUNDLE_TYPE__VAR:
-				return var != null;
-			case FacesConfigPackage.RESOURCE_BUNDLE_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-    public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ResourceBundleTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ResourceHandlerTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ResourceHandlerTypeImpl.java
deleted file mode 100644
index 19ea0f2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ResourceHandlerTypeImpl.java
+++ /dev/null
@@ -1,224 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ResourceHandlerType;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Resource Handler Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ResourceHandlerTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ResourceHandlerTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ResourceHandlerTypeImpl extends EObjectImpl implements ResourceHandlerType {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ResourceHandlerTypeImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.RESOURCE_HANDLER_TYPE;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.RESOURCE_HANDLER_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.RESOURCE_HANDLER_TYPE__ID, oldId, id));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.RESOURCE_HANDLER_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.RESOURCE_HANDLER_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.RESOURCE_HANDLER_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.RESOURCE_HANDLER_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.RESOURCE_HANDLER_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.RESOURCE_HANDLER_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.RESOURCE_HANDLER_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.RESOURCE_HANDLER_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: "); //$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ResourceHandlerTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/SmallIconTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/SmallIconTypeImpl.java
deleted file mode 100644
index 8f3582f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/SmallIconTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.SmallIconType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Small Icon Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.SmallIconTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.SmallIconTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class SmallIconTypeImpl extends EObjectImpl implements SmallIconType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected SmallIconTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.SMALL_ICON_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.SMALL_ICON_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.SMALL_ICON_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.SMALL_ICON_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.SMALL_ICON_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.SMALL_ICON_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.SMALL_ICON_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.SMALL_ICON_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.SMALL_ICON_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.SMALL_ICON_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.SMALL_ICON_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: "); //$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //SmallIconTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/SourceClassTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/SourceClassTypeImpl.java
deleted file mode 100644
index d10ce02..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/SourceClassTypeImpl.java
+++ /dev/null
@@ -1,224 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.SourceClassType;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Source Class Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.SourceClassTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.SourceClassTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class SourceClassTypeImpl extends EObjectImpl implements SourceClassType {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected SourceClassTypeImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.SOURCE_CLASS_TYPE;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.SOURCE_CLASS_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.SOURCE_CLASS_TYPE__ID, oldId, id));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.SOURCE_CLASS_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.SOURCE_CLASS_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.SOURCE_CLASS_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.SOURCE_CLASS_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.SOURCE_CLASS_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.SOURCE_CLASS_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.SOURCE_CLASS_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.SOURCE_CLASS_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: "); //$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //SourceClassTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/StateManagerTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/StateManagerTypeImpl.java
deleted file mode 100644
index fed3b97..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/StateManagerTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.StateManagerType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>State Manager Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.StateManagerTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.StateManagerTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class StateManagerTypeImpl extends EObjectImpl implements StateManagerType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected StateManagerTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.STATE_MANAGER_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.STATE_MANAGER_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.STATE_MANAGER_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.STATE_MANAGER_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.STATE_MANAGER_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.STATE_MANAGER_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.STATE_MANAGER_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.STATE_MANAGER_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.STATE_MANAGER_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.STATE_MANAGER_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.STATE_MANAGER_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: "); //$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //StateManagerTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/SuggestedValueTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/SuggestedValueTypeImpl.java
deleted file mode 100644
index 662fa42..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/SuggestedValueTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.SuggestedValueType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Suggested Value Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.SuggestedValueTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.SuggestedValueTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class SuggestedValueTypeImpl extends EObjectImpl implements SuggestedValueType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected SuggestedValueTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.SUGGESTED_VALUE_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.SUGGESTED_VALUE_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.SUGGESTED_VALUE_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.SUGGESTED_VALUE_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.SUGGESTED_VALUE_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.SUGGESTED_VALUE_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.SUGGESTED_VALUE_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.SUGGESTED_VALUE_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.SUGGESTED_VALUE_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.SUGGESTED_VALUE_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.SUGGESTED_VALUE_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: "); //$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //SuggestedValueTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/SupportedLocaleTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/SupportedLocaleTypeImpl.java
deleted file mode 100644
index 4ae4aed..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/SupportedLocaleTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.SupportedLocaleType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Supported Locale Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.SupportedLocaleTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.SupportedLocaleTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class SupportedLocaleTypeImpl extends EObjectImpl implements SupportedLocaleType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected SupportedLocaleTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.SUPPORTED_LOCALE_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.SUPPORTED_LOCALE_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.SUPPORTED_LOCALE_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.SUPPORTED_LOCALE_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.SUPPORTED_LOCALE_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.SUPPORTED_LOCALE_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.SUPPORTED_LOCALE_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.SUPPORTED_LOCALE_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.SUPPORTED_LOCALE_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.SUPPORTED_LOCALE_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.SUPPORTED_LOCALE_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: "); //$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //SupportedLocaleTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/SystemEventClassTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/SystemEventClassTypeImpl.java
deleted file mode 100644
index a32b0c1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/SystemEventClassTypeImpl.java
+++ /dev/null
@@ -1,224 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.SystemEventClassType;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>System Event Class Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.SystemEventClassTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.SystemEventClassTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class SystemEventClassTypeImpl extends EObjectImpl implements SystemEventClassType {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected SystemEventClassTypeImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.SYSTEM_EVENT_CLASS_TYPE;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.SYSTEM_EVENT_CLASS_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.SYSTEM_EVENT_CLASS_TYPE__ID, oldId, id));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.SYSTEM_EVENT_CLASS_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.SYSTEM_EVENT_CLASS_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.SYSTEM_EVENT_CLASS_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.SYSTEM_EVENT_CLASS_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.SYSTEM_EVENT_CLASS_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.SYSTEM_EVENT_CLASS_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.SYSTEM_EVENT_CLASS_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.SYSTEM_EVENT_CLASS_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: "); //$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //SystemEventClassTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/SystemEventListenerClassTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/SystemEventListenerClassTypeImpl.java
deleted file mode 100644
index bfe4c2a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/SystemEventListenerClassTypeImpl.java
+++ /dev/null
@@ -1,224 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.SystemEventListenerClassType;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>System Event Listener Class Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.SystemEventListenerClassTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.SystemEventListenerClassTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class SystemEventListenerClassTypeImpl extends EObjectImpl implements SystemEventListenerClassType {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected SystemEventListenerClassTypeImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.SYSTEM_EVENT_LISTENER_CLASS_TYPE;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.SYSTEM_EVENT_LISTENER_CLASS_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.SYSTEM_EVENT_LISTENER_CLASS_TYPE__ID, oldId, id));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.SYSTEM_EVENT_LISTENER_CLASS_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.SYSTEM_EVENT_LISTENER_CLASS_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.SYSTEM_EVENT_LISTENER_CLASS_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.SYSTEM_EVENT_LISTENER_CLASS_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.SYSTEM_EVENT_LISTENER_CLASS_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.SYSTEM_EVENT_LISTENER_CLASS_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.SYSTEM_EVENT_LISTENER_CLASS_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.SYSTEM_EVENT_LISTENER_CLASS_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: "); //$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //SystemEventListenerClassTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/SystemEventListenerTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/SystemEventListenerTypeImpl.java
deleted file mode 100644
index 26d8c6c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/SystemEventListenerTypeImpl.java
+++ /dev/null
@@ -1,393 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.SourceClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.SystemEventClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.SystemEventListenerClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.SystemEventListenerType;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>System Event Listener Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.SystemEventListenerTypeImpl#getSystemEventListenerClass <em>System Event Listener Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.SystemEventListenerTypeImpl#getSystemEventClass <em>System Event Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.SystemEventListenerTypeImpl#getSourceClass <em>Source Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.SystemEventListenerTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class SystemEventListenerTypeImpl extends EObjectImpl implements SystemEventListenerType {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * The cached value of the '{@link #getSystemEventListenerClass() <em>System Event Listener Class</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getSystemEventListenerClass()
-	 * @generated
-	 * @ordered
-	 */
-	protected SystemEventListenerClassType systemEventListenerClass;
-
-	/**
-	 * The cached value of the '{@link #getSystemEventClass() <em>System Event Class</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getSystemEventClass()
-	 * @generated
-	 * @ordered
-	 */
-	protected SystemEventClassType systemEventClass;
-
-	/**
-	 * The cached value of the '{@link #getSourceClass() <em>Source Class</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getSourceClass()
-	 * @generated
-	 * @ordered
-	 */
-	protected SourceClassType sourceClass;
-
-	/**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected SystemEventListenerTypeImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.SYSTEM_EVENT_LISTENER_TYPE;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public SystemEventListenerClassType getSystemEventListenerClass() {
-		return systemEventListenerClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @param newSystemEventListenerClass 
-	 * @param msgs 
-	 * @return NotificationChain
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetSystemEventListenerClass(SystemEventListenerClassType newSystemEventListenerClass, NotificationChain msgs) {
-		SystemEventListenerClassType oldSystemEventListenerClass = systemEventListenerClass;
-		systemEventListenerClass = newSystemEventListenerClass;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.SYSTEM_EVENT_LISTENER_TYPE__SYSTEM_EVENT_LISTENER_CLASS, oldSystemEventListenerClass, newSystemEventListenerClass);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setSystemEventListenerClass(SystemEventListenerClassType newSystemEventListenerClass) {
-		if (newSystemEventListenerClass != systemEventListenerClass) {
-			NotificationChain msgs = null;
-			if (systemEventListenerClass != null)
-				msgs = ((InternalEObject)systemEventListenerClass).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.SYSTEM_EVENT_LISTENER_TYPE__SYSTEM_EVENT_LISTENER_CLASS, null, msgs);
-			if (newSystemEventListenerClass != null)
-				msgs = ((InternalEObject)newSystemEventListenerClass).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.SYSTEM_EVENT_LISTENER_TYPE__SYSTEM_EVENT_LISTENER_CLASS, null, msgs);
-			msgs = basicSetSystemEventListenerClass(newSystemEventListenerClass, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.SYSTEM_EVENT_LISTENER_TYPE__SYSTEM_EVENT_LISTENER_CLASS, newSystemEventListenerClass, newSystemEventListenerClass));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public SystemEventClassType getSystemEventClass() {
-		return systemEventClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @param newSystemEventClass 
-	 * @param msgs 
-	 * @return NotificationChain
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetSystemEventClass(SystemEventClassType newSystemEventClass, NotificationChain msgs) {
-		SystemEventClassType oldSystemEventClass = systemEventClass;
-		systemEventClass = newSystemEventClass;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.SYSTEM_EVENT_LISTENER_TYPE__SYSTEM_EVENT_CLASS, oldSystemEventClass, newSystemEventClass);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setSystemEventClass(SystemEventClassType newSystemEventClass) {
-		if (newSystemEventClass != systemEventClass) {
-			NotificationChain msgs = null;
-			if (systemEventClass != null)
-				msgs = ((InternalEObject)systemEventClass).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.SYSTEM_EVENT_LISTENER_TYPE__SYSTEM_EVENT_CLASS, null, msgs);
-			if (newSystemEventClass != null)
-				msgs = ((InternalEObject)newSystemEventClass).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.SYSTEM_EVENT_LISTENER_TYPE__SYSTEM_EVENT_CLASS, null, msgs);
-			msgs = basicSetSystemEventClass(newSystemEventClass, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.SYSTEM_EVENT_LISTENER_TYPE__SYSTEM_EVENT_CLASS, newSystemEventClass, newSystemEventClass));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public SourceClassType getSourceClass() {
-		return sourceClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @param newSourceClass 
-	 * @param msgs 
-	 * @return NotificationChain
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetSourceClass(SourceClassType newSourceClass, NotificationChain msgs) {
-		SourceClassType oldSourceClass = sourceClass;
-		sourceClass = newSourceClass;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.SYSTEM_EVENT_LISTENER_TYPE__SOURCE_CLASS, oldSourceClass, newSourceClass);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setSourceClass(SourceClassType newSourceClass) {
-		if (newSourceClass != sourceClass) {
-			NotificationChain msgs = null;
-			if (sourceClass != null)
-				msgs = ((InternalEObject)sourceClass).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.SYSTEM_EVENT_LISTENER_TYPE__SOURCE_CLASS, null, msgs);
-			if (newSourceClass != null)
-				msgs = ((InternalEObject)newSourceClass).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.SYSTEM_EVENT_LISTENER_TYPE__SOURCE_CLASS, null, msgs);
-			msgs = basicSetSourceClass(newSourceClass, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.SYSTEM_EVENT_LISTENER_TYPE__SOURCE_CLASS, newSourceClass, newSourceClass));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.SYSTEM_EVENT_LISTENER_TYPE__ID, oldId, id));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case FacesConfigPackage.SYSTEM_EVENT_LISTENER_TYPE__SYSTEM_EVENT_LISTENER_CLASS:
-				return basicSetSystemEventListenerClass(null, msgs);
-			case FacesConfigPackage.SYSTEM_EVENT_LISTENER_TYPE__SYSTEM_EVENT_CLASS:
-				return basicSetSystemEventClass(null, msgs);
-			case FacesConfigPackage.SYSTEM_EVENT_LISTENER_TYPE__SOURCE_CLASS:
-				return basicSetSourceClass(null, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.SYSTEM_EVENT_LISTENER_TYPE__SYSTEM_EVENT_LISTENER_CLASS:
-				return getSystemEventListenerClass();
-			case FacesConfigPackage.SYSTEM_EVENT_LISTENER_TYPE__SYSTEM_EVENT_CLASS:
-				return getSystemEventClass();
-			case FacesConfigPackage.SYSTEM_EVENT_LISTENER_TYPE__SOURCE_CLASS:
-				return getSourceClass();
-			case FacesConfigPackage.SYSTEM_EVENT_LISTENER_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.SYSTEM_EVENT_LISTENER_TYPE__SYSTEM_EVENT_LISTENER_CLASS:
-				setSystemEventListenerClass((SystemEventListenerClassType)newValue);
-				return;
-			case FacesConfigPackage.SYSTEM_EVENT_LISTENER_TYPE__SYSTEM_EVENT_CLASS:
-				setSystemEventClass((SystemEventClassType)newValue);
-				return;
-			case FacesConfigPackage.SYSTEM_EVENT_LISTENER_TYPE__SOURCE_CLASS:
-				setSourceClass((SourceClassType)newValue);
-				return;
-			case FacesConfigPackage.SYSTEM_EVENT_LISTENER_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.SYSTEM_EVENT_LISTENER_TYPE__SYSTEM_EVENT_LISTENER_CLASS:
-				setSystemEventListenerClass((SystemEventListenerClassType)null);
-				return;
-			case FacesConfigPackage.SYSTEM_EVENT_LISTENER_TYPE__SYSTEM_EVENT_CLASS:
-				setSystemEventClass((SystemEventClassType)null);
-				return;
-			case FacesConfigPackage.SYSTEM_EVENT_LISTENER_TYPE__SOURCE_CLASS:
-				setSourceClass((SourceClassType)null);
-				return;
-			case FacesConfigPackage.SYSTEM_EVENT_LISTENER_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.SYSTEM_EVENT_LISTENER_TYPE__SYSTEM_EVENT_LISTENER_CLASS:
-				return systemEventListenerClass != null;
-			case FacesConfigPackage.SYSTEM_EVENT_LISTENER_TYPE__SYSTEM_EVENT_CLASS:
-				return systemEventClass != null;
-			case FacesConfigPackage.SYSTEM_EVENT_LISTENER_TYPE__SOURCE_CLASS:
-				return sourceClass != null;
-			case FacesConfigPackage.SYSTEM_EVENT_LISTENER_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //SystemEventListenerTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/TagHandlerDelegateFactoryTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/TagHandlerDelegateFactoryTypeImpl.java
deleted file mode 100644
index b5a9c4f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/TagHandlerDelegateFactoryTypeImpl.java
+++ /dev/null
@@ -1,224 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.TagHandlerDelegateFactoryType;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Tag Handler Delegate Factory Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.TagHandlerDelegateFactoryTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.TagHandlerDelegateFactoryTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class TagHandlerDelegateFactoryTypeImpl extends EObjectImpl implements TagHandlerDelegateFactoryType {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected TagHandlerDelegateFactoryTypeImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.TAG_HANDLER_DELEGATE_FACTORY_TYPE;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.TAG_HANDLER_DELEGATE_FACTORY_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.TAG_HANDLER_DELEGATE_FACTORY_TYPE__ID, oldId, id));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.TAG_HANDLER_DELEGATE_FACTORY_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.TAG_HANDLER_DELEGATE_FACTORY_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.TAG_HANDLER_DELEGATE_FACTORY_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.TAG_HANDLER_DELEGATE_FACTORY_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.TAG_HANDLER_DELEGATE_FACTORY_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.TAG_HANDLER_DELEGATE_FACTORY_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.TAG_HANDLER_DELEGATE_FACTORY_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.TAG_HANDLER_DELEGATE_FACTORY_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: "); //$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //TagHandlerDelegateFactoryTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ToViewIdTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ToViewIdTypeImpl.java
deleted file mode 100644
index 891286a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ToViewIdTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ToViewIdType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>To View Id Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ToViewIdTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ToViewIdTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ToViewIdTypeImpl extends EObjectImpl implements ToViewIdType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ToViewIdTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.TO_VIEW_ID_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.TO_VIEW_ID_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.TO_VIEW_ID_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.TO_VIEW_ID_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.TO_VIEW_ID_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.TO_VIEW_ID_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.TO_VIEW_ID_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.TO_VIEW_ID_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.TO_VIEW_ID_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.TO_VIEW_ID_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.TO_VIEW_ID_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: "); //$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ToViewIdTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ValidatorClassTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ValidatorClassTypeImpl.java
deleted file mode 100644
index 7e7263f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ValidatorClassTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ValidatorClassType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Validator Class Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ValidatorClassTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ValidatorClassTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ValidatorClassTypeImpl extends EObjectImpl implements ValidatorClassType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ValidatorClassTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.VALIDATOR_CLASS_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.VALIDATOR_CLASS_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.VALIDATOR_CLASS_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.VALIDATOR_CLASS_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.VALIDATOR_CLASS_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.VALIDATOR_CLASS_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.VALIDATOR_CLASS_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.VALIDATOR_CLASS_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.VALIDATOR_CLASS_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.VALIDATOR_CLASS_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.VALIDATOR_CLASS_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: "); //$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ValidatorClassTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ValidatorExtensionTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ValidatorExtensionTypeImpl.java
deleted file mode 100644
index b3eede8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ValidatorExtensionTypeImpl.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ValidatorExtensionType;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Validator Extension Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * </p>
- *
- * @generated
- */
-public class ValidatorExtensionTypeImpl extends ExtensionTypeImpl implements ValidatorExtensionType {
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    @SuppressWarnings("hiding")
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected ValidatorExtensionTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.VALIDATOR_EXTENSION_TYPE;
-	}
-
-} //ValidatorExtensionTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ValidatorIdTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ValidatorIdTypeImpl.java
deleted file mode 100644
index e5f4431..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ValidatorIdTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ValidatorIdType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Validator Id Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ValidatorIdTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ValidatorIdTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ValidatorIdTypeImpl extends EObjectImpl implements ValidatorIdType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ValidatorIdTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.VALIDATOR_ID_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.VALIDATOR_ID_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.VALIDATOR_ID_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.VALIDATOR_ID_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.VALIDATOR_ID_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.VALIDATOR_ID_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.VALIDATOR_ID_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.VALIDATOR_ID_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.VALIDATOR_ID_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.VALIDATOR_ID_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.VALIDATOR_ID_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: "); //$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ValidatorIdTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ValidatorTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ValidatorTypeImpl.java
deleted file mode 100644
index 7a266c7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ValidatorTypeImpl.java
+++ /dev/null
@@ -1,551 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.facesconfig.emf.AttributeType;
-import org.eclipse.jst.jsf.facesconfig.emf.DescriptionType;
-import org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.IconType;
-import org.eclipse.jst.jsf.facesconfig.emf.PropertyType;
-import org.eclipse.jst.jsf.facesconfig.emf.ValidatorClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.ValidatorExtensionType;
-import org.eclipse.jst.jsf.facesconfig.emf.ValidatorIdType;
-import org.eclipse.jst.jsf.facesconfig.emf.ValidatorType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Validator Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ValidatorTypeImpl#getDescription <em>Description</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ValidatorTypeImpl#getDisplayName <em>Display Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ValidatorTypeImpl#getIcon <em>Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ValidatorTypeImpl#getValidatorId <em>Validator Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ValidatorTypeImpl#getValidatorClass <em>Validator Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ValidatorTypeImpl#getAttribute <em>Attribute</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ValidatorTypeImpl#getProperty <em>Property</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ValidatorTypeImpl#getValidatorExtension <em>Validator Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ValidatorTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ValidatorTypeImpl extends EObjectImpl implements ValidatorType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The cached value of the '{@link #getDescription() <em>Description</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDescription()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList description;
-
-    /**
-	 * The cached value of the '{@link #getDisplayName() <em>Display Name</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDisplayName()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList displayName;
-
-    /**
-	 * The cached value of the '{@link #getIcon() <em>Icon</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getIcon()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList icon;
-
-    /**
-	 * The cached value of the '{@link #getValidatorId() <em>Validator Id</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getValidatorId()
-	 * @generated
-	 * @ordered
-	 */
-	protected ValidatorIdType validatorId;
-
-    /**
-	 * The cached value of the '{@link #getValidatorClass() <em>Validator Class</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getValidatorClass()
-	 * @generated
-	 * @ordered
-	 */
-	protected ValidatorClassType validatorClass;
-
-    /**
-	 * The cached value of the '{@link #getAttribute() <em>Attribute</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getAttribute()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList attribute;
-
-    /**
-	 * The cached value of the '{@link #getProperty() <em>Property</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getProperty()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList property;
-
-    /**
-	 * The cached value of the '{@link #getValidatorExtension() <em>Validator Extension</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see #getValidatorExtension()
-	 * @generated
-	 * @ordered
-	 */
-    protected EList validatorExtension;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ValidatorTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.VALIDATOR_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getDescription() {
-		if (description == null) {
-			description = new EObjectContainmentEList(DescriptionType.class, this, FacesConfigPackage.VALIDATOR_TYPE__DESCRIPTION);
-		}
-		return description;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getDisplayName() {
-		if (displayName == null) {
-			displayName = new EObjectContainmentEList(DisplayNameType.class, this, FacesConfigPackage.VALIDATOR_TYPE__DISPLAY_NAME);
-		}
-		return displayName;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getIcon() {
-		if (icon == null) {
-			icon = new EObjectContainmentEList(IconType.class, this, FacesConfigPackage.VALIDATOR_TYPE__ICON);
-		}
-		return icon;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ValidatorIdType getValidatorId() {
-		return validatorId;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newValidatorId 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetValidatorId(ValidatorIdType newValidatorId, NotificationChain msgs) {
-		ValidatorIdType oldValidatorId = validatorId;
-		validatorId = newValidatorId;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.VALIDATOR_TYPE__VALIDATOR_ID, oldValidatorId, newValidatorId);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setValidatorId(ValidatorIdType newValidatorId) {
-		if (newValidatorId != validatorId) {
-			NotificationChain msgs = null;
-			if (validatorId != null)
-				msgs = ((InternalEObject)validatorId).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.VALIDATOR_TYPE__VALIDATOR_ID, null, msgs);
-			if (newValidatorId != null)
-				msgs = ((InternalEObject)newValidatorId).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.VALIDATOR_TYPE__VALIDATOR_ID, null, msgs);
-			msgs = basicSetValidatorId(newValidatorId, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.VALIDATOR_TYPE__VALIDATOR_ID, newValidatorId, newValidatorId));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ValidatorClassType getValidatorClass() {
-		return validatorClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newValidatorClass 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetValidatorClass(ValidatorClassType newValidatorClass, NotificationChain msgs) {
-		ValidatorClassType oldValidatorClass = validatorClass;
-		validatorClass = newValidatorClass;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.VALIDATOR_TYPE__VALIDATOR_CLASS, oldValidatorClass, newValidatorClass);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setValidatorClass(ValidatorClassType newValidatorClass) {
-		if (newValidatorClass != validatorClass) {
-			NotificationChain msgs = null;
-			if (validatorClass != null)
-				msgs = ((InternalEObject)validatorClass).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.VALIDATOR_TYPE__VALIDATOR_CLASS, null, msgs);
-			if (newValidatorClass != null)
-				msgs = ((InternalEObject)newValidatorClass).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.VALIDATOR_TYPE__VALIDATOR_CLASS, null, msgs);
-			msgs = basicSetValidatorClass(newValidatorClass, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.VALIDATOR_TYPE__VALIDATOR_CLASS, newValidatorClass, newValidatorClass));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getAttribute() {
-		if (attribute == null) {
-			attribute = new EObjectContainmentEList(AttributeType.class, this, FacesConfigPackage.VALIDATOR_TYPE__ATTRIBUTE);
-		}
-		return attribute;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getProperty() {
-		if (property == null) {
-			property = new EObjectContainmentEList(PropertyType.class, this, FacesConfigPackage.VALIDATOR_TYPE__PROPERTY);
-		}
-		return property;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EList getValidatorExtension() {
-		if (validatorExtension == null) {
-			validatorExtension = new EObjectContainmentEList(ValidatorExtensionType.class, this, FacesConfigPackage.VALIDATOR_TYPE__VALIDATOR_EXTENSION);
-		}
-		return validatorExtension;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.VALIDATOR_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case FacesConfigPackage.VALIDATOR_TYPE__DESCRIPTION:
-				return ((InternalEList)getDescription()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.VALIDATOR_TYPE__DISPLAY_NAME:
-				return ((InternalEList)getDisplayName()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.VALIDATOR_TYPE__ICON:
-				return ((InternalEList)getIcon()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.VALIDATOR_TYPE__VALIDATOR_ID:
-				return basicSetValidatorId(null, msgs);
-			case FacesConfigPackage.VALIDATOR_TYPE__VALIDATOR_CLASS:
-				return basicSetValidatorClass(null, msgs);
-			case FacesConfigPackage.VALIDATOR_TYPE__ATTRIBUTE:
-				return ((InternalEList)getAttribute()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.VALIDATOR_TYPE__PROPERTY:
-				return ((InternalEList)getProperty()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.VALIDATOR_TYPE__VALIDATOR_EXTENSION:
-				return ((InternalEList)getValidatorExtension()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.VALIDATOR_TYPE__DESCRIPTION:
-				return getDescription();
-			case FacesConfigPackage.VALIDATOR_TYPE__DISPLAY_NAME:
-				return getDisplayName();
-			case FacesConfigPackage.VALIDATOR_TYPE__ICON:
-				return getIcon();
-			case FacesConfigPackage.VALIDATOR_TYPE__VALIDATOR_ID:
-				return getValidatorId();
-			case FacesConfigPackage.VALIDATOR_TYPE__VALIDATOR_CLASS:
-				return getValidatorClass();
-			case FacesConfigPackage.VALIDATOR_TYPE__ATTRIBUTE:
-				return getAttribute();
-			case FacesConfigPackage.VALIDATOR_TYPE__PROPERTY:
-				return getProperty();
-			case FacesConfigPackage.VALIDATOR_TYPE__VALIDATOR_EXTENSION:
-				return getValidatorExtension();
-			case FacesConfigPackage.VALIDATOR_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.VALIDATOR_TYPE__DESCRIPTION:
-				getDescription().clear();
-				getDescription().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.VALIDATOR_TYPE__DISPLAY_NAME:
-				getDisplayName().clear();
-				getDisplayName().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.VALIDATOR_TYPE__ICON:
-				getIcon().clear();
-				getIcon().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.VALIDATOR_TYPE__VALIDATOR_ID:
-				setValidatorId((ValidatorIdType)newValue);
-				return;
-			case FacesConfigPackage.VALIDATOR_TYPE__VALIDATOR_CLASS:
-				setValidatorClass((ValidatorClassType)newValue);
-				return;
-			case FacesConfigPackage.VALIDATOR_TYPE__ATTRIBUTE:
-				getAttribute().clear();
-				getAttribute().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.VALIDATOR_TYPE__PROPERTY:
-				getProperty().clear();
-				getProperty().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.VALIDATOR_TYPE__VALIDATOR_EXTENSION:
-				getValidatorExtension().clear();
-				getValidatorExtension().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.VALIDATOR_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.VALIDATOR_TYPE__DESCRIPTION:
-				getDescription().clear();
-				return;
-			case FacesConfigPackage.VALIDATOR_TYPE__DISPLAY_NAME:
-				getDisplayName().clear();
-				return;
-			case FacesConfigPackage.VALIDATOR_TYPE__ICON:
-				getIcon().clear();
-				return;
-			case FacesConfigPackage.VALIDATOR_TYPE__VALIDATOR_ID:
-				setValidatorId((ValidatorIdType)null);
-				return;
-			case FacesConfigPackage.VALIDATOR_TYPE__VALIDATOR_CLASS:
-				setValidatorClass((ValidatorClassType)null);
-				return;
-			case FacesConfigPackage.VALIDATOR_TYPE__ATTRIBUTE:
-				getAttribute().clear();
-				return;
-			case FacesConfigPackage.VALIDATOR_TYPE__PROPERTY:
-				getProperty().clear();
-				return;
-			case FacesConfigPackage.VALIDATOR_TYPE__VALIDATOR_EXTENSION:
-				getValidatorExtension().clear();
-				return;
-			case FacesConfigPackage.VALIDATOR_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.VALIDATOR_TYPE__DESCRIPTION:
-				return description != null && !description.isEmpty();
-			case FacesConfigPackage.VALIDATOR_TYPE__DISPLAY_NAME:
-				return displayName != null && !displayName.isEmpty();
-			case FacesConfigPackage.VALIDATOR_TYPE__ICON:
-				return icon != null && !icon.isEmpty();
-			case FacesConfigPackage.VALIDATOR_TYPE__VALIDATOR_ID:
-				return validatorId != null;
-			case FacesConfigPackage.VALIDATOR_TYPE__VALIDATOR_CLASS:
-				return validatorClass != null;
-			case FacesConfigPackage.VALIDATOR_TYPE__ATTRIBUTE:
-				return attribute != null && !attribute.isEmpty();
-			case FacesConfigPackage.VALIDATOR_TYPE__PROPERTY:
-				return property != null && !property.isEmpty();
-			case FacesConfigPackage.VALIDATOR_TYPE__VALIDATOR_EXTENSION:
-				return validatorExtension != null && !validatorExtension.isEmpty();
-			case FacesConfigPackage.VALIDATOR_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ValidatorTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ValueClassTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ValueClassTypeImpl.java
deleted file mode 100644
index 451f90a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ValueClassTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ValueClassType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Value Class Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ValueClassTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ValueClassTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ValueClassTypeImpl extends EObjectImpl implements ValueClassType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ValueClassTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.VALUE_CLASS_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.VALUE_CLASS_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.VALUE_CLASS_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.VALUE_CLASS_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.VALUE_CLASS_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.VALUE_CLASS_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.VALUE_CLASS_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.VALUE_CLASS_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.VALUE_CLASS_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.VALUE_CLASS_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.VALUE_CLASS_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: "); //$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ValueClassTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ValueTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ValueTypeImpl.java
deleted file mode 100644
index ebd907b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ValueTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ValueType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Value Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ValueTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ValueTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ValueTypeImpl extends EObjectImpl implements ValueType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ValueTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.VALUE_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.VALUE_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.VALUE_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.VALUE_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.VALUE_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.VALUE_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.VALUE_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.VALUE_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.VALUE_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.VALUE_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.VALUE_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: "); //$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ValueTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/VarTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/VarTypeImpl.java
deleted file mode 100644
index fe14763..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/VarTypeImpl.java
+++ /dev/null
@@ -1,224 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.VarType;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Var Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.VarTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.VarTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class VarTypeImpl extends EObjectImpl implements VarType {
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-    protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-    protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-    protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-    protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected VarTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.VAR_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.VAR_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.VAR_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.VAR_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.VAR_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.VAR_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.VAR_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.VAR_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.VAR_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.VAR_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.VAR_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-    public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: "); //$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //VarTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/VariableResolverTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/VariableResolverTypeImpl.java
deleted file mode 100644
index 80ce3c2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/VariableResolverTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.VariableResolverType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Variable Resolver Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.VariableResolverTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.VariableResolverTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class VariableResolverTypeImpl extends EObjectImpl implements VariableResolverType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected VariableResolverTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.VARIABLE_RESOLVER_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.VARIABLE_RESOLVER_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.VARIABLE_RESOLVER_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.VARIABLE_RESOLVER_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.VARIABLE_RESOLVER_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.VARIABLE_RESOLVER_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.VARIABLE_RESOLVER_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.VARIABLE_RESOLVER_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.VARIABLE_RESOLVER_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.VARIABLE_RESOLVER_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.VARIABLE_RESOLVER_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: "); //$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //VariableResolverTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ViewDeclarationLanguageFactoryTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ViewDeclarationLanguageFactoryTypeImpl.java
deleted file mode 100644
index 561c7fc..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ViewDeclarationLanguageFactoryTypeImpl.java
+++ /dev/null
@@ -1,224 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ViewDeclarationLanguageFactoryType;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>View Declaration Language Factory Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ViewDeclarationLanguageFactoryTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ViewDeclarationLanguageFactoryTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ViewDeclarationLanguageFactoryTypeImpl extends EObjectImpl implements ViewDeclarationLanguageFactoryType {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ViewDeclarationLanguageFactoryTypeImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.VIEW_DECLARATION_LANGUAGE_FACTORY_TYPE;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.VIEW_DECLARATION_LANGUAGE_FACTORY_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.VIEW_DECLARATION_LANGUAGE_FACTORY_TYPE__ID, oldId, id));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.VIEW_DECLARATION_LANGUAGE_FACTORY_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.VIEW_DECLARATION_LANGUAGE_FACTORY_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.VIEW_DECLARATION_LANGUAGE_FACTORY_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.VIEW_DECLARATION_LANGUAGE_FACTORY_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.VIEW_DECLARATION_LANGUAGE_FACTORY_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.VIEW_DECLARATION_LANGUAGE_FACTORY_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.VIEW_DECLARATION_LANGUAGE_FACTORY_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.VIEW_DECLARATION_LANGUAGE_FACTORY_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: "); //$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ViewDeclarationLanguageFactoryTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ViewHandlerTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ViewHandlerTypeImpl.java
deleted file mode 100644
index e6f1163..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ViewHandlerTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ViewHandlerType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>View Handler Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ViewHandlerTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ViewHandlerTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ViewHandlerTypeImpl extends EObjectImpl implements ViewHandlerType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ViewHandlerTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.VIEW_HANDLER_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.VIEW_HANDLER_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.VIEW_HANDLER_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.VIEW_HANDLER_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.VIEW_HANDLER_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.VIEW_HANDLER_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.VIEW_HANDLER_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.VIEW_HANDLER_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.VIEW_HANDLER_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.VIEW_HANDLER_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.VIEW_HANDLER_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: "); //$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ViewHandlerTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/VisitContextFactoryTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/VisitContextFactoryTypeImpl.java
deleted file mode 100644
index db7a358..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/VisitContextFactoryTypeImpl.java
+++ /dev/null
@@ -1,224 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.VisitContextFactoryType;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Visit Context Factory Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.VisitContextFactoryTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.VisitContextFactoryTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class VisitContextFactoryTypeImpl extends EObjectImpl implements VisitContextFactoryType {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected VisitContextFactoryTypeImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.VISIT_CONTEXT_FACTORY_TYPE;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.VISIT_CONTEXT_FACTORY_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.VISIT_CONTEXT_FACTORY_TYPE__ID, oldId, id));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.VISIT_CONTEXT_FACTORY_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.VISIT_CONTEXT_FACTORY_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.VISIT_CONTEXT_FACTORY_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.VISIT_CONTEXT_FACTORY_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.VISIT_CONTEXT_FACTORY_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.VISIT_CONTEXT_FACTORY_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.VISIT_CONTEXT_FACTORY_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.VISIT_CONTEXT_FACTORY_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: "); //$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //VisitContextFactoryTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/package-info.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/package-info.java
deleted file mode 100644
index 13588b7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/package-info.java
+++ /dev/null
@@ -1,19 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-/**
- * EMF model implementations for JSF application configuration files (deprecated). 
- * <p>
- * Deprecated - should use interfaces in the org.eclipse.jst.jsf.facesconfig.emf package   
- * This package will be removed from the MANIFEST.MF as public API in a future release.
- */
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/package-info.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/package-info.java
deleted file mode 100644
index b56d56a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/package-info.java
+++ /dev/null
@@ -1,16 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-/**
- * EMF model for JSF application configuration files. 
- */
-package org.eclipse.jst.jsf.facesconfig.emf;
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/util/FacesConfigAdapterFactory.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/util/FacesConfigAdapterFactory.java
deleted file mode 100644
index 93d83a0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/util/FacesConfigAdapterFactory.java
+++ /dev/null
@@ -1,2204 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.util;
-
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.common.notify.Notifier;
-import org.eclipse.emf.common.notify.impl.AdapterFactoryImpl;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.jst.jsf.facesconfig.emf.*;
-
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Adapter Factory</b> for the model.
- * It provides an adapter <code>createXXX</code> method for each class of the model.
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage
- * @generated
- */
-public class FacesConfigAdapterFactory extends AdapterFactoryImpl {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The cached model package.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected static FacesConfigPackage modelPackage;
-
-    /**
-	 * Creates an instance of the adapter factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FacesConfigAdapterFactory() {
-		if (modelPackage == null) {
-			modelPackage = FacesConfigPackage.eINSTANCE;
-		}
-	}
-
-    /**
-	 * Returns whether this factory is applicable for the type of the object.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns <code>true</code> if the object is either the model's package or is an instance object of the model.
-	 * <!-- end-user-doc -->
-	 * @return whether this factory is applicable for the type of the object.
-	 * @generated
-	 */
-	public boolean isFactoryForType(Object object) {
-		if (object == modelPackage) {
-			return true;
-		}
-		if (object instanceof EObject) {
-			return ((EObject)object).eClass().getEPackage() == modelPackage;
-		}
-		return false;
-	}
-
-    /**
-	 * The switch that delegates to the <code>createXXX</code> methods.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected FacesConfigSwitch modelSwitch =
-        new FacesConfigSwitch() {
-			public Object caseAbsoluteOrderingType(AbsoluteOrderingType object) {
-				return createAbsoluteOrderingTypeAdapter();
-			}
-			public Object caseActionListenerType(ActionListenerType object) {
-				return createActionListenerTypeAdapter();
-			}
-			public Object caseApplicationFactoryType(ApplicationFactoryType object) {
-				return createApplicationFactoryTypeAdapter();
-			}
-			public Object caseApplicationType(ApplicationType object) {
-				return createApplicationTypeAdapter();
-			}
-			public Object caseApplicationExtensionType(ApplicationExtensionType object) {
-				return createApplicationExtensionTypeAdapter();
-			}
-			public Object caseAttributeClassType(AttributeClassType object) {
-				return createAttributeClassTypeAdapter();
-			}
-			public Object caseAttributeExtensionType(AttributeExtensionType object) {
-				return createAttributeExtensionTypeAdapter();
-			}
-			public Object caseAttributeNameType(AttributeNameType object) {
-				return createAttributeNameTypeAdapter();
-			}
-			public Object caseAttributeType(AttributeType object) {
-				return createAttributeTypeAdapter();
-			}
-			public Object caseBehaviorClassType(BehaviorClassType object) {
-				return createBehaviorClassTypeAdapter();
-			}
-			public Object caseBehaviorIdType(BehaviorIdType object) {
-				return createBehaviorIdTypeAdapter();
-			}
-			public Object caseBehaviorType(BehaviorType object) {
-				return createBehaviorTypeAdapter();
-			}
-			public Object caseBehaviorExtensionType(BehaviorExtensionType object) {
-				return createBehaviorExtensionTypeAdapter();
-			}
-			public Object caseClientBehaviorRendererClassType(ClientBehaviorRendererClassType object) {
-				return createClientBehaviorRendererClassTypeAdapter();
-			}
-			public Object caseClientBehaviorRendererType(ClientBehaviorRendererType object) {
-				return createClientBehaviorRendererTypeAdapter();
-			}
-			public Object caseClientBehaviorRendererTypeType(ClientBehaviorRendererTypeType object) {
-				return createClientBehaviorRendererTypeTypeAdapter();
-			}
-			public Object caseComponentClassType(ComponentClassType object) {
-				return createComponentClassTypeAdapter();
-			}
-			public Object caseComponentExtensionType(ComponentExtensionType object) {
-				return createComponentExtensionTypeAdapter();
-			}
-			public Object caseComponentFamilyType(ComponentFamilyType object) {
-				return createComponentFamilyTypeAdapter();
-			}
-			public Object caseComponentType(ComponentType object) {
-				return createComponentTypeAdapter();
-			}
-			public Object caseComponentTypeType(ComponentTypeType object) {
-				return createComponentTypeTypeAdapter();
-			}
-			public Object caseConverterClassType(ConverterClassType object) {
-				return createConverterClassTypeAdapter();
-			}
-			public Object caseConverterForClassType(ConverterForClassType object) {
-				return createConverterForClassTypeAdapter();
-			}
-			public Object caseConverterIdType(ConverterIdType object) {
-				return createConverterIdTypeAdapter();
-			}
-			public Object caseConverterType(ConverterType object) {
-				return createConverterTypeAdapter();
-			}
-			public Object caseConverterExtensionType(ConverterExtensionType object) {
-				return createConverterExtensionTypeAdapter();
-			}
-			public Object caseDefaultLocaleType(DefaultLocaleType object) {
-				return createDefaultLocaleTypeAdapter();
-			}
-			public Object caseDefaultRenderKitIdType(DefaultRenderKitIdType object) {
-				return createDefaultRenderKitIdTypeAdapter();
-			}
-			public Object caseDefaultValidatorsType(DefaultValidatorsType object) {
-				return createDefaultValidatorsTypeAdapter();
-			}
-			public Object caseDefaultValueType(DefaultValueType object) {
-				return createDefaultValueTypeAdapter();
-			}
-			public Object caseDescriptionType(DescriptionType object) {
-				return createDescriptionTypeAdapter();
-			}
-			public Object caseDisplayNameType(DisplayNameType object) {
-				return createDisplayNameTypeAdapter();
-			}
-			public Object caseDocumentRoot(DocumentRoot object) {
-				return createDocumentRootAdapter();
-			}
-			public Object caseDynamicAttribute(DynamicAttribute object) {
-				return createDynamicAttributeAdapter();
-			}
-			public Object caseDynamicElement(DynamicElement object) {
-				return createDynamicElementAdapter();
-			}
-			public Object caseELResolverType(ELResolverType object) {
-				return createELResolverTypeAdapter();
-			}
-			public Object caseExceptionHandlerFactoryType(ExceptionHandlerFactoryType object) {
-				return createExceptionHandlerFactoryTypeAdapter();
-			}
-			public Object caseExtensionType(ExtensionType object) {
-				return createExtensionTypeAdapter();
-			}
-			public Object caseExternalContextFactoryType(ExternalContextFactoryType object) {
-				return createExternalContextFactoryTypeAdapter();
-			}
-			public Object caseFacesConfigType(FacesConfigType object) {
-				return createFacesConfigTypeAdapter();
-			}
-			public Object caseFacesConfigExtensionType(FacesConfigExtensionType object) {
-				return createFacesConfigExtensionTypeAdapter();
-			}
-			public Object caseFacesContextFactoryType(FacesContextFactoryType object) {
-				return createFacesContextFactoryTypeAdapter();
-			}
-			public Object caseFacetExtensionType(FacetExtensionType object) {
-				return createFacetExtensionTypeAdapter();
-			}
-			public Object caseFacetNameType(FacetNameType object) {
-				return createFacetNameTypeAdapter();
-			}
-			public Object caseFacetType(FacetType object) {
-				return createFacetTypeAdapter();
-			}
-			public Object caseFactoryType(FactoryType object) {
-				return createFactoryTypeAdapter();
-			}
-			public Object caseFactoryExtensionType(FactoryExtensionType object) {
-				return createFactoryExtensionTypeAdapter();
-			}
-			public Object caseFromActionType(FromActionType object) {
-				return createFromActionTypeAdapter();
-			}
-			public Object caseFromOutcomeType(FromOutcomeType object) {
-				return createFromOutcomeTypeAdapter();
-			}
-			public Object caseFromViewIdType(FromViewIdType object) {
-				return createFromViewIdTypeAdapter();
-			}
-			public Object caseIconType(IconType object) {
-				return createIconTypeAdapter();
-			}
-			public Object caseIfType(IfType object) {
-				return createIfTypeAdapter();
-			}
-			public Object caseKeyClassType(KeyClassType object) {
-				return createKeyClassTypeAdapter();
-			}
-			public Object caseKeyType(KeyType object) {
-				return createKeyTypeAdapter();
-			}
-			public Object caseLargeIconType(LargeIconType object) {
-				return createLargeIconTypeAdapter();
-			}
-			public Object caseLifecycleFactoryType(LifecycleFactoryType object) {
-				return createLifecycleFactoryTypeAdapter();
-			}
-			public Object caseLifecycleType(LifecycleType object) {
-				return createLifecycleTypeAdapter();
-			}
-			public Object caseLifecycleExtensionType(LifecycleExtensionType object) {
-				return createLifecycleExtensionTypeAdapter();
-			}
-			public Object caseListEntriesType(ListEntriesType object) {
-				return createListEntriesTypeAdapter();
-			}
-			public Object caseLocaleConfigType(LocaleConfigType object) {
-				return createLocaleConfigTypeAdapter();
-			}
-			public Object caseManagedBeanClassType(ManagedBeanClassType object) {
-				return createManagedBeanClassTypeAdapter();
-			}
-			public Object caseManagedBeanNameType(ManagedBeanNameType object) {
-				return createManagedBeanNameTypeAdapter();
-			}
-			public Object caseManagedBeanScopeType(ManagedBeanScopeType object) {
-				return createManagedBeanScopeTypeAdapter();
-			}
-			public Object caseManagedBeanType(ManagedBeanType object) {
-				return createManagedBeanTypeAdapter();
-			}
-			public Object caseManagedBeanExtensionType(ManagedBeanExtensionType object) {
-				return createManagedBeanExtensionTypeAdapter();
-			}
-			public Object caseManagedPropertyType(ManagedPropertyType object) {
-				return createManagedPropertyTypeAdapter();
-			}
-			public Object caseMapEntriesType(MapEntriesType object) {
-				return createMapEntriesTypeAdapter();
-			}
-			public Object caseMapEntryType(MapEntryType object) {
-				return createMapEntryTypeAdapter();
-			}
-			public Object caseMessageBundleType(MessageBundleType object) {
-				return createMessageBundleTypeAdapter();
-			}
-			public Object caseNameType(NameType object) {
-				return createNameTypeAdapter();
-			}
-			public Object caseNavigationCaseType(NavigationCaseType object) {
-				return createNavigationCaseTypeAdapter();
-			}
-			public Object caseNavigationHandlerType(NavigationHandlerType object) {
-				return createNavigationHandlerTypeAdapter();
-			}
-			public Object caseNavigationRuleType(NavigationRuleType object) {
-				return createNavigationRuleTypeAdapter();
-			}
-			public Object caseNavigationRuleExtensionType(NavigationRuleExtensionType object) {
-				return createNavigationRuleExtensionTypeAdapter();
-			}
-			public Object caseNullValueType(NullValueType object) {
-				return createNullValueTypeAdapter();
-			}
-			public Object caseOrderingType(OrderingType object) {
-				return createOrderingTypeAdapter();
-			}
-			public Object caseOrderingOrderingType(OrderingOrderingType object) {
-				return createOrderingOrderingTypeAdapter();
-			}
-			public Object caseOrderingOthersType(OrderingOthersType object) {
-				return createOrderingOthersTypeAdapter();
-			}
-			public Object casePartialViewContextFactoryType(PartialViewContextFactoryType object) {
-				return createPartialViewContextFactoryTypeAdapter();
-			}
-			public Object casePhaseListenerType(PhaseListenerType object) {
-				return createPhaseListenerTypeAdapter();
-			}
-			public Object casePropertyClassType(PropertyClassType object) {
-				return createPropertyClassTypeAdapter();
-			}
-			public Object casePropertyExtensionType(PropertyExtensionType object) {
-				return createPropertyExtensionTypeAdapter();
-			}
-			public Object casePropertyNameType(PropertyNameType object) {
-				return createPropertyNameTypeAdapter();
-			}
-			public Object casePropertyResolverType(PropertyResolverType object) {
-				return createPropertyResolverTypeAdapter();
-			}
-			public Object casePropertyType(PropertyType object) {
-				return createPropertyTypeAdapter();
-			}
-			public Object caseRedirectType(RedirectType object) {
-				return createRedirectTypeAdapter();
-			}
-			public Object caseRedirectViewParamType(RedirectViewParamType object) {
-				return createRedirectViewParamTypeAdapter();
-			}
-			public Object caseReferencedBeanClassType(ReferencedBeanClassType object) {
-				return createReferencedBeanClassTypeAdapter();
-			}
-			public Object caseReferencedBeanNameType(ReferencedBeanNameType object) {
-				return createReferencedBeanNameTypeAdapter();
-			}
-			public Object caseReferencedBeanType(ReferencedBeanType object) {
-				return createReferencedBeanTypeAdapter();
-			}
-			public Object caseRendererClassType(RendererClassType object) {
-				return createRendererClassTypeAdapter();
-			}
-			public Object caseRendererExtensionType(RendererExtensionType object) {
-				return createRendererExtensionTypeAdapter();
-			}
-			public Object caseRendererType(RendererType object) {
-				return createRendererTypeAdapter();
-			}
-			public Object caseRendererTypeType(RendererTypeType object) {
-				return createRendererTypeTypeAdapter();
-			}
-			public Object caseRenderKitClassType(RenderKitClassType object) {
-				return createRenderKitClassTypeAdapter();
-			}
-			public Object caseRenderKitFactoryType(RenderKitFactoryType object) {
-				return createRenderKitFactoryTypeAdapter();
-			}
-			public Object caseRenderKitIdType(RenderKitIdType object) {
-				return createRenderKitIdTypeAdapter();
-			}
-			public Object caseRenderKitType(RenderKitType object) {
-				return createRenderKitTypeAdapter();
-			}
-			public Object caseRenderKitExtensionType(RenderKitExtensionType object) {
-				return createRenderKitExtensionTypeAdapter();
-			}
-			public Object caseResourceHandlerType(ResourceHandlerType object) {
-				return createResourceHandlerTypeAdapter();
-			}
-			public Object caseSmallIconType(SmallIconType object) {
-				return createSmallIconTypeAdapter();
-			}
-			public Object caseSourceClassType(SourceClassType object) {
-				return createSourceClassTypeAdapter();
-			}
-			public Object caseStateManagerType(StateManagerType object) {
-				return createStateManagerTypeAdapter();
-			}
-			public Object caseSuggestedValueType(SuggestedValueType object) {
-				return createSuggestedValueTypeAdapter();
-			}
-			public Object caseSupportedLocaleType(SupportedLocaleType object) {
-				return createSupportedLocaleTypeAdapter();
-			}
-			public Object caseSystemEventClassType(SystemEventClassType object) {
-				return createSystemEventClassTypeAdapter();
-			}
-			public Object caseSystemEventListenerClassType(SystemEventListenerClassType object) {
-				return createSystemEventListenerClassTypeAdapter();
-			}
-			public Object caseSystemEventListenerType(SystemEventListenerType object) {
-				return createSystemEventListenerTypeAdapter();
-			}
-			public Object caseTagHandlerDelegateFactoryType(TagHandlerDelegateFactoryType object) {
-				return createTagHandlerDelegateFactoryTypeAdapter();
-			}
-			public Object caseToViewIdType(ToViewIdType object) {
-				return createToViewIdTypeAdapter();
-			}
-			public Object caseValidatorClassType(ValidatorClassType object) {
-				return createValidatorClassTypeAdapter();
-			}
-			public Object caseValidatorIdType(ValidatorIdType object) {
-				return createValidatorIdTypeAdapter();
-			}
-			public Object caseValidatorType(ValidatorType object) {
-				return createValidatorTypeAdapter();
-			}
-			public Object caseValidatorExtensionType(ValidatorExtensionType object) {
-				return createValidatorExtensionTypeAdapter();
-			}
-			public Object caseValueClassType(ValueClassType object) {
-				return createValueClassTypeAdapter();
-			}
-			public Object caseValueType(ValueType object) {
-				return createValueTypeAdapter();
-			}
-			public Object caseVariableResolverType(VariableResolverType object) {
-				return createVariableResolverTypeAdapter();
-			}
-			public Object caseViewHandlerType(ViewHandlerType object) {
-				return createViewHandlerTypeAdapter();
-			}
-			public Object caseResourceBundleType(ResourceBundleType object) {
-				return createResourceBundleTypeAdapter();
-			}
-			public Object caseBaseNameType(BaseNameType object) {
-				return createBaseNameTypeAdapter();
-			}
-			public Object caseVarType(VarType object) {
-				return createVarTypeAdapter();
-			}
-			public Object caseViewDeclarationLanguageFactoryType(ViewDeclarationLanguageFactoryType object) {
-				return createViewDeclarationLanguageFactoryTypeAdapter();
-			}
-			public Object caseVisitContextFactoryType(VisitContextFactoryType object) {
-				return createVisitContextFactoryTypeAdapter();
-			}
-			public Object defaultCase(EObject object) {
-				return createEObjectAdapter();
-			}
-		};
-
-    /**
-	 * Creates an adapter for the <code>target</code>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param target the object to adapt.
-	 * @return the adapter for the <code>target</code>.
-	 * @generated
-	 */
-	public Adapter createAdapter(Notifier target) {
-		return (Adapter)modelSwitch.doSwitch((EObject)target);
-	}
-
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.AbsoluteOrderingType <em>Absolute Ordering Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.AbsoluteOrderingType
-	 * @generated
-	 */
-	public Adapter createAbsoluteOrderingTypeAdapter() {
-		return null;
-	}
-
-				/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ActionListenerType <em>Action Listener Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ActionListenerType
-	 * @generated
-	 */
-	public Adapter createActionListenerTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationFactoryType <em>Application Factory Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ApplicationFactoryType
-	 * @generated
-	 */
-	public Adapter createApplicationFactoryTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType <em>Application Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ApplicationType
-	 * @generated
-	 */
-	public Adapter createApplicationTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeClassType <em>Attribute Class Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.AttributeClassType
-	 * @generated
-	 */
-	public Adapter createAttributeClassTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeExtensionType <em>Attribute Extension Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.AttributeExtensionType
-	 * @generated
-	 */
-	public Adapter createAttributeExtensionTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeNameType <em>Attribute Name Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.AttributeNameType
-	 * @generated
-	 */
-	public Adapter createAttributeNameTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeType <em>Attribute Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.AttributeType
-	 * @generated
-	 */
-	public Adapter createAttributeTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.BehaviorClassType <em>Behavior Class Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.BehaviorClassType
-	 * @generated
-	 */
-	public Adapter createBehaviorClassTypeAdapter() {
-		return null;
-	}
-
-				/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.BehaviorIdType <em>Behavior Id Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.BehaviorIdType
-	 * @generated
-	 */
-	public Adapter createBehaviorIdTypeAdapter() {
-		return null;
-	}
-
-				/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.BehaviorType <em>Behavior Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.BehaviorType
-	 * @generated
-	 */
-	public Adapter createBehaviorTypeAdapter() {
-		return null;
-	}
-
-				/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.BehaviorExtensionType <em>Behavior Extension Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.BehaviorExtensionType
-	 * @generated
-	 */
-	public Adapter createBehaviorExtensionTypeAdapter() {
-		return null;
-	}
-
-				/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererClassType <em>Client Behavior Renderer Class Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererClassType
-	 * @generated
-	 */
-	public Adapter createClientBehaviorRendererClassTypeAdapter() {
-		return null;
-	}
-
-				/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererType <em>Client Behavior Renderer Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererType
-	 * @generated
-	 */
-	public Adapter createClientBehaviorRendererTypeAdapter() {
-		return null;
-	}
-
-				/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererTypeType <em>Client Behavior Renderer Type Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererTypeType
-	 * @generated
-	 */
-	public Adapter createClientBehaviorRendererTypeTypeAdapter() {
-		return null;
-	}
-
-				/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentClassType <em>Component Class Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ComponentClassType
-	 * @generated
-	 */
-	public Adapter createComponentClassTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentExtensionType <em>Component Extension Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ComponentExtensionType
-	 * @generated
-	 */
-	public Adapter createComponentExtensionTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentFamilyType <em>Component Family Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ComponentFamilyType
-	 * @generated
-	 */
-	public Adapter createComponentFamilyTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentType <em>Component Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ComponentType
-	 * @generated
-	 */
-	public Adapter createComponentTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentTypeType <em>Component Type Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ComponentTypeType
-	 * @generated
-	 */
-	public Adapter createComponentTypeTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterClassType <em>Converter Class Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ConverterClassType
-	 * @generated
-	 */
-	public Adapter createConverterClassTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterForClassType <em>Converter For Class Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ConverterForClassType
-	 * @generated
-	 */
-	public Adapter createConverterForClassTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterIdType <em>Converter Id Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ConverterIdType
-	 * @generated
-	 */
-	public Adapter createConverterIdTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterType <em>Converter Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ConverterType
-	 * @generated
-	 */
-	public Adapter createConverterTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.DefaultLocaleType <em>Default Locale Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DefaultLocaleType
-	 * @generated
-	 */
-	public Adapter createDefaultLocaleTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.DefaultRenderKitIdType <em>Default Render Kit Id Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DefaultRenderKitIdType
-	 * @generated
-	 */
-	public Adapter createDefaultRenderKitIdTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.DefaultValidatorsType <em>Default Validators Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DefaultValidatorsType
-	 * @generated
-	 */
-	public Adapter createDefaultValidatorsTypeAdapter() {
-		return null;
-	}
-
-				/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.DefaultValueType <em>Default Value Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DefaultValueType
-	 * @generated
-	 */
-	public Adapter createDefaultValueTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.DescriptionType <em>Description Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DescriptionType
-	 * @generated
-	 */
-	public Adapter createDescriptionTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType <em>Display Name Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType
-	 * @generated
-	 */
-	public Adapter createDisplayNameTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot <em>Document Root</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot
-	 * @generated
-	 */
-	public Adapter createDocumentRootAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.DynamicAttribute <em>Dynamic Attribute</em>}'.
-	 * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DynamicAttribute
-	 * @generated
-	 */
-    public Adapter createDynamicAttributeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.DynamicElement <em>Dynamic Element</em>}'.
-	 * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DynamicElement
-	 * @generated
-	 */
-    public Adapter createDynamicElementAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ELResolverType <em>EL Resolver Type</em>}'.
-	 * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ELResolverType
-	 * @generated
-	 */
-    public Adapter createELResolverTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ExceptionHandlerFactoryType <em>Exception Handler Factory Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ExceptionHandlerFactoryType
-	 * @generated
-	 */
-	public Adapter createExceptionHandlerFactoryTypeAdapter() {
-		return null;
-	}
-
-				/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType <em>Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType
-	 * @generated
-	 */
-	public Adapter createFacesConfigTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.FacesContextFactoryType <em>Faces Context Factory Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesContextFactoryType
-	 * @generated
-	 */
-	public Adapter createFacesContextFactoryTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.FacetExtensionType <em>Facet Extension Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacetExtensionType
-	 * @generated
-	 */
-	public Adapter createFacetExtensionTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.FacetNameType <em>Facet Name Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacetNameType
-	 * @generated
-	 */
-	public Adapter createFacetNameTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.FacetType <em>Facet Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacetType
-	 * @generated
-	 */
-	public Adapter createFacetTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.FactoryType <em>Factory Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FactoryType
-	 * @generated
-	 */
-	public Adapter createFactoryTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.FromActionType <em>From Action Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FromActionType
-	 * @generated
-	 */
-	public Adapter createFromActionTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.FromOutcomeType <em>From Outcome Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FromOutcomeType
-	 * @generated
-	 */
-	public Adapter createFromOutcomeTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.FromViewIdType <em>From View Id Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FromViewIdType
-	 * @generated
-	 */
-	public Adapter createFromViewIdTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.IconType <em>Icon Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.IconType
-	 * @generated
-	 */
-	public Adapter createIconTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.IfType <em>If Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.IfType
-	 * @generated
-	 */
-	public Adapter createIfTypeAdapter() {
-		return null;
-	}
-
-				/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.KeyClassType <em>Key Class Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.KeyClassType
-	 * @generated
-	 */
-	public Adapter createKeyClassTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.KeyType <em>Key Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.KeyType
-	 * @generated
-	 */
-	public Adapter createKeyTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.LargeIconType <em>Large Icon Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.LargeIconType
-	 * @generated
-	 */
-	public Adapter createLargeIconTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.LifecycleFactoryType <em>Lifecycle Factory Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.LifecycleFactoryType
-	 * @generated
-	 */
-	public Adapter createLifecycleFactoryTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.LifecycleType <em>Lifecycle Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.LifecycleType
-	 * @generated
-	 */
-	public Adapter createLifecycleTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ListEntriesType <em>List Entries Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ListEntriesType
-	 * @generated
-	 */
-	public Adapter createListEntriesTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.LocaleConfigType <em>Locale Config Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.LocaleConfigType
-	 * @generated
-	 */
-	public Adapter createLocaleConfigTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanClassType <em>Managed Bean Class Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanClassType
-	 * @generated
-	 */
-	public Adapter createManagedBeanClassTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanNameType <em>Managed Bean Name Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanNameType
-	 * @generated
-	 */
-	public Adapter createManagedBeanNameTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanScopeType <em>Managed Bean Scope Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanScopeType
-	 * @generated
-	 */
-	public Adapter createManagedBeanScopeTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType <em>Managed Bean Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType
-	 * @generated
-	 */
-	public Adapter createManagedBeanTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType <em>Managed Property Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType
-	 * @generated
-	 */
-	public Adapter createManagedPropertyTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.MapEntriesType <em>Map Entries Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.MapEntriesType
-	 * @generated
-	 */
-	public Adapter createMapEntriesTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.MapEntryType <em>Map Entry Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.MapEntryType
-	 * @generated
-	 */
-	public Adapter createMapEntryTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.MessageBundleType <em>Message Bundle Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.MessageBundleType
-	 * @generated
-	 */
-	public Adapter createMessageBundleTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.NameType <em>Name Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.NameType
-	 * @generated
-	 */
-	public Adapter createNameTypeAdapter() {
-		return null;
-	}
-
-				/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType <em>Navigation Case Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType
-	 * @generated
-	 */
-	public Adapter createNavigationCaseTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationHandlerType <em>Navigation Handler Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.NavigationHandlerType
-	 * @generated
-	 */
-	public Adapter createNavigationHandlerTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType <em>Navigation Rule Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType
-	 * @generated
-	 */
-	public Adapter createNavigationRuleTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.NullValueType <em>Null Value Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.NullValueType
-	 * @generated
-	 */
-	public Adapter createNullValueTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.OrderingType <em>Ordering Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.OrderingType
-	 * @generated
-	 */
-	public Adapter createOrderingTypeAdapter() {
-		return null;
-	}
-
-				/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.OrderingOrderingType <em>Ordering Ordering Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.OrderingOrderingType
-	 * @generated
-	 */
-	public Adapter createOrderingOrderingTypeAdapter() {
-		return null;
-	}
-
-				/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.OrderingOthersType <em>Ordering Others Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.OrderingOthersType
-	 * @generated
-	 */
-	public Adapter createOrderingOthersTypeAdapter() {
-		return null;
-	}
-
-				/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.PartialViewContextFactoryType <em>Partial View Context Factory Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.PartialViewContextFactoryType
-	 * @generated
-	 */
-	public Adapter createPartialViewContextFactoryTypeAdapter() {
-		return null;
-	}
-
-				/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.PhaseListenerType <em>Phase Listener Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.PhaseListenerType
-	 * @generated
-	 */
-	public Adapter createPhaseListenerTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyClassType <em>Property Class Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.PropertyClassType
-	 * @generated
-	 */
-	public Adapter createPropertyClassTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyExtensionType <em>Property Extension Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.PropertyExtensionType
-	 * @generated
-	 */
-	public Adapter createPropertyExtensionTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyNameType <em>Property Name Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.PropertyNameType
-	 * @generated
-	 */
-	public Adapter createPropertyNameTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyResolverType <em>Property Resolver Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.PropertyResolverType
-	 * @generated
-	 */
-	public Adapter createPropertyResolverTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyType <em>Property Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.PropertyType
-	 * @generated
-	 */
-	public Adapter createPropertyTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.RedirectType <em>Redirect Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RedirectType
-	 * @generated
-	 */
-	public Adapter createRedirectTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.RedirectViewParamType <em>Redirect View Param Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RedirectViewParamType
-	 * @generated
-	 */
-	public Adapter createRedirectViewParamTypeAdapter() {
-		return null;
-	}
-
-				/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanClassType <em>Referenced Bean Class Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanClassType
-	 * @generated
-	 */
-	public Adapter createReferencedBeanClassTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanNameType <em>Referenced Bean Name Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanNameType
-	 * @generated
-	 */
-	public Adapter createReferencedBeanNameTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanType <em>Referenced Bean Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanType
-	 * @generated
-	 */
-	public Adapter createReferencedBeanTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.RendererClassType <em>Renderer Class Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RendererClassType
-	 * @generated
-	 */
-	public Adapter createRendererClassTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.RendererExtensionType <em>Renderer Extension Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RendererExtensionType
-	 * @generated
-	 */
-	public Adapter createRendererExtensionTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.RendererType <em>Renderer Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RendererType
-	 * @generated
-	 */
-	public Adapter createRendererTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.RendererTypeType <em>Renderer Type Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RendererTypeType
-	 * @generated
-	 */
-	public Adapter createRendererTypeTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitClassType <em>Render Kit Class Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RenderKitClassType
-	 * @generated
-	 */
-	public Adapter createRenderKitClassTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitFactoryType <em>Render Kit Factory Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RenderKitFactoryType
-	 * @generated
-	 */
-	public Adapter createRenderKitFactoryTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitIdType <em>Render Kit Id Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RenderKitIdType
-	 * @generated
-	 */
-	public Adapter createRenderKitIdTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitType <em>Render Kit Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RenderKitType
-	 * @generated
-	 */
-	public Adapter createRenderKitTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.SmallIconType <em>Small Icon Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.SmallIconType
-	 * @generated
-	 */
-	public Adapter createSmallIconTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.SourceClassType <em>Source Class Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.SourceClassType
-	 * @generated
-	 */
-	public Adapter createSourceClassTypeAdapter() {
-		return null;
-	}
-
-				/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.StateManagerType <em>State Manager Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.StateManagerType
-	 * @generated
-	 */
-	public Adapter createStateManagerTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.SuggestedValueType <em>Suggested Value Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.SuggestedValueType
-	 * @generated
-	 */
-	public Adapter createSuggestedValueTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.SupportedLocaleType <em>Supported Locale Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.SupportedLocaleType
-	 * @generated
-	 */
-	public Adapter createSupportedLocaleTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.SystemEventClassType <em>System Event Class Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.SystemEventClassType
-	 * @generated
-	 */
-	public Adapter createSystemEventClassTypeAdapter() {
-		return null;
-	}
-
-				/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.SystemEventListenerClassType <em>System Event Listener Class Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.SystemEventListenerClassType
-	 * @generated
-	 */
-	public Adapter createSystemEventListenerClassTypeAdapter() {
-		return null;
-	}
-
-				/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.SystemEventListenerType <em>System Event Listener Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.SystemEventListenerType
-	 * @generated
-	 */
-	public Adapter createSystemEventListenerTypeAdapter() {
-		return null;
-	}
-
-				/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.TagHandlerDelegateFactoryType <em>Tag Handler Delegate Factory Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.TagHandlerDelegateFactoryType
-	 * @generated
-	 */
-	public Adapter createTagHandlerDelegateFactoryTypeAdapter() {
-		return null;
-	}
-
-				/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ToViewIdType <em>To View Id Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ToViewIdType
-	 * @generated
-	 */
-	public Adapter createToViewIdTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorClassType <em>Validator Class Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ValidatorClassType
-	 * @generated
-	 */
-	public Adapter createValidatorClassTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorIdType <em>Validator Id Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ValidatorIdType
-	 * @generated
-	 */
-	public Adapter createValidatorIdTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorType <em>Validator Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ValidatorType
-	 * @generated
-	 */
-	public Adapter createValidatorTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ValueClassType <em>Value Class Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ValueClassType
-	 * @generated
-	 */
-	public Adapter createValueClassTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ValueType <em>Value Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ValueType
-	 * @generated
-	 */
-	public Adapter createValueTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.VariableResolverType <em>Variable Resolver Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.VariableResolverType
-	 * @generated
-	 */
-	public Adapter createVariableResolverTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ViewHandlerType <em>View Handler Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ViewHandlerType
-	 * @generated
-	 */
-	public Adapter createViewHandlerTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ResourceBundleType <em>Resource Bundle Type</em>}'.
-	 * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ResourceBundleType
-	 * @generated
-	 */
-    public Adapter createResourceBundleTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.BaseNameType <em>Base Name Type</em>}'.
-	 * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.BaseNameType
-	 * @generated
-	 */
-    public Adapter createBaseNameTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.VarType <em>Var Type</em>}'.
-	 * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.VarType
-	 * @generated
-	 */
-    public Adapter createVarTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ViewDeclarationLanguageFactoryType <em>View Declaration Language Factory Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ViewDeclarationLanguageFactoryType
-	 * @generated
-	 */
-	public Adapter createViewDeclarationLanguageFactoryTypeAdapter() {
-		return null;
-	}
-
-				/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.VisitContextFactoryType <em>Visit Context Factory Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.VisitContextFactoryType
-	 * @generated
-	 */
-	public Adapter createVisitContextFactoryTypeAdapter() {
-		return null;
-	}
-
-				/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitExtensionType <em>Render Kit Extension Type</em>}'.
-	 * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RenderKitExtensionType
-	 * @generated
-	 */
-    public Adapter createRenderKitExtensionTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ResourceHandlerType <em>Resource Handler Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ResourceHandlerType
-	 * @generated
-	 */
-	public Adapter createResourceHandlerTypeAdapter() {
-		return null;
-	}
-
-				/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleExtensionType <em>Navigation Rule Extension Type</em>}'.
-	 * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleExtensionType
-	 * @generated
-	 */
-    public Adapter createNavigationRuleExtensionTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorExtensionType <em>Validator Extension Type</em>}'.
-	 * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ValidatorExtensionType
-	 * @generated
-	 */
-    public Adapter createValidatorExtensionTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigExtensionType <em>Extension Type</em>}'.
-	 * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigExtensionType
-	 * @generated
-	 */
-    public Adapter createFacesConfigExtensionTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.FactoryExtensionType <em>Factory Extension Type</em>}'.
-	 * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FactoryExtensionType
-	 * @generated
-	 */
-    public Adapter createFactoryExtensionTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.LifecycleExtensionType <em>Lifecycle Extension Type</em>}'.
-	 * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.LifecycleExtensionType
-	 * @generated
-	 */
-    public Adapter createLifecycleExtensionTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanExtensionType <em>Managed Bean Extension Type</em>}'.
-	 * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanExtensionType
-	 * @generated
-	 */
-    public Adapter createManagedBeanExtensionTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterExtensionType <em>Converter Extension Type</em>}'.
-	 * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ConverterExtensionType
-	 * @generated
-	 */
-    public Adapter createConverterExtensionTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ExtensionType <em>Extension Type</em>}'.
-	 * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ExtensionType
-	 * @generated
-	 */
-    public Adapter createExtensionTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ExternalContextFactoryType <em>External Context Factory Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ExternalContextFactoryType
-	 * @generated
-	 */
-	public Adapter createExternalContextFactoryTypeAdapter() {
-		return null;
-	}
-
-				/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationExtensionType <em>Application Extension Type</em>}'.
-	 * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ApplicationExtensionType
-	 * @generated
-	 */
-    public Adapter createApplicationExtensionTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for the default case.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @generated
-	 */
-	public Adapter createEObjectAdapter() {
-		return null;
-	}
-
-} //FacesConfigAdapterFactory
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/util/FacesConfigSwitch.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/util/FacesConfigSwitch.java
deleted file mode 100644
index 1b258f5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/util/FacesConfigSwitch.java
+++ /dev/null
@@ -1,2722 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.util;
-
-import java.util.List;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.jst.jsf.facesconfig.emf.*;
-
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Switch</b> for the model's inheritance hierarchy.
- * It supports the call {@link #doSwitch(EObject) doSwitch(object)}
- * to invoke the <code>caseXXX</code> method for each class of the model,
- * starting with the actual class of the object
- * and proceeding up the inheritance hierarchy
- * until a non-null result is returned,
- * which is the result of the switch.
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage
- * @generated
- */
-public class FacesConfigSwitch {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The cached model package
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected static FacesConfigPackage modelPackage;
-
-    /**
-	 * Creates an instance of the switch.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FacesConfigSwitch() {
-		if (modelPackage == null) {
-			modelPackage = FacesConfigPackage.eINSTANCE;
-		}
-	}
-
-    /**
-	 * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
-	 * <!-- begin-user-doc -->
-     * @param theEObject 
-     * @return the first non-null result returned by a <code>caseXXX</code> call.
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public Object doSwitch(EObject theEObject) {
-		return doSwitch(theEObject.eClass(), theEObject);
-	}
-
-    /**
-	 * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
-	 * <!-- begin-user-doc -->
-     * @param theEClass 
-     * @param theEObject 
-     * @return the first non-null result returned by a <code>caseXXX</code> call.
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	protected Object doSwitch(EClass theEClass, EObject theEObject) {
-		if (theEClass.eContainer() == modelPackage) {
-			return doSwitch(theEClass.getClassifierID(), theEObject);
-		}
-		List eSuperTypes = theEClass.getESuperTypes();
-		return
-			eSuperTypes.isEmpty() ?
-				defaultCase(theEObject) :
-				doSwitch((EClass)eSuperTypes.get(0), theEObject);
-	}
-
-    /**
-	 * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
-	 * <!-- begin-user-doc -->
-     * @param classifierID 
-     * @param theEObject 
-	 * <!-- end-user-doc -->
-	 * @return the first non-null result returned by a <code>caseXXX</code> call.
-	 * @generated
-	 */
-	protected Object doSwitch(int classifierID, EObject theEObject) {
-		switch (classifierID) {
-			case FacesConfigPackage.ABSOLUTE_ORDERING_TYPE: {
-				AbsoluteOrderingType absoluteOrderingType = (AbsoluteOrderingType)theEObject;
-				Object result = caseAbsoluteOrderingType(absoluteOrderingType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.ACTION_LISTENER_TYPE: {
-				ActionListenerType actionListenerType = (ActionListenerType)theEObject;
-				Object result = caseActionListenerType(actionListenerType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.APPLICATION_FACTORY_TYPE: {
-				ApplicationFactoryType applicationFactoryType = (ApplicationFactoryType)theEObject;
-				Object result = caseApplicationFactoryType(applicationFactoryType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.APPLICATION_TYPE: {
-				ApplicationType applicationType = (ApplicationType)theEObject;
-				Object result = caseApplicationType(applicationType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.APPLICATION_EXTENSION_TYPE: {
-				ApplicationExtensionType applicationExtensionType = (ApplicationExtensionType)theEObject;
-				Object result = caseApplicationExtensionType(applicationExtensionType);
-				if (result == null) result = caseExtensionType(applicationExtensionType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.ATTRIBUTE_CLASS_TYPE: {
-				AttributeClassType attributeClassType = (AttributeClassType)theEObject;
-				Object result = caseAttributeClassType(attributeClassType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.ATTRIBUTE_EXTENSION_TYPE: {
-				AttributeExtensionType attributeExtensionType = (AttributeExtensionType)theEObject;
-				Object result = caseAttributeExtensionType(attributeExtensionType);
-				if (result == null) result = caseExtensionType(attributeExtensionType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.ATTRIBUTE_NAME_TYPE: {
-				AttributeNameType attributeNameType = (AttributeNameType)theEObject;
-				Object result = caseAttributeNameType(attributeNameType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.ATTRIBUTE_TYPE: {
-				AttributeType attributeType = (AttributeType)theEObject;
-				Object result = caseAttributeType(attributeType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.BEHAVIOR_CLASS_TYPE: {
-				BehaviorClassType behaviorClassType = (BehaviorClassType)theEObject;
-				Object result = caseBehaviorClassType(behaviorClassType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.BEHAVIOR_ID_TYPE: {
-				BehaviorIdType behaviorIdType = (BehaviorIdType)theEObject;
-				Object result = caseBehaviorIdType(behaviorIdType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.BEHAVIOR_TYPE: {
-				BehaviorType behaviorType = (BehaviorType)theEObject;
-				Object result = caseBehaviorType(behaviorType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.BEHAVIOR_EXTENSION_TYPE: {
-				BehaviorExtensionType behaviorExtensionType = (BehaviorExtensionType)theEObject;
-				Object result = caseBehaviorExtensionType(behaviorExtensionType);
-				if (result == null) result = caseExtensionType(behaviorExtensionType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.CLIENT_BEHAVIOR_RENDERER_CLASS_TYPE: {
-				ClientBehaviorRendererClassType clientBehaviorRendererClassType = (ClientBehaviorRendererClassType)theEObject;
-				Object result = caseClientBehaviorRendererClassType(clientBehaviorRendererClassType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.CLIENT_BEHAVIOR_RENDERER_TYPE: {
-				ClientBehaviorRendererType clientBehaviorRendererType = (ClientBehaviorRendererType)theEObject;
-				Object result = caseClientBehaviorRendererType(clientBehaviorRendererType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.CLIENT_BEHAVIOR_RENDERER_TYPE_TYPE: {
-				ClientBehaviorRendererTypeType clientBehaviorRendererTypeType = (ClientBehaviorRendererTypeType)theEObject;
-				Object result = caseClientBehaviorRendererTypeType(clientBehaviorRendererTypeType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.COMPONENT_CLASS_TYPE: {
-				ComponentClassType componentClassType = (ComponentClassType)theEObject;
-				Object result = caseComponentClassType(componentClassType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.COMPONENT_EXTENSION_TYPE: {
-				ComponentExtensionType componentExtensionType = (ComponentExtensionType)theEObject;
-				Object result = caseComponentExtensionType(componentExtensionType);
-				if (result == null) result = caseExtensionType(componentExtensionType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.COMPONENT_FAMILY_TYPE: {
-				ComponentFamilyType componentFamilyType = (ComponentFamilyType)theEObject;
-				Object result = caseComponentFamilyType(componentFamilyType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.COMPONENT_TYPE: {
-				ComponentType componentType = (ComponentType)theEObject;
-				Object result = caseComponentType(componentType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.COMPONENT_TYPE_TYPE: {
-				ComponentTypeType componentTypeType = (ComponentTypeType)theEObject;
-				Object result = caseComponentTypeType(componentTypeType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.CONVERTER_CLASS_TYPE: {
-				ConverterClassType converterClassType = (ConverterClassType)theEObject;
-				Object result = caseConverterClassType(converterClassType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.CONVERTER_FOR_CLASS_TYPE: {
-				ConverterForClassType converterForClassType = (ConverterForClassType)theEObject;
-				Object result = caseConverterForClassType(converterForClassType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.CONVERTER_ID_TYPE: {
-				ConverterIdType converterIdType = (ConverterIdType)theEObject;
-				Object result = caseConverterIdType(converterIdType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.CONVERTER_TYPE: {
-				ConverterType converterType = (ConverterType)theEObject;
-				Object result = caseConverterType(converterType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.CONVERTER_EXTENSION_TYPE: {
-				ConverterExtensionType converterExtensionType = (ConverterExtensionType)theEObject;
-				Object result = caseConverterExtensionType(converterExtensionType);
-				if (result == null) result = caseExtensionType(converterExtensionType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.DEFAULT_LOCALE_TYPE: {
-				DefaultLocaleType defaultLocaleType = (DefaultLocaleType)theEObject;
-				Object result = caseDefaultLocaleType(defaultLocaleType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.DEFAULT_RENDER_KIT_ID_TYPE: {
-				DefaultRenderKitIdType defaultRenderKitIdType = (DefaultRenderKitIdType)theEObject;
-				Object result = caseDefaultRenderKitIdType(defaultRenderKitIdType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.DEFAULT_VALIDATORS_TYPE: {
-				DefaultValidatorsType defaultValidatorsType = (DefaultValidatorsType)theEObject;
-				Object result = caseDefaultValidatorsType(defaultValidatorsType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.DEFAULT_VALUE_TYPE: {
-				DefaultValueType defaultValueType = (DefaultValueType)theEObject;
-				Object result = caseDefaultValueType(defaultValueType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.DESCRIPTION_TYPE: {
-				DescriptionType descriptionType = (DescriptionType)theEObject;
-				Object result = caseDescriptionType(descriptionType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.DISPLAY_NAME_TYPE: {
-				DisplayNameType displayNameType = (DisplayNameType)theEObject;
-				Object result = caseDisplayNameType(displayNameType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.DOCUMENT_ROOT: {
-				DocumentRoot documentRoot = (DocumentRoot)theEObject;
-				Object result = caseDocumentRoot(documentRoot);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.DYNAMIC_ATTRIBUTE: {
-				DynamicAttribute dynamicAttribute = (DynamicAttribute)theEObject;
-				Object result = caseDynamicAttribute(dynamicAttribute);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.DYNAMIC_ELEMENT: {
-				DynamicElement dynamicElement = (DynamicElement)theEObject;
-				Object result = caseDynamicElement(dynamicElement);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.EL_RESOLVER_TYPE: {
-				ELResolverType elResolverType = (ELResolverType)theEObject;
-				Object result = caseELResolverType(elResolverType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.EXCEPTION_HANDLER_FACTORY_TYPE: {
-				ExceptionHandlerFactoryType exceptionHandlerFactoryType = (ExceptionHandlerFactoryType)theEObject;
-				Object result = caseExceptionHandlerFactoryType(exceptionHandlerFactoryType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.EXTENSION_TYPE: {
-				ExtensionType extensionType = (ExtensionType)theEObject;
-				Object result = caseExtensionType(extensionType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.EXTERNAL_CONTEXT_FACTORY_TYPE: {
-				ExternalContextFactoryType externalContextFactoryType = (ExternalContextFactoryType)theEObject;
-				Object result = caseExternalContextFactoryType(externalContextFactoryType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.FACES_CONFIG_TYPE: {
-				FacesConfigType facesConfigType = (FacesConfigType)theEObject;
-				Object result = caseFacesConfigType(facesConfigType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.FACES_CONFIG_EXTENSION_TYPE: {
-				FacesConfigExtensionType facesConfigExtensionType = (FacesConfigExtensionType)theEObject;
-				Object result = caseFacesConfigExtensionType(facesConfigExtensionType);
-				if (result == null) result = caseExtensionType(facesConfigExtensionType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.FACES_CONTEXT_FACTORY_TYPE: {
-				FacesContextFactoryType facesContextFactoryType = (FacesContextFactoryType)theEObject;
-				Object result = caseFacesContextFactoryType(facesContextFactoryType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.FACET_EXTENSION_TYPE: {
-				FacetExtensionType facetExtensionType = (FacetExtensionType)theEObject;
-				Object result = caseFacetExtensionType(facetExtensionType);
-				if (result == null) result = caseExtensionType(facetExtensionType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.FACET_NAME_TYPE: {
-				FacetNameType facetNameType = (FacetNameType)theEObject;
-				Object result = caseFacetNameType(facetNameType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.FACET_TYPE: {
-				FacetType facetType = (FacetType)theEObject;
-				Object result = caseFacetType(facetType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.FACTORY_TYPE: {
-				FactoryType factoryType = (FactoryType)theEObject;
-				Object result = caseFactoryType(factoryType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.FACTORY_EXTENSION_TYPE: {
-				FactoryExtensionType factoryExtensionType = (FactoryExtensionType)theEObject;
-				Object result = caseFactoryExtensionType(factoryExtensionType);
-				if (result == null) result = caseExtensionType(factoryExtensionType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.FROM_ACTION_TYPE: {
-				FromActionType fromActionType = (FromActionType)theEObject;
-				Object result = caseFromActionType(fromActionType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.FROM_OUTCOME_TYPE: {
-				FromOutcomeType fromOutcomeType = (FromOutcomeType)theEObject;
-				Object result = caseFromOutcomeType(fromOutcomeType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.FROM_VIEW_ID_TYPE: {
-				FromViewIdType fromViewIdType = (FromViewIdType)theEObject;
-				Object result = caseFromViewIdType(fromViewIdType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.ICON_TYPE: {
-				IconType iconType = (IconType)theEObject;
-				Object result = caseIconType(iconType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.IF_TYPE: {
-				IfType ifType = (IfType)theEObject;
-				Object result = caseIfType(ifType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.KEY_CLASS_TYPE: {
-				KeyClassType keyClassType = (KeyClassType)theEObject;
-				Object result = caseKeyClassType(keyClassType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.KEY_TYPE: {
-				KeyType keyType = (KeyType)theEObject;
-				Object result = caseKeyType(keyType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.LARGE_ICON_TYPE: {
-				LargeIconType largeIconType = (LargeIconType)theEObject;
-				Object result = caseLargeIconType(largeIconType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.LIFECYCLE_FACTORY_TYPE: {
-				LifecycleFactoryType lifecycleFactoryType = (LifecycleFactoryType)theEObject;
-				Object result = caseLifecycleFactoryType(lifecycleFactoryType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.LIFECYCLE_TYPE: {
-				LifecycleType lifecycleType = (LifecycleType)theEObject;
-				Object result = caseLifecycleType(lifecycleType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.LIFECYCLE_EXTENSION_TYPE: {
-				LifecycleExtensionType lifecycleExtensionType = (LifecycleExtensionType)theEObject;
-				Object result = caseLifecycleExtensionType(lifecycleExtensionType);
-				if (result == null) result = caseExtensionType(lifecycleExtensionType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.LIST_ENTRIES_TYPE: {
-				ListEntriesType listEntriesType = (ListEntriesType)theEObject;
-				Object result = caseListEntriesType(listEntriesType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.LOCALE_CONFIG_TYPE: {
-				LocaleConfigType localeConfigType = (LocaleConfigType)theEObject;
-				Object result = caseLocaleConfigType(localeConfigType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.MANAGED_BEAN_CLASS_TYPE: {
-				ManagedBeanClassType managedBeanClassType = (ManagedBeanClassType)theEObject;
-				Object result = caseManagedBeanClassType(managedBeanClassType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.MANAGED_BEAN_NAME_TYPE: {
-				ManagedBeanNameType managedBeanNameType = (ManagedBeanNameType)theEObject;
-				Object result = caseManagedBeanNameType(managedBeanNameType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.MANAGED_BEAN_SCOPE_TYPE: {
-				ManagedBeanScopeType managedBeanScopeType = (ManagedBeanScopeType)theEObject;
-				Object result = caseManagedBeanScopeType(managedBeanScopeType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.MANAGED_BEAN_TYPE: {
-				ManagedBeanType managedBeanType = (ManagedBeanType)theEObject;
-				Object result = caseManagedBeanType(managedBeanType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.MANAGED_BEAN_EXTENSION_TYPE: {
-				ManagedBeanExtensionType managedBeanExtensionType = (ManagedBeanExtensionType)theEObject;
-				Object result = caseManagedBeanExtensionType(managedBeanExtensionType);
-				if (result == null) result = caseExtensionType(managedBeanExtensionType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE: {
-				ManagedPropertyType managedPropertyType = (ManagedPropertyType)theEObject;
-				Object result = caseManagedPropertyType(managedPropertyType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.MAP_ENTRIES_TYPE: {
-				MapEntriesType mapEntriesType = (MapEntriesType)theEObject;
-				Object result = caseMapEntriesType(mapEntriesType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.MAP_ENTRY_TYPE: {
-				MapEntryType mapEntryType = (MapEntryType)theEObject;
-				Object result = caseMapEntryType(mapEntryType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.MESSAGE_BUNDLE_TYPE: {
-				MessageBundleType messageBundleType = (MessageBundleType)theEObject;
-				Object result = caseMessageBundleType(messageBundleType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.NAME_TYPE: {
-				NameType nameType = (NameType)theEObject;
-				Object result = caseNameType(nameType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE: {
-				NavigationCaseType navigationCaseType = (NavigationCaseType)theEObject;
-				Object result = caseNavigationCaseType(navigationCaseType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.NAVIGATION_HANDLER_TYPE: {
-				NavigationHandlerType navigationHandlerType = (NavigationHandlerType)theEObject;
-				Object result = caseNavigationHandlerType(navigationHandlerType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.NAVIGATION_RULE_TYPE: {
-				NavigationRuleType navigationRuleType = (NavigationRuleType)theEObject;
-				Object result = caseNavigationRuleType(navigationRuleType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.NAVIGATION_RULE_EXTENSION_TYPE: {
-				NavigationRuleExtensionType navigationRuleExtensionType = (NavigationRuleExtensionType)theEObject;
-				Object result = caseNavigationRuleExtensionType(navigationRuleExtensionType);
-				if (result == null) result = caseExtensionType(navigationRuleExtensionType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.NULL_VALUE_TYPE: {
-				NullValueType nullValueType = (NullValueType)theEObject;
-				Object result = caseNullValueType(nullValueType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.ORDERING_TYPE: {
-				OrderingType orderingType = (OrderingType)theEObject;
-				Object result = caseOrderingType(orderingType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.ORDERING_ORDERING_TYPE: {
-				OrderingOrderingType orderingOrderingType = (OrderingOrderingType)theEObject;
-				Object result = caseOrderingOrderingType(orderingOrderingType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.ORDERING_OTHERS_TYPE: {
-				OrderingOthersType orderingOthersType = (OrderingOthersType)theEObject;
-				Object result = caseOrderingOthersType(orderingOthersType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.PARTIAL_VIEW_CONTEXT_FACTORY_TYPE: {
-				PartialViewContextFactoryType partialViewContextFactoryType = (PartialViewContextFactoryType)theEObject;
-				Object result = casePartialViewContextFactoryType(partialViewContextFactoryType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.PHASE_LISTENER_TYPE: {
-				PhaseListenerType phaseListenerType = (PhaseListenerType)theEObject;
-				Object result = casePhaseListenerType(phaseListenerType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.PROPERTY_CLASS_TYPE: {
-				PropertyClassType propertyClassType = (PropertyClassType)theEObject;
-				Object result = casePropertyClassType(propertyClassType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.PROPERTY_EXTENSION_TYPE: {
-				PropertyExtensionType propertyExtensionType = (PropertyExtensionType)theEObject;
-				Object result = casePropertyExtensionType(propertyExtensionType);
-				if (result == null) result = caseExtensionType(propertyExtensionType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.PROPERTY_NAME_TYPE: {
-				PropertyNameType propertyNameType = (PropertyNameType)theEObject;
-				Object result = casePropertyNameType(propertyNameType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.PROPERTY_RESOLVER_TYPE: {
-				PropertyResolverType propertyResolverType = (PropertyResolverType)theEObject;
-				Object result = casePropertyResolverType(propertyResolverType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.PROPERTY_TYPE: {
-				PropertyType propertyType = (PropertyType)theEObject;
-				Object result = casePropertyType(propertyType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.REDIRECT_TYPE: {
-				RedirectType redirectType = (RedirectType)theEObject;
-				Object result = caseRedirectType(redirectType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.REDIRECT_VIEW_PARAM_TYPE: {
-				RedirectViewParamType redirectViewParamType = (RedirectViewParamType)theEObject;
-				Object result = caseRedirectViewParamType(redirectViewParamType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.REFERENCED_BEAN_CLASS_TYPE: {
-				ReferencedBeanClassType referencedBeanClassType = (ReferencedBeanClassType)theEObject;
-				Object result = caseReferencedBeanClassType(referencedBeanClassType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.REFERENCED_BEAN_NAME_TYPE: {
-				ReferencedBeanNameType referencedBeanNameType = (ReferencedBeanNameType)theEObject;
-				Object result = caseReferencedBeanNameType(referencedBeanNameType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.REFERENCED_BEAN_TYPE: {
-				ReferencedBeanType referencedBeanType = (ReferencedBeanType)theEObject;
-				Object result = caseReferencedBeanType(referencedBeanType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.RENDERER_CLASS_TYPE: {
-				RendererClassType rendererClassType = (RendererClassType)theEObject;
-				Object result = caseRendererClassType(rendererClassType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.RENDERER_EXTENSION_TYPE: {
-				RendererExtensionType rendererExtensionType = (RendererExtensionType)theEObject;
-				Object result = caseRendererExtensionType(rendererExtensionType);
-				if (result == null) result = caseExtensionType(rendererExtensionType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.RENDERER_TYPE: {
-				RendererType rendererType = (RendererType)theEObject;
-				Object result = caseRendererType(rendererType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.RENDERER_TYPE_TYPE: {
-				RendererTypeType rendererTypeType = (RendererTypeType)theEObject;
-				Object result = caseRendererTypeType(rendererTypeType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.RENDER_KIT_CLASS_TYPE: {
-				RenderKitClassType renderKitClassType = (RenderKitClassType)theEObject;
-				Object result = caseRenderKitClassType(renderKitClassType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.RENDER_KIT_FACTORY_TYPE: {
-				RenderKitFactoryType renderKitFactoryType = (RenderKitFactoryType)theEObject;
-				Object result = caseRenderKitFactoryType(renderKitFactoryType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.RENDER_KIT_ID_TYPE: {
-				RenderKitIdType renderKitIdType = (RenderKitIdType)theEObject;
-				Object result = caseRenderKitIdType(renderKitIdType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.RENDER_KIT_TYPE: {
-				RenderKitType renderKitType = (RenderKitType)theEObject;
-				Object result = caseRenderKitType(renderKitType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.RENDER_KIT_EXTENSION_TYPE: {
-				RenderKitExtensionType renderKitExtensionType = (RenderKitExtensionType)theEObject;
-				Object result = caseRenderKitExtensionType(renderKitExtensionType);
-				if (result == null) result = caseExtensionType(renderKitExtensionType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.RESOURCE_HANDLER_TYPE: {
-				ResourceHandlerType resourceHandlerType = (ResourceHandlerType)theEObject;
-				Object result = caseResourceHandlerType(resourceHandlerType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.SMALL_ICON_TYPE: {
-				SmallIconType smallIconType = (SmallIconType)theEObject;
-				Object result = caseSmallIconType(smallIconType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.SOURCE_CLASS_TYPE: {
-				SourceClassType sourceClassType = (SourceClassType)theEObject;
-				Object result = caseSourceClassType(sourceClassType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.STATE_MANAGER_TYPE: {
-				StateManagerType stateManagerType = (StateManagerType)theEObject;
-				Object result = caseStateManagerType(stateManagerType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.SUGGESTED_VALUE_TYPE: {
-				SuggestedValueType suggestedValueType = (SuggestedValueType)theEObject;
-				Object result = caseSuggestedValueType(suggestedValueType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.SUPPORTED_LOCALE_TYPE: {
-				SupportedLocaleType supportedLocaleType = (SupportedLocaleType)theEObject;
-				Object result = caseSupportedLocaleType(supportedLocaleType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.SYSTEM_EVENT_CLASS_TYPE: {
-				SystemEventClassType systemEventClassType = (SystemEventClassType)theEObject;
-				Object result = caseSystemEventClassType(systemEventClassType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.SYSTEM_EVENT_LISTENER_CLASS_TYPE: {
-				SystemEventListenerClassType systemEventListenerClassType = (SystemEventListenerClassType)theEObject;
-				Object result = caseSystemEventListenerClassType(systemEventListenerClassType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.SYSTEM_EVENT_LISTENER_TYPE: {
-				SystemEventListenerType systemEventListenerType = (SystemEventListenerType)theEObject;
-				Object result = caseSystemEventListenerType(systemEventListenerType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.TAG_HANDLER_DELEGATE_FACTORY_TYPE: {
-				TagHandlerDelegateFactoryType tagHandlerDelegateFactoryType = (TagHandlerDelegateFactoryType)theEObject;
-				Object result = caseTagHandlerDelegateFactoryType(tagHandlerDelegateFactoryType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.TO_VIEW_ID_TYPE: {
-				ToViewIdType toViewIdType = (ToViewIdType)theEObject;
-				Object result = caseToViewIdType(toViewIdType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.VALIDATOR_CLASS_TYPE: {
-				ValidatorClassType validatorClassType = (ValidatorClassType)theEObject;
-				Object result = caseValidatorClassType(validatorClassType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.VALIDATOR_ID_TYPE: {
-				ValidatorIdType validatorIdType = (ValidatorIdType)theEObject;
-				Object result = caseValidatorIdType(validatorIdType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.VALIDATOR_TYPE: {
-				ValidatorType validatorType = (ValidatorType)theEObject;
-				Object result = caseValidatorType(validatorType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.VALIDATOR_EXTENSION_TYPE: {
-				ValidatorExtensionType validatorExtensionType = (ValidatorExtensionType)theEObject;
-				Object result = caseValidatorExtensionType(validatorExtensionType);
-				if (result == null) result = caseExtensionType(validatorExtensionType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.VALUE_CLASS_TYPE: {
-				ValueClassType valueClassType = (ValueClassType)theEObject;
-				Object result = caseValueClassType(valueClassType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.VALUE_TYPE: {
-				ValueType valueType = (ValueType)theEObject;
-				Object result = caseValueType(valueType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.VARIABLE_RESOLVER_TYPE: {
-				VariableResolverType variableResolverType = (VariableResolverType)theEObject;
-				Object result = caseVariableResolverType(variableResolverType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.VIEW_HANDLER_TYPE: {
-				ViewHandlerType viewHandlerType = (ViewHandlerType)theEObject;
-				Object result = caseViewHandlerType(viewHandlerType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.RESOURCE_BUNDLE_TYPE: {
-				ResourceBundleType resourceBundleType = (ResourceBundleType)theEObject;
-				Object result = caseResourceBundleType(resourceBundleType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.BASE_NAME_TYPE: {
-				BaseNameType baseNameType = (BaseNameType)theEObject;
-				Object result = caseBaseNameType(baseNameType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.VAR_TYPE: {
-				VarType varType = (VarType)theEObject;
-				Object result = caseVarType(varType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.VIEW_DECLARATION_LANGUAGE_FACTORY_TYPE: {
-				ViewDeclarationLanguageFactoryType viewDeclarationLanguageFactoryType = (ViewDeclarationLanguageFactoryType)theEObject;
-				Object result = caseViewDeclarationLanguageFactoryType(viewDeclarationLanguageFactoryType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.VISIT_CONTEXT_FACTORY_TYPE: {
-				VisitContextFactoryType visitContextFactoryType = (VisitContextFactoryType)theEObject;
-				Object result = caseVisitContextFactoryType(visitContextFactoryType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			default: return defaultCase(theEObject);
-		}
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Absolute Ordering Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Absolute Ordering Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseAbsoluteOrderingType(AbsoluteOrderingType object) {
-		return null;
-	}
-
-				/**
-	 * Returns the result of interpreting the object as an instance of '<em>Action Listener Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Action Listener Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseActionListenerType(ActionListenerType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Application Factory Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Application Factory Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseApplicationFactoryType(ApplicationFactoryType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Application Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Application Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseApplicationType(ApplicationType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Attribute Class Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Attribute Class Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseAttributeClassType(AttributeClassType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Attribute Extension Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Attribute Extension Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseAttributeExtensionType(AttributeExtensionType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Attribute Name Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Attribute Name Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseAttributeNameType(AttributeNameType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Attribute Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Attribute Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseAttributeType(AttributeType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Behavior Class Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Behavior Class Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseBehaviorClassType(BehaviorClassType object) {
-		return null;
-	}
-
-				/**
-	 * Returns the result of interpreting the object as an instance of '<em>Behavior Id Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Behavior Id Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseBehaviorIdType(BehaviorIdType object) {
-		return null;
-	}
-
-				/**
-	 * Returns the result of interpreting the object as an instance of '<em>Behavior Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Behavior Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseBehaviorType(BehaviorType object) {
-		return null;
-	}
-
-				/**
-	 * Returns the result of interpreting the object as an instance of '<em>Behavior Extension Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Behavior Extension Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseBehaviorExtensionType(BehaviorExtensionType object) {
-		return null;
-	}
-
-				/**
-	 * Returns the result of interpreting the object as an instance of '<em>Client Behavior Renderer Class Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Client Behavior Renderer Class Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseClientBehaviorRendererClassType(ClientBehaviorRendererClassType object) {
-		return null;
-	}
-
-				/**
-	 * Returns the result of interpreting the object as an instance of '<em>Client Behavior Renderer Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Client Behavior Renderer Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseClientBehaviorRendererType(ClientBehaviorRendererType object) {
-		return null;
-	}
-
-				/**
-	 * Returns the result of interpreting the object as an instance of '<em>Client Behavior Renderer Type Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Client Behavior Renderer Type Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseClientBehaviorRendererTypeType(ClientBehaviorRendererTypeType object) {
-		return null;
-	}
-
-				/**
-	 * Returns the result of interpreting the object as an instance of '<em>Component Class Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Component Class Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseComponentClassType(ComponentClassType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Component Extension Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Component Extension Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseComponentExtensionType(ComponentExtensionType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Component Family Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Component Family Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseComponentFamilyType(ComponentFamilyType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Component Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Component Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseComponentType(ComponentType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Component Type Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Component Type Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseComponentTypeType(ComponentTypeType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Converter Class Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Converter Class Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseConverterClassType(ConverterClassType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Converter For Class Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Converter For Class Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseConverterForClassType(ConverterForClassType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Converter Id Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Converter Id Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseConverterIdType(ConverterIdType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Converter Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Converter Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseConverterType(ConverterType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Default Locale Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Default Locale Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseDefaultLocaleType(DefaultLocaleType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Default Render Kit Id Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Default Render Kit Id Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseDefaultRenderKitIdType(DefaultRenderKitIdType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Default Validators Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Default Validators Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseDefaultValidatorsType(DefaultValidatorsType object) {
-		return null;
-	}
-
-				/**
-	 * Returns the result of interpreting the object as an instance of '<em>Default Value Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Default Value Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseDefaultValueType(DefaultValueType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Description Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Description Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseDescriptionType(DescriptionType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Display Name Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Display Name Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseDisplayNameType(DisplayNameType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Document Root</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Document Root</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseDocumentRoot(DocumentRoot object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Dynamic Attribute</em>'.
-	 * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Dynamic Attribute</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-    public Object caseDynamicAttribute(DynamicAttribute object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Dynamic Element</em>'.
-	 * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Dynamic Element</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-    public Object caseDynamicElement(DynamicElement object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>EL Resolver Type</em>'.
-	 * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>EL Resolver Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-    public Object caseELResolverType(ELResolverType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Exception Handler Factory Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Exception Handler Factory Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseExceptionHandlerFactoryType(ExceptionHandlerFactoryType object) {
-		return null;
-	}
-
-				/**
-	 * Returns the result of interpreting the object as an instance of '<em>Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseFacesConfigType(FacesConfigType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Faces Context Factory Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Faces Context Factory Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseFacesContextFactoryType(FacesContextFactoryType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Facet Extension Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Facet Extension Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseFacetExtensionType(FacetExtensionType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Facet Name Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Facet Name Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseFacetNameType(FacetNameType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Facet Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Facet Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseFacetType(FacetType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Factory Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Factory Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseFactoryType(FactoryType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>From Action Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>From Action Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseFromActionType(FromActionType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>From Outcome Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>From Outcome Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseFromOutcomeType(FromOutcomeType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>From View Id Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>From View Id Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseFromViewIdType(FromViewIdType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Icon Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Icon Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseIconType(IconType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>If Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>If Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseIfType(IfType object) {
-		return null;
-	}
-
-				/**
-	 * Returns the result of interpreting the object as an instance of '<em>Key Class Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Key Class Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseKeyClassType(KeyClassType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Key Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Key Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseKeyType(KeyType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Large Icon Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Large Icon Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseLargeIconType(LargeIconType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Lifecycle Factory Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Lifecycle Factory Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseLifecycleFactoryType(LifecycleFactoryType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Lifecycle Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Lifecycle Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseLifecycleType(LifecycleType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>List Entries Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>List Entries Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseListEntriesType(ListEntriesType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Locale Config Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Locale Config Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseLocaleConfigType(LocaleConfigType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Managed Bean Class Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Managed Bean Class Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseManagedBeanClassType(ManagedBeanClassType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Managed Bean Name Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Managed Bean Name Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseManagedBeanNameType(ManagedBeanNameType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Managed Bean Scope Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Managed Bean Scope Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseManagedBeanScopeType(ManagedBeanScopeType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Managed Bean Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Managed Bean Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseManagedBeanType(ManagedBeanType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Managed Property Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Managed Property Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseManagedPropertyType(ManagedPropertyType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Map Entries Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Map Entries Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseMapEntriesType(MapEntriesType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Map Entry Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Map Entry Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseMapEntryType(MapEntryType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Message Bundle Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Message Bundle Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseMessageBundleType(MessageBundleType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Name Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Name Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseNameType(NameType object) {
-		return null;
-	}
-
-				/**
-	 * Returns the result of interpreting the object as an instance of '<em>Navigation Case Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Navigation Case Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseNavigationCaseType(NavigationCaseType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Navigation Handler Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Navigation Handler Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseNavigationHandlerType(NavigationHandlerType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Navigation Rule Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Navigation Rule Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseNavigationRuleType(NavigationRuleType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Null Value Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Null Value Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseNullValueType(NullValueType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Ordering Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Ordering Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseOrderingType(OrderingType object) {
-		return null;
-	}
-
-				/**
-	 * Returns the result of interpreting the object as an instance of '<em>Ordering Ordering Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Ordering Ordering Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseOrderingOrderingType(OrderingOrderingType object) {
-		return null;
-	}
-
-				/**
-	 * Returns the result of interpreting the object as an instance of '<em>Ordering Others Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Ordering Others Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseOrderingOthersType(OrderingOthersType object) {
-		return null;
-	}
-
-				/**
-	 * Returns the result of interpreting the object as an instance of '<em>Partial View Context Factory Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Partial View Context Factory Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object casePartialViewContextFactoryType(PartialViewContextFactoryType object) {
-		return null;
-	}
-
-				/**
-	 * Returns the result of interpreting the object as an instance of '<em>Phase Listener Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Phase Listener Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object casePhaseListenerType(PhaseListenerType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Property Class Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Property Class Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object casePropertyClassType(PropertyClassType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Property Extension Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Property Extension Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object casePropertyExtensionType(PropertyExtensionType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Property Name Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Property Name Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object casePropertyNameType(PropertyNameType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Property Resolver Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Property Resolver Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object casePropertyResolverType(PropertyResolverType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Property Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Property Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object casePropertyType(PropertyType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Redirect Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Redirect Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseRedirectType(RedirectType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Redirect View Param Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Redirect View Param Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseRedirectViewParamType(RedirectViewParamType object) {
-		return null;
-	}
-
-				/**
-	 * Returns the result of interpreting the object as an instance of '<em>Referenced Bean Class Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Referenced Bean Class Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseReferencedBeanClassType(ReferencedBeanClassType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Referenced Bean Name Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Referenced Bean Name Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseReferencedBeanNameType(ReferencedBeanNameType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Referenced Bean Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Referenced Bean Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseReferencedBeanType(ReferencedBeanType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Renderer Class Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Renderer Class Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseRendererClassType(RendererClassType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Renderer Extension Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Renderer Extension Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseRendererExtensionType(RendererExtensionType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Renderer Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Renderer Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseRendererType(RendererType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Renderer Type Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Renderer Type Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseRendererTypeType(RendererTypeType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Render Kit Class Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Render Kit Class Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseRenderKitClassType(RenderKitClassType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Render Kit Factory Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Render Kit Factory Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseRenderKitFactoryType(RenderKitFactoryType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Render Kit Id Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Render Kit Id Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseRenderKitIdType(RenderKitIdType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Render Kit Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Render Kit Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseRenderKitType(RenderKitType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Small Icon Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Small Icon Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseSmallIconType(SmallIconType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Source Class Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Source Class Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseSourceClassType(SourceClassType object) {
-		return null;
-	}
-
-				/**
-	 * Returns the result of interpreting the object as an instance of '<em>State Manager Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>State Manager Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseStateManagerType(StateManagerType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Suggested Value Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Suggested Value Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseSuggestedValueType(SuggestedValueType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Supported Locale Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Supported Locale Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseSupportedLocaleType(SupportedLocaleType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>System Event Class Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>System Event Class Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseSystemEventClassType(SystemEventClassType object) {
-		return null;
-	}
-
-				/**
-	 * Returns the result of interpreting the object as an instance of '<em>System Event Listener Class Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>System Event Listener Class Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseSystemEventListenerClassType(SystemEventListenerClassType object) {
-		return null;
-	}
-
-				/**
-	 * Returns the result of interpreting the object as an instance of '<em>System Event Listener Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>System Event Listener Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseSystemEventListenerType(SystemEventListenerType object) {
-		return null;
-	}
-
-				/**
-	 * Returns the result of interpreting the object as an instance of '<em>Tag Handler Delegate Factory Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Tag Handler Delegate Factory Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseTagHandlerDelegateFactoryType(TagHandlerDelegateFactoryType object) {
-		return null;
-	}
-
-				/**
-	 * Returns the result of interpreting the object as an instance of '<em>To View Id Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>To View Id Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseToViewIdType(ToViewIdType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Validator Class Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Validator Class Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseValidatorClassType(ValidatorClassType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Validator Id Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Validator Id Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseValidatorIdType(ValidatorIdType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Validator Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Validator Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseValidatorType(ValidatorType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Value Class Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Value Class Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseValueClassType(ValueClassType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Value Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Value Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseValueType(ValueType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Variable Resolver Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Variable Resolver Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseVariableResolverType(VariableResolverType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>View Handler Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>View Handler Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseViewHandlerType(ViewHandlerType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Resource Bundle Type</em>'.
-	 * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Resource Bundle Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-    public Object caseResourceBundleType(ResourceBundleType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Base Name Type</em>'.
-	 * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Base Name Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-    public Object caseBaseNameType(BaseNameType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Var Type</em>'.
-	 * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Var Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-    public Object caseVarType(VarType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>View Declaration Language Factory Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>View Declaration Language Factory Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseViewDeclarationLanguageFactoryType(ViewDeclarationLanguageFactoryType object) {
-		return null;
-	}
-
-				/**
-	 * Returns the result of interpreting the object as an instance of '<em>Visit Context Factory Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Visit Context Factory Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseVisitContextFactoryType(VisitContextFactoryType object) {
-		return null;
-	}
-
-				/**
-	 * Returns the result of interpreting the object as an instance of '<em>Render Kit Extension Type</em>'.
-	 * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Render Kit Extension Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-    public Object caseRenderKitExtensionType(RenderKitExtensionType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Resource Handler Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Resource Handler Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseResourceHandlerType(ResourceHandlerType object) {
-		return null;
-	}
-
-				/**
-	 * Returns the result of interpreting the object as an instance of '<em>Navigation Rule Extension Type</em>'.
-	 * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Navigation Rule Extension Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-    public Object caseNavigationRuleExtensionType(NavigationRuleExtensionType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Validator Extension Type</em>'.
-	 * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Validator Extension Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-    public Object caseValidatorExtensionType(ValidatorExtensionType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Extension Type</em>'.
-	 * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Extension Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-    public Object caseFacesConfigExtensionType(FacesConfigExtensionType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Factory Extension Type</em>'.
-	 * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Factory Extension Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-    public Object caseFactoryExtensionType(FactoryExtensionType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Lifecycle Extension Type</em>'.
-	 * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Lifecycle Extension Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-    public Object caseLifecycleExtensionType(LifecycleExtensionType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Managed Bean Extension Type</em>'.
-	 * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Managed Bean Extension Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-    public Object caseManagedBeanExtensionType(ManagedBeanExtensionType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Converter Extension Type</em>'.
-	 * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Converter Extension Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-    public Object caseConverterExtensionType(ConverterExtensionType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Extension Type</em>'.
-	 * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Extension Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-    public Object caseExtensionType(ExtensionType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>External Context Factory Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>External Context Factory Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseExternalContextFactoryType(ExternalContextFactoryType object) {
-		return null;
-	}
-
-				/**
-	 * Returns the result of interpreting the object as an instance of '<em>Application Extension Type</em>'.
-	 * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Application Extension Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-    public Object caseApplicationExtensionType(ApplicationExtensionType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>EObject</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch, but this is the last case anyway.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>EObject</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject)
-	 * @generated
-	 */
-	public Object defaultCase(EObject object) {
-		return null;
-	}
-
-} //FacesConfigSwitch
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/util/package-info.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/util/package-info.java
deleted file mode 100644
index 629e163..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/util/package-info.java
+++ /dev/null
@@ -1,19 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-/**
- * EMF generated utility classes for JSF application configuration files (deprecated).
- * <p>
- * Deprecated - should be using classes in org.eclipse.jst.jsf.facesconfig.edit.provider.   
- * This package will be removed from the MANIFEST.MF as public API in a future release.
- */
-package org.eclipse.jst.jsf.facesconfig.emf.util;
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/Logger.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/Logger.java
deleted file mode 100644
index ab40d83..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/Logger.java
+++ /dev/null
@@ -1,283 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal;
-
-import java.io.PrintStream;
-import java.util.StringTokenizer;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.Plugin;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-
-
-/**
- * Small convenience class to log messages to plugin's log file and also, if desired,
- * the console. This class should only be used by classes in this plugin. Other
- * plugins should make their own copy, with appropriate ID.
- */
-public class Logger {
-	private static Plugin fPlugin;
-	private static String fPluginId;
-	
-	/**
-	 * Controls whether or not log/trace messages also go to the console.
-	 * Normally, leave this as false.  Change to true temporarily, if desired, for debugging.
-	 */
-	private static boolean displayToConsole = false;
-
-	private static final String TRACEFILTER_LOCATION = "/debug/tracefilter"; //$NON-NLS-1$
-
-	private static final int OK = IStatus.OK; // 0
-	private static final int INFO = IStatus.INFO; // 1
-	private static final int WARNING = IStatus.WARNING; // 2
-	private static final int ERROR = IStatus.ERROR; // 4
-
-	private static final int OK_DEBUG = 200 + OK;
-	private static final int INFO_DEBUG = 200 + INFO;
-	private static final int WARNING_DEBUG = 200 + WARNING;
-	private static final int ERROR_DEBUG = 200 + ERROR;
-
-	/**
-	 * Adds message to log.
-	 * @param level severity level of the message (OK, INFO, WARNING, ERROR, OK_DEBUG, INFO_DEBUG, WARNING_DEBUG, ERROR_DEBUG)
-	 * @param message text to add to the log
-	 * @param exception exception thrown
-	 */
-	protected static void _log(int level, String message, Throwable exception) {
-		if (level == OK_DEBUG || level == INFO_DEBUG || level == WARNING_DEBUG || level == ERROR_DEBUG) {
-			if (!isDebugging())
-				return;
-		}
-
-		int severity = IStatus.OK;
-		switch (level) {
-			case INFO_DEBUG :
-			case INFO :
-				severity = IStatus.INFO;
-				break;
-			case WARNING_DEBUG :
-			case WARNING :
-				severity = IStatus.WARNING;
-				break;
-			case ERROR_DEBUG :
-			case ERROR :
-				severity = IStatus.ERROR;
-		}
-		message = (message != null) ? message : "null"; //$NON-NLS-1$
-		Status statusObj = new Status(severity, getPluginId(), severity, message, exception);
-		getPlugin().getLog().log(statusObj);
-	}
-
-	/**
-	 * Prints message to log if category matches /debug/tracefilter option.
-	 * @param message text to print
-	 * @param category category of the message, to be compared with /debug/tracefilter
-	 * @param exception 
-	 */
-	protected static void _trace(String category, String message, Throwable exception) {
-		if (isTracing(category)) {
-			message = (message != null) ? message : "null"; //$NON-NLS-1$
-			Status statusObj = new Status(IStatus.OK, getPluginId(), IStatus.OK, message, exception);
-			getPlugin().getLog().log(statusObj);
-		}
-	}
-
-	/**
-	 * @return true if the plugin for this logger is debugging
-	 */
-	public static boolean isDebugging() {
-		return getPlugin().isDebugging();
-	}
-
-	/**
-	 * Determines if currently tracing a category
-	 * @param category
-	 * @return true if tracing category, false otherwise
-	 */
-	public static boolean isTracing(String category) {
-		if (!isDebugging())
-			return false;
-
-		String traceFilter = Platform.getDebugOption(getPluginId() + TRACEFILTER_LOCATION);
-		if (traceFilter != null) {
-			StringTokenizer tokenizer = new StringTokenizer(traceFilter, ","); //$NON-NLS-1$
-			while (tokenizer.hasMoreTokens()) {
-				String cat = tokenizer.nextToken().trim();
-				if (category.equals(cat)) {
-					return true;
-				}
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * @param level
-	 * @param message
-	 */
-	public static void log(int level, String message) {
-		_log(level, message, null);
-	}
-
-	/**
-	 * @param level
-	 * @param message
-	 * @param exception
-	 */
-	public static void log(int level, String message, Throwable exception) {
-		_log(level, message, exception);
-	}
-	
-	/**
-	 * @param source
-	 * @param message
-	 */
-	public static void log(Object source, String message) {
-		doLog(source, message, null);
-	}
-
-	/**
-	 * @param source
-	 * @param message
-	 * @param throwable
-	 */
-	public static void log(Object source, String message, Throwable throwable) {
-		doLog(source, message, throwable);
-	}
-
-	/**
-	 * @param source
-	 * @param throwable
-	 */
-	public static void log(Object source, Throwable throwable) {
-		doLog(source, null, throwable);
-	}
-	
-	/**
-	 * @param message
-	 */
-	public static void log(String message) {
-		doLog(message, null);
-	}
-	
-	private static void doLog(String message, Throwable exception) {
-		_log(ERROR, message, exception);
-	}
-	
-	private static void doLog(Object source, String message, Throwable exception) {
-		_log(ERROR, getMessageFor(source, message), exception);
-	}
-	
-	private static final String getMessageFor(Object source, String message) {
-		StringBuffer buffer = new StringBuffer();
-		buffer.append(source);
-		if (message != null) {
-			buffer.append(": "); //$NON-NLS-1$
-			buffer.append(message);
-		}
-		return buffer.toString();
-	}
-
-	/**
-	 * @param message
-	 * @param exception
-	 */
-	public static void logException(String message, Throwable exception) {
-		_log(ERROR, message, exception);
-	}
-
-	/**
-	 * @param exception
-	 */
-	public static void logException(Throwable exception) {
-		_log(ERROR, exception.getMessage(), exception);
-	}
-
-	/**
-	 * @param category
-	 * @param message
-	 * @param exception
-	 */
-	public static void traceException(String category, String message, Throwable exception) {
-		_trace(category, message, exception);
-	}
-
-	/**
-	 * @param category
-	 * @param exception
-	 */
-	public static void traceException(String category, Throwable exception) {
-		_trace(category, exception.getMessage(), exception);
-	}
-
-	/**
-	 * @param category
-	 * @param message
-	 */
-	public static void trace(String category, String message) {
-		_trace(category, message, null);
-	}
-
-	private static Plugin getFacesPlugin() {
-		return FacesConfigPlugin.getPlugin();
-	}
-
-	private static Plugin getPlugin() {
-
-		if (fPlugin == null) {
-			fPlugin = getFacesPlugin();
-		}
-		return fPlugin;
-	}
-
-	/**
-	 * @return the plugin id
-	 */
-	private static String getPluginId() {
-
-		if (fPluginId == null) {
-			fPluginId = ((Plugin) (FacesConfigPlugin.getPlugin())).getBundle().getSymbolicName() ;
-		}
-		return fPluginId;
-	}
-	
-	private static final void doConsole(String message, Throwable throwable) {
-		if (displayToConsole) {
-			PrintStream out = System.out;
-			out.println(message);
-			if (throwable != null)
-				throwable.printStackTrace(out);
-		}
-	}
-	
-	private static final void doTrace(String category, Object source, String message) {
-		message = getMessageFor(source, message);
-		try {
-			_trace(category, message, null);
-		} catch (Exception ignored) {
-			// Empty block intended.
-		} finally {
-			doConsole(message, null);
-		}
-	}
-	
-	/**
-	 * @param category
-	 * @param source
-	 * @param message
-	 */
-	public static void trace(String category, Object source, String message) {
-		doTrace(category, source, message);
-	}
-
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/nls/Messages.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/nls/Messages.java
deleted file mode 100644
index b5897e3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/nls/Messages.java
+++ /dev/null
@@ -1,1408 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.nls;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * @author cbateman
- *
- */
-public final class Messages extends NLS {
-
-	private static final String BUNDLE_NAME = "org.eclipse.jst.jsf.facesconfig.internal.nls.messages";//$NON-NLS-1$
-
-	private Messages() {
-		// Do not instantiate
-	}
-
-	/**
-	 * see messages.properties
-	 */
-	public static String Source_UI_;
-	/**
-	 * see messages.properties
-	 */
-	public static String FaceConfigEditor_Title;
-	/**
-	 * see messages.properties
-	 */
-	public static String Overview_Page_Title;
-	/**
-	 * see messages.properties
-	 */
-	public static String Application_Page_Title;
-	/**
-	 * see messages.properties
-	 */
-	public static String Factory_Page_Title;
-	/**
-	 * see messages.properties
-	 */
-	public static String Component_Page_Title;
-	/**
-	 * see messages.properties
-	 */
-	public static String Converter_Page_Title;
-	/**
-	 * see messages.properties
-	 */
-	public static String ManagedBean_Page_Title;
-	/**
-	 * see messages.properties
-	 */
-	public static String NavigationRule_Page_Title;
-	/**
-	 * see messages.properties
-	 */
-	public static String ReferencedBean_Page_Title;
-	/**
-	 * see messages.properties
-	 */
-	public static String RenderKit_Page_Title;
-	/**
-	 * see messages.properties
-	 */
-	public static String Lifecycle_Page_Title;
-	/**
-	 * see messages.properties
-	 */
-	public static String Validator_Page_Title;
-	/**
-	 * see messages.properties
-	 */
-	public static String MANAGEDBEAN_MAIN_SEC_TITLE;
-	/**
-	 * see messages.properties
-	 */
-	public static String MANAGEDBEAN_MAIN_SEC_DESC;
-	/**
-	 * see messages.properties
-	 */
-	public static String Invalid_Config_File;
-	/**
-	 * see messages.properties
-	 */
-	public static String OPEN_TO_FACESCONFIG_SOURCE_PAGE_MENU_LABEL;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_CreateChild_text;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_CreateChild_text2;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_CreateChild_tooltip;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_CreateChild_description;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_CreateSibling_description;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_PropertyDescriptor_description;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ActionListenerType_type;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ApplicationFactoryType_type;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ApplicationType_type;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_AttributeExtensionType_type;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_AttributeNameType_type;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_AttributeType_type;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ComponentClassType_type;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ComponentExtensionType_type;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ComponentType_type;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ComponentTypeType_type;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ConverterType_type;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DefaultLocaleType_type;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DescriptionType_type;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DisplayNameType_type;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DocumentRoot_type;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_FacesConfigType_type;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_FacesContextFactoryType_type;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_FactoryType_type;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_IconType_type;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_LifecycleFactoryType_type;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_LifecycleType_type;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ListEntriesType_type;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_LocaleConfigType_type;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ManagedBeanType_type;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ManagedPropertyType_type;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_MapEntriesType_type;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_MapEntryType_type;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_MessageBundleType_type;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_NavigationCaseType_type;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_NavigationHandlerType_type;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_NavigationRuleType_type;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_NullValueType_type;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_PhaseListenerType_type;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_PropertyExtensionType_type;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_PropertyResolverType_type;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_PropertyType_type;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_RedirectType_type;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ReferencedBeanType_type;
-	/**
-	 * see messages.properties
-	 */
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_RendererExtensionType_type;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_RendererType_type;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_RenderKitFactoryType_type;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_RenderKitType_type;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_StateManagerType_type;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_SupportedComponentClassType_type;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_SupportedComponentTypeType_type;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_SupportedLocaleType_type;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ValidatorType_type;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ValueType_type;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_VariableResolverType_type;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ViewHandlerType_type;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_Unknown_type;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ActionListenerType_value_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ActionListenerType_id_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ApplicationFactoryType_value_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ApplicationFactoryType_id_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ApplicationType_actionListener_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ApplicationType_messageBundle_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ApplicationType_navigationHandler_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ApplicationType_viewHandler_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ApplicationType_stateManager_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ApplicationType_propertyResolver_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ApplicationType_variableResolver_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ApplicationType_localeConfig_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ApplicationType_id_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_AttributeExtensionType_mixed_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_AttributeExtensionType_group_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_AttributeExtensionType_any_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_AttributeExtensionType_id_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_AttributeNameType_value_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_AttributeNameType_id_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_AttributeType_description_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_AttributeType_displayName_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_AttributeType_icon_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_AttributeType_attributeName_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_AttributeType_attributeExtension_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_AttributeType_attributeClass_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_AttributeType_defaultValue_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_AttributeType_id_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_AttributeType_suggestedValue_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ComponentClassType_value_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ComponentClassType_id_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ComponentExtensionType_mixed_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ComponentExtensionType_group_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ComponentExtensionType_any_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ComponentExtensionType_id_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ComponentType_description_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ComponentType_displayName_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ComponentType_icon_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ComponentType_componentType_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ComponentType_componentClass_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ComponentType_attribute_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ComponentType_property_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ComponentType_componentExtension_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ComponentType_id_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ComponentTypeType_value_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ComponentTypeType_id_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ConverterType_description_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ConverterType_displayName_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ConverterType_icon_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ConverterType_attribute_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ConverterType_property_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ConverterType_converterClass_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ConverterType_converterForClass_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ConverterType_converterId_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ConverterType_id_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DefaultLocaleType_value_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DefaultLocaleType_id_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DescriptionType_value_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DescriptionType_id_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DescriptionType_lang_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DisplayNameType_value_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DisplayNameType_id_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DisplayNameType_lang_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DocumentRoot_mixed_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DocumentRoot_xMLNSPrefixMap_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DocumentRoot_xSISchemaLocation_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DocumentRoot_actionListener_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DocumentRoot_application_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DocumentRoot_applicationFactory_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DocumentRoot_attribute_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DocumentRoot_attributeExtension_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DocumentRoot_attributeName_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DocumentRoot_component_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DocumentRoot_componentClass_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DocumentRoot_componentExtension_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DocumentRoot_componentType_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DocumentRoot_converter_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DocumentRoot_defaultLocale_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DocumentRoot_description_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DocumentRoot_displayName_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DocumentRoot_facesConfig_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DocumentRoot_facesContextFactory_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DocumentRoot_factory_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DocumentRoot_icon_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DocumentRoot_lifecycle_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DocumentRoot_lifecycleFactory_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DocumentRoot_listEntries_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DocumentRoot_localeConfig_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DocumentRoot_managedBean_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DocumentRoot_managedProperty_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DocumentRoot_mapEntries_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DocumentRoot_mapEntry_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DocumentRoot_messageBundle_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DocumentRoot_navigationCase_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DocumentRoot_navigationHandler_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DocumentRoot_navigationRule_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DocumentRoot_nullValue_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DocumentRoot_phaseListener_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DocumentRoot_property_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DocumentRoot_propertyExtension_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DocumentRoot_propertyResolver_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DocumentRoot_redirect_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DocumentRoot_referencedBean_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DocumentRoot_renderer_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DocumentRoot_rendererExtension_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DocumentRoot_renderKit_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DocumentRoot_renderKitFactory_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DocumentRoot_stateManager_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DocumentRoot_supportedComponentClass_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DocumentRoot_supportedComponentType_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DocumentRoot_supportedLocale_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DocumentRoot_validator_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DocumentRoot_value_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DocumentRoot_variableResolver_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DocumentRoot_viewHandler_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_FacesConfigType_application_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_FacesConfigType_factory_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_FacesConfigType_component_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_FacesConfigType_converter_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_FacesConfigType_managedBean_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_FacesConfigType_navigationRule_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_FacesConfigType_referencedBean_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_FacesConfigType_renderKit_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_FacesConfigType_lifecycle_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_FacesConfigType_validator_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_FacesConfigType_id_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_FacesConfigType_xmlns00000_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_FacesContextFactoryType_value_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_FacesContextFactoryType_id_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_FactoryType_applicationFactory_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_FactoryType_facesContextFactory_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_FactoryType_lifecycleFactory_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_FactoryType_renderKitFactory_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_FactoryType_id_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_IconType_id_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_IconType_lang_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_IconType_largeIcon_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_IconType_smallIcon_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_LifecycleFactoryType_value_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_LifecycleFactoryType_id_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_LifecycleType_phaseListener_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_LifecycleType_id_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ListEntriesType_nullValue_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ListEntriesType_value_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ListEntriesType_id_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ListEntriesType_valueClass_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_LocaleConfigType_defaultLocale_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_LocaleConfigType_supportedLocale_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_LocaleConfigType_id_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ManagedBeanType_description_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ManagedBeanType_displayName_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ManagedBeanType_icon_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ManagedBeanType_managedProperty_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ManagedBeanType_mapEntries_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ManagedBeanType_listEntries_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ManagedBeanType_id_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ManagedBeanType_managedBeanClass_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ManagedBeanType_managedBeanName_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ManagedBeanType_managedBeanScope_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ManagedPropertyType_description_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ManagedPropertyType_displayName_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ManagedPropertyType_icon_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ManagedPropertyType_mapEntries_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ManagedPropertyType_listEntries_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ManagedPropertyType_id_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ManagedPropertyType_nullValue_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ManagedPropertyType_propertyClass_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ManagedPropertyType_propertyName_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ManagedPropertyType_value_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_MapEntriesType_mapEntry_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_MapEntriesType_id_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_MapEntriesType_keyClass_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_MapEntriesType_valueClass_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_MapEntryType_id_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_MapEntryType_key_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_MapEntryType_nullValue_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_MapEntryType_value_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_MessageBundleType_value_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_MessageBundleType_id_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_NavigationCaseType_description_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_NavigationCaseType_displayName_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_NavigationCaseType_icon_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_NavigationCaseType_redirect_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_NavigationCaseType_fromAction_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_NavigationCaseType_fromOutcome_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_NavigationCaseType_id_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_NavigationCaseType_toViewId_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_NavigationHandlerType_value_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_NavigationHandlerType_id_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_NavigationRuleType_description_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_NavigationRuleType_displayName_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_NavigationRuleType_icon_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_NavigationRuleType_navigationCase_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_NavigationRuleType_fromViewId_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_NavigationRuleType_id_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_NullValueType_id_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_PhaseListenerType_value_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_PhaseListenerType_id_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_PropertyExtensionType_mixed_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_PropertyExtensionType_group_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_PropertyExtensionType_any_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_PropertyExtensionType_id_feature;
-	/**
-	 * see messages.properties
-	 */
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_PropertyResolverType_value_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_PropertyResolverType_id_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_PropertyType_description_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_PropertyType_displayName_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_PropertyType_icon_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_PropertyType_propertyExtension_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_PropertyType_defaultValue_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_PropertyType_id_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_PropertyType_propertyClass_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_PropertyType_propertyName_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_PropertyType_suggestedValue_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_RedirectType_id_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ReferencedBeanType_description_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ReferencedBeanType_displayName_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ReferencedBeanType_icon_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ReferencedBeanType_id_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ReferencedBeanType_referencedBeanClass_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ReferencedBeanType_referencedBeanName_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_RendererExtensionType_mixed_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_RendererExtensionType_group_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_RendererExtensionType_any_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_RendererExtensionType_id_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_RendererType_description_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_RendererType_displayName_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_RendererType_icon_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_RendererType_attribute_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_RendererType_supportedComponentType_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_RendererType_supportedComponentClass_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_RendererType_rendererExtension_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_RendererType_id_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_RendererType_rendererClass_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_RendererType_rendererType_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_RenderKitFactoryType_value_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_RenderKitFactoryType_id_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_RenderKitType_description_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_RenderKitType_displayName_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_RenderKitType_icon_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_RenderKitType_renderer_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_RenderKitType_id_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_RenderKitType_renderKitClass_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_RenderKitType_renderKitId_feature;
-	/**
-	 * see messages.properties
-	 */
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_StateManagerType_value_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_StateManagerType_id_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_SupportedComponentClassType_componentClass_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_SupportedComponentClassType_attributeName_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_SupportedComponentClassType_id_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_SupportedComponentTypeType_componentType_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_SupportedComponentTypeType_attributeName_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_SupportedComponentTypeType_id_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_SupportedLocaleType_value_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_SupportedLocaleType_id_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ValidatorType_description_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ValidatorType_displayName_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ValidatorType_icon_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ValidatorType_attribute_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ValidatorType_property_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ValidatorType_id_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ValidatorType_validatorClass_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ValidatorType_validatorId_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ValueType_value_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ValueType_id_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_VariableResolverType_value_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_VariableResolverType_id_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ViewHandlerType_value_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ViewHandlerType_id_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_Unknown_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String scValidation_duplicate_definition;
-
-	static {
-		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-	}
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/nls/messages.properties b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/nls/messages.properties
deleted file mode 100644
index 7353707..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/nls/messages.properties
+++ /dev/null
@@ -1,369 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-#/***************************************************************************************************
-# * Copyright (c) 2005, 2006 IBM Corporation and others. 
-# * All rights reserved. This program and the accompanying materials 
-# * are made available under the terms of the Eclipse Public License v1.0
-# * which accompanies this distribution, and is available at
-# * http://www.eclipse.org/legal/epl-v10.html
-# * 
-# * Contributors: 
-# *   IBM Corporation - initial API and implementation
-# **************************************************************************************************/
-Source_UI_ = XML Source
-FaceConfigEditor_Title=Faces Configuration File Editor
-
-Overview_Page_Title=Overview
-Application_Page_Title=Application
-Factory_Page_Title=Factory
-Component_Page_Title=Components
-Converter_Page_Title=Converter
-ManagedBean_Page_Title=Managed Beans
-NavigationRule_Page_Title=Navigation Rules
-ReferencedBean_Page_Title=Referenced Beans
-RenderKit_Page_Title=RenderKits
-Lifecycle_Page_Title=Lifecycle
-Validator_Page_Title=Validator
-
-MANAGEDBEAN_MAIN_SEC_TITLE=Managed Beans
-MANAGEDBEAN_MAIN_SEC_DESC=The following Managed Beans are defined for this config file
-Invalid_Config_File = The Faces Configuration File editor cannot open the file because it is not a valid Faces configuration file.  The XML editor will be opened.
-OPEN_TO_FACESCONFIG_SOURCE_PAGE_MENU_LABEL=Faces Configuration File Editor Source Page
-
-_UI_CreateChild_text = {0}
-_UI_CreateChild_text2 = {1} {0}
-_UI_CreateChild_tooltip = Create New {0} Under {1} Feature
-_UI_CreateChild_description = Create a new child of type {0} for the {1} feature of the selected {2}.
-_UI_CreateSibling_description = Create a new sibling of type {0} for the selected {2}, under the {1} feature of their parent.
-
-_UI_PropertyDescriptor_description = The {0} of the {1}
-
-_UI_ActionListenerType_type = Action Listener Type
-_UI_ApplicationFactoryType_type = Application Factory Type
-_UI_ApplicationType_type = Application Type
-_UI_AttributeExtensionType_type = Attribute Extension Type
-_UI_AttributeNameType_type = Attribute Name Type
-_UI_AttributeType_type = Attribute Type
-_UI_ComponentClassType_type = Component Class Type
-_UI_ComponentExtensionType_type = Component Extension Type
-_UI_ComponentType_type = Component Type
-_UI_ComponentTypeType_type = Component Type Type
-_UI_ConverterType_type = Converter Type
-_UI_DefaultLocaleType_type = Default Locale Type
-_UI_DescriptionType_type = Description Type
-_UI_DisplayNameType_type = Display Name Type
-_UI_DocumentRoot_type = Document Root
-_UI_FacesConfigType_type = Type
-_UI_FacesContextFactoryType_type = Faces Context Factory Type
-_UI_FactoryType_type = Factory Type
-_UI_IconType_type = Icon Type
-_UI_LifecycleFactoryType_type = Lifecycle Factory Type
-_UI_LifecycleType_type = Lifecycle Type
-_UI_ListEntriesType_type = List Entries Type
-_UI_LocaleConfigType_type = Locale Config Type
-_UI_ManagedBeanType_type = Managed Bean Type
-_UI_ManagedPropertyType_type = Managed Property Type
-_UI_MapEntriesType_type = Map Entries Type
-_UI_MapEntryType_type = Map Entry Type
-_UI_MessageBundleType_type = Message Bundle Type
-_UI_NavigationCaseType_type = Navigation Case Type
-_UI_NavigationHandlerType_type = Navigation Handler Type
-_UI_NavigationRuleType_type = Navigation Rule Type
-_UI_NullValueType_type = Null Value Type
-_UI_PhaseListenerType_type = Phase Listener Type
-_UI_PropertyExtensionType_type = Property Extension Type
-_UI_PropertyResolverType_type = Property Resolver Type
-_UI_PropertyType_type = Property Type
-_UI_RedirectType_type = Redirect Type
-_UI_ReferencedBeanType_type = Referenced Bean Type
-_UI_RendererExtensionType_type = Renderer Extension Type
-_UI_RendererType_type = Renderer Type
-_UI_RenderKitFactoryType_type = Render Kit Factory Type
-_UI_RenderKitType_type = Render Kit Type
-_UI_StateManagerType_type = State Manager Type
-_UI_SupportedComponentClassType_type = Supported Component Class Type
-_UI_SupportedComponentTypeType_type = Supported Component Type Type
-_UI_SupportedLocaleType_type = Supported Locale Type
-_UI_ValidatorType_type = Validator Type
-_UI_ValueType_type = Value Type
-_UI_VariableResolverType_type = Variable Resolver Type
-_UI_ViewHandlerType_type = View Handler Type
-_UI_Unknown_type = Object
-
-_UI_ActionListenerType_value_feature = Value
-_UI_ActionListenerType_id_feature = Id
-_UI_ApplicationFactoryType_value_feature = Value
-_UI_ApplicationFactoryType_id_feature = Id
-_UI_ApplicationType_actionListener_feature = Action Listener
-_UI_ApplicationType_messageBundle_feature = Message Bundle
-_UI_ApplicationType_navigationHandler_feature = Navigation Handler
-_UI_ApplicationType_viewHandler_feature = View Handler
-_UI_ApplicationType_stateManager_feature = State Manager
-_UI_ApplicationType_propertyResolver_feature = Property Resolver
-_UI_ApplicationType_variableResolver_feature = Variable Resolver
-_UI_ApplicationType_localeConfig_feature = Locale Config
-_UI_ApplicationType_id_feature = Id
-_UI_AttributeExtensionType_mixed_feature = Mixed
-_UI_AttributeExtensionType_group_feature = Group
-_UI_AttributeExtensionType_any_feature = Any
-_UI_AttributeExtensionType_id_feature = Id
-_UI_AttributeNameType_value_feature = Value
-_UI_AttributeNameType_id_feature = Id
-_UI_AttributeType_description_feature = Description
-_UI_AttributeType_displayName_feature = Display Name
-_UI_AttributeType_icon_feature = Icon
-_UI_AttributeType_attributeName_feature = Attribute Name
-_UI_AttributeType_attributeExtension_feature = Attribute Extension
-_UI_AttributeType_attributeClass_feature = Attribute Class
-_UI_AttributeType_defaultValue_feature = Default Value
-_UI_AttributeType_id_feature = Id
-_UI_AttributeType_suggestedValue_feature = Suggested Value
-_UI_ComponentClassType_value_feature = Value
-_UI_ComponentClassType_id_feature = Id
-_UI_ComponentExtensionType_mixed_feature = Mixed
-_UI_ComponentExtensionType_group_feature = Group
-_UI_ComponentExtensionType_any_feature = Any
-_UI_ComponentExtensionType_id_feature = Id
-_UI_ComponentType_description_feature = Description
-_UI_ComponentType_displayName_feature = Display Name
-_UI_ComponentType_icon_feature = Icon
-_UI_ComponentType_componentType_feature = Component Type
-_UI_ComponentType_componentClass_feature = Component Class
-_UI_ComponentType_attribute_feature = Attribute
-_UI_ComponentType_property_feature = Property
-_UI_ComponentType_componentExtension_feature = Component Extension
-_UI_ComponentType_id_feature = Id
-_UI_ComponentTypeType_value_feature = Value
-_UI_ComponentTypeType_id_feature = Id
-_UI_ConverterType_description_feature = Description
-_UI_ConverterType_displayName_feature = Display Name
-_UI_ConverterType_icon_feature = Icon
-_UI_ConverterType_attribute_feature = Attribute
-_UI_ConverterType_property_feature = Property
-_UI_ConverterType_converterClass_feature = Converter Class
-_UI_ConverterType_converterForClass_feature = Converter For Class
-_UI_ConverterType_converterId_feature = Converter Id
-_UI_ConverterType_id_feature = Id
-_UI_DefaultLocaleType_value_feature = Value
-_UI_DefaultLocaleType_id_feature = Id
-_UI_DescriptionType_value_feature = Value
-_UI_DescriptionType_id_feature = Id
-_UI_DescriptionType_lang_feature = Lang
-_UI_DisplayNameType_value_feature = Value
-_UI_DisplayNameType_id_feature = Id
-_UI_DisplayNameType_lang_feature = Lang
-_UI_DocumentRoot_mixed_feature = Mixed
-_UI_DocumentRoot_xMLNSPrefixMap_feature = XMLNS Prefix Map
-_UI_DocumentRoot_xSISchemaLocation_feature = XSI Schema Location
-_UI_DocumentRoot_actionListener_feature = Action Listener
-_UI_DocumentRoot_application_feature = Application
-_UI_DocumentRoot_applicationFactory_feature = Application Factory
-_UI_DocumentRoot_attribute_feature = Attribute
-_UI_DocumentRoot_attributeExtension_feature = Attribute Extension
-_UI_DocumentRoot_attributeName_feature = Attribute Name
-_UI_DocumentRoot_component_feature = Component
-_UI_DocumentRoot_componentClass_feature = Component Class
-_UI_DocumentRoot_componentExtension_feature = Component Extension
-_UI_DocumentRoot_componentType_feature = Component Type
-_UI_DocumentRoot_converter_feature = Converter
-_UI_DocumentRoot_defaultLocale_feature = Default Locale
-_UI_DocumentRoot_description_feature = Description
-_UI_DocumentRoot_displayName_feature = Display Name
-_UI_DocumentRoot_facesConfig_feature = Faces Config
-_UI_DocumentRoot_facesContextFactory_feature = Faces Context Factory
-_UI_DocumentRoot_factory_feature = Factory
-_UI_DocumentRoot_icon_feature = Icon
-_UI_DocumentRoot_lifecycle_feature = Lifecycle
-_UI_DocumentRoot_lifecycleFactory_feature = Lifecycle Factory
-_UI_DocumentRoot_listEntries_feature = List Entries
-_UI_DocumentRoot_localeConfig_feature = Locale Config
-_UI_DocumentRoot_managedBean_feature = Managed Bean
-_UI_DocumentRoot_managedProperty_feature = Managed Property
-_UI_DocumentRoot_mapEntries_feature = Map Entries
-_UI_DocumentRoot_mapEntry_feature = Map Entry
-_UI_DocumentRoot_messageBundle_feature = Message Bundle
-_UI_DocumentRoot_navigationCase_feature = Navigation Case
-_UI_DocumentRoot_navigationHandler_feature = Navigation Handler
-_UI_DocumentRoot_navigationRule_feature = Navigation Rule
-_UI_DocumentRoot_nullValue_feature = Null Value
-_UI_DocumentRoot_phaseListener_feature = Phase Listener
-_UI_DocumentRoot_property_feature = Property
-_UI_DocumentRoot_propertyExtension_feature = Property Extension
-_UI_DocumentRoot_propertyResolver_feature = Property Resolver
-_UI_DocumentRoot_redirect_feature = Redirect
-_UI_DocumentRoot_referencedBean_feature = Referenced Bean
-_UI_DocumentRoot_renderer_feature = Renderer
-_UI_DocumentRoot_rendererExtension_feature = Renderer Extension
-_UI_DocumentRoot_renderKit_feature = Render Kit
-_UI_DocumentRoot_renderKitFactory_feature = Render Kit Factory
-_UI_DocumentRoot_stateManager_feature = State Manager
-_UI_DocumentRoot_supportedComponentClass_feature = Supported Component Class
-_UI_DocumentRoot_supportedComponentType_feature = Supported Component Type
-_UI_DocumentRoot_supportedLocale_feature = Supported Locale
-_UI_DocumentRoot_validator_feature = Validator
-_UI_DocumentRoot_value_feature = Value
-_UI_DocumentRoot_variableResolver_feature = Variable Resolver
-_UI_DocumentRoot_viewHandler_feature = View Handler
-_UI_FacesConfigType_application_feature = Application
-_UI_FacesConfigType_factory_feature = Factory
-_UI_FacesConfigType_component_feature = Component
-_UI_FacesConfigType_converter_feature = Converter
-_UI_FacesConfigType_managedBean_feature = Managed Bean
-_UI_FacesConfigType_navigationRule_feature = Navigation Rule
-_UI_FacesConfigType_referencedBean_feature = Referenced Bean
-_UI_FacesConfigType_renderKit_feature = Render Kit
-_UI_FacesConfigType_lifecycle_feature = Lifecycle
-_UI_FacesConfigType_validator_feature = Validator
-_UI_FacesConfigType_id_feature = Id
-_UI_FacesConfigType_xmlns00000_feature = Xmlns00000
-_UI_FacesContextFactoryType_value_feature = Value
-_UI_FacesContextFactoryType_id_feature = Id
-_UI_FactoryType_applicationFactory_feature = Application Factory
-_UI_FactoryType_facesContextFactory_feature = Faces Context Factory
-_UI_FactoryType_lifecycleFactory_feature = Lifecycle Factory
-_UI_FactoryType_renderKitFactory_feature = Render Kit Factory
-_UI_FactoryType_id_feature = Id
-_UI_IconType_id_feature = Id
-_UI_IconType_lang_feature = Lang
-_UI_IconType_largeIcon_feature = Large Icon
-_UI_IconType_smallIcon_feature = Small Icon
-_UI_LifecycleFactoryType_value_feature = Value
-_UI_LifecycleFactoryType_id_feature = Id
-_UI_LifecycleType_phaseListener_feature = Phase Listener
-_UI_LifecycleType_id_feature = Id
-_UI_ListEntriesType_nullValue_feature = Null Value
-_UI_ListEntriesType_value_feature = Value
-_UI_ListEntriesType_id_feature = Id
-_UI_ListEntriesType_valueClass_feature = Value Class
-_UI_LocaleConfigType_defaultLocale_feature = Default Locale
-_UI_LocaleConfigType_supportedLocale_feature = Supported Locale
-_UI_LocaleConfigType_id_feature = Id
-_UI_ManagedBeanType_description_feature = Description
-_UI_ManagedBeanType_displayName_feature = Display Name
-_UI_ManagedBeanType_icon_feature = Icon
-_UI_ManagedBeanType_managedProperty_feature = Managed Property
-_UI_ManagedBeanType_mapEntries_feature = Map Entries
-_UI_ManagedBeanType_listEntries_feature = List Entries
-_UI_ManagedBeanType_id_feature = Id
-_UI_ManagedBeanType_managedBeanClass_feature = Managed Bean Class
-_UI_ManagedBeanType_managedBeanName_feature = Managed Bean Name
-_UI_ManagedBeanType_managedBeanScope_feature = Managed Bean Scope
-_UI_ManagedPropertyType_description_feature = Description
-_UI_ManagedPropertyType_displayName_feature = Display Name
-_UI_ManagedPropertyType_icon_feature = Icon
-_UI_ManagedPropertyType_mapEntries_feature = Map Entries
-_UI_ManagedPropertyType_listEntries_feature = List Entries
-_UI_ManagedPropertyType_id_feature = Id
-_UI_ManagedPropertyType_nullValue_feature = Null Value
-_UI_ManagedPropertyType_propertyClass_feature = Property Class
-_UI_ManagedPropertyType_propertyName_feature = Property Name
-_UI_ManagedPropertyType_value_feature = Value
-_UI_MapEntriesType_mapEntry_feature = Map Entry
-_UI_MapEntriesType_id_feature = Id
-_UI_MapEntriesType_keyClass_feature = Key Class
-_UI_MapEntriesType_valueClass_feature = Value Class
-_UI_MapEntryType_id_feature = Id
-_UI_MapEntryType_key_feature = Key
-_UI_MapEntryType_nullValue_feature = Null Value
-_UI_MapEntryType_value_feature = Value
-_UI_MessageBundleType_value_feature = Value
-_UI_MessageBundleType_id_feature = Id
-_UI_NavigationCaseType_description_feature = Description
-_UI_NavigationCaseType_displayName_feature = Display Name
-_UI_NavigationCaseType_icon_feature = Icon
-_UI_NavigationCaseType_redirect_feature = Redirect
-_UI_NavigationCaseType_fromAction_feature = From Action
-_UI_NavigationCaseType_fromOutcome_feature = From Outcome
-_UI_NavigationCaseType_id_feature = Id
-_UI_NavigationCaseType_toViewId_feature = To View Id
-_UI_NavigationHandlerType_value_feature = Value
-_UI_NavigationHandlerType_id_feature = Id
-_UI_NavigationRuleType_description_feature = Description
-_UI_NavigationRuleType_displayName_feature = Display Name
-_UI_NavigationRuleType_icon_feature = Icon
-_UI_NavigationRuleType_navigationCase_feature = Navigation Case
-_UI_NavigationRuleType_fromViewId_feature = From View Id
-_UI_NavigationRuleType_id_feature = Id
-_UI_NullValueType_id_feature = Id
-_UI_PhaseListenerType_value_feature = Value
-_UI_PhaseListenerType_id_feature = Id
-_UI_PropertyExtensionType_mixed_feature = Mixed
-_UI_PropertyExtensionType_group_feature = Group
-_UI_PropertyExtensionType_any_feature = Any
-_UI_PropertyExtensionType_id_feature = Id
-_UI_PropertyResolverType_value_feature = Value
-_UI_PropertyResolverType_id_feature = Id
-_UI_PropertyType_description_feature = Description
-_UI_PropertyType_displayName_feature = Display Name
-_UI_PropertyType_icon_feature = Icon
-_UI_PropertyType_propertyExtension_feature = Property Extension
-_UI_PropertyType_defaultValue_feature = Default Value
-_UI_PropertyType_id_feature = Id
-_UI_PropertyType_propertyClass_feature = Property Class
-_UI_PropertyType_propertyName_feature = Property Name
-_UI_PropertyType_suggestedValue_feature = Suggested Value
-_UI_RedirectType_id_feature = Id
-_UI_ReferencedBeanType_description_feature = Description
-_UI_ReferencedBeanType_displayName_feature = Display Name
-_UI_ReferencedBeanType_icon_feature = Icon
-_UI_ReferencedBeanType_id_feature = Id
-_UI_ReferencedBeanType_referencedBeanClass_feature = Referenced Bean Class
-_UI_ReferencedBeanType_referencedBeanName_feature = Referenced Bean Name
-_UI_RendererExtensionType_mixed_feature = Mixed
-_UI_RendererExtensionType_group_feature = Group
-_UI_RendererExtensionType_any_feature = Any
-_UI_RendererExtensionType_id_feature = Id
-_UI_RendererType_description_feature = Description
-_UI_RendererType_displayName_feature = Display Name
-_UI_RendererType_icon_feature = Icon
-_UI_RendererType_attribute_feature = Attribute
-_UI_RendererType_supportedComponentType_feature = Supported Component Type
-_UI_RendererType_supportedComponentClass_feature = Supported Component Class
-_UI_RendererType_rendererExtension_feature = Renderer Extension
-_UI_RendererType_id_feature = Id
-_UI_RendererType_rendererClass_feature = Renderer Class
-_UI_RendererType_rendererType_feature = Renderer Type
-_UI_RenderKitFactoryType_value_feature = Value
-_UI_RenderKitFactoryType_id_feature = Id
-_UI_RenderKitType_description_feature = Description
-_UI_RenderKitType_displayName_feature = Display Name
-_UI_RenderKitType_icon_feature = Icon
-_UI_RenderKitType_renderer_feature = Renderer
-_UI_RenderKitType_id_feature = Id
-_UI_RenderKitType_renderKitClass_feature = Render Kit Class
-_UI_RenderKitType_renderKitId_feature = Render Kit Id
-_UI_StateManagerType_value_feature = Value
-_UI_StateManagerType_id_feature = Id
-_UI_SupportedComponentClassType_componentClass_feature = Component Class
-_UI_SupportedComponentClassType_attributeName_feature = Attribute Name
-_UI_SupportedComponentClassType_id_feature = Id
-_UI_SupportedComponentTypeType_componentType_feature = Component Type
-_UI_SupportedComponentTypeType_attributeName_feature = Attribute Name
-_UI_SupportedComponentTypeType_id_feature = Id
-_UI_SupportedLocaleType_value_feature = Value
-_UI_SupportedLocaleType_id_feature = Id
-_UI_ValidatorType_description_feature = Description
-_UI_ValidatorType_displayName_feature = Display Name
-_UI_ValidatorType_icon_feature = Icon
-_UI_ValidatorType_attribute_feature = Attribute
-_UI_ValidatorType_property_feature = Property
-_UI_ValidatorType_id_feature = Id
-_UI_ValidatorType_validatorClass_feature = Validator Class
-_UI_ValidatorType_validatorId_feature = Validator Id
-_UI_ValueType_value_feature = Value
-_UI_ValueType_id_feature = Id
-_UI_VariableResolverType_value_feature = Value
-_UI_VariableResolverType_id_feature = Id
-_UI_ViewHandlerType_value_feature = Value
-_UI_ViewHandlerType_id_feature = Id
-_UI_Unknown_feature = Unspecified
-
-scValidation_duplicate_definition=Duplicate {0} {1}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/AbsoluteOrderingTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/AbsoluteOrderingTranslator.java
deleted file mode 100644
index 9b0475f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/AbsoluteOrderingTranslator.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - added id attribute
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xnjiang, itrimble
- *
- */
-public class AbsoluteOrderingTranslator extends Translator {
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public AbsoluteOrderingTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-				new NameTranslator("name", facesPackage.getAbsoluteOrderingType_Name()), //$NON-NLS-1$
-				new OrderingOthersTranslator("others", facesPackage.getAbsoluteOrderingType_Others()) //$NON-NLS-1$
-//				new Translator("id", facesPackage.getAbsoluteOrderingType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ActionListenerTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ActionListenerTranslator.java
deleted file mode 100644
index a1e0617..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ActionListenerTranslator.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xnjiang
- *
- */
-public class ActionListenerTranslator extends Translator {
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public ActionListenerTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/*  (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getActionListenerType_TextContent()),
-			new Translator("id", facesPackage.getActionListenerType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ApplicationExtensionTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ApplicationExtensionTranslator.java
deleted file mode 100644
index 5fa3beb..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ApplicationExtensionTranslator.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-
-/**
- * Transtor for application extensions
- * 
- * @author cbateman
- *
- */
-public class ApplicationExtensionTranslator extends ExtensionTypeTranslator {
-
-    /**
-     * @param domNameAndPath
-     * @param feature
-     */
-    public ApplicationExtensionTranslator(String domNameAndPath,
-            EStructuralFeature feature) {
-        super(domNameAndPath, feature);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ApplicationFactoryTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ApplicationFactoryTranslator.java
deleted file mode 100644
index 333ac00..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ApplicationFactoryTranslator.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xnjiang
- *
- */
-public class ApplicationFactoryTranslator extends Translator {
-	/**
-	 * @param domNameAndPath 
-	 * @param aFeature 
-	 */
-	public ApplicationFactoryTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getApplicationFactoryType_TextContent()),
-			new Translator("id", facesPackage.getApplicationFactoryType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ApplicationTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ApplicationTranslator.java
deleted file mode 100644
index 5a396ac..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ApplicationTranslator.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - added id attribute
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xnjiang, itrimble
- *
- */
-public class ApplicationTranslator extends Translator {
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public ApplicationTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-				new ActionListenerTranslator("action-listener", facesPackage.getApplicationType_ActionListener()), //$NON-NLS-1$
-				new DefaultRenderKitIdTranslator("default-render-kit-id", facesPackage.getApplicationType_DefaultRenderKitId()), //$NON-NLS-1$
-				new MessageBundleTranslator("message-bundle", facesPackage.getApplicationType_MessageBundle()), //$NON-NLS-1$
-				new NavigationHandlerTranslator("navigation-handler", facesPackage.getApplicationType_NavigationHandler()), //$NON-NLS-1$
-//				new PartialTraversalTranslator("partial-traversal", facesPackage.getApplicationType_PartialTraversal()), //$NON-NLS-1$
-				new ViewHandlerTranslator("view-handler", facesPackage.getApplicationType_ViewHandler()), //$NON-NLS-1$
-				new StateManagerTranslator("state-manager", facesPackage.getApplicationType_StateManager()), //$NON-NLS-1$
-                new ELResolverTypeTranslator("el-resolver", facesPackage.getApplicationType_ELResolver()), //$NON-NLS-1$
-				new PropertyResolverTranslator("property-resolver", facesPackage.getApplicationType_PropertyResolver()), //$NON-NLS-1$
-				new VariableResolverTranslator("variable-resolver", facesPackage.getApplicationType_VariableResolver()), //$NON-NLS-1$
-				new ResourceHandlerTranslator("resource-handler", facesPackage.getApplicationType_ResourceHandler()), //$NON-NLS-1$
-				new SystemEventListenerTranslator("system-event-listener", facesPackage.getApplicationType_SystemEventListener()), //$NON-NLS-1$
-				new LocaleConfigTranslator("locale-config", facesPackage.getApplicationType_LocaleConfig()), //$NON-NLS-1$
-                new ResourceBundleTranslator("resource-bundle", facesPackage.getApplicationType_ResourceBundle()), //$NON-NLS-1$
-                new ApplicationExtensionTranslator("application-extension", facesPackage.getApplicationType_ApplicationExtension()), //$NON-NLS-1$
-				new DefaultValidatorsTranslator("default-validators", facesPackage.getApplicationType_DefaultValidators()), //$NON-NLS-1$
-				new Translator("id", facesPackage.getApplicationType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/AttributeClassTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/AttributeClassTranslator.java
deleted file mode 100644
index fd9ca23..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/AttributeClassTranslator.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * Translator for attributes
- *
- */
-public class AttributeClassTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public AttributeClassTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getAttributeClassType_TextContent()),
-			new Translator("id", facesPackage.getAttributeClassType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/AttributeExtensionTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/AttributeExtensionTranslator.java
deleted file mode 100644
index cc99005..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/AttributeExtensionTranslator.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - added id attribute
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-
-/**
- * @author xnjiang, itrimble
- *
- */
-public class AttributeExtensionTranslator extends ExtensionTypeTranslator {
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public AttributeExtensionTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/AttributeNameTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/AttributeNameTranslator.java
deleted file mode 100644
index 71ee9f1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/AttributeNameTranslator.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * Translator for attribute names
- * 
- * @author cbateman
- *
- */
-public class AttributeNameTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public AttributeNameTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getAttributeNameType_TextContent()),
-			new Translator("id", facesPackage.getAttributeNameType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/AttributeTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/AttributeTranslator.java
deleted file mode 100644
index 3916ed1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/AttributeTranslator.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - fixed getChildren()
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xjiang, itrimble
- *
- */
-public class AttributeTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public AttributeTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new DescriptionTranslator("description", facesPackage.getAttributeType_Description()), //$NON-NLS-1$
-			new DisplayNameTranslator("display-name", facesPackage.getAttributeType_DisplayName()), //$NON-NLS-1$
-			new IconTranslator("icon", facesPackage.getAttributeType_Icon()), //$NON-NLS-1$
-			new AttributeNameTranslator("attribute-name", facesPackage.getAttributeType_AttributeName()), //$NON-NLS-1$
-			new AttributeClassTranslator("attribute-class", facesPackage.getAttributeType_AttributeClass()), //$NON-NLS-1$
-			new DefaultValueTranslator("default-value", facesPackage.getAttributeType_DefaultValue()), //$NON-NLS-1$
-			new SuggestedValueTranslator("suggested-value", facesPackage.getAttributeType_SuggestedValue()), //$NON-NLS-1$
-			new AttributeExtensionTranslator("attribute-extension", facesPackage.getAttributeType_AttributeExtension()), //$NON-NLS-1$
-			new Translator("id", facesPackage.getAttributeType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/BaseNameTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/BaseNameTranslator.java
deleted file mode 100644
index b5296cf..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/BaseNameTranslator.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * Translator for the base name on a message bundle
- * 
- * @author cbateman
- *
- */
-public class BaseNameTranslator extends Translator {
-
-    /**
-     * @param domNameAndPath
-     * @param feature
-     */
-    public BaseNameTranslator(String domNameAndPath, EStructuralFeature feature) {
-        super(domNameAndPath, feature, END_TAG_NO_INDENT);
-    }
-
-    public Translator[] getChildren()
-    {
-        FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-
-        return new Translator[] {
-            new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getBaseNameType_TextContent()),
-            new Translator("id", facesPackage.getBaseNameType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-        };
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/BehaviorClassTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/BehaviorClassTranslator.java
deleted file mode 100644
index 90bb48c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/BehaviorClassTranslator.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xnjiang
- *
- */
-public class BehaviorClassTranslator extends Translator {
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public BehaviorClassTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/*  (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getBehaviorClassType_TextContent()),
-			new Translator("id", facesPackage.getBehaviorClassType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/BehaviorExtensionTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/BehaviorExtensionTranslator.java
deleted file mode 100644
index a7d452f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/BehaviorExtensionTranslator.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-
-/**
- * Transtor for application extensions
- * 
- * @author cbateman
- *
- */
-public class BehaviorExtensionTranslator extends ExtensionTypeTranslator {
-
-    /**
-     * @param domNameAndPath
-     * @param feature
-     */
-    public BehaviorExtensionTranslator(String domNameAndPath,
-            EStructuralFeature feature) {
-        super(domNameAndPath, feature);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/BehaviorIdTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/BehaviorIdTranslator.java
deleted file mode 100644
index 8d45df5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/BehaviorIdTranslator.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * Translator for the validator id
- *
- */
-public class BehaviorIdTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public BehaviorIdTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getBehaviorIdType_TextContent()),
-			new Translator("id", facesPackage.getBehaviorIdType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/BehaviorTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/BehaviorTranslator.java
deleted file mode 100644
index c72342d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/BehaviorTranslator.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - added id attribute
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xnjiang, itrimble
- *
- */
-public class BehaviorTranslator extends Translator {
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public BehaviorTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-				new DescriptionTranslator("description", facesPackage.getBehaviorType_Description()), //$NON-NLS-1$
-				new DisplayNameTranslator("display-name", facesPackage.getBehaviorType_DisplayName()), //$NON-NLS-1$
-				new IconTranslator("icon", facesPackage.getBehaviorType_Icon()), //$NON-NLS-1$
-                new BehaviorIdTranslator("behavior-id", facesPackage.getBehaviorType_BehaviorId()), //$NON-NLS-1$
-                new BehaviorClassTranslator("behavior-class", facesPackage.getBehaviorType_BehaviorClass()), //$NON-NLS-1$
-                new AttributeTranslator("attribute", facesPackage.getBehaviorType_Attribute()), //$NON-NLS-1$
-                new PropertyTranslator("property", facesPackage.getBehaviorType_Property()), //$NON-NLS-1$
-                new BehaviorExtensionTranslator("behavior-extension", facesPackage.getBehaviorType_BehaviorExtension()) //$NON-NLS-1$
-				//new Translator("id", facesPackage.getBehaviorType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ClientBehaviorRendererClassTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ClientBehaviorRendererClassTranslator.java
deleted file mode 100644
index 2c64b67..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ClientBehaviorRendererClassTranslator.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xnjiang
- *
- */
-public class ClientBehaviorRendererClassTranslator extends Translator {
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public ClientBehaviorRendererClassTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/*  (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getClientBehaviorRendererClassType_TextContent()),
-			new Translator("id", facesPackage.getClientBehaviorRendererClassType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ClientBehaviorRendererTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ClientBehaviorRendererTranslator.java
deleted file mode 100644
index ac3279c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ClientBehaviorRendererTranslator.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xnjiang
- *
- */
-public class ClientBehaviorRendererTranslator extends Translator {
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public ClientBehaviorRendererTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/*  (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-            new ClientBehaviorRendererTypeTranslator("client-behavior-renderer-type", facesPackage.getClientBehaviorRendererType_ClientBehaviorRendererType()), //$NON-NLS-1$
-            new ClientBehaviorRendererClassTranslator("client-behavior-renderer-class", facesPackage.getClientBehaviorRendererType_ClientBehaviorRendererClass()) //$NON-NLS-1$
-			//new Translator("id", facesPackage.getClientBehaviorRendererType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ClientBehaviorRendererTypeTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ClientBehaviorRendererTypeTranslator.java
deleted file mode 100644
index 2ddd9ea..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ClientBehaviorRendererTypeTranslator.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xnjiang
- *
- */
-public class ClientBehaviorRendererTypeTranslator extends Translator {
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public ClientBehaviorRendererTypeTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/*  (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getClientBehaviorRendererTypeType_TextContent()),
-			new Translator("id", facesPackage.getClientBehaviorRendererTypeType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ComponentClassTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ComponentClassTranslator.java
deleted file mode 100644
index 1a10fd7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ComponentClassTranslator.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * Component class translator
- * 
- * @author cbateman
- *
- */
-public class ComponentClassTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public ComponentClassTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getComponentClassType_TextContent()),
-			new Translator("id", facesPackage.getComponentClassType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ComponentExtensionTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ComponentExtensionTranslator.java
deleted file mode 100644
index 759aa58..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ComponentExtensionTranslator.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - fixed getChildren()
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-
-/**
- * @author xnjiang, itrimble
- *
- */
-public class ComponentExtensionTranslator extends ExtensionTypeTranslator {
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public ComponentExtensionTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ComponentFamilyTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ComponentFamilyTranslator.java
deleted file mode 100644
index ac615d2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ComponentFamilyTranslator.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * Translator for the component family property
- * @author cbateman
- *
- */
-public class ComponentFamilyTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public ComponentFamilyTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getComponentFamilyType_TextContent()),
-			new Translator("id", facesPackage.getComponentFamilyType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ComponentTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ComponentTranslator.java
deleted file mode 100644
index 437f644..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ComponentTranslator.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - fixed getChildren()
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xjiang, itrimble
- *
- */
-public class ComponentTranslator extends Translator {
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public ComponentTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new DescriptionTranslator("description", facesPackage.getComponentType_Description()), //$NON-NLS-1$
-			new DisplayNameTranslator("display-name", facesPackage.getComponentType_DisplayName()), //$NON-NLS-1$
-			new IconTranslator("icon", facesPackage.getComponentType_Icon()), //$NON-NLS-1$
-			new ComponentTypeTranslator("component-type", facesPackage.getComponentType_ComponentType()), //$NON-NLS-1$
-			new ComponentClassTranslator("component-class", facesPackage.getComponentType_ComponentClass()), //$NON-NLS-1$
-			new FacetTranslator("facet", facesPackage.getComponentType_Facet()), //$NON-NLS-1$
-			new AttributeTranslator("attribute", facesPackage.getComponentType_Attribute()), //$NON-NLS-1$
-			new PropertyTranslator("property", facesPackage.getComponentType_Property()), //$NON-NLS-1$
-			new ComponentExtensionTranslator("component-extension", facesPackage.getComponentType_ComponentExtension()),//ComponentExtensionTranslator("component-extension", facesPackage.getComponentType_ComponentExtension()), //$NON-NLS-1$
-			new Translator("id", facesPackage.getComponentType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ComponentTypeTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ComponentTypeTranslator.java
deleted file mode 100644
index e489cbf..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ComponentTypeTranslator.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * Translater of components
- *
- */
-public class ComponentTypeTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public ComponentTypeTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getComponentTypeType_TextContent()),
-			new Translator("id", facesPackage.getComponentTypeType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ConverterClassTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ConverterClassTranslator.java
deleted file mode 100644
index c1f6221..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ConverterClassTranslator.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * Translator for converters
- *
- */
-public class ConverterClassTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public ConverterClassTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getConverterClassType_TextContent()),
-			new Translator("id", facesPackage.getConverterClassType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ConverterExtensionTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ConverterExtensionTranslator.java
deleted file mode 100644
index 66f8292..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ConverterExtensionTranslator.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-
-/**
- * Translator for extension data on converters
- * 
- * @author cbateman
- *
- */
-public class ConverterExtensionTranslator extends ExtensionTypeTranslator 
-{
-    /**
-     * @param domNameAndPath
-     * @param feature
-     */
-    public ConverterExtensionTranslator(String domNameAndPath,
-            EStructuralFeature feature) 
-    {
-        super(domNameAndPath, feature);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ConverterForClassTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ConverterForClassTranslator.java
deleted file mode 100644
index 31f603c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ConverterForClassTranslator.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * ConverterForClass translator
- *
- */
-public class ConverterForClassTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public ConverterForClassTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getConverterForClassType_TextContent()),
-			new Translator("id", facesPackage.getConverterForClassType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ConverterIdTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ConverterIdTranslator.java
deleted file mode 100644
index b0a8a19..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ConverterIdTranslator.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * Translator for converter id
- *
- */
-public class ConverterIdTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public ConverterIdTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getConverterIdType_TextContent()),
-			new Translator("id", facesPackage.getConverterIdType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ConverterTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ConverterTranslator.java
deleted file mode 100644
index 11a0c68..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ConverterTranslator.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - fixed getChildren()
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xjiang, itrimble
- *
- */
-public class ConverterTranslator extends Translator {
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public ConverterTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new DescriptionTranslator("description", facesPackage.getConverterType_Description()), //$NON-NLS-1$
-			new DisplayNameTranslator("display-name", facesPackage.getConverterType_DisplayName()), //$NON-NLS-1$
-			new IconTranslator("icon", facesPackage.getConverterType_Icon()), //$NON-NLS-1$
-			new ConverterIdTranslator("converter-id", facesPackage.getConverterType_ConverterId()), //$NON-NLS-1$
-			new ConverterForClassTranslator("converter-for-class", facesPackage.getConverterType_ConverterForClass()), //$NON-NLS-1$
-			new ConverterClassTranslator("converter-class", facesPackage.getConverterType_ConverterClass()), //$NON-NLS-1$
-			new AttributeTranslator("attribute", facesPackage.getConverterType_Attribute()), //$NON-NLS-1$
-			new PropertyTranslator("property", facesPackage.getConverterType_Property()), //$NON-NLS-1$
-            new ConverterExtensionTranslator("converter-extension", facesPackage.getConverterType_ConverterExtension()), //$NON-NLS-1$
-			new Translator("id", facesPackage.getConverterType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/DefaultLocaleTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/DefaultLocaleTranslator.java
deleted file mode 100644
index bf74445..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/DefaultLocaleTranslator.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * Translator for default locale
- *
- */
-public class DefaultLocaleTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public DefaultLocaleTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getDefaultLocaleType_TextContent()),
-			new Translator("id", facesPackage.getDefaultLocaleType_Id(), DOM_ATTRIBUTE)//$NON-NLS-1$
-		};
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/DefaultRenderKitIdTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/DefaultRenderKitIdTranslator.java
deleted file mode 100644
index bbd9307..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/DefaultRenderKitIdTranslator.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - added id attribute
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xnjiang, itrimble
- *
- */
-public class DefaultRenderKitIdTranslator extends Translator {
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public DefaultRenderKitIdTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getDefaultRenderKitIdType_TextContent()),
-			new Translator("id", facesPackage.getDefaultRenderKitIdType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/DefaultValidatorsTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/DefaultValidatorsTranslator.java
deleted file mode 100644
index de93d93..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/DefaultValidatorsTranslator.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xnjiang
- *
- */
-public class DefaultValidatorsTranslator extends Translator {
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public DefaultValidatorsTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/*  (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new ValidatorIdTranslator("validator-id", facesPackage.getDefaultValidatorsType_ValidatorId()), //$NON-NLS-1$
-			new Translator("id", facesPackage.getDefaultValidatorsType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/DefaultValueTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/DefaultValueTranslator.java
deleted file mode 100644
index cb23479..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/DefaultValueTranslator.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * Translator for default values
- *
- */
-public class DefaultValueTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public DefaultValueTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getDefaultValueType_TextContent()),
-			new Translator("id", facesPackage.getDefaultValueType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/DescriptionTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/DescriptionTranslator.java
deleted file mode 100644
index d6faf0d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/DescriptionTranslator.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - added text content and id attribute
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xjiang, itrimble
- *
- */
-public class DescriptionTranslator extends Translator {
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public DescriptionTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getDescriptionType_TextContent()),
-			new Translator("xml:lang", facesPackage.getDescriptionType_Lang(), DOM_ATTRIBUTE), //$NON-NLS-1$
-			new Translator("id", facesPackage.getDescriptionType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/DisplayNameTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/DisplayNameTranslator.java
deleted file mode 100644
index e48a3c7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/DisplayNameTranslator.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - added text content and id attribute
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xjiang, itrimble
- *
- */
-public class DisplayNameTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public DisplayNameTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getDisplayNameType_TextContent()),
-			new Translator("xml:lang", facesPackage.getDisplayNameType_Lang(), DOM_ATTRIBUTE), //$NON-NLS-1$
-			new Translator("id", facesPackage.getDisplayNameType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/DynamicElementTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/DynamicElementTranslator.java
deleted file mode 100644
index d6173a7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/DynamicElementTranslator.java
+++ /dev/null
@@ -1,496 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-/**
- * 
- */
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.Notifier;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.jst.jsf.facesconfig.emf.DynamicAttribute;
-import org.eclipse.jst.jsf.facesconfig.emf.DynamicElement;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.ReadAheadHelper;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-import org.eclipse.wst.common.internal.emf.resource.TranslatorPath;
-import org.eclipse.wst.common.internal.emf.resource.VariableTranslatorFactory;
-import org.w3c.dom.Attr;
-import org.w3c.dom.NamedNodeMap;
-import org.w3c.dom.Node;
-
-class DynamicElementTranslator extends Translator implements IAnyTranslator
-{
-    public boolean isManagedByParent() {
-        return false;
-    }
-
-    protected Translator[] getChildren() 
-    {
-        FacesConfigPackage facesConfigPackage = FacesConfigPackage.eINSTANCE;
-
-        return new Translator[]
-        {
-            new DynamicElementTranslator("*", facesConfigPackage.getDynamicElement_ChildNodes()), //$NON-NLS-1$
-            new Translator(TEXT_ATTRIBUTE_VALUE, facesConfigPackage.getDynamicElement_TextContent())
-            {
-                public Object getMOFValue(EObject object)
-                {
-                    // TODO: this is a bit of a hack.  The problem is
-                    // that for some reason, if this translator returns
-                    // null, then EMF2DOMAdapterImpl.updateDOMSubtree will
-                    // remove the containing DynamicElement node completely.
-                    // Returning an non-null empty value seems to work
-                    // around this for now.
-                    Object value = super.getMOFValue(object);
-                    return value != null ? value : ""; //$NON-NLS-1$
-                }
-            }
-        };
-    }
-
-    /**
-     * @param domNameAndPath
-     * @param feature
-     */
-    public DynamicElementTranslator(String domNameAndPath,
-            EStructuralFeature feature) 
-    {
-        super(domNameAndPath, feature);
-    }
-    public boolean isMapFor(String domName) {
-        return true;
-    }
-    
-    public EObject createEMFObject(String nodeName, String readAheadName) {
-        // tag name is based on the name property
-        DynamicElement element = FacesConfigFactory.eINSTANCE.createDynamicElement();
-        element.setName(nodeName);
-        return element;
-    }
-
-    public String getDOMName(Object value) {
-        // tag name is based on the name property
-        if (value instanceof DynamicElement)
-        {
-            return ((DynamicElement)value).getName();
-        }
-        return ""; //$NON-NLS-1$
-    }
-
-    public Translator[] getDynamicAttributeTranslators(Node element) {
-        NamedNodeMap attributeMap = element.getAttributes();
-        List attributes = new ArrayList(attributeMap.getLength());
-        for (int i = 0; i < attributeMap.getLength(); i++)
-        {
-            Attr attr = (Attr) attributeMap.item(i);
-            attributes.add(
-                    new DynamicAttributeTranslator(attr.getNodeName(),
-                            FacesConfigPackage.eINSTANCE.getDynamicElement_Attributes()));
-        }
-        
-        return (Translator[]) attributes.toArray(new Translator[0]);
-    }
-    
-    public Translator[] getDynamicAttributeTranslators(DynamicElement element) {
-        List attributes = element.getAttributes();
-        Translator[] translators = new Translator[attributes.size()];
-        int i = 0;
-        for (Iterator it = attributes.iterator(); it.hasNext();)
-        {
-            DynamicAttribute attribute = (DynamicAttribute) it.next();
-            translators[i++] = new DynamicAttributeTranslator(attribute.getName(),
-                    FacesConfigPackage.eINSTANCE.getDynamicElement_Attributes());
-        }
-        return translators;
-    }
-
-    private static class DynamicAttributeTranslator extends Translator
-    {
-
-        /**
-         * @param domNameAndPath
-         * @param feature
-         */
-        public DynamicAttributeTranslator(String domNameAndPath, EStructuralFeature feature) 
-        {
-            // the "*" is a place holder.  The dom path gets ignored in
-            // this translator.  It's a handy one because it is invalid
-            // tag name data so if it gets transmitted to the model
-            // we will get an exception
-            super(domNameAndPath, feature, DOM_ATTRIBUTE);
-        }
-        
-        public boolean isMapFor(String domName) {
-            return super.isMapFor(domName);
-        }
-        
-        public EObject createEMFObject(String nodeName, String readAheadName) {
-            // attribute name is based on the name property
-            DynamicAttribute attribute = FacesConfigFactory.eINSTANCE.createDynamicAttribute();
-            attribute.setName(nodeName);
-            return attribute;
-        }
-        
-        protected Translator[] getChildren() {
-            return new Translator[0];
-        }
-
-        public void addReadAheadHelper(ReadAheadHelper helper) {
-            // TODO Auto-generated method stub
-            super.addReadAheadHelper(helper);
-        }
-
-        public EObject basicGetDependencyObject(EObject parent) {
-            // TODO Auto-generated method stub
-            return super.basicGetDependencyObject(parent);
-        }
-
-        public void clearList(EObject mofObject) {
-            // TODO Auto-generated method stub
-            super.clearList(mofObject);
-        }
-
-        public Object convertStringToValue(String strValue, EObject owner) {
-            // TODO Auto-generated method stub
-            return super.convertStringToValue(strValue, owner);
-        }
-
-        public Object convertStringToValue(String nodeName,
-                String readAheadName, String value, Notifier owner) {
-            // TODO Auto-generated method stub
-            return super.convertStringToValue(nodeName, readAheadName, value, owner);
-        }
-
-        public String convertValueToString(Object value, EObject owner) {
-            // TODO Auto-generated method stub
-            return super.convertValueToString(value, owner);
-        }
-
-        public boolean equals(Object object) {
-            // TODO Auto-generated method stub
-            return super.equals(object);
-        }
-
-        public String extractStringValue(EObject emfObject) {
-            // TODO Auto-generated method stub
-            return super.extractStringValue(emfObject);
-        }
-
-        public boolean featureExists(EObject emfObject) {
-            // TODO Auto-generated method stub
-            return super.featureExists(emfObject);
-        }
-
-        public Translator findChild(String tagName, Object target, int versionID) {
-            // TODO Auto-generated method stub
-            return super.findChild(tagName, target, versionID);
-        }
-
-        public Translator[] getChildren(Object target, int versionID) {
-            // TODO Auto-generated method stub
-            return super.getChildren(target, versionID);
-        }
-
-        public EStructuralFeature getDependencyFeature() {
-            // TODO Auto-generated method stub
-            return super.getDependencyFeature();
-        }
-
-        public String[] getDOMNames() {
-            // TODO Auto-generated method stub
-            return super.getDOMNames();
-        }
-
-        public String getDOMPath() {
-            // TODO Auto-generated method stub
-            return super.getDOMPath();
-        }
-
-        public EStructuralFeature getFeature() {
-            // TODO Auto-generated method stub
-            return super.getFeature();
-        }
-
-        public List getMOFChildren(EObject mofObject) {
-            // TODO Auto-generated method stub
-            return super.getMOFChildren(mofObject);
-        }
-
-        public Object getMOFValue(EObject mofObject) {
-            if (mofObject instanceof DynamicElement)
-            {
-                EList attributes = ((DynamicElement)mofObject).getAttributes();
-                
-                for (final Iterator it = attributes.iterator(); it.hasNext();)
-                {
-                    DynamicAttribute attribute = (DynamicAttribute) it.next();
-                    if (fDOMNames[0].equals(attribute.getName()))
-                    {
-                        return attribute.getValue();
-                    }
-                }
-            }
-            
-            return null;
-        }
-
-        public String getNameSpace() {
-            // TODO Auto-generated method stub
-            return super.getNameSpace();
-        }
-
-        public ReadAheadHelper getReadAheadHelper(String parentName) {
-            // TODO Auto-generated method stub
-            return super.getReadAheadHelper(parentName);
-        }
-
-        public TranslatorPath[] getTranslatorPaths() {
-            // TODO Auto-generated method stub
-            return super.getTranslatorPaths();
-        }
-
-        public Translator[] getVariableChildren(Notifier target, int version) {
-            // TODO Auto-generated method stub
-            return super.getVariableChildren(target, version);
-        }
-
-        public VariableTranslatorFactory getVariableTranslatorFactory() {
-            // TODO Auto-generated method stub
-            return super.getVariableTranslatorFactory();
-        }
-
-        public boolean hasDOMPath() {
-            // TODO Auto-generated method stub
-            return super.hasDOMPath();
-        }
-
-        public boolean hasReadAheadNames() {
-            // TODO Auto-generated method stub
-            return super.hasReadAheadNames();
-        }
-
-        protected void initializeDOMNameAndPath(String domNameAndPathArg) {
-            // TODO Auto-generated method stub
-            super.initializeDOMNameAndPath(domNameAndPathArg);
-        }
-
-        public boolean isBooleanFeature() {
-            // TODO Auto-generated method stub
-            return super.isBooleanFeature();
-        }
-
-        public boolean isBooleanUppercase() {
-            // TODO Auto-generated method stub
-            return super.isBooleanUppercase();
-        }
-
-        public boolean isCDATAContent() {
-            // TODO Auto-generated method stub
-            return super.isCDATAContent();
-        }
-
-        public boolean isComment() {
-            // TODO Auto-generated method stub
-            return super.isComment();
-        }
-
-        public boolean isDataType() {
-            // TODO Auto-generated method stub
-            return super.isDataType();
-        }
-
-        public boolean isDependencyChild() {
-            // TODO Auto-generated method stub
-            return super.isDependencyChild();
-        }
-
-        public boolean isDependencyParent() {
-            // TODO Auto-generated method stub
-            return super.isDependencyParent();
-        }
-
-        public boolean isDOMAttribute() {
-            // TODO Auto-generated method stub
-            return super.isDOMAttribute();
-        }
-
-        public boolean isDOMTextValue() {
-            // TODO Auto-generated method stub
-            return super.isDOMTextValue();
-        }
-
-        public boolean isEmptyContentSignificant() {
-            // TODO Auto-generated method stub
-            return super.isEmptyContentSignificant();
-        }
-
-        public boolean isEmptyTag() {
-            // TODO Auto-generated method stub
-            return super.isEmptyTag();
-        }
-
-        public boolean isEnumFeature() {
-            // TODO Auto-generated method stub
-            return super.isEnumFeature();
-        }
-
-        public boolean isEnumWithHyphens() {
-            // TODO Auto-generated method stub
-            return super.isEnumWithHyphens();
-        }
-
-        public boolean isIDMap() {
-            // TODO Auto-generated method stub
-            return super.isIDMap();
-        }
-
-        public boolean isLinkMap() {
-            // TODO Auto-generated method stub
-            return super.isLinkMap();
-        }
-
-        public boolean isManagedByParent() {
-            // TODO Auto-generated method stub
-            return super.isManagedByParent();
-        }
-
-        public boolean isMapFor(Object feature1, Object oldValue, Object newValue) {
-            return super.isMapFor(feature1, oldValue, newValue);
-        }
-
-        public boolean isMultiValued() {
-            // we want to treat each attribute as a single value
-            return false;
-        }
-
-        public boolean isObjectMap() {
-            // TODO Auto-generated method stub
-            return super.isObjectMap();
-        }
-
-        public boolean isSetMOFValue(EObject emfObject) {
-            // TODO Auto-generated method stub
-            return super.isSetMOFValue(emfObject);
-        }
-
-        public boolean isShared() {
-            // TODO Auto-generated method stub
-            return super.isShared();
-        }
-
-        public boolean isTargetLinkMap() {
-            // TODO Auto-generated method stub
-            return super.isTargetLinkMap();
-        }
-
-        public boolean isUnsettable() {
-            // TODO Auto-generated method stub
-            return super.isUnsettable();
-        }
-
-        protected String[] parseDOMNames(String domNamesString) {
-            // TODO Auto-generated method stub
-            return super.parseDOMNames(domNamesString);
-        }
-
-        public void removeMOFValue(Notifier owner, Object value) {
-            // TODO Auto-generated method stub
-            super.removeMOFValue(owner, value);
-        }
-
-        protected void setEMFClass(EClass anEClass) {
-            // TODO Auto-generated method stub
-            super.setEMFClass(anEClass);
-        }
-
-        protected void setFeature(EStructuralFeature feature) {
-            // TODO Auto-generated method stub
-            super.setFeature(feature);
-        }
-
-        public void setMOFValue(Notifier owner, Object value, int newIndex) {
-            if (owner instanceof DynamicElement)
-            {
-                DynamicAttribute attribute = FacesConfigFactory.eINSTANCE.createDynamicAttribute();
-                attribute.setName(fDOMNames[0]);
-                attribute.setValue(value.toString());
-
-                EList attributes = ((DynamicElement)owner).getAttributes();
-                if (newIndex < 0 || newIndex >= attributes.size())
-                {
-                    attributes.add(attribute);
-                }
-                else
-                {
-                    attributes.set(newIndex, attribute);
-                }
-            }
-            // otherwise do nothing
-        }
-
-        public void setMOFValue(Notifier owner, Object value) {
-            // TODO Auto-generated method stub
-            super.setMOFValue(owner, value);
-        }
-
-        public void setMOFValue(Resource res, Object value) {
-            // TODO Auto-generated method stub
-            super.setMOFValue(res, value);
-        }
-
-        public void setMOFValueFromEmptyDOMPath(EObject object) {
-            // TODO Auto-generated method stub
-            super.setMOFValueFromEmptyDOMPath(object);
-        }
-
-        public void setNameSpace(String string) {
-            // TODO Auto-generated method stub
-            super.setNameSpace(string);
-        }
-
-        public void setTextValueIfNecessary(String textValue, Notifier owner,
-                int versionId) {
-            // TODO Auto-generated method stub
-            super.setTextValueIfNecessary(textValue, owner, versionId);
-        }
-
-        public boolean shouldIndentEndTag() {
-            // TODO Auto-generated method stub
-            return super.shouldIndentEndTag();
-        }
-
-        public boolean shouldRenderEmptyDOMPath(EObject object) {
-            // TODO Auto-generated method stub
-            return super.shouldRenderEmptyDOMPath(object);
-        }
-
-        public String toString() {
-            // TODO Auto-generated method stub
-            return super.toString();
-        }
-
-        public void unSetMOFValue(EObject emfObject) {
-            // TODO Auto-generated method stub
-            super.unSetMOFValue(emfObject);
-        }
-        
-        
-    }
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ELResolverTypeTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ELResolverTypeTranslator.java
deleted file mode 100644
index 9aabe6e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ELResolverTypeTranslator.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * The el-resolver translator
- *
- */
-public class ELResolverTypeTranslator extends Translator {
-    /**
-     * @param domNameAndPath
-     * @param aFeature
-     */
-    public ELResolverTypeTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-        super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-     */
-    public Translator[] getChildren() {
-        
-        FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-        return new Translator[] {
-            new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getPropertyResolverType_TextContent()),
-            new Translator("id", facesPackage.getPropertyResolverType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-        };
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ExceptionHandlerFactoryTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ExceptionHandlerFactoryTranslator.java
deleted file mode 100644
index 41a24fe..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ExceptionHandlerFactoryTranslator.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xnjiang
- *
- */
-public class ExceptionHandlerFactoryTranslator extends Translator {
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public ExceptionHandlerFactoryTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/*  (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getExceptionHandlerFactoryType_TextContent()),
-			new Translator("id", facesPackage.getExceptionHandlerFactoryType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ExtensionTypeTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ExtensionTypeTranslator.java
deleted file mode 100644
index eca0e57..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ExtensionTypeTranslator.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * Translator for extension types
- *
- */
-public abstract class ExtensionTypeTranslator extends Translator 
-{
-    /**
-     * @param domNameAndPath
-     * @param aFeature
-     */
-    public ExtensionTypeTranslator(String domNameAndPath, EStructuralFeature aFeature) 
-    {
-        super(domNameAndPath, aFeature);
-    }
-    
-    public Translator[] getChildren() {
-        
-        FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-        return new Translator[] {
-              new Translator("id", facesPackage.getExtensionType_Id(), DOM_ATTRIBUTE), //$NON-NLS-1$
-              new DynamicElementTranslator("*", facesPackage.getExtensionType_ChildNodes()) //$NON-NLS-1$
-        };
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ExternalContextFactoryTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ExternalContextFactoryTranslator.java
deleted file mode 100644
index 7103916..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ExternalContextFactoryTranslator.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xnjiang
- *
- */
-public class ExternalContextFactoryTranslator extends Translator {
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public ExternalContextFactoryTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/*  (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getExternalContextFactoryType_TextContent()),
-			new Translator("id", facesPackage.getExternalContextFactoryType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/FacesConfigExtensionTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/FacesConfigExtensionTranslator.java
deleted file mode 100644
index b5819cb..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/FacesConfigExtensionTranslator.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-
-/**
- * Translator for FacesConfig extension data
- *
- */
-public class FacesConfigExtensionTranslator extends ExtensionTypeTranslator {
-
-    /**
-     * @param domNameAndPath
-     * @param feature
-     */
-    public FacesConfigExtensionTranslator(String domNameAndPath,
-            EStructuralFeature feature) {
-        super(domNameAndPath, feature);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/FacesConfigTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/FacesConfigTranslator.java
deleted file mode 100644
index 599927e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/FacesConfigTranslator.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - added id attribute
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.RootTranslator;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xjiang, itrimble
- *
- */
-public class FacesConfigTranslator extends RootTranslator {
-	
-	/**
-	 * Instance of translator
-	 */
-	public static FacesConfigTranslator INSTANCE = new FacesConfigTranslator();
-
-    /**
-     * Default constructor
-     */
-    public FacesConfigTranslator() {
-		super("faces-config", FacesConfigPackage.eINSTANCE.getFacesConfigType()); //$NON-NLS-1$
-    }
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-				new ApplicationTranslator("application", facesPackage.getFacesConfigType_Application()), //$NON-NLS-1$
-				new OrderingTranslator("ordering", facesPackage.getFacesConfigType_Ordering()), //$NON-NLS-1$
-				new AbsoluteOrderingTranslator("absolute-ordering", facesPackage.getFacesConfigType_AbsoluteOrdering()), //$NON-NLS-1$
-				new FactoryTranslator("factory", facesPackage.getFacesConfigType_Factory()), //$NON-NLS-1$
-				new ComponentTranslator("component", facesPackage.getFacesConfigType_Component()), //$NON-NLS-1$
-				new ConverterTranslator("converter", facesPackage.getFacesConfigType_Converter()), //$NON-NLS-1$
-				new ManagedBeanTranslator("managed-bean", facesPackage.getFacesConfigType_ManagedBean()), //$NON-NLS-1$
-				new NameTranslator("name", facesPackage.getFacesConfigType_Name()), //$NON-NLS-1$
-				new NavigationRuleTranslator("navigation-rule", facesPackage.getFacesConfigType_NavigationRule()), //$NON-NLS-1$
-				new ReferencedBeanTranslator("referenced-bean", facesPackage.getFacesConfigType_ReferencedBean()), //$NON-NLS-1$
-				new RenderKitTranslator("render-kit", facesPackage.getFacesConfigType_RenderKit()), //$NON-NLS-1$
-				new LifecycleTranslator("lifecycle", facesPackage.getFacesConfigType_Lifecycle()), //$NON-NLS-1$
-				new ValidatorTranslator("validator", facesPackage.getFacesConfigType_Validator()), //$NON-NLS-1$
-				new BehaviorTranslator("behavior", facesPackage.getFacesConfigType_Behavior()), //$NON-NLS-1$
-				new FacesConfigExtensionTranslator("faces-config-extension", facesPackage.getFacesConfigType_FacesConfigExtension()), //$NON_NLS-1$ //$NON-NLS-1$
-				new Translator("xmlns", facesPackage.getFacesConfigType_Xmlns(), DOM_ATTRIBUTE), //$NON-NLS-1$
-				new Translator("metadata-complete", facesPackage.getFacesConfigType_MetadataComplete(), DOM_ATTRIBUTE), //$NON-NLS-1$
-				new Translator("id", facesPackage.getFacesConfigType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/FacesContextFactoryTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/FacesContextFactoryTranslator.java
deleted file mode 100644
index 8ad0eda..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/FacesContextFactoryTranslator.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - added id attribute
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xnjiang, itrimble
- *
- */
-public class FacesContextFactoryTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public FacesContextFactoryTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getFacesContextFactoryType_TextContent()),
-			new Translator("id", facesPackage.getFacesContextFactoryType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/FacetExtensionTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/FacetExtensionTranslator.java
deleted file mode 100644
index 3cffc06..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/FacetExtensionTranslator.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Orcale Corporation - fixed getChildren()
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-
-/**
- * @author xnjiang, itrimble
- *
- */
-public class FacetExtensionTranslator extends ExtensionTypeTranslator {
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public FacetExtensionTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/FacetNameTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/FacetNameTranslator.java
deleted file mode 100644
index 81e5023..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/FacetNameTranslator.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * Translator for facet name
- *
- */
-public class FacetNameTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public FacetNameTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getFacetNameType_TextContent()),
-			new Translator("id", facesPackage.getFacetNameType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/FacetTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/FacetTranslator.java
deleted file mode 100644
index 52f7b1f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/FacetTranslator.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - fixed getChildren()
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xnjiang, itrimble
- *
- */
-public class FacetTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public FacetTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new DescriptionTranslator("description", facesPackage.getFacetType_Description()), //$NON-NLS-1$
-			new DisplayNameTranslator("display-name", facesPackage.getFacetType_DisplayName()), //$NON-NLS-1$
-			new IconTranslator("icon", facesPackage.getFacetType_Icon()), //$NON-NLS-1$
-			new FacetNameTranslator("facet-name", facesPackage.getFacetType_FacetName()), //$NON-NLS-1$
-			new FacetExtensionTranslator("facet-extension", facesPackage.getFacetType_FacetExtension()), //$NON-NLS-1$
-			new Translator("id", facesPackage.getFacetType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/FactoryExtensionTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/FactoryExtensionTranslator.java
deleted file mode 100644
index 0bdd623..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/FactoryExtensionTranslator.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-
-/**
- * The factory extension translator
- *
- */
-public class FactoryExtensionTranslator extends ExtensionTypeTranslator {
-
-    /**
-     * @param domNameAndPath
-     * @param feature
-     */
-    public FactoryExtensionTranslator(String domNameAndPath,
-            EStructuralFeature feature) {
-        super(domNameAndPath, feature);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/FactoryTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/FactoryTranslator.java
deleted file mode 100644
index c49a70c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/FactoryTranslator.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - added id attribute
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author Eric Bordeau, itrimble
- */
-public class FactoryTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public FactoryTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new ApplicationFactoryTranslator("application-factory", facesPackage.getFactoryType_ApplicationFactory()), //$NON-NLS-1$
-			new ExceptionHandlerFactoryTranslator("exception-handler-factory", facesPackage.getFactoryType_ExceptionHandlerFactory()), //$NON-NLS-1$
-			new ExternalContextFactoryTranslator("external-context-factory", facesPackage.getFactoryType_ExternalContextFactory()), //$NON-NLS-1$
-			new FacesContextFactoryTranslator("faces-context-factory", facesPackage.getFactoryType_FacesContextFactory()), //$NON-NLS-1$
-			new PartialViewContextFactoryTranslator("partial-view-context-factory", facesPackage.getFactoryType_PartialViewContextFactory()), //$NON-NLS-1$
-			new LifecycleFactoryTranslator("lifecycle-factory", facesPackage.getFactoryType_LifecycleFactory()), //$NON-NLS-1$
-			new ViewDeclarationLanguageFactoryTranslator("view-declaration-language-factory", facesPackage.getFactoryType_ViewDeclarationLanguageFactory()), //$NON-NLS-1$
-			new TagHandlerDelegateFactoryTranslator("tag-handler-delegate-factory", facesPackage.getFactoryType_TagHandlerDelegateFactory()), //$NON-NLS-1$
-			new RenderKitFactoryTranslator("render-kit-factory", facesPackage.getFactoryType_RenderKitFactory()), //$NON-NLS-1$
-			new VisitContextFactoryTranslator("visit-context-factory", facesPackage.getFactoryType_VisitContextFactory()), //$NON-NLS-1$
-            new FactoryExtensionTranslator("factory-extension", facesPackage.getFactoryType_FactoryExtension()), //$NON-NLS-1$
-			new Translator("id", facesPackage.getFactoryType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/FromActionTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/FromActionTranslator.java
deleted file mode 100644
index b792ce8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/FromActionTranslator.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * Translator for FromAction
- *
- */
-public class FromActionTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public FromActionTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getFromActionType_TextContent()),
-			new Translator("id", facesPackage.getFromActionType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/FromOutcomeTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/FromOutcomeTranslator.java
deleted file mode 100644
index 9779b41..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/FromOutcomeTranslator.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * Translator for FromOutcome
- *
- */
-public class FromOutcomeTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public FromOutcomeTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getFromOutcomeType_TextContent()),
-			new Translator("id", facesPackage.getFromOutcomeType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/FromViewIdTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/FromViewIdTranslator.java
deleted file mode 100644
index 2616e4a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/FromViewIdTranslator.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * Translator for FromViewId
- *
- */
-public class FromViewIdTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public FromViewIdTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getFromViewIdType_TextContent()),
-			new Translator("id", facesPackage.getFromViewIdType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/IAnyTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/IAnyTranslator.java
deleted file mode 100644
index 06d0757..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/IAnyTranslator.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.jst.jsf.facesconfig.emf.DynamicElement;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-import org.w3c.dom.Node;
-
-/**
- * A translator that can handle the DTD ANY and XSD anyType XML
- * 
- * @author cbateman
- *
- */
-public interface IAnyTranslator {
-    /**
-     * Allows an ANY translator for elements to 
-     * dynamically inject attribute translators
-     * based on the contents of the Element node's
-     * runtime attribute values
-     * 
-     * @param element 
-     * @return a list of translators for attributes
-     * of dynamic elements
-     */
-    Translator[]  getDynamicAttributeTranslators(Node element);
-    
-    /**
-     * Allows an ANY translator for elements to
-     * dynamically inject attribute translators
-     * based on the contents of an DynamicElement that
-     * may not already be in the corresponding DOM element
-     * 
-     * @param element
-     * @return a list of translators for attributes of dynamic elements
-     */
-    Translator[]  getDynamicAttributeTranslators(DynamicElement element);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/IconTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/IconTranslator.java
deleted file mode 100644
index 9f33f6a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/IconTranslator.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - fixed getChildren()
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xjiang, itrimble
- *
- */
-public class IconTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public IconTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new SmallIconTranslator("small-icon", facesPackage.getIconType_SmallIcon()), //$NON-NLS-1$
-			new LargeIconTranslator("large-icon", facesPackage.getIconType_LargeIcon()), //$NON-NLS-1$
-			new Translator("xml:lang", facesPackage.getIconType_Lang(), DOM_ATTRIBUTE), //$NON-NLS-1$
-			new Translator("id", facesPackage.getIconType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/IfTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/IfTranslator.java
deleted file mode 100644
index 3016a6b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/IfTranslator.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xnjiang
- *
- */
-public class IfTranslator extends Translator {
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public IfTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/*  (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getIfType_TextContent()),
-			new Translator("id", facesPackage.getIfType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/KeyClassTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/KeyClassTranslator.java
deleted file mode 100644
index 1c8f904..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/KeyClassTranslator.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * Translator for key class property
- * 
- * @author cbateman
- *
- */
-public class KeyClassTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public KeyClassTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getKeyClassType_TextContent()),
-			new Translator("id", facesPackage.getKeyClassType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/KeyTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/KeyTranslator.java
deleted file mode 100644
index 6d7f354..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/KeyTranslator.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * Translator for key property
- *
- */
-public class KeyTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public KeyTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getKeyType_TextContent()),
-			new Translator("id", facesPackage.getKeyType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/LargeIconTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/LargeIconTranslator.java
deleted file mode 100644
index 0c7e44c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/LargeIconTranslator.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * Translator for large icon property
- *
- */
-public class LargeIconTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public LargeIconTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getLargeIconType_TextContent()),
-			new Translator("id", facesPackage.getLargeIconType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/LifecycleExtensionTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/LifecycleExtensionTranslator.java
deleted file mode 100644
index c5c9f2d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/LifecycleExtensionTranslator.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-
-/**
- * Translator for lifecycle extensions
- *
- */
-public class LifecycleExtensionTranslator extends ExtensionTypeTranslator {
-
-    /**
-     * @param domNameAndPath
-     * @param feature
-     */
-    public LifecycleExtensionTranslator(String domNameAndPath,
-            EStructuralFeature feature) {
-        super(domNameAndPath, feature);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/LifecycleFactoryTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/LifecycleFactoryTranslator.java
deleted file mode 100644
index 0d06154..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/LifecycleFactoryTranslator.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - added id attribute
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xnjiang, itrimble
- *
- */
-public class LifecycleFactoryTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public LifecycleFactoryTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getLifecycleFactoryType_TextContent()),
-			new Translator("id", facesPackage.getLifecycleFactoryType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/LifecycleTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/LifecycleTranslator.java
deleted file mode 100644
index c36905e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/LifecycleTranslator.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - added id attribute
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author Eric Bordeau, itrimble
- */
-public class LifecycleTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public LifecycleTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new PhaseListenerTranslator("phase-listener", facesPackage.getLifecycleType_PhaseListener()), //$NON-NLS-1$
-            new LifecycleExtensionTranslator("lifecycle-extension",facesPackage.getLifecycleType_LifecycleExtension()), //$NON-NLS-1$
-			new Translator("id", facesPackage.getLifecycleType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ListEntriesTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ListEntriesTranslator.java
deleted file mode 100644
index c2093a5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ListEntriesTranslator.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - fixed getChildren()
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xjiang, itrimble
- *
- */
-public class ListEntriesTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public ListEntriesTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new ValueClassTranslator("value-class", facesPackage.getListEntriesType_ValueClass()), //$NON-NLS-1$
-			new NullValueTranslator("null-value", facesPackage.getListEntriesType_NullValue()), //$NON-NLS-1$
-			new ValueTranslator("value", facesPackage.getListEntriesType_Value()), //$NON-NLS-1$
-			new Translator("id", facesPackage.getListEntriesType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/LocaleConfigTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/LocaleConfigTranslator.java
deleted file mode 100644
index caed4ae..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/LocaleConfigTranslator.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - fixed getChildren()
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xjiang, itrimble
- *
- */
-public class LocaleConfigTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public LocaleConfigTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new DefaultLocaleTranslator("default-locale", facesPackage.getLocaleConfigType_DefaultLocale()), //$NON-NLS-1$
-			new SupportedLocaleTranslator("supported-locale", facesPackage.getLocaleConfigType_SupportedLocale()), //$NON-NLS-1$
-			new Translator("id", facesPackage.getLocaleConfigType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ManagedBeanClassTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ManagedBeanClassTranslator.java
deleted file mode 100644
index 2317987..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ManagedBeanClassTranslator.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * Translator for the managed bean class
- *
- */
-public class ManagedBeanClassTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public ManagedBeanClassTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getManagedBeanClassType_TextContent()),
-			new Translator("id", facesPackage.getManagedBeanClassType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ManagedBeanExtensionTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ManagedBeanExtensionTranslator.java
deleted file mode 100644
index e3d967a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ManagedBeanExtensionTranslator.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-
-/**
- * Translator for managed bean extensions
- *
- */
-public class ManagedBeanExtensionTranslator extends ExtensionTypeTranslator {
-
-    /**
-     * @param domNameAndPath
-     * @param feature
-     */
-    public ManagedBeanExtensionTranslator(String domNameAndPath,
-            EStructuralFeature feature) {
-        super(domNameAndPath, feature);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ManagedBeanNameTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ManagedBeanNameTranslator.java
deleted file mode 100644
index d2ded7c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ManagedBeanNameTranslator.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * Translator for managed bean name
- *
- */
-public class ManagedBeanNameTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public ManagedBeanNameTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getManagedBeanNameType_TextContent()),
-			new Translator("id", facesPackage.getManagedBeanNameType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ManagedBeanScopeTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ManagedBeanScopeTranslator.java
deleted file mode 100644
index 7138a6d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ManagedBeanScopeTranslator.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * Translator for managed bean scope
- *
- */
-public class ManagedBeanScopeTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public ManagedBeanScopeTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getManagedBeanScopeType_TextContent()),
-			new Translator("id", facesPackage.getManagedBeanScopeType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ManagedBeanTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ManagedBeanTranslator.java
deleted file mode 100644
index c306f6c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ManagedBeanTranslator.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - fixed getChildren()
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xjiang, itrimble
- *
- */
-public class ManagedBeanTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public ManagedBeanTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new DescriptionTranslator("description", facesPackage.getManagedBeanType_Description()), //$NON-NLS-1$
-			new DisplayNameTranslator("display-name", facesPackage.getManagedBeanType_DisplayName()), //$NON-NLS-1$
-			new IconTranslator("icon", facesPackage.getManagedBeanType_Icon()), //$NON-NLS-1$
-			new ManagedBeanNameTranslator("managed-bean-name", facesPackage.getManagedBeanType_ManagedBeanName()), //$NON-NLS-1$
-			new ManagedBeanClassTranslator("managed-bean-class", facesPackage.getManagedBeanType_ManagedBeanClass()), //$NON-NLS-1$
-			new ManagedBeanScopeTranslator("managed-bean-scope", facesPackage.getManagedBeanType_ManagedBeanScope()), //$NON-NLS-1$
-			new ManagedPropertyTranslator("managed-property", facesPackage.getManagedBeanType_ManagedProperty()), //$NON-NLS-1$
-			new MapEntriesTranslator("map-entries", facesPackage.getManagedBeanType_MapEntries()), //$NON-NLS-1$
-			new ListEntriesTranslator("list-entries", facesPackage.getManagedBeanType_ListEntries()), //$NON-NLS-1$
-            new ManagedBeanExtensionTranslator("managed-bean-extension", facesPackage.getManagedBeanType_ManagedBeanExtension()), //$NON-NLS-1$
-			new Translator("eager", facesPackage.getManagedBeanType_Eager(), DOM_ATTRIBUTE), //$NON-NLS-1$
-			new Translator("id", facesPackage.getManagedBeanType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ManagedPropertyTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ManagedPropertyTranslator.java
deleted file mode 100644
index 49198cb..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ManagedPropertyTranslator.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - fixed getChildren()
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xjiang, itrimble
- *
- */
-public class ManagedPropertyTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public ManagedPropertyTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new DescriptionTranslator("description", facesPackage.getManagedPropertyType_Description()), //$NON-NLS-1$
-			new DisplayNameTranslator("display-name", facesPackage.getManagedPropertyType_DisplayName()), //$NON-NLS-1$
-			new IconTranslator("icon", facesPackage.getManagedPropertyType_Icon()), //$NON-NLS-1$
-			new PropertyNameTranslator("property-name", facesPackage.getManagedPropertyType_PropertyName()), //$NON-NLS-1$
-			new PropertyClassTranslator("property-class", facesPackage.getManagedPropertyType_PropertyClass()), //$NON-NLS-1$
-			new MapEntriesTranslator("map-entries", facesPackage.getManagedPropertyType_MapEntries()), //$NON-NLS-1$
-			new NullValueTranslator("null-value", facesPackage.getManagedPropertyType_NullValue()), //$NON-NLS-1$
-			new ValueTranslator("value", facesPackage.getManagedPropertyType_Value()), //$NON-NLS-1$
-			new ListEntriesTranslator("list-entries", facesPackage.getManagedPropertyType_ListEntries()), //$NON-NLS-1$
-			new Translator("id", facesPackage.getManagedPropertyType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/MapEntriesTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/MapEntriesTranslator.java
deleted file mode 100644
index 40faec1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/MapEntriesTranslator.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - fixed getChildren()
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xjiang, itrimble
- *
- */
-public class MapEntriesTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public MapEntriesTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new KeyClassTranslator("key-class", facesPackage.getMapEntriesType_KeyClass()), //$NON-NLS-1$
-			new ValueClassTranslator("value-class", facesPackage.getMapEntriesType_ValueClass()), //$NON-NLS-1$
-			new MapEntryTranslator("map-entry", facesPackage.getMapEntriesType_MapEntry()), //$NON-NLS-1$
-			new Translator("id", facesPackage.getMapEntriesType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/MapEntryTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/MapEntryTranslator.java
deleted file mode 100644
index d571502..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/MapEntryTranslator.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - fixed getChildren()
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xjiang, itrimble
- *
- */
-public class MapEntryTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public MapEntryTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new KeyTranslator("key", facesPackage.getMapEntryType_Key()), //$NON-NLS-1$
-			new NullValueTranslator("null-value", facesPackage.getMapEntryType_NullValue()), //$NON-NLS-1$
-			new ValueTranslator("value", facesPackage.getMapEntryType_Value()), //$NON-NLS-1$
-			new Translator("id", facesPackage.getMapEntryType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/MessageBundleTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/MessageBundleTranslator.java
deleted file mode 100644
index d052df6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/MessageBundleTranslator.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - added id attribute
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xjiang, itrimble
- *
- */
-public class MessageBundleTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public MessageBundleTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getMessageBundleType_TextContent()),
-			new Translator("id", facesPackage.getMessageBundleType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/NameTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/NameTranslator.java
deleted file mode 100644
index 96bf3ba..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/NameTranslator.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xnjiang
- *
- */
-public class NameTranslator extends Translator {
-	/**
-	 * @param domNameAndPath 
-	 * @param aFeature 
-	 */
-	public NameTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getNameType_TextContent()),
-			new Translator("id", facesPackage.getNameType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/NavigationCaseTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/NavigationCaseTranslator.java
deleted file mode 100644
index 4d14702..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/NavigationCaseTranslator.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - fixed getChildren()
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xjiang, itrimble
- *
- */
-public class NavigationCaseTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public NavigationCaseTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new DescriptionTranslator("description", facesPackage.getNavigationCaseType_Description()), //$NON-NLS-1$
-			new DisplayNameTranslator("display-name", facesPackage.getNavigationCaseType_DisplayName()), //$NON-NLS-1$
-			new IconTranslator("icon", facesPackage.getNavigationCaseType_Icon()), //$NON-NLS-1$
-			new FromActionTranslator("from-action", facesPackage.getNavigationCaseType_FromAction()), //$NON-NLS-1$
-			new FromOutcomeTranslator("from-outcome", facesPackage.getNavigationCaseType_FromOutcome()), //$NON-NLS-1$
-			new IfTranslator("if", facesPackage.getNavigationCaseType_If()), //$NON-NLS-1$
-			new ToViewIdTranslator("to-view-id", facesPackage.getNavigationCaseType_ToViewId()), //$NON-NLS-1$
-			new RedirectTranslator("redirect", facesPackage.getNavigationCaseType_Redirect()), //$NON-NLS-1$
-			new Translator("id", facesPackage.getNavigationCaseType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/NavigationHandlerTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/NavigationHandlerTranslator.java
deleted file mode 100644
index 694a009..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/NavigationHandlerTranslator.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - added id attribute
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xjiang, itrimble
- *
- */
-public class NavigationHandlerTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public NavigationHandlerTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getNavigationHandlerType_TextContent()),
-			new Translator("id", facesPackage.getNavigationHandlerType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/NavigationRuleExtensionTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/NavigationRuleExtensionTranslator.java
deleted file mode 100644
index f1c02f7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/NavigationRuleExtensionTranslator.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-
-/**
- * Translator for navigation rule extensions
- *
- */
-public class NavigationRuleExtensionTranslator extends ExtensionTypeTranslator {
-
-    /**
-     * @param domNameAndPath
-     * @param feature
-     */
-    public NavigationRuleExtensionTranslator(String domNameAndPath,
-            EStructuralFeature feature) {
-        super(domNameAndPath, feature);
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/NavigationRuleTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/NavigationRuleTranslator.java
deleted file mode 100644
index f808698..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/NavigationRuleTranslator.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - fixed getChildren()
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xjiang, itrimble
- *
- */
-public class NavigationRuleTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public NavigationRuleTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new DescriptionTranslator("description", facesPackage.getNavigationRuleType_Description()), //$NON-NLS-1$
-			new DisplayNameTranslator("display-name", facesPackage.getNavigationRuleType_DisplayName()), //$NON-NLS-1$
-			new IconTranslator("icon", facesPackage.getNavigationRuleType_Icon()), //$NON-NLS-1$
-			new FromViewIdTranslator("from-view-id", facesPackage.getNavigationRuleType_FromViewId()), //$NON-NLS-1$
-			new NavigationCaseTranslator("navigation-case", facesPackage.getNavigationRuleType_NavigationCase()), //$NON-NLS-1$
-            new NavigationRuleExtensionTranslator("navigation-rule-extension", facesPackage.getNavigationRuleType_NavigationRuleExtension()), //$NON-NLS-1$
-			new Translator("id", facesPackage.getNavigationRuleType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/NullValueTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/NullValueTranslator.java
deleted file mode 100644
index e4507cd..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/NullValueTranslator.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - added id attribute
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xjiang, itrimble
- *
- */
-public class NullValueTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public NullValueTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, EMPTY_TAG|END_TAG_NO_INDENT);
-	}
-
-	public boolean isSetMOFValue(EObject emfObject) {
-		return feature != null && emfObject.eIsSet(feature);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator("id", facesPackage.getNullValueType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/OrderingOrderingTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/OrderingOrderingTranslator.java
deleted file mode 100644
index 3fd4531..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/OrderingOrderingTranslator.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - added id attribute
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xnjiang, itrimble
- *
- */
-public class OrderingOrderingTranslator extends Translator {
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public OrderingOrderingTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-				new NameTranslator("name", facesPackage.getOrderingOrderingType_Name()), //$NON-NLS-1$
-				new OrderingOthersTranslator("others", facesPackage.getOrderingOrderingType_Others()) //$NON-NLS-1$
-//				new Translator("id", facesPackage.getOrderingOrderingType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/OrderingOthersTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/OrderingOthersTranslator.java
deleted file mode 100644
index f7ab410..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/OrderingOthersTranslator.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xnjiang
- *
- */
-public class OrderingOthersTranslator extends Translator {
-	/**
-	 * @param domNameAndPath 
-	 * @param aFeature 
-	 */
-	public OrderingOthersTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator("id", facesPackage.getOrderingOthersType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/OrderingTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/OrderingTranslator.java
deleted file mode 100644
index 2aedd02..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/OrderingTranslator.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - added id attribute
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xnjiang, itrimble
- *
- */
-public class OrderingTranslator extends Translator {
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public OrderingTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-				new OrderingOrderingTranslator("after", facesPackage.getOrderingType_After()), //$NON-NLS-1$
-				new OrderingOrderingTranslator("before", facesPackage.getOrderingType_Before()) //$NON-NLS-1$
-//				new Translator("id", facesPackage.getOrderingType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/PartialTraversalTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/PartialTraversalTranslator.java
deleted file mode 100644
index 02a8cef..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/PartialTraversalTranslator.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xnjiang
- *
- */
-public class PartialTraversalTranslator extends Translator {
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public PartialTraversalTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/*  (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		return new Translator[]{};
-//		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-//		return new Translator[] {
-//			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getPartialTraversalType_TextContent()),
-//			new Translator("id", facesPackage.getPartialTraversalType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-//		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/PartialViewContextFactoryTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/PartialViewContextFactoryTranslator.java
deleted file mode 100644
index 0d1dc27..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/PartialViewContextFactoryTranslator.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xnjiang
- *
- */
-public class PartialViewContextFactoryTranslator extends Translator {
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public PartialViewContextFactoryTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/*  (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getPartialViewContextFactoryType_TextContent()),
-			new Translator("id", facesPackage.getPartialViewContextFactoryType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/PhaseListenerTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/PhaseListenerTranslator.java
deleted file mode 100644
index 61bf6d9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/PhaseListenerTranslator.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - added id attribute
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xnjiang, itrimble
- *
- */
-public class PhaseListenerTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public PhaseListenerTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getPhaseListenerType_TextContent()),
-			new Translator("id", facesPackage.getPhaseListenerType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/PropertyClassTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/PropertyClassTranslator.java
deleted file mode 100644
index 460d1dd..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/PropertyClassTranslator.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * Translator for the property class
- *
- */
-public class PropertyClassTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public PropertyClassTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getPropertyClassType_TextContent()),
-			new Translator("id", facesPackage.getPropertyClassType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/PropertyExtensionTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/PropertyExtensionTranslator.java
deleted file mode 100644
index 8889939..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/PropertyExtensionTranslator.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - added id attribute
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-
-/**
- * @author xnjiang, itrimble
- *
- */
-public class PropertyExtensionTranslator extends ExtensionTypeTranslator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public PropertyExtensionTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/PropertyNameTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/PropertyNameTranslator.java
deleted file mode 100644
index d07de28..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/PropertyNameTranslator.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * Translator for the property name
- *
- */
-public class PropertyNameTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public PropertyNameTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getPropertyNameType_TextContent()),
-			new Translator("id", facesPackage.getPropertyNameType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/PropertyResolverTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/PropertyResolverTranslator.java
deleted file mode 100644
index 5f5482d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/PropertyResolverTranslator.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - added id attribute
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xjiang, itrimble
- *
- */
-public class PropertyResolverTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public PropertyResolverTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getPropertyResolverType_TextContent()),
-			new Translator("id", facesPackage.getPropertyResolverType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/PropertyTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/PropertyTranslator.java
deleted file mode 100644
index e01af4d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/PropertyTranslator.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - fixed getChildren()
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xjiang, itrimble
- *
- */
-public class PropertyTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public PropertyTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new DescriptionTranslator("description", facesPackage.getPropertyType_Description()), //$NON-NLS-1$
-			new DisplayNameTranslator("display-name", facesPackage.getPropertyType_DisplayName()), //$NON-NLS-1$
-			new IconTranslator("icon", facesPackage.getPropertyType_Icon()), //$NON-NLS-1$
-			new PropertyNameTranslator("property-name", facesPackage.getPropertyType_PropertyName()), //$NON-NLS-1$
-			new PropertyClassTranslator("property-class", facesPackage.getPropertyType_PropertyClass()), //$NON-NLS-1$
-			new DefaultValueTranslator("default-value", facesPackage.getPropertyType_DefaultValue()), //$NON-NLS-1$
-			new SuggestedValueTranslator("suggested-value", facesPackage.getPropertyType_SuggestedValue()), //$NON-NLS-1$
-			new PropertyExtensionTranslator("property-extension", facesPackage.getPropertyType_PropertyExtension()), //$NON-NLS-1$
-			new Translator("id", facesPackage.getPropertyType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/RedirectTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/RedirectTranslator.java
deleted file mode 100644
index d86d9c9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/RedirectTranslator.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * Translator for the redirect
- *
- */
-public class RedirectTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public RedirectTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, EMPTY_TAG|END_TAG_NO_INDENT);
-	}
-
-	public boolean isSetMOFValue(EObject emfObject) {
-		return feature != null && emfObject.eIsSet(feature);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new RedirectViewParamTranslator("view-param", facesPackage.getRedirectType_ViewParam()), //$NON-NLS-1$
-			new Translator("include-view-params", facesPackage.getRedirectType_IncludeViewParams(), DOM_ATTRIBUTE), //$NON-NLS-1$
-			new Translator("id", facesPackage.getRedirectType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/RedirectViewParamTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/RedirectViewParamTranslator.java
deleted file mode 100644
index 3ebe617..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/RedirectViewParamTranslator.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - added id attribute
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xnjiang, itrimble
- *
- */
-public class RedirectViewParamTranslator extends Translator {
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public RedirectViewParamTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-				new NameTranslator("name", facesPackage.getRedirectViewParamType_Name()), //$NON-NLS-1$
-				new ValueTranslator("value", facesPackage.getRedirectViewParamType_Value()), //$NON-NLS-1$
-				new Translator("id", facesPackage.getRedirectViewParamType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ReferencedBeanClassTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ReferencedBeanClassTranslator.java
deleted file mode 100644
index 2e265d7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ReferencedBeanClassTranslator.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * Translator for the reference bean class
- *
- */
-public class ReferencedBeanClassTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public ReferencedBeanClassTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getReferencedBeanClassType_TextContent()),
-			new Translator("id", facesPackage.getReferencedBeanClassType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ReferencedBeanNameTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ReferencedBeanNameTranslator.java
deleted file mode 100644
index b830b2e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ReferencedBeanNameTranslator.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * Translator for the referenced bean name
- *
- */
-public class ReferencedBeanNameTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public ReferencedBeanNameTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getReferencedBeanNameType_TextContent()),
-			new Translator("id", facesPackage.getReferencedBeanNameType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ReferencedBeanTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ReferencedBeanTranslator.java
deleted file mode 100644
index 4b985c6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ReferencedBeanTranslator.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - fixed getChildren()
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xjiang, itrimble
- *
- */
-public class ReferencedBeanTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public ReferencedBeanTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new DescriptionTranslator("description", facesPackage.getReferencedBeanType_Description()), //$NON-NLS-1$
-			new DisplayNameTranslator("display-name", facesPackage.getReferencedBeanType_DisplayName()), //$NON-NLS-1$
-			new IconTranslator("icon", facesPackage.getReferencedBeanType_Icon()), //$NON-NLS-1$
-			new ReferencedBeanNameTranslator("referenced-bean-name", facesPackage.getReferencedBeanType_ReferencedBeanName()), //$NON-NLS-1$
-			new ReferencedBeanClassTranslator("referenced-bean-class", facesPackage.getReferencedBeanType_ReferencedBeanClass()), //$NON-NLS-1$
-			new Translator("id", facesPackage.getReferencedBeanType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/RenderKitClassTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/RenderKitClassTranslator.java
deleted file mode 100644
index a44e046..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/RenderKitClassTranslator.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * Translator for the render kit class property
- *
- */
-public class RenderKitClassTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public RenderKitClassTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getRenderKitClassType_TextContent()),
-			new Translator("id", facesPackage.getRenderKitClassType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/RenderKitExtensionTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/RenderKitExtensionTranslator.java
deleted file mode 100644
index 54b021e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/RenderKitExtensionTranslator.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-
-/**
- * Translator for the extension to renderkit property
- *
- */
-public class RenderKitExtensionTranslator extends ExtensionTypeTranslator {
-
-    /**
-     * @param domNameAndPath
-     * @param feature
-     */
-    public RenderKitExtensionTranslator(String domNameAndPath,
-            EStructuralFeature feature) {
-        super(domNameAndPath, feature);
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/RenderKitFactoryTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/RenderKitFactoryTranslator.java
deleted file mode 100644
index 478e8b3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/RenderKitFactoryTranslator.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - added id attribute
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xnjiang, itrimble
- *
- */
-public class RenderKitFactoryTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public RenderKitFactoryTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getRenderKitFactoryType_TextContent()),
-			new Translator("id", facesPackage.getRenderKitFactoryType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/RenderKitIdTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/RenderKitIdTranslator.java
deleted file mode 100644
index 80132e5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/RenderKitIdTranslator.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * Translator for the renderkit id
- *
- */
-public class RenderKitIdTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public RenderKitIdTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getRenderKitIdType_TextContent()),
-			new Translator("id", facesPackage.getRenderKitIdType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/RenderKitTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/RenderKitTranslator.java
deleted file mode 100644
index 9c182d3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/RenderKitTranslator.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - fixed getChildren()
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xjiang, itrimble
- *
- */
-public class RenderKitTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public RenderKitTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-				new DescriptionTranslator("description", facesPackage.getRenderKitType_Description()), //$NON-NLS-1$
-				new DisplayNameTranslator("display-name", facesPackage.getRenderKitType_DisplayName()), //$NON-NLS-1$
-				new IconTranslator("icon", facesPackage.getRenderKitType_Icon()), //$NON-NLS-1$
-				new RenderKitIdTranslator("render-kit-id", facesPackage.getRenderKitType_RenderKitId()), //$NON-NLS-1$
-				new RenderKitClassTranslator("render-kit-class", facesPackage.getRenderKitType_RenderKitClass()), //$NON-NLS-1$
-				new RendererTranslator("renderer", facesPackage.getRenderKitType_Renderer()), //$NON-NLS-1$
-				new ClientBehaviorRendererTranslator("client-behavior-renderer", facesPackage.getRenderKitType_ClientBehaviorRenderer()), //$NON-NLS-1$
-                new RenderKitExtensionTranslator("render-kit-extension", facesPackage.getRenderKitType_RenderKitExtension()), //$NON-NLS-1$
-				new Translator("id", facesPackage.getRenderKitType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/RendererClassTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/RendererClassTranslator.java
deleted file mode 100644
index c870bb1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/RendererClassTranslator.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * Translator for renderer class
- *
- */
-public class RendererClassTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public RendererClassTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getRendererClassType_TextContent()),
-			new Translator("id", facesPackage.getRendererClassType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/RendererExtensionTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/RendererExtensionTranslator.java
deleted file mode 100644
index 24d900f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/RendererExtensionTranslator.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - fixed getChildren()
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-
-/**
- * @author xnjiang, itrimble
- *
- */
-public class RendererExtensionTranslator extends ExtensionTypeTranslator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public RendererExtensionTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/RendererTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/RendererTranslator.java
deleted file mode 100644
index 9175d48..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/RendererTranslator.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - fixed getChildren()
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xjiang, itrimble
- *
- */
-public class RendererTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public RendererTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-				new DescriptionTranslator("description", facesPackage.getRendererType_Description()), //$NON-NLS-1$
-				new DisplayNameTranslator("display-name", facesPackage.getRendererType_DisplayName()), //$NON-NLS-1$
-				new IconTranslator("icon", facesPackage.getRendererType_Icon()), //$NON-NLS-1$
-				new ComponentFamilyTranslator("component-family", facesPackage.getRendererType_ComponentFamily()), //$NON-NLS-1$
-				new RendererTypeTranslator("renderer-type", facesPackage.getRendererType_RendererType()), //$NON-NLS-1$
-				new RendererClassTranslator("renderer-class", facesPackage.getRendererType_RendererClass()), //$NON-NLS-1$
-				new FacetTranslator("facet", facesPackage.getRendererType_Facet()), //$NON-NLS-1$
-				new AttributeTranslator("attribute", facesPackage.getRendererType_Attribute()), //$NON-NLS-1$
-				new RendererExtensionTranslator("renderer-extension", facesPackage.getRendererType_RendererExtension()), //$NON-NLS-1$
-				new Translator("id", facesPackage.getRendererType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/RendererTypeTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/RendererTypeTranslator.java
deleted file mode 100644
index c2a0880..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/RendererTypeTranslator.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * Translator for the renderer type
- *
- */
-public class RendererTypeTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public RendererTypeTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getRendererTypeType_TextContent()),
-			new Translator("id", facesPackage.getRendererTypeType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ResourceBundleTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ResourceBundleTranslator.java
deleted file mode 100644
index 39b3937..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ResourceBundleTranslator.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * Translator for resource bundle element 
- *
- */
-public class ResourceBundleTranslator extends Translator {
-
-    /**
-     * @param domNameAndPath
-     * @param feature
-     */
-    public ResourceBundleTranslator(String domNameAndPath,
-            EStructuralFeature feature) {
-        super(domNameAndPath, feature);
-    }
-
-    protected Translator[] getChildren() {
-        
-        FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-        return new Translator[] {
-            new DescriptionTranslator("description", facesPackage.getResourceBundleType_Description()), //$NON-NLS-1$
-            new DisplayNameTranslator("display-name", facesPackage.getResourceBundleType_DisplayName()), //$NON-NLS-1$
-            new IconTranslator("icon", facesPackage.getResourceBundleType_Icon()), //$NON-NLS-1$
-            new BaseNameTranslator("base-name", facesPackage.getResourceBundleType_BaseName()), //$NON-NLS-1$
-            new VarTranslator("var", facesPackage.getResourceBundleType_Var()), //$NON-NLS-1$
-            new Translator("id", facesPackage.getResourceBundleType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-        };
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ResourceHandlerTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ResourceHandlerTranslator.java
deleted file mode 100644
index a6db8cb..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ResourceHandlerTranslator.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xnjiang
- *
- */
-public class ResourceHandlerTranslator extends Translator {
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public ResourceHandlerTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/*  (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getResourceHandlerType_TextContent()),
-			new Translator("id", facesPackage.getResourceHandlerType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/SkipUnknownChildrenTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/SkipUnknownChildrenTranslator.java
deleted file mode 100644
index 79c4b6e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/SkipUnknownChildrenTranslator.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * SkipUnknownChildrenTranslator has been implemented to temporarily allow
- * processing of application configuration resource files containing extension
- * elements (those defined with a content type of "ANY"); it essentially skips
- * all processing of child elements for which no child Translator has been
- * defined. This is not intended as a long-term solution.
- * 
- * @author Ian Trimble - Oracle
- */
-public class SkipUnknownChildrenTranslator extends Translator {
-
-	/**
-	 * Creates an instance.
-	 * 
-	 * @param domNameAndPath DOM name and path for which this Translator is
-	 * to be used.
-	 * @param aFeature EStructuralFeature instance for which this Translator is
-	 * to be used (may be null).
-	 */
-	public SkipUnknownChildrenTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#findChild(java.lang.String, java.lang.Object, int)
-	 */
-	public Translator findChild(String tagName, Object target, int versionID) {
-		Translator childTranslator = super.findChild(tagName, target, versionID);
-		if (childTranslator == null) {
-			childTranslator = new SkipUnknownChildrenTranslator(tagName, (EStructuralFeature)null);
-		}
-		return childTranslator;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/SmallIconTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/SmallIconTranslator.java
deleted file mode 100644
index f0d1859..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/SmallIconTranslator.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * Translator for the small icon property
- *
- */
-public class SmallIconTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public SmallIconTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getSmallIconType_TextContent()),
-			new Translator("id", facesPackage.getSmallIconType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/SourceClassTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/SourceClassTranslator.java
deleted file mode 100644
index 62ca65b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/SourceClassTranslator.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xnjiang
- *
- */
-public class SourceClassTranslator extends Translator {
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public SourceClassTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/*  (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getSourceClassType_TextContent()),
-			new Translator("id", facesPackage.getSourceClassType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/StateManagerTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/StateManagerTranslator.java
deleted file mode 100644
index 01bd027..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/StateManagerTranslator.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - added id attribute
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xjiang, itrimble
- *
- */
-public class StateManagerTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public StateManagerTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getStateManagerType_TextContent()),
-			new Translator("id", facesPackage.getStateManagerType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/SuggestedValueTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/SuggestedValueTranslator.java
deleted file mode 100644
index ffa16fa..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/SuggestedValueTranslator.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * Translator for the suggested value property
- *
- */
-public class SuggestedValueTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public SuggestedValueTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getSuggestedValueType_TextContent()),
-			new Translator("id", facesPackage.getSuggestedValueType_Id(), DOM_ATTRIBUTE)//$NON-NLS-1$
-		};
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/SupportedLocaleTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/SupportedLocaleTranslator.java
deleted file mode 100644
index 5d4183c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/SupportedLocaleTranslator.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - added id attribute
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xnjiang, itrimble
- *
- */
-public class SupportedLocaleTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public SupportedLocaleTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getSupportedLocaleType_TextContent()),
-			new Translator("id", facesPackage.getSupportedLocaleType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/SystemEventClassTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/SystemEventClassTranslator.java
deleted file mode 100644
index ada4185..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/SystemEventClassTranslator.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xnjiang
- *
- */
-public class SystemEventClassTranslator extends Translator {
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public SystemEventClassTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/*  (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getSystemEventClassType_TextContent()),
-			new Translator("id", facesPackage.getSystemEventClassType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/SystemEventListenerClassTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/SystemEventListenerClassTranslator.java
deleted file mode 100644
index 055ca64..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/SystemEventListenerClassTranslator.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xnjiang
- *
- */
-public class SystemEventListenerClassTranslator extends Translator {
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public SystemEventListenerClassTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/*  (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getSystemEventListenerClassType_TextContent()),
-			new Translator("id", facesPackage.getSystemEventListenerClassType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/SystemEventListenerTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/SystemEventListenerTranslator.java
deleted file mode 100644
index bf25c60..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/SystemEventListenerTranslator.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xnjiang
- *
- */
-public class SystemEventListenerTranslator extends Translator {
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public SystemEventListenerTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/*  (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new SystemEventListenerClassTranslator("system-event-listener-class", facesPackage.getSystemEventListenerType_SystemEventListenerClass()), //$NON-NLS-1$
-			new SystemEventClassTranslator("system-event-class", facesPackage.getSystemEventListenerType_SystemEventClass()), //$NON-NLS-1$
-			new SourceClassTranslator("source-class", facesPackage.getSystemEventListenerType_SourceClass()), //$NON-NLS-1$
-			new Translator("id", facesPackage.getSystemEventListenerType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/TagHandlerDelegateFactoryTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/TagHandlerDelegateFactoryTranslator.java
deleted file mode 100644
index 1d55b43..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/TagHandlerDelegateFactoryTranslator.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xnjiang
- *
- */
-public class TagHandlerDelegateFactoryTranslator extends Translator {
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public TagHandlerDelegateFactoryTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/*  (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getTagHandlerDelegateFactoryType_TextContent()),
-			new Translator("id", facesPackage.getTagHandlerDelegateFactoryType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ToViewIdTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ToViewIdTranslator.java
deleted file mode 100644
index 2eb3084..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ToViewIdTranslator.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * Translator for the toviewid property
- *
- */
-public class ToViewIdTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public ToViewIdTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getToViewIdType_TextContent()),
-			new Translator("id", facesPackage.getToViewIdType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ValidatorClassTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ValidatorClassTranslator.java
deleted file mode 100644
index 5c74f34..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ValidatorClassTranslator.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * Translator for the validator class property
- *
- */
-public class ValidatorClassTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public ValidatorClassTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getValidatorClassType_TextContent()),
-			new Translator("id", facesPackage.getValidatorClassType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ValidatorExtensionTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ValidatorExtensionTranslator.java
deleted file mode 100644
index 7e668e1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ValidatorExtensionTranslator.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-
-/**
- * Translator for the validator extension
- *
- */
-public class ValidatorExtensionTranslator extends ExtensionTypeTranslator 
-{
-    /**
-     * @param domNameAndPath
-     * @param feature
-     */
-    public ValidatorExtensionTranslator(String domNameAndPath,
-            EStructuralFeature feature) {
-        super(domNameAndPath, feature);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ValidatorIdTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ValidatorIdTranslator.java
deleted file mode 100644
index 34a07fd..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ValidatorIdTranslator.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * Translator for the validator id
- *
- */
-public class ValidatorIdTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public ValidatorIdTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getValidatorIdType_TextContent()),
-			new Translator("id", facesPackage.getValidatorIdType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ValidatorTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ValidatorTranslator.java
deleted file mode 100644
index 13ec22e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ValidatorTranslator.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - fixed getChildren()
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xjiang, itrimble
- *
- */
-public class ValidatorTranslator extends Translator {
-	
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public ValidatorTranslator(String domNameAndPath,EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature);
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new DescriptionTranslator("description", facesPackage.getValidatorType_Description()), //$NON-NLS-1$
-			new DisplayNameTranslator("display-name", facesPackage.getValidatorType_DisplayName()), //$NON-NLS-1$
-			new IconTranslator("icon", facesPackage.getValidatorType_Icon()), //$NON-NLS-1$
-			new ValidatorIdTranslator("validator-id", facesPackage.getValidatorType_ValidatorId()), //$NON-NLS-1$
-			new ValidatorClassTranslator("validator-class", facesPackage.getValidatorType_ValidatorClass()), //$NON-NLS-1$
-			new AttributeTranslator("attribute", facesPackage.getValidatorType_Attribute()), //$NON-NLS-1$
-			new PropertyTranslator("property", facesPackage.getValidatorType_Property()), //$NON-NLS-1$
-            new ValidatorExtensionTranslator("validator-extension", facesPackage.getValidatorType_ValidatorExtension()), //$NON-NLS-1$
-			new Translator("id", facesPackage.getValidatorType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ValueClassTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ValueClassTranslator.java
deleted file mode 100644
index 9bed430..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ValueClassTranslator.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * Translator for the value class
- *
- */
-public class ValueClassTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public ValueClassTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getValueClassType_TextContent()),
-			new Translator("id", facesPackage.getValueClassType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ValueTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ValueTranslator.java
deleted file mode 100644
index dfca7ce..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ValueTranslator.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - added is attribute
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xnjiang, itrimble
- *
- */
-public class ValueTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public ValueTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getValueType_TextContent()),
-			new Translator("id", facesPackage.getValueType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/VarTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/VarTranslator.java
deleted file mode 100644
index 0062415..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/VarTranslator.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * Translator for the var
- *
- */
-public class VarTranslator extends Translator {
-    /**
-     * @param domNameAndPath
-     * @param feature
-     */
-    public VarTranslator(String domNameAndPath, EStructuralFeature feature) {
-        super(domNameAndPath, feature, END_TAG_NO_INDENT);
-    }
-
-    public Translator[] getChildren()
-    {
-        FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-
-        return new Translator[] {
-            new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getVarType_TextContent()),
-            new Translator("id", facesPackage.getVarType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-        };
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/VariableResolverTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/VariableResolverTranslator.java
deleted file mode 100644
index 96c1eef..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/VariableResolverTranslator.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - added id attribute
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xjiang, itrimble
- *
- */
-public class VariableResolverTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public VariableResolverTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getVariableResolverType_TextContent()),
-			new Translator("id", facesPackage.getVariableResolverType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ViewDeclarationLanguageFactoryTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ViewDeclarationLanguageFactoryTranslator.java
deleted file mode 100644
index c6558dc..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ViewDeclarationLanguageFactoryTranslator.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xnjiang
- *
- */
-public class ViewDeclarationLanguageFactoryTranslator extends Translator {
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public ViewDeclarationLanguageFactoryTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/*  (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getViewDeclarationLanguageFactoryType_TextContent()),
-			new Translator("id", facesPackage.getViewDeclarationLanguageFactoryType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ViewHandlerTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ViewHandlerTranslator.java
deleted file mode 100644
index 655c548..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ViewHandlerTranslator.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - added id attribute
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xjiang, itrimble
- *
- */
-public class ViewHandlerTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public ViewHandlerTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getViewHandlerType_TextContent()),
-			new Translator("id", facesPackage.getViewHandlerType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/VisitContextFactoryTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/VisitContextFactoryTranslator.java
deleted file mode 100644
index e3fb8ce..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/VisitContextFactoryTranslator.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xnjiang
- *
- */
-public class VisitContextFactoryTranslator extends Translator {
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public VisitContextFactoryTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/*  (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getVisitContextFactoryType_TextContent()),
-			new Translator("id", facesPackage.getVisitContextFactoryType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/package-info.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/package-info.java
deleted file mode 100644
index f5d82ab..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/package-info.java
+++ /dev/null
@@ -1,16 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-/**
- * Not considered an API package and will be made internal in the MANIFEST in some future release
- */
-package org.eclipse.jst.jsf.facesconfig;
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/FacesConfigArtifactEdit.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/FacesConfigArtifactEdit.java
deleted file mode 100644
index 9cafba1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/FacesConfigArtifactEdit.java
+++ /dev/null
@@ -1,259 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.util;
-
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType;
-import org.eclipse.wst.common.componentcore.ArtifactEdit;
-import org.eclipse.wst.common.componentcore.internal.ArtifactEditModel;
-import org.eclipse.wst.common.componentcore.resources.IVirtualFile;
-import org.eclipse.wst.common.componentcore.resources.IVirtualResource;
-import org.eclipse.wst.xml.core.internal.emf2xml.EMF2DOMSSERenderer;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-
-
-/**
- * The artifact edit for the JSF Application Configuration (faces-config) model - may be used but not extended by clients.
- * 
- * This class maybe refactored to a different package in the future.
- */
-public final class FacesConfigArtifactEdit extends ArtifactEdit {
-
-	private static final String EDIT_MODEL_ID = "jsf.facesconfig"; //$NON-NLS-1$
-
-	private String sFileName = null;
-	private FacesConfigType facesConfig = null;
-	private URI facesConfigURI = URI.createURI(IFacesConfigConstants.FACES_CONFIG_URI);
-	private boolean bRegistered = false;
-
-	/**
-	 * @param aProject
-	 * @param toAccessAsReadOnly
-	 * @throws IllegalArgumentException
-	 */
-	public FacesConfigArtifactEdit(IProject aProject, boolean toAccessAsReadOnly) throws IllegalArgumentException {
-		super(aProject, toAccessAsReadOnly, false, EDIT_MODEL_ID);
-	}
-
-	/**
-	 * @param aProject
-	 * @param sConfigFile
-	 * @return the faces config artifact for the file config file sConfig in project aProject.
-	 * Opened only for read access (no write)
-	 */
-	public static FacesConfigArtifactEdit getFacesConfigArtifactEditForRead(IProject aProject, String sConfigFile) {
-		FacesConfigArtifactEdit artifactEdit = null;
-		try {
-			artifactEdit = new FacesConfigArtifactEdit(aProject, true);
-			if (artifactEdit != null) {
-				artifactEdit.setFilename(sConfigFile);
-			}
-		} catch (IllegalArgumentException iae) {
-            // suppress illegal argument exception
-            FacesConfigPlugin.write(iae);
-		}
-		return artifactEdit;
-	}
-	/**
-	 * @param aProject
-	 * @return the default artifact edit
-     * @deprecated Use getFacesConfigArtifactEditForRead(IProject, String) instead. This
-     * method is dangerous because the caller is assuming that the "default"
-     * model exists and knows nothing about where it is coming from.
-	 */
-	public static FacesConfigArtifactEdit getFacesConfigArtifactEditForRead(IProject aProject) {
-		return getFacesConfigArtifactEditForRead(aProject, null);
-	}
-
-    /**
-     * @param aProject
-     * @param sConfigFile
-     * @return the faces config artifact for the file config file sConfig in project aProject.
-     * Opened for both write and read access
-     */	
-	public static FacesConfigArtifactEdit getFacesConfigArtifactEditForWrite(IProject aProject, String sConfigFile) {
-		FacesConfigArtifactEdit artifactEdit = null;
-		try {
-			artifactEdit = new FacesConfigArtifactEdit(aProject, false);
-			if (artifactEdit != null) {
-				artifactEdit.setFilename(sConfigFile);
-			}
-		} catch (IllegalArgumentException iae) {
-            // suppress illegal argument exception
-            FacesConfigPlugin.write(iae);
-		}
-		return artifactEdit;
-	}
-
-	/**
-	 * @param aProject
-	 * @return the default artifact edit for read
-     * @deprecated Use getFacesConfigArtifactEditForWrite(IProject, String) 
-     * instead. This method is dangerous because the caller is assuming that
-     * the "default" model exists and knows nothing about where it is coming
-     * from.
-	 */
-	public static FacesConfigArtifactEdit getFacesConfigArtifactEditForWrite(IProject aProject) {
-		return getFacesConfigArtifactEditForWrite(aProject, null);
-	}
-
-	/**
-	 * @return the root model object for this artifact edit model
-	 */
-	public FacesConfigType getFacesConfig() {
-		if (facesConfig == null) {
-			// TODO: XN - does not seem a good way to check whether the resource has been registered each time.
-			// The following comment is from StrutsArchfactEdit:
-			// This is a hack to ensure that our Resource.Factory is used to
-			// create
-			// the Resource. It's the same hack used by JaxRPCMapArtifactEdit.
-			// The problem is that there is no way to register a Resource.Factory
-			// by, say, content type.
-			// The best we can do is register by last file segment, which isn't
-			// strictly correct.
-			// Plus, there's no way to deregister.
-			if (sFileName != null) {
-				if (!bRegistered) {
-				//if (FacesConfigResourceFactory.getRegisteredFactory(URI.createURI(sFileName)) == null) {
-					FacesConfigResourceFactory.register(sFileName);
-					bRegistered = true;
-				}
-			}
-			facesConfig = (FacesConfigType)getDeploymentDescriptorRoot(); 
-		}
-		return facesConfig;
-	}
-	
-	/**
-	 * @return the uri pointing to the source of this faces config artifact
-	 */
-	public URI getFacesConfigURI() {
-		return facesConfigURI;
-	}
-
-    /**
-     * @return the model root
-     */
-    public EObject getDeploymentDescriptorRoot()
-    {
-        Resource deploymentDescriptorResource = getDeploymentDescriptorResource();
-        if (deploymentDescriptorResource != null)
-        {
-            List contents = deploymentDescriptorResource.getContents();
-            if (contents.size() > 0)
-            {
-                return (EObject) contents.get(0);
-            }
-        }
-        return null;
-        // TODO: XN
-        // addFacesConfigIfNecessary((IFacesConfigResource)getDeploymentDescriptorResource());
-        // return (EObject) contents.get(0);
-    }
-
-	/**
-	 * @return the EMF resource retrieved for this artifact's uri or null if
-	 * this descriptor has not resource.
-	 */
-	public Resource getDeploymentDescriptorResource() {
-		if (sFileName != null) {
-			facesConfigURI = URI.createURI(sFileName);
-		} else {// default is "WEB-INF/faces-config.xml"
-			facesConfigURI = URI.createURI(IFacesConfigConstants.FACES_CONFIG_URI);
-		}
-		final ArtifactEditModel artifactEditModel = getArtifactEditModel();
-		if (artifactEditModel != null)
-		{
-		    return artifactEditModel.getResource(facesConfigURI);
-		}
-		return null;
-	}
-
-	/**
-	 * Sets an instance's filename, used to create a URI and load a model.
-	 * 
-	 * @param filename This instance's filename.
-	 */
-	public void setFilename(String filename) {
-		sFileName = filename;
-		if (filename != null && filename.length() > 0) {
-			facesConfigURI = URI.createURI(filename);
-		}
-	}
-
-	// TODO: appears to be dead
-//	protected void addFacesConfigIfNecessary(TranslatorResource aResource) {
-//		//TO: XN - See how to create one if the config file does not exist
-//		/*if (aResource != null) {
-//		    if(aResource.getContents() == null || aResource.getContents().isEmpty()) {
-//		        FacesConfigType facesConfigNew = WebapplicationFactory.eINSTANCE.createWebApp();
-//				aResource.getContents().add(facesConfigNew);
-//				aResource.setModified(true);
-//		    } 
-//		    FacesConfigType facesConfig = (FacesConfigType)aResource.getContents().get(0);
-//			URI moduleURI = getArtifactEditModel().getModuleURI();
-//			try {
-//				facesConfig.setDisplayName(StructureEdit.getDeployedName(moduleURI));
-//			} catch (UnresolveableURIException e) {
-//				//Ignore
-//			}
-//			aResource.setID(facesConfig, J2EEConstants.WEBAPP_ID);
-//	
-//			try{
-//				aResource.saveIfNecessary();
-//			}catch(Exception e){
-//				e.printStackTrace();
-//			}
-//		}*/
-//	}
-
-	/**
-	 * @return the DOM model for the Struts config. file.
-	 */
-	public IDOMModel getIDOMModel() {
-		// Modeled after SourceNestedEditorPage.getXMLModelFromResource().
-		// TODO - XN This is a little hackish because it depends on the resource's
-		// renderer being an EMF2DOMSedRenderer (which it is, but that could
-		// change).
-		Resource resource = getDeploymentDescriptorResource();
-		if (resource instanceof IFacesConfigResource) {
-			EMF2DOMSSERenderer renderer = (EMF2DOMSSERenderer) 
-			    ((IFacesConfigResource)resource).getRenderer();
-			return renderer.getXMLModel();
-		}
-		return null;
-	}
-
-	/**
-	 * @return the IFile used to load the model or null if none.
-	 */
-	public IFile getFile() {
-		IVirtualResource resource = getComponent().getRootFolder().findMember(facesConfigURI.toString());
-		if ((resource != null) && (resource.getType() == IVirtualResource.FILE))
-			return ((IVirtualFile) resource).getUnderlyingFile();
-		return null;
-	}
-    
-    /**
-     * @return true if the underlying model has been disposed
-     */
-    public boolean isDisposed()
-    {
-        return getArtifactEditModel().isDisposed();
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/FacesConfigChangeEvent.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/FacesConfigChangeEvent.java
deleted file mode 100644
index ecbc42e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/FacesConfigChangeEvent.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.util;
-
-/**
- * This class should NOT be referenced or extended by clients.
- * 
- * @author xnjiang
- *
- */
-final class FacesConfigChangeEvent implements IFacesConfigChangeEvent {
-
-	private boolean bManagedBeandChanged = true;
-	private boolean bNavigationRuleChanged = true;
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.facesconfig.IFacesConfigChangeEvent#isManagedBeanChanged()
-	 */
-	public boolean isManagedBeanChanged() {
-		return bManagedBeandChanged;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.facesconfig.IFacesConfigChangeEvent#isNavigationRuleChanged()
-	 */
-	public boolean isNavigationRuleChanged() {
-		return bNavigationRuleChanged;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/FacesConfigResourceFactory.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/FacesConfigResourceFactory.java
deleted file mode 100644
index d8ba4c9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/FacesConfigResourceFactory.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.util;
-
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.wst.common.componentcore.internal.impl.WTPResourceFactoryRegistry;
-import org.eclipse.wst.common.internal.emf.resource.EMF2DOMRendererFactory;
-import org.eclipse.wst.common.internal.emf.resource.Renderer;
-import org.eclipse.wst.common.internal.emf.resource.RendererFactory;
-import org.eclipse.wst.common.internal.emf.resource.TranslatorResource;
-import org.eclipse.wst.common.internal.emf.resource.TranslatorResourceFactory;
-
-/**
- * May be referenced but should NOT be extended by clients
- * 
- * @author xjiang
- *
- */
-public final class FacesConfigResourceFactory extends TranslatorResourceFactory 
-{
-    /**
-     * @return a faces config resource factory for use with faces-config
-     * files contained in JARs
-     */
-    public static FacesConfigResourceFactory createResourceFactoryForJar()
-    {
-        return new FacesConfigResourceFactory(EMF2DOMRendererFactory.INSTANCE);
-    }
-    
-	/**
-	 * Construct a faces resource factory.
-	 * 
-	 * @param rendererFactory 
-	 */
-	protected FacesConfigResourceFactory(RendererFactory rendererFactory) {
-		super(rendererFactory);
-	}
-
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.TranslatorResourceFactory#createResource(org.eclipse.emf.common.util.URI)
-	 */
-	protected TranslatorResource createResource(URI uri, Renderer aRenderer) {
-		return new FacesConfigResourceImpl(uri, aRenderer);
-	}
-	
-	/**
-	 * Method registerDtds.
-	 */
-	public static void registerDtds() {
-	    // TODO: should we be registering dtd/xsd here?
-	    // how does MyEntityResolver in the resource affect this (see https://bugs.eclipse.org/bugs/show_bug.cgi?id=154439)
-	}
-
-	/**
-	 * register using the default renderer factory.
-	 * @see #registerWith(String, FacesRendererFactory)
-	 */
-	public static void register() {
-		register((String)null);
-	}
-
-	/**
-	 * Register the sFileName with the default renderer factory
-	 * @param sFileName
-	 */
-	public static void register(String sFileName) {
-		registerWith(sFileName, FacesRendererFactory.INSTANCE);
-	}
-
-	/**
-	 * Register myself with the Resource.Factory.Registry
-	 * @param sFileName 
-	 * @param aRendererFactory 
-	 */
-	private static void registerWith(String sFileName, FacesRendererFactory aRendererFactory) {
-		if (sFileName != null) {
-			WTPResourceFactoryRegistry.INSTANCE.registerLastFileSegment(sFileName, new FacesConfigResourceFactory(FacesRendererFactory.INSTANCE));
-		} else {
-			WTPResourceFactoryRegistry.INSTANCE.registerLastFileSegment("faces-config.xml", new FacesConfigResourceFactory(FacesRendererFactory.INSTANCE)); //$NON-NLS-1$
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/FacesConfigResourceImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/FacesConfigResourceImpl.java
deleted file mode 100644
index 2fc096b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/FacesConfigResourceImpl.java
+++ /dev/null
@@ -1,133 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.util;
-
-import java.io.IOException;
-
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType;
-import org.eclipse.jst.jsf.facesconfig.internal.translator.FacesConfigTranslator;
-import org.eclipse.wst.common.internal.emf.resource.Renderer;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-import org.eclipse.wst.common.internal.emf.resource.TranslatorResourceImpl;
-import org.eclipse.wst.common.uriresolver.internal.provisional.URIResolver;
-import org.eclipse.wst.common.uriresolver.internal.provisional.URIResolverPlugin;
-import org.xml.sax.EntityResolver;
-import org.xml.sax.InputSource;
-import org.xml.sax.SAXException;
-
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Resource </b> associated with the package - NOT intended for external use.
- * Should not be used or implemented by external clients
- * 
- * <!-- end-user-doc -->
- * @see FacesConfigResourceFactory
- * @generated
- */
-public class FacesConfigResourceImpl extends TranslatorResourceImpl implements IFacesConfigResource {
-
-	/**
-	 * Local entity resolver used to help loading entities - NOT intended for external use.
-	 * Should not be used or implemented by external clients
-	 */
-	public static class MyEntityResolver implements EntityResolver {
-
-		private final String baseLocation;
-		private URIResolver uriResolver = null;
-		
-		/**
-		 * @param baseLocation
-		 */
-		public MyEntityResolver(String baseLocation) {
-			super();
-			this.baseLocation = baseLocation;
-		}
-
-		public InputSource resolveEntity(String publicId, String systemId)
-				throws SAXException, IOException {
-			if (uriResolver == null) {
-				uriResolver = URIResolverPlugin.createResolver();
-			}
-			String logicalLocation = uriResolver.resolve(baseLocation, publicId, systemId);
-			String physicalLocation= uriResolver.resolvePhysicalLocation(baseLocation, publicId, logicalLocation);
-			return new InputSource(physicalLocation);		
-		}
-
-	}
-	
-	private EntityResolver entityResolver = null;
-	
-	/**
-	 * @param aRenderer
-	 */
-	public FacesConfigResourceImpl(Renderer aRenderer) {
-		super(aRenderer);
-	}
-	/**
-	 * @param uri
-	 * @param aRenderer
-	 */
-	public FacesConfigResourceImpl(URI uri, Renderer aRenderer) {
-		super(uri, aRenderer);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.TranslatorResource#getDoctype()
-	 */
-	public String getDoctype() {
-		return null;
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.TranslatorResource#getRootTranslator()
-	 */
-	public Translator getRootTranslator() {
-		return FacesConfigTranslator.INSTANCE; 
-
-	}
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.jsf.emf.facesconfig.xml.FacesConfigResource#getFacesConfig()
-     */
-    public FacesConfigType getFacesConfig() {
-		return (FacesConfigType) getRootObject();
-    }
-    
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.TranslatorResourceImpl#getDefaultPublicId()
-	 */
-	protected String getDefaultPublicId() {
-		return "-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.0//EN"; //$NON-NLS-1$
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.TranslatorResourceImpl#getDefaultSystemId()
-	 */
-	protected String getDefaultSystemId() {
-		return "http://java.sun.com/dtd/web-facesconfig_1_0.dtd"; //$NON-NLS-1$
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.TranslatorResourceImpl#getDefaultVersionID()
-	 */
-	protected int getDefaultVersionID() {
-		return 0;
-	}
-	public EntityResolver getEntityResolver() {
-		if (entityResolver == null) {
-			String baseLocation = getURI().toString();
-			entityResolver = new MyEntityResolver(baseLocation);
-		}
-		return entityResolver;
-	}
-	public void setURI(URI arg0) {
-		super.setURI(arg0);
-		entityResolver = null;
-	}
-} //FacesConfigResourceFactoryImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/FacesConfigRestartServerResourceDeltaVisitor.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/FacesConfigRestartServerResourceDeltaVisitor.java
deleted file mode 100644
index 73d46bb..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/FacesConfigRestartServerResourceDeltaVisitor.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.util;
-
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Set;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IResourceDelta;
-import org.eclipse.core.resources.IResourceDeltaVisitor;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.wst.common.componentcore.internal.util.ComponentUtilities;
-import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
-
-/**
- * This class is NOT intended for external use.
- * 
- * @version $Id$
- */
-final class FacesConfigRestartServerResourceDeltaVisitor implements IResourceDeltaVisitor {
-
-	/** Set of IProjects. */
-	private Set components = new HashSet();
-
-	/**
-	 * @see org.eclipse.core.resources.IResourceDeltaVisitor#visit(org.eclipse.core.resources.IResourceDelta)
-	 */
-	public boolean visit(IResourceDelta delta) throws CoreException {
-
-		if (shouldCheckForRestartProject()) {
-			int kind = delta.getKind();
-			if ((kind == IResourceDelta.ADDED)
-					|| (kind == IResourceDelta.REMOVED)
-					|| ((kind == IResourceDelta.CHANGED) && ((delta.getFlags() & (IResourceDelta.CONTENT
-							| IResourceDelta.TYPE | IResourceDelta.SYNC | IResourceDelta.REPLACED)) != 0))) {
-				primCheckForRestartComponent(delta.getResource());
-			}
-		}
-
-		// Done.
-		return true;
-	}
-
-	private boolean shouldCheckForRestartProject() {
-		//TODO: XN: we don't have preference page for this?
-		//return FacesconfigPlugin.getPlugin().getFacesPreferences().getRestart();
-		return true;
-	}
-
-	private void primCheckForRestartComponent(IResource resource) {
-		if (resource.getType() == IResource.FILE) {
-			IFile file = (IFile) resource;
-			if (FacesConfigUtil.isFacesConfigFile(file)) {
-				IVirtualComponent component = ComponentUtilities.findComponent(file);
-				if (component != null) {
-					components.add(component);
-				}
-			}
-				
-		}
-	}
-
-	/**
-	 * @return the components
-	 */
-	public Collection getComponents() {
-		return components;
-	}
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/FacesConfigUtil.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/FacesConfigUtil.java
deleted file mode 100644
index 515ec06..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/FacesConfigUtil.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.util;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.content.IContentDescription;
-import org.eclipse.core.runtime.content.IContentType;
-
-/**
- * Utility class for faces-config model management
- * 
- * This class is NOT intended for external use.
- * 
- */
-final class FacesConfigUtil {
-
-	/** Must match the id specified in plugin.xml. */
-	public static final String FACES_CONFIG_CONTENT_TYPE_ID = "org.eclipse.jst.jsf.facesconfig.facesConfigFile"; //$NON-NLS-1$
-
-	/**
-	 * Returns true iff the specified file seems to be a Faces configuration
-	 * file. Always returns false if the file is in a non-Faces project.
-	 * 
-	 * @param file
-	 *            the IFile to check
-	 * @return true iff the specified file seems to be a Faces configuration
-	 *         file.
-	 */
-	public static boolean isFacesConfigFile(IFile file) {
-		return isFacesConfigFile(file, true);
-	}
-
-	/**
-	 * Returns true iff the specified file seems to be a Faces configuration
-	 * file. If ignoreNonFacesProject is true, always returns false if the file
-	 * is in a non-Faces project.
-	 * 
-	 * @param file
-	 *            the IFile to check
-	 * @param ignoreNonFacesProject
-	 * @return true iff the specified file seems to be a Faces configuration
-	 *         file.
-	 */
-	public static boolean isFacesConfigFile(IFile file, boolean ignoreNonFacesProject) {
-		
-		// Bail if it's not a .xml file.
-		if (!"xml".equalsIgnoreCase(file.getFileExtension())) //$NON-NLS-1$
-			return false;
-
-		// Bail if we can't determine the project. This shouldn't be possible
-		// here, but...
-		IProject project = file.getProject();
-		if (project == null)
-			return false;
-
-		// If requested, bail if the project isn't a Faces project.
-		// TODO: XN - temporarily disabled the following two lines to get rid 
-		// of the dependency on jsf.util
-		//if (ignoreNonFacesProject && !JsfProjectUtil.isJsfProject(project))
-			//return false;
-
-		try {
-			IContentDescription contentDescription = file.getContentDescription();
-			if (contentDescription != null) {
-				IContentType contentType = contentDescription.getContentType();
-				if (contentType != null)
-					return FACES_CONFIG_CONTENT_TYPE_ID.equals(contentType.getId());
-			}
-		} catch (CoreException ignored) {
-			// Empty block intended.
-		}
-
-		return false;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/FacesRendererFactory.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/FacesRendererFactory.java
deleted file mode 100644
index db93581..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/FacesRendererFactory.java
+++ /dev/null
@@ -1,221 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.util;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.jst.jsf.facesconfig.emf.DynamicElement;
-import org.eclipse.jst.jsf.facesconfig.internal.translator.IAnyTranslator;
-import org.eclipse.wst.common.internal.emf.resource.EMF2DOMAdapter;
-import org.eclipse.wst.common.internal.emf.resource.EMF2DOMRenderer;
-import org.eclipse.wst.common.internal.emf.resource.Renderer;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-import org.eclipse.wst.common.internal.emf.resource.TranslatorResource;
-import org.eclipse.wst.xml.core.internal.emf2xml.EMF2DOMSSEAdapter;
-import org.eclipse.wst.xml.core.internal.emf2xml.EMF2DOMSSERenderer;
-import org.eclipse.wst.xml.core.internal.emf2xml.EMF2DOMSSERendererFactory;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * This class should not be referenced or sub-classed externally.
- * 
- * The custom render factory for the Faces Config model EMF2DOM translations.
- * A singleton factory.
- */
-final class FacesRendererFactory extends EMF2DOMSSERendererFactory 
-{
-    /**
-     * The singleton factory instance.
-     */
-    @SuppressWarnings("hiding")
-    public static  FacesRendererFactory INSTANCE = new FacesRendererFactory();
-    
-    private FacesRendererFactory() {
-        super();
-    }
-
-    /**
-     * @see org.eclipse.wst.common.internal.emf.resource.RendererFactory#createRenderer()
-     */
-    public Renderer createRenderer() {
-        return new MyRenderer();
-    }
-
-    private static class MyRenderer extends EMF2DOMSSERenderer
-    {
-
-        protected EMF2DOMAdapter createRootDOMAdapter() 
-        {
-            return new MyEMF2DOMAdapterRoot(getResource(), document, this, getResource().getRootTranslator());
-        }
-    }
-    
-    /**
-     * Customized adapter that lets us inject arbitrary DOM children
-     * into for ANY elements
-     */
-    private static class MyEMF2DOMAdapterRoot extends EMF2DOMSSEAdapter
-    {
-
-        /**
-         * @param object
-         * @param node
-         * @param renderer
-         * @param translator
-         */
-        public MyEMF2DOMAdapterRoot(org.eclipse.emf.common.notify.Notifier object, Node node,
-                EMF2DOMRenderer renderer, Translator translator) {
-            super(object, node, renderer, translator);
-        }
-
-        /**
-         * @param node
-         * @param renderer
-         * @param translator
-         */
-        public MyEMF2DOMAdapterRoot(Node node, EMF2DOMRenderer renderer,
-                Translator translator) {
-            super(node, renderer, translator);
-        }
-
-        /**
-         * @param resource
-         * @param document
-         * @param renderer
-         * @param translator
-         */
-        public MyEMF2DOMAdapterRoot(TranslatorResource resource, Document document,
-                EMF2DOMRenderer renderer, Translator translator) {
-            super(resource, document, renderer, translator);
-        }
-
-        protected void initChildTranslators() {
-            // if this is an ANY translator, then we have prepend the list after
-            // initialization with any dynamic attribute translators
-            super.initChildTranslators();
-            
-            if (fTranslator instanceof IAnyTranslator)
-            {
-                final Translator[] dynamicAttrs =
-                    ((IAnyTranslator)fTranslator)
-                         .getDynamicAttributeTranslators(fNode);
-                
-                // avoid an array copy if not necessary
-                if (dynamicAttrs.length > 0)
-                {
-                    final Translator[] allTranslators =
-                        new Translator[childTranslators.length+dynamicAttrs.length];
-                    // prepend the dynamic attributes so they are queried first
-                    System.arraycopy(dynamicAttrs, 0, allTranslators, 0, dynamicAttrs.length);
-                    System.arraycopy(childTranslators, 0, allTranslators, dynamicAttrs.length, childTranslators.length);
-                    childTranslators = allTranslators;
-                }
-            }
-        }
-
-        protected Translator[] getChildTranslators() 
-        {
-            Translator[] translators = super.getChildTranslators();
-            // TODO: I'm thinking there must be a more efficient way to do this
-            if (fTranslator instanceof  IAnyTranslator)
-            {
-               EObject eObj = getEObject();
-               
-               if (eObj instanceof DynamicElement)
-               {
-                   List newArrayList = new ArrayList();
-                   Translator[] dynamicTranslators = 
-                       ((IAnyTranslator)fTranslator).getDynamicAttributeTranslators((DynamicElement)eObj);
-                   
-                   // loop through the dynamic translators and add any to the list
-                   // that aren't already there
-                   for (int i = 0; i < dynamicTranslators.length; i++)
-                   {
-                       Translator translator = dynamicTranslators[i];
-                       
-                       for (int j = 0; j < translators.length; j++)
-                       {
-                           final Translator testTranslator = translators[j];
-                           
-                           if (testTranslator.isDOMAttribute()
-                               // TODO: not fond of passing null, but the arg is ignored anyway (for now)
-                               && testTranslator.getDOMName(null).equals(translator.getDOMName(null)))
-                           {
-                               // null indicates found
-                               translator = null;
-                               break;
-                           }
-                        }
-                       
-                        // if not found, add to list
-                        if (translator != null)
-                        {
-                            newArrayList.add(translator);
-                        }
-                    }
-                   
-                    if (newArrayList.size() > 0)
-                    {
-                        newArrayList.addAll(Arrays.asList(translators));
-                        translators = (Translator[]) newArrayList.toArray(translators);
-                    }
-                }
-            }
-            
-            return translators;
-        }
-
-        protected List getDOMChildren(Node node, Translator map) 
-        {
-            if (map instanceof IAnyTranslator)
-            {
-                List children = new ArrayList();
-                
-                for (int i = 0; i < node.getChildNodes().getLength(); i++)
-                {
-                    Node child = node.getChildNodes().item(i);
-                    if (child.getNodeType() == Node.ELEMENT_NODE)
-                    {
-                        children.add(child);
-                    }
-                }
-                return children;
-            }
-            return super.getDOMChildren(node, map);
-        }
-        /**
-         * Create an adapter for a child DOM node
-         * 
-         * @param mofObject
-         *            org.w3c.dom.Node The node to create the adapter for.
-         */
-        protected EMF2DOMAdapter primCreateAdapter(EObject mofObject, Translator childMap) {
-            // TODO: this may only be necessary when childMap is an IAnyTranslator...
-            Element newNode = createNewNode(mofObject, childMap);
-            return new MyEMF2DOMAdapterRoot(mofObject, newNode, fRenderer, childMap);
-        }
-
-        /**
-         * Create an adapter for a child DOM node
-         * 
-         * @param node
-         *            org.w3c.dom.Node The node to create the adapter for.
-         */
-        protected EMF2DOMAdapter primCreateAdapter(Node node, Translator childMap) {
-            return new MyEMF2DOMAdapterRoot(node, fRenderer, childMap);
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/FacesResourceChangeListener.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/FacesResourceChangeListener.java
deleted file mode 100644
index c328f25..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/FacesResourceChangeListener.java
+++ /dev/null
@@ -1,361 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.util;
-
-import java.util.LinkedList;
-import java.util.ListIterator;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IResourceChangeEvent;
-import org.eclipse.core.resources.IResourceChangeListener;
-import org.eclipse.core.resources.IResourceDelta;
-import org.eclipse.core.resources.IResourceDeltaVisitor;
-import org.eclipse.core.resources.IResourceVisitor;
-import org.eclipse.core.resources.ISaveContext;
-import org.eclipse.core.resources.ISaveParticipant;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.QualifiedName;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.internal.Logger;
-import org.eclipse.ui.IEditorDescriptor;
-import org.eclipse.ui.IEditorRegistry;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.wst.common.componentcore.internal.util.ComponentUtilities;
-import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
-
-/**
- * This class is responsible for the following:
- * <ol>
- * <li>Ensure that the Struts nature is added to any project to which a Struts
- * config. file is added.</li>
- * <li>Ensure that the Struts nature is added to any project to which a diagram
- * file is added.</li>
- * <li>Restart project(s) if/as apporopriate when a Struts config. file is
- * modified.
- * </ol>
- * It arguably should be multiple classes, but the things it does are closely
- * related and splitting it up would result in duplicate work as well as
- * multiple delta traversals.
- * 
- * This class is not intended for external use. 
- * Should NOT be referenced or extended externally.
- */
-final class FacesResourceChangeListener implements IResourceChangeListener,
-		IResourceDeltaVisitor, ISaveParticipant, IResourceVisitor {
-
-	/** The singleton instance. */
-	private static FacesResourceChangeListener listener;
-	private static boolean restartInProgress = false;
-	private LinkedList facesConfigChangeListeners = new LinkedList();
-	
-	private static IPreferenceStore preferenceStore = null;
-
-	private static final QualifiedName EDITOR_KEY = new QualifiedName(
-			"org.eclipse.ui.internal.registry.ResourceEditorRegistry", "EditorProperty");//$NON-NLS-2$//$NON-NLS-1$
-
-	/** Start up the singleton instance. */
-	public static void startup() {
-
-		// Bail if we're already started.
-		if (listener != null)
-			return;
-
-		// Create the singleton instance.
-		listener = new FacesResourceChangeListener();
-
-		// Register as resource change listener.
-		ResourcesPlugin.getWorkspace().addResourceChangeListener(
-				listener,
-				IResourceChangeEvent.PRE_BUILD + IResourceChangeEvent.POST_BUILD);
-	}
-
-	/** Shutdown the singleton instance. */
-	public static void shutdown() {
-
-		// Bail if we're not started.
-		if (listener == null)
-			return;
-
-		// Deregister as save participant.
-		ResourcesPlugin.getWorkspace().removeSaveParticipant(FacesConfigPlugin.getPlugin().getBundle().getSymbolicName());
-
-		// Deregister as resource change listener.
-		ResourcesPlugin.getWorkspace().removeResourceChangeListener(listener);
-
-		// Dereference the singleton instance.
-		listener = null;
-	}
-
-	/**
-	 * Only this class can create instances.
-	 */
-	private FacesResourceChangeListener() {
-        // no local instantiation
-	}
-
-	/**
-	 * Process a resource change event. This should be invoked only from the
-	 * workbench.
-	 * 
-	 * @see IResourceChangeListener#resourceChanged(IResourceChangeEvent)
-	 */
-	public void resourceChanged(IResourceChangeEvent event) {
-
-		IResourceDelta delta = event.getDelta();
-		if (delta != null) {
-			FacesConfigChangeEvent facesConfigChangeEvent = new FacesConfigChangeEvent();
-			fireFacesConfigChangeEvent(facesConfigChangeEvent);
-
-			try {
-				delta.accept(this);
-			} catch (CoreException ignored) {
-				Logger.log(this, ignored);
-			}
-		}
-
-		// Restart projects, if necessary.
-		if ((delta != null) && (event.getType() == IResourceChangeEvent.POST_BUILD)) {
-			FacesConfigRestartServerResourceDeltaVisitor visitor = new FacesConfigRestartServerResourceDeltaVisitor();
-			try {
-				delta.accept(visitor);
-			} catch (CoreException ignored) {
-				Logger.log(this, ignored);
-			}
-			//restartComponents(visitor.getComponents());
-		}
-	}
-
-	/**
-	 * Visit a resource delta. This should be invoked only from the
-	 * IResourceDelta.accept() method invoked above.
-	 * 
-	 * @see IResourceDeltaVisitor#visit(IResourceDelta)
-	 */
-	public boolean visit(IResourceDelta delta) throws CoreException {
-
-		// Check for and handle it if it's a Struts config. file.
-		checkForFacesConfigFile(delta);
-
-		// Done.
-		return true;
-	}
-
-	private void checkForFacesConfigFile(IResourceDelta delta) {
-		boolean isAdded = delta.getKind() == IResourceDelta.ADDED;
-		if (isAdded
-				|| ((delta.getKind() == IResourceDelta.CHANGED) && ((delta.getFlags() & (IResourceDelta.CONTENT
-						| IResourceDelta.TYPE | IResourceDelta.SYNC | IResourceDelta.REPLACED)) != 0))) {
-			checkForFacesConfigFile(delta.getResource(), !isAdded);
-		}
-	}
-
-	private void checkForFacesConfigFile(IResource resource, boolean ignoreNonFacesProjects) {
-		if (resource.getType() == IResource.FILE) {
-
-			// See if the file is a Struts config. file.
-			// If the file was just added, we check the file regardless of
-			// whether or not it is in a Struts project.
-			// Otherwise, a file in a non-Struts project is considered to not be
-			// a Struts config. file.
-			IFile file = (IFile) resource;
-			if (FacesConfigUtil.isFacesConfigFile(file, ignoreNonFacesProjects)) {
-
-				// Ensure that the project has the Struts nature.
-				// TODO:
-				// StrutsNatureRuntime.ensureProjectHasStrutsNature(file.getProject());
-				IVirtualComponent component = ComponentUtilities.findComponent(file);
-				if (component != null) {
-					restartServerIfNecessary(component);
-					// Try to register the SCFE as the default editor.
-					setRegistration(file);
-				}
-			} else {
-				// Try to unregister the SCFE as the default editor.
-				unsetRegistration(file);
-			}
-		}
-	}
-
-	/**
-	 * Look to see if the persisted resource level property keyed by EDITOR_KEY
-	 * has ben set yet. If not then set it to the SCFE.
-	 * 
-	 * @param file
-	 *            The FCF
-	 */
-	private void setRegistration(IFile file) {
-		String editorID = null;
-		try {
-			editorID = file.getPersistentProperty(EDITOR_KEY);
-		} catch (CoreException e) {
-            // suppress core exception
-		}
-		if (editorID == null) {
-			try {
-				file.setPersistentProperty(EDITOR_KEY, FacesConfigPlugin.FACES_CONFIG_EDITOR_ID);
-			} catch (CoreException e) {
-				Logger.log(file, "Failed to set the vcurrent editor to SCFE", e); //$NON-NLS-1$
-			}
-		}
-	}
-
-	private void unsetRegistration(IFile file) {
-		// If the default editor for this file is not the Struts config. editor,
-		// then we're done.
-		IEditorRegistry registry = PlatformUI.getWorkbench().getEditorRegistry();
-		IEditorDescriptor userEditor = registry.getDefaultEditor(file.getFullPath().toString());
-		if ((userEditor == null)
-				|| !FacesConfigPlugin.FACES_CONFIG_EDITOR_ID.equals(userEditor.getId())) {
-			traceFiner(file, "Not unsetting: Default already not Faces config. editor"); //$NON-NLS-1$
-			return;
-		}
-
-		// Make the Struts config. editor the default.
-		traceFiner(file, "Unsetting."); //$NON-NLS-1$
-		IEditorDescriptor[] editors = registry.getEditors(file.getFullPath().toString());
-		if (editors.length > 1) {
-			registry.setDefaultEditor(file.getFullPath().toString(), editors[1].getId());
-		}
-	}
-
-	//private boolean isRestarting = false;
-	//private Collection restartableComponents = new HashSet();
-
-/*	private void restartComponents(Collection components) {
-		restartableComponents.addAll(components);
-		if (!isRestarting) {
-			isRestarting = true;
-			try {
-				while (!restartableComponents.isEmpty()) {
-					IVirtualComponent component = (IVirtualComponent) restartableComponents.iterator().next();
-					try {
-						ServerRestartUtil.restartComponent(component, true);
-					} finally {
-						restartableComponents.remove(component);
-					}
-				}
-			} finally {
-				isRestarting = false;
-			}
-
-		}
-	}
-
-*/	private void traceFiner(IFile file, String message) {
-		String fileName = file.getProjectRelativePath().toString();
-		Logger.trace("FacesconfigPlugin", this, fileName + ": " + message); //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/** @see ISaveParticipant#doneSaving(ISaveContext) */
-	public void doneSaving(ISaveContext context) {
-        // nothing to do
-	}
-
-	/** @see ISaveParticipant#prepareToSave(ISaveContext) */
-	public void prepareToSave(ISaveContext context) throws CoreException {
-        // nothing to do
-	}
-
-	/** @see ISaveParticipant#rollback(ISaveContext) */
-	public void rollback(ISaveContext context) {
-	    // nothing to do
-	}
-
-	/** @see ISaveParticipant#saving(ISaveContext) */
-	public void saving(ISaveContext context) throws CoreException {
-		context.needDelta();
-	}
-
-	/**
-	 * Visit a resource. This should be invoked only from the
-	 * IResource.accept(IResourceVisitor) invocation, above.
-	 * 
-	 * @see IResourceVisitor#visit(IResource)
-	 */
-	public boolean visit(IResource resource) {
-
-		// Check for and handle a Struts config. file.
-		checkForFacesConfigFile(resource, true);
-
-		// Continue.
-		return true;
-	}
-
-	private void restartServerIfNecessary(IVirtualComponent component) {
-		if(!restartInProgress) {
-			// check against preference about whether to automatically restart
-			boolean restart = false;
-			if (FacesResourceChangeListener.preferenceStore != null) {
-				restart = FacesResourceChangeListener.preferenceStore.getBoolean(IFacesconfigPreferences.PREFSKEY_SERVER_RESTART);
-			}
-			if(restart) {
-				restartInProgress = true;
-				// we'll ask that just the containing EAR is restarted, but it may cycle the whole server if running on Portal
-
-				//ServerRestartUtil.restartComponent(component, true);
-				restartInProgress = false;
-			}
-		}
-	}
-
-	/**
-	 * @return Returns the listener.
-	 */
-	public static FacesResourceChangeListener getFacesResourceChangeListener() {
-		if (listener == null) {
-			listener = new FacesResourceChangeListener();
-			// Register as resource change listener.
-			ResourcesPlugin.getWorkspace().addResourceChangeListener(listener, IResourceChangeEvent.PRE_BUILD);
-		}
-		return listener;
-	}
-	
-	/**
-	 * Adds a change listener to the list of listeners that will be notified
-	 * when a change is fired.
-	 * 
-	 * @param facesConfigChangeListener
-	 */
-	public void addFacesConfigChangeListener(IFacesConfigChangeListener facesConfigChangeListener) {
-		facesConfigChangeListeners.add(facesConfigChangeListener);
-	}
-	/**
-	 * Removes the listener from the list.
-	 * 
-	 * @param facesConfigChangeListener
-	 */
-	public void removeFacesConfigChangeListener(IFacesConfigChangeListener facesConfigChangeListener) {
-		facesConfigChangeListeners.remove(facesConfigChangeListener);
-	}
-	
-	private void fireFacesConfigChangeEvent(IFacesConfigChangeEvent event) {
-		LinkedList localCopy;
-		synchronized( this ) {
-			localCopy = (LinkedList)facesConfigChangeListeners.clone();
-		}
-		for ( ListIterator iter = localCopy.listIterator(); iter.hasNext(); ) {
-			IFacesConfigChangeListener facesConfigChangeListener = (IFacesConfigChangeListener)iter.next();
-			facesConfigChangeListener.resourceChanged(event);
-		}
-	}
-
-	/** 
-	 * Set the internally used preference store to preferenceStore
-	 * 
-	 * @param preferenceStore
-	 */
-	public static void setPreferenceStore(IPreferenceStore preferenceStore) {
-		FacesResourceChangeListener.preferenceStore = preferenceStore;
-	}
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/IFacesConfigChangeEvent.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/IFacesConfigChangeEvent.java
deleted file mode 100644
index 5764ee8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/IFacesConfigChangeEvent.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.util;
-
-/**
- * Not intended for external use.
- * 
- * @author xnjiang
- *
- */
-/*package*/ interface IFacesConfigChangeEvent {
-
-	/**
-	 * @return true if a managed bean has changed
-	 */
-	public boolean isManagedBeanChanged();
-	/**
-	 * @return true if a navigation rule has changed
-	 */
-	public boolean isNavigationRuleChanged();
-	
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/IFacesConfigChangeListener.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/IFacesConfigChangeListener.java
deleted file mode 100644
index 393e61b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/IFacesConfigChangeListener.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.util;
-
-
-/**
- * Not intended for external use.
- * 
- * @author xnjiang
- *
- */
-/*package*/interface IFacesConfigChangeListener {
-
-	/**
-	 * @param event
-	 */
-	public void resourceChanged(IFacesConfigChangeEvent event);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/IFacesConfigConstants.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/IFacesConfigConstants.java
deleted file mode 100644
index 017bd29..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/IFacesConfigConstants.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.util;
-
-/**
- * Not intended for external use.
- * 
- * Common constants
- */
-/*package*/ interface IFacesConfigConstants {
-	/**
-	 * the relative URI for the default faces config file.
-	 */
-	final String FACES_CONFIG_URI		= 	"WEB-INF/faces-config.xml"; //$NON-NLS-1$
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/IFacesConfigResource.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/IFacesConfigResource.java
deleted file mode 100644
index f2f1cce..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/IFacesConfigResource.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.util;
-
-
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType;
-import org.eclipse.wst.common.internal.emf.resource.TranslatorResource;
-
-
-/**
- * Should not be used or extended by clients.
- * 
- * @author gjohnsto
- * @version $Id$
- */
-/*package*/ interface IFacesConfigResource extends TranslatorResource {
-	
-	/**
-	 * @return the root faces config object
-	 */
-	public FacesConfigType getFacesConfig();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/IFacesconfigPreferences.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/IFacesconfigPreferences.java
deleted file mode 100644
index 78c4222..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/IFacesconfigPreferences.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.util;
-
-/**
- * Should NOT be used or extended by clients.
- * 
- * constants for JSF preferences pages
- *
- * @author spaxton
- */
-/*package*/ interface IFacesconfigPreferences {
-	
-	/**
-	 * Preference for whether or not to restart the server
-	 */
-	String PREFSKEY_SERVER_RESTART = "jsf.project.restart"; //$NON-NLS-1$
-	
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/package-info.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/package-info.java
deleted file mode 100644
index 5308b76..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/package-info.java
+++ /dev/null
@@ -1,19 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-/**
- * Utility classes for JSF application configuration files.
- * <p>
- * Contents of this package maybe refactored in the future to other packages.  
- * Users must be prepared to refactor in the future. 
- */
-package org.eclipse.jst.jsf.facesconfig.util;
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateAbsoluteOrderingType_name_NameType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateAbsoluteOrderingType_name_NameType.gif
deleted file mode 100644
index 33422e6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateAbsoluteOrderingType_name_NameType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateAbsoluteOrderingType_others_OrderingOthersType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateAbsoluteOrderingType_others_OrderingOthersType.gif
deleted file mode 100644
index 60a9ea3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateAbsoluteOrderingType_others_OrderingOthersType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateApplicationType_actionListener_ActionListenerType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateApplicationType_actionListener_ActionListenerType.gif
deleted file mode 100644
index decea7b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateApplicationType_actionListener_ActionListenerType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateApplicationType_defaultRenderKitId_DefaultRenderKitIdType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateApplicationType_defaultRenderKitId_DefaultRenderKitIdType.gif
deleted file mode 100644
index b806b6d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateApplicationType_defaultRenderKitId_DefaultRenderKitIdType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateApplicationType_localeConfig_LocaleConfigType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateApplicationType_localeConfig_LocaleConfigType.gif
deleted file mode 100644
index 9b0e092..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateApplicationType_localeConfig_LocaleConfigType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateApplicationType_messageBundle_MessageBundleType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateApplicationType_messageBundle_MessageBundleType.gif
deleted file mode 100644
index 65e5a9b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateApplicationType_messageBundle_MessageBundleType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateApplicationType_navigationHandler_NavigationHandlerType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateApplicationType_navigationHandler_NavigationHandlerType.gif
deleted file mode 100644
index 5bbeb62..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateApplicationType_navigationHandler_NavigationHandlerType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateApplicationType_partialTraversal_PartialTraversalType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateApplicationType_partialTraversal_PartialTraversalType.gif
deleted file mode 100644
index 82914f2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateApplicationType_partialTraversal_PartialTraversalType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateApplicationType_propertyResolver_PropertyResolverType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateApplicationType_propertyResolver_PropertyResolverType.gif
deleted file mode 100644
index 0b5f0b5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateApplicationType_propertyResolver_PropertyResolverType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateApplicationType_resourceHandler_ResourceHandlerType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateApplicationType_resourceHandler_ResourceHandlerType.gif
deleted file mode 100644
index a9b580a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateApplicationType_resourceHandler_ResourceHandlerType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateApplicationType_stateManager_StateManagerType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateApplicationType_stateManager_StateManagerType.gif
deleted file mode 100644
index 9ef55d2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateApplicationType_stateManager_StateManagerType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateApplicationType_variableResolver_VariableResolverType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateApplicationType_variableResolver_VariableResolverType.gif
deleted file mode 100644
index d7dcab4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateApplicationType_variableResolver_VariableResolverType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateApplicationType_viewHandler_ViewHandlerType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateApplicationType_viewHandler_ViewHandlerType.gif
deleted file mode 100644
index 89171a9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateApplicationType_viewHandler_ViewHandlerType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateAttributeType_attributeClass_AttributeClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateAttributeType_attributeClass_AttributeClassType.gif
deleted file mode 100644
index e30458a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateAttributeType_attributeClass_AttributeClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateAttributeType_attributeExtension_AttributeExtensionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateAttributeType_attributeExtension_AttributeExtensionType.gif
deleted file mode 100644
index b067e51..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateAttributeType_attributeExtension_AttributeExtensionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateAttributeType_attributeName_AttributeNameType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateAttributeType_attributeName_AttributeNameType.gif
deleted file mode 100644
index f420604..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateAttributeType_attributeName_AttributeNameType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateAttributeType_defaultValue_DefaultValueType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateAttributeType_defaultValue_DefaultValueType.gif
deleted file mode 100644
index 4792e17..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateAttributeType_defaultValue_DefaultValueType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateAttributeType_description_DescriptionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateAttributeType_description_DescriptionType.gif
deleted file mode 100644
index 92d407e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateAttributeType_description_DescriptionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateAttributeType_displayName_DisplayNameType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateAttributeType_displayName_DisplayNameType.gif
deleted file mode 100644
index 09b5568..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateAttributeType_displayName_DisplayNameType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateAttributeType_icon_IconType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateAttributeType_icon_IconType.gif
deleted file mode 100644
index de6e628..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateAttributeType_icon_IconType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateAttributeType_suggestedValue_SuggestedValueType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateAttributeType_suggestedValue_SuggestedValueType.gif
deleted file mode 100644
index 3dfc8ee..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateAttributeType_suggestedValue_SuggestedValueType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateBehaviorType_attribute_AttributeType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateBehaviorType_attribute_AttributeType.gif
deleted file mode 100644
index 282803a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateBehaviorType_attribute_AttributeType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateBehaviorType_behaviorClass_BehaviorClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateBehaviorType_behaviorClass_BehaviorClassType.gif
deleted file mode 100644
index 61ec24a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateBehaviorType_behaviorClass_BehaviorClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateBehaviorType_behaviorExtension_BehaviorExtensionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateBehaviorType_behaviorExtension_BehaviorExtensionType.gif
deleted file mode 100644
index 736cfc2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateBehaviorType_behaviorExtension_BehaviorExtensionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateBehaviorType_behaviorId_BehaviorIdType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateBehaviorType_behaviorId_BehaviorIdType.gif
deleted file mode 100644
index 138909e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateBehaviorType_behaviorId_BehaviorIdType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateBehaviorType_description_DescriptionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateBehaviorType_description_DescriptionType.gif
deleted file mode 100644
index 9bf9328..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateBehaviorType_description_DescriptionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateBehaviorType_displayName_DisplayNameType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateBehaviorType_displayName_DisplayNameType.gif
deleted file mode 100644
index bb4722e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateBehaviorType_displayName_DisplayNameType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateBehaviorType_icon_IconType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateBehaviorType_icon_IconType.gif
deleted file mode 100644
index c46fd65..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateBehaviorType_icon_IconType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateBehaviorType_property_PropertyType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateBehaviorType_property_PropertyType.gif
deleted file mode 100644
index ec93a66..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateBehaviorType_property_PropertyType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateClientBehaviorRendererType_clientBehaviorRendererClass_ClientBehaviorRendererClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateClientBehaviorRendererType_clientBehaviorRendererClass_ClientBehaviorRendererClassType.gif
deleted file mode 100644
index e27a4de..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateClientBehaviorRendererType_clientBehaviorRendererClass_ClientBehaviorRendererClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateClientBehaviorRendererType_clientBehaviorRendererType_ClientBehaviorRendererTypeType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateClientBehaviorRendererType_clientBehaviorRendererType_ClientBehaviorRendererTypeType.gif
deleted file mode 100644
index 4d8faab..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateClientBehaviorRendererType_clientBehaviorRendererType_ClientBehaviorRendererTypeType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateComponentType_attribute_AttributeType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateComponentType_attribute_AttributeType.gif
deleted file mode 100644
index 086cf80..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateComponentType_attribute_AttributeType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateComponentType_componentClass_ComponentClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateComponentType_componentClass_ComponentClassType.gif
deleted file mode 100644
index 4bbe527..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateComponentType_componentClass_ComponentClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateComponentType_componentExtension_ComponentExtensionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateComponentType_componentExtension_ComponentExtensionType.gif
deleted file mode 100644
index 1b6026a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateComponentType_componentExtension_ComponentExtensionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateComponentType_componentType_ComponentTypeType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateComponentType_componentType_ComponentTypeType.gif
deleted file mode 100644
index 803d12d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateComponentType_componentType_ComponentTypeType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateComponentType_description_DescriptionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateComponentType_description_DescriptionType.gif
deleted file mode 100644
index 4154e57..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateComponentType_description_DescriptionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateComponentType_displayName_DisplayNameType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateComponentType_displayName_DisplayNameType.gif
deleted file mode 100644
index 6cb8e23..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateComponentType_displayName_DisplayNameType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateComponentType_facet_FacetType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateComponentType_facet_FacetType.gif
deleted file mode 100644
index f91a995..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateComponentType_facet_FacetType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateComponentType_icon_IconType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateComponentType_icon_IconType.gif
deleted file mode 100644
index b24124a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateComponentType_icon_IconType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateComponentType_property_PropertyType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateComponentType_property_PropertyType.gif
deleted file mode 100644
index 3a05916..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateComponentType_property_PropertyType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateConverterType_attribute_AttributeType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateConverterType_attribute_AttributeType.gif
deleted file mode 100644
index f4fa5b5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateConverterType_attribute_AttributeType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateConverterType_converterClass_ConverterClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateConverterType_converterClass_ConverterClassType.gif
deleted file mode 100644
index d886763..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateConverterType_converterClass_ConverterClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateConverterType_converterExtension_ConverterExtensionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateConverterType_converterExtension_ConverterExtensionType.gif
deleted file mode 100644
index d544289..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateConverterType_converterExtension_ConverterExtensionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateConverterType_converterForClass_ConverterForClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateConverterType_converterForClass_ConverterForClassType.gif
deleted file mode 100644
index e01c9cf..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateConverterType_converterForClass_ConverterForClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateConverterType_converterId_ConverterIdType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateConverterType_converterId_ConverterIdType.gif
deleted file mode 100644
index b95bc38..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateConverterType_converterId_ConverterIdType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateConverterType_description_DescriptionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateConverterType_description_DescriptionType.gif
deleted file mode 100644
index 43703db..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateConverterType_description_DescriptionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateConverterType_displayName_DisplayNameType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateConverterType_displayName_DisplayNameType.gif
deleted file mode 100644
index e7c430b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateConverterType_displayName_DisplayNameType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateConverterType_icon_IconType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateConverterType_icon_IconType.gif
deleted file mode 100644
index 265ce22..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateConverterType_icon_IconType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateConverterType_property_PropertyType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateConverterType_property_PropertyType.gif
deleted file mode 100644
index 3fbe2cd..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateConverterType_property_PropertyType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDefaultValidatorsType_validatorId_ValidatorIdType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDefaultValidatorsType_validatorId_ValidatorIdType.gif
deleted file mode 100644
index af09eb6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDefaultValidatorsType_validatorId_ValidatorIdType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_absoluteOrdering_AbsoluteOrderingType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_absoluteOrdering_AbsoluteOrderingType.gif
deleted file mode 100644
index d757ea0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_absoluteOrdering_AbsoluteOrderingType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_actionListener_ActionListenerType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_actionListener_ActionListenerType.gif
deleted file mode 100644
index 9dd025a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_actionListener_ActionListenerType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_applicationFactory_ApplicationFactoryType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_applicationFactory_ApplicationFactoryType.gif
deleted file mode 100644
index 1c7362a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_applicationFactory_ApplicationFactoryType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_application_ApplicationType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_application_ApplicationType.gif
deleted file mode 100644
index 29e698e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_application_ApplicationType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_attributeClass_AttributeClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_attributeClass_AttributeClassType.gif
deleted file mode 100644
index 784f9df..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_attributeClass_AttributeClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_attributeExtension_AttributeExtensionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_attributeExtension_AttributeExtensionType.gif
deleted file mode 100644
index af07ba1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_attributeExtension_AttributeExtensionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_attributeName_AttributeNameType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_attributeName_AttributeNameType.gif
deleted file mode 100644
index 5d5000a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_attributeName_AttributeNameType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_attribute_AttributeType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_attribute_AttributeType.gif
deleted file mode 100644
index 5d9762d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_attribute_AttributeType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_behaviorClass_BehaviorClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_behaviorClass_BehaviorClassType.gif
deleted file mode 100644
index 98bbe95..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_behaviorClass_BehaviorClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_behaviorExtension_BehaviorExtensionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_behaviorExtension_BehaviorExtensionType.gif
deleted file mode 100644
index f8b3c3d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_behaviorExtension_BehaviorExtensionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_behaviorId_BehaviorIdType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_behaviorId_BehaviorIdType.gif
deleted file mode 100644
index ed6d815..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_behaviorId_BehaviorIdType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_behavior_BehaviorType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_behavior_BehaviorType.gif
deleted file mode 100644
index 0c17af8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_behavior_BehaviorType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_componentClass_ComponentClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_componentClass_ComponentClassType.gif
deleted file mode 100644
index 0a7b807..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_componentClass_ComponentClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_componentExtension_ComponentExtensionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_componentExtension_ComponentExtensionType.gif
deleted file mode 100644
index 62bda1f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_componentExtension_ComponentExtensionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_componentFamily_ComponentFamilyType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_componentFamily_ComponentFamilyType.gif
deleted file mode 100644
index b76c403..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_componentFamily_ComponentFamilyType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_componentType_ComponentTypeType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_componentType_ComponentTypeType.gif
deleted file mode 100644
index b25c629..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_componentType_ComponentTypeType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_component_ComponentType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_component_ComponentType.gif
deleted file mode 100644
index d70b2d9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_component_ComponentType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_converterClass_ConverterClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_converterClass_ConverterClassType.gif
deleted file mode 100644
index ced57c5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_converterClass_ConverterClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_converterForClass_ConverterForClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_converterForClass_ConverterForClassType.gif
deleted file mode 100644
index 5ac5ee0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_converterForClass_ConverterForClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_converterId_ConverterIdType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_converterId_ConverterIdType.gif
deleted file mode 100644
index c2aa3b3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_converterId_ConverterIdType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_converter_ConverterType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_converter_ConverterType.gif
deleted file mode 100644
index 0855183..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_converter_ConverterType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_defaultLocale_DefaultLocaleType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_defaultLocale_DefaultLocaleType.gif
deleted file mode 100644
index a1fa94e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_defaultLocale_DefaultLocaleType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_defaultRenderKitId_DefaultRenderKitIdType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_defaultRenderKitId_DefaultRenderKitIdType.gif
deleted file mode 100644
index db9e527..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_defaultRenderKitId_DefaultRenderKitIdType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_defaultValidators_DefaultValidatorsType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_defaultValidators_DefaultValidatorsType.gif
deleted file mode 100644
index d218932..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_defaultValidators_DefaultValidatorsType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_defaultValue_DefaultValueType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_defaultValue_DefaultValueType.gif
deleted file mode 100644
index c2aa3b3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_defaultValue_DefaultValueType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_description_DescriptionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_description_DescriptionType.gif
deleted file mode 100644
index 1c7362a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_description_DescriptionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_displayName_DisplayNameType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_displayName_DisplayNameType.gif
deleted file mode 100644
index 1d2f734..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_displayName_DisplayNameType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_exceptionHandlerFactory_ExceptionHandlerFactoryType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_exceptionHandlerFactory_ExceptionHandlerFactoryType.gif
deleted file mode 100644
index db9e527..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_exceptionHandlerFactory_ExceptionHandlerFactoryType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_externalContextFactory_ExternalContextFactoryType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_externalContextFactory_ExternalContextFactoryType.gif
deleted file mode 100644
index c3c2a8d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_externalContextFactory_ExternalContextFactoryType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_facesConfig_FacesConfigType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_facesConfig_FacesConfigType.gif
deleted file mode 100644
index 61b0302..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_facesConfig_FacesConfigType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_facesContextFactory_FacesContextFactoryType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_facesContextFactory_FacesContextFactoryType.gif
deleted file mode 100644
index 182638d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_facesContextFactory_FacesContextFactoryType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_facetExtension_FacetExtensionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_facetExtension_FacetExtensionType.gif
deleted file mode 100644
index 7983736..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_facetExtension_FacetExtensionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_facetName_FacetNameType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_facetName_FacetNameType.gif
deleted file mode 100644
index 42372e5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_facetName_FacetNameType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_facet_FacetType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_facet_FacetType.gif
deleted file mode 100644
index c5e260e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_facet_FacetType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_factory_FactoryType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_factory_FactoryType.gif
deleted file mode 100644
index 983575c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_factory_FactoryType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_fromAction_FromActionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_fromAction_FromActionType.gif
deleted file mode 100644
index 43794a2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_fromAction_FromActionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_fromOutcome_FromOutcomeType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_fromOutcome_FromOutcomeType.gif
deleted file mode 100644
index 86c2eb4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_fromOutcome_FromOutcomeType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_fromViewId_FromViewIdType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_fromViewId_FromViewIdType.gif
deleted file mode 100644
index 52c7ec0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_fromViewId_FromViewIdType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_icon_IconType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_icon_IconType.gif
deleted file mode 100644
index c05a418..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_icon_IconType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_if_IfType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_if_IfType.gif
deleted file mode 100644
index e85f5d0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_if_IfType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_keyClass_KeyClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_keyClass_KeyClassType.gif
deleted file mode 100644
index d218932..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_keyClass_KeyClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_key_KeyType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_key_KeyType.gif
deleted file mode 100644
index c5e260e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_key_KeyType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_largeIcon_LargeIconType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_largeIcon_LargeIconType.gif
deleted file mode 100644
index d757ea0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_largeIcon_LargeIconType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_lifecycleFactory_LifecycleFactoryType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_lifecycleFactory_LifecycleFactoryType.gif
deleted file mode 100644
index 5599390..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_lifecycleFactory_LifecycleFactoryType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_lifecycle_LifecycleType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_lifecycle_LifecycleType.gif
deleted file mode 100644
index 908375c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_lifecycle_LifecycleType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_listEntries_ListEntriesType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_listEntries_ListEntriesType.gif
deleted file mode 100644
index d9a9d8d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_listEntries_ListEntriesType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_localeConfig_LocaleConfigType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_localeConfig_LocaleConfigType.gif
deleted file mode 100644
index 55f49ef..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_localeConfig_LocaleConfigType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_managedBeanClass_ManagedBeanClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_managedBeanClass_ManagedBeanClassType.gif
deleted file mode 100644
index 0091fd6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_managedBeanClass_ManagedBeanClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_managedBeanName_ManagedBeanNameType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_managedBeanName_ManagedBeanNameType.gif
deleted file mode 100644
index 5e4d339..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_managedBeanName_ManagedBeanNameType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_managedBeanScope_ManagedBeanScopeType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_managedBeanScope_ManagedBeanScopeType.gif
deleted file mode 100644
index 7983736..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_managedBeanScope_ManagedBeanScopeType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_managedBean_ManagedBeanType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_managedBean_ManagedBeanType.gif
deleted file mode 100644
index fc34e45..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_managedBean_ManagedBeanType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_managedProperty_ManagedPropertyType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_managedProperty_ManagedPropertyType.gif
deleted file mode 100644
index 963a72b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_managedProperty_ManagedPropertyType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_mapEntries_MapEntriesType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_mapEntries_MapEntriesType.gif
deleted file mode 100644
index 0a7b807..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_mapEntries_MapEntriesType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_mapEntry_MapEntryType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_mapEntry_MapEntryType.gif
deleted file mode 100644
index 1c7362a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_mapEntry_MapEntryType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_messageBundle_MessageBundleType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_messageBundle_MessageBundleType.gif
deleted file mode 100644
index 4ce1821..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_messageBundle_MessageBundleType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_name_NameType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_name_NameType.gif
deleted file mode 100644
index 31de68f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_name_NameType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_navigationCase_NavigationCaseType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_navigationCase_NavigationCaseType.gif
deleted file mode 100644
index 61b0302..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_navigationCase_NavigationCaseType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_navigationHandler_NavigationHandlerType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_navigationHandler_NavigationHandlerType.gif
deleted file mode 100644
index 0996300..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_navigationHandler_NavigationHandlerType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_navigationRule_NavigationRuleType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_navigationRule_NavigationRuleType.gif
deleted file mode 100644
index 64cd1b0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_navigationRule_NavigationRuleType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_nullValue_NullValueType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_nullValue_NullValueType.gif
deleted file mode 100644
index 3d308aa..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_nullValue_NullValueType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_orderingOrdering_OrderingOrderingType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_orderingOrdering_OrderingOrderingType.gif
deleted file mode 100644
index 4a972b8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_orderingOrdering_OrderingOrderingType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_ordering_OrderingType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_ordering_OrderingType.gif
deleted file mode 100644
index c0890af..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_ordering_OrderingType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_others_OrderingOthersType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_others_OrderingOthersType.gif
deleted file mode 100644
index 42372e5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_others_OrderingOthersType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_partialTraversal_PartialTraversalType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_partialTraversal_PartialTraversalType.gif
deleted file mode 100644
index d218932..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_partialTraversal_PartialTraversalType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_partialViewContextFactory_PartialViewContextFactoryType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_partialViewContextFactory_PartialViewContextFactoryType.gif
deleted file mode 100644
index ed5f660..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_partialViewContextFactory_PartialViewContextFactoryType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_phaseListener_PhaseListenerType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_phaseListener_PhaseListenerType.gif
deleted file mode 100644
index 464e623..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_phaseListener_PhaseListenerType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_propertyClass_PropertyClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_propertyClass_PropertyClassType.gif
deleted file mode 100644
index b76c403..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_propertyClass_PropertyClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_propertyExtension_PropertyExtensionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_propertyExtension_PropertyExtensionType.gif
deleted file mode 100644
index 182638d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_propertyExtension_PropertyExtensionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_propertyName_PropertyNameType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_propertyName_PropertyNameType.gif
deleted file mode 100644
index 7983736..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_propertyName_PropertyNameType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_propertyResolver_PropertyResolverType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_propertyResolver_PropertyResolverType.gif
deleted file mode 100644
index af07ba1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_propertyResolver_PropertyResolverType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_property_PropertyType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_property_PropertyType.gif
deleted file mode 100644
index 448138d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_property_PropertyType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_redirectViewParam_RedirectViewParamType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_redirectViewParam_RedirectViewParamType.gif
deleted file mode 100644
index 9a093da..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_redirectViewParam_RedirectViewParamType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_redirect_RedirectType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_redirect_RedirectType.gif
deleted file mode 100644
index 55f49ef..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_redirect_RedirectType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_referencedBeanClass_ReferencedBeanClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_referencedBeanClass_ReferencedBeanClassType.gif
deleted file mode 100644
index ed6d815..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_referencedBeanClass_ReferencedBeanClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_referencedBeanName_ReferencedBeanNameType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_referencedBeanName_ReferencedBeanNameType.gif
deleted file mode 100644
index 96c0245..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_referencedBeanName_ReferencedBeanNameType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_referencedBean_ReferencedBeanType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_referencedBean_ReferencedBeanType.gif
deleted file mode 100644
index 3d308aa..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_referencedBean_ReferencedBeanType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_renderKitClass_RenderKitClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_renderKitClass_RenderKitClassType.gif
deleted file mode 100644
index 3f3e603..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_renderKitClass_RenderKitClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_renderKitFactory_RenderKitFactoryType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_renderKitFactory_RenderKitFactoryType.gif
deleted file mode 100644
index 3d308aa..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_renderKitFactory_RenderKitFactoryType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_renderKitId_RenderKitIdType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_renderKitId_RenderKitIdType.gif
deleted file mode 100644
index 7fa1f08..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_renderKitId_RenderKitIdType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_renderKit_RenderKitType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_renderKit_RenderKitType.gif
deleted file mode 100644
index 75a50e9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_renderKit_RenderKitType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_rendererClass_RendererClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_rendererClass_RendererClassType.gif
deleted file mode 100644
index d218932..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_rendererClass_RendererClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_rendererExtension_RendererExtensionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_rendererExtension_RendererExtensionType.gif
deleted file mode 100644
index 983575c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_rendererExtension_RendererExtensionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_rendererType_RendererTypeType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_rendererType_RendererTypeType.gif
deleted file mode 100644
index c882b04..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_rendererType_RendererTypeType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_renderer_RendererType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_renderer_RendererType.gif
deleted file mode 100644
index e178517..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_renderer_RendererType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_resourceHandler_ResourceHandlerType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_resourceHandler_ResourceHandlerType.gif
deleted file mode 100644
index 5106f50..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_resourceHandler_ResourceHandlerType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_smallIcon_SmallIconType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_smallIcon_SmallIconType.gif
deleted file mode 100644
index 76b41e3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_smallIcon_SmallIconType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_sourceClass_SourceClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_sourceClass_SourceClassType.gif
deleted file mode 100644
index 3f3e603..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_sourceClass_SourceClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_stateManager_StateManagerType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_stateManager_StateManagerType.gif
deleted file mode 100644
index eef1935..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_stateManager_StateManagerType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_suggestedValue_SuggestedValueType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_suggestedValue_SuggestedValueType.gif
deleted file mode 100644
index d49c17d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_suggestedValue_SuggestedValueType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_supportedLocale_SupportedLocaleType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_supportedLocale_SupportedLocaleType.gif
deleted file mode 100644
index 4ce1821..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_supportedLocale_SupportedLocaleType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_systemEventClass_SystemEventClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_systemEventClass_SystemEventClassType.gif
deleted file mode 100644
index db9e527..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_systemEventClass_SystemEventClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_systemEventListenerClass_SystemEventListenerClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_systemEventListenerClass_SystemEventListenerClassType.gif
deleted file mode 100644
index 9a093da..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_systemEventListenerClass_SystemEventListenerClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_systemEventListener_SystemEventListenerType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_systemEventListener_SystemEventListenerType.gif
deleted file mode 100644
index d757ea0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_systemEventListener_SystemEventListenerType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_tagHandlerDelegateFactory_TagHandlerDelegateFactoryType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_tagHandlerDelegateFactory_TagHandlerDelegateFactoryType.gif
deleted file mode 100644
index 9932a4b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_tagHandlerDelegateFactory_TagHandlerDelegateFactoryType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_toViewId_ToViewIdType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_toViewId_ToViewIdType.gif
deleted file mode 100644
index 96c0245..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_toViewId_ToViewIdType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_validatorClass_ValidatorClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_validatorClass_ValidatorClassType.gif
deleted file mode 100644
index 0091fd6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_validatorClass_ValidatorClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_validatorId_ValidatorIdType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_validatorId_ValidatorIdType.gif
deleted file mode 100644
index 9a093da..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_validatorId_ValidatorIdType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_validator_ValidatorType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_validator_ValidatorType.gif
deleted file mode 100644
index fc34e45..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_validator_ValidatorType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_valueClass_ValueClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_valueClass_ValueClassType.gif
deleted file mode 100644
index 48b9e69..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_valueClass_ValueClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_value_ValueType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_value_ValueType.gif
deleted file mode 100644
index 411e41c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_value_ValueType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_variableResolver_VariableResolverType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_variableResolver_VariableResolverType.gif
deleted file mode 100644
index 210e156..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_variableResolver_VariableResolverType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_viewDeclarationLanguageFactory_ViewDeclarationLanguageFactoryType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_viewDeclarationLanguageFactory_ViewDeclarationLanguageFactoryType.gif
deleted file mode 100644
index 96c0245..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_viewDeclarationLanguageFactory_ViewDeclarationLanguageFactoryType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_viewHandler_ViewHandlerType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_viewHandler_ViewHandlerType.gif
deleted file mode 100644
index 84df4c1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_viewHandler_ViewHandlerType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_visitContextFactory_VisitContextFactoryType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_visitContextFactory_VisitContextFactoryType.gif
deleted file mode 100644
index 5ac5ee0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_visitContextFactory_VisitContextFactoryType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDynamicElement_childNodes_DynamicElement.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDynamicElement_childNodes_DynamicElement.gif
deleted file mode 100644
index 3744cee..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDynamicElement_childNodes_DynamicElement.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_absoluteOrdering_AbsoluteOrderingType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_absoluteOrdering_AbsoluteOrderingType.gif
deleted file mode 100644
index a85a8b8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_absoluteOrdering_AbsoluteOrderingType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_application_ApplicationType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_application_ApplicationType.gif
deleted file mode 100644
index 28ed761..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_application_ApplicationType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_behavior_BehaviorType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_behavior_BehaviorType.gif
deleted file mode 100644
index 65fff8e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_behavior_BehaviorType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_component_ComponentType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_component_ComponentType.gif
deleted file mode 100644
index 07b82ef..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_component_ComponentType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_converter_ConverterType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_converter_ConverterType.gif
deleted file mode 100644
index b4db3ff..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_converter_ConverterType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_factory_FactoryType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_factory_FactoryType.gif
deleted file mode 100644
index ca61c9e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_factory_FactoryType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_lifecycle_LifecycleType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_lifecycle_LifecycleType.gif
deleted file mode 100644
index b93b3d2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_lifecycle_LifecycleType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_managedBean_ManagedBeanType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_managedBean_ManagedBeanType.gif
deleted file mode 100644
index f2b0a1e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_managedBean_ManagedBeanType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_name_NameType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_name_NameType.gif
deleted file mode 100644
index c7c2185..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_name_NameType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_navigationRule_NavigationRuleType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_navigationRule_NavigationRuleType.gif
deleted file mode 100644
index 7431442..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_navigationRule_NavigationRuleType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_ordering_OrderingType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_ordering_OrderingType.gif
deleted file mode 100644
index 2bf84ea..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_ordering_OrderingType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_referencedBean_ReferencedBeanType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_referencedBean_ReferencedBeanType.gif
deleted file mode 100644
index 149a215..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_referencedBean_ReferencedBeanType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_renderKit_RenderKitType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_renderKit_RenderKitType.gif
deleted file mode 100644
index 8cd9cfa..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_renderKit_RenderKitType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_validator_ValidatorType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_validator_ValidatorType.gif
deleted file mode 100644
index f2b0a1e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_validator_ValidatorType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacetType_description_DescriptionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacetType_description_DescriptionType.gif
deleted file mode 100644
index 66a097b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacetType_description_DescriptionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacetType_displayName_DisplayNameType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacetType_displayName_DisplayNameType.gif
deleted file mode 100644
index dd919f9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacetType_displayName_DisplayNameType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacetType_facetExtension_FacetExtensionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacetType_facetExtension_FacetExtensionType.gif
deleted file mode 100644
index b021070..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacetType_facetExtension_FacetExtensionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacetType_facetName_FacetNameType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacetType_facetName_FacetNameType.gif
deleted file mode 100644
index ff4cc72..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacetType_facetName_FacetNameType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacetType_icon_IconType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacetType_icon_IconType.gif
deleted file mode 100644
index df2b32d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacetType_icon_IconType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFactoryType_applicationFactory_ApplicationFactoryType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFactoryType_applicationFactory_ApplicationFactoryType.gif
deleted file mode 100644
index d4a978d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFactoryType_applicationFactory_ApplicationFactoryType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFactoryType_exceptionHandlerFactory_ExceptionHandlerFactoryType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFactoryType_exceptionHandlerFactory_ExceptionHandlerFactoryType.gif
deleted file mode 100644
index a32a163..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFactoryType_exceptionHandlerFactory_ExceptionHandlerFactoryType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFactoryType_externalContextFactory_ExternalContextFactoryType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFactoryType_externalContextFactory_ExternalContextFactoryType.gif
deleted file mode 100644
index 247d202..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFactoryType_externalContextFactory_ExternalContextFactoryType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFactoryType_facesContextFactory_FacesContextFactoryType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFactoryType_facesContextFactory_FacesContextFactoryType.gif
deleted file mode 100644
index 5173b2d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFactoryType_facesContextFactory_FacesContextFactoryType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFactoryType_lifecycleFactory_LifecycleFactoryType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFactoryType_lifecycleFactory_LifecycleFactoryType.gif
deleted file mode 100644
index 7cc18f1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFactoryType_lifecycleFactory_LifecycleFactoryType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFactoryType_partialViewContextFactory_PartialViewContextFactoryType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFactoryType_partialViewContextFactory_PartialViewContextFactoryType.gif
deleted file mode 100644
index 13f7679..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFactoryType_partialViewContextFactory_PartialViewContextFactoryType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFactoryType_renderKitFactory_RenderKitFactoryType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFactoryType_renderKitFactory_RenderKitFactoryType.gif
deleted file mode 100644
index 3dac10e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFactoryType_renderKitFactory_RenderKitFactoryType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFactoryType_tagHandlerDelegateFactory_TagHandlerDelegateFactoryType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFactoryType_tagHandlerDelegateFactory_TagHandlerDelegateFactoryType.gif
deleted file mode 100644
index ca50a38..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFactoryType_tagHandlerDelegateFactory_TagHandlerDelegateFactoryType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFactoryType_viewDeclarationLanguageFactory_ViewDeclarationLanguageFactoryType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFactoryType_viewDeclarationLanguageFactory_ViewDeclarationLanguageFactoryType.gif
deleted file mode 100644
index 31a4b78..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFactoryType_viewDeclarationLanguageFactory_ViewDeclarationLanguageFactoryType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFactoryType_visitContextFactory_VisitContextFactoryType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFactoryType_visitContextFactory_VisitContextFactoryType.gif
deleted file mode 100644
index 9ea4eeb..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFactoryType_visitContextFactory_VisitContextFactoryType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateIconType_largeIcon_LargeIconType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateIconType_largeIcon_LargeIconType.gif
deleted file mode 100644
index 6a782d1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateIconType_largeIcon_LargeIconType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateIconType_smallIcon_SmallIconType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateIconType_smallIcon_SmallIconType.gif
deleted file mode 100644
index 0640cac..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateIconType_smallIcon_SmallIconType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateLifecycleType_lifecycleExtension_LifecycleExtensionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateLifecycleType_lifecycleExtension_LifecycleExtensionType.gif
deleted file mode 100644
index 79a0b58..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateLifecycleType_lifecycleExtension_LifecycleExtensionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateLifecycleType_phaseListener_PhaseListenerType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateLifecycleType_phaseListener_PhaseListenerType.gif
deleted file mode 100644
index f11ad89..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateLifecycleType_phaseListener_PhaseListenerType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateListEntriesType_nullValue_NullValueType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateListEntriesType_nullValue_NullValueType.gif
deleted file mode 100644
index 205071f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateListEntriesType_nullValue_NullValueType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateListEntriesType_valueClass_ValueClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateListEntriesType_valueClass_ValueClassType.gif
deleted file mode 100644
index de5107d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateListEntriesType_valueClass_ValueClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateListEntriesType_value_ValueType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateListEntriesType_value_ValueType.gif
deleted file mode 100644
index a9aaa51..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateListEntriesType_value_ValueType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateLocaleConfigType_defaultLocale_DefaultLocaleType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateLocaleConfigType_defaultLocale_DefaultLocaleType.gif
deleted file mode 100644
index d5f8c8d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateLocaleConfigType_defaultLocale_DefaultLocaleType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateLocaleConfigType_supportedLocale_SupportedLocaleType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateLocaleConfigType_supportedLocale_SupportedLocaleType.gif
deleted file mode 100644
index 3e4fc3f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateLocaleConfigType_supportedLocale_SupportedLocaleType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedBeanType_description_DescriptionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedBeanType_description_DescriptionType.gif
deleted file mode 100644
index b913037..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedBeanType_description_DescriptionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedBeanType_displayName_DisplayNameType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedBeanType_displayName_DisplayNameType.gif
deleted file mode 100644
index 23c1e15..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedBeanType_displayName_DisplayNameType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedBeanType_icon_IconType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedBeanType_icon_IconType.gif
deleted file mode 100644
index 46c6860..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedBeanType_icon_IconType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedBeanType_listEntries_ListEntriesType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedBeanType_listEntries_ListEntriesType.gif
deleted file mode 100644
index 3a9f24e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedBeanType_listEntries_ListEntriesType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedBeanType_managedBeanClass_ManagedBeanClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedBeanType_managedBeanClass_ManagedBeanClassType.gif
deleted file mode 100644
index d5d9efe..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedBeanType_managedBeanClass_ManagedBeanClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedBeanType_managedBeanExtension_ManagedBeanExtensionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedBeanType_managedBeanExtension_ManagedBeanExtensionType.gif
deleted file mode 100644
index 10a1ab5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedBeanType_managedBeanExtension_ManagedBeanExtensionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedBeanType_managedBeanName_ManagedBeanNameType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedBeanType_managedBeanName_ManagedBeanNameType.gif
deleted file mode 100644
index 5df01fb..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedBeanType_managedBeanName_ManagedBeanNameType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedBeanType_managedBeanScope_ManagedBeanScopeType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedBeanType_managedBeanScope_ManagedBeanScopeType.gif
deleted file mode 100644
index 615b448..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedBeanType_managedBeanScope_ManagedBeanScopeType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedBeanType_managedProperty_ManagedPropertyType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedBeanType_managedProperty_ManagedPropertyType.gif
deleted file mode 100644
index f11830c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedBeanType_managedProperty_ManagedPropertyType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedBeanType_mapEntries_MapEntriesType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedBeanType_mapEntries_MapEntriesType.gif
deleted file mode 100644
index 5e689e6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedBeanType_mapEntries_MapEntriesType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedPropertyType_description_DescriptionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedPropertyType_description_DescriptionType.gif
deleted file mode 100644
index e66386f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedPropertyType_description_DescriptionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedPropertyType_displayName_DisplayNameType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedPropertyType_displayName_DisplayNameType.gif
deleted file mode 100644
index c2b071b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedPropertyType_displayName_DisplayNameType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedPropertyType_icon_IconType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedPropertyType_icon_IconType.gif
deleted file mode 100644
index 60aa17e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedPropertyType_icon_IconType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedPropertyType_listEntries_ListEntriesType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedPropertyType_listEntries_ListEntriesType.gif
deleted file mode 100644
index 223e215..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedPropertyType_listEntries_ListEntriesType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedPropertyType_mapEntries_MapEntriesType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedPropertyType_mapEntries_MapEntriesType.gif
deleted file mode 100644
index db04142..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedPropertyType_mapEntries_MapEntriesType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedPropertyType_nullValue_NullValueType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedPropertyType_nullValue_NullValueType.gif
deleted file mode 100644
index 0bf86ce..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedPropertyType_nullValue_NullValueType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedPropertyType_propertyClass_PropertyClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedPropertyType_propertyClass_PropertyClassType.gif
deleted file mode 100644
index c0ace1e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedPropertyType_propertyClass_PropertyClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedPropertyType_propertyName_PropertyNameType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedPropertyType_propertyName_PropertyNameType.gif
deleted file mode 100644
index 377956d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedPropertyType_propertyName_PropertyNameType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedPropertyType_value_ValueType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedPropertyType_value_ValueType.gif
deleted file mode 100644
index 0ca5aa8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedPropertyType_value_ValueType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateMapEntriesType_keyClass_KeyClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateMapEntriesType_keyClass_KeyClassType.gif
deleted file mode 100644
index 30e0107..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateMapEntriesType_keyClass_KeyClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateMapEntriesType_mapEntry_MapEntryType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateMapEntriesType_mapEntry_MapEntryType.gif
deleted file mode 100644
index 2a3bcb3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateMapEntriesType_mapEntry_MapEntryType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateMapEntriesType_valueClass_ValueClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateMapEntriesType_valueClass_ValueClassType.gif
deleted file mode 100644
index 5303d3a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateMapEntriesType_valueClass_ValueClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateMapEntryType_key_KeyType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateMapEntryType_key_KeyType.gif
deleted file mode 100644
index cd28dd3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateMapEntryType_key_KeyType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateMapEntryType_nullValue_NullValueType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateMapEntryType_nullValue_NullValueType.gif
deleted file mode 100644
index 799bbbb..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateMapEntryType_nullValue_NullValueType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateMapEntryType_value_ValueType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateMapEntryType_value_ValueType.gif
deleted file mode 100644
index 8d3cc41..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateMapEntryType_value_ValueType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationCaseType_description_DescriptionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationCaseType_description_DescriptionType.gif
deleted file mode 100644
index 1dd58e1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationCaseType_description_DescriptionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationCaseType_displayName_DisplayNameType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationCaseType_displayName_DisplayNameType.gif
deleted file mode 100644
index 424142e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationCaseType_displayName_DisplayNameType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationCaseType_fromAction_FromActionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationCaseType_fromAction_FromActionType.gif
deleted file mode 100644
index d628611..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationCaseType_fromAction_FromActionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationCaseType_fromOutcome_FromOutcomeType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationCaseType_fromOutcome_FromOutcomeType.gif
deleted file mode 100644
index 0ca3dc5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationCaseType_fromOutcome_FromOutcomeType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationCaseType_icon_IconType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationCaseType_icon_IconType.gif
deleted file mode 100644
index 0f107c5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationCaseType_icon_IconType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationCaseType_if_IfType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationCaseType_if_IfType.gif
deleted file mode 100644
index 9987e74..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationCaseType_if_IfType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationCaseType_redirect_RedirectType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationCaseType_redirect_RedirectType.gif
deleted file mode 100644
index a46fda5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationCaseType_redirect_RedirectType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationCaseType_toViewId_ToViewIdType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationCaseType_toViewId_ToViewIdType.gif
deleted file mode 100644
index d3569a5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationCaseType_toViewId_ToViewIdType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationRuleType_description_DescriptionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationRuleType_description_DescriptionType.gif
deleted file mode 100644
index fbba57a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationRuleType_description_DescriptionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationRuleType_displayName_DisplayNameType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationRuleType_displayName_DisplayNameType.gif
deleted file mode 100644
index ae6f7b7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationRuleType_displayName_DisplayNameType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationRuleType_fromViewId_FromViewIdType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationRuleType_fromViewId_FromViewIdType.gif
deleted file mode 100644
index 95b0b4b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationRuleType_fromViewId_FromViewIdType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationRuleType_icon_IconType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationRuleType_icon_IconType.gif
deleted file mode 100644
index fbae759..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationRuleType_icon_IconType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationRuleType_navigationCase_NavigationCaseType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationRuleType_navigationCase_NavigationCaseType.gif
deleted file mode 100644
index 34611db..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationRuleType_navigationCase_NavigationCaseType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationRuleType_navigationRuleExtension_NavigationRuleExtensionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationRuleType_navigationRuleExtension_NavigationRuleExtensionType.gif
deleted file mode 100644
index b0e719a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationRuleType_navigationRuleExtension_NavigationRuleExtensionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateOrderingOrderingType_name_NameType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateOrderingOrderingType_name_NameType.gif
deleted file mode 100644
index 9641c51..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateOrderingOrderingType_name_NameType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateOrderingOrderingType_others_OrderingOthersType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateOrderingOrderingType_others_OrderingOthersType.gif
deleted file mode 100644
index 6ec7dad..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateOrderingOrderingType_others_OrderingOthersType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateOrderingType_after_OrderingOrderingType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateOrderingType_after_OrderingOrderingType.gif
deleted file mode 100644
index efd089b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateOrderingType_after_OrderingOrderingType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateOrderingType_before_OrderingOrderingType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateOrderingType_before_OrderingOrderingType.gif
deleted file mode 100644
index efd089b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateOrderingType_before_OrderingOrderingType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreatePropertyType_defaultValue_DefaultValueType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreatePropertyType_defaultValue_DefaultValueType.gif
deleted file mode 100644
index ae8f059..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreatePropertyType_defaultValue_DefaultValueType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreatePropertyType_description_DescriptionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreatePropertyType_description_DescriptionType.gif
deleted file mode 100644
index 527759b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreatePropertyType_description_DescriptionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreatePropertyType_displayName_DisplayNameType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreatePropertyType_displayName_DisplayNameType.gif
deleted file mode 100644
index c7bd777..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreatePropertyType_displayName_DisplayNameType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreatePropertyType_icon_IconType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreatePropertyType_icon_IconType.gif
deleted file mode 100644
index ee73faa..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreatePropertyType_icon_IconType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreatePropertyType_propertyClass_PropertyClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreatePropertyType_propertyClass_PropertyClassType.gif
deleted file mode 100644
index 2ebeed2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreatePropertyType_propertyClass_PropertyClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreatePropertyType_propertyExtension_PropertyExtensionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreatePropertyType_propertyExtension_PropertyExtensionType.gif
deleted file mode 100644
index f9f81a4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreatePropertyType_propertyExtension_PropertyExtensionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreatePropertyType_propertyName_PropertyNameType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreatePropertyType_propertyName_PropertyNameType.gif
deleted file mode 100644
index af55e8d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreatePropertyType_propertyName_PropertyNameType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreatePropertyType_suggestedValue_SuggestedValueType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreatePropertyType_suggestedValue_SuggestedValueType.gif
deleted file mode 100644
index 8875a43..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreatePropertyType_suggestedValue_SuggestedValueType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRedirectType_viewParam_RedirectViewParamType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRedirectType_viewParam_RedirectViewParamType.gif
deleted file mode 100644
index 7d6e6bc..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRedirectType_viewParam_RedirectViewParamType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRedirectViewParamType_name_NameType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRedirectViewParamType_name_NameType.gif
deleted file mode 100644
index 2f44cc3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRedirectViewParamType_name_NameType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRedirectViewParamType_value_ValueType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRedirectViewParamType_value_ValueType.gif
deleted file mode 100644
index ab37de2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRedirectViewParamType_value_ValueType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateReferencedBeanType_description_DescriptionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateReferencedBeanType_description_DescriptionType.gif
deleted file mode 100644
index fe734c7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateReferencedBeanType_description_DescriptionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateReferencedBeanType_displayName_DisplayNameType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateReferencedBeanType_displayName_DisplayNameType.gif
deleted file mode 100644
index 8d3a8e0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateReferencedBeanType_displayName_DisplayNameType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateReferencedBeanType_icon_IconType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateReferencedBeanType_icon_IconType.gif
deleted file mode 100644
index b1bf686..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateReferencedBeanType_icon_IconType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateReferencedBeanType_referencedBeanClass_ReferencedBeanClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateReferencedBeanType_referencedBeanClass_ReferencedBeanClassType.gif
deleted file mode 100644
index 5915315..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateReferencedBeanType_referencedBeanClass_ReferencedBeanClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateReferencedBeanType_referencedBeanName_ReferencedBeanNameType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateReferencedBeanType_referencedBeanName_ReferencedBeanNameType.gif
deleted file mode 100644
index ccfe115..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateReferencedBeanType_referencedBeanName_ReferencedBeanNameType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRenderKitType_clientBehaviorRenderer_ClientBehaviorRendererType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRenderKitType_clientBehaviorRenderer_ClientBehaviorRendererType.gif
deleted file mode 100644
index 1d747da..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRenderKitType_clientBehaviorRenderer_ClientBehaviorRendererType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRenderKitType_description_DescriptionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRenderKitType_description_DescriptionType.gif
deleted file mode 100644
index 2b77e50..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRenderKitType_description_DescriptionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRenderKitType_displayName_DisplayNameType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRenderKitType_displayName_DisplayNameType.gif
deleted file mode 100644
index 9f85940..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRenderKitType_displayName_DisplayNameType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRenderKitType_icon_IconType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRenderKitType_icon_IconType.gif
deleted file mode 100644
index fe7b106..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRenderKitType_icon_IconType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRenderKitType_renderKitClass_RenderKitClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRenderKitType_renderKitClass_RenderKitClassType.gif
deleted file mode 100644
index e4abad2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRenderKitType_renderKitClass_RenderKitClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRenderKitType_renderKitExtension_RenderKitExtensionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRenderKitType_renderKitExtension_RenderKitExtensionType.gif
deleted file mode 100644
index dbd19ed..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRenderKitType_renderKitExtension_RenderKitExtensionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRenderKitType_renderKitId_RenderKitIdType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRenderKitType_renderKitId_RenderKitIdType.gif
deleted file mode 100644
index 1bf7437..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRenderKitType_renderKitId_RenderKitIdType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRenderKitType_renderer_RendererType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRenderKitType_renderer_RendererType.gif
deleted file mode 100644
index d749f03..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRenderKitType_renderer_RendererType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRendererType_attribute_AttributeType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRendererType_attribute_AttributeType.gif
deleted file mode 100644
index 3be3f93..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRendererType_attribute_AttributeType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRendererType_componentFamily_ComponentFamilyType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRendererType_componentFamily_ComponentFamilyType.gif
deleted file mode 100644
index fa2e11c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRendererType_componentFamily_ComponentFamilyType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRendererType_description_DescriptionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRendererType_description_DescriptionType.gif
deleted file mode 100644
index 66a097b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRendererType_description_DescriptionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRendererType_displayName_DisplayNameType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRendererType_displayName_DisplayNameType.gif
deleted file mode 100644
index dd919f9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRendererType_displayName_DisplayNameType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRendererType_facet_FacetType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRendererType_facet_FacetType.gif
deleted file mode 100644
index 0091f17..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRendererType_facet_FacetType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRendererType_icon_IconType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRendererType_icon_IconType.gif
deleted file mode 100644
index df2b32d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRendererType_icon_IconType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRendererType_rendererClass_RendererClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRendererType_rendererClass_RendererClassType.gif
deleted file mode 100644
index 30dc32e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRendererType_rendererClass_RendererClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRendererType_rendererExtension_RendererExtensionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRendererType_rendererExtension_RendererExtensionType.gif
deleted file mode 100644
index b021070..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRendererType_rendererExtension_RendererExtensionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRendererType_rendererType_RendererTypeType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRendererType_rendererType_RendererTypeType.gif
deleted file mode 100644
index 6beaa5a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRendererType_rendererType_RendererTypeType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateResourceBundleType_description_DescriptionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateResourceBundleType_description_DescriptionType.gif
deleted file mode 100644
index 66a097b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateResourceBundleType_description_DescriptionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateResourceBundleType_displayName_DisplayNameType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateResourceBundleType_displayName_DisplayNameType.gif
deleted file mode 100644
index dd919f9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateResourceBundleType_displayName_DisplayNameType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateResourceBundleType_icon_IconType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateResourceBundleType_icon_IconType.gif
deleted file mode 100644
index df2b32d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateResourceBundleType_icon_IconType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateSystemEventListenerType_sourceClass_SourceClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateSystemEventListenerType_sourceClass_SourceClassType.gif
deleted file mode 100644
index a9efa38..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateSystemEventListenerType_sourceClass_SourceClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateSystemEventListenerType_systemEventClass_SystemEventClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateSystemEventListenerType_systemEventClass_SystemEventClassType.gif
deleted file mode 100644
index dd4294c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateSystemEventListenerType_systemEventClass_SystemEventClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateSystemEventListenerType_systemEventListenerClass_SystemEventListenerClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateSystemEventListenerType_systemEventListenerClass_SystemEventListenerClassType.gif
deleted file mode 100644
index 0818bec..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateSystemEventListenerType_systemEventListenerClass_SystemEventListenerClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateValidatorType_attribute_AttributeType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateValidatorType_attribute_AttributeType.gif
deleted file mode 100644
index 647a6ff..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateValidatorType_attribute_AttributeType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateValidatorType_description_DescriptionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateValidatorType_description_DescriptionType.gif
deleted file mode 100644
index b913037..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateValidatorType_description_DescriptionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateValidatorType_displayName_DisplayNameType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateValidatorType_displayName_DisplayNameType.gif
deleted file mode 100644
index 23c1e15..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateValidatorType_displayName_DisplayNameType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateValidatorType_icon_IconType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateValidatorType_icon_IconType.gif
deleted file mode 100644
index 46c6860..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateValidatorType_icon_IconType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateValidatorType_property_PropertyType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateValidatorType_property_PropertyType.gif
deleted file mode 100644
index 1808567..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateValidatorType_property_PropertyType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateValidatorType_validatorClass_ValidatorClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateValidatorType_validatorClass_ValidatorClassType.gif
deleted file mode 100644
index d5d9efe..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateValidatorType_validatorClass_ValidatorClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateValidatorType_validatorExtension_ValidatorExtensionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateValidatorType_validatorExtension_ValidatorExtensionType.gif
deleted file mode 100644
index 10a1ab5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateValidatorType_validatorExtension_ValidatorExtensionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateValidatorType_validatorId_ValidatorIdType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateValidatorType_validatorId_ValidatorIdType.gif
deleted file mode 100644
index 378c786..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateValidatorType_validatorId_ValidatorIdType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/AbsoluteOrderingType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/AbsoluteOrderingType.gif
deleted file mode 100644
index b2f5929..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/AbsoluteOrderingType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ActionListenerType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ActionListenerType.gif
deleted file mode 100644
index d3dc5a9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ActionListenerType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ApplicationExtensionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ApplicationExtensionType.gif
deleted file mode 100644
index 7c2aaac..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ApplicationExtensionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ApplicationFactoryType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ApplicationFactoryType.gif
deleted file mode 100644
index 53500da..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ApplicationFactoryType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ApplicationType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ApplicationType.gif
deleted file mode 100644
index ed87474..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ApplicationType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/AttributeClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/AttributeClassType.gif
deleted file mode 100644
index 498364f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/AttributeClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/AttributeExtensionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/AttributeExtensionType.gif
deleted file mode 100644
index c00aedf..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/AttributeExtensionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/AttributeNameType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/AttributeNameType.gif
deleted file mode 100644
index cb1755a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/AttributeNameType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/AttributeType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/AttributeType.gif
deleted file mode 100644
index 338fb8d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/AttributeType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/BaseNameType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/BaseNameType.gif
deleted file mode 100644
index d3dc5a9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/BaseNameType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/BehaviorClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/BehaviorClassType.gif
deleted file mode 100644
index 8f36206..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/BehaviorClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/BehaviorExtensionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/BehaviorExtensionType.gif
deleted file mode 100644
index d51e409..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/BehaviorExtensionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/BehaviorIdType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/BehaviorIdType.gif
deleted file mode 100644
index 5b40c4e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/BehaviorIdType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/BehaviorType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/BehaviorType.gif
deleted file mode 100644
index e74485f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/BehaviorType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ClientBehaviorRendererClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ClientBehaviorRendererClassType.gif
deleted file mode 100644
index ed1cbaf..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ClientBehaviorRendererClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ClientBehaviorRendererType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ClientBehaviorRendererType.gif
deleted file mode 100644
index ab31737..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ClientBehaviorRendererType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ClientBehaviorRendererTypeType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ClientBehaviorRendererTypeType.gif
deleted file mode 100644
index cf289c2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ClientBehaviorRendererTypeType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ComponentClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ComponentClassType.gif
deleted file mode 100644
index afb82ea..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ComponentClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ComponentExtensionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ComponentExtensionType.gif
deleted file mode 100644
index 33a997a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ComponentExtensionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ComponentFamilyType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ComponentFamilyType.gif
deleted file mode 100644
index caf2804..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ComponentFamilyType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ComponentType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ComponentType.gif
deleted file mode 100644
index 5a9bc75..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ComponentType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ComponentTypeType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ComponentTypeType.gif
deleted file mode 100644
index 8a5c70c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ComponentTypeType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ConverterClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ConverterClassType.gif
deleted file mode 100644
index 7bac4fd..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ConverterClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ConverterExtensionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ConverterExtensionType.gif
deleted file mode 100644
index a26660e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ConverterExtensionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ConverterForClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ConverterForClassType.gif
deleted file mode 100644
index a3908bc..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ConverterForClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ConverterIdType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ConverterIdType.gif
deleted file mode 100644
index 89ad5da..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ConverterIdType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ConverterType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ConverterType.gif
deleted file mode 100644
index 7c2aaac..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ConverterType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/DefaultLocaleType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/DefaultLocaleType.gif
deleted file mode 100644
index 98b351f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/DefaultLocaleType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/DefaultRenderKitIdType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/DefaultRenderKitIdType.gif
deleted file mode 100644
index cdd3b76..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/DefaultRenderKitIdType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/DefaultValidatorsType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/DefaultValidatorsType.gif
deleted file mode 100644
index c66ca45..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/DefaultValidatorsType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/DefaultValueType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/DefaultValueType.gif
deleted file mode 100644
index 89ad5da..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/DefaultValueType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/DescriptionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/DescriptionType.gif
deleted file mode 100644
index 53500da..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/DescriptionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/DisplayNameType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/DisplayNameType.gif
deleted file mode 100644
index ea58a65..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/DisplayNameType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/DocumentRoot.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/DocumentRoot.gif
deleted file mode 100644
index 739ebbf..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/DocumentRoot.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/DynamicAttribute.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/DynamicAttribute.gif
deleted file mode 100644
index 420eee1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/DynamicAttribute.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/DynamicElement.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/DynamicElement.gif
deleted file mode 100644
index 90d10f9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/DynamicElement.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ELResolverType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ELResolverType.gif
deleted file mode 100644
index 7b7c428..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ELResolverType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ExceptionHandlerFactoryType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ExceptionHandlerFactoryType.gif
deleted file mode 100644
index 4532576..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ExceptionHandlerFactoryType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ExternalContextFactoryType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ExternalContextFactoryType.gif
deleted file mode 100644
index 20f542c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ExternalContextFactoryType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfigExtensionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfigExtensionType.gif
deleted file mode 100644
index 35ef84e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfigExtensionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfigType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfigType.gif
deleted file mode 100644
index c4a8af4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfigType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_ActionListener.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_ActionListener.gif
deleted file mode 100644
index 67b2d33..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_ActionListener.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_Application.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_Application.gif
deleted file mode 100644
index 57e5b1e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_Application.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_Component.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_Component.gif
deleted file mode 100644
index 347a8ff..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_Component.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_Converter.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_Converter.gif
deleted file mode 100644
index 16466ed..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_Converter.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_Factory.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_Factory.gif
deleted file mode 100644
index 955d5e8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_Factory.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_LifeCycle.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_LifeCycle.gif
deleted file mode 100644
index 2c15d64..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_LifeCycle.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_LocaleConfig.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_LocaleConfig.gif
deleted file mode 100644
index 596f68b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_LocaleConfig.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_ManagedBean.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_ManagedBean.gif
deleted file mode 100644
index 6cdef7b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_ManagedBean.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_MessageBundle.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_MessageBundle.gif
deleted file mode 100644
index 8f40ee1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_MessageBundle.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_NavigationHandler.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_NavigationHandler.gif
deleted file mode 100644
index 0e242c7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_NavigationHandler.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_Pageflow16.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_Pageflow16.gif
deleted file mode 100644
index 5ea67da..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_Pageflow16.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_PhaseListener.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_PhaseListener.gif
deleted file mode 100644
index e9e7238..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_PhaseListener.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_Plugin.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_Plugin.gif
deleted file mode 100644
index 5ea67da..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_Plugin.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_PropertyResolver.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_PropertyResolver.gif
deleted file mode 100644
index 39064d9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_PropertyResolver.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_RenderKit.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_RenderKit.gif
deleted file mode 100644
index 30ba00d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_RenderKit.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_StateManager.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_StateManager.gif
deleted file mode 100644
index bf3102c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_StateManager.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_Validator.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_Validator.gif
deleted file mode 100644
index 86196e9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_Validator.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_VariableResolver.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_VariableResolver.gif
deleted file mode 100644
index 642b874..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_VariableResolver.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_ViewHandler.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_ViewHandler.gif
deleted file mode 100644
index 4834c83..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_ViewHandler.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesContextFactoryType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesContextFactoryType.gif
deleted file mode 100644
index 420eee1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesContextFactoryType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacetExtensionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacetExtensionType.gif
deleted file mode 100644
index 83afb9b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacetExtensionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacetNameType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacetNameType.gif
deleted file mode 100644
index 98b351f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacetNameType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacetType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacetType.gif
deleted file mode 100644
index 136e3b2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacetType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FactoryExtensionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FactoryExtensionType.gif
deleted file mode 100644
index 90d10f9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FactoryExtensionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FactoryType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FactoryType.gif
deleted file mode 100644
index 83afb9b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FactoryType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FromActionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FromActionType.gif
deleted file mode 100644
index b3643da..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FromActionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FromOutcomeType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FromOutcomeType.gif
deleted file mode 100644
index a26660e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FromOutcomeType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FromViewIdType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FromViewIdType.gif
deleted file mode 100644
index 48e3cf2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FromViewIdType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/IconType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/IconType.gif
deleted file mode 100644
index 106881e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/IconType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/IfType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/IfType.gif
deleted file mode 100644
index fd14cea..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/IfType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/KeyClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/KeyClassType.gif
deleted file mode 100644
index 35ef84e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/KeyClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/KeyType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/KeyType.gif
deleted file mode 100644
index 136e3b2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/KeyType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/LargeIconType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/LargeIconType.gif
deleted file mode 100644
index 33a997a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/LargeIconType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/LifecycleExtensionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/LifecycleExtensionType.gif
deleted file mode 100644
index 05dc74a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/LifecycleExtensionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/LifecycleFactoryType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/LifecycleFactoryType.gif
deleted file mode 100644
index 7bac4fd..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/LifecycleFactoryType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/LifecycleType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/LifecycleType.gif
deleted file mode 100644
index 90d10f9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/LifecycleType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ListEntriesType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ListEntriesType.gif
deleted file mode 100644
index 48e3cf2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ListEntriesType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/LocaleConfigType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/LocaleConfigType.gif
deleted file mode 100644
index 30f0c48..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/LocaleConfigType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ManagedBeanClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ManagedBeanClassType.gif
deleted file mode 100644
index 05dc74a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ManagedBeanClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ManagedBeanExtensionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ManagedBeanExtensionType.gif
deleted file mode 100644
index 8a5c70c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ManagedBeanExtensionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ManagedBeanNameType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ManagedBeanNameType.gif
deleted file mode 100644
index 5a9bc75..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ManagedBeanNameType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ManagedBeanScopeType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ManagedBeanScopeType.gif
deleted file mode 100644
index 83afb9b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ManagedBeanScopeType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ManagedBeanType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ManagedBeanType.gif
deleted file mode 100644
index 5915591..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ManagedBeanType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ManagedPropertyType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ManagedPropertyType.gif
deleted file mode 100644
index 14af8aa..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ManagedPropertyType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/MapEntriesType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/MapEntriesType.gif
deleted file mode 100644
index afb82ea..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/MapEntriesType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/MapEntryType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/MapEntryType.gif
deleted file mode 100644
index 53500da..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/MapEntryType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/MessageBundleType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/MessageBundleType.gif
deleted file mode 100644
index 89ad5da..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/MessageBundleType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/NameType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/NameType.gif
deleted file mode 100644
index e565a0b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/NameType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/NavigationCaseType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/NavigationCaseType.gif
deleted file mode 100644
index c4a8af4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/NavigationCaseType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/NavigationHandlerType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/NavigationHandlerType.gif
deleted file mode 100644
index 94c953e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/NavigationHandlerType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/NavigationRuleExtensionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/NavigationRuleExtensionType.gif
deleted file mode 100644
index c673a52..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/NavigationRuleExtensionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/NavigationRuleType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/NavigationRuleType.gif
deleted file mode 100644
index db7414e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/NavigationRuleType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/NullValueType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/NullValueType.gif
deleted file mode 100644
index c673a52..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/NullValueType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/OrderingOrderingType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/OrderingOrderingType.gif
deleted file mode 100644
index bc30f71..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/OrderingOrderingType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/OrderingOthersType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/OrderingOthersType.gif
deleted file mode 100644
index c3a5769..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/OrderingOthersType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/OrderingType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/OrderingType.gif
deleted file mode 100644
index 0a8a1a6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/OrderingType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/PartialTraversalType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/PartialTraversalType.gif
deleted file mode 100644
index c66ca45..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/PartialTraversalType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/PartialViewContextFactoryType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/PartialViewContextFactoryType.gif
deleted file mode 100644
index cb04c3e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/PartialViewContextFactoryType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/PhaseListenerType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/PhaseListenerType.gif
deleted file mode 100644
index 7b7c428..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/PhaseListenerType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/PropertyClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/PropertyClassType.gif
deleted file mode 100644
index caf2804..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/PropertyClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/PropertyExtensionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/PropertyExtensionType.gif
deleted file mode 100644
index 420eee1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/PropertyExtensionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/PropertyNameType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/PropertyNameType.gif
deleted file mode 100644
index 83afb9b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/PropertyNameType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/PropertyResolverType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/PropertyResolverType.gif
deleted file mode 100644
index c00aedf..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/PropertyResolverType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/PropertyType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/PropertyType.gif
deleted file mode 100644
index e4b530e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/PropertyType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/RedirectType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/RedirectType.gif
deleted file mode 100644
index 30f0c48..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/RedirectType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/RedirectViewParamType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/RedirectViewParamType.gif
deleted file mode 100644
index d972a2b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/RedirectViewParamType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ReferencedBeanClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ReferencedBeanClassType.gif
deleted file mode 100644
index 45731fe..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ReferencedBeanClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ReferencedBeanNameType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ReferencedBeanNameType.gif
deleted file mode 100644
index e4bc22d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ReferencedBeanNameType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ReferencedBeanType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ReferencedBeanType.gif
deleted file mode 100644
index c673a52..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ReferencedBeanType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/RenderKitClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/RenderKitClassType.gif
deleted file mode 100644
index 2124f3e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/RenderKitClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/RenderKitExtensionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/RenderKitExtensionType.gif
deleted file mode 100644
index 7b7c428..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/RenderKitExtensionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/RenderKitFactoryType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/RenderKitFactoryType.gif
deleted file mode 100644
index c673a52..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/RenderKitFactoryType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/RenderKitIdType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/RenderKitIdType.gif
deleted file mode 100644
index 7c2aaac..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/RenderKitIdType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/RenderKitType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/RenderKitType.gif
deleted file mode 100644
index 9041598..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/RenderKitType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/RendererClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/RendererClassType.gif
deleted file mode 100644
index 35ef84e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/RendererClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/RendererExtensionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/RendererExtensionType.gif
deleted file mode 100644
index 83afb9b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/RendererExtensionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/RendererType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/RendererType.gif
deleted file mode 100644
index 136e3b2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/RendererType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/RendererTypeType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/RendererTypeType.gif
deleted file mode 100644
index e4b530e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/RendererTypeType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ResourceBundleType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ResourceBundleType.gif
deleted file mode 100644
index 136e3b2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ResourceBundleType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ResourceHandlerType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ResourceHandlerType.gif
deleted file mode 100644
index cc16827..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ResourceHandlerType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/SmallIconType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/SmallIconType.gif
deleted file mode 100644
index b1f8afa..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/SmallIconType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/SourceClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/SourceClassType.gif
deleted file mode 100644
index 841f225..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/SourceClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/StateManagerType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/StateManagerType.gif
deleted file mode 100644
index e4bc22d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/StateManagerType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/SuggestedValueType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/SuggestedValueType.gif
deleted file mode 100644
index db7414e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/SuggestedValueType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/SupportedLocaleType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/SupportedLocaleType.gif
deleted file mode 100644
index 89ad5da..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/SupportedLocaleType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/SystemEventClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/SystemEventClassType.gif
deleted file mode 100644
index 4532576..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/SystemEventClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/SystemEventListenerClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/SystemEventListenerClassType.gif
deleted file mode 100644
index d972a2b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/SystemEventListenerClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/SystemEventListenerType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/SystemEventListenerType.gif
deleted file mode 100644
index b2f5929..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/SystemEventListenerType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/TagHandlerDelegateFactoryType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/TagHandlerDelegateFactoryType.gif
deleted file mode 100644
index eb42c23..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/TagHandlerDelegateFactoryType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ToViewIdType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ToViewIdType.gif
deleted file mode 100644
index e4bc22d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ToViewIdType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ValidatorClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ValidatorClassType.gif
deleted file mode 100644
index 05dc74a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ValidatorClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ValidatorExtensionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ValidatorExtensionType.gif
deleted file mode 100644
index 8a5c70c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ValidatorExtensionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ValidatorIdType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ValidatorIdType.gif
deleted file mode 100644
index d92f34c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ValidatorIdType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ValidatorType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ValidatorType.gif
deleted file mode 100644
index 5915591..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ValidatorType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ValueClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ValueClassType.gif
deleted file mode 100644
index d3dc5a9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ValueClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ValueType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ValueType.gif
deleted file mode 100644
index badaab0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ValueType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/VarType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/VarType.gif
deleted file mode 100644
index 136e3b2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/VarType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/VariableResolverType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/VariableResolverType.gif
deleted file mode 100644
index a3908bc..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/VariableResolverType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ViewDeclarationLanguageFactoryType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ViewDeclarationLanguageFactoryType.gif
deleted file mode 100644
index 12208c2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ViewDeclarationLanguageFactoryType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ViewHandlerType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ViewHandlerType.gif
deleted file mode 100644
index 2b69256..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ViewHandlerType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/VisitContextFactoryType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/VisitContextFactoryType.gif
deleted file mode 100644
index e277e7c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/VisitContextFactoryType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/model/FacesConfig.ecore b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/model/FacesConfig.ecore
deleted file mode 100644
index dda6b72..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/model/FacesConfig.ecore
+++ /dev/null
@@ -1,4828 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ecore:EPackage xmi:version="2.0"
-    xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="facesconfig"
-    nsURI="http://www.eclipse.org/webtools/jsf/schema/facesconfig.xsd" nsPrefix="facesconfig">
-  <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-    <details key="documentation" value="&#xD;&#xA;   See http://www.w3.org/XML/1998/namespace.html and&#xD;&#xA;   http://www.w3.org/TR/REC-xml for information about this namespace.&#xD;&#xA;&#xD;&#xA;    This schema document describes the XML namespace, in a form&#xD;&#xA;    suitable for import by other schema documents.  &#xD;&#xA;&#xD;&#xA;    Note that local names in this namespace are intended to be defined&#xD;&#xA;    only by the World Wide Web Consortium or its subgroups.  The&#xD;&#xA;    following names are currently defined in this namespace and should&#xD;&#xA;    not be used with conflicting semantics by any Working Group,&#xD;&#xA;    specification, or document instance:&#xD;&#xA;&#xD;&#xA;    base (as an attribute name): denotes an attribute whose value&#xD;&#xA;         provides a URI to be used as the base for interpreting any&#xD;&#xA;         relative URIs in the scope of the element on which it&#xD;&#xA;         appears; its value is inherited.  This name is reserved&#xD;&#xA;         by virtue of its definition in the XML Base specification.&#xD;&#xA;&#xD;&#xA;    id   (as an attribute name): denotes an attribute whose value&#xD;&#xA;         should be interpreted as if declared to be of type ID.&#xD;&#xA;         The xml:id specification is not yet a W3C Recommendation,&#xD;&#xA;         but this attribute is included here to facilitate experimentation&#xD;&#xA;         with the mechanisms it proposes.  Note that it is _not_ included&#xD;&#xA;         in the specialAttrs attribute group.&#xD;&#xA;&#xD;&#xA;    lang (as an attribute name): denotes an attribute whose value&#xD;&#xA;         is a language code for the natural language of the content of&#xD;&#xA;         any element; its value is inherited.  This name is reserved&#xD;&#xA;         by virtue of its definition in the XML specification.&#xD;&#xA;  &#xD;&#xA;    space (as an attribute name): denotes an attribute whose&#xD;&#xA;         value is a keyword indicating what whitespace processing&#xD;&#xA;         discipline is intended for the content of the element; its&#xD;&#xA;         value is inherited.  This name is reserved by virtue of its&#xD;&#xA;         definition in the XML specification.&#xD;&#xA;&#xD;&#xA;    Father (in any context at all): denotes Jon Bosak, the chair of &#xD;&#xA;         the original XML Working Group.  This name is reserved by &#xD;&#xA;         the following decision of the W3C XML Plenary and &#xD;&#xA;         XML Coordination groups:&#xD;&#xA;&#xD;&#xA;             In appreciation for his vision, leadership and dedication&#xD;&#xA;             the W3C XML Plenary on this 10th day of February, 2000&#xD;&#xA;             reserves for Jon Bosak in perpetuity the XML name&#xD;&#xA;             xml:Father&#xD;&#xA;  &#xD;&#xA;This schema defines attributes and an attribute group&#xD;&#xA;        suitable for use by&#xD;&#xA;        schemas wishing to allow xml:base, xml:lang, xml:space or xml:id&#xD;&#xA;        attributes on elements they define.&#xD;&#xA;&#xD;&#xA;        To enable this, such a schema must import this schema&#xD;&#xA;        for the XML namespace, e.g. as follows:&#xD;&#xA;        &amp;lt;schema . . .&amp;gt;&#xD;&#xA;         . . .&#xD;&#xA;         &amp;lt;import namespace=&quot;http://www.w3.org/XML/1998/namespace&quot;&#xD;&#xA;                    schemaLocation=&quot;http://www.w3.org/2001/xml.xsd&quot;/&amp;gt;&#xD;&#xA;&#xD;&#xA;        Subsequently, qualified reference to any of the attributes&#xD;&#xA;        or the group defined below will have the desired effect, e.g.&#xD;&#xA;&#xD;&#xA;        &amp;lt;type . . .&amp;gt;&#xD;&#xA;         . . .&#xD;&#xA;         &amp;lt;attributeGroup ref=&quot;xml:specialAttrs&quot;/&amp;gt;&#xD;&#xA; &#xD;&#xA;         will define a type which will schema-validate an instance&#xD;&#xA;         element with any of those attributes&#xD;&#xA;In keeping with the XML Schema WG's standard versioning&#xD;&#xA;   policy, this schema document will persist at&#xD;&#xA;   http://www.w3.org/2005/08/xml.xsd.&#xD;&#xA;   At the date of issue it can also be found at&#xD;&#xA;   http://www.w3.org/2001/xml.xsd.&#xD;&#xA;   The schema document at that URI may however change in the future,&#xD;&#xA;   in order to remain compatible with the latest version of XML Schema&#xD;&#xA;   itself, or with the XML namespace itself.  In other words, if the XML&#xD;&#xA;   Schema or XML namespaces change, the version of this document at&#xD;&#xA;   http://www.w3.org/2001/xml.xsd will change&#xD;&#xA;   accordingly; the version at&#xD;&#xA;   http://www.w3.org/2005/08/xml.xsd will not change.&#xD;&#xA;  "/>
-  </eAnnotations>
-  <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-    <details key="qualified" value="false"/>
-  </eAnnotations>
-  <eClassifiers xsi:type="ecore:EClass" name="AbsoluteOrderingType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="absolute-ordering_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="name" upperBound="-1" eType="#//NameType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="name"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="others" eType="#//OrderingOthersType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="others"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ActionListenerType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="action-listener_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ApplicationFactoryType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="application-factory_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ApplicationType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="application_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="actionListener" upperBound="-1"
-        eType="#//ActionListenerType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="action-listener"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="defaultRenderKitId" upperBound="-1"
-        eType="#//DefaultRenderKitIdType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="default-render-kit-id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="messageBundle" upperBound="-1"
-        eType="#//MessageBundleType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="message-bundle"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="navigationHandler" upperBound="-1"
-        eType="#//NavigationHandlerType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="navigation-handler"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="viewHandler" upperBound="-1"
-        eType="#//ViewHandlerType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="view-handler"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="stateManager" upperBound="-1"
-        eType="#//StateManagerType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="state-manager"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="eLResolver" upperBound="-1"
-        eType="#//ELResolverType">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="el-resolver"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="propertyResolver" upperBound="-1"
-        eType="#//PropertyResolverType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="property-resolver"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="variableResolver" upperBound="-1"
-        eType="#//VariableResolverType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="variable-resolver"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="resourceHandler" upperBound="-1"
-        eType="#//ResourceHandlerType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="resource-handler"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="systemEventListener" upperBound="-1"
-        eType="#//SystemEventListenerType">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="system-event-listener"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="localeConfig" upperBound="-1"
-        eType="#//LocaleConfigType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="locale-config"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="resourceBundle" upperBound="-1"
-        eType="#//ResourceBundleType">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="resource-bundle"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="applicationExtension" upperBound="-1"
-        eType="#//ApplicationExtensionType">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="application-extension"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="defaultValidators" upperBound="-1"
-        eType="#//DefaultValidatorsType">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="default-validators"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ApplicationExtensionType" eSuperTypes="#//ExtensionType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="application-extension_._type"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="AttributeClassType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="attribute-class_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="AttributeExtensionType" eSuperTypes="#//ExtensionType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="attribute-extension_._type"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="AttributeNameType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="attribute-name_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="AttributeType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="attribute_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="description" upperBound="-1"
-        eType="#//DescriptionType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="description"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="displayName" upperBound="-1"
-        eType="#//DisplayNameType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="display-name"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="icon" upperBound="-1" eType="#//IconType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="icon"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="attributeName" lowerBound="1"
-        eType="#//AttributeNameType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="attribute-name"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="attributeClass" lowerBound="1"
-        eType="#//AttributeClassType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="attribute-class"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="defaultValue" eType="#//DefaultValueType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="default-value"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="suggestedValue" eType="#//SuggestedValueType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="suggested-value"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="attributeExtension" upperBound="-1"
-        eType="#//AttributeExtensionType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="attribute-extension"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="BehaviorClassType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="behavior-class_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="BehaviorIdType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="behavior-id_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="BehaviorType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="behavior_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="description" upperBound="-1"
-        eType="#//DescriptionType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="description"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="displayName" upperBound="-1"
-        eType="#//DisplayNameType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="display-name"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="icon" upperBound="-1" eType="#//IconType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="icon"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="behaviorId" lowerBound="1"
-        eType="#//BehaviorIdType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="behavior-id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="behaviorClass" lowerBound="1"
-        eType="#//BehaviorClassType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="behavior-class"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="attribute" upperBound="-1"
-        eType="#//AttributeType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="attribute"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="property" upperBound="-1"
-        eType="#//PropertyType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="property"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="behaviorExtension" upperBound="-1"
-        eType="#//BehaviorExtensionType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="behavior-extension"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="BehaviorExtensionType" eSuperTypes="#//ExtensionType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="behavior-extension_._type"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ClientBehaviorRendererClassType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="client-behavior-renderer-class_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ClientBehaviorRendererType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="client-behavior-renderer_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="clientBehaviorRendererType"
-        lowerBound="1" eType="#//ClientBehaviorRendererTypeType" containment="true"
-        resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="client-behavior-renderer-type"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="clientBehaviorRendererClass"
-        lowerBound="1" eType="#//ClientBehaviorRendererClassType" containment="true"
-        resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="client-behavior-renderer-class"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ClientBehaviorRendererTypeType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="client-behavior-renderer-type_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ComponentClassType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="component-class_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ComponentExtensionType" eSuperTypes="#//ExtensionType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="component-extension_._type"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ComponentFamilyType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="component-family_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ComponentType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="component_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="description" upperBound="-1"
-        eType="#//DescriptionType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="description"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="displayName" upperBound="-1"
-        eType="#//DisplayNameType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="display-name"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="icon" upperBound="-1" eType="#//IconType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="icon"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="componentType" lowerBound="1"
-        eType="#//ComponentTypeType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="component-type"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="componentClass" lowerBound="1"
-        eType="#//ComponentClassType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="component-class"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="facet" upperBound="-1"
-        eType="#//FacetType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="facet"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="attribute" upperBound="-1"
-        eType="#//AttributeType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="attribute"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="property" upperBound="-1"
-        eType="#//PropertyType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="property"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="componentExtension" upperBound="-1"
-        eType="#//ComponentExtensionType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="component-extension"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ComponentTypeType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="component-type_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ConverterClassType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="converter-class_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ConverterForClassType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="converter-for-class_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ConverterIdType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="converter-id_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ConverterType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="converter_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="description" upperBound="-1"
-        eType="#//DescriptionType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="description"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="displayName" upperBound="-1"
-        eType="#//DisplayNameType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="display-name"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="icon" upperBound="-1" eType="#//IconType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="icon"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="converterId" eType="#//ConverterIdType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="converter-id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="converterForClass" eType="#//ConverterForClassType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="converter-for-class"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="converterClass" lowerBound="1"
-        eType="#//ConverterClassType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="converter-class"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="attribute" upperBound="-1"
-        eType="#//AttributeType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="attribute"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="property" upperBound="-1"
-        eType="#//PropertyType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="property"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="converterExtension" upperBound="-1"
-        eType="#//ConverterExtensionType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="converter-extension"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ConverterExtensionType" eSuperTypes="#//ExtensionType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="converter-extension_._type"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="DefaultLocaleType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="default-locale_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="DefaultRenderKitIdType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="default-render-kit-id_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="DefaultValidatorsType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="default-validators_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="validatorId" upperBound="-1"
-        eType="#//ValidatorIdType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="validator-id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="DefaultValueType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="default-value_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="DescriptionType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="description_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="lang" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Language">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="lang"/>
-        <details key="namespace" value="http://www.w3.org/XML/1998/namespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="DisplayNameType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="display-name_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="lang" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Language">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="lang"/>
-        <details key="namespace" value="http://www.w3.org/XML/1998/namespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="DocumentRoot">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value=""/>
-      <details key="kind" value="mixed"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="mixed" unique="false" upperBound="-1"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EFeatureMapEntry">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="elementWildcard"/>
-        <details key="name" value=":mixed"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="xMLNSPrefixMap" unique="false"
-        upperBound="-1" eType="ecore:EClass http://www.eclipse.org/emf/2002/Ecore#//EStringToStringMapEntry"
-        transient="true" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="xmlns:prefix"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="xSISchemaLocation" unique="false"
-        upperBound="-1" eType="ecore:EClass http://www.eclipse.org/emf/2002/Ecore#//EStringToStringMapEntry"
-        transient="true" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="xsi:schemaLocation"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="absoluteOrdering" upperBound="-2"
-        eType="#//AbsoluteOrderingType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value=""/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="absolute-ordering"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="actionListener" upperBound="-2"
-        eType="#//ActionListenerType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value=" ==================== Subordinate&#xD;&#xA;                Elements ============================       The&#xD;&#xA;                &quot;action-listener&quot; element contains the fully&#xD;&#xA;                qualified class name     of the concrete ActionListener&#xD;&#xA;                implementation class that will be called     during the&#xD;&#xA;                Invoke Application phase of the request processing&#xD;&#xA;                lifecycle.     It must be of type &quot;ClassName&quot;. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="action-listener"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="application" upperBound="-2"
-        eType="#//ApplicationType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value=" ==================== Definition Elements&#xD;&#xA;                =============================       The&#xD;&#xA;                &quot;application&quot; element provides a mechanism to&#xD;&#xA;                define the various     per-application-singleton&#xD;&#xA;                implementation classes for a particular web&#xD;&#xA;                application that is utilizing JavaServer Faces.  For&#xD;&#xA;                nested elements     that are not specified, the JSF&#xD;&#xA;                implementation must provide a suitable     default. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="application"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="applicationFactory" upperBound="-2"
-        eType="#//ApplicationFactoryType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="     The &quot;application-factory&quot;&#xD;&#xA;                element contains the fully qualified class     name of&#xD;&#xA;                the concrete ApplicationFactory implementation class&#xD;&#xA;                that     will be called when&#xD;&#xA;                FactoryFinder.getFactory(APPLICATION_FACTORY) is&#xD;&#xA;                called. It must be of type &quot;ClassName&quot;. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="application-factory"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="attribute" upperBound="-2"
-        eType="#//AttributeType" volatile="true" transient="true" derived="true" containment="true"
-        resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="     The &quot;attribute&quot; element&#xD;&#xA;                represents a named, typed, value associated with     the&#xD;&#xA;                parent UIComponent via the generic attributes mechanism.&#xD;&#xA;                Attribute names must be unique within the scope of the&#xD;&#xA;                parent (or related)     component. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="attribute"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="attributeClass" upperBound="-2"
-        eType="#//AttributeClassType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="    The &quot;attribute-class&quot; element represents the Java type of the value&#xA;    associated with this attribute name.  It must be of type &quot;ClassName&quot;."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="attribute-class"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="attributeExtension" upperBound="-2"
-        eType="#//AttributeExtensionType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="      Extension element for attribute.&#xD;&#xA;                May contain implementation     specific content. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="attribute-extension"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="attributeName" upperBound="-2"
-        eType="#//AttributeNameType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="     The &quot;attribute-name&quot;&#xD;&#xA;                element represents the name under which the&#xD;&#xA;                corresponding value will be stored, in the generic&#xD;&#xA;                attributes of the     UIComponent we are related to. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="attribute-name"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="behavior" upperBound="-2"
-        eType="#//BehaviorType" volatile="true" transient="true" derived="true" containment="true"
-        resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value=""/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="behavior"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="behaviorClass" upperBound="-2"
-        eType="#//BehaviorClassType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value=""/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="behavior-class"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="behaviorId" upperBound="-2"
-        eType="#//BehaviorIdType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value=""/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="behavior-id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="behaviorExtension" upperBound="-2"
-        eType="#//BehaviorExtensionType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value=""/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="behavior-extension"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="component" upperBound="-2"
-        eType="#//ComponentType" volatile="true" transient="true" derived="true" containment="true"
-        resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="     The &quot;component&quot; element&#xD;&#xA;                represents a concrete UIComponent implementation&#xD;&#xA;                class that should be registered under the specified type&#xD;&#xA;                identifier,     along with its associated properties and&#xD;&#xA;                attributes.  Component types must     be unique within&#xD;&#xA;                the entire web application.      Nested&#xD;&#xA;                &quot;attribute&quot; elements identify generic&#xD;&#xA;                attributes that are recognized     by the implementation&#xD;&#xA;                logic of this component.  Nested &quot;property&quot;&#xD;&#xA;                elements     identify JavaBeans properties of the&#xD;&#xA;                component class that may be exposed     for manipulation&#xD;&#xA;                via tools. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="component"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="componentClass" upperBound="-2"
-        eType="#//ComponentClassType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="     The &quot;component-class&quot;&#xD;&#xA;                element represents the fully qualified class name     of&#xD;&#xA;                a concrete UIComponent implementation class.  It must be&#xD;&#xA;                of     type &quot;ClassName&quot;. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="component-class"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="componentExtension" upperBound="-2"
-        eType="#//ComponentExtensionType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="      Extension element for component.&#xD;&#xA;                May contain implementation     specific content. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="component-extension"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="componentFamily" upperBound="-2"
-        eType="#//ComponentFamilyType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="    The &quot;component-family&quot; element represents the component family for&#xA;    which the Renderer represented by the parent &quot;renderer&quot; element will be&#xA;    used."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="component-family"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="componentType" upperBound="-2"
-        eType="#//ComponentTypeType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="     The &quot;component-type&quot;&#xD;&#xA;                element represents the name under which the&#xD;&#xA;                corresponding UIComponent class should be registered. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="component-type"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="converter" upperBound="-2"
-        eType="#//ConverterType" volatile="true" transient="true" derived="true" containment="true"
-        resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="     The &quot;converter&quot; element&#xD;&#xA;                represents a concrete Converter implementation     class&#xD;&#xA;                that should be registered under the specified converter&#xD;&#xA;                identifier.     Converter identifiers must be unique&#xD;&#xA;                within the entire web application.      Nested&#xD;&#xA;                &quot;attribute&quot; elements identify generic&#xD;&#xA;                attributes that may be     configured on the&#xD;&#xA;                corresponding UIComponent in order to affect the&#xD;&#xA;                operation of the Converter.  Nested &quot;property&quot;&#xD;&#xA;                elements identify JavaBeans     properties of the&#xD;&#xA;                Converter implementation class that may be configured&#xD;&#xA;                to affect the operation of the Converter. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="converter"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="converterClass" upperBound="-2"
-        eType="#//ConverterClassType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="    The &quot;converter-class&quot; element represents the fully qualified class name&#xA;    of a concrete Converter implementation class.  It must be of&#xA;    type &quot;ClassName&quot;."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="converter-class"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="converterForClass" upperBound="-2"
-        eType="#//ConverterForClassType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="    The &quot;converter-for-class&quot; element represents the fully qualified class name&#xA;    for which a Converter class will be registered.  It must be of&#xA;    type &quot;ClassName&quot;."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="converter-for-class"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="converterId" upperBound="-2"
-        eType="#//ConverterIdType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="    The &quot;converter-id&quot; element represents the identifier under which the&#xA;    corresponding Converter class should be registered."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="converter-id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="defaultLocale" upperBound="-2"
-        eType="#//DefaultLocaleType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="      The &quot;default-locale&quot;&#xD;&#xA;                element declares the default locale for this&#xD;&#xA;                application instance.  It must be specified as&#xD;&#xA;                :language:[_:country:[_:variant:]] without the colons,&#xD;&#xA;                for example      &quot;ja_JP_SJIS&quot;.  The separators&#xD;&#xA;                between the segments may be '-' or&#xD;&#xA;                '_'. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="default-locale"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="defaultRenderKitId" upperBound="-2"
-        eType="#//DefaultRenderKitIdType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="    The &quot;default-render-kit-id&quot; element allows the application to define&#xA;    a renderkit to be used other than the standard one. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="default-render-kit-id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="defaultValidators" upperBound="-2"
-        eType="#//DefaultValidatorsType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value=""/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="default-validators"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="defaultValue" upperBound="-2"
-        eType="#//DefaultValueType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="    The &quot;default-value&quot; contains the value for the property or attribute&#xA;    in which this element resides.  This value differs from the&#xA;    &quot;suggested-value&quot; in that the property or attribute must take the&#xA;    value, whereas in &quot;suggested-value&quot; taking the value is optional."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="default-value"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="description" upperBound="-2"
-        eType="#//DescriptionType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="     The &quot;description&quot; element&#xD;&#xA;                contains a textual description of the element     it is&#xD;&#xA;                nested in, optionally flagged with a language code using&#xD;&#xA;                the     &quot;xml:lang&quot; attribute. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="description"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="displayName" upperBound="-2"
-        eType="#//DisplayNameType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="     The &quot;display-name&quot; element&#xD;&#xA;                is a short descriptive name describing the     entity&#xD;&#xA;                associated with the element it is nested in, intended to&#xD;&#xA;                be     displayed by tools, and optionally flagged with a&#xD;&#xA;                language code using     the &quot;xml:lang&quot;&#xD;&#xA;                attribute. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="display-name"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="exceptionHandlerFactory"
-        upperBound="-2" eType="#//ExceptionHandlerFactoryType" volatile="true" transient="true"
-        derived="true" containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value=""/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="exception-handler-factory"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="externalContextFactory"
-        upperBound="-2" eType="#//ExternalContextFactoryType" volatile="true" transient="true"
-        derived="true" containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value=""/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="external-context-factory"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="facesConfig" upperBound="-2"
-        eType="#//FacesConfigType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value=" ==================== Top Level Elements&#xD;&#xA;                ==============================       The&#xD;&#xA;                &quot;faces-config&quot; element is the root of the&#xD;&#xA;                configuration information     hierarchy, and contains&#xD;&#xA;                nested elements for all of the other configuration&#xD;&#xA;                settings. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="faces-config"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="facesContextFactory" upperBound="-2"
-        eType="#//FacesContextFactoryType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="     The&#xD;&#xA;                &quot;faces-context-factory&quot; element contains the&#xD;&#xA;                fully qualified     class name of the concrete&#xD;&#xA;                FacesContextFactory implementation class     that will&#xD;&#xA;                be called when&#xD;&#xA;                FactoryFinder.getFactory(FACES_CONTEXT_FACTORY) is&#xD;&#xA;                called. It must     be of type &quot;ClassName&quot;. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="faces-context-factory"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="facet" upperBound="-2"
-        eType="#//FacetType" volatile="true" transient="true" derived="true" containment="true"
-        resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="   Define the name and other design-time information for a facet that is&#xA;   associated with a renderer or a component."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="facet"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="facetExtension" upperBound="-2"
-        eType="#//FacetExtensionType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="    Extension element for facet.  May contain implementation&#xA;    specific content."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="facet-extension"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="facetName" upperBound="-2"
-        eType="#//FacetNameType" volatile="true" transient="true" derived="true" containment="true"
-        resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="    The &quot;facet-name&quot; element represents the facet name under which a&#xA;    UIComponent will be added to its parent.  It must be of type&#xA;    &quot;Identifier&quot;."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="facet-name"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="factory" upperBound="-2"
-        eType="#//FactoryType" volatile="true" transient="true" derived="true" containment="true"
-        resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="     The &quot;factory&quot; element&#xD;&#xA;                provides a mechanism to define the various     Factories&#xD;&#xA;                that comprise parts of the implementation of JavaServer&#xD;&#xA;                Faces.  For nested elements that are not specified, the&#xD;&#xA;                JSF     implementation must provide a suitable default. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="factory"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="fromAction" upperBound="-2"
-        eType="#//FromActionType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="    The &quot;from-action&quot; element contains an action reference expression&#xA;    that must have been executed (by the default ActionListener for handling&#xA;    application level events) in order to select this navigation rule.  If&#xA;    not specified, this rule will be relevant no matter which action reference&#xA;    was executed (or if no action reference was executed).&#xA;&#xA;    This value must be of type &quot;Action&quot;."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="from-action"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="fromOutcome" upperBound="-2"
-        eType="#//FromOutcomeType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="    The &quot;from-outcome&quot; element contains a logical outcome string returned&#xA;    by the execution of an application action method selected via an&#xA;    &quot;actionRef&quot; property (or a literal value specified by an &quot;action&quot;&#xA;    property) of a UICommand component.  If specified, this rule will be&#xA;    relevant only if the outcome value matches this element's value.  If&#xA;    not specified, this rule will be relevant no matter what the outcome&#xA;    value was."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="from-outcome"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="fromViewId" upperBound="-2"
-        eType="#//FromViewIdType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="    The &quot;from-view-id&quot; element contains the view identifier of the view&#xA;    for which the containing navigation rule is relevant.  If no&#xA;    &quot;from-view&quot; element is specified, this rule applies to navigation&#xA;    decisions on all views.  If this element is not specified, a value&#xA;    of &quot;*&quot; is assumed, meaning that this navigation rule applies to all&#xA;    views.&#xA;&#xA;    This value must be of type &quot;ViewIdPattern&quot;."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="from-view-id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="icon" upperBound="-2" eType="#//IconType"
-        volatile="true" transient="true" derived="true" containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="     The &quot;icon&quot; element&#xD;&#xA;                contains &quot;small-icon&quot; and&#xD;&#xA;                &quot;large-icon&quot; elements that     specify the&#xD;&#xA;                resoruce paths for small and large GIF or JPG icon&#xD;&#xA;                images     used to represent the parent element in a GUI&#xD;&#xA;                tool. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="icon"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="if" upperBound="-2" eType="#//IfType"
-        volatile="true" transient="true" derived="true" containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value=""/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="if"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="key" upperBound="-2" eType="#//KeyType"
-        volatile="true" transient="true" derived="true" containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="    The &quot;key&quot; element is the String representation of a map key that&#xA;    will be stored in a managed property of type java.util.Map.  "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="key"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="keyClass" upperBound="-2"
-        eType="#//KeyClassType" volatile="true" transient="true" derived="true" containment="true"
-        resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="    The &quot;key-class&quot; element defines the Java type to which each &quot;key&quot;&#xA;    element in a set of &quot;map-entry&quot; elements will be converted to.  It&#xA;    must be of type &quot;ClassName&quot;.  If omitted, &quot;java.lang.String&quot;&#xA;    is assumed."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="key-class"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="largeIcon" upperBound="-2"
-        eType="#//LargeIconType" volatile="true" transient="true" derived="true" containment="true"
-        resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="    The &quot;large-icon&quot; element contains the resource path to a large (32x32)&#xA;    icon image.  The image may be in either GIF or JPG format."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="large-icon"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="lifecycle" upperBound="-2"
-        eType="#//LifecycleType" volatile="true" transient="true" derived="true" containment="true"
-        resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="     The &quot;lifecycle&quot; element&#xD;&#xA;                provides a mechanism to specify     modifications to the&#xD;&#xA;                behaviour of the default Lifecycle     implementation&#xD;&#xA;                for this web application. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="lifecycle"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="lifecycleFactory" upperBound="-2"
-        eType="#//LifecycleFactoryType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="     The &quot;lifecycle-factory&quot;&#xD;&#xA;                element contains the fully qualified class name     of&#xD;&#xA;                the concrete LifecycleFactory implementation class that&#xD;&#xA;                will be called     when&#xD;&#xA;                FactoryFinder.getFactory(LIFECYCLE_FACTORY) is called.&#xD;&#xA;                It must be      of type &quot;ClassName&quot;. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="lifecycle-factory"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="listEntries" upperBound="-2"
-        eType="#//ListEntriesType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="     The &quot;list-entries&quot; element&#xD;&#xA;                represents a set of initialization     elements for a&#xD;&#xA;                managed property that is a java.util.List or an&#xD;&#xA;                array.  In the former case, the &quot;value-class&quot;&#xD;&#xA;                element can optionally     be used to declare the Java&#xD;&#xA;                type to which each value should be     converted before&#xD;&#xA;                adding it to the Collection. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="list-entries"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="localeConfig" upperBound="-2"
-        eType="#//LocaleConfigType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="      The &quot;locale-config&quot;&#xD;&#xA;                element allows the app developer to declare the&#xD;&#xA;                supported locales for this application.   "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="locale-config"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="managedBean" upperBound="-2"
-        eType="#//ManagedBeanType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="     The &quot;managed-bean&quot; element&#xD;&#xA;                represents a JavaBean, of a particular class,     that&#xD;&#xA;                will be dynamically instantiated at runtime (by the&#xD;&#xA;                default     VariableResolver implementation) if it is&#xD;&#xA;                referenced as the first element     of a value reference&#xD;&#xA;                expression, and no corresponding bean can be&#xD;&#xA;                identified in any scope.  In addition to the creation of&#xD;&#xA;                the managed bean,     and the optional storing of it&#xD;&#xA;                into the specified scope, the nested&#xD;&#xA;                managed-property elements can be used to initialize the&#xD;&#xA;                contents of     settable JavaBeans properties of the&#xD;&#xA;                created instance. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="managed-bean"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="managedBeanClass" upperBound="-2"
-        eType="#//ManagedBeanClassType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="    The &quot;managed-bean-class&quot; element represents the fully qualified class&#xA;    name of the Java class that will be used to instantiate a new instance&#xA;    if creation of the specified managed bean is requested.  It must be of&#xA;    type &quot;ClassName&quot;.&#xA;&#xA;    The specified class must conform to standard JavaBeans conventions.&#xA;    In particular, it must have a public zero-arguments constructor, and&#xA;    zero or more public property setters."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="managed-bean-class"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="managedBeanName" upperBound="-2"
-        eType="#//ManagedBeanNameType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="    The &quot;managed-bean-name&quot; element represents the attribute name under&#xA;    which a managed bean will be searched for, as well as stored (unless&#xA;    the &quot;managed-bean-scope&quot; value is &quot;none&quot;).  It must be of type&#xA;    &quot;Identifier&quot;."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="managed-bean-name"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="managedBeanScope" upperBound="-2"
-        eType="#//ManagedBeanScopeType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="    The &quot;managed-bean-scope&quot; element represents the scope into which a newly&#xA;    created instance of the specified managed bean will be stored (unless&#xA;    the value is &quot;none&quot;).  It must be of type &quot;ScopeOrNone&quot;."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="managed-bean-scope"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="managedProperty" upperBound="-2"
-        eType="#//ManagedPropertyType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="     The &quot;managed-property&quot;&#xD;&#xA;                element represents an individual property of a&#xD;&#xA;                managed bean that will be configured to the specified&#xD;&#xA;                value (or value set)     if the corresponding managed&#xD;&#xA;                bean is automatically created. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="managed-property"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="mapEntries" upperBound="-2"
-        eType="#//MapEntriesType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="     The &quot;map-entries' element&#xD;&#xA;                represents a set of key-entry pairs that     will be&#xD;&#xA;                added to the computed value of a managed property of&#xD;&#xA;                type     java.util.Map.  In addition, the Java class&#xD;&#xA;                types of the key and entry     values may be optionally&#xD;&#xA;                declared. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="map-entries"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="mapEntry" upperBound="-2"
-        eType="#//MapEntryType" volatile="true" transient="true" derived="true" containment="true"
-        resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="     The &quot;map-entry&quot; element&#xD;&#xA;                reprsents a single key-entry pair that     will be added&#xD;&#xA;                to the computed value of a managed property of type&#xD;&#xA;                java.util.Map. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="map-entry"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="messageBundle" upperBound="-2"
-        eType="#//MessageBundleType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="     The base name of a resource bundle&#xD;&#xA;                representing the message resources     for this&#xD;&#xA;                application.  See the JavaDocs for the&#xD;&#xA;                &quot;java.util.ResourceBundle&quot;     class for more&#xD;&#xA;                information on the syntax of resource bundle names. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="message-bundle"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="name" upperBound="-2" eType="#//NameType"
-        volatile="true" transient="true" derived="true" containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value=""/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="name"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="navigationCase" upperBound="-2"
-        eType="#//NavigationCaseType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="     The &quot;navigation-case&quot;&#xD;&#xA;                element describes a particular combination of&#xD;&#xA;                conditions that must match for this case to be executed,&#xD;&#xA;                and the     view id of the component tree that should be&#xD;&#xA;                selected next. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="navigation-case"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="navigationHandler" upperBound="-2"
-        eType="#//NavigationHandlerType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="     The &quot;navigation-handler&quot;&#xD;&#xA;                element contains the fully qualified class name     of&#xD;&#xA;                the concrete NavigationHandler implementation class that&#xD;&#xA;                will be called     during the Invoke Application phase&#xD;&#xA;                of the request processing lifecycle,     if the default&#xD;&#xA;                ActionListener (provided by the JSF implementation) is&#xD;&#xA;                used.     It must be of type &quot;ClassName&quot;. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="navigation-handler"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="navigationRule" upperBound="-2"
-        eType="#//NavigationRuleType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="     The &quot;navigation-rule&quot;&#xD;&#xA;                element represents an individual decision rule     that&#xD;&#xA;                will be utilized by the default NavigationHandler&#xD;&#xA;                implementation to make decisions on what view should be&#xD;&#xA;                displayed     next, based on the view id being&#xD;&#xA;                processed. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="navigation-rule"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="nullValue" upperBound="-2"
-        eType="#//NullValueType" volatile="true" transient="true" derived="true" containment="true"
-        resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="     The &quot;null-value&quot; element&#xD;&#xA;                indicates that the managed property in which we     are&#xD;&#xA;                nested will be explicitly set to null if our managed&#xD;&#xA;                bean is     automatically created.  This is different&#xD;&#xA;                from omitting the managed     property element entirely,&#xD;&#xA;                which will cause no property setter to be     called for&#xD;&#xA;                this property.      The &quot;null-value&quot; element&#xD;&#xA;                can only be used when the associated&#xD;&#xA;                &quot;property-class&quot; identifies a Java class, not&#xD;&#xA;                a Java primitive. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="null-value"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="ordering" upperBound="-2"
-        eType="#//OrderingType" volatile="true" transient="true" derived="true" containment="true"
-        resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value=""/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ordering"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="orderingOrdering" upperBound="-2"
-        eType="#//OrderingOrderingType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value=""/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ordering-ordering"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="others" upperBound="-2"
-        eType="#//OrderingOthersType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value=""/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="others"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="partialViewContextFactory"
-        upperBound="-2" eType="#//PartialViewContextFactoryType" volatile="true" transient="true"
-        derived="true" containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value=""/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="partial-view-context-factory"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="phaseListener" upperBound="-2"
-        eType="#//PhaseListenerType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value=" The &quot;phase-listener&quot; element&#xD;&#xA;                contains the fully qualified class name of the concrete&#xD;&#xA;                PhaseListener implementation class that will be&#xD;&#xA;                registered on the Lifecycle. It must be of type&#xD;&#xA;                &quot;ClassName&quot;. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="phase-listener"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="property" upperBound="-2"
-        eType="#//PropertyType" volatile="true" transient="true" derived="true" containment="true"
-        resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="     The &quot;property&quot; element&#xD;&#xA;                represents a JavaBean property of the Java class&#xD;&#xA;                represented by our parent element.      Property names&#xD;&#xA;                must be unique within the scope of the Java class&#xD;&#xA;                that is represented by the parent element, and must&#xD;&#xA;                correspond to     property names that will be recognized&#xD;&#xA;                when performing introspection     against that class via&#xD;&#xA;                java.beans.Introspector. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="property"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="propertyClass" upperBound="-2"
-        eType="#//PropertyClassType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="    The &quot;property-class&quot; element represents the Java type of the value&#xA;    associated with this property name.  It must be of type &quot;JavaType&quot;.&#xA;    If not specified, it can be inferred from existing classes; however,&#xA;    this element should be specified if the configuration file is going&#xA;    to be the source for generating the corresponding classes."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="property-class"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="propertyExtension" upperBound="-2"
-        eType="#//PropertyExtensionType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="      Extension element for property.&#xD;&#xA;                May contain implementation     specific content. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="property-extension"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="propertyName" upperBound="-2"
-        eType="#//PropertyNameType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="    The &quot;property-name&quot; element represents the JavaBeans property name&#xA;    under which the corresponding value may be stored."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="property-name"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="propertyResolver" upperBound="-2"
-        eType="#//PropertyResolverType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="     The &quot;property-resolver&quot;&#xD;&#xA;                element contains the fully qualified class name     of&#xD;&#xA;                the concrete PropertyResolver implementation class that&#xD;&#xA;                will be used     during the processing of value&#xD;&#xA;                reference expressions.     It must be of type&#xD;&#xA;                &quot;ClassName&quot;. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="property-resolver"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="redirect" upperBound="-2"
-        eType="#//RedirectType" volatile="true" transient="true" derived="true" containment="true"
-        resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="     The &quot;redirect&quot; element&#xD;&#xA;                indicates that navigation to the specified&#xD;&#xA;                &quot;to-view-id&quot; should be accomplished by&#xD;&#xA;                performing an HTTP redirect     rather than the usual&#xD;&#xA;                ViewHandler mechanisms. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="redirect"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="redirectViewParam" upperBound="-2"
-        eType="#//RedirectViewParamType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value=""/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="view-param"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="referencedBean" upperBound="-2"
-        eType="#//ReferencedBeanType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="     The &quot;referenced-bean&quot;&#xD;&#xA;                element represents at design time the promise     that a&#xD;&#xA;                Java object of the specified type will exist at runtime&#xD;&#xA;                in some     scope, under the specified key.  This can be&#xD;&#xA;                used by design time tools     to construct user&#xD;&#xA;                interface dialogs based on the properties of the&#xD;&#xA;                specified class.  The presence or absence of a&#xD;&#xA;                referenced bean     element has no impact on the&#xD;&#xA;                JavaServer Faces runtime environment     inside a web&#xD;&#xA;                application. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="referenced-bean"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="referencedBeanClass" upperBound="-2"
-        eType="#//ReferencedBeanClassType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="    The &quot;referenced-bean-class&quot; element represents the fully qualified class&#xA;    name of the Java class (either abstract or concrete) or Java interface&#xA;    implemented by the corresponding referenced bean.  It must be of type&#xA;    &quot;ClassName&quot;."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="referenced-bean-class"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="referencedBeanName" upperBound="-2"
-        eType="#//ReferencedBeanNameType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="    The &quot;referenced-bean-name&quot; element represents the attribute name under&#xA;    which the corresponding referenced bean may be assumed to be stored,&#xA;    in one of the scopes defined by the &quot;Scope&quot; type.  It must be of type&#xA;    &quot;Identifier&quot;."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="referenced-bean-name"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="renderer" upperBound="-2"
-        eType="#//RendererType" volatile="true" transient="true" derived="true" containment="true"
-        resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="     The &quot;renderer&quot; element&#xD;&#xA;                represents a concrete Renderer implementation     class&#xD;&#xA;                that should be registered under the specified type&#xD;&#xA;                identifier,     in the RenderKit associated with the&#xD;&#xA;                parent render-kit element.  Renderer     types must be&#xD;&#xA;                unique within the RenderKit associated with the parent&#xD;&#xA;                &quot;render-kit&quot; element.      Nested&#xD;&#xA;                &quot;attribute&quot; elements identify generic&#xD;&#xA;                component attributes that     are recognized by this&#xD;&#xA;                renderer.  Nested &quot;supported-component-type&quot;&#xD;&#xA;                and     &quot;supported-component-class&quot; elements&#xD;&#xA;                identify supported component classes,     by their type&#xD;&#xA;                identifiers or the implementation class name,&#xD;&#xA;                respectively,     that are supported by this Renderer. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="renderer"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="rendererClass" upperBound="-2"
-        eType="#//RendererClassType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="    The &quot;renderer-class&quot; element represents the fully qualified class name&#xA;    of a concrete Renderer implementation class.  It must be of&#xA;    type &quot;ClassName&quot;."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="renderer-class"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="rendererExtension" upperBound="-2"
-        eType="#//RendererExtensionType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="      Extension element for renderer.&#xD;&#xA;                May contain implementation     specific content. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="renderer-extension"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="rendererType" upperBound="-2"
-        eType="#//RendererTypeType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="    The &quot;renderer-type&quot; element represents a renderer type identifier for the&#xA;    Renderer represented by the parent &quot;renderer&quot; element."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="renderer-type"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="renderKit" upperBound="-2"
-        eType="#//RenderKitType" volatile="true" transient="true" derived="true" containment="true"
-        resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="     The &quot;render-kit&quot; element&#xD;&#xA;                represents a concrete RenderKit implementation     that&#xD;&#xA;                should be registered under the specified render-kit-id.&#xD;&#xA;                If no     render-kit-id is specified, the identifier of&#xD;&#xA;                the default RenderKit&#xD;&#xA;                (RenderKitFactory.DEFAULT_RENDER_KIT) is assumed. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="render-kit"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="renderKitClass" upperBound="-2"
-        eType="#//RenderKitClassType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="    The &quot;render-kit-class&quot; element represents the fully qualified class name&#xA;    of a concrete RenderKit implementation class.  It must be of&#xA;    type &quot;ClassName&quot;."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="render-kit-class"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="renderKitFactory" upperBound="-2"
-        eType="#//RenderKitFactoryType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="     The &quot;render-kit-factory&quot;&#xD;&#xA;                element contains the fully qualified class name     of&#xD;&#xA;                the concrete RenderKitFactory implementation class that&#xD;&#xA;                will be called     when&#xD;&#xA;                FactoryFinder.getFactory(RENDER_KIT_FACTORY) is called.&#xD;&#xA;                It must be      of type &quot;ClassName&quot;. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="render-kit-factory"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="renderKitId" upperBound="-2"
-        eType="#//RenderKitIdType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="    The &quot;render-kit-id&quot; element represents an identifier for the&#xA;    RenderKit represented by the parent &quot;render-kit&quot; element."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="render-kit-id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="resourceHandler" upperBound="-2"
-        eType="#//ResourceHandlerType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value=""/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="resource-handler"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="smallIcon" upperBound="-2"
-        eType="#//SmallIconType" volatile="true" transient="true" derived="true" containment="true"
-        resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="    The &quot;small-icon&quot; element contains the resource path to a small (16x16)&#xA;    icon image.  The image may be in either GIF or JPG format."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="small-icon"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="sourceClass" upperBound="-2"
-        eType="#//SourceClassType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value=""/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="source-class"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="stateManager" upperBound="-2"
-        eType="#//StateManagerType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="      The &quot;state-manager&quot;&#xD;&#xA;                element contains the fully qualified class name     of&#xD;&#xA;                the concrete StateManager implementation class that will&#xD;&#xA;                be called     during the Restore View and Render&#xD;&#xA;                Response phases of the request     processing lifecycle.&#xD;&#xA;                The faces implementation must provide a     default&#xD;&#xA;                implementation of this class "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="state-manager"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="suggestedValue" upperBound="-2"
-        eType="#//SuggestedValueType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="    The &quot;suggested-value&quot; contains the value for the property or&#xA;    attribute in which this element resides.  This value is advisory&#xA;    only and is intended for tools to use when populating pallettes."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="suggested-value"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="supportedLocale" upperBound="-2"
-        eType="#//SupportedLocaleType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="      The &quot;supported-locale&quot;&#xD;&#xA;                element allows authors to declare which      locales are&#xD;&#xA;                supported in this application instance.       It must be&#xD;&#xA;                specified as :language:[_:country:[_:variant:]] without&#xD;&#xA;                the colons, for example &quot;ja_JP_SJIS&quot;.  The&#xD;&#xA;                separators between the      segments may be&#xD;&#xA;                '-' or '_'. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="supported-locale"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="systemEventClass" upperBound="-2"
-        eType="#//SystemEventClassType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value=""/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="system-event-class"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="systemEventListener" upperBound="-2"
-        eType="#//SystemEventListenerType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value=""/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="system-event-listener"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="systemEventListenerClass"
-        upperBound="-2" eType="#//SystemEventListenerClassType" volatile="true" transient="true"
-        derived="true" containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value=""/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="system-event-listener-class"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="tagHandlerDelegateFactory"
-        upperBound="-2" eType="#//TagHandlerDelegateFactoryType" volatile="true" transient="true"
-        derived="true" containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value=""/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="tag-handler-delegate-factory"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="toViewId" upperBound="-2"
-        eType="#//ToViewIdType" volatile="true" transient="true" derived="true" containment="true"
-        resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="    The &quot;to-view&quot; element contains the view identifier of the next view&#xA;    that should be displayed if this navigation rule is matched.  It&#xA;    must be of type &quot;ViewId&quot;."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="to-view-id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="validator" upperBound="-2"
-        eType="#//ValidatorType" volatile="true" transient="true" derived="true" containment="true"
-        resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="     The &quot;validator&quot; element&#xD;&#xA;                represents a concrete Validator implementation     class&#xD;&#xA;                that should be registered under the specified validator&#xD;&#xA;                identifier.     Validator identifiers must be unique&#xD;&#xA;                within the entire web application.      Nested&#xD;&#xA;                &quot;attribute&quot; elements identify generic&#xD;&#xA;                attributes that may be     configured on the&#xD;&#xA;                corresponding UIComponent in order to affect the&#xD;&#xA;                operation of the Validator.  Nested &quot;property&quot;&#xD;&#xA;                elements identify JavaBeans     properties of the&#xD;&#xA;                Validator implementation class that may be configured&#xD;&#xA;                to affect the operation of the Validator. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="validator"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="validatorClass" upperBound="-2"
-        eType="#//ValidatorClassType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="    The &quot;validator-class&quot; element represents the fully qualified class name&#xA;    of a concrete Validator implementation class.  It must be of&#xA;    type &quot;ClassName&quot;."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="validator-class"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="validatorId" upperBound="-2"
-        eType="#//ValidatorIdType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="    The &quot;validator-id&quot; element represents the identifier under which the&#xA;    corresponding Validator class should be registered."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="validator-id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="value" upperBound="-2"
-        eType="#//ValueType" volatile="true" transient="true" derived="true" containment="true"
-        resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="     The &quot;value&quot; element is the&#xD;&#xA;                String representation of a literal     value to which a&#xD;&#xA;                scalar managed property will be set, or a value&#xD;&#xA;                reference expression (&quot;#{...}&quot;) that will be&#xD;&#xA;                used to calculate the     required value.  It will be&#xD;&#xA;                converted as specified for the actual     property type. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="value"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="valueClass" upperBound="-2"
-        eType="#//ValueClassType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="    The &quot;value-class&quot; element defines the Java type to which each&#xA;    &quot;value&quot; element's value will be converted to, prior to adding it to&#xA;    the &quot;list-entries&quot; list for a managed property that is a&#xA;    java.util.List, or a &quot;map-entries&quot; map for a managed property that&#xA;    is a java.util.Map.  It must be of type &quot;ClassName&quot;.  If omitted,&#xA;    &quot;java.lang.String&quot; is assumed."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="value-class"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="variableResolver" upperBound="-2"
-        eType="#//VariableResolverType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="     The &quot;variable-resolver&quot;&#xD;&#xA;                element contains the fully qualified class name     of&#xD;&#xA;                the concrete VariableResolver implementation class that&#xD;&#xA;                will be used     during the processing of value&#xD;&#xA;                reference expressions.     It must be of type&#xD;&#xA;                &quot;ClassName&quot;. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="variable-resolver"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="viewDeclarationLanguageFactory"
-        upperBound="-2" eType="#//ViewDeclarationLanguageFactoryType" volatile="true"
-        transient="true" derived="true" containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value=""/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="view-declaration-language-factory"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="viewHandler" upperBound="-2"
-        eType="#//ViewHandlerType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="      The &quot;view-handler&quot;&#xD;&#xA;                element contains the fully qualified class name     of&#xD;&#xA;                the concrete ViewHandler implementation class that will&#xD;&#xA;                be called     during the Restore View and Render&#xD;&#xA;                Response phases of the request     processing lifecycle.&#xD;&#xA;                The faces implementation must provide a     default&#xD;&#xA;                implementation of this class "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="view-handler"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="visitContextFactory" upperBound="-2"
-        eType="#//VisitContextFactoryType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value=""/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="visit-context-factory"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="DynamicAttribute">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="name" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="value" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="DynamicElement">
-    <eStructuralFeatures xsi:type="ecore:EReference" name="childNodes" upperBound="-1"
-        eType="#//DynamicElement" containment="true"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="name" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="attributes" upperBound="-1"
-        eType="#//DynamicAttribute"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ELResolverType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="el-resolver_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ExceptionHandlerFactoryType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="exception-handler-factory_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ExtensionType" abstract="true">
-    <eStructuralFeatures xsi:type="ecore:EReference" name="childNodes" upperBound="-1"
-        eType="#//DynamicElement"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ExternalContextFactoryType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="external-context-factory_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="FacesConfigType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="faces-config_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="application" upperBound="-1"
-        eType="#//ApplicationType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="application"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="ordering" upperBound="-1"
-        eType="#//OrderingType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ordering"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="absoluteOrdering" eType="#//AbsoluteOrderingType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="absolute-ordering"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="factory" upperBound="-1"
-        eType="#//FactoryType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="factory"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="component" upperBound="-1"
-        eType="#//ComponentType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="component"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="converter" upperBound="-1"
-        eType="#//ConverterType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="converter"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="managedBean" upperBound="-1"
-        eType="#//ManagedBeanType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="managed-bean"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="name" eType="#//NameType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="name"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="navigationRule" upperBound="-1"
-        eType="#//NavigationRuleType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="navigation-rule"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="referencedBean" upperBound="-1"
-        eType="#//ReferencedBeanType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="referenced-bean"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="renderKit" upperBound="-1"
-        eType="#//RenderKitType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="render-kit"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="lifecycle" upperBound="-1"
-        eType="#//LifecycleType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="lifecycle"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="validator" upperBound="-1"
-        eType="#//ValidatorType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="validator"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="behavior" upperBound="-1"
-        eType="#//BehaviorType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="behavior"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="facesConfigExtension" upperBound="-1"
-        eType="#//FacesConfigExtensionType">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="faces-config-extension"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="xmlns" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String"
-        defaultValueLiteral="http://java.sun.com/JSF/Configuration" unsettable="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="xmlns"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="metadataComplete" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="metadata-complete"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="FacesConfigExtensionType" eSuperTypes="#//ExtensionType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="faces-config-extension_._type"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="FacesContextFactoryType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="faces-context-factory_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="FacetExtensionType" eSuperTypes="#//ExtensionType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="facet-extension_._type"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="FacetNameType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="facet-name_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="FacetType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="facet_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="description" upperBound="-1"
-        eType="#//DescriptionType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="description"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="displayName" upperBound="-1"
-        eType="#//DisplayNameType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="display-name"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="icon" upperBound="-1" eType="#//IconType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="icon"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="facetName" lowerBound="1"
-        eType="#//FacetNameType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="facet-name"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="facetExtension" upperBound="-1"
-        eType="#//FacetExtensionType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="facet-extension"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="FactoryType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="factory_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="applicationFactory" upperBound="-1"
-        eType="#//ApplicationFactoryType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="application-factory"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="exceptionHandlerFactory"
-        upperBound="-1" eType="#//ExceptionHandlerFactoryType" containment="true"
-        resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="exception-handler-factory"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="externalContextFactory"
-        upperBound="-1" eType="#//ExternalContextFactoryType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="external-context-factory"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="facesContextFactory" upperBound="-1"
-        eType="#//FacesContextFactoryType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="faces-context-factory"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="partialViewContextFactory"
-        upperBound="-1" eType="#//PartialViewContextFactoryType" containment="true"
-        resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="partial-view-context-factory"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="lifecycleFactory" upperBound="-1"
-        eType="#//LifecycleFactoryType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="lifecycle-factory"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="viewDeclarationLanguageFactory"
-        upperBound="-1" eType="#//ViewDeclarationLanguageFactoryType" containment="true"
-        resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="view-declaration-language-factory"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="tagHandlerDelegateFactory"
-        upperBound="-1" eType="#//TagHandlerDelegateFactoryType" containment="true"
-        resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="tag-handler-delegate-factory"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="renderKitFactory" upperBound="-1"
-        eType="#//RenderKitFactoryType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="render-kit-factory"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="visitContextFactory" upperBound="-1"
-        eType="#//VisitContextFactoryType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="visit-context-factory"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="factoryExtension" upperBound="-1"
-        eType="#//FactoryExtensionType">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="factory-type"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="FactoryExtensionType" eSuperTypes="#//ExtensionType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="factory-extension_._type"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="FromActionType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="from-action_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="FromOutcomeType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="from-outcome_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="FromViewIdType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="from-view-id_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="IconType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="icon_._type"/>
-      <details key="kind" value="empty"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="smallIcon" eType="#//SmallIconType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="small-icon"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="largeIcon" eType="#//LargeIconType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="large-icon"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="lang" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Language">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="lang"/>
-        <details key="namespace" value="http://www.w3.org/XML/1998/namespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="IfType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="if_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="KeyClassType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="key-class_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="KeyType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="key_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="LargeIconType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="large-icon_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="LifecycleFactoryType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="lifecycle-factory_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="LifecycleType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="lifecycle_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="phaseListener" upperBound="-1"
-        eType="#//PhaseListenerType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="phase-listener"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="lifecycleExtension" upperBound="-1"
-        eType="#//LifecycleExtensionType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="lifecycle-extension"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="LifecycleExtensionType" eSuperTypes="#//ExtensionType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="lifecycle-extension_._type"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ListEntriesType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="list-entries_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="valueClass" eType="#//ValueClassType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="value-class"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="nullValue" upperBound="-1"
-        eType="#//NullValueType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="null-value"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="value" upperBound="-1"
-        eType="#//ValueType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="value"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="LocaleConfigType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="locale-config_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="defaultLocale" eType="#//DefaultLocaleType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="default-locale"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="supportedLocale" upperBound="-1"
-        eType="#//SupportedLocaleType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="supported-locale"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ManagedBeanClassType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="managed-bean-class_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ManagedBeanNameType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="managed-bean-name_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ManagedBeanScopeType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="managed-bean-scope_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ManagedBeanType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="managed-bean_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="description" upperBound="-1"
-        eType="#//DescriptionType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="description"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="displayName" upperBound="-1"
-        eType="#//DisplayNameType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="display-name"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="icon" upperBound="-1" eType="#//IconType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="icon"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="managedBeanName" lowerBound="1"
-        eType="#//ManagedBeanNameType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="managed-bean-name"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="managedBeanClass" lowerBound="1"
-        eType="#//ManagedBeanClassType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="managed-bean-class"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="managedBeanScope" lowerBound="1"
-        eType="#//ManagedBeanScopeType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="managed-bean-scope"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="managedProperty" upperBound="-1"
-        eType="#//ManagedPropertyType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="managed-property"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="mapEntries" eType="#//MapEntriesType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="map-entries"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="listEntries" eType="#//ListEntriesType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="list-entries"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="managedBeanExtension" upperBound="-1"
-        eType="#//ManagedBeanExtensionType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="managed-bean-extension"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="eager" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="eager"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ManagedBeanExtensionType" eSuperTypes="#//ExtensionType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="managed-bean-extension_._type"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ManagedPropertyType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="managed-property_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="description" upperBound="-1"
-        eType="#//DescriptionType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="description"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="displayName" upperBound="-1"
-        eType="#//DisplayNameType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="display-name"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="icon" upperBound="-1" eType="#//IconType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="icon"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="propertyName" lowerBound="1"
-        eType="#//PropertyNameType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="property-name"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="propertyClass" eType="#//PropertyClassType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="property-class"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="mapEntries" eType="#//MapEntriesType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="map-entries"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="nullValue" eType="#//NullValueType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="null-value"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="value" eType="#//ValueType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="value"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="listEntries" eType="#//ListEntriesType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="list-entries"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="MapEntriesType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="map-entries_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="keyClass" eType="#//KeyClassType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="key-class"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="valueClass" eType="#//ValueClassType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="value-class"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="mapEntry" upperBound="-1"
-        eType="#//MapEntryType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="map-entry"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="MapEntryType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="map-entry_._type"/>
-      <details key="kind" value="empty"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="key" lowerBound="1" eType="#//KeyType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="key"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="nullValue" eType="#//NullValueType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="null-value"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="value" eType="#//ValueType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="value"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="MessageBundleType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="message-bundle_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="NameType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="name_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="NavigationCaseType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="navigation-case_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="description" upperBound="-1"
-        eType="#//DescriptionType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="description"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="displayName" upperBound="-1"
-        eType="#//DisplayNameType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="display-name"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="icon" upperBound="-1" eType="#//IconType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="icon"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="fromAction" eType="#//FromActionType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="from-action"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="fromOutcome" eType="#//FromOutcomeType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="from-outcome"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="if" eType="#//IfType" containment="true"
-        resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="if"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="toViewId" lowerBound="1"
-        eType="#//ToViewIdType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="to-view-id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="redirect" eType="#//RedirectType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="redirect"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="NavigationHandlerType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="navigation-handler_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="NavigationRuleType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="navigation-rule_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="description" upperBound="-1"
-        eType="#//DescriptionType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="description"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="displayName" upperBound="-1"
-        eType="#//DisplayNameType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="display-name"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="icon" upperBound="-1" eType="#//IconType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="icon"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="fromViewId" eType="#//FromViewIdType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="from-view-id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="navigationCase" upperBound="-1"
-        eType="#//NavigationCaseType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="navigation-case"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="navigationRuleExtension"
-        upperBound="-1" eType="#//NavigationRuleExtensionType" containment="true"
-        resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="navigation-rule-extension"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="NavigationRuleExtensionType" eSuperTypes="#//ExtensionType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="navigation-rule-extension_._type"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="NullValueType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="null-value_._type"/>
-      <details key="kind" value="empty"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="OrderingType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="ordering_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="before" eType="#//OrderingOrderingType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="before"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="after" eType="#//OrderingOrderingType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="after"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="OrderingOrderingType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="ordering-ordering_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="name" upperBound="-1" eType="#//NameType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="name"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="others" eType="#//OrderingOthersType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="others"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="OrderingOthersType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="others_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="PartialViewContextFactoryType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="partial-view-context-factory_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="PhaseListenerType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="phase-listener_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="PropertyClassType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="property-class_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="PropertyExtensionType" eSuperTypes="#//ExtensionType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="property-extension_._type"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="PropertyNameType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="property-name_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="PropertyResolverType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="property-resolver_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="PropertyType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="property_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="description" upperBound="-1"
-        eType="#//DescriptionType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="description"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="displayName" upperBound="-1"
-        eType="#//DisplayNameType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="display-name"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="icon" upperBound="-1" eType="#//IconType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="icon"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="propertyName" lowerBound="1"
-        eType="#//PropertyNameType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="property-name"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="propertyClass" lowerBound="1"
-        eType="#//PropertyClassType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="property-class"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="defaultValue" eType="#//DefaultValueType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="default-value"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="suggestedValue" eType="#//SuggestedValueType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="suggested-value"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="propertyExtension" upperBound="-1"
-        eType="#//PropertyExtensionType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="property-extension"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="RedirectType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="redirect_._type"/>
-      <details key="kind" value="empty"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="viewParam" upperBound="-1"
-        eType="#//RedirectViewParamType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="view-param"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="includeViewParams" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="include-view-params"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="RedirectViewParamType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="redirect-viewParam_._type"/>
-      <details key="kind" value="empty"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="name" lowerBound="1" eType="#//NameType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="name"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="value" lowerBound="1" eType="#//ValueType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="value"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ReferencedBeanClassType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="referenced-bean-class_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ReferencedBeanNameType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="referenced-bean-name_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ReferencedBeanType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="referenced-bean_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="description" upperBound="-1"
-        eType="#//DescriptionType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="description"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="displayName" upperBound="-1"
-        eType="#//DisplayNameType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="display-name"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="icon" upperBound="-1" eType="#//IconType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="icon"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="referencedBeanName" lowerBound="1"
-        eType="#//ReferencedBeanNameType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="referenced-bean-name"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="referencedBeanClass" lowerBound="1"
-        eType="#//ReferencedBeanClassType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="referenced-bean-class"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="RendererClassType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="renderer-class_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="RendererExtensionType" eSuperTypes="#//ExtensionType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="renderer-extension_._type"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="RendererType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="renderer_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="description" upperBound="-1"
-        eType="#//DescriptionType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="description"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="displayName" upperBound="-1"
-        eType="#//DisplayNameType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="display-name"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="icon" upperBound="-1" eType="#//IconType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="icon"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="componentFamily" lowerBound="1"
-        eType="#//ComponentFamilyType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="component-family"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="rendererType" lowerBound="1"
-        eType="#//RendererTypeType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="renderer-type"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="rendererClass" lowerBound="1"
-        eType="#//RendererClassType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="renderer-class"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="facet" upperBound="-1"
-        eType="#//FacetType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="facet"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="attribute" upperBound="-1"
-        eType="#//AttributeType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="attribute"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="rendererExtension" upperBound="-1"
-        eType="#//RendererExtensionType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="renderer-extension"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="RendererTypeType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="renderer-type_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="RenderKitClassType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="render-kit-class_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="RenderKitFactoryType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="render-kit-factory_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="RenderKitIdType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="render-kit-id_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="RenderKitType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="render-kit_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="description" upperBound="-1"
-        eType="#//DescriptionType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="description"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="displayName" upperBound="-1"
-        eType="#//DisplayNameType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="display-name"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="icon" upperBound="-1" eType="#//IconType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="icon"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="renderKitId" eType="#//RenderKitIdType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="render-kit-id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="renderKitClass" eType="#//RenderKitClassType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="render-kit-class"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="renderer" upperBound="-1"
-        eType="#//RendererType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="renderer"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="clientBehaviorRenderer"
-        upperBound="-1" eType="#//ClientBehaviorRendererType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="client-behavior-renderer"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="renderKitExtension" upperBound="-1"
-        eType="#//RenderKitExtensionType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="render-kit-extension"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="RenderKitExtensionType" eSuperTypes="#//ExtensionType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="render-kit-extension_._type"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ResourceHandlerType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="resource-handler_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="SmallIconType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="small-icon_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="SourceClassType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="source-class_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="StateManagerType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="state-manager_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="SuggestedValueType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="suggested-value_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="SupportedLocaleType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="supported-locale_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="SystemEventClassType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="system-event-class_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="SystemEventListenerClassType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="system-event-listener-class_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="SystemEventListenerType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="system-event-listener_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="systemEventListenerClass"
-        lowerBound="1" eType="#//SystemEventListenerClassType" containment="true"
-        resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="system-event-listener-class"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="systemEventClass" lowerBound="1"
-        eType="#//SystemEventClassType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="system-event-class"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="sourceClass" eType="#//SourceClassType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="source-class"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="TagHandlerDelegateFactoryType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="tag-handler-delegate-factory_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ToViewIdType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="to-view-id_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ValidatorClassType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="validator-class_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ValidatorIdType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="validator-id_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ValidatorType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="validator_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="description" upperBound="-1"
-        eType="#//DescriptionType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="description"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="displayName" upperBound="-1"
-        eType="#//DisplayNameType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="display-name"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="icon" upperBound="-1" eType="#//IconType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="icon"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="validatorId" lowerBound="1"
-        eType="#//ValidatorIdType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="validator-id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="validatorClass" lowerBound="1"
-        eType="#//ValidatorClassType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="validator-class"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="attribute" upperBound="-1"
-        eType="#//AttributeType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="attribute"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="property" upperBound="-1"
-        eType="#//PropertyType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="property"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="validatorExtension" upperBound="-1"
-        eType="#//ValidatorExtensionType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="validator-extension"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ValidatorExtensionType" eSuperTypes="#//ExtensionType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="validator-extension_._type"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ValueClassType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="value-class_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ValueType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="value_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="VariableResolverType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="variable-resolver_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ViewHandlerType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="view-handler_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ResourceBundleType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="resourceBundle_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="description" upperBound="-1"
-        eType="#//DescriptionType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="description"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="displayName" upperBound="-1"
-        eType="#//DisplayNameType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="display-name"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="icon" upperBound="-1" eType="#//IconType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="icon"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="baseName" eType="#//BaseNameType">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="base-name"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="var" eType="#//VarType">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="var"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="BaseNameType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="base-name_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="VarType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="var_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ViewDeclarationLanguageFactoryType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="view-declaration-language-factory_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="VisitContextFactoryType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="visit-context-factory_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-</ecore:EPackage>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/model/facesConfig.genmodel b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/model/facesConfig.genmodel
deleted file mode 100644
index 8ed8544..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/model/facesConfig.genmodel
+++ /dev/null
@@ -1,738 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<genmodel:GenModel xmi:version="2.0"
-    xmlns:xmi="http://www.omg.org/XMI" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore"
-    xmlns:genmodel="http://www.eclipse.org/emf/2002/GenModel" copyrightText="Copyright (c) 2005, 2006 IBM Corporation and others"
-    modelDirectory="/org.eclipse.jst.jsf.facesconfig/facesconfig" editDirectory="/org.eclipse.jst.jsf.facesconfig/facesconfig"
-    editorDirectory="/org.eclipse.jst.jsf.facesconfig.editor/src" modelPluginID="org.eclipse.jst.jsf.facesconfig"
-    templateDirectory="org.eclipse.jst.jsf.facesconfig/model/templates" dynamicTemplates="true"
-    redirection="" modelName="FacesConfig" modelPluginClass="" editPluginClass="org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin"
-    editorPluginClass="org.eclipse.jst.jsf.facesconfig.emf.presentation.FacesConfigEditorPlugin"
-    rootImplementsInterface="" featureMapWrapperInterface="" featureMapWrapperInternalInterface=""
-    featureMapWrapperClass="" testSuiteClass="org.eclipse.jst.jsf.facesconfig.emf.tests.FacesConfigAllTests"
-    booleanFlagsField="">
-  <foreignModel>../../../com.ibm.etools.jsf/facesConfig.xsd</foreignModel>
-  <genPackages prefix="FacesConfig" basePackage="org.eclipse.jst.jsf" disposableProviderFactory="true"
-      interfacePackageSuffix="emf" metaDataPackageSuffix="emf" classPackageSuffix="emf.impl"
-      utilityPackageSuffix="emf.util" providerPackageSuffix="edit.provider" presentationPackageSuffix="emf.presentation"
-      testsPackageSuffix="emf.tests" ecorePackage="FacesConfig.ecore#/">
-    <genClasses ecoreClass="FacesConfig.ecore#//AbsoluteOrderingType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//AbsoluteOrderingType/id"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//AbsoluteOrderingType/name"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//AbsoluteOrderingType/others"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//ActionListenerType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ActionListenerType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ActionListenerType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//ApplicationFactoryType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ApplicationFactoryType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ApplicationFactoryType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//ApplicationType">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ApplicationType/actionListener"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ApplicationType/defaultRenderKitId"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ApplicationType/messageBundle"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ApplicationType/navigationHandler"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ApplicationType/partialTraversal"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ApplicationType/viewHandler"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ApplicationType/stateManager"/>
-      <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ApplicationType/eLResolver"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ApplicationType/propertyResolver"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ApplicationType/variableResolver"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ApplicationType/resourceHandler"/>
-      <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ApplicationType/systemEventListener"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ApplicationType/localeConfig"/>
-      <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ApplicationType/resourceBundle"/>
-      <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ApplicationType/applicationExtension"/>
-      <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ApplicationType/defaultValidators"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ApplicationType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//ApplicationExtensionType"/>
-    <genClasses ecoreClass="FacesConfig.ecore#//AttributeClassType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//AttributeClassType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//AttributeClassType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//AttributeExtensionType"/>
-    <genClasses ecoreClass="FacesConfig.ecore#//AttributeNameType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//AttributeNameType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//AttributeNameType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//AttributeType">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//AttributeType/description"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//AttributeType/displayName"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//AttributeType/icon"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//AttributeType/attributeName"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//AttributeType/attributeClass"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//AttributeType/defaultValue"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//AttributeType/suggestedValue"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//AttributeType/attributeExtension"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//AttributeType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//BehaviorClassType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//BehaviorClassType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//BehaviorClassType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//BehaviorIdType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//BehaviorIdType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//BehaviorIdType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//BehaviorType">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//BehaviorType/description"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//BehaviorType/displayName"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//BehaviorType/icon"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//BehaviorType/behaviorId"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//BehaviorType/behaviorClass"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//BehaviorType/attribute"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//BehaviorType/property"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//BehaviorType/behaviorExtension"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//BehaviorType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//BehaviorExtensionType"/>
-    <genClasses ecoreClass="FacesConfig.ecore#//ClientBehaviorRendererClassType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ClientBehaviorRendererClassType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ClientBehaviorRendererClassType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//ClientBehaviorRendererType">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ClientBehaviorRendererType/clientBehaviorRendererType"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ClientBehaviorRendererType/clientBehaviorRendererClass"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ClientBehaviorRendererType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//ClientBehaviorRendererTypeType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ClientBehaviorRendererTypeType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ClientBehaviorRendererTypeType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//ComponentClassType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ComponentClassType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ComponentClassType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//ComponentExtensionType"/>
-    <genClasses ecoreClass="FacesConfig.ecore#//ComponentFamilyType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ComponentFamilyType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ComponentFamilyType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//ComponentType">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ComponentType/description"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ComponentType/displayName"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ComponentType/icon"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ComponentType/componentType"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ComponentType/componentClass"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ComponentType/facet"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ComponentType/attribute"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ComponentType/property"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ComponentType/componentExtension"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ComponentType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//ComponentTypeType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ComponentTypeType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ComponentTypeType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//ConverterClassType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ConverterClassType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ConverterClassType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//ConverterForClassType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ConverterForClassType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ConverterForClassType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//ConverterIdType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ConverterIdType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ConverterIdType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//ConverterType">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ConverterType/description"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ConverterType/displayName"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ConverterType/icon"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ConverterType/converterId"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ConverterType/converterForClass"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ConverterType/converterClass"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ConverterType/attribute"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ConverterType/property"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ConverterType/converterExtension"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ConverterType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//ConverterExtensionType"/>
-    <genClasses ecoreClass="FacesConfig.ecore#//DefaultLocaleType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//DefaultLocaleType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//DefaultLocaleType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//DefaultRenderKitIdType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//DefaultRenderKitIdType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//DefaultRenderKitIdType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//DefaultValidatorsType">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DefaultValidatorsType/validatorId"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//DefaultValidatorsType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//DefaultValueType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//DefaultValueType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//DefaultValueType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//DescriptionType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//DescriptionType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//DescriptionType/lang"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//DescriptionType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//DisplayNameType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//DisplayNameType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//DisplayNameType/lang"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//DisplayNameType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//DocumentRoot">
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//DocumentRoot/mixed"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/xMLNSPrefixMap"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/xSISchemaLocation"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/absoluteOrdering"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/actionListener"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/application"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/applicationFactory"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/attribute"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/attributeClass"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/attributeExtension"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/attributeName"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/behavior"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/behaviorClass"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/behaviorId"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/behaviorExtension"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/component"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/componentClass"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/componentExtension"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/componentFamily"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/componentType"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/converter"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/converterClass"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/converterForClass"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/converterId"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/defaultLocale"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/defaultRenderKitId"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/defaultValidators"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/defaultValue"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/description"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/displayName"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/exceptionHandlerFactory"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/externalContextFactory"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/facesConfig"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/facesContextFactory"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/facet"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/facetExtension"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/facetName"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/factory"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/fromAction"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/fromOutcome"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/fromViewId"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/icon"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/if"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/key"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/keyClass"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/largeIcon"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/lifecycle"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/lifecycleFactory"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/listEntries"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/localeConfig"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/managedBean"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/managedBeanClass"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/managedBeanName"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/managedBeanScope"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/managedProperty"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/mapEntries"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/mapEntry"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/messageBundle"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/name"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/navigationCase"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/navigationHandler"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/navigationRule"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/nullValue"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/ordering"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/orderingOrdering"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/others"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/partialTraversal"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/partialViewContextFactory"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/phaseListener"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/property"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/propertyClass"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/propertyExtension"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/propertyName"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/propertyResolver"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/redirect"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/redirectViewParam"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/referencedBean"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/referencedBeanClass"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/referencedBeanName"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/renderer"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/rendererClass"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/rendererExtension"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/rendererType"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/renderKit"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/renderKitClass"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/renderKitFactory"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/renderKitId"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/resourceHandler"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/smallIcon"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/sourceClass"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/stateManager"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/suggestedValue"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/supportedLocale"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/systemEventClass"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/systemEventListener"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/systemEventListenerClass"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/tagHandlerDelegateFactory"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/toViewId"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/validator"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/validatorClass"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/validatorId"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/value"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/valueClass"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/variableResolver"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/viewDeclarationLanguageFactory"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/viewHandler"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/visitContextFactory"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//DynamicAttribute">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//DynamicAttribute/name"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//DynamicAttribute/value"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//DynamicElement">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DynamicElement/childNodes"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//DynamicElement/name"/>
-      <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DynamicElement/attributes"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//DynamicElement/textContent"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//ELResolverType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ELResolverType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ELResolverType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//ExceptionHandlerFactoryType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ExceptionHandlerFactoryType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ExceptionHandlerFactoryType/id"/>
-    </genClasses>
-    <genClasses image="false" ecoreClass="FacesConfig.ecore#//ExtensionType">
-      <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ExtensionType/childNodes"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ExtensionType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ExtensionType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//ExternalContextFactoryType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ExternalContextFactoryType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ExternalContextFactoryType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//FacesConfigType">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//FacesConfigType/application"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//FacesConfigType/ordering"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//FacesConfigType/absoluteOrdering"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//FacesConfigType/factory"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//FacesConfigType/component"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//FacesConfigType/converter"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//FacesConfigType/managedBean"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//FacesConfigType/name"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//FacesConfigType/navigationRule"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//FacesConfigType/referencedBean"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//FacesConfigType/renderKit"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//FacesConfigType/lifecycle"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//FacesConfigType/validator"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//FacesConfigType/behavior"/>
-      <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//FacesConfigType/facesConfigExtension"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//FacesConfigType/xmlns"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//FacesConfigType/id"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//FacesConfigType/metadataComplete"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//FacesConfigExtensionType"/>
-    <genClasses ecoreClass="FacesConfig.ecore#//FacesContextFactoryType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//FacesContextFactoryType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//FacesContextFactoryType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//FacetExtensionType"/>
-    <genClasses ecoreClass="FacesConfig.ecore#//FacetNameType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//FacetNameType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//FacetNameType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//FacetType">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//FacetType/description"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//FacetType/displayName"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//FacetType/icon"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//FacetType/facetName"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//FacetType/facetExtension"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//FacetType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//FactoryType">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//FactoryType/applicationFactory"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//FactoryType/exceptionHandlerFactory"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//FactoryType/externalContextFactory"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//FactoryType/facesContextFactory"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//FactoryType/partialViewContextFactory"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//FactoryType/lifecycleFactory"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//FactoryType/viewDeclarationLanguageFactory"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//FactoryType/tagHandlerDelegateFactory"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//FactoryType/renderKitFactory"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//FactoryType/visitContextFactory"/>
-      <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//FactoryType/factoryExtension"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//FactoryType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//FactoryExtensionType"/>
-    <genClasses ecoreClass="FacesConfig.ecore#//FromActionType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//FromActionType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//FromActionType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//FromOutcomeType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//FromOutcomeType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//FromOutcomeType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//FromViewIdType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//FromViewIdType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//FromViewIdType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//IconType">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//IconType/smallIcon"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//IconType/largeIcon"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//IconType/lang"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//IconType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//IfType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//IfType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//IfType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//KeyClassType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//KeyClassType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//KeyClassType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//KeyType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//KeyType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//KeyType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//LargeIconType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//LargeIconType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//LargeIconType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//LifecycleFactoryType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//LifecycleFactoryType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//LifecycleFactoryType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//LifecycleType">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//LifecycleType/phaseListener"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//LifecycleType/lifecycleExtension"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//LifecycleType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//LifecycleExtensionType"/>
-    <genClasses ecoreClass="FacesConfig.ecore#//ListEntriesType">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ListEntriesType/valueClass"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ListEntriesType/nullValue"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ListEntriesType/value"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ListEntriesType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//LocaleConfigType">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//LocaleConfigType/defaultLocale"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//LocaleConfigType/supportedLocale"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//LocaleConfigType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//ManagedBeanClassType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ManagedBeanClassType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ManagedBeanClassType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//ManagedBeanNameType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ManagedBeanNameType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ManagedBeanNameType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//ManagedBeanScopeType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ManagedBeanScopeType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ManagedBeanScopeType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//ManagedBeanType">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ManagedBeanType/description"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ManagedBeanType/displayName"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ManagedBeanType/icon"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ManagedBeanType/managedBeanName"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ManagedBeanType/managedBeanClass"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ManagedBeanType/managedBeanScope"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ManagedBeanType/managedProperty"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ManagedBeanType/mapEntries"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ManagedBeanType/listEntries"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ManagedBeanType/managedBeanExtension"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ManagedBeanType/id"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ManagedBeanType/eager"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//ManagedBeanExtensionType"/>
-    <genClasses ecoreClass="FacesConfig.ecore#//ManagedPropertyType">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ManagedPropertyType/description"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ManagedPropertyType/displayName"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ManagedPropertyType/icon"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ManagedPropertyType/propertyName"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ManagedPropertyType/propertyClass"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ManagedPropertyType/mapEntries"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ManagedPropertyType/nullValue"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ManagedPropertyType/value"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ManagedPropertyType/listEntries"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ManagedPropertyType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//MapEntriesType">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//MapEntriesType/keyClass"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//MapEntriesType/valueClass"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//MapEntriesType/mapEntry"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//MapEntriesType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//MapEntryType">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//MapEntryType/key"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//MapEntryType/nullValue"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//MapEntryType/value"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//MapEntryType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//MessageBundleType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//MessageBundleType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//MessageBundleType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//NameType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//NameType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//NameType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//NavigationCaseType">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//NavigationCaseType/description"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//NavigationCaseType/displayName"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//NavigationCaseType/icon"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//NavigationCaseType/fromAction"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//NavigationCaseType/fromOutcome"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//NavigationCaseType/if"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//NavigationCaseType/toViewId"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//NavigationCaseType/redirect"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//NavigationCaseType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//NavigationHandlerType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//NavigationHandlerType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//NavigationHandlerType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//NavigationRuleType">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//NavigationRuleType/description"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//NavigationRuleType/displayName"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//NavigationRuleType/icon"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//NavigationRuleType/fromViewId"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//NavigationRuleType/navigationCase"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//NavigationRuleType/navigationRuleExtension"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//NavigationRuleType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//NavigationRuleExtensionType"/>
-    <genClasses ecoreClass="FacesConfig.ecore#//NullValueType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//NullValueType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//OrderingType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//OrderingType/id"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//OrderingType/before"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//OrderingType/after"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//OrderingOrderingType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//OrderingOrderingType/id"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//OrderingOrderingType/name"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//OrderingOrderingType/others"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//OrderingOthersType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//OrderingOthersType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//PartialTraversalType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//PartialTraversalType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//PartialTraversalType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//PartialViewContextFactoryType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//PartialViewContextFactoryType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//PartialViewContextFactoryType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//PhaseListenerType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//PhaseListenerType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//PhaseListenerType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//PropertyClassType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//PropertyClassType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//PropertyClassType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//PropertyExtensionType"/>
-    <genClasses ecoreClass="FacesConfig.ecore#//PropertyNameType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//PropertyNameType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//PropertyNameType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//PropertyResolverType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//PropertyResolverType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//PropertyResolverType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//PropertyType">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//PropertyType/description"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//PropertyType/displayName"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//PropertyType/icon"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//PropertyType/propertyName"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//PropertyType/propertyClass"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//PropertyType/defaultValue"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//PropertyType/suggestedValue"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//PropertyType/propertyExtension"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//PropertyType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//RedirectType">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//RedirectType/viewParam"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//RedirectType/id"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//RedirectType/includeViewParams"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//RedirectViewParamType">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//RedirectViewParamType/name"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//RedirectViewParamType/value"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//RedirectViewParamType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//ReferencedBeanClassType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ReferencedBeanClassType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ReferencedBeanClassType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//ReferencedBeanNameType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ReferencedBeanNameType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ReferencedBeanNameType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//ReferencedBeanType">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ReferencedBeanType/description"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ReferencedBeanType/displayName"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ReferencedBeanType/icon"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ReferencedBeanType/referencedBeanName"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ReferencedBeanType/referencedBeanClass"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ReferencedBeanType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//RendererClassType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//RendererClassType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//RendererClassType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//RendererExtensionType"/>
-    <genClasses ecoreClass="FacesConfig.ecore#//RendererType">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//RendererType/description"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//RendererType/displayName"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//RendererType/icon"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//RendererType/componentFamily"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//RendererType/rendererType"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//RendererType/rendererClass"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//RendererType/facet"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//RendererType/attribute"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//RendererType/rendererExtension"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//RendererType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//RendererTypeType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//RendererTypeType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//RendererTypeType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//RenderKitClassType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//RenderKitClassType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//RenderKitClassType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//RenderKitFactoryType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//RenderKitFactoryType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//RenderKitFactoryType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//RenderKitIdType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//RenderKitIdType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//RenderKitIdType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//RenderKitType">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//RenderKitType/description"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//RenderKitType/displayName"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//RenderKitType/icon"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//RenderKitType/renderKitId"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//RenderKitType/renderKitClass"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//RenderKitType/renderer"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//RenderKitType/clientBehaviorRenderer"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//RenderKitType/renderKitExtension"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//RenderKitType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//RenderKitExtensionType"/>
-    <genClasses ecoreClass="FacesConfig.ecore#//ResourceHandlerType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ResourceHandlerType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ResourceHandlerType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//SmallIconType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//SmallIconType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//SmallIconType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//SourceClassType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//SourceClassType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//SourceClassType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//StateManagerType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//StateManagerType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//StateManagerType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//SuggestedValueType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//SuggestedValueType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//SuggestedValueType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//SupportedLocaleType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//SupportedLocaleType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//SupportedLocaleType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//SystemEventClassType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//SystemEventClassType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//SystemEventClassType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//SystemEventListenerClassType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//SystemEventListenerClassType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//SystemEventListenerClassType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//SystemEventListenerType">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//SystemEventListenerType/systemEventListenerClass"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//SystemEventListenerType/systemEventClass"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//SystemEventListenerType/sourceClass"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//SystemEventListenerType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//TagHandlerDelegateFactoryType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//TagHandlerDelegateFactoryType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//TagHandlerDelegateFactoryType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//ToViewIdType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ToViewIdType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ToViewIdType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//ValidatorClassType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ValidatorClassType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ValidatorClassType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//ValidatorIdType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ValidatorIdType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ValidatorIdType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//ValidatorType">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ValidatorType/description"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ValidatorType/displayName"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ValidatorType/icon"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ValidatorType/validatorId"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ValidatorType/validatorClass"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ValidatorType/attribute"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ValidatorType/property"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ValidatorType/validatorExtension"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ValidatorType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//ValidatorExtensionType"/>
-    <genClasses ecoreClass="FacesConfig.ecore#//ValueClassType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ValueClassType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ValueClassType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//ValueType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ValueType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ValueType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//VariableResolverType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//VariableResolverType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//VariableResolverType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//ViewHandlerType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ViewHandlerType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ViewHandlerType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//ResourceBundleType">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ResourceBundleType/description"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ResourceBundleType/displayName"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ResourceBundleType/icon"/>
-      <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ResourceBundleType/baseName"/>
-      <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ResourceBundleType/var"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ResourceBundleType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//BaseNameType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//BaseNameType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//BaseNameType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//VarType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//VarType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//VarType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//ViewDeclarationLanguageFactoryType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ViewDeclarationLanguageFactoryType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ViewDeclarationLanguageFactoryType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//VisitContextFactoryType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//VisitContextFactoryType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//VisitContextFactoryType/id"/>
-    </genClasses>
-  </genPackages>
-</genmodel:GenModel>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/model/templates/Header.javajetinc b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/model/templates/Header.javajetinc
deleted file mode 100644
index 8612b81..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/model/templates/Header.javajetinc
+++ /dev/null
@@ -1,11 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/plugin.properties b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/plugin.properties
deleted file mode 100644
index 3bf0208..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/plugin.properties
+++ /dev/null
@@ -1,691 +0,0 @@
-###############################################################################
-# Copyright (c) 2005 Oracle Corporation.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-###############################################################################
-plugin.name = JavaServer Faces Tools - FacesConfig Model
-plugin.provider=Eclipse.org
-
-################
-# Content Type #
-################
-
-facesconfig.name = Faces Configuration File
-
-###########
-# Editors #
-###########
-
-facesconfig.editor.name = Faces Configuration File Editor
-OVERVIEW_PAGE_NAME = Overview
-APPLICATION_PAGE_NAME = Application
-FACTORY_PAGE_NAME = Factory
-COMPONENT_PAGE_NAME = Component
-CONVERTER_PAGE_NAME = Converter
-MANAGEDBEAN_PAGE_NAME = Managed Bean
-NAVIGATIONRULE_PAGE_NAME = Navigation Rule
-REFERENCEDBEAN_PAGE_NAME = Referenced Bean
-RENDERKIT_PAGE_NAME = RederKit
-LIFECYCLE_PAGE_NAME = Lifecycle
-VALIDATOR_PAGE_NAME = Validator
-SOURCE_PAGE_NAME = Source
-
-
-facesValidation.name = Faces Configuration File Validator
-# ====================================================================
-
-_UI_CreateChild_text = {0}
-_UI_CreateChild_text2 = {1} {0}
-_UI_CreateChild_text3 = {1}
-_UI_CreateChild_tooltip = Create New {0} Under {1} Feature
-_UI_CreateChild_description = Create a new child of type {0} for the {1} feature of the selected {2}.
-_UI_CreateSibling_description = Create a new sibling of type {0} for the selected {2}, under the {1} feature of their parent.
-
-_UI_PropertyDescriptor_description = The {0} of the {1}
-
-_UI_ActionListenerType_type = Action Listener Type
-_UI_ApplicationFactoryType_type = Application Factory Type
-_UI_ApplicationType_type = Application Type
-_UI_AttributeClassType_type = Attribute Class Type
-_UI_AttributeExtensionType_type = Attribute Extension Type
-_UI_AttributeNameType_type = Attribute Name Type
-_UI_AttributeType_type = Attribute Type
-_UI_ComponentClassType_type = Component Class Type
-_UI_ComponentExtensionType_type = Component Extension Type
-_UI_ComponentFamilyType_type = Component Family Type
-_UI_ComponentType_type = Component
-_UI_ComponentTypeType_type = Component Type Type
-_UI_ConverterClassType_type = Converter Class Type
-_UI_ConverterForClassType_type = Converter For Class Type
-_UI_ConverterIdType_type = Converter Id Type
-_UI_ConverterType_type = Converter
-_UI_DefaultLocaleType_type = Default Locale Type
-_UI_DefaultRenderKitIdType_type = Default Render Kit Id Type
-_UI_DefaultValueType_type = Default Value Type
-_UI_DescriptionType_type = Description Type
-_UI_DisplayNameType_type = Display Name Type
-_UI_DocumentRoot_type = Document Root
-_UI_FacesConfigType_type = Type
-_UI_FacesContextFactoryType_type = Faces Context Factory Type
-_UI_FacetExtensionType_type = Facet Extension Type
-_UI_FacetNameType_type = Facet Name Type
-_UI_FacetType_type = Facet Type
-_UI_FactoryType_type = Factory Type
-_UI_FromActionType_type = From Action Type
-_UI_FromOutcomeType_type = From Outcome Type
-_UI_FromViewIdType_type = From View Id Type
-_UI_IconType_type = Icon Type
-_UI_KeyClassType_type = Key Class Type
-_UI_KeyType_type = Key Type
-_UI_LargeIconType_type = Large Icon Type
-_UI_LifecycleFactoryType_type = Lifecycle Factory Type
-_UI_LifecycleType_type = Lifecycle Type
-_UI_ListEntriesType_type = List Entries Type
-_UI_LocaleConfigType_type = Locale Config Type
-_UI_ManagedBeanClassType_type = Managed Bean Class Type
-_UI_ManagedBeanNameType_type = Managed Bean Name Type
-_UI_ManagedBeanScopeType_type = Managed Bean Scope Type
-_UI_ManagedBeanType_type = Managed Bean Type
-_UI_ManagedPropertyType_type = Managed Property Type
-_UI_MapEntriesType_type = Map Entries Type
-_UI_MapEntryType_type = Map Entry Type
-_UI_MessageBundleType_type = Message Bundle Type
-_UI_NavigationCaseType_type = Navigation Case Type
-_UI_NavigationHandlerType_type = Navigation Handler Type
-_UI_NavigationRuleType_type = Navigation Rule Type
-_UI_NullValueType_type = Null Value Type
-_UI_PhaseListenerType_type = Phase Listener Type
-_UI_PropertyClassType_type = Property Class Type
-_UI_PropertyExtensionType_type = Property Extension Type
-_UI_PropertyNameType_type = Property Name Type
-_UI_PropertyResolverType_type = Property Resolver Type
-_UI_PropertyType_type = Property Type
-_UI_RedirectType_type = Redirect Type
-_UI_ReferencedBeanClassType_type = Referenced Bean Class Type
-_UI_ReferencedBeanNameType_type = Referenced Bean Name Type
-_UI_ReferencedBeanType_type = Referenced Bean Type
-_UI_RendererClassType_type = Renderer Class Type
-_UI_RendererExtensionType_type = Renderer Extension Type
-_UI_RendererType_type = Renderer Type
-_UI_RendererTypeType_type = Renderer Type Type
-_UI_RenderKitClassType_type = Render Kit Class Type
-_UI_RenderKitFactoryType_type = Render Kit Factory Type
-_UI_RenderKitIdType_type = Render Kit Id Type
-_UI_RenderKitType_type = Render Kit
-_UI_SmallIconType_type = Small Icon Type
-_UI_StateManagerType_type = State Manager Type
-_UI_SuggestedValueType_type = Suggested Value Type
-_UI_SupportedLocaleType_type = Supported Locale Type
-_UI_ToViewIdType_type = To View Id Type
-_UI_ValidatorClassType_type = Validator Class Type
-_UI_ValidatorIdType_type = Validator Id Type
-_UI_ValidatorType_type = Validator
-_UI_ValueClassType_type = Value Class Type
-_UI_ValueType_type = Value Type
-_UI_VariableResolverType_type = Variable Resolver Type
-_UI_ViewHandlerType_type = View Handler Type
-_UI_Unknown_type = Object
-
-_UI_Unknown_datatype= Value
-
-_UI_ActionListenerType_textContent_feature = Text Content
-_UI_ActionListenerType_id_feature = Id
-_UI_ApplicationFactoryType_textContent_feature = Text Content
-_UI_ApplicationFactoryType_id_feature = Id
-_UI_ApplicationType_actionListener_feature = Action Listener
-_UI_ApplicationType_defaultRenderKitId_feature = Default Render Kit Id
-_UI_ApplicationType_messageBundle_feature = Message Bundle
-_UI_ApplicationType_navigationHandler_feature = Navigation Handler
-_UI_ApplicationType_viewHandler_feature = View Handler
-_UI_ApplicationType_stateManager_feature = State Manager
-_UI_ApplicationType_propertyResolver_feature = Property Resolver
-_UI_ApplicationType_variableResolver_feature = Variable Resolver
-_UI_ApplicationType_localeConfig_feature = Locale Config
-_UI_ApplicationType_id_feature = Id
-_UI_AttributeClassType_textContent_feature = Text Content
-_UI_AttributeClassType_id_feature = Id
-_UI_AttributeExtensionType_mixed_feature = Mixed
-_UI_AttributeExtensionType_group_feature = Group
-_UI_AttributeExtensionType_any_feature = Any
-_UI_AttributeExtensionType_id_feature = Id
-_UI_AttributeNameType_textContent_feature = Text Content
-_UI_AttributeNameType_id_feature = Id
-_UI_AttributeType_description_feature = Description
-_UI_AttributeType_displayName_feature = Display Name
-_UI_AttributeType_icon_feature = Icon
-_UI_AttributeType_attributeName_feature = Attribute Name
-_UI_AttributeType_attributeClass_feature = Attribute Class
-_UI_AttributeType_defaultValue_feature = Default Value
-_UI_AttributeType_suggestedValue_feature = Suggested Value
-_UI_AttributeType_attributeExtension_feature = Attribute Extension
-_UI_AttributeType_id_feature = Id
-_UI_ComponentClassType_textContent_feature = Text Content
-_UI_ComponentClassType_id_feature = Id
-_UI_ComponentExtensionType_mixed_feature = Mixed
-_UI_ComponentExtensionType_group_feature = Group
-_UI_ComponentExtensionType_any_feature = Any
-_UI_ComponentExtensionType_id_feature = Id
-_UI_ComponentFamilyType_textContent_feature = Text Content
-_UI_ComponentFamilyType_id_feature = Id
-_UI_ComponentType_description_feature = Description
-_UI_ComponentType_displayName_feature = Display Name
-_UI_ComponentType_icon_feature = Icon
-_UI_ComponentType_componentType_feature = Component Type
-_UI_ComponentType_componentClass_feature = Component Class
-_UI_ComponentType_facet_feature = Facet
-_UI_ComponentType_attribute_feature = Attribute
-_UI_ComponentType_property_feature = Property
-_UI_ComponentType_componentExtension_feature = Component Extension
-_UI_ComponentType_id_feature = Id
-_UI_ComponentTypeType_textContent_feature = Text Content
-_UI_ComponentTypeType_id_feature = Id
-_UI_ConverterClassType_textContent_feature = Text Content
-_UI_ConverterClassType_id_feature = Id
-_UI_ConverterForClassType_textContent_feature = Text Content
-_UI_ConverterForClassType_id_feature = Id
-_UI_ConverterIdType_textContent_feature = Text Content
-_UI_ConverterIdType_id_feature = Id
-_UI_ConverterType_description_feature = Description
-_UI_ConverterType_displayName_feature = Display Name
-_UI_ConverterType_icon_feature = Icon
-_UI_ConverterType_converterId_feature = Converter Id
-_UI_ConverterType_converterForClass_feature = Converter For Class
-_UI_ConverterType_converterClass_feature = Converter Class
-_UI_ConverterType_attribute_feature = Attribute
-_UI_ConverterType_property_feature = Property
-_UI_ConverterType_id_feature = Id
-_UI_DefaultLocaleType_textContent_feature = Text Content
-_UI_DefaultLocaleType_id_feature = Id
-_UI_DefaultRenderKitIdType_textContent_feature = Text Content
-_UI_DefaultRenderKitIdType_id_feature = Id
-_UI_DefaultValueType_textContent_feature = Text Content
-_UI_DefaultValueType_id_feature = Id
-_UI_DescriptionType_textContent_feature = Text Content
-_UI_DescriptionType_lang_feature = Lang
-_UI_DescriptionType_id_feature = Id
-_UI_DisplayNameType_textContent_feature = Text Content
-_UI_DisplayNameType_lang_feature = Lang
-_UI_DisplayNameType_id_feature = Id
-_UI_DocumentRoot_mixed_feature = Mixed
-_UI_DocumentRoot_xMLNSPrefixMap_feature = XMLNS Prefix Map
-_UI_DocumentRoot_xSISchemaLocation_feature = XSI Schema Location
-_UI_DocumentRoot_actionListener_feature = Action Listener
-_UI_DocumentRoot_application_feature = Application
-_UI_DocumentRoot_applicationFactory_feature = Application Factory
-_UI_DocumentRoot_attribute_feature = Attribute
-_UI_DocumentRoot_attributeClass_feature = Attribute Class
-_UI_DocumentRoot_attributeExtension_feature = Attribute Extension
-_UI_DocumentRoot_attributeName_feature = Attribute Name
-_UI_DocumentRoot_component_feature = Component
-_UI_DocumentRoot_componentClass_feature = Component Class
-_UI_DocumentRoot_componentExtension_feature = Component Extension
-_UI_DocumentRoot_componentFamily_feature = Component Family
-_UI_DocumentRoot_componentType_feature = Component Type
-_UI_DocumentRoot_converter_feature = Converter
-_UI_DocumentRoot_converterClass_feature = Converter Class
-_UI_DocumentRoot_converterForClass_feature = Converter For Class
-_UI_DocumentRoot_converterId_feature = Converter Id
-_UI_DocumentRoot_defaultLocale_feature = Default Locale
-_UI_DocumentRoot_defaultRenderKitId_feature = Default Render Kit Id
-_UI_DocumentRoot_defaultValue_feature = Default Value
-_UI_DocumentRoot_description_feature = Description
-_UI_DocumentRoot_displayName_feature = Display Name
-_UI_DocumentRoot_facesConfig_feature = Faces Config
-_UI_DocumentRoot_facesContextFactory_feature = Faces Context Factory
-_UI_DocumentRoot_facet_feature = Facet
-_UI_DocumentRoot_facetExtension_feature = Facet Extension
-_UI_DocumentRoot_facetName_feature = Facet Name
-_UI_DocumentRoot_factory_feature = Factory
-_UI_DocumentRoot_fromAction_feature = From Action
-_UI_DocumentRoot_fromOutcome_feature = From Outcome
-_UI_DocumentRoot_fromViewId_feature = From View Id
-_UI_DocumentRoot_icon_feature = Icon
-_UI_DocumentRoot_key_feature = Key
-_UI_DocumentRoot_keyClass_feature = Key Class
-_UI_DocumentRoot_largeIcon_feature = Large Icon
-_UI_DocumentRoot_lifecycle_feature = Lifecycle
-_UI_DocumentRoot_lifecycleFactory_feature = Lifecycle Factory
-_UI_DocumentRoot_listEntries_feature = List Entries
-_UI_DocumentRoot_localeConfig_feature = Locale Config
-_UI_DocumentRoot_managedBean_feature = Managed Bean
-_UI_DocumentRoot_managedBeanClass_feature = Managed Bean Class
-_UI_DocumentRoot_managedBeanName_feature = Managed Bean Name
-_UI_DocumentRoot_managedBeanScope_feature = Managed Bean Scope
-_UI_DocumentRoot_managedProperty_feature = Managed Property
-_UI_DocumentRoot_mapEntries_feature = Map Entries
-_UI_DocumentRoot_mapEntry_feature = Map Entry
-_UI_DocumentRoot_messageBundle_feature = Message Bundle
-_UI_DocumentRoot_navigationCase_feature = Navigation Case
-_UI_DocumentRoot_navigationHandler_feature = Navigation Handler
-_UI_DocumentRoot_navigationRule_feature = Navigation Rule
-_UI_DocumentRoot_nullValue_feature = Null Value
-_UI_DocumentRoot_phaseListener_feature = Phase Listener
-_UI_DocumentRoot_property_feature = Property
-_UI_DocumentRoot_propertyClass_feature = Property Class
-_UI_DocumentRoot_propertyExtension_feature = Property Extension
-_UI_DocumentRoot_propertyName_feature = Property Name
-_UI_DocumentRoot_propertyResolver_feature = Property Resolver
-_UI_DocumentRoot_redirect_feature = Redirect
-_UI_DocumentRoot_referencedBean_feature = Referenced Bean
-_UI_DocumentRoot_referencedBeanClass_feature = Referenced Bean Class
-_UI_DocumentRoot_referencedBeanName_feature = Referenced Bean Name
-_UI_DocumentRoot_renderer_feature = Renderer
-_UI_DocumentRoot_rendererClass_feature = Renderer Class
-_UI_DocumentRoot_rendererExtension_feature = Renderer Extension
-_UI_DocumentRoot_rendererType_feature = Renderer Type
-_UI_DocumentRoot_renderKit_feature = Render Kit
-_UI_DocumentRoot_renderKitClass_feature = Render Kit Class
-_UI_DocumentRoot_renderKitFactory_feature = Render Kit Factory
-_UI_DocumentRoot_renderKitId_feature = Render Kit Id
-_UI_DocumentRoot_smallIcon_feature = Small Icon
-_UI_DocumentRoot_stateManager_feature = State Manager
-_UI_DocumentRoot_suggestedValue_feature = Suggested Value
-_UI_DocumentRoot_supportedLocale_feature = Supported Locale
-_UI_DocumentRoot_toViewId_feature = To View Id
-_UI_DocumentRoot_validator_feature = Validator
-_UI_DocumentRoot_validatorClass_feature = Validator Class
-_UI_DocumentRoot_validatorId_feature = Validator Id
-_UI_DocumentRoot_value_feature = Value
-_UI_DocumentRoot_valueClass_feature = Value Class
-_UI_DocumentRoot_variableResolver_feature = Variable Resolver
-_UI_DocumentRoot_viewHandler_feature = View Handler
-_UI_FacesConfigType_application_feature = Application
-_UI_FacesConfigType_factory_feature = Factory
-_UI_FacesConfigType_component_feature = Component
-_UI_FacesConfigType_converter_feature = Converter
-_UI_FacesConfigType_managedBean_feature = Managed Bean
-_UI_FacesConfigType_navigationRule_feature = Navigation Rule
-_UI_FacesConfigType_referencedBean_feature = Referenced Bean
-_UI_FacesConfigType_renderKit_feature = Render Kit
-_UI_FacesConfigType_lifecycle_feature = Lifecycle
-_UI_FacesConfigType_validator_feature = Validator
-_UI_FacesConfigType_xmlns_feature = Xmlns
-_UI_FacesConfigType_id_feature = Id
-_UI_FacesContextFactoryType_textContent_feature = Text Content
-_UI_FacesContextFactoryType_id_feature = Id
-_UI_FacetExtensionType_mixed_feature = Mixed
-_UI_FacetExtensionType_group_feature = Group
-_UI_FacetExtensionType_any_feature = Any
-_UI_FacetExtensionType_id_feature = Id
-_UI_FacetNameType_textContent_feature = Text Content
-_UI_FacetNameType_id_feature = Id
-_UI_FacetType_description_feature = Description
-_UI_FacetType_displayName_feature = Display Name
-_UI_FacetType_icon_feature = Icon
-_UI_FacetType_facetName_feature = Facet Name
-_UI_FacetType_facetExtension_feature = Facet Extension
-_UI_FacetType_id_feature = Id
-_UI_FactoryType_applicationFactory_feature = Application Factory
-_UI_FactoryType_facesContextFactory_feature = Faces Context Factory
-_UI_FactoryType_lifecycleFactory_feature = Lifecycle Factory
-_UI_FactoryType_renderKitFactory_feature = Render Kit Factory
-_UI_FactoryType_id_feature = Id
-_UI_FromActionType_textContent_feature = Text Content
-_UI_FromActionType_id_feature = Id
-_UI_FromOutcomeType_textContent_feature = Text Content
-_UI_FromOutcomeType_id_feature = Id
-_UI_FromViewIdType_textContent_feature = Text Content
-_UI_FromViewIdType_id_feature = Id
-_UI_IconType_smallIcon_feature = Small Icon
-_UI_IconType_largeIcon_feature = Large Icon
-_UI_IconType_lang_feature = Lang
-_UI_IconType_id_feature = Id
-_UI_KeyClassType_textContent_feature = Text Content
-_UI_KeyClassType_id_feature = Id
-_UI_KeyType_textContent_feature = Text Content
-_UI_KeyType_id_feature = Id
-_UI_LargeIconType_textContent_feature = Text Content
-_UI_LargeIconType_id_feature = Id
-_UI_LifecycleFactoryType_textContent_feature = Text Content
-_UI_LifecycleFactoryType_id_feature = Id
-_UI_LifecycleType_phaseListener_feature = Phase Listener
-_UI_LifecycleType_id_feature = Id
-_UI_ListEntriesType_valueClass_feature = Value Class
-_UI_ListEntriesType_nullValue_feature = Null Value
-_UI_ListEntriesType_value_feature = Value
-_UI_ListEntriesType_id_feature = Id
-_UI_LocaleConfigType_defaultLocale_feature = Default Locale
-_UI_LocaleConfigType_supportedLocale_feature = Supported Locale
-_UI_LocaleConfigType_id_feature = Id
-_UI_ManagedBeanClassType_textContent_feature = Text Content
-_UI_ManagedBeanClassType_id_feature = Id
-_UI_ManagedBeanNameType_textContent_feature = Text Content
-_UI_ManagedBeanNameType_id_feature = Id
-_UI_ManagedBeanScopeType_textContent_feature = Text Content
-_UI_ManagedBeanScopeType_id_feature = Id
-_UI_ManagedBeanType_description_feature = Description
-_UI_ManagedBeanType_displayName_feature = Display Name
-_UI_ManagedBeanType_icon_feature = Icon
-_UI_ManagedBeanType_managedBeanName_feature = Managed Bean Name
-_UI_ManagedBeanType_managedBeanClass_feature = Managed Bean Class
-_UI_ManagedBeanType_managedBeanScope_feature = Managed Bean Scope
-_UI_ManagedBeanType_managedProperty_feature = Managed Property
-_UI_ManagedBeanType_mapEntries_feature = Map Entries
-_UI_ManagedBeanType_listEntries_feature = List Entries
-_UI_ManagedBeanType_id_feature = Id
-_UI_ManagedPropertyType_description_feature = Description
-_UI_ManagedPropertyType_displayName_feature = Display Name
-_UI_ManagedPropertyType_icon_feature = Icon
-_UI_ManagedPropertyType_propertyName_feature = Property Name
-_UI_ManagedPropertyType_propertyClass_feature = Property Class
-_UI_ManagedPropertyType_mapEntries_feature = Map Entries
-_UI_ManagedPropertyType_nullValue_feature = Null Value
-_UI_ManagedPropertyType_value_feature = Value
-_UI_ManagedPropertyType_listEntries_feature = List Entries
-_UI_ManagedPropertyType_id_feature = Id
-_UI_MapEntriesType_keyClass_feature = Key Class
-_UI_MapEntriesType_valueClass_feature = Value Class
-_UI_MapEntriesType_mapEntry_feature = Map Entry
-_UI_MapEntriesType_id_feature = Id
-_UI_MapEntryType_key_feature = Key
-_UI_MapEntryType_nullValue_feature = Null Value
-_UI_MapEntryType_value_feature = Value
-_UI_MapEntryType_id_feature = Id
-_UI_MessageBundleType_textContent_feature = Text Content
-_UI_MessageBundleType_id_feature = Id
-_UI_NavigationCaseType_description_feature = Description
-_UI_NavigationCaseType_displayName_feature = Display Name
-_UI_NavigationCaseType_icon_feature = Icon
-_UI_NavigationCaseType_fromAction_feature = From Action
-_UI_NavigationCaseType_fromOutcome_feature = From Outcome
-_UI_NavigationCaseType_toViewId_feature = To View Id
-_UI_NavigationCaseType_redirect_feature = Redirect
-_UI_NavigationCaseType_id_feature = Id
-_UI_NavigationHandlerType_textContent_feature = Text Content
-_UI_NavigationHandlerType_id_feature = Id
-_UI_NavigationRuleType_description_feature = Description
-_UI_NavigationRuleType_displayName_feature = Display Name
-_UI_NavigationRuleType_icon_feature = Icon
-_UI_NavigationRuleType_fromViewId_feature = From View Id
-_UI_NavigationRuleType_navigationCase_feature = Navigation Case
-_UI_NavigationRuleType_id_feature = Id
-_UI_NullValueType_id_feature = Id
-_UI_PhaseListenerType_textContent_feature = Text Content
-_UI_PhaseListenerType_id_feature = Id
-_UI_PropertyClassType_textContent_feature = Text Content
-_UI_PropertyClassType_id_feature = Id
-_UI_PropertyExtensionType_mixed_feature = Mixed
-_UI_PropertyExtensionType_group_feature = Group
-_UI_PropertyExtensionType_any_feature = Any
-_UI_PropertyExtensionType_id_feature = Id
-_UI_PropertyNameType_textContent_feature = Text Content
-_UI_PropertyNameType_id_feature = Id
-_UI_PropertyResolverType_textContent_feature = Text Content
-_UI_PropertyResolverType_id_feature = Id
-_UI_PropertyType_description_feature = Description
-_UI_PropertyType_displayName_feature = Display Name
-_UI_PropertyType_icon_feature = Icon
-_UI_PropertyType_propertyName_feature = Property Name
-_UI_PropertyType_propertyClass_feature = Property Class
-_UI_PropertyType_defaultValue_feature = Default Value
-_UI_PropertyType_suggestedValue_feature = Suggested Value
-_UI_PropertyType_propertyExtension_feature = Property Extension
-_UI_PropertyType_id_feature = Id
-_UI_RedirectType_id_feature = Id
-_UI_ReferencedBeanClassType_textContent_feature = Text Content
-_UI_ReferencedBeanClassType_id_feature = Id
-_UI_ReferencedBeanNameType_textContent_feature = Text Content
-_UI_ReferencedBeanNameType_id_feature = Id
-_UI_ReferencedBeanType_description_feature = Description
-_UI_ReferencedBeanType_displayName_feature = Display Name
-_UI_ReferencedBeanType_icon_feature = Icon
-_UI_ReferencedBeanType_referencedBeanName_feature = Referenced Bean Name
-_UI_ReferencedBeanType_referencedBeanClass_feature = Referenced Bean Class
-_UI_ReferencedBeanType_id_feature = Id
-_UI_RendererClassType_textContent_feature = Text Content
-_UI_RendererClassType_id_feature = Id
-_UI_RendererExtensionType_mixed_feature = Mixed
-_UI_RendererExtensionType_group_feature = Group
-_UI_RendererExtensionType_any_feature = Any
-_UI_RendererExtensionType_id_feature = Id
-_UI_RendererType_description_feature = Description
-_UI_RendererType_displayName_feature = Display Name
-_UI_RendererType_icon_feature = Icon
-_UI_RendererType_componentFamily_feature = Component Family
-_UI_RendererType_rendererType_feature = Renderer Type
-_UI_RendererType_rendererClass_feature = Renderer Class
-_UI_RendererType_facet_feature = Facet
-_UI_RendererType_attribute_feature = Attribute
-_UI_RendererType_rendererExtension_feature = Renderer Extension
-_UI_RendererType_id_feature = Id
-_UI_RendererTypeType_textContent_feature = Text Content
-_UI_RendererTypeType_id_feature = Id
-_UI_RenderKitClassType_textContent_feature = Text Content
-_UI_RenderKitClassType_id_feature = Id
-_UI_RenderKitFactoryType_textContent_feature = Text Content
-_UI_RenderKitFactoryType_id_feature = Id
-_UI_RenderKitIdType_textContent_feature = Text Content
-_UI_RenderKitIdType_id_feature = Id
-_UI_RenderKitType_description_feature = Description
-_UI_RenderKitType_displayName_feature = Display Name
-_UI_RenderKitType_icon_feature = Icon
-_UI_RenderKitType_renderKitId_feature = Render Kit Id
-_UI_RenderKitType_renderKitClass_feature = Render Kit Class
-_UI_RenderKitType_renderer_feature = Renderer
-_UI_RenderKitType_id_feature = Id
-_UI_SmallIconType_textContent_feature = Text Content
-_UI_SmallIconType_id_feature = Id
-_UI_StateManagerType_textContent_feature = Text Content
-_UI_StateManagerType_id_feature = Id
-_UI_SuggestedValueType_textContent_feature = Text Content
-_UI_SuggestedValueType_id_feature = Id
-_UI_SupportedLocaleType_textContent_feature = Text Content
-_UI_SupportedLocaleType_id_feature = Id
-_UI_ToViewIdType_textContent_feature = Text Content
-_UI_ToViewIdType_id_feature = Id
-_UI_ValidatorClassType_textContent_feature = Text Content
-_UI_ValidatorClassType_id_feature = Id
-pluginName = FacesConfig Model
-providerName = www.example.org
-_UI_DynamicElement_type = Dynamic Element
-_UI_ExtensionType_type = Extension Type
-_UI_DynamicElement_childNodes_feature = Child Nodes
-_UI_DynamicElement_attributes_feature = Attributes
-_UI_DynamicElement_name_feature = Name
-_UI_ValidatorIdType_textContent_feature = Text Content
-_UI_ValidatorIdType_id_feature = Id
-_UI_ValidatorType_description_feature = Description
-_UI_ValidatorType_displayName_feature = Display Name
-_UI_ValidatorType_icon_feature = Icon
-_UI_ValidatorType_validatorId_feature = Validator Id
-_UI_ValidatorType_validatorClass_feature = Validator Class
-_UI_ValidatorType_attribute_feature = Attribute
-_UI_ValidatorType_property_feature = Property
-_UI_ValidatorType_id_feature = Id
-_UI_ValueClassType_textContent_feature = Text Content
-_UI_ValueClassType_id_feature = Id
-_UI_ValueType_textContent_feature = Text Content
-_UI_ValueType_id_feature = Id
-_UI_VariableResolverType_textContent_feature = Text Content
-_UI_VariableResolverType_id_feature = Id
-_UI_ViewHandlerType_textContent_feature = Text Content
-_UI_ViewHandlerType_id_feature = Id
-_UI_ExtensionType_childNodes_feature = Child Nodes
-_UI_ExtensionType_textContent_feature = Text Content
-_UI_XMLTypeDocumentRoot_comment_feature = Comment
-_UI_XMLTypeDocumentRoot_text_feature = Text
-_UI_XMLTypeDocumentRoot_cDATA_feature = CDATA
-_UI_Unknown_feature = Unspecified
-
-_UI_DynamicAttribute_type = Dynamic Attribute
-_UI_DynamicAttribute_name_feature = Name
-_UI_DynamicAttribute_value_feature = Value
-_UI_DynamicElement_textContent_feature = Text Content
-_UI_ExtensionType_id_feature = Id
-_UI_ELResolverType_type = EL Resolver Type
-_UI_ResourceBundleType_type = Resource Bundle Type
-_UI_BaseNameType_type = Base Name Type
-_UI_VarType_type = Var Type
-_UI_ApplicationType_elResolver_feature = El Resolver
-_UI_ApplicationType_resourceBundle_feature = Resource Bundle
-_UI_ELResolverType_textContent_feature = Text Content
-_UI_ELResolverType_id_feature = Id
-_UI_ResourceBundleType_description_feature = Description
-_UI_ResourceBundleType_displayName_feature = Display Name
-_UI_ResourceBundleType_icon_feature = Icon
-_UI_ResourceBundleType_baseName_feature = Base Name
-_UI_ResourceBundleType_var_feature = Var
-_UI_ResourceBundleType_id_feature = Id
-_UI_BaseNameType_textContent_feature = Text Content
-_UI_BaseNameType_id_feature = Id
-_UI_VarType_textContent_feature = Text Content
-_UI_VarType_id_feature = Id
-_UI_ApplicationType_eLResolver_feature = EL Resolver
-_UI_ApplicationExtensionType_type = Application Extension Type
-_UI_ApplicationType_applicationExtension_feature = Application Extension
-_UI_ConverterExtensionType_type = Converter Extension Type
-_UI_FacesConfigExtensionType_type = Extension Type
-_UI_FactoryExtensionType_type = Factory Extension Type
-_UI_LifecycleExtensionType_type = Lifecycle Extension Type
-_UI_ManagedBeanExtensionType_type = Managed Bean Extension Type
-_UI_NavigationRuleExtensionType_type = Navigation Rule Extension Type
-_UI_ValidatorExtensionType_type = Validator Extension Type
-_UI_ConverterType_converterExtension_feature = Converter Extension
-_UI_FacesConfigType_facesConfigExtension_feature = Faces Config Extension
-_UI_FactoryType_factoryExtension_feature = Factory Extension
-_UI_LifecycleType_lifecycleExtension_feature = Lifecycle Extension
-_UI_ManagedBeanType_managedBeanExtension_feature = Managed Bean Extension
-_UI_NavigationRuleType_navigationRuleExtension_feature = Navigation Rule Extension
-_UI_ValidatorType_validatorExtension_feature = Validator Extension
-_UI_RenderKitExtensionType_type = Render Kit Extension Type
-_UI_RenderKitType_renderKitExtension_feature = Render Kit Extension
-_UI_XMLTypeDocumentRoot_processingInstruction_feature = Processing Instruction
-_UI_AbsoluteOrderingType_type = Absolute Ordering Type
-_UI_BehaviorClassType_type = Behavior Class Type
-_UI_BehaviorIdType_type = Behavior Id Type
-_UI_BehaviorType_type = Behavior Type
-_UI_BehaviorExtensionType_type = Behavior Extension Type
-_UI_ClientBehaviorRendererClassType_type = Client Behavior Renderer Class Type
-_UI_ClientBehaviorRendererType_type = Client Behavior Renderer Type
-_UI_ClientBehaviorRendererTypeType_type = Client Behavior Renderer Type Type
-_UI_DefaultValidatorsType_type = Default Validators Type
-_UI_ExceptionHandlerFactoryType_type = Exception Handler Factory Type
-_UI_ExternalContextFactoryType_type = External Context Factory Type
-_UI_IfType_type = If Type
-_UI_NameType_type = Name Type
-_UI_OrderingType_type = Ordering Type
-_UI_OrderingOrderingType_type = Ordering Ordering Type
-_UI_OrderingOthersType_type = Ordering Others Type
-_UI_PartialTraversalType_type = Partial Traversal Type
-_UI_PartialViewContextFactoryType_type = Partial View Context Factory Type
-_UI_RedirectViewParamType_type = Redirect View Param Type
-_UI_ResourceHandlerType_type = Resource Handler Type
-_UI_SourceClassType_type = Source Class Type
-_UI_SystemEventClassType_type = System Event Class Type
-_UI_SystemEventListenerClassType_type = System Event Listener Class Type
-_UI_SystemEventListenerType_type = System Event Listener Type
-_UI_TagHandlerDelegateFactoryType_type = Tag Handler Delegate Factory Type
-_UI_ViewDeclarationLanguageFactoryType_type = View Declaration Language Factory Type
-_UI_VisitContextFactoryType_type = Visit Context Factory Type
-_UI_AbsoluteOrderingType_id_feature = Id
-_UI_AbsoluteOrderingType_name_feature = Name
-_UI_AbsoluteOrderingType_others_feature = Others
-_UI_ApplicationType_partialTraversal_feature = Partial Traversal
-_UI_ApplicationType_resourceHandler_feature = Resource Handler
-_UI_ApplicationType_systemEventListener_feature = System Event Listener
-_UI_ApplicationType_defaultValidators_feature = Default Validators
-_UI_BehaviorClassType_textContent_feature = Text Content
-_UI_BehaviorClassType_id_feature = Id
-_UI_BehaviorIdType_textContent_feature = Text Content
-_UI_BehaviorIdType_id_feature = Id
-_UI_BehaviorType_description_feature = Description
-_UI_BehaviorType_displayName_feature = Display Name
-_UI_BehaviorType_icon_feature = Icon
-_UI_BehaviorType_behaviorId_feature = Behavior Id
-_UI_BehaviorType_behaviorClass_feature = Behavior Class
-_UI_BehaviorType_attribute_feature = Attribute
-_UI_BehaviorType_property_feature = Property
-_UI_BehaviorType_behaviorExtension_feature = Behavior Extension
-_UI_BehaviorType_id_feature = Id
-_UI_ClientBehaviorRendererClassType_textContent_feature = Text Content
-_UI_ClientBehaviorRendererClassType_id_feature = Id
-_UI_ClientBehaviorRendererType_clientBehaviorRendererType_feature = Client Behavior Renderer Type
-_UI_ClientBehaviorRendererType_clientBehaviorRendererClass_feature = Client Behavior Renderer Class
-_UI_ClientBehaviorRendererType_id_feature = Id
-_UI_ClientBehaviorRendererTypeType_textContent_feature = Text Content
-_UI_ClientBehaviorRendererTypeType_id_feature = Id
-_UI_DefaultValidatorsType_validatorId_feature = Validator Id
-_UI_DefaultValidatorsType_id_feature = Id
-_UI_DocumentRoot_absoluteOrdering_feature = Absolute Ordering
-_UI_DocumentRoot_behavior_feature = Behavior
-_UI_DocumentRoot_behaviorClass_feature = Behavior Class
-_UI_DocumentRoot_behaviorId_feature = Behavior Id
-_UI_DocumentRoot_behaviorExtension_feature = Behavior Extension
-_UI_DocumentRoot_defaultValidators_feature = Default Validators
-_UI_DocumentRoot_exceptionHandlerFactory_feature = Exception Handler Factory
-_UI_DocumentRoot_externalContextFactory_feature = External Context Factory
-_UI_DocumentRoot_if_feature = If
-_UI_DocumentRoot_name_feature = Name
-_UI_DocumentRoot_ordering_feature = Ordering
-_UI_DocumentRoot_orderingOrdering_feature = Ordering Ordering
-_UI_DocumentRoot_others_feature = Others
-_UI_DocumentRoot_partialTraversal_feature = Partial Traversal
-_UI_DocumentRoot_partialViewContextFactory_feature = Partial View Context Factory
-_UI_DocumentRoot_redirectViewParam_feature = Redirect View Param
-_UI_DocumentRoot_resourceHandler_feature = Resource Handler
-_UI_DocumentRoot_sourceClass_feature = Source Class
-_UI_DocumentRoot_systemEventClass_feature = System Event Class
-_UI_DocumentRoot_systemEventListener_feature = System Event Listener
-_UI_DocumentRoot_systemEventListenerClass_feature = System Event Listener Class
-_UI_DocumentRoot_tagHandlerDelegateFactory_feature = Tag Handler Delegate Factory
-_UI_DocumentRoot_viewDeclarationLanguageFactory_feature = View Declaration Language Factory
-_UI_DocumentRoot_visitContextFactory_feature = Visit Context Factory
-_UI_ExceptionHandlerFactoryType_textContent_feature = Text Content
-_UI_ExceptionHandlerFactoryType_id_feature = Id
-_UI_ExternalContextFactoryType_textContent_feature = Text Content
-_UI_ExternalContextFactoryType_id_feature = Id
-_UI_FacesConfigType_ordering_feature = Ordering
-_UI_FacesConfigType_absoluteOrdering_feature = Absolute Ordering
-_UI_FacesConfigType_name_feature = Name
-_UI_FacesConfigType_behavior_feature = Behavior
-_UI_FacesConfigType_metadataComplete_feature = Metadata Complete
-_UI_FactoryType_exceptionHandlerFactory_feature = Exception Handler Factory
-_UI_FactoryType_externalContextFactory_feature = External Context Factory
-_UI_FactoryType_partialViewContextFactory_feature = Partial View Context Factory
-_UI_FactoryType_viewDeclarationLanguageFactory_feature = View Declaration Language Factory
-_UI_FactoryType_tagHandlerDelegateFactory_feature = Tag Handler Delegate Factory
-_UI_FactoryType_visitContextFactory_feature = Visit Context Factory
-_UI_IfType_textContent_feature = Text Content
-_UI_IfType_id_feature = Id
-_UI_ManagedBeanType_eager_feature = Eager
-_UI_NameType_textContent_feature = Text Content
-_UI_NameType_id_feature = Id
-_UI_NavigationCaseType_if_feature = If
-_UI_OrderingType_id_feature = Id
-_UI_OrderingType_before_feature = Before
-_UI_OrderingType_after_feature = After
-_UI_OrderingOrderingType_id_feature = Id
-_UI_OrderingOrderingType_name_feature = Name
-_UI_OrderingOrderingType_others_feature = Others
-_UI_OrderingOthersType_id_feature = Id
-_UI_PartialTraversalType_textContent_feature = Text Content
-_UI_PartialTraversalType_id_feature = Id
-_UI_PartialViewContextFactoryType_textContent_feature = Text Content
-_UI_PartialViewContextFactoryType_id_feature = Id
-_UI_RedirectType_viewParam_feature = View Param
-_UI_RedirectType_includeViewParams_feature = Include View Params
-_UI_RedirectViewParamType_name_feature = Name
-_UI_RedirectViewParamType_value_feature = Value
-_UI_RedirectViewParamType_id_feature = Id
-_UI_RenderKitType_clientBehaviorRenderer_feature = Client Behavior Renderer
-_UI_ResourceHandlerType_textContent_feature = Text Content
-_UI_ResourceHandlerType_id_feature = Id
-_UI_SourceClassType_textContent_feature = Text Content
-_UI_SourceClassType_id_feature = Id
-_UI_SystemEventClassType_textContent_feature = Text Content
-_UI_SystemEventClassType_id_feature = Id
-_UI_SystemEventListenerClassType_textContent_feature = Text Content
-_UI_SystemEventListenerClassType_id_feature = Id
-_UI_SystemEventListenerType_systemEventListenerClass_feature = System Event Listener Class
-_UI_SystemEventListenerType_systemEventClass_feature = System Event Class
-_UI_SystemEventListenerType_sourceClass_feature = Source Class
-_UI_SystemEventListenerType_id_feature = Id
-_UI_TagHandlerDelegateFactoryType_textContent_feature = Text Content
-_UI_TagHandlerDelegateFactoryType_id_feature = Id
-_UI_ViewDeclarationLanguageFactoryType_textContent_feature = Text Content
-_UI_ViewDeclarationLanguageFactoryType_id_feature = Id
-_UI_VisitContextFactoryType_textContent_feature = Text Content
-_UI_VisitContextFactoryType_id_feature = Id
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/plugin.xml b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/plugin.xml
deleted file mode 100644
index 41304d2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/plugin.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin>
-   <extension 
-      point="org.eclipse.core.contenttype.contentTypes"> 
-      <content-type  
-         id="org.eclipse.jst.jsf.facesconfig.facesConfigFile" 
-         name="%facesconfig.name" 
-         base-type="org.eclipse.core.runtime.xml" 
-         file-extensions="xml"
-         priority="high"> 
-         <describer 
-            class="org.eclipse.core.runtime.content.XMLRootElementContentDescriber"> 
-            <parameter name="element" value="faces-config" /> 
-         </describer> 
-      </content-type> 
-   </extension>
-  <extension point="org.eclipse.emf.edit.itemProviderAdapterFactories">
-    <factory 
-       uri = "http://www.eclipse.org/webtools/jsf/schema/facesconfig.xsd" 
-       class = "org.eclipse.jst.jsf.facesconfig.edit.provider.FacesConfigItemProviderAdapterFactory" 
-       supportedTypes = 
-         "org.eclipse.emf.edit.provider.IEditingDomainItemProvider
-          org.eclipse.emf.edit.provider.IStructuredItemContentProvider
-          org.eclipse.emf.edit.provider.ITreeItemContentProvider
-          org.eclipse.emf.edit.provider.IItemLabelProvider
-          org.eclipse.emf.edit.provider.IItemPropertySource" />
-  </extension>
-  <extension
-        point="org.eclipse.wst.common.emfworkbench.integration.editModel">
-     <editModel
-           editModelID="jsf.facesconfig"
-           factoryClass="org.eclipse.jst.common.jdt.internal.integration.JavaArtifactEditModelFactory">
-     </editModel>
-  </extension>
-
-</plugin>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/.classpath b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/.classpath
deleted file mode 100644
index 304e861..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/.cvsignore b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/.cvsignore
deleted file mode 100644
index 3d95935..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/.cvsignore
+++ /dev/null
@@ -1,5 +0,0 @@
-bin
-build.xml
-javaCompiler...args
-temp.folder
-@dot
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/.project b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/.project
deleted file mode 100644
index 4246d9b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.jst.jsf.standard.tagsupport</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/.settings/org.eclipse.core.resources.prefs b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/.settings/org.eclipse.core.resources.prefs
deleted file mode 100644
index ecfb123..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/.settings/org.eclipse.core.resources.prefs
+++ /dev/null
@@ -1,3 +0,0 @@
-#Sun May 27 16:04:06 EDT 2007
-eclipse.preferences.version=1
-encoding/<project>=ISO-8859-1
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/.settings/org.eclipse.jdt.core.prefs b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 8f6d800..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,65 +0,0 @@
-#Mon Jun 30 15:56:32 PDT 2008
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
-org.eclipse.jdt.core.compiler.compliance=1.5
-org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
-org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
-org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
-org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=error
-org.eclipse.jdt.core.compiler.problem.nullReference=warning
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
-org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=warning
-org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
-org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
-org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
-org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
-org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.5
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/.settings/org.eclipse.pde.prefs b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/.settings/org.eclipse.pde.prefs
deleted file mode 100644
index 78bb525..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/.settings/org.eclipse.pde.prefs
+++ /dev/null
@@ -1,22 +0,0 @@
-#Fri May 30 11:56:44 PDT 2008
-compilers.f.unresolved-features=1
-compilers.f.unresolved-plugins=1
-compilers.incompatible-environment=1
-compilers.p.build=1
-compilers.p.deprecated=1
-compilers.p.discouraged-class=1
-compilers.p.internal=1
-compilers.p.missing-packages=0
-compilers.p.no-required-att=0
-compilers.p.not-externalized-att=0
-compilers.p.unknown-attribute=1
-compilers.p.unknown-class=1
-compilers.p.unknown-element=1
-compilers.p.unknown-identifier=1
-compilers.p.unknown-resource=1
-compilers.p.unresolved-ex-points=0
-compilers.p.unresolved-import=0
-compilers.s.create-docs=false
-compilers.s.doc-folder=doc
-compilers.s.open-tags=1
-eclipse.preferences.version=1
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/META-INF/MANIFEST.MF b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/META-INF/MANIFEST.MF
deleted file mode 100644
index fc5d322..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,15 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %pluginName
-Bundle-SymbolicName: org.eclipse.jst.jsf.standard.tagsupport;singleton:=true
-Bundle-Version: 1.2.0.qualifier
-Bundle-Localization: plugin
-Bundle-Activator: org.eclipse.jst.jsf.standard.tagsupport.StandardTagSupportPlugin
-Require-Bundle: org.eclipse.ui;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.core.runtime;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.jst.jsf.common;bundle-version="[1.0.0,2.0.0)",
- org.eclipse.emf.ecore.xmi;bundle-version="[2.2.0,3.0.0)"
-Bundle-ActivationPolicy: lazy
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
-Export-Package: org.eclipse.jst.jsf.standard.tagsupport;x-internal:=true
-Bundle-Vendor: %pluginProvider
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/about.html b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/about.html
deleted file mode 100644
index 8e56059..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/about.html
+++ /dev/null
@@ -1,22 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<head>
-<title>About</title>
-<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>June, 2008</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise indicated below, the Content is provided to you under the terms and conditions of the
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content.</p>
-
-</body>
-</html>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/build.properties b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/build.properties
deleted file mode 100644
index aa99bac..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/build.properties
+++ /dev/null
@@ -1,21 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2008 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               .,\
-               plugin.xml,\
-               metadata/,\
-               plugin.properties,\
-               about.html,\
-               icons/
-javacSource=1.5
-javacTarget=1.5
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/large/ACTIONSOURCE.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/large/ACTIONSOURCE.gif
deleted file mode 100644
index 633e543..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/large/ACTIONSOURCE.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/large/ATTRIBUTE.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/large/ATTRIBUTE.gif
deleted file mode 100644
index e4fee22..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/large/ATTRIBUTE.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/large/EDITABLEVALUEHOLDER.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/large/EDITABLEVALUEHOLDER.gif
deleted file mode 100644
index da6bf2a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/large/EDITABLEVALUEHOLDER.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/large/EXTENSION.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/large/EXTENSION.gif
deleted file mode 100644
index cb4aa6c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/large/EXTENSION.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/large/FACET.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/large/FACET.gif
deleted file mode 100644
index 6424c7f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/large/FACET.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/large/IMPLEMENTATION.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/large/IMPLEMENTATION.gif
deleted file mode 100644
index 9a1f263..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/large/IMPLEMENTATION.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/large/INSERTCHILDREN.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/large/INSERTCHILDREN.gif
deleted file mode 100644
index e56a1c4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/large/INSERTCHILDREN.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/large/INSERTFACET.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/large/INSERTFACET.gif
deleted file mode 100644
index d513bbd..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/large/INSERTFACET.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/large/INTERFACE.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/large/INTERFACE.gif
deleted file mode 100644
index e684d92..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/large/INTERFACE.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/large/RENDERFACET.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/large/RENDERFACET.gif
deleted file mode 100644
index 6424c7f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/large/RENDERFACET.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/large/VALUEHOLDER.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/large/VALUEHOLDER.gif
deleted file mode 100644
index 74aec16..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/large/VALUEHOLDER.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/small/ACTIONSOURCE.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/small/ACTIONSOURCE.gif
deleted file mode 100644
index 193df83..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/small/ACTIONSOURCE.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/small/ATTRIBUTE.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/small/ATTRIBUTE.gif
deleted file mode 100644
index ad88267..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/small/ATTRIBUTE.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/small/EDITABLEVALUEHOLDER.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/small/EDITABLEVALUEHOLDER.gif
deleted file mode 100644
index 06af10d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/small/EDITABLEVALUEHOLDER.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/small/EXTENSION.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/small/EXTENSION.gif
deleted file mode 100644
index b84636f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/small/EXTENSION.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/small/FACET.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/small/FACET.gif
deleted file mode 100644
index b9cb148..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/small/FACET.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/small/IMPLEMENTATION.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/small/IMPLEMENTATION.gif
deleted file mode 100644
index f007dd0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/small/IMPLEMENTATION.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/small/INSERTCHILDREN.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/small/INSERTCHILDREN.gif
deleted file mode 100644
index 9acef67..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/small/INSERTCHILDREN.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/small/INSERTFACET.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/small/INSERTFACET.gif
deleted file mode 100644
index 6b6b6f1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/small/INSERTFACET.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/small/INTERFACE.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/small/INTERFACE.gif
deleted file mode 100644
index c11b08f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/small/INTERFACE.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/small/RENDERFACET.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/small/RENDERFACET.gif
deleted file mode 100644
index b9cb148..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/small/RENDERFACET.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/small/VALUEHOLDER.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/small/VALUEHOLDER.gif
deleted file mode 100644
index 228dc2f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/small/VALUEHOLDER.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_A.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_A.gif
deleted file mode 100644
index 4c57d0e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_A.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_BR.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_BR.gif
deleted file mode 100644
index b468685..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_BR.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_DIV.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_DIV.gif
deleted file mode 100644
index a8e5ddf..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_DIV.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_FORM.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_FORM.gif
deleted file mode 100644
index cc27deb..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_FORM.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_HEAD.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_HEAD.gif
deleted file mode 100644
index 4bdc052..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_HEAD.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_HR.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_HR.gif
deleted file mode 100644
index 44e283d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_HR.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_IMG.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_IMG.gif
deleted file mode 100644
index 776fc8f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_IMG.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_INPUT_BUTTON.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_INPUT_BUTTON.gif
deleted file mode 100644
index 9ead4e4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_INPUT_BUTTON.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_INPUT_CHECKBOX.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_INPUT_CHECKBOX.gif
deleted file mode 100644
index 4a02dde..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_INPUT_CHECKBOX.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_INPUT_HIDDEN.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_INPUT_HIDDEN.gif
deleted file mode 100644
index d14d09f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_INPUT_HIDDEN.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_INPUT_IMAGE.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_INPUT_IMAGE.gif
deleted file mode 100644
index b12850f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_INPUT_IMAGE.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_INPUT_PASSWORD.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_INPUT_PASSWORD.gif
deleted file mode 100644
index 05d5fe5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_INPUT_PASSWORD.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_INPUT_RADIO.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_INPUT_RADIO.gif
deleted file mode 100644
index f6aeac0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_INPUT_RADIO.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_INPUT_TEXT.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_INPUT_TEXT.gif
deleted file mode 100644
index 1c8fa1e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_INPUT_TEXT.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_LINK.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_LINK.gif
deleted file mode 100644
index 4c57d0e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_LINK.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_OBJECT.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_OBJECT.gif
deleted file mode 100644
index cba93bf..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_OBJECT.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_SELECT.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_SELECT.gif
deleted file mode 100644
index 3831d95..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_SELECT.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_TABLE.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_TABLE.gif
deleted file mode 100644
index 9873b09..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_TABLE.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_TEXTAREA.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_TEXTAREA.gif
deleted file mode 100644
index 25f22d8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_TEXTAREA.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_A.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_A.gif
deleted file mode 100644
index 5fd9c94..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_A.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_BR.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_BR.gif
deleted file mode 100644
index b468685..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_BR.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_DIV.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_DIV.gif
deleted file mode 100644
index 3a5674a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_DIV.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_FORM.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_FORM.gif
deleted file mode 100644
index 3081f32..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_FORM.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_HEAD.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_HEAD.gif
deleted file mode 100644
index 4bdc052..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_HEAD.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_HR.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_HR.gif
deleted file mode 100644
index 19ab614..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_HR.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_IMG.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_IMG.gif
deleted file mode 100644
index 115cbc6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_IMG.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_INPUT_BUTTON.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_INPUT_BUTTON.gif
deleted file mode 100644
index 8e721c5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_INPUT_BUTTON.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_INPUT_CHECKBOX.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_INPUT_CHECKBOX.gif
deleted file mode 100644
index 00da14e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_INPUT_CHECKBOX.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_INPUT_HIDDEN.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_INPUT_HIDDEN.gif
deleted file mode 100644
index f18865b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_INPUT_HIDDEN.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_INPUT_IMAGE.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_INPUT_IMAGE.gif
deleted file mode 100644
index 2a75963..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_INPUT_IMAGE.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_INPUT_PASSWORD.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_INPUT_PASSWORD.gif
deleted file mode 100644
index 25c2e26..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_INPUT_PASSWORD.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_INPUT_RADIO.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_INPUT_RADIO.gif
deleted file mode 100644
index 2598367..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_INPUT_RADIO.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_INPUT_TEXT.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_INPUT_TEXT.gif
deleted file mode 100644
index 7f506d9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_INPUT_TEXT.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_LINK.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_LINK.gif
deleted file mode 100644
index 5fd9c94..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_LINK.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_OBJECT.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_OBJECT.gif
deleted file mode 100644
index 745f6d9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_OBJECT.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_SELECT.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_SELECT.gif
deleted file mode 100644
index 247efe0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_SELECT.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_TABLE.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_TABLE.gif
deleted file mode 100644
index d11c996..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_TABLE.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_TEXTAREA.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_TEXTAREA.gif
deleted file mode 100644
index a2fa616..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_TEXTAREA.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_ACTIONLISTENER.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_ACTIONLISTENER.gif
deleted file mode 100644
index 5dc1abc..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_ACTIONLISTENER.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_AJAX.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_AJAX.gif
deleted file mode 100644
index 6b7c266..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_AJAX.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_ATTRIBUTE.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_ATTRIBUTE.gif
deleted file mode 100644
index d99d2eb..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_ATTRIBUTE.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_CONVERTDATETIME.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_CONVERTDATETIME.gif
deleted file mode 100644
index f9f3409..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_CONVERTDATETIME.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_CONVERTER.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_CONVERTER.gif
deleted file mode 100644
index a8f5d3a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_CONVERTER.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_CONVERTNUMBER.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_CONVERTNUMBER.gif
deleted file mode 100644
index 21b24f0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_CONVERTNUMBER.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_EVENT.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_EVENT.gif
deleted file mode 100644
index 6f8ad69..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_EVENT.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_FACET.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_FACET.gif
deleted file mode 100644
index 6424c7f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_FACET.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_LOADBUNDLE.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_LOADBUNDLE.gif
deleted file mode 100644
index e1cd4e1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_LOADBUNDLE.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_METADATA.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_METADATA.gif
deleted file mode 100644
index 5f095ef..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_METADATA.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_PARAM.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_PARAM.gif
deleted file mode 100644
index 79e07c2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_PARAM.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_SELECTITEM.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_SELECTITEM.gif
deleted file mode 100644
index 3831d95..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_SELECTITEM.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_SELECTITEMS.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_SELECTITEMS.gif
deleted file mode 100644
index b2a1c43..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_SELECTITEMS.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_SUBVIEW.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_SUBVIEW.gif
deleted file mode 100644
index f37f412..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_SUBVIEW.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_VALIDATEBEAN.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_VALIDATEBEAN.gif
deleted file mode 100644
index afee57b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_VALIDATEBEAN.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_VALIDATEDOUBLERANGE.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_VALIDATEDOUBLERANGE.gif
deleted file mode 100644
index afee57b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_VALIDATEDOUBLERANGE.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_VALIDATELENGTH.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_VALIDATELENGTH.gif
deleted file mode 100644
index afee57b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_VALIDATELENGTH.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_VALIDATELONGRANGE.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_VALIDATELONGRANGE.gif
deleted file mode 100644
index afee57b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_VALIDATELONGRANGE.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_VALIDATEREGEX.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_VALIDATEREGEX.gif
deleted file mode 100644
index afee57b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_VALIDATEREGEX.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_VALIDATEREQUIRED.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_VALIDATEREQUIRED.gif
deleted file mode 100644
index afee57b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_VALIDATEREQUIRED.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_VALIDATOR.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_VALIDATOR.gif
deleted file mode 100644
index afee57b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_VALIDATOR.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_VALUECHANGELISTENER.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_VALUECHANGELISTENER.gif
deleted file mode 100644
index 2fafdeb..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_VALUECHANGELISTENER.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_VERBATIM.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_VERBATIM.gif
deleted file mode 100644
index d284eb9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_VERBATIM.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_VIEW.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_VIEW.gif
deleted file mode 100644
index 98294c1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_VIEW.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_VIEWPARAM.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_VIEWPARAM.gif
deleted file mode 100644
index 79e07c2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_VIEWPARAM.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_ACTIONLISTENER.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_ACTIONLISTENER.gif
deleted file mode 100644
index 67b2d33..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_ACTIONLISTENER.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_AJAX.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_AJAX.gif
deleted file mode 100644
index 1524bed..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_AJAX.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_ATTRIBUTE.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_ATTRIBUTE.gif
deleted file mode 100644
index b77c750..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_ATTRIBUTE.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_CONVERTDATETIME.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_CONVERTDATETIME.gif
deleted file mode 100644
index 779d820..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_CONVERTDATETIME.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_CONVERTER.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_CONVERTER.gif
deleted file mode 100644
index 16466ed..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_CONVERTER.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_CONVERTNUMBER.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_CONVERTNUMBER.gif
deleted file mode 100644
index 938f364..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_CONVERTNUMBER.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_EVENT.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_EVENT.gif
deleted file mode 100644
index acd5411..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_EVENT.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_FACET.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_FACET.gif
deleted file mode 100644
index b9cb148..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_FACET.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_LOADBUNDLE.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_LOADBUNDLE.gif
deleted file mode 100644
index 8f40ee1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_LOADBUNDLE.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_METADATA.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_METADATA.gif
deleted file mode 100644
index 51218dc..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_METADATA.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_PARAM.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_PARAM.gif
deleted file mode 100644
index b3e0727..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_PARAM.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_SELECTITEM.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_SELECTITEM.gif
deleted file mode 100644
index 247efe0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_SELECTITEM.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_SELECTITEMS.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_SELECTITEMS.gif
deleted file mode 100644
index 7fb0974..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_SELECTITEMS.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_SUBVIEW.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_SUBVIEW.gif
deleted file mode 100644
index 9748015..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_SUBVIEW.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_VALIDATEBEAN.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_VALIDATEBEAN.gif
deleted file mode 100644
index 86196e9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_VALIDATEBEAN.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_VALIDATEDOUBLERANGE.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_VALIDATEDOUBLERANGE.gif
deleted file mode 100644
index 86196e9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_VALIDATEDOUBLERANGE.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_VALIDATELENGTH.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_VALIDATELENGTH.gif
deleted file mode 100644
index 86196e9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_VALIDATELENGTH.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_VALIDATELONGRANGE.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_VALIDATELONGRANGE.gif
deleted file mode 100644
index 86196e9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_VALIDATELONGRANGE.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_VALIDATEREGEX.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_VALIDATEREGEX.gif
deleted file mode 100644
index 86196e9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_VALIDATEREGEX.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_VALIDATEREQUIRED.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_VALIDATEREQUIRED.gif
deleted file mode 100644
index 86196e9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_VALIDATEREQUIRED.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_VALIDATOR.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_VALIDATOR.gif
deleted file mode 100644
index 86196e9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_VALIDATOR.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_VALUECHANGELISTENER.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_VALUECHANGELISTENER.gif
deleted file mode 100644
index a1cd624..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_VALUECHANGELISTENER.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_VERBATIM.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_VERBATIM.gif
deleted file mode 100644
index f12c9df..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_VERBATIM.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_VIEW.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_VIEW.gif
deleted file mode 100644
index c81630a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_VIEW.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_VIEWPARAM.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_VIEWPARAM.gif
deleted file mode 100644
index b3e0727..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_VIEWPARAM.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_BODY.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_BODY.gif
deleted file mode 100644
index 25e2da4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_BODY.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_BUTTON.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_BUTTON.gif
deleted file mode 100644
index 9ead4e4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_BUTTON.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_COLUMN.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_COLUMN.gif
deleted file mode 100644
index 381154d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_COLUMN.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_COMMANDBUTTON.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_COMMANDBUTTON.gif
deleted file mode 100644
index 9ead4e4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_COMMANDBUTTON.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_COMMANDLINK.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_COMMANDLINK.gif
deleted file mode 100644
index 4c57d0e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_COMMANDLINK.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_DATATABLE.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_DATATABLE.gif
deleted file mode 100644
index 9873b09..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_DATATABLE.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_FORM.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_FORM.gif
deleted file mode 100644
index cc27deb..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_FORM.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_GRAPHICIMAGE.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_GRAPHICIMAGE.gif
deleted file mode 100644
index ad341a5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_GRAPHICIMAGE.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_HEAD.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_HEAD.gif
deleted file mode 100644
index c4dc6a1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_HEAD.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_INPUTHIDDEN.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_INPUTHIDDEN.gif
deleted file mode 100644
index d14d09f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_INPUTHIDDEN.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_INPUTSECRET.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_INPUTSECRET.gif
deleted file mode 100644
index 60c0a5d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_INPUTSECRET.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_INPUTTEXT.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_INPUTTEXT.gif
deleted file mode 100644
index 4cc147e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_INPUTTEXT.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_INPUTTEXTAREA.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_INPUTTEXTAREA.gif
deleted file mode 100644
index 25f22d8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_INPUTTEXTAREA.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_LINK.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_LINK.gif
deleted file mode 100644
index 03b2bf9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_LINK.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_MESSAGE.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_MESSAGE.gif
deleted file mode 100644
index fb737eb..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_MESSAGE.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_MESSAGES.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_MESSAGES.gif
deleted file mode 100644
index ca050e6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_MESSAGES.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_OUTPUTFORMAT.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_OUTPUTFORMAT.gif
deleted file mode 100644
index ac5920d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_OUTPUTFORMAT.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_OUTPUTLABEL.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_OUTPUTLABEL.gif
deleted file mode 100644
index 348aa17..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_OUTPUTLABEL.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_OUTPUTLINK.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_OUTPUTLINK.gif
deleted file mode 100644
index 03b2bf9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_OUTPUTLINK.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_OUTPUTSCRIPT.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_OUTPUTSCRIPT.gif
deleted file mode 100644
index b0444b2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_OUTPUTSCRIPT.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_OUTPUTSTYLESHEET.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_OUTPUTSTYLESHEET.gif
deleted file mode 100644
index c4d3be8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_OUTPUTSTYLESHEET.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_OUTPUTTEXT.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_OUTPUTTEXT.gif
deleted file mode 100644
index 295ecc4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_OUTPUTTEXT.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_PANELGRID.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_PANELGRID.gif
deleted file mode 100644
index a31479c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_PANELGRID.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_PANELGROUP.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_PANELGROUP.gif
deleted file mode 100644
index da85fe9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_PANELGROUP.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_SELECTBOOLEANCHECKBOX.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_SELECTBOOLEANCHECKBOX.gif
deleted file mode 100644
index 4a02dde..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_SELECTBOOLEANCHECKBOX.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_SELECTMANYCHECKBOX.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_SELECTMANYCHECKBOX.gif
deleted file mode 100644
index 31b1f37..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_SELECTMANYCHECKBOX.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_SELECTMANYLISTBOX.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_SELECTMANYLISTBOX.gif
deleted file mode 100644
index 0ed9443..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_SELECTMANYLISTBOX.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_SELECTMANYMENU.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_SELECTMANYMENU.gif
deleted file mode 100644
index dc1dbbc..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_SELECTMANYMENU.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_SELECTONELISTBOX.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_SELECTONELISTBOX.gif
deleted file mode 100644
index a1c257e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_SELECTONELISTBOX.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_SELECTONEMENU.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_SELECTONEMENU.gif
deleted file mode 100644
index 3686b5c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_SELECTONEMENU.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_SELECTONERADIO.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_SELECTONERADIO.gif
deleted file mode 100644
index f6aeac0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_SELECTONERADIO.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_BODY.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_BODY.gif
deleted file mode 100644
index 85d3938..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_BODY.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_BUTTON.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_BUTTON.gif
deleted file mode 100644
index 8e721c5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_BUTTON.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_COLUMN.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_COLUMN.gif
deleted file mode 100644
index 5a3db49..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_COLUMN.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_COMMANDBUTTON.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_COMMANDBUTTON.gif
deleted file mode 100644
index 8e721c5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_COMMANDBUTTON.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_COMMANDLINK.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_COMMANDLINK.gif
deleted file mode 100644
index 5fd9c94..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_COMMANDLINK.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_DATATABLE.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_DATATABLE.gif
deleted file mode 100644
index d11c996..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_DATATABLE.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_FORM.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_FORM.gif
deleted file mode 100644
index 3081f32..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_FORM.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_GRAPHICIMAGE.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_GRAPHICIMAGE.gif
deleted file mode 100644
index a988c1d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_GRAPHICIMAGE.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_HEAD.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_HEAD.gif
deleted file mode 100644
index 41230ca..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_HEAD.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_INPUTHIDDEN.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_INPUTHIDDEN.gif
deleted file mode 100644
index f18865b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_INPUTHIDDEN.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_INPUTSECRET.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_INPUTSECRET.gif
deleted file mode 100644
index 13dbf62..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_INPUTSECRET.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_INPUTTEXT.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_INPUTTEXT.gif
deleted file mode 100644
index 7f506d9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_INPUTTEXT.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_INPUTTEXTAREA.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_INPUTTEXTAREA.gif
deleted file mode 100644
index a2fa616..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_INPUTTEXTAREA.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_LINK.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_LINK.gif
deleted file mode 100644
index 5216956..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_LINK.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_MESSAGE.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_MESSAGE.gif
deleted file mode 100644
index 7d0c261..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_MESSAGE.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_MESSAGES.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_MESSAGES.gif
deleted file mode 100644
index 6f43980..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_MESSAGES.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_OUTPUTFORMAT.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_OUTPUTFORMAT.gif
deleted file mode 100644
index 29dcd77..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_OUTPUTFORMAT.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_OUTPUTLABEL.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_OUTPUTLABEL.gif
deleted file mode 100644
index b957bca..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_OUTPUTLABEL.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_OUTPUTLINK.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_OUTPUTLINK.gif
deleted file mode 100644
index 5216956..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_OUTPUTLINK.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_OUTPUTSCRIPT.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_OUTPUTSCRIPT.gif
deleted file mode 100644
index 6a3ed20..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_OUTPUTSCRIPT.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_OUTPUTSTYLESHEET.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_OUTPUTSTYLESHEET.gif
deleted file mode 100644
index 77d14c3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_OUTPUTSTYLESHEET.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_OUTPUTTEXT.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_OUTPUTTEXT.gif
deleted file mode 100644
index 0845145..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_OUTPUTTEXT.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_PANELGRID.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_PANELGRID.gif
deleted file mode 100644
index dd22a99..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_PANELGRID.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_PANELGROUP.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_PANELGROUP.gif
deleted file mode 100644
index 0a13d8c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_PANELGROUP.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_SELECTBOOLEANCHECKBOX.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_SELECTBOOLEANCHECKBOX.gif
deleted file mode 100644
index 00da14e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_SELECTBOOLEANCHECKBOX.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_SELECTMANYCHECKBOX.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_SELECTMANYCHECKBOX.gif
deleted file mode 100644
index 2e2370d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_SELECTMANYCHECKBOX.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_SELECTMANYLISTBOX.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_SELECTMANYLISTBOX.gif
deleted file mode 100644
index a20aed5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_SELECTMANYLISTBOX.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_SELECTMANYMENU.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_SELECTMANYMENU.gif
deleted file mode 100644
index 4cfeaa8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_SELECTMANYMENU.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_SELECTONELISTBOX.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_SELECTONELISTBOX.gif
deleted file mode 100644
index f6445ed..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_SELECTONELISTBOX.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_SELECTONEMENU.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_SELECTONEMENU.gif
deleted file mode 100644
index 04a0d43..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_SELECTONEMENU.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_SELECTONERADIO.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_SELECTONERADIO.gif
deleted file mode 100644
index 2598367..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_SELECTONERADIO.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/large/JSP_DECLARATION.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/large/JSP_DECLARATION.gif
deleted file mode 100644
index 5403f72..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/large/JSP_DECLARATION.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/large/JSP_DIRECTIVE.INCLUDE.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/large/JSP_DIRECTIVE.INCLUDE.gif
deleted file mode 100644
index 5926670..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/large/JSP_DIRECTIVE.INCLUDE.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/large/JSP_DIRECTIVE.PAGE.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/large/JSP_DIRECTIVE.PAGE.gif
deleted file mode 100644
index e21e763..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/large/JSP_DIRECTIVE.PAGE.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/large/JSP_DIRECTIVE.TAGLIB.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/large/JSP_DIRECTIVE.TAGLIB.gif
deleted file mode 100644
index 723a10d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/large/JSP_DIRECTIVE.TAGLIB.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/large/JSP_EXPRESSION.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/large/JSP_EXPRESSION.gif
deleted file mode 100644
index 53a23e1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/large/JSP_EXPRESSION.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/large/JSP_FALLBACK.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/large/JSP_FALLBACK.gif
deleted file mode 100644
index 2507aac..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/large/JSP_FALLBACK.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/large/JSP_FORWARD.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/large/JSP_FORWARD.gif
deleted file mode 100644
index 7747595..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/large/JSP_FORWARD.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/large/JSP_GETPROPERTY.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/large/JSP_GETPROPERTY.gif
deleted file mode 100644
index 4d11f8d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/large/JSP_GETPROPERTY.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/large/JSP_INCLUDE.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/large/JSP_INCLUDE.gif
deleted file mode 100644
index 88e62b4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/large/JSP_INCLUDE.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/large/JSP_PARAM.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/large/JSP_PARAM.gif
deleted file mode 100644
index 79e07c2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/large/JSP_PARAM.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/large/JSP_PARAMS.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/large/JSP_PARAMS.gif
deleted file mode 100644
index 9f517ae..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/large/JSP_PARAMS.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/large/JSP_PLUGIN.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/large/JSP_PLUGIN.gif
deleted file mode 100644
index 2ba7b4b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/large/JSP_PLUGIN.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/large/JSP_ROOT.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/large/JSP_ROOT.gif
deleted file mode 100644
index 922b61d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/large/JSP_ROOT.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/large/JSP_SCRIPTLET.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/large/JSP_SCRIPTLET.gif
deleted file mode 100644
index a1d2e61..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/large/JSP_SCRIPTLET.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/large/JSP_SETPROPERTY.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/large/JSP_SETPROPERTY.gif
deleted file mode 100644
index 4d11f8d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/large/JSP_SETPROPERTY.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/large/JSP_TEXT.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/large/JSP_TEXT.gif
deleted file mode 100644
index 4cc147e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/large/JSP_TEXT.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/large/JSP_USEBEAN.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/large/JSP_USEBEAN.gif
deleted file mode 100644
index 9d54e8b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/large/JSP_USEBEAN.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/small/JSP_DECLARATION.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/small/JSP_DECLARATION.gif
deleted file mode 100644
index 35f48ef..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/small/JSP_DECLARATION.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/small/JSP_DIRECTIVE.INCLUDE.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/small/JSP_DIRECTIVE.INCLUDE.gif
deleted file mode 100644
index 1ef9c8f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/small/JSP_DIRECTIVE.INCLUDE.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/small/JSP_DIRECTIVE.PAGE.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/small/JSP_DIRECTIVE.PAGE.gif
deleted file mode 100644
index 37c1e7c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/small/JSP_DIRECTIVE.PAGE.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/small/JSP_DIRECTIVE.TAGLIB.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/small/JSP_DIRECTIVE.TAGLIB.gif
deleted file mode 100644
index 33ef3d8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/small/JSP_DIRECTIVE.TAGLIB.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/small/JSP_EXPRESSION.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/small/JSP_EXPRESSION.gif
deleted file mode 100644
index 66fd649..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/small/JSP_EXPRESSION.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/small/JSP_FALLBACK.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/small/JSP_FALLBACK.gif
deleted file mode 100644
index 4fb4150..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/small/JSP_FALLBACK.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/small/JSP_FORWARD.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/small/JSP_FORWARD.gif
deleted file mode 100644
index 1d3bafb..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/small/JSP_FORWARD.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/small/JSP_GETPROPERTY.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/small/JSP_GETPROPERTY.gif
deleted file mode 100644
index af4450a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/small/JSP_GETPROPERTY.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/small/JSP_INCLUDE.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/small/JSP_INCLUDE.gif
deleted file mode 100644
index 2584c31..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/small/JSP_INCLUDE.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/small/JSP_PARAM.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/small/JSP_PARAM.gif
deleted file mode 100644
index b3e0727..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/small/JSP_PARAM.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/small/JSP_PARAMS.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/small/JSP_PARAMS.gif
deleted file mode 100644
index 4075922..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/small/JSP_PARAMS.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/small/JSP_PLUGIN.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/small/JSP_PLUGIN.gif
deleted file mode 100644
index 04bab8e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/small/JSP_PLUGIN.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/small/JSP_ROOT.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/small/JSP_ROOT.gif
deleted file mode 100644
index f6d19d4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/small/JSP_ROOT.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/small/JSP_SCRIPTLET.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/small/JSP_SCRIPTLET.gif
deleted file mode 100644
index 1753b96..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/small/JSP_SCRIPTLET.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/small/JSP_SETPROPERTY.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/small/JSP_SETPROPERTY.gif
deleted file mode 100644
index af4450a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/small/JSP_SETPROPERTY.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/small/JSP_TEXT.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/small/JSP_TEXT.gif
deleted file mode 100644
index 7f506d9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/small/JSP_TEXT.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/small/JSP_USEBEAN.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/small/JSP_USEBEAN.gif
deleted file mode 100644
index ba33db7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/small/JSP_USEBEAN.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/large/UI_COMPONENT.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/large/UI_COMPONENT.gif
deleted file mode 100644
index a2bad20..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/large/UI_COMPONENT.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/large/UI_COMPOSITION.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/large/UI_COMPOSITION.gif
deleted file mode 100644
index 754776a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/large/UI_COMPOSITION.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/large/UI_DEBUG.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/large/UI_DEBUG.gif
deleted file mode 100644
index 5d42393..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/large/UI_DEBUG.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/large/UI_DECORATE.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/large/UI_DECORATE.gif
deleted file mode 100644
index 3258914..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/large/UI_DECORATE.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/large/UI_DEFINE.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/large/UI_DEFINE.gif
deleted file mode 100644
index bb97502..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/large/UI_DEFINE.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/large/UI_FRAGMENT.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/large/UI_FRAGMENT.gif
deleted file mode 100644
index b5318ea..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/large/UI_FRAGMENT.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/large/UI_INCLUDE.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/large/UI_INCLUDE.gif
deleted file mode 100644
index 236b6dc..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/large/UI_INCLUDE.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/large/UI_INSERT.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/large/UI_INSERT.gif
deleted file mode 100644
index 7616305..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/large/UI_INSERT.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/large/UI_PARAM.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/large/UI_PARAM.gif
deleted file mode 100644
index 64c3b5d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/large/UI_PARAM.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/large/UI_REMOVE.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/large/UI_REMOVE.gif
deleted file mode 100644
index ac9e7a6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/large/UI_REMOVE.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/large/UI_REPEAT.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/large/UI_REPEAT.gif
deleted file mode 100644
index 3e9b63a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/large/UI_REPEAT.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/small/UI_COMPONENT.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/small/UI_COMPONENT.gif
deleted file mode 100644
index 1fd5777..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/small/UI_COMPONENT.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/small/UI_COMPOSITION.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/small/UI_COMPOSITION.gif
deleted file mode 100644
index 2a74310..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/small/UI_COMPOSITION.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/small/UI_DEBUG.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/small/UI_DEBUG.gif
deleted file mode 100644
index 3364b0b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/small/UI_DEBUG.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/small/UI_DECORATE.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/small/UI_DECORATE.gif
deleted file mode 100644
index 80aa539..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/small/UI_DECORATE.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/small/UI_DEFINE.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/small/UI_DEFINE.gif
deleted file mode 100644
index aee16f7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/small/UI_DEFINE.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/small/UI_FRAGMENT.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/small/UI_FRAGMENT.gif
deleted file mode 100644
index 5bb766b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/small/UI_FRAGMENT.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/small/UI_INCLUDE.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/small/UI_INCLUDE.gif
deleted file mode 100644
index f52b3c0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/small/UI_INCLUDE.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/small/UI_INSERT.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/small/UI_INSERT.gif
deleted file mode 100644
index 292cc11..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/small/UI_INSERT.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/small/UI_PARAM.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/small/UI_PARAM.gif
deleted file mode 100644
index 618fa1c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/small/UI_PARAM.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/small/UI_REMOVE.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/small/UI_REMOVE.gif
deleted file mode 100644
index 23eef71..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/small/UI_REMOVE.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/small/UI_REPEAT.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/small/UI_REPEAT.gif
deleted file mode 100644
index 8124eac..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/small/UI_REPEAT.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/facelet_composite.properties b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/facelet_composite.properties
deleted file mode 100644
index faaac2a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/facelet_composite.properties
+++ /dev/null
@@ -1,98 +0,0 @@
-FaceletComposite.display-label=Facelet Composite
-FaceletComposite.description=This tag library allows composite facelet components to be defined
-
-actionSource.display-label=actionSource
-actionSource.description=Declares that the composite component whose contract is declared by the \
- &lt;composite:interface&gt;  \
-in which this element is nested exposes an implementation of \
-ActionSource2 \
-suitable for use as the target of attached objects in the using page.
-
-attribute.display-label=attribute
-attribute.description=Declares an attribute that may be given to an instance of the composite component tag for this composite component
-
-editableValueHolder.display-label=editableValueHolder
-editableValueHolder.description=Declares that the composite component whose contract is declared by the \
- &lt;composite:interface&gt;  \
-in which this element is nested exposes an implementation of \
-EditableValueHolder \
-suitable for use as the target of attached objects in the using page. 
-
-extension.display-label=extension
-extension.description=Used within a \
-&lt;composite:interface&gt; \
-section, within any sub-element of that section, to include XML content not defined by this specification.
-
-facet.display-label=facet
-facet.description=Declares that this composite component supports a facet with the name given by the value of the "name" attribute. 
-
-implementation.display-label=implementation
-implementation.description=Defines the implementation of the composite component. \
-There must be zero or one of these in a composite component markup file. If a \
- &lt;composite:interface&gt;  \
-element appears, there must be a corresponding \
-&lt;composite-implementation&gt; element.   
-If no  &lt;composite:interface&gt;  element appears, \
-the &lt;composite-implementation&gt; element is optional. 
-
-insertChildren.display-label=insertChildren
-insertChildren.description=This element is used in the composite-implementation section. \
-Any child components or template text within the composite component tag \
-in the using page will be re-parented into the composite component \
-at the point indicated by this tag's placement within the \
- &lt;composite-implementation&gt;  section.
-
-insertFacet.display-label=insertFacet
-insertFacet.description=The presence of this tag in a \
- &lt;composite-implementation&gt; section \
-must cause the named facet to be taken from the facet map of the top level component \
-and inserted as a facet child of the component in which this element is nested.
-
-interface.display-label=interface
-interface.description=This element declares the usage contract for a composite component. 
-
-renderFacet.display-label=renderFacet
-renderFacet.description=This element is used in the \
-&lt;composite:implementation&gt; section. \
-The facet with the name equal to the value of the name attribute, given by the page author in the using page,\
-will be rendered at this point in the composite component PDL page. 
-<p>
-The implementation of this tag handler must insert a component \
-with component-type javax.faces.Output \ 
-and renderer-type javax.faces.CompositeFacet \
-as a child at this point in the component tree.
-<p>
-The implementation of this tag handler must store an attribute \
-into the created component's attribute map under the key \
-given by the value of the symbolic constant UIComponent.FACETS_KEY. \
-The value for this key must be the evaluated value of the "name" attribute.
-
-valueHolder.display-label=valueHolder
-valueHolder.description=Declares that the composite component whose contract is declared by the \
-&lt;composite:interface&gt; \
-in which this element is nested exposes an implementation of \
-ValueHolder \
-suitable for use as the target of attached objects in the using page. 
-
-
-interface_name.description=The name of this composite component. Advisory only. The real name is taken from the filename.
-componentType.description=The component-type of the UIComponent that will serve as the composite component root for this composite component. The declared component-family for this component must be javax.faces.NamingContainer.
-displayName.description=The name to display in a tool palette containing this component. 
-preferred.description=Is this a "preferred" component.
-expert.description=Is this component only for expert users.
-shortDescription.description=A short description of the purpose of this component. 
-
-name.description=The name of the attribute as it must appear on the composite component tag in the using page.
-attribute_targets.description=If this element has a method-signature attribute, the value of the targets attribute must be interpreted as a space (not tab) separated list of client ids (relative to the top level component) of components within the &lt;composite:implementation&gt; section. Space is used as the delimiter for compatibility with the IDREFS and NMTOKENS data types from the XML Schema. Each entry in the list must be interpreted as the id of an inner component to which the MethodExpression from the composite component tag in the using page must be applied. If this element has a method-signature attribute, but no targets attribute, the value of the name attribute is used as the single entry in the list. If the value of the name attribute is not one of the special values listed in the description of the name attribute, targets (or its derived value) need not correspond to the id of an inner component.
-default.description=If this attribute is not required, and a value is not supplied by the page author, use this as the default value.
-required.description=True if the page author must supply a value for this attribute.
-method-signature.description=Declares that this attribute must be a MethodExpression whose method signature is described by the value of this attribute. The signature must be described using fully qualified class names wherever a type is required. This attribute is mutually exclusive with the "type" attribute. If both attributes are present, the "method-signature" attribute is ignored.
-type.description=Declares that this attribute must be a ValueExpression whose expected type is given by the value of this attribute. If not specified, and no "method-signature" attribute is present, java.lang.Object is assumed. This attribute is mutually exclusive with the "type" attribute. If both attributes are present, the "method-signature" attribute is ignored. 
-
-insertFacet_name.description=The name of the facet child on the top level component which must be inserted as a facet child of the component in which this element is nested.
-actionSource_name.description=The value of this attribute maps back to the "for" attribute on an attachable object nested within a composite component. If the "targets" attribute is not specified, this value also represents the component ID of the target component within the that the <composite:implementation> ActionListener should be mapped to. 
-targets.description=If present, this must be a space (not tab) separated list of client ids (relative to the top level component) of components within the <composite:implementation> section. Space is used as the delimiter for compatibility with the IDREFS and NMTOKENS data types from the XML Schema.
-
-valueHolder_name.description=The value of this attribute maps back to the "for" attribute on an attachable object nested within a composite component. If the "targets" attribute is not specified, this value also represents the component ID of the target component within the that the <composite:implementation> ActionListener should be mapped to. 
-
- 
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/facelet_composite.xml b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/facelet_composite.xml
deleted file mode 100644
index 48a9c9f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/facelet_composite.xml
+++ /dev/null
@@ -1,469 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<md:metadatamodel
-	xmlns:md="http://org.eclipse.jst.jsf.common.metadata/metadata.ecore"
-	xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore"
-	xmlns:mdt="http://org.eclipse.jst.jsf.common.metadata/metadataTraitTypes.ecore"
-	xmlns:pi="http://org.eclipse.jsf.pagedesigner/paletteInfos.ecore"
-	xmlns:qe="http://org.eclipse.jsf.pagedesigner/quickEditTabSections.ecore"
-	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	xmlns:addTagMD="http://org.eclipse.jst.jsf.facelet.core/additionalTagMetadata.ecore"
-	id="http://java.sun.com/jsf/composite" type="tagFile">
-
-	<trait id="images-base-path">
-		<value xsi:type="mdt:StringValue">$nl$/icons/palette/Composite</value>
-	</trait>
-
-	<trait id="display-label">
-		<value xsi:type="mdt:StringValue">%FaceletComposite.display-label</value>
-	</trait>
-
-	<trait id="description">
-		<value xsi:type="mdt:StringValue">%FaceletComposite.description</value>
-	</trait>
-
-	<trait id="default-prefix">
-		<value xsi:type="mdt:StringValue">composite</value>
-	</trait>
-
-	<trait id="paletteInfos">
-		<value xsi:type="pi:PaletteInfos">
-			<item id="actionSource">
-				<display-label>%actionSource.display-label</display-label>
-				<description>%actionSource.description</description>
-				<small-icon>small/ACTIONSOURCE.gif</small-icon>
-				<large-icon>large/ACTIONSOURCE.gif</large-icon>				
-			</item>
-			<item id="attribute">
-				<display-label>%attribute.display-label</display-label>
-				<description>%attribute.description</description>
-				<small-icon>small/ATTRIBUTE.gif</small-icon>
-				<large-icon>large/ATTRIBUTE.gif</large-icon>				
-			</item>
-			<item id="editableValueHolder">
-				<display-label>%editableValueHolder.display-label</display-label>
-				<description>%editableValueHolder.description</description>
-				<small-icon>small/EDITABLEVALUEHOLDER.gif</small-icon>
-				<large-icon>large/EDITABLEVALUEHOLDER.gif</large-icon>				
-			</item>
-			<item id="extension">
-				<display-label>%extension.display-label</display-label>
-				<description>%extension.description</description>
-				<small-icon>small/EXTENSION.gif</small-icon>
-				<large-icon>large/EXTENSION.gif</large-icon>				
-			</item>
-			<item id="facet">
-				<display-label>%facet.display-label</display-label>
-				<description>%facet.description</description>
-				<small-icon>small/FACET.gif</small-icon>
-				<large-icon>large/FACET.gif</large-icon>				
-			</item>
-			<item id="implementation">
-				<display-label>%implementation.display-label</display-label>
-				<description>%implementation.description</description>
-				<small-icon>small/IMPLEMENTATION.gif</small-icon>
-				<large-icon>large/IMPLEMENTATION.gif</large-icon>				
-			</item>
-			<item id="insertChildren">
-				<display-label>%insertChildren.display-label</display-label>
-				<description>%insertChildren.description</description>
-				<small-icon>small/INSERTCHILDREN.gif</small-icon>
-				<large-icon>large/INSERTCHILDREN.gif</large-icon>				
-			</item>
-			<item id="insertFacet">
-				<display-label>%insertFacet.display-label</display-label>
-				<description>%insertFacet.description</description>
-				<small-icon>small/INSERTFACET.gif</small-icon>
-				<large-icon>large/INSERTFACET.gif</large-icon>				
-			</item>
-			<item id="interface">
-				<display-label>%interface.display-label</display-label>
-				<description>%interface.description</description>
-				<small-icon>small/INTERFACE.gif</small-icon>
-				<large-icon>large/INTERFACE.gif</large-icon>				
-			</item>
-			<item id="renderFacet">
-				<display-label>%renderFacet.display-label</display-label>
-				<description>%renderFacet.description</description>
-				<small-icon>small/RENDERFACET.gif</small-icon>
-				<large-icon>large/RENDERFACET.gif</large-icon>				
-			</item>
-			<item id="valueHolder">
-				<display-label>%valueHolder.display-label</display-label>
-				<description>%valueHolder.description</description>
-				<small-icon>small/VALUEHOLDER.gif</small-icon>
-				<large-icon>large/VALUEHOLDER.gif</large-icon>				
-			</item>
-		</value>
-	</trait>
-
-	<entity id="interface">
-		<trait id="additionalElementData">
-			<value xsi:type="addTagMD:ElementData">
-				<name>interface</name>
-				<attribute>
-					<name>name</name>
-					<usage>OPTIONAL</usage>
-					<description>%interface_name.description</description>
-				</attribute>
-				<attribute>
-					<name>componentType</name>
-					<usage>OPTIONAL</usage>
-					<description>%componentType.description</description>
-				</attribute>
-				<attribute>
-					<name>displayName</name>
-					<usage>OPTIONAL</usage>
-					<description>%displayName.description</description>
-				</attribute>
-				<attribute>
-					<name>preferred</name>
-					<usage>OPTIONAL</usage>
-					<description>%preferred.description</description>
-				</attribute>
-				<attribute>
-					<name>expert</name>
-					<usage>OPTIONAL</usage>
-					<description>%expert.description</description>
-				</attribute>
-				<attribute>
-					<name>shortDescription</name>
-					<usage>OPTIONAL</usage>
-					<description>%shortDescription.description</description>
-				</attribute>
-			</value>
-		</trait>
-		<entity id="name">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.StringType
-				</value>
-			</trait>
-		</entity>
-		<entity id="componentType">
-
-		</entity>
-		<entity id="displayName">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.StringTpe
-				</value>
-			</trait>
-		</entity>
-		<entity id="preferred">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.BooleanType
-				</value>
-			</trait>
-		</entity>
-		<entity id="expert">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.BooleanType
-				</value>
-			</trait>
-		</entity>
-		<entity id="shortDescription">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.StringType
-				</value>
-			</trait>
-		</entity>
-	</entity>
-
-	<entity id="implementation">
-
-	</entity>
-
-	<entity id="attribute">
-		<trait id="additionalElementData">
-			<value xsi:type="addTagMD:ElementData">
-				<name>attribute</name>
-				<attribute>
-					<name>name</name>
-					<usage>REQUIRED</usage>
-					<description>%name.description</description>
-				</attribute>
-				<attribute>
-					<name>targets</name>
-					<usage>REQUIRED</usage>
-					<description>%attribute_targets.description</description>
-				</attribute>
-				<attribute>
-					<name>default</name>
-					<usage>OPTIONAL</usage>
-					<description>%default.description</description>
-				</attribute>
-				<attribute>
-					<name>displayName</name>
-					<usage>OPTIONAL</usage>
-					<description>%displayName.description</description>
-				</attribute>
-				<attribute>
-					<name>required</name>
-					<usage>OPTIONAL</usage>
-					<description>%required.description</description>
-				</attribute>
-				<attribute>
-					<name>preferred</name>
-					<usage>OPTIONAL</usage>
-					<description>%preferred.description</description>
-				</attribute>
-				<attribute>
-					<name>expert</name>
-					<usage>OPTIONAL</usage>
-					<description>%expert.description</description>
-				</attribute>
-				<attribute>
-					<name>type</name>
-					<usage>OPTIONAL</usage>
-					<description>%type.description</description>
-				</attribute>
-				<attribute>
-					<name>method-signature</name>
-					<usage>OPTIONAL</usage>
-					<description>%method-signature.description</description>
-				</attribute>
-				<attribute>
-					<name>shortDescription</name>
-					<usage>OPTIONAL</usage>
-					<description>%shortDescription.description</description>
-				</attribute>
-			</value>
-		</trait>
-		<entity id="name">
-			<trait id="required">
-				<value xsi:type="mdt:BooleanValue">true</value>
-			</trait>
-		</entity>
-		<entity id="targets">
-			<trait id="required">
-				<value xsi:type="mdt:BooleanValue">true</value>
-			</trait>
-
-		</entity>
-
-		<entity id="default">
-
-		</entity>
-
-		<entity id="required">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.BooleanType
-				</value>
-			</trait>
-		</entity>
-
-		<entity id="preferred">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.BooleanType
-				</value>
-			</trait>
-		</entity>
-
-		<entity id="expert">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.BooleanType
-				</value>
-			</trait>
-		</entity>
-
-		<entity id="shortDescription">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.StringType
-				</value>
-			</trait>
-		</entity>
-
-		<entity id="method-signature">
-
-		</entity>
-
-		<entity id="type">
-
-		</entity>
-	</entity>
-	<entity id="facet">
-		<trait id="additionalElementData">
-			<value xsi:type="addTagMD:ElementData">
-				<name>facet</name>
-				<attribute>
-					<name>name</name>
-					<usage>REQUIRED</usage>
-					<description>%name.description</description>
-				</attribute>
-				<attribute>
-					<name>displayName</name>
-					<usage>OPTIONAL</usage>
-					<description>%displayName.description</description>
-				</attribute>
-				<attribute>
-					<name>required</name>
-					<usage>OPTIONAL</usage>
-					<description>%required.description</description>
-				</attribute>
-				<attribute>
-					<name>preferred</name>
-					<usage>OPTIONAL</usage>
-					<description>%preferred.description</description>
-				</attribute>
-				<attribute>
-					<name>expert</name>
-					<usage>OPTIONAL</usage>
-					<description>%expert.description</description>
-				</attribute>
-				<attribute>
-					<name>shortDescription</name>
-					<usage>OPTIONAL</usage>
-					<description>%shortDescription.description</description>
-				</attribute>
-				
-			</value>
-		</trait>
-		<entity id="name">
-			<trait id="required">
-				<value xsi:type="mdt:BooleanValue">true</value>
-			</trait>
-		</entity>
-	</entity>
-	<entity id="renderFacet">
-		<trait id="additionalElementData">
-			<value xsi:type="addTagMD:ElementData">
-				<name>renderFacet</name>
-				<attribute>
-					<name>name</name>
-					<usage>REQUIRED</usage>
-					<description>%name.description</description>
-				</attribute>
-				<attribute>
-					<name>required</name>
-					<usage>OPTIONAL</usage>
-					<description>%required.description</description>
-				</attribute>
-			</value>
-		</trait>
-		<entity id="name">
-			<trait id="required">
-				<value xsi:type="mdt:BooleanValue">true</value>
-			</trait>
-		</entity>
-
-		<entity id="required">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.BooleanType
-				</value>
-			</trait>
-		</entity>
-	</entity>
-
-	<entity id="insertChildren">
-
-	</entity>
-
-	<entity id="valueHolder">
-		<trait id="additionalElementData">
-			<value xsi:type="addTagMD:ElementData">
-				<name>valueHolder</name>
-				<attribute>
-					<name>name</name>
-					<usage>REQUIRED</usage>
-					<description>%actionSource_name.description</description>
-				</attribute>
-				<attribute>
-					<name>targets</name>
-					<usage>OPTIONAL</usage>
-					<description>%targets.description</description>
-				</attribute>
-			</value>
-		</trait>
-		<entity id="name">
-			<trait id="required">
-				<value xsi:type="mdt:BooleanValue">true</value>
-			</trait>
-		</entity>
-		<entity id="targets">
-
-		</entity>
-	</entity>
-
-	<entity id="editableValueHolder">
-		<trait id="additionalElementData">
-			<value xsi:type="addTagMD:ElementData">
-				<name>editableValueHolder</name>
-				<attribute>
-					<name>name</name>
-					<usage>REQUIRED</usage>
-					<description>%name.description</description>
-				</attribute>
-				<attribute>
-					<name>targets</name>
-					<usage>OPTIONAL</usage>
-					<description>%targets.description</description>
-				</attribute>
-			</value>
-		</trait>
-		<entity id="name">
-			<trait id="required">
-				<value xsi:type="mdt:BooleanValue">true</value>
-			</trait>
-		</entity>
-		<entity id="targets">
-
-		</entity>
-	</entity>
-
-	<entity id="actionSource">
-		<trait id="additionalElementData">
-			<value xsi:type="addTagMD:ElementData">
-				<name>actionSource</name>
-				<attribute>
-					<name>name</name>
-					<usage>REQUIRED</usage>
-					<description>%actionSource_name.description</description>
-				</attribute>
-				<attribute>
-					<name>targets</name>
-					<usage>OPTIONAL</usage>
-					<description>%targets.description</description>
-				</attribute>
-			</value>
-		</trait>
-		<entity id="name">
-			<trait id="required">
-				<value xsi:type="mdt:BooleanValue">true</value>
-			</trait>
-		</entity>
-		<entity id="targets">
-
-		</entity>
-	</entity>
-
-	<entity id="extension">
-
-	</entity>
-
-	<entity id="insertFacet">
-		<trait id="additionalElementData">
-			<value xsi:type="addTagMD:ElementData">
-				<name>insertFacet</name>
-				<attribute>
-					<name>name</name>
-					<usage>REQUIRED</usage>
-					<description>%insertFacet_name.description</description>
-				</attribute>
-				<attribute>
-					<name>required</name>
-					<usage>OPTIONAL</usage>
-					<description>%required.description</description>
-				</attribute>
-			</value>
-		</trait>
-		<entity id="name">
-			<trait id="required">
-				<value xsi:type="mdt:BooleanValue">true</value>
-			</trait>
-		</entity>
-		<entity id="required">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.BooleanType
-				</value>
-			</trait>
-		</entity>
-	</entity>
-</md:metadatamodel>
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/facelet_ui.properties b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/facelet_ui.properties
deleted file mode 100644
index 4318744..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/facelet_ui.properties
+++ /dev/null
@@ -1,68 +0,0 @@
-FaceletUI.display-label=Facelet Core
-FaceletUI.description=The tags in this library add templating
-
-component.display-label=component
-component.description=Adds a new UIComponent into the view's component tree.  The new component will be the parent of the tag's component children.  Text outside the tag is removed before view rendering similar to composition.
-
-composition.display-label=composition
-composition.description=<p><em>Inserts a composite component that ignores content around it:</em></p> \
-<br><p><i>This text will be removed</i><br>  \
-<b>&lt;ui:composition&gt;</b><br> \
-#{el.text}<br> \
-&lt;h:inputText &nbsp;value="\#{some.value}"/&gt;<br> \
-<b>&lt;/ui:composition&gt;</b><br> \
-<i>This text will be removed</i></p>
-
-debug.display-label=debug
-debug.description=Saves the component tree and EL variables in a view.  Accessible by hitting the hotkey (CTRL-SHIFT-D by default).
-
-decorate.display-label=decorate
-decorate.description=<p><em>Inserts a composite component that keeps the content around it:</em></p> \
-<br><p><i>This text will NOT be removed</i><br> \
-<b>&lt;ui:composition&gt;</b><br> \
-#{el.text}<br> \
-&lt;h:inputText &nbsp;value="\#{some.value}"/&gt;<br> \
-<b>&lt;/ui:composition&gt;</b><br> \
-<i>This text will NOT be removed</i></p>
-
-define.display-label=define
-define.description=Defines a template area that can be used instances using insert.
-
-fragment.display-label=fragment
-fragment.description=Adds a new UIComponent into the view's component tree.  The new component will be the parent of the tag's component children.  Text outside the tag is kept, similar to decorate.
-
-include.display-label=include
-include.description=Includes another facelet.
-
-insert.display-label=insert
-insert.description=Insert a named template area created using the define tag.
-
-param.display-label=param
-param.description=Declares a new EL variable on the facelet page.
-
-remove.display-label=remove
-remove.description=Removes its content from the rendered view.
-
-repeat.display-label=repeat
-repeat.description=Repeatedly renders its content by iterating through the List returned from the value attribute.  Intended as a JSF-safe replacement for c:forEach.
-
-binding.description=A method binding of the form of the form \#{bean.binding} where 'binding' has the signature <b>UIComponent binding()</b>, that returns the component instance to use. If not present, Facelets will automatically instantiate one.
-define_name.description=The name of a template area.  This name is referenced in instance documents using the insert tag
-hotkey.description=The key in combination with CTRL-SHIFT to use to launch the debug viewer
-id.description=Assign a unique idea to generated component.  If not present, Facelets will automatically generate one.
-insert_name.description=The name of a template area to insert (defined in the template using the define tag).  If not specified, the entire template will be inserted.
-param_name.description=The name of the new EL variable to declare
-param_value.description=The literal or EL value to assign to the new variable
-
-repeat_value.description=The EL expression used to derive the list of items to repeat over
-repeat_var.description=The name of the EL variable to use as the iterator
-repeat_varStatus.description=The name of the exported request scoped variable for the status of the iteration.
-repeat_offset.description=The offset from the beginning of the collection from which to start the iteration.
-repeat_size.description=Starting from first, the iteration will process every other by step value.
-repeat_step.description=The name of the exported request scoped variable for the status of the iteration.
-
-src.description=The path, absolute or relative to the original request, to another Facelet to include.  May be EL.  e.g. 'headerPage.xhtml'
-template.description=A uri that points to the template to use.  e.g. /WEB-INF/templates/mytemplate.xhtml
-name.description=The name of the component
-
-rendered.description=Flag indicating whether or not the component should be rendered
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/facelet_ui.xml b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/facelet_ui.xml
deleted file mode 100644
index 6d6606d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/facelet_ui.xml
+++ /dev/null
@@ -1,393 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<md:metadatamodel
-	xmlns:md="http://org.eclipse.jst.jsf.common.metadata/metadata.ecore"
-	xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore"
-	xmlns:mdt="http://org.eclipse.jst.jsf.common.metadata/metadataTraitTypes.ecore"
-	xmlns:pi="http://org.eclipse.jsf.pagedesigner/paletteInfos.ecore"
-	xmlns:qe="http://org.eclipse.jsf.pagedesigner/quickEditTabSections.ecore"
-	xmlns:addTagMD="http://org.eclipse.jst.jsf.facelet.core/additionalTagMetadata.ecore"
-	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" id="http://java.sun.com/jsf/facelets"
-	type="tagFile">
-
-	<trait id="is-jsf-component-library">
-		<value xsi:type="mdt:StringValue">true</value>
-	</trait>
-
-	<trait id="images-base-path">
-		<value xsi:type="mdt:StringValue">$nl$/icons/palette/UI</value>
-	</trait>
-
-	<trait id="display-label">
-		<value xsi:type="mdt:StringValue">%FaceletUI.display-label</value>
-	</trait>
-
-	<trait id="description">
-		<value xsi:type="mdt:StringValue">%FaceletUI.description</value>
-	</trait>
-
-	<trait id="default-prefix">
-		<value xsi:type="mdt:StringValue">ui</value>
-	</trait>
-	
-	<trait id="paletteInfos">
-		<value xsi:type="pi:PaletteInfos">
-			<item id="component" tag="component">
-				<display-label>%component.display-label</display-label>
-				<description>%component.description</description>
-				<small-icon>small/UI_COMPONENT.gif</small-icon>
-				<large-icon>large/UI_COMPONENT.gif</large-icon>
-			</item>
-			<item id="composition">
-				<display-label>%composition.display-label</display-label>
-				<description>%composition.description</description>
-				<small-icon>small/UI_COMPOSITION.gif</small-icon>
-				<large-icon>large/UI_COMPOSITION.gif</large-icon>
-			</item>
-			<item id="debug">
-				<display-label>%debug.display-label</display-label>
-				<description>%debug.description</description>
-				<small-icon>small/UI_DEBUG.gif</small-icon>
-				<large-icon>large/UI_DEBUG.gif</large-icon>				
-			</item>
-			<item id="decorate">
-				<display-label>%decorate.display-label</display-label>
-				<description>%decorate.description</description>
-				<small-icon>small/UI_DECORATE.gif</small-icon>
-				<large-icon>large/UI_DECORATE.gif</large-icon>				
-			</item>
-			<item id="define">
-				<display-label>%define.display-label</display-label>
-				<description>%define.description</description>
-				<small-icon>small/UI_DEFINE.gif</small-icon>
-				<large-icon>large/UI_DEFINE.gif</large-icon>				
-			</item>
-			<item id="fragment">
-				<display-label>%fragment.display-label</display-label>
-				<description>%fragment.description</description>
-				<small-icon>small/UI_FRAGMENT.gif</small-icon>
-				<large-icon>large/UI_FRAGMENT.gif</large-icon>	
-			</item>
-			<item id="include">
-				<display-label>%include.display-label</display-label>
-				<description>%include.description</description>
-				<small-icon>small/UI_INCLUDE.gif</small-icon>
-				<large-icon>large/UI_INCLUDE.gif</large-icon>					
-			</item>
-			<item id="insert">
-				<display-label>%insert.display-label</display-label>
-				<description>%insert.description</description>
-				<small-icon>small/UI_INSERT.gif</small-icon>
-				<large-icon>large/UI_INSERT.gif</large-icon>					
-			</item>
-			<item id="param">
-				<display-label>%param.display-label</display-label>
-				<description>%param.description</description>
-				<small-icon>small/UI_PARAM.gif</small-icon>
-				<large-icon>large/UI_PARAM.gif</large-icon>					
-			</item>
-			<item id="remove">
-				<display-label>%remove.display-label</display-label>
-				<description>%remove.description</description>
-				<small-icon>small/UI_REMOVE.gif</small-icon>
-				<large-icon>large/UI_REMOVE.gif</large-icon>					
-			</item>
-			<item id="repeat">
-				<display-label>%repeat.display-label</display-label>
-				<description>%repeat.description</description>
-				<small-icon>small/UI_REPEAT.gif</small-icon>
-				<large-icon>large/UI_REPEAT.gif</large-icon>					
-			</item>
-		</value>
-	</trait>
-	<entity id="component">
-		<trait id="additionalElementData">
-			<value xsi:type="addTagMD:ElementData">
-				<name>component</name>
-				<attribute>
-					<name>id</name>
-					<usage>OPTIONAL</usage>
-					<description>%id.description</description>
-				</attribute>
-				<attribute>
-					<name>binding</name>
-					<usage>OPTIONAL</usage>
-					<description>%binding.description</description>
-				</attribute>
-			</value>
-		</trait>
-		<entity id="id">
-
-		</entity>
-		<entity id="binding">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.ComponentBindingType
-				</value>
-			</trait>
-			<trait id="runtime-return-type">
-				<value xsi:type="mdt:StringValue">javax.faces.component.UIComponent</value>
-			</trait>
-		</entity>
-	</entity>
-
-	<entity id="composition">
-		<trait id="additionalElementData">
-			<value xsi:type="addTagMD:ElementData">
-				<name>composition</name>
-				<attribute>
-					<name>template</name>
-					<usage>OPTIONAL</usage>
-					<description>%template.description</description>
-				</attribute>
-			</value>
-		</trait>
-		<entity id="template">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.facelet.core.attributevalues.TemplateWebPathType
-				</value>
-			</trait>
-		</entity>
-	</entity>
-
-	<entity id="debug">
-		<trait id="additionalElementData">
-			<value xsi:type="addTagMD:ElementData">
-				<name>debug</name>
-				<attribute>
-					<name>hotkey</name>
-					<usage>OPTIONAL</usage>
-					<description>%hotkey.description</description>
-				</attribute>
-				<attribute>
-					<name>rendered</name>
-					<usage>OPTIONAL</usage>
-					<description>%rendered.description</description>
-				</attribute>
-			</value>
-		</trait>
-		<entity id="hotkey">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.StringType
-				</value>
-			</trait>
-		</entity>
-		<entity id="rendered">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.BooleanType
-				</value>
-			</trait>
-		</entity>
-	</entity>
-
-	<entity id="decorate" type="tag">
-		<trait id="additionalElementData">
-			<value xsi:type="addTagMD:ElementData">
-				<name>decorate</name>
-				<attribute>
-					<name>template</name>
-					<usage>REQUIRED</usage>
-					<description>%template.description</description>
-				</attribute>
-			</value>
-		</trait>
-		<entity id="template">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.facelet.core.attributevalues.TemplateWebPathType
-				</value>
-			</trait>
-		</entity>
-	</entity>
-
-	<entity id="define">
-		<trait id="additionalElementData">
-			<value xsi:type="addTagMD:ElementData">
-				<name>define</name>
-				<attribute>
-					<name>name</name>
-					<usage>REQUIRED</usage>
-					<description>%define_name.description</description>
-				</attribute>
-			</value>
-		</trait>
-		<entity id="name">
-
-		</entity>
-	</entity>
-
-	<entity id="fragment">
-		<trait id="additionalElementData">
-			<value xsi:type="addTagMD:ElementData">
-				<name>fragment</name>
-				<attribute>
-					<name>id</name>
-					<usage>OPTIONAL</usage>
-					<description>%id.description</description>
-				</attribute>
-				<attribute>
-					<name>binding</name>
-					<usage>OPTIONAL</usage>
-					<description>%binding.description</description>
-				</attribute>
-			</value>
-		</trait>
-		<entity id="id">
-
-		</entity>
-		<entity id="binding">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.ComponentBindingType
-				</value>
-			</trait>
-			<trait id="runtime-return-type">
-				<value xsi:type="mdt:StringValue">javax.faces.component.UIComponent</value>
-			</trait>
-		</entity>
-	</entity>
-
-	<entity id="include">
-		<trait id="additionalElementData">
-			<value xsi:type="addTagMD:ElementData">
-				<name>include</name>
-				<attribute>
-					<name>src</name>
-					<usage>REQUIRED</usage>
-					<description>%src.description</description>
-				</attribute>
-			</value>
-		</trait>
-		<entity id="src">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.facelet.core.attributevalues.TemplateWebPathType
-				</value>
-			</trait>
-		</entity>
-	</entity>
-
-	<entity id="insert">
-		<trait id="additionalElementData">
-			<value xsi:type="addTagMD:ElementData">
-				<name>insert</name>
-				<attribute>
-					<name>name</name>
-					<usage>OPTIONAL</usage>
-					<description>%insert_name.description</description>
-				</attribute>
-			</value>
-		</trait>
-		<entity id="name">
-
-		</entity>
-	</entity>
-
-	<entity id="param">
-		<trait id="additionalElementData">
-			<value xsi:type="addTagMD:ElementData">
-				<name>param</name>
-				<attribute>
-					<name>name</name>
-					<usage>REQUIRED</usage>
-					<description>%param_name.description</description>
-				</attribute>
-				<attribute>
-					<name>value</name>
-					<usage>REQUIRED</usage>
-					<description>%param_value.description</description>
-				</attribute>
-			</value>
-		</trait>
-		<entity id="name">
-
-		</entity>
-		<entity id="value">
-
-		</entity>
-	</entity>
-
-	<entity id="repeat">
-		<trait id="additionalElementData">
-			<value xsi:type="addTagMD:ElementData">
-				<name>repeat</name>
-				<attribute>
-					<name>value</name>
-					<usage>REQUIRED</usage>
-					<description>%repeat_value.description</description>
-				</attribute>
-				<attribute>
-					<name>var</name>
-					<usage>REQUIRED</usage>
-					<description>%repeat_var.description</description>
-				</attribute>
-				<attribute>
-					<name>varStatus</name>
-					<usage>OPTIONAL</usage>
-					<description>%repeat_varStatus.description</description>
-				</attribute>
-				<attribute>
-					<name>offset</name>
-					<usage>OPTIONAL</usage>
-					<description>%repeat_offset.description</description>
-				</attribute>
-				<attribute>
-					<name>size</name>
-					<usage>OPTIONAL</usage>
-					<description>%repeat_size.description</description>
-				</attribute>
-				<attribute>
-					<name>step</name>
-					<usage>OPTIONAL</usage>
-					<description>%repeat_step.description</description>
-				</attribute>
-			</value>
-		</trait>
-		<entity id="offset">
-			<trait id="required" xsi:type="mdt:BooleanType">true</trait>
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.IntegerType
-				</value>
-			</trait>
-		</entity>
-		<entity id="size">
-			<trait id="required" xsi:type="mdt:BooleanType">true</trait>
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.IntegerType
-				</value>
-			</trait>
-		</entity>
-		<entity id="step">
-			<trait id="required" xsi:type="mdt:BooleanType">true</trait>
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.IntegerType
-				</value>
-			</trait>
-		</entity>
-		<entity id="value">
-			<trait id="required" xsi:type="mdt:BooleanType">true</trait>
-
-		</entity>
-		<entity id="var">
-			<trait id="required" xsi:type="mdt:BooleanType">true</trait>
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.ValueBindingType
-				</value>
-			</trait>
-		</entity>
-		<entity id="varStatus">
-			<trait id="required" xsi:type="mdt:BooleanType">true</trait>
-
-		</entity>
-	</entity>
-	<entity id="remove">
-		<trait id="additionalElementData">
-			<value xsi:type="addTagMD:ElementData">
-				<name>remove</name>
-				<attribute>
-					<name>name</name>
-					<usage>OPTIONAL</usage>
-					<description>%name.description</description>
-				</attribute>
-			</value>
-		</trait>
-	</entity>
-	<entity id="name">
-
-	</entity>
-</md:metadatamodel>
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/html.properties b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/html.properties
deleted file mode 100644
index a7562b3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/html.properties
+++ /dev/null
@@ -1,101 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2008 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-A.display-label=Link
-A.description=This element allows the user to navigate the content of the document
-
-BR.display-label=Line Break
-BR.description=This element is used to enforce a line break
-
-INPUT.BUTTON.display-label=Button
-INPUT.BUTTON.description=An INPUT element with TYPE=SUBMIT represents an input option, typically a button, that instructs the user agent to submit the form
-
-INPUT.CHECKBOX.display-label=Checkbox
-INPUT.CHECKBOX.description=An INPUT element with TYPE=CHECKBOX represents a boolean choice. A set of such elements with the same name represents an n-of-many choice field
-
-INPUT.HIDDEN.display-label=Hidden Field
-INPUT.HIDDEN.description=An INPUT element with TYPE=HIDDEN represents a hidden field.The user does not interact with this field; instead, the VALUE attribute specifies the value of the field
-
-INPUT.IMAGE.display-label=Image Button
-INPUT.IMAGE.description=An INPUT element with TYPE=IMAGE specifies an image resource to display, and allows input of two form fields: the x and y coordinate of a pixel chosen from the image
-
-INPUT.PASSWORD.display-label=Password Field
-INPUT.PASSWORD.description=An INPUT element with TYPE=PASSWORD is a text field as above, except that the value is obscured as it is entered
-
-INPUT.RADIO.display-label=Radio Button
-INPUT.RADIO.description=An INPUT element with TYPE=RADIO represents a boolean choice. A set of such elements with the same name represents a 1-of-many choice field
-
-INPUT.TEXT.display-label=Text Field 
-INPUT.TEXT.description=The default vaule of the TYPE attribute is TEXT, indicating a single line text entry field
-
-FORM.display-label=Form
-FORM.description=The FORM element contains a sequence of input elements, along with document structuring elements
-
-HR.display-label=Horizontal Rule
-HR.description=The HR element is a divider between sections of text; typically a full width horizontal rule or equivalent graphic
-
-IMG.display-label=Image
-IMG.description=The IMG element refers to an image or icon via a hyperlink
-
-LINK.display-label=Stylesheet Link
-LINK.description=This element will import a stylesheet into the page
-
-SELECT.display-label=Select
-SELECT.description=The SELECT element constrains the form field to an enumerated list of values
-
-TABLE.display-label=Table
-TABLE.description=HTML Tables are contained within a TABLE element. The TABLE element denotes the range of the table, and uses attribute to define properties of it
-
-TEXTAREA.display-label=Text Area
-TEXTAREA.description=The TEXTAREA element represents a multi-line text field
-
-DIV.display-label=Div
-DIV.description=The DIV tag defines a section or division that is often used to group and format block-elements
-
-any.dir.displayed-values.ltr=ltr (left-to-right)
-any.dir.displayed-values.rtl=rtl (right-to-left)
-
-any.frame.displayed-values.none=none (no sides, default value)
-any.frame.displayed-values.above=above (top side only)
-any.frame.displayed-values.below=below (bottom side only)
-any.frame.displayed-values.hsides=hsides (top and bottom sides only)
-any.frame.displayed-values.vsides=vsides (right and left sides only)
-any.frame.displayed-values.lhs=lhs (left hand side only)
-any.frame.displayed-values.rhs=rhs (right hand side only)
-any.frame.displayed-values.box=box (all four sides)
-any.frame.displayed-values.border=border (all four sides)
-
-any.rules.displayed-values.none=none (no rules, default value)
-any.rules.displayed-values.groups=groups (between row groups)
-any.rules.displayed-values.rows=rows (between rows only)
-any.rules.displayed-values.cols=cols (between columns only)
-any.rules.displayed-values.all=all (between all rows and columns)
-
-any.shape.displayed-values.default=default (entire region)
-any.shape.displayed-values.rect=rect (rectangular region)
-any.shape.displayed-values.circle=circle (circular region)
-any.shape.displayed-values.poly=poly (polygonal region)
-
-#categories
-property.category.event=Event
-property.category.language=Language
-property.category.html=HTML
-property.category.css=CSS
-property.category.general=General
-property.category.accessibility=Accessibility
-property.category.visualProperty=VisualProperty
-property.category.browser.specific=Browser Specific
-property.category.core=Core
-property.category.content=Content
-property.category.data.binding=Data Binding
-property.category.dynamic=Dynamic
-property.category.file=File
-property.category.image=Image
-
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/html.xml b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/html.xml
deleted file mode 100644
index 8074033..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/html.xml
+++ /dev/null
@@ -1,786 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<md:metadatamodel 
-	xmlns:md="http://org.eclipse.jst.jsf.common.metadata/metadata.ecore" 
-	xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" 
-	xmlns:mdt="http://org.eclipse.jst.jsf.common.metadata/metadataTraitTypes.ecore" 
-	xmlns:pi="http://org.eclipse.jsf.pagedesigner/paletteInfos.ecore" 
-	xmlns:qe="http://org.eclipse.jsf.pagedesigner/quickEditTabSections.ecore" 
-	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
-	id="HTML" 
-	type="tagFile">
-	<trait id="paletteInfos">
-		<value xsi:type="pi:PaletteInfos">
-			<item id="BR"/>
-			<item id="INPUT.TEXT" tag="INPUT"/>
-			<item id="INPUT.BUTTON" tag="INPUT">
-				<display-label>%INPUT.BUTTON.display-label</display-label>
-				<description>%INPUT.BUTTON.description</description>
-				<small-icon>small/HTML_INPUT_BUTTON.gif</small-icon>
-				<large-icon>large/HTML_INPUT_BUTTON.gif</large-icon>
-				<tag-create>
-					<attribute id="type" value="submit"/>
-				</tag-create>
-			</item>
-			<item id="INPUT.CHECKBOX" tag="INPUT">
-				<display-label>%INPUT.CHECKBOX.display-label</display-label>
-				<description>%INPUT.CHECKBOX.description</description>
-				<small-icon>small/HTML_INPUT_CHECKBOX.gif</small-icon>
-				<large-icon>large/HTML_INPUT_CHECKBOX.gif</large-icon>
-				<tag-create>
-					<attribute id="type" value="checkbox"/>
-				</tag-create>				
-			</item>
-			<item id="FORM"/>		
-			<item id="INPUT.HIDDEN" tag="INPUT">
-				<display-label>%INPUT.HIDDEN.display-label</display-label>
-				<description>%INPUT.HIDDEN.description</description>
-				<small-icon>small/HTML_INPUT_HIDDEN.gif</small-icon>
-				<large-icon>large/HTML_INPUT_HIDDEN.gif</large-icon>
-				<tag-create>
-					<attribute id="type" value="hidden"/>
-				</tag-create>	
-			</item>
-			<item id="HR"/>
-			<item id="IMG"/>
-			<item id="INPUT.IMAGE" tag="INPUT">
-				<display-label>%INPUT.IMAGE.display-label</display-label>
-				<description>%INPUT.IMAGE.description</description>
-				<small-icon>small/HTML_INPUT_IMAGE.gif</small-icon>
-				<large-icon>large/HTML_INPUT_IMAGE.gif</large-icon>
-				<tag-create>
-					<attribute id="type" value="image"/>
-				</tag-create>					
-			</item>
-			<item id="A"/>			
-			<item id="INPUT.PASSWORD" tag="INPUT">
-				<display-label>%INPUT.PASSWORD.display-label</display-label>
-				<description>%INPUT.PASSWORD.description</description>
-				<small-icon>small/HTML_INPUT_PASSWORD.gif</small-icon>
-				<large-icon>large/HTML_INPUT_PASSWORD.gif</large-icon>
-				<tag-create>
-					<attribute id="type" value="password"/>
-				</tag-create>					
-			</item>
-			<item id="INPUT.RADIO" tag="INPUT">
-				<display-label>%INPUT.RADIO.display-label</display-label>
-				<description>%INPUT.RADIO.description</description>
-				<small-icon>small/HTML_INPUT_RADIO.gif</small-icon>
-				<large-icon>large/HTML_INPUT_RADIO.gif</large-icon>
-				<tag-create>
-					<attribute id="type" value="radio"/>
-				</tag-create>					
-			</item>			
-			<item id="SELECT"/>
-			<item id="TABLE"/>
-			<item id="TEXTAREA"/>
-			<item id="DIV"/>
-			<item id="LINK">							
-				<tag-create>
-					<attribute id="href" value=""/>
-					<attribute id="rel" value="Stylesheet"/>
-					<attribute id="type" value="text/css"/>
-				</tag-create>
-			</item>
-		</value>
-	</trait>
-
-	<trait id="images-base-path">
-		<value xsi:type="mdt:StringValue">$nl$/icons/palette/HTML</value>
-	</trait>
-
-	<trait id="display-label">
-		<value xsi:type="mdt:StringValue">HTML 4.0</value>
-	</trait>
-	
-	<entity id="A">
-		<include-entity-group id="common-core-attributes"/>
-		<include-entity-group id="common-language-attributes"/>
-		<include-entity-group id="common-event-attributes"/>
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%A.display-label</value>
-		</trait>
-		<trait id="description">
-			<value xsi:type="mdt:StringValue">%A.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/HTML_A.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/HTML_A.gif</value>
-		</trait>
-	</entity>
-	<entity id="BODY">
-		<include-entity-group id="common-core-attributes"/>
-		<include-entity-group id="common-language-attributes"/>
-		<include-entity-group id="common-event-attributes"/>	
-		<include-entity-group id="common-html-attributes"/>	
-	</entity>		
-	<entity id="BR">
-		<include-entity-group id="common-core-attributes"/>
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%BR.display-label</value>
-		</trait>
-		<trait id="description">
-			<value xsi:type="mdt:StringValue">%BR.description</value>
-		</trait>		
-		<trait id="expert">
-			<value xsi:type="mdt:BooleanValue">true</value>
-		</trait>
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/HTML_BR.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/HTML_BR.gif</value>
-		</trait>
-	</entity>
-	<entity id="INPUT">
-		<include-entity-group id="common-core-attributes"/>
-		<include-entity-group id="common-language-attributes"/>
-		<include-entity-group id="common-event-attributes"/>	
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%INPUT.TEXT.display-label</value>
-		</trait>					
-		<trait id="description">
-			<value xsi:type="mdt:StringValue">%INPUT.TEXT.description</value>
-		</trait>
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/HTML_INPUT_TEXT.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/HTML_INPUT_TEXT.gif</value>
-		</trait>
-		<trait id="requires-html-form">
-			<value xsi:type="mdt:BooleanValue">true</value>
-		</trait>			
-	</entity>
-	<entity id="FORM">
-		<include-entity-group id="common-core-attributes"/>
-		<include-entity-group id="common-language-attributes"/>
-		<include-entity-group id="common-event-attributes"/>	
-		<include-entity-group id="form-event-attributes"/>
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%FORM.display-label</value>
-		</trait>					
-		<trait id="description">
-			<value xsi:type="mdt:StringValue">%FORM.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/HTML_FORM.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/HTML_FORM.gif</value>
-		</trait>
-	</entity>
-	<entity id="HEAD">
-		<include-entity-group id="common-language-attributes"/>
-	</entity>	
-	<entity id="HR">
-		<include-entity-group id="common-core-attributes"/>
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%HR.display-label</value>
-		</trait>					
-		<trait id="description">
-			<value xsi:type="mdt:StringValue">%HR.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/HTML_HR.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/HTML_HR.gif</value>
-		</trait>
-	</entity>	
-	<entity id="HTML">
-		<include-entity-group id="common-language-attributes"/>
-	</entity>	
-	<entity id="IMG">
-		<include-entity-group id="common-core-attributes"/>
-		<include-entity-group id="common-language-attributes"/>
-		<include-entity-group id="common-event-attributes"/>	
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%IMG.display-label</value>
-		</trait>					
-		<trait id="description">
-			<value xsi:type="mdt:StringValue">%IMG.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/HTML_IMG.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/HTML_IMG.gif</value>
-		</trait>
-	</entity>	
-	<entity id="LINK">
-		<include-entity-group id="common-core-attributes"/>
-		<include-entity-group id="common-html-attributes"/>
-		<include-entity-group id="common-language-attributes"/>
-		<include-entity-group id="common-event-attributes"/>	
-		<trait id="display-label">	
-			<value xsi:type="mdt:StringValue">%LINK.display-label</value>
-		</trait>	
-		<trait id="description">
-			<value xsi:type="mdt:StringValue">%LINK.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/HTML_LINK.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/HTML_LINK.gif</value>
-		</trait>	
-		<entity id="type">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.LinkType</value>
-			</trait>
-		</entity>
-
-	</entity>
-	<entity id="META">
-		<include-entity-group id="common-language-attributes"/>
-		<entity id="content">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.ContentType</value>
-			</trait>
-		</entity>
-	</entity>
-	<entity id="OBJECT">
-		<include-entity-group id="common-core-attributes"/>
-		<include-entity-group id="common-language-attributes"/>
-		<include-entity-group id="common-event-attributes"/>
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/HTML_OBJECT.gif</value>
-		</trait>
-	</entity>			
-	<entity id="SELECT">
-		<include-entity-group id="common-core-attributes"/>
-		<include-entity-group id="common-language-attributes"/>
-		<include-entity-group id="common-event-attributes"/>	
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%SELECT.display-label</value>
-		</trait>					
-		<trait id="description">
-			<value xsi:type="mdt:StringValue">%SELECT.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/HTML_SELECT.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/HTML_SELECT.gif</value>
-		</trait>
-		<trait id="requires-html-form">
-			<value xsi:type="mdt:BooleanValue">true</value>
-		</trait>			
-	</entity>		
-	<entity id="TABLE">
-		<include-entity-group id="common-core-attributes"/>
-		<include-entity-group id="common-language-attributes"/>
-		<include-entity-group id="common-event-attributes"/>	
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%TABLE.display-label</value>
-		</trait>					
-		<trait id="description">
-			<value xsi:type="mdt:StringValue">%TABLE.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/HTML_TABLE.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/HTML_TABLE.gif</value>
-		</trait>
-	</entity>
-	<entity id="TEXTAREA">
-		<include-entity-group id="common-core-attributes"/>
-		<include-entity-group id="common-language-attributes"/>
-		<include-entity-group id="common-event-attributes"/>	
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%TEXTAREA.display-label</value>
-		</trait>					
-		<trait id="description">
-			<value xsi:type="mdt:StringValue">%TEXTAREA.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/HTML_TEXTAREA.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/HTML_TEXTAREA.gif</value>
-		</trait>
-		<trait id="requires-html-form">
-			<value xsi:type="mdt:BooleanValue">true</value>
-		</trait>
-	</entity>	
-	<entity id="TITLE">
-		<include-entity-group id="common-language-attributes"/>
-	</entity>		
-	<entity id="DIV">
-		<include-entity-group id="common-core-attributes"/>
-		<include-entity-group id="common-language-attributes"/>
-		<include-entity-group id="common-event-attributes"/>
-		<entity id="align">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-			</trait>
-			<trait id="valid-values">
-				<value xsi:type="mdt:ListOfValues">
-					<item>right</item>
-					<item>char</item>
-					<item>left</item>
-					<item>center</item>
-					<item>justify</item>					
-				</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.html</value>
-			</trait>
-		</entity>
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%DIV.display-label</value>
-		</trait>
-		<trait id="description">
-			<value xsi:type="mdt:StringValue">%DIV.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/HTML_DIV.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/HTML_DIV.gif</value>
-		</trait>		
-	</entity>	
-	<entityGroup id="common-html-attributes">
-		<entity id="align">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-			</trait>
-			<trait id="valid-values">
-				<value xsi:type="mdt:ListOfValues">
-					<item>right</item>
-					<item>char</item>
-					<item>left</item>
-					<item>center</item>
-					<item>justify</item>					
-				</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.html</value>
-			</trait>
-		</entity>
-	
-		<entity id="alt">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.html</value>
-			</trait>			
-		</entity>
-		<entity id="src">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.html</value>
-			</trait>			
-		</entity>
-		<entity id="accesskey">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.CharacterType</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.html</value>
-			</trait>			
-		</entity>
-		<entity id="accept">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.html</value>
-			</trait>			
-		</entity>
-		<entity id="accept-charset">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.html</value>
-			</trait>			
-		</entity>
-		<entity id="border">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-			</trait>
-			<trait id="valid-minimum"><value xsi:type="mdt:StringValue">0</value></trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.html</value>
-			</trait>			
-		</entity>
-		<entity id="disabled">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.html</value>
-			</trait>			
-		</entity>
-		<entity id="height">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.LengthType</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.html</value>
-			</trait>			
-		</entity>		
-		<entity id="ismap">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.html</value>
-			</trait>			
-		</entity>
-		<entity id="longdesc">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.URIType</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.html</value>
-			</trait>			
-		</entity>	
-		<entity id="maxlength">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-			</trait>
-			<trait id="valid-minimum"><value xsi:type="mdt:StringValue">0</value></trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.html</value>
-			</trait>			
-		</entity>
-		<entity id="readonly">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-			</trait>
-		</entity>
-		<entity id="rel">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.LinkType</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.html</value>
-			</trait>			
-		</entity>
-		<entity id="rev">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.LinkType</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.html</value>
-			</trait>			
-		</entity>	
-		<entity id="rows">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-			</trait>
-			<trait id="valid-minimum"><value xsi:type="mdt:StringValue">0</value></trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.html</value>
-			</trait>			
-		</entity>
-		<entity id="shape">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-			</trait>
-			<trait id="valid-values">
-				<value xsi:type="mdt:ListOfValues">
-					<item>default</item>
-					<item>rect</item>
-					<item>circle</item>
-					<item>poly</item>	
-				</value>			
-			</trait>
-			<trait id="displayed-values">
-				<value xsi:type="mdt:ListOfValues">
-					<item>%any.shape.displayed-values.default</item>
-					<item>%any.shape.displayed-values.rect</item>
-					<item>%any.shape.displayed-values.circle</item>
-					<item>%any.shape.displayed-values.poly</item>		
-				</value>		
-			</trait>
-			<trait id="default-value">
-				<value xsi:type="mdt:StringValue">default</value>
-			</trait>		
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.html</value>
-			</trait>			
-		</entity>
-		<entity id="size">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-			</trait>
-			<trait id="valid-minimum"><value xsi:type="mdt:StringValue">0</value></trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.html</value>
-			</trait>			
-		</entity>
-		<entity id="tabindex">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-			</trait>
-			<trait id="valid-minimum"><value xsi:type="mdt:StringValue">0</value></trait>
-			<trait id="valid-maximum"><value xsi:type="mdt:StringValue">32767</value></trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.html</value>
-			</trait>			
-		</entity>
-		<entity id="target">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-			</trait>
-			<trait id="valid-values">
-				<value xsi:type="mdt:ListOfValues">
-					<item>_self</item>
-					<item>_blank</item>
-					<item>_parent</item>
-					<item>_top</item>				
-				</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.html</value>
-			</trait>			
-		</entity>
-		<entity id="type">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.html</value>
-			</trait>			
-		</entity>	
-		<entity id="usemap">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.html</value>
-			</trait>			
-		</entity>		
-		<entity id="valign">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-			</trait>
-			<trait id="valid-values">
-				<value xsi:type="mdt:ListOfValues">
-					<item>middle</item>
-					<item>top</item>
-					<item>baseline</item>
-					<item>bottom</item>				
-				</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.html</value>
-			</trait>
-		</entity>			
-		<entity id="width">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.LengthType</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.html</value>
-			</trait>			
-		</entity>
-							
-	</entityGroup>
-	<entityGroup id="common-core-attributes">
-		<entity id="id">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.core</value>
-			</trait>			
-		</entity>
-		<entity id="class">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.CSSClassType</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.core</value>
-			</trait>			
-		</entity>
-		<entity id="style">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.CSSStyleType</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.core</value>
-			</trait>			
-		</entity>
-		<entity id="title">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.core</value>
-			</trait>			
-		</entity>		
-	</entityGroup>
-	<entityGroup id="common-event-attributes"> 
-		<entity id="onclick">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.ScriptType</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.event</value>
-			</trait>			
-		</entity>
-		<entity id="ondblclick">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.ScriptType</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.event</value>
-			</trait>			
-		</entity>
-		<entity id="onmousedown">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.ScriptType</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.event</value>
-			</trait>			
-		</entity>
-		<entity id="onmouseup">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.ScriptType</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.event</value>
-			</trait>			
-		</entity>
-		<entity id="onmouseover">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.ScriptType</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.event</value>
-			</trait>			
-		</entity>
-		<entity id="onmousemove">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.ScriptType</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.event</value>
-			</trait>			
-		</entity>
-		<entity id="onmouseout">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.ScriptType</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.event</value>
-			</trait>			
-		</entity>
-		<entity id="onkeypress">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.ScriptType</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.event</value>
-			</trait>			
-		</entity>
-		<entity id="onkeydown">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.ScriptType</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.event</value>
-			</trait>			
-		</entity>
-		<entity id="onkeyup">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.ScriptType</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.event</value>
-			</trait>			
-		</entity>
-		<!--almost common events - should be refactored-->
-		<entity id="onblur">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.ScriptType</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.event</value>
-			</trait>			
-		</entity>
-		<entity id="onchange">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.ScriptType</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.event</value>
-			</trait>			
-		</entity>
-		<entity id="onfocus">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.ScriptType</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.event</value>
-			</trait>			
-		</entity>
-		<entity id="onselect">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.ScriptType</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.event</value>
-			</trait>			
-		</entity>					
-	</entityGroup>
-	<entityGroup id="form-event-attributes">
-		<entity id="onsubmit">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.ScriptType</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.event</value>
-			</trait>			
-		</entity>	
-		<entity id="onreset">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.ScriptType</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.event</value>
-			</trait>			
-		</entity>			
-	</entityGroup>
-	<entityGroup id="common-language-attributes">
-		<entity id="dir">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-			</trait>
-			<trait id="valid-values">
-				<value xsi:type="mdt:ListOfValues">
-					<item>ltr</item>
-					<item>rtl</item>
-				</value>
-			</trait>
-			<trait id="displayed-values">
-				<value xsi:type="mdt:ListOfValues">
-					<item>%any.dir.displayed-values.ltr</item>
-					<item>%any.dir.displayed-values.rtl</item>
-				</value>
-			</trait>	
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.language</value>
-			</trait>					
-		</entity>
-		<entity id="lang">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.LanguageCodeType</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.language</value>
-			</trait>					
-		</entity>		
-	</entityGroup>	
-</md:metadatamodel>
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/jsf_core.properties b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/jsf_core.properties
deleted file mode 100644
index fb784d4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/jsf_core.properties
+++ /dev/null
@@ -1 +0,0 @@
-property.category.jsf=JSF
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/jsf_core.xml b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/jsf_core.xml
deleted file mode 100644
index 091fc91..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/jsf_core.xml
+++ /dev/null
@@ -1,961 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<md:metadatamodel 
-	xmlns:md="http://org.eclipse.jst.jsf.common.metadata/metadata.ecore" 
-	xmlns:cnst="http://org.eclipse.jst.jsf.core/constraints.ecore" 
-	xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" 
-	xmlns:mdt="http://org.eclipse.jst.jsf.common.metadata/metadataTraitTypes.ecore" 
-	xmlns:qe="http://org.eclipse.jsf.pagedesigner/QuickEditTabSections.ecore" 
-	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
-	id="http://java.sun.com/jsf/core" 
-	type="tagFile">
-
-	<entity id="actionListener" type="tag">
-		<include-entity-group id="common-core-attributes"/>
-	    <trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="type"/>
-			</value>
-		</trait>
-		<entity id="type">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.JavaClassType
-				</value>
-			</trait>
-			<trait id="valid-interfaces">
-				<value xsi:type="mdt:StringValue">javax.faces.event.ActionListener</value>
-			</trait>		
-		</entity>
-	</entity>
-	<entity id="ajax" type="tag">
-		<entity id="disabled">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.BooleanType
-				</value>
-			</trait>
-		</entity>
-		<entity id="event">
-	
-		</entity>
-		<entity id="execute">
-		
-		</entity>
-		<entity id="immediate">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>				
-		</entity>
-		<entity id="listener">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.MethodBindingType</value>
-			</trait>
-			<trait id="runtime-return-type">
-				<value xsi:type="mdt:StringValue">void</value>
-			</trait>			
-			<trait id="runtime-param-types">
-				<value xsi:type="mdt:StringValue">javax.faces.event.AjaxBehaviorEvent</value>
-			</trait>	
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>
-		</entity>
-		<entity id="onevent">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.StringType
-				</value>
-			</trait>	
-		</entity>
-		<entity id="onerror">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.StringType
-				</value>
-			</trait>			
-		</entity>
-		<entity id="render">
-		
-		</entity>
-		
-	</entity>	
-	<entity id="attribute" type="tag">
-		<include-entity-group id="common-core-attributes"/>
-				<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="name"/>
-				<section id="value"/>
-			</value>
-		</trait>
-	</entity>	
-	<entity id="convertDateTime" type="tag">
-		<include-entity-group id="common-core-attributes"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="section.general.convertDateTime" type="SECTION"/>
-			</value>
-		</trait>	
-		<entity id="dateStyle">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.StringType
-				</value>
-			</trait>
-			<trait id="valid-values">
-				<value xsi:type="mdt:ListOfValues">
-					<item>default</item>
-					<item>short</item>
-					<item>medium</item>
-					<item>long</item>
-					<item>full</item>
-				</value>
-			</trait>
-			<trait id="default-value">
-				<value xsi:type="mdt:StringValue">default</value>
-			</trait>
-		</entity>
-		<entity id="timeStyle">			
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.StringType
-				</value>
-			</trait>
-			<trait id="valid-values">
-				<value xsi:type="mdt:ListOfValues">
-					<item>default</item>
-					<item>short</item>
-					<item>medium</item>
-					<item>long</item>
-					<item>full</item>
-				</value>
-			</trait>
-			<trait id="default-value">
-				<value xsi:type="mdt:StringValue">default</value>
-			</trait>
-		</entity>
-		<entity id="type">			
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.StringType
-				</value>
-			</trait>
-			<trait id="valid-values">
-				<value xsi:type="mdt:ListOfValues">
-					<item>date</item>
-					<item>time</item>
-					<item>both</item>
-				</value>
-			</trait>
-			<trait id="default-value">
-				<value xsi:type="mdt:StringValue">both</value>
-			</trait>
-		</entity>
-		<entity id="pattern">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.DateTimePatternType
-				</value>
-			</trait>
-		</entity>
-		<entity id="locale">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.LocaleType
-				</value>
-			</trait>
-		</entity>		
-	</entity>
-	<entity id="convertNumber" type="tag">
-		<include-entity-group id="common-core-attributes"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="section.general.convertNumber" type="SECTION"/>
-			</value>
-		</trait>		
-		<entity id="groupingUsed">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.BooleanType
-				</value>
-			</trait>
-			<trait id="default-value">
-				<value xsi:type="mdt:BooleanValue">true</value>
-			</trait>
-		</entity>
-		<entity id="integerOnly">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.BooleanType
-				</value>
-			</trait>
-			<trait id="default-value">
-				<value xsi:type="mdt:BooleanValue">false</value>
-			</trait>
-		</entity>
-		<entity id="maxFractionDigits">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.IntegerType
-				</value>
-			</trait>
-			<trait id="valid-minimum"><value xsi:type="mdt:StringValue">0</value></trait>
-		</entity>
-		<entity id="maxIntegerDigits">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.IntegerType
-				</value>
-			</trait>
-			<trait id="valid-minimum"><value xsi:type="mdt:StringValue">0</value></trait>
-		</entity>
-		<entity id="minFractionDigits">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.IntegerType
-				</value>
-			</trait>
-			<trait id="valid-minimum"><value xsi:type="mdt:StringValue">0</value></trait>
-		</entity>
-		<entity id="minIntegerDigits">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.IntegerType
-				</value>
-			</trait>
-			<trait id="valid-minimum"><value xsi:type="mdt:StringValue">0</value></trait>
-		</entity>
-		<entity id="type">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.StringType
-				</value>
-			</trait>
-			<trait id="valid-values">
-				<value xsi:type="mdt:ListOfValues">
-					<item>number</item>
-					<item>currency</item>
-					<item>percent</item>
-				</value>
-			</trait>
-			<trait id="default-value">
-				<value xsi:type="mdt:StringValue">number</value>
-			</trait>
-		</entity>
-		<entity id="locale">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.LocaleType
-				</value>
-			</trait>
-		</entity>
-		<entity id="pattern">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.NumberPatternType
-				</value>
-			</trait>
-		</entity>	
-		<entity id="currencyCode">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.CurrencyCodeType
-				</value>
-			</trait>
-		</entity>	
-	</entity>
-	<entity id="converter" type="tag">
-		<include-entity-group id="common-core-attributes"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="converterId"/>
-			</value>
-		</trait>		
-		<entity id="converterId">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.FacesConfigConverterIDType
-				</value>
-			</trait>
-			<trait id="config-type">
-				<value xsi:type="mdt:StringValue">javax.faces.convert.Converter</value>
-			</trait>
-		</entity>
-	</entity>
-	<entity id="event" type="tag">
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="name"/>
-				<section id="listener"/>
-			</value>
-		</trait>
-		<entity id="name">
-			<trait id="required">
-				<value xsi:type="mdt:BooleanValue">true</value>
-			</trait>
-		</entity>
-		<entity id="listener">
-			<trait id="required">
-				<value xsi:type="mdt:BooleanValue">true</value>
-			</trait>
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.MethodBindingType</value>
-			</trait>
-			<trait id="runtime-return-type">
-				<value xsi:type="mdt:StringValue">void</value>
-			</trait>			
-			<trait id="runtime-param-types">
-				<value xsi:type="mdt:StringValue">javax.faces.event.ComponentSystemEvent</value>
-			</trait>	
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>		
-		</entity>
-	</entity>
-	<entity id="facet" type="tag">
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="name"/>
-			</value>
-		</trait>
-	</entity>
-	<entity id="loadBundle" type="tag">
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="basename"/>
-				<section id="var"/>
-			</value>
-		</trait>
-		<trait id="containment-constraint">
-			<value xsi:type="cnst:ContainsTagConstraint">
-				<set-generator>
-					<algorithm>xpath</algorithm>
-					<expression>ancestor::*</expression>
-				</set-generator>
-				<satisfies-set>
-						<tagId>
-							<uri>http://java.sun.com/jsf/core</uri>
-							<name>view</name>
-						</tagId>
-				</satisfies-set>
-			</value>
-		</trait>
-		<entity id="var">
-			<trait id="contributes-value-binding">
-				<value xsi:type="mdt:BooleanValue">true</value>
-			</trait>
-			<trait id="value-binding-scope">
-				<value xsi:type="mdt:StringValue">request</value>
-			</trait>
-			<trait id="value-binding-symbol-factory">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.designtime.core.loadBundle</value>
-			</trait>
-		</entity>
-		<entity id="basename">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.ResourceBundleType
-				</value>
-			</trait>
-		</entity>
-	</entity>
-	<entity id="metadata" type="tag">
-		<trait id="containment-constraint">
-			<value xsi:type="cnst:ContainsTagConstraint">
-				<set-generator>
-					<algorithm>xpath</algorithm>
-					<expression>ancestor::*</expression>
-				</set-generator>
-				<satisfies-set>
-						<tagId>
-							<uri>http://java.sun.com/jsf/core</uri>
-							<name>head</name>
-						</tagId>
-				</satisfies-set>
-			</value>
-		</trait>	
-	</entity>
-	<entity id="param" type="tag">
-		<include-entity-group id="common-core-attributes"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="name"/>
-				<section id="value"/>
-				<section id="binding"/>
-			</value>
-		</trait>	
-	</entity>
-	<entity id="selectItem" type="tag">
-		<include-entity-group id="common-core-attributes"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="itemLabel"/>
-				<section id="itemValue"/>
-			</value>
-		</trait>
-		<entity id="itemDescription">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.StringType
-				</value>
-			</trait>
-		</entity>		
-		<entity id="itemDisabled">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.BooleanType
-				</value>
-			</trait>
-			<trait id="default-value">
-				<value xsi:type="mdt:BooleanValue">false</value>
-			</trait>
-		</entity>
-		<entity id="itemLabel">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.StringType
-				</value>
-			</trait>
-		</entity>
-		<entity id="escape">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.BooleanType
-				</value>
-			</trait>
-			<trait id="default-value">
-				<value xsi:type="mdt:BooleanValue">true</value>
-			</trait>			
-		</entity>
-		<entity id="itemValue">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.ValueBindingType
-				</value>
-			</trait>
-			<trait id="runtime-return-type">
-				<value xsi:type="mdt:StringValue">java.lang.Object</value>
-			</trait>				
-		</entity>				
-		<entity id="value">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.ValueBindingType
-				</value>
-			</trait>
-			<trait id="runtime-return-type">
-				<value xsi:type="mdt:StringValue">javax.faces.model.SelectItem</value>
-			</trait>				
-		</entity>
-		<entity id="noSelectionOption">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.BooleanType
-				</value>
-			</trait>
-			<trait id="default-value">
-				<value xsi:type="mdt:BooleanValue">false</value>
-			</trait>				
-		</entity>		
-	</entity>
-	<entity id="selectItems" type="tag">	
-		<include-entity-group id="common-core-attributes"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="value"/>
-				<section id="binding"/>
-			</value>
-		</trait>	
-		<entity id="var">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.StringType
-				</value>
-			</trait>
-		</entity>	
-		<entity id="itemValue">
-		</entity>
-		<entity id="itemLabel">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.StringType
-				</value>
-			</trait>		
-		</entity>	
-		<entity id="itemDescription">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.StringType
-				</value>
-			</trait>		
-		</entity>	
-		<entity id="itemDisabled">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.BooleanType
-				</value>
-			</trait>		
-		</entity>	
-		<entity id="itemLabelEscaped">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.BooleanType
-				</value>
-			</trait>		
-		</entity>			
-	</entity>
-	<entity id="subview" type="tag">
-		<include-entity-group id="common-core-attributes"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-			</value>
-		</trait>			
-		<entity id="rendered">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.BooleanType
-				</value>
-			</trait>
-		</entity>
-	</entity>
-	<entity id="validateBean" type="tag">
-		<entity id="validationGroups">
-
-		</entity>
-		<entity id="disabled">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.BooleanType
-				</value>
-			</trait>
-		</entity>	
-		<entity id="binding">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.ValueBindingType
-				</value>
-			</trait>
-			<trait id="runtime-return-type">
-				<value xsi:type="mdt:StringValue">javax.faces.validator.BeanValidator</value>
-			</trait>				
-		</entity>
-		<entity id="for">
-
-		</entity>					
-	</entity>
-	<entity id="validateDoubleRange" type="tag">
-		<include-entity-group id="common-core-attributes"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="minimum"/>
-				<section id="maximum"/>
-			</value>
-		</trait>			
-		<entity id="maximum">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.DoubleType
-				</value>
-			</trait>
-		</entity>
-		<entity id="minimum">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.DoubleType
-				</value>
-			</trait>
-		</entity>
-		<entity id="disabled">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.BooleanType
-				</value>
-			</trait>
-		</entity>	
-		<entity id="binding">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.ValueBindingType
-				</value>
-			</trait>
-			<trait id="runtime-return-type">
-				<value xsi:type="mdt:StringValue">javax.faces.validator.DoubleRangeValidator</value>
-			</trait>				
-		</entity>
-		<entity id="for">
-
-		</entity>			
-	</entity>
-	<entity id="validateLength" type="tag">
-		<include-entity-group id="common-core-attributes"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="minimum"/>
-				<section id="maximum"/>
-			</value>
-		</trait>			
-		<entity id="maximum">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.IntegerType
-				</value>
-			</trait>
-			<trait id="valid-minimum"><value xsi:type="mdt:StringValue">0</value></trait>			
-		</entity>
-		<entity id="minimum">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.IntegerType
-				</value>
-			</trait>
-			<trait id="valid-minimum"><value xsi:type="mdt:StringValue">0</value></trait>	
-		</entity>
-		<entity id="disabled">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.BooleanType
-				</value>
-			</trait>
-		</entity>	
-		<entity id="binding">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.ValueBindingType
-				</value>
-			</trait>
-			<trait id="runtime-return-type">
-				<value xsi:type="mdt:StringValue">javax.faces.validator.LengthValidator</value>
-			</trait>				
-		</entity>
-		<entity id="for">
-
-		</entity>				
-	</entity>
-	<entity id="validateLongRange" type="tag">
-		<include-entity-group id="common-core-attributes"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="minimum"/>
-				<section id="maximum"/>
-			</value>
-		</trait>		
-		<entity id="maximum">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.LongType
-				</value>
-			</trait>
-		</entity>
-		<entity id="minimum">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.LongType
-				</value>
-			</trait>
-		</entity>
-		<entity id="disabled">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.BooleanType
-				</value>
-			</trait>
-		</entity>	
-		<entity id="binding">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.ValueBindingType
-				</value>
-			</trait>
-			<trait id="runtime-return-type">
-				<value xsi:type="mdt:StringValue">javax.faces.validator.LongRangeValidator</value>
-			</trait>				
-		</entity>
-		<entity id="for">
-
-		</entity>		
-	</entity>
-	<entity id="validateRegex" type="tag">
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">				
-				<section id="pattern"/>
-			</value>
-		</trait>
-		<entity id="pattern">
-
-		</entity>
-		<entity id="disabled">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.BooleanType
-				</value>
-			</trait>
-		</entity>	
-		<entity id="binding">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.ValueBindingType
-				</value>
-			</trait>
-			<trait id="runtime-return-type">
-				<value xsi:type="mdt:StringValue">javax.faces.validator.RegexValidator</value>
-			</trait>				
-		</entity>
-		<entity id="for">
-
-		</entity>					
-	</entity>	
-	<entity id="validateRequired" type="tag">
-		<entity id="disabled">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.BooleanType
-				</value>
-			</trait>
-		</entity>	
-		<entity id="binding">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.ValueBindingType
-				</value>
-			</trait>
-			<trait id="runtime-return-type">
-				<value xsi:type="mdt:StringValue">javax.faces.validator.RequiredValidator</value>
-			</trait>				
-		</entity>
-		<entity id="for">
-
-		</entity>					
-	</entity>		
-	<entity id="validator" type="tag">
-		<include-entity-group id="common-core-attributes"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="validatorId"/>
-			</value>
-		</trait>		
-		<entity id="validatorId">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.FacesConfigValidatorIDType
-				</value>
-			</trait>
-			<trait id="config-type">
-				<value xsi:type="mdt:StringValue">javax.faces.validator.Validator</value>
-			</trait>
-		</entity>
-		<entity id="disabled">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.BooleanType
-				</value>
-			</trait>
-		</entity>	
-		<entity id="binding">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.ValueBindingType
-				</value>
-			</trait>
-			<trait id="runtime-return-type">
-				<value xsi:type="mdt:StringValue">javax.faces.validator.Validator</value>
-			</trait>				
-		</entity>
-		<entity id="for">
-
-		</entity>		
-	</entity>
-	<entity id="valueChangeListener" type="tag">
-		<include-entity-group id="common-core-attributes"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="type"/>
-			</value>
-		</trait>		
-		<entity id="type">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.JavaClassType
-				</value>
-			</trait>
-			<trait id="valid-interfaces">
-				<value xsi:type="mdt:StringValue">javax.faces.event.ValueChangeListener</value>
-			</trait>			
-		</entity>
-	</entity>
-	<entity id="verbatim" type="tag">
-		<include-entity-group id="common-core-attributes"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="escape"/>
-			</value>
-		</trait>		
-		<entity id="escape">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.BooleanType
-				</value>
-			</trait>
-			<trait id="default-value">
-				<value xsi:type="mdt:BooleanValue">false</value>
-			</trait>
-		</entity>
-	</entity>
-	<entity id="view" type="tag">
-		<include-entity-group id="common-core-attributes"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="locale"/>
-			</value>
-		</trait>		
-		<entity id="locale">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.LocaleType	</value>
-			</trait>
-		</entity>	
-	</entity>
-	<entity id="viewParam" type="tag">
-		<include-entity-group id="common-core-attributes"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="for"/>
-			</value>
-		</trait>
-		<trait id="containment-constraint">
-			<value xsi:type="cnst:ContainsTagConstraint">
-				<set-generator>
-					<algorithm>xpath</algorithm>
-					<expression>ancestor::*</expression>
-				</set-generator>
-				<satisfies-set>
-						<tagId>
-							<uri>http://java.sun.com/jsf/core</uri>
-							<name>metadata</name>
-						</tagId>
-				</satisfies-set>
-			</value>
-		</trait>
-		<entity id="converter">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.FacesConfigConverterIDType
-				</value>
-			</trait>
-			<trait id="config-type">
-				<value xsi:type="mdt:StringValue">javax.faces.convert.Converter</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>
-		</entity>
-		<entity id="converterMessage">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.StringType
-				</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>		
-		</entity>
-		<entity id="required">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.BooleanType
-				</value>
-			</trait>		
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>				
-		</entity>
-		<entity id="requiredMessage">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.StringType
-				</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>			
-		</entity>
-		<entity id="validator">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.FacesConfigValidatorIDType
-				</value>
-			</trait>
-			<trait id="config-type">
-				<value xsi:type="mdt:StringValue">javax.faces.convert.Validator</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>		
-		</entity>
-		<entity id="validatorMessage">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.StringType
-				</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>			
-		</entity>
-		<entity id="valueChangeListener">					
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.MethodBindingType</value>
-			</trait>
-			<trait id="runtime-return-type">
-				<value xsi:type="mdt:StringValue">void</value>
-			</trait>			
-			<trait id="runtime-param-types">
-				<value xsi:type="mdt:StringValue">javax.faces.event.ValueChangeEvent</value>
-			</trait>	
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>			
-		</entity>
-		<entity id="maxLength">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-			</trait>	
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>	
-		</entity>	
-		<entity id="for">
-		
-		</entity>	
-	</entity>
-	<entityGroup id="common-core-attributes" type="tag">
-		<entity id="binding">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.ComponentBindingType
-				</value>
-			</trait>
-			<trait id="runtime-return-type">
-				<value xsi:type="mdt:StringValue">javax.faces.component.UIComponent</value>
-			</trait>				
-		</entity>			
-		<entity id="id">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.ComponentIDType
-				</value>
-			</trait>
-		</entity>
-		<entity id="value">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.ValueBindingType
-				</value>
-			</trait>
-		</entity>
-	</entityGroup>
-</md:metadatamodel>
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/jsf_core_dti.xml b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/jsf_core_dti.xml
deleted file mode 100644
index 6aaca7f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/jsf_core_dti.xml
+++ /dev/null
@@ -1,417 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<md:metadatamodel xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" 
-	xmlns:md="http://org.eclipse.jst.jsf.common.metadata/metadata.ecore"
-	xmlns:dti="http://org.eclipse.jsf.pagedesigner/dtinfo.ecore"
-	id="http://java.sun.com/jsf/core"
-	type="tagFile">
-
-	<entity id="actionListener" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-decorate-info id="vpd-decorate-design"
-					nonVisual="true"
-					nonVisualImagePath="icons/palette/JSFCORE/small/JSF_ACTIONLISTENER.gif"
-					widget="true"
-					
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					nonVisual="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="ajax" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-decorate-info id="vpd-decorate-design"
-					nonVisual="true"
-					nonVisualImagePath="icons/palette/JSFCORE/small/JSF_AJAX.gif"
-					widget="true"
-					
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					nonVisual="true"
-				/>
-			</value>
-		</trait>	
-	</entity>
-
-	<entity id="attribute" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-decorate-info id="vpd-decorate-design"
-					nonVisual="true"
-					nonVisualImagePath="icons/palette/JSFCORE/small/JSF_ATTRIBUTE.gif"
-					widget="true"
-					
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					nonVisual="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="convertDateTime" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-decorate-info id="vpd-decorate-design"
-					nonVisual="true"
-					nonVisualImagePath="icons/palette/JSFCORE/small/JSF_CONVERTDATETIME.gif"
-					widget="true"
-					
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					nonVisual="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="converter" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-decorate-info id="vpd-decorate-design"
-					nonVisual="true"
-					nonVisualImagePath="icons/palette/JSFCORE/small/JSF_CONVERTER.gif"
-					widget="true"
-					
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					nonVisual="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="convertNumber" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-decorate-info id="vpd-decorate-design"
-					nonVisual="true"
-					nonVisualImagePath="icons/palette/JSFCORE/small/JSF_CONVERTNUMBER.gif"
-					widget="true"
-					
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					nonVisual="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="event" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-decorate-info id="vpd-decorate-design"
-					nonVisual="true"
-					nonVisualImagePath="icons/palette/JSFCORE/small/JSF_EVENT.gif"
-					widget="true"					
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					nonVisual="true"
-				/>
-			</value>
-		</trait>	
-	</entity>
-
-	<entity id="facet" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.pagedesigner.CreateElementOperation">
-						<parameter value="span"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyChildrenOperation"/>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					minHeight="10"
-					minWidth="10"
-					multiLevel="true"
-					needBorderDecorator="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="loadBundle" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.pagedesigner.jsf.ui.LoadBundleOperation"/>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					nonVisual="true"
-					nonVisualImagePath="icons/palette/JSFCORE/small/JSF_LOADBUNDLE.gif"
-					widget="true"
-					
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					nonVisual="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-	
-	<entity id="metadata" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-decorate-info id="vpd-decorate-design"
-					nonVisual="true"
-					nonVisualImagePath="icons/palette/JSFCORE/small/JSF_METADATA.gif"
-					widget="true"
-					
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					nonVisual="true"
-				/>
-			</value>
-		</trait>	
-	</entity>	
-
-	<entity id="param" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-decorate-info id="vpd-decorate-design"
-					nonVisual="true"
-					nonVisualImagePath="icons/palette/JSFCORE/small/JSF_PARAM.gif"
-					widget="true"
-					
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					nonVisual="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="selectItem" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-decorate-info id="vpd-decorate-design"
-					nonVisual="true"
-					nonVisualImagePath="icons/palette/JSFCORE/small/JSF_SELECTITEM.gif"
-					widget="true"
-					
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					nonVisual="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="selectItems" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-decorate-info id="vpd-decorate-design"
-					nonVisual="true"
-					nonVisualImagePath="icons/palette/JSFCORE/small/JSF_SELECTITEMS.gif"
-					widget="true"
-					
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					nonVisual="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="subview" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.pagedesigner.CreateElementOperation">
-						<parameter value="div"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyChildrenOperation"/>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					needBorderDecorator="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="validateBean" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-decorate-info id="vpd-decorate-design"
-					nonVisual="true"
-					nonVisualImagePath="icons/palette/JSFCORE/small/JSF_VALIDATEBEAN.gif"
-					widget="true"
-					
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					nonVisual="true"
-				/>
-			</value>
-		</trait>	
-	</entity>
-
-	<entity id="validateDoubleRange" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-decorate-info id="vpd-decorate-design"
-					nonVisual="true"
-					nonVisualImagePath="icons/palette/JSFCORE/small/JSF_VALIDATEDOUBLERANGE.gif"
-					widget="true"
-					
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					nonVisual="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="validateLength" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-decorate-info id="vpd-decorate-design"
-					nonVisual="true"
-					nonVisualImagePath="icons/palette/JSFCORE/small/JSF_VALIDATELENGTH.gif"
-					widget="true"
-					
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					nonVisual="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="validateLongRange" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-decorate-info id="vpd-decorate-design"
-					nonVisual="true"
-					nonVisualImagePath="icons/palette/JSFCORE/small/JSF_VALIDATELONGRANGE.gif"
-					widget="true"
-					
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					nonVisual="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="validateRegex" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-decorate-info id="vpd-decorate-design"
-					nonVisual="true"
-					nonVisualImagePath="icons/palette/JSFCORE/small/JSF_VALIDATEREGEX.gif"
-					widget="true"
-					
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					nonVisual="true"
-				/>
-			</value>
-		</trait>	
-	</entity>
-
-	<entity id="validateRequired" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-decorate-info id="vpd-decorate-design"
-					nonVisual="true"
-					nonVisualImagePath="icons/palette/JSFCORE/small/JSF_VALIDATEREQUIRED.gif"
-					widget="true"
-					
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					nonVisual="true"
-				/>
-			</value>
-		</trait>	
-	</entity>
-
-	<entity id="validator" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-decorate-info id="vpd-decorate-design"
-					nonVisual="true"
-					nonVisualImagePath="icons/palette/JSFCORE/small/JSF_VALIDATOR.gif"
-					widget="true"
-					
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					nonVisual="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="valueChangeListener" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-decorate-info id="vpd-decorate-design"
-					nonVisual="true"
-					nonVisualImagePath="icons/palette/JSFCORE/small/JSF_VALUECHANGELISTENER.gif"
-					widget="true"
-					
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					nonVisual="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="verbatim" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.pagedesigner.CreateElementOperation">
-						<parameter value="span"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyChildrenOperation"/>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					minHeight="10"
-					minWidth="10"
-					multiLevel="true"
-					needBorderDecorator="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="view" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.pagedesigner.CreateElementOperation">
-						<parameter value="div"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyChildrenOperation"/>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					needBorderDecorator="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="viewParam" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-decorate-info id="vpd-decorate-design"
-					nonVisual="true"
-					nonVisualImagePath="icons/palette/JSFCORE/small/JSF_VIEWPARAM.gif"
-					widget="true"
-					
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					nonVisual="true"
-				/>
-			</value>
-		</trait>	
-	</entity>
-
-</md:metadatamodel>
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/jsf_core_pi.properties b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/jsf_core_pi.properties
deleted file mode 100644
index 01888c7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/jsf_core_pi.properties
+++ /dev/null
@@ -1,16 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2008 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-JSFCORE.display-label=JSF Core
-JSFCORE.ajax.description=Registers an AjaxBehavior instance on one or more UIComponents implementing the ClientBehaviorHolder interface.
-JSFCORE.event.description=Allows JSF page authors to install ComponentSystemEventListener instances on a component in a page.
-JSFCORE.metadata.description=Declares the metadata facet for this view.
-JSFCORE.validateRequired.description=A validator that enforces the presence of a value. 
-
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/jsf_core_pi.xml b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/jsf_core_pi.xml
deleted file mode 100644
index 9aaa51f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/jsf_core_pi.xml
+++ /dev/null
@@ -1,265 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<md:metadatamodel 
-	xmlns:md="http://org.eclipse.jst.jsf.common.metadata/metadata.ecore" 
-	xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" 
-	xmlns:mdt="http://org.eclipse.jst.jsf.common.metadata/metadataTraitTypes.ecore" 
-	xmlns:pi="http://org.eclipse.jsf.pagedesigner/paletteInfos.ecore" 
-	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
-	id="http://java.sun.com/jsf/core" 
-	type="tagFile">
-	
-	<trait id="is-jsf-component-library">
-		<value xsi:type="mdt:BooleanValue">true</value>
-	</trait>
-	
-	<trait id="paletteInfos">
-		<value xsi:type="pi:PaletteInfos">						
-			<item id="view"/>
-			<item id="validator"/>
-			<item id="valueChangeListener"/>			
-			<item id="actionListener"/>
-			<item id="convertDateTime"/>
-			<item id="converter"/>
-			<item id="convertNumber"/>			
-			<item id="facet"/>
-			<item id="attribute"/>
-			<item id="loadBundle"/>
-			<item id="param"/>
-			<item id="selectItem"/>
-			<item id="selectItems"/>
-			<item id="subview"/>
-			<item id="validateDoubleRange"/>
-			<item id="validateLength"/>
-			<item id="validateLongRange"/>
-			<item id="verbatim"/>			
-			<item id="ajax"/>
-			<item id="event"/>
-			<item id="metadata"/>
-			<item id="validateBean"/>
-			<item id="validateRegex"/>
-			<item id="validateRequired"/>
-			<item id="viewParam"/>
-		</value>
-	</trait>
-
-	<trait id="images-base-path">
-		<value xsi:type="mdt:StringValue">icons/palette/JSFCORE</value>
-	</trait>
-
-	<trait id="display-label">
-		<value xsi:type="mdt:StringValue">%JSFCORE.display-label</value>
-	</trait>
-	
-	<entity id="actionListener" type="tag">
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_ACTIONLISTENER.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_ACTIONLISTENER.gif</value>
-		</trait>
-	</entity>
-	<entity id="ajax" type="tag">
-		<trait id="description">
-			<value xsi:type="mdt:StringValue">%JSFCORE.ajax.description</value>
-		</trait>
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_AJAX.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_AJAX.gif</value>
-		</trait>
-	</entity>
-	<entity id="attribute" type="tag">
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_ATTRIBUTE.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_ATTRIBUTE.gif</value>
-		</trait>
-	</entity>	
-	<entity id="convertDateTime" type="tag">
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_CONVERTDATETIME.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_CONVERTDATETIME.gif</value>
-		</trait>
-	</entity>
-	<entity id="convertNumber" type="tag">
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_CONVERTNUMBER.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_CONVERTNUMBER.gif</value>
-		</trait>
-	</entity>
-	
-	<entity id="converter" type="tag">
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_CONVERTER.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_CONVERTER.gif</value>
-		</trait>
-	</entity><entity id="event" type="tag">
-		<trait id="description">
-			<value xsi:type="mdt:StringValue">%JSFCORE.event.description</value>
-		</trait>	
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_EVENT.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_EVENT.gif</value>
-		</trait>
-	</entity>	
-	<entity id="facet" type="tag">
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_FACET.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_FACET.gif</value>
-		</trait>
-	</entity>
-	<entity id="loadBundle" type="tag">
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_LOADBUNDLE.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_LOADBUNDLE.gif</value>
-		</trait>
-	</entity>
-	<entity id="metadata" type="tag">
-		<trait id="description">
-			<value xsi:type="mdt:StringValue">%JSFCORE.metadata.description</value>
-		</trait>	
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_METADATA.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_METADATA.gif</value>
-		</trait>
-	</entity>	
-	<entity id="param" type="tag">
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_PARAM.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_PARAM.gif</value>
-		</trait>
-	</entity>
-	<entity id="selectItem" type="tag">
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_SELECTITEM.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_SELECTITEM.gif</value>
-		</trait>
-	</entity>
-	<entity id="selectItems" type="tag">	
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_SELECTITEMS.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_SELECTITEMS.gif</value>
-		</trait>
-	</entity>
-	<entity id="subview" type="tag">
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_SUBVIEW.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_SUBVIEW.gif</value>
-		</trait>
-	</entity>
-	<entity id="validateBean" type="tag">
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_VALIDATEBEAN.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_VALIDATEBEAN.gif</value>
-		</trait>
-	</entity>	
-	<entity id="validateDoubleRange" type="tag">
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_VALIDATEDOUBLERANGE.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_VALIDATEDOUBLERANGE.gif</value>
-		</trait>
-	</entity>
-	<entity id="validateLength" type="tag">
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_VALIDATELENGTH.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_VALIDATELENGTH.gif</value>
-		</trait>
-	</entity>
-	<entity id="validateLongRange" type="tag">
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_VALIDATELONGRANGE.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_VALIDATELONGRANGE.gif</value>
-		</trait>
-	</entity>
-	<entity id="validateRegex" type="tag">
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_VALIDATEREGEX.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_VALIDATEREGEX.gif</value>
-		</trait>
-	</entity>
-	<entity id="validateRequired" type="tag">
-		<trait id="description">
-			<value xsi:type="mdt:StringValue">%JSFCORE.validateRequired.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_VALIDATEREQUIRED.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_VALIDATEREQUIRED.gif</value>
-		</trait>
-	</entity>
-	<entity id="validator" type="tag">
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_VALIDATOR.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_VALIDATOR.gif</value>
-		</trait>
-	</entity>
-	<entity id="valueChangeListener" type="tag">
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_VALUECHANGELISTENER.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_VALUECHANGELISTENER.gif</value>
-		</trait>
-	</entity>
-	<entity id="verbatim" type="tag">
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_VERBATIM.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_VERBATIM.gif</value>
-		</trait>
-	</entity>
-	<entity id="view" type="tag">
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_VIEW.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_VIEW.gif</value>
-		</trait>	
-	</entity>
-	<entity id="viewParam" type="tag">
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_VIEWPARAM.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_VIEWPARAM.gif</value>
-		</trait>	
-	</entity>
-</md:metadatamodel>
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/jsf_html.properties b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/jsf_html.properties
deleted file mode 100644
index 7279b8b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/jsf_html.properties
+++ /dev/null
@@ -1,50 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2008 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-messages.layout.displayed-values.list=list (an HTML list)
-messages.layout.displayed-values.table=table (an HTML table)
-
-selectManyCheckbox.layout.displayed-values.pageDirection=pageDirection (list is laid out vertically)
-selectManyCheckbox.layout.displayed-values.lineDirection=lineDirection (list is laid out horizontally)
-
-selectOneRadio.layout.displayed-values.pageDirection=pageDirection (list is laid out vertically)
-selectOneRadio.layout.displayed-values.lineDirection=lineDirection (list is laid out horizontally)
-
-any.frame.displayed-values.none=none (no sides, default value)
-any.frame.displayed-values.above=above (top side only)
-any.frame.displayed-values.below=below (bottom side only)
-any.frame.displayed-values.hsides=hsides (top and bottom sides only)
-any.frame.displayed-values.vsides=vsides (right and left sides only)
-any.frame.displayed-values.lhs=lhs (left hand side only)
-any.frame.displayed-values.rhs=rhs (right hand side only)
-any.frame.displayed-values.box=box (all four sides)
-any.frame.displayed-values.border=border (all four sides)
-
-any.rules.displayed-values.none=none (no rules, default value)
-any.rules.displayed-values.groups=groups (between row groups)
-any.rules.displayed-values.rows=rows (between rows only)
-any.rules.displayed-values.cols=cols (between columns only)
-any.rules.displayed-values.all=all (between all rows and columns)
-
-property.category.event=Event
-property.category.language=Language
-property.category.html=HTML
-property.category.css=CSS
-property.category.jsf=JSF
-property.category.general=General
-property.category.accessibility=Accessibility
-property.category.visualProperty=VisualProperty
-property.category.browser.specific=Browser Specific
-property.category.core=Core
-property.category.content=Content
-property.category.data.binding=Data Binding
-property.category.dynamic=Dynamic
-property.category.file=File
-property.category.image=Image
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/jsf_html.xml b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/jsf_html.xml
deleted file mode 100644
index a50dc56..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/jsf_html.xml
+++ /dev/null
@@ -1,1418 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<md:metadatamodel 
-	xmlns:md="http://org.eclipse.jst.jsf.common.metadata/metadata.ecore" 
-	xmlns:cnst="http://org.eclipse.jst.jsf.core/constraints.ecore" 
-	xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" 
-	xmlns:mdt="http://org.eclipse.jst.jsf.common.metadata/metadataTraitTypes.ecore" 
-	xmlns:qe="http://org.eclipse.jsf.pagedesigner/QuickEditTabSections.ecore" 
-	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
-	id="http://java.sun.com/jsf/html" 
-	type="tagFile">
-
-	<entity id="body" type="tag">
-		<include-entity-group id="basic-jsf-html-attributes"/>
-		<include-entity-group id="common-language-attributes" uri="HTML"/>
-		<include-entity-group id="common-core-attributes" uri="HTML"/>
-		<include-entity-group id="common-event-attributes" uri="HTML"/>		
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="style"/>			
-			</value>
-		</trait>	
-	</entity>	
-	<entity id="button" type="tag">
-		<include-entity-group id="basic-jsf-html-attributes"/>
-		<include-entity-group id="common-html-attributes" uri="HTML"/>
-		<include-entity-group id="common-language-attributes" uri="HTML"/>
-		<include-entity-group id="common-core-attributes" uri="HTML"/>
-		<include-entity-group id="common-event-attributes" uri="HTML"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="outcome"/>
-				<section id="includeViewParams"/>
-				<section id="style"/>			
-			</value>
-		</trait>		
-		<entity id="fragment">					
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>
-		</entity>		
-		<entity id="includeViewParams">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-			</trait>		
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>
-		</entity>
-		<entity id="image">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.WebPathType</value>
-			</trait>		
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>
-		</entity>
-		<entity id="outcome">	
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>
-		</entity>		
-	</entity>
-	<entity id="column" type="tag">
-		<include-entity-group id="basic-jsf-html-attributes"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-			</value>
-		</trait>		
-	</entity>
-	<entity id="commandButton" type="tag">	
-		<include-entity-group id="basic-jsf-html-attributes"/>
-		<include-entity-group id="common-jsf-html-attributes"/>
-		<include-entity-group id="common-html-attributes" uri="HTML"/>
-		<include-entity-group id="common-language-attributes" uri="HTML"/>
-		<include-entity-group id="common-core-attributes" uri="HTML"/>
-		<include-entity-group id="common-event-attributes" uri="HTML"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="value"/>
-				<section id="action"/>				
-				<section id="type"/>
-				<section id="style"/>
-				<section id="section.general.commandButton.listener" type="SECTION"/>
-			</value>
-		</trait>
-		<trait id="containment-constraint">
-			<value xsi:type="cnst:ContainsTagConstraint">
-				<set-generator>
-					<algorithm>xpath</algorithm>
-					<expression>ancestor::*</expression>
-				</set-generator>
-				<satisfies-set>
-						<tagId>
-							<uri>http://java.sun.com/jsf/core</uri>
-							<name>view</name>
-						</tagId>
-						<tagId>
-							<uri>http://java.sun.com/jsf/html</uri>
-							<name>form</name>
-						</tagId>
-				</satisfies-set>
-			</value>
-		</trait>
-		<entity id="type">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-			</trait>		
-			<trait id="valid-values">
-				<value xsi:type="mdt:ListOfValues">
-					<item>button</item>
-					<item>reset</item>
-					<item>submit</item>
-				</value>
-			</trait>
-			<trait id="default-value">
-				<value xsi:type="mdt:StringValue">submit</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>
-		</entity>
-		<entity id="image">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.WebPathType</value>
-			</trait>		
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>
-		</entity>
-		<entity id="label">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-			</trait>		
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>
-		</entity>
-	</entity>
-	<entity id="commandLink" type="tag">		
-		<include-entity-group id="basic-jsf-html-attributes"/>
-		<include-entity-group id="common-jsf-html-attributes"/>
-		<include-entity-group id="common-html-attributes" uri="HTML"/>
-		<include-entity-group id="common-language-attributes" uri="HTML"/>
-		<include-entity-group id="common-core-attributes" uri="HTML"/>
-		<include-entity-group id="common-event-attributes" uri="HTML"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="value"/>
-				<section id="action"/>				
-				<section id="style"/>	
-				<section id="section.general.commandLink.listener" type="SECTION"/>			
-			</value>
-		</trait>
-		<trait id="containment-constraint">
-			<value xsi:type="cnst:ContainsTagConstraint">
-				<set-generator>
-					<algorithm>xpath</algorithm>
-					<expression>ancestor::*</expression>
-				</set-generator>
-				<satisfies-set>
-						<tagId>
-							<uri>http://java.sun.com/jsf/core</uri>
-							<name>view</name>
-						</tagId>
-						<tagId>
-							<uri>http://java.sun.com/jsf/html</uri>
-							<name>form</name>
-						</tagId>
-				</satisfies-set>
-			</value>
-		</trait>
-	</entity>
-	<entity id="dataTable" type="tag">
-		<include-entity-group id="jsf-table-attributes"/>
-		<include-entity-group id="basic-jsf-html-attributes"/>
-		<include-entity-group id="common-jsf-html-attributes"/>
-		<include-entity-group id="common-html-attributes" uri="HTML"/>
-		<include-entity-group id="common-language-attributes" uri="HTML"/>
-		<include-entity-group id="common-core-attributes" uri="HTML"/>
-		<include-entity-group id="common-event-attributes" uri="HTML"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="value"/>
-				<section id="var"/>
-				<section id="width"/>
-				<section id="border"/>
-				<section id="bgcolor"/>
-				<section id="style"/>	
-				<section id="section.general.dataTable.columns" type="SECTION"/>		
-			</value>
-		</trait>
-		<entity id="bgcolor">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.ColorType</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>
-		</entity>
-		<entity id="var">
-			<trait id="contributes-value-binding">
-				<value xsi:type="mdt:BooleanValue">true</value>
-			</trait>
-			<trait id="value-binding-scope">
-				<value xsi:type="mdt:StringValue">request</value>
-			</trait>
-			<trait id="value-binding-symbol-factory">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.designtime.core.loadBundle</value>
-			</trait>
-			<trait id="category"><value xsi:type="mdt:StringValue">%property.category.jsf</value></trait>			
-		</entity>
-	</entity>
-	<entity id="form" type="tag">
-		<include-entity-group id="basic-jsf-html-attributes"/>
-		<include-entity-group id="common-html-attributes" uri="HTML"/>
-		<include-entity-group id="common-language-attributes" uri="HTML"/>
-		<include-entity-group id="common-core-attributes" uri="HTML"/>
-		<include-entity-group id="common-event-attributes" uri="HTML"/>
-		<include-entity-group id="form-event-attributes" uri="HTML"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="style"/>			
-			</value>
-		</trait>	
-	</entity>
-	<entity id="head" type="tag">
-		<include-entity-group id="common-language-attributes" uri="HTML"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="binding"/>	
-				<section id="lang"/>
-				<section id="dir"/>		
-			</value>
-		</trait>	
-		<entity id="binding">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.ComponentBindingType</value>
-			</trait>
-			<trait id="runtime-return-type">
-				<value xsi:type="mdt:StringValue">javax.faces.component.UIComponent</value>
-			</trait>	
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>					
-		</entity>	
-	</entity>
-	<entity id="graphicImage" type="tag">
-		<include-entity-group id="basic-jsf-html-attributes"/>
-		<include-entity-group id="common-html-attributes" uri="HTML"/>
-		<include-entity-group id="common-language-attributes" uri="HTML"/>
-		<include-entity-group id="common-core-attributes" uri="HTML"/>
-		<include-entity-group id="common-event-attributes" uri="HTML"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="value"/>
-				<section id="url"/>
-				<section id="binding"/>
-				<section id="style"/>			
-			</value>
-		</trait>
-	</entity>
-	<entity id="inputHidden" type="tag">
-		<include-entity-group id="basic-jsf-html-attributes"/>
-		<include-entity-group id="common-jsf-html-attributes"/>
-		<include-entity-group id="common-html-attributes" uri="HTML"/>
-		<include-entity-group id="common-language-attributes" uri="HTML"/>
-		<include-entity-group id="common-core-attributes" uri="HTML"/>
-		<include-entity-group id="common-event-attributes" uri="HTML"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="value"/>	
-				<!--  <section id="section.general.inputHidden.type" type="SECTION"/>	-->
-			</value>
-		</trait>
-		<trait id="containment-constraint">
-			<value xsi:type="cnst:ContainsTagConstraint">
-				<set-generator>
-					<algorithm>xpath</algorithm>
-					<expression>ancestor::*</expression>
-				</set-generator>
-				<satisfies-set>
-						<tagId>
-							<uri>http://java.sun.com/jsf/core</uri>
-							<name>view</name>
-						</tagId>
-				</satisfies-set>
-			</value>
-		</trait>
-		<entity id="value">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.ValueType</value>
-			</trait>
-			<trait id="runtime-type-setter-required">
-				<value xsi:type="mdt:BooleanValue">true</value>
-			</trait>			
-		</entity>
-	</entity>
-	<entity id="inputSecret" type="tag">
-		<include-entity-group id="basic-jsf-html-attributes"/>
-		<include-entity-group id="common-jsf-html-attributes"/>
-		<include-entity-group id="common-html-attributes" uri="HTML"/>
-		<include-entity-group id="common-language-attributes" uri="HTML"/>
-		<include-entity-group id="common-core-attributes" uri="HTML"/>
-		<include-entity-group id="common-event-attributes" uri="HTML"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="value"/>
-				<section id="style"/>	
-				<!-- <section id="section.general.inputSecret.type" type="SECTION"/> -->
-				<section id="section.general.inputText.others" type="SECTION"/>				
-			</value>
-		</trait>		
-		<entity id="value">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.ValueType</value>
-			</trait>
-			<trait id="runtime-type-setter-required">
-				<value xsi:type="mdt:BooleanValue">true</value>
-			</trait>
-		</entity>	
-	</entity>
-	<entity id="inputText" type="tag">
-		<include-entity-group id="basic-jsf-html-attributes"/>
-		<include-entity-group id="common-jsf-html-attributes"/>
-		<include-entity-group id="common-html-attributes" uri="HTML"/>
-		<include-entity-group id="common-language-attributes" uri="HTML"/>
-		<include-entity-group id="common-core-attributes" uri="HTML"/>
-		<include-entity-group id="common-event-attributes" uri="HTML"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="value"/>
-				<section id="style"/>	
-				<!--  <section id="section.general.inputText.type" type="SECTION"/> -->
-				<section id="section.general.inputText.others" type="SECTION"/>							
-			</value>
-		</trait>
-		<trait id="containment-constraint">
-			<value xsi:type="cnst:ContainsTagConstraint">
-				<set-generator>
-					<algorithm>xpath</algorithm>
-					<expression>ancestor::*</expression>
-				</set-generator>
-				<satisfies-set>
-						<tagId>
-							<uri>http://java.sun.com/jsf/core</uri>
-							<name>view</name>
-						</tagId>
-				</satisfies-set>
-			</value>
-		</trait>
-		<entity id="value">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.ValueType</value>
-			</trait>
-			<trait id="runtime-type-setter-required">
-				<value xsi:type="mdt:BooleanValue">true</value>
-			</trait>
-		</entity>	
-	</entity>
-	<entity id="inputTextarea" type="tag">
-		<include-entity-group id="basic-jsf-html-attributes"/>
-		<include-entity-group id="common-jsf-html-attributes"/>
-		<include-entity-group id="common-html-attributes" uri="HTML"/>
-		<include-entity-group id="common-language-attributes" uri="HTML"/>
-		<include-entity-group id="common-core-attributes" uri="HTML"/>
-		<include-entity-group id="common-event-attributes" uri="HTML"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="value"/>
-				<section id="style"/>		
-				<!-- <section id="section.general.inputTextarea.type" type="SECTION"/> -->
-				<section id="section.general.inputTextarea.others" type="SECTION"/>	
-			</value>
-		</trait>		
-		<entity id="value">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.ValueType</value>
-			</trait>
-			<trait id="runtime-type-setter-required">
-				<value xsi:type="mdt:BooleanValue">true</value>
-			</trait>
-		</entity>	
-	</entity>
-	<entity id="link" type="tag">
-		<include-entity-group id="basic-jsf-html-attributes"/>
-		<include-entity-group id="common-html-attributes" uri="HTML"/>
-		<include-entity-group id="common-language-attributes" uri="HTML"/>
-		<include-entity-group id="common-core-attributes" uri="HTML"/>
-		<include-entity-group id="common-event-attributes" uri="HTML"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="outcome"/>
-				<section id="includeViewParams"/>
-				<section id="style"/>			
-			</value>
-		</trait>		
-		<entity id="fragment">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-			</trait>		
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>
-		</entity>		
-		<entity id="includeViewParams">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-			</trait>		
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>
-		</entity>
-		<entity id="image">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.WebPathType</value>
-			</trait>		
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>
-		</entity>
-		<entity id="outcome">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-			</trait>		
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>
-		</entity>		
-	</entity>	
-	<entity id="message" type="tag">
-		<include-entity-group id="basic-jsf-html-attributes"/>
-		<include-entity-group id="common-jsf-html-attributes"/>
-		<include-entity-group id="common-html-attributes" uri="HTML"/>
-		<include-entity-group id="common-language-attributes" uri="HTML"/>
-		<include-entity-group id="common-core-attributes" uri="HTML"/>
-		<include-entity-group id="for-entity"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="for"/>			
-			</value>
-		</trait>
-	</entity>
-	<entity id="messages" type="tag">
-		<include-entity-group id="basic-jsf-html-attributes"/>
-		<include-entity-group id="common-jsf-html-attributes"/>
-		<include-entity-group id="common-html-attributes" uri="HTML"/>
-		<include-entity-group id="common-language-attributes" uri="HTML"/>
-		<include-entity-group id="common-core-attributes" uri="HTML"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="layout"/>
-				<section id="style"/>			
-			</value>
-		</trait>		
-		<entity id="layout">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-			</trait>
-			<trait id="valid-values">
-				<value xsi:type="mdt:ListOfValues">
-					<item>list</item>
-					<item>table</item>
-				</value>
-			</trait>
-			<trait id="displayed-values">	
-				<value xsi:type="mdt:ListOfValues">							
-					<item>%messages.layout.displayed-values.list</item>		
-					<item>%messages.layout.displayed-values.table</item>
-				</value>
-			</trait>
-			<trait id="default-value">
-				<value xsi:type="mdt:StringValue">list</value>
-			</trait>				
-		</entity>	
-	</entity>
-	<entity id="outputFormat" type="tag">
-		<include-entity-group id="basic-jsf-html-attributes"/>
-		<include-entity-group id="common-html-attributes" uri="HTML"/>
-		<include-entity-group id="common-language-attributes" uri="HTML"/>
-		<include-entity-group id="common-core-attributes" uri="HTML"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="value"/>
-				<section id="style"/>		
-				<section id="section.general.outputFormat.params" type="SECTION"/>	
-			</value>
-		</trait>		
-	</entity>
-	<entity id="outputLabel" type="tag">		
-		<include-entity-group id="basic-jsf-html-attributes"/>
-		<include-entity-group id="common-jsf-html-attributes"/>
-		<include-entity-group id="common-html-attributes" uri="HTML"/>
-		<include-entity-group id="common-language-attributes" uri="HTML"/>
-		<include-entity-group id="common-core-attributes" uri="HTML"/>
-		<include-entity-group id="common-event-attributes" uri="HTML"/>
-		<include-entity-group id="for-entity"/>		
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="value"/>
-				<section id="for"/>
-				<section id="style"/>			
-			</value>
-		</trait>		
-	</entity>
-	<entity id="outputLink" type="tag">
-		<include-entity-group id="basic-jsf-html-attributes"/>
-		<include-entity-group id="common-jsf-html-attributes"/>
-		<include-entity-group id="common-html-attributes" uri="HTML"/>
-		<include-entity-group id="common-language-attributes" uri="HTML"/>
-		<include-entity-group id="common-core-attributes" uri="HTML"/>
-		<include-entity-group id="common-event-attributes" uri="HTML"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="value"/>
-				<section id="style"/>			
-			</value>
-		</trait>		
-	</entity>
-	<entity id="outputScript" type="tag">
-		<include-entity-group id="basic-jsf-html-attributes"/>		
-		<include-entity-group id="common-core-attributes" uri="HTML"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="value"/>
-				<section id="binding"/>
-				<section id="section.general.outputText.converter" type="SECTION"/>	
-			</value>
-		</trait>
-		<entity id="target">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.ValueType</value>
-			</trait>
-		</entity>	
-		<entity id="library">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.ValueType</value>
-			</trait>
-		</entity>	
-		<entity id="name">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.ValueType</value>
-			</trait>
-		</entity>	
-	</entity>
-		<entity id="outputStylesheet" type="tag">
-		<include-entity-group id="basic-jsf-html-attributes"/>
-		<include-entity-group id="common-core-attributes" uri="HTML"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="value"/>
-				<section id="binding"/>
-				<section id="section.general.outputText.converter" type="SECTION"/>	
-			</value>
-		</trait>
-		<entity id="library">
-		
-		</entity>	
-		<entity id="name">
-
-		</entity>	
-	</entity>
-	<entity id="outputText" type="tag">
-		<include-entity-group id="basic-jsf-html-attributes"/>
-		<include-entity-group id="common-jsf-html-attributes"/>
-		<include-entity-group id="common-html-attributes" uri="HTML"/>
-		<include-entity-group id="common-language-attributes" uri="HTML"/>
-		<include-entity-group id="common-core-attributes" uri="HTML"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="value"/>
-				<section id="binding"/>
-				<section id="style"/>	
-				<section id="section.general.outputText.converter" type="SECTION"/>	
-			</value>
-		</trait>		
-	</entity>
-	<entity id="panelGrid" type="tag">
-		<include-entity-group id="basic-jsf-html-attributes"/>
-		<include-entity-group id="jsf-table-attributes"/>
-		<include-entity-group id="common-jsf-html-attributes"/>
-		<include-entity-group id="common-html-attributes" uri="HTML"/>
-		<include-entity-group id="common-language-attributes" uri="HTML"/>
-		<include-entity-group id="common-core-attributes" uri="HTML"/>
-		<include-entity-group id="common-event-attributes" uri="HTML"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="columns"/>
-				<section id="border"/>
-				<section id="style"/>			
-			</value>
-		</trait>		
-	</entity>
-	<entity id="panelGroup" type="tag">
-		<include-entity-group id="basic-jsf-html-attributes"/>
-		<include-entity-group id="common-html-attributes" uri="HTML"/>
-		<include-entity-group id="common-core-attributes" uri="HTML"/>		
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="value"/>
-				<section id="style"/>			
-			</value>
-		</trait>		
-	</entity>
-	<entity id="selectBooleanCheckbox" type="tag">
-		<include-entity-group id="basic-jsf-html-attributes"/>
-		<include-entity-group id="common-jsf-html-attributes"/>
-		<include-entity-group id="common-html-attributes" uri="HTML"/>
-		<include-entity-group id="common-language-attributes" uri="HTML"/>
-		<include-entity-group id="common-core-attributes" uri="HTML"/>
-		<include-entity-group id="common-event-attributes" uri="HTML"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="value"/>
-				<section id="style"/>			
-			</value>
-		</trait>		
-		<trait id="containment-constraint">
-			<value xsi:type="cnst:ContainsTagConstraint">
-				<set-generator>
-					<algorithm>xpath</algorithm>
-					<expression>ancestor::*</expression>
-				</set-generator>
-				<satisfies-set>
-						<tagId>
-							<uri>http://java.sun.com/jsf/core</uri>
-							<name>view</name>
-						</tagId>
-				</satisfies-set>
-			</value>
-		</trait>
-		<entity id="value">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.ValueType</value>
-			</trait>
-			<trait id="runtime-type-setter-required">
-				<value xsi:type="mdt:BooleanValue">true</value>
-			</trait>
-		</entity>
-	</entity>
-	<entity id="selectManyCheckbox" type="tag">
-		<include-entity-group id="basic-jsf-html-attributes"/>
-		<include-entity-group id="common-jsf-html-attributes"/>
-		<include-entity-group id="common-html-attributes" uri="HTML"/>
-		<include-entity-group id="common-language-attributes" uri="HTML"/>
-		<include-entity-group id="common-core-attributes" uri="HTML"/>
-		<include-entity-group id="common-event-attributes" uri="HTML"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="value"/>
-				<section id="layout"/>
-				<section id="style"/>	
-				<section id="section.general.selectManyCheckbox.choices" type="SECTION"/>			
-			</value>
-		</trait>
-		<trait id="containment-constraint">
-			<value xsi:type="cnst:ContainsTagConstraint">
-				<set-generator>
-					<algorithm>xpath</algorithm>
-					<expression>ancestor::*</expression>
-				</set-generator>
-				<satisfies-set>
-						<tagId>
-							<uri>http://java.sun.com/jsf/core</uri>
-							<name>view</name>
-						</tagId>
-				</satisfies-set>
-			</value>
-		</trait>
-		<entity id="layout">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-			</trait>
-			<trait id="valid-values">
-				<value xsi:type="mdt:ListOfValues">
-					<item>pageDirection</item>
-					<item>lineDirection</item>
-				</value>
-			</trait>
-			<trait id="displayed-values">				
-				<value xsi:type="mdt:ListOfValues">
-					<item>%selectManyCheckbox.layout.displayed-values.pageDirection</item>		
-					<item>%selectManyCheckbox.layout.displayed-values.lineDirection</item>
-				</value>
-			</trait>
-			<trait id="default-value">
-				<value xsi:type="mdt:StringValue">lineDirection</value>
-			</trait>
-		</entity>
-		<entity id="value">
-            <trait id="attribute-value-runtime-type">
-                <value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.ValueType</value>
-            </trait>
-            <trait id="runtime-type-setter-required">
-                <value xsi:type="mdt:BooleanValue">true</value>
-            </trait>
-        </entity>
-    </entity>
-	<entity id="selectManyListbox" type="tag">
-		<include-entity-group id="basic-jsf-html-attributes"/>
-		<include-entity-group id="common-jsf-html-attributes"/>
-		<include-entity-group id="common-html-attributes" uri="HTML"/>
-		<include-entity-group id="common-language-attributes" uri="HTML"/>
-		<include-entity-group id="common-core-attributes" uri="HTML"/>
-		<include-entity-group id="common-event-attributes" uri="HTML"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="value"/>
-				<section id="size"/>
-				<section id="style"/>	
-				<section id="section.general.selectManyListbox.choices" type="SECTION"/>		
-			</value>
-		</trait>		
-		<trait id="containment-constraint">
-			<value xsi:type="cnst:ContainsTagConstraint">
-				<set-generator>
-					<algorithm>xpath</algorithm>
-					<expression>ancestor::*</expression>
-				</set-generator>
-				<satisfies-set>
-						<tagId>
-							<uri>http://java.sun.com/jsf/core</uri>
-							<name>view</name>
-						</tagId>
-				</satisfies-set>
-			</value>
-		</trait>
-	    <entity id="value">
-            <trait id="attribute-value-runtime-type">
-                <value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.ValueType</value>
-            </trait>
-            <trait id="runtime-type-setter-required">
-                <value xsi:type="mdt:BooleanValue">true</value>
-            </trait>
-        </entity>
-	</entity>
-	<entity id="selectManyMenu" type="tag">
-		<include-entity-group id="basic-jsf-html-attributes"/>
-		<include-entity-group id="common-jsf-html-attributes"/>
-		<include-entity-group id="common-html-attributes" uri="HTML"/>
-		<include-entity-group id="common-language-attributes" uri="HTML"/>
-		<include-entity-group id="common-core-attributes" uri="HTML"/>
-		<include-entity-group id="common-event-attributes" uri="HTML"/>		
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="value"/>
-				<section id="style"/>	
-				<section id="section.general.selectManyMenu.choices" type="SECTION"/>		
-			</value>
-		</trait>
-		<trait id="containment-constraint">
-			<value xsi:type="cnst:ContainsTagConstraint">
-				<set-generator>
-					<algorithm>xpath</algorithm>
-					<expression>ancestor::*</expression>
-				</set-generator>
-				<satisfies-set>
-						<tagId>
-							<uri>http://java.sun.com/jsf/core</uri>
-							<name>view</name>
-						</tagId>
-				</satisfies-set>
-			</value>
-		</trait>
-		<entity id="value">
-            <trait id="attribute-value-runtime-type">
-                <value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.ValueType</value>
-            </trait>
-            <trait id="runtime-type-setter-required">
-                <value xsi:type="mdt:BooleanValue">true</value>
-            </trait>
-        </entity>
-	</entity>
-	<entity id="selectOneListbox" type="tag">
-		<include-entity-group id="basic-jsf-html-attributes"/>
-		<include-entity-group id="common-jsf-html-attributes"/>
-		<include-entity-group id="common-html-attributes" uri="HTML"/>
-		<include-entity-group id="common-language-attributes" uri="HTML"/>
-		<include-entity-group id="common-core-attributes" uri="HTML"/>
-		<include-entity-group id="common-event-attributes" uri="HTML"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="value"/>
-				<section id="size"/>
-				<section id="style"/>			
-				<section id="section.general.selectOneListbox.choices" type="SECTION"/>
-			</value>
-		</trait>
-		<trait id="containment-constraint">
-			<value xsi:type="cnst:ContainsTagConstraint">
-				<set-generator>
-					<algorithm>xpath</algorithm>
-					<expression>ancestor::*</expression>
-				</set-generator>
-				<satisfies-set>
-						<tagId>
-							<uri>http://java.sun.com/jsf/core</uri>
-							<name>view</name>
-						</tagId>
-				</satisfies-set>
-			</value>
-		</trait>
-		<entity id="value">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.ValueType</value>
-			</trait>
-			<trait id="runtime-type-setter-required">
-				<value xsi:type="mdt:BooleanValue">true</value>
-			</trait>
-		</entity>
-	</entity>
-	<entity id="selectOneMenu" type="tag">
-		<include-entity-group id="basic-jsf-html-attributes"/>
-		<include-entity-group id="common-jsf-html-attributes"/>
-		<include-entity-group id="common-html-attributes" uri="HTML"/>
-		<include-entity-group id="common-language-attributes" uri="HTML"/>
-		<include-entity-group id="common-core-attributes" uri="HTML"/>
-		<include-entity-group id="common-event-attributes" uri="HTML"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="value"/>
-				<section id="style"/>	
-				<section id="section.general.selectOneMenu.choices" type="SECTION"/>		
-			</value>
-		</trait>
-		<trait id="containment-constraint">
-			<value xsi:type="cnst:ContainsTagConstraint">
-				<set-generator>
-					<algorithm>xpath</algorithm>
-					<expression>ancestor::*</expression>
-				</set-generator>
-				<satisfies-set>
-						<tagId>
-							<uri>http://java.sun.com/jsf/core</uri>
-							<name>view</name>
-						</tagId>
-				</satisfies-set>
-			</value>
-		</trait>
-		<entity id="value">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.ValueType</value>
-			</trait>
-			<trait id="runtime-type-setter-required">
-				<value xsi:type="mdt:BooleanValue">true</value>
-			</trait>
-		</entity>
-	</entity>
-	<entity id="selectOneRadio" type="tag">
-		<include-entity-group id="basic-jsf-html-attributes"/>
-		<include-entity-group id="common-jsf-html-attributes"/>
-		<include-entity-group id="common-html-attributes" uri="HTML"/>
-		<include-entity-group id="common-language-attributes" uri="HTML"/>
-		<include-entity-group id="common-core-attributes" uri="HTML"/>
-		<include-entity-group id="common-event-attributes" uri="HTML"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="value"/>
-				<section id="layout"/>
-				<section id="style"/>
-				<section id="section.general.selectOneRadio.choices" type="SECTION"/>			
-			</value>
-		</trait>
-		<trait id="containment-constraint">
-			<value xsi:type="cnst:ContainsTagConstraint">
-				<set-generator>
-					<algorithm>xpath</algorithm>
-					<expression>ancestor::*</expression>
-				</set-generator>
-				<satisfies-set>
-						<tagId>
-							<uri>http://java.sun.com/jsf/core</uri>
-							<name>view</name>
-						</tagId>
-				</satisfies-set>
-			</value>
-		</trait>
-		<entity id="value">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.ValueType</value>
-			</trait>
-			<trait id="runtime-type-setter-required">
-				<value xsi:type="mdt:BooleanValue">true</value>
-			</trait>
-		</entity>	
-		<entity id="layout">
-			<include-entity-group>common-attributes</include-entity-group>
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-			</trait>
-			<trait id="valid-values">
-				<value xsi:type="mdt:ListOfValues">
-					<item>pageDirection</item>
-					<item>lineDirection</item>
-				</value>
-			</trait>
-			<trait id="displayed-values">		
-				<value xsi:type="mdt:ListOfValues">		
-					<item>%selectOneRadio.layout.displayed-values.pageDirection</item>		
-					<item>%selectOneRadio.layout.displayed-values.lineDirection</item>
-				</value>
-			</trait>
-			<trait id="default-value">
-				<value xsi:type="mdt:StringValue">lineDirection</value>
-			</trait>				
-		</entity>			
-	</entity>
-	<entityGroup id="basic-jsf-html-attributes">
-		<entity id="id">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.ComponentIDType</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>			
-		</entity>
-		<entity id="binding">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.ComponentBindingType</value>
-			</trait>
-			<trait id="runtime-return-type">
-				<value xsi:type="mdt:StringValue">javax.faces.component.UIComponent</value>
-			</trait>	
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>					
-		</entity>	
-		<entity id="converter">			
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.FacesConfigConverterIDType</value>
-			</trait>			
-			<trait id="config-type">
-				<value xsi:type="mdt:StringValue">javax.faces.convert.Converter</value>
-			</trait>	
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>
-		</entity>		
-		<entity id="rendered">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>				
-		</entity>	
-		<entity id="required">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>
-		</entity>		
-		<entity id="styleClass">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.CSSClassType</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>				
-		</entity>
-		<entity id="value">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.ValueBindingType</value>
-			</trait>
-			<trait id="runtime-return-type">
-				<value xsi:type="mdt:StringValue">java.lang.String</value>
-			</trait>			
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>	
-		</entity>
-		<entity id="valueChangeListener">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.MethodBindingType</value>
-			</trait>
-			<trait id="runtime-return-type">
-				<value xsi:type="mdt:StringValue">void</value>
-			</trait>			
-			<trait id="runtime-param-types">
-				<value xsi:type="mdt:StringValue">javax.faces.event.ValueChangeEvent</value>
-			</trait>	
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>	
-		</entity>	
-		<entity id="validator">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.MethodBindingType</value>
-			</trait>	
-			<trait id="runtime-return-type">
-				<value xsi:type="mdt:StringValue">void</value>
-			</trait>			
-			<trait id="runtime-param-types">
-				<value xsi:type="mdt:ListOfValues">
-					<item>javax.faces.context.FacesContext</item>
-					<item>javax.faces.component.UIComponent</item>
-					<item>java.lang.Object</item>		
-				</value>						
-			</trait>	
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>			
-		</entity>	
-	</entityGroup>
-	<entityGroup id="common-jsf-html-attributes">
-		<!-- This group will be refactored -->
-		<entity id="action">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.ActionType</value>
-			</trait>
-			<trait id="runtime-return-type">
-				<value xsi:type="mdt:StringValue">java.lang.String</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>							
-		</entity>
-		<entity id="actionListener">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.MethodBindingType</value>
-			</trait>
-			<trait id="runtime-return-type">
-				<value xsi:type="mdt:StringValue">void</value>
-			</trait>			
-			<trait id="runtime-param-types">
-				<value xsi:type="mdt:StringValue">javax.faces.event.ActionEvent</value>
-			</trait>	
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>
-		</entity>
-		<entity id="cols">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-			</trait>
-			<trait id="valid-minimum"><value xsi:type="mdt:StringValue">0</value></trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>			
-		</entity>
-		<entity id="escape">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-			</trait>
-			<trait id="default-value">
-				<value xsi:type="mdt:BooleanValue">true</value>
-			</trait>			
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>			
-		</entity>
-		<entity id="globalOnly">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-			</trait>
-			<trait id="default-value">
-				<value xsi:type="mdt:BooleanValue">false</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>			
-		</entity>		
-		<entity id="immediate">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>				
-		</entity>	
-		<entity id="readonly">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-			</trait>
-			<trait id="default-value">
-				<value xsi:type="mdt:BooleanValue">false</value>
-			</trait>			
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>			
-		</entity>		
-		<entity id="redisplay">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>				
-		</entity>
-
-		<entity id="showDetail">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-			</trait>
-			<trait id="default-value">
-				<value xsi:type="mdt:BooleanValue">true</value>
-			</trait>		
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>			
-		</entity>
-		<entity id="dalign">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-			</trait>
-			<trait id="valid-values">
-				<value xsi:type="mdt:ListOfValues">
-					<item>right</item>					
-					<item>left</item>
-					<item>center</item>
-					<item>justify</item>					
-				</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>
-		</entity>	
-		<entity id="ialign">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-			</trait>
-			<trait id="valid-values">
-				<value xsi:type="mdt:ListOfValues">
-					<item>bottom</item>
-					<item>middle</item>
-					<item>top</item>
-					<item>right</item>
-					<item>left</item>					
-				</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>
-		</entity>			
-		<entity id="linktype">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.LinkType</value>
-			</trait>
-			<trait id="valid-values">
-				<value xsi:type="mdt:ListOfValues">
-					<item>index</item>
-					<item>subsection</item>
-					<item>bookmark</item>
-					<item>start</item>
-					<item>next</item>					
-					<item>stylesheet</item>
-					<item>chapter</item>
-					<item>help</item>
-					<item>alternate</item>
-					<item>appendix</item>	
-					<item>contents</item>
-					<item>section</item>					
-					<item>prev</item>
-					<item>previous</item>
-					<item>glossary</item>
-					<item>copyright</item>				
-				</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>
-		</entity>
-		<entity id="media">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-			</trait>
-			<trait id="valid-values">
-				<value xsi:type="mdt:ListOfValues">
-					<item>tv</item>
-					<item>braille</item>
-					<item>tty</item>
-					<item>print</item>
-					<item>all</item>					
-					<item>projection</item>
-					<item>handheld</item>
-					<item>screen</item>
-					<item>aural</item>
-				</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>
-		</entity>	
-		<entity id="scope">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-			</trait>
-			<trait id="valid-values">
-				<value xsi:type="mdt:ListOfValues">
-					<item>row</item>
-					<item>col</item>
-					<item>rowgroup</item>
-					<item>colgroup</item>				
-				</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>
-		</entity>	
-	</entityGroup>
-	<entityGroup id="jsf-table-attributes">
-		<entity id="bgcolor">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-			</trait>	
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>		
-		</entity>	
-		<entity id="border">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-			</trait>
-			<trait id="valid-minimum"><value xsi:type="mdt:StringValue">0</value></trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>
-		</entity>
-		<entity id="cellpadding">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-			</trait>
-			<trait id="valid-minimum"><value xsi:type="mdt:StringValue">0</value></trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>
-		</entity>
-		<entity id="cellspacing">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-			</trait>
-			<trait id="valid-minimum"><value xsi:type="mdt:StringValue">0</value></trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>
-		</entity>
-		<entity id="columns">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-			</trait>
-			<trait id="valid-minimum">
-				<value xsi:type="mdt:StringValue">0</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>
-		</entity>
-		<entity id="columnClasses">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.CSSClassType</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>
-		</entity>		
-		<entity id="first">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-			</trait>
-			<trait id="valid-minimum">
-				<value xsi:type="mdt:StringValue">0</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>
-		</entity>
-		<entity id="footerClass">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.CSSClassType</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>
-		</entity>	
-		<entity id="frame">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-			</trait>
-			<trait id="valid-values">
-				<value xsi:type="mdt:ListOfValues">
-					<item>none</item>
-					<item>above</item>
-					<item>below</item>
-					<item>hsides</item>
-					<item>vsides</item>
-					<item>lhs</item>
-					<item>rhs</item>			
-					<item>box</item>
-					<item>border</item>	
-				</value>
-			</trait>
-			<trait id="displayed-values">
-				<value xsi:type="mdt:ListOfValues">
-					<item>%any.frame.displayed-values.none</item>
-					<item>%any.frame.displayed-values.above</item>
-					<item>%any.frame.displayed-values.below</item>
-					<item>%any.frame.displayed-values.hsides</item>
-					<item>%any.frame.displayed-values.vsides</item>
-					<item>%any.frame.displayed-values.lhs</item>
-					<item>%any.frame.displayed-values.rhs</item>			
-					<item>%any.frame.displayed-values.box</item>
-					<item>%any.frame.displayed-values.border</item>		
-				</value>	
-			</trait>
-			<trait id="default-value">
-				<value xsi:type="mdt:StringValue">none</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>			
-		</entity>			
-		<entity id="headerClass">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.CSSClassType</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>
-		</entity>
-		<entity id="rowClasses">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.CSSClassType</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>
-		</entity>
-		<entity id="rules">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-			</trait>
-			<trait id="valid-values">
-				<value xsi:type="mdt:ListOfValues">
-					<item>none</item>
-					<item>groups</item>
-					<item>rows</item>
-					<item>cols</item>
-					<item>all</item>
-				</value>
-			</trait>
-			<trait id="displayed-values">
-				<value xsi:type="mdt:ListOfValues">
-					<item>%any.rules.displayed-values.none</item>
-					<item>%any.rules.displayed-values.groups</item>
-					<item>%any.rules.displayed-values.rows</item>
-					<item>%any.rules.displayed-values.cols</item>
-					<item>%any.rules.displayed-values.all</item>	
-				</value>	
-			</trait>
-			<trait id="default-value">
-				<value xsi:type="mdt:StringValue">none</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>							
-		</entity>
-		<entity id="showSummary">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-			</trait>
-			<trait id="default-value">
-				<value xsi:type="mdt:BooleanValue">false</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>
-		</entity>
-		<entity id="summary">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>
-		</entity>
-	</entityGroup>
-	<entityGroup id="for-entity">
-		<entity id="for">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>
-		</entity>
-	</entityGroup>
-</md:metadatamodel>
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/jsf_html_dti.xml b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/jsf_html_dti.xml
deleted file mode 100644
index e4019b6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/jsf_html_dti.xml
+++ /dev/null
@@ -1,1026 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<md:metadatamodel xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" 
-	xmlns:md="http://org.eclipse.jst.jsf.common.metadata/metadata.ecore"
-	xmlns:dti="http://org.eclipse.jsf.pagedesigner/dtinfo.ecore"
-	id="http://java.sun.com/jsf/html"
-	type="tagFile">
-
-	<entity id="body" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.pagedesigner.CreateElementOperation">
-						<parameter value="div"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyChildrenOperation"/>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					needBorderDecorator="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-	<entity id="button" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.pagedesigner.CreateElementOperation">
-						<parameter value="input"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyAllAttributesOperation"/>
-					<operation id="org.eclipse.jst.pagedesigner.RenameAttributeOperation">
-						<parameter value="styleClass"/>
-						<parameter value="class"/>
-					</operation>
-					<!-- if image attribute exists -->
-					<operation id="org.eclipse.jst.pagedesigner.IfOperation">
-						<parameter value="@image"/>
-						<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-							<parameter value="type"/>
-							<parameter value="image"/>
-						</operation>
-						<operation id="org.eclipse.jst.pagedesigner.RenameAttributeOperation">
-							<parameter value="image"/>
-							<parameter value="src"/>
-						</operation>
-					</operation>
-					<!-- if image attribute does not exist -->
-					<operation id="org.eclipse.jst.pagedesigner.IfNotOperation">
-						<parameter value="@image"/>
-						<!-- create default type attribute (submit) -->
-						<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-							<parameter value="type"/>
-							<parameter value="submit"/>
-						</operation>
-						<!-- override default if type attribute is set (e.g. reset) -->
-						<!--
-							<operation id="org.eclipse.jst.pagedesigner.CopyAttributeOperation">
-								<parameter value="type"/>
-							</operation>
-						-->
-					</operation>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					multiLevel="true"
-					widget="true"
-					setNonVisualChildElements="true">
-				    <resolve-attribute-value attributeName="value"/>
-				    <resolve-attribute-value attributeName="src"/>
-				</tag-decorate-info>
-				<tag-decorate-info id="vpd-decorate-preview">
-					<resolve-attribute-value attributeName="value"/>
-					<resolve-attribute-value attributeName="src"/>
-				</tag-decorate-info>
-			</value>
-		</trait>
-	</entity>
-	<entity id="column" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.pagedesigner.jsf.ui.ColumnOperation"/>										
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					multiLevel="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="commandButton" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.pagedesigner.CreateElementOperation">
-						<parameter value="input"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyAllAttributesOperation"/>
-					<operation id="org.eclipse.jst.pagedesigner.RenameAttributeOperation">
-						<parameter value="styleClass"/>
-						<parameter value="class"/>
-					</operation>
-					<!-- if image attribute exists -->
-					<operation id="org.eclipse.jst.pagedesigner.IfOperation">
-						<parameter value="@image"/>
-						<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-							<parameter value="type"/>
-							<parameter value="image"/>
-						</operation>
-						<operation id="org.eclipse.jst.pagedesigner.RenameAttributeOperation">
-							<parameter value="image"/>
-							<parameter value="src"/>
-						</operation>
-					</operation>
-					<!-- if image attribute does not exist -->
-					<operation id="org.eclipse.jst.pagedesigner.IfNotOperation">
-						<parameter value="@image"/>
-						<!-- create default type attribute (submit) -->
-						<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-							<parameter value="type"/>
-							<parameter value="submit"/>
-						</operation>
-						<!-- override default if type attribute is set (e.g. reset) -->
-						<operation id="org.eclipse.jst.pagedesigner.CopyAttributeOperation">
-							<parameter value="type"/>
-						</operation>
-					</operation>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					multiLevel="true"
-					widget="true"
-					setNonVisualChildElements="true">
-				    <resolve-attribute-value attributeName="value"/>
-				    <resolve-attribute-value attributeName="src"/>
-				</tag-decorate-info>
-				<tag-decorate-info id="vpd-decorate-preview">
-					<resolve-attribute-value attributeName="value"/>
-					<resolve-attribute-value attributeName="src"/>
-				</tag-decorate-info>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="commandLink" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.pagedesigner.CreateElementOperation">
-						<parameter value="a"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyAllAttributesOperation"/>
-					<operation id="org.eclipse.jst.pagedesigner.RenameAttributeOperation">
-						<parameter value="styleClass"/>
-						<parameter value="class"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-						<parameter value="href"/>
-						<parameter value="#"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.ConvertAttributeToTextOperation">
-						<parameter value="value"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyChildrenOperation"/>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					multiLevel="true"
-					needBorderDecorator="true">
-					<resolve-attribute-value attributeName="value"/>
-				</tag-decorate-info>
-				<tag-decorate-info id="vpd-decorate-preview"
-					resolveChildText="true">
-					<resolve-attribute-value attributeName="value"/>
-				</tag-decorate-info>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="dataTable" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.pagedesigner.jsf.ui.DataTableOperation"/>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					multiLevel="true"
-					needBorderDecorator="true"
-					needTableDecorator="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="form" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.pagedesigner.CreateElementOperation">
-						<parameter value="form"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyAllAttributesOperation"/>
-					<operation id="org.eclipse.jst.pagedesigner.RenameAttributeOperation">
-						<parameter value="styleClass"/>
-						<parameter value="class"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyChildrenOperation"/>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					needBorderDecorator="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="graphicImage" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.pagedesigner.CreateElementOperation">
-						<parameter value="img"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyAllAttributesOperation"/>
-					<operation id="org.eclipse.jst.pagedesigner.RenameAttributeOperation">
-						<parameter value="styleClass"/>
-						<parameter value="class"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.RenameAttributeOperation">
-						<parameter value="url"/>
-						<parameter value="src"/>
-					</operation>
-					<!--
-						if both "value" and "url" source attributes exist,
-						"value" overrides "url" as destination "src" attribute
-					-->
-					<operation id="org.eclipse.jst.pagedesigner.RenameAttributeOperation">
-						<parameter value="value"/>
-						<parameter value="src"/>
-					</operation>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					multiLevel="true"
-					widget="true">
-					<resolve-attribute-value attributeName="src"/>
-					<resolve-attribute-value attributeName="value"/>
-					<resolve-attribute-value attributeName="url"/>
-				</tag-decorate-info>
-				<tag-decorate-info id="vpd-decorate-preview">
-					<resolve-attribute-value attributeName="src"/>
-					<resolve-attribute-value attributeName="value"/>
-					<resolve-attribute-value attributeName="url"/>
-				</tag-decorate-info>
-			</value>
-		</trait>
-	</entity>
-	<entity id="head" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.pagedesigner.CreateElementOperation">
-						<parameter value="div"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyChildrenOperation"/>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					needBorderDecorator="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-	<entity id="inputHidden" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-decorate-info id="vpd-decorate-design"
-					nonVisual="true"
-					nonVisualImagePath="icons/palette/JSFHTML/small/JSF_INPUTHIDDEN.gif"
-					widget="true"
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					nonVisual="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="inputSecret" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.pagedesigner.CreateElementOperation">
-						<parameter value="input"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyAllAttributesOperation"/>
-					<operation id="org.eclipse.jst.pagedesigner.RenameAttributeOperation">
-						<parameter value="styleClass"/>
-						<parameter value="class"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-						<parameter value="type"/>
-						<parameter value="password"/>
-					</operation>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					multiLevel="true"
-					widget="true"
-					setNonVisualChildElements="true"
-				/>
-				<tag-decorate-info id="vpd-decorate-preview">
-					<resolve-attribute-value attributeName="value"/>
-				</tag-decorate-info>
-				
-				<tag-decorate-info id="vpd-decorate-design">
-                    <resolve-attribute-value attributeName="value"/>
-                </tag-decorate-info>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="inputText" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.pagedesigner.CreateElementOperation">
-						<parameter value="input"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyAllAttributesOperation"/>
-					<operation id="org.eclipse.jst.pagedesigner.RenameAttributeOperation">
-						<parameter value="styleClass"/>
-						<parameter value="class"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-						<parameter value="type"/>
-						<parameter value="text"/>
-					</operation>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					multiLevel="true"
-					widget="true"
-					setNonVisualChildElements="true"
-				/>
-				<tag-decorate-info id="vpd-decorate-preview">
-					<resolve-attribute-value attributeName="value"/>
-				</tag-decorate-info>
-				
-				<tag-decorate-info id="vpd-decorate-design">
-                    <resolve-attribute-value attributeName="value"/>
-                </tag-decorate-info>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="inputTextarea" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.pagedesigner.CreateElementOperation">
-						<parameter value="textarea"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyAllAttributesOperation"/>
-					<operation id="org.eclipse.jst.pagedesigner.RenameAttributeOperation">
-						<parameter value="styleClass"/>
-						<parameter value="class"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.ConvertAttributeToTextOperation">
-						<parameter value="value"/>
-					</operation>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					multiLevel="true"
-					widget="true"
-					setNonVisualChildElements="true"
-				>
-				    <resolve-attribute-value attributeName="value"/>
-				</tag-decorate-info>
-				<tag-decorate-info id="vpd-decorate-preview"
-					resolveChildText="true"
-				>
-				    <resolve-attribute-value attributeName="value"/>
-				</tag-decorate-info>
-			</value>
-		</trait>
-	</entity>
-	
-	<entity id="link" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.pagedesigner.CreateElementOperation">
-						<parameter value="a"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyAllAttributesOperation"/>
-					<operation id="org.eclipse.jst.pagedesigner.RenameAttributeOperation">
-						<parameter value="styleClass"/>
-						<parameter value="class"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-						<parameter value="href"/>
-						<parameter value="#"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.RenameAttributeOperation">
-						<parameter value="outcome"/>
-						<parameter value="href"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.ConvertAttributeToTextOperation">
-						<parameter value="value"/>
-						<parameter value="true"/>
-					</operation>					
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					multiLevel="true"
-					needBorderDecorator="true">
-					<resolve-attribute-value attributeName="value"/> 	
-				</tag-decorate-info>
-			</value>
-		</trait>
-	</entity>
-	
-	<entity id="message" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-decorate-info id="vpd-decorate-design"
-					nonVisual="true"
-					nonVisualImagePath="icons/palette/JSFHTML/small/JSF_MESSAGE.gif"
-					widget="true"
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					nonVisual="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="messages" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-decorate-info id="vpd-decorate-design"
-					nonVisual="true"
-					nonVisualImagePath="icons/palette/JSFHTML/small/JSF_MESSAGES.gif"
-					widget="true"
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					nonVisual="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="outputFormat" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.pagedesigner.CreateElementOperation">
-						<parameter value="span"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyAllAttributesOperation"/>
-					<operation id="org.eclipse.jst.pagedesigner.RenameAttributeOperation">
-						<parameter value="styleClass"/>
-						<parameter value="class"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.ConvertAttributeToTextOperation">
-						<parameter value="value"/>
-					</operation>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					needBorderDecorator="true"
-					multiLevel="true"
-					widget="true"
-					setNonVisualChildElements="true">
-					<resolve-attribute-value attributeName="value"/> 
-				</tag-decorate-info>
-				<tag-decorate-info id="vpd-decorate-preview"
-					resolveChildText="true">
-					<resolve-attribute-value attributeName="value"/> 	
-				</tag-decorate-info>
-				
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="outputLabel" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.pagedesigner.CreateElementOperation">
-						<parameter value="label"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyAllAttributesOperation"/>
-					<operation id="org.eclipse.jst.pagedesigner.RenameAttributeOperation">
-						<parameter value="styleClass"/>
-						<parameter value="class"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.ConvertAttributeToTextOperation">
-						<parameter value="value"/>
-					</operation>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					needBorderDecorator="true"
-					multiLevel="true"
-					widget="true"
-					setNonVisualChildElements="true">
-                    <resolve-attribute-value attributeName="./text()/"/>
-				</tag-decorate-info>
-				<tag-decorate-info id="vpd-decorate-preview"
-					resolveChildText="true">
-				    <resolve-attribute-value attributeName="./text()/"/>
-				</tag-decorate-info>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="outputLink" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.pagedesigner.CreateElementOperation">
-						<parameter value="a"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyAllAttributesOperation"/>
-					<operation id="org.eclipse.jst.pagedesigner.RenameAttributeOperation">
-						<parameter value="styleClass"/>
-						<parameter value="class"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-						<parameter value="href"/>
-						<parameter value="#"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.RenameAttributeOperation">
-						<parameter value="value"/>
-						<parameter value="href"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyChildrenOperation"/>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					multiLevel="true"
-					needBorderDecorator="true">
-					<resolve-attribute-value attributeName="value"/> 
-				</tag-decorate-info>
-			</value>
-		</trait>
-	</entity>
-	<entity id="outputScript">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-decorate-info id="vpd-decorate-design"
-					nonVisual="true"
-					nonVisualImagePath="icons/palette/JSFHTML/small/JSF_OUTPUTSCRIPT.gif"
-					widget="true"					
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					nonVisual="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-	<entity id="outputStylesheet">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-decorate-info id="vpd-decorate-design"
-					nonVisual="true"
-					nonVisualImagePath="icons/palette/JSFHTML/small/JSF_OUTPUTSTYLESHEET.gif"
-					widget="true"					
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					nonVisual="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-	<entity id="outputText" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.pagedesigner.CreateElementOperation">
-						<parameter value="span"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyAllAttributesOperation"/>
-					<operation id="org.eclipse.jst.pagedesigner.RenameAttributeOperation">
-						<parameter value="styleClass"/>
-						<parameter value="class"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.ConvertAttributeToTextOperation">
-						<parameter value="value"/>
-					</operation>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					needBorderDecorator="true"
-					multiLevel="true"
-					widget="true"
-					setNonVisualChildElements="true"
-				>
-				    <resolve-attribute-value attributeName="./text()/"/>
-				</tag-decorate-info>
-				<tag-decorate-info id="vpd-decorate-preview"
-					resolveChildText="true"
-				>
-				    <resolve-attribute-value attributeName="./text()/"/>
-				</tag-decorate-info>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="panelGrid" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.pagedesigner.jsf.ui.PanelGridOperation"/>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					multiLevel="true"
-					needBorderDecorator="true"
-					needTableDecorator="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="panelGroup" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.pagedesigner.CreateElementOperation">
-						<parameter value="div"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyAllAttributesOperation"/>
-					<operation id="org.eclipse.jst.pagedesigner.RenameAttributeOperation">
-						<parameter value="styleClass"/>
-						<parameter value="class"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyChildrenOperation"/>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					multiLevel="true"
-					needBorderDecorator="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="selectBooleanCheckbox" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.pagedesigner.CreateElementOperation">
-						<parameter value="input"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyAllAttributesOperation"/>
-					<operation id="org.eclipse.jst.pagedesigner.RenameAttributeOperation">
-						<parameter value="styleClass"/>
-						<parameter value="class"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-						<parameter value="type"/>
-						<parameter value="checkbox"/>
-					</operation>
-					<!-- if value attribute exists and is "true" -->
-					<operation id="org.eclipse.jst.pagedesigner.IfOperation">
-						<parameter value="self::node()[@value='true']"/>
-						<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-							<parameter value="checked"/>
-							<parameter value="checked"/>
-						</operation>
-					</operation>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					multiLevel="true"
-					widget="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="selectManyCheckbox" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.pagedesigner.jsf.ui.SelectManyCheckboxOperation"/>						
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					multiLevel="true"
-					needBorderDecorator="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="selectManyListbox" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.pagedesigner.CreateElementOperation">
-						<parameter value="select"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyAllAttributesOperation"/>
-					<operation id="org.eclipse.jst.pagedesigner.RenameAttributeOperation">
-						<parameter value="styleClass"/>
-						<parameter value="class"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.RenameAttributeOperation">
-						<parameter value="id"/>
-						<parameter value="name"/>
-					</operation>
-					<!-- multiple select allowed -->
-					<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-						<parameter value="multiple"/>
-						<parameter value="multiple"/>
-					</operation>
-					<!-- if no "size" attribute -->
-					<operation id="org.eclipse.jst.pagedesigner.IfNotOperation">
-						<parameter value="@size"/>
-						<operation id="org.eclipse.jst.pagedesigner.CreateAttributeFromXPathOperation">
-							<parameter value="size"/>
-							<parameter value="count(selectItem)"/>
-							<parameter value="http://java.sun.com/jsf/core"/>
-							<parameter value="selectItem"/>
-						</operation>
-					</operation>
-					<!-- iterate over "selectItem" children -->
-					<operation id="org.eclipse.jst.pagedesigner.IterateOverElementsOperation">
-						<parameter value="selectItem"/>
-						<parameter value="http://java.sun.com/jsf/core"/>
-						<parameter value="selectItem"/>
-						<operation id="org.eclipse.jst.pagedesigner.AppendChildElementOperation">
-							<parameter value="option"/>
-						</operation>
-						<operation id="org.eclipse.jst.pagedesigner.CopyAttributeOperation">
-							<parameter value="itemValue"/>
-						</operation>
-						<operation id="org.eclipse.jst.pagedesigner.RenameAttributeOperation">
-							<parameter value="itemValue"/>
-							<parameter value="value"/>
-						</operation>
-						<operation id="org.eclipse.jst.pagedesigner.IfOperation">
-							<parameter value="@itemLabel"/>
-							<operation id="org.eclipse.jst.pagedesigner.AppendChildTextFromXPathOperation">
-								<parameter value="@itemLabel"/>
-							</operation>
-						</operation>
-						<operation id="org.eclipse.jst.pagedesigner.IfNotOperation">
-							<parameter value="@itemLabel"/>
-							<operation id="org.eclipse.jst.pagedesigner.IfOperation">
-								<parameter value="@value"/>
-								<operation id="org.eclipse.jst.pagedesigner.AppendChildTextFromXPathOperation">
-									<parameter value="@value"/>
-								</operation>
-							</operation>
-							<operation id="org.eclipse.jst.pagedesigner.IfNotOperation">
-								<parameter value="@value"/>
-								<operation id="org.eclipse.jst.pagedesigner.IfOperation">
-									<parameter value="@itemValue"/>
-									<operation id="org.eclipse.jst.pagedesigner.AppendChildTextFromXPathOperation">
-										<parameter value="@itemValue"/>
-									</operation>
-								</operation>
-								<operation id="org.eclipse.jst.pagedesigner.IfNotOperation">
-									<parameter value="@itemValue"/>
-									<operation id="org.eclipse.jst.pagedesigner.AppendChildTextOperation">
-										<parameter value="selectItem"/>
-									</operation>
-								</operation>
-							</operation>
-						</operation>
-						<operation id="org.eclipse.jst.pagedesigner.MakeParentElementCurrentOperation"/>
-					</operation>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					multiLevel="true"
-					widget="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="selectManyMenu" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.pagedesigner.CreateElementOperation">
-						<parameter value="select"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyAllAttributesOperation"/>
-					<operation id="org.eclipse.jst.pagedesigner.RenameAttributeOperation">
-						<parameter value="styleClass"/>
-						<parameter value="class"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.RenameAttributeOperation">
-						<parameter value="id"/>
-						<parameter value="name"/>
-					</operation>
-					<!-- multiple select allowed -->
-					<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-						<parameter value="multiple"/>
-						<parameter value="multiple"/>
-					</operation>
-					<!-- size fixed at 1 -->
-					<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-						<parameter value="size"/>
-						<parameter value="1"/>
-					</operation>
-					<!-- iterate over "selectItem" children -->
-					<operation id="org.eclipse.jst.pagedesigner.IterateOverElementsOperation">
-						<parameter value="selectItem"/>
-						<parameter value="http://java.sun.com/jsf/core"/>
-						<parameter value="selectItem"/>
-						<operation id="org.eclipse.jst.pagedesigner.AppendChildElementOperation">
-							<parameter value="option"/>
-						</operation>
-						<operation id="org.eclipse.jst.pagedesigner.CopyAttributeOperation">
-							<parameter value="itemValue"/>
-						</operation>
-						<operation id="org.eclipse.jst.pagedesigner.RenameAttributeOperation">
-							<parameter value="itemValue"/>
-							<parameter value="value"/>
-						</operation>
-						<operation id="org.eclipse.jst.pagedesigner.IfOperation">
-							<parameter value="@itemLabel"/>
-							<operation id="org.eclipse.jst.pagedesigner.AppendChildTextFromXPathOperation">
-								<parameter value="@itemLabel"/>
-							</operation>
-						</operation>
-						<operation id="org.eclipse.jst.pagedesigner.IfNotOperation">
-							<parameter value="@itemLabel"/>
-							<operation id="org.eclipse.jst.pagedesigner.IfOperation">
-								<parameter value="@value"/>
-								<operation id="org.eclipse.jst.pagedesigner.AppendChildTextFromXPathOperation">
-									<parameter value="@value"/>
-								</operation>
-							</operation>
-							<operation id="org.eclipse.jst.pagedesigner.IfNotOperation">
-								<parameter value="@value"/>
-								<operation id="org.eclipse.jst.pagedesigner.IfOperation">
-									<parameter value="@itemValue"/>
-									<operation id="org.eclipse.jst.pagedesigner.AppendChildTextFromXPathOperation">
-										<parameter value="@itemValue"/>
-									</operation>
-								</operation>
-								<operation id="org.eclipse.jst.pagedesigner.IfNotOperation">
-									<parameter value="@itemValue"/>
-									<operation id="org.eclipse.jst.pagedesigner.AppendChildTextOperation">
-										<parameter value="selectItem"/>
-									</operation>
-								</operation>
-							</operation>
-						</operation>
-						<operation id="org.eclipse.jst.pagedesigner.MakeParentElementCurrentOperation"/>
-					</operation>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					multiLevel="true"
-					widget="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="selectOneListbox" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.pagedesigner.CreateElementOperation">
-						<parameter value="select"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyAllAttributesOperation"/>
-					<operation id="org.eclipse.jst.pagedesigner.RenameAttributeOperation">
-						<parameter value="styleClass"/>
-						<parameter value="class"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.RenameAttributeOperation">
-						<parameter value="id"/>
-						<parameter value="name"/>
-					</operation>
-					<!-- if no "size" attribute -->
-					<operation id="org.eclipse.jst.pagedesigner.IfNotOperation">
-						<parameter value="@size"/>
-						<operation id="org.eclipse.jst.pagedesigner.CreateAttributeFromXPathOperation">
-							<parameter value="size"/>
-							<parameter value="count(selectItem)"/>
-							<parameter value="http://java.sun.com/jsf/core"/>
-							<parameter value="selectItem"/>
-						</operation>
-					</operation>
-					<!-- iterate over "selectItem" children -->
-					<operation id="org.eclipse.jst.pagedesigner.IterateOverElementsOperation">
-						<parameter value="selectItem"/>
-						<parameter value="http://java.sun.com/jsf/core"/>
-						<parameter value="selectItem"/>
-						<operation id="org.eclipse.jst.pagedesigner.AppendChildElementOperation">
-							<parameter value="option"/>
-						</operation>
-						<operation id="org.eclipse.jst.pagedesigner.CopyAttributeOperation">
-							<parameter value="itemValue"/>
-						</operation>
-						<operation id="org.eclipse.jst.pagedesigner.RenameAttributeOperation">
-							<parameter value="itemValue"/>
-							<parameter value="value"/>
-						</operation>
-						<operation id="org.eclipse.jst.pagedesigner.IfOperation">
-							<parameter value="@itemLabel"/>
-							<operation id="org.eclipse.jst.pagedesigner.AppendChildTextFromXPathOperation">
-								<parameter value="@itemLabel"/>
-							</operation>
-						</operation>
-						<operation id="org.eclipse.jst.pagedesigner.IfNotOperation">
-							<parameter value="@itemLabel"/>
-							<operation id="org.eclipse.jst.pagedesigner.IfOperation">
-								<parameter value="@value"/>
-								<operation id="org.eclipse.jst.pagedesigner.AppendChildTextFromXPathOperation">
-									<parameter value="@value"/>
-								</operation>
-							</operation>
-							<operation id="org.eclipse.jst.pagedesigner.IfNotOperation">
-								<parameter value="@value"/>
-								<operation id="org.eclipse.jst.pagedesigner.IfOperation">
-									<parameter value="@itemValue"/>
-									<operation id="org.eclipse.jst.pagedesigner.AppendChildTextFromXPathOperation">
-										<parameter value="@itemValue"/>
-									</operation>
-								</operation>
-								<operation id="org.eclipse.jst.pagedesigner.IfNotOperation">
-									<parameter value="@itemValue"/>
-									<operation id="org.eclipse.jst.pagedesigner.AppendChildTextOperation">
-										<parameter value="selectItem"/>
-									</operation>
-								</operation>
-							</operation>
-						</operation>
-						<operation id="org.eclipse.jst.pagedesigner.MakeParentElementCurrentOperation"/>
-					</operation>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					multiLevel="true"
-					widget="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="selectOneMenu" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.pagedesigner.CreateElementOperation">
-						<parameter value="select"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyAllAttributesOperation"/>
-					<operation id="org.eclipse.jst.pagedesigner.RenameAttributeOperation">
-						<parameter value="styleClass"/>
-						<parameter value="class"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.RenameAttributeOperation">
-						<parameter value="id"/>
-						<parameter value="name"/>
-					</operation>
-					<!-- size fixed at 1 -->
-					<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-						<parameter value="size"/>
-						<parameter value="1"/>
-					</operation>
-					<!-- iterate over "selectItem" children -->
-					<operation id="org.eclipse.jst.pagedesigner.IterateOverElementsOperation">
-						<parameter value="selectItem"/>
-						<parameter value="http://java.sun.com/jsf/core"/>
-						<parameter value="selectItem"/>
-						<operation id="org.eclipse.jst.pagedesigner.AppendChildElementOperation">
-							<parameter value="option"/>
-						</operation>
-						<operation id="org.eclipse.jst.pagedesigner.CopyAttributeOperation">
-							<parameter value="itemValue"/>
-						</operation>
-						<operation id="org.eclipse.jst.pagedesigner.RenameAttributeOperation">
-							<parameter value="itemValue"/>
-							<parameter value="value"/>
-						</operation>
-						<operation id="org.eclipse.jst.pagedesigner.IfOperation">
-							<parameter value="@itemLabel"/>
-							<operation id="org.eclipse.jst.pagedesigner.AppendChildTextFromXPathOperation">
-								<parameter value="@itemLabel"/>
-							</operation>
-						</operation>
-						<operation id="org.eclipse.jst.pagedesigner.IfNotOperation">
-							<parameter value="@itemLabel"/>
-							<operation id="org.eclipse.jst.pagedesigner.IfOperation">
-								<parameter value="@value"/>
-								<operation id="org.eclipse.jst.pagedesigner.AppendChildTextFromXPathOperation">
-									<parameter value="@value"/>
-								</operation>
-							</operation>
-							<operation id="org.eclipse.jst.pagedesigner.IfNotOperation">
-								<parameter value="@value"/>
-								<operation id="org.eclipse.jst.pagedesigner.IfOperation">
-									<parameter value="@itemValue"/>
-									<operation id="org.eclipse.jst.pagedesigner.AppendChildTextFromXPathOperation">
-										<parameter value="@itemValue"/>
-									</operation>
-								</operation>
-								<operation id="org.eclipse.jst.pagedesigner.IfNotOperation">
-									<parameter value="@itemValue"/>
-									<operation id="org.eclipse.jst.pagedesigner.AppendChildTextOperation">
-										<parameter value="selectItem"/>
-									</operation>
-								</operation>
-							</operation>
-						</operation>
-						<operation id="org.eclipse.jst.pagedesigner.MakeParentElementCurrentOperation"/>
-					</operation>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					multiLevel="true"
-					widget="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="selectOneRadio" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.pagedesigner.jsf.ui.SelectOneRadioOperation"/>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					multiLevel="true"
-					needBorderDecorator="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-</md:metadatamodel>
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/jsf_html_pi.properties b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/jsf_html_pi.properties
deleted file mode 100644
index e47787e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/jsf_html_pi.properties
+++ /dev/null
@@ -1,42 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2008 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-JSFHTML.display-label=JSF HTML
-body.display-label=Body
-button.display-label=Button
-commandButton.display-label=Command Button
-commandLink.display-label=Command Link
-dataTable.display-label=Data Table
-form.display-label=Form
-graphicImage.display-label=Graphic Image
-head.display-label=Head
-inputHidden.display-label=Hidden Input
-inputSecret.display-label=Secret Input
-inputText.display-label=Text Input
-inputTextarea.display-label=Textarea Input
-link.display-label=Link
-message.display-label=Message
-messages.display-label=Messages
-outputFormat.display-label=Output Format
-outputLabel.display-label=Output Label
-outputLink.display-label=Output Link
-outputScript.display-label=Output Script
-outputStylesheet.display-label=Output Stylesheet
-outputText.display-label=Output Text
-panelGrid.display-label=Panel Grid
-panelGroup.display-label=Panel Group
-selectBooleanCheckbox.display-label=Select Boolean Checkbox
-selectManyCheckbox.display-label=Select Many Checkbox
-selectManyListbox.display-label=Select Many Listbox
-selectManyMenu.display-label=Select Many Menu
-selectOneListbox.display-label=Select One Listbox
-selectOneMenu.display-label=Select One Menu
-selectOneRadio.display-label=Select One Radio
-column.display-label=Column
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/jsf_html_pi.xml b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/jsf_html_pi.xml
deleted file mode 100644
index b53e715..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/jsf_html_pi.xml
+++ /dev/null
@@ -1,529 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<md:metadatamodel 
-	xmlns:md="http://org.eclipse.jst.jsf.common.metadata/metadata.ecore" 
-	xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" 
-	xmlns:mdt="http://org.eclipse.jst.jsf.common.metadata/metadataTraitTypes.ecore" 
-	xmlns:pi="http://org.eclipse.jsf.pagedesigner/paletteInfos.ecore" 
-	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
-	id="http://java.sun.com/jsf/html" 
-	type="tagFile">
-	
-	<trait id="is-jsf-component-library">
-		<value xsi:type="mdt:BooleanValue">true</value>
-	</trait>
-	
-	<trait id="paletteInfos">
-		<value xsi:type="pi:PaletteInfos">
-			<item id="outputLabel"/>
-			<item id="inputText"/>
-			<item id="commandButton"/>
-			<item id="button"/>
-			<item id="inputTextarea"/>
-			<item id="outputText"/>
-			<item id="form"/>
-			<item id="head"/>
-			<item id="body"/>
-			<item id="inputHidden"/>
-			<item id="inputSecret"/>
-			<item id="column"/>
-			<item id="commandLink"/>
-			<item id="link"/>
-			<item id="message"/>			
-			<item id="messages"/>
-			<item id="outputFormat"/>
-			<item id="outputLink"/>
-			<item id="outputScript"/>
-			<item id="outputStylesheet"/>
-			<item id="panelGrid"/>
-			<item id="panelGroup"/>
-			<item id="selectBooleanCheckbox"/>
-			<item id="selectManyCheckbox"/>
-			<item id="selectManyListbox"/>
-			<item id="selectManyMenu"/>
-			<item id="selectOneListbox"/>
-			<item id="selectOneMenu"/>
-			<item id="selectOneRadio"/>
-			<item id="dataTable"/>
-			<item id="graphicImage"/>
-		</value>
-	</trait>
-	
-	<trait id="images-base-path">
-		<value xsi:type="mdt:StringValue">/icons/palette/JSFHTML/</value>
-	</trait>
-
-	<trait id="display-label">
-		<value xsi:type="mdt:StringValue">%JSFHTML.display-label</value>
-	</trait>
-	
-	<entity id="button" type="tag">	
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%button.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_BUTTON.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_BUTTON.gif</value>
-		</trait>
-	</entity>	
-	<entity id="body" type="tag">	
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%body.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_BODY.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_BODY.gif</value>
-		</trait>
-	</entity>
-		
-	<entity id="commandButton" type="tag">	
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%commandButton.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_COMMANDBUTTON.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_COMMANDBUTTON.gif</value>
-		</trait>
-		<trait id="requires-html-form">
-			<value xsi:type="mdt:BooleanValue">true</value>
-		</trait>	
-	</entity>
-	<entity id="commandLink" type="tag">		
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%commandLink.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_COMMANDLINK.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_COMMANDLINK.gif</value>
-		</trait>
-		<trait id="requires-html-form">
-			<value xsi:type="mdt:BooleanValue">true</value>
-		</trait>	
-		<trait id="tag-create">
-			<value xsi:type="pi:TagCreationInfo">
-				<template><![CDATA[
-					<outputText value="CommandLink"
-					_uri_="http://java.sun.com/jsf/html" />
-				]]></template>
-			</value>
-		</trait>		
-	</entity>
-	<entity id="dataTable" type="tag">
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%dataTable.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_DATATABLE.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_DATATABLE.gif</value>
-		</trait>	
-		<trait id="tag-create">
-			<value xsi:type="pi:TagCreationInfo">
-				<template><![CDATA[ 
-				<column id="column1"
-					_uri_="http://java.sun.com/jsf/html">
-					<facet name="header"
-						_uri_="http://java.sun.com/jsf/core">
-						<outputText value="column1"
-							_uri_="http://java.sun.com/jsf/html" />
-					</facet>
-				</column>
-				<column id="column2"
-					_uri_="http://java.sun.com/jsf/html">
-					<facet name="header"
-						_uri_="http://java.sun.com/jsf/core">
-						<outputText value="column2"
-							_uri_="http://java.sun.com/jsf/html" />
-					</facet>
-				</column>
-				]]></template>
-				<attribute id="border" value="1"/>
-			</value>
-		</trait>
-	</entity>
-	<entity id="form" type="tag">
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%form.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_FORM.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_FORM.gif</value>
-		</trait>	
-	</entity>
-
-	<entity id="graphicImage" type="tag">
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%graphicImage.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_GRAPHICIMAGE.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_GRAPHICIMAGE.gif</value>
-		</trait>		
-	</entity>
-	<entity id="head" type="tag">	
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%head.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_HEAD.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_HEAD.gif</value>
-		</trait>
-	</entity>	
-	<entity id="inputHidden" type="tag">
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%inputHidden.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_INPUTHIDDEN.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_INPUTHIDDEN.gif</value>
-		</trait>	
-		<trait id="requires-html-form">
-			<value xsi:type="mdt:BooleanValue">true</value>
-		</trait>	
-	</entity>
-	<entity id="inputSecret" type="tag">
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%inputSecret.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_INPUTSECRET.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_INPUTSECRET.gif</value>
-		</trait>	
-		<trait id="requires-html-form">
-			<value xsi:type="mdt:BooleanValue">true</value>
-		</trait>
-	</entity>
-	<entity id="inputText" type="tag">
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%inputText.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_INPUTTEXT.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_INPUTTEXT.gif</value>
-		</trait>
-		<trait id="requires-html-form">
-			<value xsi:type="mdt:BooleanValue">true</value>
-		</trait>
-	</entity>
-	<entity id="inputTextarea" type="tag">
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%inputTextarea.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_INPUTTEXTAREA.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_INPUTTEXTAREA.gif</value>
-		</trait>
-		<trait id="requires-html-form">
-			<value xsi:type="mdt:BooleanValue">true</value>
-		</trait>
-	</entity>
-	<entity id="link" type="tag">		
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%link.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_LINK.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_LINK.gif</value>
-		</trait>
-		<trait id="requires-html-form">
-			<value xsi:type="mdt:BooleanValue">true</value>
-		</trait>	
-		<trait id="tag-create">
-			<value xsi:type="pi:TagCreationInfo">
-				<template><![CDATA[
-					<outputText value="Link"
-					_uri_="http://java.sun.com/jsf/html" />
-				]]></template>
-			</value>
-		</trait>		
-	</entity>	
-	<entity id="message" type="tag">
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%message.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_MESSAGE.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_MESSAGE.gif</value>
-		</trait>
-	</entity>
-	<entity id="messages" type="tag">
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%messages.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_MESSAGES.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_MESSAGES.gif</value>
-		</trait>	
-	</entity>
-	<entity id="outputFormat" type="tag">
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%outputFormat.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_OUTPUTFORMAT.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_OUTPUTFORMAT.gif</value>
-		</trait>	
-		<trait id="tag-create">
-			<value xsi:type="pi:TagCreationInfo">
-				<template><![CDATA[
-					<param value=""
-						_uri_="http://java.sun.com/jsf/core" />
-					]]>
-				</template>
-				<attribute id="value" value="outputFormat"/>
-			</value>			
-		</trait>
-	</entity>
-	<entity id="outputLabel" type="tag">		
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%outputLabel.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_OUTPUTLABEL.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_OUTPUTLABEL.gif</value>
-		</trait>		
- 		<trait id="tag-create">
- 			<value xsi:type="pi:TagCreationInfo">
-				<attribute id="value" value="outputLabel"/>
- 			</value>
- 		</trait>
-	</entity>
-	<entity id="outputLink" type="tag">
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%outputLink.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_OUTPUTLINK.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_OUTPUTLINK.gif</value>
-		</trait>
-		<trait id="tag-create">
-			<value xsi:type="pi:TagCreationInfo">
-				<attribute id="value" value="somePage.jsf"></attribute>
-				<template><![CDATA[
-				<outputText value="outputLink"
-					_uri_="http://java.sun.com/jsf/html" />
-				]]></template>
-
-			</value>
-		</trait>			
-	</entity>
-	<entity id="outputScript" type="tag">	
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%outputScript.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_OUTPUTSCRIPT.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_OUTPUTSCRIPT.gif</value>
-		</trait>
-	</entity>
-	<entity id="outputStylesheet" type="tag">	
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%outputStylesheet.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_OUTPUTSTYLESHEET.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_OUTPUTSTYLESHEET.gif</value>
-		</trait>
-	</entity>	
-	<entity id="outputText" type="tag">
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%outputText.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_OUTPUTTEXT.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_OUTPUTTEXT.gif</value>
-		</trait>			
-		<trait id="tag-create">
-			<value xsi:type="pi:TagCreationInfo">
-				<attribute id="value" value="outputText"/>
-			</value>
-		</trait>
-	</entity>
-	<entity id="panelGrid" type="tag">
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%panelGrid.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_PANELGRID.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_PANELGRID.gif</value>
-		</trait>
-		<trait id="tag-create">
-			<value xsi:type="pi:TagCreationInfo">
-				<template><![CDATA[
-				<outputText value="item1"
-					_uri_="http://java.sun.com/jsf/html" />
-				<outputText value="item2"
-					_uri_="http://java.sun.com/jsf/html" />
-				<outputText value="item3"
-					_uri_="http://java.sun.com/jsf/html" />
-				<outputText value="item4"
-					_uri_="http://java.sun.com/jsf/html" />
-				]]></template>
-				<attribute id="border" value="1"/>
-				<attribute id="columns" value="2"/>
-			</value>
-		</trait>					
-	</entity>
-	<entity id="panelGroup" type="tag">
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%panelGroup.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_PANELGROUP.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_PANELGROUP.gif</value>
-		</trait>	
-	</entity>
-	<entity id="selectBooleanCheckbox" type="tag">
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%selectBooleanCheckbox.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_SELECTBOOLEANCHECKBOX.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_SELECTBOOLEANCHECKBOX.gif</value>
-		</trait>
-		<trait id="requires-html-form">
-			<value xsi:type="mdt:BooleanValue">true</value>
-		</trait>
-	</entity>
-	<entity id="selectManyCheckbox" type="tag">
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%selectManyCheckbox.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_SELECTMANYCHECKBOX.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_SELECTMANYCHECKBOX.gif</value>
-		</trait>
-		<trait id="requires-html-form">
-			<value xsi:type="mdt:BooleanValue">true</value>
-		</trait>
-	</entity>
-	<entity id="selectManyListbox" type="tag">
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%selectManyListbox.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_SELECTMANYLISTBOX.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_SELECTMANYLISTBOX.gif</value>
-		</trait>	
-		<trait id="requires-html-form">
-			<value xsi:type="mdt:BooleanValue">true</value>
-		</trait>
-	</entity>
-	<entity id="selectManyMenu" type="tag">
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%selectManyMenu.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_SELECTMANYMENU.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_SELECTMANYMENU.gif</value>
-		</trait>		
-		<trait id="requires-html-form">
-			<value xsi:type="mdt:BooleanValue">true</value>
-		</trait>
-	</entity>
-	<entity id="selectOneListbox" type="tag">
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%selectOneListbox.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_SELECTONELISTBOX.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_SELECTONELISTBOX.gif</value>
-		</trait>		
-		<trait id="requires-html-form">
-			<value xsi:type="mdt:BooleanValue">true</value>
-		</trait>
-	</entity>
-	<entity id="selectOneMenu" type="tag">
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%selectOneMenu.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_SELECTONEMENU.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_SELECTONEMENU.gif</value>
-		</trait>
-		<trait id="requires-html-form">
-			<value xsi:type="mdt:BooleanValue">true</value>
-		</trait>
-	</entity>
-	<entity id="selectOneRadio" type="tag">
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%selectOneRadio.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_SELECTONERADIO.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_SELECTONERADIO.gif</value>
-		</trait>
-		<trait id="requires-html-form">
-			<value xsi:type="mdt:BooleanValue">true</value>
-		</trait>
-	</entity>
-	<entity id="column" type="tag">
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%column.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_COLUMN.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_COLUMN.gif</value>
-		</trait>		
-	</entity>
-</md:metadatamodel>
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/jsp11.properties b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/jsp11.properties
deleted file mode 100644
index 33b2269..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/jsp11.properties
+++ /dev/null
@@ -1,60 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2008 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-plugin.display-label=Plugin
-plugin.description=Causes the execution of an applet or bean. The applet or bean executes in the specified plugin. If the plugin is not available, displays a dialog to initiate the download of the plugin software
-
-fallback.display-label=Fallback
-fallback.description=The element provides a message for the user if the plugin does not start
-
-root.display-label=Root
-root.description=Defines standard elements and namespace attributes of tag libraries
-
-text.display-label=Text
-text.description=Encloses template data
-
-expression.display-label=Expression
-expression.description=Contains an expression valid in the scripting language used in the page
-
-scriptlet.display-label=Scriptlet
-scriptlet.description=Contains a code fragment valid in the scripting language used in the page
-
-declaration.display-label=Declaration
-declaration.description=Declares a variable or method valid in the scripting language used in the page
-
-forward.display-label=Forward
-forward.description=Forwards a request to an HTML file, JSP page, or servlet
-
-param.display-label=Param
-param.description=The element passes the name and value of a parameter to the resource
-
-params.display-label=Params
-params.description=The element sends parameter names and values to an applet or Bean at startup
-
-include.display-label=Include
-include.description=Includes a static resource or the result from another web component
-
-useBean.display-label=UseBean
-useBean.description=Instantiates or references a bean with a specific name and scope
-
-getProperty.display-label=GetProperty
-getProperty.description=Inserts the value of a bean property into the response
-
-setProperty.display-label=SetProperty
-setProperty.description=Sets a bean property value or values
-
-directive.include.display-label=Directive.Include
-directive.include.description=Includes a resource of text or code when the JSP page is translated
-
-directive.page.display-label=Directive.Page
-directive.page.description=Defines attributes that apply to an entire JSP page
-
-directive.taglib.display-label=Directive.Taglib
-directive.taglib.description=Defines a tag library and prefix for the custom tags used in the JSP page
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/jsp11.xml b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/jsp11.xml
deleted file mode 100644
index 307888b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/jsp11.xml
+++ /dev/null
@@ -1,284 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<md:metadatamodel 
-	xmlns:md="http://org.eclipse.jst.jsf.common.metadata/metadata.ecore" 
-	xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" 
-	xmlns:mdt="http://org.eclipse.jst.jsf.common.metadata/metadataTraitTypes.ecore" 
-	xmlns:pi="http://org.eclipse.jsf.pagedesigner/paletteInfos.ecore" 
-	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
-	id="jsp11" 
-	type="tagFile">
-	
-	<trait id="paletteInfos">
-		<value xsi:type="pi:PaletteInfos">
-			<item id="jsp:directive.include"/>
-			<item id="jsp:directive.taglib"/>
-			<item id="jsp:expression"/>
-			<item id="jsp:declaration"/>
-			<item id="jsp:useBean"/>
-			<item id="jsp:getProperty"/>
-			<item id="jsp:setProperty"/>
-			<item id="jsp:include"/>
-			<item id="jsp:text"/>
-			<item id="jsp:root"/>
-			<item id="jsp:forward"/>
-			<item id="jsp:param"/>
-			<item id="jsp:params"/>
-			<item id="jsp:plugin"/>
-			<item id="jsp:fallback"/>
-			<item id="jsp:scriptlet"/>
-			<item id="jsp:directive.page"/>			
-		</value>
-	</trait>
-
-	<trait id="images-base-path">
-		<value xsi:type="mdt:StringValue">$nl$/icons/palette/JSP</value>
-	</trait>
-
-	<trait id="display-label">
-		<value xsi:type="mdt:StringValue">JSP</value>
-	</trait>
-	
-	<entity id="jsp:directive.include">
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%directive.include.display-label</value>
-		</trait>
-		<trait id="description">
-			<value xsi:type="mdt:StringValue">%directive.include.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSP_DIRECTIVE.INCLUDE.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSP_DIRECTIVE.INCLUDE.gif</value>
-		</trait>
-	</entity>
-	<entity id="jsp:directive.page">
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%directive.page.display-label</value>
-		</trait>
-		<trait id="description">
-			<value xsi:type="mdt:StringValue">%directive.page.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSP_DIRECTIVE.PAGE.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSP_DIRECTIVE.PAGE.gif</value>
-		</trait>
-	</entity>	
-
-	<entity id="jsp:directive.taglib">
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%directive.taglib.display-label</value>
-		</trait>
-		<trait id="description">
-			<value xsi:type="mdt:StringValue">%directive.taglib.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSP_DIRECTIVE.TAGLIB.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSP_DIRECTIVE.TAGLIB.gif</value>
-		</trait>
-	</entity>	
-	<entity id="jsp:expression">
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%expression.display-label</value>
-		</trait>
-		<trait id="description">
-			<value xsi:type="mdt:StringValue">%expression.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSP_EXPRESSION.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSP_EXPRESSION.gif</value>
-		</trait>
-	</entity>	
-	<entity id="jsp:declaration">
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%declaration.display-label</value>
-		</trait>
-		<trait id="description">
-			<value xsi:type="mdt:StringValue">%declaration.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSP_DECLARATION.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSP_DECLARATION.gif</value>
-		</trait>
-	</entity>	
-	<entity id="jsp:useBean">
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%useBean.display-label</value>
-		</trait>
-		<trait id="description">
-			<value xsi:type="mdt:StringValue">%useBean.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSP_USEBEAN.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSP_USEBEAN.gif</value>
-		</trait>
-	</entity>	
-		
-	<entity id="jsp:getProperty">
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%getProperty.display-label</value>
-		</trait>
-		<trait id="description">
-			<value xsi:type="mdt:StringValue">%getProperty.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSP_GETPROPERTY.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSP_GETPROPERTY.gif</value>
-		</trait>
-	</entity>	
-
-	<entity id="jsp:setProperty">
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%setProperty.display-label</value>
-		</trait>
-		<trait id="description">
-			<value xsi:type="mdt:StringValue">%setProperty.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSP_SETPROPERTY.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSP_SETPROPERTY.gif</value>
-		</trait>
-	</entity>	
-	<entity id="jsp:include">
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%include.display-label</value>
-		</trait>
-		<trait id="description">
-			<value xsi:type="mdt:StringValue">%include.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSP_INCLUDE.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSP_INCLUDE.gif</value>
-		</trait>
-	</entity>	
-	
-	<entity id="jsp:text">
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%text.display-label</value>
-		</trait>
-		<trait id="description">
-			<value xsi:type="mdt:StringValue">%text.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSP_TEXT.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSP_TEXT.gif</value>
-		</trait>
-	</entity>	
-	<entity id="jsp:root">
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%root.display-label</value>
-		</trait>
-		<trait id="description">
-			<value xsi:type="mdt:StringValue">%root.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSP_ROOT.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSP_ROOT.gif</value>
-		</trait>
-	</entity>	
-	<entity id="jsp:forward">
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%forward.display-label</value>
-		</trait>
-		<trait id="description">
-			<value xsi:type="mdt:StringValue">%forward.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSP_FORWARD.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSP_FORWARD.gif</value>
-		</trait>
-	</entity>	
-	
-	<entity id="jsp:param">
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%param.display-label</value>
-		</trait>
-		<trait id="description">
-			<value xsi:type="mdt:StringValue">%param.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSP_PARAM.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSP_PARAM.gif</value>
-		</trait>
-	</entity>	
-	<entity id="jsp:params">
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%params.display-label</value>
-		</trait>
-		<trait id="description">
-			<value xsi:type="mdt:StringValue">%params.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSP_PARAMS.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSP_PARAMS.gif</value>
-		</trait>
-	</entity>		
-	<entity id="jsp:plugin">
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%plugin.display-label</value>
-		</trait>
-		<trait id="description">
-			<value xsi:type="mdt:StringValue">%plugin.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSP_PLUGIN.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSP_PLUGIN.gif</value>
-		</trait>
-	</entity>	
-	<entity id="jsp:fallback">
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%fallback.display-label</value>
-		</trait>
-		<trait id="description">
-			<value xsi:type="mdt:StringValue">%fallback.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSP_FALLBACK.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSP_FALLBACK.gif</value>
-		</trait>
-	</entity>
-	<entity id="jsp:scriptlet">
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%scriptlet.display-label</value>
-		</trait>
-		<trait id="description">
-			<value xsi:type="mdt:StringValue">%scriptlet.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSP_SCRIPTLET.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSP_SCRIPTLET.gif</value>
-		</trait>
-	</entity>	
-</md:metadatamodel>
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/symbolInfoMetadata.xml b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/symbolInfoMetadata.xml
deleted file mode 100644
index b23af83..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/symbolInfoMetadata.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<md:metadatamodel 
-	xmlns:md="http://org.eclipse.jst.jsf.common.metadata/metadata.ecore" 
-	xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" 
-	xmlns:mdt="http://org.eclipse.jst.jsf.common.metadata/metadataTraitTypes.ecore" 
-	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
-	id="http://java.sun.com/jsf/core" 
-	type="tagFile">
-	
-
-	<entity id="view" type="tag">
-		<entity id="locale">
-			<trait id="sets-locale">
-				<value xsi:type="mdt:BooleanValue">true</value>
-			</trait>
-		</entity>
-	</entity>
-</md:metadatamodel>
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/viewMappings_core.xml b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/viewMappings_core.xml
deleted file mode 100644
index d85f9c0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/viewMappings_core.xml
+++ /dev/null
@@ -1,236 +0,0 @@
-<?xml version="1.0" encoding="ASCII"?>
-<md:metadatamodel xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:viewMap="http://org.eclipse.jst.jsf.core/componentMapping.ecore" xsi:noNamespaceSchemaLocation="http://org.eclipse.jst.jsf.core/componentMapping.ecore" xmlns:md="http://org.eclipse.jst.jsf.common.metadata/metadata.ecore" id="http://java.sun.com/jsf/core" type="tagFile">
-  <entity id="view" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>javax.faces.component.UIViewRoot</className>
-            <superClasses>javax.faces.component.UIComponentBase</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>javax.faces.ViewRoot</componentType>
-            <componentFamily>javax.faces.ViewRoot</componentFamily>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="validateBean" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ValidatorTypeInfo_">
-            <className>javax.faces.validator.BeanValidator</className>
-            <validatorId>javax.faces.Bean</validatorId>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="validateDoubleRange" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ValidatorTypeInfo_">
-            <className>javax.faces.validator.DoubleRangeValidator</className>
-            <validatorId>javax.faces.DoubleRange</validatorId>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="validateLongRange" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ValidatorTypeInfo_">
-            <className>javax.faces.validator.LongRangeValidator</className>
-            <validatorId>javax.faces.LongRange</validatorId>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="validateRegex" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ValidatorTypeInfo_">
-            <className>javax.faces.validator.RegexValidator</className>
-            <validatorId>javax.faces.RegularExpression</validatorId>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity> 
-  <entity id="validateRequired" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ValidatorTypeInfo_">
-            <className>javax.faces.validator.RequiredValidator</className>
-            <validatorId>javax.faces.Required</validatorId>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>     
-  <entity id="subview" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>javax.faces.component.UINamingContainer</className>
-            <superClasses>javax.faces.component.UIComponentBase</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <interfaces>javax.faces.component.NamingContainer</interfaces>
-            <componentType>javax.faces.NamingContainer</componentType>
-            <componentFamily>javax.faces.NamingContainer</componentFamily>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="converter" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ConverterTypeInfo_"/>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="convertNumber" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ConverterTypeInfo_">
-            <className>javax.faces.convert.NumberConverter</className>
-            <converterId>javax.faces.Number</converterId>
-            <forClass>java.lang.Number</forClass>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="validateLongRange" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ValidatorTypeInfo_">
-            <className>javax.faces.validator.LongRangeValidator</className>
-            <validatorId>javax.faces.LongRange</validatorId>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="validateLength" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ValidatorTypeInfo_">
-            <className>javax.faces.validator.LengthValidator</className>
-            <validatorId>javax.faces.Length</validatorId>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="convertDateTime" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ConverterTypeInfo_">
-            <className>javax.faces.convert.DateTimeConverter</className>
-            <converterId>javax.faces.DateTime</converterId>
-            <forClass>java.util.Date</forClass>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="validator" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ValidatorTypeInfo_"/>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="verbatim" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>javax.faces.component.UIOutput</className>
-            <superClasses>javax.faces.component.UIComponentBase</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <interfaces>javax.faces.component.ValueHolder</interfaces>
-            <componentType>javax.faces.Output</componentType>
-            <componentFamily>javax.faces.Output</componentFamily>
-            <renderType>javax.faces.Text</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="selectItem" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>javax.faces.component.UISelectItem</className>
-            <superClasses>javax.faces.component.UIComponentBase</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>javax.faces.SelectItem</componentType>
-            <componentFamily>javax.faces.SelectItem</componentFamily>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="selectItems" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>javax.faces.component.UISelectItems</className>
-            <superClasses>javax.faces.component.UIComponentBase</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>javax.faces.SelectItems</componentType>
-            <componentFamily>javax.faces.SelectItems</componentFamily>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="param" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>javax.faces.component.UIParameter</className>
-            <superClasses>javax.faces.component.UIComponentBase</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>javax.faces.Parameter</componentType>
-            <componentFamily>javax.faces.Parameter</componentFamily>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-</md:metadatamodel>
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/viewMappings_html.xml b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/viewMappings_html.xml
deleted file mode 100644
index 9c94c71..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/viewMappings_html.xml
+++ /dev/null
@@ -1,558 +0,0 @@
-<?xml version="1.0" encoding="ASCII"?>
-<md:metadatamodel xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:viewMap="http://org.eclipse.jst.jsf.core/componentMapping.ecore" xmlns:md="http://org.eclipse.jst.jsf.common.metadata/metadata.ecore" xsi:noNamespaceSchemaLocation="http://org.eclipse.jst.jsf.core/componentMapping.ecore" id="http://java.sun.com/jsf/html" type="tagFile">
-  <entity id="selectOneMenu" type="tag">
-    <include-entity-group id="common-valueholder-attributes"/>
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>javax.faces.component.html.HtmlSelectOneMenu</className>
-            <superClasses>javax.faces.component.UISelectOne</superClasses>
-            <superClasses>javax.faces.component.UIInput</superClasses>
-            <superClasses>javax.faces.component.UIOutput</superClasses>
-            <superClasses>javax.faces.component.UIComponentBase</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.EditableValueHolder</interfaces>
-            <interfaces>javax.faces.component.ValueHolder</interfaces>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>javax.faces.HtmlSelectOneMenu</componentType>
-            <componentFamily>javax.faces.SelectOne</componentFamily>
-            <renderType>javax.faces.Menu</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="selectManyListbox" type="tag">
-      <include-entity-group id="common-valueholder-attributes"/>
-      <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>javax.faces.component.html.HtmlSelectManyListbox</className>
-            <superClasses>javax.faces.component.UISelectMany</superClasses>
-            <superClasses>javax.faces.component.UIInput</superClasses>
-            <superClasses>javax.faces.component.UIOutput</superClasses>
-            <superClasses>javax.faces.component.UIComponentBase</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.EditableValueHolder</interfaces>
-            <interfaces>javax.faces.component.ValueHolder</interfaces>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>javax.faces.HtmlSelectManyListbox</componentType>
-            <componentFamily>javax.faces.SelectMany</componentFamily>
-            <renderType>javax.faces.Listbox</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="form" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>javax.faces.component.html.HtmlForm</className>
-            <superClasses>javax.faces.component.UIForm</superClasses>
-            <superClasses>javax.faces.component.UIComponentBase</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.NamingContainer</interfaces>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>javax.faces.HtmlForm</componentType>
-            <componentFamily>javax.faces.Form</componentFamily>
-            <renderType>javax.faces.Form</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="message" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>javax.faces.component.html.HtmlMessage</className>
-            <superClasses>javax.faces.component.UIMessage</superClasses>
-            <superClasses>javax.faces.component.UIComponentBase</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>javax.faces.HtmlMessage</componentType>
-            <componentFamily>javax.faces.Message</componentFamily>
-            <renderType>javax.faces.Message</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="graphicImage" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>javax.faces.component.html.HtmlGraphicImage</className>
-            <superClasses>javax.faces.component.UIGraphic</superClasses>
-            <superClasses>javax.faces.component.UIComponentBase</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>javax.faces.HtmlGraphicImage</componentType>
-            <componentFamily>javax.faces.Graphic</componentFamily>
-            <renderType>javax.faces.Image</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="column" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>javax.faces.component.UIColumn</className>
-            <superClasses>javax.faces.component.UIComponentBase</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>javax.faces.Column</componentType>
-            <componentFamily>javax.faces.Column</componentFamily>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="outputFormat" type="tag">
-    <include-entity-group id="common-valueholder-attributes"/>
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <beanMappedProperties>value</beanMappedProperties>
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>javax.faces.component.html.HtmlOutputFormat</className>
-            <superClasses>javax.faces.component.UIOutput</superClasses>
-            <superClasses>javax.faces.component.UIComponentBase</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.ValueHolder</interfaces>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>javax.faces.HtmlOutputFormat</componentType>
-            <componentFamily>javax.faces.Output</componentFamily>
-            <renderType>javax.faces.Format</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="selectManyMenu" type="tag">
-   <include-entity-group id="common-valueholder-attributes"/>
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>javax.faces.component.html.HtmlSelectManyMenu</className>
-            <superClasses>javax.faces.component.UISelectMany</superClasses>
-            <superClasses>javax.faces.component.UIInput</superClasses>
-            <superClasses>javax.faces.component.UIOutput</superClasses>
-            <superClasses>javax.faces.component.UIComponentBase</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.EditableValueHolder</interfaces>
-            <interfaces>javax.faces.component.ValueHolder</interfaces>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>javax.faces.HtmlSelectManyMenu</componentType>
-            <componentFamily>javax.faces.SelectMany</componentFamily>
-            <renderType>javax.faces.Menu</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="selectOneRadio" type="tag">
-      <include-entity-group id="common-valueholder-attributes"/>
-      <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>javax.faces.component.html.HtmlSelectOneRadio</className>
-            <superClasses>javax.faces.component.UISelectOne</superClasses>
-            <superClasses>javax.faces.component.UIInput</superClasses>
-            <superClasses>javax.faces.component.UIOutput</superClasses>
-            <superClasses>javax.faces.component.UIComponentBase</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.EditableValueHolder</interfaces>
-            <interfaces>javax.faces.component.ValueHolder</interfaces>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>javax.faces.HtmlSelectOneRadio</componentType>
-            <componentFamily>javax.faces.SelectOne</componentFamily>
-            <renderType>javax.faces.Radio</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="panelGroup" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>javax.faces.component.html.HtmlPanelGroup</className>
-            <superClasses>javax.faces.component.UIPanel</superClasses>
-            <superClasses>javax.faces.component.UIComponentBase</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>javax.faces.HtmlPanelGroup</componentType>
-            <componentFamily>javax.faces.Panel</componentFamily>
-            <renderType>javax.faces.Group</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="selectOneListbox" type="tag">
-    <include-entity-group id="common-valueholder-attributes"/>
-      <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>javax.faces.component.html.HtmlSelectOneListbox</className>
-            <superClasses>javax.faces.component.UISelectOne</superClasses>
-            <superClasses>javax.faces.component.UIInput</superClasses>
-            <superClasses>javax.faces.component.UIOutput</superClasses>
-            <superClasses>javax.faces.component.UIComponentBase</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.EditableValueHolder</interfaces>
-            <interfaces>javax.faces.component.ValueHolder</interfaces>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>javax.faces.HtmlSelectOneListbox</componentType>
-            <componentFamily>javax.faces.SelectOne</componentFamily>
-            <renderType>javax.faces.Listbox</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="commandButton" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>javax.faces.component.html.HtmlCommandButton</className>
-            <superClasses>javax.faces.component.UICommand</superClasses>
-            <superClasses>javax.faces.component.UIComponentBase</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.ActionSource</interfaces>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>javax.faces.HtmlCommandButton</componentType>
-            <componentFamily>javax.faces.Command</componentFamily>
-            <renderType>javax.faces.Button</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="inputText" type="tag">
-    <include-entity-group id="common-valueholder-attributes"/>
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>javax.faces.component.html.HtmlInputText</className>
-            <superClasses>javax.faces.component.UIInput</superClasses>
-            <superClasses>javax.faces.component.UIOutput</superClasses>
-            <superClasses>javax.faces.component.UIComponentBase</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.EditableValueHolder</interfaces>
-            <interfaces>javax.faces.component.ValueHolder</interfaces>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>javax.faces.HtmlInputText</componentType>
-            <componentFamily>javax.faces.Input</componentFamily>
-            <renderType>javax.faces.Text</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="dataTable" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>javax.faces.component.html.HtmlDataTable</className>
-            <superClasses>javax.faces.component.UIData</superClasses>
-            <superClasses>javax.faces.component.UIComponentBase</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.NamingContainer</interfaces>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>javax.faces.HtmlDataTable</componentType>
-            <componentFamily>javax.faces.Data</componentFamily>
-            <renderType>javax.faces.Table</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="selectBooleanCheckbox" type="tag">
-      <include-entity-group id="common-valueholder-attributes"/>
-      <trait id="viewElementMapping">
-       <md:value xsi:type="viewMap:TagMapping">
-         <versionedTagToViewMappings>
-           <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-             <className>javax.faces.component.html.HtmlSelectBooleanCheckbox</className>
-             <superClasses>javax.faces.component.UISelectBoolean</superClasses>
-             <superClasses>javax.faces.component.UIInput</superClasses>
-             <superClasses>javax.faces.component.UIOutput</superClasses>
-             <superClasses>javax.faces.component.UIComponentBase</superClasses>
-             <superClasses>javax.faces.component.UIComponent</superClasses>
-             <superClasses>java.lang.Object</superClasses>
-             <interfaces>javax.faces.component.EditableValueHolder</interfaces>
-             <interfaces>javax.faces.component.ValueHolder</interfaces>
-             <interfaces>javax.faces.component.StateHolder</interfaces>
-             <componentType>javax.faces.HtmlSelectBooleanCheckbox</componentType>
-             <componentFamily>javax.faces.SelectBoolean</componentFamily>
-             <renderType>javax.faces.Checkbox</renderType>
-           </typeInfo>
-         </versionedTagToViewMappings>
-       </md:value>
-    </trait>
-  </entity>
-  <entity id="outputText" type="tag">
-    <include-entity-group id="common-valueholder-attributes"/>
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>javax.faces.component.html.HtmlOutputText</className>
-            <superClasses>javax.faces.component.UIOutput</superClasses>
-            <superClasses>javax.faces.component.UIComponentBase</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.ValueHolder</interfaces>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>javax.faces.HtmlOutputText</componentType>
-            <componentFamily>javax.faces.Output</componentFamily>
-            <renderType>javax.faces.Text</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="selectManyCheckbox" type="tag">
-    <include-entity-group id="common-valueholder-attributes"/>
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>javax.faces.component.html.HtmlSelectManyCheckbox</className>
-            <superClasses>javax.faces.component.UISelectMany</superClasses>
-            <superClasses>javax.faces.component.UIInput</superClasses>
-            <superClasses>javax.faces.component.UIOutput</superClasses>
-            <superClasses>javax.faces.component.UIComponentBase</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.EditableValueHolder</interfaces>
-            <interfaces>javax.faces.component.ValueHolder</interfaces>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>javax.faces.HtmlSelectManyCheckbox</componentType>
-            <componentFamily>javax.faces.SelectMany</componentFamily>
-            <renderType>javax.faces.Checkbox</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="inputSecret" type="tag">
-    <include-entity-group id="common-valueholder-attributes"/>
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>javax.faces.component.html.HtmlInputSecret</className>
-            <superClasses>javax.faces.component.UIInput</superClasses>
-            <superClasses>javax.faces.component.UIOutput</superClasses>
-            <superClasses>javax.faces.component.UIComponentBase</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.EditableValueHolder</interfaces>
-            <interfaces>javax.faces.component.ValueHolder</interfaces>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>javax.faces.HtmlInputSecret</componentType>
-            <componentFamily>javax.faces.Input</componentFamily>
-            <renderType>javax.faces.Secret</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="panelGrid" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>javax.faces.component.html.HtmlPanelGrid</className>
-            <superClasses>javax.faces.component.UIPanel</superClasses>
-            <superClasses>javax.faces.component.UIComponentBase</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>javax.faces.HtmlPanelGrid</componentType>
-            <componentFamily>javax.faces.Panel</componentFamily>
-            <renderType>javax.faces.Grid</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="commandLink" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>javax.faces.component.html.HtmlCommandLink</className>
-            <superClasses>javax.faces.component.UICommand</superClasses>
-            <superClasses>javax.faces.component.UIComponentBase</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.ActionSource</interfaces>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>javax.faces.HtmlCommandLink</componentType>
-            <componentFamily>javax.faces.Command</componentFamily>
-            <renderType>javax.faces.Link</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="inputHidden" type="tag">
-    <include-entity-group id="common-valueholder-attributes"/>
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>javax.faces.component.html.HtmlInputHidden</className>
-            <superClasses>javax.faces.component.UIInput</superClasses>
-            <superClasses>javax.faces.component.UIOutput</superClasses>
-            <superClasses>javax.faces.component.UIComponentBase</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.EditableValueHolder</interfaces>
-            <interfaces>javax.faces.component.ValueHolder</interfaces>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>javax.faces.HtmlInputHidden</componentType>
-            <componentFamily>javax.faces.Input</componentFamily>
-            <renderType>javax.faces.Hidden</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="inputTextarea" type="tag">
-    <include-entity-group id="common-valueholder-attributes"/>
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>javax.faces.component.html.HtmlInputTextarea</className>
-            <superClasses>javax.faces.component.UIInput</superClasses>
-            <superClasses>javax.faces.component.UIOutput</superClasses>
-            <superClasses>javax.faces.component.UIComponentBase</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.EditableValueHolder</interfaces>
-            <interfaces>javax.faces.component.ValueHolder</interfaces>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>javax.faces.HtmlInputTextarea</componentType>
-            <componentFamily>javax.faces.Input</componentFamily>
-            <renderType>javax.faces.Textarea</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="outputLabel" type="tag">
-    <include-entity-group id="common-valueholder-attributes"/>
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>javax.faces.component.html.HtmlOutputLabel</className>
-            <superClasses>javax.faces.component.UIOutput</superClasses>
-            <superClasses>javax.faces.component.UIComponentBase</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.ValueHolder</interfaces>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>javax.faces.HtmlOutputLabel</componentType>
-            <componentFamily>javax.faces.Output</componentFamily>
-            <renderType>javax.faces.Label</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="outputLink" type="tag">
-    <include-entity-group id="common-valueholder-attributes"/>
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>javax.faces.component.html.HtmlOutputLink</className>
-            <superClasses>javax.faces.component.UIOutput</superClasses>
-            <superClasses>javax.faces.component.UIComponentBase</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.ValueHolder</interfaces>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>javax.faces.HtmlOutputLink</componentType>
-            <componentFamily>javax.faces.Output</componentFamily>
-            <renderType>javax.faces.Link</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="messages" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>javax.faces.component.html.HtmlMessages</className>
-            <superClasses>javax.faces.component.UIMessages</superClasses>
-            <superClasses>javax.faces.component.UIComponentBase</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>javax.faces.HtmlMessages</componentType>
-            <componentFamily>javax.faces.Messages</componentFamily>
-            <renderType>javax.faces.Messages</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entityGroup id="common-valueholder-attributes">
-      <entity id="value">
-        <trait id="attributeMapping">
-            <md:value xsi:type="viewMap:AttributeToPropertyMapping">
-                <propertyName>value</propertyName>
-                <elAllowed>true</elAllowed>
-            </md:value>
-        </trait>
-      </entity>
-      <entity id="converter">
-        <trait id="attributeMapping">
-            <md:value xsi:type="viewMap:AttributeToPropertyMapping">
-                <customConversionFactoryId>org.eclipse.jst.jsf.core.valueHolderAttributeMapper</customConversionFactoryId>
-                <elAllowed>true</elAllowed>
-            </md:value>
-        </trait>
-      </entity>
-  </entityGroup>
-</md:metadatamodel>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/plugin.properties b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/plugin.properties
deleted file mode 100644
index 4ab821a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/plugin.properties
+++ /dev/null
@@ -1,27 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-
-
-# ====================================================================
-# To code developer:
-#   Do NOT change the properties between this line and the
-#   "%%% END OF TRANSLATED PROPERTIES %%%" line.
-#   Make a new property name, append to the end of the file and change
-#   the code to use the new property.
-# ====================================================================
-
-# ====================================================================
-# %%% END OF TRANSLATED PROPERTIES %%%
-# ====================================================================
-
-pluginName = JavaServer Faces Tools - Taglibrary Metadata
-pluginProvider = Eclipse.org
-
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/plugin.xml b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/plugin.xml
deleted file mode 100644
index cebf482..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/plugin.xml
+++ /dev/null
@@ -1,57 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.2"?>
-<plugin>
-   <extension
-         point="org.eclipse.jst.jsf.common.standardMetaDataFiles">
-      <standardMetaDataFile
-          location="$nl$/metadata/html.xml"
-          uri="HTML"/>            
-      <standardMetaDataFile
-          location="$nl$/metadata/jsp11.xml"
-          uri="JSP11"/>         
-      <standardMetaDataFile
-            location="$nl$/metadata/jsf_html.xml"
-            uri="http://java.sun.com/jsf/html"/>
-      <standardMetaDataFile
-            location="$nl$/metadata/jsf_html_pi.xml"
-            uri="http://java.sun.com/jsf/html"/>  
-      <standardMetaDataFile
-            location="$nl$/metadata/jsf_html_dti.xml"
-            uri="http://java.sun.com/jsf/html"/>
-      <standardMetaDataFile
-            location="$nl$/metadata/jsf_core.xml"
-            uri="http://java.sun.com/jsf/core"/>
-      <standardMetaDataFile
-            location="$nl$/metadata/jsf_core_pi.xml"
-            uri="http://java.sun.com/jsf/core"/>      
-      <standardMetaDataFile
-            location="$nl$/metadata/jsf_core_dti.xml"
-            uri="http://java.sun.com/jsf/core"/>
-      <standardMetaDataFile
-            location="$nl$/metadata/symbolInfoMetadata.xml"
-            uri="http://java.sun.com/jsf/core"/>
-      <standardMetaDataFile
-            location="$nl$/metadata/viewMappings_core.xml"
-            uri="http://java.sun.com/jsf/core">
-      </standardMetaDataFile>
-      <standardMetaDataFile
-            location="$nl$/metadata/viewMappings_html.xml"
-            uri="http://java.sun.com/jsf/html">
-      </standardMetaDataFile>
-      <standardMetaDataFile
-            location="$nl$/metadata/facelet_composite.xml"
-            uri="http://java.sun.com/jsf/composite">
-      </standardMetaDataFile>
-      <standardMetaDataFile
-            location="$nl$/metadata/facelet_ui.xml"
-            uri="http://java.sun.com/jsf/facelets">
-      </standardMetaDataFile>            
-   </extension>
-   <!--    <extension point="org.eclipse.emf.ecore.generated_package">
-        <package 
-            uri = "http://org.eclipse.jst.jsf.facelet.core/additionalTagMetadata.ecore" 
-            class = "org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AddTagMDPackage"
-            genModel = "model/additionalTagMetadata.genmodel" />  
-     </extension> -->
-   
-</plugin>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/src/org/eclipse/jst/jsf/standard/tagsupport/StandardTagSupportPlugin.java b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/src/org/eclipse/jst/jsf/standard/tagsupport/StandardTagSupportPlugin.java
deleted file mode 100644
index ed631da..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/src/org/eclipse/jst/jsf/standard/tagsupport/StandardTagSupportPlugin.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.standard.tagsupport;
-
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.osgi.framework.BundleContext;
-
-/**
- * The activator class controls the plug-in life cycle
- */
-public class StandardTagSupportPlugin extends AbstractUIPlugin {
-
-	/**
-	 * the plugin id
-	 */
-	public static final String PLUGIN_ID = "org.eclipse.jst.jsf.standard.tagsupport"; //$NON-NLS-1$
-
-	// The shared instance
-	private static StandardTagSupportPlugin plugin;
-	
-	/**
-	 * The constructor
-	 */
-	public StandardTagSupportPlugin() {
-        // do nothing
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
-	 */
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-		plugin = this;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
-	 */
-	public void stop(BundleContext context) throws Exception {
-		plugin = null;
-		super.stop(context);
-	}
-
-	/**
-	 * Returns the shared instance
-	 *
-	 * @return the shared instance
-	 */
-	public static StandardTagSupportPlugin getDefault() {
-		return plugin;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/.classpath b/jsf/plugins/org.eclipse.jst.jsf.ui/.classpath
deleted file mode 100644
index 304e861..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/.cvsignore b/jsf/plugins/org.eclipse.jst.jsf.ui/.cvsignore
deleted file mode 100644
index 117a1fe..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/.cvsignore
+++ /dev/null
@@ -1,5 +0,0 @@
-bin
-@dot*
-temp.folder
-build.xml
-javaCompiler...args
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/.options b/jsf/plugins/org.eclipse.jst.jsf.ui/.options
deleted file mode 100644
index 9b36101..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/.options
+++ /dev/null
@@ -1,6 +0,0 @@
-# Debugging options for the org.eclipse.jst.jsf.core
-
-# Turn on general debugging for the org.eclipse.jsf.ui plugin.
-org.eclipse.jst.jsf.ui/debug=false
-
-org.eclipse.jst.jsf.ui/metadatagen=false
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/.project b/jsf/plugins/org.eclipse.jst.jsf.ui/.project
deleted file mode 100644
index 45f845d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.jst.jsf.ui</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/.settings/org.eclipse.core.resources.prefs b/jsf/plugins/org.eclipse.jst.jsf.ui/.settings/org.eclipse.core.resources.prefs
deleted file mode 100644
index c8e6e65..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/.settings/org.eclipse.core.resources.prefs
+++ /dev/null
@@ -1,4 +0,0 @@
-#Sun May 27 16:04:34 EDT 2007
-eclipse.preferences.version=1
-encoding//src/org/eclipse/jst/jsf/ui/internal/messages.properties=8859_1
-encoding/<project>=ISO-8859-1
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/.settings/org.eclipse.jdt.core.prefs b/jsf/plugins/org.eclipse.jst.jsf.ui/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index e644043..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,82 +0,0 @@
-#Mon Jun 30 15:56:47 PDT 2008
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.5
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.doc.comment.support=enabled
-org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.autoboxing=warning
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=ignore
-org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
-org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
-org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
-org.eclipse.jdt.core.compiler.problem.invalidJavadoc=error
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocComments=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.missingJavadocTags=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=error
-org.eclipse.jdt.core.compiler.problem.nullReference=ignore
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
-org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore
-org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=ignore
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=ignore
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=error
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=error
-org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
-org.eclipse.jdt.core.compiler.problem.unusedLocal=error
-org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
-org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
-org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.5
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/.settings/org.eclipse.jdt.ui.prefs b/jsf/plugins/org.eclipse.jst.jsf.ui/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644
index 39df095..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,3 +0,0 @@
-#Tue Apr 10 09:49:42 PDT 2007
-eclipse.preferences.version=1
-org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8"?><templates/>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/.settings/org.eclipse.pde.prefs b/jsf/plugins/org.eclipse.jst.jsf.ui/.settings/org.eclipse.pde.prefs
deleted file mode 100644
index 93451e5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/.settings/org.eclipse.pde.prefs
+++ /dev/null
@@ -1,22 +0,0 @@
-#Fri May 30 11:57:15 PDT 2008
-compilers.f.unresolved-features=1
-compilers.f.unresolved-plugins=1
-compilers.incompatible-environment=1
-compilers.p.build=1
-compilers.p.deprecated=1
-compilers.p.discouraged-class=1
-compilers.p.internal=1
-compilers.p.missing-packages=0
-compilers.p.no-required-att=0
-compilers.p.not-externalized-att=0
-compilers.p.unknown-attribute=1
-compilers.p.unknown-class=1
-compilers.p.unknown-element=1
-compilers.p.unknown-identifier=1
-compilers.p.unknown-resource=1
-compilers.p.unresolved-ex-points=0
-compilers.p.unresolved-import=0
-compilers.s.create-docs=false
-compilers.s.doc-folder=doc
-compilers.s.open-tags=1
-eclipse.preferences.version=1
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/META-INF/MANIFEST.MF b/jsf/plugins/org.eclipse.jst.jsf.ui/META-INF/MANIFEST.MF
deleted file mode 100644
index 5e36b69..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,46 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %plugin.name
-Bundle-SymbolicName: org.eclipse.jst.jsf.ui; singleton:=true
-Bundle-Version: 1.3.0.qualifier
-Bundle-Activator: org.eclipse.jst.jsf.ui.internal.JSFUiPlugin
-Bundle-Vendor: %plugin.provider
-Bundle-Localization: plugin
-Require-Bundle: org.eclipse.jst.jsf.core;bundle-version="[1.1.0,2.0.0)",
- org.eclipse.wst.common.project.facet.ui;bundle-version="[1.1.0,2.0.0)",
- org.eclipse.core.resources;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.jdt.core;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.jdt.ui;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.jst.j2ee;bundle-version="[1.1.0,1.2.0)",
- org.eclipse.wst.common.frameworks.ui;bundle-version="[1.1.0,2.0.0)",
- org.eclipse.jst.jsf.common;bundle-version="[1.0.0,2.0.0)",
- org.eclipse.jface.text;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.wst.xml.core;bundle-version="[1.1.0,1.2.0)",
- org.eclipse.wst.xml.ui;bundle-version="[1.0.100,1.2.0)",
- org.eclipse.wst.sse.ui;bundle-version="[1.0.101,1.3.0)",
- org.eclipse.emf.ecore;bundle-version="[2.2.0,3.0.0)",
- org.eclipse.jst.jsp.ui;bundle-version="[1.1.0,1.3.0)",
- org.eclipse.ui.forms;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.wst.sse.core;bundle-version="[1.0.101,1.2.0)",
- org.eclipse.ui.forms;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.jst.jsf.common.runtime;bundle-version="[1.0.0,2.0.0)",
- org.eclipse.jst.jsp.core;bundle-version="[1.1.0,2.0.0)",
- org.eclipse.wst.validation;bundle-version="[1.1.0,2.0.0)",
- org.eclipse.jst.jsf.common.ui;bundle-version="[1.0.1,2.0.0)",
- org.eclipse.ui.ide;bundle-version="[3.4.0,4.0.0)",
- org.eclipse.jst.common.project.facet.ui;bundle-version="[1.3.1,2.0.0)",
- org.eclipse.jst.common.project.facet.core;bundle-version="[1.3.100,2.0.0)"
-Bundle-ActivationPolicy: lazy
-Export-Package: org.eclipse.jst.jsf.ui.internal;x-friends:="org.eclipse.jst.jsf.ui.tests",
- org.eclipse.jst.jsf.ui.internal.classpath;x-friends:="org.eclipse.jst.jsf.ui.tests",
- org.eclipse.jst.jsf.ui.internal.common;x-internal:=true,
- org.eclipse.jst.jsf.ui.internal.component;x-internal:=true,
- org.eclipse.jst.jsf.ui.internal.contentassist;x-internal:=true,
- org.eclipse.jst.jsf.ui.internal.contentassist.el;x-internal:=true,
- org.eclipse.jst.jsf.ui.internal.jsflibraryconfig;x-internal:=true,
- org.eclipse.jst.jsf.ui.internal.jspeditor;x-internal:=true,
- org.eclipse.jst.jsf.ui.internal.preferences;x-internal:=true,
- org.eclipse.jst.jsf.ui.internal.project.facet;x-friends:="org.eclipse.jst.jsf.ui.tests",
- org.eclipse.jst.jsf.ui.internal.tagregistry;x-internal:=true,
- org.eclipse.jst.jsf.ui.internal.validation;x-internal:=true
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/about.html b/jsf/plugins/org.eclipse.jst.jsf.ui/about.html
deleted file mode 100644
index 8e56059..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/about.html
+++ /dev/null
@@ -1,22 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<head>
-<title>About</title>
-<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>June, 2008</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise indicated below, the Content is provided to you under the terms and conditions of the
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content.</p>
-
-</body>
-</html>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/build.properties b/jsf/plugins/org.eclipse.jst.jsf.ui/build.properties
deleted file mode 100644
index 15be5d2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/build.properties
+++ /dev/null
@@ -1,21 +0,0 @@
-###############################################################################
-# Copyright (c) 2005 Oracle Corporation.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#    Gerry Kessler - initial API and implementation
-###############################################################################
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               .,\
-               plugin.xml,\
-               icons/,\
-               plugin.properties,\
-               about.html,\
-               .options
-javacSource=1.5
-javacTarget=1.5
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/icons/attr_val.gif b/jsf/plugins/org.eclipse.jst.jsf.ui/icons/attr_val.gif
deleted file mode 100644
index d4cb425..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/icons/attr_val.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/icons/full/wizban/addlibrary_wiz.gif b/jsf/plugins/org.eclipse.jst.jsf.ui/icons/full/wizban/addlibrary_wiz.gif
deleted file mode 100644
index 128c9d1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/icons/full/wizban/addlibrary_wiz.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/icons/obj16/jar_l_obj.gif b/jsf/plugins/org.eclipse.jst.jsf.ui/icons/obj16/jar_l_obj.gif
deleted file mode 100644
index 6cb185c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/icons/obj16/jar_l_obj.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/icons/obj16/jar_obj.gif b/jsf/plugins/org.eclipse.jst.jsf.ui/icons/obj16/jar_obj.gif
deleted file mode 100644
index 2fa1d77..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/icons/obj16/jar_obj.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/icons/obj16/library_obj.gif b/jsf/plugins/org.eclipse.jst.jsf.ui/icons/obj16/library_obj.gif
deleted file mode 100644
index cb55e33..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/icons/obj16/library_obj.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/icons/sample.gif b/jsf/plugins/org.eclipse.jst.jsf.ui/icons/sample.gif
deleted file mode 100644
index 34fb3c9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/icons/sample.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/plugin.properties b/jsf/plugins/org.eclipse.jst.jsf.ui/plugin.properties
deleted file mode 100644
index f31e526..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/plugin.properties
+++ /dev/null
@@ -1,44 +0,0 @@
-###############################################################################
-# Copyright (c) 2005, 2006 Oracle Corporation.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#    Gerry Kessler - initial API and implementation
-###############################################################################
-plugin.name=JavaServer Faces Tools - UI
-plugin.provider=Eclipse.org
-EL_Hyperlinkdetector_name=JSP EL Hyperlink Detector
-
-jsf.library.reference=JSF Library References
-jsf.library.wizard.name=JSF Library
-
-preferencepage.jsfvalidation.name=Validation
-preferencepage.jsf.name=JavaServer Faces Tools
-
-jsf.ui.views.category.name=JavaServer Faces
-
-jsf.ui.views.componentview.name=JSF Component Tree
-jsf.ui.views.jsftagregistry.name=Tag Registry
-
-JSFNonELAttributeValueValidator=JSF View Validator
-JSFAppConfigValidator=JSF Application Configuration Validator
-JSPSemanticsValidatorMarker=JSF Problem
-
-View_Preference_Root=Views
-JSP_Tag_Registry_Preferences=JSP Tag Registry
-
-NewJSFPage_html=New JavaServer Faces (JSF) Page (html)
-NewJSFPage_xhtml=New JavaServer Faces (JSF) Page (xhtml)
-NewJSFPage_xhtml_xmlsyntax=New JavaServer Faces (JSF) Page (xhtml, xml syntax)
-
-NewJSFPage_html_description=JSP with html markup and default view setup
-NewJSFPage_xhtml_description=JSP with xhtml markup and default view setup
-NewJSFPage_xhtml_xmlsyntax_description=JSP with xhtml markup, xml style syntax and default view setup
-
-NewELExpression=New JSF EL Expression
-NewELExpression_description=Create a new attribute value with #{}
-
-jsf.library.property.page = Java Server Faces
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/plugin.xml b/jsf/plugins/org.eclipse.jst.jsf.ui/plugin.xml
deleted file mode 100644
index 255e992..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/plugin.xml
+++ /dev/null
@@ -1,326 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin>
-  <!-- JSF Project Facet --> 
-  <extension
-        point="org.eclipse.ui.preferencePages">
-     <page
-           category="org.eclipse.jst.jsf.ui.JSFRootPage"
-           class="org.eclipse.jst.jsf.ui.internal.validation.JSFValidationPreferencePage"
-           id="org.eclipse.jst.jsf.ui.JSFValidationPage"
-           name="%preferencepage.jsfvalidation.name"/>
-     <page
-           category="org.eclipse.wst.html.ui.preferences.web"
-           class="org.eclipse.jst.jsf.ui.internal.preferences.EmptyRootPreferencePage"
-           id="org.eclipse.jst.jsf.ui.JSFRootPage"
-           name="%preferencepage.jsf.name">
-     </page>
-     <page
-           category="org.eclipse.jst.jsf.ui.viewRoot"
-           class="org.eclipse.jst.jsf.ui.internal.preferences.JSPTagRegistryPreferencePage"
-           id="org.eclipse.jst.jsf.ui.jspTagRegistry"
-           name="%JSP_Tag_Registry_Preferences">
-     </page>
-     <page
-           category="org.eclipse.jst.jsf.ui.JSFRootPage"
-           class="org.eclipse.jst.jsf.ui.internal.preferences.EmptyRootPreferencePage"
-           id="org.eclipse.jst.jsf.ui.viewRoot"
-           name="%View_Preference_Root">
-     </page>
-  </extension>
-  
-  <extension point="org.eclipse.ui.propertyPages">
-    <page
-          adaptable="true"
-          category="org.eclipse.wst.common.project.facet.ui.FacetsPropertyPage"
-          class="org.eclipse.jst.jsf.ui.internal.project.facet.JSFLibraryPropertyPage"
-          id="org.eclipse.jst.jsf.ui.internal.project.facet.JSFLibraryPropertyPage"
-          name="%jsf.library.property.page"
-          objectClass="org.eclipse.core.resources.IProject">
-      <enabledWhen>
-        <adapt type="org.eclipse.core.resources.IProject">
-          <test 
-            forcePluginActivation="true"
-            property="org.eclipse.wst.common.project.facet.core.projectFacet"
-            value="jst.jsf"/>
-        </adapt>
-      </enabledWhen>          
-    </page>
-  </extension>
-
-  <extension 
-        point="org.eclipse.wst.common.project.facet.ui.wizardPages">
-     <wizard-pages action="jst.jsf.v11.install">
-        <page class="org.eclipse.jst.jsf.ui.internal.project.facet.JSFFacetInstallPage"/>
-     </wizard-pages>
-     <wizard-pages action="jst.jsf.v12.install">
-        <page class="org.eclipse.jst.jsf.ui.internal.project.facet.JSFFacetInstallPage"/>
-     </wizard-pages>
-     <wizard-pages
-           action="jst.jsf.v20.install">
-        <page
-              class="org.eclipse.jst.jsf.ui.internal.project.facet.JSFFacetInstallPage">
-        </page>
-     </wizard-pages>
-  </extension>  
-  
-  <extension point="org.eclipse.wst.sse.ui.editorConfiguration"> 
-	<sourceViewerConfiguration
-            class="org.eclipse.jst.jsp.ui.StructuredTextViewerConfigurationJSP"
-            target="org.eclipse.jst.jsp.core.jspsource"/>
-                <provisionalConfiguration 
-                        type="contentassistprocessor" 
-                        class="org.eclipse.jst.jsf.ui.internal.contentassist.el.JSFELContentAssistProcessor" 
-                        target="org.eclipse.jst.jsp.SCRIPT.JSP_EL2" /> 
-                <provisionalConfiguration 
-                        type="contentassistprocessor" 
-                        class="org.eclipse.jst.jsf.ui.internal.contentassist.JSFContentAssistProcessor" 
-                        target="org.eclipse.jst.jsp.JSP_DEFAULT,org.eclipse.jst.jsp.JSP_DIRECTIVE" />
-    <documentationTextHover
-          class="org.eclipse.jst.jsf.ui.internal.jspeditor.JSFELHover"
-          target="org.eclipse.jst.jsp.SCRIPT.JSP_EL2">
-    </documentationTextHover>
-    </extension> 
-    <extension point="org.eclipse.wst.sse.ui.sourcevalidation">
-		<validator
-			scope="partial"
-			class="org.eclipse.jst.jsf.ui.internal.validation.JSFValidator"
-			id="org.eclipse.jst.jsf.validation.JSFAttributeValueValidator">
-			<contentTypeIdentifier
-				id="org.eclipse.jst.jsp.core.jspsource">
-				<partitionType id="org.eclipse.jst.jsp.DEFAULT_JSP">
-				</partitionType>
-				<partitionType id="org.eclipse.jst.jsp.JSP_DIRECTIVE">
-				</partitionType>
-				<partitionType id="org.eclipse.jst.jsp.SCRIPT.JSP_EL2">
-				</partitionType>
-			</contentTypeIdentifier>
-		</validator>
-	</extension>
-    <extension
-          point="org.eclipse.ui.workbench.texteditor.hyperlinkDetectors">
-       <hyperlinkDetector
-             class="org.eclipse.jst.jsf.ui.internal.jspeditor.JSPELHyperlinkDetector"
-             id="org.eclipse.jst.jsf.ui.elhyperlinkdetector"
-             name="%EL_Hyperlinkdetector_name"
-             targetId="org.eclipse.jst.jsp.core.jspsource">
-       </hyperlinkDetector>
-    </extension>
-
-   <extension
-         point="org.eclipse.ui.views">
-      <category
-            name="%jsf.ui.views.category.name"
-            id="org.eclipse.jst.jsf.ui.view.category">
-      </category>
-      <view
-            name="%jsf.ui.views.componentview.name"
-            category="org.eclipse.jst.jsf.ui.view.category"
-            class="org.eclipse.jst.jsf.ui.internal.component.ComponentTreeView"
-            id="org.eclipse.jst.jsf.ui.component.ComponentTreeView">
-      </view>
-      <view
-            category="org.eclipse.jst.jsf.ui.view.category"
-            class="org.eclipse.jst.jsf.ui.internal.tagregistry.TagRegistryView"
-            icon="icons/obj16/library_obj.gif"
-            id="org.eclipse.jst.jsf.ui.tagregistry.TagRegistryView"
-            name="%jsf.ui.views.jsftagregistry.name">
-      </view>
-   </extension>
-   
-   <extension
-        id="JSPSemanticsValidatorMarker"
-        name="%JSPSemanticsValidatorMarker"
-        point="org.eclipse.core.resources.markers">
-      <super
-            type="org.eclipse.wst.validation.problemmarker">
-      </super>
-    </extension>
-
-   <extension
-         id="JSFNonELAttributeValueValidator"
-         name="%JSFNonELAttributeValueValidator"
-         point="org.eclipse.wst.validation.validatorV2">
-      <validator
-            build="true"
-            class="org.eclipse.jst.jsf.ui.internal.validation.JSFValidator"
-            manual="true"
-            markerId="org.eclipse.jst.jsf.ui.JSPSemanticsValidatorMarker"
-            sourceid="org.eclipse.jst.jsf.validation.JSFAttributeValueValidator"
-            version="1">
-         <include>
-            <rules>
-               <facet
-                     id="jst.java">
-               </facet>
-            </rules>
-         </include>
-         <include>
-            <rules>
-               <facet
-                     id="jst.web">
-               </facet>
-            </rules>
-         </include>
-         <include>
-            <rules>
-               <facet
-                     id="jst.jsf">
-               </facet>
-            </rules>
-         </include>
-         <include>
-            <rules>
-               <projectNature
-                     id="org.eclipse.wst.common.modulecore.ModuleCoreNature">
-               </projectNature>
-            </rules>
-         </include>
-         <include>
-            <rules>
-               <projectNature
-                     id="org.eclipse.jdt.core.javanature">
-               </projectNature>
-            </rules>
-         </include>
-         <include>
-            <rules>
-               <contentType
-                     exactMatch="false"
-                     id="org.eclipse.jst.jsp.core.jspsource">
-               </contentType>
-               <contentType
-                     exactMatch="true"
-                     id="org.eclipse.jst.jsp.core.jspfragmentsource">
-               </contentType>
-            </rules>
-         </include>
-         <group
-               id="org.eclipse.wst.sse.core.structuredModelGroup">
-         </group>
-      </validator>
-   </extension>
-
-   <extension id="JSFAppConfigValidator" name="%JSFAppConfigValidator" point="org.eclipse.wst.validation.validatorV2">
-      <validator
-            build="true"
-            class="org.eclipse.jst.jsf.validation.internal.appconfig.AppConfigValidator"
-            manual="true"
-            markerId="org.eclipse.jst.jsf.ui.JSPSemanticsValidatorMarker"
-            version="1">
-         <include>
-            <rules>
-				<projectNature id="org.eclipse.wst.common.modulecore.ModuleCoreNature"/>
-            </rules>
-         </include>
-         <include>
-            <rules>
-				<projectNature id="org.eclipse.jdt.core.javanature"/>
-            </rules>
-         </include>
-         <include>
-            <rules>
-				<contentType id="org.eclipse.jst.jsf.facesconfig.facesConfigFile" exactMatch="true" />
-            </rules>
-         </include>
-      </validator>
-   </extension>
-
-    <extension
-          point="org.eclipse.ui.editors.templates">
-       <template
-             autoinsert="true"
-             contextTypeId="jsp_new"
-             description="%NewJSFPage_html_description"
-             id="org.eclipse.jst.jsf.ui.new_jsf_page_html"
-             name="%NewJSFPage_html">
-          <pattern>
-             &lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=${encoding}&quot; pageEncoding=&quot;${encoding}&quot;%&gt;
-&lt;%@ taglib prefix=&quot;f&quot;  uri=&quot;http://java.sun.com/jsf/core&quot;%&gt;
-&lt;%@ taglib prefix=&quot;h&quot;  uri=&quot;http://java.sun.com/jsf/html&quot;%&gt;
-&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD HTML 4.01 Transitional//EN&quot; &quot;http://www.w3.org/TR/html4/loose.dtd&quot;&gt;
-&lt;html&gt;
-&lt;head&gt;
-&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=${encoding}&quot;&gt;
-&lt;title&gt;Insert title here&lt;/title&gt;
-&lt;/head&gt;
-&lt;body&gt;
-&lt;f:view&gt;
-${cursor}
-&lt;/f:view&gt;
-&lt;/body&gt;
-&lt;/html&gt;
-          </pattern>
-       </template>
-      
-       <template
-             autoinsert="true"
-             contextTypeId="jsp_new"
-             description="%NewJSFPage_xhtml_xmlsyntax_description"
-             id="org.eclipse.jst.jsf.ui.new_jsf_page_html_xhtml_xmllsyntax"
-             name="%NewJSFPage_xhtml_xmlsyntax">
-          <pattern>
-             &lt;?xml version=&quot;1.0&quot; encoding=&quot;ISO-8859-1&quot; ?&gt;
-&lt;jsp:root xmlns:jsp=&quot;http://java.sun.com/JSP/Page&quot; xmlns:f=&quot;http://java.sun.com/jsf/core&quot; xmlns:h=&quot;http://java.sun.com/jsf/html&quot; version=&quot;2.0&quot;&gt;
-    &lt;jsp:directive.page language=&quot;java&quot;
-        contentType=&quot;text/html; charset=ISO-8859-1&quot; pageEncoding=&quot;ISO-8859-1&quot; /&gt;
-    &lt;jsp:text&gt;
-        &lt;![CDATA[ &lt;?xml version=&quot;1.0&quot; encoding=&quot;ISO-8859-1&quot; ?&gt; ]]&gt;
-    &lt;/jsp:text&gt;
-    &lt;jsp:text&gt;
-        &lt;![CDATA[ &lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&gt; ]]&gt;
-    &lt;/jsp:text&gt;
-&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&gt;
-&lt;head&gt;
-&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=ISO-8859-1&quot; /&gt;
-&lt;title&gt;Insert title here&lt;/title&gt;
-&lt;/head&gt;
-&lt;body&gt;
-&lt;f:view&gt;
-${cursor}
-&lt;/f:view&gt;
-&lt;/body&gt;
-&lt;/html&gt;
-&lt;/jsp:root&gt;
-             
-             
-             
-          </pattern>
-       </template>
-       <template
-             autoinsert="true"
-             contextTypeId="jsp_new"
-             description="%NewJSFPage_xhtml_description"
-             id="org.eclipse.jst.jsf.ui.new_jsf_page_xhtml"
-             name="%NewJSFPage_xhtml">
-          <pattern>
-             &lt;?xml version=&quot;1.0&quot; encoding=&quot;${encoding}&quot; ?&gt;
-&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=${encoding}&quot;
-    pageEncoding=&quot;${encoding}&quot;%&gt;
-&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&gt;
-&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot; xmlns:f=&quot;http://java.sun.com/jsf/core&quot; xmlns:h=&quot;http://java.sun.com/jsf/html&quot;&gt;
-&lt;head&gt;
-&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=${encoding}&quot; /&gt;
-&lt;title&gt;Insert title here&lt;/title&gt;
-&lt;/head&gt;
-&lt;body&gt;
-&lt;f:view&gt;
-${cursor}
-&lt;/f:view&gt;
-&lt;/body&gt;
-&lt;/html&gt;
-          </pattern>
-       </template>
-       <template
-             autoinsert="true"
-             contextTypeId="jsp_attribute_value"
-             description="%NewELExpression_description"
-             id="org.eclipse.jst.jsf.ui.newelexpression"
-             name="%NewELExpression">
-          <pattern>
-             "#{${cursor}}"
-          </pattern>
-       </template>
-    </extension>
-        
-</plugin>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/JSFUITraceOptions.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/JSFUITraceOptions.java
deleted file mode 100644
index 8c78cd5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/JSFUITraceOptions.java
+++ /dev/null
@@ -1,72 +0,0 @@
-package org.eclipse.jst.jsf.ui.internal;
-
-import org.eclipse.osgi.framework.debug.FrameworkDebugOptions;
-import org.eclipse.osgi.service.debug.DebugOptions;
-
-/**
- * Defines that standard runtime trace options for debugging. See .options file
- * for definitions.
- * 
- * @author cbateman
- * 
- */
-public final class JSFUITraceOptions
-{
-    /**
-     * True if debug tracing is enabled. Other tracing cannot be enabled unless
-     * this is enabled.
-     */
-    public static final boolean ENABLED;
-
-    /**
-     * True if development mode for meta-data generation is enabled
-     */
-    public static final boolean TRACE_METADATAGEN;
-
-    private static final String KEY_DEBUG_ENABLED = "/debug"; //$NON-NLS-1$
-    private static final String KEY_DESIGNTIME = "/metadatagen"; //$NON-NLS-1$
-
-    
-    static
-    {
-        final DebugOptions debugOptions = FrameworkDebugOptions.getDefault();
-
-        ENABLED = debugOptions != null
-                && debugOptions.getBooleanOption(JSFUiPlugin.PLUGIN_ID
-                        + KEY_DEBUG_ENABLED, false);
-
-        if (ENABLED)
-        {
-            TRACE_METADATAGEN = debugOptions.getBooleanOption(
-                    JSFUiPlugin.PLUGIN_ID + KEY_DESIGNTIME, false);
-        }
-        else
-        {
-            TRACE_METADATAGEN = false;
-        }
-    }
-
-    /**
-     * @param message
-     */
-    public static void log(final String message)
-    {
-        System.out.println(message);
-    }
-    
-    /**
-     * @param msg A short label placed before the trace of t to show the source
-     * @param t
-     */
-    public static void log(final String msg, final Throwable t)
-    {
-        System.out.printf("%s: Exception Trace:\n\n",msg); //$NON-NLS-1$
-        t.printStackTrace(System.out);
-        System.out.print("\n\n\n"); //$NON-NLS-1$
-    }
-
-    private JSFUITraceOptions()
-    {
-        // no instantiation
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/JSFUiPlugin.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/JSFUiPlugin.java
deleted file mode 100644
index 31977d4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/JSFUiPlugin.java
+++ /dev/null
@@ -1,143 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler - initial API and implementation
- *    Ian Trimble - added logging methods
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.ui.internal;
-
-import java.net.MalformedURLException;
-import java.net.URL;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.resource.ImageRegistry;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.osgi.framework.BundleContext;
-
-/**
- * JSF UI plugin.
- * 
- * @author Gerry Kessler - Oracle, Ian Trimble - Oracle
- */
-public class JSFUiPlugin extends AbstractUIPlugin {
-
-	/**
-	 * The plugin id
-	 */
-	public static final String PLUGIN_ID = "org.eclipse.jst.jsf.ui"; //$NON-NLS-1$
-	//The shared instance.
-	private static JSFUiPlugin plugin;
-
-	/**
-	 * The constructor.
-	 */
-	public JSFUiPlugin() {
-		plugin = this;
-	}
-
-	/**
-	 * This method is called upon plug-in activation
-	 */
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-	}
-
-	/**
-	 * This method is called when the plug-in is stopped
-	 */
-	public void stop(BundleContext context) throws Exception {
-		super.stop(context);
-		plugin = null;
-	}
-
-	/**
-	 * Returns the shared instance.
-	 * @return the default plugin instance
-	 */
-	public static JSFUiPlugin getDefault() {
-		return plugin;
-	}
-
-	/**
-	 * Returns an image descriptor for the image file at the given
-	 * plug-in relative path.
-	 *
-	 * @param path the path
-	 * @return the image descriptor
-	 */
-	public static ImageDescriptor getImageDescriptor(String path) {
-		path = "icons/" + path; //$NON-NLS-1$
-		return AbstractUIPlugin.imageDescriptorFromPlugin("org.eclipse.jst.jsf.ui", path); //$NON-NLS-1$
-	}
-
-	   /**
-     * Returns a shared image for the given name
-     * <p>
-     * Note: Images returned from this method will be automitically disposed of
-     * when this plug-in shuts down. Callers must not dispose of these images
-     * themselves.
-     * </p>
-     * 
-     * @param name
-     *            the image name found in /icons (with extension)
-     * @return the image, null on error or not found.
-     */
-    public Image getImage(String name) {
-        if (name == null) {
-            return null;
-        }
-
-        ImageRegistry images = getImageRegistry();
-        Image image = images.get(name);
-        if (image == null) {
-            try {
-                final URL pluginBase= getBundle().getEntry("/");; //$NON-NLS-1$
-                ImageDescriptor id = ImageDescriptor.createFromURL(new URL(
-                        pluginBase, "icons/" + name)); //$NON-NLS-1$
-                images.put(name, id);
-
-                image = images.get(name);
-            } catch (MalformedURLException ee) {
-                // log.CommonPlugin.image.error=Image {0} not found.
-                //.error("log.msg", "log.CommonPlugin.image.error", name, ee);
-                log(IStatus.ERROR, "Loading image", ee); //$NON-NLS-1$
-            }
-        }
-        return image;
-    }
-	/**
-	 * @return the plugin id
-	 */
-	public String getPluginID() {
-		return PLUGIN_ID;
-	}
-
-	/**
-	 * Logs using the default ILog implementation provided by getLog().
-	 * 
-	 * @param severity Severity (IStatus constant) of log entry
-	 * @param message Human-readable message describing log entry
-	 * @param ex Throwable instance (can be null)
-	 */
-	public static void log(int severity, String message, Throwable ex) {
-		getDefault().getLog().log(new Status(severity, PLUGIN_ID, IStatus.OK, message, ex));
-	}
-
-	/**
-	 * Logs using the default ILog implementation provided by getLog().
-	 * 
-	 * @param severity Severity (IStatus constant) of log entry
-	 * @param message Human-readable message describing log entry
-	 */
-	public static void log(int severity, String message) {
-		log(severity, message, null);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/Messages.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/Messages.java
deleted file mode 100644
index 9057767..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/Messages.java
+++ /dev/null
@@ -1,350 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler - initial API and implementation
- *    Ian Trimble - changed to work correctly with org.eclipse.osgi.util.NLS
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.ui.internal;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * String resource handler.
- * 
- * @author Gerry Kessler - Oracle, Ian Trimble - Oracle
- */
-public class Messages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.jst.jsf.ui.internal.messages"; //$NON-NLS-1$
-
-    static {
-        NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-    }
-
-    /**
-     * see messages.properties
-     */
-    public static String JSFFacetInstallPage_JSFImplementationLibrariesFrame;
-	/**
-	 * see messages.properties
-	 */
-	public static String JSFFacetInstallPage_JSFComponentLibrariesFrame;
-    /**
-     * see messages.properties
-     */
-	public static String JSFFacetInstallPage_title;
-    /**
-     * see messages.properties
-     */
-	public static String JSFFacetInstallPage_description;
-    /**
-     * see messages.properties
-     */
-	public static String JSFFacetInstallPage_JSFImplLabel;
-    /**
-     * see messages.properties
-     */
-	public static String JSFFacetInstallPage_Add1;
-    /**
-     * see messages.properties
-     */
-	public static String JSFFacetInstallPage_Add2;
-    /**
-     * see messages.properties
-     */
-	public static String JSFFacetInstallPage_DeployJarsLabel;
-    /**
-     * see messages.properties
-     */
-	public static String JSFFacetInstallPage_JSFConfigLabel;
-    /**
-     * see messages.properties
-     */
-	public static String JSFFacetInstallPage_JSFServletNameLabel;
-    /**
-     * see messages.properties
-     */
-	public static String JSFFacetInstallPage_JSFServletClassNameLabel;
-    /**
-     * see messages.properties
-     */
-	public static String JSFFacetInstallPage_JSFURLMappingLabel;
-    /**
-     * see messages.properties
-     */
-	public static String JSFFacetInstallPage_PatternDialogTitle;
-    /**
-     * see messages.properties
-     */
-	public static String JSFFacetInstallPage_PatternDialogDesc;
-    /**
-     * see messages.properties
-     */
-	public static String JSFFacetInstallPage_Remove;
-    /**
-     * see messages.properties
-     */
-	public static String JSFFacetInstallPage_PatternEmptyMsg;
-    /**
-     * see messages.properties
-     */
-	public static String JSFFacetInstallPage_PatternSpecifiedMsg;
-    /**
-     * see messages.properties
-     */
-	public static String JSFFacetInstallPage_ErrorNoWebAppDataModel;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibrariesPreferencePage_DEFAULT_IMPL_DESC;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibrariesPreferencePage_DefinedJSFLibraries;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibrariesPreferencePage_IMPL_DESC;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibrariesPreferencePage_MISSING_DESC;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibrariesPreferencePage_New;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibrariesPreferencePage_Edit;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibrariesPreferencePage_Remove;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibrariesPreferencePage_CannotRemovePluginProvidedTitle;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibrariesPreferencePage_CannotRemovePluginProvidedMessage;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibrariesPreferencePage_MakeDefault;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibrariesPreferencePage_Description;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibrariesPreferencePage_CannotModifyPluginProvidedTitle;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibrariesPreferencePage_CannotModifyPluginProvidedMessage;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryConfigControl_Add;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryConfigControl_AddAll;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryConfigControl_ImplementationLibrary;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryConfigControl_NewComponentLibrary;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryConfigControl_NullProject;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryConfigControl_DeployJAR;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryConfigControl_Remove;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryConfigControl_RemoveAll;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryConfigControl_TH_Deploy;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryConfigControl_TH_LibraryName;
-
-
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryContainerWizardPage_PageName;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryContainerWizardPage_Title;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryContainerWizardPage_Description;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryContainerWizardPage_WarningNoJSFFacet;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryContainerWizardPage_JSFLibraries;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryContainerWizardPage_Add;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryContainerWizardPage_Edit;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryContainerWizardPage_ErrorInitializing;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryContainerWizardPage_ImplAlreadyPresent;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryContainerWizardPage_SelectOneImpl;
-    /**
-     * see messages.properties
-     */
-    public static String JSFLibraryContainerWizardPage_EditLibrary_DescriptionText;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryPropertyPage_No_JSF_Facet_Installed;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryPropertyPage_No_JSF_Implementation_Lib_Selected;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryWizard_DESCRIPTION;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryWizard_CreateJSFLibrary;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryWizard_EditJSFLibrary;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryWizard_JSFLibrary;
-    /**
-     * see messages.properties
-     */
-    public static String JSFLibraryWizard_JSFLibraryWizard_DontShowThisAgain_CheckBoxLabel;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryWizard_LibraryName;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryWizard_VersionSupported;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryWizard_LibraryJars;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryWizard_DeployJars;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryWizard_Add;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryWizard_Remove;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryWizard_ExtJarFileDialogTitle;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryWizard_ValidateNoJars;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryWizard_ValidateNoLibraryName;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryWizard_ValidateExistingLibraryName;
-
-    /**
-     * Title set on the el validation preference panel
-     */
-    public static String JSFValidationPreferencePage_ELPrefPanel_Title;
-    /**
-     * Title set on the checkbox that enables/disables build validation for EL
-     */
-    public static String JSFValidationPreferencePage_ELPrefPanel_BuildValidationCheckBoxTitle;
-    /**
-     * Title set on the checkbox that enables/disables incremental (as you type)
-     * validation for EL
-     */
-    public static String JSFValidationPreferencePage_ELPrefPanel_IncrementalValidationCheckBoxTitle;
-
-    /**
-     * see messages.properties
-     */
-    public static String JSFLibraryEditControl_ImplVersion_UNKNOWN;
-
-    /**
-     * see messages.properties
-     */
-    public static String JSFPreferences_RootPage_Description;
-
-    /**
-     * see messages.properties
-     */
-    public static String Hyperlink_Open_JavaType;
-
-    /**
-     * see messages.properties
-     */
-    public static String Hyperlink_Open_JavaMethod;
-
-    /**
-     * see messages.properties
-     */
-    public static String Hyperlink_Open_JavaFile;
-
-    /**
-     * see messages.properties
-     */
-    public static String Hyperlink_Open_JavaElement;
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/classpath/JSFLibraryContainerWizardPage.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/classpath/JSFLibraryContainerWizardPage.java
deleted file mode 100644
index c8468c2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/classpath/JSFLibraryContainerWizardPage.java
+++ /dev/null
@@ -1,558 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.ui.internal.classpath;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jdt.core.IClasspathEntry;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.ui.wizards.IClasspathContainerPage;
-import org.eclipse.jdt.ui.wizards.IClasspathContainerPageExtension;
-import org.eclipse.jdt.ui.wizards.IClasspathContainerPageExtension2;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.viewers.CheckStateChangedEvent;
-import org.eclipse.jface.viewers.CheckboxTableViewer;
-import org.eclipse.jface.viewers.DoubleClickEvent;
-import org.eclipse.jface.viewers.ICheckStateListener;
-import org.eclipse.jface.viewers.IDoubleClickListener;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.ILabelProviderListener;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerComparator;
-import org.eclipse.jface.window.Window;
-import org.eclipse.jface.wizard.WizardDialog;
-import org.eclipse.jface.wizard.WizardPage;
-import org.eclipse.jst.jsf.core.internal.jsflibraryconfig.JSFLibraryRegistryUtil;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.PluginProvidedJSFLibrary;
-import org.eclipse.jst.jsf.core.jsfappconfig.JSFAppConfigUtils;
-import org.eclipse.jst.jsf.core.jsflibraryconfiguration.JSFLibraryConfigurationHelper;
-import org.eclipse.jst.jsf.ui.internal.JSFUiPlugin;
-import org.eclipse.jst.jsf.ui.internal.Messages;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchWizard;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * Provides a classpath container wizard page for JSF Libraries.
- * 
- * @author Gerry Kessler - Oracle
- * @deprecated
- */
-public class JSFLibraryContainerWizardPage extends WizardPage implements
-		IClasspathContainerPage, IClasspathContainerPageExtension, IClasspathContainerPageExtension2{
-
-	private CheckboxTableViewer lv;
-	private JSFLibrariesTableViewerAdapter lvAdapter;
-	private JSFLibrariesListLabelProvider lvLabelProvider;
-	
-	private boolean isJSFProject = false;
-	private IClasspathEntry containerEntry;
-	private IClasspathEntry[] currentEntries;
-	private Map _currentLibs;
-	private JSFLibrary currentLib;
-	
-	private IProject  _iproject;
-
-	/**
-	 * Zero arg constructor
-	 */
-	public JSFLibraryContainerWizardPage(){
-        super(Messages.JSFLibraryContainerWizardPage_PageName);        
-        setTitle(Messages.JSFLibraryContainerWizardPage_Title);
-        setDescription(Messages.JSFLibraryContainerWizardPage_Description);
-        // TODO: Replace with a custom image.
-        setImageDescriptor( JSFUiPlugin.getImageDescriptor("full/wizban/addlibrary_wiz.gif")); //$NON-NLS-1$
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jdt.ui.wizards.IClasspathContainerPageExtension#initialize(org.eclipse.jdt.core.IJavaProject, org.eclipse.jdt.core.IClasspathEntry[])
-	 */
-	public void initialize(IJavaProject project, IClasspathEntry[] currentEntries_) {
-		this.currentEntries = currentEntries_;
-
-        _iproject = project.getProject();
-        this.isJSFProject = JSFAppConfigUtils.isValidJSFProject(_iproject);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jdt.ui.wizards.IClasspathContainerPage#finish()
-	 */
-	public boolean finish() {
-		return true;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jdt.ui.wizards.IClasspathContainerPageExtension2#getNewContainers()
-	 */
-	public IClasspathEntry[] getNewContainers() {
-		IPath cp = new Path(JSFLibraryConfigurationHelper.JSF_LIBRARY_CP_CONTAINER_ID);
-		List res = new ArrayList();
-		Object[] items = lv.getCheckedElements();
-		for (int i=0;i<items.length;i++){
-			JSFLibrary jsfLib = (JSFLibrary)items[i];
-			if (getSelectedJSFLibariesForProject().get(jsfLib.getID()) == null){
-				IPath path = cp.append(new Path(jsfLib.getID()));
-				IClasspathEntry entry = JavaCore.newContainerEntry(path);
-				// need to update wtp dependency in j2ee mod dependency ui
-				res.add(entry);
-			}
-		}
-		return (IClasspathEntry[])res.toArray(new IClasspathEntry[]{});
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.wizard.WizardPage#isPageComplete()
-	 */
-	public boolean isPageComplete() {
-		if (!isJSFProject) {
-			return false;
-		}
-		if (isEditReference() && ! selectionHasChanged())
-			return false;
-		
-		return isValid();
-	}
-
-	private boolean isValid() {		
-		return isCheckedItems() && getErrorMessage() == null;
-	}
-
-	//to be used to know whether the selected library has changed when in "edit" mode
-	private boolean selectionHasChanged() {
-		JSFLibrary lib = getCurrentLibrarySelection();
-		if (lib == null)
-			return false;
-		
-		return (getJSFLibraryForEdit(containerEntry) != lib) ;
-
-	}
-
-	private JSFLibrary getCurrentLibrarySelection() {
-		JSFLibrary lib = null;
-		StructuredSelection ssel = (StructuredSelection)lv.getSelection();
-		if (ssel != null && !ssel.isEmpty()){
-			lib = (JSFLibrary)ssel.getFirstElement();
-		}
-		return lib;
-	}
-
-	private boolean isCheckedItems() {		
-		return lv.getCheckedElements().length > 0;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jdt.ui.wizards.IClasspathContainerPage#getSelection()
-	 */
-	public IClasspathEntry getSelection() {
-		IClasspathEntry entry = null;
-		if (isEditReference()){
-			if (lv.getCheckedElements().length == 0)
-				return containerEntry;
-						
-			JSFLibrary lib = (JSFLibrary)lv.getCheckedElements()[0];
-			if (lib != null){
-				if (lib == getJSFLibraryForEdit(containerEntry))
-				{
-					return containerEntry;
-				}
-                IPath path = new Path(JSFLibraryConfigurationHelper.JSF_LIBRARY_CP_CONTAINER_ID).append(new Path(lib.getID()));
-                entry = JavaCore.newContainerEntry(path, containerEntry.getAccessRules(), containerEntry.getExtraAttributes(),containerEntry.isExported());
-			}			
-		}
-		return entry;
-
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jdt.ui.wizards.IClasspathContainerPage#setSelection(org.eclipse.jdt.core.IClasspathEntry)
-	 */
-	public void setSelection(IClasspathEntry containerEntry) {
-		//this is signalling that this is an "edit"
-		this.containerEntry = containerEntry;
-	}
-
-	public void createControl(Composite parent) {
-		//Build UI to display JSF Lib components from registry
-		Composite c = new Composite(parent, SWT.NONE);
-		c.setLayout(new GridLayout(2, false));
-		c.setLayoutData(new GridData(GridData.FILL_BOTH));
-
-		//disable wizard if this is not a valid JSF project
-		if (!isJSFProject){
-			Label warning = new Label(c , SWT.NONE);
-			warning.setText(Messages.JSFLibraryContainerWizardPage_WarningNoJSFFacet);
-			setControl(c);			
-			return;
-		}
-
-		Label lblViewer = new Label(c, SWT.NONE);
-		lblViewer.setText(Messages.JSFLibraryContainerWizardPage_JSFLibraries);
-		GridData gd1 = new GridData(GridData.BEGINNING);
-		gd1.horizontalSpan = 2;
-		lblViewer.setLayoutData(gd1);
-
-		lv = createTableViewer(c);
-		lv.getControl().setLayoutData(new GridData(GridData.FILL_BOTH));
-
-		lvAdapter = new JSFLibrariesTableViewerAdapter();
-		lvLabelProvider = new JSFLibrariesListLabelProvider();
-		lv.setContentProvider(lvAdapter);
-		lv.setLabelProvider(lvLabelProvider);
-		lv.addSelectionChangedListener(lvAdapter);
-		lv.addDoubleClickListener(lvAdapter);
-		lv.setComparator(lvAdapter);
-		
-		Composite buttons = new Composite(c, SWT.NONE);
-		buttons.setLayout(new GridLayout(1, false));
-		buttons.setLayoutData(new GridData(GridData.FILL_VERTICAL));
-		
-		final Button addButton = new Button(buttons, SWT.NONE);
-		addButton.setText(Messages.JSFLibraryContainerWizardPage_Add);
-		addButton.setLayoutData(new GridData(GridData.END | GridData.VERTICAL_ALIGN_BEGINNING));
-		addButton.addSelectionListener(new SelectionAdapter(){
-			public void widgetSelected(SelectionEvent e){
-				openJSFLibraryWizard(null);				
-			}
-		});
-		
-		final Button editButton = new Button(buttons, SWT.NONE);
-		editButton.setText(Messages.JSFLibraryContainerWizardPage_Edit);
-		editButton.setLayoutData(new GridData(GridData.END | GridData.VERTICAL_ALIGN_BEGINNING));
-		editButton.addSelectionListener(new SelectionAdapter(){
-			public void widgetSelected(SelectionEvent e){
-				StructuredSelection sel = (StructuredSelection)lv.getSelection();
-				if ((sel == null || sel.isEmpty()) && containerEntry != null){
-					JSFLibrary jsfLib = getJSFLibraryForEdit(containerEntry);
-					sel = new StructuredSelection(jsfLib);
-				}
-				openJSFLibraryWizard(sel);				
-			}
-
-		});
-		editButton.setVisible(false);
-		lv.addSelectionChangedListener(new ISelectionChangedListener(){
-			public void selectionChanged(SelectionChangedEvent event) {
-				setEditButton(event.getSelection());
-			}
-
-			private void setEditButton(final ISelection selection) {
-				IStructuredSelection sel = (IStructuredSelection)selection;
-				editButton.setVisible(sel.size()==1);		
-				if (sel.size() == 1){					
-					JSFLibrary lib = (JSFLibrary)sel.getFirstElement();
-					boolean pp = lib instanceof PluginProvidedJSFLibrary;
-					editButton.setEnabled(! pp);
-					if (isEditReference()){
-						lv.setAllChecked(false);
-						lv.setChecked(lib, true);
-					}
-				}
-				
-			}			
-		});
-		setControl(c);
-		
-		if (isEditReference()){
-			JSFLibrary lib = getJSFLibraryForEdit(containerEntry);
-			lv.setInput(getAllUnselectedJSFLibrariesExceptReferencedLib(lib));	
-			selectAndCheckCurrentLib(lib);
-			setDescription(Messages.JSFLibraryContainerWizardPage_EditLibrary_DescriptionText);
-		} 
-		else {
-			lv.setInput(getAllJSFLibraries());		
-			lv.setCheckedElements(getSelectedJSFLibariesForProject().values().toArray(new Object[0]));
-		}
-	}
-
-	private void selectAndCheckCurrentLib(final JSFLibrary lib) {
-		if (lib != null){
-			StructuredSelection ssel = new StructuredSelection(lib);	
-			lv.setSelection(ssel);
-			lv.setChecked(lib, true);
-		}
-	}
-
-	private Object getAllUnselectedJSFLibrariesExceptReferencedLib(JSFLibrary referenceLib) {
-		List allLibs = getAllJSFLibraries();
-		Collection selLibs = getSelectedJSFLibariesForProject().values();
-		for (Iterator it=selLibs.iterator();it.hasNext();){
-			JSFLibrary aLib = (JSFLibrary)it.next();
-			int i= allLibs.indexOf(aLib);
-			//remove from allLibs unless it is the selected reference
-			if (i >= 0 && ((referenceLib == null) || (aLib != null && ! aLib.getID().equals(referenceLib.getID())))){
-				allLibs.remove(i);
-			}
-		}
-		return allLibs;
-	}
-
-	private List getJSFLibraryEntries(IClasspathEntry[] entries) {
-		List jsfLibs = new ArrayList();
-		for (int i=0;i<entries.length;i++){
-			IClasspathEntry entry = entries[i];
-			if (JSFLibraryConfigurationHelper.isJSFLibraryContainer(entry)){
-				JSFLibrary lib = JSFLibraryRegistryUtil.getInstance().getJSFLibraryRegistry(). getJSFLibraryByID(getLibraryId(entry));
-				if (lib != null){
-					jsfLibs.add(lib);
-				}
-			}
-		}
-		
-		return jsfLibs;
-	}
-
-	private String getLibraryId(IClasspathEntry entry) {
-		return entry.getPath().segment(1);
-	}
-
-	private void openJSFLibraryWizard(IStructuredSelection element){
-		IWorkbenchWizard wizard = new JSFLibraryWizard();
-		IWorkbench wb = PlatformUI.getWorkbench();
-		wizard.init(wb, element);
-		WizardDialog dialog = new WizardDialog(wb.getActiveWorkbenchWindow().getShell(), wizard);
-		int ret = dialog.open();
-		if (ret == Window.OK){
-			//FIXME: select returned object
-			if (containerEntry == null){
-				lv.setInput(getAllJSFLibraries());				
-			}
-			else {
-				lv.setInput(getAllUnselectedJSFLibrariesExceptReferencedLib(getJSFLibraryForEdit(containerEntry)));
-				lv.refresh(true);
-			}
-			lv.refresh();
-		}
-	}
-	
-	private CheckboxTableViewer createTableViewer(Composite parent) {
-		Table table= new Table(parent, SWT.CHECK | SWT.BORDER | SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
-		table.setFont(parent.getFont());
-		CheckboxTableViewer tableViewer= new CheckboxTableViewer(table);
-		tableViewer.addCheckStateListener(new ICheckStateListener() {
-			public void checkStateChanged(CheckStateChangedEvent e) {
-				if (! isEditReference()){
-					//ensure that existing CP entries cannot be unchecked
-					if (getSelectedJSFLibariesForProject().get(((JSFLibrary)e.getElement()).getID()) != null){
-						if (containerEntry == null)
-							e.getCheckable().setChecked(e.getElement(), true);
-						else
-							lv.setAllChecked(true);
-					}
-				}
-				else {
-					//select only one
-					lv.setAllChecked(false);
-					lv.setChecked(e.getElement(), true);
-					if (isEditReference())
-						lv.setSelection(new StructuredSelection(e.getElement()));
-				}
-				validate();				
-			}
-		});
-		return tableViewer;
-	}
-
-	private Map getSelectedJSFLibariesForProject(){
-		if (_currentLibs == null){
-			List allLibs = getAllJSFLibraries();
-			List curLibs = getJSFLibraryEntries(currentEntries);
-			_currentLibs = new HashMap(curLibs.size());
-			for (Iterator it=curLibs.iterator();it.hasNext();){
-				JSFLibrary lib = (JSFLibrary)it.next();
-				int index = getIndex(allLibs, lib);
-				if (index >=0)
-					_currentLibs.put(lib.getID(), allLibs.get(index));
-			}
-					
-		}
-		return _currentLibs;
-	}
-	
-	private List getAllJSFLibraries() {
-		List allLibs = JSFLibraryRegistryUtil.getInstance().getJSFLibraryRegistry().getAllJSFLibraries();
-
-		return allLibs;
-	}
-
-
-	private JSFLibrary getJSFLibraryForEdit(
-			IClasspathEntry containerEntry_) {
-		if (currentLib == null){
-			String id = getLibraryId(containerEntry_);
-			currentLib = JSFLibraryRegistryUtil.getInstance().getJSFLibraryRegistry().getJSFLibraryByID(id);	
-		}
-		return currentLib;
-
-	}
-	
-	private int getIndex(List libs, JSFLibrary lib) {
-		for (int i=0;i<libs.size();i++){
-			if (lib.getID().equals(((JSFLibrary)libs.get(i)).getID()))
-				return i;
-		}
-		return -1;
-	}
-
-	private class JSFLibrariesTableViewerAdapter extends ViewerComparator implements IStructuredContentProvider, ISelectionChangedListener, IDoubleClickListener {
-
-		private Object input;
-
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-			input = newInput;
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-		 */
-		public void dispose() {
-            // do nothing
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-		 */
-		public Object[] getElements(Object inputElement) {		
-			return ((List)input).toArray();
-		}		
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
-		 */
-		public void selectionChanged(SelectionChangedEvent event) {
-			if (isEditReference()){
-				setPageComplete(isPageComplete());
-			}
-			
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.IDoubleClickListener#doubleClick(org.eclipse.jface.viewers.DoubleClickEvent)
-		 */
-		public void doubleClick(DoubleClickEvent event) {
-			doDoubleClick(event);
-		}
-		
-		public int compare(Viewer viewer, Object e1, Object e2) {
-			JSFLibrary lib1 = (JSFLibrary)e1;
-			JSFLibrary lib2 = (JSFLibrary)e2;
-			
-			//sort first by in selection already and then by name
-			boolean lib1Sel = getSelectedJSFLibariesForProject().get(lib1.getID())!=null;
-			boolean lib2Sel = getSelectedJSFLibariesForProject().get(lib2.getID())!= null;
-			
-			if ((lib1Sel && lib2Sel) || (!lib1Sel && !lib2Sel) ){
-				return getComparator().compare(lib1.getLabel(), lib2.getLabel());
-			}
-			else if (lib1Sel)
-				return -1;
-			else
-				return 1;
-		}
-	}
-	
-	private static class JSFLibrariesListLabelProvider implements ILabelProvider{		
-		Image libImg;
-		public Image getImage(Object element) {
-			if (libImg == null){
-				ImageDescriptor libImgDesc = JSFUiPlugin.getImageDescriptor("obj16/library_obj.gif"); //$NON-NLS-1$
-				libImg = libImgDesc.createImage();
-			}
-			return libImg;
-		}
-
-		public String getText(Object element) {
-			if (element instanceof JSFLibrary) {
-				JSFLibrary lib = (JSFLibrary)element;
-				if (lib.isImplementation()) {
-					return lib.getLabel() + " " + Messages.JSFLibrariesPreferencePage_IMPL_DESC; //$NON-NLS-1$
-				}
-                return lib.getLabel();
-			}
-			return null;
-		}
-
-		public void dispose() {
-			if (libImg != null)
-				libImg.dispose();
-		}
-
-		public void addListener(ILabelProviderListener listener) {		
-            // no listener support
-		}
-
-		public boolean isLabelProperty(Object element, String property) {
-			return false;
-		}
-
-		public void removeListener(ILabelProviderListener listener) {
-            // no listener support
-		}
-	}
-	
-	private void validate() {
-		setErrorMessage(null);
-		int implChosenCount = implSelectedCount();
-		if (implChosenCount>1){
-			setErrorMessage(Messages.JSFLibraryContainerWizardPage_ImplAlreadyPresent);
-		}
-        setPageComplete(isPageComplete());
-	}
-
-
-	private boolean isEditReference() {
-		return (containerEntry != null);		
-	}
-
-	private int implSelectedCount() {
-		int count = 0;
-		for (int i=0;i<lv.getCheckedElements().length;i++){
-			JSFLibrary lib = (JSFLibrary)lv.getCheckedElements()[i];
-			if (lib.isImplementation())
-				count++;
-		}
-		return count;
-	}
-
-	private void doDoubleClick(DoubleClickEvent event) {
-		StructuredSelection ssel = (StructuredSelection)event.getSelection();
-		if (ssel != null && 
-				(! ((JSFLibrary)ssel.getFirstElement() instanceof PluginProvidedJSFLibrary)))
-			openJSFLibraryWizard((IStructuredSelection)event.getSelection());
-	}
-
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/classpath/JSFLibraryEditControl.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/classpath/JSFLibraryEditControl.java
deleted file mode 100644
index 5b456c2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/classpath/JSFLibraryEditControl.java
+++ /dev/null
@@ -1,465 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.ui.internal.classpath;
-
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Set;
-
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.ILabelProviderListener;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jst.jsf.core.internal.jsflibraryconfig.JSFLibraryRegistryUtil;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryFactory;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFVersion;
-import org.eclipse.jst.jsf.ui.internal.JSFUiPlugin;
-import org.eclipse.jst.jsf.ui.internal.Messages;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.CCombo;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.FileDialog;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * Common control for adding JSF library instances
- * @deprecated
- */
-public class JSFLibraryEditControl extends Composite implements ModifyListener, SelectionListener 
-{
-	private Text txtName;
-	private Label lblName;
-	private CCombo cboVersions;
-	private Label lblVersions;
-	private Button chkDeploy;
-	private Composite btnBar;
-	private Button btnAdd;
-	private Button btnRemove;
-	private TableViewer jars;
-	
-	private boolean initing = false;
-
-	private JSFLibrary workingCopyLibrary;
-	
-	private String validationMsg;
-	private Set _listeners;
-	private int _isNew = -1;//use isNew() method.. not this variable directly
-
-	/**
-	 * @param workingCopyLibrary  working copy of the JSF library
-	 * @param parent parent SWT control
-	 */
-	public JSFLibraryEditControl(JSFLibrary workingCopyLibrary, Composite parent){
-		super(parent, SWT.NONE);
-		this.workingCopyLibrary = workingCopyLibrary;
-		_listeners = new HashSet(1);
-		createControl(parent);
-	}
-	
-	/**
-	 * @param listener
-	 */
-	public void addValidationListener(JSFLibraryValidationListener listener){
-		removeValidationListener(listener);
-		_listeners.add(listener);
-	}
-	
-	/**
-	 * @param listener
-	 */
-	public void removeValidationListener(JSFLibraryValidationListener listener){
-		_listeners.remove(listener);
-	}
-	
-	/**
-	 * @param parent
-	 */
-	public void createControl(Composite parent) {
-		initing = true;
-
-//		this = new Composite(parent, SWT.NONE);
-		this.setLayout(new GridLayout(2, false));
-		this.setLayoutData(new GridData(GridData.FILL_BOTH));
-
-		lblName = new Label(this, SWT.NONE);
-		lblName.setText(Messages.JSFLibraryWizard_LibraryName);
-		lblName.setLayoutData(new GridData(GridData.BEGINNING));
-
-		txtName = new Text(this, SWT.BORDER);
-		txtName.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		txtName.addModifyListener(this);
-
-		lblVersions = new Label(this, SWT.NONE);
-		lblVersions.setText(Messages.JSFLibraryWizard_VersionSupported);
-
-		cboVersions = new CCombo(this, SWT.SINGLE | SWT.READ_ONLY | SWT.BORDER);
-		cboVersions.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		cboVersions.addModifyListener(this);
-
-		Group jarsComp = new Group(this, SWT.NONE);
-		jarsComp.setText(Messages.JSFLibraryWizard_LibraryJars);
-		GridLayout gl1 = new GridLayout(2, false);
-		jarsComp.setLayout(gl1);
-		GridData gd2 = new GridData(GridData.FILL_HORIZONTAL
-				| GridData.FILL_VERTICAL);
-		gd2.horizontalSpan = 2;
-		jarsComp.setLayoutData(gd2);
-
-		createJarsViewer(jarsComp);
-
-		createButtons(jarsComp);
-
-		chkDeploy = new Button(this, SWT.CHECK);
-		chkDeploy.setText(Messages.JSFLibraryWizard_DeployJars);
-		GridData gd4 = new GridData();
-		gd4.horizontalSpan = 2;
-		chkDeploy.setLayoutData(gd4);
-//		chkDeploy.addSelectionListener(this);
-		chkDeploy.setVisible(false);
-
-		loadVersions();
-
-		if (!isNew()) {
-			txtName.setText(workingCopyLibrary.getName());
-			if (workingCopyLibrary.getJSFVersion().getName().equals(JSFVersion.UNKNOWN_LITERAL.getName())) {
-				cboVersions.setText(Messages.JSFLibraryEditControl_ImplVersion_UNKNOWN);
-			} else {
-				cboVersions.setText(workingCopyLibrary.getJSFVersion().getName());
-			}
-			chkDeploy.setSelection(workingCopyLibrary.isDeployed());
-		}
-		jars.setInput(workingCopyLibrary);
-
-		initing = false;
-
-		txtName.setFocus();
-	}
-
-	private void createJarsViewer(Group jarsComp) {
-		jars = new TableViewer(jarsComp, SWT.BORDER | SWT.MULTI);
-		jars.setContentProvider(new IStructuredContentProvider() {
-			public Object[] getElements(Object inputElement) {
-				if (inputElement instanceof JSFLibrary)
-					return ((JSFLibrary) inputElement).getArchiveFiles()
-							.toArray();
-				return new Object[0];
-			}
-
-			public void dispose() {
-                // do nothing
-			}
-
-			public void inputChanged(Viewer viewer, Object oldInput,
-					Object newInput) {
-				// won't happen
-			}
-		});
-		jars.setLabelProvider(new ILabelProvider() {
-			private Image jarImg = null;
-			public Image getImage(Object element) {
-				if (jarImg == null){
-					ImageDescriptor desc = JSFUiPlugin.getImageDescriptor("obj16/jar_obj.gif"); //$NON-NLS-1$
-					jarImg = desc.createImage();
-				}
-				return jarImg;
-			}
-
-			public String getText(Object element) {
-				StringBuffer labelBuf = new StringBuffer();
-				if (element instanceof ArchiveFile) {
-					ArchiveFile archive = (ArchiveFile) element;
-					labelBuf.append(archive.getName());	
-					if (!archive.exists())
-						labelBuf.append(Messages.JSFLibrariesPreferencePage_MISSING_DESC); 
-					labelBuf.append(" - ").append(archive.getPath()); //$NON-NLS-1$
-				}
-				return labelBuf.toString();
-			}
-
-			public void addListener(ILabelProviderListener listener) {
-                // no listeners supported
-			}
-
-			public void dispose() {
-				if (jarImg != null)
-					jarImg.dispose();
-			}
-
-			public boolean isLabelProperty(Object element, String property) {
-				return false;
-			}
-
-			public void removeListener(ILabelProviderListener listener) {
-                // no listeners supported
-			}
-		});
-
-		jars.addSelectionChangedListener(new ISelectionChangedListener(){
-			public void selectionChanged(SelectionChangedEvent event){
-				updateButtons();
-			}
-		});
-		
-		GridData gd = new GridData(GridData.FILL_BOTH);
-//		gd.widthHint = convertWidthInCharsToPixels(30);
-//		gd.heightHint = convertHeightInCharsToPixels(10);
-		jars.getControl().setLayoutData(gd);
-	}
-
-	private void updateButtons() {
-		btnRemove.setEnabled(!((StructuredSelection)jars.getSelection()).isEmpty());
-		// getButton(IDialogConstants.OK_ID).setEnabled(modified);
-	}
-
-	private void createButtons(Composite c) {
-		btnBar = new Composite(c, SWT.NONE);
-		GridLayout gl = new GridLayout(1, false);
-		gl.marginHeight = 0;
-		gl.marginTop = 0;
-		gl.marginWidth = 0;
-		btnBar.setLayout(gl);
-		btnBar.setLayoutData(new GridData(GridData.END));
-
-		btnAdd = new Button(btnBar, SWT.NONE);
-		btnAdd.setText(Messages.JSFLibraryWizard_Add);
-		btnAdd.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL
-				| GridData.VERTICAL_ALIGN_BEGINNING));
-		btnAdd.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				String cur = null;
-				String[] chosenJars = openExtJarFileDialog(cur);
-				if (chosenJars != null) {
-					for (int i = 0; i < chosenJars.length; i++) {
-						String jar = chosenJars[i];
-						if (!workingCopyLibrary.containsArchiveFile(jar)) {
-							ArchiveFile archive = JSFLibraryRegistryFactory.eINSTANCE
-								.createArchiveFile();
-							archive.setSourceLocation(jar);
-							archive.setRelativeDestLocation("WEB-INF/lib"); //$NON-NLS-1$
-							workingCopyLibrary.getArchiveFiles().add(archive);
-						}
-					}
-					jars.refresh();
-					validate();
-				}
-			}
-		});
-
-		btnRemove = new Button(btnBar, SWT.NONE);
-		btnRemove.setEnabled(false);
-		btnRemove.setText(Messages.JSFLibraryWizard_Remove);
-		btnRemove.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL
-				| GridData.VERTICAL_ALIGN_BEGINNING));
-		btnRemove.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				if (jars.getSelection() instanceof StructuredSelection){
-					StructuredSelection objs = (StructuredSelection)jars.getSelection();
-					if (objs != null){
-						Iterator it = objs.iterator();
-						 while (it.hasNext()){
-							 Object obj = it.next();
-							 ArchiveFile jar = (ArchiveFile)obj;
-							 workingCopyLibrary.getArchiveFiles().remove(jar);							 
-						 }
-					}
-					jars.refresh();
-					validate();
-				}
-			}
-		});
-	}
-
-	private void loadVersions() {
-		cboVersions.removeAll();
-		Iterator it = JSFVersion.VALUES.iterator();
-		while (it.hasNext()) {
-			JSFVersion ver = (JSFVersion) it.next();
-			if (ver.getName().equals(JSFVersion.UNKNOWN_LITERAL.getName())) {
-				cboVersions.add(Messages.JSFLibraryEditControl_ImplVersion_UNKNOWN);
-			} else {
-				cboVersions.add(ver.getName());
-			}
-		}
-	}
-
-	private String[] openExtJarFileDialog(String existing) {
-		String title = Messages.JSFLibraryWizard_ExtJarFileDialogTitle;
-
-		FileDialog dialog = new FileDialog(getShell(),
-				existing == null ? SWT.MULTI : SWT.SINGLE);
-		dialog.setText(title);
-		dialog.setFilterExtensions(new String[] { "*.jar;*.zip" }); //$NON-NLS-1$
-		// FIXME: remember and use last path chosen??
-		String filterPath = ResourcesPlugin.getWorkspace().getRoot()
-				.getFullPath().toString();
-		dialog.setFilterPath(filterPath);
-		// if (existing != null) {
-		// dialog.setFileName(existing.getPath().lastSegment());
-		// }
-
-		String res = dialog.open();
-		if (res == null) {
-			return null;
-		}
-		String[] fileNames = dialog.getFileNames();
-		String[] elems = new String[fileNames.length];
-		IPath file = new Path(res);
-		IPath apath = file.removeLastSegments(1);
-		for (int i = 0; i < fileNames.length; i++) {
-			elems[i] = apath.append(fileNames[i]).toString();
-		}
-		return elems;
-	}	
-
-	public void modifyText(ModifyEvent e) {
-		validate();
-		updateButtons();	
-	}
-
-	private void fireValidateEvent(final JSFLibraryValidationEvent jSFLibraryValidationEvent) {
-		new Runnable(){
-			public void run() {
-				for (Iterator it=_listeners.iterator();it.hasNext();){
-					JSFLibraryValidationListener listener = (JSFLibraryValidationListener)it.next();
-					listener.notifyValidation(jSFLibraryValidationEvent);
-				}
-			}
-		}.run();
-	}
-
-
-	public void widgetSelected(SelectionEvent e) {
-		validate();
-		updateButtons();
-	}
-
-	public void widgetDefaultSelected(SelectionEvent e) {
-        // no handling for default selection
-	}
-
-	private void validate() {
-		if (initing)
-			return;
-		validationMsg = null;
-//		setPageComplete(true);
-		if (!validateName() || !validateJars() || !validateVersion()) {
-//			setPageComplete(false);
-		}
-		fireValidateEvent(new JSFLibraryValidationEvent(validationMsg));
-	}
-	
-	private boolean validateJars() {
-		if (workingCopyLibrary.getArchiveFiles().isEmpty()) {
-			validationMsg = Messages.JSFLibraryWizard_ValidateNoJars;
-			return false;
-		}
-		return true;
-	}
-	
-	private boolean validateVersion() {
-		//FIXME: why isn't selection indesx correct???
-	//	if (cboVersions.getSelectionIndex() < 0) {
-	//		setErrorMessage("Choose the maximum JSF version supported if known.");
-	//		return false;
-	//	}
-		return true;
-	}
-	
-	private boolean validateName() {
-		if (txtName.getText() == null
-				|| txtName.getText().trim().equals("")) { //$NON-NLS-1$
-			validationMsg = Messages.JSFLibraryWizard_ValidateNoLibraryName;
-			return false;
-		}
-		String aName = txtName.getText().trim();
-		if (isNew() || (!isNew() && !getCurrentLibraryName().equals(aName))) {
-			if (isNameInRegistry(JSFLibraryRegistryUtil.getInstance()
-					.getJSFLibraryRegistry().getAllJSFLibraries(), aName)) {
-				validationMsg = Messages.JSFLibraryWizard_ValidateExistingLibraryName;
-				return false;
-			}
-		}
-		return true;
-	}
-	
-	private boolean isNew() {
-		if (_isNew == -1){
-			_isNew = workingCopyLibrary.getName() == null ? 1 : 0;
-		}
-		return _isNew == 1;
-	}
-
-	private String getCurrentLibraryName() {
-		return workingCopyLibrary.getName();		
-	}
-
-	private boolean isNameInRegistry(Collection c, String name) {
-		Iterator it = c.iterator();
-		while (it.hasNext()) {
-			JSFLibrary lib = (JSFLibrary) it.next();
-			if (lib.getName().equals(name)) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * @return the trimmed name of the user input for jsf library name
-	 */
-	public String getJSFLibraryName() {		
-		return txtName.getText().trim();
-	}
-
-
-	/**
-	 * @return the value of the user input for the isDeployed checkbox
-	 */
-	public boolean getIsDeployed() {		
-		return chkDeploy.getSelection();
-	}
-
-
-	/**
-	 * @return the jsf version selected in the version dropping
-	 */
-	public JSFVersion getJSFVersion() {
-		if (cboVersions.getSelectionIndex() >= 0) {
-			JSFVersion ver = (JSFVersion) JSFVersion.VALUES.get(cboVersions
-					.getSelectionIndex());
-			return ver;
-		}
-		return JSFVersion.UNKNOWN_LITERAL;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/classpath/JSFLibraryValidationEvent.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/classpath/JSFLibraryValidationEvent.java
deleted file mode 100644
index 71855c5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/classpath/JSFLibraryValidationEvent.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.ui.internal.classpath;
-
-import org.eclipse.core.runtime.IStatus;
-
-/**
- * Validation event used by JSFLibraryControl to notify containers of updates
- * @deprecated
- */
-public class JSFLibraryValidationEvent {
-	private String msg;
-	private int severity;
-	
-	/**
-	 * Constructor
-	 * @param msg
-	 * @param severity - IStatus int value
-	 */
-	public JSFLibraryValidationEvent(String msg, int severity) {
-		this.msg = msg;
-		this.severity = severity;
-	}
-	
-	/**
-	 * Constructs event with severity of IStatus.ERROR
-	 * @param msg
-	 */
-	public JSFLibraryValidationEvent(String msg) {
-		this(msg, IStatus.ERROR);
-	}
-	
-	/**
-	 * @return validation message
-	 */
-	public String getMessage(){
-		return msg;
-	}
-	
-	/**
-	 * @return IStatus int value
-	 */
-	public int getSeverity(){
-		return severity;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/classpath/JSFLibraryValidationListener.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/classpath/JSFLibraryValidationListener.java
deleted file mode 100644
index 8dd1a4f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/classpath/JSFLibraryValidationListener.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.ui.internal.classpath;
-
-/**
- * Listeners of  {@link JSFLibraryValidationEvent}s should implement
- * @deprecated
- */
-public interface JSFLibraryValidationListener {
-	/**
-	 * Callback 
-	 * @param e
-	 */
-	public void notifyValidation(JSFLibraryValidationEvent e);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/classpath/JSFLibraryWizard.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/classpath/JSFLibraryWizard.java
deleted file mode 100644
index 81d0e2e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/classpath/JSFLibraryWizard.java
+++ /dev/null
@@ -1,162 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.ui.internal.classpath;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.wizard.Wizard;
-import org.eclipse.jface.wizard.WizardPage;
-import org.eclipse.jst.jsf.core.internal.jsflibraryconfig.JSFLibraryRegistryUtil;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryFactory;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFVersion;
-import org.eclipse.jst.jsf.ui.internal.JSFUiPlugin;
-import org.eclipse.jst.jsf.ui.internal.Messages;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.INewWizard;
-import org.eclipse.ui.IWorkbench;
-
-/**
- * Dialog for creating or editing a JSF Library or Implementation.
- * <br>
- * If the selection passed in init is not null then the item will be edit mode.
- * 
- * @author Gerry Kessler - Oracle
- * @deprecated
- */
-public class JSFLibraryWizard extends Wizard implements INewWizard {
-
-	private JSFLibraryEditControl jsfLibraryEditControl;
-	
-	private boolean isNew = false;
-	private boolean modified = false;
-
-	private JSFLibrary curLibrary;
-	private JSFLibrary workingCopyLibrary;
-
-	private JSFLibraryWizardPage page;
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IWorkbenchWizard#init(org.eclipse.ui.IWorkbench, org.eclipse.jface.viewers.IStructuredSelection)
-	 */
-	public void init(IWorkbench workbench, IStructuredSelection selection) 
-	{
-		if (selection != null
-				&& selection.getFirstElement() instanceof JSFLibrary) {
-			curLibrary = (JSFLibrary) selection.getFirstElement();
-			workingCopyLibrary = curLibrary.getWorkingCopy();
-		} else {
-			isNew = true;
-			workingCopyLibrary = JSFLibraryRegistryFactory.eINSTANCE.createJSFLibrary();
-		}
-		setWindowTitle(isNew ? Messages.JSFLibraryWizard_CreateJSFLibrary : Messages.JSFLibraryWizard_EditJSFLibrary);
-	}
-
-	/**
-	 * Updates the JSF Library instance with the values from the working copy and 
-	 * persists the registry.
-	 * 
-	 * If editing a library reference, referencing java models will be updated.
-	 *  
-	 * @see org.eclipse.jface.wizard.Wizard#performFinish()
-	 */
-	public boolean performFinish() 
-	{
-		final String name = jsfLibraryEditControl.getJSFLibraryName();
-		final boolean isDeployed = jsfLibraryEditControl.getIsDeployed();
-		final JSFVersion version = jsfLibraryEditControl.getJSFVersion();
-		
-		workingCopyLibrary.setName(name);
-		workingCopyLibrary.setDeployed(isDeployed);
-		workingCopyLibrary.setJSFVersion(version);
-		
-		final String originalID = curLibrary != null ? curLibrary.getID() :workingCopyLibrary.getID();
-		
-		if (isNew){
-			JSFLibraryRegistryUtil.getInstance().getJSFLibraryRegistry().addJSFLibrary(workingCopyLibrary);
-		}
-		else {
-			curLibrary.updateValues(workingCopyLibrary);
-			try {
-				JSFLibraryRegistryUtil.rebindClasspathContainerEntries(originalID, workingCopyLibrary.getID(), null);
-			} catch (JavaModelException e) {
-				JSFUiPlugin.log(IStatus.ERROR, "Exception while updating JSF Library containers", e); //$NON-NLS-1$
-			}
-		}
-		JSFLibraryRegistryUtil.getInstance().saveJSFLibraryRegistry();
-		return true;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.wizard.Wizard#addPages()
-	 */
-	public void addPages() {
-		page = new JSFLibraryWizardPage(Messages.JSFLibraryWizard_JSFLibrary);
-		super.addPage(page);
-		page.setWizard(this);
-	}
-
-	/**
-	 * @return the JSFLibrary being modified by this wizard
-	 */
-	public JSFLibrary getJSFLibrary() {
-		return workingCopyLibrary;
-	}
-
-	private class JSFLibraryWizardPage extends WizardPage {
-
-		/**
-		 * @param pageName
-		 */
-		protected JSFLibraryWizardPage(String pageName) {
-			super(pageName);
-			setDescription(Messages.JSFLibraryWizard_DESCRIPTION);
-			setTitle(Messages.JSFLibraryWizard_JSFLibrary);
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.wizard.WizardPage#isPageComplete()
-		 */
-		public boolean isPageComplete() {
-			if (modified == false) {
-				return false;
-			}
-			return super.isPageComplete();
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
-		 */
-		public void createControl(Composite parent) {
-			initializeDialogUnits(parent);
-
-			jsfLibraryEditControl = new JSFLibraryEditControl(workingCopyLibrary, parent);
-			jsfLibraryEditControl.setLayout(new GridLayout(2, false));
-			jsfLibraryEditControl.setLayoutData(new GridData(GridData.FILL_BOTH));
-
-			jsfLibraryEditControl.addValidationListener(new JSFLibraryValidationListener(){
-				public void notifyValidation(JSFLibraryValidationEvent e) {
-					setErrorMessage(e.getMessage());
-					modified = true;
-					setPageComplete(getErrorMessage()==null);
-				}				
-			});
-
-			setControl(jsfLibraryEditControl);
-			setPageComplete(false);
-		}
-
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/classpath/WarningMessageDialog.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/classpath/WarningMessageDialog.java
deleted file mode 100644
index ff08f6b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/classpath/WarningMessageDialog.java
+++ /dev/null
@@ -1,137 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.ui.internal.classpath;
-
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.layout.GridDataFactory;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.accessibility.AccessibleAdapter;
-import org.eclipse.swt.accessibility.AccessibleEvent;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * Customized warning dialog for JSF Library Upgrade warnings.
- * 
- * @author cbateman
- * @deprecated
- */
-class WarningMessageDialog extends MessageDialog 
-{
-    private Text    _messageLabel;
-    
-    /**
-     * @param parent
-     * @param title
-     * @param message
-     * @return true if the user hit OK
-     * 
-     * Overriden to set the default button to CANCEL and use this dialog.
-     */
-    public static boolean openConfirm(Shell parent, String title, String message) {
-        MessageDialog dialog = new WarningMessageDialog(parent, title, null, // accept
-                // the
-                // default
-                // window
-                // icon
-                message, QUESTION, new String[] { IDialogConstants.OK_LABEL,
-                        IDialogConstants.CANCEL_LABEL }, 1); // CANCEL is the
-        // default
-        return dialog.open() == 0;
-    }
-    
-    WarningMessageDialog(Shell parentShell, String dialogTitle,
-            Image dialogTitleImage, String dialogMessage, int dialogImageType,
-            String[] dialogButtonLabels, int defaultIndex) {
-        super(parentShell, dialogTitle, dialogTitleImage, dialogMessage,
-                dialogImageType, dialogButtonLabels, defaultIndex);
-    }
-
-    @Override
-    protected Control createMessageArea(Composite composite) 
-    {
-        // create composite
-        // create image
-        Image image = getImage();
-        if (image != null) {
-            imageLabel = new Label(composite, SWT.NULL);
-            image.setBackground(imageLabel.getBackground());
-            imageLabel.setImage(image);
-            addAccessibleListeners(imageLabel, image);
-            GridDataFactory.fillDefaults().align(SWT.CENTER, SWT.BEGINNING)
-                    .applyTo(imageLabel);
-        }
-        // create message
-        if (message != null) {
-            _messageLabel = new Text(composite, getMessageLabelStyle()|SWT.READ_ONLY);
-            _messageLabel.setText(message);
-            GridDataFactory
-                    .fillDefaults()
-                    .align(SWT.FILL, SWT.BEGINNING)
-                    .grab(true, false)
-                    .hint(
-                            convertHorizontalDLUsToPixels(IDialogConstants.MINIMUM_MESSAGE_AREA_WIDTH),
-                            SWT.DEFAULT).applyTo(_messageLabel);
-        }
-        return composite;   
-    }
-    
-    /**
-     * NOTE: copied from IconAndMessageDialog
-     * Add an accessible listener to the label if it can be inferred from the
-     * image.
-     * 
-     * @param label
-     * @param image
-     */
-    private void addAccessibleListeners(Label label, final Image image) {
-        label.getAccessible().addAccessibleListener(new AccessibleAdapter() {
-            public void getName(AccessibleEvent event) {
-                final String accessibleMessage = getAccessibleMessageFor(image);
-                if (accessibleMessage == null) {
-                    return;
-                }
-                event.result = accessibleMessage;
-            }
-        });
-    }
-    
-    /**
-     * NOTE: copied from IconAndMessageDialog
-     * @param image
-     * @return an accesible string
-     */
-    private String getAccessibleMessageFor(Image image) {
-        if (image.equals(getErrorImage())) {
-            return JFaceResources.getString("error");//$NON-NLS-1$
-        }
-
-        if (image.equals(getWarningImage())) {
-            return JFaceResources.getString("warning");//$NON-NLS-1$
-        }
-
-        if (image.equals(getInfoImage())) {
-            return JFaceResources.getString("info");//$NON-NLS-1$
-        }
-
-        if (image.equals(getQuestionImage())) {
-            return JFaceResources.getString("question"); //$NON-NLS-1$
-        }
-
-        return null;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/classpath/WarningMessageDialogWithToggle.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/classpath/WarningMessageDialogWithToggle.java
deleted file mode 100644
index f86700b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/classpath/WarningMessageDialogWithToggle.java
+++ /dev/null
@@ -1,144 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.ui.internal.classpath;
-
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.MessageDialogWithToggle;
-import org.eclipse.jface.layout.GridDataFactory;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.accessibility.AccessibleAdapter;
-import org.eclipse.swt.accessibility.AccessibleEvent;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * Customized warning dialog for JSF Library Upgrade warnings.
- * 
- * @author cbateman
- * @deprecated
- */
-class WarningMessageDialogWithToggle extends MessageDialogWithToggle 
-{
-    private Text    _messageLabel;
-
-    /**
-     * @param parent
-     * @param title
-     * @param message
-     * @param toggleMessage
-     * @param toggleState
-     * @param store
-     * @param key
-     * @return the dialog.
-     * 
-     * Overriden to make default button CANCEL and use this dialog
-     */
-    public static MessageDialogWithToggle openOkCancelConfirm(Shell parent,
-            String title, String message, String toggleMessage,
-            boolean toggleState, IPreferenceStore store, String key) {
-        MessageDialogWithToggle dialog = new WarningMessageDialogWithToggle(parent,
-                title, null, // accept the default window icon
-                message, QUESTION, new String[] { IDialogConstants.OK_LABEL,
-                        IDialogConstants.CANCEL_LABEL }, 1, // CANCEL is the default
-                toggleMessage, toggleState);
-        dialog.open();
-        return dialog;
-    }
-    
-    WarningMessageDialogWithToggle(Shell parentShell, String dialogTitle,
-            Image image, String message, int dialogImageType,
-            String[] dialogButtonLabels, int defaultIndex,
-            String toggleMessage, boolean toggleState) {
-        super(parentShell, dialogTitle, image, message, dialogImageType,
-                dialogButtonLabels, defaultIndex, toggleMessage, toggleState);
-    }
-
-    @Override
-    protected Control createMessageArea(Composite composite) 
-    {
-        // create composite
-        // create image
-        Image image = getImage();
-        if (image != null) {
-            imageLabel = new Label(composite, SWT.NULL);
-            image.setBackground(imageLabel.getBackground());
-            imageLabel.setImage(image);
-            addAccessibleListeners(imageLabel, image);
-            GridDataFactory.fillDefaults().align(SWT.CENTER, SWT.BEGINNING)
-                    .applyTo(imageLabel);
-        }
-        // create message
-        if (message != null) {
-            _messageLabel = new Text(composite, getMessageLabelStyle()|SWT.READ_ONLY);
-            _messageLabel.setText(message);
-            GridDataFactory
-                    .fillDefaults()
-                    .align(SWT.FILL, SWT.BEGINNING)
-                    .grab(true, false)
-                    .hint(
-                            convertHorizontalDLUsToPixels(IDialogConstants.MINIMUM_MESSAGE_AREA_WIDTH),
-                            SWT.DEFAULT).applyTo(_messageLabel);
-        }
-        return composite;   
-    }
-    
-    /**
-     * NOTE: copied from IconAndMessageDialog
-     * Add an accessible listener to the label if it can be inferred from the
-     * image.
-     * 
-     * @param label
-     * @param image
-     */
-    private void addAccessibleListeners(Label label, final Image image) {
-        label.getAccessible().addAccessibleListener(new AccessibleAdapter() {
-            public void getName(AccessibleEvent event) {
-                final String accessibleMessage = getAccessibleMessageFor(image);
-                if (accessibleMessage == null) {
-                    return;
-                }
-                event.result = accessibleMessage;
-            }
-        });
-    }
-    
-    /**
-     * NOTE: copied from IconAndMessageDialog
-     * @param image
-     * @return an accesible string
-     */
-    private String getAccessibleMessageFor(Image image) {
-        if (image.equals(getErrorImage())) {
-            return JFaceResources.getString("error");//$NON-NLS-1$
-        }
-
-        if (image.equals(getWarningImage())) {
-            return JFaceResources.getString("warning");//$NON-NLS-1$
-        }
-
-        if (image.equals(getInfoImage())) {
-            return JFaceResources.getString("info");//$NON-NLS-1$
-        }
-
-        if (image.equals(getQuestionImage())) {
-            return JFaceResources.getString("question"); //$NON-NLS-1$
-        }
-
-        return null;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/common/Messages.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/common/Messages.java
deleted file mode 100644
index 30e0e9e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/common/Messages.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.ui.internal.common;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * @author cbateman
- *
- */
-public class Messages extends NLS
-{
-    private static final String BUNDLE_NAME = "org.eclipse.jst.jsf.ui.internal.common.messages"; //$NON-NLS-1$
-    /**
-     * see messages.properties
-     */
-    public static String        ViewObjectPresenter_ComponentClass;
-    /**
-     * see messages.properties
-     */
-    public static String        ViewObjectPresenter_ComponentFamily;
-    /**
-     * see messages.properties
-     */
-    public static String        ViewObjectPresenter_ComponentType;
-    /**
-     * see messages.properties
-     */
-    public static String        ViewObjectPresenter_RenderType;
-    static
-    {
-        // initialize resource bundle
-        NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-    }
-
-    private Messages()
-    {
-        // no instantiation
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/common/MetadataTagImageManager.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/common/MetadataTagImageManager.java
deleted file mode 100644
index dd15ad5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/common/MetadataTagImageManager.java
+++ /dev/null
@@ -1,202 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.ui.internal.common;
-
-import java.util.Iterator;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.jsf.common.metadata.Entity;
-import org.eclipse.jst.jsf.common.metadata.Model;
-import org.eclipse.jst.jsf.common.metadata.Trait;
-import org.eclipse.jst.jsf.common.metadata.internal.IImageDescriptorProvider;
-import org.eclipse.jst.jsf.common.metadata.internal.IMetaDataSourceModelProvider;
-import org.eclipse.jst.jsf.common.metadata.internal.TraitValueHelper;
-import org.eclipse.jst.jsf.common.metadata.query.ITaglibDomainMetaDataModelContext;
-import org.eclipse.jst.jsf.common.metadata.query.TaglibDomainMetaDataQueryHelper;
-import org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfo;
-import org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfos;
-import org.eclipse.jst.jsf.ui.internal.JSFUiPlugin;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * @author cbateman
- * 
- */
-public class MetadataTagImageManager
-{
-    private static final String TRAIT_ICON_SMALL = "small-icon"; //$NON-NLS-1$
-
-    private static final String TRAIT_ICON_LARGE = "large-icon"; //$NON-NLS-1$
-
-    /**
-     * @param project
-     * @param tagId
-     * @return small image using metadata. May be null.
-     */
-    public Image getSmallIconImage(final IProject project, final TagIdentifier tagId)
-    {
-        return getSmallIconImage(project, tagId.getUri(), tagId.getTagName());
-    }
-    
-    /**
-     * Returns small image using metadata and may be null. Caller should NOT
-     * dispose the image, but should call TagImageManager's dispose(image)
-     * 
-     * @param project
-     * @param nsUri
-     * @param tagName
-     * @return small image using metadata. May be null.
-     */
-    public Image getSmallIconImage(final IProject project, final String nsUri,
-            final String tagName)
-    {
-        Image image = null;
-        final Model model = getModel(project, nsUri);
-        if (model != null)
-        {
-            final ImageDescriptor imgDesc = getIconImageDescriptor(model,
-                    tagName, true);
-            image = getOrCreateImage(imgDesc);
-        }
-
-        return image;
-    }
-
-    private Image getOrCreateImage(final ImageDescriptor imgDesc)
-    {
-        Image image = null;
-        if (imgDesc != null)
-        {
-            image = JSFUiPlugin.getDefault().getImageRegistry().get(
-                    imgDesc.toString());
-            if (image == null)
-            {
-                image = imgDesc.createImage();
-                JSFUiPlugin.getDefault().getImageRegistry().put(
-                        imgDesc.toString(), image);
-            }
-            else if (image.isDisposed())
-            { // should not occur, but handling just in case
-                JSFUiPlugin.getDefault().getImageRegistry().remove(
-                        imgDesc.toString());
-                image = imgDesc.createImage();
-                JSFUiPlugin.getDefault().getImageRegistry().put(
-                        imgDesc.toString(), image);
-            }
-        }
-        return image;
-    }
-
-    private Model getModel(final IProject project, final String nsUri)
-    {
-        final ITaglibDomainMetaDataModelContext modelContext = TaglibDomainMetaDataQueryHelper
-                .createMetaDataModelContext(project, nsUri);
-        final Model model = TaglibDomainMetaDataQueryHelper
-                .getModel(modelContext);
-        // no caching at this time so there is no need to listen to model
-        // notifications
-        // if (model != null && !hasAdapter(model))
-        // addAdapter(model);
-        return model;
-    }
-
-    private ImageDescriptor getIconImageDescriptor(final Model model,
-            final String tagName, final boolean small)
-    {
-        ImageDescriptor icon = null;
-
-        // use palette infos if available
-        final Trait trait = TaglibDomainMetaDataQueryHelper.getTrait(model,
-                "paletteInfos"); //$NON-NLS-1$
-        if (trait != null)
-        {
-            final PaletteInfos tags = (PaletteInfos) trait.getValue();
-            for (final Iterator it = tags.getInfos().iterator(); it.hasNext();)
-            {
-                final PaletteInfo tag = (PaletteInfo) it.next();
-                if (tag.getId().equalsIgnoreCase(tagName))
-                {
-                    final IMetaDataSourceModelProvider sourceProvider = ((Trait) tag
-                            .eContainer().eContainer())
-                            .getSourceModelProvider();
-                    if (small)
-                    {
-                        icon = getImageDescriptorFromString(sourceProvider, tag
-                                .getSmallIcon());
-                    }
-                    else
-                    {
-                        icon = getImageDescriptorFromString(sourceProvider, tag
-                                .getLargeIcon());
-                    }
-
-                    break;
-                }
-            }
-        }
-        else
-        {
-            for (final Iterator it = model.getChildEntities().iterator(); it
-                    .hasNext();)
-            {
-                final Entity tagAsEntity = (Entity) it.next();
-                if (tagAsEntity.getId().equalsIgnoreCase(tagName))
-                {
-                    if (small)
-                    {
-                        icon = getImageDescriptorFromTagTraitValueAsString(
-                                tagAsEntity, TRAIT_ICON_SMALL, ImageDescriptor
-                                        .getMissingImageDescriptor());
-                    }
-                    else
-                    {
-                        icon = getImageDescriptorFromTagTraitValueAsString(
-                                tagAsEntity, TRAIT_ICON_LARGE, ImageDescriptor
-                                        .getMissingImageDescriptor());
-                    }
-
-                    break;
-                }
-            }
-
-        }
-
-        return icon;
-    }
-
-    private ImageDescriptor getImageDescriptorFromString(
-            IMetaDataSourceModelProvider sourceModelProvider, String imgDesc)
-    {
-        ImageDescriptor image = null;
-        IImageDescriptorProvider imageProvider = (IImageDescriptorProvider) sourceModelProvider
-                .getAdapter(IImageDescriptorProvider.class);
-        if (imageProvider != null)
-        {
-            image = imageProvider.getImageDescriptor(imgDesc);
-        }
-        return image;
-    }
-
-    private ImageDescriptor getImageDescriptorFromTagTraitValueAsString(
-            Entity entity, String key, ImageDescriptor defaultValue)
-    {
-        Trait t = TaglibDomainMetaDataQueryHelper.getTrait(entity, key);
-        if (t != null)
-        {
-            String imgDesc = TraitValueHelper.getValueAsString(t);
-            return getImageDescriptorFromString(t.getSourceModelProvider(),
-                    imgDesc);
-        }
-        return defaultValue;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/common/ViewObjectPresenter.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/common/ViewObjectPresenter.java
deleted file mode 100644
index 20734ed..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/common/ViewObjectPresenter.java
+++ /dev/null
@@ -1,244 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.ui.internal.common;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.jst.jsf.common.runtime.internal.model.IDesigntimeAdapter;
-import org.eclipse.jst.jsf.common.runtime.internal.model.component.ComponentInfo;
-import org.eclipse.jst.jsf.common.runtime.internal.model.component.ComponentTypeInfo;
-
-/**
- * Generates UI form text strings for certain view objects.
- * 
- * @author cbateman
- * 
- */
-public final class ViewObjectPresenter
-{
-    /**
-     * @param typeInfo
-     * @return a presentation string containing all the summary information for
-     *         a typeInfo. Excludes interfaces and superclasses.
-     */
-    public static String present(final ComponentTypeInfo typeInfo)
-    {
-        final String formatText = "<form>%s</form>"; //$NON-NLS-1$
-        final String componentType = typeInfo.getComponentType();
-        final String componentFamily = typeInfo.getComponentFamily();
-        final String renderType = typeInfo.getRenderFamily();
-        final String componentClass = typeInfo.getClassName();
-        final List<TitleValuePair> values = new ArrayList<TitleValuePair>();
-
-        values.add(new TitleValuePair(Messages.ViewObjectPresenter_ComponentType,
-                componentType == null ? "" : componentType)); //$NON-NLS-1$
-        values.add(new TitleValuePair(Messages.ViewObjectPresenter_ComponentClass,
-                componentClass == null ? "" : componentClass)); //$NON-NLS-1$
-        values.add(new TitleValuePair(Messages.ViewObjectPresenter_ComponentFamily,
-                componentFamily == null ? "" : componentFamily)); //$NON-NLS-1$
-        values.add(new TitleValuePair(Messages.ViewObjectPresenter_RenderType,
-                renderType == null ? "" : renderType)); //$NON-NLS-1$
-        return String.format(formatText, ViewObjectPresenter.createLines(values));
-    }
-    
-    /**
-     * @param compInfo
-     * @param typeInfo
-     * @return a presentation string containing all the interfaces in compInfo
-     * including adapters.
-     */
-    public static String presentCompInterfaces(final ComponentTypeInfo typeInfo, final ComponentInfo compInfo)
-    {
-        final Set<String> interfaces = new HashSet<String>();
-
-        interfaces.addAll(Arrays.asList(typeInfo.getInterfaces()));
-
-        if (compInfo != null)
-        {
-            for (final Map.Entry entry : (Set<Map.Entry>) compInfo.getAllAdapters()
-                    .entrySet())
-            {
-                final Object infObject = entry.getValue();
-                if (infObject instanceof IDesigntimeAdapter)
-                {
-                    interfaces.addAll(Arrays.asList(((IDesigntimeAdapter)infObject).getInterfaces()));
-                }
-            }
-        }
-        final List<String> sortedInterfaceNames = new ArrayList<String>(
-                interfaces);
-        Collections.sort(sortedInterfaceNames);
-
-        String text = ""; //$NON-NLS-1$
-        for (final String name : sortedInterfaceNames)
-        {
-            text += ViewObjectPresenter.createLine(null, name);
-        }
-        return String.format("<form>%s</form>", text); //$NON-NLS-1$
-    }
-
-    /**
-     * @param values
-     * @return a grouping of createLine style lines using the key/value pairs in
-     *         values for the title and value.
-     */
-    public static String createLines(final List<TitleValuePair> values)
-    {
-        String lines = ""; //$NON-NLS-1$
-        for (final TitleValuePair valueEntry : values)
-        {
-            final String title = valueEntry.getTitle();
-            final String value = valueEntry.getValue();
-
-            lines += createLine(title, value);
-        }
-        return lines;
-    }
-
-    /**
-     * @param title
-     *            may be null
-     * @param value
-     * @return a single paragraphed line containing value with title preceding
-     *         in bold if not null
-     */
-    public static String createLine(final String title, final String value)
-    {
-        if (title == null)
-        {
-            return String.format("<p>%s</p>", value); //$NON-NLS-1$
-        }
-        return String.format("<p><b>%s</b>: %s</p>", title, value); //$NON-NLS-1$
-    }
-
-    /**
-     * A title/value pair. Title may be null. Comparable canonically based title
-     * (ascending).
-     * 
-     * @author cbateman
-     * 
-     */
-    public final static class TitleValuePair implements
-            Comparable<TitleValuePair>
-    {
-        private final String _title;
-        private final String _value;
-
-        /**
-         * @param title
-         * @param value
-         */
-        public TitleValuePair(String title, String value)
-        {
-            super();
-            if (value == null)
-            {
-                throw new IllegalArgumentException("Value must not be null"); //$NON-NLS-1$
-            }
-
-            _title = title;
-            _value = value;
-        }
-
-        /**
-         * @return the title
-         */
-        protected final String getTitle()
-        {
-            return _title;
-        }
-
-        /**
-         * @return the value
-         */
-        protected final String getValue()
-        {
-            return _value;
-        }
-
-        public int compareTo(TitleValuePair other)
-        {
-            if (this == other)
-            {
-                return 0;
-            }
-            
-            if (other == null)
-            {
-                return 1;
-            }
-            
-            if (_title == null)
-            {
-                return other.getTitle() == null ? 0 : 1;
-            }
-            else if (other.getTitle() == null)
-            {
-                // _title is not null
-                return 1;
-            }
-            
-            return _title.compareTo(other.getTitle());
-        }
-
-        @Override
-        public boolean equals(Object obj)
-        {
-            if (this == obj)
-            {
-                return true;
-            }
-            
-            if (obj instanceof TitleValuePair)
-            {
-                
-                final TitleValuePair other = (TitleValuePair) obj;
-                final String otherValue =  other.getValue();
-                
-                if (!otherValue.equals(_value))
-                {
-                    return false;
-                }
-                
-                final String otherTitle = other.getTitle();
-                if (_title == null)
-                {
-                    return otherTitle == null;
-                }
-                else if (otherTitle == null)
-                {
-                    return _title == null;
-                }
-                return _title.equals(otherTitle);
-            }
-            return false;
-        }
-
-        @Override
-        public int hashCode()
-        {
-            return getTitle().hashCode();
-        }
-        
-        
-    }
-
-    private ViewObjectPresenter()
-    {
-        // no instantiation
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/common/messages.properties b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/common/messages.properties
deleted file mode 100644
index 6afee68..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/common/messages.properties
+++ /dev/null
@@ -1,14 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2008 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-ViewObjectPresenter_ComponentClass=Component Class
-ViewObjectPresenter_ComponentFamily=Component Family
-ViewObjectPresenter_ComponentType=Component Type
-ViewObjectPresenter_RenderType=Render Type
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/component/ComponentInstanceDetailsForm.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/component/ComponentInstanceDetailsForm.java
deleted file mode 100644
index 7381809..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/component/ComponentInstanceDetailsForm.java
+++ /dev/null
@@ -1,224 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.ui.internal.component;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.jdt.core.Signature;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jst.jsf.common.runtime.internal.model.component.ComponentInfo;
-import org.eclipse.jst.jsf.common.runtime.internal.model.component.ComponentTypeInfo;
-import org.eclipse.jst.jsf.common.runtime.internal.model.component.ComponentInfo.ComponentBeanProperty;
-import org.eclipse.jst.jsf.common.runtime.internal.model.decorator.ComponentDecorator;
-import org.eclipse.jst.jsf.common.runtime.internal.model.decorator.ConverterDecorator;
-import org.eclipse.jst.jsf.common.runtime.internal.model.decorator.FacetDecorator;
-import org.eclipse.jst.jsf.common.runtime.internal.model.decorator.ValidatorDecorator;
-import org.eclipse.jst.jsf.common.ui.internal.form.AbstractXMLSectionsDetailsForm;
-import org.eclipse.jst.jsf.ui.internal.common.ViewObjectPresenter;
-import org.eclipse.jst.jsf.ui.internal.common.ViewObjectPresenter.TitleValuePair;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.widgets.Composite;
-
-/**
- * Detail section for a component instance.
- * 
- * @author cbateman
- * 
- */
-/* package */class ComponentInstanceDetailsForm extends
-        AbstractXMLSectionsDetailsForm
-{
-
-    private static final String COMPONENT_SECTION_KEY      = "componentSection"; //$NON-NLS-1$
-    private final static String COMPONENT_TYPE_SECTION_KEY = "componentTypeSection"; //$NON-NLS-1$
-    private static final String COMPONENT_INTERFACES_KEY   = "componentInterfacesSection"; //$NON-NLS-1$
-    private static final String COMPONENT_DECORATORS_KEY = "componentDecorators"; //$NON-NLS-1$
-    private static final String COMPONENT_PROPERTIES_KEY = "componentProperties"; //$NON-NLS-1$
-    private final LabelProvider _labelProvider = new MyLabelProvider();
-
-    private XMLTextSection      _componentTypeSection;
-    private XMLTextSection      _componentSection;
-    private XMLTextSection      _componentInterfacesSection;
-    private XMLTextSection      _componentDecoratorsSection;
-    private XMLTextSection      _componentPropertiesSection;
-
-    @Override
-    protected void doUpdateSelection(final Object newSelection)
-    {
-        if (newSelection instanceof ComponentInfo)
-        {
-            final ComponentInfo compInfo = (ComponentInfo) newSelection;
-            updateComponentSection(compInfo);
-            updateComponentDecoratorsSection(compInfo);
-            updateComponentPropertiesSection(compInfo);
-            final ComponentTypeInfo typeInfo = compInfo.getComponentTypeInfo();
-            if (typeInfo != null)
-            {
-                updateComponentTypeSection(typeInfo);
-                updateComponentInterfacesSection(compInfo, typeInfo);
-            }
-        }
-    }
-
-    private void updateComponentSection(final ComponentInfo compInfo)
-    {
-        final String formatText = "<form>%s</form>"; //$NON-NLS-1$
-        final String className = compInfo.getComponentTypeInfo().getClassName();
-        final String id = compInfo.getId();
-        final ComponentInfo parent = compInfo.getParent();
-        final List<TitleValuePair> values = new ArrayList<TitleValuePair>();
-        values.add(new TitleValuePair(Messages.ComponentInstanceDetailsForm_Name, className != null ? Signature
-                .getSimpleName(className) : "")); //$NON-NLS-1$
-        values.add(new TitleValuePair(Messages.ComponentInstanceDetailsForm_Id, id != null ? id : Messages.ComponentInstanceDetailsForm_None));
-        values
-                .add(new TitleValuePair(Messages.ComponentInstanceDetailsForm_ParentId, (parent != null && parent.getId() != null)
-                        ? parent.getId()
-                        : Messages.ComponentInstanceDetailsForm_None));
-
-        _componentSection.setText(String
-                .format(formatText, ViewObjectPresenter.createLines(values)), true, false);
-        _componentSection.refresh();
-    }
-
-    private void updateComponentTypeSection(final ComponentTypeInfo typeInfo)
-    {
-        _componentTypeSection.setText(ViewObjectPresenter.present(typeInfo),
-                true, false);
-        _componentTypeSection.refresh();
-    }
-
-    private void updateComponentInterfacesSection(final ComponentInfo compInfo,
-            final ComponentTypeInfo typeInfo)
-    {
-        _componentInterfacesSection.setText(ViewObjectPresenter
-                .presentCompInterfaces(typeInfo, compInfo), true, false);
-        _componentInterfacesSection.refresh();
-    }
-
-    private void updateComponentDecoratorsSection(final ComponentInfo compInfo)
-    {
-        List<TitleValuePair> decoratorLines = new ArrayList<TitleValuePair>();
-        String text = ""; //$NON-NLS-1$
-        for (final ComponentDecorator decorator : (List<ComponentDecorator>) compInfo
-                .getAllDecorators())
-        {
-            String labelText = _labelProvider.getText(decorator);
-
-            if (labelText != null)
-            {
-                //text += ViewObjectPresenter.createLine(null, labelText);
-                decoratorLines.add(new TitleValuePair(null, labelText));
-            }
-        }
-        Collections.sort(decoratorLines);
-        text = ViewObjectPresenter.createLines(decoratorLines);
-        _componentDecoratorsSection.setText(String.format("<form>%s</form>", //$NON-NLS-1$
-                text), true, false);
-        _componentDecoratorsSection.refresh();
-
-     }
-
-    private void updateComponentPropertiesSection(final ComponentInfo compInfo)
-    {
-        List<TitleValuePair> propertyLines = new ArrayList<TitleValuePair>();
-        String text = ""; //$NON-NLS-1$
-        Set<String> propNames = compInfo.getAttributeNames();
-
-        for (final String propName : propNames)
-        {
-            final ComponentBeanProperty propValue = compInfo
-                    .getAttribute(propName);
-            if (propValue != null)
-            {
-                Object value = propValue.getValue();
-                if (value != null)
-                {
-                    propertyLines.add(new TitleValuePair(propName, value.toString()));
-                }
-            }
-        }
-        Collections.sort(propertyLines);
-        text = ViewObjectPresenter.createLines(propertyLines);
-        _componentPropertiesSection.setText(String.format("<form>%s</form>", //$NON-NLS-1$
-                text), true, false);
-        _componentPropertiesSection.refresh();
-
-    }
-
-    @Override
-    protected Map<? extends Object, XMLTextSection> createXMLTextSections(
-            final Composite parent)
-    {
-        final Map<String, XMLTextSection> sections = new HashMap<String, XMLTextSection>();
-        _componentSection = new XMLTextSection(getToolkit(), parent,
-                Messages.ComponentInstanceDetailsForm_InstanceInfo);
-        sections.put(COMPONENT_SECTION_KEY, _componentSection);
-
-        _componentTypeSection = new XMLTextSection(getToolkit(), parent,
-                Messages.ComponentInstanceDetailsForm_TypeInstanceInfo);
-        sections.put(COMPONENT_TYPE_SECTION_KEY, _componentTypeSection);
-
-        _componentInterfacesSection = new XMLTextSection(getToolkit(), parent,
-                Messages.ComponentInstanceDetailsForm_Interfaces);
-        sections.put(COMPONENT_INTERFACES_KEY, _componentInterfacesSection);
-        
-        _componentDecoratorsSection = new XMLTextSection(getToolkit(), parent,
-                Messages.ComponentInstanceDetailsForm_Decorators);
-        sections.put(COMPONENT_DECORATORS_KEY, _componentDecoratorsSection);
-        
-        _componentPropertiesSection = new XMLTextSection(getToolkit(), parent,
-                Messages.ComponentInstanceDetailsForm_Properties);
-        sections.put(COMPONENT_PROPERTIES_KEY, _componentPropertiesSection);
-
-        return sections;
-    }
-
-    @Override
-    protected Set<XMLTextSection> getInitiallyExpanded(
-            final Map<Object, XMLTextSection> sections)
-    {
-        return Collections.singleton(_componentSection);
-    }
-
-    private static class MyLabelProvider extends LabelProvider
-    {
-        @Override
-        public String getText(Object element)
-        {
-            if (element instanceof ComponentDecorator)
-            {
-                if  (element instanceof ConverterDecorator)
-                {
-                    final ConverterDecorator converter = (ConverterDecorator) element;
-                    return NLS.bind(Messages.ComponentInstanceDetailsForm_Converter, converter.getTypeInfo().getConverterId(), converter.getTypeInfo().getClassName());                    
-                }
-                else if (element instanceof ValidatorDecorator)
-                {
-                    final ValidatorDecorator validator = (ValidatorDecorator) element;
-                    return NLS.bind(Messages.ComponentInstanceDetailsForm_Validator, validator.getTypeInfo().getValidatorId(), validator.getTypeInfo().getClassName());
-                }
-                else if (element instanceof FacetDecorator)
-                {
-                    final FacetDecorator decorator = (FacetDecorator) element;
-                    return NLS.bind(Messages.ComponentInstanceDetailsForm_Facet, decorator.getName(), decorator.getDecorates().getId());
-                }
-            }
-
-            return null;
-        }
-
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/component/ComponentMasterDetailBlock.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/component/ComponentMasterDetailBlock.java
deleted file mode 100644
index 4c846c8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/component/ComponentMasterDetailBlock.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.ui.internal.component;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jst.jsf.common.runtime.internal.model.component.ComponentInfo;
-import org.eclipse.jst.jsf.common.ui.internal.form.AbstractDetailsForm;
-import org.eclipse.jst.jsf.common.ui.internal.form.AbstractMasterDetailBlock;
-import org.eclipse.jst.jsf.common.ui.internal.form.AbstractMasterForm;
-import org.eclipse.jst.jsf.common.ui.internal.form.AbstractXMLSectionsDetailsForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/*package*/ class ComponentMasterDetailBlock extends AbstractMasterDetailBlock
-{
-    private final DTJSFViewModel _model;
-    private AbstractXMLSectionsDetailsForm _componentInstanceDetailsForm;
-
-    public ComponentMasterDetailBlock(final DTJSFViewModel model)
-    {
-        _model = model;
-    }
-
-    @Override
-    protected List<AbstractDetailsForm> createDetailPages()
-    {
-        final List<AbstractDetailsForm> pages =
-            new ArrayList<AbstractDetailsForm>();
-
-        _componentInstanceDetailsForm = new ComponentInstanceDetailsForm();
-        pages.add(_componentInstanceDetailsForm);
-
-        return pages;
-    }
-
-    @Override
-    protected AbstractMasterForm createMasterPart(final FormToolkit toolkit)
-    {
-        return new ComponentMasterForm(toolkit, _model);
-    }
-
-    @Override
-    protected AbstractXMLSectionsDetailsForm doSelectPage(final Object forModel)
-    {
-        if (forModel instanceof ComponentInfo)
-        {
-            return _componentInstanceDetailsForm;
-        }
-        return null;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/component/ComponentMasterForm.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/component/ComponentMasterForm.java
deleted file mode 100644
index 568edba..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/component/ComponentMasterForm.java
+++ /dev/null
@@ -1,307 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.ui.internal.component;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.jface.viewers.IInputProvider;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerSorter;
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.jsf.common.runtime.internal.model.ViewObject;
-import org.eclipse.jst.jsf.common.runtime.internal.model.component.ComponentInfo;
-import org.eclipse.jst.jsf.common.runtime.internal.model.decorator.ConverterDecorator;
-import org.eclipse.jst.jsf.common.runtime.internal.model.decorator.Decorator;
-import org.eclipse.jst.jsf.common.runtime.internal.model.decorator.ValidatorDecorator;
-import org.eclipse.jst.jsf.common.ui.JSFUICommonPlugin;
-import org.eclipse.jst.jsf.common.ui.internal.form.AbstractMasterForm;
-import org.eclipse.jst.jsf.common.ui.internal.utils.JSFSharedImages;
-import org.eclipse.jst.jsf.designtime.internal.view.DTUIViewRoot;
-import org.eclipse.jst.jsf.designtime.internal.view.XMLViewObjectMappingService;
-import org.eclipse.jst.jsf.designtime.internal.view.XMLViewObjectMappingService.ElementData;
-import org.eclipse.jst.jsf.ui.internal.common.MetadataTagImageManager;
-import org.eclipse.jst.jsf.ui.internal.component.ComponentTreeViewProvider.TreePlaceHolder;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.swt.widgets.Tree;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/*package*/class ComponentMasterForm extends AbstractMasterForm
-{
-    private final DTJSFViewModel _model;
-    private TreeViewer           _treeViewer;
-    private Action               _refreshAction;
-
-    protected ComponentMasterForm(final FormToolkit toolkit,
-            final DTJSFViewModel model)
-    {
-        super(toolkit);
-        _model = model;
-    }
-
-    @Override
-    public Control createClientArea(final Composite parent)
-    {
-        final Tree tree = getToolkit().createTree(parent,
-                SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
-        final GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, true);
-        tree.setLayoutData(gridData);
-
-        _treeViewer = new TreeViewer(tree);
-        _treeViewer.getTree().setLayoutData(gridData);
-        _treeViewer.setContentProvider(new ComponentTreeViewProvider());
-        _treeViewer.setLabelProvider(new TreeViewLabelProvider(_treeViewer));
-        _treeViewer.setSorter(new ComponentTreeSorter());
-        _treeViewer.addSelectionChangedListener(new ISelectionChangedListener()
-        {
-            public void selectionChanged(final SelectionChangedEvent event)
-            {
-                getListener().selectionChanged(event);
-            }
-
-        });
-
-        _model.init(new Runnable()
-        {
-            public void run()
-            {
-                PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable()
-                {
-                    public void run()
-                    {
-                        final Object[] expanded = _treeViewer
-                                .getExpandedElements();
-                        _treeViewer.refresh();
-                        _treeViewer.setExpandedElements(expanded);
-                    }
-                });
-            }
-        });
-
-        _treeViewer.setInput(_model);
-
-        makeActions();
-        return tree;
-    }
-
-    @Override
-    protected void contributeActions(final IToolBarManager formManager,
-            final IToolBarManager localManager)
-    {
-        // contribute to local tool bar
-        localManager.add(_refreshAction);
-        localManager.update(false);
-    }
-
-    private void makeActions()
-    {
-        _refreshAction = new Action()
-        {
-            @Override
-            public void run()
-            {
-                _model.update();
-            }
-        };
-        _refreshAction.setText(Messages.ComponentMasterForm_RefreshView);
-        _refreshAction.setToolTipText(Messages.ComponentMasterForm_RefreshView);
-        _refreshAction.setImageDescriptor(JSFUICommonPlugin.getDefault()
-                .getImageDescriptor("refresh_nav_16.gif")); //$NON-NLS-1$
-    }
-
-    @Override
-    protected void contributeToHeadArea(final FormToolkit toolkit,
-            final Composite container)
-    {
-        final Text label = new Text(container
-                , SWT.READ_ONLY | SWT.SINGLE | SWT.LEFT);
-
-        String viewId = _model.getViewId();
-        viewId = viewId == null ? Messages.ComponentMasterForm_Unknown : viewId;        
-        label.setText(NLS.bind(Messages.ComponentMasterForm_HeadAreaText,  viewId,
-                _model.getProject().getName())); 
-    }
-
-    private static class TreeViewLabelProvider extends LabelProvider
-    {
-        private final IInputProvider          _inputProvider;
-        private final MetadataTagImageManager _metadataIconManager;
-
-        /**
-         * @param inputProvider
-         */
-        private TreeViewLabelProvider(final IInputProvider inputProvider)
-        {
-            super();
-            _inputProvider = inputProvider;
-            _metadataIconManager = new MetadataTagImageManager();
-        }
-
-        @Override
-        public String getText(final Object obj)
-        {
-            if (obj instanceof ComponentInfo)
-            {
-                String text = ""; //$NON-NLS-1$
-                final ComponentInfo compInfo = (ComponentInfo) obj;
-                String className = compInfo.getComponentTypeInfo()
-                        .getClassName();
-                final int dotIdx = className.lastIndexOf('.');
-                if (dotIdx > -1 && dotIdx + 1 < className.length())
-                {
-                    className = className.substring(dotIdx + 1);
-                }
-                text = className;
-
-                final String id = compInfo.getId();
-
-                if (id != null)
-                {
-                    text += " (id=" + id + ")"; //$NON-NLS-1$ //$NON-NLS-2$
-                }
-                return text;
-            }
-            else if (obj instanceof TreePlaceHolder)
-            {
-                return Messages.ComponentMasterForm_CalculatingView;
-            }
-            return obj.toString();
-        }
-
-        @Override
-        public Image getImage(final Object obj)
-        {
-            Image image = null;
-            if (obj instanceof ViewObject)
-            {
-                final XMLViewObjectMappingService mappingService = getMappingService();
-
-                if (mappingService != null)
-                {
-                    final ElementData elementData = mappingService
-                            .findElementData((ViewObject) obj);
-
-                    if (elementData != null)
-                    {
-                        final TagIdentifier tagId = elementData.getTagId();
-                        final DTJSFViewModel model = getModel();
-                        if (model != null)
-                        {
-                            image = _metadataIconManager.getSmallIconImage(
-                                    model.getProject(), tagId);
-                        }
-                    }
-                }
-                if (image == null)
-                {
-                    image = getDefaultImage((ViewObject) obj);
-                }
-            }
-            else if (obj instanceof TreePlaceHolder)
-            {
-                return JSFUICommonPlugin.getDefault().getImage("configs.gif"); //$NON-NLS-1$
-            }
-            if (image == null)
-            {
-                final String imageKey = ISharedImages.IMG_OBJ_ELEMENT;
-                image = PlatformUI.getWorkbench().getSharedImages().getImage(
-                        imageKey);
-            }
-
-            return image;
-        }
-
-        private XMLViewObjectMappingService getMappingService()
-        {
-            final DTJSFViewModel model = getModel();
-
-            if (model != null)
-            {
-                final DTUIViewRoot root = model.getRoot();
-
-                if (root != null)
-                {
-                    return (XMLViewObjectMappingService) root.getServices()
-                            .getAdapter(XMLViewObjectMappingService.class);
-                }
-            }
-            return null;
-        }
-
-        private DTJSFViewModel getModel()
-        {
-            final Object input = _inputProvider.getInput();
-
-            if (input instanceof DTJSFViewModel)
-            {
-                return (DTJSFViewModel) input;
-            }
-            return null;
-        }
-
-        private Image getDefaultImage(final ViewObject obj)
-        {
-            if (obj instanceof DTUIViewRoot)
-            {
-                return JSFUICommonPlugin.getDefault().getImage(
-                        JSFSharedImages.GENERIC_VIEWROOT_IMG);
-            }
-            if (obj instanceof ComponentInfo)
-            {
-                return JSFUICommonPlugin.getDefault().getImage(
-                        JSFSharedImages.GENERIC_OBJECT_IMG);
-            }
-            else if (obj instanceof ConverterDecorator)
-            {
-                return JSFUICommonPlugin.getDefault().getImage(
-                        JSFSharedImages.GENERIC_CONVERTER_IMG);
-            }
-            else if (obj instanceof ValidatorDecorator)
-            {
-                return JSFUICommonPlugin.getDefault().getImage(
-                        JSFSharedImages.GENERIC_VALIDATOR_IMG);
-            }
-            return JSFUICommonPlugin.getDefault().getImage(
-                    JSFSharedImages.DEFAULT_PALETTE_TAG_IMG);
-        }
-    }
-
-    private static class ComponentTreeSorter extends ViewerSorter
-    {
-        @Override
-        public int compare(final Viewer viewer, final Object e1, final Object e2)
-        {
-            return 0;
-        }
-
-        @Override
-        public int category(final Object element)
-        {
-            // sort decorators first into their own category
-            if (element instanceof Decorator)
-            {
-                return 0;
-            }
-            return 1;
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/component/ComponentTreeView.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/component/ComponentTreeView.java
deleted file mode 100644
index 9a146b4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/component/ComponentTreeView.java
+++ /dev/null
@@ -1,175 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.ui.internal.component;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jst.jsf.common.ui.JSFUICommonPlugin;
-import org.eclipse.jst.jsf.common.ui.internal.utils.JSFSharedImages;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.internal.ResolverUtil;
-import org.eclipse.jst.jsf.designtime.DesignTimeApplicationManager;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.ui.IViewSite;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.forms.widgets.Form;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.part.IPage;
-import org.eclipse.ui.part.MessagePage;
-import org.eclipse.ui.part.Page;
-import org.eclipse.ui.part.PageBook;
-import org.eclipse.ui.part.PageBookView;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
-
-/**
- * A basic page-based view, similar to outline, that shows the design-time
- * component tree for a JSF view definition.
- */
-
-public class ComponentTreeView extends PageBookView
-{
-
-    private FormToolkit _toolkit;
-
-    @Override
-    public void init(IViewSite site) throws PartInitException
-    {
-        super.init(site);
-        setTitleImage(JSFUICommonPlugin.getDefault().getImage(JSFSharedImages.GENERIC_VIEWROOT_IMG));
-    }
-
-    @Override
-    protected IPage createDefaultPage(final PageBook book)
-    {
-        final MessagePage page = new MessagePage();
-        initPage(page);
-        page.createControl(book);
-        page.setMessage(Messages.ComponentTreeView_NothingToDisplayMessage);
-        return page;
-    }
-
-    @Override
-    protected PageRec doCreatePage(final IWorkbenchPart part)
-    {
-        _toolkit = new FormToolkit(getPageBook().getDisplay());
-        final ComponentPage page = new ComponentPage(getDocumentFromPart(part),
-                _toolkit);
-        initPage(page);
-        page.createControl(getPageBook());
-        return new PageRec(part, page);
-    }
-
-    @Override
-    protected void doDestroyPage(final IWorkbenchPart part,
-            final PageRec pageRecord)
-    {
-        pageRecord.page.dispose();
-        pageRecord.dispose();
-    }
-
-    private IDocument getDocumentFromPart(final IWorkbenchPart part)
-    {
-        return (IDocument) part.getAdapter(IDocument.class);
-    }
-
-    /**
-     * The view shows the palette associated with the active editor.
-     * 
-     * @see PageBookView#getBootstrapPart()
-     */
-    @Override
-    protected IWorkbenchPart getBootstrapPart()
-    {
-        final IWorkbenchPage page = getSite().getPage();
-        if (page != null)
-        {
-            return page.getActiveEditor();
-        }
-        return null;
-    }
-
-    @Override
-    protected boolean isImportant(final IWorkbenchPart part)
-    {
-        final IDocument document = getDocumentFromPart(part);
-
-        if (document != null)
-        {
-            final IFile file = ResolverUtil.getFileForDocument(document);
-
-            if (file != null)
-            {
-                final DesignTimeApplicationManager manager = DesignTimeApplicationManager
-                .getInstance(file.getProject());
-
-                if (manager != null)
-                {
-                    return manager.hasDTFacesContext(file);
-                }
-            }
-        }
-
-        // fall through, then no, not important.
-        return false;
-    }
-
-    private static class ComponentPage extends Page
-    {
-        private final IDocument            _document;
-        private final FormToolkit          _toolkit;
-        private ComponentMasterDetailBlock _masterDetailBlock;
-        private Form                       _form;
-        private DTJSFViewModel             _model;
-
-        public ComponentPage(final IDocument document, final FormToolkit toolkit)
-        {
-            _document = document;
-            _toolkit = toolkit;
-        }
-
-        @Override
-        public void createControl(final Composite parent)
-        {
-            _model = new DTJSFViewModel(
-                    (IStructuredDocument) _document);
-
-            _form = _toolkit.createForm(parent);
-            _form.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
-            _masterDetailBlock = new ComponentMasterDetailBlock(_model);
-            _masterDetailBlock.createContent(_toolkit, _form);
-        }
-
-        @Override
-        public void dispose()
-        {
-            super.dispose();
-            _model.dispose();
-        }
-
-        @Override
-        public Control getControl()
-        {
-            return _form;
-        }
-
-        @Override
-        public void setFocus()
-        {
-            // do nothing
-        }
-        
-        
-    }
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/component/ComponentTreeViewProvider.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/component/ComponentTreeViewProvider.java
deleted file mode 100644
index c1bec10..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/component/ComponentTreeViewProvider.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.ui.internal.component;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jst.jsf.common.runtime.internal.model.component.ComponentInfo;
-import org.eclipse.jst.jsf.designtime.internal.view.DTUIViewRoot;
-
-/**
- * A tree view adapter for a design time component tree rooted at a design time
- * view root.
- * 
- * @author cbateman
- * 
- */
-/* package */class ComponentTreeViewProvider implements
-        IStructuredContentProvider, ITreeContentProvider
-{
-    private final static Object[] NO_CHILDREN = new Object[0];
-
-    public Object[] getElements(final Object inputElement)
-    {
-        if (inputElement instanceof DTJSFViewModel)
-        {
-            final DTUIViewRoot root = ((DTJSFViewModel) inputElement).getRoot();
-
-            if (root != null)
-            {
-                return new Object[]
-                { root };
-            }
-            return new Object[] {new TreePlaceHolder()};
-        }
-        return NO_CHILDREN;
-    }
-
-    public void dispose()
-    {
-        // nothing to dispose
-    }
-
-    public void inputChanged(final Viewer viewer, final Object oldInput,
-            final Object newInput)
-    {
-        // do nothing
-    }
-
-    public Object[] getChildren(final Object parentElement)
-    {
-        if (parentElement instanceof ComponentInfo)
-        {
-            final List<Object> children = new ArrayList<Object>();
-            children.addAll(((ComponentInfo) parentElement).getChildren());
-//            children.addAll(((ComponentInfo) parentElement).getAllDecorators());
-            return children.toArray();
-        }
-        return NO_CHILDREN;
-    }
-
-    public Object getParent(final Object element)
-    {
-        if (element instanceof ComponentInfo)
-        {
-            return ((ComponentInfo)element).getParent();
-        }
-        // no parent
-        return null;
-    }
-
-    public boolean hasChildren(final Object element)
-    {
-        return getChildren(element).length > 0;
-    }
-    
-    static final class TreePlaceHolder
-    {
-        // place holder object used when recalculation is in progress
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/component/DTJSFViewModel.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/component/DTJSFViewModel.java
deleted file mode 100644
index a39d445..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/component/DTJSFViewModel.java
+++ /dev/null
@@ -1,255 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.ui.internal.component;
-
-import java.util.concurrent.atomic.AtomicBoolean;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.IJobChangeEvent;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.core.runtime.jobs.JobChangeAdapter;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IStructuredDocumentContextResolverFactory;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IWorkspaceContextResolver;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContextFactory;
-import org.eclipse.jst.jsf.designtime.DTAppManagerUtil;
-import org.eclipse.jst.jsf.designtime.DesignTimeApplicationManager;
-import org.eclipse.jst.jsf.designtime.context.DTFacesContext;
-import org.eclipse.jst.jsf.designtime.internal.view.DTUIViewRoot;
-import org.eclipse.jst.jsf.designtime.internal.view.IDTViewHandler;
-import org.eclipse.jst.jsf.designtime.internal.view.IViewRootHandle;
-import org.eclipse.jst.jsf.designtime.internal.view.DTUIViewRoot.StalenessEvent;
-import org.eclipse.jst.jsf.designtime.internal.view.DTUIViewRoot.StalenessListener;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
-
-/**
- * The top-level input model for a design time component tree
- * 
- * @author cbateman
- * 
- */
-/* package */class DTJSFViewModel
-{
-    private final IStructuredDocument        _document;
-    private final IProject                   _project;
-    private final IFile                      _file;
-    private final IStructuredDocumentContext _context;
-    private final AtomicBoolean              _alreadyUpdating = new AtomicBoolean(
-                                                                      false);
-    private Runnable                         _runnable;
-    private final IViewRootHandle            _viewRootHandle;
-    private StalenessListener                _stalenessListener;
-
-    /**
-     * @param document
-     * @throws IllegalArgumentException
-     *             if document cannot be used to initialize a component tree.
-     */
-    public DTJSFViewModel(final IStructuredDocument document)
-    {
-        _document = document;
-        _context = IStructuredDocumentContextFactory.INSTANCE.getContext(
-                _document, -1);
-
-        final IWorkspaceContextResolver resolver = IStructuredDocumentContextResolverFactory.INSTANCE
-                .getWorkspaceContextResolver(_context);
-
-        if (resolver == null)
-        {
-            throw new IllegalArgumentException();
-        }
-
-        _project = resolver.getProject();
-        _file = (IFile) resolver.getResource();
-
-        if (_project == null || _file == null)
-        {
-            throw new IllegalArgumentException();
-        }
-        
-        final DTFacesContext facesContext = getFacesContext();
-        _viewRootHandle = facesContext.getViewRootHandle();
-    }
-
-    /**
-     * Acquire and initialize the component tree root for the document
-     * 
-     * @param runnable
-     */
-    public void init(final Runnable runnable)
-    {
-        _runnable = runnable;
-        _viewRootHandle.addListener(getOrCreateListener());
-    }
-    
-    public void dispose()
-    {
-        if (_stalenessListener != null)
-        {
-            _viewRootHandle.removeListener(_stalenessListener);
-        }
-        
-        synchronized(this)
-        {
-            _runnable = null;
-        }
-    }
-
-    /**
-     * @return the structured document that this view model was created for.
-     */
-    public final IStructuredDocument getDocument()
-    {
-        return _document;
-    }
-
-    public final IProject getProject()
-    {
-        return _project;
-    }
-
-    public final String getViewId()
-    {
-        final DTFacesContext facesContext = getFacesContext();
-        final IDTViewHandler viewHandler = DTAppManagerUtil
-                .getViewHandler(_project);
-        if (facesContext != null && viewHandler != null)
-        {
-            return viewHandler.getViewId(facesContext, _file);
-        }
-        return null;
-    }
-
-    private DTFacesContext getFacesContext()
-    {
-        final DesignTimeApplicationManager manager = DesignTimeApplicationManager
-                .getInstance(_project);
-
-        if (manager != null)
-        {
-            return manager.getFacesContext(_file);
-        }
-        return null;
-    }
-
-    public void update()
-    {
-        final DTFacesContext facesContext = getFacesContext();
-
-        if (facesContext != null)
-        {
-            // latch the alreadyRunning flag; job will unset to false
-            if (_alreadyUpdating.compareAndSet(false, true))
-            {
-                final Job job = new UpdateRootAndRefreshJob(_viewRootHandle);
-
-                job.addJobChangeListener(new JobChangeAdapter()
-                {
-                    @Override
-                    public void done(final IJobChangeEvent event)
-                    {
-                        // always reset the updating flag
-                        _alreadyUpdating.set(false);
-                        if (event.getResult().isOK())
-                        {
-                            synchronized(DTJSFViewModel.this)
-                            {
-                                if (_runnable != null)
-                                {
-                                    _runnable.run();
-                                }
-                            }
-                        }
-                    }
-                });
-
-                job.schedule();
-            }
-        }
-    }
-
-    /**
-     * @return the design time view root or null
-     */
-    public DTUIViewRoot getRoot()
-    {
-        final DTFacesContext facesContext = getFacesContext();
-
-        if (facesContext != null)
-        {
-            final DTUIViewRoot viewRoot = _viewRootHandle.getCachedViewRoot();
-
-            // if our copy is uninit or null, kick off an update
-            if (viewRoot == null || viewRoot.isStale())
-            {
-                update();
-            }
-
-            return viewRoot;
-        }
-        return null;
-    }
-
-    private StalenessListener getOrCreateListener()
-    {
-        if (_stalenessListener == null)
-        {
-            _stalenessListener = new StalenessListener()
-            {
-                @Override
-                protected void stalenessChanged(StalenessEvent event)
-                {
-                    switch (event.getChangeType())
-                    {
-                        case VIEW_DEFN_CHANGED:
-                        case PROJECT_CLEANED:
-                        {
-                            update();
-                        }
-                        case VIEW_DEFN_DELETED:
-                        case VIEW_DEFN_PROJECT_CLOSED:
-                        {
-                            DTUIViewRoot root = _viewRootHandle
-                                    .getCachedViewRoot();
-                            if (root != null)
-                            {
-                                root.removeListener(_stalenessListener);
-                            }
-                        }
-                    }
-                }
-            };
-        }
-        return _stalenessListener;
-    }
-
-    private static class UpdateRootAndRefreshJob extends Job
-    {
-        private final IViewRootHandle _viewRootHandle;
-
-        public UpdateRootAndRefreshJob(final IViewRootHandle viewRootHandle)
-        {
-            super(Messages.DTJSFViewModel_JobDesc);
-            _viewRootHandle = viewRootHandle;
-        }
-
-        @Override
-        protected IStatus run(final IProgressMonitor monitor)
-        {
-            _viewRootHandle.updateViewRoot();
-            return Status.OK_STATUS;
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/component/Messages.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/component/Messages.java
deleted file mode 100644
index e85ee63..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/component/Messages.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.ui.internal.component;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * String resource handler
- *
- */
-public class Messages extends NLS {
-	
-	private static final String BUNDLE_NAME = "org.eclipse.jst.jsf.ui.internal.component.messages"; //$NON-NLS-1$
-	
-	/**
-	 * see messages.properties
-	 */
-	public static String ComponentInstanceDetailsForm_ComponentClass;
-	
-	/**
-	 * see messages.properties
-	 */
-	public static String ComponentInstanceDetailsForm_ComponentFamily;
-	
-	/**
-	 * see messages.properties
-	 */
-	public static String ComponentInstanceDetailsForm_ComponentType;
-	/**
-	 * see messages.properties
-	 */
-	public static String ComponentInstanceDetailsForm_Decorators;
-	/**
-	 * see messages.properties
-	 */
-	public static String ComponentInstanceDetailsForm_Id;
-
-	/**
-	 * see messages.properties
-	 */
-	public static String ComponentInstanceDetailsForm_InstanceInfo;
-	/**
-	 * see messages.properties
-	 */
-	public static String ComponentInstanceDetailsForm_Interfaces;
-	/**
-	 * see messages.properties
-	 */
-	public static String ComponentInstanceDetailsForm_Name;
-
-	/**
-	 * see messages.properties
-	 */
-	public static String ComponentInstanceDetailsForm_None;
-
-	/**
-	 * see messages.properties
-	 */
-	public static String ComponentInstanceDetailsForm_ParentId;
-
-	/**
-	 * see messages.properties
-	 */
-	public static String ComponentInstanceDetailsForm_Properties;
-	/**
-	 * see messages.properties
-	 */
-	public static String ComponentInstanceDetailsForm_RenderType;
-	/**
-	 * see messages.properties
-	 */
-	public static String ComponentInstanceDetailsForm_TypeInstanceInfo;
-	/**
-	 * see messages.properties
-	 */
-	public static String ComponentInstanceDetailsForm_Converter;
-	/**
-	 * see messages.properties
-	 */
-	public static String ComponentInstanceDetailsForm_Validator;
-	/**
-	 * see messages.properties
-	 */
-	public static String ComponentInstanceDetailsForm_Facet;
-	/**
-	 * see messages.properties
-	 */
-	public static String ComponentMasterForm_CalculatingView;
-	/**
-	 * see messages.properties
-	 */
-	public static String ComponentMasterForm_RefreshView;
-	/**
-	 * see messages.properties
-	 */
-	public static String ComponentMasterForm_TreePlaceHolderText;
-	/**
-	 * see messages.properties
-	 */	
-	public static String ComponentMasterForm_Unknown;
-	/**
-	 * see messages.properties
-	 */
-	public static String ComponentMasterForm_UnknownViewIdString;
-	/**
-	 * see messages.properties
-	 */
-	public static String ComponentMasterForm_View;
-	/**
-	 * see messages.properties
-	 */
-	public static String ComponentMasterForm_HeadAreaText;
-	/**
-	 * see messages.properties
-	 */
-	public static String ComponentTreeView_NothingToDisplayMessage;
-	/**
-	 * see messages.properties
-	 */
-	public static String DTJSFViewModel_JobDesc;
-
-	static {
-		// initialize resource bundle
-		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/component/messages.properties b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/component/messages.properties
deleted file mode 100644
index 0ca929f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/component/messages.properties
+++ /dev/null
@@ -1,25 +0,0 @@
-ComponentInstanceDetailsForm_ComponentClass=Component Class:
-ComponentInstanceDetailsForm_ComponentFamily=Component Family:
-ComponentInstanceDetailsForm_ComponentType=Component Type:
-ComponentInstanceDetailsForm_Decorators=Decorators
-ComponentInstanceDetailsForm_Id=Id
-ComponentInstanceDetailsForm_InstanceInfo=Instance Info
-ComponentInstanceDetailsForm_Interfaces=Interfaces
-ComponentInstanceDetailsForm_Name=Name
-ComponentInstanceDetailsForm_None=<i>none</i>
-ComponentInstanceDetailsForm_ParentId=Parent Id
-ComponentInstanceDetailsForm_Properties=Properties
-ComponentInstanceDetailsForm_RenderType=Render Type:
-ComponentInstanceDetailsForm_TypeInstanceInfo=Type Info Information
-ComponentMasterForm_CalculatingView=Calculating view...
-ComponentMasterForm_RefreshView=Refresh View
-ComponentMasterForm_TreePlaceHolderText=Calculating view...
-ComponentMasterForm_Unknown=<unknown>
-ComponentMasterForm_UnknownViewIdString=<unknown>
-ComponentMasterForm_View=View: 
-ComponentTreeView_NothingToDisplayMessage=Nothing to display
-DTJSFViewModel_JobDesc=Updating view root
-ComponentInstanceDetailsForm_Converter=Converter: id=''{0}'', converter-class=''{1}''
-ComponentInstanceDetailsForm_Validator=Validator: id=''{0}'', validator-class=''{1}''
-ComponentInstanceDetailsForm_Facet=Facet: ''{0}'', component=''{1}''     
-ComponentMasterForm_HeadAreaText=View: {0} (Project: {1})                 
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/contentassist/JSFContentAssistProcessor.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/contentassist/JSFContentAssistProcessor.java
deleted file mode 100644
index a786371..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/contentassist/JSFContentAssistProcessor.java
+++ /dev/null
@@ -1,296 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.ui.internal.contentassist;
-
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.runtime.FileLocator;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.text.ITextViewer;
-import org.eclipse.jface.text.contentassist.ICompletionProposal;
-import org.eclipse.jface.text.contentassist.IContentAssistProcessor;
-import org.eclipse.jface.text.contentassist.IContextInformation;
-import org.eclipse.jface.text.contentassist.IContextInformationValidator;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IDOMContextResolver;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IStructuredDocumentContextResolverFactory;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.ITaglibContextResolver;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.internal.IStructuredDocumentContextResolverFactory2;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.internal.ITextRegionContextResolver;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContextFactory;
-import org.eclipse.jst.jsf.metadataprocessors.MetaDataEnabledProcessingFactory;
-import org.eclipse.jst.jsf.metadataprocessors.features.IPossibleValue;
-import org.eclipse.jst.jsf.metadataprocessors.features.IPossibleValues;
-import org.eclipse.jst.jsf.ui.internal.JSFUiPlugin;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.wst.sse.ui.internal.contentassist.CustomCompletionProposal;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
-import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.ModelQuery;
-import org.eclipse.wst.xml.core.internal.modelquery.ModelQueryUtil;
-import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext;
-import org.eclipse.wst.xml.ui.internal.contentassist.XMLRelevanceConstants;
-import org.eclipse.wst.xml.ui.internal.taginfo.MarkupTagInfoProvider;
-import org.osgi.framework.Bundle;
-import org.w3c.dom.Attr;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * The content assist processor for non-EL attribute values.
- * 
- * @author Gerry Kessler - Oracle
- * 
- */
-public class JSFContentAssistProcessor implements IContentAssistProcessor {
-	private ITextRegionContextResolver resolver;
-	private ITaglibContextResolver tlResolver;
-	private String defaultAdditionalInfo;
-
-	private String defaultIconPath = "/icons/attr_val.gif"; //$NON-NLS-1$
-	
-	private ImageDescriptor defaultAttrValImgDesc;
-	
-	private MarkupTagInfoProvider fInfoProvider;
-
-	/**
-	 * @see org.eclipse.jface.text.contentassist.IContentAssistProcessor#computeCompletionProposals(org.eclipse.jface.text.ITextViewer,
-	 *      int)
-	 */
-	public ICompletionProposal[] computeCompletionProposals(ITextViewer viewer,
-			int documentPosition) {
-		List proposals = new ArrayList();
-		IStructuredDocumentContext context = IStructuredDocumentContextFactory.INSTANCE
-				.getContext(viewer, documentPosition);
-
-		if (context != null) {
-			resolver = IStructuredDocumentContextResolverFactory.INSTANCE
-					.getTextRegionResolver(context);
-
-			if (resolver != null) {
-				final String regionType = resolver.getRegionType();
-
-				if (regionType != null
-						&& regionType.equals(DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE)) {
-					
-					tlResolver = IStructuredDocumentContextResolverFactory2.INSTANCE
-							.getTaglibContextResolverFromDelegates(context);
-
-					if (tlResolver != null) {
-						
-						Attr attr = getAttribute(context);
-						if (attr != null) {
-							Node tagElement = attr.getOwnerElement();
-							if (tagElement != null) {
-								String uri = tlResolver.getTagURIForNodeName(tagElement);
-								if (uri != null) {
-									proposals = createProposals(context, uri, tagElement, attr);
-								}
-							}
-						}
-					}
-				}
-			}
-		}
-
-		return (ICompletionProposal[]) proposals
-				.toArray(new ICompletionProposal[0]);
-	}
-
-	private String getDefaultAdditionalInfo(Node tagElement, Attr attr) {
-		if (defaultAdditionalInfo == null){
-			CMElementDeclaration elementNode = getCMElementDeclaration(tagElement);
-			if (elementNode != null){
-				CMAttributeDeclaration attrNode = getCMAttributeDeclaration(elementNode, attr);
-				if (attrNode != null)
-					defaultAdditionalInfo = getInfoProvider().getInfo(attrNode);
-			}
-		}
-		return defaultAdditionalInfo;
-	}
-	
-	private CMElementDeclaration getCMElementDeclaration(Node node) {
-		CMElementDeclaration result = null;
-		if (node.getNodeType() == Node.ELEMENT_NODE) {
-			ModelQuery modelQuery = ModelQueryUtil.getModelQuery(node.getOwnerDocument());
-			if (modelQuery != null)
-				result = modelQuery.getCMElementDeclaration((Element) node);
-		}
-		return result;
-	}
-
-	private CMAttributeDeclaration getCMAttributeDeclaration(CMElementDeclaration tagElement, Attr attr) {
-		CMNamedNodeMap attrs = tagElement.getAttributes();
-		for (Iterator it = attrs.iterator();it.hasNext();){
-			CMAttributeDeclaration CMAttr = (CMAttributeDeclaration)it.next();
-			if (CMAttr.getAttrName().equals(attr.getName()))
-				return CMAttr;
-		}
-		return null;
-	}
-	
-	private MarkupTagInfoProvider getInfoProvider() {
-		if (fInfoProvider == null) {
-			fInfoProvider = new MarkupTagInfoProvider();
-		}
-		return fInfoProvider;
-	}
-	
-	private List createProposals(IStructuredDocumentContext context, String uri, Node tagElement, Attr attr) {
-		List ret = new ArrayList();
-		List processors = MetaDataEnabledProcessingFactory.getInstance()
-						.getAttributeValueRuntimeTypeFeatureProcessors(
-								IPossibleValues.class, context, uri,
-								tagElement.getLocalName(), attr.getLocalName());
-		
-		if (processors != null) {
-			for (int i = 0; i < processors.size(); i++) {
-				IPossibleValues p = (IPossibleValues) processors.get(i);
-				ret.addAll(createProposals(p, tagElement, attr));
-			}
-		}
-		return ret;
-	}
-
-	private List createProposals(IPossibleValues p, Node tagElement, Attr attr) {
-		List ret = new ArrayList();
-		defaultAdditionalInfo = null;
-		Iterator it = p.getPossibleValues().iterator();
-		while (it.hasNext()) {
-			IPossibleValue val = (IPossibleValue) it.next();
-			if (val != null){ //just in case...
-				ICompletionProposal proposal = new CustomCompletionProposal(
-						val.getValue(), 		//replacement text
-						getReplacementOffset(), //replacementOffset
-						getReplacementLength(), //replacementLength
-						getCursorPosition(val), //cursor pos
-						getImage(val), 			//image
-						val.getDisplayValue(), 	//display value
-						null, 					//IContextInformation
-						getAdditionalInfo(val,tagElement,attr), //addditional info
-						XMLRelevanceConstants.R_JSP_ATTRIBUTE_VALUE,	//relevance
-						true);					//updateReplace
-	
-				ret.add(proposal);
-			}
-		}
-		return ret;
-	}
-
-
-	private String getAdditionalInfo(IPossibleValue val, Node tagElement, Attr attr) {
-		if (val.getAdditionalInformation() != null)
-			return val.getAdditionalInformation();
-		
-		return 	getDefaultAdditionalInfo(tagElement, attr);
-	}
-
-	private int getReplacementLength() {
-		return resolver.getRegionText().length() - 2;
-	}
-
-	private int getCursorPosition(IPossibleValue val) {
-		//Something changed in 1.5RC2 CustomCompletionProposal 
-		//it appears that the cursor position is now relative to where it is currently
-		//rather than relative to document
-		
-		//return getReplacementOffset() + val.getValue().length();
-		return val.getValue().length();
-	}
-
-	private int getReplacementOffset() {
-		return resolver.getStartOffset() + 1;
-	}
-
-	private Image getImage(IPossibleValue val) {
-		ImageDescriptor icon = val.getIcon();		
-		if (icon == null || icon.equals("")){ //$NON-NLS-1$
-			return getDefaultAttributeValueImage();
-		}
-		
-		return getOrCreateImage(icon);		
-	}
-
-	private Image getOrCreateImage(ImageDescriptor icon) {
-		if (icon == null)
-			return null;
-			
-		Image img = JSFUiPlugin.getDefault().getImageRegistry().get(icon.toString());
-		if (img == null){
-			try {
-				img = icon.createImage();
-				JSFUiPlugin.getDefault().getImageRegistry().put(icon.toString(), img);
-			} catch (RuntimeException e) {
-                // empty block; C.B: handle exception?
-			}
-		}
-		return img;
-	}
-
-	private Image getDefaultAttributeValueImage() {
-		if (defaultAttrValImgDesc == null){
-			Bundle bundle = Platform.getBundle(JSFUiPlugin.PLUGIN_ID);
-			URL url= FileLocator.find(bundle,new Path(defaultIconPath ), null);
-			defaultAttrValImgDesc = ImageDescriptor.createFromURL(url);
-		}
-		return getOrCreateImage(defaultAttrValImgDesc);
-	}
-
-	private Attr getAttribute(IStructuredDocumentContext context) {
-		final IDOMContextResolver domResolver = IStructuredDocumentContextResolverFactory.INSTANCE
-				.getDOMContextResolver(context);
-
-		if (domResolver != null) {
-			final Node curNode = domResolver.getNode();
-
-			if (curNode instanceof Attr) {
-				return (Attr) curNode;
-			}
-		}
-		return null;
-
-	}
-
-	public IContextInformation[] computeContextInformation(ITextViewer viewer,
-			int offset) {
-		// no context info
-		return null;
-	}
-
-	public char[] getCompletionProposalAutoActivationCharacters() {
-		// auto activate when user hits a '.'
-		return new char[] { '.' };
-	}
-
-	public char[] getContextInformationAutoActivationCharacters() {
-		// no auto-activation for context info
-		return null;
-	}
-
-	public String getErrorMessage() {
-		// don't flag errors
-		return null;
-	}
-
-	public IContextInformationValidator getContextInformationValidator() {
-		// don't validate context information
-		return null;
-	}
-
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/contentassist/el/JSFELContentAssistProcessor.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/contentassist/el/JSFELContentAssistProcessor.java
deleted file mode 100644
index e99cb22..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/contentassist/el/JSFELContentAssistProcessor.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.ui.internal.contentassist.el;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jface.text.ITextViewer;
-import org.eclipse.jface.text.contentassist.ICompletionProposal;
-import org.eclipse.jface.text.contentassist.IContentAssistProcessor;
-import org.eclipse.jface.text.contentassist.IContextInformation;
-import org.eclipse.jface.text.contentassist.IContextInformationValidator;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContextFactory;
-import org.eclipse.jst.jsf.core.internal.contentassist.el.ContentAssistParser;
-import org.eclipse.jst.jsf.core.internal.contentassist.el.ContentAssistStrategy;
-import org.eclipse.jst.jsf.designtime.DTAppManagerUtil;
-import org.eclipse.jst.jsf.designtime.internal.view.XMLViewDefnAdapter;
-import org.eclipse.jst.jsf.designtime.internal.view.IDTViewHandler.ViewHandlerException;
-import org.eclipse.jst.jsf.designtime.internal.view.XMLViewDefnAdapter.DTELExpression;
-import org.eclipse.jst.jsf.ui.internal.JSFUiPlugin;
-import org.eclipse.wst.xml.ui.internal.contentassist.ProposalComparator;
-
-/**
- * The content assist processor for JSF EL partitions on attribute values.
- * 
- * @author cbateman
- * 
- */
-public class JSFELContentAssistProcessor implements IContentAssistProcessor
-{
-    /**
-     * @see org.eclipse.jface.text.contentassist.IContentAssistProcessor#computeCompletionProposals(org.eclipse.jface.text.ITextViewer,
-     *      int)
-     */
-    public ICompletionProposal[] computeCompletionProposals(
-            final ITextViewer viewer, final int documentPosition)
-    {
-        final List<ICompletionProposal> proposals =
-                new ArrayList<ICompletionProposal>();
-        final IStructuredDocumentContext context =
-                IStructuredDocumentContextFactory.INSTANCE.getContext(viewer,
-                        documentPosition);
-        if (context != null)
-        {
-            final XMLViewDefnAdapter viewAdapter =
-                    DTAppManagerUtil.getXMLViewDefnAdapter(context);
-
-            if (viewAdapter != null)
-            {
-                try
-                {
-                    final DTELExpression elExpression =
-                            viewAdapter.getELExpression(context);
-
-                    if (elExpression != null)
-                    {
-                        final ContentAssistStrategy strategy =
-                                ContentAssistParser.getPrefix(documentPosition
-                                        - elExpression.getDocumentContext()
-                                                .getDocumentPosition() + 1,
-                                        elExpression.getText().trim());
-
-                        if (strategy != null)
-                        {
-                            proposals.addAll(strategy.getProposals(context));
-                        }
-                        Collections.sort(proposals, new ProposalComparator());
-                    }
-                }
-                catch (ViewHandlerException e)
-                {
-                    JSFUiPlugin.log(IStatus.ERROR, "During el resolution", e); //$NON-NLS-1$
-                }
-            }
-        }
-
-        return proposals.toArray(new ICompletionProposal[0]);
-    }
-
-    public IContextInformation[] computeContextInformation(
-            final ITextViewer viewer, final int offset)
-    {
-        // no context info
-        return null;
-    }
-
-    public char[] getCompletionProposalAutoActivationCharacters()
-    {
-        // auto activate when user hits a '.'
-        return new char[]
-        { '.' };
-    }
-
-    public char[] getContextInformationAutoActivationCharacters()
-    {
-        // no auto-activation for context info
-        return null;
-    }
-
-    public String getErrorMessage()
-    {
-        // don't flag errors
-        return null;
-    }
-
-    public IContextInformationValidator getContextInformationValidator()
-    {
-        // don't validate context information
-        return null;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/jsflibraryconfig/IJSFImplLibraryCreationListener.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/jsflibraryconfig/IJSFImplLibraryCreationListener.java
deleted file mode 100644
index d579d52..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/jsflibraryconfig/IJSFImplLibraryCreationListener.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Justin Chen - development check in
- *******************************************************************************/
-package org.eclipse.jst.jsf.ui.internal.jsflibraryconfig;
-
-/**
- * Listener interface when a new JSF implementation library is created.
- * 
- * @author Justin Chen - Oracle
- * @deprecated
- */
-public interface IJSFImplLibraryCreationListener extends java.util.EventListener {
-	/**
-	 * Ok button is pressed in JSF Library dialog.
-	 * 
-	 * @param event
-	 */
-	public void okClicked(JSFImplLibraryCreationEvent event);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/jsflibraryconfig/JSFImplLibraryCreationEvent.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/jsflibraryconfig/JSFImplLibraryCreationEvent.java
deleted file mode 100644
index 524e459..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/jsflibraryconfig/JSFImplLibraryCreationEvent.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Justin Chen - development check in
- *******************************************************************************/
-package org.eclipse.jst.jsf.ui.internal.jsflibraryconfig;
-
-import java.util.EventObject;
-
-/**
- * JSF Implementation library creation event.
- * 
- * @author Justin Chen - Oracle
- * @deprecated
- */
-public class JSFImplLibraryCreationEvent extends EventObject {
-
-	private static final long serialVersionUID = 6390319185522362453L;
-	private boolean isLibCreated; 
-	
-	/**
-	 * @param source
-	 * @param okClicked
-	 */
-	public JSFImplLibraryCreationEvent(Object source, boolean okClicked) {
-		super(source);
-		this.isLibCreated = okClicked;
-	}
-
-	/**
-	 * Ok button pressed.
-	 * 
-	 * @return boolean
-	 */
-	public boolean isLibraryCreated() {
-		return isLibCreated;
-	}
-	
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/jsflibraryconfig/JSFLibraryConfigControl.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/jsflibraryconfig/JSFLibraryConfigControl.java
deleted file mode 100644
index b3bd767..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/jsflibraryconfig/JSFLibraryConfigControl.java
+++ /dev/null
@@ -1,690 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Justin Chen
- *******************************************************************************/
-package org.eclipse.jst.jsf.ui.internal.jsflibraryconfig;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.EventObject;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-import java.util.Vector;
-
-import org.eclipse.core.runtime.ISafeRunnable;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.util.SafeRunnable;
-import org.eclipse.jface.viewers.CheckStateChangedEvent;
-import org.eclipse.jface.viewers.CheckboxTableViewer;
-import org.eclipse.jface.viewers.DoubleClickEvent;
-import org.eclipse.jface.viewers.ICheckStateListener;
-import org.eclipse.jface.viewers.IDoubleClickListener;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.ILabelProviderListener;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.ITableLabelProvider;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.jface.viewers.ViewerSorter;
-import org.eclipse.jface.window.Window;
-import org.eclipse.jface.wizard.WizardDialog;
-import org.eclipse.jst.jsf.core.internal.jsflibraryconfig.JSFLibraryConfigDialogSettingData;
-import org.eclipse.jst.jsf.core.internal.jsflibraryconfig.JSFLibraryConfigModel;
-import org.eclipse.jst.jsf.core.internal.jsflibraryconfig.JSFLibraryInternalReference;
-import org.eclipse.jst.jsf.core.internal.jsflibraryconfig.JSFLibraryRegistryUtil;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary;
-import org.eclipse.jst.jsf.core.internal.project.facet.IJSFFacetInstallDataModelProperties;
-import org.eclipse.jst.jsf.ui.internal.JSFUiPlugin;
-import org.eclipse.jst.jsf.ui.internal.Messages;
-import org.eclipse.jst.jsf.ui.internal.classpath.JSFLibraryWizard;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.swt.widgets.TableItem;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
-import org.eclipse.wst.common.frameworks.internal.datamodel.ui.DataModelSynchHelper;
-
-/**
- * A custom control used in wizard and property pages.
- * 
- * @author Justin Chen
- * @deprecated
- */
-public class JSFLibraryConfigControl extends Composite { 
-
-	final static private int COLUMN_DEPLOY = 0;
-	final static private int COLUMN_LIB_NAME = 1;
-
-	private JSFLibraryConfigModel workingCopyModel = null;
-	
-	private CheckboxTableViewer ctvSelCompLib;
-	private TreeViewer tvCompLib;
-	private TreeViewerAdapter tvAdapter;
-	private TreeLabelProvider tvLabelProvider;
-	private Button btnAddAll;
-	private Button btnRemoveAll;
-	
-	private Vector newJSFLibCreatedListeners = new Vector();
-	private Set _changeListeners;
-	private boolean _initing;
-	private IDataModel model;	
-
-	/**
-	 * @param listener
-	 */
-	public void addOkClickedListener(IJSFImplLibraryCreationListener listener) {
-		newJSFLibCreatedListeners.addElement(listener);
-	}
-	/**
-	 * @param listener
-	 */
-	public void removeOkClickedListener(IJSFImplLibraryCreationListener listener) {
-		newJSFLibCreatedListeners.removeElement(listener);
-	}
-	
-	/**
-	 * @param listener
-	 */
-	public void addChangeListener(JSFLibraryConfigControlChangeListener listener){
-		getChangeListeners().add(listener);
-	}
-	
-	/**
-	 * @param listener
-	 */
-	public void removeChangeListener(JSFLibraryConfigControlChangeListener listener){
-		if (getChangeListeners().contains(listener))
-			getChangeListeners().remove(listener);
-	}
-	
-	private Set getChangeListeners() {
-		if (_changeListeners == null){
-			_changeListeners = new HashSet();
-		}
-		return _changeListeners;
-	}
-	
-	private void fireChangedEvent(final EventObject e){
-		if (_initing) return;
-		SafeRunnable.run(new ISafeRunnable(){
-			public void handleException(Throwable exception) {
-			    // TODO: should we perhaps do something here?
-			    JSFUiPlugin.log(IStatus.ERROR, exception.getLocalizedMessage());
-			}
-			public void run() throws Exception {
-				for (Iterator it=getChangeListeners().iterator();it.hasNext();){
-					((JSFLibraryConfigControlChangeListener)it.next()).changed(new JSFLibraryConfigControlChangeEvent(e));
-				}
-			}
-		});
-	}
-	
-	/**
-	 * Create the composite
-	 * @param parent
-	 * @param style
-	 */	
-	public JSFLibraryConfigControl(Composite parent, int style) {
-		super(parent, style);
-		_initing = true;
-		createControls();
-	}	
-	
-	/**
-	 * set control values from provided model.
-	 * 
-	 * @param source
-	 */
-	public void loadControlValuesFromModel(JSFLibraryConfigDialogSettingData source) {
-		if (source != null) {
-			// never read persistentModel = source;
-			workingCopyModel = JSFLibraryConfigModel.JSFLibraryConfigModelFactory.createInstance(source);
-			initializeControlValues();
-			_initing = false;
-		} else {
-			JSFUiPlugin.log(IStatus.ERROR, Messages.JSFLibraryConfigControl_NullProject);
-		}
-		
-	}
-		
-	/* (non-Javadoc)
-	 * @see org.eclipse.swt.widgets.Widget#dispose()
-	 */
-	public void dispose() {
-		super.dispose();
-	}
-	
-	/**
-	 * Return a list of selected JSF Component Libraries.
-	 * Otherwise, return an empty list.
-	 * 
-	 * @return a list of selected JSF Component Libraries
-	*/
-	public List getSelectedJSFLibComponents() {
-		return workingCopyModel.getCurrentJSFComponentLibrarySelection();
-	}
-	
-	/**
-	 * 
-	 * @return JSFLibraryConfigModelAdapter
-	 */
-	public JSFLibraryConfigModel getWorkingModel() {
-		return workingCopyModel;
-	}
-	
-	private void initializeControlValues() {
-		loadJSFCompList();
-
-		JSFLibraryInternalReference savedCompLib = null; 
-		JSFLibraryInternalReference selected = null;
-		//Iterator it = persistentModel.getJSFComponentLibraries().iterator();
-		Iterator it = workingCopyModel.getJSFComponentLibraries().iterator();
-		while (it.hasNext()) {
-			savedCompLib = (JSFLibraryInternalReference) it.next();
-			selected = JSFLibraryRegistryUtil.getInstance().getJSFLibraryReferencebyID(savedCompLib.getID());
-			if (selected != null) {
-				ctvSelCompLib.setChecked(selected, selected.isCheckedToBeDeployed());
-			}
-		}
-
-		setCompListModelProperty();
-		
-		redraw();
-	}
-	
-	private void loadJSFCompList() {
-		tvCompLib.setInput(workingCopyModel.getJSFComponentLibraries());
-		ctvSelCompLib.setInput(workingCopyModel.getJSFComponentLibraries());		
-	}
-	
-	private void createCompLibControls(Composite parent) {
-		final Composite cmpCompLibs = new Composite(parent, SWT.NONE);
-		final GridLayout gridLayoutCompLibs = new GridLayout();
-		gridLayoutCompLibs.numColumns = 4;
-		gridLayoutCompLibs.marginWidth = 0;
-        gridLayoutCompLibs.marginHeight = 0;
-		cmpCompLibs.setLayout(gridLayoutCompLibs);
-		GridData gdComp = new GridData();
-		gdComp.horizontalAlignment = SWT.FILL;
-		gdComp.grabExcessHorizontalSpace = true;
-		cmpCompLibs.setLayoutData(gdComp);
-		
-		tvCompLib = new TreeViewer(cmpCompLibs, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
-		tvAdapter = new TreeViewerAdapter();
-		tvLabelProvider = new TreeLabelProvider();
-		tvCompLib.setContentProvider(tvAdapter);
-		tvCompLib.setLabelProvider(tvLabelProvider);
-		tvCompLib.addDoubleClickListener(new IDoubleClickListener(){
-			public void doubleClick(DoubleClickEvent event) {
-				resetComponentLibSelection((StructuredSelection)event.getSelection(), 
-						tvCompLib, 
-						ctvSelCompLib, 
-						true);	
-				fireChangedEvent(event);
-			}			
-		});
-		tvCompLib.getTree().setLayoutData(new GridData(GridData.FILL_BOTH));
-		tvCompLib.addFilter(new TreeViewerFilter());		
-		
-		final Composite composite_buttons = new Composite(cmpCompLibs, SWT.NONE);
-		composite_buttons.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false));
-		composite_buttons.setLayout(new GridLayout());
-
-		final Composite composite_Single = new Composite(composite_buttons, SWT.None);
-		composite_Single.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		final GridLayout gl_Single = new GridLayout();
-		gl_Single.marginHeight = 4;
-		composite_Single.setLayout(new GridLayout());
-		
-		final Button btnAdd = new Button(composite_Single, SWT.NONE);
-		btnAdd.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, true, false));
-		btnAdd.setText(Messages.JSFLibraryConfigControl_Add);
-		btnAdd.setEnabled(false);
-
-		final Button btnRemove = new Button(composite_Single, SWT.NONE);
-		btnRemove.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, true, false));
-		btnRemove.setText(Messages.JSFLibraryConfigControl_Remove);
-		btnRemove.setEnabled(false);
-		
-		final Composite composite_All = new Composite(composite_buttons, SWT.None);
-		composite_All.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		final GridLayout gl_All = new GridLayout();
-		gl_Single.marginHeight = 4;
-		composite_All.setLayout(gl_All);
-		
-		btnAddAll = new Button(composite_All, SWT.NONE);
-		btnAddAll.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, true, false));
-		btnAddAll.setText(Messages.JSFLibraryConfigControl_AddAll);
-
-		btnRemoveAll = new Button(composite_All, SWT.NONE);
-		btnRemoveAll.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, true, false));
-		btnRemoveAll.setText(Messages.JSFLibraryConfigControl_RemoveAll);
-
-		final Composite composite_New = new Composite(composite_buttons, SWT.None);
-		composite_New.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		final GridLayout gl_New = new GridLayout();
-		gl_Single.marginHeight = 4;
-		composite_New.setLayout(gl_New);
-		
-		final Button btnNewCompLib = new Button(composite_New, SWT.NONE);
-		btnNewCompLib.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, false, false));
-		btnNewCompLib.setText(Messages.JSFLibraryConfigControl_NewComponentLibrary);		
-		btnNewCompLib.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				JSFLibraryWizard wizard = new JSFLibraryWizard();				
-				IWorkbench wb = PlatformUI.getWorkbench();
-				wizard.init(wb, null);
-				WizardDialog dialog = new WizardDialog(wb
-						.getActiveWorkbenchWindow().getShell(), wizard);						
-				int ret = dialog.open();
-				if (ret == Window.OK) {
-					JSFLibraryInternalReference lib = new JSFLibraryInternalReference(
-							wizard.getJSFLibrary(), 
-							true, 
-							true);
-					JSFLibraryRegistryUtil.getInstance().addJSFLibrary(lib);					
-					workingCopyModel.getJSFComponentLibraries().add(lib);
-					
-					loadJSFCompList();
-					setCompListModelProperty();
-					ctvSelCompLib.setChecked(lib, true);
-				}
-			}
-		});	
-
-		ctvSelCompLib = CheckboxTableViewer.newCheckList(cmpCompLibs, SWT.MULTI | SWT.FULL_SELECTION | SWT.BORDER);
-		ctvSelCompLib.addFilter(new CheckedTableViewerFilter());
-		final Table table = ctvSelCompLib.getTable();
-		table.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, true));		
-		table.setHeaderVisible(true);
-		final TableColumn tcDeploy = new TableColumn(table, SWT.LEFT);
-		tcDeploy.setWidth(50);
-		tcDeploy.setText(Messages.JSFLibraryConfigControl_TH_Deploy);
-		tcDeploy.setToolTipText(Messages.JSFLibraryConfigControl_DeployJAR);
-		final TableColumn tcLibName = new TableColumn(table, SWT.LEFT);
-		tcLibName.setWidth(150);
-		tcLibName.setText(Messages.JSFLibraryConfigControl_TH_LibraryName);
-		
-		//ctvSelCompLib.setCellModifier(new CellModifierCTVSelCompLib());
-		ctvSelCompLib.setSorter(new SelectedCompLibCTVSorter());
-		ctvSelCompLib.setLabelProvider(new SelectedCompLibCTVLabelProvider());
-		ctvSelCompLib.setContentProvider(new CompLibCTVContentProvider());
-		ctvSelCompLib.addDoubleClickListener(new IDoubleClickListener(){
-			public void doubleClick(DoubleClickEvent event) {
-				resetComponentLibSelection((StructuredSelection)event.getSelection(), 
-						tvCompLib, 
-						ctvSelCompLib, 
-						false);	
-				fireChangedEvent(event);
-			}			
-		});
-		ctvSelCompLib.addCheckStateListener(new ICheckStateListener() {
-			public void checkStateChanged(CheckStateChangedEvent event) {
-				JSFLibraryInternalReference changedItem = (JSFLibraryInternalReference) event.getElement();
-				boolean isChecked4Deploy = event.getChecked();
-				
-				List list = workingCopyModel.getJSFComponentLibraries();
-				Iterator it = list.iterator();
-				JSFLibraryInternalReference crtjsflib = null;
-				while (it.hasNext()) {
-					crtjsflib = (JSFLibraryInternalReference) it.next();
-					if (crtjsflib.getID().equals(changedItem.getID())) {
-						crtjsflib.setToBeDeployed(isChecked4Deploy);
-						fireChangedEvent(event);
-						break;
-					}
-				}
-			}
-		});
-		
-		btnAdd.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				resetComponentLibSelection((StructuredSelection)tvCompLib.getSelection(), 
-						tvCompLib, 
-						ctvSelCompLib, 
-						true);	
-				fireChangedEvent(e);
-			}
-		});
-		
-		btnAddAll.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				resetCompontLibSelectionAll(tvCompLib, ctvSelCompLib, true);
-				fireChangedEvent(e);
-			}
-		});		
-		btnRemove.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				resetComponentLibSelection((StructuredSelection)ctvSelCompLib.getSelection(), 
-						tvCompLib, 
-						ctvSelCompLib, 
-						false);	
-				fireChangedEvent(e);
-			}
-		});
-		
-		btnRemoveAll.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				resetCompontLibSelectionAll(tvCompLib, ctvSelCompLib, false);
-				fireChangedEvent(e);
-			}
-		});
-		
-		tvCompLib.addSelectionChangedListener(new ISelectionChangedListener(){
-			public void selectionChanged(SelectionChangedEvent event) {
-				StructuredSelection sel= (StructuredSelection)event.getSelection();
-				btnAdd.setEnabled(!sel.isEmpty() && sel.getFirstElement() instanceof JSFLibraryInternalReference);
-				btnAddAll.setEnabled(tvCompLib.getTree().getItemCount() > 0);
-			}			
-		});
-		
-		ctvSelCompLib.addSelectionChangedListener(new ISelectionChangedListener(){
-			public void selectionChanged(SelectionChangedEvent event) {
-				StructuredSelection sel= (StructuredSelection)event.getSelection();
-				btnRemove.setEnabled(!sel.isEmpty());
-				btnRemoveAll.setEnabled(ctvSelCompLib.getTable().getItemCount() > 0);
-			}			
-		});
-		
-	}
-	private void createControls() {
-		setRedraw(true);
-		final GridLayout gridLayout = new GridLayout();
-		gridLayout.numColumns = 1;
-		gridLayout.marginLeft = 0;
-		gridLayout.marginRight = 0;
-		gridLayout.marginWidth = 0;
-		gridLayout.marginTop = 0;
-		this.setLayout(gridLayout);
-		
-		createCompLibControls(this);
-	}
-
-	/*
-	 * Event handling helper methods
-	 */	
-	
-	// Set selected item to the given state on model and update viewers.  
-	private void resetComponentLibSelection(StructuredSelection item, 
-			TreeViewer srcViewer, 
-			CheckboxTableViewer destViewer,
-			boolean state) {
-		if (item != null && !item.isEmpty()) {
-			List selected = new ArrayList(item.size());
-			for (Iterator sel=item.iterator();sel.hasNext();){
-				JSFLibraryInternalReference jsfLibDctr = (JSFLibraryInternalReference)sel.next();
-				selected.add(jsfLibDctr);
-				List list = workingCopyModel.getJSFComponentLibraries();
-				Iterator it = list.iterator();
-				JSFLibraryInternalReference crtjsfLibDctr = null;
-				while(it.hasNext()) {
-					crtjsfLibDctr = (JSFLibraryInternalReference)it.next();
-					if (crtjsfLibDctr.getID().equals(jsfLibDctr.getID())) {
-						crtjsfLibDctr.setToBeDeployed(state);
-						crtjsfLibDctr.setSelected(state);
-					}
-				}					
-			}
-						
-			loadJSFCompList();
-			
-			srcViewer.refresh();
-			destViewer.refresh();	
-			for (Iterator it=selected.iterator();it.hasNext();){
-				destViewer.setChecked(it.next(), state);
-			}
-			
-			setCompListModelProperty();
-		}		
-	}
-	
-	// Reset all component library from given state to model and update viewers.   
-	private void resetCompontLibSelectionAll(TreeViewer srcViewer, 
-			CheckboxTableViewer destViewer, 
-			boolean state) {
-
-			List list = workingCopyModel.getJSFComponentLibraries();
-			Iterator it = list.iterator();
-			JSFLibraryInternalReference jsfLibDctr;
-			while(it.hasNext()) {
-				jsfLibDctr = (JSFLibraryInternalReference)it.next();
-				jsfLibDctr.setSelected(state);
-				jsfLibDctr.setToBeDeployed(state);
-			}				
-			
-			loadJSFCompList();
-
-			srcViewer.refresh();
-			destViewer.refresh();
-			destViewer.setAllChecked(state);		
-			
-			btnAddAll.setEnabled(! state);
-			btnRemoveAll.setEnabled(state);
-			
-			setCompListModelProperty();
-	}
-	
-	//synchHelper is not able to track changes to data elements in tableviewer... manual set of property
-	private void setCompListModelProperty() {		
-		TableItem[] tableItems = ctvSelCompLib.getTable().getItems();
-		List compLibs = new ArrayList(tableItems.length);
-		for (int i=0;i<tableItems.length;i++){
-			compLibs.add(tableItems[i].getData());
-		}
-		JSFLibraryInternalReference[] libs = (JSFLibraryInternalReference[])compLibs.toArray(new JSFLibraryInternalReference[0]);		
-		model.setProperty(IJSFFacetInstallDataModelProperties.COMPONENT_LIBRARIES, libs);		
-	}
-	
-
-	/**
-	 * Configure the JSFLibraryConfigControl elements to used the containers synchHelper
-	 * @param synchHelper
-	 */
-	public void setSynchHelper(DataModelSynchHelper synchHelper) {	
-		model = synchHelper.getDataModel();
-	}
-
-	/**
-	 * 	Inner Classes for filtering.
-	 *
-	 */
-	private static class CheckedTableViewerFilter extends ViewerFilter {
-		public boolean select(Viewer viewer, Object parentElement, Object element) {
-			if (element instanceof JSFLibraryInternalReference) {
-				return ((JSFLibraryInternalReference)element).isSelected();
-			}
-			return false;
-		}
-	}
-	private static class TreeViewerFilter extends ViewerFilter {
-
-		public boolean select(Viewer viewer, Object parentElement, Object element) {
-			if (element instanceof JSFLibraryInternalReference) {
-				return !((JSFLibraryInternalReference)element).isSelected();
-			}
-			return true;
-		}
-	}
-
-	private static class CompLibCTVContentProvider implements IStructuredContentProvider {
-		private List jsfComplLibs = new ArrayList(0);
-		
-		public Object[] getElements(Object inputElement) {						
-			return jsfComplLibs.toArray();
-		}
-		public void dispose() {
-            // do nothing
-		}
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-			if (newInput == null) {
-				jsfComplLibs = Collections.EMPTY_LIST;
-			} else {
-				jsfComplLibs = (List)newInput;
-			}
-		}
-	}
-	// Label Provider
-	private static class SelectedCompLibCTVLabelProvider extends LabelProvider implements ITableLabelProvider {
-		public String getColumnText(Object element, int columnIndex) {
-			if (element instanceof JSFLibraryInternalReference){
-				
-			    switch(columnIndex) {
-			    case COLUMN_DEPLOY:
-			    	return " ";	  //$NON-NLS-1$
-			    case COLUMN_LIB_NAME:
-			    	return ((JSFLibraryInternalReference)element).getLabel();
-			    }				
-			}			
-		    return ""; //$NON-NLS-1$
-			
-		}
-		public Image getColumnImage(Object element, int columnIndex) {
-			return null;
-		}
-	}
-	// Sorter
-	private static class SelectedCompLibCTVSorter extends ViewerSorter {
-		public int compare(Viewer viewer, Object e1, Object e2) {
-			if (e1 instanceof JSFLibraryInternalReference && 
-					e2 instanceof JSFLibraryInternalReference) {
-			JSFLibraryInternalReference item1 = (JSFLibraryInternalReference)e1;
-			JSFLibraryInternalReference item2 = (JSFLibraryInternalReference)e2;			
-			return item1.getLabel().compareToIgnoreCase(item2.getLabel());
-			}
-			return 0;
-		}
-	}
-	
-	/*
-	 * Content provider Adapter for TreeViewer
-	 */
-	private class TreeViewerAdapter implements ITreeContentProvider {
-		private final Object[] NO_ELEMENTS= new Object[0];
-
-		// ------- ITreeContentProvider Interface ------------
-
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-			// will never happen
-		}
-
-		public void dispose() {
-            // do nothing
-		}
-
-		public Object[] getElements(Object obj) {
-			return workingCopyModel.getJSFComponentLibraries().toArray();
-		}
-		
-		public Object[] getChildren(Object element) {
-			if (element instanceof JSFLibraryInternalReference) {
-				return ((JSFLibraryInternalReference)element).getArchiveFiles().toArray();				
-			}
-			return NO_ELEMENTS;
-		}
-
-		public Object getParent(Object element) {
-			return null;
-		}
-
-		public boolean hasChildren(Object element) {
-			if (element instanceof JSFLibraryInternalReference) {
-				return true;
-			}
-			return false;
-		}		
-		
-	}
-	
-	private static class TreeLabelProvider implements ILabelProvider {
-		private final Image libImg;
-		private final Image jarImg;
-
-		TreeLabelProvider()
-		{
-			ImageDescriptor jarImgDesc = JSFUiPlugin.getImageDescriptor("obj16/jar_obj.gif"); //$NON-NLS-1$
-			jarImg = jarImgDesc.createImage();
-			ImageDescriptor libImgDesc = JSFUiPlugin.getImageDescriptor("obj16/library_obj.gif"); //$NON-NLS-1$
-			libImg = libImgDesc.createImage();
-		}
-		
-		public Image getImage(Object element) {
-			if (element instanceof JSFLibraryInternalReference)
-            {
-			    return libImg;
-            }
-			return jarImg;
-		}
-
-		public String getText(Object element) {
-			StringBuffer labelBuf = new StringBuffer();
-			if (element instanceof JSFLibraryInternalReference) {
-				JSFLibraryInternalReference libWrapper = (JSFLibraryInternalReference)element;
-				JSFLibrary lib = libWrapper.getLibrary();
-				labelBuf.append(lib.getLabel());
-				if (lib.isImplementation()) {
-					labelBuf.append(" "); //$NON-NLS-1$
-					if (lib == JSFLibraryRegistryUtil.getInstance().getJSFLibraryRegistry().getDefaultImplementation()) {
-						labelBuf.append(Messages.JSFLibrariesPreferencePage_DEFAULT_IMPL_DESC); 
-					} else {
-						labelBuf.append(Messages.JSFLibrariesPreferencePage_IMPL_DESC); 
-					}
-				}
-			}
-			if (element instanceof ArchiveFile) {
-				ArchiveFile jar = (ArchiveFile)element;
-				labelBuf.append(jar.getName());
-				if (!jar.exists())
-					labelBuf.append(Messages.JSFLibrariesPreferencePage_MISSING_DESC);
-				labelBuf.append(" - ").append(((ArchiveFile)element).getSourceLocation()); //$NON-NLS-1$
-			}
-			return labelBuf.toString();
-		}
-
-		public void addListener(ILabelProviderListener listener) {
-            // not handling listeners
-		}
-
-		public void dispose() {
-			if (libImg != null){
-				libImg.dispose();
-			}			
-			if (jarImg != null){
-				jarImg.dispose();
-			}		
-		}
-
-		public boolean isLabelProperty(Object element, String property) {
-			return false;
-		}
-
-		public void removeListener(ILabelProviderListener listener) {
-            // not handling listeners
-		}
-	}
-	
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/jsflibraryconfig/JSFLibraryConfigControlChangeEvent.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/jsflibraryconfig/JSFLibraryConfigControlChangeEvent.java
deleted file mode 100644
index 3ebbb69..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/jsflibraryconfig/JSFLibraryConfigControlChangeEvent.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.ui.internal.jsflibraryconfig;
-
-import java.util.EventObject;
-
-/**
- * Event that something has changed in the JSFLibraryConfigControl
- * @deprecated
- */
-public class JSFLibraryConfigControlChangeEvent {
-	private EventObject event;
-
-	/**
-	 * Constructor
-	 * @param ev
-	 */
-	public JSFLibraryConfigControlChangeEvent(EventObject ev){
-		this.event = ev;
-	}
-
-	/**
-	 * @return java.util.EventObject
-	 */
-	public EventObject getEvent(){
-		return event;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/jsflibraryconfig/JSFLibraryConfigControlChangeListener.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/jsflibraryconfig/JSFLibraryConfigControlChangeListener.java
deleted file mode 100644
index 6cf386a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/jsflibraryconfig/JSFLibraryConfigControlChangeListener.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.ui.internal.jsflibraryconfig;
-
-
-/**
- * Interface to be implemented to listen to changes in the JSFLibraryConfigControl object
- * @deprecated
- */
-public interface JSFLibraryConfigControlChangeListener {
-	/**
-	 * Callback method
-	 * @param e
-	 */
-	public void changed(JSFLibraryConfigControlChangeEvent e);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/jspeditor/AbstractELHyperlinkDetector.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/jspeditor/AbstractELHyperlinkDetector.java
deleted file mode 100644
index 31dae85..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/jspeditor/AbstractELHyperlinkDetector.java
+++ /dev/null
@@ -1,137 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.ui.internal.jspeditor;
-
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.content.IContentType;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jface.text.IRegion;
-import org.eclipse.jface.text.ITextViewer;
-import org.eclipse.jface.text.Region;
-import org.eclipse.jface.text.hyperlink.AbstractHyperlinkDetector;
-import org.eclipse.jface.text.hyperlink.IHyperlink;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContextFactory;
-import org.eclipse.jst.jsf.context.symbol.IBeanInstanceSymbol;
-import org.eclipse.jst.jsf.context.symbol.IBeanMethodSymbol;
-import org.eclipse.jst.jsf.context.symbol.IBeanPropertySymbol;
-import org.eclipse.jst.jsf.context.symbol.ISymbol;
-import org.eclipse.jst.jsf.core.internal.contentassist.el.SymbolInfo;
-
-/**
- * This HyperlinkDetector creates hyperlinks for symbols in JSF EL expressions
- * inside jsp and facelet files.
- */
-public abstract class AbstractELHyperlinkDetector extends AbstractHyperlinkDetector {
-
-	/**
-	 * Tests if this detector should return any hyperlinks for this context.
-	 * @param context IStructuredDocumentContext instance to test enablement for.
-	 * @return true if this detector should return any hyperlinks for this context, else false.
-	 */
-	protected abstract boolean isEnabled(final IStructuredDocumentContext context);
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jface.text.hyperlink.IHyperlinkDetector#detectHyperlinks(org.eclipse.jface.text.ITextViewer, org.eclipse.jface.text.IRegion, boolean)
-	 */
-	public final IHyperlink[] detectHyperlinks(
-			final ITextViewer textViewer,
-			final IRegion region,
-			final boolean canShowMultipleHyperlinks) {
-        final IStructuredDocumentContext context =
-        	IStructuredDocumentContextFactory.INSTANCE.getContext(textViewer, region.getOffset());
-        if (!isEnabled(context)) {
-        	return null;
-        }
-        return detectHyperlinks(context, region);
-	}
-
-    /**
-     * Broken out for testing.
-     * @param context
-     * @param region
-     * @return the hyperlinks
-     */
-    protected IHyperlink[] detectHyperlinks(
-            final IStructuredDocumentContext context, final IRegion region) {
-        final Region elRegion = JSPSourceUtil.findELRegion(context);
-        if (elRegion != null) {
-            final SymbolInfo symbolInfo = JSPSourceUtil.determineSymbolInfo(
-                    context, elRegion, region.getOffset());
-            if (symbolInfo != null) {
-                IHyperlink link = null;
-                final Region linkRegion = new Region(symbolInfo
-                        .getRelativeRegion().getOffset()
-                        + elRegion.getOffset(), symbolInfo.getRelativeRegion()
-                        .getLength());
-                final ISymbol symbol = symbolInfo.getSymbol();
-                if (symbol instanceof IBeanInstanceSymbol) {
-                    link = createBeanInstanceLink(linkRegion,
-                            (IBeanInstanceSymbol) symbol);
-                } else if (symbol instanceof IBeanPropertySymbol) {
-                    link = createBeanPropertyLink(linkRegion,
-                            (IBeanPropertySymbol) symbol);
-                } else if (symbol instanceof IBeanMethodSymbol) {
-                    link = createMethodLink(linkRegion,
-                            (IBeanMethodSymbol) symbol);
-                }
-                if (link != null) {
-                    return new IHyperlink[] { link };
-                }
-            }
-        }
-        return null;
-    }
-
-    private IHyperlink createBeanInstanceLink(
-    		final Region region, final IBeanInstanceSymbol symbol) {
-        if (symbol.isTypeResolved()) {
-            final IType type = symbol.getJavaTypeDescriptor().getType();
-            return new JavaElementHyperlink(region, type);
-        }
-        return null;
-    }
-
-    private IHyperlink createBeanPropertyLink(
-    		final Region region, final IBeanPropertySymbol symbol) {
-        // defer calculation of access method until user click on link (takes
-        // too long otherwise):
-        return new BeanSuffixHyperlink(region, symbol);
-    }
-
-    private IHyperlink createMethodLink(
-    		final Region region, final IBeanMethodSymbol symbol) {
-        // defer calculation of access method until user click on link (takes
-        // too long otherwise):
-        return new BeanSuffixHyperlink(region, symbol);
-    }
-
-    /**
-     * Tests if the specified file has the specified content type.
-     * @param filename Name of file to test.
-     * @param contentTypeId ID of content type to test.
-     * @return true if the specified file has the specified content type, else false.
-     */
-	protected boolean hasContentType(String filename, String contentTypeId) {
-		boolean hasContentType = false;
-		final IContentType[] contentTypes =
-			Platform.getContentTypeManager().findContentTypesFor(filename);
-		for (final IContentType contentType: contentTypes) {
-			if (contentTypeId.equals(contentType.getId())) {
-				hasContentType = true;
-				break;
-			}
-		}
-		return hasContentType;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/jspeditor/BeanSuffixHyperlink.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/jspeditor/BeanSuffixHyperlink.java
deleted file mode 100644
index 315583b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/jspeditor/BeanSuffixHyperlink.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.ui.internal.jspeditor;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IMethod;
-import org.eclipse.jdt.ui.JavaUI;
-import org.eclipse.jface.text.IRegion;
-import org.eclipse.jface.text.hyperlink.IHyperlink;
-import org.eclipse.jst.jsf.common.util.JDTBeanProperty;
-import org.eclipse.jst.jsf.context.symbol.IBeanMethodSymbol;
-import org.eclipse.jst.jsf.context.symbol.IBeanPropertySymbol;
-import org.eclipse.jst.jsf.context.symbol.ISymbol;
-import org.eclipse.jst.jsf.context.symbol.internal.impl.JavaUtil;
-import org.eclipse.jst.jsf.ui.internal.JSFUiPlugin;
-import org.eclipse.jst.jsf.ui.internal.Messages;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.ui.IEditorPart;
-
-/**
- * Hyperlink for IBeanPropertySymbol and IBeanMethodSymbol el symbols. This Class only exists
- *  in order to defer determining the (access) method to link to until user actually clicks
- *  on the link, since determining takes too long.
- */
-class BeanSuffixHyperlink implements IHyperlink,ITestHyperlink {
-	private final IRegion _fRegion;
-	private final ISymbol _symbol;
-
-    /**
-     * Creates a BeanSuffixHyperlink for a symbol
-     * @param region - the region of the hyperlink
-     * @param symbol
-     */
-    public BeanSuffixHyperlink(final IRegion region, final ISymbol symbol) {
-        _fRegion = region;
-        _symbol = symbol;
-    }
-
-	/*
-	 * (non-Javadoc)
-	 *
-	 * @see org.eclipse.jface.text.hyperlink.IHyperlink#getHyperlinkRegion()
-	 */
-	public IRegion getHyperlinkRegion() {
-		return _fRegion;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 *
-	 * @see org.eclipse.jface.text.hyperlink.IHyperlink#getTypeLabel()
-	 */
-	public String getTypeLabel() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 *
-	 * @see org.eclipse.jface.text.hyperlink.IHyperlink#getHyperlinkText()
-	 */
-	public String getHyperlinkText() {
-		//Bug 254452 - JSF hyperlink provider shows "unknown hyperlink" when in list
-	    final IJavaElement element = determineJavaElement();
-	    if (element != null) {
-	    	final ICompilationUnit compilationUnit = (ICompilationUnit)element.getAncestor(IJavaElement.COMPILATION_UNIT);
-	    	if (compilationUnit != null) {
-    			return NLS.bind(Messages.Hyperlink_Open_JavaMethod, compilationUnit.getElementName(), element.getElementName());
-	    	}
-	    	return Messages.Hyperlink_Open_JavaFile;
-	    }
-		return Messages.Hyperlink_Open_JavaElement;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 *
-	 * @see org.eclipse.jface.text.hyperlink.IHyperlink#open()
-	 */
-	public void open() {
-	    final IJavaElement element = determineJavaElement();
-	    if (element != null) {
-	        try {
-	            final IEditorPart editor = JavaUI.openInEditor(element);
-	            if (editor != null) {
-	                JavaUI.revealInEditor(editor, element);
-	            }
-	        }
-	        catch (final Exception e) {
-	            JSFUiPlugin.log(IStatus.WARNING, e.getMessage(), e);
-	        }
-	    }
-	}
-
-    public IJavaElement determineJavaElement() {
-        if (_symbol instanceof IBeanPropertySymbol) {
-            return determinePropertyElement((IBeanPropertySymbol) _symbol);
-        }
-        if (_symbol instanceof IBeanMethodSymbol) {
-            return JavaUtil.findCorrespondingMethod((IBeanMethodSymbol) _symbol);
-        }
-        return null;
-    }
-
-    private IMethod determinePropertyElement(final IBeanPropertySymbol propertySymbol) {
-        final JDTBeanProperty property = JavaUtil.findCorrespondingJDTProperty(propertySymbol);
-        if (property != null) {
-            if (property.getGetter() != null) {
-                return property.getGetter();
-            }
-            if (property.getSetter() != null) {
-                return property.getSetter();
-            }
-        }
-        return null;
-    }
-
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/jspeditor/ITestHyperlink.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/jspeditor/ITestHyperlink.java
deleted file mode 100644
index 9fc86e7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/jspeditor/ITestHyperlink.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.ui.internal.jspeditor;
-
-import org.eclipse.jdt.core.IJavaElement;
-
-/**
- * Test-only interface.  Not for normal use.
- *
- * @author cbateman
- *
- */
-public interface ITestHyperlink {
-	/**
-	 * @return the java element for symbol2 or null if none.
-	 */
-	public IJavaElement determineJavaElement();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/jspeditor/JSFELHover.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/jspeditor/JSFELHover.java
deleted file mode 100644
index 639cee7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/jspeditor/JSFELHover.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.ui.internal.jspeditor;
-
-import org.eclipse.jface.text.IRegion;
-import org.eclipse.jface.text.ITextHover;
-import org.eclipse.jface.text.ITextViewer;
-import org.eclipse.jface.text.Region;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContextFactory;
-import org.eclipse.jst.jsf.context.symbol.IDescribedInDetail;
-import org.eclipse.jst.jsf.context.symbol.ISymbol;
-import org.eclipse.jst.jsf.core.internal.contentassist.el.SymbolInfo;
-
-/** This class creates hovers for ISymbols in an el expression that have a detailedDescription.
- */
-public class JSFELHover implements ITextHover {
-
-    private ISymbol hoveredSymbol = null;
-
-    public final String getHoverInfo(final ITextViewer textViewer, final IRegion hoverRegion) {
-    	return getHoverInfo();
-    }
-
-    /**
-     * For testing
-     *
-     * @return the hover info
-     */
-    protected String getHoverInfo()
-    {
-        // hoveredSymbol set by getHoverRegion, which is called first
-        if (hoveredSymbol instanceof IDescribedInDetail) {
-            return ((IDescribedInDetail) hoveredSymbol).getDetailedDescription();
-        }
-        return null;
-    }
-
-    public final IRegion getHoverRegion(final ITextViewer textViewer, final int documentPosition) {
-        final IStructuredDocumentContext context = IStructuredDocumentContextFactory.INSTANCE.getContext(textViewer,
-                documentPosition);
-        return getHoverRegion(context, documentPosition);
-    }
-
-    /**
-     * For testing
-     *
-     * @param context
-     * @param documentPosition
-     * @return the hover region
-     */
-    protected IRegion getHoverRegion(final IStructuredDocumentContext context, final int documentPosition)
-    {
-        hoveredSymbol = null;
-        final Region elRegion = JSPSourceUtil.findELRegion(context);
-        if (elRegion != null) {
-            final SymbolInfo symbolInfo = JSPSourceUtil.determineSymbolInfo(context, elRegion, documentPosition);
-            if (symbolInfo == null) {
-                return null;
-            }
-            final Region relativeRegion = symbolInfo.getRelativeRegion();
-            final Region symbolRegion = new Region(elRegion.getOffset()
-                    + relativeRegion.getOffset(), relativeRegion.getLength());
-            hoveredSymbol = symbolInfo.getSymbol();
-            return symbolRegion;
-        }
-        return null;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/jspeditor/JSPELHyperlinkDetector.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/jspeditor/JSPELHyperlinkDetector.java
deleted file mode 100644
index 79faa8f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/jspeditor/JSPELHyperlinkDetector.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.ui.internal.jspeditor;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IStructuredDocumentContextResolverFactory;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IWorkspaceContextResolver;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-
-/**
- * This HyperlinkDetector creates hyperlinks for symbols in JSF EL expressions
- * inside jsp files.
- */
-public class JSPELHyperlinkDetector extends AbstractELHyperlinkDetector {
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.ui.internal.jspeditor.AbstractELHyperlinkDetector#isEnabled(org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext)
-	 */
-	@Override
-	protected boolean isEnabled(IStructuredDocumentContext context) {
-		boolean enabled = false;
-		if (context != null) {
-			IWorkspaceContextResolver resolver =
-				IStructuredDocumentContextResolverFactory.INSTANCE.getWorkspaceContextResolver(context);
-			if (resolver != null) {
-				IResource resource = resolver.getResource();
-				if (resource instanceof IFile) {
-					IFile file = (IFile)resource;
-					String filename = file.getFullPath().toString();
-					enabled = hasContentType(filename, "org.eclipse.jst.jsp.core.jspsource"); //$NON-NLS-1$
-				}
-			}
-		}
-		return enabled;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/jspeditor/JSPSourceUtil.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/jspeditor/JSPSourceUtil.java
deleted file mode 100644
index 654f42f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/jspeditor/JSPSourceUtil.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.ui.internal.jspeditor;
-
-import org.eclipse.jface.text.Region;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IStructuredDocumentContextResolverFactory;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.internal.ITextRegionContextResolver;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.jst.jsf.core.internal.contentassist.el.ContentAssistParser;
-import org.eclipse.jst.jsf.core.internal.contentassist.el.SymbolInfo;
-import org.eclipse.jst.jsf.designtime.DTAppManagerUtil;
-import org.eclipse.jst.jsf.designtime.internal.view.XMLViewDefnAdapter;
-import org.eclipse.jst.jsf.designtime.internal.view.IDTViewHandler.ViewHandlerException;
-import org.eclipse.jst.jsf.designtime.internal.view.XMLViewDefnAdapter.DTELExpression;
-import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext;
-
-/**
- * Utility class to access EL symbols in jsp file.
- */
-public final class JSPSourceUtil
-{
-
-    private JSPSourceUtil()
-    {
-        // utility class, no instances.
-    }
-
-    /**
-     * Find the Region
-     * 
-     * @param context -
-     *            the IStructuredDocumentContext
-     * @return region of el expression, null if context doesn't point to an el
-     *         expression
-     */
-    public static Region findELRegion(final IStructuredDocumentContext context)
-    {
-        if (context != null)
-        {
-            final DTELExpression expression = getELExpression(context);
-            if (expression != null)
-            {
-                final ITextRegionContextResolver resolver = IStructuredDocumentContextResolverFactory.INSTANCE
-                        .getTextRegionResolver(expression.getDocumentContext());
-
-                if (resolver != null)
-                {
-                    final String regionType = resolver.getRegionType();
-
-                    if (regionType != null)
-                    {
-
-                        if (regionType == DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE)
-                        {
-                            return new Region(expression.getDocumentContext()
-                                    .getDocumentPosition(), expression
-                                    .getText().length());
-                        }
-                        else if (resolver.matchesRelative(new String[]
-                        { DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE }))
-                        {
-                            return new Region(resolver.getStartOffset(),
-                                    resolver.getLength());
-                        }
-                    }
-                }
-            }
-        }
-        return null;
-    }
-
-    /**
-     * Determines symbol and symbol region at a given document position
-     * 
-     * @param context -
-     *            the IStructuredDocumentContext
-     * @param elRegion -
-     *            the region of the el expression to consider
-     * @param documentPosition -
-     *            the document position to get the symbol for
-     * @return SymbolInfo
-     */
-    public static SymbolInfo determineSymbolInfo(
-            final IStructuredDocumentContext context, final Region elRegion,
-            final int documentPosition)
-    {
-        if (context != null && elRegion != null)
-        {
-            final DTELExpression elExpression = getELExpression(context);
-            
-            final String elText = elExpression.getText().trim();
-//                        context.getStructuredDocument().get(
-//                                elRegion.getOffset(), elRegion.getLength());
-            final SymbolInfo symbolInfo =
-                    ContentAssistParser.getSymbolInfo(context,
-                            documentPosition - elRegion.getOffset() + 1,
-                            elText);
-            return symbolInfo;
-        }
-        return null;
-    }
-    
-    private static DTELExpression getELExpression(
-            final IStructuredDocumentContext context)
-    {
-        final XMLViewDefnAdapter adapter = DTAppManagerUtil
-                .getXMLViewDefnAdapter(context);
-        DTELExpression expression = null;
-        if (adapter != null)
-        {
-            try
-            {
-                expression = adapter.getELExpression(context);
-            }
-            catch (ViewHandlerException e)
-            {
-                expression = null;
-            }
-        }
-        return expression;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/jspeditor/JavaElementHyperlink.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/jspeditor/JavaElementHyperlink.java
deleted file mode 100644
index 62b06eb..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/jspeditor/JavaElementHyperlink.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.ui.internal.jspeditor;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.ui.JavaUI;
-import org.eclipse.jface.text.IRegion;
-import org.eclipse.jface.text.hyperlink.IHyperlink;
-import org.eclipse.jst.jsf.ui.internal.JSFUiPlugin;
-import org.eclipse.jst.jsf.ui.internal.Messages;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.ui.IEditorPart;
-
-/**
- * Hyperlink for a IJavaElement to the corresponding java source
- */
-class JavaElementHyperlink implements IHyperlink, ITestHyperlink {
-	private final IRegion fRegion;
-	private final IJavaElement fElement;
-
-	/**Creates a new hyperlink for a given IJavaElement
-	 * @param region - region of the hyperlink
-	 * @param element - hyperlink links to the source of <code>element</code>
-	 */
-	public JavaElementHyperlink(final IRegion region, final IJavaElement element) {
-		fRegion = region;
-		fElement = element;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 *
-	 * @see org.eclipse.jface.text.hyperlink.IHyperlink#getHyperlinkRegion()
-	 */
-	public IRegion getHyperlinkRegion() {
-		return fRegion;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 *
-	 * @see org.eclipse.jface.text.hyperlink.IHyperlink#getTypeLabel()
-	 */
-	public String getTypeLabel() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 *
-	 * @see org.eclipse.jface.text.hyperlink.IHyperlink#getHyperlinkText()
-	 */
-	public String getHyperlinkText() {
-		//Bug 254452 - JSF hyperlink provider shows "unknown hyperlink" when in list
-	    final IJavaElement element = determineJavaElement();
-	    if (element != null) {
-	    	final ICompilationUnit compilationUnit = (ICompilationUnit)element.getAncestor(IJavaElement.COMPILATION_UNIT);
-	    	if (compilationUnit != null) {
-    			return NLS.bind(Messages.Hyperlink_Open_JavaType, compilationUnit.getElementName());
-	    	}
-	    	return Messages.Hyperlink_Open_JavaFile;
-	    }
-		return Messages.Hyperlink_Open_JavaElement;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 *
-	 * @see org.eclipse.jface.text.hyperlink.IHyperlink#open()
-	 */
-	public void open() {
-		try {
-			final IEditorPart editor = JavaUI.openInEditor(fElement);
-			if (editor != null) {
-				JavaUI.revealInEditor(editor, fElement);
-			}
-		}
-		catch (final Exception e) {
-		    JSFUiPlugin.log(IStatus.WARNING, e.getMessage(), e);
-		}
-	}
-
-	public IJavaElement determineJavaElement() {
-		return fElement;
-	}
-
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/messages.properties b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/messages.properties
deleted file mode 100644
index 1c8c2b3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/messages.properties
+++ /dev/null
@@ -1,96 +0,0 @@
-###############################################################################
-# Copyright (c) 2005 Oracle Corporation.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#    Gerry Kessler - initial API and implementation
-#    Ian Trimble - change key names for use with org.eclipse.osgi.util.NLS
-###############################################################################
-JSFFacetInstallPage_title=JSF Capabilities
-JSFFacetInstallPage_description=Add JSF capabilities to this Web Project
-JSFFacetInstallPage_JSFImplLabel=JSF &Implementation:
-JSFFacetInstallPage_Add1=A&dd...
-JSFFacetInstallPage_Add2=&Add...
-JSFFacetInstallPage_DeployJarsLabel=&Deploy jars to WEB-INF/lib
-JSFFacetInstallPage_JSFConfigLabel=JSF &Configuration File:
-JSFFacetInstallPage_JSFServletNameLabel=JSF &Servlet Name:
-JSFFacetInstallPage_JSFServletClassNameLabel=JSF Servlet C&lass Name:
-JSFFacetInstallPage_JSFURLMappingLabel=&URL Mapping Patterns:
-JSFFacetInstallPage_JSFImplementationLibrariesFrame=JSF Implementation Library
-JSFFacetInstallPage_JSFComponentLibrariesFrame=Component Libraries
-JSFFacetInstallPage_PatternDialogTitle=Specify URL Pattern
-JSFFacetInstallPage_PatternDialogDesc=URL Pattern
-JSFFacetInstallPage_Remove=&Remove
-JSFFacetInstallPage_PatternEmptyMsg=Pattern must not be empty
-JSFFacetInstallPage_PatternSpecifiedMsg=Pattern is already specified
-JSFFacetInstallPage_ErrorNoWebAppDataModel=Unable to locate WebApp datamodel
-
-JSFLibrariesPreferencePage_DefinedJSFLibraries=Defined JSF Libraries:
-JSFLibrariesPreferencePage_DEFAULT_IMPL_DESC=[implementation - default]
-JSFLibrariesPreferencePage_New=New...
-JSFLibrariesPreferencePage_Edit=Edit...
-JSFLibrariesPreferencePage_Remove=Remove
-JSFLibrariesPreferencePage_CannotRemovePluginProvidedTitle=Cannot Remove
-JSFLibrariesPreferencePage_CannotRemovePluginProvidedMessage=Plugin provided libraries cannot be removed from the registry
-JSFLibrariesPreferencePage_MakeDefault=Make Default
-JSFLibrariesPreferencePage_MISSING_DESC=[missing]
-JSFLibrariesPreferencePage_Description=JSF Libraries contain jars with JSF components and tag libraries.   Some JSF Libraries can be specially marked as implementations so that the WebApp can be executed.
-JSFLibrariesPreferencePage_IMPL_DESC=[implementation]
-JSFLibrariesPreferencePage_CannotModifyPluginProvidedTitle=Cannot Modify
-JSFLibraryPropertyPage_No_JSF_Implementation_Lib_Selected=No JSF implementation library selected.
-JSFLibrariesPreferencePage_CannotModifyPluginProvidedMessage=Plugin provided libraries cannot be edited
-
-JSFLibraryContainerWizardPage_PageName=Add JSF Library
-JSFLibraryContainerWizardPage_Title=JSF Library
-JSFLibraryContainerWizardPage_Description=Select JavaServer Face Libraries to add to the classpath
-JSFLibraryContainerWizardPage_WarningNoJSFFacet=JavaServer Face Libraries can only be configured for Dynamic Web projects with the JSF facet installed.
-JSFLibraryContainerWizardPage_JSFLibraries=JSF Libraries:
-JSFLibraryContainerWizardPage_Add=Add...
-JSFLibraryWizard_JSFLibraryWizard_DontShowThisAgain_CheckBoxLabel=Do not show this message again (affects all listed projects)
-JSFLibraryContainerWizardPage_EditLibrary_DescriptionText=Select JSF Library for this reference to use.  Choose 'Edit...' to modify contents of the selected library.
-JSFLibraryContainerWizardPage_Edit=Edit...
-JSFLibraryContainerWizardPage_ImplAlreadyPresent=An implementation has already been chosen.  Please remove before adding different one
-JSFLibraryContainerWizardPage_ErrorInitializing=Error during initialization
-JSFLibraryContainerWizardPage_SelectOneImpl=Choose only one implementation
-
-JSFLibraryWizard_DESCRIPTION=Create a library of jars that make up a JSF component library.
-JSFLibraryWizard_CreateJSFLibrary=Create JSF Library
-JSFLibraryWizard_EditJSFLibrary=Edit JSF Library
-JSFLibraryWizard_JSFLibrary=JSF Library
-JSFLibraryWizard_LibraryName=Library &Name:
-JSFLibraryWizard_VersionSupported=&Version Supported:
-JSFLibraryWizard_LibraryJars=Library &Jars
-JSFLibraryWizard_DeployJars=&Deploy Jars
-JSFLibraryWizard_Add=&Add...
-JSFLibraryWizard_Remove=&Remove
-JSFLibraryWizard_ExtJarFileDialogTitle=Browse for Jars/Zips
-JSFLibraryWizard_ValidateNoJars=The library must contain at least one jar.
-JSFLibraryWizard_ValidateNoLibraryName=A library name must be supplied.
-JSFLibraryWizard_ValidateExistingLibraryName=A library or implementation by this name already exists.
-JSFLibraryConfigControl_ImplementationLibrary=Implementation Library
-JSFLibraryPropertyPage_No_JSF_Facet_Installed=JSF Facet not installed.
-JSFLibraryConfigControl_DeployJAR=Deploy jars to WEB-INF/lib
-JSFLibraryConfigControl_Add=\ \ >  
-JSFLibraryConfigControl_Remove=\ \ <  
-JSFLibraryConfigControl_AddAll=\ \ >>  
-JSFLibraryConfigControl_RemoveAll=\ \ <<  
-JSFLibraryConfigControl_NewComponentLibrary=New...
-JSFLibraryConfigControl_TH_Deploy=Deploy
-JSFLibraryConfigControl_NullProject=No project specified.
-JSFLibraryConfigControl_TH_LibraryName=Library Name
-
-JSFValidationPreferencePage_ELPrefPanel_Title=Expression Language (EL) Validation
-JSFValidationPreferencePage_ELPrefPanel_BuildValidationCheckBoxTitle=Validate EL on &Build/Run Validation
-JSFValidationPreferencePage_ELPrefPanel_IncrementalValidationCheckBoxTitle= Validate EL as &you type (may be slow on some pages)
-
-JSFLibraryEditControl_ImplVersion_UNKNOWN=UNKNOWN
-
-JSFPreferences_RootPage_Description=Expand the tree to edit preferences for a specific feature.
-
-Hyperlink_Open_JavaType=Open {0}
-Hyperlink_Open_JavaMethod=Open {1}(...) method in {0}
-Hyperlink_Open_JavaFile=Open Java file
-Hyperlink_Open_JavaElement=Open unknown Java element
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/preferences/EmptyRootPreferencePage.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/preferences/EmptyRootPreferencePage.java
deleted file mode 100644
index d269dd2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/preferences/EmptyRootPreferencePage.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     Oracle - adapted for JSF tooling
- *     
- *******************************************************************************/
-package org.eclipse.jst.jsf.ui.internal.preferences;
-
-import org.eclipse.jface.preference.PreferencePage;
-import org.eclipse.jst.jsf.ui.internal.Messages;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.ScrolledComposite;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPreferencePage;
-
-/**
- * The empty pref page used as the root of all other JSF feature preference pages
- * under the Web&XML top-level pref page
- * 
- * @author cbateman
- *
- */
-public class EmptyRootPreferencePage extends PreferencePage implements IWorkbenchPreferencePage {
-
-    private Composite createComposite(Composite parent, int numColumns) {
-        noDefaultAndApplyButton();
-        
-        Composite composite = new Composite(parent, SWT.NULL);
-
-        // GridLayout
-        GridLayout layout = new GridLayout();
-        layout.numColumns = numColumns;
-        composite.setLayout(layout);
-
-        // GridData
-        GridData data = new GridData(GridData.FILL);
-        data.horizontalIndent = 0;
-        data.verticalAlignment = GridData.FILL;
-        data.horizontalAlignment = GridData.FILL;
-        composite.setLayoutData(data);
-
-        return composite;
-    }
-
-    protected Control createContents(Composite parent) {
-        Composite composite = createScrolledComposite(parent);
-
-        String description = Messages.JSFPreferences_RootPage_Description;
-        Text text = new Text(composite, SWT.READ_ONLY);
-        // some themes on GTK have different background colors for Text and Labels
-        text.setBackground(composite.getBackground());
-        text.setText(description);
-
-        setSize(composite);
-        return composite;
-    }
-
-    private Composite createScrolledComposite(Composite parent) {
-        // create scrollbars for this parent when needed
-        final ScrolledComposite sc1 = new ScrolledComposite(parent, SWT.H_SCROLL | SWT.V_SCROLL);
-        sc1.setLayoutData(new GridData(GridData.FILL_BOTH));
-        Composite composite = createComposite(sc1, 1);
-        sc1.setContent(composite);
-
-        // not calling setSize for composite will result in a blank composite,
-        // so calling it here initially
-        // setSize actually needs to be called after all controls are created,
-        // so scrolledComposite
-        // has correct minSize
-        setSize(composite);
-        return composite;
-    }
-
-    public void init(IWorkbench workbench) {
-        // do  nothing
-    }
-
-    private void setSize(Composite composite) {
-        if (composite != null) {
-            // Note: The font is set here in anticipation that the class inheriting
-            //       this base class may add widgets to the dialog.   setSize
-            //       is assumed to be called just before we go live.
-            applyDialogFont(composite);
-            Point minSize = composite.computeSize(SWT.DEFAULT, SWT.DEFAULT);
-            composite.setSize(minSize);
-            // set scrollbar composite's min size so page is expandable but
-            // has scrollbars when needed
-            if (composite.getParent() instanceof ScrolledComposite) {
-                ScrolledComposite sc1 = (ScrolledComposite) composite.getParent();
-                sc1.setMinSize(minSize);
-                sc1.setExpandHorizontal(true);
-                sc1.setExpandVertical(true);
-            }
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/preferences/JSPTagRegistryPreferencePage.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/preferences/JSPTagRegistryPreferencePage.java
deleted file mode 100644
index c0cc323..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/preferences/JSPTagRegistryPreferencePage.java
+++ /dev/null
@@ -1,161 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.ui.internal.preferences;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jface.dialogs.MessageDialogWithToggle;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.preference.PreferencePage;
-import org.eclipse.jface.viewers.ITableLabelProvider;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.window.Window;
-import org.eclipse.jst.jsf.common.internal.policy.OrderedListProvider;
-import org.eclipse.jst.jsf.common.internal.policy.OrderedListProvider.OrderableObject;
-import org.eclipse.jst.jsf.common.ui.internal.preferences.StrategyOrderingPanel;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.designtime.internal.view.model.ITagRegistry;
-import org.eclipse.jst.jsf.designtime.internal.view.model.TagRegistryFactory;
-import org.eclipse.jst.jsf.designtime.internal.view.model.TagRegistryFactory.TagRegistryFactoryException;
-import org.eclipse.jst.jsf.designtime.internal.view.model.jsp.registry.TLDRegistryManager;
-import org.eclipse.jst.jsf.designtime.internal.view.model.jsp.registry.TLDRegistryPreferences;
-import org.eclipse.jst.jsf.designtime.internal.view.model.jsp.registry.TLDRegistryPreferences.StrategyIdentifier;
-import org.eclipse.jst.jsf.ui.internal.JSFUiPlugin;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPreferencePage;
-
-/**
- * Preferences for the JSP tag registry.
- * 
- * @author cbateman
- * 
- */
-public class JSPTagRegistryPreferencePage extends PreferencePage implements
-        IWorkbenchPreferencePage
-{
-    private final TLDRegistryPreferences _tldRegistryPreferences;
-    private StrategyOrderingPanel        _panel;
-    private OrderedListProvider       _provider;
-
-    /**
-     * Default constructor: required by the preference page
-     */
-    public JSPTagRegistryPreferencePage()
-    {
-        _tldRegistryPreferences = new TLDRegistryPreferences(
-                getPreferenceStore());
-        _tldRegistryPreferences.load();
-    }
-
-    @Override
-    protected Control createContents(final Composite parent)
-    {
-        _provider = _tldRegistryPreferences.getOrderedListProvider();
-        _panel = new StrategyOrderingPanel(
-                _provider,
-                new MyLabelProvider(),
-                Messages.JSPTagRegistryPreferencePage_PanelDescription);
-        final Control contents = _panel.createContents(parent);
-        _panel.refresh();
-        return contents;
-    }
-
-    public void init(final IWorkbench workbench)
-    {
-        // do nothing
-    }
-
-    protected void performApply()
-    {
-        if (_tldRegistryPreferences.isDirty())
-        {
-            final MessageDialogWithToggle dialog = 
-                MessageDialogWithToggle.openOkCancelConfirm(getShell(), 
-                    Messages.JSPTagRegistryPreferencePage_0, 
-                    Messages.JSPTagRegistryPreferencePage_1, 
-                    Messages.JSPTagRegistryPreferencePage_2, false, null, null);
-    
-            if (dialog.getReturnCode() == Window.OK)
-            {
-                _tldRegistryPreferences.commit(getPreferenceStore());
-                final TagRegistryFactory myRegistryFactory = new TLDRegistryManager.MyRegistryFactory();
-                for (final IProject project : ResourcesPlugin.getWorkspace().getRoot().getProjects())
-                {
-                    if (project.isAccessible()
-                            && myRegistryFactory.isInstance(project))
-                    {
-                        try
-                        {
-                            final ITagRegistry tagRegistry = 
-                                myRegistryFactory.createTagRegistry(project);
-                            tagRegistry.refresh(null, dialog.getToggleState());
-                        } 
-                        catch (TagRegistryFactoryException e)
-                        {
-                            JSFUiPlugin.log(IStatus.ERROR, "Error getting JSP tag registry on project: "+project.getName(), e); //$NON-NLS-1$
-                        }
-                    }
-                }
-            }
-        }
-    }
-
-    protected void performDefaults()
-    {
-        _tldRegistryPreferences.setDefaults();
-        //_provider.setStrategies(_tldRegistryPreferences.getStrategyIdOrdering());
-        _panel.refresh();
-        super.performDefaults();
-    }
-
-    public boolean performOk()
-    {
-        performApply();
-        return true;
-    }
-
-    @Override
-    protected IPreferenceStore doGetPreferenceStore()
-    {
-        return JSFCorePlugin.getDefault().getPreferenceStore();
-    }
-
-
-    private static class MyLabelProvider extends LabelProvider implements
-            ITableLabelProvider
-    {
-        public Image getColumnImage(final Object element, final int columnIndex)
-        {
-            // no image.
-            return null;
-        }
-
-        public String getColumnText(final Object element, final int columnIndex)
-        {
-            switch (columnIndex)
-            {
-                case 0:
-                    if (element instanceof OrderableObject)
-                    {
-                        return ((StrategyIdentifier)(((OrderableObject) element).getObject())).getDisplayName();
-                    }
-                default:
-                    Assert.isTrue(false);
-                    return null;
-            }
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/preferences/Messages.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/preferences/Messages.java
deleted file mode 100644
index adde4c6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/preferences/Messages.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.ui.internal.preferences;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * NLS messages
- * @author cbateman
- *
- */
-public class Messages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.jst.jsf.ui.internal.preferences.messages"; //$NON-NLS-1$
-	/**
-	 * see messages.properties
-	 */
-	public static String JSPTagRegistryPreferencePage_0;
-    /**
-     * see messages.properties
-     */
-    public static String JSPTagRegistryPreferencePage_1;
-    /**
-     * see messages.properties
-     */
-    public static String JSPTagRegistryPreferencePage_2;
-    /**
-	 * see messages.properties
-	 */
-	public static String JSPTagRegistryPreferencePage_PanelDescription;
-	static {
-		// initialize resource bundle
-		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/preferences/messages.properties b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/preferences/messages.properties
deleted file mode 100644
index 1cc72c5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/preferences/messages.properties
+++ /dev/null
@@ -1,4 +0,0 @@
-JSPTagRegistryPreferencePage_0=Registry must be refreshed
-JSPTagRegistryPreferencePage_1=Committing this changes will require that the TLD tag registry is refreshed
-JSPTagRegistryPreferencePage_2=Flush caches
-JSPTagRegistryPreferencePage_PanelDescription=Set the order in which tag resolvers are consulted when constructing the JSP tag registry
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/project/facet/JSFFacetInstallPage.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/project/facet/JSFFacetInstallPage.java
deleted file mode 100644
index 31f7f95..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/project/facet/JSFFacetInstallPage.java
+++ /dev/null
@@ -1,504 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler - initial API and implementation
- *    Debajit Adhikary - Fixes for bug 255097 ("Request to remove input fields 
- *                       from facet install page")
- *******************************************************************************/
-package org.eclipse.jst.jsf.ui.internal.project.facet;
-
-import java.util.Iterator;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jface.dialogs.DialogSettings;
-import org.eclipse.jface.dialogs.IDialogSettings;
-import org.eclipse.jface.dialogs.IInputValidator;
-import org.eclipse.jface.dialogs.InputDialog;
-import org.eclipse.jface.window.Window;
-import org.eclipse.jst.common.project.facet.core.libprov.LibraryInstallDelegate;
-import org.eclipse.jst.common.project.facet.ui.libprov.LibraryProviderFrameworkUi;
-import org.eclipse.jst.j2ee.project.facet.IJ2EEModuleFacetInstallDataModelProperties;
-import org.eclipse.jst.jsf.core.internal.project.facet.IJSFFacetInstallDataModelProperties;
-import org.eclipse.jst.jsf.core.internal.project.facet.JsfFacetConfigurationUtil;
-import org.eclipse.jst.jsf.ui.internal.JSFUiPlugin;
-import org.eclipse.jst.jsf.ui.internal.Messages;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.List;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.wst.common.frameworks.datamodel.AbstractDataModelProvider;
-import org.eclipse.wst.common.frameworks.datamodel.DataModelEvent;
-import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
-import org.eclipse.wst.common.frameworks.internal.datamodel.ui.DataModelWizardPage;
-import org.eclipse.wst.common.project.facet.core.IFacetedProject;
-import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
-import org.eclipse.wst.common.project.facet.ui.IFacetWizardPage;
-import org.eclipse.wst.common.project.facet.ui.IWizardContext;
-
-/**
- * JSF Facet installation wizard page.
- * 
- * @author Gerry Kessler - Oracle
- */
-public class JSFFacetInstallPage extends DataModelWizardPage implements
-		IJSFFacetInstallDataModelProperties, IFacetWizardPage {
-    
-    private final boolean jsfFacetConfigurationEnabled = JsfFacetConfigurationUtil.isJsfFacetConfigurationEnabled();
-    
-	// UI
-	private Label lblJSFConfig;
-	private Text txtJSFConfig;
-	private Label lblJSFServletName;
-	private Text txtJSFServletName;
-	private Label lblJSFServletClassName;
-	private Text txtJSFServletClassName;	
-	private Label lblJSFServletURLPatterns;
-	private List lstJSFServletURLPatterns;
-	private Button btnAddPattern;
-	private Button btnRemovePattern;
-
-	private IDialogSettings dialogSettings;
-	private IDataModel webAppDataModel;
-	private static final String SETTINGS_ROOT = JSFUiPlugin.PLUGIN_ID
-			+ ".jsfFacetInstall"; //$NON-NLS-1$
-	private static final String SETTINGS_CONFIG = "configPath"; //$NON-NLS-1$
-	private static final String SETTINGS_SERVLET = "servletName"; //$NON-NLS-1$
-	private static final String SETTINGS_SERVLET_CLASSNAME = "servletClassname"; //$NON-NLS-1$
-	private static final String SETTINGS_URL_MAPPINGS = "urlMappings"; //$NON-NLS-1$
-	private static final String SETTINGS_URL_PATTERN = "pattern"; //$NON-NLS-1$
-	
-	// private String projectName = null;
-	private Composite composite = null;
-
-	/**
-	 * Zero argument constructor
-	 */
-	public JSFFacetInstallPage() {
-		// FIXME: following WebFacetInstallPage pattern which will be fixed at somepoint
-		super(DataModelFactory.createDataModel(new AbstractDataModelProvider() {/*
-																				 * do
-																				 * nothing
-																				 */
-		}), "jsf.facet.install.page"); //$NON-NLS-1$
-		setTitle(Messages.JSFFacetInstallPage_title);
-		setDescription(Messages.JSFFacetInstallPage_description);
-		dialogSettings = JSFUiPlugin.getDefault().getDialogSettings();
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.frameworks.internal.datamodel.ui.DataModelWizardPage#createTopLevelComposite(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Composite createTopLevelComposite(final Composite parent) {
-		initializeDialogUnits(parent);
-		composite = new Composite(parent, SWT.NONE);
-		final GridLayout jsfCompositeLayout = new GridLayout(3, false);
-		jsfCompositeLayout.marginTop = 0;
-		jsfCompositeLayout.marginBottom = 0;
-		jsfCompositeLayout.marginRight = 0;
-		jsfCompositeLayout.marginLeft = 0;
-		composite.setLayout(jsfCompositeLayout);
-		
-		final LibraryInstallDelegate librariesInstallDelegate
-		    = (LibraryInstallDelegate) getDataModel().getProperty( LIBRARY_PROVIDER_DELEGATE );
-		
-		final Control librariesComposite
-		    = LibraryProviderFrameworkUi.createInstallLibraryPanel( composite, librariesInstallDelegate,
-		                                                            Messages.JSFFacetInstallPage_JSFImplementationLibrariesFrame );
-		
-		GridData gd = new GridData( GridData.FILL_HORIZONTAL );
-		gd.horizontalSpan = 3;
-		
-		librariesComposite.setLayoutData( gd );
-		
-		final Label spacer = new Label( composite, SWT.NONE );
-		spacer.setText( "" ); //$NON-NLS-1$
-
-        gd = new GridData( GridData.FILL_HORIZONTAL );
-        gd.horizontalSpan = 3;
-        
-		spacer.setLayoutData( gd );
-
-        if (jsfFacetConfigurationEnabled)
-        {
-    		lblJSFConfig = new Label(composite, SWT.NONE);
-    		lblJSFConfig.setText(Messages.JSFFacetInstallPage_JSFConfigLabel);
-    		lblJSFConfig.setLayoutData(new GridData(GridData.BEGINNING));
-    
-    		txtJSFConfig = new Text(composite, SWT.BORDER);
-    		GridData gd1 = new GridData(GridData.FILL_HORIZONTAL);
-    		gd1.horizontalSpan = 2;
-    		txtJSFConfig.setLayoutData(gd1);
-    
-    		lblJSFServletName = new Label(composite, SWT.NONE);
-    		lblJSFServletName
-    				.setText(Messages.JSFFacetInstallPage_JSFServletNameLabel);
-    		lblJSFServletName.setLayoutData(new GridData(GridData.BEGINNING));
-    
-    		txtJSFServletName = new Text(composite, SWT.BORDER);
-    		GridData gd2 = new GridData(GridData.FILL_HORIZONTAL);
-    		gd2.horizontalSpan = 2;
-    		txtJSFServletName.setLayoutData(gd2);
-    
-    		lblJSFServletClassName = new Label(composite, SWT.NONE);
-    		lblJSFServletClassName
-    				.setText(Messages.JSFFacetInstallPage_JSFServletClassNameLabel);
-    		lblJSFServletClassName.setLayoutData(new GridData(GridData.BEGINNING));
-    
-    		txtJSFServletClassName = new Text(composite, SWT.BORDER);
-    		GridData gd2c = new GridData(GridData.FILL_HORIZONTAL);
-    		gd2c.horizontalSpan = 2;
-    		txtJSFServletClassName.setLayoutData(gd2c);
-    		
-    		lblJSFServletURLPatterns = new Label(composite, SWT.NULL);
-    		lblJSFServletURLPatterns
-    				.setText(Messages.JSFFacetInstallPage_JSFURLMappingLabel);
-    		lblJSFServletURLPatterns.setLayoutData(new GridData(GridData.BEGINNING
-    				| GridData.VERTICAL_ALIGN_BEGINNING));
-    		lstJSFServletURLPatterns = new List(composite, SWT.BORDER);
-    		GridData gd3 = new GridData(GridData.FILL_HORIZONTAL);
-    		gd3.heightHint = convertHeightInCharsToPixels(5);
-    		lstJSFServletURLPatterns.setLayoutData(gd3);
-    		lstJSFServletURLPatterns.addSelectionListener(new SelectionAdapter() {
-    			public void widgetSelected(SelectionEvent e) {
-    				btnRemovePattern.setEnabled(lstJSFServletURLPatterns
-    						.getSelectionCount() > 0);
-    			}
-    		});
-    
-    		Composite btnComposite = new Composite(composite, SWT.NONE);
-    		GridLayout gl = new GridLayout(1, false);
-    		// gl.marginBottom = 0;
-    		// gl.marginTop = 0;
-    		// gl.marginRight = 0;
-    		gl.marginLeft = 0;
-    		btnComposite.setLayout(gl);
-    		btnComposite.setLayoutData(new GridData(GridData.END
-    				| GridData.VERTICAL_ALIGN_FILL));
-    
-    		btnAddPattern = new Button(btnComposite, SWT.NONE);
-    		btnAddPattern.setText(Messages.JSFFacetInstallPage_Add2);
-    		btnAddPattern.setLayoutData(new GridData(GridData.FILL_HORIZONTAL
-    				| GridData.VERTICAL_ALIGN_BEGINNING));
-    		btnAddPattern.addSelectionListener(new SelectionAdapter() {
-    			public void widgetSelected(SelectionEvent e) {
-    				InputDialog dialog = new InputDialog(getShell(),
-    						Messages.JSFFacetInstallPage_PatternDialogTitle,
-    						Messages.JSFFacetInstallPage_PatternDialogDesc, null,
-    						new IInputValidator() {
-    
-    							public String isValid(String newText) {
-    								return isValidPattern(newText);
-    							}
-    
-    						});
-    				dialog.open();
-    				if (dialog.getReturnCode() == Window.OK) {
-    					addItemToList(dialog.getValue(), true);
-    				}
-    			}
-    		});
-    
-    		btnRemovePattern = new Button(btnComposite, SWT.NONE);
-    		btnRemovePattern.setText(Messages.JSFFacetInstallPage_Remove);
-    		btnRemovePattern.setLayoutData(new GridData(GridData.FILL_HORIZONTAL
-    				| GridData.VERTICAL_ALIGN_BEGINNING));
-    		btnRemovePattern.setEnabled(false);
-    		btnRemovePattern.addSelectionListener(new SelectionAdapter() {
-    			public void widgetSelected(SelectionEvent e) {
-    				removeItemFromList(lstJSFServletURLPatterns.getSelection());
-    				btnRemovePattern.setEnabled(false);
-    			}
-    		});
-    
-    		addModificationListeners();
-        }
-		
-		return composite;
-	}
-
-	private void initializeValues() {
-		IDialogSettings root = dialogSettings.getSection(SETTINGS_ROOT);
-
-		initJSFCfgCtrlValues(root);
-
-		String conf = null;
-		if (root != null)
-			conf = root.get(SETTINGS_CONFIG);
-		if (conf == null || conf.equals("")) { //$NON-NLS-1$
-			conf = (String) model
-					.getDefaultProperty(IJSFFacetInstallDataModelProperties.CONFIG_PATH);
-		}
-		txtJSFConfig.setText(conf);
-
-		String servletName = null;
-		if (root != null)
-			servletName = root.get(SETTINGS_SERVLET);
-		if (servletName == null || servletName.equals("")) { //$NON-NLS-1$
-			servletName = (String) model
-					.getDefaultProperty(IJSFFacetInstallDataModelProperties.SERVLET_NAME);
-		}
-		txtJSFServletName.setText(servletName);
-
-		String servletClassname = null;
-		if (root != null)
-			servletClassname = root.get(SETTINGS_SERVLET_CLASSNAME);
-		if (servletClassname == null || servletClassname.equals("")) { //$NON-NLS-1$
-			servletClassname = (String) model
-					.getDefaultProperty(IJSFFacetInstallDataModelProperties.SERVLET_CLASSNAME);
-		}
-		txtJSFServletClassName.setText(servletClassname);
-
-		loadURLMappingPatterns(root);
-	}
-
-	private void initJSFCfgCtrlValues(IDialogSettings root) {
-		/*IDialogSettings complibs = null;
-		if (root != null) {
-			complibs = root.getSection(SETTINGS_COMPLIB);
-		}
-
-		String[] selection = null;
-		if (complibs != null) {
-			selection = complibs.getArray(SETTINGS_COMPLIB_SELECT_DEPLOY);
-		}
-
-		JSFLibraryConfigDialogSettingData source = new JSFLibraryConfigDialogSettingData(selection);
-		jsfLibCfgComp.loadControlValuesFromModel(source);*/
-	}
-
-	
-	private void saveSettings() {
-		DialogSettings root = new DialogSettings(SETTINGS_ROOT);
-		dialogSettings.addSection(root);
-
-		root.put(SETTINGS_CONFIG, getJSFConfig());
-		root.put(SETTINGS_SERVLET, getJSFServletName());
-		root.put(SETTINGS_SERVLET_CLASSNAME, getJSFServletClassname());
-		DialogSettings mappings = new DialogSettings(SETTINGS_URL_MAPPINGS);
-		root.addSection(mappings);
-		mappings.put(SETTINGS_URL_PATTERN, getJSFPatterns());
-	}
-
-	private String getJSFConfig() {
-		return txtJSFConfig.getText().trim();
-	}
-
-	private String getJSFServletName() {
-		return txtJSFServletName.getText().trim();
-	}
-
-	private String getJSFServletClassname() {
-		return txtJSFServletClassName.getText().trim();
-	}
-	
-	private String[] getJSFPatterns() {
-		return lstJSFServletURLPatterns.getItems();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.project.facet.ui.IFacetWizardPage#setConfig(java.lang.Object)
-	 */
-	public void setConfig(Object config) {
-		model.removeListener(this);
-		synchHelper.dispose();
-
-		model = (IDataModel) config;
-		model.addListener(this);
-		synchHelper = initializeSynchHelper(model);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.project.facet.ui.IFacetWizardPage#transferStateToConfig()
-	 */
-	public void transferStateToConfig() {
-	    if (jsfFacetConfigurationEnabled)
-	    {
-    		saveSettings(); // convenient place for this. don't want to save if user
-    						// cancelled.
-	    }
-	}
-
-	private void addModificationListeners() {
-		 synchHelper.synchText(txtJSFConfig, CONFIG_PATH, null);
-		 synchHelper.synchText(txtJSFServletName, SERVLET_NAME, null);
-		 synchHelper.synchText(txtJSFServletClassName, SERVLET_CLASSNAME, null);
-		 synchHelper.synchList(lstJSFServletURLPatterns, SERVLET_URL_PATTERNS, null);
-	}
-
-	private String isValidPattern(String value) {
-		if (value == null || value.trim().equals("")) //$NON-NLS-1$
-			return Messages.JSFFacetInstallPage_PatternEmptyMsg;
-		if (lstJSFServletURLPatterns.indexOf(value) >= 0)
-			return Messages.JSFFacetInstallPage_PatternSpecifiedMsg;
-
-		return null;
-	}
-
-	private void loadURLMappingPatterns(IDialogSettings root) {
-		lstJSFServletURLPatterns.removeAll();
-		IDialogSettings mappings = null;
-		if (root != null)
-			mappings = root.getSection(SETTINGS_URL_MAPPINGS);
-		String[] patterns = null;
-		if (mappings != null)
-			patterns = mappings.getArray(SETTINGS_URL_PATTERN);
-
-		if (patterns == null || patterns.length == 0) {
-			patterns = (String[]) model
-					.getDefaultProperty(IJSFFacetInstallDataModelProperties.SERVLET_URL_PATTERNS);
-		}
-		for (int i = 0; i < patterns.length; i++) {
-			addItemToList(patterns[i], false);
-		}
-	}
-
-	private void addItemToList(String pattern, boolean selectMe) {
-		lstJSFServletURLPatterns.add(pattern == null ? "" : pattern); //$NON-NLS-1$
-		if (pattern == null && selectMe)
-			lstJSFServletURLPatterns.setSelection(lstJSFServletURLPatterns
-					.getItemCount() - 1);
-		// When 119321 is fixed - remove code below
-		updateModelForURLPattern();
-	}
-
-	private void removeItemFromList(String[] selection) {
-		for (int i = 0; i < selection.length; i++) {
-			String sel = selection[i];
-			lstJSFServletURLPatterns.remove(sel);
-		}
-		// When 119321 is fixed - remove code below
-		updateModelForURLPattern();
-	}
-
-	private void updateModelForURLPattern() {
-		model.setProperty(
-				IJSFFacetInstallDataModelProperties.SERVLET_URL_PATTERNS,
-				lstJSFServletURLPatterns.getItems());
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.frameworks.internal.datamodel.ui.DataModelWizardPage#getValidationPropertyNames()
-	 */
-	protected String[] getValidationPropertyNames() {
-
-	    if (jsfFacetConfigurationEnabled)
-	    {
-	        return new String[] { CONFIG_PATH, SERVLET_NAME, SERVLET_CLASSNAME, COMPONENT_LIBRARIES, LIBRARY_PROVIDER_DELEGATE };
-	    }
-	    
-        return new String[] { LIBRARY_PROVIDER_DELEGATE };
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.project.facet.ui.IFacetWizardPage#setWizardContext(org.eclipse.wst.common.project.facet.ui.IWizardContext)
-	 */
-	public void setWizardContext(IWizardContext context) {
-		// hook into web datamodel if new project wizard.
-		Iterator it = context.getSelectedProjectFacets().iterator();
-		IProjectFacetVersion webFacetVersion = null;
-		while (it.hasNext()) {
-			// find Web facet
-			IProjectFacetVersion pfv = (IProjectFacetVersion) it.next();
-			if (pfv.getProjectFacet().getId().equals("jst.web")) { //$NON-NLS-1$
-				webFacetVersion = pfv;
-				break;
-			}
-		}
-		if (webFacetVersion != null) {
-			try {
-				webAppDataModel = (IDataModel) context.getConfig(
-						webFacetVersion, IFacetedProject.Action.Type.INSTALL,
-						context.getProjectName());
-				if (webAppDataModel != null) {
-					webAppDataModel.addListener(this);
-				}
-			} catch (CoreException e) {
-				JSFUiPlugin.log(IStatus.ERROR,
-						Messages.JSFFacetInstallPage_ErrorNoWebAppDataModel, e);
-			}
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.frameworks.internal.datamodel.ui.DataModelWizardPage#propertyChanged(org.eclipse.wst.common.frameworks.datamodel.DataModelEvent)
-	 */
-	public void propertyChanged(DataModelEvent event) {
-		if (webAppDataModel != null) {
-			String propertyName = event.getPropertyName();
-			if (propertyName
-					.equals(IJ2EEModuleFacetInstallDataModelProperties.CONFIG_FOLDER)) {
-				model.setStringProperty(WEBCONTENT_DIR, event.getProperty()
-						.toString());
-			}
-		}
-		super.propertyChanged(event);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.frameworks.internal.datamodel.ui.DataModelWizardPage#dispose()
-	 */
-	public void dispose() {
-		if (webAppDataModel != null)
-			webAppDataModel.removeListener(this);
-		
-		//jsfLibCfgComp.dispose();
-		super.dispose();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.frameworks.internal.datamodel.ui.DataModelWizardPage#restoreDefaultSettings()
-	 */
-	protected void restoreDefaultSettings() {
-	    if (jsfFacetConfigurationEnabled)
-	    {
-	        initializeValues();
-	    }
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.frameworks.internal.datamodel.ui.DataModelWizardPage#showValidationErrorsOnEnter()
-	 */
-	protected boolean showValidationErrorsOnEnter() {
-		return true;
-	}
-
-
-    /**
-     * Fix for Bug Bug 300454: "Finish button in New Project wizard is enabled
-     * even if JSF facet does not have library information"
-     * https://bugs.eclipse.org/bugs/show_bug.cgi?id=300454
-     * 
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jface.wizard.WizardPage#isPageComplete()
-     */
-    @Override
-    public boolean isPageComplete()
-    {
-        final LibraryInstallDelegate librariesInstallDelegate = (LibraryInstallDelegate) getDataModel().getProperty(LIBRARY_PROVIDER_DELEGATE);
-        if (librariesInstallDelegate == null)
-            throw new IllegalArgumentException("LibraryInstallDelegate is expected to be non-null"); //$NON-NLS-1$
-
-        return super.isPageComplete() && (librariesInstallDelegate.validate().getSeverity() != IStatus.ERROR);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/project/facet/JSFLibraryPropertyPage.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/project/facet/JSFLibraryPropertyPage.java
deleted file mode 100644
index 518d46d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/project/facet/JSFLibraryPropertyPage.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package org.eclipse.jst.jsf.ui.internal.project.facet;
-
-import org.eclipse.jst.common.project.facet.ui.libprov.FacetLibraryPropertyPage;
-import org.eclipse.wst.common.project.facet.core.IFacetedProject;
-import org.eclipse.wst.common.project.facet.core.IProjectFacet;
-import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
-import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
-
-/**
- * TODO
- *
- */
-@SuppressWarnings("deprecation")
-public final class JSFLibraryPropertyPage
-
-    extends FacetLibraryPropertyPage
-    
-{
-    @Override
-    public IProjectFacetVersion getProjectFacetVersion()
-    {
-        final IProjectFacet jsfFacet = ProjectFacetsManager.getProjectFacet( "jst.jsf" ); //$NON-NLS-1$
-        final IFacetedProject fproj = getFacetedProject();
-        return fproj.getInstalledVersion( jsfFacet );
-    }
-    
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/tagregistry/ComponentDetailSubForm.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/tagregistry/ComponentDetailSubForm.java
deleted file mode 100644
index cc072c6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/tagregistry/ComponentDetailSubForm.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.ui.internal.tagregistry;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.jst.jsf.common.runtime.internal.model.component.ComponentTypeInfo;
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.IComponentTagElement;
-import org.eclipse.jst.jsf.common.ui.internal.form.AbstractXMLSectionsDetailsForm;
-import org.eclipse.jst.jsf.ui.internal.common.ViewObjectPresenter;
-import org.eclipse.swt.widgets.Composite;
-
-/**
- * Details page for component details.
- * 
- * @author cbateman
- * 
- */
-public class ComponentDetailSubForm extends AbstractXMLSectionsDetailsForm
-{
-    private final static String  COMPONENT_TYPE_SECTION_KEY = "componentSection"; //$NON-NLS-1$
-    private static final String INTERFACES_SECTION_KEY = "interfacesSection"; //$NON-NLS-1$
-    private XMLTextSection       _componentTypeSection;
-    private XMLTextSection       _interfacesSection;
-
-    @Override
-    protected Map<? extends Object, XMLTextSection> createXMLTextSections(Composite parent)
-    {
-        final Map<String, XMLTextSection> sections = new HashMap<String, XMLTextSection>();
-        _componentTypeSection = new XMLTextSection(getToolkit(), parent, Messages.ComponentDetailSubForm_TypeInfo);
-        sections.put(COMPONENT_TYPE_SECTION_KEY, _componentTypeSection);
-        
-        _interfacesSection = new XMLTextSection(getToolkit(), parent, Messages.ComponentDetailSubForm_InterfaceInfo);
-        sections.put(INTERFACES_SECTION_KEY, _interfacesSection);
-        return sections;
-    }
-
-
-    @Override
-    protected Set<XMLTextSection> getInitiallyExpanded(
-            Map<Object, XMLTextSection> sections)
-    {
-        return Collections.singleton(_componentTypeSection);
-    }
-
-
-    @Override
-    protected void doUpdateSelection(final Object newSelection)
-    {
-        if (newSelection instanceof IComponentTagElement)
-        {
-            final IComponentTagElement curTagElement = (IComponentTagElement) newSelection;
-            final ComponentTypeInfo typeInfo = curTagElement.getComponent();
-            if (typeInfo != null)
-            {
-                _componentTypeSection.setText(ViewObjectPresenter.present(typeInfo), true, false);
-                _interfacesSection.setText(ViewObjectPresenter.presentCompInterfaces(typeInfo, null), true, false);
-                _componentTypeSection.refresh();
-            }
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/tagregistry/ConverterDetailsForm.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/tagregistry/ConverterDetailsForm.java
deleted file mode 100644
index 6a97504..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/tagregistry/ConverterDetailsForm.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.ui.internal.tagregistry;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.jst.jsf.common.runtime.internal.model.decorator.ConverterTypeInfo;
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.IConverterTagElement;
-import org.eclipse.jst.jsf.common.ui.internal.form.AbstractXMLSectionsDetailsForm;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.widgets.Composite;
-
-/**
- * Details form for a converter tag.
- * 
- * @author cbateman
- *
- */
-public class ConverterDetailsForm extends AbstractXMLSectionsDetailsForm
-{
-    private final static String  CONVERTER_TYPE_SECTION_KEY = "converterSection"; //$NON-NLS-1$
-    private XMLTextSection       _converterTypeSection;
-
-    @Override
-    protected Map<? extends Object, XMLTextSection> createXMLTextSections(Composite parent)
-    {
-        final Map<String, XMLTextSection> sections = new HashMap<String, XMLTextSection>();
-        _converterTypeSection = new XMLTextSection(getToolkit(), parent, Messages.ConverterDetailsForm_ConverterInfo);
-        sections.put(CONVERTER_TYPE_SECTION_KEY, _converterTypeSection);
-        return sections;
-    }
-
-
-    @Override
-    protected Set<XMLTextSection> getInitiallyExpanded(
-            Map<Object, XMLTextSection> sections)
-    {
-        return Collections.singleton(_converterTypeSection);
-    }
-
-    @Override
-    protected void doUpdateSelection(Object newSelection)
-    {
-        if (newSelection instanceof IConverterTagElement)
-        {
-            IConverterTagElement converterTagElement = (IConverterTagElement) newSelection;
-            final ConverterTypeInfo typeInfo = converterTagElement.getConverter();
-
-            if (typeInfo != null)
-            {
-                final String className = typeInfo.getClassName();
-                final String converterId = typeInfo.getConverterId();
-
-                final String formatText = "<form><p><b>{0}</b> {1}</p>  <p><b>{2}</b> {3}</p></form>"; //$NON-NLS-1$
-                Object[] bindings = new String[4];
-                bindings[0] = Messages.ConverterDetailsForm_Class;
-                bindings[1] = className == null ? "" : className; //$NON-NLS-1$
-                bindings[2] = Messages.ConverterDetailsForm_Converterid;
-                bindings[3] = converterId == null ? "" : converterId; //$NON-NLS-1$
-                String text = NLS.bind(formatText, bindings);
-                _converterTypeSection.setText(text, true, false); 
-                
-                _converterTypeSection.refresh();
-            }
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/tagregistry/GenerateMetadataAction.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/tagregistry/GenerateMetadataAction.java
deleted file mode 100644
index 4374873..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/tagregistry/GenerateMetadataAction.java
+++ /dev/null
@@ -1,100 +0,0 @@
-package org.eclipse.jst.jsf.ui.internal.tagregistry;
-
-import java.io.IOException;
-import java.util.Collection;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jst.jsf.common.runtime.internal.model.types.ClassTypeInfo;
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.IComponentTagElement;
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.IConverterTagElement;
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.ITagElement;
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.IValidatorTagElement;
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.Namespace;
-import org.eclipse.jst.jsf.designtime.internal.view.mapping.ViewMetadataGenerator;
-
-/**
- * @author cbateman
- * 
- */
-class GenerateMetadataAction extends Action
-{
-    private Namespace _ns;
-
-    public GenerateMetadataAction()
-    {
-        super("Generate metadata"); //$NON-NLS-1$
-    }
-
-    public void setNamespace(final Namespace ns)
-    {
-        _ns = ns;
-    }
-
-    @Override
-    public void run()
-    {
-        if (_ns != null)
-        {
-            // create resource set and resource
-            final ViewMetadataGenerator generator = new ViewMetadataGenerator(_ns
-                    .getNSUri());
-            for (final ITagElement element : (Collection<? extends ITagElement>) _ns
-                    .getViewElements())
-            {
-                final String tagName = element.getName();
-                final ClassTypeInfo typeInfo = getTypeInfo(element);
-                if (typeInfo != null)
-                {
-                    generator.addTagToViewObjectMapping(tagName, typeInfo, null, null);
-                }
-            }
-
-            try
-            {
-                generator.save(System.out);
-            }
-            catch (final IOException e)
-            {
-                // TODO Auto-generated catch block
-                e.printStackTrace();
-            }
-            // final IProject project = (IProject) _viewer.getInput();
-            // final ITaglibDomainMetaDataModelContext modelContext =
-            // TaglibDomainMetaDataQueryHelper.createMetaDataModelContext(project,
-            // "http://java.sun.com/jsf/html");
-            // final Entity entity = TaglibDomainMetaDataQueryHelper.getEntity(
-            // modelContext, "outputText");
-            // if (entity != null)
-            // {
-            // final Trait trait = TaglibDomainMetaDataQueryHelper.getTrait(
-            // entity, "viewElementMapping");
-            // if (trait != null)
-            // {
-            // final TagToViewObjectMapping tagConstraint =
-            // (TagToViewObjectMapping) trait.getValue();
-            // System.err.println(tagConstraint.toString());
-            // }
-            // }
-
-        }
-    }
-
-    private ClassTypeInfo getTypeInfo(final ITagElement element)
-    {
-        ClassTypeInfo typeInfo = null;
-        if (element instanceof IComponentTagElement)
-        {
-            typeInfo = ((IComponentTagElement) element).getComponent();
-        }
-        else if (element instanceof IConverterTagElement)
-        {
-            typeInfo = ((IConverterTagElement) element).getConverter();
-        }
-        else if (element instanceof IValidatorTagElement)
-        {
-            typeInfo = ((IValidatorTagElement) element).getValidator();
-        }
-
-        return typeInfo;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/tagregistry/Messages.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/tagregistry/Messages.java
deleted file mode 100644
index 0852093..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/tagregistry/Messages.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.ui.internal.tagregistry;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * String resource handler	
- *
- */
-public class Messages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.jst.jsf.ui.internal.tagregistry.messages"; //$NON-NLS-1$
-	/**
-	 * see message.properties
-	 */
-	public static String ComponentDetailSubForm_InterfaceInfo;
-	/**
-	 * see message.properties
-	 */
-	public static String ComponentDetailSubForm_TypeInfo;
-	/**
-	 * see message.properties
-	 */
-	public static String ConverterDetailsForm_Class;
-	/**
-	 * see message.properties
-	 */
-	public static String ConverterDetailsForm_Converterid;
-	/**
-	 * see message.properties
-	 */
-	public static String ConverterDetailsForm_ConverterInfo;
-	/**
-	 * see message.properties
-	 */
-	public static String NamespaceDetailsForm_SectionLabel;
-	/**
-	 * see message.properties
-	 */
-	public static String NamespaceDetailsForm_SectionText;
-	/**
-	 * see message.properties
-	 */
-	public static String TaglibContentProvider_Calculating;
-	/**
-	 * see message.properties
-	 */
-	public static String TaglibContentProvider_JobDesc;
-	/**
-	 * see message.properties
-	 */
-	public static String TaglibContentProvider_NamespaceErrorDescription;
-	/**
-	 * see message.properties
-	 */
-	public static String TaglibContentProvider_NamespaceErrorTitle;
-	/**
-	 * see message.properties
-	 */
-	public static String TaglibContentProvider_TagCalculatingWaitMessage;
-	/**
-	 * see message.properties
-	 */
-	public static String TagRegistryDetailsForm_SectionText;
-	/**
-	 * see message.properties
-	 */
-	public static String TagRegistryDetailsForm_Namespace;
-	/**
-	 * see message.properties
-	 */
-	public static String TagRegistryMasterForm_FlushCacheMessage;
-	/**
-	 * see message.properties
-	 */
-	public static String TagRegistryMasterForm_FlushCacheQuestion;
-	/**
-	 * see message.properties
-	 */
-	public static String TagRegistryMasterForm_Project;
-	/**
-	 * see message.properties
-	 */
-	public static String TagRegistryMasterForm_RefreshRegistry;
-	/**
-	 * see message.properties
-	 */
-	public static String ValidatorDetailsForm_SectionLabel;
-	/**
-	 * see message.properties
-	 */
-	public static String ValidatorDetailsForm_SectionText;
-
-	static {
-		// initialize resource bundle
-		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/tagregistry/NamespaceDetailsForm.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/tagregistry/NamespaceDetailsForm.java
deleted file mode 100644
index a53b31c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/tagregistry/NamespaceDetailsForm.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.ui.internal.tagregistry;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.Namespace;
-import org.eclipse.jst.jsf.common.ui.internal.form.AbstractXMLSectionsDetailsForm;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.widgets.Composite;
-
-
-/**
- * Details form for a namespace
- * 
- * @author cbateman
- *
- */
-public class NamespaceDetailsForm extends AbstractXMLSectionsDetailsForm
-{
-    private final static String  NAMESPACE_SECTION_KEY = "namespaceSection"; //$NON-NLS-1$
-    private XMLTextSection       _namespaceSection;
-
-    @Override
-    protected Map<? extends Object, XMLTextSection> createXMLTextSections(Composite parent)
-    {
-        final Map<String, XMLTextSection> sections = new HashMap<String, XMLTextSection>();
-        _namespaceSection = new XMLTextSection(getToolkit(), parent, Messages.NamespaceDetailsForm_SectionLabel);
-        sections.put(NAMESPACE_SECTION_KEY, _namespaceSection);
-        return sections;
-    }
-
-    @Override
-    protected Set<XMLTextSection> getInitiallyExpanded(
-            Map<Object, XMLTextSection> sections)
-    {
-        return Collections.singleton(_namespaceSection);
-    }
-
-    @Override
-    protected void doUpdateSelection(Object newSelection)
-    {
-        if (newSelection instanceof Namespace)
-            
-        {
-            Namespace namespace = (Namespace) newSelection;
-
-            final String displayName = namespace.getDisplayName();
-            final String uri = namespace.getNSUri();
-
-            String namespaceSectionText = NLS.bind(Messages.NamespaceDetailsForm_SectionText, displayName == null ? "" : displayName, uri == null ? "" : uri ); //$NON-NLS-1$ //$NON-NLS-2$
-            
-            _namespaceSection.setText(namespaceSectionText, true, false);
-            _namespaceSection.refresh();
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/tagregistry/ProjectTracker.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/tagregistry/ProjectTracker.java
deleted file mode 100644
index 69fd1dc..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/tagregistry/ProjectTracker.java
+++ /dev/null
@@ -1,208 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.ui.internal.tagregistry;
-
-import java.util.HashSet;
-import java.util.Set;
-import java.util.concurrent.CopyOnWriteArrayList;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.jst.jsf.common.internal.resource.EventResult;
-import org.eclipse.jst.jsf.common.internal.resource.IResourceLifecycleListener;
-import org.eclipse.jst.jsf.common.internal.resource.LifecycleListener;
-import org.eclipse.jst.jsf.common.internal.resource.ResourceLifecycleEvent;
-import org.eclipse.jst.jsf.common.internal.resource.ResourceLifecycleEvent.EventType;
-import org.eclipse.jst.jsf.common.internal.resource.ResourceLifecycleEvent.ReasonType;
-import org.eclipse.jst.jsf.ui.internal.tagregistry.ProjectTracker.ProjectTrackingListener.Reason;
-
-/**
- * Tracks the active JSF projects in the workspace, maintaining a list of valid
- * projects and firing events when it changes
- * 
- * @author cbateman
- * 
- */
-class ProjectTracker
-{
-    private final IWorkspaceRoot                                _root;
-    private final LifecycleListener                             _lifecycleListener;
-    private final CopyOnWriteArrayList<ProjectTrackingListener> _myListeners;
-    private Set<IProject>                                       _validProjects;
-    private final ResourceChangeListener                        _resourceChangeListener;
-    private ProjectAdvisor                                      _projectAdvisor;
-
-    public ProjectTracker(final IWorkspaceRoot root, final ProjectAdvisor projectAdvisor)
-    {
-        _root = root;
-        _lifecycleListener = new LifecycleListener(ResourcesPlugin.getWorkspace());
-        _resourceChangeListener = new ResourceChangeListener();
-        _myListeners = new CopyOnWriteArrayList<ProjectTrackingListener>();
-        if (projectAdvisor != null)
-        {
-            _projectAdvisor = projectAdvisor;
-        }
-        else
-        {
-            _projectAdvisor = DEFAULT_ADVISOR;
-        }
-    }
-
-    public void startTracking()
-    {
-        _lifecycleListener.addResource(_root);
-
-        _validProjects = new HashSet<IProject>();
-
-        for (final IProject project : _root.getProjects())
-        {
-            if (_projectAdvisor.shouldTrack(project))
-            {
-                _validProjects.add(project);
-                _lifecycleListener.addResource(project);
-            }
-        }
-        // do this last, to ensure that any "simulataneous" events are handled
-        // by our listener only after everything is initialized.
-        _lifecycleListener.addListener(_resourceChangeListener);
-    }
-
-    public Set<IProject> getProjects()
-    {
-        final Set<IProject> projects = new HashSet<IProject>();
-        synchronized (this)
-        {
-            projects.addAll(_validProjects);
-        }
-        return projects;
-    }
-
-    private synchronized void addProject(final IProject project)
-    {
-        if (_projectAdvisor.shouldTrack(project))
-        {
-            synchronized (this)
-            {
-                _validProjects.add(project);
-                _lifecycleListener.addResource(project);
-            }
-            fireChangeEvent(project, Reason.ADDED);
-        }
-    }
-
-    private void removeProject(final IProject project)
-    {
-        synchronized (this)
-        {
-            _validProjects.remove(project);
-            _lifecycleListener.removeResource(project);
-        }
-        fireChangeEvent(project, Reason.REMOVED);
-    }
-
-    public void addListener(ProjectTrackingListener listener)
-    {
-        _myListeners.addIfAbsent(listener);
-    }
-
-    public void removeListener(ProjectTrackingListener listener)
-    {
-        _myListeners.remove(listener);
-    }
-
-    private void fireChangeEvent(final IProject project,
-            ProjectTrackingListener.Reason reason)
-    {
-        for (final ProjectTrackingListener listener : _myListeners)
-        {
-            listener.projectsChanged(project, reason);
-        }
-    }
-
-    public void dispose()
-    {
-        _lifecycleListener.dispose();
-        _validProjects.clear();
-        _myListeners.clear();
-    }
-
-    private class ResourceChangeListener implements IResourceLifecycleListener
-    {
-        public EventResult acceptEvent(final ResourceLifecycleEvent event)
-        {
-            final IResource res = event.getAffectedResource();
-
-            // only interested if is affecting one of my resources
-
-            // if the root is the source, check if a projected has been added
-            // or opened
-            if (event.getEventType() == EventType.RESOURCE_ADDED
-                    && event.getReasonType() == ReasonType.PROJECT_OPENED
-                    && res.getType() == IResource.PROJECT)
-            {
-                handleNewProject((IProject) res);
-            }
-            else if (_validProjects.contains(res)
-                    && event.getEventType() == EventType.RESOURCE_INACCESSIBLE)
-            {
-                handleProjectClosed((IProject) res);
-            }
-            return EventResult.getDefaultEventResult();
-        }
-
-        private void handleNewProject(final IProject project)
-        {
-            addProject(project);
-        }
-
-        private void handleProjectClosed(final IProject project)
-        {
-            removeProject(project);
-        }
-    }
-
-    public static class ProjectTrackingListener
-    {
-        public enum Reason
-        {
-            /**
-             * Reason for change is a project added
-             */
-            ADDED,
-            /**
-             * Reason for change is a project removed
-             */
-            REMOVED
-        }
-
-        protected void projectsChanged(final IProject project, Reason reason)
-        {
-            // do nothing by default
-        }
-    }
-
-    private static final ProjectAdvisor DEFAULT_ADVISOR = new ProjectAdvisor()
-                                                        {
-                                                            @Override
-                                                            public boolean shouldTrack(
-                                                                    IProject project)
-                                                            {
-                                                                return true;
-                                                            }
-                                                        };
-
-    public abstract static class ProjectAdvisor
-    {
-        public abstract boolean shouldTrack(final IProject project);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/tagregistry/SetInputRunnable.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/tagregistry/SetInputRunnable.java
deleted file mode 100644
index 251e11e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/tagregistry/SetInputRunnable.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-/**
- * 
- */
-package org.eclipse.jst.jsf.ui.internal.tagregistry;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.ui.PlatformUI;
-
-class SetInputRunnable implements Runnable
-{
-    private final Viewer   _viewer;
-    private final IProject _project;
-
-    public SetInputRunnable(IProject project, Viewer viewer)
-    {
-        super();
-        _project = project;
-        _viewer = viewer;
-    }
-
-    public void run()
-    {
-        PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable()
-        {
-            public void run()
-            {
-                _viewer.setInput(_project);
-            }
-        });
-    }
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/tagregistry/TagRegistryDetailsForm.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/tagregistry/TagRegistryDetailsForm.java
deleted file mode 100644
index 3dd6598..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/tagregistry/TagRegistryDetailsForm.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.ui.internal.tagregistry;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.core.runtime.content.IContentType;
-import org.eclipse.jst.jsf.common.ui.internal.form.AbstractXMLSectionsDetailsForm;
-import org.eclipse.jst.jsf.core.internal.ITagRegistryFactoryInfo;
-import org.eclipse.jst.jsf.ui.internal.tagregistry.TaglibContentProvider.TagRegistryInstance;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.widgets.Composite;
-
-/**
- * Details form for a tag registry
- * 
- * @author cbateman
- * 
- */
-public class TagRegistryDetailsForm extends AbstractXMLSectionsDetailsForm
-{
-    private final static String TAGREGISTRY_SECTION_KEY = "tagRegistrySection"; //$NON-NLS-1$
-    private XMLTextSection      _tagRegistrySection;
-
-    @Override
-    protected Map<? extends Object, XMLTextSection> createXMLTextSections(
-            final Composite parent)
-    {
-        final Map<String, XMLTextSection> sections = new HashMap<String, XMLTextSection>();
-        _tagRegistrySection = new XMLTextSection(getToolkit(), parent,
-                Messages.TagRegistryDetailsForm_Namespace);
-        sections.put(TAGREGISTRY_SECTION_KEY, _tagRegistrySection);
-        return sections;
-    }
-
-    @Override
-    protected Set<XMLTextSection> getInitiallyExpanded(
-            final Map<Object, XMLTextSection> sections)
-    {
-        return Collections.singleton(_tagRegistrySection);
-    }
-
-    @Override
-    protected void doUpdateSelection(final Object newSelection)
-    {
-        if (newSelection instanceof TagRegistryInstance)
-        {
-            final TagRegistryInstance tagRegistry = (TagRegistryInstance) newSelection;
-            final ITagRegistryFactoryInfo info = tagRegistry.getInfo();
-
-            if (info != null)
-            {
-                final String description = info.getDescription();
-                final String id = info.getId();
-                final Set<IContentType> contentTypes = info.getContentTypes();
-                String contentTypeLabel = ""; //$NON-NLS-1$
-                final Iterator<IContentType> it = contentTypes.iterator();
-                for (int i = 0; i < contentTypes.size() - 1 && it.hasNext(); i++)
-                {
-                    final IContentType ctype = it.next();
-                    contentTypeLabel += ctype.getName() + ","; //$NON-NLS-1$
-                }
-
-                if (it.hasNext())
-                {
-                    final IContentType ctype = it.next();
-                    contentTypeLabel += ctype.getName();
-                }
-                
-                String[] bindings = new String[3];
-                bindings[0] = description;
-                bindings[1] = id; 
-                bindings[2] = contentTypeLabel;
-                String text = NLS.bind(Messages.TagRegistryDetailsForm_SectionText, bindings);
-                _tagRegistrySection.setText(text, true, false);
-                
-                _tagRegistrySection.refresh();
-            }
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/tagregistry/TagRegistryMasterDetailBlock.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/tagregistry/TagRegistryMasterDetailBlock.java
deleted file mode 100644
index 3b91c75..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/tagregistry/TagRegistryMasterDetailBlock.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.ui.internal.tagregistry;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.IComponentTagElement;
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.IConverterTagElement;
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.IValidatorTagElement;
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.Namespace;
-import org.eclipse.jst.jsf.common.ui.internal.form.AbstractDetailsForm;
-import org.eclipse.jst.jsf.common.ui.internal.form.AbstractMasterDetailBlock;
-import org.eclipse.jst.jsf.common.ui.internal.form.AbstractMasterForm;
-import org.eclipse.jst.jsf.common.ui.internal.form.AbstractXMLSectionsDetailsForm;
-import org.eclipse.jst.jsf.ui.internal.tagregistry.TaglibContentProvider.TagRegistryInstance;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * A master-detail block for selecting items in a tag registry and examining
- * their details.
- * 
- * @author cbateman
- * 
- */
-public class TagRegistryMasterDetailBlock extends AbstractMasterDetailBlock
-{
-    ComponentDetailSubForm _componentDetails;
-    TagRegistryDetailsForm _tagRegistryDetails;
-    NamespaceDetailsForm   _namespaceDetails;
-    ConverterDetailsForm   _converterDetails;
-    ValidatorDetailsForm   _validatorDetails;
-
-
-    @Override
-    protected AbstractMasterForm createMasterPart(final FormToolkit toolkit)
-    {
-        return new TagRegistryMasterForm(toolkit);
-    }
-
-
-    @Override
-    protected final List<AbstractDetailsForm> createDetailPages()
-    {
-        final List<AbstractDetailsForm>  detailForms = new ArrayList<AbstractDetailsForm>();
-        _componentDetails = new ComponentDetailSubForm();
-        detailForms.add(_componentDetails);
-
-        _tagRegistryDetails = new TagRegistryDetailsForm();
-        detailForms.add(_tagRegistryDetails);
-
-        _namespaceDetails = new NamespaceDetailsForm();
-        detailForms.add(_namespaceDetails);
-
-        _converterDetails = new ConverterDetailsForm();
-        detailForms.add(_converterDetails);
-
-        _validatorDetails = new ValidatorDetailsForm();
-        detailForms.add(_validatorDetails);
-
-        return detailForms;
-    }
-
-
-    @Override
-    protected AbstractXMLSectionsDetailsForm doSelectPage(final Object forModel)
-    {
-        if (forModel instanceof IComponentTagElement)
-        {
-            return _componentDetails;
-        }
-        else if (forModel instanceof IConverterTagElement)
-        {
-            return _converterDetails;
-        }
-        else if (forModel instanceof IValidatorTagElement)
-        {
-            return _validatorDetails;
-        }
-        else if (forModel instanceof TagRegistryInstance)
-        {
-            return _tagRegistryDetails;
-        }
-        else if (forModel instanceof Namespace)
-        {
-            return _namespaceDetails;
-        }
-        return null;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/tagregistry/TagRegistryMasterForm.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/tagregistry/TagRegistryMasterForm.java
deleted file mode 100644
index a43c7aa..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/tagregistry/TagRegistryMasterForm.java
+++ /dev/null
@@ -1,506 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.ui.internal.tagregistry;
-
-import java.util.Set;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.jdt.ui.JavaUI;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IMenuListener;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.viewers.ComboViewer;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.viewers.ViewerSorter;
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.IComponentTagElement;
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.IConverterTagElement;
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.ITagAttribute;
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.ITagElement;
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.IValidatorTagElement;
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.Namespace;
-import org.eclipse.jst.jsf.common.ui.JSFUICommonPlugin;
-import org.eclipse.jst.jsf.common.ui.internal.form.AbstractMasterForm;
-import org.eclipse.jst.jsf.common.ui.internal.utils.JSFSharedImages;
-import org.eclipse.jst.jsf.core.jsfappconfig.JSFAppConfigUtils;
-import org.eclipse.jst.jsf.designtime.internal.view.model.ITagRegistry;
-import org.eclipse.jst.jsf.ui.internal.JSFUITraceOptions;
-import org.eclipse.jst.jsf.ui.internal.tagregistry.ProjectTracker.ProjectAdvisor;
-import org.eclipse.jst.jsf.ui.internal.tagregistry.ProjectTracker.ProjectTrackingListener;
-import org.eclipse.jst.jsf.ui.internal.tagregistry.TaglibContentProvider.TagRegistryInstance;
-import org.eclipse.jst.jsf.ui.internal.tagregistry.TaglibContentProvider.TreePlaceholder;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.Tree;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.model.BaseWorkbenchContentProvider;
-import org.eclipse.ui.model.IWorkbenchAdapter;
-import org.eclipse.ui.model.WorkbenchAdapter;
-import org.eclipse.ui.model.WorkbenchViewerComparator;
-
-/**
- * The master form in the master/detail block for tag registry. Used to display
- * a tree view of each tag registy on the currently selected project and its
- * contents.
- * 
- * @author cbateman
- * 
- */
-public class TagRegistryMasterForm extends AbstractMasterForm
-{
-    private static final String REFRESH_NAV_IMAGE_FILE = "refresh_nav_16.gif"; //$NON-NLS-1$
-    
-	private TreeViewer           _registryTreeViewer;
-    // private Action _selectProjectAction;
-    private Action               _refreshAction;
-
-    private final ProjectTracker _projectTracker;
-    private final ProjectAdvisor _advisor;
-    private GenerateMetadataAction _generateMetadataAction;
-
-    /**
-     * @param toolkit
-     */
-    public TagRegistryMasterForm(final FormToolkit toolkit)
-    {
-        super(toolkit);
-        _advisor = new ProjectAdvisor()
-        {
-            @Override
-            public boolean shouldTrack(final IProject project)
-            {
-                return JSFAppConfigUtils.isValidJSFProject(project);
-            }
-        };
-
-        _projectTracker = new ProjectTracker(ResourcesPlugin.getWorkspace()
-                .getRoot(), _advisor);
-    }
-
-    /**
-     * @param parent
-     * @return the contents main control
-     */
-    @Override
-    public Control createClientArea(final Composite parent)
-    {
-        final Tree tree = getToolkit().createTree(parent,
-                SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL);
-
-        final GridData gridData = new GridData(SWT.FILL, SWT.CENTER, true, true);
-        tree.setLayoutData(gridData);
-        _registryTreeViewer = new TreeViewer(tree);
-        // _drillDownAdapter = new DrillDownAdapter(_viewer);
-        _registryTreeViewer.setContentProvider(new TaglibContentProvider());
-        _registryTreeViewer.setLabelProvider(new CommonLabelProvider());
-        _registryTreeViewer.setSorter(new NameSorter());
-
-        PlatformUI.getWorkbench().getHelpSystem()
-                .setHelp(_registryTreeViewer.getControl(),
-                        "ViewHandlerPrototype.viewer"); //$NON-NLS-1$
-
-        _projectTracker.addListener(new ProjectTrackingListener()
-        {
-            @Override
-            protected void projectsChanged(final IProject project,
-                    final Reason reason)
-            {
-                switch (reason)
-                {
-                    case ADDED:
-                    {
-                        // nothing to do, since new project can't be selected
-                        // yet
-                    }
-                    case REMOVED:
-                    {
-                        // if the removed project is the one that is current
-                        // update the treeviewer
-                        if (project.equals(_registryTreeViewer.getInput()))
-                        {
-                            updateProjects();
-                        }
-                    }
-                }
-            }
-        });
-
-        _registryTreeViewer
-                .addSelectionChangedListener(new ISelectionChangedListener()
-                {
-
-                    public void selectionChanged(
-                            final SelectionChangedEvent event)
-                    {
-                        getListener().selectionChanged(event);
-                        updateActions(event.getSelection());
-                    }
-                });
-        makeActions();
-        createContextMenuManager(_registryTreeViewer.getControl());
-        return tree;
-    }
-
-    /**
-     * dispose of the master form
-     */
-    @Override
-    public void dispose()
-    {
-        _projectTracker.dispose();
-    }
-
-    private void updateProjects()
-    {
-        final Set<IProject> projects = _projectTracker.getProjects();
-
-        for (final IProject project : projects)
-        {
-            new SetInputRunnable(project, _registryTreeViewer).run();
-            break;
-        }
-    }
-
-    @Override
-    protected final void contributeActions(IToolBarManager formManager,
-            IToolBarManager localManager)
-    {
-        // do nothing to the manager; we have our own toolbar
-
-        // contribute to local tool bar
-        localManager.add(_refreshAction);
-        localManager.update(false);
-    }
-
-    /**
-     */
-    @Override
-    protected void contributeToHeadArea(final FormToolkit toolkit,
-            final Composite container)
-    {
-        final Label label = new Label(container, SWT.NONE);
-        label.setText(Messages.TagRegistryMasterForm_Project);
-        final ComboViewer combo = new ComboViewer(container, SWT.FLAT
-                | SWT.READ_ONLY);
-        getToolkit().adapt(combo.getControl(), true, false);
-        combo.addSelectionChangedListener(new ISelectionChangedListener()
-        {
-            public void selectionChanged(SelectionChangedEvent event)
-            {
-                IStructuredSelection selection = (IStructuredSelection) event
-                        .getSelection();
-
-                final IProject selectedProject = (IProject) selection
-                        .getFirstElement();
-                _registryTreeViewer.setInput(selectedProject);
-            }
-        });
-        combo.setLabelProvider(new CommonLabelProvider());
-        combo.setContentProvider(new ProjectContentProvider());
-        combo.setComparator(new WorkbenchViewerComparator());
-        combo.setInput(_projectTracker);
-        _projectTracker.addListener(new ProjectTrackingListener()
-        {
-            @Override
-            protected void projectsChanged(IProject project, Reason reason)
-            {
-                combo.getControl().getDisplay().asyncExec(new Runnable()
-                {
-                    public void run()
-                    {
-                        combo.refresh();
-                    }
-                });
-            }
-        });
-    }
-
-    /**
-     */
-    @Override
-    public void doInitialize()
-    {
-        _projectTracker.startTracking();
-    }
-
-    private void makeActions()
-    {
-        if (_registryTreeViewer == null)
-        {
-            throw new IllegalStateException(
-                    "_registryTreeViewer must be initialized before calling makeActions"); //$NON-NLS-1$
-        }
-        _refreshAction = new RefreshAction(_registryTreeViewer);
-        _refreshAction.setText(Messages.TagRegistryMasterForm_RefreshRegistry);
-        _refreshAction.setToolTipText(Messages.TagRegistryMasterForm_RefreshRegistry);
-        _refreshAction.setImageDescriptor(JSFUICommonPlugin.getDefault()
-                .getImageDescriptor(REFRESH_NAV_IMAGE_FILE));
-        
-        if (JSFUITraceOptions.TRACE_METADATAGEN)
-        {
-            _generateMetadataAction = new GenerateMetadataAction();
-        }
-    }
-
-    private void createContextMenuManager(final Control control)
-    {
-        // Create menu manager.
-        MenuManager menuMgr = new MenuManager();
-           menuMgr.setRemoveAllWhenShown(true);
-           menuMgr.addMenuListener(new IMenuListener() {
-                   public void menuAboutToShow(IMenuManager mgr) {
-                           fillContextMenu(mgr);
-                   }
-           });
-           
-           // Create menu.
-        Menu menu = menuMgr.createContextMenu(control);
-           control.setMenu(menu);
-           
-           // Register menu for extension.
-        //getSite().registerContextMenu(menuMgr, viewer);
-    }
-    
-    private void fillContextMenu(IMenuManager mgr)
-    {
-        if (JSFUITraceOptions.TRACE_METADATAGEN)
-        {
-            mgr.add(_generateMetadataAction);
-        }
-    }
-    
-    private void updateActions(final ISelection selection)
-    {
-        if (JSFUITraceOptions.TRACE_METADATAGEN)
-        {
-            updateMetadataGenAction(selection);
-        }
-    }
-
-    private void updateMetadataGenAction(final ISelection selection)
-    {
-        if (selection instanceof IStructuredSelection)
-        {
-            if (((IStructuredSelection)selection).getFirstElement() instanceof Namespace)
-            {
-                Namespace ns =  (Namespace) ((IStructuredSelection)selection).getFirstElement();
-                _generateMetadataAction.setNamespace(ns);
-                _generateMetadataAction.setEnabled(true);
-                return;
-            }
-        }
-        _generateMetadataAction.setEnabled(false);
-    }
-    
-    private static class RefreshAction extends Action
-    {
-        private final StructuredViewer _viewer;
-
-        /**
-         * @param viewer
-         */
-        private RefreshAction(final StructuredViewer viewer)
-        {
-            super();
-            _viewer = viewer;
-            setEnabled(false);
-            _viewer.addSelectionChangedListener(new ISelectionChangedListener()
-            {
-                public void selectionChanged(SelectionChangedEvent event)
-                {
-                    boolean enabled = false;
-                    final Object selectedObj = getSelected(event.getSelection());
-                    if (selectedObj instanceof TagRegistryInstance)
-                    {
-                        enabled = true;
-                    }
-                    setEnabled(enabled);
-                }
-            });
-        }
-
-        @Override
-        public void run()
-        {
-            MessageDialog dialog = new MessageDialog(_viewer.getControl().getShell(), Messages.TagRegistryMasterForm_FlushCacheQuestion, null, // accept
-                    // the
-                    // default
-                    // window
-                    // icon
-                    Messages.TagRegistryMasterForm_FlushCacheMessage
-                    , MessageDialog.QUESTION, new String[] { IDialogConstants.YES_LABEL,
-                            IDialogConstants.NO_LABEL }, 1); // no is the
-                                                                // default
-            final boolean flushCaches =  (dialog.open() == 0);
-            final Object selectedObj = getSelected(_viewer.getSelection());
-
-            if (selectedObj instanceof TagRegistryInstance)
-            {
-                final TagRegistryInstance registryInstance = (TagRegistryInstance) selectedObj;
-                final ITagRegistry registry = registryInstance.getRegistry();
-                if (registry != null)
-                {
-                    // need a non-null runnable so that refresh won't block,
-                    // but don't need to fire events, since the registry will
-                    // fire events on change.
-                    final Runnable nullRunnable = new Runnable()
-                    {
-                        public void run()
-                        {/* do nothing */
-                        }
-                    };
-
-                    registry.refresh(nullRunnable, flushCaches);
-                }
-            }
-        }
-
-        private Object getSelected(ISelection selection)
-        {
-            if (selection instanceof IStructuredSelection)
-            {
-                final IStructuredSelection structuredSel = (IStructuredSelection) selection;
-                if (structuredSel.size() == 1)
-                {
-                    return structuredSel.getFirstElement();
-                }
-            }
-            return null;
-        }
-    }
-
-    private static class ProjectContentProvider extends
-            BaseWorkbenchContentProvider
-    {
-        @Override
-        protected IWorkbenchAdapter getAdapter(final Object element)
-        {
-            return new WorkbenchAdapter()
-            {
-                @Override
-                public Object[] getChildren(final Object object)
-                {
-                    if (object instanceof ProjectTracker)
-                    {
-                        return ((ProjectTracker) object).getProjects()
-                                .toArray();
-                    }
-                    return new Object[0];
-                }
-            };
-        }
-    }
-
-    private static class CommonLabelProvider extends LabelProvider
-    {
-        private static final String CONFIGS_IMAGE_FILE = "configs.gif"; //$NON-NLS-1$
-
-		@Override
-        public String getText(final Object obj)
-        {
-            if (obj instanceof TagRegistryInstance)
-            {
-                return ((TagRegistryInstance) obj).getInfo().getDescription();
-            }
-            else if (obj instanceof Namespace)
-            {
-                if (((Namespace) obj).getDisplayName() != null)
-                {
-                    return ((Namespace) obj).getDisplayName();
-                }
-                return ((Namespace) obj).getNSUri();
-            }
-            else if (obj instanceof ITagElement)
-            {
-                return ((ITagElement) obj).getName();
-            }
-            else if (obj instanceof ITagAttribute)
-            {
-                return ((ITagAttribute)obj).getName();
-            }
-            else if (obj instanceof TreePlaceholder)
-            {
-                return ((TreePlaceholder) obj).getText();
-            }
-            else if (obj instanceof IProject)
-            {
-                return ((IProject) obj).getName();
-            }
-            return obj.toString();
-        }
-
-        @Override
-        public Image getImage(final Object obj)
-        {
-            if (obj instanceof Namespace)
-            {
-                return JavaUI.getSharedImages().getImage(
-                        org.eclipse.jdt.ui.ISharedImages.IMG_OBJS_LIBRARY);
-            }
-            else if (obj instanceof TagRegistryInstance)
-            {
-                final String imageKey = ISharedImages.IMG_OBJ_FOLDER;
-                return PlatformUI.getWorkbench().getSharedImages().getImage(
-                        imageKey);
-            }
-            else if (obj instanceof ITagElement)
-            {
-                if (obj instanceof IComponentTagElement)
-                {
-                    return JSFUICommonPlugin.getDefault().getImage(
-                            JSFSharedImages.GENERIC_OBJECT_IMG);
-                }
-                else if (obj instanceof IConverterTagElement)
-                {
-                    return JSFUICommonPlugin.getDefault().getImage(
-                            JSFSharedImages.GENERIC_CONVERTER_IMG);
-                }
-                else if (obj instanceof IValidatorTagElement)
-                {
-                    return JSFUICommonPlugin.getDefault().getImage(
-                            JSFSharedImages.GENERIC_VALIDATOR_IMG);
-                }
-                return JSFUICommonPlugin.getDefault().getImage(
-                        JSFSharedImages.DEFAULT_PALETTE_TAG_IMG);
-            }
-            else if (obj instanceof TreePlaceholder)
-            {
-                return JSFUICommonPlugin.getDefault().getImage(CONFIGS_IMAGE_FILE);
-            }
-
-            final String imageKey = ISharedImages.IMG_OBJ_ELEMENT;
-            return PlatformUI.getWorkbench().getSharedImages().getImage(
-                    imageKey);
-        }
-    }
-
-    class NameSorter extends ViewerSorter
-    {
-        // do nothing
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/tagregistry/TagRegistryView.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/tagregistry/TagRegistryView.java
deleted file mode 100644
index 83d7339..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/tagregistry/TagRegistryView.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.ui.internal.tagregistry;
-
-import org.eclipse.jst.jsf.ui.internal.JSFUiPlugin;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.IViewSite;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.forms.widgets.Form;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.part.ViewPart;
-
-/**
- * This sample class demonstrates how to plug-in a new workbench view. The view
- * shows data obtained from the model. The sample creates a dummy model on the
- * fly, but a real implementation would connect to the model available either in
- * this or another plug-in (e.g. the workspace). The view is connected to the
- * model using a content provider.
- * <p>
- * The view uses a label provider to define how model objects should be
- * presented in the view. Each view can present the same model objects using
- * different labels and icons, if needed. Alternatively, a single label provider
- * can be shared between views in order to ensure that objects of the same type
- * are presented in the same way everywhere.
- * <p>
- */
-
-public class TagRegistryView extends ViewPart
-{
-    private static final String LIBRARY_OBJ_IMAGE_FILE = "obj16/library_obj.gif"; //$NON-NLS-1$
-	private FormToolkit _toolkit;
-    private Form _form;
-    private TagRegistryMasterDetailBlock _masterDetailBlock;
-
-    /**
-     * The constructor.
-     */
-    public TagRegistryView()
-    {
-        // do nothing
-    }
-
-    @Override
-    public void init(IViewSite site) throws PartInitException
-    {
-        super.init(site);
-        setTitleImage(JSFUiPlugin.getDefault().getImage(LIBRARY_OBJ_IMAGE_FILE));
-    }
-
-    /**
-     * This is a callback that will allow us to create the viewer and initialize
-     * it.
-     */
-    @Override
-    public void createPartControl(final Composite parent)
-    {
-        _toolkit = new FormToolkit(parent.getDisplay());
-
-        _form = _toolkit.createForm(parent);
-        _form.setLayoutData(new  GridData(SWT.FILL, SWT.FILL, true,true));
-        _masterDetailBlock =
-            new TagRegistryMasterDetailBlock();
-        _masterDetailBlock.createContent(_toolkit,_form);
-    }
-
-    
-
-    @Override
-    public void dispose()
-    {
-        if (_masterDetailBlock != null)
-        {
-            _masterDetailBlock.dispose();
-            _masterDetailBlock = null;
-        }
-        super.dispose();
-    }
-
-    /**
-     * Passing the focus request to the viewer's control.
-     */
-    @Override
-    public void setFocus()
-    {
-        _form.setFocus();
-    }
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/tagregistry/TaglibContentProvider.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/tagregistry/TaglibContentProvider.java
deleted file mode 100644
index 3233462..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/tagregistry/TaglibContentProvider.java
+++ /dev/null
@@ -1,455 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.ui.internal.tagregistry;
-
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.atomic.AtomicLong;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.ITagAttribute;
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.ITagElement;
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.Namespace;
-import org.eclipse.jst.jsf.core.internal.CompositeTagRegistryFactory;
-import org.eclipse.jst.jsf.core.internal.ITagRegistryFactoryInfo;
-import org.eclipse.jst.jsf.designtime.internal.view.model.ITagRegistry;
-import org.eclipse.jst.jsf.designtime.internal.view.model.ITagRegistry.TagRegistryChangeEvent;
-import org.eclipse.jst.jsf.designtime.internal.view.model.ITagRegistry.TagRegistryChangeEvent.EventType;
-import org.eclipse.jst.jsf.designtime.internal.view.model.TagRegistryFactory;
-import org.eclipse.jst.jsf.designtime.internal.view.model.TagRegistryFactory.TagRegistryFactoryException;
-import org.eclipse.jst.jsf.ui.internal.JSFUiPlugin;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * Structured content provider for tag libraries.
- * 
- * @author cbateman
- * 
- */
-public class TaglibContentProvider implements IStructuredContentProvider,
-        ITreeContentProvider, ITagRegistry.ITagRegistryListener
-{
-    private final static Object[]                                     NO_CHILDREN       = new Object[0];
-    private IProject                                                  _curInput;
-    private Map<ITagRegistry, TagRegistryInstance>                    _curTagRegistries = 
-        new HashMap<ITagRegistry, TagRegistryInstance>();
-    private Viewer                                                    _curViewer;
-    private final AtomicLong                                          _changeStamp      = new AtomicLong(
-                                                                                                0);
-
-    public Object[] getElements(final Object inputElement)
-    {
-
-        if (inputElement instanceof IProject)
-        {
-            return _curTagRegistries.values().toArray();
-            // return _rootNamespaces.values().toArray();
-        }
-
-        return NO_CHILDREN;
-    }
-
-    public void dispose()
-    {
-        // nothing to do
-    }
-
-    public void inputChanged(final Viewer viewer, final Object oldInput,
-            final Object newInput)
-    {
-        // update our change stamp to invalid outstanding update tasks
-        _changeStamp.incrementAndGet();
-        _curViewer = viewer;
-
-        if (oldInput instanceof IProject)
-        {
-            for (final TagRegistryInstance tagRegistry : _curTagRegistries.values())
-            {
-                tagRegistry.getRegistry().removeListener(this);
-            }
-        }
-
-        if (newInput instanceof IProject)
-        {
-            _curInput = (IProject) newInput;
-
-            final Set<ITagRegistryFactoryInfo> factories = CompositeTagRegistryFactory
-                    .getInstance().getAllTagRegistryFactories();
-
-            _curTagRegistries.clear();
-
-            for (ITagRegistryFactoryInfo factoryInfo : factories)
-            {
-                TagRegistryFactory factory = factoryInfo
-                        .getTagRegistryFactory();
-                ITagRegistry registry;
-                try
-                {
-                    registry = factory.createTagRegistry(_curInput);
-                    if (registry != null)
-                    {
-                        final TagRegistryInstance registryInstance =
-                            new TagRegistryInstance(factoryInfo, registry);
-                        _curTagRegistries.put(registry, registryInstance);
-                        registry.addListener(this);
-                        
-                        new UpdateNamespacesListJob(_curInput, _changeStamp.get(), 
-                                registryInstance).schedule();
-                    }
-                }
-                catch (TagRegistryFactoryException e)
-                {
-                    JSFUiPlugin.log(IStatus.ERROR,
-                            "Problem getting tag registry", e); //$NON-NLS-1$
-                }
-            }
-        }
-        else
-        {
-            _curInput = null;
-            _curTagRegistries.clear();
-        }
-    }
-
-    public Object[] getChildren(final Object parentElement)
-    {
-        if (parentElement instanceof IProject)
-        {
-            return _curTagRegistries.values().toArray();
-        }
-        else if (parentElement instanceof TagRegistryInstance)
-        {
-            final TagRegistryInstance regInstance = (TagRegistryInstance) parentElement;
-            
-            if (!regInstance.isUpToDate())
-            {
-                return new Object[] {new TreePlaceholder(Messages.TaglibContentProvider_Calculating, null)};
-            }
-            return regInstance.getNamespaces().values().toArray();
-        }
-        else if (parentElement instanceof Namespace)
-        {
-            final Namespace ns = (Namespace) parentElement;
-
-            // this could be very expensive if not initialized
-            if (ns.isInitialized())
-            {
-                return ((Namespace) parentElement).getViewElements().toArray();
-            }
-
-            // fire up a job that ensures the namespace is initialized
-            // and then fires refresh again on this element
-            final Job updateNamespaceJob = new Job(Messages.TaglibContentProvider_JobDesc)
-            {
-                @Override
-                protected IStatus run(final IProgressMonitor monitor)
-                {
-                    ns.getViewElements();
-                    PlatformUI.getWorkbench().getDisplay().asyncExec(
-                            new Runnable()
-                            {
-                                public void run()
-                                {
-                                    // avoid infinite recursion
-                                    if (ns.isInitialized())
-                                    {
-                                        TaglibContentProvider.this
-                                                .viewerRefresh(ns);
-                                    }
-                                    else
-                                    {
-                                        MessageDialog
-                                                .openError(
-                                                        Display
-                                                                .getCurrent()
-                                                                .getActiveShell(),
-                                                        Messages.TaglibContentProvider_NamespaceErrorTitle,
-                                                        Messages.TaglibContentProvider_NamespaceErrorDescription);
-                                    }
-                                }
-                            });
-                    return Status.OK_STATUS;
-                }
-            };
-
-            updateNamespaceJob.schedule();
-
-            return new Object[]
-            { new TreePlaceholder(Messages.TaglibContentProvider_TagCalculatingWaitMessage, null) };
-        }
-        else if (parentElement instanceof ITagElement)
-        {
-            final Map<String, ? extends ITagAttribute> attributes = ((ITagElement)parentElement).getAttributes();
-            if (attributes != null)
-            {
-                return attributes.values().toArray();
-            }
-        }
-        return NO_CHILDREN;
-    }
-
-    public Object getParent(final Object element)
-    {
-        // no support for parent traversal right now
-        return null;
-    }
-
-    public boolean hasChildren(final Object element)
-    {
-        // avoid an infinite refresh loop on the namespaces in the tag registry
-        if (element instanceof TagRegistryInstance)
-        {
-            return true;
-        }
-        // finding all children of a namespace can be expensive
-        else if (element instanceof Namespace)
-        {
-            return ((Namespace) element).hasViewElements();
-        }
-        return getChildren(element).length > 0;
-    }
-
-    public void registryChanged(final TagRegistryChangeEvent changeEvent)
-    {
-        if (_curViewer != null)
-        {
-            TagRegistryInstance registryInstance =
-                _curTagRegistries.get(changeEvent.getSource());
-            
-            if (registryInstance != null)
-            {
-                _curViewer.getControl().getDisplay().asyncExec(
-                        new RegistryChangeTask(changeEvent.getType(), changeEvent
-                                .getAffectedObjects(), _changeStamp.get(),registryInstance));
-            }
-        }
-    }
-
-    private final class RegistryChangeTask implements Runnable
-    {
-        private final EventType                 _eventType;
-        private final long                      _timestamp;
-        private final List<? extends Namespace> _affectedObjects;
-        private final TagRegistryInstance       _registryInstance;
-
-        RegistryChangeTask(final TagRegistryChangeEvent.EventType eventType,
-                final List<? extends Namespace> affectedObjects,
-                final long timestamp, final TagRegistryInstance registryInstance)
-        {
-            _eventType = eventType;
-            _timestamp = timestamp;
-            _affectedObjects = affectedObjects;
-            _registryInstance = registryInstance;
-        }
-
-        public void run()
-        {
-            // if changes have been made since this task was queued, then abort
-            // since we don't know if our data is still valid
-            if (_timestamp != TaglibContentProvider.this._changeStamp.get())
-            {
-                return;
-            }
-
-            switch (_eventType)
-            {
-                case ADDED_NAMESPACE:
-                case CHANGED_NAMESPACE:
-                {
-                    for (final Namespace ns : _affectedObjects)
-                    {
-                        _registryInstance.getNamespaces().put(ns.getNSUri(), ns);
-                    }
-
-                    viewerRefresh(_curInput);
-                }
-                break;
-
-                case REMOVED_NAMESPACE:
-                {
-                    for (final Namespace ns : _affectedObjects)
-                    {
-                        _registryInstance.getNamespaces().remove(ns.getNSUri());
-                    }
-                    viewerRefresh(_curInput);
-                }
-                break;
-
-                case REGISTRY_DISPOSED:
-                {
-                    _registryInstance.getRegistry().removeListener(TaglibContentProvider.this);
-                    _curTagRegistries.remove(_registryInstance);
-                    viewerRefresh(_curInput);
-                }
-            }
-        }
-    }
-
-    private void viewerRefresh(final Object parentElement)
-    {
-        if (_curViewer instanceof StructuredViewer)
-        {
-            final StructuredViewer viewer = (StructuredViewer) _curViewer;
-            viewer.refresh(parentElement);
-        }
-        else
-        {
-            _curViewer.refresh();
-        }
-    }
-
-    private class UpdateNamespacesListJob extends Job
-    {
-
-        private final long                _timestamp;
-        private final IProject            _project;
-        private final TagRegistryInstance _registry;
-
-        public UpdateNamespacesListJob(final IProject project,
-                final long timestamp, final TagRegistryInstance registry)
-        {
-            super("Updating available namespaces for project " //$NON-NLS-1$
-                    + project.getName());
-            _project = project;
-            _timestamp = timestamp;
-            _registry = registry;
-        }
-
-        @Override
-        protected IStatus run(final IProgressMonitor monitor)
-        {
-            if (!_project.isAccessible()
-                    || _registry.isUpToDate())
-            {
-                return new Status(IStatus.CANCEL, JSFUiPlugin.PLUGIN_ID, ""); //$NON-NLS-1$
-            }
-
-            final Collection<? extends Namespace> libs = _registry.getRegistry()
-                    .getAllTagLibraries();
-            _registry.getNamespaces().clear();
-
-            for (Namespace ns : libs)
-            {
-                if (ns.getNSUri() != null)
-                {
-                    _registry.getNamespaces().put(ns.getNSUri(), ns);
-
-                }
-            }
-
-            _registry.setUpToDate(true);
-            PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable()
-            {
-                public void run()
-                {
-                    // only bother if the provider hasn't changed asynchronously
-                    if (_timestamp == TaglibContentProvider.this._changeStamp
-                            .get())
-                    {
-                        viewerRefresh(_curInput);
-                    }
-                }
-            });
-
-            return Status.OK_STATUS;
-        }
-    }
-
-    static class TagRegistryInstance
-    {
-        private final ITagRegistryFactoryInfo        _info;
-        private final ITagRegistry                  _registry;
-        private final Map<String, Namespace>        _namespaces;
-        private boolean                             _isUpToDate;
-
-        public TagRegistryInstance(final ITagRegistryFactoryInfo info,
-                ITagRegistry registry)
-        {
-            _info = info;
-            _registry = registry;
-            _namespaces = new ConcurrentHashMap<String, Namespace>();
-        }
-
-        public ITagRegistryFactoryInfo getInfo()
-        {
-            return _info;
-        }
-
-        public ITagRegistry getRegistry()
-        {
-            return _registry;
-        }
-
-        public Map<String, Namespace> getNamespaces()
-        {
-            return _namespaces;
-        }
-
-        public synchronized boolean isUpToDate()
-        {
-            return _isUpToDate;
-        }
-
-        public synchronized void setUpToDate(boolean isUpToDate)
-        {
-            _isUpToDate = isUpToDate;
-        }
-    }
-
-    /**
-     * Takes the place of a real tree model object while the real object is
-     * being retrieved.
-     * 
-     */
-    public static class TreePlaceholder
-    {
-        private final String _text;
-        private final Image  _image;
-
-        TreePlaceholder(final String text, final Image image)
-        {
-            _text = text;
-            _image = image;
-        }
-
-        /**
-         * @return the placeholder text or null if none
-         */
-        public String getText()
-        {
-            return _text;
-        }
-
-        /**
-         * @return the image or null if none
-         */
-        public Image getImage()
-        {
-            return _image;
-        }
-
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/tagregistry/ValidatorDetailsForm.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/tagregistry/ValidatorDetailsForm.java
deleted file mode 100644
index f6d69ae..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/tagregistry/ValidatorDetailsForm.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.ui.internal.tagregistry;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.jst.jsf.common.runtime.internal.model.decorator.ValidatorTypeInfo;
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.IValidatorTagElement;
-import org.eclipse.jst.jsf.common.ui.internal.form.AbstractXMLSectionsDetailsForm;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.widgets.Composite;
-
-/**
- * Details form for validator tags.
- * @author cbateman
- *
- */
-public class ValidatorDetailsForm extends AbstractXMLSectionsDetailsForm
-{
-    private final static String  VALIDATOR_TYPE_SECTION_KEY = "validatorSection"; //$NON-NLS-1$
-    private XMLTextSection       _validatorTypeSection;
-
-    @Override
-    protected Map<? extends Object, XMLTextSection> createXMLTextSections(Composite parent)
-    {
-        final Map<String, XMLTextSection> sections = new HashMap<String, XMLTextSection>();
-        _validatorTypeSection = new XMLTextSection(getToolkit(), parent, Messages.ValidatorDetailsForm_SectionLabel);
-        sections.put(VALIDATOR_TYPE_SECTION_KEY, _validatorTypeSection);
-        return sections;
-    }
-
-
-    @Override
-    protected Set<XMLTextSection> getInitiallyExpanded(
-            Map<Object, XMLTextSection> sections)
-    {
-        return Collections.singleton(_validatorTypeSection);
-    }
-
-    @Override
-    protected void doUpdateSelection(Object newSelection)
-    {
-        if (newSelection instanceof IValidatorTagElement)
-        {
-            IValidatorTagElement validatorTagElement = (IValidatorTagElement) newSelection;
-            final ValidatorTypeInfo typeInfo = validatorTagElement.getValidator();
-
-            if (typeInfo != null)
-            {
-                final String className = typeInfo.getClassName();
-                final String validatorId = typeInfo.getValidatorId();
-
-                String text = NLS.bind(Messages.ValidatorDetailsForm_SectionText, className == null ? "" : className, validatorId == null ? "" : validatorId); //$NON-NLS-1$ //$NON-NLS-2$
-                _validatorTypeSection.setText(text, true, false); 
-
-                _validatorTypeSection.refresh();
-            }
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/tagregistry/messages.properties b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/tagregistry/messages.properties
deleted file mode 100644
index 6ce15e2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/tagregistry/messages.properties
+++ /dev/null
@@ -1,20 +0,0 @@
-ComponentDetailSubForm_InterfaceInfo=Interface Information
-ComponentDetailSubForm_TypeInfo=Component Type Information
-ConverterDetailsForm_Class=Class:
-ConverterDetailsForm_Converterid=Converter Id:
-ConverterDetailsForm_ConverterInfo=Converter Type Information
-NamespaceDetailsForm_SectionLabel=Namespace
-NamespaceDetailsForm_SectionText=<form><p><b>Name: </b> {0}</p> <p><b>Uri: </b> {1}</p></form>
-TaglibContentProvider_Calculating=Calculating...
-TaglibContentProvider_JobDesc=Updating namespace
-TaglibContentProvider_NamespaceErrorDescription=There was a problem initializing the namespace
-TaglibContentProvider_NamespaceErrorTitle=Error updating namespace
-TaglibContentProvider_TagCalculatingWaitMessage=Calculating tags, please wait...
-TagRegistryDetailsForm_SectionText=<form><p><b>Description: </b> {0}</p> <p><b>Id: </b> {1}</p> <p><b>Content-Types:</b> {2}</p></form>
-TagRegistryDetailsForm_Namespace=Namespace
-TagRegistryMasterForm_FlushCacheMessage=Flushing cached data may cause some operations to slow until cached information is regenerated.  If you answer no, the view will refresh but NOT flush cached data
-TagRegistryMasterForm_FlushCacheQuestion=Also flush cached data?
-TagRegistryMasterForm_Project=Project: 
-TagRegistryMasterForm_RefreshRegistry=Refresh Registry
-ValidatorDetailsForm_SectionLabel=Validator Type Information
-ValidatorDetailsForm_SectionText=<form><p><b>Class: </b> {0}</p>  <p><b>Validator Id: </b> {1}</p></form>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/validation/ELPrefPanel.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/validation/ELPrefPanel.java
deleted file mode 100644
index b81fa6a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/validation/ELPrefPanel.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.ui.internal.validation;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jst.jsf.core.internal.CompositeJSFPreferenceModel;
-import org.eclipse.jst.jsf.core.internal.IJSFPreferenceModel;
-import org.eclipse.jst.jsf.ui.internal.Messages;
-import org.eclipse.jst.jsf.validation.internal.ValidationPreferences;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.RowLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.ui.preferences.IWorkbenchPreferenceContainer;
-
-/**
- * Creates and manages a panel for configuring 
- * 
- * @author cbateman
- */
-/*package*/ class ELPrefPanel 
-{
-    /* view */
-    private final Group                                 _container;
-    private final Button                                _chkBuildValidation;
-    private final Button                                _chkIncrementalValidation;
-    private final ProblemSeveritiesConfigurationBlock   _problemSeverities;
-    
-    /* model */
-    private final ValidationPreferences  _prefs;
-    
-    /**
-     * Allocates new container in parent.
-     * @param parent
-     * @param container 
-     * @param prefs 
-     */
-    public ELPrefPanel(Composite parent, IWorkbenchPreferenceContainer container, ValidationPreferences prefs)
-    {
-        _prefs = prefs;
-
-        _container = new Group(parent, SWT.NONE);
-        _container.setText(Messages.JSFValidationPreferencePage_ELPrefPanel_Title);
-        RowLayout rowLayout = new RowLayout(SWT.VERTICAL);
-        rowLayout.marginTop = 5;
-        rowLayout.marginLeft = 5; 
-        _container.setLayout(rowLayout);
-
-        _chkBuildValidation = new Button(_container, SWT.CHECK);
-        _chkBuildValidation.setText(Messages.JSFValidationPreferencePage_ELPrefPanel_BuildValidationCheckBoxTitle);
-        _chkBuildValidation.addSelectionListener(new SelectionAdapter()
-        {
-            public void widgetSelected(SelectionEvent e) 
-            {
-                _prefs.getElPrefs().setEnableBuildValidation(_chkBuildValidation.getSelection());
-                refresh();
-            }
-        });
-        
-        _chkIncrementalValidation = new Button(_container, SWT.CHECK);
-        _chkIncrementalValidation.setText(Messages.JSFValidationPreferencePage_ELPrefPanel_IncrementalValidationCheckBoxTitle);
-        _chkIncrementalValidation.addSelectionListener(new SelectionAdapter()
-        {
-            public void widgetSelected(SelectionEvent e) 
-            {
-                _prefs.getElPrefs().setEnableIncrementalValidation(_chkIncrementalValidation.getSelection());
-                refresh();
-            }
-        });
-
-        new Label(_container, SWT.NONE);
-        
-        final List<IJSFPreferenceModel> models = new ArrayList<IJSFPreferenceModel>();
-        models.add(_prefs.getElPrefs());
-        models.add(_prefs.getTypeComparatorPrefs());
-        final IJSFPreferenceModel compositeModel = new CompositeJSFPreferenceModel(
-                models);
-
-        _problemSeverities = new ProblemSeveritiesConfigurationBlock(compositeModel, null, container);
-        _problemSeverities.createContents(_container);
-    }
-    
-    /**
-     * @return the top-level container managed by this panel
-     */
-    public Control getControl()
-    {
-        return _container;
-    }
-    
-    
-    /**
-     * Refreshes the UI from the model
-     */
-    public void refresh()
-    {
-        _chkBuildValidation.setSelection(_prefs.getElPrefs().isEnableBuildValidation());
-        _chkIncrementalValidation.
-            setSelection(_prefs.getElPrefs().isEnableIncrementalValidation());
-        _problemSeverities.updateControls();
-    }
-
-    /**
-     * 
-     */
-    public void processChanges() {
-        _problemSeverities.performOk();
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/validation/JSFValidationPreferencePage.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/validation/JSFValidationPreferencePage.java
deleted file mode 100644
index 4200f79..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/validation/JSFValidationPreferencePage.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.ui.internal.validation;
-
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.preference.PreferencePage;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.validation.internal.ValidationPreferences;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPreferencePage;
-import org.eclipse.ui.preferences.IWorkbenchPreferenceContainer;
-
-/**
- * Workbench preference page for configuring JSF validation
- * 
- * @author cbateman
- *
- */
-public class JSFValidationPreferencePage extends PreferencePage implements
-        IWorkbenchPreferencePage 
-{
-    private final ValidationPreferences     _prefs;
-    
-    private ELPrefPanel                     _elPrefPanel;
-    
-    /**
-     * Constructor
-     */
-    public JSFValidationPreferencePage()
-    {
-        super(/* TODO: title*/);
-        _prefs = new ValidationPreferences(getPreferenceStore());
-        _prefs.load();
-    }
-    
-    protected Control createContents(Composite parent)
-    {
-        _elPrefPanel = new ELPrefPanel(parent,
-                (IWorkbenchPreferenceContainer) getContainer(), _prefs);
-        _elPrefPanel.refresh();
-        return _elPrefPanel.getControl();
-    }
-
-    public void init(IWorkbench workbench) 
-    {
-        // do nothing
-    }
-
-    protected void performApply() 
-    {
-        // process changes before committing to pref store
-        _elPrefPanel.processChanges();
-        _prefs.commit(getPreferenceStore());
-    }
-
-    protected void performDefaults() 
-    {
-        _prefs.setDefaults();
-        _elPrefPanel.refresh();
-        super.performDefaults();
-    }
-
-    public boolean performOk() 
-    {
-        performApply();
-        return true;
-    }
-
-    protected IPreferenceStore doGetPreferenceStore() 
-    {
-        // load the validation pref store
-        return JSFCorePlugin.getDefault().getPreferenceStore();
-    }
-    
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/validation/JSFValidator.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/validation/JSFValidator.java
deleted file mode 100644
index 53583df..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/validation/JSFValidator.java
+++ /dev/null
@@ -1,198 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.ui.internal.validation;
-
-import java.io.IOException;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.IRegion;
-import org.eclipse.jst.jsf.common.internal.JSPUtil;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.core.jsfappconfig.JSFAppConfigUtils;
-import org.eclipse.jst.jsf.validation.internal.IJSFViewValidator;
-import org.eclipse.jst.jsf.validation.internal.JSFValidatorFactory;
-import org.eclipse.jst.jsf.validation.internal.ValidationPreferences;
-import org.eclipse.jst.jsp.core.internal.validation.JSPValidator;
-import org.eclipse.wst.sse.core.StructuredModelManager;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
-import org.eclipse.wst.sse.ui.internal.reconcile.validator.ISourceValidator;
-import org.eclipse.wst.validation.internal.provisional.core.IReporter;
-import org.eclipse.wst.validation.internal.provisional.core.IValidationContext;
-
-/**
- * @author cbateman
- *
- */
-public class JSFValidator extends JSPValidator implements ISourceValidator
-{
-    // TODO: should the source validator be a separate class in jsp.ui?
-    // problem with simple split off is that preference must also be split off
-    static final boolean DEBUG;
-    static
-    {
-        final String value = Platform
-        .getDebugOption("org.eclipse.jst.jsf.ui/validation"); //$NON-NLS-1$
-        DEBUG = value != null && value.equalsIgnoreCase("true"); //$NON-NLS-1$
-    }
-
-    private IDocument    fDocument;
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.wst.sse.ui.internal.reconcile.validator.ISourceValidator#connect(org.eclipse.jface.text.IDocument)
-     */
-    public void connect(final IDocument document)
-    {
-        fDocument = document;
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.wst.sse.ui.internal.reconcile.validator.ISourceValidator#disconnect(org.eclipse.jface.text.IDocument)
-     */
-    public void disconnect(final IDocument document)
-    {
-        // finished
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.wst.sse.ui.internal.reconcile.validator.ISourceValidator#validate(org.eclipse.jface.text.IRegion,
-     *      org.eclipse.wst.validation.internal.provisional.core.IValidationContext,
-     *      org.eclipse.wst.validation.internal.provisional.core.IReporter)
-     */
-    public void validate(final IRegion dirtyRegion,
-            final IValidationContext helper, final IReporter reporter)
-    {
-        if (DEBUG)
-        {
-            System.out.println("exec JSPSemanticsValidator.validateRegion"); //$NON-NLS-1$
-        }
-
-        final IFile file = getFile(helper);
-
-        if (fDocument instanceof IStructuredDocument
-                && file != null)
-        {
-            final IStructuredDocument sDoc = (IStructuredDocument) fDocument;
-            final IStructuredDocumentRegion[] regions = sDoc
-            .getStructuredDocumentRegions(dirtyRegion.getOffset(),
-                    dirtyRegion.getLength());
-            if (regions != null)
-            {
-                final IJSFViewValidator validator = JSFValidatorFactory
-                        .createDefaultXMLValidator();
-                final ValidationPreferences prefs = new ValidationPreferences(
-                        JSFCorePlugin.getDefault().getPreferenceStore());
-                prefs.load();
-
-                IStructuredModel model = null;
-                try
-                {
-                    model = StructuredModelManager.getModelManager().getModelForRead(
-                            file);
-
-                    final ValidationReporter jsfReporter = new ValidationReporter(
-                            this, reporter, file, prefs, model);
-                    validator.validateView(file, regions, jsfReporter);
-                }
-                catch (final CoreException e)
-                {
-                    JSFCorePlugin.log("Error validating JSF", e); //$NON-NLS-1$
-                }
-                catch (final IOException e)
-                {
-                    JSFCorePlugin.log("Error validating JSF", e); //$NON-NLS-1$
-                }
-                finally
-                {
-                    if (null != model)
-                    {
-                        model.releaseFromRead();
-                    }
-                }
-            }
-        }
-    }
-
-    private IFile getFile(final IValidationContext helper)
-    {
-        final String[] uris = helper.getURIs();
-        final IWorkspaceRoot wsRoot = ResourcesPlugin.getWorkspace().getRoot();
-        if (uris.length > 0)
-        {
-            return wsRoot.getFile(new Path(uris[0]));
-        }
-        return null;
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jst.jsp.core.internal.validation.JSPValidator#validateFile(org.eclipse.core.resources.IFile,
-     *      org.eclipse.wst.validation.internal.provisional.core.IReporter)
-     */
-    @Override
-    protected void validateFile(final IFile file, final IReporter reporter)
-    {
-        if (shouldValidate(file))
-        {
-             final IJSFViewValidator validator = JSFValidatorFactory
-                    .createDefaultXMLValidator();
-            final ValidationPreferences prefs = new ValidationPreferences(
-                    JSFCorePlugin.getDefault().getPreferenceStore());
-            prefs.load();
-    
-            IStructuredModel model = null;
-            try
-            {
-                model = StructuredModelManager.getModelManager().getModelForRead(
-                        file);
-
-                final ValidationReporter jsfReporter = new ValidationReporter(this,
-                        reporter, file, prefs, model);
-                validator.validateView(file, jsfReporter);
-            }
-            catch (final CoreException e)
-            {
-                JSFCorePlugin.log("Error validating JSF", e); //$NON-NLS-1$
-            }
-            catch (final IOException e)
-            {
-                JSFCorePlugin.log("Error validating JSF", e); //$NON-NLS-1$
-            }
-            finally
-            {
-                if (null != model)
-                {
-                    model.releaseFromRead();
-                }
-            }
-        }
-    }
-
-    private boolean shouldValidate(final IFile file)
-    {
-        return (JSPUtil.isJSPContentType(file)
-                && JSFAppConfigUtils.isValidJSFProject(file.getProject()));
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/validation/Messages.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/validation/Messages.java
deleted file mode 100644
index 57c5df6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/validation/Messages.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.ui.internal.validation;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * String resource handler
- *
- */
-public class Messages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.jst.jsf.ui.internal.validation.messages"; //$NON-NLS-1$
-	/**
-	 * see messages.properties
-	 */
-	public static String ValidationMessageFactory_DefaultElSeverityDisplayName;
-	/**
-	 * see messages.properties
-	 */
-	public static String ValidationMessageFactory_DefaultTypeComparatorDisplayName;
-	/**
-	 * see messages.properties
-	 */
-	public static String ValidationMessageFactory_DefaultFaceletSeverityDisplayName;
-	static {
-		// initialize resource bundle
-		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/validation/MyLocalizedMessage.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/validation/MyLocalizedMessage.java
deleted file mode 100644
index f479a0f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/validation/MyLocalizedMessage.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.ui.internal.validation;
-
-import java.util.Locale;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.wst.validation.internal.core.Message;
-
-/**
- * EL customized localizable validation message
- * @author cbateman
- *
- */
-class MyLocalizedMessage extends Message
-{
-	private final String _message;
-	private final int	 _errorCode;
-
-	/**
-	 * @param severity
-	 * @param messageText
-	 * @param targetObject
-	 * @param errorCode 
-	 */
-	public MyLocalizedMessage(int severity, String messageText, IResource targetObject, int errorCode) {
-		this(severity, messageText, (Object) targetObject, errorCode);
-	}
-
-	/**
-	 * @param severity
-	 * @param messageText
-	 * @param targetObject
-	 * @param errorCode 
-	 */
-	private MyLocalizedMessage(int severity, String messageText, Object targetObject, int errorCode) {
-		super(JSFCorePlugin.getDefault().getBundle().getSymbolicName(), severity, 
-                messageText);
-		_message = messageText;
-		setTargetObject(targetObject);
-		_errorCode = errorCode;
-	}
-
-	/**
-	 * @return the localized message
-	 */
-	public String getLocalizedMessage() {
-		return _message;
-	}
-
-	/**
-	 * @see org.eclipse.wst.validation.internal.core.Message#getText()
-	 */
-	public String getText() {
-		return getLocalizedMessage();
-	}
-
-	/**
-	 * @see org.eclipse.wst.validation.internal.core.Message#getText(java.lang.ClassLoader)
-	 */
-	public String getText(ClassLoader cl) {
-		return getLocalizedMessage();
-	}
-
-	/**
-	 * @see org.eclipse.wst.validation.internal.core.Message#getText(java.util.Locale)
-	 */
-	public String getText(Locale l) {
-		return getLocalizedMessage();
-	}
-
-	public String getText(Locale l, ClassLoader cl) {
-		return getLocalizedMessage();
-	}
-
-	/**
-	 * @return the error code related to this message
-	 */
-	public int getErrorCode() {
-		return _errorCode;
-	}
-
-
-	/**
-	 * @param offset
-	 * @return true if this message applies to document offset
-	 */
-	public boolean appliesTo(int offset)
-	{
-		return (offset >= getOffset() && offset < getOffset()+getLength());
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/validation/OptionsConfigurationBlock.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/validation/OptionsConfigurationBlock.java
deleted file mode 100644
index 6824b36..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/validation/OptionsConfigurationBlock.java
+++ /dev/null
@@ -1,979 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Cameron Bateman/Oracle - adapted for use in JSF validation tooling
- *******************************************************************************/
-package org.eclipse.jst.jsf.ui.internal.validation;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.IdentityHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.StringTokenizer;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.ProjectScope;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.preferences.DefaultScope;
-import org.eclipse.core.runtime.preferences.IScopeContext;
-import org.eclipse.core.runtime.preferences.InstanceScope;
-import org.eclipse.jdt.ui.JavaUI;
-import org.eclipse.jface.dialogs.IDialogSettings;
-import org.eclipse.jface.dialogs.MessageDialogWithToggle;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.jst.jsf.core.internal.IJSFPreferenceModel;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.ui.internal.JSFUiPlugin;
-import org.eclipse.jst.jsf.validation.internal.Severity;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Link;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.swt.widgets.Widget;
-import org.eclipse.ui.forms.events.ExpansionAdapter;
-import org.eclipse.ui.forms.events.ExpansionEvent;
-import org.eclipse.ui.forms.widgets.ExpandableComposite;
-import org.eclipse.ui.preferences.IWorkbenchPreferenceContainer;
-import org.eclipse.ui.preferences.IWorkingCopyManager;
-import org.eclipse.ui.preferences.WorkingCopyManager;
-import org.osgi.service.prefs.BackingStoreException;
-
-/**
- * Abstract options configuration block providing a general implementation for setting up
- * an options configuration page.
- * 
- * @since 2.1
- */
-abstract class OptionsConfigurationBlock 
-{
-    /**
-     * The preference model to be used
-     */
-    protected final IJSFPreferenceModel     _prefs;
-    
-    static final class Key 
-    {
-        private String fQualifier;
-        private String fKey;
-        
-        Key(String qualifier, String key) {
-            fQualifier= qualifier;
-            fKey= key;
-        }
-        
-        /**
-         * @return the key name
-         */
-        public String getName() {
-            return fKey;
-        }
-        
-//        private IEclipsePreferences getNode(IScopeContext context, IWorkingCopyManager manager) {
-//            IEclipsePreferences node= context.getNode(fQualifier);
-//            if (manager != null) {
-//                return manager.getWorkingCopy(node);
-//            }
-//            return node;
-//            
-//        }
-        
-        /**
-         * @param prefModel
-         * @param context
-         * @param manager
-         * @return the value stored for the key
-         */
-        public Object getStoredValue(IJSFPreferenceModel prefModel, IScopeContext context, IWorkingCopyManager manager)
-        {
-            return prefModel.getStoredValueByKey(context, fKey);
-        }
-        
-        /**
-         * @param prefModel
-         * @param context
-         * @param manager
-         * @return the stored value in prefModel under context for
-         * this key
-         */
-        public Object getCurValue(IJSFPreferenceModel prefModel, IScopeContext context, IWorkingCopyManager manager) {
-            //return getNode(context, manager).get(fKey, null);
-            return prefModel.getValueByKey(context, fKey);
-        }
-        
-        /**
-         * @param prefModel
-         * @param lookupOrder
-         * @param ignoreTopScope
-         * @param manager
-         * @return the stored value in the prefModelunder context
-         * using the list of lookupOrder for precedence of scopes
-         * in which to look.  Return first found based on order in lookupOrder
-         */
-        public Object getCurValue(IJSFPreferenceModel prefModel, IScopeContext[] lookupOrder, boolean ignoreTopScope, IWorkingCopyManager manager) {
-            for (int i= ignoreTopScope ? 1 : 0; i < lookupOrder.length; i++) {
-                Object value= getCurValue(prefModel, lookupOrder[i], manager);
-                if (value != null) {
-                    return value;
-                }
-            }
-            return null;
-        }
-        
-        /**
-         * Set the stored value
-         * @param prefModel 
-         * @param context
-         * @param value
-         * @param manager
-         * @return the old value or null if none
-         */
-        public Object setCurValue(IJSFPreferenceModel prefModel, IScopeContext context, Object value, IWorkingCopyManager manager) {
-            return prefModel.setValueByKey(context, fKey, value);
-//            if (value != null) {
-//                getNode(context, manager).put(fKey, value);
-//            } else {
-//                getNode(context, manager).remove(fKey);
-//            }
-        }
-            
-        /* (non-Javadoc)
-         * @see java.lang.Object#toString()
-         */
-        public String toString() {
-            return fQualifier + '/' + fKey;
-        }
-
-        /**
-         * @return the plugin qualifier
-         */
-        public String getQualifier() {
-            return fQualifier;
-        }
-
-    }
-    
-
-    static class ControlData {
-        private Key fKey;
-        private String[] fValues;
-        
-        ControlData(Key key, String[] values) {
-            fKey= key;
-            fValues= values;
-        }
-        
-        Key getKey() {
-            return fKey;
-        }
-        
-        String getValue(boolean selection) {
-            int index= selection ? 0 : 1;
-            return fValues[index];
-        }
-        
-        String getValue(int index) {
-            return fValues[index];
-        }       
-        
-        int getSelection(String value) {
-            if (value != null) {
-                for (int i= 0; i < fValues.length; i++) {
-                    if (value.equals(fValues[i])) {
-                        return i;
-                    }
-                }
-            }
-            return fValues.length -1; // assume the last option is the least severe
-        }
-    }
-    
-    private static final String REBUILD_COUNT_KEY= "preferences_build_requested"; //$NON-NLS-1$
-    
-    private static final String SETTINGS_EXPANDED= "expanded"; //$NON-NLS-1$
-
-    private final ArrayList fCheckBoxes;
-    private final ArrayList fComboBoxes;
-    private final ArrayList fTextBoxes;
-    private final HashMap fLabels;
-    private final ArrayList fExpandedComposites;
-    
-    private SelectionListener fSelectionListener;
-    private ModifyListener fTextModifyListener;
-
-    // TODO: protected IStatusChangeListener fContext;
-    private final IProject fProject; // project or null
-    private final Key[] fAllKeys;
-    
-    private IScopeContext[] fLookupOrder;
-    
-    private Shell fShell;
-
-    private final IWorkingCopyManager fManager;
-    private IWorkbenchPreferenceContainer fContainer;
-
-    private Map fDisabledProjectSettings; // null when project specific settings are turned off
-    
-    private int fRebuildCount; /// used to prevent multiple dialogs that ask for a rebuild
-    
-    OptionsConfigurationBlock(/*IStatusChangeListener context,*/IJSFPreferenceModel prefs, IProject project, Key[] allKeys, IWorkbenchPreferenceContainer container) {
-        //fContext= context;
-        fProject= project;
-        fAllKeys= allKeys;
-        fContainer= container;
-        _prefs = prefs;
-        
-        if (container == null) {
-            fManager= new WorkingCopyManager();
-        } else {
-            fManager= container.getWorkingCopyManager();
-        }
-        
-        if (fProject != null) {
-            fLookupOrder= new IScopeContext[] {
-                new ProjectScope(fProject),
-                new InstanceScope(),
-                new DefaultScope()
-            };
-        } else {
-            fLookupOrder= new IScopeContext[] {
-                new InstanceScope(),
-                new DefaultScope()
-            };
-        }
-        
-        testIfOptionsComplete(allKeys);
-        if (fProject == null || hasProjectSpecificOptions(fProject)) {
-            fDisabledProjectSettings= null;
-        } else {
-            fDisabledProjectSettings= new IdentityHashMap();
-            for (int i= 0; i < allKeys.length; i++) {
-                Key curr= allKeys[i];
-                fDisabledProjectSettings.put(curr, curr.getCurValue(_prefs, fLookupOrder, false, fManager));
-            }
-        }
-        
-        fCheckBoxes= new ArrayList();
-        fComboBoxes= new ArrayList();
-        fTextBoxes= new ArrayList(2);
-        fLabels= new HashMap();
-        fExpandedComposites= new ArrayList();
-        
-        fRebuildCount= getRebuildCount();
-    }   
-    
-    /**
-     * @return the preference container
-     */
-    protected final IWorkbenchPreferenceContainer getPreferenceContainer() {
-        return fContainer;
-    }
-    
-    /**
-     * @param plugin
-     * @param key
-     * @return construct a new Key based on the on the plugin id and
-     * preference key
-     */
-    protected static Key getKey(String plugin, String key) {
-        return new Key(plugin, key);
-    }
-    
-    /**
-     * @param key
-     * @return construct a new Key for a JSF core plugin preference
-     */
-    protected final static Key getJSFCoreKey(String key) {
-        return getKey(JSFCorePlugin.PLUGIN_ID, key);
-    }
-    
-    private void testIfOptionsComplete(Key[] allKeys) {
-        for (int i= 0; i < allKeys.length; i++) {
-            if (allKeys[i].getCurValue(_prefs, fLookupOrder, false, fManager) == null) {
-                JSFUiPlugin.log(IStatus.ERROR, "preference option missing: " + allKeys[i] + " (" + this.getClass().getName() +')');  //$NON-NLS-1$//$NON-NLS-2$
-            }
-        }
-    }
-    
-    private int getRebuildCount() {
-        return fManager.getWorkingCopy(new DefaultScope().getNode(JavaUI.ID_PLUGIN)).getInt(REBUILD_COUNT_KEY, 0);
-    }
-    
-    private void incrementRebuildCount() {
-        fRebuildCount++;
-        fManager.getWorkingCopy(new DefaultScope().getNode(JavaUI.ID_PLUGIN)).putInt(REBUILD_COUNT_KEY, fRebuildCount);
-    }
-    
-//    public void selectOption(String key, String qualifier) {
-//        for (int i= 0; i < fAllKeys.length; i++) {
-//            Key curr= fAllKeys[i];
-//            if (curr.getName().equals(key) && curr.getQualifier().equals(qualifier)) {
-//                selectOption(curr);
-//            }
-//        }
-//    }
-//    
-//    public void selectOption(Key key) {
-//        Control control= findControl(key);
-//        if (control != null) {
-//            if (!fExpandedComposites.isEmpty()) {
-//                ExpandableComposite expandable= getParentExpandableComposite(control);
-//                if (expandable != null) {
-//                    for (int i= 0; i < fExpandedComposites.size(); i++) {
-//                        ExpandableComposite curr= (ExpandableComposite) fExpandedComposites.get(i);
-//                        curr.setExpanded(curr == expandable);
-//                    }
-//                    expandedStateChanged(expandable);
-//                }
-//            }
-//            control.setFocus();
-//        }
-//    }
-    
-    
-    /**
-     * @param project
-     * @return true if there are project specific overrides in the 
-     * preferences for 'project'
-     */
-    public final boolean hasProjectSpecificOptions(IProject project) {
-        if (project != null) {
-            IScopeContext projectContext= new ProjectScope(project);
-            Key[] allKeys= fAllKeys;
-            for (int i= 0; i < allKeys.length; i++) {
-                if (allKeys[i].getCurValue(_prefs, projectContext, fManager) != null) {
-                    return true;
-                }
-            }
-        }
-        return false;
-    }   
-            
-    /**
-     * @return the shell hosting the UI
-     */
-    protected Shell getShell() {
-        return fShell;
-    }
-    
-    /**
-     * Set the shell hosting the UI.
-     * @param shell
-     */
-    protected void setShell(Shell shell) {
-        fShell= shell;
-    }   
-    
-    /**
-     * @param parent
-     * @return the parent of the UI control to be created
-     */
-    protected abstract Control createContents(Composite parent);
-    
-//    protected Button addCheckBox(Composite parent, String label, Key key, String[] values, int indent) {
-//        ControlData data= new ControlData(key, values);
-//        
-//        GridData gd= new GridData(GridData.HORIZONTAL_ALIGN_FILL);
-//        gd.horizontalSpan= 3;
-//        gd.horizontalIndent= indent;
-//        
-//        Button checkBox= new Button(parent, SWT.CHECK);
-//        checkBox.setFont(JFaceResources.getDialogFont());
-//        checkBox.setText(label);
-//        checkBox.setData(data);
-//        checkBox.setLayoutData(gd);
-//        checkBox.addSelectionListener(getSelectionListener());
-//        
-//        makeScrollableCompositeAware(checkBox);
-//        
-//        String currValue= getValue(key);
-//        checkBox.setSelection(data.getSelection(currValue) == 0);
-//        
-//        fCheckBoxes.add(checkBox);
-//        
-//        return checkBox;
-//    }
-    
-    /**
-     * @param parent
-     * @param label
-     * @param key
-     * @param values
-     * @param indent
-     * @param widthHint
-     * @param listener
-     * @return a check box styled button with a related link
-     */
-    protected Button addCheckBoxWithLink(Composite parent, String label, Key key, String[] values, int indent, int widthHint, SelectionListener listener) {
-        ControlData data= new ControlData(key, values);
-        
-        GridData gd= new GridData(GridData.FILL, GridData.FILL, true, false);
-        gd.horizontalSpan= 3;
-        gd.horizontalIndent= indent;
-        
-        Composite composite= new Composite(parent, SWT.NONE);
-        GridLayout layout= new GridLayout();
-        layout.marginHeight= 0;
-        layout.marginWidth= 0;
-        layout.numColumns= 2;
-        composite.setLayout(layout);
-        composite.setLayoutData(gd);
-        
-        Button checkBox= new Button(composite, SWT.CHECK);
-        checkBox.setFont(JFaceResources.getDialogFont());
-        checkBox.setData(data);
-        checkBox.setLayoutData(new GridData(GridData.FILL, GridData.BEGINNING, false, false));
-        checkBox.addSelectionListener(getSelectionListener());
-        
-        gd= new GridData(GridData.FILL, GridData.CENTER, true, false);
-        gd.widthHint= widthHint;
-        
-        Link link= new Link(composite, SWT.NONE);
-        link.setText(label);
-        link.setLayoutData(gd);
-        if (listener != null) {
-            link.addSelectionListener(listener);
-        }
-        
-        makeScrollableCompositeAware(link);
-        makeScrollableCompositeAware(checkBox);
-        
-        String currValue= getValue(key);
-        checkBox.setSelection(data.getSelection(currValue) == 0);
-        
-        fCheckBoxes.add(checkBox);
-        
-        return checkBox;
-    }
-    
-    /**
-     * @param parent
-     * @param label
-     * @param key
-     * @param values
-     * @param valueLabels
-     * @param indent
-     * @return a Combo box added to parent with the label and key
-     */
-    protected Combo addComboBox(Composite parent, String label, Key key, String[] values, String[] valueLabels, int indent) {
-        GridData gd= new GridData(GridData.FILL, GridData.CENTER, true, false, 2, 1);
-        gd.horizontalIndent= indent;
-                
-        Label labelControl= new Label(parent, SWT.LEFT);
-        labelControl.setFont(JFaceResources.getDialogFont());
-        
-        labelControl.setText(label);
-        labelControl.setLayoutData(gd);
-                
-        Combo comboBox= newComboControl(parent, key, values, valueLabels);
-        comboBox.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL));
-
-        fLabels.put(comboBox, labelControl);
-        
-        return comboBox;
-    }
-    
-    Combo addInversedComboBox(Composite parent, String label, Key key, String[] values, String[] valueLabels, int indent) {
-        GridData gd= new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
-        gd.horizontalIndent= indent;
-        gd.horizontalSpan= 3;
-        
-        Composite composite= new Composite(parent, SWT.NONE);
-        GridLayout layout= new GridLayout();
-        layout.marginHeight= 0;
-        layout.marginWidth= 0;
-        layout.numColumns= 2;
-        composite.setLayout(layout);
-        composite.setLayoutData(gd);
-        
-        Combo comboBox= newComboControl(composite, key, values, valueLabels);
-        comboBox.setFont(JFaceResources.getDialogFont());
-        comboBox.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL));
-        
-        Label labelControl= new Label(composite, SWT.LEFT | SWT.WRAP);
-        labelControl.setText(label);
-        labelControl.setLayoutData(new GridData());
-        
-        fLabels.put(comboBox, labelControl);
-        return comboBox;
-    }
-    
-    Combo newComboControl(Composite composite, Key key, String[] values, String[] valueLabels) {
-        ControlData data= new ControlData(key, values);
-        
-        Combo comboBox= new Combo(composite, SWT.READ_ONLY);
-        comboBox.setItems(valueLabels);
-        comboBox.setData(data);
-        comboBox.addSelectionListener(getSelectionListener());
-        comboBox.setFont(JFaceResources.getDialogFont());
-            
-        makeScrollableCompositeAware(comboBox);
-        
-        String currValue= getValue(key);    
-        comboBox.select(data.getSelection(currValue));
-        
-        fComboBoxes.add(comboBox);
-        return comboBox;
-    }
-
-    Text addTextField(Composite parent, String label, Key key, int indent, int widthHint) {   
-        Label labelControl= new Label(parent, SWT.WRAP);
-        labelControl.setText(label);
-        labelControl.setFont(JFaceResources.getDialogFont());
-        labelControl.setLayoutData(new GridData());
-                
-        Text textBox= new Text(parent, SWT.BORDER | SWT.SINGLE);
-        textBox.setData(key);
-        textBox.setLayoutData(new GridData());
-        
-        makeScrollableCompositeAware(textBox);
-        
-        fLabels.put(textBox, labelControl);
-        
-        String currValue= getValue(key);    
-        if (currValue != null) {
-            textBox.setText(currValue);
-        }
-        textBox.addModifyListener(getTextModifyListener());
-
-        GridData data= new GridData(GridData.HORIZONTAL_ALIGN_FILL);
-        if (widthHint != 0) {
-            data.widthHint= widthHint;
-        }
-        data.horizontalIndent= indent;
-        data.horizontalSpan= 2;
-        textBox.setLayoutData(data);
-
-        fTextBoxes.add(textBox);
-        return textBox;
-    }
-    
-    ScrolledPageContent getParentScrolledComposite(Control control) {
-        Control parent= control.getParent();
-        while (!(parent instanceof ScrolledPageContent) && parent != null) {
-            parent= parent.getParent();
-        }
-        if (parent instanceof ScrolledPageContent) {
-            return (ScrolledPageContent) parent;
-        }
-        return null;
-    }
-    
-    ExpandableComposite getParentExpandableComposite(Control control) {
-        Control parent= control.getParent();
-        while (!(parent instanceof ExpandableComposite) && parent != null) {
-            parent= parent.getParent();
-        }
-        if (parent instanceof ExpandableComposite) {
-            return (ExpandableComposite) parent;
-        }
-        return null;
-    }
-    
-    private void makeScrollableCompositeAware(Control control) {
-        ScrolledPageContent parentScrolledComposite= getParentScrolledComposite(control);
-        if (parentScrolledComposite != null) {
-            parentScrolledComposite.adaptChild(control);
-        }
-    }
-    
-    ExpandableComposite createStyleSection(Composite parent, String label, int nColumns) {
-        ExpandableComposite excomposite= new ExpandableComposite(parent, SWT.NONE, ExpandableComposite.TWISTIE | ExpandableComposite.CLIENT_INDENT);
-        excomposite.setText(label);
-        excomposite.setExpanded(false);
-        excomposite.setFont(JFaceResources.getFontRegistry().getBold(JFaceResources.DIALOG_FONT));
-        excomposite.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, false, nColumns, 1));
-        excomposite.addExpansionListener(new ExpansionAdapter() {
-            public void expansionStateChanged(ExpansionEvent e) {
-                expandedStateChanged((ExpandableComposite) e.getSource());
-            }
-        });
-        fExpandedComposites.add(excomposite);
-        makeScrollableCompositeAware(excomposite);
-        return excomposite;
-    }
-    
-    final void expandedStateChanged(ExpandableComposite expandable) {
-        ScrolledPageContent parentScrolledComposite= getParentScrolledComposite(expandable);
-        if (parentScrolledComposite != null) {
-            parentScrolledComposite.reflow(true);
-        }
-    }
-    
-    void restoreSectionExpansionStates(IDialogSettings settings) {
-        for (int i= 0; i < fExpandedComposites.size(); i++) {
-            ExpandableComposite excomposite= (ExpandableComposite) fExpandedComposites.get(i);
-            if (settings == null) {
-                excomposite.setExpanded(i == 0); // only expand the first node by default
-            } else {
-                excomposite.setExpanded(settings.getBoolean(SETTINGS_EXPANDED + String.valueOf(i)));
-            }
-        }
-    }
-    
-    void storeSectionExpansionStates(IDialogSettings settings) {
-        for (int i= 0; i < fExpandedComposites.size(); i++) {
-            ExpandableComposite curr= (ExpandableComposite) fExpandedComposites.get(i);
-            settings.put(SETTINGS_EXPANDED + String.valueOf(i), curr.isExpanded());
-        }
-    }
-    
-    SelectionListener getSelectionListener() {
-        if (fSelectionListener == null) {
-            fSelectionListener= new SelectionListener() {
-                public void widgetDefaultSelected(SelectionEvent e) {/*do nothing*/}
-    
-                public void widgetSelected(SelectionEvent e) {
-                    controlChanged(e.widget);
-                }
-            };
-        }
-        return fSelectionListener;
-    }
-    
-    ModifyListener getTextModifyListener() {
-        if (fTextModifyListener == null) {
-            fTextModifyListener= new ModifyListener() {
-                public void modifyText(ModifyEvent e) {
-                    textChanged((Text) e.widget);
-                }
-            };
-        }
-        return fTextModifyListener;
-    }       
-    
-    void controlChanged(Widget widget) {
-        ControlData data= (ControlData) widget.getData();
-        String newValue= null;
-        if (widget instanceof Button) {
-            newValue= data.getValue(((Button)widget).getSelection());           
-        } else if (widget instanceof Combo) {
-            newValue= data.getValue(((Combo)widget).getSelectionIndex());
-        } else {
-            return;
-        }
-        String oldValue= setValue(data.getKey(), newValue);
-        validateSettings(data.getKey(), oldValue, newValue);
-    }
-    
-    void textChanged(Text textControl) {
-        Key key= (Key) textControl.getData();
-        String number= textControl.getText();
-        String oldValue= setValue(key, number);
-        validateSettings(key, oldValue, number);
-    }   
-
-    boolean checkValue(Key key, String value) {
-        return value.equals(getValue(key));
-    }
-    
-    String getValue(Key key) {
-        if (fDisabledProjectSettings != null) {
-            return (String) fDisabledProjectSettings.get(key);
-        }
-        return key.getCurValue(_prefs, fLookupOrder, false, fManager).toString();
-    }
-    
-    
-    boolean getBooleanValue(Key key) {
-        return Boolean.valueOf(getValue(key)).booleanValue();
-    }
-    
-    String setValue(Key key, String value) {
-        if (fDisabledProjectSettings != null) {
-            return (String) fDisabledProjectSettings.put(key, value);
-        }
-        Object newValue =  key.setCurValue(_prefs, fLookupOrder[0], Severity.valueOfString(value), fManager);
-        return newValue != null ? newValue.toString() : ""; //$NON-NLS-1$
-    }
-    
-    String setValue(Key key, boolean value) {
-        return setValue(key, String.valueOf(value));
-    }
-
-    /**
-     * Returns the value as actually stored in the preference store.
-     * @param key
-     * @return the value as actually stored in the preference store.
-     */
-    Object getStoredValue(Key key) {
-        return key.getCurValue(_prefs, fLookupOrder, false, fManager);
-    }
-    
-    /**
-     * Update fields and validate.
-     * @param changedKey Key that changed, or null, if all changed.
-     * @param oldValue 
-     * @param newValue 
-     */ 
-    protected abstract void validateSettings(Key changedKey, String oldValue, String newValue);
-    
-    
-    String[] getTokens(String text, String separator) {
-        StringTokenizer tok= new StringTokenizer(text, separator); 
-        int nTokens= tok.countTokens();
-        String[] res= new String[nTokens];
-        for (int i= 0; i < res.length; i++) {
-            res[i]= tok.nextToken().trim();
-        }
-        return res;
-    }
-
-    private boolean getChanges(IScopeContext currContext, List changedSettings) {
-        boolean needsBuild= false;
-        for (int i= 0; i < fAllKeys.length; i++) {
-            Key key= fAllKeys[i];
-            Object oldVal= key.getStoredValue(_prefs, currContext, null);
-            Object val= key.getCurValue(_prefs, currContext, fManager);
-            if (val == null) {
-                if (oldVal != null) {
-                    changedSettings.add(key);
-                    needsBuild |= !oldVal.equals(key.getCurValue(_prefs, fLookupOrder, true, fManager));
-                }
-            } else if (!val.equals(oldVal)) {
-                changedSettings.add(key);
-                needsBuild |= oldVal != null || !val.equals(key.getCurValue(_prefs, fLookupOrder, true, fManager));
-            }
-        }
-        return needsBuild;
-    }
-    
-    void useProjectSpecificSettings(boolean enable) {
-        boolean hasProjectSpecificOption= fDisabledProjectSettings == null;
-        if (enable != hasProjectSpecificOption && fProject != null) {
-            if (enable) {
-                for (int i= 0; i < fAllKeys.length; i++) {
-                    Key curr= fAllKeys[i];
-                    String val= (String) fDisabledProjectSettings.get(curr);
-                    curr.setCurValue(_prefs, fLookupOrder[0], Severity.valueOfString(val), fManager);
-                }
-                fDisabledProjectSettings= null;
-                updateControls();
-                validateSettings(null, null, null);
-            } else {
-                fDisabledProjectSettings= new IdentityHashMap();
-                for (int i= 0; i < fAllKeys.length; i++) {
-                    Key curr= fAllKeys[i];
-                    Object oldSetting= curr.getCurValue(_prefs, fLookupOrder, false, fManager);
-                    fDisabledProjectSettings.put(curr, oldSetting);
-                    curr.setCurValue(_prefs, fLookupOrder[0], null, fManager); // clear project settings
-                }
-            }
-        }
-    }
-    
-    boolean areSettingsEnabled() {
-        return fDisabledProjectSettings == null || fProject == null;
-    }
-    
-    
-    boolean performOk() {
-        return processChanges(fContainer);
-    }
-    
-//    public boolean performApply() {
-//        return processChanges(null); // apply directly
-//    }
-    
-    boolean processChanges(IWorkbenchPreferenceContainer container) {
-        IScopeContext currContext= fLookupOrder[0];
-        
-        List /* <Key>*/ changedOptions= new ArrayList();
-        boolean needsBuild= getChanges(currContext, changedOptions);
-        if (changedOptions.isEmpty()) {
-            return true;
-        }
-        if (needsBuild) {
-            int count= getRebuildCount();
-            if (count > fRebuildCount) {
-                needsBuild= false; // build already requested
-                fRebuildCount= count;
-            }
-        }
-
-        boolean doBuild= false;
-        
-        final String  showBuildWarningKey = JSFCorePlugin.PLUGIN_ID + "." + "buildwarning_dont_show_again"; //$NON-NLS-1$ //$NON-NLS-2$
-        final IPreferenceStore prefStore = JSFCorePlugin.getDefault().getPreferenceStore();
-        final boolean showDialog = !MessageDialogWithToggle.ALWAYS.equals(prefStore.getString(showBuildWarningKey));
-        
-        if (needsBuild && showDialog) {
-            String[] strings= getFullBuildDialogStrings(fProject == null);
-            if (strings != null) {
-                MessageDialogWithToggle.openInformation
-                	(getShell(), strings[0], strings[1], 
-                			PreferencesMessages.ProblemSeveritiesConfigurationBlock_buildwarning_dont_show_again
-                			, false, prefStore, showBuildWarningKey);
-//                int res= dialog.open();
-//                if (res == 0) {
-//                    doBuild= true;
-//                } else if (res != 1) {
-//                    return false; // cancel pressed
-//                }
-            }
-        }
-        if (container != null) {
-            // no need to apply the changes to the original store: will be done by the page container
-            if (doBuild) { // post build
-                incrementRebuildCount();
-                // TODO: container.registerUpdateJob(CoreUtility.getBuildJob(fProject));
-            }
-        } else {
-            // apply changes right away
-            try {
-                fManager.applyChanges();
-            } catch (BackingStoreException e) {
-                JSFUiPlugin.log(IStatus.ERROR, "Error applying changes", e); //$NON-NLS-1$
-                return false;
-            }
-            if (doBuild) {
-                //CoreUtility.getBuildJob(fProject).schedule();
-            }
-            
-        }
-        return true;
-    }
-    
-    abstract String[] getFullBuildDialogStrings(boolean workspaceSettings);
-            
-    
-//    public void performDefaults() {
-//        for (int i= 0; i < fAllKeys.length; i++) {
-//            Key curr= fAllKeys[i];
-//            String defValue= curr.getStoredValue(fLookupOrder, true, fManager);
-//            setValue(curr, defValue);
-//        }
-//        
-//        settingsUpdated();
-//        updateControls();
-//        validateSettings(null, null, null);
-//    }
-
-    /**
-     * @since 3.1
-     */
-    void performRevert() {
-        for (int i= 0; i < fAllKeys.length; i++) {
-            Key curr= fAllKeys[i];
-            String origValue= curr.getCurValue(_prefs, fLookupOrder, false, null).toString();
-            setValue(curr, origValue);
-        }
-
-        updateControls();
-        validateSettings(null, null, null);
-    }
-    
-    void dispose() {
-        // do nothing; sub-class should override
-    }
-    
-    void updateControls() {
-        // update the UI
-        for (int i= fCheckBoxes.size() - 1; i >= 0; i--) {
-            updateCheckBox((Button) fCheckBoxes.get(i));
-        }
-        for (int i= fComboBoxes.size() - 1; i >= 0; i--) {
-            updateCombo((Combo) fComboBoxes.get(i));
-        }
-        for (int i= fTextBoxes.size() - 1; i >= 0; i--) {
-            updateText((Text) fTextBoxes.get(i));
-        }
-    }
-    
-    void updateCombo(Combo curr) {
-        ControlData data= (ControlData) curr.getData();
-        
-        String currValue= getValue(data.getKey());  
-        curr.select(data.getSelection(currValue));                  
-    }
-    
-    void updateCheckBox(Button curr) {
-        ControlData data= (ControlData) curr.getData();
-        
-        String currValue= getValue(data.getKey());  
-        curr.setSelection(data.getSelection(currValue) == 0);                       
-    }
-    
-    void updateText(Text curr) {
-        Key key= (Key) curr.getData();
-        
-        String currValue= getValue(key);
-        if (currValue != null) {
-            curr.setText(currValue);
-        }
-    }
-    
-    Button getCheckBox(Key key) {
-        for (int i= fCheckBoxes.size() - 1; i >= 0; i--) {
-            Button curr= (Button) fCheckBoxes.get(i);
-            ControlData data= (ControlData) curr.getData();
-            if (key.equals(data.getKey())) {
-                return curr;
-            }
-        }
-        return null;        
-    }
-    
-    Combo getComboBox(Key key) {
-        for (int i= fComboBoxes.size() - 1; i >= 0; i--) {
-            Combo curr= (Combo) fComboBoxes.get(i);
-            ControlData data= (ControlData) curr.getData();
-            if (key.equals(data.getKey())) {
-                return curr;
-            }
-        }
-        return null;        
-    }
-    
-    Text getTextControl(Key key) {
-        for (int i= fTextBoxes.size() - 1; i >= 0; i--) {
-            Text curr= (Text) fTextBoxes.get(i);
-            ControlData data= (ControlData) curr.getData();
-            if (key.equals(data.getKey())) {
-                return curr;
-            }
-        }
-        return null;        
-    }
-    
-    Control findControl(Key key) {
-        Combo comboBox= getComboBox(key);
-        if (comboBox != null) {
-            return comboBox;
-        }
-        Button checkBox= getCheckBox(key);
-        if (checkBox != null) {
-            return checkBox;
-        }
-        Text text= getTextControl(key);
-        if (text != null) {
-            return text;
-        }
-        return null;
-    }
-    
-    void setComboEnabled(Key key, boolean enabled) {
-        Combo combo= getComboBox(key);
-        Label label= (Label) fLabels.get(combo);
-        combo.setEnabled(enabled);
-        label.setEnabled(enabled);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/validation/PixelConverter.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/validation/PixelConverter.java
deleted file mode 100644
index a5ed503..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/validation/PixelConverter.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Oracle - copied for use in JSF validation tooling
- *******************************************************************************/
-package org.eclipse.jst.jsf.ui.internal.validation;
-
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.FontMetrics;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.widgets.Control;
-
-import org.eclipse.jface.dialogs.Dialog;
-
-/**
- * Copied from JDT.  Used by OptionsConfigurationBlock
- *
- */
-class PixelConverter {
-    
-    private final FontMetrics fFontMetrics;
-    
-    /**
-     * @param control
-     */
-    PixelConverter(Control control) {
-        this(control.getFont());
-    }
-    
-    /**
-     * @param font
-     */
-    PixelConverter(Font font) {
-        GC gc = new GC(font.getDevice());
-        gc.setFont(font);
-        fFontMetrics= gc.getFontMetrics();
-        gc.dispose();
-    }
-    
-    /*
-     * see org.eclipse.jface.dialogs.DialogPage#convertHeightInCharsToPixels(int)
-     */
-    int convertHeightInCharsToPixels(int chars) {
-        return Dialog.convertHeightInCharsToPixels(fFontMetrics, chars);
-    }
-
-    /*
-     * see org.eclipse.jface.dialogs.DialogPage#convertHorizontalDLUsToPixels(int)
-     */
-    int convertHorizontalDLUsToPixels(int dlus) {
-        return Dialog.convertHorizontalDLUsToPixels(fFontMetrics, dlus);
-    }
-
-    /*
-     * see org.eclipse.jface.dialogs.DialogPage#convertVerticalDLUsToPixels(int)
-     */
-    int convertVerticalDLUsToPixels(int dlus) {
-        return Dialog.convertVerticalDLUsToPixels(fFontMetrics, dlus);
-    }
-    
-    /*
-     * see org.eclipse.jface.dialogs.DialogPage#convertWidthInCharsToPixels(int)
-     */
-    int convertWidthInCharsToPixels(int chars) {
-        return Dialog.convertWidthInCharsToPixels(fFontMetrics, chars);
-    }   
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/validation/PreferencesMessages.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/validation/PreferencesMessages.java
deleted file mode 100644
index 2148c52..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/validation/PreferencesMessages.java
+++ /dev/null
@@ -1,237 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     John Kaplan, johnkaplantech@gmail.com - 108071 [code templates] template for body of newly created class
- *     Oracle - adapted for JSF tooling
- *******************************************************************************/
-package org.eclipse.jst.jsf.ui.internal.validation;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * NLS messages for validation severity preferences
- * 
- * @author cbateman
- *
- */
-public final class PreferencesMessages extends NLS {
-
-    private static final String BUNDLE_NAME= "org.eclipse.jst.jsf.ui.internal.validation.messages";//$NON-NLS-1$
-
-    private PreferencesMessages() {
-        // Do not instantiate
-    }
-
-    static {
-        NLS.initializeMessages(BUNDLE_NAME, PreferencesMessages.class);
-    }
-
-    /**
-     * see messages.properties
-     */
-    public static String ProblemSeveritiesPreferencePage_title;
-    /**
-     * see messages.properties
-     */
-    public static String ProblemSeveritiesConfigurationBlock_error;
-    /**
-     * see messages.properties
-     */
-    public static String ProblemSeveritiesConfigurationBlock_warning;
-    /**
-     * see messages.properties
-     */
-    public static String ProblemSeveritiesConfigurationBlock_ignore;
-
-    /**
-     * see messages.properties
-     */
-    public static String ProblemSeveritiesConfigurationBlock_section_id_resolution;
-    /**
-     * see messages.properties
-     */
-    public static String ProblemSeveritiesConfigurationBlock_section_general;
-    /**
-     * see messages.properties
-     */
-    public static String ProblemSeveritiesConfigurationBlock_section_type_coercion_problems;
-    /**
-     * see messages.properties
-     */
-    public static String ProblemSeveritiesConfigurationBlock_section_constant_folding_and_unused_code;
-    /**
-     * see messages.properties
-     */
-    public static String  ProblemSeveritiesConfigurationBlock_section_programming_errors;
-    /**
-     * see messages.properties
-     */
-    public static String  ProblemSeveritiesConfigurationBlock_section_type_comparison;
-    /**
-     * see messages.properties
-     */
-    public static String ProblemSeveritiesConfigurationBlock_needsbuild_title;
-    /**
-     * see messages.properties
-     */
-    public static String ProblemSeveritiesConfigurationBlock_needsfullbuild_message;
-    /**
-     * see messages.properties
-     */
-    public static String ProblemSeveritiesConfigurationBlock_needsprojectbuild_message;
-    /**
-     * see messages.properties
-     */
-    public static String ProblemSeveritiesConfigurationBlock_buildwarning_dont_show_again;
-    /**
-     * see messages.properties
-     */
-    public static String ProblemSeveritiesConfigurationBlock_common_description;
-
-    /**
-     * see messages.properties
-     */
-    public static String ProblemSeveritiesConfigurationBlock_pb_general_syntax_error;
-    /**
-     * see messages.properties
-     */
-    public static String ProblemSeveritiesConfigurationBlock_pb_empty_el_expression;
-    /**
-     * see messages.properties
-     */
-    public static String ProblemSeveritiesConfigurationBlock_pb_missing_closing_expr_bracket;
-    /**
-     * see messages.properties
-     */
-    public static String ProblemSeveritiesConfigurationBlock_pb_cannot_apply_operator_to_method_binding;
-    /**
-     * see messages.properties
-     */
-    public static String ProblemSeveritiesConfigurationBlock_pb_dotted_property_key_should_use_array;
-
-    /**
-     * see messages.properties
-     */
-    public static String ProblemSeveritiesConfigurationBlock_pb_variable_not_found;
-    /**
-     * see messages.properties
-     */
-    public static String ProblemSeveritiesConfigurationBlock_pb_member_not_found;
-
-    /**
-     * see messages.properties
-     */
-    public static String  ProblemSeveritiesConfigurationBlock_pb_binary_op_numeric_coercion_error;
-    /**
-     * see messages.properties
-     */
-    public static String  ProblemSeveritiesConfigurationBlock_pb_binary_op_boolean_coercion_error;
-    /**
-     * see messages.properties
-     */
-    public static String  ProblemSeveritiesConfigurationBlock_pb_binary_op_no_coercion_available;
-    /**
-     * see messages.properties
-     */
-    public static String  ProblemSeveritiesConfigurationBlock_pb_binary_op_literal_to_number_coercion_error;
-    /**
-     * see messages.properties
-     */
-    public static String  ProblemSeveritiesConfigurationBlock_pb_unary_op_numeric_coercion_error;
-    /**
-     * see messages.properties
-     */
-    public static String  ProblemSeveritiesConfigurationBlock_pb_unary_op_boolean_coercion_error;
-    /**
-     * see messages.properties
-     */
-    public static String  ProblemSeveritiesConfigurationBlock_pb_unary_op_string_coercion_not_guaranteed;
-    
-    /**
-     * see messages.properties
-     */
-    public static String  ProblemSeveritiesConfigurationBlock_pb_both_binary_operands_null;
-    /**
-     * see messages.properties
-     */
-    public static String  ProblemSeveritiesConfigurationBlock_pb_binary_expression_always_evaluates_same;
-    /**
-     * see messages.properties
-     */
-    public static String  ProblemSeveritiesConfigurationBlock_pb_equality_with_null_always_same;
-    /**
-     * see messages.properties
-     */
-    public static String  ProblemSeveritiesConfigurationBlock_pb_unary_expression_always_evaluates_same;
-    /**
-     * see messages.properties
-     */
-    public static String  ProblemSeveritiesConfigurationBlock_pb_empty_expression_always_false;
-    /**
-     * see messages.properties
-     */
-    public static String  ProblemSeveritiesConfigurationBlock_pb_enumeration_comparision_always_same;
-    /**
-     * see messages.properties
-     */
-    public static String  ProblemSeveritiesConfigurationBlock_pb_minus_on_null_always_zero;
-    /**
-     * see messages.properties
-     */
-    public static String  ProblemSeveritiesConfigurationBlock_pb_first_argument_short_circuits_expression;
-    /**
-     * see messages.properties
-     */
-    public static String  ProblemSeveritiesConfigurationBlock_pb_second_argument_always_evaluates_same;
-    /**
-     * see messages.properties
-     */
-    public static String  ProblemSeveritiesConfigurationBlock_pb_apply_dot_operator_with_null;
-    
-    /**
-     * see messages.properties
-     */
-    public static String  ProblemSeveritiesConfigurationBlock_pb_possible_division_by_zero;
-    /**
-     * see messages.properties
-     */
-    public static String  ProblemSeveritiesConfigurationBlock_pb_possible_array_index_out_of_bounds;
-    /**
-     * see messages.properties
-     */
-    public static String  ProblemSeveritiesConfigurationBlock_pb_incompatible_enumeration_comparison;
-    /**
-     * see messages.properties
-     */
-    public static String ProblemSeveritiesConfigurationBlock_pb_member_is_intermediate;
-    /**
-     * see messages.properties
-     */
-    public static String ProblemSeveritiesConfigurationBlock_pb_method_expression_expected;
-    /**
-     * see messages.properties
-     */
-    public static String ProblemSeveritiesConfigurationBlock_pb_incompatible_type_assignment;
-    /**
-     * see messages.properties
-     */
-    public static String ProblemSeveritiesConfigurationBlock_pb_value_expression_expected;
-    /**
-     * see messages.properties
-     */
-    public static String ProblemSeveritiesConfigurationBlock_pb_incompatible_method_types;
-    /**
-     * see messages.properties
-     */
-    public static String ProblemSeveritiesConfigurationBlock_pb_property_not_readable;
-    /**
-     * see messages.properties
-     */
-    public static String ProblemSeveritiesConfigurationBlock_pb_property_not_writable;
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/validation/ProblemSeveritiesConfigurationBlock.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/validation/ProblemSeveritiesConfigurationBlock.java
deleted file mode 100644
index 48941b8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/validation/ProblemSeveritiesConfigurationBlock.java
+++ /dev/null
@@ -1,470 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Oracle - adapted for use in JSF Tooling
- *******************************************************************************/
-package org.eclipse.jst.jsf.ui.internal.validation;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jface.dialogs.IDialogSettings;
-import org.eclipse.jst.jsf.core.internal.IJSFPreferenceModel;
-import org.eclipse.jst.jsf.ui.internal.JSFUiPlugin;
-import org.eclipse.jst.jsf.validation.internal.ELValidationPreferences;
-import org.eclipse.jst.jsf.validation.internal.JSFTypeComparatorPreferences;
-import org.eclipse.jst.jsf.validation.internal.Severity;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.ui.forms.widgets.ExpandableComposite;
-import org.eclipse.ui.preferences.IWorkbenchPreferenceContainer;
-
-
-/**
-  */
-/*package*/ class ProblemSeveritiesConfigurationBlock extends OptionsConfigurationBlock {
-
-    private static final String SETTINGS_SECTION_NAME= "ProblemSeveritiesConfigurationBlock";  //$NON-NLS-1$
-    
-    /**
-     * preference key.  Match to DiagnosticFactory constants
-     */
-    private final static Key PREF_BINARY_OP_BOTH_OPERANDS_NULL = 
-        getJSFCoreKey(ELValidationPreferences.BINARY_OP_BOTH_OPERANDS_NULL);
-    private final static Key PREF_BINARY_OP_POSSIBLE_DIVISION_BY_ZERO = 
-        getJSFCoreKey(ELValidationPreferences.BINARY_OP_POSSIBLE_DIVISION_BY_ZERO);
-    private final static Key PREF_BINARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION = 
-        getJSFCoreKey(ELValidationPreferences.BINARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION);
-    private final static Key PREF_BINARY_OP_CONSTANT_EXPRESSION_ALWAYS_EVAL_SAME = 
-        getJSFCoreKey(ELValidationPreferences.BINARY_OP_CONSTANT_EXPRESSION_ALWAYS_EVAL_SAME);
-    private final static Key PREF_BINARY_OP_EQUALITY_COMP_WITH_NULL_ALWAYS_EVAL_SAME = 
-        getJSFCoreKey(ELValidationPreferences.BINARY_OP_EQUALITY_COMP_WITH_NULL_ALWAYS_EVAL_SAME);
-    private final static Key PREF_BINARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN = 
-        getJSFCoreKey(ELValidationPreferences.BINARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN);
-    private final static Key PREF_BINARY_OP_FIRST_ARGUMENT_SHORT_CIRCUITS = 
-        getJSFCoreKey(ELValidationPreferences.BINARY_OP_FIRST_ARGUMENT_SHORT_CIRCUITS);
-    private final static Key PREF_BINARY_OP_SECOND_ARGUMENT_ALWAYS_EVAL_SAME =
-        getJSFCoreKey(ELValidationPreferences.BINARY_OP_SECOND_ARGUMENT_ALWAYS_EVAL_SAME);
-    private final static Key PREF_BINARY_OP_NO_AVAILABLE_TYPE_COERCION = 
-        getJSFCoreKey(ELValidationPreferences.BINARY_OP_NO_AVAILABLE_TYPE_COERCION);
-    private final static Key PREF_BINARY_OP_COULD_NOT_COERCE_LITERALS_TO_NUMBERS = 
-        getJSFCoreKey(ELValidationPreferences.BINARY_OP_COULD_NOT_COERCE_LITERALS_TO_NUMBERS);
-    private final static Key PREF_UNARY_OP_CONSTANT_EXPRESSION_EVAL_SAME = 
-        getJSFCoreKey(ELValidationPreferences.UNARY_OP_CONSTANT_EXPRESSION_EVAL_SAME);
-    private final static Key PREF_UNARY_OP_EMPTY_ALWAYS_FALSE_ON_TYPE = 
-        getJSFCoreKey(ELValidationPreferences.UNARY_OP_EMPTY_ALWAYS_FALSE_ON_TYPE);
-    private final static Key PREF_UNARY_OP_MINUS_ON_NULL_ALWAYS_ZERO = 
-        getJSFCoreKey(ELValidationPreferences.UNARY_OP_MINUS_ON_NULL_ALWAYS_ZERO);
-    private final static Key PREF_UNARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION = 
-        getJSFCoreKey(ELValidationPreferences.UNARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION);
-    private final static Key PREF_UNARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN = 
-        getJSFCoreKey(ELValidationPreferences.UNARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN);
-//    private final static Key PREF_TERNARY_OP_CHOICE_IS_ALWAYS_SAME = 
-//        getJSFCoreKey(ELValidationPreferences.TERNARY_OP_CHOICE_IS_ALWAYS_SAME);
-//    private final static Key PREF_TERNARY_OP_CANNOT_COERCE_CHOICE_TO_BOOLEAN = 
-//        getJSFCoreKey(ELValidationPreferences.TERNARY_OP_CANNOT_COERCE_CHOICE_TO_BOOLEAN);
-    private final static Key PREF_UNARY_OP_STRING_CONVERSION_NOT_GUARANTEED = 
-        getJSFCoreKey(ELValidationPreferences.UNARY_OP_STRING_CONVERSION_NOT_GUARANTEED);
-    private final static Key PREF_CANNOT_APPLY_OPERATOR_TO_METHOD_BINDING = 
-        getJSFCoreKey(ELValidationPreferences.CANNOT_APPLY_OPERATOR_TO_METHOD_BINDING);
-    private final static Key PREF_MEMBER_NOT_FOUND = 
-        getJSFCoreKey(ELValidationPreferences.MEMBER_NOT_FOUND);
-    private final static Key PREF_VARIABLE_NOT_FOUND = 
-        getJSFCoreKey(ELValidationPreferences.VARIABLE_NOT_FOUND);
-    private final static Key PREF_MISSING_CLOSING_EXPR_BRACKET =
-        getJSFCoreKey(ELValidationPreferences.MISSING_CLOSING_EXPR_BRACKET);
-    private final static Key PREF_GENERAL_SYNTAX_ERROR = 
-        getJSFCoreKey(ELValidationPreferences.GENERAL_SYNTAX_ERROR);
-    private final static Key PREF_EMPTY_EL_EXPRESSION = 
-        getJSFCoreKey(ELValidationPreferences.EMPTY_EL_EXPRESSION);
-    private final static Key PREF_BINARY_OP_DOT_WITH_VALUEB_NULL = 
-        getJSFCoreKey(ELValidationPreferences.BINARY_OP_DOT_WITH_VALUEB_NULL);
-    private final static Key PREF_BINARY_OP_DOT_WITH_DOTTED_KEY_SHOULD_USE_ARRAY =
-        getJSFCoreKey(ELValidationPreferences.BINARY_OP_DOT_WITH_DOTTED_KEY_SHOULD_USE_ARRAY);
-    private final static Key PREF_POSSIBLE_ARRAY_INDEX_OUT_OF_BOUNDS = 
-        getJSFCoreKey(ELValidationPreferences.POSSIBLE_ARRAY_INDEX_OUT_OF_BOUNDS);
-    private final static Key PREF_BINARY_COMPARISON_WITH_ENUM_ALWAYS_SAME = 
-        getJSFCoreKey(ELValidationPreferences.BINARY_COMPARISON_WITH_ENUM_ALWAYS_SAME);
-    private final static Key PREF_BINARY_OP_COMPARISON_OF_ENUMS_INCOMPATIBLE = 
-        getJSFCoreKey(ELValidationPreferences.BINARY_OP_COMPARISON_OF_ENUMS_INCOMPATIBLE);
-    private final static Key PREF_MEMBER_IS_INTERMEDIATE =
-        getJSFCoreKey(ELValidationPreferences.MEMBER_IS_INTERMEDIATE);
-
-    //  TypeComparator keys
-    private final static Key PREF_INCOMPATIBLE_METHOD_TYPES =
-        getJSFCoreKey(JSFTypeComparatorPreferences.INCOMPATIBLE_METHOD_TYPES);
-    private final static Key PREF_INCOMPATIBLE_TYPES =
-        getJSFCoreKey(JSFTypeComparatorPreferences.INCOMPATIBLE_TYPES);
-    private final static Key PREF_METHOD_EXPRESSION_EXPECTED =
-        getJSFCoreKey(JSFTypeComparatorPreferences.METHOD_EXPRESSION_EXPECTED);
-    private final static Key PREF_PROPERTY_NOT_READABLE =
-        getJSFCoreKey(JSFTypeComparatorPreferences.PROPERTY_NOT_READABLE);
-    private final static Key PREF_PROPERTY_NOT_WRITABLE =
-        getJSFCoreKey(JSFTypeComparatorPreferences.PROPERTY_NOT_WRITABLE);
-    private final static Key PREF_VALUE_EXPRESSION_EXPECTED =
-        getJSFCoreKey(JSFTypeComparatorPreferences.VALUE_EXPRESSION_EXPECTED);
-
-
-    private final static int EXPECTED_PREFS = 34;
-    
-    private PixelConverter fPixelConverter;
-    
-    /**
-     * @param prefs 
-     * @param project
-     * @param container
-     */
-    public ProblemSeveritiesConfigurationBlock(/*TODO:IStatusChangeListener context,*/ IJSFPreferenceModel prefs, IProject project, IWorkbenchPreferenceContainer container) {
-        super(prefs, project, getKeys(), container);
-    }
-    
-    private static Key[] getKeys() 
-    {
-        Key[] keys = new Key[] {
-                PREF_BINARY_OP_BOTH_OPERANDS_NULL
-                , PREF_BINARY_OP_POSSIBLE_DIVISION_BY_ZERO
-                , PREF_BINARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION 
-                , PREF_BINARY_OP_CONSTANT_EXPRESSION_ALWAYS_EVAL_SAME
-                , PREF_BINARY_OP_EQUALITY_COMP_WITH_NULL_ALWAYS_EVAL_SAME
-                , PREF_BINARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN
-                , PREF_BINARY_OP_FIRST_ARGUMENT_SHORT_CIRCUITS
-                , PREF_BINARY_OP_SECOND_ARGUMENT_ALWAYS_EVAL_SAME
-                , PREF_BINARY_OP_NO_AVAILABLE_TYPE_COERCION 
-                , PREF_BINARY_OP_COULD_NOT_COERCE_LITERALS_TO_NUMBERS 
-                , PREF_UNARY_OP_CONSTANT_EXPRESSION_EVAL_SAME
-                , PREF_UNARY_OP_EMPTY_ALWAYS_FALSE_ON_TYPE 
-                , PREF_UNARY_OP_MINUS_ON_NULL_ALWAYS_ZERO 
-                , PREF_UNARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION
-                , PREF_UNARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN
-                , PREF_UNARY_OP_STRING_CONVERSION_NOT_GUARANTEED
-                , PREF_CANNOT_APPLY_OPERATOR_TO_METHOD_BINDING
-                , PREF_MEMBER_NOT_FOUND 
-                , PREF_VARIABLE_NOT_FOUND
-                , PREF_MISSING_CLOSING_EXPR_BRACKET
-                , PREF_GENERAL_SYNTAX_ERROR
-                , PREF_EMPTY_EL_EXPRESSION
-                , PREF_BINARY_OP_DOT_WITH_VALUEB_NULL
-                , PREF_BINARY_OP_DOT_WITH_DOTTED_KEY_SHOULD_USE_ARRAY
-                , PREF_POSSIBLE_ARRAY_INDEX_OUT_OF_BOUNDS 
-                , PREF_BINARY_COMPARISON_WITH_ENUM_ALWAYS_SAME
-                , PREF_BINARY_OP_COMPARISON_OF_ENUMS_INCOMPATIBLE
-                , PREF_MEMBER_IS_INTERMEDIATE
-                , PREF_INCOMPATIBLE_METHOD_TYPES
-                , PREF_INCOMPATIBLE_TYPES
-                , PREF_METHOD_EXPRESSION_EXPECTED
-                , PREF_PROPERTY_NOT_READABLE
-                , PREF_PROPERTY_NOT_WRITABLE
-                , PREF_VALUE_EXPRESSION_EXPECTED
-          };
-        
-        if (EXPECTED_PREFS != keys.length)
-        {
-            JSFUiPlugin.log(IStatus.WARNING, "Expected "+EXPECTED_PREFS+" preferences but was "+keys.length, new Throwable()); //$NON-NLS-1$ //$NON-NLS-2$
-        }
-
-        return keys;
-    }
-    
-    /*
-     * @see org.eclipse.jface.preference.PreferencePage#createContents(Composite)
-     */
-    protected Control createContents(Composite parent) {
-        fPixelConverter= new PixelConverter(parent);
-        setShell(parent.getShell());
-        
-        Group mainComp= new Group(parent, SWT.NONE);
-        mainComp.setFont(parent.getFont());
-        GridLayout layout= new GridLayout();
-        layout.marginHeight= 0;
-        layout.marginWidth= 0;
-        mainComp.setLayout(layout);
-        mainComp.setText(PreferencesMessages.ProblemSeveritiesConfigurationBlock_common_description);
-        
-        Composite commonComposite= createStyleTabContent(mainComp);
-        GridData gridData= new GridData(GridData.FILL, GridData.FILL, true, true);
-        gridData.heightHint= fPixelConverter.convertHeightInCharsToPixels(20);
-        commonComposite.setLayoutData(gridData);
-        
-        validateSettings(null, null, null);
-    
-        return mainComp;
-    }
-    
-    private Composite createStyleTabContent(Composite folder) {
-        String[] errorWarningIgnore= new String[] { Severity.ERROR.toString(), Severity.WARNING.toString(), Severity.IGNORE.toString() };
-        
-        String[] errorWarningIgnoreLabels= new String[] {
-            PreferencesMessages.ProblemSeveritiesConfigurationBlock_error,  
-            PreferencesMessages.ProblemSeveritiesConfigurationBlock_warning, 
-            PreferencesMessages.ProblemSeveritiesConfigurationBlock_ignore
-        };
-        
-        //String[] enabledDisabled= new String[] { ENABLED, DISABLED };
-        
-        int nColumns= 3;
-        
-        final ScrolledPageContent sc1 = new ScrolledPageContent(folder);
-        
-        Composite composite= sc1.getBody();
-        GridLayout layout= new GridLayout(nColumns, false);
-        layout.marginHeight= 0;
-        layout.marginWidth= 0;
-        composite.setLayout(layout);
-        
-//        Label description= new Label(composite, SWT.LEFT | SWT.WRAP);
-//        description.setFont(description.getFont());
-//        description.setText(PreferencesMessages.ProblemSeveritiesConfigurationBlock_common_description); 
-//        description.setLayoutData(new GridData(GridData.BEGINNING, GridData.CENTER, true, false, nColumns - 1, 1));
-                
-        int indentStep=  fPixelConverter.convertWidthInCharsToPixels(1);
-        
-        int defaultIndent= indentStep * 0;
-        //int extraIndent= indentStep * 2;
-        String label;
-        ExpandableComposite excomposite;
-        Composite inner;
-        
-        // -- general errors
-        
-        label= PreferencesMessages.ProblemSeveritiesConfigurationBlock_section_general; 
-        excomposite= createStyleSection(composite, label, nColumns);
-        
-        inner= new Composite(excomposite, SWT.NONE);
-        inner.setFont(composite.getFont());
-        inner.setLayout(new GridLayout(nColumns, false));
-        excomposite.setClient(inner);
-        
-        label= PreferencesMessages.ProblemSeveritiesConfigurationBlock_pb_general_syntax_error; 
-        addComboBox(inner, label, PREF_GENERAL_SYNTAX_ERROR, errorWarningIgnore, errorWarningIgnoreLabels, defaultIndent);
-
-        label= PreferencesMessages.ProblemSeveritiesConfigurationBlock_pb_empty_el_expression; 
-        addComboBox(inner, label, PREF_EMPTY_EL_EXPRESSION, errorWarningIgnore, errorWarningIgnoreLabels, defaultIndent);
-
-        label= PreferencesMessages.ProblemSeveritiesConfigurationBlock_pb_missing_closing_expr_bracket; 
-        addComboBox(inner, label, PREF_MISSING_CLOSING_EXPR_BRACKET, errorWarningIgnore, errorWarningIgnoreLabels, defaultIndent);
-
-        label= PreferencesMessages.ProblemSeveritiesConfigurationBlock_pb_cannot_apply_operator_to_method_binding; 
-        addComboBox(inner, label, PREF_CANNOT_APPLY_OPERATOR_TO_METHOD_BINDING, errorWarningIgnore, errorWarningIgnoreLabels, defaultIndent);
-
-        label= PreferencesMessages.ProblemSeveritiesConfigurationBlock_pb_dotted_property_key_should_use_array; 
-        addComboBox(inner, label, PREF_BINARY_OP_DOT_WITH_DOTTED_KEY_SHOULD_USE_ARRAY, errorWarningIgnore, errorWarningIgnoreLabels, defaultIndent);
-        
-        // --- id resolution
-        
-        label= PreferencesMessages.ProblemSeveritiesConfigurationBlock_section_id_resolution; 
-        excomposite= createStyleSection(composite, label, nColumns);
-        
-        inner= new Composite(excomposite, SWT.NONE);
-        inner.setFont(composite.getFont());
-        inner.setLayout(new GridLayout(nColumns, false));
-        excomposite.setClient(inner);
-        
-        label= PreferencesMessages.ProblemSeveritiesConfigurationBlock_pb_variable_not_found; 
-        addComboBox(inner, label, PREF_VARIABLE_NOT_FOUND, errorWarningIgnore, errorWarningIgnoreLabels, defaultIndent);
-
-        label= PreferencesMessages.ProblemSeveritiesConfigurationBlock_pb_member_not_found; 
-        addComboBox(inner, label, PREF_MEMBER_NOT_FOUND, errorWarningIgnore, errorWarningIgnoreLabels, defaultIndent);
-
-        label= PreferencesMessages.ProblemSeveritiesConfigurationBlock_pb_member_is_intermediate; 
-        addComboBox(inner, label, PREF_MEMBER_IS_INTERMEDIATE, errorWarningIgnore, errorWarningIgnoreLabels, defaultIndent);
-
-        // --- type coercion problems
-        
-        label= PreferencesMessages.ProblemSeveritiesConfigurationBlock_section_type_coercion_problems; 
-        excomposite= createStyleSection(composite, label, nColumns);
-        
-        inner= new Composite(excomposite, SWT.NONE);
-        inner.setFont(composite.getFont());
-        inner.setLayout(new GridLayout(nColumns, false));
-        excomposite.setClient(inner);
-
-        label= PreferencesMessages.ProblemSeveritiesConfigurationBlock_pb_binary_op_numeric_coercion_error; 
-        addComboBox(inner, label, PREF_BINARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION, errorWarningIgnore, errorWarningIgnoreLabels, defaultIndent);
-
-        label= PreferencesMessages.ProblemSeveritiesConfigurationBlock_pb_binary_op_boolean_coercion_error; 
-        addComboBox(inner, label, PREF_BINARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN, errorWarningIgnore, errorWarningIgnoreLabels, defaultIndent);
-
-        label= PreferencesMessages.ProblemSeveritiesConfigurationBlock_pb_binary_op_no_coercion_available; 
-        addComboBox(inner, label, PREF_BINARY_OP_NO_AVAILABLE_TYPE_COERCION, errorWarningIgnore, errorWarningIgnoreLabels, defaultIndent);
-
-        label= PreferencesMessages.ProblemSeveritiesConfigurationBlock_pb_binary_op_literal_to_number_coercion_error; 
-        addComboBox(inner, label, PREF_BINARY_OP_COULD_NOT_COERCE_LITERALS_TO_NUMBERS, errorWarningIgnore, errorWarningIgnoreLabels, defaultIndent);
-
-        label= PreferencesMessages.ProblemSeveritiesConfigurationBlock_pb_unary_op_numeric_coercion_error; 
-        addComboBox(inner, label, PREF_UNARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION, errorWarningIgnore, errorWarningIgnoreLabels, defaultIndent);
-        
-        label= PreferencesMessages.ProblemSeveritiesConfigurationBlock_pb_unary_op_boolean_coercion_error; 
-        addComboBox(inner, label, PREF_UNARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN, errorWarningIgnore, errorWarningIgnoreLabels, defaultIndent);
-        
-        label= PreferencesMessages.ProblemSeveritiesConfigurationBlock_pb_unary_op_string_coercion_not_guaranteed; 
-        addComboBox(inner, label, PREF_UNARY_OP_STRING_CONVERSION_NOT_GUARANTEED, errorWarningIgnore, errorWarningIgnoreLabels, defaultIndent);
-
-        // --- constant folder and unused code
-        
-        label= PreferencesMessages.ProblemSeveritiesConfigurationBlock_section_constant_folding_and_unused_code; 
-        excomposite= createStyleSection(composite, label, nColumns);
-        
-        inner= new Composite(excomposite, SWT.NONE);
-        inner.setFont(composite.getFont());
-        inner.setLayout(new GridLayout(nColumns, false));
-        excomposite.setClient(inner);
-
-        label= PreferencesMessages.ProblemSeveritiesConfigurationBlock_pb_both_binary_operands_null; 
-        addComboBox(inner, label, PREF_BINARY_OP_BOTH_OPERANDS_NULL, errorWarningIgnore, errorWarningIgnoreLabels, defaultIndent);
-
-        label= PreferencesMessages.ProblemSeveritiesConfigurationBlock_pb_binary_expression_always_evaluates_same; 
-        addComboBox(inner, label, PREF_BINARY_OP_CONSTANT_EXPRESSION_ALWAYS_EVAL_SAME, errorWarningIgnore, errorWarningIgnoreLabels, defaultIndent);
-
-        label= PreferencesMessages.ProblemSeveritiesConfigurationBlock_pb_equality_with_null_always_same; 
-        addComboBox(inner, label, PREF_BINARY_OP_EQUALITY_COMP_WITH_NULL_ALWAYS_EVAL_SAME, errorWarningIgnore, errorWarningIgnoreLabels, defaultIndent);
-
-        label= PreferencesMessages.ProblemSeveritiesConfigurationBlock_pb_enumeration_comparision_always_same; 
-        addComboBox(inner, label, PREF_BINARY_COMPARISON_WITH_ENUM_ALWAYS_SAME, errorWarningIgnore, errorWarningIgnoreLabels, defaultIndent);
-
-        label= PreferencesMessages.ProblemSeveritiesConfigurationBlock_pb_unary_expression_always_evaluates_same; 
-        addComboBox(inner, label, PREF_UNARY_OP_CONSTANT_EXPRESSION_EVAL_SAME, errorWarningIgnore, errorWarningIgnoreLabels, defaultIndent);
-        
-        label= PreferencesMessages.ProblemSeveritiesConfigurationBlock_pb_empty_expression_always_false; 
-        addComboBox(inner, label, PREF_UNARY_OP_EMPTY_ALWAYS_FALSE_ON_TYPE, errorWarningIgnore, errorWarningIgnoreLabels, defaultIndent);          
-
-        label= PreferencesMessages.ProblemSeveritiesConfigurationBlock_pb_minus_on_null_always_zero; 
-        addComboBox(inner, label, PREF_UNARY_OP_MINUS_ON_NULL_ALWAYS_ZERO, errorWarningIgnore, errorWarningIgnoreLabels, defaultIndent);          
-
-        label= PreferencesMessages.ProblemSeveritiesConfigurationBlock_pb_first_argument_short_circuits_expression; 
-        addComboBox(inner, label, PREF_BINARY_OP_FIRST_ARGUMENT_SHORT_CIRCUITS, errorWarningIgnore, errorWarningIgnoreLabels, defaultIndent);          
-
-        label= PreferencesMessages.ProblemSeveritiesConfigurationBlock_pb_second_argument_always_evaluates_same; 
-        addComboBox(inner, label, PREF_BINARY_OP_SECOND_ARGUMENT_ALWAYS_EVAL_SAME, errorWarningIgnore, errorWarningIgnoreLabels, defaultIndent);          
-
-        label= PreferencesMessages.ProblemSeveritiesConfigurationBlock_pb_apply_dot_operator_with_null; 
-        addComboBox(inner, label, PREF_BINARY_OP_DOT_WITH_VALUEB_NULL, errorWarningIgnore, errorWarningIgnoreLabels, defaultIndent);          
-
-        // --- possible programming errors
-        
-        label= PreferencesMessages.ProblemSeveritiesConfigurationBlock_section_programming_errors; 
-        excomposite= createStyleSection(composite, label, nColumns);
-        
-        inner= new Composite(excomposite, SWT.NONE);
-        inner.setFont(composite.getFont());
-        inner.setLayout(new GridLayout(nColumns, false));
-        excomposite.setClient(inner);
-        
-        label= PreferencesMessages.ProblemSeveritiesConfigurationBlock_pb_possible_division_by_zero; 
-        addComboBox(inner, label, PREF_BINARY_OP_POSSIBLE_DIVISION_BY_ZERO, errorWarningIgnore, errorWarningIgnoreLabels, defaultIndent);
-
-        label= PreferencesMessages.ProblemSeveritiesConfigurationBlock_pb_possible_array_index_out_of_bounds; 
-        addComboBox(inner, label, PREF_POSSIBLE_ARRAY_INDEX_OUT_OF_BOUNDS, errorWarningIgnore, errorWarningIgnoreLabels, defaultIndent);        
-    
-        label= PreferencesMessages.ProblemSeveritiesConfigurationBlock_pb_incompatible_enumeration_comparison; 
-        addComboBox(inner, label, PREF_BINARY_OP_COMPARISON_OF_ENUMS_INCOMPATIBLE, errorWarningIgnore, errorWarningIgnoreLabels, defaultIndent);
-
-        // --- type comparison with expected
-        
-        label= PreferencesMessages.ProblemSeveritiesConfigurationBlock_section_type_comparison; 
-        excomposite= createStyleSection(composite, label, nColumns);
-        
-        inner= new Composite(excomposite, SWT.NONE);
-        inner.setFont(composite.getFont());
-        inner.setLayout(new GridLayout(nColumns, false));
-        excomposite.setClient(inner);
-
-        label= PreferencesMessages.ProblemSeveritiesConfigurationBlock_pb_method_expression_expected; 
-        addComboBox(inner, label, PREF_METHOD_EXPRESSION_EXPECTED, errorWarningIgnore, errorWarningIgnoreLabels, defaultIndent);
-
-        label= PreferencesMessages.ProblemSeveritiesConfigurationBlock_pb_incompatible_type_assignment; 
-        addComboBox(inner, label, PREF_INCOMPATIBLE_TYPES, errorWarningIgnore, errorWarningIgnoreLabels, defaultIndent);
-
-        label= PreferencesMessages.ProblemSeveritiesConfigurationBlock_pb_value_expression_expected; 
-        addComboBox(inner, label, PREF_VALUE_EXPRESSION_EXPECTED, errorWarningIgnore, errorWarningIgnoreLabels, defaultIndent);
-
-        label= PreferencesMessages.ProblemSeveritiesConfigurationBlock_pb_incompatible_method_types; 
-        addComboBox(inner, label, PREF_INCOMPATIBLE_METHOD_TYPES, errorWarningIgnore, errorWarningIgnoreLabels, defaultIndent);
-
-        label= PreferencesMessages.ProblemSeveritiesConfigurationBlock_pb_property_not_readable; 
-        addComboBox(inner, label, PREF_PROPERTY_NOT_READABLE, errorWarningIgnore, errorWarningIgnoreLabels, defaultIndent);
-
-        label= PreferencesMessages.ProblemSeveritiesConfigurationBlock_pb_property_not_writable; 
-        addComboBox(inner, label, PREF_PROPERTY_NOT_WRITABLE, errorWarningIgnore, errorWarningIgnoreLabels, defaultIndent);
-
-        new Label(composite, SWT.NONE);
-        
-        IDialogSettings section= JSFUiPlugin.getDefault().getDialogSettings().getSection(SETTINGS_SECTION_NAME);
-        restoreSectionExpansionStates(section);
-        
-        return sc1;
-    }
-    
-    /* (non-javadoc)
-     * Update fields and validate.
-     * @param changedKey Key that changed, or null, if all changed.
-     */ 
-    protected void validateSettings(Key changedKey, String oldValue, String newValue) {
-        if (!areSettingsEnabled()) {
-            return;
-        }
-        
-//        if (changedKey != null) {
-//            if (PREF_PB_UNUSED_PARAMETER.equals(changedKey) ||
-//                    PREF_PB_DEPRECATION.equals(changedKey) ||
-//                    PREF_PB_LOCAL_VARIABLE_HIDING.equals(changedKey) ||
-//                    PREF_PB_UNUSED_DECLARED_THROWN_EXCEPTION.equals(changedKey)) {              
-//                updateEnableStates();
-//            } else if (PREF_PB_SIGNAL_PARAMETER_IN_OVERRIDING.equals(changedKey)) {
-//                // merging the two options
-//                setValue(PREF_PB_SIGNAL_PARAMETER_IN_ABSTRACT, newValue);
-//            } else {
-//                return;
-//            }
-//        } else {
-            updateEnableStates();
-//        }       
-        // TODO: fContext.statusChanged(new StatusInfo());
-    }
-    
-    private void updateEnableStates() {
-//        boolean enableUnusedParams= !checkValue(PREF_PB_UNUSED_PARAMETER, Severity.IGNORE.toString());
-//        getCheckBox(PREF_PB_SIGNAL_PARAMETER_IN_OVERRIDING).setEnabled(enableUnusedParams);
-//        getCheckBox(PREF_PB_UNUSED_PARAMETER_INCLUDE_DOC_COMMENT_REFERENCE).setEnabled(enableUnusedParams);
-//        
-//        boolean enableDeprecation= !checkValue(PREF_PB_DEPRECATION, Severity.IGNORE.toString());
-//        getCheckBox(PREF_PB_DEPRECATION_IN_DEPRECATED_CODE).setEnabled(enableDeprecation);
-//        getCheckBox(PREF_PB_DEPRECATION_WHEN_OVERRIDING).setEnabled(enableDeprecation);
-//        
-//        boolean enableThrownExceptions= !checkValue(PREF_PB_UNUSED_DECLARED_THROWN_EXCEPTION, Severity.IGNORE.toString());
-//        getCheckBox(PREF_PB_UNUSED_DECLARED_THROWN_EXCEPTION_WHEN_OVERRIDING).setEnabled(enableThrownExceptions);
-//
-//        boolean enableHiding= !checkValue(PREF_PB_LOCAL_VARIABLE_HIDING, Severity.IGNORE.toString());
-//        getCheckBox(PREF_PB_SPECIAL_PARAMETER_HIDING_FIELD).setEnabled(enableHiding);
-    }
-
-    protected String[] getFullBuildDialogStrings(boolean workspaceSettings) {
-        String title= PreferencesMessages.ProblemSeveritiesConfigurationBlock_needsbuild_title; 
-        String message;
-        if (workspaceSettings) {
-            message= PreferencesMessages.ProblemSeveritiesConfigurationBlock_needsfullbuild_message; 
-        } else {
-            message= PreferencesMessages.ProblemSeveritiesConfigurationBlock_needsprojectbuild_message; 
-        }
-        return new String[] { title, message };
-    }
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.jdt.internal.ui.preferences.OptionsConfigurationBlock#dispose()
-     */
-    public void dispose() {
-        IDialogSettings section= JSFUiPlugin.getDefault().getDialogSettings().addNewSection(SETTINGS_SECTION_NAME);
-        storeSectionExpansionStates(section);
-        super.dispose();
-    }
-    
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/validation/ScrolledPageContent.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/validation/ScrolledPageContent.java
deleted file mode 100644
index 5cc1771..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/validation/ScrolledPageContent.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Oracle - updated for JSF tools
- *******************************************************************************/
-package org.eclipse.jst.jsf.ui.internal.validation;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.forms.FormColors;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.forms.widgets.SharedScrolledComposite;
-
-
-/**
- * Customized SharedScrolledComposite
- */
-/*package*/ class ScrolledPageContent extends SharedScrolledComposite {
-
-    private FormToolkit fToolkit;
-    
-    /**
-     * @param parent
-     */
-    public ScrolledPageContent(Composite parent) {
-        this(parent, SWT.V_SCROLL | SWT.H_SCROLL);
-    }
-    
-    /**
-     * @param parent
-     * @param style
-     */
-    public ScrolledPageContent(Composite parent, int style) {
-        super(parent, style);
-        
-        setFont(parent.getFont());
-        
-        initDialogsFormToolkit();
-        
-        setExpandHorizontal(true);
-        setExpandVertical(true);
-        
-        Composite body= new Composite(this, SWT.NONE);
-        body.setFont(parent.getFont());
-        setContent(body);
-    }
-    
-    private FormToolkit initDialogsFormToolkit()
-    {
-        if (fToolkit == null) {
-            FormColors colors= new FormColors(Display.getCurrent());
-            colors.setBackground(null);
-            colors.setForeground(null); 
-            fToolkit= new FormToolkit(colors);
-        }
-        return fToolkit;
-    }
-    
-    /**
-     * @param childControl
-     */
-    public void adaptChild(Control childControl) {
-        fToolkit.adapt(childControl, true, true);
-    }
-    
-    /**
-     * @return the content composite
-     */
-    public Composite getBody() {
-        return (Composite) getContent();
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/validation/SeverityOverrideStrategy.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/validation/SeverityOverrideStrategy.java
deleted file mode 100644
index 18cd3ca..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/validation/SeverityOverrideStrategy.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.ui.internal.validation;
-
-import org.eclipse.emf.common.util.Diagnostic;
-import org.eclipse.jst.jsf.common.internal.strategy.IIdentifiableStrategy;
-
-/**
- * A strategy for overriding the severity of diagnostics.
- */
-abstract class SeverityOverrideStrategy implements IIdentifiableStrategy<Diagnostic, Integer, String>
-{
-    private final String        _id;
-
-    public SeverityOverrideStrategy(final String id)
-    {
-        _id = id;
-    }
-
-    public abstract Integer override(Diagnostic diagnostic);
-
-    public abstract String getDisplayName();
-
-    public Integer getNoResult()
-    {
-        return Integer.valueOf(-1);
-    }
-
-    public final Integer perform(Diagnostic diagnostic) throws Exception
-    {
-        return override(diagnostic);
-    }
-
-    public final String getId()
-    {
-        return _id;
-    }
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/validation/ValidationMessageFactory.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/validation/ValidationMessageFactory.java
deleted file mode 100644
index c2614d5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/validation/ValidationMessageFactory.java
+++ /dev/null
@@ -1,200 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- * 
- ********************************************************************************/
-package org.eclipse.jst.jsf.ui.internal.validation;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.emf.common.util.Diagnostic;
-import org.eclipse.jst.jsf.common.internal.types.TypeComparatorDiagnosticFactory;
-import org.eclipse.jst.jsf.validation.internal.ELValidationPreferences;
-import org.eclipse.jst.jsf.validation.internal.JSFTypeComparatorPreferences;
-import org.eclipse.jst.jsf.validation.internal.ValidationPreferences;
-import org.eclipse.jst.jsf.validation.internal.el.diagnostics.DiagnosticFactory;
-import org.eclipse.jst.jsf.validation.internal.facelet.FaceletDiagnosticFactory;
-import org.eclipse.jst.jsf.validation.internal.facelet.FaceletValidationPreferences;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
-import org.eclipse.wst.validation.internal.core.Message;
-import org.eclipse.wst.validation.internal.provisional.core.IMessage;
-
-/**
- * Creates configured validation Message objects.
- * 
- * @author cbateman
- * 
- */
-public final class ValidationMessageFactory
-{
-    private final Map<String, SeverityOverrideStrategy> _strategies;
-    private IStructuredModel _model = null;
-
-    /**
-     * @param prefs
-     * @param model
-     */
-    public ValidationMessageFactory(final ValidationPreferences prefs,
-            final IStructuredModel model)
-    {
-        _model = model;
-        _strategies = new HashMap<String, SeverityOverrideStrategy>();
-        _strategies.put(DiagnosticFactory.SOURCE_ID,
-                new ELSeverityOverrideStrategy(prefs));
-        _strategies.put(TypeComparatorDiagnosticFactory.SOURCE_IDENTIFIER,
-                new TypeComparatorOverrideStrategy(prefs));
-        _strategies.put(FaceletDiagnosticFactory.SOURCE_ID,
-                new FaceletSeverityOverrideStrategy(prefs));
-    }
-
-    /**
-     * @param diagnostic
-     * @param offset
-     * @param length
-     * @param file
-     * @return a configured message
-     */
-    public Message createFromDiagnostic(final Diagnostic diagnostic,
-            final int offset, final int length, final IFile file)
-    {
-        int severity = diagnostic.getSeverity();
-        final String sourceId = diagnostic.getSource();
-        final SeverityOverrideStrategy strategy = _strategies.get(sourceId);
-        // only override if there's a strategy to do so
-        if (strategy != null)
-        {
-            final Integer value = strategy.override(diagnostic);
-            if (value != null)
-            {
-                severity = value.intValue();
-            }
-        }
-        final Message message = new MyLocalizedMessage(
-                convertSeverity(severity), diagnostic.getMessage(), file,
-                diagnostic.getCode());
-        message.setOffset(offset);
-        message.setLength(length);
-        if (this._model != null)
-        {
-            IStructuredDocument flatModel = this._model.getStructuredDocument();
-            if (flatModel != null)
-            {
-                int line = flatModel.getLineOfOffset(message.getOffset());
-                if (line >= 0)
-                    message.setLineNo(line + 1);
-            }
-        }
-        return message;
-    }
-
-    /**
-     * @param severity
-     * @return a Message severity equivilent to diagnostic.getSeverity()
-     */
-    private int convertSeverity(final int severity)
-    {
-        switch (severity)
-        {
-            case Diagnostic.ERROR:
-                return IMessage.HIGH_SEVERITY;
-            case Diagnostic.WARNING:
-                return IMessage.NORMAL_SEVERITY;
-            case Diagnostic.INFO:
-                return IMessage.LOW_SEVERITY;
-            case Diagnostic.OK:
-            default:
-                // no bits set
-                return 0;
-        }
-    }
-
-    private static class ELSeverityOverrideStrategy extends
-            SeverityOverrideStrategy
-    {
-        private final ValidationPreferences _prefs;
-
-        public ELSeverityOverrideStrategy(final ValidationPreferences prefs)
-        {
-            super(DiagnosticFactory.SOURCE_ID);
-            _prefs = prefs;
-        }
-
-        @Override
-        public Integer override(final Diagnostic diagnostic)
-        {
-            final int code = diagnostic.getCode();
-            final ELValidationPreferences elPrefs = _prefs.getElPrefs();
-            return Integer.valueOf(elPrefs.getDiagnosticSeverity(code));
-        }
-
-        @Override
-        public String getDisplayName()
-        {
-            return Messages.ValidationMessageFactory_DefaultElSeverityDisplayName;
-        }
-    }
-
-    private static class TypeComparatorOverrideStrategy extends
-            SeverityOverrideStrategy
-    {
-        private final ValidationPreferences _prefs;
-
-        public TypeComparatorOverrideStrategy(final ValidationPreferences prefs)
-        {
-            super(TypeComparatorDiagnosticFactory.SOURCE_IDENTIFIER);
-            _prefs = prefs;
-        }
-
-        @Override
-        public Integer override(final Diagnostic diagnostic)
-        {
-            final int code = diagnostic.getCode();
-            final JSFTypeComparatorPreferences jsfTypeCompPrefs = _prefs
-                    .getTypeComparatorPrefs();
-            return Integer
-                    .valueOf(jsfTypeCompPrefs.getDiagnosticSeverity(code));
-        }
-
-        @Override
-        public String getDisplayName()
-        {
-            return Messages.ValidationMessageFactory_DefaultTypeComparatorDisplayName;
-        }
-    }
-
-    private static class FaceletSeverityOverrideStrategy extends
-            SeverityOverrideStrategy
-    {
-        private final ValidationPreferences _prefs;
-
-        public FaceletSeverityOverrideStrategy(final ValidationPreferences prefs)
-        {
-            super(FaceletDiagnosticFactory.SOURCE_ID);
-            _prefs = prefs;
-        }
-
-        @Override
-        public Integer override(final Diagnostic diagnostic)
-        {
-            final int code = diagnostic.getCode();
-            final FaceletValidationPreferences faceletPrefs = _prefs
-                    .getFaceletValidationPrefs();
-            return Integer.valueOf(faceletPrefs.getDiagnosticSeverity(code));
-        }
-
-        @Override
-        public String getDisplayName()
-        {
-            return Messages.ValidationMessageFactory_DefaultFaceletSeverityDisplayName;
-        }
-    }
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/validation/ValidationReporter.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/validation/ValidationReporter.java
deleted file mode 100644
index 3f4ecd2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/validation/ValidationReporter.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.ui.internal.validation;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.emf.common.util.Diagnostic;
-import org.eclipse.jst.jsf.validation.internal.IJSFViewValidator;
-import org.eclipse.jst.jsf.validation.internal.ValidationPreferences;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.eclipse.wst.validation.internal.provisional.core.IMessage;
-import org.eclipse.wst.validation.internal.provisional.core.IReporter;
-import org.eclipse.wst.validation.internal.provisional.core.IValidator;
-
-/*package*/class ValidationReporter implements
-        IJSFViewValidator.IValidationReporter
-{
-    private final IValidator            _validator;
-    private final IReporter             _reporter;
-    private final IFile                 _file;
-    private final ValidationMessageFactory  _factory;
-    
-    public ValidationReporter(final IValidator validator,
-            final IReporter reporter, final IFile file,
-            final ValidationPreferences prefs, final IStructuredModel model)
-    {
-        _validator = validator;
-        _reporter = reporter;
-        _file = file;
-        _factory = new ValidationMessageFactory(prefs, model);
-    }
-
-    public void report(final Diagnostic problem, final int start,
-            final int length)
-    {
-        final IMessage message = _factory.createFromDiagnostic(
-                problem, start, length, _file);
-
-        if ((message.getSeverity() & IMessage.ALL_MESSAGES) != 0)
-        {
-            _reporter.addMessage(_validator, message);
-        }
-    }
-
-    public void report(IMessage message)
-    {
-        if ((message.getSeverity() & IMessage.ALL_MESSAGES) != 0)
-        {
-            _reporter.addMessage(_validator, message);
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/validation/messages.properties b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/validation/messages.properties
deleted file mode 100644
index 0269f0d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/validation/messages.properties
+++ /dev/null
@@ -1,75 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-#     John Kaplan, johnkaplantech@gmail.com - 108071 [code templates] template for body of newly created class
-#     Cameron Bateman/Oracle - adapted for use in JSF validation tooling
-###############################################################################
-
-ProblemSeveritiesPreferencePage_title=Problem Severities
-
-ProblemSeveritiesConfigurationBlock_error=Error
-ProblemSeveritiesConfigurationBlock_warning=Warning
-ProblemSeveritiesConfigurationBlock_ignore=Ignore
-
-ProblemSeveritiesConfigurationBlock_section_id_resolution=&Identifier Resolution
-ProblemSeveritiesConfigurationBlock_section_general=&General Problems
-ProblemSeveritiesConfigurationBlock_section_type_coercion_problems=&Type Coercion Problems
-ProblemSeveritiesConfigurationBlock_section_constant_folding_and_unused_code=&Constant folding and unused code
-ProblemSeveritiesConfigurationBlock_section_programming_errors=&Possible programming errors
-ProblemSeveritiesConfigurationBlock_section_type_comparison=Type &Assignment Problems
-
-ProblemSeveritiesConfigurationBlock_needsbuild_title=Error/Warning Settings Changed
-ProblemSeveritiesConfigurationBlock_needsfullbuild_message=The Error/Warning settings have changed. You will need to rebuild or revalidate for these changes to take effect.
-ProblemSeveritiesConfigurationBlock_needsprojectbuild_message=The Error/Warning settings have changed. A rebuild of the project is required for changes to take effect. Build the project now?
-ProblemSeveritiesConfigurationBlock_buildwarning_dont_show_again=Don't show this dialog again
-
-ProblemSeveritiesConfigurationBlock_common_description=Select the severity level for the following problems
-
-ProblemSeveritiesConfigurationBlock_pb_general_syntax_error=General Syntax Error
-ProblemSeveritiesConfigurationBlock_pb_empty_el_expression=Empty EL expression
-ProblemSeveritiesConfigurationBlock_pb_missing_closing_expr_bracket=Missing closing bracket on expression
-ProblemSeveritiesConfigurationBlock_pb_cannot_apply_operator_to_method_binding=Applying operator to method binding
-ProblemSeveritiesConfigurationBlock_pb_dotted_property_key_should_use_array=Dotted property names should use array ([]) syntax
-
-ProblemSeveritiesConfigurationBlock_pb_variable_not_found=Variable not found
-ProblemSeveritiesConfigurationBlock_pb_member_not_found=Member not found
-ProblemSeveritiesConfigurationBlock_pb_member_is_intermediate=Member is intermediate
-
-ProblemSeveritiesConfigurationBlock_pb_binary_op_numeric_coercion_error=Binary operation number coercion problems
-ProblemSeveritiesConfigurationBlock_pb_binary_op_boolean_coercion_error=Binary operation boolean coercion problems
-ProblemSeveritiesConfigurationBlock_pb_binary_op_no_coercion_available=Binary operation no available coercions
-ProblemSeveritiesConfigurationBlock_pb_binary_op_literal_to_number_coercion_error=Binary coercion of literal to number
-ProblemSeveritiesConfigurationBlock_pb_unary_op_numeric_coercion_error=Unary operation number coercion problems
-ProblemSeveritiesConfigurationBlock_pb_unary_op_boolean_coercion_error=Unary operation boolean coercion problems
-ProblemSeveritiesConfigurationBlock_pb_unary_op_string_coercion_not_guaranteed=Unary operation string coercion not guaranteed
-
-ProblemSeveritiesConfigurationBlock_pb_both_binary_operands_null=Both operands null
-ProblemSeveritiesConfigurationBlock_pb_binary_expression_always_evaluates_same=Binary expression always evaluates to same value
-ProblemSeveritiesConfigurationBlock_pb_equality_with_null_always_same=Equality comparison with null always evaluates to same value
-ProblemSeveritiesConfigurationBlock_pb_unary_expression_always_evaluates_same=Unary expression always evaluates to same value
-ProblemSeveritiesConfigurationBlock_pb_empty_expression_always_false=Empty operator always resolves to false on type
-ProblemSeveritiesConfigurationBlock_pb_enumeration_comparision_always_same=Enumeration comparison always evaluates to same value
-ProblemSeveritiesConfigurationBlock_pb_minus_on_null_always_zero=Minus applied to null always evaluates to zero
-ProblemSeveritiesConfigurationBlock_pb_first_argument_short_circuits_expression=First argument short-circuits expression
-ProblemSeveritiesConfigurationBlock_pb_second_argument_always_evaluates_same=Second argument always evaluates the same
-ProblemSeveritiesConfigurationBlock_pb_apply_dot_operator_with_null=Applying the dot ('.') operator with null always returns null
-
-ProblemSeveritiesConfigurationBlock_pb_possible_division_by_zero=Possible division by zero
-ProblemSeveritiesConfigurationBlock_pb_possible_array_index_out_of_bounds=Possible array index out of bounds
-ProblemSeveritiesConfigurationBlock_pb_incompatible_enumeration_comparison=Incompatible enumeration comparison
-
-ProblemSeveritiesConfigurationBlock_pb_method_expression_expected=Method expression expected
-ProblemSeveritiesConfigurationBlock_pb_incompatible_type_assignment=Value expression type incompatibility
-ProblemSeveritiesConfigurationBlock_pb_value_expression_expected= Value expression expected
-ProblemSeveritiesConfigurationBlock_pb_incompatible_method_types=Method expression signature incompatibility
-ProblemSeveritiesConfigurationBlock_pb_property_not_readable=Property expected to be readable but has no getter
-ProblemSeveritiesConfigurationBlock_pb_property_not_writable=Property expected to be writable but has no setter
-ValidationMessageFactory_DefaultElSeverityDisplayName=EL Preference Severities
-ValidationMessageFactory_DefaultTypeComparatorDisplayName=Type Comparison Preference Severities
-ValidationMessageFactory_DefaultFaceletSeverityDisplayName=Facelet Preference Severities
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/.classpath b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/.classpath
deleted file mode 100644
index 304e861..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/.cvsignore b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/.cvsignore
deleted file mode 100644
index f9eb27a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/.cvsignore
+++ /dev/null
@@ -1,3 +0,0 @@
-build.xml
-@dot
-javaCompiler...args
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/.project b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/.project
deleted file mode 100644
index 2cf9838..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.jst.pagedesigner.jsf.ui</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/.settings/org.eclipse.core.resources.prefs b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/.settings/org.eclipse.core.resources.prefs
deleted file mode 100644
index 8fcb2c1..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/.settings/org.eclipse.core.resources.prefs
+++ /dev/null
@@ -1,3 +0,0 @@
-#Sun May 27 16:05:18 EDT 2007
-eclipse.preferences.version=1
-encoding/<project>=ISO-8859-1
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/.settings/org.eclipse.jdt.core.prefs b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 16e5442..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,82 +0,0 @@
-#Mon Jun 30 15:58:09 PDT 2008
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=disabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.5
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.doc.comment.support=enabled
-org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.autoboxing=warning
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=ignore
-org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
-org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
-org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
-org.eclipse.jdt.core.compiler.problem.invalidJavadoc=error
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocComments=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.missingJavadocTags=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=error
-org.eclipse.jdt.core.compiler.problem.nullReference=ignore
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
-org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore
-org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=ignore
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=ignore
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=error
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=error
-org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
-org.eclipse.jdt.core.compiler.problem.unusedLocal=error
-org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
-org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
-org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.5
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/.settings/org.eclipse.jdt.ui.prefs b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644
index 82eb6c1..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,3 +0,0 @@
-#Fri Apr 06 18:25:15 PDT 2007
-eclipse.preferences.version=1
-org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8"?><templates/>
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/.settings/org.eclipse.pde.prefs b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/.settings/org.eclipse.pde.prefs
deleted file mode 100644
index 753d576..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/.settings/org.eclipse.pde.prefs
+++ /dev/null
@@ -1,22 +0,0 @@
-#Fri May 30 11:59:54 PDT 2008
-compilers.f.unresolved-features=1
-compilers.f.unresolved-plugins=1
-compilers.incompatible-environment=1
-compilers.p.build=1
-compilers.p.deprecated=1
-compilers.p.discouraged-class=1
-compilers.p.internal=1
-compilers.p.missing-packages=0
-compilers.p.no-required-att=0
-compilers.p.not-externalized-att=0
-compilers.p.unknown-attribute=1
-compilers.p.unknown-class=1
-compilers.p.unknown-element=1
-compilers.p.unknown-identifier=1
-compilers.p.unknown-resource=1
-compilers.p.unresolved-ex-points=0
-compilers.p.unresolved-import=0
-compilers.s.create-docs=false
-compilers.s.doc-folder=doc
-compilers.s.open-tags=1
-eclipse.preferences.version=1
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/META-INF/MANIFEST.MF b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/META-INF/MANIFEST.MF
deleted file mode 100644
index eedcce2..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,41 +0,0 @@
-Manifest-Version: 1.0
-Bundle-Name: %pluginName
-Bundle-SymbolicName: org.eclipse.jst.pagedesigner.jsf.ui;singleton:=true
-Bundle-Version: 1.2.0.qualifier
-Bundle-Activator: org.eclipse.jst.pagedesigner.jsf.ui.JSFUIPlugin
-Bundle-Vendor: %providerName
-Bundle-Localization: plugin
-Require-Bundle: org.eclipse.jst.jsf.facesconfig;bundle-version="[1.1.0,2.0.0)",
- org.eclipse.jst.pagedesigner;bundle-version="[1.1.0,2.0.0)",
- org.eclipse.jst.pagedesigner.jsp.core;bundle-version="[1.1.0,2.0.0)",
- org.eclipse.wst.common.modulecore;bundle-version="[1.1.0,2.0.0)",
- org.eclipse.jst.jsf.common.ui;bundle-version="[1.1.0,2.0.0)",
- org.eclipse.jst.jsf.core;bundle-version="[1.1.0,2.0.0)",
- org.eclipse.jst.jsf.common;bundle-version="[1.1.0,2.0.0)",
- org.eclipse.wst.sse.core;bundle-version="[1.1.0,1.2.0)",
- org.eclipse.wst.xml.core;bundle-version="[1.1.0,1.2.0)",
- org.eclipse.core.runtime;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.gef;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.core.resources;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.jdt.core;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.ui.ide;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.ui.views.properties.tabbed;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.emf.ecore;bundle-version="[2.5.0,3.0.0)",
- org.eclipse.jface.text;bundle-version="[3.5.0,4.0.0)"
-Bundle-ActivationPolicy: lazy
-Bundle-ManifestVersion: 2
-Export-Package: org.eclipse.jst.pagedesigner.jsf.core.dom;x-internal:=true,
- org.eclipse.jst.pagedesigner.jsf.ui;x-internal:=true,
- org.eclipse.jst.pagedesigner.jsf.ui.actions;x-internal:=true,
- org.eclipse.jst.pagedesigner.jsf.ui.attributegroup;x-internal:=true,
- org.eclipse.jst.pagedesigner.jsf.ui.commands.jsfhtml;x-internal:=true,
- org.eclipse.jst.pagedesigner.jsf.ui.converter.jsfcore;x-internal:=true,
- org.eclipse.jst.pagedesigner.jsf.ui.converter.jsfhtml;x-internal:=true,
- org.eclipse.jst.pagedesigner.jsf.ui.converter.operations.jsf;x-internal:=true,
- org.eclipse.jst.pagedesigner.jsf.ui.elementedit.jsfcore;x-internal:=true,
- org.eclipse.jst.pagedesigner.jsf.ui.elementedit.jsfhtml;x-internal:=true,
- org.eclipse.jst.pagedesigner.jsf.ui.elementedit.request;x-internal:=true,
- org.eclipse.jst.pagedesigner.jsf.ui.elementedit.util;x-internal:=true,
- org.eclipse.jst.pagedesigner.jsf.ui.sections;x-internal:=true,
- org.eclipse.jst.pagedesigner.jsf.ui.util;x-internal:=true
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/about.html b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/about.html
deleted file mode 100644
index 90bd74d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/about.html
+++ /dev/null
@@ -1,22 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<head>
-<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
-<title>About</title>
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>June, 2008</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise indicated below, the Content is provided to you under the terms and conditions of the
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content.</p>
-
-</body>
-</html>
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/build.properties b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/build.properties
deleted file mode 100644
index d277d8f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/build.properties
+++ /dev/null
@@ -1,20 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2008 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-source.. = src/
-output.. = bin/
-bin.includes = .,\
-			   plugin.xml,\
-               META-INF/,\
-               plugin.properties,\
-               about.html,\
-               icons/
-javacSource=1.5
-javacTarget=1.5
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/column_select.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/column_select.gif
deleted file mode 100644
index f9dc006..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/column_select.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/plugin.properties b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/plugin.properties
deleted file mode 100644
index 5f40d6e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/plugin.properties
+++ /dev/null
@@ -1,15 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-####################################################
-# Plugin XML information.
-####################################################
-pluginName=JavaServer Faces Tools - Pagedesigner UI
-providerName=Eclipse.org
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/plugin.xml b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/plugin.xml
deleted file mode 100644
index cb0ccd1..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/plugin.xml
+++ /dev/null
@@ -1,173 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.2"?>
-<plugin>
-
-	<!-- page variables -->
-	<extension point="org.eclipse.jst.pagedesigner.jsp.core.pageVar">
-		<taglib uri="http://java.sun.com/jsf/html">
-
-			<tag varTypeStringIsAttr="true" varNameIsAttr="true"
-				varTypeMode="EXPRESSION_COLLECTION_ITEM" varTypeString="value"
-				varName="var" tagName="dataTable" />
-		</taglib>
-		<taglib uri="http://java.sun.com/jsf/core">
-			<tag varTypeStringIsAttr="true" varNameIsAttr="true"
-				varTypeMode="BUNDLE" varTypeString="basename" varName="var"
-				tagName="loadBundle" />
-		</taglib>
-	</extension>
-	<extension
-		point="org.eclipse.ui.views.properties.tabbed.propertySections">
-		<propertySections
-			contributorId="org.eclipse.jst.pagedesigner.tabPropertyContributor">
-			<propertySection
-				class="org.eclipse.jst.pagedesigner.jsf.ui.sections.JSFCoreConvertDateTimeGroup"
-				tab="org.eclipse.jst.pagedesigner.tabQuickEdit"
-				id="section.general.convertDateTime">
-			</propertySection>
-			<propertySection
-				class="org.eclipse.jst.pagedesigner.jsf.ui.sections.JSFCoreConvertNumberGroup"
-				tab="org.eclipse.jst.pagedesigner.tabQuickEdit"
-				id="section.general.convertNumber">
-			</propertySection>
-			<propertySection
-				class="org.eclipse.jst.pagedesigner.jsf.ui.sections.JSFHtmlActionListenerSection"
-				tab="org.eclipse.jst.pagedesigner.tabQuickEdit"
-				id="section.general.commandButton.listener">
-			</propertySection>
-			<propertySection
-				class="org.eclipse.jst.pagedesigner.jsf.ui.sections.JSFHtmlActionListenerSection"
-				tab="org.eclipse.jst.pagedesigner.tabQuickEdit"
-				id="section.general.commandLink.listener">
-			</propertySection>
-			<propertySection
-				class="org.eclipse.jst.pagedesigner.jsf.ui.sections.JSFHtmlDataTableColumnsSection"
-				tab="org.eclipse.jst.pagedesigner.tabQuickEdit"
-				id="section.general.dataTable.columns">
-			</propertySection>
-			<propertySection
-				class="org.eclipse.jst.pagedesigner.jsf.ui.sections.JSFHtmlInputHiddenTypeSection"
-				tab="org.eclipse.jst.pagedesigner.tabQuickEdit"
-				id="section.general.inputHidden.type">
-			</propertySection>
-
-			<propertySection
-				class="org.eclipse.jst.pagedesigner.jsf.ui.sections.JSFHtmlInputSecretTypeSection"
-				tab="org.eclipse.jst.pagedesigner.tabQuickEdit"
-				id="section.general.inputSecret.type">
-			</propertySection>
-			<propertySection
-				class="org.eclipse.jst.pagedesigner.jsf.ui.sections.JSFHtmlInputOthersSection"
-				tab="org.eclipse.jst.pagedesigner.tabQuickEdit"
-				id="section.general.inputText.others">
-			</propertySection>
-			<propertySection
-				class="org.eclipse.jst.pagedesigner.jsf.ui.sections.JSFHtmlInputTextTypeSection"
-				tab="org.eclipse.jst.pagedesigner.tabQuickEdit"
-				id="section.general.inputText.type">
-			</propertySection>
-			<propertySection
-				class="org.eclipse.jst.pagedesigner.jsf.ui.sections.JSFHtmlInputOthersSection"
-				tab="org.eclipse.jst.pagedesigner.tabQuickEdit"
-				id="section.general.inputText.others">
-			</propertySection>
-			<propertySection
-				afterSection="section.general.inputTextarea"
-				class="org.eclipse.jst.pagedesigner.jsf.ui.sections.JSFHtmlInputTextareaTypeSection"
-				tab="org.eclipse.jst.pagedesigner.tabQuickEdit"
-				id="section.general.inputTextarea.type">
-			</propertySection>
-			<propertySection
-				afterSection="section.general.inputTextarea.type"
-				class="org.eclipse.jst.pagedesigner.jsf.ui.sections.JSFHtmlInputOthersSection"
-				tab="org.eclipse.jst.pagedesigner.tabQuickEdit"
-				id="section.general.inputTextarea.others">
-			</propertySection>
-			<propertySection
-				class="org.eclipse.jst.pagedesigner.jsf.ui.sections.JSFHtmlOutputFormatParamsSection"
-				tab="org.eclipse.jst.pagedesigner.tabQuickEdit"
-				id="section.general.outputFormat.params">
-			</propertySection>
-			<propertySection
-				class="org.eclipse.jst.pagedesigner.jsf.ui.sections.JSFHtmlOutputTextConverterSection"
-				tab="org.eclipse.jst.pagedesigner.tabQuickEdit"
-				id="section.general.outputText.converter">
-			</propertySection>
-			<propertySection
-				class="org.eclipse.jst.pagedesigner.jsf.ui.sections.JSFHtmlSelectChoicesSection"
-				tab="org.eclipse.jst.pagedesigner.tabQuickEdit"
-				id="section.general.selectManyCheckbox.choices">
-			</propertySection>
-			<propertySection
-				class="org.eclipse.jst.pagedesigner.jsf.ui.sections.JSFHtmlSelectChoicesSection"
-				tab="org.eclipse.jst.pagedesigner.tabQuickEdit"
-				id="section.general.selectManyListbox.choices">
-			</propertySection>
-			<propertySection
-				class="org.eclipse.jst.pagedesigner.jsf.ui.sections.JSFHtmlSelectChoicesSection"
-				tab="org.eclipse.jst.pagedesigner.tabQuickEdit"
-				id="section.general.selectManyMenu.choices">
-			</propertySection>
-			<propertySection
-				class="org.eclipse.jst.pagedesigner.jsf.ui.sections.JSFHtmlSelectChoicesSection"
-				tab="org.eclipse.jst.pagedesigner.tabQuickEdit"
-				id="section.general.selectOneListbox.choices">
-			</propertySection>
-			<propertySection
-				class="org.eclipse.jst.pagedesigner.jsf.ui.sections.JSFHtmlSelectChoicesSection"
-				tab="org.eclipse.jst.pagedesigner.tabQuickEdit"
-				id="section.general.selectOneMenu.choices">
-			</propertySection>
-			<propertySection
-				class="org.eclipse.jst.pagedesigner.jsf.ui.sections.JSFHtmlSelectChoicesSection"
-				tab="org.eclipse.jst.pagedesigner.tabQuickEdit"
-				id="section.general.selectOneRadio.choices">
-			</propertySection>
-		</propertySections>
-	</extension>
-
-	<extension
-		point="org.eclipse.jst.pagedesigner.pageDesignerExtension">
-		<elementEditFactory
-			class="org.eclipse.jst.pagedesigner.jsf.ui.elementedit.jsfhtml.JSFHTMLElementEditFactory" />
-		<elementEditFactory
-			class="org.eclipse.jst.pagedesigner.jsf.ui.elementedit.jsfcore.JSFCoreElementEditFactory" />
-		<linkCreator
-			class="org.eclipse.jst.pagedesigner.jsf.ui.actions.JSFCommandLinkCreator"
-			linkIdentifier="JSF CommandLink" />
-		<linkCreator
-			class="org.eclipse.jst.pagedesigner.jsf.ui.actions.JSFOutputLinkCreator"
-			linkIdentifier="JSF OutputLink" />
-		<tagTransformOperation
-			class="org.eclipse.jst.pagedesigner.jsf.ui.converter.operations.jsf.ColumnOperation"
-			id="ColumnOperation">
-		</tagTransformOperation>
-		<tagTransformOperation
-			class="org.eclipse.jst.pagedesigner.jsf.ui.converter.operations.jsf.DataTableOperation"
-			id="DataTableOperation">
-		</tagTransformOperation>
-		<tagTransformOperation
-			class="org.eclipse.jst.pagedesigner.jsf.ui.converter.operations.jsf.PanelGridOperation"
-			id="PanelGridOperation">
-		</tagTransformOperation>
-		<tagTransformOperation
-			class="org.eclipse.jst.pagedesigner.jsf.ui.converter.operations.jsf.SelectManyCheckboxOperation"
-			id="SelectManyCheckboxOperation">
-		</tagTransformOperation>
-		<tagTransformOperation
-			class="org.eclipse.jst.pagedesigner.jsf.ui.converter.operations.jsf.SelectOneRadioOperation"
-			id="SelectOneRadioOperation">
-		</tagTransformOperation>
-		<tagTransformOperation
-			class="org.eclipse.jst.pagedesigner.jsf.ui.converter.operations.jsf.LoadBundleOperation"
-			id="LoadBundleOperation">
-		</tagTransformOperation>
-	</extension>
-
-	<extension
-		point="org.eclipse.jst.pagedesigner.popupMenuContributor">
-		<menuItemContributor
-			class="org.eclipse.jst.pagedesigner.jsf.ui.actions.PageFlowContributor"
-			URI="http://java.sun.com/jsf/core" />
-	</extension>
-</plugin>
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/core/dom/JSFDOMUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/core/dom/JSFDOMUtil.java
deleted file mode 100644
index 99fa2a9..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/core/dom/JSFDOMUtil.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.core.dom;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-import org.eclipse.jst.jsf.core.internal.tld.CMUtil;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class JSFDOMUtil
-{
-
-    /**
-     * @param parentEle 
-     * @param name 
-     * @return the facet element or null if not found
-     */
-    public static Element findFacet(Element parentEle, String name)
-    {
-        NodeList childnodes = parentEle.getChildNodes();
-        for (int i=0, size=childnodes.getLength(); i<size; i++)
-        {
-            Node node = childnodes.item(i);
-            if (node.getNodeType() == Node.ELEMENT_NODE && JSFDOMUtil.isFacet((Element)node))
-            {
-                Element ele = (Element) node;
-                if (name.equals(ele.getAttribute("name"))) //$NON-NLS-1$
-                {
-                    return ele;
-                }
-            }
-        }
-        return null;
-    }
-
-    /**
-     * @param node
-     * @return true if node is a JSF column
-     */
-    public static boolean isHColumn(Node node)
-    {
-        if (node instanceof Element)
-        {
-            Element ele = (Element) node;
-            if ("column".equalsIgnoreCase(ele.getLocalName()) && ITLDConstants.URI_JSF_HTML.equals(CMUtil.getElementNamespaceURI(ele))) //$NON-NLS-1$
-            {
-                return true;
-            }
-        }
-
-        return false;
-    }
-
-    /**
-     * @param panelGridEle
-     * @return the list of UI component children
-     */
-    public static List getUIComponentChildren(Element panelGridEle)
-    {
-        // XXX: temp implementation. Later may move this out to be shared.
-        // currently just returning all children Element. Need to filter out things like non JSF UI component
-        List list = new ArrayList();
-        NodeList childnodes = panelGridEle.getChildNodes();
-        for (int i=0, size=childnodes.getLength(); i<size; i++)
-        {
-            Node node = childnodes.item(i);
-            if (node.getNodeType() == Node.ELEMENT_NODE)
-            {
-                if (JSFDOMUtil.isFacet((Element) node))
-                {
-                    continue;
-                }
-                list.add(node);
-            }
-        }
-        return list;
-    }
-
-    /**
-     * @param ele
-     * @return true if ele is a facet
-     */
-    public static boolean isFacet(Element ele)
-    {
-        // XXX: here we are not checking namespace! for error tolerant.
-        return "facet".equals(ele.getLocalName()); //$NON-NLS-1$
-    }
-
-    /**
-     * @param ele 
-     * @return true if the local name of ele is "param"
-     */
-    public static boolean isUIParameter(Element ele)
-    {
-        return "param".equals(ele.getLocalName()); //$NON-NLS-1$
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/JSFUIPlugin.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/JSFUIPlugin.java
deleted file mode 100644
index f67d22e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/JSFUIPlugin.java
+++ /dev/null
@@ -1,193 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui;
-
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-import org.eclipse.core.runtime.ILog;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.resource.ImageRegistry;
-import org.eclipse.jst.jsf.common.ui.IFileFolderConstants;
-import org.eclipse.jst.jsf.common.ui.JSFUICommonPlugin;
-import org.eclipse.jst.jsf.common.ui.internal.guiutils.Alerts;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.osgi.framework.BundleContext;
-
-/**
- * The main plugin class to be used in the desktop.
- */
-public class JSFUIPlugin extends AbstractUIPlugin
-{
-    //The shared instance.
-    private static JSFUIPlugin _plugin;
-    //Resource bundle.
-    private ResourceBundle     _resourceBundle;
-    private URL                _pluginBase;
-
-    private static Logger      _logger;
-    private static Alerts      _alerts;
-
-    /**
-     * The constructor.
-     */
-    public JSFUIPlugin()
-    {
-        super();
-        _plugin = this;
-        try
-        {
-            _resourceBundle = ResourceBundle.getBundle("org.eclipse.jst.pagedesigner.jsf.ui.JSFUIPluginResources"); //$NON-NLS-1$
-        }
-        catch (MissingResourceException x)
-        {
-            _resourceBundle = null;
-        }
-    }
-
-    /**
-     * This method is called upon plug-in activation
-     */
-    public void start(BundleContext context) throws Exception
-    {
-        super.start(context);
-        _alerts = new Alerts(this, _resourceBundle);
-        _logger = JSFUICommonPlugin.getLogger(JSFUIPlugin.class);
-//        _logger.setResourceBundle(_resourceBundle);
-        _pluginBase = getBundle().getEntry("/"); //$NON-NLS-1$
-    }
-
-    /**
-     * get the alerts objects associated with this plugin for alerting the user.
-     * @return the alerts
-     */
-    public static Alerts getAlerts()
-    {
-        return _alerts;
-    }
-
-    /**
-     * This method is called when the plug-in is stopped
-     */
-    public void stop(BundleContext context) throws Exception
-    {
-        super.stop(context);
-    }
-
-    /**
-     * Returns the shared instance.
-     * @return the default plugin
-     */
-    public static JSFUIPlugin getDefault()
-    {
-        return _plugin;
-    }
-
-    /**
-     * Returns the string from the plugin's resource bundle,
-     * or 'key' if not found.
-     * @param key 
-     * @return the resource string for key or 'key' if not found
-     */
-    public static String getResourceString(String key)
-    {
-        ResourceBundle bundle = JSFUIPlugin.getDefault().getResourceBundle();
-        try
-        {
-            return (bundle != null) ? bundle.getString(key) : key;
-        }
-        catch (MissingResourceException e)
-        {
-            return key;
-        }
-    }
-
-    /**
-     * Returns the plugin's resource bundle,
-     * @return the resource bundle
-     */
-    public ResourceBundle getResourceBundle()
-    {
-        return _resourceBundle;
-    }
-
-    /**
-     * Return an image from the path
-     * @param name
-     * @return Image
-     */
-    public Image getImage(String name)
-    {
-        if (name == null)
-        {
-            return null;
-        }
-
-        ImageRegistry images = getImageRegistry();
-        Image image = images.get(name);
-        if (image == null)
-        {
-            try
-            {
-                ImageDescriptor id = ImageDescriptor.createFromURL(new URL(_pluginBase,
-                        IFileFolderConstants.FOLDER_ICONS + "/" + name)); //$NON-NLS-1$
-                images.put(name, id);
-
-                image = images.get(name);
-            }
-            catch (MalformedURLException ee)
-            {
-                _logger.error("Error.JSFUIPlugin", name, ee); //$NON-NLS-1$
-            }
-        }
-        return image;
-    }
-
-    /**
-     * Log message and Throwable by severity.
-     * 
-     * @param severity Severity (use appropriate IStatus constant).
-     * @param message Message to be logged.
-     * @param exception Throwable instance to be logged.
-     */
-    public static void log(int severity, String message, Throwable exception) {
-    	ILog log = getDefault().getLog();
-    	IStatus status = new Status(
-    			severity,
-    			"org.eclipse.jst.pagedesigner.jsf.ui", //$NON-NLS-1$
-    			message,
-    			exception);
-    	log.log(status);
-    }
-
-    /**
-     * Log message by severity.
-     * 
-     * @param severity Severity (use an IStatus constant).
-     * @param message Message to be logged.
-     */
-    public static void log(int severity, String message) {
-    	ILog log = getDefault().getLog();
-    	IStatus status = new Status(
-    			severity,
-    			"org.eclipse.jst.pagedesigner.jsf.ui", //$NON-NLS-1$
-    			message);
-    	log.log(status);
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/JSFUIPluginResources.properties b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/JSFUIPluginResources.properties
deleted file mode 100644
index b628dc5..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/JSFUIPluginResources.properties
+++ /dev/null
@@ -1,50 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-#DataTable
-ElementEdit.Submenu.DataTable=DataTable
-ElementEdit.Submenu.DataTable.SelectTable=Select Table
-ElementEdit.Submenu.DataTable.InsertColumnBefore=Insert Column Before
-ElementEdit.Submenu.DataTable.InsertColumnAfter=Insert Column After
-ElementEdit.Submenu.DataTable.DeleteColumn=Delete Column
-ElementEdit.Submenu.InsertTableHeader=Insert Table Header
-ElementEdit.Submenu.InsertTableFooter=Insert Table Footer
-ElementEdit.Submenu.DeleteTableHeader=Delete Table Header
-ElementEdit.Submenu.DeleteTableFooter=Delete Table Footer
-ElementEdit.Submenu.InsertColumnHeader=Insert Column Header
-ElementEdit.Submenu.InsertColumnFooter=Insert Column Footer
-ElementEdit.Submenu.DeleteColumnHeader=Delete Column Header
-ElementEdit.Submenu.DeleteColumnFooter=Delete Column Footer
-
-#PanelGrid
-ElementEdit.Submenu.PanelGrid=PanelGrid
-ElementEdit.Submenu.PanelGrid.SelectTable=Select Table
-ElementEdit.Submenu.PanelGrid.InsertRowBefore=Insert Row Before
-ElementEdit.Submenu.PanelGrid.InsertRowAfter=Insert Row After
-ElementEdit.Submenu.PanelGrid.InsertColumnBefore=Insert Column Before
-ElementEdit.Submenu.PanelGrid.InsertColumnAfter=Insert Column After
-ElementEdit.Submenu.PanelGrid.DeleteRow=Delete Row
-ElementEdit.Submenu.PanelGrid.DeleteColumn=Delete Column
-ElementEdit.Submenu.PanelGrid.InsertHeader=Insert Header
-ElementEdit.Submenu.PanelGrid.InsertFooter=Insert Footer
-ElementEdit.Submenu.PanelGird.DeleteHeader=Delete Header
-ElementEdit.Submenu.PanelGrid.DeleteFooter=Delete Footer
-
-ElementEdit.Submenu.JavaNavigation=Java
-ElementEdit.Submenu.JavaNavigation.Binding=Binding
-ElementEdit.Submenu.JavaNavigation.Value=Value
-ElementEdit.Submenu.JavaNavigation.Action=Action
-ElementEdit.Submenu.LoadBundle=Open Properties File
-
-#Warning messages
-Message.Warning.Title=Warning
-Message.Warning.InvalidateExpression=The value is either an invalid Expression or the definition is missing.
-
-Error.JSFUIPlugin=Error in jsf.ui plugin
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/JSFUIResources.properties b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/JSFUIResources.properties
deleted file mode 100644
index 0a4ec8d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/JSFUIResources.properties
+++ /dev/null
@@ -1,16 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-MessageTagConverter.defaultValue=Message
-MessageTagConverter.defaultTooltip=Summary
-
-TableBasedOperation.NoSelectItem.style=color:silver;font-family:Arial,Helvetica,Geneva,sans-serif;font-size:8pt;
-TableBasedOperation.NoSelectItem.text=Add child selectItem or selectItems tags
-TableBasedOperation.OnlySelectItems.text=Child selectItems tag(s) cannot be resolved at design-time
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/ActionsResources.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/ActionsResources.java
deleted file mode 100644
index 77ee60b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/ActionsResources.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.actions;
-
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ActionsResources
-{
-    private static final String         BUNDLE_NAME     = "org.eclipse.jst.pagedesigner.jsf.ui.actions.ActionsResources"; //$NON-NLS-1$
-
-    private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle.getBundle(BUNDLE_NAME);
-
-    private ActionsResources()
-    {
-        // no external instantiation
-    }
-
-    /**
-     * @param key
-     * @return the res bundle string for key or !key! if not found
-     */
-    public static String getString(String key)
-    {
-        try
-        {
-            return RESOURCE_BUNDLE.getString(key);
-        }
-        catch (MissingResourceException e)
-        {
-            return '!' + key + '!';
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/ActionsResources.properties b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/ActionsResources.properties
deleted file mode 100644
index 0f46733..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/ActionsResources.properties
+++ /dev/null
@@ -1,28 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-AddValueChangeListenerAction.ActionLabel.ValueChangeListener=ValueChangeListener
-AddValidateDoubleRangeAction.ActionLabel.DoubleRange=Double Range
-AddValidateLengthAction.ActionLabel.Length=Length
-AddValidateLongRangeAction.ActionLabel.LongRange=Long Range
-AddConvertDateTimeAction.ActionLabel.DateTime=Date Time
-AddConvertNumberAction.ActionLabel.Number=Number
-AddAttributeAction.Wizard.NewAttribute=New Attribute
-AddAttributeAction.ActionLabel.Attribute=Attribute
-AddSelectItemAction.ActionLabel.SelectItem=Select Item
-AddSelectItemsAction.ActionLabel.SelectItems=Select Items
-AddAttributeAction.Wizard.Description=Enter a name and value for the attribute.
-AddParamAction.ActionLabel.Param=Param
-
-Submenu.JSFAdd=JSF Add
-Submenu.JSFAdd.Converter=Converter
-Submenu.JSFAdd.Validators=Validators
-
-PageFlowContributor.Menu.PageFlow=PageFlow
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddActionListenerAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddActionListenerAction.java
deleted file mode 100644
index 11148ff..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddActionListenerAction.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.actions;
-
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.properties.attrgroup.DialogUtil;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class AddActionListenerAction extends JSFAddChildAction
-{
-    /**
-     * @param parentEle 
-     * 
-     */
-    public AddActionListenerAction(IDOMElement parentEle)
-    {
-        super("ActionListener", parentEle); //$NON-NLS-1$
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.Action#run()
-     */
-    public void run()
-    {
-        DialogUtil.createSubElement(getShell(), getParentElement(), ITLDConstants.URI_JSF_CORE, IJSFConstants.TAG_ACTIONLISTENER, new String[]{"type"}); //$NON-NLS-1$
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddAttributeAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddAttributeAction.java
deleted file mode 100644
index 85fa345..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddAttributeAction.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.actions;
-
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.properties.attrgroup.DialogUtil;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class AddAttributeAction extends JSFAddChildAction
-{
-
-    /**
-     * @param parentNode
-     */
-    public AddAttributeAction(IDOMElement parentNode)
-    {
-        super(ActionsResources.getString("AddAttributeAction.ActionLabel.Attribute"), parentNode); //$NON-NLS-1$
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.Action#run()
-     */
-    public void run()
-    {
-        DialogUtil.createSubElement(getShell(), getParentElement(), ITLDConstants.URI_JSF_CORE, "attribute", new String[]{"name", "value"}); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-//        CommonDialogFieldGroup group = new CommonDialogFieldGroup();
-//
-//        AttributeData[] data = createAttributeData();
-//        group.setAttributeData(data);
-//
-//        DialogFieldGroupPage page = new DialogFieldGroupPage("Attribute", group); //$NON-NLS-1$
-//        page.setTitle(ActionsResources.getString("AddAttributeAction.Wizard.NewAttribute")); //$NON-NLS-1$
-//        page.setDescription(ActionsResources.getString("AddAttributeAction.Wizard.Description")); //$NON-NLS-1$
-//        CommonDialogFieldWizard wizard = new CommonDialogFieldWizard(page);
-//        wizard.setWindowTitle(ActionsResources.getString("AddAttributeAction.Wizard.NewAttribute")); //$NON-NLS-1$
-//        WizardDialog dialog = new WizardDialog(getShell(), wizard);
-//        dialog.create();
-//        if (dialog.open() == WizardDialog.OK)
-//        {
-//            group.prepareData();
-//            Map attributesMap = new HashMap();
-//            for (int i = 0; i < data.length; i++)
-//            {
-//                attributesMap.put(data[i].attributeName, data[i].value);
-//            }
-//            AddJSFCoreChildCommand command = new AddJSFCoreChildCommand(this.getParentElement(),
-//                IJSFConstants.TAG_ATTRIBUTE, attributesMap);
-//            command.execute();
-//        }
-    }
-
-//    private AttributeData[] createAttributeData()
-//    {
-//        return new AttributeData[] 
-//        {
-//            new AttributeData(IJMTConstants.URI_JSF_CORE, IJSFConstants.TAG_ATTRIBUTE, IJSFConstants.ATTR_NAME),
-//                new AttributeData(IJMTConstants.URI_JSF_CORE, IJSFConstants.TAG_ATTRIBUTE, IJSFConstants.ATTR_VALUE)
-//        }
-//        ;
-//    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddConvertDateTimeAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddConvertDateTimeAction.java
deleted file mode 100644
index 6172669..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddConvertDateTimeAction.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.actions;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.jsf.ui.commands.jsfhtml.AddJSFCoreChildCommand;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class AddConvertDateTimeAction extends JSFAddChildAction
-{
-
-    /**
-     * @param parentNode
-     */
-    public AddConvertDateTimeAction(IDOMElement parentNode)
-    {
-        super(ActionsResources.getString("AddConvertDateTimeAction.ActionLabel.DateTime"), parentNode); //$NON-NLS-1$
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.Action#run()
-     */
-    public void run()
-    {
-        AddJSFCoreChildCommand command = new AddJSFCoreChildCommand(this.getParentElement(),
-            IJSFConstants.TAG_CONVERTDATETIME, null);
-        command.execute();
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddConvertNumberAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddConvertNumberAction.java
deleted file mode 100644
index af33b52..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddConvertNumberAction.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.actions;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.jsf.ui.commands.jsfhtml.AddJSFCoreChildCommand;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class AddConvertNumberAction extends JSFAddChildAction
-{
-
-    /**
-     * @param parentNode
-     */
-    public AddConvertNumberAction(IDOMElement parentNode)
-    {
-        super(ActionsResources.getString("AddConvertNumberAction.ActionLabel.Number"), parentNode); //$NON-NLS-1$
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.Action#run()
-     */
-    public void run()
-    {
-        AddJSFCoreChildCommand command = new AddJSFCoreChildCommand(this.getParentElement(),
-            IJSFConstants.TAG_CONVERTNUMBER, null);
-        command.execute();
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddConverterAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddConverterAction.java
deleted file mode 100644
index fb6d378..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddConverterAction.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.actions;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.jsf.ui.commands.jsfhtml.AddJSFCoreChildCommand;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class AddConverterAction extends JSFAddChildAction
-{
-    String	_converterId;
-
-    /**
-     * @param converterId 
-     * @param parentNode
-     */
-    public AddConverterAction(String converterId, IDOMElement parentNode)
-    {
-        super(converterId, parentNode);
-        this._converterId = converterId;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.Action#run()
-     */
-    public void run()
-    {
-        Map attributes = new HashMap();
-        attributes.put("converterId", _converterId); //$NON-NLS-1$
-        AddJSFCoreChildCommand command = new AddJSFCoreChildCommand(this.getParentElement(),
-            IJSFConstants.TAG_CONVERTER, attributes);
-        command.execute();
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddParamAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddParamAction.java
deleted file mode 100644
index 8cb1a74..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddParamAction.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.actions;
-
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.properties.attrgroup.DialogUtil;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class AddParamAction extends JSFAddChildAction
-{
-
-    /**
-     * @param parentNode
-     */
-    public AddParamAction(IDOMElement parentNode)
-    {
-        super(ActionsResources.getString("AddParamAction.ActionLabel.Param"), parentNode); //$NON-NLS-1$
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.Action#run()
-     */
-    public void run()
-    {
-        DialogUtil.createSubElement(getShell(), getParentElement(), ITLDConstants.URI_JSF_CORE,
-                IJSFConstants.TAG_PARAM, new String[] { IJSFConstants.ATTR_NAME, IJSFConstants.ATTR_VALUE});
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddSelectItemAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddSelectItemAction.java
deleted file mode 100644
index c725801..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddSelectItemAction.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.actions;
-
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.properties.attrgroup.DialogUtil;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class AddSelectItemAction extends JSFAddChildAction
-{
-
-    /**
-     * @param parentNode
-     */
-    public AddSelectItemAction(IDOMElement parentNode)
-    {
-        super(ActionsResources.getString("AddSelectItemAction.ActionLabel.SelectItem"), parentNode); //$NON-NLS-1$
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.Action#run()
-     */
-    public void run()
-    {
-        DialogUtil.createSubElement(getShell(), getParentElement(), ITLDConstants.URI_JSF_CORE,
-                IJSFConstants.TAG_SELECTITEM, new String[] { IJSFConstants.ATTR_ITEMLABEL, IJSFConstants.ATTR_ITEMVALUE});
-    }
-}
-
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddSelectItemsAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddSelectItemsAction.java
deleted file mode 100644
index 5598887..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddSelectItemsAction.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.actions;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.properties.attrgroup.DialogUtil;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class AddSelectItemsAction extends JSFAddChildAction
-{
-
-    /**
-     * @param parentNode
-     */
-    public AddSelectItemsAction(IDOMElement parentNode)
-    {
-        super(ActionsResources.getString("AddSelectItemsAction.ActionLabel.SelectItems"), parentNode); //$NON-NLS-1$
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.Action#run()
-     */
-    public void run()
-    { 
-//        AddJSFCoreChildCommand command = new AddJSFCoreChildCommand(this.getParentElement(),
-//            IJSFConstants.TAG_SELECTITEMS, attributes);
-//        command.execute();
-        DialogUtil.createSubElement(getShell(), getParentElement(), ITLDConstants.URI_JSF_CORE,
-                IJSFConstants.TAG_SELECTITEMS, new String[] { IJSFConstants.ATTR_ID, IJSFConstants.ATTR_BINDING, IJSFConstants.ATTR_VALUE});
-
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddValidateDoubleRangeAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddValidateDoubleRangeAction.java
deleted file mode 100644
index c6c7855..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddValidateDoubleRangeAction.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.actions;
-
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.properties.attrgroup.DialogUtil;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class AddValidateDoubleRangeAction extends JSFAddChildAction
-{
-
-    /**
-     * @param parentNode
-     */
-    public AddValidateDoubleRangeAction(IDOMElement parentNode)
-    {
-        super(ActionsResources.getString("AddValidateDoubleRangeAction.ActionLabel.DoubleRange"), parentNode);  //$NON-NLS-1$
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.Action#run()
-     */
-    public void run()
-    {
-        DialogUtil.createSubElement(getShell(), getParentElement(), ITLDConstants.URI_JSF_CORE,
-                IJSFConstants.TAG_VALIDATEDOUBLERANGE, new String[] { IJSFConstants.ATTR_MINIMUM,
-                        IJSFConstants.ATTR_MAXIMUM});
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddValidateLengthAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddValidateLengthAction.java
deleted file mode 100644
index b89cf1d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddValidateLengthAction.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.actions;
-
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.properties.attrgroup.DialogUtil;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class AddValidateLengthAction extends JSFAddChildAction
-{
-
-    /**
-     * @param parentNode
-     */
-    public AddValidateLengthAction(IDOMElement parentNode)
-    {
-        super(ActionsResources.getString("AddValidateLengthAction.ActionLabel.Length"), parentNode);  //$NON-NLS-1$
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.Action#run()
-     */
-    public void run()
-    {
-        DialogUtil.createSubElement(getShell(), getParentElement(), ITLDConstants.URI_JSF_CORE,
-                IJSFConstants.TAG_VALIDATELENGTH, new String[] { IJSFConstants.ATTR_MINIMUM,
-                        IJSFConstants.ATTR_MAXIMUM});
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddValidateLongRangeAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddValidateLongRangeAction.java
deleted file mode 100644
index a12ce56..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddValidateLongRangeAction.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.actions;
-
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.properties.attrgroup.DialogUtil;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class AddValidateLongRangeAction extends JSFAddChildAction
-{
-
-    /**
-     * @param parentNode
-     */
-    public AddValidateLongRangeAction(IDOMElement parentNode)
-    {
-        super(ActionsResources.getString("AddValidateLongRangeAction.ActionLabel.LongRange"), parentNode); //$NON-NLS-1$
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.Action#run()
-     */
-    public void run()
-    {
-        DialogUtil.createSubElement(getShell(), getParentElement(), ITLDConstants.URI_JSF_CORE,
-                IJSFConstants.TAG_VALIDATELONGRANGE, new String[] { IJSFConstants.ATTR_MINIMUM,
-                        IJSFConstants.ATTR_MAXIMUM});
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddValidatorAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddValidatorAction.java
deleted file mode 100644
index 2e65fef..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddValidatorAction.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.actions;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.jsf.ui.commands.jsfhtml.AddJSFCoreChildCommand;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class AddValidatorAction extends JSFAddChildAction
-{
-    String	_validatorId;
-
-    /**
-     * @param validatorId
-     * @param parentNode
-     */
-    public AddValidatorAction(String validatorId, IDOMElement parentNode)
-    {
-        super(validatorId, parentNode);
-        this._validatorId = validatorId;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.Action#run()
-     */
-    public void run()
-    {
-        Map attributes = new HashMap();
-        attributes.put("validatorId", _validatorId); //$NON-NLS-1$
-        AddJSFCoreChildCommand command = new AddJSFCoreChildCommand(this.getParentElement(),
-            IJSFConstants.TAG_VALIDATOR, attributes);
-        command.execute();
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddValueChangeListenerAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddValueChangeListenerAction.java
deleted file mode 100644
index cb76f44..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddValueChangeListenerAction.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.actions;
-
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.properties.attrgroup.DialogUtil;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class AddValueChangeListenerAction extends JSFAddChildAction
-{
-
-    /**
-     * @param parentNode
-     */
-    public AddValueChangeListenerAction(IDOMElement parentNode)
-    {
-        super(ActionsResources.getString("AddValueChangeListenerAction.ActionLabel.ValueChangeListener"), parentNode); //$NON-NLS-1$
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.Action#run()
-     */
-    public void run()
-    {
-        DialogUtil.createSubElement(getShell(), getParentElement(), ITLDConstants.URI_JSF_CORE,
-                IJSFConstants.TAG_VALUECHANGELISTENER, new String[] { IJSFConstants.ATTR_TYPE});
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/DeleteHColumnHeaderFooterAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/DeleteHColumnHeaderFooterAction.java
deleted file mode 100644
index 8d6fa01..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/DeleteHColumnHeaderFooterAction.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.actions;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jst.pagedesigner.jsf.ui.elementedit.request.DeleteHColumnHeaderFooterRequest;
-
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class DeleteHColumnHeaderFooterAction extends Action
-{
-    private Command _command;
-
-    /**
-     * @param text
-     * @param editPart 
-     * @param isHeader 
-     */
-    public DeleteHColumnHeaderFooterAction(String text, EditPart editPart, boolean isHeader)
-    {
-        super(text);
-        DeleteHColumnHeaderFooterRequest req = new DeleteHColumnHeaderFooterRequest(text, isHeader);
-        this._command = editPart.getCommand(req);
-        this.setEnabled(this._command != null && this._command.canExecute());
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.Action#run()
-     */
-    public void run()
-    {
-        _command.execute();
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/DeleteHeaderFooterAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/DeleteHeaderFooterAction.java
deleted file mode 100644
index 7df470c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/DeleteHeaderFooterAction.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.actions;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jst.pagedesigner.jsf.ui.elementedit.request.DeleteHeaderFooterRequest;
-
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class DeleteHeaderFooterAction extends Action
-{
-    private Command _command;
-
-    /**
-     * @param text
-     * @param editPart 
-     * @param isHeader 
-     */
-    public DeleteHeaderFooterAction(String text, EditPart editPart, boolean isHeader)
-    {
-        super(text);
-        DeleteHeaderFooterRequest req = new DeleteHeaderFooterRequest(text, isHeader);
-        this._command = editPart.getCommand(req);
-        this.setEnabled(this._command != null && this._command.canExecute());
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.Action#run()
-     */
-    public void run()
-    {
-        _command.execute();
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/ExpressionAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/ExpressionAction.java
deleted file mode 100644
index 2f91a13..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/ExpressionAction.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.actions;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jst.pagedesigner.jsf.ui.JSFUIPlugin;
-import org.eclipse.jst.pagedesigner.jsp.core.pagevar.IPageVariablesProvider;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ExpressionAction extends Action
-{
-    /**
-     * enumerates a method-binding expression
-     */
-    public static final int METHOD   = 0;
-    /**
-     * enumerates a value-binding expression
-     */
-    public static final int VARIABLE = 1;
-
-    private String          _action;
-    private IProject        _project;
-    private IFile           _file;
-
-
-    /**
-     * @param attribute
-     */
-    public void setActionValue(String attribute)
-    {
-        _action = attribute;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.IAction#isEnabled()
-     */
-    public boolean isEnabled()
-    {
-        return _project != null && isExpression();
-    }
-
-    private boolean isExpression()
-    {
-        boolean flag = false;
-        if (_action != null)
-        {
-            flag = _action.startsWith("#{") && _action.endsWith("}");//$NON-NLS-1$ //$NON-NLS-2$ $NON-NLS-2$
-        }
-        return flag;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.IAction#run()
-     */
-    public void run()
-    {
-        IPageVariablesProvider pageVarProvider = (IPageVariablesProvider) getPage().getActiveEditor().getAdapter(
-                IPageVariablesProvider.class);
-        pageVarProvider.refresh();
-
-        JSFUIPlugin.getAlerts().warning("Message.Warning.Title", "Message.Warning.InvalidateExpression");//$NON-NLS-1$ //$NON-NLS-2$ $NON-NLS-2$
-    }
-
-    /**
-     * @param projectFor
-     */
-    public void setProject(IProject projectFor)
-    {
-        this._project = projectFor;
-    }
-
-    private IWorkbenchPage getPage()
-    {
-        IWorkbench workbench = PlatformUI.getWorkbench();
-        IWorkbenchWindow window = workbench.getActiveWorkbenchWindow();
-        return window.getActivePage();
-    }
-
-    /**
-     * @param fileFor
-     */
-    public void setFile(IFile fileFor)
-    {
-        _file = fileFor;
-    }
-
-    /**
-     * @return the file
-     */
-    public IFile getFile()
-    {
-        return _file;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/IJSFCoreSupport.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/IJSFCoreSupport.java
deleted file mode 100644
index 70285ee..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/IJSFCoreSupport.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.actions;
-
-/**
- * This interface is to provide information of how to enable/disable add
- * jsf core sub element.
- * 
- * As other JSF taglibs that we don't know today may also use jsf core tags inside
- * them, so we may also enable the actions for adding jsf core tags to them. But
- * we need check whether individual JSF core tags are supported.
- * 
- * @author mengbo
- * @version 1.5
- */
-public interface IJSFCoreSupport
-{
-    /**
-     * actionListener can only be added to those ActionSource component.
-     * @return if is an action source
-     */
-    public boolean isActionSource();
-
-    /**
-     * 
-     * @return true if is a UI component
-     */
-    public boolean isUIComponent();
-
-    /**
-     * converter (convertXXX) can only be added to those ValueHolder
-     * @return true if is a value holder
-     */
-    public boolean isValueHolder();
-
-    /**
-     * validator can only be added to EditableValueHolder
-     * @return true if is an editable value holder
-     */
-    public boolean isEditableValueHolder();
-
-    /**
-     * whether support selectItem and selectItems
-     * @return true if supports the UISelectItem(s) contract
-     */
-    public boolean supportSelectItems();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/InsertHColumnHeaderFooterAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/InsertHColumnHeaderFooterAction.java
deleted file mode 100644
index e177212..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/InsertHColumnHeaderFooterAction.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.actions;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jst.pagedesigner.jsf.ui.elementedit.request.InsertHColumnHeaderFooterRequest;
-
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class InsertHColumnHeaderFooterAction extends Action
-{
-    private Command _command;
-
-    /**
-     * @param text
-     * @param editPart 
-     * @param isHeader 
-     */
-    public InsertHColumnHeaderFooterAction(String text, EditPart editPart, boolean isHeader)
-    {
-        super(text);
-
-        InsertHColumnHeaderFooterRequest req = new InsertHColumnHeaderFooterRequest(text, isHeader);
-        this._command = editPart.getCommand(req);
-        this.setEnabled(this._command != null && this._command.canExecute());
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.Action#run()
-     */
-    public void run()
-    {
-        _command.execute();
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/InsertHeaderFooterAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/InsertHeaderFooterAction.java
deleted file mode 100644
index f2ac6b8..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/InsertHeaderFooterAction.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.actions;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jst.pagedesigner.jsf.ui.elementedit.request.InsertHeaderFooterRequest;
-
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class InsertHeaderFooterAction extends Action
-{
-    private Command _command;
-
-    /**
-     * @param text
-     * @param editPart 
-     * @param isHeader 
-     */
-    public InsertHeaderFooterAction(String text, EditPart editPart, boolean isHeader)
-    {
-        super(text);
-
-        InsertHeaderFooterRequest req = new InsertHeaderFooterRequest(text, isHeader);
-        this._command = editPart.getCommand(req);
-        this.setEnabled(this._command != null && this._command.canExecute());
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.Action#run()
-     */
-    public void run()
-    {
-        _command.execute();
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/JSFAddActionGroup.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/JSFAddActionGroup.java
deleted file mode 100644
index 8deaeaf..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/JSFAddActionGroup.java
+++ /dev/null
@@ -1,218 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.actions;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IContributionItem;
-import org.eclipse.jface.action.IMenuListener;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jst.jsf.core.jsfappconfig.internal.IJSFAppConfigManager;
-import org.eclipse.jst.jsf.core.jsfappconfig.internal.JSFAppConfigManagerFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.ConverterIdType;
-import org.eclipse.jst.jsf.facesconfig.emf.ConverterType;
-import org.eclipse.jst.jsf.facesconfig.emf.ValidatorIdType;
-import org.eclipse.jst.jsf.facesconfig.emf.ValidatorType;
-import org.eclipse.jst.pagedesigner.editors.PageDesignerActionConstants;
-import org.eclipse.jst.pagedesigner.utils.StructuredModelUtil;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class JSFAddActionGroup {
-
-	private final static Action EMPTY_ACTION = new Action() {
-        // TODO: why?
-	};
-
-
-	/**
-	 * @param menu
-	 * @param element
-	 * @param support
-	 */
-	public void fillContextMenu(IMenuManager menu, final IDOMElement element,
-			final IJSFCoreSupport support) {
-        IContributionItem item = menu.find(PageDesignerActionConstants.INSERT_SUBMENU_ID);
-        
-        if (item instanceof IMenuManager)
-        {
-    		final IMenuManager submenu = (IMenuManager) item;
-    		submenu.add(EMPTY_ACTION);
-    		submenu.addMenuListener(new IMenuListener() {
-    			public void menuAboutToShow(IMenuManager manager) {
-    				submenu.removeAll();
-    				addJSFAddItems(submenu, element, support);
-    			}
-    		});
-        }
-		//menu.appendToGroup(PageDesignerActionConstants.GROUP_SPECIAL, submenu);
-	}
-
-	/**
-	 * @param submenu
-	 * @param element
-	 */
-	private void addJSFAddItems(IMenuManager submenu, IDOMElement element,
-			IJSFCoreSupport support) {
-		AddActionListenerAction actionListenerAction = new AddActionListenerAction(
-				element);
-		actionListenerAction.setEnabled(support.isActionSource());
-		submenu.add(actionListenerAction);
-
-		AddAttributeAction attrAction = new AddAttributeAction(element);
-		attrAction.setEnabled(support.isUIComponent());
-		submenu.add(attrAction);
-
-		IProject prj = null;
-		IFile file = StructuredModelUtil.getFileFor(element.getModel());
-		if (file != null) {
-			prj = file.getProject();
-		}
-
-		IMenuManager converterMenu = new MenuManager(ActionsResources
-				.getString("Submenu.JSFAdd.Converter"));//$NON-NLS-1$
-		boolean supportConverter = support.isValueHolder();
-		String[] converterIds = getRegisteredConverterIds(prj);
-		if (converterIds != null && converterIds.length > 0) {
-			for (int i = 0; i < converterIds.length; i++) {
-				AddConverterAction action = new AddConverterAction(
-						converterIds[i], element);
-				action.setEnabled(supportConverter);
-				converterMenu.add(action);
-			}
-			converterMenu.add(new Separator());
-		}
-		AddConvertDateTimeAction dateTimeAction = new AddConvertDateTimeAction(
-				element);
-		dateTimeAction.setEnabled(supportConverter);
-		converterMenu.add(dateTimeAction);
-		AddConvertNumberAction numberAction = new AddConvertNumberAction(
-				element);
-		numberAction.setEnabled(supportConverter);
-		converterMenu.add(numberAction);
-		submenu.add(converterMenu);
-
-		AddParamAction addParamAction = new AddParamAction(element);
-		addParamAction.setEnabled(support.isUIComponent());
-		submenu.add(addParamAction);
-
-		AddSelectItemAction selectItemAction = new AddSelectItemAction(element);
-		selectItemAction.setEnabled(support.supportSelectItems());
-		submenu.add(selectItemAction);
-
-		AddSelectItemsAction selectItemsAction = new AddSelectItemsAction(
-				element);
-		selectItemsAction.setEnabled(support.supportSelectItems());
-		submenu.add(selectItemsAction);
-
-		IMenuManager validatorMenu = new MenuManager(ActionsResources
-				.getString("Submenu.JSFAdd.Validators"));//$NON-NLS-1$
-		boolean supportValidator = support.isEditableValueHolder();
-		String[] validatorIds = getRegisteredValidatorIds(prj);
-		if (validatorIds != null && validatorIds.length > 0) {
-			for (int i = 0; i < validatorIds.length; i++) {
-				AddValidatorAction action = new AddValidatorAction(
-						validatorIds[i], element);
-				action.setEnabled(supportValidator);
-				validatorMenu.add(action);
-			}
-			validatorMenu.add(new Separator());
-		}
-		AddValidateDoubleRangeAction doubleRangeAction = new AddValidateDoubleRangeAction(
-				element);
-		doubleRangeAction.setEnabled(supportValidator);
-		validatorMenu.add(doubleRangeAction);
-		AddValidateLengthAction lengthAction = new AddValidateLengthAction(
-				element);
-		lengthAction.setEnabled(supportValidator);
-		validatorMenu.add(lengthAction);
-		AddValidateLongRangeAction longRangeAction = new AddValidateLongRangeAction(
-				element);
-		longRangeAction.setEnabled(supportValidator);
-		validatorMenu.add(longRangeAction);
-		submenu.add(validatorMenu);
-
-		AddValueChangeListenerAction valueChangeAction = new AddValueChangeListenerAction(
-				element);
-		valueChangeAction.setEnabled(support.isEditableValueHolder());
-		submenu.add(valueChangeAction);
-	}
-
-	/**
-	 * @return
-	 */
-	private String[] getRegisteredValidatorIds(IProject project) 
-    {
-        String[] result = null;
-        
-        IJSFAppConfigManager appConfigMgr = 
-            JSFAppConfigManagerFactory.getJSFAppConfigManagerInstance(project);
-
-        // getInstance may return null if there is a problem
-        if (appConfigMgr != null)
-        {
-            final List<ValidatorType> list = appConfigMgr.getValidators();
-            result = new String[list.size()];
-            int i = 0;
-            for (final ValidatorType validator : list) 
-            {
-            	ValidatorIdType validatorId = validator.getValidatorId();
-                if (validatorId != null)
-                {
-                    result[i++] = validatorId.getTextContent() != null ?
-                            validatorId.getTextContent().trim() : ""; //$NON-NLS-1$
-                }
-            }
-        }
-        return result;
-	}
-
-	/**
-	 * @return
-	 */
-	private String[] getRegisteredConverterIds(IProject project) 
-    {
-        String[] result = null;
-        
-        IJSFAppConfigManager appConfigMgr = 
-            JSFAppConfigManagerFactory.getJSFAppConfigManagerInstance(project);
-
-        // getInstance may return null if there is a problem
-        if (appConfigMgr != null)
-        {
-            final List<ConverterType> list = appConfigMgr.getConverters();
-            //prune out converters for classes, they're not valid here
-            final List<String> converterIdList = new ArrayList();
-            for (final ConverterType converter : list)
-            {
-                ConverterIdType converterId = converter.getConverterId();
-                if (converterId != null)
-                {
-                    converterIdList.add(converterId.getTextContent() != null ? 
-                            converterId.getTextContent().trim() : ""); //$NON-NLS-1$
-                }
-            }
-            result = new String[converterIdList.size()];
-            result = converterIdList.toArray(result);
-        }
-		return result;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/JSFAddChildAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/JSFAddChildAction.java
deleted file mode 100644
index 058f67e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/JSFAddChildAction.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.actions;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * Classes in this package are related to JSF operation. 
- * 
- * @author mengbo
- * @version 1.5
- */
-public class JSFAddChildAction extends Action
-{
-    private IDOMElement _parentEle;
-
-    /**
-     * @param text 
-     * @param parentNode 
-     */
-    public JSFAddChildAction(String text, IDOMElement parentNode)
-    {
-        super(text);
-        this._parentEle = parentNode;
-    }
-
-    /**
-     * @return the parent element
-     */
-    public IDOMElement getParentElement()
-    {
-        return _parentEle;
-    }
-
-    /**
-     * @return the active shell
-     */
-    public Shell getShell()
-    {
-        IWorkbench bench = PlatformUI.getWorkbench();
-        if (bench != null)
-        {
-            IWorkbenchWindow window = bench.getActiveWorkbenchWindow();
-            if (window == null)
-            {
-                IWorkbenchWindow[] windows = bench.getWorkbenchWindows();
-                if (windows != null && windows.length > 0)
-                {
-                    window = windows[0];
-                }
-            }
-            if (window != null)
-            {
-                return window.getShell();
-            }
-        }
-
-        return null;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/JSFCommandLinkCreator.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/JSFCommandLinkCreator.java
deleted file mode 100644
index 36dd0e9..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/JSFCommandLinkCreator.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.actions;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.actions.link.AbstractLinkCreator;
-import org.eclipse.jst.pagedesigner.actions.link.LinkUtil;
-import org.eclipse.jst.pagedesigner.parts.TextEditPart;
-import org.eclipse.jst.pagedesigner.utils.JSPUtil;
-import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.Text;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class JSFCommandLinkCreator extends AbstractLinkCreator
-{
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.actions.link.ILinkCreator#makeLinkElement(org.eclipse.gef.EditPart, org.eclipse.jst.pagedesigner.viewer.DesignRange)
-     */
-    public Element makeLinkElement(EditPart part, DesignRange range)
-    {
-        if (part instanceof TextEditPart)
-        {
-            Text middleNode = LinkUtil.splitDomText(part, range);
-            EditPart parent = part.getParent();
-            Node parentNode = (Node) parent.getModel();
-            Document doc = (parentNode instanceof Document) ? (Document) parentNode : (parentNode.getOwnerDocument());
-
-            IDOMModel model = ((IDOMNode) parentNode).getModel();
-            String prefix = JSPUtil.getOrCreatePrefix(model, ITLDConstants.URI_JSF_HTML, "h"); //$NON-NLS-1$
-            JSPUtil.getOrCreatePrefix(model, ITLDConstants.URI_JSF_CORE, "f"); //$NON-NLS-1$
-
-            Element commandLink = doc.createElement(IJSFConstants.TAG_COMMANDLINK);
-            commandLink.setPrefix(prefix);
-            Element outputText = doc.createElement(IJSFConstants.TAG_OUTPUTTEXT);
-            outputText.setPrefix(prefix);
-            outputText.setAttribute(IJSFConstants.ATTR_VALUE, middleNode.getNodeValue());
-            commandLink.appendChild(outputText);
-
-            parentNode.replaceChild(commandLink, middleNode);
-            return commandLink;
-        }
-
-        return null;
-
-    }
-
-
-    /**
-     * @param range
-     * @return true if can execute
-     */
-    public boolean canExecute(DesignRange range)
-    {
-        DesignPosition startPosition = range.getStartPosition();
-        EditPart part = startPosition.getContainerPart();
-        IDOMNode node = (IDOMNode) part.getModel();
-        IDOMModel model = node.getModel();
-        return model.getDocument().getElementsByTagNameNS(ITLDConstants.URI_JSF_HTML, "view") != null; //$NON-NLS-1$
-
-    }
-
-    public String getSourcePreview(EditPart part, DesignRange range)
-    {
-        if (part instanceof TextEditPart)
-        {
-            TextEditPart textPart = (TextEditPart) part;
-            int[] offsets = textPart.getSelectedRange();
-
-            String displayData = textPart.getTextData();
-            String linkExp = displayData.substring(offsets[0], offsets[1]);
-
-            StringBuffer sb = new StringBuffer();
-            sb.append("<h:commandLink>\n<h:outputText value=\""); //$NON-NLS-1$
-            sb.append(linkExp);
-            sb.append("\">"); //$NON-NLS-1$
-            sb.append("</h:outputText>\n</h:commandLink>"); //$NON-NLS-1$
-            return sb.toString();
-        }
-        return null;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/JSFNavigationGroup.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/JSFNavigationGroup.java
deleted file mode 100644
index 4d593e3..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/JSFNavigationGroup.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.actions;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IContributionItem;
-import org.eclipse.jface.action.IMenuListener;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.editors.PageDesignerActionConstants;
-import org.eclipse.jst.pagedesigner.jsf.ui.JSFUIPlugin;
-import org.eclipse.jst.pagedesigner.utils.StructuredModelUtil;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class JSFNavigationGroup
-{
-    private final static Action EMPTY_ACTION = new Action()
-    {
-        // TODO: why?
-    };
-
-
-    /**
-     * @param menu
-     * @param element
-     * @param support
-     */
-    public void fillContextMenu(IMenuManager menu, final IDOMElement element, final IJSFCoreSupport support)
-    {
-        final IContributionItem item = 
-            menu.find(PageDesignerActionConstants.NAVIGATE_SUBMENU_ID);
-        
-        if (item instanceof IMenuManager)
-        {
-            final IMenuManager submenu = (IMenuManager) item; 
-            final IMenuManager javaMenu = new MenuManager(JSFUIPlugin.getResourceString("ElementEdit.Submenu.JavaNavigation"));//$NON-NLS-1$
-            javaMenu.add(EMPTY_ACTION);
-            javaMenu.addMenuListener(new IMenuListener()
-            {
-                public void menuAboutToShow(IMenuManager manager)
-                {
-                    javaMenu.removeAll();
-                    addNavigationItems(javaMenu, element, support);
-                }
-            }
-            );
-            
-            submenu.appendToGroup(PageDesignerActionConstants.GROUP_NAVIGATE, javaMenu);
-        }
-    }
-
-    private void addNavigationItems(IMenuManager submenu, IDOMElement ele, IJSFCoreSupport support)
-    {
-        if (support.isActionSource())
-        {
-            ExpressionAction action = new ExpressionAction();
-            action.setText(JSFUIPlugin.getResourceString("ElementEdit.Submenu.JavaNavigation.Action"));//$NON-NLS-1$
-            if (ele != null)
-            {
-                action.setActionValue(ele.getAttribute(ICSSPropertyID.ATTR_ACTION));
-                IDOMModel model = ele.getModel();
-                action.setProject(StructuredModelUtil.getProjectFor(model));
-                action.setFile(StructuredModelUtil.getFileFor(model));
-            }
-            submenu.add(action);
-        }
-        if (support.isValueHolder())
-        {
-            ExpressionAction action = new ExpressionAction();
-            action.setText(JSFUIPlugin.getResourceString("ElementEdit.Submenu.JavaNavigation.Value"));//$NON-NLS-1$
-            if (ele != null)
-            {
-                action.setActionValue(ele.getAttribute(ICSSPropertyID.ATTR_VALUE));
-                IDOMModel model = ele.getModel();
-                action.setProject(StructuredModelUtil.getProjectFor(model));
-                action.setFile(StructuredModelUtil.getFileFor(model));
-            }
-            submenu.add(action);
-        }
-
-        {
-            ExpressionAction action = new ExpressionAction();
-            action.setText(JSFUIPlugin.getResourceString("ElementEdit.Submenu.JavaNavigation.Binding"));//$NON-NLS-1$
-            if (ele != null)
-            {
-                action.setActionValue(ele.getAttribute(ICSSPropertyID.ATTR_BINDING));
-                IDOMModel model = ele.getModel();
-                action.setProject(StructuredModelUtil.getProjectFor(model));
-                action.setFile(StructuredModelUtil.getFileFor(model));
-            }
-            submenu.add(action);
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/JSFOutputLinkCreator.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/JSFOutputLinkCreator.java
deleted file mode 100644
index 4edf62c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/JSFOutputLinkCreator.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.actions;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.actions.link.AbstractLinkCreator;
-import org.eclipse.jst.pagedesigner.actions.link.LinkUtil;
-import org.eclipse.jst.pagedesigner.parts.TextEditPart;
-import org.eclipse.jst.pagedesigner.utils.JSPUtil;
-import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.Text;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class JSFOutputLinkCreator extends AbstractLinkCreator
-{
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.actions.link.ILinkCreator#makeLinkElement(org.eclipse.gef.EditPart, org.eclipse.jst.pagedesigner.viewer.DesignRange)
-     */
-    public Element makeLinkElement(EditPart part, DesignRange range)
-    {
-        if (part instanceof TextEditPart)
-        {
-            Text middleNode = LinkUtil.splitDomText(part, range);
-            EditPart parent = part.getParent();
-            Node parentNode = (Node) parent.getModel();
-            Document doc = (parentNode instanceof Document) ? (Document) parentNode : (parentNode.getOwnerDocument());
-
-            IDOMModel model = ((IDOMNode) parentNode).getModel();
-            String prefix = JSPUtil.getOrCreatePrefix(model, ITLDConstants.URI_JSF_HTML, "h"); //$NON-NLS-1$
-            String fPrefix = JSPUtil.getOrCreatePrefix(model, ITLDConstants.URI_JSF_CORE, "f"); //$NON-NLS-1$
-
-            Element outputLink = doc.createElement(IJSFConstants.TAG_OUTPUTLINK);
-            outputLink.setPrefix(prefix);
-            Element verbatim = doc.createElement(IJSFConstants.TAG_VERBATIM);
-            verbatim.setPrefix(fPrefix);
-            Text value = doc.createTextNode(middleNode.getNodeValue());
-            verbatim.appendChild(value);
-            outputLink.appendChild(verbatim);
-
-            parentNode.replaceChild(outputLink, middleNode);
-            return outputLink;
-        }
-
-        return null;
-
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.actions.link.AbstractLinkCreator#canExecute(org.eclipse.jst.pagedesigner.viewer.DesignRange)
-     */
-    public boolean canExecute(DesignRange range)
-    {
-        DesignPosition startPosition = range.getStartPosition();
-        EditPart part = startPosition.getContainerPart();
-        IDOMNode node = (IDOMNode) part.getModel();
-        IDOMModel model = node.getModel();
-        return model.getDocument().getElementsByTagNameNS(ITLDConstants.URI_JSF_HTML, "view") != null; //$NON-NLS-1$
-    
-    }
-
-    public String getSourcePreview(EditPart part, DesignRange range)
-    {
-        if (part instanceof TextEditPart)
-        {
-            TextEditPart textPart = (TextEditPart) part;
-            int[] offsets = textPart.getSelectedRange();
-            String displayData = textPart.getTextData();
-            String linkExp = displayData.substring(offsets[0], offsets[1]);
-
-            StringBuffer sb = new StringBuffer();
-            sb.append("<h:outputLink>\n<f:verbatim>"); //$NON-NLS-1$
-            sb.append(linkExp);
-            sb.append("</f:verbatim>\n</h:outputLink>"); //$NON-NLS-1$
-            return sb.toString();
-        }
-        return null;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/PageFlowContributor.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/PageFlowContributor.java
deleted file mode 100644
index 293965d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/PageFlowContributor.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.actions;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.pagedesigner.editors.PageDesignerActionConstants;
-import org.eclipse.jst.pagedesigner.extensionpoint.IContextMenuItemContributor;
-import org.eclipse.jst.pagedesigner.jsf.ui.JSFUIPlugin;
-import org.eclipse.jst.pagedesigner.utils.StructuredModelUtil;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.ui.IWorkbenchActionConstants;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class PageFlowContributor implements IContextMenuItemContributor
-{
-    private String _uri;
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.extensionpoint.IContextMenuItemContributor#setURI(java.lang.String)
-     */
-    public void setURI(String uri)
-    {
-        this._uri = uri;
-
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.extensionpoint.IContextMenuItemContributor#getURI()
-     */
-    public String getURI()
-    {
-        return _uri;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.extensionpoint.IContextMenuItemContributor#setModel(org.eclipse.wst.sse.core.internal.provisional.IStructuredModel)
-     */
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.extensionpoint.IContextMenuItemContributor#fillContextMenu(org.eclipse.jface.action.IMenuManager)
-     */
-    public void fillContextMenu(IMenuManager manager, ISelection selection, IStructuredModel model, Control parentUI)
-    {
-        PageFlowAction action = new PageFlowAction();
-        action.setId(PageFlowAction.ID);
-        action.setModel(model);
-        IMenuManager viewMgr = manager.findMenuUsingPath(PageDesignerActionConstants.SHOWVIEW_SUBMENU_ID);
-        if (viewMgr != null)
-        {
-            viewMgr.add(action);
-        }
-        else
-        {
-            manager.appendToGroup(IWorkbenchActionConstants.MB_ADDITIONS, action);
-        }
-    }
-
-    private static class PageFlowAction extends Action
-    {
-        /**
-         * this action's id
-         */
-        public final static String ID = "org.eclipse.jst.pagedesigner.jsf.ui.actions.PageFlowAction"; //$NON-NLS-1$
-        private IStructuredModel   model;
-
-        /**
-         * construct the action
-         */
-        public PageFlowAction()
-        {
-            setText(ActionsResources.getString("PageFlowContributor.Menu.PageFlow"));//$NON-NLS-1$
-        }
-
-        /**
-         * @param model
-         */
-        public void setModel(IStructuredModel model)
-        {
-            this.model = model;
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.action.IAction#run()
-         */
-        public void run()
-        {
-            IFile file = StructuredModelUtil.getFileFor(model);
-            if (file != null)
-            {
-                try
-                {
-                   // FacesConfigUtil.locateJSPFile(file);
-                }
-                catch (IllegalArgumentException e)
-                {
-                    JSFUIPlugin.getAlerts().warning("Message.Warning.Title", e.getLocalizedMessage());//$NON-NLS-1$
-                }
-            }
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/attributegroup/AttributeData.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/attributegroup/AttributeData.java
deleted file mode 100644
index 798da67..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/attributegroup/AttributeData.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.attributegroup;
-
-import java.util.HashMap;
-
-/**
- * Information and value about a tag attribute
- * @author mengbo
- * @version 1.5
- */
-class AttributeData
-{
-    /**
-     * possible key in the param map
-     */
-    static final String SuperType = "superTyle"; //$NON-NLS-1$
-    /**
-     * possible key in the param map
-     */
-    static final String Project = "project"; //$NON-NLS-1$
-
-    private final String uri;
-    private final String elementName;
-    private final String attributeName;
-    private Object value;
-    private HashMap paramMap; // null; lazy initialized
-
-    /**
-     * @param uri
-     * @param elementName
-     * @param name
-     */
-    public AttributeData(String uri,String elementName,String name)
-    {
-        this.uri = uri;
-        this.attributeName = name;
-        this.elementName = elementName;
-    }
-
-    /**
-     * @return the uri
-     */
-    public String getUri() {
-        return uri;
-    }
-
-    /**
-     * @return the element name
-     */
-    public String getElementName() {
-        return elementName;
-    }
-
-    /**
-     * @return the attribute name
-     */
-    public String getAttributeName() {
-        return attributeName;
-    }
-
-    /**
-     * @return the value
-     */
-    public Object getValue() {
-        return value;
-    }
-
-    /**
-     * @param value
-     */
-    public void setValue(Object value) {
-        this.value = value;
-    }
-
-    /**
-     * @return the param map
-     */
-    public HashMap getParamMap() 
-    {
-        if (paramMap == null)
-        {
-            paramMap = new HashMap();
-        }
-        return paramMap;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/attributegroup/CommonDialogFieldGroup.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/attributegroup/CommonDialogFieldGroup.java
deleted file mode 100644
index 7959d70..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/attributegroup/CommonDialogFieldGroup.java
+++ /dev/null
@@ -1,156 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.attributegroup;
-
-import java.util.HashMap;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogFieldGroup;
-
-/**
- * @author mengbo
- * @version 1.5
- * @TODO - unused now?
- */
-public class CommonDialogFieldGroup extends DialogFieldGroup
-{
-    private HashMap         map           = new HashMap();
-    private AttributeData[] attributeData = null;
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogFieldGroup#initialize()
-     */
-    public void initialize()
-    {
-        if (attributeData != null)
-        {
-            for (int i = 0; i < attributeData.length; i++)
-            {
-                DialogField filed = DialogFieldFactory.getDialogField(attributeData[i]);
-                filed.setDialogFieldChangeListener(getDefaultChangeListener());
-                map.put(attributeData[i], filed);
-            }
-        }
-    }
-
-    /**
-     * prepare the dialog field data
-     */
-    public void prepareData()
-    {
-        if (attributeData != null)
-        {
-            for (int i = 0; i < attributeData.length; i++)
-            {
-                DialogField field = (DialogField) map.get(attributeData[i]);
-                DialogFieldFactory.prepareDialogFieldValue(field, attributeData[i]);
-            }
-        }
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogFieldGroup#refreshData()
-     */
-    public void refreshData()
-    {
-        if (attributeData != null)
-        {
-            for (int i = 0; i < attributeData.length; i++)
-            {
-                DialogField field = (DialogField) map.get(attributeData[i]);
-                DialogFieldFactory.setDialogFieldValue(field, attributeData[i].getValue());
-            }
-        }
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogFieldGroup#layoutDialogFields(org.eclipse.ui.forms.widgets.FormToolkit, org.eclipse.swt.widgets.Composite)
-     */
-    public void layoutDialogFields(FormToolkit toolkit, Composite parent)
-    {
-        GridData data = new GridData(GridData.FILL_BOTH);
-        parent.setLayoutData(data);
-
-        GridLayout gl = new GridLayout();
-        gl.numColumns = getMaxColumnNum();
-        parent.setLayout(gl);
-
-        if (attributeData != null)
-        {
-            for (int i = 0; i < attributeData.length; i++)
-            {
-                DialogField field = (DialogField) map.get(attributeData[i]);
-                Control[] controls = field.doFillIntoGrid(toolkit, parent, gl.numColumns);
-                if (controls.length > 1)
-                {
-                    GridData gridData = (GridData) controls[1].getLayoutData();
-                    if(field.getNumberOfControls() == gl.numColumns)
-                    {
-                        gridData.grabExcessHorizontalSpace = true;
-                    }
-                    gridData.horizontalAlignment = GridData.FILL;
-                }
-                field.setLabelText(DialogFieldFactory.getDialogFieldLabel(attributeData[i]));
-            }
-        }
-    }
-
-    private int getMaxColumnNum()
-    {
-        int cols = 0;
-        if (attributeData != null)
-        {
-            for (int i = 0; i < attributeData.length; i++)
-            {
-                DialogField field = (DialogField) map.get(attributeData[i]);
-                int fieldCols = field.getNumberOfControls();
-                if (fieldCols > cols)
-                {
-                    cols = fieldCols;
-                }
-            }
-        }
-        return cols;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogFieldGroup#validateDialogFields()
-     */
-    public IStatus[] validateDialogFields()
-    {
-        // TODO Now we let it be.
-        return null;
-    }
-
-    /**
-     * @return Returns the attributePairs.
-     */
-    public AttributeData[] getAttributeData()
-    {
-        return attributeData;
-    }
-
-    /**
-     * @param attributePairs The attributePairs to set.
-     */
-    public void setAttributeData(AttributeData[] attributePairs)
-    {
-        this.attributeData = attributePairs;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/attributegroup/CommonDialogFieldWizard.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/attributegroup/CommonDialogFieldWizard.java
deleted file mode 100644
index 03dcb90..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/attributegroup/CommonDialogFieldWizard.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.attributegroup;
-
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogFieldGroupPage;
-import org.eclipse.ui.internal.dialogs.NewWizard;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class CommonDialogFieldWizard extends NewWizard
-{
-    DialogFieldGroupPage mainPage;
-    /**
-     * Constructg a new wizard using page as the wizard mage
-     * 
-     * @param page
-     */
-    public CommonDialogFieldWizard(DialogFieldGroupPage page)
-    {
-        this.mainPage = page;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.wizard.IWizard#performFinish()
-     */
-    public boolean performFinish()
-    {
-        return true;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.wizard.IWizard#addPages()
-     */
-    public void addPages()
-    {
-        addPage(mainPage);        
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/attributegroup/DialogFieldFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/attributegroup/DialogFieldFactory.java
deleted file mode 100644
index 3a98d39..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/attributegroup/DialogFieldFactory.java
+++ /dev/null
@@ -1,153 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.attributegroup;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jst.jsf.common.metadata.Entity;
-import org.eclipse.jst.jsf.common.metadata.Trait;
-import org.eclipse.jst.jsf.common.metadata.internal.TraitValueHelper;
-import org.eclipse.jst.jsf.common.metadata.query.TaglibDomainMetaDataQueryHelper;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.ClassButtonDialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.ComboDialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.RadiosDialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.StringDialogField;
-import org.eclipse.jst.jsf.metadataprocessors.MetaDataEnabledProcessingFactory;
-import org.eclipse.jst.pagedesigner.meta.IAttributeRuntimeValueType;
-
-/**
- * @author mengbo
- * @version 1.5
- * @TODO - unused now
- */
-public class DialogFieldFactory
-{
-    /**
-     * @param data
-     * @return the dialog field for data
-     */
-    public static DialogField getDialogField(AttributeData data)
-    {
-    	Object project = data.getParamMap().get(AttributeData.Project);
-    	Entity attrEntity = null;
-    	if (project instanceof IProject){
-    		attrEntity = TaglibDomainMetaDataQueryHelper.getEntity(TaglibDomainMetaDataQueryHelper.createMetaDataModelContext((IProject)project, data.getUri()), data.getElementName()+"/"+data.getAttributeName()); //$NON-NLS-1$
-    	}
-
-        if(attrEntity != null)
-        {
-        	Trait t = TaglibDomainMetaDataQueryHelper.getTrait(attrEntity, MetaDataEnabledProcessingFactory.ATTRIBUTE_VALUE_RUNTIME_TYPE_PROP_NAME);
-            String type = TraitValueHelper.getValueAsString(t);
-            if (IAttributeRuntimeValueType.JAVACLASS.equals(type)) 
-            {
-                ClassButtonDialogField field = new ClassButtonDialogField(null);
-//                Object project = data.getParamMap().get(AttributeData.Project);
-                if (project instanceof IProject)
-                {
-                    field.setProject((IProject) project);
-                }
-                Object superType = data.getParamMap().get(AttributeData.SuperType);
-                field.setSuperClassName((String) superType);
-                return field;
-            }
-        }
-        return new StringDialogField();
-    }   
-    
-    /**
-     * Sets the initial value of dialog field
-     * @param field
-     * @param value
-     */
-    public static void setDialogFieldValue(DialogField field, Object value){
-        if (field instanceof StringDialogField)
-        {
-            ((StringDialogField) field).setTextWithoutUpdate(value == null ? "" : value.toString());//$NON-NLS-1$
-        }
-        else if (field instanceof ComboDialogField)
-        {
-            ((ComboDialogField) field).setTextWithoutUpdate(value == null ? "" : value.toString());//$NON-NLS-1$
-        }
-        else if (field instanceof RadiosDialogField)
-        {
-            if (value instanceof Integer)
-            {
-                ((RadiosDialogField) field).setSelectedIndex(((Integer) value).intValue());
-            }
-        }
-    }
-    
-    /**
-     * @param field
-     * @param value
-     * @deprecated - use setDialogField method
-     */
-    public static void setDialogFiledValue(DialogField field, Object value)
-    {
-    	setDialogFieldValue(field, value);
-    }
-
-    /**
-     * Sets value of field into AttributeData if it was a StringDialogField
-     * @param field
-     * @param pair
-     */
-    public static void prepareDialogFieldValue(DialogField field, AttributeData pair)
-    {
-        if (field instanceof StringDialogField)
-        {
-            pair.setValue(((StringDialogField) field).getText());
-        }
-    }
-
-    /**
-     * @param field
-     * @param pair
-     * @deprecated - use prepareDialogFieldValue
-     */
-    public static void prepareDialogFiledValue(DialogField field, AttributeData pair)
-    {
-    	prepareDialogFieldValue(field, pair);
-    }
-    /**
-     * @param data
-     * @return the dialog field label for data
-     */
-    public static String getDialogFieldLabel(AttributeData data)
-    {
-        String name = data.getAttributeName();
-        int gap = 'a' - 'A';
-        if(name != null)
-        {
-            char[] chars = name.toCharArray();
-            char[] newChars = new char[chars.length*2];
-            if(chars.length > 0)
-            {
-                newChars[0] = chars[0] >= 'a' ? (char)(chars[0] - gap) : chars[0];
-            }
-            int newPos = 1;
-            for(int i=1; i<chars.length; i++,newPos++)
-            {
-                if(chars[i] >= 'A' && chars[i] <= 'Z')
-                {
-                    newChars[newPos++] = ' ';
-                }
-                newChars[newPos] = chars[i];
-            }
-            char[] labelChars = new char[newPos + 1];
-            System.arraycopy(newChars,0,labelChars,0,newPos);
-            labelChars[newPos] = ':';
-            return new String(labelChars);
-        }
-        return "";//$NON-NLS-1$
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/AddJSFCoreChildCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/AddJSFCoreChildCommand.java
deleted file mode 100644
index 70eec64..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/AddJSFCoreChildCommand.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.commands.jsfhtml;
-
-import java.util.Iterator;
-import java.util.Map;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.w3c.dom.Element;
-
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.commands.DesignerCommand;
-import org.eclipse.jst.pagedesigner.utils.JSPUtil;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class AddJSFCoreChildCommand extends DesignerCommand
-{
-    // either use single name/value pair
-    private String     _attrName;
-    private String     _attrValue;
-    // or use a map.
-    private Map        _attrMap;
-
-    private String     _coreChildLocalName;
-    private IDOMElement _parent;
-
-    /**
-     * @param parent 
-     * @param coreChildLocalName 
-     * @param attributes 
-     */
-    public AddJSFCoreChildCommand(IDOMElement parent, String coreChildLocalName, Map attributes)
-    {
-        super("", parent); //$NON-NLS-1$
-        StringBuffer buffer = new StringBuffer(CommandResources.getString("AddJSFCoreChildCommand.Label.Add")); //$NON-NLS-1$
-        if(coreChildLocalName != null && coreChildLocalName.length() > 0)
-        {
-            buffer.append(coreChildLocalName.substring(0,1).toUpperCase());
-            buffer.append(coreChildLocalName.substring(1));
-        }
-        setLabel(buffer.toString());
-        this._parent = parent;
-        this._coreChildLocalName = coreChildLocalName;
-        this._attrMap = attributes;
-    }
-
-    /**
-     * @param parent 
-     * @param coreChildLocalName 
-     * @param aname 
-     * @param avalue 
-     */
-    public AddJSFCoreChildCommand(IDOMElement parent, String coreChildLocalName, String aname, String avalue)
-    {
-        super("", parent); //$NON-NLS-1$
-        StringBuffer buffer = new StringBuffer(CommandResources.getString("AddJSFCoreChildCommand.Label.Add")); //$NON-NLS-1$
-        if(coreChildLocalName != null && coreChildLocalName.length() > 0)
-        {
-            buffer.append(coreChildLocalName.substring(0,1).toUpperCase());
-            buffer.append(coreChildLocalName.substring(1));
-        }
-        setLabel(buffer.toString());
-        this._parent = parent;
-        this._coreChildLocalName = coreChildLocalName;
-        this._attrName = aname;
-        this._attrValue = avalue;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-     */
-    protected void doExecute()
-    {
-        String prefix = JSPUtil.getOrCreatePrefix(this.getModel(), ITLDConstants.URI_JSF_CORE, "f"); //$NON-NLS-1$
-        String tag = _coreChildLocalName;
-        Element child = _parent.getOwnerDocument().createElement(tag);
-        child.setPrefix(prefix);
-        if (_attrMap != null)
-        {
-            for (Iterator iter = _attrMap.keySet().iterator(); iter.hasNext();)
-            {
-                String key = (String) iter.next();
-                String value = (String) _attrMap.get(key);
-
-                child.setAttribute(key, value);
-            }
-        }
-        if (_attrName != null)
-        {
-            child.setAttribute(_attrName, _attrValue);
-        }
-
-        _parent.appendChild(child);
-        formatNode(child);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#getAfterCommandDesignerSelection()
-     */
-    protected ISelection getAfterCommandDesignerSelection()
-    {
-        return toDesignSelection(_parent);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/CommandResources.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/CommandResources.java
deleted file mode 100644
index 11e8976..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/CommandResources.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.commands.jsfhtml;
-
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public final class CommandResources
-{
-    private static final String         BUNDLE_NAME     = "org.eclipse.jst.pagedesigner.jsf.ui.commands.jsfhtml.CommandResources"; //$NON-NLS-1$
-
-    private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle.getBundle(BUNDLE_NAME);
-
-    private CommandResources()
-    {
-        // no external instantiation
-    }
-
-    /**
-     * @param key
-     * @return the resource for key or !key! if not found
-     */
-    public static String getString(String key)
-    {
-        try
-        {
-            return RESOURCE_BUNDLE.getString(key);
-        }
-        catch (MissingResourceException e)
-        {
-            return '!' + key + '!';
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/CommandResources.properties b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/CommandResources.properties
deleted file mode 100644
index fc1ff34..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/CommandResources.properties
+++ /dev/null
@@ -1,27 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-AddJSFCoreChildCommand.Label.Add=Add
-DataTableDeleteColumnCommand.Label.DeleteColumn=Delete Column
-DataTableDeleteHeaderCommand.Label.DeleteHeader=Delete Header
-DataTableDeleteHeaderCommand.Label.DeleteFooter=Delete Footer
-DataTableInsertColumnCommand.Label.InsertColumn=Insert Column
-DataTableInsertHeaderCommand.Label.InsertHeader=Insert Header
-DataTableInsertHeaderCommand.Label.InsertFooter=Insert Footer
-DataTableInsertColumnHeaderCommand.Label.InsertHeader=Insert Header
-DataTableInsertColumnHeaderCommand.Label.InsertFooter=Insert Footer
-DataTableDeleteColumnHeaderCommand.Label.DeleteColumnHeader=Delete Column Header
-DataTableDeleteColumnHeaderCommand.Label.DeleteColumnFooter=Delete Column Footer
-PanelGridDeleteColumnCommand.Label.DeleteColumn=Delete Column
-PanelGridInsertColumnCommand.Label.InsertColumn=Insert Column
-PanelGridInsertFooterCommand.Label.InsertFooter=Insert Footer
-PanelGridInsertHeaderCommand.Label.InsertHeader=Insert Header
-PanelGridDeleteRowCommand.Label.DeleteRow=Delete Row
-PanelGridInsertRowCommand.Label.InsertRow=Insert Row
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/DataTableDeleteColumnCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/DataTableDeleteColumnCommand.java
deleted file mode 100644
index 12dce24..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/DataTableDeleteColumnCommand.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.commands.jsfhtml;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.pagedesigner.commands.DesignerCommand;
-import org.eclipse.jst.pagedesigner.jsf.core.dom.JSFDOMUtil;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-
-/**
- * Delete a column from dataTable.
- * 
- * @author mengbo
- * @version 1.5
- */
-public class DataTableDeleteColumnCommand extends DesignerCommand
-{
-
-    private Element _dataTable;
-    private int     _index;
-
-    /**
-     * @param viewer
-     * @param dataTable 
-     * @param columnIndex 
-     */
-    public DataTableDeleteColumnCommand(IHTMLGraphicalViewer viewer, Element dataTable, int columnIndex)
-    {
-        super(CommandResources.getString("DataTableDeleteColumnCommand.Label.DeleteColumn"), viewer); //$NON-NLS-1$
-        this._dataTable = dataTable;
-        this._index = columnIndex;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.gef.commands.Command#canExecute()
-     */
-    public boolean canExecute()
-    {
-        if (this._index < 0)
-        {
-            return false;
-        }
-        return super.canExecute();
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-     */
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-     */
-    protected void doExecute()
-    {
-        NodeList children = _dataTable.getChildNodes();
-        int index = 0;
-        for (int i = 0, size = children.getLength(); i < size; i++)
-        {
-            Node node = children.item(i);
-            if (JSFDOMUtil.isHColumn(node))
-            {
-                if (index++ == this._index)
-                {
-                    _dataTable.removeChild(node);
-                    return;
-                }
-            }
-        }
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#getAfterCommandDesignerSelection()
-     */
-    protected ISelection getAfterCommandDesignerSelection()
-    {
-        return toDesignSelection(_dataTable);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/DataTableDeleteColumnHeaderCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/DataTableDeleteColumnHeaderCommand.java
deleted file mode 100644
index c16d4eb..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/DataTableDeleteColumnHeaderCommand.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.commands.jsfhtml;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.pagedesigner.commands.DesignerCommand;
-import org.eclipse.jst.pagedesigner.jsf.core.dom.JSFDOMUtil;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class DataTableDeleteColumnHeaderCommand extends DesignerCommand
-{
-    boolean         _header;   // true means header, false means footer.
-    private Element _dataTable;
-
-    /**
-     * @param viewer
-     * @param dataTable 
-     * @param header 
-     */
-    public DataTableDeleteColumnHeaderCommand(IHTMLGraphicalViewer viewer, Element dataTable, boolean header)
-    {
-        super(header ? CommandResources.getString("DataTableDeleteColumnHeaderCommand.Label.DeleteColumnHeader") : //$NON-NLS-1$
-        CommandResources.getString("DataTableDeleteColumnHeaderCommand.Label.DeleteColumnFooter"), viewer); //$NON-NLS-1$ 
-        this._header = header;
-        this._dataTable = dataTable;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.gef.commands.Command#canExecute()
-     */
-    public boolean canExecute()
-    {
-        int num = 0;
-        NodeList children = _dataTable.getChildNodes();
-        for (int i = 0, size = children.getLength(); i < size; i++)
-        {
-            Node node = children.item(i);
-            if (JSFDOMUtil.isHColumn(node))
-            {
-                Element column = (Element) node;
-                if (hasHeader(column))
-                {
-                    num++;
-                    break;
-                }
-            }
-        }
-        if (num == 0)
-        {
-            return false;
-        }
-        return super.canExecute();
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-     */
-    protected void doExecute()
-    {
-        NodeList children = _dataTable.getChildNodes();
-        for (int i = 0, size = children.getLength(); i < size; i++)
-        {
-            Node node = children.item(i);
-            if (JSFDOMUtil.isHColumn(node))
-            {
-                Element column = (Element) node;
-                if (hasHeader(column))
-                {
-                    Element hf = JSFDOMUtil.findFacet(column, _header ? "header" : "footer"); //$NON-NLS-1$ //$NON-NLS-2$
-                    column.removeChild(hf);
-                }
-            }
-        }
-        formatNode(this._dataTable);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#getAfterCommandDesignerSelection()
-     */
-    protected ISelection getAfterCommandDesignerSelection()
-    {
-        return toDesignSelection(_dataTable);
-    }
-
-    /**
-     * @param column
-     * @param _header2
-     * @return
-     */
-    private boolean hasHeader(Element column)
-    {
-        return JSFDOMUtil.findFacet(column, _header ? "header" : "footer") != null; //$NON-NLS-1$ //$NON-NLS-2$
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/DataTableDeleteHeaderCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/DataTableDeleteHeaderCommand.java
deleted file mode 100644
index 44dfff2..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/DataTableDeleteHeaderCommand.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.commands.jsfhtml;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.pagedesigner.commands.DesignerCommand;
-import org.eclipse.jst.pagedesigner.jsf.core.dom.JSFDOMUtil;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Element;
-
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class DataTableDeleteHeaderCommand extends DesignerCommand
-{
-    /**
-     * true means header,false means footer
-     */
-    boolean         _isHeader;
-    private Element _dataTable;
-
-    /**
-     * @param viewer
-     * @param dataTable
-     * @param isHeader
-     */
-    public DataTableDeleteHeaderCommand(IHTMLGraphicalViewer viewer, Element dataTable, boolean isHeader)
-    {
-        super(isHeader ? CommandResources.getString("DataTableDeleteHeaderCommand.Label.DeleteHeader") : //$NON-NLS-1$
-        CommandResources.getString("DataTableDeleteHeaderCommand.Label.DeleteFooter"), viewer); //$NON-NLS-1$ 
-        this._isHeader = isHeader;
-        this._dataTable = dataTable;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.gef.commands.Command#canExecute()
-     */
-    public boolean canExecute()
-    {
-        if (this._isHeader)
-        {
-            boolean hasHeader = (JSFDOMUtil.findFacet(this._dataTable, "header") != null); //$NON-NLS-1$
-            if (!hasHeader)
-            {
-                return false;
-            }
-        }
-        else
-        {
-            boolean hasFooter = (JSFDOMUtil.findFacet(this._dataTable, "footer") != null); //$NON-NLS-1$
-            if (!hasFooter)
-            {
-                return false;
-            }
-        }
-        return super.canExecute();
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-     */
-    protected void doExecute()
-    {
-        String type = (this._isHeader) ? "header" : "footer"; //$NON-NLS-1$ //$NON-NLS-2$
-        Element ele = JSFDOMUtil.findFacet(this._dataTable, type);
-        if (ele != null)
-        {
-            this._dataTable.removeChild(ele);
-        }
-        formatNode(this._dataTable);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#getAfterCommandDesignerSelection()
-     */
-    protected ISelection getAfterCommandDesignerSelection()
-    {
-        return toDesignSelection(_dataTable);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/DataTableInsertColumnCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/DataTableInsertColumnCommand.java
deleted file mode 100644
index b5c7d0c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/DataTableInsertColumnCommand.java
+++ /dev/null
@@ -1,162 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.commands.jsfhtml;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.commands.DesignerCommand;
-import org.eclipse.jst.pagedesigner.jsf.core.dom.JSFDOMUtil;
-import org.eclipse.jst.pagedesigner.utils.JSPUtil;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-/**
- * Insert a column into dataTable.
- * 
- * @author mengbo
- * @version 1.5
- */
-public class DataTableInsertColumnCommand extends DesignerCommand
-{
-    Element _dataTable;
-    Element _child;
-    int     _index;
-
-    /**
-     * 
-     * @param viewer
-     * @param dataTable
-     * @param index 0 means before the first column.
-     */
-    public DataTableInsertColumnCommand(IHTMLGraphicalViewer viewer, Element dataTable, int index)
-    {
-        super(CommandResources.getString("DataTableInsertColumnCommand.Label.InsertColumn"), viewer); //$NON-NLS-1$
-        this._dataTable = dataTable;
-        this._index = index;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.gef.commands.Command#canExecute()
-     */
-    public boolean canExecute()
-    {
-        if (this._index < 0)
-        {
-            return false;
-        }
-        return super.canExecute();
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-     */
-    protected void doExecute()
-    {
-        String prefix = JSPUtil.getOrCreatePrefix(getModel(), ITLDConstants.URI_JSF_HTML, "h"); //$NON-NLS-1$
-        _child = _dataTable.getOwnerDocument().createElement(prefix + ":column"); //$NON-NLS-1$
-
-        createHeaderFooter(_child);
-        NodeList children = _dataTable.getChildNodes();
-        int count = 0;
-        for (int i = 0, size = children.getLength(); i < size; i++)
-        {
-            Node node = children.item(i);
-            if (JSFDOMUtil.isHColumn(node))
-            {
-                if (_index == count)
-                {
-                    _dataTable.insertBefore(_child, node);
-                    return;
-                }
-                count++;
-            }
-        }
-        _dataTable.insertBefore(_child, null);
-        formatNode(this._child);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#getAfterCommandDesignerSelection()
-     */
-    protected ISelection getAfterCommandDesignerSelection()
-    {
-        return toDesignSelection(_dataTable);
-    }
-
-    /**
-     * check whether the datatable already have header and footer, if yes,
-     * then also create for this column
-     * 
-     * @param column
-     */
-    private void createHeaderFooter(Element column)
-    {
-        boolean hasHeader = false;
-        boolean hasFooter = false;
-        NodeList children = _dataTable.getChildNodes();
-        for (int i = 0, size = children.getLength(); i < size; i++)
-        {
-            Node node = children.item(i);
-            if (JSFDOMUtil.isHColumn(node))
-            {
-                if (!hasHeader && JSFDOMUtil.findFacet((Element) node, "header") != null) //$NON-NLS-1$
-                {
-                    hasHeader = true;
-                }
-                if (!hasFooter && JSFDOMUtil.findFacet((Element) node, "footer") != null) //$NON-NLS-1$
-                {
-                    hasFooter = true;
-                }
-            }
-        }
-        if (hasHeader)
-        {
-            Element facet = createFacet();
-            facet.setAttribute("name", "header"); //$NON-NLS-1$ //$NON-NLS-2$
-            Element ele = createDefaultElement();
-            facet.appendChild(ele);
-            column.appendChild(facet);
-        }
-        if (hasFooter)
-        {
-            Element facet = createFacet();
-            facet.setAttribute("name", "footer"); //$NON-NLS-1$ //$NON-NLS-2$
-            Element ele = createDefaultElement();
-            facet.appendChild(ele);
-            column.appendChild(facet);
-        }
-    }
-
-    /**
-     * @return
-     */
-    private Element createFacet()
-    {
-        String prefix = JSPUtil.getOrCreatePrefix(getModel(), ITLDConstants.URI_JSF_CORE, "f"); //$NON-NLS-1$
-        Element ele = _dataTable.getOwnerDocument().createElement(IJSFConstants.TAG_FACET);
-        ele.setPrefix(prefix);
-        return ele;
-    }
-
-    private Element createDefaultElement()
-    {
-        String prefix = JSPUtil.getOrCreatePrefix(getModel(), ITLDConstants.URI_JSF_HTML, "h"); //$NON-NLS-1$
-        Element ele = _dataTable.getOwnerDocument().createElement(IJSFConstants.TAG_OUTPUTTEXT);
-        ele.setPrefix(prefix);
-        ele.setAttribute(IJSFConstants.ATTR_VALUE, "Column"); //$NON-NLS-1$
-        return ele;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/DataTableInsertColumnHeaderCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/DataTableInsertColumnHeaderCommand.java
deleted file mode 100644
index f69707f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/DataTableInsertColumnHeaderCommand.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.commands.jsfhtml;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.commands.DesignerCommand;
-import org.eclipse.jst.pagedesigner.jsf.core.dom.JSFDOMUtil;
-import org.eclipse.jst.pagedesigner.utils.JSPUtil;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class DataTableInsertColumnHeaderCommand extends DesignerCommand
-{
-    boolean         _header;   // true means header, false means footer.
-    private Element _dataTable;
-
-    /**
-     * @param viewer
-     * @param dataTable 
-     * @param header 
-     */
-    public DataTableInsertColumnHeaderCommand(IHTMLGraphicalViewer viewer, Element dataTable, boolean header)
-    {
-        super(header ? CommandResources.getString("DataTableInsertColumnHeaderCommand.Label.InsertHeader") : CommandResources.getString("DataTableInsertColumnHeaderCommand.Label.InsertFooter"), viewer); //$NON-NLS-1$ //$NON-NLS-2$
-        this._header = header;
-        this._dataTable = dataTable;
-    }
-
-    public boolean canExecute()
-    {
-        int num = 0;
-        NodeList children = _dataTable.getChildNodes();
-        for (int i = 0, size = children.getLength(); i < size; i++)
-        {
-            Node node = children.item(i);
-            if (JSFDOMUtil.isHColumn(node))
-            {
-                Element column = (Element) node;
-                if (!hasHeader(column))
-                {
-                    num++;
-                    break;
-                }
-            }
-        }
-        if (num == 0)
-        {
-            return false;
-        }
-        return super.canExecute();
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-     */
-    protected void doExecute()
-    {
-        String type = (this._header) ? "header" : "footer"; //$NON-NLS-1$ //$NON-NLS-2$
-
-        NodeList children = _dataTable.getChildNodes();
-        for (int i = 0, size = children.getLength(); i < size; i++)
-        {
-            Node node = children.item(i);
-            if (JSFDOMUtil.isHColumn(node))
-            {
-                Element column = (Element) node;
-                if (!hasHeader(column))
-                {
-                    Element headerOrFooter = createHeaderOrFooter(type);
-                    column.appendChild(headerOrFooter);
-                }
-            }
-        }
-        formatNode(this._dataTable);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#getAfterCommandDesignerSelection()
-     */
-    protected ISelection getAfterCommandDesignerSelection()
-    {
-        return toDesignSelection(_dataTable);
-    }
-
-    /**
-     * @param column
-     * @param _header2
-     * @return
-     */
-    private boolean hasHeader(Element column)
-    {
-        return JSFDOMUtil.findFacet(column, _header ? "header" : "footer") != null; //$NON-NLS-1$ //$NON-NLS-2$
-    }
-
-    private Element createHeaderOrFooter(String type)
-    {
-        Element facet = createFacet();
-        Element def = createDefaultElement();
-        facet.appendChild(def);
-        facet.setAttribute(IJSFConstants.ATTR_NAME, type);
-        return facet;
-    }
-
-    private Element createFacet()
-    {
-        String prefix = JSPUtil.getOrCreatePrefix(getModel(), ITLDConstants.URI_JSF_CORE, "f"); //$NON-NLS-1$
-        Element ele = _dataTable.getOwnerDocument().createElement(IJSFConstants.TAG_FACET);
-        ele.setPrefix(prefix);
-        return ele;
-    }
-
-    private Element createDefaultElement()
-    {
-        String prefix = JSPUtil.getOrCreatePrefix(getModel(), ITLDConstants.URI_JSF_HTML, "h"); //$NON-NLS-1$
-        Element ele = _dataTable.getOwnerDocument().createElement(IJSFConstants.TAG_OUTPUTTEXT);
-        ele.setPrefix(prefix);
-        if (this._header)
-        {
-            ele.setAttribute(IJSFConstants.ATTR_VALUE, "Column Header"); //$NON-NLS-1$
-        }
-        else
-        {
-            ele.setAttribute(IJSFConstants.ATTR_VALUE, "Column Footer"); //$NON-NLS-1$
-        }
-
-        return ele;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/DataTableInsertHeaderCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/DataTableInsertHeaderCommand.java
deleted file mode 100644
index 4231efc..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/DataTableInsertHeaderCommand.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.commands.jsfhtml;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.w3c.dom.Element;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.commands.DesignerCommand;
-import org.eclipse.jst.pagedesigner.jsf.core.dom.JSFDOMUtil;
-import org.eclipse.jst.pagedesigner.utils.JSPUtil;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-
-/**
- * This command is used to insert a header row or footer row.
- * 
- * @author mengbo
- * @version 1.5
- */
-public class DataTableInsertHeaderCommand extends DesignerCommand
-{
-    boolean         _header;   // true means header, false means footer.
-    private Element _dataTable;
-
-    /**
-     * @param viewer
-     * @param dataTable 
-     * @param header 
-     */
-    public DataTableInsertHeaderCommand(IHTMLGraphicalViewer viewer, Element dataTable, boolean header)
-    {
-        super(header ? CommandResources.getString("DataTableInsertHeaderCommand.Label.InsertHeader") : CommandResources.getString("DataTableInsertHeaderCommand.Label.InsertFooter"), viewer); //$NON-NLS-1$ //$NON-NLS-2$
-        this._header = header;
-        this._dataTable = dataTable;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.gef.commands.Command#canExecute()
-     */
-    public boolean canExecute()
-    {
-        if (this._header)
-        {
-            boolean hasHeader = (JSFDOMUtil.findFacet(this._dataTable, "header") != null); //$NON-NLS-1$
-            if (hasHeader)
-            {
-                return false;
-            }
-        }
-        else
-        {
-            boolean hasFooter = (JSFDOMUtil.findFacet(this._dataTable, "footer") != null); //$NON-NLS-1$
-            if (hasFooter)
-            {
-                return false;
-            }
-        }
-        return super.canExecute();
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-     */
-    protected void doExecute()
-    {
-        String type = (this._header) ? "header" : "footer"; //$NON-NLS-1$ //$NON-NLS-2$
-        Element headerOrFooter = createHeaderOrFooter(type);
-        if (this._header)
-        {
-            this._dataTable.insertBefore(headerOrFooter, this._dataTable.getFirstChild());
-        }
-        else
-        {
-            this._dataTable.appendChild(headerOrFooter);
-        }
-        formatNode(this._dataTable);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#getAfterCommandDesignerSelection()
-     */
-    protected ISelection getAfterCommandDesignerSelection()
-    {
-        return toDesignSelection(_dataTable);
-    }
-
-    private Element createHeaderOrFooter(String type)
-    {
-        Element facet = createFacet();
-        Element def = createDefaultElement();
-        facet.appendChild(def);
-        facet.setAttribute(IJSFConstants.ATTR_NAME, type);
-        return facet;
-    }
-
-    private Element createFacet()
-    {
-        String prefix = JSPUtil.getOrCreatePrefix(getModel(), ITLDConstants.URI_JSF_CORE, "f"); //$NON-NLS-1$
-        Element ele = _dataTable.getOwnerDocument().createElement(IJSFConstants.TAG_FACET);
-        ele.setPrefix(prefix);
-        return ele;
-    }
-
-    private Element createDefaultElement()
-    {
-        String prefix = JSPUtil.getOrCreatePrefix(getModel(), ITLDConstants.URI_JSF_HTML, "h"); //$NON-NLS-1$
-        Element ele = _dataTable.getOwnerDocument().createElement(IJSFConstants.TAG_OUTPUTTEXT);
-        ele.setPrefix(prefix);
-        if (this._header)
-        {
-            ele.setAttribute(IJSFConstants.ATTR_VALUE, "Table Header"); //$NON-NLS-1$
-        }
-        else
-        {
-            ele.setAttribute(IJSFConstants.ATTR_VALUE, "Table Footer"); //$NON-NLS-1$
-        }
-        return ele;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/PanelGridDeleteColumnCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/PanelGridDeleteColumnCommand.java
deleted file mode 100644
index 38d9451..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/PanelGridDeleteColumnCommand.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.commands.jsfhtml;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jface.viewers.ISelection;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-import org.eclipse.jst.pagedesigner.commands.DesignerCommand;
-import org.eclipse.jst.pagedesigner.jsf.core.dom.JSFDOMUtil;
-import org.eclipse.jst.pagedesigner.jsf.ui.JSFUIPlugin;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-
-/**
- * This is for delete a column in panelGrid
- * 
- * @author mengbo
- * @version 1.5
- */
-public class PanelGridDeleteColumnCommand extends DesignerCommand
-{
-
-    private int     _columnIndex;
-    private Element _panelGridEle;
-
-    /**
-     * @param viewer
-     * @param panelGrid 
-     * @param columnIndex 
-     */
-    public PanelGridDeleteColumnCommand(IHTMLGraphicalViewer viewer, Element panelGrid, int columnIndex)
-    {
-        super(CommandResources.getString("PanelGridDeleteColumnCommand.Label.DeleteColumn"), viewer); //$NON-NLS-1$
-        this._panelGridEle = panelGrid;
-        this._columnIndex = columnIndex;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.gef.commands.Command#canExecute()
-     */
-    public boolean canExecute()
-    {
-        //if user chose header or footer,then disable the delete column action
-        if (this._columnIndex < 0)
-        {
-            return false;
-        }
-        int columns = DOMUtil.getIntAttributeIgnoreCase(_panelGridEle, "columns", 1); //$NON-NLS-1$
-        if (columns < 1)
-        {
-            columns = 1;
-        }
-        return columns > 1;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-     */
-    protected void doExecute()
-    {
-        int columns = DOMUtil.getIntAttributeIgnoreCase(_panelGridEle, "columns", 1); //$NON-NLS-1$
-        if (columns < 1)
-        {
-            columns = 1;
-        }
-
-        if (_columnIndex >= columns)
-        {
-            JSFUIPlugin.log(IStatus.ERROR, "Should not happen", new Throwable()); //$NON-NLS-1$
-            return;
-        }
-        List children = JSFDOMUtil.getUIComponentChildren(_panelGridEle);
-        List toRemove = new ArrayList();
-        for (int i = _columnIndex; i < children.size(); i += columns)
-        {
-            toRemove.add(children.get(i));
-        }
-        for (int i = 0, size = toRemove.size(); i < size; i++)
-        {
-            _panelGridEle.removeChild((Node) toRemove.get(i));
-        }
-
-        _panelGridEle.setAttribute("columns", String.valueOf(columns - 1)); //$NON-NLS-1$
-        formatNode(_panelGridEle);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#getAfterCommandDesignerSelection()
-     */
-    protected ISelection getAfterCommandDesignerSelection()
-    {
-        return toDesignSelection(this._panelGridEle);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/PanelGridDeleteRowCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/PanelGridDeleteRowCommand.java
deleted file mode 100644
index e0a2795..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/PanelGridDeleteRowCommand.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.commands.jsfhtml;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-import org.eclipse.jst.pagedesigner.commands.DesignerCommand;
-import org.eclipse.jst.pagedesigner.jsf.core.dom.JSFDOMUtil;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-
-/**
- * Remove a row from panel grid
- * 
- * @author mengbo
- * @version 1.5
- */
-public class PanelGridDeleteRowCommand extends DesignerCommand
-{
-    Element _panelGridEle;
-    int     _rowIndex;
-
-    /**
-     * @param viewer
-     * @param panelGrid 
-     * @param index 
-     */
-    public PanelGridDeleteRowCommand(IHTMLGraphicalViewer viewer, Element panelGrid, int index)
-    {
-        super(CommandResources.getString("PanelGridDeleteRowCommand.Label.DeleteRow"), viewer); //$NON-NLS-1$
-        this._panelGridEle = panelGrid;
-        this._rowIndex = index;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-     */
-    protected void doExecute()
-    {
-        // Remove the row from panelGrid is a little complex. Since this row could
-        // be header or footer.
-        boolean hasHeaderRow = (JSFDOMUtil.findFacet(_panelGridEle, "header") != null); //$NON-NLS-1$
-
-        int columns = DOMUtil.getIntAttributeIgnoreCase(_panelGridEle, "columns", 1); //$NON-NLS-1$
-        if (columns < 1)
-        {
-            columns = 1;
-        }
-
-        List children = JSFDOMUtil.getUIComponentChildren(_panelGridEle);
-        int numRows = (children.size() + columns - 1) / columns;
-
-        int removeRow = _rowIndex;
-
-        if (hasHeaderRow)
-        {
-            if (removeRow == 0)
-            {
-                // remove the header row.
-                removeHeader();
-                formatNode(_panelGridEle);
-                return;
-            }
-            removeRow--;
-        }
-        if (removeRow < numRows)
-        {
-            List toRemove = new ArrayList();
-            int max = columns * (removeRow + 1);
-            max = Math.min(max, children.size());
-            for (int i = (columns * removeRow); i < max; i++)
-            {
-                toRemove.add(children.get(i));
-            }
-            for (int i = 0, size = toRemove.size(); i < size; i++)
-            {
-                _panelGridEle.removeChild((Node) toRemove.get(i));
-            }
-            formatNode(_panelGridEle);
-        }
-        else
-        {
-            // must be footer.
-            removeFooter();
-            formatNode(_panelGridEle);
-        }
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.gef.commands.Command#canExecute()
-     */
-    public boolean canExecute()
-    {
-        if (this._rowIndex < 0)
-        {
-            return false;
-        }
-        return super.canExecute();
-    }
-
-    /**
-     * 
-     */
-    private void removeFooter()
-    {
-        Element ele = JSFDOMUtil.findFacet(_panelGridEle, "footer"); //$NON-NLS-1$
-        if (ele != null)
-        {
-            _panelGridEle.removeChild(ele);
-        }
-    }
-
-    /**
-     * 
-     */
-    private void removeHeader()
-    {
-        Element ele = JSFDOMUtil.findFacet(_panelGridEle, "header"); //$NON-NLS-1$
-        if (ele != null)
-        {
-            _panelGridEle.removeChild(ele);
-        }
-    }
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#getAfterCommandDesignerSelection()
-     */
-    protected ISelection getAfterCommandDesignerSelection()
-    {
-        return this.toDesignSelection(this._panelGridEle);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/PanelGridInsertColumnCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/PanelGridInsertColumnCommand.java
deleted file mode 100644
index 3c68d26..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/PanelGridInsertColumnCommand.java
+++ /dev/null
@@ -1,151 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.commands.jsfhtml;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.commands.DesignerCommand;
-import org.eclipse.jst.pagedesigner.jsf.core.dom.JSFDOMUtil;
-import org.eclipse.jst.pagedesigner.jsf.ui.elementedit.util.PanelGridUtil;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.eclipse.jst.pagedesigner.utils.JSPUtil;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class PanelGridInsertColumnCommand extends DesignerCommand
-{
-    private int     _columnIndex;
-    private Element _panelGridEle;
-
-    /**
-     * construction
-     * @param viewer
-     * @param panelGrid
-     * @param columnIndex
-     */
-    public PanelGridInsertColumnCommand(IHTMLGraphicalViewer viewer, Element panelGrid, int columnIndex)
-    {
-        super(CommandResources.getString("PanelGridInsertColumnCommand.Label.InsertColumn"), viewer); //$NON-NLS-1$
-        this._panelGridEle = panelGrid;
-        this._columnIndex = columnIndex;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.gef.commands.Command#canExecute()
-     */
-    public boolean canExecute()
-    {
-        if (this._columnIndex < 0)
-        {
-            return false;
-        }
-        return super.canExecute();
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-     */
-    protected void doExecute()
-    {
-        int columns = DOMUtil.getIntAttributeIgnoreCase(_panelGridEle, IJSFConstants.ATTR_COLUMNS, 1);
-        if (columns < 1)
-        {
-            columns = 1;
-        }
-
-        int startPoint = 0;
-        if (_columnIndex > columns)
-        {
-            return;
-        }
-        else if (_columnIndex == columns)
-        {
-            startPoint = _columnIndex - 1;
-        }
-        else
-        {
-            startPoint = _columnIndex;
-        }
-
-        List children = JSFDOMUtil.getUIComponentChildren(_panelGridEle);
-
-        List toMove = new ArrayList();
-        for (int i = startPoint; i < children.size(); i += columns)
-        {
-            if (_columnIndex < columns)
-            {
-                toMove.add(children.get(i));
-            }
-            else
-            {
-                int tmp = i + 1;
-                if (tmp == children.size())
-                {
-                    toMove.add(null);
-                }
-                else
-                {
-                    toMove.add(children.get(i + 1));
-                }
-            }
-        }
-        //        for (int i = 0, size = toMove.size(); i < size; i++)
-        int lastRowCells = (children.size() % columns == 0) ? columns : (children.size() % columns);
-        PanelGridUtil util = new PanelGridUtil(this._panelGridEle);
-        int uiRows = util.getUIRowCount();
-        int adds = uiRows;
-        if (this._columnIndex > lastRowCells)
-        {
-            adds += this._columnIndex - lastRowCells;
-        }
-        for (int i = 0, size = adds; i < size; i++)
-        {
-            Node child = createDefaultNode();
-            int toMoveSize = toMove.size();
-            Node node = null;
-            if (i < toMoveSize)
-            {
-                node = (Node) toMove.get(i);
-            }
-            _panelGridEle.insertBefore(child, node);
-        }
-
-        _panelGridEle.setAttribute(IJSFConstants.ATTR_COLUMNS, String.valueOf(columns + 1));
-        formatNode(_panelGridEle);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#getAfterCommandDesignerSelection()
-     */
-    protected ISelection getAfterCommandDesignerSelection()
-    {
-        return toDesignSelection(this._panelGridEle);
-    }
-
-    private Node createDefaultNode()
-    {
-        String prefix = JSPUtil.getOrCreatePrefix(getModel(), ITLDConstants.URI_JSF_HTML, "h"); //$NON-NLS-1$
-        Element child = _panelGridEle.getOwnerDocument().createElement(IJSFConstants.TAG_OUTPUTTEXT);
-        child.setPrefix(prefix);
-        return child;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/PanelGridInsertFooterCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/PanelGridInsertFooterCommand.java
deleted file mode 100644
index d3cb109..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/PanelGridInsertFooterCommand.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.commands.jsfhtml;
-
-import java.util.List;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.commands.DesignerCommand;
-import org.eclipse.jst.pagedesigner.jsf.core.dom.JSFDOMUtil;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class PanelGridInsertFooterCommand extends DesignerCommand
-{
-    private Element _panelGrid;
-
-    /**
-     * @param viewer
-     * @param panelGrid
-     */
-    public PanelGridInsertFooterCommand(IHTMLGraphicalViewer viewer, Element panelGrid)
-    {
-        super(CommandResources.getString("PanelGridInsertFooterCommand.Label.InsertFooter"), viewer); //$NON-NLS-1$
-        this._panelGrid = panelGrid;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.gef.commands.Command#canExecute()
-     */
-    public boolean canExecute()
-    {
-        boolean hasHeader = (JSFDOMUtil.findFacet(this._panelGrid, "footer") != null); //$NON-NLS-1$
-        if (hasHeader)
-        {
-            return false;
-        }
-        return super.canExecute();
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-     */
-    protected void doExecute()
-    {
-        Document doc = this._panelGrid.getOwnerDocument();
-        Element facet = doc.createElement(IJSFConstants.TAG_FACET);
-        facet.setPrefix("f"); //$NON-NLS-1$
-        facet.setAttribute(IJSFConstants.ATTR_NAME, "footer"); //$NON-NLS-1$
-        Element outputText = doc.createElement(IJSFConstants.TAG_OUTPUTTEXT);
-        outputText.setPrefix("h"); //$NON-NLS-1$
-        outputText.setAttribute(IJSFConstants.ATTR_VALUE, "Footer"); //$NON-NLS-1$
-        facet.appendChild(outputText);
-        List list = JSFDOMUtil.getUIComponentChildren(this._panelGrid);
-        if (list != null && list.size() > 0)
-        {
-            this._panelGrid.insertBefore(facet, (Element) list.get(0));
-        }
-        else
-        {
-            this._panelGrid.insertBefore(facet, null);
-        }
-        formatNode(this._panelGrid);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#getAfterCommandDesignerSelection()
-     */
-    protected ISelection getAfterCommandDesignerSelection()
-    {
-        return toDesignSelection(this._panelGrid);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/PanelGridInsertHeaderCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/PanelGridInsertHeaderCommand.java
deleted file mode 100644
index 6a9753d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/PanelGridInsertHeaderCommand.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.commands.jsfhtml;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.commands.DesignerCommand;
-import org.eclipse.jst.pagedesigner.jsf.core.dom.JSFDOMUtil;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class PanelGridInsertHeaderCommand extends DesignerCommand
-{
-    private Element _panelGrid;
-
-    /**
-     * @param viewer
-     * @param panelGrid
-     */
-    public PanelGridInsertHeaderCommand(IHTMLGraphicalViewer viewer, Element panelGrid)
-    {
-        super(CommandResources.getString("PanelGridInsertHeaderCommand.Label.InsertHeader"), viewer); //$NON-NLS-1$
-        this._panelGrid = panelGrid;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.gef.commands.Command#canExecute()
-     */
-    public boolean canExecute()
-    {
-        boolean hasHeader = (JSFDOMUtil.findFacet(this._panelGrid, "header") != null); //$NON-NLS-1$
-        if (hasHeader)
-        {
-            return false;
-        }
-        return super.canExecute();
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-     */
-    protected void doExecute()
-    {
-        Document doc = this._panelGrid.getOwnerDocument();
-        Element facet = doc.createElement(IJSFConstants.TAG_FACET);
-        facet.setPrefix("f"); //$NON-NLS-1$
-        facet.setAttribute(IJSFConstants.ATTR_NAME, "header"); //$NON-NLS-1$
-        Element outputText = doc.createElement(IJSFConstants.TAG_OUTPUTTEXT);
-        outputText.setPrefix("h"); //$NON-NLS-1$
-        outputText.setAttribute(IJSFConstants.ATTR_VALUE, "Header"); //$NON-NLS-1$
-        facet.appendChild(outputText);
-        this._panelGrid.insertBefore(facet, this._panelGrid.getFirstChild());
-        formatNode(this._panelGrid);
-    }
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#getAfterCommandDesignerSelection()
-     */
-    protected ISelection getAfterCommandDesignerSelection()
-    {
-        return toDesignSelection(this._panelGrid);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/PanelGridInsertRowCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/PanelGridInsertRowCommand.java
deleted file mode 100644
index 8971b2c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/PanelGridInsertRowCommand.java
+++ /dev/null
@@ -1,165 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.commands.jsfhtml;
-
-import java.util.List;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.commands.DesignerCommand;
-import org.eclipse.jst.pagedesigner.jsf.core.dom.JSFDOMUtil;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.eclipse.jst.pagedesigner.utils.JSPUtil;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class PanelGridInsertRowCommand extends DesignerCommand
-{
-    private int     _rowIndex;
-    private Element _panelGridEle;
-
-    /**
-     * consturctor
-     * @param viewer
-     * @param panelGrid
-     * @param rowIndex
-     */
-    public PanelGridInsertRowCommand(IHTMLGraphicalViewer viewer, Element panelGrid, int rowIndex)
-    {
-        super(CommandResources.getString("PanelGridInsertRowCommand.Label.InsertRow"), viewer); //$NON-NLS-1$
-        this._panelGridEle = panelGrid;
-        this._rowIndex = rowIndex;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.gef.commands.Command#canExecute()
-     */
-    public boolean canExecute()
-    {
-        if (this._rowIndex < 0)
-        {
-            return false;
-        }
-        boolean hasHeaderRow = (JSFDOMUtil.findFacet(_panelGridEle, "header") != null); //$NON-NLS-1$
-        //forbid insert row before header
-        if (hasHeaderRow && _rowIndex == 0)
-        {
-            return false;
-        }
-
-        int offIndex = this._rowIndex;
-        if (hasHeaderRow)
-        {
-            offIndex--;
-        }
-
-        int columns = DOMUtil.getIntAttributeIgnoreCase(_panelGridEle, IJSFConstants.ATTR_COLUMNS, 1);
-        if (columns < 1)
-        {
-            columns = 1;
-        }
-        List children = JSFDOMUtil.getUIComponentChildren(_panelGridEle);
-        int numRows = (children.size() + columns - 1) / columns;
-        //        //if the last element row is not full,then forbid insert row after the row
-        //        if ((children.size() % columns != 0) && (offIndex == numRows))
-        //        {
-        //            return false;
-        //        }
-        //forbid insert row after the footer row
-        if (offIndex > numRows)
-        {
-            return false;
-        }
-
-        return super.canExecute();
-
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-     */
-    protected void doExecute()
-    {
-        boolean hasHeaderRow = (JSFDOMUtil.findFacet(_panelGridEle, "header") != null); //$NON-NLS-1$
-
-        int columns = DOMUtil.getIntAttributeIgnoreCase(_panelGridEle, IJSFConstants.ATTR_COLUMNS, 1);
-        if (columns < 1)
-        {
-            columns = 1;
-        }
-
-        List children = JSFDOMUtil.getUIComponentChildren(_panelGridEle);
-        int numRows = (children.size() + columns - 1) / columns;
-
-        int insertRow = _rowIndex;
-
-        if (hasHeaderRow)
-        {
-            if (insertRow == 0)
-            {
-                return;
-            }
-            insertRow--;
-        }
-        //if (insertRow < numRows || ((insertRow == numRows) && (children.size() % columns == 0)))
-
-        {
-            int insertPoint = insertRow * columns;
-            Node node = null;
-            if (insertPoint < children.size())
-            {
-                node = (Node) children.get(insertPoint);
-            }
-
-            int adds = 0;
-            //if insert after the last ui row
-            if (insertRow >= numRows)
-            {
-                adds = columns * (numRows + 1) - children.size();
-            }
-            else
-            {
-                adds = columns;
-            }
-
-            for (int i = 0; i < adds; i++)
-            {
-                Node child = createDefaultNode();
-                _panelGridEle.insertBefore(child, node);
-            }
-            formatNode(_panelGridEle);
-        }
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#getAfterCommandDesignerSelection()
-     */
-    protected ISelection getAfterCommandDesignerSelection()
-    {
-        return toDesignSelection(this._panelGridEle);
-    }
-    
-    private Node createDefaultNode()
-    {
-        String prefix = JSPUtil.getOrCreatePrefix(getModel(), ITLDConstants.URI_JSF_HTML, "h"); //$NON-NLS-1$
-        Element child = _panelGridEle.getOwnerDocument().createElement(IJSFConstants.TAG_OUTPUTTEXT);
-        child.setPrefix(prefix);
-        return child;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfcore/JSFCoreConverterFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfcore/JSFCoreConverterFactory.java
deleted file mode 100644
index bb218e5..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfcore/JSFCoreConverterFactory.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.converter.jsfcore;
-
-import java.util.HashSet;
-import java.util.Set;
-
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IStructuredDocumentContextResolverFactory;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IWorkspaceContextResolver;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContextFactory2;
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.converter.AbstractTagConverter;
-import org.eclipse.jst.pagedesigner.converter.HiddenTagConverter;
-import org.eclipse.jst.pagedesigner.converter.IConverterFactory;
-import org.eclipse.jst.pagedesigner.converter.ITagConverter;
-import org.eclipse.jst.pagedesigner.converter.TagConverterToInlineBlock;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.internal.DTTagConverter;
-import org.eclipse.jst.pagedesigner.editors.palette.TagImageManager;
-import org.eclipse.swt.graphics.Image;
-import org.w3c.dom.Element;
-
-
-/**
- * @author mengbo
- * @version 1.5
- * @deprecated Use DTTagConverter meta-data instead
- */
-public class JSFCoreConverterFactory implements IConverterFactory
-{
-
-    private final ILabelProvider        _labelProvider;
-   
-    // TODO C.B: this is a transitional step so that we can incrementally add
-    // new meta-data driven tag converter one-by-one without breaking other existing
-    // if a tag name is in this set, the new DTTagConverter will be created for it,
-    // else, revert to original one
-    private final static Set                   _dtConversionSupported;
-    
-    static
-    {
-        _dtConversionSupported = new HashSet();
-        /*
-        _dtConversionSupported.add(IJSFConstants.TAG_VIEW);
-        _dtConversionSupported.add(IJSFConstants.TAG_FACET);
-        _dtConversionSupported.add(IJSFConstants.TAG_VERBATIM);
-        */
-    }
-    
-    /**
-     * 
-     */
-    public JSFCoreConverterFactory()
-    {
-        super();
-        _labelProvider = new MyLabelProvider();
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.IConverterFactory#createConverter(org.w3c.dom.Element)
-     */
-    public ITagConverter createConverter(Element element, int mode)
-    {
-        String tagName = element.getLocalName();
-        ITagConverter converter;
-        
-        if (_dtConversionSupported.contains(tagName))
-        {
-            converter = createDTTagConverter(element);
-        }
-        else if (IJSFConstants.TAG_VIEW.equalsIgnoreCase(tagName) || IJSFConstants.TAG_SUBVIEW.equalsIgnoreCase(tagName))
-        {
-            converter = new ViewTagConverter(element);
-            ((ViewTagConverter) converter).setNeedBorderDecorator(true);
-        }
-        else if (IJSFConstants.TAG_FACET.equalsIgnoreCase(tagName)
-                || IJSFConstants.TAG_VERBATIM.equalsIgnoreCase(tagName))
-        {
-            AbstractTagConverter toSpan = new TagConverterToInlineBlock(element, mode);
-            toSpan.setMinWidth(10);
-            toSpan.setMinHeight(10);
-            toSpan.setNeedBorderDecorator(true);
-            converter = toSpan;
-        }
-        else if (IJSFConstants.TAG_LOADBUNDLE.equalsIgnoreCase(tagName))
-        {
-            converter = new LoadBundleTagConverter(element, _labelProvider);
-        }
-        else
-        {
-            converter = new HiddenTagConverter(element, _labelProvider);
-        }
-        converter.setMode(mode);
-        return converter;
-    }
-
-    private static class MyLabelProvider extends org.eclipse.jface.viewers.LabelProvider
-    {
-
-        public Image getImage(Object element) 
-        {
-            if (element instanceof ITagConverter)
-            {
-                final Element hostElement = ((ITagConverter)element).getHostElement();
-                IStructuredDocumentContext context = IStructuredDocumentContextFactory2.INSTANCE.getContext(hostElement);
-                if (context != null){   
-                	IWorkspaceContextResolver wsResolver  = IStructuredDocumentContextResolverFactory.INSTANCE.getWorkspaceContextResolver(context);
-                	if (wsResolver != null){
-                		return TagImageManager.getInstance().getSmallIconImage(wsResolver.getProject(),ITLDConstants.URI_JSF_CORE, hostElement.getLocalName());
-                	}
-                }
-            }
-            
-            return null;
-        }
-    }
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.IConverterFactory#getSupportedURI()
-     */
-    public String getSupportedURI()
-    {
-        return ITLDConstants.URI_JSF_CORE;
-    }
-    
-    private ITagConverter createDTTagConverter(Element element)
-    {
-        return new DTTagConverter(element);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfcore/LoadBundleTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfcore/LoadBundleTagConverter.java
deleted file mode 100644
index a5f0fa9..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfcore/LoadBundleTagConverter.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.converter.jsfcore;
-
-import java.io.BufferedInputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.MalformedURLException;
-import java.util.HashMap;
-import java.util.PropertyResourceBundle;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jst.jsf.common.ui.IFileFolderConstants;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.jsf.common.ui.internal.utils.ResourceUtils;
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.converter.HiddenTagConverter;
-import org.eclipse.jst.pagedesigner.utils.PreviewUtil;
-import org.eclipse.jst.pagedesigner.utils.StructuredModelUtil;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @deprecated Use DTTagConverter meta-data instead
- */
-public class LoadBundleTagConverter extends HiddenTagConverter
-{
-    private static Logger _log = PDPlugin.getLogger(LoadBundleTagConverter.class);
-
-    /**
-     * @param host
-     * @param labelProvider 
-     */
-    public LoadBundleTagConverter(Element host, ILabelProvider labelProvider)
-    {
-        super(host, labelProvider);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#convertRefresh(java.lang.Object)
-     */
-    public void convertRefresh(Object context)
-    {
-        Element hostEle = getHostElement();
-        String varString = hostEle.getAttribute(IJSFConstants.ATTR_VAR);
-        String baseName = hostEle.getAttribute(IJSFConstants.ATTR_BASENAME);
-        if (baseName == null || varString == null)
-        {
-            return;
-        }
-        baseName = baseName.replace('.', '/') + IFileFolderConstants.DOT + IFileFolderConstants.EXT_PROPERTIES;
-        IProject project = null;
-        
-        if (hostEle instanceof IDOMNode)
-        {
-            IDOMModel model = ((IDOMNode) hostEle).getModel();
-            if (model != null)
-            {
-                project = StructuredModelUtil.getProjectFor(model);
-            }
-        }
-        if (project == null)
-        {
-            return;
-        }
-        String prop = (new StringBuffer("webroot") //$NON-NLS-1$
-            .append(IFileFolderConstants.PATH_SEPARATOR).append(IFileFolderConstants.FOLDER_WEBINF).append(
-            IFileFolderConstants.PATH_SEPARATOR).append(IFileFolderConstants.FOLDER_CLASS).append(
-            IFileFolderConstants.PATH_SEPARATOR).append(baseName)).toString();
-        IResource res = project.findMember(prop);
-        if (res == null)
-        {
-            prop = IFileFolderConstants.FOLDER_SOURCE + IFileFolderConstants.PATH_SEPARATOR + baseName;
-            res = project.findMember(prop);
-            if (res == null)
-            {
-                return;
-            }
-        }
-        InputStream ins = null;
-        try
-        {
-            File f = new File(res.getLocation().toString());
-            ins = new FileInputStream(f);
-            if (ins != null)
-            {
-                ins = new BufferedInputStream(ins);
-                PropertyResourceBundle bundle = new PropertyResourceBundle(ins);
-                if (bundle != null)
-                {
-                    if (PreviewUtil.getBUNDLE_MAP() == null)
-                    {
-                        PreviewUtil.setBUNDLE_MAP(new HashMap());
-                    }
-                    else
-                    {
-                        PreviewUtil.getBUNDLE_MAP().clear();
-                    }
-                    PreviewUtil.getBUNDLE_MAP().put(varString, bundle);
-                    PreviewUtil.setBUNDLE(bundle);
-                    PreviewUtil.setVAR(varString);
-                }
-            }
-        }
-        catch (MalformedURLException e)
-        {
-            _log.error("LoadBundleTagConverter.convertRefresh.MalformedURLException", e); //$NON-NLS-1$
-            return;
-        }
-        catch (IOException e)
-        {
-            _log.error("LoadBundleTagConverter.convertRefresh.IOException", e); //$NON-NLS-1$
-            return;
-        }
-        finally
-        {
-            ResourceUtils.ensureClosed(ins);
-        }
-
-        return;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfcore/ViewTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfcore/ViewTagConverter.java
deleted file mode 100644
index 7c40521..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfcore/ViewTagConverter.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.converter.jsfcore;
-
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.converter.AbstractTagConverter;
-import org.eclipse.jst.pagedesigner.converter.ConverterUtil;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- * @deprecated Use DTTagConverter meta-data instead
- */
-public class ViewTagConverter extends AbstractTagConverter
-{
-    /**
-     * @param host
-     */
-    public ViewTagConverter(Element host)
-    {
-        super(host);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#doConvertRefresh()
-     */
-    protected Element doConvertRefresh()
-    {
-        Element result = createElement(IHTMLConstants.TAG_DIV);
-        copyChildren(getHostElement(), result);
-//        if(!isPreviewMode())
-//        {
-//            result.setAttribute(IHTMLConstants.ATTR_STYLE,"margin:10px;");
-//        }
-        if(!isPreviewMode() && ConverterUtil.isEmptyContainer(getHostElement()))
-        {
-            result.appendChild(ConverterUtil.createDescriptionElement(getDestDocument(),null));
-        }
-        return result;
-    }
-    	
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isMultiLevel()
-     */
-    public boolean isMultiLevel()
-    {
-        return false;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo#isWidget()
-     */
-    public boolean isWidget()
-    {
-        return false;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/ColumnTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/ColumnTagConverter.java
deleted file mode 100644
index 6990df4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/ColumnTagConverter.java
+++ /dev/null
@@ -1,137 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.converter.jsfhtml;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.StringTokenizer;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.converter.AbstractTagConverter;
-import org.eclipse.jst.pagedesigner.converter.ConvertPosition;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.jsf.core.dom.JSFDOMUtil;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-
-/**
- * @author mengbo
- * @version 1.5
- * @deprecated Use DTTagConverter meta-data instead
- */
-public class ColumnTagConverter extends AbstractTagConverter
-{
-
-    /**
-     * @param host
-     */
-    public ColumnTagConverter(Element host)
-    {
-        super(host);
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#doConvertRefresh()
-     */
-    protected Element doConvertRefresh()
-    {
-        Element hostEle = getHostElement();
-        // we render all non-facet (header, footer) sub elements of this element
-        Element resultEle = createElement(IHTMLConstants.TAG_TD);
-        // --- create column's td in column tag converter, this should not be final solution, we might need to use
-        // referece column figure in td later.
-
-        Node parent = hostEle.getParentNode();
-        int offset;
-        if (parent != null && parent.getLocalName().equals(IJSFConstants.TAG_DATATABLE))
-        {
-            String columnClassesAttr = ((Element) parent).getAttribute(IJSFConstants.ATTR_COLUMNCLASSES);
-            List columnClasses = new ArrayList();
-            if (columnClassesAttr != null)
-            {
-                StringTokenizer tokenizer = new StringTokenizer(columnClassesAttr, ", "); //$NON-NLS-1$
-                while (tokenizer.hasMoreTokens())
-                {
-                    columnClasses.add(tokenizer.nextToken());
-                }
-            }
-            offset = EditModelQuery.getInstance().getSameTypeNodeIndex(hostEle);
-            if (offset < columnClasses.size())
-            {
-                resultEle.setAttribute(ICSSPropertyID.ATTR_CLASS, (String) columnClasses.get(offset));
-            }
-        }
-        if (EditModelQuery.getInstance().hasNonTransparentChild(hostEle, new String[] 
-        {
-                IJSFConstants.TAG_FACET
-        }
-        ))
-        {
-            Node child = hostEle.getFirstChild();
-            int index = 0;
-            while (child != null)
-            {
-                if (!(child instanceof Element)
-                        || !JSFDOMUtil.isFacet((Element) child))
-                {
-                    addChild(child, new ConvertPosition(resultEle, index++));
-                }
-                child = child.getNextSibling();
-            }
-        }
-        else
-        {
-            Node child = createText(" "); //$NON-NLS-1$
-            resultEle.appendChild(child);
-        }
-        return resultEle;
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isMultiLevel()
-     */
-    public boolean isMultiLevel()
-    {
-        return true;
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isWidget()
-     */
-    public boolean isWidget()
-    {
-        return false;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo#needBorderDecorator()
-     */
-    public boolean needBorderDecorator()
-    {
-        Element hostEle = getHostElement();
-        Node parent = hostEle.getParentNode();
-        if (parent != null && parent.getLocalName().equals(IJSFConstants.TAG_DATATABLE))
-        {
-            return false;
-        }
-        return true;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/CommandButtonTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/CommandButtonTagConverter.java
deleted file mode 100644
index 6a286aa..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/CommandButtonTagConverter.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.converter.jsfhtml;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.converter.AbstractTagConverter;
-import org.eclipse.jst.pagedesigner.converter.JSFConverterUtil;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-/**
- * @author mengbo
- * @version 1.5
- * @deprecated Use DTTagConverter meta-data instead
- */
-public class CommandButtonTagConverter extends AbstractTagConverter
-{
-    private List   _nonVisualChildren = Collections.EMPTY_LIST;
-    
-    /**
-     * @param host
-     */
-    public CommandButtonTagConverter(Element host)
-    {
-        super(host);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#doConvertRefresh()
-     */
-    protected Element doConvertRefresh()
-    {
-        Element hostEle = getHostElement();
-
-        // Renders an HTML "input" element.
-        Element inputEle = createElement(IHTMLConstants.TAG_INPUT);
-
-        // pass throught attributes
-        JSFConverterUtil.copyAllAttributes(hostEle, inputEle, null);
-        
-//      If the "styleClass" attribute is specified, render its 
-        // value as the value of the "class" attribute.
-        JSFConverterUtil.copyAttribute(hostEle, IJSFConstants.ATTR_STYLECLASS, inputEle, IHTMLConstants.ATTR_CLASS);
-        
-        inputEle.removeAttribute(IJSFConstants.ATTR_STYLECLASS);
-
-        // next handles input type
-        // "image" attribute:  Absolute or relative URL of the image to be 
-        // displayed for this button. If specified, this "input" element will be 
-        // of type "image". Otherwise, it will be of the type specified by the 
-        // "type" property with a label specified by the "value" property.
-
-        String imageAttr = hostEle.getAttribute(IJSFConstants.ATTR_IMAGE);
-        String type;
-        if (imageAttr == null || imageAttr.length() == 0)
-        {
-            type = hostEle.getAttribute(IJSFConstants.ATTR_TYPE);
-            if (type == null || type.length() == 0)
-            {
-                type = "submit";	// default type //$NON-NLS-1$
-            }
-        }
-        else
-        {
-            type = "image"; //$NON-NLS-1$
-            // copy the image attribute as the src attribute
-            String src = mapURL(imageAttr);
-            inputEle.setAttribute(IHTMLConstants.ATTR_SRC, src);
-        }
-        // overwrite the "type" attribute
-        inputEle.setAttribute(IHTMLConstants.ATTR_TYPE, type);       
-
-        String value = hostEle.getAttribute(IJSFConstants.ATTR_VALUE);
-        if (value != null && value.length() > 0)
-        {
-            value = mapValue(value);
-            inputEle.setAttribute(IHTMLConstants.ATTR_VALUE, value);
-        }
-
-        // get non-visual children
-        // a button only has non-visual children, so
-        // all Element child nodes are considered such
-        if (hostEle.hasChildNodes())
-        {
-            _nonVisualChildren = new ArrayList();
-            
-            NodeList list = hostEle.getChildNodes();
-            
-            for (int i = 0; i < list.getLength(); i++)
-            {
-                Node node = list.item(i);
-                
-                if (node.getNodeType() == Node.ELEMENT_NODE)
-                {
-                    _nonVisualChildren.add(node);
-                }
-            }
-        }
-        
-        // Render the clientId of the component as the value of the "name" attribute. 
-        // Render the current value of the component as the value of the "value" attribute. 
-
-        return inputEle;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isMultiLevel()
-     */
-    public boolean isMultiLevel()
-    {
-        return true;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isWidget()
-     */
-    public boolean isWidget()
-    {
-        return true;
-    }
-
-    public List getNonVisualChildren() {
-        return _nonVisualChildren;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/CommandLinkTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/CommandLinkTagConverter.java
deleted file mode 100644
index a027bc4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/CommandLinkTagConverter.java
+++ /dev/null
@@ -1,148 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.converter.jsfhtml;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.converter.AbstractTagConverter;
-import org.eclipse.jst.pagedesigner.converter.ConvertPosition;
-import org.eclipse.jst.pagedesigner.converter.ConverterUtil;
-import org.eclipse.jst.pagedesigner.converter.JSFConverterUtil;
-import org.eclipse.jst.pagedesigner.jsf.core.dom.JSFDOMUtil;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-
-/**
- * @author mengbo
- * @version 1.5
- * @deprecated Use DTTagConverter meta-data instead
- */
-public class CommandLinkTagConverter extends AbstractTagConverter
-{
-
-    /**
-     * @param host
-     */
-    public CommandLinkTagConverter(Element host)
-    {
-        super(host);
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#doConvertRefresh()
-     */
-    protected Element doConvertRefresh()
-    {
-        Element hostEle = getHostElement();
-        // Render an HTML "a" anchor element that acts like a form submit button when clicked.
-        Element aEle = createElement(IHTMLConstants.TAG_A);
-
-        JSFConverterUtil.copyAllAttributes(hostEle, aEle, null);
-
-        // If the "styleClass" attribute is specified, render its value as the value of the "class" attribute.
-        JSFConverterUtil.copyAttribute(hostEle, IJSFConstants.ATTR_STYLECLASS, aEle, IHTMLConstants.ATTR_CLASS);
-
-        aEle.removeAttribute(IJSFConstants.ATTR_STYLECLASS);
-
-        // Render "#" as the value of the "href" attribute.
-        aEle.setAttribute(IHTMLConstants.ATTR_HREF, "#"); //$NON-NLS-1$
-        // Extend the container border a little to make it selectable
-        if (!isPreviewMode())
-        {
-            String style = aEle.getAttribute(IHTMLConstants.ATTR_STYLE);
-            style = "padding:0.3em;" + style; //$NON-NLS-1$
-            aEle.setAttribute(IHTMLConstants.ATTR_STYLE, style);
-        }
-
-        int childNodeIndex = 0;
-        // Render the current value of the component as the link text if it
-        // is specified.
-        String value = hostEle.getAttribute(IJSFConstants.ATTR_VALUE);
-        if (value != null && value.length() > 0)
-        {
-            value = mapValue(value);
-            aEle.appendChild(createText(value));
-            childNodeIndex = 1;
-        }
-        // generate children
-        // Render any non-UIParameter children as normal inside of the "a" element.
-        // These will appear as the link text.
-
-        if (hostEle.hasChildNodes())
-        {
-            Node child = hostEle.getFirstChild();
-            for (; child != null; child = child.getNextSibling())
-            {
-                if (!shouldIgnore(child))
-                {
-                    if (child instanceof Element
-                            && (JSFDOMUtil.isUIParameter((Element) child) || isActionListener((Element) child)))
-                    {
-                        // skip
-                    }
-                    else
-                    {
-                        addChild(child, new ConvertPosition(aEle, childNodeIndex++));
-                    }
-                }
-            }
-        }
-        if (ConverterUtil.isEmptyContainer(hostEle) && !hostEle.hasAttribute(IJSFConstants.ATTR_VALUE))
-        {
-            aEle.appendChild(getDestDocument().createTextNode(IJSFConstants.TAG_COMMANDLINK));
-        }
-
-        return aEle;
-    }
-    
-    private boolean isActionListener(Element element)
-    {
-        if(element != null && IJSFConstants.TAG_ACTIONLISTENER.equalsIgnoreCase(element.getLocalName()))
-        {
-            return true;
-        }
-        return false;
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isMultiLevel()
-     */
-    public boolean isMultiLevel()
-    {
-        return true;
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isWidget()
-     */
-    public boolean isWidget()
-    {
-        return false;
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo#needBorderDecorator()
-     */
-    public boolean needBorderDecorator()
-    {
-        return true;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/DataTableTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/DataTableTagConverter.java
deleted file mode 100644
index 7dc052a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/DataTableTagConverter.java
+++ /dev/null
@@ -1,306 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.converter.jsfhtml;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.StringTokenizer;
-
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.jsf.core.internal.tld.TagIdentifierFactory;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.converter.AbstractTagConverter;
-import org.eclipse.jst.pagedesigner.converter.ConvertPosition;
-import org.eclipse.jst.pagedesigner.converter.ConverterUtil;
-import org.eclipse.jst.pagedesigner.converter.JSFConverterUtil;
-import org.eclipse.jst.pagedesigner.jsf.core.dom.JSFDOMUtil;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-
-/**
- * @author mengbo
- * @version 1.5
- * @deprecated Use DTTagConverter meta-data instead
- */
-public class DataTableTagConverter extends AbstractTagConverter
-{
-    private static final String FACET_NAME_HEADER = "header"; //$NON-NLS-1$
-
-    /**
-     * @param host
-     */
-    public DataTableTagConverter(Element host)
-    {
-        super(host);
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#doConvertRefresh()
-     */
-    protected Element doConvertRefresh()
-    {
-        Element hostEle = getHostElement();
-
-        // Renders an HTML "table" element compliant with the HTML 401 specification.
-        Element tableEle = createElement(IHTMLConstants.TAG_TABLE);
-
-        // Any pass-through attributes are also rendered on the "table" element.
-        JSFConverterUtil.copyAllAttributes(hostEle, tableEle, null);
-
-        // Please consult the javadoc for UIData to supplement this specification.
-        // If the "styleClass" attribute is specified, render its value as the value
-        // of the "class" attribute on the "table" element.
-        ConverterUtil.copyAttribute(hostEle, IJSFConstants.ATTR_STYLECLASS, tableEle, IHTMLConstants.ATTR_CLASS);
-        tableEle.removeAttribute(IJSFConstants.ATTR_STYLECLASS);
-
-        List columns = findUIColumns(hostEle);
-
-        // rendering the thead
-        convertTHeader(hostEle, tableEle, columns, true);
-
-        convertTBody(hostEle, tableEle, columns);
-        // rendering the tfoot
-        // Follow the same process as for the header, except replace "header" with
-        // "footer", "th" with "td", "thead" with "tfoot", and "headerClass" with
-        // "footerClass". Do not render any "scope" attribute for the footer.
-        convertTHeader(hostEle, tableEle, columns, false);
-
-        return tableEle;
-    }
-
-    /**
-     * @param hostEle
-     * @return
-     */
-    private List findUIColumns(Element hostEle)
-    {
-        List result = new ArrayList();
-        Node child = hostEle.getFirstChild();
-        if (child != null)
-        {
-
-            while (child != null)
-            {
-                if (child instanceof Element)
-                {
-                    Element ele = (Element) child;
-                    TagIdentifier  tagId = TagIdentifierFactory.createDocumentTagWrapper(ele);
-                    if (IJSFConstants.TAG_IDENTIFIER_COLUMN.isSameTagType(tagId))
-                    {
-                        result.add(ele);
-                    }
-                }
-                child = child.getNextSibling();
-            }
-        }
-        return result;
-    }
-
-    /**
-     * @param hostEle
-     * @param tableEle
-     * @param columns
-     */
-    protected void convertTBody(Element hostEle, Element tableEle, List columns)
-    {
-        // Rendering the table body
-        Element tbodyEle = createElement(IHTMLConstants.TAG_TBODY);
-        tableEle.appendChild(tbodyEle);
-        // Render a "tbody" element. Keep track of the result of the "rows" property
-        // on the UIData component. Keep track of the number of rows we have rendered
-        // so far.
-        // Iterate through the rows. Set the "rowIndex" property of the UIDatacomponent
-        // to be correct as we iterate through the rows.
-        // Stop rendering children and close out the "tbody" element if the "rowAvailable"
-        // property of the UIData returned false.
-
-        // XXX: we are only rendering one row.
-        // Output a "tr" element.
-        Element trEle = createElement(IHTMLConstants.TAG_TR);
-        tbodyEle.appendChild(trEle);
-
-        // Output the value of the "rowClasses" per the attribute description below.
-        String rowClasses = tableEle.getAttribute(IJSFConstants.ATTR_ROWCLASSES);
-        if (rowClasses != null)
-        {
-            // as we are only rendering one row, so we only get the first rowclass
-            StringTokenizer tokenizer = new StringTokenizer(rowClasses, ", "); //$NON-NLS-1$
-            if (tokenizer.hasMoreTokens())
-            {
-                trEle.setAttribute(IHTMLConstants.ATTR_CLASS, tokenizer.nextToken());
-            }
-        }
-
-        // --------------------------------- move this part into ColumnsTagConverter. ------------------------------
-        String columnClassesAttr = hostEle.getAttribute(IJSFConstants.ATTR_COLUMNCLASSES);
-        List columnClasses = new ArrayList();
-        if (columnClassesAttr != null)
-        {
-            StringTokenizer tokenizer = new StringTokenizer(columnClassesAttr, ", "); //$NON-NLS-1$
-            while (tokenizer.hasMoreTokens())
-            {
-                columnClasses.add(tokenizer.nextToken());
-            }
-        }
-        // --- create column's td in column tag converter, here
-        // For each UIColumn child, output a "td" element, attaching the value of the
-        // "columnClasses" attribute of the UIData component per the attribute description below.
-        // Recursively encode each child of each UIColumn child. Close out the "td" element.
-        // When done with the row, close out the "tr" element. When done with all the rows,
-        // close out the "tbody" element.
-        for (int i = 0, size = columns.size(); i < size; i++)
-        {
-            Element column = (Element) columns.get(i);
-            addChild(column, new ConvertPosition(trEle, i));
-            //            Element tdEle = createElement("td");
-            //            if (i < columnClasses.size())
-            //            {
-            //                tdEle.setAttribute("class", (String) columnClasses.get(i));
-            //            }
-            //
-            //            trEle.appendChild(tdEle);
-            //            // put the "h:column" under td.
-            //            addChild(column, new ConvertPosition(tdEle, 0));
-        }
-    }
-
-    /**
-     * @param hostEle
-     * @param tableEle
-     * @param columns 
-     * @param header true means header, false means footer
-     */
-    protected void convertTHeader(Element hostEle, Element tableEle, List columns, boolean header)
-    {
-        // If the UIData component has a "header" facet, or any of the child UIColumn
-        // components has a "header" facet, render a "thead" element.
-        Element facetEle = JSFDOMUtil.findFacet(hostEle, header ? FACET_NAME_HEADER : "footer"); //$NON-NLS-1$
-        boolean hasColHeader = false;
-        for (int i = 0, size = columns.size(); i < size; i++)
-        {
-            Element uicolumnEle = (Element) columns.get(i);
-            Element columnFacet = JSFDOMUtil.findFacet(uicolumnEle, header ? FACET_NAME_HEADER : "footer"); //$NON-NLS-1$
-            if (columnFacet != null)
-            {
-                hasColHeader = true;
-                break;
-            }
-        }
-
-        if (facetEle == null && !hasColHeader)
-        {
-            return;
-        }
-        Element theadEle = createElement(header ? IHTMLConstants.TAG_THEAD : IHTMLConstants.TAG_TFOOT);
-        tableEle.appendChild(theadEle);
-
-        // If the UIData component has a "header" facet, encode its contents inside of
-        // "tr" and "th" elements, respectively.
-        if (facetEle != null)
-        {
-            Element trEle = createElement(IHTMLConstants.TAG_TR);
-            theadEle.appendChild(trEle);
-            Element thEle = createElement(header ? IHTMLConstants.TAG_TH : IHTMLConstants.TAG_TD);
-            trEle.appendChild(thEle);
-            // Output the value of the "headerClass" attribute of the UIData component,
-            // if present, as the value of the "class" attribute on the "th".
-            ConverterUtil.copyAttribute(hostEle, header ? IJSFConstants.ATTR_HEADERCLASS
-                    : IJSFConstants.ATTR_FOOTERCLASS, thEle, IHTMLConstants.ATTR_CLASS);
-            // Output the number of child UIColumn components of theUIData component as
-            // the value of the "colspan" attribute on the "th".
-            if (columns.size() > 0)
-            {
-                thEle.setAttribute(IHTMLConstants.ATTR_COLSPAN, String.valueOf(columns.size()));
-            }
-
-            addChild(facetEle, new ConvertPosition(thEle, 0));
-        }
-        // Output "colgroup" as the value of the "scope" attribute on the "th" element.
-
-        // If any of the child UIColumn components has a "header" facet render a "tr"
-        // element.
-        if (hasColHeader)
-        {
-            Element trEle = createElement(IHTMLConstants.TAG_TR);
-            theadEle.appendChild(trEle);
-
-            for (int i = 0, size = columns.size(); i < size; i++)
-            {
-                Element uicolumnEle = (Element) columns.get(i);
-                Element columnFacet = JSFDOMUtil.findFacet(uicolumnEle, header ? FACET_NAME_HEADER : "footer"); //$NON-NLS-1$
-                Element thEle = createElement(header ? IHTMLConstants.TAG_TH : IHTMLConstants.TAG_TD);
-                trEle.appendChild(thEle);
-                if (columnFacet != null)
-                {
-                    // For eachUIColumn that actually has a "header" facet, render it inside of
-                    // a "th" element.
-                    addChild(columnFacet, new ConvertPosition(thEle, 0));
-                }
-                else
-                {
-                    // Columns that don't have a "header" facet cause an empty "th" element to be
-                    // rendered.
-                }
-
-                // Output the value of the "headerClass" attribute of the UIData component,
-                // if present, as the value of the "class" attribute on the "th".
-                ConverterUtil.copyAttribute(hostEle, header ? IJSFConstants.ATTR_HEADERCLASS
-                        : IJSFConstants.ATTR_FOOTERCLASS, thEle, IHTMLConstants.ATTR_CLASS);
-
-                // Output "col" as the value of the "colgroup" attribute on the "th" element.
-            }
-        }
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isMultiLevel()
-     */
-    public boolean isMultiLevel()
-    {
-        return true;
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isWidget()
-     */
-    public boolean isWidget()
-    {
-        return false;
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#needBorderDecorator()
-     */
-    public boolean needBorderDecorator()
-    {
-        return false;
-    }
-
-    /*
-     * (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#needTableDecorator()
-     */
-    public boolean needTableDecorator()
-    {
-        return true;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/GraphicImageTagConveter.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/GraphicImageTagConveter.java
deleted file mode 100644
index bc39f32..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/GraphicImageTagConveter.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.converter.jsfhtml;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.converter.AbstractTagConverter;
-import org.eclipse.jst.pagedesigner.converter.ConverterUtil;
-import org.eclipse.jst.pagedesigner.converter.JSFConverterUtil;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- * @deprecated Use DTTagConverter meta-data instead
- */
-public class GraphicImageTagConveter extends AbstractTagConverter
-{
-
-    /**
-     * @param host
-     */
-    public GraphicImageTagConveter(Element host)
-    {
-        super(host);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#doConvertRefresh()
-     */
-    protected Element doConvertRefresh()
-    {
-        Element hostEle = getHostElement();
-        // Renders an HTML "img" element. 
-        Element imgEle = createElement(IHTMLConstants.TAG_IMG);
-
-        JSFConverterUtil.copyAllAttributes(hostEle, imgEle, null);
-
-        // If the "styleClass" attribute is specified, render its value as 
-        // the value of the "class" attribute. 
-        ConverterUtil.copyAttribute(hostEle, IJSFConstants.ATTR_STYLECLASS, imgEle, IHTMLConstants.ATTR_CLASS);
-        imgEle.removeAttribute(IJSFConstants.ATTR_STYLECLASS);
-
-        // Render the clientId as the value of the "id" attribute. 
-        // Render the value of the component as the value of the "src" 
-        // attribute, after passing it to the getResourceUR() method 
-        // of the ViewHandler  for this application, and passing the 
-        // result through the encodeResourceURL() method of the 
-        // ExternalContext. 
-        String src = getSrc(hostEle);
-        if (src != null)
-        {
-            imgEle.setAttribute(IHTMLConstants.ATTR_SRC, src);
-        }
-        return imgEle;
-    }
-
-    /**
-     * @param hostEle
-     * @return
-     */
-    private String getSrc(Element hostEle)
-    {
-        // TODO: need revisit the spec for special URL converting
-        // for this element
-        String value = hostEle.getAttribute(IJSFConstants.ATTR_VALUE);
-        if (value == null)
-        {
-            // Context-relative URL to retrieve the resource associated 
-            // with this component. This is an alias for the "value" 
-            // property.
-            value = hostEle.getAttribute(IJSFConstants.ATTR_URL);
-        }
-        if (value != null)
-        {
-            value = mapValue(value);
-            value = mapURL(value);
-        }
-        return value;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isMultiLevel()
-     */
-    public boolean isMultiLevel()
-    {
-        return true;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isWidget()
-     */
-    public boolean isWidget()
-    {
-        return true;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/InputTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/InputTagConverter.java
deleted file mode 100644
index bb774a3..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/InputTagConverter.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.converter.jsfhtml;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.converter.AbstractTagConverter;
-import org.eclipse.jst.pagedesigner.converter.JSFConverterUtil;
-import org.w3c.dom.Element;
-
-/**
- * This is for inputHidden, inputSecret, inputText.
- * 
- * @author mengbo
- * @version 1.5
- * @deprecated Use DTTagConverter meta-data instead
- */
-public class InputTagConverter extends AbstractTagConverter
-{
-
-    private String _inputType;
-
-    /**
-     * @param host
-     * @param inputType 
-     */
-    public InputTagConverter(Element host, String inputType)
-    {
-        super(host);
-        _inputType = inputType;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#doConvertRefresh()
-     */
-    protected Element doConvertRefresh()
-    {
-        Element hostEle = getHostElement();
-        // Renders an HTML "input" element of "type" "text".
-        Element inputEle = createElement(IHTMLConstants.TAG_INPUT);
-        JSFConverterUtil.copyAllAttributes(hostEle, inputEle, null);
-        JSFConverterUtil.copyAttribute(hostEle, IJSFConstants.ATTR_STYLECLASS, inputEle, IHTMLConstants.ATTR_CLASS);
-        inputEle.removeAttribute(IJSFConstants.ATTR_STYLECLASS);
-
-        inputEle.setAttribute(IHTMLConstants.ATTR_TYPE, getInputType());
-
-        inputEle.removeAttribute(IJSFConstants.ATTR_VALUE);
-        inputEle.setAttribute(IJSFConstants.ATTR_VALUE, getValue(hostEle));
-
-        return inputEle;
-    }
-
-    /**
-     * @param hostEle
-     * @return
-     */
-    private String getValue(Element hostEle)
-    {
-        String valueAttr = hostEle.getAttribute(IJSFConstants.ATTR_VALUE);
-        if (valueAttr == null)
-        {
-            String name = hostEle.getLocalName();
-            return name.substring(0, 1).toUpperCase() + name.substring(1);
-        }
-        return mapValue(valueAttr);
-    }
-
-    /**
-     * @return
-     */
-    private String getInputType()
-    {
-        return _inputType;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isMultiLevel()
-     */
-    public boolean isMultiLevel()
-    {
-        return true;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isWidget()
-     */
-    public boolean isWidget()
-    {
-        return true;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/InputTextAreaTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/InputTextAreaTagConverter.java
deleted file mode 100644
index b43d613..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/InputTextAreaTagConverter.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.converter.jsfhtml;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.converter.AbstractTagConverter;
-import org.eclipse.jst.pagedesigner.converter.JSFConverterUtil;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- * @deprecated Use DTTagConverter meta-data instead
- */
-public class InputTextAreaTagConverter extends AbstractTagConverter
-{
-
-    /**
-     * @param host
-     */
-    public InputTextAreaTagConverter(Element host)
-    {
-        super(host);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#doConvertRefresh()
-     */
-    protected Element doConvertRefresh()
-    {
-        Element hostEle = getHostElement();
-        // Renders an HTML "textarea" element.
-        Element textareaEle = createElement(IHTMLConstants.TAG_TEXTAREA);
-
-        JSFConverterUtil.copyAllAttributes(hostEle, textareaEle, null);
-        JSFConverterUtil.copyAttribute(hostEle, IJSFConstants.ATTR_STYLECLASS, textareaEle, IHTMLConstants.ATTR_CLASS);
-        textareaEle.removeAttribute(IJSFConstants.ATTR_STYLECLASS);
-
-        String value = hostEle.getAttribute(IJSFConstants.ATTR_VALUE);
-        if (value != null && value.length() > 0)
-        {
-            value = mapValue(value);
-            textareaEle.appendChild(createText(value));
-        }
-
-        return textareaEle;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isMultiLevel()
-     */
-    public boolean isMultiLevel()
-    {
-        return true;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isWidget()
-     */
-    public boolean isWidget()
-    {
-        return true;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/JSFFormTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/JSFFormTagConverter.java
deleted file mode 100644
index 9db6c14..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/JSFFormTagConverter.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.converter.jsfhtml;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.converter.AbstractTagConverter;
-import org.eclipse.jst.pagedesigner.converter.JSFConverterUtil;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- * @deprecated Use DTTagConverter meta-data instead
- */
-public class JSFFormTagConverter extends AbstractTagConverter
-{
-
-    /**
-     * @param host
-     */
-    public JSFFormTagConverter(Element host)
-    {
-        super(host);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#doConvertRefresh()
-     */
-    protected Element doConvertRefresh()
-    {
-        // The value of the "method" attribute must be "post". The value of the 
-        // "action" attribute must be the result of passing the view identifier 
-        // of the current view to the getActionURL()  method of the ViewHandler for 
-        // this application, then passing that String to the encodeActionURL()  
-        // method on the ExternalContext. 
-        // XXX: as our tag converter only serve designer and preview, so we only
-        // deal with attributes relating to visual effect. Ignoring "method", "action",
-        // etc.
-        Element hostEle = getHostElement();
-
-        Element formEle = createElement(IHTMLConstants.TAG_FORM);
-
-        // If the "styleClass" attribute is specified, render its value as the 
-        // value of the "class" attribute. 
-        JSFConverterUtil.copyAttribute(hostEle, IJSFConstants.ATTR_STYLECLASS, formEle, IHTMLConstants.ATTR_CLASS);
-        formEle.removeAttribute(IJSFConstants.ATTR_STYLECLASS);
-
-        // pass through other attributes
-        // XXX: handle ignored attributes here.
-        JSFConverterUtil.copyAllAttributes(hostEle, formEle, null);
-
-        // Render all the necessary hidden fields for all commandLink instances 
-        // in the page just before the close of the "form" element.
-        // XXX: ignored for these hidden fields.
-
-        // children of old <h:form> should still be children.
-        this.copyChildren(hostEle, formEle);
-
-        return formEle;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isMultiLevel()
-     */
-    public boolean isMultiLevel()
-    {
-        return false;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isWidget()
-     */
-    public boolean isWidget()
-    {
-        return false;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#needBorderDecorator()
-     */
-    public boolean needBorderDecorator()
-    {
-        return true;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/JSFHTMLConverterFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/JSFHTMLConverterFactory.java
deleted file mode 100644
index 29a48e0..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/JSFHTMLConverterFactory.java
+++ /dev/null
@@ -1,219 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.converter.jsfhtml;
-
-import java.util.HashSet;
-import java.util.Set;
-
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IStructuredDocumentContextResolverFactory;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IWorkspaceContextResolver;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContextFactory2;
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.converter.HiddenTagConverter;
-import org.eclipse.jst.pagedesigner.converter.IConverterFactory;
-import org.eclipse.jst.pagedesigner.converter.ITagConverter;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.internal.DTTagConverter;
-import org.eclipse.jst.pagedesigner.editors.palette.TagImageManager;
-import org.eclipse.swt.graphics.Image;
-import org.w3c.dom.Element;
-
-
-/**
- * @author mengbo
- * @version 1.5
- * @deprecated Use DTTagConverter meta-data instead
- */
-public class JSFHTMLConverterFactory implements IConverterFactory
-{
-    private final MyLabelProvider  _labelProvider;
-    
-    // TODO C.B: this is a transitional step so that we can incrementally add
-    // new meta-data driven tag converter one-by-one without breaking other existing
-    // if a tag name is in this set, the new DTTagConverter will be created for it,
-    // else, revert to original one
-    private final static Set                   _dtConversionSupported;
-    
-    static
-    {
-        _dtConversionSupported = new HashSet();
-        /*
-        _dtConversionSupported.add(IJSFConstants.TAG_FORM);
-        _dtConversionSupported.add(IJSFConstants.TAG_INPUTTEXT);
-        _dtConversionSupported.add(IJSFConstants.TAG_INPUTSECRET);
-        _dtConversionSupported.add(IJSFConstants.TAG_INPUTTEXTAREA);
-        _dtConversionSupported.add(IJSFConstants.TAG_OUTPUTTEXT);
-        _dtConversionSupported.add(IJSFConstants.TAG_OUTPUTLABEL);
-        _dtConversionSupported.add(IJSFConstants.TAG_GRAPHICIMAGE);
-        _dtConversionSupported.add(IJSFConstants.TAG_PANELGRID);
-        */
-    }
-    
-    /**
-     * 
-     */
-    public JSFHTMLConverterFactory()
-    {
-        super();
-        _labelProvider = new MyLabelProvider();
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.IConverterFactory#createConverter(org.w3c.dom.Element)
-     */
-    public ITagConverter createConverter(Element element, int mode)
-    {
-        ITagConverter converter;
-        String tagName = element.getLocalName();
-        
-        if (_dtConversionSupported.contains(tagName))
-        {
-            converter = createDTTagConverter(element);
-        }
-        else if (IJSFConstants.TAG_COLUMN.equalsIgnoreCase(tagName))
-        {
-            converter = new ColumnTagConverter(element);
-        }
-        else if (IJSFConstants.TAG_COMMANDBUTTON.equalsIgnoreCase(tagName))
-        {
-            converter = new CommandButtonTagConverter(element);
-        }
-        else if (IJSFConstants.TAG_COMMANDLINK.equalsIgnoreCase(tagName))
-        {
-            converter = new CommandLinkTagConverter(element);
-        }
-        else if (IJSFConstants.TAG_DATATABLE.equalsIgnoreCase(tagName))
-        {
-            converter = new DataTableTagConverter(element);
-        }
-        else if (IJSFConstants.TAG_FORM.equalsIgnoreCase(tagName))
-        {
-            converter = new JSFFormTagConverter(element);
-        }
-        else if (IJSFConstants.TAG_GRAPHICIMAGE.equalsIgnoreCase(tagName))
-        {
-            converter = new GraphicImageTagConveter(element);
-        }
-        else if (IJSFConstants.TAG_INPUTHIDDEN.equalsIgnoreCase(tagName))
-        {
-            return new HiddenTagConverter(element, _labelProvider);
-        }
-        else if (IJSFConstants.TAG_INPUTSECRET.equalsIgnoreCase(tagName))
-        {
-            converter = new InputTagConverter(element, "password"); //$NON-NLS-1$
-        }
-        else if (IJSFConstants.TAG_INPUTTEXT.equalsIgnoreCase(tagName))
-        {
-            converter = new InputTagConverter(element, "text"); //$NON-NLS-1$
-        }
-        else if (IJSFConstants.TAG_INPUTTEXTAREA.equalsIgnoreCase(tagName))
-        {
-            converter = new InputTextAreaTagConverter(element);
-        }
-        else if (IJSFConstants.TAG_MESSAGE.equalsIgnoreCase(tagName)
-        || IJSFConstants.TAG_MESSAGES.equalsIgnoreCase(tagName))
-        {
-            converter = new HiddenTagConverter(element, _labelProvider);
-        }
-        else if (IJSFConstants.TAG_OUTPUTTEXT.equalsIgnoreCase(tagName)
-        || IJSFConstants.TAG_OUTPUTFORMAT.equalsIgnoreCase(tagName))
-        {
-            converter = new OutputTextTagConverter(element);
-        }
-        else if (IJSFConstants.TAG_OUTPUTLABEL.equalsIgnoreCase(tagName))
-        {
-            converter = new OutputLabelTagConverter(element);
-        }
-        else if (IJSFConstants.TAG_OUTPUTLINK.equalsIgnoreCase(tagName))
-        {
-            converter = new OutputLinkTagConverter(element);
-        }
-        else if (IJSFConstants.TAG_PANELGRID.equalsIgnoreCase(tagName))
-        {
-            converter = new PanelGridTagConverter(element);
-        }
-        else if (IJSFConstants.TAG_PANELGROUP.equalsIgnoreCase(tagName))
-        {
-            converter = new PanelGroupTagConverter(element);
-        }
-        else if (IJSFConstants.TAG_SELECTBOOLEANCHECKBOX.equalsIgnoreCase(tagName))
-        {
-            converter = new SelectBooleanCheckboxTagConverter(element);
-        }
-        else if (IJSFConstants.TAG_SELECTMANYCHECKBOX.equalsIgnoreCase(tagName))
-        {
-            converter = new TableBasedSelectTagConverter(element, "checkbox"); //$NON-NLS-1$
-        }
-        else if (IJSFConstants.TAG_SELECTMANYLISTBOX.equalsIgnoreCase(tagName))
-        {
-            converter = new SelectManyListboxTagConverter(element);
-        }
-        else if (IJSFConstants.TAG_SELECTMANYMENU.equalsIgnoreCase(tagName))
-        {
-            converter = new SelectManyMenuTagConverter(element);
-        }
-        else if (IJSFConstants.TAG_SELECTONELISTBOX.equalsIgnoreCase(tagName))
-        {
-            converter = new SelectOneListboxTagConverter(element);
-        }
-        else if (IJSFConstants.TAG_SELECTONEMENU.equalsIgnoreCase(tagName))
-        {
-            converter = new SelectOneMenuTagConverter(element);
-        }
-        else if (IJSFConstants.TAG_SELECTONERADIO.equalsIgnoreCase(tagName))
-        {
-            converter = new TableBasedSelectTagConverter(element, "radio"); //$NON-NLS-1$
-        }
-        else
-        {
-            return null;
-        }
-        converter.setMode(mode);
-        return converter;
-    }
-
-    private static class MyLabelProvider extends LabelProvider
-    {
-        public Image getImage(Object element) 
-        {
-            if (element instanceof ITagConverter)
-            {
-                final Element hostElement = ((ITagConverter)element).getHostElement();
-                IStructuredDocumentContext context = IStructuredDocumentContextFactory2.INSTANCE.getContext(hostElement);
-                if (context != null){   
-                	IWorkspaceContextResolver wsResolver  = IStructuredDocumentContextResolverFactory.INSTANCE.getWorkspaceContextResolver(context);
-                	if (wsResolver != null){
-                		return TagImageManager.getInstance().getSmallIconImage(wsResolver.getProject(),ITLDConstants.URI_JSF_HTML, hostElement.getLocalName());
-                	}
-                }
-            }
-            
-            return null;
-        }
-    }
-
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.IConverterFactory#getSupportedURI()
-     */
-    public String getSupportedURI()
-    {
-        return ITLDConstants.URI_JSF_HTML;
-    }
-    
-    private ITagConverter createDTTagConverter(Element element)
-    {
-        return new DTTagConverter(element);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/MessageTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/MessageTagConverter.java
deleted file mode 100644
index 47a995d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/MessageTagConverter.java
+++ /dev/null
@@ -1,149 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.converter.jsfhtml;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.converter.AbstractTagConverter;
-import org.eclipse.jst.pagedesigner.converter.JSFConverterUtil;
-import org.eclipse.jst.pagedesigner.jsf.ui.util.JSFUIPluginResourcesUtil;
-import org.w3c.dom.Element;
-import org.w3c.dom.Text;
-
-
-/**
- * @author mengbo
- * @version 1.5
- * @deprecated Use DTTagConverter meta-data instead
- */
-public class MessageTagConverter extends AbstractTagConverter
-{
-    private static final String MESSAGE_CONTENT = JSFUIPluginResourcesUtil.getInstance().getString(
-                                                        "MessageTagConverter.defaultValue"); //$NON-NLS-1$
-    private static final String MESSAGE_TOOLTIP = JSFUIPluginResourcesUtil.getInstance().getString(
-                                                        "MessageTagConverter.defaultTooltip"); //$NON-NLS-1$
-
-    /**
-     * @param host
-     */
-    public MessageTagConverter(Element host)
-    {
-        super(host);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#doConvertRefresh()
-     */
-    protected Element doConvertRefresh()
-    {
-        Element hostEle = getHostElement();
-
-        // If the "styleClass" or "style" attributes are present, 
-        // render a "span" element. 
-        // XXX: to make things simpler, we always create a span
-        Element spanEle = createElement(IHTMLConstants.TAG_SPAN);
-
-        // If the "style" attribute is present, pass it thru.
-        // XXX: we are passing all the attributes through, since other attribute
-        // don't conflict with html attributes.
-        JSFConverterUtil.copyAllAttributes(hostEle, spanEle, null);
-
-        // If the "styleClass" attribute is present, 
-        // output the value of the "styleClass" attribute as the value of the "class" attribute on the "span" element
-        JSFConverterUtil.copyAttribute(hostEle, IJSFConstants.ATTR_STYLECLASS, spanEle, IHTMLConstants.ATTR_CLASS);
-        spanEle.removeAttribute(IJSFConstants.ATTR_STYLECLASS);
-
-        String fatalStyle = hostEle.getAttribute(IJSFConstants.ATTR_FATALSTYLE);
-        String errorStyle = hostEle.getAttribute(IJSFConstants.ATTR_ERRORSTYLE);
-        String warnStyle = hostEle.getAttribute(IJSFConstants.ATTR_WARNSTYLE);
-        String infoStyle = hostEle.getAttribute(IJSFConstants.ATTR_INFOSTYLE);
-        String fatalClass = hostEle.getAttribute(IJSFConstants.ATTR_FATALCLASS);
-        String errorClass = hostEle.getAttribute(IJSFConstants.ATTR_ERRORCLASS);
-        String warnClass = hostEle.getAttribute(IJSFConstants.ATTR_WARNCLASS);
-        String infoClass = hostEle.getAttribute(IJSFConstants.ATTR_INFOCLASS);
-
-        if ((!"".equals(fatalStyle)) && (fatalStyle != null)) //$NON-NLS-1$
-        {
-            spanEle.setAttribute(IHTMLConstants.ATTR_STYLE, fatalStyle);
-        }
-        else if ((!"".equals(errorStyle)) && (errorStyle != null)) //$NON-NLS-1$
-        {
-            spanEle.setAttribute(IHTMLConstants.ATTR_STYLE, errorStyle);
-        }
-        else if ((!"".equals(warnStyle)) && (warnStyle != null)) //$NON-NLS-1$
-        {
-            spanEle.setAttribute(IHTMLConstants.ATTR_STYLE, warnStyle);
-        }
-        else if ((!"".equals(infoStyle)) && (infoStyle != null)) //$NON-NLS-1$
-        {
-            spanEle.setAttribute(IHTMLConstants.ATTR_STYLE, infoStyle);
-        }
-
-        if ((!"".equals(fatalClass)) && (fatalClass != null)) //$NON-NLS-1$
-        {
-            spanEle.setAttribute(IJSFConstants.ATTR_STYLECLASS, fatalClass);
-        }
-        else if ((!"".equals(errorClass)) && (errorClass != null)) //$NON-NLS-1$
-        {
-            spanEle.setAttribute(IJSFConstants.ATTR_STYLECLASS, errorClass);
-        }
-        else if ((!"".equals(warnClass)) && (warnClass != null)) //$NON-NLS-1$
-        {
-            spanEle.setAttribute(IJSFConstants.ATTR_STYLECLASS, warnClass);
-        }
-        else if ((!"".equals(infoClass)) && (infoClass != null)) //$NON-NLS-1$
-        {
-            spanEle.setAttribute(IJSFConstants.ATTR_STYLECLASS, infoClass);
-        }
-        spanEle.removeAttribute(IJSFConstants.ATTR_STYLECLASS);
-
-        //If the "tooltip" attribute is present with the value of "true", and so does 
-        //the "showSummary",then output the "summary" as the value of the "title" attribute on the "span". 
-        String hasToolTip = hostEle.getAttribute(IJSFConstants.ATTR_TOOLTIP);
-        String showSummary = hostEle.getAttribute(IJSFConstants.ATTR_SHOWSUMMARY);
-        if ("true".equalsIgnoreCase(hasToolTip)) //$NON-NLS-1$
-        {
-            if ("true".equalsIgnoreCase(showSummary)) //$NON-NLS-1$
-            {
-                spanEle.setAttribute("title", MESSAGE_TOOLTIP); //$NON-NLS-1$
-            }
-        }
-        Text text = createText(MESSAGE_CONTENT);
-        spanEle.appendChild(text);
-
-        return spanEle;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isMultiLevel()
-     */
-    public boolean isMultiLevel()
-    {
-        return true;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo#isWidget()
-     */
-    public boolean isWidget()
-    {
-        return true;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo#needBorderDecorator()
-     */
-    public boolean needBorderDecorator()
-    {
-        return true;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/MessagesTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/MessagesTagConverter.java
deleted file mode 100644
index c604d11..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/MessagesTagConverter.java
+++ /dev/null
@@ -1,179 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.converter.jsfhtml;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.converter.AbstractTagConverter;
-import org.eclipse.jst.pagedesigner.converter.JSFConverterUtil;
-import org.eclipse.jst.pagedesigner.jsf.ui.util.JSFUIPluginResourcesUtil;
-import org.w3c.dom.Element;
-import org.w3c.dom.Text;
-
-
-/**
- * @author mengbo
- * @version 1.5
- * @deprecated Use DTTagConverter meta-data instead
- */
-public class MessagesTagConverter extends AbstractTagConverter
-{
-    private static final String MESSAGE_CONTENT = JSFUIPluginResourcesUtil.getInstance().getString(
-                                                        "MessageTagConverter.defaultValue"); //$NON-NLS-1$
-    private static final String MESSAGE_TOOLTIP = JSFUIPluginResourcesUtil.getInstance().getString(
-                                                        "MessageTagConverter.defaultTooltip"); //$NON-NLS-1$
-
-    /**
-     * @param host
-     */
-    public MessagesTagConverter(Element host)
-    {
-        super(host);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#doConvertRefresh()
-     */
-    protected Element doConvertRefresh()
-    {
-        Element hostEle = getHostElement();
-        String layout = hostEle.getAttribute(IJSFConstants.ATTR_LAYOUT);
-        if (IHTMLConstants.TAG_TABLE.equalsIgnoreCase(layout))
-        {
-            Element table = createElement(IHTMLConstants.TAG_TABLE);
-            table.setAttribute(IHTMLConstants.ATTR_BORDER, "1"); //$NON-NLS-1$
-            for (int i = 0; i < 2; i++)
-            {
-                Element tr = createElement(IHTMLConstants.TAG_TR);
-                Element td = createElement(IHTMLConstants.TAG_TD);
-                Element span = createSpan();
-                td.appendChild(span);
-                tr.appendChild(td);
-                table.appendChild(tr);
-            }
-            return table;
-        }
-        Element ul = createElement(IHTMLConstants.TAG_UL);
-        for (int i = 0; i < 2; i++)
-        {
-            Element li = createElement(IHTMLConstants.TAG_LI);
-            Element span = createSpan();
-            li.appendChild(span);
-            ul.appendChild(li);
-        }
-        return ul;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isMultiLevel()
-     */
-    public boolean isMultiLevel()
-    {
-        return true;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo#isWidget()
-     */
-    public boolean isWidget()
-    {
-        return true;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo#needBorderDecorator()
-     */
-    public boolean needBorderDecorator()
-    {
-        return true;
-    }
-
-    private Element createSpan()
-    {
-        Element hostEle = getHostElement();
-
-        // If the "styleClass" or "style" attributes are present, 
-        // render a "span" element. 
-        // XXX: to make things simpler, we always create a span
-        Element spanEle = createElement(IHTMLConstants.TAG_SPAN);
-
-        // If the "style" attribute is present, pass it thru.
-        // XXX: we are passing all the attributes through, since other attribute
-        // don't conflict with html attributes.
-        JSFConverterUtil.copyAllAttributes(hostEle, spanEle, null);
-
-        // If the "styleClass" attribute is present, 
-        // output the value of the "styleClass" attribute as the value of the "class" attribute on the "span" element
-        JSFConverterUtil.copyAttribute(hostEle, IJSFConstants.ATTR_STYLECLASS, spanEle, IHTMLConstants.ATTR_CLASS);
-        spanEle.removeAttribute(IJSFConstants.ATTR_STYLECLASS);
-
-        String fatalStyle = hostEle.getAttribute(IJSFConstants.ATTR_FATALSTYLE);
-        String errorStyle = hostEle.getAttribute(IJSFConstants.ATTR_ERRORSTYLE);
-        String warnStyle = hostEle.getAttribute(IJSFConstants.ATTR_WARNSTYLE);
-        String infoStyle = hostEle.getAttribute(IJSFConstants.ATTR_INFOSTYLE);
-        String fatalClass = hostEle.getAttribute(IJSFConstants.ATTR_FATALCLASS);
-        String errorClass = hostEle.getAttribute(IJSFConstants.ATTR_ERRORCLASS);
-        String warnClass = hostEle.getAttribute(IJSFConstants.ATTR_WARNCLASS);
-        String infoClass = hostEle.getAttribute(IJSFConstants.ATTR_INFOCLASS);
-
-        if ((!"".equals(fatalStyle)) && (fatalStyle != null)) //$NON-NLS-1$
-        {
-            spanEle.setAttribute(IHTMLConstants.ATTR_STYLE, fatalStyle);
-        }
-        else if ((!"".equals(errorStyle)) && (errorStyle != null)) //$NON-NLS-1$
-        {
-            spanEle.setAttribute(IHTMLConstants.ATTR_STYLE, errorStyle);
-        }
-        else if ((!"".equals(warnStyle)) && (warnStyle != null)) //$NON-NLS-1$
-        {
-            spanEle.setAttribute(IHTMLConstants.ATTR_STYLE, warnStyle);
-        }
-        else if ((!"".equals(infoStyle)) && (infoStyle != null)) //$NON-NLS-1$
-        {
-            spanEle.setAttribute(IHTMLConstants.ATTR_STYLE, infoStyle);
-        }
-
-        if ((!"".equals(fatalClass)) && (fatalClass != null)) //$NON-NLS-1$
-        {
-            spanEle.setAttribute(IJSFConstants.ATTR_STYLECLASS, fatalClass);
-        }
-        else if ((!"".equals(errorClass)) && (errorClass != null)) //$NON-NLS-1$
-        {
-            spanEle.setAttribute(IJSFConstants.ATTR_STYLECLASS, errorClass);
-        }
-        else if ((!"".equals(warnClass)) && (warnClass != null)) //$NON-NLS-1$
-        {
-            spanEle.setAttribute(IJSFConstants.ATTR_STYLECLASS, warnClass);
-        }
-        else if ((!"".equals(infoClass)) && (infoClass != null)) //$NON-NLS-1$
-        {
-            spanEle.setAttribute(IJSFConstants.ATTR_STYLECLASS, infoClass);
-        }
-
-        //If the "tooltip" attribute is present with the value of "true", and so does 
-        //the "showSummary",then output the "summary" as the value of the "title" attribute on the "span". 
-        String hasToolTip = hostEle.getAttribute(IJSFConstants.ATTR_TOOLTIP);
-        String showSummary = hostEle.getAttribute(IJSFConstants.ATTR_SHOWSUMMARY);
-        if ("true".equalsIgnoreCase(hasToolTip)) //$NON-NLS-1$
-        {
-            if ("true".equalsIgnoreCase(showSummary)) //$NON-NLS-1$
-            {
-                spanEle.setAttribute(IHTMLConstants.ATTR_TITLE, MESSAGE_TOOLTIP);
-            }
-        }
-        Text text = createText(MESSAGE_CONTENT);
-        spanEle.appendChild(text);
-
-        return spanEle;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/OutputLabelTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/OutputLabelTagConverter.java
deleted file mode 100644
index c7eaad3..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/OutputLabelTagConverter.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.converter.jsfhtml;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.converter.AbstractTagConverter;
-import org.eclipse.jst.pagedesigner.converter.ConvertPosition;
-import org.eclipse.jst.pagedesigner.converter.JSFConverterUtil;
-import org.eclipse.jst.pagedesigner.jsf.core.dom.JSFDOMUtil;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-
-/**
- * @author mengbo
- * @version 1.5
- * @deprecated Use DTTagConverter meta-data instead
- */
-public class OutputLabelTagConverter extends AbstractTagConverter
-{
-    /**
-     * @param host
-     */
-    public OutputLabelTagConverter(Element host)
-    {
-        super(host);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#doConvertRefresh()
-     */
-    protected Element doConvertRefresh()
-    {
-        Element hostEle = getHostElement();
-
-        Element labelEle = createElement(IHTMLConstants.TAG_LABEL);
-
-        JSFConverterUtil.copyAllAttributes(hostEle, labelEle, null);
-
-        // If the "styleClass" attribute is present, 
-        // render its value as the value of the "class" attribute.
-        JSFConverterUtil.copyAttribute(hostEle, IJSFConstants.ATTR_STYLECLASS, labelEle, IHTMLConstants.ATTR_CLASS);
-        labelEle.removeAttribute(IJSFConstants.ATTR_STYLECLASS);
-
-        //        String value = getValue(hostEle);
-        //        Text	textNode = createText(value);
-        //        labelEle.appendChild(textNode);
-
-        int index = 0;
-        Node child = hostEle.getFirstChild();
-        if (hostEle.hasChildNodes())
-        {
-            for (; child != null; child = child.getNextSibling())
-            {
-                if (!shouldIgnore(child))
-                {
-                    if (child instanceof Element && JSFDOMUtil.isUIParameter((Element) child))
-                    {
-                        // skip
-                    }
-                    else
-                    {
-                        addChild(child, new ConvertPosition(labelEle, index++));
-                    }
-                }
-            }
-        }
-        else
-        {
-            labelEle.appendChild(createText(getDefaultValue()));
-        }
-
-        return labelEle;
-    }
-
-    /**
-     * @param hostEle
-     * @return
-     */
-    private String getDefaultValue()
-    {
-        String name = IJSFConstants.TAG_OUTPUTLABEL;
-        
-        return name.substring(0, 1).toUpperCase() + name.substring(1);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isMultiLevel()
-     */
-    public boolean isMultiLevel()
-    {
-        return true;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isWidget()
-     */
-    public boolean isWidget()
-    {
-        return true;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo#needBorderDecorator()
-     */
-    public boolean needBorderDecorator()
-    {
-        return true;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/OutputLinkTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/OutputLinkTagConverter.java
deleted file mode 100644
index 3c45703..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/OutputLinkTagConverter.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.converter.jsfhtml;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.converter.AbstractTagConverter;
-import org.eclipse.jst.pagedesigner.converter.ConvertPosition;
-import org.eclipse.jst.pagedesigner.converter.ConverterUtil;
-import org.eclipse.jst.pagedesigner.converter.JSFConverterUtil;
-import org.eclipse.jst.pagedesigner.jsf.core.dom.JSFDOMUtil;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-
-/**
- * @author mengbo
- * @version 1.5
- * @deprecated Use DTTagConverter meta-data instead
- */
-public class OutputLinkTagConverter extends AbstractTagConverter
-{
-
-    /**
-     * @param host
-     */
-    public OutputLinkTagConverter(Element host)
-    {
-        super(host);
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#doConvertRefresh()
-     */
-    protected Element doConvertRefresh()
-    {
-        Element hostEle = getHostElement();
-
-        Element aEle = createElement(IHTMLConstants.TAG_A);
-
-        // If the "style" attribute is present, pass it thru.
-        // XXX: we are passing all the attributes through, since other attribute
-        // don't conflict with html attributes.
-        JSFConverterUtil.copyAllAttributes(hostEle, aEle, null);
-
-        // If the "styleClass" attribute is present,
-        // render its value as the value of the "class" attribute.
-        JSFConverterUtil.copyAttribute(hostEle, IJSFConstants.ATTR_STYLECLASS, aEle, IHTMLConstants.ATTR_CLASS);
-        aEle.removeAttribute(IJSFConstants.ATTR_STYLECLASS);
-
-        // value should be mapped to href, but it won't affect visual
-        // so use "#"
-        aEle.setAttribute(IHTMLConstants.ATTR_HREF, "#"); //$NON-NLS-1$
-
-        JSFConverterUtil.copyAttribute(hostEle, IJSFConstants.ATTR_VALUE, aEle, IHTMLConstants.ATTR_HREF);
-        aEle.removeAttribute(IJSFConstants.ATTR_VALUE);
-
-        // Extend the container border a little to make it selectable
-        if (!isPreviewMode())
-        {
-            String style = aEle.getAttribute(IHTMLConstants.ATTR_STYLE);
-            style = "padding:0.3em;" + style; //$NON-NLS-1$
-            aEle.setAttribute(IHTMLConstants.ATTR_STYLE, style);
-        }
-
-        int index = 0;
-        Node child = hostEle.getFirstChild();
-        if (hostEle.hasChildNodes())
-        {
-            for (; child != null; child = child.getNextSibling())
-            {
-                if (!shouldIgnore(child))
-                {
-                    if (child instanceof Element && JSFDOMUtil.isUIParameter((Element) child))
-                    {
-                        // skip
-                    }
-                    else
-                    {
-                        addChild(child, new ConvertPosition(aEle, index++));
-                    }
-                }
-            }
-        }
-        if (ConverterUtil.isEmptyContainer(hostEle) && !hostEle.hasAttribute(IJSFConstants.ATTR_VALUE))
-        {
-            aEle.appendChild(createText(getDefaultValue()));
-        }
-        return aEle;
-    }
-
-    private String getDefaultValue()
-    {
-        String name = IJSFConstants.TAG_OUTPUTLINK;
-
-        return name.substring(0, 1).toUpperCase() + name.substring(1);
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isMultiLevel()
-     */
-    public boolean isMultiLevel()
-    {
-        return true;
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isWidget()
-     */
-    public boolean isWidget()
-    {
-        return false;
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo#needBorderDecorator()
-     */
-    public boolean needBorderDecorator()
-    {
-        return true;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/OutputTextTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/OutputTextTagConverter.java
deleted file mode 100644
index f43ae97..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/OutputTextTagConverter.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.converter.jsfhtml;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.converter.AbstractTagConverter;
-import org.eclipse.jst.pagedesigner.converter.JSFConverterUtil;
-import org.w3c.dom.Element;
-import org.w3c.dom.Text;
-
-/**
- * @author mengbo
- * @version 1.5
- * @deprecated Use DTTagConverter meta-data instead
- */
-public class OutputTextTagConverter extends AbstractTagConverter
-{
-
-    /**
-     * @param host
-     */
-    public OutputTextTagConverter(Element host)
-    {
-        super(host);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#doConvertRefresh()
-     */
-    protected Element doConvertRefresh()
-    {
-        Element hostEle = getHostElement();
-
-        // If the "styleClass" or "style" attributes are present, 
-        // render a "span" element. 
-        // XXX: to make things simpler, we always create a span
-        Element spanEle = createElement(IHTMLConstants.TAG_SPAN);
-
-        // If the "style" attribute is present, pass it thru.
-        // XXX: we are passing all the attributes through, since other attribute
-        // don't conflict with html attributes.
-        JSFConverterUtil.copyAllAttributes(hostEle, spanEle, null);
-        
-        // If the "styleClass" attribute is present, 
-        // render its value as the value of the "class" attribute.
-        JSFConverterUtil.copyAttribute(hostEle, IJSFConstants.ATTR_STYLECLASS, spanEle, IHTMLConstants.ATTR_CLASS);
-        spanEle.removeAttribute(IJSFConstants.ATTR_STYLECLASS);
-        
-        spanEle.removeAttribute(IJSFConstants.ATTR_VALUE);
-
-        // If the "escape" attribute is not present, or it is present and 
-        // its value is "true" all angle brackets should be converted to the 
-        // ampersand xx semicolon syntax when rendering the value of the "value" 
-        // attribute as the value of the component. If the "escape" attribute is 
-        // present and is "false" the value of the component should be rendered 
-        // as text without escaping. 
-        String value = getValue(hostEle);
-        Text	textNode = createText(value);
-        spanEle.appendChild(textNode);
-
-        return spanEle;
-    }
-
-    /**
-     * @param hostEle
-     * @return
-     */
-    private String getValue(Element hostEle)
-    {
-        String valueAttr = hostEle.getAttribute(IJSFConstants.ATTR_VALUE);
-        if (valueAttr == null)
-        {
-            String name = hostEle.getLocalName();
-            return name.substring(0, 1).toUpperCase() + name.substring(1);
-        }
-        return mapValue(valueAttr);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isMultiLevel()
-     */
-    public boolean isMultiLevel()
-    {
-        return true;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isWidget()
-     */
-    public boolean isWidget()
-    {
-        return true;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#needBorderDecorator()
-     */
-    public boolean needBorderDecorator()
-    {
-        return true;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/PanelGridTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/PanelGridTagConverter.java
deleted file mode 100644
index f9ff8e9..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/PanelGridTagConverter.java
+++ /dev/null
@@ -1,211 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.converter.jsfhtml;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.StringTokenizer;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.jsf.core.dom.JSFDOMUtil;
-import org.w3c.dom.Element;
-
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.converter.AbstractTagConverter;
-import org.eclipse.jst.pagedesigner.converter.ConvertPosition;
-import org.eclipse.jst.pagedesigner.converter.JSFConverterUtil;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-
-/**
- * @author mengbo
- * @version 1.5
- * @deprecated Use DTTagConverter meta-data instead
- */
-public class PanelGridTagConverter extends AbstractTagConverter
-{
-    /**
-     * @param host
-     */
-    public PanelGridTagConverter(Element host)
-    {
-        super(host);
-    }
-
-    /*
-     * (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.visualtag.AbstractTagConverter#doConvertRefresh()
-     */
-    protected Element doConvertRefresh()
-    {
-        Element panelGridEle = this.getHostElement();
-
-        //  Renders an HTML "table" element, conforming to the rules in the HTML 401 specification.
-        Element tableEle = createElement(IHTMLConstants.TAG_TABLE);
-
-        // Render the pass-through attributes in the table below.
-        // TODO: need handle ignored attributes here. But as they don't conflict
-        // with standard table attributes, so its ok that we leave it later.
-        JSFConverterUtil.copyAllAttributes(panelGridEle, tableEle, null);
-        
-        // If the "styleClass" attribute is specified, render its value as the value of the "class" attribute
-        JSFConverterUtil.copyAttribute(panelGridEle, IJSFConstants.ATTR_STYLECLASS, tableEle, IHTMLConstants.ATTR_CLASS);
-        tableEle.removeAttribute(IJSFConstants.ATTR_STYLECLASS);
-
-        int columns = DOMUtil.getIntAttributeIgnoreCase(panelGridEle, IJSFConstants.ATTR_COLUMNS, 1);
-        if (columns < 1)
-        {
-            columns = 1;
-        }
-
-        // Render the "header" facet, if present, inside of "thead", "tr", and "th" elements, nested in that order.
-        Element facet = JSFDOMUtil.findFacet(panelGridEle, "header"); //$NON-NLS-1$
-        if (facet != null)
-        {
-            // we need render a thead here
-            Element theadEle = createElement(IHTMLConstants.TAG_THEAD);
-            tableEle.appendChild(theadEle);
-            Element trEle = createElement(IHTMLConstants.TAG_TR);
-            theadEle.appendChild(trEle);
-            Element thEle = createElement(IHTMLConstants.TAG_TH);
-            trEle.appendChild(thEle);
-            // If the "headerClass" attribute is specifed, render its value as the value of the "class" attribute on
-            // the "th" element.
-            String headerClass = panelGridEle.getAttribute(IJSFConstants.ATTR_HEADERCLASS);
-            if (headerClass != null && headerClass.length() > 0)
-            {
-                thEle.setAttribute(IHTMLConstants.ATTR_CLASS, headerClass);
-            }
-            // Render the value of the "columns" attribute as the value of the "colspan" attribute on the "th" element.
-            thEle.setAttribute(IHTMLConstants.ATTR_COLSPAN, String.valueOf(columns));
-            addChild(facet, new ConvertPosition(thEle, 0));
-        }
-
-        // Render the "footer" facet if present, using similar logic to the rendering of
-        // the "header", but replacing "thead" with "tfoot", "th" with "td", and "headerClass"
-        // with "footerClass".
-        facet = JSFDOMUtil.findFacet(panelGridEle, "footer"); //$NON-NLS-1$
-        if (facet != null)
-        {
-            // we need render a thead here
-            Element theadEle = createElement(IHTMLConstants.TAG_TFOOT);
-            tableEle.appendChild(theadEle);
-            Element trEle = createElement(IHTMLConstants.TAG_TR);
-            theadEle.appendChild(trEle);
-            Element tdEle = createElement(IHTMLConstants.TAG_TD);
-            trEle.appendChild(tdEle);
-            // If the "headerClass" attribute is specifed, render its value as the value of the "class" attribute on
-            // the "th" element.
-            String footerClass = panelGridEle.getAttribute(IJSFConstants.ATTR_FOOTERCLASS);
-            if (footerClass != null && footerClass.length() > 0)
-            {
-                tdEle.setAttribute(IHTMLConstants.ATTR_CLASS, footerClass);
-            }
-            // Render the value of the "columns" attribute as the value of the "colspan" attribute on the "th" element.
-            tdEle.setAttribute(IHTMLConstants.ATTR_COLSPAN, String.valueOf(columns));
-            addChild(facet, new ConvertPosition(tdEle, 0));
-        }
-
-        List rowclasses = new ArrayList();
-        String rowclassesattr = panelGridEle.getAttribute(IJSFConstants.ATTR_ROWCLASSES);
-        if (rowclassesattr != null)
-        {
-            StringTokenizer tokenizer = new StringTokenizer(rowclassesattr, ", "); //$NON-NLS-1$
-            while (tokenizer.hasMoreTokens())
-            {
-                rowclasses.add(tokenizer.nextToken());
-            }
-        }
-
-        List columnclasses = new ArrayList();
-        String columnclassattr = panelGridEle.getAttribute(IJSFConstants.ATTR_COLUMNCLASSES);
-        if (columnclassattr != null)
-        {
-            StringTokenizer tokenizer = new StringTokenizer(columnclassattr, ", "); //$NON-NLS-1$
-            while (tokenizer.hasMoreTokens())
-            {
-                columnclasses.add(tokenizer.nextToken());
-            }
-        }
-
-        // Render the children of the UIPanel component inside of a "tbody" element.
-        // Render the children based on the value of the "columns" attribute, creating a new
-        // row each time a "columns" worth of children have been rendered. Each child is rendered
-        // inside of a "td" element. If a child has "rendered==false" it is not rendered,
-        // and the column counter must not be incremented.
-        Element tbody = createElement(IHTMLConstants.TAG_TBODY);
-        tableEle.appendChild(tbody);
-
-        List uipanelChildren = JSFDOMUtil.getUIComponentChildren(panelGridEle);
-        Element currentTr = null;
-        int nextRow = 0; // for rowclasses
-        for (int i = 0; i < uipanelChildren.size(); i++)
-        {
-            int columnIndex = i % columns;
-            if (columnIndex == 0)
-            {
-                currentTr = createElement(IHTMLConstants.TAG_TR);
-                if (!rowclasses.isEmpty())
-                {
-                    currentTr.setAttribute(IHTMLConstants.ATTR_CLASS, (String) rowclasses.get(nextRow));
-                    nextRow = (nextRow + 1) % rowclasses.size();
-                }
-                tbody.appendChild(currentTr);
-            }
-            Element uichild = (Element) uipanelChildren.get(i);
-            Element td = createElement(IHTMLConstants.TAG_TD);
-            if (columnIndex < columnclasses.size())
-            {
-                td.setAttribute(IHTMLConstants.ATTR_CLASS, (String) columnclasses.get(columnIndex));
-            }
-            currentTr.appendChild(td);
-            this.addChild(uichild, new ConvertPosition(td, 0));
-        }
-
-        return (tableEle);
-    }
-
-    /*
-     * (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.visualtag.ITagConverter#isMultiLevel()
-     */
-    public boolean isMultiLevel()
-    {
-        return true;
-    }
-
-    /*
-     * (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.visualtag.ITagConverter#isWidget()
-     */
-    public boolean isWidget()
-    {
-        return false;
-    }
-
-    /*
-     * (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo#needBorderDecorator()
-     */
-    public boolean needBorderDecorator()
-    {
-        return true;
-    }
-
-    /*
-     * (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#needTableDecorator()
-     */
-    public boolean needTableDecorator()
-    {
-        return true;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/PanelGroupTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/PanelGroupTagConverter.java
deleted file mode 100644
index ca592cc..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/PanelGroupTagConverter.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.converter.jsfhtml;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.converter.AbstractTagConverter;
-import org.eclipse.jst.pagedesigner.converter.JSFConverterUtil;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- * @deprecated Use DTTagConverter meta-data instead
- */
-public class PanelGroupTagConverter extends AbstractTagConverter
-{
-
-    /**
-     * @param host
-     */
-    public PanelGroupTagConverter(Element host)
-    {
-        super(host);
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#doConvertRefresh()
-     */
-    protected Element doConvertRefresh()
-    {
-        Element hostEle = getHostElement();
-
-        // If the "styleClass" or "style" attributes are present,
-        // render a "span" element.
-        // XXX: for page designer to have the panelGroup to always take up space,
-        // we use "div".
-        Element spanEle = createElement(IHTMLConstants.TAG_DIV);
-
-        // If the "style" attribute is present, pass it thru.
-        // XXX: we are passing all the attributes through, since other attribute
-        // don't conflict with html attributes.
-        JSFConverterUtil.copyAllAttributes(hostEle, spanEle, null);
-
-        // If the "styleClass" attribute is present,
-        // render its value as the value of the "class" attribute.
-        JSFConverterUtil.copyAttribute(hostEle, IJSFConstants.ATTR_STYLECLASS, spanEle, IHTMLConstants.ATTR_CLASS);
-        spanEle.removeAttribute(IJSFConstants.ATTR_STYLECLASS);
-
-        copyChildren(hostEle, spanEle);
-        return spanEle;
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isMultiLevel()
-     */
-    public boolean isMultiLevel()
-    {
-        return true;
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isWidget()
-     */
-    public boolean isWidget()
-    {
-        return false;
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo#needBorderDecorator()
-     */
-    public boolean needBorderDecorator()
-    {
-        return true;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/SelectBasedTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/SelectBasedTagConverter.java
deleted file mode 100644
index e7f817e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/SelectBasedTagConverter.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.converter.jsfhtml;
-
-import java.util.List;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.converter.ConverterUtil;
-import org.eclipse.jst.pagedesigner.converter.JSFConverterUtil;
-import org.w3c.dom.Element;
-import org.w3c.dom.Text;
-
-/**
- * @author mengbo
- * @version 1.5
- * @deprecated Use DTTagConverter meta-data instead
- */
-public abstract class SelectBasedTagConverter extends SelectTagConverter
-{
-
-    /**
-     * @param host
-     */
-    public SelectBasedTagConverter(Element host)
-    {
-        super(host);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#doConvertRefresh()
-     */
-    protected Element doConvertRefresh()
-    {
-        Element hostEle = getHostElement();
-
-        // Render an HTML "select" element.
-        Element selectEle = createElement(IHTMLConstants.TAG_SELECT);
-
-        // Render the clientId of the component as the value of the "name" attribute.
-        ConverterUtil.copyAttribute(hostEle, IJSFConstants.ATTR_ID, selectEle, IHTMLConstants.ATTR_NAME);
-
-        // XXX: handle ignore
-        JSFConverterUtil.copyAllAttributes(hostEle, selectEle, null);
-        
-//      If the "styleClass" attribute is specified, render its value as the value of 
-        // the "class" attribute on the "select" element.
-        JSFConverterUtil.copyAttribute(hostEle, IJSFConstants.ATTR_STYLECLASS, selectEle, IHTMLConstants.ATTR_CLASS);
-        selectEle.removeAttribute(IJSFConstants.ATTR_STYLECLASS);
-
-        // child class may generated different multiple and size attribute
-        handleMultipleAndSize(hostEle, selectEle);
-
-        // next generated the options under the <select>, so they can also be displayed.
-        List selectItems = this.getSelectItems(hostEle);
-        for (int i=0, size=selectItems.size(); i<size; i++)
-        {
-            SelectItemModel item = (SelectItemModel) selectItems.get(i);
-            Element option = createElement(IHTMLConstants.TAG_OPTION);
-            option.setAttribute(IHTMLConstants.ATTR_VALUE, item.getItemValue());
-            Text textNode = createText(item.getDisplayString());
-            option.appendChild(textNode);
-            selectEle.appendChild(option);
-        }
-
-        return (selectEle);
-    }
-
-    /**
-     * @param hostEle
-     * @param selectEle
-     */
-    protected abstract void handleMultipleAndSize(Element hostEle, Element selectEle);
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/SelectBooleanCheckboxTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/SelectBooleanCheckboxTagConverter.java
deleted file mode 100644
index 26c512a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/SelectBooleanCheckboxTagConverter.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.converter.jsfhtml;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.converter.AbstractTagConverter;
-import org.eclipse.jst.pagedesigner.converter.JSFConverterUtil;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- * @deprecated Use DTTagConverter meta-data instead
- */
-public class SelectBooleanCheckboxTagConverter extends AbstractTagConverter
-{
-
-    /**
-     * @param host
-     */
-    public SelectBooleanCheckboxTagConverter(Element host)
-    {
-        super(host);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#doConvertRefresh()
-     */
-    protected Element doConvertRefresh()
-    {
-        Element hostEle = getHostElement();
-        // Renders an HTML "input" element of type "checkbox".
-        Element inputEle = createElement(IHTMLConstants.TAG_INPUT);
-        JSFConverterUtil.copyAllAttributes(hostEle, inputEle, null);
-        JSFConverterUtil.copyAttribute(hostEle, IJSFConstants.ATTR_STYLECLASS, inputEle, IHTMLConstants.ATTR_CLASS);
-        inputEle.removeAttribute(IJSFConstants.ATTR_STYLECLASS);
-
-        inputEle.setAttribute(IHTMLConstants.ATTR_TYPE, "checkbox"); //$NON-NLS-1$
-        
-        if ("true".equalsIgnoreCase(inputEle.getAttribute(IHTMLConstants.ATTR_VALUE))) //$NON-NLS-1$
-        {
-            inputEle.setAttribute(IHTMLConstants.ATTR_CHECKED,"checked"); //$NON-NLS-1$
-        }
-        return inputEle;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isMultiLevel()
-     */
-    public boolean isMultiLevel()
-    {
-        return true;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isWidget()
-     */
-    public boolean isWidget()
-    {
-        return true;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/SelectItemModel.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/SelectItemModel.java
deleted file mode 100644
index b0493c5..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/SelectItemModel.java
+++ /dev/null
@@ -1,155 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.converter.jsfhtml;
-
-/**
- * This class emulate a javax.faces.model.SelectItem
- * 
- * @author mengbo
- * @version 1.5
- * @deprecated Use DTTagConverter meta-data instead
- */
-public class SelectItemModel
-{
-    private String _description;
-    private String _label;
-    private String _itemValue;
-    private String _value;
-    private String _id;
-    private boolean _disabled;
-    
-    /**
-     * @return Returns the disabled.
-     */
-    public boolean isDisabled()
-    {
-        return _disabled;
-    }
-    
-    /**
-     * @param disabled The disabled to set.
-     */
-    public void setDisabled(boolean disabled)
-    {
-        this._disabled = disabled;
-    }
-    
-    /**
-     * Return a description of this item, for use in development tools.
-     * @return the description
-     */ 
-    public String 	getDescription()
-    {
-        return _description;
-    }
-
-    /**
-     * Return the label of this item, to be rendered visibly for the user.
-     * @return the label for this item
-     */
-    public String 	getLabel()
-    {
-        return _label;
-    }
-
-    /**
-	 * Set the description of this item, for use in development tools.
-	 * @param description
-	 */
-    public void 	setDescription(java.lang.String description)
-    {
-        _description = description;
-    }
-
-    /**
-	 * Set the label of this item, to be rendered visibly for the user.
-	 * @param label
-	 */
-    public void 	setLabel(java.lang.String label)
-    {
-        this._label = label;
-    }
-    /**
-     * @return the item value
-     */
-    public String getItemValue()
-    {
-        return _itemValue;
-    }
-
-    /**
-     * @param itemValue
-     */
-    public void setItemValue(String itemValue)
-    {
-        this._itemValue = itemValue;
-    }
-
-    /**
-     * @return the value
-     */
-    public String getValue()
-    {
-        return _value;
-    }
-
-    /**
-     * @param value
-     */
-    public void setValue(String value)
-    {
-        this._value = value;
-    }
-
-    /**
-     * @return the id
-     */
-    public String getId()
-    {
-        return _id;
-    }
-
-    /**
-     * @param id
-     */
-    public void setId(String id)
-    {
-        _id = id;
-    }
-
-    /**
-     * @return the display string
-     */
-    public String getDisplayString()
-    {
-        if (_label != null && _label.length() > 0)
-        {
-            return _label;
-        }
-        else if (_value != null && _value.length() > 0)
-        {
-            return _value;
-        }
-        else if (_description != null && _description.length() > 0)
-        {
-            return _description;
-        }
-        else if (_itemValue != null && _itemValue.length() > 0)
-        {
-            return _itemValue;
-        }
-        else
-        {
-            return "SelectItem"; //$NON-NLS-1$
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/SelectManyListboxTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/SelectManyListboxTagConverter.java
deleted file mode 100644
index 32f404d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/SelectManyListboxTagConverter.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.converter.jsfhtml;
-
-import java.util.List;
-
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- * @deprecated Use DTTagConverter meta-data instead
- */
-public class SelectManyListboxTagConverter extends SelectBasedTagConverter
-{
-
-    /**
-     * @param host
-     */
-    public SelectManyListboxTagConverter(Element host)
-    {
-        super(host);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.jsfhtml.SelectBasedTagConverter#handleMultipleAndSize(org.w3c.dom.Element, org.w3c.dom.Element)
-     */
-    protected void handleMultipleAndSize(Element hostEle, Element selectEle)
-    {
-        // If the component is a UISelectMany instance, render "multiple" as the value of the 
-        // "multiple" attribute.
-        selectEle.setAttribute("multiple", "multiple"); //$NON-NLS-1$ //$NON-NLS-2$
-
-        // If the "size" attribute is specified, render its value as the value of the "size" 
-        // attribute. Otherwise use the number of items as the value of the "size" attribute.
-        String sizeattr = hostEle.getAttribute("size"); //$NON-NLS-1$
-
-        List selectItems = this.getSelectItems(hostEle);
-        if (sizeattr == null)
-        {
-            if (!selectItems.isEmpty())
-            {
-                selectEle.setAttribute("size", String.valueOf(selectItems.size())); //$NON-NLS-1$
-            }
-        }
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/SelectManyMenuTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/SelectManyMenuTagConverter.java
deleted file mode 100644
index 393f2ae..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/SelectManyMenuTagConverter.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.converter.jsfhtml;
-
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- * @deprecated Use DTTagConverter meta-data instead
- */
-public class SelectManyMenuTagConverter extends SelectBasedTagConverter
-{
-
-    /**
-     * @param host
-     */
-    public SelectManyMenuTagConverter(Element host)
-    {
-        super(host);
-        // TODO Auto-generated constructor stub
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.jsfhtml.SelectBasedTagConverter#handleMultipleAndSize(org.w3c.dom.Element, org.w3c.dom.Element)
-     */
-    protected void handleMultipleAndSize(Element hostEle, Element selectEle)
-    {
-        // If the component is a UISelectMany instance, render "multiple" as the value of the 
-        // "multiple" attribute.
-        selectEle.setAttribute("multiple", "multiple"); //$NON-NLS-1$ //$NON-NLS-2$
-
-        // If the "size" attribute is specified, render its value as the value of the "size" 
-        // attribute. Otherwise use the number of items as the value of the "size" attribute.
-        selectEle.setAttribute("size", "1"); //$NON-NLS-1$ //$NON-NLS-2$
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/SelectOneListboxTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/SelectOneListboxTagConverter.java
deleted file mode 100644
index 4178e5c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/SelectOneListboxTagConverter.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.converter.jsfhtml;
-
-import java.util.List;
-
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- * @deprecated Use DTTagConverter meta-data instead
- */
-public class SelectOneListboxTagConverter extends SelectBasedTagConverter
-{
-
-    /**
-     * @param host
-     */
-    public SelectOneListboxTagConverter(Element host)
-    {
-        super(host);
-        // TODO Auto-generated constructor stub
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.jsfhtml.SelectBasedTagConverter#handleMultipleAndSize(org.w3c.dom.Element, org.w3c.dom.Element)
-     */
-    protected void handleMultipleAndSize(Element hostEle, Element selectEle)
-    {
-        // always not multiple
-        selectEle.removeAttribute("multiple"); //$NON-NLS-1$
-
-        // If the "size" attribute is specified, render its value as the value of the "size" 
-        // attribute. Otherwise use the number of items as the value of the "size" attribute.
-        String sizeattr = hostEle.getAttribute("size"); //$NON-NLS-1$
-
-        List selectItems = this.getSelectItems(hostEle);
-        if (sizeattr == null)
-        {
-            if (!selectItems.isEmpty())
-            {
-                selectEle.setAttribute("size", String.valueOf(selectItems.size())); //$NON-NLS-1$
-            }
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/SelectOneMenuTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/SelectOneMenuTagConverter.java
deleted file mode 100644
index 95d0bf3..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/SelectOneMenuTagConverter.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.converter.jsfhtml;
-
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- * @deprecated Use DTTagConverter meta-data instead
- */
-public class SelectOneMenuTagConverter extends SelectBasedTagConverter
-{
-
-    /**
-     * @param host
-     */
-    public SelectOneMenuTagConverter(Element host)
-    {
-        super(host);
-        // TODO Auto-generated constructor stub
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.jsfhtml.SelectBasedTagConverter#handleMultipleAndSize(org.w3c.dom.Element, org.w3c.dom.Element)
-     */
-    protected void handleMultipleAndSize(Element hostEle, Element selectEle)
-    {
-        // always not multiple
-        selectEle.removeAttribute("multiple"); //$NON-NLS-1$
-
-        selectEle.setAttribute("size", "1"); //$NON-NLS-1$ //$NON-NLS-2$
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/SelectTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/SelectTagConverter.java
deleted file mode 100644
index cbc7b3e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/SelectTagConverter.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.converter.jsfhtml;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.converter.AbstractTagConverter;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-/**
- * This class is supposed to be common parent class for the different selectMany tags.
- * 
- * @author mengbo
- * @version 1.5
- * @deprecated Use DTTagConverter meta-data instead
- */
-public abstract class SelectTagConverter extends AbstractTagConverter
-{
-    /**
-     * @param host
-     */
-    public SelectTagConverter(Element host)
-    {
-        super(host);
-    }
-
-    /**
-     * Return a list of SelectItem
-     * 
-     * @param parent
-     * @return the select item list for parent
-     */
-    protected List getSelectItems(Element parent)
-    {
-        List result = new ArrayList();
-        NodeList nl = parent.getChildNodes();
-        for (int i = 0, size = nl.getLength(); i < size; i++)
-        {
-            Node child = nl.item(i);
-            if (child instanceof Element)
-            {
-                Element ele = (Element) child;
-                String tagname = ele.getLocalName();
-                if (IJSFConstants.TAG_SELECTITEM.equalsIgnoreCase(tagname))
-                {
-                    SelectItemModel item = new SelectItemModel();
-                    item.setDescription(ele.getAttribute(IJSFConstants.ATTR_ITEMDESCRIPTION));
-                    item.setLabel(ele.getAttribute(IJSFConstants.ATTR_ITEMLABEL));
-                    item.setItemValue(ele.getAttribute(IJSFConstants.ATTR_ITEMVALUE));
-                    item.setValue(ele.getAttribute(IJSFConstants.ATTR_VALUE));
-                    item.setId(ele.getAttribute(IJSFConstants.ATTR_ID));
-                    item.setDisabled("true".equalsIgnoreCase(ele.getAttribute(IJSFConstants.ATTR_ITEMDISABLED))); //$NON-NLS-1$
-                    result.add(item);
-                }
-                else if (IJSFConstants.TAG_SELECTITEMS.equalsIgnoreCase(tagname))
-                {
-                    // as selectItems can only be resolved at run time, so we just emulate
-                    // as if it map to two selectitem
-                    String value = ele.getAttribute(IJSFConstants.ATTR_VALUE);
-                    if (value == null || value.length() == 0)
-                    {
-                        value = IJSFConstants.ATTR_VALUE;
-                    }
-                    SelectItemModel item1 = new SelectItemModel();
-                    item1.setValue(value + "_1"); //$NON-NLS-1$
-                    item1.setId(ele.getAttribute(IJSFConstants.ATTR_ID));
-                    result.add(item1);
-                    SelectItemModel item2 = new SelectItemModel();
-                    item2.setValue(value + "_2"); //$NON-NLS-1$
-                    item2.setId(ele.getAttribute(IJSFConstants.ATTR_ID));
-                    result.add(item2);
-                }
-            }
-        }
-
-        return result;
-    }
-
-    /**
-     * @param parent
-     * @return the select item model for parent
-     */
-    public SelectItemModel getDefault(Element parent)
-    {
-        SelectItemModel item = new SelectItemModel();
-        if (parent.getLocalName().equals(IJSFConstants.TAG_SELECTONERADIO))
-        {
-            item.setLabel("radio"); //$NON-NLS-1$
-        }
-        else if (parent.getLocalName().equals(IJSFConstants.TAG_SELECTMANYCHECKBOX))
-        {
-            item.setLabel("checkBox"); //$NON-NLS-1$
-        }
-        else
-        {
-            item.setLabel(parent.getLocalName());
-        }
-        return item;
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isMultiLevel()
-     */
-    public boolean isMultiLevel()
-    {
-        return true;
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isWidget()
-     */
-    public boolean isWidget()
-    {
-        return true;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/TableBasedSelectTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/TableBasedSelectTagConverter.java
deleted file mode 100644
index 94377ee..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/TableBasedSelectTagConverter.java
+++ /dev/null
@@ -1,178 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.converter.jsfhtml;
-
-import java.util.List;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.converter.ConverterUtil;
-import org.w3c.dom.Element;
-import org.w3c.dom.Text;
-
-/**
- * @author mengbo
- * @version 1.5
- * @deprecated Use DTTagConverter meta-data instead
- */
-public class TableBasedSelectTagConverter extends SelectTagConverter
-{
-
-    private String _inputType;
-
-    /**
-     * @param host
-     * @param inputType 
-     */
-    public TableBasedSelectTagConverter(Element host, String inputType)
-    {
-        super(host);
-        this._inputType = inputType;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#doConvertRefresh()
-     */
-    protected Element doConvertRefresh()
-    {
-        Element hostEle = getHostElement();
-
-        // Render a "table" element.
-        Element tableEle = createElement(IHTMLConstants.TAG_TABLE);
-
-        // If the "styleClass" is specified, render the value of the "styleClass"
-        // attribute as the value of the "class" attribute on the "table" element.
-        ConverterUtil.copyAttribute(hostEle, IJSFConstants.ATTR_STYLECLASS, tableEle, IHTMLConstants.ATTR_CLASS);
-
-        // If the "style", "border" attributes are specified, pass them thru. 
-        ConverterUtil.copyAttribute(hostEle, IJSFConstants.ATTR_STYLE, tableEle, IHTMLConstants.ATTR_STYLE);
-        ConverterUtil.copyAttribute(hostEle, IJSFConstants.ATTR_BORDER, tableEle, IHTMLConstants.ATTR_BORDER);
-
-        // If the "layout" attribute is specified, and its value is "pageDirection", 
-        // render the children elements vertically, otherwise horizontally, in the table. 
-        boolean horizontal = true;
-        if ("pageDirection".equalsIgnoreCase(hostEle.getAttribute(IJSFConstants.ATTR_LAYOUT))) //$NON-NLS-1$
-        {
-            horizontal = false;
-        }
-
-        Element itemContainer;
-        if (horizontal)
-        {
-            itemContainer = createElement(IHTMLConstants.TAG_TR);
-            tableEle.appendChild(itemContainer);
-        }
-        else
-        {
-            itemContainer = tableEle;
-        }
-
-        // XXX: If any of the children are an instance of SelectItemGroup, render them as a 
-        // nested table.
-        // but at design time, we don't know anything about SelectItemGroup. so will not
-        // rendering nested table.
-
-        List selectitems = this.getSelectItems(hostEle);
-
-        // for designer, if there is no item, we still want to render one
-        if (this.isDesignerMode() && selectitems.isEmpty())
-        {
-            SelectItemModel item = getDefault(hostEle);
-            selectitems.add(item);
-        }
-
-        boolean isDisabled = Boolean.TRUE.toString()
-                .equalsIgnoreCase(hostEle.getAttribute(IJSFConstants.ATTR_DISABLED));
-        boolean isReadonly = Boolean.TRUE.toString()
-                .equalsIgnoreCase(hostEle.getAttribute(IJSFConstants.ATTR_READONLY));
-
-        for (int i = 0, size = selectitems.size(); i < size; i++)
-        {
-            SelectItemModel item = (SelectItemModel) selectitems.get(i);
-            // Each of the children are ultimately rendererd as follows. 
-            // Render a "label" element. Inside of the "label", render an "input" element 
-            // of "type" "checkbox" for each child component.
-            Element labelEle = createElement(IHTMLConstants.TAG_LABEL);
-            Element inputEle = createElement(IHTMLConstants.TAG_INPUT);
-            inputEle.setAttribute(IHTMLConstants.ATTR_TYPE, getInputType());
-            if (isDisabled || item.isDisabled())
-            {
-                inputEle.setAttribute(IHTMLConstants.ATTR_DISABLED, "disabled"); //$NON-NLS-1$
-            }
-            if (isReadonly)
-            {
-                inputEle.setAttribute(IHTMLConstants.ATTR_READONLY, "readonly"); //$NON-NLS-1$
-            }
-
-            // As an exception to the general 
-            // rules about how to handle the "id" attribute, render it as an attribute on 
-            // the outer "table" element, the value of which is the clientId of the component 
-            // per the rules at the beginning of this specification.The "id" attribute must 
-            // not be output on each "input" element.
-            if (item.getId() != null)
-            {
-                labelEle.setAttribute(IHTMLConstants.ATTR_ID, item.getId());
-            }
-
-            // The value of the current SelectItem 
-            // is rendered as the value of the "value" attribute. If the value of the enclosing 
-            // UISelectMany matches the current value, render "checked" as the value of the 
-            // "checked" attribute. If the current SelectItem.isDisabled() returns true, 
-            // render "disabled" as the value of the "disabled" attribute.
-            if (item.getValue() != null)
-            {
-                inputEle.setAttribute(IHTMLConstants.ATTR_VALUE, item.getValue());
-            }
-            // XXX: checked and disabled is not handled.
-
-            // Close out the "input" element and render the return value from 
-            // SelectItem.getLabel(). Close out the "label" element and any other nested elements.
-            Text label = createText(item.getDisplayString());
-
-            labelEle.appendChild(inputEle);
-            labelEle.appendChild(label);
-
-            if (horizontal)
-            {
-                Element td = createElement(IHTMLConstants.TAG_TD);
-                td.appendChild(labelEle);
-                itemContainer.appendChild(td);
-            }
-            else
-            {
-                Element tr = createElement(IHTMLConstants.TAG_TR);
-                Element td = createElement(IHTMLConstants.TAG_TD);
-                tr.appendChild(td);
-                td.appendChild(labelEle);
-                itemContainer.appendChild(tr);
-            }
-        }
-
-        return (tableEle);
-    }
-
-    /**
-     * @return the input type
-     */
-    protected String getInputType()
-    {
-        return _inputType;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#needBorderDecorator()
-     */
-    public boolean needBorderDecorator()
-    {
-        return true;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/operations/jsf/ColumnOperation.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/operations/jsf/ColumnOperation.java
deleted file mode 100644
index a8b15e7..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/operations/jsf/ColumnOperation.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.jsf.ui.converter.operations.jsf;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.StringTokenizer;
-
-import org.eclipse.jst.pagedesigner.converter.ConvertPosition;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.ITransformOperation;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.AbstractTransformOperation;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.TransformOperationFactory;
-import org.eclipse.jst.pagedesigner.jsf.core.dom.JSFDOMUtil;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * ITransformOperation implementation specifically for the "column" JSF (HTML)
- * Element. 
- * 
- * <br><b>Note:</b> requires ITransformOperation.setTagConverterContext(...) to
- * have been called to provide a valid ITagConverterContext instance prior to
- * a call to the transform(...) method.
- * 
- * @author Ian Trimble - Oracle
- */
-public class ColumnOperation extends AbstractTransformOperation {
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.AbstractTransformOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	public Element transform(Element srcElement, Element curElement) {
-
-		//create "td" Element
-		Element tdElement = createElement("td"); //$NON-NLS-1$
-
-		//get parent Node
-		Node parentNode = srcElement.getParentNode();
-
-		//process if parentNode is a "dataTable" Element
-		if (parentNode != null && parentNode.getNodeType() == Node.ELEMENT_NODE && parentNode.getLocalName().equals("dataTable")) { //$NON-NLS-1$
-			//tokenize "columnClasses" attribute into a List
-			List columnClassesList = new ArrayList();
-			String columnClassesAttribute = ((Element)parentNode).getAttribute("columnClasses"); //$NON-NLS-1$
-			if (columnClassesAttribute != null && columnClassesAttribute.length() > 0) {
-				StringTokenizer tokenizer = new StringTokenizer(columnClassesAttribute, ", "); //$NON-NLS-1$
-				while (tokenizer.hasMoreTokens()) {
-					columnClassesList.add(tokenizer.nextToken());
-				}
-			}
-			//set "class" attribute
-			int offset = EditModelQuery.getInstance().getSameTypeNodeIndex(srcElement);
-			if (offset < columnClassesList.size()) {
-				ITransformOperation operation =
-					TransformOperationFactory.getInstance().getTransformOperation(
-							TransformOperationFactory.OP_CreateAttributeOperation,
-							new String[]{"class", (String)columnClassesList.get(offset)}); //$NON-NLS-1$
-				operation.transform(srcElement, tdElement);
-			}
-		}
-
-		//add non-transparent (?), non-facet children (for further processing)
-        if (EditModelQuery.getInstance().hasNonTransparentChild(srcElement, new String[] {"facet"})) { //$NON-NLS-1$
-        	Node childNode = srcElement.getFirstChild();
-        	int index = 0;
-        	while (childNode != null) {
-        		if (!(childNode instanceof Element) || !JSFDOMUtil.isFacet((Element)childNode)) {
-        			//Bug 251378 - only add element, text, and CDATA child nodes (as we do everywhere else)
-        			if (childNode.getNodeType() == Node.ELEMENT_NODE ||
-        					childNode.getNodeType() == Node.TEXT_NODE ||
-        					childNode.getNodeType() == Node.CDATA_SECTION_NODE) {
-        				tagConverterContext.addChild(childNode, new ConvertPosition(tdElement, index++));
-        			}
-        		}
-        		childNode = childNode.getNextSibling();
-        	}
-        } else {
-        	//append single space for esthetics of the "td" Element
-        	appendChildText(" ", tdElement); //$NON-NLS-1$
-        }
-
-		return tdElement;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/operations/jsf/DataTableOperation.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/operations/jsf/DataTableOperation.java
deleted file mode 100644
index 95c0bed..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/operations/jsf/DataTableOperation.java
+++ /dev/null
@@ -1,200 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.jsf.ui.converter.operations.jsf;
-
-import java.util.Iterator;
-import java.util.List;
-import java.util.StringTokenizer;
-
-import org.eclipse.jst.pagedesigner.converter.ConvertPosition;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.ITransformOperation;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.AbstractTransformOperation;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.TransformOperationFactory;
-import org.w3c.dom.Element;
-
-/**
- * ITransformOperation implementation specifically for the "dataTable" JSF
- * (HTML) Element. 
- * 
- * <br><b>Note:</b> requires ITransformOperation.setTagConverterContext(...) to
- * have been called to provide a valid ITagConverterContext instance prior to
- * a call to the transform(...) method.
- * 
- * @author Ian Trimble - Oracle
- */
-public class DataTableOperation extends AbstractTransformOperation {
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.AbstractTransformOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	public Element transform(Element srcElement, Element curElement) {
-		Element tableElement = null;
-		//create table element, copy all attributes, rename "styleClass" attribute to "class"
-		tableElement = createElement("table"); //$NON-NLS-1$
-		ITransformOperation operation =
-			TransformOperationFactory.getInstance().getTransformOperation(
-					TransformOperationFactory.OP_CopyAllAttributesOperation,
-					new String[]{});
-		operation.transform(srcElement, tableElement);
-		operation =
-			TransformOperationFactory.getInstance().getTransformOperation(
-					TransformOperationFactory.OP_RenameAttributeOperation,
-					new String[]{"styleClass", "class"}); //$NON-NLS-1$ //$NON-NLS-2$
-		operation.transform(srcElement, tableElement);
-		//build thead
-		buildHeaderOrFooter(srcElement, tableElement, true);
-		//build tbody
-		buildBody(srcElement, tableElement);
-		//build tfoot
-		buildHeaderOrFooter(srcElement, tableElement, false);
-		return tableElement;
-	}
-
-	private void buildHeaderOrFooter(Element srcElement, Element tableElement, boolean isHeader) {
-		//setup vars depending on whether we are building thead or tfoot
-		String facetName = isHeader ? "header" : "footer"; //$NON-NLS-1$ //$NON-NLS-2$
-		String headerOrFooterTagName = isHeader ? "thead" : "tfoot"; //$NON-NLS-1$ //$NON-NLS-2$
-		String thOrTdTagName = isHeader ? "th" : "td"; //$NON-NLS-1$ //$NON-NLS-2$
-		String headerClassOrFooterClassAttrName = isHeader ? "headerClass" : "footerClass"; //$NON-NLS-1$ //$NON-NLS-2$
-
-		//look for facet ("header" or "footer")
-		Element facetElement = getChildFacetByName(srcElement, facetName);
-
-		//get list of child "column" elements
-		List columnElementList = getChildElements(srcElement, "column"); //$NON-NLS-1$
-
-		//look for facet ("header" or "footer") on child "column" elements
-		boolean hasColumnFacet = false;
-		Iterator itColumnElementList = columnElementList.iterator();
-		while (itColumnElementList.hasNext()) {
-			Element columnElement = (Element)itColumnElementList.next();
-			Element columnFacet = getChildFacetByName(columnElement, facetName);
-			if (columnFacet != null) {
-				hasColumnFacet = true;
-				break;
-			}
-		}
-
-		//test if we even need to build header or footer
-		if (facetElement == null && !hasColumnFacet) {
-			return;
-		}
-
-		//append "thead" or "tfoot" Element
-		Element headerOrFooterElement = appendChildElement(headerOrFooterTagName, tableElement);
-
-		//if facetElement exists, build appropriate thead or tfoot children
-		if (facetElement != null) {
-			//append "tr" Element
-			Element trElement = appendChildElement("tr", headerOrFooterElement); //$NON-NLS-1$
-			//append "th" or "td" Element
-			Element thOrTdElement = appendChildElement(thOrTdTagName, trElement);
-			//set "class" attribute
-			String headerClassOrFooterClassAttribute = srcElement.getAttribute(headerClassOrFooterClassAttrName);
-			if (headerClassOrFooterClassAttribute != null && headerClassOrFooterClassAttribute.length() > 0) {
-				ITransformOperation operation =
-					TransformOperationFactory.getInstance().getTransformOperation(
-							TransformOperationFactory.OP_CreateAttributeOperation,
-							new String[]{"class", headerClassOrFooterClassAttribute}); //$NON-NLS-1$
-				operation.transform(srcElement, thOrTdElement);
-			}
-			//set "colspan" attribute
-			if (columnElementList.size() > 0) {
-				ITransformOperation operation =
-					TransformOperationFactory.getInstance().getTransformOperation(
-							TransformOperationFactory.OP_CreateAttributeOperation,
-							new String[]{"colspan", String.valueOf(columnElementList.size())}); //$NON-NLS-1$
-				operation.transform(srcElement, thOrTdElement);
-			}
-			//add facet Element as child (to be processed further)
-			tagConverterContext.addChild(facetElement, new ConvertPosition(thOrTdElement, 0));
-		}
-
-		//if any child column has "header" or "footer" facet, build "tr" element
-		if (hasColumnFacet) {
-			//append "tr" Element
-			Element trElement = appendChildElement("tr", headerOrFooterElement); //$NON-NLS-1$
-			//iterate through columnElementList
-			itColumnElementList = columnElementList.iterator();
-			while (itColumnElementList.hasNext()) {
-				Element columnElement = (Element)itColumnElementList.next();
-				//get "header" or "footer" facet of column
-				Element columnFacet = getChildFacetByName(columnElement, facetName);
-				//append "th" or "td" Element
-				Element thOrTdElement = appendChildElement(thOrTdTagName, trElement);
-				//set "class" attribute
-				String headerClassOrFooterClassAttribute = srcElement.getAttribute(headerClassOrFooterClassAttrName);
-				if (headerClassOrFooterClassAttribute != null && headerClassOrFooterClassAttribute.length() > 0) {
-					ITransformOperation operation =
-						TransformOperationFactory.getInstance().getTransformOperation(
-								TransformOperationFactory.OP_CreateAttributeOperation,
-								new String[]{"class", headerClassOrFooterClassAttribute}); //$NON-NLS-1$
-					operation.transform(srcElement, thOrTdElement);
-				}
-				//if facet exists, add facet Element as child (to be processed further)
-				if (columnFacet != null) {
-					tagConverterContext.addChild(columnFacet, new ConvertPosition(thOrTdElement, 0));
-				}
-			}
-		}
-	}
-
-	private void buildBody(Element srcElement, Element tableElement) {
-		//append "tbody" element
-		Element tbodyElement = appendChildElement("tbody", tableElement); //$NON-NLS-1$
-		//append "tr" element
-		Element trElement = appendChildElement("tr", tbodyElement); //$NON-NLS-1$
-		//parse "rowClasses" attribute and set "class" attribute
-		String rowClassesAttribute = srcElement.getAttribute("rowClasses"); //$NON-NLS-1$
-		if (rowClassesAttribute != null && rowClassesAttribute.length() > 0) {
-			StringTokenizer tokenizer = new StringTokenizer(rowClassesAttribute, ", "); //$NON-NLS-1$
-			if (tokenizer.hasMoreTokens()) {
-				ITransformOperation operation =
-					TransformOperationFactory.getInstance().getTransformOperation(
-							TransformOperationFactory.OP_CreateAttributeOperation,
-							new String[]{"class", tokenizer.nextToken()}); //$NON-NLS-1$
-				operation.transform(srcElement, trElement);
-			}
-		}
-		//add child columns (to be processed further)
-		List columnElementList = getChildElements(srcElement, "column"); //$NON-NLS-1$
-		Iterator itColumnElementList = columnElementList.iterator();
-		int index = 0;
-		while (itColumnElementList.hasNext()) {
-			Element columnElement = (Element)itColumnElementList.next();
-			tagConverterContext.addChild(columnElement, new ConvertPosition(trElement, index++));
-		}
-	}
-
-	/**
-	 * Gets a child Element of the specified parent Element that has the node
-	 * name "facet" and the specified value of the "name" attribute.
-	 * 
-	 * @param srcElement Parent Element instance.
-	 * @param facetName Name of the facet Element for which to search.
-	 * @return Child Element that is a facet with the specified name.
-	 */
-	private Element getChildFacetByName(Element srcElement, String facetName) {
-		Element element = null;
-		List facets = getChildElements(srcElement, "facet"); //$NON-NLS-1$
-		Iterator itFacets = facets.iterator();
-		while (itFacets.hasNext()) {
-			Element facet = (Element)itFacets.next();
-			if (facet.getAttribute("name").equals(facetName)) { //$NON-NLS-1$
-				element = facet;
-				break;
-			}
-		}
-		return element;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/operations/jsf/LoadBundleOperation.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/operations/jsf/LoadBundleOperation.java
deleted file mode 100644
index 7ae84d4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/operations/jsf/LoadBundleOperation.java
+++ /dev/null
@@ -1,162 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.jsf.ui.converter.operations.jsf;
-
-import java.io.BufferedInputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.HashMap;
-import java.util.PropertyResourceBundle;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.jdt.core.IClasspathEntry;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jst.jsf.common.ui.IFileFolderConstants;
-import org.eclipse.jst.jsf.common.ui.internal.utils.ResourceUtils;
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.AbstractTransformOperation;
-import org.eclipse.jst.pagedesigner.utils.PreviewUtil;
-import org.eclipse.jst.pagedesigner.utils.StructuredModelUtil;
-import org.eclipse.wst.common.componentcore.ComponentCore;
-import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
-import org.eclipse.wst.common.componentcore.resources.IVirtualFolder;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-import org.w3c.dom.Element;
-
-/**
- * ITransformOperation implementation specifically for the "loadBundle" JSF
- * (core) Element. 
- * 
- * @author Ian Trimble - Oracle
- */
-public class LoadBundleOperation extends AbstractTransformOperation {
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.AbstractTransformOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	public Element transform(Element srcElement, Element curElement) {
-		if (srcElement != null) {
-			//get "var" and "basename" attributes of srcElement
-			String var = srcElement.getAttribute(IJSFConstants.ATTR_VAR);
-			String basename = srcElement.getAttribute(IJSFConstants.ATTR_BASENAME);
-			if (var != null && basename != null && var.length() > 0 && basename.length() > 0) {
-				String basePath =
-					basename.replace('.', IFileFolderConstants.PATH_SEPARATOR.charAt(0)) +
-							IFileFolderConstants.DOT +
-							IFileFolderConstants.EXT_PROPERTIES;
-				if (srcElement instanceof IDOMNode) {
-					//get model
-					IDOMModel model = ((IDOMNode)srcElement).getModel();
-					if (model != null) {
-						//get project
-						IProject project = StructuredModelUtil.getProjectFor(model);
-						if (project != null) {
-							//attempt to locate properties file in "/{WebRoot}/WEB-INF/classes"
-							IVirtualComponent component = ComponentCore.createComponent(project);
-							if (component != null) {
-								IVirtualFolder rootFolder = component.getRootFolder();
-								if (rootFolder != null) {
-									IPath webRootPath = rootFolder.getProjectRelativePath();
-									if (webRootPath != null) {
-										StringBuffer sb = new StringBuffer(webRootPath.toString());
-										if (!IFileFolderConstants.PATH_SEPARATOR.equals(webRootPath.toString())) {
-											sb.append(IFileFolderConstants.PATH_SEPARATOR);
-										}
-										sb.append(IFileFolderConstants.FOLDER_WEBINF);
-										sb.append(IFileFolderConstants.PATH_SEPARATOR);
-										sb.append(IFileFolderConstants.FOLDER_CLASS);
-										sb.append(IFileFolderConstants.PATH_SEPARATOR);
-										sb.append(basePath);
-										IResource resource = project.findMember(sb.toString());
-										if (resource == null) {
-											resource = findFileInSrcFolder(project, basePath);
-											if (resource != null) {
-												//load properties file and configure PreviewUtil
-												InputStream inputStream = null;
-												try {
-													File file = new File(resource.getLocation().toString());
-													inputStream = new FileInputStream(file);
-													if (inputStream != null) {
-														inputStream = new BufferedInputStream(inputStream);
-														PropertyResourceBundle bundle = new PropertyResourceBundle(inputStream);
-														if (bundle != null) {
-															if (PreviewUtil.getBUNDLE_MAP() == null) {
-																PreviewUtil.setBUNDLE_MAP(new HashMap());
-															} else {
-																PreviewUtil.getBUNDLE_MAP().clear();
-															}
-															PreviewUtil.getBUNDLE_MAP().put(var, bundle);
-															PreviewUtil.setBUNDLE(bundle);
-															PreviewUtil.setVAR(var);
-														}
-													}
-												} catch(IOException ioe) {
-													PDPlugin.getLogger(LoadBundleOperation.class).error("LoadBundleTagConverter.convertRefresh.IOException", ioe); //$NON-NLS-1$
-												} finally {
-													ResourceUtils.ensureClosed(inputStream);
-												}
-											}
-										}
-									}
-								}
-							}
-						}
-					}
-				}
-			}
-		}
-		//return null to indicate there is no HTML element associated with this tag
-		return null;
-	}
-
-	/**
-	 * Find specified file in any source folder of the specified project.
-	 * 
-	 * @param project IProject instance.
-	 * @param filePath Source folder-relative path of the file to be located.
-	 * @return the specified file in any source folder of the specified project.
-	 */
-	protected IResource findFileInSrcFolder(IProject project, String filePath) {
-		IResource resource = null;
-		IJavaProject javaProject = JavaCore.create(project);
-		if (javaProject != null) {
-			try {
-				IClasspathEntry[] classpathEntries = javaProject.getResolvedClasspath(true);
-				for (int i = 0; i < classpathEntries.length; i++) {
-					IClasspathEntry classpathEntry = classpathEntries[i];
-					if (classpathEntry.getEntryKind() == IClasspathEntry.CPE_SOURCE) {
-						IPath srcPath = classpathEntry.getPath();
-						//srcPath = srcPath.removeFirstSegments(srcPath.matchingFirstSegments(project.getFullPath()));
-						IPath srcFilePath = srcPath.append(filePath);
-						IResource tmpResource = project.getParent().findMember(srcFilePath);
-						if (tmpResource != null) {
-							resource = tmpResource;
-							break;
-						}
-					}
-				}
-			} catch(JavaModelException jme) {
-				//ignore - returning null from method will indicate failure
-			}
-		}
-		return resource;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/operations/jsf/PanelGridOperation.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/operations/jsf/PanelGridOperation.java
deleted file mode 100644
index 7ee81bf..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/operations/jsf/PanelGridOperation.java
+++ /dev/null
@@ -1,204 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.jsf.ui.converter.operations.jsf;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.StringTokenizer;
-
-import org.eclipse.jst.pagedesigner.converter.ConvertPosition;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.ITransformOperation;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.AbstractTransformOperation;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.TransformOperationFactory;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-/**
- * ITransformOperation implementation specifically for the "panelGrid" JSF
- * (HTML) Element. 
- * 
- * <br><b>Note:</b> requires ITransformOperation.setTagConverterContext(...) to
- * have been called to provide a valid ITagConverterContext instance prior to
- * a call to the transform(...) method.
- * 
- * @author Ian Trimble - Oracle
- */
-public class PanelGridOperation extends AbstractTransformOperation {
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.AbstractTransformOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	public Element transform(Element srcElement, Element curElement) {
-		Element tableElement = null;
-		//create table element, copy all attributes, rename "styleClass" attribute to "class"
-		tableElement = createElement("table"); //$NON-NLS-1$
-		ITransformOperation operation =
-			TransformOperationFactory.getInstance().getTransformOperation(
-					TransformOperationFactory.OP_CopyAllAttributesOperation,
-					new String[]{});
-		operation.transform(srcElement, tableElement);
-		operation =
-			TransformOperationFactory.getInstance().getTransformOperation(
-					TransformOperationFactory.OP_RenameAttributeOperation,
-					new String[]{"styleClass", "class"}); //$NON-NLS-1$ //$NON-NLS-2$
-		operation.transform(srcElement, tableElement);
-		//get value of "columns" attribute
-		int columns;
-		try {
-			columns = Integer.parseInt(srcElement.getAttribute("columns")); //$NON-NLS-1$
-		} catch(NumberFormatException nfe) {
-			columns = 1;
-		}
-		if (columns < 1) {
-			columns = 1;
-		}
-		//check for "header" facet and render appropriately
-		Element headerFacetElement = getChildFacetByName(srcElement, "header"); //$NON-NLS-1$
-		if (headerFacetElement != null) {
-			Element tHeadElement = appendChildElement("thead", tableElement); //$NON-NLS-1$
-			Element trElement = appendChildElement("tr", tHeadElement); //$NON-NLS-1$
-			Element thElement = appendChildElement("th", trElement); //$NON-NLS-1$
-			String headerClass = srcElement.getAttribute("headerClass"); //$NON-NLS-1$
-			if (headerClass != null && headerClass.length() > 0) {
-				operation =
-					TransformOperationFactory.getInstance().getTransformOperation(
-							TransformOperationFactory.OP_CreateAttributeOperation,
-							new String[]{"class", headerClass}); //$NON-NLS-1$
-				operation.transform(srcElement, thElement);
-			}
-			operation =
-				TransformOperationFactory.getInstance().getTransformOperation(
-						TransformOperationFactory.OP_CreateAttributeOperation,
-						new String[]{"colspan", String.valueOf(columns)}); //$NON-NLS-1$
-			operation.transform(srcElement, thElement);
-			tagConverterContext.addChild(headerFacetElement, new ConvertPosition(thElement, 0));
-		}
-		//check for "footer" facet and render appropriately
-		Element footerFacetElement = getChildFacetByName(srcElement, "footer"); //$NON-NLS-1$
-		if (footerFacetElement != null) {
-			Element tFootElement = appendChildElement("tfoot", tableElement); //$NON-NLS-1$
-			Element trElement = appendChildElement("tr", tFootElement); //$NON-NLS-1$
-			Element tdElement = appendChildElement("td", trElement); //$NON-NLS-1$
-			String footerClass = srcElement.getAttribute("footerClass"); //$NON-NLS-1$
-			if (footerClass != null && footerClass.length() > 0) {
-				operation =
-					TransformOperationFactory.getInstance().getTransformOperation(
-							TransformOperationFactory.OP_CreateAttributeOperation,
-							new String[]{"class", footerClass}); //$NON-NLS-1$
-				operation.transform(srcElement, tdElement);
-			}
-			operation =
-				TransformOperationFactory.getInstance().getTransformOperation(
-						TransformOperationFactory.OP_CreateAttributeOperation,
-						new String[]{"colspan", String.valueOf(columns)}); //$NON-NLS-1$
-			operation.transform(srcElement, tdElement);
-			tagConverterContext.addChild(footerFacetElement, new ConvertPosition(tdElement, 0));
-		}
-		//get rowClasses and columnClasses for subsequent processing
-        List rowClasses = new ArrayList();
-        String rowClassesAttribute = srcElement.getAttribute("rowClasses"); //$NON-NLS-1$
-        if (rowClassesAttribute != null && rowClassesAttribute.length() > 0) {
-            StringTokenizer tokenizer = new StringTokenizer(rowClassesAttribute, ", "); //$NON-NLS-1$
-            while (tokenizer.hasMoreTokens()) {
-                rowClasses.add(tokenizer.nextToken());
-            }
-        }
-        List columnClasses = new ArrayList();
-        String columnClassAttribute = srcElement.getAttribute("columnClasses"); //$NON-NLS-1$
-        if (columnClassAttribute != null) {
-            StringTokenizer tokenizer = new StringTokenizer(columnClassAttribute, ", "); //$NON-NLS-1$
-            while (tokenizer.hasMoreTokens()) {
-                columnClasses.add(tokenizer.nextToken());
-            }
-        }
-		//render children using appropriate number of columns and appropriate classes
-        Element tBodyElement = appendChildElement("tbody", tableElement); //$NON-NLS-1$
-        List childElements = getChildElementsSkipFacets(srcElement);
-        Element trElement = null;
-        int nextRow = 0;
-        int curIndex = 0;
-        Iterator itChildElements = childElements.iterator();
-        while (itChildElements.hasNext()) {
-        	int columnIndex = curIndex % columns;
-        	if (columnIndex == 0) {
-        		trElement = appendChildElement("tr", tBodyElement); //$NON-NLS-1$
-        		if (!rowClasses.isEmpty()) {
-    				operation =
-    					TransformOperationFactory.getInstance().getTransformOperation(
-    							TransformOperationFactory.OP_CreateAttributeOperation,
-    							new String[]{"class", (String)rowClasses.get(nextRow)}); //$NON-NLS-1$
-    				operation.transform(srcElement, trElement);
-        			nextRow = (nextRow + 1) % rowClasses.size();
-        		}
-        	}
-        	Element tdElement = appendChildElement("td", trElement); //$NON-NLS-1$
-        	if (columnIndex < columnClasses.size()) {
-				operation =
-					TransformOperationFactory.getInstance().getTransformOperation(
-							TransformOperationFactory.OP_CreateAttributeOperation,
-							new String[]{"class", (String)columnClasses.get(columnIndex)}); //$NON-NLS-1$
-				operation.transform(srcElement, tdElement);
-        	}
-        	tagConverterContext.addChild((Element)itChildElements.next(), new ConvertPosition(tdElement, 0));
-        	curIndex++;
-        }
-        return tableElement;
-	}
-
-	/**
-	 * Gets a child Element of the specified parent Element that has the node
-	 * name "facet" and the specified value of the "name" attribute.
-	 * 
-	 * @param srcElement Parent Element instance.
-	 * @param facetName Name of the facet Element for which to search.
-	 * @return Child Element that is a facet with the specified name.
-	 */
-	private Element getChildFacetByName(Element srcElement, String facetName) {
-		Element element = null;
-		List facets = getChildElements(srcElement, "facet"); //$NON-NLS-1$
-		Iterator itFacets = facets.iterator();
-		while (itFacets.hasNext()) {
-			Element facet = (Element)itFacets.next();
-			String facetAttrName = facet.getAttribute("name"); //$NON-NLS-1$
-			if (facetAttrName != null && facetAttrName.equals(facetName)) {
-				element = facet;
-				break;
-			}
-		}
-		return element;
-	}
-
-	/**
-	 * Gets a list of child Elements of the specified parent Element, skipping
-	 * any "facet" Elements.
-	 * 
-	 * @param srcElement Parent Element instance.
-	 * @return List of child Elements of the specified parent Element that does
-	 * not include any child "facet" Elements.
-	 */
-	private List getChildElementsSkipFacets(Element srcElement) {
-		List childElementsList = new ArrayList();
-		NodeList childNodes = srcElement.getChildNodes();
-		for (int i = 0; i < childNodes.getLength(); i++) {
-			Node childNode = childNodes.item(i);
-			if (childNode.getNodeType() == Node.ELEMENT_NODE) {
-				if (!childNode.getLocalName().equals("facet")) { //$NON-NLS-1$
-					childElementsList.add(childNode);
-				}
-			}
-		}
-		return childElementsList;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/operations/jsf/SelectManyCheckboxOperation.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/operations/jsf/SelectManyCheckboxOperation.java
deleted file mode 100644
index 4ebd28d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/operations/jsf/SelectManyCheckboxOperation.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.jsf.ui.converter.operations.jsf;
-
-/**
- * ITransformOperation implementation specifically for the "selectManyCheckbox"
- * JSF (HTML) Element. 
- * 
- * <br><b>Note:</b> requires ITransformOperation.setTagConverterContext(...) to
- * have been called to provide a valid ITagConverterContext instance prior to
- * a call to the transform(...) method.
- * 
- * @author Ian Trimble - Oracle
- */
-public class SelectManyCheckboxOperation extends TableBasedOperation {
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.jsf.ui.converter.operations.jsf.TableBasedOperation#getInputType()
-	 */
-	protected String getInputType() {
-		return "checkbox"; //$NON-NLS-1$
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/operations/jsf/SelectOneRadioOperation.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/operations/jsf/SelectOneRadioOperation.java
deleted file mode 100644
index 12a32e5..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/operations/jsf/SelectOneRadioOperation.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.jsf.ui.converter.operations.jsf;
-
-/**
- * ITransformOperation implementation specifically for the "selectOneRadio"
- * JSF (HTML) Element. 
- * 
- * <br><b>Note:</b> requires ITransformOperation.setTagConverterContext(...) to
- * have been called to provide a valid ITagConverterContext instance prior to
- * a call to the transform(...) method.
- * 
- * @author Ian Trimble - Oracle
- */
-public class SelectOneRadioOperation extends TableBasedOperation {
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.jsf.ui.converter.operations.jsf.TableBasedOperation#getInputType()
-	 */
-	protected String getInputType() {
-		return "radio"; //$NON-NLS-1$
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/operations/jsf/TableBasedOperation.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/operations/jsf/TableBasedOperation.java
deleted file mode 100644
index a503acf..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/operations/jsf/TableBasedOperation.java
+++ /dev/null
@@ -1,184 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.jsf.ui.converter.operations.jsf;
-
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.jst.pagedesigner.dtmanager.converter.ITransformOperation;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.AbstractTransformOperation;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.TransformOperationFactory;
-import org.eclipse.jst.pagedesigner.jsf.ui.util.JSFUIPluginResourcesUtil;
-import org.w3c.dom.Element;
-
-/**
- * Abstract ITransformOperation implementation intended as super class for HTML
- * "table"-based "selectXXX" JSF (HTML) Elements. 
- * 
- * <br><b>Note:</b> requires ITransformOperation.setTagConverterContext(...) to
- * have been called to provide a valid ITagConverterContext instance prior to
- * a call to the transform(...) method.
- * 
- * @author Ian Trimble - Oracle
- */
-public abstract class TableBasedOperation extends AbstractTransformOperation {
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.AbstractTransformOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	public Element transform(Element srcElement, Element curElement) {
-		Element tableElement = createElement("table"); //$NON-NLS-1$
-		ITransformOperation operation =
-			TransformOperationFactory.getInstance().getTransformOperation(
-					TransformOperationFactory.OP_CopyAttributeOperation,
-					new String[]{"styleClass"}); //$NON-NLS-1$
-		operation.transform(srcElement, tableElement);
-		operation =
-			TransformOperationFactory.getInstance().getTransformOperation(
-					TransformOperationFactory.OP_RenameAttributeOperation,
-					new String[]{"styleClass", "class"}); //$NON-NLS-1$ //$NON-NLS-2$
-		operation.transform(srcElement, tableElement);
-		operation =
-			TransformOperationFactory.getInstance().getTransformOperation(
-					TransformOperationFactory.OP_CopyAttributeOperation,
-					new String[]{"style"}); //$NON-NLS-1$
-		operation.transform(srcElement, tableElement);
-		operation =
-			TransformOperationFactory.getInstance().getTransformOperation(
-					TransformOperationFactory.OP_CopyAttributeOperation,
-					new String[]{"border"}); //$NON-NLS-1$
-		operation.transform(srcElement, tableElement);
-		boolean layoutHorizontal = true;
-		if ("pageDirection".equalsIgnoreCase(srcElement.getAttribute("layout"))) { //$NON-NLS-1$ //$NON-NLS-2$
-			layoutHorizontal = false;
-		}
-		Element itemContainer;
-		if (layoutHorizontal) {
-			itemContainer = appendChildElement("tr", tableElement); //$NON-NLS-1$
-		} else {
-			itemContainer = tableElement;
-		}
-		boolean isDisabled = Boolean.TRUE.toString().equalsIgnoreCase(srcElement.getAttribute("disabled")); //$NON-NLS-1$
-		boolean isReadOnly = Boolean.TRUE.toString().equalsIgnoreCase(srcElement.getAttribute("readonly")); //$NON-NLS-1$
-		List selectItemList = getChildElements(srcElement, "selectItem"); //$NON-NLS-1$
-		if (selectItemList.size() > 0) {
-			Iterator itSelectItemList = selectItemList.iterator();
-			while (itSelectItemList.hasNext()) {
-				Element selectItem = (Element) itSelectItemList.next();
-				Element labelElement = createElement("label"); //$NON-NLS-1$
-				Element inputElement = appendChildElement("input", labelElement); //$NON-NLS-1$
-				inputElement.setAttribute("type", getInputType()); //$NON-NLS-1$
-				if (isDisabled || Boolean.TRUE.toString().equalsIgnoreCase(selectItem.getAttribute("itemDisabled"))) { //$NON-NLS-1$
-					inputElement.setAttribute("disabled", "disabled"); //$NON-NLS-1$ //$NON-NLS-2$
-				}
-				if (isReadOnly) {
-					inputElement.setAttribute("readonly", "readonly"); //$NON-NLS-1$ //$NON-NLS-2$
-				}
-				String selectItemID = selectItem.getAttribute("id"); //$NON-NLS-1$
-				if (selectItemID != null && selectItemID.length() > 0) {
-					inputElement.setAttribute("id", selectItemID); //$NON-NLS-1$
-				}
-				String selectItemValue = selectItem.getAttribute("value"); //$NON-NLS-1$
-				if (selectItemValue != null && selectItemValue.length() > 0) {
-					inputElement.setAttribute("value", selectItemValue); //$NON-NLS-1$
-				}
-				String label = getSelectItemLabel(selectItem);
-				appendChildText(label, labelElement);
-				if (layoutHorizontal) {
-					Element tdElement = appendChildElement("td", itemContainer); //$NON-NLS-1$
-					tdElement.appendChild(labelElement);
-				} else {
-					Element trElement = appendChildElement("tr", itemContainer); //$NON-NLS-1$
-					Element tdElement = appendChildElement("td", trElement); //$NON-NLS-1$
-					tdElement.appendChild(labelElement);
-				}
-			}
-		} else {
-			Element spanElement = createElement("span"); //$NON-NLS-1$
-			appendAttribute(spanElement, "style", //$NON-NLS-1$
-					JSFUIPluginResourcesUtil.getInstance().getString("TableBasedOperation.NoSelectItem.style")); //$NON-NLS-1$
-			List selectItemsList = getChildElements(srcElement, "selectItems"); //$NON-NLS-1$
-			if (selectItemsList.size() > 0) {
-				appendChildText(
-						JSFUIPluginResourcesUtil.getInstance().getString("TableBasedOperation.OnlySelectItems.text"), //$NON-NLS-1$
-						spanElement);
-			} else {
-				appendChildText(
-						JSFUIPluginResourcesUtil.getInstance().getString("TableBasedOperation.NoSelectItem.text"), //$NON-NLS-1$
-						spanElement);
-			}
-			if (layoutHorizontal) {
-				Element tdElement = appendChildElement("td", itemContainer); //$NON-NLS-1$
-				tdElement.appendChild(spanElement);
-			} else {
-				Element trElement = appendChildElement("tr", itemContainer); //$NON-NLS-1$
-				Element tdElement = appendChildElement("td", trElement); //$NON-NLS-1$
-				tdElement.appendChild(spanElement);
-			}
-		}
-		return tableElement;
-	}
-
-	/**
-	 * Subclasses override this in order to return the "type" attribute of
-	 * child "input" Elements ("checkbox" or "radio").
-	 * 
-	 * @return the "type" attribute of child "input" Elements.
-	 */
-	protected abstract String getInputType();
-
-	/**
-	 * Attempts to get a label for the selectItem Element instance.
-	 * 
-	 * @param selectItem "selectItem" source Element instance.
-	 * @return Label for the specified selectItem Element instance.
-	 */
-	private String getSelectItemLabel(Element selectItem) {
-		String attribute = selectItem.getAttribute("itemLabel"); //$NON-NLS-1$
-		if (attribute != null && attribute.length() > 0) {
-			return attribute;
-		}
-		attribute = selectItem.getAttribute("value"); //$NON-NLS-1$
-		if (attribute != null && attribute.length() > 0) {
-			return attribute;
-		}
-		attribute = selectItem.getAttribute("itemDescription"); //$NON-NLS-1$
-		if (attribute != null && attribute.length() > 0) {
-			return attribute;
-		}
-		attribute = selectItem.getAttribute("itemValue"); //$NON-NLS-1$
-		if (attribute != null && attribute.length() > 0) {
-			return attribute;
-		}
-		return "selectItem"; //$NON-NLS-1$
-	}
-
-	/**
-	 * Appends the specified attribute with the specified value to the specified
-	 * Element instance.
-	 * 
-	 * @param element Element instance to append attribute to.
-	 * @param attributeName Name of attribute to be appended.
-	 * @param attributeValue Value of attribute to be appended.
-	 */
-	protected void appendAttribute(
-			Element element,
-			String attributeName,
-			String attributeValue) {
-		ITransformOperation operation =
-			TransformOperationFactory.getInstance().getTransformOperation(
-					TransformOperationFactory.OP_CreateAttributeOperation,
-					new String[]{attributeName, attributeValue});
-		operation.transform(null, element);
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/jsfcore/FacetElementEdit.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/jsfcore/FacetElementEdit.java
deleted file mode 100644
index cf5ac89..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/jsfcore/FacetElementEdit.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.elementedit.jsfcore;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.jst.pagedesigner.elementedit.AbstractElementEdit;
-import org.eclipse.jst.pagedesigner.parts.ElementEditPart;
-import org.w3c.dom.Element;
-
-/**
- * Element edit for a f:facet
- * 
- * @author cbateman
- *
- */
-public class FacetElementEdit extends AbstractElementEdit
-{
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.elementedit.AbstractElementEdit#handleModelChange(org.w3c.dom.Element, org.eclipse.jst.pagedesigner.parts.ElementEditPart)
-     */
-    public boolean handleModelChange(Element ele, ElementEditPart part,boolean recursive)
-    {
-        EditPart parent = part.getParent();
-        if (parent instanceof ElementEditPart)
-        {
-            ((ElementEditPart) parent).refreshModelChange(recursive);
-            return true;
-        }
-        return false;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/jsfcore/JSFCoreElementEditFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/jsfcore/JSFCoreElementEditFactory.java
deleted file mode 100644
index 966a68b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/jsfcore/JSFCoreElementEditFactory.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.elementedit.jsfcore;
-
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.elementedit.IElementEdit;
-import org.eclipse.jst.pagedesigner.elementedit.IElementEditFactory;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class JSFCoreElementEditFactory implements IElementEditFactory
-{
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.elementedit.IElementEditFactory#createElementEdit(org.w3c.dom.Element)
-     */
-    public IElementEdit createElementEdit(TagIdentifier tagIdentifier)
-    {
-        if (IJSFConstants.TAG_IDENTIFIER_LOADBUNDLE.isSameTagType(tagIdentifier))
-        {
-            return new LoadBundleElementEdit();
-        }
-        else if(IJSFConstants.TAG_IDENTIFIER_FACET.isSameTagType(tagIdentifier))
-        {
-            return new FacetElementEdit();
-        }
-        return null;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.elementedit.IElementEditFactory#getSupportedURI()
-     */
-    public String getSupportedURI()
-    {
-        return ITLDConstants.URI_JSF_CORE;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/jsfcore/JarEntryEditorInput.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/jsfcore/JarEntryEditorInput.java
deleted file mode 100644
index 17ee5a4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/jsfcore/JarEntryEditorInput.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.elementedit.jsfcore;
-
-import org.eclipse.core.resources.IStorage;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.ui.IEditorRegistry;
-import org.eclipse.ui.IPersistableElement;
-import org.eclipse.ui.IStorageEditorInput;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class JarEntryEditorInput implements IStorageEditorInput
-{
-
-    private IStorage fJarEntryFile;
-
-    /**
-     * @param jarEntryFile
-     */
-    public JarEntryEditorInput(IStorage jarEntryFile)
-    {
-        fJarEntryFile = jarEntryFile;
-    }
-
-    /*
-     */
-    public boolean equals(Object obj)
-    {
-        if (this == obj)
-        {
-            return true;
-        }
-        if (!(obj instanceof JarEntryEditorInput))
-        {
-            return false;
-        }
-        JarEntryEditorInput other = (JarEntryEditorInput) obj;
-        return fJarEntryFile.equals(other.fJarEntryFile);
-    }
-
-    
-    @Override
-    public int hashCode() 
-    {
-        // two editor inputs are equal if their fJarEntryFile's are
-        // equal.  Therefore use the same criteria for hashcodes
-        return fJarEntryFile.hashCode();
-    }
-
-    /*
-     * @see IEditorInput#getPersistable()
-     */
-    public IPersistableElement getPersistable()
-    {
-        return null;
-    }
-
-    /*
-     * @see IEditorInput#getName()
-     */
-    public String getName()
-    {
-        return fJarEntryFile.getName();
-    }
-
-
-    /**
-     * @return the full path of the entry as a string
-     */
-    public String getFullPath()
-    {
-        return fJarEntryFile.getFullPath().toString();
-    }
-
-
-    /**
-     * @return the file extension of this input
-     */
-    public String getContentType()
-    {
-        return fJarEntryFile.getFullPath().getFileExtension();
-    }
-
-    /*
-     * @see IEditorInput#getToolTipText()
-     */
-    public String getToolTipText()
-    {
-        return fJarEntryFile.getFullPath().toString();
-    }
-
-    /*
-     * @see IEditorInput#getImageDescriptor()
-     */
-    public ImageDescriptor getImageDescriptor()
-    {
-        IEditorRegistry registry = PlatformUI.getWorkbench().getEditorRegistry();
-        return registry.getImageDescriptor(fJarEntryFile.getFullPath().getFileExtension());
-    }
-
-    /*
-     * @see IEditorInput#exists()
-     */
-    public boolean exists()
-    {
-        // JAR entries can't be deleted
-        return true;
-    }
-
-    /*
-     * @see IAdaptable#getAdapter(Class)
-     */
-    public Object getAdapter(Class adapter)
-    {
-        return null;
-    }
-
-    /*
-     * see IStorageEditorInput#getStorage()
-     */
-    public IStorage getStorage()
-    {
-        return fJarEntryFile;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/jsfcore/LoadBundleAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/jsfcore/LoadBundleAction.java
deleted file mode 100644
index 2599167..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/jsfcore/LoadBundleAction.java
+++ /dev/null
@@ -1,167 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.elementedit.jsfcore;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IStorage;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jst.jsf.core.internal.tld.LoadBundleUtil;
-import org.eclipse.jst.pagedesigner.jsf.ui.JSFUIPlugin;
-import org.eclipse.ui.IEditorDescriptor;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorRegistry;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.ide.IDE;
-
-
-/**
- * @author mengbo
- */
-public class LoadBundleAction extends Action
-{
-    private String   _baseName;
-    private IProject _project;
-
-    /**
-     * Create a new action
-     */
-    public LoadBundleAction()
-    {
-        setText(JSFUIPlugin.getResourceString("ElementEdit.Submenu.LoadBundle"));//$NON-NLS-1$
-    }
-
-    /**
-     * @param attribute
-     */
-    public void setBaseName(String attribute)
-    {
-        _baseName = attribute;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.IAction#run()
-     */
-    public void run()
-    {
-        if (_project == null || _baseName == null)
-        {
-            return;
-        }
-
-        IStorage storage = null;
-        try
-        {
-            storage = LoadBundleUtil.getLoadBundleResource(_project, _baseName);
-        }
-        catch (CoreException e)
-        {
-            JSFUIPlugin.getAlerts().warning("Message.Warning.Title", e.getLocalizedMessage());//$NON-NLS-1$
-            return;
-        }
-
-        if (storage instanceof IFile)
-        {
-            try
-            {
-                IDE.openEditor(getPage(), (IFile) storage, true);
-            }
-            catch (PartInitException e1)
-            {
-                JSFUIPlugin.getAlerts().warning("Message.Warning.Title", e1.getLocalizedMessage());//$NON-NLS-1$     
-            }
-        }
-        else if (storage != null)
-        {
-            IEditorInput input = new JarEntryEditorInput(storage);
-            try
-            {
-                getPage().openEditor(input, "org.eclipse.ui.DefaultTextEditor");//$NON-NLS-1$
-            }
-            catch (PartInitException e1)
-            {
-                JSFUIPlugin.getAlerts().warning("Message.Warning.Title", e1.getLocalizedMessage());//$NON-NLS-1$
-            }
-        }
-        else {
-        	//create new file???  Will be covered by https://bugs.eclipse.org/bugs/show_bug.cgi?id=225232 
-        	
-        }
-    }
-
-
-    private IWorkbenchPage getPage()
-    {
-        IWorkbench workbench = PlatformUI.getWorkbench();
-        IWorkbenchWindow window = workbench.getActiveWorkbenchWindow();
-        return window.getActivePage();
-    }
-
-    /**
-     * @param projectFor
-     */
-    public void setProject(IProject projectFor)
-    {
-        this._project = projectFor;
-    }
-
-    /**
-     * @param inputName
-     * @return the editor id of theditor to open for the inputName or null
-     * if none can be ascertained
-     */
-    public String getEditorID(String inputName)
-    {
-        IEditorRegistry registry = PlatformUI.getWorkbench().getEditorRegistry();
-
-        // check for a default editor
-        IEditorDescriptor editorDescriptor = registry.getDefaultEditor(inputName);
-
-        // next check the OS for in-place editor (OLE on Win32)
-        if (editorDescriptor == null && registry.isSystemInPlaceEditorAvailable(inputName))
-        {
-            editorDescriptor = registry.findEditor(IEditorRegistry.SYSTEM_INPLACE_EDITOR_ID);
-        }
-
-        // next check with the OS for an external editor
-        if (editorDescriptor == null && registry.isSystemExternalEditorAvailable(inputName))
-        {
-            editorDescriptor = registry.findEditor(IEditorRegistry.SYSTEM_EXTERNAL_EDITOR_ID);
-        }
-
-        // next lookup the default text editor
-        if (editorDescriptor == null)
-        {
-            editorDescriptor = registry.findEditor("org.eclipse.ui.DefaultTextEditor"); //$NON-NLS-1$
-        }
-
-        // if no valid editor found, bail out
-        if (editorDescriptor == null)
-        {
-            return null;
-        }
-
-        return editorDescriptor.getId();
-    }
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.IAction#isEnabled()
-     */
-    public boolean isEnabled()
-    {
-        return _project != null && _baseName != null && !"".equals(_baseName);//$NON-NLS-1$
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/jsfcore/LoadBundleElementEdit.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/jsfcore/LoadBundleElementEdit.java
deleted file mode 100644
index 4f3dfe6..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/jsfcore/LoadBundleElementEdit.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.elementedit.jsfcore;
-
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.editors.PageDesignerActionConstants;
-import org.eclipse.jst.pagedesigner.elementedit.AbstractElementEdit;
-import org.eclipse.jst.pagedesigner.utils.StructuredModelUtil;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class LoadBundleElementEdit extends AbstractElementEdit
-{
-    private LoadBundleAction loadBundleAction;
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.elementedit.IElementEdit#fillContextMenu(org.eclipse.jface.action.IMenuManager, org.w3c.dom.Element)
-     */
-    public void fillContextMenu(IMenuManager contextMenu, Element ele)
-    {
-        super.fillContextMenu(contextMenu,ele);
-
-        LoadBundleAction action = getAction();
-        action.setBaseName(ele.getAttribute(ICSSPropertyID.ATTR_BASENAME));
-        if (ele instanceof IDOMElement)
-        {
-            action.setProject(StructuredModelUtil.getProjectFor(((IDOMElement) ele).getModel()));
-        }
-        contextMenu.appendToGroup(PageDesignerActionConstants.GROUP_SPECIAL, action);
-    }
-
-    private LoadBundleAction getAction()
-    {
-        if (loadBundleAction == null)
-        {
-            loadBundleAction = new LoadBundleAction();
-        }
-        return loadBundleAction;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/jsfhtml/ColumnElementEdit.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/jsfhtml/ColumnElementEdit.java
deleted file mode 100644
index 78affcf..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/jsfhtml/ColumnElementEdit.java
+++ /dev/null
@@ -1,156 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.elementedit.jsfhtml;
-
-import java.util.Iterator;
-
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPartViewer;
-import org.eclipse.gef.EditPolicy;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.editpolicies.ColumnHelper;
-import org.eclipse.jst.pagedesigner.editpolicies.ColumnResizableEditPolicy;
-import org.eclipse.jst.pagedesigner.parts.ElementEditPart;
-import org.eclipse.jst.pagedesigner.parts.NodeEditPart;
-import org.eclipse.jst.pagedesigner.validation.caret.IPositionMediator;
-import org.eclipse.jst.pagedesigner.validation.caret.Target;
-import org.eclipse.jst.pagedesigner.viewer.CaretPositionResolver;
-import org.eclipse.jst.pagedesigner.viewer.DefaultDropLocationStrategy;
-import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
-import org.eclipse.jst.pagedesigner.viewer.IDropLocationStrategy;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ColumnElementEdit extends DefaultJSFHTMLElementEdit
-{
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.elementedit.AbstractElementEdit#handleModelChange(org.w3c.dom.Element, org.eclipse.jst.pagedesigner.parts.ElementEditPart)
-     */
-    public boolean handleModelChange(Element ele, ElementEditPart part, boolean recursive)
-    {
-        EditPart parent = part.getParent();
-        if (parent instanceof ElementEditPart)
-        {
-            ((ElementEditPart) parent).refreshModelChange(recursive);
-            return true;
-        }
-        return false;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.elementedit.IElementEdit#createEditPolicies(org.eclipse.jst.pagedesigner.parts.ElementEditPart)
-     */
-    public void createEditPolicies(ElementEditPart part)
-    {
-        part.installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE, new ColumnResizableEditPolicy());
-    }
-    
-    public IDropLocationStrategy getDropRequestorLocationStrategy(TagIdentifier tag, EditPartViewer viewer) {
-        return new MyDropLocationStrategy(viewer);
-    }
-
-    private static class MyDropLocationStrategy extends DefaultDropLocationStrategy
-    {
-        /**
-         * @param viewer
-         */
-        public MyDropLocationStrategy(EditPartViewer viewer) {
-            super(viewer);
-        }
-
-        public DesignPosition calculateDesignPosition(EditPart target,
-                Point p, IPositionMediator validator) 
-        {
-            // get the nearest ancestor part to target that is 
-            // editable or target if it is editable
-            target = validator.getEditableContainer(new Target(target));
-
-            // target must be an element part
-            if (target instanceof ElementEditPart)
-            {
-                // can only try to drop a column into a table.  If we are
-                // targetting a column, then we can see if its table will take it
-                TagIdentifier tagId = ((ElementEditPart)target).getTagIdentifier();
-                
-                if (IJSFConstants.TAG_IDENTIFIER_DATA_TABLE.isSameTagType(tagId))
-                {
-                    // if we're on the table, try to figure out which column we are above
-                    for (Iterator it = target.getChildren().iterator(); it.hasNext();)
-                    {
-                        final NodeEditPart nodeEditPart = (NodeEditPart) it.next();
-                        TagIdentifier tagId2 = nodeEditPart.getTagIdentifier();
-                        
-                        if (IJSFConstants.TAG_IDENTIFIER_COLUMN.isSameTagType(tagId2))
-                        {
-                            final Rectangle columnBounds = 
-                                ColumnHelper.getAdjustedColumnBoundingRectangle(nodeEditPart);
-                            if (columnBounds.contains(p))
-                            {
-                                target = nodeEditPart;
-                                break;
-                            }
-                        }
-                    }
-                }
-
-                // recalculate the id because it may have changed
-                tagId = ((ElementEditPart)target).getTagIdentifier();
-                
-                if (IJSFConstants.TAG_IDENTIFIER_COLUMN.isSameTagType(tagId))
-                {
-                    DesignPosition position = null;
-                    final Rectangle columnBounds = 
-                        ColumnHelper.getAdjustedColumnBoundingRectangle((GraphicalEditPart) target);
-                    if (CaretPositionResolver.toXMiddle(columnBounds, p) < 0)
-                    {
-                        position = DesignPosition.createPositionBeforePart(target);
-                    }
-                    else
-                    {
-                        position = DesignPosition.createPositionAfterPart(target);
-                    }
-                    
-                     
-                    if (validator.isValidPosition(position))
-                    {
-                        return position;
-                    }
-                }
-            }
-            
-            // otherwise, no valid position
-            return null;
-        }
-
-        protected Rectangle createCaretBounds(DesignPosition position) {
-            Rectangle bounds = super.createCaretBounds(position);
-            
-            // we want to extend the insert caret to be the height of the column container (i.e. dataTable)
-            // and positioned so it starts at the top of the container in the column where the insertion will occur
-            GraphicalEditPart parent = 
-                (GraphicalEditPart) position.getContainerPart();
-            Rectangle containerBounds = parent.getFigure().getBounds().getCopy();
-            parent.getFigure().translateToAbsolute(containerBounds);
-            bounds.height = containerBounds.height;
-            bounds.y = containerBounds.y;
-            return bounds;
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/jsfhtml/DataTableElementEdit.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/jsfhtml/DataTableElementEdit.java
deleted file mode 100644
index 5025fb4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/jsfhtml/DataTableElementEdit.java
+++ /dev/null
@@ -1,487 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.elementedit.jsfhtml;
-
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.DragTracker;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPolicy;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.requests.DropRequest;
-import org.eclipse.gef.requests.LocationRequest;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IMenuListener;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.actions.single.SelectEditPartAction;
-import org.eclipse.jst.pagedesigner.editors.PageDesignerActionConstants;
-import org.eclipse.jst.pagedesigner.editpolicies.DragMoveEditPolicy;
-import org.eclipse.jst.pagedesigner.editpolicies.ElementResizableEditPolicy;
-import org.eclipse.jst.pagedesigner.jsf.core.dom.JSFDOMUtil;
-import org.eclipse.jst.pagedesigner.jsf.ui.JSFUIPlugin;
-import org.eclipse.jst.pagedesigner.jsf.ui.actions.DeleteHColumnHeaderFooterAction;
-import org.eclipse.jst.pagedesigner.jsf.ui.actions.DeleteHeaderFooterAction;
-import org.eclipse.jst.pagedesigner.jsf.ui.actions.InsertHColumnHeaderFooterAction;
-import org.eclipse.jst.pagedesigner.jsf.ui.actions.InsertHeaderFooterAction;
-import org.eclipse.jst.pagedesigner.jsf.ui.commands.jsfhtml.DataTableDeleteColumnCommand;
-import org.eclipse.jst.pagedesigner.jsf.ui.commands.jsfhtml.DataTableDeleteColumnHeaderCommand;
-import org.eclipse.jst.pagedesigner.jsf.ui.commands.jsfhtml.DataTableDeleteHeaderCommand;
-import org.eclipse.jst.pagedesigner.jsf.ui.commands.jsfhtml.DataTableInsertColumnCommand;
-import org.eclipse.jst.pagedesigner.jsf.ui.commands.jsfhtml.DataTableInsertColumnHeaderCommand;
-import org.eclipse.jst.pagedesigner.jsf.ui.commands.jsfhtml.DataTableInsertHeaderCommand;
-import org.eclipse.jst.pagedesigner.jsf.ui.elementedit.request.DeleteHColumnHeaderFooterRequest;
-import org.eclipse.jst.pagedesigner.jsf.ui.elementedit.request.DeleteHeaderFooterRequest;
-import org.eclipse.jst.pagedesigner.jsf.ui.elementedit.request.InsertHColumnHeaderFooterRequest;
-import org.eclipse.jst.pagedesigner.jsf.ui.elementedit.request.InsertHeaderFooterRequest;
-import org.eclipse.jst.pagedesigner.jsf.ui.elementedit.util.DataTableUtil;
-import org.eclipse.jst.pagedesigner.parts.ElementEditPart;
-import org.eclipse.jst.pagedesigner.parts.NodeEditPart;
-import org.eclipse.jst.pagedesigner.tableedit.DeleteRowColumnAction;
-import org.eclipse.jst.pagedesigner.tableedit.InsertRowColumnAction;
-import org.eclipse.jst.pagedesigner.tableedit.TableInsertRequest;
-import org.eclipse.jst.pagedesigner.tableedit.TableResizeRequest;
-import org.eclipse.jst.pagedesigner.tableedit.TableRowColumnDeleteRequest;
-import org.eclipse.jst.pagedesigner.tools.ObjectModeDragTracker;
-import org.eclipse.jst.pagedesigner.validation.caret.ActionData;
-import org.eclipse.jst.pagedesigner.validation.caret.DefaultPositionRule;
-import org.eclipse.jst.pagedesigner.validation.caret.DnDPositionValidator;
-import org.eclipse.jst.pagedesigner.validation.caret.DropActionData;
-import org.eclipse.jst.pagedesigner.validation.caret.IPositionMediator;
-import org.eclipse.jst.pagedesigner.validation.caret.Target;
-import org.eclipse.jst.pagedesigner.validation.caret.DropActionData.DropData;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.eclipse.swt.graphics.Cursor;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class DataTableElementEdit extends DefaultJSFHTMLElementEdit
-{
-    private final static Action     EMPTY_ACTION     = new Action()
-    {
-        // TODO: why?
-    };
-    private final static int FAKE_INDEX = -10;
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.elementedit.IElementEdit#fillContextMenu(org.eclipse.jface.action.IMenuManager, org.w3c.dom.Element)
-     */
-    public void fillContextMenu(IMenuManager contextMenu, Element ele)
-    {
-        super.fillContextMenu(contextMenu, ele);
-
-        final IMenuManager tableMenu = new MenuManager(JSFUIPlugin.getResourceString("ElementEdit.Submenu.DataTable"));//$NON-NLS-1$
-        final ElementEditPart editPart = (ElementEditPart) ((IDOMElement) ele).getAdapterFor(EditPart.class);
-        // ok, we passed the checking, now let's create the actions.
-        tableMenu.add(EMPTY_ACTION);
-        tableMenu.addMenuListener(new IMenuListener()
-        {
-            public void menuAboutToShow(IMenuManager manager)
-            {
-                tableMenu.removeAll();
-                fillTableMenu(editPart, FAKE_INDEX, tableMenu);
-            }
-        });
-
-        contextMenu.appendToGroup(PageDesignerActionConstants.GROUP_CONTAINER, tableMenu);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.elementedit.IElementEdit#fillContainerContextMenu(org.eclipse.jface.action.IMenuManager, org.eclipse.jst.pagedesigner.parts.ElementEditPart, org.eclipse.jst.pagedesigner.parts.NodeEditPart, org.eclipse.jface.viewers.ISelection)
-     */
-    public boolean fillContainerContextMenu(IMenuManager contextMenu, final ElementEditPart elePart,
-            NodeEditPart nodePart, ISelection innerSelection)
-    {
-        Element table = (Element) elePart.getModel();
-        Node node = (Node) nodePart.getModel();
-
-        DataTableUtil util = new DataTableUtil(table);
-        Element columnParent = util.findHColumnParent(node);
-
-        final int cellColumn = util.getColumnIndex(columnParent);
-
-        final IMenuManager tableMenu = new MenuManager(JSFUIPlugin.getResourceString("ElementEdit.Submenu.DataTable"));//$NON-NLS-1$
-
-        // ok, we passed the checking, now let's create the actions.
-        tableMenu.add(EMPTY_ACTION);
-        tableMenu.addMenuListener(new IMenuListener()
-        {
-            public void menuAboutToShow(IMenuManager manager)
-            {
-                tableMenu.removeAll();
-                fillTableMenu(elePart, cellColumn, tableMenu);
-            }
-        });
-
-        contextMenu.appendToGroup(PageDesignerActionConstants.GROUP_CONTAINER, tableMenu);
-        return true;
-
-    }
-
-    /**
-     * @param elePart
-     * @param cellColumn
-     * @param tableMenu
-     */
-    private void fillTableMenu(ElementEditPart elePart, int cellColumn, IMenuManager tableMenu)
-    {
-        SelectEditPartAction action = SelectEditPartAction.create(JSFUIPlugin
-                .getResourceString("ElementEdit.Submenu.DataTable.SelectTable"), elePart);//$NON-NLS-1$
-        tableMenu.add(action);
-
-        tableMenu.add(new Separator());
-
-        {
-            InsertRowColumnAction insertColumnBeforeAction = new InsertRowColumnAction(JSFUIPlugin
-                    .getResourceString("ElementEdit.Submenu.DataTable.InsertColumnBefore"), //$NON-NLS-1$
-                    elePart, cellColumn, false, true);
-            tableMenu.add(insertColumnBeforeAction);
-
-            InsertRowColumnAction insertColumnAfterAction = new InsertRowColumnAction(JSFUIPlugin
-                    .getResourceString("ElementEdit.Submenu.DataTable.InsertColumnAfter"),//$NON-NLS-1$ 
-                    elePart, cellColumn, false, false);
-            tableMenu.add(insertColumnAfterAction);
-
-            tableMenu.add(new Separator());
-        }
-
-        {
-            DeleteRowColumnAction deleteColumnAction = new DeleteRowColumnAction(JSFUIPlugin
-                    .getResourceString("ElementEdit.Submenu.DataTable.DeleteColumn"), //$NON-NLS-1$
-                    elePart, cellColumn, false);
-            tableMenu.add(deleteColumnAction);
-            tableMenu.add(new Separator());
-        }
-
-        {
-            InsertHeaderFooterAction headerAction = new InsertHeaderFooterAction(JSFUIPlugin
-                    .getResourceString("ElementEdit.Submenu.InsertTableHeader"), elePart, true);//$NON-NLS-1$
-            tableMenu.add(headerAction);
-
-            InsertHeaderFooterAction footerAction = new InsertHeaderFooterAction(JSFUIPlugin
-                    .getResourceString("ElementEdit.Submenu.InsertTableFooter"), elePart, false);//$NON-NLS-1$
-            tableMenu.add(footerAction);
-
-            DeleteHeaderFooterAction delHeaderAction = new DeleteHeaderFooterAction(JSFUIPlugin
-                    .getResourceString("ElementEdit.Submenu.DeleteTableHeader"), elePart, true);//$NON-NLS-1$
-            tableMenu.add(delHeaderAction);
-
-            DeleteHeaderFooterAction delFooterAction = new DeleteHeaderFooterAction(JSFUIPlugin
-                    .getResourceString("ElementEdit.Submenu.DeleteTableFooter"), elePart, false);//$NON-NLS-1$
-            tableMenu.add(delFooterAction);
-            tableMenu.add(new Separator());
-        }
-
-        {
-            InsertHColumnHeaderFooterAction hColHeaderAction = new InsertHColumnHeaderFooterAction(JSFUIPlugin
-                    .getResourceString("ElementEdit.Submenu.InsertColumnHeader"),//$NON-NLS-1$
-                    elePart, true);
-            tableMenu.add(hColHeaderAction);
-
-            InsertHColumnHeaderFooterAction hColFooterAction = new InsertHColumnHeaderFooterAction(JSFUIPlugin
-                    .getResourceString("ElementEdit.Submenu.InsertColumnFooter"),//$NON-NLS-1$
-                    elePart, false);
-            tableMenu.add(hColFooterAction);
-
-            DeleteHColumnHeaderFooterAction delColHeader = new DeleteHColumnHeaderFooterAction(JSFUIPlugin
-                    .getResourceString("ElementEdit.Submenu.DeleteColumnHeader"),//$NON-NLS-1$
-                    elePart, true);
-            tableMenu.add(delColHeader);
-
-            DeleteHColumnHeaderFooterAction delColFooter = new DeleteHColumnHeaderFooterAction(JSFUIPlugin
-                    .getResourceString("ElementEdit.Submenu.DeleteColumnFooter"),//$NON-NLS-1$
-                    elePart, false);
-            tableMenu.add(delColFooter);
-        }
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.elementedit.IElementEdit#createEditPolicies(org.eclipse.jst.pagedesigner.parts.ElementEditPart)
-     */
-    public void createEditPolicies(ElementEditPart part)
-    {
-        part.installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE, new DataTableResizePolicy(part));
-        part.installEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE,
-                new MyDragMoveEditPolicy());
-    }
-
-    static class DataTableResizePolicy extends ElementResizableEditPolicy
-    {
-        private static final String COLUMN_SELECT_IMAGE_FILE = "column_select.gif"; //$NON-NLS-1$
-        
-		ElementEditPart _part;
-        Cursor          _columnSelectCursor;
-
-        /**
-         * @param part
-         */
-        public DataTableResizePolicy(ElementEditPart part)
-        {
-            _part = part;
-        }
-
-        public void deactivate() {
-            super.deactivate();
-            if (_columnSelectCursor != null && !_columnSelectCursor.isDisposed())
-            {
-                _columnSelectCursor.dispose();
-                _columnSelectCursor = null;
-            }
-        }
-
-        private Cursor getColumnSelectCursor()
-        {
-            if (_columnSelectCursor == null)
-            {
-                final Image cursorImage = JSFUIPlugin.getDefault().getImage(COLUMN_SELECT_IMAGE_FILE);
-                _columnSelectCursor = new Cursor(null, cursorImage.getImageData(), 2, 5);
-            }
-            
-            return _columnSelectCursor;
-        }
-        /* (non-Javadoc)
-         * @see org.eclipse.gef.editpolicies.ResizableEditPolicy#getCommand(org.eclipse.gef.Request)
-         */
-        public Command getCommand(Request request)
-        {
-            IHTMLGraphicalViewer viewer = (IHTMLGraphicalViewer) _part.getViewer();
-            Element dataTable = (Element) _part.getIDOMNode();
-            if (request instanceof TableResizeRequest)
-            {
-                return super.getCommand(request);
-            }
-            else if (request instanceof TableInsertRequest)
-            {
-                TableInsertRequest tableInsertRequest = (TableInsertRequest) request;
-                if (tableInsertRequest.isRow())
-                {
-                    // don't support insert row.
-                    return null;
-                }
-                int index = tableInsertRequest.getIndex() + (tableInsertRequest.isBefore() ? 0 : 1);
-                return new DataTableInsertColumnCommand(viewer, dataTable, index);
-            }
-            else if (request instanceof InsertHeaderFooterRequest)
-            {
-                InsertHeaderFooterRequest req = (InsertHeaderFooterRequest) request;
-                boolean isHeader = req.isHeader();
-                return new DataTableInsertHeaderCommand(viewer, dataTable, isHeader);
-            }
-            else if (request instanceof DeleteHeaderFooterRequest)
-            {
-                DeleteHeaderFooterRequest req = (DeleteHeaderFooterRequest) request;
-                boolean isHeader = req.isHeader();
-                return new DataTableDeleteHeaderCommand(viewer, dataTable, isHeader);
-            }
-            else if (request instanceof InsertHColumnHeaderFooterRequest)
-            {
-                InsertHColumnHeaderFooterRequest req = (InsertHColumnHeaderFooterRequest) request;
-                boolean isHeader = req.isHeader();
-                return new DataTableInsertColumnHeaderCommand(viewer, dataTable, isHeader);
-            }
-            else if (request instanceof DeleteHColumnHeaderFooterRequest)
-            {
-                DeleteHColumnHeaderFooterRequest req = (DeleteHColumnHeaderFooterRequest) request;
-                boolean isHeader = req.isHeader();
-                return new DataTableDeleteColumnHeaderCommand(viewer, dataTable, isHeader);
-            }
-            else if (request instanceof TableRowColumnDeleteRequest)
-            {
-                TableRowColumnDeleteRequest deleteReq = (TableRowColumnDeleteRequest) request;
-                if (deleteReq.isRow())
-                {
-                    return null;
-                }
-                return new DataTableDeleteColumnCommand(viewer, dataTable, deleteReq.getIndex());
-            }
-            return super.getCommand(request);
-        }
-
-        public Cursor getSelectionToolCursor(Point mouseLocation) 
-        {
-            if (hitTestColumnSelection(mouseLocation))
-            {
-                return getColumnSelectCursor();
-            }
-            
-            return null;
-        }
-
-        protected DragTracker getSelectionTracker(LocationRequest request) {
-            final Point mouseLocator = request.getLocation();
-            if (hitTestColumnSelection(mouseLocator))
-            {
-                ObjectModeDragTracker dragTracker =  new ObjectModeDragTracker(getHost())
-                {
-                    protected boolean handleButtonDown(int button)
-                    {
-                        // only customize the case where we are in a column selection mode
-                        if (button == 1)
-                        {
-                            EditPart retarget = 
-                                getRetargetSelectionEditPart(mouseLocator);
-                            
-                            if (retarget != null)
-                            {
-                                setSourceEditPart(retarget);
-                            }
-                        }
-                        
-                        // default
-                        return super.handleButtonDown(button);
-                    }
-                };
-                
-                dragTracker.setDefaultCursor(getSelectionToolCursor(mouseLocator));
-                return dragTracker;
-            }
-            return new ObjectModeDragTracker(getHost());
-        }
-
-        public DragTracker getSelectionDragTracker(LocationRequest request) {
-            return getSelectionTracker(request);
-        }
-
-        /**
-         * @param mouseLocation
-         * @return the edit part fo the given mouse location
-         */
-        public EditPart getRetargetSelectionEditPart(Point mouseLocation) {
-            if (hitTestColumnSelection(mouseLocation))
-            {
-                GraphicalEditPart editPart = (GraphicalEditPart) getHost();
-                List children = editPart.getChildren();
-                
-                for (Iterator it = children.iterator(); it.hasNext();)
-                {
-                    GraphicalEditPart child = (GraphicalEditPart) it.next();
-
-                    if (child instanceof NodeEditPart)
-                    {
-                        Node childNode = ((NodeEditPart)child).getDOMNode();
-
-                        if (JSFDOMUtil.isHColumn(childNode))
-                        {
-                            Point relativeMousePointer = mouseLocation.getCopy();
-                            IFigure hostFigure = child.getFigure();
-                            hostFigure.translateToRelative(relativeMousePointer);
-                            Rectangle hostBounds = hostFigure.getBounds();
-                            if (relativeMousePointer.x >= hostBounds.x
-                                    && relativeMousePointer.x < hostBounds.x+hostBounds.width)
-                            {
-                                return child;
-                            }
-                        }
-                    }
-                }
-            }
-            
-            // otherwise, don't retarget
-            return null;
-        }
-
-        private boolean hitTestColumnSelection(Point mouseLocation)
-        {
-            final GraphicalEditPart part = (GraphicalEditPart) getHost();
-            final IFigure panelFigure = part.getFigure();
-            
-            Point  relativeLocation = mouseLocation.getCopy();
-            panelFigure.translateToRelative(relativeLocation);
-
-            final int yoffsetAbs = Math.abs(panelFigure.getBounds().y - relativeLocation.y);
-            
-            if (yoffsetAbs <= 4)
-            {
-                return true;
-            }
-            
-            return false;
-        }
-    }
-    
-    /**
-     * @author cbateman
-     *
-     */
-    public static class MyDragMoveEditPolicy extends DragMoveEditPolicy 
-    {
-        protected IPositionMediator createDropChildValidator(
-                DropRequest r) 
-        {
-            DropData dropData = createDropData(r);
-            
-            if (dropData!=null)
-            {
-                DnDPositionValidator validator = 
-                    new DnDPositionValidator(new DropActionData(
-                            ActionData.COMPONENT_MOVE, dropData));
-                validator.addRule(new OnlyColumnsAndFacetsRule(validator.getActionData()));
-                return validator;
-            }
-            return null;
-        }
-        
-        private static class OnlyColumnsAndFacetsRule extends DefaultPositionRule
-        {
-            /**
-             * @param actionData
-             */
-            public OnlyColumnsAndFacetsRule(ActionData actionData) {
-                super(actionData);
-            }
-
-            public boolean isEditable(Target target) {
-                if (IJSFConstants.TAG_IDENTIFIER_DATA_TABLE.isSameTagType(target.getTagWrapper()))
-                {
-                    return isDataDroppable();
-                }
-                
-                return true;
-            }
-            
-            private boolean isDataDroppable()
-            {
-                ActionData actionData = getActionData();
-                if (actionData instanceof DropActionData)
-                {
-                    DropActionData dropActionData = (DropActionData) actionData;
-                    TagIdentifier tagId = 
-                        (TagIdentifier) dropActionData.getDropData().getTagIdentifiers().get(0);
-                            
-                    if (IJSFConstants.TAG_IDENTIFIER_FACET.isSameTagType(tagId)
-                            || IJSFConstants.TAG_IDENTIFIER_COLUMN.isSameTagType(tagId))
-                    {
-                        return true;
-                    }
-                }
-                
-                return false;
-            }
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/jsfhtml/DefaultJSFHTMLElementEdit.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/jsfhtml/DefaultJSFHTMLElementEdit.java
deleted file mode 100644
index acfc346..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/jsfhtml/DefaultJSFHTMLElementEdit.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.elementedit.jsfhtml;
-
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jst.pagedesigner.elementedit.AbstractElementEdit;
-import org.eclipse.jst.pagedesigner.jsf.ui.actions.IJSFCoreSupport;
-import org.eclipse.jst.pagedesigner.jsf.ui.actions.JSFAddActionGroup;
-import org.eclipse.jst.pagedesigner.jsf.ui.actions.JSFNavigationGroup;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.w3c.dom.Element;
-
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class DefaultJSFHTMLElementEdit extends AbstractElementEdit
-{
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.elementedit.AbstractElementEdit#fillContextMenu(org.eclipse.jface.action.IMenuManager, org.w3c.dom.Element)
-     */
-    public void fillContextMenu(IMenuManager contextMenu, Element ele)
-    {
-        super.fillContextMenu(contextMenu, ele);
-
-        // next are JSF HTML special support.
-        new JSFAddActionGroup().fillContextMenu(contextMenu, (IDOMElement) ele, new JSFCoreSupport(ele.getLocalName()));
-        new JSFNavigationGroup().fillContextMenu(contextMenu, (IDOMElement) ele, new JSFCoreSupport(ele.getLocalName()));
-    }
-
-    static class JSFCoreSupport implements IJSFCoreSupport
-    {
-        String _localName;
-
-        /**
-         * @param localtag
-         */
-        public JSFCoreSupport(String localtag)
-        {
-            _localName = localtag;
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jst.pagedesigner.jsf.actions.IJSFCoreSupport#isActionSource()
-         */
-        public boolean isActionSource()
-        {
-            // UICommand.
-            return _localName.startsWith("command"); //$NON-NLS-1$
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jst.pagedesigner.jsf.actions.IJSFCoreSupport#isUIComponent()
-         */
-        public boolean isUIComponent()
-        {
-            return true;
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jst.pagedesigner.jsf.actions.IJSFCoreSupport#isValueHolder()
-         */
-        public boolean isValueHolder()
-        {
-            // UIOutput
-            return _localName.startsWith("output") || _localName.startsWith("input") //$NON-NLS-1$ //$NON-NLS-2$
-                || _localName.startsWith("select"); //$NON-NLS-1$
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jst.pagedesigner.jsf.actions.IJSFCoreSupport#isEditableValueHolder()
-         */
-        public boolean isEditableValueHolder()
-        {
-            // UIInput
-            return _localName.startsWith("input") || _localName.startsWith("select"); //$NON-NLS-1$ //$NON-NLS-2$
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jst.pagedesigner.jsf.actions.IJSFCoreSupport#supportSelectItems()
-         */
-        public boolean supportSelectItems()
-        {
-            return _localName.startsWith("select"); //$NON-NLS-1$
-        }
-
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/jsfhtml/JSFHTMLElementEditFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/jsfhtml/JSFHTMLElementEditFactory.java
deleted file mode 100644
index ebae8db..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/jsfhtml/JSFHTMLElementEditFactory.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.elementedit.jsfhtml;
-
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.elementedit.IElementEdit;
-import org.eclipse.jst.pagedesigner.elementedit.IElementEditFactory;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class JSFHTMLElementEditFactory implements IElementEditFactory
-{
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.elementedit.IElementEditFactory#createElementEdit(org.w3c.dom.Element)
-     */
-    public IElementEdit createElementEdit(final TagIdentifier tagIdentifier)
-    {
-        if (IJSFConstants.TAG_IDENTIFIER_DATA_TABLE.isSameTagType(tagIdentifier))
-        {
-            return new DataTableElementEdit();
-        }
-        else if (IJSFConstants.TAG_IDENTIFIER_PANEL_GRID.isSameTagType(tagIdentifier))
-        {
-            return new PanelGridElementEdit();
-        }
-        else if (IJSFConstants.TAG_IDENTIFIER_COLUMN.isSameTagType(tagIdentifier))
-        {
-            return new ColumnElementEdit();
-        }
-        return new DefaultJSFHTMLElementEdit();
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.elementedit.IElementEditFactory#getSupportedURI()
-     */
-    public String getSupportedURI()
-    {
-        return ITLDConstants.URI_JSF_HTML;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/jsfhtml/PanelGridElementEdit.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/jsfhtml/PanelGridElementEdit.java
deleted file mode 100644
index 6719607..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/jsfhtml/PanelGridElementEdit.java
+++ /dev/null
@@ -1,322 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.elementedit.jsfhtml;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPolicy;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.SharedCursors;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IMenuListener;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.actions.single.SelectEditPartAction;
-import org.eclipse.jst.pagedesigner.editors.PageDesignerActionConstants;
-import org.eclipse.jst.pagedesigner.editpolicies.ElementResizableEditPolicy;
-import org.eclipse.jst.pagedesigner.jsf.ui.JSFUIPlugin;
-import org.eclipse.jst.pagedesigner.jsf.ui.actions.DeleteHeaderFooterAction;
-import org.eclipse.jst.pagedesigner.jsf.ui.actions.InsertHeaderFooterAction;
-import org.eclipse.jst.pagedesigner.jsf.ui.commands.jsfhtml.DataTableDeleteHeaderCommand;
-import org.eclipse.jst.pagedesigner.jsf.ui.commands.jsfhtml.PanelGridDeleteColumnCommand;
-import org.eclipse.jst.pagedesigner.jsf.ui.commands.jsfhtml.PanelGridDeleteRowCommand;
-import org.eclipse.jst.pagedesigner.jsf.ui.commands.jsfhtml.PanelGridInsertColumnCommand;
-import org.eclipse.jst.pagedesigner.jsf.ui.commands.jsfhtml.PanelGridInsertFooterCommand;
-import org.eclipse.jst.pagedesigner.jsf.ui.commands.jsfhtml.PanelGridInsertHeaderCommand;
-import org.eclipse.jst.pagedesigner.jsf.ui.commands.jsfhtml.PanelGridInsertRowCommand;
-import org.eclipse.jst.pagedesigner.jsf.ui.elementedit.request.DeleteHeaderFooterRequest;
-import org.eclipse.jst.pagedesigner.jsf.ui.elementedit.request.InsertHeaderFooterRequest;
-import org.eclipse.jst.pagedesigner.jsf.ui.elementedit.util.PanelGridUtil;
-import org.eclipse.jst.pagedesigner.parts.ElementEditPart;
-import org.eclipse.jst.pagedesigner.parts.NodeEditPart;
-import org.eclipse.jst.pagedesigner.tableedit.DeleteRowColumnAction;
-import org.eclipse.jst.pagedesigner.tableedit.InsertRowColumnAction;
-import org.eclipse.jst.pagedesigner.tableedit.TableInsertRequest;
-import org.eclipse.jst.pagedesigner.tableedit.TableResizeRequest;
-import org.eclipse.jst.pagedesigner.tableedit.TableRowColumnDeleteRequest;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.eclipse.swt.graphics.Cursor;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class PanelGridElementEdit extends DefaultJSFHTMLElementEdit
-{
-    private final static Action  EMPTY_ACTION = new Action()
-    {
-        // TODO: why?
-    };
-    private final static int FAKE_INDEX = -10;
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.elementedit.IElementEdit#fillContextMenu(org.eclipse.jface.action.IMenuManager, org.w3c.dom.Element)
-     */
-    public void fillContextMenu(IMenuManager contextMenu, Element ele)
-    {
-        super.fillContextMenu(contextMenu, ele);
-
-        final IMenuManager tableMenu = new MenuManager(JSFUIPlugin.getResourceString("ElementEdit.Submenu.PanelGrid"));//$NON-NLS-1$
-        tableMenu.add(EMPTY_ACTION);
-        final ElementEditPart gridEditPart = (ElementEditPart) ((IDOMElement) ele).getAdapterFor(EditPart.class);
-
-        // ok, we passed the checking, now let's create the actions.
-        tableMenu.addMenuListener(new IMenuListener()
-        {
-            public void menuAboutToShow(IMenuManager manager)
-            {
-                tableMenu.removeAll();
-                fillPanelGridMenu(gridEditPart, FAKE_INDEX, FAKE_INDEX, tableMenu);
-            }
-        });
-
-        contextMenu.appendToGroup(PageDesignerActionConstants.GROUP_CONTAINER, tableMenu);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.elementedit.IElementEdit#fillContainerContextMenu(org.eclipse.jface.action.IMenuManager, org.eclipse.jst.pagedesigner.parts.ElementEditPart, org.eclipse.jst.pagedesigner.parts.NodeEditPart, org.eclipse.jface.viewers.ISelection)
-     */
-    public boolean fillContainerContextMenu(IMenuManager contextMenu, final ElementEditPart elePart,
-            NodeEditPart nodePart, ISelection innerSelection)
-    {
-        Element table = (Element) elePart.getModel();
-        Node node = (Node) nodePart.getModel();
-
-        Element childEle = null;
-        if (node instanceof Element)
-        {
-            childEle = (Element) node;
-        }
-        else
-        {
-            boolean hasElementParent = false;
-            Node nodeBackup = node;
-            while (!IJSFConstants.TAG_PANELGRID.equalsIgnoreCase(nodeBackup.getParentNode().getLocalName()))
-            {
-                nodeBackup = nodeBackup.getParentNode();
-                if (nodeBackup instanceof Element)
-                {
-                    hasElementParent = true;
-                    break;
-                }
-            }
-            if (!hasElementParent)
-            {
-                return false;
-            }
-            childEle = (Element) nodeBackup;
-        }
-
-        PanelGridUtil util = new PanelGridUtil(table);
-        final int cellRow = util.convertRowIndexFromDomToView(util.getDomRowIndex(childEle));
-        final int cellColumn = util.getDomColumnIndex(childEle);
-
-        final IMenuManager tableMenu = new MenuManager(JSFUIPlugin.getResourceString("ElementEdit.Submenu.PanelGrid"));//$NON-NLS-1$
-        tableMenu.add(EMPTY_ACTION);
-
-        // ok, we passed the checking, now let's create the actions.
-        tableMenu.addMenuListener(new IMenuListener()
-        {
-            public void menuAboutToShow(IMenuManager manager)
-            {
-                tableMenu.removeAll();
-                fillPanelGridMenu(elePart, cellRow, cellColumn, tableMenu);
-            }
-        });
-
-        contextMenu.appendToGroup(PageDesignerActionConstants.GROUP_CONTAINER, tableMenu);
-        return true;
-
-    }
-
-    /**
-     * @param elePart
-     * @param cellRow
-     * @param cellColumn
-     * @param tableMenu
-     */
-    private void fillPanelGridMenu(ElementEditPart elePart, int cellRow, int cellColumn, IMenuManager tableMenu)
-    {
-        SelectEditPartAction action = SelectEditPartAction.create(JSFUIPlugin
-                .getResourceString("ElementEdit.Submenu.PanelGrid.SelectTable"), elePart);//$NON-NLS-1$
-        tableMenu.add(action);
-
-        tableMenu.add(new Separator());
-
-        {
-            InsertRowColumnAction insertRowBeforeAction = new InsertRowColumnAction(JSFUIPlugin
-                    .getResourceString("ElementEdit.Submenu.PanelGrid.InsertRowBefore"), //$NON-NLS-1$
-                    elePart, cellRow, true, true);
-            tableMenu.add(insertRowBeforeAction);
-
-            InsertRowColumnAction insertRowAfterAction = new InsertRowColumnAction(JSFUIPlugin
-                    .getResourceString("ElementEdit.Submenu.PanelGrid.InsertRowAfter"), //$NON-NLS-1$
-                    elePart, cellRow, true, false);
-            tableMenu.add(insertRowAfterAction);
-
-            tableMenu.add(new Separator());
-        }
-
-        {
-            InsertRowColumnAction insertColumnBeforeAction = new InsertRowColumnAction(JSFUIPlugin
-                    .getResourceString("ElementEdit.Submenu.PanelGrid.InsertColumnBefore"), //$NON-NLS-1$
-                    elePart, cellColumn, false, true);
-            tableMenu.add(insertColumnBeforeAction);
-
-            InsertRowColumnAction insertColumnAfterAction = new InsertRowColumnAction(JSFUIPlugin
-                    .getResourceString("ElementEdit.Submenu.PanelGrid.InsertColumnAfter"), //$NON-NLS-1$
-                    elePart, cellColumn, false, false);
-            tableMenu.add(insertColumnAfterAction);
-
-            tableMenu.add(new Separator());
-        }
-
-        {
-            DeleteRowColumnAction deleteRowAction = new DeleteRowColumnAction(JSFUIPlugin
-                    .getResourceString("ElementEdit.Submenu.PanelGrid.DeleteRow"), //$NON-NLS-1$
-                    elePart, cellRow, true);
-            tableMenu.add(deleteRowAction);
-
-            DeleteRowColumnAction deleteColumnAction = new DeleteRowColumnAction(JSFUIPlugin
-                    .getResourceString("ElementEdit.Submenu.PanelGrid.DeleteColumn"), //$NON-NLS-1$
-                    elePart, cellColumn, false);
-            tableMenu.add(deleteColumnAction);
-            tableMenu.add(new Separator());
-        }
-
-        {
-            InsertHeaderFooterAction headerAction = new InsertHeaderFooterAction(JSFUIPlugin
-                    .getResourceString("ElementEdit.Submenu.PanelGrid.InsertHeader"), //$NON-NLS-1$
-                    elePart, true);
-            tableMenu.add(headerAction);
-
-            InsertHeaderFooterAction footerAction = new InsertHeaderFooterAction(JSFUIPlugin
-                    .getResourceString("ElementEdit.Submenu.PanelGrid.InsertFooter"), //$NON-NLS-1$
-                    elePart, false);
-            tableMenu.add(footerAction);
-
-            DeleteHeaderFooterAction delHeaderAction = new DeleteHeaderFooterAction(JSFUIPlugin
-                    .getResourceString("ElementEdit.Submenu.PanelGird.DeleteHeader"), elePart, true);//$NON-NLS-1$
-            tableMenu.add(delHeaderAction);
-
-            DeleteHeaderFooterAction delFooterAction = new DeleteHeaderFooterAction(JSFUIPlugin
-                    .getResourceString("ElementEdit.Submenu.PanelGrid.DeleteFooter"), elePart, false);//$NON-NLS-1$
-            tableMenu.add(delFooterAction);
-        }
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.elementedit.IElementEdit#createEditPolicies(org.eclipse.jst.pagedesigner.parts.ElementEditPart)
-     */
-    public void createEditPolicies(ElementEditPart part)
-    {
-        part.installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE, new PanelGridResizePolicy(part));
-    }
-
-    static class PanelGridResizePolicy extends ElementResizableEditPolicy
-    {
-        ElementEditPart _part;
-
-        /**
-         * @param part
-         */
-        public PanelGridResizePolicy(ElementEditPart part)
-        {
-            _part = part;
-        }
-
-        public Cursor getSelectionToolCursor(Point mouseLocation) 
-        {
-            final GraphicalEditPart part = (GraphicalEditPart) getHost();
-            final IFigure panelFigure = part.getFigure();
-            
-            Point  relativeLocation = mouseLocation.getCopy();
-            panelFigure.translateToRelative(relativeLocation);
-            
-            // row cursor if we are within +/- 2 pixels of the left side
-            final int xoffsetAbs = Math.abs(panelFigure.getBounds().x - relativeLocation.x);
-
-            if (xoffsetAbs <= 2)
-            {
-                return SharedCursors.SIZEE;
-            }
-            
-            final int yoffsetAbs = Math.abs(panelFigure.getBounds().y - relativeLocation.y);
-            
-            if (yoffsetAbs <= 2)
-            {
-                return SharedCursors.SIZEW;
-            }
-            
-            return null;
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.gef.editpolicies.ResizableEditPolicy#getCommand(org.eclipse.gef.Request)
-         */
-        public Command getCommand(Request request)
-        {
-            IHTMLGraphicalViewer viewer = (IHTMLGraphicalViewer) _part.getViewer();
-            Element panelGrid = (Element) _part.getIDOMNode();
-            if (request instanceof TableResizeRequest)
-            {
-                return super.getCommand(request);
-            }
-            else if (request instanceof TableInsertRequest)
-            {
-                TableInsertRequest tableInsertRequest = (TableInsertRequest) request;
-                if (tableInsertRequest.isRow())
-                {
-                    int index = tableInsertRequest.getIndex() + (tableInsertRequest.isBefore() ? 0 : 1);
-                    return new PanelGridInsertRowCommand(viewer, panelGrid, index);
-                }
-                int index = tableInsertRequest.getIndex() + (tableInsertRequest.isBefore() ? 0 : 1);
-                return new PanelGridInsertColumnCommand(viewer, panelGrid, index);
-            }
-            else if (request instanceof InsertHeaderFooterRequest)
-            {
-                InsertHeaderFooterRequest req = (InsertHeaderFooterRequest) request;
-                boolean isHeader = req.isHeader();
-                if (isHeader)
-                {
-                    return new PanelGridInsertHeaderCommand(viewer, panelGrid);
-                }
-                return new PanelGridInsertFooterCommand(viewer, panelGrid);
-            }
-            else if (request instanceof DeleteHeaderFooterRequest)
-            {
-                DeleteHeaderFooterRequest req = (DeleteHeaderFooterRequest) request;
-                boolean isHeader = req.isHeader();
-                return new DataTableDeleteHeaderCommand(viewer, panelGrid, isHeader);
-            }
-            else if (request instanceof TableRowColumnDeleteRequest)
-            {
-                TableRowColumnDeleteRequest deleteReq = (TableRowColumnDeleteRequest) request;
-                if (deleteReq.isRow())
-                {
-                    return new PanelGridDeleteRowCommand(viewer, panelGrid, deleteReq.getIndex());
-                }
-                return new PanelGridDeleteColumnCommand(viewer, panelGrid, deleteReq.getIndex());
-            }
-            return super.getCommand(request);
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/request/DeleteHColumnHeaderFooterRequest.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/request/DeleteHColumnHeaderFooterRequest.java
deleted file mode 100644
index 076fd74..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/request/DeleteHColumnHeaderFooterRequest.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.elementedit.request;
-
-import org.eclipse.gef.Request;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class DeleteHColumnHeaderFooterRequest extends Request
-{
-    private boolean _isHeader;
-
-    /**
-     * @param type
-     * @param isHeader
-     */
-    public DeleteHColumnHeaderFooterRequest(String type, boolean isHeader)
-    {
-        super(type);
-        this._isHeader = isHeader;
-    }
-
-    /**
-     * @return Returns the _isHeader.
-     */
-    public boolean isHeader()
-    {
-        return _isHeader;
-    }
-
-    /**
-     * @param header The _isHeader to set.
-     */
-    public void setHeader(boolean header)
-    {
-        _isHeader = header;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/request/DeleteHeaderFooterRequest.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/request/DeleteHeaderFooterRequest.java
deleted file mode 100644
index d935652..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/request/DeleteHeaderFooterRequest.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.elementedit.request;
-
-import org.eclipse.gef.Request;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class DeleteHeaderFooterRequest extends Request
-{
-    private boolean _isHeader;
-
-    /**
-     * @param type
-     * @param isHeader
-     */
-    public DeleteHeaderFooterRequest(String type, boolean isHeader)
-    {
-        super(type);
-        this._isHeader = isHeader;
-    }
-
-    /**
-     * @return Returns the _isHeader.
-     */
-    public boolean isHeader()
-    {
-        return _isHeader;
-    }
-
-    /**
-     * @param header The _isHeader to set.
-     */
-    public void setHeader(boolean header)
-    {
-        _isHeader = header;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/request/InsertHColumnHeaderFooterRequest.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/request/InsertHColumnHeaderFooterRequest.java
deleted file mode 100644
index 34e3d4a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/request/InsertHColumnHeaderFooterRequest.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.elementedit.request;
-
-import org.eclipse.gef.Request;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class InsertHColumnHeaderFooterRequest extends Request
-{
-    private boolean _isHeader;
-
-    /**
-     * @param type
-     * @param isHeader
-     */
-    public InsertHColumnHeaderFooterRequest(String type, boolean isHeader)
-    {
-        super(type);
-        this._isHeader = isHeader;
-    }
-
-    /**
-     * @return Returns the _isHeader.
-     */
-    public boolean isHeader()
-    {
-        return _isHeader;
-    }
-
-    /**
-     * @param header The _isHeader to set.
-     */
-    public void setHeader(boolean header)
-    {
-        _isHeader = header;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/request/InsertHeaderFooterRequest.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/request/InsertHeaderFooterRequest.java
deleted file mode 100644
index 31e853f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/request/InsertHeaderFooterRequest.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.elementedit.request;
-
-import org.eclipse.gef.Request;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class InsertHeaderFooterRequest extends Request
-{
-    private boolean _isHeader;
-
-    /**
-     * @param type
-     * @param isHeader
-     */
-    public InsertHeaderFooterRequest(String type, boolean isHeader)
-    {
-        super(type);
-        this._isHeader = isHeader;
-    }
-
-    /**
-     * @return Returns the _isHeader.
-     */
-    public boolean isHeader()
-    {
-        return _isHeader;
-    }
-
-    /**
-     * @param header The _isHeader to set.
-     */
-    public void setHeader(boolean header)
-    {
-        _isHeader = header;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/util/DataTableUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/util/DataTableUtil.java
deleted file mode 100644
index 15c08ad..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/util/DataTableUtil.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.elementedit.util;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.jsf.core.dom.JSFDOMUtil;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class DataTableUtil
-{
-    private static final int INVALID_POSITION = -10;
-    private Element          _dataTable       = null;
-
-    /**
-     * @param dataTable
-     */
-    public DataTableUtil(Element dataTable)
-    {
-        this._dataTable = dataTable;
-    }
-
-    /**
-     * @param column
-     * @return the column index for column
-     */
-    public int getColumnIndex(Element column)
-    {
-        NodeList nodeList = this._dataTable.getElementsByTagName("h:column"); //$NON-NLS-1$
-        if (nodeList != null)
-        {
-            for (int i = 0, size = nodeList.getLength(); i < size; i++)
-            {
-                if (column == (Element) nodeList.item(i))
-                {
-                    return i;
-                }
-            }
-        }
-        return INVALID_POSITION;
-    }
-
-    /**
-     * @param child
-     * @return the hcolumn parent of child or null if not found
-     */
-    public Element findHColumnParent(Node child)
-    {
-        if (child == null)
-        {
-            return null;
-        }
-
-        Node childBackup = child;
-        boolean hasHColumnParent = false;
-
-        if (JSFDOMUtil.isHColumn(child))
-        {
-            return (Element) child;
-        }
-        while (!IJSFConstants.TAG_DATATABLE.equalsIgnoreCase(childBackup.getParentNode().getLocalName()))
-        {
-            childBackup = childBackup.getParentNode();
-            String tagName = childBackup.getLocalName();
-            if (IJSFConstants.TAG_COLUMN.equalsIgnoreCase(tagName))
-            {
-                hasHColumnParent = true;
-                break;
-            }
-        }
-
-        if (hasHColumnParent)
-        {
-            return (Element) childBackup;
-        }
-        return null;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/util/PanelGridUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/util/PanelGridUtil.java
deleted file mode 100644
index 8c19239..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/util/PanelGridUtil.java
+++ /dev/null
@@ -1,184 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.elementedit.util;
-
-import java.util.List;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.jsf.core.dom.JSFDOMUtil;
-import org.w3c.dom.Element;
-
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class PanelGridUtil
-{
-    private static final int INVALID_POSITION = -10;
-    private Element          _panelGrid       = null;
-
-    /**
-     * @param panelGrid
-     */
-    public PanelGridUtil(Element panelGrid)
-    {
-        this._panelGrid = panelGrid;
-    }
-
-    /**
-     * @param domIndex
-     * @return the row index in the panel of the relative dom index
-     */
-    public int convertRowIndexFromDomToView(int domIndex)
-    {
-        boolean hasHeaderRow = (JSFDOMUtil.findFacet(this._panelGrid, "header") != null); //$NON-NLS-1$
-        boolean hasFooterRow = (JSFDOMUtil.findFacet(this._panelGrid, "footer") != null); //$NON-NLS-1$
-        if (!hasFooterRow)
-        {
-            return domIndex;
-        }
-        if (domIndex == 0)
-        {
-            return domIndex;
-        }
-        if (hasHeaderRow)
-        {
-            if (domIndex > 1)
-            {
-                return domIndex - 1;
-            }
-        }
-        else
-        {
-            if (domIndex > 0)
-            {
-                return domIndex - 1;
-            }
-        }
-        //must be footer
-        int uiRows = getUIRowCount();
-        return domIndex + uiRows;
-    }
-
-    /**
-     * @param cell
-     * @return the dom row index of cell in the panel
-     */
-    public int getDomRowIndex(Element cell)
-    {
-        boolean hasHeaderRow = (JSFDOMUtil.findFacet(this._panelGrid, "header") != null); //$NON-NLS-1$
-        boolean hasFooterRow = (JSFDOMUtil.findFacet(this._panelGrid, "footer") != null); //$NON-NLS-1$
-        //if cell is header or footer
-        boolean isFacet = JSFDOMUtil.isFacet(cell);
-        Element parent = (Element) cell.getParentNode();
-        boolean isParentFacet = JSFDOMUtil.isFacet(parent);
-        if (isParentFacet)
-        {
-            cell = parent;
-        }
-        if (isFacet || isParentFacet)
-        {
-            String attrName = cell.getAttribute("name"); //$NON-NLS-1$
-            if ("header".equalsIgnoreCase(attrName)) //$NON-NLS-1$
-            {
-                return 0;
-            }
-            else if ("footer".equalsIgnoreCase(attrName)) //$NON-NLS-1$
-            {
-                if (hasHeaderRow)
-                {
-                    return 1;
-                }
-                return 0;
-            }
-        }
-
-        int columns = DOMUtil.getIntAttributeIgnoreCase(this._panelGrid, IJSFConstants.ATTR_COLUMNS, 1);
-        if (columns < 1)
-        {
-            columns = 1;
-        }
-        int pos = getPosition(cell);
-        int rowIndex = pos / columns;
-
-        if (hasHeaderRow)
-        {
-            rowIndex++;
-        }
-        if (hasFooterRow)
-        {
-            rowIndex++;
-        }
-
-        return rowIndex;
-    }
-
-    /**
-     * @param cell
-     * @return the column index of cell in the panel
-     */
-    public int getDomColumnIndex(Element cell)
-    {
-        int columns = DOMUtil.getIntAttributeIgnoreCase(this._panelGrid, IJSFConstants.ATTR_COLUMNS, 1);
-        if (columns < 1)
-        {
-            columns = 1;
-        }
-        int pos = getPosition(cell);
-        //if position is at header or footer,then insert column action should be disabled
-        if (pos == INVALID_POSITION)
-        {
-            return pos;
-        }
-
-        int columnIndex = pos % columns;
-        return columnIndex;
-    }
-
-    /**
-     * @return the row count in the panel
-     */
-    public int getUIRowCount()
-    {
-        int columns = DOMUtil.getIntAttributeIgnoreCase(this._panelGrid, IJSFConstants.ATTR_COLUMNS, 1);
-        if (columns < 1)
-        {
-            columns = 1;
-        }
-        List children = JSFDOMUtil.getUIComponentChildren(this._panelGrid);
-        int numRows = (children.size() + columns - 1) / columns;
-
-        return numRows;
-    }
-
-    private int getPosition(Element cell)
-    {
-        List children = JSFDOMUtil.getUIComponentChildren(this._panelGrid);
-        int size = children.size();
-        int i = 0;
-        for (i = 0; i < size; i++)
-        {
-            if (cell == children.get(i))
-            {
-                break;
-            }
-        }
-        if (i == size)
-        {
-            return INVALID_POSITION;
-        }
-        return i;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/IInputWidgetTypes.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/IInputWidgetTypes.java
deleted file mode 100644
index a2df68a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/IInputWidgetTypes.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.sections;
-
-interface IInputWidgetTypes 
-{
-    /**
-     *  a hidden input
-     */
-    public static final int       HIDDEN   = 0;
-    /**
-     * a secret input
-     */
-    public static final int       SECRET   = 1;
-    /**
-     * an input box
-     */
-    public static final int       TEXT     = 2;
-    /**
-     * an input text area
-     */
-    public static final int       TEXTAREA = 3;
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFCoreConvertDateTimeGroup.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFCoreConvertDateTimeGroup.java
deleted file mode 100644
index e69ed40..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFCoreConvertDateTimeGroup.java
+++ /dev/null
@@ -1,281 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.sections;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogFieldApplyListener;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.StyleComboDialogField;
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.commands.single.ChangeAttributeCommand;
-import org.eclipse.jst.pagedesigner.editors.properties.IPropertyPageDescriptor;
-import org.eclipse.jst.pagedesigner.meta.EditorCreator;
-import org.eclipse.jst.pagedesigner.properties.internal.AttributeGroup;
-import org.eclipse.jst.pagedesigner.ui.dialogfields.DialogFieldWrapper;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * This group could be used in both section and dialog.
- * 
- * @author mengbo
- * @version 1.5
- */
-public class JSFCoreConvertDateTimeGroup extends AttributeGroup//AttributeGroup
-{
-    private StyleComboDialogField      _typeField;
-    private StyleComboDialogField      _dateStyleField;
-    private StyleComboDialogField      _timeStyleField;
-    private StyleComboDialogField      _patternField;
-
-    final private static String[] TYPES            = { "date", "time", "both" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-                                                   };
-    final private static String[] DATESTYLES       = { "default", "short", "medium", "long", "full", "custom" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$
-                                                   };
-    final private static String[] TIMESTYLES       = { "default", "short", "medium", "long", "full", "custom" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$
-                                                   };
-    final private static String[] DATEPATTERNS     = { "", "M/d/yy", "EEE, M/d/yy", "MM/dd/yyyy", "EEE, MM/dd/yyyy", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
-            "MMM d, yyyy", "EEE, MMM d, yyyy", "MMMM d, yyyy", "EEEE, MMMM d, yyyy", "MMMM yyyy" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
-                                                   };
-    final private static String[] TIMEPATTERNS     = { "", "hh:mm", "hh:mm z", "HH:mm z", "HH:mm:ss z" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
-                                                   };
-    final private static String[] DATETIMEPATTERNS = {
-            "", "M/d/yy hh:mm", "EEE, M/d/yy hh:mm", "MM/dd/yyyy HH:mm:ss z", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
-            "EEE, MM/dd/yyyy HH:mm:ss z", "MMM d, yyyy HH:mm z", "EEE, MMM d, yyyy HH:mm z", "MMMM d, yyyy HH:mm z", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
-            "EEEE, MMMM d, yyyy HH:mm z" //$NON-NLS-1$
-                                                   };
-
-    /**
-     * The default constructor
-     */
-    public JSFCoreConvertDateTimeGroup()
-    {
-        super(ITLDConstants.URI_JSF_CORE, IJSFConstants.TAG_CONVERTDATETIME, new String[] { IJSFConstants.ATTR_TYPE,
-                IJSFConstants.ATTR_DATESTYLE, IJSFConstants.ATTR_TIMESTYLE, IJSFConstants.ATTR_PATTERN});
-    }
-
-    protected DialogField createDialogField(IPropertyPageDescriptor ppd) {
-        EditorCreator creator = EditorCreator.getInstance();        
-        if (ppd.getAttributeName().equals(IJSFConstants.ATTR_TYPE))
-        {
-            DialogFieldWrapper wrapper = (DialogFieldWrapper) creator
-                    .createDialogFieldWithWrapper(getURI(), getTagName(), ppd, null);
-            _typeField = (StyleComboDialogField) wrapper.getWrappedDialogField();
-            return wrapper;
-        }
-        else if (ppd.getAttributeName().equals(IJSFConstants.ATTR_DATESTYLE))
-        {
-            DialogFieldWrapper wrapper = (DialogFieldWrapper) creator
-            	.createDialogFieldWithWrapper(getURI(), getTagName(), ppd, null);
-            _dateStyleField = (StyleComboDialogField) wrapper.getWrappedDialogField();
-            _dateStyleField.setItems(DATESTYLES);
-            return wrapper;
-        }
-        else if (ppd.getAttributeName().equals(IJSFConstants.ATTR_TIMESTYLE))
-        {
-            DialogFieldWrapper wrapper = (DialogFieldWrapper) creator
-            	.createDialogFieldWithWrapper(getURI(), getTagName(), ppd, null);
-            _timeStyleField = (StyleComboDialogField) wrapper.getWrappedDialogField();
-            _timeStyleField.setItems(TIMESTYLES);
-            return wrapper;
-        }
-        else if (ppd.getAttributeName().equals(IJSFConstants.ATTR_PATTERN))
-        {
-            DialogFieldWrapper wrapper = (DialogFieldWrapper) creator
-            	.createDialogFieldWithWrapper(getURI(), getTagName(), ppd, null);
-            _patternField = (StyleComboDialogField) wrapper.getWrappedDialogField();
-            return wrapper;
-        }
-        else
-        {
-            return null;
-        }    	
-    }
-    
-    protected IDialogFieldApplyListener getDialogFieldApplyListener(IPropertyPageDescriptor ppd)
-    {
-        String attribute = ppd.getAttributeName();
-        if (attribute.equals(IJSFConstants.ATTR_TYPE) || attribute.equals(IJSFConstants.ATTR_DATESTYLE)
-                || attribute.equals(IJSFConstants.ATTR_TIMESTYLE))
-        {
-            IDialogFieldApplyListener listener = new IDialogFieldApplyListener()
-            {
-                public void dialogFieldApplied(DialogField field)
-                {
-                    updatePatternItems();
-                    updateFieldStatus();
-                    updateFieldData();
-                }
-            };
-            return listener;
-        }
-        else if (attribute.equals(IJSFConstants.ATTR_PATTERN))
-        {
-            IDialogFieldApplyListener listener = new IDialogFieldApplyListener()
-            {
-                public void dialogFieldApplied(DialogField field)
-                {
-                    updateFieldStatus();
-                    updateFieldData();
-                }
-            };
-            return listener;
-        }
-        else
-        {
-            return null;
-        }
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.properties.attrgroup.AttributeGroup#refreshData()
-     */
-
-    public void refreshData()
-    {
-        IDOMElement element = getElement();
-
-        String type = element.getAttribute(IJSFConstants.ATTR_TYPE);
-        _typeField.setTextWithoutUpdate(type);
-
-        String dateStyle = element.getAttribute(IJSFConstants.ATTR_DATESTYLE);
-        if (!_dateStyleField.getText().equalsIgnoreCase(DATESTYLES[5]))
-        {
-            _dateStyleField.setTextWithoutUpdate(dateStyle);
-        }
-
-        String timeStyle = element.getAttribute(IJSFConstants.ATTR_TIMESTYLE);
-        if (!_timeStyleField.getText().equalsIgnoreCase(TIMESTYLES[5]))
-        {
-            _timeStyleField.setTextWithoutUpdate(timeStyle);
-        }
-
-        updatePatternItems();
-        String pattern = element.getAttribute(IJSFConstants.ATTR_PATTERN);       
-        _patternField.setTextWithoutUpdate(pattern);
-
-        updateFieldStatus();
-    }
-
-    /**
-     * 
-     */
-    private void updateFieldStatus()
-    {
-        String type = _typeField.getText();
-        String dateStyle = _dateStyleField.getText();
-        String timeStyle = _timeStyleField.getText();
-
-        if (type.equalsIgnoreCase(TYPES[0]))
-        {
-            _dateStyleField.setEnabled(true);
-            _timeStyleField.setEnabled(false);
-            if (dateStyle.equalsIgnoreCase(DATESTYLES[5]))
-            {
-                _patternField.setEnabled(true);
-            }
-            else
-            {
-                _patternField.setEnabled(false);
-            }
-        }
-        else if (type.equalsIgnoreCase(TYPES[1]))
-        {
-            _dateStyleField.setEnabled(false);
-            _timeStyleField.setEnabled(true);
-            if (timeStyle.equalsIgnoreCase(TIMESTYLES[5]))
-            {
-                _patternField.setEnabled(true);
-            }
-            else
-            {
-                _patternField.setEnabled(false);
-            }
-        }
-        else if (type.equalsIgnoreCase(TYPES[2]))
-        {
-            _dateStyleField.setEnabled(true);
-            _timeStyleField.setEnabled(true);
-            if (dateStyle.equalsIgnoreCase(DATESTYLES[5]) || timeStyle.equalsIgnoreCase(TIMESTYLES[5]))
-            {
-                _patternField.setEnabled(true);
-            }
-            else
-            {
-                _patternField.setEnabled(false);
-            }
-        }
-    }
-
-    private void updatePatternItems()
-    {
-        String type = _typeField.getText();
-        String dateStyle = _dateStyleField.getText();
-        String timeStyle = _timeStyleField.getText();
-
-        if (type.equalsIgnoreCase(TYPES[0]) && dateStyle.equalsIgnoreCase(DATESTYLES[5]))
-        {
-            _patternField.getComboControl(null, null).removeAll();
-            _patternField.getComboControl(null, null).setItems(DATEPATTERNS);
-        }
-
-        if (type.equalsIgnoreCase(TYPES[1]) && timeStyle.equalsIgnoreCase(TIMESTYLES[5]))
-        {
-            _patternField.getComboControl(null, null).removeAll();
-            _patternField.getComboControl(null, null).setItems(TIMEPATTERNS);
-        }
-
-        if (type.equalsIgnoreCase(TYPES[2])
-                && (dateStyle.equalsIgnoreCase(DATESTYLES[5]) || timeStyle.equalsIgnoreCase(TIMESTYLES[5])))
-        {
-            _patternField.getComboControl(null, null).removeAll();
-            _patternField.getComboControl(null, null).setItems(DATETIMEPATTERNS);
-        }
-    }
-
-    private void updateFieldData()
-    {
-        String type = _typeField.getText();
-        String dateStyle = _dateStyleField.getText();
-        String timeStyle = _timeStyleField.getText();
-        String pattern = _patternField.getText();
-
-        // update the model
-        if (!_dateStyleField.isEnabled() || dateStyle.equalsIgnoreCase(DATESTYLES[5]))
-        {
-            dateStyle = ""; //$NON-NLS-1$
-        }
-
-        if (!_timeStyleField.isEnabled() || timeStyle.equalsIgnoreCase(TIMESTYLES[5]))
-        {
-            timeStyle = ""; //$NON-NLS-1$
-        }
-
-        if (!_patternField.isEnabled())
-        {
-            pattern = ""; //$NON-NLS-1$
-
-        }
-
-        Map map = new HashMap();
-        map.put(IJSFConstants.ATTR_TYPE, type);
-        map.put(IJSFConstants.ATTR_DATESTYLE, dateStyle);
-        map.put(IJSFConstants.ATTR_TIMESTYLE, timeStyle);
-        map.put(IJSFConstants.ATTR_PATTERN, pattern);
-
-        ChangeAttributeCommand c = new ChangeAttributeCommand(SectionResources
-                .getString("JSFCoreConvertDateTimeSection.ChangeAttribute"), getElement(), map); //$NON-NLS-1$
-        c.execute();
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFCoreConvertNumberGroup.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFCoreConvertNumberGroup.java
deleted file mode 100644
index 75a5d2f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFCoreConvertNumberGroup.java
+++ /dev/null
@@ -1,216 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.sections;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogFieldApplyListener;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.StringDialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.StyleComboDialogField;
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.commands.single.ChangeAttributeCommand;
-import org.eclipse.jst.pagedesigner.editors.properties.IPropertyPageDescriptor;
-import org.eclipse.jst.pagedesigner.meta.EditorCreator;
-import org.eclipse.jst.pagedesigner.properties.internal.AttributeGroup;
-import org.eclipse.jst.pagedesigner.ui.dialogfields.DialogFieldWrapper;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * @author mengbo
- */
-public class JSFCoreConvertNumberGroup extends AttributeGroup
-{
-    private StyleComboDialogField _typeField;
-    private StyleComboDialogField _patternField;
-    private StyleComboDialogField _currencyCodeField;
-    private StringDialogField     _currencySymbolField;
-
-    final private static String[] TYPES = { "number", "currency", "percentage", "custom" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
-                                        };
-
-    /**
-     * The default constructor
-     */
-    public JSFCoreConvertNumberGroup()
-    {
-        super(ITLDConstants.URI_JSF_CORE, IJSFConstants.TAG_CONVERTNUMBER, new String[] { IJSFConstants.ATTR_TYPE,
-                IJSFConstants.ATTR_CURRENCYCODE, IJSFConstants.ATTR_CURRENCYSYMBOL, IJSFConstants.ATTR_PATTERN});
-    }
-
-    protected DialogField createDialogField(IPropertyPageDescriptor ppd)
-    {
-    	EditorCreator creator = EditorCreator.getInstance();
-        if (ppd.getAttributeName().equals(IJSFConstants.ATTR_TYPE))
-        {
-            DialogFieldWrapper wrapper = (DialogFieldWrapper) creator
-            	.createDialogFieldWithWrapper(getURI(), getTagName(), ppd, null);
-            _typeField = (StyleComboDialogField) wrapper.getWrappedDialogField();
-                    _typeField.setItems(TYPES);
-            return wrapper;
-        }
-        else if (ppd.getAttributeName().equals(IJSFConstants.ATTR_CURRENCYCODE))
-        {
-            DialogFieldWrapper wrapper = (DialogFieldWrapper) creator
-            	.createDialogFieldWithWrapper(getURI(), getTagName(), ppd, null);
-            _currencyCodeField = (StyleComboDialogField) wrapper.getWrappedDialogField();
-            return wrapper;
-        }
-        else if (ppd.getAttributeName().equals(IJSFConstants.ATTR_CURRENCYSYMBOL))
-        {
-            DialogFieldWrapper wrapper = (DialogFieldWrapper) creator
-            		.createDialogFieldWithWrapper(getURI(), getTagName(), ppd, null);
-            _currencySymbolField = (StringDialogField) wrapper.getWrappedDialogField();
-            return wrapper;
-        }
-        else if (ppd.getAttributeName().equals(IJSFConstants.ATTR_PATTERN))
-        {
-            DialogFieldWrapper wrapper = (DialogFieldWrapper) creator
-            	.createDialogFieldWithWrapper(getURI(), getTagName(), ppd, null);
-            _patternField = (StyleComboDialogField) wrapper.getWrappedDialogField();
-            return wrapper;
-        }
-        else
-        {
-            return null;
-        }
-    }
-
-    public IDialogFieldApplyListener getDialogFieldApplyListener(IPropertyPageDescriptor ppd)
-    {
-        String attribute = ppd.getAttributeName();
-        if (attribute.equals(IJSFConstants.ATTR_CURRENCYCODE) || attribute.equals(IJSFConstants.ATTR_CURRENCYSYMBOL)
-                || attribute.equals(IJSFConstants.ATTR_PATTERN))
-        {
-            IDialogFieldApplyListener listener = new IDialogFieldApplyListener()
-            {
-                public void dialogFieldApplied(DialogField field)
-                {
-                    updateFieldData();
-                }
-            };
-            return listener;
-        }
-        else if (attribute.equals(IJSFConstants.ATTR_TYPE))
-        {
-            IDialogFieldApplyListener listener = new IDialogFieldApplyListener()
-            {
-                public void dialogFieldApplied(DialogField field)
-                {
-                    updateFieldStatus();
-                    updateFieldData();
-                }
-            };
-            return listener;
-        }
-        else
-        {
-            return null;
-        }
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.pagedesigner.properties.attrgroup.AttributeGroup#refreshData()
-     */
-    public void refreshData()
-    {
-        IDOMElement element = getElement();
-
-        String type = element.getAttribute(IJSFConstants.ATTR_TYPE);
-        if (!_typeField.getText().equalsIgnoreCase(TYPES[3]))
-        {
-            _typeField.setTextWithoutUpdate(type);
-        }
-
-        String currencyCode = element.getAttribute(IJSFConstants.ATTR_CURRENCYCODE);
-        _currencyCodeField.setTextWithoutUpdate(currencyCode);
-
-        String currencySymbol = element.getAttribute(IJSFConstants.ATTR_CURRENCYSYMBOL);
-        _currencySymbolField.setTextWithoutUpdate(currencySymbol);
-
-        String pattern = element.getAttribute(IJSFConstants.ATTR_PATTERN);
-        _patternField.setTextWithoutUpdate(pattern);
-
-        updateFieldStatus();
-    }
-
-    private void updateFieldStatus()
-    {
-        String type = _typeField.getText();
-
-        if (type.equalsIgnoreCase(TYPES[0]))
-        {
-            _currencyCodeField.setEnabled(false);
-            _currencySymbolField.setEnabled(false);
-            _patternField.setEnabled(false);
-        }
-        else if (type.equalsIgnoreCase(TYPES[1]))
-        {
-            _currencyCodeField.setEnabled(true);
-            _currencySymbolField.setEnabled(true);
-            _patternField.setEnabled(false);
-        }
-        else if (type.equalsIgnoreCase(TYPES[2]))
-        {
-            _currencyCodeField.setEnabled(false);
-            _currencySymbolField.setEnabled(false);
-            _patternField.setEnabled(false);
-        }
-        else if (type.equalsIgnoreCase(TYPES[3]))
-        {
-            _currencyCodeField.setEnabled(false);
-            _currencySymbolField.setEnabled(false);
-            _patternField.setEnabled(true);
-        }
-    }
-
-    private void updateFieldData()
-    {
-        String type = _typeField.getText();
-        String currencyCode = _currencyCodeField.getText();
-        String currencySymbol = _currencySymbolField.getText();
-        String pattern = _patternField.getText();
-
-        // update the model
-        if (type.equalsIgnoreCase(TYPES[3]))
-        {
-            type = ""; //$NON-NLS-1$
-        }
-
-        if (!_currencyCodeField.isEnabled())
-        {
-            currencyCode = ""; //$NON-NLS-1$
-        }
-
-        if (!_currencySymbolField.isEnabled())
-        {
-            currencySymbol = ""; //$NON-NLS-1$
-        }
-
-        if (!_patternField.isEnabled())
-        {
-            pattern = ""; //$NON-NLS-1$
-        }
-
-        Map map = new HashMap();
-        map.put(IJSFConstants.ATTR_TYPE, type);
-        map.put(IJSFConstants.ATTR_CURRENCYCODE, currencyCode);
-        map.put(IJSFConstants.ATTR_CURRENCYSYMBOL, currencySymbol);
-        map.put(IJSFConstants.ATTR_PATTERN, pattern);
-
-        ChangeAttributeCommand c = new ChangeAttributeCommand(SectionResources
-                .getString("JSFCoreConvertNumberSection.CommandLabel.ChangeAttribute"), getElement(), map); //$NON-NLS-1$
-        c.execute();
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlActionListenerSection.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlActionListenerSection.java
deleted file mode 100644
index 33e7916..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlActionListenerSection.java
+++ /dev/null
@@ -1,326 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.sections;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.jface.viewers.DoubleClickEvent;
-import org.eclipse.jface.viewers.IDoubleClickListener;
-import org.eclipse.jface.viewers.ILabelProviderListener;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.ITableLabelProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.commands.single.AddSubNodeCommand;
-import org.eclipse.jst.pagedesigner.commands.single.RemoveSubNodeCommand;
-import org.eclipse.jst.pagedesigner.properties.BaseCustomSection;
-import org.eclipse.jst.pagedesigner.properties.DesignerPropertyTool;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.CCombo;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetWidgetFactory;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class JSFHtmlActionListenerSection extends BaseCustomSection
-{
-    final private static String[] LISTENTYPES = { "Action"}; //$NON-NLS-1$
-
-    private IDOMElement            _element;
-    private Table                 _listenersTable;
-    private TableViewer           _listenersViewer;
-    private CCombo                _listenTypeCombo;
-    private Button                _listenAddButton, _listenRemoveButton;
-
-    private class ListenerContentLabelProvider implements IStructuredContentProvider, ITableLabelProvider
-    {
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-         */
-        public Object[] getElements(Object inputElement)
-        {
-            IDOMElement root = _element;
-            List result = new ArrayList();
-
-            NodeList children = root.getChildNodes();
-            for (int i = 0, n = children.getLength(); i < n; i++)
-            {
-                Node child = children.item(i);
-                if (child.getNodeType() == Node.ELEMENT_NODE)
-                {
-                    IDOMElement element = (IDOMElement) child;
-                    String nodeName = element.getNodeName();
-                    if (nodeName.indexOf("Listener") != -1) //$NON-NLS-1$
-                    {
-                        result.add(child);
-                    }
-                }
-            }
-
-            if (result.isEmpty())
-            {
-                return new Object[0];
-            }
-
-            return result.toArray(new IDOMElement[result.size()]);
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
-         */
-        public void inputChanged(Viewer viewer, Object oldInput, Object newInput)
-        {
-            // no support for viewer changes
-        }
-
-        public String getColumnText(Object element, int columnIndex)
-        {
-            String result = null;
-            if (element instanceof Node)
-            {
-                Node node = (Node) element;
-                String nodeName = getTableNodeName(node, "type"); //$NON-NLS-1$
-                switch (columnIndex)
-                {
-                    case 0:
-                        result = nodeName;
-                        break;
-                    default:
-                        break;
-                }
-            }
-            return result != null ? result : ""; //$NON-NLS-1$
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-         */
-
-        private String getTableNodeName(Node node, String ... attrNames) {
-        	for (String attrName : attrNames) {
-        		Node attr = node.getAttributes().getNamedItem(attrName);
-        		if (attr != null && attr.getNodeValue()!= null && 
-        				! attr.getNodeValue().trim().equals("")) //$NON-NLS-1$
-        			return attr.getNodeValue().trim();
-        	}
-			return node.getNodeName();
-		}
-
-		public void dispose()
-        {
-            // nothing to dispose
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnImage(java.lang.Object, int)
-         */
-        public Image getColumnImage(Object element, int columnIndex)
-        {
-            return null;
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.IBaseLabelProvider#addListener(org.eclipse.jface.viewers.ILabelProviderListener)
-         */
-        public void addListener(ILabelProviderListener listener)
-        {
-            // TODO: listeners not supported?
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.IBaseLabelProvider#isLabelProperty(java.lang.Object, java.lang.String)
-         */
-        public boolean isLabelProperty(Object element, String property)
-        {
-            return false;
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.IBaseLabelProvider#removeListener(org.eclipse.jface.viewers.ILabelProviderListener)
-         */
-        public void removeListener(ILabelProviderListener listener)
-        {
-            // TODO: listeners not supported?
-        }
-    }
-
-     /**
-     * Default constructor
-     */
-    public JSFHtmlActionListenerSection()
-    {
-        super();
-    }
-
-    public void createControls(Composite parent, TabbedPropertySheetPage aTabbedPropertySheetPage)
-    {
-        super.createControls(parent, aTabbedPropertySheetPage);
-        TabbedPropertySheetWidgetFactory factory = aTabbedPropertySheetPage.getWidgetFactory();
-        Composite top = factory.createFlatFormComposite(parent);
-
-        GridLayout layout = new GridLayout();
-        layout.numColumns = 4;
-        top.setLayout(layout);
-
-        createListenerPart(factory, top);
-    }
-
-    /**
-     * @param factory
-     * @param other
-     */
-    private void createListenerPart(TabbedPropertySheetWidgetFactory factory, Composite other)
-    {
-        GridData data;
-        _listenersTable = factory.createTable(other, SWT.FULL_SELECTION | SWT.MULTI);
-        data = new GridData(GridData.FILL_BOTH);
-        data.horizontalSpan = 3;
-        data.verticalSpan = 4;
-        data.heightHint = 50;
-        data.widthHint = 100;
-        _listenersTable.setHeaderVisible(true);
-        _listenersTable.setLayoutData(data);
-        _listenersTable.setLinesVisible(true);
-
-        TableColumn listenColumn = new TableColumn(_listenersTable, SWT.NONE);
-        listenColumn.setText(SectionResources.getString("JSFHtmlCommandButtonSection.Listeners")); //$NON-NLS-1$
-        listenColumn.setWidth(500);
-
-        _listenersViewer = new TableViewer(_listenersTable);
-        _listenersViewer.setContentProvider(new ListenerContentLabelProvider());
-        _listenersViewer.setLabelProvider(new ListenerContentLabelProvider());
-        _listenersViewer.addDoubleClickListener(new IDoubleClickListener()
-        {
-            public void doubleClick(DoubleClickEvent event)
-            {
-                IStructuredSelection selection = (IStructuredSelection) event.getSelection();
-                if (selection != null)
-                {
-                    IDOMElement node = (IDOMElement) selection.getFirstElement();
-                    gotoNode(node);
-                }
-            }
-        });
-        _listenersViewer.addSelectionChangedListener(new ISelectionChangedListener()
-        {
-            public void selectionChanged(SelectionChangedEvent event)
-            {
-                updateListenerButtonStatus();
-            }
-        });
-
-        _listenTypeCombo = factory.createCCombo(other, SWT.READ_ONLY);
-        _listenTypeCombo.setItems(LISTENTYPES);
-        _listenTypeCombo.select(0);
-        data = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
-        _listenTypeCombo.setLayoutData(data);
-
-        _listenAddButton = factory.createButton(other, SectionResources.getString("JSFHtmlCommandButtonSection.Add"), //$NON-NLS-1$
-                SWT.NONE);
-        data = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
-        _listenAddButton.setLayoutData(data);
-        _listenAddButton.addSelectionListener(new SelectionAdapter()
-        {
-            public void widgetSelected(SelectionEvent e)
-            {
-                Map attributes = new HashMap();
-                String listener = _listenTypeCombo.getText();
-                listener = listener.substring(0, 1).toLowerCase() + listener.substring(1) + "Listener"; //$NON-NLS-1$
-                AddSubNodeCommand c = new AddSubNodeCommand(
-                        SectionResources.getString("JSFHtmlCommandButtonSection.CommandLabel.AddSubTag"), _element, listener, ITLDConstants.URI_JSF_CORE, attributes); //$NON-NLS-1$
-                c.execute();
-                _listenersViewer.refresh();
-                updateListenerButtonStatus();
-            }
-        });
-        _listenRemoveButton = factory.createButton(other, SectionResources
-                .getString("JSFHtmlCommandButtonSection.Remove"), SWT.NONE); //$NON-NLS-1$
-        data = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
-        _listenRemoveButton.setLayoutData(data);
-        _listenRemoveButton.addSelectionListener(new SelectionAdapter()
-        {
-            public void widgetSelected(SelectionEvent e)
-            {
-                IStructuredSelection selection = (IStructuredSelection) _listenersViewer.getSelection();
-                if (selection != null)
-                {
-                    for (Iterator i = selection.iterator(); i.hasNext();)
-                    {
-                        IDOMElement node = (IDOMElement) i.next();
-                        RemoveSubNodeCommand c = new RemoveSubNodeCommand(SectionResources
-                                .getString("JSFHtmlCommandButtonSection.CommandLabel.RemoveSubTag"), _element, node); //$NON-NLS-1$
-                        c.execute();
-                    }
-                    _listenersViewer.refresh();
-                    updateListenerButtonStatus();
-                }
-            }
-        });
-    }
-
-    private void updateListenerButtonStatus()
-    {
-        _listenRemoveButton.setEnabled(true);
-        ISelection selection = _listenersViewer.getSelection();
-        if (selection == null || selection.isEmpty())
-        {
-            _listenRemoveButton.setEnabled(false);
-        }
-        if (_listenersTable.getItemCount() == 0)
-        {
-            _listenRemoveButton.setEnabled(false);
-        }
-    }
-
-    public void setInput(IWorkbenchPart part, ISelection selection)
-    {
-        super.setInput(part, selection);
-        _element = (IDOMElement) DesignerPropertyTool.getElement(part, selection);
-        if (_listenersViewer != null)
-        	_listenersViewer.setInput(_element);
-    }
-
-    protected void notifyChanged(INodeNotifier notifier, int eventType, Object changedFeature, Object oldValue, Object newValue, int pos)
-    {
-        if(_listenersViewer != null && !_listenersViewer.getControl().isDisposed())
-        {
-            _listenersViewer.refresh();
-        }
-        
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlDataTableColumnsSection.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlDataTableColumnsSection.java
deleted file mode 100644
index 92bd788..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlDataTableColumnsSection.java
+++ /dev/null
@@ -1,390 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.sections;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.jface.viewers.DoubleClickEvent;
-import org.eclipse.jface.viewers.IDoubleClickListener;
-import org.eclipse.jface.viewers.ILabelProviderListener;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.ITableLabelProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.commands.single.AddSubNodeCommand;
-import org.eclipse.jst.pagedesigner.commands.single.InsertSubNodeCommand;
-import org.eclipse.jst.pagedesigner.commands.single.RemoveSubNodeCommand;
-import org.eclipse.jst.pagedesigner.properties.BaseCustomSection;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetWidgetFactory;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class JSFHtmlDataTableColumnsSection extends BaseCustomSection
-{
-    private Table                  _columnsTable;
-    private TableViewer            _columnsViewer;
-    private Button                 _addButton, _removeButton, _moveUpButton, _moveDownButton;
-
-    final static private String           DEFAULT_COLUMN_NAME = "column"; //$NON-NLS-1$
-    final static private String           DEFAULT_FACET_NAME  = "header"; //$NON-NLS-1$
-    final static private String           DEFAULT_TEXT_NAME   = "text"; //$NON-NLS-1$
-
-    class ColumnCotentLabelProvider implements IStructuredContentProvider, ITableLabelProvider
-    {
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-         */
-        public Object[] getElements(Object inputElement)
-        {
-            IDOMElement root = _element;
-            List result = new ArrayList();
-
-            NodeList children = root.getChildNodes();
-            for (int i = 0, n = children.getLength(); i < n; i++)
-            {
-                Node child = children.item(i);
-                if (child.getNodeType() == Node.ELEMENT_NODE)
-                {
-                    IDOMElement element = (IDOMElement) child;
-                    String nodeName = element.getNodeName();
-                    if (nodeName.indexOf("column") != -1) //$NON-NLS-1$
-                    {
-                        result.add(child);
-                    }
-                }
-            }
-
-            if (result.isEmpty())
-            {
-                return new Object[0];
-            }
-
-            return result.toArray(new IDOMElement[result.size()]);
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
-         */
-        public void inputChanged(Viewer viewer, Object oldInput, Object newInput)
-        {
-            // no support for input changed
-        }
-
-        public String getColumnText(Object element, int columnIndex)
-        {
-            String result = null;
-            if (element instanceof IDOMElement)
-            {
-                IDOMElement node = (IDOMElement) element;
-                switch (columnIndex)
-                {
-                    case 0:
-                        result = node.getAttribute(IJSFConstants.ATTR_ID);
-                        break;
-                    default:
-                        break;
-                }
-            }
-            return result != null ? result : ""; //$NON-NLS-1$
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-         */
-
-        public void dispose()
-        {
-            // nothing to dispose
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnImage(java.lang.Object, int)
-         */
-        public Image getColumnImage(Object element, int columnIndex)
-        {
-            return null;
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.IBaseLabelProvider#addListener(org.eclipse.jface.viewers.ILabelProviderListener)
-         */
-        public void addListener(ILabelProviderListener listener)
-        {
-            // TODO: no support for listeners?
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.IBaseLabelProvider#isLabelProperty(java.lang.Object, java.lang.String)
-         */
-        public boolean isLabelProperty(Object element, String property)
-        {
-            return false;
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.IBaseLabelProvider#removeListener(org.eclipse.jface.viewers.ILabelProviderListener)
-         */
-        public void removeListener(ILabelProviderListener listener)
-        {
-            // TODO: no support for listeners?
-        }
-
-    }
-
-    /**
-     * default constructor
-     */
-    public JSFHtmlDataTableColumnsSection()
-    {
-        super();
-    }
-
-    public void createControls(Composite parent, TabbedPropertySheetPage aTabbedPropertySheetPage)
-    {
-        super.createControls(parent, aTabbedPropertySheetPage);
-        TabbedPropertySheetWidgetFactory factory = aTabbedPropertySheetPage.getWidgetFactory();
-        Composite top = factory.createFlatFormComposite(parent);
-
-        GridLayout layout = new GridLayout();
-        layout.numColumns = 4;
-        top.setLayout(layout);
-
-        createColumnPart(factory, top);
-    }
-    
-    private void createColumnPart(TabbedPropertySheetWidgetFactory factory, Composite other)
-    {
-        GridData data;
-        _columnsTable = factory.createTable(other, SWT.FULL_SELECTION | SWT.MULTI);
-        data = new GridData(GridData.FILL_BOTH);
-        data.horizontalSpan = 3;
-        data.verticalSpan = 4;
-        data.widthHint = 10;
-        data.heightHint = 50;
-        _columnsTable.setHeaderVisible(true);
-        _columnsTable.setLayoutData(data);
-        _columnsTable.setLinesVisible(true);
-
-        TableColumn column = new TableColumn(_columnsTable, SWT.NONE);
-        column.setText(SectionResources.getString("JSFHtmlDataTableSection.Columns")); //$NON-NLS-1$
-        column.setWidth(200);
-
-        _columnsViewer = new TableViewer(_columnsTable);
-        _columnsViewer.setContentProvider(new ColumnCotentLabelProvider());
-        _columnsViewer.setLabelProvider(new ColumnCotentLabelProvider());
-        _columnsViewer.addDoubleClickListener(new IDoubleClickListener()
-        {
-            public void doubleClick(DoubleClickEvent event)
-            {
-                IStructuredSelection selection = (IStructuredSelection) event.getSelection();
-                if (selection != null)
-                {
-                    IDOMElement node = (IDOMElement) selection.getFirstElement();
-                    gotoNode(node);
-                }
-            }
-        }
-        );
-        _columnsViewer.addSelectionChangedListener(new ISelectionChangedListener()
-        {
-            public void selectionChanged(SelectionChangedEvent event)
-            {
-                updateButtonStatus();
-            }
-        }
-        );
-
-        // add buttons group
-        _addButton = factory.createButton(other, SectionResources.getString("JSFHtmlDataTableSection.Add"), SWT.NONE); //$NON-NLS-1$
-        data = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
-        _addButton.setLayoutData(data);
-        _addButton.addSelectionListener(new SelectionAdapter()
-        {
-            public void widgetSelected(SelectionEvent e)
-            {
-                int count = _columnsTable.getItemCount();
-
-                Map attributes = new HashMap();
-                attributes.put(IJSFConstants.ATTR_ID, DEFAULT_COLUMN_NAME + (count + 1));
-                AddSubNodeCommand c = new AddSubNodeCommand(SectionResources.getString("JSFHtmlDataTableSection.CommandLabel.AddSubTag"), _element, "column", //$NON-NLS-1$ //$NON-NLS-2$
-                ITLDConstants.URI_JSF_HTML, attributes);
-                c.execute();
-
-                IDOMElement child = c.getChildNode();
-                attributes = new HashMap();
-                attributes.put(IJSFConstants.ATTR_NAME, DEFAULT_FACET_NAME);
-                c = new AddSubNodeCommand(SectionResources.getString("JSFHtmlDataTableSection.CommandLabel.AddSubTag"), child, "facet", ITLDConstants.URI_JSF_CORE, attributes); //$NON-NLS-1$ //$NON-NLS-2$
-                c.execute();
-
-                child = c.getChildNode();
-                attributes = new HashMap();
-                attributes.put(IJSFConstants.ATTR_ID, DEFAULT_TEXT_NAME + (count + 1));
-                attributes.put(IJSFConstants.ATTR_VALUE, DEFAULT_COLUMN_NAME + (count + 1));
-                c = new AddSubNodeCommand(SectionResources.getString("JSFHtmlDataTableSection.CommandLabel.AddSubTag"), child, "outputText", ITLDConstants.URI_JSF_HTML, attributes); //$NON-NLS-1$ //$NON-NLS-2$
-                c.execute();
-
-                _columnsViewer.refresh();
-                //                if (c.getChildNode() != null)
-                //                {
-                //                    gotoNode(c.getChildNode());
-                //                }
-                updateButtonStatus();
-            }
-        }
-        );
-        _removeButton = factory.createButton(other, SectionResources.getString("JSFHtmlDataTableSection.Remove"), //$NON-NLS-1$
-        SWT.NONE);
-        data = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
-        _removeButton.setLayoutData(data);
-        _removeButton.addSelectionListener(new SelectionAdapter()
-        {
-            public void widgetSelected(SelectionEvent e)
-            {
-                IStructuredSelection selection = (IStructuredSelection) _columnsViewer.getSelection();
-                if (selection != null)
-                {
-                    for (Iterator i = selection.iterator(); i.hasNext();)
-                    {
-                        IDOMElement node = (IDOMElement) i.next();
-                        RemoveSubNodeCommand c = new RemoveSubNodeCommand(SectionResources.getString("JSFHtmlDataTableSection.CommandLabel.RemoveSubTag"), _element, node); //$NON-NLS-1$
-                        c.execute();
-                    }
-                    _columnsViewer.refresh();
-                    updateButtonStatus();
-                }
-            }
-        }
-        );
-        _moveUpButton = factory.createButton(other, SectionResources.getString("JSFHtmlDataTableSection.MoveUp"), //$NON-NLS-1$
-        SWT.NONE);
-        data = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
-        _moveUpButton.setLayoutData(data);
-        _moveUpButton.addSelectionListener(new SelectionAdapter()
-        {
-            public void widgetSelected(SelectionEvent e)
-            {
-                int index = _columnsTable.getSelectionIndex();
-                IDOMElement child = (IDOMElement) _columnsTable.getItem(index).getData();
-                IDOMElement refchild = (IDOMElement) _columnsTable.getItem(index - 1).getData();
-                RemoveSubNodeCommand remove = new RemoveSubNodeCommand(SectionResources.getString("JSFHtmlDataTableSection.CommandLabel.RemoveSubTag"), _element, child); //$NON-NLS-1$
-                remove.execute();
-                InsertSubNodeCommand insert = new InsertSubNodeCommand(SectionResources.getString("JSFHtmlDataTableSection.CommandLabel.InsertSubTag"), _element, child, refchild); //$NON-NLS-1$
-                insert.execute();
-                _columnsViewer.refresh();
-                updateButtonStatus();
-            }
-        }
-        );
-        _moveDownButton = factory.createButton(other, SectionResources.getString("JSFHtmlDataTableSection.MoveDown"), //$NON-NLS-1$
-        SWT.NONE);
-        data = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
-        _moveDownButton.setLayoutData(data);
-        _moveDownButton.addSelectionListener(new SelectionAdapter()
-        {
-            public void widgetSelected(SelectionEvent e)
-            {
-                int index = _columnsTable.getSelectionIndex();
-                IDOMElement child = (IDOMElement) _columnsTable.getItem(index).getData();
-                IDOMElement refchild = (IDOMElement) _columnsTable.getItem(index + 1).getData();
-                RemoveSubNodeCommand remove = new RemoveSubNodeCommand(SectionResources.getString("JSFHtmlDataTableSection.CommandLabel.RemoveSubTag"), _element, refchild); //$NON-NLS-1$
-                remove.execute();
-                InsertSubNodeCommand insert = new InsertSubNodeCommand(SectionResources.getString("JSFHtmlDataTableSection.CommandLabel.InsertSubTag"), _element, refchild, child); //$NON-NLS-1$
-                insert.execute();
-                _columnsViewer.refresh();
-                updateButtonStatus();
-            }
-        }
-        );
-    }
-    
-    /**
-     * Update the button status
-     */
-    private void updateButtonStatus()
-    {
-        _removeButton.setEnabled(true);
-        _moveUpButton.setEnabled(true);
-        _moveDownButton.setEnabled(true);
-        ISelection selection = _columnsViewer.getSelection();
-        if (selection.isEmpty())
-        {
-            _removeButton.setEnabled(false);
-            _moveUpButton.setEnabled(false);
-            _moveDownButton.setEnabled(false);
-        }
-        if (_columnsTable.getItemCount() == 0)
-        {
-            _removeButton.setEnabled(false);
-            _moveUpButton.setEnabled(false);
-            _moveDownButton.setEnabled(false);
-        }
-        if (_columnsTable.getSelectionCount() > 1)
-        {
-            _moveUpButton.setEnabled(false);
-            _moveDownButton.setEnabled(false);
-        }
-        if (_columnsTable.getSelectionIndex() == 0)
-        {
-            _moveUpButton.setEnabled(false);
-        }
-        if (_columnsTable.getSelectionIndex() == _columnsTable.getItemCount() - 1)
-        {
-            _moveDownButton.setEnabled(false);
-        }
-    }
-
-    public void setInput(IWorkbenchPart part, ISelection selection)
-    {
-        super.setInput(part, selection);
-
-        _columnsViewer.setInput(_element);
-
-        updateButtonStatus();
-    }
-
-    protected void notifyChanged(INodeNotifier notifier, int eventType, Object changedFeature, Object oldValue, Object newValue, int pos)
-    {
-        if(_columnsViewer != null && !_columnsViewer.getControl().isDisposed())
-        {
-            _columnsViewer.refresh();
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlInputHiddenTypeSection.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlInputHiddenTypeSection.java
deleted file mode 100644
index 77c1be1..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlInputHiddenTypeSection.java
+++ /dev/null
@@ -1,166 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.sections;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogFieldApplyListener;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.LayoutUtil;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.RadiosDialogField;
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.commands.single.ChangeTagCommand;
-import org.eclipse.jst.pagedesigner.properties.BaseCustomSection;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetWidgetFactory;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class JSFHtmlInputHiddenTypeSection extends BaseCustomSection
-{
-    private RadiosDialogField     _typesField;
-
-    final private static String[] TYPES    = { SectionResources.getString("JSFHtmlInputHiddenSection.Type0"), //$NON-NLS-1$
-                                           SectionResources.getString("JSFHtmlInputHiddenSection.Type1"), //$NON-NLS-1$
-                                           SectionResources.getString("JSFHtmlInputHiddenSection.Type2"), //$NON-NLS-1$
-                                           SectionResources.getString("JSFHtmlInputHiddenSection.Type3") //$NON-NLS-1$
-                                           };
-
-    /**
-     * The default constructor
-     */
-    public JSFHtmlInputHiddenTypeSection()
-    {
-        super();
-        _typesField = new RadiosDialogField();
-        _typesField.setLabelText(SectionResources.getString("JSFHtmlInputHiddenSection.Type")); //$NON-NLS-1$
-        _typesField.setItems(TYPES);
-        _typesField.setDialogFieldApplyListener(new IDialogFieldApplyListener()
-        {
-            public void dialogFieldApplied(DialogField field)
-            {
-                int type = _typesField.getSelectedIndex();
-                String prefix = _element.getPrefix();
-                String localTag = toLocalTag(type);
-                String newtag = prefix + ":" + localTag; //$NON-NLS-1$
-                Map attrs = new HashMap();
-                if (type == IInputWidgetTypes.TEXTAREA)
-                {
-                    // need to change "size" attribute to "cols"
-                    String size = _element.getAttribute(IJSFConstants.ATTR_SIZE);
-                    if (size != null && size.length() != 0)
-                    {
-                        attrs.put(IJSFConstants.ATTR_SIZE, null);
-                        attrs.put(IJSFConstants.ATTR_COLS, size);
-                    }
-                }
-                else
-                {
-                    //          need to change "cols" attribute to "size"
-                    String size = _element.getAttribute("cols"); //$NON-NLS-1$
-                    if (size != null && size.length() != 0)
-                    {
-                        attrs.put(IJSFConstants.ATTR_COLS, null);
-                        attrs.put(IJSFConstants.ATTR_SIZE, size);
-                    }
-                }
-                ChangeTagCommand c = new ChangeTagCommand(SectionResources
-                        .getString("JSFHtmlInputHidden.CommandLabel.ChangeType"), _element, newtag, attrs, true); //$NON-NLS-1$
-                c.execute();
-                _element = c.getNewElement();
-            }
-        });
-    }
-
-    public void createControls(Composite parent, TabbedPropertySheetPage aTabbedPropertySheetPage)
-    {
-        super.createControls(parent, aTabbedPropertySheetPage);
-        TabbedPropertySheetWidgetFactory factory = aTabbedPropertySheetPage.getWidgetFactory();
-        Composite top = factory.createFlatFormComposite(parent);
-
-        int numberOfColumns = _typesField.getNumberOfControls();
-        GridLayout layout = new GridLayout(numberOfColumns, false);
-        top.setLayout(layout);
-
-        _typesField.doFillIntoGrid(factory, top, numberOfColumns);
-        LayoutUtil.setGrabHorizontal(_typesField.getGroup(factory, top), true);
-    }
-
-    private String toLocalTag(int type)
-    {
-        switch (type)
-        {
-            case IInputWidgetTypes.SECRET:
-                return IJSFConstants.TAG_INPUTSECRET;
-            case IInputWidgetTypes.HIDDEN:
-                return IJSFConstants.TAG_INPUTHIDDEN;
-            case IInputWidgetTypes.TEXTAREA:
-                return IJSFConstants.TAG_INPUTTEXTAREA;
-            case IInputWidgetTypes.TEXT:
-                return IJSFConstants.TAG_INPUTTEXT;
-            default:
-                return IJSFConstants.TAG_INPUTHIDDEN;
-        }
-    }
-
-    public void setInput(IWorkbenchPart part, ISelection selection)
-    {
-        super.setInput(part, selection);
-
-        _typesField.setSelectedIndexWithoutUpdate(getInputType());
-    }
-
-    /**
-     * @return the type of the input.  One of TEXT, TEXTAREA, HIDDEN, SECRET.
-     */
-    public int getInputType()
-    {
-        String localTag = _element.getLocalName();
-        if (IJSFConstants.TAG_INPUTTEXT.equals(localTag))
-        {
-            return IInputWidgetTypes.TEXT;
-        }
-        else if (IJSFConstants.TAG_INPUTSECRET.equals(localTag))
-        {
-            return IInputWidgetTypes.SECRET;
-        }
-        else if (IJSFConstants.TAG_INPUTHIDDEN.equals(localTag))
-        {
-            return IInputWidgetTypes.HIDDEN;
-        }
-        else if (IJSFConstants.TAG_INPUTTEXTAREA.equals(localTag))
-        {
-            return IInputWidgetTypes.TEXTAREA;
-        }
-        else
-        {
-            return IInputWidgetTypes.HIDDEN;
-        }
-    }
-
-    protected void notifyChanged(INodeNotifier notifier, int eventType, Object changedFeature, Object oldValue,
-            Object newValue, int pos)
-    {
-        if (_typesField != null)
-        {
-            _typesField.setSelectedIndexWithoutUpdate(getInputType());
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlInputOthersSection.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlInputOthersSection.java
deleted file mode 100644
index 2da1a53..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlInputOthersSection.java
+++ /dev/null
@@ -1,868 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.sections;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jface.viewers.DoubleClickEvent;
-import org.eclipse.jface.viewers.ICellModifier;
-import org.eclipse.jface.viewers.IDoubleClickListener;
-import org.eclipse.jface.viewers.ILabelProviderListener;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.ITableLabelProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.TextCellEditor;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.commands.single.AddSubNodeCommand;
-import org.eclipse.jst.pagedesigner.commands.single.ChangeAttributeCommand;
-import org.eclipse.jst.pagedesigner.commands.single.RemoveSubNodeCommand;
-import org.eclipse.jst.pagedesigner.properties.BaseCustomSection;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.CCombo;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.swt.widgets.TableItem;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetWidgetFactory;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class JSFHtmlInputOthersSection extends BaseCustomSection
-{
-    private Table                 _validatorsTable, _convertorsTable, _listenersTable;
-    private TableViewer           _validatorsViewer, _convertorsViewer, _listenersViewer;
-
-    private Button                _validateAddButton, _validateRemoveButton;
-    private Button                _convertAddButton, _convertRemoveButton;
-    private Button                _listenAddButton, _listenRemoveButton;
-    private CCombo                _validateTypeCombo, _convertTypeCombo, _listenTypeCombo;
-    final private static String[] VALIDATETYPES           = { "DoubleRange", "Length", "LongRange" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-                                                          };
-    final private static String[] CONVERTTYPES            = { "DateTime", "Number" //$NON-NLS-1$ //$NON-NLS-2$
-                                                          };
-    final private static String[] LISTENTYPES             = { "ValueChange" //$NON-NLS-1$
-                                                          };
-    final private static String[] VALIDATORS_COLUMN_NAMES = { IJSFConstants.TAG_VALIDATOR, IJSFConstants.ATTR_MINIMUM,
-            IJSFConstants.ATTR_MAXIMUM                    };
-
-    private class ValidateContentLabelProvider implements IStructuredContentProvider, ITableLabelProvider
-    {
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-         */
-        public Object[] getElements(Object inputElement)
-        {
-            IDOMElement root = _element;
-            List result = new ArrayList();
-
-            NodeList children = root.getChildNodes();
-            for (int i = 0, n = children.getLength(); i < n; i++)
-            {
-                Node child = children.item(i);
-                if (child.getNodeType() == Node.ELEMENT_NODE)
-                {
-                    IDOMElement element = (IDOMElement) child;
-                    String nodeName = element.getNodeName();
-                    if (nodeName.indexOf("validat") != -1) //$NON-NLS-1$
-                    {
-                        result.add(child);
-                    }
-                }
-            }
-
-            if (result.isEmpty())
-            {
-                return new Object[0];
-            }
-
-            return result.toArray(new IDOMElement[result.size()]);
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
-         */
-        public void inputChanged(Viewer viewer, Object oldInput, Object newInput)
-        {
-            // no support for input changed
-        }
-
-        public String getColumnText(Object element, int columnIndex)
-        {
-            String result = null;
-            if (element instanceof IDOMElement)
-            {
-                IDOMElement node = (IDOMElement) element;
-                String nodeName = node.getNodeName();
-                switch (columnIndex)
-                {
-                    case 0:
-                        result = nodeName;
-                        break;
-                    case 1:
-                        result = node.getAttribute(IJSFConstants.ATTR_MINIMUM);
-                        break;
-                    case 2:
-                        result = node.getAttribute(IJSFConstants.ATTR_MAXIMUM);
-                        break;
-                    default:
-                        break;
-                }
-            }
-            return result != null ? result : ""; //$NON-NLS-1$
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-         */
-
-        public void dispose()
-        {
-            // nothing to dispose
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnImage(java.lang.Object, int)
-         */
-        public Image getColumnImage(Object element, int columnIndex)
-        {
-            return null;
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.IBaseLabelProvider#addListener(org.eclipse.jface.viewers.ILabelProviderListener)
-         */
-        public void addListener(ILabelProviderListener listener)
-        {
-            // TODO: no support for listeners?
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.IBaseLabelProvider#isLabelProperty(java.lang.Object, java.lang.String)
-         */
-        public boolean isLabelProperty(Object element, String property)
-        {
-            return false;
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.IBaseLabelProvider#removeListener(org.eclipse.jface.viewers.ILabelProviderListener)
-         */
-        public void removeListener(ILabelProviderListener listener)
-        {
-            // TODO: no support for listeners?
-        }
-    }
-
-    private class ValidateCellModifier implements ICellModifier
-    {
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.ICellModifier#canModify(java.lang.Object, java.lang.String)
-         */
-        public boolean canModify(Object element, String property)
-        {
-            int columnIndex = getColumnNames().indexOf(property);
-
-            if (columnIndex == 0)
-            {
-                return false;
-            }
-            return true;
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.ICellModifier#getValue(java.lang.Object, java.lang.String)
-         */
-        public Object getValue(Object element, String property)
-        {
-            int columnIndex = getColumnNames().indexOf(property);
-
-            Object result = null;
-            IDOMElement node = (IDOMElement) element;
-            switch (columnIndex)
-            {
-                case 0: // Node Name
-                    result = node.getNodeName();
-                    break;
-                case 1: // Min
-                    result = node.getAttribute(IJSFConstants.ATTR_MINIMUM);
-                    break;
-                case 2: // Max
-                    result = node.getAttribute(IJSFConstants.ATTR_MAXIMUM);
-                    break;
-                default:
-                    result = ""; //$NON-NLS-1$
-            }
-            return result != null ? result : ""; //$NON-NLS-1$
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.ICellModifier#modify(java.lang.Object, java.lang.String, java.lang.Object)
-         */
-        public void modify(Object element, String property, Object value)
-        {
-            int columnIndex = getColumnNames().indexOf(property);
-
-            TableItem item = (TableItem) element;
-            IDOMElement node = (IDOMElement) item.getData();
-            String valueString;
-            ChangeAttributeCommand c;
-            switch (columnIndex)
-            {
-                case 1: // Min 
-                    valueString = ((String) value).trim();
-                    c = new ChangeAttributeCommand(
-                            SectionResources.getString("JSFHtmlInputTextSection.CommandLabel.ChangeAttribute"), node, IJSFConstants.ATTR_MINIMUM, valueString); //$NON-NLS-1$
-                    c.execute();
-                    break;
-                case 2: // Max 
-                    valueString = ((String) value).trim();
-                    c = new ChangeAttributeCommand(
-                            SectionResources.getString("JSFHtmlInputTextSection.CommandLabel.ChangeAttribute"), node, IJSFConstants.ATTR_MAXIMUM, valueString); //$NON-NLS-1$
-                    c.execute();
-                    break;
-                default:
-                    break;
-            }
-            _validatorsViewer.refresh();
-//            _validatorsViewer.setInput(_element);
-            updateValidateButtonStatus();
-        }
-    }
-
-    private class ConvertContentLabelProvider implements IStructuredContentProvider, ITableLabelProvider
-    {
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-         */
-        public Object[] getElements(Object inputElement)
-        {
-            IDOMElement root = _element;
-            List result = new ArrayList();
-
-            NodeList children = root.getChildNodes();
-            for (int i = 0, n = children.getLength(); i < n; i++)
-            {
-                Node child = children.item(i);
-                if (child.getNodeType() == Node.ELEMENT_NODE)
-                {
-                    IDOMElement element = (IDOMElement) child;
-                    String nodeName = element.getNodeName();
-                    if (nodeName.indexOf("convert") != -1) //$NON-NLS-1$
-                    {
-                        result.add(child);
-                    }
-                }
-            }
-
-            if (result.isEmpty())
-            {
-                return new Object[0];
-            }
-
-            return result.toArray(new IDOMElement[result.size()]);
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
-         */
-        public void inputChanged(Viewer viewer, Object oldInput, Object newInput)
-        {
-            // do nothing
-        }
-
-        public String getColumnText(Object element, int columnIndex)
-        {
-            String result = null;
-            if (element instanceof IDOMElement)
-            {
-                IDOMElement node = (IDOMElement) element;
-                String nodeName = node.getNodeName();
-                switch (columnIndex)
-                {
-                    case 0:
-                        result = nodeName;
-                        break;
-                    default:
-                        break;
-                }
-            }
-            return result != null ? result : ""; //$NON-NLS-1$
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-         */
-
-        public void dispose()
-        {
-            // nothing to dispose
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnImage(java.lang.Object, int)
-         */
-        public Image getColumnImage(Object element, int columnIndex)
-        {
-            return null;
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.IBaseLabelProvider#addListener(org.eclipse.jface.viewers.ILabelProviderListener)
-         */
-        public void addListener(ILabelProviderListener listener)
-        {
-            // TODO: no support for listeners?
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.IBaseLabelProvider#isLabelProperty(java.lang.Object, java.lang.String)
-         */
-        public boolean isLabelProperty(Object element, String property)
-        {
-            return false;
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.IBaseLabelProvider#removeListener(org.eclipse.jface.viewers.ILabelProviderListener)
-         */
-        public void removeListener(ILabelProviderListener listener)
-        {
-            // TODO: no support for listeners?
-        }
-    }
-
-    private class ListenerContentLabelProvider implements IStructuredContentProvider, ITableLabelProvider
-    {
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-         */
-        public Object[] getElements(Object inputElement)
-        {
-            IDOMElement root = _element;
-            List result = new ArrayList();
-
-            NodeList children = root.getChildNodes();
-            for (int i = 0, n = children.getLength(); i < n; i++)
-            {
-                Node child = children.item(i);
-                if (child.getNodeType() == Node.ELEMENT_NODE)
-                {
-                    IDOMElement element = (IDOMElement) child;
-                    String nodeName = element.getNodeName();
-                    if (nodeName.indexOf("Listener") != -1) //$NON-NLS-1$
-                    {
-                        result.add(child);
-                    }
-                }
-            }
-
-            if (result.isEmpty())
-            {
-                return new Object[0];
-            }
-
-            return result.toArray(new IDOMElement[result.size()]);
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
-         */
-        public void inputChanged(Viewer viewer, Object oldInput, Object newInput)
-        {
-            // do nothing
-        }
-
-        public String getColumnText(Object element, int columnIndex)
-        {
-            String result = null;
-            if (element instanceof IDOMElement)
-            {
-                IDOMElement node = (IDOMElement) element;
-                String nodeName = node.getNodeName();
-                switch (columnIndex)
-                {
-                    case 0:
-                        result = nodeName;
-                        break;
-                    default:
-                        break;
-                }
-            }
-            return result != null ? result : ""; //$NON-NLS-1$
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-         */
-
-        public void dispose()
-        {
-            // nothing to dispose
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnImage(java.lang.Object, int)
-         */
-        public Image getColumnImage(Object element, int columnIndex)
-        {
-            return null;
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.IBaseLabelProvider#addListener(org.eclipse.jface.viewers.ILabelProviderListener)
-         */
-        public void addListener(ILabelProviderListener listener)
-        {
-            // TODO: no support for listeners?
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.IBaseLabelProvider#isLabelProperty(java.lang.Object, java.lang.String)
-         */
-        public boolean isLabelProperty(Object element, String property)
-        {
-            return false;
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.IBaseLabelProvider#removeListener(org.eclipse.jface.viewers.ILabelProviderListener)
-         */
-        public void removeListener(ILabelProviderListener listener)
-        {
-            // TODO: no support for listeners?
-        }
-    }
-
-    /**
-     * The default constructor
-     */
-    public JSFHtmlInputOthersSection()
-    {
-        super();
-    }
-
-    public void createControls(Composite parent, TabbedPropertySheetPage aTabbedPropertySheetPage)
-    {
-        super.createControls(parent, aTabbedPropertySheetPage);
-        TabbedPropertySheetWidgetFactory factory = aTabbedPropertySheetPage.getWidgetFactory();
-        Composite top = factory.createFlatFormComposite(parent);
-
-        GridLayout layout = new GridLayout();
-        layout.numColumns = 4;
-        top.setLayout(layout);
-
-        createValidatePart(factory, top);
-
-        createConvertPart(factory, top);
-
-        createListenPart(factory, top);
-    }
-
-    /**
-     * @param factory
-     * @param other
-     */
-    private void createConvertPart(TabbedPropertySheetWidgetFactory factory, Composite other)
-    {
-        GridData data;
-        _convertorsTable = factory.createTable(other, SWT.FULL_SELECTION | SWT.MULTI);
-        data = new GridData(GridData.FILL_BOTH);
-        data.horizontalSpan = 3;
-        data.verticalSpan = 3;
-        data.heightHint = 50;
-        _convertorsTable.setHeaderVisible(true);
-        _convertorsTable.setLayoutData(data);
-        _convertorsTable.setLinesVisible(true);
-
-        TableColumn convertColumn = new TableColumn(_convertorsTable, SWT.NONE);
-        convertColumn.setText(SectionResources.getString("JSFHtmlInputTextSection.Converter")); //$NON-NLS-1$
-        convertColumn.setWidth(150);
-
-        _convertorsViewer = new TableViewer(_convertorsTable);
-        _convertorsViewer.setContentProvider(new ConvertContentLabelProvider());
-        _convertorsViewer.setLabelProvider(new ConvertContentLabelProvider());
-        _convertorsViewer.addDoubleClickListener(new IDoubleClickListener()
-        {
-            public void doubleClick(DoubleClickEvent event)
-            {
-                IStructuredSelection selection = (IStructuredSelection) event.getSelection();
-                if (selection != null)
-                {
-                    IDOMElement node = (IDOMElement) selection.getFirstElement();
-                    gotoNode(node);
-                }
-            }
-        });
-        _convertorsViewer.addSelectionChangedListener(new ISelectionChangedListener()
-        {
-            public void selectionChanged(SelectionChangedEvent event)
-            {
-                updateConvertButtonStatus();
-            }
-        });
-
-        _convertTypeCombo = factory.createCCombo(other, SWT.READ_ONLY);
-        _convertTypeCombo.setItems(CONVERTTYPES);
-        _convertTypeCombo.select(0);
-        data = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
-        _convertTypeCombo.setLayoutData(data);
-
-        _convertAddButton = factory.createButton(other, SectionResources.getString("JSFHtmlInputTextSection.Add"), //$NON-NLS-1$
-                SWT.NONE);
-        data = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
-        _convertAddButton.setLayoutData(data);
-        _convertAddButton.addSelectionListener(new SelectionAdapter()
-        {
-            public void widgetSelected(SelectionEvent e)
-            {
-                Map attributes = new HashMap();
-                AddSubNodeCommand c = new AddSubNodeCommand(SectionResources
-                        .getString("JSFHtmlInputTextSection.CommandLabel.AddSubTag"), _element, "convert" //$NON-NLS-1$ //$NON-NLS-2$
-                        + _convertTypeCombo.getText(), ITLDConstants.URI_JSF_CORE, attributes);
-                c.execute();
-                _convertorsViewer.refresh();
-                updateConvertButtonStatus();
-            }
-        });
-        _convertRemoveButton = factory.createButton(other,
-                SectionResources.getString("JSFHtmlInputTextSection.Remove"), SWT.NONE); //$NON-NLS-1$
-        data = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
-        _convertRemoveButton.setLayoutData(data);
-        _convertRemoveButton.addSelectionListener(new SelectionAdapter()
-        {
-            public void widgetSelected(SelectionEvent e)
-            {
-                IStructuredSelection selection = (IStructuredSelection) _convertorsViewer.getSelection();
-                if (selection != null)
-                {
-                    for (Iterator i = selection.iterator(); i.hasNext();)
-                    {
-                        IDOMElement node = (IDOMElement) i.next();
-                        RemoveSubNodeCommand c = new RemoveSubNodeCommand(SectionResources
-                                .getString("JSFHtmlInputTextSection.CommandLabel.RemoveSubTag"), _element, node); //$NON-NLS-1$
-                        c.execute();
-                    }
-                    _convertorsViewer.refresh();
-                    updateConvertButtonStatus();
-                }
-            }
-        });
-    }
-
-    /**
-     * @param factory
-     * @param other
-     */
-    private void createListenPart(TabbedPropertySheetWidgetFactory factory, Composite other)
-    {
-        GridData data;
-        _listenersTable = factory.createTable(other, SWT.FULL_SELECTION | SWT.MULTI);
-        data = new GridData(GridData.FILL_BOTH);
-        data.horizontalSpan = 3;
-        data.verticalSpan = 3;
-        data.heightHint = 50;
-        _listenersTable.setHeaderVisible(true);
-        _listenersTable.setLayoutData(data);
-        _listenersTable.setLinesVisible(true);
-
-        TableColumn listenColumn = new TableColumn(_listenersTable, SWT.NONE);
-        listenColumn.setText(SectionResources.getString("JSFHtmlInputTextSection.Listeners")); //$NON-NLS-1$
-        listenColumn.setWidth(150);
-
-        _listenersViewer = new TableViewer(_listenersTable);
-        _listenersViewer.setContentProvider(new ListenerContentLabelProvider());
-        _listenersViewer.setLabelProvider(new ListenerContentLabelProvider());
-        _listenersViewer.addDoubleClickListener(new IDoubleClickListener()
-        {
-            public void doubleClick(DoubleClickEvent event)
-            {
-                IStructuredSelection selection = (IStructuredSelection) event.getSelection();
-                if (selection != null)
-                {
-                    IDOMElement node = (IDOMElement) selection.getFirstElement();
-                    gotoNode(node);
-                }
-            }
-        });
-        _listenersViewer.addSelectionChangedListener(new ISelectionChangedListener()
-        {
-            public void selectionChanged(SelectionChangedEvent event)
-            {
-                updateListenButtonStatus();
-            }
-        });
-
-        _listenTypeCombo = factory.createCCombo(other, SWT.READ_ONLY);
-        _listenTypeCombo.setItems(LISTENTYPES);
-        _listenTypeCombo.select(0);
-        data = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
-        _listenTypeCombo.setLayoutData(data);
-
-        _listenAddButton = factory.createButton(other, SectionResources.getString("JSFHtmlInputTextSection.Add"), //$NON-NLS-1$
-                SWT.NONE);
-        data = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
-        _listenAddButton.setLayoutData(data);
-        _listenAddButton.addSelectionListener(new SelectionAdapter()
-        {
-            public void widgetSelected(SelectionEvent e)
-            {
-                Map attributes = new HashMap();
-                String listener = _listenTypeCombo.getText();
-                listener = listener.substring(0, 1).toLowerCase() + listener.substring(1) + "Listener"; //$NON-NLS-1$
-                AddSubNodeCommand c = new AddSubNodeCommand(
-                        SectionResources.getString("JSFHtmlInputTextSection.CommandLabel.AddSubTag"), _element, listener, ITLDConstants.URI_JSF_CORE, attributes); //$NON-NLS-1$
-                c.execute();
-                _listenersViewer.refresh();
-                updateListenButtonStatus();
-            }
-        });
-        _listenRemoveButton = factory.createButton(other,
-                SectionResources.getString("JSFHtmlInputTextSection.Remove"), SWT.NONE); //$NON-NLS-1$
-        data = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
-        _listenRemoveButton.setLayoutData(data);
-        _listenRemoveButton.addSelectionListener(new SelectionAdapter()
-        {
-            public void widgetSelected(SelectionEvent e)
-            {
-                IStructuredSelection selection = (IStructuredSelection) _listenersViewer.getSelection();
-                if (selection != null)
-                {
-                    for (Iterator i = selection.iterator(); i.hasNext();)
-                    {
-                        IDOMElement node = (IDOMElement) i.next();
-                        RemoveSubNodeCommand c = new RemoveSubNodeCommand(SectionResources
-                                .getString("JSFHtmlInputTextSection.CommandLabel.RemoveSubTag"), _element, node); //$NON-NLS-1$
-                        c.execute();
-                    }
-                    _listenersViewer.refresh();
-                    updateListenButtonStatus();
-                }
-            }
-        });
-    }
-
-    /**
-     * @param factory
-     * @param other
-     */
-    private void createValidatePart(TabbedPropertySheetWidgetFactory factory, Composite other)
-    {
-        GridData data;
-        _validatorsTable = factory.createTable(other, SWT.FULL_SELECTION | SWT.MULTI);
-        data = new GridData(GridData.FILL_BOTH);
-        data.horizontalSpan = 3;
-        data.verticalSpan = 3;
-        data.heightHint = 50;
-        _validatorsTable.setHeaderVisible(true);
-        _validatorsTable.setLayoutData(data);
-        _validatorsTable.setLinesVisible(true);
-
-        TableColumn validateColumn = new TableColumn(_validatorsTable, SWT.NONE);
-        validateColumn.setText(SectionResources.getString("JSFHtmlInputTextSection.Validators")); //$NON-NLS-1$
-        validateColumn.setWidth(150);
-
-        TableColumn minColumn = new TableColumn(_validatorsTable, SWT.NONE);
-        minColumn.setText(SectionResources.getString("JSFHtmlInputTextSection.Minimum")); //$NON-NLS-1$
-        minColumn.setWidth(100);
-
-        TableColumn maxColumn = new TableColumn(_validatorsTable, SWT.NONE);
-        maxColumn.setText(SectionResources.getString("JSFHtmlInputTextSection.Maximum")); //$NON-NLS-1$
-        maxColumn.setWidth(100);
-
-        _validatorsViewer = new TableViewer(_validatorsTable);
-        _validatorsViewer.setColumnProperties(VALIDATORS_COLUMN_NAMES);
-
-        CellEditor[] editors = new CellEditor[VALIDATORS_COLUMN_NAMES.length];
-        TextCellEditor textEditor = new TextCellEditor(_validatorsTable);
-        editors[0] = textEditor;
-        textEditor = new TextCellEditor(_validatorsTable);
-        editors[1] = textEditor;
-        textEditor = new TextCellEditor(_validatorsTable);
-        editors[2] = textEditor;
-
-        _validatorsViewer.setCellEditors(editors);
-        _validatorsViewer.setCellModifier(new ValidateCellModifier());
-        _validatorsViewer.setContentProvider(new ValidateContentLabelProvider());
-        _validatorsViewer.setLabelProvider(new ValidateContentLabelProvider());
-        _validatorsViewer.addDoubleClickListener(new IDoubleClickListener()
-        {
-            public void doubleClick(DoubleClickEvent event)
-            {
-                IStructuredSelection selection = (IStructuredSelection) event.getSelection();
-                if (selection != null)
-                {
-                    IDOMElement node = (IDOMElement) selection.getFirstElement();
-                    gotoNode(node);
-                }
-            }
-        });
-        _validatorsViewer.addSelectionChangedListener(new ISelectionChangedListener()
-        {
-            public void selectionChanged(SelectionChangedEvent event)
-            {
-                updateValidateButtonStatus();
-            }
-        });
-
-        _validateTypeCombo = factory.createCCombo(other, SWT.READ_ONLY);
-        _validateTypeCombo.setItems(VALIDATETYPES);
-        _validateTypeCombo.select(0);
-        data = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
-        _validateTypeCombo.setLayoutData(data);
-
-        _validateAddButton = factory.createButton(other, SectionResources.getString("JSFHtmlInputTextSection.Add"), //$NON-NLS-1$
-                SWT.NONE);
-        data = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
-        _validateAddButton.setLayoutData(data);
-        _validateAddButton.addSelectionListener(new SelectionAdapter()
-        {
-            public void widgetSelected(SelectionEvent e)
-            {
-                Map attributes = new HashMap();
-                AddSubNodeCommand c = new AddSubNodeCommand(SectionResources
-                        .getString("JSFHtmlInputTextSection.CommandLabel.AddSubTag"), _element, "validate" //$NON-NLS-1$ //$NON-NLS-2$
-                        + _validateTypeCombo.getText(), ITLDConstants.URI_JSF_CORE, attributes);
-                c.execute();
-                _validatorsViewer.refresh();
-                updateValidateButtonStatus();
-            }
-        });
-        _validateRemoveButton = factory.createButton(other, SectionResources
-                .getString("JSFHtmlInputTextSection.Remove"), SWT.NONE); //$NON-NLS-1$
-        data = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
-        _validateRemoveButton.setLayoutData(data);
-        _validateRemoveButton.addSelectionListener(new SelectionAdapter()
-        {
-            public void widgetSelected(SelectionEvent e)
-            {
-                IStructuredSelection selection = (IStructuredSelection) _validatorsViewer.getSelection();
-                if (selection != null)
-                {
-                    for (Iterator i = selection.iterator(); i.hasNext();)
-                    {
-                        IDOMElement node = (IDOMElement) i.next();
-                        RemoveSubNodeCommand c = new RemoveSubNodeCommand(SectionResources
-                                .getString("JSFHtmlInputTextSection.CommandLabel.RemoveSubTag"), _element, node); //$NON-NLS-1$
-                        c.execute();
-                    }
-                    _validatorsViewer.refresh();
-                    updateValidateButtonStatus();
-                }
-            }
-        });
-    }
-
-    private void updateValidateButtonStatus()
-    {
-        _validateRemoveButton.setEnabled(true);
-        ISelection selection = _validatorsViewer.getSelection();
-        if (selection == null || selection.isEmpty())
-        {
-            _validateRemoveButton.setEnabled(false);
-        }
-        if (_validatorsTable.getItemCount() == 0)
-        {
-            _validateRemoveButton.setEnabled(false);
-        }
-    }
-
-    private void updateConvertButtonStatus()
-    {
-        _convertAddButton.setEnabled(true);
-        _convertRemoveButton.setEnabled(true);
-        ISelection selection = _convertorsViewer.getSelection();
-        if (selection == null || selection.isEmpty())
-        {
-            _convertRemoveButton.setEnabled(false);
-        }
-        if (_convertorsTable.getItemCount() == 0)
-        {
-            _convertRemoveButton.setEnabled(false);
-        }
-        if (_convertorsTable.getItemCount() > 0)
-        {
-            _convertAddButton.setEnabled(false);
-        }
-    }
-
-    private void updateListenButtonStatus()
-    {
-        _listenRemoveButton.setEnabled(true);
-        ISelection selection = _listenersViewer.getSelection();
-        if (selection == null || selection.isEmpty())
-        {
-            _listenRemoveButton.setEnabled(false);
-        }
-        if (_listenersTable.getItemCount() == 0)
-        {
-            _listenRemoveButton.setEnabled(false);
-        }
-    }
-
-    public void setInput(IWorkbenchPart part, ISelection selection)
-    {
-        super.setInput(part, selection);
-
-        _validatorsViewer.setInput(_element);
-        updateValidateButtonStatus();
-
-        _convertorsViewer.setInput(_element);
-        updateConvertButtonStatus();
-
-        _listenersViewer.setInput(_element);
-        updateListenButtonStatus();
-    }
-
-    private List getColumnNames()
-    {
-        return Arrays.asList(VALIDATORS_COLUMN_NAMES);
-    }
-
-    protected void notifyChanged(INodeNotifier notifier, int eventType, Object changedFeature, Object oldValue, Object newValue, int pos)
-    {
-        if(_validatorsViewer != null && !_validatorsViewer.getControl().isDisposed())
-        {
-            _validatorsViewer.refresh();
-            _convertorsViewer.refresh();
-            _listenersViewer.refresh();
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlInputSecretTypeSection.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlInputSecretTypeSection.java
deleted file mode 100644
index 76b49ea..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlInputSecretTypeSection.java
+++ /dev/null
@@ -1,165 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.sections;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogFieldApplyListener;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.LayoutUtil;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.RadiosDialogField;
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.commands.single.ChangeTagCommand;
-import org.eclipse.jst.pagedesigner.properties.BaseCustomSection;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetWidgetFactory;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class JSFHtmlInputSecretTypeSection extends BaseCustomSection
-{
-    private RadiosDialogField     _typesField;
-
-    final private static String[] TYPES    = { SectionResources.getString("JSFHtmlInputHiddenSection.Type0"), //$NON-NLS-1$
-                                           SectionResources.getString("JSFHtmlInputHiddenSection.Type1"), //$NON-NLS-1$
-                                           SectionResources.getString("JSFHtmlInputHiddenSection.Type2"), //$NON-NLS-1$
-                                           SectionResources.getString("JSFHtmlInputHiddenSection.Type3") //$NON-NLS-1$
-                                           };
-
-    /**
-     * The default constructor
-     */
-    public JSFHtmlInputSecretTypeSection()
-    {
-        super();
-        _typesField = new RadiosDialogField();
-        _typesField.setLabelText(SectionResources.getString("JSFHtmlInputHiddenSection.Type")); //$NON-NLS-1$
-        _typesField.setItems(TYPES);
-        _typesField.setDialogFieldApplyListener(new IDialogFieldApplyListener()
-        {
-            public void dialogFieldApplied(DialogField field)
-            {
-                int type = _typesField.getSelectedIndex();
-                String prefix = _element.getPrefix();
-                String localTag = toLocalTag(type);
-                String newtag = prefix + ":" + localTag; //$NON-NLS-1$
-                Map attrs = new HashMap();
-                if (type == IInputWidgetTypes.TEXTAREA)
-                {
-                    // need to change "size" attribute to "cols"
-                    String size = _element.getAttribute(IJSFConstants.ATTR_SIZE);
-                    if (size != null && size.length() != 0)
-                    {
-                        attrs.put(IJSFConstants.ATTR_SIZE, null);
-                        attrs.put(IJSFConstants.ATTR_COLS, size);
-                    }
-                }
-                else
-                {
-                    // need to change "cols" attribute to "size"
-                    String size = _element.getAttribute(IJSFConstants.ATTR_COLS);
-                    if (size != null && size.length() != 0)
-                    {
-                        attrs.put(IJSFConstants.ATTR_COLS, null);
-                        attrs.put(IJSFConstants.ATTR_SIZE, size);
-                    }
-                }
-                ChangeTagCommand c = new ChangeTagCommand(SectionResources
-                        .getString("JSFHtmlInputHidden.CommandLabel.ChangeType"), _element, newtag, attrs, true); //$NON-NLS-1$
-                c.execute();
-                _element = c.getNewElement();
-            }
-        });
-    }
-
-    public void createControls(Composite parent, TabbedPropertySheetPage aTabbedPropertySheetPage)
-    {
-        super.createControls(parent, aTabbedPropertySheetPage);
-        TabbedPropertySheetWidgetFactory factory = aTabbedPropertySheetPage.getWidgetFactory();
-        Composite top = factory.createFlatFormComposite(parent);
-
-        int numberOfColumns = _typesField.getNumberOfControls();
-        GridLayout layout = new GridLayout(numberOfColumns, false);
-        top.setLayout(layout);
-
-        _typesField.doFillIntoGrid(factory, top, numberOfColumns);
-        LayoutUtil.setGrabHorizontal(_typesField.getGroup(factory, top), true);
-    }
-
-    private String toLocalTag(int type)
-    {
-        switch (type)
-        {
-            case IInputWidgetTypes.SECRET:
-                return IJSFConstants.TAG_INPUTSECRET;
-            case IInputWidgetTypes.HIDDEN:
-                return IJSFConstants.TAG_INPUTHIDDEN;
-            case IInputWidgetTypes.TEXTAREA:
-                return IJSFConstants.TAG_INPUTTEXTAREA;
-            case IInputWidgetTypes.TEXT:
-                return IJSFConstants.TAG_INPUTTEXT;
-            default:
-                return IJSFConstants.TAG_INPUTHIDDEN;
-        }
-    }
-
-    public void setInput(IWorkbenchPart part, ISelection selection)
-    {
-        super.setInput(part, selection);
-        _typesField.setSelectedIndexWithoutUpdate(getInputType());
-    }
-
-    /**
-     * @return the input type
-     */
-    public int getInputType()
-    {
-        String localTag = _element.getLocalName();
-        if (IJSFConstants.TAG_INPUTTEXT.equals(localTag))
-        {
-            return IInputWidgetTypes.TEXT;
-        }
-        else if (IJSFConstants.TAG_INPUTSECRET.equals(localTag))
-        {
-            return IInputWidgetTypes.SECRET;
-        }
-        else if (IJSFConstants.TAG_INPUTHIDDEN.equals(localTag))
-        {
-            return IInputWidgetTypes.HIDDEN;
-        }
-        else if (IJSFConstants.TAG_INPUTTEXTAREA.equals(localTag))
-        {
-            return IInputWidgetTypes.TEXTAREA;
-        }
-        else
-        {
-            return IInputWidgetTypes.HIDDEN;
-        }
-    }
-
-    protected void notifyChanged(INodeNotifier notifier, int eventType, Object changedFeature, Object oldValue,
-            Object newValue, int pos)
-    {
-        if (_typesField != null)
-        {
-            _typesField.setSelectedIndexWithoutUpdate(getInputType());
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlInputTextTypeSection.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlInputTextTypeSection.java
deleted file mode 100644
index 26befdf..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlInputTextTypeSection.java
+++ /dev/null
@@ -1,166 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.sections;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogFieldApplyListener;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.LayoutUtil;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.RadiosDialogField;
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.commands.single.ChangeTagCommand;
-import org.eclipse.jst.pagedesigner.properties.BaseCustomSection;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetWidgetFactory;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class JSFHtmlInputTextTypeSection extends BaseCustomSection
-{
-    private RadiosDialogField     _typesField;
-
-    final private static String[] TYPES    = { SectionResources.getString("JSFHtmlInputHiddenSection.Type0"), //$NON-NLS-1$
-                                           SectionResources.getString("JSFHtmlInputHiddenSection.Type1"), //$NON-NLS-1$
-                                           SectionResources.getString("JSFHtmlInputHiddenSection.Type2"), //$NON-NLS-1$
-                                           SectionResources.getString("JSFHtmlInputHiddenSection.Type3") //$NON-NLS-1$
-                                           };
-
-    /**
-     * The default constructor 
-     */
-    public JSFHtmlInputTextTypeSection()
-    {
-        super();
-        _typesField = new RadiosDialogField();
-        _typesField.setLabelText(SectionResources.getString("JSFHtmlInputHiddenSection.Type")); //$NON-NLS-1$
-        _typesField.setItems(TYPES);
-        _typesField.setDialogFieldApplyListener(new IDialogFieldApplyListener()
-        {
-            public void dialogFieldApplied(DialogField field)
-            {
-                int type = _typesField.getSelectedIndex();
-                String prefix = _element.getPrefix();
-                String localTag = toLocalTag(type);
-                String newtag = prefix + ":" + localTag; //$NON-NLS-1$
-                Map attrs = new HashMap();
-                if (type == IInputWidgetTypes.TEXTAREA)
-                {
-                    // need to change "size" attribute to "cols"
-                    String size = _element.getAttribute(IJSFConstants.ATTR_SIZE);
-                    if (size != null && size.length() != 0)
-                    {
-                        attrs.put(IJSFConstants.ATTR_SIZE, null);
-                        attrs.put(IJSFConstants.ATTR_COLS, size);
-                    }
-                }
-                else
-                {
-                    //          need to change "cols" attribute to "size"
-                    String size = _element.getAttribute(IJSFConstants.ATTR_COLS);
-                    if (size != null && size.length() != 0)
-                    {
-                        attrs.put(IJSFConstants.ATTR_COLS, null);
-                        attrs.put(IJSFConstants.ATTR_SIZE, size);
-                    }
-                }
-                ChangeTagCommand c = new ChangeTagCommand(SectionResources
-                        .getString("JSFHtmlInputHidden.CommandLabel.ChangeType"), _element, newtag, attrs, true); //$NON-NLS-1$
-                c.execute();
-                _element = c.getNewElement();
-            }
-        });
-    }
-
-    public void createControls(Composite parent, TabbedPropertySheetPage aTabbedPropertySheetPage)
-    {
-        super.createControls(parent, aTabbedPropertySheetPage);
-        TabbedPropertySheetWidgetFactory factory = aTabbedPropertySheetPage.getWidgetFactory();
-        Composite top = factory.createFlatFormComposite(parent);
-
-        int numberOfColumns = _typesField.getNumberOfControls();
-        GridLayout layout = new GridLayout(numberOfColumns, false);
-        top.setLayout(layout);
-
-        _typesField.doFillIntoGrid(factory, top, numberOfColumns);
-        LayoutUtil.setGrabHorizontal(_typesField.getGroup(factory, top), true);
-    }
-
-    private String toLocalTag(int type)
-    {
-        switch (type)
-        {
-            case IInputWidgetTypes.SECRET:
-                return IJSFConstants.TAG_INPUTSECRET;
-            case IInputWidgetTypes.HIDDEN:
-                return IJSFConstants.TAG_INPUTHIDDEN;
-            case IInputWidgetTypes.TEXTAREA:
-                return IJSFConstants.TAG_INPUTTEXTAREA;
-            case IInputWidgetTypes.TEXT:
-                return IJSFConstants.TAG_INPUTTEXT;
-            default:
-                return IJSFConstants.TAG_INPUTHIDDEN;
-        }
-    }
-
-    public void setInput(IWorkbenchPart part, ISelection selection)
-    {
-        super.setInput(part, selection);
-
-        _typesField.setSelectedIndexWithoutUpdate(getInputType());
-    }
-
-    /**
-     * @return the input type. One of IInputWidgetTypes.
-     */
-    public int getInputType()
-    {
-        String localTag = _element.getLocalName();
-        if (IJSFConstants.TAG_INPUTTEXT.equals(localTag))
-        {
-            return IInputWidgetTypes.TEXT;
-        }
-        else if (IJSFConstants.TAG_INPUTSECRET.equals(localTag))
-        {
-            return IInputWidgetTypes.SECRET;
-        }
-        else if (IJSFConstants.TAG_INPUTHIDDEN.equals(localTag))
-        {
-            return IInputWidgetTypes.HIDDEN;
-        }
-        else if (IJSFConstants.TAG_INPUTTEXTAREA.equals(localTag))
-        {
-            return IInputWidgetTypes.TEXTAREA;
-        }
-        else
-        {
-            return IInputWidgetTypes.HIDDEN;
-        }
-    }
-
-    protected void notifyChanged(INodeNotifier notifier, int eventType, Object changedFeature, Object oldValue,
-            Object newValue, int pos)
-    {
-        if (_typesField != null)
-        {
-            _typesField.setSelectedIndexWithoutUpdate(getInputType());
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlInputTextareaTypeSection.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlInputTextareaTypeSection.java
deleted file mode 100644
index 5696ccc..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlInputTextareaTypeSection.java
+++ /dev/null
@@ -1,168 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.sections;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogFieldApplyListener;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.LayoutUtil;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.RadiosDialogField;
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.commands.single.ChangeTagCommand;
-import org.eclipse.jst.pagedesigner.properties.BaseCustomSection;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetWidgetFactory;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-
-/**
- * FIXME: there is a lot of copied code for this input sections
- * @author mengbo
- * @version 1.5
- */
-public class JSFHtmlInputTextareaTypeSection extends BaseCustomSection
-{
-    private RadiosDialogField     _typesField;
-
-    final private static String[] TYPES    = { SectionResources.getString("JSFHtmlInputHiddenSection.Type0"), //$NON-NLS-1$
-                                           SectionResources.getString("JSFHtmlInputHiddenSection.Type1"), //$NON-NLS-1$
-                                           SectionResources.getString("JSFHtmlInputHiddenSection.Type2"), //$NON-NLS-1$
-                                           SectionResources.getString("JSFHtmlInputHiddenSection.Type3") //$NON-NLS-1$
-                                           };
-
-    /**
-     * The default constructor 
-     */
-    public JSFHtmlInputTextareaTypeSection()
-    {
-        super();
-        _typesField = new RadiosDialogField();
-        _typesField.setLabelText(SectionResources.getString("JSFHtmlInputHiddenSection.Type")); //$NON-NLS-1$
-        _typesField.setItems(TYPES);
-        _typesField.setDialogFieldApplyListener(new IDialogFieldApplyListener()
-        {
-            public void dialogFieldApplied(DialogField field)
-            {
-                int type = _typesField.getSelectedIndex();
-                String prefix = _element.getPrefix();
-                String localTag = toLocalTag(type);
-                String newtag = prefix + ":" + localTag; //$NON-NLS-1$
-                Map attrs = new HashMap();
-                if (type == IInputWidgetTypes.TEXTAREA)
-                {
-                    // need to change "size" attribute to "cols"
-                    String size = _element.getAttribute(IJSFConstants.ATTR_SIZE);
-                    if (size != null && size.length() != 0)
-                    {
-                        attrs.put(IJSFConstants.ATTR_SIZE, null);
-                        attrs.put(IJSFConstants.ATTR_COLS, size);
-                    }
-                }
-                else
-                {
-                    // need to change "cols" attribute to "size"
-                    String size = _element.getAttribute(IJSFConstants.ATTR_COLS);
-                    if (size != null && size.length() != 0)
-                    {
-                        attrs.put(IJSFConstants.ATTR_COLS, null);
-                        attrs.put(IJSFConstants.ATTR_SIZE, size);
-                    }
-                }
-                ChangeTagCommand c = new ChangeTagCommand(SectionResources
-                        .getString("JSFHtmlInputHidden.CommandLabel.ChangeType"), _element, newtag, attrs, true); //$NON-NLS-1$
-                c.execute();
-                _element = c.getNewElement();
-            }
-        });
-    }
-
-    public void createControls(Composite parent, TabbedPropertySheetPage aTabbedPropertySheetPage)
-    {
-        super.createControls(parent, aTabbedPropertySheetPage);
-        TabbedPropertySheetWidgetFactory factory = aTabbedPropertySheetPage.getWidgetFactory();
-        Composite top = factory.createFlatFormComposite(parent);
-
-        int numberOfColumns = _typesField.getNumberOfControls();
-        GridLayout layout = new GridLayout(numberOfColumns, false);
-        top.setLayout(layout);
-
-        _typesField.doFillIntoGrid(factory, top, numberOfColumns);
-        LayoutUtil.setGrabHorizontal(_typesField.getGroup(factory, top), true);
-    }
-
-    private String toLocalTag(int type)
-    {
-        switch (type)
-        {
-            case IInputWidgetTypes.SECRET:
-                return IJSFConstants.TAG_INPUTSECRET;
-            case IInputWidgetTypes.HIDDEN:
-                return IJSFConstants.TAG_INPUTHIDDEN;
-            case IInputWidgetTypes.TEXTAREA:
-                return IJSFConstants.TAG_INPUTTEXTAREA;
-            case IInputWidgetTypes.TEXT:
-                return IJSFConstants.TAG_INPUTTEXT;
-            default:
-                return IJSFConstants.TAG_INPUTHIDDEN;
-        }
-    }
-
-    public void setInput(IWorkbenchPart part, ISelection selection)
-    {
-        super.setInput(part, selection);
-
-        _typesField.setSelectedIndexWithoutUpdate(getInputType());
-    }
-
-    /**
-     * @return one of IInputWidgetTypes
-     */
-    public int getInputType()
-    {
-        String localTag = _element.getLocalName();
-        if (IJSFConstants.TAG_INPUTTEXT.equals(localTag))
-        {
-            return IInputWidgetTypes.TEXT;
-        }
-        else if (IJSFConstants.TAG_INPUTSECRET.equals(localTag))
-        {
-            return IInputWidgetTypes.SECRET;
-        }
-        else if (IJSFConstants.TAG_INPUTHIDDEN.equals(localTag))
-        {
-            return IInputWidgetTypes.HIDDEN;
-        }
-        else if (IJSFConstants.TAG_INPUTTEXTAREA.equals(localTag))
-        {
-            return IInputWidgetTypes.TEXTAREA;
-        }
-        else
-        {
-            return IInputWidgetTypes.HIDDEN;
-        }
-    }
-
-    protected void notifyChanged(INodeNotifier notifier, int eventType, Object changedFeature, Object oldValue,
-            Object newValue, int pos)
-    {
-        if (_typesField != null)
-        {
-            _typesField.setSelectedIndexWithoutUpdate(getInputType());
-        }
-
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlOutputFormatParamsSection.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlOutputFormatParamsSection.java
deleted file mode 100644
index 1d307cf..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlOutputFormatParamsSection.java
+++ /dev/null
@@ -1,401 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.sections;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jface.viewers.DoubleClickEvent;
-import org.eclipse.jface.viewers.ICellModifier;
-import org.eclipse.jface.viewers.IDoubleClickListener;
-import org.eclipse.jface.viewers.ILabelProviderListener;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.ITableLabelProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.TextCellEditor;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.commands.single.AddSubNodeCommand;
-import org.eclipse.jst.pagedesigner.commands.single.ChangeAttributeCommand;
-import org.eclipse.jst.pagedesigner.commands.single.RemoveSubNodeCommand;
-import org.eclipse.jst.pagedesigner.properties.BaseCustomSection;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.swt.widgets.TableItem;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetWidgetFactory;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class JSFHtmlOutputFormatParamsSection extends BaseCustomSection
-{
-    private Table                  _paramTable;
-    private TableViewer            _paramViewer;
-    private Button                 _paramAddButton, _paramRemoveButton;
-
-    private String[]               _columnNames = 
-    {
-        "name", "value" //$NON-NLS-1$ //$NON-NLS-2$
-    }
-    ;
-
-    private class ParamCotentLabelProvider implements IStructuredContentProvider, ITableLabelProvider
-    {
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-         */
-        public Object[] getElements(Object inputElement)
-        {
-            IDOMElement root = _element;
-            List result = new ArrayList();
-
-            NodeList children = root.getChildNodes();
-            for (int i = 0, n = children.getLength(); i < n; i++)
-            {
-                Node child = children.item(i);
-                if (child.getNodeType() == Node.ELEMENT_NODE)
-                {
-                    IDOMElement element = (IDOMElement) child;
-                    String nodeName = element.getNodeName();
-                    if (nodeName.indexOf("param") != -1) //$NON-NLS-1$
-                    {
-                        result.add(child);
-                    }
-                }
-            }
-
-            if (result.isEmpty())
-            {
-                return new Object[0];
-            }
-
-            return result.toArray(new IDOMElement[result.size()]);
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
-         */
-        public void inputChanged(Viewer viewer, Object oldInput, Object newInput)
-        {
-            // do nothing
-        }
-
-        public String getColumnText(Object element, int columnIndex)
-        {
-            String result = null;
-            if (element instanceof IDOMElement)
-            {
-                IDOMElement node = (IDOMElement) element;
-                switch (columnIndex)
-                {
-                    case 0:
-                        result = node.getAttribute(IJSFConstants.ATTR_NAME);
-                        break;
-                    case 1:
-                        result = node.getAttribute(IJSFConstants.ATTR_VALUE);
-                        break;
-                    default:
-                        break;
-                }
-            }
-            return result != null ? result : ""; //$NON-NLS-1$
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-         */
-
-        public void dispose()
-        {
-            // nothing to dispose
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnImage(java.lang.Object, int)
-         */
-        public Image getColumnImage(Object element, int columnIndex)
-        {
-            return null;
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.IBaseLabelProvider#addListener(org.eclipse.jface.viewers.ILabelProviderListener)
-         */
-        public void addListener(ILabelProviderListener listener)
-        {
-            // TODO: no support for listeners?
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.IBaseLabelProvider#isLabelProperty(java.lang.Object, java.lang.String)
-         */
-        public boolean isLabelProperty(Object element, String property)
-        {
-            return false;
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.IBaseLabelProvider#removeListener(org.eclipse.jface.viewers.ILabelProviderListener)
-         */
-        public void removeListener(ILabelProviderListener listener)
-        {
-            // TODO: no support for listeners?
-        }
-    }
-
-    private class ParamCellModifier implements ICellModifier
-    {
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.ICellModifier#canModify(java.lang.Object, java.lang.String)
-         */
-        public boolean canModify(Object element, String property)
-        {
-            return true;
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.ICellModifier#getValue(java.lang.Object, java.lang.String)
-         */
-        public Object getValue(Object element, String property)
-        {
-            int columnIndex = getColumnNames().indexOf(property);
-
-            Object result = null;
-            IDOMElement node = (IDOMElement) element;
-            switch (columnIndex)
-            {
-                case 0: // Name
-                    result = node.getAttribute(IJSFConstants.ATTR_NAME);
-                    break;
-                case 1: // Value
-                    result = node.getAttribute(IJSFConstants.ATTR_VALUE);
-                    break;
-                default:
-                    result = ""; //$NON-NLS-1$
-            }
-            return result != null ? result : ""; //$NON-NLS-1$
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.ICellModifier#modify(java.lang.Object, java.lang.String, java.lang.Object)
-         */
-        public void modify(Object element, String property, Object value)
-        {
-            int columnIndex = getColumnNames().indexOf(property);
-
-            TableItem item = (TableItem) element;
-            IDOMElement node = (IDOMElement) item.getData();
-            String valueString;
-            ChangeAttributeCommand c;
-            switch (columnIndex)
-            {
-                case 0: // Name 
-                    valueString = ((String) value).trim();
-                    c = new ChangeAttributeCommand(SectionResources.getString("JSFHtmlOutputFormatSection.CommandLabel.ChangeAttribute"), node, IJSFConstants.ATTR_NAME, valueString); //$NON-NLS-1$
-                    c.execute();
-                    break;
-                case 1: // Value 
-                    valueString = ((String) value).trim();
-                    c = new ChangeAttributeCommand(SectionResources.getString("JSFHtmlOutputFormatSection.CommandLabel.ChangeAttribute"), node, IJSFConstants.ATTR_VALUE, valueString); //$NON-NLS-1$
-                    c.execute();
-                    break;
-                default:
-                    break;
-            }
-            _paramViewer.setInput(_element);
-            // TODO: does nothing updateParamButtonStatus();
-        }
-    }
-
-    /**
-     * Default constructor
-     */
-    public JSFHtmlOutputFormatParamsSection()
-    {
-        super();
-    }
-
-    public void createControls(Composite parent, TabbedPropertySheetPage aTabbedPropertySheetPage)
-    {
-        super.createControls(parent, aTabbedPropertySheetPage);
-        TabbedPropertySheetWidgetFactory factory = aTabbedPropertySheetPage.getWidgetFactory();
-        Composite top = factory.createFlatFormComposite(parent);
-
-        GridLayout layout = new GridLayout();
-        layout.numColumns = 4;
-        top.setLayout(layout);
-
-        createParamPart(factory, top);
-    }
-
-    /**
-     * @param factory
-     * @param other
-     */
-    private void createParamPart(TabbedPropertySheetWidgetFactory factory, Composite other)
-    {
-        GridData data;
-
-        Label label = factory.createLabel(other, SectionResources.getString("JSFHtmlOutputFormatSection.Parameters")); //$NON-NLS-1$
-        data = new GridData(GridData.FILL);
-        data.horizontalSpan = 4;
-        label.setLayoutData(data);
-
-        _paramTable = factory.createTable(other, SWT.FULL_SELECTION | SWT.MULTI);
-        data = new GridData(GridData.FILL_BOTH);
-        data.horizontalSpan = 3;
-        data.verticalSpan = 3;
-        data.heightHint = 50;
-        _paramTable.setHeaderVisible(true);
-        _paramTable.setLinesVisible(true);
-        _paramTable.setLayoutData(data);
-
-        TableColumn column = new TableColumn(_paramTable, SWT.NONE);
-        column.setText(SectionResources.getString("JSFHtmlOutputFormatSection.ColName")); //$NON-NLS-1$
-        column.setWidth(100);
-
-        column = new TableColumn(_paramTable, SWT.NONE);
-        column.setText(SectionResources.getString("JSFHtmlOutputFormatSection.ColValue")); //$NON-NLS-1$
-        column.setWidth(100);
-
-        _paramViewer = new TableViewer(_paramTable);
-        _paramViewer.setColumnProperties(_columnNames);
-
-        CellEditor[] editors = new CellEditor[_columnNames.length];
-        TextCellEditor textEditor = new TextCellEditor(_paramTable);
-        editors[0] = textEditor;
-        textEditor = new TextCellEditor(_paramTable);
-        editors[1] = textEditor;
-
-        _paramViewer.setCellEditors(editors);
-        _paramViewer.setCellModifier(new ParamCellModifier());
-        _paramViewer.setContentProvider(new ParamCotentLabelProvider());
-        _paramViewer.setLabelProvider(new ParamCotentLabelProvider());
-        _paramViewer.addDoubleClickListener(new IDoubleClickListener()
-        {
-            public void doubleClick(DoubleClickEvent event)
-            {
-                IStructuredSelection selection = (IStructuredSelection) event.getSelection();
-                if (selection != null)
-                {
-                    IDOMElement node = (IDOMElement) selection.getFirstElement();
-                    gotoNode(node);
-                }
-            }
-        }
-        );
-        _paramViewer.addSelectionChangedListener(new ISelectionChangedListener()
-        {
-            public void selectionChanged(SelectionChangedEvent event)
-            {
-//              TODO: does nothing updateParamButtonStatus();
-            }
-        }
-        );
-
-        _paramAddButton = factory.createButton(other, SectionResources.getString("JSFHtmlOutputTextSection.Add"), //$NON-NLS-1$
-        SWT.NONE);
-        data = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
-        _paramAddButton.setLayoutData(data);
-        _paramAddButton.addSelectionListener(new SelectionAdapter()
-        {
-            public void widgetSelected(SelectionEvent e)
-            {
-                Map attributes = new HashMap();
-                attributes.put(IJSFConstants.ATTR_NAME, "name"); //$NON-NLS-1$
-                attributes.put(IJSFConstants.ATTR_VALUE, "value"); //$NON-NLS-1$
-                AddSubNodeCommand c = new AddSubNodeCommand(SectionResources.getString("JSFHtmlOutputFormatSection.CommandLabel.AddSubTag"), _element, "param", //$NON-NLS-1$ //$NON-NLS-2$
-                ITLDConstants.URI_JSF_CORE, attributes);
-                c.execute();
-                _paramViewer.refresh();
-//              TODO: does nothing updateParamButtonStatus();
-            }
-        }
-        );
-        _paramRemoveButton = factory.createButton(other, SectionResources.getString("JSFHtmlOutputTextSection.Remove"), //$NON-NLS-1$
-        SWT.NONE);
-        data = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
-        _paramRemoveButton.setLayoutData(data);
-        _paramRemoveButton.addSelectionListener(new SelectionAdapter()
-        {
-            public void widgetSelected(SelectionEvent e)
-            {
-                IStructuredSelection selection = (IStructuredSelection) _paramViewer.getSelection();
-                if (selection != null)
-                {
-                    for (Iterator i = selection.iterator(); i.hasNext();)
-                    {
-                        IDOMElement node = (IDOMElement) i.next();
-                        RemoveSubNodeCommand c = new RemoveSubNodeCommand(SectionResources.getString("JSFHtmlOutputFormatSection.CommandLabel.RemoveSubTag"), _element, node); //$NON-NLS-1$
-                        c.execute();
-                    }
-                    _paramViewer.refresh();
-//                  TODO: does nothing updateParamButtonStatus();
-                }
-            }
-        }
-        );
-    }
-    
-    // TODO: does nothing
-//    private void updateParamButtonStatus()
-//    {
-//    }
-    
-    public void setInput(IWorkbenchPart part, ISelection selection)
-    {
-        super.setInput(part, selection);
-
-        _paramViewer.setInput(_element);
-//      TODO: does nothing updateParamButtonStatus();
-    }
-    
-    private List getColumnNames()
-    {
-        return Arrays.asList(_columnNames);
-    }
-
-    protected void notifyChanged(INodeNotifier notifier, int eventType, Object changedFeature, Object oldValue, Object newValue, int pos)
-    {
-        if(_paramViewer != null && !_paramViewer.getControl().isDisposed())
-        {
-            _paramViewer.refresh();
-        }
-        
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlOutputTextConverterSection.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlOutputTextConverterSection.java
deleted file mode 100644
index 718dddc..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlOutputTextConverterSection.java
+++ /dev/null
@@ -1,321 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.sections;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.jface.viewers.DoubleClickEvent;
-import org.eclipse.jface.viewers.IDoubleClickListener;
-import org.eclipse.jface.viewers.ILabelProviderListener;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.ITableLabelProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.commands.single.AddSubNodeCommand;
-import org.eclipse.jst.pagedesigner.commands.single.RemoveSubNodeCommand;
-import org.eclipse.jst.pagedesigner.properties.BaseCustomSection;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.CCombo;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetWidgetFactory;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class JSFHtmlOutputTextConverterSection extends BaseCustomSection
-{
-    private Table                  _convertTable;
-    private TableViewer            _convertViewer;
-    private Button                 _convertAddButton, _convertRemoveButton;
-    private CCombo                 _convertTypeCombo;
-    final private static String[]  CONVERTTYPES = 
-    {
-        "DateTime", "Number" //$NON-NLS-1$ //$NON-NLS-2$
-    }
-    ;
-    
-    private class ConvertCotentLabelProvider implements IStructuredContentProvider, ITableLabelProvider
-    {
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-         */
-        public Object[] getElements(Object inputElement)
-        {
-            IDOMElement root = _element;
-            List result = new ArrayList();
-
-            NodeList children = root.getChildNodes();
-            for (int i = 0, n = children.getLength(); i < n; i++)
-            {
-                Node child = children.item(i);
-                if (child.getNodeType() == Node.ELEMENT_NODE)
-                {
-                    IDOMElement element = (IDOMElement) child;
-                    String nodeName = element.getNodeName();
-                    if (nodeName.indexOf("convert") != -1) //$NON-NLS-1$
-                    {
-                        result.add(child);
-                    }
-                }
-            }
-
-            if (result.isEmpty())
-            {
-                return new Object[0];
-            }
-
-            return result.toArray(new IDOMElement[result.size()]);
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
-         */
-        public void inputChanged(Viewer viewer, Object oldInput, Object newInput)
-        {
-            // do nothing
-        }
-
-        public String getColumnText(Object element, int columnIndex)
-        {
-            String result = null;
-            if (element instanceof IDOMElement)
-            {
-                IDOMElement node = (IDOMElement) element;
-                String nodeName = node.getNodeName();
-                switch (columnIndex)
-                {
-                    case 0:
-                        result = nodeName;
-                        break;
-                    default:
-                        break;
-                }
-            }
-            return result != null ? result : ""; //$NON-NLS-1$
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-         */
-
-        public void dispose()
-        {
-            // nothing to dispose
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnImage(java.lang.Object, int)
-         */
-        public Image getColumnImage(Object element, int columnIndex)
-        {
-            return null;
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.IBaseLabelProvider#addListener(org.eclipse.jface.viewers.ILabelProviderListener)
-         */
-        public void addListener(ILabelProviderListener listener)
-        {
-            // TODO: no support for listeners?
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.IBaseLabelProvider#isLabelProperty(java.lang.Object, java.lang.String)
-         */
-        public boolean isLabelProperty(Object element, String property)
-        {
-            return false;
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.IBaseLabelProvider#removeListener(org.eclipse.jface.viewers.ILabelProviderListener)
-         */
-        public void removeListener(ILabelProviderListener listener)
-        {
-            // TODO: no support for listeners?
-        }
-
-    }
-
-    /**
-     * Default constructor
-     */
-    public JSFHtmlOutputTextConverterSection()
-    {
-        super();
-    }
-
-    public void createControls(Composite parent, TabbedPropertySheetPage aTabbedPropertySheetPage)
-    {
-        super.createControls(parent, aTabbedPropertySheetPage);
-        TabbedPropertySheetWidgetFactory factory = aTabbedPropertySheetPage.getWidgetFactory();
-        Composite top = factory.createFlatFormComposite(parent);
-
-        GridLayout layout = new GridLayout();
-        layout.numColumns = 4;
-        top.setLayout(layout);
-
-        createConvertPart(factory, top);
-    }
-
-    /**
-     * @param factory
-     * @param other
-     */
-    private void createConvertPart(TabbedPropertySheetWidgetFactory factory, Composite other)
-    {
-        GridData data;
-        _convertTable = factory.createTable(other, SWT.FULL_SELECTION | SWT.MULTI);
-        data = new GridData(GridData.FILL_BOTH);
-        data.horizontalSpan = 3;
-        data.verticalSpan = 3;
-        _convertTable.setHeaderVisible(true);
-        _convertTable.setLayoutData(data);
-        _convertTable.setLinesVisible(true);
-
-        TableColumn convertColumn = new TableColumn(_convertTable, SWT.NONE);
-        convertColumn.setText(SectionResources.getString("JSFHtmlOutputTextSection.Converter")); //$NON-NLS-1$
-        convertColumn.setWidth(100);
-
-        _convertViewer = new TableViewer(_convertTable);
-        _convertViewer.setContentProvider(new ConvertCotentLabelProvider());
-        _convertViewer.setLabelProvider(new ConvertCotentLabelProvider());
-        _convertViewer.addDoubleClickListener(new IDoubleClickListener()
-        {
-            public void doubleClick(DoubleClickEvent event)
-            {
-                IStructuredSelection selection = (IStructuredSelection) event.getSelection();
-                if (selection != null)
-                {
-                    IDOMElement node = (IDOMElement) selection.getFirstElement();
-                    gotoNode(node);
-                }
-            }
-        }
-        );
-        _convertViewer.addSelectionChangedListener(new ISelectionChangedListener()
-        {
-            public void selectionChanged(SelectionChangedEvent event)
-            {
-                updateConvertButtonStatus();
-            }
-        }
-        );
-
-        _convertTypeCombo = factory.createCCombo(other, SWT.READ_ONLY);
-        _convertTypeCombo.setItems(CONVERTTYPES);
-        _convertTypeCombo.select(0);
-        data = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
-        _convertTypeCombo.setLayoutData(data);
-
-        _convertAddButton = factory.createButton(other, SectionResources.getString("JSFHtmlOutputTextSection.Add"), //$NON-NLS-1$
-        SWT.NONE);
-        data = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
-        _convertAddButton.setLayoutData(data);
-        _convertAddButton.addSelectionListener(new SelectionAdapter()
-        {
-            public void widgetSelected(SelectionEvent e)
-            {
-                Map attributes = new HashMap();
-                AddSubNodeCommand c = new AddSubNodeCommand(SectionResources.getString("JSFHtmlOutputTextSection.CommandLabel.AddSubTag"), _element, "convert" //$NON-NLS-1$ //$NON-NLS-2$
-                + _convertTypeCombo.getText(), ITLDConstants.URI_JSF_CORE, attributes);
-                c.execute();
-                _convertViewer.refresh();
-                updateConvertButtonStatus();
-            }
-        }
-        );
-        _convertRemoveButton = factory.createButton(other, SectionResources
-            .getString("JSFHtmlOutputTextSection.Remove"), SWT.NONE); //$NON-NLS-1$
-        data = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
-        _convertRemoveButton.setLayoutData(data);
-        _convertRemoveButton.addSelectionListener(new SelectionAdapter()
-        {
-            public void widgetSelected(SelectionEvent e)
-            {
-                IStructuredSelection selection = (IStructuredSelection) _convertViewer.getSelection();
-                if (selection != null)
-                {
-                    for (Iterator i = selection.iterator(); i.hasNext();)
-                    {
-                        IDOMElement node = (IDOMElement) i.next();
-                        RemoveSubNodeCommand c = new RemoveSubNodeCommand(SectionResources.getString("JSFHtmlOutputTextSection.CommandLabel.RemoveSubTag"), _element, node); //$NON-NLS-1$
-                        c.execute();
-                    }
-                    _convertViewer.refresh();
-                    updateConvertButtonStatus();
-                }
-            }
-        }
-        );
-    }
-
-    private void updateConvertButtonStatus()
-    {
-        _convertAddButton.setEnabled(true);
-        _convertRemoveButton.setEnabled(true);
-        ISelection selection = _convertViewer.getSelection();
-        if (selection == null || selection.isEmpty())
-        {
-            _convertRemoveButton.setEnabled(false);
-        }
-        if (_convertTable.getItemCount() == 0)
-        {
-            _convertRemoveButton.setEnabled(false);
-        }
-        if (_convertTable.getItemCount() > 0)
-        {
-            _convertAddButton.setEnabled(false);
-        }
-    }
-
-    public void setInput(IWorkbenchPart part, ISelection selection)
-    {
-        super.setInput(part, selection);
-
-        _convertViewer.setInput(_element);
-        updateConvertButtonStatus();
-    }
-
-    protected void notifyChanged(INodeNotifier notifier, int eventType, Object changedFeature, Object oldValue, Object newValue, int pos)
-    {
-        if(_convertViewer != null && !_convertViewer.getControl().isDisposed())
-        {
-            _convertViewer.refresh();
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlSelectChoicesSection.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlSelectChoicesSection.java
deleted file mode 100644
index 4b7f39c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlSelectChoicesSection.java
+++ /dev/null
@@ -1,457 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.sections;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jface.viewers.DoubleClickEvent;
-import org.eclipse.jface.viewers.ICellModifier;
-import org.eclipse.jface.viewers.IDoubleClickListener;
-import org.eclipse.jface.viewers.ILabelProviderListener;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.ITableLabelProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.TextCellEditor;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.commands.single.AddSubNodeCommand;
-import org.eclipse.jst.pagedesigner.commands.single.ChangeAttributeCommand;
-import org.eclipse.jst.pagedesigner.commands.single.InsertSubNodeCommand;
-import org.eclipse.jst.pagedesigner.commands.single.RemoveSubNodeCommand;
-import org.eclipse.jst.pagedesigner.properties.BaseCustomSection;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.CCombo;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.swt.widgets.TableItem;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetWidgetFactory;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class JSFHtmlSelectChoicesSection extends BaseCustomSection
-{
-    final private static String[] CHOICETYPES = { IJSFConstants.TAG_SELECTITEM, IJSFConstants.TAG_SELECTITEMS};
-    private Table                 _choiceTable;
-    private TableViewer           _choiceViewer;
-    private CCombo                _choiceTypeCombo;
-    private Button                _choiceAddButton, _choiceRemoveButton, _choiceMoveUpButton, _choiceMoveDownButton;
-    private static final String[] COLUMN_NAMES = new String[] {"choices","itemLabel", "itemValue", "id"}; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
-
-    private class ChoiceCotentLabelProvider implements IStructuredContentProvider, ITableLabelProvider
-    {
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-         */
-        public Object[] getElements(final Object inputElement)
-        {
-            final IDOMElement root = _element;
-            final List result = new ArrayList();
-
-            final NodeList children = root.getChildNodes();
-            for (int i = 0, n = children.getLength(); i < n; i++)
-            {
-                final Node child = children.item(i);
-                if (child.getNodeType() == Node.ELEMENT_NODE)
-                {
-                    final IDOMElement element = (IDOMElement) child;
-                    final String nodeName = element.getNodeName();
-                    if (nodeName.indexOf("select") != -1) //$NON-NLS-1$
-                    {
-                        result.add(child);
-                    }
-                }
-            }
-
-            if (result.isEmpty())
-            {
-                return new Object[0];
-            }
-
-            return result.toArray(new IDOMElement[result.size()]);
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
-         */
-        public void inputChanged(final Viewer viewer, final Object oldInput, final Object newInput)
-        {
-            // do nothing
-        }
-
-        public String getColumnText(final Object element, final int columnIndex)
-        {
-            String result = null;
-            if (element instanceof Node)
-            {
-                final Node node = (Node) element;
-                Node attrNode = null;
-                String attrName = null;
-                if (columnIndex == 1)
-                {
-                    attrName = "itemLabel"; //$NON-NLS-1$
-                }
-                else if (columnIndex == 2)
-                {
-                    attrName = "itemValue"; //$NON-NLS-1$
-                }
-                else if (columnIndex == 3)
-                {
-                    attrName = "id"; //$NON-NLS-1$
-                }
-
-                switch (columnIndex)
-                {
-                    case 0:
-                        result = node.getNodeName();
-                        break;
-                    default:
-                    {
-                        attrNode = node.getAttributes().getNamedItem(attrName);
-                        if (attrNode != null)
-                        {
-                            result = attrNode.getNodeValue()!=null ? attrNode.getNodeValue() : " - "; //$NON-NLS-1$
-                        }
-                        else
-                        {
-                            result = " - "; //$NON-NLS-1$
-                        }
-                    }
-                }
-            }
-            return result != null ? result : ""; //$NON-NLS-1$
-        }
-
-        public void dispose()
-        {
-            // do nothing
-        }
-
-        public Image getColumnImage(final Object element, final int columnIndex)
-        {
-            return null;
-        }
-
-        public void addListener(final ILabelProviderListener listener)
-        {
-            // TODO: no support for listeners?
-        }
-
-        public boolean isLabelProperty(final Object element, final String property)
-        {
-            return false;
-        }
-
-        public void removeListener(final ILabelProviderListener listener)
-        {
-            // TODO: no support for listeners?
-        }
-    }
-
-    /**
-     * Default constructor
-     */
-    public JSFHtmlSelectChoicesSection()
-    {
-        super();
-    }
-
-    @Override
-    public void createControls(final Composite parent, final TabbedPropertySheetPage aTabbedPropertySheetPage)
-    {
-        super.createControls(parent, aTabbedPropertySheetPage);
-        final TabbedPropertySheetWidgetFactory factory = aTabbedPropertySheetPage.getWidgetFactory();
-        final Composite top = factory.createFlatFormComposite(parent);
-
-        final GridLayout layout = new GridLayout();
-        layout.numColumns = 4;
-        top.setLayout(layout);
-
-        createChoicePart(factory, top);
-    }
-
-    /**
-     * @param factory
-     * @param other
-     */
-    private void createChoicePart(final TabbedPropertySheetWidgetFactory factory, final Composite other)
-    {
-        GridData data;
-        _choiceTable = factory.createTable(other, SWT.FULL_SELECTION | SWT.MULTI);
-        data = new GridData(GridData.FILL_BOTH);
-        data.horizontalSpan = 3;
-        data.verticalSpan = 5;
-        data.heightHint = 50;
-        _choiceTable.setHeaderVisible(true);
-        _choiceTable.setLayoutData(data);
-        _choiceTable.setLinesVisible(true);
-
-        final TableColumn choiceColumn = new TableColumn(_choiceTable, SWT.NONE);
-        choiceColumn.setText(SectionResources.getString("JSFHtmlSelectManyCheckboxSection.Choices")); //$NON-NLS-1$
-        choiceColumn.setWidth(100);
-
-        final TableColumn labelColumn = new TableColumn(_choiceTable, SWT.NONE);
-        labelColumn.setText("itemLabel"); //$NON-NLS-1$
-        labelColumn.setWidth(100);
-
-        final TableColumn valueColumn = new TableColumn(_choiceTable, SWT.NONE);
-        valueColumn.setText("itemValue"); //$NON-NLS-1$
-        valueColumn.setWidth(100);
-
-        final TableColumn idColumn = new TableColumn(_choiceTable, SWT.NONE);
-        idColumn.setText("id"); //$NON-NLS-1$
-        idColumn.setWidth(100);
-
-        _choiceViewer = new TableViewer(_choiceTable);
-        _choiceViewer.setColumnProperties(COLUMN_NAMES );
-        final CellEditor[] editors = new CellEditor[4];
-        TextCellEditor textEditor = new TextCellEditor(_choiceTable);
-        editors[0] = textEditor;
-        textEditor = new TextCellEditor(_choiceTable);
-        editors[1] = textEditor;
-        textEditor = new TextCellEditor(_choiceTable);
-        editors[2] = textEditor;
-        textEditor = new TextCellEditor(_choiceTable);
-        editors[3] = textEditor;
-
-        _choiceViewer.setCellEditors(editors);
-        _choiceViewer.setCellModifier(new ICellModifier(){
-
-            public boolean canModify(final Object element, final String property) {
-                final IDOMElement node = (IDOMElement)element;
-                if (node.getLocalName().equals("selectItem")) //$NON-NLS-1$
-                {
-                    return ! property.equals("choices"); //$NON-NLS-1$
-                }
-
-                return property.equals("id"); //$NON-NLS-1$
-            }
-
-            public Object getValue(final Object element, final String property) {
-                final IDOMElement node = (IDOMElement) element;
-                final String val = node.getAttribute(property) != null ? node.getAttribute(property) : ""; //$NON-NLS-1$
-                return val;
-            }
-
-            public void modify(final Object element, final String property, final Object value) {
-
-                final TableItem item = (TableItem) element;
-                final IDOMElement node = (IDOMElement) item.getData();
-                String valueString;
-                ChangeAttributeCommand c;
-
-                valueString = ((String) value).trim();
-                c = new ChangeAttributeCommand(
-                        SectionResources.getString("JSFHtmlInputTextSection.CommandLabel.ChangeAttribute"), node, property, valueString); //$NON-NLS-1$
-                c.execute();
-
-                _choiceViewer.refresh();
-            }
-
-        });
-        _choiceViewer.setContentProvider(new ChoiceCotentLabelProvider());
-        _choiceViewer.setLabelProvider(new ChoiceCotentLabelProvider());
-        _choiceViewer.addDoubleClickListener(new IDoubleClickListener()
-        {
-            public void doubleClick(final DoubleClickEvent event)
-            {
-                final IStructuredSelection selection = (IStructuredSelection) event.getSelection();
-                if (selection != null)
-                {
-                    final IDOMElement node = (IDOMElement) selection.getFirstElement();
-                    gotoNode(node);
-                }
-            }
-        });
-        _choiceViewer.addSelectionChangedListener(new ISelectionChangedListener()
-        {
-            public void selectionChanged(final SelectionChangedEvent event)
-            {
-                updateChoiceButtonStatus();
-            }
-        });
-
-        _choiceTypeCombo = factory.createCCombo(other, SWT.READ_ONLY);
-        _choiceTypeCombo.setItems(CHOICETYPES);
-        _choiceTypeCombo.select(0);
-        data = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
-        _choiceTypeCombo.setLayoutData(data);
-
-        _choiceAddButton = factory.createButton(other, SectionResources
-                .getString("JSFHtmlSelectManyCheckboxSection.Add"), SWT.NONE); //$NON-NLS-1$
-        data = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
-        _choiceAddButton.setLayoutData(data);
-        _choiceAddButton.addSelectionListener(new SelectionAdapter()
-        {
-            @Override
-            public void widgetSelected(final SelectionEvent e)
-            {
-                final Map attributes = new HashMap();
-                final AddSubNodeCommand c = new AddSubNodeCommand(
-                        SectionResources.getString("JSFHtmlSelectManyCheckboxSection.CommandLabel.AddSubTag"), _element, _choiceTypeCombo.getText(), //$NON-NLS-1$
-                        ITLDConstants.URI_JSF_CORE, attributes);
-                c.execute();
-                _choiceViewer.refresh();
-                updateChoiceButtonStatus();
-            }
-        });
-        _choiceRemoveButton = factory.createButton(other, SectionResources
-                .getString("JSFHtmlSelectManyCheckboxSection.Remove"), SWT.NONE); //$NON-NLS-1$
-        data = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
-        _choiceRemoveButton.setLayoutData(data);
-        _choiceRemoveButton.addSelectionListener(new SelectionAdapter()
-        {
-            @Override
-            public void widgetSelected(final SelectionEvent e)
-            {
-                final IStructuredSelection selection = (IStructuredSelection) _choiceViewer.getSelection();
-                if (selection != null)
-                {
-                    for (final Iterator i = selection.iterator(); i.hasNext();)
-                    {
-                        final IDOMElement node = (IDOMElement) i.next();
-                        final RemoveSubNodeCommand c = new RemoveSubNodeCommand(
-                                SectionResources
-                                .getString("JSFHtmlSelectManyCheckboxSection.CommandLabel.RemoveSubTag"), _element, node); //$NON-NLS-1$
-                        c.execute();
-                    }
-                    _choiceViewer.refresh();
-                    updateChoiceButtonStatus();
-                }
-            }
-        });
-        _choiceMoveUpButton = factory.createButton(other, SectionResources
-                .getString("JSFHtmlSelectManyCheckboxSection.MoveUp"), SWT.NONE); //$NON-NLS-1$
-        data = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
-        _choiceMoveUpButton.setLayoutData(data);
-        _choiceMoveUpButton.addSelectionListener(new SelectionAdapter()
-        {
-            @Override
-            public void widgetSelected(final SelectionEvent e)
-            {
-                final int index = _choiceTable.getSelectionIndex();
-                final IDOMElement child = (IDOMElement) _choiceTable.getItem(index).getData();
-                final IDOMElement refchild = (IDOMElement) _choiceTable.getItem(index - 1).getData();
-                final RemoveSubNodeCommand remove = new RemoveSubNodeCommand(SectionResources
-                        .getString("JSFHtmlSelectManyCheckboxSection.CommandLabel.RemoveSubTag"), _element, child); //$NON-NLS-1$
-                remove.execute();
-                final InsertSubNodeCommand insert = new InsertSubNodeCommand(
-                        SectionResources.getString("JSFHtmlSelectManyCheckboxSection.CommandLabel.InsertSubTag"), _element, child, refchild); //$NON-NLS-1$
-                insert.execute();
-                _choiceViewer.refresh();
-                _choiceViewer.getTable().select(index - 1);
-                updateChoiceButtonStatus();
-            }
-        });
-        _choiceMoveDownButton = factory.createButton(other, SectionResources
-                .getString("JSFHtmlSelectManyCheckboxSection.MoveDown"), SWT.NONE); //$NON-NLS-1$
-        data = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
-        _choiceMoveDownButton.setLayoutData(data);
-        _choiceMoveDownButton.addSelectionListener(new SelectionAdapter()
-        {
-            @Override
-            public void widgetSelected(final SelectionEvent e)
-            {
-                final int index = _choiceTable.getSelectionIndex();
-                final IDOMElement child = (IDOMElement) _choiceTable.getItem(index).getData();
-                final IDOMElement refchild = (IDOMElement) _choiceTable.getItem(index + 1).getData();
-                final RemoveSubNodeCommand remove = new RemoveSubNodeCommand(SectionResources
-                        .getString("JSFHtmlSelectManyCheckboxSection.CommandLabel.RemoveSubTag"), _element, refchild); //$NON-NLS-1$
-                remove.execute();
-                final InsertSubNodeCommand insert = new InsertSubNodeCommand(
-                        SectionResources.getString("JSFHtmlSelectManyCheckboxSection.CommandLabel.InsertSubTag"), _element, refchild, child); //$NON-NLS-1$
-                insert.execute();
-                _choiceViewer.refresh();
-                _choiceViewer.getTable().select(index + 1);
-                updateChoiceButtonStatus();
-            }
-        });
-    }
-
-    private void updateChoiceButtonStatus()
-    {
-        _choiceRemoveButton.setEnabled(true);
-        _choiceMoveUpButton.setEnabled(true);
-        _choiceMoveDownButton.setEnabled(true);
-        final ISelection selection = _choiceViewer.getSelection();
-        if (selection.isEmpty())
-        {
-            _choiceRemoveButton.setEnabled(false);
-            _choiceMoveUpButton.setEnabled(false);
-            _choiceMoveDownButton.setEnabled(false);
-        }
-        if (_choiceTable.getItemCount() == 0)
-        {
-            _choiceRemoveButton.setEnabled(false);
-            _choiceMoveUpButton.setEnabled(false);
-            _choiceMoveDownButton.setEnabled(false);
-        }
-        if (_choiceTable.getSelectionCount() > 1)
-        {
-            _choiceMoveUpButton.setEnabled(false);
-            _choiceMoveDownButton.setEnabled(false);
-        }
-        if (_choiceTable.getSelectionIndex() == 0)
-        {
-            _choiceMoveUpButton.setEnabled(false);
-        }
-        if (_choiceTable.getSelectionIndex() == _choiceTable.getItemCount() - 1)
-        {
-            _choiceMoveDownButton.setEnabled(false);
-        }
-    }
-
-    @Override
-    public void setInput(final IWorkbenchPart part, final ISelection selection)
-    {
-        super.setInput(part, selection);
-
-        _choiceViewer.setInput(_element);
-        updateChoiceButtonStatus();
-    }
-
-    @Override
-    protected void notifyChanged(final INodeNotifier notifier, final int eventType, final Object changedFeature, final Object oldValue,
-            final Object newValue, final int pos)
-    {
-        if (_choiceViewer != null && !_choiceViewer.getControl().isDisposed())
-        {
-            _choiceViewer.refresh();
-        }
-
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/SectionResources.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/SectionResources.java
deleted file mode 100644
index c4b2b82..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/SectionResources.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.sections;
-
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-/**
- * Section resources
- * @author mengbo
- * @version 1.5
- */
-public final class SectionResources
-{
-    private static final String         BUNDLE_NAME     = "org.eclipse.jst.pagedesigner.jsf.ui.sections.SectionResources"; //$NON-NLS-1$
-
-    private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle.getBundle(BUNDLE_NAME);
-
-    private SectionResources()
-    {
-        // no external instantiation
-    }
-
-    /**
-     * @param key
-     * @return the resource for key or !key! if not found
-     */
-    public static String getString(String key)
-    {
-        try
-        {
-            return RESOURCE_BUNDLE.getString(key);
-        }
-        catch (MissingResourceException e)
-        {
-            return '!' + key + '!';
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/SectionResources.properties b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/SectionResources.properties
deleted file mode 100644
index e2db901..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/SectionResources.properties
+++ /dev/null
@@ -1,78 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-# <f:convertDateTime>
-JSFCoreConvertDateTimeSection.ChangeAttribute=Change Attribute
-
-# <f:convertNumber>
-JSFCoreConvertNumberSection.CommandLabel.ChangeAttribute=Change Attribute
-
-# <h:commandButton>
-JSFHtmlCommandButtonSection.Listeners=Listeners
-JSFHtmlCommandButtonSection.Add=&Add
-JSFHtmlCommandButtonSection.Remove=&Remove
-JSFHtmlCommandButtonSection.CommandLabel.AddSubTag=Add Sub Tag
-JSFHtmlCommandButtonSection.CommandLabel.RemoveSubTag=Remove Sub Tag
-
-# <h:dataTable>
-JSFHtmlDataTableSection.Columns=Columns
-JSFHtmlDataTableSection.Add=&Add
-JSFHtmlDataTableSection.Remove=&Remove
-JSFHtmlDataTableSection.MoveUp=Move &up
-JSFHtmlDataTableSection.MoveDown=Move &down
-JSFHtmlDataTableSection.CommandLabel.AddSubTag=Add Sub Tag
-JSFHtmlDataTableSection.CommandLabel.RemoveSubTag=Remove Sub Tag
-JSFHtmlDataTableSection.CommandLabel.InsertSubTag=Insert Sub Tag
-
-# <h:inputHidden>
-JSFHtmlInputHiddenSection.Type=Type:
-JSFHtmlInputHiddenSection.Type0=Hidden
-JSFHtmlInputHiddenSection.Type1=Secret
-JSFHtmlInputHiddenSection.Type2=Text
-JSFHtmlInputHiddenSection.Type3=Textarea
-
-JSFHtmlInputHidden.CommandLabel.ChangeType=Change Type
-
-# <h:inputText>
-JSFHtmlInputTextSection.Validators=Validators
-JSFHtmlInputTextSection.Listeners=Listeners
-JSFHtmlInputTextSection.Minimum=Minimum
-JSFHtmlInputTextSection.Maximum=Maximum
-JSFHtmlInputTextSection.Add=&Add
-JSFHtmlInputTextSection.Remove=&Remove
-JSFHtmlInputTextSection.Converter=Converter
-JSFHtmlInputTextSection.CommandLabel.ChangeAttribute=Change Attribute
-JSFHtmlInputTextSection.CommandLabel.AddSubTag=Add Sub Tag
-JSFHtmlInputTextSection.CommandLabel.RemoveSubTag=Remove Sub Tag
-
-# <h:outputFormat>
-JSFHtmlOutputFormatSection.Parameters=Parameters:
-JSFHtmlOutputFormatSection.ColName=Name
-JSFHtmlOutputFormatSection.ColValue=Value
-JSFHtmlOutputFormatSection.CommandLabel.ChangeAttribute=Change Attribute
-JSFHtmlOutputFormatSection.CommandLabel.AddSubTag=Add Sub Tag
-JSFHtmlOutputFormatSection.CommandLabel.RemoveSubTag=Remove Sub Tag
-
-# <h:outputText>
-JSFHtmlOutputTextSection.Converter=Converter
-JSFHtmlOutputTextSection.Add=&Add
-JSFHtmlOutputTextSection.Remove=&Remove
-JSFHtmlOutputTextSection.CommandLabel.AddSubTag=Add Sub Tag
-JSFHtmlOutputTextSection.CommandLabel.RemoveSubTag=Remove Sub Tag
-
-# <h:selectManyCheckbox>
-JSFHtmlSelectManyCheckboxSection.Choices=Choices
-JSFHtmlSelectManyCheckboxSection.Add=&Add
-JSFHtmlSelectManyCheckboxSection.Remove=&Remove
-JSFHtmlSelectManyCheckboxSection.MoveUp=Move &up
-JSFHtmlSelectManyCheckboxSection.MoveDown=Move &down
-JSFHtmlSelectManyCheckboxSection.CommandLabel.AddSubTag=Add Sub Tag
-JSFHtmlSelectManyCheckboxSection.CommandLabel.RemoveSubTag=Remove Sub Tag
-JSFHtmlSelectManyCheckboxSection.CommandLabel.InsertSubTag=Insert Sub Tag
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/util/JSFUIPluginResourcesUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/util/JSFUIPluginResourcesUtil.java
deleted file mode 100644
index a542670..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/util/JSFUIPluginResourcesUtil.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.util;
-
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-import org.eclipse.jst.jsf.common.ui.JSFUICommonPlugin;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.jsf.common.ui.internal.utils.ResourceUtils;
-
-/**
- * @author mengbo
- */
-public class JSFUIPluginResourcesUtil extends ResourceUtils
-{
-    private final static String             bundleName = "org.eclipse.jst.pagedesigner.jsf.ui.JSFUIResources"; //$NON-NLS-1$
-    private static Logger                   _log       = JSFUICommonPlugin.getLogger(JSFUIPluginResourcesUtil.class);
-    private static JSFUIPluginResourcesUtil _resource;                                                          // singleton
-
-    private JSFUIPluginResourcesUtil()
-    {
-        try
-        {
-            _resources = ResourceBundle.getBundle(bundleName);
-        }
-        catch (MissingResourceException e)
-        {
-            _log.error("Error in getting show messages resource bundle file", e); //$NON-NLS-1$
-        }
-    }
-
-    /**
-     * @return the singleton instance
-     */
-    public static JSFUIPluginResourcesUtil getInstance()
-    {
-        if (_resource == null)
-        {
-            _resource = new JSFUIPluginResourcesUtil();
-        }
-        return _resource;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/.classpath b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/.classpath
deleted file mode 100644
index 304e861..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/.cvsignore b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/.cvsignore
deleted file mode 100644
index f9eb27a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/.cvsignore
+++ /dev/null
@@ -1,3 +0,0 @@
-build.xml
-@dot
-javaCompiler...args
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/.project b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/.project
deleted file mode 100644
index 9685725..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.jst.pagedesigner.jsp.core</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/.settings/org.eclipse.core.resources.prefs b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/.settings/org.eclipse.core.resources.prefs
deleted file mode 100644
index 1c9084e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/.settings/org.eclipse.core.resources.prefs
+++ /dev/null
@@ -1,3 +0,0 @@
-#Sun May 27 16:05:25 EDT 2007
-eclipse.preferences.version=1
-encoding/<project>=ISO-8859-1
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/.settings/org.eclipse.jdt.core.prefs b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index d8bc1cd..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,82 +0,0 @@
-#Mon Jun 30 15:58:19 PDT 2008
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=disabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.5
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.doc.comment.support=enabled
-org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.autoboxing=warning
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=ignore
-org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
-org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
-org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
-org.eclipse.jdt.core.compiler.problem.invalidJavadoc=error
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocComments=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.missingJavadocTags=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=error
-org.eclipse.jdt.core.compiler.problem.nullReference=ignore
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
-org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore
-org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=ignore
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=ignore
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=error
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=error
-org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
-org.eclipse.jdt.core.compiler.problem.unusedLocal=error
-org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
-org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
-org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.5
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/.settings/org.eclipse.jdt.ui.prefs b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644
index 82eb6c1..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,3 +0,0 @@
-#Fri Apr 06 18:25:15 PDT 2007
-eclipse.preferences.version=1
-org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8"?><templates/>
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/.settings/org.eclipse.pde.prefs b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/.settings/org.eclipse.pde.prefs
deleted file mode 100644
index 851c0c3..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/.settings/org.eclipse.pde.prefs
+++ /dev/null
@@ -1,22 +0,0 @@
-#Fri May 30 12:00:06 PDT 2008
-compilers.f.unresolved-features=1
-compilers.f.unresolved-plugins=1
-compilers.incompatible-environment=1
-compilers.p.build=1
-compilers.p.deprecated=1
-compilers.p.discouraged-class=1
-compilers.p.internal=1
-compilers.p.missing-packages=0
-compilers.p.no-required-att=0
-compilers.p.not-externalized-att=0
-compilers.p.unknown-attribute=1
-compilers.p.unknown-class=1
-compilers.p.unknown-element=1
-compilers.p.unknown-identifier=1
-compilers.p.unknown-resource=1
-compilers.p.unresolved-ex-points=0
-compilers.p.unresolved-import=0
-compilers.s.create-docs=false
-compilers.s.doc-folder=doc
-compilers.s.open-tags=1
-eclipse.preferences.version=1
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/META-INF/MANIFEST.MF b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/META-INF/MANIFEST.MF
deleted file mode 100644
index 6a5feed..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,33 +0,0 @@
-Manifest-Version: 1.0
-Bundle-Name: %pluginName
-Bundle-SymbolicName: org.eclipse.jst.pagedesigner.jsp.core;singleton:=true
-Bundle-Version: 1.2.0.qualifier
-Bundle-ClassPath: .
-Bundle-Activator: org.eclipse.jst.pagedesigner.jsp.core.JSPCorePlugin
-Bundle-Vendor: %providerName
-Bundle-Localization: plugin
-Require-Bundle: org.eclipse.core.runtime;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.core.resources;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.wst.sse.core;bundle-version="[1.1.0,1.2.0)",
- org.eclipse.wst.xml.core;bundle-version="[1.1.0,1.2.0)",
- org.eclipse.jst.jsp.core;bundle-version="[1.1.0,1.3.0)",
- org.eclipse.wst.html.core;bundle-version="[1.1.0,1.2.0)",
- org.eclipse.jst.jsf.common;bundle-version="[1.0.0,2.0.0)"
-Bundle-ActivationPolicy: lazy
-Bundle-ManifestVersion: 2
-Export-Package: org.eclipse.jst.pagedesigner.jsp.core;x-internal:=true,
- org.eclipse.jst.pagedesigner.jsp.core.el;x-internal:=true,
- org.eclipse.jst.pagedesigner.jsp.core.internal.pagevar;x-internal:=true,
- org.eclipse.jst.pagedesigner.jsp.core.pagevar;x-internal:=true,
- org.eclipse.jst.pagedesigner.jsp.core.pagevar.adapter;x-internal:=true,
- org.eclipse.jst.pagedesigner.jsp.core.util;x-internal:=true
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
-Import-Package: javax.servlet;version="2.4.0",
- javax.servlet.http;version="2.4.0",
- javax.servlet.jsp;version="2.0.0",
- javax.servlet.jsp.el;version="2.0.0",
- javax.servlet.jsp.resources;version="2.0.0",
- javax.servlet.jsp.tagext;version="2.0.0",
- javax.servlet.resources;version="2.4.0",
- org.apache.commons.el;version="1.0.0",
- org.apache.commons.el.parser;version="1.0.0"
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/about.html b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/about.html
deleted file mode 100644
index 90bd74d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/about.html
+++ /dev/null
@@ -1,22 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<head>
-<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
-<title>About</title>
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>June, 2008</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise indicated below, the Content is provided to you under the terms and conditions of the
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content.</p>
-
-</body>
-</html>
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/build.properties b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/build.properties
deleted file mode 100644
index 6429d84..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/build.properties
+++ /dev/null
@@ -1,20 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2008 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-source.. = src/
-output.. = bin/
-bin.includes = plugin.xml,\
-               META-INF/,\
-               .,\
-               schema/,\
-               about.html,\
-               plugin.properties\                         
-javacSource=1.5
-javacTarget=1.5
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/plugin.properties b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/plugin.properties
deleted file mode 100644
index 3c3f9a1..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/plugin.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-####################################################
-# Plugin XML information.
-####################################################
-pluginName=JavaServer Faces Tools - JSP Core Pagedesigner
-providerName=Eclipse.org
-
-extension-point.name.0 = page variable
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/plugin.xml b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/plugin.xml
deleted file mode 100644
index ea261e8..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/plugin.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin>
-   <extension-point id="pageVar" name="%extension-point.name.0" schema="schema/pageVar.exsd"/>
-</plugin>
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/schema/pageVar.exsd b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/schema/pageVar.exsd
deleted file mode 100644
index 962bf34..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/schema/pageVar.exsd
+++ /dev/null
@@ -1,172 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.jst.pagedesigner.jsp.core">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.jst.pagedesigner.jsp.core" id="pageVar" name="page variable"/>
-      </appInfo>
-      <documentation>
-         [Enter description of this extension point.]
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="taglib" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="tag">
-      <complexType>
-         <attribute name="varName" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="varTypeMode" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-            <simpleType>
-               <restriction base="string">
-                  <enumeration value="CLASSNAME">
-                  </enumeration>
-                  <enumeration value="EXPRESSION">
-                  </enumeration>
-                  <enumeration value="EXPRESSION_COLLECTION_ITEM">
-                  </enumeration>
-                  <enumeration value="BUNDLE">
-                  </enumeration>
-               </restriction>
-            </simpleType>
-         </attribute>
-         <attribute name="varTypeString" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="varNameIsAttr" type="boolean" use="default" value="true">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="varTypeStringIsAttr" type="boolean" use="default" value="true">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="tagName" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="taglib">
-      <complexType>
-         <sequence>
-            <element ref="tag" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="uri" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         [Enter the first release in which this extension point appears.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         [Enter extension point usage example here.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         [Enter API information here.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         [Enter information about supplied implementation of this extension point.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         /*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/IJSPCoreConstants.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/IJSPCoreConstants.java
deleted file mode 100644
index a628e6a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/IJSPCoreConstants.java
+++ /dev/null
@@ -1,284 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsp.core;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public interface IJSPCoreConstants 
-{
-    /**
-     * JSP tag name
-     */
-    final static public String TAG_ATTRIBUTE = "attribute"; //$NON-NLS-1$
-
-    /**
-     * JSP tag name
-     */
-	final static public String TAG_BODY = "body"; //$NON-NLS-1$
-
-    /**
-     * JSP tag name
-     */
-	final static public String TAG_ELEMENT = "element"; //$NON-NLS-1$
-
-    /**
-     * JSP tag name
-     */
-	final static public String TAG_EXPRESSION = "expression"; //$NON-NLS-1$
-
-    /**
-     * JSP tag name
-     */
-	final static public String TAG_DECLARATION = "declaration"; //$NON-NLS-1$
-
-    /**
-     * JSP tag name
-     */
-	final static public String TAG_DIRECTIVE_INCLUDE = "directive.include"; //$NON-NLS-1$
-
-    /**
-     * JSP tag name
-     */
-	final static public String TAG_DIRECTIVE_PAGE = "directive.page"; //$NON-NLS-1$
-
-    /**
-     * JSP tag name
-     */
-	final static public String TAG_DIRECTIVE_TAGLIB = "directive.taglib"; //$NON-NLS-1$
-
-    /**
-     * JSP tag name
-     */
-	final static public String TAG_DOBODY = "doBody"; //$NON-NLS-1$
-
-    /**
-     * JSP tag name
-     */
-	final static public String TAG_FORWARD = "forward"; //$NON-NLS-1$
-
-    /**
-     * JSP tag name
-     */
-	final static public String TAG_GETPROPERTY = "getProperty"; //$NON-NLS-1$
-
-    /**
-     * JSP tag name
-     */
-	final static public String TAG_INCLUDE = "include"; //$NON-NLS-1$
-
-    /**
-     * JSP tag name
-     */
-	final static public String TAG_INVOKE = "invoke"; //$NON-NLS-1$
-
-    /**
-     * JSP tag name
-     */
-	final static public String TAG_OUTPUT = "output"; //$NON-NLS-1$
-
-    /**
-     * JSP tag name
-     */
-	final static public String TAG_PLUGIN = "plugin"; //$NON-NLS-1$
-
-    /**
-     * JSP tag name
-     */
-	final static public String TAG_ROOT = "root"; //$NON-NLS-1$
-
-    /**
-     * JSP tag name
-     */
-	final static public String TAG_SCRIPTLET = "scriptlet"; //$NON-NLS-1$
-
-    /**
-     * JSP tag name
-     */
-	final static public String TAG_SETPROPERTY = "setProperty"; //$NON-NLS-1$
-
-    /**
-     * JSP tag name
-     */
-	final static public String TAG_TEXT = "text"; //$NON-NLS-1$
-
-    /**
-     * JSP tag name
-     */
-	final static public String TAG_USEBEAN = "useBean"; //$NON-NLS-1$
-
-    /**
-     * JSP tag name
-     */
-	final static public String TAG_LEADING_DIRECTIVE = "directive."; //$NON-NLS-1$
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_ALIGN = "align"; //$NON-NLS-1$
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_ARCHIVE = "archive"; //$NON-NLS-1$
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_BEANNAME = "beanName"; //$NON-NLS-1$
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_CLASS = "class"; //$NON-NLS-1$
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_CODE = "code"; //$NON-NLS-1$
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_CODEBASE = "codebase"; //$NON-NLS-1$
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_DOCTYPEROOTELEMENT = "doctype-root-element"; //$NON-NLS-1$
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_DOCTYPESYSTEM = "doctype-system"; //$NON-NLS-1$
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_DOCTYPEPUBLIC = "doctype-public"; //$NON-NLS-1$
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_FILE = "file"; //$NON-NLS-1$
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_FRAGMENT = "fragment"; //$NON-NLS-1$
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_HEIGHT = "height"; //$NON-NLS-1$
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_HSPACE = "hspace"; //$NON-NLS-1$
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_ID = "id"; //$NON-NLS-1$
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_IEPLUGINURL = "iepluginurl"; //$NON-NLS-1$
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_JREVERSION = "jreversion"; //$NON-NLS-1$
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_NAME = "name"; //$NON-NLS-1$
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_NSPLUGINURL = "nspluginurl"; //$NON-NLS-1$
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_OMITXMLDECLARATION = "omit-xml-declaration"; //$NON-NLS-1$
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_PAGE = "page"; //$NON-NLS-1$
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_PROPERTY = "property"; //$NON-NLS-1$
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_SCOPE = "scope"; //$NON-NLS-1$
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_TRIM = "trim"; //$NON-NLS-1$
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_TYPE = "type"; //$NON-NLS-1$
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_URI = "uri"; //$NON-NLS-1$
-
-    /**
-     * JSP tag attribute name
-     */
-	final public static String ATTR_TAGDIR = "tagdir"; //$NON-NLS-1$
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_VALUE = "value"; //$NON-NLS-1$
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_VAR = "var"; //$NON-NLS-1$
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_VARREADER = "varReader"; //$NON-NLS-1$
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_VERSION = "version"; //$NON-NLS-1$
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_XMLNSJSP = "xmlns:jsp"; //$NON-NLS-1$
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_XMLNSTAGLIBPREFIX = "xmlns:taglibPrefix"; //$NON-NLS-1$
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/JSPCorePlugin.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/JSPCorePlugin.java
deleted file mode 100644
index 4ea9674..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/JSPCorePlugin.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsp.core;
-
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-import org.eclipse.core.runtime.Plugin;
-import org.osgi.framework.BundleContext;
-
-/**
- * The main plugin class to be used in the desktop.
- */
-public class JSPCorePlugin extends Plugin {
-	// The shared instance.
-	private static JSPCorePlugin plugin;
-
-	// Resource bundle.
-	private ResourceBundle resourceBundle;
-
-	/**
-	 * The constructor.
-	 */
-	public JSPCorePlugin() {
-		super();
-		plugin = this;
-		try {
-			resourceBundle = ResourceBundle
-					.getBundle("org.eclipse.jst.pagedesigner.jsp.core.JSPCorePluginResources"); //$NON-NLS-1$
-		} catch (MissingResourceException x) {
-			resourceBundle = null;
-		}
-	}
-
-	/**
-	 * This method is called upon plug-in activation
-	 */
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-	}
-
-	/**
-	 * This method is called when the plug-in is stopped
-	 */
-	public void stop(BundleContext context) throws Exception {
-		super.stop(context);
-	}
-
-	/**
-	 * Returns the shared instance.
-	 * @return the default plugin instance
-	 */
-	public static JSPCorePlugin getDefault() {
-		return plugin;
-	}
-
-	/**
-	 * Returns the string from the plugin's resource bundle, or 'key' if not
-	 * found.
-	 * @param key 
-	 * @return the string for key or 'key' if not found in the default resource bundle
-	 */
-	public static String getResourceString(String key) {
-		ResourceBundle bundle = JSPCorePlugin.getDefault().getResourceBundle();
-		try {
-			return (bundle != null) ? bundle.getString(key) : key;
-		} catch (MissingResourceException e) {
-			return key;
-		}
-	}
-
-	/**
-	 * Returns the plugin's resource bundle,
-	 * @return the resource bundle
-	 */
-	public ResourceBundle getResourceBundle() {
-		return resourceBundle;
-	}
-
-	/**
-	 * @return the plugin id
-	 */
-	public static String getPluginId() {
-		return getDefault().getBundle().getSymbolicName();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/ListenerList.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/ListenerList.java
deleted file mode 100644
index 9596f97..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/ListenerList.java
+++ /dev/null
@@ -1,142 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsp.core;
-
-/**
- * Local version of org.eclipse.jface.util.ListenerList (modified)
- * @author mengbo
- * @version 1.5
- */
-public class ListenerList {
-	/**
-	 * The current number of listeners. Maintains invariant: 0 <= fSize <=
-	 * listeners.length.
-	 */
-	private int _size;
-
-	/**
-	 * The list of listeners. Initially <code>null</code> but initialized to
-	 * an array of size capacity the first time a listener is added. Maintains
-	 * invariant: listeners != null if and only if fSize != 0
-	 */
-	private Object[] _listeners = null;
-
-	/**
-	 * The empty array singleton instance, returned by getListeners() when size ==
-	 * 0.
-	 */
-	private static final Object[] EmptyArray = new Object[0];
-
-	/**
-	 * Creates a listener list with the given initial capacity.
-	 * 
-	 * @param capacity
-	 *            the number of listeners which this list can initially accept
-	 *            without growing its internal representation; must be at least
-	 *            1
-	 */
-	public ListenerList(int capacity) {
-		if (capacity < 1) {
-			throw new IllegalArgumentException();
-		}
-		_listeners = new Object[capacity];
-		_size = 0;
-	}
-
-	/**
-	 * Adds a listener to the list. Has no effect if an identical listener is
-	 * already registered.
-	 * 
-	 * @param listener
-	 *            a listener
-	 */
-	public synchronized void add(Object listener) {
-		if (listener == null) {
-			throw new IllegalArgumentException();
-		}
-		// check for duplicates using identity
-		for (int i = 0; i < _size; ++i) {
-			if (_listeners[i] == listener) {
-				return;
-			}
-		}
-		// grow array if necessary
-		if (_size == _listeners.length) {
-			Object[] temp = new Object[(_size * 2) + 1];
-			System.arraycopy(_listeners, 0, temp, 0, _size);
-			_listeners = temp;
-		}
-		_listeners[_size++] = listener;
-	}
-
-	/**
-	 * Returns an array containing all the registered listeners. The resulting
-	 * array is unaffected by subsequent adds or removes. If there are no
-	 * listeners registered, the result is an empty array singleton instance (no
-	 * garbage is created). Use this method when notifying listeners, so that
-	 * any modifications to the listener list during the notification will have
-	 * no effect on the notification itself.
-	 * @return the array of registered listeners
-	 */
-	public synchronized Object[] getListeners() {
-		if (_size == 0) {
-			return EmptyArray;
-		}
-		Object[] result = new Object[_size];
-		System.arraycopy(_listeners, 0, result, 0, _size);
-		return result;
-	}
-
-	/**
-	 * Removes a listener from the list. Has no effect if an identical listener
-	 * was not already registered.
-	 * 
-	 * @param listener
-	 *            a listener
-	 */
-	public synchronized void remove(Object listener) {
-		if (listener == null) {
-			throw new IllegalArgumentException();
-		}
-
-		for (int i = 0; i < _size; ++i) {
-			if (_listeners[i] == listener) {
-				if (--_size == 0) {
-					_listeners = new Object[1];
-				} else {
-					if (i < _size) {
-						_listeners[i] = _listeners[_size];
-					}
-					_listeners[_size] = null;
-				}
-				return;
-			}
-		}
-	}
-
-	/**
-	 * Removes all the listeners from the list.
-	 */
-	public void removeAll() {
-		_listeners = new Object[0];
-		_size = 0;
-	}
-
-	/**
-	 * Returns the number of registered listeners
-	 * 
-	 * @return the number of registered listeners
-	 */
-	public int size() {
-		return _size;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/el/ELParser.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/el/ELParser.java
deleted file mode 100644
index 9c3ee7f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/el/ELParser.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsp.core.el;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.commons.el.ComplexValue;
-import org.apache.commons.el.NamedValue;
-
-/**
- * 
- * @author mengbo
- * @version 1.5
- */
-public class ELParser {
-	private String _jsfExpression;
-
-	private List _expressionList;
-
-	/**
-	 * @param expression 
-	 * 
-	 */
-	public ELParser(String expression) {
-		super();
-		_jsfExpression = expression;
-		init();
-	}
-
-	/**
-	 * 
-	 */
-	private void init() {
-		Object parsedExpression = JSFELParserHelper
-				.parseExpression(_jsfExpression);
-
-		if (parsedExpression instanceof ComplexValue) {
-			_expressionList = new ArrayList();
-			_expressionList.add(((ComplexValue) parsedExpression).getPrefix());
-			_expressionList.addAll(((ComplexValue) parsedExpression)
-					.getSuffixes());
-		} else if (parsedExpression instanceof NamedValue) {
-			_expressionList = new ArrayList();
-			_expressionList.add(parsedExpression);
-		}
-
-	}
-
-	/**
-	 * @return the expression elements of null if none
-	 */
-	public Object[] getElements() {
-		if (_expressionList == null) {
-			return null;
-		}
-
-		return _expressionList.toArray();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/el/JSFELParserHelper.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/el/JSFELParserHelper.java
deleted file mode 100644
index b8bca4e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/el/JSFELParserHelper.java
+++ /dev/null
@@ -1,267 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsp.core.el;
-
-import java.io.StringReader;
-
-import org.apache.commons.el.Expression;
-import org.apache.commons.el.ExpressionString;
-import org.apache.commons.el.parser.ELParser;
-import org.apache.commons.el.parser.ParseException;
-
-/**
- * Utility class to implement support functionality to "morph" JSP EL into JSF
- * EL
- * 
- * @author mengbo
- * @version 1.5
- */
-public final class JSFELParserHelper {
-	/**
-	 * an EL left brace
-	 */
-	public static String JSF_EL_LEFT_BRACE = "#{"; //$NON-NLS-1$
-
-	/**
-	 * an EL right brace
-	 */
-	public static String JSF_EL_RIGHT_BRACE = "}"; //$NON-NLS-1$
-
-	private JSFELParserHelper() {
-		// util class, do not instantiate
-	}
-
-	/**
-	 * Gets the parsed form of the given expression string. Returns either an
-	 * Expression or ExpressionString.
-	 * @param expressionString 
-	 * @return the result of parsing expressionString
-	 */
-	public static Object parseExpression(String expressionString) {
-		expressionString = toJspElExpression(expressionString);
-
-		ELParser parser = new ELParser(new StringReader(expressionString));
-		try {
-			Object expression = parser.ExpressionString();
-			if (!(expression instanceof Expression)
-					&& !(expression instanceof ExpressionString)) {
-				return null;
-			}
-
-			return expression;
-		} catch (ParseException e) {
-
-			// String msg = "Invalid expression: '" + expressionString + "'";
-			// log.debug(msg, e);
-			// throw new ReferenceSyntaxException(msg, e);
-		}
-		return null;
-	}
-
-	/**
-	 * @param expressionString
-	 * @return true if the expression is 'valid'
-	 */
-	public static boolean isValidEL(String expressionString) {
-		if (expressionString == null || expressionString.length() == 0) {
-			return false;
-		}
-
-		return expressionString.startsWith(JSF_EL_LEFT_BRACE)
-				&& expressionString.endsWith(JSF_EL_RIGHT_BRACE);
-	}
-
-	/**
-	 * @param expressionString
-	 * @return expressionString with the left and right braces removed
-	 * or the original string if isValidEL(expression) == false
-	 */
-	public static String trimELBrace(String expressionString) {
-		if (!isValidEL(expressionString)) {
-			return expressionString;
-		}
-		String trimedExpression = null;
-
-		trimedExpression = expressionString.substring(JSF_EL_LEFT_BRACE
-				.length(), expressionString.length()
-				- JSF_EL_RIGHT_BRACE.length());
-
-		return trimedExpression;
-	}
-
-	/**
-	 * Convert ValueBinding syntax #{ } to JSP EL syntax ${ }
-	 * 
-	 * @param expressionString
-	 *            <code>ValueBinding</code> reference expression
-	 * 
-	 * @return JSP EL compatible expression
-	 */
-	public static String toJspElExpression(String expressionString) {
-		StringBuffer sb = new StringBuffer(expressionString.length());
-		int remainsPos = 0;
-
-		for (int posOpenBrace = expressionString.indexOf('{'); posOpenBrace >= 0; posOpenBrace = expressionString
-				.indexOf('{', remainsPos)) {
-			if (posOpenBrace > 0) {
-				if (posOpenBrace - 1 > remainsPos)
-					sb.append(expressionString.substring(remainsPos,
-							posOpenBrace - 1));
-
-				if (expressionString.charAt(posOpenBrace - 1) == '$') {
-					sb.append("${'${'}"); //$NON-NLS-1$
-					remainsPos = posOpenBrace + 1;
-					continue;
-				} else if (expressionString.charAt(posOpenBrace - 1) == '#') {
-					// TODO: should use \\ as escape for \ always, not just when
-					// before #{
-					// allow use of '\' as escape symbol for #{ (for
-					// compatibility with Sun's extended implementation)
-					/*
-					 * if (isEscaped(expressionString, posOpenBrace - 1)) {
-					 * escapes: { for (int i = sb.length() - 1; i >= 0; i--) {
-					 * if (sb.charAt(i) != '\\') { sb.setLength( sb.length() -
-					 * (sb.length() - i) / 2); break escapes; } }
-					 * sb.setLength(sb.length() / 2); } sb.append("#{"); } else {
-					 */
-					sb.append("${"); //$NON-NLS-1$
-					int posCloseBrace = indexOfMatchingClosingBrace(
-							expressionString, posOpenBrace);
-					sb.append(expressionString.substring(posOpenBrace + 1,
-							posCloseBrace + 1));
-					remainsPos = posCloseBrace + 1;
-					continue;
-					// }
-				} else {
-					if (posOpenBrace > remainsPos)
-						sb.append(expressionString.charAt(posOpenBrace - 1));
-				}
-			}
-
-			// Standalone brace
-			sb.append('{');
-			remainsPos = posOpenBrace + 1;
-		}
-
-		sb.append(expressionString.substring(remainsPos));
-
-		// Create a new String to shrink mem size since we are caching
-		return new String(sb.toString());
-	}
-
-	private static int findQuote(String expressionString, int start) {
-		int indexofSingleQuote = expressionString.indexOf('\'', start);
-		int indexofDoubleQuote = expressionString.indexOf('"', start);
-		return minIndex(indexofSingleQuote, indexofDoubleQuote);
-	}
-
-	/**
-	 * Return the index of the matching closing brace, skipping over quoted text
-	 * 
-	 * @param expressionString
-	 *            string to search
-	 * @param indexofOpeningBrace
-	 *            the location of opening brace to match
-	 * 
-	 * @return the index of the matching closing brace
-	 * 
-	 * @throws ReferenceSyntaxException
-	 *             if matching brace cannot be found
-	 */
-	private static int indexOfMatchingClosingBrace(String expressionString,
-			int indexofOpeningBrace) {
-		int len = expressionString.length();
-		int i = indexofOpeningBrace + 1;
-
-		// Loop through quoted strings
-		for (;;) {
-			if (i >= len) {
-				throw new IllegalStateException(
-						"Missing closing brace. Expression: '" //$NON-NLS-1$
-								+ expressionString + "'"); //$NON-NLS-1$
-			}
-
-			int indexofClosingBrace = expressionString.indexOf('}', i);
-			i = minIndex(indexofClosingBrace, findQuote(expressionString, i));
-
-			if (i < 0) {
-				// No delimiter found
-				throw new IllegalStateException(
-						"Missing closing brace. Expression: '" //$NON-NLS-1$
-								+ expressionString + "'"); //$NON-NLS-1$
-			}
-
-			// 1. If quoted literal, find closing quote
-			if (i != indexofClosingBrace) {
-				i = indexOfMatchingClosingQuote(expressionString, i) + 1;
-				if (i == 0) {
-					// Note: if no match, i==0 because -1 + 1 = 0
-					throw new IllegalStateException(
-							"Missing closing quote. Expression: '" //$NON-NLS-1$
-									+ expressionString + "'"); //$NON-NLS-1$
-				}
-			} else {
-				// Closing brace
-				return i;
-			}
-		}
-	}
-
-	/**
-	 * Returns the index of the matching closing quote, skipping over escaped
-	 * quotes
-	 * 
-	 * @param expressionString
-	 *            string to scan
-	 * @param indexOfOpeningQuote
-	 *            start from this position in the string
-	 * @return -1 if no match, the index of closing quote otherwise
-	 */
-	private static int indexOfMatchingClosingQuote(String expressionString,
-			int indexOfOpeningQuote) {
-		char quote = expressionString.charAt(indexOfOpeningQuote);
-		for (int i = expressionString.indexOf(quote, indexOfOpeningQuote + 1); i >= 0; i = expressionString
-				.indexOf(quote, i + 1)) {
-			if (!isEscaped(expressionString, i)) {
-				return i;
-			}
-		}
-
-		// No matching quote found
-		return -1;
-	}
-
-	private static boolean isEscaped(String expressionString, int i) {
-		int escapeCharCount = 0;
-		while ((--i >= 0) && (expressionString.charAt(i) == '\\')) {
-			escapeCharCount++;
-		}
-
-		return (escapeCharCount % 2) != 0;
-	}
-
-	/**
-	 * Returns the minimum index >= 0, if any
-	 * 
-	 * <p>
-	 * Use to find the first of two characters in a string:<br>
-	 * <code>minIndex(s.indexOf('/'), indexOf('\'))</code>
-	 * </p>
-	 * @param a 
-	 * @param b 
-	 * @return the minimum index >= 0, if any
-	 * 
-	 */
-	public static int minIndex(int a, int b) {
-		return (a < 0) ? b : (b < 0) ? a : (a < b) ? a : b;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/internal/pagevar/DocumentPageVariableAdapter.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/internal/pagevar/DocumentPageVariableAdapter.java
deleted file mode 100644
index ebd93fe..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/internal/pagevar/DocumentPageVariableAdapter.java
+++ /dev/null
@@ -1,212 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsp.core.internal.pagevar;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jst.pagedesigner.jsp.core.ListenerList;
-import org.eclipse.jst.pagedesigner.jsp.core.pagevar.IChangeListener;
-import org.eclipse.jst.pagedesigner.jsp.core.pagevar.IVariableInfo;
-import org.eclipse.jst.pagedesigner.jsp.core.pagevar.adapter.IDocumentPageVariableAdapter;
-import org.eclipse.jst.pagedesigner.jsp.core.pagevar.adapter.IPageVariableAdapter;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-/**
- * This adapter will be adapted on the JSP document.
- * 
- * @author mengbo
- * @version 1.5
- */
-public class DocumentPageVariableAdapter implements
-		IDocumentPageVariableAdapter {
-	private IDOMDocument _document;
-
-	private ListenerList _changeListeners = new ListenerList(2);
-
-	private List _variableInfos = new ArrayList();
-
-	private boolean _readingInfo = false;
-
-	/**
-	 * @param doc 
-	 * 
-	 */
-	public DocumentPageVariableAdapter(IDOMDocument doc) {
-		super();
-		this._document = doc;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.jsp.core.pagevar.IPageVariablesProvider#getBeanInfos()
-	 */
-	public IVariableInfo[] getBeanInfos() {
-		IVariableInfo[] ret = new IVariableInfo[_variableInfos.size()];
-		return (IVariableInfo[]) _variableInfos.toArray(ret);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.jsp.core.pagevar.IPageVariablesProvider#addChangeListener(org.eclipse.jst.pagedesigner.jsp.core.pagevar.IChangeListener)
-	 */
-	public void addChangeListener(IChangeListener listener) {
-		this.reReadInfo();
-		_changeListeners.add(listener);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.jsp.core.pagevar.IPageVariablesProvider#removeChangeListener(org.eclipse.jst.pagedesigner.jsp.core.pagevar.IChangeListener)
-	 */
-	public void removeChangeListener(IChangeListener listener) {
-		_changeListeners.remove(listener);
-	}
-
-	/**
-	 * fire change events on all listeners
-	 */
-	protected void fireChanged() {
-		Object[] listeners = _changeListeners.getListeners();
-		for (int i = 0; i < listeners.length; i++) {
-			IChangeListener l = (IChangeListener) listeners[i];
-			l.changed();
-		}
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.sse.core.internal.provisional.INodeAdapter#isAdapterForType(java.lang.Object)
-	 */
-	public boolean isAdapterForType(Object type) {
-		return IDocumentPageVariableAdapter.class.equals(type);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.sse.core.internal.provisional.INodeAdapter#notifyChanged(org.eclipse.wst.sse.core.internal.provisional.INodeNotifier,
-	 *      int, java.lang.Object, java.lang.Object, java.lang.Object, int)
-	 */
-	public void notifyChanged(INodeNotifier notifier, int eventType,
-			Object changedFeature, Object oldValue, Object newValue, int pos) {
-		switch (eventType) {
-		case INodeNotifier.STRUCTURE_CHANGED:
-		case INodeNotifier.CONTENT_CHANGED:
-		case INodeNotifier.CHANGE:
-			refresh();
-			break;
-		default:
-			// skip. Ignore other kinds of change.
-		}
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.jsp.core.pagevar.IPageVariablesProvider#refresh()
-	 */
-	public void refresh() {
-		reReadInfo();
-	}
-
-	/**
-	 * re-read page variable info
-	 */
-	protected void reReadInfo() {
-		if (this._readingInfo) {
-			return;
-		}
-		try {
-			List oldInfo = this._variableInfos;
-			this._variableInfos = new ArrayList();
-			readNode(_document);
-			if (!isSame(oldInfo, this._variableInfos)) {
-				fireChanged();
-			}
-		} finally {
-			this._readingInfo = false;
-		}
-	}
-
-	/**
-	 * compare two variable info list.
-	 * 
-	 * @param oldInfo
-	 * @param list
-	 * @return true if same.
-	 */
-	private boolean isSame(List oldInfo, List list) {
-		if (oldInfo.size() != list.size()) {
-			return false;
-		}
-		for (int i = 0, size = oldInfo.size(); i < size; i++) {
-			IVariableInfo info1 = (IVariableInfo) oldInfo.get(i);
-			IVariableInfo info2 = (IVariableInfo) list.get(i);
-			if (info1 == null) {
-				return false;// should not happen
-			}
-			if (!info1.equals(info2)) {
-				return false;
-			}
-		}
-		return true;
-	}
-
-	/**
-	 * recursively read all element, and see whether they have
-	 * IPageVariableAdapter, and then get variable info.
-	 * 
-	 * @param element
-	 */
-	private void readNode(Node node) {
-		if (node instanceof INodeNotifier && node instanceof Element) {
-			Element element = (Element) node;
-			Object obj = ((INodeNotifier) element)
-					.getAdapterFor(IPageVariableAdapter.class);
-			if (obj instanceof IPageVariableAdapter) {
-				IPageVariableAdapter adapter = (IPageVariableAdapter) obj;
-				if (adapter.supportMultipleVariable(element)) {
-					List infos = ((IPageVariableAdapter) obj)
-							.getVariableInfos(element);
-					if (infos != null) {
-						this._variableInfos.addAll(infos);
-					}
-				} else {
-					// hope not doing addAll could improve some performance.
-					IVariableInfo info = adapter.getVariableInfo(element);
-					if (info != null) {
-						this._variableInfos.add(info);
-					}
-				}
-			}
-		}
-
-		NodeList childNodes = node.getChildNodes();
-		if (childNodes != null) {
-			for (int i = 0, length = childNodes.getLength(); i < length; i++) {
-				Node childNode = childNodes.item(i);
-				readNode(childNode);
-			}
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/internal/pagevar/PageVariableAdapter.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/internal/pagevar/PageVariableAdapter.java
deleted file mode 100644
index 40e01b5..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/internal/pagevar/PageVariableAdapter.java
+++ /dev/null
@@ -1,164 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsp.core.internal.pagevar;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.jst.pagedesigner.jsp.core.pagevar.IVariableInfo;
-import org.eclipse.jst.pagedesigner.jsp.core.pagevar.adapter.IDocumentPageVariableAdapter;
-import org.eclipse.jst.pagedesigner.jsp.core.pagevar.adapter.IPageVariableAdapter;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class PageVariableAdapter implements IPageVariableAdapter {
-	static final PageVariableAdapter _instance = new PageVariableAdapter();
-
-	/**
-	 * @return the singleton instance
-	 */
-	public static PageVariableAdapter getInstance() {
-		return _instance;
-	}
-
-	/**
-	 * no external instatiation
-	 */
-	private PageVariableAdapter() {
-		super();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.sse.core.internal.provisional.INodeAdapter#isAdapterForType(java.lang.Object)
-	 */
-	public boolean isAdapterForType(Object type) {
-		return IPageVariableAdapter.class.equals(type);
-	}
-
-	private IDocumentPageVariableAdapter getDocumentAdapter(
-			INodeNotifier notifier) {
-		if (notifier instanceof IDOMNode) {
-			IDOMModel model = ((IDOMNode) notifier).getModel();
-			if (model != null) {
-				IDOMDocument document = model.getDocument();
-				if (document != null) {
-					return (IDocumentPageVariableAdapter) document
-							.getAdapterFor(IDocumentPageVariableAdapter.class);
-				}
-			}
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.sse.core.internal.provisional.INodeAdapter#notifyChanged(org.eclipse.wst.sse.core.internal.provisional.INodeNotifier,
-	 *      int, java.lang.Object, java.lang.Object, java.lang.Object, int)
-	 */
-	public void notifyChanged(INodeNotifier notifier, int eventType,
-			Object changedFeature, Object oldValue, Object newValue, int pos) {
-		IDocumentPageVariableAdapter docadapter = getDocumentAdapter(notifier);
-
-		switch (eventType) {
-		case INodeNotifier.STRUCTURE_CHANGED:
-			docadapter.refresh();
-			break;
-		case INodeNotifier.CONTENT_CHANGED:
-		case INodeNotifier.CHANGE:
-			// only this node changed, only refresh if this node is page
-			// variable node
-			if (notifier instanceof Element
-					&& supportVariableInfo((Element) notifier)) {
-				docadapter.refresh();
-			}
-			break;
-		default:
-			// skip. Ignore other kinds of change.
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.jsp.core.pagevar.adapter.IPageVariableAdapter#supportMultipleVariable(org.w3c.dom.Element)
-	 */
-	public boolean supportMultipleVariable(Element element) {
-		return false;
-	}
-
-	/**
-	 * @param element
-	 * @return
-	 */
-	private boolean supportVariableInfo(Element element) {
-		return PageVariableAdatperRegistry.getInstance().getTagVarDescriptor(
-				element) != null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.jsp.core.pagevar.adapter.IPageVariableAdapter#getVariableInfo(org.w3c.dom.Element)
-	 */
-	public IVariableInfo getVariableInfo(Element element) {
-		TagVarDescriptor desc = PageVariableAdatperRegistry.getInstance()
-				.getTagVarDescriptor(element);
-		if (desc == null) {
-			return null;
-		}
-		String name;
-		if (desc.isVarNameIsAttr()) {
-			name = element.getAttribute(desc.getVarName());
-			if (name == null || name.length() == 0) {
-				return null; // missing name.
-			}
-		} else {
-			name = desc.getVarName();
-		}
-		String type;
-		if (desc.isVarTypeStringIsAttr()) {
-			type = element.getAttribute(desc.getVarTypeString());
-			if (type == null || type.length() == 0) {
-				return null; // missing type
-			}
-		} else {
-			type = desc.getVarTypeString();
-		}
-		return new VariableInfo(name, desc.getVarTypeMode(), type);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.jsp.core.pagevar.adapter.IPageVariableAdapter#getVariableInfos(org.w3c.dom.Element)
-	 */
-	public List getVariableInfos(Element element) {
-		IVariableInfo info = getVariableInfo(element);
-		if (info == null) {
-			return Collections.EMPTY_LIST;
-		}
-        List ret = new ArrayList(1);
-        ret.add(info);
-        return ret;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/internal/pagevar/PageVariableAdatperRegistry.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/internal/pagevar/PageVariableAdatperRegistry.java
deleted file mode 100644
index e64dce6..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/internal/pagevar/PageVariableAdatperRegistry.java
+++ /dev/null
@@ -1,248 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsp.core.internal.pagevar;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtension;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jst.pagedesigner.jsp.core.IJSPCoreConstants;
-import org.eclipse.jst.pagedesigner.jsp.core.JSPCorePlugin;
-import org.eclipse.jst.pagedesigner.jsp.core.pagevar.IVariableInfo;
-import org.eclipse.jst.pagedesigner.jsp.core.util.CMUtil;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class PageVariableAdatperRegistry {
-	/**
-	 * pageVar
-	 */
-	public static final String PAGEVAR = "pageVar"; //$NON-NLS-1$
-
-	/**
-	 * taglib
-	 */
-	public static final String TAGLIB = "taglib"; //$NON-NLS-1$
-
-	/**
-	 * tag
-	 */
-	public static final String TAG = "tag"; //$NON-NLS-1$
-
-	/**
-	 * varName
-	 */
-	public static final String VARNAME = "varName"; //$NON-NLS-1$
-
-	/**
-	 * varNameIsAttr
-	 */
-	public static final String VARNAMEISATTR = "varNameIsAttr"; //$NON-NLS-1$
-
-	/**
-	 * varTypeMode
-	 */
-	public static final String VARTYPEMODE = "varTypeMode"; //$NON-NLS-1$
-
-	/**
-	 * tagName
-	 */
-	public static final String TAGNAME = "tagName"; //$NON-NLS-1$
-
-	/**
-	 * varTypeString
-	 */
-	public static final String VARTYPESTRING = "varTypeString"; //$NON-NLS-1$
-
-	/**
-	 * varTypeStringIsAttr
-	 */
-	public static final String VARTYPESTRINGISATTR = "varTypeStringIsAttr"; //$NON-NLS-1$
-
-	/**
-	 * uri
-	 */
-	public static final String URI = "uri"; //$NON-NLS-1$
-
-	private static PageVariableAdatperRegistry _instance = null;
-
-	private Map _registry;
-
-	private TagVarDescriptor _useBeanDescriptor;
-
-	/**
-	 * @return the singleton instance
-	 */
-	public static PageVariableAdatperRegistry getInstance() {
-		if (_instance == null) {
-			_instance = new PageVariableAdatperRegistry();
-		}
-		return _instance;
-	}
-
-	private PageVariableAdatperRegistry() {
-		_registry = readAllDescriptors();
-	}
-
-	// public IPageVariableAdapter createAdapter(IDOMElement ele, String uri,
-	// String tagname)
-	// {
-	// String key = uri + "#" + tagname;
-	// TagVarDescriptor desc = (TagVarDescriptor) _registry.get(key);
-	// if (desc != null)
-	// {
-	// PageVariableAdapter adapter = new PageVariableAdapter(ele);
-	// adapter.setVarName(desc.getVarName());
-	// adapter.setVarNameAttrName(desc.isVarNameIsAttr());
-	// adapter.setVarTypeString(desc.getVarTypeString());
-	// adapter.setVarTypeAttrName(desc.isVarTypeStringIsAttr());
-	// adapter.setVarTypeMode(desc.getVarTypeMode());
-	// return adapter;
-	// }
-	// else
-	// {
-	// return null;
-	// }
-	// }
-
-	private Map readAllDescriptors() {
-		Map map = new HashMap();
-
-		IExtensionPoint extensionPoint = Platform.getExtensionRegistry()
-				.getExtensionPoint(JSPCorePlugin.getPluginId(), PAGEVAR);
-		IExtension[] extensions = extensionPoint.getExtensions();
-
-		for (int i = 0; i < extensions.length; i++) {
-			IExtension ext = extensions[i];
-			IConfigurationElement[] facs = ext.getConfigurationElements();
-
-			for (int j = 0; j < facs.length; j++) {
-				if (facs[j].getName().equals(TAGLIB)) {
-					String uri = facs[j].getAttribute(URI);
-					if (uri == null || uri.length() == 0) {
-						continue;
-					}
-					IConfigurationElement[] tags = facs[j].getChildren(TAG);
-					for (int k = 0; k < tags.length; k++) {
-						TagVarDescriptor desc = new TagVarDescriptor();
-
-						String tag = tags[k].getAttribute(TAGNAME);
-						String varName = tags[k].getAttribute(VARNAME);
-						boolean varNameIsAttr = "true".equalsIgnoreCase(tags[k] //$NON-NLS-1$
-								.getAttribute(VARNAMEISATTR));
-						String varTypeString = tags[k]
-								.getAttribute(VARTYPESTRING);
-						boolean varTypeStringIsAttr = "true" //$NON-NLS-1$
-								.equalsIgnoreCase(tags[k]
-										.getAttribute(VARTYPESTRINGISATTR));
-						String varTypeModeString = tags[k]
-								.getAttribute(VARTYPEMODE);
-						int varTypeMode = toVarTypeMode(varTypeModeString);
-
-						desc.setVarName(varName);
-						desc.setVarNameIsAttr(varNameIsAttr);
-						desc.setVarTypeMode(varTypeMode);
-						desc.setVarTypeString(varTypeString);
-						desc.setVarTypeStringIsAttr(varTypeStringIsAttr);
-						desc.setTagName(tag);
-
-						// Use uri#tag as key.
-						map.put(uri + "#" + tag, desc); //$NON-NLS-1$
-					}
-				}
-			}
-		}
-
-		return map;
-	}
-
-	/**
-	 * @param varTypeModeString
-	 * @return variable typemode
-	 */
-	public static int toVarTypeMode(String varTypeModeString) {
-		if ("CLASSNAME".equalsIgnoreCase(varTypeModeString)) { //$NON-NLS-1$
-			return IVariableInfo.CLASSNAME;
-		} else if ("EXPRESSION".equalsIgnoreCase(varTypeModeString)) { //$NON-NLS-1$
-			return IVariableInfo.EXPRESSION;
-		} else if ("EXPRESSION_COLLECTION_ITEM" //$NON-NLS-1$
-				.equalsIgnoreCase(varTypeModeString)) {
-			return IVariableInfo.EXPRESSION_LISTITEM;
-		} else if ("BUNDLE".equalsIgnoreCase(varTypeModeString)) { //$NON-NLS-1$
-			return IVariableInfo.RESOURCEBUNDLE;
-		} else {
-			return IVariableInfo.EXPRESSION; // default
-		}
-	}
-
-	/**
-	 * @param uri
-	 * @param tagname
-	 * @return the tag variable descriptor for the given tag (may be null)
-	 */
-	public TagVarDescriptor getTagVarDescriptor(String uri, String tagname) {
-		String key = uri + "#" + tagname; //$NON-NLS-1$
-		return (TagVarDescriptor) _registry.get(key);
-	}
-
-	/**
-	 * @param localName
-	 * @return
-	 */
-	private TagVarDescriptor getJSPTagVarDescriptor(String localName) {
-		if (IJSPCoreConstants.TAG_USEBEAN.equals(localName)) {
-			if (_useBeanDescriptor == null) {
-				_useBeanDescriptor = new TagVarDescriptor();
-				_useBeanDescriptor.setVarName(IJSPCoreConstants.ATTR_ID);
-				_useBeanDescriptor.setVarNameIsAttr(true);
-				_useBeanDescriptor.setVarTypeMode(IVariableInfo.CLASSNAME);
-				_useBeanDescriptor
-						.setVarTypeString(IJSPCoreConstants.ATTR_CLASS);
-				_useBeanDescriptor.setVarTypeStringIsAttr(true);
-			}
-
-			return _useBeanDescriptor;
-		}
-
-		return null;
-	}
-
-	/**
-	 * @param target 
-	 * @return the tag variable descriptor for the target
-	 */
-	public TagVarDescriptor getTagVarDescriptor(Element target) {
-		if (target instanceof IDOMElement) {
-			IDOMElement xmlEle = (IDOMElement) target;
-			CMElementDeclaration decl = CMUtil.getElementDeclaration(xmlEle);
-			if (decl != null) {
-			    if (CMUtil.isJSP(decl)) {
-			        return getJSPTagVarDescriptor(xmlEle.getLocalName());
-			    }
-                String uri = CMUtil.getTagURI(decl);
-                if (uri != null) {
-                    return getTagVarDescriptor(uri, xmlEle.getLocalName());
-                }
-			}
-		}
-        return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/internal/pagevar/TagVarDescriptor.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/internal/pagevar/TagVarDescriptor.java
deleted file mode 100644
index 8e5b649..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/internal/pagevar/TagVarDescriptor.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsp.core.internal.pagevar;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TagVarDescriptor {
-	private String _varName;
-
-	private boolean _varNameIsAttr;
-
-	private String _varTypeString;
-
-	private boolean _varTypeStringIsAttr;
-
-	private int _varTypeMode;
-
-	private String _tagName;
-
-	/**
-	 * @return the varName
-	 */
-	public String getVarName() {
-		return _varName;
-	}
-
-	/**
-	 * @param varName
-	 */
-	public void setVarName(String varName) {
-		this._varName = varName;
-	}
-
-	/**
-	 * @return true if var name is attribute
-	 */
-	public boolean isVarNameIsAttr() {
-		return _varNameIsAttr;
-	}
-
-	/**
-	 * @param varNameIsAttr
-	 */
-	public void setVarNameIsAttr(boolean varNameIsAttr) {
-		this._varNameIsAttr = varNameIsAttr;
-	}
-
-	/**
-	 * @return the variable type mode
-	 */
-	public int getVarTypeMode() {
-		return _varTypeMode;
-	}
-
-	/**
-	 * @param varTypeMode
-	 */
-	public void setVarTypeMode(int varTypeMode) {
-		this._varTypeMode = varTypeMode;
-	}
-
-	/**
-	 * @return the variable type string
-	 */
-	public String getVarTypeString() {
-		return _varTypeString;
-	}
-
-	/**
-	 * @param varTypeString
-	 */
-	public void setVarTypeString(String varTypeString) {
-		this._varTypeString = varTypeString;
-	}
-
-	/**
-	 * @return true if variable type string is attr
-	 */
-	public boolean isVarTypeStringIsAttr() {
-		return _varTypeStringIsAttr;
-	}
-
-	/**
-	 * @param varTypeStringIsAttr
-	 */
-	public void setVarTypeStringIsAttr(boolean varTypeStringIsAttr) {
-		this._varTypeStringIsAttr = varTypeStringIsAttr;
-	}
-
-	/**
-	 * @param tag
-	 */
-	public void setTagName(String tag) {
-		this._tagName = tag;
-	}
-
-	/**
-	 * @return the tag name
-	 */
-	public String getTagName() {
-		return this._tagName;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/internal/pagevar/VariableInfo.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/internal/pagevar/VariableInfo.java
deleted file mode 100644
index 6b29b9a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/internal/pagevar/VariableInfo.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsp.core.internal.pagevar;
-
-import org.eclipse.jst.pagedesigner.jsp.core.pagevar.IVariableInfo;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class VariableInfo implements IVariableInfo {
-	private String _typeInfo;
-
-	private int _mode;
-
-	private String _name;
-
-	/**
-	 * @param name 
-	 * @param mode 
-	 * @param typeInfo 
-	 * 
-	 */
-	public VariableInfo(String name, int mode, String typeInfo) {
-		this._name = name;
-		this._mode = mode;
-		this._typeInfo = typeInfo;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.jsp.core.pagevar.IVariableInfo#getName()
-	 */
-	public String getName() {
-		return _name;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.jsp.core.pagevar.IVariableInfo#getMode()
-	 */
-	public int getMode() {
-		return _mode;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.jsp.core.pagevar.IVariableInfo#getTypeInfoString()
-	 */
-	public String getTypeInfoString() {
-		return _typeInfo;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Object#equals(java.lang.Object)
-	 */
-    // TODO: no hashcode override?
-	public boolean equals(Object obj) {
-		if (this == obj) {
-			return true;
-		}
-		if (obj instanceof VariableInfo) {
-			VariableInfo info = (VariableInfo) obj;
-			return this._mode == info._mode && equals(this._name, info._name)
-					&& equals(this._typeInfo, info._typeInfo);
-		}
-        return false;
-	}
-
-	private boolean equals(String s1, String s2) {
-		if (s1 == null) {
-			return s2 == null;
-		}
-        return s1.equals(s2);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/pagevar/IChangeListener.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/pagevar/IChangeListener.java
deleted file mode 100644
index 9196d0c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/pagevar/IChangeListener.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsp.core.pagevar;
-
-import java.util.EventListener;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public interface IChangeListener extends EventListener {
-	/**
-	 * fire a changed indication
-	 */
-	public void changed();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/pagevar/IPageVariablesProvider.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/pagevar/IPageVariablesProvider.java
deleted file mode 100644
index a538ec8..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/pagevar/IPageVariablesProvider.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsp.core.pagevar;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public interface IPageVariablesProvider {
-	/**
-	 * 
-	 */
-	public void refresh();
-
-	/**
-	 * @return the bean infos
-	 */
-	public IVariableInfo[] getBeanInfos();
-
-	/**
-	 * @param listener
-	 */
-	public void addChangeListener(IChangeListener listener);
-
-	/**
-	 * @param listener
-	 */
-	public void removeChangeListener(IChangeListener listener);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/pagevar/IVariableInfo.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/pagevar/IVariableInfo.java
deleted file mode 100644
index a491de0..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/pagevar/IVariableInfo.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsp.core.pagevar;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public interface IVariableInfo {
-	/**
-	 * @return the name
-	 */
-	public String getName();
-
-	/**
-	 * TODO
-	 */
-	public static final int CLASSNAME = 0;
-
-	/**
-	 * TODO
-	 */
-	public static final int EXPRESSION = 1;
-
-	/**
-	 * TODO
-	 */
-	public static final int EXPRESSION_LISTITEM = 2;
-
-	/**
-	 * TODO
-	 */
-	public static final int RESOURCEBUNDLE = 3;
-
-	/**
-	 * @return one of CLASSNAME, EXPRESSION, EXPRESSION_LISTITEM, RESOURCEBUNDLE
-	 */
-	public int getMode();
-
-	/**
-	 * type info string will have different meaning for different mode.
-	 * 
-	 * @return the type info string
-	 */
-	public String getTypeInfoString();
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/pagevar/adapter/IDocumentPageVariableAdapter.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/pagevar/adapter/IDocumentPageVariableAdapter.java
deleted file mode 100644
index 31979ef..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/pagevar/adapter/IDocumentPageVariableAdapter.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsp.core.pagevar.adapter;
-
-import org.eclipse.jst.pagedesigner.jsp.core.pagevar.IPageVariablesProvider;
-import org.eclipse.wst.sse.core.internal.provisional.INodeAdapter;
-
-/**
- * IDocumentPageVariableAdapter will be adapted to the jsp document.
- * 
- * @author mengbo
- * @version 1.5
- */
-public interface IDocumentPageVariableAdapter extends IPageVariablesProvider,
-		INodeAdapter {
-    // TODO: what's this for?
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/pagevar/adapter/IPageVariableAdapter.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/pagevar/adapter/IPageVariableAdapter.java
deleted file mode 100644
index 158799f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/pagevar/adapter/IPageVariableAdapter.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsp.core.pagevar.adapter;
-
-import java.util.List;
-
-import org.eclipse.jst.pagedesigner.jsp.core.pagevar.IVariableInfo;
-import org.eclipse.wst.sse.core.internal.provisional.INodeAdapter;
-import org.w3c.dom.Element;
-
-/**
- * A IPageVariableAdapter normally will be adapted to an JSP tag.
- * 
- * @author mengbo
- * @version 1.5
- */
-public interface IPageVariableAdapter extends INodeAdapter {
-	/**
-	 * most JSP tags will only support a single variable.
-	 * @param element 
-	 * 
-	 * @return true if the tag supports multiple variables
-	 */
-	public boolean supportMultipleVariable(Element element);
-
-	/**
-	 * If only support single variable, this method will return the variable
-	 * info. This method is provided for better performance.
-	 * 
-	 * @param element 
-	 * @return null means no variable info provided.
-	 */
-	public IVariableInfo getVariableInfo(Element element);
-
-	/**
-	 * should return a list of IVariableInfo
-	 * @param element 
-	 * 
-	 * @return the list of variable infos
-	 */
-	public List getVariableInfos(Element element);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/pagevar/adapter/PageVariableAdapterFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/pagevar/adapter/PageVariableAdapterFactory.java
deleted file mode 100644
index 1c6c64d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/pagevar/adapter/PageVariableAdapterFactory.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsp.core.pagevar.adapter;
-
-import org.eclipse.jst.pagedesigner.jsp.core.internal.pagevar.PageVariableAdapter;
-import org.eclipse.wst.sse.core.internal.provisional.AbstractAdapterFactory;
-import org.eclipse.wst.sse.core.internal.provisional.INodeAdapter;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class PageVariableAdapterFactory extends AbstractAdapterFactory {
-	/**
-	 * 
-	 */
-	public PageVariableAdapterFactory() {
-		super(IPageVariableAdapter.class, true);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @seeorg.eclipse.wst.sse.core.internal.provisional.AbstractAdapterFactory#createAdapter(org.eclipse.wst.sse.core.internal.provisional.INodeNotifier)
-	 */
-	protected INodeAdapter createAdapter(INodeNotifier target) {
-		if (target instanceof IDOMElement) {
-			return PageVariableAdapter.getInstance();
-		}
-        return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/util/CMUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/util/CMUtil.java
deleted file mode 100644
index fd299aa..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/util/CMUtil.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsp.core.util;
-
-import org.eclipse.jst.jsp.core.internal.contentmodel.tld.provisional.TLDDocument;
-import org.eclipse.jst.jsp.core.internal.contentmodel.tld.provisional.TLDElementDeclaration;
-import org.eclipse.wst.html.core.internal.provisional.HTMLCMProperties;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMDocument;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
-import org.eclipse.wst.xml.core.internal.provisional.contentmodel.CMNodeWrapper;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.eclipse.wst.xml.core.internal.ssemodelquery.ModelQueryAdapter;
-
-/**
- * Utility class to content model related information.
- * 
- * @author mengbo
- */
-public class CMUtil {
-	/**
-	 * If the element is a custom tag, get the URI of it. If the element is a
-	 * standard JSP tag, return null. If is not jsp tag, then return null
-	 * @param decl 
-	 * @return the tag uri for decl
-	 */
-	public static String getTagURI(CMElementDeclaration decl) {
-		if (decl instanceof CMNodeWrapper) {
-			decl = (CMElementDeclaration) ((CMNodeWrapper) decl)
-					.getOriginNode();
-		}
-		if (decl instanceof TLDElementDeclaration) {
-			CMDocument doc = ((TLDElementDeclaration) decl).getOwnerDocument();
-			if (doc instanceof TLDDocument) {
-				return ((TLDDocument) doc).getUri();
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * get element declaration of specified element
-	 * 
-	 * @param element
-	 * @return null if can't get it.
-	 */
-	public static CMElementDeclaration getElementDeclaration(IDOMElement element) {
-		INodeNotifier notifier = (INodeNotifier) element.getOwnerDocument();
-		if (notifier == null) {
-			return null;
-		}
-		ModelQueryAdapter mqa = (ModelQueryAdapter) notifier
-				.getAdapterFor(ModelQueryAdapter.class);
-		if (mqa == null) {
-			return null;
-		}
-		return mqa.getModelQuery().getCMElementDeclaration(element);
-	}
-
-	/**
-	 * @param element
-	 * @return the tld element declaration for element
-	 */
-	public static TLDElementDeclaration getTLDElementDeclaration(
-			IDOMElement element) {
-		CMNode decl = getElementDeclaration(element);
-		if (decl instanceof CMNodeWrapper) {
-			decl = ((CMNodeWrapper) decl).getOriginNode();
-		}
-		if (decl instanceof TLDElementDeclaration) {
-			return (TLDElementDeclaration) decl;
-		}
-        return null;
-	}
-
-	/**
-	 * @param decl 
-	 * @return true if decl is a JSP tag 
-	 */
-	public static boolean isJSP(CMElementDeclaration decl) {
-		if (!decl.supports(HTMLCMProperties.IS_JSP)) {
-			return false;
-		}
-		return ((Boolean) decl.getProperty(HTMLCMProperties.IS_JSP))
-				.booleanValue();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/.classpath b/jsf/plugins/org.eclipse.jst.pagedesigner/.classpath
deleted file mode 100644
index 472ee29..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/.cvsignore b/jsf/plugins/org.eclipse.jst.pagedesigner/.cvsignore
deleted file mode 100644
index f9eb27a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/.cvsignore
+++ /dev/null
@@ -1,3 +0,0 @@
-build.xml
-@dot
-javaCompiler...args
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/.options b/jsf/plugins/org.eclipse.jst.pagedesigner/.options
deleted file mode 100644
index 0b7e602..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/.options
+++ /dev/null
@@ -1,5 +0,0 @@
-org.eclipse.jst.pagedesigner/debug=true
-org.eclipse.jst.pagedesigner/debug/converter/load=false
-org.eclipse.jst.pagedesigner/debug/converter/selection=false
-org.eclipse.jst.pagedesigner/debug/elementedit/load=false
-org.eclipse.jst.pagedesigner/debug/elementedit/selection=false
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/.project b/jsf/plugins/org.eclipse.jst.pagedesigner/.project
deleted file mode 100644
index 290ca26..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/.project
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.jst.pagedesigner</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.jem.workbench.JavaEMFNature</nature>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-		<nature>org.eclipse.jem.beaninfo.BeanInfoNature</nature>
-	</natures>
-</projectDescription>
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/.settings/org.eclipse.core.resources.prefs b/jsf/plugins/org.eclipse.jst.pagedesigner/.settings/org.eclipse.core.resources.prefs
deleted file mode 100644
index f2dd42a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/.settings/org.eclipse.core.resources.prefs
+++ /dev/null
@@ -1,3 +0,0 @@
-#Sun May 27 16:04:56 EDT 2007
-eclipse.preferences.version=1
-encoding/<project>=ISO-8859-1
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/.settings/org.eclipse.jdt.core.prefs b/jsf/plugins/org.eclipse.jst.pagedesigner/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 3342f83..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,87 +0,0 @@
-#Wed Mar 04 15:05:47 PST 2009
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.5
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.doc.comment.support=enabled
-org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.autoboxing=warning
-org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
-org.eclipse.jdt.core.compiler.problem.deadCode=warning
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=ignore
-org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
-org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
-org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
-org.eclipse.jdt.core.compiler.problem.invalidJavadoc=error
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocComments=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=return_tag
-org.eclipse.jdt.core.compiler.problem.missingJavadocTags=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
-org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=error
-org.eclipse.jdt.core.compiler.problem.nullReference=ignore
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
-org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore
-org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=ignore
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=ignore
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=error
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=error
-org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
-org.eclipse.jdt.core.compiler.problem.unusedLocal=error
-org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
-org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
-org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.5
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/.settings/org.eclipse.jdt.ui.prefs b/jsf/plugins/org.eclipse.jst.pagedesigner/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644
index 82eb6c1..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,3 +0,0 @@
-#Fri Apr 06 18:25:15 PDT 2007
-eclipse.preferences.version=1
-org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8"?><templates/>
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/.settings/org.eclipse.pde.prefs b/jsf/plugins/org.eclipse.jst.pagedesigner/.settings/org.eclipse.pde.prefs
deleted file mode 100644
index 6a74a22..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/.settings/org.eclipse.pde.prefs
+++ /dev/null
@@ -1,22 +0,0 @@
-#Fri May 30 11:58:12 PDT 2008
-compilers.f.unresolved-features=1
-compilers.f.unresolved-plugins=1
-compilers.incompatible-environment=1
-compilers.p.build=1
-compilers.p.deprecated=1
-compilers.p.discouraged-class=1
-compilers.p.internal=1
-compilers.p.missing-packages=0
-compilers.p.no-required-att=0
-compilers.p.not-externalized-att=0
-compilers.p.unknown-attribute=1
-compilers.p.unknown-class=1
-compilers.p.unknown-element=1
-compilers.p.unknown-identifier=1
-compilers.p.unknown-resource=1
-compilers.p.unresolved-ex-points=0
-compilers.p.unresolved-import=0
-compilers.s.create-docs=false
-compilers.s.doc-folder=doc
-compilers.s.open-tags=1
-eclipse.preferences.version=1
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/META-INF/MANIFEST.MF b/jsf/plugins/org.eclipse.jst.pagedesigner/META-INF/MANIFEST.MF
deleted file mode 100644
index 8c8f159..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,135 +0,0 @@
-Manifest-Version: 1.0
-Bundle-SymbolicName: org.eclipse.jst.pagedesigner;singleton:=true
-Bundle-Name: %pluginName
-Bundle-Version: 1.3.0.qualifier
-Bundle-Activator: org.eclipse.jst.pagedesigner.PDPlugin
-Bundle-Vendor: %providerName
-Bundle-Localization: plugin
-Require-Bundle: org.eclipse.core.runtime;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.debug.ui;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.emf.ecore;bundle-version="[2.2.0,3.0.0)",
- org.eclipse.gef;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.jface.text;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.ui.workbench.texteditor;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.wst.common.ui;bundle-version="[1.1.0,1.2.0)",
- org.eclipse.wst.common.uriresolver;bundle-version="[1.1.0,1.2.0)",
- org.eclipse.wst.sse.ui;bundle-version="[1.0.101,1.3.0)",
- org.eclipse.jst.j2ee;bundle-version="[1.1.0,1.2.0)",
- org.eclipse.jst.jsp.core;bundle-version="[1.1.0,1.3.0)",
- org.eclipse.jst.jsp.ui;bundle-version="[1.1.0,1.3.0)",
- org.eclipse.jst.j2ee.web;bundle-version="[1.1.0,1.2.0)",
- org.eclipse.jst.pagedesigner.jsp.core;bundle-version="[1.0.0,2.0.0)",
- org.eclipse.jst.jsf.common.ui;bundle-version="[1.0.0,2.0.0)",
- org.eclipse.ui.ide;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.jdt.ui;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.jst.jsf.common;bundle-version="[1.0.0,2.0.0)",
- org.eclipse.jst.jsf.core;bundle-version="[1.0.0,2.0.0)",
- org.eclipse.jdt.core;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.wst.html.ui;bundle-version="[1.0.100,1.1.0)",
- org.eclipse.wst.css.core;bundle-version="[1.1.0,1.2.0)",
- org.eclipse.wst.html.core;bundle-version="[1.1.0,1.2.0)",
- org.eclipse.wst.xml.ui;bundle-version="[1.0.100,1.2.0)",
- org.eclipse.wst.xml.core;bundle-version="[1.1.0,1.2.0)",
- org.eclipse.wst.sse.core;bundle-version="[1.1.0,1.2.0)",
- org.eclipse.ui.views.properties.tabbed;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.core.expressions;bundle-version="[3.4.0,3.5.0]",
- org.eclipse.jst.jsf.common.runtime;bundle-version="[1.0.201,2.0.0)"
-Bundle-ActivationPolicy: lazy
-Bundle-ManifestVersion: 2
-Export-Package: org.eclipse.jst.pagedesigner;x-internal:=true,
- org.eclipse.jst.pagedesigner.actions.container;x-internal:=true,
- org.eclipse.jst.pagedesigner.actions.link;x-internal:=true,
- org.eclipse.jst.pagedesigner.actions.menuextension;x-internal:=true,
- org.eclipse.jst.pagedesigner.actions.range;x-internal:=true,
- org.eclipse.jst.pagedesigner.actions.single;x-internal:=true,
- org.eclipse.jst.pagedesigner.actions.table;x-internal:=true,
- org.eclipse.jst.pagedesigner.adapters;x-internal:=true,
- org.eclipse.jst.pagedesigner.adapters.internal;x-internal:=true,
- org.eclipse.jst.pagedesigner.commands;x-internal:=true,
- org.eclipse.jst.pagedesigner.commands.html;x-internal:=true,
- org.eclipse.jst.pagedesigner.commands.nav;x-internal:=true,
- org.eclipse.jst.pagedesigner.commands.range;x-internal:=true,
- org.eclipse.jst.pagedesigner.commands.single;x-internal:=true,
- org.eclipse.jst.pagedesigner.converter,
- org.eclipse.jst.pagedesigner.converter.html;x-internal:=true,
- org.eclipse.jst.pagedesigner.converter.jsp;x-internal:=true,
- org.eclipse.jst.pagedesigner.css2;x-internal:=true,
- org.eclipse.jst.pagedesigner.css2.border;x-internal:=true,
- org.eclipse.jst.pagedesigner.css2.color;x-internal:=true,
- org.eclipse.jst.pagedesigner.css2.font;x-internal:=true,
- org.eclipse.jst.pagedesigner.css2.layout;x-internal:=true,
- org.eclipse.jst.pagedesigner.css2.layout.table;x-internal:=true,
- org.eclipse.jst.pagedesigner.css2.list;x-internal:=true,
- org.eclipse.jst.pagedesigner.css2.marker;x-internal:=true,
- org.eclipse.jst.pagedesigner.css2.property;x-internal:=true,
- org.eclipse.jst.pagedesigner.css2.provider;x-internal:=true,
- org.eclipse.jst.pagedesigner.css2.style;x-internal:=true,
- org.eclipse.jst.pagedesigner.css2.value;x-internal:=true,
- org.eclipse.jst.pagedesigner.css2.widget;x-internal:=true,
- org.eclipse.jst.pagedesigner.dnd;x-internal:=true,
- org.eclipse.jst.pagedesigner.dnd.internal;x-internal:=true,
- org.eclipse.jst.pagedesigner.dom;x-internal:=true,
- org.eclipse.jst.pagedesigner.dom.html;x-internal:=true,
- org.eclipse.jst.pagedesigner.dtmanager,
- org.eclipse.jst.pagedesigner.dtmanager.converter,
- org.eclipse.jst.pagedesigner.dtmanager.converter.internal;x-friends:="org.eclipse.jst.pagedesigner.jsf.ui",
- org.eclipse.jst.pagedesigner.dtmanager.converter.operations,
- org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal;x-friends:="org.eclipse.jst.pagedesigner.tests",
- org.eclipse.jst.pagedesigner.dtmanager.dtinfo,
- org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl;x-internal:=true,
- org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.util;x-internal:=true,
- org.eclipse.jst.pagedesigner.dtresourceprovider;x-internal:=true,
- org.eclipse.jst.pagedesigner.editors;x-internal:=true,
- org.eclipse.jst.pagedesigner.editors.actions;x-internal:=true,
- org.eclipse.jst.pagedesigner.editors.pagedesigner;x-internal:=true,
- org.eclipse.jst.pagedesigner.editors.palette;x-internal:=true,
- org.eclipse.jst.pagedesigner.editors.palette.impl;x-internal:=true,
- org.eclipse.jst.pagedesigner.editors.properties,
- org.eclipse.jst.pagedesigner.editors.properties.internal;x-internal:=true,
- org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections,
- org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.internal.impl;x-internal:=true,
- org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.internal.util;x-internal:=true,
- org.eclipse.jst.pagedesigner.editpolicies;x-internal:=true,
- org.eclipse.jst.pagedesigner.elementedit;x-internal:=true,
- org.eclipse.jst.pagedesigner.elementedit.html;x-internal:=true,
- org.eclipse.jst.pagedesigner.elementedit.jsp;x-internal:=true,
- org.eclipse.jst.pagedesigner.extensionpoint,
- org.eclipse.jst.pagedesigner.figurehandler;x-internal:=true,
- org.eclipse.jst.pagedesigner.itemcreation;x-internal:=true,
- org.eclipse.jst.pagedesigner.itemcreation.command;x-internal:=true,
- org.eclipse.jst.pagedesigner.itemcreation.customizer;x-internal:=true,
- org.eclipse.jst.pagedesigner.itemcreation.internal;x-internal:=true,
- org.eclipse.jst.pagedesigner.meta;x-internal:=true,
- org.eclipse.jst.pagedesigner.meta.internal;x-internal:=true,
- org.eclipse.jst.pagedesigner.parts;x-internal:=true,
- org.eclipse.jst.pagedesigner.preview;x-internal:=true,
- org.eclipse.jst.pagedesigner.properties;x-friends:="org.eclipse.jst.pagedesigner.tests",
- org.eclipse.jst.pagedesigner.properties.attrgroup;x-friends:="org.eclipse.jst.pagedesigner.tests",
- org.eclipse.jst.pagedesigner.properties.celleditors;x-friends:="org.eclipse.jst.pagedesigner.tests",
- org.eclipse.jst.pagedesigner.properties.dialogfields;x-internal:=true,
- org.eclipse.jst.pagedesigner.properties.internal;x-friends:="org.eclipse.jst.pagedesigner.tests",
- org.eclipse.jst.pagedesigner.range;x-internal:=true,
- org.eclipse.jst.pagedesigner.requests;x-internal:=true,
- org.eclipse.jst.pagedesigner.tableedit;x-internal:=true,
- org.eclipse.jst.pagedesigner.tools;x-internal:=true,
- org.eclipse.jst.pagedesigner.ui.common;x-internal:=true,
- org.eclipse.jst.pagedesigner.ui.common.sash;x-internal:=true,
- org.eclipse.jst.pagedesigner.ui.dialogfields;x-internal:=true,
- org.eclipse.jst.pagedesigner.ui.dialogs;x-internal:=true,
- org.eclipse.jst.pagedesigner.ui.preferences;x-internal:=true,
- org.eclipse.jst.pagedesigner.utils;x-internal:=true,
- org.eclipse.jst.pagedesigner.validation.caret;x-internal:=true,
- org.eclipse.jst.pagedesigner.viewer;x-internal:=true
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
-Import-Package: javax.servlet;version="2.4.0",
- javax.servlet.http;version="2.4.0",
- javax.servlet.jsp;version="2.0.0",
- javax.servlet.jsp.el;version="2.0.0",
- javax.servlet.jsp.resources;version="2.0.0",
- javax.servlet.jsp.tagext;version="2.0.0",
- javax.servlet.resources;version="2.4.0",
- org.apache.commons.el;version="1.0.0",
- org.apache.commons.el.parser;version="1.0.0"
-
-
-
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/about.html b/jsf/plugins/org.eclipse.jst.pagedesigner/about.html
deleted file mode 100644
index 90bd74d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/about.html
+++ /dev/null
@@ -1,22 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<head>
-<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
-<title>About</title>
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>June, 2008</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise indicated below, the Content is provided to you under the terms and conditions of the
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content.</p>
-
-</body>
-</html>
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/build.properties b/jsf/plugins/org.eclipse.jst.pagedesigner/build.properties
deleted file mode 100644
index fdf6446..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/build.properties
+++ /dev/null
@@ -1,24 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2008 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-jars.compile.order = .
-source.. = src/
-output.. = bin/
-bin.includes = .,\
-               META-INF/,\
-               icons/,\
-               plugin.properties,\
-               plugin.xml,\
-               schema/,\
-               about.html,\
-               default.properties,\
-               .options
-javacSource=1.5
-javacTarget=1.5
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/default.properties b/jsf/plugins/org.eclipse.jst.pagedesigner/default.properties
deleted file mode 100644
index d6297e4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/default.properties
+++ /dev/null
@@ -1,12 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-# This file contains all the Default Preference Settings
-
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/LineBreak.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/LineBreak.gif
deleted file mode 100644
index b468685..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/LineBreak.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/MoveHandle.png b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/MoveHandle.png
deleted file mode 100644
index 679ef99..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/MoveHandle.png
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Binding.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Binding.gif
deleted file mode 100644
index 6638a99..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Binding.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Binding_disabled.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Binding_disabled.gif
deleted file mode 100644
index c5064fd..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Binding_disabled.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Plugin.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Plugin.gif
deleted file mode 100644
index 471b1b5..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Plugin.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_bold.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_bold.gif
deleted file mode 100644
index f814851..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_bold.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_bold_disabled.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_bold_disabled.gif
deleted file mode 100644
index 639de46..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_bold_disabled.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_designer.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_designer.gif
deleted file mode 100644
index fdfcae0..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_designer.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_hsplit.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_hsplit.gif
deleted file mode 100644
index 4dae95d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_hsplit.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_italic.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_italic.gif
deleted file mode 100644
index fb765fe..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_italic.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_italic_disabled.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_italic_disabled.gif
deleted file mode 100644
index 7475315..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_italic_disabled.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_largefont.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_largefont.gif
deleted file mode 100644
index 39afd38..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_largefont.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_largefont_disabled.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_largefont_disabled.gif
deleted file mode 100644
index fe38ccb..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_largefont_disabled.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_paragraph.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_paragraph.gif
deleted file mode 100644
index b129090..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_paragraph.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_smallfont.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_smallfont.gif
deleted file mode 100644
index f0b4eba..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_smallfont.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_smallfont_disabled.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_smallfont_disabled.gif
deleted file mode 100644
index c02528a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_smallfont_disabled.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_source.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_source.gif
deleted file mode 100644
index 86986df..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_source.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_underline.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_underline.gif
deleted file mode 100644
index b8ac977..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_underline.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_underline_disabled.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_underline_disabled.gif
deleted file mode 100644
index f06517b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_underline_disabled.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_vsplit.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_vsplit.gif
deleted file mode 100644
index 6564d07..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_vsplit.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_nopic.jpg b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_nopic.jpg
deleted file mode 100644
index f98b233..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_nopic.jpg
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/library_obj.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/library_obj.gif
deleted file mode 100644
index cb55e33..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/library_obj.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/newsuade_wiz.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/newsuade_wiz.gif
deleted file mode 100644
index ecd75f4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/newsuade_wiz.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/GENERIC/large/PD_Palette_Default.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/GENERIC/large/PD_Palette_Default.gif
deleted file mode 100644
index a320fcb..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/GENERIC/large/PD_Palette_Default.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/GENERIC/small/PD_Palette_Default.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/GENERIC/small/PD_Palette_Default.gif
deleted file mode 100644
index 5e7fb33..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/GENERIC/small/PD_Palette_Default.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/GENERIC/small/PD_Palette_Export.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/GENERIC/small/PD_Palette_Export.gif
deleted file mode 100644
index 095beb0..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/GENERIC/small/PD_Palette_Export.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/GENERIC/small/PD_Palette_Export_Disabled.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/GENERIC/small/PD_Palette_Export_Disabled.gif
deleted file mode 100644
index 04800a6..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/GENERIC/small/PD_Palette_Export_Disabled.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/GENERIC/small/PD_Palette_Export_Hover.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/GENERIC/small/PD_Palette_Export_Hover.gif
deleted file mode 100644
index 095beb0..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/GENERIC/small/PD_Palette_Export_Hover.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/GENERIC/small/PD_Palette_Import.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/GENERIC/small/PD_Palette_Import.gif
deleted file mode 100644
index 0af6903..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/GENERIC/small/PD_Palette_Import.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/GENERIC/small/PD_Palette_Import_Disabled.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/GENERIC/small/PD_Palette_Import_Disabled.gif
deleted file mode 100644
index 5c828d4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/GENERIC/small/PD_Palette_Import_Disabled.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/GENERIC/small/PD_Palette_Import_Hover.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/GENERIC/small/PD_Palette_Import_Hover.gif
deleted file mode 100644
index 0af6903..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/GENERIC/small/PD_Palette_Import_Hover.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/pin_down.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/pin_down.gif
deleted file mode 100644
index e85fa90..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/pin_down.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/pin_up.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/pin_up.gif
deleted file mode 100644
index 5eeef33..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/pin_up.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/skin.png b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/skin.png
deleted file mode 100644
index 8f229e9..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/skin.png
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/model/DTInfo.ecore b/jsf/plugins/org.eclipse.jst.pagedesigner/model/DTInfo.ecore
deleted file mode 100644
index 7343bdf..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/model/DTInfo.ecore
+++ /dev/null
@@ -1,84 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ecore:EPackage xmi:version="2.0"
-    xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="dtinfo"
-    nsURI="http://org.eclipse.jsf.pagedesigner/dtinfo.ecore" nsPrefix="dti">
-  <eClassifiers xsi:type="ecore:EClass" name="DTInfo">
-    <eStructuralFeatures xsi:type="ecore:EReference" name="tagConvertInfo" lowerBound="1"
-        eType="#//TagConvertInfo" containment="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="tag-convert-info"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="tagDecorateInfos" upperBound="-1"
-        eType="#//TagDecorateInfo" containment="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="tag-decorate-info"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="TagConvertInfo">
-    <eStructuralFeatures xsi:type="ecore:EReference" name="operations" upperBound="-1"
-        eType="#//Operation" containment="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="operation"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Operation">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"
-        iD="true"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="parameters" upperBound="-1"
-        eType="#//Parameter" containment="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="parameter"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="operations" upperBound="-1"
-        eType="#//Operation" containment="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="operation"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Parameter">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="value" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="TagDecorateInfo">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"
-        iD="true"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="minHeight" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EInt"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="minWidth" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EInt"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="multiLevel" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"
-        defaultValueLiteral="false"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="needBorderDecorator" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"
-        defaultValueLiteral="false"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="needTableDecorator" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"
-        defaultValueLiteral="false"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="nonVisual" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"
-        defaultValueLiteral="false"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="nonVisualImagePath" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="resolveChildText" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"
-        defaultValueLiteral="false"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="resolveAttributeValue"
-        eType="#//ResolveAttributeValue" containment="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="resolve-attribute-value"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="setNonVisualChildElements"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean" defaultValueLiteral="false"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="widget" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"
-        defaultValueLiteral="false"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ResolveAttributeValue">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="attributeName" lowerBound="1"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-  </eClassifiers>
-</ecore:EPackage>
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/model/DTInfo.genmodel b/jsf/plugins/org.eclipse.jst.pagedesigner/model/DTInfo.genmodel
deleted file mode 100644
index a85b144..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/model/DTInfo.genmodel
+++ /dev/null
@@ -1,48 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<genmodel:GenModel xmi:version="2.0"
-    xmlns:xmi="http://www.omg.org/XMI" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore"
-    xmlns:genmodel="http://www.eclipse.org/emf/2002/GenModel" copyrightText="Copyright (c) 2007 Oracle Corporation"
-    modelDirectory="/org.eclipse.jst.pagedesigner/src" editDirectory="/org.eclipse.jst.pagedesigner/src"
-    editorDirectory="/org.eclipse.jst.pagedesigner/src" modelPluginID="org.eclipse.jst.pagedesigner"
-    modelName="DTInfo" editPluginClass="org.eclipse.jst.pagedesigner.PDPlugin" editorPluginClass="org.eclipse.jst.pagedesigner.PDPlugin"
-    testsDirectory="/org.eclipse.jst.pagedesigner/src" testSuiteClass="org.eclipse.jst.pagedesigner.PDPlugin"
-    importerID="org.eclipse.emf.importer.ecore">
-  <foreignModel>DTInfo.ecore</foreignModel>
-  <genPackages prefix="DTInfo" basePackage="org.eclipse.jst.pagedesigner.dtmanager"
-      disposableProviderFactory="true" classPackageSuffix="internal.impl" utilityPackageSuffix="internal.util"
-      providerPackageSuffix="internal.provider" presentationPackageSuffix="internal.presentation"
-      testsPackageSuffix="internal.tests" generateExampleClass="false" ecorePackage="DTInfo.ecore#/">
-    <genClasses ecoreClass="DTInfo.ecore#//DTInfo">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference DTInfo.ecore#//DTInfo/tagConvertInfo"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference DTInfo.ecore#//DTInfo/tagDecorateInfos"/>
-    </genClasses>
-    <genClasses ecoreClass="DTInfo.ecore#//TagConvertInfo">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference DTInfo.ecore#//TagConvertInfo/operations"/>
-    </genClasses>
-    <genClasses image="false" ecoreClass="DTInfo.ecore#//Operation">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute DTInfo.ecore#//Operation/id"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference DTInfo.ecore#//Operation/parameters"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference DTInfo.ecore#//Operation/operations"/>
-    </genClasses>
-    <genClasses ecoreClass="DTInfo.ecore#//Parameter">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute DTInfo.ecore#//Parameter/value"/>
-    </genClasses>
-    <genClasses ecoreClass="DTInfo.ecore#//TagDecorateInfo">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute DTInfo.ecore#//TagDecorateInfo/id"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute DTInfo.ecore#//TagDecorateInfo/minHeight"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute DTInfo.ecore#//TagDecorateInfo/minWidth"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute DTInfo.ecore#//TagDecorateInfo/multiLevel"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute DTInfo.ecore#//TagDecorateInfo/needBorderDecorator"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute DTInfo.ecore#//TagDecorateInfo/needTableDecorator"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute DTInfo.ecore#//TagDecorateInfo/nonVisual"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute DTInfo.ecore#//TagDecorateInfo/nonVisualImagePath"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute DTInfo.ecore#//TagDecorateInfo/resolveChildText"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference DTInfo.ecore#//TagDecorateInfo/resolveAttributeValue"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute DTInfo.ecore#//TagDecorateInfo/setNonVisualChildElements"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute DTInfo.ecore#//TagDecorateInfo/widget"/>
-    </genClasses>
-    <genClasses ecoreClass="DTInfo.ecore#//ResolveAttributeValue">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute DTInfo.ecore#//ResolveAttributeValue/attributeName"/>
-    </genClasses>
-  </genPackages>
-</genmodel:GenModel>
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/model/QuickEditTabSections.ecore b/jsf/plugins/org.eclipse.jst.pagedesigner/model/QuickEditTabSections.ecore
deleted file mode 100644
index 5b3c237..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/model/QuickEditTabSections.ecore
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ecore:EPackage xmi:version="2.0"
-    xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="quickedittabsections"
-    nsURI="http://org.eclipse.jsf.pagedesigner/QuickEditTabSections.ecore" nsPrefix="qe">
-  <eClassifiers xsi:type="ecore:EClass" name="QuickEditTabSections">
-    <eStructuralFeatures xsi:type="ecore:EReference" name="sections" upperBound="-1"
-        eType="#//SectionInfo" containment="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="section"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="SectionInfo">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="type" unique="false" eType="#//SECTION_TYPE"
-        defaultValueLiteral="ATTRIBUTE"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EEnum" name="SECTION_TYPE">
-    <eLiterals name="ATTRIBUTE"/>
-    <eLiterals name="SECTION" value="1"/>
-  </eClassifiers>
-</ecore:EPackage>
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/model/QuickEditTabSections.genmodel b/jsf/plugins/org.eclipse.jst.pagedesigner/model/QuickEditTabSections.genmodel
deleted file mode 100644
index 4aed6be..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/model/QuickEditTabSections.genmodel
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<genmodel:GenModel xmi:version="2.0"
-    xmlns:xmi="http://www.omg.org/XMI" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore"
-    xmlns:genmodel="http://www.eclipse.org/emf/2002/GenModel" copyrightText="Copyright (c) 2007 Oracle Corporation"
-    modelDirectory="/org.eclipse.jst.pagedesigner/src" editDirectory="/org.eclipse.jst.pagedesigner/src"
-    editorDirectory="/org.eclipse.jst.pagedesigner/src" modelPluginID="org.eclipse.jst.pagedesigner"
-    modelName="QuickEditTabSections" editPluginClass="org.eclipse.jst.pagedesigner.PDPlugin"
-    editorPluginClass="/org.eclipse.jst.pagedesigner.PDPlugin" importerID="org.eclipse.emf.importer.ecore"
-    complianceLevel="5.0" providerRootExtendsClass="">
-  <foreignModel>QuickEditTabSections.ecore</foreignModel>
-  <genPackages prefix="QuickEditTabSections" basePackage="org.eclipse.jst.pagedesigner.editors.properties"
-      disposableProviderFactory="true" classPackageSuffix="internal.impl" utilityPackageSuffix="internal.util"
-      providerPackageSuffix="internal.provider" presentationPackageSuffix="internal.presentation"
-      testsPackageSuffix="internal.tests" generateExampleClass="false" multipleEditorPages="false"
-      generateModelWizard="false" ecorePackage="QuickEditTabSections.ecore#/">
-    <genEnums typeSafeEnumCompatible="false" ecoreEnum="QuickEditTabSections.ecore#//SECTION_TYPE">
-      <genEnumLiterals ecoreEnumLiteral="QuickEditTabSections.ecore#//SECTION_TYPE/ATTRIBUTE"/>
-      <genEnumLiterals ecoreEnumLiteral="QuickEditTabSections.ecore#//SECTION_TYPE/GROUP"/>
-    </genEnums>
-    <genClasses ecoreClass="QuickEditTabSections.ecore#//QuickEditTabSections">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference QuickEditTabSections.ecore#//QuickEditTabSections/sections"/>
-    </genClasses>
-    <genClasses image="false" ecoreClass="QuickEditTabSections.ecore#//Section">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute QuickEditTabSections.ecore#//Section/id"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute QuickEditTabSections.ecore#//Section/type"/>
-    </genClasses>
-  </genPackages>
-</genmodel:GenModel>
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/plugin.properties b/jsf/plugins/org.eclipse.jst.pagedesigner/plugin.properties
deleted file mode 100644
index 46d2298..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/plugin.properties
+++ /dev/null
@@ -1,37 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2008 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-####################################################
-# Plugin XML information.
-####################################################
-pluginName=JavaServer Faces Tools - Web Page Editor
-providerName=Eclipse.org
-
-editor.binding.context.name=Using Web Page Editor
-editor.binding.context.description=Key binding context when using the web page editor
-# ====================================================================
-
-
-editor.name.0 = Web Page Editor
-category.name.0 = Web Page Editor Layout
-command.name.0 = Vertical Layout
-command.name.1 = Horizontal Layout
-command.name.2 = Graphical Designer
-command.name.3 = Source Code
-
-extension-point.name.0 = Web Page Editor Extension
-extension-point.name.1 = property contributor
-extension-point.name.2 = popupMenu Contributor
-extension-point.name.3 = Content Model Meta Data
-propertyTab.label.QuickEdit = Quick Edit
-propertyTab.label.Attributes = Attributes
-
-ext-pt.WPEPropPage.name = Web Page Editor
-preferencepage.webPageEditor.name=Web Page Editor
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/plugin.xml b/jsf/plugins/org.eclipse.jst.pagedesigner/plugin.xml
deleted file mode 100644
index d52b35e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/plugin.xml
+++ /dev/null
@@ -1,250 +0,0 @@
-<?eclipse version="3.0"?>
-<plugin>
-	<extension-point id="pageDesignerExtension" name="%extension-point.name.0" schema="schema/pageDesignerExtension.exsd" />
-	<extension-point id="propertyContributor" name="%extension-point.name.1" schema="schema/propertyContributor.exsd" />
-	<extension-point id="popupMenuContributor" name="%extension-point.name.2" schema="schema/popupMenuContributor.exsd"/>
-
-	<extension point="org.eclipse.ui.editors">
-		<editor class="org.eclipse.jst.pagedesigner.editors.HTMLEditor"
-			contributorClass="org.eclipse.jst.pagedesigner.editors.actions.PageDesignerActionBarContributor2"
-			default="false"
-			extensions="jsp,jspx,jsf,html,htm,xhtml"
-			icon="icons/PD_Plugin.gif"
-			id="org.eclipse.jst.pagedesigner.PageDesignerEditor"
-			name="%editor.name.0">
-		</editor>
-	</extension>
-
-	<extension point="org.eclipse.ui.actionSetPartAssociations">
-    	<actionSetPartAssociation targetID="org.eclipse.debug.ui.launchActionSet">
-        	<part id="org.eclipse.jst.pagedesigner.PageDesignerEditor"/>
-    	</actionSetPartAssociation>
-	</extension>
-
-	<extension point="org.eclipse.core.runtime.adapters">
-		<factory
-			class="org.eclipse.jst.pagedesigner.utils.UriAdapterFactory"
-			adaptableType="org.eclipse.core.resources.IProject">
-			<adapter type="org.eclipse.wst.sse.core.internal.util.URIResolver" />
-		</factory>
-	</extension>
-
-	 <extension
-       point="org.eclipse.ui.views.properties.tabbed.propertyTabs">
-		<propertyTabs
-			contributorId="org.eclipse.jst.pagedesigner.tabPropertyContributor">
-			<propertyTab label="%propertyTab.label.QuickEdit" category="Quick Edit" id="org.eclipse.jst.pagedesigner.tabQuickEdit" />
-			<propertyTab label="%propertyTab.label.Attributes" category="Attributes" id="org.eclipse.jst.pagedesigner.tabAttributes" />
-		</propertyTabs>
- 	</extension>
- 	
-  	<extension
-        point="org.eclipse.ui.views.properties.tabbed.propertySections">
-		<propertySections 
-			contributorId="org.eclipse.jst.pagedesigner.tabPropertyContributor">
-			<propertySection
-         		afterSection="top"
-         		class="org.eclipse.jst.pagedesigner.properties.AllPropertySection"
-         		id="section.allproperty"
-        	 	tab="org.eclipse.jst.pagedesigner.tabAttributes">
-  			 </propertySection>
-		</propertySections>
-	</extension>
-
-	<extension point="org.eclipse.jst.pagedesigner.pageDesignerExtension">
-		<linkCreator class="org.eclipse.jst.pagedesigner.actions.link.HtmlLinkCreator" linkIdentifier="Html Link"/>
-    <tagTransformOperation
-        class="org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.AppendChildElementOperation"
-        id="AppendChildElementOperation">
-    </tagTransformOperation>
-    <tagTransformOperation
-        class="org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.AppendChildTextFromXPathOperation"
-        id="AppendChildTextFromXPathOperation">
-    </tagTransformOperation>
-    <tagTransformOperation
-        class="org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.AppendChildTextOperation"
-        id="AppendChildTextOperation">
-    </tagTransformOperation>
-    <tagTransformOperation
-        class="org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.ConvertAttributeToTextOperation"
-        id="ConvertAttributeToTextOperation">
-    </tagTransformOperation>
-    <tagTransformOperation
-        class="org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.CopyAllAttributesOperation"
-        id="CopyAllAttributesOperation">
-    </tagTransformOperation>
-    <tagTransformOperation
-        class="org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.CopyAttributeOperation"
-        id="CopyAttributeOperation">
-    </tagTransformOperation>
-    <tagTransformOperation
-        class="org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.CopyAttributeWithRenameOperation"
-        id="CopyAttributeWithRenameOperation">
-    </tagTransformOperation>
-    <tagTransformOperation
-        class="org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.CopyChildrenOperation"
-        id="CopyChildrenOperation">
-    </tagTransformOperation>
-    <tagTransformOperation
-        class="org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.CreateAttributeFromXPathOperation"
-        id="CreateAttributeFromXPathOperation">
-    </tagTransformOperation>
-    <tagTransformOperation
-        class="org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.CreateAttributeOperation"
-        id="CreateAttributeOperation">
-    </tagTransformOperation>
-    <tagTransformOperation
-        class="org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.CreateElementOperation"
-        id="CreateElementOperation">
-    </tagTransformOperation>
-    <tagTransformOperation
-        class="org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.IfNotOperation"
-        id="IfNotOperation">
-    </tagTransformOperation>
-    <tagTransformOperation
-        class="org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.IfOperation"
-        id="IfOperation">
-    </tagTransformOperation>
-    <tagTransformOperation
-        class="org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.IterateOverElementsOperation"
-        id="IterateOverElementsOperation">
-    </tagTransformOperation>
-    <tagTransformOperation
-        class="org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.MakeParentElementCurrentOperation"
-        id="MakeParentElementCurrentOperation">
-    </tagTransformOperation>
-    <tagTransformOperation
-        class="org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.RemoveAttributeOperation"
-        id="RemoveAttributeOperation">
-    </tagTransformOperation>
-    <tagTransformOperation
-        class="org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.RenameAttributeOperation"
-        id="RenameAttributeOperation">
-    </tagTransformOperation>
-    <tagTransformOperation
-        class="org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.CheckModeOperation"
-        id="CheckModeOperation">
-    </tagTransformOperation>
-	</extension>
-	
-	<extension id="org.eclipse.jst.pagedesigner.commands" point="org.eclipse.ui.commands">
-		<category id="org.eclipse.jst.pagedesigner.pagelayout" name="%category.name.0"/>
-		<command categoryId="org.eclipse.jst.pagedesigner.pagelayout"
-			id="org.eclipse.jst.pagedesigner.vertical"
-			name="%command.name.0"/>
-		<command categoryId="org.eclipse.jst.pagedesigner.pagelayout" 
-			id="org.eclipse.jst.pagedesigner.horizotal"
-			name="%command.name.1"/>
-		<command categoryId="org.eclipse.jst.pagedesigner.pagelayout"
-			id="org.eclipse.jst.pagedesigner.design"
-			name="%command.name.2"/>
-		<command categoryId="org.eclipse.jst.pagedesigner.pagelayout"
-			id="org.eclipse.jst.pagedesigner.source"
-			name="%command.name.3"/>
-	</extension>
-	
-	<extension point="org.eclipse.ui.bindings">
-		<key commandId="org.eclipse.jst.pagedesigner.vertical"
-			schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
-			contextId="org.eclipse.jst.pagedesigner.editorContext"
-			sequence="M1+M2+F9"/>
-		<key commandId="org.eclipse.jst.pagedesigner.horizotal"
-			schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
-			contextId="org.eclipse.jst.pagedesigner.editorContext"
-			sequence="M1+M2+F10"/>
-		<key commandId="org.eclipse.jst.pagedesigner.design"
-			schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
-			contextId="org.eclipse.jst.pagedesigner.editorContext"
-			sequence="M1+M2+F11"/>
-		<key commandId="org.eclipse.jst.pagedesigner.source"
-			schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
-			contextId="org.eclipse.jst.pagedesigner.editorContext"
-			sequence="M1+M2+F12"/>
-	</extension>
-	
-	<extension point="org.eclipse.wst.sse.ui.editorConfiguration">
-		<contentOutlineConfiguration
-			class="org.eclipse.jst.pagedesigner.editors.OutlineConfiguration"
-			target="org.eclipse.jst.pagedesigner.editors.DesignerStructuredTextEditorJSP"/>
-	</extension>
-	
-	<extension point="org.eclipse.emf.ecore.generated_package">
-    <package
-          class="org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage"
-          genModel="model/DTInfo.genmodel"
-          uri="http://org.eclipse.jsf.pagedesigner/dtinfo.ecore">
-    </package>
-    <package
-          class="org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.QuickEditTabSectionsPackage"
-          genModel="model/QuickEditTabSections.genmodel"
-          uri="http://org.eclipse.jsf.pagedesigner/QuickEditTabSections.ecore">
-    </package>
-   </extension>
-
- <extension
-       point="org.eclipse.ui.contexts">
-    <context
-          description="%editor.binding.context.description"
-          id="org.eclipse.jst.pagedesigner.editorContext"
-          name="%editor.binding.context.name"
-          parentId="org.eclipse.ui.textEditorScope">
-    </context>
- </extension>
- <extension
-       point="org.eclipse.jst.jsf.core.MetaDataEnabledFeatures">
-    <MetaDataEnabledFeature
-          class="org.eclipse.jst.pagedesigner.editors.properties.internal.PropertyDescriptor"
-          typeid="org.eclipse.jst.jsf.core.attributevalues.BaseType">
-    </MetaDataEnabledFeature>
- </extension>
- <extension
-       point="org.eclipse.ui.views.properties.tabbed.propertyContributor">
-    <propertyContributor
-          contributorId="org.eclipse.jst.pagedesigner.tabPropertyContributor"
-          tabDescriptorProvider="org.eclipse.jst.pagedesigner.properties.internal.WPETabDescriptorProvider">
-       <propertyCategory></propertyCategory>
-    </propertyContributor>
- </extension>
- <extension
-       point="org.eclipse.ui.propertyPages">
-    <page
-          adaptable="true"
-          class="org.eclipse.jst.pagedesigner.ui.dialogs.WPEPropertyPage"
-          id="org.eclipse.jst.pagedesigner.WPEPropertyPage"
-          name="%ext-pt.WPEPropPage.name"
-          objectClass="org.eclipse.core.resources.IProject">
-       <enabledWhen>
-          <and>
-             <adapt type="org.eclipse.core.resources.IProject">
-                <or>
-                   <test
-                      forcePluginActivation="true"
-                      property="org.eclipse.wst.common.project.facet.core.projectFacet"
-                      value="jst.web">
-                   </test>
-                   <test
-                      forcePluginActivation="true"
-                      property="org.eclipse.wst.common.project.facet.core.projectFacet"
-                      value="wst.web">
-                   </test>
-                </or>
-             </adapt>
-          </and>
-       </enabledWhen>
-    </page>
- </extension>
- <extension
-        point="org.eclipse.ui.preferencePages">
-     <page
-           category="org.eclipse.jst.jsf.ui.JSFRootPage"
-           class="org.eclipse.jst.pagedesigner.ui.preferences.PDPreferencePage"
-           id="org.eclipse.jst.jsf.pagedesigner.ui.preferences.PDPreferences"
-           name="%preferencepage.webPageEditor.name"/>
-  </extension>
- <extension
-       point="org.eclipse.core.runtime.preferences">
-    <initializer
-          class="org.eclipse.jst.pagedesigner.ui.preferences.PDPreferences">
-    </initializer>
- </extension>
-</plugin>
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/schema/pageDesignerExtension.exsd b/jsf/plugins/org.eclipse.jst.pagedesigner/schema/pageDesignerExtension.exsd
deleted file mode 100644
index 4ed77d5..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/schema/pageDesignerExtension.exsd
+++ /dev/null
@@ -1,290 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.jst.pagedesigner" xmlns="http://www.w3.org/2001/XMLSchema">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.jst.pagedesigner" id="pageDesignerExtension" name="Web Page Editor Extension"/>
-      </appInfo>
-      <documentation>
-         &lt;p&gt;&lt;b&gt;This extension point is provisional and subject to change&lt;/b&gt;&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <annotation>
-         <appInfo>
-            <meta.element />
-         </appInfo>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="localDropHandler" minOccurs="0" maxOccurs="unbounded"/>
-            <element ref="attributeCellEditorFactory" minOccurs="0" maxOccurs="unbounded"/>
-            <element ref="tagConverterFactory" minOccurs="0" maxOccurs="unbounded"/>
-            <element ref="elementEditFactory" minOccurs="0" maxOccurs="unbounded"/>
-            <element ref="linkCreator" minOccurs="0" maxOccurs="unbounded"/>
-            <element ref="tagAttributeCellEditorFactory" minOccurs="0" maxOccurs="unbounded"/>
-            <element ref="tagTransformOperation" minOccurs="0" maxOccurs="unbounded"/>
-            <element ref="dtResourceProvider" minOccurs="0" maxOccurs="unbounded"/>
-            <element ref="propertyPageFactory" minOccurs="0" maxOccurs="unbounded"/>
-            <element ref="paletteFactory" minOccurs="0" maxOccurs="unbounded"/>
-            <element ref="attributeValueResolver" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="localDropHandler">
-      <complexType>
-         <attribute name="class" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="attributeCellEditorFactory">
-      <annotation>
-         <documentation>
-            deprecated - use tagAttributeCellEditorFactory
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="class" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" deprecated="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="tagAttributeCellEditorFactory">
-      <annotation>
-         <documentation>
-            provides ability for 3rd parties to supply their own cell and dialog field editors for MD enabled tag library attributes in the WPE tabbed property sheets
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="class" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn=":org.eclipse.jst.pagedesigner.meta.ITagAttributeCellEditorFactory"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="tagConverterFactory">
-      <complexType>
-         <attribute name="class" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="elementEditFactory">
-      <complexType>
-         <attribute name="class" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="linkCreator">
-      <complexType>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.jst.pagedesigner.actions.link.ILinkCreator"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="linkIdentifier" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="tagTransformOperation">
-      <annotation>
-         <documentation>
-            define a tag transformation operation class
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The transform operation id.    Referencers will use plugin-qualified references.   i.e if the plugin extending this was &lt;code&gt;org.foo.bar&lt;/code&gt;,  then the meta data instance that referenced this operation would specify:
- &lt;pre&gt;
-  &lt;operation id=&quot;org.foo.bar.MyTransformId&quot;/&gt;
- &lt;/pre&gt;
- 
-The exception to this rule is that if the reference is not plugin-qualified, then the reference is assumed to be a &lt;i&gt;core&lt;/i&gt; transformation and uses the &lt;code&gt;org.eclipse.jst.pagedesigner&lt;/code&gt; prefix.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  class extending the &lt;code&gt;org.eclipse.jst.pagedesigner.dtmanager.converter.operations.AbstractTransformOperation&lt;/code&gt;
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.jst.pagedesigner.dtmanager.converter.operations.AbstractTransformOperation:"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="dtResourceProvider">
-      <annotation>
-         <documentation>
-            Defines a Design-Time Resource Provider class for a specific ID.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The ID of the Design-Time Resource Provider class. This is used to map usage of each DT Resource Provider class to a specific page neing edited, and so is typically the NS URI of the tag library for which the class provides resources.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  Class extending &lt;code&gt;org.eclipse.jst.pagedesigner.dtresourceprovider.AbstractDTResourceProvider&lt;/code&gt;.
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.jst.pagedesigner.dtresourceprovider.AbstractDTResourceProvider:"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="propertyPageFactory">
-      <complexType>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  Provisional API.  If an extension point is found in the system, the Web Page Editor will use the factory implementation to provide its property page.
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.jst.pagedesigner.editors.AbstractPropertySheetPageFactory:"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="paletteFactory">
-      <complexType>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  Provisional API.  If an extension point is found in the system, the Web Page Editor will use the factory implementation to provide its paletteViewerPage
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.jst.pagedesigner.editors.palette.AbstractPaletteFactory:"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="attributeValueResolver">
-      <complexType>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.jst.pagedesigner.dtmanager.converter.internal.AbstractAttributeValueResolver:"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         2.0
-      </documentation>
-   </annotation>
-
-
-
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         Copyright 2006 Sybase and others
-All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse Public License v1.0 which accompanies this distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/schema/popupMenuContributor.exsd b/jsf/plugins/org.eclipse.jst.pagedesigner/schema/popupMenuContributor.exsd
deleted file mode 100644
index 27956f4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/schema/popupMenuContributor.exsd
+++ /dev/null
@@ -1,83 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.jst.pagedesigner">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.jst.pagedesigner" id="popupMenuContributor" name="popupMenu Contributor"/>
-      </appInfo>
-      <documentation>
-         &lt;p&gt;&lt;b&gt;This extension point is provisional and subject to change&lt;/b&gt;&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="menuItemContributor" minOccurs="1" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="menuItemContributor">
-      <complexType>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="URI" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         2.0
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         Copyright 2006 Sybase and others
-All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse Public License v1.0 which accompanies this distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/schema/propertyContributor.exsd b/jsf/plugins/org.eclipse.jst.pagedesigner/schema/propertyContributor.exsd
deleted file mode 100644
index 934161d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/schema/propertyContributor.exsd
+++ /dev/null
@@ -1,89 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.jst.pagedesigner" xmlns="http://www.w3.org/2001/XMLSchema">
-<annotation>
-      <appinfo>
-         <meta.schema plugin="org.eclipse.jst.pagedesigner" id="propertyContributor" name="property contributor"/>
-      </appinfo>
-      <documentation>
-         &lt;p&gt;&lt;b&gt;This extension point is unused and deprecated, and will be removed&lt;/b&gt;&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <annotation>
-         <appinfo>
-            <meta.element deprecated="true"/>
-         </appinfo>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="propertyContributor" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="propertyContributor">
-      <annotation>
-         <appinfo>
-            <meta.element deprecated="true"/>
-         </appinfo>
-      </annotation>
-      <complexType>
-         <attribute name="sectionDescriptorProvider" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="java"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="since"/>
-      </appinfo>
-      <documentation>
-         2.0
-      </documentation>
-   </annotation>
-
-
-
-
-   <annotation>
-      <appinfo>
-         <meta.section type="copyright"/>
-      </appinfo>
-      <documentation>
-         Copyright 2006 Sybase and others
-All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse Public License v1.0 which accompanies this distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/schema/tagProperty.xsd b/jsf/plugins/org.eclipse.jst.pagedesigner/schema/tagProperty.xsd
deleted file mode 100644
index f970c08..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/schema/tagProperty.xsd
+++ /dev/null
@@ -1,154 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<schema xmlns="http://www.w3.org/2001/XMLSchema">
-	<element name="taglib">
-		<complexType>
-			<sequence>
-				<element ref="tag" maxOccurs="unbounded"></element>
-				<element ref="definition" minOccurs="0" maxOccurs="1"></element>
-			</sequence>
-			<attribute ref="uri" />
-		</complexType>
-	</element>
-
-	<element name="tag">
-		<complexType>
-			<sequence>
-				<element ref="category" minOccurs="0"
-					maxOccurs="unbounded">
-				</element>
-				<element ref="referedcategory" minOccurs="0"
-					maxOccurs="unbounded">
-				</element>
-			</sequence>
-			<attribute ref="name"></attribute>
-		</complexType>
-	</element>
-
-	<element name="category">
-		<complexType>
-			<sequence>
-				<element ref="attribute" minOccurs="0"
-					maxOccurs="unbounded">
-				</element>
-				<element ref="referedattribute" minOccurs="0"
-					maxOccurs="unbounded">
-				</element>
-			</sequence>
-			<attribute ref="name"></attribute>
-			<attribute ref="displaylabel"></attribute>
-		</complexType>
-	</element>
-
-	<element name="referedcategory">
-		<complexType>
-			<sequence>
-				<element ref="includeattrs" minOccurs="0"
-					maxOccurs="1">
-				</element>
-				<element ref="excludeattrs" minOccurs="0"
-					maxOccurs="1">
-				</element>
-			</sequence>
-			<attribute ref="ref"></attribute>
-			<attribute ref="displaylabel"></attribute>
-		</complexType>
-	</element>
-
-	<element name="definition">
-		<complexType>
-			<sequence>
-				<element ref="categories" minOccurs="0" maxOccurs="1"></element>
-				<element ref="attributes" minOccurs="0" maxOccurs="1"></element>
-			</sequence>
-		</complexType>
-	</element>
-
-	<element name="attribute">
-		<complexType>
-			<sequence>
-				<element ref="option" minOccurs="0"
-					maxOccurs="unbounded">
-				</element>
-			</sequence>
-			<attribute ref="name"></attribute>
-			<attribute ref="displaylabel"></attribute>
-			<attribute ref="required"></attribute>
-			<attribute ref="type"></attribute>
-			<attribute ref="typeparam"></attribute>
-		</complexType>
-	</element>
-
-	<element name="referedattribute">
-		<complexType>
-			<attribute ref="ref"></attribute>
-			<attribute ref="overridename"></attribute>
-			<attribute ref="displaylabel"></attribute>
-		</complexType>
-	</element>
-
-	<element name="includeattrs">
-		<complexType>
-			<sequence>
-				<element ref="attribute" minOccurs="0"
-					maxOccurs="unbounded">
-				</element>
-				<element ref="referedattribute" minOccurs="0"
-					maxOccurs="unbounded">
-				</element>
-			</sequence>
-		</complexType>
-	</element>
-
-	<element name="excludeattrs">
-		<complexType>
-			<attribute ref="refs"></attribute>
-		</complexType>
-	</element>
-
-	<element name="categories">
-		<complexType>
-			<sequence>
-				<element ref="category"></element>
-			</sequence>
-		</complexType>
-	</element>
-
-	<element name="attributes">
-		<complexType>
-			<sequence>
-				<element ref="attribute"></element>
-			</sequence>
-		</complexType>
-	</element>
-
-	<element name="option">
-		<complexType>
-			<attribute ref="key"></attribute>
-			<attribute ref="value"></attribute>
-			<attribute ref="default"></attribute>
-		</complexType>
-	</element>
-
-	<attribute name="name" type="string"></attribute>
-
-	<attribute name="displaylabel" type="string"></attribute>
-
-	<attribute name="ref" type="string"></attribute>
-
-	<attribute name="refs" type="string"></attribute>
-
-	<attribute name="uri" type="string"></attribute>
-
-	<attribute name="type" type="string"></attribute>
-
-	<attribute name="typeparam" type="string"></attribute>
-
-	<attribute name="key" type="string"></attribute>
-
-	<attribute name="value" type="string"></attribute>
-
-	<attribute name="overridename" type="string"></attribute>
-	<attribute name="default" type="string" fixed="default"></attribute>
-	<attribute name="required" type="string" fixed="required"></attribute>
-
-</schema>
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/IHTMLConstants.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/IHTMLConstants.java
deleted file mode 100644
index 9902293..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/IHTMLConstants.java
+++ /dev/null
@@ -1,1147 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner;
-
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.jsf.core.internal.tld.TagIdentifierFactory;
-import org.eclipse.wst.xml.core.internal.provisional.contentmodel.CMDocType;
-
-/**
- * @author mengbo
- */
-public class IHTMLConstants {
-	/**
-	 * anchor tag name
-	 */
-	public static final String TAG_A = "a"; //$NON-NLS-1$
-
-	/**
-	 * abbreviated form (e.g.,WWW, HTTP, etc.) tag name
-	 */
-	public static final String TAG_ABBR = "abbr"; //  //$NON-NLS-1$
-
-	/**
-	 * acronym tag name
-	 */
-	public static final String TAG_ACRONYM = "acronym"; //$NON-NLS-1$
-
-	/**
-	 * address tag name
-	 */
-	public static final String TAG_ADDRESS = "address"; //$NON-NLS-1$
-
-	/**
-	 * Java applet tag name
-	 */
-	public static final String TAG_APPLET = "applet"; //$NON-NLS-1$
-
-	/**
-	 * client-side image map tag name
-	 */
-	public static final String TAG_AREA = "area"; //$NON-NLS-1$
-
-	// area
-
-	/**
-	 * bold text style tag name
-	 */
-	public static final String TAG_B = "b"; //$NON-NLS-1$
-
-	/**
-	 * document base URI tag name
-	 */
-	public static final String TAG_BASE = "base"; //$NON-NLS-1$
-
-	/**
-	 * base font size tag name
-	 */
-	public static final String TAG_BASEFONT = "basefont"; //$NON-NLS-1$
-
-	/**
-	 * I18N BiDi over-ride tag name
-	 */
-	public static final String TAG_BDO = "bdo";  //$NON-NLS-1$
-
-	/**
-	 * large text style tag name
-	 */
-	public static final String TAG_BIG = "big"; //$NON-NLS-1$
-
-	/**
-	 * blockquote tag name
-	 */
-	public static final String TAG_BLOCKQUOTE = "blockquote"; //$NON-NLS-1$
-
-	// quotation
-
-	/**
-	 * document body tag name
-	 */
-	public static final String TAG_BODY = "body"; //$NON-NLS-1$
-
-	/**
-	 * forced line break tag name
-	 */
-	public static final String TAG_BR = "br"; //$NON-NLS-1$
-
-	/**
-	 * push button tag name
-	 */
-	public static final String TAG_BUTTON = "button"; //$NON-NLS-1$
-
-	/**
-	 * table caption tag name
-	 */
-	public static final String TAG_CAPTION = "caption"; //$NON-NLS-1$
-
-	/**
-	 * shorthand for DIV align=center tag name
-	 */
-	public static final String TAG_CENTER = "center"; //$NON-NLS-1$
-
-	/**
-	 * citation tag name
-	 */
-	public static final String TAG_CITE = "cite"; //$NON-NLS-1$
-
-	/**
-	 * computer code fragment tag name
-	 */
-	public static final String TAG_CODE = "code"; //$NON-NLS-1$
-
-	/**
-	 * table column tag name
-	 */
-	public static final String TAG_COL = "col"; //$NON-NLS-1$
-
-	/**
-	 * table column group tag name
-	 */
-	public static final String TAG_COLGROUP = "colgroup"; //$NON-NLS-1$
-
-	/**
-	 * definition description tag name
-	 */
-	public static final String TAG_DD = "dd"; //$NON-NLS-1$
-
-	/**
-	 * deleted text tag name
-	 */
-	public static final String TAG_DEL = "del"; //$NON-NLS-1$
-
-	/**
-	 * instance definition tag name
-	 */
-	public static final String TAG_DFN = "dfn";  //$NON-NLS-1$
-
-	/**
-	 * directory list tag name
-	 */
-	public static final String TAG_DIR = "dir"; //$NON-NLS-1$
-
-	/**
-	 * generic language/style container (div) tag name
-	 */
-	public static final String TAG_DIV = "div"; //$NON-NLS-1$
-
-	/**
-	 * definition list tag name
-	 */
-	public static final String TAG_DL = "dl"; //$NON-NLS-1$
-
-	/**
-	 * definition term tag name
-	 */
-	public static final String TAG_DT = "dt"; //$NON-NLS-1$
-
-	/**
-	 * emphasis tag name
-	 */
-	public static final String TAG_EM = "em"; //$NON-NLS-1$
-
-	/**
-	 * fieldset tag name
-	 */
-	public static final String TAG_FIELDSET = "fieldset"; //$NON-NLS-1$
-
-	/**
-	 * local change to font (font) tag name
-	 */
-	public static final String TAG_FONT = "font";  //$NON-NLS-1$
-
-	/**
-	 * form tag name
-	 */
-	public static final String TAG_FORM = "form"; //$NON-NLS-1$
-
-	/**
-	 * frame tag name
-	 */
-	public static final String TAG_FRAME = "frame"; //$NON-NLS-1$
-
-	/**
-	 * frameset tag name
-	 */
-	public static final String TAG_FRAMESET = "frameset";  //$NON-NLS-1$
-	
-	/**
-	 * h1 tag name
-	 */
-	public static final String TAG_H1 = "h1";  //$NON-NLS-1$
-
-	/**
-	 * h2 tag name
-	 */
-	public static final String TAG_H2 = "h2";  //$NON-NLS-1$
-
-	/**
-	 * h3 tag name
-	 */
-	public static final String TAG_H3 = "h3";  //$NON-NLS-1$
-
-	/**
-	 * h4 tag name
-	 */
-	public static final String TAG_H4 = "h4";  //$NON-NLS-1$
-	
-	/**
-	 * h5 tag name
-	 */
-	public static final String TAG_H5 = "h5"; //$NON-NLS-1$
-
-	/**
-	 * h6 tag name
-	 */
-	public static final String TAG_H6 = "h6"; //$NON-NLS-1$
-
-	/**
-	 * head tag name
-	 */
-	public static final String TAG_HEAD = "head"; //$NON-NLS-1$
-
-	/**
-	 * horizontal rule tag name
-	 */
-	public static final String TAG_HR = "hr";  //$NON-NLS-1$
-
-	/**
-	 * document root element (html) tag name
-	 */
-	public static final String TAG_HTML = "html"; //$NON-NLS-1$
-
-	/**
-	 * italic text style tag name
-	 */
-	public static final String TAG_I = "i"; //$NON-NLS-1$
-
-	/**
-	 * inline subwindow (iframe) tag name
-	 */
-	public static final String TAG_IFRAME = "iframe"; //$NON-NLS-1$
-
-	/**
-	 * Embedded image tag name
-	 */
-	public static final String TAG_IMG = "img";  //$NON-NLS-1$
-
-	/**
-	 * input tag name
-	 */
-	public static final String TAG_INPUT = "input"; //$NON-NLS-1$
-
-	/**
-	 * inserted text tag name
-	 */
-	public static final String TAG_INS = "ins"; //$NON-NLS-1$
-
-	/**
-	 * isindex tag name
-	 */
-	public static final String TAG_ISINDEX = "isindex"; //$NON-NLS-1$
-
-	/**
-	 * text to be entered by the user tag name
-	 */
-	public static final String TAG_KBD = "kbd"; //$NON-NLS-1$
-
-	/**
-	 * form field label text tag name
-	 */
-	public static final String TAG_LABEL = "label";  //$NON-NLS-1$
-
-	/**
-	 * fieldset legend tag name
-	 */
-	public static final String TAG_LEGEND = "legend"; //$NON-NLS-1$
-
-	/**
-	 * list item tag name
-	 */
-	public static final String TAG_LI = "li";  //$NON-NLS-1$
-
-	/**
-	 * media-independent link tag name
-	 */
-	public static final String TAG_LINK = "link"; //$NON-NLS-1$
-
-	/**
-	 * client-side image map tag name
-	 */
-	public static final String TAG_MAP = "map";  //$NON-NLS-1$
-
-	/**
-	 * menu list tag name
-	 */
-	public static final String TAG_MENU = "menu"; //$NON-NLS-1$
-
-	/**
-	 * generic metainformation tag name
-	 */
-	public static final String TAG_META = "meta"; //$NON-NLS-1$
-
-	/**
-	 * noembed tag name
-	 */
-	public static final String TAG_NOEMBED = "noembed"; //$NON-NLS-1$
-
-	/**
-	 * container for non-frame-based
-     * rendering (noframes) tag name
-	 */
-	public static final String TAG_NOFRAMES = "noframes"; //$NON-NLS-1$
-
-	// 
-
-	/**
-	 * container for non-script-based
-     * rendering (noscript) tag name
-	 */
-	public static final String TAG_NOSCRIPT = "noscript"; //$NON-NLS-1$
-
-	// 
-
-	/**
-	 * generic embedded (object) tag name
-	 */
-	public static final String TAG_OBJECT = "object"; //$NON-NLS-1$
-
-	/**
-	 * ordered list tag name
-	 */
-	public static final String TAG_OL = "ol"; //$NON-NLS-1$
-
-	/**
-	 * option group tag name
-	 */
-	public static final String TAG_OPTGROUP = "optgroup";  //$NON-NLS-1$
-
-	/**
-	 * selectable choice tag name
-	 */
-	public static final String TAG_OPTION = "option"; //$NON-NLS-1$
-
-	/**
-	 * paragraph tag name
-	 */
-	public static final String TAG_P = "p"; //$NON-NLS-1$
-
-	/**
-	 * named property value tag name
-	 */
-	public static final String TAG_PARAM = "param"; //$NON-NLS-1$
-
-	/**
-	 * preformatted text tag name
-	 */
-	public static final String TAG_PRE = "pre"; //$NON-NLS-1$
-
-	/**
-	 * short inline quotation tag name
-	 */
-	public static final String TAG_Q = "q"; //$NON-NLS-1$
-
-	/**
-	 * strike-through text style tag name
-	 */
-	public static final String TAG_S = "s";  //$NON-NLS-1$
-
-	/**
-	 * sample program output tag name
-	 */
-	public static final String TAG_SAMP = "samp"; //$NON-NLS-1$
-
-	// scripts, etc.
-
-	/**
-	 * script statements tag name
-	 */
-	public static final String TAG_SCRIPT = "script";  //$NON-NLS-1$
-
-	/**
-	 * option selector tag name
-	 */
-	public static final String TAG_SELECT = "select";  //$NON-NLS-1$
-
-	/**
-	 * small text style tag name
-	 */
-	public static final String TAG_SMALL = "small";  //$NON-NLS-1$
-
-	/**
-	 * generic language/style tag name
-	 */
-	public static final String TAG_SPAN = "span"; //$NON-NLS-1$
-
-	// container
-
-	/**
-	 * strike-through text tag name
-	 */
-	public static final String TAG_STRIKE = "strike"; //$NON-NLS-1$
-
-	/**
-	 * strong emphasis tag name
-	 */
-	public static final String TAG_STRONG = "strong"; //$NON-NLS-1$
-
-	/**
-	 *  style info tag name
-	 */
-	public static final String TAG_STYLE = "style"; //$NON-NLS-1$
-
-	/**
-	 * subscript tag name
-	 */
-	public static final String TAG_SUB = "sub"; //$NON-NLS-1$
-
-	/**
-	 * superscript tag name
-	 */
-	public static final String TAG_SUP = "sup"; //$NON-NLS-1$
-
-	/**
-	 * table tag name
-	 */
-	public static final String TAG_TABLE = "table"; //$NON-NLS-1$
-
-	/**
-	 *  table body tag name
-	 */
-	public static final String TAG_TBODY = "tbody"; //$NON-NLS-1$
-
-	/**
-	 * table data cell tag name
-	 */
-	public static final String TAG_TD = "td"; //$NON-NLS-1$
-
-	/**
-	 * multi-line text
-	 */
-	public static final String TAG_TEXTAREA = "textarea"; //$NON-NLS-1$
-
-	// field
-
-	/**
-	 * table footer tag name
-	 */
-	public static final String TAG_TFOOT = "tfoot"; //$NON-NLS-1$
-
-	/**
-	 * table header cell tag name
-	 */
-	public static final String TAG_TH = "th"; //$NON-NLS-1$
-
-	/**
-	 * table header tag name
-	 */
-	public static final String TAG_THEAD = "thead"; //$NON-NLS-1$
-
-	/**
-	 * document title tag name
-	 */
-	public static final String TAG_TITLE = "title"; //$NON-NLS-1$
-
-	/**
-	 * table row tag name
-	 */
-	public static final String TAG_TR = "tr"; //$NON-NLS-1$
-
-	/**
-	 * teletype or monospaced text tag name
-	 */
-	public static final String TAG_TT = "tt";  //$NON-NLS-1$
-
-	// style
-
-	/**
-	 * underlined text style tag name
-	 */
-	public static final String TAG_U = "u";  //$NON-NLS-1$
-
-	/**
-	 * unordered list tag name
-	 */
-	public static final String TAG_UL = "ul"; //$NON-NLS-1$
-
-	/**
-	 * instance of a variable tag name
-	 */
-	public static final String TAG_VAR = "var"; //$NON-NLS-1$
-
-	/**
-	 * Tag identifier for an HTML form tag
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_HTML_FORM =
-	    TagIdentifierFactory.createJSPTagWrapper(CMDocType.HTML_DOC_TYPE, TAG_FORM);
-	
-    // program argument
-
-	/**
-	 * abbr attribute
-	 */
-	public static final String ATTR_ABBR = "abbr"; //$NON-NLS-1$
-
-	/**
-	 * accept-charset attribute
-	 */
-	public static final String ATTR_ACCEPTCHARSET = "accept-charset"; //$NON-NLS-1$
-
-	/**
-	 * accept attribute
-	 */
-	public static final String ATTR_ACCEPT = "accept"; //$NON-NLS-1$
-
-	/**
-	 * access key attribute
-	 */
-	public static final String ATTR_ACCESSKEY = "accesskey"; //$NON-NLS-1$
-
-	/**
-	 * action attribute
-	 */
-	public static final String ATTR_ACTION = "action"; //$NON-NLS-1$
-
-	/**
-	 * align attribute
-	 */
-	public static final String ATTR_ALIGN = "align"; //$NON-NLS-1$
-
-	/**
-	 * alink attribute
-	 */
-	public static final String ATTR_ALINK = "alink"; //$NON-NLS-1$
-
-	/**
-	 * alt attribute
-	 */
-	public static final String ATTR_ALT = "alt"; //$NON-NLS-1$
-
-	/**
-	 * archive attribute
-	 */
-	public static final String ATTR_ARCHIVE = "archive"; //$NON-NLS-1$
-
-	/**
-	 * axis attribute
-	 */
-	public static final String ATTR_AXIS = "axis"; //$NON-NLS-1$
-
-	/**
-	 * background attribute
-	 */
-	public static final String ATTR_BACKGROUND = "background"; //$NON-NLS-1$
-
-	/**
-	 * bgcolor attribute
-	 */
-	public static final String ATTR_BGCOLOR = "bgcolor"; //$NON-NLS-1$
-
-	/**
-	 * border attribute
-	 */
-	public static final String ATTR_BORDER = "border"; //$NON-NLS-1$
-
-	/**
-	 * cellpadding attribute
-	 */
-	public static final String ATTR_CELLPADDING = "cellpadding"; //$NON-NLS-1$
-
-	/**
-	 * cellspacing attribute
-	 */
-	public static final String ATTR_CELLSPACING = "cellspacing"; //$NON-NLS-1$
-
-	/**
-	 * char attribute
-	 */
-	public static final String ATTR_CHAR = "char"; //$NON-NLS-1$
-
-	/**
-	 * charoff attribute
-	 */
-	public static final String ATTR_CHAROFF = "charoff"; //$NON-NLS-1$
-
-	/**
-	 * charset attribute
-	 */
-	public static final String ATTR_CHARSET = "charset"; //$NON-NLS-1$
-
-	/**
-	 * checked attribute
-	 */
-	public static final String ATTR_CHECKED = "checked"; //$NON-NLS-1$
-
-	/**
-	 * cite attribute
-	 */
-	public static final String ATTR_CITE = "cite"; //$NON-NLS-1$
-
-	/**
-	 * class attribute
-	 */
-	public static final String ATTR_CLASS = "class"; //$NON-NLS-1$
-
-	/**
-	 * classid attribute
-	 */
-	public static final String ATTR_CLASSID = "classid"; //$NON-NLS-1$
-
-	/**
-	 * clear attribute
-	 */
-	public static final String ATTR_CLEAR = "clear"; //$NON-NLS-1$
-
-	/**
-	 * code attribute
-	 */
-	public static final String ATTR_CODE = "code"; //$NON-NLS-1$
-
-	/**
-	 * codebase attribute
-	 */
-	public static final String ATTR_CODEBASE = "codebase"; //$NON-NLS-1$
-
-	/**
-	 * code type attribute
-	 */
-	public static final String ATTR_CODETYPE = "codetype"; //$NON-NLS-1$
-
-	/**
-	 * color attribute
-	 */
-	public static final String ATTR_COLOR = "color"; //$NON-NLS-1$
-
-	/**
-	 * cols attribute
-	 */
-	public static final String ATTR_COLS = "cols"; //$NON-NLS-1$
-
-	/**
-	 * colspan attribute
-	 */
-	public static final String ATTR_COLSPAN = "colspan"; //$NON-NLS-1$
-
-	/**
-	 * compact attribute
-	 */
-	public static final String ATTR_COMPACT = "compact"; //$NON-NLS-1$
-
-	/**
-	 * content attribute
-	 */
-	public static final String ATTR_CONTENT = "content"; //$NON-NLS-1$
-
-	/**
-	 * coords attribute
-	 */
-	public static final String ATTR_COORDS = "coords"; //$NON-NLS-1$
-
-	/**
-	 * data attribute
-	 */
-	public static final String ATTR_DATA = "data"; //$NON-NLS-1$
-
-	/**
-	 * datetime attribute
-	 */
-	public static final String ATTR_DATETIME = "datetime"; //$NON-NLS-1$
-
-	/**
-	 * declare attribute
-	 */
-	public static final String ATTR_DECLARE = "declare"; //$NON-NLS-1$
-
-	/**
-	 * defer attribute
-	 */
-	public static final String ATTR_DEFER = "defer"; //$NON-NLS-1$
-
-	/**
-	 * dir attribute
-	 */
-	public static final String ATTR_DIR = "dir"; //$NON-NLS-1$
-
-	/**
-	 * disabled attribute
-	 */
-	public static final String ATTR_DISABLED = "disabled"; //$NON-NLS-1$
-
-	/**
-	 * enctype attribute
-	 */
-	public static final String ATTR_ENCTYPE = "enctype"; //$NON-NLS-1$
-
-	/**
-	 * face attribute
-	 */
-	public static final String ATTR_FACE = "face"; //$NON-NLS-1$
-
-	/**
-	 * for  attribute
-	 */
-	public static final String ATTR_FOR = "for"; //$NON-NLS-1$
-
-	/**
-	 * frame attribute
-	 */
-	public static final String ATTR_FRAME = "frame"; //$NON-NLS-1$
-
-	/**
-	 * frameborder attribute
-	 */
-	public static final String ATTR_FRAMEBORDER = "frameborder"; //$NON-NLS-1$
-
-	/**
-	 * headers attribute
-	 */
-	public static final String ATTR_HEADERS = "headers"; //$NON-NLS-1$
-
-	/**
-	 * height attribute
-	 */
-	public static final String ATTR_HEIGHT = "height"; //$NON-NLS-1$
-
-	/**
-	 * href  attribute
-	 */
-	public static final String ATTR_HREF = "href"; //$NON-NLS-1$
-
-	/**
-	 * hreflang attribute
-	 */
-	public static final String ATTR_HREFLANG = "hreflang"; //$NON-NLS-1$
-
-	/**
-	 * hspace attribute
-	 */
-	public static final String ATTR_HSPACE = "hspace"; //$NON-NLS-1$
-
-	/**
-	 * http-equiv attribute
-	 */
-	public static final String ATTR_HTTPEQUIV = "http-equiv"; //$NON-NLS-1$
-
-	/**
-	 * id attribute
-	 */
-	public static final String ATTR_ID = "id"; //$NON-NLS-1$
-
-	/**
-	 * ismap attribute
-	 */
-	public static final String ATTR_ISMAP = "ismap"; //$NON-NLS-1$
-
-	/**
-	 * label attribute
-	 */
-	public static final String ATTR_LABEL = "label"; //$NON-NLS-1$
-
-	/**
-	 * lang attribute
-	 */
-	public static final String ATTR_LANG = "lang"; //$NON-NLS-1$
-
-	/**
-	 * language attribute
-	 */
-	public static final String ATTR_LANGUAGE = "language"; //$NON-NLS-1$
-
-	/**
-	 * link attribute
-	 */
-	public static final String ATTR_LINK = "link"; //$NON-NLS-1$
-
-	/**
-	 * longdesc attribute
-	 */
-	public static final String ATTR_LONGDESC = "longdesc"; //$NON-NLS-1$
-
-	/**
-	 *  marginheight attribute
-	 */
-	public static final String ATTR_MARGINHEIGHT = "marginheight"; //$NON-NLS-1$
-
-	/**
-	 * margin width attribute
-	 */
-	public static final String ATTR_MARGINWIDTH = "marginwidth"; //$NON-NLS-1$
-
-	/**
-	 * maxlength attribute
-	 */
-	public static final String ATTR_MAXLENGTH = "maxlength"; //$NON-NLS-1$
-
-	/**
-	 * media attribute
-	 */
-	public static final String ATTR_MEDIA = "media"; //$NON-NLS-1$
-
-	/**
-	 * method attribute
-	 */
-	public static final String ATTR_METHOD = "method"; //$NON-NLS-1$
-
-	/**
-	 * multiple attribute
-	 */
-	public static final String ATTR_MULTIPLE = "multiple"; //$NON-NLS-1$
-
-	/**
-	 * name attribute
-	 */
-	public static final String ATTR_NAME = "name"; //$NON-NLS-1$
-
-	/**
-	 * nohref attribute
-	 */
-	public static final String ATTR_NOHREF = "nohref"; //$NON-NLS-1$
-
-	/**
-	 * noresize attribute
-	 */
-	public static final String ATTR_NORESIZE = "noresize"; //$NON-NLS-1$
-
-	/**
-	 * noshade attribute
-	 */
-	public static final String ATTR_NOSHADE = "noshade"; //$NON-NLS-1$
-
-	/**
-	 * nowrap attribute
-	 */
-	public static final String ATTR_NOWRAP = "nowrap"; //$NON-NLS-1$
-
-	/**
-	 * object attribute
-	 */
-	public static final String ATTR_OBJECT = "object"; //$NON-NLS-1$
-
-	/**
-	 * onblur attribute
-	 */
-	public static final String ATTR_ONBLUR = "onblur"; //$NON-NLS-1$
-
-	/**
-	 * onchange attribute
-	 */
-	public static final String ATTR_ONCHANGE = "onchange"; //$NON-NLS-1$
-
-	/**
-	 * onclick attribute
-	 */
-	public static final String ATTR_ONCLICK = "onclick"; //$NON-NLS-1$
-
-	/**
-	 * ondblclick attribute
-	 */
-	public static final String ATTR_ONDBLCLICK = "ondblclick"; //$NON-NLS-1$
-
-	/**
-	 * onfocus attribute
-	 */
-	public static final String ATTR_ONFOCUS = "onfocus"; //$NON-NLS-1$
-
-	/**
-	 * onkeydown attribute
-	 */
-	public static final String ATTR_ONKEYDOWN = "onkeydown"; //$NON-NLS-1$
-
-	/**
-	 * onkeypress attribute
-	 */
-	public static final String ATTR_ONKEYPRESS = "onkeypress"; //$NON-NLS-1$
-
-	/**
-	 * onkeyup attribute
-	 */
-	public static final String ATTR_ONKEYUP = "onkeyup"; //$NON-NLS-1$
-
-	/**
-	 * onload attribute
-	 */
-	public static final String ATTR_ONLOAD = "onload"; //$NON-NLS-1$
-
-	/**
-	 * onmousedown attribute
-	 */
-	public static final String ATTR_ONMOUSEDOWN = "onmousedown"; //$NON-NLS-1$
-
-	/**
-	 * onmousemove attribute
-	 */
-	public static final String ATTR_ONMOUSEMOVE = "onmousemove"; //$NON-NLS-1$
-
-	/**
-	 * onmouseout attribute
-	 */
-	public static final String ATTR_ONMOUSEOUT = "onmouseout"; //$NON-NLS-1$
-
-	/**
-	 * onmouseover attribute
-	 */
-	public static final String ATTR_ONMOUSEOVER = "onmouseover"; //$NON-NLS-1$
-
-	/**
-	 * onmouseup attribute
-	 */
-	public static final String ATTR_ONMOUSEUP = "onmouseup"; //$NON-NLS-1$
-
-	/**
-	 * onreset attribute
-	 */
-	public static final String ATTR_ONRESET = "onreset"; //$NON-NLS-1$
-
-	/**
-	 * onselect attribute
-	 */
-	public static final String ATTR_ONSELECT = "onselect"; //$NON-NLS-1$
-
-	/**
-	 * onsubmit attribute
-	 */
-	public static final String ATTR_ONSUBMIT = "onsubmit"; //$NON-NLS-1$
-
-	/**
-	 * onunload attribute
-	 */
-	public static final String ATTR_ONUNLOAD = "onunload"; //$NON-NLS-1$
-
-	/**
-	 * profile attribute
-	 */
-	public static final String ATTR_PROFILE = "profile"; //$NON-NLS-1$
-
-	/**
-	 * prompt attribute
-	 */
-	public static final String ATTR_PROMPT = "prompt"; //$NON-NLS-1$
-
-	/**
-	 * readonly attribute
-	 */
-	public static final String ATTR_READONLY = "readonly"; //$NON-NLS-1$
-
-	/**
-	 * rel attribute
-	 */
-	public static final String ATTR_REL = "rel"; //$NON-NLS-1$
-
-	/**
-	 * rev attribute
-	 */
-	public static final String ATTR_REV = "rev"; //$NON-NLS-1$
-
-	/**
-	 * rows attribute
-	 */
-	public static final String ATTR_ROWS = "rows"; //$NON-NLS-1$
-
-	/**
-	 * rowspan attribute
-	 */
-	public static final String ATTR_ROWSPAN = "rowspan"; //$NON-NLS-1$
-
-	/**
-	 * rules attribute 
-	 */
-	public static final String ATTR_RULES = "rules"; //$NON-NLS-1$
-
-	/**
-	 * scheme attribute
-	 */
-	public static final String ATTR_SCHEME = "scheme"; //$NON-NLS-1$
-
-	/**
-	 * scope attribute
-	 */
-	public static final String ATTR_SCOPE = "scope"; //$NON-NLS-1$
-
-	/**
-	 * scrolling attribute
-	 */
-	public static final String ATTR_SCROLLING = "scrolling"; //$NON-NLS-1$
-
-	/**
-	 * selected attribute
-	 */
-	public static final String ATTR_SELECTED = "selected"; //$NON-NLS-1$
-
-	/**
-	 * shape attribute
-	 */
-	public static final String ATTR_SHAPE = "shape"; //$NON-NLS-1$
-
-	/**
-	 * size attribute
-	 */
-	public static final String ATTR_SIZE = "size"; //$NON-NLS-1$
-
-	/**
-	 * span attribute
-	 */
-	public static final String ATTR_SPAN = "span"; //$NON-NLS-1$
-
-	/**
-	 * src attribute
-	 */
-	public static final String ATTR_SRC = "src"; //$NON-NLS-1$
-
-	/**
-	 * standby attribute
-	 */
-	public static final String ATTR_STANDBY = "standby"; //$NON-NLS-1$
-
-	/**
-	 * start attribute
-	 */
-	public static final String ATTR_START = "start"; //$NON-NLS-1$
-
-	/**
-	 * style attribute
-	 */
-	public static final String ATTR_STYLE = "style"; //$NON-NLS-1$
-
-	/**
-	 * summary attribute
-	 */
-	public static final String ATTR_SUMMARY = "summary"; //$NON-NLS-1$
-
-	/**
-	 * tabindex attribute
-	 */
-	public static final String ATTR_TABINDEX = "tabindex"; //$NON-NLS-1$
-
-	/**
-	 * target attribute
-	 */
-	public static final String ATTR_TARGET = "target"; //$NON-NLS-1$
-
-	/**
-	 * text attribute
-	 */
-	public static final String ATTR_TEXT = "text"; //$NON-NLS-1$
-
-	/**
-	 * title attribute
-	 */
-	public static final String ATTR_TITLE = "title"; //$NON-NLS-1$
-
-	/**
-	 * type attribute
-	 */
-	public static final String ATTR_TYPE = "type"; //$NON-NLS-1$
-
-	/**
-	 * usemap attribute
-	 */
-	public static final String ATTR_USEMAP = "usemap"; //$NON-NLS-1$
-
-	/**
-	 * valign attribute
-	 */
-	public static final String ATTR_VALIGN = "valign"; //$NON-NLS-1$
-
-	/**
-	 * value attribute
-	 */
-	public static final String ATTR_VALUE = "value"; //$NON-NLS-1$
-
-	/**
-	 * valuetype attribute
-	 */
-	public static final String ATTR_VALUETYPE = "valuetype"; //$NON-NLS-1$
-
-	/**
-	 * version attribute
-	 */
-	public static final String ATTR_VERSION = "version"; //$NON-NLS-1$
-
-	/**
-	 * vlink attribute
-	 */
-	public static final String ATTR_VLINK = "vlink"; //$NON-NLS-1$
-
-	/**
-	 * vspace attribute
-	 */
-	public static final String ATTR_VSPACE = "vspace"; //$NON-NLS-1$
-
-	/**
-	 * width attribute
-	 */
-	public static final String ATTR_WIDTH = "width"; //$NON-NLS-1$
-
-	/**
-	 * submit type
-	 */
-	public static final String TYPE_SUBMIT = "submit"; //$NON-NLS-1$
-
-	/**
-	 * checkbox type
-	 */
-	public static final String TYPE_CHECKBOX = "checkbox"; //$NON-NLS-1$
-
-	/**
-	 * radio type
-	 */
-	public static final String TYPE_RADIO = "radio"; //$NON-NLS-1$
-
-	/**
-	 * image type
-	 */
-	public static final String TYPE_IMAGE = "image"; //$NON-NLS-1$
-
-	/**
-	 * password type
-	 */
-	public static final String TYPE_PASSWORD = "password"; //$NON-NLS-1$
-
-	/**
-	 * text type
-	 */
-	public static final String TYPE_TEXT = "text"; //$NON-NLS-1$
-
-	/**
-	 * hidden type
-	 */
-	public static final String TYPE_HIDDEN = "hidden"; //$NON-NLS-1$
-
-	/**
-	 * submit query label
-	 */
-	public static final String SUBMIT_LABEL = "Submit Query"; //$NON-NLS-1$
-
-	/**
-	 * reset label
-	 */
-	public static final String RESET_LABEL = "Reset"; //$NON-NLS-1$
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/IJMTConstants.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/IJMTConstants.java
deleted file mode 100644
index 7dbd5b8..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/IJMTConstants.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner;
-
-/**
- * JMT constants that would be used through the JMT core plugin.
- * 
- * @author mengbo
- */
-public interface IJMTConstants {
-	/**
-	 * bundle file name
-	 */
-	public static final String PAGEDESIGNER_RESOURCE_BUNDLE_FILE = "org.eclipse.jst.pagedesigner.editors.pagedesigner.JSPEditorMessages"; //$NON-NLS-1$
-
-	// Properties contains general properties and defaults to preferences.
-	/**
-	 * root resource bundle name
-	 */
-	public static final String ROOT_RESOURCEBUNDLE = "org.eclipse.jst.pagedesigner.JMTResources"; //$NON-NLS-1$
-
-	/**
-	 * default property file name
-	 */
-	public static final String DEFAULT_PROPERTIES = "default.properties"; //$NON-NLS-1$
-
-	/**
-	 * default style sheet
-	 */
-	public static final String USERAGENT = "html4.css"; //$NON-NLS-1$
-
-	/**
-	 * html editor id
-	 */
-	public static final String EDITORID_HTML = "org.eclipse.jst.pagedesigner.PageDesignerEditor"; //$NON-NLS-1$
-
-	/**
-	 * show all action preference id
-	 */
-	public static final String PREF_PALETTE_SHOW_ALL = "pref.palette.showall"; //$NON-NLS-1$
-
-	/**
-	 * local name of page designer extension
-	 */
-	public static final String EXTENSION_POINT_PAGEDESIGNER = "pageDesignerExtension"; //$NON-NLS-1$
-
-	/**
-	 * local name of cm registry extension
-	 */
-	public static final String EXTENSION_POINT_CMREGISTRY = "cmRegistry"; //$NON-NLS-1$
-
-	/**
-	 * local name of DT resource provider extension
-	 */
-	public static final String DT_RESOURCE_PROVIDER = "dtResourceProvider"; //$NON-NLS-1$
-
-	/**
-	 * local name of local drop handler extension
-	 */
-	public static final String LOCAL_DROP_HANDLER = "localDropHandler"; //$NON-NLS-1$
-
-	/**
-	 * local name of tag converter factory extension
-	 */
-	public static final String TAG_CONVERTER_FACTORY = "tagConverterFactory"; //$NON-NLS-1$
-
-	/**
-	 * local name of attribute cell editor factory extension
-	 * @deprecated and unused
-	 */
-	public static final String ATTRIBUTE_CELLEDITOR_FACTORY = "attributeCellEditorFactory"; //$NON-NLS-1$
-
-	/**
-	 * local name of tag attribute cell editor factory extension
-	 */
-	public static final String TAG_ATTRIBUTE_CELLEDITOR_FACTORY = "tagAttributeCellEditorFactory"; //$NON-NLS-1$
-	
-	/**
-	 * local name of tag transform operation extension
-	 */
-	public static final String TAG_TRANSFORM_OPERATION = "tagTransformOperation"; //$NON-NLS-1$
-	
-	/**
-	 * 
-	 * local name of element edit factory extension
-	 */
-	public static final String ELEMENT_EDIT_FACTORY = "elementEditFactory"; //$NON-NLS-1$
-
-	/**
-	 * local name of link creator extension
-	 */
-	public static final String LINK_CREATOR = "linkCreator"; //$NON-NLS-1$
-    
-	/**
-	 * extension for property page factory
-	 */
-	public static final String PROPERTY_PAGE_FACTORY = "propertyPageFactory"; //$NON-NLS-1$
-	/**
-	 * extension for palette viewer page factory
-	 */
-	public static final String PALETTE_FACTORY = "paletteFactory"; //$NON-NLS-1$
-	
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/JMTResources.properties b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/JMTResources.properties
deleted file mode 100644
index 90f1c4d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/JMTResources.properties
+++ /dev/null
@@ -1,258 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2008 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-####################################################
-# Resource message for Logging
-####################################################
-Log.Error.PageDesignerResources.Open=Error occurred getting the source bundle.
-Log.Error.MessageFormater.Format0=Error in message format.
-Log.Error.ExtensionReader.ReadLinkExtension=can't create linkCreator instance
-Log.Error.PreviewResources.ResouceNotFound=resource {0} not found
-
-Error.StringBufferWriter.Write.0=Error in string buffer writing.
-Error.RangeModeCommand.SetSelection=Selection error
-Error.SourceViewerCommand.Execution=Error in command execution
-Error.PDPlugin.Installation.0=Error starting plug-in.
-Error.PDPlugin.Installation.1=Problems starting plug-in Web Application Development.
-Error.PDPlugin.Installation.6=Problems starting plug-in Web Application Development.
-Error.DesignerPropertyTool.NatureQuerying=Error in project Java nature querying.
-Error.PDPlugin.Installation.10=log.PDPlugin.image.error
-Error.PDPlugin.Installation.13=log.PDPlugin.image.error
-Error.PDPlugin.Installation.15=error in installtion query.
-Error.ProjectResolver.GetlocationByURI.0=Error in taglib locating.
-Error.ProjectFileDialogContentProvider.0=Core error, you may need to restart the application.
-Error.EditValidateUtil.Position = Error in position validation.
-Error.EditValidateUtil.Text = Error occurred in text validation.
-Error.EditValidateUtil.Node = Error occurred in node validation.
-Error.EditValidateUtil.Range = Error occurred in range validation.
-Error.EditValidateUtil.StringIndex = Invalid string.
-Error.EditValidateUtil.IndexOffset = Invalid index or offset of string.
-CSSColorConverter.0=Error in color expression:
-CSSColorConverter.1=Error in color expression:
-Error.CSSFigure.0=Error in flowContext setting.
-Error.CSSUtil.0=Could not cast to CSS style
-Error.CSSUtil.1=Could not cast to CSS style
-Error.CSSUtil.2=Could not cast to CSS style
-Error.CSSUtil.3=Could not cast to CSS style
-Error.HTMLEditor.0=
-Error.HTMLEditor.1=Error occurred getting storage contents
-Error.HTMLEditor.2=Error occurred closing content.
-Error.HTMLEditor.3=The core has exception
-Error.HTMLEditor.4=Error occurred closing stream.
-Error.HTMLEditor.5=Error occurred initializing the editor.
-Error.HTMLEditor.6=Error occurred changing the page.
-Error.FontSizeMeta.0=Error occurred in tag font attribute calculating.
-Error.EditModelQuery.0=Error in position creation:
-Error.EditModelQuery.1=Error occurred getting node at indexed position
-Error.CommonResourceDialog.0.1=Error in project memeber querying
-Error.CommonResourceDialog.0.2=Please refer to error log for details
-Error.ImgFileFilter.1=CoreException is thrown, please refer to error log for details
-Error.ImgFileFilter.3=CoreException is thrown, please refer to error log for details
-Error.ImgFileFilter.0=Error in filtering the tree
-Error.ImgFileFilter.2=Error in getting project Nature
-Info.FontWeightMeta.0=Error occurred in integer processing.
-Warn.PolicyHelper.0=cannot get status line manager
-Warn.PolicyHelper.1=viewer is not HTML viewer
-HTMLSpecialCharHelper.3=Exception thrown
-HTMLSpecialCharHelper.2=Truncated & without ;
-HTMLSpecialCharHelper.1=Not an entity and not a &\#XXXX;
-HTMLSpecialCharHelper.0=Error in number expression
-
-####################################################
-# Resource message for RenderingTraverser
-####################################################
-RenderingTraverser.Error.FileNotFound		=	File Not Found
-RenderingTraverser.Error.UnsupportedEncoding	=	Unsupport Encoding
-RenderingTraverser.Error.IO		=	IO exception
-
-PaletteItemManager.error=error in constructor
-PaletteItemManager.initForPluginExtension.error.IOException=IOExcetpion in initForPluginExtension error
-PaletteItemManager.initForPluginExtension.error.MalformedURLException=MalformedURLException in initForPluginExtension
-PaletteItemManager.initForPluginExtension.error.InstantiationException=InstantiationException in initForPluginExtension
-PaletteItemManager.save.error.IOException=IOException when save
-ParagraphSupport.CommandLabel.Preformated=Preformated
-PaletteItemManager.loadPaletteItemState.error.IOException=IOException in loadPaletteItemState
-PaletteItemManager.loadPaletteItemState.error.SAXException=SAXException in loadPaletteItemState
-PaletteItemManager.loadPaletteItemState.error.getDocumentBuilderFail=getDocumentBuilder Failed
-
-PreviewUtil.previewFile.CoreException= CoreException previewing file
-PreviewUtil.previewFile.IOException= IOException previewing file
-
-#context menu
-ActionGroup.Submenu.TextStyle=Text Style
-ActionGroup.Submenu.Align=Align
-ActionGroup.Submenu.ParagraphFormat=Paragraph Format
-ActionGroup.Submenu.StyleClasses=Style Classes
-ActionGroup.Submenu.BorderStyle=Border Style
-ActionGroup.Submenu.Color=Color
-ActionGroup.Submenu.BackgroundColor=Background Color
-ActionGroup.Submenu.Link=Make Link...
-ActionGroup.Submenu.SelectRelative=Select Relative
-
-TableActionGroup.Submenu.SelectTable=Select Table
-TableActionGroup.Submenu.InsertRowBefore=Insert Row Before
-TableActionGroup.Submenu.InsertRowAfter=Insert Row After
-TableActionGroup.Submenu.InsertColumnBefore=Insert Column Before
-TableActionGroup.Submenu.InsertColumnAfter=Insert Column After
-TableActionGroup.Submenu.DeleteRow=Delete Row
-TableActionGroup.Submenu.DeleteColumn=Delete Column
-ElementEdit.Submenu.Table=Table
-ElementEdit.Submenu.SelectTable=Select Table
-ElementEdit.Submenu.InsertRowBefore=Insert Row Before
-ElementEdit.Submenu.InsertRowAfter=Insert Row After
-ElementEdit.Submenu.InsertColumnBefore=Insert Column Before
-ElementEdit.Submenu.InsertColumnAfter=Insert Column After
-ElementEdit.Submenu.DeleteRow=Delete Row
-ElementEdit.Submenu.DeleteColumn=Delete Column
-ElementEdit.Submenu.InsertHeader=Insert Header
-ElementEdit.Submenu.InsertFooter=Insert Footer
-ElementEdit.Submenu.DeleteHeader=Delete Header
-ElementEdit.Submenu.DeleteFooter=Delete Footer
-ElementEdit.Submenu.Taglib=Open Definition File
-TableInsertHeaderFooterCommand.ColumnHeader=Column Header
-TableInsertHeaderFooterCommand.ColumnFooter=Column Footer
-
-HeadElementEdit.Submenu.InsertStylesheetLink=Stylesheet Link
-
-Action.Name.Copy=Copy
-Action.Name.Cut=Cut
-Action.Name.Paste=Paste
-
-Message.Warning.Title=Warning
-Taglib.OpenFile.ERROR=The file that the URI refers to does not exist.
-
-MakeLinkAction.Wizard.PageTitle=Please select link type
-CreateLinkWizard.Title=Select Link Type
-LinkWizardPage.GroupTitle=Link Types
-LinkWizardPage.PreviewLabel=Preview
-
-ItemCreationEditPolicy.CommandLabel.CreateItem=Create Item
-MakeLinkCommand.Label.MakeLink=Make Link
-AttributePropertySource.CommandLabel.ChangeAttribute=Change Attribute
-ChangeAttributeAction.CommandLabel.ChangeStyleClass=Change Style Class
-BorderStyleSupport.CommandLabel.Hidden=Hidden
-BorderStyleSupport.CommandLabel.Dotted=Dotted
-BorderStyleSupport.CommandLabel.Dashed=Dashed
-BorderStyleSupport.CommandLabel.Solid=Solid
-BorderStyleSupport.CommandLabel.Double=Double
-BorderStyleSupport.CommandLabel.Groove=Groove
-BorderStyleSupport.CommandLabel.Ridge=Ridge
-BorderStyleSupport.CommandLabel.Inset=Inset
-BorderStyleSupport.CommandLabel.Outset=Outset
-ColorSupport.CommandLabel.Aqua=Aqua
-ColorSupport.CommandLabel.Black=Black
-ColorSupport.CommandLabel.Blue=Blue
-ColorSupport.CommandLabel.Fuchsia=Fuchsia
-ColorSupport.CommandLabel.Gray=Gray
-ColorSupport.CommandLabel.Green=Green
-ColorSupport.CommandLabel.Lime=Lime
-ColorSupport.CommandLabel.Maroon=Maroon
-ColorSupport.CommandLabel.Navy=Navy
-ColorSupport.CommandLabel.Olive=Olive
-ColorSupport.CommandLabel.Orange=Orange
-ColorSupport.CommandLabel.Purple=Purple
-ColorSupport.CommandLabel.Red=Red
-ColorSupport.CommandLabel.Silver=Silver
-ColorSupport.CommandLabel.Teal=Teal
-ColorSupport.CommandLabel.White=White
-ColorSupport.CommandLabel.Yellow=Yellow
-ColorSupport.CommandLabel.Default=Default
-ParagraphSupport.CommandLabel.None=None
-ParagraphSupport.CommandLabel.Paragraph=Paragraph
-ParagraphSupport.CommandLabel.Heading1=Heading 1
-ParagraphSupport.CommandLabel.Heading2=Heading 2
-ParagraphSupport.CommandLabel.Heading3=Heading 3
-ParagraphSupport.CommandLabel.Heading4=Heading 4
-ParagraphSupport.CommandLabel.Heading5=Heading 5
-ParagraphSupport.CommandLabel.Heading6=Heading 6
-ParagraphSupport.CommandLabel.P=P
-ParagraphSupport.CommandLabel.H1=H1
-ParagraphSupport.CommandLabel.H2=H2
-ParagraphSupport.CommandLabel.H3=H3
-ParagraphSupport.CommandLabel.H4=H4
-ParagraphSupport.CommandLabel.H5=H5
-ParagraphSupport.CommandLabel.H6=H6
-ParagraphSupport.CommandLabel.PRE=PRE
-HTagsInsertGroupAction.ActionLabel.Hx=Hx
-RangeStyleSupport.ActionLabel.Bold=Bold
-RangeStyleSupport.ActionLabel.Italic=Italic
-RangeStyleSupport.ActionLabel.Underline=Underline
-ShowAllAction.ActionLabel.ShowAll=Show All
-AlignSupport.ActionLabel.Left=Left
-AlignSupport.ActionLabel.Center=Center
-AlignSupport.ActionLabel.Right=Right
-AlignSupport.ActionLabel.Justify=Justify
-
-Info.ElementDescReader.ReadPropertyFile=The property file:{0} is not found
-Info.ElementDescReader.ReadPropertyFile.Key=The key:{0} is not found in file:{1}
-ChangeStyleAction.Text=Edit Style...
-
-Log.Error.HTMLStringTagConverter.Error=Error
-ConverterUtil.Description= Drag and drop Web page content here
-
-SimpleGraphicalEditor.help.id=org.eclipse.jst.pagedesigner.graphicalEditor
-DesignerTabbedPropertySheetPage.help.id=org.eclipse.jst.pagedesigner.QuickEditor
-MyPropertySheetPage.help.id=org.eclipse.jst.pagedesigner.Attributes
-StyleDialog.help.id=org.eclipse.jst.pagedesigner.styleDialog
-DesignerPaletteViewerProvider.help.id=org.eclipse.jst.pagedesigner.palette_help
-
-StyleClassSupport.Default=Default
-XMLUtil.Error.0=Error in create documentBuilder:
-XMLUtil.Error.2=Error in object persistance:
-PreviewUtil.Error.0=Error occurred processing the resource bundle:
-PreviewUtil.Error.3=Error occurred opening the file:
-PreviewHandlerNew.Error.0=Error in model release:
-PreviewConvertContext.Error.0=Error:
-CellEditorFactoryRegistry.Info.2=Error in fields retrieving:
-CellEditorFactoryRegistry.Info.3=Error in fields retrieving:
-PageExpressionContext.Info.0=Error:
-TextLayoutSupport.Info.1=Error in text painting:
-
-CMRegistry.ReadConfigration=Reading Properties Configurations
-CMRegistry.HTMLConfigration=Reading HTML Configuration ...
-CMRegistry.JSPConfigration=Reading JSP Configuration ...
-CMRegistry.OtherConfigration=Reading Other Configuration ...
-
-HTMLEditor.Design=Design
-HTMLEditor.Source=Source
-
-LocalSelectionDropTargetListener.MessageDialog.Title=Info
-LocalSelectionDropTargetListener.MessageDialog.Message=The page is deleted, save it first.
-
-LoadBundleTagConverter.convertRefresh.MalformedURLException= MalformedURLException in LoadBundleTagConverter
-LoadBundleTagConverter.convertRefresh.IOException= IOException in LoadBundleTagConverter
-
-Warning.TransformOperationFactory.ExtensionNotFound=ITransformOperation id not found in pageDesigner extension registry ("{0}")
-Warning.TransformOperationFactory.CannotLoadOpClass=Unable to load tag transform operation Class for id ("{0}")
-Warning.TransformOperationFactory.ClassNotFound=ITransformOperation class specified by name in metadata not found ("{0}")
-Warning.TransformOperationFactory.IllegalAccess=ITransformOperation class specified by name in metadata could not be legally accessed ("{0}")
-Warning.TransformOperationFactory.Instantiation=ITransformOperation class specified by name in metadata could not be instantiated ("{0}")
-Warning.TransformOperationFactory.NotAbstractTransformOperation=ITransformOperation class specified by name in metadata does not extend AbstractTransformOperation ("{0}")
-Warning.TransformOperationFactory.UnknownOperationID=Unknown operation ID specified in metadata ("{0}")
-Warning.TransformOperationFactory.TooFewParameters=Too few parameters specified in metadata for operation ("{0}")
-Warning.TransformOperationFactory.RegistryError=Unable to read "{0}" extension registry
-
-Warning.DTResourceProviderFactory.RegistryError=Unable to read "{0}" extension registry
-Warning.DTResourceProviderFactory.ClassNotFound=DT resource provider class "{0}" specified for id "{1}" could not be found
-
-Warning.ProviderClassMap.IllegalAccess=DT resource provider class "{0}" specified for id "{1}" could not be legally accessed
-Warning.ProviderClassMap.Instantiation=DT resource provider class "{0}" specified for id "{1}" could not be instantiated
-Warning.ProviderClassMap.NotIDTResourceProvider=DT resource provider class "{0}" is not correct type (must be IDTResourceProvider)
-
-Warning.DefaultDTSkin.FailureLoadingStyleSheet=DefaultDTSkin "{0}" failed to load a StyleSheet for the URL "{1}"
-
-#Errors relating to ITagCreator et al.
-Error.TagCreatorMustBeOfType=ITagCreator instances must be of type {0}.
-Error.ProblemLoadingExtensionPoint=Problem loading ITagCreatorFactory extension Point
-Error.ProblemLoadingTagCreatorFactory=Problem loading tag creator factory: {0}
-Error.ProblemLoadingExecutingTagCreator=Problem executing tag creator: {0}
-
-#Property Sheet
-QuickEditTab.no_quick_edit_md=No quick edit properties are available for the current selection
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/PDPlugin.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/PDPlugin.java
deleted file mode 100644
index 9056855..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/PDPlugin.java
+++ /dev/null
@@ -1,456 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.MissingResourceException;
-import java.util.Properties;
-import java.util.ResourceBundle;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.FileLocator;
-import org.eclipse.core.runtime.ILog;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.resource.ImageRegistry;
-import org.eclipse.jst.jsf.common.ui.internal.guiutils.Alerts;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IFileEditorInput;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.osgi.framework.BundleContext;
-
-/**
- * The main plugin class to be used in the desktop.
- */
-public class PDPlugin extends AbstractUIPlugin {
-	private static final String ICONS_LIB_PATH = "icons"; //$NON-NLS-1$
-
-	//private static final boolean ROOT_PLUGIN = false;
-
-	// The shared instance.
-	private static PDPlugin _plugin;
-
-	private static Logger _log;
-
-	private static Alerts _alerts;
-
-	private ResourceBundle _resourceBundle;
-
-	private Properties _properties;
-
-	private URL _pluginBase;
-
-	/**
-	 * The constructor.
-	 */
-	public PDPlugin() {
-		super();
-		_plugin = this;
-	}
-
-	/**
-	 * This method is called upon plug-in activation
-	 */
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-
-		try {
-			// get resource bundle.
-			_resourceBundle = ResourceBundle
-					.getBundle(IJMTConstants.ROOT_RESOURCEBUNDLE);
-			_alerts = new Alerts(this, _resourceBundle);
-
-			// get properties.
-			_properties = new Properties();
-			InputStream input = null;
-			_pluginBase = getBundle().getEntry("/"); //$NON-NLS-1$
-			try {
-				input = (new URL(_pluginBase, IJMTConstants.DEFAULT_PROPERTIES))
-						.openStream();
-				_properties.load(input);
-			} finally {
-				try {
-					input.close();
-				} catch (IOException ee)// NOPMD
-				{
-					// nothing to do when IOException throwed in closing files.
-				}
-			}
-
-			// set up logging for this plugin and everthing under it.
-			_log = new Logger(this.getBundle(), _resourceBundle);
-
-			// NOTE: add in any other plugin code statup HERE!!!!
-
-			// log.CommonPlugin=Web Application Development Common Plugin
-			// initialized on eclipse version {0}.
-
-			// log.info("log.CommonPlugin", version);
-
-		} catch (Exception ee) {
-			// only log if the logger was configured correctly.
-			if (_log != null) {
-				_log
-						.error(
-								"log.msg", //$NON-NLS-1$
-								"Problems starting plug-in Web Application Development Common.", //$NON-NLS-1$
-								ee);
-			}
-
-			throw new CoreException(
-					new Status(
-							IStatus.ERROR,
-							getBundle().getSymbolicName(),
-							IStatus.OK,
-							"Problems starting plug-in Web Application Development Common", //$NON-NLS-1$
-							ee));
-		}
-	}
-
-	/**
-	 * Returns the shared instance.
-	 * @return the default plugin
-	 */
-	public static PDPlugin getDefault() {
-		return _plugin;
-	}
-
-	/**
-	 * get the alerts objects associated with this plugin for alerting the user.
-	 * 
-	 * @return the Alerts object
-	 */
-	public static Alerts getAlerts() {
-		return _alerts;
-	}
-
-	/**
-	 * Returns a logger for the new class using this plugin for reference.
-	 * @param theClass
-	 * @return the Logger object associated with theClass
-	 */
-	public static Logger getLogger(Class theClass) {
-		if (getDefault() != null && getDefault().getRootLogger() != null) {
-			return getDefault().getRootLogger();
-		}
-		return null;
-	}
-
-	/**
-	 * Returns the plugin's root logger
-	 * @return the root logger
-	 */
-	public Logger getRootLogger() {
-		return _log;
-	}
-
-	/**
-	 * Returns this plugin's unique identifier
-	 * @return the plugin id
-	 */
-	public static String getPluginId() {
-		return getDefault().getBundle().getSymbolicName();
-	}
-
-	/**
-	 * @return the plugin's resource bundle
-	 */
-	public ResourceBundle getResourceBundle() {
-		return _resourceBundle;
-	}
-
-	/**
-	 * @param key 
-	 * @return the string from the plugin's resource bundle, or 'key' if not
-	 * found.
-	 */
-	public static String getResourceString(String key) {
-		ResourceBundle bundle = PDPlugin.getDefault().getResourceBundle();
-		try {
-			return (bundle != null) ? bundle.getString(key) : key;
-		} catch (MissingResourceException e) {
-			return '!' + key + '!';
-		}
-	}
-
-	/**
-	 * @return the plugin's descriptor's resource bundle,
-	 */
-	public ResourceBundle getPluginDecriptorBundle() {
-		return Platform.getResourceBundle(getDefault().getBundle());
-	}
-
-	/**
-	 * @return the plugin's default properties. These are normally used for
-	 * default preferences.
-	 */
-	public Properties getProperties() {
-		return _properties;
-	}
-
-	/**
-	 * @return the standard display to be used. The method first checks, if the
-	 * thread calling this method has an associated dispaly. If so, this display
-	 * is returned. Otherwise the method returns the default display.
-	 */
-	public static Display getStandardDisplay() {
-		Display display;
-		display = Display.getCurrent();
-		if (display == null) {
-			display = Display.getDefault();
-		}
-		return display;
-	}
-
-	/**
-	 * @return the workspace instance.
-	 */
-	public static IWorkspace getWorkspace() {
-		return ResourcesPlugin.getWorkspace();
-	}
-
-	/**
-	 * Returns a shared image for the given name.  Image must exist in icons folder of pagedesigner plugin.
-	 * <p>
-	 * Note: Images returned from this method will be automitically disposed of
-	 * when this plug-in shuts down. Callers must not dispose of these images
-	 * themselves.
-	 * </p>
-	 * 
-	 * @param name
-	 *            the image name found in /icons (with extension)
-	 * @return the image, null on error or not found.
-	 */
-	public Image getImage(String name) {
-		if (name == null) {
-			return null;
-		}
-
-		ImageRegistry images = getImageRegistry();
-		Image image = images.get(name);
-		if (image == null) {
-			getImageDescriptor(name);		
-			image = images.get(name);
-		}
-		return image;
-	}
-
-	/**
-	 * Returns a shared ImageDescriptor for the given name
-	 * <p>
-	 * Note: ImageDescriptor returned from this method will be automatically
-	 * disposed of when this plug-in shuts down. Callers must not dispose of
-	 * these ImageDescriptor themselves.
-	 * </p>
-	 * 
-	 * @param name
-	 *            the ImageDescriptor name found in /icons (with extension)
-	 * @return the ImageDescriptor, null on error or not found.
-	 */
-	public ImageDescriptor getImageDescriptor(String name) {
-		if (name == null) {
-			return null;
-		}
-
-		ImageRegistry images = getImageRegistry();
-		ImageDescriptor id = images.getDescriptor(name);
-		if (id == null) {
-			InputStream stream = null;
-			try {//check existance of file
-				URL url = new URL(_pluginBase,
-						ICONS_LIB_PATH + "/" + name); //$NON-NLS-1$
-				
-				//doing the following to check existance... exception will be caught and null descriptor returned
-				stream = url.openStream();
-				stream.close();
-				
-				id = ImageDescriptor.createFromURL(url);
-				images.put(name, id);
-			} catch (IOException e1) {
-				_log.info("Unable to create ImageDescriptor for: "+name, e1); //$NON-NLS-1$
-				return null;
-			} 
-		}
-		return id;
-	}
-
-	/**
-	 * Read a file resource. The file should contain any partial path and the
-	 * filename from the plugin base. The caller is responsible for closing the
-	 * file.
-	 * @param file 
-	 * @return the input stream for the file
-	 * @throws MalformedURLException 
-	 * @throws IOException 
-	 */
-	public InputStream readFile(String file) throws MalformedURLException,
-			IOException {
-		return (new URL(_pluginBase, file)).openStream();
-	}
-
-	/**
-	 * @param file
-	 * @return the File associate with the name 'file'
-	 * @throws MalformedURLException
-	 * @throws IOException
-	 */
-	public File getFile(String file) throws MalformedURLException, IOException {
-		return new File((new URL(_pluginBase, file)).getPath());
-	}
-
-	/**
-	 * @return the plugin's install location with the leading "/" removed
-	 * and normalized to the the os string.
-	 */
-	public static Path getInstallLocation() {
-		try {
-			URL url = getDefault().getBundle().getEntry("/"); //$NON-NLS-1$
-			String s1 = FileLocator.resolve(url).getFile();
-			if (s1.startsWith("/")) //$NON-NLS-1$
-			{
-				s1 = s1.substring(1);
-			}
-			s1 = (new Path(s1)).toOSString();
-			String s;
-			if (s1.endsWith(File.separator)) {
-				s = s1;
-			} else {
-				s = s1 + File.separator;
-			}
-			return new Path(s);
-		} catch (Exception exception) {
-			_log.error("Error.PDPlugin.Installation.15", exception); //$NON-NLS-1$
-			return null;
-		}
-	}
-
-    /**
-	 * Returns the active workbench window.
-	 * 
-	 * @return the active workbench window. this can be null but I've never seen
-	 *         it.
-	 */
-	public static IWorkbenchWindow getActiveWorkbenchWindow() {
-		if (getDefault().getWorkbench() == null) {
-			return null;
-		}
-        return getDefault().getWorkbench().getActiveWorkbenchWindow();
-	}
-
-	/**
-	 * Returns the active workbench page. Note that the active page may not be
-	 * the one that the user perceives as active in some situations so this
-	 * method of obtaining the activate page should only be used if no other
-	 * method is available.
-	 * 
-	 * @return the active workbench page
-	 */
-	public static IWorkbenchPage getActivePage() {
-		IWorkbenchWindow window = getActiveWorkbenchWindow();
-		if (window == null) {
-			return null;
-		}
-		return window.getActivePage();
-	}
-
-	/**
-	 * Initializes the preference controls to the default values. These values
-	 * are used the first time the preference page is displayed or when the user
-	 * presses the Defaults button in the preferences page.
-	 */
-	protected void initializeDefaultPreferences(IPreferenceStore store) {
-		// initialize any preferences for this plugin.
-	}
-
-	/**
-	 * @return the active workbench Shell. Used for some funciton need IShell
-	 * Parameter.
-	 */
-	public static Shell getActiveWorkbenchShell() {
-		IWorkbenchWindow window = getActiveWorkbenchWindow();
-		if (window != null) {
-			return window.getShell();
-		}
-		IWorkbenchWindow[] windows = getDefault().getWorkbench()
-				.getWorkbenchWindows();
-		if (windows.length > 0) {
-			return windows[0].getShell();
-		}
-		return null;
-	}
-
-	/**
-	 * @return the active display.
-	 */
-	public static Display getDisplay() {
-		Shell shell = getActiveWorkbenchShell();
-		if (shell != null) {
-			return shell.getDisplay();
-		}
-        return Display.getDefault();
-	}
-
-	/**
-	 * @return current active project.
-	 */
-	public static IProject getCurrentProject() {
-		IProject curProject = null;
-		IEditorPart editor = PDPlugin.getDefault().getWorkbench()
-				.getActiveWorkbenchWindow().getActivePage().getActiveEditor();
-		IEditorInput input = editor.getEditorInput();
-		IFile inputFile = null;
-		if (input instanceof IFileEditorInput) {
-			inputFile = ((IFileEditorInput) input).getFile();
-			curProject = inputFile.getProject();
-		}
-		return curProject;
-	}
-	
-	/**
-	 * Log status using the default plugin logger
-	 * @param status
-	 */
-	public static void log(IStatus status)
-	{
-	    ILog log = getDefault().getLog();
-	    log.log(status);
-	}
-	
-	/**
-	 * @param message
-	 * @param excp
-	 */
-	public static void log(String message, Throwable excp)
-	{
-	    Status status = new Status(IStatus.ERROR, getPluginId(), message, excp);
-	    log(status);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/PageDesignerTraceOptions.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/PageDesignerTraceOptions.java
deleted file mode 100644
index 5bcf32a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/PageDesignerTraceOptions.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner;
-
-import org.eclipse.osgi.framework.debug.FrameworkDebugOptions;
-import org.eclipse.osgi.service.debug.DebugOptions;
-
-/**
- * Defines that standard runtime trace options for debugging. See .options file
- * for definitions.
- * 
- * NOT API
- * 
- * @author cbateman
- * 
- */
-public final class PageDesignerTraceOptions
-{
-    /**
-     * True if debug tracing is enabled. Other tracing cannot be enabled unless
-     * this is enabled.
-     */
-    public static final boolean ENABLED;
-
-    /**
-     * True if tag converter ext load tracing is enabled
-     */
-    public static final boolean TRACE_CONVERTERLOAD;
-    /**
-     * True if tag converter selection tracing is enabled
-     */
-    public static final boolean TRACE_CONVERTERSELECT;
-    /**
-     * True if tag element edit ext load tracing is enabled
-     */
-    public static final boolean TRACE_ELEMENTEDITLOAD;
-    /**
-     * True if tag element edit selection tracing is enabled
-     */
-    public static final boolean TRACE_ELEMENTEDITSELECTION;
-
-    private static final String KEY_DEBUG_ENABLED = "/debug"; //$NON-NLS-1$
-    private static final String KEY_CONVERTER = KEY_DEBUG_ENABLED+"/converter"; //$NON-NLS-1$
-    private static final String KEY_CONVERTER_LOAD = KEY_CONVERTER + "/load"; //$NON-NLS-1$
-    private static final String KEY_CONVERTER_SELECTION = KEY_CONVERTER + "/selection"; //$NON-NLS-1$
-
-    private static final String KEY_ELEMENTEDIT = KEY_DEBUG_ENABLED+"/elementedit"; //$NON-NLS-1$
-    private static final String KEY_ELEMENTEDIT_LOAD = KEY_ELEMENTEDIT + "/load"; //$NON-NLS-1$
-    private static final String KEY_ELEMENTEDIT_SELECTION = KEY_ELEMENTEDIT + "/selection"; //$NON-NLS-1$
-
-    
-    static
-    {
-        final DebugOptions debugOptions = FrameworkDebugOptions.getDefault();
-        final String pluginId = PDPlugin.getPluginId();
-        ENABLED = debugOptions != null
-                && debugOptions.getBooleanOption(pluginId
-                        + KEY_DEBUG_ENABLED, false);
-
-        if (ENABLED)
-        {
-            TRACE_CONVERTERLOAD = debugOptions.getBooleanOption(
-                    pluginId + KEY_CONVERTER_LOAD, false);
-            TRACE_CONVERTERSELECT = debugOptions.getBooleanOption(
-                    pluginId + KEY_CONVERTER_SELECTION, false);
-            TRACE_ELEMENTEDITLOAD = debugOptions.getBooleanOption(
-                    pluginId + KEY_ELEMENTEDIT_LOAD, false);
-            TRACE_ELEMENTEDITSELECTION = debugOptions.getBooleanOption(
-                    pluginId + KEY_ELEMENTEDIT_SELECTION, false);
-        }
-        else
-        {
-            TRACE_CONVERTERLOAD = false;
-            TRACE_CONVERTERSELECT = false;
-            TRACE_ELEMENTEDITLOAD = false;
-            TRACE_ELEMENTEDITSELECTION = false;
-        }
-    }
-
-    /**
-     * @param message
-     */
-    public static void log(final String message)
-    {
-        System.out.println(message);
-    }
-    
-    /**
-     * @param msg A short label placed before the trace of t to show the source
-     * @param t
-     */
-    public static void log(final String msg, final Throwable t)
-    {
-        System.out.printf("%s: Exception Trace:\n\n",msg); //$NON-NLS-1$
-        t.printStackTrace(System.out);
-        System.out.print("\n\n\n"); //$NON-NLS-1$
-    }
-
-    private PageDesignerTraceOptions()
-    {
-        // no instantiation
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/container/ContainerActionGroup.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/container/ContainerActionGroup.java
deleted file mode 100644
index 807cad2..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/container/ContainerActionGroup.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.container;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jst.pagedesigner.elementedit.IElementEdit;
-import org.eclipse.jst.pagedesigner.parts.ElementEditPart;
-import org.eclipse.jst.pagedesigner.parts.NodeEditPart;
-import org.eclipse.jst.pagedesigner.range.RangeUtil;
-import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-import org.eclipse.ui.actions.ActionGroup;
-import org.w3c.dom.Text;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ContainerActionGroup extends ActionGroup {
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.actions.ActionGroup#fillContextMenu(org.eclipse.jface.action.IMenuManager)
-	 */
-	public void fillContextMenu(IMenuManager menu) {
-		ISelection selection = this.getContext().getSelection();
-
-		EditPart part = findCommonAncesterPart(selection);
-		if (!(part instanceof NodeEditPart)) {
-			return;
-		}
-
-		NodeEditPart original = (NodeEditPart) part;
-		// start from the parent of part
-		while (part.getParent() instanceof ElementEditPart) {
-			ElementEditPart elementEditPart = (ElementEditPart) part
-					.getParent();
-
-			IElementEdit elementEdit = elementEditPart.getElementEdit();
-			if (elementEdit != null) {
-				boolean filled = elementEdit.fillContainerContextMenu(menu,
-						elementEditPart, original, selection);
-				if (filled) {
-					break;
-				}
-			}
-
-			part = part.getParent();
-		}
-	}
-
-	/**
-	 * Give a selection, find a single common container node as start for table
-	 * related operations.
-	 * 
-	 * @param selection
-	 * @return
-	 */
-	private EditPart findCommonAncesterPart(ISelection selection) {
-		if (selection instanceof IStructuredSelection) {
-			IStructuredSelection structsel = (IStructuredSelection) selection;
-			if (structsel.size() != 1) {
-				return null;
-			} else if (structsel.getFirstElement() instanceof EditPart) {
-				return (EditPart) structsel.getFirstElement();
-			} else {
-				return null;
-			}
-		} else if (selection instanceof DesignRange) {
-			DesignRange range = (DesignRange) selection;
-			if (!range.isValid()) {
-				return null;
-			}
-			if (range.isEmpty()) {
-				DesignPosition position = range.getStartPosition();
-				if (position.getOffset() == 0
-						|| position.getContainerNode() instanceof Text) {
-					return position.getContainerPart();
-				}
-                return position.getSiblingEditPart(false);
-			}
-            return RangeUtil.findCommonAncestor(range);
-		} else {
-			return null;
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/AbstractLinkCreator.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/AbstractLinkCreator.java
deleted file mode 100644
index 925b449..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/AbstractLinkCreator.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.link;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExecutableExtension;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public abstract class AbstractLinkCreator implements ILinkCreator,
-		IExecutableExtension {
-	private String _identifier;
-    /**
-     * the link identifier attribute name
-     */
-    private static final String LINK_IDENTIFIER = "linkIdentifier"; //$NON-NLS-1$
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.actions.link.ILinkCreator#canExcute(org.eclipse.jst.pagedesigner.viewer.DesignRange)
-	 */
-	public boolean canExecute(DesignRange range) {
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.actions.link.ILinkCreator#getLinkIdentifier()
-	 */
-	public String getLinkIdentifier() {
-		return this._identifier;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.runtime.IExecutableExtension#setInitializationData(org.eclipse.core.runtime.IConfigurationElement,
-	 *      java.lang.String, java.lang.Object)
-	 */
-	public void setInitializationData(IConfigurationElement config,
-			String propertyName, Object data) throws CoreException {
-		this._identifier = config.getAttribute(LINK_IDENTIFIER);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/CreateLinkWizard.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/CreateLinkWizard.java
deleted file mode 100644
index 2aae9ff..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/CreateLinkWizard.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.link;
-
-import java.util.Map;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.wizard.Wizard;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class CreateLinkWizard extends Wizard {
-	private static final String WIZARD_TITLE = PDPlugin
-			.getResourceString("CreateLinkWizard.Title"); //$NON-NLS-1$
-
-	private static final String INTIAL_DEFAULT_PAGE_IMAGE = "newsuade_wiz.gif"; //$NON-NLS-1$
-
-	private static final String PAGE_NAME = "first"; //$NON-NLS-1$
-
-	private String _pageTitle;
-
-	private EditPart _part;
-
-	private DesignRange _range;
-
-	private Map<String, ILinkCreator> _linkMap;
-
-	private String _linkType;
-
-	/**
-	 * @param part
-	 * @param range
-	 * @param linkMap
-	 */
-	public CreateLinkWizard(EditPart part, DesignRange range, Map<String, ILinkCreator> linkMap) {
-		this._part = part;
-		this._range = range;
-		this._linkMap = linkMap;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.wizard.IWizard#addPages()
-	 */
-	public void addPages() {
-		addPage(new LinkWizardPage(PAGE_NAME, _pageTitle, this._part,
-				this._range, this._linkMap));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.wizard.IWizard#canFinish()
-	 */
-	public boolean canFinish() {
-		return super.canFinish();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.wizard.IWizard#performFinish()
-	 */
-	public boolean performFinish() {
-		LinkWizardPage page = (LinkWizardPage) getPage(PAGE_NAME);
-		this._linkType = page.getChosenLinkType();
-		return true;
-	}
-
-	/**
-	 * @param pageTitle
-	 */
-	public void setPageTitle(String pageTitle) {
-		_pageTitle = pageTitle;
-		initializeDefaultPageImageDescriptor();
-	}
-
-	/**
-	 * 
-	 */
-	protected void initializeDefaultPageImageDescriptor() {
-		ImageDescriptor desc = PDPlugin.getDefault().getImageDescriptor(
-				INTIAL_DEFAULT_PAGE_IMAGE);
-		setDefaultPageImageDescriptor(desc);
-		setWindowTitle(WIZARD_TITLE);
-	}
-
-	/**
-	 * @return the link type
-	 */
-	public String getChosenLinkType() {
-		return this._linkType;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/ExtensionReader.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/ExtensionReader.java
deleted file mode 100644
index f4ababf..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/ExtensionReader.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.link;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtension;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.pagedesigner.IJMTConstants;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ExtensionReader {
-	private static Logger _log = PDPlugin.getLogger(ExtensionReader.class);
-
-	private static List<ILinkCreator> _handlers = null;
-
-	private static final String ATTR_CLASS = "class"; //$NON-NLS-1$
-
-	/** 
-	 * @return the ext-pts for the link handler
-	 * List is not modifiable
-	 */
-	public static synchronized List<ILinkCreator> getAllLinkHandlers() {
-		if (_handlers == null) {
-			_handlers = readAllLinkHandlers();
-		}
-		return Collections.unmodifiableList(_handlers);
-
-	}
-
-	private static List<ILinkCreator> readAllLinkHandlers() {
-	    List<ILinkCreator> result = new ArrayList<ILinkCreator>();
-		IExtensionPoint extensionPoint = Platform.getExtensionRegistry()
-				.getExtensionPoint(PDPlugin.getPluginId(),
-						IJMTConstants.EXTENSION_POINT_PAGEDESIGNER);
-		IExtension[] extensions = extensionPoint.getExtensions();
-
-		for (int i = 0; i < extensions.length; i++) {
-			IExtension ext = extensions[i];
-			IConfigurationElement[] linkHandlers = ext
-					.getConfigurationElements();
-
-			for (int j = 0; j < linkHandlers.length; j++) {
-				if (linkHandlers[j].getName()
-						.equals(IJMTConstants.LINK_CREATOR)) {
-					linkHandlers[j].getAttribute(ATTR_CLASS);
-					Object obj;
-					try {
-						obj = linkHandlers[j]
-								.createExecutableExtension(ATTR_CLASS);
-
-						if (obj instanceof ILinkCreator) {
-							result.add((ILinkCreator)obj);
-						}
-					} catch (CoreException e) {
-						_log
-								.error("Log.Error.ExtensionReader.ReadLinkExtension"); //$NON-NLS-1$
-					}
-				}
-			}
-		}
-		return result;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/HtmlLinkCreator.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/HtmlLinkCreator.java
deleted file mode 100644
index 14e8591..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/HtmlLinkCreator.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.link;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.parts.TextEditPart;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.Text;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class HtmlLinkCreator extends AbstractLinkCreator {
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.actions.link.ILinkCreator#makeLinkElement(org.eclipse.gef.EditPart,
-	 *      org.eclipse.jst.pagedesigner.viewer.DesignRange)
-	 */
-	public Element makeLinkElement(EditPart part, DesignRange range) {
-		if (part instanceof TextEditPart) {
-			Text middleNode = LinkUtil.splitDomText(part, range);
-			EditPart parent = part.getParent();
-			Node parentNode = (Node) parent.getModel();
-			Document doc = (parentNode instanceof Document) ? (Document) parentNode
-					: (parentNode.getOwnerDocument());
-
-			Element htmlLink = doc.createElement(IHTMLConstants.TAG_A);
-			htmlLink.setAttribute(ICSSPropertyID.ATTR_HREF, ""); //$NON-NLS-1$
-			Text text = doc.createTextNode(middleNode.getNodeValue());
-			htmlLink.appendChild(text);
-			parentNode.replaceChild(htmlLink, middleNode);
-			return htmlLink;
-		}
-
-		return null;
-	}
-
-	public String getSourcePreview(EditPart part, DesignRange range) {
-		if (part instanceof TextEditPart) {
-			TextEditPart textPart = (TextEditPart) part;
-			int[] offsets = textPart.getSelectedRange();
-			String displayData = textPart.getTextData();
-
-			String linkExp = displayData.substring(offsets[0], offsets[1]);
-			StringBuffer sb = new StringBuffer();
-			sb.append("<a href=\"\">"); //$NON-NLS-1$
-			sb.append(linkExp);
-			sb.append("</a>"); //$NON-NLS-1$
-			return sb.toString();
-		}
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/ILinkCreator.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/ILinkCreator.java
deleted file mode 100644
index 0652f37..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/ILinkCreator.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.link;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public interface ILinkCreator {
-
-	/**
-	 * @param part
-	 * @param range
-	 * @return the link element
-	 */
-	public Element makeLinkElement(EditPart part, DesignRange range);
-
-	/**
-	 * @return link identifier
-	 */
-	public String getLinkIdentifier();
-
-	/**
-	 * @param range
-	 * @return true if can call makeLinkElement
-	 */
-	public boolean canExecute(DesignRange range);
-
-	/**
-	 * @param part
-	 * @param range
-	 * @return a preview string that approximates the result
-	 * of makeLinkElement
-	 */
-	public String getSourcePreview(EditPart part, DesignRange range);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/LinkRequest.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/LinkRequest.java
deleted file mode 100644
index 1caa1f8..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/LinkRequest.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.link;
-
-import org.eclipse.gef.Request;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class LinkRequest extends Request {
-	private final String _identifier;
-
-	private final DesignRange _range;
-
-	/**
-	 * @param identifier
-	 * @param range
-	 */
-	public LinkRequest(String identifier, DesignRange range) {
-		this._identifier = identifier;
-		this._range = range;
-	}
-
-	/**
-	 * @return the identifier
-	 */
-	public String getIdentifier() {
-		return this._identifier;
-	}
-
-	/**
-	 * @return the design range
-	 */
-	public DesignRange getDesignRange() {
-		return this._range;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/LinkUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/LinkUtil.java
deleted file mode 100644
index aeeaf41..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/LinkUtil.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.link;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.jst.pagedesigner.dom.DOMRange;
-import org.eclipse.jst.pagedesigner.dom.DOMRangeHelper;
-import org.eclipse.jst.pagedesigner.dom.DOMRefPosition;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.parts.TextEditPart;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-import org.w3c.dom.Node;
-import org.w3c.dom.Text;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class LinkUtil {
-	/**
-	 * @param part
-	 * @param range
-	 * @return the select text if part is a text node or null.
-	 */
-	public static String getSelectedText(EditPart part, DesignRange range) {
-		if (part instanceof TextEditPart) {
-			TextEditPart textPart = (TextEditPart) part;
-			int[] offsets = textPart.getSelectedRange();
-			String displayData = textPart.getTextData();
-
-			String linkExp = displayData.substring(offsets[0], offsets[1]);
-			return linkExp;
-		}
-		return null;
-	}
-
-	/**
-	 * @param part
-	 * @param range
-	 * @return the text from part split if it is a text node or null
-	 */
-	public static Text splitDomText(EditPart part, DesignRange range) {
-		if (part instanceof TextEditPart) {
-			Text textNode = (Text) part.getModel();
-
-			DOMRange domRange = DOMRangeHelper.toDOMRange(range);
-			IDOMPosition start = domRange.getStartPosition();
-			IDOMPosition end = domRange.getEndPosition();
-			int domTempStartOffset = computeOffset(start, textNode);
-			int domTempEndOffset = computeOffset(end, textNode);
-
-			int domStartOffset = Math.min(domTempStartOffset, domTempEndOffset);
-			int domEndOffset = Math.max(domTempStartOffset, domTempEndOffset);
-
-			Text lastNode = textNode;
-			if (domStartOffset > 0) {
-				lastNode = textNode.splitText(domStartOffset);
-			}
-			lastNode = lastNode.splitText(domEndOffset - domStartOffset);
-			Text middleNode = (Text) lastNode.getPreviousSibling();
-			return middleNode;
-		}
-		return null;
-	}
-
-	private static int computeOffset(IDOMPosition pos, Text textNode) {
-		int domOffset = 0;
-		if (pos instanceof DOMRefPosition) {
-			DOMRefPosition rep = (DOMRefPosition) pos;
-			boolean forward = rep.isForward();
-			Node refNode = rep.getReferenceNode();
-
-			if ((refNode != textNode) && forward || (refNode == textNode)
-					&& !forward) {
-				domOffset = 0;
-			} else {
-				domOffset = textNode.getLength();
-			}
-		} else {
-			domOffset = pos.getOffset();
-		}
-		return domOffset;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/LinkWizardPage.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/LinkWizardPage.java
deleted file mode 100644
index aca4824..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/LinkWizardPage.java
+++ /dev/null
@@ -1,168 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.link;
-
-import java.util.Arrays;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.jface.wizard.WizardPage;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.StyledText;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Label;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-/*package*/ class LinkWizardPage extends WizardPage {
-	private static final String GROUP_TITLE = PDPlugin
-			.getResourceString("LinkWizardPage.GroupTitle"); //$NON-NLS-1$
-
-	private static final String PREVIEW_TAG_LABEL = PDPlugin
-			.getResourceString("LinkWizardPage.PreviewLabel"); //$NON-NLS-1$
-
-	private StyledText _text = null;
-
-	private final Map<String, ILinkCreator> _linkMap;
-
-	private String _linkType = null;
-
-	private final EditPart _part;
-
-	private final DesignRange _range;
-
-	/**
-	 * @param pageName
-	 * @param title
-	 * @param editPart
-	 * @param range
-	 * @param linkMap
-	 */
-	public LinkWizardPage(String pageName, String title, EditPart editPart,
-			DesignRange range, Map<String, ILinkCreator> linkMap) {
-		super(pageName, title, null);
-		this._part = editPart;
-		this._range = range;
-		this._linkMap = linkMap;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
-	 */
-	public void createControl(Composite parent) {
-		GridLayout layout;
-		GridData data;
-
-		layout = new GridLayout();
-		layout.marginWidth = 20;
-		parent.setLayout(layout);
-		data = new GridData(GridData.FILL_BOTH | GridData.CENTER);
-		parent.setLayoutData(data);
-
-		Group group = new Group(parent, SWT.NONE);
-		group.setText(GROUP_TITLE);
-		layout = new GridLayout();
-		group.setLayout(layout);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		group.setLayoutData(data);
-
-		String defaultLink = ""; //$NON-NLS-1$
-		Set<String> set = this._linkMap.keySet();
-		int size = set.size();
-		String[] keys = new String[size];
-		Iterator<String> itr = set.iterator();
-		int i = 0;
-		while (itr.hasNext()) {
-			String key = itr.next();
-			keys[i++] = key;
-		}
-		Arrays.sort(keys);
-		for (int j = 0; j < size; j++) {
-			Button bt = new Button(group, SWT.RADIO);
-			data = new GridData(GridData.FILL_HORIZONTAL);
-			bt.setLayoutData(data);
-			bt.setText(keys[j]);
-			if (j == 0) {
-				bt.setSelection(true);
-				defaultLink = keys[j];
-			}
-			bt.addSelectionListener(new SelectLinkListener(keys[j]));
-		}
-
-		Label label = new Label(parent, SWT.NONE);
-		label.setText(PREVIEW_TAG_LABEL);
-
-		_text = new StyledText(parent, SWT.WRAP | SWT.V_SCROLL | SWT.BORDER);
-		data = new GridData(GridData.FILL_BOTH);
-		data.heightHint = 50;
-		_text.setLayoutData(data);
-
-		ILinkCreator creator = _linkMap.get(defaultLink);
-		_linkType = creator.getLinkIdentifier();
-		String previewText = creator.getSourcePreview(_part, _range);
-		previewText = previewText == null ? "" : previewText; //$NON-NLS-1$
-		_text.setText(previewText);
-		_text.setEditable(false);
-
-		super.setControl(group);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.wizard.IWizardPage#isPageComplete()
-	 */
-	public boolean isPageComplete() {
-		return true;
-	}
-
-	/**
-	 * @return the link type
-	 */
-	public String getChosenLinkType() {
-		return this._linkType;
-	}
-
-    class SelectLinkListener extends SelectionAdapter {
-		private String _key;
-
-		/**
-		 * @param key
-		 */
-		public SelectLinkListener(String key) {
-			this._key = key;
-		}
-
-		public void widgetSelected(SelectionEvent e) {
-			ILinkCreator creator = _linkMap.get(this._key);
-			_linkType = creator.getLinkIdentifier();
-			String previewText = creator.getSourcePreview(_part, _range);
-			previewText = previewText == null ? "" : previewText; //$NON-NLS-1$
-			_text.setText(previewText);
-			super.widgetSelected(e);
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/MakeLinkAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/MakeLinkAction.java
deleted file mode 100644
index 475f4ff..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/MakeLinkAction.java
+++ /dev/null
@@ -1,215 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.link;
-
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.window.Window;
-import org.eclipse.jst.jsf.common.ui.internal.dialogs.CommonWizardDialog;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.parts.TextEditPart;
-import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class MakeLinkAction extends Action {
-	private final static String MAKE_LINK = PDPlugin
-			.getResourceString("ActionGroup.Submenu.Link"); //$NON-NLS-1$
-
-	private final static String WIZARD_PAGE_TITLE = PDPlugin
-			.getResourceString("MakeLinkAction.Wizard.PageTitle"); //$NON-NLS-1$
-
-	private EditPart _editPart;
-
-	private DesignRange _range;
-
-	private String _linkType;
-
-	/**
-	 * @param range
-	 */
-	public MakeLinkAction(DesignRange range) {
-		super(MAKE_LINK);
-		_range = range;
-		_editPart = convertToEditPart(_range);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.action.Action#run()
-	 */
-	public void run() {
-		Map<String, ILinkCreator> map = calAvailableLinkCreator();
-		if (map.size() > 1) {
-			CreateLinkWizard wizard = new CreateLinkWizard(_editPart, _range,
-					map);
-			wizard.setPageTitle(WIZARD_PAGE_TITLE);
-			CommonWizardDialog wizardDialog = new CommonWizardDialog(
-					getShell(), wizard);
-			wizardDialog.create();
-			if (wizardDialog.open() == Window.OK) {
-				_linkType = wizard.getChosenLinkType();
-			}
-		}
-		// else must be html link
-		else if (map.size() == 1) {
-			Set<Map.Entry<String, ILinkCreator>> set = map.entrySet();
-			Iterator<Map.Entry<String,ILinkCreator>> itr = set.iterator();
-			while (itr.hasNext()) {
-				ILinkCreator creator =  itr.next().getValue();
-				_linkType = creator.getLinkIdentifier();
-			}
-		}
-
-		if (_linkType != null) {
-			Request request = new LinkRequest(_linkType, _range);
-			Command cmd = _editPart.getCommand(request);
-			if (cmd != null && cmd.canExecute()) {
-				cmd.execute();
-			}
-		}
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.action.IAction#isEnabled()
-	 */
-	public boolean isEnabled() {
-		if (_editPart == null) {
-			return false;
-		}
-		return super.isEnabled();
-	}
-
-	private EditPart convertToEditPart(DesignRange range) {
-		DesignPosition startPosition = range.getStartPosition();
-		EditPart startPart = startPosition.getContainerPart();
-
-		DesignPosition endPosition = range.getEndPosition();
-		EditPart endPart = endPosition.getContainerPart();
-
-		if (startPosition == endPosition) {
-			return null;
-		}
-
-		if (startPart instanceof TextEditPart
-				&& endPart instanceof TextEditPart) {
-			if ((startPart == endPart)) {
-				return startPart;
-			}
-		} else if (!(startPart instanceof TextEditPart)
-				&& !(endPart instanceof TextEditPart)) {
-			Node[] startNodeOptions = null;
-			startNodeOptions = getSideNodes(startPosition);
-			Node[] endNodeOptions = null;
-			endNodeOptions = getSideNodes(endPosition);
-			Node selectedNode = null;
-			for (int i = 0; i < 2; i++) {
-				for (int j = 0; j < 2; j++) {
-					if (startNodeOptions[i] == endNodeOptions[j]) {
-						selectedNode = startNodeOptions[i];
-						break;
-					}
-				}
-				if (selectedNode != null) {
-					break;
-				}
-			}
-			if (selectedNode != null) {
-				EditPart part = (EditPart) ((INodeNotifier) selectedNode)
-						.getAdapterFor(EditPart.class);
-				return part;
-			}
-		} else {
-			if (startPart instanceof TextEditPart) {
-				Node[] endNodeOptions = null;
-				endNodeOptions = getSideNodes(endPosition);
-				if (startPart.getModel() == endNodeOptions[0]
-						|| startPart.getModel() == endNodeOptions[1]) {
-					return startPart;
-				}
-			}
-			if (endPart instanceof TextEditPart) {
-				Node[] startNodeOptions = null;
-				startNodeOptions = getSideNodes(startPosition);
-				if (endPart.getModel() == startNodeOptions[0]
-						|| endPart.getModel() == startNodeOptions[1]) {
-					return endPart;
-				}
-			}
-		}
-
-		return null;
-	}
-
-	private Node[] getSideNodes(DesignPosition pos) {
-		Node[] nodes = new Node[2];
-
-		EditPart part = pos.getContainerPart();
-		Node node = (Node) part.getModel();
-		NodeList list = node.getChildNodes();
-
-		if (list.getLength() == pos.getOffset()) {
-			nodes[0] = list.item(pos.getOffset() - 1);
-			nodes[1] = list.item(pos.getOffset() - 1);
-		} else if (pos.getOffset() == 0) {
-			nodes[0] = list.item(0);
-			nodes[1] = list.item(0);
-		} else if (pos.getOffset() > 0 && pos.getOffset() < list.getLength()) {
-			nodes[0] = list.item(pos.getOffset() - 1);
-			nodes[1] = list.item(pos.getOffset());
-		}
-
-		return nodes;
-	}
-
-	private Shell getShell() {
-		if (_editPart != null) {
-			IHTMLGraphicalViewer viewer = (IHTMLGraphicalViewer) _editPart
-					.getViewer();
-			return viewer.getControl().getShell();
-		}
-		return null;
-	}
-
-	private Map<String, ILinkCreator> calAvailableLinkCreator() {
-		Map<String, ILinkCreator> map = new HashMap<String, ILinkCreator>();
-		List<ILinkCreator> linkCreators = ExtensionReader.getAllLinkHandlers();
-		for (ILinkCreator linkCreator : linkCreators) {
-			String identifier = linkCreator.getLinkIdentifier();
-			boolean canExecute = linkCreator.canExecute(_range);
-			if (canExecute) {
-				map.put(identifier, linkCreator);
-			}
-		}
-		return map;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/MakeLinkCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/MakeLinkCommand.java
deleted file mode 100644
index 7c4835f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/MakeLinkCommand.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.link;
-
-import java.util.List;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.commands.DesignerCommand;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class MakeLinkCommand extends DesignerCommand {
-	private String _identifier = null;
-
-	private EditPart _part = null;
-
-	private DesignRange _range = null;
-
-	private ILinkCreator _linkcreator = null;
-
-	private Element _ele = null;
-
-	/**
-	 * @param identifier
-	 * @param viewer
-	 * @param part
-	 * @param range
-	 */
-	public MakeLinkCommand(String identifier, IHTMLGraphicalViewer viewer,
-			EditPart part, DesignRange range) {
-		super(identifier, viewer);
-		setLabel(PDPlugin.getResourceString("MakeLinkCommand.Label.MakeLink"));//$NON-NLS-1$
-		this._identifier = identifier;
-		this._part = part;
-		this._range = range;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.commands.Command#canExecute()
-	 */
-	public boolean canExecute() {
-		List<ILinkCreator> creators = ExtensionReader.getAllLinkHandlers();
-		if (creators != null) {
-			for (ILinkCreator linkCreator : creators) {
-				String identifier = linkCreator.getLinkIdentifier();
-				if (this._identifier.equalsIgnoreCase(identifier)) {
-					this._linkcreator = linkCreator;
-					break;
-				}
-			}
-		}
-		if (this._linkcreator != null) {
-			return this._linkcreator.canExecute(_range);
-		}
-
-		return super.canExecute();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-	 */
-	protected void doExecute() {
-		if (this._linkcreator != null) {
-			Element ele = this._linkcreator.makeLinkElement(this._part,
-					this._range);
-			Node node = (Node) this._part.getModel();
-			Node parent = node.getParentNode();
-			formatNode(parent);
-
-			this._ele = ele;
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#getAfterCommandDesignerSelection()
-	 */
-	protected ISelection getAfterCommandDesignerSelection() {
-		return toDesignSelection(_ele);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/menuextension/CustomedContextMenuActionGroup.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/menuextension/CustomedContextMenuActionGroup.java
deleted file mode 100644
index b6721fc..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/menuextension/CustomedContextMenuActionGroup.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.menuextension;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtension;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.IExtensionRegistry;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jst.pagedesigner.extensionpoint.IContextMenuItemContributor;
-import org.eclipse.jst.pagedesigner.utils.JSPUtil;
-import org.eclipse.jst.pagedesigner.utils.StructuredModelUtil;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.ui.actions.ActionGroup;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class CustomedContextMenuActionGroup extends ActionGroup {
-	private final static String POPUPMENU_EXTENSION_ID = "org.eclipse.jst.pagedesigner.popupMenuContributor"; //$NON-NLS-1$
-
-	private List _contributedMenuListener;
-
-	private Control _parentControl;
-
-	private IStructuredModel _model;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.actions.ActionGroup#fillContextMenu(org.eclipse.jface.action.IMenuManager)
-	 */
-	public void fillContextMenu(IMenuManager menu) {
-		populateContributedMenu(menu);
-	}
-
-	private List getListeners() {
-		if (_contributedMenuListener == null) {
-			_contributedMenuListener = computeContributedMenuListener();
-		}
-		return _contributedMenuListener;
-	}
-
-	private List computeContributedMenuListener() {
-		IExtensionRegistry registry = Platform.getExtensionRegistry();
-		IExtensionPoint extensionPoint = registry
-				.getExtensionPoint(POPUPMENU_EXTENSION_ID);
-		IExtension[] extensions = extensionPoint.getExtensions();
-		List results = new ArrayList();
-		for (int i = 0; i < extensions.length; i++) {
-			IConfigurationElement[] elements = extensions[i]
-					.getConfigurationElements();
-			for (int j = 0; j < elements.length; j++) {
-				try {
-					Object listener = elements[j]
-							.createExecutableExtension("class");//$NON-NLS-1$
-
-					if (listener instanceof IContextMenuItemContributor) {
-						results.add(listener);
-						((IContextMenuItemContributor) listener)
-								.setURI(elements[j].getAttribute("URI"));//$NON-NLS-1$
-					}
-				} catch (CoreException e) {
-					// ignore
-				}
-			}
-		}
-		return results;
-	}
-
-	private void populateContributedMenu(IMenuManager menuMgr) {
-		List list = getListeners();
-		for (int i = 0, n = list.size(); i < n; i++) {
-			IContextMenuItemContributor contributor = (IContextMenuItemContributor) list
-					.get(i);
-			IFile file = StructuredModelUtil.getFileFor(_model);
-			if (file != null && contributor.getURI() != null) {
-				if (JSPUtil.supportTaglib(contributor.getURI(), file)) {
-					contributor.fillContextMenu(menuMgr, getContext()
-							.getSelection(), _model, _parentControl);
-				}
-			}
-		}
-	}
-
-	/**
-	 * @return Returns the model.
-	 */
-	public IStructuredModel getModel() {
-		return _model;
-	}
-
-	/**
-	 * @param model
-	 *            The model to set.
-	 */
-	public void setModel(IStructuredModel model) {
-		this._model = model;
-	}
-
-	/**
-	 * @return Returns the parentControl.
-	 */
-	public Control getParentControl() {
-		return _parentControl;
-	}
-
-	/**
-	 * @param parentControl
-	 *            The parentControl to set.
-	 */
-	public void setParentControl(Control parentControl) {
-		this._parentControl = parentControl;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/menuextension/RunAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/menuextension/RunAction.java
deleted file mode 100644
index 3528019..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/menuextension/RunAction.java
+++ /dev/null
@@ -1,125 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.menuextension;
-
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.ui.part.EditorPart;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class RunAction extends Action {
-	/**
-	 * constant for debug launch mode
-	 */
-	public static final String LAUNCH_MODE_DEBUG = "debug"; //$NON-NLS-1$
-
-	/**
-	 * constant for run launch mode
-	 */
-	public static final String LAUNCH_MODE_RUN = "run"; //$NON-NLS-1$
-
-	private final String ID = "org.eclipse.jst.pagedesigner.actions.menuextension.RunAction"; //$NON-NLS-1$
-
-	//private EditorPart _editor;
-
-	private String _mode;
-
-	/**
-	 * @param editor
-	 * @param mode
-	 */
-	public RunAction(EditorPart editor, String mode) {
-		//_editor = editor;
-		_mode = mode;
-	}
-
-	public void run() {
-	    PDPlugin.getLogger(getClass()).error("Obsolete.  Shouldn't be used", new Throwable()); //$NON-NLS-1$
-	    // FIXME: we don't support this feature and it seems to depend
-	    // on debugger internal code anyway...
-	    //		List allShortCuts = DebugUIPlugin.getDefault()
-//				.getLaunchConfigurationManager().getLaunchShortcuts();
-//		Iterator iter = allShortCuts.iterator();
-//		LaunchShortcutExtension ext = null;
-//		while (iter.hasNext()) {
-//			ext = (LaunchShortcutExtension) iter.next();
-//			try {
-//				if (ext.getId().equals("org.eclipse.wst.server.launchShortcut")) {
-//					break;
-//				}
-//			} catch (Exception e) {
-//				// not supported
-//			}
-//		}
-//		if (ext != null) {
-//			ext.launch(getSelection(), _mode);
-//		}
-	}
-
-//	private IStructuredSelection getSelection() {
-//		IEditorInput input = ((HTMLEditor) _editor).getEditorInput();
-//		List elements = new ArrayList();
-//		if (input instanceof FileEditorInput) {
-//			elements.add(((FileEditorInput) input).getFile());
-//		}
-//		return new StructuredSelection(elements);
-//	}
-
-	public String getId() {
-		return ID;
-	}
-
-	public String getText() {
-		return _mode.substring(0, 1).toUpperCase()
-				+ _mode.substring(1, _mode.length());
-	}
-
-	private ImageDescriptor getImageDescriptorForModel(String id) {
-		IConfigurationElement[] elements = Platform.getExtensionRegistry()
-				.getConfigurationElementsFor("org.eclipse.ui.actionSets"); //$NON-NLS-1$
-		for (int i = 0; i < elements.length; i++) {
-			if ("actionSet".equals(elements[i].getName())) { //$NON-NLS-1$
-				IConfigurationElement[] actions = elements[i]
-						.getChildren("action"); //$NON-NLS-1$
-				for (int j = 0; j < actions.length; j++) {
-					if (id.equals(actions[j].getAttribute("id"))) { //$NON-NLS-1$
-						String iconPath = actions[j].getAttribute("icon"); //$NON-NLS-1$
-						if (iconPath != null) {
-							return AbstractUIPlugin.imageDescriptorFromPlugin(
-									actions[j].getDeclaringExtension()
-											.getContributor().getName(), iconPath);
-						}
-                        return null;
-					}
-				}
-			}
-		}
-		return null;
-	}
-
-	public ImageDescriptor getImageDescriptor() {
-		if (_mode == LAUNCH_MODE_DEBUG) {
-			return getImageDescriptorForModel("org.eclipse.debug.internal.ui.actions.DebugDropDownAction"); //$NON-NLS-1$
-		} else if (_mode == LAUNCH_MODE_RUN) {
-			return getImageDescriptorForModel("org.eclipse.debug.internal.ui.actions.RunDropDownAction"); //$NON-NLS-1$
-		} else {
-			return super.getImageDescriptor();
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/AlignSupport.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/AlignSupport.java
deleted file mode 100644
index aaab7e9..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/AlignSupport.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.range;
-
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class AlignSupport {
-
-	private static final String[] ALIGN_VALUES = new String[] {
-			PDPlugin.getResourceString("AlignSupport.ActionLabel.Left"), //$NON-NLS-1$
-			PDPlugin.getResourceString("AlignSupport.ActionLabel.Center"), //$NON-NLS-1$
-			PDPlugin.getResourceString("AlignSupport.ActionLabel.Right"), //$NON-NLS-1$
-			PDPlugin.getResourceString("AlignSupport.ActionLabel.Justify") //$NON-NLS-1$ 
-	};
-
-	private static Element[] _nodes = null;
-
-	/**
-	 * @param menu
-	 * @param viewer
-	 */
-	public static void createAlignActions(IMenuManager menu,
-			IHTMLGraphicalViewer viewer) {
-		for (int i = 0; i < ALIGN_VALUES.length; i++) {
-			ParagraphStyleAction action = new ParagraphStyleAction(
-					ALIGN_VALUES[i], _nodes[i], null, IAction.AS_CHECK_BOX);
-			action.setViewer(viewer);
-			menu.add(action);
-		}
-	}
-
-	/**
-	 * @param nodes
-	 */
-	public static void setAlignNodes(Element[] nodes) {
-		if (_nodes != nodes) {
-			_nodes = nodes;
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/ChangeStyleAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/ChangeStyleAction.java
deleted file mode 100644
index d710e3c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/ChangeStyleAction.java
+++ /dev/null
@@ -1,178 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.range;
-
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jst.pagedesigner.commands.range.ApplyStyleCommand;
-import org.eclipse.jst.pagedesigner.dom.DOMPositionHelper;
-import org.eclipse.jst.pagedesigner.dom.DOMRange;
-import org.eclipse.jst.pagedesigner.dom.DOMRangeHelper;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public class ChangeStyleAction extends DesignerToolBarAction {
-	private final String _expectedTag;
-
-	/**
-	 * @param text
-	 * @param name 
-	 * @param image
-	 * @param style 
-	 */
-	public ChangeStyleAction(String text, String name, ImageDescriptor image,
-			int style) {
-		super(text, style);
-		_expectedTag = name;
-		this.setImageDescriptor(image);
-	}
-
-	/**
-	 * @param text
-	 * @param name
-	 * @param enabled
-	 * @param disabled
-	 * @param style
-	 */
-	public ChangeStyleAction(String text, String name, ImageDescriptor enabled,
-			ImageDescriptor disabled, int style) {
-		super(text, style);
-		_expectedTag = name;
-		setImageDescriptor(enabled);
-		setDisabledImageDescriptor(disabled);
-	}
-
-
-	protected boolean isApplied(DOMRange range) {
-		if (range == null) {
-			return false;
-		}
-
-		boolean ordered = range.isOrdered();
-		IDOMPosition start = ordered ? range.getStartPosition() : range
-				.getEndPosition();
-		IDOMPosition end = ordered ? range.getEndPosition() : range
-				.getStartPosition();
-		Node startnode = start.getContainerNode();
-		Node endnode = end.getContainerNode();
-		if (!EditModelQuery.hasAncestor(startnode, _expectedTag, true)) {
-			return false;
-		}
-		for (Node node = startnode; node != endnode; node = EditModelQuery
-				.getInstance().getNextLeafNeighbor(node)) {
-			if (!EditModelQuery.hasAncestor(node, _expectedTag, true)) {
-				return false;
-			}
-		}
-		if (!EditModelQuery.hasAncestor(endnode, _expectedTag, true)) {
-			return false;
-		}
-		return true;
-	}
-
-	/**
-	 * @return the expected tag
-	 */
-	protected String getExpectedTag() {
-		return _expectedTag;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.range.DesignerToolBarAction#getCommand()
-	 */
-	protected Command getCommand() {
-		DesignRange range = getViewer().getRangeSelection();
-		DOMRange dRange = DOMRangeHelper.toDOMRange(range);
-		Command command;
-		if (isApplied(dRange)) {
-			// command = new UnapplyStyleCommand(getViewer(), _expectedTag,
-			// null, null);
-			// since the un-applystyle is not implemented yet,we do nothing
-			// here.
-			command = null;
-			this.setChecked(true);
-		} else {
-			command = new ApplyStyleCommand(getViewer(), _expectedTag, null,
-					null);
-		}
-		return command;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.texteditor.IUpdate#update()
-	 */
-	public void update() {
-		if (canRun(getViewer())) {
-			setEnabled(true);
-		} else {
-			setEnabled(false);
-		}
-		updateStatus();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.actions.range.DesignerToolBarAction#updateStatus()
-	 */
-	public void updateStatus() {
-		IHTMLGraphicalViewer viewer = getViewer();
-		if (viewer != null && viewer.isInRangeMode()
-				&& viewer.getModel().getDocument().hasChildNodes()) {
-			DesignRange range = getViewer().getRangeSelection();
-			if (range != null && range.isValid()) {
-				DOMRange domRange = null;
-				domRange = new DOMRange(DOMPositionHelper.toDOMPosition(range
-						.getStartPosition()), DOMPositionHelper
-						.toDOMPosition(range.getEndPosition()));
-				if (isApplied(domRange)) {
-					this.setChecked(true);
-				} else {
-					this.setChecked(false);
-				}
-				return;
-			}
-		}
-		this.setChecked(false);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.actions.range.DesignerToolBarAction#canRun(org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer)
-	 */
-	protected boolean canRun(IHTMLGraphicalViewer viewer) {
-		if (viewer != null && viewer.isInRangeMode()
-				&& viewer.getModel().getDocument().hasChildNodes()) {
-			DesignRange range = viewer.getRangeSelection();
-			if (range != null && range.isValid()) {
-				DesignPosition startPos = range.getStartPosition();
-				DesignPosition endPos = range.getEndPosition();
-				if (startPos != endPos) {
-					return true;
-				}
-			}
-		}
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/DesignerToolBarAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/DesignerToolBarAction.java
deleted file mode 100644
index 3e241e3..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/DesignerToolBarAction.java
+++ /dev/null
@@ -1,155 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.range;
-
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jst.pagedesigner.dom.DOMPositionHelper;
-import org.eclipse.jst.pagedesigner.dom.DOMRange;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.eclipse.ui.texteditor.IUpdate;
-
-/**
- * @author mengbo
- */
-public abstract class DesignerToolBarAction extends Action implements IUpdate,
-		ISelectionChangedListener {
-	private IHTMLGraphicalViewer _viewer;
-
-	/**
-	 * @param text
-	 * @param style
-	 */
-	public DesignerToolBarAction(String text, int style) {
-		super(text, style);
-	}
-
-	/**
-	 * @param text
-	 * @param image
-	 */
-	public DesignerToolBarAction(String text, ImageDescriptor image) {
-		super(text, image);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
-	 */
-	public void selectionChanged(SelectionChangedEvent event) {
-		update();
-	}
-
-	/**
-	 * 
-	 */
-	public void update() {
-		if (canRun(this._viewer)) {
-			setEnabled(true);
-			updateStatus();
-		} else {
-			setEnabled(false);
-		}
-	}
-
-	/**
-	 * Update the status
-	 */
-	protected void updateStatus() {
-		DesignRange range = _viewer.getRangeSelection();
-		DOMRange domRange = null;
-		if (range != null) {
-			domRange = new DOMRange(DOMPositionHelper.toDOMPosition(range
-					.getStartPosition()), DOMPositionHelper.toDOMPosition(range
-					.getEndPosition()));
-			if (isApplied(domRange)) {
-				this.setChecked(true);
-			} else {
-				this.setChecked(false);
-			}
-		}
-	}
-
-	/**
-	 * @param range
-	 * @return ??
-	 */
-	protected abstract boolean isApplied(DOMRange range);
-
-	/**
-	 * @param viewer
-	 * @return true if this action can run
-	 */
-	protected boolean canRun(IHTMLGraphicalViewer viewer) {
-		if (viewer != null && viewer.isInRangeMode()
-				&& viewer.getModel().getDocument().hasChildNodes()) {
-			DesignRange range = viewer.getRangeSelection();
-			if (range != null && range.isValid()) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * @param viewer
-	 */
-	public void setViewer(IHTMLGraphicalViewer viewer) {
-		if (viewer == _viewer) {
-			return;
-		}
-        
-        if (_viewer != null) {
-        	_viewer.removeSelectionChangedListener(this);
-        }
-        _viewer = viewer;
-        if (_viewer != null) {
-        	_viewer.addSelectionChangedListener(this);
-        }
-        update();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.action.IAction#run()
-	 */
-	public void run() {
-		// Assert.isTrue(_viewer != null && _viewer.isInRangeMode());
-		DesignRange range = _viewer.getRangeSelection();
-		if (range == null || !range.isValid()) {
-			return;
-		}
-		Command command = getCommand();
-		if (command != null) {
-			command.execute();
-		}
-	}
-
-	/**
-	 * @return the command for this action or null
-	 */
-	protected abstract Command getCommand();
-
-	/**
-	 * @return Returns the _viewer.
-	 */
-	public IHTMLGraphicalViewer getViewer() {
-		return _viewer;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/HTagsInsertGroupAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/HTagsInsertGroupAction.java
deleted file mode 100644
index 28352ca..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/HTagsInsertGroupAction.java
+++ /dev/null
@@ -1,180 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.range;
-
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jface.action.ActionContributionItem;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IMenuCreator;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.dom.DOMRange;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Menu;
-
-/**
- * @author mengbo
- */
-public class HTagsInsertGroupAction extends DesignerToolBarAction implements
-		IMenuCreator {
-	private Menu _menu;
-
-	private static Map _actions = new HashMap();
-
-	/**
-	 * @param image
-	 * @param style
-	 */
-	public HTagsInsertGroupAction(ImageDescriptor image, int style) {
-		super(
-				PDPlugin
-						.getResourceString("HTagsInsertGroupAction.ActionLabel.Hx"), IAction.AS_DROP_DOWN_MENU); //$NON-NLS-1$
-		this.setImageDescriptor(image);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.action.IMenuCreator#getMenu(org.eclipse.swt.widgets.Control)
-	 */
-	public Menu getMenu(Control parent) {
-		if (_menu != null) {
-			_menu.dispose();
-		}
-		_menu = new Menu(parent);
-		addActionToMenu(_menu, IHTMLConstants.TAG_H1);
-		addActionToMenu(_menu, IHTMLConstants.TAG_H2);
-		addActionToMenu(_menu, IHTMLConstants.TAG_H3);
-		addActionToMenu(_menu, IHTMLConstants.TAG_H4);
-		addActionToMenu(_menu, IHTMLConstants.TAG_H5);
-		addActionToMenu(_menu, IHTMLConstants.TAG_H6);
-
-		return _menu;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.action.IMenuCreator#getMenu(org.eclipse.swt.widgets.Menu)
-	 */
-	public Menu getMenu(Menu parent) {
-		return null;
-	}
-
-	/**
-	 * @param parent
-	 * @param name
-	 */
-	protected void addActionToMenu(Menu parent, String name) {
-		DesignerToolBarAction action;
-		if (_actions.get(name) == null) {
-			action = new ParagraphStyleAction(name, name, null,
-					IAction.AS_CHECK_BOX);
-			_actions.put(name, action);
-		} else {
-			action = (ParagraphStyleAction) _actions.get(name);
-		}
-		action.setViewer(getViewer());
-		action.update();
-		ActionContributionItem item = new ActionContributionItem(action);
-		item.fill(parent, -1);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.action.IMenuCreator#dispose()
-	 */
-	public void dispose() {
-		if (_menu != null) {
-			_menu.dispose();
-			_menu = null;
-			_actions.clear();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.action.IAction#getMenuCreator()
-	 */
-	public IMenuCreator getMenuCreator() {
-		return this;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.editors.actions.DesignerToolBarAction#canRun(org.eclipse.jst.pagedesigner.dom.DOMRange)
-	 */
-	protected boolean isApplied(DOMRange range) {
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.action.IAction#run()
-	 */
-	public void run() {
-		return;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.range.DesignerToolBarAction#getCommand()
-	 */
-	protected Command getCommand() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.range.DesignerToolBarAction#setViewer(org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer)
-	 */
-	public void setViewer(IHTMLGraphicalViewer viewer) {
-		if (_actions != null && _actions.size() > 0) {
-			Collection values = _actions.values();
-			Iterator iterator = values.iterator();
-			while (iterator.hasNext()) {
-				DesignerToolBarAction action = (DesignerToolBarAction) iterator
-						.next();
-				action.setViewer(viewer);
-			}
-		}
-		super.setViewer(viewer);
-	}
-
-	/*
-	 * The group will delegate update to its children.
-	 */
-	public void updateStatus() {
-		if (_actions != null && _actions.size() > 0) {
-			Collection values = _actions.values();
-			Iterator iterator = values.iterator();
-			while (iterator.hasNext()) {
-				DesignerToolBarAction action = (DesignerToolBarAction) iterator
-						.next();
-				action.updateStatus();
-			}
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/InsertTagChangeStyleAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/InsertTagChangeStyleAction.java
deleted file mode 100644
index 7624a2b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/InsertTagChangeStyleAction.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.range;
-
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jst.pagedesigner.dom.DOMPositionHelper;
-import org.eclipse.jst.pagedesigner.dom.DOMRange;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.editors.actions.ChangeStyleAction;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public class InsertTagChangeStyleAction extends ChangeStyleAction {
-	/**
-	 * @param text
-	 * @param tag 
-	 * @param image
-	 * @param style
-	 */
-	public InsertTagChangeStyleAction(String text, String tag,
-			ImageDescriptor image, int style) {
-		super(text, tag, image, style);
-	}
-
-	protected String getExpectedCSSProperty() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	protected String getExpectedCSSPropertyValue() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	@Override
-    protected void updateState() 
-	{
-        setEnabled(getDesignRange());
-    }
-
-	/**
-	 * @param range
-	 */
-	public void setEnabled(DesignRange range) {
-		DOMRange domRange = null;
-		// We didn't deal with undo, so only enable is set.
-		domRange = new DOMRange(DOMPositionHelper.toDOMPosition(range
-				.getStartPosition()), DOMPositionHelper.toDOMPosition(range
-				.getEndPosition()));
-		if (canRun(domRange)) {
-			this.setEnabled(true);
-		} else {
-			this.setEnabled(false);
-		}
-	}
-
-	private boolean canRun(DOMRange range) {
-		if (range != null) {
-			if (EditModelQuery.isSame(range)) {
-				return false;
-			}
-			boolean ordered = range.isOrdered();
-			IDOMPosition start = ordered ? range.getStartPosition() : range
-					.getEndPosition();
-			IDOMPosition end = ordered ? range.getEndPosition() : range
-					.getStartPosition();
-			Node common = null;
-			common = EditModelQuery.getInstance().getCommonAncestor(start, end);
-			if (getExpectedTag() == null
-					|| EditModelQuery.hasAncestor(common, getExpectedTag(),
-							true)) {
-				return false;
-			}
-            return true;
-		}
-        return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/NoneParagraphStyleAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/NoneParagraphStyleAction.java
deleted file mode 100644
index 17793f8..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/NoneParagraphStyleAction.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.range;
-
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jst.pagedesigner.commands.range.Paragraph;
-import org.eclipse.jst.pagedesigner.commands.range.ParagraphFinder;
-import org.eclipse.jst.pagedesigner.commands.range.ParagraphUnapplyStyleCommand;
-import org.eclipse.jst.pagedesigner.dom.DOMRange;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public class NoneParagraphStyleAction extends ParagraphStyleAction {
-
-	private String[] _applyingTags;
-
-	/**
-	 * @param text
-	 * @param tags
-	 * @param image
-	 * @param style
-	 */
-	public NoneParagraphStyleAction(String text, String[] tags,
-			ImageDescriptor image, int style) {
-		super(text, "", image, style); //$NON-NLS-1$
-		_applyingTags = tags;
-	}
-
-	/**
-	 * @param text
-	 * @param node
-	 * @param image
-	 * @param style
-	 */
-	public NoneParagraphStyleAction(String text, Node node,
-			ImageDescriptor image, int style) {
-		super(text, node, image, style);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.editors.actions.DesignerToolBarAction#isApplied(org.eclipse.jst.pagedesigner.dom.DOMRange)
-	 */
-	protected boolean isApplied(DOMRange range) {
-		if (range != null) {
-			boolean ordered = range.isOrdered();
-			IDOMPosition start = ordered ? range.getStartPosition() : range
-					.getEndPosition();
-			IDOMPosition end = ordered ? range.getEndPosition() : range
-					.getStartPosition();
-			Node common = null;
-			if (EditModelQuery.isSame(range)) {
-				ParagraphFinder finder = new ParagraphFinder(start);
-				Paragraph p = finder.getParagraph(start);
-				common = p.getLowestContainer();
-			} else {
-				common = EditModelQuery.getInstance().getCommonAncestor(start,
-						end);
-			}
-			// the lowest common block parent is the container to apply style.
-			if (EditModelQuery.hasAncestor(common, _applyingTags, true)) {
-				return false;
-			}
-            return true;
-		}
-        return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.range.DesignerToolBarAction#getCommand()
-	 */
-	protected Command getCommand() {
-		ParagraphUnapplyStyleCommand command = new ParagraphUnapplyStyleCommand(
-				getViewer(), _applyingTags, null, null);
-		return command;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/NoneStyleAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/NoneStyleAction.java
deleted file mode 100644
index 44c9c76..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/NoneStyleAction.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.range;
-
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jst.pagedesigner.commands.range.UnapplyStyleCommand;
-import org.eclipse.jst.pagedesigner.dom.DOMRange;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public class NoneStyleAction extends ChangeStyleAction {
-	private String[] _applyingStyleTags;
-
-	/**
-	 * @param text
-	 * @param names
-	 * @param image
-	 * @param style
-	 */
-	public NoneStyleAction(String text, String[] names, ImageDescriptor image,
-			int style) {
-		super(text, "", image, style); //$NON-NLS-1$
-		_applyingStyleTags = names;
-	}
-
-	protected boolean isApplied(DOMRange range) {
-		if (range != null) {
-			boolean ordered = range.isOrdered();
-			IDOMPosition start = ordered ? range.getStartPosition() : range
-					.getEndPosition();
-			IDOMPosition end = ordered ? range.getEndPosition() : range
-					.getStartPosition();
-			Node common = null;
-			common = EditModelQuery.getInstance().getCommonAncestor(start, end);
-			if (EditModelQuery.hasAncestor(common, _applyingStyleTags, true)) {
-				return false;
-			}
-            return true;
-		}
-        return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.range.DesignerToolBarAction#getCommand()
-	 */
-	protected Command getCommand() {
-		UnapplyStyleCommand command = new UnapplyStyleCommand(getViewer(),
-				getExpectedTag(), null, null);
-		return command;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/ParagraphAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/ParagraphAction.java
deleted file mode 100644
index d2f13d0..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/ParagraphAction.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.range;
-
-import org.eclipse.jface.action.Action;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ParagraphAction extends Action {
-	/**
-	 * @param text
-	 * @param htmlTag
-	 */
-	public ParagraphAction(String text, String htmlTag) {
-		super(text);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/ParagraphStyleAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/ParagraphStyleAction.java
deleted file mode 100644
index 5c5b042..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/ParagraphStyleAction.java
+++ /dev/null
@@ -1,153 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.range;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jst.pagedesigner.commands.range.Paragraph;
-import org.eclipse.jst.pagedesigner.commands.range.ParagraphApplyStyleCommand;
-import org.eclipse.jst.pagedesigner.commands.range.ParagraphFinder;
-import org.eclipse.jst.pagedesigner.dom.DOMRange;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public class ParagraphStyleAction extends DesignerToolBarAction {
-	private String _tagName;
-
-	private Node _applyingNode;
-
-	/**
-	 * @param text
-	 * @param name
-	 * @param image
-	 * @param style
-	 */
-	public ParagraphStyleAction(String text, String name,
-			ImageDescriptor image, int style) {
-		super(text, style);
-		_tagName = name;
-		setImageDescriptor(image);
-	}
-
-	/**
-	 * @param text
-	 * @param node
-	 * @param image
-	 * @param style
-	 */
-	public ParagraphStyleAction(String text, Node node, ImageDescriptor image,
-			int style) {
-		super(text, style);
-		_applyingNode = node;
-		setImageDescriptor(image);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.editors.actions.DesignerToolBarAction#isApplied(org.eclipse.jst.pagedesigner.dom.DOMRange)
-	 */
-	protected boolean isApplied(DOMRange range) {
-		Assert.isTrue(getExpectedTag() != null);
-		if (range != null) {
-			boolean ordered = range.isOrdered();
-			IDOMPosition start = ordered ? range.getStartPosition() : range
-					.getEndPosition();
-			IDOMPosition end = ordered ? range.getEndPosition() : range
-					.getStartPosition();
-			Node common = null;
-			if (EditModelQuery.isSame(range)) {
-				ParagraphFinder finder = new ParagraphFinder(start);
-				Paragraph p = finder.getParagraph(start);
-				common = p.getLowestContainer();
-			} else {
-				common = EditModelQuery.getInstance().getCommonAncestor(start,
-						end);
-			}
-			// the lowest common block parent is the container to apply style.
-			if (containsTag(common)) {
-				return true;
-			}
-            return false;
-		}
-        return false;
-	}
-
-	/**
-	 * @param common
-	 * @return ??? 
-	 */
-	protected boolean containsTag(Node common) {
-		// the lowest common block parent is the container to apply style.
-		if (_applyingNode == null) {
-			return common.getNodeName() != null
-					&& getExpectedTag().equalsIgnoreCase(
-							common.getNodeName().toLowerCase());
-		}
-        
-        String align = ((Element) _applyingNode).getAttribute("align"); //$NON-NLS-1$
-        if (!(common instanceof Element)) {
-        	return false;
-        }
-        String cAlign = ((Element) common).getAttribute("align"); //$NON-NLS-1$
-        if (align == null || cAlign == null) {
-        	return false;
-        }
-        if (align.equals(cAlign)) {
-        	return true;
-        }
-        return false;
-	}
-
-	/**
-	 * @return Returns the _expectedTag.
-	 */
-	public String getExpectedTag() {
-		if (_tagName == null) {
-			return _applyingNode.getNodeName().toLowerCase();
-		}
-        return _tagName.toLowerCase();
-	}
-
-	/**
-	 * @return Returns the _applyingNode.
-	 */
-	public Element getApplyingNode() {
-		if (_applyingNode != null) {
-			return (Element) _applyingNode;
-		}
-        return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.range.DesignerToolBarAction#getCommand()
-	 */
-	protected Command getCommand() {
-		ParagraphApplyStyleCommand command = null;
-		if (getApplyingNode() != null) {
-			command = new ParagraphApplyStyleCommand(getViewer(),
-					getApplyingNode(), null, null);
-		} else {
-			command = new ParagraphApplyStyleCommand(getViewer(),
-					getExpectedTag(), null, null);
-		}
-		return command;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/ParagraphSupport.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/ParagraphSupport.java
deleted file mode 100644
index 2d03548..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/ParagraphSupport.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.range;
-
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ParagraphSupport {
-	static final String[] labels = new String[] {
-			PDPlugin.getResourceString("ParagraphSupport.CommandLabel.None"), //$NON-NLS-1$
-			PDPlugin
-					.getResourceString("ParagraphSupport.CommandLabel.Paragraph"), //$NON-NLS-1$
-			PDPlugin
-					.getResourceString("ParagraphSupport.CommandLabel.Heading1"), //$NON-NLS-1$
-			PDPlugin
-					.getResourceString("ParagraphSupport.CommandLabel.Heading2"), //$NON-NLS-1$
-			PDPlugin
-					.getResourceString("ParagraphSupport.CommandLabel.Heading3"), //$NON-NLS-1$ 
-			PDPlugin
-					.getResourceString("ParagraphSupport.CommandLabel.Heading4"),//$NON-NLS-1$ 
-			PDPlugin
-					.getResourceString("ParagraphSupport.CommandLabel.Heading5"), //$NON-NLS-1$ 
-			PDPlugin
-					.getResourceString("ParagraphSupport.CommandLabel.Heading6"), //$NON-NLS-1$ 
-			PDPlugin
-					.getResourceString("ParagraphSupport.CommandLabel.Preformated") //$NON-NLS-1$ 
-	};
-
-	static final String[] tags = new String[] {
-			null,
-			PDPlugin.getResourceString("ParagraphSupport.CommandLabel.P"), PDPlugin.getResourceString("ParagraphSupport.CommandLabel.H1"), PDPlugin.getResourceString("ParagraphSupport.CommandLabel.H2"), PDPlugin.getResourceString("ParagraphSupport.CommandLabel.H3"), PDPlugin.getResourceString("ParagraphSupport.CommandLabel.H4"), PDPlugin.getResourceString("ParagraphSupport.CommandLabel.H5"), PDPlugin.getResourceString("ParagraphSupport.CommandLabel.H6"), PDPlugin.getResourceString("ParagraphSupport.CommandLabel.PRE") //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$
-	};
-
-	/**
-	 * @param man
-	 * @param range
-	 * @param viewer
-	 */
-	public static void createParagraphActions(IMenuManager man,
-			DesignRange range, IHTMLGraphicalViewer viewer) {
-		ParagraphStyleAction action = new NoneParagraphStyleAction(
-				PDPlugin
-						.getResourceString("ParagraphSupport.CommandLabel.None"), tags, null, IAction.AS_CHECK_BOX); //$NON-NLS-1$
-		action.setViewer(viewer);
-		action.update();
-		man.add(action);
-		for (int i = 1; i < labels.length; i++) {
-			action = new ParagraphStyleAction(labels[i], tags[i], null,
-					IAction.AS_CHECK_BOX);
-			action.setViewer(viewer);
-			action.update();
-			man.add(action);
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/RangeActionGroup.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/RangeActionGroup.java
deleted file mode 100644
index 42c17aa..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/RangeActionGroup.java
+++ /dev/null
@@ -1,207 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.range;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IContributionItem;
-import org.eclipse.jface.action.IMenuListener;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.actions.link.MakeLinkAction;
-import org.eclipse.jst.pagedesigner.editors.PageDesignerActionConstants;
-import org.eclipse.jst.pagedesigner.editors.actions.DesignActionBarFactory;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.eclipse.ui.actions.ActionGroup;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class RangeActionGroup extends ActionGroup {
-    // TODO: what is this?  a separator?
-	private static final Action action = new Action() {
-        // Action is abstract but has no abstract methods
-        // so create a default empty action that does nothing
-	};
-
-	/**
-	 * 
-	 */
-	public RangeActionGroup() {
-		super();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.actions.ActionGroup#fillContextMenu(org.eclipse.jface.action.IMenuManager)
-	 */
-	public void fillContextMenu(IMenuManager contextMenu) 
-    {
-		DesignRange selection = fixUpSelection(getContext().getSelection());
-		if (selection == null) {
-			return;
-		}
-        IContributionItem styleSubMenuItem = 
-            contextMenu.find(PageDesignerActionConstants.STYLE_SUBMENU_ID);
-        
-        if (styleSubMenuItem instanceof IMenuManager)
-        {
-            final IMenuManager subMenu = (IMenuManager) styleSubMenuItem;
-    		if (getContext().getInput() instanceof IHTMLGraphicalViewer) {
-    			addParagraphFormatMenu(subMenu, selection,
-    					(IHTMLGraphicalViewer) getContext().getInput());
-    			addHorizontalAlignMenu(subMenu, selection,
-    					(IHTMLGraphicalViewer) getContext().getInput());
-    			addTextStyleMenu(subMenu, (IHTMLGraphicalViewer) getContext()
-    					.getInput());
-    		}
-            // TODO: the (commented out) copy of this method does nothing
-    		//addListModeMenu(menu, selection);
-    
-    		// TODO: the (commented out) copy of this method does nothing
-            //addTextFontMenu(menu, selection);
-    
-    		addLinkMenu(subMenu, selection);
-        }
-    }
-
-	/**
-	 * @param selection
-	 * @return
-	 */
-	private DesignRange fixUpSelection(ISelection selection) {
-		if (selection instanceof DesignRange) {
-			return (DesignRange) selection;
-		}
-        return null;
-	}
-
-	private void addLinkMenu(IMenuManager menu, final DesignRange selection) {
-		Action action1 = new MakeLinkAction(selection);
-		menu.appendToGroup(PageDesignerActionConstants.GROUP_STYLE, action1);
-	}
-
-	private void addTextStyleMenu(IMenuManager menu,
-			final IHTMLGraphicalViewer viewer) {
-		final IMenuManager submenu = new MenuManager(PDPlugin
-				.getResourceString("ActionGroup.Submenu.TextStyle"));//$NON-NLS-1$
-		submenu.add(action);
-
-		submenu.setRemoveAllWhenShown(true);
-		submenu.addMenuListener(new IMenuListener() {
-			public void menuAboutToShow(IMenuManager manager) {
-				DesignerToolBarAction action1 = null;
-				action1 = DesignActionBarFactory.getInstance().getStyleAction(
-						IHTMLConstants.TAG_U);
-				action1.setViewer(viewer);
-				submenu.add(action1);
-
-				action1 = DesignActionBarFactory.getInstance().getStyleAction(
-						IHTMLConstants.TAG_B);
-				action1.setViewer(viewer);
-				submenu.add(action1);
-
-				action1 = DesignActionBarFactory.getInstance().getStyleAction(
-						IHTMLConstants.TAG_I);
-				action1.setViewer(viewer);
-				submenu.add(action1);
-
-				action1 = DesignActionBarFactory.getInstance().getStyleAction(
-						IHTMLConstants.TAG_SMALL);
-				action1.setViewer(viewer);
-				submenu.add(action1);
-
-				action1 = DesignActionBarFactory.getInstance().getStyleAction(
-						IHTMLConstants.TAG_BIG);
-				action1.setViewer(viewer);
-				submenu.add(action1);
-
-			}
-		});
-		menu.appendToGroup(PageDesignerActionConstants.GROUP_STYLE, submenu);
-	}
-
-	/**
-	 * @param menu
-	 * @param selection
-	 */
-//	private void addTextFontMenu(IMenuManager menu, DesignRange selection) {
-//	    //
-//	}
-
-	/**
-	 * @param menu
-	 * @param selection
-	 */
-	private void addHorizontalAlignMenu(IMenuManager menu,
-			final DesignRange selection, final IHTMLGraphicalViewer viewer) {
-		// we have to initialize align nodes here for some refresh problem
-		Element[] alignNodes = new Element[4];
-		final String[] alignValues = new String[] { "left", "center", "right", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				"justify" }; //$NON-NLS-1$
-		Document document = viewer.getModel().getDocument();
-		for (int i = 0; i < 4; i++) {
-			Element node = document.createElement(IHTMLConstants.TAG_P);
-			node.setAttribute(IHTMLConstants.ATTR_ALIGN, alignValues[i]);
-			alignNodes[i] = node;
-		}
-		AlignSupport.setAlignNodes(alignNodes);
-
-		final IMenuManager submenu = new MenuManager(PDPlugin
-				.getResourceString("ActionGroup.Submenu.Align"));//$NON-NLS-1$
-		submenu.add(action);
-		submenu.setRemoveAllWhenShown(true);
-		submenu.addMenuListener(new IMenuListener() {
-			public void menuAboutToShow(IMenuManager manager) {
-				AlignSupport.createAlignActions(submenu, viewer);
-			}
-		});
-		menu.appendToGroup(PageDesignerActionConstants.GROUP_STYLE, submenu);
-
-	}
-
-	/**
-	 * @param menu
-	 * @param selection
-	 */
-//	private void addListModeMenu(IMenuManager menu, DesignRange selection) {
-//	}
-
-	/**
-	 * @param menu
-	 * @param selection
-	 */
-	private void addParagraphFormatMenu(IMenuManager menu,
-			final DesignRange selection, final IHTMLGraphicalViewer viewer) {
-		final IMenuManager submenu = new MenuManager(PDPlugin
-				.getResourceString("ActionGroup.Submenu.ParagraphFormat"));//$NON-NLS-1$
-		submenu.add(action);
-		// Add the submenu.
-
-		submenu.addMenuListener(new IMenuListener() {
-
-			public void menuAboutToShow(IMenuManager manager) {
-				submenu.removeAll();
-				ParagraphSupport.createParagraphActions(submenu, selection,
-						viewer);
-			}
-		});
-		menu.appendToGroup(PageDesignerActionConstants.GROUP_STYLE, submenu);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/RangeStyleAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/RangeStyleAction.java
deleted file mode 100644
index 2346403..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/RangeStyleAction.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.range;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class RangeStyleAction extends Action {
-	/**
-	 * @param text
-	 * @param range 
-	 * @param htmlTag 
-	 * @param cssProperty 
-	 * @param cssValue 
-	 */
-	public RangeStyleAction(String text, DesignRange range, String htmlTag,
-			String cssProperty, String cssValue) {
-		super(text);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.action.Action#run()
-	 */
-	public void run() {
-		if (isChecked()) {
-			// un-apply the style here
-		} else {
-			// apply the style here.
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/RangeStyleSupport.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/RangeStyleSupport.java
deleted file mode 100644
index e4e13ad..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/RangeStyleSupport.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.range;
-
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class RangeStyleSupport {
-	private static final String[] ActionLabel = new String[] {
-			PDPlugin.getResourceString("RangeStyleSupport.ActionLabel.Bold"),//$NON-NLS-1$
-			PDPlugin.getResourceString("RangeStyleSupport.ActionLabel.Italic"),//$NON-NLS-1$
-			PDPlugin
-					.getResourceString("RangeStyleSupport.ActionLabel.Underline"), }; //$NON-NLS-1$
-
-	private static final String[] HtmlTag = new String[] { "STRONG", "I", "U", }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-
-	private static final String[] CSSProperty = new String[] {
-			"font-weight", "font-style", "text-decoration", }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-
-	private static final String[] CSSValue = new String[] { "bolder", "italic", //$NON-NLS-1$ //$NON-NLS-2$
-			"underline", }; //$NON-NLS-1$
-
-	/**
-	 * @param menu
-	 * @param range
-	 */
-	public static void createRangeStyleActions(IMenuManager menu,
-			DesignRange range) {
-		for (int i = 0; i < ActionLabel.length; i++) {
-			RangeStyleAction action = new RangeStyleAction(ActionLabel[i],
-					range, HtmlTag[i], CSSProperty[i], CSSValue[i]);
-
-			menu.add(action);
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/BorderStyleAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/BorderStyleAction.java
deleted file mode 100644
index 1723662..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/BorderStyleAction.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.single;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class BorderStyleAction extends Action {
-
-	/**
-	 * @param stylevalue
-	 * @param ele
-	 * @param text
-	 * 
-	 */
-	public BorderStyleAction(String text, IDOMElement ele, String stylevalue) {
-		super(text);
-		// TODO Auto-generated constructor stub
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/ChangeAttributeAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/ChangeAttributeAction.java
deleted file mode 100644
index 7595da6..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/ChangeAttributeAction.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.single;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.commands.single.ChangeAttributeCommand;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ChangeAttributeAction extends Action {
-	IDOMElement _ele;
-
-	String _attrValue;
-
-	private String _attrName;
-
-	/**
-	 * @param label 
-	 * @param ele
-	 * @param attrName 
-	 * @param attrValue 
-	 */
-	public ChangeAttributeAction(String label, IDOMElement ele,
-			String attrName, String attrValue) {
-		super(label);
-		this._ele = ele;
-		this._attrName = attrName;
-		this._attrValue = attrValue;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.action.Action#run()
-	 */
-	public void run() {
-		if (this.isChecked()) {
-			return;
-		}
-
-		ChangeAttributeCommand c = new ChangeAttributeCommand(
-				PDPlugin
-						.getResourceString("ChangeAttributeAction.CommandLabel.ChangeStyleClass"), _ele, _attrName, _attrValue); //$NON-NLS-1$
-		c.execute();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/ChangeStyleAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/ChangeStyleAction.java
deleted file mode 100644
index 272dd4f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/ChangeStyleAction.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.single;
-
-import org.eclipse.gef.EditPartViewer;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.preference.PreferenceManager;
-import org.eclipse.jface.window.Window;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.commands.single.ChangeStyleCommand;
-import org.eclipse.jst.pagedesigner.parts.ElementEditPart;
-import org.eclipse.jst.pagedesigner.ui.dialogs.StyleDialog;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.wst.css.core.internal.provisional.document.ICSSStyleDeclaration;
-import org.eclipse.wst.css.core.internal.util.declaration.CSSPropertyContext;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.w3c.dom.css.ElementCSSInlineStyle;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ChangeStyleAction extends Action {
-	private static final String MY_TEXT = PDPlugin
-			.getResourceString("ChangeStyleAction.Text"); //$NON-NLS-1$
-
-	private ElementEditPart _editPart;
-
-	private IDOMElement _element;
-
-	/**
-	 * @param part
-	 * @param ele
-	 */
-	public ChangeStyleAction(ElementEditPart part, IDOMElement ele) {
-		super(MY_TEXT);
-		this._editPart = part;
-		this._element = ele;
-	}
-
-	public void run() {
-		ICSSStyleDeclaration styleDeclaration = (ICSSStyleDeclaration) ((ElementCSSInlineStyle) this._element)
-				.getStyle();
-		PreferenceManager manager = new PreferenceManager();
-		EditPartViewer viewer = this._editPart.getViewer();
-		Shell shell = viewer.getControl().getShell();
-
-		CSSPropertyContext context = new CSSPropertyContext(styleDeclaration);
-		StyleDialog dialog = new StyleDialog(shell, manager, _element, context);
-		if (dialog.open() == Window.OK) {
-			if (context.isModified()) {
-				ChangeStyleCommand c = new ChangeStyleCommand(_element, context);
-				c.execute();
-			}
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/ChangeStylePropertyAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/ChangeStylePropertyAction.java
deleted file mode 100644
index 1fef76f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/ChangeStylePropertyAction.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.single;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jst.pagedesigner.commands.single.ChangeStyleCommand;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ChangeStylePropertyAction extends Action {
-	private IDOMElement _ele;
-
-	private String _cssProperty;
-
-	private String _cssValue;
-
-	/**
-	 * @param text
-	 * @param ele 
-	 * @param cssProperty 
-	 * @param cssValue 
-	 */
-	public ChangeStylePropertyAction(String text, IDOMElement ele,
-			String cssProperty, String cssValue) {
-		super(text);
-		this._ele = ele;
-		this._cssProperty = cssProperty;
-		this._cssValue = cssValue;
-	}
-
-	public void run() {
-		if (isChecked()) {
-			return;
-		}
-
-		Map map = new HashMap();
-		map.put(_cssProperty, _cssValue);
-		ChangeStyleCommand command = new ChangeStyleCommand(_ele, map);
-		command.execute();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/ColorSupport.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/ColorSupport.java
deleted file mode 100644
index d253dd1..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/ColorSupport.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.single;
-
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.dom.DOMStyleUtil;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-/*package*/ class ColorSupport {
-	static final String[] COLOR_VALUES = new String[] {
-			PDPlugin.getResourceString("ColorSupport.CommandLabel.Aqua"), //$NON-NLS-1$
-			PDPlugin.getResourceString("ColorSupport.CommandLabel.Black"), //$NON-NLS-1$
-			PDPlugin.getResourceString("ColorSupport.CommandLabel.Blue"), //$NON-NLS-1$
-			PDPlugin.getResourceString("ColorSupport.CommandLabel.Fuchsia"), //$NON-NLS-1$
-			PDPlugin.getResourceString("ColorSupport.CommandLabel.Gray"), //$NON-NLS-1$
-			PDPlugin.getResourceString("ColorSupport.CommandLabel.Green"), //$NON-NLS-1$
-			PDPlugin.getResourceString("ColorSupport.CommandLabel.Lime"), //$NON-NLS-1$
-			PDPlugin.getResourceString("ColorSupport.CommandLabel.Maroon"), //$NON-NLS-1$
-			PDPlugin.getResourceString("ColorSupport.CommandLabel.Navy"), //$NON-NLS-1$
-			PDPlugin.getResourceString("ColorSupport.CommandLabel.Olive"), //$NON-NLS-1$
-			PDPlugin.getResourceString("ColorSupport.CommandLabel.Orange"), //$NON-NLS-1$
-			PDPlugin.getResourceString("ColorSupport.CommandLabel.Purple"), //$NON-NLS-1$
-			PDPlugin.getResourceString("ColorSupport.CommandLabel.Red"), //$NON-NLS-1$
-			PDPlugin.getResourceString("ColorSupport.CommandLabel.Silver"), //$NON-NLS-1$
-			PDPlugin.getResourceString("ColorSupport.CommandLabel.Teal"), //$NON-NLS-1$
-			PDPlugin.getResourceString("ColorSupport.CommandLabel.White"), //$NON-NLS-1$
-			PDPlugin.getResourceString("ColorSupport.CommandLabel.Yellow") //$NON-NLS-1$
-	};
-
-	/**
-	 * 
-	 * @param menu
-	 * @param ele
-	 * @param cssProperty
-	 *            will be "color" or "background-color"
-	 */
-	static void createColorActions(IMenuManager menu, IDOMElement ele,
-			String cssProperty) {
-		boolean needAdditional = true;
-		String currentValue = DOMStyleUtil.getInlineStyleProperty(ele,
-				cssProperty);
-		ChangeStylePropertyAction defaultAction = new ChangeStylePropertyAction(
-				PDPlugin.getResourceString("ColorSupport.CommandLabel.Default"), ele, cssProperty, null); //$NON-NLS-1$
-		if (currentValue == null || currentValue.length() == 0) {
-			defaultAction.setChecked(true);
-			needAdditional = false;
-		}
-		menu.add(defaultAction);
-		menu.add(new Separator());
-		for (int i = 0; i < COLOR_VALUES.length; i++) {
-			ChangeStylePropertyAction action = new ChangeStylePropertyAction(
-					COLOR_VALUES[i], ele, cssProperty, COLOR_VALUES[i]);
-			if (COLOR_VALUES[i].equalsIgnoreCase(currentValue)) {
-				action.setChecked(true);
-				needAdditional = false;
-			}
-			menu.add(action);
-		}
-
-		if (needAdditional) {
-			ChangeStylePropertyAction action = new ChangeStylePropertyAction(
-					currentValue, ele, cssProperty, currentValue);
-			action.setChecked(true);
-			menu.add(action);
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/Messages.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/Messages.java
deleted file mode 100644
index 8ca7772..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/Messages.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.single;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * String resource handler
- *
- */
-public class Messages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.jst.pagedesigner.actions.single.messages"; //$NON-NLS-1$
-
-	/**
-	 * see messages.properties
-	 */
-	public static String SelectParentAction_MenuTextNoParent;
-	/**
-	 * see messages.properties
-	 */
-	public static String SelectParentAction_MenuTextParent;
-	/**
-	 * see messages.properties
-	 */
-	public static String SingleElementActionGroup_ChildrenActionText;
-	static {
-		// initialize resource bundle
-		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-	}
-
-	private Messages() {
-		//
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/SelectEditPartAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/SelectEditPartAction.java
deleted file mode 100644
index 2cb2299..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/SelectEditPartAction.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.single;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.viewers.StructuredSelection;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public abstract class SelectEditPartAction extends Action {
-    
-    /**
-     * @param text
-     * @param forThisPart
-     * @return a convience object when the edit part that needs selection
-     * is already known when the action is constructed
-     */
-    public static SelectEditPartAction create(final String text, final EditPart forThisPart)
-    {
-        return new SelectEditPartAction(text)
-        {
-            protected EditPart getNewSelection() {
-                return forThisPart;
-            }
-        };
-    }
-
-	/**
-	 * @param text
-	 */
-	protected SelectEditPartAction(String text) {
-		super(text);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.action.Action#run()
-	 */
-	public void run() {
-        final EditPart newSelection = getNewSelection();
-        newSelection.getViewer().setSelection(new StructuredSelection(newSelection));
-	}
-    
-    /**
-     * @return the EditPart onto which selection should be applied.
-     */
-    protected abstract EditPart getNewSelection();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/SelectNodeAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/SelectNodeAction.java
deleted file mode 100644
index 5724e31..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/SelectNodeAction.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.single;
-
-import org.w3c.dom.Node;
-
-/**
- * An edit part selection action that corresponds to a Node selection
- */
-public abstract class SelectNodeAction extends SelectEditPartAction 
-{
-    private final Node  _node;
-
-    /**
-     * @param text
-     * @param curNode
-     */
-    protected SelectNodeAction(String text, Node curNode) {
-        super(text);
-        _node = curNode;
-    }
-
-    /**
-     * @return the current node
-     */
-    protected Node getNode() {
-        return _node;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/SelectParentAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/SelectParentAction.java
deleted file mode 100644
index 4a02abc..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/SelectParentAction.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.single;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.osgi.util.NLS;
-import org.w3c.dom.Node;
-
-/**
- * Given a target node/edit part change selection to its parent
- * 
- * @author cbateman
- *
- */
-public class SelectParentAction extends SelectNodeAction {
-
-    private final EditPart _editPart;
-    
-    /**
-     * @param node
-     * @param editPart
-     * @return an action that will change focus selection to the parent
-     * part of node/editPart or a disabled one if there is no parent
-     */
-    public static SelectParentAction create(Node node, EditPart editPart)
-    {
-        Node parent = node.getParentNode();
-        
-        if (parent != null)
-        {
-            final String text = NLS.bind(Messages.SelectParentAction_MenuTextParent, parent.getNodeName()); 
-            return new SelectParentAction(text, node, editPart);
-        }
-        SelectParentAction action = new SelectParentAction(Messages.SelectParentAction_MenuTextNoParent, node, editPart); 
-        action.setEnabled(false);
-        return action;
-    }
-    
-    private SelectParentAction(String text, Node node, EditPart editPart)
-    {
-        super(text, node);
-        _editPart = editPart;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.actions.single.SelectEditPartAction#getNewSelection()
-     */
-    protected EditPart getNewSelection() 
-    {
-        return _editPart.getParent();
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/SingleElementActionGroup.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/SingleElementActionGroup.java
deleted file mode 100644
index 402a391..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/SingleElementActionGroup.java
+++ /dev/null
@@ -1,240 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.single;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IContributionItem;
-import org.eclipse.jface.action.IMenuListener;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.dom.DOMStyleUtil;
-import org.eclipse.jst.pagedesigner.editors.PageDesignerActionConstants;
-import org.eclipse.jst.pagedesigner.elementedit.IElementEdit;
-import org.eclipse.jst.pagedesigner.parts.ElementEditPart;
-import org.eclipse.ui.actions.ActionGroup;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.w3c.dom.Element;
-
-/**
- * Group that constructs context menu items for a single selected element.
- * 
- * @author mengbo
- * @version 1.5
- */
-public class SingleElementActionGroup extends ActionGroup {
-    // TODO: why?
-	private static final Action action = new Action() {
-        // create a default instance that does nothing
-        // Action is abstract but has no abstract methods
-        // run() on this object is a NOOP
-	};
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.actions.ActionGroup#fillContextMenu(org.eclipse.jface.action.IMenuManager)
-	 */
-	public void fillContextMenu(IMenuManager menu) {
-		ElementEditPart part = fixUpSelection(getContext().getSelection());
-		if (part == null) {
-			return;
-		}
-		IDOMElement ele = (IDOMElement) part.getIDOMNode();
-        addPositionRelativeMenu(menu, part, ele);
-		addStylelMenu(menu, part, ele);
-
-		// next add element special actions
-		IElementEdit elementEdit = part.getElementEdit();
-		if (elementEdit != null) {
-			elementEdit.fillContextMenu(menu, ele);
-		}
-	}
-
-	/**
-	 * @param selection
-	 * @return
-	 */
-	private ElementEditPart fixUpSelection(ISelection selection) {
-		if (selection instanceof IStructuredSelection) {
-			IStructuredSelection sel = (IStructuredSelection) selection;
-			if (sel.size() != 1) {
-				return null;
-			}
-			if (sel.getFirstElement() instanceof ElementEditPart) {
-				return (ElementEditPart) sel.getFirstElement();
-			}
-		}
-		return null;
-	}
-
-    /**
-     * Add menu actions that select relative to the current position
-     * 
-     * @param menu
-     * @param part
-     * @param ele
-     */
-    private void addPositionRelativeMenu(IMenuManager menu, ElementEditPart part, IDOMElement ele)
-    {
-        IContributionItem subMenuItem = menu.find(PageDesignerActionConstants.SELECT_SUBMENU_ID);
-        
-        if (subMenuItem instanceof IMenuManager)
-        {
-            final IMenuManager subMenu = (IMenuManager) subMenuItem;
-    //        final IMenuManager selectMenu = new MenuManager(PDPlugin
-    //                .getResourceString("ActionGroup.Submenu.SelectRelative"));//$NON-NLS-1$
-            SelectParentAction  selectParentAction = SelectParentAction.create(ele, part);
-            // Eclipse UI guideline: 6.13
-            // even if there is no parent, a disabled action will be returned by
-            // create and this should be added to the menu
-            subMenu.add(selectParentAction);
-            
-            List children = new ArrayList();
-            for (Iterator it = part.getChildren().iterator(); it.hasNext();)
-            {
-                EditPart childPart = (EditPart) it.next();
-                
-                // only include selectable element edit part that are modelling
-                // XML elements in the source doc
-                if (childPart instanceof ElementEditPart
-                        && ((ElementEditPart)childPart).isSelectable()
-                        && ((ElementEditPart)childPart).getModel() instanceof Element)
-                {
-                    children.add(SelectNodeAction
-                            .create(((Element)((ElementEditPart)childPart).getModel()).getNodeName(), childPart));
-                }
-            }
-
-            
-            // don't add the select Children menu unless there are actually children
-            if (children.size() > 0)
-            {
-                MenuManager selectChildMenu = new MenuManager(Messages.SingleElementActionGroup_ChildrenActionText);
-                subMenu.add(selectChildMenu);
-
-                for (final Iterator it = children.iterator(); it.hasNext();)
-                {
-                    selectChildMenu.add((Action)it.next());
-                }
-            }
-            else
-            {   // Eclipse UI guideline 6.13
-                // create the child actions even if no children but make it
-                // a disabled option if no children
-                Action childrenAction = new Action(Messages.SingleElementActionGroup_ChildrenActionText){/* do nothing*/};
-                childrenAction.setEnabled(false);
-                subMenu.add(childrenAction);
-            }
-        }
-    }
-    
-	/**
-	 * @param menu
-	 * @param part
-	 */
-	private void addStylelMenu(IMenuManager menu, ElementEditPart part,
-			IDOMElement ele) {
-        IContributionItem subMenu = 
-            menu.find(PageDesignerActionConstants.STYLE_SUBMENU_ID);
-
-        if (subMenu instanceof IMenuManager)
-        {
-            final IMenuManager subMenuManager = 
-                (IMenuManager) subMenu;
-    		addStyle(subMenuManager, part, ele);
-    		addStyleClassesMenu(subMenuManager, part, ele);
-    
-    		if (DOMStyleUtil.supportStyleAttribute(ele)) {
-    			// addBorderStyleMenu(stylesub, part, ele);
-    			addColorMenu(subMenuManager, part, ele);
-    			addBackgroundMenu(subMenuManager, part, ele);
-    		}
-        }
-	}
-
-	/**
-	 * 
-	 * @param menu
-	 * @param part
-	 * @param ele
-	 */
-	private void addStyle(IMenuManager subMenu, ElementEditPart part,
-			IDOMElement ele) {
-        StyleSupport.createStyleAction(subMenu, part, ele);
-	}
-
-	/**
-	 * @param stylesub
-	 * @param part
-	 */
-	private void addStyleClassesMenu(IMenuManager subMenu,
-			ElementEditPart part, final IDOMElement ele) {
-		final IMenuManager classmenu = new MenuManager(PDPlugin
-				.getResourceString("ActionGroup.Submenu.StyleClasses"));//$NON-NLS-1$
-		StyleClassSupport.createStyleClassActions(classmenu, ele);
-
-        subMenu.appendToGroup(PageDesignerActionConstants.GROUP_STYLE,
-                classmenu);
-	}
-
-	/**
-	 * @param stylesub
-	 * @param part
-	 */
-	private void addColorMenu(IMenuManager subMenu, ElementEditPart part,
-			final IDOMElement ele) {
-		final IMenuManager colorSub = new MenuManager(PDPlugin
-				.getResourceString("ActionGroup.Submenu.Color"));//$NON-NLS-1$
-		colorSub.add(action);
-		colorSub.addMenuListener(new IMenuListener() {
-			public void menuAboutToShow(IMenuManager manager) {
-				colorSub.removeAll();
-				ColorSupport.createColorActions(colorSub, ele,
-						ICSSPropertyID.ATTR_COLOR);
-			}
-		});
-        subMenu.appendToGroup(PageDesignerActionConstants.GROUP_STYLE,
-				colorSub);
-
-	}
-
-	/**
-	 * @param stylesub
-	 * @param part
-	 */
-	private void addBackgroundMenu(IMenuManager subMenu, ElementEditPart part,
-			final IDOMElement ele) {
-		final IMenuManager colorSub = new MenuManager(PDPlugin
-				.getResourceString("ActionGroup.Submenu.BackgroundColor"));//$NON-NLS-1$
-		colorSub.add(action);
-		colorSub.addMenuListener(new IMenuListener() {
-
-			public void menuAboutToShow(IMenuManager manager) {
-				colorSub.removeAll();
-				ColorSupport.createColorActions(colorSub, ele,
-						ICSSPropertyID.ATTR_BACKGROUND_COLOR);
-			}
-		});
-
-        subMenu.appendToGroup(PageDesignerActionConstants.GROUP_STYLE,
-				colorSub);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/StyleClassSupport.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/StyleClassSupport.java
deleted file mode 100644
index 40264f4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/StyleClassSupport.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.single;
-
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jst.jsf.core.internal.tld.CMUtil;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.css2.CSSUtil;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class StyleClassSupport {
-	private final static String DEFAULT = PDPlugin
-			.getResourceString("StyleClassSupport.Default"); //$NON-NLS-1$
-
-	/**
-	 * @param classmenu
-	 * @param ele 
-	 */
-	public static void createStyleClassActions(IMenuManager classmenu,
-			IDOMElement ele) {
-		String styleClassAttr = getStyleClassAttributeName(ele);
-		if (styleClassAttr == null) {
-			return; // don't support style class
-		}
-		String styleClass = getStyleClass(ele);
-
-		boolean needAdditional = true;
-		ChangeAttributeAction action = new ChangeAttributeAction(DEFAULT, ele,
-				styleClassAttr, null);
-		if (styleClass == null || styleClass.length() == 0) {
-			action.setChecked(true);
-			needAdditional = false;
-		}
-		classmenu.add(action);
-		String[] classes = CSSUtil.getCSSClasses(ele.getOwnerDocument());
-		if (classes.length > 0) {
-			classmenu.add(new Separator());
-		}
-		for (int i = 0; i < classes.length; i++) {
-			ChangeAttributeAction action2 = new ChangeAttributeAction(
-					classes[i], ele, styleClassAttr, classes[i]);
-			if (classes[i].equalsIgnoreCase(styleClass)) {
-				action2.setChecked(true);
-				needAdditional = false;
-			}
-			classmenu.add(action2);
-		}
-		if (needAdditional) {
-			ChangeAttributeAction action2 = new ChangeAttributeAction(
-					styleClass, ele, styleClassAttr, styleClass);
-			action2.setChecked(true);
-			classmenu.add(action2);
-		}
-	}
-
-	/**
-	 * @param ele
-	 * @return the style class for ele or null if none
-	 */
-	public static String getStyleClass(IDOMElement ele) {
-		String styleClassAttr = getStyleClassAttributeName(ele);
-		if (styleClassAttr != null) {
-			return ele.getAttribute(styleClassAttr);
-		}
-        return null;
-	}
-
-	/**
-	 * FIXME: This is a temparary impelementation, with everything hard coded.
-	 * In the future, should have some INodeAdapter mechanism for each node to
-	 * tell the style class attribute name.
-	 * 
-	 * @param ele
-	 * @return the style class attribute name or null if none applies
-	 */
-	public static String getStyleClassAttributeName(IDOMElement ele) {
-		CMElementDeclaration decl = CMUtil.getElementDeclaration(ele);
-		if (decl == null) {
-			return null;
-		}
-		String taguri = CMUtil.getTagURI(decl);
-		if (taguri == null || ITLDConstants.URI_HTML.equals(taguri)) {
-			if (decl.getAttributes().getNamedItem("class") != null) { //$NON-NLS-1$
-				return "class"; //$NON-NLS-1$
-			}
-            return null;
-		} else if (decl.getAttributes().getNamedItem("styleClass") != null) { //$NON-NLS-1$
-			return "styleClass"; //$NON-NLS-1$
-		} else if (decl.getAttributes().getNamedItem("class") != null) { //$NON-NLS-1$
-			return "class"; //$NON-NLS-1$
-		} else {
-			return null;
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/StyleSupport.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/StyleSupport.java
deleted file mode 100644
index e32abab..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/StyleSupport.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.single;
-
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jst.jsf.core.internal.tld.CMUtil;
-import org.eclipse.jst.pagedesigner.editors.PageDesignerActionConstants;
-import org.eclipse.jst.pagedesigner.parts.ElementEditPart;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public final class StyleSupport {
-	/**
-	 * @param menu
-	 * @param part
-	 * @param ele
-	 */
-	public static void createStyleAction(IMenuManager menu,
-			ElementEditPart part, IDOMElement ele) {
-		if (part == null) {
-			return;
-		}
-		if (hasStyleAttribute(ele)) {
-			IAction action = new ChangeStyleAction(part, ele);
-			menu.appendToGroup(PageDesignerActionConstants.GROUP_STYLE, action);
-		}
-	}
-
-	private static boolean hasStyleAttribute(IDOMElement ele) {
-		CMElementDeclaration decl = CMUtil.getElementDeclaration(ele);
-		if (decl == null) {
-			return false;
-		}
-		if (decl.getAttributes().getNamedItem("style") != null) { //$NON-NLS-1$
-			return true;
-		}
-		return false;
-	}
-	
-	private StyleSupport()
-	{
-		// util class; no instantiation
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/messages.properties b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/messages.properties
deleted file mode 100644
index 3b36f16..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/messages.properties
+++ /dev/null
@@ -1,3 +0,0 @@
-SelectParentAction_MenuTextNoParent=Parent
-SelectParentAction_MenuTextParent=Parent ({0})
-SingleElementActionGroup_ChildrenActionText=Children
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/table/TableActionGroup.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/table/TableActionGroup.java
deleted file mode 100644
index f076978..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/table/TableActionGroup.java
+++ /dev/null
@@ -1,196 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.table;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IMenuListener;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.actions.single.SelectEditPartAction;
-import org.eclipse.jst.pagedesigner.editors.PageDesignerActionConstants;
-import org.eclipse.jst.pagedesigner.parts.ElementEditPart;
-import org.eclipse.jst.pagedesigner.range.RangeUtil;
-import org.eclipse.jst.pagedesigner.tableedit.DeleteRowColumnAction;
-import org.eclipse.jst.pagedesigner.tableedit.InsertRowColumnAction;
-import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-import org.eclipse.ui.actions.ActionGroup;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * 
- * @author mengbo
- * @version 1.5
- */
-/*package*/ class TableActionGroup extends ActionGroup {
-	// TODO: I think there's a pattern emerging...
-    private final static Action action = new Action() {
-        // create an empty no-op
-	};
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.actions.ActionGroup#fillContextMenu(org.eclipse.jface.action.IMenuManager)
-	 */
-	public void fillContextMenu(IMenuManager menu) {
-		ISelection selection = this.getContext().getSelection();
-
-		EditPart part = findCommonAncesterPart(selection);
-		if (part == null) {
-			return;
-		}
-
-		TableOperationContext context = TableOperationContext
-				.getTableOperationContext(part);
-		if (context == null) {
-			return;
-		}
-
-		final ElementEditPart tablePart = context.getTablePart();
-
-		if (tablePart == null || !supportTableActions(tablePart)) {
-			return;
-		}
-
-		final int cellRow = context.getRowIndex();
-		final int cellColumn = context.getColumnIndex();
-
-		String tag = ((IDOMElement) tablePart.getIDOMNode()).getLocalName();
-		final IMenuManager tableMenu = new MenuManager(tag);
-
-		// ok, we passed the checking, now let's create the actions.
-		tableMenu.add(action);
-		tableMenu.addMenuListener(new IMenuListener() {
-
-			public void menuAboutToShow(IMenuManager manager) {
-				tableMenu.removeAll();
-				fillTableMenu(tablePart, cellRow, cellColumn, tableMenu);
-			}
-		});
-		menu.appendToGroup(PageDesignerActionConstants.GROUP_CONTAINER,
-				tableMenu);
-	}
-
-	/**
-	 * @param tablePart
-	 * @param cellRow
-	 * @param cellColumn
-	 * @param tableMenu
-	 */
-	private void fillTableMenu(ElementEditPart tablePart, int cellRow,
-			int cellColumn, IMenuManager tableMenu) {
-		SelectEditPartAction action1 = SelectEditPartAction.create(
-				PDPlugin
-						.getResourceString("TableActionGroup.Submenu.SelectTable"), tablePart);//$NON-NLS-1$
-		tableMenu.add(action1);
-
-		tableMenu.add(new Separator());
-
-		{
-			InsertRowColumnAction insertRowBeforeAction = new InsertRowColumnAction(
-					PDPlugin
-							.getResourceString("TableActionGroup.Submenu.InsertRowBefore"),//$NON-NLS-1$
-					tablePart, cellRow, true, true);
-			tableMenu.add(insertRowBeforeAction);
-
-			InsertRowColumnAction insertRowAfterAction = new InsertRowColumnAction(
-					PDPlugin
-							.getResourceString("TableActionGroup.Submenu.InsertRowAfter"),//$NON-NLS-1$
-					tablePart, cellRow, true, false);
-			tableMenu.add(insertRowAfterAction);
-
-			tableMenu.add(new Separator());
-		}
-
-		{
-			InsertRowColumnAction insertColumnBeforeAction = new InsertRowColumnAction(
-					PDPlugin
-							.getResourceString("TableActionGroup.Submenu.InsertColumnBefore"),//$NON-NLS-1$
-					tablePart, cellColumn, true, true);
-			tableMenu.add(insertColumnBeforeAction);
-
-			InsertRowColumnAction insertColumnAfterAction = new InsertRowColumnAction(
-					PDPlugin
-							.getResourceString("TableActionGroup.Submenu.InsertColumnAfter"),//$NON-NLS-1$
-					tablePart, cellColumn, true, false);
-			tableMenu.add(insertColumnAfterAction);
-
-			tableMenu.add(new Separator());
-		}
-
-		{
-			DeleteRowColumnAction deleteRowAction = new DeleteRowColumnAction(
-					PDPlugin
-							.getResourceString("TableActionGroup.Submenu.DeleteRow"),//$NON-NLS-1$
-					tablePart, cellRow, true);
-			tableMenu.add(deleteRowAction);
-
-			DeleteRowColumnAction deleteColumnAction = new DeleteRowColumnAction(
-					PDPlugin
-							.getResourceString("TableActionGroup.Submenu.DeleteColumn"),//$NON-NLS-1$
-					tablePart, cellColumn, false);
-			tableMenu.add(deleteColumnAction);
-		}
-	}
-
-	/**
-	 * @param tablePart
-	 * @return
-	 */
-	private boolean supportTableActions(ElementEditPart tablePart) {
-	    // TODO: what's the point of this method?
-        // it's only used in one place and always resolves to the same value..
-		return true;
-	}
-
-	/**
-	 * Give a selection, find a single common container node as start for table
-	 * related operations.
-	 * 
-	 * @param selection
-	 * @return
-	 */
-	private EditPart findCommonAncesterPart(ISelection selection) {
-		if (selection instanceof IStructuredSelection) {
-			IStructuredSelection structsel = (IStructuredSelection) selection;
-			if (structsel.size() != 1) {
-				return null;
-			} else if (structsel.getFirstElement() instanceof EditPart) {
-				return (EditPart) structsel.getFirstElement();
-			} else {
-				return null;
-			}
-		} else if (selection instanceof DesignRange) {
-			DesignRange range = (DesignRange) selection;
-			if (!range.isValid()) {
-				return null;
-			}
-			if (range.isEmpty()) {
-				DesignPosition position = range.getStartPosition();
-				if (position.getOffset() == 0) {
-					return position.getContainerPart();
-				}
-                return position.getSiblingEditPart(true);
-			}
-            return RangeUtil.findCommonAncestor(range);
-		} else {
-			return null;
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/table/TableOperationContext.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/table/TableOperationContext.java
deleted file mode 100644
index 0981ed3..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/table/TableOperationContext.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.table;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.jst.pagedesigner.css2.layout.CSSFigure;
-import org.eclipse.jst.pagedesigner.css2.layout.table.CSSTableCellLayout;
-import org.eclipse.jst.pagedesigner.css2.layout.table.CSSTableLayout2;
-import org.eclipse.jst.pagedesigner.css2.layout.table.TableCellInfo;
-import org.eclipse.jst.pagedesigner.parts.ElementEditPart;
-
-/**
- * 
- * @author mengbo
- * @version 1.5
- */
-/*package*/ class TableOperationContext {
-	private ElementEditPart _tablePart;
-
-	private int _rowIndex;
-
-	private int _columnIndex;
-
-	/**
-	 * @param part
-	 * @return the operation context for part
-	 */
-	public static TableOperationContext getTableOperationContext(EditPart part) {
-		EditPart originalPart = part;
-		ElementEditPart tablePart = null;
-		CSSTableLayout2 tableLayout = null;
-
-		while (part.getParent() instanceof ElementEditPart) {
-			part = part.getParent();
-			IFigure figure = ((GraphicalEditPart) part).getFigure();
-
-			if (figure.getLayoutManager() instanceof CSSTableLayout2) {
-				tableLayout = (CSSTableLayout2) figure.getLayoutManager();
-				tablePart = ((ElementEditPart) part);
-				break;
-			}
-		}
-		if (tablePart == null) {
-			return null;
-		}
-
-		part = originalPart;
-
-		IFigure figure = ((GraphicalEditPart) originalPart).getFigure();
-		while (figure instanceof CSSFigure) {
-			if (figure.getLayoutManager() instanceof CSSTableCellLayout) {
-				CSSTableCellLayout cellLayout = (CSSTableCellLayout) figure
-						.getLayoutManager();
-				if (cellLayout.getTableLayout() == tableLayout) {
-					// ok, we found.
-					TableCellInfo cellInfo = cellLayout.getTableCellInfo();
-					if (cellInfo == null) {
-						return null;
-					}
-                    TableOperationContext context = new TableOperationContext();
-                    context._tablePart = tablePart;
-                    context._rowIndex = cellInfo.getRowIndex();
-                    context._columnIndex = cellInfo.getColumnIndex();
-                    return context;
-				}
-                return null;
-			}
-			figure = figure.getParent();
-		}
-		return null;
-	}
-
-    ElementEditPart getTablePart() {
-        return _tablePart;
-    }
-
-    int getRowIndex() {
-        return _rowIndex;
-    }
-
-    int getColumnIndex() {
-        return _columnIndex;
-    }
-	
-	
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/adapters/IBodyInfo.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/adapters/IBodyInfo.java
deleted file mode 100644
index 34dfb61..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/adapters/IBodyInfo.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.adapters;
-
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-
-/**
- * This is an adapter interface. Will be adapted to all the node in the
- * document. It provides additional information to support designer.
- * 
- * Basicaly it tells the correspoinding node's body related information.
- * 
- * @author mengbo
- */
-// XXX: in the future will use adapter mechanism to support dynamic information
-public interface IBodyInfo // extends INodeAdapter
-{
-	// /**
-	// * whether this node is runtime visible.
-	// *
-	// * @return
-	// */
-	// public boolean isRuntimeVisible(INodeNotifier node);
-	//    
-	// /**
-	// * whether this node is design time visible.
-	// * @return
-	// */
-	// public boolean isDesignTimeVisible(INodeNotifier node);
-
-	// /**
-	// * whether is HTML tag.
-	// * @param node
-	// * @return
-	// */
-	// public boolean isHTML(IDOMNode node);
-	//    
-	// /**
-	// * whether is JSP tag.
-	// * @param node
-	// * @return
-	// */
-	// public boolean isJSP(IDOMNode node);
-	//    
-	// /**
-	// * whether is custom tag.
-	// * @param node
-	// * @return
-	// */
-	// public boolean isCustomTag(IDOMNode node);
-	//    
-	// /**
-	// * for custom tag, there may have a corresponding HTML tag name.
-	// * This can be used for content model validation.
-	// *
-	// * @param node
-	// * @return
-	// */
-	// public String getCorrespondingHTMLTag(IDOMNode node);
-
-	/**
-	 * whether this node is body node. We treat the document node and certain
-	 * element node like "HTML", "BODY", "f:view", "f:subview" as body node. At
-	 * design time we may want to move those visual node into the body.
-	 * 
-	 * @param node 
-	 * @return true if node is a body container
-	 */
-	public boolean isBodyContainer(IDOMNode node);
-
-	/**
-	 * this method should only be called isBodyContainer return true; It checks
-	 * whether the uri/localname should belong to the head part of this body
-	 * container.
-	 * 
-	 * @param node 
-	 * @param uri
-	 * @param localname
-	 * @return true if node is a header
-	 */
-	public boolean isBodyHeader(IDOMNode node, String uri, String localname);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/adapters/internal/BodyInfo.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/adapters/internal/BodyInfo.java
deleted file mode 100644
index c969a15..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/adapters/internal/BodyInfo.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.adapters.internal;
-
-import org.eclipse.jst.jsf.core.internal.tld.CMUtil;
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.adapters.IBodyInfo;
-import org.eclipse.jst.pagedesigner.jsp.core.IJSPCoreConstants;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-// XXX: currently hard coded as singleton implementation,
-// it is believed in the future will not use singleton, because
-// we want to dynamically support other taglibs.
-public class BodyInfo implements IBodyInfo {
-	private static final BodyInfo _instance = new BodyInfo();
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.adapters.IDesignInfo#isBodyContainer(org.eclipse.wst.sse.core.internal.provisional.INodeNotifier)
-	 */
-	public boolean isBodyContainer(IDOMNode node) {
-		switch (node.getNodeType()) {
-		case Node.DOCUMENT_FRAGMENT_NODE:
-		case Node.DOCUMENT_NODE:
-			return true;
-		case Node.ELEMENT_NODE:
-			return isBodyContainerElement((Element) node);
-		default:
-			return false;
-		}
-	}
-
-	/**
-	 * @param element
-	 * @return
-	 */
-	private boolean isBodyContainerElement(Element element) {
-		String localname = element.getLocalName();
-		/*
-		 * String namespaceURI = CMUtil.getElementNamespaceURI(element); if
-		 * (IJMTConstants.URI_HTML.equals(namespaceURI)) { return
-		 * "html".equalsIgnoreCase(localname) ||
-		 * "body".equalsIgnoreCase(localname); } if
-		 * (IJMTConstants.URI_JSF_CORE.equals(namespaceURI)) { return
-		 * "view".equals(localname) || "subview".equals(localname); }
-		 */
-		return IHTMLConstants.TAG_HTML.equalsIgnoreCase(localname)
-				|| IHTMLConstants.TAG_BODY.equalsIgnoreCase(localname)
-				|| IJSFConstants.TAG_VIEW.equals(localname)
-				|| IJSFConstants.TAG_SUBVIEW.equals(localname);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.adapters.IDesignInfo#isBodyHeader(org.eclipse.wst.sse.core.internal.provisional.INodeNotifier,
-	 *      java.lang.String, java.lang.String)
-	 */
-	public boolean isBodyHeader(IDOMNode node, String uri, String localname) {
-		switch (node.getNodeType()) {
-		case Node.DOCUMENT_FRAGMENT_NODE:
-		case Node.DOCUMENT_NODE:
-			return isDocumentHeader(uri, localname);
-		case Node.ELEMENT_NODE:
-			return isElementHeader((Element) node, uri, localname);
-		default:
-			return false;
-		}
-	}
-
-	/**
-	 * @param element
-	 * @param uri
-	 * @param localname
-	 * @return
-	 */
-	private boolean isElementHeader(Element element, String uri,
-			String localname) {
-		String elelocalname = element.getLocalName();
-		String namespaceURI = CMUtil.getElementNamespaceURI(element);
-		if (ITLDConstants.URI_HTML.equals(namespaceURI)
-				&& IHTMLConstants.TAG_HTML.equalsIgnoreCase(elelocalname)) {
-			return IHTMLConstants.TAG_HEAD.equalsIgnoreCase(localname);
-		}
-		if (ITLDConstants.URI_JSF_CORE.equals(namespaceURI)
-				&& IJSFConstants.TAG_VIEW.equalsIgnoreCase(elelocalname)) {
-			return IJSFConstants.TAG_LOADBUNDLE.equalsIgnoreCase(localname);
-		}
-		return false;
-	}
-
-	/**
-	 * @param uri
-	 * @param localname
-	 * @return
-	 */
-	private boolean isDocumentHeader(String uri, String localname) {
-		// FIXME: temparary commented out, since the dragged node do not have
-		// uri information for now.
-		// if (IJMTConstants.URI_JSP.equals(uri))
-		return IJSPCoreConstants.TAG_DIRECTIVE_PAGE.equals(localname)
-				|| IJSPCoreConstants.TAG_DIRECTIVE_TAGLIB.equals(localname);
-
-	}
-
-	/**
-	 * @return the singleton
-	 */
-	public static IBodyInfo getInstance() {
-		return _instance;
-	}
-
-	private BodyInfo()
-	{
-	    // no external instantiation
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/CloneNodeCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/CloneNodeCommand.java
deleted file mode 100644
index c618210..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/CloneNodeCommand.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.pagedesigner.dom.DOMUtil;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Node;
-
-/**
- * This is when user control+mouse drag. Can also be used in other places.
- * 
- * @author mengbo
- * @version 1.5
- */
-public class CloneNodeCommand extends DesignerCommand {
-	IDOMPosition _insertPosition;
-
-	Node _originalNode;
-
-	Node _resultNode;
-
-	/**
-	 * @param viewer
-	 * @param insertionPoint 
-	 * @param originalNode 
-	 */
-	public CloneNodeCommand(IHTMLGraphicalViewer viewer,
-			IDOMPosition insertionPoint, Node originalNode) {
-		super(
-				CommandResources.getString("CloneNodeCommand.Label.CloneNode"), viewer); //$NON-NLS-1$
-		this._insertPosition = insertionPoint;
-		this._originalNode = originalNode;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-	 */
-	protected void doExecute() {
-		Node newNode = DOMUtil.cloneNodeDeep(this.getDocument(), _originalNode);
-		DOMUtil.insertNode(_insertPosition, newNode);
-		_resultNode = newNode;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#getAfterCommandDesignerSelection()
-	 */
-	protected ISelection getAfterCommandDesignerSelection() {
-		return toDesignSelection(_resultNode);
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/CommandResources.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/CommandResources.java
deleted file mode 100644
index c18db16..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/CommandResources.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands;
-
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class CommandResources {
-	private static final String BUNDLE_NAME = "org.eclipse.jst.pagedesigner.commands.CommandResources"; //$NON-NLS-1$
-
-	private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle
-			.getBundle(BUNDLE_NAME);
-
-	private CommandResources() {
-        // no local instantiation
-	}
-
-	/**
-	 * @param key
-	 * @return the resource value for key or  !key! if not foudnd
-	 */
-	public static String getString(String key) {
-		try {
-			return RESOURCE_BUNDLE.getString(key);
-		} catch (MissingResourceException e) {
-			return '!' + key + '!';
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/CommandResources.properties b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/CommandResources.properties
deleted file mode 100644
index 3e3464b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/CommandResources.properties
+++ /dev/null
@@ -1,33 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-PasteNodeCommand.Label.DeleteNode=Delete Node
-CutNodeCommand.Label.CutNode=Cut Node
-DeleteNodeCommand.Label.DeleteNode=Delete Node
-DeleteAction.CommandLabel.Delete=Delete
-TableDeleteColumnCommand.Label.DeleteColumn=Delete Column
-TableInsertColumnCommand.Label.InsertColumn=Insert Column
-TableResizeColumnCommand.Label.ResizeColumn=Resize Column
-TableInsertColumnCommand.Text.Default=Cell
-TableResizeRowCommand.Label.ResizeColumn=Resize Column
-TableDeleteRowCommand.Label.DeleteRow=Delete Row
-TableInsertRowCommand.Label.InsertRow=Insert Row
-TableDeleteHeaderFooterCommand.Label.DeleteHeader=Delete Header
-TableDeleteHeaderFooterCommand.Label.DeleteFooter=Delete Footer
-TableInsertHeaderFooterCommand.Label.InsertHeader=Insert Header
-TableInsertHeaderFooterCommand.Label.InsertFooter=Insert Footer
-PasteCommand.Label.Paste=Paste
-DeleteCommand.Label.Delete=Delete
-CutCommand.Label.Cut=Cut
-CopyCommand.Label.Copy=Copy
-ApplyStyleCommand.Label.ApplyStyle=Apply Style
-ChangeStyleCommand.Label.ChangeStyle=Change Style
-MoveNodeCommand.Label.MoveNode=Move Node
-CloneNodeCommand.Label.CloneNode=Copy Node
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/CopyAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/CopyAction.java
deleted file mode 100644
index 2502ac3..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/CopyAction.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands;
-
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.ui.actions.UpdateAction;
-import org.eclipse.gef.ui.parts.GraphicalEditor;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.commands.range.CopyCommand;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-
-/**
- * @author mengbo
- */
-public class CopyAction extends DesignAction implements UpdateAction {
-	/**
-	 * @param editor
-	 */
-	public CopyAction(GraphicalEditor editor) {
-		super(editor, PDPlugin.getResourceString("Action.Name.Copy"));//$NON-NLS-1$
-		// this.setAccelerator(SWT.CTRL | SWT.INSERT);
-		// this.setActionDefinitionId(ITextEditorActionDefinitionIds.CUT);
-	}
-
-	public void perform() {
-		DesignerCommand command = null;
-		IHTMLGraphicalViewer viewer = getViewer();
-		if (viewer.isInRangeMode()) {
-			command = new CopyCommand(viewer);
-			command.execute();
-		} else {
-			Command nodeCopy = new CopyNodeCommand(viewer);
-			nodeCopy.execute();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.action.IAction#isEnabled()
-	 */
-	public boolean isEnabled() {
-		IHTMLGraphicalViewer viewer = getViewer();
-		if (viewer != null) {
-			if (viewer.isInRangeMode()
-					&& !EditModelQuery.isSame(viewer.getRangeSelection())) {
-				return true;
-			} else if (!viewer.isInRangeMode()
-					&& viewer.getSelectedEditParts().size() > 0) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.ui.actions.UpdateAction#update()
-	 */
-	public void update() {
-		this.setEnabled(isEnabled());
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/CopyNodeCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/CopyNodeCommand.java
deleted file mode 100644
index ebc766c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/CopyNodeCommand.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands;
-
-import java.util.List;
-import java.util.Vector;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.dnd.TemplateTransfer;
-import org.eclipse.jst.pagedesigner.dom.EditValidateUtil;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.eclipse.swt.dnd.Clipboard;
-import org.eclipse.swt.dnd.TextTransfer;
-import org.eclipse.swt.dnd.Transfer;
-import org.w3c.dom.Node;
-
-/**
- * As copy operation won't change anything in the current document, so it is not
- * extending from DesignerCommand.
- * 
- * @author mengbo
- */
-public class CopyNodeCommand extends Command {
-	private IHTMLGraphicalViewer _viewer;
-
-	/**
-	 * @param viewer
-	 */
-	public CopyNodeCommand(IHTMLGraphicalViewer viewer) {
-		super(""); //$NON-NLS-1$
-		this._viewer = viewer;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-	 */
-	public void execute() {
-		List parts = _viewer.getSelectedEditParts();
-		Vector result = new Vector();
-		if (parts.size() > 0) {
-			for (int i = 0, n = parts.size(); i < n; i++) {
-				EditPart part = (EditPart) parts.get(i);
-				Object model = part.getModel();
-				if (model instanceof Node) {
-					EditValidateUtil.validNode((Node) model);
-					result.add(((Node) model).cloneNode(true));
-				}
-			}
-			setClipboard(result);
-		}
-	}
-
-	private void setClipboard(Vector result) {
-		Node[] nodes = (Node[]) result.toArray(new Node[result.size()]);
-		StringBuffer sb = new StringBuffer();
-		for (int i = 0, size = nodes.length; i < size; i++) {
-			DOMUtil.nodeToString(nodes[i], sb);
-		}
-		// TemplateTransfer.getInstance().setObject(result);
-		Clipboard board = new Clipboard(_viewer.getControl().getDisplay());
-		board.setContents(new Object[] { result, sb.toString() },
-				new Transfer[] { TemplateTransfer.getInstance(),
-						TextTransfer.getInstance() });
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/CreateItemCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/CreateItemCommand.java
deleted file mode 100644
index e19bb0a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/CreateItemCommand.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.editors.palette.IDropSourceData;
-import org.eclipse.jst.pagedesigner.utils.CommandUtil;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- */
-public class CreateItemCommand extends DesignerCommand implements ICustomizableCommand 
-{
-    private final IDOMPosition _position;
-    private final IDropSourceData _creationProvider;
-    private Element _ele;
-    private IAdaptable _customizationData;
-
-    /**
-     * @param label
-     * @param model
-     * @param position
-     * @param creationProvider
-     */
-    public CreateItemCommand(String label, IDOMModel model,
-            IDOMPosition position, IDropSourceData creationProvider) {
-        super(label, model.getDocument());
-        this._position = position;
-        this._creationProvider = creationProvider;
-    }
-
-    /**
-     * @return the dom position for the drop
-     */
-    public IDOMPosition getPosition()
-    {
-        return _position;
-    }
-
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-     */
-    protected void doExecute() 
-    {
-        Element element = CommandUtil.executeInsertion(
-                _creationProvider,
-                getModel(), this._position, this._customizationData);
-        if (element != null) 
-        {
-            formatNode(element);
-        }
-        this._ele = element;
-    }
-
-    @Override
-    protected void postPostExecute() 
-    {
-        // during JUnit testing, we may not have viewer.
-        // this will cause us not to have undo support,
-        // but should not effect testing for this command
-        if (getViewer() != null)
-        {
-            super.postPostExecute();
-        }
-    }
-
-    @Override
-    protected boolean prePreExecute() 
-    {
-        // during JUnit testing, we may not have viewer.
-        // this will cause us not to have undo support,
-        // but should not effect testing for this command
-        if (getViewer() != null)
-        {
-            return super.prePreExecute();
-        }
-        
-        return true;
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @seeorg.eclipse.jst.pagedesigner.commands.DesignerCommand#
-     * getAfterCommandDesignerSelection()
-     */
-    protected ISelection getAfterCommandDesignerSelection() {
-        return toDesignSelection(_ele);
-    }
-
-    /**
-     * @param customizationData
-     */
-    public void setCustomizationData(IAdaptable customizationData) 
-    {
-        _customizationData = customizationData;
-    }
-    
-    /**
-     * This method is for test purposes and should generally not be 
-     * used by clients.
-     * 
-     * @return the customization data
-     */
-    protected final IAdaptable getCustomizationData()
-    {
-        return _customizationData;
-    }
-    
-    /**
-     * @return the result of the command execution
-     * TODO: add Object getResult() method to DesignerCommand
-     */
-    protected Element getResult()
-    {
-        return this._ele;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/CutAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/CutAction.java
deleted file mode 100644
index 3617aec..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/CutAction.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands;
-
-import org.eclipse.gef.ui.actions.UpdateAction;
-import org.eclipse.gef.ui.parts.GraphicalEditor;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.commands.range.CutCommand;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-
-/**
- * @author mengbo
- */
-public class CutAction extends DesignAction implements UpdateAction {
-	/**
-	 * @param editor
-	 */
-	public CutAction(GraphicalEditor editor) {
-		super(editor, PDPlugin.getResourceString("Action.Name.Cut"));//$NON-NLS-1$
-	}
-
-	public void perform() {
-		DesignerCommand command = null;
-		IHTMLGraphicalViewer viewer = getViewer();
-		if (viewer.isInRangeMode()) {
-			command = new CutCommand(viewer);
-			command.execute();
-		} else {
-			command = new CutNodeCommand(viewer);
-			command.execute();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.action.IAction#isEnabled()
-	 */
-	public boolean isEnabled() {
-		IHTMLGraphicalViewer viewer = getViewer();
-		if (viewer != null) {
-			if (viewer.isInRangeMode()
-					&& !EditModelQuery.isSame(viewer.getRangeSelection())) {
-				return true;
-			} else if (!viewer.isInRangeMode()
-					&& viewer.getSelectedEditParts().size() > 0) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.ui.actions.UpdateAction#update()
-	 */
-	public void update() {
-		setEnabled(isEnabled());
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/CutNodeCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/CutNodeCommand.java
deleted file mode 100644
index 006629a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/CutNodeCommand.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands;
-
-import java.util.List;
-import java.util.Vector;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.dnd.TemplateTransfer;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.pagedesigner.dom.EditValidateUtil;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.eclipse.swt.dnd.Clipboard;
-import org.eclipse.swt.dnd.TextTransfer;
-import org.eclipse.swt.dnd.Transfer;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public class CutNodeCommand extends DesignerCommand {
-	private static final String COMMAND_LABEL = CommandResources
-			.getString("CutNodeCommand.Label.CutNode"); //$NON-NLS-1$
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-	 */
-	protected void doExecute() {
-		List parts = getViewer().getSelectedEditParts();
-		Vector result = new Vector();
-		if (parts.size() > 0) {
-			for (int i = 0, n = parts.size(); i < n; i++) {
-				EditPart part = (EditPart) parts.get(i);
-				Object model = part.getModel();
-				if (model instanceof Node) {
-					EditValidateUtil.validNode((Node) model);
-					Node parent = ((Node) model).getParentNode();
-					model = parent.removeChild((Node) model);
-					result.add(model);
-				}
-			}
-			setClipboard(result);
-		}
-	}
-
-	protected ISelection getAfterCommandDesignerSelection() {
-		return null;
-	}
-
-	/**
-	 * @param viewer
-	 */
-	public CutNodeCommand(IHTMLGraphicalViewer viewer) {
-		super(COMMAND_LABEL, viewer);
-	}
-
-	private void setClipboard(Vector result) {
-		Node[] nodes = (Node[]) result.toArray(new Node[result.size()]);
-		StringBuffer sb = new StringBuffer();
-		for (int i = 0, size = nodes.length; i < size; i++) {
-			DOMUtil.nodeToString(nodes[i], sb);
-		}
-		// TemplateTransfer.getInstance().setObject(result);
-		Clipboard board = new Clipboard(_viewer.getControl().getDisplay());
-		board.setContents(new Object[] { result, sb.toString() },
-				new Transfer[] { TemplateTransfer.getInstance(),
-						TextTransfer.getInstance() });
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/DeleteAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/DeleteAction.java
deleted file mode 100644
index 3c89651..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/DeleteAction.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands;
-
-import org.eclipse.gef.ui.parts.GraphicalEditor;
-import org.eclipse.jst.pagedesigner.commands.range.DeleteCommand;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.parts.DocumentEditPart;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-
-/**
- * @author mengbo
- */
-public class DeleteAction extends DesignAction {
-	/**
-	 * @param editor
-	 */
-	public DeleteAction(GraphicalEditor editor) {
-		super(editor, CommandResources
-				.getString("DeleteAction.CommandLabel.Delete")); //$NON-NLS-1$
-	}
-
-	public void perform() {
-		DesignerCommand command = null;
-		IHTMLGraphicalViewer viewer = getViewer();
-		if (viewer.isInRangeMode()) {
-			command = new DeleteCommand(true, viewer);
-			command.execute();
-		} else {
-			command = new DeleteNodeCommand(viewer);
-			command.execute();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.action.IAction#isEnabled()
-	 */
-	public boolean isEnabled() {
-		IHTMLGraphicalViewer viewer = getViewer();
-		if (viewer != null) {
-			if (viewer.isInRangeMode()
-					&& !EditModelQuery.isSame(viewer.getRangeSelection())) {
-				return true;
-			} else if (!viewer.isInRangeMode()) {
-				int size = viewer.getSelectedEditParts().size();
-				if (size > 1) {
-					return true;
-				} else if (size == 1
-						&& !(viewer.getSelectedEditParts().get(0) instanceof DocumentEditPart)) {
-					return true;
-				}
-			}
-		}
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/DeleteNodeCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/DeleteNodeCommand.java
deleted file mode 100644
index 71e529a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/DeleteNodeCommand.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands;
-
-import java.util.List;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.pagedesigner.dom.DOMPositionHelper;
-import org.eclipse.jst.pagedesigner.dom.EditHelper;
-import org.eclipse.jst.pagedesigner.dom.EditValidateUtil;
-import org.eclipse.jst.pagedesigner.parts.SubNodeEditPart;
-import org.eclipse.jst.pagedesigner.validation.caret.ActionData;
-import org.eclipse.jst.pagedesigner.validation.caret.IMovementMediator;
-import org.eclipse.jst.pagedesigner.validation.caret.InlineEditingNavigationMediator;
-import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-import org.eclipse.jst.pagedesigner.viewer.DesignRefPosition;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public class DeleteNodeCommand extends DesignerCommand {
-	private static final String COMMAND_LABEL = CommandResources
-			.getString("DeleteNodeCommand.Label.DeleteNode"); //$NON-NLS-1$
-
-	private DesignRange _prevRange;
-
-	/**
-	 * @param viewer
-	 */
-	public DeleteNodeCommand(IHTMLGraphicalViewer viewer) {
-		super(COMMAND_LABEL, viewer);
-	}
-
-	protected void preExecute() {
-		_prevRange = _viewer.getRangeSelection();
-		DesignPosition position = findObjectModePosition();
-		_prevRange = new DesignRange(position, position);
-		super.preExecute();
-	}
-
-	private DesignPosition findObjectModePosition() {
-		DesignPosition result = null;
-		IMovementMediator validator = new InlineEditingNavigationMediator(
-				new ActionData(ActionData.KEYBOARD_NAVAGATION, null));
-		DesignPosition position = getCurrentObjectPosition();
-		if (position != null) {
-			if (!validator.isValidPosition(position)) {
-				result = null;
-			} else {
-				result = position;
-			}
-		}
-		return result;
-	}
-
-	private DesignPosition getCurrentObjectPosition() {
-		DesignRange result = null;
-		if (_viewer.isInRangeMode()) {
-			result = _viewer.getRangeSelection();
-		} else {
-			List parts = _viewer.getSelectedEditParts();
-			if (parts.size() > 0) {
-				EditPart selection = (EditPart) parts.get(0);
-				if (selection instanceof SubNodeEditPart) {
-					DesignPosition position = new DesignRefPosition(selection,
-							false);
-					position = DOMPositionHelper.toDesignPosition(EditHelper
-							.ensureDOMPosition(DOMPositionHelper
-									.toDOMPosition(position)));
-					result = new DesignRange(position, position);
-				}
-			}
-		}
-		return result != null && result.isValid() ? result.getEndPosition()
-				: null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-	 */
-	protected void doExecute() {
-		List parts = getViewer().getSelectedEditParts();
-		for (int i = 0, n = parts.size(); i < n; i++) {
-			EditPart part = (EditPart) parts.get(i);
-			Object model = part.getModel();
-			if (model instanceof Node) {
-				EditValidateUtil.validNode((Node) model);
-				Node parent = ((Node) model).getParentNode();
-				model = parent.removeChild((Node) model);
-			}
-		}
-	}
-
-	protected ISelection getAfterCommandDesignerSelection() {
-		if (_prevRange.isValid()) {
-			return _prevRange;
-		}
-        return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/DesignAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/DesignAction.java
deleted file mode 100644
index a92e225..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/DesignAction.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands;
-
-import org.eclipse.gef.ui.actions.UpdateAction;
-import org.eclipse.gef.ui.parts.GraphicalEditor;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jst.pagedesigner.editors.IDesignViewer;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-
-/**
- * @author mengbo
- */
-public abstract class DesignAction extends Action implements UpdateAction {
-	private GraphicalEditor _editor;
-
-	/**
-	 * @param editor
-	 * @param text
-	 */
-	public DesignAction(GraphicalEditor editor, String text) {
-		super(text);
-		_editor = editor;
-	}
-
-	/**
-	 * @return Returns the _editor.
-	 */
-	protected GraphicalEditor getEditor() {
-		return _editor;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.action.IAction#run()
-	 */
-	public void run() {
-		perform();
-		// Since the parameters don't affect, so they could be null, may change
-		// in the future
-		_editor.selectionChanged(null, null);
-	}
-
-	abstract void perform();
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.ui.actions.UpdateAction#update()
-	 */
-	public void update() {
-		setEnabled(isEnabled());
-	}
-
-	/**
-	 * @return the viewer
-	 */
-	protected IHTMLGraphicalViewer getViewer() {
-		return ((IDesignViewer) _editor).getGraphicViewer();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/DesignResizeComponentCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/DesignResizeComponentCommand.java
deleted file mode 100644
index e829767..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/DesignResizeComponentCommand.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands;
-
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.DefaultEditDomain;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPartViewer;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.editparts.ScalableRootEditPart;
-import org.eclipse.jface.text.ITextOperationTarget;
-import org.eclipse.jface.text.source.SourceViewer;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.editors.HTMLEditor;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- */
-public class DesignResizeComponentCommand extends Command {
-	private EditPart _part;
-
-	private Object _constraint;
-
-	private SourceViewer _viewer;
-
-	/**
-	 * @param child
-	 * @param constraint
-	 */
-	public DesignResizeComponentCommand(EditPart child, Object constraint) {
-		this._part = child;
-		this._constraint = constraint;
-		EditPart part = child;
-		if (part instanceof ScalableRootEditPart) {
-            // TODO: eh?
-            // do nothing I guess...
-		} else {
-			while (part != null
-					&& !(part.getParent() instanceof ScalableRootEditPart)) {
-				part = part.getParent();
-			}
-		}
-		if (part != null) {
-			EditPartViewer viewer = ((ScalableRootEditPart) part.getParent())
-					.getViewer();
-			HTMLEditor editor = ((HTMLEditor) ((DefaultEditDomain) ((IHTMLGraphicalViewer) viewer)
-					.getEditDomain()).getEditorPart());
-			_viewer = editor.getTextEditor().getTextViewer();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.commands.Command#execute()
-	 */
-	public void execute() {
-		Element element = ((Element) _part.getModel());
-		String width = element.getAttribute(ICSSPropertyID.ATTR_WIDTH);
-		// String height = element.getAttribute(ICSSPropertyID.ATTR_HEIGHT);
-		String originalStyle = element.getAttribute(ICSSPropertyID.ATTR_STYLE);
-		StringBuffer style;
-		if (originalStyle != null) {
-			originalStyle = this.removeOthers(originalStyle,
-					ICSSPropertyID.ATTR_WIDTH);
-			originalStyle = this.removeOthers(originalStyle,
-					ICSSPropertyID.ATTR_HEIGHT);
-			style = new StringBuffer(originalStyle);
-		} else {
-			style = new StringBuffer(50);
-		}
-		if (null == width) {
-			style.append(";").append(ICSSPropertyID.ATTR_WIDTH).append(":") //$NON-NLS-1$ //$NON-NLS-2$
-					.append(((Rectangle) _constraint).width).append(";"); //$NON-NLS-1$
-			style.append(ICSSPropertyID.ATTR_HEIGHT).append(":").append( //$NON-NLS-1$
-					((Rectangle) _constraint).height).append(""); //$NON-NLS-1$
-		}
-		element.setAttribute(ICSSPropertyID.ATTR_STYLE, style.toString());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.commands.Command#redo()
-	 */
-	public void redo() {
-		_viewer.doOperation(ITextOperationTarget.REDO);
-	}
-
-	/**
-	 * @param style
-	 * @param item
-	 * @return ?
-	 */
-	public String removeOthers(String style, String item) {
-		String result = null;
-		int pos = style.indexOf(item);
-		if (pos < 0) {
-			return style;
-		}
-		int pos1 = pos;
-		if (pos > 0) {
-			if (style.charAt(pos - 1) == ';') {
-				pos--;
-			}
-		}
-		char ch = style.charAt(pos1);
-		while (!(ch == ';' || ch == '"' || ch == '\'')) {
-			pos1++;
-			if (pos1 >= style.length()) {
-				break;
-			}
-			ch = style.charAt(pos1);
-		}
-		if (pos1 < style.length()) {
-			result = style.substring(0, pos)
-					+ style.substring(pos1 + 1, style.length());
-		} else {
-			result = style.substring(0, pos);
-		}
-		if (result.indexOf(item) >= 0) {
-			return removeOthers(result, item);
-		}
-        return result;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.commands.Command#undo()
-	 */
-	public void undo() {
-		_viewer.doOperation(ITextOperationTarget.UNDO);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/DesignerCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/DesignerCommand.java
deleted file mode 100644
index 10d6c60..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/DesignerCommand.java
+++ /dev/null
@@ -1,376 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jface.text.ITextSelection;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.dom.DOMPositionHelper;
-import org.eclipse.jst.pagedesigner.dom.DOMRange;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.dom.EditValidateUtil;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.parts.ElementEditPart;
-import org.eclipse.jst.pagedesigner.utils.SelectionHelper;
-import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.eclipse.wst.html.core.internal.format.HTMLFormatProcessorImpl;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * This class is intended to be the base class for all designer GEF commands.
- * Basically, it will wrap the real command with common actions like handle
- * undo/redo, etc.
- * 
- * @author mengbo
- */
-public abstract class DesignerCommand extends Command {
-	private final IDOMModel _model;
-
-	/**
-	 * the graphical viewer
-	 */
-	protected IHTMLGraphicalViewer _viewer;
-
-	private static final Logger _log = PDPlugin
-			.getLogger(DesignerCommand.class);
-
-	/**
-	 * @param label
-	 * @param viewer
-	 */
-	public DesignerCommand(String label, IHTMLGraphicalViewer viewer) {
-		super(label);
-		this._viewer = viewer;
-		this._model = viewer.getModel();
-	}
-
-	/**
-	 * @param label
-	 * @param node
-	 *            the node must be a node in the IHTMLGraphicalViewer.
-	 */
-	public DesignerCommand(String label, IDOMNode node) {
-	    this(label, (IDOMDocument) node.getOwnerDocument());
-	}
-
-	/**
-	 * @param label
-	 * @param document
-	 */
-	public DesignerCommand(String label, IDOMDocument document)
-	{
-	    super(label);
-        this._model = document.getModel();
-        EditPart part = (EditPart) document.getAdapterFor(EditPart.class);
-        if (part != null) {
-            this._viewer = (IHTMLGraphicalViewer) part.getViewer();
-        }
-	}
-	/**
-	 * @return the GEF viewer this command is targeted for
-	 * 
-	 */
-	public IHTMLGraphicalViewer getViewer() {
-		return _viewer;
-	}
-
-	/**
-	 * @return the DOM model that this command will effect
-	 */
-	public IDOMModel getModel() {
-		return _model;
-	}
-
-	/**
-	 * @return the dom document for the model this command will effect
-	 */
-	public IDOMDocument getDocument() {
-		return getModel().getDocument();
-	}
-
-	/**
-	 * executes the Command. This method should not be called if the Command is
-	 * not executable.
-	 */
-	public final void execute() {
-		boolean ok = prePreExecute();
-		if (ok) {
-			try {
-				preExecute();
-				doExecute();
-				postExecute();
-			} catch (Exception ex) {
-				handleException(ex);
-			} finally {
-				postPostExecute();
-			}
-		}
-	}
-
-	/**
-	 * child class can override.
-	 * 
-	 * @param ex
-	 */
-	protected void handleException(Exception ex) {
-		ex.printStackTrace();
-	}
-
-	/**
-	 * prePreExecute and postPostExecute is a pair. prePreExecute() SHOULD NOT
-	 * throw any exception, if it throw any exception, it should catch itself
-	 * and return false to indicate not continue.
-	 * @return true if execution should continue, false if should not 
-	 */
-	protected boolean prePreExecute() {
-		int position = -1;
-		int length = -1;
-		ISelection selection = getViewer().getSelection();
-		if (selection != null) {
-			if (getViewer().isInRangeMode()) {
-				DesignRange range = (DesignRange) selection;
-				if (range.isValid()) {
-					IDOMPosition domPos = DOMPositionHelper.toDOMPosition(range
-							.getStartPosition());
-					IDOMPosition domEnd = DOMPositionHelper.toDOMPosition(range
-							.getEndPosition());
-					if (EditValidateUtil.validPosition(domPos)
-							&& EditValidateUtil.validPosition(domEnd)) {
-						position = EditModelQuery
-								.getIndexedRegionLocation(domPos);
-						int end = EditModelQuery
-								.getIndexedRegionLocation(domEnd);
-						if (end < position) {
-							length = position - end;
-							position = end;
-						} else {
-							length = end - position;
-						}
-					}
-				}
-			} else {
-				Object object = ((IStructuredSelection) selection)
-						.getFirstElement();
-				if (object instanceof ElementEditPart) {
-					Node node = ((ElementEditPart) object).getIDOMNode();
-					position = EditModelQuery.getNodeStartIndex(node);
-					length = EditModelQuery.getNodeLenth(node);
-				}
-			}
-		}
-		if (position >= 0 && length >= 0) {
-			getModel().beginRecording(this, getLabel(), position, length);
-		} else {
-			getModel().beginRecording(this, getLabel());
-		}
-		getViewer().startSelectionChange();
-		getModel().aboutToChangeModel();
-		return true;
-	}
-
-	/**
-	 * child class can override this method for any pre action.
-	 */
-	protected void preExecute() {
-        // does nothing; children may wish to implement
-	}
-
-	/**
-	 * child class should override this method for the real action.
-	 */
-	protected abstract void doExecute();
-
-	/**
-	 * child class can override this method for any post action. NOTE: if
-	 * preExecute() or doExecute() throw exception, then this method will NOT be
-	 * called.
-	 */
-	protected void postExecute() {
-        // does nothing; child may wish to implement
-	}
-
-	/**
-	 * if prePreExecute() return true, then this method will always be called
-	 * even preExecute()/doExecute() and postExecute() fail.
-	 */
-	protected void postPostExecute() {
-		getModel().changedModel();
-
-		// after "changedModel()" is called, model will fire out batched events
-		// about model change
-		// and EditPart will be refreshed. Only at this time, could we use
-		// EditPart to construct the
-		// result selection.
-
-		// enforce a validate, so things get layed out, thus all the figures
-		// will be valid.
-		this.getViewer().getViewport().validate();
-
-		ISelection sel = getAfterCommandDesignerSelection();
-		if (sel != null) {
-			ITextSelection textSel = SelectionHelper
-					.convertFromDesignSelectionToTextSelection(sel);
-			if (textSel != null) {
-				getModel().endRecording(this, textSel.getOffset(),
-						textSel.getLength());
-			} else {
-				getModel().endRecording(this);
-			}
-		} else {
-			getModel().endRecording(this);
-		}
-
-		if (sel != null) {
-			getViewer().setSelection(sel);
-		} else {
-			getViewer().deselectAll();
-		}
-		if (getViewer() != null) {
-			getViewer().selectionChanged();
-		}
-	}
-
-	/**
-	 * child class should override this method to provide the selection after
-	 * command. This method is called after model changed. So at time of this
-	 * call, the editpart should be valid. Default implementation.
-	 * 
-	 * @return the selection
-	 */
-	protected abstract ISelection getAfterCommandDesignerSelection();
-
-	/**
-	 * @param range
-	 * @return a selection that contains the dom range or null if one doesn't exist
-	 */
-	protected ISelection toDesignRange(DOMRange range) {
-		try {
-			if (range == null) {
-				return null;
-			}
-			IDOMPosition startPos = range.getStartPosition();
-			DesignPosition start = DOMPositionHelper.toDesignPosition(startPos);
-			if (range.isEmpty()) {
-				return new DesignRange(start, start);
-			}
-            IDOMPosition endPos = range.getEndPosition();
-            return new DesignRange(start, DOMPositionHelper
-            		.toDesignPosition(endPos));
-		} catch (Exception e) {
-			// "Selection error"
-			_log.error("Error.RangeModeCommand.SetSelection"); //$NON-NLS-1$
-			return null;
-		}
-
-	}
-
-	/**
-	 * @param node
-	 * @return a selection for the node
-	 */
-	protected IStructuredSelection toDesignSelection(Node node) {
-		if (node instanceof INodeNotifier) {
-			EditPart part = (EditPart) ((INodeNotifier) node)
-					.getAdapterFor(EditPart.class);
-			if (part != null) {
-				return new StructuredSelection(part);
-			}
-		}
-		return null;
-	}
-
-	//    
-	// /**
-	// * set selection to the specified node. Normally called by child class in
-	// <code>setSelection()</code> implementation.
-	// *
-	// * @param node
-	// */
-	// protected final void setSelection(Node node)
-	// {
-	// EditPart part = (EditPart) ((INodeNotifier)
-	// node).getAdapterFor(EditPart.class);
-	//
-	// StructuredSelection sel = new StructuredSelection(part);
-	// getViewer().setSelection(sel);
-	// }
-
-	/**
-	 * format the specified node in source code. Utility method that can be
-	 * called by child classes
-	 * 
-	 * @param node
-	 */
-	public void formatNode(Node node) {
-		// XXX: there should have some other way to get the FormatProcessor.
-		// currently hardcoded to HTMLFormatProcessorImpl().
-		new HTMLFormatProcessorImpl().formatNode(node);
-	}
-
-	/**
-	 * Re-executes the Command. This method should only be called after
-	 * <code>undo()</code> has been called.
-	 */
-	public void redo() {
-		// this method should in fact never be called, because we have already
-		// delegate undo
-		// operations to source view.
-		getModel().getUndoManager().redo();
-	}
-
-	/**
-	 * Undoes the changes performed during <code>execute()</code>. This
-	 * method should only be called after <code>execute</code> has been
-	 * called, and only when <code>canUndo()</code> returns <code>true</code>.
-	 * 
-	 * @see #canUndo()
-	 */
-	public void undo() {
-		// this method should in fact never be called, because we have already
-		// delegate undo
-		// operations to source view.
-		getModel().getUndoManager().undo();
-	}
-
-	/**
-	 * a utility method. NOTE: this method can ONLY be called BEFORE you change
-	 * anything in the model.
-	 * 
-	 * @param ele
-	 * @return the figure info for the  element
-	 */
-	public IFigure getFigureInfo(Element ele) {
-		if (ele instanceof IDOMElement) {
-			EditPart part = (EditPart) ((IDOMElement) ele)
-					.getAdapterFor(EditPart.class);
-			if (part instanceof GraphicalEditPart) {
-				return ((GraphicalEditPart) part).getFigure();
-			}
-		}
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/ICustomizableCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/ICustomizableCommand.java
deleted file mode 100644
index 12d2d6e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/ICustomizableCommand.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package org.eclipse.jst.pagedesigner.commands;
-
-import org.eclipse.core.runtime.IAdaptable;
-
-/**
- * A command that can be customized with drop customizable command
- * 
- * This is not public API.  Clients should not use.
- * 
- * @author cbateman
- *
- */
-public interface ICustomizableCommand
-{
-    /**
-     * Sets the customization data
-     * 
-     * @param customizationData
-     */
-    public void setCustomizationData(IAdaptable customizationData);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/MoveNodeCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/MoveNodeCommand.java
deleted file mode 100644
index 327a2c7..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/MoveNodeCommand.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.pagedesigner.dom.DOMPosition;
-import org.eclipse.jst.pagedesigner.dom.DOMUtil;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-/**
- * Move a node from one place to another place.
- * 
- * @author mengbo
- * @version 1.5
- */
-public class MoveNodeCommand extends DesignerCommand {
-	private IDOMPosition insertPosition;
-
-	private Node originalNode;
-
-	/**
-	 * @param viewer
-	 * @param insertionPoint 
-	 * @param originalNode 
-	 */
-	public MoveNodeCommand(IHTMLGraphicalViewer viewer,
-			IDOMPosition insertionPoint, Node originalNode) {
-		super(
-				CommandResources.getString("MoveNodeCommand.Label.MoveNode"), viewer); //$NON-NLS-1$
-		this.insertPosition = insertionPoint;
-		this.originalNode = originalNode;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-	 */
-	protected void doExecute() {
-		getModel().beginRecording(this);
-		try {
-			Node originalParent = originalNode.getParentNode();
-			if (originalParent == null) {
-				return;
-			}
-			// when remove the _originalNode, may affect the insertionPosition.
-			if (originalParent == insertPosition.getContainerNode()) {
-				// under same parent, may affect it.
-				int insertIndex = insertPosition.getOffset();
-				int nodeIndex = -1;
-				NodeList list = originalParent.getChildNodes();
-				for (int i = 0, length = list.getLength(); i < length; i++) {
-					if (originalNode == list.item(i)) {
-						nodeIndex = i;
-					}
-				}
-				if (nodeIndex == -1) {
-					return; // should not happen.
-				}
-				if (insertIndex < nodeIndex) {
-					insertPosition = new DOMPosition(originalParent,
-							insertIndex);
-				} else if (insertIndex == nodeIndex
-						|| insertIndex == nodeIndex + 1) {
-					// move to same position, do nothing.
-					return;
-				} else {
-					insertPosition = new DOMPosition(originalParent,
-							insertIndex - 1);
-				}
-			}
-			originalParent.removeChild(originalNode);
-			DOMUtil.insertNode(insertPosition, originalNode);
-		} finally {
-			getModel().endRecording(this);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#getAfterCommandDesignerSelection()
-	 */
-	protected ISelection getAfterCommandDesignerSelection() {
-		return toDesignSelection(originalNode);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/PDDropRequest.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/PDDropRequest.java
deleted file mode 100644
index 75c1fcf..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/PDDropRequest.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands;
-
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.requests.DropRequest;
-import org.eclipse.swt.dnd.DropTargetEvent;
-
-/**
- * @author mengbo
- */
-public class PDDropRequest extends Request implements DropRequest {
-	private Point _location;
-
-	private DropTargetEvent _currentEvent;
-
-	/**
-	 * 
-	 */
-	public PDDropRequest() {
-		setType(PDRequestConstants.REQ_DROP);
-	}
-
-	/**
-	 * Returns the location of the object to be created.
-	 * 
-	 * @return the location
-	 */
-	public Point getLocation() {
-		return _location;
-	}
-
-	/**
-	 * Sets the location where the new object will be placed.
-	 * 
-	 * @param location
-	 *            the location
-	 */
-	public void setLocation(Point location) {
-		this._location = location;
-	}
-
-	/**
-	 * @param ev
-	 */
-	public void setCurrentEvent(DropTargetEvent ev) {
-		_currentEvent = ev;
-	}
-
-	/**
-	 * @return the current drop target event
-	 */
-	public DropTargetEvent getCurrentEvent() {
-		return _currentEvent;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/PDRequestConstants.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/PDRequestConstants.java
deleted file mode 100644
index 8b73061..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/PDRequestConstants.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands;
-
-/**
- * @author mengbo
- */
-public interface PDRequestConstants {
-
-	/**
-	 * TODO: purpose?
-	 */
-	String REQ_DROP = "pd drop"; //$NON-NLS-1$
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/PaletteDropInsertCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/PaletteDropInsertCommand.java
deleted file mode 100644
index 7438282..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/PaletteDropInsertCommand.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.dnd.internal.SourceViewerDragDropHelper;
-import org.eclipse.jst.pagedesigner.dom.DOMPosition;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.editors.palette.IDropSourceData;
-import org.eclipse.jst.pagedesigner.itemcreation.customizer.DropCustomizationController;
-import org.eclipse.jst.pagedesigner.utils.CommandUtil;
-import org.eclipse.wst.sse.ui.StructuredTextEditor;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * Handles tag creation when dropped onto the WPE source view
- * 
- * @author mengbo
- */
-public class PaletteDropInsertCommand extends SourceViewerCommand implements ICustomizableCommand
-{
-
-	private final Logger _log = PDPlugin
-			.getLogger(PaletteDropInsertCommand.class);
-
-	private IDropSourceData _creationProvider;
-
-	private int _location;
-
-	private Element _element;
-
-	private IAdaptable _customizationData;
-
-	/**
-	 * @param label
-	 * @param editor
-	 * @param creationProvider
-	 * @param location
-	 */
-	public PaletteDropInsertCommand(String label, StructuredTextEditor editor,
-			IDropSourceData creationProvider, int location) {
-		super(label, editor);
-		_creationProvider = creationProvider;
-		_location = location;
-	}
-
-	public void doExecute() {
-		Node node;
-		try {
-			node = getSourceEditingTextTools().getNode(_location);
-		} catch (Exception e) {
-			_log.error("Bad text insertion location", e);		 //$NON-NLS-1$
-			return;
-		}
-		IDOMPosition position = null;
-		if (node != null) {
-			position = SourceViewerDragDropHelper.getInstance()
-					.findPosition(_location, node);
-		} else {
-			if (getModel().getDocument().getFirstChild() != null) {
-				//Fix for 224541 - When palette item is dropped to end of file in source view of Web Page Editor, the item is inserted at the top of file
-				//add inside at end of necessary container
-				position = SourceViewerDragDropHelper.getInstance()
-					.findPosition(getModel().getDocument().getEndOffset(), getModel().getDocument().getFirstChild());
-			} 
-			else {
-				// empty file
-				position = new DOMPosition(getModel().getDocument(), 0);
-			}
-		}
-
-        // essentially copied from ItemCreationTool so that DesignView drop and
-        // SourceViewDrop are same.
-        // Note that SourceView does NO drop validation checking. This is
-        // handled by ItemCreationPolicy in DesignView
-        final IStatus status = performCustomization(getModel().getDocument(),
-                position);
-
-        if (status.isOK()) 
-        {
-            final Element element = CommandUtil.executeInsertion(
-                    _creationProvider, getModel()
-                    , position, getCustomizationData());
-            if (element != null) {
-                formatNode(element);
-            }
-            this._element = element;
-        }
-    }
-
-	/**
-     * @param domDoc 
-	 * @param position 
-     * @return status
-	 */
-	protected IStatus performCustomization(final IDOMDocument domDoc, final IDOMPosition position) {
-		return new DropCustomizationController(this, _creationProvider, domDoc, position).performCustomization();
-	}
-
-    /**
-	 * @param customizationData
-	 */
-	public void setCustomizationData(IAdaptable customizationData) {
-		_customizationData = customizationData;
-	}
-
-	/**
-	 * This method is for test purposes and should generally not be 
-	 * used by clients.
-	 * 
-	 * @return the customization data
-	 */
-	protected final IAdaptable getCustomizationData() {
-		return _customizationData;
-	}
-	
-	public void setSelection() {
-		if (_element != null) {
-			int offset = EditModelQuery.getNodeStartIndex(_element);
-			int length = EditModelQuery.getNodeEndIndex(_element) - offset;
-			_editor.getTextViewer().setSelectedRange(offset, length);
-		}
-	}
-	
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/PasteAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/PasteAction.java
deleted file mode 100644
index 46c2050..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/PasteAction.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands;
-
-import org.eclipse.gef.dnd.TemplateTransfer;
-import org.eclipse.gef.ui.parts.GraphicalEditor;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.commands.range.PasteCommand;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.eclipse.swt.dnd.Clipboard;
-import org.eclipse.swt.dnd.TextTransfer;
-
-/**
- * @author mengbo
- */
-public class PasteAction extends DesignAction {
-
-	/**
-	 * @param editor
-	 */
-	public PasteAction(GraphicalEditor editor) {
-		super(editor, PDPlugin.getResourceString("Action.Name.Paste"));//$NON-NLS-1$
-	}
-
-	public void perform() {
-		DesignerCommand command = null;
-		IHTMLGraphicalViewer viewer = getViewer();
-		if (viewer.isInRangeMode()) {
-			command = new PasteCommand(viewer);
-			command.execute();
-		} else {
-			return;
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.action.IAction#isEnabled()
-	 */
-	public boolean isEnabled() {
-		IHTMLGraphicalViewer viewer = getViewer();
-		if (viewer != null && viewer.isInRangeMode()
-				&& viewer.getRangeSelection().isValid()) {
-			Clipboard clipboard = new Clipboard(viewer.getControl()
-					.getDisplay());
-			return clipboard.getContents(TemplateTransfer.getInstance()) != null
-					|| clipboard.getContents(TextTransfer.getInstance()) != null;
-		}
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/PasteNodeCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/PasteNodeCommand.java
deleted file mode 100644
index 81b25a0..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/PasteNodeCommand.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands;
-
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jface.text.ITextOperationTarget;
-import org.eclipse.jface.text.source.SourceViewer;
-import org.eclipse.jst.pagedesigner.commands.nav.ICaretPositionMover;
-import org.eclipse.wst.html.core.internal.document.ElementStyleImpl;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public class PasteNodeCommand extends Command implements ICaretPositionMover {
-	private static final String COMMAND_LABEL = CommandResources
-			.getString("PasteNodeCommand.Label.DeleteNode"); //$NON-NLS-1$
-
-	private Node child;
-
-	private SourceViewer _sourceViewer;
-
-	/**
-	 * @param viewer
-	 */
-	public PasteNodeCommand(SourceViewer viewer) {
-		super(COMMAND_LABEL);
-		this._sourceViewer = viewer;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.commands.Command#execute()
-	 */
-	public void execute() {
-		_sourceViewer.getTextWidget().setSelection(
-				((ElementStyleImpl) child).getStartOffset(),
-				((ElementStyleImpl) child).getStartOffset());
-		_sourceViewer.doOperation(ITextOperationTarget.PASTE);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.commands.Command#redo()
-	 */
-	public void redo() {
-		_sourceViewer.doOperation(ITextOperationTarget.REDO);
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.commands.Command#undo()
-	 */
-	public void undo() {
-		_sourceViewer.doOperation(ITextOperationTarget.UNDO);
-
-	}
-
-	/**
-	 * @param child
-	 *            The child to set.
-	 */
-	public void setChild(Node child) {
-		this.child = child;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/SourceViewerCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/SourceViewerCommand.java
deleted file mode 100644
index 2974929..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/SourceViewerCommand.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jface.text.TextSelection;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.wst.html.core.internal.format.HTMLFormatProcessorImpl;
-import org.eclipse.wst.sse.ui.StructuredTextEditor;
-import org.eclipse.wst.sse.ui.internal.provisional.extensions.ISourceEditingTextTools;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-import org.eclipse.wst.xml.ui.internal.provisional.IDOMSourceEditingTextTools;
-import org.w3c.dom.Document;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public abstract class SourceViewerCommand extends Command {
-	/**
-	 * the structured text editor containing the viewer
-	 */
-	protected final StructuredTextEditor _editor;
-
-	private Document _document;
-
-	private Logger _log = PDPlugin.getLogger(SourceViewerCommand.class);
-
-	/**
-	 * @param label 
-	 * @param editor 
-	 */
-	public SourceViewerCommand(String label, StructuredTextEditor editor) {
-		super();
-		_editor = editor;
-		IDOMSourceEditingTextTools tools = getSourceEditingTextTools();
-		_document = tools.getDOMDocument();
-	}
-
-	/**
-	 * @return the text tools
-	 */
-	protected IDOMSourceEditingTextTools getSourceEditingTextTools() {
-		IDOMSourceEditingTextTools tools = (IDOMSourceEditingTextTools) _editor
-				.getAdapter(ISourceEditingTextTools.class);
-		return tools;
-	}
-
-	/**
-	 * preExecute and postExecute is a pair. () SHOULD NOT throw any exception,
-	 * if it throw any exception, it should catch itself and return false to
-	 * indicate not continue.
-	 * @return true if preExec succeeded
-	 */
-	protected final boolean preExecute() {
-		int position = 0;
-		int length = 0;
-		ISelection selection = _editor.getTextViewer().getSelection();
-		if (selection instanceof TextSelection) {
-			position = ((TextSelection) selection).getOffset();
-			length = ((TextSelection) selection).getLength();
-		}
-		getModel().beginRecording(this, getLabel(), position, length);
-		getModel().aboutToChangeModel();
-		return true;
-	}
-
-	/**
-	 * if preExecute() return true, then this method will always be called even
-	 * preExecute()/doExecute() and postExecute() fail.
-	 */
-	protected final void postExecute() {
-		getModel().changedModel();
-		getModel().endRecording(this);
-		setSelection();
-	}
-
-	/**
-	 * format the specified node in source code. Utility method that can be
-	 * called by child classes
-	 * 
-	 * @param node
-	 */
-	public final void formatNode(Node node) {
-		new HTMLFormatProcessorImpl().formatNode(node);
-	}
-
-	/**
-	 * @return the dom model
-	 */
-	protected IDOMModel getModel() {
-		Assert.isTrue(_document != null && _document instanceof IDOMNode);
-		return ((IDOMNode) _document).getModel();
-	}
-
-	public final void execute() {
-		boolean ok = preExecute();
-		if (ok) {
-			try {
-				doExecute();
-			} catch (Exception ex) {
-				// "Error in command execution"
-				_log.error("Error.SourceViewerCommand.Execution", ex); //$NON-NLS-1$
-			} finally {
-				postExecute();
-			}
-		}
-	}
-
-	/**
-	 * execute
-	 */
-	public abstract void doExecute();
-
-	/**
-	 * set the selection
-	 */
-	public abstract void setSelection();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/SwitchSelectionCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/SwitchSelectionCommand.java
deleted file mode 100644
index 6092c52..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/SwitchSelectionCommand.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands;
-
-import java.util.List;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.dom.EditValidateUtil;
-import org.eclipse.jst.pagedesigner.parts.DocumentEditPart;
-import org.eclipse.jst.pagedesigner.parts.SubNodeEditPart;
-import org.eclipse.jst.pagedesigner.validation.caret.Target;
-import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.Text;
-
-/**
- * A command to switch the selection
- *
- */
-public class SwitchSelectionCommand extends Command {
-	IHTMLGraphicalViewer _viewer;
-
-	/**
-	 * @param viewer
-	 */
-	public SwitchSelectionCommand(IHTMLGraphicalViewer viewer) {
-		_viewer = viewer;
-	}
-
-	public void execute() {
-		if (_viewer.isInRangeMode()) {
-			ISelection selection = _viewer.getSelection();
-			if (selection instanceof DesignRange) {
-				DesignPosition posStart = ((DesignRange) selection)
-						.getStartPosition();
-				DesignPosition posEnd = ((DesignRange) selection)
-						.getEndPosition();
-				if (EditValidateUtil.validPosition(posStart)
-						&& EditValidateUtil.validPosition(posEnd)) {
-					Node ancestor = EditModelQuery.getInstance()
-							.getCommonAncestor(posStart.getContainerNode(),
-									posEnd.getContainerNode());
-					if (ancestor instanceof Text) {
-						ancestor = ancestor.getParentNode();
-					}
-					if (ancestor instanceof Element) {
-						EditPart part = Target.resolvePart(ancestor);
-						if (part instanceof SubNodeEditPart) {
-							_viewer.select(part);
-						}
-					}
-				}
-			}
-		} else {
-			List parts = _viewer.getSelectedEditParts();
-			if (parts.size() > 0) {
-				EditPart parent = ((EditPart) parts.get(0)).getParent();
-				if (!(parent instanceof DocumentEditPart)) {
-					_viewer.select(parent);
-				}
-			}
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/html/TableDeleteColumnCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/html/TableDeleteColumnCommand.java
deleted file mode 100644
index d9ba50d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/html/TableDeleteColumnCommand.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.html;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.pagedesigner.commands.CommandResources;
-import org.eclipse.jst.pagedesigner.commands.DesignerCommand;
-import org.eclipse.jst.pagedesigner.dom.html.TableUtil;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TableDeleteColumnCommand extends DesignerCommand {
-	private Element _tableEle;
-
-	private int _columnIndex;
-
-	private TableUtil _tableUtil;
-
-	/**
-	 * @param viewer
-	 * @param dataTable
-	 * @param index
-	 */
-	public TableDeleteColumnCommand(IHTMLGraphicalViewer viewer,
-			Element dataTable, int index) {
-		super(
-				CommandResources
-						.getString("TableDeleteColumnCommand.Label.DeleteColumn"), viewer); //$NON-NLS-1$
-		this._tableEle = dataTable;
-		this._columnIndex = index;
-		this._tableUtil = new TableUtil(this._tableEle);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.commands.Command#canExecute()
-	 */
-	public boolean canExecute() {
-		if (this._columnIndex < 0) {
-			return false;
-		}
-		boolean hasColSpan = _tableUtil.hasColumnSpanElement(this._columnIndex);
-		boolean isAffectedByColSpan = _tableUtil
-				.isAffectedByColSpan(this._columnIndex);
-		if (hasColSpan || isAffectedByColSpan) {
-			return false;
-		}
-
-		return super.canExecute();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#getAfterCommandDesignerSelection()
-	 */
-	protected ISelection getAfterCommandDesignerSelection() {
-		return toDesignSelection(_tableEle);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-	 */
-	protected void doExecute() {
-		List trList = new ArrayList();
-		TableUtil.getTrElements(this._tableEle, trList);
-
-		List[] lists = _tableUtil.getTrCellLists();
-
-		for (int i = 0, size = trList.size(); i < size; i++) {
-			Element tr = (Element) trList.get(i);
-			List cells = lists[i];
-			if (cells.size() <= this._columnIndex) {
-				continue;
-			}
-			Element cell = (Element) cells.get(this._columnIndex);
-			if (!cell.getTagName().equalsIgnoreCase("fake")) //$NON-NLS-1$
-			{
-				tr.removeChild(cell);
-			}
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/html/TableDeleteHeaderFooterCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/html/TableDeleteHeaderFooterCommand.java
deleted file mode 100644
index 432e204..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/html/TableDeleteHeaderFooterCommand.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.html;
-
-import java.util.List;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.commands.CommandResources;
-import org.eclipse.jst.pagedesigner.commands.DesignerCommand;
-import org.eclipse.jst.pagedesigner.dom.html.TableUtil;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TableDeleteHeaderFooterCommand extends DesignerCommand {
-	private Element _table;
-
-	private boolean _isHeader;
-
-	/**
-	 * @param viewer
-	 * @param table
-	 * @param isHeader
-	 */
-	public TableDeleteHeaderFooterCommand(IHTMLGraphicalViewer viewer,
-			Element table, boolean isHeader) {
-		super(
-				isHeader ? CommandResources
-						.getString("TableDeleteHeaderFooterCommand.Label.DeleteHeader") : CommandResources.getString("TableDeleteHeaderFooterCommand.Label.DeleteFooter"), viewer); //$NON-NLS-1$ //$NON-NLS-2$
-		this._table = table;
-		this._isHeader = isHeader;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.commands.Command#canExecute()
-	 */
-	public boolean canExecute() {
-		String sectionName = this._isHeader ? IHTMLConstants.TAG_THEAD
-				: IHTMLConstants.TAG_TFOOT;
-		int rows = TableUtil.countSectionRows(this._table, sectionName);
-		if (rows == 0) {
-			return false;
-		}
-		return super.canExecute();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-	 */
-	protected void doExecute() {
-		String sectionName = this._isHeader ? IHTMLConstants.TAG_THEAD
-				: IHTMLConstants.TAG_TFOOT;
-		List list = DOMUtil.getChildElementsByTagIgnoreCase(this._table,
-				sectionName);
-		Node delNode = (Node) list.get(0);
-		this._table.removeChild(delNode);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#getAfterCommandDesignerSelection()
-	 */
-	protected ISelection getAfterCommandDesignerSelection() {
-		return this.toDesignSelection(this._table);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/html/TableDeleteRowCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/html/TableDeleteRowCommand.java
deleted file mode 100644
index 3ee5ea7..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/html/TableDeleteRowCommand.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.html;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.pagedesigner.commands.CommandResources;
-import org.eclipse.jst.pagedesigner.commands.DesignerCommand;
-import org.eclipse.jst.pagedesigner.dom.html.TableUtil;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TableDeleteRowCommand extends DesignerCommand {
-	Element _tableEle;
-
-	int _rowIndex;
-
-	/**
-	 * @param viewer
-	 * @param table
-	 * @param index
-	 */
-	public TableDeleteRowCommand(IHTMLGraphicalViewer viewer, Element table,
-			int index) {
-		super(CommandResources
-				.getString("TableDeleteRowCommand.Label.DeleteRow"), viewer); //$NON-NLS-1$
-		this._tableEle = table;
-		this._rowIndex = index;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.commands.Command#canExecute()
-	 */
-	public boolean canExecute() {
-		if (this._rowIndex < 0) {
-			return false;
-		}
-		List list = new ArrayList();
-		TableUtil.getTrElements(this._tableEle, list);
-		// int index = TableUtil.countRowIndexInDOMTree(this._tableEle,
-		// this._rowIndex);
-		int index = this._rowIndex;
-		Element tr = (Element) list.get(index);
-		boolean hasRowSpan = TableUtil.hasRowSpanElement(tr);
-		boolean isAffectedByRowSpan = TableUtil.isAffectedByRowSpan(list, tr,
-				index);
-		if (hasRowSpan || isAffectedByRowSpan) {
-			return false;
-		}
-
-		return super.canExecute();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#getAfterCommandDesignerSelection()
-	 */
-	protected ISelection getAfterCommandDesignerSelection() {
-		return toDesignSelection(_tableEle);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-	 */
-	protected void doExecute() {
-		List list = new ArrayList();
-		TableUtil.getTrElements(this._tableEle, list);
-		// int index = TableUtil.countRowIndexInDOMTree(this._tableEle,
-		// this._rowIndex);
-		int index = this._rowIndex;
-		Element tr = (Element) list.get(index);
-		tr.getParentNode().removeChild(tr);
-		formatNode(this._tableEle);
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/html/TableInsertColumnCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/html/TableInsertColumnCommand.java
deleted file mode 100644
index 9fe1dbb..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/html/TableInsertColumnCommand.java
+++ /dev/null
@@ -1,158 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.html;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.commands.CommandResources;
-import org.eclipse.jst.pagedesigner.commands.DesignerCommand;
-import org.eclipse.jst.pagedesigner.dom.html.TableUtil;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TableInsertColumnCommand extends DesignerCommand {
-	private Element _tableEle;
-
-	private int _columnIndex;
-
-	private TableUtil _tableUtil;
-
-	/**
-	 * @param viewer
-	 * @param dataTable
-	 * @param index
-	 */
-	public TableInsertColumnCommand(IHTMLGraphicalViewer viewer,
-			Element dataTable, int index) {
-		super(
-				CommandResources
-						.getString("TableInsertColumnCommand.Label.InsertColumn"), viewer); //$NON-NLS-1$
-		this._tableEle = dataTable;
-		this._columnIndex = index;
-		this._tableUtil = new TableUtil(this._tableEle);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.commands.Command#canExecute()
-	 */
-	public boolean canExecute() {
-		List trList = new ArrayList();
-		TableUtil.getTrElements(this._tableEle, trList);
-		if (trList == null || trList.isEmpty()) {
-			return false;
-		}
-		if (this._columnIndex < 0 && this._columnIndex != -10) {
-			return false;
-		}
-		boolean isAffectedByColSpan = _tableUtil
-				.isAffectedByColSpan(this._columnIndex);
-		if (isAffectedByColSpan) {
-			return false;
-		}
-
-		return super.canExecute();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#getAfterCommandDesignerSelection()
-	 */
-	protected ISelection getAfterCommandDesignerSelection() {
-		return toDesignSelection(_tableEle);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-	 */
-	protected void doExecute() {
-		List trList = new ArrayList();
-		TableUtil.getTrElements(this._tableEle, trList);
-
-		List[] lists = _tableUtil.getTrCellLists();
-		int maxColumn = _tableUtil.getColumnCount();
-
-		boolean isAtLastColumn = false;
-		if (this._columnIndex >= maxColumn) {
-			isAtLastColumn = true;
-		}
-
-		for (int i = 0, size = trList.size(); i < size; i++) {
-			Element tr = (Element) trList.get(i);
-			boolean hasTH = (DOMUtil.getChildElementsByTagIgnoreCase(tr,
-					IHTMLConstants.TAG_TH).size() > 0);
-
-			List cells = lists[i];
-			if (isAtLastColumn || (cells.size() <= this._columnIndex)) {
-				int index = this._columnIndex + 1;
-				for (int k = cells.size(); k < index; k++) {
-					tr.appendChild(createDefaultElement(hasTH));
-				}
-			} else {
-				if (this._columnIndex != -10) {
-					Element cell = (Element) cells.get(this._columnIndex);
-					if (!cell.getTagName().equalsIgnoreCase("fake")) //$NON-NLS-1$
-					{
-						tr.insertBefore(createDefaultElement(hasTH), cell);
-					} else {
-						boolean hasRealElement = false;
-						for (int k = _columnIndex + 1; k < cells.size(); k++) {
-							Element td = (Element) cells.get(k);
-							if (!td.getTagName().equalsIgnoreCase("fake")) //$NON-NLS-1$
-							{
-								hasRealElement = true;
-								tr.insertBefore(createDefaultElement(hasTH), td);
-								break;
-							}
-						}
-						if (!hasRealElement) {
-							tr.appendChild(createDefaultElement(hasTH));
-						}
-					}
-				} else {
-					tr.appendChild(createDefaultElement(hasTH));
-				}
-			}
-		}
-
-		formatNode(this._tableEle);
-	}
-
-	private Element createDefaultElement(boolean createTH) {
-		Document doc = this._tableEle.getOwnerDocument();
-		Element td = null;
-		if (createTH) {
-			td = doc.createElement(IHTMLConstants.TAG_TH);
-		} else {
-			td = doc.createElement(IHTMLConstants.TAG_TD);
-		}
-
-		Node node = doc.createTextNode(
-				CommandResources.getString("TableInsertColumnCommand.Text.Default")); //$NON-NLS-1$
-		td.appendChild(node);
-		return td;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/html/TableInsertHeaderFooterCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/html/TableInsertHeaderFooterCommand.java
deleted file mode 100644
index c3cc31e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/html/TableInsertHeaderFooterCommand.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.html;
-
-import java.util.List;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.commands.CommandResources;
-import org.eclipse.jst.pagedesigner.commands.DesignerCommand;
-import org.eclipse.jst.pagedesigner.dom.html.TableUtil;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TableInsertHeaderFooterCommand extends DesignerCommand {
-	private Element _table;
-
-	private Element _headerOrFooter;
-
-	private boolean _isHeader;
-
-	private TableUtil _tableUtil;
-
-	/**
-	 * @param viewer
-	 * @param table
-	 * @param isHeader
-	 */
-	public TableInsertHeaderFooterCommand(IHTMLGraphicalViewer viewer,
-			Element table, boolean isHeader) {
-		super(
-				isHeader ? CommandResources
-						.getString("TableInsertHeaderFooterCommand.Label.InsertHeader") : CommandResources.getString("TableInsertHeaderFooterCommand.Label.InsertFooter"), viewer); //$NON-NLS-1$ //$NON-NLS-2$
-		this._table = table;
-		this._isHeader = isHeader;
-		this._tableUtil = new TableUtil(this._table);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.commands.Command#canExecute()
-	 */
-	public boolean canExecute() {
-		String sectionName = this._isHeader ? IHTMLConstants.TAG_THEAD
-				: IHTMLConstants.TAG_TFOOT;
-		int rows = TableUtil.countSectionRows(this._table, sectionName);
-		if (rows > 0) {
-			return false;
-		}
-		return super.canExecute();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-	 */
-	protected void doExecute() {
-		String sectionName = this._isHeader ? IHTMLConstants.TAG_THEAD
-				: IHTMLConstants.TAG_TFOOT;
-		this._headerOrFooter = this._table.getOwnerDocument().createElement(
-				sectionName);
-		Element tr = createDefaultElement();
-		this._headerOrFooter.appendChild(tr);
-		if (this._isHeader) {
-			Node child = this._table.getFirstChild();
-			this._table.insertBefore(this._headerOrFooter, child);
-		} else {
-			int headRows = TableUtil.countSectionRows(this._table,
-					IHTMLConstants.TAG_THEAD);
-			Node refNode = null;
-			if (headRows > 0) {
-				List list = DOMUtil.getChildElementsByTagIgnoreCase(
-						this._table, IHTMLConstants.TAG_THEAD);
-				Node header = (Node) list.get(0);
-				refNode = header.getNextSibling();
-			} else {
-				refNode = this._table.getFirstChild();
-			}
-			this._table.insertBefore(this._headerOrFooter, refNode);
-		}
-		formatNode(this._headerOrFooter);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#getAfterCommandDesignerSelection()
-	 */
-	protected ISelection getAfterCommandDesignerSelection() {
-		return this.toDesignSelection(this._headerOrFooter);
-	}
-
-	private Element createDefaultElement() {
-		String key = this._isHeader ? "TableInsertHeaderFooterCommand.ColumnHeader" //$NON-NLS-1$
-				: "TableInsertHeaderFooterCommand.ColumnFooter"; //$NON-NLS-1$
-		String name = PDPlugin.getResourceString(key);
-		Document doc = this._table.getOwnerDocument();
-		Element ele = doc.createElement(IHTMLConstants.TAG_TR);
-		int columnCount = _tableUtil.getColumnCount();
-		for (int i = 0; i < columnCount; i++) {
-			Element td = null;
-			if (this._isHeader) {
-				td = doc.createElement(IHTMLConstants.TAG_TH);
-			} else {
-				td = doc.createElement(IHTMLConstants.TAG_TD);
-			}
-			Node node = doc.createTextNode(name);
-			td.appendChild(node);
-			ele.appendChild(td);
-		}
-		return ele;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/html/TableInsertRowCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/html/TableInsertRowCommand.java
deleted file mode 100644
index 813a868..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/html/TableInsertRowCommand.java
+++ /dev/null
@@ -1,169 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.html;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.commands.CommandResources;
-import org.eclipse.jst.pagedesigner.commands.DesignerCommand;
-import org.eclipse.jst.pagedesigner.dom.html.TableUtil;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TableInsertRowCommand extends DesignerCommand {
-	private Element _tableEle;
-
-	private int _rowIndex;
-
-	private boolean _isBefore;
-
-	private TableUtil _tableUtil;
-
-	/**
-	 * @param viewer
-	 * @param table
-	 * @param index
-	 * @param isBefore 
-	 */
-	public TableInsertRowCommand(IHTMLGraphicalViewer viewer, Element table,
-			int index, boolean isBefore) {
-		super(CommandResources
-				.getString("TableInsertRowCommand.Label.InsertRow"), viewer); //$NON-NLS-1$
-		this._tableEle = table;
-		this._rowIndex = index;
-		this._isBefore = isBefore;
-		this._tableUtil = new TableUtil(this._tableEle);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.commands.Command#canExecute()
-	 */
-	public boolean canExecute() {
-		if (this._rowIndex < 0 && this._rowIndex != -10) {
-			return false;
-		}
-		List list = new ArrayList();
-		TableUtil.getTrElements(this._tableEle, list);
-		// if the row neither at the beginning nor the end then count
-		if (_rowIndex > 0 && _rowIndex < list.size()) {
-			// int index = TableUtil.countRowIndexInDOMTree(this._tableEle,
-			// this._rowIndex);
-			int index = this._rowIndex;
-			Element tr = (Element) list.get(index);
-			boolean isAffectedByRowSpan = TableUtil.isAffectedByRowSpan(list,
-					tr, index);
-			if (isAffectedByRowSpan) {
-				return false;
-			}
-
-		}
-
-		return super.canExecute();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#getAfterCommandDesignerSelection()
-	 */
-	protected ISelection getAfterCommandDesignerSelection() {
-		return toDesignSelection(_tableEle);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-	 */
-	protected void doExecute() {
-		List list = new ArrayList();
-		TableUtil.getTrElements(this._tableEle, list);
-		Element insertElement = createDefaultElement();
-
-		if (this._rowIndex < list.size()) {
-			if (this._rowIndex != -10) {
-				// int index = TableUtil.countRowIndexInDOMTree(this._tableEle,
-				// this._rowIndex);
-				int index = this._rowIndex;
-				Element tr = (Element) list.get(index);
-				Element nextTr = tr;
-	
-				// int headRows = TableUtil.countSectionRows(this._tableEle,
-				// IHTMLConstants.TAG_THEAD);
-				// int footRows = TableUtil.countSectionRows(this._tableEle,
-				// IHTMLConstants.TAG_TFOOT);
-				if (!_isBefore) {
-					int parentIndex = index - 1;
-					/**
-					 * doesn't need any more,since the row index is from model now
-					 * int bodyRows = list.size() - headRows - footRows; boolean
-					 * hasBodyRow = false; boolean hasFootRow = false; if (bodyRows >
-					 * 0) { hasBodyRow = true; } if (footRows > 0) { hasFootRow =
-					 * true; } //last row in THEAD excute insert row after command
-					 * if ((this._rowIndex == headRows) && hasBodyRow && hasFootRow) {
-					 * parentIndex = index - footRows - 1; } //last row in TBODY
-					 * excute insert row after command if ((this._rowIndex ==
-					 * (list.size() - footRows)) && hasBodyRow && hasFootRow) {
-					 * parentIndex = list.size() - 1; }
-					 */
-	
-					tr = (Element) list.get(parentIndex);
-				}
-	
-				if (tr.getParentNode() == nextTr.getParentNode()) {
-					tr.getParentNode().insertBefore(insertElement, nextTr);
-				} else {
-					tr.getParentNode().appendChild(insertElement);
-				}
-			} else {
-				//empty table - append first row
-				_tableEle.appendChild(insertElement);
-			}
-		} else {
-			// int index = TableUtil.countRowIndexInDOMTree(this._tableEle,
-			// this._rowIndex - 1);
-			int index = this._rowIndex - 1;
-			Element tr = (Element) list.get(index);
-			tr.getParentNode().insertBefore(insertElement, null);
-		}
-		formatNode(this._tableEle);
-
-	}
-
-	private Element createDefaultElement() {
-		Document doc = this._tableEle.getOwnerDocument();
-		Element ele = doc.createElement(IHTMLConstants.TAG_TR);
-		int columnCount = _tableUtil.getColumnCount();
-		if (columnCount < 1) {
-			columnCount = 1;
-		}
-		for (int i = 0; i < columnCount; i++) {
-			Element td = doc.createElement(IHTMLConstants.TAG_TD);
-			Node node = doc.createTextNode(
-					CommandResources.getString("TableInsertColumnCommand.Text.Default")); //$NON-NLS-1$
-			td.appendChild(node);
-			ele.appendChild(td);
-		}
-		return ele;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/html/TableResizeColumnCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/html/TableResizeColumnCommand.java
deleted file mode 100644
index d11ef19..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/html/TableResizeColumnCommand.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.html;
-
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.commands.CommandResources;
-import org.eclipse.jst.pagedesigner.commands.DesignerCommand;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.dom.DOMStyleUtil;
-import org.eclipse.jst.pagedesigner.dom.html.TableUtil;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TableResizeColumnCommand extends DesignerCommand {
-	private Element _table;
-
-	private TableUtil _tableUtil;
-
-	private int _columnIndex;
-
-	private int _delta;
-
-	/**
-	 * @param viewer
-	 * @param table
-	 * @param columnIndex
-	 * @param delta
-	 */
-	public TableResizeColumnCommand(IHTMLGraphicalViewer viewer, Element table,
-			int columnIndex, int delta) {
-		super(
-				CommandResources
-						.getString("TableResizeColumnCommand.Label.ResizeColumn"), viewer); //$NON-NLS-1$
-		this._table = table;
-		this._columnIndex = columnIndex;
-		this._delta = delta;
-		_tableUtil = new TableUtil(this._table);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#getAfterCommandDesignerSelection()
-	 */
-	protected ISelection getAfterCommandDesignerSelection() {
-		return toDesignSelection(_table);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-	 */
-	protected void doExecute() {
-		int index = this._columnIndex - 1;
-		if (index < 0) {
-			index = 0;
-		}
-		List list = _tableUtil.getColumnCells(index);
-		Iterator itr = list.iterator();
-		Element cell = null;
-		while (itr.hasNext()) {
-			Element ele = (Element) itr.next();
-			if (ele.getTagName().equalsIgnoreCase("fake") || DOMUtil.getIntAttributeIgnoreCase(ele, IHTMLConstants.ATTR_COLSPAN, 1) > 1) //$NON-NLS-1$
-			{
-				continue;
-			}
-			cell = ele;
-			break;
-		}
-
-		IFigure cellFigure = getFigureInfo(cell);
-		int oldColumnWidth = cellFigure.getBounds().width;
-		int cellPadding = cellFigure.getInsets().getWidth();
-		int newWidth = oldColumnWidth + this._delta - cellPadding;
-		if (this._columnIndex - 1 < 0) {
-			newWidth = oldColumnWidth - this._delta - cellPadding;
-		}
-		Map map = new HashMap();
-		if (newWidth > 0) {
-			map.put(ICSSPropertyID.ATTR_WIDTH, newWidth + "px"); //$NON-NLS-1$
-			DOMStyleUtil.insertStyle(cell, map);
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/html/TableResizeRowCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/html/TableResizeRowCommand.java
deleted file mode 100644
index 5330368..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/html/TableResizeRowCommand.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.html;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.pagedesigner.commands.CommandResources;
-import org.eclipse.jst.pagedesigner.commands.DesignerCommand;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.dom.DOMStyleUtil;
-import org.eclipse.jst.pagedesigner.dom.html.TableUtil;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TableResizeRowCommand extends DesignerCommand {
-	private Element _table;
-
-	private int _rowIndex;
-
-	private int _delta;
-
-	/**
-	 * @param viewer
-	 * @param table
-	 * @param rowIndex
-	 * @param delta
-	 */
-	public TableResizeRowCommand(IHTMLGraphicalViewer viewer, Element table,
-			int rowIndex, int delta) {
-		super(CommandResources
-				.getString("TableResizeRowCommand.Label.ResizeColumn"), viewer); //$NON-NLS-1$
-		this._table = table;
-		this._rowIndex = rowIndex;
-		this._delta = delta;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#getAfterCommandDesignerSelection()
-	 */
-	protected ISelection getAfterCommandDesignerSelection() {
-		return toDesignSelection(this._table);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-	 */
-	protected void doExecute() {
-		int index = this._rowIndex - 1;
-		if (index < 0) {
-			index = 0;
-		}
-		// int domIndex = TableUtil.countRowIndexInDOMTree(this._table, index);
-		int domIndex = index;
-
-		List list = new ArrayList();
-		TableUtil.getTrElements(this._table, list);
-		Element tr = (Element) list.get(domIndex);
-
-		IFigure cellFigure = getFigureInfo(tr);
-		int oldRowHeight = cellFigure.getBounds().height;
-		int cellPadding = cellFigure.getInsets().getHeight();
-		int newHeight = oldRowHeight + this._delta - cellPadding;
-		if (this._rowIndex - 1 < 0) {
-			newHeight = oldRowHeight - this._delta - cellPadding;
-		}
-		Map map = new HashMap();
-		if (newHeight > 0) {
-			map.put(ICSSPropertyID.ATTR_HEIGHT, newHeight + "px"); //$NON-NLS-1$
-			DOMStyleUtil.insertStyle(tr, map);
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/nav/CaretPositionTracker.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/nav/CaretPositionTracker.java
deleted file mode 100644
index 7295210..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/nav/CaretPositionTracker.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.nav;
-
-/**
- * @author mengbo
- */
-public interface CaretPositionTracker {
-	/**
-	 * @return Returns the xoffset.
-	 */
-	public int getXoffset();
-
-	/**
-	 * @param xoffset
-	 *            The xoffset to set.
-	 */
-	public void setXoffset(int xoffset);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/nav/HorizontalMoveCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/nav/HorizontalMoveCommand.java
deleted file mode 100644
index 101463a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/nav/HorizontalMoveCommand.java
+++ /dev/null
@@ -1,147 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.nav;
-
-import java.util.List;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.dom.EditHelper;
-import org.eclipse.jst.pagedesigner.parts.SubNodeEditPart;
-import org.eclipse.jst.pagedesigner.parts.TextEditPart;
-import org.eclipse.jst.pagedesigner.validation.caret.ActionData;
-import org.eclipse.jst.pagedesigner.validation.caret.IMovementMediator;
-import org.eclipse.jst.pagedesigner.validation.caret.InlineEditingNavigationMediator;
-import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-import org.eclipse.jst.pagedesigner.viewer.DesignRefPosition;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-
-/**
- * @author mengbo
- */
-public class HorizontalMoveCommand extends Command implements
-		ICaretPositionMover {
-	private static Logger _log = PDPlugin
-			.getLogger(HorizontalMoveCommand.class);
-
-	IHTMLGraphicalViewer _viewer;
-
-	boolean _forward;
-
-	boolean _onlyMoveEnd;
-
-	/**
-	 * @param viewer
-	 * @param b
-	 * @param c
-	 */
-	public HorizontalMoveCommand(IHTMLGraphicalViewer viewer, boolean b,
-			boolean c) {
-		_viewer = viewer;
-		_forward = b;
-		_onlyMoveEnd = c;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.commands.Command#execute()
-	 */
-	public void execute() {
-		DesignPosition position = null;
-		if (_viewer.isInRangeMode()) {
-			if (_viewer.getRangeSelection() != null
-					&& _viewer.getRangeSelection().isValid()) {
-				position = _viewer.getRangeSelection().getEndPosition();
-				position = performInlineMode(_forward);
-			}
-		} else {
-			position = performObjectMode();
-		}
-		setRange(position);
-	}
-
-	private DesignPosition performObjectMode() {
-		DesignPosition result = null;
-		IMovementMediator validator = new InlineEditingNavigationMediator(
-				new ActionData(ActionData.KEYBOARD_NAVAGATION, null));
-		DesignPosition position = getCurrentObjectPosition();
-		if (position != null) {
-			_viewer.setRange(position, position);
-			if (!validator.isValidPosition(position)) {
-				position = performInlineMode(_forward);
-				if (validator.isValidPosition(position)) {
-					result = position;
-				} else {
-					result = performInlineMode(!_forward);
-				}
-			} else {
-				result = position;
-			}
-		}
-		return result;
-	}
-
-	private DesignPosition performInlineMode(boolean forward) {
-		DesignRange range = _viewer.getRangeSelection();
-
-		if (range == null || !range.isValid()) {
-			_log.error("invalid range"); //$NON-NLS-1$
-			return null;
-		}
-
-		DesignPosition position = range.getEndPosition();
-		if (position.getContainerPart() instanceof TextEditPart) {
-			int length = ((TextEditPart) position.getContainerPart())
-					.getTextData().length();
-			int newoffset = position.getOffset() + (_forward ? 1 : -1);
-			if (newoffset >= 0 && newoffset <= length) {
-				DesignPosition newposi = new DesignPosition(position
-						.getContainerPart(), newoffset);
-				return newposi;
-			}
-		}
-		DesignPosition newpos = EditHelper.moveToNextEditPosition(
-				ActionData.KEYBOARD_NAVAGATION, position, forward);
-		return newpos;
-	}
-
-	private void setRange(DesignPosition newpos) {
-		if (_onlyMoveEnd) {
-			_viewer.setRangeEndPosition(newpos);
-		} else {
-			_viewer.setRange(newpos, newpos);
-		}
-	}
-
-	private DesignPosition getCurrentObjectPosition() {
-		DesignRange result = null;
-		if (_viewer.isInRangeMode()) {
-			result = _viewer.getRangeSelection();
-		} else {
-			List parts = _viewer.getSelectedEditParts();
-			if (parts.size() > 0) {
-				EditPart selection = (EditPart) parts.get(0);
-				if (selection instanceof SubNodeEditPart) {
-					DesignPosition position = new DesignRefPosition(selection,
-							_forward);
-					result = new DesignRange(position, position);
-				}
-			}
-		}
-		return result != null && result.isValid() ? result.getEndPosition()
-				: null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/nav/ICaretPositionMover.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/nav/ICaretPositionMover.java
deleted file mode 100644
index ca75659..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/nav/ICaretPositionMover.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.nav;
-
-/**
- * Tags commands that care about caret position
- * TODO: does presently appear to have a purpose
- * 
- * @author mengbo
- * 
- */
-public interface ICaretPositionMover {
-    // empty; tagging interface
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/nav/VerticalMoveCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/nav/VerticalMoveCommand.java
deleted file mode 100644
index 3fe0dc5..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/nav/VerticalMoveCommand.java
+++ /dev/null
@@ -1,201 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.nav;
-
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.validation.caret.ActionData;
-import org.eclipse.jst.pagedesigner.validation.caret.IMovementMediator;
-import org.eclipse.jst.pagedesigner.validation.caret.InlineEditingNavigationMediator;
-import org.eclipse.jst.pagedesigner.validation.caret.Target;
-import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-import org.eclipse.jst.pagedesigner.viewer.EditPartPositionHelper;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.eclipse.swt.widgets.Caret;
-
-/**
- * @author mengbo
- */
-public class VerticalMoveCommand extends Command {
-	private static Logger _log = PDPlugin
-			.getLogger(HorizontalMoveCommand.class);
-
-	IHTMLGraphicalViewer _viewer;
-
-	boolean _up;
-
-	boolean _onlyMoveEnd;
-
-	/**
-	 * @param viewer
-	 * @param up
-	 * @param c
-	 */
-	public VerticalMoveCommand(IHTMLGraphicalViewer viewer, boolean up,
-			boolean c) {
-		_viewer = viewer;
-		_up = up;
-		_onlyMoveEnd = c;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.commands.Command#execute()
-	 */
-	public void execute() {
-		int OFFSET = 2;
-		DesignRange range = _viewer.getRangeSelection();
-		if (range == null || !range.isValid()) {
-			_log.error("invalid range"); //$NON-NLS-1$
-			return;
-		}
-		IMovementMediator moveMediator = new InlineEditingNavigationMediator(
-				new ActionData(ActionData.KEYBOARD_NAVAGATION, null));
-		DesignPosition position = range.getEndPosition();
-		Caret caret = _viewer.getCaret();
-		Point point = null;
-		DesignPosition newPos = position;
-		EditPart containerpart = null, rootpart1;
-		if (_up) {
-			point = new Point(((CaretPositionTracker) _viewer).getXoffset(),
-					caret.getBounds().y);
-		} else {
-			point = new Point(((CaretPositionTracker) _viewer).getXoffset(),
-					caret.getBounds().y + caret.getBounds().height);
-
-		}
-		rootpart1 = getRootEditablePart(position.getContainerPart(),
-				moveMediator);// position.getContainerPart();
-		if (rootpart1 == null) {
-			return;
-		}
-        
-        point = adjustLocation(rootpart1, point);
-		Rectangle bound = EditPartPositionHelper.getAbsoluteBounds(rootpart1);
-		// get current according to the point.
-		// FlowBoxLine line =
-		// getCurrentLine(moveMediator.getEditableContainer(new
-		// Target(rootpart)), point, moveMediator);
-		while (true) {
-			// try to change offset and then to search for new point.
-			if (_up) {
-				point.y -= OFFSET;
-				if (point.y <= bound.y) {
-					newPos = position;
-					break;
-				}
-			} else {
-				point.y += OFFSET;
-				if (point.y >= bound.y + bound.height) {
-					newPos = position;
-					break;
-				}
-			}
-			containerpart = ((InlineEditingNavigationMediator) moveMediator)
-					.getConstainedEditableContainer(position, point, _viewer);
-			if (containerpart != null) {
-				if (!EditModelQuery.isChild(Target.resolveNode(rootpart1),
-						Target.resolveNode(containerpart))) {
-					containerpart = rootpart1;
-				}
-				bound = EditPartPositionHelper.getAbsoluteBounds(rootpart1);
-				newPos = EditPartPositionHelper
-						.findEditPartPositionConstrained(containerpart, point,
-								moveMediator);
-			} else {
-				newPos = position;
-				break;
-			}
-			if (newPos != null) {
-				if (found(newPos, position)) {
-					break;
-				}
-			}
-		}
-		setRange(position, newPos);
-	}
-
-	private void setRange(DesignPosition position, DesignPosition newPos) {
-		if (!EditModelQuery.isSame(position, newPos)) {
-			{
-				if (_onlyMoveEnd) {
-					_viewer.setRangeEndPosition(newPos);
-				} else {
-					_viewer.setRange(newPos, newPos);
-				}
-			}
-		}
-	}
-
-	/*
-	 * We should change this, it is too tricky to do in this way.
-	 */
-	private Point adjustLocation(EditPart rootPart, Point point) {
-		Point result = point.getCopy();
-		Rectangle bounds = EditPartPositionHelper.getAbsoluteBounds(rootPart);
-		if (!bounds.contains(point)) {
-			if (bounds.getLeft().x > point.x) {
-				result.x = bounds.getLeft().x;
-			} else if (bounds.getRight().x < point.x) {
-				result.x = bounds.getRight().x;
-			}
-		}
-		return result;
-	}
-
-	private EditPart getRootEditablePart(EditPart part,
-			IMovementMediator moveMediator) {
-		EditPart rootpart = null;
-		if ((rootpart = ((InlineEditingNavigationMediator) moveMediator)
-				.getRootConstainedEditableContainer(new Target(part))) == null) {
-			rootpart = moveMediator.getEditableContainer(new Target(part));
-		}
-		return rootpart;
-	}
-
-	private boolean found(DesignPosition newPos, DesignPosition prevPos) {
-		Rectangle newRec = EditPartPositionHelper
-				.convertToAbsoluteCaretRect(newPos);
-		Rectangle prevRec = EditPartPositionHelper
-				.convertToAbsoluteCaretRect(prevPos);
-		if (_up) {
-			return getYDistance(newRec, prevRec, _up) < 0;
-		}
-        return getYDistance(newRec, prevRec, _up) > 0;
-	}
-
-	/**
-	 * Distance from rec1 to rec2 at y coordination, if top, compare top,
-	 * otherwise compare bottom.
-	 * 
-	 * @param rec1
-	 * @param rec2
-	 * @param up
-	 * @return
-	 */
-	private int getYDistance(Rectangle rec1, Rectangle rec2, boolean top) {
-		if (rec1.getCopy().intersect(rec2).height > 0) {
-			return 0;
-		}
-        if (top) {
-        	return rec1.getTop().y - rec2.getTop().y;
-        }
-        return rec1.getBottom().y - rec2.getBottom().y;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/ApplyStyleCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/ApplyStyleCommand.java
deleted file mode 100644
index 2f087a6..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/ApplyStyleCommand.java
+++ /dev/null
@@ -1,509 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.range;
-
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.commands.CommandResources;
-import org.eclipse.jst.pagedesigner.dom.DOMRange;
-import org.eclipse.jst.pagedesigner.dom.DOMRefPosition;
-import org.eclipse.jst.pagedesigner.dom.DOMUtil;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.Text;
-
-/**
- * @author mengbo
- */
-public class ApplyStyleCommand extends RangeModeCommand {
-	private String _tag;
-
-	private String _cssProperty;
-
-	private String _cssPropertyValue;
-
-	private final Element _applyingNode;
-
-	/**
-	 * @param viewer
-	 * @param tag 
-	 * @param property 
-	 * @param value 
-	 */
-	public ApplyStyleCommand(IHTMLGraphicalViewer viewer, String tag,
-			String property, String value) {
-		super(
-				CommandResources
-						.getString("ApplyStyleCommand.Label.ApplyStyle"), viewer); //$NON-NLS-1$
-		this._tag = tag;
-		this._cssProperty = property;
-		this._cssPropertyValue = value;
-		this._applyingNode = null;
-	}
-
-	/**
-	 * @param viewer
-	 * @param node
-	 * @param property
-	 * @param value
-	 */
-	public ApplyStyleCommand(IHTMLGraphicalViewer viewer, Element node,
-			String property, String value) {
-		super(
-				CommandResources
-						.getString("ApplyStyleCommand.Label.ApplyStyle"), viewer); //$NON-NLS-1$
-		this._applyingNode = node;
-	}
-
-	/**
-	 * @return the applying node (may be null)
-	 */
-	protected final Element getApplyingNode() {
-        return _applyingNode;
-    }
-
-    /*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-	 */
-	protected DOMRange doRangeExecute(DOMRange range) {
-		if (range == null || range.isEmpty()) {
-			return null;
-		}
-
-		boolean ordered = range.isOrdered();
-		IDOMPosition start = ordered ? range.getStartPosition() : range
-				.getEndPosition();
-		IDOMPosition end = ordered ? range.getEndPosition() : range
-				.getStartPosition();
-
-		Node startContainer = start.getContainerNode();
-		Node endContainer = end.getContainerNode();
-
-		Node common = DOMUtil.findCommonAncester(start.getContainerNode(), end
-				.getContainerNode());
-		if (common == null) {
-			// should not happen.
-			return null;
-		}
-
-		if (common instanceof Text) {
-			// under the same Text scope
-			range = doTextNodeStyleApply((Text) common, start.getOffset(), end
-					.getOffset());
-
-			return range;
-		}
-        
-        if (startContainer instanceof Text) {
-        	// if the start offset is 0,then skip split the Text
-        	if (start.getOffset() > 0) {
-        		startContainer = ((Text) startContainer).splitText(start
-        				.getOffset());
-        		start = new DOMRefPosition(startContainer, false);
-        	}
-        } else {
-        	startContainer = start.getNextSiblingNode();
-        }
-        if (endContainer instanceof Text) {
-        	if (end.getOffset() > 0) {
-        		endContainer = ((Text) endContainer).splitText(end
-        				.getOffset());
-        		endContainer = endContainer.getPreviousSibling();
-        	} else {
-        		endContainer = endContainer.getPreviousSibling();
-        	}
-        } else {
-        	endContainer = end.getPreviousSiblingNode();
-        }
-
-        for (Node node = startContainer; node != endContainer; node = EditModelQuery
-        		.getInstance().getNextLeafNeighbor(node)) {
-        	if (EditModelQuery.hasAncestor(node, getTag(), true)) {
-        		continue;
-        	}
-        	Element newnode = createStyleElement();
-        	node.getParentNode().insertBefore(newnode, node);
-        	newnode.appendChild(node);
-        }
-        if (!EditModelQuery.hasAncestor(endContainer, getTag(), true)) {
-        	Element newnode = createStyleElement();
-        	endContainer.getParentNode()
-        			.insertBefore(newnode, endContainer);
-        	newnode.appendChild(endContainer);
-        }
-
-		// merge the style tags
-
-		for (Node node = startContainer; node != endContainer; node = EditModelQuery
-				.getInstance().getNextLeafNeighbor(node)) {
-			Node stylenode = node;
-			while (stylenode != null
-					&& !stylenode.getNodeName().equalsIgnoreCase(getTag())) {
-				stylenode = stylenode.getParentNode();
-			}
-			if (stylenode == null) {
-				continue;
-			}
-			if (stylenode.getNextSibling() != null
-					&& stylenode.getNextSibling().getNodeName()
-							.equalsIgnoreCase(getTag())) {
-				Node sibling = stylenode.getNextSibling();
-				while (sibling.getFirstChild() != null) {
-					stylenode.appendChild(sibling.getFirstChild());
-				}
-				stylenode.getParentNode().removeChild(sibling);
-				node = startContainer;
-			}
-		}
-
-		return new DOMRange(start, end);
-
-		/*
-		 * boolean ordered = range.isOrdered(); IDOMPosition start = ordered ?
-		 * range.getStartPosition() : range.getEndPosition(); IDOMPosition end =
-		 * ordered ? range.getEndPosition() : range.getStartPosition();
-		 * 
-		 * Node common = DOMUtil.findCommonAncester(start.getContainerNode(),
-		 * end.getContainerNode()); if (common == null) { // should not happen.
-		 * return null; }
-		 * 
-		 * DOMRange result = null; if (common instanceof Text) { result =
-		 * doTextNodeStyleApply((Text) common, start.getOffset(),
-		 * end.getOffset()); } else { IDOMPosition startPosition = start;
-		 * IDOMPosition endPosition = end; Node ancester = common; DOMRange[]
-		 * leftRange = new DOMRange[1]; DOMRange[] rightRange = new DOMRange[1];
-		 * 
-		 * startPosition = partialApply(startPosition, ancester, true,
-		 * leftRange); endPosition = partialApply(endPosition, ancester, false,
-		 * rightRange); DOMRange middle = middleApply(ancester, startPosition,
-		 * endPosition);
-		 * 
-		 * IDOMPosition startref = null; if (leftRange[0] != null &&
-		 * leftRange[0].getStartPosition() != null) { startref =
-		 * leftRange[0].getStartPosition(); } else if (middle != null &&
-		 * middle.getStartPosition() != null) { startref =
-		 * middle.getStartPosition(); } else if (rightRange[0] != null &&
-		 * rightRange[0].getStartPosition() != null) { startref =
-		 * rightRange[0].getStartPosition(); }
-		 * 
-		 * IDOMPosition endref = null; if (rightRange[0] != null &&
-		 * rightRange[0].getEndPosition() != null) { endref =
-		 * rightRange[0].getEndPosition(); } else if (middle != null &&
-		 * middle.getEndPosition() != null) { endref = middle.getEndPosition(); }
-		 * else if (leftRange[0] != null && leftRange[0].getEndPosition() !=
-		 * null) { endref = leftRange[0].getEndPosition(); }
-		 * 
-		 * if (startref == null) { result = null; } else { startref = new
-		 * DOMPosition(EditModelQuery.getInstance().getNextLeafNeighbor(startref.getContainerNode()),
-		 * 0); System.out.println(startref.toString()); endref = new
-		 * DOMPosition(endref.getContainerNode(), 0); result = new
-		 * DOMRange(startref, endref); } }
-		 * 
-		 * if (result == null) { return null; }
-		 * 
-		 * if (ordered) { return result; } else { return new
-		 * DOMRange(result.getEndPosition(), result.getStartPosition()); }
-		 */
-	}
-
-    // TODO: unused code.  Dead?
-//	private DOMRange middleApply(Node ancester, IDOMPosition startPosition,
-//			IDOMPosition endPosition) {
-//		startPosition = skip(startPosition, true);
-//		if (startPosition.getNextSiblingNode() == null
-//				|| startPosition.getOffset() >= endPosition.getOffset()) {
-//			return null;
-//		} else {
-//			List needMove = new ArrayList();
-//			Node startNext = startPosition.getNextSiblingNode();
-//			Node endNext = endPosition.getNextSiblingNode();
-//			while (startNext != null && startNext != endNext) {
-//				needMove.add(startNext);
-//				startNext = startNext.getNextSibling();
-//			}
-//			Element newEle = createStyleElement();
-//			ancester.insertBefore(newEle, startPosition.getNextSiblingNode());
-//			for (int i = 0, n = needMove.size(); i < n; i++) {
-//				newEle.appendChild((Node) needMove.get(i));
-//			}
-//			return new DOMRange(new DOMRefPosition(newEle, false),
-//					new DOMRefPosition(newEle, true));
-//		}
-//	}
-
-    // TODO: unused code.  Dead?
-//	private IDOMPosition partialApply(IDOMPosition position, Node ancester,
-//			boolean forward, DOMRange[] result) {
-//		IDOMPosition startRef = null, endRef = null;
-//
-//		while (position != null && position.getContainerNode() != ancester) {
-//			Node container = position.getContainerNode();
-//			if (container instanceof Text) {
-//				// splitText will move the position up one level
-//				position = splitText(position);
-//			} else {
-//				// skip those nodes that can't have the style applied.
-//				position = skip(position, forward);
-//				Node sibling = position.getSibling(forward);
-//				if (sibling != null) {
-//					List needMove = new ArrayList();
-//					while (sibling != null) {
-//						needMove.add(sibling);
-//						sibling = forward ? sibling.getNextSibling() : sibling
-//								.getPreviousSibling();
-//					}
-//
-//					// ok, there is nodes that need the style
-//					Element newEle = createStyleElement();
-//					container.insertBefore(newEle, position
-//							.getNextSiblingNode());
-//					for (int i = 0, size = needMove.size(); i < size; i++) {
-//						newEle.appendChild((Node) needMove.get(i));
-//					}
-//					if (startRef == null) {
-//						startRef = new DOMRefPosition(newEle, !forward);
-//					}
-//					endRef = new DOMRefPosition(newEle, forward);
-//				}
-//				// move the position up one level
-//				position = new DOMRefPosition(container, forward);
-//			}
-//		}
-//		if (startRef == null) {
-//			result[0] = null;
-//		} else {
-//			result[0] = forward ? new DOMRange(startRef, endRef)
-//					: new DOMRange(endRef, startRef);
-//		}
-//		return position;
-//	}
-
-	/**
-	 * @param position
-	 * @return
-	 */
-    // TODO: dead?
-//	private IDOMPosition splitText(IDOMPosition position) {
-//		Text text = (Text) position.getContainerNode();
-//		int offset = position.getOffset();
-//		if (offset <= 0) {
-//			return new DOMRefPosition(text, false);
-//		} else if (offset >= text.getData().length()) {
-//			return new DOMRefPosition(text, true);
-//		} else {
-//			text.splitText(offset);
-//			return new DOMRefPosition(text, true);
-//		}
-//	}
-
-	/**
-	 * @param start
-	 * @param end
-	 * @param common
-	 */
-	private DOMRange doTextNodeStyleApply(Text textNode, int startOffset,
-			int endOffset) {
-		String data = textNode.getData();
-		String before = data.substring(0, startOffset);
-		String middle = data.substring(startOffset, endOffset);
-		String tail = data.substring(endOffset);
-
-		Text middleText = getModel().getDocument().createTextNode(middle);
-
-		// case 1: normal one
-		if (!isEmptyString(before) && !isEmptyString(tail)) {
-			Node parent = textNode.getParentNode();
-			parent.insertBefore(
-					getModel().getDocument().createTextNode(before), textNode);
-			Element bnode = createStyleElement();
-			bnode.appendChild(middleText);
-			parent.insertBefore(bnode, textNode);
-			textNode.setNodeValue(tail);
-		}
-
-		if (isEmptyString(before) && !isEmptyString(tail)) {
-			Node sibling = textNode.getPreviousSibling();
-			if (sibling != null
-					&& sibling.getNodeName().equalsIgnoreCase(getTag())) {
-				sibling.appendChild(middleText);
-			} else {
-				Node parent = textNode.getParentNode();
-				parent.insertBefore(getModel().getDocument().createTextNode(
-						before), textNode);
-				Element bnode = createStyleElement();
-				bnode.appendChild(middleText);
-				parent.insertBefore(bnode, textNode);
-			}
-			textNode.setNodeValue(tail);
-		}
-
-		if (!isEmptyString(before) && isEmptyString(tail)) {
-			Node sibling = textNode.getNextSibling();
-			textNode.setNodeValue(before);
-			if (sibling != null
-					&& sibling.getNodeName().equalsIgnoreCase(getTag())) {
-				sibling.insertBefore(middleText, sibling.getFirstChild());
-			} else {
-				Element bnode = createStyleElement();
-				bnode.appendChild(middleText);
-				textNode.getParentNode().insertBefore(bnode, sibling);
-			}
-		}
-
-		if (isEmptyString(before) && isEmptyString(tail)) {
-
-			Node previousSibling = textNode.getPreviousSibling();
-			Node nextSibling = textNode.getNextSibling();
-			//
-			if (getTag().equalsIgnoreCase(IHTMLConstants.TAG_P)) {
-				Element bnode = createStyleElement();
-				bnode.appendChild(middleText);
-				textNode.getParentNode().insertBefore(bnode, textNode);
-				textNode.getParentNode().removeChild(textNode);
-			}
-			//
-			else {
-				if (previousSibling != null
-						&& previousSibling.getNodeName().equalsIgnoreCase(
-								getTag()) && nextSibling != null
-						&& nextSibling.getNodeName().equalsIgnoreCase(getTag())) {
-					previousSibling.appendChild(middleText);
-					while (nextSibling.getFirstChild() != null) {
-						previousSibling
-								.appendChild(nextSibling.getFirstChild());
-					}
-					nextSibling.getParentNode().removeChild(nextSibling);
-				} else if (previousSibling != null
-						&& previousSibling.getNodeName().equalsIgnoreCase(
-								getTag())) {
-					previousSibling.appendChild(middleText);
-				} else if (nextSibling != null
-						&& nextSibling.getNodeName().equalsIgnoreCase(getTag())) {
-					nextSibling.insertBefore(middleText, nextSibling
-							.getFirstChild());
-				} else {
-					Element bnode = createStyleElement();
-					bnode.appendChild(middleText);
-					textNode.getParentNode().insertBefore(bnode, textNode);
-				}
-				textNode.getParentNode().removeChild(textNode);
-			}
-		}
-
-		return new DOMRange(new DOMRefPosition(middleText, false),
-				new DOMRefPosition(middleText, true));
-	}
-
-	private boolean isEmptyString(String str) {
-		if (str == null || str.length() == 0) {
-			return true;
-		}
-		return false;
-	}
-
-	/**
-	 * @return a style element (cached on create)
-	 */
-	protected Element createStyleElement() {
-		if (_applyingNode != null) {
-			return _applyingNode;
-		}
-        Element element = getModel().getDocument().createElement(getTag());
-        if (_cssProperty != null && _cssPropertyValue != null) {
-        	element.setAttribute(_cssProperty, _cssPropertyValue);
-        }
-        return element;
-	}
-
-	/**
-	 * @param position
-	 * @param b
-	 * @return
-	 */
-    // TODO: dead?
-//	private IDOMPosition skip(IDOMPosition position, boolean forward) {
-//		Node node = position.getSibling(forward);
-//
-//		if (node == null) {
-//			return position;
-//		}
-//		boolean canSkip = false;
-//		if (node instanceof Text) {
-//			canSkip = ((IDOMText) node).isElementContentWhitespace();
-//		} else if (node instanceof Element) {
-//			if (getTag().equalsIgnoreCase(((Element) node).getTagName())) {
-//				canSkip = true;
-//			} else {
-//				canSkip = false;
-//			}
-//		} else {
-//			canSkip = true;
-//		}
-//		if (canSkip) {
-//			return new DOMRefPosition(node, forward);
-//		} else {
-//			return position;
-//		}
-//	}
-
-	/**
-	 * @return Returns the _cssProperty.
-	 */
-	public final String getCssProperty() {
-		return _cssProperty;
-	}
-
-	/**
-	 * @param property
-	 *            The _cssProperty to set.
-	 */
-	public final void setCssProperty(String property) {
-		_cssProperty = property;
-	}
-
-	/**
-	 * @return Returns the _cssPropertyValue.
-	 */
-	public final String getCssPropertyValue() {
-		return _cssPropertyValue;
-	}
-
-	/**
-	 * @param propertyValue
-	 *            The _cssPropertyValue to set.
-	 */
-	public final void setCssPropertyValue(String propertyValue) {
-		_cssPropertyValue = propertyValue;
-	}
-
-	/**
-	 * @return Returns the _tag.
-	 */
-	public final String getTag() {
-		if (_tag != null) {
-			return _tag;
-		}
-        return _applyingNode.getNodeName();
-	}
-
-	/**
-	 * @param _tag
-	 *            The _tag to set.
-	 */
-	public final void setTag(String _tag) {
-		this._tag = _tag;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/BlockNodeFinder.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/BlockNodeFinder.java
deleted file mode 100644
index a4a3a8a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/BlockNodeFinder.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.range;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.dom.DOMPosition;
-import org.eclipse.jst.pagedesigner.dom.DOMRefPosition;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public class BlockNodeFinder {
-	private String[] _additionalTags;
-
-	private IDOMPosition _position;
-
-	/**
-	 * @param position
-	 * @param additionalTags
-	 */
-	public BlockNodeFinder(IDOMPosition position, String[] additionalTags) {
-		_position = position;
-		_additionalTags = additionalTags;
-	}
-
-	private Node findInlineSiblings(IDOMPosition position, List result,
-			boolean forward) {
-		Node container = EditModelQuery.getInstance().getSibling(position,
-				forward);
-		if (!forward) {
-			while (container != null) {
-				if (EditModelQuery.isInline(container)) {
-					result.add(container);
-				} else {
-					return container;
-				}
-				container = container.getPreviousSibling();
-			}
-		} else {
-			while (container != null) {
-				if (EditModelQuery.isInline(container)) {
-					result.add(container);
-				} else {
-					return container;
-				}
-				container = container.getNextSibling();
-			}
-		}
-		// the result will be non-zero length.
-		return null;
-	}
-
-	private Node getParagraphNodes(IDOMPosition position, List result,
-			boolean forward) {
-		Node sResult = findInlineSiblings(position, result, forward);
-		Node container = position.getContainerNode();
-		container = position.isText() ? container.getParentNode() : container;
-		while (sResult == null) {
-			// stop at block, special container and H style nodes.
-			if (EditModelQuery.isBlockNode(container)
-					|| EditModelQuery.isDocument(container)
-					|| (container.getLocalName() != null && (container
-							.getLocalName().equals(IJSFConstants.TAG_VIEW) || container
-							.getLocalName().equalsIgnoreCase(
-									IHTMLConstants.TAG_HTML))) || //
-					(_additionalTags != null
-							&& Arrays.asList(_additionalTags).contains(
-									getTagName()) && Arrays.asList(
-							_additionalTags).contains(container))) {
-				return container;
-			}
-			position = new DOMRefPosition(container, forward);
-			sResult = findInlineSiblings(position, result, forward);
-			container = container.getParentNode();
-		}
-		return sResult;
-	}
-
-	/**
-	 * Search for an area between two block nodes or within a block node, search
-	 * will stop before or under a node which has block display-type, or
-	 * particular container like "html", jsf "view", .etc, two positions (left
-	 * and right) are returned in result.
-	 * 
-	 * The searcher will search parent's directly children, if no block node is
-	 * found, then go up the node tree to search again.
-	 * 
-	 * @param position
-	 * @param result
-	 */
-	public void getParagraphNodes(IDOMPosition position, List result) {
-		List tempResult = new ArrayList();
-		Node r1 = getParagraphNodes(position, tempResult, true);
-		if (EditModelQuery.isChild(r1, position.getContainerNode())) {
-			result.add(new DOMPosition(r1, r1.getChildNodes().getLength()));
-		} else {
-			result.add(new DOMRefPosition(r1, false));
-		}
-
-		Node r2 = getParagraphNodes(position, tempResult, false);
-		if (EditModelQuery.isChild(r2, position.getContainerNode())) {
-			result.add(new DOMPosition(r2, 0));
-		} else {
-			result.add(new DOMRefPosition(r2, true));
-		}
-	}
-
-	private String getTagName() {
-		String name = _position.getContainerNode().getNodeName();
-		name = name == null ? "" : name.toLowerCase(); //$NON-NLS-1$
-		return name;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/ClipboardData.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/ClipboardData.java
deleted file mode 100644
index 8900ab4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/ClipboardData.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.range;
-
-import java.util.Vector;
-
-import org.eclipse.gef.dnd.TemplateTransfer;
-import org.eclipse.swt.dnd.Clipboard;
-import org.eclipse.swt.dnd.TextTransfer;
-import org.eclipse.swt.widgets.Control;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public class ClipboardData implements IInputSourceProvider {
-
-	private Control _control;
-
-	/**
-	 * @param control 
-	 */
-	public ClipboardData(Control control) {
-		super();
-		_control = control;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.range.IInputSourceProvider#getNodes()
-	 */
-	public Node[] getNodes() {
-		Object data = getClipboardData();
-		if (data instanceof Vector && ((Vector) data).size() > 0) {
-			return (Node[]) ((Vector) data).toArray(new Node[] {});
-		} else if (data instanceof Node[]) {
-			return (Node[]) data;
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.range.IInputSourceProvider#getStringData()
-	 */
-	public String getStringData() {
-		Object data = getClipboardData();
-		if (data instanceof String) {
-			return (String) data;
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.range.IInputSourceProvider#getCharacterData()
-	 */
-	public Character getCharacterData() {
-		return null;
-	}
-
-	/**
-	 * @return the clip board data
-	 */
-	public Object getClipboardData() {
-		Clipboard clipboard = new Clipboard(_control.getDisplay());
-
-		final Object cuted = clipboard.getContents(TemplateTransfer.getInstance());
-		if (cuted instanceof Node[] || cuted instanceof Vector) {
-			return cuted;
-		}
-        return clipboard.getContents(TextTransfer.getInstance());
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/ContentCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/ContentCommand.java
deleted file mode 100644
index 064ffd9..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/ContentCommand.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.range;
-
-import org.eclipse.jst.pagedesigner.dom.DOMPosition;
-import org.eclipse.jst.pagedesigner.dom.DOMPositionHelper;
-import org.eclipse.jst.pagedesigner.dom.DOMRange;
-import org.eclipse.jst.pagedesigner.dom.DOMRefPosition;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Text;
-
-/**
- * This command can used to handle things like "paste". Or keyboard printable
- * ascii key. Note: ENTER key is not handled here.
- * 
- * @author mengbo
- */
-// FIXME: \r \n in the content string is not handled.
-public class ContentCommand extends RangeModeCommand {
-
-	private String _content;
-
-	/**
-	 * @param viewer
-	 * @param content 
-	 */
-	public ContentCommand(IHTMLGraphicalViewer viewer, String content) {
-		super("", viewer); //$NON-NLS-1$
-		_content = content;
-	}
-
-	/**
-	 * @param viewer
-	 * @param c
-	 */
-	public ContentCommand(IHTMLGraphicalViewer viewer, char c) {
-		super("", viewer); //$NON-NLS-1$
-		_content = String.valueOf(c);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-	 */
-	protected DOMRange doRangeExecute(DOMRange range) {
-		if (range == null)
-			return null;
-
-		IDOMPosition position = DOMPositionHelper.removeRange(range);
-		position = doContent(position);
-		return new DOMRange(position, position);
-
-	}
-
-	/**
-	 * @param position
-	 * @return ??
-	 */
-	protected IDOMPosition doContent(IDOMPosition position) {
-		position = DOMPositionHelper.mergeIntoText(position);
-
-		if (position.getContainerNode() instanceof Text) {
-			Text text = (Text) position.getContainerNode();
-			String data = text.getData();
-			int offset = position.getOffset();
-			String newData = data.substring(0, offset) + _content
-					+ data.substring(offset);
-			text.setData(newData);
-			return new DOMPosition(text, offset + _content.length());
-		}
-        // we need to create a text node.
-        Text text = getDocument().createTextNode(_content);
-        position.getContainerNode().insertBefore(text,
-        		position.getNextSiblingNode());
-        return new DOMRefPosition(text, true);
-	}
-
-	// protected DesignPosition doContent()
-	// {
-	// // DesignPosition position = removeRange();
-	// DesignPosition position = this.getSelectionRange().getEndPosition();
-	// if ('\r' == _content || '\n' == _content)
-	// {
-	// Element br = getModel().getDocument().createElement("BR");
-	// Node node = RangeUtil.insertElement(position, br);
-	//
-	// // we need set the new range to the node.
-	// // FIXME: temp code, need to reconsider how to do refresh, when those
-	// editpart
-	// // are recreated.
-	// IDOMNode parent = (IDOMNode) node.getParentNode();
-	// EditPart parentPart = (EditPart) parent.getAdapterFor(EditPart.class);
-	// List childParts = parentPart.getChildren();
-	// for (int i=0; i<childParts.size(); i++)
-	// {
-	// if (node == ((EditPart)childParts.get(i)).getModel())
-	// {
-	// return new DesignPosition(parentPart, i+1);
-	// }
-	// }
-	// return new DesignPosition(parentPart, childParts.size());
-	// }
-	// else
-	// {
-	// TextPosition textPosition = RangeUtil.insertText(position,
-	// String.valueOf(_content));
-	// IDOMText text = textPosition.getTextNode();
-	// EditPart part = (EditPart) text.getAdapterFor(EditPart.class);
-	// return new DesignPosition(part, textPosition.getOffset());
-	// }
-	// }
-	//
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/CopyCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/CopyCommand.java
deleted file mode 100644
index 594cf62..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/CopyCommand.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.range;
-
-import org.eclipse.jst.pagedesigner.commands.CommandResources;
-import org.eclipse.jst.pagedesigner.dom.DOMRange;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-
-/**
- * @author mengbo
- */
-public class CopyCommand extends RangeModeCommand {
-
-	/**
-	 * @param viewer
-	 */
-	public CopyCommand(IHTMLGraphicalViewer viewer) {
-		super(CommandResources.getString("CopyCommand.Label.Copy"), viewer); //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.range.RangeModeCommand#doRangeExecute(org.eclipse.jst.pagedesigner.dom.DOMRange)
-	 */
-	protected DOMRange doRangeExecute(DOMRange selection) {
-		DesignEdit edit = new CopyEdit(selection, getViewer());
-		edit.operate();
-		return selection;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/CopyEdit.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/CopyEdit.java
deleted file mode 100644
index 93d3efe..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/CopyEdit.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.range;
-
-import java.util.Stack;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.gef.GraphicalViewer;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.dom.DOMRange;
-import org.eclipse.jst.pagedesigner.dom.EditHelper;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.w3c.dom.DOMException;
-import org.w3c.dom.Node;
-import org.w3c.dom.Text;
-
-/**
- * @author mengbo
- */
-public class CopyEdit extends DesignEdit {
-	private static Logger _log = PDPlugin.getLogger(CopyEdit.class);
-
-	private Stack result = new Stack();
-
-	/**
-	 * @param range
-	 * @param viewer
-	 */
-	public CopyEdit(DOMRange range, GraphicalViewer viewer) {
-		super(range, viewer);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.range.DesignEdit#operate()
-	 */
-	protected boolean operate() {
-		WorkNode root = getRootWorkNode();
-		Node rootNode = root.getNode();
-		result = getProcessedResult();
-		collectOtherStyles(rootNode, result);
-		setClipboard(result);
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.range.DesignEdit#processContainer(org.eclipse.jst.pagedesigner.commands.range.WorkNode)
-	 */
-	protected Node processContainer(WorkNode node) {
-		return node.getNode().cloneNode(false);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.range.AbstractCopyEdit#processNode(org.w3c.dom.Node,
-	 *      int[], java.util.Stack)
-	 */
-	protected Node processNode(WorkNode node) {
-		int pos[] = node.getPosOffsets();
-		// the text could be tranparent, or 0 length.
-		Assert.isTrue(pos[0] <= pos[1]);
-		if (pos[0] == pos[1]) {
-			return null;
-		}
-		return node.getNode().cloneNode(true);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.range.AbstractCopyEdit#processText(org.w3c.dom.Text,
-	 *      int[], java.util.Stack)
-	 */
-	protected Text processText(WorkNode node) {
-		Text currentNode = (Text) node.getNode();
-		int left = EditModelQuery.getNodeStartIndex(currentNode);
-		int right = EditModelQuery.getNodeEndIndex(currentNode);
-		int location1 = EditHelper.getInstance().getLocation(currentNode,
-				node.getPosOffsets()[0], true);
-		int location2 = EditHelper.getInstance().getLocation(currentNode,
-				node.getPosOffsets()[1], true);
-		int start = 0;
-		int end = right - left;
-		// left index
-		if (location1 > EditHelper.IN_MIDDLE
-				|| location2 < EditHelper.IN_MIDDLE) {
-			return null;
-		}
-		if (location1 <= EditHelper.IN_MIDDLE) {
-			start = node.getQualifiedOffsets()[0];
-		}
-		if (location2 >= EditHelper.IN_MIDDLE) {
-			end = node.getQualifiedOffsets()[1];
-		}
-		if (start == end) {
-			return null;
-		}
-        
-        try {
-        	String text = currentNode.getData().substring(start, end);
-        	return EditModelQuery.getDocumentNode(currentNode)
-        			.createTextNode(text);
-        } catch (DOMException e) {
-            // TODO: changed this from catching Exception
-            // DOMException is the only exception that 
-            // anything in the try is threatening to throw
-            // and even that is Runtime
-        	_log.error("Exception", e); //$NON-NLS-1$
-        	return null;
-        }
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/CutCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/CutCommand.java
deleted file mode 100644
index 985967b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/CutCommand.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.range;
-
-import org.eclipse.jst.pagedesigner.commands.CommandResources;
-import org.eclipse.jst.pagedesigner.dom.DOMRange;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-
-/**
- * @author mengbo
- */
-public class CutCommand extends RangeModeCommand {
-	/**
-	 * @param viewer
-	 */
-	public CutCommand(IHTMLGraphicalViewer viewer) {
-		super(CommandResources.getString("CutCommand.Label.Cut"), viewer); //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.range.RangeModeCommand#doRangeExecute(org.eclipse.jst.pagedesigner.dom.DOMRange)
-	 */
-	protected DOMRange doRangeExecute(DOMRange selection) {
-		DesignEdit edit = new CutEdit(selection, getViewer());
-		if (EditModelQuery.isSame(selection)) {
-			return null;
-		}
-        if (edit.perform()) {
-        	return new DOMRange(edit.getOperationPosition(), edit
-        			.getOperationPosition());
-        }
-        return selection;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/CutEdit.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/CutEdit.java
deleted file mode 100644
index c0a8104..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/CutEdit.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.range;
-
-import java.util.Stack;
-
-import org.eclipse.gef.GraphicalViewer;
-import org.eclipse.jst.pagedesigner.dom.DOMRange;
-
-/**
- * @author mengbo
- */
-public class CutEdit extends DeleteEdit {
-	/**
-	 * @param range
-	 * @param viewer 
-	 */
-	public CutEdit(DOMRange range, GraphicalViewer viewer) {
-		super(range, viewer);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.range.DesignEdit#operate()
-	 */
-	protected boolean operate() {
-		Stack result = deleteRange();
-		setClipboard(result);
-		return true;
-	}
-
-	/*
-	 * private Text cutText(Text text, int start, int end) {
-	 * EditValidateUtil.validStringIndexOffset(text, start, end - start); String
-	 * content = text.substringData(start, end - start); if (content == null ||
-	 * content.length() == 0) { return null; } text.deleteData(start, end -
-	 * start); return _document.createTextNode(content); }
-	 */
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/DeleteCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/DeleteCommand.java
deleted file mode 100644
index 26ea1d9..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/DeleteCommand.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.range;
-
-import org.eclipse.jst.pagedesigner.commands.CommandResources;
-import org.eclipse.jst.pagedesigner.commands.nav.ICaretPositionMover;
-import org.eclipse.jst.pagedesigner.dom.DOMRange;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-
-/**
- * @author mengbo
- */
-public class DeleteCommand extends RangeModeCommand implements
-		ICaretPositionMover {
-	private boolean _forward;
-
-	/**
-	 * @param forward
-	 * @param viewer
-	 */
-	public DeleteCommand(boolean forward, IHTMLGraphicalViewer viewer) {
-		super(CommandResources.getString("DeleteCommand.Label.Delete"), viewer); //$NON-NLS-1$
-		_forward = forward;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-	 */
-	protected DOMRange doRangeExecute(DOMRange selection) {
-		if (selection == null) {
-			return null;
-		}
-
-		DesignEdit edit = new DeleteEdit(selection, getViewer(), _forward);
-		Listener listener = new Listener() {
-			public void handleEvent(Event event) {
-				event.type = SWT.NONE;
-			}
-		};
-		getViewer().getControl().getDisplay()
-				.addFilter(SWT.Selection, listener);
-		boolean status = edit.perform();
-		getViewer().getControl().getDisplay().removeFilter(SWT.Selection,
-				listener);
-		if (status) {
-			return new DOMRange(edit.getOperationPosition(), edit
-					.getOperationPosition());
-		}
-        return selection;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/DeleteEdit.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/DeleteEdit.java
deleted file mode 100644
index 805e23c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/DeleteEdit.java
+++ /dev/null
@@ -1,291 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.range;
-
-import java.util.Stack;
-import java.util.Vector;
-
-import org.eclipse.gef.GraphicalViewer;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.dom.DOMPosition;
-import org.eclipse.jst.pagedesigner.dom.DOMPositionHelper;
-import org.eclipse.jst.pagedesigner.dom.DOMRange;
-import org.eclipse.jst.pagedesigner.dom.DOMRefPosition;
-import org.eclipse.jst.pagedesigner.dom.EditHelper;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.validation.caret.ActionData;
-import org.eclipse.jst.pagedesigner.validation.caret.IETablePositionRule;
-import org.eclipse.jst.pagedesigner.validation.caret.InlineEditingNavigationMediator;
-import org.eclipse.jst.pagedesigner.viewer.LayoutPart;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.w3c.dom.Text;
-
-/**
- * @author mengbo
- */
-public class DeleteEdit extends DesignEdit {
-	private static final Logger _log = PDPlugin.getLogger(DeleteEdit.class);
-
-	private static final boolean INNER_DEBUG = false;
-
-	private boolean _forward;
-
-	Vector deleted = new Vector();
-
-	/**
-	 * @param range
-	 * @param viewer
-	 * @param forward 
-	 */
-	public DeleteEdit(DOMRange range, GraphicalViewer viewer, boolean forward) {
-		super(range, viewer);
-		_forward = forward;
-	}
-
-	/**
-	 * @param range
-	 * @param viewer
-	 */
-	public DeleteEdit(DOMRange range, GraphicalViewer viewer) {
-		super(range, viewer);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.range.DesignEdit#operate()
-	 */
-	protected boolean operate() {
-		try {
-			boolean result = true;
-			if (EditModelQuery.isSame(getRange())) {
-				deleteSingle();
-			} else {
-				deleteRange();
-			}
-			return result;
-		} catch (Exception e) {
-			_log.error("Exception", e); //$NON-NLS-1$
-			return false;
-		}
-	}
-
-	/**
-	 * Delete one node or char at operation position.
-	 */
-	private void deleteSingle() {
-		IDOMPosition opPosition = getOperationPosition();
-		opPosition = EditHelper.moveToNextEditPosition(getOperationPosition(),
-				_forward, new InlineEditingNavigationMediator(new ActionData(
-						ActionData.INLINE_EDIT, null)));
-		// for inner debug
-		if (INNER_DEBUG) {
-			_log.info("EditHelper, now we are at:" + opPosition); //$NON-NLS-1$
-		}
-		if (EditModelQuery.isSame(opPosition, getOperationPosition())) {
-			return;
-		}
-        setRange(new DOMRange(opPosition, getOperationPosition()));
-        deleteRange();
-	}
-
-	/**
-	 * @return the stack
-	 */
-	protected Stack deleteRange() {
-		WorkNode root = getRootWorkNode();
-		Node rootNode = root.getNode();
-		Stack result = getProcessedResult();
-		collectOtherStyles(rootNode, result);
-		return result;
-	}
-
-	private boolean isTableComponents(WorkNode node) {
-		String name = node.getNode().getNodeName();
-		return (IHTMLConstants.TAG_TD.equalsIgnoreCase(name) || //
-				IHTMLConstants.TAG_TH.equalsIgnoreCase(name) || //
-				IHTMLConstants.TAG_TR.equalsIgnoreCase(name) || // 
-				IHTMLConstants.TAG_THEAD.equalsIgnoreCase(name) || //
-				IHTMLConstants.TAG_TBODY.equalsIgnoreCase(name) || //
-		IHTMLConstants.TAG_TFOOT.equalsIgnoreCase(name));
-	}
-
-	private Node processContainerTable(WorkNode node) {
-		Node result = null;
-		if ((isTableComponents(node) || IHTMLConstants.TAG_TABLE
-				.equalsIgnoreCase(node.getNode().getNodeName())) //
-				&& new IETablePositionRule(null).isInValidTable(node
-						.getNode())) {
-			result = node.getNode().cloneNode(false);
-		}
-		return result;
-	}
-
-	private Node processContainerStyleNodes(WorkNode node) {
-		String name = node.getNode().getNodeName();
-		Node result = null;
-		if (IHTMLConstants.TAG_LI.equalsIgnoreCase(name) || // 
-				EditModelQuery.HTML_STYLE_NODES.contains(node.getNode()
-						.getLocalName())) {
-			if (node.getNode().hasChildNodes()) {
-				result = node.getNode().cloneNode(false);
-			}
-		}
-		return result;
-	}
-
-	private Node processContainerView(WorkNode node) {
-		Node result = null;
-		if (IJSFConstants.TAG_VIEW.equalsIgnoreCase(node.getNode()
-				.getLocalName())) {
-			result = EditModelQuery.getDocumentNode(node.getNode())
-					.createElement(IJSFConstants.TAG_SUBVIEW);
-			result.setPrefix(node.getNode().getPrefix());
-		} else if (IHTMLConstants.TAG_BODY.equalsIgnoreCase(node.getNode()
-				.getNodeName())
-				|| IHTMLConstants.TAG_HTML.equalsIgnoreCase(node.getNode()
-						.getNodeName())) {
-			result = EditModelQuery.getDocumentNode(node.getNode())
-					.createElement(node.getNode().getNodeName());
-		}
-		return result;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.range.AbstractCopyEdit#processContainer(org.eclipse.jst.pagedesigner.commands.range.WorkNode)
-	 */
-	protected Node processContainer(WorkNode node) {
-		Node result = processContainerView(node);
-		if (result == null) {
-			result = processContainerTable(node);
-		}
-		if (result == null) {
-			result = processContainerStyleNodes(node);
-		}
-		if (result == null) {
-			// strip out container
-			if (LayoutPart.getConcreteNode(node.getNode()) != null) {
-				Node parent = node.getNode().getParentNode();
-				Node refNode = node.getNode();
-				Node child = node.getNode().getFirstChild();
-				Node first = null, last = null;
-				int index = 0;
-				NodeList children = node.getNode().getChildNodes();
-				int size = children.getLength();
-				while (child != null) {
-					Node next = child.getNextSibling();
-					Node n = EditHelper.deleteNode(child);
-					parent.insertBefore(n, refNode);
-					if (index == 0) {
-						if (refNode != null) {
-							first = refNode.getPreviousSibling();
-						} else {
-							first = parent.getLastChild();
-						}
-					}
-					if (index == size - 1) {
-						if (refNode != null) {
-							last = refNode.getPreviousSibling();
-						} else {
-							last = parent.getLastChild();
-						}
-					}
-					index++;
-					child = next;
-				}
-				if (node.getPosOffsets()[0] <= 0) {
-					setOperationPosition(new DOMRefPosition(first, false));
-				} else {
-					setOperationPosition(new DOMRefPosition(last, true));
-				}
-			} else {
-				setOperationPosition(new DOMRefPosition(node.getNode(), false));
-			}
-			result = EditHelper.deleteNode(node.getNode());
-		}
-		return result;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.range.AbstractCopyEdit#processNode(org.w3c.dom.Node,
-	 *      int[])
-	 */
-	protected Node processNode(WorkNode node) {
-		Node result = null;
-		if (!isTableComponents(node)
-				|| !new IETablePositionRule(null).isInValidTable(node
-						.getNode())) {
-			// it's not table components.
-			setOperationPosition(new DOMRefPosition(node.getNode(), false));
-			result = EditHelper.deleteNode(node.getNode());
-		}
-		return result;
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.range.AbstractCopyEdit#processText(org.w3c.dom.Text,
-	 *      int[])
-	 */
-	protected Text processText(WorkNode node) {
-		Text currentNode = (Text) node.getNode();
-		int[] offsets = node.getPosOffsets();
-		Node second = null;
-		int location1 = EditHelper.getInstance().getLocation(currentNode,
-				node.getPosOffsets()[0], true);
-		int location2 = EditHelper.getInstance().getLocation(currentNode,
-				node.getPosOffsets()[1], true);
-		// left index
-		if (currentNode.getData().length() > 0) {
-			if (location1 == EditHelper.IN_MIDDLE) {
-				IDOMPosition position = new DOMPosition(currentNode, node
-						.getPosOffsets()[0]);
-				setOperationPosition(position);
-				position = DOMPositionHelper.splitText(position);
-				Node nnode = position.getNextSiblingNode();
-				if (nnode instanceof Text) {
-					currentNode = (Text) nnode;
-					offsets[1] -= offsets[0] > 0 ? offsets[0] : 0;
-				}
-			} else {
-				// setOperationPosition(new DOMRefPosition(currentNode, false));
-				if (currentNode.getPreviousSibling() != null) {
-					setOperationPosition(new DOMRefPosition(currentNode
-							.getPreviousSibling(), true));
-				} else {
-					setOperationPosition(new DOMPosition(currentNode
-							.getParentNode(), 0));
-				}
-			}
-			// right index
-			if (location2 >= EditHelper.IN_MIDDLE) {
-				IDOMPosition position = new DOMPosition(currentNode, offsets[1]);
-				position = DOMPositionHelper.splitText(position);
-				second = position.getPreviousSiblingNode();
-			}
-			return second != null ? (Text) EditHelper.deleteNode(second) : null;
-		}
-        setOperationPosition(new DOMRefPosition(currentNode, false));
-        return (Text) EditHelper.deleteNode(currentNode);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/DesignEdit.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/DesignEdit.java
deleted file mode 100644
index d60faf4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/DesignEdit.java
+++ /dev/null
@@ -1,480 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.range;
-
-import java.util.Stack;
-import java.util.Vector;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.gef.GraphicalViewer;
-import org.eclipse.gef.dnd.TemplateTransfer;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.css2.CSSUtil;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.dom.DOMRange;
-import org.eclipse.jst.pagedesigner.dom.EditHelper;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.dom.EditValidateUtil;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.eclipse.swt.dnd.Clipboard;
-import org.eclipse.swt.dnd.TextTransfer;
-import org.eclipse.swt.dnd.Transfer;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.Text;
-
-/**
- * @author mengbo
- */
-public abstract class DesignEdit {
-
-    private Stack _selections;
-
-	private DOMRange _range;
-
-	private GraphicalViewer _viewer;
-
-	private IDOMPosition _operationPosition;
-
-	private final Document _document;
-
-	private Stack _processedResult;
-
-	/**
-	 * @param range
-	 * @param viewer
-	 */
-	public DesignEdit(DOMRange range, GraphicalViewer viewer) {
-		setRange(range);
-		_viewer = viewer;
-		_operationPosition = getRange().getStartPosition();
-		_document = ((IDOMNode) _operationPosition.getContainerNode())
-				.getModel().getDocument();
-	}
-
-	
-	/**
-	 * @return the target document
-	 */
-	protected final Document getDocument() {
-        return _document;
-    }
-
-    /**
-     * @return the result
-     */
-    protected abstract boolean operate();
-
-	/**
-	 * @param node
-	 * @return the text
-	 */
-	protected abstract Text processText(WorkNode node);
-
-	/**
-	 * @param node
-	 * @return the node 
-	 */
-	protected abstract Node processNode(WorkNode node);
-
-	/**
-	 * @param node
-	 * @return the node
-	 */
-	protected abstract Node processContainer(WorkNode node);
-
-	/**
-	 * @return the dom range
-	 */ 
-	public DOMRange getRange() {
-		return _range;
-	}
-
-	void setRange(DOMRange range) {
-		range = EditHelper.normal(range);
-		IDOMPosition start = EditHelper.ensureDOMPosition(range
-				.getStartPosition());
-		IDOMPosition end = EditHelper.ensureDOMPosition(range.getEndPosition());
-		_range = new DOMRange(start, end);
-		EditValidateUtil.validRange(range);
-	}
-
-	/**
-	 * @return the clipboard
-	 */
-	protected Clipboard getClipboard() {
-		return new Clipboard(_viewer.getControl().getDisplay());
-	}
-
-	/**
-	 * @return the position
-	 */
-	public IDOMPosition getOperationPosition() {
-		// try
-		// {
-		// Assert.isTrue(_operationPosition != null &&
-		// _operationPosition.getContainerNode() != null &&
-		// _operationPosition.getOffset() > -1);
-		// if (_operationPosition.isText())
-		// {
-		// int length = ((Text)
-		// _operationPosition.getContainerNode()).getLength();
-		// Assert.isTrue(_operationPosition.getOffset() >= 0 &&
-		// _operationPosition.getOffset() <= length);
-		// }
-		// }
-		// catch (Exception e)
-		// {
-		// // "Error", "Error in operation location move"
-		// PDPlugin.getAlerts().confirm("Alert.DesignEdit.opLocationValidTitle",
-		// "Alert.DesignEdit.opLocationValidMessage"); //$NON-NLS-1$
-		// //$NON-NLS-2$
-		// }
-
-		return _operationPosition;
-	}
-
-	/**
-	 * @param position
-	 */
-	protected void setOperationPosition(IDOMPosition position) {
-		if (!EditValidateUtil.validPosition(position)) {
-			return;
-		}
-		position = EditHelper.ensureDOMPosition(position);
-		_operationPosition = position;
-	}
-
-	/**
-	 * @return the result of performing the edit
-	 */
-	public boolean perform() {
-		boolean result = false;
-
-		result = operate();
-		return result;
-	}
-
-	/**
-	 * @return Returns the _viewer.
-	 */
-	public GraphicalViewer getViewer() {
-		return _viewer;
-	}
-
-	private Stack collectNodes() {
-		Node node;
-		Stack result = new Stack();
-		IDOMPosition start = getRange().getStartPosition(), end = getRange()
-				.getEndPosition();
-		int pos[] = new int[] { EditModelQuery.getIndexedRegionLocation(start),
-				EditModelQuery.getIndexedRegionLocation(end), };
-		if (!EditModelQuery.isSame(start, end)) {
-			Node ancestor = EditModelQuery.getInstance().getCommonAncestor(
-					start, end);
-			WorkNode rootWorkNode = new WorkNode(ancestor, pos[0], pos[1]);
-			rootWorkNode.setRoot(true);
-			result.push(rootWorkNode);
-			try {
-				// Loop all the children of the ancestor, and and the result
-				// will be collected
-				if (EditModelQuery.isText(ancestor)) {
-					Stack temp = new Stack();
-					EditHelper.getInstance().collectNodes(ancestor, pos[0],
-							pos[1], ancestor, temp);
-					WorkNode wNode = (WorkNode) temp.remove(0);
-					wNode.setParent(rootWorkNode);
-					result.push(wNode);
-				} else {
-					node = ancestor.getFirstChild();
-					Stack temp = new Stack();
-					while (node != null) {
-						EditHelper.getInstance().collectNodes(node, pos[0],
-								pos[1], ancestor, temp);
-						while (temp.size() > 0) {
-							WorkNode wNode = (WorkNode) temp.remove(0);
-							if (wNode.getNode().getParentNode() == ancestor) {
-								wNode.setParent(rootWorkNode);
-							}
-							result.push(wNode);
-						}
-						node = node.getNextSibling();
-					}
-				}
-			} catch (Exception e) {
-				result.clear();
-			}
-		}
-		return result;
-	}
-
-	/**
-	 * @return Returns the result.
-	 */
-	public Stack getSelections() {
-		if (_selections == null) {
-			_selections = collectNodes();
-		}
-		return _selections;
-	}
-
-	/**
-	 * @return the result stack
-	 */
-	public Stack getProcessedResult() {
-		if (_processedResult == null) {
-			_processedResult = new Stack();
-			WorkNode rootNode = getRootWorkNode();
-			if (rootNode != null) {
-				processNodes(rootNode, _processedResult);
-			}
-		}
-		return _processedResult;
-	}
-
-	/**
-	 * @return the root work node
-	 */
-	protected final WorkNode getRootWorkNode() {
-		WorkNode result = null;
-		if (getSelections().size() > 0) {
-			WorkNode node = (WorkNode) getSelections().get(0);
-			while (node.getParent() != null) {
-				node = node.getParent();
-			}
-			result = node;
-			Assert.isTrue(node.isRoot());
-		}
-		return result;
-	}
-
-	/**
-	 * @param node
-	 * @param result
-	 * @return true if node
-	 */
-	private final boolean processText(WorkNode node, Stack result) {
-		boolean done = false;
-		if (EditModelQuery.isText(node.getNode())) {
-			Node text = processText(node);
-			if (text != null) {
-				result.add(text);
-			}
-			getSelections().remove(node);
-			done = true;
-		}
-		return done;
-	}
-
-	/**
-	 * @param node
-	 * @param result
-	 */
-	private final void processContainer(WorkNode node, Stack result) {
-		processContainer(node);
-		getSelections().remove(node);
-	}
-
-	/**
-	 * @param node
-	 * @param result
-	 * @return true if done
-	 */
-	private final boolean processChildren(WorkNode node, Stack result) {
-		boolean done = false;
-		if (getFirstSelectedChild(node) != null) {
-			Stack myResult = new Stack();
-			{
-				WorkNode child = null;
-				while ((child = getFirstSelectedChild(node)) != null) {
-					{
-						processNodes(child, myResult);
-					}
-				}
-				Node newParent = processContainer(node);
-				newParent = toBeParent(newParent, myResult);
-				result.push(newParent);
-			}
-			getSelections().remove(node);
-			done = true;
-		}
-		return done;
-	}
-
-	/**
-	 * @param node
-	 * @param result
-	 * @return true if done
-	 */
-	private final boolean processChildren1(WorkNode node, Stack result) {
-		boolean done = false;
-		if (node.getNode().hasChildNodes()) {
-			Stack myResult = new Stack();
-			{
-				Node childNode = node.getNode().getFirstChild();
-				Node next = null;
-				while (childNode != null) {
-					next = childNode.getNextSibling();
-					int x1 = EditModelQuery.getNodeStartIndex(childNode) - 1;
-					int x2 = EditModelQuery.getNodeEndIndex(childNode) + 1;
-					processNodes(new WorkNode(childNode, x1, x2), myResult);
-					childNode = next;
-				}
-				Node newParent = processContainer(node);
-				newParent = toBeParent(newParent, myResult);
-				result.push(newParent);
-			}
-			getSelections().remove(node);
-			done = true;
-		}
-		return done;
-	}
-
-	/**
-	 * Process the nodes that are selected, the result is a collection of nodes
-	 * that either are clones or the nodes cuted.
-	 * 
-	 * @param node
-	 * @param result
-	 */
-	protected final void processNodes(WorkNode node, Stack result) {
-		WorkNode child = null;
-		if (node.isRoot()) {
-			while ((child = getFirstSelectedChild(node)) != null) {
-				processNodes(child, result);
-			}
-		} else {
-			if (node.isWholeSelected()
-					|| //
-					(!EditModelQuery.isText(node.getNode()) && EditModelQuery
-							.getInstance().isSingleRegionNode(node.getNode()))
-					|| //
-					EditModelQuery.isWidget(node.getNode())) {
-				Node temp = processNode(node);
-				if (temp != null) {
-					result.push(temp);
-					getSelections().remove(node);
-				} else {
-					if (!processText(node, result)) {
-						if (!processChildren1(node, result)) {
-							processContainer(node, result);
-						}
-					}
-				}
-			} else {
-				if (!processText(node, result)) {
-					if (!processChildren(node, result)) {
-						processContainer(node, result);
-					}
-				}
-			}
-		}
-	}
-
-	/**
-	 * @param result
-	 */
-	protected void setClipboard(Stack result) {
-		Node[] nodes = (Node[]) result.toArray(new Node[result.size()]);
-		StringBuffer sb = new StringBuffer();
-		for (int i = 0, size = nodes.length; i < size; i++) {
-			DOMUtil.nodeToString(nodes[i], sb);
-		}
-		getClipboard().setContents(
-				new Object[] { result, sb.toString() },
-				new Transfer[] { TemplateTransfer.getInstance(),
-						TextTransfer.getInstance() });
-	}
-
-	private Node toBeParent(Node parent, Stack children) {
-		while (children.size() > 0) {
-			parent.appendChild((Node) children.remove(0));
-		}
-		return parent;
-	}
-
-	private WorkNode getFirstSelectedChild(WorkNode node) {
-		for (int i = 0, n = getSelections().size(); i < n; i++) {
-			WorkNode wNode = (WorkNode) getSelections().get(i);
-			if (wNode.getParent() == node) {
-				return wNode;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * @param rootNode
-	 * @param result
-	 * @return the node
-	 */
-	Node collectStyleNodes(Node rootNode, Vector result) {
-		Element element = null;
-		if (rootNode instanceof Element) {
-			element = (Element) rootNode;
-		} else if (rootNode.getParentNode() != null) {
-			element = (Element) rootNode.getParentNode();
-		}
-		ICSSStyle style = CSSUtil.getCSSStyle(element);
-
-		Node node = EditModelQuery.getDocumentNode(rootNode).createElement(
-				"span"); //$NON-NLS-1$
-		for (int i = 0, n = result.size(); i < n; i++) {
-			node.appendChild((Node) result.elementAt(i));
-		}
-		((Element) node).setAttribute(IHTMLConstants.ATTR_STYLE, CSSUtil
-				.resolveCSSStyle(style));
-		result.removeAllElements();
-		result.add(node);
-		return node;
-	}
-
-	/**
-	 * @param rootNode
-	 * @param result 
-	 * @return the node
-	 */
-	protected final Node collectOtherStyles(Node rootNode, Vector result) {
-		Node cur = rootNode, prev = null, appendPoint = null;
-		if (EditValidateUtil.validNode(rootNode)) {
-			while (!EditModelQuery.isDocument(cur)) {
-				if (!EditValidateUtil.validNode(cur)) {
-					return null;
-				}
-				String name = cur.getNodeName() != null ? cur.getNodeName()
-						.toLowerCase() : ""; //$NON-NLS-1$
-				if (EditModelQuery.HTML_STYLE_NODES.contains(name)) {
-					if (prev != null) {
-						Node newone = cur.cloneNode(false);
-						newone.appendChild(prev);
-						prev = newone;
-					} else {
-						prev = cur.cloneNode(false);
-						appendPoint = prev;
-					}
-				}
-				cur = cur.getParentNode();
-			}
-			if (appendPoint != null) {
-				for (int i = 0, n = result.size(); i < n; i++) {
-					appendPoint.appendChild((Node) result.elementAt(i));
-				}
-				result.removeAllElements();
-				result.add(prev);
-			}
-		}
-		return prev;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/IInputSourceProvider.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/IInputSourceProvider.java
deleted file mode 100644
index 9922329..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/IInputSourceProvider.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.range;
-
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public interface IInputSourceProvider {
-	/**
-	 * @return Returns the _data.
-	 */
-	public Node[] getNodes();
-
-	/**
-	 * @return the string data
-	 */
-	public String getStringData();
-
-	/**
-	 * @return the character data
-	 */
-	public Character getCharacterData();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/InsertCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/InsertCommand.java
deleted file mode 100644
index 0723268..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/InsertCommand.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.range;
-
-import org.eclipse.jst.pagedesigner.commands.nav.ICaretPositionMover;
-import org.eclipse.jst.pagedesigner.dom.DOMRange;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-
-/**
- * @author mengbo
- */
-public class InsertCommand extends RangeModeCommand implements
-		ICaretPositionMover {
-
-	private IInputSourceProvider _data;
-
-	/**
-	 * @param label
-	 * @param viewer
-	 * @param data 
-	 */
-	public InsertCommand(String label, IHTMLGraphicalViewer viewer,
-			IInputSourceProvider data) {
-		super(label, viewer);
-		_data = data;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.range.RangeModeCommand#doRangeExecute(org.eclipse.jst.pagedesigner.dom.DOMRange)
-	 */
-	protected DOMRange doRangeExecute(DOMRange selection) {
-		DesignEdit edit = null;
-		edit = new InsertEdit(selection, getViewer(), _data);
-		edit.perform();
-		selection = new DOMRange(edit.getOperationPosition(), edit
-				.getOperationPosition());
-		return selection;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/InsertEdit.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/InsertEdit.java
deleted file mode 100644
index bcf96eb..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/InsertEdit.java
+++ /dev/null
@@ -1,196 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.range;
-
-import org.eclipse.gef.GraphicalViewer;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.dom.DOMPosition;
-import org.eclipse.jst.pagedesigner.dom.DOMPositionHelper;
-import org.eclipse.jst.pagedesigner.dom.DOMRange;
-import org.eclipse.jst.pagedesigner.dom.DOMRefPosition;
-import org.eclipse.jst.pagedesigner.dom.DOMUtil;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.jsp.core.IJSPCoreConstants;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.w3c.dom.Node;
-import org.w3c.dom.Text;
-
-/**
- * InsertEdit will perform action at a single location, the data souce could be
- * clipboard or keyboard.
- * 
- * @author mengbo
- */
-public class InsertEdit extends DeleteEdit {
-	private IInputSourceProvider _data;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.range.DesignEdit#operate()
-	 */
-	public boolean operate() {
-		DOMRange range = getRange();
-		if (!EditModelQuery.isSame(range.getStartPosition(), range
-				.getEndPosition())) {
-			deleteRange();
-			range = new DOMRange(getOperationPosition(), getOperationPosition());
-			setRange(range);
-		}
-		if (insertNodes()) {
-			return true;
-		} else if (insertString()) {
-			return true;
-		} else {
-			return insertChar();
-		}
-	}
-
-	/**
-	 * @param range
-	 * @param viewer
-	 * @param data 
-	 */
-	public InsertEdit(DOMRange range, GraphicalViewer viewer,
-			IInputSourceProvider data) {
-		super(range, viewer);
-		_data = data;
-	}
-
-	/**
-	 * @param position
-	 * @param viewer
-	 * @param data
-	 */
-	public InsertEdit(IDOMPosition position, GraphicalViewer viewer,
-			IInputSourceProvider data) {
-		super(new DOMRange(position, position), viewer);
-		setOperationPosition(position);
-		_data = data;
-	}
-
-	/**
-	 * @return ??
-	 */
-	public boolean insertChar() {
-		if (_data.getStringData() == null) {
-			return false;
-		}
-		IDOMPosition position = getOperationPosition();
-		if (position.isText()) {
-			Text text = EditModelQuery.getInstance().getText(position);
-			text.insertData(getOperationPosition().getOffset(), _data
-					.getCharacterData().toString());
-			setOperationPosition(new DOMPosition(text, position.getOffset() + 1));
-		} else {
-			Node refNode = position.getNextSiblingNode();
-			Text text = getDocument().createTextNode(_data.getCharacterData()
-					.toString());
-			position.getContainerNode().insertBefore(text, refNode);
-			setOperationPosition(new DOMPosition(text, text.getLength()));
-		}
-		return true;
-	}
-
-	/**
-	 * @return ????
-	 */
-	public boolean insertString() {
-		String content = _data.getStringData();
-		if (content != null) {
-			IDOMPosition position = getOperationPosition();
-			if (position.isText()) {
-				Text text = EditModelQuery.getInstance().getText(position);
-				text.insertData(getOperationPosition().getOffset(), content);
-				setOperationPosition(new DOMPosition(text, position.getOffset()
-						+ content.length()));
-			} else {
-				Node refNode = position.getNextSiblingNode();
-				Text text = getDocument().createTextNode(content);
-				position.getContainerNode().insertBefore(text, refNode);
-				setOperationPosition(new DOMPosition(text, text.getLength()));
-			}
-			return true;
-		}
-		return false;
-	}
-
-	private boolean insertNodes() {
-		Node[] nodes = _data.getNodes();
-		if (nodes == null) {
-			return false;
-		}
-		IDOMPosition position = getOperationPosition();
-		if (position == null) {
-			return false;
-		}
-		Node refNode = null;
-		if (position.isText()) {
-			position = DOMPositionHelper.splitText(position);
-		}
-		refNode = position.getNextSiblingNode();
-		Node parent = position.getContainerNode();
-		Node node = null;
-		for (int i = 0; i < nodes.length; i++) {
-			node = DOMUtil.cloneNodeDeep(getDocument(), nodes[i]);
-			String prefix = node.getPrefix();
-			String name = node.getLocalName();
-			if (name != null
-					&& ITLDConstants.URI_JSP.equals(prefix)
-					&& (node.getLocalName().startsWith(
-							IJSPCoreConstants.TAG_LEADING_DIRECTIVE)
-							|| IJSPCoreConstants.TAG_DECLARATION.equals(name)
-							|| IJSPCoreConstants.TAG_EXPRESSION.equals(name) || IJSPCoreConstants.TAG_SCRIPTLET
-							.equals(name))) {
-				// it is a jsp tag
-				((IDOMElement) node).setJSPTag(true);
-			}
-			node = parent.insertBefore(node, refNode);
-		}
-
-		if (node != null) {
-			setOperationPosition(new DOMRefPosition(node, true));
-		} else if (refNode != null) {
-			setOperationPosition(new DOMRefPosition(refNode, false));
-		} else {
-			setOperationPosition(new DOMRefPosition(parent.getLastChild(), true));
-		}
-		return true;
-	}
-
-    // TODO: dead?
-//	private boolean splitNode() {
-//		if ((getViewer()).getSelection() instanceof DesignRange
-//				&& _data.getCharacterData() != null
-//				&& _data.getCharacterData().charValue() == '\r') {
-//			DesignRange range = (DesignRange) (getViewer()).getSelection();
-//			Node node = range.getStartPosition().getContainerNode();
-//			if (EditModelQuery.isText(node)) {
-//				node = node.getParentNode();
-//			}
-//			if (EditModelQuery.isListItem(node)) {
-//				IDOMPosition position = DOMPositionHelper.toDOMPosition(range
-//						.getStartPosition());
-//				// split text and it's parent.
-//				position = EditHelper.splitNode(position);
-//				position = EditHelper.splitNode(position);
-//				position = EditHelper.moveInto(position.getNextSiblingNode(),
-//						new InlineEditingNavigationMediator(new ActionData(
-//								ActionData.INLINE_EDIT, null)), true);
-//				setOperationPosition(position);
-//				return true;
-//			}
-//		}
-//		return false;
-//	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/KeyboardData.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/KeyboardData.java
deleted file mode 100644
index 7f194bc..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/KeyboardData.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.range;
-
-import org.eclipse.gef.DefaultEditDomain;
-import org.eclipse.gef.EditDomain;
-import org.eclipse.gef.GraphicalViewer;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.editors.HTMLEditor;
-import org.eclipse.swt.SWT;
-import org.w3c.dom.Document;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public class KeyboardData implements IInputSourceProvider {
-	private Character _keyCode;
-
-	private int _stateMask;
-
-	private GraphicalViewer _viewer;
-
-	/**
-	 * @param code
-	 * @param mask
-	 * @param viewer
-	 */
-	public KeyboardData(char code, int mask, GraphicalViewer viewer) {
-		if ((mask & SWT.SHIFT) != 0) {
-			_keyCode = new Character(Character.toUpperCase(code));
-		} else {
-			_keyCode = new Character(code);
-		}
-		_stateMask = mask;
-		_viewer = viewer;
-	}
-
-	/**
-	 * @return Returns the keyCode.
-	 */
-	public int getKeyCode() {
-		return _keyCode.charValue();
-	}
-
-	/**
-	 * @param keyCode
-	 *            The keyCode to set.
-	 */
-	public void setKeyCode(char keyCode) {
-		this._keyCode = new Character(keyCode);
-	}
-
-	/**
-	 * @return Returns the stateMask.
-	 */
-	public int getStateMask() {
-		return _stateMask;
-	}
-
-	/**
-	 * @param stateMask
-	 *            The stateMask to set.
-	 */
-	public void setStateMask(int stateMask) {
-		this._stateMask = stateMask;
-	}
-
-	/**
-	 * @param keyCode
-	 * @return the node or null
-	 */
-	public Node getSpecialNode(KeyboardData keyCode) {
-		Object name;
-		EditDomain domain = _viewer.getEditDomain();
-		Document document = null;
-		if (domain instanceof DefaultEditDomain) {
-			document = ((HTMLEditor) (((DefaultEditDomain) domain)
-					.getEditorPart())).getDOMDocument();
-		}
-		// if ((keyCode.getStateMask() & SWT.SHIFT) != 0)
-		{
-			if ((name = EditModelQuery.CHAR_NODE_MAP.get(keyCode
-					.getCharacterData())) != null) {
-				return document.createElement((String) name);
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * @return Returns the _data.
-	 */
-	public Node[] getNodes() {
-		Node node = getSpecialNode(this);
-		if (node != null) {
-			return new Node[] { node };
-		}
-		return null;
-	}
-
-	public String getStringData() {
-		return _keyCode.toString();
-	}
-
-	// public Key
-	public Character getCharacterData() {
-		return _keyCode;
-	}
-
-	/**
-	 * @return the char value of the key code
-	 */
-	public char getChar() {
-		return _keyCode.charValue();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/Paragraph.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/Paragraph.java
deleted file mode 100644
index c3757d0..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/Paragraph.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.range;
-
-import org.eclipse.jst.pagedesigner.dom.DOMRange;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public class Paragraph {
-	private DOMRange _range;
-
-	/**
-	 * @param start
-	 * @param end
-	 */
-	public Paragraph(IDOMPosition start, IDOMPosition end) {
-		_range = new DOMRange(start, end);
-	}
-
-	/**
-	 * @return the lowest container node
-	 */
-	public Node getLowestContainer() {
-		return EditModelQuery.getInstance().getCommonAncestor(
-				_range.getStartPosition(), _range.getEndPosition());
-	}
-
-	/**
-	 * @return Returns the _end.
-	 */
-	public final IDOMPosition getStart() {
-		return _range.isOrdered() ? _range.getStartPosition() : _range
-				.getEndPosition();
-	}
-
-	/**
-	 * @return Returns the _start.
-	 */
-	public final IDOMPosition getEnd() {
-		return _range.isOrdered() ? _range.getEndPosition() : _range
-				.getStartPosition();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/ParagraphApplyStyleCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/ParagraphApplyStyleCommand.java
deleted file mode 100644
index d25f65e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/ParagraphApplyStyleCommand.java
+++ /dev/null
@@ -1,408 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.range;
-
-import java.util.Arrays;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.gef.EditPart;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.dom.DOMPosition;
-import org.eclipse.jst.pagedesigner.dom.DOMPositionHelper;
-import org.eclipse.jst.pagedesigner.dom.DOMRange;
-import org.eclipse.jst.pagedesigner.dom.DOMRefPosition;
-import org.eclipse.jst.pagedesigner.dom.DOMUtil;
-import org.eclipse.jst.pagedesigner.dom.EditHelper;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.dom.IDOMRefPosition;
-import org.eclipse.jst.pagedesigner.parts.TextEditPart;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.w3c.dom.Text;
-
-/**
- * @author mengbo
- */
-public class ParagraphApplyStyleCommand extends ApplyStyleCommand {
-
-    /**
-     * the list of possible html heading tags
-     */
-    private static final String[] HH = { "h1", "h2", "h3", "h4", "h5", "h6" }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$
-
-    /**
-	 * @param viewer
-	 * @param tag
-	 * @param property
-	 * @param value
-	 */
-	public ParagraphApplyStyleCommand(IHTMLGraphicalViewer viewer, String tag,
-			String property, String value) {
-		super(viewer, tag, property, value);
-	}
-
-	/**
-	 * @param viewer
-	 * @param node
-	 * @param property
-	 * @param value
-	 */
-	public ParagraphApplyStyleCommand(IHTMLGraphicalViewer viewer,
-			Element node, String property, String value) {
-		super(viewer, node, property, value);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.range.RangeModeCommand#doRangeExecute(org.eclipse.jst.pagedesigner.dom.DOMRange)
-	 */
-	protected DOMRange doRangeExecute(DOMRange range) {
-		if (range != null) {
-			boolean ordered = range.isOrdered();
-			IDOMPosition start = ordered ? range.getStartPosition() : range
-					.getEndPosition();
-			IDOMPosition end = ordered ? range.getEndPosition() : range
-					.getStartPosition();
-			Node common = null;
-			Node container = null;
-			if (EditModelQuery.isSame(range)) {
-				container = start.getContainerNode();
-				ParagraphFinder finder = new ParagraphFinder(start);
-				Paragraph p = finder.getParagraph(start);
-				start = p.getStart();
-				end = p.getEnd();
-				common = p.getLowestContainer();
-			} else {
-				common = EditModelQuery.getInstance().getCommonAncestor(start,
-						end);
-			}
-			DOMRange rt;
-			// This code is for h1-h6 only, it may need to be replaced.
-			if ((rt = replaceExistingH(start, end)) != null) {
-				return rt;
-			}
-			// replace existing p
-			if (getTag().equalsIgnoreCase(IHTMLConstants.TAG_P)) {
-				rt = replaceExistingP(start, end);
-				if (rt != null) {
-					return rt;
-				}
-			}
-			if (start.getContainerNode() == end.getContainerNode()) {
-				int offset1 = start.getOffset();
-				int offset2 = end.getOffset();
-				IDOMPosition old = start;
-				start = split(start);
-				// parent is splited
-				if (start != old) {
-					container = start.getNextSiblingNode();
-					offset2 -= offset1;
-					end = new DOMPosition(container, offset2);
-				}
-				end = split(end);
-			} else {
-				start = split(common, start);
-				end = split(common, end);
-			}
-			range = InsertStyleTag(new DOMRange(start, end));
-		}
-		return range;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.commands.Command#canExecute()
-	 */
-	public boolean canExecute() {
-		return true;
-	}
-
-	/*
-	 * Try to split the node so that we can avoid wrap its children directly.
-	 * Begining from 'position' the split can reach as high as the level of
-	 * 'common'.
-	 */
-	private IDOMPosition split(Node common, IDOMPosition position) {
-		Assert.isTrue(EditModelQuery.isChild(common, position
-				.getContainerNode()));
-		Node container = position.getContainerNode();
-		String[] styleNodes = new String[EditModelQuery.HTML_STYLE_NODES.size()];
-		EditModelQuery.HTML_STYLE_NODES.toArray(styleNodes);
-		while (EditModelQuery.isText(container) || (container != common && //
-				EditModelQuery.containItem(styleNodes, container, true))) {
-			IDOMPosition old = position;
-			position = EditHelper.splitNode(position);
-			if (old == position) {
-				int pos = EditHelper.getLocation(position);
-				switch (pos) {
-				case -1:
-					position = new DOMRefPosition(position.getContainerNode(),
-							false);
-					break;
-				case 1:
-					position = new DOMRefPosition(position.getContainerNode(),
-							true);
-				}
-			}
-			Node containerBackup = container;
-			container = container.getParentNode();
-			if (containerBackup.getNodeName().equalsIgnoreCase(
-					IHTMLConstants.TAG_P)) {
-				container.removeChild(containerBackup);
-			}
-		}
-		return position;
-	}
-
-	/*
-	 * Split the position's container node only.
-	 */
-	private IDOMPosition split(IDOMPosition position) {
-		Node container = position.getContainerNode();
-		String[] styleNodes = new String[EditModelQuery.HTML_STYLE_NODES.size()];
-		EditModelQuery.HTML_STYLE_NODES.toArray(styleNodes);
-		if (EditModelQuery.isText(container)
-				|| EditModelQuery.containItem(styleNodes, container, true)) {
-			return EditHelper.splitNode(position);
-		}
-		return position;
-	}
-
-	private DOMRange replaceExistingH(IDOMPosition start, IDOMPosition end) {
-		Node common = EditModelQuery.getInstance()
-				.getCommonAncestor(start, end);
-		// Here we insert some code to avoid creating tags duplicated. but these
-		// are not the entire cases.
-		if (Arrays.asList(HH).contains(
-				getAName(getTag()).toLowerCase())
-				&& Arrays.asList(HH).contains(
-						getAName(common.getNodeName()).toLowerCase())) {
-			// uncheck action menu
-			if (getAName(getTag()).toLowerCase().equalsIgnoreCase(
-					getAName(common.getNodeName()).toLowerCase())) {
-				NodeList nodes = common.getChildNodes();
-
-				for (int i = 0, size = nodes.getLength(); i < size; i++) {
-					common.getParentNode().insertBefore(nodes.item(i), common);
-				}
-				common.getParentNode().removeChild(common);
-				return new DOMRange(start, end);
-			}
-			start = DOMPositionHelper.toDOMRefPosition(start);
-			end = DOMPositionHelper.toDOMRefPosition(end);
-			Node newHNode = EditModelQuery.getDocumentNode(common)
-					.createElement(getTag());
-			EditModelQuery.copyChildren(common, newHNode);
-			common.getParentNode().replaceChild(newHNode, common);
-			return new DOMRange(start, end);
-		}
-		return null;
-	}
-
-	private DOMRange replaceExistingP(IDOMPosition start, IDOMPosition end) {
-		// find the selected startNode,endNode and start node's parent node
-		Node startNode = start instanceof IDOMRefPosition ? start
-				.getNextSiblingNode() : start.getContainerNode();
-		Node endNode = end instanceof IDOMRefPosition ? end
-				.getPreviousSiblingNode() : end.getContainerNode();
-		Node parentNode = startNode.getParentNode();
-
-		if (!(start.isText()) && start instanceof DOMPosition) {
-			startNode = startNode.getChildNodes().item(start.getOffset());
-			parentNode = start.getContainerNode();
-		}
-		if (!(end.isText()) && end instanceof DOMPosition) {
-			// because the offset is based on the position between nodes,so we
-			// need to reduce one from the offset
-			// in order to get the correct end node.
-			endNode = endNode.getChildNodes().item(end.getOffset() - 1);
-		}
-
-		// compute selected character number in the text or selected element
-		// number under a node
-		int len = 0;
-//		if (start instanceof DOMPosition && end instanceof DOMPosition
-//				|| start instanceof IDOMPosition && end instanceof IDOMPosition) {
-        // TODO: as written, this will be the only statement run, since
-        // both start and end are instanceof IDOMPosition by defn.
-			len = end.getOffset() - start.getOffset();
-//		} else {
-//			IDOMRefPosition startRef = null;
-//			IDOMRefPosition endRef = null;
-//			if (!(start.isText()) && start instanceof DOMPosition) {
-//				startRef = new DOMRefPosition(startNode, false);
-//			} else if (!(end.isText()) && end instanceof DOMPosition) {
-//				endRef = new DOMRefPosition(endNode, true);
-//			}
-//			len = (endRef != null ? endRef.getOffset() : end.getOffset())
-//					- (startRef != null ? startRef.getOffset() : start
-//							.getOffset());
-//		}
-
-		// if a full Text node is selected,and the Text node is the only child
-		// of its parent
-		if ((startNode == endNode) && (startNode instanceof Text)) {
-			TextEditPart part = (TextEditPart) ((INodeNotifier) startNode)
-					.getAdapterFor(EditPart.class);
-			boolean condition = false;
-			if (start instanceof IDOMRefPosition
-					|| (start instanceof DOMPosition && !start.isText())) {
-				condition = parentNode.getNodeName().equalsIgnoreCase(
-						IHTMLConstants.TAG_P)
-						&& parentNode.getChildNodes().getLength() == 1;
-			} else {
-				condition = parentNode.getNodeName().equalsIgnoreCase(
-						IHTMLConstants.TAG_P)
-						&& parentNode.getChildNodes().getLength() == 1
-						&& part.getTextData().length() == len;
-			}
-			if (condition) {
-				// if uncheck the align action
-				if (this.getApplyingNode()
-						.getAttribute(IHTMLConstants.ATTR_ALIGN)
-						.equals(
-								((Element) parentNode)
-										.getAttribute(IHTMLConstants.ATTR_ALIGN))) {
-					((Element) parentNode)
-							.removeAttribute(IHTMLConstants.ATTR_ALIGN);
-					IDOMPosition startPos = new DOMPosition(parentNode, 0);
-					IDOMPosition endPos = new DOMRefPosition(endNode, true);
-					return new DOMRange(startPos, endPos);
-				}
-				// else replace the align attribute
-				/**
-				 * this._applyingNode.appendChild(startNode);
-				 * parentNode.getParentNode().replaceChild(this._applyingNode,
-				 * parentNode);
-				 */
-				String align = this.getApplyingNode()
-						.getAttribute(IHTMLConstants.ATTR_ALIGN);
-				((Element) parentNode).setAttribute(IHTMLConstants.ATTR_ALIGN,
-						align);
-
-				IDOMPosition startPos = new DOMPosition(parentNode, 0);
-				IDOMPosition endPos = new DOMRefPosition(endNode, true);
-				return new DOMRange(startPos, endPos);
-			}
-		} else {
-			if (parentNode != null
-					&& parentNode.getNodeName().equalsIgnoreCase(
-							IHTMLConstants.TAG_P)
-					&& parentNode.getChildNodes().getLength() == len) {
-				if (this.getApplyingNode()
-						.getAttribute(IHTMLConstants.ATTR_ALIGN)
-						.equals(
-								((Element) parentNode)
-										.getAttribute(IHTMLConstants.ATTR_ALIGN))) {
-					((Element) parentNode)
-							.removeAttribute(IHTMLConstants.ATTR_ALIGN);
-					IDOMPosition startPos = new DOMPosition(parentNode, 0);
-					IDOMPosition endPos = new DOMRefPosition(endNode, true);
-					return new DOMRange(startPos, endPos);
-				}
-
-				/**
-				 * Node sibling = startNode.getNextSibling();
-				 * this._applyingNode.appendChild(startNode); Node
-				 * endNodeSibling = endNode.getNextSibling(); while (sibling !=
-				 * null && startNode != endNode && sibling != endNodeSibling) {
-				 * Node tempNode = sibling.getNextSibling();
-				 * this._applyingNode.appendChild(sibling); sibling = tempNode; }
-				 * parentNode.getParentNode().replaceChild(this._applyingNode,
-				 * parentNode);
-				 */
-				String align = this.getApplyingNode()
-						.getAttribute(IHTMLConstants.ATTR_ALIGN);
-				((Element) parentNode).setAttribute(IHTMLConstants.ATTR_ALIGN,
-						align);
-
-				IDOMPosition startPos = new DOMPosition(parentNode, 0);
-				IDOMPosition endPos = new DOMRefPosition(endNode, true);
-				return new DOMRange(startPos, endPos);
-			}
-		}
-		return null;
-	}
-
-	private DOMRange InsertStyleTag(DOMRange range) {
-		if (range == null || range.isEmpty()) {
-			return null;
-		}
-
-		boolean ordered = range.isOrdered();
-		IDOMPosition start = ordered ? range.getStartPosition() : range
-				.getEndPosition();
-		IDOMPosition end = ordered ? range.getEndPosition() : range
-				.getStartPosition();
-
-		Node startContainer = start.getContainerNode();
-		Node endContainer = end.getContainerNode();
-
-		Node common = DOMUtil.findCommonAncester(start.getContainerNode(), end
-				.getContainerNode());
-		if (common == null) {
-			// should not happen.
-			return null;
-		}
-        if (startContainer instanceof Text) {
-        	// if the start offset is 0,then skip split the Text
-        	if (start.getOffset() > 0) {
-        		startContainer = ((Text) startContainer).splitText(start
-        				.getOffset());
-        		start = new DOMRefPosition(startContainer, false);
-        	}
-        } else {
-        	startContainer = start.getNextSiblingNode();
-        }
-        if (endContainer instanceof Text) {
-        	if (end.getOffset() > 0) {
-        		endContainer = ((Text) endContainer).splitText(end
-        				.getOffset());
-        		endContainer = endContainer.getPreviousSibling();
-        	} else {
-        		endContainer = endContainer.getPreviousSibling();
-        	}
-        } else {
-        	endContainer = end.getPreviousSiblingNode();
-        }
-
-        // now the startContainer and the endContainer should share the same
-        // parent
-        Element newNode = createStyleElement();
-        startContainer.getParentNode()
-        		.insertBefore(newNode, startContainer);
-
-        Node sibling = startContainer.getNextSibling();
-        newNode.appendChild(startContainer);
-        Node endNodeSibling = endContainer.getNextSibling();
-        while (sibling != null && startContainer != endContainer
-        		&& sibling != endNodeSibling) {
-        	Node tempNode = sibling.getNextSibling();
-        	newNode.appendChild(sibling);
-        	sibling = tempNode;
-        }
-
-        IDOMPosition startPos = new DOMPosition(newNode, 0);
-        IDOMPosition endPos = new DOMRefPosition(endContainer, true);
-        return new DOMRange(startPos, endPos);
-	}
-
-	private static String getAName(String name) {
-		return name == null ? "" : name; //$NON-NLS-1$
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/ParagraphFinder.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/ParagraphFinder.java
deleted file mode 100644
index 1dfda9d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/ParagraphFinder.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.range;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.dom.DOMPosition;
-import org.eclipse.jst.pagedesigner.dom.DOMRefPosition;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public class ParagraphFinder {
-	private final IDOMPosition _position;
-
-	/**
-	 * @param position
-	 */
-	public ParagraphFinder(IDOMPosition position) {
-		_position = position;
-	}
-
-	/**
-	 * @return the dom position
-	 */
-	public IDOMPosition getPosition() {
-		return _position;
-	}
-
-	private Node findInlineSiblings(IDOMPosition position, List result,
-			boolean forward) {
-		Node container = EditModelQuery.getInstance().getSibling(position,
-				forward);
-		if (!forward) {
-			while (container != null) {
-				if (EditModelQuery.isInline(container)) {
-					result.add(container);
-				} else {
-					return container;
-				}
-				container = container.getPreviousSibling();
-			}
-		} else {
-			while (container != null) {
-				if (EditModelQuery.isInline(container)) {
-					result.add(container);
-				} else {
-					return container;
-				}
-				container = container.getNextSibling();
-			}
-		}
-		// the result will be non-zero length.
-		return null;
-	}
-
-	private Node getParagraphNodes(IDOMPosition position, List result,
-			boolean forward) {
-		Node sResult = findInlineSiblings(position, result, forward);
-		Node container = position.getContainerNode();
-		container = position.isText() ? container.getParentNode() : container;
-		while (sResult == null) {
-			// stop at block, special container and H style nodes.
-			if (EditModelQuery.isBlockNode(container)
-					|| EditModelQuery.isDocument(container)
-					|| (container.getLocalName() != null && (container
-							.getLocalName().equals(IJSFConstants.TAG_VIEW) || container
-							.getLocalName().equalsIgnoreCase(
-									IHTMLConstants.TAG_HTML)))) {
-				return container;
-			}
-			position = new DOMRefPosition(container, forward);
-			sResult = findInlineSiblings(position, result, forward);
-			container = container.getParentNode();
-		}
-		return sResult;
-	}
-
-	/**
-	 * Search for an area between two block nodes or within a block node, search
-	 * will stop before or under a node which has block display-type, or
-	 * particular container like "html", jsf "view", .etc, two positions (left
-	 * and right) are returned in result.
-	 * 
-	 * The searcher will search parent's directly children, if no block node is
-	 * found, then go up the node tree to search again.
-	 * 
-	 * @param position
-	 * @return the paragraph
-	 */
-	public Paragraph getParagraph(IDOMPosition position) {
-		List tempResult = new ArrayList();
-		IDOMPosition p1, p2;
-		Node r1 = getParagraphNodes(position, tempResult, true);
-		if (EditModelQuery.isChild(r1, position.getContainerNode())) {
-			p1 = new DOMPosition(r1, r1.getChildNodes().getLength());
-		} else {
-			p1 = new DOMRefPosition(r1, false);
-		}
-
-		Node r2 = getParagraphNodes(position, tempResult, false);
-		if (EditModelQuery.isChild(r2, position.getContainerNode())) {
-			p2 = new DOMPosition(r2, 0);
-		} else {
-			p2 = new DOMRefPosition(r2, true);
-		}
-		return new Paragraph(p1, p2);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/ParagraphUnapplyStyleCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/ParagraphUnapplyStyleCommand.java
deleted file mode 100644
index 328621e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/ParagraphUnapplyStyleCommand.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.range;
-
-import org.eclipse.jst.pagedesigner.dom.DOMPositionHelper;
-import org.eclipse.jst.pagedesigner.dom.DOMRange;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public class ParagraphUnapplyStyleCommand extends ApplyStyleCommand {
-	private String _groupTags[];
-
-	/**
-	 * @param viewer
-	 * @param tags
-	 * @param property
-	 * @param value
-	 */
-	public ParagraphUnapplyStyleCommand(IHTMLGraphicalViewer viewer,
-			String[] tags, String property, String value) {
-		super(viewer, "", property, value); //$NON-NLS-1$
-		_groupTags = tags;
-	}
-
-	/**
-	 * @param viewer
-	 * @param node
-	 * @param property
-	 * @param value
-	 */
-	public ParagraphUnapplyStyleCommand(IHTMLGraphicalViewer viewer,
-			Element node, String property, String value) {
-		super(viewer, node, property, value);
-	}
-
-	private DOMRange removeExistingStyles(IDOMPosition start, IDOMPosition end) {
-		Node common = null;
-		if (EditModelQuery.isSame(start, end)) {
-			ParagraphFinder finder = new ParagraphFinder(start);
-			Paragraph p = finder.getParagraph(start);
-			start = p.getStart();
-			end = p.getEnd();
-			common = p.getLowestContainer();
-		} else {
-			common = EditModelQuery.getInstance().getCommonAncestor(start, end);
-		}
-		// Here we insert some code to avoid creating tags duplicated. but these
-		// are not the entire cases.
-		// if (Arrays.asList(_groupTags).contains(common.getNodeName()))
-		if (EditModelQuery.containItem(_groupTags, common, true)) {
-			start = DOMPositionHelper.toDOMRefPosition(start);
-			end = DOMPositionHelper.toDOMRefPosition(end);
-			Node parent = common.getParentNode();
-			EditModelQuery.copyChildren(common, parent);
-			common.getParentNode().removeChild(common);
-			return new DOMRange(start, end);
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.range.RangeModeCommand#doRangeExecute(org.eclipse.jst.pagedesigner.dom.DOMRange)
-	 */
-	protected DOMRange doRangeExecute(DOMRange range) {
-		return removeExistingStyles(range.getStartPosition(), range
-				.getEndPosition());
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/PasteCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/PasteCommand.java
deleted file mode 100644
index 5ec0958..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/PasteCommand.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.range;
-
-import org.eclipse.jst.pagedesigner.commands.CommandResources;
-import org.eclipse.jst.pagedesigner.dom.DOMRange;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-
-/**
- * @author mengbo
- */
-public class PasteCommand extends RangeModeCommand {
-
-	/**
-	 * @param viewer
-	 */
-	public PasteCommand(IHTMLGraphicalViewer viewer) {
-		super(CommandResources.getString("PasteCommand.Label.Paste"), viewer); //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.range.RangeModeCommand#doRangeExecute(org.eclipse.jst.pagedesigner.dom.DOMRange)
-	 */
-	protected DOMRange doRangeExecute(DOMRange selection) {
-		InsertEdit edit = new InsertEdit(selection, getViewer(),
-				new ClipboardData(getViewer().getControl()));
-		if (edit.operate()) {
-			return new DOMRange(edit.getOperationPosition(), edit
-					.getOperationPosition());
-		}
-        return selection;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/RangeModeCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/RangeModeCommand.java
deleted file mode 100644
index 07ce127..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/RangeModeCommand.java
+++ /dev/null
@@ -1,171 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.range;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jst.pagedesigner.commands.DesignerCommand;
-import org.eclipse.jst.pagedesigner.dom.DOMPositionHelper;
-import org.eclipse.jst.pagedesigner.dom.DOMRange;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.dom.EditValidateUtil;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.parts.ElementEditPart;
-import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public abstract class RangeModeCommand extends DesignerCommand {
-//	private static final Logger _log = PDPlugin
-//			.getLogger(RangeModeCommand.class);
-
-	DOMRange _resultRange = null;
-
-	/**
-	 * @param label
-	 * @param viewer
-	 */
-	public RangeModeCommand(String label, IHTMLGraphicalViewer viewer) {
-		super(label, viewer);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#prePreExecute()
-	 */
-	protected boolean prePreExecute() {
-		int position = -1;
-		int length = -1;
-		ISelection selection = getViewer().getSelection();
-		if (selection != null) {
-			if (getViewer().isInRangeMode()) {
-				DesignRange range = (DesignRange) selection;
-				if (range.isValid()) {
-					IDOMPosition domPos = DOMPositionHelper.toDOMPosition(range
-							.getStartPosition());
-					IDOMPosition domEnd = DOMPositionHelper.toDOMPosition(range
-							.getEndPosition());
-					if (!EditValidateUtil.validPosition(domPos)
-							|| !EditValidateUtil.validPosition(domEnd)) {
-						return false;
-					}
-					position = EditModelQuery.getIndexedRegionLocation(domPos);
-					int end = EditModelQuery.getIndexedRegionLocation(domEnd);
-					if (end < position) {
-						length = position - end;
-						position = end;
-					} else {
-						length = end - position;
-					}
-				}
-			} else {
-				Object object = ((IStructuredSelection) selection)
-						.getFirstElement();
-				if (object instanceof ElementEditPart) {
-					Node node = ((ElementEditPart) object).getIDOMNode();
-					position = EditModelQuery.getNodeStartIndex(node);
-					length = EditModelQuery.getNodeLenth(node);
-				} else {
-					return false;
-				}
-			}
-			if (position >= 0 && length >= 0) {
-				getModel().beginRecording(this, getLabel(), position, length);
-			} else {
-				getModel().beginRecording(this, getLabel());
-			}
-			getViewer().startSelectionChange();
-			getModel().aboutToChangeModel();
-			return true;
-		}
-        return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-	 */
-	protected final void doExecute() {
-		DesignRange range = getViewer().getRangeSelection();
-		if (range != null && range.isValid()) {
-			DOMRange domrange = (range == null || !range.isValid()) ? null
-					: toDOMRange(range);
-			_resultRange = doRangeExecute(domrange);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#getAfterCommandDesignerSelection()
-	 */
-	protected final ISelection getAfterCommandDesignerSelection() {
-//		try {
-			if (_resultRange == null) {
-				return null;
-			}
-			IDOMPosition startPos = _resultRange.getStartPosition();
-			DesignPosition start = DOMPositionHelper.toDesignPosition(startPos);
-			if (_resultRange.isEmpty()) {
-				return new DesignRange(start, start);
-			}
-            IDOMPosition endPos = _resultRange.getEndPosition();
-            return new DesignRange(start, DOMPositionHelper
-            		.toDesignPosition(endPos));
-            // TODO: don't know what this exception catch is for
-//		} catch (Exception e) {
-//			// "Selection error"
-//			_log.error("Error.RangeModeCommand.SetSelection"); //$NON-NLS-1$
-//			return null;
-//		}
-	}
-
-	/**
-	 * @param range
-	 * @return
-	 */
-	private DOMRange toDOMRange(DesignRange range) {
-		return new DOMRange(DOMPositionHelper.toDOMPosition(range
-				.getStartPosition()), DOMPositionHelper.toDOMPosition(range
-				.getEndPosition()));
-	}
-
-	/**
-	 * In the implementation of this method, should not do anything relating to
-	 * EditPart. (maybe even not ICSSStyle, since not style information not
-	 * refreshed yet)
-	 * @param selection 
-	 * 
-	 * @return null means no change have been done to the model. In this case,
-	 *         system may choose to cancel undo recorrding, etc.
-	 */
-	protected abstract DOMRange doRangeExecute(DOMRange selection);
-
-	/**
-	 * @param parent
-	 * @param ref
-	 * @param child
-	 */
-	protected static void appendChild(Node parent, Node ref, Node child) {
-		Node next = ref.getNextSibling();
-		if (next == null)
-			parent.appendChild(child);
-		else
-			parent.insertBefore(child, next);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/SelectAllCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/SelectAllCommand.java
deleted file mode 100644
index 4118016..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/SelectAllCommand.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.range;
-
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jst.pagedesigner.dom.DOMPosition;
-import org.eclipse.jst.pagedesigner.dom.DOMPositionHelper;
-import org.eclipse.jst.pagedesigner.dom.EditHelper;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.dom.EditValidateUtil;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.validation.caret.ActionData;
-import org.eclipse.jst.pagedesigner.validation.caret.IMovementMediator;
-import org.eclipse.jst.pagedesigner.validation.caret.InlineEditingNavigationMediator;
-import org.eclipse.jst.pagedesigner.validation.caret.JSFRootContainerPositionRule;
-import org.eclipse.jst.pagedesigner.validation.caret.RootContainerPositionRule;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Document;
-import org.w3c.dom.Node;
-
-/**
- * Called in response to a Ctrl-A-style select all action
- *
- */
-public class SelectAllCommand extends Command {
-	private IHTMLGraphicalViewer _viewer;
-
-	/**
-	 * @param label
-	 * @param viewer
-	 */
-	public SelectAllCommand(String label, IHTMLGraphicalViewer viewer) {
-		super(label);
-		_viewer = viewer;
-	}
-
-	public void execute() {
-		Node document = _viewer.getModel().getDocument();
-		IMovementMediator validator = new InlineEditingNavigationMediator(
-				new ActionData(ActionData.KEYBOARD_NAVAGATION, null));
-		Node htmlRoot = RootContainerPositionRule
-				.getBasicContainer((Document) document);
-		Node jsfRoot = JSFRootContainerPositionRule
-				.getBasicContainer((Document) document, 3);
-		Node root;
-		if (htmlRoot != null && jsfRoot != null) {
-			if (EditModelQuery.isChild(htmlRoot, jsfRoot)) {
-				root = htmlRoot;
-			} else if (EditModelQuery.isChild(jsfRoot, htmlRoot)) {
-				root = jsfRoot;
-			} else {
-				root = htmlRoot;
-			}
-		} else {
-			if (htmlRoot != null) {
-				root = htmlRoot;
-			} else if (jsfRoot != null) {
-				root = jsfRoot;
-			} else {
-				root = document;
-			}
-		}
-		IDOMPosition position1, position2;
-		// if (root.hasChildNodes())
-		// {
-		// Node first = root.getFirstChild();
-		// position1 = new DOMRefPosition(first, false);
-		// Node last = root.getLastChild();
-		// position2 = new DOMRefPosition(last, true);
-		// }
-		// else
-		// {
-		position1 = new DOMPosition(root, 0);
-		position2 = new DOMPosition(root, root.getChildNodes().getLength());
-		// }
-		if (!validator.isValidPosition(position1)) {
-			position1 = EditHelper.moveToNextEditPosition(position1, true,
-					validator);
-		}
-		if (!validator.isValidPosition(position2)) {
-			position2 = EditHelper.moveToNextEditPosition(position2, false,
-					validator);
-		}
-		if (EditValidateUtil.validPosition(position1)
-				&& EditValidateUtil.validPosition(position2)) {
-			_viewer.setRange(DOMPositionHelper.toDesignPosition(position1),
-					DOMPositionHelper.toDesignPosition(position2));
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/UnapplyStyleCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/UnapplyStyleCommand.java
deleted file mode 100644
index b2c05e4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/UnapplyStyleCommand.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.range;
-
-import org.eclipse.jst.pagedesigner.dom.DOMRange;
-import org.eclipse.jst.pagedesigner.dom.DOMUtil;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.Text;
-
-/**
- * @author mengbo
- */
-public class UnapplyStyleCommand extends ApplyStyleCommand {
-	/**
-	 * @param viewer
-	 * @param tag
-	 * @param property
-	 * @param value
-	 */
-	public UnapplyStyleCommand(IHTMLGraphicalViewer viewer, String tag,
-			String property, String value) {
-		super(viewer, tag, property, value);
-	}
-
-	/**
-	 * @param viewer
-	 * @param node
-	 * @param property
-	 * @param value
-	 */
-	public UnapplyStyleCommand(IHTMLGraphicalViewer viewer, Element node,
-			String property, String value) {
-		super(viewer, node, property, value);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.range.RangeModeCommand#doRangeExecute(org.eclipse.jst.pagedesigner.dom.DOMRange)
-	 */
-	protected DOMRange doRangeExecute(DOMRange range) {
-		if (range == null || range.isEmpty()) {
-			return null;
-		}
-
-		boolean ordered = range.isOrdered();
-		IDOMPosition start = ordered ? range.getStartPosition() : range
-				.getEndPosition();
-		IDOMPosition end = ordered ? range.getEndPosition() : range
-				.getStartPosition();
-
-		Node common = DOMUtil.findCommonAncester(start.getContainerNode(), end
-				.getContainerNode());
-		if (common == null) {
-			// should not happen.
-			return null;
-		}
-
-		if (common instanceof Text) {
-			doTextNodeStyleApply((Text) common, start.getOffset(), end
-					.getOffset());
-		}
-
-		return null;
-	}
-
-	/**
-	 * @param start
-	 * @param end
-	 * @param common
-	 */
-	private DOMRange doTextNodeStyleApply(Text textNode, int startOffset,
-			int endOffset) {
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/WorkNode.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/WorkNode.java
deleted file mode 100644
index a76f2be..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/WorkNode.java
+++ /dev/null
@@ -1,160 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.range;
-
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public final class WorkNode {
-	private WorkNode parent;
-
-	private WorkNode previous;
-
-	private WorkNode next;
-
-	private Node node;
-
-	private final int pos[];
-
-	private boolean isRoot;
-
-	/**
-	 * @param node
-	 * @param pos1
-	 * @param pos2
-	 */
-	public WorkNode(Node node, final int pos1, final int pos2) {
-		this.pos = resoveOffsets(node, pos1, pos2);
-		this.node = node;
-	}
-
-	/**
-	 * @return Returns the node.
-	 */
-	public Node getNode() {
-		return node;
-	}
-
-	/**
-	 * @param node
-	 *            The node to set.
-	 */
-	public void setNode(Node node) {
-		this.node = node;
-	}
-
-	/**
-	 * @return the offsets
-	 */
-	int[] getQualifiedOffsets() {
-		int result[] = new int[] { getPosOffsets()[0], getPosOffsets()[1] };
-		result[0] = result[0] < 0 ? 0 : result[0];
-		int length = EditModelQuery.getNodeLenth(node);
-		result[0] = result[0] > length ? length : result[0];
-		result[1] = result[1] < 0 ? 0 : result[1];
-		result[1] = result[1] > length ? length : result[1];
-		return result;
-	}
-
-	/**
-	 * @return Returns the pos.
-	 */
-	public int[] getPosOffsets() {
-		return pos;
-	}
-
-	/**
-	 * @return Returns the isRoot.
-	 */
-	public boolean isRoot() {
-		return isRoot;
-	}
-
-	/**
-	 * @param isRoot
-	 *            The isRoot to set.
-	 */
-	public void setRoot(boolean isRoot) {
-		this.isRoot = isRoot;
-	}
-
-	/**
-	 * @return Returns the next.
-	 */
-	public WorkNode getNext() {
-		return next;
-	}
-
-	/**
-	 * @param next
-	 *            The next to set.
-	 */
-	public void setNext(WorkNode next) {
-		this.next = next;
-	}
-
-	/**
-	 * @return Returns the parent.
-	 */
-	public WorkNode getParent() {
-		return parent;
-	}
-
-	/**
-	 * @param parent
-	 *            The parent to set.
-	 */
-	public void setParent(WorkNode parent) {
-		this.parent = parent;
-	}
-
-	/**
-	 * @return Returns the previous.
-	 */
-	public WorkNode getPrevious() {
-		return previous;
-	}
-
-	/**
-	 * @param previous
-	 *            The previous to set.
-	 */
-	public void setPrevious(WorkNode previous) {
-		this.previous = previous;
-	}
-
-	private int[] resoveOffsets(Node node1, int pos1, int pos2) {
-		int left = EditModelQuery.getNodeStartIndex(node1);
-		return new int[] { pos1 - left, pos2 - left };
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		StringBuffer sb = new StringBuffer();
-		sb.append("Node:").append(node).append(" pos[]:").append(pos); //$NON-NLS-1$ //$NON-NLS-2$
-		return sb.toString();
-	}
-
-	boolean isWholeSelected() {
-		int start = EditModelQuery.getNodeStartIndex(node);
-		int end = EditModelQuery.getNodeEndIndex(node);
-		return getQualifiedOffsets()[0] <= 0
-				&& getQualifiedOffsets()[1] >= end - start;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/single/AddSubNodeCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/single/AddSubNodeCommand.java
deleted file mode 100644
index 178aba7..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/single/AddSubNodeCommand.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.single;
-
-import java.util.Iterator;
-import java.util.Map;
-
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.utils.JSPUtil;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class AddSubNodeCommand extends SingleNodeCommand {
-	private final IDOMElement _parent;
-	private IDOMElement _child;
-
-	private final String _tagName;
-
-	private final String _url;
-
-	private final Map _attributes;
-
-	/**
-	 * @param label
-	 * @param node
-	 * @param name 
-	 * @param url 
-	 * @param attributs 
-	 */
-	public AddSubNodeCommand(String label, IDOMElement node, String name,
-			String url, Map attributs) {
-		super(label, node);
-		this._parent = node;
-		this._tagName = name;
-		this._url = url;
-		this._attributes = attributs;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-	 */
-	protected void doExecute() {
-		String nodeName = null;
-		if (ITLDConstants.URI_HTML.equals(_url)) {
-			nodeName = _tagName;
-		} else {
-			String prefix = JSPUtil.getOrCreatePrefix(_parent.getModel(), _url, null);
-			nodeName = prefix + ":" + _tagName; //$NON-NLS-1$
-		}
-
-		_child = (IDOMElement) _parent.getOwnerDocument().createElement(nodeName);
-
-		if (_child == null) {
-			return;
-		}
-
-		for (Iterator iterator = _attributes.keySet().iterator(); iterator
-				.hasNext();) {
-			String key = (String) iterator.next();
-			String value = (String) _attributes.get(key);
-			_child.setAttribute(key, value);
-		}
-
-		_parent.appendChild(_child);
-	}
-
-	/**
-	 * @return the child node
-	 */
-	public IDOMElement getChildNode() {
-		return _child;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/single/ChangeAttributeCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/single/ChangeAttributeCommand.java
deleted file mode 100644
index 223f4ec..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/single/ChangeAttributeCommand.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.single;
-
-import java.util.Iterator;
-import java.util.Map;
-
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * This command is for change an single attribute of an IDOMElement. Normally
- * used by the properties view.
- * 
- * @author mengbo
- */
-public class ChangeAttributeCommand extends SingleNodeCommand {
-	private IDOMElement _element;
-
-	private String _attrValue;
-
-	private String _attrName;
-
-	private Map _attributes;
-
-	private boolean _keepEmptyAttribute = false;
-
-	/**
-	 * 
-	 * @param label
-	 * @param node
-	 * @param attrName
-	 * @param attrValue
-	 *            if null means remove the specified attribute
-	 */
-	public ChangeAttributeCommand(String label, IDOMElement node,
-			String attrName, String attrValue) {
-		super(label, node);
-		_element = node;
-		_attrName = attrName;
-		_attrValue = attrValue;
-		_attributes = null;
-	}
-
-	/** TODO: can these two constructors be merged?
-	 * @param label
-	 * @param node
-	 * @param attributes
-	 */
-	public ChangeAttributeCommand(String label, IDOMElement node, Map attributes) {
-		super(label, node);
-		_element = node;
-		_attributes = attributes;
-		_attrName = null;
-		_attrValue = null;
-	}
-
-	protected void doExecute() {
-		if (_attrName != null) {
-			updateElement(_attrName, _attrValue);
-		} else if (_attributes != null) {
-			for (Iterator iterator = _attributes.keySet().iterator(); iterator
-					.hasNext();) {
-				String name = (String) iterator.next();
-				String value = (String) _attributes.get(name);
-				if (isSameValue(value, _element.getAttribute(name))) {
-					continue;
-				}
-				updateElement(name, value);
-			}
-		}
-	}
-
-	private void updateElement(String name, String value) {
-		if (_element.hasAttribute(name) && isEmptyString(value)
-				&& !_keepEmptyAttribute) {
-			_element.removeAttribute(name);
-		}
-		if (!isEmptyString(value) || _keepEmptyAttribute) {
-			_element.setAttribute(name, value);
-		}
-	}
-
-	private boolean isSameValue(String value1, String value2) {
-		value1 = value1 == null ? "" : value1; //$NON-NLS-1$
-		value2 = value2 == null ? "" : value2; //$NON-NLS-1$
-		return value1.equals(value2);
-	}
-
-	private boolean isEmptyString(String str) {
-		if (str == null || str.equals("")) { //$NON-NLS-1$
-			return true;
-		}
-        return false;
-	}
-
-	/**
-	 * @return Returns the keepEmptyAttribute.
-	 */
-	public boolean isKeepEmptyAttribute() {
-		return _keepEmptyAttribute;
-	}
-
-	/**
-	 * @param keepEmptyAttribute
-	 *            The keepEmptyAttribute to set.
-	 */
-	public void setKeepEmptyAttribute(boolean keepEmptyAttribute) {
-		this._keepEmptyAttribute = keepEmptyAttribute;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/single/ChangeStyleCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/single/ChangeStyleCommand.java
deleted file mode 100644
index 4a88c34..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/single/ChangeStyleCommand.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.single;
-
-import java.util.Map;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.commands.CommandResources;
-import org.eclipse.jst.pagedesigner.dom.DOMStyleUtil;
-import org.eclipse.wst.css.core.internal.provisional.document.ICSSStyleDeclaration;
-import org.eclipse.wst.css.core.internal.util.declaration.CSSPropertyContext;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.w3c.dom.css.ElementCSSInlineStyle;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ChangeStyleCommand extends SingleNodeCommand {
-	private Map _styleProperties = null;
-
-	private CSSPropertyContext _context = null;
-
-	/**
-	 * @param node
-	 * @param map
-	 */
-	public ChangeStyleCommand(IDOMElement node, Map map) {
-		super(CommandResources
-				.getString("ChangeStyleCommand.Label.ChangeStyle"), node); //$NON-NLS-1$
-		_styleProperties = map;
-	}
-
-	/**
-	 * @param node
-	 * @param context
-	 */
-	public ChangeStyleCommand(IDOMElement node, CSSPropertyContext context) {
-		super(CommandResources
-				.getString("ChangeStyleCommand.Label.ChangeStyle"), node); //$NON-NLS-1$
-		_context = context;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-	 */
-	protected void doExecute() {
-		getOriginalElement().getModel().beginRecording(this);
-		try {
-			if (_styleProperties != null) {
-				IDOMElement original = this.getOriginalElement();
-				DOMStyleUtil.insertStyle(original, _styleProperties);
-			} else if (_context != null) {
-				ICSSStyleDeclaration styleDeclaration = (ICSSStyleDeclaration) ((ElementCSSInlineStyle) getOriginalElement())
-						.getStyle();
-
-				if (styleDeclaration == null) {
-					getOriginalElement().setAttribute(IJSFConstants.ATTR_STYLE,
-							""); //$NON-NLS-1$
-					styleDeclaration = (ICSSStyleDeclaration) ((ElementCSSInlineStyle) getOriginalElement())
-							.getStyle();
-				}
-				_context.applyModified(styleDeclaration);
-			}
-		} finally {
-			getOriginalElement().getModel().endRecording(this);
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/single/ChangeTagCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/single/ChangeTagCommand.java
deleted file mode 100644
index 90a33b5..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/single/ChangeTagCommand.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.single;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.Map;
-
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.utils.JSPUtil;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.w3c.dom.Attr;
-import org.w3c.dom.NamedNodeMap;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-/**
- * This is for command that changes an element's tagname and some attributes.
- * 
- * @author mengbo
- */
-public class ChangeTagCommand extends SingleNodeCommand {
-    private final IDOMElement _element;
-
-    private final Map _attributes;
-
-    private final boolean _moveContent;
-
-    private String _uri;
-
-    private String _localTag;
-
-    private  String _totalTag;
-
-	/**
-	 * @param label
-	 * @param node
-	 * @param totaltag
-	 * @param attributes
-	 * @param movecontent
-	 */
-	public ChangeTagCommand(String label, IDOMElement node, String totaltag,
-			Map attributes, boolean movecontent) {
-		super(label, node);
-		this._element = node;
-		this._totalTag = totaltag;
-		this._attributes = attributes;
-		this._moveContent = movecontent;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-	 */
-	protected void doExecute() {
-		String tag = null;
-
-		if (_totalTag != null) {
-			tag = _totalTag;
-		} else {
-			if (ITLDConstants.URI_HTML.equals(_uri)) {
-				tag = _localTag;
-			} else if (ITLDConstants.URI_JSP.equals(_uri)) {
-				tag = "jsp:" + _localTag; //$NON-NLS-1$
-			} else {
-				tag = JSPUtil.getOrCreatePrefix(getModel(), _uri, null)
-						+ _localTag;
-			}
-		}
-		// we need to remove the old element and create a new one with the new
-		// tag.
-		IDOMElement replacement = (IDOMElement) _element.getOwnerDocument()
-				.createElement(tag);
-		NamedNodeMap attrs = _element.getAttributes();
-		for (int i = 0, n = attrs.getLength(); i < n; i++) {
-			Attr a = (Attr) attrs.item(i);
-			replacement.setAttribute(a.getName(), a.getValue());
-		}
-		if (_attributes != null) {
-			for (Iterator iter = _attributes.keySet().iterator(); iter
-					.hasNext();) {
-				String name = (String) iter.next();
-				String value = (String) _attributes.get(name);
-				replacement.setAttribute(name, value);
-			}
-		}
-		if (_moveContent) {
-			NodeList nl = _element.getChildNodes();
-			ArrayList list = new ArrayList();
-			for (int i = 0, n = nl.getLength(); i < n; i++) {
-				list.add(nl.item(i));
-
-			}
-			for (int i = 0, n = list.size(); i < n; i++) {
-				replacement.appendChild((Node) list.get(i));
-			}
-		}
-		_element.getParentNode().replaceChild(replacement, _element);
-		setReplacedElement(replacement);
-	}
-
-	/**
-	 * @return the replacemd element
-	 */
-	public IDOMElement getNewElement() {
-		return getReplacedElment();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/single/InsertSubNodeCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/single/InsertSubNodeCommand.java
deleted file mode 100644
index 7790c17..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/single/InsertSubNodeCommand.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.single;
-
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class InsertSubNodeCommand extends SingleNodeCommand {
-	private IDOMElement _parent, _child, _refchild;
-
-	/**
-	 * @param label
-	 * @param parent
-	 * @param child 
-	 * @param refchild 
-	 */
-	public InsertSubNodeCommand(String label, IDOMElement parent,
-			IDOMElement child, IDOMElement refchild) {
-		super(label, parent);
-		this._parent = parent;
-		this._child = child;
-		this._refchild = refchild;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-	 */
-	protected void doExecute() {
-		_parent.insertBefore(_child, _refchild);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/single/RemoveSubNodeCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/single/RemoveSubNodeCommand.java
deleted file mode 100644
index 8ec630c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/single/RemoveSubNodeCommand.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.single;
-
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class RemoveSubNodeCommand extends SingleNodeCommand {
-	private IDOMElement _parent, _child;
-
-	/**
-	 * @param label
-	 * @param parent
-	 * @param child 
-	 */
-	public RemoveSubNodeCommand(String label, IDOMElement parent,
-			IDOMElement child) {
-		super(label, parent);
-		_parent = parent;
-		_child = child;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-	 */
-	protected void doExecute() {
-		_parent.removeChild(_child);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/single/SingleNodeCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/single/SingleNodeCommand.java
deleted file mode 100644
index 68f5db4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/single/SingleNodeCommand.java
+++ /dev/null
@@ -1,149 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.single;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jst.pagedesigner.commands.DesignerCommand;
-import org.eclipse.jst.pagedesigner.dom.DOMRange;
-import org.eclipse.jst.pagedesigner.dom.DOMRangeHelper;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * This is the super class for those commands that change attribute or tag name
- * of a single element.
- * 
- * This base class helps handles selection. As after the command, the editpart
- * may totally change, so it tried to remember the selection before command and
- * then restore it after the command.
- * 
- * So the limitation to child class of this command is that: the command should
- * only change a single element node. It could remove the node and replace with
- * a new one, but should not touch other nodes.
- * 
- * @author mengbo
- */
-public abstract class SingleNodeCommand extends DesignerCommand {
-	List _structuredSelectedNodes = null;
-
-	DOMRange _rangeSelection = null;
-
-	IDOMElement _originalElement;
-
-	IDOMElement _replacement;
-
-	/**
-	 * @param label
-	 * @param node
-	 */
-	public SingleNodeCommand(String label, IDOMElement node) {
-		super(label, node);
-		_originalElement = node;
-	}
-
-	protected void preExecute() {
-		super.preExecute();
-		// remember current selection
-		ISelection selection = getViewer().getSelection();
-		if (selection instanceof IStructuredSelection) {
-			Object[] array = ((IStructuredSelection) selection).toArray();
-			_structuredSelectedNodes = new ArrayList();
-			if (array != null) {
-				for (int i = 0; i < array.length; i++) {
-					EditPart part = (EditPart) array[i];
-					_structuredSelectedNodes.add(part.getModel());
-				}
-			}
-		} else if (selection instanceof DesignRange) {
-			DesignRange range = (DesignRange) selection;
-			_rangeSelection = DOMRangeHelper.toDOMRange(range);
-		}
-	}
-
-	/**
-	 * this method is to be called by child class in the doExecute() method.
-	 * Telling the super class that the original element will be replaced by the
-	 * specified element.
-	 * 
-	 * @param ele
-	 */
-	protected void setReplacedElement(IDOMElement ele) {
-		_replacement = ele;
-	}
-
-	/**
-	 * @return the replacement element
-	 */
-	protected IDOMElement getReplacedElment() {
-		return _replacement;
-	}
-
-	/**
-	 * @return the original element
-	 */
-	protected IDOMElement getOriginalElement() {
-		return _originalElement;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#getAfterCommandDesignerSelection()
-	 */
-	protected final ISelection getAfterCommandDesignerSelection() {
-		if (_structuredSelectedNodes != null) {
-			// handle replacement fire.
-			if (_replacement != null && _replacement != _originalElement) {
-				int index = _structuredSelectedNodes.indexOf(_originalElement);
-				if (index >= 0) {
-					_structuredSelectedNodes.set(index, _replacement);
-				}
-			}
-
-			// as the editpart may have been refreshed, so recreated the
-			// selection
-			List parts = new ArrayList();
-			for (int i = 0, size = _structuredSelectedNodes.size(); i < size; i++) {
-				Object obj = _structuredSelectedNodes.get(i);
-				if (obj instanceof INodeNotifier) {
-					EditPart part = (EditPart) ((INodeNotifier) obj)
-							.getAdapterFor(EditPart.class);
-					if (part != null)
-						parts.add(part);
-				}
-			}
-			StructuredSelection sel = new StructuredSelection(parts);
-			return sel;
-		} else if (_rangeSelection != null) {
-			DOMRange newrange = handleReplacement(_rangeSelection,
-					_originalElement, _replacement);
-			return DOMRangeHelper.toDesignRange(newrange);
-		} else {
-			return null;
-		}
-	}
-
-	private DOMRange handleReplacement(DOMRange selection,
-			IDOMElement original, IDOMElement replacement) {
-		if (replacement == null || replacement == original)
-			return selection;
-		return DOMRangeHelper.handleReplacement(selection, original,
-				replacement);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/AbstractTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/AbstractTagConverter.java
deleted file mode 100644
index bfdc0c3..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/AbstractTagConverter.java
+++ /dev/null
@@ -1,497 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.converter;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo;
-import org.eclipse.jst.pagedesigner.dom.DOMUtil;
-import org.eclipse.jst.pagedesigner.preview.PageExpressionContext;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.wst.sse.core.internal.provisional.INodeAdapter;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.Text;
-
-/**
- * This is base class for all non-hidden tag converters.
- * 
- * @author mengbo
- * @version 1.5
- */
-public abstract class AbstractTagConverter implements ITagConverter,
-		ITagEditInfo, INodeAdapter, IDOMFactory {
-	private IDOMDocument _targetDocument;
-
-	private Element _hostElement;
-
-	private Element _resultElement;
-
-	private List _childNodes = Collections.EMPTY_LIST;
-
-	private Map _childNodePositions = Collections.EMPTY_MAP;
-
-	private int _mode;
-
-	private int _minWidth;
-
-	private int _minHeight;
-
-	private boolean _needBorderDecorator;
-
-	/**
-	 * @param host 
-	 * 
-	 */
-	public AbstractTagConverter(Element host) {
-		_hostElement = host;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#setTargetDocument(org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument)
-	 */
-	public void setDestDocument(IDOMDocument document) {
-		_targetDocument = document;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.visualtag.ITagConverter#convertRefresh(java.lang.Object)
-	 */
-	public final void convertRefresh(Object context) {
-		_resultElement = null;
-		_childNodes = new ArrayList();
-		_childNodePositions = new HashMap();
-
-		_resultElement = doConvertRefresh();
-		if (_resultElement instanceof INodeNotifier) {
-			((INodeNotifier) _resultElement).addAdapter(this);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.sse.core.internal.provisional.INodeAdapter#notifyChanged(org.eclipse.wst.sse.core.internal.provisional.INodeNotifier,
-	 *      int, java.lang.Object, java.lang.Object, java.lang.Object, int)
-	 */
-	public void notifyChanged(INodeNotifier notifier, int eventType,
-			Object changedFeature, Object oldValue, Object newValue, int pos) {
-		// do nothing.
-	}
-
-	/**
-	 * Child class should override this method. The child class should NEVER
-	 * change the host DOM structure.
-	 * 
-	 * @return the convert result. Should be an HTML element.
-	 */
-	protected abstract Element doConvertRefresh();
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.visualtag.ITagConverter#getHostElement()
-	 */
-	public final Element getHostElement() {
-		return _hostElement;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.visualtag.ITagConverter#getResultElement()
-	 */
-	public final Element getResultElement() {
-		return _resultElement;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.visualtag.ITagConverter#getChildModeList()
-	 */
-	public final List getChildModeList() {
-		return _childNodes;
-	}
-
-
-	public List getNonVisualChildren() 
-    {
-	    // by default, no non-visual children
-        return Collections.EMPTY_LIST;
-    }
-
-    /**
-	 * child class should call this method.
-	 * 
-	 * @param childNode
-	 *            the childNode of the hostElement that should be futher
-	 *            converted.
-	 * @param position
-	 * 
-	 */
-	protected void addChild(Node childNode, ConvertPosition position) {
-		_childNodes.add(childNode);
-		_childNodePositions.put(childNode, position);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.visualtag.ITagConverter#getChildVisualPosition(org.w3c.dom.Node)
-	 */
-	public final ConvertPosition getChildVisualPosition(Node childModel) {
-		return (ConvertPosition) _childNodePositions.get(childModel);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.visualtag.ITagConverter#isVisualByHTML()
-	 */
-	public boolean isVisualByHTML() {
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.visualtag.ITagConverter#getVisualImage()
-	 */
-	public Image getVisualImage() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.visualtag.ITagConverter#dispose()
-	 */
-	public void dispose() {
-        // do nothing; children may wish to sub-class
-        // TODO: null shared references?
-        // this doesn't seem to be called by anybody..
-        // need to review this
-	}
-
-	/**
-	 * @param node
-	 * @return true if the node should be ignored for  conversion purposes
-	 */
-	protected boolean shouldIgnore(Node node) {
-		int nodeType = node.getNodeType();
-		switch (nodeType) {
-		case Node.TEXT_NODE:
-		case Node.CDATA_SECTION_NODE:
-		case Node.ELEMENT_NODE:
-			return false;
-		default:
-			return true;
-		}
-
-	}
-
-	/**
-	 * utility method for those converter that only converts the host tag's name
-	 * and directly copy children.
-	 * @param src 
-	 * @param dest 
-	 * 
-	 */
-	protected void copyChildren(Element src, Element dest) {
-		Node node = src.getFirstChild();
-		int index = 0;
-		for (; node != null; node = node.getNextSibling()) {
-			if (!shouldIgnore(node)) {
-				addChild(node, new ConvertPosition(dest, index++));
-			}
-		}
-	}
-
-	/**
-	 * utility method for those converter that directly copy children.
-	 * @param src 
-	 * @param dest 
-	 * 
-	 */
-	protected void dumCopyChildren(Element src, Element dest) {
-		Node node = src.getFirstChild();
-		Document destDoc = dest.getOwnerDocument();
-		for (; node != null; node = node.getNextSibling()) {
-			if (!shouldIgnore(node)) {
-				Node n = DOMUtil.cloneNodeDeepIgnoreError(destDoc, node);
-				dest.appendChild(n);
-			}
-		}
-	}
-
-	/**
-	 * In the future, the conversion result HTML DOM tree could be in another
-	 * document.
-	 * 
-	 * @return the destination document
-	 */
-	public IDOMDocument getDestDocument() {
-		if (this._targetDocument != null) {
-			return this._targetDocument;
-		}
-        return (IDOMDocument) _hostElement.getOwnerDocument();
-	}
-
-	/**
-	 * shortcut method. Child class should always use this method to create a
-	 * result element.
-	 * 
-	 * @param tagName
-	 * @return a new element named tagName
-	 */
-	public Element createElement(String tagName) {
-		return getDestDocument().createElement(tagName);
-	}
-
-	/**
-	 * shortcut method. Child class should always use this method to create a
-	 * text node.
-	 * 
-	 * @param text
-	 * @return a new text node using text as the value
-	 */
-	public Text createText(String text) {
-		return getDestDocument().createTextNode(text);
-	}
-
-	/**
-	 * @param original
-	 * @return the mapped String  TODO: currently does nothing
-	 */
-	protected String mapURL(String original) {
-		// TODO: how to map URL? such as original url look like:
-		// getContext().getPath()+...
-		return original;
-	}
-
-	// TODO: FIXME: XXX:
-	// if the value is expression, we may want to do something here!!!
-	/**
-	 * @param value
-	 * @return value mapped based on EL expression
-	 */
-	protected String mapValue(String value) {
-		if (value == null) {
-			return null;
-		}
-		if (isDesignerMode()) {
-			// if there has jsf binding expressions
-			int checkPos = value.indexOf("#{"); //$NON-NLS-1$
-			if (checkPos != -1) {
-				String mapValue = ""; //$NON-NLS-1$
-				int preferType = PreferenceReader.getMapValueType();
-				switch (preferType) {
-				case PreferenceReader.FULL_EXPRESSION_TYPE:
-					mapValue = value;
-					break;
-				case PreferenceReader.LAST_EXPRESSION_TYPE:
-					String strBackup = value;
-					StringBuffer sb = new StringBuffer();
-					while (strBackup.indexOf("#{") != -1) { //$NON-NLS-1$
-						int pos = strBackup.indexOf("#{"); //$NON-NLS-1$
-						int endBracketPos = strBackup.indexOf("}", pos + 1); //$NON-NLS-1$
-						if (endBracketPos != -1) {
-							sb.append(strBackup.substring(0, pos + 2));
-							String exp = strBackup.substring(pos + 2,
-									endBracketPos);
-							if (allowTrim(exp)) {
-								int lastDotPos = exp.lastIndexOf("."); //$NON-NLS-1$
-								if (lastDotPos != -1) {
-									String convertedExp = exp
-											.substring(lastDotPos + 1);
-									sb.append(convertedExp);
-								} else {
-									sb.append(exp);
-								}
-
-							} else {
-								sb.append(exp);
-							}
-							sb.append("}"); //$NON-NLS-1$
-						} else {
-							break;
-						}
-						if (strBackup.length() > endBracketPos + 1) {
-							strBackup = strBackup.substring(endBracketPos + 1);
-						} else {
-							strBackup = ""; //$NON-NLS-1$
-							break;
-						}
-
-					}
-					sb.append(strBackup);
-					mapValue = sb.toString();
-					break;
-				case PreferenceReader.REAL_VALUE_TYPE:
-					// TODO calculate the expression value
-				default:
-					mapValue = value;
-					break;
-				}
-
-				return mapValue;
-			}
-		} else {
-			// preview mode. let's try to display the value.
-			try {
-				return (String) PageExpressionContext.getCurrent()
-						.evaluateExpression(value, String.class, null);
-			} catch (Exception ex) {
-				// can't calculate the result. ignore.
-				// ex.printStackTrace();
-			}
-		}
-		return value;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo#needBorderDecorator()
-	 */
-	public boolean needBorderDecorator() {
-		return this._needBorderDecorator;
-	}
-
-	/**
-	 * @param b
-	 */
-	public void setNeedBorderDecorator(boolean b) {
-		this._needBorderDecorator = b;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo#needTableDecorator()
-	 */
-	public boolean needTableDecorator() {
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.sse.core.internal.provisional.INodeAdapter#isAdapterForType(java.lang.Object)
-	 */
-	public boolean isAdapterForType(Object type) {
-		if (type == ITagEditInfo.class) {
-			return true;
-		}
-		return false;
-	}
-
-	/**
-	 * @param mode
-	 */
-	public final void setMode(int mode) {
-		this._mode = mode;
-	}
-
-	/**
-	 * @return true if the converter mode is preview
-	 */
-	public final boolean isPreviewMode() {
-		return this._mode == IConverterFactory.MODE_PREVIEW;
-	}
-
-	/**
-	 * @return true if the converter mode is designer
-	 */
-	public final boolean isDesignerMode() {
-		return this._mode == IConverterFactory.MODE_DESIGNER;
-	}
-
-	/**
-	 * @return the converter mode
-	 */
-	public final int getMode() {
-		return this._mode;
-	}
-
-	/**
-	 * The method is used to judge whether the value binding and method binding
-	 * expression is allowed to be trimmed.Currently only expression contains
-	 * only letter,digit,and '.' is allowed to be trimmed.
-	 * 
-	 * @param expression
-	 *            value binding or method binding expression
-	 * @return
-	 */
-	private boolean allowTrim(String expression) {
-		for (int i = 0, size = expression.length(); i < size; i++) {
-			char ch = expression.charAt(i);
-			if (!Character.isLetterOrDigit(ch) && (ch != '.') && (ch != '_')) {
-				return false;
-			}
-		}
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#getMinWidth()
-	 */
-	public int getMinWidth() {
-		return this._minWidth;
-	}
-
-	/**
-	 * @param minWidth
-	 */
-	public void setMinWidth(int minWidth) {
-		this._minWidth = minWidth;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#getMinHeight()
-	 */
-	public int getMinHeight() {
-		return this._minHeight;
-	}
-
-	/**
-	 * @param minHeight
-	 */
-	public void setMinHeight(int minHeight) {
-		this._minHeight = minHeight;
-	}
-
-	/**
-	 * @param element
-	 * @param attrname
-	 * @return the attribute on element with the name attrname
-	 */
-	public static boolean hasAttribute(Element element, String attrname) {
-		return element.hasAttribute(attrname);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/ConvertPosition.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/ConvertPosition.java
deleted file mode 100644
index 130ec40..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/ConvertPosition.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.converter;
-
-import org.w3c.dom.Node;
-
-/**
- * This class is used to locate a position for child model nodes.
- * 
- * @author mengbo
- * @version 1.5
- */
-public class ConvertPosition {
-	private final Node _parentNode;
-
-	private final int _index;
-
-	/**
-	 * @param parent \
-	 * @param index 
-	 * 
-	 */
-	public ConvertPosition(Node parent, int index) {
-		this._parentNode = parent;
-		this._index = index;
-	}
-
-	/**
-	 * @return the parent node
-	 */
-	public Node getParentNode() {
-		return _parentNode;
-	}
-
-	/**
-	 * @return the index
-	 */
-	public int getIndex() {
-		return _index;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/ConverterFacRegistryReader.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/ConverterFacRegistryReader.java
deleted file mode 100644
index 1560e2e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/ConverterFacRegistryReader.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.converter;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtension;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jst.pagedesigner.IJMTConstants;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.PageDesignerTraceOptions;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ConverterFacRegistryReader {
-	private static List<IConverterFactory> _handlers = null;
-
-	/**
-	 * @return the list of handlers.  The list is not modifiable and will
-	 * throw exceptions if it is attempted.
-	 */
-	public static synchronized List<IConverterFactory> getAllHandlers() {
-		if (_handlers == null) {
-			_handlers = readAllHandlers();
-		}
-		return Collections.unmodifiableList(_handlers);
-
-	}
-
-	private static List<IConverterFactory> readAllHandlers()
-    {
-        final List<IConverterFactory> result = new ArrayList<IConverterFactory>();
-        IExtensionPoint extensionPoint = Platform.getExtensionRegistry()
-                .getExtensionPoint(PDPlugin.getPluginId(),
-                        IJMTConstants.EXTENSION_POINT_PAGEDESIGNER);
-        IExtension[] extensions = extensionPoint.getExtensions();
-
-        for (int i = 0; i < extensions.length; i++)
-        {
-            IExtension ext = extensions[i];
-            IConfigurationElement[] tagConverter = ext
-                    .getConfigurationElements();
-
-            for (int j = 0; j < tagConverter.length; j++)
-            {
-                final IConfigurationElement element = tagConverter[j];
-
-                if (element.getName().equals(
-                        IJMTConstants.TAG_CONVERTER_FACTORY))
-                {
-                    element.getAttribute("class"); //$NON-NLS-1$
-                    Object obj;
-                    try
-                    {
-                        obj = element.createExecutableExtension("class"); //$NON-NLS-1$
-
-                        if (element.getContributor().getName().startsWith(
-                                "org.eclipse.jst")) //$NON-NLS-1$
-                        {
-                            if (PageDesignerTraceOptions.TRACE_CONVERTERLOAD)
-                            {
-                                PageDesignerTraceOptions.log("ConverterFacRegistryReader: Appending to list:"+obj.getClass().getName()); //$NON-NLS-1$
-                            }
-                            // push JSF tools provided ones to the end
-                            result.add((IConverterFactory) obj);
-                        }
-                        // prepend if something outside JSF tools declared it
-                        else
-                        {
-                            if (PageDesignerTraceOptions.TRACE_CONVERTERLOAD)
-                            {
-                                PageDesignerTraceOptions.log("ConverterFacRegistryReader: Prepending to list:"+obj.getClass().getName()); //$NON-NLS-1$
-                            }
-                            // this way, adopters can put their overrides
-                            // of factories with built-in support like
-                            // JSF HTML/CORE will be used first
-                            result.add(0, (IConverterFactory) obj);
-                        }
-
-                    } 
-                    catch (CoreException e)
-                    {
-                        PDPlugin.log("Problem loading tag converter extension for "+element.toString(), e); //$NON-NLS-1$
-                    }
-                }
-            }
-        }
-
-        if (PageDesignerTraceOptions.TRACE_CONVERTERLOAD)
-        {
-            PageDesignerTraceOptions.log("\nFinal converterFactory list in order:"); //$NON-NLS-1$
-            for (final IConverterFactory factory : result)
-            {
-                PageDesignerTraceOptions.log(factory.getClass().getName());
-            }
-            PageDesignerTraceOptions.log("\n"); //$NON-NLS-1$
-        }
-        return result;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/ConverterFactoryRegistry.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/ConverterFactoryRegistry.java
deleted file mode 100644
index 53e4f1b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/ConverterFactoryRegistry.java
+++ /dev/null
@@ -1,231 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.converter;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jst.jsf.common.ui.JSFUICommonPlugin;
-import org.eclipse.jst.jsf.common.ui.internal.utils.JSFSharedImages;
-import org.eclipse.jst.jsf.core.internal.tld.CMUtil;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.PageDesignerTraceOptions;
-import org.eclipse.jst.pagedesigner.converter.html.HTMLConverterFactory;
-import org.eclipse.jst.pagedesigner.converter.jsp.JSPConverterFactory;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ConverterFactoryRegistry
-{
-    List _factories = new ArrayList();
-
-    private static ConverterFactoryRegistry _instance;
-
-    /**
-	 *
-	 */
-    private ConverterFactoryRegistry()
-    {
-        final List<IConverterFactory> facs = ConverterFacRegistryReader
-                .getAllHandlers();
-        if (facs != null)
-        {
-            for (final IConverterFactory fac : facs)
-            {
-                addFactory(fac);
-            }
-        }
-        _factories.add(new JSPConverterFactory());
-        _factories.add(new HTMLConverterFactory());
-        
-        // TODO: this is not ideal, but until we get a better system for 
-        // doing converter factory ordering:
-        // loop through the list and place the DTManager
-    }
-
-    /**
-     * @param fac
-     */
-    public void addFactory(final IConverterFactory fac)
-    {
-        _factories.add(fac);
-    }
-
-    /**
-     * @param ele
-     * @param mode
-     * @param targetDocument
-     * @return the new btag converter
-     */
-    public ITagConverter createTagConverter(final Element ele, final int mode,
-            final IDOMDocument targetDocument)
-    {
-        final ITagConverter converter = internalCreateTagConverter(ele, mode);
-        if (converter != null)
-        {
-            converter.setDestDocument(targetDocument);
-        }
-        return converter;
-    }
-
-    /**
-     * @param ele
-     * @param mode
-     * @return the new tag converter
-     */
-    protected final ITagConverter internalCreateTagConverter(final Element ele,
-            final int mode)
-    {
-        final String uri = CMUtil.getElementNamespaceURI(ele);
-        // first round, match uri
-        for (int i = 0, size = _factories.size(); i < size; i++)
-        {
-            final IConverterFactory fac = (IConverterFactory) _factories.get(i);
-            final String facuri = fac.getSupportedURI();
-            if (facuri != null && facuri.equals(uri))
-            {
-                final ITagConverter converter = fac.createConverter(ele, mode);
-                if (converter != null)
-                {
-                    if (PageDesignerTraceOptions.TRACE_CONVERTERSELECT)
-                    {
-                        PageDesignerTraceOptions
-                                .log("ConverterFactoryRegistry: first loop, " //$NON-NLS-1$
-                                        + String
-                                                .format(
-                                                        "Selected converter %s for uri=%s, tagname=%s", //$NON-NLS-1$
-                                                        converter.getClass()
-                                                                .getName(),
-                                                        uri, ele.getLocalName()));
-                    }
-                    return converter;
-                }
-            }
-        }
-        // second round
-        for (int i = 0, size = _factories.size(); i < size; i++)
-        {
-            final IConverterFactory fac = (IConverterFactory) _factories.get(i);
-            final String facuri = fac.getSupportedURI();
-            if (facuri == null)
-            {
-                final ITagConverter converter = fac.createConverter(ele, mode);
-                if (converter != null)
-                {
-                    if (PageDesignerTraceOptions.TRACE_CONVERTERSELECT)
-                    {
-                        PageDesignerTraceOptions
-                                .log("ConverterFactoryRegistry: second loop, " //$NON-NLS-1$
-                                        + String
-                                                .format(
-                                                        "Selected converter %s for uri=%s, tagname=%s", //$NON-NLS-1$
-                                                        converter.getClass()
-                                                                .getName(),
-                                                        uri, ele.getLocalName()));
-                    }
-                    return converter;
-                }
-            }
-        }
-
-        // can't find. We need some default tag converter for it.
-        // if the tag is empty, show it as icon.
-        if (uri == null || ITLDConstants.URI_HTML.equals(uri))
-        {
-            if (PageDesignerTraceOptions.TRACE_CONVERTERSELECT)
-            {
-                PageDesignerTraceOptions
-                        .log("ConverterFactoryRegistry: factory not found, " //$NON-NLS-1$
-                                + String
-                                        .format(
-                                                "Selected DumTagConverter for uri=%s, tagname=%s", //$NON-NLS-1$
-                                                uri, ele.getLocalName()));
-            }
-
-            // basically, for HTML or non JSP tag, directly renders it.
-            return new DumTagConverter(ele);
-        }
-        final CMElementDeclaration decl = CMUtil.getElementDeclaration(ele);
-        if (decl == null)
-        {
-            if (PageDesignerTraceOptions.TRACE_CONVERTERSELECT)
-            {
-                PageDesignerTraceOptions
-                        .log("ConverterFactoryRegistry: factory and decl not found, " //$NON-NLS-1$
-                                + String
-                                        .format(
-                                                "Selected DumTagConverter for uri=%s, tagname=%s", //$NON-NLS-1$
-                                                uri, ele.getLocalName()));
-            }
-            return new DumTagConverter(ele);
-        }
-        final int contentType = decl.getContentType();
-        if (contentType == CMElementDeclaration.EMPTY)
-        {
-            if (PageDesignerTraceOptions.TRACE_CONVERTERSELECT)
-            {
-                PageDesignerTraceOptions
-                        .log("ConverterFactoryRegistry: factory not found, content is EMPTY, " //$NON-NLS-1$
-                                + String
-                                        .format(
-                                                "Selected HiddenTagConverter with UnknownImage for uri=%s, tagname=%s", //$NON-NLS-1$
-                                                uri, ele.getLocalName()));
-            }
-
-            // if the tag is empty, show it as icon.
-            return new HiddenTagConverter(ele, new LabelProvider()
-            {
-                @Override
-                public Image getImage(final Object element)
-                {
-                    return getUnknownImage();
-                }
-            });
-        }
-        if (PageDesignerTraceOptions.TRACE_CONVERTERSELECT)
-        {
-            PageDesignerTraceOptions
-                    .log("ConverterFactoryRegistry: fall-through to default case, " //$NON-NLS-1$
-                            + String
-                                    .format(
-                                            "Selected DefaultUnknownTagConverter with UnknownImage for uri=%s, tagname=%s", //$NON-NLS-1$
-                                            uri, ele.getLocalName()));
-        }
-        return new DefaultUnknownTagConverter(ele, mode);
-
-    }
-
-    private static Image getUnknownImage()
-    {
-        return JSFUICommonPlugin.getDefault().getImage(
-                JSFSharedImages.DEFAULT_PALETTE_TAG_IMG);
-    }
-
-    /**
-     * @return the singleton instance of the registry
-     */
-    public synchronized static ConverterFactoryRegistry getInstance()
-    {
-        if (_instance == null)
-        {
-            _instance = new ConverterFactoryRegistry();
-        }
-        return _instance;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/ConverterUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/ConverterUtil.java
deleted file mode 100644
index 3b03710..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/ConverterUtil.java
+++ /dev/null
@@ -1,172 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.converter;
-
-import java.util.Set;
-
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.dtmanager.DTManager;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMText;
-import org.w3c.dom.Attr;
-import org.w3c.dom.Element;
-import org.w3c.dom.NamedNodeMap;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ConverterUtil {
-	/**
-	 * 
-	 * @param source
-	 * @param dest
-	 * @param ignore
-	 */
-	public static void copyAllAttributes(Element source, Element dest,
-			Set ignore) {
-		NamedNodeMap attrs = source.getAttributes();
-		for (int i = 0, size = attrs.getLength(); i < size; i++) {
-			Attr attr = (Attr) attrs.item(i);
-			if (ignore == null || !ignore.contains(attr.getName())) {
-				dest.setAttribute(attr.getName(), attr.getValue());
-			}
-		}
-	}
-
-	/**
-	 * copy a single attribute (if exist)
-	 * 
-	 * @param source
-	 * @param srcattr
-	 * @param dest
-	 * @param destattr
-	 */
-	public static void copyAttribute(Element source, String srcattr,
-			Element dest, String destattr) {
-		Attr attr = source.getAttributeNode(srcattr);
-		if (attr != null) {
-			dest.setAttribute(destattr, attr.getValue());
-		}
-	}
-
-	/**
-	 * @param hostElement
-	 * @return true if hostElement represents an empty container
-	 */
-	public static boolean isEmptyContainer(Element hostElement) {
-		NodeList nl = hostElement.getChildNodes();
-		if (nl == null || nl.getLength() == 0) {
-			return true;
-		}
-
-		for (int i = 0, n = nl.getLength(); i < n; i++) {
-			Node node = nl.item(i);
-			if (!(node instanceof IDOMText)) {
-				return false;
-			}
-			if (!((IDOMText) node).isElementContentWhitespace()) {
-				return false;
-			}
-		}
-		return true;
-	}
-
-	/**
-	 * @param document
-	 * @param text
-	 * @return the description element in the document containing text
-	 */
-	public static Element createDescriptionElement(IDOMDocument document,
-			String text) {
-		if (document == null) {
-			return null;
-		}
-		Element span = document.createElement(IHTMLConstants.TAG_SPAN);
-		span.setAttribute(
-				"style", "color:gray;font-style:italic;font-size:normal;"); //$NON-NLS-1$ //$NON-NLS-2$
-		if (text == null) {
-			span.appendChild(document.createTextNode(PDPlugin
-					.getResourceString("ConverterUtil.Description"))); //$NON-NLS-1$
-		} else {
-			span.appendChild(document.createTextNode(text));
-		}
-		return span;
-	}
-
-	/**
-	 * Method to find the resulting converted tag containing a given
-	 * source element. The converted element that will be
-	 * the parent tag is returned so the caller can then determine
-	 * if the parent is part of a table, header, body, footer, row,
-	 * cell, or some other element. 
-	 * 
-	 * @param srcElem the source element to test.
-	 * @param childElem a child of the source element (used by a
-	 *                  recursive call to handle special case where
-	 *                  it was moved up a level to the child model
-	 *                  list of the grandparent).
-	 * @return a converted element of the type that will contain the
-	 *         source element. 
-	 */
-	static Node findConvertedParentElement(Element srcElem, Element childElem) {
-		Node parent = srcElem.getParentNode();
-		if ((parent == null) || !(parent instanceof Element)) {
-			return null;
-		}
-
-		String name = parent.getNodeName();
-		if (IHTMLConstants.TAG_HTML.equalsIgnoreCase(name)
-				|| IHTMLConstants.TAG_BODY.equalsIgnoreCase(name)) {
-			return null;
-		}
-
-		ITagConverter converter = createTagConverter((Element) parent);
-		if (!converter.isVisualByHTML()) {
-			return null;
-		}
-
-		converter.convertRefresh(null);
-		ConvertPosition position = null;
-		if (childElem != null) {
-			// If a child node (grand child of current parent) was
-			// passed in, check for its position. It may have been
-			// moved up a level to child model list of the current
-			// parent. In JSF this is done with a header or
-			// footer facet tag in a column tag for a dataTable.
-			position = converter.getChildVisualPosition(childElem);
-		}
-		if (position == null) {
-			position = converter.getChildVisualPosition(srcElem);
-		}
-		if (position != null) {
-			// return the node that will contain the visual
-			// child and then the caller can check to see if this
-			// element is table mark-up.
-			return position.getParentNode();
-		}
-
-		// The current source element is not in the child model
-		// list for the converted parent so recurse to next
-		// ancestor and pass source element to see if it has been
-		// moved up a level as child model of the grandparent.
-		return findConvertedParentElement((Element) parent, srcElem);
-	}
-
-	private static ITagConverter createTagConverter(Element ele) {
-		return DTManager.getInstance().getTagConverter(ele,
-				IConverterFactory.MODE_DESIGNER, null);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/DefaultUnknownTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/DefaultUnknownTagConverter.java
deleted file mode 100644
index e0a2af2..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/DefaultUnknownTagConverter.java
+++ /dev/null
@@ -1,180 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.converter;
-
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.Text;
-
-/**
- * This tag converter is for those unsupported jsp tags.
- * 
- * @author mengbo
- * @version 1.5
- */
-public class DefaultUnknownTagConverter extends AbstractTagConverter {
-
-	private static final int NO_ELEMENT = 0;
-	private static final int TABLE_ELEMENT = 1;
-	private static final int TABLE_ROW_ELEMENT = 2;
-
-	/**
-	 * @param host
-	 * @param mode 
-	 */
-	public DefaultUnknownTagConverter(Element host, int  mode) {
-		super(host);
-        setMode(mode);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#doConvertRefresh()
-	 */
-	protected Element doConvertRefresh() {
-		Element hostEle = this.getHostElement();
-
-		// Test to see if the src element is contained in an
-		// element that renders as a table. If so, render this
-		// element accordingly as content in the table.
-		// This is done to address the use case where tags
-		// (such as JSTL) are used in collaboration within HTML
-		// tables. The CSS layout for tables does not handle
-		// invalid HTML so this change tries to produce valid
-		// HTML. If the table layout code gets updated to handle
-		// invalid HTML tables, then this code can be removed.
-		// See https://bugs.eclipse.org/bugs/show_bug.cgi?id=253974
-		Node containingElement = ConverterUtil.findConvertedParentElement(hostEle, null);
-		String name = null;
-		if (containingElement != null) {
-			name = containingElement.getNodeName(); 
-		}
-		if (name != null) {
-			if (IHTMLConstants.TAG_TABLE.equalsIgnoreCase(name)
-					|| IHTMLConstants.TAG_TBODY.equalsIgnoreCase(name)
-					|| IHTMLConstants.TAG_TFOOT.equalsIgnoreCase(name)) {
-				// this element is contained in a table, tbody or tfoot
-				return renderAsTableRow(hostEle, false, TABLE_ELEMENT);
-			} else if (IHTMLConstants.TAG_THEAD.equalsIgnoreCase(name)) {
-				// this element is contained in a thead
-				return renderAsTableRow(hostEle, true, TABLE_ELEMENT);
-			} else if (IHTMLConstants.TAG_TR.equalsIgnoreCase(name)) {
-				// this element is contained in a tr
-				return renderAsTableCell(hostEle, false, TABLE_ROW_ELEMENT);
-			}
-		}
-		
-		// Otherwise, use the default rendering for an unknown tag
-		return renderDefault(hostEle, NO_ELEMENT);
-	}
-
-	private Element renderDefault(Element hostEle, int tableElement) {
-		// rendering for host element not contained in a table
-		Element divEle = createElement("div"); //$NON-NLS-1$
-		String style = DOMUtil.getAttributeIgnoreCase(hostEle, "style"); //$NON-NLS-1$
-		if (style == null) {
-			style = ""; //$NON-NLS-1$
-		}
-		if (style.length() > 0 && !style.endsWith(";")) { //$NON-NLS-1$
-			style += ";"; //$NON-NLS-1$
-		}
-		style += "border: none; padding: 0; margin: 0"; //$NON-NLS-1$
-		divEle.setAttribute("style", style); //$NON-NLS-1$
-		Element div2 = createElement("span"); //$NON-NLS-1$
-        String border = isPreviewMode() ? "border-style: solid;border-width: 1px" : "border:none"; //$NON-NLS-1$ //$NON-NLS-2$
-		div2.setAttribute("style", "background-color: white;"+border+";color:gray"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-		Text txt = createText(hostEle.getTagName());
-		div2.appendChild(txt);
-
-		divEle.appendChild(div2);
-
-		Element childContainer = null;
-		switch (tableElement) {
-		case TABLE_ELEMENT:
-			childContainer = createElement(IHTMLConstants.TAG_TABLE);
-			copyChildren(getHostElement(), childContainer);
-			break;
-		case TABLE_ROW_ELEMENT:
-			childContainer = createElement(IHTMLConstants.TAG_TABLE);
-			Element trElem = createElement(IHTMLConstants.TAG_TR);
-			childContainer.appendChild(trElem);
-			copyChildren(getHostElement(), trElem);
-			break;
-		case NO_ELEMENT:
-		default:
-			childContainer = createElement("div"); //$NON-NLS-1$
-			childContainer.setAttribute("style", "margin: 0; padding: 0"); //$NON-NLS-1$ //$NON-NLS-2$
-			copyChildren(getHostElement(), childContainer);
-			break;
-		}
-
-		divEle.appendChild(childContainer);
-
-		return divEle;
-	}
-
-	/*
-	 * Creates a table row, and adds either a table cell (data
-	 * or a header depending on the boolean flag).
-	 */
-	private Element renderAsTableRow(Element hostEle, boolean isHeader, int tableElement) {
-		Element trElem = createElement(IHTMLConstants.TAG_TR);
-		Element tdElem = renderAsTableCell(hostEle, isHeader, tableElement);
-		trElem.appendChild(tdElem);
-		return trElem;
-	}
-
-	/*
-	 * Creates a table cell, as either data or a header depending
-	 * on the boolean flag.
-	 */
-	private Element renderAsTableCell(Element hostEle, boolean isHeader, int tableElement) {
-		Element tdElem = null;
-		if (isHeader) {
-			tdElem = createElement(IHTMLConstants.TAG_TH);
-		} else {
-			tdElem = createElement(IHTMLConstants.TAG_TD);
-		}
-		tdElem.appendChild(renderDefault(hostEle, tableElement));
-		return tdElem;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isMultiLevel()
-	 */
-	public boolean isMultiLevel() {
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo#isWidget()
-	 */
-	public boolean isWidget() {
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#needBorderDecorator()
-	 */
-	public boolean needBorderDecorator() {
-		return true;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/DumDeepTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/DumDeepTagConverter.java
deleted file mode 100644
index 0a56b52..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/DumDeepTagConverter.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.converter;
-
-import org.eclipse.jst.pagedesigner.dom.DOMUtil;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class DumDeepTagConverter extends AbstractTagConverter {
-
-	/**
-	 * @param host
-	 */
-	public DumDeepTagConverter(Element host) {
-		super(host);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#doConvertRefresh()
-	 */
-	protected Element doConvertRefresh() {
-		return (Element) DOMUtil.cloneNodeDeepIgnoreError(getDestDocument(),
-				getHostElement());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.visualtag.ITagConverter#isMultiLevel()
-	 */
-	public boolean isMultiLevel() {
-		return true;
-	}
-
-    // TODO: dead?
-//	private boolean internalIsWidget(Element result) {
-//		String tagname = result.getTagName();
-//		if (IHTMLConstants.TAG_INPUT.equalsIgnoreCase(tagname)
-//				|| IHTMLConstants.TAG_SELECT.equalsIgnoreCase(tagname)
-//				|| IHTMLConstants.TAG_TEXTAREA.equalsIgnoreCase(tagname)
-//				|| IHTMLConstants.TAG_IMG.equalsIgnoreCase(tagname)
-//				|| IHTMLConstants.TAG_HEAD.equalsIgnoreCase(tagname)
-//				|| IHTMLConstants.TAG_SCRIPT.equalsIgnoreCase(tagname)
-//				|| IHTMLConstants.TAG_LINK.equalsIgnoreCase(tagname)) {
-//			return true;
-//		} else {
-//
-//			return false;
-//		}
-//	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.visualtag.ITagConverter#isWidget()
-	 */
-	public boolean isWidget() {
-		return true;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/DumDescriptionTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/DumDescriptionTagConverter.java
deleted file mode 100644
index 2221a52..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/DumDescriptionTagConverter.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.converter;
-
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class DumDescriptionTagConverter extends AbstractTagConverter {
-	/**
-	 * @param host
-	 */
-	public DumDescriptionTagConverter(Element host) {
-		super(host);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#doConvertRefresh()
-	 */
-	protected Element doConvertRefresh() {
-		Element result = createElement(getHostElement().getTagName());
-		ConverterUtil.copyAllAttributes(getHostElement(), result, null);
-		copyChildren(getHostElement(), result);
-
-		if (!this.isPreviewMode()
-				&& ConverterUtil.isEmptyContainer(getHostElement())) {
-			result.appendChild(ConverterUtil.createDescriptionElement(
-					getDestDocument(), null));
-		}
-
-		return result;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isMultiLevel()
-	 */
-	public boolean isMultiLevel() {
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo#isWidget()
-	 */
-	public boolean isWidget() {
-		return false;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/DumTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/DumTagConverter.java
deleted file mode 100644
index 455bc85..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/DumTagConverter.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.converter;
-
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class DumTagConverter extends AbstractTagConverter {
-	/**
-	 * @param host 
-	 * @param needBorder 
-	 */
-	public DumTagConverter(Element host, boolean needBorder) {
-		this(host);
-		this.setNeedBorderDecorator(needBorder);
-	}
-
-	/**
-	 * @param host
-	 */
-	public DumTagConverter(Element host) {
-		super(host);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#doConvertRefresh()
-	 */
-	protected Element doConvertRefresh() {
-		Element result = createElement(getHostElement().getTagName());
-		ConverterUtil.copyAllAttributes(getHostElement(), result, null);
-		if (!internalIsWidget(result)) {
-			copyChildren(getHostElement(), result);
-		} else {
-			dumCopyChildren(getHostElement(), result);
-		}
-		return result;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.visualtag.ITagConverter#isMultiLevel()
-	 */
-	public boolean isMultiLevel() {
-		if (isWidget()) {
-			return true;
-		}
-		return false;
-	}
-
-	/**
-	 * @param result
-	 * @return
-	 */
-	private boolean internalIsWidget(Element result) {
-		String tagname = result.getTagName();
-		if (IHTMLConstants.TAG_INPUT.equalsIgnoreCase(tagname)
-				|| IHTMLConstants.TAG_SELECT.equalsIgnoreCase(tagname)
-				|| IHTMLConstants.TAG_TEXTAREA.equalsIgnoreCase(tagname)
-				|| IHTMLConstants.TAG_IMG.equalsIgnoreCase(tagname)
-				|| IHTMLConstants.TAG_OBJECT.equalsIgnoreCase(tagname)
-				|| IHTMLConstants.TAG_HEAD.equalsIgnoreCase(tagname)
-				|| IHTMLConstants.TAG_SCRIPT.equalsIgnoreCase(tagname)
-				|| IHTMLConstants.TAG_LINK.equalsIgnoreCase(tagname)
-				|| IHTMLConstants.TAG_BR.equalsIgnoreCase(tagname)
-				|| IHTMLConstants.TAG_STYLE.equalsIgnoreCase(tagname)
-				|| IHTMLConstants.TAG_HR.equalsIgnoreCase(tagname)) {
-			return true;
-		}
-        return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.visualtag.ITagConverter#isWidget()
-	 */
-	public boolean isWidget() {
-		return internalIsWidget(getResultElement());
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/HTMLStringTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/HTMLStringTagConverter.java
deleted file mode 100644
index 1a3b711..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/HTMLStringTagConverter.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.converter;
-
-import java.io.ByteArrayInputStream;
-import java.io.InputStream;
-
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.jsf.common.ui.internal.utils.ResourceUtils;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.dom.DOMUtil;
-import org.eclipse.wst.sse.core.StructuredModelManager;
-import org.eclipse.wst.sse.core.internal.provisional.IModelManager;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.w3c.dom.Element;
-
-/**
- * For some tag, could generate some XML code.
- * 
- * @author mengbo
- * @version 1.5
- */
-public abstract class HTMLStringTagConverter extends AbstractTagConverter {
-
-	static Logger _log = PDPlugin.getLogger(HTMLStringTagConverter.class);
-
-	/**
-	 * @param host
-	 */
-	public HTMLStringTagConverter(Element host) {
-		super(host);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#doConvertRefresh()
-	 */
-	protected Element doConvertRefresh() {
-		// following are XML implementation. Assume the string is welformed HTML
-		// try
-		// {
-		// String html = getGeneratedHTML();
-		// DocumentBuilder builder =
-		// DocumentBuilderFactory.newInstance().newDocumentBuilder();
-		// Element result = builder.parse(new InputSource(new
-		// StringReader(html))).getDocumentElement();
-		// return (Element)DOMUtil.cloneNodeDeep(this.getDestDocument(),
-		// result);
-		// }
-		// catch(Exception ex)
-		// {
-		// Element temp = createElement("div");
-		// temp.appendChild(createText("ERROR: "+ex.getMessage()));
-		// return temp;
-		// }
-		InputStream stream = null;
-		try {
-			String id = "" + System.currentTimeMillis() + ".html"; //$NON-NLS-1$ //$NON-NLS-2$
-			IModelManager manager = StructuredModelManager.getModelManager();
-			stream = new ByteArrayInputStream(getGeneratedHTML().getBytes());
-			IDOMModel model = (IDOMModel) manager.getModelForRead(id, stream,
-					null);
-			Element root = model.getDocument().getDocumentElement();
-			Element resultEle = (Element) DOMUtil.cloneNodeDeepIgnoreError(
-					getDestDocument(), root);
-			model.releaseFromRead();
-			return resultEle;
-		} catch (Exception ex) {
-			_log.error("Log.Error.HTMLStringTagConverter.Error", ex); //$NON-NLS-1$
-			Element temp = createElement("div"); //$NON-NLS-1$
-			temp.appendChild(createText("Error loading: " + ex.getMessage())); //$NON-NLS-1$
-			return temp;
-		} finally {
-			ResourceUtils.ensureClosed(stream);
-		}
-	}
-
-	/**
-	 * @return the generated HTML string
-	 * @throws Exception
-	 */
-	public abstract String getGeneratedHTML() throws Exception;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isMultiLevel()
-	 */
-	public boolean isMultiLevel() {
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo#isWidget()
-	 */
-	public boolean isWidget() {
-		return true;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/HiddenTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/HiddenTagConverter.java
deleted file mode 100644
index 51a6c1d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/HiddenTagConverter.java
+++ /dev/null
@@ -1,168 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.converter;
-
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * This is for those tags that don't convert to HTML. So they will not display
- * anything in preview, and will display a small icon in designer.
- * 
- * @author mengbo
- * @version 1.5
- */
-public class HiddenTagConverter implements ITagConverter {
-	private Element _hostElement;
-
-    private ILabelProvider         _labelProvider;
-
-	private int _mode;
-
-	/**
-	 * @param host 
-	 * @param labelProvider 
-	 * 
-	 */
-	public HiddenTagConverter(Element host, ILabelProvider labelProvider) {
-		_hostElement = host;
-		//_image = image;
-        _labelProvider = labelProvider;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#setDestDocument(org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument)
-	 */
-	public void setDestDocument(IDOMDocument document) {
-        // do nothing?
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.visualtag.ITagConverter#convertRefresh(java.lang.Object)
-	 */
-	public void convertRefresh(Object context) {
-		// do nothing
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.visualtag.ITagConverter#getHostElement()
-	 */
-	public Element getHostElement() {
-		return _hostElement;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.visualtag.ITagConverter#isVisualByHTML()
-	 */
-	public boolean isVisualByHTML() {
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.visualtag.ITagConverter#getVisualImage()
-	 */
-	public Image getVisualImage() {
-        // defer the creation of the image until it is needed
-		return _labelProvider.getImage(this);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.visualtag.ITagConverter#getResultElement()
-	 */
-	public Element getResultElement() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.visualtag.ITagConverter#getChildModeList()
-	 */
-	public List getChildModeList() {
-		return Collections.EMPTY_LIST;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.visualtag.ITagConverter#getChildVisualPosition(org.w3c.dom.Node)
-	 */
-	public ConvertPosition getChildVisualPosition(Node childModel) {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.visualtag.ITagConverter#isMultiLevel()
-	 */
-	public boolean isMultiLevel() {
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.visualtag.ITagConverter#isWidget()
-	 */
-	public boolean isWidget() {
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.visualtag.ITagConverter#dispose()
-	 */
-	public void dispose() {
-        // do nothing
-        // TODO: dispose of image or Element here?
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#setMode(int)
-	 */
-	public void setMode(int mode) {
-		this._mode = mode;
-	}
-
-	/**
-	 * @return the mode
-	 */
-	public int getMode() {
-		return _mode;
-	}
-
-    public List getNonVisualChildren() {
-        return Collections.EMPTY_LIST;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/HiddenTagConverter2.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/HiddenTagConverter2.java
deleted file mode 100644
index f51af22..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/HiddenTagConverter2.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.converter;
-
-import org.eclipse.jst.pagedesigner.dom.DOMUtil;
-import org.eclipse.swt.graphics.Image;
-import org.w3c.dom.Element;
-
-/**
- * HiddenTagConverter2 is similiar to HiddenTagConverter, with the following
- * difference:
- * 
- * <ol>
- * <li>HiddenTagConverter2 will copy the DOM sub tree to the destination
- * document.</li>
- * </ol>
- * 
- * TODO: this the wrong way to do this.  This should sub-class HiddenTagConverter
- * 
- * @author mengbo
- * @version 1.5
- */
-public class HiddenTagConverter2 extends AbstractTagConverter {
-
-	private Image _image;
-
-	/**
-	 * @param host
-	 * @param image
-	 */
-	public HiddenTagConverter2(Element host, Image image) {
-		super(host);
-		this._image = image;
-	}
-
-	protected Element doConvertRefresh() {
-		return (Element) DOMUtil.cloneNodeDeepIgnoreError(getDestDocument(),
-				getHostElement());
-	}
-
-	public boolean isVisualByHTML() {
-		return false;
-	}
-
-	public Image getVisualImage() {
-		return _image;
-	}
-
-	public boolean isMultiLevel() {
-		return true;
-	}
-
-	public boolean isWidget() {
-		return true;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/IConverterFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/IConverterFactory.java
deleted file mode 100644
index f8aebf2..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/IConverterFactory.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.converter;
-
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public interface IConverterFactory {
-	/**
-	 * indicates designer mode 
-	 */
-	public static final int MODE_DESIGNER = 0;
-
-	/**
-	 * indicates preview mode
-	 */
-	public static final int MODE_PREVIEW = 1;
-
-	/**
-	 * 
-	 * @param element
-	 * @param mode 
-	 * @return null if this factory don't support this element
-	 */
-	public ITagConverter createConverter(Element element, int mode);
-
-	/**
-	 * get the URI namespace that this factory support. "null" means this
-	 * factory can be used as default factory.
-	 * 
-	 * @return null if this factory don't have a specific URI to support.
-	 */
-	public String getSupportedURI();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/IDOMFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/IDOMFactory.java
deleted file mode 100644
index 3e3d374..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/IDOMFactory.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.converter;
-
-import org.w3c.dom.Element;
-import org.w3c.dom.Text;
-
-/**
- * Factory interface. AbstractTagConverter will implement it.
- * 
- * @author mengbo
- * @version 1.5
- */
-public interface IDOMFactory {
-	/**
-	 * create element
-	 * 
-	 * @param tag
-	 * @return a new element using tag as its name
-	 */
-	public Element createElement(String tag);
-
-	/**
-	 * create text node
-	 * 
-	 * @param content
-	 * @return a new text node using content as its body
-	 */
-	public Text createText(String content);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/ITagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/ITagConverter.java
deleted file mode 100644
index b5aea53..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/ITagConverter.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.converter;
-
-import java.util.List;
-
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * ITagConverter is used to convert a custom tag to a HTML tag. Each
- * ITagConverter instance will be dedicated to a single custom tag element.
- * 
- * @author mengbo
- * @version 1.5
- */
-public interface ITagConverter {
-	/**
-	 * Set the target document where the converted node should belong to.
-	 * 
-	 * @param document
-	 */
-	public void setDestDocument(IDOMDocument document);
-
-	/**
-	 * refresh the internal state of this ITagConverter. This method normally is
-	 * called when the host element change.
-	 * 
-	 * @param context
-	 */
-	public void convertRefresh(Object context);
-
-	/**
-	 * @return The host element being converted.
-	 */
-	public Element getHostElement();
-
-	/**
-	 * for some tags, they don't convert to HTML. In that case, this method
-	 * should return false for them. And if this method return false, then
-	 * should return an image in <code>getVisualImage()</code> for displaying
-	 * in the designer.
-	 * 
-	 * @return true if the tag represents something that will be rendered visually at runtime
-	 */
-	public boolean isVisualByHTML();
-
-	/**
-	 * if isVisualByHTML() return false, then this method should return an image
-	 * to be displayed in designer.
-	 * 
-	 * Normally this image will be a shared image for those hidden elements. It
-	 * is this class's responsibility to dispose the image if the image is not a
-	 * shared one.
-	 * 
-	 * @return the placeholder image for non-visual tags
-	 */
-	public Image getVisualImage();
-
-	/**
-	 * @return the result element after conversion
-	 */
-	public Element getResultElement();
-
-	/**
-	 * @return the list of children that should be continuely converted.
-	 */
-	public List getChildModeList();
-    
-    /**
-     * @return a list of Element tags that map to non-visual children
-     * Type should be always be Element.
-     */
-    public List getNonVisualChildren();
-
-	/**
-	 * For child nodes that need further convert, return their position in the
-	 * converted DOM tree.
-	 * 
-	 * @param childModel
-	 * @return the position of child nodes
-	 */
-	public ConvertPosition getChildVisualPosition(Node childModel);
-
-	/**
-	 * When the convert result in multi-level element. If this method return
-	 * false, then the caller should not use child nodes of
-	 * <code>getHostElement()</code>
-	 * 
-	 * @return true if the host element has convertable children
-	 */
-	public boolean isMultiLevel();
-
-	/**
-	 * 
-	 * @return true if the host element is a widget
-	 */
-	public boolean isWidget();
-
-	/**
-	 * API contract needed here
-	 * 
-	 */
-	public void dispose();
-
-	/**
-	 * @param mode
-	 */
-	public void setMode(int mode);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/JSFConverterUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/JSFConverterUtil.java
deleted file mode 100644
index abfacda..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/JSFConverterUtil.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.converter;
-
-import java.util.Arrays;
-import java.util.List;
-import java.util.Set;
-
-import org.w3c.dom.Attr;
-import org.w3c.dom.Element;
-import org.w3c.dom.NamedNodeMap;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class JSFConverterUtil {
-	private static List NamedBooleanList = Arrays.asList(new String[] {
-			"disabled", "readonly", "ismap" }); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-
-	/**
-	 * 
-	 * @param source
-	 * @param dest
-	 * @param ignore
-	 */
-	public static void copyAllAttributes(Element source, Element dest,
-			Set ignore) {
-		NamedNodeMap attrs = source.getAttributes();
-		for (int i = 0, size = attrs.getLength(); i < size; i++) {
-			Attr attr = (Attr) attrs.item(i);
-			if (ignore == null || !ignore.contains(attr.getName())) {
-				if (NamedBooleanList.contains(attr.getName())
-						&& "false".equalsIgnoreCase(attr.getValue())) { //$NON-NLS-1$
-					continue;
-				}
-				dest.setAttribute(attr.getName(), attr.getValue());
-			}
-		}
-	}
-
-	/**
-	 * copy a single attribute (if exist)
-	 * 
-	 * @param source
-	 * @param srcattr
-	 * @param dest
-	 * @param destattr
-	 */
-	public static void copyAttribute(Element source, String srcattr,
-			Element dest, String destattr) {
-		Attr attr = source.getAttributeNode(srcattr);
-		if (attr != null) {
-			dest.setAttribute(destattr, attr.getValue());
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/PreferenceReader.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/PreferenceReader.java
deleted file mode 100644
index ea9dc4e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/PreferenceReader.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.converter;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class PreferenceReader {
-	/**
-	 * expression type
-	 */
-	public final static int FULL_EXPRESSION_TYPE = 0;
-
-    /**
-     * expression type
-     */
-	public final static int LAST_EXPRESSION_TYPE = 1;
-
-    /**
-     * expression type
-     */
-	public final static int REAL_VALUE_TYPE = 2;
-
-	/**
-	 * @return the map value type
-	 */
-	public static int getMapValueType() {
-		return LAST_EXPRESSION_TYPE;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/TagConverterToDumBlock.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/TagConverterToDumBlock.java
deleted file mode 100644
index 619875d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/TagConverterToDumBlock.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.converter;
-
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TagConverterToDumBlock extends AbstractTagConverter {
-
-	/**
-	 * @param host
-	 */
-	public TagConverterToDumBlock(Element host) {
-		super(host);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#doConvertRefresh()
-	 */
-	protected Element doConvertRefresh() {
-		Element result = createElement(IHTMLConstants.TAG_DIV);
-		copyChildren(getHostElement(), result);
-		return result;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isMultiLevel()
-	 */
-	public boolean isMultiLevel() {
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo#isWidget()
-	 */
-	public boolean isWidget() {
-		return false;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/TagConverterToInlineBlock.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/TagConverterToInlineBlock.java
deleted file mode 100644
index aec787e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/TagConverterToInlineBlock.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.converter;
-
-import org.w3c.dom.Element;
-
-/**
- * This converter can be used simply convert the tag to inline div, and copy all
- * the children
- * 
- * NOTE: It behave almost same as "span". In fact, we may remove this later, if
- * our css engine support "minWidth"/"minHeight" for inline element.
- * 
- * NOTE: it will not copy attributes!
- * 
- * @author mengbo
- * @version 1.5
- * @see org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo#getMinHeight()
- * @see org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo#getMinWidth()
- */
-public class TagConverterToInlineBlock extends AbstractTagConverter {
-	private int displayMode;
-
-	/**
-	 * @param host
-	 * @param mode
-	 */
-	public TagConverterToInlineBlock(Element host, int mode) {
-		super(host);
-		this.displayMode = mode;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#doConvertRefresh()
-	 */
-	protected Element doConvertRefresh() {
-		Element result = null;
-		if (displayMode == IConverterFactory.MODE_PREVIEW) {
-			result = createElement("span"); //$NON-NLS-1$
-			copyChildren(getHostElement(), result);
-		} else {
-			result = createElement("div"); //$NON-NLS-1$
-			result
-					.setAttribute(
-							"style", //$NON-NLS-1$
-							"display:inline-block; border-width:0; margin:0; min-width:1.2em;min-height:1.2em;"); //$NON-NLS-1$
-			copyChildren(getHostElement(), result);
-		}
-		return result;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isMultiLevel()
-	 */
-	public boolean isMultiLevel() {
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isWidget()
-	 */
-	public boolean isWidget() {
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/TagConverterToSpan.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/TagConverterToSpan.java
deleted file mode 100644
index 8a05f56..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/TagConverterToSpan.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.converter;
-
-import org.w3c.dom.Element;
-
-/**
- * This converter can be used simply convert the tag to span, and copy all the
- * children
- * 
- * NOTE: it will not copy attributes!
- * 
- * @author mengbo
- * @version 1.5
- */
-public class TagConverterToSpan extends AbstractTagConverter {
-
-	/**
-	 * @param host
-	 */
-	public TagConverterToSpan(Element host) {
-		super(host);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#doConvertRefresh()
-	 */
-	protected Element doConvertRefresh() {
-		// Register a named facet on the UIComponent associated with the
-		// closest parent UIComponent custom action.
-		// we'll render facet as a inline flow figure. so treat it as simple
-		// <span> here.
-		Element result = createElement("span"); //$NON-NLS-1$
-		copyChildren(getHostElement(), result);
-		return result;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isMultiLevel()
-	 */
-	public boolean isMultiLevel() {
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isWidget()
-	 */
-	public boolean isWidget() {
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/html/ATagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/html/ATagConverter.java
deleted file mode 100644
index 8f1ebca..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/html/ATagConverter.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.converter.html;
-
-import org.eclipse.jst.pagedesigner.converter.ConverterUtil;
-import org.eclipse.jst.pagedesigner.converter.DumTagConverter;
-import org.w3c.dom.Element;
-import org.w3c.dom.Text;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ATagConverter extends DumTagConverter {
-	private boolean _emptyContainer = false;
-
-	/**
-	 * @param host
-	 */
-	public ATagConverter(Element host) {
-		super(host);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#doConvertRefresh()
-	 */
-	protected Element doConvertRefresh() {
-		_emptyContainer = ConverterUtil.isEmptyContainer(getHostElement());
-		if (_emptyContainer) {
-			Element resultEle = createElement("a"); //$NON-NLS-1$
-			ConverterUtil.copyAllAttributes(getHostElement(), resultEle, null);
-			Text fakedNode = createText("link"); //$NON-NLS-1$
-			resultEle.appendChild(fakedNode);
-			return resultEle;
-		}
-        return super.doConvertRefresh();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#needBorderDecorator()
-	 */
-	public boolean needBorderDecorator() {
-		return _emptyContainer;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isMultiLevel()
-	 */
-	public boolean isMultiLevel() {
-		return _emptyContainer;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo#isWidget()
-	 */
-	public boolean isWidget() {
-		return _emptyContainer;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/html/HTMLConverterFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/html/HTMLConverterFactory.java
deleted file mode 100644
index de2a907..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/html/HTMLConverterFactory.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.converter.html;
-
-import org.eclipse.jst.jsf.common.ui.JSFUICommonPlugin;
-import org.eclipse.jst.jsf.common.ui.internal.utils.JSFSharedImages;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.converter.AbstractTagConverter;
-import org.eclipse.jst.pagedesigner.converter.DumDescriptionTagConverter;
-import org.eclipse.jst.pagedesigner.converter.DumTagConverter;
-import org.eclipse.jst.pagedesigner.converter.HiddenTagConverter2;
-import org.eclipse.jst.pagedesigner.converter.IConverterFactory;
-import org.eclipse.jst.pagedesigner.converter.ITagConverter;
-import org.eclipse.jst.pagedesigner.utils.HTMLUtil;
-import org.eclipse.swt.graphics.Image;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class HTMLConverterFactory implements IConverterFactory {
-
-	/**
-	 * the constructor
-	 */
-	public HTMLConverterFactory() {
-		super();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.IConverterFactory#createConverter(org.w3c.dom.Element)
-	 */
-	public ITagConverter createConverter(Element element, int mode) {
-		String tagName = element.getLocalName();
-
-		if (mode == MODE_PREVIEW) {
-			return new DumTagConverter(element);
-		}
-		if (!HTMLUtil.isVisualHtmlElement(tagName)) {
-			return new HiddenTagConverter2(element, getUnknownImage());
-		}
-
-		AbstractTagConverter c;
-		if (IHTMLConstants.TAG_TABLE.equalsIgnoreCase(tagName)) {
-			c = new TableTagConverter(element);
-		} else if (IHTMLConstants.TAG_A.equalsIgnoreCase(tagName)) {
-			c = new ATagConverter(element);
-		} else if (IHTMLConstants.TAG_FORM.equalsIgnoreCase(tagName)) {
-			// for those HTML tag that we want to build a border decorator,
-			// should
-			// go there.
-			c = new DumTagConverter(element, true);
-		} else if (IHTMLConstants.TAG_HTML.equalsIgnoreCase(tagName)
-				|| IHTMLConstants.TAG_BODY.equalsIgnoreCase(tagName)) {
-			c = new DumDescriptionTagConverter(element);
-			c.setNeedBorderDecorator(true);
-		} else {
-			c = new DumTagConverter(element);
-		}
-		c.setMode(mode);
-		return c;
-	}
-
-	private static Image getUnknownImage() {
-		return JSFUICommonPlugin.getDefault().getImage(
-				JSFSharedImages.DEFAULT_PALETTE_TAG_IMG);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.IConverterFactory#getSupportedURI()
-	 */
-	public String getSupportedURI() {
-		return ITLDConstants.URI_HTML;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/html/TableTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/html/TableTagConverter.java
deleted file mode 100644
index eaf1928..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/html/TableTagConverter.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.converter.html;
-
-import org.eclipse.jst.pagedesigner.converter.AbstractTagConverter;
-import org.eclipse.jst.pagedesigner.converter.ConverterUtil;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- */
-public class TableTagConverter extends AbstractTagConverter {
-	/**
-	 * @param host
-	 */
-	public TableTagConverter(Element host) {
-		super(host);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#doConvertRefresh()
-	 */
-	protected Element doConvertRefresh() {
-		Element result = createElement(getHostElement().getTagName());
-		ConverterUtil.copyAllAttributes(getHostElement(), result, null);
-		copyChildren(getHostElement(), result);
-		return result;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isMultiLevel()
-	 */
-	public boolean isMultiLevel() {
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo#isWidget()
-	 */
-	public boolean isWidget() {
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#needTableDecorator()
-	 */
-	public boolean needTableDecorator() {
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#needBorderDecorator()
-	 */
-	public boolean needBorderDecorator() {
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/jsp/IncludeTagConverterPreview.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/jsp/IncludeTagConverterPreview.java
deleted file mode 100644
index 4dd5e85..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/jsp/IncludeTagConverterPreview.java
+++ /dev/null
@@ -1,206 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.converter.jsp;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.converter.AbstractTagConverter;
-import org.eclipse.jst.pagedesigner.jsp.core.internal.pagevar.DocumentPageVariableAdapter;
-import org.eclipse.jst.pagedesigner.jsp.core.pagevar.adapter.PageVariableAdapterFactory;
-import org.eclipse.jst.pagedesigner.preview.PageExpressionContext;
-import org.eclipse.jst.pagedesigner.preview.PreviewConvertContext;
-import org.eclipse.wst.sse.core.StructuredModelManager;
-import org.eclipse.wst.sse.core.internal.util.URIResolver;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * This is the tag converter for preview.
- * 
- * @author mengbo
- * @version 1.5
- */
-public class IncludeTagConverterPreview extends AbstractTagConverter {
-	private static Logger _log = PDPlugin
-			.getLogger(IncludeTagConverterPreview.class);
-
-	private String _fileAttrName;
-
-	/**
-	 * @param host
-	 * @param fileAttrname 
-	 */
-	public IncludeTagConverterPreview(Element host, String fileAttrname) {
-		super(host);
-		this._fileAttrName = fileAttrname;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#doConvertRefresh()
-	 */
-	protected Element doConvertRefresh() {
-		String fileName = getResolvedURL(getHostElement(), this._fileAttrName);
-		if (fileName == null || fileName.length() == 0) {
-			return null;
-		}
-        IPath includedPath = new Path(fileName);
-        includedPath.makeAbsolute();
-
-        IFile file = getFile(includedPath);
-        if (file == null) {
-        	return null;
-        }
-        return previewFile(file);
-	}
-
-	/**
-	 * @param includedPath
-	 * @return the IFile corresponding to the IPath
-	 */
-	public IFile getFile(IPath includedPath) {
-		IWorkspaceRoot workspaceRoot = ResourcesPlugin.getWorkspace().getRoot();
-		IProject[] projects = workspaceRoot.getProjects();
-
-		for (int i = 0, length = projects.length; i < length; i++) {
-			IPath path = projects[i].getLocation();
-			path = path.makeAbsolute();
-			if (path != null && path.isPrefixOf(includedPath)) {
-				// -1 so we still have the project path
-				includedPath = includedPath.removeFirstSegments(path
-						.segmentCount() - 1);
-				return ResourcesPlugin.getWorkspace().getRoot().getFile(
-						includedPath);
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * @param file
-	 * @return the Element
-	 */
-	public Element previewFile(IFile file) {
-		IDOMModel xmlModel = null;
-		DocumentPageVariableAdapter provider = null;
-		boolean pushedPageVarProvider = false;
-		try {
-
-			xmlModel = (IDOMModel) StructuredModelManager.getModelManager().getModelForRead(
-					file);
-			if (xmlModel != null) {
-				IDOMDocument doc = xmlModel.getDocument();
-
-				// XXX: need to also register page variable adapters. In the
-				// future, this should go to some
-				// SSE system registry mechanism.
-				xmlModel.getFactoryRegistry().addFactory(
-						new PageVariableAdapterFactory());
-				provider = new DocumentPageVariableAdapter(doc);
-				doc.addAdapter(provider);
-
-				provider.refresh();
-				PageExpressionContext.getCurrent()
-						.pushPageVarProvider(provider);
-
-				Node child = xmlModel.getDocument().getFirstChild();
-				PreviewConvertContext context = new PreviewConvertContext(this
-						.getDestDocument());
-				List results = new ArrayList();
-				while (child != null) {
-					Node node = context.previewConvert(child);
-					if (node != null) {
-						results.add(node);
-					}
-					child = child.getNextSibling();
-				}
-
-				if (results.size() == 0) {
-					return null;
-				} else if (results.size() == 1
-						&& results.get(0) instanceof Element) {
-					return (Element) results.get(0);
-				} else {
-					Element ret = createElement(IHTMLConstants.TAG_SPAN);
-					for (int i = 0, n = results.size(); i < n; i++) {
-						ret.appendChild((Node) results.get(i));
-					}
-					return ret;
-				}
-			}
-		} catch (CoreException e) {
-			_log.error("PreviewUtil.previewFile.CoreException", e); //$NON-NLS-1$
-		} catch (IOException e) {
-			_log.error("PreviewUtil.previewFile.IOException", e); //$NON-NLS-1$
-		} catch (Exception ex) {
-			_log.error("PreviewUtil.previewFile.CoreException", ex); //$NON-NLS-1$
-		} finally {
-			if (pushedPageVarProvider) {
-				PageExpressionContext.getCurrent().popPageVarProvider(provider);
-			}
-			if (xmlModel != null) {
-				xmlModel.releaseFromRead();
-			}
-		}
-		return null;
-	}
-
-	static String getResolvedURL(Element element, String attrName) {
-		URIResolver resolver = null;
-		if (element instanceof IDOMNode) {
-            // TODO: the new URI resolver is not available on the IStructuredModel
-			resolver = ((IDOMNode) element).getModel().getResolver();
-		}
-		if (null == resolver) {
-			return null;
-		}
-		String src = element.getAttribute(attrName);
-		if (src != null && src.length() > 0) {
-			return resolver.getLocationByURI(src);
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isMultiLevel()
-	 */
-	public boolean isMultiLevel() {
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo#isWidget()
-	 */
-	public boolean isWidget() {
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/jsp/JSPConverterFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/jsp/JSPConverterFactory.java
deleted file mode 100644
index 5d1844f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/jsp/JSPConverterFactory.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.converter.jsp;
-
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IStructuredDocumentContextResolverFactory;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IWorkspaceContextResolver;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContextFactory2;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.converter.HiddenTagConverter;
-import org.eclipse.jst.pagedesigner.converter.IConverterFactory;
-import org.eclipse.jst.pagedesigner.converter.ITagConverter;
-import org.eclipse.jst.pagedesigner.converter.TagConverterToDumBlock;
-import org.eclipse.jst.pagedesigner.editors.palette.TagImageManager;
-import org.eclipse.jst.pagedesigner.jsp.core.IJSPCoreConstants;
-import org.eclipse.swt.graphics.Image;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class JSPConverterFactory implements IConverterFactory {
-    private final ILabelProvider  _labelProvider;
-    
-	/**
-	 * 
-	 */
-	public JSPConverterFactory() {
-        _labelProvider = new MyLabelProvider();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.IConverterFactory#createConverter(org.w3c.dom.Element)
-	 */
-	public ITagConverter createConverter(Element element, int mode) {
-		String tagName = element.getLocalName();
-
-		if (mode == IConverterFactory.MODE_PREVIEW) {
-			// we want to generate the included page in preview, so
-			// handle differently
-			if (IJSPCoreConstants.TAG_INCLUDE.equalsIgnoreCase(tagName)) {
-				IncludeTagConverterPreview c = new IncludeTagConverterPreview(
-						element, "page"); //$NON-NLS-1$
-				c.setMode(mode);
-				return c;
-			} else if (IJSPCoreConstants.TAG_DIRECTIVE_INCLUDE
-					.equalsIgnoreCase(tagName)) {
-				IncludeTagConverterPreview c = new IncludeTagConverterPreview(
-						element, "file"); //$NON-NLS-1$
-				c.setMode(mode);
-				return c;
-			} else if (IJSPCoreConstants.TAG_ROOT.equalsIgnoreCase(tagName)) {
-				TagConverterToDumBlock c = new TagConverterToDumBlock(element);
-				c.setNeedBorderDecorator(true);
-				c.setMode(mode);
-				return c;
-			} else {
-				return new HiddenTagConverter(element, _labelProvider);
-			}
-		}
-        if (IJSPCoreConstants.TAG_ROOT.equalsIgnoreCase(tagName)) {
-        	TagConverterToDumBlock c = new TagConverterToDumBlock(element);
-        	c.setNeedBorderDecorator(true);
-        	c.setMode(mode);
-        	return c;
-        }
-        return new HiddenTagConverter(element, _labelProvider);
-	}
-    
-    private static class MyLabelProvider extends org.eclipse.jface.viewers.LabelProvider
-    {
-
-        public Image getImage(Object element) 
-        {
-            if (element instanceof ITagConverter)
-            {
-                final Element hostElement = ((ITagConverter)element).getHostElement();
-                IStructuredDocumentContext context = IStructuredDocumentContextFactory2.INSTANCE.getContext(hostElement);
-                if (context != null){                	
-                	IWorkspaceContextResolver wsResolver  = IStructuredDocumentContextResolverFactory.INSTANCE.getWorkspaceContextResolver(context);
-                	if (wsResolver != null){
-                		return TagImageManager.getInstance().getSmallIconImage(wsResolver.getProject(),"JSP11", ITLDConstants.URI_JSP + ":"+hostElement.getLocalName()); //$NON-NLS-1$ //$NON-NLS-2$
-                	}
-                }
-            }
-            
-            return null;
-        }
-    }
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.IConverterFactory#getSupportedURI()
-	 */
-	public String getSupportedURI() {
-		return ITLDConstants.URI_JSP;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/package-info.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/package-info.java
deleted file mode 100644
index d74c9f9..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/package-info.java
+++ /dev/null
@@ -1,18 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-/**
- * Tag conversion framework. 
- * 
- * <p><b>Provisional API - subject to change</b></p>
- */
-package org.eclipse.jst.pagedesigner.converter;
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/CSSTempUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/CSSTempUtil.java
deleted file mode 100644
index 34ef432..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/CSSTempUtil.java
+++ /dev/null
@@ -1,166 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.dtresourceprovider.DTSkinManager;
-import org.eclipse.jst.pagedesigner.dtresourceprovider.IDTSkin;
-import org.eclipse.wst.css.core.internal.provisional.adapters.IStyleSheetAdapter;
-import org.eclipse.wst.css.core.internal.provisional.adapters.IStyleSheetListAdapter;
-import org.eclipse.wst.html.core.internal.provisional.HTML40Namespace;
-import org.eclipse.wst.sse.core.internal.provisional.INodeAdapter;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.stylesheets.StyleSheet;
-import org.w3c.dom.stylesheets.StyleSheetList;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public final class CSSTempUtil {
-	/**
-	 * the default implementation of (IStyleSheetListAdapter)
-	 * docnotifier.getAdapterFor(IStyleSheetListAdapter.class) will only get
-	 * those style tags under certain tags like "html", "head", etc.
-	 * 
-	 * But datawindow is generating style tag and is not putting them into
-	 * "head". So we can't handle them using the default SSE mechanism.
-	 * 
-	 * We have another problem: currently the converted element is also using
-	 * the original document, not generating another document, and these
-	 * elements is not really adding into the document, so they can't be reached
-	 * from the document.
-	 * 
-	 * @param element
-	 * @return the list
-	 * see org.eclipse.wst.html.core.htmlcss.HTMLDocumentAdapter#addStyleSheet(org.w3c.dom.Element)
-	 */
-	public static List getStyleSheets(Element element) {
-		List styleSheets = new ArrayList();
-		INodeNotifier docnotifier = (INodeNotifier) element.getOwnerDocument();
-		IStyleSheetListAdapter adapter = (IStyleSheetListAdapter) docnotifier
-				.getAdapterFor(IStyleSheetListAdapter.class);
-
-		StyleSheetList ssl = (adapter == null ? null : adapter.getStyleSheets());
-
-		if (ssl != null) {
-			for (int i = 0, numStyles = ssl.getLength(); i < numStyles; i++) {
-				// loop for styles (<style> and <link>)
-				org.w3c.dom.stylesheets.StyleSheet ss = ssl.item(i);
-				styleSheets.add(ss);
-			}
-		}
-
-		// now is our work-around part for support datawindow.
-		Node parent = element.getParentNode();
-		Element rootEle = element;
-		while (parent != null && parent instanceof Element) {
-			rootEle = (Element) parent;
-			parent = parent.getParentNode();
-		}
-		addStyleSheet(rootEle, styleSheets);
-
-		//add stylesheets from any active IDTSkin instances
-		if (element instanceof IDOMNode) {
-			List<IDTSkin> dtSkins =
-				DTSkinManager.getInstance((IDOMNode)element).getCurrentSkins();
-			for (IDTSkin dtSkin: dtSkins) {
-				if (dtSkin != null) {
-					styleSheets.addAll(dtSkin.getStyleSheets());
-				}
-			}
-		}
-
-		return styleSheets;
-	}
-
-	/**
-	 */
-	private static void addStyleSheet(Element node, List result) {
-		IDOMElement element = (IDOMElement) node;
-		String tagName = element.getTagName();
-		if (tagName == null) {
-			return;
-		}
-		boolean isContainer = false;
-
-		if (element.isCommentTag()) {
-			Node parent = element.getParentNode();
-			if (parent == element.getOwnerDocument()) {
-				// This condition is too severe, actually do not work for JSF
-				// template.
-				// But above (! globalTag() && isContainer()) cover JSF template
-				// + tpl template
-				isContainer = true;
-			} else if (parent.getNodeType() == Node.ELEMENT_NODE) {
-				tagName = ((Element) parent).getTagName();
-				if (tagName != null
-						&& tagName
-								.equalsIgnoreCase(HTML40Namespace.ElementName.HEAD)) {
-					isContainer = true;
-				}
-			}
-		} else {
-			INodeNotifier notifier = element;
-
-			// (lium) Increase performance: since this method is called tooooo
-			// many times,
-			// and getAdapterFor() is slow, so add a check on the tagName to
-			// filter
-			// those stylesheet stuff first.
-			if (IHTMLConstants.TAG_LINK.equalsIgnoreCase(tagName)
-					|| IHTMLConstants.TAG_STYLE.equalsIgnoreCase(tagName)) {
-				INodeAdapter adapter = notifier
-						.getAdapterFor(IStyleSheetAdapter.class);
-				if (adapter instanceof IStyleSheetAdapter) {
-                    // XXX: see bug 171740.  This is a (hopefully) temporary
-                    // workaround that avoids having the call to getSheet throw an NPE
-                    IStyleSheetAdapter sheetAdapter = (IStyleSheetAdapter) adapter;
-                    if (sheetAdapter.getElement() != null
-                            && "text/css".equals(sheetAdapter.getElement().getAttribute(HTML40Namespace.ATTR_NAME_TYPE))) //$NON-NLS-1$
-
-                    {
-    					StyleSheet sheet = ((IStyleSheetAdapter) adapter)
-    							.getSheet();
-                        
-                        if (sheet != null)
-                        {
-                            result.add(sheet);
-                        }
-                    }
-				}
-			}
-
-			isContainer = true;
-		}
-		if (isContainer) {
-			for (Node child = element.getFirstChild(); child != null; child = child
-					.getNextSibling()) {
-				if (child.getNodeType() != Node.ELEMENT_NODE)
-					continue;
-				addStyleSheet((Element) child, result);
-			}
-		}
-	}
-	
-	private CSSTempUtil()
-	{
-	    //  util class, no instantiation
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/CSSUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/CSSUtil.java
deleted file mode 100644
index 6d1cdad..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/CSSUtil.java
+++ /dev/null
@@ -1,252 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.UnsupportedEncodingException;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.jsf.common.ui.internal.utils.ResourceUtils;
-import org.eclipse.jst.pagedesigner.IJMTConstants;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.css2.font.CSSFont;
-import org.eclipse.jst.pagedesigner.css2.style.DefaultStyle;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.wst.css.core.internal.provisional.adapters.IStyleSheetListAdapter;
-import org.eclipse.wst.css.core.internal.provisional.document.ICSSModel;
-import org.eclipse.wst.css.core.internal.provisional.document.ICSSNode;
-import org.eclipse.wst.css.core.internal.util.CSSClassTraverser;
-import org.eclipse.wst.html.core.internal.htmlcss.CSSQueryTraverser;
-import org.eclipse.wst.sse.core.StructuredModelManager;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.css.CSSStyleDeclaration;
-import org.w3c.dom.stylesheets.StyleSheet;
-import org.w3c.dom.stylesheets.StyleSheetList;
-
-/**
- * @author mengbo
- */
-public class CSSUtil {
-	private static StyleSheet _userAgentDefault;
-
-	/**
-	 * @param doc
-	 * @return the css classes
-	 */
-	public static String[] getCSSClasses(Document doc) {
-		Collection c = Collections.EMPTY_SET;
-		if (doc instanceof INodeNotifier) {
-			IStyleSheetListAdapter adapter = (IStyleSheetListAdapter) ((INodeNotifier) doc)
-					.getAdapterFor(IStyleSheetListAdapter.class);
-			StyleSheetList ssl = (adapter == null ? null : adapter
-					.getStyleSheets());
-
-			CSSClassTraverser traverser = new CSSClassTraverser();
-			if (ssl != null) {
-				for (int i = 0, numStyles = ssl.getLength(); i < numStyles; i++) {
-					// loop for styles (<style> and <link>)
-					org.w3c.dom.stylesheets.StyleSheet ss = ssl.item(i);
-
-					try {
-						traverser.apply((ICSSNode) ss);
-					} catch (ClassCastException ex) {
-						Logger log = PDPlugin
-								.getLogger(CSSStyleDeclaration.class);
-						log.error("Error.CSSUtil.0", ex); //$NON-NLS-1$
-						// FIXME: should this continue to be processed?
-					}
-				}
-				c = traverser.getClassNames();
-			}
-		}
-		String[] result = new String[c.size()];
-		c.toArray(result);
-		return result;
-	}
-
-	/**
-	 * Get the css style of a node.
-	 * 
-	 * @param node
-	 * @return the style
-	 */
-	public static ICSSStyle getCSSStyle(Element node) {
-		ICSSStyle style = null;
-		if (node instanceof IDOMElement) {
-			style = (ICSSStyle) ((IDOMElement) node)
-					.getAdapterFor(ICSSStyle.class);
-		}
-		if (style == null) {
-			return DefaultStyle.getInstance();
-		}
-        return style;
-	}
-
-	/**
-	 * Resolve the css style string from css style elements.
-	 * 
-	 * @param style
-	 * @return the style string
-	 */
-	public static String resolveCSSStyle(ICSSStyle style) {
-		StringBuffer sb = new StringBuffer();
-		Object object1 = style.getColor();
-		if (object1 instanceof Color) {
-			sb.append("color:"); //$NON-NLS-1$
-
-			sb.append("#").append( //$NON-NLS-1$
-					Integer.toHexString(((Color) object1).getRed()));
-			sb.append("#").append( //$NON-NLS-1$
-					Integer.toHexString(((Color) object1).getGreen()));
-			sb.append("#").append( //$NON-NLS-1$
-					Integer.toHexString(((Color) object1).getBlue()));
-			sb.append(";"); //$NON-NLS-1$
-		}
-		Object object2 = style.getCSSFont();
-		if (object2 instanceof CSSFont) {
-			sb.append(((CSSFont) object2).getCSSString());
-		}
-		return sb.toString();
-	}
-
-	/**
-	 * Many of this method implementation copied from HTMLDocumentAdapter,
-	 * mainly add support for user agent default style sheet.
-	 * 
-	 * @param element
-	 *            the element.
-	 * @param pseudoName
-	 *            the pseudoname of the element
-	 * @return the style declaration
-	 */
-	public static CSSStyleDeclaration getCSSDeclaration(Element element,
-			String pseudoName) {
-		// please reference comments in CSSTempUtil.
-		List styleSheets = CSSTempUtil.getStyleSheets(element);
-		// INodeNotifier docnotifier = (INodeNotifier)
-		// element.getOwnerDocument();
-		// IStyleSheetListAdapter adapter = (IStyleSheetListAdapter)
-		// docnotifier.getAdapterFor(IStyleSheetListAdapter.class);
-		//
-		// StyleSheetList ssl = (adapter == null ? null :
-		// adapter.getStyleSheets());
-
-		CSSQueryTraverser query = new CSSQueryTraverser();
-		query.setTraverseImported(true);
-		query.setTraverseImportFirst(true);
-		query.setElement(element, pseudoName);
-
-		// if (ssl != null)
-		// {
-		// for (int i = 0, numStyles = ssl.getLength(); i < numStyles; i++)
-		// {
-		// // loop for styles (<style> and <link>)
-		// org.w3c.dom.stylesheets.StyleSheet ss = ssl.item(i);
-		if (styleSheets != null) {
-			for (int i = 0, numStyles = styleSheets.size(); i < numStyles; i++) {
-				StyleSheet ss = (StyleSheet) styleSheets.get(i);
-				try {
-					query.apply((ICSSNode) ss);
-				} catch (ClassCastException ex) {
-					Logger log = PDPlugin.getLogger(CSSStyleDeclaration.class);
-					log.error("Error.CSSUtil.0", ex); //$NON-NLS-1$
-					// FIXME: should this continue to be processed?
-				}
-			}
-		}
-		CSSStyleDeclaration declare = query.getDeclaration();
-		// FIXME: when do we need to apply the user agent style sheet?
-		return declare;
-	}
-
-	/**
-	 * Many of this method implementation copied from HTMLDocumentAdapter,
-	 * mainly add support for user agent default style sheet.
-	 * 
-	 * @param element
-	 *            the element.
-	 * @param pseudoName
-	 *            the pseudoname of the element
-	 * @return the style declaration
-	 */
-	public static CSSStyleDeclaration getDefaultCSSDeclaration(Element element,
-			String pseudoName) {
-		CSSQueryTraverser query = new CSSQueryTraverser();
-		query.setTraverseImported(true);
-		query.setTraverseImportFirst(true);
-
-		query.setElement(element, pseudoName);
-
-		// FIXME: when do we need to apply the user agent style sheet?
-		try {
-			getUserAgentDefaultStyleSheet(element);
-		} catch (UnsupportedEncodingException e) {
-			Logger log = PDPlugin.getLogger(CSSStyleDeclaration.class);
-			log.error("Error.CSSUtil.1", e); //$NON-NLS-1$
-		} catch (IOException e) {
-			Logger log = PDPlugin.getLogger(CSSStyleDeclaration.class);
-			log.error("Error.CSSUtil.2", e); //$NON-NLS-1$
-		}
-		if (_userAgentDefault != null) {
-			try {
-				query.apply((ICSSNode) _userAgentDefault);
-			} catch (ClassCastException ex) {
-				Logger log = PDPlugin.getLogger(CSSStyleDeclaration.class);
-				log.error("Error.CSSUtil.3", ex); //$NON-NLS-1$
-			}
-		}
-		CSSStyleDeclaration declare = query.getDeclaration();
-		return declare;
-	}
-
-	/**
-	 * Get the user agent default style sheet.
-	 * 
-	 * @param element
-	 * @return
-	 * @throws IOException
-	 * @throws UnsupportedEncodingException
-	 */
-	// XXX: in the future, we may get user agent default style sheet based on
-	// device type.
-	private static StyleSheet getUserAgentDefaultStyleSheet(Element element)
-			throws UnsupportedEncodingException, IOException {
-		if (_userAgentDefault == null) {
-			InputStream input = null;
-			
-			try
-			{
-				input = CSSUtil.class
-					.getResourceAsStream(IJMTConstants.USERAGENT);
-				IStructuredModel model = StructuredModelManager.getModelManager()
-						.getModelForEdit(IJMTConstants.USERAGENT, input, null);
-				ICSSModel cssmodel = (ICSSModel) model;
-				_userAgentDefault = (StyleSheet) cssmodel.getDocument();
-			}
-			finally
-			{
-				ResourceUtils.ensureClosed(input);
-			}
-		}
-
-		return _userAgentDefault;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/ICSSStyle.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/ICSSStyle.java
deleted file mode 100644
index 25d3ed6..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/ICSSStyle.java
+++ /dev/null
@@ -1,173 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2;
-
-import java.util.Map;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.draw2d.geometry.Insets;
-import org.eclipse.jst.pagedesigner.css2.font.ICSSFont;
-import org.eclipse.jst.pagedesigner.css2.list.ICounterValueGenerator;
-import org.eclipse.wst.sse.core.internal.provisional.INodeAdapter;
-
-/**
- * The style declaration for an element can be cached.
- * 
- * @author mengbo
- */
-public interface ICSSStyle extends INodeAdapter, IAdaptable 
-{
-    /**
-     * 
-     */
-    public static final int INHERIT = Integer.MIN_VALUE;
-    
-	/**
-	 * the top attribute vale
-	 */
-	public static final String TOP = "top"; //$NON-NLS-1$
-
-	/**
-	 * the right attribute value
-	 */
-	public static final String RIGHT = "right"; //$NON-NLS-1$
-
-	/**
-	 * the left attribute value
-	 */
-	public static final String LEFT = "left"; //$NON-NLS-1$
-
-	/**
-	 * the bottom attribute value
-	 */
-	public static final String BOTTOM = "bottom"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public void reset();
-
-	/**
-	 * @return the font
-	 */
-	public ICSSFont getCSSFont();
-
-	/**
-	 * @param property
-	 * @return the style property
-	 */
-	public Object getStyleProperty(String property);
-
-	/**
-	 * @return the margin insets
-	 */
-	public Insets getMarginInsets();
-
-	/**
-	 * @return the border insets
-	 */
-	public Insets getBorderInsets();
-
-	/**
-	 * @return the padding insets
-	 */
-	public Insets getPaddingInsets();
-
-	/**
-	 * shortcut method to get the CSS display.
-	 * 
-	 * see http://www.w3.org/TR/REC-CSS2/visuren.html#propdef-display
-	 * @return the display string
-	 */
-	public String getDisplay();
-
-	/**
-	 * null means transparent.
-	 * 
-	 * @return the background color
-	 */
-	public Object getBackgroundColor();
-
-	/**
-	 * @return the foreground color
-	 */
-	public Object getColor();
-
-	/**
-	 * @return true if size includes border padding
-	 */
-	public boolean isSizeIncludeBorderPadding();
-
-	/**
-	 * 
-	 */
-	public void dispose();
-
-	/**
-	 * @return the parent style
-	 */
-	public ICSSStyle getParentStyle();
-
-	/**
-	 * Get counters declared on this style. the counters are either created by
-	 * counter-reset or refered by counter-increment
-	 * 
-	 * @return the counters
-	 */
-	public Map getCounters();
-
-	/**
-	 * Search a named counter declared on this style or its ancestors' styles
-	 * 
-	 * @param name
-	 * @param must
-	 * @return the generator
-	 */
-	public ICounterValueGenerator findCounter(String name, boolean must);
-
-	/**
-	 * Currently, rowspan and colspan are not CSS property. But based on the CSS
-	 * specification, it is expected in the future this two will be added as CSS
-	 * property, so we also include them into ICSSStyle
-	 * 
-	 * @return the row span
-	 */
-	public int getRowSpan();
-
-	/**
-	 * @return the column span
-	 */
-	public int getColSpan();
-
-	/**
-	 * Normally, when layout a figure and its children. We'll reset the counters
-	 * declared on this style. And if there are "counter-increment" on this
-	 * style, they'll also be processed.
-	 * 
-	 */
-	public void processCounters();
-
-	/**
-	 * Whether the corresponding figure should be draw in selected mode. This is
-	 * not a real CSS property. This is a shortcut method. implemented through
-	 * getAdapter() on IRangeSelectionProxy
-	 * 
-	 * @return true if in selection
-	 */
-	public boolean isInSelection();
-
-	/**
-	 * @param propertyName
-	 * @return the element init value
-	 */
-	public Object getHTMLelementInitValue(String propertyName);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/border/CSSBorder.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/border/CSSBorder.java
deleted file mode 100644
index 96d6465..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/border/CSSBorder.java
+++ /dev/null
@@ -1,542 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.border;
-
-import java.util.Arrays;
-
-import org.eclipse.draw2d.AbstractBorder;
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.geometry.Insets;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.editors.pagedesigner.MessageFormater;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.RGB;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * @author mengbo
- */
-public class CSSBorder extends AbstractBorder {
-
-	private static final String BODER_QUERY_TEMPLETE = "border-{0}-style"; //$NON-NLS-1$
-
-	private static final String COLOR_QUERY_TEMPLETE = "border-{0}-color"; //$NON-NLS-1$
-
-	private final ICSSStyle _style;
-
-	private final Rectangle _innerRect = new Rectangle();
-
-	/**
-	 * @param style
-	 */
-	public CSSBorder(ICSSStyle style) {
-		this._style = style;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.Border#getInsets(org.eclipse.draw2d.IFigure)
-	 */
-	public Insets getInsets(IFigure figure) {
-		return _style.getBorderInsets();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.Border#paint(org.eclipse.draw2d.IFigure,
-	 *      org.eclipse.draw2d.Graphics, org.eclipse.draw2d.geometry.Insets)
-	 */
-	public void paint(IFigure figure, Graphics graphics, Insets insets) {
-		tempRect.setBounds(getPaintRectangle(figure, insets));
-		_innerRect.setBounds(tempRect);
-		_innerRect.crop(_style.getBorderInsets());
-		paintEdge(graphics, tempRect, _innerRect, ICSSStyle.LEFT);
-		paintEdge(graphics, tempRect, _innerRect, ICSSStyle.RIGHT);
-		paintEdge(graphics, tempRect, _innerRect, ICSSStyle.TOP);
-		paintEdge(graphics, tempRect, _innerRect, ICSSStyle.BOTTOM);
-	}
-
-	/**
-	 * @param style
-	 * @return
-	 */
-	private boolean shouldDraw(String style) {
-		return style != null && !ICSSPropertyID.VAL_NONE.equals(style)
-				&& !ICSSPropertyID.VAL_HIDDEN.equals(style);
-	}
-
-	/**
-	 * Fetchs the color array used to draw the given edge under the given style
-	 * 
-	 * @param graphics
-	 * @param style
-	 * @param edge
-	 * @return
-	 */
-	private RGB[] getEdgeColors(Graphics graphics, String style, String edge) {
-		String property = MessageFormater.format(COLOR_QUERY_TEMPLETE, edge);
-		Object obj = _style.getStyleProperty(property);
-		if (obj instanceof RGB) {
-			return getCustomColors(graphics, style, edge, (RGB) obj);
-		} else if (obj instanceof Color) {
-			return getCustomColors(graphics, style, edge, ((Color) obj)
-					.getRGB());
-		} else {
-			return getDefaultColors(graphics, style, edge);
-		}
-	}
-	// TODO: needs refactoring
-	private RGB[] getDefaultColors(Graphics graphics, String style, String edge) {
-		if (ICSSPropertyID.VAL_OUTSET.equals(style)) {
-			if (ICSSStyle.TOP.equals(edge) || ICSSStyle.LEFT.equals(edge)) {
-				return new RGB[] { ColorConstants.button.getRGB(),
-						ColorConstants.buttonLightest.getRGB() };
-			}
-            return new RGB[] { ColorConstants.buttonDarkest.getRGB(),
-            		ColorConstants.buttonDarker.getRGB() };
-		} else if (ICSSPropertyID.VAL_INSET.equals(style)) {
-			if (ICSSStyle.TOP.equals(edge) || ICSSStyle.LEFT.equals(edge)) {
-				return new RGB[] { ColorConstants.buttonDarker.getRGB(),
-						ColorConstants.buttonDarkest.getRGB() };
-			}
-            return new RGB[] { ColorConstants.buttonLightest.getRGB(),
-            		ColorConstants.button.getRGB() };
-		} else if (ICSSPropertyID.VAL_TDBORDERSTYLE.equals(style)) {
-			if (ICSSStyle.TOP.equals(edge) || ICSSStyle.LEFT.equals(edge)) {
-				return new RGB[] { ColorConstants.buttonDarker.getRGB() };
-			}
-            return new RGB[] { ColorConstants.button.getRGB() };
-		} else if (ICSSPropertyID.VAL_RIDGE.equals(style)) {
-			if (ICSSStyle.TOP.equals(edge) || ICSSStyle.LEFT.equals(edge)) {
-				return new RGB[] { ColorConstants.button.getRGB(),
-						ColorConstants.buttonDarkest.getRGB() };
-			}
-            return new RGB[] { ColorConstants.buttonDarkest.getRGB(),
-            		ColorConstants.button.getRGB() };
-		} else if (ICSSPropertyID.VAL_GROOVE.equals(style)) {
-			if (ICSSStyle.TOP.equals(edge) || ICSSStyle.LEFT.equals(edge)) {
-				return new RGB[] { ColorConstants.buttonDarker.getRGB(),
-						ColorConstants.buttonLightest.getRGB() };
-			}
-            return new RGB[] { ColorConstants.buttonLightest.getRGB(),
-            		ColorConstants.buttonDarker.getRGB(), };
-		} else if (ICSSPropertyID.VAL_DOUBLE.equals(style)) {
-			return new RGB[] { ColorConstants.buttonDarkest.getRGB(),
-					graphics.getBackgroundColor().getRGB(),
-					ColorConstants.buttonDarkest.getRGB() };
-		} else if (ICSSPropertyID.VAL_SOLID.equals(style)) {
-			return new RGB[] { ColorConstants.black.getRGB() };
-		}
-
-		return new RGB[] { ColorConstants.black.getRGB() };
-	}
-
-    // TODO: needs refactoring
-	private RGB[] getCustomColors(Graphics graphics, String style, String edge,
-			RGB baseColor) {
-		if (ICSSPropertyID.VAL_OUTSET.equals(style)) {
-			if (ICSSStyle.TOP.equals(edge) || ICSSStyle.LEFT.equals(edge)) {
-				return new RGB[] {
-						new RGB(baseColor.red * 3 / 4,
-								baseColor.green * 3 / 4,
-								baseColor.blue * 3 / 4),
-						new RGB(baseColor.red, baseColor.green, baseColor.blue) };
-			}
-            return new RGB[] {
-            		new RGB(baseColor.red / 2,
-            				baseColor.green / 2,
-            				baseColor.blue / 2),
-            		new RGB(baseColor.red / 4,
-            				baseColor.green / 4,
-            				baseColor.blue / 4) };
-		} else if (ICSSPropertyID.VAL_INSET.equals(style)) {
-			if (ICSSStyle.TOP.equals(edge) || ICSSStyle.LEFT.equals(edge)) {
-				return new RGB[] {
-						new RGB(baseColor.red / 4,
-								baseColor.green / 4,
-								baseColor.blue / 4),
-						new RGB(baseColor.red / 2,
-								baseColor.green / 2,
-								baseColor.blue / 2) };
-			}
-            return new RGB[] {
-            		new RGB(baseColor.red, baseColor.green, baseColor.blue),
-            		new RGB(baseColor.red * 3 / 4,
-            				baseColor.green * 3 / 4,
-            				baseColor.blue * 3 / 4), };
-		} else if (ICSSPropertyID.VAL_TDBORDERSTYLE.equals(style)) {
-			if (ICSSStyle.TOP.equals(edge) || ICSSStyle.LEFT.equals(edge)) {
-				return new RGB[] { new RGB(baseColor.red / 4,
-						baseColor.green / 4, baseColor.blue / 4) };
-			}
-            return new RGB[] { new RGB(baseColor.red, baseColor.green,
-            		baseColor.blue) };
-		} else if (ICSSPropertyID.VAL_RIDGE.equals(style)) {
-			if (ICSSStyle.TOP.equals(edge) || ICSSStyle.LEFT.equals(edge)) {
-				return new RGB[] {
-						new RGB(baseColor.red * 3 / 4,
-								baseColor.green * 3 / 4,
-								baseColor.blue * 3 / 4),
-						new RGB(baseColor.red / 2,
-								baseColor.green / 2,
-								baseColor.blue / 2) };
-			}
-            return new RGB[] {
-            		new RGB(baseColor.red / 2,
-            				baseColor.green / 2,
-            				baseColor.blue / 2),
-            		new RGB(baseColor.red * 3 / 4,
-            				baseColor.green * 3 / 4,
-            				baseColor.blue * 3 / 4) };
-		} else if (ICSSPropertyID.VAL_GROOVE.equals(style)) {
-			if (ICSSStyle.TOP.equals(edge) || ICSSStyle.LEFT.equals(edge)) {
-				return new RGB[] {
-						new RGB(baseColor.red / 4,
-								baseColor.green / 4,
-								baseColor.blue / 4),
-						new RGB(baseColor.red, baseColor.green, baseColor.blue) };
-
-			}
-            return new RGB[] {
-            		new RGB(baseColor.red, baseColor.green, baseColor.blue),
-            		new RGB(baseColor.red / 4,
-            				baseColor.green / 4,
-            				baseColor.blue / 4) };
-		} else if (ICSSPropertyID.VAL_DOUBLE.equals(style)) {
-			return new RGB[] {
-					new RGB(baseColor.red, baseColor.green, baseColor.blue),
-					graphics.getBackgroundColor().getRGB(),
-					new RGB(baseColor.red, baseColor.green, baseColor.blue) };
-		} else if (ICSSPropertyID.VAL_SOLID.equals(style)) {
-			return new RGB[] { new RGB(baseColor.red, baseColor.green,
-					baseColor.blue) };
-		}
-		return new RGB[] { new RGB(baseColor.red, baseColor.green,
-				baseColor.blue) };
-	}
-
-	/**
-	 * @param graphics
-	 * @param rect
-	 * @param innerRect
-	 * @param edge
-	 * @param style
-	 */
-	public void paintEdge(Graphics graphics, Rectangle rect,
-			Rectangle innerRect, String edge, String style) {
-		if (!shouldDraw(style)) {
-			return;
-		}
-		RGB[] rgbs = getEdgeColors(graphics, style, edge);
-
-		if (ICSSStyle.TOP.equals(edge)) {
-			paintTopEdge(graphics, rgbs, style, rect, innerRect);
-		} else if (ICSSStyle.BOTTOM.equals(edge)) {
-			paintBottomEdge(graphics, rgbs, style, rect, innerRect);
-		} else if (ICSSStyle.LEFT.equals(edge)) {
-			paintLeftEdge(graphics, rgbs, style, rect, innerRect);
-		} else if (ICSSStyle.RIGHT.equals(edge)) {
-			paintRightEdge(graphics, rgbs, style, rect, innerRect);
-		}
-	}
-
-	/**
-	 * @param graphics
-	 * @param rect
-	 * @param innerRect
-	 * @param edge
-	 */
-	protected void paintEdge(Graphics graphics, Rectangle rect,
-			Rectangle innerRect, String edge) {
-		String property = MessageFormater.format(BODER_QUERY_TEMPLETE, edge);
-		Object obj = _style.getStyleProperty(property);
-		String style = obj.toString();
-		paintEdge(graphics, rect, innerRect, edge, style);
-	}
-
-	private void paintTopEdge(Graphics graphics, RGB[] rgbs, String style,
-			Rectangle rect, Rectangle innerRect) {
-		int leftX = rect.x;
-		int rightX = rect.right() - 1;
-		int y = rect.y;
-		int width = innerRect.y - rect.y;
-
-		if (ICSSPropertyID.VAL_DOTTED.equals(style)) {
-			drawDottedBorder(graphics, rgbs, ICSSStyle.TOP, rect, width);
-		} else if (ICSSPropertyID.VAL_DASHED.equals(style)) {
-			drawDashedBorder(graphics, rgbs, ICSSStyle.TOP, rect, width);
-		} else {
-			double xLeftRate = ((double) (innerRect.x - rect.x)) / width;
-			double xRightRate = ((double) (rect.right() - innerRect.right()))
-					/ width;
-			graphics.pushState();
-			for (int i = 0; i < width; i++) {
-				Color color = new Color(Display.getCurrent(), rgbs[rgbs.length
-						* i / width]);
-				graphics.setForegroundColor(color);
-				graphics.drawLine((int) (leftX + i * xLeftRate), y + i,
-						(int) (rightX - i * xRightRate), y + i);
-				color.dispose();
-			}
-			graphics.popState();
-		}
-	}
-
-	private void paintBottomEdge(Graphics graphics, RGB[] rgbs, String style,
-			Rectangle rect, Rectangle innerRect) {
-		int leftX = rect.x;
-		int rightX = rect.right() - 1;
-		int y = rect.bottom() - 1;
-		int width = rect.bottom() - innerRect.bottom();
-
-		if (ICSSPropertyID.VAL_DOTTED.equals(style)) {
-			drawDottedBorder(graphics, rgbs, ICSSStyle.BOTTOM, rect, width);
-		} else if (ICSSPropertyID.VAL_DASHED.equals(style)) {
-			drawDashedBorder(graphics, rgbs, ICSSStyle.BOTTOM, rect, width);
-		} else {
-			double xLeftRate = ((double) (innerRect.x - rect.x)) / width;
-			double xRightRate = ((double) (rect.right() - innerRect.right()))
-					/ width;
-			graphics.pushState();
-			for (int i = 0; i < width; i++) {
-				Color color = new Color(Display.getCurrent(), rgbs[rgbs.length
-						* i / width]);
-				graphics.setForegroundColor(color);
-				graphics.drawLine(leftX + (int) (i * xLeftRate), y - i, rightX
-						- (int) (i * xRightRate), y - i);
-				color.dispose();
-			}
-			graphics.popState();
-		}
-	}
-
-	private void paintLeftEdge(Graphics graphics, RGB[] rgbs, String style,
-			Rectangle rect, Rectangle innerRect) {
-		int x = rect.x;
-		int topY = rect.y;
-		int bottomY = rect.bottom() - 1;
-		int width = innerRect.x - rect.x;
-
-		if (ICSSPropertyID.VAL_DOTTED.equals(style)) {
-			drawDottedBorder(graphics, rgbs, ICSSStyle.LEFT, rect, width);
-		} else if (ICSSPropertyID.VAL_DASHED.equals(style)) {
-			drawDashedBorder(graphics, rgbs, ICSSStyle.LEFT, rect, width);
-		} else {
-			double yTopRate = ((double) (innerRect.y - rect.y)) / width;
-			double yBottomRate = ((double) (rect.bottom() - innerRect.bottom()))
-					/ width;
-			graphics.pushState();
-			for (int i = 0; i < width; i++) {
-				Color color = new Color(Display.getCurrent(), rgbs[rgbs.length
-						* i / width]);
-				graphics.setForegroundColor(color);
-				graphics.drawLine(x + i, topY + (int) (i * yTopRate), x + i,
-						bottomY - (int) (i * yBottomRate));
-				color.dispose();
-			}
-			graphics.popState();
-		}
-
-	}
-
-	private void paintRightEdge(Graphics graphics, RGB[] rgbs, String style,
-			Rectangle rect, Rectangle innerRect) {
-		int x = rect.right() - 1;
-		int topY = rect.y;
-		int bottomY = rect.bottom() - 1;
-		int width = rect.right() - innerRect.right();
-
-		if (ICSSPropertyID.VAL_DOTTED.equals(style)) {
-			drawDottedBorder(graphics, rgbs, ICSSStyle.RIGHT, rect, width);
-		} else if (ICSSPropertyID.VAL_DASHED.equals(style)) {
-			drawDashedBorder(graphics, rgbs, ICSSStyle.RIGHT, rect, width);
-		} else {
-			graphics.pushState();
-			for (int i = 0; i < width; i++) {
-				double yTopRate = ((double) (innerRect.y - rect.y)) / width;
-				double yBottomRate = ((double) (rect.bottom() - innerRect
-						.bottom()))
-						/ width;
-				Color color = new Color(Display.getCurrent(), rgbs[rgbs.length
-						* i / width]);
-				graphics.setForegroundColor(color);
-				graphics.drawLine(x - i, topY + (int) (i * yTopRate), x - i,
-						bottomY - (int) (i * yBottomRate));
-				color.dispose();
-			}
-			graphics.popState();
-		}
-	}
-
-	private void drawDottedBorder(Graphics graphics, RGB[] rgbs, String style,
-			Rectangle rect, int width) {
-		if (width == 0 || 3 * width > rect.width) {
-			return;
-		}
-
-		int beginX = 0;
-		int beginY = 0;
-		int xRate = 0;
-		int yRate = 0;
-		int span = 0;
-
-		if (ICSSStyle.TOP.equals(style)) {
-			beginX = rect.x;
-			beginY = rect.y;
-			xRate = 1;
-			yRate = 0;
-			span = rect.width;
-		} else if (ICSSStyle.LEFT.equals(style)) {
-			beginX = rect.x;
-			beginY = rect.y;
-			xRate = 0;
-			yRate = 1;
-			span = rect.height;
-		} else if (ICSSStyle.BOTTOM.equals(style)) {
-			beginX = rect.x;
-			beginY = rect.y + rect.height - width;
-			xRate = 1;
-			yRate = 0;
-			span = rect.width;
-		} else if (ICSSStyle.RIGHT.equals(style)) {
-			beginX = rect.x + rect.width - width;
-			beginY = rect.y;
-			xRate = 0;
-			yRate = 1;
-			span = rect.height;
-		}
-
-		int dottedCount = (span + width) / (2 * width);
-		if (dottedCount < 2) {
-			dottedCount = 2;
-		}
-		int averagePad = (span - dottedCount * width) / (dottedCount - 1);
-		int leftPad = (span - dottedCount * width) % (dottedCount - 1);
-		int[] paddings = new int[dottedCount - 1];
-		Arrays.fill(paddings, averagePad);
-		for (int i = 0; i < leftPad; i++) {
-			paddings[i] = paddings[i] + 1;
-		}
-
-		int pad = 0;
-		Color color = new Color(Display.getCurrent(), rgbs[0]);
-		graphics.pushState();
-		graphics.setBackgroundColor(color);
-		for (int i = 0; i < dottedCount; i++) {
-			graphics.fillOval(beginX + (pad + width * i) * xRate, beginY
-					+ (pad + width * i) * yRate, width, width);
-			if (i != dottedCount - 1) {
-				pad += paddings[i];
-			}
-		}
-		graphics.popState();
-		color.dispose();
-
-	}
-
-	private void drawDashedBorder(Graphics graphics, RGB[] rgbs, String style,
-			Rectangle rect, int borderThick) {
-		if (borderThick == 0 || 5 * borderThick > rect.width) {
-			return;
-		}
-
-		if ((5 * borderThick > rect.height)
-				&& (ICSSStyle.LEFT.equals(style) || ICSSStyle.RIGHT
-						.equals(style))) {
-			return;
-		}
-
-		int width = 0;
-		int height = 0;
-		int edgeLength = 0;
-		int beginX = 0;
-		int beginY = 0;
-		int xRate = 0;
-		int yRate = 0;
-		int span = 0;
-
-		if (ICSSStyle.TOP.equals(style)) {
-			width = borderThick * 2;
-			height = borderThick;
-			beginX = rect.x;
-			beginY = rect.y;
-			xRate = 1;
-			yRate = 0;
-
-			span = rect.width;
-			edgeLength = width;
-		} else if (ICSSStyle.LEFT.equals(style)) {
-			width = borderThick;
-			height = borderThick * 2;
-			beginX = rect.x;
-			beginY = rect.y;
-			xRate = 0;
-			yRate = 1;
-
-			span = rect.height;
-			edgeLength = height;
-		} else if (ICSSStyle.BOTTOM.equals(style)) {
-			width = borderThick * 2;
-			height = borderThick;
-			beginX = rect.x;
-			beginY = rect.y + rect.height - height;
-			xRate = 1;
-			yRate = 0;
-
-			span = rect.width;
-			edgeLength = width;
-		} else if (ICSSStyle.RIGHT.equals(style)) {
-			width = borderThick;
-			height = borderThick * 2;
-			beginX = rect.x + rect.width - width;
-			beginY = rect.y;
-			xRate = 0;
-			yRate = 1;
-
-			span = rect.height;
-			edgeLength = height;
-		}
-
-		int dottedCount = (span + borderThick) / (edgeLength + borderThick);
-		if (dottedCount < 2) {
-			dottedCount = 2;
-		}
-		int averagePad = (span - dottedCount * edgeLength) / (dottedCount - 1);
-		int leftPad = (span - dottedCount * edgeLength) % (dottedCount - 1);
-		int[] paddings = new int[dottedCount - 1];
-		Arrays.fill(paddings, averagePad);
-		for (int i = 0; i < leftPad; i++) {
-			paddings[i] = paddings[i] + 1;
-		}
-
-		int pad = 0;
-		graphics.pushState();
-		Color color = new Color(Display.getCurrent(), rgbs[0]);
-		graphics.setBackgroundColor(color);
-		for (int i = 0; i < dottedCount; i++) {
-			graphics.fillRectangle(beginX + (pad + width * i) * xRate, beginY
-					+ (pad + height * i) * yRate, width, height);
-			if (i != dottedCount - 1) {
-				pad += paddings[i];
-			}
-		}
-		graphics.popState();
-		color.dispose();
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/color/CSSColorConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/color/CSSColorConverter.java
deleted file mode 100644
index ea520a1..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/color/CSSColorConverter.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.color;
-
-import java.util.StringTokenizer;
-
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.swt.graphics.RGB;
-
-/**
- * @author mengbo
- */
-public class CSSColorConverter {
-	private static final String PREFIX_RGB = "rgb"; //$NON-NLS-1$
-
-	private static Logger _log = PDPlugin.getLogger(CSSColorConverter.class);
-
-	private static CSSColorConverter _instance = new CSSColorConverter();
-
-	/**
-	 * @return singleton instance
-	 */
-	public static CSSColorConverter getInstantce() {
-		if (_instance == null) {
-			_instance = new CSSColorConverter();
-		}
-		return _instance;
-	}
-
-	Object getCSSColor(String CSSText) {
-		if (CSSText == null) {
-			return null;
-		}
-
-		CSSText = CSSText.trim().toLowerCase();
-		if (CSSText.length() == 0) {
-			return null;
-		}
-		if (CSSColorDefaults.SYSTEM_DEFAULT_COLORS.containsKey(CSSText)) {
-			Object result = null;
-			result = CSSColorDefaults.SYSTEM_DEFAULT_COLORS.get(CSSText);
-			return result;
-		} else if (CSSColorDefaults.EXTENDED_COLORS.containsKey(CSSText)) {
-			Object result = null;
-			result = CSSColorDefaults.EXTENDED_COLORS.get(CSSText);
-			return result;
-		} else {
-			return convertStringToRGB(CSSText);
-		}
-	}
-
-	private RGB convertStringToRGB(String CSSText) {
-		StringBuffer sb = new StringBuffer(CSSText);
-		int value;
-		try {
-			if (sb.indexOf("#") == 0) //$NON-NLS-1$
-			{
-				if (sb.length() == 4) {
-					sb.insert(1, sb.charAt(1));
-					sb.insert(3, sb.charAt(3));
-					sb.insert(5, sb.charAt(5));
-					value = Integer.parseInt(sb.substring(1, sb.length())
-							.toString(), 16);
-					return new RGB(value >>> 16 & 0xff, value >>> 8 & 0xff,
-							value & 0xff);
-				} else if (sb.length() == 7) {
-					value = Integer.parseInt(sb.substring(1, sb.length()), 16);
-					return new RGB(value >>> 16 & 0xff, value >>> 8 & 0xff,
-							value & 0xff);
-				}
-			} else if (CSSText.startsWith(PREFIX_RGB)) {
-				return convertRgbToRGB(sb.substring(
-						sb.indexOf("(") + 1, sb.indexOf(")"))); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-		} catch (Exception e) {
-			_log.info("CSSColorConverter.0", CSSText, null); //$NON-NLS-1$
-			return null;
-		}
-		return null;
-	}
-
-	private RGB convertRgbToRGB(String text) {
-		text = text.trim();
-		try {
-			StringTokenizer tokenizer = new StringTokenizer(text, ",");//$NON-NLS-1$
-
-			if (tokenizer.countTokens() != 3) {
-				return null;
-			}
-			String[] rgbText = new String[3];
-			for (int i = 0; i < 3; i++) {
-				rgbText[i] = tokenizer.nextToken();
-			}
-
-			int[] intRGB = new int[] { 0, 0, 0 };
-			for (int i = 0; i < 3; i++) {
-				int intValue = -1;
-				String textValue = rgbText[i].trim();
-
-				if (textValue.endsWith("%"))//$NON-NLS-1$
-				{
-					textValue = textValue.substring(0, textValue.length() - 1);
-
-					intValue = Integer.parseInt(textValue) * 255 / 100;
-				} else {
-					intValue = Integer.parseInt(textValue);
-				}
-				if (intValue < 0) {
-					intValue = 0;
-				} else if (intValue > 255) {
-					intValue = 255;
-				}
-				intRGB[i] = intValue;
-			}
-			return new RGB(intRGB[0], intRGB[1], intRGB[2]);
-		} catch (Exception e) {
-			// notify
-			_log.info("CSSColorConverter.1", text, null); //$NON-NLS-1$
-			return null;
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/color/CSSColorDefaults.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/color/CSSColorDefaults.java
deleted file mode 100644
index f5aa44c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/color/CSSColorDefaults.java
+++ /dev/null
@@ -1,284 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.color;
-
-import java.util.HashMap;
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * @author mengbo
- */
-public class CSSColorDefaults {
-	static final HashMap SYSTEM_DEFAULT_COLORS = new HashMap(20);
-
-	static final HashMap EXTENDED_COLORS = new HashMap(20);
-
-    // TODO C.B.: there is overlap here between the default and extended
-    // colors.  Also, for the custom colors, should use a ColorRegistry
-    // that allows other components to share values here
-	static {
-		SYSTEM_DEFAULT_COLORS.put("black", ColorConstants.black); //$NON-NLS-1$
-		SYSTEM_DEFAULT_COLORS.put("blue", ColorConstants.blue); //$NON-NLS-1$
-		SYSTEM_DEFAULT_COLORS.put("gray", ColorConstants.gray); //$NON-NLS-1$
-		SYSTEM_DEFAULT_COLORS.put("green", new Color(null, 0, 128, 0)); //$NON-NLS-1$
-		SYSTEM_DEFAULT_COLORS.put("orange", ColorConstants.orange); //$NON-NLS-1$
-		SYSTEM_DEFAULT_COLORS.put("red", ColorConstants.red); //$NON-NLS-1$
-		SYSTEM_DEFAULT_COLORS.put("white", ColorConstants.white); //$NON-NLS-1$
-		SYSTEM_DEFAULT_COLORS.put("yellow", ColorConstants.yellow); //$NON-NLS-1$
-		SYSTEM_DEFAULT_COLORS.put("aqua", ColorConstants.cyan); //$NON-NLS-1$
-		SYSTEM_DEFAULT_COLORS.put("fuchsia", new Color(null, 255, 0, 255)); //$NON-NLS-1$
-		SYSTEM_DEFAULT_COLORS.put("lime", ColorConstants.green); //$NON-NLS-1$
-		SYSTEM_DEFAULT_COLORS.put("maroon", new Color(null, 128, 0, 0)); //$NON-NLS-1$
-		SYSTEM_DEFAULT_COLORS.put("navy", new Color(null, 0, 0, 128)); //$NON-NLS-1$
-		SYSTEM_DEFAULT_COLORS.put("olive", new Color(null, 128, 128, 0)); //$NON-NLS-1$
-		SYSTEM_DEFAULT_COLORS.put("purple", new Color(null, 128, 0, 128)); //$NON-NLS-1$
-		SYSTEM_DEFAULT_COLORS.put("silver", ColorConstants.lightGray); //$NON-NLS-1$
-		SYSTEM_DEFAULT_COLORS.put("teal", new Color(null, 0, 128, 128)); //$NON-NLS-1$
-
-		SYSTEM_DEFAULT_COLORS.put("activeborder", Display.getCurrent() //$NON-NLS-1$
-				.getSystemColor(SWT.COLOR_WIDGET_BORDER));
-		// Active window border.
-		SYSTEM_DEFAULT_COLORS.put("activecaption", //$NON-NLS-1$
-				ColorConstants.titleBackground);
-		// Active window caption.
-		SYSTEM_DEFAULT_COLORS
-				.put("appworkspace", ColorConstants.listBackground); //$NON-NLS-1$
-		// Background color of multiple document interface.
-		SYSTEM_DEFAULT_COLORS.put("background", ColorConstants.listBackground); //$NON-NLS-1$
-		// Desktop background.
-		SYSTEM_DEFAULT_COLORS.put("buttonface", ColorConstants.button); //$NON-NLS-1$
-		// Face color for three-dimensional display elements.
-		SYSTEM_DEFAULT_COLORS.put("buttonhighlight", //$NON-NLS-1$
-				ColorConstants.buttonLightest);
-		// Dark shadow for three-dimensional display elements (for edges facing
-		// away from the light source).
-		SYSTEM_DEFAULT_COLORS.put("buttonshadow", ColorConstants.buttonDarker); //$NON-NLS-1$
-		// Shadow color for three-dimensional display elements.
-		SYSTEM_DEFAULT_COLORS.put("buttontext", Display.getCurrent() //$NON-NLS-1$
-				.getSystemColor(SWT.COLOR_WIDGET_FOREGROUND));
-		// Text on push buttons.
-		SYSTEM_DEFAULT_COLORS
-				.put("captiontext", ColorConstants.titleForeground); //$NON-NLS-1$
-		// Text in caption, size box, and scrollbar arrow box.
-		SYSTEM_DEFAULT_COLORS.put("graytext", //$NON-NLS-1$
-				ColorConstants.titleInactiveForeground);
-		// Grayed (disabled) text. This color is set to #000 if the current
-		// display driver does not support a solid gray color.
-		SYSTEM_DEFAULT_COLORS.put("highlight", //$NON-NLS-1$
-				ColorConstants.menuBackgroundSelected);
-		// Item(s) selected in a control.
-		SYSTEM_DEFAULT_COLORS.put("highlighttext", //$NON-NLS-1$
-				ColorConstants.menuForegroundSelected);
-		// Text of item(s) selected in a control.
-		SYSTEM_DEFAULT_COLORS.put("inactiveborder", Display.getCurrent() //$NON-NLS-1$
-				.getSystemColor(SWT.COLOR_TITLE_INACTIVE_BACKGROUND_GRADIENT));
-		// Inactive window border.
-		SYSTEM_DEFAULT_COLORS.put("inactivecaption", //$NON-NLS-1$
-				ColorConstants.titleInactiveBackground);
-		// Inactive window caption.
-		SYSTEM_DEFAULT_COLORS.put("inactivecaptiontext", //$NON-NLS-1$
-				ColorConstants.titleInactiveForeground);
-		// Color of text in an inactive caption.
-		SYSTEM_DEFAULT_COLORS.put("infobackground", //$NON-NLS-1$
-				ColorConstants.tooltipBackground);
-		// Background color for tooltip controls.
-		SYSTEM_DEFAULT_COLORS.put("infotext", ColorConstants.tooltipForeground); //$NON-NLS-1$
-		// Text color for tooltip controls.
-		SYSTEM_DEFAULT_COLORS.put("menu", ColorConstants.menuBackground); //$NON-NLS-1$
-		// Menu background.
-		SYSTEM_DEFAULT_COLORS.put("menutext", ColorConstants.menuForeground); //$NON-NLS-1$
-		// Text in menus.
-		SYSTEM_DEFAULT_COLORS.put("scrollbar", Display.getCurrent() //$NON-NLS-1$
-				.getSystemColor(SWT.COLOR_WIDGET_BACKGROUND));
-		// Scroll bar gray area.
-		SYSTEM_DEFAULT_COLORS.put("threeddarkshadow", Display.getCurrent() //$NON-NLS-1$
-				.getSystemColor(SWT.COLOR_WIDGET_DARK_SHADOW));
-		// Dark shadow for three-dimensional display elements.
-		SYSTEM_DEFAULT_COLORS.put("threedface", Display.getCurrent() //$NON-NLS-1$
-				.getSystemColor(SWT.COLOR_WIDGET_BACKGROUND));
-		// Face color for three-dimensional display elements.
-		SYSTEM_DEFAULT_COLORS.put("threedhighlight", Display.getCurrent() //$NON-NLS-1$
-				.getSystemColor(SWT.COLOR_WIDGET_HIGHLIGHT_SHADOW));
-		// Highlight color for three-dimensional display elements.
-		SYSTEM_DEFAULT_COLORS.put("threedlightshadow", Display.getCurrent() //$NON-NLS-1$
-				.getSystemColor(SWT.COLOR_WIDGET_LIGHT_SHADOW));
-		// Light color for three-dimensional display elements (for edges facing
-		// the light source).
-		SYSTEM_DEFAULT_COLORS.put("threedshadow", Display.getCurrent() //$NON-NLS-1$
-				.getSystemColor(SWT.COLOR_WIDGET_DARK_SHADOW));
-		// Dark shadow for three-dimensional display elements.
-		SYSTEM_DEFAULT_COLORS.put("window", Display.getCurrent() //$NON-NLS-1$
-				.getSystemColor(SWT.COLOR_LIST_BACKGROUND));
-		// Window background.
-		SYSTEM_DEFAULT_COLORS.put("windowframe", Display.getCurrent() //$NON-NLS-1$
-				.getSystemColor(SWT.COLOR_WIDGET_BORDER));
-		// Window frame.
-		SYSTEM_DEFAULT_COLORS.put("windowtext", Display.getCurrent() //$NON-NLS-1$
-				.getSystemColor(SWT.COLOR_LIST_FOREGROUND));
-		// Window text
-		SYSTEM_DEFAULT_COLORS.put("hyperlink", ColorConstants.blue); //$NON-NLS-1$
-	}
-
-    // populate the extended color palette.  Where the extended 
-    // color is the same as a constant color, use that to save
-    // on SWT resource handles
-	static {
-		EXTENDED_COLORS.put("aliceblue", new Color(null, 240, 248, 255)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("antiquewhite", new Color(null, 250, 235, 215)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("aqua", ColorConstants.cyan); //$NON-NLS-1$
-		EXTENDED_COLORS.put("aquamarine", new Color(null, 127, 255, 212)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("azure", new Color(null, 240, 255, 255)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("beige", new Color(null, 245, 245, 220)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("bisque", new Color(null, 255, 228, 196)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("black", ColorConstants.black); //$NON-NLS-1$
-		EXTENDED_COLORS.put("blanchedalmond", new Color(null, 255, 235, 205)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("blue", ColorConstants.blue); //$NON-NLS-1$
-		EXTENDED_COLORS.put("blueviolet", new Color(null, 138, 43, 226)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("brown", new Color(null, 165, 42, 42)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("burlywood", new Color(null, 222, 184, 135)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("cadetblue", new Color(null, 95, 158, 160)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("chartreuse", new Color(null, 127, 255, 0)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("chocolate", new Color(null, 210, 105, 30)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("coral", new Color(null, 255, 127, 80)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("cornflowerblue", new Color(null, 100, 149, 237)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("cornsilk", new Color(null, 255, 248, 220)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("crimson", new Color(null, 220, 20, 60)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("cyan", new Color(null, 0, 255, 255)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("darkblue", new Color(null, 0, 0, 139)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("darkcyan", new Color(null, 0, 139, 139)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("darkgoldenrod", new Color(null, 184, 134, 11)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("darkgray", new Color(null, 169, 169, 169)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("darkgreen", new Color(null, 0, 100, 0)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("darkkhaki", new Color(null, 189, 183, 107)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("darkmagenta", new Color(null, 139, 0, 139)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("darkolivegreen", new Color(null, 85, 107, 47)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("darkorange", new Color(null, 255, 140, 0)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("darkorchid", new Color(null, 153, 50, 204)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("darkred", new Color(null, 139, 0, 0)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("darksalmon", new Color(null, 233, 150, 122)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("darkseagreen", new Color(null, 143, 188, 143)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("darkslateblue", new Color(null, 72, 61, 139)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("darkslategray", new Color(null, 47, 79, 79)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("darkturquoise", new Color(null, 0, 206, 209)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("darkviolet", new Color(null, 148, 0, 211)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("deeppink", new Color(null, 255, 20, 147)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("deepskyblue", new Color(null, 0, 191, 255)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("dimgray", new Color(null, 105, 105, 105)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("dodgerblue", new Color(null, 30, 144, 255)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("feldspar", new Color(null, 209, 146, 117)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("firebrick", new Color(null, 178, 34, 34)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("floralwhite", new Color(null, 255, 250, 240)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("forestgreen", new Color(null, 34, 139, 34)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("fuchsia", new Color(null, 255, 0, 255)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("gainsboro", new Color(null, 220, 220, 220)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("ghostwhite", new Color(null, 248, 248, 255)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("gold", new Color(null, 255, 215, 0)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("goldenrod", new Color(null, 218, 165, 32)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("gray", ColorConstants.gray); //$NON-NLS-1$
-		EXTENDED_COLORS.put("green", new Color(null, 0, 128, 0)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("greenyellow", new Color(null, 173, 255, 47)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("honeydew", new Color(null, 240, 255, 240)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("hotpink", new Color(null, 255, 105, 180)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("indianred", new Color(null, 205, 92, 92)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("indigo", new Color(null, 75, 0, 130)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("ivory", new Color(null, 255, 255, 240)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("khaki", new Color(null, 240, 230, 140)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("lavender", new Color(null, 230, 230, 250)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("lavenderblush", new Color(null, 255, 240, 245)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("lawngreen", new Color(null, 124, 252, 0)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("lemonchiffon", new Color(null, 255, 250, 205)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("lightblue", new Color(null, 173, 216, 230)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("lightcoral", new Color(null, 240, 128, 128)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("lightcyan", new Color(null, 224, 255, 255)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("lightgoldenrodyellow", new Color(null, 250, 250, //$NON-NLS-1$
-				210));
-		EXTENDED_COLORS.put("lightgrey", new Color(null, 211, 211, 211)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("lightgreen", new Color(null, 144, 238, 144)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("lightpink", new Color(null, 255, 182, 193)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("lightsalmon", new Color(null, 255, 160, 122)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("lightseagreen", new Color(null, 32, 178, 170)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("lightskyblue", new Color(null, 135, 206, 250)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("lightslateblue", new Color(null, 132, 112, 255)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("lightslategray", new Color(null, 119, 136, 153)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("lightsteelblue", new Color(null, 176, 196, 222)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("lightyellow", new Color(null, 255, 255, 224)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("lime", ColorConstants.green); //$NON-NLS-1$
-		EXTENDED_COLORS.put("limegreen", new Color(null, 50, 205, 50)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("linen", new Color(null, 250, 240, 230)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("magenta", new Color(null, 255, 0, 255)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("maroon", new Color(null, 128, 0, 0)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("mediumaquamarine", new Color(null, 102, 205, 170)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("mediumblue", new Color(null, 0, 0, 205)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("mediumorchid", new Color(null, 186, 85, 211)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("mediumpurple", new Color(null, 147, 112, 216)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("mediumseagreen", new Color(null, 60, 179, 113)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("mediumslateblue", new Color(null, 123, 104, 238)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("mediumspringgreen", new Color(null, 0, 250, 154)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("mediumturquoise", new Color(null, 72, 209, 204)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("mediumvioletred", new Color(null, 199, 21, 133)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("midnightblue", new Color(null, 25, 25, 112)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("mintcream", new Color(null, 245, 255, 250)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("mistyrose", new Color(null, 255, 228, 225)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("moccasin", new Color(null, 255, 228, 181)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("navajowhite", new Color(null, 255, 222, 173)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("navy", new Color(null, 0, 0, 128)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("oldlace", new Color(null, 253, 245, 230)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("olive", new Color(null, 128, 128, 0)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("olivedrab", new Color(null, 107, 142, 35)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("orange", new Color(null, 255, 165, 0)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("orangeted", new Color(null, 255, 69, 0)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("orchid", new Color(null, 218, 112, 214)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("ralegoldenrod", new Color(null, 238, 232, 170)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("palegreen", new Color(null, 152, 251, 152)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("paleturquoise", new Color(null, 175, 238, 238)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("palevioletred", new Color(null, 216, 112, 147)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("papayawhip", new Color(null, 255, 239, 213)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("peachpuff", new Color(null, 255, 218, 185)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("peru", new Color(null, 205, 133, 63)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("pink", new Color(null, 255, 192, 203)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("plum", new Color(null, 221, 160, 221)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("powderblue", new Color(null, 176, 224, 230)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("purple", new Color(null, 128, 0, 128)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("red", ColorConstants.red); //$NON-NLS-1$
-		EXTENDED_COLORS.put("rosybrown", new Color(null, 188, 143, 143)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("royalblue", new Color(null, 65, 105, 225)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("saddlebrown", new Color(null, 139, 69, 19)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("salmon", new Color(null, 250, 128, 114)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("sandybrown", new Color(null, 244, 164, 96)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("seagreen", new Color(null, 46, 139, 87)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("seashell", new Color(null, 255, 245, 238)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("sienna", new Color(null, 160, 82, 45)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("silver", new Color(null, 192, 192, 192)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("skyblue", new Color(null, 135, 206, 235)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("slateblue", new Color(null, 106, 90, 205)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("slategray", new Color(null, 112, 128, 144)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("snow", new Color(null, 255, 250, 250)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("springgreen", new Color(null, 0, 255, 127)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("steelblue", new Color(null, 70, 130, 180)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("tan", new Color(null, 210, 180, 140)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("teal", new Color(null, 0, 128, 128)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("thistle", new Color(null, 216, 191, 216)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("tomato", new Color(null, 255, 99, 71)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("turquoise", new Color(null, 64, 224, 208)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("violet", new Color(null, 238, 130, 238)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("violetred", new Color(null, 208, 32, 144)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("wheat", new Color(null, 245, 222, 179)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("white", ColorConstants.white); //$NON-NLS-1$
-		EXTENDED_COLORS.put("whitesmoke", new Color(null, 245, 245, 245)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("yellow", ColorConstants.yellow); //$NON-NLS-1$
-		EXTENDED_COLORS.put("yellowgreen", new Color(null, 154, 205, 50)); //$NON-NLS-1$
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/color/CSSColorManager.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/color/CSSColorManager.java
deleted file mode 100644
index 66dce7b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/color/CSSColorManager.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.color;
-
-/**
- * @author mengbo
- */
-public class CSSColorManager {
-	private static CSSColorManager _instance;
-
-	private CSSColorManager() {
-        // no external instantiation
-	}
-
-	/**
-	 * @return the single instance
-	 */
-	public static CSSColorManager getInstance() {
-		if (_instance == null) {
-			_instance = new CSSColorManager();
-		}
-		return _instance;
-	}
-
-	/**
-	 * return Color or RGB. If return color, then the returned color is system
-	 * color, caller should NOT dispose the returned color
-	 * 
-	 * @param cssText
-	 * @return the color object for cssText
-	 */
-	public Object getColor(String cssText) {
-		return CSSColorConverter.getInstantce().getCSSColor(cssText);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/font/CSSFont.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/font/CSSFont.java
deleted file mode 100644
index 646da86..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/font/CSSFont.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.font;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Font;
-
-/**
- * @author mengbo
- */
-public class CSSFont implements ICSSFont {
-	private String _family;
-
-	private int _size;
-
-	private int _style;
-
-	private int _weight;
-
-	private String _cssString;
-
-	/**
-	 * @param family 
-	 * @param size 
-	 * @param style 
-	 * @param weight 
-	 * @param cssString 
-	 * 
-	 */
-	public CSSFont(String family, int size, int style, int weight,
-			String cssString) {
-		this._family = family;
-		this._size = size;
-		this._style = style;
-		this._weight = weight;
-		_cssString = cssString;
-	}
-
-	public String getFontFamily() {
-		return _family;
-	}
-
-	public int getFontSize() {
-		return _size;
-	}
-
-	public int getFontStyle() {
-		return _style;
-	}
-
-	public String getCSSString() {
-		return _cssString;
-	}
-
-	public int getWeight() {
-		return _weight;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Object#equals(java.lang.Object)
-	 */
-	public boolean equals(Object obj) {
-		if (obj instanceof CSSFont) {
-			CSSFont fd = (CSSFont) obj;
-			return this._family.equals(fd._family) && this._size == fd._size
-					&& this._style == fd._style && this._weight == fd._weight;
-		}
-        return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Object#hashCode()
-	 */
-	public int hashCode() {
-		return _family.hashCode() + _size + _style + _weight;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.font.ICSSFont#getSwtFont()
-	 */
-	public Font getSwtFont() {
-		// return FontPoolManager.getInstance().getFont(this);
-		return CSSFontManager.getInstance().getSwtFont(this);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.font.ICSSFont#getXHeight()
-	 */
-	public int getXHeight() {
-		return getFontSize();
-	}
-
-	/**
-	 * @return the style mask for the font style
-	 */
-	public int getSwtFontStyle() {
-		int style = SWT.NONE;
-		// see:http://www.htmlhelp.com/reference/css/font/font-weight.html
-		if (getWeight() >= 600)
-			style |= SWT.BOLD;
-		style |= getFontStyle();
-		return style;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/font/CSSFontManager.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/font/CSSFontManager.java
deleted file mode 100644
index 0297f92..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/font/CSSFontManager.java
+++ /dev/null
@@ -1,200 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.font;
-
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.property.FontFamilyMeta;
-import org.eclipse.jst.pagedesigner.css2.property.FontSizeMeta;
-import org.eclipse.jst.pagedesigner.css2.property.FontWeightMeta;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.css2.value.Length;
-import org.eclipse.jst.pagedesigner.utils.CacheManager;
-import org.eclipse.jst.pagedesigner.utils.ICacheEntryCreator;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * @author mengbo
- */
-public class CSSFontManager implements ICSSFontManager {
-	private static CSSFontManager _instance;
-
-	private static final boolean DEBUG = false;
-
-	private int _totalFont = 0;
-
-	// private static FontPoolManager _fontPoolManager;
-	// Map _cache = new HashMap();
-
-	private static final int CACHESIZE = 100; // we cache 100 font.
-
-	// the scale to convert the px to pt.
-	private final static double FONT_SCALE = ((double) Display.getCurrent()
-			.getDPI().x) / 72;
-
-	static String cssFontToLocalFont(String original) {
-		if ("serif".equalsIgnoreCase(original)) { //$NON-NLS-1$
-			return "Georgia"; //$NON-NLS-1$
-		} else if ("sans-serif".equalsIgnoreCase(original)) { //$NON-NLS-1$
-			return "Arial"; //$NON-NLS-1$
-		} else if ("cursive".equalsIgnoreCase(original)) { //$NON-NLS-1$
-			// FIXME: MS windows does not support the alternative fonts that
-			// match cursive defined at
-			// http://www.w3.org/TR/REC-CSS2/fonts.html#generic-font-families,
-			// We use Comic Sans MS font family
-			// because it is MS alternative.
-			return "Comic Sans MS"; //$NON-NLS-1$
-		} else if ("fantasy".equalsIgnoreCase(original)) { //$NON-NLS-1$
-			return cssFontToLocalFont("serif"); //$NON-NLS-1$
-		} else if ("monospace".equalsIgnoreCase(original)) { //$NON-NLS-1$
-			return "Courier New"; //$NON-NLS-1$
-		} else {
-			return original;
-		}
-	}
-
-	private CacheManager _cacheManager = new CacheManager(
-			new ICacheEntryCreator<CSSFont, Font>() {
-				public Font createEntry(CSSFont key) {
-					if (DEBUG) {
-						_totalFont++;
-						System.out.println("TotalFont++: " + _totalFont); //$NON-NLS-1$
-					}
-					Font font = new Font(null, cssFontToLocalFont(key
-							.getFontFamily()), (int) Math.round(key
-							.getFontSize()
-							/ FONT_SCALE), key.getSwtFontStyle());
-					return font;
-				}
-
-				public void dispose(CSSFont key, Font entry) {
-					if (DEBUG) {
-						_totalFont--;
-						System.out.println("TotalFont--: " + _totalFont); //$NON-NLS-1$
-					}
-					entry.dispose();
-
-				}
-			}, CACHESIZE);
-
-	/**
-	 * constructor
-	 */
-	private CSSFontManager() {
-		super();
-	}
-
-	private String resolveFontStyleString(ICSSStyle style) {
-		StringBuffer sb = new StringBuffer();
-		sb.append(ICSSPropertyID.ATTR_FONT_FAMILY).append(":"); //$NON-NLS-1$
-		sb.append("'").append( //$NON-NLS-1$
-				(String) style
-						.getStyleProperty(ICSSPropertyID.ATTR_FONT_FAMILY))
-				.append("'"); //$NON-NLS-1$
-		sb.append(";"); //$NON-NLS-1$
-		sb.append(ICSSPropertyID.ATTR_FONT_STYLE).append(":"); //$NON-NLS-1$
-		sb
-				.append(
-						(String) style
-								.getStyleProperty(ICSSPropertyID.ATTR_FONT_STYLE))
-				.append(";"); //$NON-NLS-1$
-		sb.append(ICSSPropertyID.ATTR_FONT_WEIGHT).append(":"); //$NON-NLS-1$
-		sb.append(
-				((Integer) style
-						.getStyleProperty(ICSSPropertyID.ATTR_FONT_WEIGHT))
-						.toString()).append(";"); //$NON-NLS-1$
-		sb.append(ICSSPropertyID.ATTR_FONT_SIZE).append(":"); //$NON-NLS-1$
-		int fontSize = getFontSize(style, style
-				.getStyleProperty(ICSSPropertyID.ATTR_FONT_SIZE));
-		sb.append(Integer.toString(fontSize));
-		return sb.toString();
-	}
-
-	public ICSSFont createFont(ICSSStyle style) {
-		String fontfamily = (String) style
-				.getStyleProperty(ICSSPropertyID.ATTR_FONT_FAMILY);
-		Object fontsizeobj = style
-				.getStyleProperty(ICSSPropertyID.ATTR_FONT_SIZE);
-		int fontsize;
-		fontsize = getFontSize(style, fontsizeobj);
-		int fontstyle = getFontStyle(style);
-		int fontweight = ((Integer) style
-				.getStyleProperty(ICSSPropertyID.ATTR_FONT_WEIGHT)).intValue();
-
-		return new CSSFont(fontfamily, fontsize, fontstyle, fontweight,
-				resolveFontStyleString(style));
-	}
-
-	private int getFontSize(ICSSStyle style, Object fontsizeobj) {
-		int fontsize;
-		if (fontsizeobj instanceof Length) {
-			fontsize = ((Length) fontsizeobj).getValue();
-		} else {
-			fontsize = style.getParentStyle().getCSSFont().getFontSize();
-		}
-		return fontsize;
-	}
-
-	/**
-	 * @param style
-	 */
-	private int getFontStyle(ICSSStyle style) {
-		int fontstyle;
-		String fontstylestr = (String) style
-				.getStyleProperty(ICSSPropertyID.ATTR_FONT_STYLE);
-		if (ICSSPropertyID.VAL_ITALIC.equals(fontstylestr)
-				|| ICSSPropertyID.VAL_OBLIQUE.equals(fontstylestr)) {
-			fontstyle = SWT.ITALIC;
-		} else {
-			fontstyle = SWT.NORMAL;
-		}
-		return fontstyle;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.font.ICSSFontManager#dispose()
-	 */
-	public void dispose() {
-		_cacheManager.disposeAll();
-	}
-
-	/**
-	 * @return the default css font
-	 */
-	public ICSSFont createDefaultFont() {
-		CSSFont result = new CSSFont(FontFamilyMeta.DEFAULT_FONT,
-				(int) FontSizeMeta.MEDIUM_VAL_INT, SWT.NORMAL,
-				FontWeightMeta.NORMAL_WEIGHT.intValue(), ""); //$NON-NLS-1$
-		return result;
-	}
-
-	/**
-	 * @param f
-	 * @return the swt font for f
-	 */
-	public Font getSwtFont(CSSFont f) {
-		return (Font) _cacheManager.getEntry(f);
-	}
-
-	/**
-	 * @return the singleton font manager
-	 */
-	public static CSSFontManager getInstance() {
-		if (_instance == null) {
-			_instance = new CSSFontManager();
-		}
-		return _instance;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/font/ICSSFont.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/font/ICSSFont.java
deleted file mode 100644
index 74adcfb..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/font/ICSSFont.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.font;
-
-import org.eclipse.swt.graphics.Font;
-
-/**
- * XXX: this class should be renamed to CSSFontDescriptor. Since now it is only
- * used to describe a CSSFont.
- * 
- * @author mengbo
- */
-public interface ICSSFont {
-	/**
-	 * Will get a Font system resource from a pool.
-	 * 
-	 * The caller should NOT dispose the returned Font object.
-	 * 
-	 * The caller should not hold reference on the returned Font object, since
-	 * system may dispose it at any time.
-	 * 
-	 * @return the swt font
-	 */
-	public Font getSwtFont();
-
-	/**
-	 * @return the css font family
-	 */
-	public String getFontFamily();
-
-	/**
-	 * @return font size in pixel 
-	 */
-	public int getFontSize();
-
-	/**
-	 * @return font x height in pixel
-	 */
-	public int getXHeight();
-
-	/**
-	 * @return the font weight
-	 */
-	public int getWeight();
-
-	/**
-	 * 
-	 * @return could be SWT.NONE or SWT.ITALIC
-	 */
-	public int getFontStyle();
-
-	/**
-	 * @return the css string
-	 */
-	public String getCSSString();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/font/ICSSFontManager.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/font/ICSSFontManager.java
deleted file mode 100644
index a5a8d3d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/font/ICSSFontManager.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.font;
-
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-
-/**
- * @author mengbo
- */
-public interface ICSSFontManager {
-	/**
-	 * @param style
-	 * @return ??
-	 */
-	public ICSSFont createFont(ICSSStyle style);
-
-	/**
-	 * FIXME: purpose?
-	 */
-	public void dispose();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/html4.css b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/html4.css
deleted file mode 100644
index e91e5de..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/html4.css
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
- * Basic HTML style information.
- */
-html,
-address,
-blockquote,listing,
-body, dd, div,
-dl, dt, fieldset, legend,form,
-frame, frameset,
-h1, h2, h3, h4,
-h5, h6, noframes,noscript,
-ol, p, ul, center,
-dir, hr, menu, pre, plaintext, xmp  { display: block }
-
-ol				{counter-reset: _anonymous; list-style-type: decimal}
-ul,dir,menu  	{counter-reset: _anonymous; list-style-type: disc}
-li           	{display: list-item}
-li				{counter-increment: _anonymous}
-
-head            { display: none }
-table           { display: table }
-tr              { display: table-row }
-thead           { display: table-header-group }
-tbody           { display: table-row-group }
-tfoot           { display: table-footer-group }
-col             { display: table-column }
-colgroup        { display: table-column-group }
-td, th          { display: table-cell; }
-caption         { display: table-caption }
-th              { font-weight: bolder;}
-caption         { text-align: center;horizontal-align:top }
-button, textarea,
-input, object, 
-select, img { display:inline-block; }
-pre,plaintext, xmp   { white-space: pre }
-h1, h2, h3, h4,
-h5, h6, b,
-strong          { font-weight: bold }
-i, cite, em,dfn,
-var, address    { font-style: italic }
-pre, tt, code,plaintext, xmp,
-kbd, samp       { font-family: monospace }
-ol              { list-style-type: decimal }
-br:before       { content: "\A" }
-center          { text-align: center }
-sub             { vertical-align: sub }
-sup             { vertical-align: super }
-u, ins          { text-decoration: underline }
-input			{ text-decoration: none }
-button			{ white-space: nowrap }
-a[href]			{ text-decoration: underline }
-
-/*
- * styles that may be different for different user agent.
- * This part may need to move out and put into different css files.
- */
-body            { line-height: 1.12em }
-h1              { font-size: 2em; margin: .67em 0 }
-h2              { font-size: 1.5em; margin: .75em 0 }
-h3              { font-size: 1.17em; margin: .83em 0 }
-h4, p,ul,
-fieldset, form,
-ol, dl, dir,
-menu            { margin: 1.12em 0 }
-blockquote      { margin: 1em 40px }
-h5              { font-size: .83em; margin: 1.5em 0 }
-h6              { font-size: .75em; margin: 1.67em 0 }
-blockquote      { margin-left: 40px; margin-right: 40px }
-big             { font-size: larger }
-small, sub, sup { font-size: smaller }
-s, strike, del  { text-decoration: line-through }
-hr              { border: 1px inset }
-ol, ul, dir,
-menu, dd        { margin-left: 40px;border:0px }
-ol ul, ul ol,
-ul ul, ol ol    { margin-top: 0; margin-bottom: 0 }
-abbr, acronym   { font-variant: small-caps; letter-spacing: 0.1em }
-a[href]         { color:blue;}
-select			{background-color: window;font-family:sans-serif;font-size:13px;font-weight: normal;}
-textarea		{border: 2px inset;font-size:13px;font-family:monospace}
-textarea,
-input 			{background-color: window}
-input,
-input[type=text],
-input[type=password] {border: 2px inset;font-size:13px;font-family:sans-serif;font-weight: normal;}
-/* following upcased TYPE is for workaround the WTP M2 bug of not setting default content type */
-input[TYPE=submit],input[TYPE=reset],input[TYPE=button],input[TYPE=cancel],
-button,
-input[type=button],
-input[type=reset],
-input[type=cancel],
-input[type=submit] {background-color: ButtonFace; border: 2px outset; font-size:13px;
-					font-family:sans-serif;text-align: center;font-weight: normal;}
-input[type=image],
-input[type=checkbox],
-input[type=radio]  {border: none }
-input[type=hidden]  {border: none }
-img				{border: 0px none}
-listing         {font-family:monospace;font-size: medium;white-space: pre; margin: 1em 0;}
-tbody,thead,tfoot     {vertical-align: middle;}
-blink 			{text-decoration: blink;}
-
-hr 		{margin: 0.5em auto 0.5em auto;}
-caption  {border: 0px none;margin: 0px; padding:0px 0px 4px 0px;}
-td, th,
-table    {border: 4px none;}
-button   {padding: 3px 5px;text-align: center;vertical-align: middle;}
-button,textarea,input   {vertical-align: text-bottom;color:black;font-style:none;}
-select {vertical-align: text-bottom;}
-input[type=image]  {vertical-align: baseline;}
-li   {min-height:1.2em}
-button {min-height:1.8em}
-div,tr,form {min-height:1.2em}
-table,td {min-width:1.2em;min-height:1.2em}
-
-/* nested lists have no top/bottom margins */
-ul ul,   ul ol,   ul dir,   ul menu,   ul dl,
-ol ul,   ol ol,   ol dir,   ol menu,   ol dl,
-dir ul,  dir ol,  dir dir,  dir menu,  dir dl,
-menu ul, menu ol, menu dir, menu menu, menu dl,
-dl ul,   dl ol,   dl dir,   dl menu,   dl dl 	{margin-top: 0; margin-bottom: 0;}
-
-/* 2 deep unordered lists use a circle */
-ol ul,   ul ul,   menu ul,   dir ul,
-ol menu, ul menu, menu menu, dir menu,
-ol dir,  ul dir,  menu dir,  dir dir 	{list-style-type: circle;}
-
-/* 3 deep (or more) unordered lists use a square */
-ol ol ul,     ol ul ul,     ol menu ul,     ol dir ul,
-ol ol menu,   ol ul menu,   ol menu menu,   ol dir menu,
-ol ol dir,    ol ul dir,    ol menu dir,    ol dir dir,
-ul ol ul,     ul ul ul,     ul menu ul,     ul dir ul,
-ul ol menu,   ul ul menu,   ul menu menu,   ul dir menu,
-ul ol dir,    ul ul dir,    ul menu dir,    ul dir dir,
-menu ol ul,   menu ul ul,   menu menu ul,   menu dir ul,
-menu ol menu, menu ul menu, menu menu menu, menu dir menu,
-menu ol dir,  menu ul dir,  menu menu dir,  menu dir dir,
-dir ol ul,    dir ul ul,    dir menu ul,    dir dir ul,
-dir ol menu,  dir ul menu,  dir menu menu,  dir dir menu,
-dir ol dir,   dir ul dir,   dir menu dir,   dir dir dir { list-style-type: square;}
-
-/**
- * We do not write codes to support some elements. This part defines properties for them 
- * to improve the look of these elements.
- */
-applet {border: 1px solid;}
-fieldset {border: 2px groove;}
-applet,iframe {display:inline-block; border:3px inset; }
-object {display:inline-block;border:0px none;}
-
-
-/* 
- * Sets right margin to have gap between widgets.
- */
-input,textarea,button	 { margin-right: 2px;}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/BlockBox.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/BlockBox.java
deleted file mode 100644
index d20bc7a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/BlockBox.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-import org.eclipse.draw2d.geometry.Rectangle;
-
-/**
- * A CompositeBox suitable for containing multiple LineBox fragments. Based on
- * BlockBox of draw2d.
- * 
- * @author mengbo
- */
-public class BlockBox extends CompositeBox {
-	// internalContent dimension is for the closure of the FlowBox(es) added
-	// into the BlockBox.
-	private int _internalContentWidth = -1;
-
-	private int _internalContentHeight = -1;
-
-	Rectangle toRectangle() {
-		return new Rectangle(_x, _y, Math.max(_width, _recommendedWidth),
-				_height);
-	}
-
-	/**
-	 * Sets the height.
-	 * 
-	 * @param h
-	 *            The height
-	 */
-	public void setHeight(int h) {
-		_height = h;
-	}
-
-	/**
-	 * Unions the dimensions of this with the dimensions of the passed FlowBox.
-	 * For BlockBox, each time unionInfo is called, the passed in object
-	 * represents a line.
-	 * 
-	 * @param box
-	 *            The FlowBox to union this with
-	 */
-	protected void unionInfo(FlowBox box) {
-		_width = Math.max(_width, box._width + this.getBorderPaddingWidth());
-		_height = Math.max(_height, box._y + box._height
-				+ this.getBorderPaddingHeight());
-
-		_internalContentWidth = Math.max(_internalContentWidth, box._width);
-		_internalContentHeight = Math.max(_internalContentHeight, box._y
-				+ box._height);
-	}
-
-	int getInternalContentWidth() {
-		return _internalContentWidth;
-	}
-
-	int getInternalContentHeight() {
-		return _internalContentHeight;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowBox#getAscent()
-	 */
-	public int getAscent() {
-		// XXX: some hard coded things here. If the blockbox is only for a
-		// single widget, and if that widget support ascent, then we'll
-		// delegate to that widget for ascent support.
-		// if (_fragments.size()==1)
-		// {
-		// FlowBox box = (FlowBox) _fragments.get(0);
-		// if (box instanceof LineBox)
-		// {
-		// List linecomponents = ((LineBox) box).getFragments();
-		// if (linecomponents != null && linecomponents.size() == 1)
-		// {
-		// FlowBox box2 = (FlowBox) linecomponents.get(0);
-		// if (box2 instanceof WidgetBox)
-		// {
-		// WidgetBox widgetBox = (WidgetBox) box2;
-		// if (widgetBox.supportAscent())
-		// {
-		// return widgetBox.getAscent() + this.getBorderPaddingInsets().top;
-		// }
-		// }
-		// }
-		// }
-		// }
-		return super.getAscent();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/BlockFlow.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/BlockFlow.java
deleted file mode 100644
index 675fdeb..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/BlockFlow.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-import java.util.List;
-
-import org.eclipse.draw2d.PositionConstants;
-
-/**
- * A <code>FlowFigure</code> represented by a single {@link BlockBox}fragment
- * containing one or more lines. A BlockFlow is a creator of LineBoxes, which
- * its children require during layout. A BlockFlow can be thought of as a
- * paragraph.
- * <P>
- * BlockFlows should be nested inside other BlockFlows, but it is also valid to
- * place them in InlineFlows. {@link FlowPage}can be used as a "root" block and
- * can be added to normal draw2d Figures.
- * <P>
- * Only {@link FlowFigure}s can be added to a BlockFlow.
- */
-/*package*/ class BlockFlow extends FlowFigure {
-
-	final BlockBox _blockBox;
-
-	private int _aligment;
-
-	/**
-	 * Constructs a new BlockFlow.
-	 */
-	public BlockFlow() {
-		setLayoutManager(createDefaultFlowLayout());
-		_blockBox = createBlockBox();
-	}
-
-	BlockBox createBlockBox() {
-		return new BlockBox();
-	}
-
-	/**
-	 * @return the default flow layout
-	 * 
-	 */
-	protected FlowFigureLayout createDefaultFlowLayout() {
-		return new BlockFlowLayout(this);
-	}
-
-	/**
-	 * Returns the BlockBox associated with this.
-	 * 
-	 * @return This BlockFlow's BlockBox
-	 */
-	protected BlockBox getBlockBox() {
-		return _blockBox;
-	}
-
-	/**
-	 * Returns the horizontal aligment.
-	 * 
-	 * @return the hotizontal aligment
-	 */
-	public int getHorizontalAligment() {
-		return _aligment & PositionConstants.LEFT_CENTER_RIGHT;
-	}
-
-	/**
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowFigure#postValidate()
-	 */
-	public void postValidate() {
-		setBounds(getBlockBox().toRectangle().expand(getInsets()));
-		List v = getChildren();
-		for (int i = 0, n = v.size(); i < n; i++) {
-			((FlowFigure) v.get(i)).postValidate();
-		}
-	}
-
-	/**
-	 * Sets the horitontal aligment of the block. Valid values are:
-	 * <UL>
-	 * <LI>{@link org.eclipse.draw2d.PositionConstants#LEFT}
-	 * <LI>{@link org.eclipse.draw2d.PositionConstants#RIGHT}
-	 * <LI>{@link org.eclipse.draw2d.PositionConstants#CENTER}
-	 * 
-	 * @param value
-	 *            the aligment
-	 */
-	public void setHorizontalAligment(int value) {
-		if (!(value == PositionConstants.LEFT
-				|| value == PositionConstants.RIGHT || value == PositionConstants.CENTER)) {
-			throw new IllegalArgumentException(
-					"Horizontal Aligment must be one of: LEFT, CENTER, RIGHT"); //$NON-NLS-1$
-		}
-		this._aligment &= ~PositionConstants.LEFT_CENTER_RIGHT;
-		this._aligment |= value;
-		revalidate();
-	}
-
-	/**
-	 * @see org.eclipse.draw2d.Figure#useLocalCoordinates()
-	 */
-	protected boolean useLocalCoordinates() {
-		return true;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/BlockFlowContext.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/BlockFlowContext.java
deleted file mode 100644
index 44c43c8..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/BlockFlowContext.java
+++ /dev/null
@@ -1,288 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.css2.value.Length;
-
-/**
- * When doing absolute positioning, we need to create a block. But that block
- * don't have a corresponding figure. So we need a block without corresponding
- * figure.
- * 
- * @author mengbo
- * @version 1.5
- */
-public class BlockFlowContext implements FlowContext {
-	private LineBox _currentLine;
-
-	private LineBox _previousLine = null;
-
-	BlockBox _blockBox;
-
-	private final FlowContext _originalContext;
-
-	private final ICSSStyle _style;
-
-	/**
-	 * @param originalContext 
-	 * @param style 
-	 */
-	public BlockFlowContext(FlowContext originalContext, ICSSStyle style) {
-		this._originalContext = originalContext;
-		this._style = style;
-		setup();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowContext#getContainerWidth()
-	 */
-	public int getContainerWidth() {
-
-		return _originalContext.getContainerWidth();
-	}
-
-	/**
-	 * Initialize the object
-	 */
-	private void setup() {
-		_blockBox = new BlockBox();
-		_blockBox.setRecommendedWidth(getRecommendedWidth());
-		_currentLine = this.getCurrentLine();
-		_previousLine = null;
-	}
-
-	private int getRecommendedWidth() {
-		int containerWidth = getContainerWidth();
-		Object leftObj = _style.getStyleProperty(ICSSPropertyID.ATTR_LEFT);
-		if (leftObj != null && leftObj instanceof Length) {
-			Length left = (Length) leftObj;
-			int intLeft = left.getValue();
-			if (left.isPercentage()) {
-				intLeft = containerWidth * intLeft / 100;
-			}
-			if (intLeft < containerWidth) {
-				return containerWidth - intLeft;
-			}
-		}
-		return containerWidth;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowContext#addToCurrentLine(org.eclipse.jst.pagedesigner.css2.layout.FlowBox)
-	 */
-	public void addToCurrentLine(FlowBox block) {
-		getCurrentLine().add(block);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowContext#endLine()
-	 */
-	public void endLine() {
-		// this is called from child layouts.
-		// If there is no current line, state is equivalent to new line
-		if (_currentLine == null)
-			return;
-		if (_currentLine.isOccupied())
-			layoutLine(); // finalize the current line layout
-		else
-			return;
-
-		LineBox box = _currentLine;
-		// _currentLine = _previousLine; //XXX: ???? why (yang)
-		_previousLine = box;
-
-		_currentLine = null;
-		// setupLine(getCurrentLine());
-
-	}
-
-	/**
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowContext#getCurrentLine()
-	 */
-	public LineBox getCurrentLine() {
-		if (_currentLine == null)
-			createNewLine();
-		return _currentLine;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowContext#getCurrentLine(int)
-	 */
-	public LineBox getCurrentLine(int topMargin) {
-		if (_currentLine == null)
-			createNewLine(topMargin);
-		return _currentLine;
-	}
-
-	/**
-	 * @param topMargin
-	 */
-	private void createNewLine(int topMargin) {
-		createNewLine();
-	}
-
-	private void createNewLine() {
-		_currentLine = new LineBox();
-		setupLine(_currentLine, Integer.MIN_VALUE);
-	}
-
-	/**
-	 * Override to setup the line's x, remaining, and available width.
-	 * 
-	 * @param line
-	 *            the LineBox to set up
-	 * @param topMargin 
-	 */
-	protected void setupLine(LineBox line, int topMargin) {
-		line.clear();
-
-		// the caller of getCurrentLine() may add leftMargin and leftPadding and
-		// leftBorder to line.x
-		line._x = _blockBox.getBorderInsets().left + _blockBox.getPaddingInsets().left;
-
-		// FIXME: here should check the floating boxes, and minus the width of
-		// them from
-		// current line.
-		// XXX: the RecommendedContentWidth is related with the RecommendedWidth
-		// of container that
-		// usually larger than it needed.here we do not set the RecommendedWidth
-		// for the sake of
-		// layouting right absolute position.
-		// /shortcoming:the box will break into multi-line after every white
-		// space.
-		// line.setRecommendedWidth(_blockBox.getRecommendedContentWidth());
-		if (_previousLine == null) {
-			line._y = _blockBox.getBorderInsets().top
-					+ _blockBox.getPaddingInsets().top;
-			if (topMargin != Integer.MIN_VALUE)
-				line._y += topMargin;
-		} else {
-			if (topMargin == Integer.MIN_VALUE)
-				line._y = _previousLine._y + _previousLine.getHeight()
-						+ getLinePadding() + _previousLine.getMarginInsets().bottom; // XXX:
-			// should
-			// add
-			// previous
-			// margin
-			// bottom?
-			else
-				line._y = _previousLine._y
-						+ _previousLine.getHeight()
-						+ Math.max(topMargin,
-								_previousLine.getMarginInsets().bottom);
-		}
-		// line.validate();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowContext#getCurrentY()
-	 */
-	public int getCurrentY() {
-		return getCurrentLine()._y; // FIXME: margin of previous block?
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowContext#isCurrentLineOccupied()
-	 */
-	public boolean isCurrentLineOccupied() {
-		return _currentLine != null && _currentLine.isOccupied();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowContext#getLastMarginRight()
-	 */
-	public int getLastMarginRight() {
-		if (_currentLine == null || !_currentLine.isOccupied()) {
-			return 0;
-		}
-		FlowBox box = (FlowBox) _currentLine.getFragments().get(
-				_currentLine.getFragments().size() - 1);
-		if (box != null) {
-			return box.getMarginInsets().right;
-		}
-        return 0;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowContext#isCalculatingMaxWidth()
-	 */
-	public boolean isCalculatingMaxWidth() {
-		return false;
-	}
-
-	/**
-	 * Adjust all fragments in the current line to have the same baseline. Do
-	 * any additional adjustments, such as horizontal alignment.
-	 */
-	protected void layoutLine() {
-		// currentLine.x = 0; //XXX: comment out, don't understand why set to 0,
-		// because it has already
-		// been set when setupLine(). And if do need, should
-		// set to getBorderPaddingInsets().left
-		// if (!isInlineBlock() && shouldExpand())
-		// {
-		// // FIXME: currently we are using getRecommendedContentWidth,
-		// // what happen if after adding the new line, the new width is bigger
-		// than
-		// // recommendedContentWidth? should we use getWidth() instead of
-		// // recommendedcontentWidth?
-		//
-		// Object textalign =
-		// (getCSSStyle().getStyleProperty(ICSSPropertyID.ATTR_TEXTALIGN));
-		// if (textalign == ICSSPropertyID.VAL_RIGHT)
-		// {
-		// _currentLine._x = _blockBox.getRecommendedContentWidth() +
-		// _blockBox.getBorderPaddingInsets().left - _currentLine.getWidth();
-		// }
-		// else if (textalign == ICSSPropertyID.VAL_CENTER)
-		// {
-		//
-		// _currentLine._x = _blockBox.getBorderPaddingInsets().left +
-		// (_blockBox.getRecommendedContentWidth() - _currentLine.getWidth()) /
-		// 2;
-		// }
-		// if (_currentLine._x < 0)
-		// _currentLine._x = 0;
-		// }
-
-		// FIXME: should check vertical alignment here?
-		_currentLine.commit();
-		_blockBox.add(_currentLine);
-	}
-
-	void endBlock() {
-		endLine();
-	}
-
-	int getLinePadding() {
-		return 0;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/BlockFlowLayout.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/BlockFlowLayout.java
deleted file mode 100644
index 05bf6c4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/BlockFlowLayout.java
+++ /dev/null
@@ -1,253 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-import org.eclipse.draw2d.PositionConstants;
-import org.eclipse.draw2d.geometry.Insets;
-
-/**
- * The layout for {@link BlockFlow}figures.
- * <P>
- * WARNING: This class is not intended to be subclassed by clients.
- * 
- * @author mengbo
- * @since 2.1
- */
-public class BlockFlowLayout extends FlowContainerLayout {
-	private LineBox _previousLine = null;
-
-	BlockBox _blockBox;
-
-	/**
-	 * Creates a new BlockFlowLayout with the given BlockFlow.
-	 * 
-	 * @param blockFlow
-	 *            the BlockFlow
-	 */
-	public BlockFlowLayout(BlockFlow blockFlow) {
-		super(blockFlow);
-	}
-
-	/**
-	 * @see FlowContainerLayout#cleanup()
-	 */
-	protected void cleanup() {
-		_currentLine = _previousLine = null;
-	}
-
-	/**
-	 * @see FlowContainerLayout#createNewLine()
-	 */
-	protected void createNewLine() {
-		_currentLine = new LineBox();
-		setupLine(_currentLine, Integer.MIN_VALUE);
-	}
-
-	protected void createNewLine(int topmargin) {
-		_currentLine = new LineBox();
-		setupLine(_currentLine, topmargin);
-	}
-
-	/**
-	 * Override to setup the line's x, remaining, and available width.
-	 * 
-	 * @param line
-	 *            the LineBox to set up
-	 * @param topMargin 
-	 */
-	protected void setupLine(LineBox line, int topMargin) {
-		line.clear();
-
-		// the caller of getCurrentLine() may add leftMargin and leftPadding and
-		// leftBorder to line.x
-		line._x = 0;
-
-		// FIXME: here should check the floating boxes, and minus the width of
-		// them from
-		// current line.
-		line.setRecommendedWidth(_blockBox.getRecommendedContentWidth());
-		if (_previousLine == null) {
-			line._y = 0;
-			if (topMargin != Integer.MIN_VALUE) {
-				line._y += topMargin;
-			}
-		} else {
-			if (topMargin == Integer.MIN_VALUE) {
-				line._y = _previousLine._y + _previousLine.getHeight()
-						+ getLinePadding() + _previousLine.getMarginInsets().bottom; // XXX:
-				// should
-				// add
-				// previous
-				// margin
-				// bottom?
-			} else {
-				line._y = _previousLine._y
-						+ _previousLine.getHeight()
-						+ Math.max(topMargin,
-								_previousLine.getMarginInsets().bottom);
-			}
-		}
-		// line.validate();
-	}
-
-	/**
-	 * Called by flush(), adds the BlockBox associated with this BlockFlowLayout
-	 * to the current line and then ends the line.
-	 */
-	protected void endBlock() {
-		getFlowContext().addToCurrentLine(_blockBox);
-
-		// FIXME: here should tell the context the bottom margin.
-		getFlowContext().endLine();
-	}
-
-	/**
-	 * @see FlowContext#endLine()
-	 */
-	public void endLine() {
-		// this is called from child layouts.
-		// If there is no current line, state is equivalent to new line
-		if (_currentLine == null) {
-			return;
-		}
-		if (_currentLine.isOccupied()) {
-			layoutLine(); // finalize the current line layout
-		} else {
-			_currentLine = null;
-			return;
-		}
-		LineBox box = _currentLine;
-		_previousLine = box;
-		_currentLine = null;// _previousLine; //XXX: ???? why (yang)
-
-		// setupLine(getCurrentLine());
-	}
-
-	/**
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowContext#getCurrentY()
-	 */
-	public int getCurrentY() {
-		return getCurrentLine()._y; // FIXME: margin of previous block?
-	}
-
-	/**
-	 * Returns the BlockFlow associated with this BlockFlowLayout
-	 * 
-	 * @return the BlockFlow
-	 */
-	protected final BlockFlow getBlockFlow() {
-		return (BlockFlow) getFlowFigure();
-	}
-
-	/**
-	 * Adjust all fragments in the current line to have the same baseline. Do
-	 * any additional adjustments, such as horizontal alignment.
-	 */
-	protected void layoutLine() {
-		// currentLine.x = 0; //XXX: comment out, don't understand why set to 0,
-		// because it has already
-		// been set when setupLine(). And if do need, should
-		// set to getBorderPaddingInsets().left
-		switch (getBlockFlow().getHorizontalAligment()) {
-		case PositionConstants.RIGHT:
-			_currentLine._x = _blockBox.getContentWidth()
-					- getBorderPaddingInsets().right - _currentLine.getWidth();
-			break;
-		case PositionConstants.CENTER:
-			_currentLine._x = (_blockBox.getContentWidth()
-					+ getBorderPaddingInsets().left
-					- getBorderPaddingInsets().right - _currentLine.getWidth()) / 2;
-			break;
-		}
-		// FIXME: should check vertical alignment here?
-		_currentLine.commit();
-		_blockBox.add(_currentLine);
-	}
-
-	/**
-	 * @see FlowContainerLayout#flush()
-	 */
-	protected void flush() {
-		if (_currentLine != null)
-			layoutLine();
-		endBlock();
-	}
-
-	/**
-	 * @see FlowContainerLayout#preLayout()
-	 */
-	protected void preLayout() {
-		_blockBox = getBlockFlow().getBlockBox();
-		setupBlock();
-		// Probably could setup current and previous line here, or just previous
-	}
-
-	/**
-	 * sets up the single block that contains all of the lines.
-	 */
-	protected void setupBlock() {
-		// Ask for a new line, in case we are in the middle of a line
-
-		// FIXME: the endLine() should tell context the top margin of this
-		// block.
-		getFlowContext().endLine();
-
-		LineBox line = getFlowContext().getCurrentLine();
-		// int recommended = line.getAvailableWidth();
-		// if (recommended != previousRecommendedWidth)
-		// Remove all current Fragments
-		_blockBox.clear();
-
-		// Setup the one fragment for this Block with the correct X and
-		// available width
-
-		// FIXME: here should check whether the CSS already set recommended
-		// width for this
-		// block.
-		_blockBox.setRecommendedWidth(line.getAvailableWidth());
-
-		_blockBox._y = getFlowContext().getCurrentY();
-
-		// FIXME: blockBox.x should be context.getBorderPaddingInsets().left
-		// or just line.x ?
-		_blockBox._x = 0;
-	}
-
-	Insets getBorderPaddingInsets() {
-		// FIXME:
-		return new Insets();
-	}
-
-	int getLinePadding() {
-		return 0;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowFigureLayout#dispose()
-	 */
-	public void dispose() {
-        // TODO: anything to dispose?
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowContext#getContainerWidth()
-	 */
-	public int getContainerWidth() {
-		int width = Math.max(0, Math.max(_blockBox.getWidth(), _blockBox
-				.getRecommendedWidth()));
-		return width;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/BoxUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/BoxUtil.java
deleted file mode 100644
index b91e30e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/BoxUtil.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.geometry.Insets;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.swt.graphics.Color;
-
-/**
- * @author mengbo
- */
-public class BoxUtil {
-	/**
-	 * @param box
-	 * @param style
-	 */
-	public static void setupBorderPaddingMargin(FlowBox box, ICSSStyle style) {
-		box.setMarginInsets(new Insets(style.getMarginInsets()));
-		box.setBorderInsets(new Insets(style.getBorderInsets()));
-		box.setPaddingInsets(new Insets(style.getPaddingInsets()));
-
-		if (box.getBorderPaddingHeight() > box.getHeight()) {
-			box.setHeight(box.getBorderPaddingHeight());
-		}
-		if (box.getBorderPaddingWidth() > box.getWidth()) {
-			box.setWidth(box.getBorderPaddingWidth());
-		}
-	}
-
-	/**
-	 * Debug code.
-	 * 
-	 * @param g
-	 * @param box
-	 */
-	public static void drawBox(Graphics g, FlowBox box) {
-		Color color = null;
-		if (box instanceof BlockBox) {
-			// color = ColorConstants.red;
-		} else if (box instanceof LineBox) {
-			color = ColorConstants.blue;
-		} else if (box instanceof TextFragmentBox) {
-			color = ColorConstants.green;
-		} else {
-			color = ColorConstants.darkGreen;
-		}
-		if (color != null) {
-			g.setForegroundColor(color);
-			g.setLineStyle(Graphics.LINE_DASH);
-			g.setLineWidth(1);
-			g.drawRectangle(box._x, box._y, box.getWidth(), box.getHeight());
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CSSBlockFlowLayout.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CSSBlockFlowLayout.java
deleted file mode 100644
index e37deff..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CSSBlockFlowLayout.java
+++ /dev/null
@@ -1,745 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.draw2d.FigureUtilities;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.geometry.Insets;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyMeta;
-import org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo;
-import org.eclipse.jst.pagedesigner.css2.value.Length;
-import org.eclipse.jst.pagedesigner.css2.widget.BorderUtil;
-import org.eclipse.swt.graphics.FontMetrics;
-
-/**
- * The block layout for {@link CSSFigure}figures. Basic code structure is from
- * BlockFlowLayout.
- * 
- * @author mengbo
- */
-public class CSSBlockFlowLayout extends CSSLayout implements ICSSPainter2 {
-	private LineBox _previousLine = null;
-
-	/**
-	 * the block box for the layout object
-	 */
-	protected BlockBox _blockBox = null;
-
-	/**
-	 * The font metrics for this layout object
-	 */
-	protected FontMetrics _fontMetrices;
-
-	int _userSpecifiedWidth;
-
-	int _userSpecifiedHeight;
-
-	/*
-	 * whether we need HScroll and VScroll when overflow is set to "scroll".
-	 * will be updated in "endBlock" and used in "paintFigurePostClientArea"
-	 */
-	boolean _needHScroll = false;
-
-	boolean _needVScroll = false;
-
-	/**
-     * Creates a new CSSBlockFlowLayout with the given BlockFlow.
-	 * @param cssfigure
-	 */
-	public CSSBlockFlowLayout(CSSFigure cssfigure) {
-		super(cssfigure);
-	}
-
-	/**
-	 * @return true if this layout box has more than one line
-	 */
-	protected boolean hasMoreThanOneLine() {
-		return _previousLine != null;
-	}
-
-	/**
-	 * @return true if this layout block is inline
-	 */
-	public boolean isInlineBlock() {
-		String obj = getCSSStyle().getDisplay();
-		return ICSSPropertyID.VAL_INLINE_BLOCK.equals(obj)
-				|| ICSSPropertyID.VAL_INLINE_TABLE.equals(obj);
-	}
-
-	/**
-	 * @return true if should expand the width to all available width. 
-	 */
-	public boolean shouldExpand() {
-		ICSSStyle style = getCSSStyle();
-		if (style == null) {
-			return false;
-		}
-        return "block".equalsIgnoreCase(style.getDisplay()) //$NON-NLS-1$
-        		|| "list-item".equalsIgnoreCase(style.getDisplay()); //$NON-NLS-1$
-	}
-
-	// ---------------------------------------------------------------------------------------------------
-	// preLayout stage. Major job is get the top-left corner information of the
-	// new block.
-
-	/**
-	 * sets up the single block that contains all of the lines.
-	 */
-	protected void setupBlock() {
-		// int recommended = line.getAvailableWidth();
-		// if (recommended != previousRecommendedWidth)
-		// Remove all current Fragments
-		_blockBox.clear();
-		// Ask for a new line, in case we are in the middle of a line
-
-		if (!isInlineBlock()) {
-			LineBox lineBox = getFlowContext().getCurrentLine();
-			if (lineBox != null && !lineBox.isEmptyStringLine()) {
-				getFlowContext().endLine();
-			}
-		}
-
-		ICSSStyle style = getCSSStyle();
-
-		// endLine will result in context create a new line, so we are in the
-		// new line now.
-		// passing in the top margin, and context will consider that when create
-		// the new line.
-		int marginTop = style.getMarginInsets().top;
-		LineBox line = getFlowContext().getCurrentLine(marginTop);
-
-		// Setup the one fragment for this Block with the correct X and
-		// available width
-
-		// FIXME: according to spec, when using percentage width/height, should
-		// percentage to
-		// the "containing block". But we don't have very good "containing
-		// block" resolution
-		// implementation yet.
-
-		// calculate the min size
-		// int minWidth = 0;
-		// int minHeight = 0;
-		// if (style != null)
-		// {
-		// // try to see whether there is any designer specified min size
-		// ITagEditInfo info = (ITagEditInfo)
-		// style.getAdapter(ITagEditInfo.class);
-		// if (info != null)
-		// {
-		// minWidth = info.getMinWidth();
-		// minHeight = info.getMinHeight();
-		// }
-		//
-		// // CSS also has the min-width/min-height property. We should also get
-		// that,
-		// // and using the max of the "min-width" css property and the designer
-		// specified min size.
-		// int height = getLengthValue(style,ICSSPropertyID.ATTR_MIN_HEIGHT);
-		// if(height > minHeight)
-		// {
-		// minHeight = height;
-		// }
-		// int width = getLengthValue(style,ICSSPropertyID.ATTR_MIN_WIDTH);
-		// if(width > minWidth)
-		// {
-		// minWidth = width;
-		// }
-		// }
-
-		// keep track of user specified size, this will be used when handling
-		// the "overflow" CSS property.
-		_userSpecifiedWidth = 0;
-		_userSpecifiedHeight = 0;
-
-		{
-			int width = getLengthValue(style, ICSSPropertyID.ATTR_WIDTH);
-
-			int availableWidth = line.getAvailableWidth()
-					- style.getMarginInsets().getWidth();
-			if (width <= 0) {
-				// no width setting
-				if (isCalculatingMaxWidth()) {
-					_blockBox.setRecommendedWidth(Integer.MAX_VALUE);
-					// _blockBox.setWidth( (minWidth>0?minWidth:0));
-				} else {
-					_blockBox.setRecommendedWidth(availableWidth);
-					if (shouldExpand()) {
-						_blockBox.setWidth(availableWidth);
-					} else {
-						// _blockBox.setWidth( (minWidth>0?minWidth:0));
-					}
-				}
-			} else {
-				int w = width;
-				if (!style.isSizeIncludeBorderPadding()) {
-					w += style.getBorderInsets().getWidth()
-							+ style.getPaddingInsets().getWidth();
-				}
-				// XXX: should we use minWidth or follow user's choice?
-				// if (w < minWidth)
-				// {
-				// w = minWidth;
-				// }
-				_userSpecifiedWidth = w;
-				_blockBox.setWidth(w);
-				_blockBox.setRecommendedWidth(w);
-			}
-		}
-
-		{
-			int height = getLengthValue(style, ICSSPropertyID.ATTR_HEIGHT);
-			// Object height =
-			// style.getStyleProperty(ICSSPropertyID.ATTR_HEIGHT);
-			// Length heightLength = (height instanceof Length) ? (Length)
-			// height : null;
-
-			if (height <= 0) {
-				// if (minHeight > 0)
-				// {
-				// // _blockBox.setHeight(minHeight);
-				// _blockBox.setRecommendedHeight(minHeight);
-				// }
-				// else
-				{
-					_blockBox.setHeight(0);
-					_blockBox.setRecommendedHeight(0);
-				}
-			} else {
-				int h = height;
-				if (handlingBorderForBlock()
-						&& !style.isSizeIncludeBorderPadding()) {
-					h += style.getBorderInsets().getHeight()
-							+ style.getPaddingInsets().getHeight();
-				}
-				// XXX: should we follow minHeight or user's choice?
-				// if (minHeight > h)
-				// {
-				// h = minHeight;
-				// }
-				_userSpecifiedHeight = h;
-				_blockBox.setHeight(h);
-				_blockBox.setRecommendedHeight(h);
-			}
-		}
-		_blockBox.setMarginInsets(new Insets(style.getMarginInsets()));
-		if (handlingBorderForBlock()) {
-			BoxUtil.setupBorderPaddingMargin(_blockBox, getCSSStyle());
-		}
-
-		// as in designer, we don't want to the element to have zero size, so
-		// set a minimun size here.
-		// _blockBox.setWidth(Math.max(20, _blockBox.getWidth()));
-		// int minHeight = getCSSStyle().getCSSFont().getFontSize() +
-		// _blockBox.getBorderPaddingHeight();
-		// _blockBox.setHeight(Math.max(minHeight, _blockBox.getHeight()));
-
-		_blockBox._y = line._y;
-		_blockBox._x = line._x;
-
-		setBlockVerticalAlign(_blockBox);
-	}
-
-	/**
-	 * @param style
-	 * @param property
-	 * @return the length value
-	 */
-	protected int getLengthValue(ICSSStyle style, String property) {
-		int lengthValue = 0;
-		if (style != null) {
-			Object object = style.getStyleProperty(property);
-			Length lengthObj = (object instanceof Length) ? (Length) object
-					: null;
-
-			if (lengthObj != null) {
-				lengthValue = lengthObj.getValue();
-				if (lengthObj.isPercentage()) {
-					if (ICSSPropertyID.ATTR_WIDTH.equalsIgnoreCase(property)
-							|| ICSSPropertyID.ATTR_MIN_WIDTH
-									.equalsIgnoreCase(property)) {
-						lengthValue = this.getFlowContext().getCurrentLine().getRecommendedContentWidth()
-								* lengthValue / 100;
-					} else if (ICSSPropertyID.ATTR_HEIGHT
-							.equalsIgnoreCase(property)
-							|| ICSSPropertyID.ATTR_MIN_HEIGHT
-									.equalsIgnoreCase(property)) {
-						// XXX: we should omit it because we don't support
-						// percentage height now.
-						lengthValue = 0;
-					}
-				}
-			}
-		}
-		return lengthValue;
-	}
-
-	private void setBlockVerticalAlign(BlockBox box) {
-		ICSSStyle style = getCSSStyle();
-		if (style != null) {
-			box.setVerticalAlignData(style
-					.getStyleProperty(ICSSPropertyID.ATTR_VERTICAL_ALIGN));
-		}
-	}
-
-	/**
-	 * @see FlowContainerLayout#preLayout()
-	 */
-	protected void preLayout() {
-		super.preLayout();
-		_blockBox = new BlockBox();
-		setupBlock();
-		// Probably could setup current and previous line here, or just previous
-	}
-
-	// -------------------------------------------------------------------------------------------------------
-	/**
-	 * layout the lines in this layout
-	 */
-	protected void layoutLines() {
-		List lines = _blockBox.getFragments();
-		if (lines != null) {
-			for (int i = 0; i < lines.size(); i++) {
-				if (lines.get(i) instanceof LineBox) {
-					layoutLine((LineBox) lines.get(i));
-				}
-			}
-		}
-	}
-
-	/**
-	 * Called by flush(), adds the BlockBox associated with this BlockFlowLayout
-	 * to the current line and then ends the line.
-	 */
-	protected void endBlock() {
-		layoutLines();
-		ICSSStyle style = getCSSStyle();
-		if (style != null) {
-			int minWidth = 0;
-			int minHeight = 0;
-			// try to see whether there is any designer specified min size
-			ITagEditInfo info = (ITagEditInfo) style
-					.getAdapter(ITagEditInfo.class);
-			if (info != null) {
-				minWidth = info.getMinWidth();
-				minHeight = info.getMinHeight();
-			}
-
-			// CSS also has the min-width/min-height property. We should also
-			// get that,
-			// and using the max of the "min-width" css property and the
-			// designer specified min size.
-			int height = getLengthValue(style, ICSSPropertyID.ATTR_MIN_HEIGHT);
-			if (height > minHeight) {
-				minHeight = height;
-			}
-			int width = getLengthValue(style, ICSSPropertyID.ATTR_MIN_WIDTH);
-			if (width > minWidth) {
-				minWidth = width;
-			}
-			if (minHeight > _blockBox.getHeight()) {
-				_blockBox.setHeight(minHeight);
-			}
-			if (minWidth > _blockBox.getWidth()) {
-				_blockBox.setWidth(minWidth);
-			}
-		}
-
-		// reset scroll information.
-		this._needHScroll = this._needVScroll = false;
-
-		// ok, now we need to adjust the _blockBox's size according to the
-		// "overflow" setting.
-		// depends on different "overflow" style of this block, different sizing
-		// policy may apply.
-		// ICSSStyle style = this.getCSSStyle();
-		if (style != null) {
-			Object overflow = style
-					.getStyleProperty(ICSSPropertyID.ATTR_OVERFLOW);
-			if (ICSSPropertyID.VAL_HIDDEN.equals(overflow)) {
-				if (_userSpecifiedWidth > 0) {
-					_blockBox.setWidth(_userSpecifiedWidth);
-				}
-				if (_userSpecifiedHeight > 0) {
-					_blockBox.setHeight(_userSpecifiedHeight);
-				}
-			} else if (ICSSPropertyID.VAL_SCROLL.equals(overflow)
-					|| ICSSPropertyID.VAL_AUTO.equals(overflow)) {
-				// adjust _needHScroll and _needVScroll
-				if (_userSpecifiedWidth > 0
-						&& _userSpecifiedWidth < _blockBox.getWidth()) {
-					_needHScroll = true;
-				}
-				if (_userSpecifiedHeight > 0
-						&& _userSpecifiedHeight < _blockBox.getHeight()) {
-					_needVScroll = true;
-				}
-				if (_needHScroll && !_needVScroll) {
-					if (_userSpecifiedHeight > 0
-							&& _blockBox.getInternalContentHeight() >= 0
-							&& _userSpecifiedHeight < _blockBox
-									.getInternalContentHeight()
-									+ _blockBox.getPaddingInsets().getHeight()
-									+ BorderUtil.SCROLL_WIDTH) {
-						_needVScroll = true;
-					}
-				}
-				if (!_needHScroll && _needVScroll) {
-					if (_userSpecifiedWidth > 0
-							&& _blockBox.getInternalContentWidth() >= 0
-							&& _userSpecifiedWidth < _blockBox
-									.getInternalContentWidth()
-									+ _blockBox.getPaddingInsets().getWidth()
-									+ BorderUtil.SCROLL_WIDTH) {
-						_needHScroll = true;
-					}
-				}
-
-				if (_userSpecifiedWidth > 0) {
-					_blockBox.setWidth(_userSpecifiedWidth);
-				}
-				if (_userSpecifiedHeight > 0) {
-					_blockBox.setHeight(_userSpecifiedHeight);
-				}
-			}
-		}
-
-		if (getFlowContext().isCurrentLineOccupied()
-				&& getFlowContext().getCurrentLine().getAvailableWidth() < _blockBox._width
-						+ _blockBox.getMarginInsets().getWidth()) {
-			getFlowContext().endLine();
-		}
-		if (!isInlineBlock()) {
-			LineBox line = getFlowContext().getCurrentLine();
-			line.setHorizonalData(getCSSStyle().getStyleProperty(
-					ICSSPropertyID.ATTR_HORIZONTAL_ALIGN));
-			line.setHtmlInitData(getCSSStyle().getHTMLelementInitValue(
-					ICSSPropertyID.ATTR_HORIZONTAL_ALIGN));
-			line.add(_blockBox);
-			// getFlowContext().addToCurrentLine(_blockBox);
-		} else {
-			getFlowContext().addToCurrentLine(_blockBox);
-		}
-		getFlowContext().getCurrentLine().getMarginInsets().bottom = getCSSStyle()
-				.getMarginInsets().bottom;
-
-		if (!isInlineBlock()) {
-			getFlowContext().endLine();
-		}
-	}
-
-	/**
-	 * @param line
-	 */
-	protected void layoutLine(LineBox line) {
-		// currentLine.x = 0; //XXX: comment out, don't understand why set to 0,
-		// because it has already
-		// been set when setupLine(). And if do need, should
-		// set to getBorderPaddingInsets().left
-		// if (!isInlineBlock() && shouldExpand())
-		// {
-		// FIXME: currently we are using getRecommendedContentWidth,
-		// what happen if after adding the new line, the new width is bigger
-		// than
-		// recommendedContentWidth? should we use getWidth() instead of
-		// recommendedcontentWidth?
-		Object textalign = line.getHorizonalData();
-		if (textalign == null
-				|| ICSSPropertyMeta.NOT_SPECIFIED.equals(textalign)) {
-			textalign = (getCSSStyle()
-					.getStyleProperty(ICSSPropertyID.ATTR_TEXTALIGN));
-		}
-		if (textalign == null
-				|| ICSSPropertyMeta.NOT_SPECIFIED.equals(textalign)) {
-			textalign = line.getHtmlInitData();
-		}
-		if (ICSSPropertyID.VAL_RIGHT.equals(textalign)) {
-			line._x = _blockBox.getContentWidth() - line.getWidth();
-		} else if (ICSSPropertyID.VAL_CENTER.equals(textalign)) {
-			line._x = (_blockBox.getContentWidth() - line.getWidth()) / 2;
-		}
-
-		if (line._x < 0) {
-			line._x = 0;
-		}
-		line.commit();
-	}
-
-	/**
-	 * Adjust all fragments in the current line to have the same baseline. Do
-	 * any additional adjustments, such as horizontal alignment.
-	 */
-	protected void addCurrentLine() {
-		// The follow code is commented out, and moved into layoutLine(line)
-		// called by endBlock().
-		// since only when endBlock is called we really know how big is this
-		// block box, and then can
-		// do horizontal alignment.
-		// // currentLine.x = 0; //XXX: comment out, don't understand why set to
-		// 0, because it has already
-		// // been set when setupLine(). And if do need, should
-		// // set to getBorderPaddingInsets().left
-		// if (!isInlineBlock() && shouldExpand())
-		// {
-		// // FIXME: currently we are using getRecommendedContentWidth,
-		// // what happen if after adding the new line, the new width is bigger
-		// than
-		// // recommendedContentWidth? should we use getWidth() instead of
-		// // recommendedcontentWidth?
-		//
-		// Object textalign =
-		// (getCSSStyle().getStyleProperty(ICSSPropertyID.ATTR_TEXTALIGN));
-		// if (textalign == ICSSPropertyID.VAL_RIGHT)
-		// {
-		// _currentLine._x = _blockBox.getContentWidth() +
-		// _blockBox.getBorderPaddingInsets().left - _currentLine.getWidth();
-		// }
-		// else if (textalign == ICSSPropertyID.VAL_CENTER)
-		// {
-		//
-		// _currentLine._x = _blockBox.getBorderPaddingInsets().left +
-		// (_blockBox.getContentWidth() - _currentLine.getWidth()) / 2;
-		// }
-		// if (_currentLine._x < 0)
-		// _currentLine._x = 0;
-		// }
-		//
-		// // FIXME: should check vertical alignment here?
-		// _currentLine.commit();
-
-		// layoutLine(_currentLine);
-		_blockBox.add(_currentLine);
-	}
-
-	/**
-	 * @see FlowContainerLayout#flush()
-	 */
-	protected void flush() {
-		if (_currentLine != null && _currentLine.isOccupied()) {
-			addCurrentLine();
-		}
-		endBlock();
-	}
-
-	/**
-	 * @see FlowContainerLayout#cleanup()
-	 */
-	protected void cleanup() {
-		_currentLine = _previousLine = null;
-		_fontMetrices = null;
-	}
-
-	// ----------------------------------------------------------------------------------
-
-	/**
-	 * Override to setup the line's x, remaining, and available width.
-	 * 
-	 * @param line
-	 *            the LineBox to set up
-	 * @param topMargin 
-	 */
-	protected void setupLine(LineBox line, int topMargin) {
-		line.clear();
-
-		// the caller of getCurrentLine() may add leftMargin and leftPadding and
-		// leftBorder to line.x
-		line._x = 0;
-
-		// FIXME: here should check the floating boxes, and minus the width of
-		// them from
-		// current line.
-		line.setRecommendedWidth(_blockBox.getRecommendedContentWidth());
-		if (_previousLine == null) {
-			line._y = 0;
-			if (topMargin != Integer.MIN_VALUE) {
-				line._y += topMargin;
-			}
-		} else {
-			if (topMargin == Integer.MIN_VALUE) {
-				line._y = _previousLine._y + _previousLine.getHeight()
-						+ getLinePadding() + _previousLine.getMarginInsets().bottom; // XXX:
-				// should
-				// add
-				// previous
-				// margin
-				// bottom?
-			} else {
-				line._y = _previousLine._y
-						+ _previousLine.getHeight()
-						+ Math.max(topMargin,
-								_previousLine.getMarginInsets().bottom);
-			}
-		}
-		setFontinfoForLine(line);
-		// line.validate();
-	}
-
-	private void setFontinfoForLine(LineBox line) {
-
-		ICSSStyle style = getCSSStyle();
-		if (style != null) {
-			if (_fontMetrices == null) {
-				// as getSwtFont is resource consuming, so we cache the
-				// _fontMetrics.
-				_fontMetrices = FigureUtilities.getFontMetrics(style
-						.getCSSFont().getSwtFont());
-			}
-			line.setFontMetrics(_fontMetrices);
-		}
-	}
-
-	/**
-	 * @see FlowContainerLayout#createNewLine()
-	 */
-	protected void createNewLine() {
-		_currentLine = new LineBox();
-		setupLine(_currentLine, Integer.MIN_VALUE);
-	}
-
-	protected void createNewLine(int topmargin) {
-		_currentLine = new LineBox();
-		setupLine(_currentLine, topmargin);
-	}
-
-	/**
-	 * @see FlowContext#endLine()
-	 */
-	public void endLine() {
-		// this is called from child layouts.
-		// If there is no current line, state is equivalent to new line
-		if (_currentLine == null) {
-			return;
-		}
-		if (_currentLine.isOccupied()) {
-			addCurrentLine(); // finalize the current line layout
-		} else {
-			_currentLine = null;
-			return;
-		}
-
-		LineBox box = _currentLine;
-		// _currentLine = _previousLine; //XXX: ???? why (yang)
-		_previousLine = box;
-
-		_currentLine = null;
-		// setupLine(getCurrentLine());
-	}
-
-	/**
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowContext#getCurrentY()
-	 */
-	public int getCurrentY() {
-		return getCurrentLine()._y; // FIXME: margin of previous block?
-	}
-
-	int getLinePadding() {
-		return 0;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.CSSLayout#useLocalCoordinates()
-	 */
-	public boolean useLocalCoordinates() {
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowFigureLayout#dispose()
-	 */
-	public void dispose() {
-		// 
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.ICSSLayout#getFragmentsForRead()
-	 */
-	public List getFragmentsForRead() {
-		List r = new ArrayList(1);
-		r.add(_blockBox);
-		return r;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.ICSSLayout#postValidate()
-	 */
-	public void postValidate() {
-
-		Rectangle r = new Rectangle(_blockBox._x, _blockBox._y, _blockBox
-				.getWidth(), _blockBox.getHeight());
-		getCSSFigure().setBounds(r);
-		List list = getCSSFigure().getChildren();
-		for (int i = 0; i < list.size(); i++) {
-			((FlowFigure) list.get(i)).postValidate();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowContext#getContainerWidth()
-	 */
-	public int getContainerWidth() {
-		int width = Math.max(0, Math.max(_blockBox.getWidth(), _blockBox
-				.getRecommendedWidth()));
-		return width;
-	}
-
-	/**
-	 * when the "overflow" is "scroll", we need to paint the scrollbar
-	 */
-	public void paintFigurePostClientArea(Graphics g) {
-		ICSSStyle style = this.getCSSStyle();
-		if (style != null) {
-			Object overflow = style
-					.getStyleProperty(ICSSPropertyID.ATTR_OVERFLOW);
-			if (ICSSPropertyID.VAL_SCROLL.equals(overflow)
-					|| ICSSPropertyID.VAL_AUTO.equals(overflow)) {
-				if (this._needHScroll || this._needVScroll) {
-					// as this is using localCoordinate, so translate to
-					// relative to left/up corder of whole
-					// blockbox.
-					g.translate(-_blockBox.getBorderPaddingInsets().left,
-							-_blockBox.getBorderPaddingInsets().top);
-
-					Rectangle rect = new Rectangle(0, 0, _blockBox.getWidth(),
-							_blockBox.getHeight());
-					rect.crop(_blockBox.getBorderInsets());
-
-					if (this._needHScroll && this._needVScroll) {
-						BorderUtil.drawScrollBar(g, BorderUtil.SCROLL_WIDTH,
-								rect, BorderUtil.BOTH);
-					} else if (this._needHScroll) {
-						BorderUtil.drawScrollBar(g, BorderUtil.SCROLL_WIDTH,
-								rect, BorderUtil.HORIZONTAL_BAR);
-					} else if (this._needVScroll) {
-						BorderUtil.drawScrollBar(g, BorderUtil.SCROLL_WIDTH,
-								rect, BorderUtil.VERTICAL_BAR);
-					}
-				}
-			}
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CSSBrFlowLayout.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CSSBrFlowLayout.java
deleted file mode 100644
index c69430d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CSSBrFlowLayout.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-import java.util.List;
-
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * @author mengbo
- */
-public class CSSBrFlowLayout extends CSSInlineFlowLayout implements ICSSPainter {
-
-	private static final String LINE_BREAK_IMAGE_FILE = "LineBreak.gif"; //$NON-NLS-1$
-
-	/**
-	 * @param flow
-	 */
-	public CSSBrFlowLayout(CSSFigure flow) {
-		super(flow);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.CSSInlineFlowLayout#flush()
-	 */
-	protected void flush() {
-		FlowBox forcedBox = new FlowBox();
-		forcedBox.setWidth(16);
-		forcedBox.setHeight(getCSSStyle().getCSSFont().getXHeight());
-		addToCurrentLine(forcedBox);
-		endLine();
-
-		FlowBox flowbox = new FlowBox();
-		flowbox.setHeight(getCSSStyle().getCSSFont().getFontSize());
-		getCurrentLine().add(flowbox);
-
-		super.flush();
-	}
-
-	public void paintFigure(Graphics g) {
-		List fragments = getFragmentsForRead();
-		if (!fragments.isEmpty()) {
-			FlowBox box = (FlowBox) fragments.get(0);
-			g.drawImage(getSharedHTMLImage(), new Point(box._x, box._y));
-		}
-	}
-
-	private static Image getSharedHTMLImage() {
-		
-		return PDPlugin.getDefault().getImage(LINE_BREAK_IMAGE_FILE);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CSSFigure.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CSSFigure.java
deleted file mode 100644
index 580b347..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CSSFigure.java
+++ /dev/null
@@ -1,534 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-import java.util.List;
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.LayoutManager;
-import org.eclipse.draw2d.geometry.Insets;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.border.CSSBorder;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.css2.property.VisibilityMeta;
-import org.eclipse.jst.pagedesigner.css2.style.DefaultStyle;
-import org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo;
-import org.eclipse.jst.pagedesigner.css2.widget.BorderUtil;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.RGB;
-
-/**
- * Normally a CSSFigure is a container. It's layout will be driven by different
- * display type information from the style.
- * 
- * Each CSSFigure will be driven by ICSSStyle, the display type of the ICSSStyle
- * will decide the layout to be used for the figure.
- * 
- * @author mengbo
- */
-public class CSSFigure extends FlowFigure implements ICSSFigure {
-	private static Logger _log = PDPlugin.getLogger(CSSFigure.class);
-
-	private static final Rectangle PRIVATE_RECT = new Rectangle();
-
-	private ICSSStyle _style;
-
-	// if this field is set, then regetLayout() will still return this layout,
-	// without going through the CSS resolution
-	private CSSLayout _fixedLayout;
-
-	/**
-	 * Default constructor 
-	 * Equivalent to CSSFigure(DefaultStyle.getInstance())
-	 */
-	public CSSFigure() {
-		this(DefaultStyle.getInstance());
-	}
-
-	/**
-	 * @param style
-	 */
-	public CSSFigure(ICSSStyle style) {
-		_style = style;
-		invalidateCSS();
-	}
-
-	public ICSSStyle getCSSStyle() {
-		return _style;
-	}
-
-	/**
-	 * @param style
-	 */
-	public void setCSSStyle(ICSSStyle style) {
-		_style = style;
-		invalidateCSS();
-	}
-
-	public void revalidate() {
-		CSSLayout layout = (CSSLayout) getLayoutManager();
-		layout.figureRevalidate();
-		super.revalidate();
-	}
-
-	/**
-	 * this method is called when the css source noticed style change. So tell
-	 * the figure should invalidate its cached data.
-	 */
-	public void invalidateCSS() {
-		// maybe we changed from inline to block or block to inline
-		// XXX: or even to table?
-		CSSLayout layout = regetLayout(getLayoutManager());
-		this.setLayoutManager(layout);
-	}
-
-	/**
-	 * @param layout
-	 */
-	public void setFixedLayoutManager(CSSLayout layout) {
-		this._fixedLayout = layout;
-		this.setLayoutManager(regetLayout(getLayoutManager()));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.Figure#setLayoutManager(org.eclipse.draw2d.LayoutManager)
-	 */
-	public void setLayoutManager(LayoutManager manager) {
-		LayoutManager old = getLayoutManager();
-		if (old != manager) {
-			FlowContext context = null;
-			if (old instanceof FlowFigureLayout) {
-				context = ((FlowFigureLayout) old).getOriginalFlowContext();
-			}
-			if (manager instanceof FlowFigureLayout) {
-				((FlowFigureLayout) manager).setOriginalFlowContext(context);
-			}
-
-			if (manager instanceof FlowContext) {
-				List list = getChildren();
-				for (int i = 0, size = list.size(); i < size; i++) {
-					try {
-						((FlowFigure) list.get(i))
-								.setOriginalFlowContext((FlowContext) manager);
-					} catch (ClassCastException classcastexception) {
-						// Error in flowContext setting.
-						_log.error("Error.CSSFigure.0", classcastexception); //$NON-NLS-1$
-					}
-				}
-			}
-		}
-		super.setLayoutManager(manager);
-	}
-
-	/**
-	 * @param old
-	 * @return the layout
-	 */
-	protected CSSLayout regetLayout(LayoutManager old) {
-		if (_fixedLayout != null) {
-			return _fixedLayout;
-		}
-		CSSLayout layout = DisplayToLayout.displayToLayout(this, getCSSStyle()
-				.getDisplay(), old);
-		if (layout != null) {
-			return layout;
-		}
-        return new CSSInlineFlowLayout(this);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.Figure#containsPoint(int, int)
-	 */
-	public boolean containsPoint(int x, int y) {
-		// check whether any float figure contains it.
-		// FIXME: need check floating figure here!!!
-		if (!super.containsPoint(x, y)) {
-			return false;
-		}
-		List frags = getFragmentsForRead();
-		// Here we should not get void pointer.
-		if (frags != null) {
-			for (int i = 0; i < frags.size(); i++) {
-				FlowBox box = (FlowBox) frags.get(i);
-				if (box != null && box.containsPoint(x, y)) {
-					return true;
-				}
-			}
-		}
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.ICSSFigure#getFragmentsForRead()
-	 */
-	public List getFragmentsForRead() {
-		CSSLayout layout = (CSSLayout) getLayoutManager();
-		return layout.getFragmentsForRead();
-	}
-
-	/**
-	 * this method is a shortcut to getFragmentsForRead
-	 * 
-	 * @return fragment bounds
-	 */
-	public Rectangle[] getFragmentsBounds() {
-		List list = getFragmentsForRead();
-		if (list == null || list.size() == 0) {
-			// should not happen. but still handle it.
-			return new Rectangle[] { getBounds() };
-		}
-        Rectangle[] ret = new Rectangle[list.size()];
-        for (int i = 0, size = list.size(); i < size; i++) {
-        	FlowBox box = (FlowBox) list.get(i);
-        	ret[i] = new Rectangle(box._x, box._y, box.getWidth(), box
-        			.getHeight());
-        }
-        return ret;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.IFigure#setBounds(org.eclipse.draw2d.geometry.Rectangle)
-	 */
-	public void setBounds(Rectangle r) {
-		if (getBounds().equals(r)) {
-			return;
-		}
-		boolean invalidate = getBounds().width != r.width
-				|| getBounds().height != r.height;
-		super.setBounds(r);
-
-		CSSLayout layout = (CSSLayout) this.getLayoutManager();
-		layout.setBoundsCalled(r, invalidate);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowFigure#postValidate()
-	 */
-	public void postValidate() {
-		CSSLayout layout = (CSSLayout) getLayoutManager();
-		layout.postValidateForAbsolute();
-		layout.postValidate();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.IFigure#validate()
-	 */
-	public void validate() {
-		super.validate();
-		// should not call this.postValidate() here. PostValidate() should
-		// only be started from the FlowPage. Otherwise it will be called
-		// multiple times on a figure.
-		// this.postValidate();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.Figure#useLocalCoordinates()
-	 */
-	protected boolean useLocalCoordinates() {
-		CSSLayout layout = (CSSLayout) getLayoutManager();
-		if (layout == null) {
-			return false;
-		}
-        return layout.useLocalCoordinates();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.IFigure#paint(org.eclipse.draw2d.Graphics)
-	 */
-	public void paint(Graphics graphics) {
-		ICSSStyle style = getCSSStyle();
-		if (style != null) {
-			Object visibility = style
-					.getStyleProperty(ICSSPropertyID.ATTR_VISIBILITY);
-			// handle visibility: hidden here.
-			// TODO: "collapse" is not supported yet!
-			if (VisibilityMeta.HIDDEN.equals(visibility)) {
-				return;
-			}
-		}
-
-		CSSLayout layout = (CSSLayout) this.getLayoutManager();
-		graphics.pushState();
-		try {
-			paintFigure(graphics);
-			graphics.restoreState();
-			paintClientArea(graphics);
-			if (layout instanceof ICSSPainter2) {
-				if (useLocalCoordinates()) {
-					graphics.translate(getBounds().x + getInsets().left,
-							getBounds().y + getInsets().top);
-					((ICSSPainter2) layout).paintFigurePostClientArea(graphics);
-					graphics.restoreState();
-				} else {
-					((ICSSPainter2) layout).paintFigurePostClientArea(graphics);
-				}
-			}
-			paintBorder(graphics);
-		} finally {
-			graphics.popState();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowFigure#paintFigure(org.eclipse.draw2d.Graphics)
-	 */
-	protected void paintFigure(Graphics g) {
-		Color rgbColor = null;
-		boolean fillArea = false;
-		Object bg = getCSSStyle().getBackgroundColor();
-		if (bg instanceof RGB) {
-			rgbColor = new Color(null, (RGB) bg);
-			g.setBackgroundColor(rgbColor);
-			fillArea = true;
-		} else if (bg instanceof Color) {
-			g.setBackgroundColor((Color) bg);
-			fillArea = true;
-		}
-		if (fillArea) {
-			List fragments = getFragmentsForRead();
-
-			for (int i = 0, n = fragments.size(); i < n; i++) {
-				Object obj = fragments.get(i);
-				if (obj instanceof FlowBox) {
-					FlowBox box = (FlowBox) obj;
-					g.fillRectangle(box._x, box._y, box.getWidth(), box
-							.getHeight());
-				}
-			}
-		}
-		if (rgbColor != null) {
-			rgbColor.dispose();
-		}
-		g.restoreState();
-
-		//handle background-image
-		Object bgImage = getCSSStyle().getStyleProperty(ICSSPropertyID.ATTR_BACKGROUND_IMAGE);
-		if (bgImage instanceof Image) {
-			g.setClip(bounds);
-			g.drawImage((Image)bgImage, bounds.x, bounds.y);
-			g.restoreState();
-		}
-
-		LayoutManager layout = getLayoutManager();
-		if (layout instanceof ICSSPainter) {
-			if (useLocalCoordinates()) {
-				g.translate(getBounds().x + getInsets().left, getBounds().y
-						+ getInsets().top);
-				((ICSSPainter) layout).paintFigure(g);
-				g.restoreState();
-			} else {
-				((ICSSPainter) layout).paintFigure(g);
-			}
-		}
-
-		// paint selected mode here.
-		paintSelection(g);
-
-		if (Debug.DEBUG_BOX) {
-			// draw two levels of boxes. Since normally each figure will only
-			// have two levels of boxes.
-			List fragments = this.getFragmentsForRead();
-			for (int i = 0, size = fragments.size(); i < size; i++) {
-				FlowBox box = (FlowBox) fragments.get(i);
-				BoxUtil.drawBox(g, box);
-				if (box instanceof BlockBox) {
-					BlockBox compositeBox = (BlockBox) box;
-					List list = compositeBox.getFragments();
-					for (int j = 0; j < list.size(); j++) {
-						g.translate(this.getInsets().left,
-								this.getInsets().right);
-						BoxUtil.drawBox(g, (FlowBox) list.get(j));
-						g.restoreState();
-					}
-				}
-			}
-		}
-		if (Debug.DEBUG_BASELINE) {
-			List fragments = this.getFragmentsForRead();
-			for (int i = 0, size = fragments.size(); i < size; i++) {
-				Object obj = fragments.get(i);
-				if (obj instanceof LineBox) {
-					LineBox linebox = (LineBox) obj;
-					g.setForegroundColor(ColorConstants.red);
-					g.drawLine(linebox._x, linebox._y + linebox.getAscent(),
-							linebox._x + linebox.getWidth(), linebox._y
-									+ linebox.getAscent());
-				}
-			}
-		}
-
-		if (Debug.DEBUG_BORDERPADDING) {
-			if (this.getLayoutManager() instanceof CSSBlockFlowLayout) {
-				g.setLineWidth(1);
-				Rectangle rect = getBounds().getCopy().crop(getInsets());
-				g.setForegroundColor(ColorConstants.green);
-				g.drawRectangle(rect);
-				g.setForegroundColor(ColorConstants.red);
-				g.drawRectangle(getBounds());
-			}
-		}
-
-		if (Debug.DEBUG_BOX) {
-			CSSLayout csslayout = (CSSLayout) this.getLayoutManager();
-			if (csslayout.getAbsoluteContext() != null) {
-				BlockBox blockbox = csslayout.getAbsoluteContext()._blockBox;
-				g.setLineWidth(1);
-				g.setForegroundColor(ColorConstants.green);
-				g.drawRectangle(blockbox._x, blockbox._y, blockbox.getWidth(),
-						blockbox.getHeight());
-			}
-		}
-	}
-
-	/**
-	 * Paints this Figure's client area. The client area is typically defined as
-	 * the anything inside the Figure's {@link org.eclipse.draw2d.Border} or {@link org.eclipse.draw2d.geometry.Insets}, and
-	 * by default includes the children of this Figure. On return, this method
-	 * must leave the given Graphics in its initial state.
-	 * 
-	 * @param graphics
-	 *            The Graphics used to paint
-	 * @since 2.0
-	 */
-	protected void paintClientArea(Graphics graphics) {
-		if (this.getChildren().isEmpty()) {
-			return;
-		}
-
-		Object overflow = ICSSPropertyID.VAL_VISIBLE;
-		ICSSStyle style = this.getCSSStyle();
-		if (style != null) {
-			overflow = style.getStyleProperty(ICSSPropertyID.ATTR_OVERFLOW);
-		}
-
-		boolean optimizeClip = ICSSPropertyID.VAL_VISIBLE.equals(overflow);
-
-		if (useLocalCoordinates()) {
-			graphics.translate(getBounds().x + getInsets().left, getBounds().y
-					+ getInsets().top);
-			if (!optimizeClip) {
-				graphics.clipRect(getClientArea(PRIVATE_RECT));
-			}
-			graphics.pushState();
-			paintChildren(graphics);
-			graphics.popState();
-			graphics.restoreState();
-		} else {
-			if (optimizeClip) {
-				paintChildren(graphics);
-			} else {
-				graphics.clipRect(getClientArea(PRIVATE_RECT));
-				graphics.pushState();
-				paintChildren(graphics);
-				graphics.popState();
-				graphics.restoreState();
-			}
-		}
-	}
-
-	/**
-	 * @param g
-	 */
-	protected void paintSelection(Graphics g) {
-		ICSSStyle style = this.getCSSStyle();
-		if (style != null) {
-			if (style.isInSelection()) {
-				ITagEditInfo editInfo = (ITagEditInfo) style
-						.getAdapter(ITagEditInfo.class);
-				if (editInfo != null && editInfo.isWidget()) {
-					BorderUtil.maskFigure(this, g);
-				}
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.Figure#paintBorder(org.eclipse.draw2d.Graphics)
-	 */
-	protected void paintBorder(Graphics graphics) {
-		CSSLayout layout = (CSSLayout) getLayoutManager();
-		if (layout != null && !layout.handlingBorderForBlock()) {
-			return;
-		}
-
-		ICSSStyle style = this.getCSSStyle();
-		if (style != null) {
-			CSSBorder border1 = new CSSBorder(this.getCSSStyle());
-			border1.paint(this, graphics, NO_INSETS);
-
-			// draw a border for those special elements like <h:form>, etc.
-			ITagEditInfo editInfo = (ITagEditInfo) style
-					.getAdapter(ITagEditInfo.class);
-			if (editInfo != null && editInfo.needBorderDecorator()) {
-				BorderUtil.drawBorderDecorator(this, graphics);
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.IFigure#getInsets()
-	 */
-	public Insets getInsets() {
-		CSSLayout layout = (CSSLayout) getLayoutManager();
-		if (layout != null && !layout.handlingBorderForBlock()) {
-			return new Insets();
-		}
-		ICSSStyle style = this.getCSSStyle();
-		if (style != null) {
-			return style.getBorderInsets().getAdded(style.getPaddingInsets());
-		}
-		return new Insets();
-	}
-
-	/**
-	 * FIXME: need trace the implementation of Figure.invalidate() We want to
-	 * just mark this figure as invalid, but don't want to the layout get
-	 * invalidated.
-	 * 
-	 */
-	public void invalidate2() {
-		if (!isValid())
-			return;
-		// if (getLayoutManager() != null)
-		// getLayoutManager().invalidate();
-		setValid(false);
-
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CSSInlineFlowLayout.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CSSInlineFlowLayout.java
deleted file mode 100644
index 39ddf89..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CSSInlineFlowLayout.java
+++ /dev/null
@@ -1,320 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.draw2d.FigureUtilities;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo;
-
-/**
- * The layout manager for {@link CSSFigure}figures. This class is based on
- * InlineFlowLayout of draw2d.
- * 
- * @author mengbo
- */
-public class CSSInlineFlowLayout extends CSSLayout {
-	List _fragments = new ArrayList();
-
-	/**
-	 * Creates a new InlineFlowLayout with the given FlowFigure.
-	 * 
-	 * @param flow
-	 *            The FlowFigure
-	 */
-	public CSSInlineFlowLayout(CSSFigure flow) {
-		super(flow);
-	}
-
-	/**
-	 * Clears out all fragments prior to the call to layoutChildren().
-	 */
-	public void preLayout() {
-		super.preLayout();
-		_fragments.clear();
-		// force creating of the first line. avoid empty element don't have
-		// fragments.
-		// createFirstLine();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowContainerLayout#layoutChildren()
-	 */
-	protected void layoutChildren() {
-		// For designer, to make it to have some size. otherwise can't
-		// be found on screen.
-		// List children = getCSSFigure().getChildren();
-		// if (children.size() == 0)
-		// {
-		// FlowBox box = new FlowBox();
-		// box._height = getCSSStyle().getCSSFont().getFontSize();
-		// box._width = 2;
-		// addToCurrentLine(box);
-		//
-		// }
-		super.layoutChildren();
-	}
-
-	/**
-	 * Adds the given FlowBox to the current line of this InlineFlowLayout.
-	 * 
-	 * @param block
-	 *            the FlowBox to add to the current line
-	 */
-	public void addToCurrentLine(FlowBox block) {
-		getCurrentLine().add(block);
-		// XXX: ???: will currentLine be added multiple times to fragments?
-		// (yang)
-		// _fragments.add(_currentLine);
-	}
-
-	private void createFirstLine() {
-		_currentLine = new LineBox();
-		setupLine(_currentLine, true);
-		_fragments.add(_currentLine);
-	}
-
-	/**
-	 * @see FlowContainerLayout#createNewLine()
-	 */
-	protected void createNewLine() {
-		_currentLine = new LineBox();
-		setupLine(_currentLine, false);
-		_fragments.add(_currentLine);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowContainerLayout#createNewLine(int)
-	 */
-	protected void createNewLine(int topMargin) {
-		// inline flow don't support vertical margin.
-		createNewLine();
-	}
-
-	/**
-	 * @see FlowContainerLayout#cleanup()
-	 */
-	protected void cleanup() {
-		_currentLine = null;
-	}
-
-	/**
-	 * @see FlowContainerLayout#flush()
-	 */
-	protected void flush() {
-		if (_fragments.isEmpty()) {
-			createFirstLine();
-		} else if (_fragments.size() == 1) {
-
-			ICSSStyle style = getCSSStyle();
-			int minWidth = 0, minHeight = 0;
-			// try to see whether there is any designer specified min size
-			ITagEditInfo info = (ITagEditInfo) style
-					.getAdapter(ITagEditInfo.class);
-			if (info != null) {
-				minWidth = info.getMinWidth();
-				minHeight = info.getMinHeight();
-			}
-			FlowBox box = (FlowBox) _fragments.get(0);
-			if (minWidth > box._width) {
-				box._width = minWidth;
-			}
-			if (minHeight > box._height) {
-				box._height = minHeight;
-			}
-		}
-
-		if (_currentLine != null /* && _currentLine.isOccupied() */) {
-			_currentLine.getMarginInsets().right = getCSSStyle().getMarginInsets().right;
-			getFlowContext().addToCurrentLine(_currentLine);
-		}
-
-	}
-
-	/**
-	 * @see FlowContext#endLine()
-	 */
-	public void endLine() {
-		if (_currentLine == null) {
-			getFlowContext().endLine();
-			return;
-		}
-		// If nothing was ever placed in the line, ignore it. and if the line is
-		// the first line, just remove it.
-		if (_currentLine.isOccupied()) {
-			getFlowContext().addToCurrentLine(_currentLine);
-		} else if (_fragments.size() == 1) {
-			_fragments.remove(0);
-		}
-		getFlowContext().endLine();
-		_currentLine = null;
-	}
-
-	/**
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowContext#getCurrentY()
-	 */
-	public int getCurrentY() {
-		return getCurrentLine()._y;
-	}
-
-	/**
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowContainerLayout#isCurrentLineOccupied()
-	 */
-	public boolean isCurrentLineOccupied() {
-		if (_currentLine == null) {
-			return getFlowContext().isCurrentLineOccupied();
-		} else if (_currentLine.getFragments().isEmpty()) {
-			return getFlowContext().isCurrentLineOccupied();
-		} else {
-			return true;
-		}
-	}
-
-	/**
-	 * Initializes the given LineBox. Called by createNewLine().
-	 * 
-	 * @param line
-	 *            The LineBox to initialize.
-	 * @param firstline 
-	 */
-	protected void setupLine(LineBox line, boolean firstline) {
-		LineBox parent = getFlowContext().getCurrentLine();
-		line._x = 0;
-		line._y = getFlowContext().getCurrentY();
-
-		line.setRecommendedWidth(parent.getAvailableWidth());
-
-		setLineVerticalAlign(line);
-		setFontinfoForLine(line);
-
-		if (firstline && getCSSStyle() != null) {
-			ICSSStyle style = getCSSStyle();
-			int minWidth = 0, minHeight = 0;
-			// try to see whether there is any designer specified min size
-			ITagEditInfo info = (ITagEditInfo) style
-					.getAdapter(ITagEditInfo.class);
-			if (info != null) {
-				minWidth = info.getMinWidth();
-				minHeight = info.getMinHeight();
-			}
-
-			// // CSS also has the min-width/min-height property. We should also
-			// get that,
-			// // and using the max of the "min-width" css property and the
-			// designer specified min size.
-			// int height =
-			// getLengthValue(style,ICSSPropertyID.ATTR_MIN_HEIGHT);
-			// if(height > minHeight)
-			// {
-			// minHeight = height;
-			// }
-			// int width = getLengthValue(style,ICSSPropertyID.ATTR_MIN_WIDTH);
-			// if(width > minWidth)
-			// {
-			// minWidth = width;
-			// }
-			if (minWidth > 0) {
-				line.setWidth(minWidth);
-			}
-			int fontHeight = this.getCSSStyle().getCSSFont().getXHeight();
-			if (minHeight > 0 && minHeight > fontHeight) {
-				line.setHeight(minHeight);
-			} else {
-				line.setHeight(fontHeight);
-			}
-		}
-	}
-
-	private void setLineVerticalAlign(LineBox box) {
-		ICSSStyle style = getCSSStyle();
-		if (style != null) {
-			box.setVerticalAlignData(style
-					.getStyleProperty(ICSSPropertyID.ATTR_VERTICAL_ALIGN));
-		}
-	}
-
-	private void setFontinfoForLine(LineBox line) {
-
-		ICSSStyle style = getCSSStyle();
-		if (style != null) {
-			line.setFontMetrics(FigureUtilities.getFontMetrics(style
-					.getCSSFont().getSwtFont()));
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowFigureLayout#dispose()
-	 */
-	public void dispose() {
-		// 
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.ICSSLayout#getFragmentsForRead()
-	 */
-	public List getFragmentsForRead() {
-		return _fragments;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.ICSSLayout#postValidate()
-	 */
-	public void postValidate() {
-		List list = _fragments;
-
-		FlowBox box;
-		int left = Integer.MAX_VALUE, top = left;
-		int right = Integer.MIN_VALUE, bottom = right;
-		for (int i = 0; i < list.size(); i++) {
-			box = (FlowBox) list.get(i);
-			// if (box instanceof LineBox && !((LineBox) box).isOccupied())
-			// {
-			// continue; // skip unoccupied line
-			// }
-			left = Math.min(left, box._x);
-			right = Math.max(right, box._x + box._width);
-			top = Math.min(top, box._y);
-			bottom = Math.max(bottom, box._y + box._height);
-		}
-		getCSSFigure().setBounds(
-				new Rectangle(left, top, right - left, bottom - top));
-		list = getCSSFigure().getChildren();
-		for (int i = 0; i < list.size(); i++) {
-			((FlowFigure) list.get(i)).postValidate();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowContext#getContainerWidth()
-	 */
-	public int getContainerWidth() {
-		// FIXME: don't really understand what means for inline
-		return this.getFlowContext().getContainerWidth();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CSSLayout.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CSSLayout.java
deleted file mode 100644
index d47bdbb..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CSSLayout.java
+++ /dev/null
@@ -1,480 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-import java.util.List;
-
-import org.eclipse.draw2d.Figure;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.css2.property.PositionMeta;
-import org.eclipse.jst.pagedesigner.css2.property.VerticalAlignMeta;
-import org.eclipse.jst.pagedesigner.css2.value.Length;
-import org.eclipse.jst.pagedesigner.ui.preferences.PDPreferences;
-
-/**
- * CSSLayout is the base layout manager for different CSS layouts, such as block
- * layout, inline layout (possible in the future table layout, etc)
- * 
- * @author mengbo
- */
-public abstract class CSSLayout extends FlowFigureLayout implements FlowContext {
-	private BlockFlowContext _absoluteContext;
-
-	// when doing absolute layout, and if top/left are both "auto", it will be
-	// relating to the normaly flow position. The following two fields try to
-	// catch normal flow layout position.
-	// int _xForAbsolute;
-	// int _yForAbsolute;
-	private FlowBox _boxForAbsolute;
-
-	/**
-	 * the current line
-	 */
-	protected LineBox _currentLine;
-
-	private boolean _calculatingMaxWidth = false;
-
-	/**
-	 * @param flowFigure 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowFigureLayout#FlowFigureLayout(FlowFigure)
-	 */
-	protected CSSLayout(CSSFigure flowFigure) {
-		super(flowFigure);
-	}
-
-	/**
-	 * a shortcut method to get the style associated with the figure.
-	 * 
-	 * @return the css style
-	 */
-	public ICSSStyle getCSSStyle() {
-		return getCSSFigure().getCSSStyle();
-	}
-
-	/**
-	 * @return the absolute context
-	 */
-	protected final BlockFlowContext getAbsoluteContext() {
-        return _absoluteContext;
-    }
-
-    /**
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowContext#addToCurrentLine(FlowBox)
-	 */
-	public void addToCurrentLine(FlowBox block) {
-		getCurrentLine().add(block);
-	}
-
-	/**
-	 * Used by getCurrentLine().
-	 */
-	protected abstract void createNewLine();
-
-	/**
-	 * Used by getCurrentLine(int topmargin)
-	 * 
-	 * @param topMargin
-	 */
-	protected void createNewLine(int topMargin) {
-		createNewLine();
-	}
-
-	/**
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowContext#getCurrentLine()
-	 */
-	public LineBox getCurrentLine() {
-		if (_currentLine == null) {
-			createNewLine();
-		}
-		return _currentLine;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowContext#getCurrentLine(int)
-	 */
-	public LineBox getCurrentLine(int topMargin) {
-		if (_currentLine == null) {
-			createNewLine(topMargin);
-		}
-		// if the current line only contains an empty string, reset the current
-		// line using the given margin.
-		else if (_currentLine.isEmptyStringLine()) {
-			List list = _currentLine.getFragments();
-			createNewLine(topMargin);
-			_currentLine._fragments.addAll(list);
-		}
-		return _currentLine;
-	}
-
-	/**
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowContext#isCurrentLineOccupied
-	 */
-	public boolean isCurrentLineOccupied() {
-		return _currentLine != null && _currentLine.isOccupied();
-	}
-
-	/**
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowFigureLayout#layout()
-	 */
-	protected void layout() {
-		preLayout();
-		layoutChildren();
-		flush();
-		cleanup();
-	}
-
-	/**
-	 * @return true if is absolute position
-	 */
-	protected final boolean isAbsolutePosition() {
-		ICSSStyle style = getCSSStyle();
-
-		// FIXME: Some layout don't support absolute, need check here
-		if (style != null) {
-			Object obj = style.getStyleProperty(ICSSPropertyID.ATTR_POSITION);
-			if (PositionMeta.ABSOLUTE.equals(obj)
-					|| PositionMeta.FIXED.equals(obj)) 
-			{
-			    PDPreferences prefs = new PDPreferences();
-			    return prefs.isCssAbsolutePositioningEnabled();
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * Child class could override this method.
-	 * 
-	 * @return true if supports absolute position  
-	 */
-	protected boolean supportAbsolutePosition() {
-		if (findContainingPositionedFigure() == null) {
-			return false;
-		}
-		return true;
-	}
-
-	/**
-	 * Perform a prelayout
-	 */
-	protected void preLayout() {
-		ICSSStyle style = this.getCSSStyle();
-		if (style != null) {
-			style.processCounters();
-		}
-
-		if (isAbsolutePosition()) {
-			FlowContext parentFigureContext = getParentFigureContext();
-			_absoluteContext = new BlockFlowContext(parentFigureContext, style);
-			_boxForAbsolute = new FlowBox();// size is 0. Just as a flag, so
-			// later we
-			// could figure out where will this figure be
-			// be put in case of not absolute
-			_boxForAbsolute.setVerticalAlignData(VerticalAlignMeta.TOP);
-			parentFigureContext.addToCurrentLine(_boxForAbsolute);
-		} else {
-			_absoluteContext = null;
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowFigureLayout#getFlowContext()
-	 */
-	public FlowContext getFlowContext() {
-		if (_absoluteContext != null) {
-			return _absoluteContext;
-		}
-        return getOriginalFlowContext();
-	}
-
-	/**
-	 * @return the flow context
-	 */
-	private FlowContext getParentFigureContext() {
-		return super.getFlowContext();
-	}
-
-	final void postValidateForAbsolute() {
-		if (_absoluteContext != null) {
-			ICSSStyle style = this.getCSSStyle();
-
-			_absoluteContext.endBlock();
-
-			int xOffset;
-			int yOffset;
-
-			ICSSFigure containingPositionedFigure = findContainingPositionedFigure();
-			IFigure parentFigure = this.getCSSFigure().getParent();
-
-			xOffset = calculatePositionRelativeToParent(style,
-					containingPositionedFigure, parentFigure, true);
-			yOffset = calculatePositionRelativeToParent(style,
-					containingPositionedFigure, parentFigure, false);
-			move(_absoluteContext._blockBox, xOffset, yOffset);
-		}
-	}
-
-	/**
-	 * @param style
-	 * @param containingPositionedFigure
-	 * @param parentFigure
-	 * @return
-	 */
-	private int calculatePositionRelativeToParent(ICSSStyle style,
-			ICSSFigure containingPositionedFigure, IFigure parentFigure,
-			boolean horizontal) {
-		int xOffset;
-		Object left = horizontal ? style
-				.getStyleProperty(ICSSPropertyID.ATTR_LEFT) : style
-				.getStyleProperty(ICSSPropertyID.ATTR_TOP);
-		Object right = horizontal ? style
-				.getStyleProperty(ICSSPropertyID.ATTR_RIGHT) : style
-				.getStyleProperty(ICSSPropertyID.ATTR_BOTTOM);
-
-		if (!(left instanceof Length) && !(right instanceof Length)) {
-			// _boxForAbsolute partipated the layout of the parent figure, and
-			// is already relative to parent.
-			return horizontal ? _boxForAbsolute._x : _boxForAbsolute._y;
-		}
-
-		// ok, user specified left or right. let's calculate the left
-		int leftValue;
-		if (left instanceof Length) {
-			Length leftLength = (Length) left;
-			leftValue = leftLength.getValue();
-			if (leftLength.isPercentage()) {
-				leftValue = (horizontal ? containingPositionedFigure
-						.getBounds().width : containingPositionedFigure
-						.getBounds().height)
-						* leftValue / 100;
-			}
-		} else {
-			Length rightLength = (Length) right;
-			int lengthValue = rightLength.getValue();
-			if (rightLength.isPercentage()) {
-				lengthValue = (horizontal ? containingPositionedFigure
-						.getBounds().width : containingPositionedFigure
-						.getBounds().height)
-						* lengthValue / 100;
-			}
-
-			if (horizontal) {
-				leftValue = containingPositionedFigure.getBounds().width
-						- _absoluteContext._blockBox.getWidth() - lengthValue;
-			} else {
-				leftValue = containingPositionedFigure.getBounds().height
-						- _absoluteContext._blockBox.getHeight() - lengthValue;
-			}
-
-		}
-
-		// xOffset is relative to the first box of the containing figure
-		List fragments = containingPositionedFigure
-				.getFragmentsForRead();
-		if (fragments.size() > 0) {
-			FlowBox box = (FlowBox) fragments.get(0);
-			// box._x is the x location relative to containingPositionedFigure's
-			// parent.
-			// so now xOffset is relative to containingPositionedFigure's
-			// parent.
-			xOffset = (horizontal ? box._x : box._y) + leftValue;
-		} else {
-			xOffset = leftValue; // should not happen.
-		}
-		Point p;
-		if (horizontal) {
-			p = new Point(xOffset, 0);
-		} else {
-			p = new Point(0, xOffset);
-		}
-		containingPositionedFigure.translateFromParent(p);
-		containingPositionedFigure.translateToAbsolute(p);
-		parentFigure.translateToRelative(p);
-		return horizontal ? p.x : p.y;
-	}
-
-	/**
-	 * @return
-	 */
-	private ICSSFigure findContainingPositionedFigure() {
-		IFigure figure = this.getCSSFigure().getParent();
-		while (figure instanceof ICSSFigure) {
-			return (ICSSFigure) figure;
-			// ICSSStyle style = ((ICSSFigure) figure).getCSSStyle();
-			// if (DisplayToLayout.isPositioned(style))
-			// {
-			// return (ICSSFigure) figure;
-			// }
-			// figure = figure.getParent();
-		}
-		return null;
-
-	}
-
-	/**
-	 * @param resultBox
-	 * @param x
-	 * @param y
-	 */
-	private void move(CompositeBox compBox, int x, int y) {
-		compBox._x += x;
-		compBox._y += y;
-		List list = compBox.getFragments();
-		for (int i = 0; i < list.size(); i++) {
-			FlowBox box = (FlowBox) list.get(i);
-
-			if (box instanceof CompositeBox && !(box instanceof BlockBox)) {
-				move((CompositeBox) box, x, y);
-			} else {
-				box._x += x;
-				box._y += y;
-			}
-		}
-	}
-
-	/**
-	 * Layout all children.
-	 */
-	protected void layoutChildren() {
-		List children = getFlowFigure().getChildren();
-		for (int i = 0; i < children.size(); i++) {
-			Figure f = (Figure) children.get(i);
-			f.invalidate();
-			f.validate();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowContext#getLastMarginRight()
-	 */
-	public int getLastMarginRight() {
-		if (_currentLine == null || !_currentLine.isOccupied()) {
-			return 0;
-		}
-		FlowBox box = (FlowBox) _currentLine.getFragments().get(
-				_currentLine.getFragments().size() - 1);
-		if (box != null) {
-			return box.getMarginInsets().right;
-		}
-        return 0;
-	}
-
-	/**
-	 * @param c
-	 */
-	public void setCalculatingMaxWidth(boolean c) {
-		_calculatingMaxWidth = c;
-	}
-
-	/**
-	 * @return the calculated maximum width
-	 */
-	public boolean getCalcuatingMaxWidth() {
-		return _calculatingMaxWidth;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowContext#isCalculatingMaxWidth()
-	 */
-	public boolean isCalculatingMaxWidth() {
-		if (_calculatingMaxWidth) {
-			return true;
-		} else if (this.getFlowContext() == null) {
-			return false;
-		} else {
-			return this.getFlowContext().isCalculatingMaxWidth();
-		}
-	}
-
-	/**
-	 * Called after {@link #layoutChildren()}when all children have been laid
-	 * out. This method exists to flush the last line.
-	 */
-	protected abstract void flush();
-
-	/**
-	 * Flush anything pending and free all temporary data used during layout.
-	 */
-	protected abstract void cleanup();
-
-	// ------------------------------------------------------------------------------------
-
-	/**
-	 * @return the css figure
-	 */
-	protected final CSSFigure getCSSFigure() {
-		return (CSSFigure) getFlowFigure();
-	}
-
-	/**
-	 * 
-	 * @return the fragments for read
-	 */
-	public abstract List getFragmentsForRead();
-
-	/**
-	 * postValidate the child figures of this CSSFigure. Normally layout fall
-	 * into the first category need implement this method.
-	 */
-	public abstract void postValidate();
-
-	/**
-	 * setBounds is called on the CSSFigure. Normally layout fall into the
-	 * second category need implement this method.
-	 * 
-	 * @param rect
-	 * @param invalidate
-	 */
-	public void setBoundsCalled(Rectangle rect, boolean invalidate) {
-        // TODO: dead?
-	}
-
-	/**
-	 * Child class can override this. Normally block figure will return true.
-	 * 
-	 * @return true if should use local coordinates
-	 */
-	protected boolean useLocalCoordinates() {
-		return false;
-	}
-
-	/**
-	 * If CSSLayout will call paint rountine to draw Border for its box, this
-	 * method will return true, else return false, for example,the input file
-	 * will return false.
-	 * 
-	 * @return true if handling border block
-	 */
-	protected boolean handlingBorderForBlock() {
-		return true;
-	}
-
-	/**
-	 * This method is called when the corresponding figure is revalidated.
-	 * 
-	 */
-	protected void figureRevalidate() {
-		// child class can override.
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CSSListItemLayout.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CSSListItemLayout.java
deleted file mode 100644
index 2e25cc0..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CSSListItemLayout.java
+++ /dev/null
@@ -1,185 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-import java.util.List;
-
-import org.eclipse.draw2d.FigureUtilities;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.list.CounterHelper;
-import org.eclipse.jst.pagedesigner.css2.list.ICounterValueGenerator;
-import org.eclipse.jst.pagedesigner.css2.marker.CounterUtil;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.css2.style.DefaultStyle;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.RGB;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * @author mengbo
- */
-public class CSSListItemLayout extends CSSBlockFlowLayout implements
-		ICSSPainter {
-	private static final String DEFAULT_LIST_COUNTER = "_anonymous"; //$NON-NLS-1$
-
-	private static final int CIRCLE_DIAMETER = 6;
-
-	private static final int DISC_DIAMETER = 5;
-
-	private static final int ROUNDRECT_ARC = 2;
-
-	private static final int TEXT_PADDING = 16;
-
-	private int _count;
-
-	/**
-	 * @param cssfigure
-	 */
-	public CSSListItemLayout(CSSFigure cssfigure) {
-		super(cssfigure);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.ICSSPainter#paintFigure(org.eclipse.draw2d.Graphics)
-	 */
-	public void paintFigure(Graphics g) {
-		ICSSStyle style = this.getCSSStyle();
-		if (style == null) {
-			style = DefaultStyle.getInstance();
-		}
-
-		Rectangle drawArea = null;
-		Font font = getCSSStyle().getCSSFont().getSwtFont();
-
-		// draw the marker box
-		Object styleType = style
-				.getStyleProperty(ICSSPropertyID.ATTR_LIST_STYLE_TYPE);
-
-		g.pushState();
-
-		Color newColor = null;
-		Object color = style.getColor();
-		if (color instanceof Color) {
-			g.setForegroundColor((Color) color);
-			g.setBackgroundColor((Color) color);
-		} else if (color instanceof RGB) {
-			newColor = new Color(Display.getCurrent(), (RGB) color);
-			g.setForegroundColor(newColor);
-			g.setBackgroundColor(newColor);
-		}
-
-		if (styleType instanceof String) {
-			int type = CounterHelper.toTypeInt((String) styleType);
-			switch (type) {
-			case CounterHelper.LIST_T_UPPER_ALPHA:
-			case CounterHelper.LIST_T_LOWER_ALPHA:
-			case CounterHelper.LIST_T_LOWER_ROMAN:
-			case CounterHelper.LIST_T_UPPER_ROMAN:
-			case CounterHelper.LIST_T_DECIMAL:
-				g.setFont(font);
-				String displayString = CounterUtil.convertCount(_count, type);
-				Point point = getDrawPointForText(displayString);
-				g.drawString(displayString, point);
-				break;
-			case CounterHelper.LIST_T_CIRCLE:
-				drawArea = getDrawAreaForGraph(CIRCLE_DIAMETER, CIRCLE_DIAMETER);
-				g.drawArc(drawArea, 0, 360);
-				break;
-			case CounterHelper.LIST_T_SQUARE:
-				drawArea = getDrawAreaForGraph(DISC_DIAMETER, DISC_DIAMETER);
-				g.fillRectangle(drawArea);
-			case CounterHelper.LIST_T_DECIMAL_LEADING_ZERO:
-			case CounterHelper.LIST_T_LOWER_GREEK:
-			case CounterHelper.LIST_T_ARMENIAN:
-			case CounterHelper.LIST_T_GEORGIAN:
-			case CounterHelper.LIST_T_IMAGE:
-			case CounterHelper.LIST_T_NONE:
-			default:
-				drawArea = getDrawAreaForGraph(DISC_DIAMETER, DISC_DIAMETER);
-				g.fillRoundRectangle(drawArea, ROUNDRECT_ARC, ROUNDRECT_ARC);
-				break;
-			}
-		}
-		g.popState();
-
-		if (newColor != null) {
-			newColor.dispose();
-		}
-	}
-
-	/**
-	 * @param g
-	 * @return
-	 */
-	private Rectangle getDrawAreaForGraph(int width, int height) {
-		Rectangle drawArea;
-
-		int x = 0;
-		int y = 0;
-
-		List list = _blockBox.getFragments();
-		Rectangle box = _blockBox.toRectangle().getCopy().expand(
-				_blockBox.getBorderPaddingInsets().getAdded(
-						_blockBox.getMarginInsets()));
-		if (list != null && !list.isEmpty()) {
-			LineBox line = (LineBox) list.get(0);
-			y = line.getBaseline() - CIRCLE_DIAMETER;
-			x = box.x;
-		} else {
-			x = box.x;
-			y = box.height / 2 - CIRCLE_DIAMETER;
-		}
-		drawArea = new Rectangle(x - CIRCLE_DIAMETER * 5 / 2, y, width, height);
-		return drawArea;
-	}
-
-	private Point getDrawPointForText(String displayString) {
-		Font font = getCSSStyle().getCSSFont().getSwtFont();
-
-		int x = 0;
-		int y = 0;
-
-		Rectangle box = _blockBox.toRectangle().getCopy().expand(
-				_blockBox.getBorderPaddingInsets().getAdded(
-						_blockBox.getMarginInsets()));
-
-		x = box.x - FigureUtilities.getTextWidth(displayString, font);
-		x = x
-				- (TEXT_PADDING - FigureUtilities.getFontMetrics(font)
-						.getDescent());
-
-		return new Point(x, y);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowContainerLayout#layoutChildren()
-	 */
-	protected void layoutChildren() {
-		ICounterValueGenerator counter = this.getCSSStyle().findCounter(
-				DEFAULT_LIST_COUNTER, true);
-		if (counter != null) {
-			_count = counter.getCurrentCount();
-		} else {
-			// should not happen.
-			_count = 1; // use 1 as the default value
-		}
-		super.layoutChildren();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CSSPageFlowLayout.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CSSPageFlowLayout.java
deleted file mode 100644
index 8662bc2..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CSSPageFlowLayout.java
+++ /dev/null
@@ -1,162 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-import java.util.List;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.Rectangle;
-
-/**
- * This layout if for those thigns that it's parent will decide its size. Such
- * as table cell.
- * 
- * @author mengbo
- * @version 1.5
- */
-public class CSSPageFlowLayout extends CSSBlockFlowLayout {
-	private Dimension _pageSize = new Dimension();
-
-	private int _recommendedWidth;
-
-	private int _pageSizeCacheKeys[] = new int[4];
-
-	private Dimension _pageSizeCacheValues[] = new Dimension[4];
-
-
-	/**
-	 * @param cssfigure
-	 */
-	public CSSPageFlowLayout(CSSFigure cssfigure) {
-		super(cssfigure);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowFigureLayout#invalidate()
-	 */
-	public void invalidate() {
-		super.invalidate();
-		_pageSizeCacheKeys = new int[4];
-		_pageSizeCacheValues = new Dimension[4];
-		_pageSize = new Dimension();
-		_recommendedWidth = 0;
-	}
-
-	protected void endBlock() {
-		layoutLines();
-	}
-
-	/**
-	 * TODO: This method is not being called.
-	 */
-	public void postValidate() {
-		Rectangle r = new Rectangle(_blockBox._x, _blockBox._y, _blockBox
-				.getWidth(), _blockBox.getHeight());
-		r = r.expand(getCSSFigure().getInsets());
-		_pageSize.width = r.width;
-		_pageSize.height = r.height;
-
-		List list = getCSSFigure().getChildren();
-		for (int i = 0; i < list.size(); i++) {
-			((FlowFigure) list.get(i)).postValidate();
-		}
-
-	}
-
-	/**
-	 * Setup blockBox to the initial bounds of the Page
-	 */
-	protected void setupBlock() {
-		// Remove all current Fragments
-		_blockBox.clear();
-
-		// Setup the one fragment for this Block with the correct X and
-		// available width
-		int recommendedWidth = getRecommendedWidth();
-		_blockBox.setRecommendedWidth(recommendedWidth);
-
-		if (recommendedWidth > 0 && recommendedWidth != Integer.MAX_VALUE) {
-			_blockBox.setWidth(recommendedWidth);
-		}
-
-		_blockBox._x = 0;
-	}
-
-	private int getRecommendedWidth() {
-		return _recommendedWidth;
-	}
-
-	private void setRecommendedWidth(int width) {
-		if (_recommendedWidth == width) {
-			return;
-		}
-		_recommendedWidth = width;
-		getCSSFigure().invalidate2();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.CSSLayout#setBoundsCalled(org.eclipse.jst.pagedesigner.css2.layout.CSSFigure,
-	 *      org.eclipse.draw2d.geometry.Rectangle, boolean)
-	 */
-	public void setBoundsCalled(Rectangle r, boolean invalidate) {
-		super.setBoundsCalled(r, invalidate);
-		CSSFigure figure = getCSSFigure();
-		int newWidth = r.width - figure.getInsets().getWidth();
-		if (invalidate || getRecommendedWidth() != newWidth) {
-			setRecommendedWidth(newWidth);
-			figure.getUpdateManager().addInvalidFigure(figure);
-		}
-	}
-
-	/**
-	 * @see org.eclipse.draw2d.Figure#getPreferredSize(int, int)
-	 */
-	public Dimension getPreferredSize(IFigure container, int width, int h) {
-		if (width >= 0) {
-			width = Math.max(0, width - container.getInsets().getWidth());
-		}
-
-		for (int i = 0; i < 4; i++) {
-			if (_pageSizeCacheKeys[i] == width
-					&& _pageSizeCacheValues[i] != null) {
-				return _pageSizeCacheValues[i];
-			}
-		}
-
-		_pageSizeCacheKeys[3] = _pageSizeCacheKeys[2];
-		_pageSizeCacheKeys[2] = _pageSizeCacheKeys[1];
-		_pageSizeCacheKeys[1] = _pageSizeCacheKeys[0];
-		_pageSizeCacheKeys[0] = width;
-
-		_pageSizeCacheValues[3] = _pageSizeCacheValues[2];
-		_pageSizeCacheValues[2] = _pageSizeCacheValues[1];
-		_pageSizeCacheValues[1] = _pageSizeCacheValues[0];
-
-		// Flowpage must temporarily layout to determine its preferred size
-		int oldWidth = getRecommendedWidth();
-		setRecommendedWidth(width);
-		container.validate();
-		_pageSizeCacheValues[0] = _pageSize.getExpanded(container.getInsets()
-				.getWidth(), container.getInsets().getHeight());
-
-		if (width != oldWidth) {
-			setRecommendedWidth(oldWidth);
-			container.getUpdateManager().addInvalidFigure(container);
-		}
-		return _pageSizeCacheValues[0];
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CSSTextFigure.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CSSTextFigure.java
deleted file mode 100644
index a78ba8f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CSSTextFigure.java
+++ /dev/null
@@ -1,313 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.css2.provider.ICSSTextProvider;
-import org.eclipse.jst.pagedesigner.css2.style.DefaultStyle;
-import org.eclipse.jst.pagedesigner.css2.style.StyleUtil;
-import org.eclipse.jst.pagedesigner.viewer.CaretPositionResolver;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.RGB;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * @author mengbo
- */
-public class CSSTextFigure extends FlowFigure implements ICSSFigure {
-	private ICSSTextProvider _provider;
-
-	private List _fragments = new ArrayList(1);
-
-	/**
-	 * @param provider
-	 */
-	public CSSTextFigure(ICSSTextProvider provider) {
-		_provider = provider;
-		this.setLayoutManager(createDefaultFlowLayout());
-	}
-
-	public ICSSStyle getCSSStyle() {
-		IFigure parentFigure = this.getParent();
-		if (parentFigure instanceof ICSSFigure) {
-			ICSSStyle style = ((ICSSFigure) parentFigure).getCSSStyle();
-			if (style != null) {
-				return style;
-			}
-		}
-		return DefaultStyle.getInstance();
-	}
-
-	/**
-	 * @see org.eclipse.draw2d.IFigure#containsPoint(int, int)
-	 */
-	public boolean containsPoint(int x, int y) {
-		if (!super.containsPoint(x, y)) {
-			return false;
-		}
-		List frags = getFragments();
-		for (int i = 0, n = frags.size(); i < n; i++) {
-			if (((FlowBox) frags.get(i)).containsPoint(x, y)) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * @return the default flow layout
-	 * 
-	 */
-	protected FlowFigureLayout createDefaultFlowLayout() {
-		return new CSSTextLayout(this);
-	}
-
-	/**
-	 * Returns the <code>LineBox</code> fragments contained in this InlineFlow
-	 * 
-	 * @return The fragments
-	 */
-	public List getFragments() {
-		return _fragments;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.ICSSFigure#getFragmentsForRead()
-	 */
-	public List getFragmentsForRead() {
-		return getFragments();
-	}
-
-	/**
-	 * @return the text
-	 */
-	public String getText() {
-		return _provider.getTextData();
-	}
-
-	/**
-	 * @see FlowFigure#postValidate()
-	 */
-	public void postValidate() {
-		List list = getFragments();
-		FlowBox box;
-		int left = Integer.MAX_VALUE, top = left;
-		int right = Integer.MIN_VALUE, bottom = right;
-		for (int i = 0, n = list.size(); i < n; i++) {
-			box = (FlowBox) list.get(i);
-			left = Math.min(left, box._x);
-			right = Math.max(right, box._x + box._width);
-			top = Math.min(top, box._y);
-			bottom = Math.max(bottom, box._y + box._height);
-		}
-		setBounds(new Rectangle(left, top, right - left, bottom - top));
-		list = getChildren();
-		for (int i = 0, n = list.size(); i < n; i++) {
-			((FlowFigure) list.get(i)).postValidate();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.Figure#paintBorder(org.eclipse.draw2d.Graphics)
-	 */
-	protected void paintBorder(Graphics graphics) {
-		if (Debug.DEBUG_TEXTBORDER) {
-			if (_fragments != null) {
-				graphics.setForegroundColor(ColorConstants.darkBlue);
-				for (int i = 0, size = _fragments.size(); i < size; i++) {
-					FlowBox box = (FlowBox) _fragments.get(i);
-					BoxUtil.drawBox(graphics, box);
-				}
-				graphics.restoreState();
-			}
-		}
-	}
-
-	/**
-	 * @see org.eclipse.draw2d.Figure#paintFigure(Graphics)
-	 */
-	protected void paintFigure(Graphics g) {
-		Object result = this.getCSSStyle().getColor();
-		Color color;
-		if (result instanceof Color) {
-			color = (Color) result;
-		} else if (result instanceof RGB) {
-			color = new Color(null, (RGB) result);
-		} else {
-			color = null;
-		}
-		int[] range = null;
-		if (!StyleUtil.isInWidget(this.getCSSStyle())) {
-			range = _provider.getSelectedRange();
-		}
-		if (range == null || range[0] == range[1]) {
-			// we are not in selection
-			TextLayoutSupport.paintTextFigure(g, _fragments, getCSSStyle()
-					.getCSSFont().getSwtFont(), color, ((Integer) getCSSStyle()
-					.getStyleProperty(ICSSPropertyID.ATTR_TEXTDECORATION))
-					.intValue());
-		} else {
-			//Bug 191539 - [WPE] non-standard selection color in Web Page Editor
-			TextLayoutSupport.paintTextFigureWithSelection(g, _fragments,
-					_provider.getTextData(), getCSSStyle().getCSSFont()
-							.getSwtFont(), color, ((Integer) getCSSStyle()
-							.getStyleProperty(
-									ICSSPropertyID.ATTR_TEXTDECORATION))
-							.intValue(), range[0], range[1],
-					ColorConstants.white, Display.getDefault().getSystemColor(SWT.COLOR_LIST_SELECTION));
-		}
-		if (color != result && color != null) {
-			color.dispose();
-		}
-	}
-
-	/**
-	 * Find out lines which has closer y coordinate to point, and then line
-	 * which has closer x coordinate.
-	 * 
-	 * @param relative
-	 * @return return the offset
-	 */
-    // TODO: refactoring?
-	public int getNewInsertionOffset(Point relative) {
-		TextFragmentBox closestBox = null;
-		// if there is one which are at the same line with relative, calculate
-		// that line first;
-		for (int i = 0, n = _fragments.size(); i < n; i++) {
-			TextFragmentBox box = (TextFragmentBox) _fragments.get(i);
-			if (box.containsPoint(relative.x, relative.y)) {
-				int index = FlowUtilities.getTextInWidth(box.getTextData(),
-						getCSSStyle().getCSSFont().getSwtFont(), relative.x
-								- box._x, TextLayoutSupport
-								.getAverageCharWidth(box));
-				return box._offset + index;
-			}
-            if (closestBox == null) {
-            	closestBox = box;
-            } else {
-            	// box is above point
-            	TextFragmentBox tempBox = box;
-            	int offset1 = Math
-            			.abs(CaretPositionResolver.getYDistance(
-            					new Rectangle(tempBox._x, tempBox._y,
-            							tempBox._width, tempBox._height),
-            					relative));
-            	tempBox = closestBox;
-            	int offset2 = Math
-            			.abs(CaretPositionResolver.getYDistance(
-            					new Rectangle(tempBox._x, tempBox._y,
-            							tempBox._width, tempBox._height),
-            					relative));
-            	if (offset1 < offset2) {
-            		closestBox = box;
-            	}
-            }
-            // at the same line
-            if (box.containsPoint(box._x, relative.y)) {
-            	TextFragmentBox tempBox = box;
-            	int offset1 = Math
-            			.abs(CaretPositionResolver.getXDistance(
-            					new Rectangle(tempBox._x, tempBox._y,
-            							tempBox._width, tempBox._height),
-            					relative));
-            	tempBox = closestBox;
-            	int offset2 = Math
-            			.abs(CaretPositionResolver.getXDistance(
-            					new Rectangle(tempBox._x, tempBox._y,
-            							tempBox._width, tempBox._height),
-            					relative));
-            	if (offset1 < offset2) {
-            		closestBox = box;
-            	}
-            }
-		}
-
-		if (closestBox.containsPoint(closestBox._x, relative.y)
-				|| closestBox.containsPoint(relative.x, closestBox._y)) {
-			int offset = relative.x - closestBox._x;
-			int index = FlowUtilities.getTextInWidth(closestBox.getTextData(),
-					getCSSStyle().getCSSFont().getSwtFont(), offset,
-					TextLayoutSupport.getAverageCharWidth(closestBox));
-			return closestBox._offset + index;
-		}
-        return -1;
-	}
-
-	/**
-	 * @param relative
-	 * @return the insertion offset
-	 */
-	public int getInsertionOffset(Point relative) {
-		for (int i = 0, n = _fragments.size(); i < n; i++) {
-			TextFragmentBox box = (TextFragmentBox) _fragments.get(i);
-			if (box.containsPoint(relative.x, relative.y)) {
-				int index = FlowUtilities.getTextInWidth(box.getTextData(),
-						getCSSStyle().getCSSFont().getSwtFont(), relative.x
-								- box._x, TextLayoutSupport
-								.getAverageCharWidth(box));
-				return box._offset + index;
-			}
-		}
-		return -1;
-	}
-
-	/**
-	 * the returned rectangle will be relative to this text figure.
-	 * 
-	 * @param offset
-	 * @return the caret position
-	 */
-	public Rectangle calculateCaretPosition(int offset) {
-		// search reverse order, find the latest box that has _offset small than
-		// the specified one
-		if (offset > 0) {
-			for (int i = _fragments.size() - 1; i >= 0; i--) {
-				TextFragmentBox box = (TextFragmentBox) _fragments.get(i);
-				if (box._offset <= offset) {
-					// ok, we find the box.
-					if (box._offset + box._length < offset) {
-						return new Rectangle(box._x + box._width, box._y, 1,
-								box._height);
-					}
-                    String s = box.getTextData().substring(0,
-                    		offset - box._offset);
-                    int width = FlowUtilities.getTextExtents(s,
-                    		getCSSStyle().getCSSFont().getSwtFont()).width;
-                    return new Rectangle(box._x + width, box._y, 1,
-                    		box._height);
-				}
-			}
-		} else {
-			if (_fragments.size() > 0) {
-				TextFragmentBox box = (TextFragmentBox) _fragments.get(0);
-				return new Rectangle(box._x, box._y, 1, box._height);
-			}
-		}
-		// should only reach here when there is no fragments.
-		return new Rectangle(getBounds().x, getBounds().y, 1, getBounds().height);
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CSSTextLayout.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CSSTextLayout.java
deleted file mode 100644
index 30589f7..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CSSTextLayout.java
+++ /dev/null
@@ -1,233 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-import java.util.List;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.css2.style.AbstractStyle;
-import org.eclipse.swt.graphics.Font;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- */
-// NOTE: CSSTextLayout does not extends CSSFlowLayout. Since text is a little
-// special,
-// we don't want to do things like "preLayout()" as in CSSFlowLayout.
-public class CSSTextLayout extends FlowFigureLayout {
-	/**
-	 * Wrapping will ONLY occur at valid line breaks
-	 */
-	public static final int WORD_WRAP_HARD = 0;
-
-	/**
-	 * Wrapping will always occur at the end of the available space, breaking in
-	 * the middle of a word.
-	 */
-	public static final int WORD_WRAP_SOFT = 1;
-
-	/**
-	 * Wrapping will always occur at the end of available space, truncating a
-	 * word if it doesn't fit.
-	 */
-	// don't support this flag
-	// public static final int WORD_WRAP_TRUNCATE = 2;
-	private int _wrappingStyle = WORD_WRAP_HARD;
-
-	/**
-	 * @param textfigure
-	 */
-	public CSSTextLayout(CSSTextFigure textfigure) {
-		super(textfigure);
-	}
-
-	// --------------------------------------------------------------------------------------------------
-	FlowBox findLastNonLineBox(LineBox box) {
-		List fragments = box.getFragments();
-		for (int i = fragments.size() - 1; i >= 0; i--) {
-			FlowBox item = (FlowBox) fragments.get(i);
-			if (item instanceof LineBox) {
-				FlowBox found = findLastNonLineBox((LineBox) item);
-				if (found != null) {
-					return found;
-				}
-			} else {
-				return item;
-			}
-		}
-		return null;
-	}
-
-	// boolean isElementContentWhitespaceEnding()
-	// {
-	// if (!this._context.isCurrentLineOccupied())
-	// return true;
-	// LineBox line = this._context.getCurrentLine();
-	// FlowBox lastNoneLinebox = findLastNonLineBox(line);
-	// if (lastNoneLinebox instanceof TextFragmentBox)
-	// return ((TextFragmentBox) lastNoneLinebox)._isLastCharWhitespace;
-	// else
-	// return true;
-	// }
-	//
-	// String normalize(String text)
-	// {
-	// text = EntityMap.translateAndCompact(text);
-	// if (text.length() > 0 &&
-	// Character.isElementContentWhitespace(text.charAt(0)) &&
-	// isElementContentWhitespaceEnding())
-	// return text.substring(1);
-	// else
-	// return text;
-	// }
-
-	private void layoutEmptyString(List fragments, Font font) {
-		// empty node! we want to create a fake fragment, so things can be
-		// consistent
-		// that all the CSSTextFigure will have something inside, also in this
-		// way, even
-		// empty text node will have a position, thus we can support showing
-		// caret associated
-		// with this text figure.
-		fragments.clear();
-		TextFragmentBox box = TextLayoutSupport.getFragment(0, fragments);
-		box._length = 0;
-		box._offset = 0;
-		box._height = 0;
-		box._width = 0;
-		box.setTextData(""); //$NON-NLS-1$
-
-		// {following comments deprecated XXX: If is empty string, we only want
-		// to this figure to have a size, but don't
-		// want to it to be added into current line. Otherwise, a line with only
-		// a empty string
-		// will also take a line's space.}
-
-		// please reference LineBox.isOccupied()
-		// now we treat a line with only an empty text as not occupied.
-		getFlowContext().getCurrentLine().add(box);
-	}
-
-	/**
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowFigureLayout#layout()
-	 */
-	protected void layout() {
-		CSSTextFigure flowFigure = (CSSTextFigure) getFlowFigure();
-
-		List fragments = flowFigure.getFragments();// Reuse the previous List
-		// of fragments
-		String text = flowFigure.getText();
-		Font font = flowFigure.getCSSStyle().getCSSFont().getSwtFont();
-		Object whitespace = flowFigure.getCSSStyle().getStyleProperty(
-				ICSSPropertyID.ATTR_WHITESPACE);
-
-		if (whitespace == ICSSPropertyID.VAL_PRE) {
-			if (text == null || text.length() == 0)
-				layoutEmptyString(fragments, font);
-			else
-				TextLayoutSupport.layoutNoWrap(getFlowContext(), text,
-						fragments, font);
-		} else if (whitespace == ICSSPropertyID.VAL_NOWRAP) {
-			if (text == null || text.length() == 0)
-				layoutEmptyString(fragments, font);
-			else
-				TextLayoutSupport.layoutNoWrap(getFlowContext(), text,
-						fragments, font);
-		} else {
-			if (text == null || text.length() == 0)
-				layoutEmptyString(fragments, font);
-			else {
-				//fix for bug #221629 - BEGIN
-				boolean useShouldTrimLeadingWSInlineMethod = false;
-				IFigure parentFigure = flowFigure.getParent();
-				if (parentFigure instanceof CSSFigure) {
-					ICSSStyle style = ((CSSFigure)parentFigure).getCSSStyle();
-					if (style instanceof AbstractStyle) {
-						Element element = ((AbstractStyle)style).getElement();
-						if (element != null &&
-								element.getNodeName().equals(IHTMLConstants.TAG_SPAN)) {
-							useShouldTrimLeadingWSInlineMethod = true;
-						}
-					}
-				}
-				boolean trimLeadingChar;
-				if (!useShouldTrimLeadingWSInlineMethod) {
-					trimLeadingChar = (text.charAt(0) == ' ' && shouldTrimLeadingWhitespace(getFlowContext()));
-				} else {
-					trimLeadingChar = (text.charAt(0) == ' ' && shouldTrimLeadingWhitespaceInline(getFlowContext()));
-				}
-				//fix for bug #221629 - END
-				TextLayoutSupport.layoutNormal(getFlowContext(), text,
-						fragments, font, _wrappingStyle, trimLeadingChar);
-			}
-		}
-	}
-
-	/**
-	 * @param context
-	 * @return true if should trim leading whitespace
-	 */
-    // XXX: maybe should move to TextSupport later.
-	public boolean shouldTrimLeadingWhitespace(FlowContext context) {
-		if (!context.isCurrentLineOccupied()) {
-			return true;
-		}
-		while (context instanceof CSSInlineFlowLayout) {
-			context = ((CSSInlineFlowLayout) context).getFlowContext();
-		}
-		LineBox line = context.getCurrentLine();
-		if (line == null || !line.isOccupied()) {
-			return true;
-		}
-		FlowBox lastNoneLinebox = findLastNonLineBox(line);
-		if (lastNoneLinebox == null || lastNoneLinebox.getWidth() == 0) {
-			return true;
-		} else if (lastNoneLinebox instanceof TextFragmentBox) {
-			return ((TextFragmentBox) lastNoneLinebox)._isLastCharWhitespace;
-		} else {
-			return false;
-		}
-	}
-
-	/**
-	 * Used instead of shouldTrimLeadingWhitespace(FlowContext) if parent
-	 * figure's style is for an appropriate in-line element, such as "span".
-	 * 
-	 * @param context FlowContext instance.
-	 * @return true if should trim leading whitespace, else false.
-	 */
-	private boolean shouldTrimLeadingWhitespaceInline(FlowContext context) {
-		if (!context.isCurrentLineOccupied()) {
-			return true;
-		}
-		LineBox line = context.getCurrentLine();
-		if (line == null || !line.isOccupied()) {
-			return true;
-		}
-		FlowBox lastNoneLinebox = findLastNonLineBox(line);
-		if (lastNoneLinebox == null || lastNoneLinebox.getWidth() == 0) {
-			return true;
-		} else if (lastNoneLinebox instanceof TextFragmentBox) {
-			return ((TextFragmentBox) lastNoneLinebox)._isLastCharWhitespace;
-		} else {
-			return false;
-		}
-	}
-
-	public void dispose() {
-        // TODO: anything to dispose?
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CSSWidgetLayout.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CSSWidgetLayout.java
deleted file mode 100644
index 8e50123..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CSSWidgetLayout.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.jst.pagedesigner.css2.provider.DimensionInfo;
-import org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider;
-
-/**
- * @author mengbo
- */
-public class CSSWidgetLayout extends CSSBlockFlowLayout implements ICSSPainter {
-	private WidgetBox _widgetBox;
-
-	private ICSSWidgetProvider _provider;
-
-	/**
-	 * @param flowfigure
-	 * @param provider 
-	 */
-	public CSSWidgetLayout(CSSFigure flowfigure, ICSSWidgetProvider provider) {
-		super(flowfigure);
-		_provider = provider;
-	}
-
-	/**
-	 * normally this method is called directly after constructor
-	 * 
-	 * @param provider
-	 */
-	public void setProvider(ICSSWidgetProvider provider) {
-		_provider = provider;
-	}
-
-	/**
-	 * @return the provider
-	 */
-	public ICSSWidgetProvider getProvider() {
-		// return ((CSSWidgetFigure)this.getFlowFigure()).getProvider();
-		return _provider;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.CSSBlockFlowLayout#isInlineBlock()
-	 */
-	public boolean isInlineBlock() {
-		ICSSWidgetProvider provider = getProvider();
-		return provider.isInline();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowFigureLayout#layout()
-	 */
-	protected void layoutChildren() {
-		ICSSWidgetProvider provider = getProvider();
-
-		// if we did endLine, then will result in context create a new line, so
-		// we may in the new line now.
-		// passing in the top margin, and context will consider that when
-		// creating the new line.
-
-		int suggestedWith = _blockBox.getContentWidth();
-		int suggestedHeight = _blockBox.getContentHeight();
-		// int suggestedWith = getSuggestedWidth(line, style, provider);
-		// int suggestedHeight = getSuggestedHeight(line, style, provider);
-
-		DimensionInfo resultInfo = provider.getPreferredDimension(
-				suggestedWith, suggestedHeight);
-		Dimension resultSize = resultInfo.getDimension();
-
-		_widgetBox = new WidgetBox(); // ((CSSWidgetFigure)getFlowFigure()).getWidgetBox();
-		// if (provider.isHandlingBorder() || style == null)
-		// {
-		_widgetBox.setWidth(resultSize.width);
-		_widgetBox.setHeight(resultSize.height);
-		_widgetBox.setAscent(resultInfo.getAscent());
-		// }
-		// else
-		// {
-		// widgetBox.setWidth(resultSize.width +
-		// style.getBorderInsets().getWidth());
-		// widgetBox.setHeight(resultSize.height +
-		// style.getBorderInsets().getHeight());
-		// widgetBox.setAscent(resultInfo.getAscent()+style.getBorderInsets().top);
-		// }
-		this.addToCurrentLine(_widgetBox);
-		// if (!provider.isInline())
-		// {
-		// context.endLine();
-		// }
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowFigureLayout#dispose()
-	 */
-	public void dispose() {
-        // TODO: anything to dispose?
-	}
-
-	// public int getSuggestedWidth(LineBox line, ICSSStyle style,
-	// ICSSWidgetProvider provider)
-	// {
-	// if (style == null) return -1;
-	//
-	// Object width = style.getStyleProperty(ICSSPropertyID.ATTR_WIDTH);
-	// Length recommendedWidth = (width instanceof Length) ? (Length) width :
-	// null;
-	//
-	// int rw = 0;
-	// if (recommendedWidth == null || recommendedWidth.getValue() <= 0)
-	// {
-	// return -1;
-	// }
-	// else
-	// {
-	// if (recommendedWidth.isPercentage())
-	// {
-	// rw = line.getAvailableWidth() * recommendedWidth.getValue() / 100;
-	// }
-	// else
-	// {
-	// rw = recommendedWidth.getValue();
-	// }
-	//
-	// if (!style.isSizeIncludeBorderPadding() && provider.isHandlingBorder())
-	// {
-	// rw += style.getBorderInsets().getWidth() +
-	// style.getPaddingInsets().getWidth();
-	// }
-	// else if (style.isSizeIncludeBorderPadding() &&
-	// !provider.isHandlingBorder())
-	// {
-	// rw -= style.getBorderInsets().getWidth() +
-	// style.getPaddingInsets().getWidth();
-	// }
-	// }
-	//
-	// return rw;
-	// }
-	//
-	// public int getSuggestedHeight(LineBox line, ICSSStyle style,
-	// ICSSWidgetProvider provider)
-	// {
-	// if (style == null) return -1;
-	//
-	// Object height = style.getStyleProperty(ICSSPropertyID.ATTR_HEIGHT);
-	// Length recommendedHeight = (height instanceof Length) ? (Length) height :
-	// null;
-	//
-	// int rh = 0;
-	// if (recommendedHeight == null || recommendedHeight.getValue() <= 0)
-	// {
-	// return -1;
-	// }
-	// else
-	// {
-	// if (recommendedHeight.isPercentage())
-	// {
-	// // we don't support percentage height for this version, ignore
-	// return -1;
-	// }
-	// else
-	// {
-	// rh = recommendedHeight.getValue();
-	// }
-	//
-	// if (!style.isSizeIncludeBorderPadding() && provider.isHandlingBorder())
-	// {
-	// rh += style.getBorderInsets().getHeight() +
-	// style.getPaddingInsets().getHeight();
-	// }
-	// else if (style.isSizeIncludeBorderPadding() &&
-	// !provider.isHandlingBorder())
-	// {
-	// rh -= style.getBorderInsets().getHeight() +
-	// style.getPaddingInsets().getHeight();
-	// }
-	// }
-	//
-	// return rh;
-	// }
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.ICSSPainter#paintFigure(org.eclipse.draw2d.Graphics)
-	 */
-	public void paintFigure(Graphics g) {
-		ICSSWidgetProvider provider = this.getProvider();
-		if (provider != null && _widgetBox != null) {
-			provider.paintFigure(g, new Rectangle(_widgetBox._x, _widgetBox._y,
-					_widgetBox.getWidth(), _widgetBox.getHeight()));
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.CSSLayout#handlingBorderForBlock()
-	 */
-	public boolean handlingBorderForBlock() {
-		ICSSWidgetProvider provider = this.getProvider();
-		if (provider != null) {
-			return provider.isHandlingBorder();
-		}
-		return super.handlingBorderForBlock();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CompositeBox.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CompositeBox.java
deleted file mode 100644
index 75d6a0e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CompositeBox.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * A FlowBox that can contain other BlockInfos. The contained BlockInfos are
- * called <i>fragments </i>.
- * 
- * @author mengbo
- * @since 2.1
- */
-public abstract class CompositeBox extends FlowBox {
-
-	/**
-	 * The contained fragments.
-	 */
-	protected List _fragments = new ArrayList();
-
-	int _recommendedWidth;
-
-	int _recommendedHeight;
-
-	/**
-	 * Adds the specified FlowBox. Updates the width, height, and ascent
-	 * properties.
-	 * 
-	 * @param block
-	 *            the FlowBox being added
-	 */
-	public void add(FlowBox block) {
-		// The order is critical.see the first "if" block in the unionInfo()
-		// method.
-		unionInfo(block);
-		_fragments.add(block);
-	}
-
-	/**
-	 * Removes all owned fragments and invalidates this CompositeBox.
-	 */
-	public void clear() {
-		_fragments.clear();
-		resetInfo();
-	}
-
-	/**
-	 * Overridden to ensure that the CompositeBox is valid.
-	 * 
-	 * @see FlowBox#getBounds()
-	 */
-	// public Rectangle getBounds() {
-	// validate();
-	// return this;
-	// }
-	/**
-	 * @return the List of fragments
-	 */
-	public List getFragments() {
-		return _fragments;
-	}
-
-	/**
-	 * Returns the recommended width for this CompositeBox.
-	 * 
-	 * @return the recommended width
-	 */
-	public int getRecommendedWidth() {
-		return _recommendedWidth;
-	}
-
-	/**
-	 * resets fields before unioning the data from the fragments.
-	 */
-	protected void resetInfo() {
-		_width = _height = 0;
-	}
-
-	/**
-	 * Sets the recommended width for this CompositeBox.
-	 * 
-	 * @param w
-	 *            the width
-	 */
-	public void setRecommendedWidth(int w) {
-		_recommendedWidth = w;
-	}
-
-	/**
-	 * @param h
-	 */
-	public void setRecommendedHeight(int h) {
-		_recommendedHeight = h;
-	}
-
-	/**
-	 * unions the fragment's width, height, and ascent into this composite.
-	 * 
-	 * @param box
-	 *            the fragment
-	 */
-	protected void unionInfo(FlowBox box) {
-		int right = Math.max(_x + _width, box._x + box._width);
-		int bottom = Math.max(_y + _height, box._y + box._height);
-		_x = Math.min(_x, box._x);
-		_y = Math.min(_y, box._y);
-		_width = right - _x;
-		_height = bottom - _y;
-	}
-
-	/**
-	 * @return the content width
-	 */
-	public int getContentWidth() {
-		return getWidth() - getBorderPaddingWidth();
-	}
-
-	/**
-	 * @return the content height
-	 */
-	public int getContentHeight() {
-		return getHeight() - getBorderPaddingHeight();
-	}
-
-	/**
-	 * @return the recommended content width
-	 */
-	public int getRecommendedContentWidth() {
-		return Math.max(0, getRecommendedWidth() - getBorderPaddingWidth());
-	}
-	//
-	// public int getRecommendedContentHeight()
-	// {
-	// return Math.max(0, getRecommendedHeight() - getBorderPaddingHeight());
-	// }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/Debug.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/Debug.java
deleted file mode 100644
index f83e901..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/Debug.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-/**
- * Debug constants.
- * 
- * @author mengbo
- * @version 1.5
- */
-public class Debug {
-	/**
-	 * Debug flag
-	 */
-	public static final boolean DEBUG_BASELINE = false;
-
-	/**
-	 * Debug flag
-	 */
-	public static final boolean DEBUG_BOX = false;
-
-	/**
-	 * Debug flag
-	 */
-	public static final boolean DEBUG_BORDERPADDING = false;
-
-	/**
-	 * Debug flag
-	 */
-	public static final boolean DEBUG_TEXTBORDER = false;
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/DisplayToLayout.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/DisplayToLayout.java
deleted file mode 100644
index ed02c84..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/DisplayToLayout.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-import org.eclipse.draw2d.LayoutManager;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.layout.table.CSSTRGroupLayout;
-import org.eclipse.jst.pagedesigner.css2.layout.table.CSSTRLayout;
-import org.eclipse.jst.pagedesigner.css2.layout.table.CSSTableCaptionLayout;
-import org.eclipse.jst.pagedesigner.css2.layout.table.CSSTableCellLayout;
-import org.eclipse.jst.pagedesigner.css2.layout.table.CSSTableLayout2;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.css2.property.PositionMeta;
-
-/**
- * @author mengbo
- */
-public final class DisplayToLayout {
-	/**
-	 * @param figure
-	 * @param display
-	 * @param old
-	 * @return the layout
-	 */
-	public static CSSLayout displayToLayout(CSSFigure figure, String display,
-			LayoutManager old) {
-		if ("block".equalsIgnoreCase(display)) //$NON-NLS-1$
-		{
-			return new CSSBlockFlowLayout(figure);
-		} else if ("inline".equalsIgnoreCase(display)) //$NON-NLS-1$
-		{
-			return new CSSInlineFlowLayout(figure);
-		} else if ("table".equalsIgnoreCase(display) || "inline-table".equalsIgnoreCase(display)) //$NON-NLS-1$ //$NON-NLS-2$ $NON-NLS-2$
-		{
-			return new CSSTableLayout2(figure);
-		} else if ("table-row".equalsIgnoreCase(display)) //$NON-NLS-1$
-		{
-			return new CSSTRLayout(figure);
-		} else if ("table-row-group".equalsIgnoreCase(display) //$NON-NLS-1$
-				|| "table-header-group".equalsIgnoreCase(display) //$NON-NLS-1$
-				|| "table-footer-group".equalsIgnoreCase(display)) //$NON-NLS-1$
-		{
-			return new CSSTRGroupLayout(figure);
-		} else if ("table-cell".equalsIgnoreCase(display)) //$NON-NLS-1$
-		{
-			return new CSSTableCellLayout(figure);
-		} else if (display.equalsIgnoreCase("table-caption")) //$NON-NLS-1$
-		{
-			return new CSSTableCaptionLayout(figure);
-		} else if ("inline-block".equalsIgnoreCase(display)) //$NON-NLS-1$
-		{
-			return new CSSBlockFlowLayout(figure) {
-				/*
-				 * (non-Javadoc)
-				 * 
-				 * @see org.eclipse.jst.pagedesigner.css2.layout.CSSBlockFlowLayout#isInlineBlock()
-				 */
-				public boolean isInlineBlock() {
-					return true;
-				}
-			};
-		} else if (ICSSPropertyID.VAL_LIST_ITEM.equalsIgnoreCase(display)) {
-			return new CSSListItemLayout(figure);
-		}
-		return null;
-	}
-
-	/**
-	 * @param display 
-	 * @return true if is inline
-	 */
-	public static boolean isInline(String display) {
-		return "inline".equalsIgnoreCase(display) //$NON-NLS-1$
-				|| "inline-block".equalsIgnoreCase(display); //$NON-NLS-1$
-	}
-
-	/**
-	 * @param style
-	 * @return true if is positioned
-	 */
-	public static boolean isPositioned(ICSSStyle style) {
-		Object position = style.getStyleProperty(ICSSPropertyID.ATTR_POSITION);
-		if (PositionMeta.STATIC.equalsIgnoreCase((String) position)) {
-			return false;
-		}
-        return true;
-	}
-	
-	private DisplayToLayout()
-	{
-	    // util class, no instantiation
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/FigureUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/FigureUtil.java
deleted file mode 100644
index 56d775c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/FigureUtil.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.geometry.Translatable;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public  final class FigureUtil {
-	/**
-	 * @param figure
-	 * @param t
-	 */
-    // XXX:
-    // seemed Figure.translateToRelative is bug?
-	public static final void translateToRelative(IFigure figure, Translatable t) {
-		if (figure.getParent() != null) {
-			translateToRelative(figure.getParent(), t);
-			// figure.getParent().translateToRelative(t);
-			figure.translateFromParent(t);
-		}
-	}
-
-	/**
-	 * @param figure
-	 * @param t
-	 */
-    // XXX:
-    // seemed Figure.translateToAbsolute is bug?
-	public static final void translateToAbsolute(IFigure figure, Translatable t) {
-		if (figure.getParent() != null) {
-			figure.translateToParent(t);
-			translateToAbsolute(figure.getParent(), t);
-			// figure.getParent().translateToAbsolute(t);
-		}
-
-	}
-	
-	private FigureUtil()
-	{
-	    // util class.  No instantiation
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/FlowBox.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/FlowBox.java
deleted file mode 100644
index 52b3765..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/FlowBox.java
+++ /dev/null
@@ -1,230 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-import org.eclipse.draw2d.geometry.Insets;
-import org.eclipse.draw2d.geometry.Rectangle;
-
-/**
- * This class represents the CSS box model. See chapter 8 of CSS2 spec.
- * 
- * see http://www.w3.org/TR/REC-CSS2/box.html
- * 
- */
-public class FlowBox {
-	private Object _verticalAlignData = null;
-
-	/**
-	 * The x location
-	 */
-	protected int _x;
-
-	/**
-	 * The y location
-	 */
-	protected int _y;
-
-	int _width;
-
-	int _height;
-
-	private Insets _marginInsets = new Insets();
-
-	private Insets _borderInsets = new Insets();
-
-	private Insets _paddingInsets = new Insets();
-
-	/**
-	 * This method must be called on a block that is completely positioned and
-	 * committed.
-	 * 
-	 * @param x
-	 *            X
-	 * @param y
-	 *            Y
-	 * @return <code>true</code> if the FlowBox contains the point
-	 */
-	public boolean containsPoint(int x, int y) {
-		return x >= this._x && y >= this._y && x < this._x + this._width
-				&& y < this._y + this._height;
-	}
-
-	/**
-	 * By default, a FlowBox is all ascent, and no descent, so the height is
-	 * returned.
-	 * 
-	 * @return the <i>ascent </i> in pixels above the baseline
-	 */
-	public int getAscent() {
-		return getHeight();
-	}
-
-
-	/**
-	 * By default, a simple FlowBox is all ascent, and no descent. Zero is
-	 * returned.
-	 * 
-	 * @return the <i>descent </i> in pixels below the baseline
-	 */
-	public final int getDescent() {
-		return getHeight() - getAscent();
-	}
-
-	/**
-	 * Returns the height
-	 * 
-	 * @return height
-	 */
-	public int getHeight() {
-		return _height;
-	}
-
-	/**
-	 * Returns the width
-	 * 
-	 * @return width
-	 */
-	public int getWidth() {
-		return _width;
-	}
-
-	/**
-	 * @param w
-	 */
-	public void setWidth(int w) {
-		_width = w;
-	}
-
-	/**
-	 * @param h
-	 */
-	public void setHeight(int h) {
-		_height = h;
-	}
-
-	/**
-	 * Used to set the baseline of this FlowBox to the specified value.
-	 * 
-	 * @param value
-	 *            the new baseline
-	 */
-	public void makeBaseline(int value) {
-		_y = (value - getAscent());
-	}
-
-	/**
-	 * @return the border padding width
-	 */
-	public int getBorderPaddingWidth() {
-		return _borderInsets.getWidth() + _paddingInsets.getWidth();
-	}
-
-	/**
-	 * @return the border padding height
-	 */
-	public int getBorderPaddingHeight() {
-		return _borderInsets.getHeight() + _paddingInsets.getHeight();
-	}
-
-	/**
-	 * @return the border padding insets
-	 */
-	public Insets getBorderPaddingInsets() {
-		Insets temp = new Insets(_borderInsets);
-		return temp.add(_paddingInsets);
-	}
-
-	/**
-	 * @param rect
-	 */
-	public void setXYWidthHeight(Rectangle rect) {
-		this._x = rect.x;
-		this._y = rect.y;
-		this.setWidth(rect.width);
-		this.setHeight(rect.height);
-	}
-
-	/**
-	 * @return Returns the _verticalAlignData.
-	 */
-	public Object getVerticalAlignData() {
-		return _verticalAlignData;
-	}
-
-	/**
-	 * @param alignData
-	 *            The _verticalAlignData to set.
-	 */
-	public void setVerticalAlignData(Object alignData) {
-		_verticalAlignData = alignData;
-	}
-
-	/**
-	 * @return a copy of the rectangle
-	 * TODO: use getCopy() ?
-	 */
-	public Rectangle getRectangle() {
-		return new Rectangle(this._x, this._y, this.getWidth(), this
-				.getHeight());
-	}
-
-    /**
-     * @return the x coordinate
-     */
-    public final int getX() {
-        return _x;
-    }
-
-    /**
-     * @return the y coordinate
-     */
-    public final int getY() {
-        return _y;
-    }
-
-    /**
-     * @param y
-     */
-    protected void setY(int y)
-    {
-        _y = y;
-    }
-    
-    /**
-     * @return the margin insets
-     */
-    public final Insets getMarginInsets() {
-        return _marginInsets;
-    }
-
-    final void setMarginInsets(Insets marginInsets) {
-        _marginInsets = marginInsets;
-    }
-
-    final Insets getBorderInsets() {
-        return _borderInsets;
-    }
-
-    final void setBorderInsets(Insets borderInsets)
-    {
-        _borderInsets = borderInsets;
-    }
-    
-    final Insets getPaddingInsets() {
-        return _paddingInsets;
-    }
-	
-	final void setPaddingInsets(Insets paddingInsets)
-	{
-	    _paddingInsets = paddingInsets;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/FlowContainerLayout.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/FlowContainerLayout.java
deleted file mode 100644
index ca43353..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/FlowContainerLayout.java
+++ /dev/null
@@ -1,169 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-import java.util.List;
-
-import org.eclipse.draw2d.Figure;
-
-/**
- * A layout for FlowFigures with children.
- * <P>
- * WARNING: This class is not intended to be subclassed by clients.
- * 
- * @author mengbo
- * @since 2.1
- */
-public abstract class FlowContainerLayout extends FlowFigureLayout implements
-		FlowContext {
-//	private static Logger _log = PDPlugin.getLogger(FlowContainerLayout.class);
-
-	/**
-	 * the current line
-	 */
-	protected LineBox _currentLine;
-
-	private boolean _calculatingMaxWidth;
-
-	/**
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowFigureLayout#FlowFigureLayout(FlowFigure)
-	 */
-	protected FlowContainerLayout(FlowFigure flowFigure) {
-		super(flowFigure);
-	}
-
-	/**
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowContext#addToCurrentLine(FlowBox)
-	 */
-	public void addToCurrentLine(FlowBox block) {
-		getCurrentLine().add(block);
-	}
-
-	/**
-	 * Used by getCurrentLine().
-	 */
-	protected abstract void createNewLine();
-
-	/**
-	 * Used by getCurrentLine(int topmargin)
-	 * 
-	 * @param topMargin
-	 */
-	protected void createNewLine(int topMargin) {
-		createNewLine();
-	}
-
-	/**
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowContext#getCurrentLine()
-	 */
-	public LineBox getCurrentLine() {
-		if (_currentLine == null)
-			createNewLine();
-		return _currentLine;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowContext#getCurrentLine(int)
-	 */
-	public LineBox getCurrentLine(int topMargin) {
-		if (_currentLine == null) {
-			createNewLine(topMargin);
-		}
-		// if the current line only contains an empty string, reset the current
-		// line using the given margin.
-		else if (_currentLine.isEmptyStringLine()) {
-			List list = _currentLine.getFragments();
-			createNewLine(topMargin);
-			_currentLine._fragments.addAll(list);
-		}
-		return _currentLine;
-	}
-
-	/**
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowContext#isCurrentLineOccupied
-	 */
-	public boolean isCurrentLineOccupied() {
-		return _currentLine != null && _currentLine.isOccupied();
-	}
-
-	/**
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowFigureLayout#layout()
-	 */
-	protected void layout() {
-		preLayout();
-		layoutChildren();
-		flush();
-		cleanup();
-	}
-
-	/**
-	 * Layout all children.
-	 */
-	protected void layoutChildren() {
-		List children = getFlowFigure().getChildren();
-		for (int i = 0; i < children.size(); i++) {
-			Figure f = (Figure) children.get(i);
-			f.invalidate();
-			f.validate();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowContext#getLastMarginRight()
-	 */
-	public int getLastMarginRight() {
-		if (_currentLine == null || !_currentLine.isOccupied()) {
-			return 0;
-		}
-		FlowBox box = (FlowBox) _currentLine.getFragments().get(
-				_currentLine.getFragments().size() - 1);
-		if (box != null) {
-			return box.getMarginInsets().right;
-		}
-        return 0;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowContext#isCalculatingMaxWidth()
-	 */
-	public boolean isCalculatingMaxWidth() {
-		if (_calculatingMaxWidth) {
-			return true;
-		} else if (this.getFlowContext() == null) {
-			return false;
-		} else {
-			return this.getFlowContext().isCalculatingMaxWidth();
-		}
-	}
-
-	/**
-	 * Called before layoutChildren() to setup any necessary state.
-	 */
-	protected abstract void preLayout();
-
-	/**
-	 * Called after {@link #layoutChildren()}when all children have been laid
-	 * out. This method exists to flush the last line.
-	 */
-	protected abstract void flush();
-
-	/**
-	 * Flush anything pending and free all temporary data used during layout.
-	 */
-	protected abstract void cleanup();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/FlowContext.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/FlowContext.java
deleted file mode 100644
index bdd4e51..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/FlowContext.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-/**
- * Copied from draw2d. Enhanced to meet page designer's needs. The context that
- * a {@link FlowFigureLayout}uses to perform its layout.
- * <P>
- * WARNING: This interface is not intended to be implemented by clients. It
- * exists to define the API between the layout and its context.
- */
-public interface FlowContext {
-
-	/**
-	 * Adds the given box into the current line.
-	 * 
-	 * @param box
-	 *            the FlowBox to add
-	 */
-	void addToCurrentLine(FlowBox box);
-
-	/**
-	 * The current line should be committed if it is occupied, and then set to
-	 * <code>null</code>. Otherwise, do nothing.
-	 */
-	void endLine();
-
-	/**
-	 * Obtains the current line, creating a new line if there is no current
-	 * line. if create a new line, the new line's x will be set correctly
-	 * without considering the new element's left margin. Also, if create new
-	 * line, it will treat as the new line's top margin is 0.
-	 * 
-	 * @return the current line
-	 */
-	LineBox getCurrentLine();
-
-	/**
-	 * if create a new line, the new line's x will be set correctly without
-	 * considering the new element's left margin.
-	 * 
-	 * @param topMargin
-	 * @return the current line
-	 */
-	LineBox getCurrentLine(int topMargin);
-
-	/**
-	 * Returns the current Y value.
-	 * 
-	 * @return the current Y value
-	 */
-	int getCurrentY();
-
-	/**
-	 * @return <code>true</code> if the current line contains any fragments
-	 */
-	boolean isCurrentLineOccupied();
-
-	/**
-	 * @return the last margin right coord
-	 */
-	int getLastMarginRight();
-
-	/**
-	 * when layout table, we need to calculate max width of a cell. This is done
-	 * by don't break line (other than explicit required). Currently, the
-	 * solution is to make the recommended width to be very big, and when create
-	 * block element we don't set the block element's size to be recommended
-	 * width. Please see CSSBlockFlowLayout
-	 * 
-	 * @return true if is calculating max width
-	 */
-	boolean isCalculatingMaxWidth();
-
-	/**
-	 * when calculating percentage width, we need the container width
-	 * 
-	 * @return container width
-	 */
-	int getContainerWidth();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/FlowFigure.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/FlowFigure.java
deleted file mode 100644
index 7b52ca5..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/FlowFigure.java
+++ /dev/null
@@ -1,186 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-import java.util.List;
-
-import org.eclipse.draw2d.Figure;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-
-/**
- * The base implementation for text flow figures. A flow figure is used to
- * render a document in which elements are laid out horizontally within a "line"
- * until that line is filled. Layout continues on the next line.
- * <p>
- * WARNING: This class is not intended to be subclassed by clients. Future
- * versions may contain additional abstract methods.
- * 
- * @author mengbo
- * @since 2.1
- */
-public abstract class FlowFigure extends Figure {
-
-	// static final boolean SHOW_BASELINE = true;
-
-	/**
-	 * Constructs a new FlowFigure.
-	 */
-	public FlowFigure() {
-		// setLayoutManager(createDefaultFlowLayout());
-	}
-
-	/**
-	 * If the child is a <code>FlowFigure</code>, its FlowContext is passed
-	 * to it.
-	 * 
-	 * @see org.eclipse.draw2d.IFigure#add(IFigure, Object, int)
-	 */
-	public void add(IFigure child, Object constraint, int index) {
-		super.add(child, constraint, index);
-		if (child instanceof FlowFigure) {
-			FlowFigure ff = (FlowFigure) child;
-			if (getLayoutManager() instanceof FlowContext) {
-				ff.setOriginalFlowContext((FlowContext) getLayoutManager());
-			} else {
-				PDPlugin.getLogger(this.getClass()).error("layout is not FlowContext", new Throwable("This exception is artificial so  we can get a stack trace")); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-		}
-	}
-
-	/**
-	 * Creates the default layout manager
-	 * 
-	 * @return The default layout
-	 */
-	// protected abstract FlowFigureLayout createDefaultFlowLayout();
-	/**
-	 * @see Figure#paintFigure(Graphics)
-	 */
-	protected void paintFigure(Graphics g) {
-		super.paintFigure(g);
-		// g.drawRectangle(getBounds().getResized(-1,-1));
-	}
-
-	/**
-	 * Called after validate has occurred. This is used to update the bounds of
-	 * the FlowFigure to encompass its new flow boxed created during validate.
-	 */
-	public abstract void postValidate();
-
-	/**
-	 * FlowFigures override setBounds() to prevent translation of children.
-	 * "bounds" is a derived property for FlowFigures, calculated from the
-	 * fragments that make up the FlowFigure.
-	 * 
-	 * @see Figure#setBounds(Rectangle)
-	 */
-	public void setBounds(Rectangle r) {
-		if (getBounds().equals(r))
-			return;
-		erase();
-		bounds.x = r.x;
-		bounds.y = r.y;
-		bounds.width = r.width;
-		bounds.height = r.height;
-		fireFigureMoved();
-		repaint();
-	}
-
-	/**
-	 * Sets the flow context.
-	 * 
-	 * @param flowContext
-	 *            the flow context for this flow figure
-	 */
-	public void setOriginalFlowContext(FlowContext flowContext) {
-		((FlowFigureLayout) getLayoutManager())
-				.setOriginalFlowContext(flowContext);
-	}
-
-	public String toString() {
-		if (_displayString == null)
-        {
-			return super.toString();
-        }
-        return _displayString + " " + getClass().getName(); //$NON-NLS-1$
-	}
-
-	private String _displayString; // for debug
-
-	/**
-	 * @return the flow context
-	 */
-	public FlowContext getFlowContext() {
-		return ((FlowFigureLayout) getLayoutManager()).getFlowContext();
-	}
-
-	// ----------------------------------------------------------------------
-	// as absolute positioning and relative positioning may have children
-	// out-side
-	// of parent bounds, so we want to disable clipping when drawing figures
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.Figure#paintChildren(org.eclipse.draw2d.Graphics)
-	 */
-	protected void paintChildren(Graphics graphics) {
-		IFigure child;
-
-		Rectangle clip = Rectangle.SINGLETON;
-		List children = this.getChildren();
-		for (int i = 0; i < children.size(); i++) {
-			child = (IFigure) children.get(i);
-			if (child.isVisible() && child.intersects(graphics.getClip(clip))) {
-				// graphics.clipRect(child.getBounds());
-				child.paint(graphics);
-				graphics.restoreState();
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.Figure#paintClientArea(org.eclipse.draw2d.Graphics)
-	 */
-	protected void paintClientArea(Graphics graphics) {
-		if (this.getChildren().isEmpty())
-			return;
-
-		// boolean optimizeClip = getBorder() == null || getBorder().isOpaque();
-
-		if (useLocalCoordinates()) {
-			graphics.translate(getBounds().x + getInsets().left, getBounds().y
-					+ getInsets().top);
-			// if (!optimizeClip)
-			// graphics.clipRect(getClientArea(PRIVATE_RECT));
-			graphics.pushState();
-			paintChildren(graphics);
-			graphics.popState();
-			graphics.restoreState();
-		} else {
-			// if (optimizeClip)
-			paintChildren(graphics);
-			// else {
-			// graphics.clipRect(getClientArea(PRIVATE_RECT));
-			// graphics.pushState();
-			// paintChildren(graphics);
-			// graphics.popState();
-			// graphics.restoreState();
-			// }
-		}
-
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/FlowFigureLayout.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/FlowFigureLayout.java
deleted file mode 100644
index 4a77597..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/FlowFigureLayout.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-import org.eclipse.draw2d.AbstractLayout;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.geometry.Dimension;
-
-/**
- * Layout for flow figures
- *
- */
-public abstract class FlowFigureLayout extends AbstractLayout {
-
-	/**
-	 * <code>true</code> if the context has changed, and a layout is needed.
-	 */
-	protected boolean _invalid = true;
-
-	/**
-	 * The flow context in which this LayoutManager exists.
-	 */
-	private FlowContext _context;
-
-	/**
-	 * The figure passed by layout(Figure) is held for convenience.
-	 */
-	private final FlowFigure _flowFigure;
-
-	/**
-	 * Constructs a new FlowFigureLayout with the given FlowFigure.
-	 * 
-	 * @param flowfigure
-	 *            the FlowFigure
-	 */
-	protected FlowFigureLayout(FlowFigure flowfigure) {
-		this._flowFigure = flowfigure;
-	}
-
-	/**
-	 * TextFlowLayouts do not calculate a preferred size because it is too
-	 * expensive. {@link FlowPage}will actually layout itself in order to
-	 * calculate preferredSize.
-	 * 
-	 * @see AbstractLayout#calculatePreferredSize(IFigure)
-	 */
-	public Dimension calculatePreferredSize(IFigure f, int w, int h) {
-		return null;
-	}
-
-	/**
-	 * @return the FlowFigure
-	 */
-	protected FlowFigure getFlowFigure() {
-		return _flowFigure;
-	}
-
-	/**
-	 * Marks this layout as invalid.
-	 * 
-	 * @see org.eclipse.draw2d.LayoutManager#invalidate()
-	 */
-	public void invalidate() {
-		_invalid = true;
-		super.invalidate();
-	}
-
-	/**
-	 * @see org.eclipse.draw2d.LayoutManager#layout(IFigure)
-	 */
-	public final void layout(IFigure figure) {
-		layout();
-		_invalid = false;
-	}
-
-	/**
-	 * Called during {@link #layout(IFigure)}. The {@link  #_invalid}flag is
-	 * reset after this method is called.
-	 */
-	protected abstract void layout();
-
-	/**
-	 * Sets the context for this layout manager.
-	 * 
-	 * @param flowContext
-	 *            the context of this layout
-	 */
-	public void setOriginalFlowContext(FlowContext flowContext) {
-		_context = flowContext;
-	}
-
-	/**
-	 * @return the original flow context
-	 */
-	protected final FlowContext getOriginalFlowContext() {
-		return _context;
-	}
-
-	/**
-	 * get flow context.
-	 * 
-	 * @return the flow context
-	 */
-	public FlowContext getFlowContext() {
-		return _context;
-	}
-
-	public String toString() {
-		// for debug purpose.
-		return _flowFigure.toString();
-	}
-
-	/**
-	 * Called to dispose the layout
-	 */
-	abstract public void dispose();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/FlowPage.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/FlowPage.java
deleted file mode 100644
index cd81a03..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/FlowPage.java
+++ /dev/null
@@ -1,161 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-import java.util.Iterator;
-
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.Insets;
-import org.eclipse.draw2d.geometry.Rectangle;
-
-/**
- * The root of a Flow hierarchy. A flow page can be treated as a normal figure,
- * but contains FlowFigures.
- * <P>
- * A FlowPage will not have a defined width unless it is inside a figure whose
- * layout provides width hints when calling
- * {@link org.eclipse.draw2d.IFigure#getPreferredSize(int, int)}.
- * <P>
- * WARNING: This class is not intended to be subclassed by clients.
- */
-public class FlowPage extends BlockFlow {
-
-	private Dimension _pageSize = new Dimension();
-
-	private int _recommendedWidth;
-
-	private int _pageSizeCacheKeys[] = new int[4];
-
-	private Dimension _pageSizeCacheValues[] = new Dimension[4];
-
-	/**
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.BlockFlow#createDefaultFlowLayout()
-	 */
-	protected FlowFigureLayout createDefaultFlowLayout() {
-		return new PageFlowLayout(this);
-	}
-
-	/**
-	 * @see org.eclipse.draw2d.Figure#getMinimumSize()
-	 */
-	public Dimension getMinimumSize(int w, int h) {
-		return getPreferredSize(w, h);
-	}
-
-	/**
-	 * @see org.eclipse.draw2d.Figure#invalidate()
-	 */
-	public void invalidate() {
-		_pageSizeCacheValues = new Dimension[4];
-		super.invalidate();
-	}
-
-	/**
-	 * @see org.eclipse.draw2d.Figure#getPreferredSize(int, int)
-	 */
-	public Dimension getPreferredSize(int width, int h) {
-		if (width >= 0)
-			width = Math.max(0, width - getInsets().getWidth());
-
-		for (int i = 0; i < 4; i++) {
-			if (_pageSizeCacheKeys[i] == width
-					&& _pageSizeCacheValues[i] != null)
-				return _pageSizeCacheValues[i];
-		}
-
-		_pageSizeCacheKeys[3] = _pageSizeCacheKeys[2];
-		_pageSizeCacheKeys[2] = _pageSizeCacheKeys[1];
-		_pageSizeCacheKeys[1] = _pageSizeCacheKeys[0];
-		_pageSizeCacheKeys[0] = width;
-
-		_pageSizeCacheValues[3] = _pageSizeCacheValues[2];
-		_pageSizeCacheValues[2] = _pageSizeCacheValues[1];
-		_pageSizeCacheValues[1] = _pageSizeCacheValues[0];
-
-		// Flowpage must temporarily layout to determine its preferred size
-		int oldWidth = getRecommendedWidth();
-		setRecommendedWidth(width);
-		validate();
-		_pageSizeCacheValues[0] = _pageSize.getExpanded(getInsets().getWidth(),
-				getInsets().getHeight());
-
-		if (width != oldWidth) {
-			setRecommendedWidth(oldWidth);
-			getUpdateManager().addInvalidFigure(this);
-		}
-		return _pageSizeCacheValues[0];
-	}
-
-	int getRecommendedWidth() {
-		return _recommendedWidth;
-	}
-
-	/**
-	 * @see BlockFlow#postValidate()
-	 */
-	public void postValidate() {
-		Rectangle r = getBlockBox().toRectangle();
-		_pageSize.width = r.width;
-		_pageSize.height = r.height;
-		for (final Iterator it = getChildren().iterator(); it.hasNext();)
-        {
-            ((FlowFigure)it.next()).postValidate();            
-        }
-	}
-
-	/**
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowFigure#setBounds(Rectangle)
-	 */
-	public void setBounds(Rectangle r) {
-		if (getBounds().equals(r))
-			return;
-		boolean invalidate = getBounds().width != r.width
-				|| getBounds().height != r.height;
-		super.setBounds(r);
-		int newWidth = r.width - getInsets().getWidth();
-		if (invalidate || getRecommendedWidth() != newWidth) {
-			setRecommendedWidth(newWidth);
-			getUpdateManager().addInvalidFigure(this);
-		}
-	}
-
-	private void setRecommendedWidth(int width) {
-		if (_recommendedWidth == width)
-			return;
-		_recommendedWidth = width;
-		super.invalidate();
-	}
-
-	/**
-	 * @see org.eclipse.draw2d.Figure#validate()
-	 */
-	public void validate() {
-		if (isValid())
-			return;
-		super.validate();
-		postValidate();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.Figure#setValid(boolean)
-	 */
-	public void setValid(boolean value) {
-		super.setValid(value);
-	}
-
-	public Insets getInsets() {
-		return new Insets(8);
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/FlowUtilities.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/FlowUtilities.java
deleted file mode 100644
index 6cd9e19..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/FlowUtilities.java
+++ /dev/null
@@ -1,271 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-import java.text.BreakIterator;
-
-import org.eclipse.draw2d.FigureUtilities;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.FontMetrics;
-
-/**
- * Utility class for FlowFigures.
- * 
- */
-public final class FlowUtilities extends FigureUtilities {
-	/**
-	 * Returns the number of characters from the specified String that will fit
-	 * in the available amount of space. An average character width can be
-	 * provided as a hint for faster calculation.
-	 * 
-	 * @param frag
-	 *            the TextFragmentBox
-	 * @param string
-	 *            the String
-	 * @param font
-	 *            the Font used for measuring
-	 * @param availableWidth
-	 *            the available width in pixels
-	 * @param avg
-	 *            0.0, or an avg character width to use during calculation
-	 * @param wrapping
-	 *            the word wrap style
-	 * @return the number of characters that will fit in the space
-	 */
-	public static int setupFragmentBasedOnTextSpace(TextFragmentBox frag,
-			String string, Font font, int availableWidth, float avg,
-			int wrapping) {
-		int result = getTextForSpace(string, font, availableWidth, avg,
-				wrapping);
-		frag._length = result;
-		setupFragment(frag, font, string);
-		return result;
-	}
-
-	/**
-	 * given the text string, font and available width and wrapping mode.
-	 * Calculate how much text can fit into.
-	 * 
-	 * @param string
-	 * @param font
-	 * @param availableWidth
-	 * @param avg
-	 * @param wrapping
-	 * @return how much text can fit into
-	 */
-	public static int getTextForSpace(String string, Font font,
-			int availableWidth, float avg, int wrapping) {
-		if (string.length() == 0) {
-			return 0;
-		}
-
-		FontMetrics metrics = getFontMetrics(font);
-		BreakIterator breakItr = BreakIterator.getLineInstance();
-		breakItr.setText(string);
-		int MIN, min, max;
-		if (avg == 0.0) {
-			avg = metrics.getAverageCharWidth();
-		}
-
-		int firstBreak = breakItr.next();
-
-		int winNL = string.indexOf("\r\n"); //$NON-NLS-1$
-		int macNL = string.indexOf('\r');
-		int unixNL = string.indexOf('\n');
-
-		MIN = min = (wrapping == CSSTextLayout.WORD_WRAP_HARD) ? firstBreak : 1;
-		if (macNL == winNL) {
-			macNL = -1; // If the Mac newline is just the prefix to the win NL,
-			// ignore it
-		}
-
-		max = string.length() + 1;
-
-		if (winNL != -1) {
-			max = Math.min(max, winNL);
-			min = Math.min(min, winNL);
-		}
-		if (unixNL != -1) {
-			max = Math.min(max, unixNL);
-			min = Math.min(min, unixNL);
-		}
-		if (macNL != -1) {
-			max = Math.min(max, macNL);
-			min = Math.min(min, macNL);
-		}
-
-		int origMax = max;
-		// The size of the current guess
-		int guess = 0, guessSize = 0;
-
-		while ((max - min) > 1) {
-			// Pick a new guess size
-			// New guess is the last guess plus the missing width in pixels
-			// divided by the average character size in pixels
-			guess = guess + (int) ((availableWidth - guessSize) / avg);
-
-			if (guess >= max) {
-				guess = max - 1;
-			}
-			if (guess <= min) {
-				guess = min + 1;
-			}
-
-			// Measure the current guess
-			guessSize = getStringExtents2(string.substring(0, guess), font).width;
-
-			if (guessSize <= availableWidth) {
-				// We did not use the available width
-				min = guess;
-			} else {
-				// We exceeded the available width
-				max = guess;
-			}
-		}
-
-		int result = string.length();
-		switch (wrapping) {
-		case CSSTextLayout.WORD_WRAP_HARD:
-			if (min == string.length() || min == winNL || min == unixNL
-					|| min == macNL) {
-				result = min;
-			} else if (max == origMax
-					&& getStringExtents2(string.substring(0, max), font).width <= availableWidth) {
-				result = max;
-			} else {
-				result = Math.max(MIN, breakItr.preceding(Math.min(max, string
-						.length() - 1)));
-			}
-			break;
-
-		case CSSTextLayout.WORD_WRAP_SOFT:
-			if (min == string.length() || min == winNL || min == unixNL
-					|| min == macNL) {
-				result = min;
-			} else if (max == origMax
-					&& getStringExtents2(string.substring(0, max), font).width <= availableWidth) {
-				result = max;
-			} else if (breakItr.isBoundary(min)) {
-				result = min;
-			} else if (breakItr.isBoundary(Math.min(max, string.length() - 1))) {
-				result = max;
-			} else {
-				result = breakItr.preceding(Math.min(max, string.length() - 1));
-			}
-			if (result <= 0) {
-				result = min;
-			}
-			break;
-		// case CSSTextLayout.WORD_WRAP_TRUNCATE:
-		// if (min == string.length() || min == winNL || min == unixNL || min ==
-		// macNL)
-		// {
-		// result = frag._length = min;
-		// setupFragment(frag, font, string);
-		// if (frag.getWidth() <= availableWidth)
-		// return result;
-		// min -= 1;
-		// }
-		// else if (max == origMax && getStringExtents(string.substring(0, max),
-		// font).width <= availableWidth)
-		// {
-		// result = frag._length = max;
-		// setupFragment(frag, font, string);
-		// return result;
-		// }
-		// result = breakItr.preceding(Math.min(max + 1, string.length() - 1));
-		// if (result <= 0)
-		// {
-		// ELLIPSIS_SIZE =
-		// FigureUtilities.getStringExtents(CSSTextFigure.ELLIPSIS, font);
-		// getTextForSpace(frag, string, font, availableWidth -
-		// ELLIPSIS_SIZE.width, avg, CSSTextLayout.WORD_WRAP_SOFT);
-		// //frag.length = min;
-		// frag._truncated = true;
-		// result = breakItr.following(min);
-		// if (result == BreakIterator.DONE)
-		// result = string.length();
-		// }
-		// else
-		// {
-		// frag._length = result;
-		// }
-		}
-
-		return result;
-	}
-
-	/**
-	 * @param string
-	 * @param font
-	 * @param availableWidth
-	 * @param avg
-	 * @return the text width
-	 */
-	public static int getTextInWidth(String string, Font font,
-			int availableWidth, float avg) {
-		if (string.length() == 0) {
-			return 0;
-		}
-		int guess = 0;
-		while (true) {
-			Dimension a = getTextExtents(string.substring(0, guess), font);
-			if (a.width >= availableWidth) {
-				return guess;
-			}
-			guess++;
-			if (guess == string.length()) {
-				return guess;
-			}
-		}
-	}
-
-	/**
-	 * change the parent implementation of getStringExtents(). Don't expend the
-	 * 1 width. So empty string will not have any width.
-	 * 
-	 * @param s
-	 * @param f
-	 * @return the dimension
-	 */
-	public static Dimension getStringExtents2(String s, Font f) {
-		return new Dimension(getStringDimension(s, f));
-	}
-
-	static void setupFragment(TextFragmentBox frag, Font f, String s) {
-		// if (frag.length != s.length())
-		// we don't skip whitespace here. since already truncated in
-		// CSSTextLayout
-
-		// while (frag.length > 0 &&
-		// Character.isElementContentWhitespace(s.charAt(frag.length - 1)))
-		// frag.length--;
-		frag.setTextData(s.substring(0, frag._length));
-		Dimension d = getStringExtents2(s.substring(0, frag._length), f);
-		FontMetrics fm = getFontMetrics(f);
-		frag.setHeight(fm.getHeight());
-		frag.setAscent(fm.getAscent() + fm.getLeading());
-		if (frag._length > 0
-				&& Character.isWhitespace(s.charAt(frag._length - 1))) {
-			frag._isLastCharWhitespace = true;
-		} else {
-			frag._isLastCharWhitespace = false;
-		}
-		frag.setWidth(d.width);
-	}
-
-	private FlowUtilities()
-	{
-	    // no instantiation
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/ICSSFigure.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/ICSSFigure.java
deleted file mode 100644
index cecf650..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/ICSSFigure.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-import java.util.List;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-
-/**
- * @author mengbo
- */
-public interface ICSSFigure extends IFigure {
-	/**
-	 * get fragments of this figure. Each item of the list will be a FlowBox.
-	 * Note, this method is for read only, caller should not change the returned
-	 * list and items in the returned list.
-	 * 
-	 * @return the list of fragments
-	 */
-	public List getFragmentsForRead();
-
-	/**
-	 * get the CSSStyle of this CSS figure.
-	 * 
-	 * @return the css style
-	 */
-	public ICSSStyle getCSSStyle();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/ICSSLayout.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/ICSSLayout.java
deleted file mode 100644
index f17c54a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/ICSSLayout.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-import org.eclipse.draw2d.LayoutManager;
-
-/**
- * There are several kinds of layout involved. 1. the layout need let the child
- * figures do certain layouting of themselves first, then decide the final
- * result based on child information. 2. the layout could decide the size
- * information of this figure without child information.
- * 
- * @author mengbo
- * @version 1.5
- */
-public interface ICSSLayout extends LayoutManager {
-	/**
-	 * Each ICSSLayout is dedicated to a single CSSFigure.
-	 * 
-	 * @return the figure
-	 */
-	public ICSSFigure getICSSFigure();
-
-	/**
-	 * 
-	 * @return
-	 */
-	// public List getFragmentsForRead();
-	/**
-	 * postValidate the child figures of this CSSFigure. Normally layout fall
-	 * into the first category need implement this method.
-	 */
-	// public void postValidate();
-	/**
-	 * setBounds is called on the CSSFigure. Normally layout fall into the
-	 * second category need implement this method.
-	 * 
-	 * @param rect
-	 * @param invalidate
-	 */
-	// public void setBoundsCalled(Rectangle rect, boolean invalidate);
-	/**
-	 * @return
-	 */
-	// public boolean useLocalCoordinates();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/ICSSPainter.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/ICSSPainter.java
deleted file mode 100644
index 5f83cb8..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/ICSSPainter.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-import org.eclipse.draw2d.Graphics;
-
-/**
- * @author mengbo
- */
-public interface ICSSPainter {
-	/**
-	 * this method is called in the figure's <code>paintFigure</code> method,
-	 * before <code>paintClientArea</code>. So it is called before children.
-	 * Thus, children may override its effects.
-	 * 
-	 * @param g
-	 */
-	public void paintFigure(Graphics g);
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/ICSSPainter2.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/ICSSPainter2.java
deleted file mode 100644
index f93fb84..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/ICSSPainter2.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-import org.eclipse.draw2d.Graphics;
-
-/**
- * If the layout implements this interface, then it will have chance to paint
- * something to override children effect.
- * 
- * @see org.eclipse.jst.pagedesigner.css2.layout.ICSSPainter
- * @see org.eclipse.jst.pagedesigner.css2.layout.CSSFigure
- * 
- * @author mengbo
- * @version 1.5
- */
-public interface ICSSPainter2 {
-	/**
-	 * this method is called after <code>paintClientArea</code>. So it is
-	 * called after children. Thus, it could override some children effects.
-	 * 
-	 * @param g
-	 */
-	public void paintFigurePostClientArea(Graphics g);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/LineBox.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/LineBox.java
deleted file mode 100644
index fcfe8b4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/LineBox.java
+++ /dev/null
@@ -1,424 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-import org.eclipse.jst.pagedesigner.css2.property.VerticalAlignMeta;
-import org.eclipse.jst.pagedesigner.css2.value.Length;
-import org.eclipse.swt.graphics.FontMetrics;
-
-/**
- * A composite box representing a single line. LineBox calculates its ascent and
- * descent from the child boxes it contains. Clients can call
- * {@link #getAscent()} at any time and expect valid
- * values. The child boxes that are added to a line have unspecied locations
- * until {@link #commit()}is called, at which time the child boxes are layed
- * out in left-to-right order, and their baselines are all aligned vertically.
- * 
- */
-public class LineBox extends CompositeBox {
-	private final static int BASELINE = 0;
-
-	private final static int MIDDLE = 1;
-
-	private final static int SUB = 2;
-
-	private final static int SUPER = 3;
-
-	private final static int TEXT_TOP = 4;
-
-	private final static int TEXT_BOTTOM = 5;
-
-	private final static int TOP = 6;
-
-	private final static int BOTTOM = 7;
-
-	private final static int LENGTH = 8;
-
-	private int _ascent = 0;
-
-	private int _descent = 0;
-
-	private int _fontAscent = 0;
-
-	private int _fontDescent = 0;
-
-	private int _fontLeading = 0;
-
-	private Object _horizonalData = null;
-
-	private Object _htmlInitData = null;
-
-	private int _accumlatedWidth = 0;
-
-	/**
-	 * Removes all owned fragments and invalidates this CompositeBox.
-	 */
-	public void clear() {
-		super.clear();
-		_horizonalData = null;
-		_htmlInitData = null;
-	}
-
-	/**
-	 * Committing a LineBox will position its children correctly. All children
-	 * boxes are made to have the same baseline, and are layed out from
-	 * left-to-right.
-	 */
-	public void commit() {
-		int baseline = getBaseline();
-		int xLocation = _x;
-		for (int i = 0; i < _fragments.size(); i++) {
-			FlowBox block = (FlowBox) _fragments.get(i);
-			block._x = xLocation + block.getMarginInsets().left;
-			xLocation = block._x + block._width + block.getMarginInsets().right;
-
-			if (_fragments.size() > 1 && block instanceof TextFragmentBox) {
-				TextFragmentBox textBox = (TextFragmentBox) block;
-				if (textBox.getTextData().length() == 0) {
-					textBox._height = _fontAscent + _fontDescent + _fontLeading;
-					textBox.setAscent(_fontAscent + _fontLeading);
-					block._y = this._y;
-					continue;
-				}
-			}
-
-			switch (getVerticalAlignType(block)) {
-			case TOP:
-				block._y = this._y;
-				break;
-			case BOTTOM:
-				block._y = this.getBaseline() - (block.getHeight() - _descent);
-				break;
-			case MIDDLE:
-				int halfXHeight = getHalfXHeight();
-				block._y = this.getBaseline() - halfXHeight
-						- (block.getHeight() + 1) / 2;
-				break;
-			case TEXT_TOP:
-				block._y = this.getBaseline() - _fontAscent - _fontLeading;
-				break;
-			case TEXT_BOTTOM:
-				block._y = this.getBaseline() - (block._height - _fontDescent);
-				break;
-			case LENGTH:
-				block._y = this.getBaseline() + getIncrement(block);
-				break;
-			case SUPER:
-				block._y = this.getBaseline() - getHalfXHeight() * 2
-						- block._height;
-				break;
-			case SUB:
-				block._y = this.getBaseline() - block._height * _fontLeading
-						/ getFontHeight();
-				break;
-			case BASELINE:
-			default:
-				block.makeBaseline(baseline);
-				break;
-			}
-			if (block instanceof LineBox) {
-				((LineBox) block).commit();
-			}
-		}
-	}
-
-	private int getVerticalAlignType(FlowBox box) {
-		Object data = box.getVerticalAlignData();
-
-		if (data != null) {
-			if (data instanceof Length) {
-				return LENGTH;
-			} else if (VerticalAlignMeta.BASELINE.equals(data)) {
-				return BASELINE;
-			} else if (VerticalAlignMeta.MIDDLE.equals(data)) {
-				return MIDDLE;
-			} else if (VerticalAlignMeta.SUB.equals(data)) {
-				return SUB;
-			} else if (VerticalAlignMeta.SUPER.equals(data)) {
-				return SUPER;
-			} else if (VerticalAlignMeta.TEXT_TOP.equals(data)) {
-				return TEXT_TOP;
-			} else if (VerticalAlignMeta.TEXT_BOTTOM.equals(data)) {
-				return TEXT_BOTTOM;
-			} else if (VerticalAlignMeta.TOP.equals(data)) {
-				return TOP;
-			} else if (VerticalAlignMeta.BOTTOM.equals(data)) {
-				return BOTTOM;
-			}
-			return BASELINE;
-		}
-		return BASELINE;
-	}
-
-	/**
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowBox#getAscent()
-	 */
-	public int getAscent() {
-		// because at initial, ascent is 0. And the linebox
-		// could have some size setting without children. In
-		// that case, we need handle differently.
-		if (_ascent == 0 && _fragments.isEmpty()) {
-			return getHeight();
-		}
-		return _ascent;
-	}
-
-	/**
-	 * Returns the width available to child fragments.
-	 * 
-	 * @return the width in pixels
-	 */
-	public int getAvailableWidth() {
-		if (_recommendedWidth < 0) {
-			return Integer.MAX_VALUE;
-		}
-		int availableWidth = _recommendedWidth - _accumlatedWidth;
-		if (availableWidth < 0) {
-			availableWidth = 0;
-		}
-		return availableWidth;
-	}
-
-	/**
-	 * Returns the baseline of this LineBox, which is the y value plus the
-	 * ascent.
-	 * 
-	 * @return the baseline value.
-	 */
-	public int getBaseline() {
-		return _y + getAscent();
-	}
-
-	/**
-	 * @see CompositeBox#resetInfo()
-	 */
-	protected void resetInfo() {
-		super.resetInfo();
-		_accumlatedWidth = 0;
-		_ascent = 0;
-	}
-
-	/**
-	 * @see CompositeBox#unionInfo(FlowBox)
-	 */
-	protected void unionInfo(FlowBox blockInfo) {
-		if (blockInfo instanceof TextFragmentBox) {
-			if (((TextFragmentBox) blockInfo).getTextData().length() == 0) {
-				return;
-			}
-		}
-
-		if (_fragments == null || _fragments.isEmpty()) {
-			this._ascent = 0;
-			this._descent = 0;
-			this._height = 0;
-		}
-
-		int valign = getVerticalAlignType(blockInfo);
-
-		if (valign == BASELINE) {
-			_ascent = Math.max(_ascent, blockInfo.getAscent());
-			if (blockInfo instanceof WidgetBox) {
-				_descent = 0;
-			} else {
-				_descent = Math.max(_descent, blockInfo.getDescent());
-			}
-			_height = Math.max(_height, _ascent + _descent);
-		} else if (valign == MIDDLE) {
-			int halfXHeight = getHalfXHeight();
-			_ascent = Math.max(_ascent, (blockInfo.getHeight() + 1) / 2
-					+ halfXHeight);
-			_descent = Math.max(_descent, blockInfo.getHeight() / 2
-					- halfXHeight);
-			_height = Math.max(_height, _ascent + _descent);
-		} else if (valign == TEXT_TOP) {
-			_ascent = Math.max(_ascent, _fontAscent + _fontLeading);
-			_descent = Math.max(_descent, blockInfo.getHeight() - _fontAscent
-					- _fontLeading);
-			_height = Math.max(_height, _ascent + _descent);
-		} else if (valign == TEXT_BOTTOM) {
-			_ascent = Math.max(_ascent, blockInfo.getHeight() - _fontDescent);
-			_descent = Math.max(_descent, _fontDescent);
-			_height = Math.max(_height, _ascent + _descent);
-		} else if (valign == SUB) {
-			int blockTop = blockInfo._height * _fontLeading / getFontHeight();
-			_ascent = Math.max(_ascent, blockTop);
-			_descent = Math.max(_descent, blockInfo.getHeight() - blockTop);
-			_height = Math.max(_height, _ascent + _descent);
-		} else if (valign == SUPER) {
-			int blockTop = blockInfo._height;
-			_ascent = Math.max(_ascent, getHalfXHeight() * 2 + blockTop);
-			_height = Math.max(_height, _ascent + _descent);
-		} else if (valign == LENGTH) {
-			int increment = getIncrement(blockInfo);
-			_ascent = Math.max(_ascent, blockInfo.getAscent() + increment);
-			_descent = Math.max(_descent, blockInfo.getDescent() - increment);
-			_height = Math.max(_height, _ascent + _descent);
-		} else if (valign == TOP) {
-			_descent = Math.max(_descent, blockInfo.getHeight() - _ascent);
-			_height = Math.max(_height, _ascent + _descent);
-		} else if (valign == BOTTOM) {
-			// XXX:the render of IE is not consistent with spec, mozilla is. so
-			// we follow mozilla's implementation.
-			_ascent = Math.max(_ascent, blockInfo.getHeight() - _descent);
-			_height = Math.max(_height, _ascent + _descent);
-		} else {
-			_ascent = Math.max(_ascent, blockInfo.getAscent());
-			_descent = Math.max(_descent, blockInfo.getDescent());
-			_height = Math.max(_height, blockInfo.getHeight());
-		}
-
-		_accumlatedWidth += blockInfo._width
-				+ blockInfo.getMarginInsets().getWidth();
-		if (_accumlatedWidth > _width) {
-			_width = _accumlatedWidth;
-		}
-	}
-
-	private int getIncrement(FlowBox blockInfo) {
-		int valign = getVerticalAlignType(blockInfo);
-		if (valign == LENGTH) {
-			int increment = 0;
-			Length length = (Length) blockInfo.getVerticalAlignData();
-			if (length.isPercentage()) {
-				increment = length.getValue() * getFontHeight() / 100;
-			} else {
-				increment = length.getValue();
-			}
-			return increment;
-		}
-		return 0;
-	}
-
-	/**
-	 * @return true if is occupied
-	 * @see org.eclipse.draw2d.geometry.Rectangle#isEmpty()
-	 */
-	public boolean isOccupied() {
-		if (_width > 0) {
-			return true;
-		}
-
-		if (_fragments.isEmpty()) {
-			return false;
-		}
-		// int size = _fragments.size();
-		// if (size > 1)
-		// {
-		// return true;
-		// }
-		// ok, we have one segment
-		// FlowBox box = (FlowBox) _fragments.get(0);
-		// if (box instanceof TextFragmentBox)
-		// {
-		// if (((TextFragmentBox) box).getTextData().length() == 0)
-		// {
-		// // this is an empty string text box.
-		// return false;
-		// }
-		// }
-		return true;
-	}
-
-	/**
-	 * @return true if is empty string line
-	 */
-	public boolean isEmptyStringLine() {
-		// if(this.getWidth() == 0)
-		// {
-		// return true;
-		// }
-		// else
-		// {
-		// return false;
-		// }
-		if (_fragments.size() == 1) {
-			FlowBox box = (FlowBox) _fragments.get(0);
-			if (box instanceof TextFragmentBox) {
-				if (box instanceof TextFragmentBox) {
-					if (((TextFragmentBox) box).getTextData().length() == 0) {
-						return true;
-					}
-				}
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * @param fontMetrics
-	 */
-	public void setFontMetrics(FontMetrics fontMetrics) {
-		if (fontMetrics != null) {
-			_fontAscent = fontMetrics.getAscent();
-			_fontDescent = fontMetrics.getDescent();
-			_fontLeading = fontMetrics.getLeading();
-			// if (_fragments == null || _fragments.isEmpty())
-			// {
-			// this._ascent = _fontAscent + _fontLeading;
-			// this._descent = _fontDescent;
-			// if (this._height < this._ascent + this._descent)
-			// {
-			// this._height = this._ascent + this._descent;
-			// }
-			// }
-		} else {
-			_fontAscent = 0;
-			_fontDescent = 0;
-			_fontLeading = 0;
-		}
-	}
-
-	private int getHalfXHeight() {
-		return (_fontAscent + _fontDescent + _fontLeading) / 5;
-	}
-
-	private int getFontHeight() {
-		return _fontAscent + _fontDescent + _fontLeading;
-	}
-
-	/**
-	 * @return Returns the horizonalData.
-	 */
-	public Object getHorizonalData() {
-		return _horizonalData;
-	}
-
-	/**
-	 * @param horizonalData
-	 *            The horizonalData to set.
-	 */
-	public void setHorizonalData(Object horizonalData) {
-		this._horizonalData = horizonalData;
-	}
-
-	/**
-	 * @return Returns the htmlInitData.
-	 */
-	public Object getHtmlInitData() {
-		return _htmlInitData;
-	}
-
-	/**
-	 * @param htmlInitData
-	 *            The htmlInitData to set.
-	 */
-	public void setHtmlInitData(Object htmlInitData) {
-		this._htmlInitData = htmlInitData;
-	}
-
-    @Override
-    public void setY(int y) {
-        // make set y public
-        super.setY(y);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/MultiLineLabel.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/MultiLineLabel.java
deleted file mode 100644
index e49872c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/MultiLineLabel.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-import org.eclipse.draw2d.FigureUtilities;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.Label;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.FontMetrics;
-
-/**
- * A multi-line label
- *
- */
-public class MultiLineLabel extends Label {
-	private static String ELLIPSIS = "..."; //$NON-NLS-1$
-
-	protected void paintFigure(Graphics graphics) {
-		if (isOpaque()) {
-			graphics.fillRectangle(getBounds());
-		}
-		Rectangle bounds1 = getBounds();
-		graphics.translate(bounds1.x, bounds1.y);
-		drawText(graphics);
-		graphics.translate(-bounds1.x, -bounds1.y);
-	}
-
-	private void drawText(Graphics graphics) {
-		String[] strings = splitString(getText());
-		int y = 0;
-		int lineHeight = FigureUtilities.getFontMetrics(getFont()).getHeight();
-		for (int i = 0; i < strings.length; i++) {
-			graphics.drawText(getSubStringText(strings[i]), 0, y);
-			y += lineHeight;
-		}
-
-	}
-
-	private String[] splitString(String text) {
-		String[] lines = new String[1];
-		int start = 0, pos;
-		do {
-			pos = text.indexOf('\n', start);
-			if (pos == -1) {
-				lines[lines.length - 1] = text.substring(start);
-			} else {
-				boolean crlf = (pos > 0) && (text.charAt(pos - 1) == '\r');
-				lines[lines.length - 1] = text.substring(start, pos
-						- (crlf ? 1 : 0));
-				start = pos + 1;
-				String[] newLines = new String[lines.length + 1];
-				System.arraycopy(lines, 0, newLines, 0, lines.length);
-				lines = newLines;
-			}
-		} while (pos != -1);
-		return lines;
-	}
-
-	/**
-	 * @param text
-	 * @return the substring text
-	 */
-	private String getSubStringText(String text) {
-		String subStringText = text;
-
-		Font currentFont = getFont();
-		int textWidth = FigureUtilities.getTextWidth(text, currentFont);
-		if (textWidth - getSize().width <= 0) {
-			return subStringText;
-		}
-
-		Dimension effectiveSize = new Dimension(getSize().width, 0);
-
-		int dotsWidth = FigureUtilities.getTextWidth(ELLIPSIS, currentFont);
-
-		if (effectiveSize.width < dotsWidth) {
-			effectiveSize.width = dotsWidth;
-		}
-
-		int subStringLength = getLargestSubstringConfinedTo(text, currentFont,
-				effectiveSize.width - dotsWidth);
-		subStringText = new String(text.substring(0, subStringLength)
-				+ ELLIPSIS);
-		return subStringText;
-	}
-
-	int getLargestSubstringConfinedTo(String s, Font f, int availableWidth) {
-		FontMetrics metrics = FigureUtilities.getFontMetrics(f);
-		int min, max;
-		float avg = metrics.getAverageCharWidth();
-		min = 0;
-		max = s.length() + 1;
-
-		// The size of the current guess
-		int guess = 0, guessSize = 0;
-		while ((max - min) > 1) {
-			// Pick a new guess size
-			// New guess is the last guess plus the missing width in pixels
-			// divided by the average character size in pixels
-			guess = guess + (int) ((availableWidth - guessSize) / avg);
-
-			if (guess >= max) {
-				guess = max - 1;
-			}
-			if (guess <= min) {
-				guess = min + 1;
-			}
-
-			// Measure the current guess
-			guessSize = FigureUtilities
-					.getTextExtents(s.substring(0, guess), f).width;
-
-			if (guessSize < availableWidth) {
-				// We did not use the available width
-				min = guess;
-			} else {
-				// We exceeded the available width
-				max = guess;
-			}
-		}
-		return min;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/PageFlowLayout.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/PageFlowLayout.java
deleted file mode 100644
index 33ff6a1..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/PageFlowLayout.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-import org.eclipse.draw2d.FigureUtilities;
-import org.eclipse.jst.pagedesigner.css2.font.CSSFont;
-import org.eclipse.jst.pagedesigner.css2.font.CSSFontManager;
-import org.eclipse.swt.graphics.Font;
-
-/**
- * A block layout which requires no FlowContext to perform its layout. This
- * class is used by {@link FlowPage}.
- * <p>
- * WARNING: This class is not intended to be subclassed by clients.
- */
-public class PageFlowLayout extends BlockFlowLayout {
-
-	/**
-	 * Creates a new PageFlowLayout with the given FlowPage
-	 * 
-	 * @param page
-	 *            the FlowPage
-	 */
-	public PageFlowLayout(FlowPage page) {
-		super(page);
-	}
-
-	/**
-	 * @see BlockFlowLayout#endBlock()
-	 */
-	protected void endBlock() {
-        // do nothing
-	}
-
-	/**
-	 * 
-	 */
-	public void postValidate() {
-       // TODO: This method is not being called.
-	}
-
-	protected void setupLine(LineBox line, int topMargin) {
-		super.setupLine(line, topMargin);
-
-		CSSFontManager fontManager = CSSFontManager.getInstance();
-		Font font = fontManager.getSwtFont((CSSFont) fontManager
-				.createDefaultFont());
-		line.setFontMetrics(FigureUtilities.getFontMetrics(font));
-	}
-
-	/**
-	 * Setup blockBox to the initial bounds of the Page
-	 */
-	protected void setupBlock() {
-		// Remove all current Fragments
-		_blockBox.clear();
-
-		// Setup the one fragment for this Block with the correct X and
-		// available width
-		_blockBox.setRecommendedWidth(((FlowPage) getFlowFigure())
-				.getRecommendedWidth());
-		_blockBox._x = 0;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/TextFragmentBox.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/TextFragmentBox.java
deleted file mode 100644
index 58776e4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/TextFragmentBox.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-/**
- * A Geometric object for representing a TextFragment region on a line of Text.
- */
-public class TextFragmentBox extends FlowBox {
-
-	/** The offset in pixels * */
-	public int _offset;
-
-	/** The length in pixels * */
-	public int _length;
-
-	private int _ascent;
-
-	// boolean _truncated;
-
-	/*package*/ boolean _isLastCharWhitespace = false;
-
-	private String _textData;
-
-	/**
-	 * Creates a new TextFragmentBox
-	 */
-	public TextFragmentBox() {
-        // do nothgin
-	}
-
-	/**
-	 * Returns the ascent of this TextFragmentBox
-	 * 
-	 * @return the ascent
-	 */
-	public int getAscent() {
-		return _ascent;
-	}
-
-	/**
-	 * Sets the ascent of this TextFragmentBox to the given value
-	 * 
-	 * @param a
-	 *            the ascent
-	 */
-	public void setAscent(int a) {
-		_ascent = a;
-	}
-
-	/**
-	 * Sets the height of this TextFragmentBox to the given value
-	 * 
-	 * @param h
-	 *            the height
-	 */
-	public void setHeight(int h) {
-		_height = h;
-	}
-
-	/**
-	 * Sets the width of this TextFragmentBox to the given value
-	 * 
-	 * @param w
-	 *            the width
-	 */
-	public void setWidth(int w) {
-		_width = w;
-	}
-
-	/**
-	 * @return the text data
-	 */
-	public String getTextData() {
-		return _textData;
-	}
-
-	/**
-	 * @param txt
-	 */
-	public void setTextData(String txt) {
-		_textData = txt;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/TextLayoutSupport.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/TextLayoutSupport.java
deleted file mode 100644
index 7b31c90..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/TextLayoutSupport.java
+++ /dev/null
@@ -1,427 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-import java.util.List;
-
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.css2.property.TextDecorationMeta;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-
-/**
- * @author mengbo
- */
-public class TextLayoutSupport {
-	private static final Logger _log = PDPlugin
-			.getLogger(TextLayoutSupport.class);
-
-	private static final String[] DELIMITERS = { "\r\n", //$NON-NLS-1$
-			"\n", //$NON-NLS-1$
-			"\r" //$NON-NLS-1$
-	};
-
-	static private int delimeterLength;
-
-	/**
-	 * Reuses an existing <code>TextFragmentBox</code>, or creates a new one.
-	 * 
-	 * @param i
-	 *            the index
-	 * @param fragments
-	 *            the original list of fragments
-	 * @return a TextFragmentBox
-	 */
-	// copied from TextLayout
-	protected static TextFragmentBox getFragment(int i, List fragments) {
-		if (fragments.size() > i) {
-			return (TextFragmentBox) fragments.get(i);
-		}
-		TextFragmentBox box = new TextFragmentBox();
-		fragments.add(box);
-		return box;
-	}
-
-	/**
-	 * Returns the average character width of given TextFragmentbox
-	 * 
-	 * @param fragment
-	 *            the TextFragmentBox
-	 * @return the average character width
-	 */
-	public static float getAverageCharWidth(TextFragmentBox fragment) {
-		if (fragment._width != 0 && fragment._length != 0) {
-			return fragment._width / (float) fragment._length;
-		}
-		return 0.0f;
-	}
-
-	// ----------------------------------------------------------------------------------------
-	/**
-	 * this method will create a set of TextFragment. Each fragment will offset
-	 * to the original text (whole text for the text figure).
-	 * @param context 
-	 * @param text 
-	 * @param fragments 
-	 * @param font 
-	 * @param wrappingStyle 
-	 * @param trimLeading 
-	 */
-	public static void layoutNormal(FlowContext context, String text,
-			List fragments, Font font, int wrappingStyle, boolean trimLeading) {
-		int i = 0; // The index of the current fragment;
-		int offset = 0;
-		if (trimLeading) {
-			offset = 1;
-			text = text.substring(1);
-		}
-
-		int length = 0; // The length of the current fragment
-		float prevAvgCharWidth;
-		LineBox currentLine;
-		TextFragmentBox fragment;
-
-		while (text.length() > 0) {
-			fragment = null;
-			prevAvgCharWidth = 0f;
-			fragment = getFragment(i, fragments);
-			prevAvgCharWidth = getAverageCharWidth(fragment);
-
-			// Check for newline, if it exists, call context.endLine and skip
-			// over the newline
-			// Exccept for first time through, don't do this.
-			if (i != 0) {
-				boolean changed = false;
-				if (text.charAt(0) == '\r') {
-					text = text.substring(1);
-					changed = true;
-					offset += 1;
-				}
-				if (text.length() != 0 && text.charAt(0) == '\n') {
-					text = text.substring(1);
-					changed = true;
-					offset += 1;
-				}
-				if (changed) {
-					context.endLine();
-				}
-			}
-
-			fragment._offset = offset;
-
-			// This loop is done at most twice.
-			// The second time through, a context.endLine()
-			// was requested, and the loop will break.
-			while (true) {
-				currentLine = context.getCurrentLine();
-				length = FlowUtilities.setupFragmentBasedOnTextSpace(fragment,
-						text, font, currentLine.getAvailableWidth(),
-						prevAvgCharWidth, wrappingStyle);
-
-				if (fragment._width <= currentLine.getAvailableWidth()
-						|| !context.isCurrentLineOccupied()) {
-					break;
-				}
-				context.endLine();
-			}
-			// fragment.x = context.getCurrentX();
-			context.addToCurrentLine(fragment);
-			text = text.substring(length);
-			offset += length;
-			if (text.length() > 0) {
-				context.endLine();
-			}
-			i++;
-		}
-
-		// Remove the remaining unused fragments.
-		while (i < fragments.size()) {
-			fragments.remove(fragments.size() - 1);
-		}
-	}
-
-	/**
-	 * @param context
-	 * @param text
-	 * @param fragments
-	 * @param font
-	 */
-	public static void layoutNoWrap(FlowContext context, String text,
-			List fragments, Font font) {
-		TextFragmentBox fragment;
-		int i = 0;
-		int offset = 0;
-
-		while (offset < text.length()) {
-			int result = nextLineBreak(text, offset);
-			fragment = getFragment(i++, fragments);
-			fragment._length = result - offset;
-			fragment._offset = offset;
-			FlowUtilities.setupFragment(fragment, font, text.substring(offset));
-			context.getCurrentLine().add(fragment);
-			offset = result + delimeterLength;
-			if (delimeterLength != 0) {
-				// in nextLineBreak we fo
-				context.endLine();
-			}
-
-		}
-		// Remove the remaining unused fragments.
-		while (i < fragments.size()) {
-			fragments.remove(i++);
-		}
-	}
-
-	private static int nextLineBreak(String text, int offset) {
-		int result = text.length();
-		delimeterLength = 0;
-		int current;
-		for (int i = 0; i < DELIMITERS.length; i++) {
-			current = text.indexOf(DELIMITERS[i], offset);
-			if (current != -1 && current < result) {
-				result = current;
-				delimeterLength = DELIMITERS[i].length();
-			}
-		}
-		return result;
-	}
-
-	/**
-	 * @param g
-	 * @param fragments
-	 * @param font
-	 * @param textDecoration
-	 */
-	public static void paintTextFigure(Graphics g, List fragments, Font font,
-			int textDecoration) {
-		paintTextFigure(g, fragments, font, null, textDecoration);
-	}
-
-	/**
-	 * @param g
-	 * @param rect
-	 * @param textDecoration
-	 */
-	public static void paintTextDecoration(Graphics g, Rectangle rect,
-			int textDecoration) {
-		if ((textDecoration & TextDecorationMeta.UNDERLINE) != 0) {
-			g.drawLine(rect.x, rect.y + rect.height - 1, rect.x + rect.width
-					- 1, rect.y + rect.height - 1);
-		}
-		if ((textDecoration & TextDecorationMeta.OVERLINE) != 0) {
-			g.drawLine(rect.x, rect.y + 1, rect.x + rect.width - 1, rect.y + 1);
-		}
-		if ((textDecoration & TextDecorationMeta.LINETHROUGH) != 0) {
-			g.drawLine(rect.x, rect.y + rect.height / 2, rect.x + rect.width
-					- 1, rect.y + rect.height / 2);
-		}
-	}
-
-	/**
-	 * @param g
-	 * @param fragments
-	 * @param font
-	 * @param color
-	 * @param textDecoration
-	 */
-	public static void paintTextFigure(Graphics g, List fragments, Font font,
-			Color color, int textDecoration) {
-		// FIXME: It happens there is problem in this method's parameters. what
-		// exception should be catched?
-		try {
-			TextFragmentBox frag;
-			// XXX: adjust font. Here is not using setFont(), because that will
-			// result in revalidate
-			g.setFont(font);
-
-			for (int i = 0; i < fragments.size(); i++) {
-				frag = (TextFragmentBox) fragments.get(i);
-				// if (!g.getClip(Rectangle.SINGLETON).intersects(frag))
-				// continue;
-				String draw;
-				draw = frag.getTextData();
-
-				if (color != null) {
-					g.setForegroundColor(color);
-				}
-				g.drawText(draw, frag._x, frag._y);
-				if ((textDecoration & TextDecorationMeta.UNDERLINE) != 0) {
-					g.drawLine(frag._x, frag._y + frag.getHeight() - 1, frag._x
-							+ frag.getWidth(), frag._y + frag.getHeight() - 1);
-				}
-				if ((textDecoration & TextDecorationMeta.OVERLINE) != 0) {
-					g.drawLine(frag._x, frag._y, frag._x + frag.getWidth(),
-							frag._y);
-				}
-				if ((textDecoration & TextDecorationMeta.LINETHROUGH) != 0) {
-					g.drawLine(frag._x, frag._y + frag.getHeight() / 2, frag._x
-							+ frag.getWidth(), frag._y + frag.getHeight() / 2);
-				}
-
-				if (Debug.DEBUG_BASELINE) {
-					g.drawLine(frag._x, frag._y + frag.getAscent(), frag._x
-							+ frag.getWidth(), frag._y + frag.getAscent());
-				}
-			}
-		} catch (Exception e) {
-			// "Error in text painting:"
-			_log.info("TextLayoutSupport.Info.1", e); //$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * 
-	 * @param g
-	 * @param fragments
-	 * @param text
-	 *            all the text in the Text figure.
-	 * @param font
-	 * @param color
-	 * @param textDecoration
-	 * @param start
-	 * @param end
-	 * @param selectionForeColor
-	 * @param selectionBackColor
-	 */
-	public static void paintTextFigureWithSelection(Graphics g, List fragments,
-			String text, Font font, Color color, int textDecoration, int start,
-			int end, Color selectionForeColor, Color selectionBackColor) {
-		// FIXME: It happens there is problem in this method's parameters. what
-		// exception should be catched?
-		try {
-			TextFragmentBox frag;
-
-			Color originalForeground = g.getForegroundColor();
-			Color originalBackgroud = g.getBackgroundColor();
-
-			// XXX: adjust font. Here is not using setFont(), because that will
-			// result in revalidate
-			g.setFont(font);
-
-			for (int i = 0, n = fragments.size(); i < n; i++) {
-				frag = (TextFragmentBox) fragments.get(i);
-
-				// to make things simpler, we always draw the line using default
-				// color
-				if (color != null) {
-					g.setForegroundColor(color);
-				}
-
-				// if (!g.getClip(Rectangle.SINGLETON).intersects(frag))
-				// continue;
-				String draw;
-				draw = frag.getTextData();
-				if (frag._offset >= end || frag._offset + frag._length <= start) {
-					// we are not in selection. no need to change color
-					g.drawText(draw, frag._x, frag._y);
-					paintTextDecoration(g, frag.getRectangle(), textDecoration);
-				} else if (frag._offset >= start
-						&& frag._offset + frag._length <= end) {
-					// we are fully in selection
-					g.setForegroundColor(selectionForeColor);
-					g.setBackgroundColor(selectionBackColor);
-					g
-							.fillRectangle(frag._x, frag._y, FlowUtilities
-									.getTextExtents(draw, font).width, frag
-									.getHeight());
-					g.drawText(draw, frag._x, frag._y);
-					paintTextDecoration(g, frag.getRectangle(), textDecoration);
-				} else {
-					// partial of the fragment's text is in selection.
-
-					// draw the original string first
-					g.drawText(draw, frag._x, frag._y);
-					// then override with the selected parts.
-					g.setForegroundColor(selectionForeColor);
-					g.setBackgroundColor(selectionBackColor);
-					int partialStart = frag._offset > start ? frag._offset
-							: start;
-					int partialEnd = (frag._offset + frag._length > end) ? end
-							: (frag._offset + frag._length);
-					int x = 0;
-					String skip = text.substring(frag._offset, partialStart);
-					x = FlowUtilities.getTextExtents(skip, font).width;
-					String todraw = text.substring(partialStart, partialEnd);
-					if (todraw.length() > 0) {
-						Dimension dimension = FlowUtilities.getTextExtents(skip
-								+ todraw, font);
-						g.fillRectangle(frag._x + x, frag._y, dimension.width
-								- x, dimension.height);
-						g.drawText(skip + todraw, frag._x, frag._y);
-						if (color != null) {
-							g.setForegroundColor(color);
-						} else {
-							g.setForegroundColor(originalForeground);
-						}
-						g.drawText(skip, frag._x, frag._y);
-						paintTextDecoration(g, frag.getRectangle(),
-								textDecoration);
-						g.setForegroundColor(selectionForeColor);
-						paintTextDecoration(g,
-								new Rectangle(frag._x + x, frag._y,
-										dimension.width - x, dimension.height),
-								textDecoration);
-					}
-				}
-
-				// we do this in each loop, to make sure we are using correct
-				// color
-				g.setForegroundColor(originalForeground);
-				g.setBackgroundColor(originalBackgroud);
-
-			}
-		} catch (Exception e) {
-			// "Error in text painting:"
-			_log.info("TextLayoutSupport.Info.1", e); //$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * @param textAlign
-	 * @param rect
-	 * @param textWidth
-	 * @return the x value
-	 */
-	public static int getBeginX(Object textAlign, Rectangle rect, int textWidth) {
-		int x = rect.x;
-		if (textAlign != null) {
-			String align = textAlign.toString();
-			if ("left".equalsIgnoreCase(align)) //$NON-NLS-1$
-			{
-				x = rect.x + 1;
-			} else if ("right".equalsIgnoreCase(align)) //$NON-NLS-1$
-			{
-				x = rect.x + rect.width - textWidth - 1;
-				if (x < 1) {
-					x = 1;
-				}
-			} else if ("center".equalsIgnoreCase(align)) //$NON-NLS-1$
-			{
-				int offset = (rect.width - textWidth) / 2;
-				if (offset <= 0) {
-					offset = 0;
-				}
-				x = x + offset + 1;
-			}
-		}
-		return x;
-	}
-	
-	private TextLayoutSupport()
-	{
-	    // no instantiation
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/WidgetBox.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/WidgetBox.java
deleted file mode 100644
index 220d61c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/WidgetBox.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-/**
- * Simple box support ascent.
- * 
- * @author mengbo
- * @version 1.5
- */
-public class WidgetBox extends FlowBox {
-	private int _ascent = -1;
-
-	public int getAscent() {
-		if (_ascent < 0) {
-			return super.getAscent();
-		}
-        return _ascent;
-	}
-
-	/*package*/ void setAscent(int ascent) {
-		_ascent = ascent;
-	}
-
-	/**
-	 * @return true if supports ascent
-	 */
-	public boolean supportAscent() {
-		return _ascent > 0;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/CSSTRGroupLayout.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/CSSTRGroupLayout.java
deleted file mode 100644
index 0a3cd40..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/CSSTRGroupLayout.java
+++ /dev/null
@@ -1,176 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout.table;
-
-import java.util.List;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.LayoutManager;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.jst.pagedesigner.css2.layout.CSSBlockFlowLayout;
-import org.eclipse.jst.pagedesigner.css2.layout.CSSFigure;
-import org.eclipse.jst.pagedesigner.css2.layout.FlowFigure;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class CSSTRGroupLayout extends CSSBlockFlowLayout {
-
-	/**
-	 * @param cssfigure
-	 */
-	public CSSTRGroupLayout(CSSFigure cssfigure) {
-		super(cssfigure);
-	}
-
-	/**
-	 * @return the parent figure of TRGroup should be table figure. If so, return the
-     * corresponding table layout. 
-	 */
-	public CSSTableLayout2 getTableLayoutContext() {
-		IFigure parent = getCSSFigure().getParent();
-		if (parent != null) {
-			LayoutManager parentLayout = parent.getLayoutManager();
-			if (parentLayout instanceof CSSTableLayout2) {
-				return (CSSTableLayout2) parentLayout;
-			}
-		}
-
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.CSSBlockFlowLayout#postValidate()
-	 */
-	public void postValidate() {
-		CSSTableLayout2 tableLayout = getTableLayoutContext();
-		if (tableLayout == null) {
-			super.postValidate();
-		} else {
-			Rectangle r = getTRGroupRect(tableLayout);
-			if (r != null) {
-				_blockBox.setXYWidthHeight(r);
-				getCSSFigure().setBounds(r);
-				List list = getCSSFigure().getChildren();
-				for (int i = 0; i < list.size(); i++) {
-					((FlowFigure) list.get(i)).postValidate();
-				}
-			} else {
-				super.postValidate();
-			}
-		}
-	}
-
-	/**
-	 * @return
-	 */
-	private Rectangle getTRGroupRect(CSSTableLayout2 tableLayout) {
-		TableRowGroupInfo groupinfo = tableLayout.getGroupInfo(this
-				.getCSSFigure());
-		int rowIndex = groupinfo.getRowIndex();
-		int rowCount = groupinfo.getRowCount();
-		int y = (rowIndex + 1) * tableLayout.getVSpacing();
-		for (int k = 0; k < rowIndex; k++) {
-			y += tableLayout.getRowHeights()[k];
-		}
-		if (tableLayout.getCaptionInfo() != null
-				&& "top".equalsIgnoreCase(tableLayout.getCaptionInfo().getAlign())) //$NON-NLS-1$
-		{
-			y += tableLayout.getCaptionSize().height;
-		}
-
-		int height = (rowCount - 1) * tableLayout.getVSpacing();
-		for (int k = 0; k < rowCount; k++) {
-			height += tableLayout.getRowHeights()[rowIndex + k];
-		}
-		//ICSSFigure figure = groupinfo.getFigure();
-		return new Rectangle(tableLayout.getRowX(), y, tableLayout
-				.getRowWidth(), height);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.CSSBlockFlowLayout#useLocalCoordinates()
-	 */
-	public boolean useLocalCoordinates() {
-		// if is in table, we don't use local coordinates.
-		return getTableLayoutContext() == null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.CSSBlockFlowLayout#endBlock()
-	 */
-	protected void endBlock() {
-		if (getTableLayoutContext() == null) {
-			super.endBlock();
-		} else {
-			layoutLines();
-		}
-	}
-
-	// /* (non-Javadoc)
-	// * @see
-	// org.eclipse.jst.pagedesigner.css2.layout.FlowContainerLayout#layout()
-	// */
-	// protected void layout()
-	// {
-	// CSSTableLayout2 tableLayout = getTableLayoutContext();
-	// if (tableLayout == null)
-	// {
-	// // we are not in table? treat as block.
-	// super.layout();
-	// }
-	// else
-	// {
-	// // ok, we are in table. we need to layout our children.
-	// TableRowGroupInfo groupInfo =
-	// tableLayout.getGroupInfo(this.getCSSFigure());
-	// int[] rowHeights = tableLayout.getRowHeights();
-	// int vspacing = tableLayout.getVSpacing();
-	// int rowwidth = getCSSFigure().getBounds().width;// XXX: get from table
-	// layout?
-	// int grouprowindex = groupInfo.getRowIndex();
-	// List rows = groupInfo.getRowList();
-	// for (int i=0, size=rows.size(); i<size; i++)
-	// {
-	// TableRowInfo rowinfo = (TableRowInfo) rows.get(i);
-	// ICSSFigure figure = rowinfo.getFigure();
-	//                
-	// int y = 0;
-	// int rowindex = rowinfo.getRowIndex();
-	// for (int row=grouprowindex; row<rowindex; row++)
-	// {
-	// y += rowHeights[row];
-	// y += vspacing;
-	// }
-	// int height = rowHeights[rowindex];
-	// Rectangle rect = new Rectangle(0, y, rowwidth, height);
-	// figure.setBounds(rect);
-	// }
-	// }
-	// }
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.CSSLayout#handlingBorderForBlock()
-	 */
-	public boolean handlingBorderForBlock() {
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/CSSTRLayout.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/CSSTRLayout.java
deleted file mode 100644
index 12590c1..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/CSSTRLayout.java
+++ /dev/null
@@ -1,144 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout.table;
-
-import java.util.List;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.LayoutManager;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.jst.pagedesigner.css2.layout.CSSBlockFlowLayout;
-import org.eclipse.jst.pagedesigner.css2.layout.CSSFigure;
-import org.eclipse.jst.pagedesigner.css2.layout.FlowFigure;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class CSSTRLayout extends CSSBlockFlowLayout {
-	/**
-	 * @param cssfigure
-	 */
-	public CSSTRLayout(CSSFigure cssfigure) {
-		super(cssfigure);
-	}
-
-	/**
-	 * @return the parent figure of TRGroup should be table figure. If so, return the
-     * corresponding table layout.
-	 */
-	public CSSTableLayout2 getTableLayoutContext() {
-		IFigure parent = getCSSFigure().getParent();
-		if (parent != null) {
-			LayoutManager parentLayout = parent.getLayoutManager();
-			if (parentLayout instanceof CSSTableLayout2) {
-				return (CSSTableLayout2) parentLayout;
-			} else if (parentLayout instanceof CSSTRGroupLayout) {
-				return ((CSSTRGroupLayout) parentLayout)
-						.getTableLayoutContext();
-			}
-		}
-
-		return null;
-	}
-
-	/**
-	 * @return the group layout or null
-	 */
-	public CSSTRGroupLayout getTRGroupLayout() {
-		IFigure parent = getCSSFigure().getParent();
-		if (parent != null) {
-			LayoutManager parentLayout = parent.getLayoutManager();
-			if (parentLayout instanceof CSSTRGroupLayout) {
-				return ((CSSTRGroupLayout) parentLayout);
-			}
-		}
-
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.CSSBlockFlowLayout#postValidate()
-	 */
-	public void postValidate() {
-		CSSTableLayout2 tableLayout = getTableLayoutContext();
-		if (tableLayout == null) {
-			// we are not in table? treat as block.
-			super.postValidate();
-		} else {
-			Rectangle r = getTRRect(tableLayout, getTRGroupLayout());
-			if (r != null) {
-				_blockBox.setXYWidthHeight(r);
-				getCSSFigure().setBounds(r);
-				List list = getCSSFigure().getChildren();
-				for (int i = 0; i < list.size(); i++) {
-					((FlowFigure) list.get(i)).postValidate();
-				}
-			} else {
-				super.postValidate();
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.CSSBlockFlowLayout#endBlock()
-	 */
-	protected void endBlock() {
-		if (this.getTableLayoutContext() == null) {
-			super.endBlock();
-		} else {
-			layoutLines();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.CSSBlockFlowLayout#useLocalCoordinates()
-	 */
-	public boolean useLocalCoordinates() {
-		return this.getTableLayoutContext() == null;
-	}
-
-	private Rectangle getTRRect(CSSTableLayout2 tableLayout,
-			CSSTRGroupLayout groupLayout) {
-		TableRowInfo rowinfo = tableLayout.getRowInfo(this.getCSSFigure());
-		int rowIndex = rowinfo.getRowIndex();
-		int y = (rowIndex + 1) * tableLayout.getVSpacing();
-		for (int k = 0; k < rowIndex; k++) {
-			y += tableLayout.getRowHeights()[k];
-		}
-		if (tableLayout.getCaptionInfo() != null
-				&& "top".equalsIgnoreCase(tableLayout.getCaptionInfo().getAlign())) //$NON-NLS-1$
-		{
-			y += tableLayout.getCaptionSize().height;
-		}
-
-		int height = tableLayout.getRowHeights()[rowIndex];
-		//ICSSFigure figure = rowinfo.getFigure();
-		return new Rectangle(tableLayout.getRowX(), y, tableLayout
-				.getRowWidth(), height);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.CSSLayout#handlingBorderForBlock()
-	 */
-	public boolean handlingBorderForBlock() {
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/CSSTableCaptionLayout.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/CSSTableCaptionLayout.java
deleted file mode 100644
index 3d42a50..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/CSSTableCaptionLayout.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout.table;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.LayoutManager;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.jst.pagedesigner.css2.layout.CSSFigure;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class CSSTableCaptionLayout extends CachedTableCellLayout {
-	private CSSTableLayout2 _tableLayout;
-
-	private TableCaptionInfo _caption;
-
-	/**
-	 * @param cssfigure
-	 */
-	public CSSTableCaptionLayout(CSSFigure cssfigure) {
-		super(cssfigure);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowFigureLayout#invalidate()
-	 */
-	public void invalidate() {
-		super.invalidate();
-
-		_tableLayout = null;
-		_caption = null;
-	}
-
-	public Rectangle getCellRect() {
-		int x = 0;
-
-		int[] rowHeights = _tableLayout.getRowHeights();
-		int vspacing = _tableLayout.getVSpacing();
-		int y = vspacing;
-		if (_caption != null && "bottom".equalsIgnoreCase(_caption.getAlign())) //$NON-NLS-1$
-		{
-			for (int row = 0; row < rowHeights.length; row++) {
-				y += rowHeights[row];
-				y += vspacing;
-			}
-		}
-
-		int height = 0;
-		height = _tableLayout.getCaptionSize().height;
-		int width = _tableLayout.getCaptionSize().width;
-		Rectangle rect = new Rectangle(x, y, width, height);
-		return rect;
-	}
-
-	/**
-	 * the parent figure of TRGroup should be table figure. If so, return the
-	 * corresponding table layout.
-	 * 
-	 * @return the css table layout context or null if none.
-	 */ 
-	public CSSTableLayout2 getTableLayoutContext() {
-		IFigure parent = getCSSFigure().getParent();
-		if (parent != null) {
-			LayoutManager parentLayout = parent.getLayoutManager();
-			if (parentLayout instanceof CSSTableLayout2) {
-				return (CSSTableLayout2) parentLayout;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * @return true if the table has a caption
-	 */
-	public boolean initializeTableInfo() {
-		_caption = null;
-		_tableLayout = getTableLayoutContext();
-		if (_tableLayout != null) {
-			_caption = _tableLayout.getCaptionInfo();
-			return _caption != null;
-		}
-		return false;
-	}
-
-	/**
-	 * @return the table layout
-	 */
-	public CSSTableLayout2 getTableLayout() {
-		return _tableLayout;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.CSSLayout#isCalculatingMaxWidth()
-	 */
-	public boolean isCalculatingMaxWidth() {
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/CSSTableCellLayout.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/CSSTableCellLayout.java
deleted file mode 100644
index 1eb62e8..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/CSSTableCellLayout.java
+++ /dev/null
@@ -1,208 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout.table;
-
-import java.util.List;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.LayoutManager;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.layout.CSSFigure;
-import org.eclipse.jst.pagedesigner.css2.layout.FlowBox;
-import org.eclipse.jst.pagedesigner.css2.layout.LineBox;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.css2.property.VerticalAlignMeta;
-
-/**
- * This layout is for those thigns that it's parent will decide its size. Such
- * as table cell.
- * 
- * @author mengbo
- * @version 1.5
- */
-public class CSSTableCellLayout extends CachedTableCellLayout {
-	private CSSTableLayout2 _tableLayout;
-
-	private TableRowInfo _rowinfo;
-
-	private TableCellInfo _cellinfo;
-
-	/**
-	 * @param cssfigure
-	 */
-	public CSSTableCellLayout(CSSFigure cssfigure) {
-		super(cssfigure);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowFigureLayout#invalidate()
-	 */
-	public void invalidate() {
-		super.invalidate();
-
-		_tableLayout = null;
-		_rowinfo = null;
-		_cellinfo = null;
-	}
-
-	protected void endBlock() {
-		if (isTable()) {
-			verticalLayoutLines();
-			layoutLines();
-		} else {
-			super.endBlock();
-		}
-	}
-
-	/**
-	 * process the vertical layout lines
-	 */
-	protected void verticalLayoutLines() {
-		List lines = _blockBox.getFragments();
-
-		String verticalStyle = getVerticalAlign();
-		int linesHeight = 0;
-
-		if (lines != null && !lines.isEmpty()) {
-			FlowBox bottomBox = ((FlowBox) lines.get(lines.size() - 1));
-			FlowBox topBox = ((FlowBox) lines.get(0));
-			linesHeight = bottomBox.getY() + bottomBox.getHeight() - topBox.getY();
-		}
-		int movement = 0;
-		if (VerticalAlignMeta.BOTTOM.equals(verticalStyle)) {
-			movement = _blockBox.getHeight() - linesHeight
-					- _blockBox.getBorderPaddingHeight() / 2;
-		} else if (VerticalAlignMeta.TOP.equals(verticalStyle)) {
-			movement = 0;
-		}
-		// else if (VerticalAlignMeta.BASELINE.equals(verticalStyle))
-		// {
-		// movement = _blockBox.getHeight() - linesHeight;
-		// }
-		else // if (VerticalAlignMeta.MIDDLE.equals(verticalStyle))
-		{
-			movement = (_blockBox.getHeight() - linesHeight - _blockBox
-					.getBorderPaddingHeight()) / 2;
-		}
-		// VerticalAlignMeta.TOP, ICSSPropertyID.VAL_AUTO and others
-		// else
-		// {
-		// movement = 0;
-		// }
-		if (lines != null) {
-			for (int i = 0, n = lines.size(); i < n; i++) {
-				if (lines.get(i) instanceof LineBox) {
-					LineBox lineBox = (LineBox) lines.get(i);
-					int LineMovement = Math.max(lineBox.getMarginInsets()
-							.getHeight(), movement);
-					lineBox.setY(lineBox.getY() + LineMovement
-							- lineBox.getMarginInsets().getHeight());
-				}
-			}
-		}
-	}
-
-	private String getVerticalAlign() {
-		ICSSStyle style = getCSSStyle();
-		if (style != null) {
-			return style.getStyleProperty(ICSSPropertyID.ATTR_VERTICAL_ALIGN)
-					.toString();
-		}
-		return VerticalAlignMeta.MIDDLE;
-	}
-
-	public Rectangle getCellRect() {
-		int columnIndex = _cellinfo.getColumnIndex();
-		int rowIndex = _cellinfo.getRowIndex();
-		int[] columnWidths = _tableLayout.getColumnWidths();
-		int hspacing = _tableLayout.getHSpacing();
-		int x = hspacing;
-		for (int col = 0; col < columnIndex; col++) {
-			x += columnWidths[col];
-			x += hspacing;
-		}
-
-		int[] rowHeights = _tableLayout.getRowHeights();
-		int vspacing = _tableLayout.getVSpacing();
-		int y = vspacing;
-		for (int row = 0; row < rowIndex; row++) {
-			y += rowHeights[row];
-			y += vspacing;
-		}
-		if (_tableLayout.getCaptionInfo() != null
-				&& "top".equalsIgnoreCase(_tableLayout.getCaptionInfo().getAlign())) //$NON-NLS-1$
-		{
-			y += _tableLayout.getCaptionSize().height;
-		}
-
-		int width = _tableLayout.getCellWidth(_cellinfo, columnWidths);
-		int height = _tableLayout.getCellHeight(_cellinfo, rowHeights);
-
-		Rectangle rect = new Rectangle(x, y, width, height);
-		return rect;
-	}
-
-	/**
-	 * the parent figure of TRGroup should be table figure. If so, return the
-	 * corresponding table layout.
-	 * 
-	 * @return the table layout context
-	 */
-	public CSSTableLayout2 getTableLayoutContext() {
-		IFigure parent = getCSSFigure().getParent();
-		if (parent != null) {
-			LayoutManager parentLayout = parent.getLayoutManager();
-			if (parentLayout instanceof CSSTRLayout) {
-				return ((CSSTRLayout) parentLayout).getTableLayoutContext();
-			}
-		}
-
-		return null;
-	}
-
-	/**
-	 * @return true if the table layout has cell info
-	 */
-	public boolean initializeTableInfo() {
-		_rowinfo = null;
-		_cellinfo = null;
-		_tableLayout = getTableLayoutContext();
-		if (_tableLayout != null) {
-			_rowinfo = _tableLayout.getRowInfo((CSSFigure) this.getCSSFigure()
-					.getParent());
-			if (_rowinfo != null) {
-				_cellinfo = _rowinfo.getCellInfo(this.getCSSFigure());
-				if (_cellinfo != null) {
-					return true;
-				}
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * @return the table layout or nul if none
-	 */
-	public CSSTableLayout2 getTableLayout() {
-		return _tableLayout;
-	}
-
-	/**
-	 * @return the table cell info or null
-	 */
-	public TableCellInfo getTableCellInfo() {
-		return _cellinfo;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/CSSTableLayout2.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/CSSTableLayout2.java
deleted file mode 100644
index 77a3877..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/CSSTableLayout2.java
+++ /dev/null
@@ -1,707 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout.table;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.Insets;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.layout.CSSBlockFlowLayout;
-import org.eclipse.jst.pagedesigner.css2.layout.CSSFigure;
-import org.eclipse.jst.pagedesigner.css2.layout.ICSSPainter;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo;
-import org.eclipse.swt.SWT;
-
-/**
- * see also http://www.w3.org/TR/REC-CSS2/tables.html
- * 
- * @author mengbo
- * @version 1.5
- */
-public class CSSTableLayout2 extends CSSBlockFlowLayout implements ICSSPainter {
-	static Logger _log = PDPlugin.getLogger(CSSTableLayout2.class);
-
-	int _hspacing;
-
-	int _vspacing;
-
-	int[] _columnWidths;
-
-	int[] _rowHeights;
-
-	Dimension _captionSize;
-
-	// _tableInfo will be initialized in preLayout
-	TableInfo _tableInfo;
-
-	private int _internalTableWidth;
-
-	private int _internalTableHeight;
-
-	private int _rowx;
-
-	private int _rowwidth;
-
-	/**
-	 * @param flowfigure
-	 */
-	public CSSTableLayout2(CSSFigure flowfigure) {
-		super(flowfigure);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.CSSBlockFlowLayout#preLayout()
-	 */
-	protected void preLayout() {
-		// super.preLayout will setup the block box.
-		super.preLayout();
-
-		ICSSStyle style = this.getCSSStyle();
-
-		_hspacing = _vspacing = 3; // default value
-
-		if (style != null) {
-			Object borderspacing = style
-					.getStyleProperty(ICSSPropertyID.ATTR_BORDER_SPACING);
-			if (borderspacing instanceof int[]) {
-				int[] intvalues = (int[]) borderspacing;
-				_hspacing = intvalues[0];
-				_vspacing = intvalues[1];
-			} else {
-				ITagEditInfo info = (ITagEditInfo) style
-						.getAdapter(ITagEditInfo.class);
-				if (info != null && info.needTableDecorator()) {
-					// default decorating value. to make things look more
-					// separated.
-					if (_hspacing < 5) {
-						_hspacing = 5;
-					}
-					if (_vspacing < 5) {
-						_vspacing = 5;
-					}
-				}
-			}
-		}
-
-		// TODO: support caption
-		_tableInfo = new TableInfo(getCSSFigure());
-
-		// construct the table structure.
-		_tableInfo.constructTable();
-
-		// calculate the user specified width/height for table and cells.
-		// contentWidth is the user specified content width. If <= 0 means no
-		// user
-		// specification.
-		int contentWidth = this._blockBox.getContentWidth();
-		int availableWidth = this._blockBox.getRecommendedContentWidth();
-		int contentHeight = this._blockBox.getContentHeight();
-
-		_tableInfo.calculateWidth(contentWidth, availableWidth);
-		_tableInfo.calculateHeight(contentHeight);
-
-		int columnCount = _tableInfo.getColumnCount();
-
-		int columnMinWidths[] = new int[columnCount];
-		int columnMaxWidths[] = new int[columnCount];
-
-		// For each column, determine a maximum and minimum column width from
-		// the cells that span only that column. The minimum is that required by
-		// the cell with the largest minimum cell width (or the column 'width',
-		// whichever is larger). The maximum is that required by the cell with
-		// the
-		// largest maximum cell width (or the column 'width', whichever is
-		// larger).
-		List cells = _tableInfo.getCells();
-		for (int i = 0, size = cells.size(); i < size; i++) {
-			TableCellInfo cellinfo = (TableCellInfo) cells.get(i);
-			if (cellinfo.getColSpan() == 1) {
-				int column = cellinfo.getColumnIndex();
-				Dimension mincw = cellinfo.getMinCWDimension();
-				Dimension maxcw = cellinfo.getMaxCWDimension();
-				if (maxcw.width < mincw.width) {
-					maxcw.width = mincw.width;
-				}
-				if (mincw.width > columnMinWidths[column]) {
-					columnMinWidths[column] = mincw.width;
-				}
-				if (maxcw.width > columnMaxWidths[column]) {
-					columnMaxWidths[column] = maxcw.width;
-				}
-			}
-		}
-		// For caption, determine a maximum and minimum width from it.
-		int captionWidth = 0;
-		if (_tableInfo.getCaption() != null) {
-			captionWidth = _tableInfo.getCaption().getDimension().width;
-		}
-
-		// For each cell that spans more than one column, increase the
-		// minimum widths of the columns it spans so that together, they
-		// are at least as wide as the cell. Do the same for the maximum
-		// widths. If possible, widen all spanned columns by approximately
-		// the same amount.
-		for (int i = 0, size = cells.size(); i < size; i++) {
-			TableCellInfo cellinfo = (TableCellInfo) cells.get(i);
-			int colspan = cellinfo.getColSpan();
-			if (colspan > 1) {
-				int column = cellinfo.getColumnIndex();
-				Dimension mincw = cellinfo.getMinCWDimension();
-				Dimension maxcw = cellinfo.getMaxCWDimension();
-
-				adjustWidth(column, colspan, mincw.width, columnMinWidths);
-				adjustWidth(column, colspan, maxcw.width, columnMaxWidths);
-			}
-		}
-
-		int sigmaMinWidth = 0;
-		int sigmaMaxWidth = 0;
-		for (int i = 0; i < columnMinWidths.length; i++) {
-			sigmaMinWidth += columnMinWidths[i];
-			if (columnMaxWidths[i] == Integer.MAX_VALUE) {
-				sigmaMaxWidth = Integer.MAX_VALUE;
-			} else if (sigmaMaxWidth != Integer.MAX_VALUE) {
-				sigmaMaxWidth += columnMaxWidths[i];
-				if (sigmaMaxWidth < 0) {
-					sigmaMaxWidth = Integer.MAX_VALUE;
-				}
-			}
-		}
-		int spacingall = (columnMinWidths.length + 1) * _hspacing;
-		sigmaMinWidth += spacingall;
-		if (sigmaMaxWidth != Integer.MAX_VALUE) {
-			sigmaMaxWidth += spacingall;
-			if (sigmaMaxWidth < 0) {
-				sigmaMaxWidth = Integer.MAX_VALUE;
-			}
-		}
-
-		int tableWidth = _tableInfo.getTableWidth();
-		if (tableWidth > 0) {
-			// If the 'table' or 'inline-table' element's 'width' property has a
-			// specified value (W) other than 'auto', the property's computed
-			// value
-			// is the greater of W and the minimum width required by all the
-			// columns
-			// plus cell spacing or borders (MIN). If W is greater than MIN, the
-			// extra
-			// width should be distributed over the columns.
-			int maxMin = Math.max(captionWidth, sigmaMinWidth);
-			if (maxMin >= tableWidth) {
-				tableWidth = maxMin;
-			}
-			distribute(tableWidth - sigmaMinWidth, columnMinWidths,
-					columnMaxWidths);
-		} else {
-			// If the 'table' or 'inline-table' element has 'width: auto', the
-			// computed
-			// table width is the greater of the table's containing block width
-			// and MIN.
-			// However, if the maximum width required by the columns plus cell
-			// spacing or
-			// borders (MAX) is less than that of the containing block, use MAX.
-			// int availableWidth = this.getCurrentLine().getAvailableWidth();
-			int maxMin = Math.max(captionWidth, sigmaMaxWidth);
-			if (maxMin <= availableWidth) {
-				// TODO: if _tableInfo.hasWidthPercentage, then we need take
-				// that into consideration
-				// to distribute the column width. Left to next version.
-				tableWidth = maxMin;
-				// columnMinWidths = columnMaxWidths;
-			} else {
-				tableWidth = availableWidth;
-			}
-			distribute(tableWidth - sigmaMinWidth, columnMinWidths,
-					columnMaxWidths);
-		}
-
-		// now columnMinWidths contains width for each column
-		_columnWidths = columnMinWidths;
-
-		// ok, we have finished calculating column width.
-		// next we need to find out row heights.
-		_rowHeights = new int[_tableInfo.getRowCount()];
-
-		// first find out those TR that has height settings and use them.
-		List rows = _tableInfo.getRows();
-		for (int i = 0, size = rows.size(); i < size && i < _rowHeights.length; i++) {
-			TableRowInfo rowInfo = (TableRowInfo) rows.get(i);
-			if (rowInfo.getSpecifiedRowHeight() > 0) {
-				_rowHeights[i] = rowInfo.getSpecifiedRowHeight();
-			}
-		}
-
-		// First the cells don't span multiple rows.
-		cells = _tableInfo.getCells();
-		for (int i = 0, size = cells.size(); i < size; i++) {
-			TableCellInfo cellinfo = (TableCellInfo) cells.get(i);
-			IFigure figure = cellinfo.getFigure();
-			int rowspan = cellinfo.getRowSpan();
-			if (rowspan == 1) {
-				int cellWidth = getCellWidth(cellinfo, _columnWidths);
-				Dimension d = figure.getPreferredSize(cellWidth, cellinfo
-						.getHeight());
-				if (d.height > _rowHeights[cellinfo.getRowIndex()]) {
-					_rowHeights[cellinfo.getRowIndex()] = d.height;
-				}
-			}
-		}
-
-		// Next those cells span multiple rows.
-		cells = _tableInfo.getCells();
-		for (int i = 0, size = cells.size(); i < size; i++) {
-			TableCellInfo cellinfo = (TableCellInfo) cells.get(i);
-			IFigure figure = cellinfo.getFigure();
-			int rowspan = cellinfo.getRowSpan();
-			if (rowspan > 1) {
-				int cellWidth = getCellWidth(cellinfo, _columnWidths);
-				Dimension d = figure.getPreferredSize(cellWidth, cellinfo
-						.getHeight());
-				if (d.height > getCellHeight(cellinfo, _rowHeights)) {
-					adjustHeight(cellinfo.getRowIndex(), rowspan, d.height,
-							_rowHeights);
-				}
-			}
-		}
-
-		// Next we may need distribute height.
-		int sigmaHeight = (_tableInfo.getRowCount() + 1) * _vspacing;
-		for (int i = 0; i < _rowHeights.length; i++) {
-			sigmaHeight += _rowHeights[i];
-		}
-		if (sigmaHeight < contentHeight) {
-			distributeHeights(contentHeight - sigmaHeight, _rowHeights);
-		}
-
-		// now we have calculated the width and height of all cells.
-		// FIXME: border?
-		Insets insets = (style == null ? new Insets() : style.getBorderInsets()
-				.getAdded(style.getPaddingInsets()));
-		_internalTableWidth = (_tableInfo.getColumnCount() + 1) * _hspacing;
-		for (int i = 0; i < _columnWidths.length; i++) {
-			_internalTableWidth += _columnWidths[i];
-		}
-		int minWidth = getLengthValue(style, ICSSPropertyID.ATTR_MIN_WIDTH);
-		_internalTableWidth = _internalTableWidth > minWidth ? _internalTableWidth
-				: minWidth;
-
-		_blockBox.setWidth(_internalTableWidth + insets.getWidth());
-		_internalTableHeight = (_tableInfo.getRowCount() + 1) * _vspacing;
-		for (int i = 0; i < _rowHeights.length; i++) {
-			_internalTableHeight += _rowHeights[i];
-		}
-		int minHeight = getLengthValue(style, ICSSPropertyID.ATTR_MIN_HEIGHT);
-		_internalTableHeight = _internalTableHeight > minHeight ? _internalTableHeight
-				: minHeight;
-
-		int captionHeight = 0;
-		if (_tableInfo.getCaption() != null) {
-			_captionSize = _tableInfo.getCaption().getFigure().getPreferredSize(
-					_internalTableWidth, SWT.DEFAULT);
-			captionHeight = _captionSize.height;
-		} else {
-			_captionSize = null;
-		}
-		_internalTableHeight += captionHeight;
-
-		_blockBox.setHeight(_internalTableHeight + insets.getHeight());
-
-		_rowwidth = _internalTableWidth - 2 * _hspacing;
-		_rowx = _hspacing; // XXX: table border width left?
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.CSSBlockFlowLayout#endBlock()
-	 */
-	protected void endBlock() {
-		_blockBox.setWidth(_internalTableWidth
-				+ _blockBox.getBorderPaddingWidth());
-		_blockBox.setHeight(_internalTableHeight
-				+ _blockBox.getBorderPaddingHeight());
-		super.endBlock();
-	}
-
-	//
-	// /**
-	// * when some of the column has percentage width, and sigmaMax smaller than
-	// container,
-	// * @param containerWidth
-	// * @param columnMinWidths
-	// * @param columnMaxWidths
-	// * @return
-	// */
-	// private int distribute2(int containerWidth, int[] columnMinWidths, int[]
-	// columnMaxWidths)
-	// {
-	//        
-	// }
-	//    
-	/**
-	 * Distribute the additional width to columnMinWidths, using max width as a
-	 * possible reference on how to distribute.
-	 * 
-	 * @param toDistribute
-	 * @param columnMinWidths
-	 * @param columnMaxWidths
-	 */
-	private void distribute(int toDistribute, int[] columnMinWidths,
-			int[] columnMaxWidths) {
-		if (toDistribute <= 0)
-			return;
-		if (columnMinWidths.length == 0)
-			return;
-
-		int[] delta = new int[columnMinWidths.length];
-		int sigmaDelta = 0;
-		for (int i = 0; i < columnMinWidths.length; i++) {
-			if (_tableInfo.getWidthSpecified()[i]) {
-				delta[i] = 0;
-			} else {
-				delta[i] = columnMaxWidths[i] - columnMinWidths[i];
-				if (delta[i] <= 0) {
-					delta[i] = 0;
-				}
-				sigmaDelta += delta[i];
-			}
-		}
-
-		// re-calculate the width of columns that use a percentage
-		int[] widthPercentages = _tableInfo.getWidthPercentages();
-		int[] calculatedWidths = new int[columnMaxWidths.length];
-		int percentageWidthsTotal = 0;
-		for (int i=0; i < widthPercentages.length; i++) {
-			if (widthPercentages[i] > 0) {
-				// add the widths of the percent width columns
-				// back into the available pool
-				toDistribute += columnMinWidths[i];
-			}
-		}
-
-		for (int i=0; i < widthPercentages.length; i++) {
-			if (widthPercentages[i] > 0) {
-				double val = toDistribute * (widthPercentages[i] / 100.0);
-				calculatedWidths[i] = (int) val;
-				if (calculatedWidths[i] < columnMinWidths[i]) {
-					// percent width is too small, so use
-					// the columnMinWidth instead
-					calculatedWidths[i] = columnMinWidths[i];
-				}
-				percentageWidthsTotal += calculatedWidths[i];
-			} else {
-				calculatedWidths[i] = 0;
-			}
-		}
-
-		if (percentageWidthsTotal > toDistribute) {
-			// calculated width is too large, so shrink the columns
-			// to fit the available space
-			int widthColumnCount = 0;
-			for (int i=0; i < widthPercentages.length; i++) {
-				if (widthPercentages[i] > 0) {
-					widthColumnCount++;
-				}
-			}
-
-			int extraSpace = percentageWidthsTotal - toDistribute;
-			int shrinkBy = (int)
-				Math.ceil((double) extraSpace / (double) widthColumnCount);
-
-			for (int i=0; i < calculatedWidths.length; i++) {
-				if (calculatedWidths[i] > 0) {
-					calculatedWidths[i] -= shrinkBy;
-				}
-			}
-		}
-
-		// adjust the columnMinWidth values to compensate for the
-		// calculated percentages
-		for (int i=0; i < calculatedWidths.length; i++) {
-			// if column size was calculated, then re-calculate the delta
-			if (calculatedWidths[i] > 0) {
-				// remove the previous calculation from the sigmaDelta
-				int len = columnMaxWidths[i] - columnMinWidths[i];
-				delta[i] = 0;
-				if (len <= 0) {
-					len = 0;
-				}
-				sigmaDelta -= len;
-
-				// change the minSize to the calculated size
-				columnMinWidths[i] = calculatedWidths[i];
-				toDistribute -= columnMinWidths[i];
-			}
-		}
-
-		if (sigmaDelta == 0) {
-			// may happen with percent width column calculations.
-			// find out how much space is left and distribute it
-			// equally to all columns that are not fixed-width.
-			int extraSpace = toDistribute;
-			for (int i=0; i < columnMinWidths.length; i++) {
-				extraSpace -= columnMinWidths[i];
-			}
-
-			averageDeltaToCell(columnMinWidths, extraSpace);
-		} else {
-			int left = toDistribute;
-			for (int i = 0; i < columnMinWidths.length - 1; i++) {
-				if (delta[i] > 0) {
-					int add = delta[i] * toDistribute / sigmaDelta;
-					left -= add;
-					columnMinWidths[i] += add;
-				}
-			}
-			columnMinWidths[columnMinWidths.length - 1] += left;
-		}
-	}
-
-	private void averageDeltaToCell(int[] columnMinWidths, int toDistribute) {
-
-		if (toDistribute <= 0) {
-			return;
-		}
-		ArrayList list = new ArrayList();
-		for (int i = 0; i < columnMinWidths.length; i++) {
-			if (!_tableInfo.getWidthSpecified()[i]) {
-				list.add(new Integer(i));
-			}
-		}
-		if (list.size() == 0) {
-			for (int i = 0; i < columnMinWidths.length; i++) {
-				list.add(new Integer(i));
-			}
-		}
-		int padding = toDistribute / list.size();
-		int left = toDistribute % list.size();
-		for (int i = 0, n = list.size(); i < n; i++) {
-			columnMinWidths[((Integer) list.get(i)).intValue()] += padding;
-		}
-		if (left > 0) {
-			for (int i = 0; i < left; i++) {
-				columnMinWidths[((Integer) list.get(i)).intValue()] += 1;
-			}
-		}
-	}
-
-	/**
-	 * @param i
-	 * @param heights
-	 */
-	private void distributeHeights(int toDistribute, int[] heights) {
-		if (heights.length == 0)
-			return;
-		int eachDelta = toDistribute / heights.length;
-		for (int i = 0; i < heights.length - 1; i++) {
-			heights[i] += eachDelta;
-		}
-		heights[heights.length - 1] += toDistribute - (heights.length - 1)
-				* eachDelta;
-	}
-
-	/**
-	 * @param cellinfo
-	 * @param heights
-	 * @return the cell height
-	 */
-	public int getCellHeight(TableCellInfo cellinfo, int[] heights) {
-		int rowIndex = cellinfo.getRowIndex();
-		int rowspan = cellinfo.getRowSpan();
-		int h = 0;
-		for (int i = 0; i < rowspan; i++) {
-			h += heights[rowIndex + i];
-		}
-		h += (rowspan - 1) * _vspacing;
-		return h;
-	}
-
-	/**
-	 * @param cellinfo
-	 * @param widths
-	 * @return the cell width
-	 */
-	public int getCellWidth(TableCellInfo cellinfo, int[] widths) {
-		int columnIndex = cellinfo.getColumnIndex();
-		int colspan = cellinfo.getColSpan();
-		int w = 0;
-		for (int i = 0; i < colspan; i++) {
-			w += widths[columnIndex + i];
-		}
-		w += (colspan - 1) * _hspacing;
-		return w;
-	}
-
-	/**
-	 * @param column
-	 *            the start column
-	 * @param colspan
-	 *            number of columns
-	 * @param width
-	 *            desired width
-	 * @param columnWidths
-	 *            current columns widths. After the adjust, need make sure the
-	 *            columnWidths to be bigger than desired width
-	 */
-	private void adjustWidth(int column, int colspan, int width,
-			int[] columnWidths) {
-		adjustSpan(column, colspan, width, columnWidths, _hspacing);
-	}
-
-	/**
-	 * @see #adjustWidth(int, int, int, int[])
-	 */
-	private void adjustHeight(int rowIndex, int rowspan, int height,
-			int[] heights) {
-		adjustSpan(rowIndex, rowspan, height, heights, _vspacing);
-	}
-
-	static private void adjustSpan(int column, int colspan, int width,
-			int[] columnWidths, int spacing) {
-		int spanwidth = 0;
-		for (int i = 0; i < colspan; i++) {
-			spanwidth += columnWidths[column + i];
-		}
-		// XXX: vspacing here?
-		spanwidth += (colspan - 1) * spacing;
-
-		if (spanwidth >= width) {
-			return;
-		}
-        int delta = width - spanwidth;
-        int deltaeach = delta / colspan;
-        for (int i = 0; i < colspan - 1; i++) {
-        	columnWidths[column + i] += deltaeach;
-        }
-        columnWidths[column + colspan - 1] += (delta - (colspan - 1)
-        		* deltaeach);
-	}
-
-	/**
-	 * @return the row heights
-	 */
-	public int[] getRowHeights() {
-		return _rowHeights;
-	}
-
-	/**
-	 * @return the column widths
-	 */
-	public int[] getColumnWidths() {
-		return _columnWidths;
-	}
-
-	/**
-	 * @return the vertical spacing value
-	 */
-	public int getVSpacing() {
-		return _vspacing;
-	}
-
-	/**
-	 * @return the horizontal spacing value
-	 */
-	public int getHSpacing() {
-		return _hspacing;
-	}
-
-	/**
-	 * @param figure
-	 * @return the table row info for the figure
-	 */
-	public TableRowInfo getRowInfo(CSSFigure figure) {
-		return _tableInfo.findRowInfo(figure);
-	}
-
-	/**
-	 * @return the table caption info
-	 */
-	public TableCaptionInfo getCaptionInfo() {
-		return _tableInfo.getCaption();
-	}
-
-	/**
-	 * @param figure
-	 * @return the table row group info for the figure
-	 */
-	public TableRowGroupInfo getGroupInfo(CSSFigure figure) {
-		return _tableInfo.findGroupInfo(figure);
-	}
-
-	/**
-	 * @return the row's x
-	 */
-	public int getRowX() {
-		return _rowx;
-	}
-
-	/**
-	 * @return the row's width
-	 */
-	public int getRowWidth() {
-		return _rowwidth;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.CSSBlockFlowLayout#shouldExpand()
-	 */
-	public boolean shouldExpand() {
-		return false;
-	}
-
-	/**
-	 * @return the rendered dimensions of the table caption
-	 */
-	public Dimension getCaptionSize() {
-		return _captionSize;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.ICSSPainter#paintFigure(org.eclipse.draw2d.Graphics)
-	 */
-	public void paintFigure(Graphics g) {
-		ICSSStyle style = this.getCSSStyle();
-		if (style != null) {
-			ITagEditInfo info = (ITagEditInfo) style
-					.getAdapter(ITagEditInfo.class);
-			if (info != null && info.needTableDecorator()) {
-				List cells = _tableInfo.getCells();
-				for (int i = 0, size = cells.size(); i < size; i++) {
-					TableCellInfo cellInfo = (TableCellInfo) cells.get(i);
-					IFigure cellfigure = cellInfo.getFigure();
-					Rectangle rect = cellfigure.getBounds().getCopy();
-					rect = rect.expand(1, 1);
-					g.setLineStyle(Graphics.LINE_SOLID);
-					g.setLineWidth(1);
-					g.setForegroundColor(ColorConstants.lightGray);
-					g.drawRectangle(rect);
-				}
-			}
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/CachedTableCellLayout.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/CachedTableCellLayout.java
deleted file mode 100644
index 24e2be8..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/CachedTableCellLayout.java
+++ /dev/null
@@ -1,263 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout.table;
-
-import java.util.List;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.jst.pagedesigner.css2.layout.BoxUtil;
-import org.eclipse.jst.pagedesigner.css2.layout.CSSBlockFlowLayout;
-import org.eclipse.jst.pagedesigner.css2.layout.CSSFigure;
-import org.eclipse.jst.pagedesigner.css2.layout.FlowFigure;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public abstract class CachedTableCellLayout extends CSSBlockFlowLayout 
-{
-	private Dimension _pageSize = new Dimension();
-
-	private boolean _calculatingSize = false;
-
-	private int _pageSizeCacheKeys[] = new int[4];
-
-	private Dimension _pageSizeCacheValues[] = new Dimension[4];
-
-	private int _recommendedWidth;
-
-	private Dimension _cacheMaxWidthSize = null;
-
-	private boolean _isTable;
-
-	/**
-	 * @param cssfigure
-	 */
-	public CachedTableCellLayout(CSSFigure cssfigure) {
-		super(cssfigure);
-	}
-
-	/**
-	 * when figure revalidated, means some child or itself get changed somehow,
-	 * so clear the cache information here.
-	 */
-	public void figureRevalidate() {
-		super.figureRevalidate();
-		_pageSizeCacheKeys = new int[4];
-		_pageSizeCacheValues = new Dimension[4];
-		_pageSize = new Dimension();
-		_recommendedWidth = 0;
-		_cacheMaxWidthSize = null;
-		_isTable = false;
-	}
-
-	/**
-	 * TODO: This method is not being called.
-	 */
-	public void postValidate() {
-		if (_isTable) {
-			if (_calculatingSize) {
-				_pageSize.width = _blockBox.getWidth();
-				_pageSize.height = _blockBox.getHeight();
-			} else {
-				if (_isTable) {
-					Rectangle rect = getCellRect();
-					_blockBox.setXYWidthHeight(rect);
-					this.getCSSFigure().setBounds(rect);
-				}
-			}
-			List list = getCSSFigure().getChildren();
-			for (int i = 0, n = list.size(); i < n; i++) {
-				((FlowFigure) list.get(i)).postValidate();
-			}
-		} else {
-			super.postValidate();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.CSSBlockFlowLayout#preLayout()
-	 */
-	protected void preLayout() {
-		_isTable = initializeTableInfo();
-		if (_isTable) {
-			if (!_calculatingSize) {
-				// XXX: I don't know why need to call setValid(false) here, if I
-				// don't call
-				// it, the layout will be wrong.
-				getCSSFigure().setValid(false);
-			}
-		}
-		super.preLayout();
-	}
-
-	/**
-	 * @return the cell rectangle
-	 */
-	protected abstract Rectangle getCellRect();
-
-	/**
-	 * @return true if initialized
-	 */
-	protected abstract boolean initializeTableInfo();
-
-	protected void setupBlock() {
-		if (_isTable) {
-			// Remove all current Fragments
-			_blockBox.clear();
-
-			if (_calculatingSize) {
-				// we are not in the real layout
-				// Setup the one fragment for this Block with the correct X and
-				// available width
-				int recommendedWidth = getRecommendedWidth();
-				_blockBox.setRecommendedWidth(recommendedWidth);
-
-				if (recommendedWidth > 0
-						&& recommendedWidth != Integer.MAX_VALUE) {
-					_blockBox.setWidth(recommendedWidth);
-				}
-			} else {
-				Rectangle rect = getCellRect();
-				_blockBox.setWidth(rect.width);
-				_blockBox.setRecommendedWidth(rect.width);
-				_blockBox.setHeight(rect.height);
-				_blockBox.setRecommendedHeight(rect.height);
-			}
-
-			BoxUtil.setupBorderPaddingMargin(_blockBox, getCSSStyle());
-		} else {
-			super.setupBlock();
-		}
-	}
-
-	/**
-	 * @see org.eclipse.draw2d.Figure#getPreferredSize(int, int)
-	 */
-	public Dimension getPreferredSize(IFigure container, int width, int h) {
-		if (this.isCalculatingMaxWidth()) {
-			return getMaxContentWidthSize(container, width, h);
-		}
-		try {
-			_calculatingSize = true;
-			// if (width >= 0)
-			// {
-			// width = Math.max(0, width - container.getInsets().getWidth());
-			// }
-
-			for (int i = 0; i < 4; i++) {
-				if (_pageSizeCacheKeys[i] == width
-						&& _pageSizeCacheValues[i] != null) {
-					if (h > _pageSizeCacheValues[i].height) {
-						return new Dimension(_pageSizeCacheValues[i].width, h);
-					}
-					return _pageSizeCacheValues[i];
-				}
-			}
-
-			_pageSizeCacheKeys[3] = _pageSizeCacheKeys[2];
-			_pageSizeCacheKeys[2] = _pageSizeCacheKeys[1];
-			_pageSizeCacheKeys[1] = _pageSizeCacheKeys[0];
-			_pageSizeCacheKeys[0] = width;
-
-			_pageSizeCacheValues[3] = _pageSizeCacheValues[2];
-			_pageSizeCacheValues[2] = _pageSizeCacheValues[1];
-			_pageSizeCacheValues[1] = _pageSizeCacheValues[0];
-
-			// Flowpage must temporarily layout to determine its preferred size
-			int oldWidth = getRecommendedWidth();
-			setRecommendedWidth(width);
-			((CSSFigure) container).setValid(false);
-			container.validate();
-			((CSSFigure) container).postValidate();
-			_pageSizeCacheValues[0] = new Dimension(_pageSize);
-
-			if (width != oldWidth) {
-				setRecommendedWidth(oldWidth);
-				// container.getUpdateManager().addInvalidFigure(container);
-			}
-			if (h > _pageSizeCacheValues[0].height) {
-				return new Dimension(_pageSizeCacheValues[0].width, h);
-			}
-            return _pageSizeCacheValues[0];
-		} finally {
-			_calculatingSize = false;
-		}
-	}
-
-	private int getRecommendedWidth() {
-		return _recommendedWidth;
-	}
-
-	private void setRecommendedWidth(int width) {
-		if (_recommendedWidth == width) {
-			return;
-		}
-		_recommendedWidth = width;
-	}
-
-	/**
-	 * @param container
-	 * @param width
-	 * @param height
-	 * @return max width size
-	 */
-	public Dimension getMaxContentWidthSize(IFigure container, int width,
-			int height) {
-		try {
-			_calculatingSize = true;
-
-			if (this._cacheMaxWidthSize == null) {
-				boolean b = getCalcuatingMaxWidth();
-				setCalculatingMaxWidth(true);
-
-				// Flowpage must temporarily layout to determine its preferred
-				// size
-				int oldWidth = getRecommendedWidth();
-				if (width <= 0) {
-					setRecommendedWidth(Integer.MAX_VALUE);
-				} else {
-					setRecommendedWidth(width);
-				}
-				((CSSFigure) container).setValid(false);
-				container.validate();
-
-				((CSSFigure) container).postValidate();
-				_cacheMaxWidthSize = new Dimension(_pageSize);
-				if (height > _pageSize.height) {
-					_cacheMaxWidthSize.height = height;
-				}
-
-				if (0 != oldWidth) {
-					setRecommendedWidth(oldWidth);
-					// container.getUpdateManager().addInvalidFigure(container);
-				}
-
-				setCalculatingMaxWidth(b);
-			}
-			return _cacheMaxWidthSize;
-		} finally {
-			_calculatingSize = false;
-		}
-	}
-
-	/**
-	 * @return Returns the _isTable.
-	 */
-	protected boolean isTable() {
-		return _isTable;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/TableCaptionInfo.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/TableCaptionInfo.java
deleted file mode 100644
index 010cbc5..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/TableCaptionInfo.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout.table;
-
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.layout.ICSSFigure;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.swt.SWT;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TableCaptionInfo extends TableItemInfo {
-	String _align;
-
-	/**
-	 * @param figure
-	 */
-	public TableCaptionInfo(ICSSFigure figure) {
-		super(figure);
-		ICSSStyle style = figure.getCSSStyle();
-		if (style != null) {
-			_align = style.getStyleProperty(
-					ICSSPropertyID.ATTR_HORIZONTAL_ALIGN).toString();
-		}
-	}
-
-	/**
-	 * @param width 
-	 * @param height 
-	 * @return the preferred dimension of the figure
-	 */
-	public Dimension getDimension(int width, int height) {
-		return getFigure().getPreferredSize(width, height);
-	}
-
-	/**
-	 * @return getDimension(width, height)
-	 */
-	public Dimension getDimension() {
-		return getDimension(SWT.DEFAULT, SWT.DEFAULT);
-	}
-
-	/**
-	 * @return Returns the align.
-	 */
-	public String getAlign() {
-		// TODO:We do not support left/right align of caption currently. so we
-		// treat them as top.
-		if ("bottom".equalsIgnoreCase(_align)) //$NON-NLS-1$
-		{
-			return _align;
-		}
-        return "top"; //$NON-NLS-1$
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/TableCellInfo.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/TableCellInfo.java
deleted file mode 100644
index 286462a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/TableCellInfo.java
+++ /dev/null
@@ -1,218 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout.table;
-
-import org.eclipse.draw2d.LayoutManager;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.layout.ICSSFigure;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.css2.value.Length;
-import org.eclipse.jst.pagedesigner.utils.IntFlexArray;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TableCellInfo extends TableItemInfo {
-	int _rowSpan = 1;
-
-	int _colSpan = 1;
-
-	int _colIndex;
-
-	int _rowIndex;
-
-	int _cellWidth = 0;
-
-	int _cellHeight = 0;
-
-	/**
-	 * @param childfigure
-	 */
-	public TableCellInfo(ICSSFigure childfigure) {
-		super(childfigure);
-	}
-
-	/**
-	 * @return column span
-	 */
-	public int getColSpan() {
-		return _colSpan;
-	}
-
-	/**
-	 * @return row span
-	 */
-	public int getRowSpan() {
-		return _rowSpan;
-	}
-
-	/**
-	 * @return the row index
-	 */
-	public int getRowIndex() {
-		return _rowIndex;
-	}
-
-	/**
-	 * @return the column index
-	 */
-	public int getColumnIndex() {
-		return _colIndex;
-	}
-
-	/**
-	 * @return the minimum cell dimensions
-	 */
-	public Dimension getMinCWDimension() {
-		return getFigure().getPreferredSize(_cellWidth, _cellHeight);
-	}
-
-	/**
-	 * @return the max cell dimensions
-	 */
-	public Dimension getMaxCWDimension() {
-		ICSSFigure figure = getFigure();
-		LayoutManager layout = figure.getLayoutManager();
-		if (layout instanceof CSSTableCellLayout) {
-			Dimension d = ((CSSTableCellLayout) layout).getMaxContentWidthSize(
-					figure, _cellWidth, _cellHeight);
-			return d;
-		}
-
-        // should not happen
-        return getMinCWDimension();
-	}
-
-	/**
-	 * @param context
-	 */
-	public void calculateCellInfo(TableInfoContext context) {
-		ICSSStyle style = this.getStyle();
-		_rowSpan = style.getRowSpan();
-		_colSpan = style.getColSpan();
-
-		// FIXME: we don't support rowspan and colspan to be 0.
-		// by spec, 0 means span from current col/row to end.
-		if (_rowSpan <= 0) {
-			_rowSpan = 1;
-		}
-		if (_colSpan <= 0) {
-			_colSpan = 1;
-		}
-
-		_rowIndex = context.getCurrentRow();
-
-		IntFlexArray array = context.getIntFlexArray();
-		int currentCol = context.getCurrentCol();
-
-		// find a cell that is not occupied by cells in previous rows.
-		while (array.getAt(currentCol) > 0) {
-			currentCol++;
-		}
-
-		// ok, now array.getAt(currentCol) == 0
-		_colIndex = currentCol;
-
-		for (int i = 0; i < _colSpan; i++, currentCol++) {
-			array.setAt(currentCol, _rowSpan);
-		}
-		context.setCurrentCol(currentCol);
-	}
-
-	/**
-	 * @param tableInfo 
-	 * @param tablewidth
-	 *            table width
-	 */
-	public void calculateWidth(TableInfo tableInfo, int tablewidth) {
-		ICSSStyle style = this.getFigure().getCSSStyle();
-		if (style == null) {
-			_cellWidth = -1;
-		} else {
-			Object width = style.getStyleProperty(ICSSPropertyID.ATTR_WIDTH);
-			Length recommendedWidth = (width instanceof Length) ? (Length) width
-					: null;
-
-			int rw = 0;
-			if (recommendedWidth == null || recommendedWidth.getValue() <= 0) {
-				rw = 0;
-			} else {
-				if (recommendedWidth.isPercentage()) {
-					// percentage width is used for remaining width
-					// distribution, so not used here.
-					int colspan = this.getColSpan();
-					for (int i = 0; i < colspan; i++) {
-						tableInfo.setWidthPercentage(this.getColumnIndex() + i,
-								recommendedWidth.getValue() / colspan);
-					}
-				} else {
-					rw = recommendedWidth.getValue();
-					if (!style.isSizeIncludeBorderPadding()) {
-						rw += style.getBorderInsets().getWidth()
-								+ style.getPaddingInsets().getWidth();
-					}
-					if (this.getColSpan() == 1) {
-						tableInfo.getWidthSpecified()[this.getColumnIndex()] = true;
-					}
-				}
-
-			}
-			_cellWidth = rw;
-		}
-
-	}
-
-	/**
-	 * @param tableInfo 
-	 * @param tableheight 
-	 */
-	public void calculateHeight(TableInfo tableInfo, int tableheight) {
-		ICSSStyle style = this.getFigure().getCSSStyle();
-		if (style == null) {
-			_cellHeight = -1;
-		} else {
-			Object height = style.getStyleProperty(ICSSPropertyID.ATTR_HEIGHT);
-			Length recommendedHeight = (height instanceof Length) ? (Length) height
-					: null;
-
-			int rh = 0;
-			if (recommendedHeight == null || recommendedHeight.getValue() <= 0) {
-				rh = 0;
-			} else {
-				if (recommendedHeight.isPercentage()) {
-					int rowspan = this.getRowSpan();
-					for (int i = 0; i < rowspan; i++) {
-						tableInfo.setHeightPercentage(this.getRowIndex() + i,
-								recommendedHeight.getValue() / rowspan);
-					}
-				} else {
-					rh = recommendedHeight.getValue();
-				}
-				if (!style.isSizeIncludeBorderPadding()) {
-					rh += style.getBorderInsets().getHeight()
-							+ style.getPaddingInsets().getHeight();
-				}
-			}
-			_cellHeight = rh;
-		}
-
-	}
-
-	/**
-	 * @return the height
-	 */
-	public int getHeight() {
-		return _cellHeight;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/TableInfo.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/TableInfo.java
deleted file mode 100644
index 06e135c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/TableInfo.java
+++ /dev/null
@@ -1,379 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout.table;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.layout.CSSFigure;
-import org.eclipse.jst.pagedesigner.css2.layout.ICSSFigure;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-/*package*/ class TableInfo extends TableItemInfo {
-	private List _tableHeaderGroups = new ArrayList();
-
-	private List _tableTRandTRGs = new ArrayList();
-
-	private List _tableFooterGroups = new ArrayList();
-
-	private TableCaptionInfo _caption;
-
-	private int _columnCount;
-
-	private int _rowCount;
-
-	private List _cells = null;
-
-	private List _rows = null;
-
-	private int _tableWidth; // calculated table width, valid after calling to
-
-	// calculateTableWidth
-
-	private int _tableHeight;
-
-	private int[] _widthPercentage;
-
-	private int[] _heightPercentage;
-
-	private boolean[] _widthSpecified;
-
-	/**
-	 * @param figure
-	 */
-	public TableInfo(ICSSFigure figure) {
-		super(figure);
-	}
-
-
-	/**
-	 * @return the column count
-	 */
-	public int getColumnCount() {
-		return _columnCount;
-	}
-
-	/**
-	 * @return the row count
-	 */
-	public int getRowCount() {
-		return _rowCount;
-	}
-
-	final TableCaptionInfo getCaption() {
-        return _caption;
-    }
-
-
-    /**
-     * @return width specified
-     */
-    final boolean[] getWidthSpecified() {
-        return _widthSpecified;
-    }
-
-
-    void constructTable() {
-		List child = getFigure().getChildren();
-		for (int i = 0, size = child.size(); i < size; i++) {
-			IFigure childfigure = (IFigure) child.get(i);
-			if (childfigure instanceof ICSSFigure) {
-				ICSSStyle style = ((ICSSFigure) childfigure).getCSSStyle();
-				if (style != null) {
-					String display = style.getDisplay();
-					if ("table-caption".equalsIgnoreCase(display)) //$NON-NLS-1$
-					{
-						_caption = new TableCaptionInfo(
-								(ICSSFigure) childfigure);
-					} else if ("table-row".equalsIgnoreCase(display)) //$NON-NLS-1$
-					{
-						TableRowInfo rowInfo = new TableRowInfo(
-								(ICSSFigure) childfigure);
-						_tableTRandTRGs.add(rowInfo);
-					} else if ("table-row-group".equalsIgnoreCase(display)) //$NON-NLS-1$
-					{
-						TableRowGroupInfo groupInfo = new TableRowGroupInfo(
-								(ICSSFigure) childfigure);
-						_tableTRandTRGs.add(groupInfo);
-					} else if ("table-header-group".equalsIgnoreCase(display)) //$NON-NLS-1$
-					{
-						TableRowGroupInfo groupInfo = new TableRowGroupInfo(
-								(ICSSFigure) childfigure);
-						_tableHeaderGroups.add(groupInfo);
-					} else if ("table-footer-group".equalsIgnoreCase(display)) //$NON-NLS-1$
-					{
-						TableRowGroupInfo groupInfo = new TableRowGroupInfo(
-								(ICSSFigure) childfigure);
-						_tableFooterGroups.add(groupInfo);
-					} else {
-						// something unexpected inside table
-					}
-				} else {
-					// something unexpected inside table
-				}
-			} else {
-				// something unexpected inside table
-			}
-		}
-
-		TableInfoContext context = new TableInfoContext();
-		// now we have the rows ordered, need to calculate row details now.
-		for (int i = 0, size = _tableHeaderGroups.size(); i < size; i++) {
-			TableRowGroupInfo groupInfo = (TableRowGroupInfo) _tableHeaderGroups
-					.get(i);
-			groupInfo.calculateRowGroup(context);
-		}
-		for (int i = 0, size = _tableTRandTRGs.size(); i < size; i++) {
-			Object obj = _tableTRandTRGs.get(i);
-			if (obj instanceof TableRowGroupInfo) {
-				TableRowGroupInfo groupInfo = (TableRowGroupInfo) obj;
-				groupInfo.calculateRowGroup(context);
-			} else {
-				TableRowInfo rowInfo = (TableRowInfo) obj;
-				rowInfo.calculateRow(context);
-			}
-		}
-		for (int i = 0, size = _tableFooterGroups.size(); i < size; i++) {
-			TableRowGroupInfo groupInfo = (TableRowGroupInfo) _tableFooterGroups
-					.get(i);
-			groupInfo.calculateRowGroup(context);
-		}
-		context.finishTable();
-
-		_columnCount = context.getColumnCount();
-		_rowCount = context.getRowCount();
-
-		this._widthPercentage = new int[_columnCount];
-		this._heightPercentage = new int[_rowCount];
-
-		this._widthSpecified = new boolean[_columnCount];
-		for (int i = 0; i < _columnCount; i++) {
-			this._widthSpecified[i] = false;
-		}
-	}
-
-	/**
-	 * @param columnIndex
-	 * @param percentageValue
-	 */
-	void setWidthPercentage(int columnIndex, int percentageValue) {
-		if (percentageValue > this._widthPercentage[columnIndex]) {
-			this._widthPercentage[columnIndex] = percentageValue;
-		}
-	}
-
-	void setHeightPercentage(int rowIndex, int percentageValue) {
-		if (percentageValue > this._heightPercentage[rowIndex]) {
-			this._heightPercentage[rowIndex] = percentageValue;
-		}
-	}
-
-	/**
-	 * width percentage will be used to calculate remaining width distribution.
-	 * 
-	 * @return the width percentages
-	 */
-	public int[] getWidthPercentages() {
-		return this._widthPercentage;
-	}
-
-	int[] getHeightPercentages() {
-		return this._heightPercentage;
-	}
-
-	List getRows() {
-		if (_rows == null) {
-			this._rows = new ArrayList();
-
-			for (int i = 0, size = _tableHeaderGroups.size(); i < size; i++) {
-				TableRowGroupInfo groupInfo = (TableRowGroupInfo) _tableHeaderGroups
-						.get(i);
-				_rows.addAll(groupInfo.getRowList());
-			}
-			for (int i = 0, size = _tableTRandTRGs.size(); i < size; i++) {
-				Object obj = _tableTRandTRGs.get(i);
-				if (obj instanceof TableRowGroupInfo) {
-					TableRowGroupInfo groupInfo = (TableRowGroupInfo) obj;
-					_rows.addAll(groupInfo.getRowList());
-				} else {
-					TableRowInfo rowInfo = (TableRowInfo) obj;
-					_rows.add(rowInfo);
-				}
-			}
-			for (int i = 0, size = _tableFooterGroups.size(); i < size; i++) {
-				TableRowGroupInfo groupInfo = (TableRowGroupInfo) _tableFooterGroups
-						.get(i);
-				_rows.addAll(groupInfo.getRowList());
-			}
-		}
-		return _rows;
-	}
-
-	List getCells() {
-		if (_cells == null) {
-			_cells = new ArrayList();
-
-			for (int i = 0, size = _tableHeaderGroups.size(); i < size; i++) {
-				TableRowGroupInfo groupInfo = (TableRowGroupInfo) _tableHeaderGroups
-						.get(i);
-				groupInfo.getCells(_cells);
-			}
-			for (int i = 0, size = _tableTRandTRGs.size(); i < size; i++) {
-				Object obj = _tableTRandTRGs.get(i);
-				if (obj instanceof TableRowGroupInfo) {
-					TableRowGroupInfo groupInfo = (TableRowGroupInfo) obj;
-					groupInfo.getCells(_cells);
-				} else {
-					TableRowInfo rowInfo = (TableRowInfo) obj;
-					rowInfo.getCells(_cells);
-				}
-			}
-			for (int i = 0, size = _tableFooterGroups.size(); i < size; i++) {
-				TableRowGroupInfo groupInfo = (TableRowGroupInfo) _tableFooterGroups
-						.get(i);
-				groupInfo.getCells(_cells);
-			}
-		}
-		return _cells;
-	}
-
-	/**
-	 * @param contentWidth
-	 *            if the width specification is percentage, then will use
-	 *            container width.
-	 * @param availableWidth 
-	 */
-	public void calculateWidth(int contentWidth, int availableWidth) {
-		_tableWidth = contentWidth;
-		//_availableWidth = availableWidth;
-
-		// next calculate cell width
-		List cells = getCells();
-		for (int i = 0, size = cells.size(); i < size; i++) {
-			TableCellInfo cellinfo = (TableCellInfo) cells.get(i);
-			cellinfo.calculateWidth(this, _tableWidth);
-		}
-	}
-
-	void calculateHeight(int contentHeight) {
-		_tableHeight = contentHeight;
-
-		List rows = getRows();
-		for (int i = 0, size = rows.size(); i < size; i++) {
-			TableRowInfo rowinfo = (TableRowInfo) rows.get(i);
-			rowinfo.calculateHeight(this, _tableHeight);
-		}
-
-		// next calculate cell width
-		List cells = getCells();
-		for (int i = 0, size = cells.size(); i < size; i++) {
-			TableCellInfo cellinfo = (TableCellInfo) cells.get(i);
-			cellinfo.calculateHeight(this, _tableHeight);
-		}
-	}
-
-	/**
-	 * @return table width
-	 */
-	public int getTableWidth() {
-		return _tableWidth;
-	}
-
-	/**
-	 * @param figure
-	 * @return find the group info
-	 */
-	public TableRowGroupInfo findGroupInfo(CSSFigure figure) {
-		for (int i = 0, size = _tableHeaderGroups.size(); i < size; i++) {
-			TableRowGroupInfo groupInfo = (TableRowGroupInfo) _tableHeaderGroups
-					.get(i);
-			if (figure == groupInfo.getFigure()) {
-				return groupInfo;
-			}
-		}
-		for (int i = 0, size = _tableTRandTRGs.size(); i < size; i++) {
-			Object obj = _tableTRandTRGs.get(i);
-			if (obj instanceof TableRowGroupInfo) {
-				TableRowGroupInfo groupInfo = (TableRowGroupInfo) obj;
-				if (figure == groupInfo.getFigure()) {
-					return groupInfo;
-				}
-
-			}
-		}
-		for (int i = 0, size = _tableFooterGroups.size(); i < size; i++) {
-			TableRowGroupInfo groupInfo = (TableRowGroupInfo) _tableFooterGroups
-					.get(i);
-			if (figure == groupInfo.getFigure()) {
-				return groupInfo;
-			}
-		}
-		return null; // should not happen.
-	}
-
-	/**
-	 * @param figure
- 	 * @return the row info
-	 */
-	public TableRowInfo findRowInfo(CSSFigure figure) {
-		for (int i = 0, size = _tableHeaderGroups.size(); i < size; i++) {
-			TableRowGroupInfo groupInfo = (TableRowGroupInfo) _tableHeaderGroups
-					.get(i);
-			TableRowInfo rowinfo = groupInfo.findRowInfo(figure);
-			if (rowinfo != null) {
-				return rowinfo;
-			}
-		}
-		for (int i = 0, size = _tableTRandTRGs.size(); i < size; i++) {
-			Object obj = _tableTRandTRGs.get(i);
-			if (obj instanceof TableRowGroupInfo) {
-				TableRowGroupInfo groupInfo = (TableRowGroupInfo) obj;
-				TableRowInfo rowinfo = groupInfo.findRowInfo(figure);
-				if (rowinfo != null) {
-					return rowinfo;
-				}
-			} else if (obj instanceof TableRowInfo) {
-				TableRowInfo info = (TableRowInfo) obj;
-				if (figure == info.getFigure()) {
-					return info;
-				}
-			}
-		}
-		for (int i = 0, size = _tableFooterGroups.size(); i < size; i++) {
-			TableRowGroupInfo groupInfo = (TableRowGroupInfo) _tableFooterGroups
-					.get(i);
-			TableRowInfo rowinfo = groupInfo.findRowInfo(figure);
-			if (rowinfo != null) {
-				return rowinfo;
-			}
-		}
-		return null; // should not happen.
-	}
-
-	/**
-	 * 
-	 * @return the width percentage
-	 */
-	public boolean hasWidthPercentage() {
-		for (int i = 0; i < this._widthPercentage.length; i++) {
-			if (this._widthPercentage[i] > 0) {
-				return true;
-			}
-		}
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/TableInfoContext.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/TableInfoContext.java
deleted file mode 100644
index f28d3e0..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/TableInfoContext.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout.table;
-
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.utils.IntFlexArray;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-/*package*/ class TableInfoContext {
-	static Logger _log = PDPlugin.getLogger(TableInfoContext.class);
-
-	int _currentCol = 0;
-
-	int _currentRow = 0;
-
-	IntFlexArray _array = new IntFlexArray();
-
-	int _colCount = 0;
-
-	int _rowCount = 0;
-
-	/**
-	 * 
-	 */
-	public TableInfoContext() {
-        // do nothing
-	}
-
-	/**
-	 * @return the flex array
-	 */
-	public IntFlexArray getIntFlexArray() {
-		return _array;
-	}
-
-	/**
-	 * @return the current column
-	 */
-	public int getCurrentCol() {
-		return _currentCol;
-	}
-
-	/**
-	 * @param currentcol
-	 */
-	public void setCurrentCol(int currentcol) {
-		_currentCol = currentcol;
-	}
-
-	/**
-	 * @return the current row
-	 */
-	public int getCurrentRow() {
-		return _currentRow;
-	}
-
-	/**
-	 * @return the column count
-	 */
-	public int getColumnCount() {
-		return _colCount;
-	}
-
-	/**
-	 * 
-	 */
-	public void finishRow() {
-		if (_currentCol > _colCount) {
-			_colCount = _currentCol;
-		}
-		_currentCol = 0;
-		_currentRow++;
-		for (int i = 0; i < _colCount; i++) {
-			if (_array.getAt(i) > 0) {
-				_array.setAt(i, _array.getAt(i) - 1);
-			}
-		}
-	}
-
-	/**
-	 * 
-	 */
-	public void finishTable() {
-		// do some checking here.
-		int additionalRow = 0;
-		for (int i = 0; i < _colCount; i++) {
-			if (_array.getAt(i) > additionalRow) {
-				additionalRow = _array.getAt(i);
-			}
-		}
-		_rowCount = _currentRow + additionalRow;
-	}
-
-	/**
-	 * 
-	 */
-	public void finishRowGroup() {
-        // TODO: does nothing; only called in one places
-	}
-
-	/**
-	 * @return the row count
-	 */
-	public int getRowCount() {
-		return _rowCount;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/TableItemInfo.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/TableItemInfo.java
deleted file mode 100644
index 9f39064..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/TableItemInfo.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout.table;
-
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.layout.ICSSFigure;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-/*package*/ class TableItemInfo 
-{
-	private ICSSFigure _figure;
-
-	/**
-	 * @param figure 
-	 */
-	public TableItemInfo(ICSSFigure figure) {
-		_figure = figure;
-	}
-
-	/**
-	 * @return the figure
-	 */
-	public ICSSFigure getFigure() {
-		return _figure;
-	}
-
-	/**
-	 * @return the style
-	 */
-	public ICSSStyle getStyle() {
-		return _figure.getCSSStyle();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/TableRowGroupInfo.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/TableRowGroupInfo.java
deleted file mode 100644
index 98a9c1b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/TableRowGroupInfo.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout.table;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.layout.CSSFigure;
-import org.eclipse.jst.pagedesigner.css2.layout.ICSSFigure;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-/*package*/ class TableRowGroupInfo extends TableItemInfo {
-	List _rowList = new ArrayList();
-
-	private int _rowIndex;
-
-	private int _rowCount;
-
-	/**
-	 * @param figure
-	 */
-	public TableRowGroupInfo(ICSSFigure figure) {
-		super(figure);
-	}
-
-	List getRowList() {
-		return _rowList;
-	}
-
-	int getRowIndex() {
-		return _rowIndex;
-	}
-
-	int getRowCount() {
-		return this._rowCount;
-	}
-
-	/**
-	 * @param context
-	 */
-	public void calculateRowGroup(TableInfoContext context) {
-		this._rowIndex = context.getCurrentRow();
-		List children = getFigure().getChildren();
-		for (int i = 0, size = children.size(); i < size; i++) {
-			IFigure childfigure = (IFigure) children.get(i);
-			if (childfigure instanceof ICSSFigure) {
-				ICSSStyle childstyle = ((ICSSFigure) childfigure).getCSSStyle();
-				if (childstyle != null
-						&& "table-row" //$NON-NLS-1$
-								.equalsIgnoreCase(childstyle.getDisplay())) {
-					TableRowInfo rowInfo = new TableRowInfo(
-							(ICSSFigure) childfigure);
-					_rowList.add(rowInfo);
-					rowInfo.calculateRow(context);
-				} else {
-					// skip
-				}
-			} else {
-				// skip
-			}
-		}
-		context.finishRowGroup();
-		this._rowCount = context.getCurrentRow() - this._rowIndex;
-	}
-
-	/**
-	 * @param _cells
-	 */
-	public void getCells(List _cells) {
-		for (int i = 0, size = _rowList.size(); i < size; i++) {
-			TableRowInfo rowInfo = (TableRowInfo) _rowList.get(i);
-			rowInfo.getCells(_cells);
-		}
-	}
-
-	/**
-	 * @param figure
-	 * @return the table row info
-	 */
-	public TableRowInfo findRowInfo(CSSFigure figure) {
-		for (int i = 0, size = _rowList.size(); i < size; i++) {
-			TableRowInfo rowInfo = (TableRowInfo) _rowList.get(i);
-			if (figure == rowInfo.getFigure()) {
-				return rowInfo;
-			}
-		}
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/TableRowInfo.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/TableRowInfo.java
deleted file mode 100644
index 8083cf8..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/TableRowInfo.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout.table;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.layout.CSSFigure;
-import org.eclipse.jst.pagedesigner.css2.layout.ICSSFigure;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.css2.value.Length;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-/*package*/ class TableRowInfo extends TableItemInfo {
-	List _cells = new ArrayList();
-
-	int _rowIndex;
-
-	private int _rowHeight;
-
-	/**
-	 * @param figure
-	 */
-	public TableRowInfo(ICSSFigure figure) {
-		super(figure);
-	}
-
-	List getCells() {
-		return _cells;
-	}
-
-	int getRowIndex() {
-		return _rowIndex;
-	}
-
-	int getSpecifiedRowHeight() {
-		return _rowHeight;
-	}
-
-	/**
-	 * @param context
-	 */
-	public void calculateRow(TableInfoContext context) {
-		this._rowIndex = context.getCurrentRow();
-
-		List children = getFigure().getChildren();
-		for (int i = 0, size = children.size(); i < size; i++) {
-			IFigure childfigure = (IFigure) children.get(i);
-			if (childfigure instanceof ICSSFigure) {
-				ICSSStyle childstyle = ((ICSSFigure) childfigure).getCSSStyle();
-				if (childstyle != null) {
-					String display = childstyle.getDisplay();
-					if ("table-cell".equalsIgnoreCase(display)) { //$NON-NLS-1$
-						TableCellInfo cellInfo = new TableCellInfo(
-								(ICSSFigure) childfigure);
-						cellInfo.calculateCellInfo(context);
-						_cells.add(cellInfo);
-					} else {
-						// skip
-					}
-				}
-			} else {
-				// skip
-			}
-		}
-		// ok, we have finished a row
-		context.finishRow();
-	}
-
-	/**
-	 * @param cells
-	 */
-	public void getCells(List cells) {
-		cells.addAll(this._cells);
-	}
-
-	/**
-	 * @param figure
-	 * @return the table cell info
-	 */
-	public TableCellInfo getCellInfo(CSSFigure figure) {
-		for (int i = 0, size = _cells.size(); i < size; i++) {
-			TableCellInfo cellinfo = (TableCellInfo) _cells.get(i);
-			if (cellinfo.getFigure() == figure) {
-				return cellinfo;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * @param info
-	 * @param tableHeight
-	 */
-	public void calculateHeight(TableInfo info, int tableHeight) {
-		ICSSStyle style = this.getFigure().getCSSStyle();
-		if (style == null) {
-			this._rowHeight = -1;
-		} else {
-			Object height = style.getStyleProperty(ICSSPropertyID.ATTR_HEIGHT);
-			Length recommendedHeight = (height instanceof Length) ? (Length) height
-					: null;
-
-			int rh = 0;
-			if (recommendedHeight == null || recommendedHeight.getValue() <= 0) {
-				rh = 0;
-			} else {
-				if (recommendedHeight.isPercentage()) {
-					// not supported.
-				} else {
-					rh = recommendedHeight.getValue();
-				}
-				if (rh > 0 && !style.isSizeIncludeBorderPadding()) {
-					rh += style.getBorderInsets().getHeight()
-							+ style.getPaddingInsets().getHeight();
-				}
-			}
-			this._rowHeight = rh;
-		}
-
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/CSSHtmlListStyleData.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/CSSHtmlListStyleData.java
deleted file mode 100644
index e559433..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/CSSHtmlListStyleData.java
+++ /dev/null
@@ -1,174 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.list;
-
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * @author mengbo
- */
-public class CSSHtmlListStyleData {
-	/**
-	 * Image
-	 */
-	public final static int LIST_T_IMAGE = 0;
-
-	/**
-	 * Disc
-	 */
-	public final static int LIST_T_DISC = 1;
-
-	/**
-	 * Circle
-	 */
-	public final static int LIST_T_CIRCLE = 2;
-
-	/**
-	 * Square
-	 */
-	public final static int LIST_T_SQUARE = 3;
-
-	/**
-	 * Decimal
-	 */
-	public final static int LIST_T_DECIMAL = 0x11;
-
-	/**
-	 * Decimial w/ leading zero
-	 */
-	public final static int LIST_T_DECIMAL_LEADING_ZERO = 0x12;
-
-	/**
-	 * Lower alpha
-	 */
-	public final static int LIST_T_LOWER_ALPHA = 0x13;
-
-	/**
-	 * Lower Roman
-	 */
-	public final static int LIST_T_LOWER_ROMAN = 0x14;
-
-	/**
-	 * Upper alpha
-	 */
-	public final static int LIST_T_UPPER_ALPHA = 0x15;
-
-	/**
-	 * Upper Roman
-	 */
-	public final static int LIST_T_UPPER_ROMAN = 0x16;
-
-	//private CSSMarkerStyleData _markerStyleData;
-
-	private Image _markerImage;
-
-	private int _type;
-
-	/**
-	 * @return if is a default picture type
-	 */
-	public boolean isDefaultPicture() {
-		return (_type & 0xf) != 0;
-	}
-
-	private String getResolvedURL() {
-		//String textValue = _markerStyleData.getTextContent();
-		// TODO: when I found this, resolver was not being set and would either
-        // have thrown NPE or returned "".. so I've "improved it :)
-        //URIResolver resolver = null;// FIXME: this is not implemented yet.
-		// DesignerPropertyTool.getModel().getResolver();
-		//if (textValue != null && textValue.length() > 0) {
-		//	return resolver.getLocationByURI(textValue);
-		//}
-		return ""; //$NON-NLS-1$
-	}
-
-	/**
-	 * @return Returns the markerImage.
-	 */
-	public Image getMarkerImage() {
-		if (!this.isImage()) {
-			return null;
-		}
-		if (_markerImage == null) {
-			String uri = this.getResolvedURL();
-			_markerImage = new Image(null, uri);
-		}
-		return _markerImage;
-	}
-
-	/**
-	 * @return Returns the type.
-	 */
-	public int getType() {
-		return _type;
-	}
-
-	/**
-	 * @param type
-	 */
-	public void setType(String type) {
-
-		this._type = toTypeInt(type);
-	}
-
-	/**
-	 * @param index 
-	 * @return Returns the markerString.
-	 */
-	public String getTextValue(int index) {
-		if (!this.isText()) {
-			return null;
-		}
-		// ICounter counter = CounterFactory.getInstance().getCounter(_type);
-		return ""; //$NON-NLS-1$
-
-	}
-
-	/**
-	 * @return true if is a text type
-	 */
-	public boolean isText() {
-		return (_type & 0xf0) != 0;
-	}
-
-	/**
-	 * @return true if is an image type
-	 */
-	public boolean isImage() {
-		return (_type == LIST_T_IMAGE);
-	}
-
-	/**
-	 * @param type
-	 * @return convert the 'type' String to one of LIST_T_*
-	 */
-	public static int toTypeInt(String type) {
-		if (type.equalsIgnoreCase(ICSSPropertyID.VAL_DECIMAL)) {
-			return LIST_T_DECIMAL;
-		} else if (type
-				.equalsIgnoreCase(ICSSPropertyID.VAL_DECIMAL_LEADING_ZERO)) {
-			return LIST_T_DECIMAL_LEADING_ZERO;
-		} else if (type.equalsIgnoreCase(ICSSPropertyID.VAL_DISC)) {
-			return LIST_T_DISC;
-		} else if (type.equalsIgnoreCase(ICSSPropertyID.VAL_CIRCLE)) {
-			return LIST_T_CIRCLE;
-		} else if (type.equalsIgnoreCase(ICSSPropertyID.VAL_SQUARE)) {
-			return LIST_T_SQUARE;
-		} else if (type.equalsIgnoreCase(ICSSPropertyID.VAL_IMAGE)) {
-			return LIST_T_IMAGE;
-		}
-
-		return 0;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/CSSMarkerStyleData.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/CSSMarkerStyleData.java
deleted file mode 100644
index 0383b52..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/CSSMarkerStyleData.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.list;
-
-import java.util.Vector;
-
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-
-/**
- * @author mengbo
- */
-public class CSSMarkerStyleData {
-	private Vector _content;
-
-	private String _textContent;
-
-	private int _Offset;
-
-	private boolean _isOutside;
-
-	/**
-	 * @return Returns the isBefore.
-	 */
-	public boolean isOutside() {
-		return _isOutside;
-	}
-
-	/**
-	 * @param position
-	 *            The isBefore to set.
-	 */
-	public void setPosition(String position) {
-		if (position == ICSSPropertyID.VAL_INSIDE) {
-			_isOutside = false;
-		} else if (position == ICSSPropertyID.VAL_OUTSIDE) {
-			_isOutside = true;
-		}
-	}
-
-	/**
-	 * @return Returns the _Offset.
-	 */
-	public int getOffset() {
-		return _Offset;
-	}
-
-	/**
-	 * @param offset
-	 *            The _Offset to set.
-	 */
-	public void setOffset(int offset) {
-		_Offset = offset;
-	}
-
-	/**
-	 * @return Returns the _textValue.
-	 */
-	public String getTextContent() {
-		return _textContent;
-	}
-
-	/**
-	 * @param value
-	 *            The _textValue to set.
-	 */
-	public void setTextContent(String value) {
-		_textContent = value;
-	}
-
-	/**
-	 * @return the next element.  removes it from the content vector.  Returns
-	 * null if the content is empty
-	 */
-	public Object getNextElement() {
-		if (_content == null || _content.size() == 0) {
-			return null;
-		}
-		return _content.remove(0);
-	}
-
-	/**
-	 * @param content
-	 */
-	public void setContent(Vector content) {
-		_content = content;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/ContentObject.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/ContentObject.java
deleted file mode 100644
index ad32149..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/ContentObject.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.list;
-
-/**
- * A simple template objec, when we resole content in detail, we will create
- * more complicated object reference structure.
- * 
- * @author mengbo
- */
-public class ContentObject {
-	private ICounterValueGenerator _counter;
-
-	/**
-	 * @return Returns the _counter.
-	 */
-	public ICounterValueGenerator getCounter() {
-		return _counter;
-	}
-
-	/**
-	 * @param counter
-	 *            The _counter to set.
-	 */
-	public void setCounter(ICounterValueGenerator counter) {
-		this._counter = counter;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/CounterHelper.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/CounterHelper.java
deleted file mode 100644
index b6913d7..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/CounterHelper.java
+++ /dev/null
@@ -1,280 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.list;
-
-import java.util.HashMap;
-import java.util.List;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyMeta;
-import org.eclipse.wst.css.core.internal.provisional.document.ICSSPrimitiveValue;
-import org.w3c.dom.css.CSSPrimitiveValue;
-
-/**
- * @author mengbo
- */
-public final class CounterHelper {
-	/**
-	 * Image
-	 */
-	public final static int LIST_T_IMAGE = 0;
-
-	/**
-	 * Disc
-	 */
-	public final static int LIST_T_DISC = 1;
-
-	/**
-	 * Circle
-	 */
-	public final static int LIST_T_CIRCLE = 2;
-
-	/**
-	 * Square
-	 */
-	public final static int LIST_T_SQUARE = 3;
-
-	/**
-	 * Decimal
-	 */
-	public final static int LIST_T_DECIMAL = 0x11;
-
-	/**
-	 * Leading-zero decimal
-	 */
-	public final static int LIST_T_DECIMAL_LEADING_ZERO = 0x12;
-
-	/**
-	 * Lower alpha
-	 */
-	public final static int LIST_T_LOWER_ALPHA = 0x13;
-
-	/**
-	 * Lower roman
-	 */
-	public final static int LIST_T_LOWER_ROMAN = 0x14;
-
-	/**
-	 * Upper alpha
-	 */
-	public final static int LIST_T_UPPER_ALPHA = 0x15;
-
-	/**
-	 * Upper roman
-	 */
-	public final static int LIST_T_UPPER_ROMAN = 0x16;
-
-	/**
-	 * Lower greek
-	 */
-	public final static int LIST_T_LOWER_GREEK = 0x21;
-
-	/**
-	 * Armenian
-	 */
-	public final static int LIST_T_ARMENIAN = 0x22;
-
-	/**
-	 * Georgian
-	 */
-	public final static int LIST_T_GEORGIAN = 0x23;
-
-	/**
-	 * None
-	 */
-	public final static int LIST_T_NONE = 0x24;
-	/**
-	 * @param style
-	 * @param counters
-	 */
-	public static void processCounterReset(ICSSStyle style, HashMap counters) {
-		Assert.isTrue(style != null && counters != null);
-		// counter-reset will create new one.
-		Object counterResets = style
-				.getStyleProperty(ICSSPropertyID.ATTR_COUNTER_RESET);
-		if ((counterResets) != null
-				&& counterResets != ICSSPropertyMeta.NOT_SPECIFIED) {
-			if (counterResets instanceof List) {
-				List crList = (List) counterResets;
-				for (int i = 0, n = crList.size(); i < n; i++) {
-					ResetObject rObject = (ResetObject) crList.get(i);
-					String name = rObject.getCounterName();
-					Object counter = null;
-					if (counters.size() > 0 && counters.containsKey(name)) {
-						// Already resolved
-						counter = counters.get(name);
-					}
-					if (counter != null) {
-						if (rObject.getInitial() != null) {
-							((ICounterValueGenerator) counter)
-									.resetCount(rObject.getInitial().intValue());
-						} else {
-							counter = ((ICounterValueGenerator) counter)
-									.resetCount();
-						}
-						counters.put(((ICounterValueGenerator) counter)
-								.getIdentifier(), counter);
-					} else {
-						// create new one
-						Object listStyle = style
-								.getStyleProperty(ICSSPropertyID.ATTR_LIST_STYLE_TYPE);
-						if (listStyle instanceof String) {
-							counter = new CounterValueGenerator(name,
-									(String) listStyle, null, style);
-							if (rObject.getInitial() != null) {
-								((ICounterValueGenerator) counter)
-										.resetCount(rObject.getInitial()
-												.intValue());
-							} else {
-								counter = ((ICounterValueGenerator) counter)
-										.resetCount();
-							}
-						}
-						counters.put(((ICounterValueGenerator) counter)
-								.getIdentifier(), counter);
-					}
-				}
-			}
-		}
-	}
-
-	/**
-	 * @param style
-	 */
-	public static void processCounterIncrement(ICSSStyle style) {
-		Object counterIncrements = style
-				.getStyleProperty(ICSSPropertyID.ATTR_COUNTER_INCREMENT);
-		if (counterIncrements != null
-				&& counterIncrements != ICSSPropertyMeta.NOT_SPECIFIED) {
-			if (counterIncrements instanceof List) {
-				List crList = (List) counterIncrements;
-				for (int i = 0, n = crList.size(); i < n; i++) {
-					IncrementObject rObject = (IncrementObject) crList.get(i);
-					String name = rObject.getCounterName();
-					Object counter = null;
-					counter = style.findCounter(name, true);
-					if (counter != null) {
-						if (HTMLListInfoHelper.getValueInt(style) == null) {
-							if (rObject.getIncrement() != null) {
-								((ICounterValueGenerator) counter)
-										.increase(rObject.getIncrement()
-												.intValue());
-							} else {
-								((ICounterValueGenerator) counter).increase();
-							}
-						} else {
-							((ICounterValueGenerator) counter)
-									.setCount(HTMLListInfoHelper
-											.getValueInt(style));
-						}
-					}
-				}
-			}
-		}
-	}
-
-	/**
-	 * @param style
-	 * @return true if the style is a text style
-	 */
-	public static boolean isText(ICSSStyle style) {
-		String display = style.getDisplay();
-		Object styleType = style
-				.getStyleProperty(ICSSPropertyID.ATTR_LIST_STYLE_TYPE);
-		return (display
-				.equalsIgnoreCase(ICSSPropertyID.VAL_LIST_ITEM) //
-				&& styleType instanceof String //
-		&& !CounterValueGenerator.NON_STRING_TYPES.contains(styleType));
-	}
-
-	/**
-	 * @param style
-	 * @return the type of the style.  One of the LIST_T_* values, or -1 if the
-	 * style is unknown
-	 */
-	public static int getType(ICSSStyle style) {
-		Object type = style
-				.getStyleProperty(ICSSPropertyID.ATTR_LIST_STYLE_TYPE);
-		if (type instanceof String) {
-			return toTypeInt((String) type);
-		}
-        return -1;
-	}
-
-	/**
-	 * @param type
-	 * @return the type enumeration for the  type string
-	 */
-	public static int toTypeInt(String type) {
-
-		if (type.equalsIgnoreCase(ICSSPropertyID.VAL_DECIMAL)) {
-			return LIST_T_DECIMAL;
-		} else if (type
-				.equalsIgnoreCase(ICSSPropertyID.VAL_DECIMAL_LEADING_ZERO)) {
-			return LIST_T_DECIMAL_LEADING_ZERO;
-		} else if (type.equalsIgnoreCase(ICSSPropertyID.VAL_DISC)) {
-			return LIST_T_DISC;
-		} else if (type.equalsIgnoreCase(ICSSPropertyID.VAL_CIRCLE)) {
-			return LIST_T_CIRCLE;
-		} else if (type.equalsIgnoreCase(ICSSPropertyID.VAL_SQUARE)) {
-			return LIST_T_SQUARE;
-		} else if (type.equalsIgnoreCase(ICSSPropertyID.VAL_IMAGE)) {
-			return LIST_T_IMAGE;
-		} else if (type.equalsIgnoreCase(ICSSPropertyID.VAL_UPPER_LATIN)) {
-			return LIST_T_UPPER_ALPHA;
-		} else if (type.equalsIgnoreCase(ICSSPropertyID.VAL_UPPER_ALPHA)) {
-			return LIST_T_UPPER_ALPHA;
-		} else if (type.equalsIgnoreCase(ICSSPropertyID.VAL_LOWER_LATIN)) {
-			return LIST_T_LOWER_ALPHA;
-		} else if (type.equalsIgnoreCase(ICSSPropertyID.VAL_LOWER_ALPHA)) {
-			return LIST_T_LOWER_ALPHA;
-		} else if (type.equalsIgnoreCase(ICSSPropertyID.VAL_UPPER_ROMAN)) {
-			return LIST_T_UPPER_ROMAN;
-		} else if (type.equalsIgnoreCase(ICSSPropertyID.VAL_LOWER_ROMAN)) {
-			return LIST_T_LOWER_ROMAN;
-		} else if (type.equalsIgnoreCase(ICSSPropertyID.VAL_LOWER_GREEK)) {
-			return LIST_T_LOWER_GREEK;
-		} else if (type.equalsIgnoreCase(ICSSPropertyID.VAL_ARMENIAN)) {
-			return LIST_T_ARMENIAN;
-		} else if (type.equalsIgnoreCase(ICSSPropertyID.VAL_GEORGIAN)) {
-			return LIST_T_GEORGIAN;
-		} else if (type.equalsIgnoreCase(ICSSPropertyID.VAL_NONE)) {
-			return LIST_T_NONE;
-		}
-		return 0;
-	}
-
-	/**
-	 * @param cssValue
-	 * @return true if the cssValue is an IDENT
-	 */
-	public static boolean isIdentifier(Object cssValue) {
-		return (cssValue instanceof ICSSPrimitiveValue)
-				&& ((ICSSPrimitiveValue) cssValue).getPrimitiveType() == CSSPrimitiveValue.CSS_IDENT;
-	}
-
-	/**
-	 * @param cssValue
-	 * @return true if the css value is a number
-	 */
-	public static boolean isNumber(Object cssValue) {
-		return cssValue instanceof ICSSPrimitiveValue
-				&& ((ICSSPrimitiveValue) cssValue).getPrimitiveType() == ICSSPrimitiveValue.CSS_INTEGER;
-	}
-	
-	private  CounterHelper()
-	{
-	    //  util class; no instantiation
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/CounterValueGenerator.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/CounterValueGenerator.java
deleted file mode 100644
index 326b188..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/CounterValueGenerator.java
+++ /dev/null
@@ -1,446 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.list;
-
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyMeta;
-
-/**
- * The counter is used to generate automatic conters and numbering for list
- * item. XXX: what do we deal with psedo? and we need to refer to web tools
- * content to consult for style content.
- * 
- * @author mengbo
- */
-public class CounterValueGenerator implements ICounterValueGenerator {
-	private final static int DEFAULT_INITIAL_VALUE = 0;
-
-	private static final Set STRING_TYPES = new HashSet();
-
-	static final Set NON_STRING_TYPES = new HashSet();
-	static {
-		NON_STRING_TYPES.add("disc"); //$NON-NLS-1$
-		NON_STRING_TYPES.add("circle"); //$NON-NLS-1$
-		NON_STRING_TYPES.add("square"); //$NON-NLS-1$
-		STRING_TYPES.add("decimal"); //$NON-NLS-1$
-		STRING_TYPES.add("decimal-leading-zero"); //$NON-NLS-1$
-		STRING_TYPES.add("lower-roman"); //$NON-NLS-1$
-		STRING_TYPES.add("upper-roman"); //$NON-NLS-1$
-		STRING_TYPES.add("lower-greek"); //$NON-NLS-1$
-		STRING_TYPES.add("lower-alpha"); //$NON-NLS-1$
-		STRING_TYPES.add("lower-latin"); //$NON-NLS-1$
-		STRING_TYPES.add("upper-alpha"); //$NON-NLS-1$
-		STRING_TYPES.add("upper-latin"); //$NON-NLS-1$
-		STRING_TYPES.add("hebrew"); //$NON-NLS-1$
-		STRING_TYPES.add("armenian"); //$NON-NLS-1$
-		STRING_TYPES.add("georgian"); //$NON-NLS-1$
-		STRING_TYPES.add("cjk-ideographic"); //$NON-NLS-1$
-		STRING_TYPES.add("hiragana"); //$NON-NLS-1$
-		STRING_TYPES.add("katakana"); //$NON-NLS-1$
-		STRING_TYPES.add("hiragana-iroha"); //$NON-NLS-1$
-		STRING_TYPES.add("katakana-iroha"); //$NON-NLS-1$
-	}
-
-	private final static int DEFAULT_INCREMENT = 1;
-
-	private boolean _first = true;
-
-	private Integer _initial;
-
-	private List _visitors;
-
-	private int _count;
-
-	private String _identifier;
-
-	private String _styleType;
-
-	private String _seperator;
-
-	private ICSSStyle _style;
-
-	/**
-	 * @param identifier
-	 * @param styleType
-	 * @param seperator
-	 * @param style
-	 */
-	public CounterValueGenerator(String identifier, String styleType,
-			String seperator, ICSSStyle style) {
-		_identifier = identifier;
-		_styleType = styleType;
-		_seperator = seperator;
-		_style = style;
-		if (HTMLListInfoHelper.getStartInt(style) != null) {
-			_count = HTMLListInfoHelper.getStartInt(style).intValue();
-		} else {
-			_count = DEFAULT_INITIAL_VALUE;
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.w3c.dom.css.Counter#getIdentifier()
-	 */
-	public String getIdentifier() {
-		return _identifier;
-	}
-
-	/**
-	 * @return the style  type 
-	 * @see org.w3c.dom.css.Counter#getListStyle()
-	 */
-	public String getListStyle() {
-		return _styleType;
-	}
-
-	/**
-	 * @return the separator
-	 * 
-	 * @see org.w3c.dom.css.Counter#getSeparator()
-	 */
-	public String getSeparator() {
-		return _seperator;
-	}
-
-	// /**
-	// * @return Returns the type.
-	// */
-	// public String getType()
-	// {
-	// return _styleType;
-	// }
-
-	// /**
-	// * @return Returns the markerString.
-	// */
-	// public String getTextValue()
-	// {
-	// Assert.isTrue(this.isText());
-	// _index = getDeclaredIndex();
-	// Node container = findParentComtainer();
-	// if (container == null)
-	// {
-	// // what condition?
-	// return "";
-	// }
-	// String exp = "";
-	// int startIndex = getStartIndex(container);
-	// int maxLength = calculateMaxlength(container, 0) + startIndex - 1;
-	// Assert.isTrue(maxLength > 0);
-	// if (_index == -1)
-	// {
-	// // no declared value
-	// calculateIndex(container);
-	// Assert.isTrue(_index > -1);
-	// exp = Integer.toString(_index + startIndex);
-	// }
-	// else
-	// {
-	// exp = Integer.toString(_index);
-	// }
-	// if (getType() == CounterHelper.LIST_T_DECIMAL)
-	// {
-	// exp = appendSuffix(exp, Integer.toString(maxLength).length() -
-	// exp.length());
-	// }
-	// else if (getType() == CounterHelper.LIST_T_DECIMAL_LEADING_ZERO)
-	// {
-	// exp = addPrefix(exp, maxLength - exp.length());
-	// }
-	// return exp + ".";
-	//
-	// }
-
-	// private String addPrefix(String exp, int length)
-	// {
-	// while (length > 0)
-	// {
-	// exp = "0" + exp;
-	// length--;
-	// }
-	// return exp;
-	// }
-	//
-	// private String appendSuffix(String exp, int length)
-	// {
-	// while (length > 0)
-	// {
-	// exp = exp + " ";
-	// length--;
-	// }
-	// return exp;
-	// }
-
-	// private boolean calculateIndex(Node node)
-	// {
-	// if (node == _node)
-	// {
-	// _index++;
-	// return true;
-	// }
-	// String name = node.getNodeName();
-	// if (name != null && name.equalsIgnoreCase("li"))
-	// {
-	// _index++;
-	// }
-	// if (!node.hasChildNodes())
-	// {
-	// return false;
-	// }
-	// node = node.getFirstChild();
-	// while (node != null)
-	// {
-	// name = node.getNodeName();
-	// if (name != null && !(name.equalsIgnoreCase("ul") ||
-	// name.equalsIgnoreCase("ol")))
-	// {
-	// if (calculateIndex(node))
-	// {
-	// return true;
-	// }
-	// }
-	// node = node.getNextSibling();
-	// }
-	// return false;
-	// }
-
-	// This method may be refered for the zero-leading calculation.
-	// private int calculateMaxlength(Node node, int index)
-	// {
-	// String name = node.getNodeName();
-	// if (name != null && name.equalsIgnoreCase("li"))
-	// {
-	// index++;
-	// }
-	// if (!node.hasChildNodes())
-	// {
-	// return index;
-	// }
-	// node = node.getFirstChild();
-	// while (node != null)
-	// {
-	// name = node.getNodeName();
-	// if (name != null && !(name.equalsIgnoreCase("ul") ||
-	// name.equalsIgnoreCase("ol")))
-	// {
-	// index = calculateMaxlength(node, index);
-	// }
-	// node = node.getNextSibling();
-	// }
-	// return index;
-	// }
-	//
-
-	// private int getStartIndex(Node container)
-	// {
-	// String value = ((Element) container).getAttribute("start");
-	// try
-	// {
-	// int index = Integer.parseInt(value);
-	// if (index < 0)
-	// {
-	// return 1;
-	// }
-	// return index;
-	// }
-	// catch (Exception e)
-	// {
-	// return 1;
-	// }
-	// }
-
-	// private boolean isStringTyped(ICSSStyle style)
-	// {
-	// style.getStyleProperty("list-style-type");
-	// return true;
-	// }
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Object#clone()
-	 */
-	protected Object clone() throws CloneNotSupportedException {
-		CounterValueGenerator newInstance = new CounterValueGenerator(
-				_identifier, _styleType, _seperator, _style);
-		return newInstance;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.list.Counter2#increase()
-	 */
-	public void increase(int increment) {
-		if (!_first || HTMLListInfoHelper.getStartInt(_style) == null) {
-			_count += increment;
-		}
-		_first = false;
-	}
-
-	public void increase() {
-		increase(DEFAULT_INCREMENT);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.list.Counter2#setCount()
-	 */
-	public ICounterValueGenerator resetCount() {
-		try {
-			ICounterValueGenerator counter = (ICounterValueGenerator) this
-					.clone();
-			_initial = null;
-			_count = HTMLListInfoHelper.getStartInt(_style) != null ? HTMLListInfoHelper
-					.getStartInt(_style).intValue()
-					: DEFAULT_INITIAL_VALUE;
-			return counter;
-		} catch (CloneNotSupportedException e) {
-			return null;
-		}
-	}
-
-	/**
-	 * @return Returns the _initial.
-	 */
-	public int getInitial() {
-		if (HTMLListInfoHelper.getStartInt(_style) != null) {
-			return HTMLListInfoHelper.getStartInt(_style).intValue();
-		}
-        return _initial != null ? _initial.intValue()
-        		: DEFAULT_INITIAL_VALUE;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.list.Counter2#setCount()
-	 */
-	public ICounterValueGenerator resetCount(int initial) {
-		try {
-			CounterValueGenerator counter = (CounterValueGenerator) this
-					.clone();
-			_initial = new Integer(initial);
-			_count = initial;
-			return counter;
-		} catch (CloneNotSupportedException e) {
-			return null;
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.list.ICounterValueGenerator#setCount(org.eclipse.jst.pagedesigner.css2.list.HTMLListInfo)
-	 */
-	public void setCount(Integer value) {
-		if (value != null) {
-			_count = value.intValue();
-			_first = false;
-		}
-	}
-
-	// /**
-	// * The clients of this counter need to regist them.
-	// *
-	// * @see
-	// org.eclipse.jst.pagedesigner.css2.list.Counter2#regist(java.lang.Object)
-	// */
-	// public void regist(Object caller)
-	// {
-	// Assert.isTrue(caller instanceof ICSSStyle);
-	// if (_visitors == null)
-	// {
-	// _visitors = new LinkedList();
-	// }
-	// if (!_visitors.contains(caller))
-	// {
-	// _visitors.add(caller);
-	// }
-	// }
-	//
-	// /**
-	// * (non-Javadoc)
-	// *
-	// * @see
-	// org.eclipse.jst.pagedesigner.css2.list.Counter2#unregist(java.lang.Object)
-	// */
-	// public void unregist(Object caller)
-	// {
-	// if (_visitors.contains(caller))
-	// {
-	// _visitors.remove(caller);
-	// }
-	// }
-
-	/**
-	 * Return the int value.
-	 * 
-	 * @author mengbo
-	 */
-	public int getCurrentCount() {
-		return _count;
-	}
-
-	/**
-	 * Currently we recalculate the count, to enhance the performance, we may
-	 * use _count, but this requires delicate synchronization when the
-	 * calculation is looped.
-	 */
-	public Integer getCount(Object oCaller) {
-		Assert.isTrue(oCaller instanceof ICSSStyle && _visitors != null
-				&& _visitors.size() > 0);
-		ICSSStyle caller = (ICSSStyle) oCaller;
-		if (!_visitors.contains(caller)) {
-			return null;
-		}
-		int result = getInitial();
-
-		for (int i = 0, n = _visitors.size(); i < n; i++) {
-			ICSSStyle style = (ICSSStyle) _visitors.get(i);
-			// get the count;
-			Object counterIncrements = style
-					.getStyleProperty(ICSSPropertyID.ATTR_COUNTER_INCREMENT);
-			if (counterIncrements != null
-					&& counterIncrements != ICSSPropertyMeta.NOT_SPECIFIED) {
-				if (counterIncrements instanceof List) {
-					List crList = (List) counterIncrements;
-					for (int j = 0, nn = crList.size(); j < nn; j++) {
-						IncrementObject rObject = (IncrementObject) crList
-								.get(j);
-						String name = rObject.getCounterName();
-						if (getIdentifier().equalsIgnoreCase(name)) {
-							if (rObject.getIncrement() != null) {
-								result += rObject.getIncrement().intValue();
-							} else {
-								result += DEFAULT_INCREMENT;
-							}
-						}
-					}
-				}
-			}
-			if (style == caller) {
-				return new Integer(result);
-			}
-		}
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/HTMLListInfoHelper.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/HTMLListInfoHelper.java
deleted file mode 100644
index c352f96..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/HTMLListInfoHelper.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.list;
-
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.style.AbstractStyle;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * Resolve the attrbites 'start' on 'ol' and 'value' on 'li'.
- * 
- * @author mengbo
- */
-/*package*/ final class HTMLListInfoHelper {
-	/**
-	 * @return Returns the start.
-	 */
-	private static String getStart(ICSSStyle _style) {
-		if (_style instanceof AbstractStyle) {
-			Element element = ((AbstractStyle) _style).getElement();
-			Node parent = null;
-			if ((parent = EditModelQuery.getParent(IHTMLConstants.TAG_OL,
-					element, true)) != null) {
-				return ((Element) parent)
-						.getAttribute(IHTMLConstants.ATTR_START);
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * @param style
-	 * @return the start int
-	 */
-	public static Integer getStartInt(ICSSStyle style) {
-		try {
-			return new Integer(getStart(style));
-		} catch (Exception e) {
-			return null;
-		}
-	}
-
-	/**
-	 * @return Returns the value.
-	 */
-	private static String getValue(ICSSStyle _style) {
-		if (_style instanceof AbstractStyle) {
-			Element element = ((AbstractStyle) _style).getElement();
-			if (element != null) {
-				return element.getAttribute(IHTMLConstants.ATTR_VALUE);
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * @param style
-	 * @return the Integer value or null if not parsable
-	 */
-	public static Integer getValueInt(ICSSStyle style) {
-		try {
-			return Integer.valueOf(getValue(style));
-		} catch (NumberFormatException ex) {
-			return null;
-		}
-	}
-	
-	private HTMLListInfoHelper()
-	{
-	    // no external instantiation
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/ICounterValueGenerator.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/ICounterValueGenerator.java
deleted file mode 100644
index 67d0197..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/ICounterValueGenerator.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.list;
-
-/**
- * @author mengbo
- */
-public interface ICounterValueGenerator {
-	/**
-	 * @return the identifier
-	 */
-	public String getIdentifier();
-
-	/**
-	 * @param initial
-	 * @return the reset count
-	 */
-	public ICounterValueGenerator resetCount(int initial);
-
-	/**
-	 * @return the generator
-	 */
-	public ICounterValueGenerator resetCount();
-
-	/**
-	 * Set the counter based on value.
-	 * @param value 
-	 */
-	public void setCount(Integer value);
-
-	// public void regist(Object caller);
-	// public void unregist(Object caller);
-
-	/**
-	 * Increase counter based on declared increment number
-	 * @param increment 
-	 */
-	public void increase(int increment);
-
-	/**
-	 * Increase counter with default increment number(1)
-	 */
-	public void increase();
-
-	/**
-	 * @param caller
-	 * @return the count
-	 */
-	public Integer getCount(Object caller);
-
-	/**
-	 * @return the current count
-	 */
-	public int getCurrentCount();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/IIndexConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/IIndexConverter.java
deleted file mode 100644
index 5e220a1..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/IIndexConverter.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.list;
-
-/**
- * @author mengbo
- */
-public interface IIndexConverter {
-	/**
-	 * @param index
-	 * @return the string at index
-	 */
-	String getString(int index);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/IncrementObject.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/IncrementObject.java
deleted file mode 100644
index 71c9140..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/IncrementObject.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.list;
-
-/**
- * @author mengbo
- */
-public class IncrementObject {
-	private String _counterName;
-
-	private Integer _increment;
-
-	/**
-	 * @param name
-	 * @param increment
-	 */
-	public IncrementObject(String name, Integer increment) {
-		_counterName = name;
-		_increment = increment;
-	}
-
-	/**
-	 * @return Returns the _counterName.
-	 */
-	public String getCounterName() {
-		return _counterName;
-	}
-
-	/**
-	 * @param name
-	 *            The _counterName to set.
-	 */
-	public void setCounterName(String name) {
-		_counterName = name;
-	}
-
-	/**
-	 * @return Returns the _increment.
-	 */
-	public Integer getIncrement() {
-		return _increment;
-	}
-
-	/**
-	 * @param _increment
-	 *            The _increment to set.
-	 */
-	public void setIncrement(Integer _increment) {
-		this._increment = _increment;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/ListStyleUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/ListStyleUtil.java
deleted file mode 100644
index ccab58f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/ListStyleUtil.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.list;
-
-/**
- * @author mengbo
- */
-/*package*/ final class ListStyleUtil {
-	/**
-	 * @param type
-	 * @param index
-	 * @return the type as a string
-	 */
-	public static String convertTypeToString(int type, int index) {
-		if (type == CSSHtmlListStyleData.LIST_T_LOWER_ROMAN
-				|| type == CSSHtmlListStyleData.LIST_T_UPPER_ROMAN) {
-			// TODO: to implement roman.
-			// return decimalToRoman(index);
-		} else if (type == CSSHtmlListStyleData.LIST_T_DECIMAL
-				|| type == CSSHtmlListStyleData.LIST_T_DECIMAL_LEADING_ZERO) {
-			return Integer.toString(index);
-		}
-		return null;
-	}
-
-	private ListStyleUtil()
-	{
-	    // no instantiation
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/ResetObject.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/ResetObject.java
deleted file mode 100644
index 0cc1138..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/ResetObject.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.list;
-
-/**
- * @author mengbo
- */
-public class ResetObject {
-	private String _counterName;
-
-	private Integer _initial;
-
-	/**
-	 * @param name
-	 * @param initial
-	 */
-	public ResetObject(String name, Integer initial) {
-		_counterName = name;
-		_initial = initial;
-	}
-
-	/**
-	 * @return Returns the _counterName.
-	 */
-	public String getCounterName() {
-		return _counterName;
-	}
-
-	/**
-	 * @param name
-	 *            The _counterName to set.
-	 */
-	public void setCounterName(String name) {
-		_counterName = name;
-	}
-
-	/**
-	 * @return Returns the _increment.
-	 */
-	public Integer getInitial() {
-		return _initial;
-	}
-
-	/**
-	 * @param _initial
-	 *            The _increment to set.
-	 */
-	public void setInitial(Integer _initial) {
-		this._initial = _initial;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/marker/CounterFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/marker/CounterFactory.java
deleted file mode 100644
index 32dec84..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/marker/CounterFactory.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.marker;
-
-import org.eclipse.jst.pagedesigner.css2.list.CSSHtmlListStyleData;
-
-/**
- * @author mengbo
- */
-public class CounterFactory {
-	private static DecimalCounter _decimalCounterInstance;
-
-	private static RomanCounter _romanCounterInstance;
-
-	private static CounterFactory _instance;
-
-	/**
-	 * @return the factory singelton
-	 */
-	public static CounterFactory getInstance() {
-		if (_instance == null) {
-			_instance = new CounterFactory();
-		}
-		return _instance;
-	}
-
-	/**
-	 * @param type
-	 * @return the counter for type
-	 */
-	public ICounter getCounter(int type) {
-		switch (type) {
-		case CSSHtmlListStyleData.LIST_T_DECIMAL:
-		case CSSHtmlListStyleData.LIST_T_DECIMAL_LEADING_ZERO:
-			if (_decimalCounterInstance == null) {
-				_decimalCounterInstance = new DecimalCounter();
-			}
-			return _decimalCounterInstance;
-		case CSSHtmlListStyleData.LIST_T_LOWER_ROMAN:
-		case CSSHtmlListStyleData.LIST_T_UPPER_ROMAN:
-			if (_romanCounterInstance == null) {
-				_romanCounterInstance = new RomanCounter();
-			}
-			return _romanCounterInstance;
-		default:
-			return null;
-
-		}
-	}
-	
-	private CounterFactory()
-	{
-	    // singleton, no external instantiation
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/marker/CounterUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/marker/CounterUtil.java
deleted file mode 100644
index f22f17f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/marker/CounterUtil.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.marker;
-
-import org.eclipse.jst.pagedesigner.css2.list.CounterHelper;
-
-/**
- * @author mengbo
- */
-public final class CounterUtil {
-	/**
-	 * @param count
-	 * @param type
-	 * @return the converter count
-	 */
-	public static String convertCount(int count, int type) {
-		// XXX: currently we only support style that IE supported.for type that
-		// does not
-		// support we return an empty String.
-		StringBuffer buffer = new StringBuffer();
-		switch (type) {
-		case CounterHelper.LIST_T_DECIMAL:
-			buffer.append(count);
-			buffer.append('.');
-			break;
-		case CounterHelper.LIST_T_UPPER_ALPHA:
-		case CounterHelper.LIST_T_LOWER_ALPHA:
-			char charA = 'a';
-			if (type == CounterHelper.LIST_T_UPPER_ALPHA) {
-				charA = 'A';
-			}
-			int index = count;
-			while (index > 0 && index > 26) {
-				buffer.append((char) (charA + (index / 26) - 1));
-				index = index % 26;
-			}
-			buffer.append((char) (charA + (index - 1)));
-			buffer.append("."); //$NON-NLS-1$
-			break;
-		case CounterHelper.LIST_T_UPPER_ROMAN:
-		case CounterHelper.LIST_T_LOWER_ROMAN:
-			String string = new RomanCounter().getString(count);
-			if (type == CounterHelper.LIST_T_LOWER_ROMAN) {
-				buffer.append(string.toLowerCase());
-			} else {
-				buffer.append(string);
-			}
-			buffer.append("."); //$NON-NLS-1$
-			break;
-		case CounterHelper.LIST_T_ARMENIAN:
-			break;
-		case CounterHelper.LIST_T_DECIMAL_LEADING_ZERO:
-			break;
-		case CounterHelper.LIST_T_LOWER_GREEK:
-			break;
-		case CounterHelper.LIST_T_GEORGIAN:
-			break;
-		default:
-			break;
-		}
-		return buffer.toString();
-	}
-	
-	private CounterUtil()
-	{
-	    // no instantiation
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/marker/DecimalCounter.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/marker/DecimalCounter.java
deleted file mode 100644
index ddce690..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/marker/DecimalCounter.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.marker;
-
-import org.eclipse.jst.pagedesigner.css2.list.CSSHtmlListStyleData;
-
-/**
- * @author mengbo
- */
-/*package*/ class DecimalCounter extends EnumerableCounter 
-{
-	
-    DecimalCounter() 
-    {
-	    // do nothing; only nee
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.list.EnumerableCounter#getString(int)
-	 */
-	public String getNextString(int index, int type) {
-		//String result;
-		switch (type) {
-		case CSSHtmlListStyleData.LIST_T_DECIMAL:
-			return Integer.toString(index);
-
-		case CSSHtmlListStyleData.LIST_T_DECIMAL_LEADING_ZERO:
-			StringBuffer sb = new StringBuffer();
-			int count = 1;
-			for (int i = sb.length(); i < count; i++) {
-				sb.append('0');
-			}
-			sb.append(Integer.toString(index));
-			return sb.toString();
-		default:
-			return null;
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/marker/EnumerableCounter.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/marker/EnumerableCounter.java
deleted file mode 100644
index 3dfbef8..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/marker/EnumerableCounter.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.marker;
-
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-/**
- * @author mengbo
- */
-public abstract class EnumerableCounter implements ICounter {
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.list.ICounter#getNextObject(org.w3c.dom.Element,
-	 *      java.lang.String)
-	 */
-	public final Object getNextObject(Element element, int type) {
-		int index = calculateIndex(element);
-		return getNextString(index, type);
-	}
-
-	/**
-	 * @param element
-	 * @return the index of the element in its parent
-	 */
-	public final int calculateIndex(Element element) {
-		final String tag = element.getLocalName();
-		final Node parent = element.getParentNode();
-		final NodeList children = parent.getChildNodes();
-		int index = 1;
-		for (int i = 0; i < children.getLength(); i++) {
-			final Node child = children.item(i);
-			if (child == element) {
-				break;
-			}
-			if (child.getLocalName().equalsIgnoreCase(tag)) {
-				index++;
-			}
-		}
-		return index;
-	}
-
-	/**
-	 * @param index
-	 * @param type
-	 * @return the string for the next index
-	 */
-	public abstract String getNextString(int index, int type);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/marker/ICounter.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/marker/ICounter.java
deleted file mode 100644
index cc06af3..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/marker/ICounter.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.marker;
-
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- */
-public interface ICounter {
-	/**
-	 * @param element
-	 * @param type
-	 * @return the next object for element, type
-	 */
-	public Object getNextObject(Element element, int type);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/marker/RomanCounter.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/marker/RomanCounter.java
deleted file mode 100644
index f8a91bd..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/marker/RomanCounter.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.marker;
-
-import org.eclipse.jst.pagedesigner.css2.list.CSSHtmlListStyleData;
-
-/**
- * @author mengbo
- */
-/*package*/ class RomanCounter extends EnumerableCounter {
-	RomanCounter() 
-	{
-	    // do nothing
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.list.EnumerableCounter#getString(int,
-	 *      boolean)
-	 */
-	public String getNextString(int index, int type) {
-		switch (type) {
-		case CSSHtmlListStyleData.LIST_T_LOWER_ROMAN:
-			return getString(index).toLowerCase();
-		case CSSHtmlListStyleData.LIST_T_UPPER_ROMAN:
-			return getString(index);
-		default:
-			return null;
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.list.NumberCounter#getString(int)
-	 */
-	/*package*/ String getString(int index) {
-		// FIXME: Need to enhance more.
-		StringBuffer roman = new StringBuffer();
-		int a, b, c, d;
-		a = (index / 1000) * 1000;
-		b = ((index / 100) % 10) * 100;
-		c = ((index / 10) % 10) * 10;
-		d = ((index / 1) % 10) * 1;
-
-		if (a == 1000)
-			roman.append("M"); //$NON-NLS-1$
-		else if (a == 2000)
-			roman.append("MM"); //$NON-NLS-1$
-		else if (a == 3000)
-			roman.append("MMM"); //$NON-NLS-1$
-
-		if (b == 100)
-			roman.append("C"); //$NON-NLS-1$
-		else if (b == 200)
-			roman.append("CC"); //$NON-NLS-1$
-		else if (b == 300)
-			roman.append("CCC"); //$NON-NLS-1$
-		else if (b == 400)
-			roman.append("CD"); //$NON-NLS-1$
-		else if (b == 500)
-			roman.append("D"); //$NON-NLS-1$
-		else if (b == 600)
-			roman.append("DC"); //$NON-NLS-1$
-		else if (b == 700)
-			roman.append("DCC"); //$NON-NLS-1$
-		else if (b == 800)
-			roman.append("DCCC"); //$NON-NLS-1$
-		else if (b == 900)
-			roman.append("CM"); //$NON-NLS-1$
-
-		if (c == 10)
-			roman.append("X"); //$NON-NLS-1$
-		else if (c == 20)
-			roman.append("XX"); //$NON-NLS-1$
-		else if (c == 30)
-			roman.append("XXX"); //$NON-NLS-1$
-		else if (c == 40)
-			roman.append("XL"); //$NON-NLS-1$
-		else if (c == 50)
-			roman.append("L"); //$NON-NLS-1$
-		else if (c == 60)
-			roman.append("LX"); //$NON-NLS-1$
-		else if (c == 70)
-			roman.append("LXX"); //$NON-NLS-1$
-		else if (c == 80)
-			roman.append("LXXX"); //$NON-NLS-1$
-		else if (c == 90)
-			roman.append("XC"); //$NON-NLS-1$
-
-		if (d == 1)
-			roman.append("I"); //$NON-NLS-1$
-		else if (d == 2)
-			roman.append("II"); //$NON-NLS-1$
-		else if (d == 3)
-			roman.append("III"); //$NON-NLS-1$
-		else if (d == 4)
-			roman.append("IV"); //$NON-NLS-1$
-		else if (d == 5)
-			roman.append("V"); //$NON-NLS-1$
-		else if (d == 6)
-			roman.append("VI"); //$NON-NLS-1$
-		else if (d == 7)
-			roman.append("VII"); //$NON-NLS-1$
-		else if (d == 8)
-			roman.append("VIII"); //$NON-NLS-1$
-		else if (d == 9)
-			roman.append("IX"); //$NON-NLS-1$
-
-		return roman.toString();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/BackgroundColorMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/BackgroundColorMeta.java
deleted file mode 100644
index f738c47..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/BackgroundColorMeta.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.color.CSSColorManager;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.w3c.dom.Element;
-import org.w3c.dom.css.CSSValue;
-
-/**
- * @author mengbo
- */
-public class BackgroundColorMeta extends CSSPropertyMeta {
-	private static final String[] _keywords = new String[] { ICSSPropertyID.VAL_TRANSPARENT };
-
-	/**
-	 */
-	public BackgroundColorMeta() {
-		super(false, ICSSPropertyID.VAL_TRANSPARENT);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyMeta#calculateCSSValueResult(org.w3c.dom.css.CSSValue,
-	 *      java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.css2.property.AbstractStyle)
-	 */
-	public Object calculateCSSValueResult(CSSValue value, String propertyName,
-			ICSSStyle style) {
-		String text = value.getCssText();
-		Object result = CSSColorManager.getInstance().getColor(text);
-		if (result != null) {
-			return result;
-		}
-        return getInitialValue(propertyName, style);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#getKeywordValues()
-	 */
-	protected String[] getKeywordValues() {
-		return _keywords;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyMeta#calculateHTMLAttributeOverride(org.w3c.dom.Element,
-	 *      java.lang.String, java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.css2.ICSSStyle)
-	 */
-	public Object calculateHTMLAttributeOverride(Element element,
-			String htmltag, String propertyName, ICSSStyle style) {
-		Object result;
-		String colorAttr = null;
-		if (ICSSPropertyID.ATTR_BACKGROUND_COLOR.equalsIgnoreCase(propertyName)) {
-			colorAttr = DOMUtil.getAttributeIgnoreCase(element,
-					ICSSPropertyID.ATTR_BGCOLOR);
-		}
-		if (colorAttr != null && colorAttr.trim().length() != 0) {
-			colorAttr = colorAttr.trim();
-			result = CSSColorManager.getInstance().getColor(colorAttr);
-			return result;
-		}
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/BackgroundImageMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/BackgroundImageMeta.java
deleted file mode 100644
index ac1acac..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/BackgroundImageMeta.java
+++ /dev/null
@@ -1,182 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.css2.property;
-
-import java.net.MalformedURLException;
-import java.net.URI;
-import java.net.URL;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.resource.ImageRegistry;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-import org.w3c.dom.Element;
-import org.w3c.dom.css.CSSValue;
-
-/**
- * Provides metadata for the "background-image" CSS property.
- * 
- * @author Ian Trimble - Oracle
- */
-public class BackgroundImageMeta extends CSSPropertyMeta {
-
-	private static final String[] _keywords = {ICSSPropertyID.VAL_NONE};
-
-	/**
-	 * Construct an instance.
-	 */
-	public BackgroundImageMeta() {
-		super(false, ICSSPropertyID.VAL_NONE);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#calculateCSSValueResult(org.w3c.dom.css.CSSValue, java.lang.String, org.eclipse.jst.pagedesigner.css2.ICSSStyle)
-	 */
-	@Override
-	public Object calculateCSSValueResult(CSSValue value, String propertyName,
-			ICSSStyle style) {
-		Object ret = null;
-		String valueText = value.getCssText();
-		if (valueText != null && valueText.length() > 0) {
-			valueText = stripURLSyntax(valueText);
-			ret = getImage(valueText, null);
-		}
-		if (ret == null) {
-			ret = getInitialValue(propertyName, style);
-		}
-		return ret;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#calculateHTMLAttributeOverride(org.w3c.dom.Element, java.lang.String, java.lang.String, org.eclipse.jst.pagedesigner.css2.ICSSStyle)
-	 */
-	@Override
-	public Object calculateHTMLAttributeOverride(Element element,
-			String htmltag, String propertyName, ICSSStyle style) {
-		Image image = null;
-		if (
-				element != null &&
-				element.getNodeName() != null &&
-				element.getNodeName().equalsIgnoreCase(IHTMLConstants.TAG_BODY)) {
-			if (ICSSPropertyID.ATTR_BACKGROUND_IMAGE.equalsIgnoreCase(propertyName)) {
-				String attrValue = DOMUtil.getAttributeIgnoreCase(element, IHTMLConstants.ATTR_BACKGROUND);
-				if (attrValue != null && attrValue.trim().length() > 0) {
-					image = getImage(attrValue.trim(), element);
-				}
-			}
-		}
-		return image;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#getKeywordValues()
-	 */
-	@Override
-	protected String[] getKeywordValues() {
-		return _keywords;
-	}
-
-	private String stripURLSyntax(String input) {
-		String output = null;
-		if (input != null) {
-			//strip "url(...)"
-			int startPos = input.indexOf("url(") + 4; //$NON-NLS-1$
-			if (startPos > -1 && startPos < input.length() - 1) {
-				int endPos = input.indexOf(')', startPos);
-				if (endPos > startPos) {
-					String insideURL = input.substring(startPos, endPos).trim();
-					//strip double-quotes
-					if (insideURL.startsWith("\"") && insideURL.endsWith("\"")) { //$NON-NLS-1$ //$NON-NLS-2$
-						output = insideURL.substring(1, insideURL.length() - 1);
-					//strip single-quotes
-					} else if (insideURL.startsWith("'") && insideURL.endsWith("'")) { //$NON-NLS-1$ //$NON-NLS-2$
-						output = insideURL.substring(1, insideURL.length() - 1);
-					} else {
-						output = insideURL;
-					}
-				}
-			}
-		}
-		return output != null ? output : input;
-	}
-
-	/* Image instances returned from this method should not be disposed because
-	 * they are cached in the plug-in's ImageRegistry and will be disposed of
-	 * by the registry.
-	 */
-	private Image getImage(String imagePath, Element element) {
-		Image image = null;
-		if (imagePath != null && imagePath.length() > 0) {
-			ImageRegistry registry = PDPlugin.getDefault().getImageRegistry();
-			image = registry.get(imagePath);
-			if (image == null) {
-				try {
-					URL imageURL = new URL(imagePath);
-					ImageDescriptor imageDescriptor = ImageDescriptor.createFromURL(imageURL);
-					image = imageDescriptor.createImage();
-					if (image != null) {
-						registry.put(imagePath, image);
-					}
-				} catch(MalformedURLException mue) {
-					//attempt to resolve as relative to document
-					if (element instanceof IDOMNode) {
-						IDOMModel model = ((IDOMNode)element).getModel();
-						if (model != null) {
-							String baseLocation = model.getBaseLocation();
-							if (baseLocation != null && baseLocation.length() > 0) {
-								IWorkspaceRoot wsRoot = ResourcesPlugin.getWorkspace().getRoot();
-								if (wsRoot != null) {
-									IResource jspRes = wsRoot.findMember(baseLocation);
-									if (jspRes != null) {
-										IContainer jspFolder = jspRes.getParent();
-										if (jspFolder != null) {
-											IResource imageRes = jspFolder.findMember(imagePath);
-											if (imageRes != null) {
-												URI imageURI = imageRes.getLocationURI();
-												if (imageURI != null) {
-													try {
-														URL imageURL = imageURI.toURL();
-														ImageDescriptor imageDescriptor = ImageDescriptor.createFromURL(imageURL);
-														image = imageDescriptor.createImage();
-														if (image != null) {
-															registry.put(imagePath, image);
-														}
-													} catch(MalformedURLException mue2) {
-														//ignore - what else can be done?
-													}
-												}
-											}
-										}
-									}
-								}
-							}
-						}
-					}
-				}
-			} else if (image.isDisposed()) {
-				//shouldn't be able to get here from there, but...just in case
-				registry.remove(imagePath);
-				image = getImage(imagePath, element);
-			}
-		}
-		return image;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/BorderCollapseMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/BorderCollapseMeta.java
deleted file mode 100644
index f2cbe1d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/BorderCollapseMeta.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-/**
- * @author mengbo
- */
-public class BorderCollapseMeta extends CSSPropertyMeta {
-	static String[] keywords = new String[] { ICSSPropertyID.VAL_COLLAPSE,
-			ICSSPropertyID.VAL_SEPARATE };
-
-	/**
-	 */
-	public BorderCollapseMeta() {
-		// XXX: the spec says COLLAPSE is initial value, but seemed that IE
-		// is using separate as default
-		super(true, ICSSPropertyID.VAL_SEPARATE);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#getKeywordValues()
-	 */
-	protected String[] getKeywordValues() {
-		return keywords;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/BorderColorMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/BorderColorMeta.java
deleted file mode 100644
index d493a71..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/BorderColorMeta.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.color.CSSColorManager;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.w3c.dom.Element;
-import org.w3c.dom.css.CSSValue;
-
-/**
- * @author mengbo
- */
-public class BorderColorMeta extends CSSPropertyMeta {
-
-	private static final String[] _keywords = new String[] { ICSSPropertyID.VAL_TRANSPARENT };
-
-	/**
-	 */
-	public BorderColorMeta() {
-		super(false, ICSSPropertyID.VAL_TRANSPARENT);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyMeta#calculateCSSValueResult(org.w3c.dom.css.CSSValue,
-	 *      java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.css2.property.AbstractStyle)
-	 */
-	public Object calculateCSSValueResult(CSSValue value, String propertyName,
-			ICSSStyle style) {
-		String text = value.getCssText();
-		Object result = CSSColorManager.getInstance().getColor(text);
-		if (result != null) {
-			return result;
-		}
-        return getInitialValue(propertyName, style);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#getKeywordValues()
-	 */
-	protected String[] getKeywordValues() {
-		return _keywords;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyMeta#calculateHTMLAttributeOverride(org.w3c.dom.Element,
-	 *      java.lang.String, java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.css2.ICSSStyle)
-	 */
-	public Object calculateHTMLAttributeOverride(Element element,
-			String htmltag, String propertyName, ICSSStyle style) {
-		Object result;
-		String colorAttr = null;
-		if (IHTMLConstants.TAG_HR.equalsIgnoreCase(htmltag)) {
-			colorAttr = DOMUtil.getAttributeIgnoreCase(element,
-					ICSSPropertyID.ATTR_COLOR);
-		} else if (ICSSPropertyID.ATTR_BACKGROUND_COLOR
-				.equalsIgnoreCase(propertyName)) {
-			colorAttr = DOMUtil.getAttributeIgnoreCase(element,
-					ICSSPropertyID.ATTR_BGCOLOR);
-		}
-		if (colorAttr != null && colorAttr.trim().length() != 0) {
-			colorAttr = colorAttr.trim();
-			result = CSSColorManager.getInstance().getColor(colorAttr);
-			return result;
-		}
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/BorderSpacingMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/BorderSpacingMeta.java
deleted file mode 100644
index 22313c3..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/BorderSpacingMeta.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.value.Length;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.w3c.dom.Element;
-import org.w3c.dom.css.CSSValue;
-import org.w3c.dom.css.CSSValueList;
-
-/**
- * The value will always be of type int[2]
- * 
- * @author mengbo
- */
-public class BorderSpacingMeta extends CSSPropertyMeta {
-	private static final int[] INITIAL_SPACING = new int[] { 3, 3 };
-
-	/**
-	 */
-	public BorderSpacingMeta() {
-		// the specification says "border-spacing" is inherited. But seemed
-		// browse is not treating it as inherited. So we treat is as not
-		// inherited.
-		super(false, INITIAL_SPACING);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#getKeywordValues()
-	 */
-	protected String[] getKeywordValues() {
-		return EMPTY_KEYWORDS;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#calculateCSSValueResult(org.w3c.dom.css.CSSValue,
-	 *      java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.css2.style.AbstractStyle)
-	 */
-	public Object calculateCSSValueResult(CSSValue value, String propertyName,
-			ICSSStyle style) {
-		if (value == null || value.getCssValueType() == CSSValue.CSS_CUSTOM) {
-			return INITIAL_SPACING;
-		}
-		if (value.getCssValueType() == CSSValue.CSS_PRIMITIVE_VALUE) {
-			int intvalue = toIntValue(value.getCssText(), style);
-			if (intvalue >= 0) {
-				return new int[] { intvalue, intvalue };
-			}
-            return INITIAL_SPACING;
-		} else if (value.getCssValueType() == CSSValue.CSS_VALUE_LIST) {
-			CSSValueList list = (CSSValueList) value;
-			if (list.getLength() >= 2) {
-				int i1 = toIntValue(list.item(0).getCssText(), style);
-				int i2 = toIntValue(list.item(1).getCssText(), style);
-				if (i1 < 0) {
-					i1 = 0;
-				}
-				if (i2 < 0) {
-					i2 = 0;
-				}
-				return new int[] { i1, i2 };
-			}
-            return INITIAL_SPACING;
-		} else {
-			return INITIAL_SPACING;
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#calculateHTMLAttributeOverride(org.w3c.dom.Element,
-	 *      java.lang.String, java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.css2.ICSSStyle)
-	 */
-	public Object calculateHTMLAttributeOverride(Element element,
-			String htmltag, String propertyName, ICSSStyle style) {
-		if (IHTMLConstants.TAG_TABLE.equalsIgnoreCase(htmltag)) {
-			String spacing = DOMUtil.getAttributeIgnoreCase(element,
-					IHTMLConstants.ATTR_CELLSPACING);
-			if (spacing != null) {
-				int intvalue = toIntValue(spacing, style);
-				if (intvalue >= 0) {
-					return new int[] { intvalue, intvalue };
-				}
-			}
-		}
-
-		return super.calculateHTMLAttributeOverride(element, htmltag,
-				propertyName, style);
-	}
-
-	/**
-	 * @param valuetext
-	 * @param style
-	 * @return the integer value for value text
-	 */
-	protected int toIntValue(String valuetext, ICSSStyle style) {
-		Object length = LengthMeta.toLength(valuetext, style, PERCENTAGE_NONE,
-				style.getCSSFont());
-		if (length instanceof Length && !((Length) length).isPercentage()) {
-			return ((Length) length).getValue();
-		}
-        return Integer.MIN_VALUE;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/BorderStyleMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/BorderStyleMeta.java
deleted file mode 100644
index 3998634..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/BorderStyleMeta.java
+++ /dev/null
@@ -1,181 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public class BorderStyleMeta extends CSSPropertyMeta {
-	static final String[] KEYWORDS = new String[] { ICSSPropertyID.VAL_NONE,
-			ICSSPropertyID.VAL_HIDDEN, ICSSPropertyID.VAL_DOTTED,
-			ICSSPropertyID.VAL_DASHED, ICSSPropertyID.VAL_SOLID,
-			ICSSPropertyID.VAL_DOUBLE, ICSSPropertyID.VAL_GROOVE,
-			ICSSPropertyID.VAL_RIDGE, ICSSPropertyID.VAL_INSET,
-			ICSSPropertyID.VAL_OUTSET };
-
-	/**
-	 */
-	public BorderStyleMeta() {
-		super(false, ICSSPropertyID.VAL_NONE);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#getKeywordValues()
-	 */
-	protected String[] getKeywordValues() {
-		return KEYWORDS;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#calculateHTMLAttributeOverride(org.w3c.dom.Element,
-	 *      java.lang.String, java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.css2.ICSSStyle)
-	 */
-	public Object calculateHTMLAttributeOverride(Element element,
-			String htmltag, String propertyName, ICSSStyle style) {
-		if (IHTMLConstants.TAG_TABLE.equalsIgnoreCase(htmltag)) {
-			return calculateTableOverride(element, propertyName);
-		} else if (IHTMLConstants.TAG_TD.equalsIgnoreCase(htmltag)
-				|| IHTMLConstants.TAG_TH.equalsIgnoreCase(htmltag)) {
-			return calculateTDOverride(element, propertyName, style);
-		} else if (IHTMLConstants.TAG_IMG.equalsIgnoreCase(htmltag)) {
-			String border = DOMUtil.getAttributeIgnoreCase(element,
-					IHTMLConstants.ATTR_BORDER);
-			if (border != null) {
-				return ICSSPropertyID.VAL_SOLID;
-			}
-		}
-		return super.calculateHTMLAttributeOverride(element, htmltag,
-				propertyName, style);
-	}
-
-	/**
-	 * @param element
-	 * @param propertyName
-	 * @return
-	 */
-	private Object calculateTDOverride(Element element, String propertyName,
-			ICSSStyle style) {
-		// if element is empty, and "empty-cells" property is hide, then we
-		// don't display border.
-		Object obj = style.getStyleProperty(ICSSPropertyID.ATTR_EMPTY_CELLS);
-		if (EmptyCellsMeta.HIDE.equals(obj) && TableUtil.isEmptyCell(element)) {
-			return ICSSPropertyID.VAL_NONE;
-		}
-
-		// find containing table first
-		Node parent = element;
-		Element tableEle = null;
-		while ((parent = parent.getParentNode()) != null
-				&& parent instanceof Element) {
-			if (((Element) parent).getTagName().equalsIgnoreCase(
-					IHTMLConstants.TAG_TABLE)) {
-				tableEle = (Element) parent;
-				break;
-			}
-
-		}
-		if (tableEle != null) {
-			String rules = DOMUtil.getAttributeIgnoreCase(tableEle,
-					IHTMLConstants.ATTR_RULES);
-			String borderstr = DOMUtil.getAttributeIgnoreCase(tableEle,
-					IHTMLConstants.ATTR_BORDER);
-			if (rules == null || rules.length() == 0) {
-				if (borderstr == null || "0".equals(borderstr.trim())) { //$NON-NLS-1$
-					return ICSSPropertyID.VAL_NONE;
-				}
-                return ICSSPropertyID.VAL_TDBORDERSTYLE;
-			}
-            // ok, we got a value for rules
-            if (TableUtil.matchRules(extractEdge(propertyName), rules)) {
-            	return ICSSPropertyID.VAL_TDBORDERSTYLE;
-            }
-            return ICSSPropertyID.VAL_NONE;
-		}
-        return null;
-	}
-
-	/**
-	 * @param element
-	 * @param propertyName
-	 * @return
-	 */
-	private Object calculateTableOverride(Element element, String propertyName) {
-		String frame = DOMUtil.getAttributeIgnoreCase(element,
-				IHTMLConstants.ATTR_FRAME);
-		String borderstr = DOMUtil.getAttributeIgnoreCase(element,
-				IHTMLConstants.ATTR_BORDER);
-		// border="0" implies frame="void"
-		if ("0".equals(borderstr)) { //$NON-NLS-1$
-			return ICSSPropertyID.VAL_NONE;
-		}
-		if (frame == null || frame.length() == 0) {
-			if (borderstr == null) {
-				return ICSSPropertyID.VAL_NONE;
-			} else if (borderstr.trim().length() == 0) {
-				frame = IHTMLConstants.ATTR_BORDER;
-			} else {
-				try {
-					Integer.parseInt(borderstr);
-					frame = IHTMLConstants.ATTR_BORDER;
-				} catch (Exception ex) {
-					frame = borderstr;
-				}
-			}
-		}
-		// ok, we got a value for frame.
-		if (TableUtil.matchFrame(extractEdge(propertyName), frame)) {
-			return ICSSPropertyID.VAL_OUTSET;
-		}
-        return ICSSPropertyID.VAL_NONE;
-	}
-
-	static String extractEdge(String propertyName) {
-		if (ICSSPropertyID.ATTR_BORDER_BOTTOM_STYLE
-				.equalsIgnoreCase(propertyName)) {
-			return "bottom"; //$NON-NLS-1$
-		} else if (ICSSPropertyID.ATTR_BORDER_LEFT_STYLE
-				.equalsIgnoreCase(propertyName)) {
-			return "left"; //$NON-NLS-1$
-		} else if (ICSSPropertyID.ATTR_BORDER_RIGHT_STYLE
-				.equalsIgnoreCase(propertyName)) {
-			return "right"; //$NON-NLS-1$
-		} else {
-			return "top"; //$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * @param propertyName
-	 * @return true if property name is a border style
-	 */
-	public static boolean isBorderStyle(String propertyName) {
-		return ICSSPropertyID.ATTR_BORDER_BOTTOM_STYLE
-				.equalsIgnoreCase(propertyName)
-				|| ICSSPropertyID.ATTR_BORDER_LEFT_STYLE
-						.equalsIgnoreCase(propertyName)
-				|| ICSSPropertyID.ATTR_BORDER_RIGHT_STYLE
-						.equalsIgnoreCase(propertyName)
-				|| ICSSPropertyID.ATTR_BORDER_TOP_STYLE
-						.equalsIgnoreCase(propertyName);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/BorderWidthMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/BorderWidthMeta.java
deleted file mode 100644
index d731699..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/BorderWidthMeta.java
+++ /dev/null
@@ -1,238 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.value.Length;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.css.CSSValue;
-
-/**
- * 
- * @author mengbo
- */
-// FIXME: when the border-style is none, how should we treat border-width?
-public class BorderWidthMeta extends LengthMeta {
-
-	private static final Length LENGTH_4 = new Length(4, false);
-
-	static final String[] KEYWORDS = new String[] { ICSSPropertyID.VAL_AUTO,
-			ICSSPropertyID.VAL_THIN, ICSSPropertyID.VAL_MEDIUM,
-			ICSSPropertyID.VAL_THICK };
-
-	/**
-	 */
-	public BorderWidthMeta() {
-		super(false, LENGTH_4); // medium length.
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.LengthMeta#getKeywordValues()
-	 */
-	protected String[] getKeywordValues() {
-		return KEYWORDS;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#getPercentageType()
-	 */
-	public int getPercentageType() {
-		return PERCENTAGE_NONE;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.LengthMeta#calculateCSSValueResult(org.w3c.dom.css.CSSValue,
-	 *      java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.css2.style.AbstractStyle)
-	 */
-	public Object calculateCSSValueResult(CSSValue value, String propertyName,
-			ICSSStyle style) {
-		// Computed value: absolute length; '0' if the border style is 'none' or
-		// 'hidden'
-		Object stylevalue = style.getStyleProperty("border-" //$NON-NLS-1$
-				+ extractEdge(propertyName) + "-style"); //$NON-NLS-1$
-		if (ICSSPropertyID.VAL_NONE.equals(stylevalue)
-				|| ICSSPropertyID.VAL_HIDDEN.equals(stylevalue)) {
-			return Length.LENGTH_0;
-		}
-
-		Object obj = super.calculateCSSValueResult(value, propertyName, style);
-		if (ICSSPropertyID.VAL_THIN.equals(obj)) {
-			return Length.LENGTH_1;
-		} else if (ICSSPropertyID.VAL_MEDIUM.equals(obj)) {
-			return Length.LENGTH_3;
-		} else if (ICSSPropertyID.VAL_THICK.equals(obj)) {
-			return Length.LENGTH_8;
-		}
-		return obj;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#calculateHTMLAttributeOverride(org.w3c.dom.Element,
-	 *      java.lang.String, java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.css2.ICSSStyle)
-	 */
-	public Object calculateHTMLAttributeOverride(Element element,
-			String htmltag, String propertyName, ICSSStyle style) {
-		if ("table".equalsIgnoreCase(htmltag)) { //$NON-NLS-1$
-			return calculateTableOverride(element, propertyName);
-		} else if ("td".equalsIgnoreCase(htmltag) //$NON-NLS-1$
-				|| "th".equalsIgnoreCase(htmltag)) { //$NON-NLS-1$
-			return calculateTDOverride(element, propertyName);
-		} else if ("img".equalsIgnoreCase(htmltag)) { //$NON-NLS-1$
-			String border = DOMUtil.getAttributeIgnoreCase(element, "border");// ICSSPropertyID.ATTR_BORDERSIZE); //$NON-NLS-1$
-			if (border != null) {
-				try {
-					return new Length(Integer.parseInt(border), false);
-				} catch (Exception ex) {
-					// Integer processing, no need to report.
-				}
-			}
-		}
-
-		return super.calculateHTMLAttributeOverride(element, htmltag,
-				propertyName, style);
-	}
-
-	/**
-	 * @param element
-	 * @param propertyName
-	 * @return
-	 */
-	private Object calculateTDOverride(Element element, String propertyName) {
-		// find containing table first
-		Node parent = element;
-		Element tableEle = null;
-		while ((parent = parent.getParentNode()) != null
-				&& parent instanceof Element) {
-			if (((Element) parent).getTagName().equalsIgnoreCase("table")) { //$NON-NLS-1$
-				tableEle = (Element) parent;
-				break;
-			}
-
-		}
-		if (tableEle != null) {
-			String rules = DOMUtil.getAttributeIgnoreCase(tableEle, "rules"); //$NON-NLS-1$
-			String borderstr = DOMUtil.getAttributeIgnoreCase(tableEle,
-					"border"); //$NON-NLS-1$
-			if (rules == null || rules.length() == 0) {
-				if (borderstr == null || "0".equals(borderstr.trim())) { //$NON-NLS-1$
-					return null;
-				}
-                return Length.LENGTH_1;
-			}
-            // ok, we got a value for rules
-            if (TableUtil.matchRules(extractEdge(propertyName), rules)) {
-            	return Length.LENGTH_1;
-            }
-            return Length.LENGTH_0;
-		}
-        return Length.LENGTH_0;
-	}
-
-	/**
-	 * @param element
-	 * @param propertyName
-	 * @return
-	 */
-	private Object calculateTableOverride(Element element, String propertyName) {
-		String frame = DOMUtil.getAttributeIgnoreCase(element, "frame"); //$NON-NLS-1$
-		String borderstr = DOMUtil.getAttributeIgnoreCase(element, "border"); //$NON-NLS-1$
-		// border="0" implies frame="void"
-		if ("0".equals(borderstr)) { //$NON-NLS-1$
-			return Length.LENGTH_0;
-		}
-		if (frame == null || frame.length() == 0) {
-			if (borderstr == null) {
-				return null;
-			} else if (borderstr.trim().length() == 0) {
-				return Length.LENGTH_1;
-			} else {
-				try {
-					return new Length(Integer.parseInt(borderstr), false);
-				} catch (Exception ex) {
-					frame = borderstr;
-				}
-			}
-		}
-		// ok, we got a value for frame.
-		if (TableUtil.matchFrame(extractEdge(propertyName), frame)) {
-			if (borderstr != null) {
-				try {
-					return new Length(Integer.parseInt(borderstr), false);
-				} catch (Exception ex) {
-					// ignore. pass through to return length_1
-				}
-			}
-			return Length.LENGTH_1;
-		}
-        return Length.LENGTH_0;
-	}
-
-	static String extractEdge(String propertyName) {
-		if (ICSSPropertyID.ATTR_BORDER_BOTTOM_WIDTH
-				.equalsIgnoreCase(propertyName)) {
-			return "bottom"; //$NON-NLS-1$
-		} else if (ICSSPropertyID.ATTR_BORDER_LEFT_WIDTH
-				.equalsIgnoreCase(propertyName)) {
-			return "left"; //$NON-NLS-1$
-		} else if (ICSSPropertyID.ATTR_BORDER_RIGHT_WIDTH
-				.equalsIgnoreCase(propertyName)) {
-			return "right"; //$NON-NLS-1$
-		} else {
-			return "top"; //$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * @param propertyName
-	 * @return true if property name is a border width
-	 */
-	public static boolean isBorderWidth(String propertyName) {
-		return ICSSPropertyID.ATTR_BORDER_BOTTOM_WIDTH
-				.equalsIgnoreCase(propertyName)
-				|| ICSSPropertyID.ATTR_BORDER_LEFT_WIDTH
-						.equalsIgnoreCase(propertyName)
-				|| ICSSPropertyID.ATTR_BORDER_RIGHT_WIDTH
-						.equalsIgnoreCase(propertyName)
-				|| ICSSPropertyID.ATTR_BORDER_TOP_WIDTH
-						.equalsIgnoreCase(propertyName);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#getInitialValue(java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.css2.ICSSStyle)
-	 */
-	public Object getInitialValue(String propertyName, ICSSStyle style) {
-		// Computed value: absolute length; '0' if the border style is 'none' or
-		// 'hidden'
-		Object stylevalue = style.getStyleProperty("border-" //$NON-NLS-1$
-				+ extractEdge(propertyName) + "-style"); //$NON-NLS-1$
-		if (ICSSPropertyID.VAL_NONE.equals(stylevalue)
-				|| ICSSPropertyID.VAL_HIDDEN.equals(stylevalue)) {
-			return Length.LENGTH_0;
-		}
-		return super.getInitialValue(propertyName, style);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/CSSMetaRegistry.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/CSSMetaRegistry.java
deleted file mode 100644
index da55ec5..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/CSSMetaRegistry.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.jst.pagedesigner.ui.preferences.PDPreferences;
-
-/**
- * @author mengbo
- */
-public class CSSMetaRegistry {
-	Map _map = new HashMap();
-
-	private static CSSMetaRegistry _instance;
-
-	private CSSMetaRegistry() {
-		initialize();
-	}
-
-	/**
-	 * class initializer
-	 */
-	private void initialize() 
-	{
-	    final PDPreferences prefs = new PDPreferences();
-		_map.put(ICSSPropertyID.ATTR_DISPLAY, new DisplayMeta());
-		_map.put(ICSSPropertyID.ATTR_TEXTALIGN, new TextAlignMeta());
-		_map.put(ICSSPropertyID.ATTR_HORIZONTAL_ALIGN, new HorizontalAlignMeta());
-		_map.put(ICSSPropertyID.ATTR_TEXTDECORATION, new TextDecorationMeta());
-		_map.put(ICSSPropertyID.ATTR_WHITESPACE, new WhiteSpaceMeta());
-		_map.put(ICSSPropertyID.ATTR_WIDTH, new WidthMeta());
-		_map.put(ICSSPropertyID.ATTR_MIN_WIDTH, new WidthMeta());
-		_map.put(ICSSPropertyID.ATTR_HEIGHT, new HeightMeta());
-		_map.put(ICSSPropertyID.ATTR_MIN_HEIGHT, new HeightMeta());
-
-		_map.put(ICSSPropertyID.ATTR_BORDER_LEFT_WIDTH, new BorderWidthMeta());
-		_map.put(ICSSPropertyID.ATTR_BORDER_RIGHT_WIDTH, new BorderWidthMeta());
-		_map.put(ICSSPropertyID.ATTR_BORDER_BOTTOM_WIDTH, new BorderWidthMeta());
-		_map.put(ICSSPropertyID.ATTR_BORDER_TOP_WIDTH, new BorderWidthMeta());
-
-		_map.put(ICSSPropertyID.ATTR_BORDER_LEFT_STYLE, new BorderStyleMeta());
-		_map.put(ICSSPropertyID.ATTR_BORDER_RIGHT_STYLE, new BorderStyleMeta());
-		_map.put(ICSSPropertyID.ATTR_BORDER_BOTTOM_STYLE, new BorderStyleMeta());
-		_map.put(ICSSPropertyID.ATTR_BORDER_TOP_STYLE, new BorderStyleMeta());
-
-		_map.put(ICSSPropertyID.ATTR_BORDER_LEFT_COLOR, new BorderColorMeta());
-		_map.put(ICSSPropertyID.ATTR_BORDER_RIGHT_COLOR, new BorderColorMeta());
-		_map.put(ICSSPropertyID.ATTR_BORDER_BOTTOM_COLOR, new BorderColorMeta());
-		_map.put(ICSSPropertyID.ATTR_BORDER_TOP_COLOR, new BorderColorMeta());
-
-		_map.put(ICSSPropertyID.ATTR_PADDING_LEFT, new PaddingWidthMeta(prefs));
-		_map.put(ICSSPropertyID.ATTR_PADDING_RIGHT, new PaddingWidthMeta(prefs));
-		_map.put(ICSSPropertyID.ATTR_PADDING_BOTTOM, new PaddingWidthMeta(prefs));
-		_map.put(ICSSPropertyID.ATTR_PADDING_TOP, new PaddingWidthMeta(prefs));
-
-		_map.put(ICSSPropertyID.ATTR_MARGIN_LEFT, new MarginWidthMeta());
-		_map.put(ICSSPropertyID.ATTR_MARGIN_RIGHT, new MarginWidthMeta());
-		_map.put(ICSSPropertyID.ATTR_MARGIN_BOTTOM, new MarginWidthMeta());
-		_map.put(ICSSPropertyID.ATTR_MARGIN_TOP, new MarginWidthMeta());
-
-		_map.put(ICSSPropertyID.ATTR_FONT_FAMILY, new FontFamilyMeta());
-		_map.put(ICSSPropertyID.ATTR_FONT_SIZE, new FontSizeMeta());
-		_map.put(ICSSPropertyID.ATTR_FONT_STYLE, new FontStyleMeta());
-		_map.put(ICSSPropertyID.ATTR_FONT_WEIGHT, new FontWeightMeta());
-
-		_map.put(ICSSPropertyID.ATTR_BACKGROUND_COLOR, new BackgroundColorMeta());
-		_map.put(ICSSPropertyID.ATTR_BACKGROUND_IMAGE, new BackgroundImageMeta());
-		_map.put(ICSSPropertyID.ATTR_COLOR, new ColorPropertyMeta());
-		_map.put(ICSSPropertyID.ATTR_TEXTCOLOR, new ColorPropertyMeta());
-
-		_map.put(ICSSPropertyID.ATTR_BORDER_COLLAPSE, new BorderCollapseMeta());
-		_map.put(ICSSPropertyID.ATTR_BORDER_SPACING, new BorderSpacingMeta());
-
-		_map.put(ICSSPropertyID.ATTR_LIST_STYLE_TYPE, new ListStyleTypeMeta());
-		_map.put(ICSSPropertyID.ATTR_LIST_STYLE_IMAGE, new ListStyleImageMeta());
-		_map.put(ICSSPropertyID.ATTR_LIST_STYLE_POSITION, new ListStylePositionMeta());
-		_map.put(ICSSPropertyID.ATTR_COUNTER_RESET, new CounterResetMeta());
-		_map.put(ICSSPropertyID.ATTR_COUNTER_INCREMENT, new CounterIncrementMeta());
-
-		_map.put(ICSSPropertyID.ATTR_TOP, new PositionOffsetMeta());
-		_map.put(ICSSPropertyID.ATTR_RIGHT, new PositionOffsetMeta());
-		_map.put(ICSSPropertyID.ATTR_BOTTOM, new PositionOffsetMeta());
-		_map.put(ICSSPropertyID.ATTR_LEFT, new PositionOffsetMeta());
-		_map.put(ICSSPropertyID.ATTR_POSITION, new PositionMeta());
-
-		_map.put(ICSSPropertyID.ATTR_EMPTY_CELLS, new EmptyCellsMeta());
-		_map.put(ICSSPropertyID.ATTR_VISIBILITY, new VisibilityMeta());
-		_map.put(ICSSPropertyID.ATTR_VERTICAL_ALIGN, new VerticalAlignMeta());
-
-		_map.put(ICSSPropertyID.ATTR_OVERFLOW, new OverflowMeta());
-	}
-
-	/**
-	 * @param property
-	 * @return the meta
-	 */
-	public ICSSPropertyMeta getMeta(String property) {
-		return (ICSSPropertyMeta) _map.get(property);
-	}
-
-	/**
-	 * @return the singleton instance
-	 */
-	public static final CSSMetaRegistry getInstance() {
-		if (_instance == null) {
-			_instance = new CSSMetaRegistry();
-		}
-		return _instance;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/CSSPropertyMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/CSSPropertyMeta.java
deleted file mode 100644
index ad426a4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/CSSPropertyMeta.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.w3c.dom.Element;
-import org.w3c.dom.css.CSSValue;
-
-/**
- * @author mengbo
- */
-public abstract class CSSPropertyMeta implements ICSSPropertyMeta {
-	static final String[] EMPTY_KEYWORDS = new String[0];
-
-	boolean _inherited;
-
-	Object _initialValue;
-
-	/**
-	 * @param inherit
-	 * @param initvalue
-	 */
-	public CSSPropertyMeta(boolean inherit, Object initvalue) {
-		this._inherited = inherit;
-		this._initialValue = initvalue;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyMeta#isInherited()
-	 */
-	public boolean isInherited() {
-		return _inherited;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyMeta#getHTMLElementInitialValue(org.w3c.dom.Element,
-	 *      java.lang.String, java.lang.String)
-	 */
-	public Object getHTMLElementInitialValue(Element element, String htmltag,
-			String propertyName) {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyMeta#getInitialValue()
-	 */
-	public Object getInitialValue(String propertyName, ICSSStyle style) {
-		return _initialValue;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyMeta#getPercentageType()
-	 */
-	public int getPercentageType() {
-		return PERCENTAGE_NONE;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyMeta#calculateHTMLAttributeOverride(org.w3c.dom.Element,
-	 *      java.lang.String, java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.css2.ICSSStyle)
-	 */
-	public Object calculateHTMLAttributeOverride(Element element,
-			String htmltag, String propertyName, ICSSStyle style) {
-		// child class should override this method!!!
-		return null;
-	}
-
-	/**
-	 * for many properties, they have a set of keyword property values.
-	 * 
-	 * @return the keyword values
-	 */
-	protected abstract String[] getKeywordValues();
-
-	/**
-	 * @param value
-	 * @return null if is not a keyword.
-	 */
-	protected String checkKeywordValues(String value) {
-		if (value == null)
-			return null;
-		String[] keywords = getKeywordValues();
-		if (keywords != null) {
-			for (int i = 0; i < keywords.length; i++) {
-				if (keywords[i].equalsIgnoreCase(value)) {
-					return keywords[i];
-				}
-			}
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyMeta#calculateCSSValueResult(org.w3c.dom.css.CSSValue,
-	 *      java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.css2.property.AbstractStyle)
-	 */
-	public Object calculateCSSValueResult(CSSValue value, String propertyName,
-			ICSSStyle style) {
-		String s = checkKeywordValues(value.getCssText());
-		if (s != null) {
-			return s;
-		}
-        return this.getInitialValue(propertyName, style);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/ColorPropertyMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/ColorPropertyMeta.java
deleted file mode 100644
index 8562288..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/ColorPropertyMeta.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-import java.util.Arrays;
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.color.CSSColorManager;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.w3c.dom.Element;
-import org.w3c.dom.css.CSSValue;
-
-/**
- * "color" will be in this type
- * 
- * @author mengbo
- */
-public class ColorPropertyMeta extends CSSPropertyMeta {
-	private static final Object DEFAULT_COLOR = ColorConstants.black;
-
-	private static final String[] KEYWORDS = new String[] {};
-
-	private final static String[] NOTSUPPORT_TAG = { IHTMLConstants.TAG_H1,
-			IHTMLConstants.TAG_H2, IHTMLConstants.TAG_H3,
-			IHTMLConstants.TAG_H4, IHTMLConstants.TAG_H5, IHTMLConstants.TAG_H6 };
-
-	/**
-	 */
-	public ColorPropertyMeta() {
-		super(true, DEFAULT_COLOR);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyMeta#calculateCSSValueResult(org.w3c.dom.css.CSSValue,
-	 *      java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.css2.property.AbstractStyle)
-	 */
-	public Object calculateCSSValueResult(CSSValue value, String propertyName,
-			ICSSStyle style) {
-
-		String text = value.getCssText();
-		Object result = CSSColorManager.getInstance().getColor(text);
-		if (result != null) {
-			return result;
-		}
-        return this.getInitialValue(propertyName, style);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#getKeywordValues()
-	 */
-	protected String[] getKeywordValues() {
-		return KEYWORDS;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyMeta#calculateHTMLAttributeOverride(org.w3c.dom.Element,
-	 *      java.lang.String, java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.css2.ICSSStyle)
-	 */
-	public Object calculateHTMLAttributeOverride(Element element,
-			String htmltag, String propertyName, ICSSStyle style) {
-		if (Arrays.asList(NOTSUPPORT_TAG).contains(htmltag.toLowerCase())) {
-			return null;
-		}
-		Object result;
-		String colorAttr = null;
-		// There are some conditions need to be dealt with hyperlink and text
-		// properties.
-		if (ICSSPropertyID.ATTR_COLOR.equalsIgnoreCase(propertyName)) {
-			colorAttr = DOMUtil.getAttributeIgnoreCase(element,
-					ICSSPropertyID.ATTR_COLOR);
-			if (colorAttr == null
-					&& element.getLocalName().equalsIgnoreCase(
-							IHTMLConstants.TAG_BODY)) {
-				colorAttr = DOMUtil.getAttributeIgnoreCase(element,
-						ICSSPropertyID.ATTR_TEXT);
-			}
-		}
-		if (colorAttr != null) {
-			colorAttr = colorAttr.trim();
-			result = CSSColorManager.getInstance().getColor(colorAttr);
-			return result;
-		}
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/ContentMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/ContentMeta.java
deleted file mode 100644
index 0b190e9..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/ContentMeta.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-/**
- * @author mengbo
- */
-public class ContentMeta extends CSSPropertyMeta {
-	/**
-	 */
-	public ContentMeta() {
-		// why inherit this??
-		super(false, null);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#getKeywordValues()
-	 */
-	protected String[] getKeywordValues() {
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/CounterIncrementMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/CounterIncrementMeta.java
deleted file mode 100644
index 660c822..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/CounterIncrementMeta.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.list.CounterHelper;
-import org.eclipse.jst.pagedesigner.css2.list.IncrementObject;
-import org.eclipse.wst.css.core.internal.provisional.document.ICSSNode;
-import org.eclipse.wst.css.core.internal.provisional.document.ICSSPrimitiveValue;
-import org.w3c.dom.css.CSSValue;
-
-/**
- * For CounterIncrementMeta, the valid value could be the following: 1. NULL 2.
- * NOT_SPECIFIED 3. a List of IncrementObject.
- * 
- * @author mengbo
- */
-public class CounterIncrementMeta extends CSSPropertyMeta {
-	/**
-	 * 
-	 */
-	public CounterIncrementMeta() {
-		super(false, null);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#getKeywordValues()
-	 */
-	protected String[] getKeywordValues() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyMeta#calculateCSSValueResult(org.w3c.dom.css.CSSValue,
-	 *      java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.css2.style.AbstractStyle)
-	 */
-	public Object calculateCSSValueResult(CSSValue value, String propertyName,
-			ICSSStyle style) {
-		return getCounter(value);
-	}
-
-	/**
-	 * @param value
-	 * @return the counter
-	 */
-	public List getCounter(CSSValue value) {
-		if (value == null) {
-			return null;
-		}
-		List result = new ArrayList();
-		IncrementObject incrementObject = null;
-		String identifier = null;
-		Integer increment = null;
-		ICSSNode cssValue = (ICSSNode) value;
-		while (cssValue != null) {
-			// find next idetifier.
-			while (cssValue != null && !CounterHelper.isIdentifier(cssValue)) {
-				cssValue = cssValue.getNextSibling();
-			}
-			if (cssValue == null) {
-				return null;
-			}
-            // identifier:
-            identifier = ((ICSSPrimitiveValue) value).getStringValue();
-            cssValue = cssValue.getNextSibling();
-            // value:
-            if (CounterHelper.isNumber(cssValue)) {
-            	increment = new Integer((int) ((ICSSPrimitiveValue) value)
-            			.getFloatValue(ICSSPrimitiveValue.CSS_INTEGER));
-            }
-
-			if (identifier != null) {
-				incrementObject = new IncrementObject(identifier, increment);
-				result.add(incrementObject);
-			}
-		}
-		return result;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/CounterResetMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/CounterResetMeta.java
deleted file mode 100644
index ac51249..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/CounterResetMeta.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.list.CounterHelper;
-import org.eclipse.jst.pagedesigner.css2.list.ResetObject;
-import org.eclipse.wst.css.core.internal.provisional.document.ICSSNode;
-import org.eclipse.wst.css.core.internal.provisional.document.ICSSPrimitiveValue;
-import org.w3c.dom.css.CSSValue;
-
-/**
- * @author mengbo
- */
-public class CounterResetMeta extends CSSPropertyMeta {
-	/**
-	 * 
-	 */
-	public CounterResetMeta() {
-		super(false, null);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#getKeywordValues()
-	 */
-	protected String[] getKeywordValues() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyMeta#calculateCSSValueResult(org.w3c.dom.css.CSSValue,
-	 *      java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.css2.style.AbstractStyle)
-	 */
-	public Object calculateCSSValueResult(CSSValue value, String propertyName,
-			ICSSStyle style) {
-		return getCounter(value);
-	}
-
-	/**
-	 * @param value
-	 * @return the counter
-	 */
-	public List getCounter(CSSValue value) {
-		if (value == null) {
-			return null;
-		}
-		List result = new ArrayList();
-		ResetObject resetObject = null;
-		String identifier = null;
-		Integer initial = null;
-		ICSSNode cssValue = (ICSSNode) value;
-		while (cssValue != null) {
-			// find next idetifier.
-			while (cssValue != null && !CounterHelper.isIdentifier(cssValue)) {
-				cssValue = cssValue.getNextSibling();
-			}
-			if (cssValue == null) {
-				return null;
-			}
-            // identifier:
-            identifier = ((ICSSPrimitiveValue) value).getStringValue();
-            cssValue = cssValue.getNextSibling();
-            // value:
-            if (CounterHelper.isNumber(cssValue)) {
-            	initial = new Integer((int) ((ICSSPrimitiveValue) value)
-            			.getFloatValue(ICSSPrimitiveValue.CSS_INTEGER));
-            }
-
-			if (identifier != null) {
-				resetObject = new ResetObject(identifier, initial);
-				result.add(resetObject);
-			}
-		}
-		return result;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/DisplayMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/DisplayMeta.java
deleted file mode 100644
index 8997129..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/DisplayMeta.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.w3c.dom.css.CSSValue;
-
-/**
- * @author mengbo
- */
-public class DisplayMeta extends CSSPropertyMeta {
-	static final String[] KEYWORDS = new String[] { ICSSPropertyID.VAL_INLINE,
-			ICSSPropertyID.VAL_BLOCK, ICSSPropertyID.VAL_INLINE_BLOCK,
-			ICSSPropertyID.VAL_LIST_ITEM, ICSSPropertyID.VAL_RUN_IN,
-			ICSSPropertyID.VAL_COMPACT, ICSSPropertyID.VAL_MARKER,
-			ICSSPropertyID.VAL_TABLE, ICSSPropertyID.VAL_INLINE_TABLE,
-			ICSSPropertyID.VAL_TABLE_ROW_GROUP,
-			ICSSPropertyID.VAL_TABLE_HEADER_GROUP,
-			ICSSPropertyID.VAL_TABLE_FOOTER_GROUP,
-			ICSSPropertyID.VAL_TABLE_ROW,
-			ICSSPropertyID.VAL_TABLE_COLUMN_GROUP,
-			ICSSPropertyID.VAL_TABLE_COLUMN, ICSSPropertyID.VAL_TABLE_CELL,
-			ICSSPropertyID.VAL_TABLE_CAPTION, ICSSPropertyID.VAL_NONE };
-
-	/**
-	 */
-	public DisplayMeta() {
-		super(false, ICSSPropertyID.VAL_INLINE);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#getKeywordValues()
-	 */
-	protected String[] getKeywordValues() {
-		return KEYWORDS;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyMeta#calculateCSSValueResult(org.w3c.dom.css.CSSValue,
-	 *      java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.css2.property.AbstractStyle)
-	 */
-	public Object calculateCSSValueResult(CSSValue value, String propertyName,
-			ICSSStyle style) {
-		String text = value.getCssText();
-		if (text == null)
-			return ICSSPropertyID.VAL_INLINE;
-		String key = this.checkKeywordValues(text);
-		if (key != null)
-			return key;
-        return ICSSPropertyID.VAL_INLINE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/EmptyCellsMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/EmptyCellsMeta.java
deleted file mode 100644
index f56c78f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/EmptyCellsMeta.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class EmptyCellsMeta extends CSSPropertyMeta {
-	private static final String SHOW = "show"; //$NON-NLS-1$
-
-	static final String HIDE = "hide"; //$NON-NLS-1$
-
-	private static final String[] _keywords = new String[] { SHOW, HIDE };
-
-	/**
-	 */
-	public EmptyCellsMeta() {
-		// FIXME: on CSS spec, initial value should be "show".
-		// but seemed IE's default is hide.
-		super(true, HIDE);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#getKeywordValues()
-	 */
-	protected String[] getKeywordValues() {
-		return _keywords;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/FloatInfo.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/FloatInfo.java
deleted file mode 100644
index 92daafb..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/FloatInfo.java
+++ /dev/null
@@ -1,150 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-import org.eclipse.wst.css.core.internal.provisional.document.ICSSPrimitiveValue;
-import org.w3c.dom.css.CSSPrimitiveValue;
-
-/**
- * copied from wtp's internal code.
- * 
- * @author mengbo
- */
-public final class FloatInfo {
-	/**
-	 * @param text 
-	 */
-	public FloatInfo(String text) {
-		parse(text);
-	}
-
-	/**
-	 * 
-	 */
-	void parse(String text) {
-		StringBuffer bufValue = new StringBuffer();
-		StringBuffer bufIdent = new StringBuffer();
-		boolean bNum = true;
-		int len = text.length();
-		for (int i = 0; i < len; i++) {
-			char c = text.charAt(i);
-			if (bNum) {
-				if ('0' <= c && c <= '9' || c == '.' || c == '+' || c == '-') {
-					bufValue.append(c);
-				} else {
-					bufIdent.append(c);
-					bNum = false;
-				}
-			} else {
-				bufIdent.append(c);
-			}
-		}
-		String valueStr = bufValue.toString();
-		_value = Float.valueOf(valueStr).floatValue();
-		_identifier = bufIdent.toString();
-		_type = getFloatValueType(valueStr, _identifier);
-	}
-
-	/**
-	 * @return the value
-	 * 
-	 */
-	public float getValue() {
-		return _value;
-	}
-
-	/**
-	 * 
-	 */
-	String getIdentifier() {
-		return _identifier;
-	}
-
-	/**
-	 * @return the value type
-	 */
-	public short getValueType() {
-		return _type;
-	}
-
-	/**
-	 * 
-	 */
-	static short getFloatValueType(String value, String ident) {
-		ident = ident.toLowerCase();
-		short valueType;
-		if (ident.length() == 0) {
-			if (0 <= value.indexOf('.')) {
-				valueType = CSSPrimitiveValue.CSS_NUMBER;
-			} else {
-				valueType = ICSSPrimitiveValue.CSS_INTEGER;
-			}
-		} else if (ident.equals("%")) { //$NON-NLS-1$
-			//$NON-NLS-1$
-			valueType = CSSPrimitiveValue.CSS_PERCENTAGE;
-		} else if (ident.equalsIgnoreCase("em")) { //$NON-NLS-1$
-			//$NON-NLS-1$
-			valueType = CSSPrimitiveValue.CSS_EMS;
-		} else if (ident.equalsIgnoreCase("ex")) { //$NON-NLS-1$
-			//$NON-NLS-1$
-			valueType = CSSPrimitiveValue.CSS_EXS;
-		} else if (ident.equalsIgnoreCase("px")) { //$NON-NLS-1$
-			//$NON-NLS-1$
-			valueType = CSSPrimitiveValue.CSS_PX;
-		} else if (ident.equalsIgnoreCase("cm")) { //$NON-NLS-1$
-			//$NON-NLS-1$
-			valueType = CSSPrimitiveValue.CSS_CM;
-		} else if (ident.equalsIgnoreCase("mm")) { //$NON-NLS-1$
-			//$NON-NLS-1$
-			valueType = CSSPrimitiveValue.CSS_MM;
-		} else if (ident.equalsIgnoreCase("in")) { //$NON-NLS-1$
-			//$NON-NLS-1$
-			valueType = CSSPrimitiveValue.CSS_IN;
-		} else if (ident.equalsIgnoreCase("pt")) { //$NON-NLS-1$
-			//$NON-NLS-1$
-			valueType = CSSPrimitiveValue.CSS_PT;
-		} else if (ident.equalsIgnoreCase("pc")) { //$NON-NLS-1$
-			//$NON-NLS-1$
-			valueType = CSSPrimitiveValue.CSS_PC;
-		} else if (ident.equalsIgnoreCase("deg")) { //$NON-NLS-1$
-			//$NON-NLS-1$
-			valueType = CSSPrimitiveValue.CSS_DEG;
-		} else if (ident.equalsIgnoreCase("rad")) { //$NON-NLS-1$
-			//$NON-NLS-1$
-			valueType = CSSPrimitiveValue.CSS_RAD;
-		} else if (ident.equalsIgnoreCase("grad")) { //$NON-NLS-1$
-			//$NON-NLS-1$
-			valueType = CSSPrimitiveValue.CSS_GRAD;
-		} else if (ident.equalsIgnoreCase("ms")) { //$NON-NLS-1$
-			//$NON-NLS-1$
-			valueType = CSSPrimitiveValue.CSS_MS;
-		} else if (ident.equalsIgnoreCase("s")) { //$NON-NLS-1$
-			//$NON-NLS-1$
-			valueType = CSSPrimitiveValue.CSS_S;
-		} else if (ident.equalsIgnoreCase("hz")) { //$NON-NLS-1$
-			//$NON-NLS-1$
-			valueType = CSSPrimitiveValue.CSS_HZ;
-		} else if (ident.equalsIgnoreCase("khz")) { //$NON-NLS-1$
-			//$NON-NLS-1$
-			valueType = CSSPrimitiveValue.CSS_KHZ;
-		} else {
-			valueType = CSSPrimitiveValue.CSS_DIMENSION;
-		}
-		return valueType;
-	}
-
-	private float _value = 0.0f;
-
-	private String _identifier = null;
-
-	private short _type = CSSPrimitiveValue.CSS_UNKNOWN;
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/FontFamilyMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/FontFamilyMeta.java
deleted file mode 100644
index 0589c41..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/FontFamilyMeta.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.StringTokenizer;
-
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.eclipse.swt.graphics.FontData;
-import org.eclipse.swt.widgets.Display;
-import org.w3c.dom.Element;
-import org.w3c.dom.css.CSSValue;
-import org.w3c.dom.css.CSSValueList;
-
-/**
- * @author mengbo
- */
-public class FontFamilyMeta extends CSSPropertyMeta {
-	/**
-	 * the default font name
-	 */
-	public static final String DEFAULT_FONT = "Times New Roman"; //$NON-NLS-1$
-
-	private static FontData[] _FontData;
-
-	private static FontData[] getFontData() {
-		if (_FontData == null) {
-			ArrayList list = new ArrayList();
-			list.addAll(Arrays.asList(Display.getCurrent().getFontList(null,
-					false)));
-			list.addAll(Arrays.asList(Display.getCurrent().getFontList(null,
-					true)));
-			_FontData = (FontData[]) list.toArray(new FontData[list.size()]);
-		}
-		return _FontData;
-	}
-
-	/**
-	 */
-	public FontFamilyMeta() {
-		super(true, DEFAULT_FONT);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#getKeywordValues()
-	 */
-	protected String[] getKeywordValues() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#calculateCSSValueResult(org.w3c.dom.css.CSSValue,
-	 *      java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.css2.style.AbstractStyle)
-	 */
-	public Object calculateCSSValueResult(CSSValue value, String propertyName,
-			ICSSStyle style) {
-		if (value.getCssValueType() == CSSValue.CSS_VALUE_LIST) {
-			CSSValueList valueList = (CSSValueList) value;
-			for (int i = 0, count = valueList.getLength(); i < count; i++) {
-				String name = valueList.item(i).getCssText();
-				name = trimPadding(name);
-				if (isSupportedFont(name)) {
-					return name;
-				}
-			}
-		}
-		return trimPadding(value.getCssText());
-	}
-
-	private String trimPadding(String name) {
-		String value = name;
-		if (value != null) {
-			value = value.replaceAll("\"", ""); //$NON-NLS-1$ //$NON-NLS-2$
-			value = value.replaceAll("'", ""); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-		return value;
-	}
-
-	private boolean isSupportedFont(String name) {
-		FontData[] fontData = getFontData();
-		for (int i = 0; i < fontData.length; i++) {
-			if (fontData[i].getName().equalsIgnoreCase(name)) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#calculateHTMLAttributeOverride(org.w3c.dom.Element,
-	 *      java.lang.String, java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.css2.ICSSStyle)
-	 */
-	public Object calculateHTMLAttributeOverride(Element element,
-			String htmltag, String propertyName, ICSSStyle style) {
-		if ("FONT".equalsIgnoreCase(htmltag) //$NON-NLS-1$
-				|| "BASEFONT".equalsIgnoreCase(htmltag)) { //$NON-NLS-1$
-			String face = DOMUtil.getAttributeIgnoreCase(element, "face"); //$NON-NLS-1$
-			if (face != null) {
-				String[] names = getFontNameList(face);
-				for (int i = 0; i < names.length; i++) {
-					if (isSupportedFont(names[i])) {
-						return names[i];
-					}
-				}
-			} else {
-				return null;
-			}
-		}
-		return null;
-	}
-
-	private String[] getFontNameList(String face) {
-		StringTokenizer tokenizer = new StringTokenizer(face, ","); //$NON-NLS-1$
-		String[] names = new String[tokenizer.countTokens()];
-		for (int i = 0; i < names.length; i++) {
-			names[i] = trimPadding(tokenizer.nextToken());
-		}
-		return names;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/FontSizeMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/FontSizeMeta.java
deleted file mode 100644
index 498e52a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/FontSizeMeta.java
+++ /dev/null
@@ -1,195 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.font.ICSSFont;
-import org.eclipse.jst.pagedesigner.css2.value.Length;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.w3c.dom.Element;
-import org.w3c.dom.css.CSSValue;
-
-/**
- * The result value should be Length object only.
- * 
- * @author mengbo
- */
-// XXX: in the future, we may add "unit" into Length, the one unit will be
-// "MEDIUM"
-// and specific for font. Means the relative size to MEDIUM. Then it is possible
-// for
-// the caller to decide the actual font size based on the style specific MEDIUM
-// size.
-public class FontSizeMeta extends LengthMeta {
-	private static final String[] KEYWORDS = { ICSSPropertyID.VAL_XX_SMALL,
-			ICSSPropertyID.VAL_X_SMALL, ICSSPropertyID.VAL_SMALL,
-			ICSSPropertyID.VAL_MEDIUM, ICSSPropertyID.VAL_LARGE,
-			ICSSPropertyID.VAL_X_LARGE, ICSSPropertyID.VAL_XX_LARGE,
-			ICSSPropertyID.VAL_LARGER, ICSSPropertyID.VAL_SMALLER };
-
-	/**
-	 * font size
-	 */
-	public static final double MEDIUM_VAL_INT = 16;
-
-	private static final double SCALING_FACTOR = 1.2;
-
-	private static final double FACTORS[] = { 0.6, 0.89, 1, 1.2, 1.5, 2.0, 3.0 };
-
-	// The scaling factors in IE is different from CSS definition. Here we
-	// follow IE.
-	private static final double CSS_ABSOLUTE_FACTORS[] = { 0.63, 0.82, 1, 1.12,
-			1.5, 2.0, 3.0 };
-
-	private static final int MIN_SIZE_FOR_SMALLER = 1;
-
-	private static final int MIN_SIZE_FOR_LARGER = 9;
-
-	/**
-	 * Default constructor
-	 */
-	public FontSizeMeta() {
-		super(true, new Length((int) MEDIUM_VAL_INT, false));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.LengthMeta#getBaseFont(org.eclipse.jst.pagedesigner.css2.property.AbstractStyle)
-	 */
-	protected ICSSFont getBaseFont(ICSSStyle style) {
-		return style.getParentStyle().getCSSFont();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#getKeywordValues()
-	 */
-	protected String[] getKeywordValues() {
-		return KEYWORDS;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#getPercentageType()
-	 */
-	public int getPercentageType() {
-		return PERCENTAGE_FONT;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.LengthMeta#calculateCSSValueResult(org.w3c.dom.css.CSSValue,
-	 *      java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.css2.style.AbstractStyle)
-	 */
-	public Object calculateCSSValueResult(CSSValue value, String propertyName,
-			ICSSStyle style) {
-		Object obj = super.calculateCSSValueResult(value, propertyName, style);
-		if (obj instanceof Length) {
-			return obj;
-		}
-		// otherwise, it is keyword.
-		return convertKeyword(obj, style);
-	}
-
-	/**
-	 * @param fontsizeobj
-	 * @param style
-	 * @return the length
-	 */
-	protected Length convertKeyword(Object fontsizeobj, ICSSStyle style) {
-		int fontsize;
-		int parentfontsize = style.getParentStyle().getCSSFont().getFontSize();
-		if (fontsizeobj instanceof Length) {
-			fontsize = ((Length) fontsizeobj).getValue();
-		} else if (ICSSPropertyID.VAL_XX_SMALL.equals(fontsizeobj)) {
-			fontsize = (int) (MEDIUM_VAL_INT * CSS_ABSOLUTE_FACTORS[0]);
-		} else if (ICSSPropertyID.VAL_X_SMALL.equals(fontsizeobj)) {
-			fontsize = (int) (MEDIUM_VAL_INT * CSS_ABSOLUTE_FACTORS[1]);
-		} else if (ICSSPropertyID.VAL_SMALL.equals(fontsizeobj)) {
-			fontsize = (int) (MEDIUM_VAL_INT * CSS_ABSOLUTE_FACTORS[2]);
-		} else if (ICSSPropertyID.VAL_MEDIUM.equals(fontsizeobj)) {
-			fontsize = (int) Math.round(MEDIUM_VAL_INT
-					* CSS_ABSOLUTE_FACTORS[3]);
-		} else if (ICSSPropertyID.VAL_LARGE.equals(fontsizeobj)) {
-			fontsize = (int) (MEDIUM_VAL_INT * CSS_ABSOLUTE_FACTORS[4]);
-		} else if (ICSSPropertyID.VAL_X_LARGE.equals(fontsizeobj)) {
-			fontsize = (int) (MEDIUM_VAL_INT * CSS_ABSOLUTE_FACTORS[5]);
-		} else if (ICSSPropertyID.VAL_XX_LARGE.equals(fontsizeobj)) {
-			fontsize = (int) (MEDIUM_VAL_INT * CSS_ABSOLUTE_FACTORS[6]);
-		} else if (ICSSPropertyID.VAL_SMALLER.equals(fontsizeobj)) {
-			fontsize = (int) (parentfontsize / SCALING_FACTOR);
-			if (fontsize < MIN_SIZE_FOR_SMALLER) {
-				fontsize = MIN_SIZE_FOR_SMALLER;
-			}
-		} else if (ICSSPropertyID.VAL_LARGER.equals(fontsizeobj)) {
-			fontsize = (int) (parentfontsize * SCALING_FACTOR);
-			if (fontsize < MIN_SIZE_FOR_LARGER) {
-				fontsize = MIN_SIZE_FOR_LARGER;
-			}
-		} else {
-			fontsize = parentfontsize;
-		}
-
-		return new Length(fontsize, false);
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#calculateHTMLAttributeOverride(org.w3c.dom.Element,
-	 *      java.lang.String, java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.css2.ICSSStyle)
-	 */
-	public Object calculateHTMLAttributeOverride(Element element,
-			String htmltag, String propertyName, ICSSStyle style) {
-		if (IHTMLConstants.TAG_FONT.equalsIgnoreCase(htmltag)
-				|| ICSSPropertyID.ATTR_BASEFONT.equalsIgnoreCase(htmltag)) {
-			String size = DOMUtil.getAttributeIgnoreCase(element,
-					ICSSPropertyID.ATTR_SIZE);
-			if (size != null) {
-				size = size.trim();
-				try {
-					int fontSize = 0;
-					if (size.startsWith("+")) //$NON-NLS-1$
-					{
-						fontSize = Integer.parseInt(size.substring(1)) + 3;
-					} else if (size.startsWith("-")) //$NON-NLS-1$
-					{
-						fontSize = 3 - Integer.parseInt(size.substring(1));
-					} else {
-						fontSize = Integer.parseInt(size);
-					}
-					if (fontSize < 1) {
-						fontSize = 1;
-					}
-					if (fontSize > 7) {
-						fontSize = 7;
-					}
-					return new Length((int) (Math.round(FACTORS[fontSize - 1]
-							* MEDIUM_VAL_INT)), false);
-				} catch (Exception ex) {
-					// Error in tag font attr calculating.
-					// _log.error("Error.FontSizeMeta.0", ex); //$NON-NLS-1$
-					return null;
-				}
-			}
-		}
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/FontStyleMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/FontStyleMeta.java
deleted file mode 100644
index 7d46ab2..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/FontStyleMeta.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-/**
- * @author mengbo
- */
-public class FontStyleMeta extends CSSPropertyMeta {
-	static final String[] KEYWORDS = new String[] { ICSSPropertyID.VAL_NORMAL,
-			ICSSPropertyID.VAL_ITALIC, ICSSPropertyID.VAL_OBLIQUE };
-
-	/**
-	 * Default constructor
-	 */
-	public FontStyleMeta() {
-		super(true, ICSSPropertyID.VAL_NORMAL);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#getKeywordValues()
-	 */
-	protected String[] getKeywordValues() {
-		return KEYWORDS;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/FontWeightMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/FontWeightMeta.java
deleted file mode 100644
index 3b333e9..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/FontWeightMeta.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.w3c.dom.css.CSSValue;
-
-/**
- * The result value will always be integer, range 100-900 This class has already
- * translate things like "normal", "bold", "bolder", "lighter" into integer
- * value.
- * 
- * @author mengbo
- */
-public class FontWeightMeta extends CSSPropertyMeta {
-
-	/**
-	 * normal weight value
-	 */
-	public static final Integer NORMAL_WEIGHT = new Integer(400);
-
-	private static final Integer BOLD_WEIGHT = new Integer(700);
-
-	private static final String[] KEYWORDS = new String[] { ICSSPropertyID.VAL_NORMAL,
-			ICSSPropertyID.VAL_BOLD, ICSSPropertyID.VAL_BOLDER,
-			ICSSPropertyID.VAL_LIGHTER };
-
-
-	/**
-	 * Default constructor
-	 */
-	public FontWeightMeta() {
-		super(true, NORMAL_WEIGHT);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#getKeywordValues()
-	 */
-	protected String[] getKeywordValues() {
-		return KEYWORDS;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#calculateCSSValueResult(org.w3c.dom.css.CSSValue,
-	 *      java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.css2.style.AbstractStyle)
-	 */
-	public Object calculateCSSValueResult(CSSValue value, String propertyName,
-			ICSSStyle style) {
-		String text = value.getCssText();
-		String result = checkKeywordValues(text);
-		if (result == null) {
-			try {
-				int i = Integer.parseInt(text);
-				if (i < 100) {
-					i = 100;
-				}
-				if (i > 900) {
-					i = 900;
-				}
-				return new Integer(i);
-			} catch (Exception ex) {
-				// Error in integer processing
-				return NORMAL_WEIGHT;
-			}
-		} else if (ICSSPropertyID.VAL_NORMAL.equals(result)) {
-			return NORMAL_WEIGHT;
-		} else if (ICSSPropertyID.VAL_BOLD.equals(result)) {
-			return BOLD_WEIGHT;
-		} else if (ICSSPropertyID.VAL_BOLDER.equals(result)) {
-			// int i = style.getParentStyle().getCSSFont().getWeight() + 100;
-			// if (i < 100)
-			// i = 100;
-			// if (i > 900)
-			// i = 900;
-			// return new Integer(i);
-			return BOLD_WEIGHT;
-		} else if (ICSSPropertyID.VAL_LIGHTER.equals(result)) {
-			int i = style.getParentStyle().getCSSFont().getWeight() - 100;
-			if (i < 100) {
-				i = 100;
-			}
-			if (i > 900) {
-				i = 900;
-			}
-			return new Integer(i);
-		}
-		return NORMAL_WEIGHT;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/HeightMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/HeightMeta.java
deleted file mode 100644
index fcc6527..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/HeightMeta.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- */
-public class HeightMeta extends LengthMeta {
-	/**
-	 * Default constructor
-	 */
-	public HeightMeta() {
-		super(false, ICSSPropertyID.VAL_AUTO);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#calculateHTMLAttributeOverride(org.w3c.dom.Element,
-	 *      java.lang.String, java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.css2.ICSSStyle)
-	 */
-	public Object calculateHTMLAttributeOverride(Element element,
-			String htmltag, String propertyName, ICSSStyle style) {
-		if (!"input".equalsIgnoreCase(htmltag)) //$NON-NLS-1$
-		{
-			String attributeName = ICSSPropertyID.ATTR_HEIGHT;
-			if ("hr".equalsIgnoreCase(htmltag)) { //$NON-NLS-1$
-				attributeName = ICSSPropertyID.ATTR_SIZE;
-			}
-
-			String height = DOMUtil.getAttributeIgnoreCase(element,
-					attributeName);
-			if (height != null) {
-				return LengthMeta.toLength(height, style, this
-						.getPercentageType(), getBaseFont(style));
-			}
-		}
-		return super.calculateHTMLAttributeOverride(element, htmltag,
-				propertyName, style);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/HorizontalAlignMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/HorizontalAlignMeta.java
deleted file mode 100644
index 6dd075c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/HorizontalAlignMeta.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-import java.util.Arrays;
-
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- */
-public class HorizontalAlignMeta extends CSSPropertyMeta {
-	static final String[] KEYWORDS = new String[] { ICSSPropertyID.VAL_LEFT,
-			"bottom", "top", //$NON-NLS-1$ //$NON-NLS-2$
-			ICSSPropertyID.VAL_RIGHT, ICSSPropertyID.VAL_CENTER,
-			ICSSPropertyID.VAL_JUSTIFY };
-
-	private static final String[] HOR_SLIGN_HTMLTAGS = new String[] {
-			"TABLE", "HR", "LEGEND", "APPLET", "IFRAME", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
-			"IMG", "INPUT", "OBJECT", "CAPTION" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
-	};
-
-	/**
-	 * default constructor
-	 */
-	public HorizontalAlignMeta() {
-		super(true, NOT_SPECIFIED);
-	}
-
-	/**
-	 * @param inherit
-	 * @param initvalue
-	 */
-	public HorizontalAlignMeta(boolean inherit, Object initvalue) {
-		super(inherit, initvalue);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#getKeywordValues()
-	 */
-	protected String[] getKeywordValues() {
-		return KEYWORDS;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#calculateHTMLAttributeOverride(org.w3c.dom.Element,
-	 *      java.lang.String, java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.css2.ICSSStyle)
-	 */
-	public Object calculateHTMLAttributeOverride(Element element,
-			String htmltag, String propertyName, ICSSStyle style) {
-
-		if (Arrays.asList(HOR_SLIGN_HTMLTAGS).contains(htmltag.toUpperCase())) {
-			String align = DOMUtil.getAttributeIgnoreCase(element, "align"); //$NON-NLS-1$
-			return checkKeywordValues(align);
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyMeta#getHTMLElementInitialValue(org.w3c.dom.Element,
-	 *      java.lang.String, java.lang.String)
-	 */
-	public Object getHTMLElementInitialValue(Element element, String htmltag,
-			String propertyName) {
-		if ("HR".equalsIgnoreCase(htmltag.toUpperCase())) //$NON-NLS-1$
-		{
-			return ICSSPropertyID.VAL_CENTER;
-		} else if (Arrays.asList(HOR_SLIGN_HTMLTAGS).contains(
-				htmltag.toUpperCase())) {
-			return ICSSPropertyID.VAL_LEFT;
-		}
-
-		return super.getHTMLElementInitialValue(element, htmltag, propertyName);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/ICSSPropertyID.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/ICSSPropertyID.java
deleted file mode 100644
index 4930fab..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/ICSSPropertyID.java
+++ /dev/null
@@ -1,927 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-/**
- * @author mengbo
- */
-public interface ICSSPropertyID {
-	/**
-	 * display attribute name
-	 */
-	public static final String ATTR_DISPLAY = "display"; //$NON-NLS-1$
-
-	/**
-	 * whitespace attribute name
-	 */
-	public static final String ATTR_WHITESPACE = "white-space"; //$NON-NLS-1$
-
-	/**
-	 * text decoration attribute name
-	 */
-	public static final String ATTR_TEXTDECORATION = "text-decoration"; //$NON-NLS-1$
-
-	/**
-	 * text align attribute name
-	 */
-	public static final String ATTR_TEXTALIGN = "text-align"; //$NON-NLS-1$
-
-	/**
-	 * width attribute name
-	 */
-	public static final String ATTR_WIDTH = "width"; //$NON-NLS-1$
-
-	/**
-	 * min-width attribute name
-	 */
-	public static final String ATTR_MIN_WIDTH = "min-width"; //$NON-NLS-1$
-
-	/**
-	 * height attribute name
-	 */
-	public static final String ATTR_HEIGHT = "height"; //$NON-NLS-1$
-
-	/**
-	 * min height attribute name
-	 */
-	public static final String ATTR_MIN_HEIGHT = "min-height"; //$NON-NLS-1$
-
-	/**
-	 * border-left-width attribute name
-	 */
-	public static final String ATTR_BORDER_LEFT_WIDTH = "border-left-width"; //$NON-NLS-1$
-
-	/**
-	 * border-right-width attribute name
-	 */
-	public static final String ATTR_BORDER_RIGHT_WIDTH = "border-right-width"; //$NON-NLS-1$
-
-	/**
-	 * border bottom width
-	 */
-	public static final String ATTR_BORDER_BOTTOM_WIDTH = "border-bottom-width"; //$NON-NLS-1$
-
-	/**
-	 * css style attribute
-	 */
-	public static final String ATTR_BORDER_TOP_WIDTH = "border-top-width"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_FONT_FAMILY = "font-family"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_FONT_SIZE = "font-size"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_FONT_STYLE = "font-style"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_FONT_WEIGHT = "font-weight"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_BORDER_LEFT_STYLE = "border-left-style"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_BORDER_RIGHT_STYLE = "border-right-style"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_BORDER_BOTTOM_STYLE = "border-bottom-style"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_BORDER_TOP_STYLE = "border-top-style"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_BORDER_LEFT_COLOR = "border-left-color"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_BORDER_RIGHT_COLOR = "border-right-color"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_BORDER_BOTTOM_COLOR = "border-bottom-color"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_BORDER_TOP_COLOR = "border-top-color"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_PADDING_RIGHT = "padding-right"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_PADDING_BOTTOM = "padding-bottom"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_PADDING_LEFT = "padding-left"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_PADDING_TOP = "padding-top"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_MARGIN_RIGHT = "margin-right"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_MARGIN_BOTTOM = "margin-bottom"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_MARGIN_LEFT = "margin-left"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_MARGIN_TOP = "margin-top"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_BACKGROUND_COLOR = "background-color"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_BACKGROUND_IMAGE = "background-image"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_COLOR = "color"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_TEXTCOLOR = "text"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_BORDER_COLLAPSE = "border-collapse"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_BORDER_SPACING = "border-spacing"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_LIST_STYLE_TYPE = "list-style-type"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_LIST_STYLE_POSITION = "list-style-position"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_LIST_STYLE_IMAGE = "list-style-image"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_COUNTER_RESET = "counter-reset"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_COUNTER_INCREMENT = "counter-increment"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_EMPTY_CELLS = "empty-cells"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_VISIBILITY = "visibility"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_VERTICAL_ALIGN = "vertical-align"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_HORIZONTAL_ALIGN = "horizontal-align"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_CONTENT = "content"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_BGCOLOR = "bgcolor"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_TEXT = "text"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public final static String ATTR_MULTIPLE = "multiple"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public final static String ATTR_ITEMLABEL = "itemLabel"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public final static String ATTR_BINDING = "binding"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public final static String ATTR_ITEMVALUE = "itemValue"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public final static String ATTR_VALUE = "value"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_URI = "uri"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_PREFIX = "prefix"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_STYLECLASS = "styleClass"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_SIZE = "size"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_BASEFONT = "basefont"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_ROWSPAN = "rowSpan"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_COLSPAN = "colSpan"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_TYPE = "type"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_URL = "url"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_SRC = "src"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_TAGLIB_LOCATION = "taglib-location"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_TAGLIB_URI = "taglib-uri"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_IMAGE = "image"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_RESET = "reset"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_FOOTER = "footer"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_HEADER = "header"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_COLUMNS = "columns"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_COLUMNCLASSES = "columnClasses"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_CLASS = "class"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_STYLE = "style"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_PAGE = "page"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_HREF = "href"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_NAME = "name"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_BASENAME = "basename"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_ACTION = "action"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_TARGET = "target"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_TOP = "top"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_BOTTOM = "bottom"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_LEFT = "left"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_RIGHT = "right"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_POSITION = "position"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_TRANSPARENT = "transparent"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_COLLAPSE = "collapse"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_SEPARATE = "separate"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String ATTR_OVERFLOW = "overflow"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	// border style values
-	public static final String VAL_HIDDEN = "hidden"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_DOTTED = "dotted"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_DASHED = "dashed"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_SOLID = "solid"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_DOUBLE = "double"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_GROOVE = "groove"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_RIDGE = "ridge"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_INSET = "inset"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_OUTSET = "outset"; //$NON-NLS-1$
-
-	// XXX: we introduce a new style for TD default border style, since it
-	// seemed IE
-	// is using none of the above style for td.
-    /**
-     * css style value
-     */
-	public static final String VAL_TDBORDERSTYLE = "__td_border_style__"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_THIN = "thin"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_THICK = "thick"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_INLINE = "inline"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_BLOCK = "block"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_INLINE_BLOCK = "inline-block"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_LIST_ITEM = "list-item"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_RUN_IN = "run-in"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_COMPACT = "compact"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_MARKER = "marker"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_TABLE = "table"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_INLINE_TABLE = "inline-table"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_TABLE_ROW_GROUP = "table-row-group"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_TABLE_HEADER_GROUP = "table-header-group"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_TABLE_FOOTER_GROUP = "table-footer-group"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_TABLE_ROW = "table-row"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_TABLE_COLUMN_GROUP = "table-column-group"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_TABLE_COLUMN = "table-column"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_TABLE_CELL = "table-cell"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_TABLE_CAPTION = "table-caption"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_NONE = "none"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_XX_SMALL = "xx-small"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_X_SMALL = "x-small"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_SMALL = "small"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_MEDIUM = "medium"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_LARGE = "large"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_X_LARGE = "x-large"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_XX_LARGE = "xx-large"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_LARGER = "larger"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_SMALLER = "smaller"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_ITALIC = "italic"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_OBLIQUE = "oblique"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_NORMAL = "normal"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_BOLD = "bold"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_BOLDER = "bolder"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_LIGHTER = "lighter"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_AUTO = "auto"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_OUTSIDE = "outside"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_INSIDE = "inside"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_LEFT = "left"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_RIGHT = "right"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_CENTER = "center"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_JUSTIFY = "justify"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_UNDERLINE = "underline"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_OVERLINE = "overline"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_LINETHROUGH = "line-through"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_BLINK = "blink"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_PRE = "pre"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_NOWRAP = "nowrap"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public final static String VAL_DISC = "disc"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public final static String VAL_CIRCLE = "circle"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public final static String VAL_DECIMAL = "decimal"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public final static String VAL_CJK_IDEOGRAPHIC = "cjk-ideographic"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public final static String VAL_DECIMAL_LEADING_ZERO = "decimal-leading-zero"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public final static String VAL_ARMENIAN = "armenian"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public final static String VAL_LOWER_ALPHA = "lower-alpha"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public final static String VAL_LOWER_GREEK = "lower-greek"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public final static String VAL_LOWER_LATIN = "lower-latin"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public final static String VAL_LOWER_ROMAN = "lower-roman"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public final static String VAL_UPPER_ALPHA = "upper-alpha"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public final static String VAL_UPPER_LATIN = "upper-latin"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public final static String VAL_UPPER_ROMAN = "upper-roman"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public final static String VAL_HIRAGANA = "hiragana"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public final static String VAL_HIRAGANA_IROHA = "hiragana-iroha"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public final static String VAL_HEBREW = "hebrew"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public final static String VAL_GEORGIAN = "georgian"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public final static String VAL_KATAKANA = "katakana"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public final static String VAL_KATAKANA_IROHA = "katakana-iroha"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public final static String VAL_SQUARE = "square"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public final static String VAL_IMAGE = "image"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_MULTIPLE = "multiple"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_BUTTON = "button"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_CHECKBOX = "checkbox"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_RADIO = "radio"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_FILE = "file"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_RESET = "reset"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_SUBMIT = "submit"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_PASSWORD = "password"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_TEXT = "text"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_VISIBLE = "visible"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_SCROLL = "scroll"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String TAG_TAGLIB = "taglib"; //$NON-NLS-1$
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/ICSSPropertyMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/ICSSPropertyMeta.java
deleted file mode 100644
index 1ce1d12..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/ICSSPropertyMeta.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.w3c.dom.Element;
-import org.w3c.dom.css.CSSValue;
-
-/**
- * @author mengbo
- */
-public interface ICSSPropertyMeta {
-	/**
-	 * 
-	 */
-	static final int PERCENTAGE_NONE = 0;
-
-	/**
-	 * 
-	 */
-	static final int PERCENTAGE_BOXSIZE = 1;
-
-	/**
-	 * 
-	 */
-	static final int PERCENTAGE_HEIGHT_CONTAININGBLOCK = 2;
-
-	/**
-	 * 
-	 */
-	static final int PERCENTAGE_FONT = 3;
-
-	/**
-	 * 
-	 */
-	static final int PERCENTAGE_WIDTH_CONTAININGBLOCK = 4;
-
-	/**
-	 * 
-	 */
-	static final Object NOT_SPECIFIED = "NOT_SPECIFIED"; //$NON-NLS-1$
-
-	/**
-	 * whether default inherit.
-	 * 
-	 * @return true if is inherited
-	 */
-	public boolean isInherited();
-
-	/**
-	 * @param propertyName 
-	 * @param style 
-	 * 
-	 * @return the initial value object
-	 */
-	public Object getInitialValue(String propertyName, ICSSStyle style);
-
-	/**
-	 * @param element
-	 * @param htmltag
-	 * @param propertyName
-	 * @return the initial value object
-	 */
-	public Object getHTMLElementInitialValue(Element element, String htmltag,
-			String propertyName);
-
-	/**
-	 * what's percentage value based on.
-	 * 
-	 * @return the percentage value
-	 */
-	public int getPercentageType();
-
-	/**
-	 * for many CSS property, there is corresponding HTML attribute can also
-	 * specify value for them. This method should check whether the element has
-	 * corresponding HTML attribute provide value.
-	 * 
-	 * @param element
-	 *            the element
-	 * @param htmltag
-	 *            the html tag name. This is for in case element is jsp/jsf
-	 *            element, and have non html tag name.
-	 * @param propertyName
-	 *            the property name.
-	 * @param style
-	 *            the style
-	 * @return null if no attribute override.
-	 */
-	public Object calculateHTMLAttributeOverride(Element element,
-			String htmltag, String propertyName, ICSSStyle style);
-
-	/**
-	 * @param value
-	 * @param propertyName
-	 * @param style
-	 * @return the value result
-	 */
-	public Object calculateCSSValueResult(CSSValue value, String propertyName,
-			ICSSStyle style);
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/LengthMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/LengthMeta.java
deleted file mode 100644
index ec9f9e5..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/LengthMeta.java
+++ /dev/null
@@ -1,219 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.font.ICSSFont;
-import org.eclipse.jst.pagedesigner.css2.value.Length;
-import org.eclipse.swt.widgets.Display;
-import org.w3c.dom.DOMException;
-import org.w3c.dom.css.CSSPrimitiveValue;
-import org.w3c.dom.css.CSSValue;
-
-/**
- * @author mengbo
- */
-public class LengthMeta extends CSSPropertyMeta {
-	private static final String[] KEYWORDS = new String[] { ICSSPropertyID.VAL_AUTO };
-
-	/**
-	 * @param inherit
-	 * @param initvalue
-	 */
-	public LengthMeta(boolean inherit, Object initvalue) {
-		super(inherit, initvalue);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#getKeywordValues()
-	 */
-	protected String[] getKeywordValues() {
-		return KEYWORDS;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyMeta#calculateCSSValueResult(org.w3c.dom.css.CSSValue,
-	 *      java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.css2.property.AbstractStyle)
-	 */
-	public Object calculateCSSValueResult(CSSValue value, String propertyName,
-			ICSSStyle style) {
-		if (value == null || value.getCssValueType() == CSSValue.CSS_VALUE_LIST
-				|| value.getCssValueType() == CSSValue.CSS_CUSTOM) {
-			return ICSSPropertyID.VAL_AUTO;
-		}
-		if (value.getCssValueType() == CSSValue.CSS_INHERIT) {
-			return ICSSPropertyID.VAL_AUTO;
-		}
-		CSSPrimitiveValue primitive = (CSSPrimitiveValue) value;
-		String key = checkKeywordValues(primitive.getCssText());
-		if (key != null) {
-			return key;
-		}
-		short unitType = primitive.getPrimitiveType();
-		float fvalue;
-		try {
-			fvalue = primitive.getFloatValue(unitType);
-		} catch (DOMException ex) {
-// Hide this info.   Consider adding DEBUG option			
-//			_log.info("Get length failed, use auto value instead ("
-//					+ value.getCssText() + ")");
-			return ICSSPropertyID.VAL_AUTO;
-		}
-		return toLength(fvalue, unitType, style, this.getPercentageType(),
-				getBaseFont(style));
-	}
-
-	/**
-	 * @param lengthStr
-	 * @param style
-	 * @param percenttype
-	 * @param font
-	 * @return the object
-	 */
-	public static Object toLength(String lengthStr, ICSSStyle style,
-			int percenttype, ICSSFont font) {
-		try {
-			FloatInfo floatinfo = new FloatInfo(lengthStr);
-			return toLength(floatinfo.getValue(), floatinfo.getValueType(),
-					style, percenttype, font);
-		} catch (Exception e) {
-			return ICSSPropertyID.VAL_AUTO;
-		}
-	}
-
-	/**
-	 * Will not calculate percentage value. Used for calculate the "width" and
-	 * "height" css property
-	 * @param result 
-	 * @param unitType 
-	 * @param style 
-	 * @param percenttype 
-	 * @param font
-	 * @return an object?
-	 */
-	public static Object toLength(float result, short unitType,
-			ICSSStyle style, int percenttype, ICSSFont font) {
-		switch (unitType) {
-		case CSSPrimitiveValue.CSS_PERCENTAGE:
-			if (percenttype == PERCENTAGE_FONT) {
-				result = (int) ((result * font.getFontSize()) / 100.0);
-				break;
-			}
-			return new Length((int) result, true);
-		case CSSPrimitiveValue.CSS_PX: // no more calculation needed
-		case CSSPrimitiveValue.CSS_NUMBER:
-			break;
-		case CSSPrimitiveValue.CSS_EMS:
-			result *= font.getFontSize();
-			break;
-		case CSSPrimitiveValue.CSS_EXS:
-			result *= font.getXHeight();
-			break;
-		case CSSPrimitiveValue.CSS_CM:
-			result = cmToPixel(result);
-			break;
-		case CSSPrimitiveValue.CSS_IN:
-			result = inToPixel(result);
-			break;
-		case CSSPrimitiveValue.CSS_MM:
-			result = mmToPixel(result);
-			break;
-		case CSSPrimitiveValue.CSS_PT:
-			result = ptToPixel(result);
-			break;
-		case CSSPrimitiveValue.CSS_PC:
-			result = pcToPixel(result);
-			break;
-		case CSSPrimitiveValue.CSS_STRING:
-			return ICSSPropertyID.VAL_AUTO;
-			// FIXME:every thing is delt with?
-		}
-		// ok, when reach here, means we get the float value "result"
-		return new Length((int) result, false);
-	}
-
-	/**
-	 * child class can override this method. e.g: font-size style's base font is
-	 * parent style's font.
-	 * 
-	 * @param style
-	 * @return the base font
-	 */
-	protected ICSSFont getBaseFont(ICSSStyle style) {
-		return style.getCSSFont();
-	}
-
-	private static float pcToPixel(float value) {
-		return ptToPixel(12 * value);
-	}
-
-	/**
-	 * @param floatValue
-	 * @return
-	 */
-	private static float ptToPixel(float floatValue) {
-		// the points used by CSS 2.1 are equal to 1/72th of an inch.
-		return inToPixel(floatValue / 72);
-	}
-
-	/**
-	 * @param floatValue
-	 * @return
-	 */
-	private static float mmToPixel(float floatValue) {
-		return cmToPixel(floatValue / 10);
-	}
-
-	/**
-	 * @param floatValue
-	 * @return
-	 */
-	private static float inToPixel(float floatValue) {
-		return getDPI() * floatValue;
-	}
-
-	/**
-	 * @param floatValue
-	 * @return
-	 */
-	private static float cmToPixel(float floatValue) {
-		// 1 inch is equal to 2.54 centimeters
-		return inToPixel((float) (floatValue / 2.54));
-	}
-
-	/**
-	 * @return
-	 */
-	private static float getDPI() {
-		// XXX: cache the value?
-		return Display.getCurrent().getDPI().x;
-	}
-
-	/**
-	 * @param result
-	 * @return true if is auto
-	 */
-	public static boolean isAuto(Object result) {
-		if (result == ICSSPropertyID.VAL_AUTO) {
-			return true;
-		}
-		if (result instanceof Length && ((Length) result).getValue() <= 0) {
-			return true;
-		}
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/ListStyleImageMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/ListStyleImageMeta.java
deleted file mode 100644
index c275340..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/ListStyleImageMeta.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- */
-public class ListStyleImageMeta extends CSSPropertyMeta {
-	private static final String INITIAL_VALUE = ICSSPropertyID.VAL_NONE;
-
-	/**
-	 * Default constructor
-	 */
-	public ListStyleImageMeta() {
-		super(true, INITIAL_VALUE);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#getKeywordValues()
-	 */
-	protected String[] getKeywordValues() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyMeta#calculateHTMLAttributeOverride(org.w3c.dom.Element,
-	 *      java.lang.String, java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.css2.ICSSStyle)
-	 */
-	public Object calculateHTMLAttributeOverride(Element element,
-			String htmltag, String propertyName, ICSSStyle style) {
-		return DOMUtil.getAttributeIgnoreCase(element,
-				ICSSPropertyID.ATTR_LIST_STYLE_IMAGE);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/ListStylePositionMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/ListStylePositionMeta.java
deleted file mode 100644
index 355a173..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/ListStylePositionMeta.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-/**
- * @author mengbo
- */
-public class ListStylePositionMeta extends CSSPropertyMeta {
-	private static final String INITIAL_VALUE = ICSSPropertyID.VAL_OUTSIDE;
-
-	/**
-	 * Default constructor
-	 */
-	public ListStylePositionMeta() {
-		super(true, INITIAL_VALUE);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#getKeywordValues()
-	 */
-	protected String[] getKeywordValues() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/ListStyleTypeMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/ListStyleTypeMeta.java
deleted file mode 100644
index 641bd39..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/ListStyleTypeMeta.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.w3c.dom.Element;
-import org.w3c.dom.css.CSSValue;
-
-/**
- * @author mengbo
- */
-public class ListStyleTypeMeta extends CSSPropertyMeta {
-	private static final String INITIAL_VALUE = ICSSPropertyID.VAL_DISC;
-
-	/**
-	 * Default constructor
-	 */
-	public ListStyleTypeMeta() {
-		super(true, INITIAL_VALUE);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#getKeywordValues()
-	 */
-	protected String[] getKeywordValues() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyMeta#calculateCSSValueResult(org.w3c.dom.css.CSSValue,
-	 *      java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.css2.style.AbstractStyle)
-	 */
-	public Object calculateCSSValueResult(CSSValue value, String propertyName,
-			ICSSStyle style) {
-		return value.getCssText();
-	}
-
-	// /*
-	// * (non-Javadoc)
-	// *
-	// * @see
-	// org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyMeta#calculateHTMLAttributeOverride(org.w3c.dom.Element,
-	// java.lang.String, java.lang.String,
-	// org.eclipse.jst.pagedesigner.css2.ICSSStyle)
-	// */
-	public Object calculateHTMLAttributeOverride(Element element,
-			String htmltag, String propertyName, ICSSStyle style) {
-		String listStyle = DOMUtil.getAttributeIgnoreCase(element, "type"); //$NON-NLS-1$
-		if (listStyle == null && element != null
-				&& element.getParentNode() != null) {
-			listStyle = DOMUtil.getAttributeIgnoreCase((Element) element
-					.getParentNode(), "type"); //$NON-NLS-1$
-		}
-		if (listStyle != null) {
-			listStyle = listStyle.trim();
-			if (listStyle.equals("1")) { //$NON-NLS-1$
-				return ICSSPropertyID.VAL_DECIMAL;
-			} else if (listStyle.equals("a")) { //$NON-NLS-1$
-				return ICSSPropertyID.VAL_LOWER_ALPHA;
-			} else if (listStyle.equals("A")) { //$NON-NLS-1$
-				return ICSSPropertyID.VAL_UPPER_ALPHA;
-			} else if (listStyle.equals("i")) { //$NON-NLS-1$
-				return ICSSPropertyID.VAL_LOWER_ROMAN;
-			} else if (listStyle.equals("I")) { //$NON-NLS-1$
-				return ICSSPropertyID.VAL_UPPER_ROMAN;
-			}
-			return listStyle;
-		}
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/MarginWidthMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/MarginWidthMeta.java
deleted file mode 100644
index fddf276..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/MarginWidthMeta.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-/**
- * @author mengbo
- */
-public class MarginWidthMeta extends LengthMeta {
-
-	/**
-	 * Default constructor
-	 */
-	public MarginWidthMeta() {
-		super(false, ICSSPropertyID.VAL_AUTO);
-	}
-
-	/**
-	 * @param propertyName
-	 * @return true if the property is the margin width
-	 */
-	public static boolean isMarginWidth(String propertyName) {
-		return ICSSPropertyID.ATTR_MARGIN_BOTTOM.equalsIgnoreCase(propertyName)
-				|| ICSSPropertyID.ATTR_MARGIN_TOP
-						.equalsIgnoreCase(propertyName)
-				|| ICSSPropertyID.ATTR_MARGIN_LEFT
-						.equalsIgnoreCase(propertyName)
-				|| ICSSPropertyID.ATTR_MARGIN_RIGHT
-						.equalsIgnoreCase(propertyName);
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/Messages.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/Messages.java
deleted file mode 100644
index 50dcc39..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/Messages.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-/**
- * String resource handler
- *
- */
-public class Messages {
-	private static final String BUNDLE_NAME = "org.eclipse.jst.pagedesigner.css2.property.messages"; //$NON-NLS-1$
-
-	private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle
-			.getBundle(BUNDLE_NAME);
-
-	/**
-	 * @param key
-	 * @return nls'ed string
-	 */
-	public static String getString(String key) {
-		try {
-			return RESOURCE_BUNDLE.getString(key);
-		} catch (MissingResourceException e) {
-			return '!' + key + '!';
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/OverflowMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/OverflowMeta.java
deleted file mode 100644
index 95712c5..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/OverflowMeta.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.w3c.dom.css.CSSValue;
-
-/**
- * 
- * @author mengbo
- * @version 1.5
- */
-public class OverflowMeta extends CSSPropertyMeta {
-	static final String[] KEYWORDS = new String[] { ICSSPropertyID.VAL_VISIBLE,
-			ICSSPropertyID.VAL_HIDDEN, ICSSPropertyID.VAL_SCROLL,
-			ICSSPropertyID.VAL_AUTO };
-
-	/**
-	 * Default constructor
-	 */
-	public OverflowMeta() {
-		super(false, ICSSPropertyID.VAL_VISIBLE);
-	}
-
-	protected String[] getKeywordValues() {
-		return KEYWORDS;
-	}
-
-	public Object calculateCSSValueResult(CSSValue value, String propertyName,
-			ICSSStyle style) {
-		String display = style.getDisplay();
-		// we only support overflow for "block". Which means we don't support it
-		// for table/inline-block, etc.
-		if (!"block".equalsIgnoreCase(display)) { //$NON-NLS-1$
-			return ICSSPropertyID.VAL_VISIBLE;
-		}
-		return super.calculateCSSValueResult(value, propertyName, style);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/PaddingWidthMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/PaddingWidthMeta.java
deleted file mode 100644
index aec17e4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/PaddingWidthMeta.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.value.Length;
-import org.eclipse.jst.pagedesigner.ui.preferences.PDPreferences;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public class PaddingWidthMeta extends LengthMeta {
-    
-	private final PDPreferences _prefs;
-
-    /**
-	 * Default constructor
-     * @param prefs 
-	 */
-	public PaddingWidthMeta(final PDPreferences prefs) 
-	{
-		super(false, ICSSPropertyID.VAL_AUTO);
-		_prefs = prefs;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#calculateHTMLAttributeOverride(org.w3c.dom.Element,
-	 *      java.lang.String, java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.css2.ICSSStyle)
-	 */
-	public Object calculateHTMLAttributeOverride(Element element,
-			String htmltag, String propertyName, ICSSStyle style) {
-		if (IHTMLConstants.TAG_TD.equalsIgnoreCase(htmltag)
-				|| IHTMLConstants.TAG_TH.equalsIgnoreCase(htmltag)) {
-			Node parent = element;
-			Element tableEle = null;
-			while ((parent = parent.getParentNode()) != null
-					&& parent instanceof Element) {
-				if (((Element) parent).getTagName().equalsIgnoreCase(
-						IHTMLConstants.TAG_TABLE)) {
-					tableEle = (Element) parent;
-					break;
-				}
-			}
-			if (tableEle != null) 
-			{
-			    int artificialCellPadding = _prefs.getCssArtificialCellPadding(); 
-				//TODO:  Why is only cellpadding being checked?  Why does this class even exist?  What is difference with BorderWidthMeta?   
-				String padding = DOMUtil.getAttributeIgnoreCase(tableEle,
-						"cellpadding");//$NON-NLS-1$
-				if (padding != null && padding.trim().length() > 0) {//fix for 200592						
-					Object length = LengthMeta.toLength(padding, style, this
-								.getPercentageType(), getBaseFont(style));
-                    if (length instanceof Length && ((Length)length).getValue() >= artificialCellPadding)                    
-                        return length;
-                    
-				}
-                return new Length(artificialCellPadding, false);
-			}
-		}
-		return super.calculateHTMLAttributeOverride(element, htmltag,
-				propertyName, style);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/PositionMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/PositionMeta.java
deleted file mode 100644
index 4f19af9..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/PositionMeta.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class PositionMeta extends CSSPropertyMeta {
-	/**
-	 * static keyword
-	 */
-	public static final String STATIC = "static"; //$NON-NLS-1$
-
-	/**
-	 * absolute keyword
-	 */
-	public static final String ABSOLUTE = "absolute"; //$NON-NLS-1$
-
-	private static final String RELATIVE = "relative"; //$NON-NLS-1$
-
-	/**
-	 * fixed keyword
-	 */
-	public static final String FIXED = "fixed"; //$NON-NLS-1$
-
-	private static final String[] _keywords = new String[] { STATIC, ABSOLUTE,
-			RELATIVE, FIXED };
-
-	/**
-	 * Default constructor
-	 */
-	public PositionMeta() {
-		super(false, STATIC);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#getKeywordValues()
-	 */
-	protected String[] getKeywordValues() {
-		return _keywords;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/PositionOffsetMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/PositionOffsetMeta.java
deleted file mode 100644
index 81147cc..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/PositionOffsetMeta.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class PositionOffsetMeta extends LengthMeta {
-	/**
-	 * Default constructor
-	 */
-	public PositionOffsetMeta() {
-		super(false, ICSSPropertyID.VAL_AUTO);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/TableUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/TableUtil.java
deleted file mode 100644
index a5705fc..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/TableUtil.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-import org.eclipse.jst.pagedesigner.utils.HTMLUtil;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.w3c.dom.Text;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TableUtil {
-	static final String TOP = "top"; //$NON-NLS-1$
-
-	static final String BOTTOM = "bottom"; //$NON-NLS-1$
-
-	static final String LEFT = "left"; //$NON-NLS-1$
-
-	static final String RIGHT = "right"; //$NON-NLS-1$
-
-	/**
-	 * @param edge
-	 * @param frame
-	 * @return true if there is a match
-	 */
-	public static boolean matchFrame(String edge, String frame) {
-		if ("above".equalsIgnoreCase(frame)) { //$NON-NLS-1$
-			return TOP.equalsIgnoreCase(edge);
-		} else if ("below".equalsIgnoreCase(frame)) { //$NON-NLS-1$
-			return BOTTOM.equalsIgnoreCase(edge);
-		} else if ("hsides".equalsIgnoreCase(frame)) { //$NON-NLS-1$
-			return TOP.equalsIgnoreCase(edge) || BOTTOM.equalsIgnoreCase(edge);
-		} else if ("vsides".equalsIgnoreCase(frame)) { //$NON-NLS-1$
-			return LEFT.equalsIgnoreCase(edge) || RIGHT.equalsIgnoreCase(edge);
-		} else if ("lhs".equalsIgnoreCase(frame)) { //$NON-NLS-1$
-			return LEFT.equalsIgnoreCase(edge);
-		} else if ("rhs".equalsIgnoreCase(frame)) { //$NON-NLS-1$
-			return RIGHT.equalsIgnoreCase(edge);
-		} else if ("box".equalsIgnoreCase(frame) //$NON-NLS-1$
-				|| "border".equalsIgnoreCase(frame)) { //$NON-NLS-1$
-			return true;
-		} else {
-			return false;
-		}
-	}
-
-	/**
-	 * @param edge 
-	 * @param rules
-	 * @return true if rules match
-	 */
-	public static boolean matchRules(String edge, String rules) {
-		// TODO: "groups" not supported.
-
-		if ("rows".equalsIgnoreCase(rules)) { //$NON-NLS-1$
-			return TOP.equalsIgnoreCase(edge) || BOTTOM.equalsIgnoreCase(edge);
-		} else if ("cols".equalsIgnoreCase(rules)) { //$NON-NLS-1$
-			return LEFT.equalsIgnoreCase(edge) || RIGHT.equalsIgnoreCase(edge);
-		} else if ("all".equalsIgnoreCase(rules)) { //$NON-NLS-1$
-			return true;
-		} else {
-			return false;
-		}
-
-	}
-
-	/**
-	 * @param element
-	 * @return true if cell is empty
-	 * see http://www.w3.org/TR/CSS21/tables.html#empty-cells
-	 */
-	public static boolean isEmptyCell(Element element) {
-		NodeList children = element.getChildNodes();
-		if (children.getLength() == 0) {
-			return true;
-		}
-		// we only do simple checking here. When the element has one child
-		// and is text and is whitespace only, then we also treat as empty cell
-		if (children.getLength() == 1) {
-			Node child = children.item(0);
-			if (child instanceof Text) {
-				String text = child.getNodeValue();
-				if (HTMLUtil.isHTMLWhitespaceString(text)) {
-					return true;
-				}
-			}
-		}
-
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/TextAlignMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/TextAlignMeta.java
deleted file mode 100644
index 5c3e8d5..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/TextAlignMeta.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-import java.util.Arrays;
-
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- */
-public class TextAlignMeta extends CSSPropertyMeta {
-	static final String[] KEYWORDS = new String[] { ICSSPropertyID.VAL_LEFT,
-			ICSSPropertyID.VAL_RIGHT, ICSSPropertyID.VAL_CENTER,
-			ICSSPropertyID.VAL_JUSTIFY };
-
-	private static final String[] HOR_SLIGN_HTMLTAGS = new String[] {
-			IHTMLConstants.TAG_TABLE, IHTMLConstants.TAG_HR,
-			IHTMLConstants.TAG_LEGEND, IHTMLConstants.TAG_APPLET,
-			IHTMLConstants.TAG_IFRAME, IHTMLConstants.TAG_IMG,
-			IHTMLConstants.TAG_INPUT, IHTMLConstants.TAG_OBJECT,
-			IHTMLConstants.TAG_CAPTION };
-
-	/**
-	 * Default constructor
-	 */
-	public TextAlignMeta() {
-		super(true, NOT_SPECIFIED);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#getKeywordValues()
-	 */
-	protected String[] getKeywordValues() {
-		return KEYWORDS;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#calculateHTMLAttributeOverride(org.w3c.dom.Element,
-	 *      java.lang.String, java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.css2.ICSSStyle)
-	 */
-	public Object calculateHTMLAttributeOverride(Element element,
-			String htmltag, String propertyName, ICSSStyle style) {
-		// /for td, it may look for the attribute value up to tr, but must stop
-		// at table.
-		// so for table,set _inherited=false to stop it.
-		if (IHTMLConstants.TAG_TABLE.equalsIgnoreCase(htmltag)) {
-			this._inherited = false;
-		} else {
-			this._inherited = true;
-		}
-		if (Arrays.asList(HOR_SLIGN_HTMLTAGS).contains(htmltag.toLowerCase())) {
-			return null;
-		}
-
-		String align = DOMUtil.getAttributeIgnoreCase(element,
-				IHTMLConstants.ATTR_ALIGN);
-		String value = checkKeywordValues(align);
-		if (value != null) {
-			return value;
-		}
-		if ("middle".equalsIgnoreCase(align)) { //$NON-NLS-1$
-			return ICSSPropertyID.VAL_CENTER;
-		}
-
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/TextDecorationMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/TextDecorationMeta.java
deleted file mode 100644
index 7813463..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/TextDecorationMeta.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.w3c.dom.css.CSSValue;
-import org.w3c.dom.css.CSSValueList;
-
-/**
- * @author mengbo
- */
-public class TextDecorationMeta extends CSSPropertyMeta {
-	private static final int NONE = 0;
-
-	/**
-	 * 
-	 */
-	public static final int UNDERLINE = 1;
-
-	/**
-	 * 
-	 */
-	public static final int OVERLINE = 1 << 1;
-
-	/**
-	 * 
-	 */
-	public static final int LINETHROUGH = 1 << 2;
-
-	private static final int BLINK = 1 << 3;
-
-	static final String[] KEYWORDS = new String[] { ICSSPropertyID.VAL_NONE,
-			ICSSPropertyID.VAL_UNDERLINE, ICSSPropertyID.VAL_OVERLINE,
-			ICSSPropertyID.VAL_LINETHROUGH, ICSSPropertyID.VAL_BLINK };
-
-	/**
-	 * Default constructor
-	 */
-	public TextDecorationMeta() {
-		// the spec say text-decoration is not inherited. but the description
-		// seemed to make use inherit easier.
-		// It seems that the property is inherited in IE and Mozilla.
-		super(true, new Integer(NONE));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#getKeywordValues()
-	 */
-	protected String[] getKeywordValues() {
-		return KEYWORDS;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#calculateCSSValueResult(org.w3c.dom.css.CSSValue,
-	 *      java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.css2.property.AbstractStyle)
-	 */
-	public Object calculateCSSValueResult(CSSValue value, String propertyName,
-			ICSSStyle style) {
-		String[] decorations = null;
-		if (value.getCssValueType() == CSSValue.CSS_VALUE_LIST) {
-			CSSValueList valueList = (CSSValueList) value;
-			decorations = new String[valueList.getLength()];
-			for (int i = 0; i < decorations.length; i++) {
-				decorations[i] = valueList.item(i).getCssText();
-			}
-		} else {
-			decorations = new String[1];
-			decorations[0] = value.getCssText();
-		}
-
-		int intvalue = 0;
-		for (int i = 0; i < decorations.length; i++) {
-			String key = super.checkKeywordValues(decorations[i]);
-			if (key == ICSSPropertyID.VAL_NONE) {
-				intvalue = NONE;
-			} else if (key == ICSSPropertyID.VAL_UNDERLINE) {
-				intvalue |= UNDERLINE;
-			} else if (key == ICSSPropertyID.VAL_OVERLINE) {
-				intvalue |= OVERLINE;
-			} else if (key == ICSSPropertyID.VAL_LINETHROUGH) {
-				intvalue |= LINETHROUGH;
-			} else if (key == ICSSPropertyID.VAL_BLINK) {
-				intvalue |= BLINK;
-			}
-		}
-
-		return new Integer(intvalue);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/VerticalAlignMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/VerticalAlignMeta.java
deleted file mode 100644
index d4bb569..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/VerticalAlignMeta.java
+++ /dev/null
@@ -1,133 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- */
-public class VerticalAlignMeta extends LengthMeta {
-	/**
-	 * baseline keyword
-	 */
-	public static final String BASELINE = "baseline"; //$NON-NLS-1$
-
-	/**
-	 * middle keyword
-	 */
-	public static final String MIDDLE = "middle"; //$NON-NLS-1$
-
-	/**
-	 * sub keyword
-	 */
-	public static final String SUB = "sub"; //$NON-NLS-1$
-
-	/**
-	 * super keyword
-	 */
-	public static final String SUPER = "super"; //$NON-NLS-1$
-
-	/**
-	 * text-top keyword
-	 */
-	public static final String TEXT_TOP = "text-top"; //$NON-NLS-1$
-
-	/**
-	 * text-bottom keyword
-	 */
-	public static final String TEXT_BOTTOM = "text-bottom"; //$NON-NLS-1$
-
-	/**
-	 * top keyword
-	 */
-	public static final String TOP = "top"; //$NON-NLS-1$
-
-	/**
-	 * bottom keyword
-	 */
-	public static final String BOTTOM = "bottom"; //$NON-NLS-1$
-
-	/**
-	 * center keyword
-	 */
-	public static final String CENTER = "center"; //$NON-NLS-1$
-
-	/**
-	 * default vertical align
-	 */
-	public static final String DEFAULT_VERTICAL_ALIGN = BASELINE;
-
-	private static final String[] KEYWORDS = new String[] { BASELINE, MIDDLE,
-			SUB, SUPER, TEXT_TOP, TEXT_BOTTOM, TOP, BOTTOM };
-
-	private static final String[] htmlAttributes = new String[] { IHTMLConstants.ATTR_VALIGN };
-
-	/**
-	 * Default constructor
-	 */
-	public VerticalAlignMeta() {
-		super(true, DEFAULT_VERTICAL_ALIGN);
-	}
-
-	/**
-	 * @param inherit
-	 * @param initvalue
-	 */
-	public VerticalAlignMeta(boolean inherit, Object initvalue) {
-		super(inherit, initvalue);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#getKeywordValues()
-	 */
-	protected String[] getKeywordValues() {
-		return KEYWORDS;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#calculateHTMLAttributeOverride(org.w3c.dom.Element,
-	 *      java.lang.String, java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.css2.ICSSStyle)
-	 */
-	public Object calculateHTMLAttributeOverride(Element element,
-			String htmltag, String propertyName, ICSSStyle style) {
-		for (int i = 0; i < htmlAttributes.length; i++) {
-			String align = DOMUtil.getAttributeIgnoreCase(element,
-					htmlAttributes[i]);
-			if (TOP.equalsIgnoreCase(align)) {
-				return TOP;
-			}
-			if (MIDDLE.equalsIgnoreCase(align)) {
-				return MIDDLE;
-			}
-			if (BOTTOM.equalsIgnoreCase(align)) {
-				return BOTTOM;
-			}
-			if (BASELINE.equalsIgnoreCase(align)) {
-				return BASELINE;
-			}
-			if (CENTER.equalsIgnoreCase(align)) {
-				return MIDDLE;
-			}
-		}
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/VisibilityMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/VisibilityMeta.java
deleted file mode 100644
index e6f3ae5..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/VisibilityMeta.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class VisibilityMeta extends CSSPropertyMeta {
-	/**
-	 * visible keyword
-	 */
-	public static final String VISIBLE = "visible"; //$NON-NLS-1$
-
-	/**
-	 * hidden keyword
-	 */
-	public static final String HIDDEN = "hidden"; //$NON-NLS-1$
-
-	/**
-	 * collapse keyword
-	 */
-	public static final String COLLAPSE = "collapse"; //$NON-NLS-1$
-
-	private static final String[] KEYWORDS = new String[] { VISIBLE, HIDDEN,
-			COLLAPSE };
-
-	/**
-	 * Default constructor
-	 */
-	public VisibilityMeta() {
-		super(true, VISIBLE);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#getKeywordValues()
-	 */
-	protected String[] getKeywordValues() {
-		return KEYWORDS;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/WhiteSpaceMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/WhiteSpaceMeta.java
deleted file mode 100644
index c94481f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/WhiteSpaceMeta.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- */
-public class WhiteSpaceMeta extends CSSPropertyMeta {
-	static final String[] KEYWORDS = new String[] { ICSSPropertyID.VAL_NORMAL,
-			ICSSPropertyID.VAL_PRE, ICSSPropertyID.VAL_NOWRAP };
-
-	/**
-	 * Default constructor
-	 */
-	public WhiteSpaceMeta() {
-		super(true, ICSSPropertyID.VAL_NORMAL);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#getKeywordValues()
-	 */
-	protected String[] getKeywordValues() {
-		return KEYWORDS;
-	}
-
-	public Object calculateHTMLAttributeOverride(Element element,
-			String htmltag, String propertyName, ICSSStyle style) {
-		if (IHTMLConstants.TAG_TD.equalsIgnoreCase(htmltag)
-				|| IHTMLConstants.TAG_TH.equalsIgnoreCase(htmltag)) {
-			String noWrap = DOMUtil.getAttributeIgnoreCase(element,
-					IHTMLConstants.ATTR_NOWRAP);
-			if (Boolean.TRUE.toString().equalsIgnoreCase(noWrap)) {
-				return ICSSPropertyID.VAL_NOWRAP;
-			}
-		}
-		return super.calculateHTMLAttributeOverride(element, htmltag,
-				propertyName, style);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/WidthMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/WidthMeta.java
deleted file mode 100644
index f38e765..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/WidthMeta.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- */
-public class WidthMeta extends LengthMeta {
-	/**
-	 * Default constructor
-	 */
-	public WidthMeta() {
-		super(false, ICSSPropertyID.VAL_AUTO);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#calculateHTMLAttributeOverride(org.w3c.dom.Element,
-	 *      java.lang.String, java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.css2.ICSSStyle)
-	 */
-	public Object calculateHTMLAttributeOverride(Element element,
-			String htmltag, String propertyName, ICSSStyle style) {
-		if (!IHTMLConstants.TAG_INPUT.equalsIgnoreCase(htmltag)
-				&& !IHTMLConstants.TAG_BUTTON.equalsIgnoreCase(htmltag)) {
-			String width = DOMUtil
-					.getAttributeIgnoreCase(element, propertyName);
-			if (width != null) {
-				return LengthMeta.toLength(width, style, this
-						.getPercentageType(), getBaseFont(style));
-			}
-		}
-		return super.calculateHTMLAttributeOverride(element, htmltag,
-				propertyName, style);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/provider/DimensionInfo.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/provider/DimensionInfo.java
deleted file mode 100644
index 4531ace..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/provider/DimensionInfo.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.provider;
-
-import org.eclipse.draw2d.geometry.Dimension;
-
-/**
- * This is a struct, include a dimension and a ascent info.
- * 
- * @author mengbo
- * @version 1.5
- */
-public class DimensionInfo {
-	private final Dimension _dimension;
-
-	private final int _ascent;
-
-	/**
-	 * 
-	 * @param d
-	 * @param ascent
-	 *            -1 means ascent is same as dimension height
-	 */
-	public DimensionInfo(Dimension d, int ascent) {
-		this._dimension = d;
-		this._ascent = ascent;
-	}
-
-	/**
-	 * @param width
-	 * @param height
-	 * @param i
-	 */
-	public DimensionInfo(int width, int height, int i) {
-		this(new Dimension(width, height), i);
-	}
-
-	/**
-	 * @return the dimension
-	 */
-	public Dimension getDimension() {
-		return _dimension;
-	}
-
-	/**
-	 * @return the ascent
-	 */
-	public int getAscent() {
-		return _ascent;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/provider/ICSSTextProvider.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/provider/ICSSTextProvider.java
deleted file mode 100644
index c646cc9..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/provider/ICSSTextProvider.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.provider;
-
-/**
- * This class behave as the information provider of CSSTextFigure.
- * 
- * @author mengbo
- */
-public interface ICSSTextProvider {
-	/**
-	 * get the style.
-	 * 
-	 * @return can't be null
-	 */
-	// public ICSSStyle getCSSStyle();
-	/**
-	 * this is the final data to be displayed. There is no need for the
-	 * CSSTextFigure to normalize it.
-	 * 
-	 * @return the text data
-	 */
-	public String getTextData();
-
-	/**
-	 * get the selected information.
-	 * 
-	 * @return the selected range
-	 */
-	public int[] getSelectedRange();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/provider/ICSSWidgetProvider.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/provider/ICSSWidgetProvider.java
deleted file mode 100644
index 81e7b9c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/provider/ICSSWidgetProvider.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.provider;
-
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-
-/**
- * @author mengbo
- */
-public interface ICSSWidgetProvider {
-	/**
-	 * can be null
-	 * 
-	 * @return the style
-	 */
-	public ICSSStyle getCSSStyle();
-
-	/**
-	 * @return true if is handling border
-	 */
-	public boolean isHandlingBorder();
-
-	/**
-	 * whether the parameter and return value includes border depends on the
-	 * isHandlingBorder
-	 * 
-	 * @param width
-	 *            -1 means no suggested value
-	 * @param height
-	 *            -1 means no suggested value
-	 * @return the dimension info
-	 */
-	public DimensionInfo getPreferredDimension(int width, int height);
-
-	/**
-	 * if isHandlingBorder return false, then "rect" will be the rect without
-	 * border, and this method should not paint border.
-	 * 
-	 * If isHandlingBorder returns true, then "rect" include border, and this
-	 * method should also paint its own border.
-	 * @param g 
-	 * @param rect
-	 */
-	public void paintFigure(Graphics g, Rectangle rect);
-
-	/**
-	 * @return true if is inline
-	 */
-	public boolean isInline();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/style/AbstractStyle.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/style/AbstractStyle.java
deleted file mode 100644
index b642b4e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/style/AbstractStyle.java
+++ /dev/null
@@ -1,716 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.style;
-
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.draw2d.geometry.Insets;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.converter.ITagConverter;
-import org.eclipse.jst.pagedesigner.css2.CSSUtil;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.font.CSSFontManager;
-import org.eclipse.jst.pagedesigner.css2.font.ICSSFont;
-import org.eclipse.jst.pagedesigner.css2.font.ICSSFontManager;
-import org.eclipse.jst.pagedesigner.css2.list.CounterHelper;
-import org.eclipse.jst.pagedesigner.css2.list.CounterValueGenerator;
-import org.eclipse.jst.pagedesigner.css2.list.ICounterValueGenerator;
-import org.eclipse.jst.pagedesigner.css2.property.CSSMetaRegistry;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyMeta;
-import org.eclipse.jst.pagedesigner.css2.value.Length;
-import org.eclipse.jst.pagedesigner.ui.preferences.PDPreferences;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.css.CSSStyleDeclaration;
-import org.w3c.dom.css.CSSValue;
-
-/**
- * @author mengbo
- */
-public class AbstractStyle implements ICSSStyle 
-{
-	private final Element _element;
-
-	private Map _cachedValues = new HashMap();
-
-	private ICSSFont _font = null;
-
-	private CSSStyleDeclaration _cache;
-
-	private CSSStyleDeclaration _defaultCache;
-
-	private boolean _cssDeclareWasSearched = false;
-
-	private boolean _cssDefaultDeclareWasSearched = false;
-
-	private Insets _borderInsets, _marginInsets, _paddingInsets;
-
-	private ICSSStyle _parentStyle;
-
-	private HashMap _counters = null;
-
-    private final PDPreferences _prefs;
-
-	/**
-	 * @return the element this style if for
-	 */
-	public Element getElement() {
-		return _element;
-	}
-
-	/**
-	 * @param element
-	 * @param prefs 
-	 */
-	public AbstractStyle(Element element, PDPreferences prefs) {
-		_element = element;
-		_prefs = prefs;
-	}
-
-	/**
-	 * reset all the cache.
-	 */
-	public void reset() {
-		_cachedValues.clear();
-		_font = null;
-		_cache = null;
-		_defaultCache = null;
-		_cssDeclareWasSearched = false;
-		_cssDefaultDeclareWasSearched = false;
-		// if (_counters != null)
-		// {
-		// unregistCounter();
-		// _counters.clear();
-		// _counters = null;
-		// }
-		_borderInsets = _marginInsets = _paddingInsets = null;
-	}
-
-	/**
-	 * this is a hook method so caller can use it to override default
-	 * calculation. Note, after the call to <code>reset</code>, it will be
-	 * lost.
-	 * 
-	 * @param property
-	 * @param value
-	 */
-	public void setStyleProperty(String property, Object value) {
-		_cachedValues.put(property, value);
-	}
-
-	/**
-	 * get a style property value.
-	 * 
-	 * @param property
-	 * @return the style property
-	 */
-	public Object getStyleProperty(String property) {
-		Object value = _cachedValues.get(property);
-		if (value == null) {
-			value = calculateProperty(property);
-			if (value != null) {
-				_cachedValues.put(property, value);
-			}
-		}
-		return value;
-	}
-
-	/**
-	 * in this method, should first check the "style" attribute, then combine
-	 * that with document style.
-	 * 
-	 * @return the style
-	 */
-	protected CSSStyleDeclaration calculateDeclaration() {
-		String name = getHtmlElement().getAttribute("id"); //$NON-NLS-1$
-		if (name == null || name.length() == 0) {
-			name = getHtmlElement().getAttribute("name"); //$NON-NLS-1$
-		}
-		return CSSUtil.getCSSDeclaration(this.getHtmlElement(), name);
-	}
-
-	/**
-	 * @return the style
-	 */
-	protected CSSStyleDeclaration calculateDefaultDeclaration() {
-		return CSSUtil.getDefaultCSSDeclaration(this.getHtmlElement(), null);
-	}
-
-	/**
-	 * @return the style declaration
-	 */
-	public CSSStyleDeclaration getDeclaration() {
-		// FIXME:may need to be change, boolean variable is not a best way.
-		if (!_cssDeclareWasSearched) {
-			_cache = calculateDeclaration();
-			_cssDeclareWasSearched = true;
-		}
-		return _cache;
-	}
-
-	/**
-	 * @return the default declaration
-	 */
-	public CSSStyleDeclaration getDefaultDeclaration() {
-		// FIXME:may need to be change, boolean variable is not a best way.
-		if (!_cssDefaultDeclareWasSearched) {
-			_defaultCache = calculateDefaultDeclaration();
-			_cssDefaultDeclareWasSearched = true;
-		}
-		return _defaultCache;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#getHTMLelementInitValue(java.lang.String)
-	 */
-	public Object getHTMLelementInitValue(String propertyName) {
-		ICSSPropertyMeta meta = getPropertyMeta(propertyName);
-		if (meta != null) {
-			Object obj = meta.getHTMLElementInitialValue(_element,
-					getHTMLTag(), propertyName);
-			if (obj == null) {
-				obj = meta.getInitialValue(propertyName, this);
-			}
-			return obj;
-		}
-		return ICSSPropertyMeta.NOT_SPECIFIED;
-	}
-
-	/**
-	 * @param propertyName
-	 * @return the property
-	 */
-	protected Object calculateProperty(String propertyName) {
-		ICSSPropertyMeta meta = getPropertyMeta(propertyName);
-		Object result = null;
-		// get declaration
-		CSSStyleDeclaration decl = getDeclaration();
-		CSSValue value = decl == null ? null : decl
-				.getPropertyCSSValue(propertyName);
-		if (value == null) {
-			if (meta != null) {
-				result = meta.calculateHTMLAttributeOverride(_element,
-						getHTMLTag(), propertyName, this);
-				if (result != null) {
-					return result;
-				}
-			}
-			decl = getDefaultDeclaration();
-		}
-		value = decl == null ? null : decl.getPropertyCSSValue(propertyName);
-
-		if (value != null && value.getCssValueType() == CSSValue.CSS_INHERIT) {
-			result = getParentResultValue(meta, propertyName);
-		} else if (value == null) {
-			if (meta != null) {
-				result = meta.calculateHTMLAttributeOverride(_element,
-						getHTMLTag(), propertyName, this);
-			}
-			if (result == null) {
-				result = calculateLocalOverride(meta, propertyName);
-			}
-			if (result == null) {
-				if (meta == null) {
-					result = ICSSPropertyMeta.NOT_SPECIFIED;
-				} else {
-					if (meta.isInherited()) {
-						result = getParentResultValue(meta, propertyName);
-					} else {
-						result = meta.getInitialValue(propertyName, this);
-					}
-				}
-			}
-		} else {
-			result = calculateCSSValueResult(meta, value, propertyName);
-		}
-		return result;
-	}
-
-	/**
-	 * get the corresponding HTML tag for this style. This is for certain HTML
-	 * tag can also provide style information.
-	 * 
-	 * @return the html tag
-	 */
-	protected String getHTMLTag() {
-		return _element.getTagName();
-	}
-
-	/**
-	 * @param propertyName
-	 * @return the property meta for property name
-	 */
-	protected ICSSPropertyMeta getPropertyMeta(String propertyName) {
-		return CSSMetaRegistry.getInstance().getMeta(propertyName);
-	}
-
-	/**
-	 * convert the CSSValue to the property type specified data result.
-	 * 
-	 * @param meta 
-	 * @param value
-	 * @param propertyName
-	 * @return should not return null.
-	 */
-	protected Object calculateCSSValueResult(ICSSPropertyMeta meta,
-			CSSValue value, String propertyName) {
-		if (meta == null) {
-			return ICSSPropertyMeta.NOT_SPECIFIED;
-		}
-        return meta.calculateCSSValueResult(value, propertyName, this);
-	}
-
-	/**
-	 * it is possible that some attribute of the element may provide style
-	 * information. child class should override this method. Also, some element
-	 * type may have internally build style, such as input-submit may use
-	 * special border. NOTE: it is very important that in calculateLocalOverride
-	 * you don't directly or indirectly call getStyleProperty() to avoid
-	 * deadloop.
-	 * 
-	 * @param meta 
-	 * @param propertyName
-	 * @return null means no style information in other attributes. Otherwise
-	 *         return property specific data result -- normally will use meta to
-	 *         convert the attribute.
-	 */
-	protected Object calculateLocalOverride(ICSSPropertyMeta meta,
-			String propertyName) {
-		// // do some default margin thing.
-		// if (ICSSPropertyID.ATTR_MARGIN_RIGHT.equalsIgnoreCase(propertyName)
-		// || ICSSPropertyID.ATTR_MARGIN_BOTTOM.equalsIgnoreCase(propertyName))
-		// {
-		// return MARGIN_LENGTH;
-		// }
-		// else if
-		// (ICSSPropertyID.ATTR_MARGIN_LEFT.equalsIgnoreCase(propertyName))
-		// {
-		// // to make a little room, so it is possible for user to position the
-		// // mouse before the first element in a block.
-		// return MARGIN_LEFT;
-		// }
-		return null;
-	}
-
-	/**
-	 * This is only called when inherit value from parent.
-	 * 
-	 * @param meta 
-	 * @param propertyName
-	 * @return the result value
-	 */
-	protected Object getParentResultValue(ICSSPropertyMeta meta,
-			String propertyName) {
-		ICSSStyle style = getParentStyle();
-		return style.getStyleProperty(propertyName);
-	}
-
-	/**
-	 * @param parentStyle
-	 */
-	public void setParentStyle(ICSSStyle parentStyle) {
-		this._parentStyle = parentStyle;
-		reset();
-	}
-
-	public ICSSStyle getParentStyle() {
-		if (_parentStyle != null) {
-			return _parentStyle;
-		}
-		Node node = _element.getParentNode();
-		while (node instanceof Element && node instanceof INodeNotifier) {
-			ICSSStyle parentStyle = (ICSSStyle) ((INodeNotifier) node)
-					.getAdapterFor(ICSSStyle.class);
-			if (parentStyle != null) {
-				return parentStyle;
-			}
-            node = node.getParentNode();
-		}
-		return DefaultStyle.getInstance();
-	}
-
-	/**
-	 * Will not return null
-	 * 
-	 * @return the font
-	 */
-	public ICSSFont getCSSFont() {
-		if (_font == null) {
-			_font = getFontManager().createFont(this);
-		}
-		return _font;
-	}
-
-	/**
-	 * @return
-	 */
-	private ICSSFontManager getFontManager() {
-		return CSSFontManager.getInstance();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#dispose()
-	 */
-	public void dispose() {
-        // TODO: anything to dispose?
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#getMarginInsets()
-	 */
-	public Insets getMarginInsets() {
-		if (_marginInsets == null) {
-			int top = getInsetProperty(ICSSPropertyID.ATTR_MARGIN_TOP);
-			int left = getInsetProperty(ICSSPropertyID.ATTR_MARGIN_LEFT);
-			int bottom = getInsetProperty(ICSSPropertyID.ATTR_MARGIN_BOTTOM);
-			int right = getInsetProperty(ICSSPropertyID.ATTR_MARGIN_RIGHT);
-			_marginInsets = new Insets(top, left, bottom, right);
-		}
-		return _marginInsets;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#getPaddingInsets()
-	 */
-	public Insets getPaddingInsets() {
-		if (_paddingInsets == null) {
-			int top = getInsetProperty(ICSSPropertyID.ATTR_PADDING_TOP);
-			int left = getInsetProperty(ICSSPropertyID.ATTR_PADDING_LEFT);
-			int bottom = getInsetProperty(ICSSPropertyID.ATTR_PADDING_BOTTOM);
-			int right = getInsetProperty(ICSSPropertyID.ATTR_PADDING_RIGHT);
-			//add extra padding only for the top element of a source tag's rendering
-			if (elementIsTagConverted()) {
-			    final int borderOffset = _prefs.getCssArtificialCellPadding();
-				top += borderOffset;
-				left += borderOffset;
-				bottom += borderOffset;
-				right += borderOffset;
-			}
-			_paddingInsets = new Insets(top, left, bottom, right);
-		}
-		return _paddingInsets;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#getBorderInsets()
-	 */
-	public Insets getBorderInsets() {
-		if (_borderInsets == null) {
-			int top = getInsetProperty(ICSSPropertyID.ATTR_BORDER_TOP_WIDTH);
-			int left = getInsetProperty(ICSSPropertyID.ATTR_BORDER_LEFT_WIDTH);
-			int bottom = getInsetProperty(ICSSPropertyID.ATTR_BORDER_BOTTOM_WIDTH);
-			int right = getInsetProperty(ICSSPropertyID.ATTR_BORDER_RIGHT_WIDTH);
-			_borderInsets = new Insets(top, left, bottom, right);
-		}
-		return _borderInsets;
-	}
-
-	/**
-	 * @param border_top_width
-	 * @return
-	 */
-	private int getInsetProperty(String propertyName) {
-		Object obj = this.getStyleProperty(propertyName);
-		if (obj instanceof Length) {
-			Length l = (Length) obj;
-			if (l.isPercentage()) {
-				return 0; // FIXME:
-			}
-            return l.getValue();
-		}
-
-		return 0;
-	}
-
-	public boolean isAdapterForType(Object type) {
-		return (type == ICSSStyle.class);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#isSizeIncludeBorderPadding()
-	 */
-	public boolean isSizeIncludeBorderPadding() {
-		String display = this.getDisplay();
-		if ("table-cell".equalsIgnoreCase(display)) { //$NON-NLS-1$
-			return false;
-		}
-		String tag = this.getHTMLTag();
-		if ("img".equalsIgnoreCase(tag)) { //$NON-NLS-1$
-			return false;
-		}
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.sse.model.INodeAdapter#notifyChanged(com.ibm.sse.model.INodeNotifier,
-	 *      int, java.lang.Object, java.lang.Object, java.lang.Object, int)
-	 */
-	public void notifyChanged(INodeNotifier notifier, int eventType,
-			Object changedFeature, Object oldValue, Object newValue, int pos) {
-        // do nothing
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#getBackgroundColor()
-	 */
-	public Object getColor() {
-		Object _color = null;
-		if (_color == null) {
-			_color = getStyleProperty(ICSSPropertyID.ATTR_COLOR);
-			if (_color == null) {
-				_color = getStyleProperty(ICSSPropertyID.ATTR_TEXTCOLOR);
-			}
-		}
-		return _color;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#getColor()
-	 */
-	public Object getBackgroundColor() {
-		Object _backgroundColor = null;
-		if (_backgroundColor == null) {
-			_backgroundColor = getStyleProperty(ICSSPropertyID.ATTR_BACKGROUND_COLOR);
-		}
-		return _backgroundColor;
-	}
-
-	/**
-	 * @return the html element
-	 */
-	public Element getHtmlElement() {
-		// if (_element instanceof IDOMElement)
-		// {
-		// EditPart part = (EditPart) ((IDOMElement)
-		// _element).getAdapterFor(EditPart.class);
-		// if (part instanceof ElementEditPart)
-		// {
-		// ElementEditPart elementPart = (ElementEditPart) part;
-		// ITagHandler h = elementPart.getTagHandler();
-		// if (h != null)
-		// {
-		// return h.mapCustomElement(_element);
-		// }
-		// }
-		//
-		// }
-		return _element;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#getDisplay()
-	 */
-	public String getDisplay() {
-		Object display = this.getStyleProperty(ICSSPropertyID.ATTR_DISPLAY);
-		String displayStr;
-		if (display == null) {
-			displayStr = ICSSPropertyID.VAL_INLINE;
-		} else if (display instanceof String) {
-			displayStr = (String) display;
-		} else {
-			displayStr = display.toString();
-		}
-		if (ICSSPropertyID.VAL_INLINE.equalsIgnoreCase(displayStr)
-				&& IHTMLConstants.TAG_TABLE.equalsIgnoreCase(getHTMLTag())) {
-			return ICSSPropertyID.VAL_INLINE_TABLE;
-		}
-		if (ICSSPropertyID.VAL_INLINE.equalsIgnoreCase(displayStr)) {
-			Object width = this.getStyleProperty(ICSSPropertyID.ATTR_WIDTH);
-			if (width instanceof Length) {
-				return ICSSPropertyID.VAL_INLINE_BLOCK;
-			}
-			Object height = this.getStyleProperty(ICSSPropertyID.ATTR_HEIGHT);
-			if (height instanceof Length) {
-				return ICSSPropertyID.VAL_INLINE_BLOCK;
-			}
-			return displayStr;
-		}
-        return displayStr;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#getListStyle()
-	 */
-	public Map getCounters() {
-		if (_counters == null) {
-			_counters = new HashMap();
-			CounterHelper.processCounterReset(this, _counters);
-		}
-		return _counters;
-	}
-
-	/**
-	 * Get named counter from counters.
-	 * 
-	 * see org.eclipse.jst.pagedesigner.css2.ICSSStyle#getCounter(java.lang.String)
-	 */
-	public ICounterValueGenerator findCounter(String name, boolean must) {
-		Map counters = getCounters();
-		if (counters == null || !counters.containsKey(name)) {
-			if (getParentStyle() != null
-					&& !(getParentStyle() instanceof DefaultStyle)) {
-				// ensure it is registered somewhere.
-				return getParentStyle().findCounter(name, must);
-			}
-			// must is called by counter-increment
-			else if (must) {
-				// the caller should do the other setting.
-				ICounterValueGenerator counter = new CounterValueGenerator(
-						name, null, null, this);
-				counter.resetCount();
-				counters.put(name, counter);
-			}
-		}
-		return (ICounterValueGenerator) counters.get(name);
-	}
-
-	/**
-	 * @param buffer
-	 */
-	public void dumpDebugInfo(StringBuffer buffer) {
-		if (_cache != null) {
-			buffer.append("cache:\n"); //$NON-NLS-1$
-			buffer.append(_cache.getCssText()).append("\n"); //$NON-NLS-1$
-		}
-		if (_defaultCache != null) {
-			buffer.append("default cache:\n"); //$NON-NLS-1$
-			buffer.append(_defaultCache.getCssText()).append("\n"); //$NON-NLS-1$
-		}
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#getColSpan()
-	 */
-	public int getColSpan() {
-		int colspan = DOMUtil.getIntAttributeIgnoreCase(getHtmlElement(),
-				"colspan", 1); //$NON-NLS-1$
-		// if span == 0, means span all col from the current column to end
-		// colume
-		if (colspan < 0) {
-			return 1;
-		}
-        return colspan;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#getRowSpan()
-	 */
-	public int getRowSpan() {
-		int rowspan = DOMUtil.getIntAttributeIgnoreCase(getHtmlElement(),
-				"rowspan", 1); //$NON-NLS-1$
-		if (rowspan < 0) {
-			return 1;
-		}
-        return rowspan;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#isInSelection()
-	 */
-	public boolean isInSelection() {
-		IRangeSelectionProxy proxy = (IRangeSelectionProxy) getAdapter(IRangeSelectionProxy.class);
-		if (proxy != null) {
-			return proxy.isRangeSelected();
-		}
-		ICSSStyle parentStyle = getParentStyle();
-		if (parentStyle != null) {
-			return parentStyle.isInSelection();
-		}
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
-	 */
-	public Object getAdapter(Class adapter) {
-		if (this._element instanceof INodeNotifier) {
-			Object ret = ((INodeNotifier) _element).getAdapterFor(adapter);
-			if (ret != null && adapter.isInstance(ret)) {
-				return ret;
-			}
-		}
-		return null;
-	}
-
-	// private void unregistCounter()
-	// {
-	// if (_counters != null)
-	// {
-	// Collection c = _counters.values();
-	// Iterator iter = c.iterator();
-	// while (iter.hasNext())
-	// {
-	// Counter2 counter = (Counter2) iter.next();
-	// counter.unregist(this);
-	// }
-	// }
-	// }
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#resetCounters()
-	 */
-	public void processCounters() {
-		this._counters = null;
-		CounterHelper.processCounterIncrement(this);
-	}
-
-	private boolean elementIsTagConverted() {
-		boolean isTagConverted = false;
-		if (_element instanceof INodeNotifier) {
-			Collection nodeAdapters = ((INodeNotifier)_element).getAdapters();
-			for (Object nodeAdapter: nodeAdapters) {
-				if (nodeAdapter instanceof ITagConverter) {
-					isTagConverted = true;
-					break;
-				}
-			}
-		}
-		return isTagConverted;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/style/DefaultStyle.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/style/DefaultStyle.java
deleted file mode 100644
index 7e23150..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/style/DefaultStyle.java
+++ /dev/null
@@ -1,273 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.style;
-
-import java.util.Map;
-
-import org.eclipse.draw2d.geometry.Insets;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.font.CSSFontManager;
-import org.eclipse.jst.pagedesigner.css2.font.ICSSFont;
-import org.eclipse.jst.pagedesigner.css2.list.ICounterValueGenerator;
-import org.eclipse.jst.pagedesigner.css2.property.CSSMetaRegistry;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyMeta;
-import org.eclipse.jst.pagedesigner.ui.preferences.PDPreferences;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-
-/**
- * @author mengbo
- * 
- * TODO: why doesn't this sub-class AbstractStyle
- */
-public class DefaultStyle implements ICSSStyle {
-
-	private static final Insets EMPTY_INSETS = new Insets();
-	/**
-	 * A default preferences object.
-	 */
-	protected static final PDPreferences PREFS = new PDPreferences();
-    private final PDPreferences _prefs;
-
-	/**
-	 * @param prefs
-	 */
-	public DefaultStyle(final PDPreferences prefs)
-	{
-	    _prefs = prefs;
-	}
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#reset()
-	 */
-	public void reset() {
-        // TODO: dead?        
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#getStyleProperty(java.lang.String)
-	 */
-	public Object getStyleProperty(String property) {
-		ICSSPropertyMeta meta = CSSMetaRegistry.getInstance().getMeta(property);
-		if (meta == null) {
-			return ICSSPropertyMeta.NOT_SPECIFIED;
-		}
-        return meta.getInitialValue(property, this);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#getMarginInsets()
-	 */
-	public Insets getMarginInsets() {
-		return EMPTY_INSETS;
-        //return new Insets(0, 0, 0, 0);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#getBorderInsets()
-	 */
-	public Insets getBorderInsets() {
-		return EMPTY_INSETS;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#getPaddingInsets()
-	 */
-	public Insets getPaddingInsets() {
-	    int offset = _prefs.getCssArtificialCellPadding();
-        return new Insets(offset, offset, offset, offset);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#isSizeIncludeBorderPadding()
-	 */
-	public boolean isSizeIncludeBorderPadding() {
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#dispose()
-	 */
-	public void dispose() {
-        // TODO: anything to dispose
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.sse.model.INodeAdapter#isAdapterForType(java.lang.Object)
-	 */
-	public boolean isAdapterForType(Object type) {
-		return type == ICSSStyle.class;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.sse.model.INodeAdapter#notifyChanged(com.ibm.sse.model.INodeNotifier,
-	 *      int, java.lang.Object, java.lang.Object, java.lang.Object, int)
-	 */
-	public void notifyChanged(INodeNotifier notifier, int eventType,
-			Object changedFeature, Object oldValue, Object newValue, int pos) {
-        // TODO: do nothing?
-	}
-
-	private ICSSFont defaultFont = CSSFontManager.getInstance().createDefaultFont();
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#getCSSFont()
-	 */
-	public ICSSFont getCSSFont() {
-		return defaultFont;
-	}
-
-	/**
-	 * @return the singleton instance
-	 */
-	public static ICSSStyle getInstance() {
-		if (_instance == null) {
-			_instance = new DefaultStyle(PREFS);
-		}
-		return _instance;
-	}
-
-	static DefaultStyle _instance;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#getParentStyle()
-	 */
-	public ICSSStyle getParentStyle() {
-		// return this;
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#getBackgroundColor()
-	 */
-	public Object getBackgroundColor() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#getColor()
-	 */
-	public Object getColor() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#getDisplay()
-	 */
-	public String getDisplay() {
-		return "inline"; //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#getListStyle()
-	 */
-	public Map getCounters() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#getCounter(java.lang.String)
-	 */
-	public ICounterValueGenerator findCounter(String name, boolean must) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#getColSpan()
-	 */
-	public int getColSpan() {
-		return 1;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#getRowSpan()
-	 */
-	public int getRowSpan() {
-		return 1;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#isInSelection()
-	 */
-	public boolean isInSelection() {
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
-	 */
-	public Object getAdapter(Class adapter) {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#resetCounters()
-	 */
-	public void processCounters() {
-		// do nothing.
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#getHTMLelementValue(java.lang.String)
-	 */
-	public Object getHTMLelementInitValue(String propertyName) {
-		ICSSPropertyMeta meta = CSSMetaRegistry.getInstance().getMeta(
-				propertyName);
-		if (meta == null) {
-			return ICSSPropertyMeta.NOT_SPECIFIED;
-		}
-        return meta.getInitialValue(propertyName, this);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/style/HiddenElementStyle.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/style/HiddenElementStyle.java
deleted file mode 100644
index 21693e0..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/style/HiddenElementStyle.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.style;
-
-import org.eclipse.jst.pagedesigner.parts.EditProxyAdapter;
-import org.eclipse.jst.pagedesigner.ui.preferences.PDPreferences;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.w3c.dom.Element;
-
-/**
- * A style for hidden elements
- *
- */
-public class HiddenElementStyle extends DefaultStyle {
-	private EditProxyAdapter _editProxyAdapter;
-
-	private Element _convertedElement;
-
-	private static ITagEditInfo _tagEditInfo = new ITagEditInfo() {
-
-		public boolean isWidget() {
-			return true;
-		}
-
-		public boolean needBorderDecorator() {
-			return false;
-		}
-
-		public boolean needTableDecorator() {
-			return false;
-		}
-
-		public int getMinWidth() {
-			return 0;
-		}
-
-		public int getMinHeight() {
-			return 0;
-		}
-	};
-
-	/**
-	 * @param adapter
-	 * @param prefs 
-	 */
-	public HiddenElementStyle(EditProxyAdapter adapter, PDPreferences prefs) 
-	{
-	    super(prefs);
-		this._editProxyAdapter = adapter;
-	}
-
-	/**
-	 * @param convertedElement
-	 * @param prefs 
-	 */
-	public HiddenElementStyle(Element convertedElement, PDPreferences prefs) 
-	{
-        super(prefs);
-		this._convertedElement = convertedElement;
-	}
-
-	public boolean isInSelection() {
-		if (_convertedElement instanceof INodeNotifier) {
-			Object ret = ((INodeNotifier) _convertedElement)
-					.getAdapterFor(AbstractStyle.class);
-			if (ret instanceof AbstractStyle) {
-				return ((AbstractStyle) ret).isInSelection();
-			}
-		}
-
-		if (_editProxyAdapter != null) {
-			return _editProxyAdapter.isRangeSelected();
-		}
-
-		return false;
-	}
-
-	public Object getAdapter(Class adapter) {
-		if (_convertedElement instanceof INodeNotifier) {
-			Object ret = ((INodeNotifier) _convertedElement)
-					.getAdapterFor(AbstractStyle.class);
-			if (ret instanceof AbstractStyle) {
-				return ((AbstractStyle) ret).getAdapter(adapter);
-			}
-		}
-		if (_editProxyAdapter != null && adapter == ITagEditInfo.class) {
-			return _tagEditInfo;
-		}
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/style/IRangeSelectionProxy.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/style/IRangeSelectionProxy.java
deleted file mode 100644
index 5bf6fb8..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/style/IRangeSelectionProxy.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.style;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public interface IRangeSelectionProxy {
-
-	/**
-	 * @return true if the range is selected
-	 */
-	boolean isRangeSelected();
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/style/ITagEditInfo.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/style/ITagEditInfo.java
deleted file mode 100644
index e2ac601..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/style/ITagEditInfo.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.style;
-
-/**
- * TODO: TagConversion decorator should augment/replace
- * @author mengbo
- * @version 1.5
- */
-public interface ITagEditInfo 
-{
-	/**
-	 * @return true if is a widget
-	 */
-	public boolean isWidget();
-
-	/**
-	 * @return true if a border decorator is needed
-	 */
-	public boolean needBorderDecorator();
-
-	/**
-	 * @return true if a table decorator is needed
-	 */
-	public boolean needTableDecorator();
-
-	/**
-	 * for some element in design mode we want to them to have a default min
-	 * size.
-	 * 
-	 * @return positive value means an expected min size.
-	 */
-	public int getMinWidth();
-
-	/**
-	 * @return the minimum height
-	 */
-	public int getMinHeight();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/style/StyleUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/style/StyleUtil.java
deleted file mode 100644
index 635576f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/style/StyleUtil.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.style;
-
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public final class StyleUtil {
-	/**
-	 * @param style
-	 * @return true if the style is in a widget
-	 */
-	public static boolean isInWidget(ICSSStyle style) {
-		while (style != null && style != DefaultStyle.getInstance()) {
-			ITagEditInfo info = (ITagEditInfo) style
-					.getAdapter(ITagEditInfo.class);
-			if (info != null && info.isWidget()) {
-				return true;
-			}
-
-			style = style.getParentStyle();
-		}
-		return false;
-	}
-	
-	private StyleUtil()
-	{
-	    // util class
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/value/Length.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/value/Length.java
deleted file mode 100644
index be19387..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/value/Length.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.value;
-
-/**
- * @author mengbo
- */
-public class Length {
-	/**
-	 * Constant for 0 length
-	 */
-	public static final Length LENGTH_0 = new Length(0, false);
-
-	/**
-	 * Constant for 1 length
-	 */
-	public static final Length LENGTH_1 = new Length(1, false);
-
-	/**
-	 * Constant for 2 length
-	 */
-	public static final Length LENGTH_2 = new Length(2, false);
-
-	/**
-	 * Constant for 3 length
-	 */
-	public static final Length LENGTH_3 = new Length(3, false);
-
-	/**
-	 * Constant for 8 length
-	 */
-	public static final Length LENGTH_8 = new Length(8, false);
-
-	private final boolean _percentage;
-
-	private final int _value;
-
-	/**
-	 * @param value
-	 * @param percentage
-	 */
-	public Length(int value, boolean percentage) {
-		_value = value;
-		_percentage = percentage;
-	}
-
-	/**
-	 * @return true if value is a percentage
-	 */
-	public boolean isPercentage() {
-		return _percentage;
-	}
-
-	/**
-	 * @return the length value
-	 */
-	public int getValue() {
-		return _value;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/AbstractWidgetProvider.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/AbstractWidgetProvider.java
deleted file mode 100644
index c29d39f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/AbstractWidgetProvider.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.widget;
-
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public abstract class AbstractWidgetProvider implements ICSSWidgetProvider {
-	final static int BORDERTHICK = 2;
-
-	private final ICSSStyle _style;
-
-	/**
-	 * @param style
-	 */
-	public AbstractWidgetProvider(ICSSStyle style) {
-		_style = style;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider#getCSSStyle()
-	 */
-	public ICSSStyle getCSSStyle() {
-		return _style;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider#isHandlingBorder()
-	 */
-	public boolean isHandlingBorder() {
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider#isInline()
-	 */
-	public boolean isInline() {
-		return true;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/BorderUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/BorderUtil.java
deleted file mode 100644
index 65659f6..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/BorderUtil.java
+++ /dev/null
@@ -1,315 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.widget;
-
-import java.util.List;
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.jst.pagedesigner.css2.layout.CSSFigure;
-import org.eclipse.jst.pagedesigner.css2.layout.FlowBox;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public final class BorderUtil {
-	/**
-	 * vertical bar style
-	 */
-	public final static int VERTICAL_BAR = 0;
-
-	/**
-	 * horizontal bar style
-	 */
-	public final static int HORIZONTAL_BAR = 1;
-
-	/**
-	 * both scroll bar style
-	 */
-	public final static int BOTH = 2;
-
-	/**
-	 * The scroll width
-	 */
-	public final static int SCROLL_WIDTH = 16;
-
-	/**
-	 * the border thickness
-	 */
-	public final static int BORDER_THICK = 2;
-
-	/**
-	 * draw a mask to a rectangle
-	 * 
-	 * @param g 
-	 * @param rect 
-	 * @param color 
-	 * 
-	 */
-	public static void maskRectangle(Graphics g, Rectangle rect, Color color) {
-		// set default if one not provided
-		if (color == null) {
-			color = ColorConstants.blue;
-		}
-
-		// get old information and keep them
-		int lineStyle = g.getLineStyle();
-		Color foregroundColor = g.getForegroundColor();
-
-		g.setLineStyle(SWT.LINE_SOLID);
-		g.setForegroundColor(color);
-		for (int i = 0, n = rect.height; i < n; i++, i++) {
-			for (int j = 0, m = rect.width; j < m; j++, j++) {
-				g.drawLine(rect.x + j, rect.y + i, rect.x + j, rect.y + i);
-			}
-		}
-
-		// restore to the old state
-		g.setLineStyle(lineStyle);
-		g.setForegroundColor(foregroundColor);
-	}
-
-	/**
-	 * @param g
-	 * @param rect
-	 * @param thick
-	 * @param inset
-	 */
-	public static void drawBorder(Graphics g, Rectangle rect, int thick,
-			boolean inset) {
-		drawBorder(g, rect.x, rect.y, rect.width, rect.height, thick, inset);
-	}
-
-	/**
-	 * draw a standard border.
-	 * 
-	 * @param g
-	 * @param left
-	 * @param top
-	 * @param width
-	 * @param height
-	 * @param thick
-	 * @param inset
-	 */
-	public static void drawBorder(Graphics g, int left, int top, int width,
-			int height, int thick, boolean inset) {
-		Color[] ltColors = new Color[] {
-				Display.getCurrent().getSystemColor(
-						SWT.COLOR_WIDGET_LIGHT_SHADOW),
-				Display.getCurrent().getSystemColor(
-						SWT.COLOR_WIDGET_HIGHLIGHT_SHADOW) };
-		if (inset) {
-			ltColors = new Color[] { ColorConstants.buttonDarker,
-					ColorConstants.buttonDarkest };
-		}
-		for (int i = 0; i < thick; i++) {
-			g.setForegroundColor(ltColors[ltColors.length * i / thick]);
-			g.drawLine(left + i, top + i, left + width - 1 - i, top + i);
-			g.drawLine(left + i, top + i, left + i, top + height - i - i);
-		}
-
-		Color[] rbColors = new Color[] {
-				Display.getCurrent().getSystemColor(
-						SWT.COLOR_WIDGET_DARK_SHADOW),
-				Display.getCurrent().getSystemColor(SWT.COLOR_DARK_GRAY) };
-		if (inset) {
-			rbColors = new Color[] { ColorConstants.buttonLightest,
-					ColorConstants.button };
-		}
-		for (int i = 0; i < thick; i++) {
-			g.setForegroundColor(rbColors[ltColors.length * i / thick]);
-			g.drawLine(left + i, top - i + height - 1, left + width - 1 - i,
-					top - i + height - 1);
-			g.drawLine(left + width - 1 - i, top + i, left + width - 1 - i, top
-					+ height - 1 - i);
-		}
-	}
-
-	/**
-	 * @param g
-	 * @param scrollWidth
-	 * @param rect
-	 * @param style
-	 */
-	public static void drawScrollBar(Graphics g, int scrollWidth,
-			Rectangle rect, int style) {
-		drawScrollBar(g, scrollWidth, BORDER_THICK, rect, style);
-	}
-
-	/**
-	 * @param g
-	 * @param scrollWidth
-	 * @param borderThick
-	 * @param rect
-	 * @param style
-	 */
-	public static void drawScrollBar(Graphics g, int scrollWidth,
-			int borderThick, Rectangle rect, int style) {
-		if (style == BOTH) {
-			int width = scrollWidth;
-			int left = rect.x + rect.width - width;
-			int top = rect.y;
-			int height = rect.height;
-			Rectangle barRect = new Rectangle(left, top, width, height);
-			fillBar(g, barRect);
-			barRect = new Rectangle(left, top, width, height - scrollWidth);
-			drawVerticalPart(g, scrollWidth, borderThick, barRect);
-
-			left = rect.x + borderThick;
-			top = top + height - scrollWidth;
-			width = rect.width;
-			height = scrollWidth;
-			barRect = new Rectangle(left, top, width, height);
-			fillBar(g, barRect);
-			barRect = new Rectangle(left, top, width - scrollWidth - 2, height);
-			drawHorizontalPart(g, scrollWidth, borderThick, barRect);
-		} else if (style == VERTICAL_BAR) {
-			int width = scrollWidth;
-			int left = rect.x + rect.width - width;
-			int top = rect.y;
-			int height = rect.height;
-			Rectangle barRect = new Rectangle(left, top, width, height);
-			fillBar(g, barRect);
-			drawVerticalPart(g, scrollWidth, borderThick, barRect);
-		} else if (style == HORIZONTAL_BAR) {
-			int left = rect.x + borderThick;
-			int top = rect.y + rect.height - scrollWidth;
-			int width = rect.width;
-			int height = scrollWidth;
-			Rectangle barRect = new Rectangle(left, top, width, height);
-			fillBar(g, barRect);
-			drawHorizontalPart(g, scrollWidth, borderThick, barRect);
-		}
-	}
-
-	private static void fillBar(Graphics g, Rectangle rect) {
-		g.setBackgroundColor(ColorConstants.button);
-		g.fillRectangle(rect);
-	}
-
-	private static void drawVerticalPart(Graphics g, int arrawLength,
-			int borderThick, Rectangle rect) {
-		int left = rect.x;
-		int top = rect.y;
-		int width = Math.min(arrawLength, rect.width);
-		int height = Math.min(arrawLength, rect.height / 2);
-
-		Rectangle borderRect = new Rectangle(left, top, width, height);
-		BorderUtil.drawBorder(g, borderRect, borderThick, false);
-
-		g.setForegroundColor(ColorConstants.black);
-		int decoratorWidth = (width - borderThick * 2) / 2;
-		int length = decoratorWidth / 2 + 1;
-		int leftX = rect.x + (width - decoratorWidth) / 2 - 1;
-		int bottomY = rect.y + (height + length) / 2 - 1;
-		for (int i = 0; i < length; i++) {
-			g.drawLine(leftX + i, bottomY - i, leftX - i + decoratorWidth,
-					bottomY - i);
-		}
-
-		top = rect.y + rect.height - height;
-		borderRect = new Rectangle(left, top, width, height);
-		BorderUtil.drawBorder(g, borderRect, borderThick, false);
-
-		int topY = top + (height - length) / 2;
-		g.setForegroundColor(ColorConstants.black);
-		for (int i = 0; i < length; i++) {
-			g.drawLine(leftX + i, topY + i, leftX - i + decoratorWidth, topY
-					+ i);
-		}
-	}
-
-	private static void drawHorizontalPart(Graphics g, int arrawLength,
-			int borderThick, Rectangle rect) {
-		int left = rect.x;
-		int top = rect.y;
-		int width = Math.min(arrawLength, rect.width / 2);
-		int height = Math.min(arrawLength, rect.height);
-
-		Rectangle borderRect = new Rectangle(left, top, width, height);
-		BorderUtil.drawBorder(g, borderRect, borderThick, false);
-
-		g.setForegroundColor(ColorConstants.black);
-		int decoratorHeight = (height - borderThick * 2) / 2;
-		int length = decoratorHeight / 2 + 1;
-		int leftX = rect.x + (width + length) / 2 - 1;
-		int bottomY = rect.y + (height - length) / 2 - 1;
-		for (int i = 0; i < length; i++) {
-			g.drawLine(leftX - i, bottomY + i, leftX - i, bottomY - i
-					+ decoratorHeight);
-		}
-
-		left = rect.x + rect.width - width;
-		borderRect = new Rectangle(left, top, width, height);
-		BorderUtil.drawBorder(g, borderRect, borderThick, false);
-
-		leftX = left + (width - length) / 2;
-		g.setForegroundColor(ColorConstants.black);
-		for (int i = 0; i < length; i++) {
-			g.drawLine(leftX + i, bottomY + i, leftX + i, bottomY - i
-					+ decoratorHeight);
-		}
-	}
-
-	/**
-	 * @param g
-	 * @param arrawWidth
-	 * @param arrawHeight
-	 * @param borderThick
-	 * @param rect
-	 */
-	public static void drawVertialBar(Graphics g, int arrawWidth,
-			int arrawHeight, int borderThick, Rectangle rect) {
-		drawScrollBar(g, arrawWidth, borderThick, rect, VERTICAL_BAR);
-	}
-
-	/**
-	 * @param figure
-	 * @param graphics
-	 */
-	public static void drawBorderDecorator(CSSFigure figure, Graphics graphics) {
-		graphics.setLineWidth(1);
-		graphics.setLineStyle(Graphics.LINE_DASH);
-		graphics.setForegroundColor(ColorConstants.lightGray);
-		List fragments = figure.getFragmentsForRead();
-		for (int i = 0, size = fragments.size(); i < size; i++) {
-			FlowBox box = (FlowBox) fragments.get(i);
-			// XXX: why -1?
-			graphics.drawRectangle(box.getX(), box.getY(), box.getWidth() - 1, box
-					.getHeight() - 1);
-		}
-		graphics.restoreState();
-	}
-
-	/**
-	 * @param figure
-	 * @param g
-	 */
-	public static void maskFigure(CSSFigure figure, Graphics g) {
-		List fragments = figure.getFragmentsForRead();
-		for (int i = 0, size = fragments.size(); i < size; i++) {
-			FlowBox box = (FlowBox) fragments.get(i);
-			maskRectangle(g, new Rectangle(box.getX(), box.getY(), box.getWidth(), box
-					.getHeight()), null);
-		}
-	}
-	
-	private BorderUtil()
-	{
-	    // util class, no instantiation
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/ButtonWidgetProvider.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/ButtonWidgetProvider.java
deleted file mode 100644
index b6d33a2..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/ButtonWidgetProvider.java
+++ /dev/null
@@ -1,204 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.widget;
-
-import java.util.StringTokenizer;
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.FigureUtilities;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.font.ICSSFont;
-import org.eclipse.jst.pagedesigner.css2.layout.TextLayoutSupport;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyMeta;
-import org.eclipse.jst.pagedesigner.css2.provider.DimensionInfo;
-import org.eclipse.jst.pagedesigner.css2.style.DefaultStyle;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.RGB;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * For ButtonWidget, it displays some text value in it. And lays the text with
- * nowrap.
- * 
- * @author mengbo
- * @version 1.5
- */
-public class ButtonWidgetProvider extends AbstractWidgetProvider {
-	// The button width should include the label length and padding,
-	// to let the button looks fine, we set the padding 0.46 width as the label
-	// length.
-	private final static double HORIZONTAL_RATE = 1.46;
-
-	// The button height should include the label height and padding,
-	// to let the button looks fine, we set the padding 0.36 height as the
-	// character height.
-	private final static double VERTICAL_PADDING_RATE = 0.36;
-
-	private static final String[] DEFAULTLINES = new String[] { "  " }; //$NON-NLS-1$
-
-	private String _value = ""; //$NON-NLS-1$
-
-	private String[] _lines = DEFAULTLINES;
-
-	/**
-	 * @param style
-	 */
-	public ButtonWidgetProvider(ICSSStyle style) {
-		super(style);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider#getPreferredDimension(int,
-	 *      int)
-	 */
-	public DimensionInfo getPreferredDimension(int width, int height) {
-		if (width <= 0) {
-			width = getDefaultWidth();
-		}
-		if (height <= 0) {
-			height = getDefaultHeight();
-		}
-		return new DimensionInfo(new Dimension(width, height), -1);
-	}
-
-	/**
-	 * by default, the combo's width will be calculated from the longest option
-	 * value.
-	 * 
-	 * @return the default width value
-	 */
-	public int getDefaultWidth() {
-		int longestStringWidth = 0;
-		if (_lines != null) {
-			ICSSStyle style = this.getCSSStyle();
-			if (style == null) {
-				style = DefaultStyle.getInstance();
-			}
-			ICSSFont font = style.getCSSFont();
-			Font swtFont = font.getSwtFont();
-			for (int i = 0; i < _lines.length; i++) {
-				int width = FigureUtilities.getTextWidth(_lines[i], swtFont);
-				if (width > longestStringWidth) {
-					longestStringWidth = width;
-				}
-			}
-		}
-		// text area width + padding
-		return (int) ((longestStringWidth) * HORIZONTAL_RATE);
-	}
-
-	/**
-	 * 
-	 * @return the default height value
-	 * @see TextInputWidgetProvider#getDefaultHeight()
-	 */
-	public int getDefaultHeight() {
-		ICSSStyle style = this.getCSSStyle();
-		if (style == null) {
-			style = DefaultStyle.getInstance();
-		}
-		ICSSFont font = style.getCSSFont();
-		Font swtfont = font.getSwtFont();
-		int fontHeight = FigureUtilities.getFontMetrics(swtfont).getHeight();
-		return (int) ((fontHeight) * (_lines.length + VERTICAL_PADDING_RATE));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider#paintFigure(org.eclipse.draw2d.Graphics,
-	 *      org.eclipse.draw2d.geometry.Rectangle)
-	 */
-	public void paintFigure(Graphics g, Rectangle rect) {
-		ICSSStyle style = this.getCSSStyle();
-		if (style == null) {
-			style = DefaultStyle.getInstance();
-		}
-		Object textAlign = style
-				.getStyleProperty(ICSSPropertyID.ATTR_TEXTALIGN);
-		if (ICSSPropertyMeta.NOT_SPECIFIED == textAlign) {
-			textAlign = "center"; //$NON-NLS-1$
-		}
-		Font font = style.getCSSFont().getSwtFont();
-		g.setFont(font);
-		int fontHeight = FigureUtilities.getFontMetrics(font).getHeight();
-
-		Color newColor = null;
-		Object color = style.getColor();
-		if (color instanceof Color) {
-			g.setForegroundColor((Color) color);
-		} else if (color instanceof RGB) {
-			newColor = new Color(Display.getCurrent(), (RGB) color);
-			g.setForegroundColor(newColor);
-		} else {
-			g.setForegroundColor(ColorConstants.black);
-		}
-
-		g.clipRect(rect);
-
-		int y = rect.y + (int) (fontHeight * VERTICAL_PADDING_RATE / 2);
-		if (rect.height > fontHeight * _lines.length) {
-			y = rect.y + (rect.height - fontHeight * _lines.length) / 2;
-		}
-
-		for (int i = 0; i < _lines.length && y < rect.y + rect.height; i++) {
-			int width = FigureUtilities.getTextWidth(_lines[i], font);
-			int x = TextLayoutSupport.getBeginX(textAlign, rect, width);
-			g.drawString(_lines[i], x, y);
-			TextLayoutSupport.paintTextDecoration(g, new Rectangle(x, y, width,
-					fontHeight), ((Integer) getCSSStyle().getStyleProperty(
-					ICSSPropertyID.ATTR_TEXTDECORATION)).intValue());
-			y += fontHeight;
-		}
-
-		if (newColor != null) {
-			newColor.dispose();
-		}
-	}
-
-	/**
-	 * @param value
-	 */
-	public void setValue(String value) {
-		if (value == null) {
-			value = ""; //$NON-NLS-1$
-		}
-		_value = value;
-		_lines = splitValue(_value);
-	}
-
-	/**
-	 * Split the value to multiple lines.
-	 * 
-	 * @param _value2
-	 * @return
-	 */
-	private String[] splitValue(String _value2) {
-		if (_value2 == null || "".equals(_value2)) { //$NON-NLS-1$
-			return DEFAULTLINES;
-		}
-
-		StringTokenizer tokenizer = new StringTokenizer(_value2, "\r\n"); //$NON-NLS-1$
-		String[] result = new String[tokenizer.countTokens()];
-		for (int i = 0; i < result.length; i++) {
-			result[i] = tokenizer.nextToken().replaceAll("\t", "    "); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-		return result;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/CheckboxWidgetProvider.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/CheckboxWidgetProvider.java
deleted file mode 100644
index 54e319e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/CheckboxWidgetProvider.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.widget;
-
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.provider.DimensionInfo;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class CheckboxWidgetProvider extends AbstractWidgetProvider {
-	private boolean isChecked;
-
-	/**
-	 * @param style
-	 */
-	public CheckboxWidgetProvider(ICSSStyle style) {
-		super(style);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider#getPreferredDimension(int,
-	 *      int)
-	 */
-	public DimensionInfo getPreferredDimension(int width, int height) {
-		if (width <= 0) {
-			width = getDefaultWidth();
-		}
-		if (height <= 0) {
-			height = getDefaultWidth();
-		}
-		return new DimensionInfo(new Dimension(width, height), height * 4 / 5);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider#paintFigure(org.eclipse.draw2d.Graphics,
-	 *      org.eclipse.draw2d.geometry.Rectangle)
-	 */
-	public void paintFigure(Graphics g, Rectangle rect) {
-		int centerX = rect.x + rect.width / 2;
-		int centerY = rect.y + rect.height / 2;
-
-		// we always draw it as a square.
-		int width = Math.min(rect.width, rect.height);
-		int innerWidth = width * 4 / 5;
-
-		int left = centerX - innerWidth / 2;
-		int top = centerY - innerWidth / 2;
-		BorderUtil.drawBorder(g, left, top, innerWidth, innerWidth, 2, true);
-		if (isChecked()) {
-			g.pushState();
-			Display display = Display.getCurrent();
-			g.setForegroundColor(display.getSystemColor(SWT.COLOR_BLACK));
-			g.drawLine(left + 3, top + 2, left + innerWidth - 3, top
-					+ innerWidth - 4);
-			g.drawLine(left + 2, top + 2, left + innerWidth - 3, top
-					+ innerWidth - 3);
-
-			g.drawLine(left + innerWidth - 4, top + 2, left + 2, top
-					+ innerWidth - 4);
-			g.drawLine(left + innerWidth - 3, top + 2, left + 2, top
-					+ innerWidth - 3);
-			g.popState();
-		}
-	}
-
-	/**
-	 * @return the default width
-	 */
-	private int getDefaultWidth() {
-		// FIXME: don't know the how to define the default width yet.
-		return 15;
-	}
-
-	/**
-	 * @return Returns the checked.
-	 */
-	public boolean isChecked() {
-		return isChecked;
-	}
-
-	/**
-	 * @param checked
-	 */
-	public void setChecked(boolean checked) {
-		this.isChecked = checked;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/ComboWidgetProvider.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/ComboWidgetProvider.java
deleted file mode 100644
index 632a8a0..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/ComboWidgetProvider.java
+++ /dev/null
@@ -1,214 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.widget;
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.FigureUtilities;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.font.ICSSFont;
-import org.eclipse.jst.pagedesigner.css2.provider.DimensionInfo;
-import org.eclipse.jst.pagedesigner.css2.style.DefaultStyle;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.RGB;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ComboWidgetProvider extends AbstractWidgetProvider {
-	private static final int VERTICAL_PADDING = 6;
-
-	private static final int HORIZONTAL_PADDING = 12;
-
-	private static int ARRAWWIDTH = 16;
-
-	//private static int ARROWHEIGHT = 16;
-
-	private String _firstString;
-
-	private String _longestString;
-
-	private String _label;
-
-	/**
-	 * @param style
-	 */
-	public ComboWidgetProvider(ICSSStyle style) {
-		super(style);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider#getPreferredDimension(int,
-	 *      int)
-	 */
-	public DimensionInfo getPreferredDimension(int width, int height) {
-		if (width <= 0) {
-			width = getDefaultWidth();
-
-		}
-		if (height <= 0) {
-			height = getDefaultHeight();
-		}
-		return new DimensionInfo(new Dimension(width, height), -1);
-	}
-
-	/**
-	 * by default, the combo's width will be calculated from the longest option
-	 * value.
-	 * 
-	 * @return the default width
-	 */
-	private int getDefaultWidth() {
-		int textareaWidth;
-		if (this._longestString == null || this._longestString.length() == 0) {
-			textareaWidth = 20;
-		} else {
-			ICSSStyle style = this.getCSSStyle();
-			if (style == null) {
-				style = DefaultStyle.getInstance();
-			}
-			ICSSFont font = style.getCSSFont();
-
-			textareaWidth = FigureUtilities.getTextWidth(_longestString, font
-					.getSwtFont());
-		}
-		return textareaWidth + ARRAWWIDTH + HORIZONTAL_PADDING;
-	}
-
-	/**
-	 * 
-	 * @return the default height
-	 * @see TextInputWidgetProvider#getDefaultHeight()
-	 */
-	public int getDefaultHeight() {
-		ICSSStyle style = this.getCSSStyle();
-		if (style == null) {
-			style = DefaultStyle.getInstance();
-		}
-		ICSSFont font = style.getCSSFont();
-		Font swtfont = font.getSwtFont();
-		int fontSize = FigureUtilities.getFontMetrics(swtfont).getHeight();
-		return fontSize + VERTICAL_PADDING;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider#paintFigure(org.eclipse.draw2d.Graphics,
-	 *      org.eclipse.draw2d.geometry.Rectangle)
-	 */
-	public void paintFigure(Graphics g, Rectangle rect) {
-		if (this._firstString != null) {
-			ICSSStyle style = this.getCSSStyle();
-			if (style == null) {
-				style = DefaultStyle.getInstance();
-			}
-			ICSSFont font = style.getCSSFont();
-			g.setFont(font.getSwtFont());
-
-			Color newColor = null;
-			Object color = style.getColor();
-			if (color instanceof Color) {
-				g.setForegroundColor((Color) color);
-			} else if (color instanceof RGB) {
-				newColor = new Color(Display.getCurrent(), (RGB) color);
-				g.setForegroundColor(newColor);
-			} else {
-				g.setForegroundColor(ColorConstants.black);
-			}
-			g.clipRect(rect);
-			String label = _label != null ? _label : _firstString;
-			label = label.replaceAll("[ \r\n]+", " "); //$NON-NLS-1$ //$NON-NLS-2$
-			if (label.endsWith(" ")) { //$NON-NLS-1$
-				label = label.substring(0, label.length() - 1);
-			}
-			g.drawString(label, rect.x + HORIZONTAL_PADDING / 2, rect.y
-					+ VERTICAL_PADDING / 2);
-			if (newColor != null) {
-				newColor.dispose();
-			}
-
-		}
-
-		BorderUtil.drawBorder(g, rect.x, rect.y, rect.width, rect.height,
-				BORDERTHICK, true);
-		// next the drop down button
-		int width = ARRAWWIDTH;
-		int left = rect.x + rect.width - width - BORDERTHICK;
-		int top = rect.y + BORDERTHICK;
-		int height = rect.height - BORDERTHICK * 2;
-		g.setBackgroundColor(ColorConstants.button);
-		g.fillRectangle(left, top, width, height);
-
-		Rectangle borderRect = new Rectangle(left, top, width, height);
-		BorderUtil.drawBorder(g, borderRect.x, borderRect.y, borderRect.width,
-				borderRect.height, BORDERTHICK, false);
-
-		g.setForegroundColor(ColorConstants.black);
-
-		int decoratorWidth = (width - BORDERTHICK * 2) / 2;
-		int length = decoratorWidth / 2 + 1;
-		int leftX = left + (width - decoratorWidth) / 2 - 1;
-		int topY = top + (height - length) / 2 + 1;
-		for (int i = 0; i < length; i++) {
-			g.drawLine(leftX + i, topY + i, leftX - i + decoratorWidth, topY
-					+ i);
-		}
-	}
-
-	/**
-	 * set the options to be displayed in this combo box. Will calculate out the
-	 * first string and the longest string.
-	 * 
-	 * @param options
-	 */
-	public void setOptions(String[] options) {
-		if (options == null || options.length == 0) {
-			this._firstString = null;
-			this._longestString = null;
-		} else {
-			this._firstString = options[0];
-			this._longestString = (options[0] == null ? "" : options[0]); //$NON-NLS-1$
-			for (int i = 1; i < options.length; i++) {
-				if (options[i] == null) {
-					continue;
-				}
-				if (options[i].length() > this._longestString.length()) {
-					this._longestString = options[i];
-				}
-			}
-		}
-	}
-
-	/**
-	 * @param label
-	 */
-	public void setSelectedLabel(String label) {
-		this._label = label;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider#isHandlingBorder()
-	 */
-	public boolean isHandlingBorder() {
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/HiddenProvider.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/HiddenProvider.java
deleted file mode 100644
index bfd79cf..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/HiddenProvider.java
+++ /dev/null
@@ -1,159 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.widget;
-
-import org.eclipse.draw2d.FigureUtilities;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.jst.pagedesigner.css2.provider.DimensionInfo;
-import org.eclipse.jst.pagedesigner.css2.style.HiddenElementStyle;
-import org.eclipse.jst.pagedesigner.parts.EditProxyAdapter;
-import org.eclipse.jst.pagedesigner.parts.ElementEditPart;
-import org.eclipse.jst.pagedesigner.ui.preferences.PDPreferences;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.FontMetrics;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Display;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- */
-public class HiddenProvider extends ImageWidgetProvider {
-	private final static int GAP = 3;
-
-	private String _label = null;
-
-	private boolean _labelVisible = true;
-
-	private FontMetrics _fontMetrics;
-    
-	/**
-	 * @param image
-	 * @param convertedElement 
-	 */
-	public HiddenProvider(Image image, Element convertedElement) {
-		super(image, new HiddenElementStyle(convertedElement, new PDPreferences()));
-	}
-
-	/**
-	 * @param image
-	 * @param editPart
-	 */
-	public HiddenProvider(Image image, ElementEditPart editPart) {
-		super(image, new HiddenElementStyle(new EditProxyAdapter(editPart), new PDPreferences()));
-	}
-
-	// public HiddenProvider(Image image, String label)
-	// {
-	// this(image);
-	// this._label = label;
-	// }
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider#getPreferredDimension(int,
-	 *      int)
-	 */
-	public DimensionInfo getPreferredDimension(int width, int height) {
-		int preWidth = width;
-		int preHeight = height;
-		_fontMetrics = getFontMetrics();
-		if (width <= 0) {
-			preWidth = getLabelWidth() + _imageWidth;
-		}
-		if (height <= 0) {
-			preHeight = Math.max(getLabelHeight(), _imageHeight);
-		}
-		return new DimensionInfo(preWidth, preHeight, -1);
-	}
-
-	private FontMetrics getFontMetrics() {
-		Font swtfont = Display.getCurrent().getSystemFont();
-		return FigureUtilities.getFontMetrics(swtfont);
-	}
-
-	private int getLabelHeight() {
-		if (_labelVisible && (_label != null) && (!_label.equals("")) //$NON-NLS-1$
-				&& (_fontMetrics != null)) {
-			return _fontMetrics.getHeight();
-		}
-		return 0;
-	}
-
-	/**
-	 * @return the label width
-	 */
-	public int getLabelWidth() {
-		if (_labelVisible && _label != null && !_label.equals("") //$NON-NLS-1$
-				&& _fontMetrics != null) {
-			Font swtfont = Display.getCurrent().getSystemFont();
-			return FigureUtilities.getTextWidth(_label, swtfont) + GAP;
-		}
-		return 0;
-	}
-
-	public void paintFigure(Graphics g,
-			org.eclipse.draw2d.geometry.Rectangle rect) {
-		g.fillRectangle(rect);
-		g.setClip(rect);
-		int imageAreaWidth = Math.min(rect.width, _imageWidth);
-		int imageAreaHeight = Math.min(rect.height, _imageHeight);
-		if (_image != null && !_image.isDisposed()) {
-			g.drawImage(_image, 0, 0, _imageWidth, _imageHeight, rect.x, rect.y
-					+ (rect.height - imageAreaHeight) / 2, imageAreaWidth,
-					imageAreaHeight);
-		}
-		if (_label != null && _labelVisible) {
-			int leading = 0;
-			if (_fontMetrics != null) {
-				leading = _fontMetrics.getLeading();
-			}
-            // TODO: adapt to bg: go lighter on colors that darker() would make black
-			// TODO: color registry
-            Color fg = FigureUtilities.darker(g.getBackgroundColor());
-            g.setForegroundColor(fg);
-            g.drawString(_label, imageAreaWidth + GAP, rect.y
-					+ (rect.height - getLabelHeight()) / 2 + leading);
-            fg.dispose();
-		}
-	}
-
-	/**
-	 * @return the label text
-	 */
-	public String getLabel() {
-		return _label;
-	}
-
-	/**
-	 * @param label
-	 */
-	public void setLabel(String label) {
-		this._label = label;
-	}
-
-	/**
-	 * @return whether the label is visible
-	 */
-	public boolean isLabelVisible() {
-		return _labelVisible;
-	}
-
-	/**
-	 * @param labelVisible
-	 */
-	public void setLabelVisible(boolean labelVisible) {
-		this._labelVisible = labelVisible;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/ImageWidgetProvider.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/ImageWidgetProvider.java
deleted file mode 100644
index a88caab..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/ImageWidgetProvider.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.widget;
-
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.provider.DimensionInfo;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * @author mengbo
- */
-public class ImageWidgetProvider extends AbstractWidgetProvider {
-	private static final String NOPIC_IMAGE_NAME = "PD_nopic.jpg"; //$NON-NLS-1$
-
-	private static Image _noPicImage;
-
-	private static int _noPicWidth;
-
-	private static int _noPicHeight;
-
-	/**
-	 * the image
-	 */
-	protected Image _image;
-
-	/**
-	 * image width
-	 */
-	protected int _imageWidth;
-
-	/**
-	 * image height
-	 */
-	protected int _imageHeight;
-
-	/**
-	 * @param image
-	 * @param style
-	 */
-	public ImageWidgetProvider(Image image, ICSSStyle style) {
-		super(style);
-
-		// set up image and image width/height
-		org.eclipse.swt.graphics.Rectangle rect = null;
-		if (image != null) {
-			rect = image.getBounds();
-			if (rect.width <= 0 || rect.height <= 0) {
-				useNoPicImage();
-			} else {
-				_image = image;
-				_imageWidth = rect.width;
-				_imageHeight = rect.height;
-			}
-		} else {
-			useNoPicImage();
-		}
-	}
-
-	/**
-	 * 
-	 */
-	private void useNoPicImage() {
-		if (_noPicImage == null || _noPicImage.isDisposed()) {
-			ImageDescriptor noPicImageDesc = PDPlugin.getDefault()
-					.getImageDescriptor(NOPIC_IMAGE_NAME);
-			_noPicImage = noPicImageDesc.createImage();
-			org.eclipse.swt.graphics.Rectangle rect = _noPicImage.getBounds();
-			_noPicWidth = rect.width;
-			_noPicHeight = rect.height;
-		}
-		_image = _noPicImage;
-		_imageWidth = _noPicWidth;
-		_imageHeight = _noPicHeight;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider#getPreferredDimension(int,
-	 *      int)
-	 */
-	public DimensionInfo getPreferredDimension(int width, int height) {
-		if (width <= 0 && height <= 0) {
-			// we are free, so use image size
-			org.eclipse.swt.graphics.Rectangle a = _image.getBounds();
-			return new DimensionInfo(a.width, a.height, -1);
-		} else if (width > 0 && height > 0) {
-			return new DimensionInfo(width, height, -1);
-		} else if (height > 0) {
-			width = (int) ((double) _imageWidth * height / _imageHeight);
-			return new DimensionInfo(width, height, -1);
-		} else {
-			height = (int) ((double) _imageHeight * width / _imageWidth);
-			return new DimensionInfo(width, height, -1);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider#paintFigure(org.eclipse.draw2d.geometry.Rectangle)
-	 */
-	public void paintFigure(Graphics g, Rectangle rect) {
-		if (_image != null) {
-			g.drawImage(_image, 0, 0, _imageWidth, _imageHeight, rect.x,
-					rect.y, rect.width, rect.height);
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/InputFileWidgetProvider.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/InputFileWidgetProvider.java
deleted file mode 100644
index 6b5dbf5..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/InputFileWidgetProvider.java
+++ /dev/null
@@ -1,177 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.widget;
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.Insets;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.border.CSSBorder;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.css2.provider.DimensionInfo;
-import org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider;
-import org.eclipse.jst.pagedesigner.editors.pagedesigner.MessageFormater;
-
-/**
- * @author mengbo
- */
-public class InputFileWidgetProvider extends AbstractWidgetProvider {
-	private static final String BODER_QUERY_TEMPLETE = "border-{0}-style"; //$NON-NLS-1$
-
-	private static final int GAP = 2;
-
-	private ICSSWidgetProvider _sub1;
-
-	private ICSSWidgetProvider _sub2;
-
-	/**
-	 * @param style
-	 * @param sub1 
-	 * @param sub2 
-	 */
-	public InputFileWidgetProvider(ICSSStyle style, ICSSWidgetProvider sub1,
-			ICSSWidgetProvider sub2) {
-		super(style);
-		_sub1 = sub1;
-		_sub2 = sub2;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider#getPreferredDimension(int,
-	 *      int)
-	 */
-	public DimensionInfo getPreferredDimension(int width, int height) {
-		Insets borderInset = new Insets();
-		Insets borderPaddingInset = new Insets();
-		ICSSStyle style = getCSSStyle();
-		if (style != null) {
-			borderInset = style.getBorderInsets();
-			borderPaddingInset = borderInset.getAdded(style.getPaddingInsets());
-		}
-
-		Dimension d1 = _sub1.getPreferredDimension(-1, -1).getDimension();
-		Dimension d2 = _sub2.getPreferredDimension(-1, -1).getDimension();
-
-		int minWidth = d2.width + 2 * (borderInset.left + borderInset.right)
-				+ GAP;
-		int prefWidth = d1.width + d2.width + 2
-				* (borderPaddingInset.left + borderPaddingInset.right) + GAP;
-		int minHeight = borderInset.top + borderInset.bottom;
-		int prefHeight = Math.max(d1.height, d2.height)
-				+ borderPaddingInset.top + borderPaddingInset.bottom;
-
-		if (width > 0 && minWidth > width) {
-			prefWidth = minWidth;
-		} else if (width != 0) {
-			prefWidth = width;
-		}
-
-		if (height > 0 && minHeight > height) {
-			prefHeight = minHeight;
-		} else if (height != 0) {
-			prefHeight = height;
-		}
-		return new DimensionInfo(prefWidth, prefHeight, -1);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider#paintFigure(org.eclipse.draw2d.Graphics,
-	 *      org.eclipse.draw2d.geometry.Rectangle)
-	 */
-	public void paintFigure(Graphics g, Rectangle rect) {
-		Rectangle rect1, rect2;
-
-		Insets borderInset = new Insets();
-		Insets paddingInset = new Insets();
-		Insets borderPaddingInset = new Insets();
-		ICSSStyle style = getCSSStyle();
-		if (style != null) {
-			borderInset = style.getBorderInsets();
-			paddingInset = style.getPaddingInsets();
-			borderPaddingInset.add(borderInset).add(paddingInset);
-		}
-
-		Dimension d1 = _sub1.getPreferredDimension(-1, -1).getDimension();
-		Dimension d2 = _sub2.getPreferredDimension(-1, -1).getDimension();
-		int prefWidth = d1.width + d2.width + 2 * borderPaddingInset.left + 2
-				* borderPaddingInset.right + GAP;
-		if (rect.width < prefWidth) {
-			paddingInset.left = 0;
-			paddingInset.right = 0;
-		}
-		int prefHeight = Math.max(d1.height, d2.height)
-				+ borderPaddingInset.top + borderPaddingInset.bottom;
-		if (rect.height < prefHeight) {
-			paddingInset.top = 0;
-			paddingInset.bottom = 0;
-		}
-
-		int width = rect.width
-				- d2.width
-				- (borderInset.left + borderInset.right + paddingInset.left + paddingInset.right)
-				- GAP;
-		rect1 = new Rectangle(rect.x - 1, rect.y, width, rect.height);
-		rect2 = new Rectangle(rect.x + rect1.width + 2, rect.y, rect.width
-				- rect1.width - 3, rect.height);
-		Rectangle innerRect1 = rect1.getCopy().crop(borderInset);
-		Rectangle innerRect2 = rect2.getCopy().crop(borderInset);
-
-		g.pushState();
-		g.setBackgroundColor(ColorConstants.button);
-		g.fillRectangle(innerRect2);
-		g.popState();
-
-		CSSBorder cssBorder = new CSSBorder(style);
-		String[] edges = new String[] { ICSSStyle.LEFT, ICSSStyle.RIGHT,
-				ICSSStyle.TOP, ICSSStyle.BOTTOM };
-		for (int i = 0; i < edges.length; i++) {
-			cssBorder.paintEdge(g, rect1, innerRect1, edges[i],
-					getBorderStyle(edges[i]));
-		}
-		for (int i = 0; i < edges.length; i++) {
-			String borderStyle = getBorderStyle(edges[i]);
-			if (ICSSPropertyID.VAL_INSET.equals(borderStyle)) {
-				borderStyle = ICSSPropertyID.VAL_OUTSET;
-			}
-			cssBorder.paintEdge(g, rect2, innerRect2, edges[i], borderStyle);
-		}
-
-		_sub2.paintFigure(g, innerRect2.getCopy().crop(paddingInset));
-		// _sub1.paintFigure(g, innerRect1.crop(paddingInset));
-	}
-
-	private String getBorderStyle(String edge) {
-		ICSSStyle style = getCSSStyle();
-		if (style != null) {
-			String property = MessageFormater
-					.format(BODER_QUERY_TEMPLETE, edge);
-			String borderStyle = style.getStyleProperty(property).toString();
-			return borderStyle;
-		}
-		return ICSSPropertyID.VAL_HIDDEN;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider#isHandlingBorder()
-	 */
-	public boolean isHandlingBorder() {
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/ListWidgetProvider.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/ListWidgetProvider.java
deleted file mode 100644
index 39e27b8..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/ListWidgetProvider.java
+++ /dev/null
@@ -1,214 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.widget;
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.FigureUtilities;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.font.ICSSFont;
-import org.eclipse.jst.pagedesigner.css2.provider.DimensionInfo;
-import org.eclipse.jst.pagedesigner.css2.style.DefaultStyle;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.RGB;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ListWidgetProvider extends AbstractWidgetProvider {
-	private static int DEFAULTSIZE = 4;
-
-	private static final int VERTICAL_PADDING = 6;
-
-	private static final int HORIZONTAL_PADDING = 12;
-
-	private static int ARRAWWIDTH = 16;
-
-	private static int ARROWHEIGHT = 16;
-
-	private String[] _options;
-
-	private int _rows = DEFAULTSIZE;
-
-	/**
-	 * @param style
-	 */
-	public ListWidgetProvider(ICSSStyle style) {
-		super(style);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider#getPreferredDimension(int,
-	 *      int)
-	 */
-	public DimensionInfo getPreferredDimension(int width, int height) {
-		if (width <= 0) {
-			width = getDefaultWidth();
-		}
-		if (height <= 0) {
-			height = getDefaultHeight();
-		}
-		return new DimensionInfo(width, height, -1);
-	}
-
-	/**
-	 * by default, the combo's width will be calculated from the longest option
-	 * value.
-	 * 
-	 * @return the default width
-	 */
-	public int getDefaultWidth() {
-		int longestStringWidth = 0;
-		if (_options != null) {
-			ICSSStyle style = this.getCSSStyle();
-			if (style == null) {
-				style = DefaultStyle.getInstance();
-			}
-			ICSSFont font = style.getCSSFont();
-			Font swtFont = font.getSwtFont();
-			for (int i = 0; i < _options.length; i++) {
-				int width = FigureUtilities.getTextWidth(_options[i], swtFont);
-				if (width > longestStringWidth) {
-					longestStringWidth = width;
-				}
-			}
-		}
-		// text area width + borderWidth + vertical scroll width
-		return (longestStringWidth) + HORIZONTAL_PADDING + ARRAWWIDTH;
-	}
-
-	/**
-	 * 
-	 * @return the default height
-	 * @see TextInputWidgetProvider#getDefaultHeight()
-	 */
-	public int getDefaultHeight() {
-		ICSSStyle style = this.getCSSStyle();
-		if (style == null) {
-			style = DefaultStyle.getInstance();
-		}
-		ICSSFont font = style.getCSSFont();
-		Font swtfont = font.getSwtFont();
-		int fontHeight = FigureUtilities.getFontMetrics(swtfont).getHeight();
-		return (fontHeight) * _rows + VERTICAL_PADDING;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider#paintFigure(org.eclipse.draw2d.Graphics,
-	 *      org.eclipse.draw2d.geometry.Rectangle)
-	 */
-	public void paintFigure(Graphics g, Rectangle rect) {
-		BorderUtil.drawBorder(g, rect.x, rect.y, rect.width, rect.height,
-				BORDERTHICK, true);
-		if (_options != null) {
-			ICSSStyle style = this.getCSSStyle();
-			if (style == null) {
-				style = DefaultStyle.getInstance();
-			}
-			ICSSFont font = style.getCSSFont();
-			Font swtfont = font.getSwtFont();
-			g.setFont(swtfont);
-
-			Color newColor = null;
-			Object color = style.getColor();
-			if (color instanceof Color) {
-				g.setForegroundColor((Color) color);
-			} else if (color instanceof RGB) {
-				newColor = new Color(Display.getCurrent(), (RGB) color);
-				g.setForegroundColor(newColor);
-			} else {
-				g.setForegroundColor(ColorConstants.black);
-			}
-			int fontHeight = FigureUtilities.getFontMetrics(swtfont)
-					.getHeight();
-			int x = rect.x + HORIZONTAL_PADDING / 2;
-			int y = rect.y + VERTICAL_PADDING / 2;
-
-			g.clipRect(rect);
-			for (int i = 0; i < _options.length
-					&& (i * fontHeight < rect.height - VERTICAL_PADDING); i++) {
-				g.drawString(_options[i], x, y);
-				y += fontHeight;
-			}
-			if (newColor != null) {
-				newColor.dispose();
-			}
-
-			int borderThick = 2;
-			Rectangle barRect = new Rectangle(rect.x, rect.y + borderThick,
-					rect.width - borderThick, rect.height - 2 * borderThick);
-			BorderUtil.drawVertialBar(g, ARRAWWIDTH, ARROWHEIGHT, borderThick,
-					barRect);
-		}
-	}
-
-	/**
-	 * @param string
-	 * @param x
-	 * @param y
-	 * @return
-	 */
-	private String normalize(String string) {
-		if (string == null) {
-			return ""; //$NON-NLS-1$
-		}
-		int index = string.indexOf('\r');
-		if (index >= 0) {
-			string = string.substring(0, index);
-		}
-		index = string.indexOf('\n');
-		if (index >= 0) {
-			string = string.substring(0, index);
-		}
-		return string;
-	}
-
-	/**
-	 * set the options to be displayed in this combo box.
-	 * 
-	 * @param options
-	 */
-	public void setOptions(String[] options) {
-		this._options = options;
-		if (_options != null) {
-			for (int i = 0; i < _options.length; i++) {
-				_options[i] = normalize(_options[i]);
-			}
-		}
-	}
-
-	/**
-	 * set the default number of rows to be displayed.
-	 * 
-	 * @param rows
-	 */
-	public void setRows(int rows) {
-		_rows = (rows > 0 ? rows : DEFAULTSIZE);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider#isHandlingBorder()
-	 */
-	public boolean isHandlingBorder() {
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/RadioWidgetProvider.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/RadioWidgetProvider.java
deleted file mode 100644
index 980171f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/RadioWidgetProvider.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.widget;
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.provider.DimensionInfo;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class RadioWidgetProvider extends AbstractWidgetProvider {
-	private boolean isChecked;
-
-	/**
-	 * @param style
-	 */
-	public RadioWidgetProvider(ICSSStyle style) {
-		super(style);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider#getPreferredDimension(int,
-	 *      int)
-	 */
-	public DimensionInfo getPreferredDimension(int width, int height) {
-		if (width <= 0) {
-			width = getDefaultWidth();
-		}
-		if (height <= 0) {
-			height = getDefaultWidth();
-		}
-		return new DimensionInfo(width, height, height * 4 / 5);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider#paintFigure(org.eclipse.draw2d.Graphics,
-	 *      org.eclipse.draw2d.geometry.Rectangle)
-	 */
-	public void paintFigure(Graphics g, Rectangle rect) {
-		int centerX = rect.x + rect.width / 2;
-		int centerY = rect.y + rect.height / 2;
-
-		// we always draw it as a circle.
-		int width = Math.min(rect.width, rect.height);
-		int cycleWidth = width * 3 / 5;
-
-		// FIXME: when the size of the radio is big, the line width may need
-		// calculate to be bigger.
-		int lineWidth = 2;
-		g.setLineWidth(lineWidth);
-
-		g.setForegroundColor(ColorConstants.buttonDarker);
-		g.drawArc(centerX - cycleWidth / 2, centerY - cycleWidth + 1,
-				cycleWidth, cycleWidth, 45, 180);
-
-		g.setForegroundColor(ColorConstants.button);
-		g.drawArc(centerX - cycleWidth / 2, centerY - cycleWidth + 1,
-				cycleWidth, cycleWidth, 225, 180);
-
-		// since the two cycle may not overlap very well, some space between
-		// them will be displayed.
-		// so we make the bigger cycle to be a little thicker.
-		cycleWidth += (2 * lineWidth - 2);
-		lineWidth += 1;
-
-		if (cycleWidth < width) {
-			g.setForegroundColor(ColorConstants.buttonDarkest);
-			g.drawArc(centerX - cycleWidth / 2, centerY - cycleWidth + 1,
-					cycleWidth, cycleWidth, 45, 180);
-		}
-
-		if (isChecked()) {
-			g.setBackgroundColor(ColorConstants.black);
-			g.fillArc(centerX - 1, centerY - cycleWidth / 2 - 1, 4, 4, 0, 360);
-		}
-	}
-
-	/**
-	 * @return the default width
-	 */
-	public final int getDefaultWidth() {
-		// FIXME: don't know the how to define the default width yet.
-		return 15;
-	}
-
-	/**
-	 * @return Returns the checked.
-	 */
-	public boolean isChecked() {
-		return isChecked;
-	}
-
-	/**
-	 * @param checked
-	 */
-	public void setChecked(boolean checked) {
-		this.isChecked = checked;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/TextAreaWidgetProvider.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/TextAreaWidgetProvider.java
deleted file mode 100644
index 77aea65..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/TextAreaWidgetProvider.java
+++ /dev/null
@@ -1,211 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.widget;
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.FigureUtilities;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.font.ICSSFont;
-import org.eclipse.jst.pagedesigner.css2.layout.TextLayoutSupport;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.css2.provider.DimensionInfo;
-import org.eclipse.jst.pagedesigner.css2.style.DefaultStyle;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.RGB;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TextAreaWidgetProvider extends AbstractWidgetProvider {
-	private static final int DEFAULTCOLUMN = 20;
-
-	private static final int DEFAULTROWS = 2;
-
-	private static final int VERTICAL_PADDING = 2;
-
-	private static final int HORIZONTAL_PADDING = 2;
-
-	private static int ARRAWWIDTH = 16;
-
-	private static int ARROWHEIGHT = 16;
-
-	private int _columns = DEFAULTCOLUMN;
-
-	private int _rows = DEFAULTROWS;
-
-	private String _value;
-
-	/**
-	 * @param style
-	 */
-	public TextAreaWidgetProvider(ICSSStyle style) {
-		super(style);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider#getPreferredDimension(int,
-	 *      int)
-	 */
-	public DimensionInfo getPreferredDimension(int width, int height) {
-		if (width <= 0) {
-			width = getDefaultWidth();
-		}
-		if (height <= 0) {
-			height = getDefaultHeight();
-		}
-		return new DimensionInfo(width, height, -1);
-	}
-
-	/**
-	 * @return
-	 */
-	private int getDefaultHeight() {
-		ICSSStyle style = this.getCSSStyle();
-		if (style == null) {
-			style = DefaultStyle.getInstance();
-		}
-		ICSSFont font = style.getCSSFont();
-		Font swtfont = font.getSwtFont();
-		int fontHeight = FigureUtilities.getFontMetrics(swtfont).getHeight();
-
-		return (fontHeight) * _rows + VERTICAL_PADDING;
-	}
-
-	/**
-	 * @return
-	 */
-	private int getDefaultWidth() {
-		ICSSStyle style = this.getCSSStyle();
-		if (style == null) {
-			style = DefaultStyle.getInstance();
-		}
-		ICSSFont font = style.getCSSFont();
-
-		int fontWidth = FigureUtilities.getFontMetrics(font.getSwtFont())
-				.getAverageCharWidth();
-		return _columns * fontWidth + ARRAWWIDTH + HORIZONTAL_PADDING;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider#paintFigure(org.eclipse.draw2d.Graphics,
-	 *      org.eclipse.draw2d.geometry.Rectangle)
-	 */
-	public void paintFigure(Graphics g, Rectangle rect) {
-		if (_value != null) {
-			g.clipRect(rect);
-			ICSSStyle style = this.getCSSStyle();
-			if (style == null) {
-				style = DefaultStyle.getInstance();
-			}
-			int decoration = ((Integer) style
-					.getStyleProperty(ICSSPropertyID.ATTR_TEXTDECORATION))
-					.intValue();
-			ICSSFont font = style.getCSSFont();
-			g.setFont(font.getSwtFont());
-
-			Color newColor = null;
-			Object color = style.getColor();
-			if (color instanceof Color) {
-				g.setForegroundColor((Color) color);
-			} else if (color instanceof RGB) {
-				newColor = new Color(Display.getCurrent(), (RGB) color);
-				g.setForegroundColor(newColor);
-			} else {
-				g.setForegroundColor(ColorConstants.black);
-			}
-
-			Object textAlign = style
-					.getStyleProperty(ICSSPropertyID.ATTR_TEXTALIGN);
-			int begin = 0;
-			int end = 0;
-			int fontHeight = FigureUtilities.getFontMetrics(font.getSwtFont())
-					.getHeight();
-
-			int fontWidth = FigureUtilities.getFontMetrics(font.getSwtFont())
-					.getAverageCharWidth();
-			int columns = (rect.width - HORIZONTAL_PADDING) / fontWidth;
-
-			int i = 0;
-			while (true) {
-				int y = rect.y + VERTICAL_PADDING / 2 + fontHeight * i;
-				if (y >= rect.bottom()) {
-					break;
-				}
-				end += columns;
-				if (end > _value.length()) {
-					end = _value.length();
-				}
-				end = getTextCount(begin, end, g.getFont(), rect.width
-						- ARRAWWIDTH);
-
-				String text = _value.substring(begin, end);
-
-				int width = FigureUtilities.getTextWidth(text, g.getFont());
-				int x = TextLayoutSupport.getBeginX(textAlign, rect, width);
-				g.drawString(text, x, y);
-
-				TextLayoutSupport.paintTextDecoration(g, new Rectangle(x, y,
-						width, fontHeight), decoration);
-				begin = end;
-
-				if (end == _value.length()) {
-					break;
-				}
-				i++;
-			}
-			if (newColor != null) {
-				newColor.dispose();
-			}
-		}
-		int borderThick = 2;
-		BorderUtil
-				.drawVertialBar(g, ARRAWWIDTH, ARROWHEIGHT, borderThick, rect);
-	}
-
-	private int getTextCount(int begin, int end, Font swtFont, int textWidth) {
-		while (FigureUtilities.getTextWidth(_value.substring(begin, end),
-				swtFont) > textWidth) {
-			end--;
-		}
-		return end;
-	}
-
-	/**
-	 * @param columns
-	 */
-	public void setColumns(int columns) {
-		this._columns = (columns > 0 ? columns : DEFAULTCOLUMN);
-	}
-
-	/**
-	 * @param rows
-	 */
-	public void setRows(int rows) {
-		this._rows = (rows > 0 ? rows : DEFAULTROWS);
-	}
-
-	/**
-	 * @param value
-	 */
-	public void setValue(String value) {
-		this._value = value;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/TextInputWidgetProvider.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/TextInputWidgetProvider.java
deleted file mode 100644
index 966c5b8..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/TextInputWidgetProvider.java
+++ /dev/null
@@ -1,180 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.widget;
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.FigureUtilities;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.font.ICSSFont;
-import org.eclipse.jst.pagedesigner.css2.layout.TextLayoutSupport;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.css2.provider.DimensionInfo;
-import org.eclipse.jst.pagedesigner.css2.style.DefaultStyle;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.RGB;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TextInputWidgetProvider extends AbstractWidgetProvider {
-	private static final int VERTICAL_INCREMENT = 2;
-
-	/**
-	 * password size
-	 */
-	public static final int PWD_SIZE = 18;
-
-	private int DEFAULTSIZE = 20;
-
-	private int _size = DEFAULTSIZE;
-
-	private String _value;
-
-	/**
-	 * @param style
-	 */
-	public TextInputWidgetProvider(ICSSStyle style) {
-		this(style, 20);
-	}
-
-	/**
-	 * @param style
-	 * @param size
-	 */
-	public TextInputWidgetProvider(ICSSStyle style, int size) {
-		super(style);
-		DEFAULTSIZE = size;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider#getPreferredDimension(int,
-	 *      int)
-	 */
-	public DimensionInfo getPreferredDimension(int width, int height) {
-		if (width <= 0) {
-			width = getDefaultWidth();
-
-		}
-		if (height <= 0) {
-			height = getDefaultHeight();
-		}
-		return new DimensionInfo(width, height, -1);
-	}
-
-	/**
-	 * @return
-	 */
-	private int getDefaultHeight() {
-		ICSSStyle style = this.getCSSStyle();
-		if (style == null) {
-			style = DefaultStyle.getInstance();
-		}
-		ICSSFont font = style.getCSSFont();
-		Font swtfont = font.getSwtFont();
-		int fontSize = FigureUtilities.getFontMetrics(swtfont).getHeight();
-		return fontSize + VERTICAL_INCREMENT;
-	}
-
-	/**
-	 * @return the default width
-	 */
-	public int getDefaultWidth() {
-		ICSSStyle style = this.getCSSStyle();
-		if (style == null) {
-			style = DefaultStyle.getInstance();
-		}
-		return computeWidth(style.getCSSFont());
-	}
-
-	private int computeWidth(ICSSFont font) {
-		int fontWidth = FigureUtilities
-				.getTextWidth("abcde", font.getSwtFont());//$NON-NLS-1$
-		return (fontWidth + 1) * _size / 5;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider#paintFigure(org.eclipse.draw2d.Graphics,
-	 *      org.eclipse.draw2d.geometry.Rectangle)
-	 */
-	public void paintFigure(Graphics g, Rectangle rect) {
-		String value = getValue();
-		if (value != null) {
-			ICSSStyle style = this.getCSSStyle();
-			if (style == null) {
-				style = DefaultStyle.getInstance();
-			}
-			Object textAlign = style
-					.getStyleProperty(ICSSPropertyID.ATTR_TEXTALIGN);
-
-			Font font = style.getCSSFont().getSwtFont();
-			g.setFont(font);
-
-			Color newColor = null;
-			Object color = style.getColor();
-			if (color instanceof Color) {
-				g.setForegroundColor((Color) color);
-			} else if (color instanceof RGB) {
-				newColor = new Color(Display.getCurrent(), (RGB) color);
-				g.setForegroundColor(newColor);
-			} else {
-				g.setForegroundColor(ColorConstants.black);
-			}
-			g.clipRect(rect);
-			int width = FigureUtilities.getTextWidth(value, g.getFont());
-			int x = TextLayoutSupport.getBeginX(textAlign, rect, width);
-			int y = rect.y + VERTICAL_INCREMENT / 2;
-
-			g.drawString(value, x, y);
-			TextLayoutSupport.paintTextDecoration(g, new Rectangle(x, y, width,
-					g.getFontMetrics().getHeight()), ((Integer) getCSSStyle()
-					.getStyleProperty(ICSSPropertyID.ATTR_TEXTDECORATION))
-					.intValue());
-			if (newColor != null) {
-				newColor.dispose();
-			}
-		}
-	}
-
-	/**
-	 * set the value in this text input control
-	 * 
-	 * @param value
-	 */
-	public void setValue(String value) {
-		this._value = value;
-	}
-
-	/**
-	 * @param size
-	 */
-	public void setSize(int size) {
-		this._size = (size <= 0 ? DEFAULTSIZE : size);
-	}
-
-	/**
-	 * get current value in this text input control
-	 * 
-	 * @return the value
-	 */
-	public String getValue() {
-		return _value;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/FeedBackInfo.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/FeedBackInfo.java
deleted file mode 100644
index f405bbc..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/FeedBackInfo.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dnd;
-
-/**
- * @author mengbo
- */
-public class FeedBackInfo {
-	private String _description;
-
-	private int _order;
-
-	/**
-	 * @param desc 
-	 * @param order 
-	 */
-	public FeedBackInfo(String desc, int order) {
-		this._description = desc;
-	}
-
-	/**
-	 * the description may be used in tooltip or wizard dialog selection to tell
-	 * user the effect of the drop.
-	 * 
-	 * @return the description
-	 */
-	public String getDescription() {
-		return _description;
-	}
-
-	/**
-	 * how important this feedback is. This information may be used when we
-	 * ordering the choices in the wizard.
-	 * 
-	 * range from 0-10, the bigger, the more important.
-	 * 
-	 * @return the order
-	 */
-	public int getOrder() {
-		return _order;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/ILocalDropHandler.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/ILocalDropHandler.java
deleted file mode 100644
index 11378a1..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/ILocalDropHandler.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dnd;
-
-import org.eclipse.jface.wizard.IWizard;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public interface ILocalDropHandler {
-	/**
-	 * whether this handler will use wizard for user to config detail
-	 * 
-	 * @return true if should use wizard
-	 */
-	public boolean useWizard();
-
-	/**
-	 * @param localData
-	 * @param viewer
-	 * @return true if should use wizard
-	 */
-	public boolean useWizard(Object localData, IHTMLGraphicalViewer viewer);
-
-	/**
-	 * 
-	 * @param localData
-	 * @param widget
-	 * @return the feed back info
-	 */
-	public FeedBackInfo supportUpdateWidget(Object localData, Node widget);
-
-	/**
-	 * This method will only be called when <code>supportUpdateWidget</code>
-	 * return true and <code>useWizard</code> return true.
-	 * 
-	 * @param localData
-	 * @param widget
-	 * @param viewer
-	 * @return the wizard
-	 */
-	public IWizard getWizard(Object localData, Node widget,
-			IHTMLGraphicalViewer viewer);
-
-	/**
-	 * this method is called when the handler don't support wizard.
-	 * 
-	 * @param localData
-	 * @param widget
-	 * @param viewer
-	 */
-	public void doUpdateWidget(Object localData, Node widget,
-			IHTMLGraphicalViewer viewer);
-
-	/**
-	 * 
-	 * @param localData
-	 * @param position
-	 * @return the feedback info
-	 */
-	public FeedBackInfo supportInsertElements(Object localData,
-			IDOMPosition position);
-
-	/**
-	 * 
-	 * @param localData
-	 * @param position
-	 * @param viewer
-	 * @return the wizard
-	 */
-	public IWizard getWizard(Object localData, IDOMPosition position,
-			IHTMLGraphicalViewer viewer);
-
-	/**
-	 * @param localData
-	 * @param position
-	 * @param viewer
-	 */
-	public void doInsertElements(Object localData, IDOMPosition position,
-			IHTMLGraphicalViewer viewer);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/LocalDropRequest.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/LocalDropRequest.java
deleted file mode 100644
index 47d140c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/LocalDropRequest.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dnd;
-
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.requests.DropRequest;
-
-/**
- * @author mengbo
- */
-public class LocalDropRequest extends Request implements DropRequest {
-	// XXX: need move this constant to somewhere else.
-	/**
-	 * the request name for local drops
-	 */
-	public static final String REQ_LOCAL_DROP = "Local Drop"; //$NON-NLS-1$
-
-	private Point _location;
-
-	private Object _localObject;
-
-	/**
-	 * 
-	 */
-	public LocalDropRequest() {
-		super(REQ_LOCAL_DROP);
-	}
-
-	/**
-	 * Returns the location of the object to be created.
-	 * 
-	 * @return the location
-	 */
-	public Point getLocation() {
-		return _location;
-	}
-
-	/**
-	 * Sets the location where the new object will be placed.
-	 * 
-	 * @param location
-	 *            the location
-	 */
-	public void setLocation(Point location) {
-		this._location = location;
-	}
-
-	/**
-	 * @return the  local object
-	 */
-	public Object getLocalObject() {
-		return _localObject;
-	}
-
-	/**
-	 * @param local
-	 */
-	public void setLocalObject(Object local) {
-		this._localObject = local;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/DesignerSourceDropTargetListener.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/DesignerSourceDropTargetListener.java
deleted file mode 100644
index 20af244..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/DesignerSourceDropTargetListener.java
+++ /dev/null
@@ -1,144 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dnd.internal;
-
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.dnd.TemplateTransfer;
-import org.eclipse.jst.pagedesigner.commands.PaletteDropInsertCommand;
-import org.eclipse.jst.pagedesigner.editors.pagedesigner.PageDesignerResources;
-import org.eclipse.jst.pagedesigner.editors.palette.IDropSourceData;
-import org.eclipse.swt.custom.StyledText;
-import org.eclipse.swt.dnd.DropTargetEvent;
-import org.eclipse.swt.dnd.TextTransfer;
-import org.eclipse.swt.dnd.Transfer;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.ui.texteditor.ITextEditorDropTargetListener;
-import org.eclipse.wst.sse.ui.StructuredTextEditor;
-import org.eclipse.wst.sse.ui.internal.ExtendedEditorDropTargetAdapter;
-
-/**
- * @author mengbo
- */
-public class DesignerSourceDropTargetListener extends
-		ExtendedEditorDropTargetAdapter implements
-		ITextEditorDropTargetListener {
-	private int _location;
-
-	private StructuredTextEditor _textEditor;
-
-	/**
-	 * @param textEditor
-	 */
-	public DesignerSourceDropTargetListener(StructuredTextEditor textEditor) {
-		super(false);
-		_textEditor = textEditor;
-		setTextViewer(_textEditor.getTextViewer());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.texteditor.ITextEditorDropTargetListener#getTransfers()
-	 */
-	public Transfer[] getTransfers() {
-		return new Transfer[] { TemplateTransfer.getInstance(),
-				TextTransfer.getInstance() };
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.swt.dnd.DropTargetListener#dragOperationChanged(org.eclipse.swt.dnd.DropTargetEvent)
-	 */
-	public void dragOperationChanged(DropTargetEvent event) {
-		super.dragOperationChanged(event);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.swt.dnd.DropTargetListener#dragOver(org.eclipse.swt.dnd.DropTargetEvent)
-	 */
-	public void dragOver(DropTargetEvent event) {
-		StyledText text = null;
-		if (_textEditor.getTextViewer() != null) {
-			text = _textEditor.getTextViewer().getTextWidget();
-			if (TemplateTransfer.getInstance().isSupportedType(
-					event.currentDataType)) {
-				if (_textEditor.getTextViewer() != null) {
-						Point p = new Point(event.x, event.y);
-						SourceViewerDragDropHelper.getInstance().updateCaret(
-								_textEditor, p);
-						_location = text.getCaretOffset();
-						if (TemplateTransfer.getInstance().isSupportedType(
-								event.currentDataType)) {
-							_location = SourceViewerDragDropHelper.getInstance()
-									.getValidLocation(_textEditor, _location);
-						}
-						SourceViewerDragDropHelper.getInstance().showCaret(
-								_textEditor, _location);
-				    }
-		
-			} else if (TextTransfer.getInstance().isSupportedType(
-					event.currentDataType)) {
-				super.dragOver(event);
-				_location = text.getCaretOffset();
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.swt.dnd.DropTargetListener#drop(org.eclipse.swt.dnd.DropTargetEvent)
-	 */
-	public void drop(DropTargetEvent event) {
-		StyledText text = null;
-		if (_textEditor.getTextViewer() != null) {
-			text = _textEditor.getTextViewer().getTextWidget();
-		}
-		text.setCaretOffset(_location);
-		Command command = getCommand(event);
-		if (command == null) {
-			return;
-		}
-		command.execute();
-	}
-
-	private Command getCommand(DropTargetEvent event) {
-		if (TextTransfer.getInstance().isSupportedType(event.currentDataType)) {
-			Object data = event.data;
-			if (data instanceof String) {
-				SourceViewLocalDropCommand command = new SourceViewLocalDropCommand(
-						_textEditor, data, _location);
-				return command;
-			}
-		} else if (TemplateTransfer.getInstance().isSupportedType(
-				event.currentDataType)) {
-			Object data = event.data;
-			PaletteDropInsertCommand command = null;
-			if (data instanceof IDropSourceData) {
-			    final IDropSourceData dropSourceData = (IDropSourceData) data;
-					// "Create new item"
-				command = new PaletteDropInsertCommand(
-						PageDesignerResources
-								.getInstance()
-								.getString(
-										"DesignerSourceDropTargetListener.InserCommandLabel"), _textEditor, dropSourceData, _location); //$NON-NLS-1$
-		    
-			}
-			return command;
-		}
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/DesignerSourceMouseTrackAdapter.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/DesignerSourceMouseTrackAdapter.java
deleted file mode 100644
index a39dce5..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/DesignerSourceMouseTrackAdapter.java
+++ /dev/null
@@ -1,158 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dnd.internal;
-
-import org.eclipse.gef.EditDomain;
-import org.eclipse.gef.palette.ToolEntry;
-import org.eclipse.jst.pagedesigner.commands.PaletteDropInsertCommand;
-import org.eclipse.jst.pagedesigner.commands.SourceViewerCommand;
-import org.eclipse.jst.pagedesigner.editors.pagedesigner.PageDesignerResources;
-import org.eclipse.jst.pagedesigner.editors.palette.IDropSourceDataProvider;
-import org.eclipse.swt.custom.StyledText;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.MouseListener;
-import org.eclipse.swt.events.MouseMoveListener;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.wst.sse.ui.StructuredTextEditor;
-import org.eclipse.wst.sse.ui.internal.ExtendedEditorDropTargetAdapter;
-
-/**
- * @author mengbo
- */
-public class DesignerSourceMouseTrackAdapter extends
-		ExtendedEditorDropTargetAdapter implements MouseListener,
-		MouseMoveListener {
-	private int _location;
-
-	private StructuredTextEditor _textEditor;
-
-	private EditDomain _domain;
-
-	/**
-	 * @param textEditor
-	 * @param domain
-	 */
-	public DesignerSourceMouseTrackAdapter(StructuredTextEditor textEditor,
-			EditDomain domain) {
-		super(false);
-		_textEditor = textEditor;
-		_domain = domain;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.swt.events.MouseMoveListener#mouseMove(org.eclipse.swt.events.MouseEvent)
-	 */
-	public void mouseMove(MouseEvent event) {
-		//Feedback is handled by DesignerSourceDropTargetListener - commenting out below
-		Object object = getPaletteObject();
-		StyledText text = null;
-		if (_textEditor.getTextViewer() != null) {
-			text = _textEditor.getTextViewer().getTextWidget();
-		} else {
-			return;
-		}
-		if (object == null) {
-            // set to default cusror
-			text.setCursor(null);
-			return;
-		}
-		Point p = new Point(event.x, event.y);
-		p = _textEditor.getTextViewer().getTextWidget().toDisplay(p);
-		SourceViewerDragDropHelper.getInstance().updateCaret(_textEditor, p);
-		_location = text.getCaretOffset();
-		_location = SourceViewerDragDropHelper.getInstance().getValidLocation(
-				_textEditor, _location);
-		_location = SourceViewerDragDropHelper.getInstance().showCaret(
-				_textEditor, _location);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.swt.events.MouseListener#mouseUp(org.eclipse.swt.events.MouseEvent)
-	 */
-	public void mouseUp(MouseEvent event) {
-		if (event.button != 1) {
-			if (_domain.getPaletteViewer() != null) {
-				_domain.getPaletteViewer().setActiveTool(null);
-			}
-			return;
-		}
-        SourceViewerCommand command = getCommand(event);
-        if (command != null) {
-        	command.execute();
-        	resetPalette();
-        }
-        _location = 0;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.palette.PaletteListener#activeToolChanged(org.eclipse.gef.ui.palette.PaletteViewer,
-	 *      org.eclipse.gef.palette.ToolEntry)
-	 */
-	private IDropSourceDataProvider getPaletteObject() {
-		if (_domain.getPaletteViewer() != null) {
-			Object tool = _domain.getPaletteViewer().getActiveTool();
-			if (tool instanceof IDropSourceDataProvider) {
-				return (IDropSourceDataProvider) tool;
-			}
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.swt.events.MouseListener#mouseDoubleClick(org.eclipse.swt.events.MouseEvent)
-	 */
-	public void mouseDoubleClick(MouseEvent e) {
-       // do nothing
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.swt.events.MouseListener#mouseDown(org.eclipse.swt.events.MouseEvent)
-	 */
-	public void mouseDown(MouseEvent e) {
-        // do nothing
-	}
-
-	private PaletteDropInsertCommand getCommand(MouseEvent event) {
-	    IDropSourceDataProvider data = getPaletteObject();
-		PaletteDropInsertCommand command = null;
-		if (data != null) {
-			// "Create new item"
-			command = new PaletteDropInsertCommand(
-					PageDesignerResources
-							.getInstance()
-							.getString(
-									"DesignerSourceDropTargetListener.InserCommandLabel"), //$NON-NLS-1$
-					_textEditor, data.getDropSourceData(), _location);
-		}
-		return command;
-	}
-
-	private void resetPalette() {
-		if (_domain.getPaletteViewer() != null) {
-			ToolEntry tool = _domain.getPaletteViewer().getPaletteRoot()
-					.getDefaultEntry();
-			if (tool != null) {
-				_domain.getPaletteViewer().setActiveTool(tool);
-			}
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/DropSelectionWizard.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/DropSelectionWizard.java
deleted file mode 100644
index 9b0cfbf..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/DropSelectionWizard.java
+++ /dev/null
@@ -1,143 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dnd.internal;
-
-import java.util.Map;
-
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.wizard.Wizard;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.dnd.ILocalDropHandler;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public class DropSelectionWizard extends Wizard {
-	private final String INTIAL_DEFAULT_PAGE_IMAGE = "newsuade_wiz.gif"; //$NON-NLS-1$
-
-	private Object _localData;
-
-	private IHTMLGraphicalViewer _viewer;
-
-	private Map _feedbackToHandlers;
-
-	private boolean _updateWidget;
-
-	private Node _widget;
-
-	private IDOMPosition _position;
-
-	private SimpleWizardSelectionPage _firstPage;
-
-	private DropSelectionWizard(IHTMLGraphicalViewer viewer, Object localData,
-			Map handlers) {
-		this.setWindowTitle(Messages.getString("DropSelectionWizard.Title")); //$NON-NLS-1$
-		ImageDescriptor desc = PDPlugin.getDefault().getImageDescriptor(
-				INTIAL_DEFAULT_PAGE_IMAGE);
-		setDefaultPageImageDescriptor(desc);
-		this._viewer = viewer;
-		this._localData = localData;
-		this._feedbackToHandlers = handlers;
-
-		_firstPage = new SimpleWizardSelectionPage(_viewer, _localData,
-				_feedbackToHandlers);
-	}
-
-	/**
-	 * @param viewer 
-	 * @param localData 
-	 * @param handlers 
-	 * @param widget 
-	 */
-	public DropSelectionWizard(IHTMLGraphicalViewer viewer, Object localData,
-			Map handlers, Node widget) {
-		this(viewer, localData, handlers);
-		_updateWidget = true;
-		_widget = widget;
-
-		_firstPage.setWidget(widget);
-	}
-
-	/**
-	 * @param viewer
-	 * @param localData
-	 * @param handlers
-	 * @param position
-	 */
-	public DropSelectionWizard(IHTMLGraphicalViewer viewer, Object localData,
-			Map handlers, IDOMPosition position) {
-		this(viewer, localData, handlers);
-		_updateWidget = false;
-		_position = position;
-
-		_firstPage.setPosition(position);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.wizard.Wizard#addPages()
-	 */
-	public void addPages() {
-		addPage(_firstPage);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.wizard.Wizard#needsPreviousAndNextButtons()
-	 */
-	public boolean needsPreviousAndNextButtons() {
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.wizard.Wizard#canFinish()
-	 */
-	public boolean canFinish() {
-		if (getContainer().getCurrentPage() == _firstPage) {
-			Object obj = _firstPage.getCurrentHandler();
-			if (obj instanceof ILocalDropHandler)
-            {
-				return true;
-            }
-            return false;
-		}
-        return super.canFinish();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.wizard.IWizard#performFinish()
-	 */
-	public boolean performFinish() {
-		if (getContainer().getCurrentPage() == _firstPage) {
-			Object obj = _firstPage.getCurrentHandler();
-			if (obj instanceof ILocalDropHandler) {
-				ILocalDropHandler handler = (ILocalDropHandler) obj;
-				if (_updateWidget) {
-					handler.doUpdateWidget(_localData, _widget, _viewer);
-				} else {
-					handler.doInsertElements(_localData, _position, _viewer);
-				}
-				return true;
-			}
-		}
-		return true;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/LocalDropCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/LocalDropCommand.java
deleted file mode 100644
index d1eaf86..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/LocalDropCommand.java
+++ /dev/null
@@ -1,133 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dnd.internal;
-
-import java.util.Map;
-
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jface.wizard.IWizard;
-import org.eclipse.jst.jsf.common.ui.internal.dialogs.CommonWizardDialog;
-import org.eclipse.jst.pagedesigner.dnd.ILocalDropHandler;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.eclipse.swt.widgets.Shell;
-import org.w3c.dom.Node;
-
-/**
- * This is the command that performs the drop operation. There is no need for
- * this command to go into command stack, it simply open wizards, and let
- * wizards to handle the remaining things.
- * 
- * @author mengbo
- */
-public class LocalDropCommand extends Command {
-	/**
-	 * the map from feedback to ILocalDropHandler
-	 */
-	private Map _feedbackToHandlers;
-
-	private IHTMLGraphicalViewer _viewer;
-
-	private Object _localObject;
-
-	private Node _widget;
-
-	private IDOMPosition _position;
-
-	/**
-	 * constructor
-	 * @param viewer 
-	 * @param localObject 
-	 * @param feedbackHandlers 
-	 */
-	public LocalDropCommand(IHTMLGraphicalViewer viewer, Object localObject,
-			Map feedbackHandlers) {
-		_viewer = viewer;
-		_localObject = localObject;
-		_feedbackToHandlers = feedbackHandlers;
-	}
-
-	/**
-	 * @param widget
-	 */
-	public void setWidget(Node widget) {
-		_widget = widget;
-	}
-
-	/**
-	 * @param position
-	 */
-	public void setDOMPosition(IDOMPosition position) {
-		_position = position;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.commands.Command#execute()
-	 */
-	public void execute() {
-		if (_feedbackToHandlers.size() == 1) {
-			// only have one choice.
-			ILocalDropHandler handler = (ILocalDropHandler) _feedbackToHandlers
-					.values().toArray()[0];
-			if (handler.useWizard(_localObject, _viewer)) {
-				IWizard wizard;
-				if (_widget != null) {
-					wizard = handler.getWizard(_localObject, _widget, _viewer);
-				} else {
-					wizard = handler
-							.getWizard(_localObject, _position, _viewer);
-				}
-				CommonWizardDialog wizardDialog = new CommonWizardDialog(
-						getShell(), wizard);
-				wizardDialog.setTitle(Messages
-						.getString("LocalDropCommand.DropHandler")); //$NON-NLS-1$
-				wizardDialog.create();
-				wizardDialog.open();
-			} else {
-				if (_widget != null) {
-					handler.doUpdateWidget(_localObject, _widget, _viewer);
-				} else {
-					handler.doInsertElements(_localObject, _position, _viewer);
-				}
-			}
-		} else {
-			CommonWizardDialog wizardDialog = new CommonWizardDialog(
-					getShell(), getWizard());
-			wizardDialog.setTitle(Messages
-					.getString("LocalDropCommand.DropHandler")); //$NON-NLS-1$
-			wizardDialog.setBlockOnOpen(false);
-			wizardDialog.create();
-			wizardDialog.open();
-		}
-	}
-
-	/**
-	 * @return
-	 */
-	private IWizard getWizard() {
-		if (_widget != null) {
-			return new DropSelectionWizard(_viewer, _localObject,
-					_feedbackToHandlers, _widget);
-		}
-        return new DropSelectionWizard(_viewer, _localObject,
-        		_feedbackToHandlers, _position);
-	}
-
-	/**
-	 * @return
-	 */
-	private Shell getShell() {
-		return _viewer.getControl().getShell();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/LocalDropEditPolicy.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/LocalDropEditPolicy.java
deleted file mode 100644
index 5076d6c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/LocalDropEditPolicy.java
+++ /dev/null
@@ -1,255 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dnd.internal;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.RectangleFigure;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.editpolicies.GraphicalEditPolicy;
-import org.eclipse.jst.pagedesigner.dnd.FeedBackInfo;
-import org.eclipse.jst.pagedesigner.dnd.ILocalDropHandler;
-import org.eclipse.jst.pagedesigner.dnd.LocalDropRequest;
-import org.eclipse.jst.pagedesigner.dom.DOMPositionHelper;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.editpolicies.LocationHelper;
-import org.eclipse.jst.pagedesigner.parts.ElementEditPart;
-import org.eclipse.jst.pagedesigner.parts.NodeEditPart;
-import org.eclipse.jst.pagedesigner.tools.ExposeHelper;
-import org.eclipse.jst.pagedesigner.validation.caret.ActionData;
-import org.eclipse.jst.pagedesigner.validation.caret.DnDPositionValidator;
-import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
-import org.eclipse.jst.pagedesigner.viewer.EditPartPositionHelper;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Node;
-
-/**
- * This is the editpolicy to handle LocalSelectionDrop
- * 
- * @author mengbo
- */
-public class LocalDropEditPolicy extends GraphicalEditPolicy {
-	private RectangleFigure _feedbackFigure;
-
-	// indicate whether update is checked
-	private static boolean _checkUpdate = true;
-
-	/**
-	 * @param widgetEditPart
-	 * @param request
-	 * @param results
-	 * @return true if should update widget
-	 */
-	public boolean checkUpdateWidget(EditPart widgetEditPart,
-			LocalDropRequest request, Map results) {
-		if (!(widgetEditPart instanceof ElementEditPart)) {
-			return false;
-		}
-		Node widget = ((ElementEditPart) widgetEditPart).getIDOMNode();
-		ILocalDropHandler[] handlers = RegistryReader.getAllHandlers();
-		Object localData = request.getLocalObject();
-		for (int i = 0; i < handlers.length; i++) {
-			FeedBackInfo feedback = handlers[i].supportUpdateWidget(localData,
-					widget);
-			if (feedback != null) {
-				results.put(feedback, handlers[i]);
-			}
-		}
-		return !results.isEmpty();
-	}
-
-	/**
-	 * @param request
-	 * @param host
-	 * @param results
-	 * @param dpHolder
-	 * @param position
-	 * @return true if should insert element
-	 */
-	public boolean checkInsertElement(LocalDropRequest request,
-			EditPart[] host, Map results, DesignPosition[] dpHolder,
-			IDOMPosition[] position) {
-		DesignPosition designPosition = EditPartPositionHelper
-		    .findEditPartPosition(host[0], request.getLocation(),
-		        new DnDPositionValidator(new ActionData(
-		            ActionData.DATABINDING_DND, request)));
-		dpHolder[0] = designPosition;
-		if (designPosition == null) {
-			return false;
-		}
-
-		host[0] = designPosition.getContainerPart();
-		position[0] = DOMPositionHelper.toDOMPosition(designPosition);
-		ILocalDropHandler[] handlers = RegistryReader.getAllHandlers();
-		Object localData = request.getLocalObject();
-		for (int i = 0; i < handlers.length; i++) {
-			FeedBackInfo feedback = handlers[i].supportInsertElements(
-					localData, position[0]);
-			if (feedback != null) {
-				results.put(feedback, handlers[i]);
-			}
-		}
-		return !results.isEmpty();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editpolicies.AbstractEditPolicy#getTargetEditPart(org.eclipse.gef.Request)
-	 */
-	public EditPart getTargetEditPart(Request request) {
-		if (request instanceof LocalDropRequest) {
-			LocalDropRequest r = (LocalDropRequest) request;
-			EditPart host = getHost();
-			if (_checkUpdate && checkUpdateWidget(host, r, new HashMap())) {
-				return host;
-			}
-			EditPart[] hostHolder = new EditPart[] { host };
-			if (checkInsertElement(r, hostHolder, new HashMap(),
-					new DesignPosition[1], new IDOMPosition[1])) {
-				return hostHolder[0];
-			}
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editpolicies.AbstractEditPolicy#getCommand(org.eclipse.gef.Request)
-	 */
-	public Command getCommand(Request request) {
-		if (request instanceof LocalDropRequest) {
-			LocalDropRequest r = (LocalDropRequest) request;
-			EditPart host = getHost();
-
-			Map result = new HashMap();
-			if (_checkUpdate && checkUpdateWidget(host, r, result)) {
-				LocalDropCommand command = new LocalDropCommand(
-						getViewer(host), r.getLocalObject(), result);
-				command.setWidget(((NodeEditPart) host).getIDOMNode());
-				return command;
-			}
-			result.clear();
-
-			EditPart[] hostHolder = new EditPart[] { host };
-			IDOMPosition[] positionHolder = new IDOMPosition[1];
-			if (checkInsertElement(r, hostHolder, result,
-					new DesignPosition[1], positionHolder)) {
-				LocalDropCommand command = new LocalDropCommand(
-						getViewer(host), r.getLocalObject(), result);
-				command.setDOMPosition(positionHolder[0]);
-				return command;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * @param host
-	 * @return
-	 */
-	private IHTMLGraphicalViewer getViewer(EditPart host) {
-		return (IHTMLGraphicalViewer) ((GraphicalEditPart) host).getViewer();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editpolicies.AbstractEditPolicy#eraseTargetFeedback(org.eclipse.gef.Request)
-	 */
-	public void eraseTargetFeedback(Request request) {
-		if (_feedbackFigure != null) {
-			removeFeedback(_feedbackFigure);
-			_feedbackFigure = null;
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editpolicies.AbstractEditPolicy#showTargetFeedback(org.eclipse.gef.Request)
-	 */
-	public void showTargetFeedback(Request request) {
-		if (request instanceof LocalDropRequest) {
-			LocalDropRequest r = (LocalDropRequest) request;
-			EditPart host = getHost();
-			if (_checkUpdate && checkUpdateWidget(host, r, new HashMap())) {
-				Rectangle rect = LocationHelper
-						.getAbsoluteBounds((GraphicalEditPart) host);
-				showFeedbackRect(rect);
-				return;
-			}
-			EditPart[] hostHolder = new EditPart[] { host };
-			DesignPosition[] holder = new DesignPosition[1];
-			if (checkInsertElement(r, hostHolder, new HashMap(), holder,
-					new IDOMPosition[1])) {
-				Rectangle rect = EditPartPositionHelper
-						.convertToAbsoluteCaretRect(holder[0]);
-				showFeedbackRect(rect);
-				if (getHost() instanceof GraphicalEditPart) {
-					ExposeHelper exposeHelper = new ExposeHelper(
-							getViewer(getHost()));
-					exposeHelper.adjustVertical(r.getLocation());
-				}
-				return;
-			}
-		}
-	}
-
-	/**
-	 * @return the feedback figure
-	 */
-	protected RectangleFigure getFeedbackFigure() {
-		if (_feedbackFigure == null) {
-			_feedbackFigure = new RectangleFigure();
-			_feedbackFigure.setFill(true);
-			_feedbackFigure.setOutline(true);
-			_feedbackFigure.setLineWidth(1);
-			_feedbackFigure.setForegroundColor(ColorConstants.red);
-			_feedbackFigure.setBounds(new Rectangle(0, 0, 0, 0));
-			_feedbackFigure.setXOR(true);
-			addFeedback(_feedbackFigure);
-		}
-		return _feedbackFigure;
-	}
-
-	/**
-	 * @param rect
-	 */
-	protected void showFeedbackRect(Rectangle rect) {
-		RectangleFigure pf = getFeedbackFigure();
-		pf.translateToRelative(rect);
-		pf.setBounds(rect);
-	}
-
-	/**
-	 * @return Returns the _forUpdate.
-	 */
-	public static boolean isCheckUpdate() {
-		return _checkUpdate;
-	}
-
-	/**
-	 * @param update
-	 *            The _forUpdate to set.
-	 */
-	public static void setCheckUpdate(boolean update) {
-		_checkUpdate = update;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/LocalSelectionDropTargetListener.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/LocalSelectionDropTargetListener.java
deleted file mode 100644
index e09ff35..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/LocalSelectionDropTargetListener.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dnd.internal;
-
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.gef.EditPartViewer;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.dnd.AbstractTransferDropTargetListener;
-import org.eclipse.jface.util.LocalSelectionTransfer;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jst.jsf.common.ui.internal.guiutils.Alerts;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.dnd.LocalDropRequest;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.eclipse.swt.dnd.DND;
-import org.eclipse.swt.dnd.DropTargetEvent;
-
-
-/**
- * @author mengbo
- */
-public class LocalSelectionDropTargetListener extends
-		AbstractTransferDropTargetListener {
-	/**
-	 * @param viewer
-	 */
-	public LocalSelectionDropTargetListener(EditPartViewer viewer) {
-		super(viewer, LocalSelectionTransfer.getTransfer());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.dnd.AbstractTransferDropTargetListener#createTargetRequest()
-	 */
-	protected Request createTargetRequest() {
-		LocalDropRequest request = new LocalDropRequest();
-		request.setLocation(getDropLocation());
-		request.setLocalObject(getCurrentLocalObject());
-		return request;
-	}
-
-	/**
-	 * @return the current local object
-	 */
-	private Object getCurrentLocalObject() {
-		ISelection sel = LocalSelectionTransfer.getTransfer().getSelection();
-		if (sel instanceof IStructuredSelection) {
-			return ((IStructuredSelection) sel).getFirstElement();
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.dnd.AbstractTransferDropTargetListener#updateTargetRequest()
-	 */
-	protected void updateTargetRequest() {
-		LocalDropRequest dropRequest = (LocalDropRequest) getTargetRequest();
-		dropRequest.setLocation(getDropLocation());
-		dropRequest.setLocalObject(getCurrentLocalObject());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.dnd.AbstractTransferDropTargetListener#setCurrentEvent(org.eclipse.swt.dnd.DropTargetEvent)
-	 */
-	public void setCurrentEvent(DropTargetEvent currentEvent) {
-		super.setCurrentEvent(currentEvent);
-		if (currentEvent != null) {
-			if (currentEvent.detail != DND.DROP_NONE) {
-				currentEvent.detail = DND.DROP_COPY;
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.swt.dnd.DropTargetListener#dragOperationChanged(org.eclipse.swt.dnd.DropTargetEvent)
-	 */
-	public void dragOperationChanged(DropTargetEvent event) {
-		// switch the insert or update
-		if ((event.detail & (DND.DROP_COPY)) != 0) {
-			LocalDropEditPolicy.setCheckUpdate(false);
-		} else {
-			LocalDropEditPolicy.setCheckUpdate(true);
-		}
-		super.dragOperationChanged(event);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.swt.dnd.DropTargetListener#drop(org.eclipse.swt.dnd.DropTargetEvent)
-	 */
-	public void drop(DropTargetEvent event) {
-		String path = ((IHTMLGraphicalViewer) getViewer()).getModel()
-				.getBaseLocation();
-		IWorkspace workspace = ResourcesPlugin.getWorkspace();
-		IWorkspaceRoot root = workspace.getRoot();
-		IPath filePath = new Path(path);
-		if (root.getFile(filePath).exists()) {
-			getViewer().getControl().setFocus();
-			super.drop(event);
-			LocalDropEditPolicy.setCheckUpdate(true);
-		} else {
-			Alerts alert = PDPlugin.getAlerts();
-			alert.info("LocalSelectionDropTargetListener.MessageDialog.Title", //$NON-NLS-1$
-					"LocalSelectionDropTargetListener.MessageDialog.Message"); //$NON-NLS-1$
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/Messages.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/Messages.java
deleted file mode 100644
index f7baa6e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/Messages.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dnd.internal;
-
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-/**
- * A message bundle for dnd
- *
- */
-/*package*/ class Messages {
-	private static final String BUNDLE_NAME = "org.eclipse.jst.pagedesigner.dnd.internal.messages"; //$NON-NLS-1$
-
-	private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle
-			.getBundle(BUNDLE_NAME);
-
-	private Messages() {
-        // no external instantiation
-	}
-
-	/**
-	 * @param key
-	 * @return the message for key
-	 */
-	public static String getString(String key) {
-		try {
-			return RESOURCE_BUNDLE.getString(key);
-		} catch (MissingResourceException e) {
-			return '!' + key + '!';
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/PDTemplateTransferDropTargetListener.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/PDTemplateTransferDropTargetListener.java
deleted file mode 100644
index 8e85193..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/PDTemplateTransferDropTargetListener.java
+++ /dev/null
@@ -1,151 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dnd.internal;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.gef.EditPartViewer;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.dnd.AbstractTransferDropTargetListener;
-import org.eclipse.gef.dnd.TemplateTransfer;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.commands.CreateItemCommand;
-import org.eclipse.jst.pagedesigner.editors.palette.IDropSourceData;
-import org.eclipse.jst.pagedesigner.itemcreation.ItemCreationRequest;
-import org.eclipse.jst.pagedesigner.itemcreation.customizer.DropCustomizationController;
-import org.eclipse.swt.dnd.DND;
-import org.eclipse.swt.dnd.DropTargetEvent;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class PDTemplateTransferDropTargetListener extends
-		AbstractTransferDropTargetListener {
-
-	/**
-	 * @param viewer
-	 */
-	public PDTemplateTransferDropTargetListener(EditPartViewer viewer) {
-		super(viewer, TemplateTransfer.getInstance());
-	}
-
-	/**
-	 * @see org.eclipse.gef.dnd.AbstractTransferDropTargetListener#createTargetRequest()
-	 */
-	protected Request createTargetRequest() {
-		ItemCreationRequest request = new ItemCreationRequest();
-		/*TODO: nothing is done with this var.  Does the method have a side-effect? TagToolPaletteEntry tagItem =*/TemplateTransfer.getInstance().getTemplate();
-		return request;
-	}
-
-	/**
-	 * A helper method that casts the target Request to a CreateRequest.
-	 * 
-	 * @return CreateRequest
-	 */
-	protected final Request getCreateRequest() {
-		return getTargetRequest();
-	}
-
-	/**
-	 * The purpose of a template is to be copied. Therefore, the drop operation
-	 * can't be anything but <code>DND.DROP_COPY</code>.
-	 * 
-	 * @see AbstractTransferDropTargetListener#handleDragOperationChanged()
-	 */
-	protected void handleDragOperationChanged() {
-		getCurrentEvent().detail = DND.DROP_COPY;
-		super.handleDragOperationChanged();
-	}
-
-	/**
-	 * The purpose of a template is to be copied. Therefore, the Drop operation
-	 * is set to <code>DND.DROP_COPY</code> by default.
-	 * 
-	 * @see org.eclipse.gef.dnd.AbstractTransferDropTargetListener#handleDragOver()
-	 */
-	protected void handleDragOver() {
-		getCurrentEvent().detail = DND.DROP_COPY;
-		getCurrentEvent().feedback = DND.FEEDBACK_SCROLL | DND.FEEDBACK_EXPAND;
-		super.handleDragOver();
-	}
-
-	/**
-	 * Assumes that the target request is a {@link org.eclipse.gef.requests.CreateRequest}.
-	 */
-	protected void updateTargetRequest() {
-		// We should never see request that is not of ItemCreationRequest type,
-		// but there is an error case that Eclipse send out other types
-		// requests.
-		// Add this test to avoid potential error.
-		if (getCreateRequest() instanceof ItemCreationRequest) {
-			ItemCreationRequest request = (ItemCreationRequest) getCreateRequest();
-            Object transferObj = TemplateTransfer.getInstance().getObject();
-            
-            if (transferObj instanceof IDropSourceData)
-            {
-                request.setTagCreationProvider((IDropSourceData) transferObj);
-                request.setLocation(getDropLocation());
-            }
-            else
-            {
-                PDPlugin.getLogger(this.getClass()).error("Unexpected transfer object on palette drag:"+transferObj, new Throwable("Artificial throwable for stack tracing")); //$NON-NLS-1$ //$NON-NLS-2$
-            }
-		}
-	}
-
-	public void drop(DropTargetEvent event) {
-		if (getCreateRequest() instanceof ItemCreationRequest) {
-			getViewer().getControl().setFocus();
-			super.drop(event);
-		}
-	}
-
-    @Override
-    protected void handleDrop()
-    {
-        // copied from AbstractTransferDropListener and modified for drop 
-        // customization
-        updateTargetRequest();
-        updateTargetEditPart();
-
-        if (getTargetEditPart() != null) {
-            Command command = getCommand();
-            if (command != null && command.canExecute())
-                if (customizeAndCheckExecute(command))
-                {
-                    getViewer().getEditDomain().getCommandStack().execute(command);
-                }
-            else
-                getCurrentEvent().detail = DND.DROP_NONE;
-        } else
-            getCurrentEvent().detail = DND.DROP_NONE;
-    }
-
-    private boolean customizeAndCheckExecute(final Command command)
-    {
-        if (command instanceof CreateItemCommand)
-        {
-            final ItemCreationRequest request = (ItemCreationRequest) getCreateRequest();
-            final CreateItemCommand createCommand = (CreateItemCommand) command;
-            final IStatus status  = 
-                new DropCustomizationController(createCommand, request.getTagCreationProvider(), createCommand.getDocument(), createCommand.getPosition())
-                    .performCustomization();
-            
-            return status.getSeverity() == IStatus.OK;
-        }
-        // don't block a drop if the command is not customizable
-        return true;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/RegistryReader.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/RegistryReader.java
deleted file mode 100644
index 9b38e70..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/RegistryReader.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dnd.internal;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtension;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.pagedesigner.IJMTConstants;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.dnd.ILocalDropHandler;
-
-/**
- * Read the registry to find out all the LocalDropHandlers.
- * 
- * @author mengbo
- */
-public class RegistryReader {
-	final private static Logger _log = PDPlugin.getLogger(RegistryReader.class);
-
-	private static ILocalDropHandler[] _handlers = null;
-
-	/**
-	 * @return all registered drop handlers
-	 */
-	public static synchronized ILocalDropHandler[] getAllHandlers() {
-		if (_handlers == null) {
-			_handlers = readAllHandlers();
-		}
-		return _handlers;
-
-	}
-
-	private static ILocalDropHandler[] readAllHandlers() {
-		List result = new ArrayList();
-		IExtensionPoint extensionPoint = Platform.getExtensionRegistry()
-				.getExtensionPoint(PDPlugin.getPluginId(),
-						IJMTConstants.EXTENSION_POINT_PAGEDESIGNER);
-		IExtension[] extensions = extensionPoint.getExtensions();
-
-		for (int i = 0; i < extensions.length; i++) {
-			IExtension ext = extensions[i];
-			IConfigurationElement[] dropHandlers = ext
-					.getConfigurationElements();
-
-			for (int j = 0; j < dropHandlers.length; j++) {
-				if (dropHandlers[j].getName().equals(
-						IJMTConstants.LOCAL_DROP_HANDLER)) {
-					dropHandlers[j].getAttribute("class"); //$NON-NLS-1$
-					Object obj;
-					try {
-						obj = dropHandlers[j]
-								.createExecutableExtension("class"); //$NON-NLS-1$
-
-						if (obj instanceof ILocalDropHandler) {
-							result.add(obj);
-						}
-					} catch (CoreException e) {
-						_log.info("CoreException", e); //$NON-NLS-1$
-					}
-				}
-			}
-		}
-		ILocalDropHandler[] ret = new ILocalDropHandler[result.size()];
-		result.toArray(ret);
-		return ret;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/ResouceDropTargetListener.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/ResouceDropTargetListener.java
deleted file mode 100644
index 873c641..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/ResouceDropTargetListener.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dnd.internal;
-
-import org.eclipse.gef.EditPartViewer;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.dnd.AbstractTransferDropTargetListener;
-import org.eclipse.jst.pagedesigner.dnd.LocalDropRequest;
-import org.eclipse.swt.dnd.DND;
-import org.eclipse.swt.dnd.DropTargetEvent;
-import org.eclipse.swt.dnd.FileTransfer;
-
-/**
- * The drop target listener for DnD from Windows explorer.
- * 
- * @author mengbo
- * @version 1.5
- */
-public class ResouceDropTargetListener extends
-		AbstractTransferDropTargetListener {
-
-	/**
-	 * @param viewer
-	 */
-	public ResouceDropTargetListener(EditPartViewer viewer) {
-		super(viewer, FileTransfer.getInstance());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.dnd.AbstractTransferDropTargetListener#createTargetRequest()
-	 */
-	protected Request createTargetRequest() {
-		LocalDropRequest request = new LocalDropRequest();
-		request.setLocation(getDropLocation());
-		request.setLocalObject(getCurrentLocalObject());
-		return request;
-	}
-
-	private Object getCurrentLocalObject() {
-		Object result = null;
-		try {
-			Object data = ((FileTransfer) getTransfer())
-					.nativeToJava(getCurrentEvent().currentDataType);
-			if (data instanceof String[]) {
-				result = ((String[]) data)[0];
-			}
-		} catch (Exception e) {
-			// Don't know the tag type.
-		}
-		return result;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.dnd.AbstractTransferDropTargetListener#updateTargetRequest()
-	 */
-	protected void updateTargetRequest() {
-		LocalDropRequest dropRequest = (LocalDropRequest) getTargetRequest();
-		dropRequest.setLocation(getDropLocation());
-		dropRequest.setLocalObject(getCurrentLocalObject());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.dnd.AbstractTransferDropTargetListener#setCurrentEvent(org.eclipse.swt.dnd.DropTargetEvent)
-	 */
-	public void setCurrentEvent(DropTargetEvent currentEvent) {
-		super.setCurrentEvent(currentEvent);
-		if (currentEvent != null) {
-			if (currentEvent.detail != DND.DROP_NONE) {
-				currentEvent.detail = DND.DROP_COPY;
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.swt.dnd.DropTargetListener#dragOperationChanged(org.eclipse.swt.dnd.DropTargetEvent)
-	 */
-	public void dragOperationChanged(DropTargetEvent event) {
-		// switch the insert or update
-		if ((event.detail & (DND.DROP_COPY)) != 0) {
-			LocalDropEditPolicy.setCheckUpdate(false);
-		} else {
-			LocalDropEditPolicy.setCheckUpdate(true);
-		}
-		super.dragOperationChanged(event);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.swt.dnd.DropTargetListener#drop(org.eclipse.swt.dnd.DropTargetEvent)
-	 */
-	public void drop(DropTargetEvent event) {
-		getViewer().getControl().setFocus();
-		super.drop(event);
-		LocalDropEditPolicy.setCheckUpdate(true);
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/SimpleWizardSelectionPage.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/SimpleWizardSelectionPage.java
deleted file mode 100644
index c507c2a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/SimpleWizardSelectionPage.java
+++ /dev/null
@@ -1,274 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dnd.internal;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.viewers.DoubleClickEvent;
-import org.eclipse.jface.viewers.IDoubleClickListener;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.ListViewer;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerSorter;
-import org.eclipse.jface.wizard.IWizard;
-import org.eclipse.jface.wizard.IWizardNode;
-import org.eclipse.jface.wizard.WizardSelectionPage;
-import org.eclipse.jst.pagedesigner.dnd.FeedBackInfo;
-import org.eclipse.jst.pagedesigner.dnd.ILocalDropHandler;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.w3c.dom.Node;
-
-/**
- * UI wizard selection page. To let user select which ILocalDropHandler to use
- * to handle the drop.
- * 
- * @author mengbo
- */
-public class SimpleWizardSelectionPage extends WizardSelectionPage implements
-		ISelectionChangedListener {
-	private Object _localData;
-
-	private IHTMLGraphicalViewer _viewer;
-
-	private boolean _updateWidget;
-
-	private Node _widget;
-
-	private IDOMPosition _position;
-
-	/**
-	 * for those handler that support wizard, then map to WizardNode, otherwise
-	 * still map to the handler
-	 */
-	private Map _objToWizardNodeOrHandler = new HashMap();
-
-	private Map _feedbackToHandlers;
-
-	private Object _currentHandler = null; // IWizardNode or a
-
-	// ILocalDropHandler that don't
-	// useWizard.
-
-	/**
-	 * @param viewer 
-	 * @param localData 
-	 * @param handlers 
-	 */
-	public SimpleWizardSelectionPage(IHTMLGraphicalViewer viewer,
-			Object localData, Map handlers) {
-		super(Messages.getString("SimpleWizardSelectionPage.PageName")); //$NON-NLS-1$
-		this.setTitle(Messages.getString("SimpleWizardSelectionPage.Title")); //$NON-NLS-1$
-		this.setDescription(Messages
-				.getString("SimpleWizardSelectionPage.Description")); //$NON-NLS-1$
-		this
-				.setMessage(Messages
-						.getString("SimpleWizardSelectionPage.Message")); //$NON-NLS-1$
-
-		this._viewer = viewer;
-		this._localData = localData;
-		this._feedbackToHandlers = handlers;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
-	 */
-	public void createControl(Composite parent) {
-		Composite container = new Composite(parent, SWT.NONE);
-		GridLayout layout = new GridLayout();
-		layout.verticalSpacing = 10;
-		container.setLayout(layout);
-		container.setLayoutData(new GridData(GridData.FILL_BOTH));
-
-		Label label = new Label(container, SWT.NONE);
-		label
-				.setText(Messages
-						.getString("SimpleWizardSelectionPage.Operation")); //$NON-NLS-1$
-		GridData gd = new GridData();
-		label.setLayoutData(gd);
-
-		final ListViewer listViewer = new ListViewer(container);
-		listViewer.getControl().setLayoutData(new GridData(GridData.FILL_BOTH));
-
-		listViewer.setContentProvider(new IStructuredContentProvider() {
-			public Object[] getElements(Object inputElement) {
-				return ((List) inputElement).toArray();
-			}
-
-			public void dispose() {
-                // nothing to dispose
-			}
-
-			public void inputChanged(Viewer viewer, Object oldInput,
-					Object newInput) {
-                // no input changing
-			}
-		});
-		listViewer.setLabelProvider(new LabelProvider() {
-			public String getText(Object element) {
-				return SimpleWizardSelectionPage.this.getText(element);
-			}
-		});
-		listViewer.addDoubleClickListener(new IDoubleClickListener() {
-			public void doubleClick(DoubleClickEvent event) {
-				selectionChanged(new SelectionChangedEvent(listViewer,
-						listViewer.getSelection()));
-				advanceToNextPage();
-			}
-		});
-		listViewer.setSorter(new ViewerSorter());
-		listViewer.setInput(getElements());
-		listViewer.addSelectionChangedListener(this);
-		Dialog.applyDialogFont(container);
-		setControl(container);
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
-	 */
-	public void selectionChanged(SelectionChangedEvent event) {
-		ISelection sel = event.getSelection();
-		if (sel instanceof IStructuredSelection) {
-			Object obj = ((IStructuredSelection) sel).getFirstElement();
-			if (obj != null) {
-				_currentHandler = this._objToWizardNodeOrHandler.get(obj);
-				if (_currentHandler == null) {
-					_currentHandler = getWizardNodeOrHandler(obj);
-					this._objToWizardNodeOrHandler.put(obj, _currentHandler);
-				}
-
-				if (_currentHandler instanceof IWizardNode) {
-					this.setSelectedNode((IWizardNode) _currentHandler);
-				} else {
-					this.getWizard().getContainer().updateButtons();
-				}
-			}
-		}
-	}
-
-	/**
-	 * @param obj
-	 * @return
-	 */
-	private Object getWizardNodeOrHandler(Object obj) {
-		final ILocalDropHandler dropHandler = (ILocalDropHandler) _feedbackToHandlers
-				.get(obj);
-		if (dropHandler.useWizard(_localData, _viewer)) {
-			return new IWizardNode() {
-				IWizard _wizard = null;
-
-				public void dispose() {
-                    // nothing to dispose
-				}
-
-				public Point getExtent() {
-					return null;
-				}
-
-				public IWizard getWizard() {
-					if (_wizard == null) {
-						if (_updateWidget) {
-							_wizard = dropHandler.getWizard(_localData,
-									_widget, _viewer);
-						} else {
-							_wizard = dropHandler.getWizard(_localData,
-									_position, _viewer);
-						}
-					}
-					return _wizard;
-				}
-
-				public boolean isContentCreated() {
-					return _wizard != null;
-				}
-			};
-		}
-        return dropHandler;
-	}
-
-	/**
-	 * could be have next page or just directly perform the action.
-	 * 
-	 */
-	public void advanceToNextPage() {
-
-		getContainer().showPage(getNextPage());
-	}
-
-	/**
-	 * @param element
-	 * @return the text
-	 */
-	protected String getText(Object element) {
-		return ((FeedBackInfo) element).getDescription();
-	}
-
-	/**
-	 * @return the elements
-	 */
-	protected List getElements() {
-		return new ArrayList(this._feedbackToHandlers.keySet());
-	}
-
-	/**
-	 * @param widget
-	 */
-	public void setWidget(Node widget) {
-		_updateWidget = true;
-		_widget = widget;
-	}
-
-	/**
-	 * @param position
-	 */
-	public void setPosition(IDOMPosition position) {
-		_updateWidget = false;
-		_position = position;
-	}
-
-	/**
-	 * @return the current handler
-	 */
-	public Object getCurrentHandler() {
-		return _currentHandler;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.wizard.WizardSelectionPage#canFlipToNextPage()
-	 */
-	public boolean canFlipToNextPage() {
-		return getCurrentHandler() instanceof IWizardNode
-				&& super.canFlipToNextPage();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/SourceViewLocalDropCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/SourceViewLocalDropCommand.java
deleted file mode 100644
index b4e7fd4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/SourceViewLocalDropCommand.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dnd.internal;
-
-import org.eclipse.jst.pagedesigner.commands.SourceViewerCommand;
-import org.eclipse.jst.pagedesigner.editors.pagedesigner.PageDesignerResources;
-import org.eclipse.wst.sse.ui.StructuredTextEditor;
-
-/**
- * @author mengbo
- */
-public class SourceViewLocalDropCommand extends SourceViewerCommand {
-	/**
-	 * the map from feedback to ILocalDropHandler
-	 */
-	private int _location;
-
-	private StructuredTextEditor _textEditor;
-
-	private Object _data;
-
-	/**
-	 * @param textEditor 
-	 * @param data 
-	 * @param location 
-	 * 
-	 */
-	public SourceViewLocalDropCommand(StructuredTextEditor textEditor,
-			Object data, int location) {
-		super(PageDesignerResources.getInstance().getString(
-				"SourceViewLocalDropCommand.Label.InsertSyntax"), textEditor); //$NON-NLS-1$
-		_textEditor = textEditor;
-		_data = data;
-		_location = location;
-	}
-
-	public void doExecute() {
-		_textEditor.getTextViewer().getTextWidget().insert((String) _data);
-	}
-
-	public void setSelection() {
-		_textEditor.getTextViewer().setSelectedRange(_location,
-				((String) _data).length());
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/SourceViewerDragDropHelper.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/SourceViewerDragDropHelper.java
deleted file mode 100644
index dc44b11..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/SourceViewerDragDropHelper.java
+++ /dev/null
@@ -1,394 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dnd.internal;
-
-import org.eclipse.gef.SharedCursors;
-import org.eclipse.jface.text.BadLocationException;
-import org.eclipse.jface.text.IRegion;
-import org.eclipse.jface.text.TextViewer;
-import org.eclipse.jface.text.source.ISourceViewer;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.dom.EditValidateUtil;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.ST;
-import org.eclipse.swt.custom.StyledText;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Cursor;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.widgets.Caret;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
-import org.eclipse.wst.sse.ui.StructuredTextEditor;
-import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.ModelQuery;
-import org.eclipse.wst.xml.core.internal.modelquery.ModelQueryUtil;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-import org.w3c.dom.Document;
-import org.w3c.dom.Node;
-
-/**
- * This class will 1. determine it's insertion or update 2. call validator
- * corresponding helper to resolve it.
- * 
- * @author mengbo
- */
-public final class SourceViewerDragDropHelper {
-	private static SourceViewerDragDropHelper _instance;
-
-	/**
-	 * @return the singleton instance
-	 */
-	public static SourceViewerDragDropHelper getInstance() {
-		if (_instance == null) {
-			_instance = new SourceViewerDragDropHelper();
-		}
-		return _instance;
-	}
-
-	private SourceViewerDragDropHelper()
-	{
-	    // singleton, no external instantiation
-	}
-	
-	private Point toControl(TextViewer textViewer, Point point) {
-		return (textViewer != null ? textViewer.getTextWidget()
-				.toControl(point) : point);
-	}
-
-	private int getDropOffset(StructuredTextEditor ste, Point pt) {
-		StyledText st = ste.getTextViewer().getTextWidget();
-		int offset = st.getCaretOffset();
-		try {
-			offset = st.getOffsetAtLocation(pt);
-		} catch (IllegalArgumentException e) {
-			boolean found = false;
-			Point p = new Point((pt.x > 0 ? pt.x : 0), pt.y);
-			// search nearest character
-			for (; p.x > -1; p.x--) {
-				try {
-					offset = st.getOffsetAtLocation(p);
-
-					/*
-					 * Now that a valid offset has been found, try to place at
-					 * the end of the line
-					 */
-					if (ste.getTextViewer() != null
-							&& ste.getTextViewer().getDocument() != null) {
-						IRegion lineInfo = null;
-						try {
-							lineInfo = ste.getTextViewer().getDocument()
-									.getLineInformationOfOffset(offset);
-						} catch (BadLocationException e1) {
-                            // ignore exception and fall-through with lineInfo == null
-						}
-						if (lineInfo != null)
-							offset = lineInfo.getOffset()
-									+ lineInfo.getLength();
-					}
-
-					found = true;
-					break;
-				} catch (IllegalArgumentException ex) {
-					// for trying location, no need to catch.
-				}
-			}
-			if (!found) {
-				offset = st.getCharCount();
-			}
-		}
-		return offset;
-	}
-
-	/**
-	 * @param textEditor
-	 * @param location
-	 * @param caret
-	 */
-	public void updateCaret(StructuredTextEditor textEditor, Point location,
-			Point caret) {
-		TextViewer textViewer = textEditor.getTextViewer();
-		if (textViewer != null) {
-			Point pt = toControl(textViewer, location);
-			StyledText st = textViewer.getTextWidget();
-
-			// auto scroll
-			Rectangle ca = st.getClientArea();
-			int margin = st.getLineHeight();
-
-			if (pt.y < margin) { // up
-				st.invokeAction(ST.LINE_UP);
-			} else if (pt.y > ca.height - margin) { // down
-				st.invokeAction(ST.LINE_DOWN);
-			}
-
-			// draw insertion point
-			int offset = getDropOffset(textEditor, pt);
-			if (offset != st.getCaretOffset()) {
-				st.setCaretOffset(offset);
-				st.setSelection(offset);
-			}
-
-			Point newCaret = st.getLocationAtOffset(offset);
-			if (newCaret.equals(caret)) {
-				return;
-			}
-
-			Caret ct = st.getCaret();
-			Point size = ct.getSize();
-
-			GC gc = new GC(st);
-			//gc.setXORMode(true);
-			gc.setLineWidth(size.x);
-
-			// erase old caret
-			if (caret != null) {
-				Color originalForeground = gc.getForeground();
-				gc.setForeground(st.getBackground());
-				gc.drawLine(caret.x, caret.y, caret.x, caret.y + size.y);
-				gc.setForeground(originalForeground);
-			}
-
-			st.redraw();
-			st.update();
-
-			// draw new caret
-			if (caret == null) {
-				caret = newCaret;
-			} else {
-				caret.x = newCaret.x;
-				caret.y = newCaret.y;
-			}
-			if (ct.getImage() != null) {
-				gc.drawImage(ct.getImage(), caret.x, caret.y);
-			} else {
-				gc.drawLine(caret.x, caret.y, caret.x, caret.y + size.y);
-			}
-
-			gc.dispose();
-		}
-	}
-
-	/**
-	 * @param textEditor
-	 * @param location
-	 */
-	public void updateCaret(StructuredTextEditor textEditor, Point location) {
-		TextViewer textViewer = textEditor.getTextViewer();
-		if (textViewer != null) {
-			Point pt = toControl(textViewer, location);
-			StyledText st = textViewer.getTextWidget();
-
-			// auto scroll
-			Rectangle ca = st.getClientArea();
-			int margin = st.getLineHeight();
-
-			if (pt.y < margin) { // up
-				st.invokeAction(ST.LINE_UP);
-			} else if (pt.y > ca.height - margin) { // down
-				st.invokeAction(ST.LINE_DOWN);
-			}
-
-			// draw insertion point
-			int offset = getDropOffset(textEditor, pt);
-			if (offset != st.getCaretOffset()) {
-				st.setCaretOffset(offset);
-				st.setSelection(offset);
-			}
-		}
-	}
-
-	/**
-	 * @param textEditor
-	 * @param location
-	 * @return the caret offset
-	 */
-	public int showCaret(StructuredTextEditor textEditor, int location) {
-		StyledText text = textEditor.getTextViewer().getTextWidget();
-		text.setCursor(SharedCursors.CURSOR_TREE_ADD);
-		text.setCaretOffset(location);
-		if (!text.isFocusControl()) {
-			text.setFocus();
-		}
-		return text.getCaretOffset();
-	}
-
-	/**
-	 * @param node
-	 * @return the model query for the node or null if not available
-	 */
-	protected ModelQuery getModelQuery(Node node) {
-		if (node.getNodeType() == Node.DOCUMENT_NODE) {
-			return ModelQueryUtil.getModelQuery((Document) node);
-		}
-        return ModelQueryUtil.getModelQuery(node.getOwnerDocument());
-	}
-
-	/**
-	 * @param caretPos
-	 * @param element
-	 * @return the position 
-	 */
-	public IDOMPosition findPosition(int caretPos, Node element) {
-		EditValidateUtil.validNode(element);
-		IDOMPosition position = EditModelQuery.getInstance().createDomposition(
-				((IDOMNode) element).getModel(), caretPos, false);
-		return position;
-	}
-
-	/**
-	 * @param viewer
-	 * @param node
-	 */
-	public void format(TextViewer viewer, Node node) {
-		if (node == null) {
-			return;
-		}
-		Node tmp;
-		int start, offset;
-		if (node.getPreviousSibling() != null) {
-			tmp = node.getPreviousSibling();
-			start = ((IndexedRegion) tmp).getEndOffset();
-		} else {
-			tmp = node;
-			start = ((IndexedRegion) tmp).getStartOffset();
-		}
-		if (node.getNextSibling() != null) {
-			tmp = node.getNextSibling();
-			offset = ((IndexedRegion) tmp).getStartOffset() - start;
-		} else {
-			tmp = node;
-			offset = ((IndexedRegion) tmp).getEndOffset() - start;
-		}
-		viewer.setSelectedRange(start, offset);
-		viewer.doOperation(ISourceViewer.FORMAT);
-	}
-
-	/**
-	 * @param textEditor
-	 * @param reset
-	 */
-	public void changeCaret(StructuredTextEditor textEditor, boolean reset) {
-		if (reset) {
-			StyledText text = textEditor.getTextViewer().getTextWidget();
-			text.setCursor(new Cursor(null, SWT.CURSOR_IBEAM));
-		}
-	}
-
-	/**
-	 * @param textEditor
-	 * @param locationOffset
-	 * @return the location offset
-	 */
-	/*package*/ int getValidLocation(StructuredTextEditor textEditor,
-			int locationOffset) {
-		Node node = getCaretNode(textEditor, locationOffset);
-		if (node == null) {
-			// empty page?
-			return 0;
-		}
-		if (node.getNodeType() == Node.TEXT_NODE) {
-			return locationOffset;
-		}
-		return calculateCaretLocation(node, locationOffset);
-	}
-
-	/**
-	 * @param textEditor
-	 * @param location
-	 * @return the offset
-	 */
-	public int getOffset(StructuredTextEditor textEditor, Point location) {
-		StyledText text = textEditor.getTextViewer().getTextWidget();
-		return text.getOffsetAtLocation(location);
-	}
-
-	// private IStructuredModel getModel(StructuredTextEditor textEditor)
-	// {
-	// IStructuredModel model = null;
-	// if (textEditor.getDocumentProvider() != null)
-	// {
-	// if (textEditor.getDocumentProvider() instanceof IModelProvider)
-	// {
-	// model = ((IModelProvider)
-	// textEditor.getDocumentProvider()).getModel(textEditor.getEditorInput());
-	// }
-	// else
-	// {
-	// IDocument doc =
-	// textEditor.getDocumentProvider().getDocument(textEditor.getEditorInput());
-	// if (doc instanceof IDocument)
-	// {
-	// model =
-	// StructuredModelManager.getModelManager().getExistingModelForEdit(doc);
-	// if (model == null)
-	// {
-	// model =
-	// StructuredModelManager.getModelManager().getExistingModelForEdit((IDocument)
-	// doc);
-	// }
-	// }
-	// }
-	// }
-	// return model;
-	// }
-
-	/**
-	 * @param textEditor
-	 * @param pos
-	 * @return the node
-	 */
-	private Node getCaretNode(StructuredTextEditor textEditor, int pos) {
-        // TODO: getModel is deprecated
-		IStructuredModel model = textEditor.getModel();
-		// getModel(textEditor);
-		if (model == null) {
-			return null;
-		}
-		IndexedRegion inode = model.getIndexedRegion(pos);
-		if (inode == null) {
-			inode = model.getIndexedRegion(pos - 1);
-		}
-		return (inode instanceof Node) ? (Node) inode : null;
-	}
-
-	/**
-	 * Calculate and adjust the location in compare with Node.
-	 * 
-	 * @param node
-	 * @param location
-	 * @return the location
-	 */
-	public int calculateCaretLocation(Node node, int location) {
-		int pos[][] = new int[2][2];
-		pos[0][0] = EditModelQuery.getNodeStartIndex(node);
-		pos[0][1] = EditModelQuery.getNodeStartNameEndIndex(node);
-		pos[1][0] = EditModelQuery.getNodeEndNameStartIndex(node);
-		pos[1][1] = EditModelQuery.getNodeEndIndex(node);
-		if (pos[0][0] >= location || pos[1][0] == location
-				|| pos[1][1] <= location) {
-			return location;
-		} else if (pos[0][0] <= location && pos[0][1] >= location) {
-			if (((pos[0][1] + pos[0][0]) / 2) >= location) {
-				return pos[0][0];
-			}
-            return pos[0][1];
-		} else if (pos[1][0] <= location && pos[1][1] >= location) {
-			if (((pos[1][1] + pos[1][0]) / 2) >= location) {
-				return pos[1][0];
-			}
-            return pos[1][1];
-		}
-		return location;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/TextEditorDropTargetListenerFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/TextEditorDropTargetListenerFactory.java
deleted file mode 100644
index 538bb97..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/TextEditorDropTargetListenerFactory.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dnd.internal;
-
-import org.eclipse.core.runtime.IAdapterFactory;
-import org.eclipse.jst.pagedesigner.editors.DesignerStructuredTextEditorJSP;
-import org.eclipse.ui.texteditor.ITextEditorDropTargetListener;
-import org.eclipse.wst.sse.ui.StructuredTextEditor;
-
-/**
- * @author mengbo
- */
-public class TextEditorDropTargetListenerFactory implements IAdapterFactory {
-
-	/**
-	 * 
-	 */
-	public TextEditorDropTargetListenerFactory() {
-		super();
-		// TODO Auto-generated constructor stub
-	}
-
-	public Object getAdapter(Object adaptableObject, Class adapterType) {
-		if (ITextEditorDropTargetListener.class.equals(adapterType)) {
-			if (adaptableObject instanceof DesignerStructuredTextEditorJSP) {
-				DesignerSourceDropTargetListener listener = new DesignerSourceDropTargetListener(
-						(StructuredTextEditor) adaptableObject);
-				return listener;
-			}
-
-		}
-		return null;
-
-	}
-
-	public Class[] getAdapterList() {
-		Class[] classes = new Class[1];
-		classes[0] = ITextEditorDropTargetListener.class;
-		return classes;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/messages.properties b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/messages.properties
deleted file mode 100644
index 654d9ee..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/messages.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-DropSelectionWizard.Title=Drop Operation Handling
-SimpleWizardSelectionPage.PageName=Select Operation
-SimpleWizardSelectionPage.Title=Select Operation
-SimpleWizardSelectionPage.Description=Select Action
-SimpleWizardSelectionPage.Message=Select the operation you want to perform from the following list
-SimpleWizardSelectionPage.Operation=Operations:
-LocalDropCommand.DropHandler=Drop Handler
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/CaretMoveIterator.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/CaretMoveIterator.java
deleted file mode 100644
index 695c3f2..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/CaretMoveIterator.java
+++ /dev/null
@@ -1,271 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dom;
-
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.utils.HTMLUtil;
-import org.eclipse.jst.pagedesigner.validation.caret.IMovementMediator;
-import org.eclipse.jst.pagedesigner.validation.caret.Target;
-import org.w3c.dom.Node;
-import org.w3c.dom.Text;
-import org.w3c.dom.traversal.NodeIterator;
-
-/**
- * @author mengbo
- */
-public class CaretMoveIterator {
-	private final static Logger _log = PDPlugin
-			.getLogger(CaretMoveIterator.class);
-
-	private final boolean INNER_DEBUG = false;
-
-	private NodeIterator _nodeIterator;
-
-	private IMovementMediator _validator;
-
-	private IDOMPosition _currentPosition;
-
-	private boolean _forward;
-
-	/**
-	 * @param nodeIterator 
-	 * @param validator 
-	 * @param position 
-	 * @param forward 
-	 */
-	public CaretMoveIterator(NodeIterator nodeIterator,
-			IMovementMediator validator, IDOMPosition position, boolean forward) {
-		super();
-		_nodeIterator = nodeIterator;
-		_validator = validator;
-		_currentPosition = position;
-		_forward = forward;
-	}
-
-	/**
-	 * @return the node iterator
-	 */
-	public NodeIterator getNodeIterator() {
-		return _nodeIterator;
-	}
-
-	/**
-	 * @return Returns the _currentPosition.
-	 */
-	public IDOMPosition getCurrentPosition() {
-		return _currentPosition;
-	}
-
-	/**
-	 * @param position
-	 *            The _currentPosition to set.
-	 */
-	public void setCurrentPosition(IDOMPosition position) {
-		_currentPosition = position;
-	}
-
-	// assume the currentPosition is invalid
-	private IDOMPosition moveOut(Node container) {
-		IDOMPosition result = new DOMRefPosition(container, _forward);
-		String name = container.getNodeName();
-		if (name != null
-				&& EditModelQuery.HTML_STYLE_NODES.contains(name.toLowerCase())) {
-			result = moveToNextPosition(result, _validator);
-		}
-		return result;
-	}
-
-	/**
-	 * @param node
-	 * @return the dom position
-	 */
-	public IDOMPosition moveIn(Node node) {
-		IDOMPosition result = null;
-		if (INNER_DEBUG) {
-			_log.info("- Move into: " + node.getLocalName()); //$NON-NLS-1$
-		}
-		if (_validator.isEditable(new Target(node))) {
-			int index;
-			// Transparent text is not editable, so this is not transparent.
-			if (EditModelQuery.isText(node)) {
-				index = (_forward) ? 0 : ((Text) node).getData().length();
-				result = new DOMPosition(node, index);
-				// move ahead one pos.
-				IDOMPosition pos = getNextTextPosition(result);
-				if (pos != null) {
-					result = pos;
-				}
-			} else {
-				if (node.hasChildNodes()) {
-					index = _forward ? 0 : node.getChildNodes().getLength();
-					result = new DOMPosition(node, index); // DOMRefPosition(next,
-					// !_forward);
-				} else {
-					result = new DOMPosition(node, 0);
-				}
-			}
-		} else {
-			if (node.hasChildNodes()) {
-				Node child = _forward ? node.getFirstChild() : node
-						.getLastChild();
-				result = new DOMRefPosition(child, _forward);
-				while (child != null) {
-					if (_validator.allowsMoveIn(new Target(child))) {
-						result = moveIn(child);
-						break;
-					}
-					child = _forward ? child.getNextSibling() : child
-							.getPreviousSibling();
-				}
-			} else {
-				// Should be impposible to reach here.
-				result = new DOMPosition(node, 0);
-			}
-		}
-		return result;
-	}
-
-	private IDOMPosition getNextTextPosition(IDOMPosition position) {
-		IDOMPosition result = null;
-		String value = position.getContainerNode().getNodeValue();
-		int i = position.getOffset();
-		if (_forward) {
-			if (i < value.length()) {
-				if (HTMLUtil.isHTMLWhitespace(value.charAt(i))) {
-					while (i < value.length()
-							&& HTMLUtil.isHTMLWhitespace(value.charAt(i))) {
-						i++;
-					}
-					result = new DOMPosition(position.getContainerNode(), i);
-				} else if (i < value.length()) {
-					result = new DOMPosition(position.getContainerNode(), i + 1);
-				}
-			}
-		} else {
-			if (i > 0) {
-				if (HTMLUtil.isHTMLWhitespace(value.charAt(i - 1))) {
-					while (i > 0
-							&& HTMLUtil.isHTMLWhitespace(value.charAt(i - 1))) {
-						i--;
-					}
-					result = new DOMPosition(position.getContainerNode(), i);
-				} else if (i > 0) {
-					result = new DOMPosition(position.getContainerNode(), i - 1);
-				}
-			}
-		}
-		return result;
-	}
-
-	/**
-	 * Assume the original position are valid.
-	 * 
-	 * @param position
-	 * @param validator
-	 * @param _forward
-	 * @param referenceImediatly
-	 * @return
-	 */
-	private IDOMPosition moveToNextPosition(IDOMPosition position,
-			IMovementMediator validator) {
-		IDOMPosition currentPosition = null;
-		if (validator.isValidPosition(position) && position.isText()) {
-			currentPosition = getNextTextPosition(position);
-		}
-		if (currentPosition == null) {
-			Node nextNode = EditModelQuery.getInstance().getSibling(position,
-					_forward);
-			while (EditModelQuery.isText(nextNode)
-					&& ((Text) nextNode).getData().length() == 0) {
-				nextNode = EditModelQuery.getInstance().getSibling(nextNode,
-						_forward);
-			}
-			if (nextNode != null) {
-				// move in?
-				if (validator.allowsMoveIn(new Target(nextNode))) {
-					currentPosition = moveIn(nextNode);
-					// Stop when it is in table. For others we continue search
-					// for text.
-					if (!canStopHere(nextNode) && //
-							EditModelQuery.getInstance().getSibling(
-									currentPosition, _forward) != null) {
-						currentPosition = moveToNextPosition(currentPosition,
-								validator);
-					}
-				}
-				// not allowed to move in. e.g. it's empty string.
-				else {
-					currentPosition = new DOMRefPosition(nextNode, _forward);// skip(position);
-				}
-			} else {
-				if (validator.allowsMoveOut(new Target(
-						getNaviContainer(position)))) {
-					currentPosition = moveOut(getNaviContainer(position));
-				}
-			}
-		}
-		currentPosition = EditHelper.ensureDOMPosition(currentPosition);
-		if (currentPosition != null
-				&& !validator.isValidPosition(currentPosition)) {
-			currentPosition = moveToNextPosition(currentPosition, validator);
-		}
-		return currentPosition;
-	}
-
-	/**
-	 * When the tag starts from new line, or in table, then caret can be put at
-	 * 0 offset.
-	 * 
-	 * @param node
-	 * @return
-	 */
-	private boolean canStopHere(Node node) {
-		boolean result = false;
-		if (EditModelQuery.isText(node)) {
-			result = true;
-		} else if (node != null && node.getNodeName() != null) {
-			result |= node.getNodeName().equals(IHTMLConstants.TAG_TD);
-			result |= EditModelQuery.isBlockNode(node);
-		}
-		return result;
-	}
-
-	/**
-	 * Move operation position to next edit position. We may need rule to valid
-	 * it based on operation ID and direction. We need to pack transparent
-	 * string.
-	 * 
-	 * @param currentPosition
-	 * @param forward
-	 * @param validator
-	 * @return the dom position
-	 */
-	public IDOMPosition moveToNextEditPosition(IDOMPosition currentPosition,
-			boolean forward, IMovementMediator validator) {
-		IDOMPosition result = null;
-		if ((currentPosition = moveToNextPosition(currentPosition, validator)) != null) {
-			result = currentPosition;
-		} else {
-			result = _currentPosition;
-		}
-		return result;
-	}
-
-	private Node getNaviContainer(IDOMPosition position) {
-		if (position.isText()) {
-			return position.getContainerNode().getParentNode();
-		}
-        return position.getContainerNode();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/DOMPosition.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/DOMPosition.java
deleted file mode 100644
index 750b6de..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/DOMPosition.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dom;
-
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.w3c.dom.Text;
-
-/**
- * @author mengbo
- */
-public class DOMPosition implements IDOMPosition {
-	Node _containerNode;
-
-	int _offset;
-
-	/**
-	 * @param containerNode
-	 * @param offset
-	 */
-	public DOMPosition(Node containerNode, int offset) {
-		_containerNode = containerNode;
-		_offset = offset;
-	}
-
-	/**
-	 * this is the offset in the DOM tree. When parent node is text node, the
-	 * offset if the offset into the actual displayed data of the text node.
-	 * 
-	 * when parent is not text node, then the offset is the index in
-	 * getIDOMNode().getChildNodes()
-	 * 
-	 * @return the offset
-	 */
-	public int getOffset() {
-		return _offset;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.range.IDOMPosition#getNextSiblingNode()
-	 */
-	public Node getNextSiblingNode() {
-		if (isText())
-			return null;
-		NodeList children = _containerNode.getChildNodes();
-		int length = children.getLength();
-		if (_offset >= length || _offset < 0)
-			return null;
-        return children.item(_offset);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.range.IDOMPosition#getPreviousSiblingNode()
-	 */
-	public Node getPreviousSiblingNode() {
-		if (isText())
-			return null;
-		NodeList children = _containerNode.getChildNodes();
-		int length = children.getLength();
-		if (_offset > length || _offset <= 0)
-			return null;
-        return children.item(_offset - 1);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.range.IDOMPosition#getContainerNode()
-	 */
-	public Node getContainerNode() {
-		return _containerNode;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.range.IDOMPosition#isText()
-	 */
-	public boolean isText() {
-		return _containerNode instanceof Text;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.range.IDOMPosition#getSibling(boolean)
-	 */
-	public Node getSibling(boolean forward) {
-		if (forward)
-			return getNextSiblingNode();
-        return getPreviousSiblingNode();
-	}
-
-	public IDOMPosition handleReplacement(Node original, Node replacement) {
-		if (original == this._containerNode) {
-			return new DOMPosition(replacement, this._offset);
-		}
-        return this;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		return "DOMPosition: (" + _containerNode + " : " + _offset + ")"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/DOMPositionHelper.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/DOMPositionHelper.java
deleted file mode 100644
index d0e77f8..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/DOMPositionHelper.java
+++ /dev/null
@@ -1,395 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dom;
-
-import java.util.List;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.gef.EditPart;
-import org.eclipse.jst.pagedesigner.parts.NodeEditPart;
-import org.eclipse.jst.pagedesigner.parts.TextEditPart;
-import org.eclipse.jst.pagedesigner.utils.HTMLUtil;
-import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
-import org.eclipse.jst.pagedesigner.viewer.DesignRefPosition;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-import org.w3c.dom.Node;
-import org.w3c.dom.Text;
-
-/**
- * @author mengbo
- */
-public class DOMPositionHelper {
-	/**
-	 * @param position
-	 * @return the design position
-	 */
-	public static DesignPosition toDesignRefPosition(DOMRefPosition position) {
-		Node node = position.getReferenceNode();
-		do {
-			IDOMNode container = (IDOMNode) node.getParentNode();
-			EditPart part = (EditPart) container.getAdapterFor(EditPart.class);
-			if (part != null) {
-				// XXX: what if the node has not corresponding part?
-				EditPart child = DOMPositionHelper.findEditPart(part, node);
-				if (child != null) {
-					return new DesignRefPosition(child, position.isForward());
-				}
-                return DesignPosition.INVALID;
-			}
-            node = node.getParentNode();
-		} while (true);
-	}
-
-	/**
-	 * 
-	 * @param position
-	 *            if it is null, then will return null
-	 * @return null if position is null or invalid.
-	 */
-	public static DesignPosition toDesignPosition(IDOMPosition position) {
-		if (position == null) {
-			return null;
-		}
-		if (position instanceof DOMRefPosition) {
-			return toDesignRefPosition((DOMRefPosition) position);
-		}
-		do {
-			IDOMNode container = (IDOMNode) position.getContainerNode();
-			EditPart part = (EditPart) container.getAdapterFor(EditPart.class);
-			if (part != null) {
-				if (container instanceof Text) {
-					String textData = ((Text) container).getData();
-					String displayData = ((TextEditPart) part).getTextData();
-					return new DesignPosition(part,
-							textDataOffsetToDisplayOffset(textData,
-									displayData, position.getOffset()));
-				}
-                Node pre = position.getPreviousSiblingNode();
-                while (pre != null) {
-                	int index = findChildEditPartIndex(part, pre);
-                	if (index != -1) {
-                		return new DesignPosition(part, index + 1);
-                	}
-                	pre = pre.getPreviousSibling();
-                }
-                return new DesignPosition(part, 0);
-			}
-            position = new DOMRefPosition(position.getContainerNode(),
-            		false);
-		} while (true);
-	}
-
-	/**
-	 * Here is the position is not currect, currently it will returns invalid
-	 * pos.
-	 * 
-	 * @param position
-	 * @return the design position
-	 */
-	public static DesignPosition toDesignPosition1(IDOMPosition position) {
-		if (position instanceof DOMRefPosition) {
-			return toDesignRefPosition((DOMRefPosition) position);
-		}
-		do {
-			IDOMNode container = (IDOMNode) position.getContainerNode();
-			EditPart part = (EditPart) container.getAdapterFor(EditPart.class);
-			if (part != null) {
-				if (container instanceof Text) {
-					String textData = ((Text) container).getData();
-					String displayData = ((TextEditPart) part).getTextData();
-					return new DesignPosition(part,
-							textDataOffsetToDisplayOffset(textData,
-									displayData, position.getOffset()));
-				}
-                Node pre = position.getPreviousSiblingNode();
-                while (pre != null) {
-                	int index = findChildEditPartIndex(part, pre);
-                	if (index != -1) {
-                		return new DesignPosition(part, index + 1);
-                	}
-                	pre = pre.getPreviousSibling();
-                }
-                return new DesignPosition(part, 0);
-			}
-            return DesignPosition.INVALID;
-		} while (true);
-	}
-
-	static int findChildEditPartIndex(EditPart parent, Node node) {
-		List children = parent.getChildren();
-		for (int i = 0; i < children.size(); i++) {
-			if (((EditPart) children.get(i)).getModel() == node) {
-				return i;
-			}
-		}
-		return -1;
-	}
-
-	static EditPart findEditPart(EditPart parent, Node node) {
-		List children = parent.getChildren();
-		EditPart part;
-		for (int i = 0; i < children.size(); i++) {
-			if ((part = (EditPart) children.get(i)).getModel() == node) {
-				return part;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * convert a DesignPosition into DOMPosition.
-	 * 
-	 * @param position
-	 * @return the dom position
-	 */
-	public static IDOMPosition toDOMRefPosition(DesignRefPosition position) {
-		// ok, it is not text.
-		EditPart sibling = position.getRefPart();
-		if (sibling != null) {
-			return new DOMRefPosition((Node) sibling.getModel(), position
-					.caretIsAtRight());
-		}
-		// should never happens
-		Assert.isTrue(false);
-		return null;
-	}
-
-	/**
-	 * convert a DesignPosition into DOMPosition.
-	 * 
-	 * @param position
-	 * @return the dom position
-	 */
-	public static IDOMPosition toDOMPosition(DesignPosition position) {
-		if (!EditValidateUtil.validPosition(position)) {
-			return null;
-		} else if (position instanceof DesignRefPosition) {
-			return toDOMRefPosition((DesignRefPosition) position);
-		}
-		EditPart part = position.getContainerPart();
-		if (part instanceof TextEditPart) {
-			Text text = (Text) ((TextEditPart) part).getIDOMNode();
-			int offset = position.getOffset();
-			if (offset == 0) {
-				return new DOMPosition(text, 0);
-			}
-            String displayData = ((TextEditPart) part).getTextData();
-            String nodeData = text.getData();
-            if (offset >= displayData.length()) {
-            	// point to end of the text node.
-            	return new DOMPosition(text, nodeData.length());
-            }
-            // we need to calculate it out.
-            int index = displayOffsetToTextDataOffset(displayData,
-            		nodeData, offset);
-            return new DOMPosition(text, index);
-		}
-        // ok, it is not text.
-        EditPart sibling = position.getSiblingEditPart(true);
-        if (sibling instanceof NodeEditPart) {
-        	return new DOMRefPosition(((NodeEditPart) sibling).getDOMNode(), false);
-        }
-
-        sibling = position.getSiblingEditPart(false);
-        if (sibling instanceof NodeEditPart) {
-        	return new DOMRefPosition(((NodeEditPart) sibling).getDOMNode(), true);
-        }
-
-        // no previous sibling, no next sibling, the parent node must be
-        // empty
-        return new DOMPosition(((NodeEditPart) part).getDOMNode(), 0);
-	}
-
-	/**
-	 * if "position" is inside a text node, then split the text node and return
-	 * a new IDOMPosition semantically equal to the position in the two
-	 * splitted text. If the "position" is not a text position, then no action
-	 * will be taken and will return the original position.
-	 * 
-	 * @param position
-	 * @return IDOMPosition
-	 */
-	public static IDOMPosition splitText(IDOMPosition position) {
-		Node container = position.getContainerNode();
-		if (container instanceof Text) {
-			int offset = position.getOffset();
-			if (offset <= 0) {
-				// at beginning of text node. no need to split
-				return new DOMRefPosition(container, false);
-			}
-			String textData = ((Text) container).getData();
-			if (offset >= textData.length()) {
-				// at end of text node. no need to split
-				return new DOMRefPosition(container, true);
-			}
-			// ok, we need split
-			((Text) container).splitText(offset);
-			return new DOMRefPosition(container, true);
-		}
-        return position;
-	}
-
-	/**
-	 * Remove all the content in the range. And return the new position.
-	 * 
-	 * @param range
-	 * @return the dom position
-	 */
-	public static IDOMPosition removeRange(DOMRange range) {
-		boolean ordered = range.isOrdered();
-//		IDOMPosition start = ordered ? range.getStartPosition() : range
-//				.getEndPosition();
-		IDOMPosition end = ordered ? range.getEndPosition() : range
-				.getStartPosition();
-
-		// FIXME: Not DONE:
-		return end;
-	}
-
-	/**
-	 * try to merge the position in adjacent text node (if it is not already in)
-	 * 
-	 * @param position
-	 * @return the dom position
-	 */
-	public static IDOMPosition mergeIntoText(IDOMPosition position) {
-		if (position.getContainerNode() instanceof Text)
-			return position;
-		Node pre = position.getPreviousSiblingNode();
-		if (pre instanceof Text) {
-			return new DOMPosition(pre, ((Text) pre).getData().length());
-		}
-		Node after = position.getNextSiblingNode();
-		if (after instanceof Text) {
-			return new DOMPosition(after, 0);
-		}
-		return position;
-	}
-
-	/**
-	 * @param displayData
-	 * @param nodeData
-	 * @param offset
-	 * @return the offset
-	 */
-	// FIXME: this method is still buggy
-	public static int displayOffsetToTextDataOffset(String displayData,
-			String nodeData, int offset) {
-		char[] display = displayData.toCharArray();
-		if (offset >= display.length) {
-			// offset is already at end
-			return nodeData.length();
-		}
-		char[] node = nodeData.toCharArray();
-		int nodeDataLength = node.length;
-		int displayIndex = 0;
-		int nodeIndex = 0;
-
-		while (displayIndex < offset && nodeIndex < nodeDataLength) {
-			if (display[displayIndex] == node[nodeIndex]) {
-				displayIndex++;
-				nodeIndex++;
-				continue;
-			}
-			if (HTMLUtil.isHTMLWhitespace(node[nodeIndex])) {
-				if (HTMLUtil.isHTMLWhitespace(display[displayIndex])) {
-					displayIndex++;
-					nodeIndex++;
-				} else {
-					nodeIndex++;
-				}
-				continue;
-			}
-            // should not happen!
-            displayIndex++;
-            nodeIndex++;
-		}
-
-		if (nodeIndex >= nodeDataLength)
-			return nodeDataLength;
-		// else means displayIndex == offset
-		// since we already checked that offset < displayLength, so we can get
-		// the next char
-		if (display[offset] != ' ') {
-			// we may need to skip whitespaces after nodeIndex
-			while (nodeIndex < nodeDataLength
-					&& HTMLUtil.isHTMLWhitespace(node[nodeIndex])) {
-				nodeIndex++;
-			}
-		}
-		return nodeIndex;
-	}
-
-	/**
-	 * @param nodeData 
-	 * @param displayData
-	 * @param offset
-	 * @return the offset
-	 */
-	// FIXME: this method is still buggy
-	public static int textDataOffsetToDisplayOffset(String nodeData,
-			String displayData, int offset) {
-		if (offset >= nodeData.length()) {
-			return displayData.length();
-		}
-		char[] node = nodeData.toCharArray();
-		char[] display = displayData.toCharArray();
-
-		int displayIndex = 0;
-		int nodeIndex = 0;
-		int displayDataLength = display.length;
-
-		while (nodeIndex < offset && displayIndex < displayDataLength) {
-			if (display[displayIndex] == node[nodeIndex]) {
-				displayIndex++;
-				nodeIndex++;
-				continue;
-			}
-			if (HTMLUtil.isHTMLWhitespace(node[nodeIndex])) {
-				if (HTMLUtil.isHTMLWhitespace(display[displayIndex])) {
-					displayIndex++;
-					nodeIndex++;
-				} else {
-					nodeIndex++;
-				}
-				continue;
-			}
-            // should not happen!
-            displayIndex++;
-            nodeIndex++;
-		}
-		return displayIndex;
-	}
-
-	/**
-	 * Convert a IDOMPosition to IDOMRefPosition. If can't convert to
-	 * IDOMRefPosition, will return the original one.
-	 * 
-	 * @param position
-	 * @return IDOMPosition
-	 */
-	public static IDOMPosition toDOMRefPosition(IDOMPosition position) {
-		if (position.isText()) {
-			return position; // can't convert Text node.
-		}
-		if (position instanceof IDOMRefPosition) {
-			return position;
-		}
-		if (position.getNextSiblingNode() != null) {
-			return new DOMRefPosition(position.getNextSiblingNode(), false);
-		}
-		if (position.getPreviousSiblingNode() != null) {
-			return new DOMRefPosition(position.getPreviousSiblingNode(), true);
-		}
-        return new DOMRefPosition2(position.getContainerNode(), true);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/DOMRange.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/DOMRange.java
deleted file mode 100644
index f35dfda..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/DOMRange.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dom;
-
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public class DOMRange {
-	IDOMPosition _start;
-
-	IDOMPosition _end;
-
-	/**
-	 * @param p1
-	 * @param p2
-	 */
-	public DOMRange(IDOMPosition p1, IDOMPosition p2) {
-		_start = p1;
-		_end = p2;
-	}
-
-	/**
-	 * @return the start position
-	 */
-	public IDOMPosition getStartPosition() {
-		return _start;
-	}
-
-	/**
-	 * @return the end position
-	 */
-	public IDOMPosition getEndPosition() {
-		return _end;
-	}
-
-	/**
-	 * @return true if is empty
-	 */
-	public boolean isEmpty() {
-		return _start.getContainerNode() == _end.getContainerNode()
-				&& _start.getOffset() == _end.getOffset();
-	}
-
-	/**
-	 * @return true if is ordered
-	 */
-	public boolean isOrdered() {
-		Node common = DOMUtil.findCommonAncester(_start.getContainerNode(),
-				_end.getContainerNode());
-		if (common == null) {
-			return true;
-		}
-		IDOMPosition s = moveUp(_start, common);
-		IDOMPosition e = moveUp(_end, common);
-		return e.getOffset() >= s.getOffset();
-	}
-
-	private IDOMPosition moveUp(IDOMPosition p, Node ancester) {
-		while (p.getContainerNode() != ancester) {
-			p = new DOMRefPosition(p.getContainerNode(), false);
-		}
-		return p;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/DOMRangeHelper.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/DOMRangeHelper.java
deleted file mode 100644
index 1c7a33c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/DOMRangeHelper.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dom;
-
-import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public final class DOMRangeHelper {
-	/**
-	 * @param range
-	 * @return the dom range
-	 */
-	public static DOMRange toDOMRange(DesignRange range) {
-		if (range.getStartPosition() == range.getEndPosition()) {
-			IDOMPosition dp = DOMPositionHelper.toDOMPosition(range
-					.getStartPosition());
-			return new DOMRange(dp, dp);
-		}
-        return new DOMRange(DOMPositionHelper.toDOMPosition(range
-        		.getStartPosition()), DOMPositionHelper.toDOMPosition(range
-        		.getEndPosition()));
-	}
-
-	/**
-	 * @param range
-	 * @return the design range
-	 */
-	public static DesignRange toDesignRange(DOMRange range) {
-		if (range.getStartPosition() == range.getEndPosition()) {
-			DesignPosition dp = DOMPositionHelper.toDesignPosition(range
-					.getStartPosition());
-			return new DesignRange(dp, dp);
-		}
-		return new DesignRange(DOMPositionHelper.toDesignPosition(range
-				.getStartPosition()), DOMPositionHelper.toDesignPosition(range
-				.getEndPosition()));
-	}
-
-	/**
-	 * @param range
-	 * @param original
-	 * @param replacement
-	 * @return the dom range
-	 */
-	public static DOMRange handleReplacement(DOMRange range, Node original,
-			Node replacement) {
-		if (range.getStartPosition() == range.getEndPosition()) {
-			IDOMPosition pos = range.getStartPosition().handleReplacement(
-					original, replacement);
-			return new DOMRange(pos, pos);
-		}
-        return new DOMRange(range.getStartPosition().handleReplacement(
-        		original, replacement), range.getEndPosition()
-        		.handleReplacement(original, replacement));
-	}
-	
-	private DOMRangeHelper()
-	{
-	    // util class, no instantiation
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/DOMRefPosition.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/DOMRefPosition.java
deleted file mode 100644
index b94c8a6..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/DOMRefPosition.java
+++ /dev/null
@@ -1,145 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dom;
-
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-/**
- * DOMRefPosition is another way to identify a position in the document tree. It
- * has the advantage against the DOMPosition, that even something change in the
- * document, DOMRefPosition may still reference the correct position.
- * 
- * @author mengbo
- */
-public class DOMRefPosition implements IDOMRefPosition {
-	Node _refNode;
-
-	boolean _forward;
-
-	/**
-	 * @param refNode
-	 * @param forward
-	 *            true means the position after refNode. false means the
-	 *            position before refNode
-	 */
-	public DOMRefPosition(Node refNode, boolean forward) {
-		_refNode = refNode;
-		_forward = forward;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.range.IDOMPosition#getSibling(boolean)
-	 */
-	public Node getSibling(boolean forward) {
-		if (forward != _forward)
-        {
-		    return _refNode;
-        }
-		if (forward)
-        {
-			return _refNode.getNextSibling();
-        }
-        return _refNode.getPreviousSibling();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.range.IDOMPosition#getNextSiblingNode()
-	 */
-	public Node getNextSiblingNode() {
-		return getSibling(true);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.range.IDOMPosition#getPreviousSiblingNode()
-	 */
-	public Node getPreviousSiblingNode() {
-		return getSibling(false);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.range.IDOMPosition#getContainerNode()
-	 */
-	public Node getContainerNode() {
-		return _refNode.getParentNode();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.range.IDOMPosition#getOffset()
-	 */
-	public int getOffset() {
-		Node parent = _refNode.getParentNode();
-		if (parent == null) {
-			return _forward ? 1 : 0;
-		}
-        NodeList list = parent.getChildNodes();
-        for (int i = 0, n = list.getLength(); i < n; i++) {
-        	if (list.item(i) == _refNode) {
-        		return _forward ? (i + 1) : i;
-        	}
-        }
-        // should not happen.
-        return -1;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.range.IDOMPosition#isText()
-	 */
-	public boolean isText() {
-		return false;
-	}
-
-	public IDOMPosition handleReplacement(Node original, Node replacement) {
-		if (this._refNode == original) {
-			return new DOMRefPosition(replacement, this._forward);
-		}
-        return this;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		return "DOMRefPosition: (" + (_forward ? "after " : "before ") //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				+ _refNode + ")"; //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.dom.IDOMRefPosition#getReferenceNode()
-	 */
-	public Node getReferenceNode() {
-		return _refNode;
-	}
-
-	/**
-	 * @return true if is forward
-	 */
-	public boolean isForward() {
-		return _forward;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/DOMRefPosition2.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/DOMRefPosition2.java
deleted file mode 100644
index 3da9127..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/DOMRefPosition2.java
+++ /dev/null
@@ -1,125 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dom;
-
-import org.w3c.dom.Node;
-
-/**
- * This ref position use a parent node as reference. And provide whether this
- * location is at the beginning of its parent or last of its parent.
- * 
- * @author mengbo
- * @version 1.5
- */
-public class DOMRefPosition2 implements IDOMRefPosition {
-	Node _parentNode;
-
-	boolean _last;
-
-	/**
-	 * @param parent 
-	 * @param last 
-	 */
-	public DOMRefPosition2(Node parent, boolean last) {
-		_parentNode = parent;
-		_last = last;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.dom.IDOMRefPosition#getReferenceNode()
-	 */
-	public Node getReferenceNode() {
-		return _parentNode;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.dom.IDOMPosition#getSibling(boolean)
-	 */
-	public Node getSibling(boolean forward) {
-		if (forward) {
-			if (_last) {
-				return null;
-			}
-            return _parentNode.getFirstChild();
-		} else if (_last) {
-        	return _parentNode.getLastChild();
-        } else {
-        	return null;
-        }
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.dom.IDOMPosition#getNextSiblingNode()
-	 */
-	public Node getNextSiblingNode() {
-		return getSibling(true);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.dom.IDOMPosition#getPreviousSiblingNode()
-	 */
-	public Node getPreviousSiblingNode() {
-		return getSibling(false);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.dom.IDOMPosition#getContainerNode()
-	 */
-	public Node getContainerNode() {
-		return _parentNode;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.dom.IDOMPosition#getOffset()
-	 */
-	public int getOffset() {
-		if (!_last) {
-			return 0;
-		}
-        return _parentNode.getChildNodes().getLength();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.dom.IDOMPosition#isText()
-	 */
-	public boolean isText() {
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.dom.IDOMPosition#handleReplacement(org.w3c.dom.Node,
-	 *      org.w3c.dom.Node)
-	 */
-	public IDOMPosition handleReplacement(Node original, Node replacement) {
-		if (original == _parentNode) {
-			return new DOMRefPosition2(replacement, _last);
-		}
-        return this;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/DOMStyleUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/DOMStyleUtil.java
deleted file mode 100644
index 243f372..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/DOMStyleUtil.java
+++ /dev/null
@@ -1,182 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dom;
-
-import java.util.Iterator;
-import java.util.Map;
-import java.util.StringTokenizer;
-
-import org.eclipse.jst.jsf.core.internal.tld.CMUtil;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.w3c.dom.Element;
-import org.w3c.dom.css.CSSStyleDeclaration;
-import org.w3c.dom.css.ElementCSSInlineStyle;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public final class DOMStyleUtil {
-	/**
-	 * @param original
-	 * @param cssProperty
-	 * @return the inline style property
-	 */
-	public static String getInlineStyleProperty(Element original,
-			String cssProperty) {
-		if (original instanceof ElementCSSInlineStyle) {
-			CSSStyleDeclaration styledecl = ((ElementCSSInlineStyle) original)
-					.getStyle();
-			if (styledecl == null) {
-				if (original.getAttribute("style") == null) { //$NON-NLS-1$
-					return null;
-				}
-				// else mean it has style attribute.
-			}
-
-			if (styledecl != null) {
-				return styledecl.getPropertyValue(cssProperty);
-			}
-		}
-
-		// when we reach here, means we can't use the CSSStyleDeclaration API to
-		// get style, we'll take the
-		// pain to do the parsing and replacing.
-		// normally should not happen. But anyway, we need to have a fail safe
-		// path.
-
-		String oldstyle = original.getAttribute("style"); //$NON-NLS-1$
-		if (oldstyle == null || oldstyle.length() == 0) {
-			return null;
-		}
-		StringTokenizer tokenizer = new StringTokenizer(oldstyle, ";"); //$NON-NLS-1$
-
-		while (tokenizer.hasMoreTokens()) {
-			String token = tokenizer.nextToken().trim();
-			if (token.length() == 0) {
-				continue;
-			}
-			int index = token.indexOf(':');
-			if (index == -1) {
-				continue;
-			}
-			String propertyName = token.substring(0, index).trim();
-			if (cssProperty.equals(propertyName)) {
-				// ok, we found the property
-				return token.substring(index + 1).trim();
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * insert style into element
-	 * 
-	 * @param original
-	 * @param map
-	 */
-	public static void insertStyle(Element original, Map map) {
-		if (original instanceof ElementCSSInlineStyle) {
-			CSSStyleDeclaration styledecl = ((ElementCSSInlineStyle) original)
-					.getStyle();
-			if (styledecl == null) {
-				if (original.getAttribute("style") == null) { //$NON-NLS-1$
-					original.setAttribute("style", ""); //$NON-NLS-1$ //$NON-NLS-2$
-					styledecl = ((ElementCSSInlineStyle) original).getStyle();
-				}
-			}
-
-			if (styledecl != null) {
-				for (Iterator iter = map.keySet().iterator(); iter.hasNext();) {
-					String key = (String) iter.next();
-					String value = (String) map.get(key);
-					if (value == null) {
-						styledecl.removeProperty(key);
-					} else {
-						styledecl.setProperty(key, value, null);
-					}
-				}
-
-				return;
-			}
-		}
-
-		// when we reach here, means we can't use the CSSStyleDeclaration API to
-		// change style, we'll take the
-		// pain to do the parsing and replacing.
-		// normally should not happen. But anyway, we need to have a fail safe
-		// path.
-
-		String oldstyle = original.getAttribute("style"); //$NON-NLS-1$
-		if (oldstyle == null) {
-			oldstyle = ""; //$NON-NLS-1$
-		}
-		StringTokenizer tokenizer = new StringTokenizer(oldstyle, ";"); //$NON-NLS-1$
-
-		StringBuffer buffer = new StringBuffer();
-		while (tokenizer.hasMoreTokens()) {
-			String token = tokenizer.nextToken().trim();
-			if (token.length() == 0) {
-				continue;
-			}
-			int index = token.indexOf(':');
-			if (index == -1) {
-				// wrong property? ignore.
-				buffer.append(token).append("; "); //$NON-NLS-1$
-				continue;
-			}
-			String propertyName = token.substring(0, index).trim();
-
-			if (map.containsKey(propertyName)) {
-				String propertyValue = (String) map.remove(propertyName);
-				if (propertyValue == null) {
-					// we want to remove this css property. so don't append
-					// anything here
-				} else {
-					buffer.append(propertyName).append(": ").append( //$NON-NLS-1$
-							propertyValue).append("; "); //$NON-NLS-1$
-				}
-			} else {
-				buffer.append(token).append("; "); //$NON-NLS-1$
-			}
-		}
-		// ok, we have loop through existing properties and did replacement.
-		// now _styleProperties only contain those new CSS properties we need to
-		for (Iterator iter = map.keySet().iterator(); iter.hasNext();) {
-			String key = (String) iter.next();
-			String value = (String) map.get(key);
-			if (value != null) {
-				buffer.append(key).append(": ").append(value).append("; "); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-		}
-		original.setAttribute("style", buffer.toString()); //$NON-NLS-1$
-	}
-
-	/**
-	 * @param ele
-	 * @return true if supports the style attribute
-	 */
-	public static boolean supportStyleAttribute(IDOMElement ele) {
-		CMElementDeclaration decl = CMUtil.getElementDeclaration(ele);
-		if (decl != null && decl.getAttributes().getNamedItem("style") != null) { //$NON-NLS-1$
-			return true;
-		}
-        return false;
-	}
-	
-	private DOMStyleUtil()
-	{
-	    // util class, no external instantiation
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/DOMUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/DOMUtil.java
deleted file mode 100644
index c34e388..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/DOMUtil.java
+++ /dev/null
@@ -1,236 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dom;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMText;
-import org.w3c.dom.Attr;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.NamedNodeMap;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.w3c.dom.Text;
-
-/**
- * @author mengbo
- */
-public class DOMUtil {
-	private static Logger _logger = PDPlugin.getLogger(DOMUtil.class);
-
-	/**
-	 * Get a list of ancester nodes starting from the Document till the node.
-	 * 
-	 * @param node
-	 * @return
-	 */
-	private static List getAncesters(Node node) {
-		List list = new ArrayList();
-		while (node != null) {
-			list.add(node);
-			if (node instanceof Document) {
-				break;
-			}
-            node = node.getParentNode();
-		}
-		if (node == null) {
-			// if part ==null, means we didn't find a DocumentEditPart,
-			// something must be wrong.
-			return null;
-		}
-		// reverse to make it starting from the docuemnteditpart node.
-		Collections.reverse(list);
-		list.add(null); // add an null terminator.
-		return list;
-	}
-
-	/**
-	 * find the smallest common ancester of two edit part.
-	 * 
-	 * @param node1
-	 * @param node2
-	 * @return the common ancestor
-	 */
-	public static Node findCommonAncester(Node node1, Node node2) {
-		List list1 = getAncesters(node1);
-		if (list1 == null) {
-			return null;
-		}
-		List list2 = getAncesters(node2);
-		if (list2 == null) {
-			return null;
-		}
-		if (list1.get(0) != list2.get(0)) {
-			return null;
-		}
-		Node common = (Node) list1.get(0);
-		for (int i = 1;; i++) {
-			Node p1 = (Node) list1.get(i);
-			Node p2 = (Node) list2.get(i);
-			if (p1 == null || p2 == null) {
-				return common;
-			}
-			if (p1 != p2) {
-				return common;
-			}
-			common = p1;
-		}
-
-	}
-
-	/**
-	 * this method is almost same as <code>cloneNodeDeep()</code>. The
-	 * difference is that this method will try to ignore all kinds of error.
-	 * 
-	 * In SSE, if the document model enforce some kinds of validation, then the
-	 * clone may fail. During some cases, we want to ignore the validation
-	 * errors.
-	 * 
-	 * @param destDoc
-	 * @param sourceNode
-	 * @return the node
-	 */
-	public static Node cloneNodeDeepIgnoreError(Document destDoc,
-			Node sourceNode) {
-		switch (sourceNode.getNodeType()) {
-		case Node.ELEMENT_NODE:
-			Element sourceEle = (Element) sourceNode;
-			Element resultEle = destDoc.createElement(sourceEle.getTagName());
-			NamedNodeMap attrs = sourceEle.getAttributes();
-			for (int i = 0, size = attrs.getLength(); i < size; i++) {
-				Attr a = (Attr) attrs.item(i);
-				try {
-					resultEle.setAttribute(a.getName(), a.getValue());
-				} catch (Exception ex) {
-					// ignore
-					_logger.info("Exception", ex); //$NON-NLS-1$
-				}
-			}
-			NodeList children = sourceEle.getChildNodes();
-			for (int i = 0, size = children.getLength(); i < size; i++) {
-				Node n = children.item(i);
-				Node d = cloneNodeDeepIgnoreError(destDoc, n);
-				if (d != null) {
-					try {
-						resultEle.appendChild(d);
-					} catch (Exception ex) {
-						// ignore
-						_logger.info("Exception", ex); //$NON-NLS-1$
-					}
-				}
-			}
-			return resultEle;
-		case Node.TEXT_NODE:
-			Text txt = destDoc.createTextNode(sourceNode.getNodeValue());
-			if (txt instanceof IDOMText && sourceNode instanceof IDOMText) {
-				try {
-					((IDOMText) txt).setSource(((IDOMText) sourceNode)
-							.getSource());
-				} catch (Exception ex) {
-					// ignore
-				}
-			}
-			return txt;
-		case Node.CDATA_SECTION_NODE:
-			return destDoc.createCDATASection(sourceNode.getNodeValue());
-		default:
-			return null; // not support.
-		}
-	}
-
-	/**
-	 * @param destDoc
-	 * @param sourceNode
-	 * @return the node
-	 */
-	public static Node cloneNodeDeep(Document destDoc, Node sourceNode) {
-		switch (sourceNode.getNodeType()) {
-		case Node.ELEMENT_NODE:
-			Element sourceEle = (Element) sourceNode;
-			Element resultEle = destDoc.createElement(sourceEle.getTagName());
-			NamedNodeMap attrs = sourceEle.getAttributes();
-			for (int i = 0, size = attrs.getLength(); i < size; i++) {
-				Attr a = (Attr) attrs.item(i);
-				resultEle.setAttribute(a.getName(), a.getValue());
-			}
-			NodeList children = sourceEle.getChildNodes();
-			for (int i = 0, size = children.getLength(); i < size; i++) {
-				Node n = children.item(i);
-				Node d = cloneNodeDeep(destDoc, n);
-				if (d != null) {
-					resultEle.appendChild(d);
-				}
-			}
-			return resultEle;
-		case Node.TEXT_NODE:
-			Text txt = destDoc.createTextNode(sourceNode.getNodeValue());
-			if (txt instanceof IDOMText && sourceNode instanceof IDOMText) {
-				try {
-					((IDOMText) txt).setSource(((IDOMText) sourceNode)
-							.getSource());
-				} catch (Exception ex) {
-					// ignore
-					_logger.info("Exception", ex); //$NON-NLS-1$
-				}
-			}
-			return txt;
-		case Node.CDATA_SECTION_NODE:
-			return destDoc.createCDATASection(sourceNode.getNodeValue());
-		default:
-			return null; // not support.
-		}
-	}
-
-	/**
-	 * check whether the ancester relationship exist for the two nodes.
-	 * 
-	 * @param ancester
-	 * @param child
-	 * @return true if ancester is an ancestor of child
-	 */
-	public static boolean isAncester(Node ancester, Node child) {
-		while (child != null) {
-			if (child == ancester) {
-				return true;
-			}
-			child = child.getParentNode();
-		}
-		return false;
-	}
-
-	/**
-	 * insert the node at specified position.
-	 * 
-	 * @param domPosition 
-	 * @param node 
-	 * @return null if fail, otherwise return the inserted node.
-	 */
-	public static Node insertNode(IDOMPosition domPosition, Node node) {
-		IDOMPosition position = DOMPositionHelper.splitText(domPosition);
-		if (position == null || position.getContainerNode() == null) {
-			return null;
-		}
-		if (position.getNextSiblingNode() == null) {
-			position.getContainerNode().appendChild(node);
-		} else {
-			position.getContainerNode().insertBefore(node,
-					position.getNextSiblingNode());
-		}
-
-		return node;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/EditHelper.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/EditHelper.java
deleted file mode 100644
index 72f763a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/EditHelper.java
+++ /dev/null
@@ -1,504 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dom;
-
-import java.util.List;
-import java.util.Stack;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.gef.EditPart;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.commands.range.WorkNode;
-import org.eclipse.jst.pagedesigner.parts.TextEditPart;
-import org.eclipse.jst.pagedesigner.utils.HTMLUtil;
-import org.eclipse.jst.pagedesigner.validation.caret.ActionData;
-import org.eclipse.jst.pagedesigner.validation.caret.IMovementMediator;
-import org.eclipse.jst.pagedesigner.validation.caret.InlineEditingNavigationMediator;
-import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
-import org.eclipse.jst.pagedesigner.viewer.DesignRefPosition;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.w3c.dom.Text;
-
-/**
- * @author mengbo
- */
-public class EditHelper {
-//	public final static boolean INNER_DEBUG = false;
-
-	private final static int OUT_OF_LEFT = 1;
-
-	private final static int LEFT_NAME = 2;
-
-	/**
-	 * indicates a position in the middle
-	 */
-	public final static int IN_MIDDLE = 3;
-
-	private final static int RIGHT_NAME = 4;
-
-	private final static int OUT_OF_RIGHT = 5;
-
-	private static final EditHelper _instance = new EditHelper();
-
-	//private static Logger _log = PDPlugin.getLogger(EditHelper.class);
-
-	private EditHelper() {
-        //  no external instantiation
-	}
-
-	/**
-	 * Move operation position in front of next non-blank and non-transparent
-	 * char. The caller should ensure position's container node is not
-	 * transparent text node.
-	 * 
-	 * @param position
-	 * @param forward
-	 * @param forEmpty
-	 * @return the offset
-	 */
-	public int getTextNextOffset(IDOMPosition position, boolean forward,
-			boolean forEmpty) {
-		EditValidateUtil.validPosition(position);
-		Assert.isTrue(!EditModelQuery.isTransparentText(position
-				.getContainerNode()));
-		Text text = (Text) position.getContainerNode();
-		int offset = position.getOffset();
-		String data = text.getNodeValue();
-		if (forward) {
-			while (offset < data.length()
-					&& HTMLUtil.isHTMLWhitespace(data.charAt(offset))) {
-				offset++;
-			}
-		} else {
-			while (offset > 0
-					&& HTMLUtil.isHTMLWhitespace(data.charAt(offset - 1))) {
-				offset--;
-			}
-		}
-		return offset;
-
-	}
-
-	/**
-	 * @return the singleton instance
-	 */
-	public static EditHelper getInstance() {
-		return _instance;
-	}
-
-	/**
-	 * This caret from current operation position to next position, this method
-	 * will convert DesignPosition in to DOMPosition, then call dom function to
-	 * move dom position. Here we might insert some complex rules to see whether
-	 * move is valid.
-	 * 
-	 * @param action
-	 * @param currentPosition
-	 * @param forward
-	 * @return the dom position
-	 */
-	public static DesignPosition moveToNextEditPosition(int action,
-			DesignPosition currentPosition, boolean forward) {
-		IDOMPosition position;
-		position = DOMPositionHelper.toDOMPosition(currentPosition);
-		position = moveToNextEditPosition(position, forward,
-				new InlineEditingNavigationMediator(
-						new ActionData(action, null)));
-		if (position == null) {
-			return currentPosition;
-		}
-
-		EditValidateUtil.validPosition(position);
-		return DOMPositionHelper.toDesignPosition(position);
-	}
-
-	/**
-	 * Move operation position to next edit position. We may need rule to valid
-	 * it based on operation ID and direction. We need to pack transparent
-	 * string.
-	 * 
-	 * @param currentPosition
-	 * @param forward
-	 * @param validator
-	 * @return the dom position
-	 */
-	public static IDOMPosition moveToNextEditPosition(
-			IDOMPosition currentPosition, boolean forward,
-			IMovementMediator validator) {
-		IDOMPosition result = null;
-		CaretMoveIterator moveIterator = new CaretMoveIterator(null, validator,
-				currentPosition, forward);
-		if ((result = moveIterator.moveToNextEditPosition(currentPosition,
-				forward, validator)) == null) {
-			result = currentPosition;
-		}
-		return result;
-	}
-
-	/**
-	 * Delete a node, in case it is 'body' or 'html', it won't perform delete.
-	 * 
-	 * @param node
-	 * @return the node
-	 */
-	public static Node deleteNode(Node node) {
-		if (node == null || node.getNodeName() == null) {
-			return null;
-		}
-		String name = node.getLocalName();
-
-		if (name != null
-				&& (name.equalsIgnoreCase(IHTMLConstants.TAG_BODY)
-						|| name.equalsIgnoreCase(IHTMLConstants.TAG_HEAD)
-						|| name.equalsIgnoreCase(IHTMLConstants.TAG_HTML))) {
-			return null;
-		}
-		Node parent = node.getParentNode();
-		name = parent.getNodeName();
-		if (parent != null
-				&& name != null
-				&& parent.getNodeName().equalsIgnoreCase(
-						IHTMLConstants.TAG_HEAD)) {
-			return null;
-		}
-		return parent.removeChild(node);
-	}
-
-	/**
-	 * Order the IDOMPositions in a range in ascending order.
-	 * 
-	 * @param range
-	 * @return the dom range
-	 */
-	public static DOMRange normal(DOMRange range) {
-		EditValidateUtil.validRange(range);
-		IDOMPosition p1 = range.getStartPosition();
-		IDOMPosition p2 = range.getEndPosition();
-		if (EditModelQuery.getIndexedRegionLocation(p1) > EditModelQuery
-				.getIndexedRegionLocation(p2)) {
-			return new DOMRange(p2, p1);
-		}
-        return range;
-	}
-
-	/**
-	 * Move position in to node from its outside, the node should be breakble.
-	 * 
-	 * @param node
-	 * @param validator 
-	 * @param forward
-	 * @return the dom position
-	 */
-	public static IDOMPosition moveInto(Node node, IMovementMediator validator,
-			boolean forward) {
-		CaretMoveIterator moveIterator = new CaretMoveIterator(null, validator,
-				new DOMRefPosition(node, !forward), forward);
-		return moveIterator.moveIn(node);
-	}
-
-	/**
-	 * Convert a DomRefPosition into DOMPosition.
-	 * 
-	 * @param position
-	 * @return the dom position
-	 */
-	public static IDOMPosition ensureDOMPosition(IDOMPosition position) {
-		if (position instanceof DOMRefPosition) {
-			return new DOMPosition(position.getContainerNode(), position
-					.getOffset());
-		}
-		return position;
-	}
-
-	/**
-	 * @param currentNode
-	 * @param pos1
-	 * @param pos2
-	 * @param top
-	 * @param workNode
-	 */
-	public void processText(Text currentNode, final int pos1, final int pos2,
-			Node top, Stack workNode) {
-		// the text could be tranparent, or 0 length.
-		Assert.isTrue(pos1 <= pos2);
-		if (pos1 == pos2) {
-			return;
-		}
-		// int left = EditModelQuery.getNodeStartIndex(currentNode);
-		// int right = EditModelQuery.getNodeEndIndex(currentNode);
-		int location1 = getLocation(currentNode, pos1, false);
-		int location2 = getLocation(currentNode, pos2, false);
-		if (location1 <= IN_MIDDLE && location2 >= IN_MIDDLE) {
-			workNode.push(new WorkNode(currentNode, pos1, pos2));
-		}
-	}
-
-	/**
-	 * @param currentNode
-	 * @param pos1
-	 * @param pos2
-	 * @param top
-	 * @param result
-	 */
-	public void collectNodes(Node currentNode, final int pos1, final int pos2,
-			Node top, Stack result) {
-		Assert.isTrue(pos1 <= pos2);
-		if (pos1 == pos2) {
-			return;
-		}
-		if (EditModelQuery.isText(currentNode)) {
-			processText((Text) currentNode, pos1, pos2, top, result);
-		} else {
-			int location1 = getLocation(currentNode, pos1, false);
-			int location2 = getLocation(currentNode, pos2, false);
-			if (location1 < IN_MIDDLE && location2 > IN_MIDDLE) {
-				// TODO: push the node into result.--
-				result.push(new WorkNode(currentNode, pos1, pos2));
-			} else if (location1 <= IN_MIDDLE && location2 >= IN_MIDDLE) {
-				if (currentNode.hasChildNodes()) {
-					Node child = currentNode.getFirstChild();
-					Stack myResult = new Stack();
-					while (child != null) {
-						collectNodes(child, pos1, pos2, top, myResult);
-						child = child.getNextSibling();
-					}
-					if (location1 < IN_MIDDLE && location2 >= IN_MIDDLE
-							|| location1 <= IN_MIDDLE && location2 > IN_MIDDLE) {
-						WorkNode workNode = new WorkNode(currentNode, pos1,
-								pos2);
-						while (myResult.size() > 0) {
-							WorkNode w = (WorkNode) myResult.remove(0);
-							if (w.getNode().getParentNode() == workNode
-									.getNode()) {
-								w.setParent(workNode);
-							}
-							result.push(w);
-						}
-						// TODO: push parent into result.--
-						result.push(workNode);
-					}
-				} else {
-					if (!(location1 == IN_MIDDLE && location2 == IN_MIDDLE)) {
-						// TODO: push this node into result.
-						result.push(new WorkNode(currentNode, pos1, pos2));
-					}
-				}
-			}
-		}
-	}
-
-	/**
-	 * @param currentNode
-	 * @param pos
-	 * @param isOffset
-	 * @return the location
-	 */
-	public int getLocation(Node currentNode, int pos, boolean isOffset) {
-		if (EditModelQuery.getInstance().isSingleRegionNode(currentNode)) {
-			// if (EditModelQuery.isText(currentNode))
-			{
-
-				int left = EditModelQuery.getNodeStartIndex(currentNode);
-				int right = EditModelQuery.getNodeEndIndex(currentNode);
-				if (isOffset) {
-					pos += left;
-				}
-				if (pos <= left) {
-					return OUT_OF_LEFT;
-				} else if (left < pos && pos < right) {
-					return IN_MIDDLE;
-				} else {
-					return OUT_OF_RIGHT;
-				}
-			}
-		}
-        int left = EditModelQuery.getNodeStartIndex(currentNode);
-        int left1 = EditModelQuery.getNodeStartNameEndIndex(currentNode);
-        int right = EditModelQuery.getNodeEndNameStartIndex(currentNode);
-        int right1 = EditModelQuery.getNodeEndIndex(currentNode);
-        if (isOffset) {
-        	pos += left;
-        }
-        if (pos <= left) {
-        	return OUT_OF_LEFT;
-        } else if (left < pos && pos < left1) {
-        	return LEFT_NAME;
-        } else if (left1 <= pos && pos <= right) {
-        	return IN_MIDDLE;
-        } else if (right < pos && pos < right1) {
-        	return RIGHT_NAME;
-        } else {
-        	return OUT_OF_RIGHT;
-        }
-
-	}
-
-    // TODO: dead?
-//	private Node cutCurrentNode(int pos[], Node currentNode,
-//			IDOMPosition position) {
-//		// at right edge
-//		int curpos = EditModelQuery.getIndexedRegionLocation(position);
-//		if (pos[0] <= curpos) {
-//			pos[1] = EditModelQuery.getNodeStartIndex(currentNode);
-//			currentNode = deleteNode(currentNode);
-//			if (INNER_DEBUG) {
-//				_log.info("cut:" + currentNode);
-//			}
-//			return currentNode;
-//		} else if (pos[1] >= curpos) {
-//			pos[0] = EditModelQuery.getNodeEndIndex(currentNode);
-//			currentNode = deleteNode(currentNode);
-//			if (INNER_DEBUG) {
-//				_log.info("cut:" + currentNode);
-//			}
-//			return currentNode;
-//		}
-//		return null;
-//	}
-
-    //TODO: dead?
-//	private int getPos(DOMRange range, boolean forStart) {
-//		if (forStart) {
-//			return EditModelQuery.getIndexedRegionLocation(range
-//					.getStartPosition());
-//		} else {
-//			return EditModelQuery.getIndexedRegionLocation(range
-//					.getEndPosition());
-//		}
-//	}
-
-	/**
-	 * @param position
-	 * @param forward
-	 * @return the edit part for position
-	 */
-	public EditPart getEditPart(DesignPosition position, boolean forward) {
-		if (position instanceof DesignRefPosition) {
-			return ((DesignRefPosition) position).getRefPart();
-		}
-		EditPart container = position.getContainerPart();
-		if (container instanceof TextEditPart) {
-			return container;
-		}
-		if (container != null) {
-			List children = container.getChildren();
-			for (int i = 0, n = children.size(); i < n; i++) {
-				if (i == position.getOffset()) {
-					int index = (forward) ? i - 1 : i + 1;
-					if (index < 0) {
-						index = 0;
-					}
-					if (index >= children.size()) {
-						index = children.size() - 1;
-					}
-
-					return (EditPart) children.get(index);
-				}
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * @param position
-	 * @return the resulting dom position
-	 */
-	public static IDOMPosition splitNode(IDOMPosition position) {
-		if (EditValidateUtil.validPosition(position)) {
-			Node container = null;
-			// Avoid to split tag at its edge
-			if (position.getOffset() > 0) {
-				if (position.isText()) {
-					container = position.getContainerNode();
-					if (position.getOffset() < ((Text) container).getLength()) {
-						position = DOMPositionHelper.splitText(position);
-					} else {
-						// position = new
-						// DOMRefPosition(position.getContainerNode(), true);
-					}
-				} else {
-					if (position.getNextSiblingNode() != null) {
-						container = position.getContainerNode();
-						Node parent = container.getParentNode();
-
-						Document document = EditModelQuery
-								.getDocumentNode(container);
-						Node newContainer = document.createElement(container
-								.getNodeName());
-						Node node = position.getPreviousSiblingNode();
-						Node refNode = null;
-						while (node != null) {
-							Node prev = node.getPreviousSibling();
-							node = node.getParentNode().removeChild(node);
-
-							newContainer.insertBefore(node, refNode);
-							refNode = node;
-							node = prev;
-						}
-						parent.insertBefore(newContainer, container);
-						// set the newContainer node align attribute to the
-						// original align attribue
-						// copy nodes under container node to container node's
-						// parent node
-						if (container.getNodeName().equalsIgnoreCase(
-								IHTMLConstants.TAG_P)) {
-							Element pNode = (Element) container;
-							String align = pNode
-									.getAttribute(IHTMLConstants.ATTR_ALIGN);
-							if (align != null && !"".equalsIgnoreCase(align)) { //$NON-NLS-1$
-								((Element) newContainer).setAttribute(
-										IHTMLConstants.ATTR_ALIGN, align);
-							}
-							NodeList nodeList = pNode.getChildNodes();
-							for (int i = 0, size = nodeList.getLength(); i < size; i++) {
-								Node tempNode = nodeList.item(i);
-								parent.insertBefore(tempNode, container);
-							}
-						}
-						return new DOMRefPosition(newContainer, true);
-					}
-//                    position = new
-//                    DOMRefPosition(position.getContainerNode(), true);
-				}
-			} else {
-				// container = position.getContainerNode();
-				// position = new DOMRefPosition(container, false);
-			}
-		}
-		return position;
-	}
-
-	/**
-	 * @param position 
-	 * @return the position of this 'position' in relative to it's container.
-	 */
-	public static int getLocation(IDOMPosition position) {
-		if (position.getOffset() == 0) {
-			return -1;
-		}
-        if (position.isText()) {
-        	if (position.getOffset() == ((Text) position.getContainerNode())
-        			.getLength()) {
-        		return 1;
-        	}
-            return 0;
-        }
-        if (position.getOffset() == position.getContainerNode()
-        		.getChildNodes().getLength()) {
-        	return 1;
-        }
-        return 0;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/EditModelQuery.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/EditModelQuery.java
deleted file mode 100644
index acbc7a7..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/EditModelQuery.java
+++ /dev/null
@@ -1,1816 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dom;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Vector;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.gef.EditPart;
-import org.eclipse.jface.text.TextSelection;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.parts.ElementEditPart;
-import org.eclipse.jst.pagedesigner.parts.HTMLEditPartsFactory;
-import org.eclipse.jst.pagedesigner.parts.NodeEditPart;
-import org.eclipse.jst.pagedesigner.utils.HTMLUtil;
-import org.eclipse.jst.pagedesigner.validation.caret.Target;
-import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-import org.eclipse.swt.SWT;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-import org.w3c.dom.Document;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.w3c.dom.Text;
-
-/**
- * @author mengbo
- */
-public final class EditModelQuery {
-	private static Logger _log = PDPlugin.getLogger(EditModelQuery.class);
-
-	private static EditModelQuery _instance;
-
-	private static final int START_INDEX_BEFORE_TAG = 1;
-
-	private static final int END_INDEX_WITHIN_TAG = 2;
-
-	private static final HashSet SPECIAL_EMPTY_CHARS = new HashSet();
-
-	/**
-	 * Maps unicode Characters to html equivalents
-	 */
-	public static final HashMap CHAR_NODE_MAP = new HashMap();
-
-	// Cursor can't go outside of these container.
-	private static final HashSet HTML_CONSTRAINED_CONTAINERS = new HashSet();
-
-	/**
-	 * HTML tags that control style
-	 */
-	public static final HashSet HTML_STYLE_NODES = new HashSet();
-
-	static final HashSet UNREMOVEBLE_TAGS = new HashSet();
-
-	static {
-		UNREMOVEBLE_TAGS.add(IHTMLConstants.TAG_HTML);
-		UNREMOVEBLE_TAGS.add(IHTMLConstants.TAG_HEAD);
-		UNREMOVEBLE_TAGS.add(IHTMLConstants.TAG_BODY);
-		EditModelQuery.CHAR_NODE_MAP.put(new Character(SWT.CR),
-				IHTMLConstants.TAG_BR);
-		EditModelQuery.CHAR_NODE_MAP.put(new Character(SWT.LF),
-				IHTMLConstants.TAG_BR);
-		EditModelQuery.SPECIAL_EMPTY_CHARS.add(" "); //$NON-NLS-1$
-		EditModelQuery.SPECIAL_EMPTY_CHARS.add("\t"); //$NON-NLS-1$
-		EditModelQuery.SPECIAL_EMPTY_CHARS.add("\r"); //$NON-NLS-1$
-		EditModelQuery.SPECIAL_EMPTY_CHARS.add("\n"); //$NON-NLS-1$
-		EditModelQuery.HTML_CONSTRAINED_CONTAINERS.add(IHTMLConstants.TAG_TD);
-		EditModelQuery.HTML_CONSTRAINED_CONTAINERS.add(IHTMLConstants.TAG_TR);
-		EditModelQuery.HTML_CONSTRAINED_CONTAINERS
-				.add(IHTMLConstants.TAG_TABLE);
-		EditModelQuery.HTML_STYLE_NODES.add(IHTMLConstants.TAG_B);
-		EditModelQuery.HTML_STYLE_NODES.add(IHTMLConstants.TAG_EM);
-		EditModelQuery.HTML_STYLE_NODES.add(IHTMLConstants.TAG_H1);
-		EditModelQuery.HTML_STYLE_NODES.add(IHTMLConstants.TAG_H2);
-		EditModelQuery.HTML_STYLE_NODES.add(IHTMLConstants.TAG_H3);
-		EditModelQuery.HTML_STYLE_NODES.add(IHTMLConstants.TAG_H4);
-		EditModelQuery.HTML_STYLE_NODES.add(IHTMLConstants.TAG_H5);
-		EditModelQuery.HTML_STYLE_NODES.add(IHTMLConstants.TAG_H6);
-		EditModelQuery.HTML_STYLE_NODES.add(IHTMLConstants.TAG_A);
-		EditModelQuery.HTML_STYLE_NODES.add(IHTMLConstants.TAG_U);
-		EditModelQuery.HTML_STYLE_NODES.add(IHTMLConstants.TAG_I);
-		EditModelQuery.HTML_STYLE_NODES.add(IHTMLConstants.TAG_S);
-		EditModelQuery.HTML_STYLE_NODES.add(IHTMLConstants.TAG_STRONG);
-		EditModelQuery.HTML_STYLE_NODES.add(IHTMLConstants.TAG_TT);
-		EditModelQuery.HTML_STYLE_NODES.add(IHTMLConstants.TAG_BIG);
-		EditModelQuery.HTML_STYLE_NODES.add(IHTMLConstants.TAG_SMALL);
-		EditModelQuery.HTML_STYLE_NODES.add(IHTMLConstants.TAG_FONT);
-	}
-
-	private EditModelQuery() {
-        // no  external instantiation
-	}
-
-	/**
-	 * @return the singleton instance
-	 */
-	public static EditModelQuery getInstance() {
-		if (_instance == null) {
-			_instance = new EditModelQuery();
-		}
-		return _instance;
-	}
-
-	/**
-	 * Get previous sibling, or if sibling is null then get previous neighbor.
-	 * 
-	 * @param node
-	 * @return the node
-	 */
-	public Node getPreviousNeighbor(Node node) {
-		if (!EditValidateUtil.validNode(node)) {
-			return null;
-		}
-		while (node != null && node.getNodeType() != Node.DOCUMENT_NODE
-				&& node.getPreviousSibling() == null) {
-			node = node.getParentNode();
-		}
-		return (node != null && node.getNodeType() != Node.DOCUMENT_NODE) ? node
-				.getPreviousSibling()
-				: null;
-	}
-
-	/**
-	 * Get privous sibling, or if sibling is null then get previous neighor's
-	 * rightmost child, which is adjacent to 'node'.
-	 * 
-	 * @param node
-	 * @return the node
-	 */
-	public Node getPreviousLeafNeighbor(Node node) {
-		return getLastLeafChild(getPreviousNeighbor(node));
-	}
-
-	/**
-	 * Get next sibling, or if sibling is null get next neighbor.
-	 * 
-	 * @param node
-	 * @return the node
-	 */
-	public Node getNextNeighbor(Node node) {
-		if (!EditValidateUtil.validNode(node)) {
-			return null;
-		}
-
-		while (node != null && node.getNodeType() != Node.DOCUMENT_NODE
-				&& node.getNextSibling() == null) {
-			node = node.getParentNode();
-		}
-		return (node != null && node.getNodeType() != Node.DOCUMENT_NODE) ? node
-				.getNextSibling()
-				: null;
-	}
-
-	/**
-	 * Get next sibling, or if sibling is null get next neighbor's leftmost leaf
-	 * child which will be adjacent to 'node'.
-	 * 
-	 * @param node
-	 * @return the node
-	 */
-	public Node getNextLeafNeighbor(Node node) {
-		return getFirstLeafChild(getNextNeighbor(node));
-	}
-
-	/**
-	 * Get node's rightmost leaf child.
-	 * 
-	 * @param node
-	 * @return the node
-	 */
-	private Node getLastLeafChild(Node node) {
-		if (node == null) {
-			return null;
-		}
-		if (node.getLastChild() != null) {
-			return getLastLeafChild(node.getLastChild());
-		}
-        return node;
-	}
-
-	/**
-	 * Get node's leftmost leaf child.
-	 * 
-	 * @param node
-	 * @return the node
-	 */
-	private Node getFirstLeafChild(Node node) {
-		if (node == null) {
-			return null;
-		}
-
-		if (node.getFirstChild() != null) {
-			return getFirstLeafChild(node.getFirstChild());
-		}
-        return node;
-	}
-
-	/**
-	 * To see if node is within a indexed region that is started from 'start',
-	 * ended at 'end'
-	 */
-	static boolean within(int start, int end, Node theNode) {
-		return getNodeStartIndex(theNode) >= start
-				&& getNodeEndIndex(theNode) <= end;
-	}
-
-	/**
-	 * To see whether the 'position' is within indexed location (start, end)
-	 * 
-	 * @param start
-	 * @param end
-	 * @param position
-	 * @return
-	 */
-	 boolean within(int start, int end, IDOMPosition position) {
-		int pos = getIndexedRegionLocation(position);
-		return start <= pos && pos <= end;
-	}
-
-	/**
-	 * To see whether the 'theNode' is not within indexed region (start, end)
-	 * 
-	 * @param start
-	 * @param end
-	 * @param theNode
-	 * @return
-	 */
-	static boolean outOf(int start, int end, Node theNode) {
-		if (getNodeLenth(theNode) > 0) {
-			return getNodeStartIndex(theNode) >= end
-					|| getNodeEndIndex(theNode) <= start;
-		}
-        return !((getNodeStartIndex(theNode) >= start && getNodeEndIndex(theNode) <= end));
-	}
-
-	/**
-	 * Determine whether the position is at node's edge. When the offset is at
-	 * edge, it is in the leftmost or rightmost offset of node's region.
-	 * 
-	 * @param position 
-	 * @param forward 
-	 * @return true if at edge
-	 */
-	boolean atEdge(IDOMPosition position, boolean forward) {
-		Node node = position.getContainerNode();
-		int offset = position.getOffset();
-		if (forward) {
-			if (EditModelQuery.isText(node)) {
-				return offset == node.getNodeValue().length();
-			}
-            return offset == node.getChildNodes().getLength();
-		}
-        return offset == 0;
-	}
-
-	/**
-	 * Get node's neighbor on the node tree, if forward, then get next,
-	 * otherwise go backward.
-	 * 
-	 * @param node
-	 * @param forward
-	 * @return the node
-	 */
-	Node getNeighbor(Node node, boolean forward) {
-		if (forward) {
-			return getNextNeighbor(node);
-		}
-        return getPreviousNeighbor(node);
-	}
-
-	/**
-	 * Get neighbor which is descendent of root.
-	 * 
-	 * @param node
-	 * @param root
-	 * @return the node
-	 */
-	Node getPreviousNeighbor(Node node, Node root) {
-		if (!EditValidateUtil.validNode(node)) {
-			return null;
-		}
-		while (node != null && node != root
-				&& node.getNodeType() != Node.DOCUMENT_NODE
-				&& node.getPreviousSibling() == null) {
-			node = node.getParentNode();
-		}
-		return (node != null && node != root && node.getNodeType() != Node.DOCUMENT_NODE) ? node
-				.getPreviousSibling()
-				: null;
-	}
-
-	/**
-	 * Get neighbor which is descendent of root.
-	 * 
-	 * @param node
-	 * @param root
-	 * @return the node
-	 */
-	Node getNextNeighbor(Node node, Node root) {
-		if (!EditValidateUtil.validNode(node)) {
-			return null;
-		}
-
-		while (node != null && node != root
-				&& node.getNodeType() != Node.DOCUMENT_NODE
-				&& node.getNextSibling() == null) {
-			node = node.getParentNode();
-		}
-		return (node != null && node != root && node.getNodeType() != Node.DOCUMENT_NODE) ? node
-				.getNextSibling()
-				: null;
-	}
-
-	/**
-	 * Get neighbor which is descendent of root.
-	 * 
-	 * @param node
-	 * @param forward
-	 * @param root
-	 * @return the node
-	 */
-	 Node getNeighbor(Node node, boolean forward, Node root) {
-		Assert.isTrue(root != null);
-		if (forward) {
-			return getNextNeighbor(node, root);
-		}
-        return getPreviousNeighbor(node, root);
-	}
-
-	/**
-	 * Get node's leaf child which is adjacent to 'node', according to
-	 * 'forward', it will search backward or forward.
-	 * 
-	 * @param node
-	 * @param forward
-	 * @return the node
-	 */
-	Node getLeafNeighbor(Node node, boolean forward) {
-		if (node == null) {
-			return null;
-		}
-		if (forward) {
-			return getNextLeafNeighbor(node);
-		}
-        return getPreviousLeafNeighbor(node);
-	}
-
-	/**
-	 * Get neighbor's leaf child, which is adjacent to 'node'
-	 * 
-	 * @param node
-	 * @param childIndex
-	 * @param forward
-	 * @return the node
-	 */
-	 Node getLeafNeighbor(Node node, int childIndex, boolean forward) {
-		if (node == null) {
-			return null;
-		}
-		Node neighbor = getNeighbor(node, childIndex, forward);
-		if (neighbor != null) {
-			if (forward) {
-				return getFirstLeafChild(neighbor);
-			}
-            return getLastLeafChild(neighbor);
-		}
-		return null;
-	}
-
-	/**
-	 * First try sibling, if it retruns null, try search neighbor.
-	 * 
-	 * @param parent
-	 * @param childIndex
-	 * @param forward
-	 * @return the node
-	 */
-	 Node getNeighbor(Node parent, int childIndex, boolean forward) {
-		if (!EditValidateUtil.validNode(parent)) {
-			return null;
-		}
-
-		NodeList nodeList = parent.getChildNodes();
-		if (nodeList != null && nodeList.getLength() > 0) {
-			if (nodeList.getLength() < childIndex) {
-				return null;
-			}
-			Node childNode = null;
-			if (!forward) {
-				--childIndex;
-			}
-			childNode = nodeList.item(childIndex);
-			if (childNode != null) {
-				return childNode;
-			}
-            return getNeighbor(parent, forward);
-		}
-        if (parent.getNodeType() == Node.TEXT_NODE) {
-        	return getNeighbor(parent, forward);
-        }
-        return null;
-	}
-
-	/**
-	 * To see whether the textSelection start and end are on the same.
-	 * 
-	 * @param model
-	 * @param textSelection
-	 * @return the node
-	 */
-	 static boolean isSame(IStructuredModel model,
-			TextSelection textSelection) {
-		if (model != null && textSelection != null) {
-			int t1 = textSelection.getOffset();
-			int t2 = textSelection.getLength() + t1;
-			return model.getIndexedRegion(t1) == model.getIndexedRegion(t2);
-		}
-		return false;
-	}
-
-	/**
-	 * To see if the range and text selection covered the same range.
-	 * 
-	 * @param model
-	 * @param range
-	 * @param textSelection
-	 * @return true if same
-	 */
-	static boolean isSame(IStructuredModel model, DesignRange range,
-			TextSelection textSelection) {
-		if (model != null && range != null && textSelection != null) {
-			int t1 = textSelection.getOffset();
-			int t2 = textSelection.getLength() + t1;
-			int r1 = getIndexedRegionLocation(DOMRangeHelper.toDOMRange(range)
-					.getStartPosition());
-			int r2 = getIndexedRegionLocation(DOMRangeHelper.toDOMRange(range)
-					.getEndPosition());
-			return (model.getIndexedRegion(t1) == model.getIndexedRegion(r1) && //
-					model.getIndexedRegion(t2) == model.getIndexedRegion(r2))
-					|| (model.getIndexedRegion(t2) == model
-							.getIndexedRegion(r1) && //
-					model.getIndexedRegion(t1) == model.getIndexedRegion(r2));
-		}
-		return false;
-	}
-
-	/**
-	 * To see whether the selection is single point.
-	 * 
-	 * @param textSelection
-	 * @return true if same point
-	 */
-	 static boolean isSamePoint(TextSelection textSelection) {
-		return textSelection.getLength() == 0;
-	}
-
-	/**
-	 * To see whether two IDOMPosition are pointed to a same location.
-	 * 
-	 * @param p1
-	 * @param p2
-	 * @return true if same
-	 */
-	public static boolean isSame(IDOMPosition p1, IDOMPosition p2) {
-		if (p1 == p2
-				|| (p1.getContainerNode() == p2.getContainerNode() && p1
-						.getOffset() == p2.getOffset())) {
-			return true;
-		}
-		return false;
-	}
-
-	/**
-	 * To see whether the range's start and end position are pointed to a same
-	 * location.
-	 * 
-	 * @param range
-	 * @return true if is same
-	 */
-	public static boolean isSame(DOMRange range) {
-		EditValidateUtil.validRange(range);
-		return isSame(range.getStartPosition(), range.getEndPosition());
-	}
-
-	/**
-	 * @param range
-	 * @return true if same
-	 */
-	public static boolean isSame(DesignRange range) {
-		return isSame(range.getStartPosition(), range.getEndPosition());
-	}
-
-	/**
-	 * @param p1
-	 * @param p2
-	 * @return true if same
-	 */
-	public static boolean isSame(DesignPosition p1, DesignPosition p2) {
-		if (p1 == p2) {
-			return true;
-		}
-		if (p1.getContainerNode() == p2.getContainerNode()
-				&& p1.getOffset() == p2.getOffset()) {
-			return true;
-		}
-		return false;
-	}
-
-	/**
-	 * @param p1
-	 * @param p2
-	 * @return true if p1 and p2 are within same text node
-	 */
-	final boolean isWithinSameText(IDOMPosition p1, IDOMPosition p2) {
-		if (p1 == null || p2 == null) {
-			return false;
-		}
-		return p1.isText() && p2.isText()
-				&& p1.getContainerNode() == p2.getContainerNode();
-	}
-
-	/**
-	 * Get the node absolute start location in its residing IStructuredModel.
-	 * 
-	 * @param p
-	 * @return the location
-	 */
-	public static int getIndexedRegionLocation(IDOMPosition p) {
-		if (!EditValidateUtil.validPosition(p)) {
-			return -1;
-		}
-		Node parent = p.getContainerNode();
-		if (p.isText()) {
-			return ((IndexedRegion) parent).getStartOffset() + p.getOffset();
-		}
-        int index = p.getOffset();
-        if (!parent.hasChildNodes()) {
-        	// Element:
-        	if (!isDocument(parent)) {
-        		IStructuredDocumentRegion region = ((IDOMNode) parent)
-        				.getStartStructuredDocumentRegion();
-        		return region.getEnd();
-        	}
-            // Document node:
-            int offset = ((IndexedRegion) parent).getStartOffset();
-            return offset;
-        }
-        NodeList children = parent.getChildNodes();
-        // After rightmost child
-        if (children.getLength() == index) {
-        	if (!isDocument(parent)) {
-        		int pos = getNodeEndNameStartIndex(parent);
-        		return pos;
-        	}
-            int offset = ((IndexedRegion) parent).getEndOffset();
-            return offset;
-        }
-        Node node = children.item(index);
-        return ((IndexedRegion) node).getStartOffset();
-	}
-
-	/**
-	 * To determine whether the position is at the edge of a node. TODO: temp
-	 * func for later combination
-	 * @param nodePos 
-	 * 
-	 * @param position
-	 * @param left 
-	 * @return true if linked
-	 */
-	boolean isLinked(IDOMPosition nodePos, IDOMPosition position,
-			boolean left) {
-		int index = getIndexedRegionLocation(position);
-		if (left) {
-			int pos = getIndexedRegionLocation(nodePos);
-			return pos == index;
-		}
-        Node node = null;
-        int end;
-        if (nodePos.isText()) {
-        	node = nodePos.getContainerNode();
-        	end = ((IndexedRegion) node).getEndOffset();
-        } else {
-        	node = nodePos.getNextSiblingNode();
-        	Assert.isTrue(node != null);
-        	end = ((IndexedRegion) node).getEndOffset();
-        }
-        return end == index;
-	}
-
-	/**
-	 * To see if the location is at the node's indexed pos, posType can be
-	 * START_INDEX_BEFORE_TAG, END_INDEX_WITHIN_TAG When location is at these
-	 * two position, webtools returns the container tag name, so we need to know
-	 * these.
-	 * 
-	 * @param location
-	 * @param node
-	 * @return true if at edge
-	 */
-	boolean isAtNodeNameEdge(int location, Node node, int posType) {
-		int start = getNodeEndNameStartIndex(node);
-		return location == start;
-	}
-
-	/**
-	 * @param location
-	 * @param node
-	 * @return true if at edge
-	 */
-	public boolean isAtNodeNameEdge(int location, Node node) {
-		return isAtNodeNameEdge(location, node, START_INDEX_BEFORE_TAG)
-				|| isAtNodeNameEdge(location, node, END_INDEX_WITHIN_TAG);
-	}
-
-	/**
-	 * If text only contains chars '\r' or '\n', it is considered to be
-	 * transparent.
-	 * 
-	 * @param node
-	 * @return true if transparent text
-	 */
-	 public static boolean isTransparentText(Node node) {
-		// should valid non null?
-		Assert.isTrue(node != null);
-		if (node == null || !isText(node)) {
-			return false;
-		}
-		if (!EditValidateUtil.validText(node)) {
-			return false;
-		}
-
-		Text text = (Text) node;
-		if (text.getLength() == 0) {
-			return true;
-		}
-		String value = text.getNodeValue();
-		int i = 0;
-		while (i < value.length() && HTMLUtil.isHTMLWhitespace(value.charAt(i))) {
-			i++;
-		}
-		return i == value.length();
-	}
-
-	/**
-	 * Get node index in its parent's children.
-	 * 
-	 * @param node
-	 * @return the node index or -1 if not found
-	 */
-	 static int getNodeIndex(Node node) {
-		EditValidateUtil.validNode(node);
-		Node parent = node.getParentNode();
-		int index = 0;
-		for (Node child = parent.getFirstChild(); child != null; child = child
-				.getNextSibling()) {
-			if (child == node) {
-				return index;
-			}
-			index++;
-		}
-		return -1; // error
-	}
-
-	/**
-	 * If parent has more than one children of which each node's localName is
-	 * the same as of 'node', return the index of 'node' in the same type
-	 * children list.
-	 * 
-	 * @param node
-	 * @return the index
-	 */
-	 public int getSameTypeNodeIndex(Node node) {
-		EditValidateUtil.validNode(node);
-		int i = 0;
-		while (node != null) {
-			Node sibling = node.getPreviousSibling();
-			if (sibling != null && sibling.getLocalName() != null
-					&& sibling.getLocalName().equals(node.getLocalName())) {
-				i++;
-			}
-			node = sibling;
-		}
-		return i; // error
-	}
-
-	/**
-	 * Start from position, skip transparent chars, and returns the first
-	 * non-transparent char's index. based on 'forward', go previously or next .
-	 * 
-	 * @param value
-	 * @param position
-	 * @param forward
-	 * @return the position
-	 */
-	 int getNextConcretePosition(String value, int position,
-			boolean forward) {
-		if (value == null) {
-			return -1;
-		}
-		if (value.length() == 0) {
-			return 0;
-		}
-		// validate
-		Assert.isTrue(position >= 0 && position <= value.length());
-		int i = -1;
-		if (forward) {
-			i = position;
-			while (i < value.length()
-					&& (value.charAt(i) == SWT.CR || value.charAt(i) == SWT.LF)) {
-				i++;
-			}
-			return i;
-		}
-        i = position - 1;
-        while (i >= 0
-        		&& (value.charAt(i) == SWT.CR || value.charAt(i) == SWT.LF)) {
-        	i--;
-        }
-        return i + 1;
-	}
-
-	/**
-	 * Get two nodes' lowest common ancestor.
-	 * 
-	 * @param node1
-	 * @param node2
-	 * @return the node
-	 */
-	 public Node getCommonAncestor(Node node1, Node node2) {
-		if (node1 == null || node2 == null) {
-			return null;
-		}
-
-		for (Node na = node1; na != null; na = na.getParentNode()) {
-			for (Node ta = node2; ta != null; ta = ta.getParentNode()) {
-				if (ta == na)
-					return ta;
-			}
-		}
-		return null; // not found
-	}
-
-	/**
-	 * Get lowest common ancestor of two IDOMPositions' container nodes..
-	 * 
-	 * @param p1
-	 * @param p2
-	 * @return the nodeh
-	 */
-	public Node getCommonAncestor(IDOMPosition p1, IDOMPosition p2) {
-		Node n1 = p1.getContainerNode();
-		Node n2 = p2.getContainerNode();
-		return getCommonAncestor(n1, n2);
-	}
-
-	/**
-	 * Get lowest ancestor of a 'node' which is block type.
-	 * 
-	 * @param node
-	 * @return the node
-	 */
-	 Node getBlockAncestor(Node node) {
-		if (!EditValidateUtil.validNode(node)) {
-			return null;
-		}
-		while (node != null && isChild(IHTMLConstants.TAG_BODY, node, true)) {
-			if (isBlockNode(node)) {
-				return node;
-			}
-			node = node.getParentNode();
-		}
-		return null;
-	}
-
-	/**
-	 * To see whether a node is block type.
-	 * 
-	 * @param node
-	 * @return true if is a block node
-	 */
-	public static boolean isBlockNode(Node node) {
-		return !isInline(node);
-	}
-
-	/**
-	 * @param node
-	 * @return true if is table cell
-	 */
-	static boolean isTableCell(Node node) {
-		if (node instanceof INodeNotifier) {
-			Object adapter = ((INodeNotifier) node)
-					.getAdapterFor(ICSSStyle.class);
-			if (adapter != null) {
-				ICSSStyle style = (ICSSStyle) adapter;
-				String display = style.getDisplay();
-				return display.equalsIgnoreCase(ICSSPropertyID.VAL_TABLE_CELL);
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * To see if a node's display type is inline.
-	 * 
-	 * @param refNode 
-	 * @return true if is inline
-	 */
-	public static boolean isInline(Node refNode) {
-		Node node = refNode;
-		EditPart part = Target.resolvePart(node);
-		if (part instanceof ElementEditPart) {
-			node = ((ElementEditPart) part).getTagConvert().getResultElement();
-		}
-		if (isText(node)) {
-			return true;
-		} else if (node instanceof INodeNotifier) {
-			Object adapter = ((INodeNotifier) node)
-					.getAdapterFor(ICSSStyle.class);
-			if (adapter != null) {
-				ICSSStyle style = (ICSSStyle) adapter;
-				String display = style.getDisplay();
-				return (display.equalsIgnoreCase(ICSSPropertyID.VAL_INLINE)
-						|| //
-						display
-								.equalsIgnoreCase(ICSSPropertyID.VAL_INLINE_TABLE)
-						|| //
-						display.equalsIgnoreCase(ICSSPropertyID.VAL_COMPACT) || //
-				display.equalsIgnoreCase(ICSSPropertyID.VAL_RUN_IN));
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * @param node
-	 * @return true if is list item
-	 */
-	public static boolean isListItem(Node node) {
-		if (node instanceof INodeNotifier) {
-			Object adapter = ((INodeNotifier) node)
-					.getAdapterFor(ICSSStyle.class);
-			if (adapter != null) {
-				ICSSStyle style = (ICSSStyle) adapter;
-				String display = style.getDisplay();
-				return (display.equalsIgnoreCase(ICSSPropertyID.VAL_LIST_ITEM));
-			}
-		}
-		return false;
-	}
-
-	/**
-     * The net effect of this method is that (subject to flags), true
-     * is returned if 'node' is the descendant (not really a child)
-     * of a tag with a local name in the list of 'names'.
-     * 
-     * TODO C.B: I hate method.  Need to rename and possibly rewrite
-     * 
-	 * @param names -- check this list for valid local names
-	 * @param node -- the node to check
-	 * @param ignoreCase -- if true, each node name has toLowerCase applied to
-     * it before checking for it names.  NOTE: this assumes that names is already
-     * in lowercase.  TODO: this is crappy assumption
-	 * @param noSame -- if true, then node is skipped and only its parent nodes are
-     * checked
-	 * @return true if the local name of node or one of its parents
-     * is in the array of Strings called names.
-	 */
-	public static boolean isChild(final String names[], Node node,
-			boolean ignoreCase, boolean noSame) {
-		if (node == null) {
-			return false;
-		}
-		if (noSame) {
-			node = node.getParentNode();
-		}
-        
-        final List namesAsList = Arrays.asList(names);
-        
-		while (node != null && !isDocument(node)) {
-			String nodeName = node.getLocalName();
-
-			if (nodeName != null)
-            {
-			    if (ignoreCase)
-                {
-			        nodeName = nodeName.toLowerCase();
-                }
-                
-                if (namesAsList.contains(nodeName))
-                {
-                    return true;
-                }
-			}
-            Node oldNode = node;
-			node = node.getParentNode();
-            if (oldNode == node)
-            {
-                throw new IllegalStateException("Infinite loop discovered in DOM tree"); //$NON-NLS-1$
-            }
-		}
-		return false;
-	}
-
-	/**
-	 * Determine whether a node is a child of node that is named as 'name', if
-	 * the node itself is named as 'name' return true also.
-	 * 
-	 * @param name
-	 * @param node
-	 * @param ignoreCase 
-	 * @return true if is child
-	 */
-	public static boolean isChild(String name, Node node, boolean ignoreCase) {
-		if (node == null) {
-			return false;
-		}
-
-		while (node != null && node.getNodeType() != Node.DOCUMENT_NODE) {
-			String nodeName = node.getLocalName();
-			if (nodeName != null
-					&& (ignoreCase && name.equalsIgnoreCase(nodeName) || !ignoreCase
-							&& name.equalsIgnoreCase(nodeName))) {
-				return true;
-			}
-			node = node.getParentNode();
-		}
-		return false;
-	}
-
-	/**
-	 * To see whether 'node' is 'ancestor's child.
-	 * 
-	 * @param ancestor
-	 * @param node
-	 * @return true if is child
-	 */
-	public static boolean isChild(Node ancestor, Node node) {
-		if (node == null || ancestor == null) {
-			return false;
-		}
-
-		if (isDocument(ancestor)) {
-			return true;
-		}
-		while (node != null && !isDocument(ancestor)) {
-			if (node == ancestor) {
-				return true;
-			}
-			node = node.getParentNode();
-		}
-		return false;
-	}
-
-	/**
-	 * Get next sibling node to position's container node.
-	 * 
-	 * @param position
-	 * @return the node
-	 */
-	Node getNextSibling(IDOMPosition position) {
-		if (position.isText()) {
-			return position.getContainerNode().getNextSibling();
-		}
-        return position.getNextSiblingNode();
-	}
-
-	/**
-	 * Get previous sibling node to position's container node.
-	 * 
-	 * @param position
-	 * @return the node
-	 */
-	Node getPreviousSibling(IDOMPosition position) {
-		if (position.isText()) {
-			return position.getContainerNode().getPreviousSibling();
-		}
-        return position.getPreviousSiblingNode();
-	}
-
-	/**
-	 * Get position's container node's parent.
-	 * 
-	 * @param position
-	 * @return the parent node
-	 */
-	Node getParent(IDOMPosition position) {
-		if (position.isText()) {
-			return position.getContainerNode().getParentNode();
-		}
-        return position.getContainerNode();
-	}
-
-	/**
-	 * Get node's sibling according to 'forward' direction
-	 * 
-	 * @param node
-	 * @param forward
-	 * @return the node
-	 */
-	public Node getSibling(Node node, boolean forward) {
-		EditValidateUtil.validNode(node);
-		if (forward) {
-			return node.getNextSibling();
-		}
-        return node.getPreviousSibling();
-	}
-
-	/**
-	 * Get position's container node's sibling.
-	 * 
-	 * @param position
-	 * @param forward
-	 * @return the node
-	 */
-	public Node getSibling(IDOMPosition position, boolean forward) {
-		if (forward) {
-			return getNextSibling(position);
-		}
-        return getPreviousSibling(position);
-	}
-
-	/**
-	 * Get position's container node's editable items number. this is temp
-	 * functions for future use.
-	 * 
-	 * @param position
-	 * @return the size
-	 */
-	int getSize(IDOMPosition position) {
-		EditValidateUtil.validPosition(position);
-		if (position.isText()) {
-			return ((Text) position.getContainerNode()).getLength();
-		}
-        if (position.getContainerNode().hasChildNodes()) {
-        	return position.getContainerNode().getChildNodes().getLength();
-        }
-        return 0;
-	}
-
-	/**
-	 * Valid position and return text, if it contains text node.
-	 * 
-	 * @param position
-	 * @return the text
-	 */
-	public Text getText(IDOMPosition position) {
-		if (position.isText()) {
-			if (position.getContainerNode() != null) {
-				return (Text) position.getContainerNode();
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * @param node
-	 * @return the document for  node
-	 */
-	public static Document getDocumentNode(Node node) {
-		if (node != null) {
-			return isDocument(node) ? (Document) node : node.getOwnerDocument();
-		}
-		return null;
-	}
-
-	/**
-	 * To see whether a node is empty, here we can insert rules to see whether
-	 * it is empty, for delete operation, it could be deleted.
-	 * 
-	 * @param node
-	 * @return true if node empty
-	 */
-	static boolean isEmptyNode(Node node) {
-		if (node.getNodeType() == Node.TEXT_NODE) {
-			return isTransparentText(node);
-		}
-		if (node.getChildNodes() == null
-				|| node.getChildNodes().getLength() == 0) {
-			return true;
-		}
-		return false;
-	}
-
-	/**
-	 * To see whther a node is text node.
-	 * 
-	 * @param node
-	 * @return true if the node is a text node
-	 */
-	public static boolean isText(Node node) {
-		return node != null && node.getNodeType() == Node.TEXT_NODE;
-	}
-
-	/**
-	 * To see whether a node is Document node.
-	 * 
-	 * @param node
-	 * @return true if the node is a doc node
-	 */
-	public static boolean isDocument(Node node) {
-		return node != null && node.getNodeType() == Node.DOCUMENT_NODE;
-	}
-
-	/**
-	 * Get style from parent node. from first paret 'firstF', we will traverse
-	 * the tree up untile reaching Document node, get all style node's, we may
-	 * insert rules here to stop the search at a before paricular node. Style
-	 * nodes could <b>, <u>...
-	 * 
-	 * @param children
-	 * @param firstF
-	 */
-	void assignFather(Vector children, Node firstF) {
-		if (children.size() == 0) {
-			return;
-		}
-		if (firstF != null && !isDocument(firstF)) {
-			String name = firstF.getNodeName();
-			// To see whether it is a style node that is our anticipated node.
-			if (name != null && HTML_STYLE_NODES.contains(name.toLowerCase())) {
-				Node newParent = firstF.cloneNode(false);
-				while (children.size() > 0) {
-					newParent.appendChild((Node) children.remove(0));
-				}
-				children.add(newParent);
-			}
-			assignFather(children, firstF.getParentNode());
-		}
-	}
-
-	/**
-	 * Get a node that is at Indexed position 'pos' in 'model'.
-	 * 
-	 * @param model
-	 * @param pos
-	 * @return the
-	 */
-	IndexedRegion getPosNode(IStructuredModel model, int pos) {
-		IndexedRegion inode = model.getIndexedRegion(pos);
-		return inode;
-	}
-
-	/**
-	 * If the pos is at right edge within container.
-	 * 
-	 * @param node
-	 * @param pos
-	 * @return true is at right edge
-	 */
-	boolean isAtRightMostWithin(Node node, int pos) {
-		return getNodeEndNameStartIndex(node) == pos;
-	}
-
-	/**
-	 * Create the node, if 'refNode' is null, then position is at the edge of
-	 * 'container'. otherwize calculate refNode's related index in its parent's
-	 * children list and return DOMPosition.
-	 * 
-	 * @param container
-	 * @param refNode
-	 * @param forward  
-	 * @return the dom position
-	 */
-	IDOMPosition createDomposition(Node container, Node refNode,
-			boolean forward) {
-		if (refNode == null) {
-			if (forward && container.hasChildNodes()) {
-				return new DOMPosition(container, container.getChildNodes()
-						.getLength());
-			}
-            return new DOMPosition(container, 0);
-		}
-        Assert.isTrue(refNode.getParentNode() == container);
-        int index = getNodeIndex(refNode);
-        if (!forward) {
-        	index++;
-        }
-        return new DOMPosition(container, index);
-	}
-
-	/**
-	 * @param fModel
-	 * @param textSelection
-	 * @return the design range
-	 */
-	static DesignRange convertToDesignRange(IStructuredModel fModel,
-			TextSelection textSelection) {
-		int start = textSelection.getOffset();
-		int end = textSelection.getLength() + start;
-		IDOMPosition startDomPos = EditModelQuery.getInstance()
-				.createDomposition((IDOMModel) fModel, start, false);
-		IDOMPosition endDomPos = EditModelQuery.getInstance()
-				.createDomposition((IDOMModel) fModel, end, false);
-		if (startDomPos == null) {
-			startDomPos = endDomPos;
-		} else if (endDomPos == null) {
-			endDomPos = startDomPos;
-		}
-		if (startDomPos != null) {
-			DesignPosition startPos = null, endPos = null;
-			startPos = DOMPositionHelper.toDesignPosition(startDomPos);
-			endPos = DOMPositionHelper.toDesignPosition(endDomPos);
-			if (startPos != null) {
-				return new DesignRange(startPos, endPos);
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Create IDOMPosition based on Indexed 'position' in model. If node at
-	 * position is text, use position to calculate DOMPosition offset,
-	 * otherwize, simply create position pointed to container's children list's
-	 * edge.
-	 * 
-	 * @param model
-	 * @param position
-	 * @param adjust 
-	 * @return the dom position
-	 */
-	public IDOMPosition createDomposition(IDOMModel model, int position,
-			boolean adjust) {
-		return createDomposition1(model, position, adjust);
-	}
-
-	/**
-	 * Create IDOMPosition based on Indexed 'position' in model. If node at
-	 * position is text, use position to calculate DOMPosition offset,
-	 * otherwize, simply create position pointed to container's children list's
-	 * edge.
-	 * 
-	 * @param model
-	 * @param position
-	 * @param adjust 
-	 * @return the dom position
-	 */
-	public IDOMPosition createDomposition1(IDOMModel model, int position,
-			boolean adjust) {
-		try {
-			// get the container
-			Object object = getPosNode(model, position);
-			if (object == null && position > 0) {
-				// The end of file?
-				object = getPosNode(model, position - 1);
-			}
-			Node container = null;
-			if (object == null) {
-				// empty file?
-				return new DOMPosition(model.getDocument(), 0);
-			}
-			container = (Node) object;
-			Object oppNode = getPosNode(model, position - 1);
-			if (oppNode != null
-					&& !EditModelQuery.isChild((Node) oppNode, container)
-					&& //
-					!EditModelQuery.isInline(container)
-					&& EditModelQuery.isInline((Node) oppNode)) {
-				container = (Node) oppNode;
-			}
-			int location = EditHelper.getInstance().getLocation(container,
-					position, false);
-			IDOMPosition result = null;
-			switch (location) {
-			case 1:
-			case 2:
-				result = new DOMRefPosition(container, false);
-				break;
-			case 4:
-			case 5:
-				result = new DOMRefPosition(container, true);
-				break;
-			case 3:
-				if (EditModelQuery.isText(container)) {
-					result = new DOMPosition(container, position
-							- EditModelQuery.getNodeStartIndex(container));
-				} else {
-					result = new DOMPosition(container, container
-							.getChildNodes().getLength());
-				}
-			}
-			return result;
-		} catch (Exception e) {
-			// "Error in position creation"
-			_log.error("Error.EditModelQuery.0" + e); //$NON-NLS-1$
-			return null;
-		}
-	}
-
-	/**
-	 * Calculate node's Indexed length in model.
-	 * 
-	 * @param node
-	 * @return the node length
-	 */
-	public static int getNodeLenth(Node node) {
-		if (node != null
-               && EditValidateUtil.validNode(node)) {
-			return ((IndexedRegion) node).getEndOffset()
-					- ((IndexedRegion) node).getStartOffset();
-		}
-        return 0;
-	}
-
-	/**
-	 * Return 'node' indexed start position Example: |<a></a>, the position is
-	 * indicated by '|'
-	 * 
-	 * @param node
-	 * @return the start index
-	 */
-	public static int getNodeStartIndex(Node node) {
-		if (EditValidateUtil.validNode(node) && node instanceof IndexedRegion) {
-			return ((IndexedRegion) node).getStartOffset();
-		}
-		return -1;
-	}
-
-	/**
-	 * Return 'node' indexed end position Example: <a></a>|, the position is
-	 * indicated by '|'
-	 * 
-	 * @param node
-	 * @return the end index
-	 */
-	public static int getNodeEndIndex(Node node) {
-		if (EditValidateUtil.validNode(node) && node instanceof IndexedRegion) {
-			return ((IndexedRegion) node).getEndOffset();
-		}
-		return -1;
-	}
-
-	/**
-	 * Get node at indexed position.
-	 * 
-	 * @param model 
-	 * @param position
-	 * @return the node at position
-	 */
-	static Node getNodeAt(IStructuredModel model, int position) {
-		try {
-			IndexedRegion region = model.getIndexedRegion(position);
-			if (region instanceof Node) {
-				return (Node) region;
-			}
-			return null;
-		} catch (Exception e) {
-			// "Error in region node creation"
-			_log.error("Error.EditModelQuery.1", e); //$NON-NLS-1$
-			return null;
-		}
-	}
-
-	/**
-	 * Return 'node' indexed start name's end position Example: <a>|aaa </a>,
-	 * the position is indicated by '|'
-	 * 
-	 * @param node
-	 * @return the index
-	 */
-	public static int getNodeStartNameEndIndex(Node node) {
-		if (isText(node)) {
-			return getNodeStartIndex(node);
-		}
-		if (EditValidateUtil.validNode(node) && node instanceof IDOMNode) {
-			IStructuredDocumentRegion region = ((IDOMNode) node)
-					.getStartStructuredDocumentRegion();
-			if (region != null) {
-				return region.getEndOffset();
-			}
-			// else
-			// {
-			// // if (node.hasChildNodes())
-			// // {
-			// // // Node should always have start name, so this part should
-			// never reach,
-			// // // the assert is for inner debug.
-			// // Assert.isTrue(false);
-			// // return getNodeStartIndex(node);
-			// // }
-			// }
-		}
-		// This should never happen.
-		return getNodeStartIndex(node);
-	}
-
-	/**
-	 * Return 'node' indexed end name' start position Example: <a>aaa| </a>, the
-	 * position is indicated by '|' If node is <a /> style or there is no </a>
-	 * to pair with <a>, the function return -1.
-	 * 
-	 * @param node
-	 * @return the start index
-	 */
-	public static int getNodeEndNameStartIndex(Node node) {
-		if (isText(node)) {
-			return getNodeEndIndex(node);
-		}
-		if (EditValidateUtil.validNode(node) && node instanceof IDOMNode) {
-			IStructuredDocumentRegion region = ((IDOMNode) node)
-					.getEndStructuredDocumentRegion();
-			if (region != null) {
-				return region.getStartOffset();
-			}
-			// else
-			// {
-			// if (node.hasChildNodes())
-			// {
-			// return getNodeEndIndex(node);
-			// }
-			// }
-		}
-		return getNodeEndIndex(node);
-	}
-
-	/**
-	 * To see if a node is <a/>style.
-	 * 
-	 * @param node
-	 * @return the single region node
-	 */
-	public boolean isSingleRegionNode(Node node) {
-		if (getNodeEndNameStartIndex(node) == getNodeEndIndex(node)
-				&& !node.hasChildNodes()) {
-			return true;
-		}
-		return false;
-	}
-
-	/**
-	 * To see if a node has child that is not transparent child only.
-	 * 
-	 * @param node
-	 * @return true if node has transparent children
-	 */
-	boolean hasNonTransparentChild(Node node) {
-        NodeList children = node.getChildNodes();
-        for (int i = 0, n = children.getLength(); i < n; i++) {
-        	Object child = children.item(i);
-        	if (isText((Node) child)) {
-        		if (!isTransparentText((Node) child)) {
-        			return true;
-        		}
-        	} else {
-        		return true;
-        	}
-        }
-		return false;
-	}
-
-	/**
-	 * To see if a node has child that is not transparent child only.
-	 * 
-	 * @param node
-	 * @param excludes 
-	 * @return true if has transparent child
-	 */
-	public boolean hasNonTransparentChild(Node node, String[] excludes) {
-		if (!node.hasChildNodes()) {
-			return false;
-		}
-        NodeList children = node.getChildNodes();
-        for (int i = 0, n = children.getLength(); i < n; i++) {
-        	Object child = children.item(i);
-        	if (isText((Node) child)) {
-        		if (!isTransparentText((Node) child)) {
-        			return true;
-        		}
-        	} else if (!Arrays.asList(excludes).contains(
-        			((Node) child).getLocalName())) {
-        		return true;
-        	}
-        }
-		return false;
-	}
-
-	/**
-	 * To see whether tag has whitespace char.
-	 * 
-	 * @param node
-	 * @return true if has whitespace neighbor
-	 */
-	public boolean hasWhitespaceNeighbor(Node node) {
-		node = getNeighbor(node, true);
-		if (isWidget(node)) {
-			return false;
-		}
-        node = getFirstLeafChild(node);
-        return isTransparentText(node);
-
-	}
-
-	/**
-	 * @param host
-	 * @return true if host is a widget
-	 */
-	public static boolean isWidget(Object host) {
-		boolean result = false;
-		EditPart part = null;
-		if (host instanceof EditPart) {
-			part = (EditPart) host;
-		} else if (host instanceof Node) {
-			part = Target.resolvePart((Node) host);
-			if (part == null) {
-				part = new HTMLEditPartsFactory(
-						(IDOMDocument) getDocumentNode((Node) host))
-						.createEditPart(null, host);
-			}
-		}
-		if (part instanceof NodeEditPart) {
-			result = ((NodeEditPart) part).isWidget();
-		}
-		return result;
-	}
-
-	/**
-	 * To combind whitespace chars, only one whitespace string should be create.
-	 * 
-	 * @param node
-	 * @return true if node is  redundant whitespace
-	 */
-	boolean isRedundantWightspaces(Node node) {
-		if (isTransparentText(node) && hasWhitespaceNeighbor(node)) {
-			return true;
-		}
-        return false;
-	}
-
-	/**
-	 * @param node
-	 * @param names
-	 * @param ignoreCase
-	 * @return true if node has ancestors in the name list
-	 * TODO: bad practice
-	 */
-	public static boolean hasAncestor(Node node, String names[],
-			boolean ignoreCase) {
-		Assert.isTrue(names != null);
-		while (node != null && !EditModelQuery.isDocument(node)) {
-			if (isElement(node))
-				if (containItem(names, node, ignoreCase)) {
-					return true;
-				}
-			node = node.getParentNode();
-		}
-		return false;
-	}
-
-	/**
-	 * To see if 'node' has ancestor that has name as 'name'
-	 * 
-	 * @param node
-	 * @param name
-	 * @param ignoreCase
-	 * @return true if node has the named ancestor
-	 */
-	public static boolean hasAncestor(Node node, String name, boolean ignoreCase) {
-		Assert.isTrue(name != null);
-		while (node != null && !EditModelQuery.isDocument(node)) {
-			if (node.getNodeName() != null)
-				if ((ignoreCase && name.equalsIgnoreCase(node.getNodeName())) || //
-						(!ignoreCase && name.equals(node.getNodeName()))) {
-					return true;
-				}
-			node = node.getParentNode();
-		}
-		return false;
-	}
-
-	/**
-	 * To see if 'node' has direct ancestors that has names listed in 'name[]'
-	 * 
-	 * @param node
-	 * @param top
-	 * @param ignoreCase
-	 * @return the list of ancestors
-	 */
-	public static List getAncestors(Node node, String top, boolean ignoreCase) {
-		List result = new ArrayList();
-		Assert.isTrue(node != null);
-		while (node != null && !EditModelQuery.isDocument(node)) {
-			result.add(node);
-			String name = node.getLocalName();
-			if (ignoreCase && top.equalsIgnoreCase(name) || //
-					(!ignoreCase && top.equals(name))) {
-				break;
-			}
-			node = node.getParentNode();
-		}
-		return result;
-	}
-
-	/**
-	 * Copy old node's children to newNode.If the newNode is the father of the
-	 * old node,then the old node's children will be inserted before the old
-	 * node,otherwise,the old node's children just append to the newNode.
-	 * 
-	 * @param old
-	 * @param newNode
-	 */
-	public static void copyChildren(Node old, Node newNode) {
-		Node child = old.getFirstChild();
-		while (child != null) {
-			Node next = child.getNextSibling();
-			child = old.removeChild(child);
-			if (old.getParentNode() == newNode) {
-				newNode.insertBefore(child, old);
-			} else {
-				newNode.appendChild(child);
-			}
-			child = next;
-		}
-	}
-
-	/**
-	 * @param node
-	 * @return true if node is an element
-	 */
-	private static boolean isElement(Node node) {
-		return node.getNodeType() == Node.ELEMENT_NODE;
-	}
-
-	/**
-	 * Return a offspring of ancestor, the offsprint has a name listed in
-	 * childrenNames.
-	 * 
-	 * @param ancestor
-	 * @param childrenNames
-	 * @param maxLevelToSearch
-	 *            the max level from ancestor to the offspring in family tree.
-	 * @param ignoreCase
-	 * @return the node
-	 */
-	public static Node getChild(Node ancestor, String childrenNames[],
-			int maxLevelToSearch, boolean ignoreCase) {
-		if (ancestor == null || maxLevelToSearch < 0) {
-			return null;
-		}
-        if (ancestor.getLocalName() != null
-        		&& ignoreCase
-        		&& Arrays.asList(childrenNames).contains(
-        				ancestor.getLocalName().toLowerCase())
-        		|| !ignoreCase
-        		&& Arrays.asList(childrenNames).contains(
-        				ancestor.getLocalName())) {
-        	return ancestor;
-        }
-		NodeList children = ancestor.getChildNodes();
-		for (int i = 0, n = children.getLength(); i < n; i++) {
-			Node result = getChild(children.item(i), childrenNames,
-					maxLevelToSearch - 1, ignoreCase);
-			if (result != null) {
-				return result;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Return a offspring of ancestor, the nodes on the tree are type of
-	 * DeferredElementImpl, the offsprint has a name listed in childrenNames.
-	 * 
-	 * @param ancestor
-	 * @param childrenNames
-	 * @param maxLevelToSearch
-	 *            the max level from ancestor to the offspring in family tree.
-	 * @param ignoreCase
-	 * @return the node
-	 */
-	static Node getChildDeferredNode(Node ancestor,
-			String childrenNames[], int maxLevelToSearch, boolean ignoreCase) {
-		if (ancestor == null || maxLevelToSearch < 0) {
-			return null;
-		}
-        String nodeName = ancestor.getNodeName();
-        if (nodeName != null && ignoreCase
-        		&& Arrays.asList(childrenNames).contains(nodeName)
-        		|| !ignoreCase
-        		&& Arrays.asList(childrenNames).contains(nodeName)) {
-        	return ancestor;
-        }
-		NodeList children = ancestor.getChildNodes();
-		for (int i = 0, n = children.getLength(); i < n; i++) {
-			Node result = getChildDeferredNode(children.item(i), childrenNames,
-					maxLevelToSearch - 1, ignoreCase);
-			if (result != null) {
-				return result;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * @param node
-	 * @return if has tranparent node only
-	 */
-	public static boolean hasTransparentNodeOnly(Node node) {
-		NodeList children = node.getChildNodes();
-		for (int i = 0, n = children.getLength(); i < n; i++) {
-			if (!EditModelQuery.isTransparentText(children.item(i))) {
-				return false;
-			}
-		}
-		return true;
-	}
-
-	/**
-	 * @param name
-	 * @param node
-	 * @param ignoreCase
-	 * @return the node
-	 */
-	public static Node getParent(String name, Node node, boolean ignoreCase) {
-		if (node == null) {
-			return null;
-		}
-
-		while (node != null && node.getNodeType() != Node.DOCUMENT_NODE) {
-			String nodeName = node.getLocalName();
-			if (nodeName != null
-					&& (ignoreCase && name.equalsIgnoreCase(nodeName) || !ignoreCase
-							&& name.equalsIgnoreCase(nodeName))) {
-				return node;
-			}
-			node = node.getParentNode();
-		}
-		return null;
-	}
-
-	/**
-	 * get Elements with the same localName as the input localName under the
-	 * rootNode,it is a recursive computation.
-	 * 
-	 * @param rootNode
-	 * @param localName
-	 * @param caseSensitive
-	 * @param list
-	 *            The input list to hold the matched elements.
-	 */
-	public static void getElementByLocalName(Node rootNode, String localName,
-			boolean caseSensitive, List list) {
-		if (list == null) {
-			return;
-		}
-		NodeList nodeList = rootNode.getChildNodes();
-		if (nodeList != null && nodeList.getLength() > 0) {
-			for (int i = 0, size = nodeList.getLength(); i < size; i++) {
-				Node node = nodeList.item(i);
-				if (node.getNodeType() == Node.ELEMENT_NODE) {
-					String nodeLocalName = node.getLocalName();
-					if (caseSensitive && localName.equals(nodeLocalName)) {
-						list.add(node);
-					} else if (!caseSensitive
-							&& localName.equalsIgnoreCase(nodeLocalName)) {
-						list.add(node);
-					}
-					getElementByLocalName(node, localName, true, list);
-				}
-
-			}
-		}
-	}
-
-	/**
-	 * @param tags
-	 * @param node
-	 * @param ignoreCase
-	 * @return the true if contains item
-	 */
-	public static boolean containItem(String[] tags, Node node,
-			boolean ignoreCase) {
-		if (ignoreCase) {
-			for (int i = 0, size = tags.length; i < size; i++) {
-				if (tags[i] == null) {
-					continue;
-				}
-				if (tags[i].equalsIgnoreCase(node.getNodeName())) {
-					return true;
-				}
-			}
-		} else {
-			for (int i = 0, size = tags.length; i < size; i++) {
-				if (tags[i] == null) {
-					continue;
-				}
-				if (tags[i].equals(node.getNodeName())) {
-					return true;
-				}
-			}
-		}
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/EditValidateUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/EditValidateUtil.java
deleted file mode 100644
index 46409de..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/EditValidateUtil.java
+++ /dev/null
@@ -1,385 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dom;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
-import org.eclipse.jst.pagedesigner.viewer.DesignRefPosition;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-import org.w3c.dom.Node;
-import org.w3c.dom.Text;
-
-/**
- * This class is used for debug purpose, and can be used to test some invalid
- * status in the functions. Generally all the methods here will throw exception
- * when invalid status happens.
- * 
- * @author mengbo
- */
-public final class EditValidateUtil {
-	private static final Logger _logger = PDPlugin
-			.getLogger(EditValidateUtil.class);
-
-	private static final boolean ALERT = false;
-
-	private static final boolean REPORT = false;
-
-	/**
-	 * A valid position means container node, offset are all valid.
-	 * 
-	 * @param position
-	 * @return true if the position is valid
-	 */
-	public static boolean validPosition(IDOMPosition position) {
-		try {
-			boolean result = true;
-			Assert.isTrue(position != null
-					&& position.getContainerNode() != null
-					&& position.getOffset() >= 0);
-			Node container = position.getContainerNode();
-			result &= validNode(container);
-			int offset = position.getOffset();
-			if (position.isText()) {
-				int length = ((Text) container).getLength();
-				Assert.isTrue(offset <= length);
-			} else {
-				if (position instanceof DOMPosition && offset > 0) {
-					Assert.isTrue(container.hasChildNodes()
-							&& container.getChildNodes().getLength() >= offset);
-				}
-			}
-			return result;
-		} catch (Exception e) {
-			// "error", "Error in validPosition"
-			if (ALERT) {
-				PDPlugin
-						.getAlerts()
-						.confirm(
-								"Alert.EditValidateUtil.Title", "Alert.EditValidateUtil.Position", e); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-			if (REPORT) {
-				// "Invalid position:"
-				_logger.error("Error.EditValidateUtil.Position", e); //$NON-NLS-1$
-			}
-			return false;
-		}
-	}
-
-	/**
-	 * @param position
-	 * @return true if position is valid
-	 */
-	public static boolean validPosition(DesignPosition position) {
-		try {
-			boolean result = true;
-			Assert.isTrue(position != null
-					&& position.getContainerPart() != null
-					&& position.getContainerNode() != null
-					&& position.getOffset() >= 0);
-			Node container = position.getContainerNode();
-			result &= validNode(container);
-			int offset = position.getOffset();
-			if (EditModelQuery.isText(container)) {
-				int length = ((Text) container).getLength();
-				Assert.isTrue(offset <= length);
-			} else {
-				if (position instanceof DesignRefPosition && offset > 0) {
-					Assert.isTrue(container.hasChildNodes()
-							&& container.getChildNodes().getLength() >= offset);
-				}
-			}
-			return result;
-		} catch (Exception e) {
-			// "error", "Error in validPosition"
-			if (ALERT) {
-				PDPlugin
-						.getAlerts()
-						.confirm(
-								"Alert.EditValidateUtil.Title", "Alert.EditValidateUtil.Position", e); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-			if (REPORT) {
-				// "Invalid position:"
-				_logger.error("Error.EditValidateUtil.Position", e); //$NON-NLS-1$
-			}
-			return false;
-		}
-	}
-
-	/**
-	 * Valid node is TextNode and it's valid node.
-	 * 
-	 * @param node
-	 * @return true if node is valid
-	 */
-	public static boolean validText(Node node) {
-		try {
-			boolean result = true;
-			Assert.isTrue(node.getNodeType() == Node.TEXT_NODE);
-			Assert.isTrue(((Text) node).getData() != null);
-			result &= validNode(node);
-			return result;
-		} catch (Exception e) {
-			// "Error", "Error in validText"
-			if (ALERT) {
-				PDPlugin
-						.getAlerts()
-						.confirm(
-								"Alert.EditValidateUtil.Title", "Alert.EditValidateUtil.Text", e); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-			if (REPORT) {
-				// "Invalid Text:"
-				_logger.error("Error.EditValidateUtil.Text", e); //$NON-NLS-1$
-			}
-			return false;
-		}
-	}
-
-	/**
-	 * A valid node is resided in the model tree
-	 * 
-	 * @param node
-	 * @return true if node is valid
-	 */
-	public static boolean validNode(Node node) {
-		try {
-			Assert.isTrue(node instanceof IDOMNode);
-			Assert.isTrue((node.getNodeType() == Node.DOCUMENT_NODE)
-					|| (node.getParentNode() != null));
-			// What's this?
-			return true;
-		} catch (Exception e) {
-			// "Error", "Error in validNode"
-			if (ALERT) {
-				PDPlugin
-						.getAlerts()
-						.confirm(
-								"Alert.EditValidateUtil.Title", "Alert.EditValidateUtil.Node", e); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-			if (REPORT) {
-				// "Invalid node:"
-				_logger.error("Error.EditValidateUtil.Node", e); //$NON-NLS-1$
-			}
-			return false;
-		}
-	}
-
-	/**
-	 * A valid DOMRange contains valid IDOMPosition, and it should not be within
-	 * node like 'HEAD'. The later one might not be suitble to valid in this
-	 * util, it should be checked by some edit valid helper.
-	 * 
-	 * @param range
-	 * @return true if range is valid
-	 */
-	public static boolean validRange(DOMRange range) {
-		try {
-			// TODO: never read EditModelQuery modelQuery = EditModelQuery.getInstance();
-			boolean result = true;
-			IDOMPosition start = range.getStartPosition();
-			IDOMPosition end = range.getEndPosition();
-			result &= validPosition(start);
-			result &= validPosition(end);
-            // TODO: never read
-//			Node startContainer = start.getContainerNode();
-//			Node endContainer = end.getContainerNode();
-			// Assert.isTrue(isValidForEditing(modelQuery.getCommonAncestor(startContainer,
-			// endContainer)));
-			return result;
-		} catch (Exception e) {
-			// "Error", "Error in validRange"
-			if (ALERT) {
-				PDPlugin
-						.getAlerts()
-						.confirm(
-								"Alert.EditValidateUtil.Title", "Alert.EditValidateUtil.Range", e); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-			if (REPORT) {
-				// "Invalid Range:"
-				_logger.error("Error.EditValidateUtil.Range", e); //$NON-NLS-1$
-			}
-			return false;
-		}
-	}
-
-	/**
-	 * @param text
-	 * @param index
-	 * @return true if the index is valid
-	 */
-	public static boolean validStringIndex(Node text, int index) {
-		try {
-			Assert.isTrue(index >= 0 && ((Text) text).getLength() >= index);
-			return validText(text);
-		} catch (Exception e) {
-			// "Error", "Error in validStringIndex"
-			if (ALERT) {
-				PDPlugin
-						.getAlerts()
-						.confirm(
-								"Alert.EditValidateUtil.Title", "Alert.EditValidateUtil.StringIndex", e); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-			if (REPORT) {
-				// "Invalid Index in String:"
-				_logger.error("Error.EditValidateUtil.StringIndex", e); //$NON-NLS-1$
-			}
-			return false;
-		}
-	}
-
-	/**
-	 * @param text
-	 * @param index
-	 * @param offset
-	 * @return true if the index offset is valid
-	 */
-	public static boolean validStringIndexOffset(Node text, int index,
-			int offset) {
-		try {
-			Assert.isTrue(index >= 0 && (index + offset) >= 0
-					&& ((Text) text).getLength() >= (index + offset)
-					&& ((Text) text).getLength() >= index);
-			return validText(text);
-		} catch (Exception e) {
-			// "error", "Error in validStringIndex"
-			if (ALERT) {
-				PDPlugin
-						.getAlerts()
-						.confirm(
-								"Alert.EditValidateUtil.Title", "Alert.EditValidateUtil.IndexOffset", e); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-			if (REPORT) {
-				// "Invalid index or offset in String:"
-				_logger.error("Error.EditValidateUtil.IndexOffset", e); //$NON-NLS-1$
-			}
-			return false;
-		}
-	}
-
-//	private static void dumpPosition(String message, IDOMPosition position,
-//			boolean forward) {
-		// for future internal debug
-		// message(message);
-		// _logger.debug("vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv");
-		// if (position != null)
-		// {
-		// Node container = position.getContainerNode();
-		// Node node = null;
-		// String text = null;
-		// if (getContainerLength(container) > 0)
-		// {
-		// if (!position.isText())
-		// {
-		// int index = forward ? position.getOffset() : position.getOffset() -
-		// 1;
-		// node = container.getChildNodes().item(index);
-		// }
-		// else
-		// {
-		// int index = forward ? position.getOffset() : position.getOffset() -
-		// 1;
-		// if (index >= 0 && index < getContainerLength(container))
-		// {
-		// text = ((Text) container).substringData(index, 1);
-		// }
-		// else
-		// {
-		// text = null;
-		// }
-		// }
-		// }
-		// _logger.debug("DOMPosition type?:" + (position instanceof
-		// DOMPosition) + " container name: " +
-		// position.getContainerNode().getLocalName() + " offset:" +
-		// position.getOffset()
-		// + " length:" + getContainerLength(position.getContainerNode()));
-		// if (node != null)
-		// {
-		// _logger.debug("node to operate:" + node.getLocalName());
-		// }
-		// if (text != null)
-		// {
-		// _logger.debug("text to operate:\"" + text + "\" length:" +
-		// text.length());
-		// }
-		// }
-		// _logger.debug("^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^");
-//	}
-	
-	/**
-	 * @param pos
-	 * @param forward
-	 * @return true if the position if vallid for editing relative to forward (true) or backward  (false)
-	 */
-	public static boolean isValidForEditing(IDOMPosition pos, boolean forward) {
-		if (pos == null) {
-			return false;
-		}
-		if (pos.isText()) {
-			return true;
-		}
-        Node container = pos.getContainerNode();
-        // only head can't be edited
-        if (EditModelQuery.isChild(IHTMLConstants.TAG_HEAD, container,
-        		true)) {
-        	return false;
-        }
-        Node sibling = EditModelQuery.getInstance().getSibling(pos,
-        		forward);
-        if (sibling != null) {
-        	if (EditModelQuery.isText(sibling)) {
-        		return true;
-        	}
-        	Assert.isTrue(sibling.getLocalName() != null);
-        	if (EditModelQuery.UNREMOVEBLE_TAGS.contains(sibling
-        			.getLocalName().toLowerCase())) {
-        		return false;
-        	}
-        }
-        return true;
-	}
-
-	/**
-	 * @param node
-	 * @return true if node is valid for editing
-	 */
-	public static boolean isValidForEditing(Node node) {
-		if (EditModelQuery.isChild(IHTMLConstants.TAG_HEAD, node, true)) {
-			return false;
-		}
-		return true;
-	}
-
-	private EditValidateUtil()
-	{
-	    // do nothing
-	}
-	// Reserved for inner use.
-	//
-	// private static void errorNotice()
-	// {
-	// try
-	// {
-	// // FileInputStream fileau = new
-	// FileInputStream("C:\\WINNT\\Media\\ringout.wav");
-	// // AudioStream as = new AudioStream(fileau);
-	// // AudioPlayer.player.start(as);
-	// }
-	// catch (Exception e)
-	// {
-	// System.out.println("error in file open");
-	// }
-	//
-	// }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/IDOMPosition.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/IDOMPosition.java
deleted file mode 100644
index fa3169d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/IDOMPosition.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dom;
-
-import org.w3c.dom.Node;
-
-/**
- * An IDOMPosition represents a position in the DOM tree. There are multiple
- * ways of identify a position in the tree, such as by saying a offset in
- * parent, or before/after a particular node.
- * 
- * NOTE: IDOMPosition and its child class should be implemented as literal. that
- * is, they should not be changed after it is constructed.
- * 
- * @author mengbo
- */
-public interface IDOMPosition {
-	/**
-	 * 
-	 * @param forward
-	 *            if true, same as getNextSiblingNode(), if false, same as
-	 *            getPreviousSiblingNode
-	 * @return the sibling
-	 */
-	public Node getSibling(boolean forward);
-
-	/**
-	 * @return the next sibling node
-	 */
-	public Node getNextSiblingNode();
-
-	/**
-	 * @return the previous sibling node
-	 */
-	public Node getPreviousSiblingNode();
-
-	/**
-	 * @return the container node
-	 */
-	public Node getContainerNode();
-
-	/**
-	 * @return the offset
-	 */
-	public int getOffset();
-
-	/**
-	 * @return true if is text
-	 */
-	public boolean isText();
-
-	/**
-	 * "original" has been replace by "replacement" in the model. If this
-	 * replacement will affect this IDOMPosition, then this method should return
-	 * a new position that is valid after the replacement. If this replacement
-	 * won't affect this position, then the original position should be
-	 * returned.
-	 * 
-	 * @param original
-	 * @param replacement
-	 * @return the dom position
-	 */
-	public IDOMPosition handleReplacement(Node original, Node replacement);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/IDOMRefPosition.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/IDOMRefPosition.java
deleted file mode 100644
index 5a841df..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/IDOMRefPosition.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dom;
-
-import org.w3c.dom.Node;
-
-/**
- * A IDOMRefPosition locate a position by reference a node in the dom tree. It
- * mean a position after node, before a node, or before anything in a node, or
- * after anything in a node.
- * 
- * @author mengbo
- * @version 1.5
- */
-public interface IDOMRefPosition extends IDOMPosition {
-	/**
-	 * 
-	 * @return the reference (wrapped) node
-	 */
-	public Node getReferenceNode();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/ValidatorSupport.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/ValidatorSupport.java
deleted file mode 100644
index 215f93f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/ValidatorSupport.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dom;
-
-import javax.xml.namespace.QName;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jst.jsf.core.internal.tld.CMUtil;
-import org.eclipse.jst.pagedesigner.adapters.IBodyInfo;
-import org.eclipse.jst.pagedesigner.adapters.internal.BodyInfo;
-import org.eclipse.jst.pagedesigner.editors.palette.ITagDropSourceData;
-import org.eclipse.jst.pagedesigner.utils.CommandUtil;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.Text;
-
-/**
- * Simple utility class.
- * 
- * @author mengbo
- * @version 1.5
- */
-public class ValidatorSupport 
-{
-	/**
-	 * Equivalent to checkContainer(position new QName[]{qname}
-	 * 
-	 * @param position
-	 * @param qname
-	 * @return true if the tag identified by qname is found as a parent
-     * of position.
-	 */
-	public static boolean checkContainer(IDOMPosition position, QName qname) {
-		return checkContainer(position, new QName[] { qname });
-	}
-
-	/**
-	 * Check for any of the containers listed in qname starting from qname and working
-	 * up the DOM parent chain.
-	 * 
-	 * @param position
-	 * @param qname
-	 * @return true if one of the tags identified by qname is found as a parent
-	 * of position.
-	 */
-	public static boolean checkContainer(IDOMPosition position, QName qname[]) {
-		Node node = position.getContainerNode();
-		while (node != null) {
-			if (node instanceof Text) {
-				node = node.getParentNode();
-				continue;
-			}
-			if (node instanceof Element) {
-				Element ele = (Element) node;
-				String url = CMUtil.getElementNamespaceURI(ele);
-				String tag = ele.getLocalName();
-
-				for (int i = 0; i < qname.length; i++) {
-					if (tag.equalsIgnoreCase(qname[i].getLocalPart())) {
-						if (url == null) {
-							// this means something wrong. To be error tolerant,
-							// we treat it
-							// as if url is same
-							return true;
-						} else if (url.equalsIgnoreCase(qname[i].getNamespaceURI())) {
-							return true;
-						}
-					}
-				}
-
-				node = node.getParentNode();
-				continue;
-			}
-			break;
-		}
-		return false;
-	}
-
-    /**
-     * @param position
-     * @param model 
-     * @param creationProvider 
-     * @param customizationData
-     * @return the new dom position for the inserted container or null if could
-     *         not insert
-     */
-    public static IDOMPosition insertContainer(final IDOMPosition position,
-            final IDOMModel model,
-            final ITagDropSourceData creationProvider, final IAdaptable customizationData)
-    {
-        final Element newContainer = CommandUtil.executeInsertion(
-                creationProvider, model, position, customizationData);
-        if (newContainer != null)
-        {
-            DOMPosition pos = new DOMPosition(newContainer, 0);
-            return pos;
-        }
-        return null;
-    }
-
-	/**
-	 * @return the body info
-	 */
-	public static IBodyInfo getBodyInfo() {
-	    //TODO: change this to be meta-data driven.
-		return BodyInfo.getInstance();
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/html/ColStructure.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/html/ColStructure.java
deleted file mode 100644
index 2f4f9c1..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/html/ColStructure.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dom.html;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-/*package*/ class ColStructure implements Comparable {
-	private final int _column;
-
-	private final int _colSpan;
-
-	/**
-	 * @param column
-	 * @param colSpan
-	 */
-	public ColStructure(int column, int colSpan) {
-		this._column = column;
-		this._colSpan = colSpan;
-	}
-
-	/**
-	 * @return the column span
-	 */
-	public int getColSpan() {
-		return _colSpan;
-	}
-
-	/**
-	 * @return the column
-	 */
-	public int getColumn() {
-		return _column;
-	}
-
-	public int compareTo(Object o) {
-		ColStructure cs = (ColStructure) o;
-		if (this._column > cs.getColumn()) {
-			return 1;
-		} else if (this._column == cs.getColumn()) {
-			return 0;
-		} else {
-			return -1;
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/html/TableChildElementPosition.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/html/TableChildElementPosition.java
deleted file mode 100644
index 1b290ef..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/html/TableChildElementPosition.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dom.html;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TableChildElementPosition {
-	private int _rowIndex = -10;
-
-	private int _columnIndex = -10;
-
-	/**
-	 * @return Returns the _columnIndex.
-	 */
-	public int getColumnIndex() {
-		return _columnIndex;
-	}
-
-	/**
-	 * @param index
-	 *            The _columnIndex to set.
-	 */
-	public void setColumnIndex(int index) {
-		_columnIndex = index;
-	}
-
-	/**
-	 * @return Returns the _rowIndex.
-	 */
-	public int getRowIndex() {
-		return _rowIndex;
-	}
-
-	/**
-	 * @param index
-	 *            The _rowIndex to set.
-	 */
-	public void setRowIndex(int index) {
-		_rowIndex = index;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/html/TableUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/html/TableUtil.java
deleted file mode 100644
index 2f0b663..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/html/TableUtil.java
+++ /dev/null
@@ -1,534 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dom.html;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TableUtil {
-	private Element _fakeCell = null;
-
-	private Element _table = null;
-
-	private List[] _trCellLists = null;
-
-	/**
-	 * judge whether there is rowspan>1 cell in the tr
-	 * 
-	 * @param tr
-	 *            TR element in a table
-	 * @return true if there is rowspan>1 cell in the tr
-	 */
-	public static boolean hasRowSpanElement(Element tr) {
-		List list = DOMUtil.getElementChildren(tr);
-		Iterator itr = list.iterator();
-		while (itr.hasNext()) {
-			Element ele = (Element) itr.next();
-			int value = DOMUtil.getIntAttributeIgnoreCase(ele,
-					IHTMLConstants.ATTR_ROWSPAN, 1);
-			if (value > 1) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * judge whether a tr is affected by row span cell in the previous trs.
-	 * 
-	 * @param trList
-	 *            list holds all tr elements in a table
-	 * @param tr
-	 * @param index
-	 *            tr index in the DOM tree
-	 * @return true if tr is affected by row span cell in the previous trs
-	 */
-	public static boolean isAffectedByRowSpan(List trList, Element tr, int index) {
-		Node parent = tr.getParentNode();
-		int dex = index;
-		while (--dex >= 0) {
-			Element preTr = (Element) trList.get(dex);
-			if (preTr.getParentNode() != parent) {
-				break;
-			}
-            int maxRowSpan = countMaxRowSpan(preTr);
-            if (maxRowSpan > (index - dex)) {
-            	return true;
-            }
-		}
-		return false;
-	}
-
-	/**
-	 * count all tr in the table
-	 * 
-	 * @param element
-	 *            table
-	 * @param list
-	 *            list to hold tr elements
-	 */
-	public static void getTrElements(Element element, List list) {
-		NodeList nodeList = element.getChildNodes();
-		for (int i = 0, size = nodeList.getLength(); i < size; i++) {
-			Node node = nodeList.item(i);
-			if (node.getNodeType() == Node.ELEMENT_NODE) {
-				Element ele = (Element) node;
-				if (ele.getNodeName().equalsIgnoreCase(IHTMLConstants.TAG_TR)) {
-					list.add(ele);
-				} else if (ele.getNodeName().equalsIgnoreCase(
-						IHTMLConstants.TAG_THEAD)
-						|| ele.getNodeName().equalsIgnoreCase(
-								IHTMLConstants.TAG_TBODY)
-						|| ele.getNodeName().equalsIgnoreCase(
-								IHTMLConstants.TAG_TFOOT)) {
-					getTrElements(ele, list);
-				}
-			}
-
-		}
-	}
-
-	/**
-	 * count row index in the code DOM tree according to the display index
-	 * 
-	 * @param table
-	 * @param displayIndex
-	 * @return the row index
-	 */
-	public static int countRowIndexInDOMTree(Element table, int displayIndex) {
-
-		int footRows = countSectionRows(table, IHTMLConstants.TAG_TFOOT);
-		if (footRows == 0) {
-			return displayIndex;
-		}
-		int headRows = countSectionRows(table, IHTMLConstants.TAG_THEAD);
-		List list = new ArrayList();
-		getTrElements(table, list);
-		int bodyRows = list.size() - headRows - footRows;
-		// if display index is in TFOOT area
-		if (displayIndex >= (list.size() - footRows)) {
-			int index = displayIndex - bodyRows;
-			return index;
-		}
-		// if display index is in TBODY area
-		else if (displayIndex >= headRows) {
-			int index = displayIndex + footRows;
-			return index;
-		}
-		// if display index is in THEAD area
-		else {
-			return displayIndex;
-		}
-	}
-
-	/**
-	 * get row count in the specified section
-	 * 
-	 * @param table
-	 * @param sectionName
-	 *            child element name of table, like THEAD or TFOOT
-	 * @return the row count in the section
-	 */
-	public static int countSectionRows(Element table, String sectionName) {
-		NodeList nodeList = table.getChildNodes();
-		for (int i = 0, size = nodeList.getLength(); i < size; i++) {
-			Node node = nodeList.item(i);
-			if (node.getNodeType() == Node.ELEMENT_NODE) {
-				Element ele = (Element) node;
-				if (node.getNodeName().equalsIgnoreCase(sectionName)) {
-					List list = DOMUtil.getChildElementsByTagIgnoreCase(ele,
-							IHTMLConstants.TAG_TR);
-					if (list != null) {
-						return list.size();
-					}
-				}
-			}
-
-		}
-		return 0;
-	}
-
-	/**
-	 * constructor
-	 * 
-	 * @param table
-	 */
-	public TableUtil(Element table) {
-		this._table = table;
-		this._trCellLists = fillTrCells();
-	}
-
-	/**
-	 * get tr cells list
-	 * 
-	 * @return the list of tr cells
-	 */
-	public List[] getTrCellLists() {
-		return this._trCellLists;
-	}
-
-	/**
-	 * calculate row and column index for tr or td/th
-	 * 
-	 * @param node
-	 *            tr or td/th
-	 * @return the position
-	 */
-	public TableChildElementPosition getPosition(Node node) {
-		TableChildElementPosition position = new TableChildElementPosition();
-		if (node == null) {
-			return position;
-		}
-		String tagName = node.getLocalName();
-		if (IHTMLConstants.TAG_TR.equalsIgnoreCase(tagName)) {
-			List list = new ArrayList();
-			getTrElements(this._table, list);
-			for (int i = 0, size = list.size(); i < size; i++) {
-				Element tr = (Element) list.get(i);
-				if (tr == node) {
-					position.setRowIndex(i);
-					break;
-				}
-			}
-		} else if (IHTMLConstants.TAG_TD.equalsIgnoreCase(tagName)
-				|| IHTMLConstants.TAG_TH.equalsIgnoreCase(tagName)) {
-			Element tr = (Element) node.getParentNode();
-			TableChildElementPosition pos = getPosition(tr);
-			position.setRowIndex(pos.getRowIndex());
-			List[] lists = getTrCellLists();
-			List list = lists[pos.getRowIndex()];
-			for (int i = 0, size = list.size(); i < size; i++) {
-				Element td = (Element) list.get(i);
-				if (td == node) {
-					position.setColumnIndex(i);
-					break;
-				}
-			}
-		} else {
-			boolean hasTDParent = false;
-			Node childBackup = node;
-			while (!IHTMLConstants.TAG_TABLE.equalsIgnoreCase(childBackup
-					.getParentNode().getLocalName())) {
-				childBackup = childBackup.getParentNode();
-				String localName = childBackup.getLocalName();
-				if (IHTMLConstants.TAG_TD.equalsIgnoreCase(localName)
-						|| IHTMLConstants.TAG_TH.equalsIgnoreCase(localName)) {
-					hasTDParent = true;
-					break;
-				}
-			}
-			if (hasTDParent) {
-				position = getPosition(childBackup);
-			}
-		}
-		return position;
-	}
-
-	/**
-	 * get column count
-	 * 
-	 * @return the column count
-	 */
-	public int getColumnCount() {
-		List[] lists = this._trCellLists;
-		if (lists != null) {
-			int max = 0;
-			for (int i = 0, size = lists.length; i < size; i++) {
-				List list = lists[i];
-				if (list.size() > max) {
-					max = list.size();
-				}
-			}
-			return max;
-		}
-		return 0;
-	}
-
-	/**
-	 * judge whether there is columnspan>1 cell in the column
-	 * 
-	 * @param columnIndex
-	 *            column index in a table
-	 * @return true if there is columnspan>1 cell in the column
-	 */
-	public boolean hasColumnSpanElement(int columnIndex) {
-		List cells = getColumnCells(columnIndex);
-		if (cells != null) {
-			Iterator itr = cells.iterator();
-			while (itr.hasNext()) {
-				Element cell = (Element) itr.next();
-				int value = DOMUtil.getIntAttributeIgnoreCase(cell,
-						IHTMLConstants.ATTR_COLSPAN, 1);
-				if (value > 1) {
-					return true;
-				}
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * judge whether the column has cell affected by column span cell in
-	 * privious columns
-	 * 
-	 * @param columnIndex
-	 * @return true if the column has cell affected by column span cell in
-     * privious columns 
-	 */
-	public boolean isAffectedByColSpan(int columnIndex) {
-		int index = columnIndex;
-		while (--index >= 0) {
-			List cells = getColumnCells(index);
-			int max = countMaxColSpan(cells);
-			if (max > (columnIndex - index)) {
-				return true;
-			}
-		}
-
-		return false;
-	}
-
-	/**
-	 * get cells in the specified column of the table
-	 * 
-	 * @param columnIndex
-	 * @return the column cells
-	 */
-	public List getColumnCells(int columnIndex) {
-		List list = new ArrayList();
-
-		List[] lists = this._trCellLists;
-		for (int i = 0; i < lists.length; i++) {
-			List tempList = lists[i];
-			if (tempList.size() <= columnIndex) {
-				continue;
-			}
-			list.add(tempList.get(columnIndex));
-		}
-		return list;
-	}
-
-	/**
-	 * count max row span in the tr
-	 * 
-	 * @param tr
-	 * @return
-	 */
-	private static int countMaxRowSpan(Element tr) {
-		List list = DOMUtil.getElementChildren(tr);
-		int max = countMaxValue(list, IHTMLConstants.ATTR_ROWSPAN);
-		return max;
-	}
-
-	/**
-	 * count max attr value
-	 * 
-	 * @param list
-	 * @param attr
-	 * @return
-	 */
-	private static int countMaxValue(List list, String attr) {
-		int max = 1;
-		Iterator itr = list.iterator();
-		while (itr.hasNext()) {
-			Element ele = (Element) itr.next();
-			int value = DOMUtil.getIntAttributeIgnoreCase(ele, attr, 1);
-			if (value > max) {
-				max = value;
-			}
-		}
-		return max;
-	}
-
-	/**
-	 * count max col span in a column
-	 * 
-	 * @param list
-	 * @return
-	 */
-	private int countMaxColSpan(List list) {
-		int max = countMaxValue(list, IHTMLConstants.ATTR_COLSPAN);
-		return max;
-	}
-
-	/**
-	 * get fake element to fill tr cell
-	 * 
-	 * @return
-	 */
-	private Element getFakeElement() {
-		if (_fakeCell != null) {
-			return _fakeCell;
-		}
-		_fakeCell = this._table.getOwnerDocument().createElement("fake"); //$NON-NLS-1$
-		return _fakeCell;
-	}
-
-	/**
-	 * initial every tr cells according to th and td under each tr element
-	 * 
-	 * @param trList
-	 * @return
-	 */
-	private List[] initialTrCells(List trList) {
-		int size = trList.size();
-		List[] lists = new ArrayList[size];
-
-		if (trList != null) {
-			for (int i = 0, n = trList.size(); i < n; i++) {
-				lists[i] = new ArrayList();
-				Element tr = (Element) trList.get(i);
-				List domCells = DOMUtil.getElementChildren(tr);
-				Iterator itr = domCells.iterator();
-				while (itr.hasNext()) {
-					Element cell = (Element) itr.next();
-					lists[i].add(cell);
-					int colSpan = DOMUtil.getIntAttributeIgnoreCase(cell,
-							IHTMLConstants.ATTR_COLSPAN, 1);
-					while (--colSpan > 0) {
-						Element fakeElement = getFakeElement();
-						lists[i].add(fakeElement);
-					}
-				}
-			}
-
-		}
-
-		return lists;
-
-	}
-
-	/**
-	 * after initial tr cells,fill tr with fake cells if necessary.
-	 * 
-	 * @return
-	 */
-	private List[] fillTrCells() {
-		List list = new ArrayList();
-		getTrElements(this._table, list);
-
-		List[] lists = initialTrCells(list);
-		int size = lists.length;
-
-		int headRows = countSectionRows(this._table, IHTMLConstants.TAG_THEAD);
-		if (headRows > 0) {
-			List[] headList = new ArrayList[headRows];
-			for (int i = 0; i < headRows; i++) {
-				headList[i] = lists[i];
-			}
-			fillSectionTrCells(headList);
-		}
-
-		int footRows = countSectionRows(this._table, IHTMLConstants.TAG_TFOOT);
-		if (footRows > 0) {
-			List[] footList = new ArrayList[footRows];
-			for (int i = 0; i < footRows; i++) {
-				footList[i] = lists[headRows + i];
-			}
-			fillSectionTrCells(footList);
-		}
-
-		int bodyRows = size - headRows - footRows;
-		if (bodyRows > 0) {
-			int bodyCount = 1;
-			int k = 0;
-			List bodys = new ArrayList();
-			Element tr = (Element) list.get(headRows + footRows);
-			Node node = tr.getParentNode();
-			for (int i = 1; i < bodyRows; i++) {
-				Element tempTr = (Element) list.get(headRows + footRows + i);
-				if (tempTr.getParentNode() != node) {
-					node = tempTr.getParentNode();
-					bodys.add(new Integer(i - k));
-					k = i;
-					bodyCount++;
-				}
-			}
-			bodys.add(new Integer(bodyRows - k));
-
-			for (int j = 0; j < bodyCount; j++) {
-				int num = ((Integer) bodys.get(j)).intValue();
-				List[] bodyList = new ArrayList[num];
-				int m = headRows + footRows;
-
-				for (int i = 0; i < num; i++) {
-					bodyList[i] = lists[m + i];
-				}
-				fillSectionTrCells(bodyList);
-				m = m + num;
-			}
-
-		}
-
-		return lists;
-	}
-
-	/**
-	 * fill tr cells under each table section,like THEAD,TFOOT,TBODY.
-	 * 
-	 * @param lists
-	 */
-	private void fillSectionTrCells(List[] lists) {
-		Element cell = null;
-
-		if (lists != null) {
-			for (int i = 1, size = lists.length; i < size; i++) {
-				List insertPoints = new ArrayList();
-
-				for (int j = 0; j < i; j++) {
-					List list = lists[j];
-					for (int column = 0; column < list.size(); column++) {
-						cell = (Element) list.get(column);
-						if (cell.getTagName().equalsIgnoreCase("fake")) { //$NON-NLS-1$
-							continue;
-						}
-						int rowSpan = DOMUtil.getIntAttributeIgnoreCase(cell,
-								IHTMLConstants.ATTR_ROWSPAN, 1);
-						if (rowSpan > (i - j)) {
-							int colSpan = DOMUtil.getIntAttributeIgnoreCase(
-									cell, IHTMLConstants.ATTR_COLSPAN, 1);
-							insertPoints.add(new ColStructure(column, colSpan));
-						}
-					}
-				}
-				// there are fake column cell need to be inserted into this tr
-				if (insertPoints.size() > 0) {
-					Collections.sort(insertPoints);
-					List trCells = lists[i];
-
-					Iterator itr = insertPoints.iterator();
-					while (itr.hasNext()) {
-						ColStructure cls = (ColStructure) itr.next();
-						int loop = cls.getColSpan();
-						int column = cls.getColumn();
-						while (loop-- != 0) {
-							trCells.add(column++, getFakeElement());
-						}
-
-					}
-				}
-			}
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/DTManager.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/DTManager.java
deleted file mode 100644
index f62e2a5..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/DTManager.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager;
-
-import org.eclipse.jst.jsf.core.internal.tld.CMUtil;
-import org.eclipse.jst.pagedesigner.converter.ConverterFactoryRegistry;
-import org.eclipse.jst.pagedesigner.converter.IConverterFactory;
-import org.eclipse.jst.pagedesigner.converter.ITagConverter;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.internal.DTTagConverterFactory;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
-import org.w3c.dom.Element;
-
-/**
- * DTManager is the top-level entry point for design-time (DT) services, such
- * as tag converters and design-time information.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author Ian Trimble - Oracle
- */
-public class DTManager {
-
-	private static DTManager instance;
-	private IDTInfoFactory _dtInfoFactory;
-
-	private DTManager() {
-        // no external instantiation
-	}
-
-	/**
-	 * Gets the singleton DTManager instance.
-	 * 
-	 * @return The singleton DTManager instance.
-	 */
-	public static synchronized DTManager getInstance() {
-		if (instance == null) {
-			instance = new DTManager();
-		}
-		return instance;
-	}
-
-	/**
-	 * Gets an ITagConverter instance for the specified Element and mode.
-	 * 
-	 * @param element Element instance for which to locate and return an
-	 * ITagConverter instance.
-	 * @param mode Mode flag (use IConverterFactory constants).
-	 * @param document Target IDOMDocument instance.
-	 * @return An ITagConverter instance for the specified Element and mode.
-	 */
-	public ITagConverter getTagConverter(Element element, int mode, IDOMDocument document) {
-		ITagConverter tagConverter = null;
-		String nsURI = CMUtil.getElementNamespaceURI(element);
-		//try MD-driven approach
-		IConverterFactory tagConverterFactory = getTagConverterFactory(nsURI);
-		if (tagConverterFactory != null) {
-			tagConverter = tagConverterFactory.createConverter(element, mode);
-			if (tagConverter != null) {
-				tagConverter.setDestDocument(document);
-			} else {
-				//fallback to contributed (non-MD-driven) approach
-				tagConverter = ConverterFactoryRegistry.getInstance().createTagConverter(element, mode, document);
-			}
-		}
-		return tagConverter;
-	}
-
-	/**
-	 * Gets an IConverterFactory instance for the specified namespace URI.
-	 * 
-	 * @param nsURI Namespace URI.
-	 * @return An IConverterFactory instance for the specified namespace URI.
-	 */
-	protected IConverterFactory getTagConverterFactory(String nsURI) {
-		//TODO: future - expand to first look for registered factories
-		return new DTTagConverterFactory();
-	}
-
-	/**
-	 * Gets an IDTInfo instance for the specified Element.
-	 * 
-	 * @param element Element instance for which to locate and return IDTInfo
-	 * instance.
-	 * @return An IDTInfo instance for the specified Element.
-	 */
-	public IDTInfo getDTInfo(Element element) {
-		IDTInfo dtInfo = null;
-		String nsURI = CMUtil.getElementNamespaceURI(element);
-		IDTInfoFactory dtInfoFactory = getDTInfoFactory(nsURI);
-		if (dtInfoFactory != null) {
-			dtInfo = dtInfoFactory.getDTInfo(element);
-		}
-		return dtInfo;
-	}
-
-	/**
-	 * Gets an IDTInfoFactory instance for the specified namespace URI.
-	 * 
-	 * @param nsURI Namespace URI.
-	 * @return An IDTInfoFactory instance for the specified namespace URI.
-	 */
-	protected IDTInfoFactory getDTInfoFactory(String nsURI) {
-		if (_dtInfoFactory == null) {
-			_dtInfoFactory = new DefaultDTInfoFactory();
-		}
-		return _dtInfoFactory;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/DefaultDTInfo.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/DefaultDTInfo.java
deleted file mode 100644
index 6d57cfc..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/DefaultDTInfo.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager;
-
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.jst.jsf.common.metadata.Trait;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfo;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagConvertInfo;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo;
-
-/**
- * Default IDTInfo implementation.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author Ian Trimble - Oracle
- */
-public class DefaultDTInfo implements IDTInfo {
-
-	private DTInfo dtInfo = null;
-	private Trait trait = null;
-
-	/**
-	 * Constructs an instance that wraps the specified DTInfo instance.
-	 * 
-	 * @param dtInfo DTInfo (EMF model object) instance.
-	 * @param trait Trait instance that was queried to load this data.
-	 */
-	public DefaultDTInfo(DTInfo dtInfo, Trait trait) {
-		this.dtInfo = dtInfo;
-		this.trait = trait;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.internal.provisional.IDTInfo#getTagConvertInfo()
-	 */
-	public TagConvertInfo getTagConvertInfo() {
-		return dtInfo.getTagConvertInfo();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.internal.provisional.IDTInfo#getTagDecorateInfos()
-	 */
-	public List getTagDecorateInfos() {
-		return dtInfo.getTagDecorateInfos();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.internal.provisional.IDTInfo#getTagDecorateInfo(java.lang.String)
-	 */
-	public TagDecorateInfo getTagDecorateInfo(String id) {
-		TagDecorateInfo tdInfo = null;
-		EList tdInfos = dtInfo.getTagDecorateInfos();
-		Iterator itTDInfos = tdInfos.iterator();
-		while (itTDInfos.hasNext()) {
-			TagDecorateInfo curTDInfo = (TagDecorateInfo)itTDInfos.next();
-			if (curTDInfo.getId().equals(id)) {
-				tdInfo = curTDInfo;
-				break;
-			}
-		}
-		return tdInfo;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.internal.provisional.IDTInfo#getTrait()
-	 */
-	public Trait getTrait() {
-		return trait;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/DefaultDTInfoFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/DefaultDTInfoFactory.java
deleted file mode 100644
index e65f5dc..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/DefaultDTInfoFactory.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jst.jsf.common.metadata.Trait;
-import org.eclipse.jst.jsf.common.metadata.query.ITaglibDomainMetaDataModelContext;
-import org.eclipse.jst.jsf.common.metadata.query.TaglibDomainMetaDataQueryHelper;
-import org.eclipse.jst.jsf.core.internal.tld.CMUtil;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfo;
-import org.eclipse.jst.pagedesigner.utils.StructuredModelUtil;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-import org.w3c.dom.Element;
-
-/**
- * Default IDTInfoFactory implementation.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author Ian Trimble - Oracle
- */
-public class DefaultDTInfoFactory implements IDTInfoFactory {
-
-	/**
-	 * Key (in metadata) of IDTInfo trait.
-	 */
-	public static final String DTINFO_TRAIT_KEY = "dt-info"; //$NON-NLS-1$
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.internal.provisional.IDTInfoFactory#getDTInfo(org.w3c.dom.Element)
-	 */
-	public IDTInfo getDTInfo(Element element) {
-		IDTInfo dtInfo = null;
-		String nsURI = CMUtil.getElementNamespaceURI(element);
-		IProject project = getProject(element);
-		if (project != null) {
-			ITaglibDomainMetaDataModelContext context = TaglibDomainMetaDataQueryHelper.createMetaDataModelContext(project, nsURI);
-			if (context != null) {
-				Trait trait = TaglibDomainMetaDataQueryHelper.getTrait(context, element.getLocalName(), DTINFO_TRAIT_KEY);
-				if (trait != null) {
-					DTInfo dtInfoModelObject = (DTInfo)trait.getValue();
-					if (dtInfoModelObject != null) {
-						dtInfo = new DefaultDTInfo(dtInfoModelObject, trait);
-					}
-				}
-			}
-		}
-		return dtInfo;
-	}
-
-	/**
-	 * Gets the IProject instance that contains the model of the specified
-	 * Element.
-	 * 
-	 * @param element Element instance.
-	 * @return IProject instance that contains the model of the specified
-	 * Element.
-	 */
-	protected IProject getProject(Element element) {
-		IProject project = null;
-		if (element instanceof IDOMNode) {
-			IDOMModel model = ((IDOMNode)element).getModel();
-			if (model != null) {
-				project = StructuredModelUtil.getProjectFor(model);
-			}
-		}
-		return project;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/IDTInfo.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/IDTInfo.java
deleted file mode 100644
index 9ce9e07..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/IDTInfo.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager;
-
-import java.util.List;
-
-import org.eclipse.jst.jsf.common.metadata.Trait;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagConvertInfo;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo;
-
-/**
- * Encapsulates design-time (DT) information.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author Ian Trimble - Oracle
- */
-public interface IDTInfo {
-
-	/**
-	 * Gets the encapsulated TagConvertInfo instance.
-	 * 
-	 * @return TagConvertInfo instance.
-	 */
-	public TagConvertInfo getTagConvertInfo();
-
-	/**
-	 * Gets the collection of encapsulated TagDecorateInfo instances.
-	 * 
-	 * @return Collection of TagDecorateInfo instances.
-	 */
-	public List getTagDecorateInfos();
-
-	/**
-	 * Gets an encapsulated TagDecorateInfo instance matching specified ID.
-	 * 
-	 * @param id ID of desired TagDecorateInfo instance.
-	 * @return TagDecorateInfo instance matching specified ID.
-	 */
-	public TagDecorateInfo getTagDecorateInfo(String id);
-
-	/**
-	 * Gets the Trait instance that was queried to load the metadata.
-	 * 
-	 * @return Trait instance that was queried to load the metadata.
-	 */
-	public Trait getTrait();
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/IDTInfoFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/IDTInfoFactory.java
deleted file mode 100644
index 80f3b6d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/IDTInfoFactory.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager;
-
-import org.w3c.dom.Element;
-
-/**
- * Factory that provides IDTInfo instances.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author Ian Trimble - Oracle
- */
-public interface IDTInfoFactory {
-
-	/**
-	 * Gets an IDTInfo instance for the specified Element.
-	 * 
-	 * @param element Element instance for which to locate and return IDTInfo
-	 * instance.
-	 * @return An IDTInfo instance for the specified Element.
-	 */
-	public IDTInfo getDTInfo(Element element);
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/AbstractTagConverterContext.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/AbstractTagConverterContext.java
deleted file mode 100644
index b37242b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/AbstractTagConverterContext.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager.converter;
-
-import org.eclipse.jst.pagedesigner.converter.ConvertPosition;
-import org.eclipse.jst.pagedesigner.converter.ITagConverter;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.Text;
-
-/**
- * Abstract ITagConverter implementation of ITagConverterContext.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author Ian Trimble - Oracle
- */
-public abstract class AbstractTagConverterContext implements ITagConverterContext {
-
-	/**
-	 * ITagConverter instance.
-	 */
-	protected ITagConverter tagConverter;
-
-	/**
-	 * Instantiates an instance for the specified ITagConverter instance. 
-	 * @param tagConverter ITagConverter instance.
-	 */
-	public AbstractTagConverterContext(ITagConverter tagConverter) {
-		this.tagConverter = tagConverter;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.ITagConverterContext#addChild(org.w3c.dom.Node, org.eclipse.jst.pagedesigner.converter.ConvertPosition)
-	 */
-	public abstract void addChild(Node childNode, ConvertPosition position);
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.ITagConverterContext#copyChildren(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	public abstract void copyChildren(Element srcElement, Element destElement);
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.ITagConverterContext#createElement(java.lang.String)
-	 */
-	public abstract Element createElement(String tag);
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.ITagConverterContext#createText(java.lang.String)
-	 */
-	public abstract Text createText(String content);
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.ITagConverterContext#getHostElement()
-	 */
-	public Element getHostElement() {
-		Element element = null;
-		if (tagConverter != null) {
-			element = tagConverter.getHostElement(); 
-		}
-		return element;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/IOutputRenderer.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/IOutputRenderer.java
deleted file mode 100644
index 30263d7..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/IOutputRenderer.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager.converter;
-
-import org.w3c.dom.Element;
-
-/**
- * Produces output rendering for ITagConverter instances.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author Ian Trimble - Oracle
- */
-public interface IOutputRenderer {
-
-	/**
-	 * Uses the ITagConverterContext argument to produce output rendering.
-	 * 
-	 * @param tagConverterContext ITagConverterContext instance providing
-	 * ITagConverter-specific context and functionality.
-	 * @return Element instance representing top Element in resulting output
-	 * tree.
-	 * 
-     * TODO: let's parameterize the return type either with a generic type
-     * or with Object so that sub-classes can co-vary
-	 */
-	public Element render(ITagConverterContext tagConverterContext);
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/ITagConverterContext.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/ITagConverterContext.java
deleted file mode 100644
index b857c4e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/ITagConverterContext.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager.converter;
-
-import org.eclipse.jst.pagedesigner.converter.ConvertPosition;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.Text;
-
-/**
- * Represents ITagConverter-specific context and functionality.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author Ian Trimble - Oracle
- */
-public interface ITagConverterContext {
-
-	/**
-	 * Gets ITagConverter instance's host Element instance.
-	 * 
-	 * @return ITagConverter instance's host Element instance.
-	 */
-	public Element getHostElement();
-
-	/**
-	 * Creates an Element instance to be used in ITagConverter's Document
-	 * instance.
-	 * 
-	 * @param tag Name of element to be created.
-	 * @return Element instance to be used in ITagConverter's Document
-	 * instance.
-	 */
-	public Element createElement(String tag);
-
-	/**
-	 * Creates a Text node instance to be used in ITagConverter's Document
-	 * instance.
-	 * 
-	 * @param content Textual content of the created text node.
-	 * @return Text node instance to be used in ITagConverter's Document
-	 * instance.
-	 */
-	public Text createText(String content);
-
-	/**
-	 * Adds a child Node instance to ITagConverter's collection of Nodes
-	 * requiring subsequent processing.
-	 * 
-	 * @param childNode Child Node instance requiring subsequent processing.
-	 * @param position ConvertPosition instance describing child Node
-	 * instance's position, relative to another Node instance.
-	 */
-	public void addChild(Node childNode, ConvertPosition position);
-
-	/**
-	 * Add all child Element instances of srcElement to ITagConverter's
-	 * collection of Nodes requiring subsequent processing.
-	 * 
-	 * @param srcElement Source Element instance from which child Elements are
-	 * copied.
-	 * @param destElement Destination Element instance to which child Elements
-	 * will be relative.
-	 */
-	public void copyChildren(Element srcElement, Element destElement);
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/ITagConverterDecorator.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/ITagConverterDecorator.java
deleted file mode 100644
index 713245f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/ITagConverterDecorator.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager.converter;
-
-import org.eclipse.jst.pagedesigner.converter.ITagConverter;
-
-/**
- * Decorates an ITagConverter instance as appropriate (generally
- * client-specific decoration performed after tag conversion).
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author Ian Trimble - Oracle
- */
-public interface ITagConverterDecorator {
-
-	/**
-	 * Decorates the ITagConverter instance as appropriate.
-	 * 
-	 * @param tagConverter ITagConverter instance to be decorated.
-	 */
-	public void decorate(ITagConverter tagConverter);
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/ITransformOperation.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/ITransformOperation.java
deleted file mode 100644
index dfb847a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/ITransformOperation.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager.converter;
-
-import java.util.List;
-
-import org.w3c.dom.Element;
-
-/**
- * Defines an operation used during transformation of input Element instances
- * to output Element instances.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author Ian Trimble - Oracle
- * 
- * TODO: as with ITransformer, I'd like to consider
- * ITransfomOperation<SRC, RESULT>
- */
-public interface ITransformOperation {
-
-	/**
-	 * Transforms an input element instance to an output Element instance.
-	 * 
-	 * @param srcElement Original input Element instance.
-	 * @param curElement Current Element instance.
-	 * @return Resulting transformed Element instance.
-	 */
-	public Element transform(Element srcElement, Element curElement);
-
-	/**
-	 * Sets the ITagConverterContext instance allowing access to context and
-	 * functionality of the current ITagConverter instance.
-	 * 
-	 * @param tagConverterContext ITagConverterContext instance allowing access
-	 * to context and functionality of the current ITagConverter instance.
-     * 
-	 */
-	public void setTagConverterContext(ITagConverterContext tagConverterContext);
-
-	/**
-	 * Appends a child ITransformOperation instance.
-	 * 
-	 * @param operation Child ITransformOperation instance to be appended.
-	 */
-	public void appendChildOperation(ITransformOperation operation);
-
-	/**
-	 * Gets collection of child ITransformOperation instances.
-	 * 
-	 * @return Collection of child ITransformOperation instances (may be null).
-	 */
-	public List getChildOperations();
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/ITransformer.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/ITransformer.java
deleted file mode 100644
index 49e99f2..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/ITransformer.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager.converter;
-
-import org.w3c.dom.Element;
-
-/**
- * Transforms an original input Element instance to an output Element instance
- * by invoking a collection of ITransformOperation instances.  
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author Ian Trimble - Oracle
- */
-public interface ITransformer {
-
-	/**
-	 * Appends an ITransformOperation instance to the collection.
-	 * 
-	 * @param operation ITransformOperation instance to be appended.
-     * API: does this need to be on the interface or could it be pushed
-     * into the instance constructor (i.e. factory).
-	 */
-	public void appendTransformOperation(ITransformOperation operation);
-
-	/**
-	 * Transforms an original input Element instance to an output Element
-	 * instance, typically by invoking each ITransformOperation instance in
-	 * this instance's collection.
-	 * 
-	 * @param srcElement Original input Element instance.
-	 * @return Transformed output Element instance.
-	 * 
-     * TODO: I'd like to consider templating the generic ITransformer
-     * interface to ITransformer<I,O> and making this a normative instance
-     * case of ITransformer<Element, Element>
-	 */
-	public Element transform(Element srcElement);
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/internal/AbstractAttributeValueResolver.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/internal/AbstractAttributeValueResolver.java
deleted file mode 100644
index 3fbfae5..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/internal/AbstractAttributeValueResolver.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package org.eclipse.jst.pagedesigner.dtmanager.converter.internal;
-
-import org.w3c.dom.Element;
-
-/**
- *
- *
- */
-public abstract class AbstractAttributeValueResolver implements
-        IAttributeValueResolver
-{
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.dtmanager.converter.internal.IAttributeValueResolver#canResolve(org.w3c.dom.Element, org.w3c.dom.Element, java.lang.String)
-     */
-    public abstract boolean canResolve(Element originalElement,
-            Element convertedElement, String convertedAttrName,
-            final String convertedAttrValue);
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.dtmanager.converter.internal.IAttributeValueResolver#resolveAttribute(org.w3c.dom.Element, org.w3c.dom.Element, java.lang.String)
-     */
-    public abstract String resolveAttribute(Element originalElement,
-            Element convertedElement, String convertedAttrName,
-            final String convertedAttrValue);
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/internal/AttributeValueResolverRegistryReader.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/internal/AttributeValueResolverRegistryReader.java
deleted file mode 100644
index 5e171d1..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/internal/AttributeValueResolverRegistryReader.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dtmanager.converter.internal;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jst.jsf.common.internal.pde.AbstractSimpleClassExtensionRegistryReader;
-import org.eclipse.jst.pagedesigner.IJMTConstants;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class AttributeValueResolverRegistryReader extends
-        AbstractSimpleClassExtensionRegistryReader<IAttributeValueResolver>
-{
-    private final static AttributeValueResolverRegistryReader INSTANCE = new AttributeValueResolverRegistryReader();
-
-    /**
-     * Not externally instantiable.
-     */
-    private AttributeValueResolverRegistryReader()
-    {
-        super(PDPlugin.getPluginId(),
-                IJMTConstants.EXTENSION_POINT_PAGEDESIGNER,
-                "attributeValueResolver", //$NON-NLS-1$
-                "class", //$NON-NLS-1$
-                new CompareOrgEclipseJstContributorsLastComparator<IAttributeValueResolver>()
-        );
-    }
-
-    /**
-     * @return singleton instance.
-     */
-    public static AttributeValueResolverRegistryReader getInstance()
-    {
-        return INSTANCE;
-    }
-
-    @Override
-    protected void handleLoadFailure(CoreException ce)
-    {
-        PDPlugin.log("Loading Attribute Value Resolver extensions", ce); //$NON-NLS-1$
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/internal/DTHTMLOutputRenderer.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/internal/DTHTMLOutputRenderer.java
deleted file mode 100644
index b546750..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/internal/DTHTMLOutputRenderer.java
+++ /dev/null
@@ -1,144 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager.converter.internal;
-
-import java.util.Iterator;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.jst.pagedesigner.dtmanager.DTManager;
-import org.eclipse.jst.pagedesigner.dtmanager.IDTInfo;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.IOutputRenderer;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.ITagConverterContext;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.ITransformOperation;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.ITransformer;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.TransformOperationFactory;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Operation;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Parameter;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagConvertInfo;
-import org.w3c.dom.Element;
-
-/**
- * Design-time metadata-driven HTML IOutputRenderer implementation.
- * 
- * @author Ian Trimble - Oracle
- */
-public class DTHTMLOutputRenderer implements IOutputRenderer {
-
-	private ITagConverterContext tagConverterContext;
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.IOutputRenderer#render(org.eclipse.jst.pagedesigner.dtmanager.converter.ITagConverterContext)
-	 */
-	public Element render(ITagConverterContext newTagConverterContext) {
-		this.tagConverterContext = newTagConverterContext;
-		Element srcElement = newTagConverterContext.getHostElement();
-		Element resultElement = null;
-		if (srcElement != null) {
-			ITransformer transformer = createTransformerFromDTInfo(srcElement);
-			if (transformer != null) {
-				resultElement = transformer.transform(srcElement);
-			}
-		}
-		return resultElement;
-	}
-
-	/**
-	 * Configures and returns an ITransformer instance for the specified source
-	 * Element.
-	 * 
-	 * @param element Element for which to configure and return an ITransformer
-	 * instance.
-	 * @return Configured ITransformer instance for the specified Element.
-	 */
-	protected ITransformer createTransformerFromDTInfo(Element element) {
-		ITransformer transformer = null;
-		DTManager dtManager = DTManager.getInstance();
-		IDTInfo dtInfo = dtManager.getDTInfo(element);
-		if (dtInfo != null) {
-			TagConvertInfo tcInfo = dtInfo.getTagConvertInfo();
-			if (tcInfo != null) {
-				transformer = new DefaultTransformer(tagConverterContext);
-				EList operations = tcInfo.getOperations();
-				if (!appendOperationsToTransformer(transformer, operations, dtInfo)) {
-					transformer = null;
-				}
-			}
-		}
-		return transformer;
-	}
-
-	private boolean appendOperationsToTransformer(ITransformer transformer, EList operations, IDTInfo dtInfo) {
-		Iterator itOperations = operations.iterator();
-		while (itOperations.hasNext()) {
-			Operation operation = (Operation)itOperations.next();
-			ITransformOperation currentTransformOperation = null;
-			String opID = operation.getId();
-			String[] params = getParamsArray(operation);
-			currentTransformOperation =
-				TransformOperationFactory.getInstance().getTransformOperation(opID, params);
-			if (currentTransformOperation != null) {
-				transformer.appendTransformOperation(currentTransformOperation);
-				EList childOperations = operation.getOperations();
-				if (childOperations != null && childOperations.size() > 0) {
-					if (!appendChildOperations(currentTransformOperation, childOperations, dtInfo)) {
-						return false;
-					}
-				}
-			} else {
-				return false;
-			}
-		}
-		return true;
-	}
-
-	private boolean appendChildOperations(ITransformOperation parentOperation, EList operations, IDTInfo dtInfo) {
-		Iterator itOperations = operations.iterator();
-		while (itOperations.hasNext()) {
-			Operation operation = (Operation)itOperations.next();
-			ITransformOperation currentTransformOperation = null;
-			String opID = operation.getId();
-			String[] params = getParamsArray(operation);
-			currentTransformOperation =
-				TransformOperationFactory.getInstance().getTransformOperation(opID, params);
-			if (currentTransformOperation != null) {
-				parentOperation.appendChildOperation(currentTransformOperation);
-				EList childOperations = operation.getOperations();
-				if (childOperations != null && childOperations.size() > 0) {
-					if (!appendChildOperations(currentTransformOperation, childOperations, dtInfo)) {
-						return false;
-					}
-				}
-				
-			} else {
-				return false;
-			}
-		}
-		return true;
-	}
-
-	private String[] getParamsArray(Operation operation) {
-		EList paramsList = operation.getParameters();
-		if (paramsList != null) {
-			Iterator itParamsList = paramsList.iterator();
-			String[] paramsArray = new String[paramsList.size()];
-			int index = 0;
-			while (itParamsList.hasNext()) {
-				Parameter param = (Parameter)itParamsList.next();
-				paramsArray[index++] = param.getValue();
-			}
-			return paramsArray;
-		}
-		//fall through - no params
-		return new String[0];
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/internal/DTTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/internal/DTTagConverter.java
deleted file mode 100644
index f0d5099..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/internal/DTTagConverter.java
+++ /dev/null
@@ -1,467 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager.converter.internal;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jst.pagedesigner.converter.ConvertPosition;
-import org.eclipse.jst.pagedesigner.converter.IDOMFactory;
-import org.eclipse.jst.pagedesigner.converter.ITagConverter;
-import org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo;
-import org.eclipse.jst.pagedesigner.editors.palette.TagImageManager;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.wst.sse.core.internal.provisional.INodeAdapter;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.w3c.dom.Text;
-
-/**
- * Design-Time metadata-driven tag converter.
- * 
- * @author Ian Trimble - Oracle
- */
-public class DTTagConverter implements
-	ITagConverter, ITagEditInfo, INodeAdapter, IDOMFactory {
-
-	private Element hostElement;
-	private Element resultElement;
-	private Image visualImage;
-	private ImageDescriptor visualImageDescriptor;
-	private IDOMDocument destDocument;
-	private List childNodeList = Collections.EMPTY_LIST;
-	private NodeConvertPositionMap childVisualPositionMap;
-	private List nonVisualChildElementList = Collections.EMPTY_LIST;
-	private boolean isMultiLevel = false;
-	private boolean isVisualByHTML = true;
-	private boolean isWidget = false;
-	private int mode;
-	private int minHeight;
-	private int minWidth;
-	private boolean needBorderDecorator = false;
-	private boolean needTableDecorator = false;
-
-	/**
-	 * Constructs an instance for the specified source Element.
-	 * 
-	 * @param hostElement Source Element instance.
-	 */
-	public DTTagConverter(Element hostElement) {
-		this.hostElement = hostElement;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#convertRefresh(java.lang.Object)
-	 */
-	public void convertRefresh(Object context) {
-		childNodeList = new ArrayList();
-		childVisualPositionMap = new NodeConvertPositionMap();
-		nonVisualChildElementList = new ArrayList();
-		resultElement = new DTHTMLOutputRenderer().render(new DTTagConverterContext(this));
-		new DTTagConverterDecorator().decorate(this);
-		if (resultElement instanceof INodeNotifier) {
-			((INodeNotifier)resultElement).addAdapter(this);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#dispose()
-	 */
-	public void dispose() {
-		visualImage = null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#getChildModeList()
-	 */
-	public List getChildModeList() {
-		//need to reset the NodeConvertPositionMap at this time
-		childVisualPositionMap.reset();
-		return childNodeList;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#getChildVisualPosition(org.w3c.dom.Node)
-	 */
-	public ConvertPosition getChildVisualPosition(Node childModel) {
-		return childVisualPositionMap.get(childModel);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#getHostElement()
-	 */
-	public Element getHostElement() {
-		return hostElement;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#getNonVisualChildren()
-	 */
-	public List getNonVisualChildren() {
-		return nonVisualChildElementList;
-	}
-
-	/**
-	 * Sets the result Element instance; allows decorators to set an "unknown
-	 * tag" Element when tag conversion has not produced a result.
-	 * 
-	 * @param resultElement Result Element instance to be set.
-	 */
-	public void setResultElement(Element resultElement) {
-		this.resultElement = resultElement;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#getResultElement()
-	 */
-	public Element getResultElement() {
-		return resultElement;
-	}
-
-	/**
-	 * Sets the visual Image instance.
-	 * 
-	 * @param visualImage Visual Image instance.
-	 */
-	public void setVisualImage(Image visualImage) {
-		this.visualImage = visualImage;
-	}
-
-	/**
-	 * Sets the visual ImageDescriptor instance.
-	 * 
-	 * @param imageDescriptor Visual ImageDescriptor instance.
-	 */
-	public void setVisualImageDescriptor(ImageDescriptor imageDescriptor) {
-		this.visualImageDescriptor = imageDescriptor;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#getVisualImage()
-	 */
-	public Image getVisualImage() {
-		if (visualImage == null && visualImageDescriptor != null) {
-			visualImage = TagImageManager.getOrCreateImage(visualImageDescriptor);
-		}
-		return visualImage;
-	}
-
-	/**
-	 * Sets the "isMultiLevel" flag; allows decorators to manipulate this
-	 * setting.
-	 * 
-	 * @param isMultiLevel Sets the "isMultiLevel" flag to true or false.
-	 */
-	public void setMultiLevel(boolean isMultiLevel) {
-		this.isMultiLevel = isMultiLevel;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isMultiLevel()
-	 */
-	public boolean isMultiLevel() {
-		return isMultiLevel;
-	}
-
-	/**
-	 * Sets the "isVisualByHTML" flag; allows decorators to manipulate this
-	 * setting.
-	 * 
-	 * @param isVisualByHTML Sets the "isVisualByHTML" flag to true or false.
-	 */
-	public void setVisualByHTML(boolean isVisualByHTML) {
-		this.isVisualByHTML = isVisualByHTML;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isVisualByHTML()
-	 */
-	public boolean isVisualByHTML() {
-		return isVisualByHTML;
-	}
-
-	/**
-	 * Sets the "isWidget" flag; allows decorators to manipulate this setting.
-	 * 
-	 * @param isWidget Sets the "isWidget" flag to true or false.
-	 */
-	public void setWidget(boolean isWidget) {
-		this.isWidget = isWidget;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isWidget()
-	 */
-	public boolean isWidget() {
-		return isWidget;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#setDestDocument(org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument)
-	 */
-	public void setDestDocument(IDOMDocument destDocument) {
-		this.destDocument = destDocument;
-	}
-
-	/**
-	 * Gets the IDOMDocument instance on which new Nodes are created.
-	 * 
-	 * @return IDOMDocument instance.
-	 */
-	public IDOMDocument getDestDocument() {
-		IDOMDocument document = null;
-		if (destDocument != null) {
-			document = destDocument;
-		} else {
-			document = (IDOMDocument)hostElement.getOwnerDocument();
-		}
-		return document;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#setMode(int)
-	 */
-	public void setMode(int mode) {
-		this.mode = mode;
-	}
-
-	/**
-	 * Gets this instance's "mode", as set by setMode(int mode).
-	 * 
-	 * @return This instance's "mode".
-	 */
-	public int getMode() {
-		return mode;
-	}
-
-	/**
-	 * Sets the desired minimum height of the visual representation; allows
-	 * decorators to manipulate this setting.
-	 * 
-	 * @param minHeight The desired minimum height of the visual
-	 * representation.
-	 */
-	public void setMinHeight(int minHeight) {
-		this.minHeight = minHeight;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo#getMinHeight()
-	 */
-	public int getMinHeight() {
-		return minHeight;
-	}
-
-	/**
-	 * Sets the desired minimum width of the visual representation; allows
-	 * decorators to manipulate this setting.
-	 * 
-	 * @param minWidth The desired minimum width of the visual
-	 * representation.
-	 */
-	public void setMinWidth(int minWidth) {
-		this.minWidth = minWidth;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo#getMinWidth()
-	 */
-	public int getMinWidth() {
-		return minWidth;
-	}
-
-	/**
-	 * Sets the "needBorderDecorator" flag; allows decorators to manipulate
-	 * this setting.
-	 * 
-	 * @param needBorderDecorator Sets the "needBorderDecorator" flag to true
-	 * or false.
-	 */
-	public void setNeedBorderDecorator(boolean needBorderDecorator) {
-		this.needBorderDecorator = needBorderDecorator;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo#needBorderDecorator()
-	 */
-	public boolean needBorderDecorator() {
-		return needBorderDecorator;
-	}
-
-	/**
-	 * Sets the "needTableDecorator" flag; allows decorators to manipulate
-	 * this setting.
-	 * 
-	 * @param needTableDecorator Sets the "needTableDecorator" flag to true
-	 * or false.
-	 */
-	public void setNeedTableDecorator(boolean needTableDecorator) {
-		this.needTableDecorator = needTableDecorator;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo#needTableDecorator()
-	 */
-	public boolean needTableDecorator() {
-		return needTableDecorator;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.sse.core.internal.provisional.INodeAdapter#isAdapterForType(java.lang.Object)
-	 */
-	public boolean isAdapterForType(Object type) {
-		if (type == ITagEditInfo.class) {
-			return true;
-		}
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.sse.core.internal.provisional.INodeAdapter#notifyChanged(org.eclipse.wst.sse.core.internal.provisional.INodeNotifier, int, java.lang.Object, java.lang.Object, java.lang.Object, int)
-	 */
-	public void notifyChanged(INodeNotifier notifier, int eventType,
-			Object changedFeature, Object oldValue, Object newValue, int pos) {
-		//do nothing
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.converter.IDOMFactory#createElement(java.lang.String)
-	 */
-	public Element createElement(String tag) {
-		return getDestDocument().createElement(tag);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.converter.IDOMFactory#createText(java.lang.String)
-	 */
-	public Text createText(String content) {
-		return getDestDocument().createTextNode(content);
-	}
-
-	/**
-	 * Adds a child Node to the collection of Nodes requiring subsequent tag
-	 * conversion.
-	 * 
-	 * @param childNode Node instance to be added.
-	 * @param position ConvertPosition instance describing indexed position
-	 * relative to another Node in the Document.
-	 */
-	public void addChild(Node childNode, ConvertPosition position) {
-		childNodeList.add(childNode);
-		childVisualPositionMap.put(childNode, position);
-	}
-
-	/**
-	 * Adds all child Nodes to the collection of Nodes requiring subsequent tag
-	 * conversion.
-	 * 
-	 * @param srcElement Source Element for which all child Nodes should be
-	 * added.
-	 * @param destElement Element to which added Nodes are relative.
-	 */
-	public void copyChildren(Element srcElement, Element destElement) {
-		int index = 0;
-		NodeList childNodes = srcElement.getChildNodes();
-		for (int i = 0; i < childNodes.getLength(); i++) {
-			Node curNode = childNodes.item(i); 
-			if (
-					curNode.getNodeType() == Node.ELEMENT_NODE ||
-					curNode.getNodeType() == Node.TEXT_NODE ||
-					curNode.getNodeType() == Node.CDATA_SECTION_NODE) {
-				addChild(curNode, new ConvertPosition(destElement, index++));
-			}
-		}
-	}
-
-	/**
-	 * Adds a non-visual child Element to the collection of non-visual
-	 * children (subsequently retrieved via a call to "getNonVisualChildren".
-	 * 
-	 * @param childElement Child Element to be added.
-	 */
-	public void addNonVisualChildElement(Element childElement) {
-		nonVisualChildElementList.add(childElement);
-	}
-
-	/**
-	 * Supports multiple ConvertPosition instances associated with a single
-	 * Node instance.
-	 */
-	private class NodeConvertPositionMap {
-
-		private Map mapOfConvertPositions = new HashMap();
-		private Map mapOfIndexes = new HashMap();
-
-		/**
-		 * Puts a ConvertPosition instance for the specified Node instance into
-		 * the map.
-		 * 
-		 * @param node Node instance for which the ConvertPosition is to be
-		 * applied.
-		 * @param convertPosition ConvertPosition instance for the specified
-		 * Node instance.
-		 */
-		public void put(Node node, ConvertPosition convertPosition) {
-			List convertPositions = (List)mapOfConvertPositions.get(node);
-			if (convertPositions == null) {
-				convertPositions = new ArrayList();
-				mapOfConvertPositions.put(node, convertPositions);
-			}
-			convertPositions.add(convertPosition);
-		}
-
-		/**
-		 * Gets the current ConvertPosition instance for the specified Node
-		 * instance. Note that each time this is called without a reset having
-		 * occurred, the next ConvertPosition instance mapped to the Node
-		 * instance is returned.
-		 * 
-		 * @param node Node instance for which a ConvertPosition instance is
-		 * being requested.
-		 * @return the current ConvertPosition instance for the specified Node
-		 * instance.
-		 */
-		public ConvertPosition get(Node node) {
-			ConvertPosition convertPosition = null;
-			List convertPositions = (List)mapOfConvertPositions.get(node);
-			if (convertPositions != null) {
-				int index;
-				Object obj = mapOfIndexes.get(node);
-				if (obj != null) {
-					index = ((Integer)obj).intValue();
-				} else {
-					index = 0;
-				}
-				convertPosition = (ConvertPosition)convertPositions.get(index);
-				mapOfIndexes.put(node, new Integer(++index));
-			}
-			return convertPosition;
-		}
-
-		/**
-		 * Resets the concept of "current" ConvertPosition instance for all
-		 * Node instances. Typically called when the List of child Nodes is
-		 * retrieved.
-		 */
-		public void reset() {
-			mapOfIndexes.clear();
-		}
-
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/internal/DTTagConverterContext.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/internal/DTTagConverterContext.java
deleted file mode 100644
index 2316f4e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/internal/DTTagConverterContext.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager.converter.internal;
-
-import org.eclipse.jst.pagedesigner.converter.ConvertPosition;
-import org.eclipse.jst.pagedesigner.converter.IConverterFactory;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.AbstractTagConverterContext;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.Text;
-
-/**
- * Design-time tag converter implementation of ITagConverterContext.
- * 
- * @author Ian Trimble - Oracle
- */
-public class DTTagConverterContext extends AbstractTagConverterContext {
-
-	/**
-	 * Constructs an instance for the specified DTTagConverter instance.
-	 * 
-	 * @param tagConverter DTTagConverter instance.
-	 */
-	public DTTagConverterContext(DTTagConverter tagConverter) {
-		super(tagConverter);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.ITagConverterContext#createElement(java.lang.String)
-	 */
-	public Element createElement(String tag) {
-		Element element = null;
-		if (tagConverter != null) {
-			element = ((DTTagConverter)tagConverter).createElement(tag);
-		}
-		return element;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.ITagConverterContext#createText(java.lang.String)
-	 */
-	public Text createText(String content) {
-		Text text = null;
-		if (tagConverter != null) {
-			text = ((DTTagConverter)tagConverter).createText(content);
-		}
-		return text;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.ITagConverterContext#addChild(org.w3c.dom.Node, org.eclipse.jst.pagedesigner.converter.ConvertPosition)
-	 */
-	public void addChild(Node childNode, ConvertPosition position) {
-		if (tagConverter != null) {
-			((DTTagConverter)tagConverter).addChild(childNode, position);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.ITagConverterContext#copyChildren(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	public void copyChildren(Element srcElement, Element destElement) {
-		if (tagConverter != null) {
-			((DTTagConverter)tagConverter).copyChildren(srcElement, destElement);
-		}
-	}
-
-	/**
-	 * Utility method to get the current converter mode. Values are
-	 * defined in <code>IConverterFactory</code>.
-	 * 
-	 * <br>This method is available on the DTTagConverter but was not
-	 * part of the ITagConverter and not available as a public API.
-	 * The addition of this method allows an ITransformOperation for
-	 * a DTTagConverter to get at the mode.
-	 * See https://bugs.eclipse.org/bugs/show_bug.cgi?id=252861 
-	 * 
-	 * @return the converter mode. If unable to get the mode, return -1.
-	 */
-	public int getMode() {
-		if (tagConverter != null) {
-			return ((DTTagConverter) tagConverter).getMode();
-		}
-
-		return IConverterFactory.MODE_DESIGNER;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/internal/DTTagConverterDecorator.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/internal/DTTagConverterDecorator.java
deleted file mode 100644
index 124c1ba..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/internal/DTTagConverterDecorator.java
+++ /dev/null
@@ -1,462 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dtmanager.converter.internal;
-
-import java.net.URL;
-
-import javax.servlet.jsp.el.ELException;
-import javax.xml.xpath.XPath;
-import javax.xml.xpath.XPathConstants;
-import javax.xml.xpath.XPathExpressionException;
-import javax.xml.xpath.XPathFactory;
-
-import org.eclipse.core.runtime.ISafeRunnable;
-import org.eclipse.core.runtime.SafeRunner;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jst.jsf.common.metadata.Trait;
-import org.eclipse.jst.jsf.common.metadata.internal.IImageDescriptorProvider;
-import org.eclipse.jst.jsf.common.metadata.internal.IMetaDataSourceModelProvider;
-import org.eclipse.jst.jsf.common.metadata.internal.IResourceURLProvider;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.converter.IConverterFactory;
-import org.eclipse.jst.pagedesigner.converter.ITagConverter;
-import org.eclipse.jst.pagedesigner.dtmanager.DTManager;
-import org.eclipse.jst.pagedesigner.dtmanager.IDTInfo;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.ITagConverterDecorator;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.ResolveAttributeValue;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo;
-import org.eclipse.jst.pagedesigner.preview.PageExpressionContext;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.w3c.dom.Text;
-
-/**
- * ITagConverterDecorator implementation for DTTagConverter.
- * 
- * @author Ian Trimble - Oracle
- */
-public class DTTagConverterDecorator implements ITagConverterDecorator
-{
-
-    private static final String DECORATE_INFO_ID_DESIGN = "vpd-decorate-design"; //$NON-NLS-1$
-    private static final String DECORATE_INFO_ID_PREVIEW = "vpd-decorate-preview"; //$NON-NLS-1$
-    private static final String MD_PLUGIN_LOCATION = "$metadata-plugin-location$"; //$NON-NLS-1$
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see
-     * org.eclipse.jst.pagedesigner.dtmanager.converter.ITagConverterDecorator
-     * #decorate(org.eclipse.jst.pagedesigner.converter.ITagConverter)
-     */
-    public void decorate(ITagConverter tagConverter)
-    {
-        if (!(tagConverter instanceof DTTagConverter))
-        {
-            throw new IllegalArgumentException(
-                    "ITagConverter argument must be an instance of DTTagConverter"); //$NON-NLS-1$
-        }
-        DTTagConverter dtTagConverter = (DTTagConverter) tagConverter;
-
-        if (dtTagConverter.getMode() == IConverterFactory.MODE_DESIGNER)
-        {
-            decorateFromDTInfo(dtTagConverter, DECORATE_INFO_ID_DESIGN);
-        } else if (dtTagConverter.getMode() == IConverterFactory.MODE_PREVIEW)
-        {
-            decorateFromDTInfo(dtTagConverter, DECORATE_INFO_ID_PREVIEW);
-        }
-
-        if (tagConverter.getResultElement() == null
-                && tagConverter.isVisualByHTML())
-        {
-            createUnknownTagRepresentation(dtTagConverter);
-        }
-    }
-
-    /**
-     * Performs decoration of the specified DTTagConverter instance from IDTInfo
-     * (metadata) for the specified (by ID) TagDecorateInfo.
-     * 
-     * @param dtTagConverter
-     *            DTTagConverter instance.
-     * @param tagDecorateInfoID
-     *            ID of the TagDecorateInfo to be located in metadata.
-     */
-    protected void decorateFromDTInfo(DTTagConverter dtTagConverter,
-            String tagDecorateInfoID)
-    {
-        Element srcElement = dtTagConverter.getHostElement();
-        DTManager dtManager = DTManager.getInstance();
-        IDTInfo dtInfo = dtManager.getDTInfo(srcElement);
-        if (dtInfo != null)
-        {
-            TagDecorateInfo tdInfo = dtInfo
-                    .getTagDecorateInfo(tagDecorateInfoID);
-            if (tdInfo != null)
-            {
-                dtTagConverter.setMultiLevel(tdInfo.isMultiLevel());
-                dtTagConverter.setNeedBorderDecorator(tdInfo
-                        .isNeedBorderDecorator());
-                dtTagConverter.setNeedTableDecorator(tdInfo
-                        .isNeedTableDecorator());
-                if (tdInfo.isNonVisual())
-                {
-                    setNonVisual(dtTagConverter, dtInfo, tdInfo
-                            .getNonVisualImagePath());
-                }
-                if (tdInfo.isResolveChildText())
-                {
-                    resolveChildText(dtTagConverter.getResultElement(), dtInfo);
-                }
-                if (tdInfo.isSetNonVisualChildElements())
-                {
-                    setNonVisualChildElements(dtTagConverter, srcElement);
-                }
-                dtTagConverter.setWidget(tdInfo.isWidget());
-                dtTagConverter.setMinHeight(tdInfo.getMinHeight());
-                dtTagConverter.setMinWidth(tdInfo.getMinWidth());
-                ResolveAttributeValue resAttrValue = tdInfo
-                        .getResolveAttributeValue();
-                if (resAttrValue != null)
-                {
-                    String attributeName = resAttrValue.getAttributeName();
-                    if (attributeName != null && attributeName.length() > 0)
-                    {
-                        resolveAttributeValue(dtTagConverter.getHostElement(),
-                                dtTagConverter.getResultElement(),
-                                attributeName, dtInfo, tagDecorateInfoID);
-                    }
-                }
-            }
-        }
-    }
-
-    /**
-     * Creates a visual representation result Element for an unknown tag.
-     * 
-     * @param dtTagConverter
-     *            DTTagConverter instance.
-     */
-    protected void createUnknownTagRepresentation(DTTagConverter dtTagConverter)
-    {
-        Element element = dtTagConverter.createElement("span"); //$NON-NLS-1$
-        element.setAttribute("style", "color:red;font-weight:bold;"); //$NON-NLS-1$ //$NON-NLS-2$
-        Text text = dtTagConverter
-                .createText("<" + dtTagConverter.getHostElement().getTagName() + "/>"); //$NON-NLS-1$ //$NON-NLS-2$
-        element.appendChild(text);
-        dtTagConverter.setResultElement(element);
-        dtTagConverter.setWidget(true);
-    }
-
-    /**
-     * Adds child Elements of the specified source Element to the specified
-     * DTTagConverter instance's collection of non-visual children.
-     * 
-     * @param dtTagConverter
-     *            DTTagConverter instance.
-     * @param srcElement
-     *            Source Element for which child Elements are to be added.
-     */
-    protected void setNonVisualChildElements(DTTagConverter dtTagConverter,
-            Element srcElement)
-    {
-        NodeList childNodes = srcElement.getChildNodes();
-        for (int i = 0; i < childNodes.getLength(); i++)
-        {
-            Node curNode = childNodes.item(i);
-            if (curNode.getNodeType() == Node.ELEMENT_NODE)
-            {
-                dtTagConverter.addNonVisualChildElement((Element) curNode);
-            }
-        }
-    }
-
-    /**
-     * Performs simple EL resolution for the child Text Node of the specified
-     * source Element instance.
-     * 
-     * @param srcElement
-     *            Source Element for which child Text Node EL resolution is to
-     *            be performed.
-     * @param dtInfo
-     *            IDTInfo instance.
-     */
-    protected void resolveChildText(Element srcElement, IDTInfo dtInfo)
-    {
-        if (srcElement != null)
-        {
-            NodeList childNodes = srcElement.getChildNodes();
-            for (int i = 0; i < childNodes.getLength(); i++)
-            {
-                Node childNode = childNodes.item(i);
-                if (childNode.getNodeType() == Node.TEXT_NODE)
-                {
-                    Text textNode = (Text) childNode;
-                    String textNodeValue = textNode.getNodeValue();
-                    try
-                    {
-                        String newTextNodeValue;
-                        if (textNodeValue.contains(MD_PLUGIN_LOCATION))
-                        {
-                            newTextNodeValue = resolveMDPluginLocation(
-                                    textNodeValue, dtInfo);
-                        } else
-                        {
-                            newTextNodeValue = (String) PageExpressionContext
-                                    .getCurrent().evaluateExpression(
-                                            textNodeValue, String.class, null);
-                        }
-                        if (newTextNodeValue != null
-                                && !textNodeValue.equals(newTextNodeValue))
-                        {
-                            textNode.setNodeValue(newTextNodeValue);
-                        }
-                    } catch (Exception ex)
-                    {
-                        // ignore - could not resolve, do not change existing
-                        // value
-                    }
-                }
-            }
-        }
-    }
-
-    /**
-     * Performs simple EL resolution for the value of the specified attribute of
-     * the specified Element.
-     * 
-     * @param srcElement
-     * 
-     * @param targetElement
-     *            Source Element instance.
-     * @param attributeName
-     *            Name of attribute for which the value should be resolved.
-     * @param dtInfo
-     *            IDTInfo instance.
-     * @param tagDecorateInfoID 
-     */
-    protected void resolveAttributeValue(Element srcElement,
-            Element targetElement, String attributeName, IDTInfo dtInfo, 
-            String tagDecorateInfoID)
-    {
-        if (targetElement != null)
-        {
-            String oldAttributeValue = null;
-            String targetAttributeName = attributeName;
-            // determine if attributeName is XPath and re-target as appropriate
-            if (attributeName.contains("/")) { //$NON-NLS-1$
-                int lastSlashPos = attributeName.lastIndexOf("/"); //$NON-NLS-1$
-                String xPathExpression = attributeName.substring(0,
-                        lastSlashPos);
-                XPath xPath = XPathFactory.newInstance().newXPath();
-                try
-                {
-                    Object resultObject = xPath.evaluate(xPathExpression,
-                            targetElement, XPathConstants.NODE);
-                    if (resultObject instanceof Element)
-                    {
-                        targetElement = (Element) resultObject;
-                        targetAttributeName = attributeName
-                                .substring(lastSlashPos + 1);
-                    }
-                    else if (resultObject instanceof Text)
-                    {
-                        Node parentNode = ((Text)resultObject).getParentNode();
-                        if (parentNode instanceof Element)
-                        {
-                            parentNode.normalize();
-                            targetAttributeName = IAttributeValueResolver.TEXT_NODE_KEY;
-                            oldAttributeValue = ((Text)resultObject).getNodeValue();
-                        }
-                    }
-                }
-                catch (XPathExpressionException xee)
-                {
-                    // could not evaluate - leave targetElement and
-                    // targetAttributeName unchanged
-                }
-            }
-
-            
-            if (!IAttributeValueResolver.TEXT_NODE_KEY.equals(targetAttributeName))
-            {
-                oldAttributeValue = targetElement.getAttribute(targetAttributeName);
-            }
-
-            if (oldAttributeValue != null && oldAttributeValue.length() > 0)
-            {
-                String newAttributeValue;
-                if (oldAttributeValue.contains(MD_PLUGIN_LOCATION))
-                {
-                    newAttributeValue = resolveMDPluginLocation(
-                            oldAttributeValue, dtInfo);
-                }
-                else
-                {
-                    newAttributeValue = resolveAttributeValue(srcElement,
-                            targetElement, targetAttributeName,
-                            oldAttributeValue, tagDecorateInfoID);
-                }
-                if (newAttributeValue != null
-                        && !oldAttributeValue.equals(newAttributeValue))
-                {
-                    if (IAttributeValueResolver.TEXT_NODE_KEY
-                            .equals(targetAttributeName))
-                    {
-                        for (int i = targetElement.getChildNodes().getLength()-1; i >= 0; i--)
-                        {
-                            Node childNode = targetElement.getChildNodes().item(i);
-                            if (childNode.getNodeType() == Node.TEXT_NODE)
-                            {
-                                targetElement.removeChild(childNode);
-                            }
-                        }
-                        targetElement.appendChild(targetElement.getOwnerDocument().createTextNode(newAttributeValue));
-                    }
-                    else
-                    {
-                        targetElement.setAttribute(targetAttributeName,
-                                newAttributeValue);
-                    }
-                }
-            }
-        }
-    }
-
-    private String resolveAttributeValue(final Element originalElement,
-            final Element convertedElement,
-            final String convertedAttributeName, final String oldAttributeValue,
-            final String tagDecorateInfoID)
-    {
-        String newValue = null;
-        boolean valueResolved = false;
-        final String[] result = new String[1];
-
-        for (final IAttributeValueResolver resolver : AttributeValueResolverRegistryReader
-                .getInstance().getExtensions())
-        {
-            SafeRunner.run(new ISafeRunnable()
-            {
-                public void handleException(Throwable exception)
-                {
-                    PDPlugin
-                            .log(
-                                    "While resolving attribute in converter decorator", exception); //$NON-NLS-1$
-                }
-
-                public void run() throws Exception
-                {
-                    if (resolver.canResolve(originalElement,
-                            convertedElement, convertedAttributeName, oldAttributeValue))
-                    {
-                        result[0] = resolver.resolveAttribute(
-                                originalElement, convertedElement,
-                                convertedAttributeName, oldAttributeValue);
-                    }
-                }
-            });
-            if (result[0] != null)
-            {
-                newValue = result[0];
-                valueResolved = true;
-                break;
-            }
-        }
-
-        if (!valueResolved &&
-                // maintain backward compatibility: only do this default
-                // behaviour for the preview
-                tagDecorateInfoID.equals(DECORATE_INFO_ID_PREVIEW))
-        {
-            // fall- through to default case.
-            try
-            {
-                
-                PageExpressionContext current = PageExpressionContext.getCurrent();
-                if (current != null)
-                {
-                    return (String) current
-                            .evaluateExpression(oldAttributeValue, String.class,
-                                    null);
-                }
-            } catch (ELException e)
-            {
-                // ignore. we will just return null since couldn't resolve
-            }
-        }
-        return newValue;
-    }
-
-    /**
-     * Resolves any instance of MD_PLUGIN_LOCATION in input String.
-     * 
-     * @param input
-     *            Input String.
-     * @param dtInfo
-     *            IDTInfo instance.
-     * @return Input String with any instance of MD_PLUGIN_LOCATION resolved.
-     */
-    protected String resolveMDPluginLocation(String input, IDTInfo dtInfo)
-    {
-        String output = input;
-        if (input != null && input.contains(MD_PLUGIN_LOCATION))
-        {
-            int tokenStart = input.indexOf(MD_PLUGIN_LOCATION);
-            int tokenEnd = tokenStart + MD_PLUGIN_LOCATION.length();
-            String prefix = input.substring(0, tokenStart);
-            String suffix = input.substring(tokenEnd);
-            Trait trait = dtInfo.getTrait();
-            IMetaDataSourceModelProvider mdSourceModelProvider = trait
-                    .getSourceModelProvider();
-            IResourceURLProvider resourceURLProvider = (IResourceURLProvider) mdSourceModelProvider
-                    .getAdapter(IResourceURLProvider.class);
-            URL url = resourceURLProvider.getResourceURL("/META-INF/"); //$NON-NLS-1$
-            String resolvedToken = url.toExternalForm();
-            resolvedToken = resolvedToken.substring(0,
-                    resolvedToken.length() - 10);
-            output = prefix + resolvedToken + suffix;
-        }
-        return output;
-    }
-
-    /**
-     * Sets DTTagConverter instance as non-visual as HTML and sets the
-     * ImageDescriptor instance that DTTagConverter will use to return an Image
-     * for rendering.
-     * 
-     * @param dtTagConverter
-     *            DTTagConverter instance.
-     * @param dtInfo
-     *            IDTInfo instance.
-     * @param imagePath
-     *            Image path, relative to declaring plug-in.
-     */
-    protected void setNonVisual(DTTagConverter dtTagConverter, IDTInfo dtInfo,
-            String imagePath)
-    {
-        dtTagConverter.setVisualByHTML(false);
-        if (imagePath != null && imagePath.length() > 0)
-        {
-            Trait trait = dtInfo.getTrait();
-            IImageDescriptorProvider imgDescProvider = (IImageDescriptorProvider) trait
-                    .getSourceModelProvider().getAdapter(
-                            IImageDescriptorProvider.class);
-            if (imgDescProvider != null)
-            {
-                ImageDescriptor imageDescriptor = imgDescProvider
-                        .getImageDescriptor(imagePath);
-                dtTagConverter.setVisualImageDescriptor(imageDescriptor);
-            }
-        }
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/internal/DTTagConverterFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/internal/DTTagConverterFactory.java
deleted file mode 100644
index df40831..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/internal/DTTagConverterFactory.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager.converter.internal;
-
-import org.eclipse.jst.pagedesigner.converter.IConverterFactory;
-import org.eclipse.jst.pagedesigner.converter.ITagConverter;
-import org.eclipse.jst.pagedesigner.dtmanager.DTManager;
-import org.eclipse.jst.pagedesigner.dtmanager.IDTInfo;
-import org.w3c.dom.Element;
-
-/**
- * Produces DTTagConverter instances.
- * 
- * @author Ian Trimble - Oracle
- */
-public class DTTagConverterFactory implements IConverterFactory {
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.converter.IConverterFactory#createConverter(org.w3c.dom.Element, int)
-	 */
-	public ITagConverter createConverter(Element element, int mode) {
-		ITagConverter tagConverter = null;
-		IDTInfo dtInfo = DTManager.getInstance().getDTInfo(element);
-		if (dtInfo != null) {
-			tagConverter = new DTTagConverter(element);
-			tagConverter.setMode(mode);
-		}
-		return tagConverter;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.converter.IConverterFactory#getSupportedURI()
-	 */
-	public String getSupportedURI() {
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/internal/DefaultTransformer.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/internal/DefaultTransformer.java
deleted file mode 100644
index 4e6ce62..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/internal/DefaultTransformer.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager.converter.internal;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-
-import org.eclipse.jst.pagedesigner.dtmanager.converter.ITagConverterContext;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.ITransformOperation;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.ITransformer;
-import org.w3c.dom.Element;
-
-/**
- * Default ITransformer implementation.
- * 
- * @author Ian Trimble - Oracle
- */
-public class DefaultTransformer implements ITransformer {
-
-	private ITagConverterContext tagConverterContext;
-    // synchronization occurs on this object, so it must never
-    // be allowed to be null
-	private final Collection transformOperations = new ArrayList();
-
-	/**
-	 * Instantiates an instance.
-	 * 
-	 * @param context ITagConverterContext instance.
-	 */
-	public DefaultTransformer(ITagConverterContext context) {
-		this.tagConverterContext = context;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.ITransformer#appendTransformOperation(org.eclipse.jst.pagedesigner.dtmanager.converter.ITransformOperation)
-	 */
-	public void appendTransformOperation(ITransformOperation operation) {
-		synchronized(transformOperations) {
-			if (operation != null) {
-				operation.setTagConverterContext(tagConverterContext);
-				transformOperations.add(operation);
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.internal.provisional.ITransformer#transform(org.w3c.dom.Element)
-	 */
-	public Element transform(Element srcElement) {
-		Element curElement = null;
-		if (srcElement != null) {
-			synchronized(transformOperations) {
-				if (transformOperations.size() > 0) {
-					curElement = srcElement;
-					Iterator itOperations = transformOperations.iterator();
-					while (itOperations.hasNext()) {
-						ITransformOperation operation = (ITransformOperation)itOperations.next();
-						curElement = operation.transform(srcElement, curElement);
-					}
-				}
-			}
-		}
-		return curElement;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/internal/IAttributeValueResolver.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/internal/IAttributeValueResolver.java
deleted file mode 100644
index e654f5c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/internal/IAttributeValueResolver.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package org.eclipse.jst.pagedesigner.dtmanager.converter.internal;
-
-import org.w3c.dom.Element;
-
-/**
- * Marks an object that can resolve the runtime value of an attribute at 
- * design time.  The "runtime" value may be a best-guess or simulated value.
- * 
- * @author cbateman
- *
- */
-public interface IAttributeValueResolver
-{
-    /**
-     * Passed as convertedAttrName if the convertedElement's text content 
-     * is the 'attribute' to be resolved.
-     */
-    public static final String TEXT_NODE_KEY = "#text"; //$NON-NLS-1$
-
-    /**
-     * @param originalElement
-     * @param convertedElement 
-     * @param convertedAttrName 
-     * @param convertedAttrValue 
-     * 
-     * @return true if this resolver can resolve the value of attrName on domNode
-     */
-    public abstract boolean canResolve(final Element originalElement,
-            final Element convertedElement,
-            final String convertedAttrName,
-            final String convertedAttrValue);
-
-    /**
-     * @param originalElement 
-     * @param convertedElement 
-     * @param convertedAttrName 
-     * @param convertedAttrValue 
-     * @return the resolved String value of attrName.  A value of null does not necessarily
-     * mean that the value couldn't be resolved.
-     */
-    public abstract String resolveAttribute(final Element originalElement,
-            final Element convertedElement, final String convertedAttrName,
-            final String convertedAttrValue);
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/AbstractTransformOperation.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/AbstractTransformOperation.java
deleted file mode 100644
index dc2ab99..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/AbstractTransformOperation.java
+++ /dev/null
@@ -1,223 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager.converter.operations;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.ITagConverterContext;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.ITransformOperation;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-/**
- * Abstract ITransformOperation implementation. Maintains ITagConverterContext
- * instance and collection of child ITransformOperation instances.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author Ian Trimble - Oracle
- */
-public abstract class AbstractTransformOperation implements ITransformOperation {
-
-	/**
-	 * ITagConverterContext instance.
-	 */
-	protected ITagConverterContext tagConverterContext;
-
-	/**
-	 * Collection of child ITransformOperation instances.
-	 */
-	protected List childOperations;
-
-	private String[] params;
-
-	private String id = "<not set>"; //$NON-NLS-1$
-	
-	/**
-	 * Zero-argument constructor
-	 */
-	public AbstractTransformOperation(){
-		//
-	}
-	
-	/**
-	 * Called by TransformOperationFactory
-	 * @param params for the operation
-	 */
-	void setParameters(String[] params) {
-		if (params != null) {
-			this.params = new String[params.length];
-			System.arraycopy(params, 0, this.params, 0, params.length);
-		}
-	}
-	
-	/**
-	 * @return parameters for the operation
-	 */
-	protected String[] getParameters(){
-		return params;
-	}
-	
-	/**
-	 * Called by TransformOperationFactory
-	 * @param id for the operation
-	 */
-	void setTransformOperationID(String id){
-		this.id = id;
-	}
-	
-	/**
-	 * @return id for the operation
-	 */
-	protected String getTransformOperationID(){
-		return id;
-	}
-	
-	/**
-	 * @return Logger
-	 */
-	protected Logger getLog() {
-		return PDPlugin.getLogger(TransformOperationFactory.class);
-	}
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.ITransformOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	public abstract Element transform(Element srcElement, Element curElement);
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.ITransformOperation#setTagConverterContext(org.eclipse.jst.pagedesigner.dtmanager.converter.internal.provisional.ITagConverterContext)
-	 */
-	public void setTagConverterContext(ITagConverterContext tagConverterContext) {
-        // API: this should really be set on construction since other methods
-        // cannot be called until it is set.
-		this.tagConverterContext = tagConverterContext;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.ITransformOperation#appendChildOperation(org.eclipse.jst.pagedesigner.dtmanager.converter.internal.provisional.ITransformOperation)
-	 */
-	public void appendChildOperation(ITransformOperation operation) {
-		if (operation != null) {
-			if (childOperations == null) {
-				childOperations = new ArrayList();
-			}
-			operation.setTagConverterContext(tagConverterContext);
-			childOperations.add(operation);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.ITransformOperation#getChildOperations()
-	 */
-	public List getChildOperations() {
-		return childOperations;
-	}
-
-	/**
-	 * Convenience method to execute child ITransformOperation instances.
-	 * 
-	 * @param srcElement Source Element instance.
-	 * @param curElement Current Element instance (that is being transformed).
-	 * @return New current Element instance.
-	 */
-	protected Element executeChildOperations(Element srcElement, Element curElement) {
-		Element retElement = curElement;
-		if (childOperations != null && childOperations.size() > 0) {
-			Iterator itChildOperations = childOperations.iterator();
-			while (itChildOperations.hasNext()) {
-				ITransformOperation childOperation = (ITransformOperation)itChildOperations.next();
-				retElement = childOperation.transform(srcElement, retElement);
-			}
-		}
-		return retElement;
-	}
-
-	/**
-	 * Creates a new Element.
-	 * 
-	 * @param tagName Name of Element to be created.
-	 * @return New Element instance.
-	 */
-	protected Element createElement(String tagName) {
-		ITransformOperation operation =
-			TransformOperationFactory.getInstance().getTransformOperation(
-					TransformOperationFactory.OP_CreateElementOperation,
-					new String[]{tagName});
-		operation.setTagConverterContext(tagConverterContext);
-		return operation.transform(null, null);
-	}
-
-	/**
-	 * Creates and appends a new child Element.
-	 * 
-	 * @param tagName Name of child Element to be created.
-	 * @param parentElement Element instance to which to append the new
-	 * Element.
-	 * @return New Element instance.
-	 */
-	protected Element appendChildElement(String tagName, Element parentElement) {
-		ITransformOperation operation =
-			TransformOperationFactory.getInstance().getTransformOperation(
-					TransformOperationFactory.OP_AppendChildElementOperation,
-					new String[]{tagName});
-		operation.setTagConverterContext(tagConverterContext);
-		return operation.transform(null, parentElement);
-	}
-
-	/**
-	 * Creates and appends a new child Text.
-	 * 
-	 * @param content Content of new child Text.
-	 * @param parentElement Element instance to which to append the new Text.
-	 */
-	protected void appendChildText(String content, Element parentElement) {
-		ITransformOperation operation =
-			TransformOperationFactory.getInstance().getTransformOperation(
-					TransformOperationFactory.OP_AppendChildTextOperation,
-					new String[]{content});
-		operation.setTagConverterContext(tagConverterContext);
-		operation.transform(null, parentElement);
-	}
-
-	/**
-	 * Gets collection of child Element instances who's local name matches
-	 * specified tag name.
-	 * 
-	 * @param srcNode Source Node instance.
-	 * @param tagName Tag local name.
-	 * @return Collection of child Element instances who's local name matches
-	 * specified tag name.
-	 */
-	protected List getChildElements(Node srcNode, String tagName) {
-		List childElements = new ArrayList();
-		NodeList childNodes = srcNode.getChildNodes();
-		for (int i = 0; i < childNodes.getLength(); i++) {
-			Node curNode = childNodes.item(i);
-			if (curNode.getNodeType() == Node.ELEMENT_NODE) {
-				String curNodeName = curNode.getLocalName();
-				if (curNodeName != null && curNodeName.equals(tagName)) {
-					childElements.add(curNode);
-				}
-			}
-		}
-		return childElements;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/TransformOperationFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/TransformOperationFactory.java
deleted file mode 100644
index 0c8e6ed..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/TransformOperationFactory.java
+++ /dev/null
@@ -1,210 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager.converter.operations;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtension;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.InvalidRegistryObjectException;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.pagedesigner.IJMTConstants;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.ITransformOperation;
-import org.osgi.framework.Bundle;
-
-/**
- * Factory responsible for producing {@link org.eclipse.jst.pagedesigner.dtmanager.converter.ITransformOperation} instances from the <br>
- * <code>org.eclipse.jst.pagedesigner.pageDesignerExtension.tagTransformOperation</code> extensions 
- * <br>
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author Ian Trimble - Oracle
- */
-public final class TransformOperationFactory {
-	/**
-	 * AppendChildElementOperation
-	 */
-	public static final String OP_AppendChildElementOperation = PDPlugin.getPluginId()+".AppendChildElementOperation"; //$NON-NLS-1$
-	/**
-	 * AppendChildTextFromXPathOperation
-	 */
-	public static final String OP_AppendChildTextFromXPathOperation = PDPlugin.getPluginId()+".AppendChildTextFromXPathOperation"; //$NON-NLS-1$
-	/**
-	 * AppendChildTextOperation
-	 */
-	public static final String OP_AppendChildTextOperation = PDPlugin.getPluginId()+".AppendChildTextOperation"; //$NON-NLS-1$
-	/**
-	 * ConvertAttributeToTextOperation
-	 */
-	public static final String OP_ConvertAttributeToTextOperation = PDPlugin.getPluginId()+".ConvertAttributeToTextOperation"; //$NON-NLS-1$
-	/**
-	 * CopyAllAttributesOperation
-	 */
-	public static final String OP_CopyAllAttributesOperation = PDPlugin.getPluginId()+".CopyAllAttributesOperation"; //$NON-NLS-1$
-	/**
-	 * CopyAttributeOperation
-	 */
-	public static final String OP_CopyAttributeOperation = PDPlugin.getPluginId()+".CopyAttributeOperation"; //$NON-NLS-1$
-	/**
-	 * CopyAttributeWithRenameOperation
-	 */
-	public static final String OP_CopyAttributeWithRenameOperation = PDPlugin.getPluginId()+".CopyAttributeWithRenameOperation"; //$NON-NLS-1$
-	/**
-	 * CopyChildrenOperation
-	 */
-	public static final String OP_CopyChildrenOperation = PDPlugin.getPluginId()+".CopyChildrenOperation"; //$NON-NLS-1$
-	/**
-	 * CreateAttributeFromXPathOperation
-	 */
-	public static final String OP_CreateAttributeFromXPathOperation = PDPlugin.getPluginId()+".CreateAttributeFromXPathOperation"; //$NON-NLS-1$
-	/**
-	 * CreateAttributeOperation
-	 */
-	public static final String OP_CreateAttributeOperation = PDPlugin.getPluginId()+".CreateAttributeOperation"; //$NON-NLS-1$
-	/**
-	 * CreateElementOperation
-	 */
-	public static final String OP_CreateElementOperation = PDPlugin.getPluginId()+".CreateElementOperation"; //$NON-NLS-1$
-	/**
-	 * CustomTransformOperation
-	 */
-	public static final String OP_CustomTransformOperation = PDPlugin.getPluginId()+".CustomTransformOperation"; //$NON-NLS-1$
-	/**
-	 * IfNotOperation
-	 */
-	public static final String OP_IfNotOperation = PDPlugin.getPluginId()+".IfNotOperation"; //$NON-NLS-1$
-	/**
-	 * IfOperation
-	 */
-	public static final String OP_IfOperation = PDPlugin.getPluginId()+".IfOperation"; //$NON-NLS-1$
-	/**
-	 * IterateOverElementsOperation
-	 */
-	public static final String OP_IterateOverElementsOperation = PDPlugin.getPluginId()+".IterateOverElementsOperation"; //$NON-NLS-1$
-	/**
-	 * MakeParentElementCurrentOperation
-	 */
-	public static final String OP_MakeParentElementCurrentOperation = PDPlugin.getPluginId()+".MakeParentElementCurrentOperation"; //$NON-NLS-1$
-	/**
-	 * RemoveAttributeOperation
-	 */
-	public static final String OP_RemoveAttributeOperation = PDPlugin.getPluginId()+".RemoveAttributeOperation"; //$NON-NLS-1$
-	/**
-	 * RenameAttributeOperation
-	 */
-	public static final String OP_RenameAttributeOperation = PDPlugin.getPluginId()+".RenameAttributeOperation"; //$NON-NLS-1$
-
-	private static TransformOperationFactory instance;
-
-	private Logger log = PDPlugin.getLogger(TransformOperationFactory.class);
-	
-	private Map<String, Class> _tagTransformOpsRegistry;
-
-	/**
-	 * Instantiates an instance.
-	 */
-	private TransformOperationFactory() {
-		//no external instantiation
-		
-		//read extensions
-		readAllTagTransformOperations();
-	}
-
-	
-	/**
-	 * Gets the singleton instance.
-	 * 
-	 * @return The singleton instance.
-	 */
-	public static synchronized TransformOperationFactory getInstance() {
-		if (instance == null) {
-			instance = new TransformOperationFactory();
-		}
-		return instance;
-	}
-
-	/**
-	 * Gets an ITransformOperation instance for the specified operation ID and
-	 * parameters.
-	 * 
-	 * @param opID - the plugin-qualified Operation extension ID.
-	 * @param params - array of String parameters
-	 * @return ITransformOperation
-	 */
-	public ITransformOperation getTransformOperation(String opID, String[] params) {
-		Class opClass = null;
-		try {
-			opClass = _tagTransformOpsRegistry.get(opID);
-			if (opClass != null) {
-				Object opObject = opClass.newInstance();
-				if (opObject instanceof AbstractTransformOperation) {
-					((AbstractTransformOperation)opObject).setParameters(params);
-					((AbstractTransformOperation)opObject).setTransformOperationID(opID);			
-					return (AbstractTransformOperation)opObject;
-				}
-				log.error("Warning.TransformOperationFactory.NotAbstractTransformOperation", opClass.getName()); //$NON-NLS-1$
-			} else {
-				log.error("Warning.TransformOperationFactory.ExtensionNotFound", opID); //$NON-NLS-1$
-			}		
-		} catch(IllegalAccessException iae) {
-			log.error("Warning.TransformOperationFactory.IllegalAccess", opClass.getName(), iae); //$NON-NLS-1$
-		} catch(InstantiationException ie) {
-			log.error("Warning.TransformOperationFactory.Instantiation", opClass.getName(), ie); //$NON-NLS-1$
-		}
-		return null;
-	}
-	
-	/**
-	 * Reads the custom tag transform operations from WPE registry
-	 */
-	private void readAllTagTransformOperations() {
-		try {
-			_tagTransformOpsRegistry = new HashMap<String, Class>();
-			IExtensionPoint point = Platform.getExtensionRegistry().getExtensionPoint(PDPlugin.getPluginId(), IJMTConstants.EXTENSION_POINT_PAGEDESIGNER);
-			IExtension[] extensions = point.getExtensions();
-			for (int i=0;i < extensions.length;i++){
-				IExtension ext = extensions[i];
-				for (int j=0;j < ext.getConfigurationElements().length;j++){
-					if (ext.getConfigurationElements()[j].getName()
-							.equals(IJMTConstants.TAG_TRANSFORM_OPERATION)) {							
-						registerTransformOperation(ext.getConfigurationElements()[j]);					
-					}				
-				}
-			}
-		} catch (InvalidRegistryObjectException e) {
-			log.error("Warning.TransformOperationFactory.RegistryError", PDPlugin.getPluginId()+IJMTConstants.EXTENSION_POINT_PAGEDESIGNER+"."+IJMTConstants.TAG_TRANSFORM_OPERATION, e); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-	}
-
-	private void registerTransformOperation(final IConfigurationElement element) {
-	
-		final Bundle bundle = Platform.getBundle(element.getContributor().getName());        
-		final String id = element.getContributor().getName()+"."+element.getAttribute("id"); //$NON-NLS-1$ //$NON-NLS-2$
-        if (bundle != null) {
-            try {
-                final Class transformClass = bundle.loadClass(element.getAttribute("class"));                 //$NON-NLS-1$
-                // Not checking instance type here.  Class gets checked as ITransformOperation at 
-                //instantiation time...  
-                //best to log error then rather than now.
-                _tagTransformOpsRegistry.put(id, transformClass);
-            }
-            catch (Exception e) {
-                log.error("Warning.TransformOperationFactory.CannotLoadOpClass",id,  e);  //$NON-NLS-1$
-            }
-        }		
-	}
-	
-	
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/AppendChildElementOperation.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/AppendChildElementOperation.java
deleted file mode 100644
index 37178ef..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/AppendChildElementOperation.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.AbstractTransformOperation;
-import org.w3c.dom.Element;
-
-/**
- * ITransformOperation implementation that appends a child Element and
- * optionally makes the new Element current.
- * 
- * <br><b>Note:</b> requires ITransformOperation.setTagConverterContext(...) to
- * have been called to provide a valid ITagConverterContext instance prior to
- * a call to the transform(...) method.
- * 
- * @author Ian Trimble - Oracle
- */
-public class AppendChildElementOperation extends AbstractTransformOperation {
-
-	private String tagName;
-	private boolean makeChildCurrent = true;
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.AbstractTransformOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	public Element transform(Element srcElement, Element curElement) {
-		if (getParameters().length < 1) {
-			getLog().error("Warning.TransformOperationFactory.TooFewParameters", getTransformOperationID()); //$NON-NLS-1$
-			return null;
-		} else if (getParameters().length < 2) {
-			tagName = getParameters()[0];
-		} else {
-			tagName = getParameters()[0];
-			makeChildCurrent = Boolean.valueOf(getParameters()[1]).booleanValue();			
-		}
-		
-		Assert.isNotNull(tagName);
-		Element element = null;
-		if (tagConverterContext != null && curElement != null && tagName != null && tagName.length() > 0) {
-			Element childElement = tagConverterContext.createElement(tagName);
-			curElement.appendChild(childElement);
-			if (makeChildCurrent) {
-				element = childElement;
-			} else {
-				element = curElement;
-			}
-		}
-		return element;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/AppendChildTextFromXPathOperation.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/AppendChildTextFromXPathOperation.java
deleted file mode 100644
index b0a7391..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/AppendChildTextFromXPathOperation.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal;
-
-import javax.xml.xpath.XPath;
-import javax.xml.xpath.XPathConstants;
-import javax.xml.xpath.XPathExpressionException;
-import javax.xml.xpath.XPathFactory;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.AbstractTransformOperation;
-import org.w3c.dom.Element;
-import org.w3c.dom.Text;
-
-/**
- * ITransformOperation implementation that creates a new child Text node by
- * getting a value from the specified XPath expression.
- * 
- * <br><b>Note:</b> requires ITransformOperation.setTagConverterContext(...) to
- * have been called to provide a valid ITagConverterContext instance prior to
- * a call to the transform(...) method.
- * 
- * @author Ian Trimble - Oracle
- */
-public class AppendChildTextFromXPathOperation extends AbstractTransformOperation {
-
-	private String xPathExpression;
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.AbstractTransformOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	public Element transform(Element srcElement, Element curElement) {
-		
-		if (getParameters().length < 1) {
-			getLog().error("Warning.TransformOperationFactory.TooFewParameters", getTransformOperationID()); //$NON-NLS-1$
-			return null;
-		}
-		
-		xPathExpression = getParameters()[0];		
-		Assert.isNotNull(xPathExpression);
-		if (srcElement != null) {
-			XPath xPath = XPathFactory.newInstance().newXPath();
-			try {
-				Object resultObject = xPath.evaluate(xPathExpression, srcElement, XPathConstants.STRING);
-				if (tagConverterContext != null && resultObject instanceof String && curElement != null) {
-					Text childText = tagConverterContext.createText((String)resultObject);
-					curElement.appendChild(childText);
-				}
-			} catch(XPathExpressionException xee) {
-				//could not evaluate - return curElement
-			}
-		}
-		return curElement;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/AppendChildTextOperation.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/AppendChildTextOperation.java
deleted file mode 100644
index 5d910c5..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/AppendChildTextOperation.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.AbstractTransformOperation;
-import org.w3c.dom.Element;
-import org.w3c.dom.Text;
-
-/**
- * ITransformOperation implementation that appends a child Text.
- * 
- * <br><b>Note:</b> requires ITransformOperation.setTagConverterContext(...) to
- * have been called to provide a valid ITagConverterContext instance prior to
- * a call to the transform(...) method.
- * 
- * @author Ian Trimble - Oracle
- */
-public class AppendChildTextOperation extends AbstractTransformOperation {
-
-	private String content;
-
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.AbstractTransformOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	public Element transform(Element srcElement, Element curElement) {
-		if (getParameters().length < 1) {
-			getLog().error("Warning.TransformOperationFactory.TooFewParameters", getTransformOperationID()); //$NON-NLS-1$
-			return null;
-		}
-		
-		content = getParameters()[0];		
-		Assert.isNotNull(content);
-		
-		if (tagConverterContext != null && curElement != null && content != null && content.length() > 0) {
-			Text childText = tagConverterContext.createText(content);
-			curElement.appendChild(childText);
-		}
-		return curElement;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/CheckModeOperation.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/CheckModeOperation.java
deleted file mode 100644
index 554bab7..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/CheckModeOperation.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*******************************************************************************
-* Copyright (c) 2010 Oracle Corporation and others.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-*
-* Contributors:
-*    Oracle Corporation - initial API and implementation and/or initial documentation
-*******************************************************************************/
-package org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jst.pagedesigner.converter.IConverterFactory;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.internal.DTTagConverterContext;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.AbstractTransformOperation;
-import org.w3c.dom.Element;
-
-
-/**
- * Transform operation that executes child ITransformOperation
- * instances if the view mode matches the argument (parameter) provided.
- * 
- * <br><b>Note:</b> requires ITransformOperation.setTagConverterContext() to
- * have been called to provide a valid ITagConverterContext instance prior to
- * a call to the transform() method.
- */
-public class CheckModeOperation extends AbstractTransformOperation {
-
-    /**
-     * Constant indicating the current render mode is design
-     */
-    public static final String MODE_DESIGN = "design"; //$NON-NLS-1$
-    /**
-     * Constant indicating the current render mode is preview
-     */
-    public static final String MODE_PREVIEW = "preview"; //$NON-NLS-1$
-
-    /*
-     * (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.dtmanager.converter.ITransformOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
-     */
-    @Override
-    public Element transform(Element srcElement, Element curElement) {
-        if (getParameters().length < 1) {
-            getLog().error("Warning.TransformOperationFactory.TooFewParameters", //$NON-NLS-1$
-                           getTransformOperationID());
-            return null;
-        }
-        
-        String modeParam = getParameters()[0];
-        Assert.isNotNull(modeParam);
-
-        int currentMode = getMode();
-        if ((MODE_DESIGN.equals(modeParam) && currentMode == IConverterFactory.MODE_DESIGNER)
-                || (MODE_PREVIEW.equals(modeParam) && currentMode == IConverterFactory.MODE_PREVIEW)) {
-            return executeChildOperations(srcElement, curElement);
-        }
-
-        // if we haven't transformed the element at all, and this is 
-        // just the initial transform, return null
-        if (srcElement == curElement) {
-            return null;
-        }
-
-        // otherwise, return the currently transformed element
-        return curElement;
-    }
-
-    /**
-     * @return the converter mode. If unable to get the mode, return -1.
-     */
-    protected int getMode() {
-        if (tagConverterContext != null
-                && tagConverterContext instanceof DTTagConverterContext) {
-            return ((DTTagConverterContext) tagConverterContext).getMode();
-        }
-
-        return -1;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/ConvertAttributeToTextOperation.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/ConvertAttributeToTextOperation.java
deleted file mode 100644
index 51fdd9a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/ConvertAttributeToTextOperation.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.AbstractTransformOperation;
-import org.w3c.dom.Element;
-import org.w3c.dom.Text;
-
-/**
- * ITransformOperation implementation that converts an attribute to a child
- * Text Node and optionally removes the specified attribute.
- * 
- * <br><b>Note:</b> requires ITransformOperation.setTagConverterContext(...) to
- * have been called to provide a valid ITagConverterContext instance prior to
- * a call to the transform(...) method.
- * 
- * @author Ian Trimble - Oracle
- */
-public class ConvertAttributeToTextOperation extends AbstractTransformOperation {
-
-	private String attributeName;
-	private boolean removeAttribute = true;
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.AbstractTransformOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	public Element transform(Element srcElement, Element curElement) {
-		if (getParameters().length < 1) {
-			getLog().error("Warning.TransformOperationFactory.TooFewParameters", getTransformOperationID()); //$NON-NLS-1$
-			return null;
-		} else if (getParameters().length < 2) {
-			attributeName = getParameters()[0];
-		} else {
-			attributeName = getParameters()[0];
-			removeAttribute = Boolean.valueOf(getParameters()[1]).booleanValue();
-		}		
-		
-		Assert.isNotNull(attributeName);
-		if (tagConverterContext != null && srcElement != null && curElement != null) {
-			String content = srcElement.getAttribute(attributeName);
-			if (content != null && content.length() > 0) {
-				Text text = tagConverterContext.createText(content);
-				curElement.appendChild(text);
-				if (removeAttribute) {
-					curElement.removeAttribute(attributeName);
-				}
-			}
-		}
-		return curElement;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/CopyAllAttributesOperation.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/CopyAllAttributesOperation.java
deleted file mode 100644
index 59b13f5..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/CopyAllAttributesOperation.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal;
-
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.AbstractTransformOperation;
-import org.w3c.dom.Attr;
-import org.w3c.dom.Element;
-import org.w3c.dom.NamedNodeMap;
-
-/**
- * ITransformOperation implementation that copies all attributes from the
- * source Element instance to the current Element instance.
- * 
- * @author Ian Trimble - Oracle
- */
-public class CopyAllAttributesOperation extends AbstractTransformOperation {
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.AbstractTransformOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	public Element transform(Element srcElement, Element curElement) {
-		if (srcElement != null && curElement != null) {
-			NamedNodeMap attributes = srcElement.getAttributes();
-			for (int i = 0; i < attributes.getLength(); i++) {
-				Attr attribute = (Attr)attributes.item(i);
-				curElement.setAttribute(attribute.getName(), attribute.getValue());
-			}
-		}
-		return curElement;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/CopyAttributeOperation.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/CopyAttributeOperation.java
deleted file mode 100644
index a169436..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/CopyAttributeOperation.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.AbstractTransformOperation;
-import org.w3c.dom.Attr;
-import org.w3c.dom.Element;
-
-/**
- * Copies a single attribute from the source Element instance to the current
- * Element instance, and optionally creates a new attribute on the current
- * Element instance if no such attribute exists on the source Element instance.
- * 
- * @author Ian Trimble - Oracle
- */
-public class CopyAttributeOperation extends AbstractTransformOperation {
-
-	private String attributeName;
-	private boolean create;
-	private String newAttributeValue;
-
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.AbstractTransformOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	public Element transform(Element srcElement, Element curElement) {
-		if (getParameters().length < 1) {
-			getLog().error("Warning.TransformOperationFactory.TooFewParameters", getTransformOperationID()); //$NON-NLS-1$
-			return null;
-		} else if (getParameters().length < 3) {
-			attributeName = getParameters()[0];			
-		} else {
-			attributeName = getParameters()[0];
-			create = Boolean.valueOf(getParameters()[1]).booleanValue();
-			newAttributeValue = getParameters()[2];		
-		}
-		
-		Assert.isNotNull(attributeName);
-		if (srcElement != null && curElement != null) {
-			Attr attribute = srcElement.getAttributeNode(attributeName);
-			if (attribute != null) {
-				curElement.setAttribute(attributeName, attribute.getValue());
-			} else if (create && newAttributeValue != null) {
-				curElement.setAttribute(attributeName, newAttributeValue);
-			}
-		}
-		return curElement;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/CopyAttributeWithRenameOperation.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/CopyAttributeWithRenameOperation.java
deleted file mode 100644
index 0a0a25b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/CopyAttributeWithRenameOperation.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/**
- * Copyright (c) 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle Corporation - initial API and implementation
- */
-package org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.AbstractTransformOperation;
-import org.w3c.dom.Attr;
-import org.w3c.dom.Element;
-
-/**
- * Copies a single attribute from the source Element instance to the current
- * Element instance, renaming the attribute on the current Element instance.
- * 
- * @author Ian Trimble - Oracle
- */
-public class CopyAttributeWithRenameOperation extends AbstractTransformOperation {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.operations.AbstractTransformOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	public Element transform(Element srcElement, Element curElement) {
-		if (getParameters().length < 2) {
-			getLog().error("Warning.TransformOperationFactory.TooFewParameters", getTransformOperationID()); //$NON-NLS-1$
-			return null;
-		}
-
-		String srcAttributeName = getParameters()[0];
-		String destAttributeName = getParameters()[1];
-		Assert.isNotNull(srcAttributeName);
-		Assert.isNotNull(destAttributeName);
-
-		if (srcElement != null && curElement != null) {
-			Attr attribute = srcElement.getAttributeNode(srcAttributeName);
-			if (attribute != null) {
-				curElement.setAttribute(destAttributeName, attribute.getValue());
-			}
-		}
-
-		return curElement;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/CopyChildrenOperation.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/CopyChildrenOperation.java
deleted file mode 100644
index 206e595..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/CopyChildrenOperation.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal;
-
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.AbstractTransformOperation;
-import org.w3c.dom.Element;
-
-/**
- * ITransformOperation implementation that copies all child Elements as Nodes
- * requiring subsequent tag conversion.
- * 
- * <br><b>Note:</b> requires ITransformOperation.setTagConverterContext(...) to
- * have been called to provide a valid ITagConverterContext instance prior to
- * a call to the transform(...) method.
- * 
- * @author Ian Trimble - Oracle
- */
-public class CopyChildrenOperation extends AbstractTransformOperation {
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.AbstractTransformOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	public Element transform(Element srcElement, Element curElement) {
-		if (tagConverterContext != null) {
-			tagConverterContext.copyChildren(srcElement, curElement);
-		}
-		return curElement;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/CreateAttributeFromXPathOperation.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/CreateAttributeFromXPathOperation.java
deleted file mode 100644
index 31ea364..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/CreateAttributeFromXPathOperation.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Iterator;
-import java.util.List;
-import java.util.StringTokenizer;
-
-import javax.xml.namespace.NamespaceContext;
-import javax.xml.xpath.XPath;
-import javax.xml.xpath.XPathConstants;
-import javax.xml.xpath.XPathExpressionException;
-import javax.xml.xpath.XPathFactory;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.AbstractTransformOperation;
-import org.w3c.dom.Element;
-
-/**
- * ITransformOperation implementation that creates a new attribute on the
- * current Element by getting a value from the specified XPath expression.
- * 
- * @author Ian Trimble - Oracle
- */
-public class CreateAttributeFromXPathOperation extends AbstractTransformOperation {
-
-	private static final String DEFAULT_PREFIX = "prefix"; //$NON-NLS-1$
-
-	private String attributeName;
-	private String xPathExpression;
-	private String nsURI;
-	private String prefixedTokens;
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.AbstractTransformOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	public Element transform(Element srcElement, Element curElement) {
-		
-		if (getParameters().length < 2) {
-			getLog().error("Warning.TransformOperationFactory.TooFewParameters", getTransformOperationID()); //$NON-NLS-1$
-			return null;
-		}
-		attributeName = getParameters()[0];
-		xPathExpression = getParameters()[1];				
-		Assert.isNotNull(attributeName);
-		Assert.isNotNull(xPathExpression);
-		if (getParameters().length > 3) {
-			nsURI = getParameters()[2];
-			Assert.isNotNull(nsURI);
-			prefixedTokens = getParameters()[3];
-			Assert.isNotNull(prefixedTokens);
-		}
-	
-		if (srcElement != null) {
-			XPath xPath = XPathFactory.newInstance().newXPath();
-			try {
-				Object resultObject = xPath.evaluate(xPathExpression, srcElement, XPathConstants.STRING);
-				if (resultObject instanceof String && curElement != null) {
-					if (((String)resultObject).equals("0")) { //$NON-NLS-1$
-						if (nsURI != null && prefixedTokens != null) {
-							xPath.setNamespaceContext(new NSContext(nsURI, DEFAULT_PREFIX));
-							resultObject = xPath.evaluate(getPrefixedExpression(DEFAULT_PREFIX), srcElement, XPathConstants.STRING);
-						}
-					}
-					curElement.setAttribute(attributeName, (String)resultObject);
-				}
-			} catch(XPathExpressionException xee) {
-				//could not evaluate - return curElement
-			}
-		}
-		return curElement;
-	}
-
-	private String getPrefixedExpression(String prefix) {
-		String prefixedExpression = xPathExpression;
-		final List<String> tokens = new ArrayList<String>();
-		final StringTokenizer tokenizer = new StringTokenizer(prefixedTokens, ","); //$NON-NLS-1$
-		while (tokenizer.hasMoreTokens()) {
-			tokens.add(tokenizer.nextToken());
-		}
-		for (String token: tokens) {
-			prefixedExpression = prefixedExpression.replace(token, prefix + ":" + token); //$NON-NLS-1$
-		}
-		return prefixedExpression;
-	}
-
-
-
-	class NSContext implements NamespaceContext {
-
-		private String _namespaceURI;
-		private String _prefix;
-
-		public NSContext(String namespaceURI, String prefix) {
-			_namespaceURI = namespaceURI;
-			_prefix = prefix;
-		}
-
-		public String getNamespaceURI(String prefix) {
-			return _namespaceURI;
-		}
-
-		public String getPrefix(String namespaceURI) {
-			return _prefix;
-		}
-
-		public Iterator getPrefixes(String namespaceURI) {
-			return Arrays.asList(new String[]{_prefix}).iterator();
-		}
-
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/CreateAttributeOperation.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/CreateAttributeOperation.java
deleted file mode 100644
index 7ffc0bb..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/CreateAttributeOperation.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.AbstractTransformOperation;
-import org.w3c.dom.Element;
-
-/**
- * ITransformOperation implementation that creates a new attribute on the
- * current Element.
- * 
- * @author Ian Trimble - Oracle
- */
-public class CreateAttributeOperation extends AbstractTransformOperation {
-
-	private String attributeName;
-	private String attributeValue;
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.AbstractTransformOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	public Element transform(Element srcElement, Element curElement) {
-		if (getParameters().length < 2) {
-			getLog().error("Warning.TransformOperationFactory.TooFewParameters", getTransformOperationID()); //$NON-NLS-1$
-			return null;
-		}
-		
-		attributeName = getParameters()[0];
-		attributeValue = getParameters()[1];		
-		Assert.isNotNull(attributeName);
-		Assert.isNotNull(attributeValue);
-	
-		if (curElement != null) {
-			curElement.setAttribute(attributeName, attributeValue);
-		}
-		return curElement;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/CreateElementOperation.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/CreateElementOperation.java
deleted file mode 100644
index 038fec2..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/CreateElementOperation.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.AbstractTransformOperation;
-import org.w3c.dom.Element;
-
-/**
- * ITransformOperation implementation that creates a new Element.
- * 
- * <br><b>Note:</b> requires ITransformOperation.setTagConverterContext(...) to
- * have been called to provide a valid ITagConverterContext instance prior to
- * a call to the transform(...) method.
- * 
- * @author Ian Trimble - Oracle
- */
-public class CreateElementOperation extends AbstractTransformOperation {
-
-	private String tagName;
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.AbstractTransformOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	public Element transform(Element srcElement, Element curElement) {
-		if (getParameters().length < 1) {
-			getLog().error("Warning.TransformOperationFactory.TooFewParameters", getTransformOperationID()); //$NON-NLS-1$
-			return null;
-		} 
-		
-		tagName = getParameters()[0];
-		Assert.isNotNull(tagName);
-		
-		Element element = null;
-		if (tagConverterContext != null && tagName != null && tagName.length() > 0) {
-			element = tagConverterContext.createElement(tagName);
-		}
-		return element;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/IfNotOperation.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/IfNotOperation.java
deleted file mode 100644
index 95c62f2..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/IfNotOperation.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal;
-
-import javax.xml.xpath.XPath;
-import javax.xml.xpath.XPathConstants;
-import javax.xml.xpath.XPathExpressionException;
-import javax.xml.xpath.XPathFactory;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.AbstractTransformOperation;
-import org.w3c.dom.Element;
-
-/**
- * ITransformOperation implementation that executes child ITransformOperation
- * instances if the XPath expression evaluated against the source Element
- * instance returns a "false" result.
- * 
- * <br><b>Note:</b> requires ITransformOperation.setTagConverterContext(...) to
- * have been called to provide a valid ITagConverterContext instance prior to
- * a call to the transform(...) method.
- * 
- * @author Ian Trimble - Oracle
- */
-public class IfNotOperation extends AbstractTransformOperation {
-
-	private String xPathExpression;
-
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.AbstractTransformOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	public Element transform(Element srcElement, Element curElement) {
-		if (getParameters().length < 1) {
-			getLog().error("Warning.TransformOperationFactory.TooFewParameters", getTransformOperationID()); //$NON-NLS-1$
-			return null;
-		}
-		
-		xPathExpression = getParameters()[0];
-		Assert.isNotNull(xPathExpression);
-		
-		Element retElement = curElement;
-		if (srcElement != null) {
-			XPath xPath = XPathFactory.newInstance().newXPath();
-			try {
-				Object resultObject = xPath.evaluate(xPathExpression, srcElement, XPathConstants.BOOLEAN);
-				if (!((Boolean)resultObject).booleanValue()) {
-					retElement = executeChildOperations(srcElement, retElement);
-				}
-			} catch(XPathExpressionException xee) {
-				//could not evaluate - return curElement
-			}
-		}
-		return retElement;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/IfOperation.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/IfOperation.java
deleted file mode 100644
index f617e35..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/IfOperation.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal;
-
-import javax.xml.xpath.XPath;
-import javax.xml.xpath.XPathConstants;
-import javax.xml.xpath.XPathExpressionException;
-import javax.xml.xpath.XPathFactory;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.AbstractTransformOperation;
-import org.w3c.dom.Element;
-
-/**
- * ITransformOperation implementation that executes child ITransformOperation
- * instances if the XPath expression evaluated against the source Element
- * instance returns a "true" result.
- * 
- * <br><b>Note:</b> requires ITransformOperation.setTagConverterContext(...) to
- * have been called to provide a valid ITagConverterContext instance prior to
- * a call to the transform(...) method.
- * 
- * @author Ian Trimble - Oracle
- */
-public class IfOperation extends AbstractTransformOperation {
-
-	private String xPathExpression;
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.AbstractTransformOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	public Element transform(Element srcElement, Element curElement) {
-		if (getParameters().length < 1) {
-			getLog().error("Warning.TransformOperationFactory.TooFewParameters", getTransformOperationID()); //$NON-NLS-1$
-			return null;
-		}
-		
-		xPathExpression = getParameters()[0];
-		Assert.isNotNull(xPathExpression);
-		
-		Element retElement = curElement;
-		if (srcElement != null) {
-			XPath xPath = XPathFactory.newInstance().newXPath();
-			try {
-				Object resultObject = xPath.evaluate(xPathExpression, srcElement, XPathConstants.BOOLEAN);
-				if (((Boolean)resultObject).booleanValue()) {
-					retElement = executeChildOperations(srcElement, retElement);
-				}
-			} catch(XPathExpressionException xee) {
-				//could not evaluate - return curElement
-			}
-		}
-		return retElement;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/IterateOverElementsOperation.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/IterateOverElementsOperation.java
deleted file mode 100644
index 530fa24..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/IterateOverElementsOperation.java
+++ /dev/null
@@ -1,137 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Iterator;
-import java.util.List;
-import java.util.StringTokenizer;
-
-import javax.xml.namespace.NamespaceContext;
-import javax.xml.xpath.XPath;
-import javax.xml.xpath.XPathConstants;
-import javax.xml.xpath.XPathExpressionException;
-import javax.xml.xpath.XPathFactory;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.AbstractTransformOperation;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-/**
- * ITransformOperation implementation that executes child ITransformOperation
- * instances for each Element in the NodeList returned by the XPath expression,
- * which is evaluated against the source Element.
- * 
- * <br><b>Note:</b> requires ITransformOperation.setTagConverterContext(...) to
- * have been called to provide a valid ITagConverterContext instance prior to
- * a call to the transform(...) method.
- * 
- * @author Ian Trimble - Oracle
- */
-public class IterateOverElementsOperation extends AbstractTransformOperation {
-
-	private static final String DEFAULT_PREFIX = "prefix"; //$NON-NLS-1$
-
-	private String xPathExpression;
-	private String nsURI;
-	private String prefixedTokens;
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.AbstractTransformOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	public Element transform(Element srcElement, Element curElement) {
-		if (getParameters().length < 1) {
-			getLog().error("Warning.TransformOperationFactory.TooFewParameters", getTransformOperationID()); //$NON-NLS-1$
-			return null;
-		}
-		xPathExpression = getParameters()[0];		
-		Assert.isNotNull(xPathExpression);
-		if (getParameters().length > 2) {
-			nsURI = getParameters()[1];
-			Assert.isNotNull(nsURI);
-			prefixedTokens = getParameters()[2];
-			Assert.isNotNull(prefixedTokens);
-		}
-
-		Element retElement = curElement;
-		if (srcElement != null) {
-			XPath xPath = XPathFactory.newInstance().newXPath();
-			try {
-				Object resultObject = xPath.evaluate(xPathExpression, srcElement, XPathConstants.NODESET);
-				if (resultObject instanceof NodeList) {
-					NodeList nodes = (NodeList)resultObject;
-					if (nodes.getLength() < 1) {
-						if (nsURI != null && prefixedTokens != null) {
-							xPath.setNamespaceContext(new NSContext(nsURI, DEFAULT_PREFIX));
-							resultObject = xPath.evaluate(getPrefixedExpression(DEFAULT_PREFIX), srcElement, XPathConstants.NODESET);
-							if (resultObject instanceof NodeList) {
-								nodes = (NodeList)resultObject;
-							}
-						}
-					}
-					for (int i = 0; i < nodes.getLength(); i++) {
-						Node node = nodes.item(i);
-						if (node instanceof Element) {
-							retElement = executeChildOperations((Element)node, retElement);
-						}
-					}
-				}
-			} catch(XPathExpressionException xee) {
-				//could not evaluate - return curElement
-			}
-		}
-		return retElement;
-	}
-
-	private String getPrefixedExpression(String prefix) {
-		String prefixedExpression = xPathExpression;
-		final List<String> tokens = new ArrayList<String>();
-		final StringTokenizer tokenizer = new StringTokenizer(prefixedTokens, ","); //$NON-NLS-1$
-		while (tokenizer.hasMoreTokens()) {
-			tokens.add(tokenizer.nextToken());
-		}
-		for (String token: tokens) {
-			prefixedExpression = prefixedExpression.replace(token, prefix + ":" + token); //$NON-NLS-1$
-		}
-		return prefixedExpression;
-	}
-
-
-
-	class NSContext implements NamespaceContext {
-
-		private String _namespaceURI;
-		private String _prefix;
-
-		public NSContext(String namespaceURI, String prefix) {
-			_namespaceURI = namespaceURI;
-			_prefix = prefix;
-		}
-
-		public String getNamespaceURI(String prefix) {
-			return _namespaceURI;
-		}
-
-		public String getPrefix(String namespaceURI) {
-			return _prefix;
-		}
-
-		public Iterator getPrefixes(String namespaceURI) {
-			return Arrays.asList(new String[]{_prefix}).iterator();
-		}
-
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/MakeParentElementCurrentOperation.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/MakeParentElementCurrentOperation.java
deleted file mode 100644
index b0e32af..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/MakeParentElementCurrentOperation.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal;
-
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.AbstractTransformOperation;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * ITransformOperation implementation that makes the current Element's parent
- * Element the new current Element.
- * 
- * @author Ian Trimble - Oracle
- */
-public class MakeParentElementCurrentOperation extends AbstractTransformOperation {
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.AbstractTransformOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	public Element transform(Element srcElement, Element curElement) {
-		Element resultElement = null;
-		if (curElement != null) {
-			Node parentNode = curElement.getParentNode();
-			while (parentNode != null && parentNode.getNodeType() != Node.DOCUMENT_NODE) {
-				if (parentNode.getNodeType() == Node.ELEMENT_NODE) {
-					resultElement = (Element)parentNode;
-					break;
-				}
-                parentNode = parentNode.getParentNode();
-			}
-		}
-		return resultElement;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/RemoveAttributeOperation.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/RemoveAttributeOperation.java
deleted file mode 100644
index b217c6a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/RemoveAttributeOperation.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.AbstractTransformOperation;
-import org.w3c.dom.Element;
-
-/**
- * ITransformOperation implementation that removes an attribute from the
- * current Element.
- * 
- * @author Ian Trimble - Oracle
- */
-public class RemoveAttributeOperation extends AbstractTransformOperation {
-
-	private String attributeName;
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.AbstractTransformOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	public Element transform(Element srcElement, Element curElement) {
-		if (getParameters().length < 1) {
-			getLog().error("Warning.TransformOperationFactory.TooFewParameters", getTransformOperationID()); //$NON-NLS-1$
-			return null;
-		}
-		
-		attributeName = getParameters()[0];
-		Assert.isNotNull(attributeName);
-		
-		if (curElement != null) {
-			curElement.removeAttribute(attributeName);
-		}
-		return curElement;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/RenameAttributeOperation.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/RenameAttributeOperation.java
deleted file mode 100644
index c924538..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/RenameAttributeOperation.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.AbstractTransformOperation;
-import org.w3c.dom.Attr;
-import org.w3c.dom.Element;
-
-/**
- * ITransformOperation implementation that renames an attribute of the current
- * Element.
- * 
- * @author Ian Trimble - Oracle
- */
-public class RenameAttributeOperation extends AbstractTransformOperation {
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.AbstractTransformOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	public Element transform(Element srcElement, Element curElement) {
-		if (getParameters().length < 2) {
-			getLog().error("Warning.TransformOperationFactory.TooFewParameters", getTransformOperationID()); //$NON-NLS-1$
-			return null;
-		}
-		
-		String oldAttributeName = getParameters()[0];
-		String newAttributeName = getParameters()[1];
-		Assert.isNotNull(oldAttributeName);
-		Assert.isNotNull(newAttributeName);
-		
-		if (curElement != null) {
-			Attr oldAttribute = curElement.getAttributeNode(oldAttributeName);
-			if (oldAttribute != null) {
-				curElement.setAttribute(newAttributeName, oldAttribute.getValue());
-				curElement.removeAttribute(oldAttributeName);
-			}
-		}
-		return curElement;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/package-info.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/package-info.java
deleted file mode 100644
index 0b15e7d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/package-info.java
+++ /dev/null
@@ -1,18 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-/**
- * Basic tag conversion operations. 
- * 
- * <p><b>Provisional API - subject to change</b></p>
- */
-package org.eclipse.jst.pagedesigner.dtmanager.converter.operations;
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/package-info.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/package-info.java
deleted file mode 100644
index dd15b1b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/package-info.java
+++ /dev/null
@@ -1,18 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-/**
- * Meta-data driven tag converters. 
- * 
- * <p><b>Provisional API - subject to change</b></p>
- */
-package org.eclipse.jst.pagedesigner.dtmanager.converter;
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/DTInfo.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/DTInfo.java
deleted file mode 100644
index a77dd4d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/DTInfo.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.pagedesigner.dtmanager.dtinfo;
-
-import org.eclipse.emf.common.util.EList;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>DT Info</b></em>'.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfo#getTagConvertInfo <em>Tag Convert Info</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfo#getTagDecorateInfos <em>Tag Decorate Infos</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage#getDTInfo()
- * @model
- * @generated
- */
-public interface DTInfo extends EObject {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2007 Oracle Corporation"; //$NON-NLS-1$
-
-	/**
-	 * Returns the value of the '<em><b>Tag Convert Info</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Tag Convert Info</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Tag Convert Info</em>' containment reference.
-	 * @see #setTagConvertInfo(TagConvertInfo)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage#getDTInfo_TagConvertInfo()
-	 * @model containment="true" required="true"
-	 *        extendedMetaData="kind='element' name='tag-convert-info'"
-	 * @generated
-	 */
-	TagConvertInfo getTagConvertInfo();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfo#getTagConvertInfo <em>Tag Convert Info</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Tag Convert Info</em>' containment reference.
-	 * @see #getTagConvertInfo()
-	 * @generated
-	 */
-	void setTagConvertInfo(TagConvertInfo value);
-
-	/**
-	 * Returns the value of the '<em><b>Tag Decorate Infos</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Tag Decorate Infos</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Tag Decorate Infos</em>' containment reference list.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage#getDTInfo_TagDecorateInfos()
-	 * @model type="org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.provisional.TagDecorateInfo" containment="true"
-	 *        extendedMetaData="kind='element' name='tag-decorate-info'"
-	 * @generated
-	 */
-	EList getTagDecorateInfos();
-
-} // DTInfo
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/DTInfoFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/DTInfoFactory.java
deleted file mode 100644
index 2577126..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/DTInfoFactory.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.pagedesigner.dtmanager.dtinfo;
-
-import org.eclipse.emf.ecore.EFactory;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Factory</b> for the model.
- * It provides a create method for each non-abstract class of the model.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage
- * @generated
- */
-public interface DTInfoFactory extends EFactory {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2007 Oracle Corporation"; //$NON-NLS-1$
-
-	/**
-	 * The singleton instance of the factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	DTInfoFactory eINSTANCE = org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.DTInfoFactoryImpl.init();
-
-	/**
-	 * Returns a new object of class '<em>DT Info</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>DT Info</em>'.
-	 * @generated
-	 */
-	DTInfo createDTInfo();
-
-	/**
-	 * Returns a new object of class '<em>Tag Convert Info</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Tag Convert Info</em>'.
-	 * @generated
-	 */
-	TagConvertInfo createTagConvertInfo();
-
-	/**
-	 * Returns a new object of class '<em>Operation</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Operation</em>'.
-	 * @generated
-	 */
-	Operation createOperation();
-
-	/**
-	 * Returns a new object of class '<em>Parameter</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Parameter</em>'.
-	 * @generated
-	 */
-	Parameter createParameter();
-
-	/**
-	 * Returns a new object of class '<em>Tag Decorate Info</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Tag Decorate Info</em>'.
-	 * @generated
-	 */
-	TagDecorateInfo createTagDecorateInfo();
-
-	/**
-	 * Returns a new object of class '<em>Resolve Attribute Value</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Resolve Attribute Value</em>'.
-	 * @generated
-	 */
-	ResolveAttributeValue createResolveAttributeValue();
-
-	/**
-	 * Returns the package supported by this factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the package supported by this factory.
-	 * @generated
-	 */
-	DTInfoPackage getDTInfoPackage();
-
-} //DTInfoFactory
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/DTInfoPackage.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/DTInfoPackage.java
deleted file mode 100644
index c42846e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/DTInfoPackage.java
+++ /dev/null
@@ -1,892 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.pagedesigner.dtmanager.dtinfo;
-
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.EReference;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Package</b> for the model.
- * It contains accessors for the meta objects to represent
- * <ul>
- *   <li>each class,</li>
- *   <li>each feature of each class,</li>
- *   <li>each enum,</li>
- *   <li>and each data type</li>
- * </ul>
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoFactory
- * @model kind="package"
- * @generated
- */
-public interface DTInfoPackage extends EPackage {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2007 Oracle Corporation"; //$NON-NLS-1$
-
-	/**
-	 * The package name.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String eNAME = "dtinfo"; //$NON-NLS-1$
-
-	/**
-	 * The package namespace URI.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String eNS_URI = "http://org.eclipse.jsf.pagedesigner/dtinfo.ecore"; //$NON-NLS-1$
-
-	/**
-	 * The package namespace name.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String eNS_PREFIX = "dti"; //$NON-NLS-1$
-
-	/**
-	 * The singleton instance of the package.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	DTInfoPackage eINSTANCE = org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.DTInfoPackageImpl.init();
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.DTInfoImpl <em>DT Info</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.DTInfoImpl
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.DTInfoPackageImpl#getDTInfo()
-	 * @generated
-	 */
-	int DT_INFO = 0;
-
-	/**
-	 * The feature id for the '<em><b>Tag Convert Info</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DT_INFO__TAG_CONVERT_INFO = 0;
-
-	/**
-	 * The feature id for the '<em><b>Tag Decorate Infos</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DT_INFO__TAG_DECORATE_INFOS = 1;
-
-	/**
-	 * The number of structural features of the '<em>DT Info</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DT_INFO_FEATURE_COUNT = 2;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.TagConvertInfoImpl <em>Tag Convert Info</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.TagConvertInfoImpl
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.DTInfoPackageImpl#getTagConvertInfo()
-	 * @generated
-	 */
-	int TAG_CONVERT_INFO = 1;
-
-	/**
-	 * The feature id for the '<em><b>Operations</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TAG_CONVERT_INFO__OPERATIONS = 0;
-
-	/**
-	 * The number of structural features of the '<em>Tag Convert Info</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TAG_CONVERT_INFO_FEATURE_COUNT = 1;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.OperationImpl <em>Operation</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.OperationImpl
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.DTInfoPackageImpl#getOperation()
-	 * @generated
-	 */
-	int OPERATION = 2;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int OPERATION__ID = 0;
-
-	/**
-	 * The feature id for the '<em><b>Parameters</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int OPERATION__PARAMETERS = 1;
-
-	/**
-	 * The feature id for the '<em><b>Operations</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int OPERATION__OPERATIONS = 2;
-
-	/**
-	 * The number of structural features of the '<em>Operation</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int OPERATION_FEATURE_COUNT = 3;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.ParameterImpl <em>Parameter</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.ParameterImpl
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.DTInfoPackageImpl#getParameter()
-	 * @generated
-	 */
-	int PARAMETER = 3;
-
-	/**
-	 * The feature id for the '<em><b>Value</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PARAMETER__VALUE = 0;
-
-	/**
-	 * The number of structural features of the '<em>Parameter</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PARAMETER_FEATURE_COUNT = 1;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.TagDecorateInfoImpl <em>Tag Decorate Info</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.TagDecorateInfoImpl
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.DTInfoPackageImpl#getTagDecorateInfo()
-	 * @generated
-	 */
-	int TAG_DECORATE_INFO = 4;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TAG_DECORATE_INFO__ID = 0;
-
-	/**
-	 * The feature id for the '<em><b>Min Height</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TAG_DECORATE_INFO__MIN_HEIGHT = 1;
-
-	/**
-	 * The feature id for the '<em><b>Min Width</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TAG_DECORATE_INFO__MIN_WIDTH = 2;
-
-	/**
-	 * The feature id for the '<em><b>Multi Level</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TAG_DECORATE_INFO__MULTI_LEVEL = 3;
-
-	/**
-	 * The feature id for the '<em><b>Need Border Decorator</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TAG_DECORATE_INFO__NEED_BORDER_DECORATOR = 4;
-
-	/**
-	 * The feature id for the '<em><b>Need Table Decorator</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TAG_DECORATE_INFO__NEED_TABLE_DECORATOR = 5;
-
-	/**
-	 * The feature id for the '<em><b>Non Visual</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TAG_DECORATE_INFO__NON_VISUAL = 6;
-
-	/**
-	 * The feature id for the '<em><b>Non Visual Image Path</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TAG_DECORATE_INFO__NON_VISUAL_IMAGE_PATH = 7;
-
-	/**
-	 * The feature id for the '<em><b>Resolve Child Text</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TAG_DECORATE_INFO__RESOLVE_CHILD_TEXT = 8;
-
-	/**
-	 * The feature id for the '<em><b>Resolve Attribute Value</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TAG_DECORATE_INFO__RESOLVE_ATTRIBUTE_VALUE = 9;
-
-	/**
-	 * The feature id for the '<em><b>Set Non Visual Child Elements</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TAG_DECORATE_INFO__SET_NON_VISUAL_CHILD_ELEMENTS = 10;
-
-	/**
-	 * The feature id for the '<em><b>Widget</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TAG_DECORATE_INFO__WIDGET = 11;
-
-	/**
-	 * The number of structural features of the '<em>Tag Decorate Info</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TAG_DECORATE_INFO_FEATURE_COUNT = 12;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.ResolveAttributeValueImpl <em>Resolve Attribute Value</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.ResolveAttributeValueImpl
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.DTInfoPackageImpl#getResolveAttributeValue()
-	 * @generated
-	 */
-	int RESOLVE_ATTRIBUTE_VALUE = 5;
-
-	/**
-	 * The feature id for the '<em><b>Attribute Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RESOLVE_ATTRIBUTE_VALUE__ATTRIBUTE_NAME = 0;
-
-	/**
-	 * The number of structural features of the '<em>Resolve Attribute Value</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RESOLVE_ATTRIBUTE_VALUE_FEATURE_COUNT = 1;
-
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfo <em>DT Info</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>DT Info</em>'.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfo
-	 * @generated
-	 */
-	EClass getDTInfo();
-
-	/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfo#getTagConvertInfo <em>Tag Convert Info</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Tag Convert Info</em>'.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfo#getTagConvertInfo()
-	 * @see #getDTInfo()
-	 * @generated
-	 */
-	EReference getDTInfo_TagConvertInfo();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfo#getTagDecorateInfos <em>Tag Decorate Infos</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Tag Decorate Infos</em>'.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfo#getTagDecorateInfos()
-	 * @see #getDTInfo()
-	 * @generated
-	 */
-	EReference getDTInfo_TagDecorateInfos();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagConvertInfo <em>Tag Convert Info</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Tag Convert Info</em>'.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagConvertInfo
-	 * @generated
-	 */
-	EClass getTagConvertInfo();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagConvertInfo#getOperations <em>Operations</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Operations</em>'.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagConvertInfo#getOperations()
-	 * @see #getTagConvertInfo()
-	 * @generated
-	 */
-	EReference getTagConvertInfo_Operations();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Operation <em>Operation</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Operation</em>'.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Operation
-	 * @generated
-	 */
-	EClass getOperation();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Operation#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Operation#getId()
-	 * @see #getOperation()
-	 * @generated
-	 */
-	EAttribute getOperation_Id();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Operation#getParameters <em>Parameters</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Parameters</em>'.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Operation#getParameters()
-	 * @see #getOperation()
-	 * @generated
-	 */
-	EReference getOperation_Parameters();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Operation#getOperations <em>Operations</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Operations</em>'.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Operation#getOperations()
-	 * @see #getOperation()
-	 * @generated
-	 */
-	EReference getOperation_Operations();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Parameter <em>Parameter</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Parameter</em>'.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Parameter
-	 * @generated
-	 */
-	EClass getParameter();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Parameter#getValue <em>Value</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Value</em>'.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Parameter#getValue()
-	 * @see #getParameter()
-	 * @generated
-	 */
-	EAttribute getParameter_Value();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo <em>Tag Decorate Info</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Tag Decorate Info</em>'.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo
-	 * @generated
-	 */
-	EClass getTagDecorateInfo();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#getId()
-	 * @see #getTagDecorateInfo()
-	 * @generated
-	 */
-	EAttribute getTagDecorateInfo_Id();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#getMinHeight <em>Min Height</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Min Height</em>'.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#getMinHeight()
-	 * @see #getTagDecorateInfo()
-	 * @generated
-	 */
-	EAttribute getTagDecorateInfo_MinHeight();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#getMinWidth <em>Min Width</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Min Width</em>'.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#getMinWidth()
-	 * @see #getTagDecorateInfo()
-	 * @generated
-	 */
-	EAttribute getTagDecorateInfo_MinWidth();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isMultiLevel <em>Multi Level</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Multi Level</em>'.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isMultiLevel()
-	 * @see #getTagDecorateInfo()
-	 * @generated
-	 */
-	EAttribute getTagDecorateInfo_MultiLevel();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isNeedBorderDecorator <em>Need Border Decorator</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Need Border Decorator</em>'.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isNeedBorderDecorator()
-	 * @see #getTagDecorateInfo()
-	 * @generated
-	 */
-	EAttribute getTagDecorateInfo_NeedBorderDecorator();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isNeedTableDecorator <em>Need Table Decorator</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Need Table Decorator</em>'.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isNeedTableDecorator()
-	 * @see #getTagDecorateInfo()
-	 * @generated
-	 */
-	EAttribute getTagDecorateInfo_NeedTableDecorator();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isNonVisual <em>Non Visual</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Non Visual</em>'.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isNonVisual()
-	 * @see #getTagDecorateInfo()
-	 * @generated
-	 */
-	EAttribute getTagDecorateInfo_NonVisual();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#getNonVisualImagePath <em>Non Visual Image Path</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Non Visual Image Path</em>'.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#getNonVisualImagePath()
-	 * @see #getTagDecorateInfo()
-	 * @generated
-	 */
-	EAttribute getTagDecorateInfo_NonVisualImagePath();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isResolveChildText <em>Resolve Child Text</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Resolve Child Text</em>'.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isResolveChildText()
-	 * @see #getTagDecorateInfo()
-	 * @generated
-	 */
-	EAttribute getTagDecorateInfo_ResolveChildText();
-
-	/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#getResolveAttributeValue <em>Resolve Attribute Value</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Resolve Attribute Value</em>'.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#getResolveAttributeValue()
-	 * @see #getTagDecorateInfo()
-	 * @generated
-	 */
-	EReference getTagDecorateInfo_ResolveAttributeValue();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isSetNonVisualChildElements <em>Set Non Visual Child Elements</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Set Non Visual Child Elements</em>'.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isSetNonVisualChildElements()
-	 * @see #getTagDecorateInfo()
-	 * @generated
-	 */
-	EAttribute getTagDecorateInfo_SetNonVisualChildElements();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isWidget <em>Widget</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Widget</em>'.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isWidget()
-	 * @see #getTagDecorateInfo()
-	 * @generated
-	 */
-	EAttribute getTagDecorateInfo_Widget();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.ResolveAttributeValue <em>Resolve Attribute Value</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Resolve Attribute Value</em>'.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.ResolveAttributeValue
-	 * @generated
-	 */
-	EClass getResolveAttributeValue();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.ResolveAttributeValue#getAttributeName <em>Attribute Name</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Attribute Name</em>'.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.ResolveAttributeValue#getAttributeName()
-	 * @see #getResolveAttributeValue()
-	 * @generated
-	 */
-	EAttribute getResolveAttributeValue_AttributeName();
-
-	/**
-	 * Returns the factory that creates the instances of the model.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the factory that creates the instances of the model.
-	 * @generated
-	 */
-	DTInfoFactory getDTInfoFactory();
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * Defines literals for the meta objects that represent
-	 * <ul>
-	 *   <li>each class,</li>
-	 *   <li>each feature of each class,</li>
-	 *   <li>each enum,</li>
-	 *   <li>and each data type</li>
-	 * </ul>
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-    @SuppressWarnings("hiding")
-	interface Literals {
-		/**
-		 * The meta object literal for the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.DTInfoImpl <em>DT Info</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.DTInfoImpl
-		 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.DTInfoPackageImpl#getDTInfo()
-		 * @generated
-		 */
-		EClass DT_INFO = eINSTANCE.getDTInfo();
-
-		/**
-		 * The meta object literal for the '<em><b>Tag Convert Info</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DT_INFO__TAG_CONVERT_INFO = eINSTANCE.getDTInfo_TagConvertInfo();
-
-		/**
-		 * The meta object literal for the '<em><b>Tag Decorate Infos</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference DT_INFO__TAG_DECORATE_INFOS = eINSTANCE.getDTInfo_TagDecorateInfos();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.TagConvertInfoImpl <em>Tag Convert Info</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.TagConvertInfoImpl
-		 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.DTInfoPackageImpl#getTagConvertInfo()
-		 * @generated
-		 */
-		EClass TAG_CONVERT_INFO = eINSTANCE.getTagConvertInfo();
-
-		/**
-		 * The meta object literal for the '<em><b>Operations</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference TAG_CONVERT_INFO__OPERATIONS = eINSTANCE.getTagConvertInfo_Operations();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.OperationImpl <em>Operation</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.OperationImpl
-		 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.DTInfoPackageImpl#getOperation()
-		 * @generated
-		 */
-		EClass OPERATION = eINSTANCE.getOperation();
-
-		/**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute OPERATION__ID = eINSTANCE.getOperation_Id();
-
-		/**
-		 * The meta object literal for the '<em><b>Parameters</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference OPERATION__PARAMETERS = eINSTANCE.getOperation_Parameters();
-
-		/**
-		 * The meta object literal for the '<em><b>Operations</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference OPERATION__OPERATIONS = eINSTANCE.getOperation_Operations();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.ParameterImpl <em>Parameter</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.ParameterImpl
-		 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.DTInfoPackageImpl#getParameter()
-		 * @generated
-		 */
-		EClass PARAMETER = eINSTANCE.getParameter();
-
-		/**
-		 * The meta object literal for the '<em><b>Value</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute PARAMETER__VALUE = eINSTANCE.getParameter_Value();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.TagDecorateInfoImpl <em>Tag Decorate Info</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.TagDecorateInfoImpl
-		 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.DTInfoPackageImpl#getTagDecorateInfo()
-		 * @generated
-		 */
-		EClass TAG_DECORATE_INFO = eINSTANCE.getTagDecorateInfo();
-
-		/**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute TAG_DECORATE_INFO__ID = eINSTANCE.getTagDecorateInfo_Id();
-
-		/**
-		 * The meta object literal for the '<em><b>Min Height</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute TAG_DECORATE_INFO__MIN_HEIGHT = eINSTANCE.getTagDecorateInfo_MinHeight();
-
-		/**
-		 * The meta object literal for the '<em><b>Min Width</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute TAG_DECORATE_INFO__MIN_WIDTH = eINSTANCE.getTagDecorateInfo_MinWidth();
-
-		/**
-		 * The meta object literal for the '<em><b>Multi Level</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute TAG_DECORATE_INFO__MULTI_LEVEL = eINSTANCE.getTagDecorateInfo_MultiLevel();
-
-		/**
-		 * The meta object literal for the '<em><b>Need Border Decorator</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute TAG_DECORATE_INFO__NEED_BORDER_DECORATOR = eINSTANCE.getTagDecorateInfo_NeedBorderDecorator();
-
-		/**
-		 * The meta object literal for the '<em><b>Need Table Decorator</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute TAG_DECORATE_INFO__NEED_TABLE_DECORATOR = eINSTANCE.getTagDecorateInfo_NeedTableDecorator();
-
-		/**
-		 * The meta object literal for the '<em><b>Non Visual</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute TAG_DECORATE_INFO__NON_VISUAL = eINSTANCE.getTagDecorateInfo_NonVisual();
-
-		/**
-		 * The meta object literal for the '<em><b>Non Visual Image Path</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute TAG_DECORATE_INFO__NON_VISUAL_IMAGE_PATH = eINSTANCE.getTagDecorateInfo_NonVisualImagePath();
-
-		/**
-		 * The meta object literal for the '<em><b>Resolve Child Text</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute TAG_DECORATE_INFO__RESOLVE_CHILD_TEXT = eINSTANCE.getTagDecorateInfo_ResolveChildText();
-
-		/**
-		 * The meta object literal for the '<em><b>Resolve Attribute Value</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference TAG_DECORATE_INFO__RESOLVE_ATTRIBUTE_VALUE = eINSTANCE.getTagDecorateInfo_ResolveAttributeValue();
-
-		/**
-		 * The meta object literal for the '<em><b>Set Non Visual Child Elements</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute TAG_DECORATE_INFO__SET_NON_VISUAL_CHILD_ELEMENTS = eINSTANCE.getTagDecorateInfo_SetNonVisualChildElements();
-
-		/**
-		 * The meta object literal for the '<em><b>Widget</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute TAG_DECORATE_INFO__WIDGET = eINSTANCE.getTagDecorateInfo_Widget();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.ResolveAttributeValueImpl <em>Resolve Attribute Value</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.ResolveAttributeValueImpl
-		 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.DTInfoPackageImpl#getResolveAttributeValue()
-		 * @generated
-		 */
-		EClass RESOLVE_ATTRIBUTE_VALUE = eINSTANCE.getResolveAttributeValue();
-
-		/**
-		 * The meta object literal for the '<em><b>Attribute Name</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute RESOLVE_ATTRIBUTE_VALUE__ATTRIBUTE_NAME = eINSTANCE.getResolveAttributeValue_AttributeName();
-
-	}
-
-} //DTInfoPackage
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/Operation.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/Operation.java
deleted file mode 100644
index 4377cc0..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/Operation.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.pagedesigner.dtmanager.dtinfo;
-
-import org.eclipse.emf.common.util.EList;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Operation</b></em>'.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Operation#getId <em>Id</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Operation#getParameters <em>Parameters</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Operation#getOperations <em>Operations</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage#getOperation()
- * @model
- * @generated
- */
-public interface Operation extends EObject {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2007 Oracle Corporation"; //$NON-NLS-1$
-
-	/**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage#getOperation_Id()
-	 * @model id="true" required="true"
-	 * @generated
-	 */
-	String getId();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Operation#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Parameters</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Parameter}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Parameters</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Parameters</em>' containment reference list.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage#getOperation_Parameters()
-	 * @model type="org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.provisional.Parameter" containment="true"
-	 *        extendedMetaData="kind='element' name='parameter'"
-	 * @generated
-	 */
-	EList getParameters();
-
-	/**
-	 * Returns the value of the '<em><b>Operations</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Operation}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Operations</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Operations</em>' containment reference list.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage#getOperation_Operations()
-	 * @model type="org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.provisional.Operation" containment="true"
-	 *        extendedMetaData="kind='element' name='operation'"
-	 * @generated
-	 */
-	EList getOperations();
-
-} // Operation
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/Parameter.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/Parameter.java
deleted file mode 100644
index 312a297..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/Parameter.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.pagedesigner.dtmanager.dtinfo;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Parameter</b></em>'.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Parameter#getValue <em>Value</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage#getParameter()
- * @model
- * @generated
- */
-public interface Parameter extends EObject {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2007 Oracle Corporation"; //$NON-NLS-1$
-
-	/**
-	 * Returns the value of the '<em><b>Value</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Value</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Value</em>' attribute.
-	 * @see #setValue(String)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage#getParameter_Value()
-	 * @model required="true"
-	 * @generated
-	 */
-	String getValue();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Parameter#getValue <em>Value</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Value</em>' attribute.
-	 * @see #getValue()
-	 * @generated
-	 */
-	void setValue(String value);
-
-} // Parameter
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/ResolveAttributeValue.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/ResolveAttributeValue.java
deleted file mode 100644
index 07a4271..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/ResolveAttributeValue.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.pagedesigner.dtmanager.dtinfo;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Resolve Attribute Value</b></em>'.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.ResolveAttributeValue#getAttributeName <em>Attribute Name</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage#getResolveAttributeValue()
- * @model
- * @generated
- */
-public interface ResolveAttributeValue extends EObject {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2007 Oracle Corporation"; //$NON-NLS-1$
-
-	/**
-	 * Returns the value of the '<em><b>Attribute Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Attribute Name</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Attribute Name</em>' attribute.
-	 * @see #setAttributeName(String)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage#getResolveAttributeValue_AttributeName()
-	 * @model required="true"
-	 * @generated
-	 */
-	String getAttributeName();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.ResolveAttributeValue#getAttributeName <em>Attribute Name</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Attribute Name</em>' attribute.
-	 * @see #getAttributeName()
-	 * @generated
-	 */
-	void setAttributeName(String value);
-
-} // ResolveAttributeValue
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/TagConvertInfo.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/TagConvertInfo.java
deleted file mode 100644
index 0f0049c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/TagConvertInfo.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.pagedesigner.dtmanager.dtinfo;
-
-import org.eclipse.emf.common.util.EList;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Tag Convert Info</b></em>'.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagConvertInfo#getOperations <em>Operations</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage#getTagConvertInfo()
- * @model
- * @generated
- */
-public interface TagConvertInfo extends EObject {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2007 Oracle Corporation"; //$NON-NLS-1$
-
-	/**
-	 * Returns the value of the '<em><b>Operations</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Operation}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Operations</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Operations</em>' containment reference list.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage#getTagConvertInfo_Operations()
-	 * @model type="org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.provisional.Operation" containment="true"
-	 *        extendedMetaData="kind='element' name='operation'"
-	 * @generated
-	 */
-	EList getOperations();
-
-} // TagConvertInfo
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/TagDecorateInfo.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/TagDecorateInfo.java
deleted file mode 100644
index 726e237..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/TagDecorateInfo.java
+++ /dev/null
@@ -1,369 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.pagedesigner.dtmanager.dtinfo;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Tag Decorate Info</b></em>'.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#getId <em>Id</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#getMinHeight <em>Min Height</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#getMinWidth <em>Min Width</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isMultiLevel <em>Multi Level</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isNeedBorderDecorator <em>Need Border Decorator</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isNeedTableDecorator <em>Need Table Decorator</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isNonVisual <em>Non Visual</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#getNonVisualImagePath <em>Non Visual Image Path</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isResolveChildText <em>Resolve Child Text</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#getResolveAttributeValue <em>Resolve Attribute Value</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isSetNonVisualChildElements <em>Set Non Visual Child Elements</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isWidget <em>Widget</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage#getTagDecorateInfo()
- * @model
- * @generated
- */
-public interface TagDecorateInfo extends EObject {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2007 Oracle Corporation"; //$NON-NLS-1$
-
-	/**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage#getTagDecorateInfo_Id()
-	 * @model id="true" required="true"
-	 * @generated
-	 */
-	String getId();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Min Height</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Min Height</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Min Height</em>' attribute.
-	 * @see #setMinHeight(int)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage#getTagDecorateInfo_MinHeight()
-	 * @model
-	 * @generated
-	 */
-	int getMinHeight();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#getMinHeight <em>Min Height</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Min Height</em>' attribute.
-	 * @see #getMinHeight()
-	 * @generated
-	 */
-	void setMinHeight(int value);
-
-	/**
-	 * Returns the value of the '<em><b>Min Width</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Min Width</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Min Width</em>' attribute.
-	 * @see #setMinWidth(int)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage#getTagDecorateInfo_MinWidth()
-	 * @model
-	 * @generated
-	 */
-	int getMinWidth();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#getMinWidth <em>Min Width</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Min Width</em>' attribute.
-	 * @see #getMinWidth()
-	 * @generated
-	 */
-	void setMinWidth(int value);
-
-	/**
-	 * Returns the value of the '<em><b>Multi Level</b></em>' attribute.
-	 * The default value is <code>"false"</code>.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Multi Level</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Multi Level</em>' attribute.
-	 * @see #setMultiLevel(boolean)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage#getTagDecorateInfo_MultiLevel()
-	 * @model default="false"
-	 * @generated
-	 */
-	boolean isMultiLevel();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isMultiLevel <em>Multi Level</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Multi Level</em>' attribute.
-	 * @see #isMultiLevel()
-	 * @generated
-	 */
-	void setMultiLevel(boolean value);
-
-	/**
-	 * Returns the value of the '<em><b>Need Border Decorator</b></em>' attribute.
-	 * The default value is <code>"false"</code>.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Need Border Decorator</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Need Border Decorator</em>' attribute.
-	 * @see #setNeedBorderDecorator(boolean)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage#getTagDecorateInfo_NeedBorderDecorator()
-	 * @model default="false"
-	 * @generated
-	 */
-	boolean isNeedBorderDecorator();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isNeedBorderDecorator <em>Need Border Decorator</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Need Border Decorator</em>' attribute.
-	 * @see #isNeedBorderDecorator()
-	 * @generated
-	 */
-	void setNeedBorderDecorator(boolean value);
-
-	/**
-	 * Returns the value of the '<em><b>Need Table Decorator</b></em>' attribute.
-	 * The default value is <code>"false"</code>.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Need Table Decorator</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Need Table Decorator</em>' attribute.
-	 * @see #setNeedTableDecorator(boolean)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage#getTagDecorateInfo_NeedTableDecorator()
-	 * @model default="false"
-	 * @generated
-	 */
-	boolean isNeedTableDecorator();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isNeedTableDecorator <em>Need Table Decorator</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Need Table Decorator</em>' attribute.
-	 * @see #isNeedTableDecorator()
-	 * @generated
-	 */
-	void setNeedTableDecorator(boolean value);
-
-	/**
-	 * Returns the value of the '<em><b>Non Visual</b></em>' attribute.
-	 * The default value is <code>"false"</code>.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Non Visual</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Non Visual</em>' attribute.
-	 * @see #setNonVisual(boolean)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage#getTagDecorateInfo_NonVisual()
-	 * @model default="false"
-	 * @generated
-	 */
-	boolean isNonVisual();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isNonVisual <em>Non Visual</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Non Visual</em>' attribute.
-	 * @see #isNonVisual()
-	 * @generated
-	 */
-	void setNonVisual(boolean value);
-
-	/**
-	 * Returns the value of the '<em><b>Non Visual Image Path</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Non Visual Image Path</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Non Visual Image Path</em>' attribute.
-	 * @see #setNonVisualImagePath(String)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage#getTagDecorateInfo_NonVisualImagePath()
-	 * @model
-	 * @generated
-	 */
-	String getNonVisualImagePath();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#getNonVisualImagePath <em>Non Visual Image Path</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Non Visual Image Path</em>' attribute.
-	 * @see #getNonVisualImagePath()
-	 * @generated
-	 */
-	void setNonVisualImagePath(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Resolve Child Text</b></em>' attribute.
-	 * The default value is <code>"false"</code>.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Resolve Child Text</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Resolve Child Text</em>' attribute.
-	 * @see #setResolveChildText(boolean)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage#getTagDecorateInfo_ResolveChildText()
-	 * @model default="false"
-	 * @generated
-	 */
-	boolean isResolveChildText();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isResolveChildText <em>Resolve Child Text</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Resolve Child Text</em>' attribute.
-	 * @see #isResolveChildText()
-	 * @generated
-	 */
-	void setResolveChildText(boolean value);
-
-	/**
-	 * Returns the value of the '<em><b>Resolve Attribute Value</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Resolve Attribute Value</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Resolve Attribute Value</em>' containment reference.
-	 * @see #setResolveAttributeValue(ResolveAttributeValue)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage#getTagDecorateInfo_ResolveAttributeValue()
-	 * @model containment="true"
-	 *        extendedMetaData="kind='element' name='resolve-attribute-value'"
-	 * @generated
-	 */
-	ResolveAttributeValue getResolveAttributeValue();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#getResolveAttributeValue <em>Resolve Attribute Value</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Resolve Attribute Value</em>' containment reference.
-	 * @see #getResolveAttributeValue()
-	 * @generated
-	 */
-	void setResolveAttributeValue(ResolveAttributeValue value);
-
-	/**
-	 * Returns the value of the '<em><b>Set Non Visual Child Elements</b></em>' attribute.
-	 * The default value is <code>"false"</code>.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Set Non Visual Child Elements</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Set Non Visual Child Elements</em>' attribute.
-	 * @see #setSetNonVisualChildElements(boolean)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage#getTagDecorateInfo_SetNonVisualChildElements()
-	 * @model default="false"
-	 * @generated
-	 */
-	boolean isSetNonVisualChildElements();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isSetNonVisualChildElements <em>Set Non Visual Child Elements</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Set Non Visual Child Elements</em>' attribute.
-	 * @see #isSetNonVisualChildElements()
-	 * @generated
-	 */
-	void setSetNonVisualChildElements(boolean value);
-
-	/**
-	 * Returns the value of the '<em><b>Widget</b></em>' attribute.
-	 * The default value is <code>"false"</code>.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Widget</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Widget</em>' attribute.
-	 * @see #setWidget(boolean)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage#getTagDecorateInfo_Widget()
-	 * @model default="false"
-	 * @generated
-	 */
-	boolean isWidget();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isWidget <em>Widget</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Widget</em>' attribute.
-	 * @see #isWidget()
-	 * @generated
-	 */
-	void setWidget(boolean value);
-
-} // TagDecorateInfo
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/impl/DTInfoFactoryImpl.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/impl/DTInfoFactoryImpl.java
deleted file mode 100644
index 32c888c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/impl/DTInfoFactoryImpl.java
+++ /dev/null
@@ -1,161 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EPackage;
-
-import org.eclipse.emf.ecore.impl.EFactoryImpl;
-
-import org.eclipse.emf.ecore.plugin.EcorePlugin;
-
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.*;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model <b>Factory</b>.
- * <!-- end-user-doc -->
- * @generated
- */
-public class DTInfoFactoryImpl extends EFactoryImpl implements DTInfoFactory {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2007 Oracle Corporation"; //$NON-NLS-1$
-
-	/**
-	 * Creates the default factory implementation.
-	 * <!-- begin-user-doc -->
-     * @return the factory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static DTInfoFactory init() {
-		try {
-			DTInfoFactory theDTInfoFactory = (DTInfoFactory)EPackage.Registry.INSTANCE.getEFactory("http://org.eclipse.jsf.pagedesigner/dtinfo.ecore");  //$NON-NLS-1$
-			if (theDTInfoFactory != null) {
-				return theDTInfoFactory;
-			}
-		}
-		catch (Exception exception) {
-			EcorePlugin.INSTANCE.log(exception);
-		}
-		return new DTInfoFactoryImpl();
-	}
-
-	/**
-	 * Creates an instance of the factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public DTInfoFactoryImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EObject create(EClass eClass) {
-		switch (eClass.getClassifierID()) {
-			case DTInfoPackage.DT_INFO: return createDTInfo();
-			case DTInfoPackage.TAG_CONVERT_INFO: return createTagConvertInfo();
-			case DTInfoPackage.OPERATION: return createOperation();
-			case DTInfoPackage.PARAMETER: return createParameter();
-			case DTInfoPackage.TAG_DECORATE_INFO: return createTagDecorateInfo();
-			case DTInfoPackage.RESOLVE_ATTRIBUTE_VALUE: return createResolveAttributeValue();
-			default:
-				throw new IllegalArgumentException("The class '" + eClass.getName() + "' is not a valid classifier"); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public DTInfo createDTInfo() {
-		DTInfoImpl dtInfo = new DTInfoImpl();
-		return dtInfo;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public TagConvertInfo createTagConvertInfo() {
-		TagConvertInfoImpl tagConvertInfo = new TagConvertInfoImpl();
-		return tagConvertInfo;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Operation createOperation() {
-		OperationImpl operation = new OperationImpl();
-		return operation;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Parameter createParameter() {
-		ParameterImpl parameter = new ParameterImpl();
-		return parameter;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public TagDecorateInfo createTagDecorateInfo() {
-		TagDecorateInfoImpl tagDecorateInfo = new TagDecorateInfoImpl();
-		return tagDecorateInfo;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResolveAttributeValue createResolveAttributeValue() {
-		ResolveAttributeValueImpl resolveAttributeValue = new ResolveAttributeValueImpl();
-		return resolveAttributeValue;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public DTInfoPackage getDTInfoPackage() {
-		return (DTInfoPackage)getEPackage();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-     * @return  the package
-	 * <!-- end-user-doc -->
-	 * @deprecated
-	 * @generated
-	 */
-	public static DTInfoPackage getPackage() {
-		return DTInfoPackage.eINSTANCE;
-	}
-
-} //DTInfoFactoryImpl
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/impl/DTInfoImpl.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/impl/DTInfoImpl.java
deleted file mode 100644
index d4533a4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/impl/DTInfoImpl.java
+++ /dev/null
@@ -1,228 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-
-import org.eclipse.emf.common.util.EList;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfo;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagConvertInfo;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>DT Info</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.DTInfoImpl#getTagConvertInfo <em>Tag Convert Info</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.DTInfoImpl#getTagDecorateInfos <em>Tag Decorate Infos</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class DTInfoImpl extends EObjectImpl implements DTInfo {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2007 Oracle Corporation"; //$NON-NLS-1$
-
-	/**
-	 * The cached value of the '{@link #getTagConvertInfo() <em>Tag Convert Info</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTagConvertInfo()
-	 * @generated
-	 * @ordered
-	 */
-	protected TagConvertInfo tagConvertInfo;
-
-	/**
-	 * The cached value of the '{@link #getTagDecorateInfos() <em>Tag Decorate Infos</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTagDecorateInfos()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList tagDecorateInfos;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected DTInfoImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return DTInfoPackage.Literals.DT_INFO;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public TagConvertInfo getTagConvertInfo() {
-		return tagConvertInfo;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-     * @param newTagConvertInfo 
-     * @param msgs 
-     * @return the notification chaing 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetTagConvertInfo(TagConvertInfo newTagConvertInfo, NotificationChain msgs) {
-		TagConvertInfo oldTagConvertInfo = tagConvertInfo;
-		tagConvertInfo = newTagConvertInfo;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, DTInfoPackage.DT_INFO__TAG_CONVERT_INFO, oldTagConvertInfo, newTagConvertInfo);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTagConvertInfo(TagConvertInfo newTagConvertInfo) {
-		if (newTagConvertInfo != tagConvertInfo) {
-			NotificationChain msgs = null;
-			if (tagConvertInfo != null)
-				msgs = ((InternalEObject)tagConvertInfo).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - DTInfoPackage.DT_INFO__TAG_CONVERT_INFO, null, msgs);
-			if (newTagConvertInfo != null)
-				msgs = ((InternalEObject)newTagConvertInfo).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - DTInfoPackage.DT_INFO__TAG_CONVERT_INFO, null, msgs);
-			msgs = basicSetTagConvertInfo(newTagConvertInfo, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, DTInfoPackage.DT_INFO__TAG_CONVERT_INFO, newTagConvertInfo, newTagConvertInfo));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getTagDecorateInfos() {
-		if (tagDecorateInfos == null) {
-			tagDecorateInfos = new EObjectContainmentEList(TagDecorateInfo.class, this, DTInfoPackage.DT_INFO__TAG_DECORATE_INFOS);
-		}
-		return tagDecorateInfos;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case DTInfoPackage.DT_INFO__TAG_CONVERT_INFO:
-				return basicSetTagConvertInfo(null, msgs);
-			case DTInfoPackage.DT_INFO__TAG_DECORATE_INFOS:
-				return ((InternalEList)getTagDecorateInfos()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case DTInfoPackage.DT_INFO__TAG_CONVERT_INFO:
-				return getTagConvertInfo();
-			case DTInfoPackage.DT_INFO__TAG_DECORATE_INFOS:
-				return getTagDecorateInfos();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case DTInfoPackage.DT_INFO__TAG_CONVERT_INFO:
-				setTagConvertInfo((TagConvertInfo)newValue);
-				return;
-			case DTInfoPackage.DT_INFO__TAG_DECORATE_INFOS:
-				getTagDecorateInfos().clear();
-				getTagDecorateInfos().addAll((Collection)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case DTInfoPackage.DT_INFO__TAG_CONVERT_INFO:
-				setTagConvertInfo((TagConvertInfo)null);
-				return;
-			case DTInfoPackage.DT_INFO__TAG_DECORATE_INFOS:
-				getTagDecorateInfos().clear();
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case DTInfoPackage.DT_INFO__TAG_CONVERT_INFO:
-				return tagConvertInfo != null;
-			case DTInfoPackage.DT_INFO__TAG_DECORATE_INFOS:
-				return tagDecorateInfos != null && !tagDecorateInfos.isEmpty();
-		}
-		return super.eIsSet(featureID);
-	}
-
-} //DTInfoImpl
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/impl/DTInfoPackageImpl.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/impl/DTInfoPackageImpl.java
deleted file mode 100644
index 9fa791f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/impl/DTInfoPackageImpl.java
+++ /dev/null
@@ -1,563 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl;
-
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.EReference;
-
-import org.eclipse.emf.ecore.impl.EPackageImpl;
-
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfo;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoFactory;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Operation;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Parameter;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.ResolveAttributeValue;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagConvertInfo;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model <b>Package</b>.
- * <!-- end-user-doc -->
- * @generated
- */
-public class DTInfoPackageImpl extends EPackageImpl implements DTInfoPackage {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2007 Oracle Corporation"; //$NON-NLS-1$
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass dtInfoEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass tagConvertInfoEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass operationEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass parameterEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass tagDecorateInfoEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass resolveAttributeValueEClass = null;
-
-	/**
-	 * Creates an instance of the model <b>Package</b>, registered with
-	 * {@link org.eclipse.emf.ecore.EPackage.Registry EPackage.Registry} by the package
-	 * package URI value.
-	 * <p>Note: the correct way to create the package is via the static
-	 * factory method {@link #init init()}, which also performs
-	 * initialization of the package, or returns the registered package,
-	 * if one already exists.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.emf.ecore.EPackage.Registry
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage#eNS_URI
-	 * @see #init()
-	 * @generated
-	 */
-	private DTInfoPackageImpl() {
-		super(eNS_URI, DTInfoFactory.eINSTANCE);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static boolean isInited = false;
-
-	/**
-	 * Creates, registers, and initializes the <b>Package</b> for this
-	 * model, and for any others upon which it depends.  Simple
-	 * dependencies are satisfied by calling this method on all
-	 * dependent packages before doing anything else.  This method drives
-	 * initialization for interdependent packages directly, in parallel
-	 * with this package, itself.
-	 * <p>Of this package and its interdependencies, all packages which
-	 * have not yet been registered by their URI values are first created
-	 * and registered.  The packages are then initialized in two steps:
-	 * meta-model objects for all of the packages are created before any
-	 * are initialized, since one package's meta-model objects may refer to
-	 * those of another.
-	 * <p>Invocation of this method will not affect any packages that have
-	 * already been initialized.
-	 * <!-- begin-user-doc -->
-     * @return the package 
-	 * <!-- end-user-doc -->
-	 * @see #eNS_URI
-	 * @see #createPackageContents()
-	 * @see #initializePackageContents()
-	 * @generated
-	 */
-	public static DTInfoPackage init() {
-		if (isInited) return (DTInfoPackage)EPackage.Registry.INSTANCE.getEPackage(DTInfoPackage.eNS_URI);
-
-		// Obtain or create and register package
-		DTInfoPackageImpl theDTInfoPackage = (DTInfoPackageImpl)(EPackage.Registry.INSTANCE.getEPackage(eNS_URI) instanceof DTInfoPackageImpl ? EPackage.Registry.INSTANCE.getEPackage(eNS_URI) : new DTInfoPackageImpl());
-
-		isInited = true;
-
-		// Create package meta-data objects
-		theDTInfoPackage.createPackageContents();
-
-		// Initialize created meta-data
-		theDTInfoPackage.initializePackageContents();
-
-		// Mark meta-data to indicate it can't be changed
-		theDTInfoPackage.freeze();
-
-		return theDTInfoPackage;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getDTInfo() {
-		return dtInfoEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDTInfo_TagConvertInfo() {
-		return (EReference)dtInfoEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDTInfo_TagDecorateInfos() {
-		return (EReference)dtInfoEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getTagConvertInfo() {
-		return tagConvertInfoEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getTagConvertInfo_Operations() {
-		return (EReference)tagConvertInfoEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getOperation() {
-		return operationEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getOperation_Id() {
-		return (EAttribute)operationEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getOperation_Parameters() {
-		return (EReference)operationEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getOperation_Operations() {
-		return (EReference)operationEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getParameter() {
-		return parameterEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getParameter_Value() {
-		return (EAttribute)parameterEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getTagDecorateInfo() {
-		return tagDecorateInfoEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTagDecorateInfo_Id() {
-		return (EAttribute)tagDecorateInfoEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTagDecorateInfo_MinHeight() {
-		return (EAttribute)tagDecorateInfoEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTagDecorateInfo_MinWidth() {
-		return (EAttribute)tagDecorateInfoEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTagDecorateInfo_MultiLevel() {
-		return (EAttribute)tagDecorateInfoEClass.getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTagDecorateInfo_NeedBorderDecorator() {
-		return (EAttribute)tagDecorateInfoEClass.getEStructuralFeatures().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTagDecorateInfo_NeedTableDecorator() {
-		return (EAttribute)tagDecorateInfoEClass.getEStructuralFeatures().get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTagDecorateInfo_NonVisual() {
-		return (EAttribute)tagDecorateInfoEClass.getEStructuralFeatures().get(6);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTagDecorateInfo_NonVisualImagePath() {
-		return (EAttribute)tagDecorateInfoEClass.getEStructuralFeatures().get(7);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTagDecorateInfo_ResolveChildText() {
-		return (EAttribute)tagDecorateInfoEClass.getEStructuralFeatures().get(8);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getTagDecorateInfo_ResolveAttributeValue() {
-		return (EReference)tagDecorateInfoEClass.getEStructuralFeatures().get(9);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTagDecorateInfo_SetNonVisualChildElements() {
-		return (EAttribute)tagDecorateInfoEClass.getEStructuralFeatures().get(10);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTagDecorateInfo_Widget() {
-		return (EAttribute)tagDecorateInfoEClass.getEStructuralFeatures().get(11);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getResolveAttributeValue() {
-		return resolveAttributeValueEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getResolveAttributeValue_AttributeName() {
-		return (EAttribute)resolveAttributeValueEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public DTInfoFactory getDTInfoFactory() {
-		return (DTInfoFactory)getEFactoryInstance();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private boolean isCreated = false;
-
-	/**
-	 * Creates the meta-model objects for the package.  This method is
-	 * guarded to have no affect on any invocation but its first.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void createPackageContents() {
-		if (isCreated) return;
-		isCreated = true;
-
-		// Create classes and their features
-		dtInfoEClass = createEClass(DT_INFO);
-		createEReference(dtInfoEClass, DT_INFO__TAG_CONVERT_INFO);
-		createEReference(dtInfoEClass, DT_INFO__TAG_DECORATE_INFOS);
-
-		tagConvertInfoEClass = createEClass(TAG_CONVERT_INFO);
-		createEReference(tagConvertInfoEClass, TAG_CONVERT_INFO__OPERATIONS);
-
-		operationEClass = createEClass(OPERATION);
-		createEAttribute(operationEClass, OPERATION__ID);
-		createEReference(operationEClass, OPERATION__PARAMETERS);
-		createEReference(operationEClass, OPERATION__OPERATIONS);
-
-		parameterEClass = createEClass(PARAMETER);
-		createEAttribute(parameterEClass, PARAMETER__VALUE);
-
-		tagDecorateInfoEClass = createEClass(TAG_DECORATE_INFO);
-		createEAttribute(tagDecorateInfoEClass, TAG_DECORATE_INFO__ID);
-		createEAttribute(tagDecorateInfoEClass, TAG_DECORATE_INFO__MIN_HEIGHT);
-		createEAttribute(tagDecorateInfoEClass, TAG_DECORATE_INFO__MIN_WIDTH);
-		createEAttribute(tagDecorateInfoEClass, TAG_DECORATE_INFO__MULTI_LEVEL);
-		createEAttribute(tagDecorateInfoEClass, TAG_DECORATE_INFO__NEED_BORDER_DECORATOR);
-		createEAttribute(tagDecorateInfoEClass, TAG_DECORATE_INFO__NEED_TABLE_DECORATOR);
-		createEAttribute(tagDecorateInfoEClass, TAG_DECORATE_INFO__NON_VISUAL);
-		createEAttribute(tagDecorateInfoEClass, TAG_DECORATE_INFO__NON_VISUAL_IMAGE_PATH);
-		createEAttribute(tagDecorateInfoEClass, TAG_DECORATE_INFO__RESOLVE_CHILD_TEXT);
-		createEReference(tagDecorateInfoEClass, TAG_DECORATE_INFO__RESOLVE_ATTRIBUTE_VALUE);
-		createEAttribute(tagDecorateInfoEClass, TAG_DECORATE_INFO__SET_NON_VISUAL_CHILD_ELEMENTS);
-		createEAttribute(tagDecorateInfoEClass, TAG_DECORATE_INFO__WIDGET);
-
-		resolveAttributeValueEClass = createEClass(RESOLVE_ATTRIBUTE_VALUE);
-		createEAttribute(resolveAttributeValueEClass, RESOLVE_ATTRIBUTE_VALUE__ATTRIBUTE_NAME);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private boolean isInitialized = false;
-
-	/**
-	 * Complete the initialization of the package and its meta-model.  This
-	 * method is guarded to have no affect on any invocation but its first.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void initializePackageContents() {
-		if (isInitialized) return;
-		isInitialized = true;
-
-		// Initialize package
-		setName(eNAME);
-		setNsPrefix(eNS_PREFIX);
-		setNsURI(eNS_URI);
-
-		// Add supertypes to classes
-
-		// Initialize classes and features; add operations and parameters
-		initEClass(dtInfoEClass, DTInfo.class, "DTInfo", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEReference(getDTInfo_TagConvertInfo(), this.getTagConvertInfo(), null, "tagConvertInfo", null, 1, 1, DTInfo.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEReference(getDTInfo_TagDecorateInfos(), this.getTagDecorateInfo(), null, "tagDecorateInfos", null, 0, -1, DTInfo.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-		initEClass(tagConvertInfoEClass, TagConvertInfo.class, "TagConvertInfo", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEReference(getTagConvertInfo_Operations(), this.getOperation(), null, "operations", null, 0, -1, TagConvertInfo.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-		initEClass(operationEClass, Operation.class, "Operation", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEAttribute(getOperation_Id(), ecorePackage.getEString(), "id", null, 1, 1, Operation.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEReference(getOperation_Parameters(), this.getParameter(), null, "parameters", null, 0, -1, Operation.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEReference(getOperation_Operations(), this.getOperation(), null, "operations", null, 0, -1, Operation.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-		initEClass(parameterEClass, Parameter.class, "Parameter", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEAttribute(getParameter_Value(), ecorePackage.getEString(), "value", null, 1, 1, Parameter.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-		initEClass(tagDecorateInfoEClass, TagDecorateInfo.class, "TagDecorateInfo", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEAttribute(getTagDecorateInfo_Id(), ecorePackage.getEString(), "id", null, 1, 1, TagDecorateInfo.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEAttribute(getTagDecorateInfo_MinHeight(), ecorePackage.getEInt(), "minHeight", null, 0, 1, TagDecorateInfo.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEAttribute(getTagDecorateInfo_MinWidth(), ecorePackage.getEInt(), "minWidth", null, 0, 1, TagDecorateInfo.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEAttribute(getTagDecorateInfo_MultiLevel(), ecorePackage.getEBoolean(), "multiLevel", "false", 0, 1, TagDecorateInfo.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$
-		initEAttribute(getTagDecorateInfo_NeedBorderDecorator(), ecorePackage.getEBoolean(), "needBorderDecorator", "false", 0, 1, TagDecorateInfo.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$
-		initEAttribute(getTagDecorateInfo_NeedTableDecorator(), ecorePackage.getEBoolean(), "needTableDecorator", "false", 0, 1, TagDecorateInfo.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$
-		initEAttribute(getTagDecorateInfo_NonVisual(), ecorePackage.getEBoolean(), "nonVisual", "false", 0, 1, TagDecorateInfo.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$
-		initEAttribute(getTagDecorateInfo_NonVisualImagePath(), ecorePackage.getEString(), "nonVisualImagePath", null, 0, 1, TagDecorateInfo.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEAttribute(getTagDecorateInfo_ResolveChildText(), ecorePackage.getEBoolean(), "resolveChildText", "false", 0, 1, TagDecorateInfo.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$
-		initEReference(getTagDecorateInfo_ResolveAttributeValue(), this.getResolveAttributeValue(), null, "resolveAttributeValue", null, 0, 1, TagDecorateInfo.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEAttribute(getTagDecorateInfo_SetNonVisualChildElements(), ecorePackage.getEBoolean(), "setNonVisualChildElements", "false", 0, 1, TagDecorateInfo.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$
-		initEAttribute(getTagDecorateInfo_Widget(), ecorePackage.getEBoolean(), "widget", "false", 0, 1, TagDecorateInfo.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$
-
-		initEClass(resolveAttributeValueEClass, ResolveAttributeValue.class, "ResolveAttributeValue", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEAttribute(getResolveAttributeValue_AttributeName(), ecorePackage.getEString(), "attributeName", null, 1, 1, ResolveAttributeValue.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-		// Create resource
-		createResource(eNS_URI);
-
-		// Create annotations
-		// http:///org/eclipse/emf/ecore/util/ExtendedMetaData
-		createExtendedMetaDataAnnotations();
-	}
-
-	/**
-	 * Initializes the annotations for <b>http:///org/eclipse/emf/ecore/util/ExtendedMetaData</b>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void createExtendedMetaDataAnnotations() {
-		String source = "http:///org/eclipse/emf/ecore/util/ExtendedMetaData";		 //$NON-NLS-1$
-		addAnnotation
-		  (getDTInfo_TagConvertInfo(), 
-		   source, 
-		   new String[] {
-			 "kind", "element", //$NON-NLS-1$ //$NON-NLS-2$
-			 "name", "tag-convert-info" //$NON-NLS-1$ //$NON-NLS-2$
-		   });		
-		addAnnotation
-		  (getDTInfo_TagDecorateInfos(), 
-		   source, 
-		   new String[] {
-			 "kind", "element", //$NON-NLS-1$ //$NON-NLS-2$
-			 "name", "tag-decorate-info" //$NON-NLS-1$ //$NON-NLS-2$
-		   });		
-		addAnnotation
-		  (getTagConvertInfo_Operations(), 
-		   source, 
-		   new String[] {
-			 "kind", "element", //$NON-NLS-1$ //$NON-NLS-2$
-			 "name", "operation" //$NON-NLS-1$ //$NON-NLS-2$
-		   });		
-		addAnnotation
-		  (getOperation_Parameters(), 
-		   source, 
-		   new String[] {
-			 "kind", "element", //$NON-NLS-1$ //$NON-NLS-2$
-			 "name", "parameter" //$NON-NLS-1$ //$NON-NLS-2$
-		   });		
-		addAnnotation
-		  (getOperation_Operations(), 
-		   source, 
-		   new String[] {
-			 "kind", "element", //$NON-NLS-1$ //$NON-NLS-2$
-			 "name", "operation" //$NON-NLS-1$ //$NON-NLS-2$
-		   });		
-		addAnnotation
-		  (getTagDecorateInfo_ResolveAttributeValue(), 
-		   source, 
-		   new String[] {
-			 "kind", "element", //$NON-NLS-1$ //$NON-NLS-2$
-			 "name", "resolve-attribute-value" //$NON-NLS-1$ //$NON-NLS-2$
-		   });
-	}
-
-} //DTInfoPackageImpl
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/impl/OperationImpl.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/impl/OperationImpl.java
deleted file mode 100644
index 0edf240..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/impl/OperationImpl.java
+++ /dev/null
@@ -1,261 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-
-import org.eclipse.emf.common.util.EList;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Operation;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Parameter;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Operation</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.OperationImpl#getId <em>Id</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.OperationImpl#getParameters <em>Parameters</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.OperationImpl#getOperations <em>Operations</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class OperationImpl extends EObjectImpl implements Operation {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2007 Oracle Corporation"; //$NON-NLS-1$
-
-	/**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-	/**
-	 * The cached value of the '{@link #getParameters() <em>Parameters</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getParameters()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList parameters;
-
-	/**
-	 * The cached value of the '{@link #getOperations() <em>Operations</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getOperations()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList operations;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected OperationImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return DTInfoPackage.Literals.OPERATION;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, DTInfoPackage.OPERATION__ID, oldId, id));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getParameters() {
-		if (parameters == null) {
-			parameters = new EObjectContainmentEList(Parameter.class, this, DTInfoPackage.OPERATION__PARAMETERS);
-		}
-		return parameters;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getOperations() {
-		if (operations == null) {
-			operations = new EObjectContainmentEList(Operation.class, this, DTInfoPackage.OPERATION__OPERATIONS);
-		}
-		return operations;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case DTInfoPackage.OPERATION__PARAMETERS:
-				return ((InternalEList)getParameters()).basicRemove(otherEnd, msgs);
-			case DTInfoPackage.OPERATION__OPERATIONS:
-				return ((InternalEList)getOperations()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case DTInfoPackage.OPERATION__ID:
-				return getId();
-			case DTInfoPackage.OPERATION__PARAMETERS:
-				return getParameters();
-			case DTInfoPackage.OPERATION__OPERATIONS:
-				return getOperations();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case DTInfoPackage.OPERATION__ID:
-				setId((String)newValue);
-				return;
-			case DTInfoPackage.OPERATION__PARAMETERS:
-				getParameters().clear();
-				getParameters().addAll((Collection)newValue);
-				return;
-			case DTInfoPackage.OPERATION__OPERATIONS:
-				getOperations().clear();
-				getOperations().addAll((Collection)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case DTInfoPackage.OPERATION__ID:
-				setId(ID_EDEFAULT);
-				return;
-			case DTInfoPackage.OPERATION__PARAMETERS:
-				getParameters().clear();
-				return;
-			case DTInfoPackage.OPERATION__OPERATIONS:
-				getOperations().clear();
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case DTInfoPackage.OPERATION__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-			case DTInfoPackage.OPERATION__PARAMETERS:
-				return parameters != null && !parameters.isEmpty();
-			case DTInfoPackage.OPERATION__OPERATIONS:
-				return operations != null && !operations.isEmpty();
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //OperationImpl
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/impl/ParameterImpl.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/impl/ParameterImpl.java
deleted file mode 100644
index 2d6d389..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/impl/ParameterImpl.java
+++ /dev/null
@@ -1,168 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-
-import org.eclipse.emf.ecore.EClass;
-
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Parameter;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Parameter</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.ParameterImpl#getValue <em>Value</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ParameterImpl extends EObjectImpl implements Parameter {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2007 Oracle Corporation"; //$NON-NLS-1$
-
-	/**
-	 * The default value of the '{@link #getValue() <em>Value</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getValue()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String VALUE_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getValue() <em>Value</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getValue()
-	 * @generated
-	 * @ordered
-	 */
-	protected String value = VALUE_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ParameterImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return DTInfoPackage.Literals.PARAMETER;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getValue() {
-		return value;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setValue(String newValue) {
-		String oldValue = value;
-		value = newValue;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, DTInfoPackage.PARAMETER__VALUE, oldValue, value));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case DTInfoPackage.PARAMETER__VALUE:
-				return getValue();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case DTInfoPackage.PARAMETER__VALUE:
-				setValue((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case DTInfoPackage.PARAMETER__VALUE:
-				setValue(VALUE_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case DTInfoPackage.PARAMETER__VALUE:
-				return VALUE_EDEFAULT == null ? value != null : !VALUE_EDEFAULT.equals(value);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (value: "); //$NON-NLS-1$
-		result.append(value);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ParameterImpl
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/impl/ResolveAttributeValueImpl.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/impl/ResolveAttributeValueImpl.java
deleted file mode 100644
index 6596a56..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/impl/ResolveAttributeValueImpl.java
+++ /dev/null
@@ -1,168 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-
-import org.eclipse.emf.ecore.EClass;
-
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.ResolveAttributeValue;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Resolve Attribute Value</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.ResolveAttributeValueImpl#getAttributeName <em>Attribute Name</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ResolveAttributeValueImpl extends EObjectImpl implements ResolveAttributeValue {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2007 Oracle Corporation"; //$NON-NLS-1$
-
-	/**
-	 * The default value of the '{@link #getAttributeName() <em>Attribute Name</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getAttributeName()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ATTRIBUTE_NAME_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getAttributeName() <em>Attribute Name</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getAttributeName()
-	 * @generated
-	 * @ordered
-	 */
-	protected String attributeName = ATTRIBUTE_NAME_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ResolveAttributeValueImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return DTInfoPackage.Literals.RESOLVE_ATTRIBUTE_VALUE;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getAttributeName() {
-		return attributeName;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setAttributeName(String newAttributeName) {
-		String oldAttributeName = attributeName;
-		attributeName = newAttributeName;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, DTInfoPackage.RESOLVE_ATTRIBUTE_VALUE__ATTRIBUTE_NAME, oldAttributeName, attributeName));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case DTInfoPackage.RESOLVE_ATTRIBUTE_VALUE__ATTRIBUTE_NAME:
-				return getAttributeName();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case DTInfoPackage.RESOLVE_ATTRIBUTE_VALUE__ATTRIBUTE_NAME:
-				setAttributeName((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case DTInfoPackage.RESOLVE_ATTRIBUTE_VALUE__ATTRIBUTE_NAME:
-				setAttributeName(ATTRIBUTE_NAME_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case DTInfoPackage.RESOLVE_ATTRIBUTE_VALUE__ATTRIBUTE_NAME:
-				return ATTRIBUTE_NAME_EDEFAULT == null ? attributeName != null : !ATTRIBUTE_NAME_EDEFAULT.equals(attributeName);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (attributeName: "); //$NON-NLS-1$
-		result.append(attributeName);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ResolveAttributeValueImpl
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/impl/TagConvertInfoImpl.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/impl/TagConvertInfoImpl.java
deleted file mode 100644
index c124dcb..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/impl/TagConvertInfoImpl.java
+++ /dev/null
@@ -1,151 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Operation;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagConvertInfo;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Tag Convert Info</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.TagConvertInfoImpl#getOperations <em>Operations</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class TagConvertInfoImpl extends EObjectImpl implements TagConvertInfo {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2007 Oracle Corporation"; //$NON-NLS-1$
-
-	/**
-	 * The cached value of the '{@link #getOperations() <em>Operations</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getOperations()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList operations;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected TagConvertInfoImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return DTInfoPackage.Literals.TAG_CONVERT_INFO;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getOperations() {
-		if (operations == null) {
-			operations = new EObjectContainmentEList(Operation.class, this, DTInfoPackage.TAG_CONVERT_INFO__OPERATIONS);
-		}
-		return operations;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case DTInfoPackage.TAG_CONVERT_INFO__OPERATIONS:
-				return ((InternalEList)getOperations()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case DTInfoPackage.TAG_CONVERT_INFO__OPERATIONS:
-				return getOperations();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case DTInfoPackage.TAG_CONVERT_INFO__OPERATIONS:
-				getOperations().clear();
-				getOperations().addAll((Collection)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case DTInfoPackage.TAG_CONVERT_INFO__OPERATIONS:
-				getOperations().clear();
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case DTInfoPackage.TAG_CONVERT_INFO__OPERATIONS:
-				return operations != null && !operations.isEmpty();
-		}
-		return super.eIsSet(featureID);
-	}
-
-} //TagConvertInfoImpl
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/impl/TagDecorateInfoImpl.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/impl/TagDecorateInfoImpl.java
deleted file mode 100644
index 656759a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/impl/TagDecorateInfoImpl.java
+++ /dev/null
@@ -1,791 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.ResolveAttributeValue;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Tag Decorate Info</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.TagDecorateInfoImpl#getId <em>Id</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.TagDecorateInfoImpl#getMinHeight <em>Min Height</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.TagDecorateInfoImpl#getMinWidth <em>Min Width</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.TagDecorateInfoImpl#isMultiLevel <em>Multi Level</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.TagDecorateInfoImpl#isNeedBorderDecorator <em>Need Border Decorator</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.TagDecorateInfoImpl#isNeedTableDecorator <em>Need Table Decorator</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.TagDecorateInfoImpl#isNonVisual <em>Non Visual</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.TagDecorateInfoImpl#getNonVisualImagePath <em>Non Visual Image Path</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.TagDecorateInfoImpl#isResolveChildText <em>Resolve Child Text</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.TagDecorateInfoImpl#getResolveAttributeValue <em>Resolve Attribute Value</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.TagDecorateInfoImpl#isSetNonVisualChildElements <em>Set Non Visual Child Elements</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.TagDecorateInfoImpl#isWidget <em>Widget</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class TagDecorateInfoImpl extends EObjectImpl implements TagDecorateInfo {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2007 Oracle Corporation"; //$NON-NLS-1$
-
-	/**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getMinHeight() <em>Min Height</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getMinHeight()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final int MIN_HEIGHT_EDEFAULT = 0;
-
-	/**
-	 * The cached value of the '{@link #getMinHeight() <em>Min Height</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getMinHeight()
-	 * @generated
-	 * @ordered
-	 */
-	protected int minHeight = MIN_HEIGHT_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getMinWidth() <em>Min Width</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getMinWidth()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final int MIN_WIDTH_EDEFAULT = 0;
-
-	/**
-	 * The cached value of the '{@link #getMinWidth() <em>Min Width</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getMinWidth()
-	 * @generated
-	 * @ordered
-	 */
-	protected int minWidth = MIN_WIDTH_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #isMultiLevel() <em>Multi Level</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isMultiLevel()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean MULTI_LEVEL_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isMultiLevel() <em>Multi Level</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isMultiLevel()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean multiLevel = MULTI_LEVEL_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #isNeedBorderDecorator() <em>Need Border Decorator</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isNeedBorderDecorator()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean NEED_BORDER_DECORATOR_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isNeedBorderDecorator() <em>Need Border Decorator</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isNeedBorderDecorator()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean needBorderDecorator = NEED_BORDER_DECORATOR_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #isNeedTableDecorator() <em>Need Table Decorator</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isNeedTableDecorator()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean NEED_TABLE_DECORATOR_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isNeedTableDecorator() <em>Need Table Decorator</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isNeedTableDecorator()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean needTableDecorator = NEED_TABLE_DECORATOR_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #isNonVisual() <em>Non Visual</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isNonVisual()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean NON_VISUAL_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isNonVisual() <em>Non Visual</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isNonVisual()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean nonVisual = NON_VISUAL_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getNonVisualImagePath() <em>Non Visual Image Path</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getNonVisualImagePath()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String NON_VISUAL_IMAGE_PATH_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getNonVisualImagePath() <em>Non Visual Image Path</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getNonVisualImagePath()
-	 * @generated
-	 * @ordered
-	 */
-	protected String nonVisualImagePath = NON_VISUAL_IMAGE_PATH_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #isResolveChildText() <em>Resolve Child Text</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isResolveChildText()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean RESOLVE_CHILD_TEXT_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isResolveChildText() <em>Resolve Child Text</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isResolveChildText()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean resolveChildText = RESOLVE_CHILD_TEXT_EDEFAULT;
-
-	/**
-	 * The cached value of the '{@link #getResolveAttributeValue() <em>Resolve Attribute Value</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getResolveAttributeValue()
-	 * @generated
-	 * @ordered
-	 */
-	protected ResolveAttributeValue resolveAttributeValue;
-
-	/**
-	 * The default value of the '{@link #isSetNonVisualChildElements() <em>Set Non Visual Child Elements</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetNonVisualChildElements()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean SET_NON_VISUAL_CHILD_ELEMENTS_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isSetNonVisualChildElements() <em>Set Non Visual Child Elements</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetNonVisualChildElements()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean setNonVisualChildElements = SET_NON_VISUAL_CHILD_ELEMENTS_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #isWidget() <em>Widget</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isWidget()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean WIDGET_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isWidget() <em>Widget</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isWidget()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean widget = WIDGET_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected TagDecorateInfoImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return DTInfoPackage.Literals.TAG_DECORATE_INFO;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, DTInfoPackage.TAG_DECORATE_INFO__ID, oldId, id));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public int getMinHeight() {
-		return minHeight;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setMinHeight(int newMinHeight) {
-		int oldMinHeight = minHeight;
-		minHeight = newMinHeight;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, DTInfoPackage.TAG_DECORATE_INFO__MIN_HEIGHT, oldMinHeight, minHeight));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public int getMinWidth() {
-		return minWidth;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setMinWidth(int newMinWidth) {
-		int oldMinWidth = minWidth;
-		minWidth = newMinWidth;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, DTInfoPackage.TAG_DECORATE_INFO__MIN_WIDTH, oldMinWidth, minWidth));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isMultiLevel() {
-		return multiLevel;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setMultiLevel(boolean newMultiLevel) {
-		boolean oldMultiLevel = multiLevel;
-		multiLevel = newMultiLevel;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, DTInfoPackage.TAG_DECORATE_INFO__MULTI_LEVEL, oldMultiLevel, multiLevel));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isNeedBorderDecorator() {
-		return needBorderDecorator;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setNeedBorderDecorator(boolean newNeedBorderDecorator) {
-		boolean oldNeedBorderDecorator = needBorderDecorator;
-		needBorderDecorator = newNeedBorderDecorator;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, DTInfoPackage.TAG_DECORATE_INFO__NEED_BORDER_DECORATOR, oldNeedBorderDecorator, needBorderDecorator));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isNeedTableDecorator() {
-		return needTableDecorator;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setNeedTableDecorator(boolean newNeedTableDecorator) {
-		boolean oldNeedTableDecorator = needTableDecorator;
-		needTableDecorator = newNeedTableDecorator;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, DTInfoPackage.TAG_DECORATE_INFO__NEED_TABLE_DECORATOR, oldNeedTableDecorator, needTableDecorator));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isNonVisual() {
-		return nonVisual;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setNonVisual(boolean newNonVisual) {
-		boolean oldNonVisual = nonVisual;
-		nonVisual = newNonVisual;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, DTInfoPackage.TAG_DECORATE_INFO__NON_VISUAL, oldNonVisual, nonVisual));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getNonVisualImagePath() {
-		return nonVisualImagePath;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setNonVisualImagePath(String newNonVisualImagePath) {
-		String oldNonVisualImagePath = nonVisualImagePath;
-		nonVisualImagePath = newNonVisualImagePath;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, DTInfoPackage.TAG_DECORATE_INFO__NON_VISUAL_IMAGE_PATH, oldNonVisualImagePath, nonVisualImagePath));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isResolveChildText() {
-		return resolveChildText;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setResolveChildText(boolean newResolveChildText) {
-		boolean oldResolveChildText = resolveChildText;
-		resolveChildText = newResolveChildText;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, DTInfoPackage.TAG_DECORATE_INFO__RESOLVE_CHILD_TEXT, oldResolveChildText, resolveChildText));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResolveAttributeValue getResolveAttributeValue() {
-		return resolveAttributeValue;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-     * @param newResolveAttributeValue 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetResolveAttributeValue(ResolveAttributeValue newResolveAttributeValue, NotificationChain msgs) {
-		ResolveAttributeValue oldResolveAttributeValue = resolveAttributeValue;
-		resolveAttributeValue = newResolveAttributeValue;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, DTInfoPackage.TAG_DECORATE_INFO__RESOLVE_ATTRIBUTE_VALUE, oldResolveAttributeValue, newResolveAttributeValue);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setResolveAttributeValue(ResolveAttributeValue newResolveAttributeValue) {
-		if (newResolveAttributeValue != resolveAttributeValue) {
-			NotificationChain msgs = null;
-			if (resolveAttributeValue != null)
-				msgs = ((InternalEObject)resolveAttributeValue).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - DTInfoPackage.TAG_DECORATE_INFO__RESOLVE_ATTRIBUTE_VALUE, null, msgs);
-			if (newResolveAttributeValue != null)
-				msgs = ((InternalEObject)newResolveAttributeValue).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - DTInfoPackage.TAG_DECORATE_INFO__RESOLVE_ATTRIBUTE_VALUE, null, msgs);
-			msgs = basicSetResolveAttributeValue(newResolveAttributeValue, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, DTInfoPackage.TAG_DECORATE_INFO__RESOLVE_ATTRIBUTE_VALUE, newResolveAttributeValue, newResolveAttributeValue));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetNonVisualChildElements() {
-		return setNonVisualChildElements;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setSetNonVisualChildElements(boolean newSetNonVisualChildElements) {
-		boolean oldSetNonVisualChildElements = setNonVisualChildElements;
-		setNonVisualChildElements = newSetNonVisualChildElements;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, DTInfoPackage.TAG_DECORATE_INFO__SET_NON_VISUAL_CHILD_ELEMENTS, oldSetNonVisualChildElements, setNonVisualChildElements));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isWidget() {
-		return widget;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setWidget(boolean newWidget) {
-		boolean oldWidget = widget;
-		widget = newWidget;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, DTInfoPackage.TAG_DECORATE_INFO__WIDGET, oldWidget, widget));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case DTInfoPackage.TAG_DECORATE_INFO__RESOLVE_ATTRIBUTE_VALUE:
-				return basicSetResolveAttributeValue(null, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case DTInfoPackage.TAG_DECORATE_INFO__ID:
-				return getId();
-			case DTInfoPackage.TAG_DECORATE_INFO__MIN_HEIGHT:
-				return new Integer(getMinHeight());
-			case DTInfoPackage.TAG_DECORATE_INFO__MIN_WIDTH:
-				return new Integer(getMinWidth());
-			case DTInfoPackage.TAG_DECORATE_INFO__MULTI_LEVEL:
-				return isMultiLevel() ? Boolean.TRUE : Boolean.FALSE;
-			case DTInfoPackage.TAG_DECORATE_INFO__NEED_BORDER_DECORATOR:
-				return isNeedBorderDecorator() ? Boolean.TRUE : Boolean.FALSE;
-			case DTInfoPackage.TAG_DECORATE_INFO__NEED_TABLE_DECORATOR:
-				return isNeedTableDecorator() ? Boolean.TRUE : Boolean.FALSE;
-			case DTInfoPackage.TAG_DECORATE_INFO__NON_VISUAL:
-				return isNonVisual() ? Boolean.TRUE : Boolean.FALSE;
-			case DTInfoPackage.TAG_DECORATE_INFO__NON_VISUAL_IMAGE_PATH:
-				return getNonVisualImagePath();
-			case DTInfoPackage.TAG_DECORATE_INFO__RESOLVE_CHILD_TEXT:
-				return isResolveChildText() ? Boolean.TRUE : Boolean.FALSE;
-			case DTInfoPackage.TAG_DECORATE_INFO__RESOLVE_ATTRIBUTE_VALUE:
-				return getResolveAttributeValue();
-			case DTInfoPackage.TAG_DECORATE_INFO__SET_NON_VISUAL_CHILD_ELEMENTS:
-				return isSetNonVisualChildElements() ? Boolean.TRUE : Boolean.FALSE;
-			case DTInfoPackage.TAG_DECORATE_INFO__WIDGET:
-				return isWidget() ? Boolean.TRUE : Boolean.FALSE;
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case DTInfoPackage.TAG_DECORATE_INFO__ID:
-				setId((String)newValue);
-				return;
-			case DTInfoPackage.TAG_DECORATE_INFO__MIN_HEIGHT:
-				setMinHeight(((Integer)newValue).intValue());
-				return;
-			case DTInfoPackage.TAG_DECORATE_INFO__MIN_WIDTH:
-				setMinWidth(((Integer)newValue).intValue());
-				return;
-			case DTInfoPackage.TAG_DECORATE_INFO__MULTI_LEVEL:
-				setMultiLevel(((Boolean)newValue).booleanValue());
-				return;
-			case DTInfoPackage.TAG_DECORATE_INFO__NEED_BORDER_DECORATOR:
-				setNeedBorderDecorator(((Boolean)newValue).booleanValue());
-				return;
-			case DTInfoPackage.TAG_DECORATE_INFO__NEED_TABLE_DECORATOR:
-				setNeedTableDecorator(((Boolean)newValue).booleanValue());
-				return;
-			case DTInfoPackage.TAG_DECORATE_INFO__NON_VISUAL:
-				setNonVisual(((Boolean)newValue).booleanValue());
-				return;
-			case DTInfoPackage.TAG_DECORATE_INFO__NON_VISUAL_IMAGE_PATH:
-				setNonVisualImagePath((String)newValue);
-				return;
-			case DTInfoPackage.TAG_DECORATE_INFO__RESOLVE_CHILD_TEXT:
-				setResolveChildText(((Boolean)newValue).booleanValue());
-				return;
-			case DTInfoPackage.TAG_DECORATE_INFO__RESOLVE_ATTRIBUTE_VALUE:
-				setResolveAttributeValue((ResolveAttributeValue)newValue);
-				return;
-			case DTInfoPackage.TAG_DECORATE_INFO__SET_NON_VISUAL_CHILD_ELEMENTS:
-				setSetNonVisualChildElements(((Boolean)newValue).booleanValue());
-				return;
-			case DTInfoPackage.TAG_DECORATE_INFO__WIDGET:
-				setWidget(((Boolean)newValue).booleanValue());
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case DTInfoPackage.TAG_DECORATE_INFO__ID:
-				setId(ID_EDEFAULT);
-				return;
-			case DTInfoPackage.TAG_DECORATE_INFO__MIN_HEIGHT:
-				setMinHeight(MIN_HEIGHT_EDEFAULT);
-				return;
-			case DTInfoPackage.TAG_DECORATE_INFO__MIN_WIDTH:
-				setMinWidth(MIN_WIDTH_EDEFAULT);
-				return;
-			case DTInfoPackage.TAG_DECORATE_INFO__MULTI_LEVEL:
-				setMultiLevel(MULTI_LEVEL_EDEFAULT);
-				return;
-			case DTInfoPackage.TAG_DECORATE_INFO__NEED_BORDER_DECORATOR:
-				setNeedBorderDecorator(NEED_BORDER_DECORATOR_EDEFAULT);
-				return;
-			case DTInfoPackage.TAG_DECORATE_INFO__NEED_TABLE_DECORATOR:
-				setNeedTableDecorator(NEED_TABLE_DECORATOR_EDEFAULT);
-				return;
-			case DTInfoPackage.TAG_DECORATE_INFO__NON_VISUAL:
-				setNonVisual(NON_VISUAL_EDEFAULT);
-				return;
-			case DTInfoPackage.TAG_DECORATE_INFO__NON_VISUAL_IMAGE_PATH:
-				setNonVisualImagePath(NON_VISUAL_IMAGE_PATH_EDEFAULT);
-				return;
-			case DTInfoPackage.TAG_DECORATE_INFO__RESOLVE_CHILD_TEXT:
-				setResolveChildText(RESOLVE_CHILD_TEXT_EDEFAULT);
-				return;
-			case DTInfoPackage.TAG_DECORATE_INFO__RESOLVE_ATTRIBUTE_VALUE:
-				setResolveAttributeValue((ResolveAttributeValue)null);
-				return;
-			case DTInfoPackage.TAG_DECORATE_INFO__SET_NON_VISUAL_CHILD_ELEMENTS:
-				setSetNonVisualChildElements(SET_NON_VISUAL_CHILD_ELEMENTS_EDEFAULT);
-				return;
-			case DTInfoPackage.TAG_DECORATE_INFO__WIDGET:
-				setWidget(WIDGET_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case DTInfoPackage.TAG_DECORATE_INFO__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-			case DTInfoPackage.TAG_DECORATE_INFO__MIN_HEIGHT:
-				return minHeight != MIN_HEIGHT_EDEFAULT;
-			case DTInfoPackage.TAG_DECORATE_INFO__MIN_WIDTH:
-				return minWidth != MIN_WIDTH_EDEFAULT;
-			case DTInfoPackage.TAG_DECORATE_INFO__MULTI_LEVEL:
-				return multiLevel != MULTI_LEVEL_EDEFAULT;
-			case DTInfoPackage.TAG_DECORATE_INFO__NEED_BORDER_DECORATOR:
-				return needBorderDecorator != NEED_BORDER_DECORATOR_EDEFAULT;
-			case DTInfoPackage.TAG_DECORATE_INFO__NEED_TABLE_DECORATOR:
-				return needTableDecorator != NEED_TABLE_DECORATOR_EDEFAULT;
-			case DTInfoPackage.TAG_DECORATE_INFO__NON_VISUAL:
-				return nonVisual != NON_VISUAL_EDEFAULT;
-			case DTInfoPackage.TAG_DECORATE_INFO__NON_VISUAL_IMAGE_PATH:
-				return NON_VISUAL_IMAGE_PATH_EDEFAULT == null ? nonVisualImagePath != null : !NON_VISUAL_IMAGE_PATH_EDEFAULT.equals(nonVisualImagePath);
-			case DTInfoPackage.TAG_DECORATE_INFO__RESOLVE_CHILD_TEXT:
-				return resolveChildText != RESOLVE_CHILD_TEXT_EDEFAULT;
-			case DTInfoPackage.TAG_DECORATE_INFO__RESOLVE_ATTRIBUTE_VALUE:
-				return resolveAttributeValue != null;
-			case DTInfoPackage.TAG_DECORATE_INFO__SET_NON_VISUAL_CHILD_ELEMENTS:
-				return setNonVisualChildElements != SET_NON_VISUAL_CHILD_ELEMENTS_EDEFAULT;
-			case DTInfoPackage.TAG_DECORATE_INFO__WIDGET:
-				return widget != WIDGET_EDEFAULT;
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(", minHeight: "); //$NON-NLS-1$
-		result.append(minHeight);
-		result.append(", minWidth: "); //$NON-NLS-1$
-		result.append(minWidth);
-		result.append(", multiLevel: "); //$NON-NLS-1$
-		result.append(multiLevel);
-		result.append(", needBorderDecorator: "); //$NON-NLS-1$
-		result.append(needBorderDecorator);
-		result.append(", needTableDecorator: "); //$NON-NLS-1$
-		result.append(needTableDecorator);
-		result.append(", nonVisual: "); //$NON-NLS-1$
-		result.append(nonVisual);
-		result.append(", nonVisualImagePath: "); //$NON-NLS-1$
-		result.append(nonVisualImagePath);
-		result.append(", resolveChildText: "); //$NON-NLS-1$
-		result.append(resolveChildText);
-		result.append(", setNonVisualChildElements: "); //$NON-NLS-1$
-		result.append(setNonVisualChildElements);
-		result.append(", widget: "); //$NON-NLS-1$
-		result.append(widget);
-		result.append(')');
-		return result.toString();
-	}
-
-} //TagDecorateInfoImpl
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/util/DTInfoAdapterFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/util/DTInfoAdapterFactory.java
deleted file mode 100644
index 5bbf09b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/util/DTInfoAdapterFactory.java
+++ /dev/null
@@ -1,212 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.util;
-
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.common.notify.Notifier;
-
-import org.eclipse.emf.common.notify.impl.AdapterFactoryImpl;
-
-import org.eclipse.emf.ecore.EObject;
-
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.*;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Adapter Factory</b> for the model.
- * It provides an adapter <code>createXXX</code> method for each class of the model.
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage
- * @generated
- */
-public class DTInfoAdapterFactory extends AdapterFactoryImpl {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2007 Oracle Corporation"; //$NON-NLS-1$
-
-	/**
-	 * The cached model package.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected static DTInfoPackage modelPackage;
-
-	/**
-	 * Creates an instance of the adapter factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public DTInfoAdapterFactory() {
-		if (modelPackage == null) {
-			modelPackage = DTInfoPackage.eINSTANCE;
-		}
-	}
-
-	/**
-	 * Returns whether this factory is applicable for the type of the object.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns <code>true</code> if the object is either the model's package or is an instance object of the model.
-	 * <!-- end-user-doc -->
-	 * @return whether this factory is applicable for the type of the object.
-	 * @generated
-	 */
-	public boolean isFactoryForType(Object object) {
-		if (object == modelPackage) {
-			return true;
-		}
-		if (object instanceof EObject) {
-			return ((EObject)object).eClass().getEPackage() == modelPackage;
-		}
-		return false;
-	}
-
-	/**
-	 * The switch the delegates to the <code>createXXX</code> methods.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected DTInfoSwitch modelSwitch =
-		new DTInfoSwitch() {
-			public Object caseDTInfo(DTInfo object) {
-				return createDTInfoAdapter();
-			}
-			public Object caseTagConvertInfo(TagConvertInfo object) {
-				return createTagConvertInfoAdapter();
-			}
-			public Object caseOperation(Operation object) {
-				return createOperationAdapter();
-			}
-			public Object caseParameter(Parameter object) {
-				return createParameterAdapter();
-			}
-			public Object caseTagDecorateInfo(TagDecorateInfo object) {
-				return createTagDecorateInfoAdapter();
-			}
-			public Object caseResolveAttributeValue(ResolveAttributeValue object) {
-				return createResolveAttributeValueAdapter();
-			}
-			public Object defaultCase(EObject object) {
-				return createEObjectAdapter();
-			}
-		};
-
-	/**
-	 * Creates an adapter for the <code>target</code>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param target the object to adapt.
-	 * @return the adapter for the <code>target</code>.
-	 * @generated
-	 */
-	public Adapter createAdapter(Notifier target) {
-		return (Adapter)modelSwitch.doSwitch((EObject)target);
-	}
-
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfo <em>DT Info</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfo
-	 * @generated
-	 */
-	public Adapter createDTInfoAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagConvertInfo <em>Tag Convert Info</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagConvertInfo
-	 * @generated
-	 */
-	public Adapter createTagConvertInfoAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Operation <em>Operation</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Operation
-	 * @generated
-	 */
-	public Adapter createOperationAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Parameter <em>Parameter</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Parameter
-	 * @generated
-	 */
-	public Adapter createParameterAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo <em>Tag Decorate Info</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo
-	 * @generated
-	 */
-	public Adapter createTagDecorateInfoAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.ResolveAttributeValue <em>Resolve Attribute Value</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.ResolveAttributeValue
-	 * @generated
-	 */
-	public Adapter createResolveAttributeValueAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for the default case.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @generated
-	 */
-	public Adapter createEObjectAdapter() {
-		return null;
-	}
-
-} //DTInfoAdapterFactory
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/util/DTInfoSwitch.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/util/DTInfoSwitch.java
deleted file mode 100644
index 82f4764..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/util/DTInfoSwitch.java
+++ /dev/null
@@ -1,245 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.util;
-
-import java.util.List;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.*;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Switch</b> for the model's inheritance hierarchy.
- * It supports the call {@link #doSwitch(EObject) doSwitch(object)}
- * to invoke the <code>caseXXX</code> method for each class of the model,
- * starting with the actual class of the object
- * and proceeding up the inheritance hierarchy
- * until a non-null result is returned,
- * which is the result of the switch.
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage
- * @generated
- */
-public class DTInfoSwitch {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2007 Oracle Corporation"; //$NON-NLS-1$
-
-	/**
-	 * The cached model package
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected static DTInfoPackage modelPackage;
-
-	/**
-	 * Creates an instance of the switch.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public DTInfoSwitch() {
-		if (modelPackage == null) {
-			modelPackage = DTInfoPackage.eINSTANCE;
-		}
-	}
-
-	/**
-	 * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
-	 * <!-- begin-user-doc -->
-     * @param theEObject 
-     * @return the first non-null result returned by a <code>caseXXX</code> call.
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object doSwitch(EObject theEObject) {
-		return doSwitch(theEObject.eClass(), theEObject);
-	}
-
-	/**
-	 * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
-	 * <!-- begin-user-doc -->
-     * @param theEClass 
-     * @param theEObject 
-     * @return the first non-null result returned by a <code>caseXXX</code> call.
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected Object doSwitch(EClass theEClass, EObject theEObject) {
-		if (theEClass.eContainer() == modelPackage) {
-			return doSwitch(theEClass.getClassifierID(), theEObject);
-		}
-        List eSuperTypes = theEClass.getESuperTypes();
-        return
-        	eSuperTypes.isEmpty() ?
-        		defaultCase(theEObject) :
-        		doSwitch((EClass)eSuperTypes.get(0), theEObject);
-	}
-
-	/**
-	 * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
-	 * <!-- begin-user-doc -->
-     * @param classifierID 
-     * @param theEObject 
-     * @return the first non-null result returned by a <code>caseXXX</code> call.
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected Object doSwitch(int classifierID, EObject theEObject) {
-		switch (classifierID) {
-			case DTInfoPackage.DT_INFO: {
-				DTInfo dtInfo = (DTInfo)theEObject;
-				Object result = caseDTInfo(dtInfo);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case DTInfoPackage.TAG_CONVERT_INFO: {
-				TagConvertInfo tagConvertInfo = (TagConvertInfo)theEObject;
-				Object result = caseTagConvertInfo(tagConvertInfo);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case DTInfoPackage.OPERATION: {
-				Operation operation = (Operation)theEObject;
-				Object result = caseOperation(operation);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case DTInfoPackage.PARAMETER: {
-				Parameter parameter = (Parameter)theEObject;
-				Object result = caseParameter(parameter);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case DTInfoPackage.TAG_DECORATE_INFO: {
-				TagDecorateInfo tagDecorateInfo = (TagDecorateInfo)theEObject;
-				Object result = caseTagDecorateInfo(tagDecorateInfo);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case DTInfoPackage.RESOLVE_ATTRIBUTE_VALUE: {
-				ResolveAttributeValue resolveAttributeValue = (ResolveAttributeValue)theEObject;
-				Object result = caseResolveAttributeValue(resolveAttributeValue);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			default: return defaultCase(theEObject);
-		}
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>DT Info</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpretting the object as an instance of '<em>DT Info</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseDTInfo(DTInfo object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Tag Convert Info</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpretting the object as an instance of '<em>Tag Convert Info</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseTagConvertInfo(TagConvertInfo object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Operation</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpretting the object as an instance of '<em>Operation</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseOperation(Operation object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Parameter</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpretting the object as an instance of '<em>Parameter</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseParameter(Parameter object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Tag Decorate Info</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpretting the object as an instance of '<em>Tag Decorate Info</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseTagDecorateInfo(TagDecorateInfo object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Resolve Attribute Value</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpretting the object as an instance of '<em>Resolve Attribute Value</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseResolveAttributeValue(ResolveAttributeValue object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>EObject</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch, but this is the last case anyway.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpretting the object as an instance of '<em>EObject</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject)
-	 * @generated
-	 */
-	public Object defaultCase(EObject object) {
-		return null;
-	}
-
-} //DTInfoSwitch
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/package-info.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/package-info.java
deleted file mode 100644
index 3f0ea23..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/package-info.java
+++ /dev/null
@@ -1,18 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-/**
- * Tag conversion model. 
- * 
- * <p><b>Provisional API - subject to change</b></p>
- */
-package org.eclipse.jst.pagedesigner.dtmanager.dtinfo;
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/package-info.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/package-info.java
deleted file mode 100644
index 8f5fa02..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/package-info.java
+++ /dev/null
@@ -1,18 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-/**
- * Tag conversion design time manager.  
- * 
- * <p><b>Provisional API - subject to change</b></p>
- */
-package org.eclipse.jst.pagedesigner.dtmanager;
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtresourceprovider/AbstractDTResourceProvider.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtresourceprovider/AbstractDTResourceProvider.java
deleted file mode 100644
index fbcc62f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtresourceprovider/AbstractDTResourceProvider.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2009 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtresourceprovider;
-
-/**
- * Abstract implementation of IDTResourceProvider that is intended for client
- * extension.
- * 
- * @author Ian Trimble - Oracle
- */
-public abstract class AbstractDTResourceProvider implements IDTResourceProvider {
-
-	/**
-	 * The ID of this provider.
-	 */
-	protected String id;
-
-	/**
-	 * Constructs an instance.
-	 * 
-	 * @param id The ID of this provider.
-	 */
-	public AbstractDTResourceProvider(String id) {
-		setId(id);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtresourceprovider.IDTResourceProvider#getId()
-	 */
-	public String getId() {
-		return id;
-	}
-
-	/**
-	 * Sets the ID of this provider.
-	 * 
-	 * @param id The ID of this provider.
-	 */
-	public void setId(String id) {
-		this.id = id;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtresourceprovider/AbstractDTSkin.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtresourceprovider/AbstractDTSkin.java
deleted file mode 100644
index d018836..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtresourceprovider/AbstractDTSkin.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2009 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtresourceprovider;
-
-/**
- * Abstract implementation of IDTSkin that is intended for client extension.
- * 
- * @author Ian Trimble - Oracle
- */
-public abstract class AbstractDTSkin implements IDTSkin {
-
-	/**
-	 * The human-readable name of the skin.
-	 */
-	protected String name;
-
-	/**
-	 * true if this instance is considered the default for its provider.
-	 */
-	protected boolean isDefault;
-
-	/**
-	 * Constructs an instance.
-	 * 
-	 * @param name The human-readable name of the skin.
-	 */
-	public AbstractDTSkin(String name) {
-		this(name, false);
-	}
-
-	/**
-	 * Constructs an instance.
-	 * 
-	 * @param name The human-readable name of the skin.
-	 * @param isDefault true if this instance is considered the default for its
-	 * provider.
-	 */
-	public AbstractDTSkin(String name, boolean isDefault) {
-		setName(name);
-		setDefault(isDefault);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtresourceprovider.IDTSkin#getName()
-	 */
-	public String getName() {
-		return name;
-	}
-
-	/**
-	 * Sets the human-readable name of the skin.
-	 * 
-	 * @param name The human-readable name of the skin.
-	 */
-	public void setName(String name) {
-		this.name = name;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtresourceprovider.IDTSkin#isDefault()
-	 */
-	public boolean isDefault() {
-		return isDefault;
-	}
-
-	/**
-	 * Sets if this instance is considered the default for its provider.
-	 * 
-	 * @param isDefault	true if this instance is considered the default for its
-	 * provider.
-	 */
-	public void setDefault(boolean isDefault) {
-		this.isDefault = isDefault;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtresourceprovider/DTResourceProviderFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtresourceprovider/DTResourceProviderFactory.java
deleted file mode 100644
index c4652a1..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtresourceprovider/DTResourceProviderFactory.java
+++ /dev/null
@@ -1,170 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2009 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtresourceprovider;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtension;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.InvalidRegistryObjectException;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.jsp.core.taglib.ITaglibDescriptor;
-import org.eclipse.jst.jsp.core.taglib.ITaglibRecord;
-import org.eclipse.jst.jsp.core.taglib.TaglibIndex;
-import org.eclipse.jst.pagedesigner.IJMTConstants;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.utils.StructuredModelUtil;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-import org.osgi.framework.Bundle;
-
-/**
- * Factory responsible for producing {@link IDTResourceProvider} instances from
- * <code>org.eclipse.jst.pagedesigner.pageDesignerExtension.dtResourceProvider</code>
- * extensions. 
- * 
- * @author Ian Trimble - Oracle
- */
-public class DTResourceProviderFactory {
-
-	private static DTResourceProviderFactory instance;
-	private ProviderClassMap providerClassMap;
-	private Map<IProject, List<IDTResourceProvider>> providerMap;
-	private Logger log = PDPlugin.getLogger(DTResourceProviderFactory.class);
-
-	private DTResourceProviderFactory() {
-		//singleton - no external instantiation
-		providerClassMap = new ProviderClassMap();
-		loadExtensions();
-		providerMap = new HashMap<IProject, List<IDTResourceProvider>>();
-	}
-
-	/**
-	 * Gets the singleton instance.
-	 * 
-	 * @return The singleton instance.
-	 */
-	public static synchronized DTResourceProviderFactory getInstance() {
-		if (instance == null) {
-			instance = new DTResourceProviderFactory();
-		}
-		return instance;
-	}
-
-	/**
-	 * Returns a List of IDTResourceProvider instances that are active for the
-	 * specified IProject instance.
-	 * 
-	 * @param project IProject instance for which to get the active
-	 * IDTResourceProvider instances.
-	 * @return A List of IDTResourceProvider instances that are active for the
-	 * specified IProject instance. List may be empty, but will not be null.
-	 */
-	public List<IDTResourceProvider> getActiveDTResourceProviders(IProject project) {
-		List<IDTResourceProvider> activeProviders = new ArrayList<IDTResourceProvider>();
-		if (project != null) {
-			ITaglibRecord[] taglibRecords = TaglibIndex.getAvailableTaglibRecords(project.getFullPath());
-			if (taglibRecords != null && taglibRecords.length > 0) {
-				for (ITaglibRecord taglibRecord: taglibRecords) {
-					ITaglibDescriptor taglibDescriptor = taglibRecord.getDescriptor();
-					if (taglibDescriptor != null) {
-						String taglibURI = taglibDescriptor.getURI();
-						if (taglibURI != null) {
-							activeProviders.addAll(getDTResourceProviders(project, taglibURI));
-						}
-					}
-				}
-			}
-		}
-		return Collections.unmodifiableList(activeProviders);
-	}
-
-	/**
-	 * Convenience method to determine IProject instance from the specified
-	 * IDOMNode instance and then call {@link #getActiveDTResourceProviders(IProject)}.
-	 * 
-	 * @param domNode IDOMNode instance from which to determine IProject
-	 * instance.
-	 * @return A List of IDTResourceProvider instances that are active for the
-	 * specified IDOMNode instance's IProject instance. List may be empty, but
-	 * will not be null.
-	 */
-	public List<IDTResourceProvider> getActiveDTResourceProviders(IDOMNode domNode) {
-		IDOMModel domModel = domNode.getModel();
-		IProject project = null;
-		if (domModel != null) {
-			project = StructuredModelUtil.getProjectFor(domModel);
-		}
-		return getActiveDTResourceProviders(project);
-	}
-
-	/**
-	 * Returns a List of IDTResourceProvider instances for the specified
-	 * IProject instance and id.
-	 * 
-	 * @param project IProject instance for which a List of IDTResourceProviders
-	 * is being requested.
-	 * @param id Identifier for which a List of IDTResourceProvider instances is
-	 * being requested.
-	 * @return A List of IDTResourceProvider instances for the specified
-	 * IProject instance and id. List may be empty, but will not be null.
-	 */
-	public synchronized List<IDTResourceProvider> getDTResourceProviders(IProject project, String id) {
-		List<IDTResourceProvider> providers = new ArrayList<IDTResourceProvider>();
-		List<IDTResourceProvider> projectProviders = providerMap.get(project);
-		if (projectProviders == null) {
-			projectProviders = providerClassMap.createInstances();
-			providerMap.put(project, projectProviders);
-		}
-		for (IDTResourceProvider curProvider: projectProviders) {
-			if (curProvider.getId().equals(id)) {
-				providers.add(curProvider);
-			}
-		}
-		return providers;
-	}
-
-	private void loadExtensions() {
-		try {
-			final IExtensionPoint extPoint = Platform.getExtensionRegistry().getExtensionPoint(PDPlugin.getPluginId(), IJMTConstants.EXTENSION_POINT_PAGEDESIGNER);
-			final IExtension[] extensions = extPoint.getExtensions();
-			for (int i = 0; i < extensions.length; i++) {
-				final IExtension extension = extensions[i];
-				final IConfigurationElement[] confElements = extension.getConfigurationElements();
-				for (int j = 0; j < confElements.length; j++) {
-					final IConfigurationElement confElement = confElements[j];
-					if (confElement.getName().equals(IJMTConstants.DT_RESOURCE_PROVIDER)) {
-						final String id = confElement.getAttribute("id"); //$NON-NLS-1$
-						final String providerClassName = confElement.getAttribute("class"); //$NON-NLS-1$
-						final Bundle bundle = Platform.getBundle(confElement.getContributor().getName());
-						if (bundle != null) {
-							try {
-								providerClassMap.add(id, bundle.loadClass(providerClassName));
-							} catch(ClassNotFoundException cnfe) {
-								log.error("Warning.DTResourceProviderFactory.ClassNotFound", providerClassName, id, cnfe); //$NON-NLS-1$
-							}
-						}
-					}
-				}
-			}
-		} catch(InvalidRegistryObjectException iroe) {
-			log.error("Warning.DTResourceProviderFactory.RegistryError", PDPlugin.getPluginId() + IJMTConstants.EXTENSION_POINT_PAGEDESIGNER + "." + IJMTConstants.DT_RESOURCE_PROVIDER, iroe); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtresourceprovider/DTSkinManager.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtresourceprovider/DTSkinManager.java
deleted file mode 100644
index 1055ced..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtresourceprovider/DTSkinManager.java
+++ /dev/null
@@ -1,183 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2009 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtresourceprovider;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jst.pagedesigner.utils.StructuredModelUtil;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-
-/**
- * Manages IDTSkin instances and provides skin-related services.
- * 
- * @author Ian Trimble - Oracle
- */
-public class DTSkinManager {
-
-	private static Map<IProject, DTSkinManager> dtSkinManagerMap =
-		new HashMap<IProject, DTSkinManager>();
-
-	private Map<String, IDTSkin> currentDTSkinMap;
-
-	private IProject project;
-
-	/**
-	 * Constructs an instance (no public instantiation).
-	 * 
-	 * @param project IProject instance for which this instance applies.
-	 */
-	private DTSkinManager(IProject project) {
-		this.project = project;
-		currentDTSkinMap = new HashMap<String, IDTSkin>();
-	}
-
-	/**
-	 * Gets a DTSkinManager instance for the specified project instance.
-	 * 
-	 * @param aProject IProject instance for which a DTSkinManager is being
-	 * requested.
-	 * @return A DTSkinManager instance for the specified project instance.
-	 */
-	public static synchronized DTSkinManager getInstance(IProject aProject) {
-		DTSkinManager dtSkinManager = dtSkinManagerMap.get(aProject);
-		if (dtSkinManager == null) {
-			dtSkinManager = new DTSkinManager(aProject);
-			dtSkinManagerMap.put(aProject, dtSkinManager);
-		}
-		return dtSkinManager;
-	}
-
-	/**
-	 * Gets a DTSkinManager instance for the IProject instance associated with
-	 * the specified IDOMNode instance.
-	 * 
-	 * @param domNode IDOMNode instance for which a DTSkinManager is being
-	 * requested.
-	 * @return A DTSkinManager instance for the IProject instance associated
-	 * with the specified IDOMNode instance.
-	 */
-	public static DTSkinManager getInstance(IDOMNode domNode) {
-		IDOMModel domModel = domNode.getModel();
-		IProject aProject = null;
-		if (domModel != null) {
-			aProject = StructuredModelUtil.getProjectFor(domModel);
-		}
-		return getInstance(aProject);
-	}
-
-	/**
-	 * Returns a List of available IDTSkin instances.
-	 * 
-	 * @param id ID for which to get skins.
-	 * @return A List of available IDTSkin instances. List may be empty, but
-	 * will not be null.
-	 */
-	public List<IDTSkin> getSkins(String id) {
-		List<IDTSkin> dtSkins = new ArrayList<IDTSkin>();
-		List<IDTResourceProvider> dtResourceProviders =
-			DTResourceProviderFactory.getInstance().getActiveDTResourceProviders(project);
-		for (IDTResourceProvider dtResourceProvider: dtResourceProviders) {
-			if (dtResourceProvider.getId().equals(id)) {
-				dtSkins.addAll(dtResourceProvider.getSkins());
-			}
-		}
-		return dtSkins;
-	}
-
-	/**
-	 * Returns the current IDTSkin instance for the specified ID.
-	 * 
-	 * @param id The ID (typically nsURI) for which the current IDTSkin instance
-	 * is being requested.
-	 * @return The current IDTSkin instance for the specified ID. May return
-	 * null if there is no current IDTSkin instance for the specified ID.
-	 */
-	public IDTSkin getCurrentSkin(String id) {
-		IDTSkin dtSkin = currentDTSkinMap.get(id);
-		if (dtSkin == null) {
-			dtSkin = getDefaultSkin(id);
-			setCurrentSkin(id, dtSkin);
-		}
-		return dtSkin;
-	}
-
-	/**
-	 * Sets the current IDTSkin instance for the specified ID.
-	 * 
-	 * @param id The ID (typically nsURI) for which the current IDTSkin instance
-	 * is being set.
-	 * @param dtSkin The current IDTSkin instance to be set for the specified ID.
-	 */
-	public void setCurrentSkin(String id, IDTSkin dtSkin) {
-		if (id != null) {
-			IDTSkin existingDTSkin = currentDTSkinMap.get(id);
-			if (existingDTSkin != null) {
-				existingDTSkin.releaseResources();
-			}
-			if (dtSkin != null) {
-				currentDTSkinMap.put(id, dtSkin);
-			} else {
-				currentDTSkinMap.remove(id);
-			}
-		}
-	}
-
-	/**
-	 * Returns a List of all current DTSkin instances (one per id).
-	 * 
-	 * @return A List of all current DTSkin instances (one per id).
-	 */
-	public List<IDTSkin> getCurrentSkins() {
-		List<IDTSkin> currentDTSkins = new ArrayList<IDTSkin>(); 
-		List <IDTResourceProvider> dtResourceProviders =
-			DTResourceProviderFactory.getInstance().getActiveDTResourceProviders(project);
-		for (IDTResourceProvider dtResourceProvider: dtResourceProviders) {
-			IDTSkin dtSkin = getCurrentSkin(dtResourceProvider.getId());
-			if (dtSkin != null && !currentDTSkins.contains(dtSkin)) {
-				currentDTSkins.add(dtSkin);
-			}
-		}
-		return Collections.unmodifiableList(currentDTSkins);
-	}
-
-	/**
-	 * Returns the default IDTSkin instance for the specified ID.
-	 * 
-	 * @param id The ID (typically nsURI) for which the default IDTSkin instance
-	 * is being requested.
-	 * @return The default IDTSkin instance for the specified ID. May return
-	 * null if there is no default IDTSkin instance for the specified ID.
-	 */
-	public IDTSkin getDefaultSkin(String id) {
-		IDTSkin firstDTSkin = null;
-		IDTSkin defaultDTSkin = null;
-		for (IDTSkin dtSkin: getSkins(id)) {
-			if (firstDTSkin == null) {
-				firstDTSkin = dtSkin;
-			}
-			if (dtSkin.isDefault()) {
-				defaultDTSkin = dtSkin;
-				break;
-			}
-		}
-		if (defaultDTSkin == null) {
-			defaultDTSkin = firstDTSkin;
-		}
-		return defaultDTSkin;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtresourceprovider/DefaultDTResourceProvider.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtresourceprovider/DefaultDTResourceProvider.java
deleted file mode 100644
index db5ad29..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtresourceprovider/DefaultDTResourceProvider.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2009 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtresourceprovider;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-/**
- * Concrete implementation of IDTResourceProvider.
- * 
- * @author Ian Trimble - Oracle
- */
-public class DefaultDTResourceProvider extends AbstractDTResourceProvider {
-
-	/**
-	 * List of IDTSkin instances.
-	 */
-	protected List<IDTSkin> skins;
-
-	/**
-	 * Constructs an instance.
-	 * 
-	 * @param id The ID of this provider.
-	 */
-	public DefaultDTResourceProvider(String id) {
-		super(id);
-		skins = new ArrayList<IDTSkin>();
-	}
-
-	/**
-	 * Constructs an instance.
-	 * 
-	 * @param id The ID of this provider.
-	 * @param skins The List of IDTSkin instances.
-	 */
-	public DefaultDTResourceProvider(String id, List<IDTSkin> skins) {
-		super(id);
-		if (skins != null) {
-			this.skins = skins;
-		} else {
-			this.skins = new ArrayList<IDTSkin>();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtresourceprovider.IDTResourceProvider#getSkins()
-	 */
-	public List<IDTSkin> getSkins() {
-		return Collections.unmodifiableList(skins);
-	}
-
-	/**
-	 * Adds the specified IDTSkin instance to the List of IDTSkin instances.
-	 * 
-	 * @param skin IDTSkin instance to be added.
-	 * @return true (as per the general contract of the Collection.add method).
-	 */
-	public boolean addSkin(IDTSkin skin) {
-		boolean ret = false;
-		if (skin != null) {
-			ret = skins.add(skin);
-		}
-		return ret;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtresourceprovider/DefaultDTSkin.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtresourceprovider/DefaultDTSkin.java
deleted file mode 100644
index cea5e92..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtresourceprovider/DefaultDTSkin.java
+++ /dev/null
@@ -1,143 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2009 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtresourceprovider;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.core.runtime.FileLocator;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.jsf.common.ui.internal.utils.ResourceUtils;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.wst.css.core.internal.provisional.document.ICSSModel;
-import org.eclipse.wst.sse.core.StructuredModelManager;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.w3c.dom.stylesheets.StyleSheet;
-
-/**
- * Concrete implementation of AbstractDTSkin.
- * 
- * @author Ian Trimble - Oracle
- */
-public class DefaultDTSkin extends AbstractDTSkin {
-
-	private List<URL> styleSheetURLs;
-	private List<StyleSheet> styleSheets;
-	private List<IStructuredModel> models;
-	private Logger log = PDPlugin.getLogger(DefaultDTSkin.class);
-
-	/**
-	 * Constructs an instance.
-	 * 
-	 * @param name The human-readable name of the skin.
-	 */
-	public DefaultDTSkin(String name) {
-		super(name);
-	}
-
-	/**
-	 * Constructs an instance.
-	 * 
-	 * @param name The human-readable name of the skin.
-	 * @param isDefault true if this instance is considered the default for its
-	 * provider.
-	 */
-	public DefaultDTSkin(String name, boolean isDefault) {
-		super(name, isDefault);
-	}
-
-	/**
-	 * Constructs an instance.
-	 * 
-	 * @param name The human-readable name of the skin.
-	 * @param styleSheetURLs The List of URL instances that provide an absolute
-	 * reference to the stylesheets.
-	 */
-	public DefaultDTSkin(String name, List<URL> styleSheetURLs) {
-		this(name);
-		this.styleSheetURLs = styleSheetURLs;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtresourceprovider.IDTSkin#getStyleSheets()
-	 */
-	public List<StyleSheet> getStyleSheets() {
-		if (styleSheets == null) {
-			styleSheets = new ArrayList<StyleSheet>();
-			if (styleSheetURLs != null) {
-				for (URL currentURL: styleSheetURLs) {
-					InputStream in = null;
-					try {
-						in = currentURL.openStream();
-						if (in != null) {
-							IStructuredModel model = StructuredModelManager.getModelManager().getModelForRead(currentURL.toExternalForm(), in, null);
-							if (model instanceof ICSSModel) {
-								styleSheets.add((StyleSheet)((ICSSModel)model).getDocument());
-								if (models == null) {
-									models = new ArrayList<IStructuredModel>();
-								}
-								models.add(model);
-							} else {
-								model.releaseFromRead();
-							}
-						}
-					} catch(IOException ioe) {
-						log.error("Warning.DefaultDTSkin.FailureLoadingStyleSheet", name, currentURL.toExternalForm(), ioe); //$NON-NLS-1$
-					} finally {
-						ResourceUtils.ensureClosed(in);
-					}
-				}
-			}
-		}
-		return Collections.unmodifiableList(styleSheets);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtresourceprovider.IDTSkin#getStyleSheetLocations()
-	 */
-	public List<String> getStyleSheetLocations() {
-		List<String> locations = new ArrayList<String>();
-		if (styleSheetURLs != null) {
-			for (URL currentURL: styleSheetURLs) {
-				URL fileURL;
-				try {
-					fileURL = FileLocator.toFileURL(currentURL);
-				} catch(IOException ioe) {
-					//attempt to convert to a file protocol URI failed, revert to original form
-					fileURL = currentURL;
-				}
-				locations.add(fileURL.toExternalForm());
-			}
-		}
-		return Collections.unmodifiableList(locations);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtresourceprovider.IDTSkin#releaseResources()
-	 */
-	public void releaseResources() {
-		if (models != null) {
-			for (IStructuredModel model: models) {
-				model.releaseFromRead();
-			}
-			models = null;
-		}
-		styleSheets = null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtresourceprovider/IDTResourceProvider.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtresourceprovider/IDTResourceProvider.java
deleted file mode 100644
index acc15be..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtresourceprovider/IDTResourceProvider.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2009 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtresourceprovider;
-
-import java.util.List;
-
-/**
- * Defines the interface for a Design-Time (DT) "Resource Provider", which
- * offers such services as might be expected to be provided at runtime by, for
- * example, a resource servlet.
- * 
- * @author Ian Trimble - Oracle
- */
-public interface IDTResourceProvider {
-
-	/**
-	 * Returns this instance's ID.
-	 * 
-	 * @return This instance's ID.
-	 */
-	public String getId();
-
-	/**
-	 * Returns a List of IDTSkin instances.
-	 * 
-	 * @return A List of IDTSkin instances. May return an empty List, but should
-	 * not return null.
-	 */
-	public List<IDTSkin> getSkins();
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtresourceprovider/IDTSkin.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtresourceprovider/IDTSkin.java
deleted file mode 100644
index 01154f0..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtresourceprovider/IDTSkin.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2009 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtresourceprovider;
-
-import java.util.List;
-
-import org.w3c.dom.stylesheets.StyleSheet;
-
-/**
- * Interface that a design-time (DT) "skin" must implement.
- * 
- * @author Ian Trimble - Oracle
- */
-public interface IDTSkin {
-
-	/**
-	 * Returns the human-readable name of the skin.
-	 * 
-	 * @return The human-readable name of the skin.
-	 */
-	public String getName();
-
-	/**
-	 * Returns a List of StyleSheet instances.
-	 * 
-	 * @return A List of StyleSheet instances. May return an empty List, but
-	 * should not return null.
-	 */
-	public List<StyleSheet> getStyleSheets();
-
-	/**
-	 * Returns a List of Strings representing locations (typically URIs) of
-	 * stylesheets.
-	 * 
-	 * @return List of Strings representing locations (typically URIs) of
-	 * stylesheets. May return an empty List, but should not return null.
-	 */
-	public List<String> getStyleSheetLocations();
-
-	/**
-	 * This will be called before an instance goes out of scope, allowing it to
-	 * clean up any necessary resources. The instance should still be usable,
-	 * recreating any released resources as necessary on subsequent calls to its
-	 * methods.
-	 */
-	public void releaseResources();
-
-	/**
-	 * Returns true if this skin is considered the default for its provider.
-	 * 
-	 * @return true if this skin is considered the default for its provider,
-	 * else false.
-	 */
-	public boolean isDefault();
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtresourceprovider/ProviderClassMap.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtresourceprovider/ProviderClassMap.java
deleted file mode 100644
index a9feaa4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtresourceprovider/ProviderClassMap.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2009 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtresourceprovider;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-
-/**
- * Used to Map a String ID to a List of Classes and provide convenient access.
- * 
- * @author Ian Trimble - Oracle
- */
-public class ProviderClassMap {
-
-	private Map<String, List<Class>> idToClassListMap;
-	private Logger log = PDPlugin.getLogger(ProviderClassMap.class);
-
-	/**
-	 * Creates an instance.
-	 */
-	public ProviderClassMap() {
-		idToClassListMap = new HashMap<String, List<Class>>();
-	}
-
-	/**
-	 * Gets the List of Classes associated with the specified ID.
-	 * 
-	 * @param id ID for which to get the List.
-	 * @return The List of Classes associated with the specified ID. List may be
-	 * empty but will not be null.
-	 */
-	public List<Class> get(String id) {
-		List<Class> classList = idToClassListMap.get(id);
-		if (classList == null) {
-			classList = new ArrayList<Class>();
-			idToClassListMap.put(id, classList);
-		}
-		return classList;
-	}
-
-	/**
-	 * Adds the specified Class to the List associated with the specified ID.
-	 * 
-	 * @param id ID for which to associate the specified Class.
-	 * @param clazz Class to add to the List associated with the specified ID.
-	 * @return true (as per the general contract of the Collection.add method). 
-	 */
-	public boolean add(String id, Class clazz) {
-		List<Class> classList = get(id);
-		return classList.add(clazz);
-	}
-
-	/**
-	 * Instantiates all classes associated with the specified ID and returns a
-	 * List of IDTResourceProvider instances.
-	 * 
-	 * @param id ID for which to instantiate all Classes.
-	 * @return a List of IDTResourceProvider instances associated with the
-	 * specified ID. List may be empty but will not be null.
-	 */
-	public List<IDTResourceProvider> createInstances(String id) {
-		List<IDTResourceProvider> providers = new ArrayList<IDTResourceProvider>();
-		List<Class> classList = get(id);
-		for (Class providerClass: classList) {
-			try {
-				Object objProvider = providerClass.newInstance();
-				if (objProvider instanceof IDTResourceProvider) {
-					providers.add((IDTResourceProvider)objProvider);
-				} else {
-					log.error("Warning.ProviderClassMap.NotIDTResourceProvider", providerClass.getName()); //$NON-NLS-1$
-				}
-			} catch(IllegalAccessException iae) {
-				log.error("Warning.ProviderClassMap.IllegalAccess", providerClass.getName(), id, iae); //$NON-NLS-1$
-			} catch(InstantiationException ie) {
-				log.error("Warning.ProviderClassMap.Instantiation", providerClass.getName(), id, ie); //$NON-NLS-1$
-			}
-		}
-		return providers;
-	}
-
-	/**
-	 * Instantiates all registered IDTResourceProviders and returns as a List.
-	 * 
-	 * @return List of all registered IDTResourceProviders. List may be empty
-	 * but will not be null.
-	 */
-	public List<IDTResourceProvider> createInstances() {
-		List<IDTResourceProvider> providers = new ArrayList<IDTResourceProvider>();
-		Set<String> idSet = idToClassListMap.keySet();
-		for (String curId: idSet) {
-			List<IDTResourceProvider> providersForCurId = createInstances(curId);
-			providers.addAll(providersForCurId);
-		}
-		return providers;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/AbstractPropertySheetPageFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/AbstractPropertySheetPageFactory.java
deleted file mode 100644
index 849acb5..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/AbstractPropertySheetPageFactory.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2009 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.pagedesigner.editors;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.ui.views.properties.IPropertySheetPage;
-
-/**
- * Abstract class that should be extended to provide a property sheet page
- * factory.
- * 
- * @author cbateman
- *
- */
-public abstract class AbstractPropertySheetPageFactory implements
-        IPropertySheetPageFactory
-{
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.editors.IPropertySheetPageFactory#createPage(org.eclipse.core.resources.IFile)
-     */
-    public abstract IPropertySheetPage createPage(IFile file);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/DesignerStructuredTextEditorJSP.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/DesignerStructuredTextEditorJSP.java
deleted file mode 100644
index 6596d8d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/DesignerStructuredTextEditorJSP.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors;
-
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.text.ITextViewer;
-import org.eclipse.jst.pagedesigner.dnd.internal.DesignerSourceDropTargetListener;
-import org.eclipse.swt.dnd.DND;
-import org.eclipse.swt.dnd.DropTarget;
-import org.eclipse.ui.texteditor.ITextEditorDropTargetListener;
-import org.eclipse.wst.sse.ui.StructuredTextEditor;
-
-/**
- * @author mengbo
- */
-public class DesignerStructuredTextEditorJSP extends StructuredTextEditor
-{
-    private ITextEditorDropTargetListener _dropTargetListener;
-    private DropTarget _dropTarget;
-
-    @Override
-    protected void initializeDrop(final ITextViewer viewer)
-    {
-        int operations = DND.DROP_COPY | DND.DROP_MOVE;
-        _dropTarget = new DropTarget(viewer.getTextWidget(), operations);
-        _dropTargetListener = 
-            new DesignerSourceDropTargetListener(this);
-        _dropTarget.setTransfer(_dropTargetListener.getTransfers());
-        _dropTarget.addDropListener(_dropTargetListener);
-    }
-
-    @Override
-    public IAction getAction(final String actionID)
-    {
-        try
-        {
-            return super.getAction(actionID);
-        } catch (final Exception e)
-        {
-            return null;
-        }
-    }
-
-    @Override
-    public Object getAdapter(final Class required)
-    {
-        if (ITextEditorDropTargetListener.class.equals(required))
-        {
-            final DesignerSourceDropTargetListener listener = new DesignerSourceDropTargetListener(
-                    this);
-            return listener;
-        }
-        return super.getAdapter(required);
-    }
-
-    @Override
-    public void dispose()
-    {
-        if (_dropTargetListener != null)
-        {
-            _dropTargetListener = null;
-        }
-        if (_dropTarget != null)
-        {
-            _dropTarget.dispose();
-            _dropTarget = null;
-        }
-        
-        super.dispose();
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/HTMLEditor.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/HTMLEditor.java
deleted file mode 100644
index 2763d4b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/HTMLEditor.java
+++ /dev/null
@@ -1,1156 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors;
-
-import java.io.File;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtension;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.gef.DefaultEditDomain;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.ui.views.palette.PalettePage;
-import org.eclipse.gef.ui.views.palette.PaletteViewerPage;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.TextSelection;
-import org.eclipse.jface.viewers.IPostSelectionProvider;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.jsf.common.ui.internal.utils.ResourceUtils;
-import org.eclipse.jst.pagedesigner.IJMTConstants;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.dnd.internal.DesignerSourceMouseTrackAdapter;
-import org.eclipse.jst.pagedesigner.editors.pagedesigner.PageDesignerResources;
-import org.eclipse.jst.pagedesigner.jsp.core.pagevar.IPageVariablesProvider;
-import org.eclipse.jst.pagedesigner.jsp.core.pagevar.adapter.IDocumentPageVariableAdapter;
-import org.eclipse.jst.pagedesigner.parts.DocumentEditPart;
-import org.eclipse.jst.pagedesigner.preview.PreviewHandlerNew;
-import org.eclipse.jst.pagedesigner.preview.WindowsIEBrowser;
-import org.eclipse.jst.pagedesigner.properties.WPETabbedPropertySheetPage;
-import org.eclipse.jst.pagedesigner.tools.RangeSelectionTool;
-import org.eclipse.jst.pagedesigner.ui.common.PartActivationHandler;
-import org.eclipse.jst.pagedesigner.ui.common.sash.SashEditorPart;
-import org.eclipse.jst.pagedesigner.ui.preferences.PDPreferences;
-import org.eclipse.jst.pagedesigner.utils.EditorUtil;
-import org.eclipse.jst.pagedesigner.utils.PreviewUtil;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.IFileEditorInput;
-import org.eclipse.ui.IPropertyListener;
-import org.eclipse.ui.IStorageEditorInput;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.contexts.IContextService;
-import org.eclipse.ui.part.MultiPageEditorPart;
-import org.eclipse.ui.part.MultiPageEditorSite;
-import org.eclipse.ui.part.MultiPageSelectionProvider;
-import org.eclipse.ui.views.contentoutline.IContentOutlinePage;
-import org.eclipse.ui.views.properties.IPropertySheetPage;
-import org.eclipse.ui.views.properties.tabbed.ITabbedPropertySheetPageContributor;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.eclipse.wst.sse.ui.StructuredTextEditor;
-import org.eclipse.wst.sse.ui.internal.provisional.extensions.ISourceEditingTextTools;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.eclipse.wst.xml.ui.internal.provisional.IDOMSourceEditingTextTools;
-import org.w3c.dom.Document;
-
-/**
- * The HTMLEditor is a multi paged editor. It will use the StructuredTextEditor
- * as the chief editor, and delegate most operations to it.
- * 
- * @author mengbo
- */
-public final class HTMLEditor extends MultiPageEditorPart implements
-		IPropertyListener, ITabbedPropertySheetPageContributor {
-	// private static final String PAGE_NAME_DESIGN = "Design"; //$NON-NLS-1$
-	// private static final String PAGE_NAME_SOURCE = "Source"; //$NON-NLS-1$
-	/**
-	 * Tabbed property contributor id for WPE
-	 */
-	public final static String TABBED_PROPERTIES_CONTRIBUTOR_ID = "org.eclipse.jst.pagedesigner.tabPropertyContributor"; //$NON-NLS-1$
-
-	// four different modes for the designer when displayed in a sash editor.
-	/**
-	 * editor split is vertical
-	 */
-	public static final int MODE_SASH_VERTICAL = 0;
-
-	/**
-	 * editor split is horizontal
-	 */
-	public static final int MODE_SASH_HORIZONTAL = 1;
-
-	/**
-	 * no split, only designer canvas
-	 */
-	public static final int MODE_DESIGNER = 2;
-
-	/**
-	 * no split, only SSE source
-	 */
-	public static final int MODE_SOURCE = 3;
-
-	private Logger _log = PDPlugin.getLogger(HTMLEditor.class);
-
-	private boolean _sash = true;
-
-	private int _mode = 0;
-
-	private SashEditorPart _sashEditorPart = null;
-
-	private int _previewPageIndex;
-
-	/** The design viewer */
-	private SimpleGraphicalEditor _designViewer;
-
-	/** The text editor. */
-	private StructuredTextEditor _textEditor;
-
-	private PartActivationHandler _partListener;
-
-	private PaletteViewerPage _paletteViewerPage;
-
-	private DefaultEditDomain _editDomain;
-
-	private WindowsIEBrowser _browser;
-	
-	private Composite _previewComposite;
-
-	private List PREVIEW_FILES_LIST = new ArrayList();
-
-	private IPropertySheetPage _tabbedPropSheet;
-
-	private ISelectionChangedListener _selChangedListener;
-
-    // TODO:This class is never used locally
-//	private class TextInputListener implements ITextInputListener {
-//		public void inputDocumentAboutToBeChanged(IDocument oldInput,
-//				IDocument newInput) {
-//            // do nothing
-//		}
-//
-//		public void inputDocumentChanged(IDocument oldInput, IDocument newInput) {
-//			if (_designViewer != null && newInput != null)
-//				_designViewer.setModel(getModel());
-//		}
-//	}
-
-	/**
-	 * Default constructor
-	 */
-	public HTMLEditor() {
-		super();
-	}
-
-	/*
-	 * This method is just to make firePropertyChanged accessbible from some
-	 * (anonomous) inner classes.
-	 */
-	private void _firePropertyChange(int property) {
-		super.firePropertyChange(property);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.xtools.common.ui.properties.ITabbedPropertySheetPageContributor#getContributorId()
-	 */
-	public String getContributorId() {
-		return TABBED_PROPERTIES_CONTRIBUTOR_ID;
-	}
-
-	private void connectSashPage() {
-		ISelectionProvider selectionProvider = _sashEditorPart.getSite()
-				.getSelectionProvider();
-		if (selectionProvider instanceof IPostSelectionProvider) {
-			((IPostSelectionProvider) selectionProvider)
-					.addPostSelectionChangedListener(getSelectionChangedListener(selectionProvider));
-		} else {
-			selectionProvider
-					.addSelectionChangedListener(getSelectionChangedListener(selectionProvider));
-		}
-	}
-	
-	private void disconnectSashPage() {
-		//attempted fix for bug 283569... was not able to repro, but should protect against NPE
-		if (_sashEditorPart != null 
-				&& _sashEditorPart.getSite() != null 
-				&& _sashEditorPart.getSite().getSelectionProvider() != null
-				&& _selChangedListener != null) {
-			
-			final ISelectionProvider selectionProvider = _sashEditorPart.getSite()
-					.getSelectionProvider();
-			if (selectionProvider != null) {
-				if (selectionProvider instanceof IPostSelectionProvider) {
-					((IPostSelectionProvider) selectionProvider)
-							.removePostSelectionChangedListener(getSelectionChangedListener(selectionProvider));
-				} else {
-					selectionProvider
-							.removeSelectionChangedListener(getSelectionChangedListener(selectionProvider));
-				}
-			}
-		}		
-	}
-
-	private ISelectionChangedListener getSelectionChangedListener(ISelectionProvider selectionProvider) {
-		if (_selChangedListener  == null) {
-			if (selectionProvider instanceof IPostSelectionProvider) {
-				_selChangedListener =  new ISelectionChangedListener() {
-				public void selectionChanged(SelectionChangedEvent event) {
-						((MultiPageSelectionProvider) getSite()
-								.getSelectionProvider())
-								.firePostSelectionChanged(event);
-					}
-				};
-			}
-			else {
-				_selChangedListener =  new ISelectionChangedListener() {
-					public void selectionChanged(SelectionChangedEvent event) {
-							((MultiPageSelectionProvider) getSite()
-									.getSelectionProvider())
-									.firePostSelectionChanged(event);
-						}
-					};
-			}
-		}
-		return _selChangedListener;
-	}
-
-	/**
-	 * Creates the source page of the multi-page editor.
-	 * @throws PartInitException 
-	 */
-	protected void sash_createAndAddDesignSourcePage() throws PartInitException {
-		// create source page
-		_textEditor = createTextEditor();
-		_textEditor.setEditorPart(this);
-		_textEditor.addPropertyListener(this);
-		// create design page
-		_designViewer = new SimpleGraphicalEditor(this, getEditDomain());
-
-		// create SashEditor
-		_sashEditorPart = new SashEditorPart() {
-			protected void createPages() throws PartInitException {
-				addPage(_designViewer, getEditorInput());
-				addPage(_textEditor, getEditorInput());
-			}
-		};
-		int sashIndex = addPage(_sashEditorPart, getEditorInput());
-
-		// Set the sash editor mode from the stored file property
-		// or the default preference
-		initDesignerMode();
-
-		setPageText(sashIndex, PDPlugin.getResourceString("HTMLEditor.Design")); //$NON-NLS-1$
-
-		// the update's critical, to get viewer selection manager and
-		// highlighting to work
-		_textEditor.update();
-
-		firePropertyChange(PROP_TITLE);
-
-		// Changes to the Text Viewer's document instance should also force an
-		// input refresh
-		// _textEditor.getTextViewer().addTextInputListener(new
-		// TextInputListener());
-		connectSashPage();
-	}
-
-	/**
-	 * @see org.eclipse.ui.part.MultiPageEditorPart#createSite(org.eclipse.ui.IEditorPart)
-	 */
-	protected IEditorSite createSite(IEditorPart editor) {
-		return new MultiPageEditorSite(this, editor);
-	}
-
-	private void tabbed_createAndAddDesignSourcePage()
-			throws PartInitException {
-		// create source page
-		_textEditor = createTextEditor();
-		_textEditor.setEditorPart(this);
-		_textEditor.addPropertyListener(this);
-
-		// create design page
-		SimpleGraphicalEditor editor = new SimpleGraphicalEditor(this,
-				getEditDomain());
-
-		// add design page
-		int designPageIndex = addPage(editor, null);
-
-		_designViewer = editor;
-		// // note: By adding the design page as a Control instead of an
-		// // IEditorPart, page switches will indicate
-		// // a "null" active editor when the design page is made active
-		setPageText(designPageIndex, PDPlugin
-				.getResourceString("HTMLEditor.Design")); //$NON-NLS-1$
-
-		// add source page
-		int sourcePageIndex = addPage(_textEditor, getEditorInput());
-		setPageText(sourcePageIndex, PDPlugin
-				.getResourceString("HTMLEditor.Source")); //$NON-NLS-1$
-		// the update's critical, to get viewer selection manager and
-		// highlighting to work
-		_textEditor.update();
-
-		firePropertyChange(PROP_TITLE);
-
-		// Changes to the Text Viewer's document instance should also force an
-		// input refresh
-		// _textEditor.getTextViewer().addTextInputListener(new
-		// TextInputListener());
-	}
-
-	private void createAndAddPreviewPage() {
-		_previewComposite = new Composite(getContainer(), 0);
-		FillLayout filllayout = new FillLayout();
-		_previewComposite.setLayout(filllayout);
-
-		_previewPageIndex = addPage(_previewComposite);
-		// JSPSourceEditor.Page.Preview.PageText=Preview
-		setPageText(_previewPageIndex, PageDesignerResources.getInstance()
-				.getString("JSPSourceEditor.Page.Preview.PageText")); //$NON-NLS-1$
-		
-	}
-
-	private WindowsIEBrowser getPreviewBrowser() {
-		if (_browser == null) {
-			_browser = new WindowsIEBrowser();
-			if (_browser != null) {
-				_browser.create(_previewComposite, SWT.NONE);
-				_previewComposite.layout();
-			}
-		}
-		return _browser;
-	}
-	/**
-	 * Connects the design viewer with the viewer selection manager. Should be
-	 * done after createSourcePage() is done because we need to get the
-	 * ViewerSelectionManager from the TextEditor. setModel is also done here
-	 * because getModel() needs to reference the TextEditor.
-	 */
-	protected void connectDesignPage() {
-		if (_designViewer != null) {
-			_designViewer.setModel(getModel());
-			// _designViewer.getSynchronizer().listenToModel(getModel());
-			ISelectionProvider designSelectionProvider = _designViewer
-					.getSite().getSelectionProvider();
-			if (designSelectionProvider instanceof IPostSelectionProvider) {
-				((IPostSelectionProvider) designSelectionProvider)
-						.addPostSelectionChangedListener(new ISelectionChangedListener() {
-							public void selectionChanged(
-									SelectionChangedEvent event) {
-								if (getActiveEditor() != _textEditor) {
-									_designViewer.getSynchronizer()
-											.selectionChanged(event);
-								}
-							}
-						});
-			} else {
-				designSelectionProvider
-						.addSelectionChangedListener(new ISelectionChangedListener() {
-							public void selectionChanged(
-									SelectionChangedEvent event) {
-								if (getActiveEditor() != _textEditor) {
-									_designViewer.getSynchronizer()
-											.selectionChanged(event);
-								}
-							}
-						});
-			}
-			ISelectionProvider textSelectionProvider = _textEditor.getSite()
-					.getSelectionProvider();
-			if (textSelectionProvider instanceof IPostSelectionProvider) {
-				((IPostSelectionProvider) textSelectionProvider)
-						.addPostSelectionChangedListener(new ISelectionChangedListener() {
-							public void selectionChanged(
-									SelectionChangedEvent event) {
-								if (event.getSelection() instanceof TextSelection) {
-									TextSelection textSelection = ((TextSelection) event
-											.getSelection());
-									_designViewer
-											.getSynchronizer()
-											.textSelectionChanged(
-													textSelection.getOffset(),
-													textSelection.getOffset()
-															+ textSelection
-																	.getLength());
-								}
-							}
-						});
-			} else {
-				textSelectionProvider
-						.addSelectionChangedListener(new ISelectionChangedListener() {
-							public void selectionChanged(
-									SelectionChangedEvent event) {
-								TextSelection textSelection = ((TextSelection) event
-										.getSelection());
-								_designViewer.getSynchronizer()
-										.textSelectionChanged(
-												textSelection.getOffset(),
-												textSelection.getOffset()
-														+ textSelection
-																.getLength());
-							}
-						});
-			}
-		}
-	}
-
-	/**
-	 * Creates the pages of this multi-page editor.
-	 * <p>
-	 * Subclasses of <code>MultiPageEditor</code> must implement this method.
-	 * </p>
-	 */
-	protected void createPages() {
-		try {
-			// source page MUST be created before design page, now
-			if (_sash) {
-				sash_createAndAddDesignSourcePage();
-			} else {
-				tabbed_createAndAddDesignSourcePage();
-			}
-			connectDesignPage();
-			createAndAddPreviewPage();
-			DesignerSourceMouseTrackAdapter adapter = new DesignerSourceMouseTrackAdapter(
-					_textEditor, getEditDomain());
-			_textEditor.getTextViewer().getTextWidget().addMouseListener(
-					adapter);
-			_textEditor.getTextViewer().getTextWidget().addMouseMoveListener(
-					adapter);
-		} catch (PartInitException exception) {
-			//$NON-NLS-1$ = "An error has occurred when initializing the input for the the editor's source page."
-			if (_log != null) {
-				// throw new SourceEditingRuntimeException(
-				// "An error has occurred when initializing the input for the
-				// the editor's source page.");
-			}
-		}
-		// TODO: add a catch block here for any exception the design
-		// page throws and convert it into a more informative message.
-	}
-
-	/**
-	 * Method createTextEditor.
-	 * 
-	 * @return StructuredTextEditor
-	 */
-	protected StructuredTextEditor createTextEditor() {
-		return new DesignerStructuredTextEditorJSP();
-	}
-
-	private void disconnectDesignPage() {
-		if (_designViewer != null) {
-			_designViewer.setModel(null);
-			_designViewer.dispose();
-		}
-	}
-
-	public void dispose() {
-		//System.out.println("dispose of HTML Editor");
-		deletePreviewFiles();
-		
-		disconnectSashPage();
-		disconnectDesignPage();
-		
-		IWorkbenchWindow window = getSite().getWorkbenchWindow();
-		window.getPartService().removePartListener(_partListener);
-		window.getShell().removeShellListener(_partListener);
-		getSite().getPage().removePartListener(_partListener);
-
-		if (_textEditor != null) {
-			_textEditor.removePropertyListener(this);
-			_textEditor.setEditorPart(null);
-			_textEditor.dispose();
-		}
-		
-		// moved to last when added window ... seems like
-		// we'd be in danger of losing some data, like site,
-		// or something.
-		_sashEditorPart = null;
-		_tabbedPropSheet = null;
-		_partListener = null;
-		_editDomain = null;
-		_designViewer = null;
-		_browser = null;
-		_previewComposite = null;
-		_paletteViewerPage = null;
-		_log = null;
-		_selChangedListener = null;
-		_textEditor = null;
-		
-		super.dispose();
-		
-	}
-
-	public void doSave(IProgressMonitor monitor) {
-		_textEditor.doSave(monitor);
-	}
-
-	/*
-	 * (non-Javadoc) Saves the contents of this editor to another object. <p>
-	 * Subclasses must override this method to implement the open-save-close
-	 * lifecycle for an editor. For greater details, see <code> IEditorPart
-	 * </code></p>
-	 * 
-	 * @see IEditorPart
-	 */
-	public void doSaveAs() {
-		_textEditor.doSaveAs();
-	}
-
-	private void editorInputIsAcceptable(IEditorInput input)
-			throws PartInitException {
-		if (input instanceof IFileEditorInput) {
-			// verify that it can be opened
-			CoreException[] coreExceptionArray = new CoreException[1];
-			if (fileDoesNotExist((IFileEditorInput) input, coreExceptionArray)) {
-				// todo use message formatter for {0}
-				Throwable coreException = coreExceptionArray[0];
-
-				// C.B: this is a strange piece of logic.  It was referenceing
-				// the internal sub-class of CoreException, ResourceException.
-				// need to review fileDoesNotExist.
-				if (coreException instanceof CoreException) {
-					// I'm assuming this is always 'does not exist'
-					// we'll refresh local go mimic behavior of default
-					// editor, where the
-					// troublesome file is refreshed (and will cause it to
-					// 'disappear' from Navigator.
-					try {
-						((IFileEditorInput) input).getFile()
-								.refreshLocal(IResource.DEPTH_ZERO,
-										new NullProgressMonitor());
-					} catch (CoreException ce) {
-						if (_log != null) {
-							_log.error("Error.HTMLEditor.0", ce); //$NON-NLS-1$
-						}
-					}
-					throw new PartInitException("Resource " + input.getName() //$NON-NLS-1$
-							+ " does not exist."); //$NON-NLS-1$
-				}
-                throw new PartInitException("Editor could not be open on " //$NON-NLS-1$
-                		+ input.getName());
-			}
-		} else if (input instanceof IStorageEditorInput) {
-			InputStream contents = null;
-			try {
-				contents = ((IStorageEditorInput) input).getStorage()
-						.getContents();
-				if (contents == null) {
-					throw new PartInitException("Editor could not be open on " //$NON-NLS-1$
-							+ input.getName());
-				}
-			} catch (CoreException noStorageExc) {
-				// Error in geting storage contents
-				_log.error("Error.HTMLEditor.1", noStorageExc); //$NON-NLS-1$
-			}
-			finally
-			{
-				ResourceUtils.ensureClosed(contents);
-			}
-		}
-	}
-
-	/**
-	 * Initializes the editor part with a site and input. <p>
-	 * Subclasses of <code> EditorPart </code> must implement this method.
-	 * Within the implementation subclasses should verify that the input type is
-	 * acceptable and then save the site and input. Here is sample code: </p><pre>
-	 * if (!(input instanceof IFileEditorInput)) throw new
-	 * PartInitException("Invalid Input: Must be IFileEditorInput");
-	 * setSite(site); setInput(editorInput); </pre>
-	 * @param input 
-	 * @param coreException 
-	 * @return true if the input doesn't exist 
-	 */
-	protected boolean fileDoesNotExist(IFileEditorInput input,
-			Throwable[] coreException) {
-		boolean result = false;
-		InputStream inStream = null;
-		if ((!(input.exists())) || (!(input.getFile().exists()))) {
-			result = true;
-		} else {
-			try 
-			{
-				inStream = input.getFile().getContents(true);
-			} 
-			catch (CoreException e) 
-			{
-				// very likely to be file not found
-				result = true;
-				coreException[0] = e;
-				// The core has exception
-				_log.error("Error.HTMLEditor.3", e); //$NON-NLS-1$
-			} 
-			finally 
-			{
-				ResourceUtils.ensureClosed(inStream);
-			}
-		}
-		return result;
-	}
-
-	public Object getAdapter(Class key) {
-		Object result = null;
-		if (key == IDesignViewer.class) {
-			result = _designViewer;
-		} else if (key == PalettePage.class) {
-			return getPaletteViewerPage();
-		} else if (key == IPropertySheetPage.class) {
-			// XXX: we can delegate this to the fTextEditor, but that use some
-			// more
-			// complicate mechanism, and don't work with page designer well, so
-			// do it simple now, fix later.
-			// return _textEditor.getAdapter(key);
-			return getPropertySheetPage();
-		} else if (key == IContentOutlinePage.class) {
-			if (_textEditor != null) {
-				result = _textEditor.getAdapter(key);
-			}
-		} else if (key == IPageVariablesProvider.class) {
-			Object obj = ((IDOMModel) getModel()).getDocument().getAdapterFor(
-					IDocumentPageVariableAdapter.class);
-			if (obj instanceof IPageVariablesProvider) {
-				return obj;
-			}
-            return null;
-		} else {
-			// DMW: I'm bullet-proofing this because
-			// its been reported (on 4.03 version) a null pointer sometimes
-			// happens here on startup, when an editor has been left
-			// open when workbench shutdown.
-			if (_textEditor != null) {
-				result = _textEditor.getAdapter(key);
-			}
-		}
-		return result;
-	}
-
-
-	/**
-	 * IExtendedSimpleEditor method
-	 * @return IDocument
-	 */
-	public IDocument getDocument() {
-		if (getTextEditor() == null) {
-			return null;
-		}
-
-		Object apapter = _textEditor.getAdapter(ISourceEditingTextTools.class);
-		if (apapter != null) {
-			return ((ISourceEditingTextTools) apapter).getDocument();
-		}
-
-		return null;
-	}
-
-	/**
-	 * IExtendedMarkupEditor method
-	 * @return the dom document
-	 */
-	public Document getDOMDocument() {
-		if (getTextEditor() == null) {
-			return null;
-		}
-
-		Object adapter = _textEditor.getAdapter(ISourceEditingTextTools.class);
-		if (adapter instanceof IDOMSourceEditingTextTools) {
-			return ((IDOMSourceEditingTextTools) adapter).getDOMDocument();
-		}
-		return null;
-	}
-
-	/**
-	 * IExtendedSimpleEditor method
-	 * @return the editor part
-	 */
-	public IEditorPart getEditorPart() {
-		return this;
-	}
-
-	/**
-	 * @return the structured model
-	 */
-	public IStructuredModel getModel() {
-		IStructuredModel model = null;
-		if (_textEditor != null) {
-			model = ((DesignerStructuredTextEditorJSP) _textEditor).getModel();
-		}
-		return model;
-	}
-
-
-	/**
-	 * @return the SSE editor delegate
-	 */
-	public StructuredTextEditor getTextEditor() {
-		return _textEditor;
-	}
-
-
-	/*
-	 * (non-Javadoc) Method declared on IWorkbenchPart.
-	 */
-	public String getTitle() {
-		String title = null;
-		if (getTextEditor() == null) {
-			if (getEditorInput() != null) {
-				title = getEditorInput().getName();
-			}
-		} else {
-			title = getTextEditor().getTitle();
-		}
-		if (title == null) {
-			title = getPartName();
-		}
-		return title;
-	}
-
-	public void init(IEditorSite site, IEditorInput input)
-			throws PartInitException {
-		super.init(site, input);
-		editorInputIsAcceptable(input);
-		try {
-			// super.init(site, input);
-			// setSite(site);
-			setInput(input);
-			if (_partListener == null) {
-				_partListener = new PartActivationHandler(this) {
-					public void handleActivation() {
-						safelySanityCheckState();
-					}
-				};
-			}
-			// we want to listen for our own activation
-			IWorkbenchWindow window = getSite().getWorkbenchWindow();
-			window.getPartService().addPartListener(_partListener);
-			window.getShell().addShellListener(_partListener);
-			
-			// TODO: is this the right place to do this?
-			// enable our editor context
-			IContextService contextService = (IContextService) getSite()
-			  .getService(IContextService.class);
-			contextService.activateContext("org.eclipse.jst.pagedesigner.editorContext"); //$NON-NLS-1$
-
-		} catch (Exception e) {
-			// Error in editor initialization
-			_log.error("Error.HTMLEditor.5", e); //$NON-NLS-1$
-		}
-		setPartName(input.getName());
-	}
-
-	/*
-	 * (non-Javadoc) Returns whether the "save as" operation is supported by
-	 * this editor. <p> Subclasses must override this method to implement the
-	 * open-save-close lifecycle for an editor. For greater details, see <code>
-	 * IEditorPart </code></p>
-	 * 
-	 * @see IEditorPart
-	 */
-	public boolean isSaveAsAllowed() {
-		return _textEditor != null && _textEditor.isSaveAsAllowed();
-	}
-
-	/*
-	 * (non-Javadoc) Returns whether the contents of this editor should be saved
-	 * when the editor is closed. <p> This method returns <code> true </code> if
-	 * and only if the editor is dirty ( <code> isDirty </code> ). </p>
-	 */
-	public boolean isSaveOnCloseNeeded() {
-		// overriding super class since it does a lowly isDirty!
-		if (_textEditor != null) {
-			return _textEditor.isSaveOnCloseNeeded();
-		}
-		return isDirty();
-	}
-
-	/**
-	 * Posts the update code "behind" the running operation.
-	 */
-	private void postOnDisplayQue(Runnable runnable) {
-		IWorkbench workbench = PlatformUI.getWorkbench();
-		IWorkbenchWindow[] windows = workbench.getWorkbenchWindows();
-		if (windows != null && windows.length > 0) {
-			Display display = windows[0].getShell().getDisplay();
-			display.asyncExec(runnable);
-		} else {
-			runnable.run();
-		}
-	}
-
-	/**
-	 * Indicates that a property has changed.
-	 * 
-	 * @param source
-	 *            the object whose property has changed
-	 * @param propId
-	 *            the id of the property which has changed; property ids are
-	 *            generally defined as constants on the source class
-	 */
-	public void propertyChanged(Object source, int propId) {
-		switch (propId) {
-		// had to implement input changed "listener" so that
-		// strucutedText could tell it containing editor that
-		// the input has change, when a 'resource moved' event is
-		// found.
-		case IEditorPart.PROP_INPUT: {
-			if (source == _textEditor) {
-				if (_textEditor.getEditorInput() != getEditorInput()) {
-					setInput(_textEditor.getEditorInput());
-					// title should always change when input changes.
-					// create runnable for following post call
-					Runnable runnable = new Runnable() {
-						public void run() {
-							_firePropertyChange(IWorkbenchPart.PROP_TITLE);
-						}
-					};
-					// Update is just to post things on the display queue
-					// (thread). We have to do this to get the dirty
-					// property to get updated after other things on the
-					// queue are executed.
-					postOnDisplayQue(runnable);
-				}
-			}
-			break;
-		}
-		case IWorkbenchPart.PROP_TITLE: {
-			// // update the input if the title is changed. why? It seems input
-			// change event will be fired at last.
-			// if (source == _textEditor)
-			// {
-			// if (_textEditor.getEditorInput() != getEditorInput())
-			// {
-			// setInput(_textEditor.getEditorInput());
-			// }
-			// }
-			// break;
-		}
-		default: {
-			// propagate changes. Is this needed? Answer: Yes.
-			// PROP_PART_NAME, PROP_DIRTY etc.
-			if (source == _textEditor) {
-				firePropertyChange(propId);
-			}
-			break;
-		}
-		}
-
-	}
-
-	private void safelySanityCheckState() {
-		// If we're called before editor is created, simply ignore since we
-		// delegate this function to our embedded TextEditor
-		if (getTextEditor() == null) {
-			return;
-		}
-
-		getTextEditor().safelySanityCheckState(getEditorInput());
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.part.EditorPart#setInput(org.eclipse.ui.IEditorInput)
-	 */
-	protected void setInput(IEditorInput input) {
-		// If driven from the Source page, it's "model" may not be up to date
-		// with the input just yet. We'll rely on later notification from the
-		// TextViewer to set us straight
-		super.setInput(input);
-		if (_designViewer != null) {
-
-			_designViewer.setModel(getModel());
-		}
-		setPartName(input.getName());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.part.EditorPart#isDirty()
-	 */
-	public boolean isDirty() {
-		if (getTextEditor() == null) {
-			return false;
-		}
-		return getTextEditor().isDirty();
-	}
-
-	private IPropertySheetPage getPropertySheetPage()
-    {
-        if (_tabbedPropSheet == null || _tabbedPropSheet.getControl() == null 
-                || _tabbedPropSheet.getControl().isDisposed())
-        {
-            IPropertySheetPageFactory factory = getPageFactory();
-            if (factory != null)
-            {
-                final IFile file = ((IFileEditorInput)getEditorInput()).getFile();
-                _tabbedPropSheet = factory.createPage(file);
-            }
-            else
-            {
-                _tabbedPropSheet = new WPETabbedPropertySheetPage(this,this);
-            }
-        }
-        return _tabbedPropSheet;
-    }
-
-    private IPropertySheetPageFactory getPageFactory()
-    {
-        //List<IElementEditFactory> result = new ArrayList<IElementEditFactory>();
-        IExtensionPoint extensionPoint = Platform.getExtensionRegistry()
-                .getExtensionPoint(PDPlugin.getPluginId(),
-                        IJMTConstants.EXTENSION_POINT_PAGEDESIGNER);
-        IExtension[] extensions = extensionPoint.getExtensions();
-
-        for (int i = 0; i < extensions.length; i++)
-        {
-            IExtension ext = extensions[i];
-            IConfigurationElement[] elementEditElement = ext
-                    .getConfigurationElements();
-
-            for (int j = 0; j < elementEditElement.length; j++)
-            {
-                final IConfigurationElement element = elementEditElement[j];
-                if (element.getName().equals(
-                        IJMTConstants.PROPERTY_PAGE_FACTORY))
-                {
-                    elementEditElement[j].getAttribute("class"); //$NON-NLS-1$
-                    Object obj;
-                    try
-                    {
-                        obj = elementEditElement[j]
-                                .createExecutableExtension("class"); //$NON-NLS-1$
-
-                        // TODO: we need a policy based solution here,
-                        // but this will do for now
-                        if (obj instanceof IPropertySheetPageFactory)
-                        {
-                            return (IPropertySheetPageFactory) obj;
-                        }
-                    } 
-                    catch (CoreException e)
-                    {
-                        PDPlugin.log("Problem loading element edit extension for "+element.toString(), e); //$NON-NLS-1$
-                    }
-                }
-            }
-        }
-        return null;
-    }
-       
-    /**
-     * @return PaletteViewerPage
-     */
-    private PaletteViewerPage getPaletteViewerPage()
-    {
-        if (_paletteViewerPage == null)
-        {
-            _paletteViewerPage = _designViewer.createPaletteViewerPage();
-        }
-        return _paletteViewerPage;
-    }
-
-	/**
-	 * @return the edit domain
-	 */
-	public DefaultEditDomain getEditDomain() {
-		if (_editDomain == null) {
-			_editDomain = new DefaultEditDomain(this);
-
-			// XXX: if i don't do the following line, system will default use
-			// SelectionTool. Don't know where else to set this. Since it is
-			// kind of duplicate
-			// to the DesignerPaletteRoot.
-			_editDomain.setDefaultTool(new RangeSelectionTool());
-			_editDomain.loadDefaultTool();
-
-			// next config the _editDomain
-			// _editDomain.setPaletteRoot(new JSFPaletteRoot());
-		}
-		return _editDomain;
-	}
-
-	/**
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.part.MultiPageEditorPart#pageChange(int)
-	 */
-	protected void pageChange(int newPageIndex) {
-		super.pageChange(newPageIndex);
-
-		deletePreviewFiles();
-
-		if (newPageIndex == _previewPageIndex) {
-			// preview page activate, need to regenerate the preview text and
-			// display it.
-			StringBuffer result = new StringBuffer();
-			try {
-				// PreviewHandler.generatePreview(this.getModel(),
-				// this.getEditorInput(), result);
-				DocumentEditPart part = (DocumentEditPart) this._designViewer
-						.getGraphicViewer().getContents();
-				PreviewHandlerNew.generatePreview(part, result);
-			} catch (Exception ex) {
-				result = new StringBuffer();
-				result
-						.append(this.getModel().getStructuredDocument()
-								.getText());
-				// Error in page changing
-				_log.info("Error.HTMLEditor.6", ex); //$NON-NLS-1$
-				ex.printStackTrace();
-			}
-			File file = PreviewUtil.toFile(result, getEditorInput());
-			if (file != null) {
-				PREVIEW_FILES_LIST.add(file);
-				getPreviewBrowser().loadFile(file);
-			} else {
-				getPreviewBrowser().getBrowser().setUrl("about:blank"); //$NON-NLS-1$
-			}
-		}
-	}
-
-	/**
-	 * @return Returns the _designViewer.
-	 */
-	public IDesignViewer getDesignViewer() {
-		return _designViewer;
-	}
-
-	/**
-	 * @param mode
-	 */
-	public void setDesignerMode(int mode) {
-		if (_sashEditorPart != null && _mode != mode) {
-			switch (mode) {
-			case MODE_SASH_HORIZONTAL:
-				_sashEditorPart.setOrientation(SWT.HORIZONTAL);
-				break;
-			case MODE_DESIGNER:
-				_sashEditorPart.setMaximizedEditor(this._designViewer);
-				break;
-			case MODE_SOURCE:
-				_sashEditorPart.setMaximizedEditor(this._textEditor);
-				break;
-			case MODE_SASH_VERTICAL:
-			default:
-				_sashEditorPart.setOrientation(SWT.VERTICAL);
-			}
-			if (getEditorInput() != null) {
-				EditorUtil.setEditorInputDesignModeProperty(getEditorInput(), String.valueOf(mode));
-			}
-		}
-		this._mode = mode;
-	}
-
-	/*
-	 * Set the sash editor mode from the stored file property
-	 * or the default preference.
-	 */
-	private void initDesignerMode() {
-		int preferredMode = MODE_SASH_VERTICAL;
-
-		// If the user has already selected a mode for the file, use it.
-		String prop = null;
-		if (getEditorInput() != null) {
-			prop = EditorUtil.getEditorInputDesignModeProperty(getEditorInput());
-		}
-		if (prop != null) {
-			try {
-				preferredMode = Integer.parseInt(prop);
-			} catch (NumberFormatException e) {
-				// do nothing;
-			}
-		} else {
-			// Otherwise, get the default mode from preferences.
-			IPreferenceStore pStore = PDPlugin.getDefault().getPreferenceStore();
-			preferredMode = pStore.getInt(PDPreferences.SASH_EDITOR_MODE_PREF);
-		}
-
-		setDesignerMode(preferredMode);
-	}
-
-	/**
-	 * @return the current design mode
-	 */
-	public int getDesignerMode() {
-		return this._mode;
-	}
-
-	public IEditorPart getActiveEditor() {
-		IEditorPart result = null;
-		if (_sash) {
-			result = _sashEditorPart.getActiveEditor();
-		} else {
-			if (_designViewer.getGraphicViewer().getControl().isFocusControl()) {
-				result = _designViewer;
-			} else if (_textEditor.getTextViewer().getControl()
-					.isFocusControl()) {
-				result = _textEditor;
-			}
-		}
-		return result;
-	}
-
-	public String getPartName() {
-		if (_textEditor != null) {
-			return _textEditor.getPartName();
-		}
-        return super.getPartName();
-	}
-
-	private void deletePreviewFiles() {
-		Iterator itPreviewFiles = PREVIEW_FILES_LIST.iterator();
-		while (itPreviewFiles.hasNext()) {
-			File file = (File)itPreviewFiles.next();
-			if (file != null && file.exists()) {
-				file.delete();
-			}
-		}
-		PREVIEW_FILES_LIST.clear();
-	}
-
-	/**
-	 * Refreshes the design page. Allows an external action to force a refresh
-	 * after an external change, such as a DT skin change.
-	 */
-	public void refreshDesignViewer() {
-		EditPart contentEditPart = _designViewer.getGraphicViewer().getRootEditPart().getContents();
-		if (contentEditPart instanceof DocumentEditPart) {
-			((DocumentEditPart)contentEditPart).styleChanged();
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/IDesignViewer.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/IDesignViewer.java
deleted file mode 100644
index fc05338..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/IDesignViewer.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors;
-
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-
-/**
- * This is copied from the xmleditor plugin. Represents the design viewer that
- * need can be used to show the design page.
- * 
- * @author mengbo
- */
-public interface IDesignViewer {
-	/**
-	 * @return the title
-	 */
-	String getTitle();
-
-	/**
-	 * @param model
-	 */
-	void setModel(IStructuredModel model);
-
-	// void setViewerSelectionManager(ViewerSelectionManager
-	// viewerSelectionManager);
-
-	/**
-	 * @return the graphical viewer
-	 */
-	public IHTMLGraphicalViewer getGraphicViewer();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/IPropertySheetPageFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/IPropertySheetPageFactory.java
deleted file mode 100644
index 3e37903..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/IPropertySheetPageFactory.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2009 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.pagedesigner.editors;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.ui.views.properties.IPropertySheetPage;
-
-/**
- * A factory that can be used with the pageDesignerExtension to override
- * the default property sheet page provided by the WPE when tag elements are
- * selected by the user.
- * 
- * This interface should not be implemented or extended by clients.  Use
- * AbstractPropertySheetPageFactory instead.
- * 
- * @author cbateman
- *
- */
-public interface IPropertySheetPageFactory
-{
-    /**
-     * @param file
-     * @return the  property sheet page for the file.
-     */
-    IPropertySheetPage  createPage(final IFile file);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/OutlineConfiguration.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/OutlineConfiguration.java
deleted file mode 100644
index d35de2d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/OutlineConfiguration.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jface.text.ITextSelection;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jst.jsp.ui.views.contentoutline.JSPContentOutlineConfiguration;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
-
-/**
- * the HTML editor's outline view configuration
- *
- */
-public class OutlineConfiguration extends JSPContentOutlineConfiguration {
-	private Object[] _selections = new Object[0];
-
-	public ISelection getSelection(TreeViewer viewer, ISelection selection) {
-		if ((viewer.getInput() instanceof IStructuredModel)
-				&& (selection instanceof ITextSelection)) {
-			_selections = getSelectedObjects((IStructuredModel) viewer
-					.getInput(), (ITextSelection) selection);
-			if (_selections != null) {
-				return super.getSelection(viewer, new StructuredSelection(
-						_selections));
-			}
-		}
-		else if (selection instanceof IStructuredSelection)
-		{
-		    return super.getSelection(viewer, selection);
-		}
-		return super.getSelection(viewer, new StructuredSelection(_selections));
-	}
-	
-	private Object[] getSelectedObjects(IStructuredModel model,
-			ITextSelection selection) {
-		Object[] selectedStructures = null;
-		if (model != null) {
-			IndexedRegion region = model
-					.getIndexedRegion(selection.getOffset());
-			int end = selection.getOffset() + selection.getLength();
-			if (region != null) {
-				if (end <= region.getEndOffset()) {
-					// single selection
-					selectedStructures = new Object[1];
-					selectedStructures[0] = region;
-				} else {
-					// multiple selection
-					int maxLength = model.getStructuredDocument().getLength();
-					List structures = new ArrayList(2);
-					while (region != null && region.getEndOffset() <= end
-							&& region.getEndOffset() < maxLength) {
-						structures.add(region);
-						region = model
-								.getIndexedRegion(region.getEndOffset() + 1);
-					}
-					selectedStructures = structures.toArray();
-				}
-			}
-		}
-		if (selectedStructures == null) {
-			selectedStructures = new Object[0];
-		}
-		return selectedStructures;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/PageDesignerActionConstants.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/PageDesignerActionConstants.java
deleted file mode 100644
index cbe7381..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/PageDesignerActionConstants.java
+++ /dev/null
@@ -1,142 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors;
-
-import org.eclipse.gef.ui.actions.GEFActionConstants;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.ui.IWorkbenchActionConstants;
-
-/**
- * Common constants used to id specific locations in the canvas context menu.
- * 
- * @see SimpleGraphicalEditor.ContextMenuListener for construction order
- * 
- * @author mengbo
- */
-public class PageDesignerActionConstants 
-{
-    /**
-     * Id for the standard Edit sub-menu
-     */
-    public static final String EDIT_SUBMENU_ID = "org.eclipse.jst.pagedesigner.context.submenu.edit"; //$NON-NLS-1$
-    /**
-     * Id for the standard Select sub-menu
-     */
-    public static final String SELECT_SUBMENU_ID = "org.eclipse.jst.pagedesigner.context.submenu.select"; //$NON-NLS-1$
-    /**
-     * Id for the standard Insert sub-menu
-     */
-    public static final String INSERT_SUBMENU_ID = "org.eclipse.jst.pagedesigner.context.submenu.insert"; //$NON-NLS-1$
-    /**
-     * Id for the standard Navigate sub-menu
-     */
-    public static final String NAVIGATE_SUBMENU_ID = "org.eclipse.jst.pagedesigner.context.submenu.navigate"; //$NON-NLS-1$
-    /**
-     * Id for the standard Style sub-menu
-     */
-    public static final String STYLE_SUBMENU_ID = "org.eclipse.jst.pagedesigner.context.submenu.style"; //$NON-NLS-1$
-    /**
-     * Id for the standard Show(View) sub-menu
-     */
-    public static final String SHOWVIEW_SUBMENU_ID = "org.eclipse.jst.pagedesigner.viewMenuMgr"; //$NON-NLS-1$
-    
-	/**
-	 * Undo action group
-	 */
-	public static final String GROUP_UNDO = GEFActionConstants.GROUP_UNDO;
-	/**
-	 * Standard Edit sub-menu action group
-	 */
-	public static final String GROUP_EDIT = GEFActionConstants.GROUP_EDIT;
-	/**
-	 * Group for container injected actions
-	 */
-	public static final String GROUP_CONTAINER = "org.eclipse.jst.pagedesigner.container"; //$NON-NLS-1$
-	/**
-	 * Standard Style sub-menu action group
-	 */
-	public static final String GROUP_STYLE = "org.eclipse.jst.pagedesigner.style"; //$NON-NLS-1$
-	/**
-	 * Group for third-party contributed tag-specific actions
-	 */
-	public static final String GROUP_SPECIAL = "org.eclipse.jst.pagedesigner.special"; //$NON-NLS-1$
-    /**
-     * Standard Select sub-menu action group
-     */
-    public static final String GROUP_SELECT = "org.eclipse.jst.pagedesigner.select"; //$NON-NLS-1$
-    /**
-     * Standard Insert sub-menu action group
-     */
-    public static final String GROUP_INSERT = "org.eclipse.jst.pagedesigner.insert"; //$NON-NLS-1$
-    /**
-     * Standard Navigate sub-menu action group
-     */
-    public static final String GROUP_NAVIGATE = "org.eclipse.jst.pagedesigner.navigate"; //$NON-NLS-1$
-
-
-    /**
-     * Add standard group separators for the Edit sub-menu
-     * 
-     * @param menu
-     */
-    public static final void addStandardEditActionGroups(IMenuManager menu)
-    {
-        menu.add(new Separator(GROUP_UNDO));
-        menu.add(new Separator(GROUP_EDIT));
-    }
-   
-	/**
-	 * Adds standard group separators to the given MenuManager.
-	 * 
-	 * @param menu the MenuManager
-	 */
-	public static final void addStandardActionGroups(IMenuManager menu) {
-		menu.add(new Separator(GROUP_CONTAINER));
-		menu.add(new Separator(GROUP_SPECIAL));
-		menu.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
-	}
-
-    /**
-     * Add standard group separators for the Style sub-menu
-     * @param menu
-     */
-    public static void addStandardStyleActionGroups(IMenuManager menu) 
-    {
-        menu.add(new Separator(GROUP_STYLE));
-    }
-
-    /**
-     * Add standard group separators for the Select sub-menu
-     * @param menu
-     */
-    public static void addStandardSelectActionGroups(IMenuManager menu) {
-        menu.add(new Separator(GROUP_SELECT));
-    }
-
-    /**
-     * Add standard group separators for the Insert sub-menu
-     * @param menu
-     */
-    public static void addStandardInsertActionGroups(IMenuManager menu) {
-        menu.add(new Separator(GROUP_INSERT));
-    }
-
-    /**
-     * Add standard group separators for the Navigate sub-menu
-     * @param menu
-     */
-    public static void addStandardNavigateActionGroups(
-            IMenuManager menu) {
-        menu.add(new Separator(GROUP_NAVIGATE));
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/SelectionSynchronizer.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/SelectionSynchronizer.java
deleted file mode 100644
index 33025aa..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/SelectionSynchronizer.java
+++ /dev/null
@@ -1,168 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors;
-
-import org.eclipse.jface.text.ITextSelection;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jst.pagedesigner.utils.SelectionHelper;
-import org.eclipse.swt.custom.StyledText;
-
-/**
- * This class handles selection synchronization between the designer and other
- * parts. It listens event from both ViewerSelectionManager and the
- * IDesignerView, and convert the events to each other.
- * <p>
- * SelectionSynchronizer will be registered on the ViewerSelectionManager,
- * basically listens to selection change of other parts, and make the designer
- * sync with them.
- * <p>
- * As ViewerSelectionManager is firing out both textSelectionChange and
- * nodeSelectionChange, we only need to listen to one of them. As
- * textSelectionChange provide more information than nodeSelectionChange, so
- * we'll listen only to textSelectionChange.
- * 
- * @author mengbo
- * @version 1.5
- */
-public class SelectionSynchronizer implements ISelectionChangedListener {
-	private boolean _firingChange = false;
-
-	private SimpleGraphicalEditor _editor;
-
-	/**
-	 * @param editor
-	 */
-	public SelectionSynchronizer(SimpleGraphicalEditor editor) {
-		_editor = editor;
-	}
-
-	/**
-	 * @return true if the status check is okay
-	 */
-	protected boolean statusCheckOk() {
-		try {
-			StyledText text = _editor.getHTMLEditor().getTextEditor()
-					.getTextViewer().getTextWidget();
-			if (text == null || text.isDisposed()) {
-				return false;
-			}
-			return true;
-		} catch (NullPointerException ex) {
-			return false;
-		}
-	}
-
-	/**
-	 * This is for event from the designer.
-	 */
-	public void selectionChanged(SelectionChangedEvent event) {
-		ISelection selection = event.getSelection();
-
-		if (!_firingChange) {
-			// check current status
-			if (!statusCheckOk()) {
-				return;
-			}
-
-			_firingChange = true;
-			try {
-				// convert the designer selection into SSE selection
-				// (IStructureSelection of nodes
-				// or textSelection, and let the ViewerSelectionManager to
-				// handle it.
-				// if (selection instanceof IStructuredSelection)
-				// {
-				// IStructuredSelection nodeSel =
-				// SelectionHelper.convertFromDesignSelection((IStructuredSelection)selection);
-				// can't use DoubleClickEvent, since it requre a Viewer.
-				// _viewerSelectionManager.doubleClick(new
-				// DoubleClickEvent(null, nodeSel));
-				// }
-				// else if (selection instanceof DesignRange)
-				// {
-				// ITextSelection srcselection =
-				// SelectionHelper.convertFromDesignSelection((DesignRange)selection);
-				// event = new SelectionChangedEvent(_editor.getGraphicViewer(),
-				// srcselection);
-				// _viewerSelectionManager.selectionChanged(event);
-				// }
-				ITextSelection srcselection = SelectionHelper
-						.convertFromDesignSelectionToTextSelection(selection);
-
-				// ideally, we should let the text editor display the selection
-				// through calls to _viewerSelectionManager,
-				// but seemed _viewerSelectionManager don't support that, so we
-				// do workaround by calling the text editor (lium)
-				_editor.getHTMLEditor().getTextEditor().selectAndReveal(
-						srcselection.getOffset(), srcselection.getLength());
-			} finally {
-				_firingChange = false;
-			}
-		}
-	}
-
-	/**
-	 * We are listening to the selection change in ViewerSelectionManager. The
-	 * original source of the event could be source view or the outline view or
-	 * other party that participate in the ViewerSelectionManager.
-	 * @param start 
-	 * @param end 
-	 */
-	public void textSelectionChanged(int start, int end) {
-		if (!_firingChange) {
-			try {
-				_firingChange = true;
-
-				// XXX: workaround a SSE problem. In SSE, when user select a
-				// range, it will fire two textSelectionChange event
-				// the first one indicate the correct range, the second one is
-				// zero size for caret position.
-				// @see ViewerSelectionManagerImpl.caretMoved
-				// We try to ignore the second event by checking whether the
-				// current real selection is empty
-				if (start == end) {
-					ITextSelection sel = (ITextSelection) _editor
-							.getHTMLEditor().getTextEditor()
-							.getSelectionProvider().getSelection();
-					if (sel.getLength() != 0) {
-						return;
-					}
-				}
-
-				if (start > end) {
-					int temp = start;
-					start = end;
-					end = temp;
-				}
-				int offset = start;
-				int length = end - start;
-
-				ITextSelection oldSelection = SelectionHelper
-						.convertFromDesignSelectionToTextSelection(_editor
-								.getGraphicViewer().getSelection());
-				if (oldSelection != null && oldSelection.getOffset() == offset
-						&& oldSelection.getLength() == length) {
-					return;
-				}
-
-				ISelection selection = SelectionHelper
-						.convertToDesignerSelection(this._editor
-								.getGraphicViewer(), offset, length);
-				_editor.getGraphicViewer().setSelection(selection);
-			} finally {
-				_firingChange = false;
-			}
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/SimpleGraphicalEditor.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/SimpleGraphicalEditor.java
deleted file mode 100644
index 8d3bdec..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/SimpleGraphicalEditor.java
+++ /dev/null
@@ -1,897 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors;
-
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtension;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.gef.DefaultEditDomain;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.GraphicalViewer;
-import org.eclipse.gef.dnd.TemplateTransferDragSourceListener;
-import org.eclipse.gef.editparts.ScalableRootEditPart;
-import org.eclipse.gef.palette.PaletteRoot;
-import org.eclipse.gef.ui.actions.ActionRegistry;
-import org.eclipse.gef.ui.actions.UpdateAction;
-import org.eclipse.gef.ui.palette.FlyoutPaletteComposite.FlyoutPreferences;
-import org.eclipse.gef.ui.palette.PaletteViewer;
-import org.eclipse.gef.ui.palette.PaletteViewerProvider;
-import org.eclipse.gef.ui.parts.GraphicalEditorWithFlyoutPalette;
-import org.eclipse.gef.ui.parts.GraphicalViewerKeyHandler;
-import org.eclipse.gef.ui.views.palette.PaletteViewerPage;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IMenuListener;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jst.pagedesigner.IJMTConstants;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.actions.container.ContainerActionGroup;
-import org.eclipse.jst.pagedesigner.actions.menuextension.CustomedContextMenuActionGroup;
-import org.eclipse.jst.pagedesigner.actions.range.RangeActionGroup;
-import org.eclipse.jst.pagedesigner.actions.single.SingleElementActionGroup;
-import org.eclipse.jst.pagedesigner.commands.CopyAction;
-import org.eclipse.jst.pagedesigner.commands.CutAction;
-import org.eclipse.jst.pagedesigner.commands.DeleteAction;
-import org.eclipse.jst.pagedesigner.commands.PasteAction;
-import org.eclipse.jst.pagedesigner.dnd.internal.LocalSelectionDropTargetListener;
-import org.eclipse.jst.pagedesigner.dnd.internal.PDTemplateTransferDropTargetListener;
-import org.eclipse.jst.pagedesigner.dnd.internal.ResouceDropTargetListener;
-import org.eclipse.jst.pagedesigner.editors.actions.ActionsMessages;
-import org.eclipse.jst.pagedesigner.editors.actions.DesignerUndoRedoAction;
-import org.eclipse.jst.pagedesigner.editors.actions.RelatedViewActionGroup;
-import org.eclipse.jst.pagedesigner.editors.actions.SkinsMenuItemBuilder;
-import org.eclipse.jst.pagedesigner.editors.palette.DesignerPaletteCustomizer;
-import org.eclipse.jst.pagedesigner.editors.palette.DesignerPaletteRootFactory;
-import org.eclipse.jst.pagedesigner.editors.palette.DesignerPaletteViewerProvider;
-import org.eclipse.jst.pagedesigner.editors.palette.IPaletteFactory;
-import org.eclipse.jst.pagedesigner.jsp.core.internal.pagevar.DocumentPageVariableAdapter;
-import org.eclipse.jst.pagedesigner.jsp.core.pagevar.adapter.PageVariableAdapterFactory;
-import org.eclipse.jst.pagedesigner.parts.CSSStyleAdapterFactory;
-import org.eclipse.jst.pagedesigner.parts.DocumentEditPart;
-import org.eclipse.jst.pagedesigner.parts.HTMLEditPartsFactory;
-import org.eclipse.jst.pagedesigner.parts.RefresherFactory;
-import org.eclipse.jst.pagedesigner.utils.SelectionHelper;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.eclipse.swt.events.MouseAdapter;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IFileEditorInput;
-import org.eclipse.ui.IPageLayout;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.IWorkbenchCommandConstants;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.actions.ActionContext;
-import org.eclipse.wst.sse.core.internal.PropagatingAdapter;
-import org.eclipse.wst.sse.core.internal.provisional.IModelStateListener;
-import org.eclipse.wst.sse.core.internal.provisional.INodeAdapterFactory;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.eclipse.wst.sse.core.internal.undo.IDocumentSelectionMediator;
-import org.eclipse.wst.sse.core.internal.undo.UndoDocumentEvent;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-
-/**
- * @author mengbo
- */
-public class SimpleGraphicalEditor extends GraphicalEditorWithFlyoutPalette implements
-		IDesignViewer, IDocumentSelectionMediator {
-
-	private HTMLEditor _delegate;
-
-	private IHTMLGraphicalViewer _viewer;
-
-	private IStructuredModel _model;
-
-	/** Palette component, holding the tools and shapes. */
-	private PaletteRoot _palette;
-	
-	private PaletteViewerPage _paletteViewerPage;
-
-	private SelectionSynchronizer _synchronizer = new SelectionSynchronizer(
-			this);
-
-	private IModelStateListener _internalModelListener = new IModelStateListener() {
-		public void modelAboutToBeChanged(IStructuredModel model) {
-            // do nothing
-		}
-
-		public void modelChanged(IStructuredModel model) {
-			updateActionsWhenModelChange();
-		}
-
-		public void modelDirtyStateChanged(IStructuredModel model,
-				boolean isDirty) {
-            // do nothing
-		}
-
-		public void modelResourceDeleted(IStructuredModel model) {
-            // do nothing
-		}
-
-		public void modelResourceMoved(IStructuredModel oldModel,
-				IStructuredModel newModel) {
-            // do nothing
-		}
-
-		public void modelAboutToBeReinitialized(IStructuredModel structuredModel) {
-            // do nothing
-		}
-
-		public void modelReinitialized(IStructuredModel structuredModel) {
-            // do nothing
-		}
-	};
-
-	private PaletteViewerProvider _paletteViewerProvider;
-
-	/**
-	 * TODO: why isn't this private?
-	 */
-	protected IPaletteFactory _paletteViewerPageFactory;
-
-	/**
-	 * @param delegate
-	 * @param editdomain
-	 */
-	public SimpleGraphicalEditor(HTMLEditor delegate,
-			DefaultEditDomain editdomain) {
-		_delegate = delegate;
-		initPaletteFactory();
-		this.setEditDomain(editdomain);		
-	}
-
-	protected void createGraphicalViewer(Composite parent) {
-		_viewer = IHTMLGraphicalViewer.Factory.createGraphicalViewer(this);
-		Control control = _viewer.createControl(parent);
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(control,
-				PDPlugin.getResourceString("SimpleGraphicalEditor.help.id")); //$NON-NLS-1$
-		setGraphicalViewer(_viewer);
-		configureGraphicalViewer();
-		hookGraphicalViewer();
-		initializeGraphicalViewer();
-		initializeContextMenu();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.ui.parts.GraphicalEditor#dispose()
-	 */
-	public void dispose() {
-		if (_model != null) {
-			_model.getUndoManager().disconnect(this);
-		}
-
-		super.dispose();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.ui.parts.GraphicalEditor#initializeGraphicalViewer()
-	 */
-	protected void initializeGraphicalViewer() {
-		ScalableRootEditPart rootEditPart = new ScalableRootEditPart();
-		_viewer.setRootEditPart(rootEditPart);
-
-		_viewer.getViewport().setContentsTracksWidth(true);
-
-		_viewer.setKeyHandler(new GraphicalViewerKeyHandler(_viewer));
-
-		// initialize the viewer with input
-		// IStructuredModel sModel =
-		// StructuredModelManager.getModelManager().createUnManagedStructuredModelFor(ContentTypeIdForHTML.ContentTypeID_HTML);
-		// IDOMDocument designDoc = ((IDOMModel)sModel).getDocument();
-		// HTMLEditPartsFactory factory = new HTMLEditPartsFactory(designDoc);
-		HTMLEditPartsFactory factory = new HTMLEditPartsFactory(null);
-
-		_viewer.setEditPartFactory(factory);
-
-		// for sync with source view.
-
-		_viewer.addDropTargetListener(new LocalSelectionDropTargetListener(
-				_viewer));
-		_viewer.addDropTargetListener(new PDTemplateTransferDropTargetListener(
-				_viewer));
-		_viewer.addDropTargetListener(new ResouceDropTargetListener(_viewer));
-		
-		// add double click support.
-		_viewer.getControl().addMouseListener(new MouseAdapter() {
-			public void mouseDoubleClick(MouseEvent e) {
-				try {
-					getSite().getPage().showView(IPageLayout.ID_PROP_SHEET);
-				} catch (PartInitException e1) {
-					// ignore
-				}
-			}
-		});
-        
-        super.initializeGraphicalViewer();
-	}
-
-	/**
-	 * 
-	 */
-	protected void initializeContextMenu() {
-		Control gviewer = _viewer.getControl();
-		MenuManager menuMgr = new MenuManager();
-		menuMgr.setRemoveAllWhenShown(true);
-		Menu menu = menuMgr.createContextMenu(gviewer);
-		gviewer.setMenu(menu);
-		menuMgr.addMenuListener(new ContextMenuListener());
-		getSite().registerContextMenu(
-				"HTMLVisualEditor.contextMenu", menuMgr, _viewer); //$NON-NLS-1$
-	}
-
-	private void updateActionsWhenModelChange() {
-		// update undo/redo action
-		IAction action = this.getAction(IWorkbenchCommandConstants.EDIT_UNDO);
-		((UpdateAction) action).update();
-
-		action = this.getAction(IWorkbenchCommandConstants.EDIT_REDO);
-		((UpdateAction) action).update();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.ui.parts.GraphicalEditor#createActions()
-	 */
-	protected void createActions() {
-		super.createActions();
-		ActionRegistry registry = getActionRegistry();
-		ISharedImages sharedImages = PlatformUI.getWorkbench()
-				.getSharedImages();
-
-		IAction action;
-
-		action = new DesignerUndoRedoAction(true, this);
-		action.setImageDescriptor(sharedImages
-				.getImageDescriptor(ISharedImages.IMG_TOOL_UNDO));
-		action.setDisabledImageDescriptor(sharedImages
-				.getImageDescriptor(ISharedImages.IMG_TOOL_UNDO_DISABLED));
-		action.setActionDefinitionId(IWorkbenchCommandConstants.EDIT_UNDO);
-		action.setId(IWorkbenchCommandConstants.EDIT_UNDO);
-		getSite().getKeyBindingService().registerAction(action);
-		registry.registerAction(action);
-
-		action = new DesignerUndoRedoAction(false, this);
-		action.setImageDescriptor(sharedImages
-				.getImageDescriptor(ISharedImages.IMG_TOOL_REDO));
-		action.setDisabledImageDescriptor(sharedImages
-				.getImageDescriptor(ISharedImages.IMG_TOOL_REDO_DISABLED));
-		action.setActionDefinitionId(IWorkbenchCommandConstants.EDIT_REDO);
-		action.setId(IWorkbenchCommandConstants.EDIT_REDO);
-		getSite().getKeyBindingService().registerAction(action);
-		registry.registerAction(action);
-
-		action = new DeleteAction(this);
-		action.setImageDescriptor(sharedImages
-				.getImageDescriptor(ISharedImages.IMG_TOOL_DELETE));
-		action.setDisabledImageDescriptor(sharedImages
-				.getImageDescriptor(ISharedImages.IMG_TOOL_DELETE_DISABLED));
-		action.setActionDefinitionId(IWorkbenchCommandConstants.EDIT_DELETE);
-		action.setId(IWorkbenchCommandConstants.EDIT_DELETE);
-		getSite().getKeyBindingService().registerAction(action);
-		this.getSelectionActions().add(action.getId());
-		registry.registerAction(action);
-
-		action = new CopyAction(this);
-		action.setImageDescriptor(sharedImages
-				.getImageDescriptor(ISharedImages.IMG_TOOL_COPY));
-		action.setDisabledImageDescriptor(sharedImages
-				.getImageDescriptor(ISharedImages.IMG_TOOL_COPY_DISABLED));
-		action.setActionDefinitionId(IWorkbenchCommandConstants.EDIT_COPY);
-		action.setId(IWorkbenchCommandConstants.EDIT_COPY);
-		getSite().getKeyBindingService().registerAction(action);
-		this.getSelectionActions().add(action.getId());
-		registry.registerAction(action);
-
-		action = new CutAction(this);
-		action.setImageDescriptor(sharedImages
-				.getImageDescriptor(ISharedImages.IMG_TOOL_CUT));
-		action.setDisabledImageDescriptor(sharedImages
-				.getImageDescriptor(ISharedImages.IMG_TOOL_CUT_DISABLED));
-		action.setActionDefinitionId(IWorkbenchCommandConstants.EDIT_CUT);
-		action.setId(IWorkbenchCommandConstants.EDIT_CUT);
-		getSite().getKeyBindingService().registerAction(action);
-		this.getSelectionActions().add(action.getId());
-		registry.registerAction(action);
-
-		action = new PasteAction(this);
-		action.setImageDescriptor(sharedImages
-				.getImageDescriptor(ISharedImages.IMG_TOOL_PASTE));
-		action.setDisabledImageDescriptor(sharedImages
-				.getImageDescriptor(ISharedImages.IMG_TOOL_PASTE_DISABLED));
-		action.setActionDefinitionId(IWorkbenchCommandConstants.EDIT_PASTE);
-		action.setId(IWorkbenchCommandConstants.EDIT_PASTE);
-		getSite().getKeyBindingService().registerAction(action);
-		this.getSelectionActions().add(action.getId());
-		registry.registerAction(action);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.ISaveablePart#doSave(org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public void doSave(IProgressMonitor monitor) {
-		if (_delegate != null) {
-			_delegate.doSave(monitor);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.ISaveablePart#doSaveAs()
-	 */
-	public void doSaveAs() {
-		if (_delegate != null) {
-			_delegate.doSaveAs();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.ISaveablePart#isDirty()
-	 */
-	public boolean isDirty() {
-		if (_delegate != null) {
-			return _delegate.isDirty();
-		}
-        return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.ISaveablePart#isSaveAsAllowed()
-	 */
-	public boolean isSaveAsAllowed() {
-		if (_delegate != null) {
-			return _delegate.isSaveAsAllowed();
-		}
-        return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.html.editor.IDesignViewer#setModel(com.ibm.sse.model.IStructuredModel)
-	 */
-	public void setModel(IStructuredModel model) {
-		if (_model != null) {
-			if (_model.getUndoManager() != null)
-				_model.getUndoManager().disconnect(this);
-			_model.removeModelStateListener(_internalModelListener);
-		}
-
-		this._model = model;
-
-		if (_model != null) {
-			_model.addModelStateListener(_internalModelListener);
-			if (_model.getUndoManager() != null) {
-				_model.getUndoManager().connect(this);
-				updateActionsWhenModelChange();
-			}
-		}
-
-		if (model instanceof IDOMModel) {
-			IDOMDocument doc = ((IDOMModel) model).getDocument();
-			PropagatingAdapter adapter = (PropagatingAdapter) doc
-					.getAdapterFor(PropagatingAdapter.class);
-			if (adapter != null) {
-				INodeAdapterFactory factory = RefresherFactory.getInstance();
-				adapter.addAdaptOnCreateFactory(factory);
-				adapter.initializeForFactory(factory, doc);
-				// CSSStyleAdapterFactory fac2 =
-				// CSSStyleAdapterFactory.getInstance();
-				// adapter.addAdaptOnCreateFactory(fac2);
-				// adapter.initializeForFactory(fac2, doc);
-			}
-			((IDOMModel) model).getFactoryRegistry().addFactory(
-					CSSStyleAdapterFactory.getInstance());
-
-			// _viewer.getDestDocumentForDesign().getModel().getFactoryRegistry().addFactory(CSSStyleAdapterFactory.getInstance());
-			((IDOMModel) model).getFactoryRegistry().addFactory(
-					new PageVariableAdapterFactory());
-			doc.addAdapter(new DocumentPageVariableAdapter(doc));
-			_viewer.setContents(((IDOMModel) model).getDocument());
-		} else {
-			_viewer.setContents((EditPart) null);
-		}
-	}
-
-	/**
-	 * @return the selection synchronizer
-	 */
-	protected SelectionSynchronizer getSynchronizer() {
-		return _synchronizer;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.ui.parts.GraphicalEditor#updateActions(java.util.List)
-	 */
-	protected void updateActions(List actionIds) {
-		super.updateActions(actionIds);
-	}
-
-	/**
-	 * @param id
-	 * @return the action for the id
-	 */
-	public IAction getAction(Object id) {
-		// lium: following lines commented out, see comments in
-		// DesignerUndoRedoAction
-		// if (ITextEditorActionConstants.UNDO.equals(id) ||
-		// ITextEditorActionConstants.REDO.equals(id))
-		// {
-		// return _delegate.getTextEditor().getAction((String) id);
-		// }
-		return getActionRegistry().getAction(id);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.ui.parts.GraphicalEditorWithFlyoutPalette#getPalettePreferences()
-	 */
-	protected FlyoutPreferences getPalettePreferences() {
-		return DesignerPaletteRootFactory.createPalettePreferences();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.ui.parts.GraphicalEditorWithFlyoutPalette#getPaletteRoot()
-	 */
-	protected PaletteRoot getPaletteRoot() {
-		if (_palette == null) {
-			if (_paletteViewerPageFactory != null) {
-	            _palette = _paletteViewerPageFactory.createPaletteRoot(_delegate.getEditorInput());
-	        } 
-            if (_palette == null) {
-            	_palette = DesignerPaletteRootFactory
-            		.createPaletteRoot(getCurrentFile(_delegate.getEditorInput()));
-            }
-		}
-		return _palette;
-
-	}
-
-    /*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.ui.parts.GraphicalEditorWithFlyoutPalette#createPaletteViewerProvider()
-	 */
-    protected PaletteViewerProvider createPaletteViewerProvider() {
-    	if (_paletteViewerProvider == null) {
-    		if (_paletteViewerPageFactory != null) {
-    			_paletteViewerProvider = _paletteViewerPageFactory.createPaletteViewerProvider(getEditDomain());
-    		}
-    		if (_paletteViewerProvider == null) {//if still null
-    			return new DesignerPaletteViewerProvider(getEditDomain()) {
-    				protected void configurePaletteViewer(PaletteViewer viewer) {
-    					super.configurePaletteViewer(viewer);
-    					viewer.setCustomizer(new DesignerPaletteCustomizer());
-
-    					// create a drag source listener for this palette viewer
-    					// together with an appropriate transfer drop target listener,
-    					// this will enable
-    					// model element creation by dragging a
-    					// CombinatedTemplateCreationEntries
-    					// from the palette into the editor
-    					// @see ShapesEditor#createTransferDropTargetListener()
-    					viewer
-    							.addDragSourceListener(new TemplateTransferDragSourceListener(
-    									viewer));
-    				}
-    			};
-    		}
-    	}
-    	return _paletteViewerProvider;
-    }
-
-    /**
-     * @return the palette viewer page
-     */
-    protected PaletteViewerPage createPaletteViewerPage() {
-        if (_paletteViewerPageFactory != null) {
-        	_paletteViewerPage = _paletteViewerPageFactory.createPaletteViewerPage(createPaletteViewerProvider());
-        } 
-        if (_paletteViewerPage == null) {
-            DefaultEditDomain editDomain = getEditDomain();
-//            PaletteItemManager manager = PaletteItemManager
-//                    .getInstance(getCurrentFile(getEditorInput()));
-//            manager.reset();
-            PaletteRoot paletteRoot = getPaletteRoot();
-            editDomain.setPaletteRoot(paletteRoot);
-            
-//            _paletteViewerPage = (PaletteViewerPage) super.getAdapter(PalettePage.class);
-            // if possible, try to use the 
-            if (_paletteViewerPage == null)
-            {
-                PaletteViewerProvider provider = getPaletteViewerProvider2();
-                _paletteViewerPage = new PaletteViewerPage(provider);
-            }
-        }
-    	return _paletteViewerPage;
-    }
-    
-    PaletteViewerProvider getPaletteViewerProvider2()
-    {
-        return getPaletteViewerProvider();
-    }
-    
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.editors.IDesignViewer#getGraphicViewer()
-	 */
-	public IHTMLGraphicalViewer getGraphicViewer() {
-		return _viewer;
-	}
-
-	/**
-	 * @return the html editor delegate
-	 */
-	public HTMLEditor getHTMLEditor() {
-		return _delegate;
-	}
-
-//	private IProject getCurrentProject(IEditorInput input) {
-//		IProject curProject = null;
-//		IFile inputFile = null;
-//		if (input instanceof IFileEditorInput) {
-//			inputFile = ((IFileEditorInput) input).getFile();
-//			curProject = inputFile.getProject();
-//		}
-//		return curProject;
-//	}
-
-	private IFile getCurrentFile(IEditorInput input) {
-		IFile inputFile = null;
-		if (input instanceof IFileEditorInput) {
-			inputFile = ((IFileEditorInput) input).getFile();
-		}
-		return inputFile;
-	}
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.ISelectionListener#selectionChanged(org.eclipse.ui.IWorkbenchPart,
-	 *      org.eclipse.jface.viewers.ISelection)
-	 */
-	public void selectionChanged(IWorkbenchPart part, ISelection selection) {
-		if (_viewer != null) {
-			GraphicalViewer viewerViewer = getGraphicalViewer();
-			if (viewerViewer != null && viewerViewer.getControl() != null
-					&& viewerViewer.getControl().isFocusControl()) {
-				updateActions(getSelectionActions());
-				if (selection instanceof IStructuredSelection && //
-						!(((IStructuredSelection) selection).getFirstElement() instanceof DocumentEditPart)) {
-					((IHTMLGraphicalViewer) viewerViewer)
-							.updateRangeSelection(selection);
-				}
-			}
-		} else {
-			super.selectionChanged(part, selection);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.sse.core.internal.undo.IDocumentSelectionMediator#getDocument()
-	 */
-	public IDocument getDocument() {
-		if (_model != null) {
-			return _model.getStructuredDocument();
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.sse.core.internal.undo.IDocumentSelectionMediator#undoOperationSelectionChanged(org.eclipse.wst.sse.core.internal.undo.UndoDocumentEvent)
-	 */
-	public void undoOperationSelectionChanged(UndoDocumentEvent event) {
-		IDocumentSelectionMediator requester = event.getRequester();
-		if (this == requester) {
-			// ok, the undo/redo operation is initialized by designer page.
-			// we should set selection in designer.
-			// However, when this method is called, the modelChanged event is
-			// not fired yet, so the
-			// editpart hasn't refreshed yet. So we register a
-			// modelStateListener, and do the selection
-			// in modelChangedEvent. (lium)
-			final int offset = event.getOffset();
-			final int length = event.getLength();
-
-			_model.addModelStateListener(new IModelStateListener() {
-				public void modelAboutToBeChanged(IStructuredModel model) {
-                    // nothing to do
-				}
-
-				public void modelChanged(IStructuredModel model) {
-					_model.removeModelStateListener(this);
-					ISelection sel = SelectionHelper
-							.convertToDesignerSelection(getGraphicViewer(),
-									offset, length);
-					if (sel != null) {
-						getGraphicViewer().setSelection(sel);
-					}
-				}
-
-				public void modelDirtyStateChanged(IStructuredModel model,
-						boolean isDirty) {
-                    // do  nothing
-				}
-
-				public void modelResourceDeleted(IStructuredModel model) {
-                    // do nothign
-				}
-
-				public void modelResourceMoved(IStructuredModel oldModel,
-						IStructuredModel newModel) {
-                    // do nothing
-				}
-
-				public void modelAboutToBeReinitialized(
-						IStructuredModel structuredModel) {
-                    // do nothing
-				}
-
-				public void modelReinitialized(IStructuredModel structuredModel) {
-                    // do nothing
-				}
-			});
-		}
-	}
- 
-    private final class ContextMenuListener implements IMenuListener 
-    {
-        public void menuAboutToShow(IMenuManager menuMgr1) 
-        {
-            // add standarized sub-menus
-            addEditSubMenu(menuMgr1);
-            addSelectSubMenu(menuMgr1);
-            addInsertSubMenu(menuMgr1);
-            /*
-             * Bug 172959 - [WPE] WPE context menu Navigate->Java->Value doesn't work..
-             * 
-            addNavigateSubMenu(menuMgr1);
-            */
-            addStyleSubMenu(menuMgr1);
-            
-            // add separators that mark standard append locations in the main
-            // context menu
-            PageDesignerActionConstants.addStandardActionGroups(menuMgr1);
-
-            // TODO: Run/Debug?
-            
-            // insert ElementEdit contributed menu items
-            final ContainerActionGroup containerActionGroup = 
-                new ContainerActionGroup();
-            ActionContext context = new ActionContext(_viewer
-                    .getSelection());
-            context.setInput(_viewer);
-            containerActionGroup.setContext(context);
-            containerActionGroup.fillContextMenu(menuMgr1);
-            containerActionGroup.setContext(null);
-
-            // TODO: TableActionGroup
-
-            // if on a text context, (instead of a ElementEditPart),
-            // add text styling actions
-            final RangeActionGroup rangeActionGroup = new RangeActionGroup();
-            context = new ActionContext(_viewer.getSelection());
-            context.setInput(_viewer);
-            rangeActionGroup.setContext(context);
-            rangeActionGroup.fillContextMenu(menuMgr1);
-            rangeActionGroup.setContext(null);
-
-            // Add actions for single ElementEditPart's that are common
-            // to all
-            final SingleElementActionGroup singleActionGroup = 
-                new SingleElementActionGroup();
-            singleActionGroup.setContext(new ActionContext(_viewer
-                    .getSelection()));
-            singleActionGroup.fillContextMenu(menuMgr1);
-            singleActionGroup.setContext(null);
-
-            // add "Show In" actions...
-            final RelatedViewActionGroup viewMenu = new RelatedViewActionGroup(getEditDomain());
-            context = new ActionContext(_viewer.getSelection());
-            viewMenu.setContext(context);
-            viewMenu.fillContextMenu(menuMgr1);
-
-            // add extension point contributed menu actions
-            CustomedContextMenuActionGroup customedMenu = new CustomedContextMenuActionGroup();
-            customedMenu.setContext(new ActionContext(_viewer
-                    .getSelection()));
-            customedMenu.setModel(_model);
-            customedMenu.setParentControl(_viewer.getControl());
-            customedMenu.fillContextMenu(menuMgr1);
-            customedMenu.setContext(null);
-            customedMenu.setParentControl(null);
-            customedMenu.setModel(null);
-
-            //add skins menu
-            IEditorInput editorInput = _delegate.getEditorInput();
-			if (editorInput instanceof IFileEditorInput) {
-				IFile file = ((IFileEditorInput)editorInput).getFile();
-				IProject project = file.getProject();
-				if (project != null) {
-					SkinsMenuItemBuilder builder = new SkinsMenuItemBuilder(project);
-					builder.buildMenuManagers(menuMgr1);
-        }
-			}
-        }
-
-        /*
-         * Bug 172959 - [WPE] WPE context menu Navigate->Java->Value doesn't work..
-         * 
-        private void addNavigateSubMenu(IMenuManager menu) {
-            final IMenuManager  navigateSubmenu = 
-                new MenuManager(ActionsMessages.getString("Navigate.Menu")  //$NON-NLS-1$
-                        , PageDesignerActionConstants.NAVIGATE_SUBMENU_ID);
-            menu.add(navigateSubmenu);
-            PageDesignerActionConstants.addStandardNavigateActionGroups(navigateSubmenu);
-        }
-         */
-
-        private void addEditSubMenu(IMenuManager menu)
-        {
-            final IMenuManager  editSubmenu 
-                = new MenuManager(ActionsMessages.getString("Edit.Menu")  //$NON-NLS-1$
-                        , PageDesignerActionConstants.EDIT_SUBMENU_ID);
-            menu.add(editSubmenu);
-            PageDesignerActionConstants.addStandardEditActionGroups(editSubmenu);
-            
-            // FIXME: for UNDO/REDO, maybe need also wrap them in
-            // DesignerCommand.
-            // otherwise don't have validate() called after the source
-            // change.
-            editSubmenu.appendToGroup(PageDesignerActionConstants.GROUP_UNDO,
-                    getAction(IWorkbenchCommandConstants.EDIT_UNDO));
-            editSubmenu.appendToGroup(PageDesignerActionConstants.GROUP_UNDO,
-                    getAction(IWorkbenchCommandConstants.EDIT_REDO));
-
-            editSubmenu.appendToGroup(PageDesignerActionConstants.GROUP_EDIT,
-                    getAction(IWorkbenchCommandConstants.EDIT_CUT));
-            editSubmenu.appendToGroup(PageDesignerActionConstants.GROUP_EDIT,
-                    getAction(IWorkbenchCommandConstants.EDIT_COPY));
-            editSubmenu.appendToGroup(PageDesignerActionConstants.GROUP_EDIT,
-                    getAction(IWorkbenchCommandConstants.EDIT_PASTE));
-            editSubmenu.appendToGroup(PageDesignerActionConstants.GROUP_EDIT,
-                    getAction(IWorkbenchCommandConstants.EDIT_DELETE));
-
-        }
-        
-        private void addStyleSubMenu(IMenuManager menu)
-        {
-            final IMenuManager  styleSubmenu = 
-                new MenuManager(ActionsMessages.getString("Style.Menu")  //$NON-NLS-1$
-                        , PageDesignerActionConstants.STYLE_SUBMENU_ID);
-            menu.add(styleSubmenu);
-            PageDesignerActionConstants.addStandardStyleActionGroups(styleSubmenu);
-        }
-        private void addInsertSubMenu(IMenuManager menu) {
-            final IMenuManager  insertSubmenu = 
-                new MenuManager(ActionsMessages.getString("Insert.Menu")  //$NON-NLS-1$
-                        , PageDesignerActionConstants.INSERT_SUBMENU_ID);
-            menu.add(insertSubmenu);
-            PageDesignerActionConstants.addStandardInsertActionGroups(insertSubmenu);
-        }
-        
-        private void addSelectSubMenu(IMenuManager menu)
-        {
-            final IMenuManager  selectSubMenu = 
-                new MenuManager(ActionsMessages.getString("Select.Menu")  //$NON-NLS-1$
-                        , PageDesignerActionConstants.SELECT_SUBMENU_ID);
-            menu.add(selectSubMenu);
-            PageDesignerActionConstants.addStandardSelectActionGroups(selectSubMenu);
-        }
-    }
-
-    
-    /**
-     * @return the palette viewer page
-     */
-    public PaletteViewerPage getPaletteViewerPage() {
-        if (_paletteViewerPage == null) {
-        	_paletteViewerPage = createPaletteViewerPage();
-		}
-		return _paletteViewerPage;
-	}
-
-    /**
-     * @return the palette factory
-     */
-    protected IPaletteFactory initPaletteFactory()
-    {   	
-    	if (_paletteViewerPageFactory == null) {
-	        //List<IElementEditFactory> result = new ArrayList<IElementEditFactory>();
-	        IExtensionPoint extensionPoint = Platform.getExtensionRegistry()
-	                .getExtensionPoint(PDPlugin.getPluginId(),
-	                        IJMTConstants.EXTENSION_POINT_PAGEDESIGNER);
-	        IExtension[] extensions = extensionPoint.getExtensions();
-	
-	        for (int i = 0; i < extensions.length; i++)
-	        {
-	            IExtension ext = extensions[i];
-	            IConfigurationElement[] elementEditElement = ext
-	                    .getConfigurationElements();
-	
-	            for (int j = 0; j < elementEditElement.length; j++)
-	            {
-	                final IConfigurationElement element = elementEditElement[j];
-	                if (element.getName().equals(
-	                        IJMTConstants.PALETTE_FACTORY))
-	                {
-	                    elementEditElement[j].getAttribute("class"); //$NON-NLS-1$
-	                    Object obj;
-	                    try
-	                    {
-	                        obj = elementEditElement[j]
-	                                .createExecutableExtension("class"); //$NON-NLS-1$
-	
-	                        // TODO: we need a policy based solution here,
-	                        // but this will do for now
-	                        if (obj instanceof IPaletteFactory)
-	                        {
-	                        	_paletteViewerPageFactory = (IPaletteFactory) obj;
-	                        }
-	                    } 
-	                    catch (CoreException e)
-	                    {
-	                        PDPlugin.log("Problem loading element edit extension for "+element.toString(), e); //$NON-NLS-1$
-	                    }
-	                }
-	            }
-	        }
-    	}
-        return _paletteViewerPageFactory;
-    }
-//    
-//    @Override
-//	public Object getAdapter(Class type) {
-//    	if (type == PalettePage.class) {
-//    		return getPaletteViewerPage();
-//    	}
-//		return super.getAdapter(type);
-//	}
-
-
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/ActionsMessages.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/ActionsMessages.java
deleted file mode 100644
index b5da948..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/ActionsMessages.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.actions;
-
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ActionsMessages {
-	private static final String BUNDLE_NAME = "org.eclipse.jst.pagedesigner.editors.actions.ActionsMessages"; //$NON-NLS-1$
-
-	private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle
-			.getBundle(BUNDLE_NAME);
-
-	private ActionsMessages() {
-        // no external instantiation
-	}
-
-	/**
-	 * @param key
-	 * @return the resource for the key
-	 */
-	public static String getString(String key) {
-		try {
-			return RESOURCE_BUNDLE.getString(key);
-		} catch (MissingResourceException e) {
-			return '!' + key + '!';
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/ActionsMessages.properties b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/ActionsMessages.properties
deleted file mode 100644
index d57d3c1..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/ActionsMessages.properties
+++ /dev/null
@@ -1,44 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-DesignActionBarFactory.Underline=Underline
-DesignActionBarFactory.Italic=Italic
-DesignActionBarFactory.Bold=Bold
-DesignActionBarFactory.Small=Small
-DesignActionBarFactory.Big=Big
-DesignActionBarFactory.Paragraph=Paragraph
-DesignActionBarFactory.Underline.Text=Underline
-DesignActionBarFactory.Italic.Text=Italic
-DesignActionBarFactory.Bold.Text=Bold
-DesignActionBarFactory.Small.Text=Small
-DesignActionBarFactory.Big.Text=Big
-PaletteViewAction.Menu.PaletteView=Palette
-RelatedViewActionGroup.Menu.ShowView=Show
-PropertiesViewAction.Menu.Properties=Properties
-DataBindingViewAction.Menu.DataBinding=DataBinding
-OutlineViewAction.Menu.OutlineView=Outline
-DesignerStyleActionGroup.CommandLabel.V=V
-DesignerStyleActionGroup.CommandLabel.H=H
-DesignerStyleActionGroup.CommandLabel.D=D
-DesignerStyleActionGroup.CommandLabel.S=S
-DesignerStyleActionGroup.CommandLabel.V.Tooltip=Show Design Page and Source Page as Horizontal Panes
-DesignerStyleActionGroup.CommandLabel.H.Tooltip=Show Design Page and Source Page as Vertical Panes
-DesignerStyleActionGroup.CommandLabel.D.Tooltip=Only Show Design Page
-DesignerStyleActionGroup.CommandLabel.S.Tooltip=Only Show Source Page
-DesignerUndoRedoAction.UNDO=Undo
-DesignerUndoRedoAction.REDO=Redo
-DesignerUndoRedoAction.UNDO_LABEL=Undo {0}
-DesignerUndoRedoAction.REDO_LABEL=Redo {0}
-Select.Menu=Select
-Edit.Menu=Edit
-Navigate.Menu=Navigate
-Style.Menu=Style
-Insert.Menu=Insert
-ManageSkinsAction.Text=Manage Skins
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/ChangeStyleAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/ChangeStyleAction.java
deleted file mode 100644
index 70e5a68..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/ChangeStyleAction.java
+++ /dev/null
@@ -1,206 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.actions;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jst.pagedesigner.commands.DesignerCommand;
-import org.eclipse.jst.pagedesigner.commands.range.ApplyStyleCommand;
-import org.eclipse.jst.pagedesigner.range.RangeUtil;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-import org.eclipse.jst.pagedesigner.viewer.HTMLGraphicalViewerListenenerAdapter;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewerListener;
-import org.eclipse.ui.texteditor.IUpdate;
-
-/**
- * @author mengbo
- */
-public abstract class ChangeStyleAction extends Action implements IUpdate {
-	private IHTMLGraphicalViewer _viewer;
-
-	private String _expectedTag;
-
-	private IHTMLGraphicalViewerListener _listener = new HTMLGraphicalViewerListenenerAdapter() 
-	{
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewerListener#selectionChangeFinished()
-		 */
-		public void selectionChangeFinished() {
-			update();
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
-		 */
-		public void selectionChanged(SelectionChangedEvent event) {
-			update();
-		}
-	};
-
-	/**
-	 * @param text
-	 * @param name 
-	 * @param image
-	 * @param style 
-	 */
-	public ChangeStyleAction(String text, String name, ImageDescriptor image,
-			int style) {
-		super(text, style);
-		_expectedTag = name;
-		this.setImageDescriptor(image);
-	}
-
-	/**
-	 * @param viewer
-	 */
-	public void setViewer(IHTMLGraphicalViewer viewer) {
-		if (viewer == _viewer) {
-			return;
-		}
-		if (_viewer != null) {
-			_viewer.removeHTMLViewerListener(_listener);
-		}
-		_viewer = viewer;
-		if (_viewer != null) {
-			_viewer.addHTMLViewerListener(_listener);
-		}
-		update();
-	}
-
-	/**
-	 * 
-	 */
-	public void update() 
-	{
-	    boolean update = checkForUpdateAndMaybeDisableState();
-	    
-	    if (update)
-	    {
-	        updateState();
-	    }
-	}
-
-   /**
-    * Update the state 
-    */
-	protected void updateState()
-    {
-       DesignRange range = _viewer.getRangeSelection();
-       updateStatus(RangeUtil.normalize(range));
-    }
-
-	/**
-	 * Update the checked/enabled state
-	 * @return true if we should update status
-	 */
-	protected final boolean checkForUpdateAndMaybeDisableState()
-	{
-        if (_viewer == null) {
-            this.setChecked(false);
-            this.setEnabled(false);
-            return false;
-        }
-        if (!_viewer.isInRangeMode()) {
-            // XXX: later we may support in range mode.
-            this.setChecked(false);
-            this.setEnabled(false);
-            return false;
-        }
-        DesignRange range = _viewer.getRangeSelection();
-        if (range == null || !range.isValid()) {
-            this.setChecked(false);
-            this.setEnabled(false);
-            return false;
-        }
-        return true;
-	}
-	
-
-	/**
-	 * @return the viewer's current design range
-	 */
-	protected final DesignRange getDesignRange()
-	{
-	    return _viewer.getRangeSelection();
-	}
-	/**
-	 * @param range
-	 */
-	private void updateStatus(DesignRange range) {
-		if (range.isEmpty()) {
-			this.setEnabled(false);
-			this.setChecked(false); // FIXME: not handling checked status yet.
-		} else {
-			this.setEnabled(true);
-			this.setChecked(false);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.action.Action#run()
-	 */
-	public void run() {
-		if (_viewer == null || !_viewer.isInRangeMode()) {
-			return;
-		}
-		DesignRange range = _viewer.getRangeSelection();
-		if (range == null || !range.isValid()) {
-			return;
-		}
-		if (range.isEmpty())
-			return; // nothing to do to empty range.
-
-		// if currently checked, means unapply the style. If current not
-		// checked, means apply the style
-		boolean apply = !this.isChecked();
-		if (apply) {
-			applyStyle();
-		} else {
-			// not supported yet.
-		}
-	}
-
-	/**
-	 * 
-	 */
-	private void applyStyle() {
-		DesignerCommand command = new ApplyStyleCommand(_viewer,
-				getExpectedTag(), getExpectedCSSProperty(),
-				getExpectedCSSPropertyValue());
-		command.execute();
-	}
-
-	/**
-	 * @return  the expected property value
-	 */
-	protected abstract String getExpectedCSSPropertyValue();
-
-	/**
-	 * @return  the expected property
-	 */
-	protected abstract String getExpectedCSSProperty();
-
-	/**
-	 * @return the expected tag
-	 */
-	protected String getExpectedTag() {
-		return _expectedTag;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/DataBindingViewAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/DataBindingViewAction.java
deleted file mode 100644
index 1b2032d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/DataBindingViewAction.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.actions;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class DataBindingViewAction extends Action {
-
-	private static Logger _log = PDPlugin
-			.getLogger(DataBindingViewAction.class);
-
-	/**
-	 * Default constructor
-	 */
-	public DataBindingViewAction() {
-		setText(ActionsMessages
-				.getString("DataBindingViewAction.Menu.DataBinding")); //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.action.IAction#run()
-	 */
-	public void run() {
-		try {
-			getPage().showView(
-					"org.eclipse.jst.pagedesigner.databinding.ui.views.DataBindingsView");//$NON-NLS-1$
-		} catch (PartInitException e) {
-			_log.error("Error opening the DataBindingView"); //$NON-NLS-1$
-		}
-	}
-
-	private IWorkbenchPage getPage() {
-		IWorkbench workbench = PlatformUI.getWorkbench();
-		IWorkbenchWindow window = workbench.getActiveWorkbenchWindow();
-		return window.getActivePage();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/DesignActionBarFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/DesignActionBarFactory.java
deleted file mode 100644
index 1a3c1b4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/DesignActionBarFactory.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.actions;
-
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.actions.range.ChangeStyleAction;
-import org.eclipse.jst.pagedesigner.actions.range.DesignerToolBarAction;
-import org.eclipse.jst.pagedesigner.actions.range.HTagsInsertGroupAction;
-
-/**
- * @author mengbo
- */
-public class DesignActionBarFactory {
-	
-	private static final String TOOLBAR_PARAGRAPH_IMAGE_FILE = "PD_Toolbar_paragraph.gif"; //$NON-NLS-1$
-	private static final String TOOLBAR_LARGEFONT_DISABLED_IMAGE_FILE = "PD_Toolbar_largefont_disabled.gif"; //$NON-NLS-1$
-	private static final String TOOLBAR_LARGEFONT_IMAGE_FILE = "PD_Toolbar_largefont.gif"; //$NON-NLS-1$
-	private static final String TOOLBAR_SMALLFONT_DISABLED_IMAGE_FILE = "PD_Toolbar_smallfont_disabled.gif"; //$NON-NLS-1$
-	private static final String TOOLBAR_SMALLFONT_IMAGE_FILE = "PD_Toolbar_smallfont.gif"; //$NON-NLS-1$
-	private static final String TOOLBAR_BOLD_DISABLED_IMAGE_FILE = "PD_Toolbar_bold_disabled.gif"; //$NON-NLS-1$
-	private static final String TOOLBAR_BOLD_IMAGE_FILE = "PD_Toolbar_bold.gif"; //$NON-NLS-1$
-	private static final String TOOLBAR_ITALIC_DISABLED_IMAGE_FILE = "PD_Toolbar_italic_disabled.gif"; //$NON-NLS-1$
-	private static final String TOOLBAR_ITALIC_IMAGE_FILE = "PD_Toolbar_italic.gif"; //$NON-NLS-1$
-	private static final String TOOLBAR_UNDERLINE_DISABLED_IMAGE_FILE = "PD_Toolbar_underline_disabled.gif"; //$NON-NLS-1$
-	private static final String TOOLBAR_UNDERLINE_IMAGE_FILE = "PD_Toolbar_underline.gif"; //$NON-NLS-1$
-	
-	private static DesignActionBarFactory _instance;
-
-	private DesignActionBarFactory() {
-        // no external instantiation
-	}
-
-	/**
-	 * @return get the factory singleton
-	 */
-	public static DesignActionBarFactory getInstance() {
-		if (_instance == null) {
-			_instance = new DesignActionBarFactory();
-		}
-		return _instance;
-	}
-
-	/**
-	 * @param name
-	 * @return the tool bar action
-	 */
-	public DesignerToolBarAction getStyleAction(String name) {
-		DesignerToolBarAction action = null;
-
-		if (name.equals(IHTMLConstants.TAG_U)) {
-			action = new ChangeStyleAction(ActionsMessages
-					.getString("DesignActionBarFactory.Underline.Text"), name, //$NON-NLS-1$
-					PDPlugin.getDefault().getImageDescriptor(
-							TOOLBAR_UNDERLINE_IMAGE_FILE), PDPlugin.getDefault()
-							.getImageDescriptor(
-									TOOLBAR_UNDERLINE_DISABLED_IMAGE_FILE),
-					IAction.AS_CHECK_BOX);
-			action.setToolTipText(ActionsMessages
-					.getString("DesignActionBarFactory.Underline")); //$NON-NLS-1$
-		} else if (name.equals(IHTMLConstants.TAG_I)) {
-			action = new ChangeStyleAction(ActionsMessages
-					.getString("DesignActionBarFactory.Italic.Text"), name, //$NON-NLS-1$
-					PDPlugin.getDefault().getImageDescriptor(
-							TOOLBAR_ITALIC_IMAGE_FILE), PDPlugin.getDefault()
-							.getImageDescriptor(
-									TOOLBAR_ITALIC_DISABLED_IMAGE_FILE),
-					IAction.AS_CHECK_BOX);
-			action.setToolTipText(ActionsMessages
-					.getString("DesignActionBarFactory.Italic")); //$NON-NLS-1$
-		} else if (name.equals(IHTMLConstants.TAG_B)) {
-			action = new ChangeStyleAction(ActionsMessages
-					.getString("DesignActionBarFactory.Bold.Text"), name, //$NON-NLS-1$
-					PDPlugin.getDefault().getImageDescriptor(
-							TOOLBAR_BOLD_IMAGE_FILE),
-					PDPlugin.getDefault().getImageDescriptor(
-							TOOLBAR_BOLD_DISABLED_IMAGE_FILE),
-					IAction.AS_CHECK_BOX);
-			action.setToolTipText(ActionsMessages
-					.getString("DesignActionBarFactory.Bold")); //$NON-NLS-1$
-		} else if (name.equals(IHTMLConstants.TAG_SMALL)) {
-			action = new ChangeStyleAction(ActionsMessages
-					.getString("DesignActionBarFactory.Small.Text"), name, //$NON-NLS-1$
-					PDPlugin.getDefault().getImageDescriptor(
-							TOOLBAR_SMALLFONT_IMAGE_FILE), PDPlugin.getDefault()
-							.getImageDescriptor(
-									TOOLBAR_SMALLFONT_DISABLED_IMAGE_FILE),
-					IAction.AS_CHECK_BOX);
-			action.setToolTipText(ActionsMessages
-					.getString("DesignActionBarFactory.Small")); //$NON-NLS-1$
-		} else if (name.equals(IHTMLConstants.TAG_BIG)) {
-			action = new ChangeStyleAction(ActionsMessages
-					.getString("DesignActionBarFactory.Big.Text"), name, //$NON-NLS-1$
-					PDPlugin.getDefault().getImageDescriptor(
-							TOOLBAR_LARGEFONT_IMAGE_FILE), PDPlugin.getDefault()
-							.getImageDescriptor(
-									TOOLBAR_LARGEFONT_DISABLED_IMAGE_FILE),
-					IAction.AS_CHECK_BOX);
-			action.setToolTipText(ActionsMessages
-					.getString("DesignActionBarFactory.Big")); //$NON-NLS-1$
-		} else if (name
-				.equalsIgnoreCase(DesignPageActionContributor.PARAGRAPH_ACTION_ID)) {
-			action = new HTagsInsertGroupAction(PDPlugin.getDefault()
-					.getImageDescriptor(TOOLBAR_PARAGRAPH_IMAGE_FILE),
-					IAction.AS_DROP_DOWN_MENU);
-			action.setToolTipText(ActionsMessages
-					.getString("DesignActionBarFactory.Paragraph")); //$NON-NLS-1$
-		}
-
-		return action;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/DesignPageActionContributor.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/DesignPageActionContributor.java
deleted file mode 100644
index a1782ec..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/DesignPageActionContributor.java
+++ /dev/null
@@ -1,237 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.actions;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.ActionContributionItem;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IContributionItem;
-import org.eclipse.jface.action.IContributionManager;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.actions.range.DesignerToolBarAction;
-import org.eclipse.jst.pagedesigner.editors.HTMLEditor;
-import org.eclipse.jst.pagedesigner.editors.IDesignViewer;
-import org.eclipse.jst.pagedesigner.editors.SimpleGraphicalEditor;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.IWorkbenchCommandConstants;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPartSite;
-import org.eclipse.ui.part.EditorActionBarContributor;
-import org.eclipse.ui.texteditor.ITextEditorActionConstants;
-
-/**
- * sub action contributor for the designer page.
- * 
- * @author mengbo
- */
-public class DesignPageActionContributor extends EditorActionBarContributor {
-	private static final Logger _log = PDPlugin
-			.getLogger(DesignPageActionContributor.class);
-
-	/**
-	 * paragraph
-	 */
-	public static final String PARAGRAPH_ACTION_ID = "paragraph"; //$NON-NLS-1$
-
-	private IEditorPart _editorPart;
-
-	/**
-	 * @param manager
-	 * @param id
-	 */
-	protected void doRemove(IContributionManager manager, String id) {
-		try {
-			if (manager.find(id) != null) {
-				manager.remove(id);
-			}
-		} catch (Exception e) {
-			_log.info("Error:", e); //$NON-NLS-1$
-		}
-	}
-
-	public void init(IActionBars bars, IWorkbenchPage page) {
-		super.init(bars);
-		init(bars);
-	}
-
-	public void init(IActionBars bars) {
-		IToolBarManager toolbar = bars.getToolBarManager();
-		initToolbar(toolbar);
-	}
-
-	/**
-	 * @param toolbar
-	 */
-	private void initToolbar(IToolBarManager toolbar) {
-		DesignActionBarFactory factory = DesignActionBarFactory.getInstance();
-
-		Action action = factory.getStyleAction(IHTMLConstants.TAG_U);
-		toolbar.add(action);
-
-		action = factory.getStyleAction(IHTMLConstants.TAG_B);
-		toolbar.add(action);
-
-		action = factory.getStyleAction(IHTMLConstants.TAG_I);
-		toolbar.add(action);
-
-		action = factory.getStyleAction(IHTMLConstants.TAG_SMALL);
-		toolbar.add(action);
-
-		action = factory.getStyleAction(IHTMLConstants.TAG_BIG);
-		toolbar.add(action);
-		// action = factory.getStyleAction(PARAGRAPH_ACTION_ID);
-		// toolbar.add(action);
-	}
-
-	/**
-	 * @param menuManager
-	 * @param action
-	 * @param id
-	 */
-	protected void addActionWithId(IMenuManager menuManager, Action action,
-			String id) {
-		action.setId(id);
-		menuManager.add(action);
-	}
-
-	/**
-	 * @param enabled
-	 */
-	public void setViewerSpecificContributionsEnabled(boolean enabled) {
-		HTMLEditor htmlEditor = null;
-		if (_editorPart instanceof HTMLEditor) {
-			htmlEditor = (HTMLEditor) _editorPart;
-		} else if (_editorPart instanceof SimpleGraphicalEditor) {
-			htmlEditor = ((SimpleGraphicalEditor) _editorPart).getHTMLEditor();
-		}
-
-		if (htmlEditor == null)
-			return;
-
-		SimpleGraphicalEditor graphicalEditor = (SimpleGraphicalEditor) htmlEditor
-				.getDesignViewer();
-		IWorkbenchPartSite site = htmlEditor.getSite();
-		if (site instanceof IEditorSite) {
-			IActionBars actionBars = ((IEditorSite) site).getActionBars();
-
-			if (enabled) {
-				// // we always let the text editor to handle UNDO and REDO
-				// actionBars.setGlobalActionHandler(ITextEditorActionConstants.UNDO,
-				// textEditor
-				// .getAction(ITextEditorActionConstants.UNDO));
-				// actionBars.setGlobalActionHandler(ITextEditorActionConstants.REDO,
-				// textEditor
-				// .getAction(ITextEditorActionConstants.REDO));
-				// lium: the above behavior changed, since we now use
-				// DesignerUndoRedoAction.
-				// see comments in DesignerUndoRedoAction
-				actionBars.setGlobalActionHandler(
-						ITextEditorActionConstants.UNDO, graphicalEditor
-								.getAction(IWorkbenchCommandConstants.EDIT_UNDO));
-				actionBars.setGlobalActionHandler(
-						ITextEditorActionConstants.REDO, graphicalEditor
-								.getAction(IWorkbenchCommandConstants.EDIT_REDO));
-
-				// cut/copy/paste is delegated to design actions
-				actionBars
-						.setGlobalActionHandler(
-								ITextEditorActionConstants.DELETE,
-								graphicalEditor
-										.getAction(IWorkbenchCommandConstants.EDIT_DELETE));
-				actionBars.setGlobalActionHandler(
-						ITextEditorActionConstants.CUT, graphicalEditor
-								.getAction(IWorkbenchCommandConstants.EDIT_CUT));
-				actionBars.setGlobalActionHandler(
-						ITextEditorActionConstants.COPY, graphicalEditor
-								.getAction(IWorkbenchCommandConstants.EDIT_COPY));
-				actionBars
-						.setGlobalActionHandler(
-								ITextEditorActionConstants.PASTE,
-								graphicalEditor
-										.getAction(IWorkbenchCommandConstants.EDIT_PASTE));
-			} else {
-				actionBars.setGlobalActionHandler(
-						ITextEditorActionConstants.UNDO, null);
-				actionBars.setGlobalActionHandler(
-						ITextEditorActionConstants.REDO, null);
-
-				actionBars.setGlobalActionHandler(
-						ITextEditorActionConstants.DELETE, null);
-				actionBars.setGlobalActionHandler(
-						ITextEditorActionConstants.CUT, null);
-				actionBars.setGlobalActionHandler(
-						ITextEditorActionConstants.COPY, null);
-				actionBars.setGlobalActionHandler(
-						ITextEditorActionConstants.PASTE, null);
-			}
-		}
-	}
-
-	/**
-	 * The active editor passed in could be the following: HTMLEditor,
-	 * SimpleGraphicalEditor, null.
-	 */
-	public void setActiveEditor(IEditorPart targetEditor) {
-		_editorPart = targetEditor;
-
-		// temp code.
-		if (targetEditor instanceof SimpleGraphicalEditor) {
-			IHTMLGraphicalViewer graphicalViewer = ((SimpleGraphicalEditor) targetEditor).getGraphicViewer();
-			setViewerOnActions(graphicalViewer);
-		} else if (targetEditor instanceof HTMLEditor) {
-			//Bug 264080 - getDesignViewer may return null
-			IDesignViewer designViewer = ((HTMLEditor) targetEditor).getDesignViewer();
-			if (designViewer != null) {
-				IHTMLGraphicalViewer graphicalViewer = designViewer.getGraphicViewer();
-				setViewerOnActions(graphicalViewer);
-			}
-		} else {
-			setViewerOnActions(null);
-		}
-
-		// TODO... uncomment this and investigate NPE
-		//
-		// add the cut/copy/paste for text fields
-		// ActionHandlerPlugin.connectPart(editorPart);
-	}
-
-	private void setViewerOnActions(IHTMLGraphicalViewer viewer) {
-		IContributionItem[] items = getActionBars().getToolBarManager()
-				.getItems();
-		if (items != null) {
-			for (int i = 0; i < items.length; i++) {
-				if (items[i] instanceof ActionContributionItem) {
-					IAction action = ((ActionContributionItem) items[i])
-							.getAction();
-					if (action instanceof DesignerToolBarAction) {
-						((DesignerToolBarAction) action).setViewer(viewer);
-					}
-				}
-			}
-		}
-
-	}
-
-	/**
-	 * @see org.eclipse.ui.IEditorActionBarContributor#dispose()
-	 */
-	public void dispose() {
-        // TODO: anything to dispose?
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/DesignerStyleActionGroup.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/DesignerStyleActionGroup.java
deleted file mode 100644
index 6c121df..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/DesignerStyleActionGroup.java
+++ /dev/null
@@ -1,243 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.actions;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jface.commands.ActionHandler;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.editors.HTMLEditor;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.actions.ActionGroup;
-import org.eclipse.ui.handlers.IHandlerActivation;
-import org.eclipse.ui.handlers.IHandlerService;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class DesignerStyleActionGroup extends ActionGroup
-{
-	private static HashMap IMAGE_NAMES = new HashMap();
-
-	private static final String VERTICAL = ActionsMessages
-			.getString("DesignerStyleActionGroup.CommandLabel.V"); //$NON-NLS-1$
-
-	private static final String HORIZONTAL = ActionsMessages
-			.getString("DesignerStyleActionGroup.CommandLabel.H"); //$NON-NLS-1$
-
-	private static final String DESIGN = ActionsMessages
-			.getString("DesignerStyleActionGroup.CommandLabel.D"); //$NON-NLS-1$
-
-	private static final String SOURCE = ActionsMessages
-			.getString("DesignerStyleActionGroup.CommandLabel.S"); //$NON-NLS-1$
-
-	private static final String VERTICAL_TOOLTIP = ActionsMessages
-			.getString("DesignerStyleActionGroup.CommandLabel.V.Tooltip"); //$NON-NLS-1$
-
-	private static final String HORIZONTAL_TOOLTIP = ActionsMessages
-			.getString("DesignerStyleActionGroup.CommandLabel.H.Tooltip"); //$NON-NLS-1$
-
-	private static final String DESIGN_TOOLTIP = ActionsMessages
-			.getString("DesignerStyleActionGroup.CommandLabel.D.Tooltip"); //$NON-NLS-1$
-
-	private static final String SOURCE_TOOLTIP = ActionsMessages
-			.getString("DesignerStyleActionGroup.CommandLabel.S.Tooltip"); //$NON-NLS-1$
-	static {
-		IMAGE_NAMES.put(VERTICAL, "PD_Toolbar_vsplit.gif"); //$NON-NLS-1$
-		IMAGE_NAMES.put(HORIZONTAL, "PD_Toolbar_hsplit.gif"); //$NON-NLS-1$
-		IMAGE_NAMES.put(DESIGN, "PD_Toolbar_designer.gif"); //$NON-NLS-1$
-		IMAGE_NAMES.put(SOURCE, "PD_Toolbar_source.gif"); //$NON-NLS-1$
-	}
-
-    private class ChangeDesignerStyleAction extends Action {
-		int _mode;
-
-		ChangeDesignerStyleAction(String actionId, String text, ImageDescriptor image, int mode) {
-			super(text, IAction.AS_RADIO_BUTTON);
-			this.setImageDescriptor(image);
-			_mode = mode;
-			setId(actionId);
-		}
-
-		/**
-		 * @return the mode
-		 */
-		public int getMode() {
-			return _mode;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.action.Action#run()
-		 */
-		public void run() {
-		    //final IWorkbenchPart editorPart = getActivePart();
-			if (_htmlEditor != null) {
-			    _htmlEditor.setDesignerMode(_mode);
-				updateActionBars();
-			}
-		}
-
-	};
-
-	private HTMLEditor _htmlEditor;
-
-	private final ChangeDesignerStyleAction[] _actions;
-
-    private final  List<ActionHandler> _actionHandlers;
-    
-    private final List<IHandlerActivation>    _handlers;
-
-    /**
-     * constructor
-     */
-    public DesignerStyleActionGroup()
-	{
-		ChangeDesignerStyleAction verAction = new ChangeDesignerStyleAction(
-		        "org.eclipse.jst.pagedesigner.vertical", //$NON-NLS-1$
-		        VERTICAL, PDPlugin.getDefault().getImageDescriptor(
-						(String) IMAGE_NAMES.get(VERTICAL)),
-				HTMLEditor.MODE_SASH_VERTICAL);
-		verAction
-				.setActionDefinitionId("org.eclipse.jst.pagedesigner.vertical"); //$NON-NLS-1$
-		verAction.setToolTipText(VERTICAL_TOOLTIP);
-
-		ChangeDesignerStyleAction horAction = new ChangeDesignerStyleAction(
-		        "org.eclipse.jst.pagedesigner.horizotal", //$NON-NLS-1$
-				HORIZONTAL, PDPlugin.getDefault().getImageDescriptor(
-						(String) IMAGE_NAMES.get(HORIZONTAL)),
-				HTMLEditor.MODE_SASH_HORIZONTAL);
-		horAction
-				.setActionDefinitionId("org.eclipse.jst.pagedesigner.horizotal"); //$NON-NLS-1$
-		horAction.setToolTipText(HORIZONTAL_TOOLTIP);
-
-		ChangeDesignerStyleAction designAction = new ChangeDesignerStyleAction(
-		        "org.eclipse.jst.pagedesigner.design", //$NON-NLS-1$
-				DESIGN, PDPlugin.getDefault().getImageDescriptor(
-						(String) IMAGE_NAMES.get(DESIGN)),
-				HTMLEditor.MODE_DESIGNER);
-		designAction
-				.setActionDefinitionId("org.eclipse.jst.pagedesigner.design"); //$NON-NLS-1$
-		designAction.setToolTipText(DESIGN_TOOLTIP);
-
-		ChangeDesignerStyleAction sourceAction = new ChangeDesignerStyleAction(
-		        "org.eclipse.jst.pagedesigner.source", //$NON-NLS-1$
-				SOURCE, PDPlugin.getDefault().getImageDescriptor(
-						(String) IMAGE_NAMES.get(SOURCE)),
-				HTMLEditor.MODE_SOURCE);
-		sourceAction
-				.setActionDefinitionId("org.eclipse.jst.pagedesigner.source"); //$NON-NLS-1$
-		sourceAction.setToolTipText(SOURCE_TOOLTIP);
-
-		_actions = new ChangeDesignerStyleAction[] { verAction, horAction,
-				designAction, sourceAction };
-        _actionHandlers = new ArrayList<ActionHandler>();
-		for (int i = 0; i < _actions.length; i++)
-		{
-	        _actionHandlers.add(new ActionHandler(_actions[i]));
-		}
-		_handlers = new ArrayList<IHandlerActivation>();
-	}
-
-
-	public void updateActionBars() {
-		if (_htmlEditor == null) {
-			for (int i = 0; i < _actions.length; i++) {
-				_actions[i].setEnabled(false);
-			}
-		} else {
-			for (int i = 0; i < _actions.length; i++) {
-				_actions[i].setEnabled(true);
-				_actions[i].setChecked(_actions[i].getMode() == _htmlEditor
-						.getDesignerMode());
-			}
-		}
-	}
-
-    /**
-     * @param editor
-     */
-    public void setHTMLEditor(HTMLEditor editor)
-    {
-        if (_htmlEditor != editor)
-        {
-            if (_htmlEditor != null)
-            {
-                deactivateHandlers();
-            }
-
-            this._htmlEditor = editor;
-            if (_htmlEditor != null)
-            {
-                activateHandlers();
-            }
-            updateActionBars();
-        }
-    }
-
-    private void deactivateHandlers()
-    {
-        final IHandlerService service = (IHandlerService) _htmlEditor.getSite()
-                .getService(IHandlerService.class);
-        if (service != null)
-        {
-            for (final IHandlerActivation activation : _handlers)
-            {
-                service.deactivateHandler(activation);
-            }
-        }
-        _handlers.clear();
-    }
-
-    private void activateHandlers()
-    {
-        final IHandlerService service = (IHandlerService) _htmlEditor.getSite()
-                .getService(IHandlerService.class);
-        for (int i = 0; i < _actions.length; i++)
-        {
-            _handlers.add(service.activateHandler(_actions[i].getId(), _actionHandlers.get(i)));
-        }
-    }
-
-    /**
-     * @param actionBars
-     */
-    public void fillActionBars(IActionBars actionBars)
-    {
-        IToolBarManager toolbar = actionBars.getToolBarManager();
-        for (int i = 0; i < _actions.length; i++)
-        {
-            toolbar.add(_actions[i]);
-        }
-        toolbar.add(new Separator());
-    }
-
-    /**
-     * dispose the action
-     */
-    public void dispose()
-    {
-        for (final ActionHandler actionHandler : _actionHandlers)
-        {
-            actionHandler.dispose();
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/DesignerUndoRedoAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/DesignerUndoRedoAction.java
deleted file mode 100644
index 3d563ac..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/DesignerUndoRedoAction.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.actions;
-
-import java.text.MessageFormat;
-
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.gef.ui.actions.UpdateAction;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jst.pagedesigner.editors.SimpleGraphicalEditor;
-import org.eclipse.wst.sse.core.internal.undo.IStructuredTextUndoManager;
-
-/**
- * SSE has a IDocumentSelectionMediator mechanism, basically it let the viewer
- * that invoke the redo/undo to reset the selection after redo/undo.
- * 
- * To utilize this feature, we can't directly use the undo/redo action of the
- * text editor for the designer, since in that way it will be the TextEditor to
- * handle selection after redo/undo.
- * 
- * @author mengbo
- * @version 1.5
- */
-public class DesignerUndoRedoAction extends Action implements UpdateAction {
-	private boolean _undo = true; // if false means redo
-
-	private final SimpleGraphicalEditor _designer;
-
-	/**
-	 * @param undo 
-	 * @param designer 
-	 * 
-	 */
-	public DesignerUndoRedoAction(boolean undo, SimpleGraphicalEditor designer) {
-		this._undo = undo;
-		this._designer = designer;
-
-		if (undo) {
-			setText(ActionsMessages.getString("DesignerUndoRedoAction.UNDO")); //$NON-NLS-1$
-		} else {
-			setText(ActionsMessages.getString("DesignerUndoRedoAction.REDO")); //$NON-NLS-1$
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.ui.actions.UpdateAction#update()
-	 */
-	public void update() {
-		IStructuredTextUndoManager undoManager = _designer.getHTMLEditor()
-				.getModel().getUndoManager();
-		if (_undo) {
-			Command c = undoManager.getUndoCommand();
-			this.setEnabled(undoManager.undoable());
-			if (c != null) {
-				String label = c.getLabel();
-				this
-						.setText(MessageFormat
-								.format(
-										ActionsMessages
-												.getString("DesignerUndoRedoAction.UNDO_LABEL"), new Object[] { label })); //$NON-NLS-1$
-			} else {
-				this.setText(ActionsMessages
-						.getString("DesignerUndoRedoAction.UNDO")); //$NON-NLS-1$
-			}
-		} else {
-			Command c = undoManager.getRedoCommand();
-			this.setEnabled(undoManager.redoable());
-			if (c != null) {
-				String label = c.getLabel();
-				this
-						.setText(MessageFormat
-								.format(
-										ActionsMessages
-												.getString("DesignerUndoRedoAction.REDO_LABEL"), new Object[] { label })); //$NON-NLS-1$
-			} else {
-				this.setText(ActionsMessages
-						.getString("DesignerUndoRedoAction.REDO")); //$NON-NLS-1$
-			}
-		}
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.action.Action#run()
-	 */
-	public void run() {
-		IStructuredTextUndoManager undoManager = _designer.getHTMLEditor()
-				.getModel().getUndoManager();
-		if (_undo) {
-			undoManager.undo(_designer);
-		} else {
-			undoManager.redo(_designer);
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/ManageSkinsAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/ManageSkinsAction.java
deleted file mode 100644
index 4a9a79d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/ManageSkinsAction.java
+++ /dev/null
@@ -1,181 +0,0 @@
-package org.eclipse.jst.pagedesigner.editors.actions;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IMenuCreator;
-import org.eclipse.jface.preference.PreferenceDialog;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.editors.HTMLEditor;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.MenuItem;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IFileEditorInput;
-import org.eclipse.ui.dialogs.PropertyDialogAction;
-import org.eclipse.ui.internal.Workbench;
-
-/**
- * Action to change the current DT skin.
- * 
- * @author Ian Trimble - Oracle
- */
-public class ManageSkinsAction extends Action {
-
-	/**
-	 * Constructs an instance.
-	 */
-	public ManageSkinsAction() {
-		super(ActionsMessages.getString("ManageSkinsAction.Text"), AS_DROP_DOWN_MENU); //$NON-NLS-1$
-		setImageDescriptor(PDPlugin.getDefault().getImageDescriptor("skin.png")); //$NON-NLS-1$
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.action.Action#run()
-	 */
-	@Override
-	public void run() {
-		IEditorPart editorPart = Workbench.getInstance().getActiveWorkbenchWindow().getActivePage().getActiveEditor();
-		if (editorPart instanceof HTMLEditor) {
-			IEditorInput editorInput = editorPart.getEditorInput();
-			if (editorInput instanceof IFileEditorInput) {
-				IFile file = ((IFileEditorInput)editorInput).getFile();
-				IProject project = file.getProject();
-				if (project != null) {
-					SelectionProvider selectionProvider = new SelectionProvider();
-					selectionProvider.setSelection(new StructuredSelection(project));
-			        PropertyDialogAction propertyDialogAction = new PropertyDialogAction(editorPart.getEditorSite(), selectionProvider);
-			        PreferenceDialog dialog = propertyDialogAction.createDialog();
-			        if (dialog != null) {
-			        	dialog.setSelectedNode("org.eclipse.jst.pagedesigner.WPEPropertyPage"); //$NON-NLS-1$
-			        	//yes, we create AGAIN - cannot find another way to get the selected node to stick
-			        	dialog = propertyDialogAction.createDialog();
-			        	if (dialog != null) {
-			        		dialog.open();
-			        	}
-			        }
-				}
-			}
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.action.Action#getMenuCreator()
-	 */
-	@Override
-	public IMenuCreator getMenuCreator() {
-		return new MenuCreator();
-	}
-
-
-
-	/**
-	 * Simple selection provider for creation of the property dialog.
-	 */
-	private class SelectionProvider implements ISelectionProvider {
-		private ISelection selection;
-		/*
-		 * (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.ISelectionProvider#addSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
-		 */
-		public void addSelectionChangedListener(ISelectionChangedListener listener) {
-			//do nothing - we don't care here
-		}
-		/*
-		 * (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.ISelectionProvider#removeSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
-		 */
-		public void removeSelectionChangedListener(ISelectionChangedListener listener) {
-			//do nothing - we don't care here
-		}
-		/*
-		 * (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.ISelectionProvider#setSelection(org.eclipse.jface.viewers.ISelection)
-		 */
-		public void setSelection(ISelection selection) {
-			this.selection = selection;
-		}
-		/*
-		 * (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.ISelectionProvider#getSelection()
-		 */
-		public ISelection getSelection() {
-			return selection;
-		}
-	}
-
-
-
-	/**
-	 * Store last created menu so we can dispose on next creation.
-	 */
-	private static Menu lastMenu;
-	/**
-	 * Menu creator for the drop-down button.
-	 */
-	private class MenuCreator implements IMenuCreator {
-		/*
-		 * (non-Javadoc)
-		 * @see org.eclipse.jface.action.IMenuCreator#dispose()
-		 */
-		public void dispose() {
-			if (lastMenu != null) {
-				lastMenu.dispose();
-			}
-		}
-		/*
-		 * (non-Javadoc)
-		 * @see org.eclipse.jface.action.IMenuCreator#getMenu(org.eclipse.swt.widgets.Control)
-		 */
-		public Menu getMenu(Control control) {
-			dispose();
-			lastMenu = new Menu(control);
-			buildMenu(lastMenu);
-			return lastMenu;
-		}
-		/*
-		 * (non-Javadoc)
-		 * @see org.eclipse.jface.action.IMenuCreator#getMenu(org.eclipse.swt.widgets.Menu)
-		 */
-		public Menu getMenu(Menu menu) {
-			dispose();
-			lastMenu = new Menu(menu);
-			buildMenu(lastMenu);
-			return lastMenu;
-		}
-		private void buildMenu(Menu menu) {
-			MenuItem menuItem = new MenuItem(lastMenu, SWT.PUSH);
-			menuItem.setText(ActionsMessages.getString("ManageSkinsAction.Text")); //$NON-NLS-1$
-			menuItem.addSelectionListener(new SelectionListener() {
-				public void widgetSelected(SelectionEvent event) {
-					run();
-				}
-				public void widgetDefaultSelected(SelectionEvent event) {
-					widgetSelected(event);
-				}
-			});
-			IEditorPart editorPart = Workbench.getInstance().getActiveWorkbenchWindow().getActivePage().getActiveEditor();
-			if (editorPart instanceof HTMLEditor) {
-				IEditorInput editorInput = editorPart.getEditorInput();
-				if (editorInput instanceof IFileEditorInput) {
-					IFile file = ((IFileEditorInput)editorInput).getFile();
-					IProject project = file.getProject();
-					if (project != null) {
-						SkinsMenuItemBuilder skinsMenuItemBuilder =
-							new SkinsMenuItemBuilder(project);
-						skinsMenuItemBuilder.buildMenuItems(menu);
-					}
-				}
-			}
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/OutlineViewAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/OutlineViewAction.java
deleted file mode 100644
index b22073e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/OutlineViewAction.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.actions;
-
-import org.eclipse.ui.IPageLayout;
-
-/**
- * A show view action that shows the outline view
- *
- */
-public class OutlineViewAction extends ShowViewAction 
-{
-    /**
-     * the action id
-     */
-    public final static String ID = "org.eclipse.jst.pagedesigner.editors.actions.OutlineViewAction"; //$NON-NLS-1$
-
-    /**
-     * Default constructor
-     */
-    public OutlineViewAction() 
-    {
-        super(ActionsMessages
-                .getString("OutlineViewAction.Menu.OutlineView") //$NON-NLS-1$
-              , IPageLayout.ID_OUTLINE);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/PageDesignerActionBarContributor2.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/PageDesignerActionBarContributor2.java
deleted file mode 100644
index b081c16..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/PageDesignerActionBarContributor2.java
+++ /dev/null
@@ -1,350 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.actions;
-
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.IStatusLineManager;
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jst.pagedesigner.IJMTConstants;
-import org.eclipse.jst.pagedesigner.editors.HTMLEditor;
-import org.eclipse.jst.pagedesigner.editors.SimpleGraphicalEditor;
-import org.eclipse.jst.pagedesigner.ui.common.sash.NestedEditorActionBarContributor;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.wst.sse.ui.StructuredTextEditor;
-import org.eclipse.wst.sse.ui.internal.ExtendedEditorActionBuilder;
-import org.eclipse.wst.sse.ui.internal.IExtendedContributor;
-import org.eclipse.wst.sse.ui.internal.ISourceViewerActionBarContributor;
-
-/**
- * This is the actionbar contributor for HTML Editor. As HTMLEditor is
- * multipaged, so this contributor will also handle on which page currently is
- * activated.
- * 
- * @author mengbo
- */
-public class PageDesignerActionBarContributor2 extends
-		NestedEditorActionBarContributor implements IExtendedContributor {
-
-	private DesignPageActionContributor _designViewerActionBarContributor = null;
-
-	private ISourceViewerActionBarContributor _sourceViewerActionContributor = null;
-
-	private HTMLEditor _htmlEditor = null;
-
-	// EditorExtension
-	private static final String EDITOR_ID = IJMTConstants.EDITORID_HTML;
-
-	private IExtendedContributor _extendedContributor;
-
-	private DesignerStyleActionGroup _group = new DesignerStyleActionGroup();
-
-	/**
-	 * Default constructor
-	 */
-	public PageDesignerActionBarContributor2() {
-		super();
-
-		_sourceViewerActionContributor = new SourcePageActionContributor();
-		_designViewerActionBarContributor = new DesignPageActionContributor();
-
-		// Read action extensions.
-		ExtendedEditorActionBuilder builder = new ExtendedEditorActionBuilder();
-		_extendedContributor = builder.readActionExtensions(EDITOR_ID);
-	}
-
-	public void init(IActionBars actionBars) {
-		super.init(actionBars);
-
-		if (actionBars != null) {
-			initCommonActionBarContributor(actionBars);
-			actionBars.getToolBarManager().add(new ManageSkinsAction());
-			actionBars.getToolBarManager().add(new Separator());
-			initDesignViewerActionBarContributor(actionBars);
-			initSourceViewerActionContributor(actionBars);
-		}
-	}
-
-	/**
-	 * @param actionBars
-	 */
-	private void initCommonActionBarContributor(IActionBars actionBars) {
-		_group.fillActionBars(actionBars);
-	}
-
-	/**
-	 * @param actionBars
-	 */
-	protected void initDesignViewerActionBarContributor(IActionBars actionBars) {
-		if (_designViewerActionBarContributor != null)
-			_designViewerActionBarContributor.init(actionBars, getPage());
-	}
-
-	/**
-	 * @param actionBars
-	 */
-	protected void initSourceViewerActionContributor(IActionBars actionBars) {
-		if (_sourceViewerActionContributor != null)
-			_sourceViewerActionContributor.init(actionBars, getPage());
-	}
-
-	public void dispose() {
-		super.dispose();
-		if (_designViewerActionBarContributor != null) {
-			_designViewerActionBarContributor.dispose();
-		}
-		if (_sourceViewerActionContributor != null) {
-			_sourceViewerActionContributor.dispose();
-		}
-		if (_extendedContributor != null) {
-			_extendedContributor.dispose();
-		}
-		if (_group != null) {
-			_group.dispose();
-		}
-	}
-
-	/**
-	 * @see org.eclipse.ui.part.EditorActionBarContributor#contributeToMenu(IMenuManager)
-	 */
-	public final void contributeToMenu(IMenuManager menu) {
-		super.contributeToMenu(menu);
-		addToMenu(menu);
-		if (_extendedContributor != null)
-			_extendedContributor.contributeToMenu(menu);
-	}
-
-	private void addToMenu(IMenuManager menu) {
-		// IMenuManager menuMgr = new MenuManager(PD_EDITOR_MENU_LABEL,
-		// IJMTConstants.PD_EDITOR_MENU_ID);
-		// menu.insertBefore(IWorkbenchActionConstants.M_NAVIGATE, menuMgr);
-		//
-		// menuMgr.add(action);
-		// menuMgr.setRemoveAllWhenShown(true);
-		//
-		// menuMgr.addMenuListener(new IMenuListener()
-		// {
-		// public void menuAboutToShow(IMenuManager menuMgr)
-		// {
-		// PageDesignerActionConstants.addStandardActionGroups(menuMgr);
-		// RelatedViewActionGroup viewMenu = new RelatedViewActionGroup();
-		// viewMenu.fillContextMenu(menuMgr);
-		// updateEditorMenu(menuMgr);
-		// }
-		// });
-	}
-
-	/**
-	 * @see IExtendedContributor#contributeToPopupMenu(IMenuManager)
-	 */
-	public final void contributeToPopupMenu(IMenuManager menu) {
-		// TODO: this method is empty addToPopupMenu(menu);
-		if (_extendedContributor != null)
-			_extendedContributor.contributeToPopupMenu(menu);
-	}
-
-//	protected void addToPopupMenu(IMenuManager menu) {
-//        // do nothing
-//	}
-
-	/**
-	 * @see org.eclipse.ui.part.EditorActionBarContributor#contributeToToolBar(IToolBarManager)
-	 */
-	public final void contributeToToolBar(IToolBarManager toolBarManager) {
-		super.contributeToToolBar(toolBarManager);
-		// TODO: this method is empty addToToolBar(toolBarManager);
-		if (_extendedContributor != null)
-			_extendedContributor.contributeToToolBar(toolBarManager);
-	}
-
-//	protected void addToToolBar(IToolBarManager toolBarManager) {
-//	}
-
-	/**
-	 * @see org.eclipse.ui.part.EditorActionBarContributor#contributeToStatusLine(IStatusLineManager)
-	 */
-	public final void contributeToStatusLine(IStatusLineManager manager) {
-		super.contributeToStatusLine(manager);
-		// TODO: this method does nothing addToStatusLine(manager);
-		if (_extendedContributor != null)
-			_extendedContributor.contributeToStatusLine(manager);
-	}
-
-//	protected void addToStatusLine(IStatusLineManager manager) {
-//	}
-
-	/**
-	 * @see IExtendedContributor#updateToolbarActions()
-	 */
-	public void updateToolbarActions() {
-		if (_extendedContributor != null) {
-			_extendedContributor.updateToolbarActions();
-		}
-		_group.setHTMLEditor(_htmlEditor);
-	}
-
-	public void setActiveEditor(IEditorPart targetEditor) {
-		if (targetEditor instanceof HTMLEditor) {
-			_htmlEditor = (HTMLEditor) targetEditor;
-			//StructuredTextEditor textEditor = _htmlEditor.getTextEditor();
-			// TODO: never read this._model = textEditor.getModel();
-		}
-		super.setActiveEditor(targetEditor);
-		updateToolbarActions();
-		if (_extendedContributor != null)
-			_extendedContributor.setActiveEditor(targetEditor);
-	}
-
-	public void setInnerActivePage(IEditorPart activeEditor) {
-		// This contributor is designed for StructuredTextMultiPageEditorPart.
-		// To safe-guard this from problems caused by unexpected usage by
-		// other editors, the following
-		// check is added.
-		if (_htmlEditor != null) {
-			if (activeEditor instanceof StructuredTextEditor) {
-				activateSourcePage((StructuredTextEditor) activeEditor);
-			} else if (activeEditor instanceof SimpleGraphicalEditor) {
-				//SimpleGraphicalEditor graphEditor = (SimpleGraphicalEditor) activeEditor;
-				activateDesignPage((SimpleGraphicalEditor) activeEditor);
-				// TODO: never read this._viewer = graphEditor.getGraphicViewer();
-			} else {
-				// currently we don't have special action for preview.
-				deactivateSourceAndDesignPage(activeEditor);
-				// TODO: never read this._viewer = null;
-			}
-		}
-
-		updateToolbarActions();
-
-		IActionBars actionBars = getActionBars();
-		if (actionBars != null) {
-			// update menu bar and tool bar
-			actionBars.updateActionBars();
-		}
-	}
-
-	/**
-	 * @param activeEditor 
-	 * 
-	 */
-	protected void deactivateSourceAndDesignPage(IEditorPart activeEditor) {
-		if (_designViewerActionBarContributor != null) {
-			_designViewerActionBarContributor.setActiveEditor(_htmlEditor);
-			_designViewerActionBarContributor
-					.setViewerSpecificContributionsEnabled(false);
-		}
-		if (_sourceViewerActionContributor != null) {
-			_sourceViewerActionContributor.setActiveEditor(_htmlEditor);
-			_sourceViewerActionContributor
-					.setViewerSpecificContributionsEnabled(false);
-		}
-	}
-
-	/**
-	 * @param activeEditor
-	 */
-	protected void activateDesignPage(SimpleGraphicalEditor activeEditor) {
-
-		if (_sourceViewerActionContributor != null /*
-													 * &&
-													 * _sourceViewerActionContributor
-													 * instanceof
-													 * ISourceViewerActionBarContributor
-													 */) {
-			// previously I was trying setActiveEditor(null) here. But as in the
-			// super class will
-			// compare the editor with original one, if same then directly
-			// return. So will not disable
-			// those actions. (lium)
-			_sourceViewerActionContributor.setActiveEditor(_htmlEditor);
-			_sourceViewerActionContributor
-					.setViewerSpecificContributionsEnabled(false);
-		}
-
-		if (_designViewerActionBarContributor != null) {
-			_designViewerActionBarContributor.setActiveEditor(activeEditor);
-			_designViewerActionBarContributor
-					.setViewerSpecificContributionsEnabled(true);
-		}
-	}
-
-	/**
-	 * @param activeEditor
-	 */
-	protected void activateSourcePage(StructuredTextEditor activeEditor) {
-		if (_designViewerActionBarContributor != null /*
-														 * &&
-														 * _designViewerActionBarContributor
-														 * instanceof
-														 * IDesignViewerActionBarContributor
-														 */) {
-			// _designViewerActionBarContributor only recogonize HTMLEditor and
-			// its own GraphicEditor. so not setting source editor to it.
-			_designViewerActionBarContributor.setActiveEditor(_htmlEditor);
-			_designViewerActionBarContributor
-					.setViewerSpecificContributionsEnabled(false);
-		}
-
-		if (_sourceViewerActionContributor != null /*
-													 * &&
-													 * _sourceViewerActionContributor
-													 * instanceof
-													 * ISourceViewerActionBarContributor
-													 */) {
-			_sourceViewerActionContributor.setActiveEditor(activeEditor);
-			_sourceViewerActionContributor.setViewerSpecificContributionsEnabled(true);
-		}
-	}
-
-    // TODO: dead?
-//	private void updateEditorMenu(IMenuManager menuMgr) {
-//		if (this._viewer == null) {
-//			return;
-//		} else {
-//			if (menuMgr != null) {
-//				ContainerActionGroup containerActionGroup = new ContainerActionGroup();
-//				ActionContext context = new ActionContext(this._viewer
-//						.getSelection());
-//				context.setInput(this._viewer);
-//				containerActionGroup.setContext(context);
-//				containerActionGroup.fillContextMenu(menuMgr);
-//				containerActionGroup.setContext(null);
-//
-//				RangeActionGroup rangeActionGroup = new RangeActionGroup();
-//				context = new ActionContext(this._viewer.getSelection());
-//				context.setInput(this._viewer);
-//				rangeActionGroup.setContext(context);
-//				rangeActionGroup.fillContextMenu(menuMgr);
-//				rangeActionGroup.setContext(null);
-//
-//				SingleElementActionGroup singleActionGroup = new SingleElementActionGroup();
-//				singleActionGroup.setContext(new ActionContext(this._viewer
-//						.getSelection()));
-//				singleActionGroup.fillContextMenu(menuMgr);
-//				singleActionGroup.setContext(null);
-//
-//				if (this._model != null) {
-//					CustomedContextMenuActionGroup customedMenu = new CustomedContextMenuActionGroup();
-//					customedMenu.setContext(new ActionContext(_viewer
-//							.getSelection()));
-//					customedMenu.setModel(_model);
-//					customedMenu.setParentControl(_viewer.getControl());
-//					customedMenu.fillContextMenu(menuMgr);
-//					customedMenu.setContext(null);
-//					customedMenu.setParentControl(null);
-//					customedMenu.setModel(null);
-//				}
-//			}
-//		}
-//	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/PaletteViewAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/PaletteViewAction.java
deleted file mode 100644
index 45cd989..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/PaletteViewAction.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.actions;
-
-import org.eclipse.gef.EditDomain;
-import org.eclipse.gef.ui.views.palette.PaletteView;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class PaletteViewAction extends ShowViewAction {
-	/**
-	 * the action id
-	 */
-	public final static String ID = "org.eclipse.jst.pagedesigner.editors.actions.PaletteViewAction"; //$NON-NLS-1$
-    
-	/**
-	 * @param element
-	 * @param editDomain
-	 */
-	public PaletteViewAction(Element element, EditDomain editDomain) {
-        super(ActionsMessages.getString("PaletteViewAction.Menu.PaletteView") //$NON-NLS-1$
-                , PaletteView.ID);
-        //_element = element;
-        //_editDomain = editDomain;
-	}
-    
-    /** 
-     * Add to default behavior because pallete view doesn't automatically track
-     * selection to currently selected edit part
-     */
-    public void run()
-    {
-        super.run();
-        
-        //TODO: for some reason getting a palette item to select doesn't work
-//        if (_element != null && _editDomain != null)
-//        {
-//            PaletteItemManager manager = PaletteItemManager
-//                                          .getInstance(getProject(_element));
-//            if (manager != null) {
-//                IPaletteItemCategory category = manager.findOrCreateCategory(CMUtil
-//                        .getElementNamespaceURI(_element), null);
-//                
-//              if (category != null) {
-//                  String name = _element.getLocalName();
-//                  if (category.getURI().equals(IJMTConstants.URI_JSP)) {
-//                      name = _element.getTagName();
-//                  }
-//                  IPaletteItemDescriptor descriptor = category
-//                      .getItemByTagName(name);
-//                  if (descriptor != null)
-//                  {
-//                      PaletteEntry paletteEntry = descriptor.getPaletteEntry();
-//                      final RootEditPart editPart = 
-//                          _editDomain.getPaletteViewer().getRootEditPart();
-//                      EditPart newSelection = findMatchingPart(editPart.getContents(), paletteEntry);
-//
-//                      if (newSelection != null)
-//                      {
-//                          _editDomain.getPaletteViewer().setSelection(new StructuredSelection(newSelection));
-//                      }
-//                   }
-//                }
-//            }
-//        }
-    }
-    
-//    private EditPart findMatchingPart(EditPart curPart, PaletteEntry paletteEntry)
-//    {
-//        EditPart match = null;
-//
-//        if (curPart.getModel() == paletteEntry)
-//        {
-//            return curPart;
-//        }
-//        
-//        for (final Iterator it = curPart.getChildren().iterator(); it.hasNext();)
-//        {
-//            match = findMatchingPart((EditPart)it.next(), paletteEntry);
-//            
-//            if (match != null)
-//            {
-//                break;
-//            }
-//        }
-//        
-//        return match;
-//    }
-//    private IProject getProject(Element element) {
-//        if (element instanceof IDOMElement) {
-//            IDOMModel model = ((IDOMElement) element).getModel();
-//            IFile file = StructuredModelUtil.getFileFor(model);
-//            if (file != null) {
-//                return file.getProject();
-//            }
-//        }
-//        return null;
-//    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/PropertiesViewAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/PropertiesViewAction.java
deleted file mode 100644
index bf4098b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/PropertiesViewAction.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.actions;
-
-import org.eclipse.ui.IPageLayout;
-
-/**
- * @author mengbo
- */
-public class PropertiesViewAction extends ShowViewAction {
-	/**
-	 * the id
-	 */
-	public final static String ID = "org.eclipse.jst.pagedesigner.editors.actions.PropertiesViewAction"; //$NON-NLS-1$
-
-	/**
-	 * Default constructor
-	 */
-	public PropertiesViewAction() 
-    {
-		super(ActionsMessages
-				.getString("PropertiesViewAction.Menu.Properties") //$NON-NLS-1$
-              , IPageLayout.ID_PROP_SHEET);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/RelatedViewActionGroup.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/RelatedViewActionGroup.java
deleted file mode 100644
index d4e70ad..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/RelatedViewActionGroup.java
+++ /dev/null
@@ -1,148 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.actions;
-
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.gef.EditDomain;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IMenuListener;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jst.pagedesigner.editors.PageDesignerActionConstants;
-import org.eclipse.jst.pagedesigner.parts.ElementEditPart;
-import org.eclipse.ui.IWorkbenchActionConstants;
-import org.eclipse.ui.actions.ActionContext;
-import org.eclipse.ui.actions.ActionGroup;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class RelatedViewActionGroup extends ActionGroup 
-{
-    private final EditDomain  _editDomain;
-    
-    /**
-     * @param editDomain
-     */
-    public RelatedViewActionGroup(EditDomain editDomain)
-    {
-        _editDomain = editDomain;
-    }
-    
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.actions.ActionGroup#fillContextMenu(org.eclipse.jface.action.IMenuManager)
-	 */
-	public void fillContextMenu(IMenuManager menu) {
-		super.fillContextMenu(menu);
-
-		final IMenuManager viewMgr = new MenuManager(ActionsMessages
-				.getString("RelatedViewActionGroup.Menu.ShowView"),//$NON-NLS-1$
-				PageDesignerActionConstants.SHOWVIEW_SUBMENU_ID);
-		viewMgr.add(new Action() {
-		    // add noop action; TODO: why?
-		});
-		viewMgr.setRemoveAllWhenShown(true);
-        final ActionContext context = getContext();
-		viewMgr.addMenuListener(new IMenuListener() {
-			public void menuAboutToShow(IMenuManager manager) {
-                // TODO: don't like this at all
-				String[] views = { "org.eclipse.ui.views.PropertySheet", //$NON-NLS-1$
-						"org.eclipse.gef.ui.palette_view", "org.eclipse.ui.views.ContentOutline"}; //$NON-NLS-1$ //$NON-NLS-2$
-
-                Map icons = getIconForView(views);
-                // TODO: is this the best way to do this?
-				if (manager.find(PropertiesViewAction.ID) == null) {
-					Action action = new PropertiesViewAction();
-					action.setId(PropertiesViewAction.ID);
-					action.setImageDescriptor((ImageDescriptor) icons
-							.get(views[0]));
-					manager.add(action);
-				}
-                    ISelection selection = context.getSelection();
-                    if (manager.find(PaletteViewAction.ID) == null) {
-                    if (selection instanceof IStructuredSelection)
-                    {
-                        IStructuredSelection strucSelection = 
-                            (IStructuredSelection) selection;
-                        Action action = null;
-                        
-                        if (strucSelection.getFirstElement() instanceof ElementEditPart)
-                        {                      
-                            Element selectedElem = (Element)
-                                ((ElementEditPart) strucSelection.getFirstElement()).getModel();
-        					action = new PaletteViewAction(selectedElem, _editDomain);
-                        }
-                        else
-                        {
-                            // if can't determine, just default open the palette
-                            action = new PaletteViewAction(null, null);
-                        }
-                        action.setId(PaletteViewAction.ID);
-                        action.setImageDescriptor((ImageDescriptor) icons
-                                .get(views[1]));
-                        manager.add(action);
-                    }
-				}
-                if (manager.find(OutlineViewAction.ID) == null)
-                {
-                    Action action = new OutlineViewAction();
-                    action.setId(OutlineViewAction.ID);
-                    action.setImageDescriptor((ImageDescriptor) icons
-                            .get(views[2]));
-                    manager.add(action);
-                }
-                
-			}
-		});
-		menu.appendToGroup(IWorkbenchActionConstants.MB_ADDITIONS, viewMgr);
-	}
-
-	private Map getIconForView(String[] viewids) {
-		List views = Arrays.asList(viewids);
-		Map icons = new HashMap();
-
-		IConfigurationElement[] elements = Platform.getExtensionRegistry()
-				.getConfigurationElementsFor("org.eclipse.ui.views"); //$NON-NLS-1$
-		for (int i = 0; i < elements.length; i++) {
-			String name = elements[i].getName();
-			String id = elements[i].getAttribute("id"); //$NON-NLS-1$
-			if ("view".equals(name) && views.contains(id)) { //$NON-NLS-1$
-				String iconPath = elements[i].getAttribute("icon"); //$NON-NLS-1$
-				if (iconPath != null) {
-					icons.put(id, AbstractUIPlugin.imageDescriptorFromPlugin(
-							elements[i].getDeclaringExtension().getContributor().getName(),
-							iconPath));
-				} else {
-					icons.put(id, null);
-				}
-				if (icons.size() == viewids.length) {
-					break;
-				}
-			}
-		}
-		return icons;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/ShowViewAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/ShowViewAction.java
deleted file mode 100644
index 33bc222..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/ShowViewAction.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.actions;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * TODO: isn't there a workbench registry action for this?
- * @author cbateman
- *
- */
-public class ShowViewAction extends Action {
-    private static Logger _log = PDPlugin.getLogger(PropertiesViewAction.class);
-    private final String _viewId;
-    
-    /**
-     * @param text
-     * @param viewId
-     */
-    public ShowViewAction(String text, String viewId) 
-    {
-        _viewId = viewId;
-        setText(text);
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jface.action.IAction#run()
-     */
-    public void run() {
-        try {
-            getPage().showView(_viewId);
-        } catch (PartInitException e) {
-            _log.info("Open the view: "+_viewId, e); //$NON-NLS-1$
-        }
-
-    }
-
-    private IWorkbenchPage getPage() {
-        IWorkbench workbench = PlatformUI.getWorkbench();
-        IWorkbenchWindow window = workbench.getActiveWorkbenchWindow();
-        return window.getActivePage();
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/SkinsMenuItemBuilder.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/SkinsMenuItemBuilder.java
deleted file mode 100644
index 78ea5b1..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/SkinsMenuItemBuilder.java
+++ /dev/null
@@ -1,233 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2009 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.editors.actions;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jst.jsf.common.metadata.Model;
-import org.eclipse.jst.jsf.common.metadata.Trait;
-import org.eclipse.jst.jsf.common.metadata.internal.TraitValueHelper;
-import org.eclipse.jst.jsf.common.metadata.query.ITaglibDomainMetaDataModelContext;
-import org.eclipse.jst.jsf.common.metadata.query.TaglibDomainMetaDataQueryHelper;
-import org.eclipse.jst.pagedesigner.dtresourceprovider.DTResourceProviderFactory;
-import org.eclipse.jst.pagedesigner.dtresourceprovider.DTSkinManager;
-import org.eclipse.jst.pagedesigner.dtresourceprovider.IDTResourceProvider;
-import org.eclipse.jst.pagedesigner.dtresourceprovider.IDTSkin;
-import org.eclipse.jst.pagedesigner.utils.EditorUtil;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.MenuItem;
-import org.eclipse.ui.IWorkbenchActionConstants;
-
-/**
- * Builds menu items for managing skins.
- * 
- * @author Ian Trimble - Oracle
- */
-public class SkinsMenuItemBuilder {
-
-	private static final String DATAKEY_DTSKIN = "DATAKEY_DTSKIN"; //$NON-NLS-1$
-	private static final String DATAKEY_NSURI = "DTATKEY_NSURI"; //$NON-NLS-1$
-
-	private static List<Menu> menuList = new ArrayList<Menu>();
-
-	private IProject project;
-
-	/**
-	 * Constructs an instance.
-	 * 
-	 * @param project IProject instance for which to get skin information.
-	 */
-	public SkinsMenuItemBuilder(IProject project) {
-		this.project = project;
-	}
-
-	/**
-	 * Builds menu items (adds a separator and then menu items to end of
-	 * specified menu.
-	 * 
-	 * @param menu Menu instance to which to add menu items.
-	 */
-	public void buildMenuItems(Menu menu) {
-		for (Menu oldMenu: menuList) {
-			oldMenu.dispose();
-		}
-		if (menu != null) {
-			List<TaglibData> taglibDataList = getTaglibDataList();
-			if (taglibDataList.size() > 0) {
-				new MenuItem(menu, SWT.SEPARATOR);
-			}
-			for (TaglibData taglibData: taglibDataList) {
-				String nsURI = taglibData.getNSURI();
-				DTSkinManager dtSkinManager = DTSkinManager.getInstance(project);
-				IDTSkin currentDTSkin = dtSkinManager.getCurrentSkin(nsURI);
-				MenuItem menuItem = new MenuItem(menu, SWT.CASCADE);
-				menuItem.setText(taglibData.getName());
-				Menu skinMenu = new Menu(menuItem);
-				menuList.add(skinMenu);
-				menuItem.setMenu(skinMenu);
-				List<IDTSkin> dtSkins = dtSkinManager.getSkins(nsURI);
-				for (IDTSkin dtSkin: dtSkins) {
-					MenuItem skinMenuItem;
-					if (currentDTSkin == dtSkin) {
-						skinMenuItem = new MenuItem(skinMenu, SWT.CHECK);
-						skinMenuItem.setSelection(true);
-					} else {
-						skinMenuItem = new MenuItem(skinMenu, SWT.PUSH);
-					}
-					skinMenuItem.setText(dtSkin.getName());
-					skinMenuItem.setData(DATAKEY_DTSKIN, dtSkin);
-					skinMenuItem.setData(DATAKEY_NSURI, nsURI);
-					skinMenuItem.addSelectionListener(new SkinSelectionListener());
-				}
-			}
-		}
-	}
-
-	/**
-	 * Builds menu managers.
-	 * 
-	 * @param parent Parent menu manager to which to append new menu managers.
-	 */
-	public void buildMenuManagers(IMenuManager parent) {
-		List<TaglibData> taglibDataList = getTaglibDataList();
-		if (taglibDataList.size() > 0) {
-			parent.appendToGroup(IWorkbenchActionConstants.MB_ADDITIONS, new Separator());
-		}
-		for (TaglibData taglibData: taglibDataList) {
-			String nsURI = taglibData.getNSURI();
-			MenuManager newMgr = new MenuManager(taglibData.getName());
-			DTSkinManager dtSkinManager = DTSkinManager.getInstance(project);
-			IDTSkin currentDTSkin = dtSkinManager.getCurrentSkin(nsURI);
-			List<IDTSkin> dtSkins = dtSkinManager.getSkins(nsURI);
-			for (IDTSkin dtSkin: dtSkins) {
-				newMgr.add(new ChangeCurrentSkinAction(nsURI, dtSkin, dtSkin == currentDTSkin));
-			}
-			parent.appendToGroup(IWorkbenchActionConstants.MB_ADDITIONS, newMgr);
-		}
-	}
-
-	private List<TaglibData> getTaglibDataList() {
-		List<TaglibData> taglibDataList = new ArrayList<TaglibData>();
-		List<IDTResourceProvider> dtResourceProviders =
-			DTResourceProviderFactory.getInstance().getActiveDTResourceProviders(project);
-		for (IDTResourceProvider dtResourceProvider: dtResourceProviders) {
-			TaglibData taglibData = new TaglibData(dtResourceProvider.getId());
-			if (!taglibDataList.contains(taglibData)) {
-				taglibDataList.add(taglibData);
-			}
-		}
-		return taglibDataList;
-	}
-
-
-
-	/**
-	 * Used to hold and pass taglib-related data.
-	 */
-	private class TaglibData {
-		private String nsURI;
-		private String name;
-		public TaglibData(String nsURI) {
-			this.nsURI = nsURI;
-			ITaglibDomainMetaDataModelContext modelContext = TaglibDomainMetaDataQueryHelper.createMetaDataModelContext(project, nsURI);
-			Model model = TaglibDomainMetaDataQueryHelper.getModel(modelContext);
-			Trait trait = TaglibDomainMetaDataQueryHelper.getTrait(model, "display-label"); //$NON-NLS-1$
-			this.name = TraitValueHelper.getValueAsString(trait);
-		}
-		public String getNSURI() {
-			return nsURI;
-		}
-		public String getName() {
-			return name;
-		}
-		/*
-		 * (non-Javadoc)
-		 * @see java.lang.Object#hashCode()
-		 */
-		public int hashCode() {
-			int nsURIHashCode = 0;
-			if (nsURI != null) {
-				nsURIHashCode = nsURI.hashCode();
-			}
-			int nameHashCode = 0;
-			if (name != null) {
-				nameHashCode = name.hashCode();
-			}
-			return nameHashCode | nsURIHashCode ;
-		}
-	}
-
-
-
-	/**
-	 * Selection listener for skin menu items.
-	 */
-	private class SkinSelectionListener implements SelectionListener {
-		/*
-		 * (non-Javadoc)
-		 * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
-		 */
-		public void widgetSelected(SelectionEvent event) {
-			String nsURI = (String)event.widget.getData(DATAKEY_NSURI);
-			IDTSkin dtSkin = (IDTSkin)event.widget.getData(DATAKEY_DTSKIN);
-			DTSkinManager.getInstance(project).setCurrentSkin(nsURI, dtSkin);
-			EditorUtil.refreshAllWPEDesignViewers();
-		}
-		/*
-		 * (non-Javadoc)
-		 * @see org.eclipse.swt.events.SelectionListener#widgetDefaultSelected(org.eclipse.swt.events.SelectionEvent)
-		 */
-		public void widgetDefaultSelected(SelectionEvent event) {
-			widgetSelected(event);
-		}
-	}
-
-
-
-	/**
-	 * Action for changing current skin.
-	 */
-	private class ChangeCurrentSkinAction extends Action {
-		private String nsURI;
-		private IDTSkin dtSkin;
-		/**
-		 * Creates an instance.
-		 * 
-		 * @param nsURI NSURI of taglib.
-		 * @param dtSkin IDTSkin instance.
-		 * @param checked true if IDTSkin instance is current for nsURI.
-		 */
-		public ChangeCurrentSkinAction(String nsURI, IDTSkin dtSkin, boolean checked) {
-			super(dtSkin.getName());
-			this.nsURI = nsURI;
-			this.dtSkin = dtSkin;
-			setChecked(checked);
-		}
-		/*
-		 * (non-Javadoc)
-		 * @see org.eclipse.jface.action.Action#run()
-		 */
-		public void run() {
-			DTSkinManager.getInstance(project).setCurrentSkin(nsURI, dtSkin);
-			EditorUtil.refreshAllWPEDesignViewers();
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/SourcePageActionContributor.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/SourcePageActionContributor.java
deleted file mode 100644
index 7d48737..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/SourcePageActionContributor.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.actions;
-
-import org.eclipse.jst.pagedesigner.editors.HTMLEditor;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.texteditor.ITextEditor;
-import org.eclipse.ui.texteditor.ITextEditorActionConstants;
-import org.eclipse.wst.xml.ui.internal.actions.ActionContributorXML;
-
-/**
- * SourcePageActionContributor
- * 
- * This class is for multi page editor's source page contributor.
- * 
- * Use XMLEditorActionContributor for single page editor.
- */
-public class SourcePageActionContributor extends ActionContributorXML {
-
-	private IActionBars fBars;
-
-	/**
-	 * This method calls:
-	 * <ul>
-	 * <li><code>contributeToMenu</code> with <code>bars</code>' menu
-	 * manager</li>
-	 * <li><code>contributeToToolBar</code> with <code>bars</code>' tool
-	 * bar manager</li>
-	 * <li><code>contributeToStatusLine</code> with <code>bars</code>'
-	 * status line manager</li>
-	 * </ul>
-	 * The given action bars are also remembered and made accessible via
-	 * <code>getActionBars</code>.
-	 * 
-	 * @param bars
-	 *            the action bars
-	 * 
-	 */
-	public void init(IActionBars bars) {
-		fBars = bars;
-		contributeToMenu(bars.getMenuManager());
-		contributeToToolBar(bars.getToolBarManager());
-		contributeToStatusLine(bars.getStatusLineManager());
-	}
-
-	/**
-	 * Returns this contributor's action bars.
-	 * 
-	 * @return the action bars
-	 */
-	public IActionBars getActionBars() {
-		return fBars;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.sse.ui.internal.ISourceViewerActionBarContributor#setViewerSpecificContributionsEnabled(boolean)
-	 */
-	public void setViewerSpecificContributionsEnabled(boolean enabled) {
-		super.setViewerSpecificContributionsEnabled(enabled);
-		IEditorPart editor = getActiveEditorPart();
-		ITextEditor targetEditor = null;
-		if (editor instanceof ITextEditor) {
-			targetEditor = (ITextEditor) editor;
-		} else if (editor instanceof HTMLEditor) {
-			targetEditor = ((HTMLEditor) editor).getTextEditor();
-		}
-		if (targetEditor != null) {
-			if (enabled) {
-				getActionBars()
-						.setGlobalActionHandler(
-								ITextEditorActionConstants.UNDO,
-								targetEditor
-										.getAction(ITextEditorActionConstants.UNDO));
-				getActionBars()
-						.setGlobalActionHandler(
-								ITextEditorActionConstants.REDO,
-								targetEditor
-										.getAction(ITextEditorActionConstants.REDO));
-			} else {
-				getActionBars().setGlobalActionHandler(
-						ITextEditorActionConstants.UNDO, null);
-				getActionBars().setGlobalActionHandler(
-						ITextEditorActionConstants.REDO, null);
-			}
-
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/pagedesigner/DelegatingZoomManager.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/pagedesigner/DelegatingZoomManager.java
deleted file mode 100644
index d67d8f9..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/pagedesigner/DelegatingZoomManager.java
+++ /dev/null
@@ -1,374 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.pagedesigner;
-
-import org.eclipse.core.runtime.ListenerList;
-import org.eclipse.draw2d.ScalableFigure;
-import org.eclipse.draw2d.Viewport;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.editparts.ZoomListener;
-import org.eclipse.gef.editparts.ZoomManager;
-
-/**
- * A delegating ZoomManager.
- */
-public class DelegatingZoomManager extends ZoomManager implements ZoomListener {
-	/** the current ZoomManager all work is delegated to */
-	private final static int DEFAULT_ZOOM = 1;
-
-	private final static String ZOOM_AS_TEXT = "100%"; //$NON-NLS-1$
-
-	private final static String ZOOM_LEVEL_AS_TEXT = "100%"; //$NON-NLS-1$
-
-	private ZoomManager _currentZoomManager;
-
-	/** listeners */
-	private ListenerList _zoomListeners = new ListenerList(ListenerList.IDENTITY);
-
-	/**
-	 * Creates a new DelegatingZoomManager instance.
-	 */
-	public DelegatingZoomManager() {
-		super((ScalableFigure) null, (Viewport) null);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.ZoomListener#zoomChanged(double)
-	 */
-	public void zoomChanged(double zoom) {
-		Object[] listeners = _zoomListeners.getListeners();
-		for (int i = 0; i < listeners.length; ++i) {
-			((ZoomListener) listeners[i]).zoomChanged(zoom);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.ZoomManager#addZoomListener(org.eclipse.gef.editparts.ZoomListener)
-	 */
-	public void addZoomListener(ZoomListener listener) {
-		_zoomListeners.add(listener);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.ZoomManager#removeZoomListener(org.eclipse.gef.editparts.ZoomListener)
-	 */
-	public void removeZoomListener(ZoomListener listener) {
-		_zoomListeners.remove(listener);
-	}
-
-	/**
-	 * Sets the ZoomManager all work should be delegated to.
-	 * 
-	 * @param zoomManager
-	 */
-	public void setCurrentZoomManager(ZoomManager zoomManager) {
-		if (null != _currentZoomManager) {
-			_currentZoomManager.removeZoomListener(this);
-		}
-
-		_currentZoomManager = zoomManager;
-		if (null != _currentZoomManager) {
-			_currentZoomManager.addZoomListener(this);
-			zoomChanged(_currentZoomManager.getZoom());
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.ZoomManager#canZoomIn()
-	 */
-	public boolean canZoomIn() {
-		if (null == _currentZoomManager) {
-			return false;
-		}
-		return _currentZoomManager.canZoomIn();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.ZoomManager#canZoomOut()
-	 */
-	public boolean canZoomOut() {
-		if (null == _currentZoomManager) {
-			return false;
-		}
-		return _currentZoomManager.canZoomOut();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.ZoomManager#getMaxZoom()
-	 */
-	public double getMaxZoom() {
-		if (null == _currentZoomManager) {
-			return DEFAULT_ZOOM;
-		}
-
-		return _currentZoomManager.getMaxZoom();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.ZoomManager#getMinZoom()
-	 */
-	public double getMinZoom() {
-		if (null == _currentZoomManager) {
-			return DEFAULT_ZOOM;
-		}
-		return _currentZoomManager.getMinZoom();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.ZoomManager#getNextZoomLevel()
-	 */
-	public double getNextZoomLevel() {
-		if (null == _currentZoomManager) {
-			return DEFAULT_ZOOM;
-		}
-		return _currentZoomManager.getNextZoomLevel();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.ZoomManager#getPreviousZoomLevel()
-	 */
-	public double getPreviousZoomLevel() {
-		if (null == _currentZoomManager) {
-			return DEFAULT_ZOOM;
-		}
-		return _currentZoomManager.getPreviousZoomLevel();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.ZoomManager#getScalableFigure()
-	 */
-	public ScalableFigure getScalableFigure() {
-		if (null == _currentZoomManager) {
-			return null;
-		}
-
-		return _currentZoomManager.getScalableFigure();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.ZoomManager#getUIMultiplier()
-	 */
-	public double getUIMultiplier() {
-		if (null == _currentZoomManager) {
-			return DEFAULT_ZOOM;
-		}
-
-		return _currentZoomManager.getUIMultiplier();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.ZoomManager#getViewport()
-	 */
-	public Viewport getViewport() {
-		if (null == _currentZoomManager) {
-			return null;
-		}
-
-		return _currentZoomManager.getViewport();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.ZoomManager#getZoom()
-	 */
-	public double getZoom() {
-		if (null == _currentZoomManager) {
-			return DEFAULT_ZOOM;
-		}
-
-		return _currentZoomManager.getZoom();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.ZoomManager#getZoomAsText()
-	 */
-	public String getZoomAsText() {
-		if (null == _currentZoomManager) {
-			return ZOOM_AS_TEXT;
-		}
-		//$NON-NLS-1$
-
-		return _currentZoomManager.getZoomAsText();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.ZoomManager#getZoomLevels()
-	 */
-	public double[] getZoomLevels() {
-		if (null == _currentZoomManager) {
-			return new double[] { DEFAULT_ZOOM };
-		}
-
-		return _currentZoomManager.getZoomLevels();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.ZoomManager#getZoomLevelsAsText()
-	 */
-	public String[] getZoomLevelsAsText() {
-		if (null == _currentZoomManager) {
-			return new String[] { ZOOM_LEVEL_AS_TEXT };
-		}
-
-		return _currentZoomManager.getZoomLevelsAsText();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.ZoomManager#setUIMultiplier(double)
-	 */
-	public void setUIMultiplier(double multiplier) {
-		if (null == _currentZoomManager) {
-			return;
-		}
-
-		_currentZoomManager.setUIMultiplier(multiplier);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.ZoomManager#setViewLocation(org.eclipse.draw2d.geometry.Point)
-	 */
-	public void setViewLocation(Point p) {
-		if (null == _currentZoomManager) {
-			return;
-		}
-
-		_currentZoomManager.setViewLocation(p);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.ZoomManager#setZoom(double)
-	 */
-	public void setZoom(double zoom) {
-		if (null == _currentZoomManager) {
-			return;
-		}
-
-		_currentZoomManager.setZoom(zoom);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.ZoomManager#setZoomAnimationStyle(int)
-	 */
-	public void setZoomAnimationStyle(int style) {
-		if (null == _currentZoomManager) {
-			return;
-		}
-
-		_currentZoomManager.setZoomAnimationStyle(style);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.ZoomManager#setZoomAsText(java.lang.String)
-	 */
-	public void setZoomAsText(String zoomString) {
-		if (null == _currentZoomManager) {
-			return;
-		}
-
-		_currentZoomManager.setZoomAsText(zoomString);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.ZoomManager#setZoomLevels(double[])
-	 */
-	public void setZoomLevels(double[] zoomLevels) {
-		if (null == _currentZoomManager) {
-			return;
-		}
-
-		_currentZoomManager.setZoomLevels(zoomLevels);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.ZoomManager#zoomIn()
-	 */
-	public void zoomIn() {
-		if (null == _currentZoomManager) {
-			return;
-		}
-
-		_currentZoomManager.zoomIn();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.ZoomManager#zoomOut()
-	 */
-	public void zoomOut() {
-		if (null == _currentZoomManager) {
-			return;
-		}
-
-		_currentZoomManager.zoomOut();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.ZoomManager#zoomTo(org.eclipse.draw2d.geometry.Rectangle)
-	 */
-	public void zoomTo(Rectangle rect) {
-		if (null == _currentZoomManager) {
-			return;
-		}
-
-		_currentZoomManager.zoomTo(rect);
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/pagedesigner/IPageDesignerConstants.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/pagedesigner/IPageDesignerConstants.java
deleted file mode 100644
index bedef53..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/pagedesigner/IPageDesignerConstants.java
+++ /dev/null
@@ -1,290 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.pagedesigner;
-
-/**
- * The designer constants
- * 
- * TODO: dead?
- *
- */
-interface IPageDesignerConstants {
-	/**
-	 * JSP UI Component Tag Node
-	 */
-	public static final String DEFAULT_TAG_NAME = "tagname"; //$NON-NLS-1$
-
-	/**
-	 * keyword
-	 */
-	public static final String ATTR_TYPE_CDATA = "CDATA"; //$NON-NLS-1$
-
-	/**
-	 * basename attribute
-	 */
-	public static final String ATTR_LOADBUNDLE_1 = "basename"; //$NON-NLS-1$
-
-	/**
-	 * var attribute
-	 */
-	public static final String ATTR_LOADBUNDLE_2 = "var"; //$NON-NLS-1$
-
-	/**
-	 * columns attribute
-	 */
-	public static final String ATTR_PANELGRID_1 = "columns"; //$NON-NLS-1$
-
-	/**
-	 * summary attribute
-	 */
-	public static final String ATTR_PANELGRID_2 = "summary"; //$NON-NLS-1$
-
-	/**
-	 * title attribute
-	 */
-	public static final String ATTR_PANELGRID_3 = "title"; //$NON-NLS-1$
-
-	/**
-	 * action attribute
-	 */
-	public static final String ATTR_BUTTON_1 = "action"; //$NON-NLS-1$
-
-	/**
-	 * value attribute
-	 */
-	public static final String ATTR_BUTTON_2 = "value"; //$NON-NLS-1$
-
-	/**
-	 * url attribute
-	 */
-	public static final String ATTR_GRAPHICIMAGE_1 = "url"; //$NON-NLS-1$
-
-	/**
-	 * binding attribute
-	 */
-	public static final String ATTR_GRAPHICIMAGE_2 = "binding"; //$NON-NLS-1$
-
-	/**
-	 * binding attribute
-	 */
-	public static final String ATTR_OUTPUTTEXT_1 = "binding"; //$NON-NLS-1$
-
-	/**
-	 * value attribute
-	 */
-	public static final String ATTR_OUTPUTTEXT_2 = "value"; //$NON-NLS-1$
-
-	/**
-	 * styleClass attribute
-	 */
-	public static final String ATTR_OUTPUTTEXT_3 = "styleClass"; //$NON-NLS-1$
-
-	/**
-	 * dataWindowBean attribute
-	 */
-	public static final String ATTR_DATAWINDOW_1 = "dataWindowBean"; //$NON-NLS-1$
-
-	/**
-	 * scriptName attribute
-	 */
-	public static final String ATTR_DATAWINDOW_2 = "scriptName"; //$NON-NLS-1$
-
-	/**
-	 * page attribute
-	 */
-	public static final String ATTR_INCLUDE = "page"; //$NON-NLS-1$
-
-	/**
-	 * prefix atttribute
-	 */
-	public static final String ATTR_TAGLIB_1 = "prefix"; //$NON-NLS-1$
-
-	/**
-	 * uri attribute
-	 */
-	public static final String ATTR_TAGLIB_2 = "uri"; //$NON-NLS-1$
-
-	/**
-	 * bundle attribute
-	 */
-	public static final String RESOURCE_BUNDLE_MARK = "bundle"; //$NON-NLS-1$
-
-	/**
-	 * value attribute
-	 */
-	public static final String ATTR_RESOURCE_BUNDLE = "value"; //$NON-NLS-1$
-
-	/**
-	 * value attribute
-	 */
-	public static final String ATTR_FACET = "value"; //$NON-NLS-1$
-
-	/**
-	 * view tag
-	 */
-	public static final String TAG_VIEW_TYPE = "view"; //$NON-NLS-1$
-
-	/**
-	 * for tag
-	 */
-	public static final String TAG_FORM_TYPE = "form"; //$NON-NLS-1$
-
-	/**
-	 * text tag
-	 */
-	public static final String TAG_TEXT_TYPE = "text"; //$NON-NLS-1$
-
-	/**
-	 * loadBundle tag
-	 */
-	public static final String TAG_LOADBUNDLE_TYPE = "loadBundle"; //$NON-NLS-1$
-
-	/**
-	 * panelGrid tag
-	 */
-	public static final String TAG_PANELGRID_TYPE = "panelGrid"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String TAG_IMAGE_TYPE = "image"; //$NON-NLS-1$
-
-	/**
-	 * outputText tag
-	 */
-	public static final String TAG_OUTPUTTEXT_TYPE = "outputText"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String TAG_BUTTON_TYPE = "button"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String TAG_DATAWINDOW_TYPE = "datawindow"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String TAG_TAGLIB_TYPE = "taglib"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String TAG_INCLUDE_TYPE = "include"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String TAG_OTHERS_TYPE = ""; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String TAG_NAME_VIEW = "view"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String TAG_NAME_FORM = "form"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String TAG_NAME_PANELGRID = "panelGrid"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String TAG_NAME_PANELGROUP = "panelGroup"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String TAG_NAME_FACET = "facet"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String TAG_NAME_DATAWINDOW = "dataWindow"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String TAG_NAME_OUTPUTTEXT = "outputText"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String TAG_NAME_INCLUDE = "include"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String TAG_NAME_LOADBUNDLE = "loadBundle"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String TAG_NAME_TAGLIB = "taglib"; //$NON-NLS-1$
-
-	/**
-	 * graphicImage tag
-	 */
-	public static final String TAG_NAME_GRAPHICIMAGE = "graphicImage"; //$NON-NLS-1$
-
-	/**
-	 * commandButton tag
-	 */
-	public static final String TAG_NAME_COMMANDBUTTON = "commandButton"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String REQUEST_TYPE_SELECT = "selection"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final int EOF = -1;
-
-	/**
-	 * 
-	 */
-	public static final char CHAR_TAB = '\t';
-
-	/**
-	 * 
-	 */
-	public static final char CHAR_N_RETURN = '\n';
-
-	/**
-	 * 
-	 */
-	public static final String STRING_N_RETURN = "\n"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String STRING_BLANK = " "; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final char CHAR_BLANK = ' ';
-
-	/**
-	 * 
-	 */
-	public static final String FONT_NAME_HELVETICA = "Helvetica"; //$NON-NLS-1$
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/pagedesigner/JSPEditorMessages.properties b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/pagedesigner/JSPEditorMessages.properties
deleted file mode 100644
index beecba5..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/pagedesigner/JSPEditorMessages.properties
+++ /dev/null
@@ -1,23 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-JSFPalette.DefaultGroup.LabelJSFPallete=Controls
-JSPSourceEditor.Page.Preview.PageText=Preview
-
-CommonResourceDialog.statusMessage=Select an image file
-ResourcesOnClasspathDialog.statusMessage=Select a property file
-TreeViewerSelectionDialog.Title=Select a file
-RangeSelectionTool.CommandLabel.Insert=Insert
-
-DesignerPaletteCustomizerDialog.label.import=Import
-DesignerPaletteCustomizerDialog.label.export=Export
-
-DesignerSourceDropTargetListener.InserCommandLabel=Create New Item
-SourceViewLocalDropCommand.Label.InsertSyntax=Insert Syntax
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/pagedesigner/MessageFormater.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/pagedesigner/MessageFormater.java
deleted file mode 100644
index c05fabd..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/pagedesigner/MessageFormater.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.pagedesigner;
-
-import java.text.MessageFormat;
-
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-
-/**
- * @A tool class for message format
- */
-public final class MessageFormater {
-	private static Logger _log = PDPlugin.getLogger(MessageFormater.class);
-
-	/**
-	 * 
-	 * @param message
-	 *            the parts for filling is {number}
-	 * @param o1
-	 * @return the formatted string
-	 */
-	public static String format(String message, Object o1) {
-		try {
-			Object[] args = new Object[] { o1 };
-			MessageFormat formatter = new MessageFormat(message);
-			return formatter.format(args);
-		} catch (Exception e) {
-			_log.error("Log.Error.MessageFormater.Format0", e); //$NON-NLS-1$
-			return ""; //$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * @param message
-	 * @param o1
-	 * @param o2
-	 * @return the formatted string
-	 */
-	public static String format(String message, Object o1, Object o2) {
-		try {
-			Object[] args = new Object[] { o1, o2 };
-			MessageFormat formatter = new MessageFormat(message);
-			return formatter.format(args);
-		} catch (Exception e) {
-			_log.error("Log.Error.MessageFormater.Format0", e); //$NON-NLS-1$
-			return ""; //$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * @param message
-	 * @param o1
-	 * @param o2
-	 * @param o3
-	 * @return the formatted string
-	 */
-	public static String format(String message, Object o1, Object o2, Object o3) {
-		try {
-			Object[] args = new Object[] { o1, o2, o3 };
-			MessageFormat formatter = new MessageFormat(message);
-			return formatter.format(args);
-		} catch (Exception e) {
-			_log.error("Log.Error.MessageFormater.Format0", e); //$NON-NLS-1$
-			return ""; //$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * @param message
-	 * @param o
-	 * @return the formatted string
-	 */
-	public static String format(String message, Object o[]) {
-		try {
-			MessageFormat formater = new MessageFormat(message);
-			return formater.format(o);
-		} catch (Exception e) {
-			_log.error("Log.Error.MessageFormater.Format0", e); //$NON-NLS-1$
-			return ""; //$NON-NLS-1$
-		}
-	}
-	
-	private MessageFormater()
-	{
-	    // util class, no instantiation
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/pagedesigner/PageDesignerResources.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/pagedesigner/PageDesignerResources.java
deleted file mode 100644
index ec83204..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/pagedesigner/PageDesignerResources.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.pagedesigner;
-
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.jsf.common.ui.internal.utils.ResourceUtils;
-import org.eclipse.jst.pagedesigner.IJMTConstants;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-
-/**
- * @author mengbo
- */
-public class PageDesignerResources extends ResourceUtils {
-	private static Logger _log = PDPlugin
-			.getLogger(PageDesignerResources.class);
-
-	private static PageDesignerResources _resource; // singleton
-
-	/**
-	 * Empty Constructor.
-	 */
-	protected PageDesignerResources() {
-		try {
-			_resources = ResourceBundle
-					.getBundle(IJMTConstants.PAGEDESIGNER_RESOURCE_BUNDLE_FILE);
-			// NOTE: this throws a runtime "MissingResourceException".
-		} catch (MissingResourceException ee) {
-			// catch this and the error is reported in setBundle.
-			// Log.Error.PageDesignerResources.Open=Error in getting source
-			// bundle
-			_log.error("Log.Error.PageDesignerResources.Open", ee); //$NON-NLS-1$
-		}
-		setBundle(_resources, IJMTConstants.PAGEDESIGNER_RESOURCE_BUNDLE_FILE);
-	}
-
-	/**
-	 * @return the singleton
-	 */
-	public static PageDesignerResources getInstance() {
-		if (_resource == null) {
-			_resource = new PageDesignerResources();
-		}
-		return _resource;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/AbstractPaletteFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/AbstractPaletteFactory.java
deleted file mode 100644
index 646bdd5..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/AbstractPaletteFactory.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2009 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.palette;
-
-import org.eclipse.gef.EditDomain;
-import org.eclipse.gef.palette.PaletteRoot;
-import org.eclipse.gef.ui.palette.PaletteViewerProvider;
-import org.eclipse.gef.ui.views.palette.PaletteViewerPage;
-import org.eclipse.ui.IEditorInput;
-
-/**
- * Abstract class that all extenders must use to provide alternate palettes
- * to the Web Page Editor.  See also {@link IPaletteFactory}
- */
-public abstract class AbstractPaletteFactory implements IPaletteFactory {
-
-	public PaletteViewerPage createPaletteViewerPage(PaletteViewerProvider provider) {return null;}
-	public PaletteViewerProvider createPaletteViewerProvider(EditDomain domain) {return null;}
-	public PaletteRoot createPaletteRoot(IEditorInput editorInput){return null;}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/DesignerPaletteCustomizationsHelper.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/DesignerPaletteCustomizationsHelper.java
deleted file mode 100644
index ff887fc..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/DesignerPaletteCustomizationsHelper.java
+++ /dev/null
@@ -1,223 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.palette;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.util.Iterator;
-
-import javax.xml.parsers.DocumentBuilder;
-
-import org.eclipse.gef.palette.PaletteEntry;
-import org.eclipse.gef.ui.palette.PaletteCustomizer;
-import org.eclipse.gef.ui.palette.PaletteViewer;
-import org.eclipse.gef.ui.palette.customize.PaletteCustomizerDialog;
-import org.eclipse.jface.preference.IPersistentPreferenceStore;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.editors.palette.impl.PaletteItemManager;
-import org.eclipse.jst.pagedesigner.editors.palette.impl.TaglibPaletteDrawer;
-import org.eclipse.jst.pagedesigner.utils.XMLUtil;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.xml.sax.SAXException;
-
-/**
- * Helper class that all clients should use when dealing with palette customizations 
- */
-public final class DesignerPaletteCustomizationsHelper {
-	private static final String PREFS_TAGLIBHIDE_PREFIX = "hidden_taglib:"; //$NON-NLS-1$
-
-	private static Logger _log = PDPlugin.getLogger(DesignerPaletteCustomizationsHelper.class);
-	
-	/**
-	 * @return new DesignerPaletteCustomizer
-	 */
-	public static DesignerPaletteCustomizer getNewCustomizer(){
-		return new DesignerPaletteCustomizer();
-	}
-	
-	/**
-	 * @param paletteViewer
-	 * @param paletteCustomizer
-	 * @return new DesignerPaletteCustomizerDialog
-	 */
-	public static PaletteCustomizerDialog getNewCustomizerDialog(PaletteViewer paletteViewer, PaletteCustomizer paletteCustomizer){
-		return new DesignerPaletteCustomizerDialog(
-				paletteViewer.getControl().getShell(), paletteCustomizer, (DesignerPaletteRoot)paletteViewer.getPaletteRoot());
-
-	}
-	
-	/**
-	 * Save palette item customizations
-	 * @param paletteRoot
-	 */
-	public static void save(DesignerPaletteRoot paletteRoot) {
-		IPersistentPreferenceStore prefs = getPreferenceStore();
-
-		for (Iterator it=paletteRoot.getChildren().iterator();it.hasNext();){
-			PaletteEntry entry = (PaletteEntry)it.next();
-			if (entry instanceof TaglibPaletteDrawer){
-				TaglibPaletteDrawer pd = (TaglibPaletteDrawer)entry;
-				prefs.putValue(PREFS_TAGLIBHIDE_PREFIX + pd.getURI(), Boolean.toString(! pd.isVisible()));
-			}
-		}
-		PaletteItemManager.notifyPaletteItemManagersOfCustomizationsUpdate(paletteRoot.getPaletteManager());
-		
-	}
-	
-	/**
-	 * Load user customizations
-	 * @param paletteItemManager
-	 */
-	public static void loadUserCustomizations(IPaletteItemManager paletteItemManager) {
-		IPreferenceStore store = getPreferenceStore();
-		for (Iterator it=paletteItemManager.getAllCategories().iterator();it.hasNext();){
-			TaglibPaletteDrawer tld = (TaglibPaletteDrawer)it.next();
-			if (store.contains(PREFS_TAGLIBHIDE_PREFIX+tld.getURI())){
-				tld.setVisible( ! store.getBoolean(PREFS_TAGLIBHIDE_PREFIX+tld.getURI()));
-			}
-		}
-	}
-	
-	/**
-	 * Hide a category (TaglibPaletteDrawer) that will be persisted as a customization
-	 * @param taglibPaletteDrawer
-	 */
-	public static void hideTaglibDrawer(TaglibPaletteDrawer taglibPaletteDrawer){
-		IPersistentPreferenceStore prefs = getPreferenceStore();
-		taglibPaletteDrawer.setVisible(false);
-		prefs.putValue(PREFS_TAGLIBHIDE_PREFIX + taglibPaletteDrawer.getURI(), Boolean.TRUE.toString());
-		save((DesignerPaletteRoot)taglibPaletteDrawer.getParent());
-	}
-	
-	private static IPersistentPreferenceStore getPreferenceStore() {
-		return (IPersistentPreferenceStore)PDPlugin.getDefault().getPreferenceStore();
-	}
-	
-	/**
-	 * Exports the current state of customizations of the current palette instance.
-	 * 
-	 * Unsaved data will be exported.
-	 * 
-	 * Currently only the "hide" flag of a category is exported.  All categories are exported.
-	 * 
-	 * @param paletteItemManager
-	 * @param filename
-	 */
-	public static void exportCustomizations(IPaletteItemManager paletteItemManager, String filename){
-
-		Document document = XMLUtil.getDocumentBuilder().getDOMImplementation()
-			.createDocument(null, IPaletteConstants.ROOT, null);
-		try {
-			FileOutputStream ostream = null;
-			int index = filename.lastIndexOf(File.separator);
-			String foldername = filename.substring(0, index); 
-			File folder = new File(foldername);
-			if (folder != null && !folder.exists()) {
-				folder.mkdir();
-			}
-			
-			ostream = new FileOutputStream(filename);
-
-			for (Iterator iter = paletteItemManager.getAllCategories().iterator(); iter.hasNext();) {
-				TaglibPaletteDrawer category = (TaglibPaletteDrawer) iter
-						.next();	
-				if (category == null) continue;
-
-				Element categoryElement = document.createElement(IPaletteConstants.CATEGORY_TAG);
-				categoryElement.setAttribute(IPaletteConstants.ID, category.getURI());
-				categoryElement.setAttribute(IPaletteConstants.ISHIDDEN, Boolean.toString(! category.isVisible()));
-				document.getDocumentElement().appendChild(categoryElement);
-			}
-			XMLUtil.serialize(document, ostream);
-			ostream.close();
-		} catch (IOException e) {
-			_log.error("DesignerPaletteCustomizationsHelper.save.error.IOException", e); //$NON-NLS-1$
-		}
-	}
-	
-	/**
-	 * Imports a palette customization export file.
-	 * 
-	 * If there are entries matching in the existing workspace customizations, they will be overridden.
-	 * 
-	 * @param customizer 
-	 * @param filename
-	 */
-	public static void importCustomizations(DesignerPaletteCustomizer customizer, String filename){
-		Document document = null;
-		try {
-			DocumentBuilder builder = XMLUtil.getDocumentBuilder();
-			if (builder != null) {
-				document = builder.parse(filename);
-			} else {
-				_log.error("DesignerPaletteCustomizationsHelper.importCustomizations.error.getDocumentBuilderFail");// $NON-NLS-1$ //$NON-NLS-1$
-			}
-		} catch (FileNotFoundException e) {
-			//should never get here as user chose file thru a file chooser dialog
-			_log.error(
-					"DesignerPaletteCustomizationsHelper.importCustomizations.error.FileNotFoundException");// $NON-NLS-1$ //$NON-NLS-1$
-			document = null;
-		} catch (IOException e) {
-			_log.error(
-					"DesignerPaletteCustomizationsHelper.importCustomizations.error.IOException", e.toString(), e); //$NON-NLS-1$
-		} catch (SAXException e) {
-			_log.error(
-					"DesignerPaletteCustomizationsHelper.importCustomizations.error.SAXException", e.toString(), e); //$NON-NLS-1$
-		}
-		if (document != null) {
-			Element root = document.getDocumentElement();
-			if (root != null) {
-				NodeList catetorylist = root.getChildNodes();
-				for (int i = 0, n = catetorylist.getLength(); i < n; i++) {
-					Node childNode = catetorylist.item(i);
-					if (childNode.getNodeType() == Node.ELEMENT_NODE
-							&& childNode.getNodeName().equals(
-									IPaletteConstants.CATEGORY_TAG)) {
-						
-						Element categoryElement = (Element) childNode;
-						//only checking for hidden flag currently
-						if (categoryElement.hasAttribute(IPaletteConstants.ISHIDDEN)){
-							boolean isHidden =Boolean.valueOf(categoryElement.getAttribute(IPaletteConstants.ISHIDDEN)).booleanValue();
-							
-							String uri = categoryElement.getAttribute(IPaletteConstants.ID);
-							applyImport(customizer, uri, isHidden);							
-						}
-						
-						
-					}
-				}
-			}
-		}
-	}
-
-	private static void applyImport(
-			DesignerPaletteCustomizer customizer, String uri, boolean isHidden) {
-		//apply the isHidden exported flag to the paletteRoot child if present 
-		for (Iterator it=customizer.getDesignerPaletteRoot().getChildren().iterator();it.hasNext();){
-			Object o = it.next();
-			if (o instanceof TaglibPaletteDrawer){
-				TaglibPaletteDrawer pd = (TaglibPaletteDrawer)o;
-				if (uri.equals(pd.getURI())){
-					pd.setVisible(! isHidden);
-					break;
-				}
-			}
-		}	
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/DesignerPaletteCustomizer.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/DesignerPaletteCustomizer.java
deleted file mode 100644
index 9656cd1..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/DesignerPaletteCustomizer.java
+++ /dev/null
@@ -1,164 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.palette;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.gef.palette.PaletteEntry;
-import org.eclipse.gef.ui.palette.PaletteCustomizer;
-import org.eclipse.gef.ui.palette.customize.PaletteSeparatorFactory;
-import org.eclipse.gef.ui.palette.customize.PaletteStackFactory;
-import org.eclipse.jst.pagedesigner.editors.palette.impl.PaletteItemManager;
-
-/**
- * @author mengbo
- */
-public class DesignerPaletteCustomizer extends PaletteCustomizer {
-
-	
-	private DesignerPaletteRoot root;
-
-	/**
-	 * Set the palette root.   Must be set before the customizer can be used
-	 * @param root
-	 */
-	public void setPaletteRoot(DesignerPaletteRoot root){
-		this.root = root;
-	}
-	
-	/**
-	 * Return the palette root for this customizer
-	 * @return DesignerPaletteRoot
-	 */
-	public DesignerPaletteRoot getDesignerPaletteRoot(){
-		return root;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.gef.ui.palette.PaletteCustomizer#canMoveDown(org.eclipse.gef.palette.PaletteEntry)
-	 */
-	public boolean canMoveDown(PaletteEntry entry) {
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.gef.ui.palette.PaletteCustomizer#canMoveUp(org.eclipse.gef.palette.PaletteEntry)
-	 */
-	public boolean canMoveUp(PaletteEntry entry) {
-		return false;
-	}
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.ui.palette.PaletteCustomizer#canMoveDown(org.eclipse.gef.palette.PaletteEntry)
-	 */
-//	public boolean canMoveDown(PaletteEntry entry) {
-//		if (!(entry instanceof PaletteDrawer)) {
-//			return false;
-//		}
-//		return super.canMoveDown(entry);
-//	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.ui.palette.PaletteCustomizer#canMoveUp(org.eclipse.gef.palette.PaletteEntry)
-	 */
-//	public boolean canMoveUp(PaletteEntry entry) {
-//		if (!(entry instanceof PaletteDrawer)) {
-//			return false;
-//		}
-//		if (entry.getParent().getChildren().indexOf(entry) == 1) {
-//			return false;
-//		}
-//		return super.canMoveUp(entry);
-//	}
-
-//	/*
-//	 * (non-Javadoc)
-//	 * 
-//	 * @see org.eclipse.gef.ui.palette.PaletteCustomizer#performMoveDown(org.eclipse.gef.palette.PaletteEntry)
-//	 */
-//	public void performMoveDown(PaletteEntry entry) {
-//		if (entry instanceof PaletteDrawer) {
-//			String id = entry.getId();
-//			TaglibPaletteDrawer cat = PaletteItemManager.getCurrentInstance().getTaglibPalletteDrawer(id);
-//			movedown(PaletteItemManager.getCurrentInstance(), cat);
-//			super.performMoveDown(entry);
-//		}
-//	}
-//	private void moveup(PaletteItemManager paletteItemManager, TaglibPaletteDrawer cat) {
-//		int i = paletteItemManager.getAllCategories().indexOf(cat);
-//		TaglibPaletteDrawer upCat = (TaglibPaletteDrawer) paletteItemManager.getAllCategories()
-//				.get(i - 1);
-//		movedown(paletteItemManager, upCat);
-//	}
-//
-//	private void movedown(PaletteItemManager paletteItemManager, TaglibPaletteDrawer cat) {
-//		int i = paletteItemManager.getAllCategories().indexOf(cat);
-//		paletteItemManager.getAllCategories().add(i + 2, cat);
-//		paletteItemManager.getAllCategories().remove(i);
-//	}
-//	/*
-//	 * (non-Javadoc)
-//	 * 
-//	 * @see org.eclipse.gef.ui.palette.PaletteCustomizer#performMoveUp(org.eclipse.gef.palette.PaletteEntry)
-//	 */
-//	public void performMoveUp(PaletteEntry entry) {
-//		if (entry instanceof PaletteDrawer) {
-//			String id = entry.getId();
-//			TaglibPaletteDrawer cat = PaletteItemManager.getCurrentInstance().getTaglibPalletteDrawer(id);
-//			moveup(PaletteItemManager.getCurrentInstance(), cat);
-//			super.performMoveUp(entry);
-//		}
-//	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.ui.palette.PaletteCustomizer#canDelete(org.eclipse.gef.palette.PaletteEntry)
-	 */
-	public boolean canDelete(PaletteEntry entry) {
-		return false;
-	}
-
-	public List getNewEntryFactories() {
-		List list = new ArrayList(4);
-		list.add(new PaletteSeparatorFactory());
-		list.add(new PaletteStackFactory());
-		return list;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.ui.palette.PaletteCustomizer#revertToSaved()
-	 */
-	public void revertToSaved() {
-		//note that reset is not currently part of IPaletteItemManager interface...
-		((PaletteItemManager)root.getPaletteManager()).reset();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.ui.palette.PaletteCustomizer#save()
-	 */
-	public void save() {
-		DesignerPaletteCustomizationsHelper.save(root);
-//		PaletteItemManager.getCurrentInstance().reset();
-	}
-
-
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/DesignerPaletteCustomizerDialog.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/DesignerPaletteCustomizerDialog.java
deleted file mode 100644
index 3689e5a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/DesignerPaletteCustomizerDialog.java
+++ /dev/null
@@ -1,363 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.palette;
-
-import java.beans.PropertyChangeEvent;
-import java.beans.PropertyChangeListener;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.gef.palette.PaletteEntry;
-import org.eclipse.gef.ui.palette.PaletteCustomizer;
-import org.eclipse.gef.ui.palette.customize.PaletteCustomizationAction;
-import org.eclipse.gef.ui.palette.customize.PaletteCustomizerDialog;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jst.jsf.common.ui.internal.utils.PluginImageHelper;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.editors.pagedesigner.PageDesignerResources;
-import org.eclipse.jst.pagedesigner.editors.palette.impl.PaletteItemManager;
-import org.eclipse.jst.pagedesigner.editors.palette.impl.TaglibPaletteDrawer;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.FileDialog;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * Customization dialog for Web Page Designer palette items
- * @author mengbo
- * @version 1.5
- */
-public class DesignerPaletteCustomizerDialog extends PaletteCustomizerDialog {
-	private static final String DEFAULT_CUSTOMIZATIONS_EXPORT_FILENAME = "WPDPaletteCustomizations.xml"; //$NON-NLS-1$
-	
-	private static String DEFAULTEXTENSION = ".xml";//$NON-NLS-1$ 
-
-	/**
-	 * Constructor
-	 * @param shell
-	 * @param customizer
-	 * @param root
-	 */
-	public DesignerPaletteCustomizerDialog(Shell shell,
-			PaletteCustomizer customizer, DesignerPaletteRoot root) {
-		super(shell, customizer, root);
-
-	}
-
-	private PropertyChangeListener applyButtonUpdater = new PropertyChangeListener() {
-
-
-		public void propertyChange(PropertyChangeEvent evt) {
-			Button applyButton = getButton(PaletteCustomizerDialog.APPLY_ID);
-			if (applyButton == null) {
-				return;
-			}
-			applyButton.setEnabled(true);
-		}
-	};
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.window.Window#open()
-	 */
-	public int open() {
-		// save the current state before open
-		// save();
-		return super.open();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.ui.palette.customize.PaletteCustomizerDialog#setActiveEntry(org.eclipse.gef.palette.PaletteEntry)
-	 */
-	protected void setActiveEntry(PaletteEntry entry) {
-		//remove listener on previous entry before adding to new entry
-		PaletteEntry pre = getSelectedPaletteEntry();
-		if (pre != null) {
-			pre.removePropertyChangeListener(applyButtonUpdater);
-		} else {
-			getButton(APPLY_ID).setEnabled(false);
-		}
-		
-		if (entry != null)
-			entry.addPropertyChangeListener(applyButtonUpdater);
-		
-		super.setActiveEntry(entry);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.ui.palette.customize.PaletteCustomizerDialog#save()
-	 */
-	protected void save() {
-		super.save();
-		Button applyButton = getButton(PaletteCustomizerDialog.APPLY_ID);
-		if (applyButton != null) {
-			applyButton.setEnabled(false);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.gef.ui.palette.customize.PaletteCustomizerDialog#createButtonsForButtonBar(org.eclipse.swt.widgets.Composite)
-	 */
-	protected void createButtonsForButtonBar(Composite parent) {
-		super.createButtonsForButtonBar(parent);
-		getButton(APPLY_ID).setEnabled(false);
-		// save();
-	}
-
-	/* (non-Javadoc)
-	 * Export action
-	 *
-	 */
-	private class ExportAction extends PaletteCustomizationAction {
-		
-		/**
-		 * Constructor
-		 */
-		public ExportAction() {
-			setEnabled(true);
-			setText(PageDesignerResources.getInstance().getString(
-					"DesignerPaletteCustomizerDialog.label.export")); //$NON-NLS-1$
-			setImageDescriptor(PluginImageHelper.getInstance()
-					.getImageDescriptor(DesignerPaletteImages.IMG_ELCL_EXPORT,
-							PDPlugin.getPluginId()));
-			setDisabledImageDescriptor(PluginImageHelper.getInstance()
-					.getImageDescriptor(DesignerPaletteImages.IMG_DLCL_EXPORT,
-							PDPlugin.getPluginId()));
-			setHoverImageDescriptor(PluginImageHelper.getInstance()
-					.getImageDescriptor(DesignerPaletteImages.IMG_CLCL_EXPORT,
-							PDPlugin.getPluginId()));
-		}
-
-		private void handleExport() {
-			final FileDialog fileDialog = new FileDialog(PDPlugin
-					.getActiveWorkbenchShell());
-			fileDialog.setFileName(DEFAULT_CUSTOMIZATIONS_EXPORT_FILENAME);
-			String[] filterExtensions = new String[2];
-			filterExtensions[0] = "*.xml"; //$NON-NLS-1$
-			filterExtensions[1] = "*.*"; //$NON-NLS-1$
-			fileDialog.setFilterExtensions(filterExtensions);
-			fileDialog.setText(Messages.DesignerPaletteCustomizerDialog_ExportCustomizations);
-			String filename = fileDialog.open();
-			if (filename != null) {
-				if (!filename.endsWith(DEFAULTEXTENSION)) {
-					filename = filename + DEFAULTEXTENSION;
-				}
-				final IPaletteContext context = PaletteItemManager.createPaletteContext(((DesignerPaletteRoot)getPaletteRoot()).getFile());
-				DesignerPaletteCustomizationsHelper
-					.exportCustomizations(PaletteItemManager.getInstance(context), filename);
-
-
-				updateActions();
-			}
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.action.Action#run()
-		 */
-		public void run() {
-			handleExport();
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.gef.ui.palette.customize.PaletteCustomizationAction#update()
-		 */
-		public void update() {
-			//boolean enabled = false;
-//			PaletteEntry entry = getSelectedPaletteEntry();
-//			if (entry != null) {
-				// if (getCustomizer() instanceof DesignerPaletteCustomizer)
-				// enabled = ((DesignerPaletteCustomizer)
-				// getCustomizer()).canExport(entry);
-//			}
-			setEnabled(true);
-		}
-
-	}
-
-	/* (non-Javadoc)
-	 * Import action
-	 */
-	private class ImportAction extends PaletteCustomizationAction {
-		private DesignerPaletteCustomizerDialog designerPaletteCustomizerDialog;
-		
-		/**
-		 * Constructor
-		 * @param designerPaletteCustomizerDialog
-		 */
-		public ImportAction(DesignerPaletteCustomizerDialog designerPaletteCustomizerDialog) {
-			super();
-			this.designerPaletteCustomizerDialog = designerPaletteCustomizerDialog;
-			setEnabled(true);
-			setText(PageDesignerResources.getInstance().getString(
-					"DesignerPaletteCustomizerDialog.label.import")); //$NON-NLS-1$
-			setImageDescriptor(PluginImageHelper.getInstance()
-					.getImageDescriptor(DesignerPaletteImages.IMG_ELCL_IMPORT,
-							PDPlugin.getPluginId()));
-			setDisabledImageDescriptor(PluginImageHelper.getInstance()
-					.getImageDescriptor(DesignerPaletteImages.IMG_DLCL_IMPORT,
-							PDPlugin.getPluginId()));
-			setHoverImageDescriptor(PluginImageHelper.getInstance()
-					.getImageDescriptor(DesignerPaletteImages.IMG_CLCL_IMPORT,
-							PDPlugin.getPluginId()));
-			
-		}
-
-		private void handleImport() {
-//			PaletteEntry entry = designerPaletteCustomizerDialog.getSelectedPaletteEntry();
-			final FileDialog fileDialog = new FileDialog(PDPlugin
-					.getActiveWorkbenchShell());
-			fileDialog.setFileName(DEFAULT_CUSTOMIZATIONS_EXPORT_FILENAME);
-			String[] filterExtensions = new String[2];
-			filterExtensions[0] = "*.xml"; //$NON-NLS-1$
-			filterExtensions[1] = "*.*"; //$NON-NLS-1$
-			fileDialog.setFilterExtensions(filterExtensions);
-			fileDialog.setText(Messages.DesignerPaletteCustomizerDialog_ImportCustomizations);
-			String filename = fileDialog.open();
-			if (filename != null) {		
-					//deselect current entry first
-					designerPaletteCustomizerDialog.close();		
-					
-//					getCustomizer().revertToSaved();
-					DesignerPaletteCustomizationsHelper
-						.importCustomizations((DesignerPaletteCustomizer)getCustomizer(), filename);
-					
-//					designerPaletteCustomizerDialog.setActiveEntry(entry);
-					((DesignerPaletteCustomizer)getCustomizer()).getDesignerPaletteRoot().refresh();
-					designerPaletteCustomizerDialog.open();
-//					designerPaletteCustomizerDialog.setActiveEntry(entry);
-			}
-		}
-
-		public void run() {
-			handleImport();
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.gef.ui.palette.customize.PaletteCustomizationAction#update()
-		 */
-		public void update() {
-			//nothing to do
-		}
-	}
-
-	/**
-	 * @return import action
-	 */
-	public Action getImportAction() {
-		return new ImportAction(this);
-	}
-
-	/**
-	 * @return export action
-	 */
-	public Action getExportAction() {
-		return new ExportAction();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.gef.ui.palette.customize.PaletteCustomizerDialog#createOutlineActions()
-	 */
-	protected List createOutlineActions() {
-		List actions = super.createOutlineActions();
-		actions.remove(0);// remove new action
-		actions.remove(0);// remove delete action
-		actions.add(new ImportAction(this));
-		actions.add(new ExportAction());
-
-		return actions;
-	}
-	
-	@Override
-	protected TreeViewer createOutlineTreeViewer(Composite composite) {
-		TreeViewer viewer = super.createOutlineTreeViewer(composite);
-		viewer.setContentProvider(new DesignerPaletteContentProvider());
-		return viewer;
-	}
-
-	
-	/**
-	 * Content provider for dialog.
-	 * Displays only {@link TaglibPaletteDrawer}s
-	 */
-	private static class DesignerPaletteContentProvider implements ITreeContentProvider {
-
-		public Object[] getChildren(Object parentElement) {
-			if (parentElement instanceof DesignerPaletteRoot){
-				List libs = new ArrayList();
-				List children = ((DesignerPaletteRoot)parentElement).getChildren();				
-				if (!children.isEmpty()) {
-					for (Iterator it=children.iterator();it.hasNext();){
-						PaletteEntry entry = (PaletteEntry)it.next();
-						if (entry instanceof TaglibPaletteDrawer)
-							libs.add(entry);
-					}
-					if (!libs.isEmpty())
-						return libs.toArray();
-				}
-			}
-			return null;
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object)
-		 */
-		public Object getParent(Object element) {
-			return ((PaletteEntry)element).getParent();
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object)
-		 */
-		public boolean hasChildren(Object element) {
-			return false;
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-		 */
-		public Object[] getElements(Object inputElement) {
-			Object[] elements = new Object[0];
-			if (inputElement instanceof DesignerPaletteRoot){
-				elements = getChildren(inputElement);
-				if (elements == null) {
-					elements = new Object[0];
-				}
-			}
-			return elements;
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-		 */
-		public void dispose() {
-			//nothing to do
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
-		 */
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-			//won't change			
-		}
-
-		
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/DesignerPaletteImages.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/DesignerPaletteImages.java
deleted file mode 100644
index e00e92a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/DesignerPaletteImages.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.palette;
-
-/**
- * Palette Image constants
- * @author mengbo
- */
-public class DesignerPaletteImages {
-	/**
-	 * Import hover image
-	 */
-	public static final String IMG_CLCL_IMPORT = "icons/palette/GENERIC/small/PD_Palette_Import_Hover.gif"; //$NON-NLS-1$
-
-	/**
-	 * Export hover image
-	 */
-	public static final String IMG_CLCL_EXPORT = "icons/palette/GENERIC/small/PD_Palette_Export_Hover.gif"; //$NON-NLS-1$
-
-	/**
-	 * Import disabled image
-	 */
-	public static final String IMG_DLCL_IMPORT = "icons/palette/GENERIC/small/PD_Palette_Import_Disabled.gif"; //$NON-NLS-1$
-
-	/**
-	 * Export disabled image
-	 */
-	public static final String IMG_DLCL_EXPORT = "icons/palette/GENERIC/small/PD_Palette_Export_Disabled.gif"; //$NON-NLS-1$
-
-	/**
-	 * Import image
-	 */
-	public static final String IMG_ELCL_IMPORT = "icons/palette/GENERIC/small/PD_Palette_Import.gif"; //$NON-NLS-1$
-
-	/**
-	 * Export image
-	 */
-	public static final String IMG_ELCL_EXPORT = "icons/palette/GENERIC/small/PD_Palette_Export.gif"; //$NON-NLS-1$
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/DesignerPaletteRoot.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/DesignerPaletteRoot.java
deleted file mode 100644
index 6c6d28e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/DesignerPaletteRoot.java
+++ /dev/null
@@ -1,131 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.palette;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.gef.Tool;
-import org.eclipse.gef.palette.MarqueeToolEntry;
-import org.eclipse.gef.palette.PaletteEntry;
-import org.eclipse.gef.palette.PaletteGroup;
-import org.eclipse.gef.palette.PaletteRoot;
-import org.eclipse.gef.palette.SelectionToolEntry;
-import org.eclipse.gef.palette.ToolEntry;
-import org.eclipse.jst.pagedesigner.editors.pagedesigner.PageDesignerResources;
-import org.eclipse.jst.pagedesigner.editors.palette.impl.PaletteItemManager;
-import org.eclipse.jst.pagedesigner.tools.RangeSelectionTool;
-
-/**
- * @author mengbo
- */
-public class DesignerPaletteRoot extends PaletteRoot {
-	private IPaletteItemManager _manager;
-	private IFile _file;
-	private IPaletteContext _paletteContext;
-    
-	/**
-	 * Creates a new DesignerPaletteRoot instance.
-	 * @param file 
-	 */
-	public DesignerPaletteRoot(final IFile file) {
-		// create root
-		super();
-		
-		this._paletteContext = PaletteItemManager.createPaletteContext(file);
-		this._manager = PaletteItemManager.getInstance(_paletteContext);
-		
-		setupBasicItems();
-		loadItems();
-
-		// TODO: register listener on the manager for toolpalette change event.
-
-	}
-
-	/**
-	 * @return the paletteContext 
-	 */
-	public IPaletteContext getPaletteContext() {
-		return _paletteContext;
-	}
-	
-	/**
-	 * @return the paletteContext 
-	 */
-	public IFile getFile() {
-		return _file;
-	}
-	/**
-	 * @return IPaletteItemManager instance for this root
-	 */
-	public IPaletteItemManager getPaletteManager() {
-		return this._manager;
-	}
-
-	private void setupBasicItems() {
-		// Preferences prefs = PDPlugin.getDefault().getPluginPreferences();
-		// _showAll = prefs.getBoolean(IJMTConstants.PREF_PALETTE_SHOW_ALL);
-
-		// a group of default control tools
-		// JSFPalette.DefaultGroup.LabelJSFPallete=Controls
-		PaletteGroup controls = new PaletteGroup(PageDesignerResources
-				.getInstance().getString(
-						"JSFPalette.DefaultGroup.LabelJSFPallete")); //$NON-NLS-1$
-		add(controls);
-		// the selection tool
-		ToolEntry tool = new SelectionToolEntry() {
-			public Tool createTool() {
-				return new RangeSelectionTool();
-			}
-		};
-		controls.add(tool);
-
-		// use selection tool as default entry
-		setDefaultEntry(tool);
-
-		// the marquee selection tool
-		controls.add(new MarqueeToolEntry());
-	}
-
-	private void loadItems() {
-		// _showAll =
-		// PDPlugin.getDefault().getPluginPreferences().getBoolean(IJMTConstants.PREF_PALETTE_SHOW_ALL);
-		// remove other things first.
-		removeItems();
-		
-		if (_manager != null) {
-			this.addAll(_manager.getAllCategories());
-		};
-	}
-
-	/**
-	 * remove everything from the paletteroot
-	 * 
-	 */
-	protected void removeItems() {
-		// we try to remove anything other than the basic
-		// group that have the selectentry and marqeeentry
-		List children1 = new ArrayList(getChildren());
-		children1.remove(0); // remove the first one
-		for (int i = 0, n = children1.size(); i < n; i++) {
-			this.remove((PaletteEntry) children1.get(i));
-		}
-	}
-
-	/**
-	 * refresh the palette, normally caused by preference change.
-	 */
-	public void refresh() {
-		loadItems();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/DesignerPaletteRootFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/DesignerPaletteRootFactory.java
deleted file mode 100644
index 77bbe64..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/DesignerPaletteRootFactory.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.palette;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.gef.palette.PaletteRoot;
-import org.eclipse.gef.ui.palette.FlyoutPaletteComposite.FlyoutPreferences;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-
-/**
- * Factory for creating DesignerPaletteRoots
- * @author mengbo 
- */
-public class DesignerPaletteRootFactory {
-	/** Default palette size. */
-	private static final int DEFAULT_PALETTE_SIZE = 125;
-
-	/** Preference ID used to persist the palette location. */
-	private static final String PALETTE_DOCK_LOCATION = "DesignerPaletteRootFactory.Location"; //$NON-NLS-1$
-
-	/** Preference ID used to persist the palette size. */
-	private static final String PALETTE_SIZE = "DesignerPaletteRootFactory.Size"; //$NON-NLS-1$
-
-	/** Preference ID used to persist the flyout palette's state. */
-	private static final String PALETTE_STATE = "DesignerPaletteRootFactory.State"; //$NON-NLS-1$
-
-	/**
-	 * Return a {@link FlyoutPreferences} instance used to save/load the preferences of
-	 * a flyout palette.
-	 * @return FlyoutPreferences
-	 */
-	public static FlyoutPreferences createPalettePreferences() {
-		// set default flyout palette preference values, in case the preference
-		// store
-		// does not hold stored values for the given preferences
-		getPreferenceStore().setDefault(PALETTE_DOCK_LOCATION, -1);
-		getPreferenceStore().setDefault(PALETTE_STATE, -1);
-		getPreferenceStore().setDefault(PALETTE_SIZE, DEFAULT_PALETTE_SIZE);
-
-		return new FlyoutPreferences() {
-			public int getDockLocation() {
-				return getPreferenceStore().getInt(PALETTE_DOCK_LOCATION);
-			}
-
-			public int getPaletteState() {
-				return getPreferenceStore().getInt(PALETTE_STATE);
-			}
-
-			public int getPaletteWidth() {
-				return getPreferenceStore().getInt(PALETTE_SIZE);
-			}
-
-			public void setDockLocation(int location) {
-				getPreferenceStore().setValue(PALETTE_DOCK_LOCATION, location);
-			}
-
-			public void setPaletteState(int state) {
-				getPreferenceStore().setValue(PALETTE_STATE, state);
-			}
-
-			public void setPaletteWidth(int width) {
-				getPreferenceStore().setValue(PALETTE_SIZE, width);
-			}
-		};
-	}
-
-	/**
-	 * Returns the preference store for the PDPlugin.
-	 * 
-	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#getPreferenceStore()
-	 */
-	private static IPreferenceStore getPreferenceStore() {
-		return PDPlugin.getDefault().getPreferenceStore();
-	}
-
-//	/**
-//	 * Creates the PaletteRoot and adds all palette elements. Use this factory
-//	 * method to create a new palette for your graphical editor.
-//	 * <p>
-//	 * <i>Note: cannot support facelets</i>
-//	 * @param project 
-//	 * @return a new PaletteRoot
-//	 * @deprecated - use createPaletteRoot(IFile file)
-//	 */
-//	public static PaletteRoot createPaletteRoot(IProject project) {
-//		PaletteItemManager manager = PaletteItemManager.getInstance(project);
-//		if (manager == null) {
-//			return null;
-//		}
-//		manager.reset();
-//		PaletteRoot palette = new DesignerPaletteRoot(manager);
-//		return palette;
-//	}
-	
-	/**
-	 * Creates the PaletteRoot and adds all palette elements. Use this factory
-	 * method to create a new palette for your graphical editor.
-	 * @param file 
-	 * @return a new PaletteRoot
-	 */
-	public static PaletteRoot createPaletteRoot(final IFile file) {
-		return new DesignerPaletteRoot(file);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/DesignerPaletteViewer.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/DesignerPaletteViewer.java
deleted file mode 100644
index b64e26e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/DesignerPaletteViewer.java
+++ /dev/null
@@ -1,151 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.palette;
-
-import java.util.List;
-
-import org.eclipse.gef.palette.PaletteRoot;
-import org.eclipse.gef.ui.palette.PaletteCustomizer;
-import org.eclipse.gef.ui.palette.PaletteViewer;
-import org.eclipse.gef.ui.palette.customize.PaletteCustomizerDialog;
-import org.eclipse.jst.pagedesigner.editors.palette.impl.PaletteItemManager;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * XXX: currently create this class is just for add/remove listener to
- * preference change, so can refresh the palette.
- * 
- * @author mengbo
- * @author mengbo
- * @version 1.5
- */
-public class DesignerPaletteViewer extends PaletteViewer {
-
-	private PaletteCustomizerDialog _customizerDialog = null;
-
-	private DesignerPaletteCustomizer _customizer;
-
-	/**
-	 * 
-	 */
-	public DesignerPaletteViewer() {
-		super();
-
-		this.enableVerticalScrollbar(true);
-	}
-
-//	Preferences.IPropertyChangeListener listener = new Preferences.IPropertyChangeListener() {
-//		public void propertyChange(PropertyChangeEvent event) {
-//			PaletteRoot root = getPaletteRoot();
-//			if (root instanceof DesignerPaletteRoot) {
-////				((DesignerPaletteRoot) root).refresh();
-//				// XXX: setActiveTool to null to workaround GEF bug of NPE
-//				// setActiveTool(null);
-//			}
-//		}
-//	};
-	
-	final IEntryChangeListener _paletteModelListener = new IEntryChangeListener() {
-
-		public void modelChanged(List oldDefinitions, List newDefinitions) {
-			final PaletteRoot root = getPaletteRoot();
-			if (root instanceof DesignerPaletteRoot) {
-                Control viewerControl = getControl();
-                
-                if (viewerControl != null && !viewerControl.isDisposed())
-                {
-                    Display  display = viewerControl.getDisplay();
-                    
-                    if (display != null && !display.isDisposed())
-                    {
-                        // this updates the UI, so it must be run on
-                        // the display thread
-                        display.asyncExec(new Runnable()
-                        {
-                            public void run() {
-                                ((DesignerPaletteRoot) root).refresh();
-                            }
-                        });
-                    }
-                }
-			}
-		}
-
-	};
-
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.ui.palette.PaletteViewer#hookControl()
-	 */
-	protected void hookControl() {
-		super.hookControl();
-//		PDPlugin.getDefault().getPluginPreferences().addPropertyChangeListener(
-//				listener);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.ui.palette.PaletteViewer#unhookControl()
-	 */
-	protected void unhookControl() {
-//		PDPlugin.getDefault().getPluginPreferences()
-//				.removePropertyChangeListener(listener);
-		// remove palette model change listener
-		PaletteRoot root = getPaletteRoot();
-		if (root instanceof DesignerPaletteRoot) {
-			if (_customizer != null){
-				_customizer.setPaletteRoot(null);
-			}
-			IPaletteItemManager imanager = ((DesignerPaletteRoot) root)
-					.getPaletteManager();
-			if (imanager instanceof PaletteItemManager) {
-				PaletteItemManager manager = (PaletteItemManager) imanager;
-//				ResourcesPlugin.getWorkspace().removeResourceChangeListener(
-//						_resourceChangeListener);
-				manager.removeEntryChangeListener(_paletteModelListener);				
-//				PaletteItemManager.clearPaletteItemManager();
-				manager.release(((DesignerPaletteRoot)root).getPaletteContext());
-			}
-		}
-		super.unhookControl();
-	}
-
-	public PaletteCustomizerDialog getCustomizerDialog() {
-		if (_customizerDialog == null){
-			_customizerDialog = DesignerPaletteCustomizationsHelper.getNewCustomizerDialog(this, getCustomizer() );	
-		}
-		return _customizerDialog;
-	}
-
-	public PaletteCustomizer getCustomizer() {
-		if (_customizer == null){
-			_customizer = DesignerPaletteCustomizationsHelper.getNewCustomizer();
-			_customizer.setPaletteRoot((DesignerPaletteRoot)this.getPaletteRoot());
-		}
-		return _customizer;
-	}
-	
-	public void setPaletteRoot(PaletteRoot root) {
-		super.setPaletteRoot(root);
-		// add palette model change listener
-		// PaletteRoot root = getPaletteRoot();
-		if (root instanceof DesignerPaletteRoot) {
-			((DesignerPaletteRoot) root).getPaletteManager()
-					.addEntryChangeListener(_paletteModelListener);
-		}
-
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/DesignerPaletteViewerProvider.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/DesignerPaletteViewerProvider.java
deleted file mode 100644
index 57a8b74..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/DesignerPaletteViewerProvider.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.palette;
-
-import org.eclipse.gef.EditDomain;
-import org.eclipse.gef.dnd.TemplateTransferDragSourceListener;
-import org.eclipse.gef.internal.ui.palette.editparts.DrawerEditPart;
-import org.eclipse.gef.ui.palette.PaletteContextMenuProvider;
-import org.eclipse.gef.ui.palette.PaletteViewer;
-import org.eclipse.gef.ui.palette.PaletteViewerProvider;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.editors.palette.impl.TaglibPaletteDrawer;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * @author mengbo
- */
-public class DesignerPaletteViewerProvider extends PaletteViewerProvider {
-	/**
-	 * @param graphicalViewerDomain
-	 */
-	public DesignerPaletteViewerProvider(EditDomain graphicalViewerDomain) {
-		super(graphicalViewerDomain);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.ui.palette.PaletteViewerProvider#configurePaletteViewer(org.eclipse.gef.ui.palette.PaletteViewer)
-	 */
-	protected void configurePaletteViewer(PaletteViewer viewer) {
-		// super.configurePaletteViewer(viewer);
-		viewer.setContextMenu(new PaletteContextMenuProvider(viewer) {
-			public void buildContextMenu(IMenuManager menu) {
-				StructuredSelection sel = (StructuredSelection)getViewer().getSelection();
-				if (sel != null 
-						&& sel.getFirstElement() instanceof DrawerEditPart
-						&& ((DrawerEditPart)sel.getFirstElement()).getDrawer() instanceof TaglibPaletteDrawer)
-					menu.add(new HideTagLibAction((DrawerEditPart)sel.getFirstElement(), Messages.DesignerPaletteViewerProvider_Hide));
-				super.buildContextMenu(menu);
-			}
-		});
-
-		// XXX: should only use the following when we use Template
-		viewer
-				.addDragSourceListener(new TemplateTransferDragSourceListener(
-						viewer));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.ui.palette.PaletteViewerProvider#createPaletteViewer(org.eclipse.swt.widgets.Composite)
-	 */
-	public PaletteViewer createPaletteViewer(Composite parent) {
-		PaletteViewer pViewer = new DesignerPaletteViewer();
-		pViewer.createControl(parent);
-		configurePaletteViewer(pViewer);
-		pViewer.setCustomizer(new DesignerPaletteCustomizer());
-		hookPaletteViewer(pViewer);
-
-		PlatformUI
-				.getWorkbench()
-				.getHelpSystem()
-				.setHelp(
-						parent,
-						PDPlugin
-								.getResourceString("DesignerPaletteViewerProvider.help.id")); //$NON-NLS-1$
-
-		return pViewer;
-	}
-	
-	private static class HideTagLibAction extends Action {
-		private DrawerEditPart tagLib;
-		
-		/**
-		 * Constructor
-		 * @param tagLibDrawer
-		 * @param string
-		 */
-		public HideTagLibAction(DrawerEditPart tagLibDrawer, String string) {
-			super(string);
-			this.tagLib = tagLibDrawer;
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.action.Action#run()
-		 */
-		public void run() {
-			TaglibPaletteDrawer pd = (TaglibPaletteDrawer)tagLib.getDrawer();
-			pd.setVisible(false);
-			DesignerPaletteCustomizationsHelper.hideTaglibDrawer(pd);
-		}		
-		
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/IDropSourceData.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/IDropSourceData.java
deleted file mode 100644
index e31a325..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/IDropSourceData.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package org.eclipse.jst.pagedesigner.editors.palette;
-
-/**
- * Data describing a palette drop.
- * 
- * @author cbateman
- *
- */
-public interface IDropSourceData
-{
-    /**
-     * @return uri of the tag's library. MUST NOT BE NULL.
-     */
-    public String getNamespace();
-    /**
-     * @return a unique id for a tag creation provider that may be different
-     * from the uri. MUST NOT BE NULL.
-     */
-    public String getId();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/IDropSourceDataProvider.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/IDropSourceDataProvider.java
deleted file mode 100644
index d3116d0..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/IDropSourceDataProvider.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package org.eclipse.jst.pagedesigner.editors.palette;
-
-/**
- * Used by objects (usually palette entries) that wish provide drop source data
- * to a client.
- * 
- * @author cbateman
- *
- */
-public interface IDropSourceDataProvider
-{
-    /**
-     * @return a drop source data in context
-     */
-    IDropSourceData  getDropSourceData();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/IEntryChangeListener.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/IEntryChangeListener.java
deleted file mode 100644
index 2f4667e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/IEntryChangeListener.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.palette;
-
-import java.util.List;
-
-/**
- * @author mengbo
- */
-public interface IEntryChangeListener {
-	/**
-	 * @param oldDefinitions
-	 *            the old taglib definitions
-	 * @param newDefinitions
-	 *            the new taglib definitions
-	 */
-	void modelChanged(List oldDefinitions, List newDefinitions);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/IPaletteConstants.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/IPaletteConstants.java
deleted file mode 100644
index dcbf651..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/IPaletteConstants.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.palette;
-
-/**
- * Constants used by palette customizations persistence
- * 
- * @author mengbo
- */
-public interface IPaletteConstants {
-	/**
-	 * 
-	 */
-	public static final String BUNDLE_ID = "org.eclipse.jst.pagedesigner"; //$NON-NLS-1$
-
-	/**
-	 * contant for palett-item element name
-	 */
-	public static final String ROOT = "palette-item"; //$NON-NLS-1$
-
-	/**
-	 * constant for uri attribute
-	 */
-	public static final String URI = "uri"; //$NON-NLS-1$
-
-	/**
-	 * Constant for hidden attribute
-	 */
-	public static final String ISHIDDEN = "hidden"; //$NON-NLS-1$
-
-	/**
-	 * constant for id attribute
-	 */
-	public static final String ID = "id"; //$NON-NLS-1$
-	
-	/**
-	 * constant for category element name
-	 */
-	public static final String CATEGORY_TAG = "category"; //$NON-NLS-1$
-	
-//OLD - no longer/currently used
-
-//	public static final String EXTENSION_POINT_ID = "ResourceContributions"; //$NON-NLS-1$
-//	public static final String FILENAME = "/tag.xml"; //$NON-NLS-1$
-//	public static final String TAGNAME = "tagName"; //$NON-NLS-1$
-//	public static final String ITEM_TAG = "item"; //$NON-NLS-1$
-//	public static final String EXPERT = "expert"; //$NON-NLS-1$
-//	public static final String LARGEICON = "largeIcon"; //$NON-NLS-1$
-//	public static final String SMALLICON = "smallIcon"; //$NON-NLS-1$
-//	public static final String LABEL = "label"; //$NON-NLS-1$
-//	public static final String INITIALSTATE = "initialState"; //$NON-NLS-1$
-//	public static final String SHORTDESC = "shortDesc"; //$NON-NLS-1$
-//	public static final String ATTRIBUTE_TAG = "attribute"; //$NON-NLS-1$
-//	public static final String NAME = "name"; //$NON-NLS-1$
-//	public static final String VALUE = "value"; //$NON-NLS-1$
-//	public static final String ICONPREFIX = "iconPrefix"; //$NON-NLS-1$
-//	public static final String TAGLIBEXT = "capability"; //$NON-NLS-1$
-//	public static final String JARPROTO = "jar:file://"; //$NON-NLS-1$
-//	public static final String FILEPROTO = "file://"; //$NON-NLS-1$
-//	public static final String REQUIREHFORM = "requireHForm"; //$NON-NLS-1$
-//	public static final String JSFCOMPONENTCATEGORY = "jsfComponentCategory"; //$NON-NLS-1$
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/IPaletteContext.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/IPaletteContext.java
deleted file mode 100644
index c8a940f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/IPaletteContext.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package org.eclipse.jst.pagedesigner.editors.palette;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.jst.jsf.context.IModelContext;
-
-/**
- * Context in which the WPE palette is operating
- *
- */
-public interface IPaletteContext extends IModelContext {
-	/**
-	 * @return IFile
-	 */
-	public IFile getFile();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/IPaletteFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/IPaletteFactory.java
deleted file mode 100644
index 703ccf7..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/IPaletteFactory.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2009 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.palette;
-
-import org.eclipse.gef.EditDomain;
-import org.eclipse.gef.palette.PaletteRoot;
-import org.eclipse.gef.ui.palette.PaletteViewerProvider;
-import org.eclipse.gef.ui.views.palette.PaletteViewerPage;
-import org.eclipse.ui.IEditorInput;
-
-/**
- * Create a palette parts to replace the default palette  in
- * the Web Page Editor.
- * 
- * If any of the create methods return null, the default WPE behaviour will be used.
- */
-public interface IPaletteFactory {
-	/**
-	 * @param provider
-	 * @return {@link PaletteViewerPage} - MAY return null. If null, the default palette viewer page will be used. 
-	 */
-	public PaletteViewerPage createPaletteViewerPage(PaletteViewerProvider provider) ;
-	
-	/**
-	 * @param domain
-	 * @return {@link PaletteViewerProvider} - may return null. If null, the default paletteViewerProvider will be used. 
-	 */
-	public PaletteViewerProvider createPaletteViewerProvider(EditDomain domain) ;
-
-	/**
-	 * @param editorInput
-	 * @return PaletteRoot  - may return null.   If null, the default palette root will be used. 
-	 */
-	public PaletteRoot createPaletteRoot(IEditorInput editorInput);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/IPaletteItemManager.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/IPaletteItemManager.java
deleted file mode 100644
index 7b2b154..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/IPaletteItemManager.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.palette;
-
-import java.util.List;
-
-import org.eclipse.jst.jsf.core.internal.CompositeTagRegistryFactory.TagRegistryIdentifier;
-import org.eclipse.jst.pagedesigner.editors.palette.impl.TaglibPaletteDrawer;
-
-/**
- * PaletteItemManager interface.
- * 
- * NOT intended to be implemented by clients
- * 
- * @author mengbo
- */
-public interface IPaletteItemManager {
-	/**
-	 * @return IProject
-	 */
-	public TagRegistryIdentifier getTagRegistryIdentifier();
-	
-	/**
-	 * @return list of {@link TaglibPaletteDrawer}s being managed for this project 
-	 */
-	public List/*TaglibPaletteDrawer*/ getAllCategories();
-
-	/**
-	 * Create a TaglibPaletteDrawer with given label for given id
-	 * 
-	 * @param id
-	 * @param label 
-	 * @return TaglibPaletteDrawer
-	 */
-	public TaglibPaletteDrawer createTaglibPaletteDrawer(String id, String label);
-
-	/**
-	 * Retrieve the TaglibPaletteDrawer by id.  May be null.
-	 * 
-	 * @param id
-	 * @return TaglibPaletteDrawer
-	 */
-	public TaglibPaletteDrawer getTaglibPalletteDrawer(String id);
-
-	/**
-	 * Locate by id, and if not found,  create a TaglibPaletteDrawer using label and id
-	 * 
-	 * @param id
-	 * @param label
-	 * @return TaglibPaletteDrawer
-	 */
-	public TaglibPaletteDrawer findOrCreateCategory(String id, String label);
-
-	/**
-	 * Adds a listener to the list of those notified when the model contents are
-	 * replaced
-	 * 
-	 * @param listener -
-	 *            the listener to add
-	 */
-	void addEntryChangeListener(IEntryChangeListener listener);
-
-	/**
-	 * Adds a listener to the list of those notified when the model contents are
-	 * replaced
-	 * 
-	 * @param listener -
-	 *            the listener to remove
-	 */
-	void removeEntryChangeListener(IEntryChangeListener listener);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/ITagDropSourceData.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/ITagDropSourceData.java
deleted file mode 100644
index 16af8d8..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/ITagDropSourceData.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package org.eclipse.jst.pagedesigner.editors.palette;
-
-
-/**
- * Provides generic information for tag creation from a palette drop.
- * 
- * @author cbateman
- * 
- */
-public interface ITagDropSourceData extends IDropSourceData
-{
-    /**
-     * @return tagName
-     */
-    public String getTagName();
-
-    /**
-     * Convenience method returning the tag libraries default prefix, if
-     * applicable
-     * 
-     * @return default prefix
-     */
-    public String getDefaultPrefix();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/Messages.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/Messages.java
deleted file mode 100644
index 0bf1737..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/Messages.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.palette;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * String resource handler	
- *
- */
-public class Messages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.jst.pagedesigner.editors.palette.messages"; //$NON-NLS-1$
-	/**
-	 * see messages.properties
-	 */
-	public static String DesignerPaletteCustomizerDialog_ExportCustomizations;
-	/**
-	 * see messages.properties
-	 */
-	public static String DesignerPaletteCustomizerDialog_ImportCustomizations;
-	/**
-	 * see messages.properties
-	 */
-	public static String DesignerPaletteViewerProvider_Hide;
-	static {
-		// initialize resource bundle
-		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/MetadataTagDropSourceData.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/MetadataTagDropSourceData.java
deleted file mode 100644
index 64d8d40..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/MetadataTagDropSourceData.java
+++ /dev/null
@@ -1,155 +0,0 @@
-/**
- * 
- */
-package org.eclipse.jst.pagedesigner.editors.palette;
-
-import java.util.List;
-
-import org.eclipse.jst.jsf.common.metadata.Entity;
-import org.eclipse.jst.jsf.common.metadata.Model;
-import org.eclipse.jst.jsf.common.metadata.Trait;
-import org.eclipse.jst.jsf.common.metadata.query.ITaglibDomainMetaDataModelContext;
-import org.eclipse.jst.jsf.common.metadata.query.TaglibDomainMetaDataQueryHelper;
-import org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfo;
-import org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfos;
-import org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.TagCreationAttribute;
-import org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.TagCreationInfo;
-import org.eclipse.jst.pagedesigner.utils.CommandUtil;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-
-/**
- * A source data that is enhanced by metadata.
- * 
- * @author cbateman
- *
- */
-public final class MetadataTagDropSourceData implements ITagDropSourceData
-{
-    private final IDOMModel _model;
-    private final TagCreationInfo _tagCreationInfo;
-    private final ITagDropSourceData _delegate;
-
-    /**
-     * @param creationProvider
-     * @param model
-     */
-    public MetadataTagDropSourceData(
-            final ITagDropSourceData creationProvider,
-            final IDOMModel model)
-    {
-        _delegate = creationProvider;
-        _model = model;
-        _tagCreationInfo = getTagCreationInfo();
-    }
-
-    /**
-     * @return the pre-defined attributes for the tag from meta-data or
-     *  null if none.
-     */
-    public List<TagCreationAttribute> getAttributes()
-    {
-        if (_tagCreationInfo != null)
-        {
-            return _tagCreationInfo.getAttributes();
-        }
-        return null;
-    }
-
-    /**
-     * @return the template derived from metadata for tag drop or null if none.
-     */
-    public String getTemplate()
-    {
-        if (_tagCreationInfo != null)
-        {
-            return (String) _tagCreationInfo.getTemplate();
-        }
-        return null;
-    }
-
-    public String getDefaultPrefix()
-    {
-        return _delegate.getDefaultPrefix();
-    }
-
-    public String getTagName()
-    {
-        return _delegate.getTagName();
-    }
-
-    public String getNamespace()
-    {
-        return _delegate.getNamespace();
-    }
-
-    private TagCreationInfo getTagCreationInfo()
-    {
-        final ITaglibDomainMetaDataModelContext metadataContext = CommandUtil
-                .getMetadataContext(getNamespace(), _model);
-        TagCreationInfo tagCreationInfo = null;
-        String id = getId();
-        if (metadataContext != null && id != null)
-        {
-            tagCreationInfo = createCreationInfo(metadataContext, id,
-                    getTagName());
-        }
-        return tagCreationInfo;
-    }
-
-    public String getId()
-    {
-        return _delegate.getId();
-    }
-    
-    /**
-     * @param metaDataContext
-     * @param id
-     * @param tagName
-     * @return a tag creation info for the tag and id in the metadata context
-     */
-    static TagCreationInfo createCreationInfo(
-            final ITaglibDomainMetaDataModelContext metaDataContext,
-            final String id, final String tagName)
-    {
-        final Model model = TaglibDomainMetaDataQueryHelper
-                .getModel(metaDataContext);
-        if (model != null)
-        {
-            Trait trait = TaglibDomainMetaDataQueryHelper.getTrait(model,
-                    PaletteInfos.TRAIT_ID);
-            if (trait != null)
-            {
-                final PaletteInfos pis = (PaletteInfos) trait.getValue();
-                final PaletteInfo pi = pis.findPaletteInfoById(id);
-                if (pi != null)
-                {
-                    return pi.getTagCreation();
-                }
-            }
-            // tag-creation trait on entity directly?
-            final Entity tag = getTagEntity(metaDataContext, tagName);
-            if (tag != null)
-            {// metadata exists
-                trait = TaglibDomainMetaDataQueryHelper.getTrait(tag,
-                        "tag-create"); //$NON-NLS-1$
-                if (trait != null && trait.getValue() != null)
-                {
-                    return (TagCreationInfo) trait.getValue();
-                }
-            }
-        }
-        return null;
-    }
-    /**
-     * @param metaDataContext
-     * @param tagName
-     * @return the {@link Entity} for this tag element being created
-     */
-    private static Entity getTagEntity(
-            final ITaglibDomainMetaDataModelContext metaDataContext,
-            final String tagName)
-    {
-        return TaglibDomainMetaDataQueryHelper.getEntity(metaDataContext,
-                tagName);
-    }
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/ShowAllAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/ShowAllAction.java
deleted file mode 100644
index f115bfe..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/ShowAllAction.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.palette;
-
-import org.eclipse.core.runtime.Preferences;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jst.pagedesigner.IJMTConstants;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-
-/**
- * @author mengbo
- */
-public class ShowAllAction extends Action {
-	Preferences _preferences = null;
-
-	/**
-	 * @param pluginPreferences
-	 */
-	public ShowAllAction(Preferences pluginPreferences) {
-		super(PDPlugin.getResourceString("ShowAllAction.ActionLabel.ShowAll")); //$NON-NLS-1$
-		_preferences = pluginPreferences;
-		boolean showAll = _preferences
-				.getBoolean(IJMTConstants.PREF_PALETTE_SHOW_ALL);
-		this.setChecked(showAll);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.action.Action#run()
-	 */
-	public void run() {
-		boolean showAll = _preferences
-				.getBoolean(IJMTConstants.PREF_PALETTE_SHOW_ALL);
-		// toggle the show all status. preference will fire out change event,
-		// and palettes
-		// receive this event will refresh
-		_preferences.setValue(IJMTConstants.PREF_PALETTE_SHOW_ALL, !showAll);
-		this.setChecked(!showAll);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/TagImageManager.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/TagImageManager.java
deleted file mode 100644
index fe6d5b8..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/TagImageManager.java
+++ /dev/null
@@ -1,213 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.palette;
-
-import java.util.Iterator;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jst.jsf.common.metadata.Entity;
-import org.eclipse.jst.jsf.common.metadata.Model;
-import org.eclipse.jst.jsf.common.metadata.Trait;
-import org.eclipse.jst.jsf.common.metadata.internal.IImageDescriptorProvider;
-import org.eclipse.jst.jsf.common.metadata.internal.IMetaDataSourceModelProvider;
-import org.eclipse.jst.jsf.common.metadata.internal.TraitValueHelper;
-import org.eclipse.jst.jsf.common.metadata.query.ITaglibDomainMetaDataModelContext;
-import org.eclipse.jst.jsf.common.metadata.query.TaglibDomainMetaDataQueryHelper;
-import org.eclipse.jst.jsf.common.ui.JSFUICommonPlugin;
-import org.eclipse.jst.jsf.common.ui.internal.utils.JSFSharedImages;
-import org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfo;
-import org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfos;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * Locates and creates Images for tags using the common metadata framework.
- * 
- * Images are cached in the PDPlugin's ImageRegistry.  
- * 
- * Some code is being duplicated in palette helper.   PaletteHelper should be re-factored to use this code
- * 
- */
-public class TagImageManager {
-	
-	private static final String PALETTE_DEFAULT_IMAGE_FILE = "palette/GENERIC/large/PD_Palette_Default.gif"; //$NON-NLS-1$
-
-	private static TagImageManager INSTANCE = null;
-	
-	private final static ImageDescriptor DEFAULT_SMALL_ICON = JSFUICommonPlugin
-	.getDefault().getImageDescriptor(
-		JSFSharedImages.DEFAULT_PALETTE_TAG_IMG);
-
-	private final static ImageDescriptor DEFAULT_LARGE_ICON = PDPlugin
-		.getDefault().getImageDescriptor(
-				PALETTE_DEFAULT_IMAGE_FILE);
-
-	private static final String TRAIT_ICON_SMALL = "small-icon"; //$NON-NLS-1$
-
-	private static final String TRAIT_ICON_LARGE = "large-icon"; //$NON-NLS-1$
-	
-	/**
-	 * @return singleton instance 
-	 */
-	public synchronized static TagImageManager getInstance() {
-		if (INSTANCE == null) {
-			INSTANCE = new TagImageManager();
-		}
-		return INSTANCE;
-	}	
-	
-	/**
-	 * Returns small image using metadata and may be null.  Caller should NOT dispose the image, but should call TagImageManager's dispose(image)
-	 * @param project
-	 * @param nsUri
-	 * @param tagName
-	 * @return small image using metadata.  May be null.
-	 */
-	public Image getSmallIconImage(IProject project, String nsUri, String tagName) {
-		Image image = null;
-		Model model = getModel(project, nsUri);
-		if (model != null){
-			ImageDescriptor imgDesc = getSmallIconImageDescriptor(model, tagName);
-			image = getOrCreateImage(imgDesc);
-		}
-		
-		return image;
-	}
-
-	/**
-	 * @param project
-	 * @param nsUri
-	 * @param tagName
-	 * @return large image using metadata.  May be null.
-	 */
-	public Image getLargeIconImage(IProject project, String nsUri, String tagName) {
-		Image image = null;
-		Model model = getModel(project, nsUri);
-		if (model != null){
-			ImageDescriptor imgDesc = getLargeIconImageDescriptor(model, nsUri);
-			image = getOrCreateImage(imgDesc);	
-		}
-		
-		return image;
-	}
-	
-	/**
-	 * Gets, and creates if necessary, a shared image.
-	 * @param imageDescriptor
-	 * @return Image from shared cache
-	 */
-	public static Image getOrCreateImage(ImageDescriptor imageDescriptor) {
-		Image image = null;
-		if (imageDescriptor != null){
-			image = PDPlugin.getDefault().getImageRegistry().get(imageDescriptor.toString());
-			if (image == null ){
-				image = imageDescriptor.createImage();
-				PDPlugin.getDefault().getImageRegistry().put(imageDescriptor.toString(), image);
-			} else if (image.isDisposed()){ //should not occur, but handling just in case				
-				PDPlugin.getDefault().getImageRegistry().remove(imageDescriptor.toString());
-				image = imageDescriptor.createImage();
-				PDPlugin.getDefault().getImageRegistry().put(imageDescriptor.toString(), image);
-			}
-		}
-		return image;
-	}
-	
-	private Model getModel(IProject project, String nsUri) {
-		ITaglibDomainMetaDataModelContext modelContext = TaglibDomainMetaDataQueryHelper.createMetaDataModelContext(project, nsUri);
-		Model model =TaglibDomainMetaDataQueryHelper.getModel(modelContext);
-		// no caching at this time so there is no need to listen to model notifications
-//		if (model != null && !hasAdapter(model))
-//			addAdapter(model);
-		return model;
-	}
-
-
-//	private void addAdapter(Model model) {
-//		if (model != null){			
-////			model.eAdapters().add(INSTANCE);  
-//		}		
-//	}
-//
-//	private boolean hasAdapter(Model model) {
-//		for(Adapter a : model.eAdapters()){
-//			if (a == INSTANCE)
-//				return true;
-//		}
-//		return false;
-//	}
-
-	private ImageDescriptor getSmallIconImageDescriptor(Model model, String tagName) {
-		return getIconImageDescriptor(model, tagName, true);
-	}
-	
-	private ImageDescriptor getLargeIconImageDescriptor(Model model, String tagName) {
-		return getIconImageDescriptor(model, tagName, false);
-	}
-	
-	private ImageDescriptor getIconImageDescriptor(Model model, String tagName, boolean small) {		
-		ImageDescriptor icon = null;
-		
-		//use palette infos if available
-		Trait trait = TaglibDomainMetaDataQueryHelper.getTrait(model, "paletteInfos"); //$NON-NLS-1$
-		if (trait != null){
-			PaletteInfos tags = (PaletteInfos)trait.getValue();
-			for (Iterator it=tags.getInfos().iterator();it.hasNext();){
-				PaletteInfo tag = (PaletteInfo)it.next();
-				if (tag.getId().equalsIgnoreCase(tagName)){					
-					IMetaDataSourceModelProvider sourceProvider = ((Trait)tag.eContainer().eContainer()).getSourceModelProvider();
-					if (small)
-						icon = getImageDescriptorFromString(sourceProvider, tag.getSmallIcon(), DEFAULT_SMALL_ICON);
-					else
-						icon = getImageDescriptorFromString(sourceProvider, tag.getLargeIcon(), DEFAULT_LARGE_ICON);
-					
-					break;
-				}
-			}	
-		}
-		if (icon == null) {
-			for (Iterator it=model.getChildEntities().iterator();it.hasNext();){
-				Entity tagAsEntity = (Entity)it.next();
-				if (tagAsEntity.getId().equalsIgnoreCase(tagName)){										
-					if (small)
-						icon = getImageDescriptorFromTagTraitValueAsString(tagAsEntity, TRAIT_ICON_SMALL, DEFAULT_SMALL_ICON);
-					else
-						icon = getImageDescriptorFromTagTraitValueAsString(tagAsEntity, TRAIT_ICON_LARGE, DEFAULT_LARGE_ICON);	
-					
-					break;
-				}				
-			}
-			
-		}
-
-		return icon;
-	}
-		
-	private ImageDescriptor getImageDescriptorFromString(IMetaDataSourceModelProvider sourceModelProvider,  String imgDesc, ImageDescriptor defaultValue){
-		ImageDescriptor image = defaultValue;
-		IImageDescriptorProvider imageProvider = (IImageDescriptorProvider)sourceModelProvider.getAdapter(IImageDescriptorProvider.class);			
-		if (imageProvider != null){
-			image = imageProvider.getImageDescriptor(imgDesc);
-		}
-		return image;
-	}
-	
-	private ImageDescriptor getImageDescriptorFromTagTraitValueAsString(Entity entity, String key, ImageDescriptor defaultValue){
-		Trait t = TaglibDomainMetaDataQueryHelper.getTrait(entity, key);
-		if (t != null){
-			String imgDesc = TraitValueHelper.getValueAsString(t);
-			return getImageDescriptorFromString(t.getSourceModelProvider(), imgDesc, defaultValue);
-		}
-		return defaultValue;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/TagToolCreationAdapter.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/TagToolCreationAdapter.java
deleted file mode 100644
index 2ac052e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/TagToolCreationAdapter.java
+++ /dev/null
@@ -1,110 +0,0 @@
-package org.eclipse.jst.pagedesigner.editors.palette;
-
-
-import javax.xml.namespace.QName;
-
-import org.eclipse.jst.pagedesigner.editors.palette.impl.PaletteItemManager;
-import org.eclipse.jst.pagedesigner.editors.palette.impl.TaglibPaletteDrawer;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-
-/**
- * ITagDropSourceData implementation useable by TagToolPaletteEntry for its 
- * drop transfer object.
- * 
- * @author cbateman
- * 
- */
-public final class TagToolCreationAdapter implements ITagDropSourceData
-{
-    private String _uri;
-    private String _tagName;
-    private String _defaultPrefix;
-    private String _id;
-
-    /**
-     * @param uri 
-     * @param tagName 
-     * @param defaultPrefix 
-     * @param id 
-     */
-    public TagToolCreationAdapter(final String uri,  final String tagName, final String defaultPrefix,
-            final String id)
-    {
-        _uri = uri;
-        _tagName = tagName;
-        _defaultPrefix = defaultPrefix;
-        _id = id;        
-    }
-
-    public String getDefaultPrefix()
-    {
-        return _defaultPrefix;
-    }
-
-    public String getTagName()
-    {
-        return _tagName;
-    }
-
-    public String getNamespace()
-    {
-        return _uri;
-    }
-
-    public String getId()
-    {
-        return _id;
-    }
-
-    /**
-     * @param provider
-     * @param model
-     * @return a metadata tag creation adapter for an existing tag
-     * creation provider (which need not itself be a TagToolCreationAdapter)
-     * and a dom model.
-     */
-    public static MetadataTagDropSourceData createMdTagCreationProvider(final ITagDropSourceData provider, final IDOMModel model)
-    {
-        return new MetadataTagDropSourceData(provider, model);
-    }
-
-    /**
-     * @param container
-     * @param paletteContext 
-     * @return the tag creation provider
-     */
-    public static ITagDropSourceData findProviderForContainer(
-            final QName container, final IPaletteContext paletteContext)
-    {
-    	
-        return findProviderForContainer(container.getNamespaceURI(), container
-                .getLocalPart(), paletteContext);
-    }
-
-    /**
-     * @param uri
-     * @param tagName
-     * @param paletteContext
-     * @return the tag creation provider
-     */
-    public static ITagDropSourceData findProviderForContainer(
-            final String uri, final String tagName,
-            final IPaletteContext paletteContext)
-    {
-    	final PaletteItemManager itemManager = PaletteItemManager.getInstance(paletteContext);
-        if (itemManager != null) {
-	    	final TaglibPaletteDrawer category = itemManager.findCategoryByURI(uri);
-	        if (category != null)
-	        {
-	            final TagToolPaletteEntry tagItem = category
-	                    .getTagPaletteEntryByTagName(tagName);
-	            if (tagItem != null)
-	            {
-	                return tagItem.getTemplate();
-	            }
-	        }
-        }
-        return null;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/TagToolPaletteEntry.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/TagToolPaletteEntry.java
deleted file mode 100644
index 7483504..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/TagToolPaletteEntry.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.palette;
-
-import org.eclipse.gef.Tool;
-import org.eclipse.gef.palette.CombinedTemplateCreationEntry;
-import org.eclipse.gef.requests.CreationFactory;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jst.pagedesigner.itemcreation.ItemCreationTool;
-
-/**
- * Represents a tag palette item entry in the web page designer palette
- * 
- */
-public class TagToolPaletteEntry extends CombinedTemplateCreationEntry
-        implements IDropSourceDataProvider
-{
-
-    /**
-     * Constructor
-     * 
-     * @param template
-     *            the template item for the drop
-     * @param label
-     * @param shortDescription
-     * @param iconSmall
-     * @param iconLarge
-     */
-    public TagToolPaletteEntry(final ITagDropSourceData template,
-            final String label, final String shortDescription,
-            final ImageDescriptor iconSmall, final ImageDescriptor iconLarge)
-    {
-        super(label, shortDescription, template, NOOP_FACTORY, iconSmall,
-                iconLarge);
-    }
-
-    /**
-     * @return tagName
-     */
-    public String getTagName()
-    {
-        return getTemplate().getTagName();
-    }
-
-    /**
-     * Convenience method returning the tag libraries default prefix, if
-     * applicable
-     * 
-     * @return default prefix
-     */
-    public String getDefaultPrefix()
-    {
-        return getTemplate().getDefaultPrefix();
-    }
-
-    /**
-     * @return uri of the tag's library
-     */
-    public String getURI()
-    {
-        return getTemplate().getNamespace();
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.gef.palette.ToolEntry#createTool()
-     */
-    @Override
-    public Tool createTool()
-    {
-        return new ItemCreationTool(getTemplate());
-    }
-
-    private final static CreationFactory NOOP_FACTORY = new CreationFactory()
-    {
-        public Object getNewObject()
-        {
-            // should never get called
-            throw new UnsupportedOperationException(
-                    "createTool should be overriden, so this should never be called"); //$NON-NLS-1$
-        }
-
-        public Object getObjectType()
-        {
-            // should never get called
-            throw new UnsupportedOperationException(
-                    "createTool should be overriden, so this should never be called"); //$NON-NLS-1$
-        }
-    };
-
-    @Override
-    public ITagDropSourceData getTemplate()
-    {
-        return (ITagDropSourceData) super.getTemplate();
-    }
-
-    public IDropSourceData getDropSourceData()
-    {
-        return getTemplate();
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/impl/PaletteElementTemplateHelper.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/impl/PaletteElementTemplateHelper.java
deleted file mode 100644
index 83ebf27..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/impl/PaletteElementTemplateHelper.java
+++ /dev/null
@@ -1,200 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.palette.impl;
-
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
-
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.editors.palette.MetadataTagDropSourceData;
-import org.eclipse.jst.pagedesigner.utils.JSPUtil;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMText;
-import org.w3c.dom.Attr;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.NamedNodeMap;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.w3c.dom.Text;
-import org.xml.sax.SAXException;
-
-/**
- * 
- * @author mengbo
- */
-public class PaletteElementTemplateHelper {
-	//private static final String TEMPLATE_ITEM_NAME = "template";
-
-	private static final String PREFIX_ATTRIBUTE = "_uri_"; //$NON-NLS-1$
-
-//	private static Logger _log = PDPlugin
-//			.getLogger(PaletteElementTemplateHelper.class);
-
-	/**
-	 * This method is used to process template element which is read from .xmi
-	 * file and generate default element.
-	 * 
-	 * @param model
-	 * @param element
-	 * @param creationProvider 
-	 */
-	public static void applyTemplate(IDOMModel model, Element element,
-	        MetadataTagDropSourceData creationProvider) {
-		if (element == null || element.getLocalName() == null) {
-			return;
-		}
-		
-		Node[] templateNodes = getTemplateNodes(model,  creationProvider);
-		if (templateNodes != null) {
-			for (int i=0;i<templateNodes.length;i++){
-				Node anode = templateNodes[i];
-				element.appendChild(anode);				
-			}
-		}
-	}
-
-	private static Node[] getTemplateNodes(IDOMModel model,
-	        MetadataTagDropSourceData creationProvider) {
-
-		if (creationProvider == null)
-			return null;
-		
-		String template = creationProvider.getTemplate();
-		if (template != null){
-			
-			final String nodeStr = prepareNode(template);//(String)template.getTemplate();
-			final Logger logger = PDPlugin.getLogger(PaletteElementTemplateHelper.class); 
-			try {
-				DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
-				factory.setNamespaceAware(true);
-				factory.setValidating(false);
-				DocumentBuilder builder = factory.newDocumentBuilder();
-				Document doc = builder.parse(new ByteArrayInputStream( nodeStr.getBytes()));
-				Node beginNode = doc.getFirstChild();
-				Node templateNode = beginNode.cloneNode(true);//model.getDocument().importNode(beginNode, true);
-				Node[] templateNodes = applyPrefixes(model, templateNode.getChildNodes(), model.getDocument());
-				return templateNodes;
-			} catch (ParserConfigurationException e) {
-			    logger.error(e);
-			} catch (SAXException e) {
-                logger.error(e);
-			} catch (IOException e) {
-                logger.error(e);
-			} catch (Exception e){
-                logger.error(e);
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * @param template
-	 * @return xml as String wrapped by a <begin> node as template may not have a single root element
-	 */
-	private static String prepareNode(String template) {
-		StringBuffer buf = new StringBuffer("<begin>"); //$NON-NLS-1$
-		buf.append(template);
-		buf.append("</begin>"); //$NON-NLS-1$
-		return buf.toString();
-	}
-
-	/**
-	 * Use the actrual prefixs of jsf html and jsf core to set the prefix of
-	 * each node declared in template.
-	 * @param model 
-	 * @param templateNodes 
-	 * @param document 
-	 * @return Node[]
-	 * 
-	 */
-	public static Node[] applyPrefixes(IDOMModel model, 
-			NodeList templateNodes, Document document) {
-		List result = new ArrayList();
-		for (int i = 0, n = templateNodes.getLength(); i < n; i++) {
-			Node node = cloneNodeDeep(model, document, templateNodes.item(i));
-			if (node instanceof Element) {
-				result.add(node);
-			}
-		}
-		return (Node[]) result.toArray(new Node[result.size()]);
-	}
-
-	/**
-	 * TODO: Later we may add some logic to reference the tld file through tag
-	 * name to resolve the prefixs directly.
-	 */
-	private static void internalApplyPrefixes(IDOMModel model, Element refNode, Element node) {
-		if (node != null && refNode != null) {
-			String uri = refNode.getAttribute(PREFIX_ATTRIBUTE);
-			if (uri != null) {
-				String prefix = JSPUtil.getOrCreatePrefix(model, uri, null);
-				node.setPrefix(prefix);
-			}
-		}
-	}
-
-
-	/**
-	 * A deep clone of the sourceNode
-	 * @param model
-	 * @param destDoc
-	 * @param sourceNode
-	 * @return Node
-	 */
-	public static Node cloneNodeDeep(IDOMModel model, Document destDoc, Node sourceNode) {
-		switch (sourceNode.getNodeType()) {
-		case Node.ELEMENT_NODE:
-			Element sourceEle = (Element) sourceNode;
-			Element resultEle = destDoc.createElement(sourceEle.getTagName());
-			internalApplyPrefixes(model, sourceEle, resultEle);
-			NamedNodeMap attrs = sourceEle.getAttributes();
-			for (int i = 0, size = attrs.getLength(); i < size; i++) {
-				Attr a = (Attr) attrs.item(i);
-				if (!PREFIX_ATTRIBUTE.equalsIgnoreCase(a.getNodeName())) {
-					resultEle.setAttribute(a.getName(), a.getValue());
-				}
-			}
-			NodeList children = sourceEle.getChildNodes();
-			for (int i = 0, size = children.getLength(); i < size; i++) {
-				Node n = children.item(i);
-				Node d = cloneNodeDeep(model, destDoc, n);
-				if (d != null) {
-					resultEle.appendChild(d);
-				}
-			}
-			return resultEle;
-		case Node.TEXT_NODE:
-			Text txt = destDoc.createTextNode(sourceNode.getNodeValue());
-			if (txt instanceof IDOMText && sourceNode instanceof IDOMText) {
-				try {
-					((IDOMText) txt).setSource(((IDOMText) sourceNode)
-							.getSource());
-				} catch (Exception ex) {
-					// ignore
-				}
-			}
-			return txt;
-		case Node.CDATA_SECTION_NODE:
-			return destDoc.createCDATASection(sourceNode.getNodeValue());
-		default:
-			return null; // not support.
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/impl/PaletteHelper.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/impl/PaletteHelper.java
deleted file mode 100644
index 8abec47..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/impl/PaletteHelper.java
+++ /dev/null
@@ -1,690 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.palette.impl;
-
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.Iterator;
-import java.util.List;
-import java.util.regex.Pattern;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.gef.palette.PaletteDrawer;
-import org.eclipse.gef.palette.PaletteEntry;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jst.jsf.common.metadata.Entity;
-import org.eclipse.jst.jsf.common.metadata.Model;
-import org.eclipse.jst.jsf.common.metadata.Trait;
-import org.eclipse.jst.jsf.common.metadata.internal.IImageDescriptorProvider;
-import org.eclipse.jst.jsf.common.metadata.internal.IMetaDataSourceModelProvider;
-import org.eclipse.jst.jsf.common.metadata.internal.TraitValueHelper;
-import org.eclipse.jst.jsf.common.metadata.query.ITaglibDomainMetaDataModelContext;
-import org.eclipse.jst.jsf.common.metadata.query.TaglibDomainMetaDataQueryHelper;
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.ITagElement;
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.Namespace;
-import org.eclipse.jst.jsf.common.ui.JSFUICommonPlugin;
-import org.eclipse.jst.jsf.common.ui.internal.utils.JSFSharedImages;
-import org.eclipse.jst.jsf.core.internal.tld.CMUtil;
-import org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfo;
-import org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfos;
-import org.eclipse.jst.jsp.core.internal.contentmodel.tld.CMDocumentFactoryTLD;
-import org.eclipse.jst.jsp.core.internal.contentmodel.tld.provisional.TLDDocument;
-import org.eclipse.jst.jsp.core.internal.contentmodel.tld.provisional.TLDElementDeclaration;
-import org.eclipse.jst.jsp.core.taglib.ITaglibRecord;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.editors.palette.IPaletteItemManager;
-import org.eclipse.jst.pagedesigner.editors.palette.ITagDropSourceData;
-import org.eclipse.jst.pagedesigner.editors.palette.TagToolCreationAdapter;
-import org.eclipse.jst.pagedesigner.editors.palette.TagToolPaletteEntry;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMDocument;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
-
-/**
- * Helper class.
- */
-public class PaletteHelper {
-
-	// pattern to strip all <x> and </x> HTML tags
-	final private static Pattern removeHTMLTags = Pattern
-			.compile("<[/?\\w\\s=\"\\.\\#]+>"); //$NON-NLS-1$
-
-	// pattern to find all runs of spaces longer than one
-	final private static Pattern trimInteriorWhitespace = Pattern
-			.compile("[ ]+"); //$NON-NLS-1$
-
-	// pattern to find all new lines for removal
-	final private static Pattern removeNewLines = Pattern.compile("[\n]"); //$NON-NLS-1$
-
-	private final static ImageDescriptor DEFAULT_SMALL_ICON = JSFUICommonPlugin
-			.getDefault().getImageDescriptor(
-					JSFSharedImages.DEFAULT_PALETTE_TAG_IMG);
-
-	private final static ImageDescriptor DEFAULT_LARGE_ICON = PDPlugin
-			.getDefault().getImageDescriptor(
-					"palette/GENERIC/large/PD_Palette_Default.gif"); //$NON-NLS-1$
-
-	// how many characters to truncate a palette item's description to.
-	// TODO: add preference?
-	// the soft length is the ideal length we try to truncate to. We first
-	// try to find a period (end of sentence; TODO: should have a character
-	// class)
-	// inside the first SOFT_LENGTH chars at which to truncate a description
-	// string.
-	// if we can't find one then we search for the first one between SOFT_LENGTH
-	// and min(HARD_LENGTH, str.length()). If found, we truncate there. If not,
-	// we truncate to HARD_LENGTH-" ...".length() and append the ellipsis.
-	// In all cases the truncated description string returned should <=
-	// HARD_LENGTH.
-	// private final static int DESCRIPTION_TRUNCATE_SOFT_LENGTH = 150;
-	private final static int DESCRIPTION_TRUNCATE_HARD_LENGTH = 250;
-
-//	private PaletteItemManager _paletteManager;
-
-	/*package*/ PaletteHelper(final PaletteItemManager manager) {
-//		_paletteManager = manager;
-	}
-	/**
-	 * Creates a TaglibPaletteDrawer with TagTool palette entries for each tag
-	 * from the CMDocument
-	 * 
-	 * @param manager
-	 * @param tldRec
-	 * @return TaglibPaletteDrawer
-	 */
-	public TaglibPaletteDrawer configPaletteItemsByTLD(
-			final IPaletteItemManager manager, final ITaglibRecord tldRec) {
-
-		final String tldURI = CMUtil.getURIFromTaglibRecord(tldRec, manager.getTagRegistryIdentifier().getProject());
-
-		final CMDocumentFactoryTLD factory = new CMDocumentFactoryTLD();
-		final TLDDocument doc = (TLDDocument) factory.createCMDocument(tldRec);
-
-		return getOrCreateTaglibPaletteDrawer(manager, doc, tldURI);
-	}
-
-	/**
-	 * @param manager
-	 * @param doc
-	 * @param tldURI
-	 * @return TaglibPaletteDrawer
-	 */
-	public TaglibPaletteDrawer getOrCreateTaglibPaletteDrawer(
-			final IPaletteItemManager manager, final CMDocument doc, final String tldURI) {
-		
-		TaglibPaletteDrawer category = findCategory(manager, tldURI);
-		if (category != null)
-			return category;
-
-		final ITaglibDomainMetaDataModelContext modelContext = TaglibDomainMetaDataQueryHelper
-				.createMetaDataModelContext(manager.getTagRegistryIdentifier().getProject(), tldURI);
-		final Model model = TaglibDomainMetaDataQueryHelper.getModel(modelContext);
-		category = createTaglibPaletteDrawer(manager, doc, model);
-
-		if (category != null) {
-			loadTags(category, doc, model);
-			sortTags(category.getChildren());
-		}
-		return category;
-	}
-
-	private void sortTags(final List tags) {
-		// note that once we store ordering customizations, we will need to do
-		// something different
-		// it will also be complicated if we decide to do 181958 and 181866
-		Collections.sort(tags, new Comparator() {
-
-			public int compare(final Object o1, final Object o2) {
-				final String label1 = ((PaletteEntry) o1).getLabel();
-				final String label2 = ((PaletteEntry) o2).getLabel();
-
-				if (label1 == null) {
-					// if both null, then equal
-					if (label2 == null) {
-						return 0;
-					}
-					// otherwise, sort label 2 before
-					return 1;
-				}
-
-				if (label2 == null) {
-					// if label1 not null, then sort it first
-					return -1;
-				}
-				return label1.compareTo(label2);
-			}
-
-		});
-
-	}
-
-	private void loadTags(final TaglibPaletteDrawer category, final CMDocument doc,
-			final Model model) {
-
-		if (model != null) {// load from metadata - should always drop in here
-			final Trait trait = TaglibDomainMetaDataQueryHelper.getTrait(model,
-					"paletteInfos"); //$NON-NLS-1$
-			if (trait != null) {
-				final PaletteInfos tags = (PaletteInfos) trait.getValue();
-				for (final Iterator it = tags.getInfos().iterator(); it.hasNext();) {
-					final PaletteInfo tag = (PaletteInfo) it.next();
-					createTagEntry(category, tag, doc);
-				}
-			} else {
-				for (final Iterator it = model.getChildEntities().iterator(); it
-						.hasNext();) {
-					final Entity tagAsEntity = (Entity) it.next();
-					createTagEntry(category, tagAsEntity, doc);
-				}
-			}
-		} else {// fail safe loading from cmDoc... should no longer go in here
-			loadFromCMDocument(category, doc);
-		}
-
-	}
-
-	private TaglibPaletteDrawer createTaglibPaletteDrawer(
-			final IPaletteItemManager manager, final CMDocument doc, final Model model) {
-
-		TaglibPaletteDrawer category = null;
-		if (model != null) {
-			// do we create it?
-			final boolean isHidden = getBooleanTagTraitValue(model, "hidden", false); //$NON-NLS-1$
-			if (isHidden) {
-				return null;
-			}
-
-			String label = getStringTagTraitValue(model,
-					"display-label", model.getId()); //$NON-NLS-1$
-			label = label.equals("") ? model.getId() : label; //$NON-NLS-1$
-			category = manager.createTaglibPaletteDrawer(model.getId(), label);
-
-			String desc = getStringTagTraitValue(model,
-					"description", model.getId()); //$NON-NLS-1$
-			category.setDescription(formatDescription(desc));
-
-			final ImageDescriptor largeIconImage = getImageDescriptorFromTagTraitValueAsString(
-					model, "small-icon", null); //$NON-NLS-1$
-			if (largeIconImage != null)
-				category.setLargeIcon(largeIconImage);
-
-			final String prefix = getStringTagTraitValue(model,
-					"default-prefix", null); //$NON-NLS-1$
-			category.setDefaultPrefix(prefix);
-
-			final boolean isVisible = !(getBooleanTagTraitValue(model,
-					"expert", false)); //$NON-NLS-1$
-			category.setVisible(isVisible);
-
-			category.setInitialState(PaletteDrawer.INITIAL_STATE_CLOSED);
-
-		}
-		return category;
-	}
-
-	private TaglibPaletteDrawer findCategory(
-			final IPaletteItemManager manager, final String tldURI) {
-		
-		TaglibPaletteDrawer lib = null;
-		for (final Iterator it = manager.getAllCategories().iterator(); it.hasNext();) {
-			lib = (TaglibPaletteDrawer) it.next();
-			if (tldURI.equals(lib.getURI()))
-				return lib;
-		}
-		return null;
-	}
-
-	/*
-	 * (non-JavaDoc) This method will read information from the CMDocument to
-	 * create the tag entries. It will check the existing items in the registry.
-	 * If the corresponding tag is not in palette manager, then it will create
-	 * one, and mark the newly created item as "expert". Otherwise, it will
-	 * check whether the tld contains more information than the palette manager,
-	 * and adding those information to it (such as description, icons for tags)
-	 * 
-	 * @param category
-	 * 
-	 * @param cmdoc
-	 */
-	private void loadFromCMDocument(final TaglibPaletteDrawer category,
-			final CMDocument cmdoc) {
-
-		final CMNamedNodeMap nodeMap = cmdoc.getElements();
-		for (int i = 0, size = nodeMap.getLength(); i < size; i++) {
-			final CMElementDeclaration eledecl = (CMElementDeclaration) nodeMap
-					.item(i);
-			final String tagName = eledecl.getElementName();
-			TagToolPaletteEntry item;
-			if (tagName.equalsIgnoreCase(IHTMLConstants.TAG_INPUT)) {// TODO:
-																		// fix
-																		// this
-																		// nonsense!
-				final StringBuffer name = new StringBuffer(category.getURI());
-				name.append(":").append(tagName).append(":").append(tagName); //$NON-NLS-1$ //$NON-NLS-2$
-				item = category.getTagPaletteEntryById(name.toString());
-			} else {
-				item = category.getTagPaletteEntryByTagName(tagName);
-			}
-			if (item == null) {
-				createTagEntry(category, eledecl);
-
-			}
-		}
-	}
-
-	private void createTagEntry(final TaglibPaletteDrawer category,
-			final PaletteInfo info, final CMDocument doc) {
-
-		final Boolean hidden = info.getHidden();
-		if ((hidden != null) && (hidden.booleanValue()))// do not create a
-														// palette entry
-			return;
-
-		final IMetaDataSourceModelProvider sourceProvider = ((Trait) info
-				.eContainer().eContainer()).getSourceModelProvider();
-		final String tagName = info.getTag();
-		final String id = info.getId();
-		final String label = info.getDisplayLabel();
-		final String desc = formatDescription(info.getDescription());
-		final ImageDescriptor smallIcon = getImageDescriptorFromString(
-				sourceProvider, info.getSmallIcon(), DEFAULT_SMALL_ICON);
-		final ImageDescriptor largeIcon = getImageDescriptorFromString(
-				sourceProvider, info.getLargeIcon(), DEFAULT_LARGE_ICON);
-		final Boolean expert = info.getExpert();
-
-		internalCreateTagEntry(doc, category, id, tagName, label, desc,
-				smallIcon, largeIcon, (expert != null && expert.booleanValue()));
-
-	}
-
-	private void createTagEntry(final TaglibPaletteDrawer category,
-			final PaletteInfo info, final Namespace ns) {
-
-		final Boolean hidden = info.getHidden();
-		if ((hidden != null) && (hidden.booleanValue()))// do not create a
-														// palette entry
-			return;
-
-		final IMetaDataSourceModelProvider sourceProvider = ((Trait) info
-				.eContainer().eContainer()).getSourceModelProvider();
-		final String tagName = info.getTag();
-		final String id = info.getId();
-		final String label = info.getDisplayLabel();
-		final String desc = formatDescription(info.getDescription());
-		final ImageDescriptor smallIcon = getImageDescriptorFromString(
-				sourceProvider, info.getSmallIcon(), DEFAULT_SMALL_ICON);
-		final ImageDescriptor largeIcon = getImageDescriptorFromString(
-				sourceProvider, info.getLargeIcon(), DEFAULT_LARGE_ICON);
-		final Boolean expert = info.getExpert();
-
-		internalCreateTagEntry(ns, category, id, tagName, label, desc,
-				smallIcon, largeIcon, (expert != null && expert.booleanValue()));
-
-	}
-
-	private void createTagEntry(final TaglibPaletteDrawer category,
-			final Entity entity, final CMDocument doc) {
-
-		final boolean hidden = getBooleanTagTraitValue(entity, "hidden", false); //$NON-NLS-1$
-		if (hidden)// do not create a palette entry
-			return;
-
-		final String tagName = entity.getId();
-		final String label = getStringTagTraitValue(entity, "display-label", tagName); //$NON-NLS-1$
-		final String desc = formatDescription(getStringTagTraitValue(entity,
-				"description", tagName)); //$NON-NLS-1$
-		final ImageDescriptor smallIcon = getImageDescriptorFromTagTraitValueAsString(
-				entity, "small-icon", DEFAULT_SMALL_ICON); //$NON-NLS-1$
-		final ImageDescriptor largeIcon = getImageDescriptorFromTagTraitValueAsString(
-				entity, "large-icon", DEFAULT_LARGE_ICON); //$NON-NLS-1$
-		final boolean expert = getBooleanTagTraitValue(entity, "expert", false); //$NON-NLS-1$
-
-		internalCreateTagEntry(doc, category, tagName, tagName, label, desc,
-				smallIcon, largeIcon, expert);
-
-	}
-
-	private void createTagEntry(final TaglibPaletteDrawer category,
-			final Entity entity, final Namespace ns) {
-
-		final boolean hidden = getBooleanTagTraitValue(entity, "hidden", false); //$NON-NLS-1$
-		if (hidden)// do not create a palette entry
-			return;
-
-		final String tagName = entity.getId();
-		final String label = getStringTagTraitValue(entity, "display-label", tagName); //$NON-NLS-1$
-		final String desc = formatDescription(getStringTagTraitValue(entity,
-				"description", tagName)); //$NON-NLS-1$
-		final ImageDescriptor smallIcon = getImageDescriptorFromTagTraitValueAsString(
-				entity, "small-icon", DEFAULT_SMALL_ICON); //$NON-NLS-1$
-		final ImageDescriptor largeIcon = getImageDescriptorFromTagTraitValueAsString(
-				entity, "large-icon", DEFAULT_LARGE_ICON); //$NON-NLS-1$
-		final boolean expert = getBooleanTagTraitValue(entity, "expert", false); //$NON-NLS-1$
-
-		internalCreateTagEntry(ns, category, tagName, tagName, label, desc,
-				smallIcon, largeIcon, expert);
-
-	}
-
-	private TagToolPaletteEntry internalCreateTagEntry(final TaglibPaletteDrawer category, 
-			final String id, final String tagName,
-			final String label, String desc, final ImageDescriptor smallIcon,
-			final ImageDescriptor largeIcon, final boolean expert) {
-		
-		final ITagDropSourceData data = new TagToolCreationAdapter(category
-				.getURI(), tagName, category.getDefaultPrefix(), id);
-		final TagToolPaletteEntry item = new TagToolPaletteEntry(data, label,
-				desc, smallIcon, largeIcon);
-		item.setId(id);
-
-		item.setVisible(!expert);
-		category.getChildren().add(item);
-		item.setParent(category);
-
-		return item;
-	}
-
-	private TagToolPaletteEntry internalCreateTagEntry(final CMDocument doc,
-			final TaglibPaletteDrawer category, final String id, final String tagName,
-			final String label, final String desc, final ImageDescriptor smallIcon,
-			final ImageDescriptor largeIcon, final boolean expert) {
-		
-		if (verifyPresentInContentModel(doc, tagName)) {
-			return internalCreateTagEntry(category, id, tagName, label, desc,
-					smallIcon, largeIcon, expert);
-		}
-		return null;
-	}
-
-	private TagToolPaletteEntry internalCreateTagEntry(final Namespace ns,
-			final TaglibPaletteDrawer category, final String id, final String tagName,
-			final String label, final String desc, final ImageDescriptor smallIcon,
-			final ImageDescriptor largeIcon, final boolean expert) {
-		
-		if (verifyPresentInContentModel(ns, tagName)) {
-			return internalCreateTagEntry(category, id, tagName, label, desc,
-					smallIcon, largeIcon, expert);
-		}
-		return null;
-	}
-
-	private boolean verifyPresentInContentModel(final CMDocument doc,
-			final String tagName) {
-		
-		return doc.getElements().getNamedItem(tagName) != null;
-	}
-
-	private boolean verifyPresentInContentModel(final Namespace ns,
-			final String tagName) {
-		
-		return ns.getViewElement(tagName) != null;
-	}
-
-	private boolean getBooleanTagTraitValue(final Entity entity, final String key,
-			final boolean defaultValue) {
-		final Trait trait = TaglibDomainMetaDataQueryHelper.getTrait(entity, key);
-		if (trait != null) {
-			return TraitValueHelper.getValueAsBoolean(trait);
-		}
-		return defaultValue;
-	}
-
-	private String getStringTagTraitValue(final Entity entity, final String key,
-			final String defaultValue) {
-		
-		final Trait trait = TaglibDomainMetaDataQueryHelper.getTrait(entity, key);
-		if (trait != null) {
-			final String val = TraitValueHelper.getValueAsString(trait);
-			if (val != null)
-				return val;
-		}
-		return defaultValue;
-	}
-
-	private ImageDescriptor getImageDescriptorFromTagTraitValueAsString(
-			final Entity entity, final String key, final ImageDescriptor defaultValue) {
-		final Trait t = TaglibDomainMetaDataQueryHelper.getTrait(entity, key);
-		if (t != null) {
-			final String imgDesc = TraitValueHelper.getValueAsString(t);
-			return getImageDescriptorFromString(t.getSourceModelProvider(),
-					imgDesc, defaultValue);
-		}
-		return defaultValue;
-	}
-
-	private ImageDescriptor getImageDescriptorFromString(
-			final IMetaDataSourceModelProvider sourceModelProvider, final String imgDesc,
-			final ImageDescriptor defaultValue) {
-		
-		ImageDescriptor image = defaultValue;
-		if (imgDesc != null) {
-			final IImageDescriptorProvider imageProvider = (IImageDescriptorProvider) sourceModelProvider
-					.getAdapter(IImageDescriptorProvider.class);
-			if (imageProvider != null) {
-				image = imageProvider.getImageDescriptor(imgDesc);
-			}
-		}
-		return image;
-	}
-
-	private void createTagEntry(final TaglibPaletteDrawer category,
-			final CMElementDeclaration eledecl) {
-
-		final String tagName = eledecl.getElementName();
-		String label = null;
-		String desc = null;
-
-		if (eledecl instanceof TLDElementDeclaration) {
-			final TLDElementDeclaration tag = (TLDElementDeclaration) eledecl;
-			label = tag.getDisplayName();
-			desc = tag.getDescription();
-		}
-
-		if (label == null || label.equals("")) //$NON-NLS-1$
-			label = tagName;
-
-		if (desc == null)
-			desc = ""; //$NON-NLS-1$
-		else
-			desc = formatDescription(desc);
-
-		final TagToolPaletteEntry item = internalCreateTagEntry(category, tagName,
-				tagName, label, desc, getDefaultSmallIcon(),
-				getDefaultLargeIcon(), false);
-		item.setToolProperty("CMElementDeclaration", eledecl); //$NON-NLS-1$
-
-	}
-
-	/**
-	 * @return DEFAULT_LARGE_ICON
-	 */
-	private ImageDescriptor getDefaultLargeIcon() {
-		return DEFAULT_LARGE_ICON;
-	}
-
-	/**
-	 * @return DEFAULT_SMALL_ICON
-	 */
-	private ImageDescriptor getDefaultSmallIcon() {
-		return DEFAULT_SMALL_ICON;
-	}
-
-	private String formatDescription(final String desc) {
-		// TODO: modify and use a formatter in the future?
-		final String aDesc = filterConvertString(desc);
-		if (aDesc != null) {
-			if (aDesc.length() > DESCRIPTION_TRUNCATE_HARD_LENGTH) {
-				final StringBuffer result = new StringBuffer(aDesc.substring(0,
-						DESCRIPTION_TRUNCATE_HARD_LENGTH));
-				result.append("..."); //$NON-NLS-1$
-				return result.toString();
-			}
-			return aDesc;
-
-		}
-		return ""; //$NON-NLS-1$
-	}
-
-	private String filterConvertString(final String text) {
-		if (text == null) {
-			return ""; //$NON-NLS-1$
-		}
-
-		String result = removeHTMLTags.matcher(text).replaceAll(""); //$NON-NLS-1$
-		result = removeNewLines.matcher(result).replaceAll(" "); //$NON-NLS-1$
-		result = trimInteriorWhitespace.matcher(result).replaceAll(" "); //$NON-NLS-1$
-
-		return result;
-	}
-
-	/**
-	 * @param manager
-	 * @param ns
-	 * @return TaglibPaletteDrawer
-	 */
-	public TaglibPaletteDrawer configPaletteItemsByNamespace(
-			final PaletteItemManager manager,
-			final Namespace ns) {
-		
-		return getOrCreateTaglibPaletteDrawer(manager, ns);
-	}
-
-	/**
-	 * @param manager
-	 * @param ns 
-	 * @return TaglibPaletteDrawer
-	 */
-	public TaglibPaletteDrawer getOrCreateTaglibPaletteDrawer(
-			final IPaletteItemManager manager, final Namespace ns) {
-		
-		TaglibPaletteDrawer category = findCategory(manager, ns.getNSUri());
-		if (category != null)
-			return category;
-
-		final IProject project = manager.getTagRegistryIdentifier().getProject();
-		final ITaglibDomainMetaDataModelContext modelContext = TaglibDomainMetaDataQueryHelper
-				.createMetaDataModelContext(project, ns.getNSUri());
-		final Model model = TaglibDomainMetaDataQueryHelper.getModel(modelContext);
-		category = createTaglibPaletteDrawer(manager,  ns, model);
-
-		if (category != null) {
-			loadTags(category, ns, model);
-			sortTags(category.getChildren());
-		}
-		return category;
-	}
-
-	private TaglibPaletteDrawer createTaglibPaletteDrawer(
-			final IPaletteItemManager manager, final Namespace ns, final Model model) {
-
-		TaglibPaletteDrawer category = null;
-		if (model != null) {
-			// do we create it?
-			final boolean isHidden = getBooleanTagTraitValue(model, "hidden", false); //$NON-NLS-1$
-			if (isHidden) {
-				return null;
-			}
-
-			String label = getStringTagTraitValue(model,
-					"display-label", model.getId()); //$NON-NLS-1$
-			label = label.equals("") ? model.getId() : label; //$NON-NLS-1$
-			category = manager.createTaglibPaletteDrawer(model.getId(), label);
-
-			final String desc = getStringTagTraitValue(model,
-					"description", model.getId()); //$NON-NLS-1$
-			category.setDescription(formatDescription(desc));
-
-			final ImageDescriptor largeIconImage = getImageDescriptorFromTagTraitValueAsString(
-					model, "small-icon", null); //$NON-NLS-1$
-			if (largeIconImage != null)
-				category.setLargeIcon(largeIconImage);
-
-			final String prefix = getStringTagTraitValue(model,
-					"default-prefix", null); //$NON-NLS-1$
-			category.setDefaultPrefix(prefix);
-
-			final boolean isVisible = !(getBooleanTagTraitValue(model,
-					"expert", false)); //$NON-NLS-1$
-			category.setVisible(isVisible);
-
-			category.setInitialState(PaletteDrawer.INITIAL_STATE_CLOSED);
-
-		}
-		return category;
-	}
-
-	private void loadTags(final TaglibPaletteDrawer category,
-			final Namespace ns, final Model model) {
-
-		if (model != null) {// load from metadata - should always drop in here
-			final Trait trait = TaglibDomainMetaDataQueryHelper.getTrait(model,
-					"paletteInfos"); //$NON-NLS-1$
-			if (trait != null) {
-				final PaletteInfos tags = (PaletteInfos) trait.getValue();
-				for (Iterator it = tags.getInfos().iterator(); it.hasNext();) {
-					final PaletteInfo tag = (PaletteInfo) it.next();
-					createTagEntry(category, tag, ns);
-				}
-			} else {
-				for (final Iterator it = model.getChildEntities().iterator(); it
-						.hasNext();) {
-					final Entity tagAsEntity = (Entity) it.next();
-					createTagEntry(category, tagAsEntity, ns);
-				}
-			}
-		} else {// fail safe loading from cmDoc... should no longer go in here
-			loadFromNamespace(category, ns);
-		}
-	}
-
-	private void loadFromNamespace(final TaglibPaletteDrawer category,
-			final Namespace ns) {
-
-		for (Object velem : ns.getViewElements()) {
-			final ITagElement tag = (ITagElement) velem;
-			final TagToolPaletteEntry item = category.getTagPaletteEntryByTagName(tag
-					.getName());
-			if (item == null) {
-				createTagEntry(category, tag);
-			}
-		}
-	}
-
-	private void createTagEntry(final TaglibPaletteDrawer category,
-			final ITagElement tag) {
-
-		final String tagName = tag.getName();
-		String label = tagName;
-		String desc = ""; //$NON-NLS-1$
-
-		// if (eledecl instanceof TLDElementDeclaration){
-		// TLDElementDeclaration tag = (TLDElementDeclaration)eledecl;
-		// label = tag.getDisplayName();
-		// desc = tag.getDescription();
-		// }
-
-		//			if (label == null || label.equals("")) //$NON-NLS-1$
-		// label = tagName;
-		//			
-		// if (desc == null )
-		//				desc = ""; //$NON-NLS-1$
-		// else
-		// desc = formatDescription(desc);
-
-		// TagToolPaletteEntry item =
-		internalCreateTagEntry(category, tagName, tagName, label, desc,
-				getDefaultSmallIcon(), getDefaultLargeIcon(), false);
-		//			item.setToolProperty("CMElementDeclaration", eledecl); //$NON-NLS-1$
-
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/impl/PaletteItemManager.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/impl/PaletteItemManager.java
deleted file mode 100644
index 6096ac3..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/impl/PaletteItemManager.java
+++ /dev/null
@@ -1,561 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.palette.impl;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.CopyOnWriteArrayList;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.concurrent.locks.ReentrantLock;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.content.IContentType;
-import org.eclipse.core.runtime.content.IContentTypeManager;
-import org.eclipse.gef.palette.PaletteDrawer;
-import org.eclipse.gef.palette.PaletteEntry;
-import org.eclipse.jst.jsf.common.internal.JSPUtil;
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.Namespace;
-import org.eclipse.jst.jsf.core.internal.CompositeTagRegistryFactory;
-import org.eclipse.jst.jsf.core.internal.CompositeTagRegistryFactory.TagRegistryIdentifier;
-import org.eclipse.jst.jsf.designtime.internal.view.model.ITagRegistry;
-import org.eclipse.jst.jsf.designtime.internal.view.model.ITagRegistry.ITagRegistryListener;
-import org.eclipse.jst.jsf.designtime.internal.view.model.ITagRegistry.TagRegistryChangeEvent;
-import org.eclipse.jst.jsf.designtime.internal.view.model.ITagRegistry.TagRegistryChangeEvent.EventType;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.editors.palette.DesignerPaletteCustomizationsHelper;
-import org.eclipse.jst.pagedesigner.editors.palette.IEntryChangeListener;
-import org.eclipse.jst.pagedesigner.editors.palette.IPaletteConstants;
-import org.eclipse.jst.pagedesigner.editors.palette.IPaletteContext;
-import org.eclipse.jst.pagedesigner.editors.palette.IPaletteItemManager;
-import org.eclipse.wst.html.core.internal.contentmodel.HTMLCMDocumentFactory;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMDocument;
-import org.eclipse.wst.xml.core.internal.provisional.contentmodel.CMDocType;
-
-/**
- *  Manages tag library palette by palette context.   Capable of handling JSP and XHTML content types.
- *  
- *  Callers must use getInstance(IPaletteContext), and when done, call release(IFile).   
- *  
- * @author mengbo and others
- */
-public class PaletteItemManager implements IPaletteItemManager,
-		IPaletteConstants, ITagRegistryListener {
-	
-	private static final boolean DEBUG = false;
-
-	
-	private static Map<TagRegistryIdentifier, PaletteItemManager> _managers = new HashMap<TagRegistryIdentifier, PaletteItemManager>();
-	private static ReentrantLock MANAGER_LOCK = new ReentrantLock();
-	private static long MANAGER_LOCK_TIMEOUT = 120;
-	
-	private Set<IFile> _files = new HashSet<IFile>();
-	private TagRegistryIdentifier _tagRegId;
-	private List<PaletteDrawer> _paletteCategories = new ArrayList<PaletteDrawer>();
-	private CopyOnWriteArrayList<IEntryChangeListener> _listeners = new CopyOnWriteArrayList<IEntryChangeListener>();
-	private AtomicBoolean IS_DISPOSED = new AtomicBoolean();
-
-	private PaletteHelper _paletteHelper;
-
-	private ITagRegistry _tagRegistry;
-
-
-	/**
-	 * Return singleton paletteItemManager for a given project.  Will only work for JSPs.
-	 * @param project
-	 * @return PaletteItemManager
-	 * @deprecated - use getInstance(paletteContext)
-	 */
-	public static PaletteItemManager getInstance(final IProject project) {
-		if (project == null) {
-			// sometimes when the editor is editing a file in jar file, may not
-			// be able to
-			// get the project.
-			return getInstance(createPaletteContext(null));
-		}		
-		//relies on JSP file extension for content type
-		return getInstance(createPaletteContext(project.getFile("dummy.jsp")));  //$NON-NLS-1$
-	}
-	
-	/**
-	 * @param paletteContext
-	 * @return PaletteItemManager instance shared with all files with same palette context in a project
-	 * 				May return null if locking issue 
-	 */
-	public static PaletteItemManager getInstance(final IPaletteContext paletteContext) {	
-		boolean hasLock = false;
-		try {
-			if (MANAGER_LOCK.tryLock(MANAGER_LOCK_TIMEOUT, TimeUnit.SECONDS)){
-				hasLock = true;
-				final TagRegistryIdentifier regId = getTagRegistryIdentifier(paletteContext);
-				PaletteItemManager manager = _managers.get(regId);
-				if (manager == null) {
-					 manager = new PaletteItemManager(regId);
-					_managers.put(regId, manager);
-					manager.init();
-				} 
-				manager.addFile(paletteContext.getFile());
-				return manager;
-			}
-			//if we get here then the lock has timed out
-			PDPlugin.log(new Status(Status.ERROR, PDPlugin.getPluginId(), "(getInstance()) Failed to get managers lock for" + paletteContext.getFile().toString())); //$NON-NLS-1$
-			
-		} catch (InterruptedException e) {
-			PDPlugin.log("Failed in PaletteItemManager.getInstance(PaletteContext", e); //$NON-NLS-1$
-		} finally {
-			if (hasLock)
-				MANAGER_LOCK.unlock();
-		}
-		return null;
-	}
-	
-	private static TagRegistryIdentifier getTagRegistryIdentifier(
-			final IPaletteContext paletteContext) {
-
-		final IFile file = paletteContext.getFile();
-		if (file != null) {
-	        final IContentTypeManager typeManager = Platform.getContentTypeManager();
-	        final IContentType contentType = 
-	            typeManager.findContentTypeFor(file.getName());
-	        
-	        if (contentType != null)
-	        {
-	            return new TagRegistryIdentifier(file.getProject(), contentType);
-	        }
-	        return null;
-		}
-		//to support legacy null projects.   Allows HTML and JSP tag libs to be displayed.
-	    return new TagRegistryIdentifier(null, org.eclipse.jst.pagedesigner.utils.JSPUtil.JSP_CONTENTTYPE);
-
-	}
-
-	/**
-	 * @param file
-	 * @return IPaletteContext
-	 */
-	public static IPaletteContext createPaletteContext(final IFile file) {
-		return new IPaletteContext() {
-			public IFile getFile() {
-				return file;
-			}
-
-			public Object getAdapter(Class adapter) {				
-				return null;
-			}
-		};
-	}
-	private void addFile(final IFile file) {
-		synchronized (_files) {
-			_files.add(file);
-		}
-		
-	}
-	
-	/**
-	 * Indicates that the file no longer needs the paletteItemManager, freeing the manager to be released after last reference
-	 * @param paletteContext
-	 */
-	public void release(final IPaletteContext paletteContext) { 
-		final IFile file = paletteContext.getFile();
-		boolean isEmpty = false;
-		synchronized (_files) {
-			if (_files.contains(file)) {
-				_files.remove(file);
-				if (_files.isEmpty())
-					isEmpty = true;
-			}
-		}
-
-		if (isEmpty && IS_DISPOSED.compareAndSet(false, true)) {
-			removeTagRegistryListeners(this);
-			boolean hasLock = false;
-			try {
-				if (MANAGER_LOCK.tryLock(MANAGER_LOCK_TIMEOUT, TimeUnit.SECONDS)) {
-					hasLock = true;
-					_managers.remove(_tagRegId);
-				}
-				else {
-					PDPlugin.log(new Status(Status.ERROR, PDPlugin.getPluginId(), "(Release) Failed to get managers lock for" + paletteContext.getFile().toString())); //$NON-NLS-1$
-				}
-			} catch (InterruptedException e) {
-				PDPlugin.log("Failed to release paletteItemManager for" + paletteContext.getFile().toString(), e); //$NON-NLS-1$
-			} finally {
-				if (hasLock)
-					MANAGER_LOCK.unlock();
-			}
-		}
-	}
-
-	private static void removeTagRegistryListeners(final PaletteItemManager manager) {
-		if (manager.getTagRegistry() != null)
-			manager.getTagRegistry().removeListener(manager);
-	}
-
-	private ITagRegistry getTagRegistry() {		
-		return _tagRegistry;
-	}
-
-	/**
-	 * For JUnit testing purposes only
-	 */
-	public static void clearPaletteItemManager() {
-		
-		boolean hasLock = false;
-		try {
-			if (MANAGER_LOCK.tryLock(MANAGER_LOCK_TIMEOUT, TimeUnit.SECONDS)){
-				hasLock = true;
-				if (_managers == null)
-					return;
-
-				for (final PaletteItemManager manager : _managers.values()) {
-					PaletteItemManager.removeTagRegistryListeners(manager);		
-					manager._files.clear();
-				}							
-				_managers.clear();
-			} else {
-				//if we get here then the lock has timed out
-				PDPlugin.log(new Status(Status.ERROR, PDPlugin.getPluginId(), "(clear) Failed to get managers lock")); //$NON-NLS-1$
-			}
-			
-		} catch (InterruptedException e) {
-			PDPlugin.log("Failed in clearPaletteItemManager", e); //$NON-NLS-1$
-		} finally {
-			if (hasLock)
-				MANAGER_LOCK.unlock();
-		}
-
-	}
-	
-	private PaletteItemManager(final TagRegistryIdentifier regId) {
-		_paletteHelper = new PaletteHelper(this);
-		if (regId != null) {
-			_tagRegId = regId;
-//			init();
-		}		
-	}
-	
-
-	public List getAllCategories() {	
-		synchronized (_paletteCategories) {
-			final List<PaletteDrawer> readOnlyCategories = new ArrayList<PaletteDrawer>(_paletteCategories);			
-			return Collections.unmodifiableList(readOnlyCategories);
-		}		
-	}
-
-	/**
-	 * Initializes the palette items for the current project
-	 */
-	protected synchronized void init() {
-		synchronized (_paletteCategories) {
-			_paletteCategories.clear();
-		}
-		
-		initTagRegistry();
-
-		DesignerPaletteCustomizationsHelper.loadUserCustomizations(this);
-		
-		sortCategories();
-	}
-
-	/**
-	 * Sort palette categories
-	 */
-	protected void sortCategories() {
-		//note that once we store ordering customizations, we will need to do something different
-		synchronized(_paletteCategories) {
-			Collections.sort(_paletteCategories, new Comparator(){
-	
-				public int compare(Object o1, Object o2) {
-					String label1 = ((PaletteEntry)o1).getLabel();
-					String label2 = ((PaletteEntry)o2).getLabel();
-					
-					return label1.compareTo(label2);
-				}
-				
-			});
-		}
-	}
-
-	/**
-	 * Reinitializes the palatteItemManager and informs all palette roots that use the manager to refresh
-	 */
-	public void reset() {
-		init();
-		fireModelChanged(null, null);
-	}
-	
-	private void initTagRegistry() {
-		registerHTMLCategory();
-		if (isJSP(_tagRegId))
-			registerJSPCategory();			
-		
-		registerTagsFromTagRegistry();	
-	}
-
-	private boolean isJSP(final TagRegistryIdentifier tagRegistryId) {
-		final IContentType ct = tagRegistryId.getContentType();
-		if (JSPUtil.isJSPContentType(ct.getId()))
-			return true;
-		return false;
-	}
-
-	private void registerTagsFromTagRegistry() {
-		_tagRegistry = getTagRegistry(_tagRegId);
-		if (_tagRegistry != null) {
-			for (final Namespace ns : _tagRegistry.getAllTagLibraries()) {							
-				_paletteHelper.configPaletteItemsByNamespace(this, ns);			
-			}
-		}
-	}
-
-	private ITagRegistry getTagRegistry(final TagRegistryIdentifier regId) {
-		ITagRegistry reg = null;
-		if (regId.getProject() != null) {
-			reg = CompositeTagRegistryFactory.getInstance().getRegistry(regId);
-			if (reg != null) {
-				reg.addListener(this);
-			}
-		}
-		return reg;
-	}
-
-	private void registerHTMLCategory() {
-		final CMDocument doc = HTMLCMDocumentFactory.getCMDocument(CMDocType.HTML_DOC_TYPE);
-		_paletteHelper.getOrCreateTaglibPaletteDrawer(this, doc, CMDocType.HTML_DOC_TYPE);
-	}
-
-	private void registerJSPCategory() {
-		final CMDocument doc = HTMLCMDocumentFactory.getCMDocument(CMDocType.JSP11_DOC_TYPE);
-		_paletteHelper.getOrCreateTaglibPaletteDrawer(this, doc, CMDocType.JSP11_DOC_TYPE);
-	}
-
-//	/**
-//	 * Search Classpath entry list to find if the entry is jar library and the
-//	 * library have the tld descriptor, if have ,build a palette category mapping
-//	 * the tld descriptor.
-//	 * 
-//	 * @param project
-//	 */
-//	private void registerTldFromClasspath(final IProject project) {
-//		if (project != null) {
-//			ITaglibRecord[] tldrecs = TaglibIndex.getAvailableTaglibRecords(project.getFullPath());
-//			for (int i=0;i<tldrecs.length;i++){				
-//				_paletteHelper.configPaletteItemsByTLD(this, getCurProject(), tldrecs[i]);			
-//			}
-//		}			
-//	}
-
-	/**
-	 * @param id (most likely the uri)
-	 * @param label 
-	 * @return TaglibPaletteDrawer
-	 */
-	public TaglibPaletteDrawer findOrCreateCategory(final String id, final String label) {
-		TaglibPaletteDrawer category = getTaglibPalletteDrawer(id);
-		if (category == null)
-			category = createTaglibPaletteDrawer(id, label);
-		return category;
-	}
-
-	/**
-	 * @param uri
-	 * @return TaglibPaletteDrawer
-	 */
-	public TaglibPaletteDrawer findCategoryByURI(final String uri) {
-		TaglibPaletteDrawer category;
-		for (final Iterator iter = getAllCategories().iterator(); iter.hasNext();) {
-			category = (TaglibPaletteDrawer) iter.next();
-			if (uri.equals(category.getURI())) {
-				return category;
-			}
-		}
-		return null;
-	}
-
-	public TaglibPaletteDrawer createTaglibPaletteDrawer(final String uri, final String label) {
-		final TaglibPaletteDrawer r = new TaglibPaletteDrawer(uri, label);
-		synchronized(_paletteCategories) {
-			_paletteCategories.add(r);
-		}
-		return r;
-	}
-
-	public TaglibPaletteDrawer getTaglibPalletteDrawer(final String uri) {
-		for (final Iterator iter = getAllCategories().iterator(); iter.hasNext();) {
-			final TaglibPaletteDrawer cat = (TaglibPaletteDrawer) iter.next();
-			if (uri.equalsIgnoreCase(cat.getId())) {
-				return cat;
-			}
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.pagedesigner.editors.palette.IPaletteItemManager#addEntryChangeListener(com.sybase.stf.jmt.pagedesigner.editors.palette.IEntryChangeListener)
-	 */
-	public void addEntryChangeListener(final IEntryChangeListener listener) {
-		_listeners.addIfAbsent(listener);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.pagedesigner.editors.palette.IPaletteItemManager#removeEntryChangeListener(com.sybase.stf.jmt.pagedesigner.editors.palette.IEntryChangeListener)
-	 */
-	public void removeEntryChangeListener(final IEntryChangeListener listener) {		
-		_listeners.remove(listener);
-	}
-
-	/**
-	 * Notify model change event
-	 * 
-	 * @param oldDefinitions
-	 * @param newDefinitions
-	 */
-	private void fireModelChanged(final List oldDefinitions, final List newDefinitions) {
-		if (_listeners == null) {
-			return;
-		}
-		for (final Iterator<IEntryChangeListener> it= _listeners.iterator();it.hasNext();){
-			final IEntryChangeListener listener = it.next();
-			listener.modelChanged(oldDefinitions, newDefinitions);
-		}	
-	}
-	
-	/**
-	 * Informs all paletteItemManagers, except the notifying paletteManager, of updates to the customizations
-	 * All palette viewer roots will be notifed of possible updates
-	 * @param notifyingManager 
-	 */
-	public static void notifyPaletteItemManagersOfCustomizationsUpdate(final IPaletteItemManager notifyingManager){
-		boolean hasLock = false;
-		try {
-			if (MANAGER_LOCK.tryLock(MANAGER_LOCK_TIMEOUT, TimeUnit.SECONDS)){
-				hasLock = true;
-				for (Iterator it=_managers.values().iterator();it.hasNext();){
-					final PaletteItemManager mgr = (PaletteItemManager)it.next();
-					if (mgr != null && notifyingManager != mgr)
-						mgr.reset();
-				}
-			} 
-			else {
-				//if we get here then the lock has timed out
-				PDPlugin.log(new Status(Status.ERROR, PDPlugin.getPluginId(), "Failed to get managers lock in notifyPaletteItemManagersOfCustomizationsUpdate")); //$NON-NLS-1$
-			}
-			
-		} catch (InterruptedException e) {
-			PDPlugin.log("Failed in notifyPaletteItemManagersOfCustomizationsUpdate", e); //$NON-NLS-1$
-		} finally {
-			if (hasLock)
-				MANAGER_LOCK.unlock();
-		}
-
-	}
-
-	public void registryChanged(final TagRegistryChangeEvent event) {
-		final EventType eventType = event.getType();
-		switch (eventType) {
-			case ADDED_NAMESPACE:
-				addNamespaces(event.getAffectedObjects());
-				break;
-			case REMOVED_NAMESPACE:
-				removeNamespaces(event.getAffectedObjects());
-				break;
-			case CHANGED_NAMESPACE:
-				changeNamespaces(event.getAffectedObjects());
-				break;
-			case REGISTRY_DISPOSED:
-				break;
-	
-			default:
-				break;
-		}
-		
-		DesignerPaletteCustomizationsHelper.loadUserCustomizations(this);
-		sortCategories();
-		
-		fireModelChanged(null, null);
-	}
-
-
-	private void addNamespaces(final List<? extends Namespace> affectedObjects) {
-		synchronized (_paletteCategories) {
-			for (final Namespace ns : affectedObjects) {
-				if (DEBUG)
-					System.out.println("Add NS: "+ns.getNSUri()+"["+System.currentTimeMillis()+"]"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				_paletteHelper.configPaletteItemsByNamespace(this, ns);
-			}
-		}
-	}
-	
-	private void removeNamespaces(final List<? extends Namespace> affectedObjects) {
-		final List<Integer> drawersToRemove = new ArrayList<Integer>();
-		synchronized (_paletteCategories) {
-			for (final Namespace ns : affectedObjects) {
-				for (int i=_paletteCategories.size() - 1; i >= 0; i--) {//gather in reverse order
-					final PaletteDrawer drawer = _paletteCategories.get(i);
-					if (drawer.getId().equals(ns.getNSUri())) {
-						if (DEBUG)
-							System.out.println("Remove NS: "+drawer.getId() +"["+System.currentTimeMillis()+"]"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						drawersToRemove.add(new Integer(i));	
-					}
-				}
-			}	
-			if (! drawersToRemove.isEmpty()) {
-				Collections.sort(drawersToRemove, new Comparator<Integer>() {//reverse order sort
-
-					public int compare(Integer o1, Integer o2) {
-						if (o1.intValue() > o2.intValue())
-							return -1;
-						else if (o1.intValue() < o2.intValue())
-							return 1;
-							
-						return 0;
-					}
-				});
-				for (Integer index : drawersToRemove) {
-					_paletteCategories.remove(index.intValue());				
-				}
-			}
-		}
-	}
-
-	private void changeNamespaces(final List<? extends Namespace> affectedObjects) {
-		//for now, remove then add
-		removeNamespaces(affectedObjects);
-		addNamespaces(affectedObjects);		
-	}
-
-	public TagRegistryIdentifier getTagRegistryIdentifier() {		
-		return _tagRegId;
-	}
-
-	/**
-	 * @return helper
-	 */
-	public PaletteHelper getPaletteHelper() {
-		return _paletteHelper;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/impl/TaglibPaletteDrawer.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/impl/TaglibPaletteDrawer.java
deleted file mode 100644
index 5f7ba74..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/impl/TaglibPaletteDrawer.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.palette.impl;
-
-import java.util.Iterator;
-
-import org.eclipse.gef.palette.PaletteDrawer;
-import org.eclipse.gef.palette.ToolEntry;
-import org.eclipse.jst.pagedesigner.editors.palette.TagToolPaletteEntry;
-
-/**
- * Palette Drawer for Tag lib items
- *
- */
-public class TaglibPaletteDrawer extends PaletteDrawer {
-	private String prefix;	
-
-	/**
-	 * Constructor
-	 * @param uri
-	 * @param label
-	 */
-	public TaglibPaletteDrawer(String uri, String label) {
-		super(label);
-		super.setId(uri);
-		setDrawerType(ToolEntry.PALETTE_TYPE_TOOL);
-	}
-	
-	/**
-	 * @return default prefix for tag during creation
-	 */
-	public String getDefaultPrefix() {
-		return prefix;
-	}
-
-	/**
-	 * Set the default prefix for use during item creation
-	 * @param prefix
-	 */
-	public void setDefaultPrefix(String prefix) {
-		this.prefix = prefix;
-	}
-
-	/**
-	 * @return uri identifying the library of tags
-	 */
-	public String getURI(){
-		return getId();
-	}
-	
-	/**
-	 * @param uri for the libary of tags
-	 */
-	public void setURI(String uri){
-		setId(uri);
-	}
-	
-	/**
-	 * @param id
-	 * @return TagToolPaletteEntry for the tag using the id
-	 */
-	public TagToolPaletteEntry getTagPaletteEntryById(String id){
-		for (Iterator it=getChildren().iterator();it.hasNext();){
-			TagToolPaletteEntry tag = (TagToolPaletteEntry)it.next();
-			if (tag.getId().equals(id))
-				return tag;
-		}
-		return null;
-	}
-	
-	/**
-	 * @param tagName
-	 * @return TagToolPaletteEntry using the tag name
-	 */
-	public TagToolPaletteEntry getTagPaletteEntryByTagName(String tagName){
-		for (Iterator it=getChildren().iterator();it.hasNext();){
-			TagToolPaletteEntry tag = (TagToolPaletteEntry)it.next();
-			if (tag.getTagName().equalsIgnoreCase(tagName))
-				return tag;
-		}
-		return null;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.gef.palette.PaletteDrawer#acceptsType(java.lang.Object)
-	 */
-	public boolean acceptsType(Object object){
-			return true;
-	}
-	
-	/**
-	 * @return PERMISSION_HIDE_ONLY
-	 * @see org.eclipse.gef.palette.PaletteEntry#getUserModificationPermission()
-	 */
-	public int getUserModificationPermission() {
-		return PERMISSION_HIDE_ONLY;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/messages.properties b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/messages.properties
deleted file mode 100644
index 81fbded..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/messages.properties
+++ /dev/null
@@ -1,3 +0,0 @@
-DesignerPaletteCustomizerDialog_ExportCustomizations=Export Palette Customizations
-DesignerPaletteCustomizerDialog_ImportCustomizations=Import Palette Customizations
-DesignerPaletteViewerProvider_Hide=Hide
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/IPropertyPageDescriptor.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/IPropertyPageDescriptor.java
deleted file mode 100644
index c5a8041..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/IPropertyPageDescriptor.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.properties;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.metadataprocessors.IMetaDataEnabledFeature;
-import org.eclipse.swt.widgets.Composite;
-
-/**
- * Property descriptor for metadata enabled tag attributes in the WPE property pages.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * Not intended to be implemented by clients. 
- */
-public interface IPropertyPageDescriptor extends IMetaDataEnabledFeature, IAdaptable{
-	/**
-	 * Trait id for defining quick edit tab sections.   Value must be of type qe:QuickEditTabSections
-	 * eg. <value xsi:type="qe:QuickEditTabSections">
-	 */
-	public static final String QUICK_EDIT_TAB = "quick-edit-tab"; //$NON-NLS-1$
-	/**
-	 * Trait id for category name value
-	 */
-	public static final String PROP_DESC_CATEGORY = "category"; //$NON-NLS-1$
-	
-//	/**
-//	 * Trait id for fully qualified cell editor class name
-//	 */
-//	public static final String PROP_DESC_CELL_EDITOR = "cell-editor";
-//	/**
-//	 * Trait id for fully qualified dialog field editor name
-//	 */
-//	public static final String PROP_DESC_DIALOG_FIELD_EDITOR = "dialog-field-editor";
-	
-	/**
-	 * @return name of attribute.  Must not be null.
-	 */
-	public String getAttributeName();
-	/**
-	 * @return category name.  Must not be null.
-	 */
-	public String getCategory();
-	/**
-	 * @return label to use.  Must not be null.
-	 */
-	public String getLabel();
-	/**
-	 * @return description.   May return null.
-	 */
-	public String getDescription();
-	/**
-	 * @return whether this is a required property.   Default false.
-	 */
-	public boolean isRequired();
-	/**
-	 * @param parent
-	 * @return cell editor to use.   May be null.
-	 */
-	public CellEditor getCellEditor(Composite parent);
-	/**
-	 * @return dialog field editor to use.   May be null.
-	 */
-	public DialogField getDialogFieldEditor();
-	/**
-	 * @return uri. Must not be null.
-	 */
-	public String getUri();
-	/**
-	 * @return tag name.  Must not be null.
-	 */
-	public String getTagName();
-	/**
-	 * @return fully qualified attribute-value-runtime-type as String
-	 */
-	public String getValueType();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/internal/EditorValidatorAdapter.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/internal/EditorValidatorAdapter.java
deleted file mode 100644
index a2f6304..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/internal/EditorValidatorAdapter.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.properties.internal;
-
-import org.eclipse.jface.dialogs.IInputValidator;
-import org.eclipse.jface.viewers.ICellEditorValidator;
-import org.eclipse.jst.jsf.metadataprocessors.features.IValidValues;
-import org.eclipse.jst.jsf.metadataprocessors.features.IValidationMessage;
-
-/**
- * Adapts IValidValues to ICellEditorValidator
- *
- */
-public class EditorValidatorAdapter implements ICellEditorValidator, IInputValidator {
-
-	private IValidValues _vvs;
-
-	/**
-	 * Constructor
-	 * @param vvs
-	 */
-	public EditorValidatorAdapter(IValidValues vvs) {
-		_vvs = vvs;
-	}
-
-	public String isValid(Object value) {
-		//for now, if value is not a string, return true
-		if (value instanceof String)
-			return isValid((String)value);
-		return null;
-	}
-	
-	public String isValid(String value) {
-		_vvs.getValidationMessages().clear();
-		if (_vvs.isValidValue(value))
-			return null;//is valid
-
-		return ((IValidationMessage)_vvs.getValidationMessages().get(0)).getMessage();
-
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/internal/PropertyDescriptor.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/internal/PropertyDescriptor.java
deleted file mode 100644
index eb49a6c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/internal/PropertyDescriptor.java
+++ /dev/null
@@ -1,194 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.properties.internal;
-
-import java.util.List;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jface.dialogs.IInputValidator;
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jface.viewers.ICellEditorValidator;
-import org.eclipse.jst.jsf.common.metadata.Entity;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IStructuredDocumentContextResolverFactory;
-import org.eclipse.jst.jsf.metadataprocessors.AbstractMetaDataEnabledFeature;
-import org.eclipse.jst.jsf.metadataprocessors.IMetaDataEnabledFeature;
-import org.eclipse.jst.jsf.metadataprocessors.MetaDataEnabledProcessingFactory;
-import org.eclipse.jst.jsf.metadataprocessors.features.IDefaultValue;
-import org.eclipse.jst.jsf.metadataprocessors.features.IPossibleValues;
-import org.eclipse.jst.jsf.metadataprocessors.features.IValidValues;
-import org.eclipse.jst.pagedesigner.editors.properties.IPropertyPageDescriptor;
-import org.eclipse.jst.pagedesigner.meta.EditorCreator;
-import org.eclipse.jst.pagedesigner.meta.internal.CellEditorFactoryRegistry;
-import org.eclipse.jst.pagedesigner.properties.ITabbedPropertiesConstants;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.views.properties.IPropertyDescriptor;
-import org.w3c.dom.Element;
-
-/**
- * MD enabled feature of an attribute value runtime type allowing for the tabbed property
- * page to work
- *
- */
-public class PropertyDescriptor extends AbstractMetaDataEnabledFeature
-		implements IMetaDataEnabledFeature, IPropertyPageDescriptor, IAdaptable {
-
-	/**
-	 * Constructor
-	 */
-	public PropertyDescriptor() {
-		// TODO Auto-generated constructor stub
-	}
-
-	//IPropertyPageDescriptor 
-	public String getCategory() {		
-		String cat = getTraitValueAsString(IPropertyPageDescriptor.PROP_DESC_CATEGORY);
-		return cat != null ? cat : ITabbedPropertiesConstants.OTHER_CATEGORY;
-	}
-
-	public CellEditor getCellEditor(Composite parent) {
-//		TODO: allow for override of the factory by using MD
-//		Trait trait = TaglibDomainMetaDataQueryHelper.getTrait(
-//				getMetaDataContext().getEntity(),
-//				IPropertyPageDescriptor.PROP_DESC_CELL_EDITOR);
-//		
-//		if (trait != null) {
-//			String classname = TraitValueHelper.getValueAsString(trait);
-//			if (classname != null && ! classname.equals("")){
-//				try {
-//					Class klass = PDPlugin.getDefault().getBundle().loadClass(classname);
-//					if (klass != null){
-//						//
-//					}
-//				} catch (ClassNotFoundException e) {//
-//					String msg = "Unable to locate cell editor:"+classname+ " for "+toString();
-//					PDPlugin.getDefault().getLog().log(new Status(IStatus.ERROR, PDPlugin.getPluginId(), msg));
-//				}
-//			}
-//		}
-		//otherwise use factory
-		Element element = (Element)IStructuredDocumentContextResolverFactory.INSTANCE.getDOMContextResolver(getStructuredDocumentContext()).getNode();		
-		return CellEditorFactoryRegistry.getInstance().createCellEditor(parent, this, element);
-	}
-
-	public String getDescription() {
-		return getTraitValueAsString("description"); //$NON-NLS-1$
-	}
-
-	public String getLabel() {
-		String label = getTraitValueAsString("display-label"); //$NON-NLS-1$
-		if (label == null) {
-			label = getMetaDataContext().getEntity().getId();
-		}
-		return label + ":"; //$NON-NLS-1$
-	}
-
-	public boolean isRequired() {
-		return getTraitValueAsBoolean("required"); //$NON-NLS-1$
-	}
-
-	public DialogField getDialogFieldEditor() {
-		//TODO: allow for override of the factory by using MD
-//		Trait trait = TaglibDomainMetaDataQueryHelper.getTrait(
-//				getMetaDataContext().getEntity(),
-//				IPropertyPageDescriptor.PROP_DESC_DIALOG_FIELD_EDITOR);
-//		
-//		if (trait != null) {
-//			String classname = TraitValueHelper.getValueAsString(trait);
-//			if (classname != null && ! classname.equals("")){
-//				try {
-//					Class klass = PDPlugin.getDefault().getBundle().loadClass(classname);
-//					if (klass != null){
-//						//
-//					}
-//				} catch (ClassNotFoundException e) {//
-//					String msg = "Unable to locate cell editor:"+classname+ " for "+toString();
-//					PDPlugin.getDefault().getLog().log(new Status(IStatus.ERROR, PDPlugin.getPluginId(), msg));
-//				}
-//			}
-//		}
-		//otherwise use factory
-		EditorCreator creator = EditorCreator.getInstance();
-		return creator.createDialogFieldWithWrapper(getUri(),
-				getTagName(),this, null);
-	}
-
-	public String getTagName() {
-		return getTagEntity().getId();
-	}
-
-	public String getUri() {
-		return getMetaDataContext().getEntity().getModel().getCurrentModelContext().getUri();
-	}
-	
-	public String getValueType() {
-		return getTraitValueAsString(MetaDataEnabledProcessingFactory.ATTRIBUTE_VALUE_RUNTIME_TYPE_PROP_NAME);
-	}
-
-	public String getAttributeName() {
-		return getMetaDataContext().getEntity().getId();
-	}
-
-	public Object getAdapter(Class adapter) {
-		if (IPropertyDescriptor.class == adapter) {
-			return new PropertyDescriptorAdapter(this);
-		}
-		else if (IPossibleValues.class == adapter) {
-			List pvs = MetaDataEnabledProcessingFactory.getInstance().getAttributeValueRuntimeTypeFeatureProcessors(
-						IPossibleValues.class, 
-						getStructuredDocumentContext(), 
-						getAttributeEntity());
-			if (!pvs.isEmpty())
-				return pvs.get(0);
-		}
-		else if (IDefaultValue.class == adapter) {
-			List dvs = MetaDataEnabledProcessingFactory.getInstance().getAttributeValueRuntimeTypeFeatureProcessors(
-						IDefaultValue.class, 
-						getStructuredDocumentContext(), 
-						getAttributeEntity());
-			if (!dvs.isEmpty())
-				return dvs.get(0);
-		}
-		else if (ICellEditorValidator.class == adapter) {
-			IValidValues vvs = (IValidValues)getAdapter(IValidValues.class);
-			if (vvs != null)
-				return new EditorValidatorAdapter(vvs);			
-		
-		}
-		else if (IInputValidator.class == adapter) {
-				IValidValues vvs = (IValidValues)getAdapter(IValidValues.class);
-				if (vvs != null)	
-					return new EditorValidatorAdapter(vvs);				
-		}
-		else if (IValidValues.class == adapter) {
-			List vvs = MetaDataEnabledProcessingFactory.getInstance().getAttributeValueRuntimeTypeFeatureProcessors(
-						IValidValues.class, 
-						getStructuredDocumentContext(), 
-						getAttributeEntity());
-			if (!vvs.isEmpty())
-				return vvs.get(0);
-		}
-		return null;
-	}
-	
-	private Entity getTagEntity() {
-		return (Entity)getAttributeEntity().eContainer();
-	}
-	
-	private Entity getAttributeEntity() {
-		return getMetaDataContext().getEntity();
-	}
-	
-	public String toString() {
-		return getUri()+"/"+getTagName()+"/"+getAttributeName(); //$NON-NLS-1$ //$NON-NLS-2$
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/internal/PropertyDescriptorAdapter.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/internal/PropertyDescriptorAdapter.java
deleted file mode 100644
index a946b29..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/internal/PropertyDescriptorAdapter.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.properties.internal;
-
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jst.pagedesigner.editors.properties.IPropertyPageDescriptor;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.views.properties.IPropertyDescriptor;
-
-/**
- * Adapts the MetadataEnabledFeature <code>org.eclipse.jst.pagedesigner.editors.properties.IPropertyPageDescriptor</code>, to a <code>org.eclipse.ui.views.properties.IPropertyDescriptor</code> 
- *
- */
-public class PropertyDescriptorAdapter implements IPropertyDescriptor{
-
-	private IPropertyPageDescriptor _ppd;
-
-	/**
-	 * Constructor
-	 * @param propertyPageDescriptor
-	 */
-	public PropertyDescriptorAdapter(IPropertyPageDescriptor propertyPageDescriptor) {
-		_ppd = propertyPageDescriptor;
-	}
-
-	public CellEditor createPropertyEditor(Composite parent) {
-		return _ppd.getCellEditor(parent);
-	}
-
-	public String getCategory() {
-		return _ppd.getCategory();
-	}
-
-	public String getDescription() {
-		return _ppd.getDescription();
-	}
-
-	public String getDisplayName() {
-		return _ppd.getAttributeName();
-	}
-
-	public String[] getFilterFlags() {
-		return null;
-	}
-
-	public Object getHelpContextIds() {
-		return null;//FIXME
-	}
-
-	public Object getId() {
-		return _ppd.getAttributeName();
-	}
-
-	public ILabelProvider getLabelProvider() {	
-		return null;//FIXME: do better?  Used to supply labels for attribute property sheet (not quick edit)
-	}
-
-	public boolean isCompatibleWith(IPropertyDescriptor anotherProperty) {
-		return false;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/package-info.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/package-info.java
deleted file mode 100644
index 4dae0fb..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/package-info.java
+++ /dev/null
@@ -1,18 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-/**
- * Web Page Editor tag attribute property page interfaces. 
- * 
- * <p><b>Provisional API - subject to change</b></p>
- */
-package org.eclipse.jst.pagedesigner.editors.properties;
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/quickedittabsections/QuickEditTabSections.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/quickedittabsections/QuickEditTabSections.java
deleted file mode 100644
index c3d5304..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/quickedittabsections/QuickEditTabSections.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/**
- * Copyright (c) 2007 Oracle Corporation
- *
- * $Id: QuickEditTabSections.java,v 1.2 2008/11/18 22:22:35 gkessler Exp $
- */
-package org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections;
-
-import org.eclipse.emf.common.util.EList;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Quick Edit Tab Sections</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.QuickEditTabSections#getSections <em>Sections</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.QuickEditTabSectionsPackage#getQuickEditTabSections()
- * @model
- * @generated
- */
-public interface QuickEditTabSections extends EObject {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2007 Oracle Corporation"; //$NON-NLS-1$
-	
-	/**
-	 * trait id to use
-	 * @generated NOT
-	 */
-	String TRAIT_ID = "quick-edit-tab"; //$NON-NLS-1$
-	
-	/**
-	 * Returns the value of the '<em><b>Sections</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.SectionInfo}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Sections</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Sections</em>' containment reference list.
-	 * @see org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.QuickEditTabSectionsPackage#getQuickEditTabSections_Sections()
-	 * @model containment="true"
-	 *        extendedMetaData="kind='element' name='section'"
-	 * @generated
-	 */
-	EList<SectionInfo> getSections();
-
-} // QuickEditTabSections
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/quickedittabsections/QuickEditTabSectionsFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/quickedittabsections/QuickEditTabSectionsFactory.java
deleted file mode 100644
index d51fba9..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/quickedittabsections/QuickEditTabSectionsFactory.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/**
- * Copyright (c) 2007 Oracle Corporation
- *
- * $Id: QuickEditTabSectionsFactory.java,v 1.2 2008/11/18 22:22:35 gkessler Exp $
- */
-package org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections;
-
-import org.eclipse.emf.ecore.EFactory;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Factory</b> for the model.
- * It provides a create method for each non-abstract class of the model.
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.QuickEditTabSectionsPackage
- * @generated
- */
-public interface QuickEditTabSectionsFactory extends EFactory {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2007 Oracle Corporation"; //$NON-NLS-1$
-
-	/**
-	 * The singleton instance of the factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	QuickEditTabSectionsFactory eINSTANCE = org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.internal.impl.QuickEditTabSectionsFactoryImpl.init();
-
-	/**
-	 * Returns a new object of class '<em>Quick Edit Tab Sections</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Quick Edit Tab Sections</em>'.
-	 * @generated
-	 */
-	QuickEditTabSections createQuickEditTabSections();
-
-	/**
-	 * Returns a new object of class '<em>Section Info</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Section Info</em>'.
-	 * @generated
-	 */
-	SectionInfo createSectionInfo();
-
-	/**
-	 * Returns the package supported by this factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the package supported by this factory.
-	 * @generated
-	 */
-	QuickEditTabSectionsPackage getQuickEditTabSectionsPackage();
-
-} //QuickEditTabSectionsFactory
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/quickedittabsections/QuickEditTabSectionsPackage.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/quickedittabsections/QuickEditTabSectionsPackage.java
deleted file mode 100644
index e23670b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/quickedittabsections/QuickEditTabSectionsPackage.java
+++ /dev/null
@@ -1,288 +0,0 @@
-/**
- * Copyright (c) 2007 Oracle Corporation
- *
- * $Id: QuickEditTabSectionsPackage.java,v 1.5 2008/11/18 22:22:35 gkessler Exp $
- */
-package org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections;
-
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EEnum;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.EReference;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Package</b> for the model.
- * It contains accessors for the meta objects to represent
- * <ul>
- *   <li>each class,</li>
- *   <li>each feature of each class,</li>
- *   <li>each enum,</li>
- *   <li>and each data type</li>
- * </ul>
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.QuickEditTabSectionsFactory
- * @model kind="package"
- * @generated
- */
-@SuppressWarnings("hiding")
-public interface QuickEditTabSectionsPackage extends EPackage {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2007 Oracle Corporation"; //$NON-NLS-1$
-
-	/**
-	 * The package name.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String eNAME = "quickedittabsections"; //$NON-NLS-1$
-
-	/**
-	 * The package namespace URI.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String eNS_URI = "http://org.eclipse.jsf.pagedesigner/QuickEditTabSections.ecore"; //$NON-NLS-1$
-
-	/**
-	 * The package namespace name.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String eNS_PREFIX = "qe"; //$NON-NLS-1$
-
-	/**
-	 * The singleton instance of the package.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	QuickEditTabSectionsPackage eINSTANCE = org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.internal.impl.QuickEditTabSectionsPackageImpl.init();
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.internal.impl.QuickEditTabSectionsImpl <em>Quick Edit Tab Sections</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.internal.impl.QuickEditTabSectionsImpl
-	 * @see org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.internal.impl.QuickEditTabSectionsPackageImpl#getQuickEditTabSections()
-	 * @generated
-	 */
-	int QUICK_EDIT_TAB_SECTIONS = 0;
-
-	/**
-	 * The feature id for the '<em><b>Sections</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int QUICK_EDIT_TAB_SECTIONS__SECTIONS = 0;
-
-	/**
-	 * The number of structural features of the '<em>Quick Edit Tab Sections</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int QUICK_EDIT_TAB_SECTIONS_FEATURE_COUNT = 1;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.internal.impl.SectionInfoImpl <em>Section Info</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.internal.impl.SectionInfoImpl
-	 * @see org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.internal.impl.QuickEditTabSectionsPackageImpl#getSectionInfo()
-	 * @generated
-	 */
-	int SECTION_INFO = 1;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SECTION_INFO__ID = 0;
-
-	/**
-	 * The feature id for the '<em><b>Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SECTION_INFO__TYPE = 1;
-
-	/**
-	 * The number of structural features of the '<em>Section Info</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SECTION_INFO_FEATURE_COUNT = 2;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.SECTION_TYPE <em>SECTION TYPE</em>}' enum.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.SECTION_TYPE
-	 * @see org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.internal.impl.QuickEditTabSectionsPackageImpl#getSECTION_TYPE()
-	 * @generated
-	 */
-	int SECTION_TYPE = 2;
-
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.QuickEditTabSections <em>Quick Edit Tab Sections</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Quick Edit Tab Sections</em>'.
-	 * @see org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.QuickEditTabSections
-	 * @generated
-	 */
-	EClass getQuickEditTabSections();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.QuickEditTabSections#getSections <em>Sections</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Sections</em>'.
-	 * @see org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.QuickEditTabSections#getSections()
-	 * @see #getQuickEditTabSections()
-	 * @generated
-	 */
-	EReference getQuickEditTabSections_Sections();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.SectionInfo <em>Section Info</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Section Info</em>'.
-	 * @see org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.SectionInfo
-	 * @generated
-	 */
-	EClass getSectionInfo();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.SectionInfo#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.SectionInfo#getId()
-	 * @see #getSectionInfo()
-	 * @generated
-	 */
-	EAttribute getSectionInfo_Id();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.SectionInfo#getType <em>Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Type</em>'.
-	 * @see org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.SectionInfo#getType()
-	 * @see #getSectionInfo()
-	 * @generated
-	 */
-	EAttribute getSectionInfo_Type();
-
-	/**
-	 * Returns the meta object for enum '{@link org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.SECTION_TYPE <em>SECTION TYPE</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for enum '<em>SECTION TYPE</em>'.
-	 * @see org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.SECTION_TYPE
-	 * @generated
-	 */
-	EEnum getSECTION_TYPE();
-
-	/**
-	 * Returns the factory that creates the instances of the model.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the factory that creates the instances of the model.
-	 * @generated
-	 */
-	QuickEditTabSectionsFactory getQuickEditTabSectionsFactory();
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * Defines literals for the meta objects that represent
-	 * <ul>
-	 *   <li>each class,</li>
-	 *   <li>each feature of each class,</li>
-	 *   <li>each enum,</li>
-	 *   <li>and each data type</li>
-	 * </ul>
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-//    @SuppressWarnings("hiding")
-	interface Literals {
-		/**
-		 * The meta object literal for the '{@link org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.internal.impl.QuickEditTabSectionsImpl <em>Quick Edit Tab Sections</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.internal.impl.QuickEditTabSectionsImpl
-		 * @see org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.internal.impl.QuickEditTabSectionsPackageImpl#getQuickEditTabSections()
-		 * @generated
-		 */
-        EClass QUICK_EDIT_TAB_SECTIONS = eINSTANCE.getQuickEditTabSections();
-
-		/**
-		 * The meta object literal for the '<em><b>Sections</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference QUICK_EDIT_TAB_SECTIONS__SECTIONS = eINSTANCE.getQuickEditTabSections_Sections();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.internal.impl.SectionInfoImpl <em>Section Info</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.internal.impl.SectionInfoImpl
-		 * @see org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.internal.impl.QuickEditTabSectionsPackageImpl#getSectionInfo()
-		 * @generated
-		 */
-		EClass SECTION_INFO = eINSTANCE.getSectionInfo();
-
-		/**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute SECTION_INFO__ID = eINSTANCE.getSectionInfo_Id();
-
-		/**
-		 * The meta object literal for the '<em><b>Type</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute SECTION_INFO__TYPE = eINSTANCE.getSectionInfo_Type();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.SECTION_TYPE <em>SECTION TYPE</em>}' enum.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.SECTION_TYPE
-		 * @see org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.internal.impl.QuickEditTabSectionsPackageImpl#getSECTION_TYPE()
-		 * @generated
-		 */
-		EEnum SECTION_TYPE = eINSTANCE.getSECTION_TYPE();
-
-	}
-
-} //QuickEditTabSectionsPackage
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/quickedittabsections/SECTION_TYPE.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/quickedittabsections/SECTION_TYPE.java
deleted file mode 100644
index 3db1adf..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/quickedittabsections/SECTION_TYPE.java
+++ /dev/null
@@ -1,224 +0,0 @@
-/**
- * Copyright (c) 2007 Oracle Corporation
- *
- * $Id: SECTION_TYPE.java,v 1.3 2008/11/18 22:22:35 gkessler Exp $
- */
-package org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections;
-
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.emf.common.util.Enumerator;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the literals of the enumeration '<em><b>SECTION TYPE</b></em>',
- * and utility methods for working with them.
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.QuickEditTabSectionsPackage#getSECTION_TYPE()
- * @model
- * @generated
- */
-public enum SECTION_TYPE implements Enumerator {
-	/**
-	 * The '<em><b>ATTRIBUTE</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #ATTRIBUTE_VALUE
-	 * @generated
-	 * @ordered
-	 */
-	ATTRIBUTE(0, "ATTRIBUTE", "ATTRIBUTE"), //$NON-NLS-1$ //$NON-NLS-2$
-
-	/**
-	 * The '<em><b>SECTION</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #SECTION_VALUE
-	 * @generated
-	 * @ordered
-	 */
-	SECTION(1, "SECTION", "SECTION"); //$NON-NLS-1$ //$NON-NLS-2$
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2007 Oracle Corporation"; //$NON-NLS-1$
-
-	/**
-	 * The '<em><b>ATTRIBUTE</b></em>' literal value.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of '<em><b>ATTRIBUTE</b></em>' literal object isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @see #ATTRIBUTE
-	 * @model
-	 * @generated
-	 * @ordered
-	 */
-	public static final int ATTRIBUTE_VALUE = 0;
-
-	/**
-	 * The '<em><b>SECTION</b></em>' literal value.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of '<em><b>SECTION</b></em>' literal object isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @see #SECTION
-	 * @model
-	 * @generated
-	 * @ordered
-	 */
-	public static final int SECTION_VALUE = 1;
-
-	/**
-	 * An array of all the '<em><b>SECTION TYPE</b></em>' enumerators.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final SECTION_TYPE[] VALUES_ARRAY =
-		new SECTION_TYPE[] {
-			ATTRIBUTE,
-			SECTION,
-		};
-
-	/**
-	 * A public read-only list of all the '<em><b>SECTION TYPE</b></em>' enumerators.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final List<SECTION_TYPE> VALUES = Collections.unmodifiableList(Arrays.asList(VALUES_ARRAY));
-
-	/**
-	 * Returns the '<em><b>SECTION TYPE</b></em>' literal with the specified literal value.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param literal 
-	 * @return SECTION_TYPE
-	 * @generated
-	 */
-	public static SECTION_TYPE get(String literal) {
-		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
-			SECTION_TYPE result = VALUES_ARRAY[i];
-			if (result.toString().equals(literal)) {
-				return result;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Returns the '<em><b>SECTION TYPE</b></em>' literal with the specified name.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param name 
-	 * @return SECTION_TYPE
-	 * @generated
-	 */
-	public static SECTION_TYPE getByName(String name) {
-		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
-			SECTION_TYPE result = VALUES_ARRAY[i];
-			if (result.getName().equals(name)) {
-				return result;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Returns the '<em><b>SECTION TYPE</b></em>' literal with the specified integer value.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value 
-	 * @return SECTION_TYPE
-	 * @generated
-	 */
-	public static SECTION_TYPE get(int value) {
-		switch (value) {
-			case ATTRIBUTE_VALUE: return ATTRIBUTE;
-			case SECTION_VALUE: return SECTION;
-		}
-		return null;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private final int value;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private final String name;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private final String literal;
-
-	/**
-	 * Only this class can construct instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private SECTION_TYPE(int value, String name, String literal) {
-		this.value = value;
-		this.name = name;
-		this.literal = literal;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public int getValue() {
-	  return value;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getName() {
-	  return name;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getLiteral() {
-	  return literal;
-	}
-
-	/**
-	 * Returns the literal value of the enumerator, which is its string representation.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public String toString() {
-		return literal;
-	}
-	
-} //SECTION_TYPE
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/quickedittabsections/SectionInfo.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/quickedittabsections/SectionInfo.java
deleted file mode 100644
index 8f5a152..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/quickedittabsections/SectionInfo.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/**
- * Copyright (c) 2007 Oracle Corporation
- *
- * $Id: SectionInfo.java,v 1.2 2008/11/18 22:22:35 gkessler Exp $
- */
-package org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Section Info</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.SectionInfo#getId <em>Id</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.SectionInfo#getType <em>Type</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.QuickEditTabSectionsPackage#getSectionInfo()
- * @model
- * @generated
- */
-public interface SectionInfo extends EObject {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2007 Oracle Corporation"; //$NON-NLS-1$
-
-	/**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.QuickEditTabSectionsPackage#getSectionInfo_Id()
-	 * @model required="true"
-	 * @generated
-	 */
-	String getId();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.SectionInfo#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Type</b></em>' attribute.
-	 * The default value is <code>"ATTRIBUTE"</code>.
-	 * The literals are from the enumeration {@link org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.SECTION_TYPE}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Type</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Type</em>' attribute.
-	 * @see org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.SECTION_TYPE
-	 * @see #setType(SECTION_TYPE)
-	 * @see org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.QuickEditTabSectionsPackage#getSectionInfo_Type()
-	 * @model default="ATTRIBUTE" unique="false"
-	 * @generated
-	 */
-	SECTION_TYPE getType();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.SectionInfo#getType <em>Type</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Type</em>' attribute.
-	 * @see org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.SECTION_TYPE
-	 * @see #getType()
-	 * @generated
-	 */
-	void setType(SECTION_TYPE value);
-
-} // SectionInfo
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/quickedittabsections/internal/impl/QuickEditTabSectionsFactoryImpl.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/quickedittabsections/internal/impl/QuickEditTabSectionsFactoryImpl.java
deleted file mode 100644
index 1388669..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/quickedittabsections/internal/impl/QuickEditTabSectionsFactoryImpl.java
+++ /dev/null
@@ -1,176 +0,0 @@
-/**
- * Copyright (c) 2007 Oracle Corporation
- *
- * $Id: QuickEditTabSectionsFactoryImpl.java,v 1.3 2008/11/18 22:22:35 gkessler Exp $
- */
-package org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.internal.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EDataType;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.impl.EFactoryImpl;
-import org.eclipse.emf.ecore.plugin.EcorePlugin;
-import org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.QuickEditTabSections;
-import org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.QuickEditTabSectionsFactory;
-import org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.QuickEditTabSectionsPackage;
-import org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.SECTION_TYPE;
-import org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.SectionInfo;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model <b>Factory</b>.
- * <!-- end-user-doc -->
- * @generated
- */
-public class QuickEditTabSectionsFactoryImpl extends EFactoryImpl implements QuickEditTabSectionsFactory {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2007 Oracle Corporation"; //$NON-NLS-1$
-
-	/**
-	 * Creates the default factory implementation.
-	 * <!-- begin-user-doc -->
-     * @return the factory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static QuickEditTabSectionsFactory init() {
-		try {
-			QuickEditTabSectionsFactory theQuickEditTabSectionsFactory = (QuickEditTabSectionsFactory)EPackage.Registry.INSTANCE.getEFactory("http://org.eclipse.jsf.pagedesigner/QuickEditTabSections.ecore");  //$NON-NLS-1$
-			if (theQuickEditTabSectionsFactory != null) {
-				return theQuickEditTabSectionsFactory;
-			}
-		}
-		catch (Exception exception) {
-			EcorePlugin.INSTANCE.log(exception);
-		}
-		return new QuickEditTabSectionsFactoryImpl();
-	}
-
-	/**
-	 * Creates an instance of the factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public QuickEditTabSectionsFactoryImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public EObject create(EClass eClass) {
-		switch (eClass.getClassifierID()) {
-			case QuickEditTabSectionsPackage.QUICK_EDIT_TAB_SECTIONS: return createQuickEditTabSections();
-			case QuickEditTabSectionsPackage.SECTION_INFO: return createSectionInfo();
-			default:
-				throw new IllegalArgumentException("The class '" + eClass.getName() + "' is not a valid classifier"); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public Object createFromString(EDataType eDataType, String initialValue) {
-		switch (eDataType.getClassifierID()) {
-			case QuickEditTabSectionsPackage.SECTION_TYPE:
-				return createSECTION_TYPEFromString(eDataType, initialValue);
-			default:
-				throw new IllegalArgumentException("The datatype '" + eDataType.getName() + "' is not a valid classifier"); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public String convertToString(EDataType eDataType, Object instanceValue) {
-		switch (eDataType.getClassifierID()) {
-			case QuickEditTabSectionsPackage.SECTION_TYPE:
-				return convertSECTION_TYPEToString(eDataType, instanceValue);
-			default:
-				throw new IllegalArgumentException("The datatype '" + eDataType.getName() + "' is not a valid classifier"); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public QuickEditTabSections createQuickEditTabSections() {
-		QuickEditTabSectionsImpl quickEditTabSections = new QuickEditTabSectionsImpl();
-		return quickEditTabSections;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public SectionInfo createSectionInfo() {
-		SectionInfoImpl sectionInfo = new SectionInfoImpl();
-		return sectionInfo;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-     * @param eDataType 
-     * @param initialValue 
-     * @return the SECTION_TYPE enumerator 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public SECTION_TYPE createSECTION_TYPEFromString(EDataType eDataType, String initialValue) {
-		SECTION_TYPE result = SECTION_TYPE.get(initialValue);
-		if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-		return result;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-     * @param eDataType 
-     * @param instanceValue 
-     * @return the String version of the section type 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertSECTION_TYPEToString(EDataType eDataType, Object instanceValue) {
-		return instanceValue == null ? null : instanceValue.toString();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public QuickEditTabSectionsPackage getQuickEditTabSectionsPackage() {
-		return (QuickEditTabSectionsPackage)getEPackage();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-     * @return the package 
-	 * <!-- end-user-doc -->
-	 * @deprecated
-	 * @generated
-	 */
-	@Deprecated
-	public static QuickEditTabSectionsPackage getPackage() {
-		return QuickEditTabSectionsPackage.eINSTANCE;
-	}
-
-} //QuickEditTabSectionsFactoryImpl
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/quickedittabsections/internal/impl/QuickEditTabSectionsImpl.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/quickedittabsections/internal/impl/QuickEditTabSectionsImpl.java
deleted file mode 100644
index 081c76f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/quickedittabsections/internal/impl/QuickEditTabSectionsImpl.java
+++ /dev/null
@@ -1,157 +0,0 @@
-/**
- * Copyright (c) 2007 Oracle Corporation
- *
- * $Id: QuickEditTabSectionsImpl.java,v 1.2 2008/11/18 22:22:35 gkessler Exp $
- */
-package org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.internal.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.QuickEditTabSections;
-import org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.QuickEditTabSectionsPackage;
-import org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.SectionInfo;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Quick Edit Tab Sections</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.internal.impl.QuickEditTabSectionsImpl#getSections <em>Sections</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class QuickEditTabSectionsImpl extends EObjectImpl implements QuickEditTabSections {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2007 Oracle Corporation"; //$NON-NLS-1$
-
-	/**
-	 * The cached value of the '{@link #getSections() <em>Sections</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getSections()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList<SectionInfo> sections;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected QuickEditTabSectionsImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	protected EClass eStaticClass() {
-		return QuickEditTabSectionsPackage.Literals.QUICK_EDIT_TAB_SECTIONS;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList<SectionInfo> getSections() {
-		if (sections == null) {
-			sections = new EObjectContainmentEList<SectionInfo>(SectionInfo.class, this, QuickEditTabSectionsPackage.QUICK_EDIT_TAB_SECTIONS__SECTIONS);
-		}
-		return sections;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case QuickEditTabSectionsPackage.QUICK_EDIT_TAB_SECTIONS__SECTIONS:
-				return ((InternalEList<?>)getSections()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case QuickEditTabSectionsPackage.QUICK_EDIT_TAB_SECTIONS__SECTIONS:
-				return getSections();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@SuppressWarnings("unchecked")
-	@Override
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case QuickEditTabSectionsPackage.QUICK_EDIT_TAB_SECTIONS__SECTIONS:
-				getSections().clear();
-				getSections().addAll((Collection<? extends SectionInfo>)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case QuickEditTabSectionsPackage.QUICK_EDIT_TAB_SECTIONS__SECTIONS:
-				getSections().clear();
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case QuickEditTabSectionsPackage.QUICK_EDIT_TAB_SECTIONS__SECTIONS:
-				return sections != null && !sections.isEmpty();
-		}
-		return super.eIsSet(featureID);
-	}
-
-} //QuickEditTabSectionsImpl
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/quickedittabsections/internal/impl/QuickEditTabSectionsPackageImpl.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/quickedittabsections/internal/impl/QuickEditTabSectionsPackageImpl.java
deleted file mode 100644
index 636c6ba..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/quickedittabsections/internal/impl/QuickEditTabSectionsPackageImpl.java
+++ /dev/null
@@ -1,283 +0,0 @@
-/**
- * Copyright (c) 2007 Oracle Corporation
- *
- * $Id: QuickEditTabSectionsPackageImpl.java,v 1.3 2008/11/18 22:22:35 gkessler Exp $
- */
-package org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.internal.impl;
-
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EEnum;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.EReference;
-import org.eclipse.emf.ecore.impl.EPackageImpl;
-import org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.QuickEditTabSections;
-import org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.QuickEditTabSectionsFactory;
-import org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.QuickEditTabSectionsPackage;
-import org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.SectionInfo;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model <b>Package</b>.
- * <!-- end-user-doc -->
- * @generated
- */
-public class QuickEditTabSectionsPackageImpl extends EPackageImpl implements QuickEditTabSectionsPackage {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2007 Oracle Corporation"; //$NON-NLS-1$
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass quickEditTabSectionsEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass sectionInfoEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EEnum sectioN_TYPEEEnum = null;
-
-	/**
-	 * Creates an instance of the model <b>Package</b>, registered with
-	 * {@link org.eclipse.emf.ecore.EPackage.Registry EPackage.Registry} by the package
-	 * package URI value.
-	 * <p>Note: the correct way to create the package is via the static
-	 * factory method {@link #init init()}, which also performs
-	 * initialization of the package, or returns the registered package,
-	 * if one already exists.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.emf.ecore.EPackage.Registry
-	 * @see org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.QuickEditTabSectionsPackage#eNS_URI
-	 * @see #init()
-	 * @generated
-	 */
-	private QuickEditTabSectionsPackageImpl() {
-		super(eNS_URI, QuickEditTabSectionsFactory.eINSTANCE);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static boolean isInited = false;
-
-	/**
-	 * Creates, registers, and initializes the <b>Package</b> for this
-	 * model, and for any others upon which it depends.  Simple
-	 * dependencies are satisfied by calling this method on all
-	 * dependent packages before doing anything else.  This method drives
-	 * initialization for interdependent packages directly, in parallel
-	 * with this package, itself.
-	 * <p>Of this package and its interdependencies, all packages which
-	 * have not yet been registered by their URI values are first created
-	 * and registered.  The packages are then initialized in two steps:
-	 * meta-model objects for all of the packages are created before any
-	 * are initialized, since one package's meta-model objects may refer to
-	 * those of another.
-	 * <p>Invocation of this method will not affect any packages that have
-	 * already been initialized.
-	 * <!-- begin-user-doc -->
-     * @return the initialized package 
-	 * <!-- end-user-doc -->
-	 * @see #eNS_URI
-	 * @see #createPackageContents()
-	 * @see #initializePackageContents()
-	 * @generated
-	 */
-	public static QuickEditTabSectionsPackage init() {
-		if (isInited) return (QuickEditTabSectionsPackage)EPackage.Registry.INSTANCE.getEPackage(QuickEditTabSectionsPackage.eNS_URI);
-
-		// Obtain or create and register package
-		QuickEditTabSectionsPackageImpl theQuickEditTabSectionsPackage = (QuickEditTabSectionsPackageImpl)(EPackage.Registry.INSTANCE.getEPackage(eNS_URI) instanceof QuickEditTabSectionsPackageImpl ? EPackage.Registry.INSTANCE.getEPackage(eNS_URI) : new QuickEditTabSectionsPackageImpl());
-
-		isInited = true;
-
-		// Create package meta-data objects
-		theQuickEditTabSectionsPackage.createPackageContents();
-
-		// Initialize created meta-data
-		theQuickEditTabSectionsPackage.initializePackageContents();
-
-		// Mark meta-data to indicate it can't be changed
-		theQuickEditTabSectionsPackage.freeze();
-
-		return theQuickEditTabSectionsPackage;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getQuickEditTabSections() {
-		return quickEditTabSectionsEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getQuickEditTabSections_Sections() {
-		return (EReference)quickEditTabSectionsEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getSectionInfo() {
-		return sectionInfoEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getSectionInfo_Id() {
-		return (EAttribute)sectionInfoEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getSectionInfo_Type() {
-		return (EAttribute)sectionInfoEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EEnum getSECTION_TYPE() {
-		return sectioN_TYPEEEnum;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public QuickEditTabSectionsFactory getQuickEditTabSectionsFactory() {
-		return (QuickEditTabSectionsFactory)getEFactoryInstance();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private boolean isCreated = false;
-
-	/**
-	 * Creates the meta-model objects for the package.  This method is
-	 * guarded to have no affect on any invocation but its first.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void createPackageContents() {
-		if (isCreated) return;
-		isCreated = true;
-
-		// Create classes and their features
-		quickEditTabSectionsEClass = createEClass(QUICK_EDIT_TAB_SECTIONS);
-		createEReference(quickEditTabSectionsEClass, QUICK_EDIT_TAB_SECTIONS__SECTIONS);
-
-		sectionInfoEClass = createEClass(SECTION_INFO);
-		createEAttribute(sectionInfoEClass, SECTION_INFO__ID);
-		createEAttribute(sectionInfoEClass, SECTION_INFO__TYPE);
-
-		// Create enums
-		sectioN_TYPEEEnum = createEEnum(SECTION_TYPE);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private boolean isInitialized = false;
-
-	/**
-	 * Complete the initialization of the package and its meta-model.  This
-	 * method is guarded to have no affect on any invocation but its first.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void initializePackageContents() {
-		if (isInitialized) return;
-		isInitialized = true;
-
-		// Initialize package
-		setName(eNAME);
-		setNsPrefix(eNS_PREFIX);
-		setNsURI(eNS_URI);
-
-		// Create type parameters
-
-		// Set bounds for type parameters
-
-		// Add supertypes to classes
-
-		// Initialize classes and features; add operations and parameters
-		initEClass(quickEditTabSectionsEClass, QuickEditTabSections.class, "QuickEditTabSections", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEReference(getQuickEditTabSections_Sections(), this.getSectionInfo(), null, "sections", null, 0, -1, QuickEditTabSections.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-		initEClass(sectionInfoEClass, SectionInfo.class, "SectionInfo", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEAttribute(getSectionInfo_Id(), ecorePackage.getEString(), "id", null, 1, 1, SectionInfo.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEAttribute(getSectionInfo_Type(), this.getSECTION_TYPE(), "type", "ATTRIBUTE", 0, 1, SectionInfo.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$
-
-		// Initialize enums and add enum literals
-		initEEnum(sectioN_TYPEEEnum, org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.SECTION_TYPE.class, "SECTION_TYPE"); //$NON-NLS-1$
-		addEEnumLiteral(sectioN_TYPEEEnum, org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.SECTION_TYPE.ATTRIBUTE);
-		addEEnumLiteral(sectioN_TYPEEEnum, org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.SECTION_TYPE.SECTION);
-
-		// Create resource
-		createResource(eNS_URI);
-
-		// Create annotations
-		// http:///org/eclipse/emf/ecore/util/ExtendedMetaData
-		createExtendedMetaDataAnnotations();
-	}
-
-	/**
-	 * Initializes the annotations for <b>http:///org/eclipse/emf/ecore/util/ExtendedMetaData</b>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void createExtendedMetaDataAnnotations() {
-		String source = "http:///org/eclipse/emf/ecore/util/ExtendedMetaData";		 //$NON-NLS-1$
-		addAnnotation
-		  (getQuickEditTabSections_Sections(), 
-		   source, 
-		   new String[] {
-			 "kind", "element", //$NON-NLS-1$ //$NON-NLS-2$
-			 "name", "section" //$NON-NLS-1$ //$NON-NLS-2$
-		   });
-	}
-
-} //QuickEditTabSectionsPackageImpl
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/quickedittabsections/internal/impl/SectionInfoImpl.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/quickedittabsections/internal/impl/SectionInfoImpl.java
deleted file mode 100644
index b0019d9..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/quickedittabsections/internal/impl/SectionInfoImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/**
- * Copyright (c) 2007 Oracle Corporation
- *
- * $Id: SectionInfoImpl.java,v 1.2 2008/11/18 22:22:35 gkessler Exp $
- */
-package org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.internal.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.QuickEditTabSectionsPackage;
-import org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.SECTION_TYPE;
-import org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.SectionInfo;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Section Info</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.internal.impl.SectionInfoImpl#getId <em>Id</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.internal.impl.SectionInfoImpl#getType <em>Type</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class SectionInfoImpl extends EObjectImpl implements SectionInfo {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2007 Oracle Corporation"; //$NON-NLS-1$
-
-	/**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getType() <em>Type</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getType()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final SECTION_TYPE TYPE_EDEFAULT = SECTION_TYPE.ATTRIBUTE;
-
-	/**
-	 * The cached value of the '{@link #getType() <em>Type</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getType()
-	 * @generated
-	 * @ordered
-	 */
-	protected SECTION_TYPE type = TYPE_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected SectionInfoImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	protected EClass eStaticClass() {
-		return QuickEditTabSectionsPackage.Literals.SECTION_INFO;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, QuickEditTabSectionsPackage.SECTION_INFO__ID, oldId, id));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public SECTION_TYPE getType() {
-		return type;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setType(SECTION_TYPE newType) {
-		SECTION_TYPE oldType = type;
-		type = newType == null ? TYPE_EDEFAULT : newType;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, QuickEditTabSectionsPackage.SECTION_INFO__TYPE, oldType, type));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case QuickEditTabSectionsPackage.SECTION_INFO__ID:
-				return getId();
-			case QuickEditTabSectionsPackage.SECTION_INFO__TYPE:
-				return getType();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case QuickEditTabSectionsPackage.SECTION_INFO__ID:
-				setId((String)newValue);
-				return;
-			case QuickEditTabSectionsPackage.SECTION_INFO__TYPE:
-				setType((SECTION_TYPE)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case QuickEditTabSectionsPackage.SECTION_INFO__ID:
-				setId(ID_EDEFAULT);
-				return;
-			case QuickEditTabSectionsPackage.SECTION_INFO__TYPE:
-				setType(TYPE_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case QuickEditTabSectionsPackage.SECTION_INFO__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-			case QuickEditTabSectionsPackage.SECTION_INFO__TYPE:
-				return type != TYPE_EDEFAULT;
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(", type: "); //$NON-NLS-1$
-		result.append(type);
-		result.append(')');
-		return result.toString();
-	}
-
-} //SectionInfoImpl
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/quickedittabsections/internal/util/QuickEditTabSectionsAdapterFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/quickedittabsections/internal/util/QuickEditTabSectionsAdapterFactory.java
deleted file mode 100644
index f6b7045..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/quickedittabsections/internal/util/QuickEditTabSectionsAdapterFactory.java
+++ /dev/null
@@ -1,148 +0,0 @@
-/**
- * Copyright (c) 2007 Oracle Corporation
- *
- * $Id: QuickEditTabSectionsAdapterFactory.java,v 1.2 2008/11/18 22:22:46 gkessler Exp $
- */
-package org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.internal.util;
-
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.common.notify.Notifier;
-
-import org.eclipse.emf.common.notify.impl.AdapterFactoryImpl;
-
-import org.eclipse.emf.ecore.EObject;
-
-import org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.*;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Adapter Factory</b> for the model.
- * It provides an adapter <code>createXXX</code> method for each class of the model.
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.QuickEditTabSectionsPackage
- * @generated
- */
-public class QuickEditTabSectionsAdapterFactory extends AdapterFactoryImpl {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2007 Oracle Corporation"; //$NON-NLS-1$
-
-	/**
-	 * The cached model package.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected static QuickEditTabSectionsPackage modelPackage;
-
-	/**
-	 * Creates an instance of the adapter factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public QuickEditTabSectionsAdapterFactory() {
-		if (modelPackage == null) {
-			modelPackage = QuickEditTabSectionsPackage.eINSTANCE;
-		}
-	}
-
-	/**
-	 * Returns whether this factory is applicable for the type of the object.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns <code>true</code> if the object is either the model's package or is an instance object of the model.
-	 * <!-- end-user-doc -->
-	 * @return whether this factory is applicable for the type of the object.
-	 * @generated
-	 */
-	@Override
-	public boolean isFactoryForType(Object object) {
-		if (object == modelPackage) {
-			return true;
-		}
-		if (object instanceof EObject) {
-			return ((EObject)object).eClass().getEPackage() == modelPackage;
-		}
-		return false;
-	}
-
-	/**
-	 * The switch the delegates to the <code>createXXX</code> methods.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected QuickEditTabSectionsSwitch<Adapter> modelSwitch =
-		new QuickEditTabSectionsSwitch<Adapter>() {
-			@Override
-			public Adapter caseQuickEditTabSections(QuickEditTabSections object) {
-				return createQuickEditTabSectionsAdapter();
-			}
-			@Override
-			public Adapter caseSectionInfo(SectionInfo object) {
-				return createSectionInfoAdapter();
-			}
-			@Override
-			public Adapter defaultCase(EObject object) {
-				return createEObjectAdapter();
-			}
-		};
-
-	/**
-	 * Creates an adapter for the <code>target</code>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param target the object to adapt.
-	 * @return the adapter for the <code>target</code>.
-	 * @generated
-	 */
-	@Override
-	public Adapter createAdapter(Notifier target) {
-		return modelSwitch.doSwitch((EObject)target);
-	}
-
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.QuickEditTabSections <em>Quick Edit Tab Sections</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.QuickEditTabSections
-	 * @generated
-	 */
-	public Adapter createQuickEditTabSectionsAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.SectionInfo <em>Section Info</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.SectionInfo
-	 * @generated
-	 */
-	public Adapter createSectionInfoAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for the default case.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @generated
-	 */
-	public Adapter createEObjectAdapter() {
-		return null;
-	}
-
-} //QuickEditTabSectionsAdapterFactory
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/quickedittabsections/internal/util/QuickEditTabSectionsSwitch.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/quickedittabsections/internal/util/QuickEditTabSectionsSwitch.java
deleted file mode 100644
index 040881c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/quickedittabsections/internal/util/QuickEditTabSectionsSwitch.java
+++ /dev/null
@@ -1,162 +0,0 @@
-/**
- * Copyright (c) 2007 Oracle Corporation
- *
- * $Id: QuickEditTabSectionsSwitch.java,v 1.3 2008/11/18 22:22:46 gkessler Exp $
- */
-package org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.internal.util;
-
-import java.util.List;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-
-import org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.*;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Switch</b> for the model's inheritance hierarchy.
- * It supports the call {@link #doSwitch(EObject) doSwitch(object)}
- * to invoke the <code>caseXXX</code> method for each class of the model,
- * starting with the actual class of the object
- * and proceeding up the inheritance hierarchy
- * until a non-null result is returned,
- * which is the result of the switch.
- * 
- * @param <T> 
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.QuickEditTabSectionsPackage
- * @generated
- */
-public class QuickEditTabSectionsSwitch<T> {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2007 Oracle Corporation"; //$NON-NLS-1$
-
-	/**
-	 * The cached model package
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected static QuickEditTabSectionsPackage modelPackage;
-
-	/**
-	 * Creates an instance of the switch.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public QuickEditTabSectionsSwitch() {
-		if (modelPackage == null) {
-			modelPackage = QuickEditTabSectionsPackage.eINSTANCE;
-		}
-	}
-
-	/**
-	 * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
-	 * <!-- begin-user-doc -->
-     * @param theEObject 
-	 * <!-- end-user-doc -->
-	 * @return the first non-null result returned by a <code>caseXXX</code> call.
-	 * @generated
-	 */
-	public T doSwitch(EObject theEObject) {
-		return doSwitch(theEObject.eClass(), theEObject);
-	}
-
-	/**
-	 * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
-	 * <!-- begin-user-doc -->
-     * @param theEClass 
-     * @param theEObject 
-	 * <!-- end-user-doc -->
-	 * @return the first non-null result returned by a <code>caseXXX</code> call.
-	 * @generated
-	 */
-	protected T doSwitch(EClass theEClass, EObject theEObject) {
-		if (theEClass.eContainer() == modelPackage) {
-			return doSwitch(theEClass.getClassifierID(), theEObject);
-		}
-        List<EClass> eSuperTypes = theEClass.getESuperTypes();
-        return
-        	eSuperTypes.isEmpty() ?
-        		defaultCase(theEObject) :
-        		doSwitch(eSuperTypes.get(0), theEObject);
-	}
-
-	/**
-	 * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
-	 * <!-- begin-user-doc -->
-     * @param classifierID 
-     * @param theEObject 
-	 * <!-- end-user-doc -->
-	 * @return the first non-null result returned by a <code>caseXXX</code> call.
-	 * @generated
-	 */
-	protected T doSwitch(int classifierID, EObject theEObject) {
-		switch (classifierID) {
-			case QuickEditTabSectionsPackage.QUICK_EDIT_TAB_SECTIONS: {
-				QuickEditTabSections quickEditTabSections = (QuickEditTabSections)theEObject;
-				T result = caseQuickEditTabSections(quickEditTabSections);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case QuickEditTabSectionsPackage.SECTION_INFO: {
-				SectionInfo sectionInfo = (SectionInfo)theEObject;
-				T result = caseSectionInfo(sectionInfo);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			default: return defaultCase(theEObject);
-		}
-	}
-
-	/**
-	 * Returns the result of interpreting the object as an instance of '<em>Quick Edit Tab Sections</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Quick Edit Tab Sections</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public T caseQuickEditTabSections(QuickEditTabSections object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpreting the object as an instance of '<em>Section Info</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Section Info</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public T caseSectionInfo(SectionInfo object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpreting the object as an instance of '<em>EObject</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch, but this is the last case anyway.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>EObject</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject)
-	 * @generated
-	 */
-	public T defaultCase(EObject object) {
-		return null;
-	}
-
-} //QuickEditTabSectionsSwitch
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/quickedittabsections/package-info.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/quickedittabsections/package-info.java
deleted file mode 100644
index e51e80c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/quickedittabsections/package-info.java
+++ /dev/null
@@ -1,18 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-/**
- * Web Page Editor tag attribute QuickEdit property page classes.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- */
-package org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections;
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/AbsolutePointLocator.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/AbsolutePointLocator.java
deleted file mode 100644
index 0ebdeb2..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/AbsolutePointLocator.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editpolicies;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.Locator;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.Rectangle;
-
-/**
- * @author cbateman
- *
- */
-public class AbsolutePointLocator implements Locator 
-{
-    private static AbsolutePointLocator   INSTANCE;
-    private final static Point    DEFAULT_POINT = new Point(0,0);
-    
-    private Point  _referencePoint = DEFAULT_POINT; 
-    private int    _xOffset = 0;
-    private int    _yOffset = 0;
-    private IFigure _intersectFigure;
-    
-    /**
-     * @return the singleton instance
-     */
-    public synchronized static AbsolutePointLocator getInstance()
-    {
-        if (INSTANCE == null)
-        {
-            INSTANCE = new AbsolutePointLocator();
-        }
-        return INSTANCE;
-    }
-    
-    /** 
-     * Relocates the target figure to the reference point with possible x and y
-     * offsetting.  Uses the target's preferredSize as the new size.
-     */
-    public void relocate(IFigure target) 
-    {
-        Point leftTop = new Point(_referencePoint.x+_xOffset, _referencePoint.y+_yOffset);
-        
-
-        //figure.translateToAbsolute(leftTop);
-        target.translateToRelative(leftTop);
-        Dimension d = target.getPreferredSize();
-        Rectangle rect = new Rectangle(leftTop, d);
-
-        // to avoid enlargemeent
-        if (_intersectFigure != null)
-        {
-            rect = rect.intersect(_intersectFigure.getBounds());
-        }
-        
-        target.setBounds(rect);
-    }
-
-    /**
-     * Sets the reference point used to calculate the location to which
-     * relocate will relocate its target.  The x and y offset values are added
-     * to the reference point before final re-location.  If point is null
-     * then the reference is set to (0,0)
-     * @param point
-     * @param xoffset 
-     * @param yoffset 
-     */
-    public void setReferencePoint(Point point, int xoffset, int yoffset)
-    {
-        if (point == null)
-        {
-            _referencePoint = DEFAULT_POINT;
-        }
-        else
-        {
-            _referencePoint = point;
-        }
-       
-        _xOffset = xoffset;
-        _yOffset = yoffset;
-    }
-    
-    /**
-     * Sets the figure used to calculate a rectangular intersect of the 
-     * relocated target.  This normally set to the parent of the target
-     * such as a layer to ensure that the relocate target does not enlarge
-     * its parent by relocating outside it's rectangle.
-     * 
-     * If intersectFigure is set to null, then no intersect calculation will
-     * be performed.
-     * 
-     * @param intersectFigure
-     */
-    public void setIntersectFigure(IFigure intersectFigure)
-    {
-        _intersectFigure = intersectFigure;
-    }
-    
-    private AbsolutePointLocator() {/*no external instantiation*/}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/BasicLabelToolTip.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/BasicLabelToolTip.java
deleted file mode 100644
index bd216a6..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/BasicLabelToolTip.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editpolicies;
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.Label;
-import org.eclipse.draw2d.LineBorder;
-import org.eclipse.draw2d.PositionConstants;
-import org.eclipse.draw2d.geometry.Insets;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * A tool tip based on a label
- * @author cbateman
- *
- */
-public class BasicLabelToolTip extends Label
-{
-    /**
-     * @param i
-     */
-    public BasicLabelToolTip(Image i) {
-        super(i);
-        initialize();
-    }
-
-    /**
-     * @param s
-     * @param i
-     */
-    public BasicLabelToolTip(String s, Image i) {
-        super(s, i);
-        initialize();
-    }
-
-    /**
-     * @param s
-     */
-    public BasicLabelToolTip(String s) {
-        super(s);
-        initialize();
-    }
-
-    /**
-     * 
-     */
-    protected void initialize()
-    {
-        setOpaque(true);
-        setBackgroundColor(ColorConstants.tooltipBackground);
-        setBorder(
-                new LineBorder(ColorConstants.tooltipForeground, 1)
-                {
-                    // add an extra pixel of inset to make sure the text
-                    // isn't pressed against the border
-                    public Insets getInsets(IFigure figure) {
-                        return new Insets(getWidth()+1);
-                    }
-                }
-        );
-        setTextAlignment(PositionConstants.CENTER); 
-        setForegroundColor(ColorConstants.tooltipForeground);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/ColumnHelper.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/ColumnHelper.java
deleted file mode 100644
index 6574e59..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/ColumnHelper.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editpolicies;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.LayoutManager;
-import org.eclipse.draw2d.geometry.Insets;
-import org.eclipse.draw2d.geometry.PrecisionRectangle;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.jst.pagedesigner.css2.layout.CSSFigure;
-import org.eclipse.jst.pagedesigner.css2.layout.table.CSSTableLayout2;
-
-/**
- * @author mengbo
- */
-public class ColumnHelper {
-    
-    /**
-     * @param editPart
-     * @return a rectangle that bounds the actual visual rectangle of the column represented
-     * by editPart.  The editPart's figure normally only maps to the td in the rendered table.
-     * 
-     * The rectangle is translated to absolute bounds
-     */
-    public static Rectangle getAdjustedColumnBoundingRectangle(GraphicalEditPart editPart)
-    {
-        Rectangle bounds = editPart.getFigure().getBounds().getCopy();
-
-        if (editPart.getParent() != null) {
-            IFigure figure = ((GraphicalEditPart) editPart.getParent())
-                    .getFigure();
-            if (figure instanceof CSSFigure) {
-                CSSFigure cssFigure = (CSSFigure) figure;
-                LayoutManager layoutManager = cssFigure.getLayoutManager();
-                if (layoutManager instanceof CSSTableLayout2) {
-                    CSSTableLayout2 tableLayout = (CSSTableLayout2) layoutManager;
-                    bounds.y = tableLayout.getHSpacing();
-                    bounds.height = figure.getClientArea().height
-                            - tableLayout.getHSpacing() * 2;
-                }
-            }
-        }
-        bounds = new PrecisionRectangle(bounds.getResized(-1, -1));
-        editPart.getFigure().translateToAbsolute(bounds);
-        
-        return bounds;
-    }
-    
-	static Rectangle getColumnBounds(GraphicalEditPart editPart,
-			IFigure target) {
-	    Rectangle bounds = getAdjustedColumnBoundingRectangle(editPart);
-        target.translateToRelative(bounds);
-        Insets insets = target.getInsets();
-		bounds.translate(-insets.left, -insets.top);
-		bounds.resize(insets.getWidth() + 1, insets.getHeight() + 1);
-		return bounds;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/ColumnResizableEditPolicy.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/ColumnResizableEditPolicy.java
deleted file mode 100644
index 4b527c8..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/ColumnResizableEditPolicy.java
+++ /dev/null
@@ -1,229 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editpolicies;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.Locator;
-import org.eclipse.draw2d.PositionConstants;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.DragTracker;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.Handle;
-import org.eclipse.gef.SharedCursors;
-import org.eclipse.gef.handles.MoveHandle;
-import org.eclipse.gef.handles.ResizeHandle;
-import org.eclipse.gef.handles.SquareHandle;
-import org.eclipse.gef.tools.DragEditPartsTracker;
-import org.eclipse.gef.tools.SelectEditPartTracker;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Cursor;
-import org.eclipse.swt.graphics.Image;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- */
-public class ColumnResizableEditPolicy extends ElementResizableEditPolicy {
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editpolicies.ResizableEditPolicy#createSelectionHandles()
-	 */
-	protected List createSelectionHandles() {
-		String elementName = ((Element) getHost().getModel()).getLocalName();
-		if ("column".equalsIgnoreCase(elementName)) { //$NON-NLS-1$
-			List list = new ArrayList();
-
-			GraphicalEditPart part = (GraphicalEditPart) getHost();
-            
-            {
-    			MoveHandle borderhandle = new MoveHandle(part, new ColumnBorderHandleLocator(
-    					part));
-    			list.add(borderhandle);
-            }
-            
-            {
-    			MyMoveHandle cornerHandle = new MyMoveHandle(part, new ColumnHandleLocator(part, getHostFigure(),
-    					PositionConstants.NORTH_WEST));
-    			list.add(cornerHandle);
-            }
-            
-			SelectEditPartTracker tracker = new SelectEditPartTracker(getHost());
-			list.add(createHandle(part, PositionConstants.SOUTH_EAST, tracker,
-					SharedCursors.ARROW));
-			list.add(createHandle(part, PositionConstants.SOUTH_WEST, tracker,
-					SharedCursors.ARROW));
-			list.add(createHandle(part, PositionConstants.NORTH_WEST, tracker,
-					SharedCursors.ARROW));
-			list.add(createHandle(part, PositionConstants.NORTH_EAST, tracker,
-					SharedCursors.ARROW));
-			return list;
-
-		}
-		return super.createSelectionHandles();
-	}
-
-	private Handle createHandle(GraphicalEditPart owner, int direction,
-			DragTracker tracker, Cursor cursor) {
-		ResizeHandle handle = new ResizeHandle(owner, new ColumnCornerLocator(
-				owner, direction), cursor);
-		handle.setCursor(cursor);
-		handle.setDragTracker(tracker);
-		return handle;
-	}
-
-    private class ColumnHandleLocator extends CornerRelativeHandleLocator {
-		private GraphicalEditPart editPart;
-
-		/**
-		 * @param editPart
-		 * @param reference
-		 * @param location
-		 */
-		public ColumnHandleLocator(GraphicalEditPart editPart, IFigure reference, int location) {
-            super(reference, location);
-			this.editPart = editPart;
-		}
-        
-        protected Dimension getNewTargetSize(IFigure relocateFigure) {
-            return relocateFigure.getPreferredSize();
-        }
-
-        protected Rectangle getCurrentTargetBounds(IFigure relocateFigure) {
-            return ColumnHelper.getColumnBounds(editPart, relocateFigure);
-        }
-	}
-
-	private class ColumnCornerLocator implements Locator {
-		private double relativeX;
-
-		private double relativeY;
-
-		private GraphicalEditPart editPart;
-
-		/**
-		 * Constructs a RelativeLocator with the given reference figure and
-		 * relative location. The location is a constant from
-		 * {@link PositionConstants} used as a convenient and readable way to
-		 * set both the relativeX and relativeY values.
-		 * 
-		 * @param editPart
-		 *            the reference figure
-		 * @param location
-		 *            one of NORTH, NORTH_EAST, etc.
-		 */
-		public ColumnCornerLocator(GraphicalEditPart editPart, int location) {
-			this.editPart = editPart;
-			switch (location & PositionConstants.NORTH_SOUTH) {
-			case PositionConstants.NORTH:
-				relativeY = 0;
-				break;
-			case PositionConstants.SOUTH:
-				relativeY = 1.0;
-				break;
-			default:
-				relativeY = 0.5;
-			}
-
-			switch (location & PositionConstants.EAST_WEST) {
-			case PositionConstants.WEST:
-				relativeX = 0;
-				break;
-			case PositionConstants.EAST:
-				relativeX = 1.0;
-				break;
-			default:
-				relativeX = 0.5;
-			}
-		}
-
-		/**
-		 * Relocates the target using the relative offset locations.
-		 * 
-		 * @see org.eclipse.draw2d.Locator#relocate(org.eclipse.draw2d.IFigure)
-		 */
-		public void relocate(IFigure target) {
-			Rectangle targetBounds = ColumnHelper.getColumnBounds(editPart,
-					target);
-
-			Dimension targetSize = target.getPreferredSize();
-
-			targetBounds.x += (int) (targetBounds.width * relativeX - ((targetSize.width + 1) / 2));
-			targetBounds.y += (int) (targetBounds.height * relativeY - ((targetSize.height + 1) / 2));
-			targetBounds.setSize(targetSize);
-			target.setBounds(targetBounds);
-		}
-	}
-
-    private class ColumnBorderHandleLocator implements Locator {
-        private GraphicalEditPart editPart;
-
-        /**
-         * @param editPart
-         */
-        public ColumnBorderHandleLocator(GraphicalEditPart editPart) {
-            this.editPart = editPart;
-        }
-
-        public void relocate(IFigure target) {
-            target.setBounds(ColumnHelper.getColumnBounds(editPart, target));
-        }
-    }
-    
-    private static class MyMoveHandle extends SquareHandle
-    {
-        private static final String MOVE_HANDLE_IMAGE_FILE = "MoveHandle.png"; //$NON-NLS-1$
-
-		/**
-         * @param owner
-         * @param loc
-         */
-        public MyMoveHandle(GraphicalEditPart owner, Locator loc) {
-            super(owner, loc);
-            setCursor(SharedCursors.SIZEALL);
-        }
-
-        protected void init() {
-            setPreferredSize(16,16);
-        }
-
-        protected Color getBorderColor() {
-            return ColorConstants.black;
-        }
-
-        protected Color getFillColor() {
-            return ColorConstants.white;
-        }
-
-        protected DragTracker createDragTracker() {
-            DragTracker tracker = new DragEditPartsTracker(getOwner());
-            
-            return tracker;
-        }
-
-        public void paintFigure(Graphics graphics) {
-            super.paintFigure(graphics);
-            final  Image moveImage = PDPlugin.getDefault().getImage(MOVE_HANDLE_IMAGE_FILE);
-            Point topLeft = getBounds().getTopLeft().getCopy();
-            topLeft.performTranslate(3,3);
-            graphics.drawImage(moveImage, topLeft);
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/CornerRelativeHandleLocator.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/CornerRelativeHandleLocator.java
deleted file mode 100644
index e43befe..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/CornerRelativeHandleLocator.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-/**
- * 
- */
-package org.eclipse.jst.pagedesigner.editpolicies;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.PositionConstants;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.PrecisionRectangle;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.handles.RelativeHandleLocator;
-
-/**
- * A locator for handles that attach to the corner of square figures
- * @author cbateman
- *
- */
-class CornerRelativeHandleLocator extends RelativeHandleLocator
-{
-    private double relativeX = 0;
-    private double relativeY = 0;
-    private double offsetXMultiplier = 0;
-    private double offsetYMultiplier = 0;
-    
-    /**
-     * @param reference
-     * @param location
-     */
-    public CornerRelativeHandleLocator(IFigure reference, int location) {
-        super(reference, location);
-        
-        // unfortunately, relativeX and relativeY are private in super
-        // so duplicate calc code here
-        switch (location & PositionConstants.NORTH_SOUTH) 
-        {
-            case PositionConstants.NORTH:
-                relativeY = 0; 
-                offsetYMultiplier = -1.0;
-            break;
-
-            case PositionConstants.SOUTH:
-                relativeY = 1.0; 
-                offsetYMultiplier = 0;
-            break;
-            default:
-                relativeY = 0.5;
-        }
-
-        switch (location & PositionConstants.EAST_WEST) 
-        {
-            case PositionConstants.WEST:
-                relativeX = 0; 
-                offsetXMultiplier = -1.0;
-            break;
-            case PositionConstants.EAST:
-                relativeX = 1.0;
-                offsetXMultiplier = 0;                    
-            break;
-            default:
-                relativeX = 0.5;
-        }
-    }
-
-    /**
-     * Pass in targetBounds to be updated and newTargetSize.  targetBounds will
-     * be applied to the figure that is being relocated immediately after this method
-     * @param targetBounds
-     * @param newTargetSize
-     */
-    protected void relocateBounds(Rectangle targetBounds, Dimension newTargetSize)
-    {
-        // copied from super.relocate because relativeX/Y are private in super
-        // changed from super to remove div by 2 that centers target; we want
-        // it to be corner-to-corner
-        targetBounds.x
-            += (int) (((targetBounds.width+2) * relativeX) + ((newTargetSize.width+1)*offsetXMultiplier));
-        targetBounds.y
-            += (int) (targetBounds.height * relativeY + ((newTargetSize.height+1)*offsetYMultiplier));
-
-        targetBounds.setSize(newTargetSize);
-    }
-
-    /**
-     * @param relocateFigure
-     * @return a modifiable Rectangle that represents the bounds of the figure to be relocated
-     */
-    protected Rectangle getCurrentTargetBounds(IFigure relocateFigure)
-    {
-        IFigure reference = getReferenceFigure();
-        Rectangle targetBounds = new PrecisionRectangle(getReferenceBox().getResized(-1, -1));
-        reference.translateToAbsolute(targetBounds);
-        relocateFigure.translateToRelative(targetBounds);
-        return targetBounds;
-    }
-    
-    /**
-     * @param relocateFigure
-     * @return the new target dimensions
-     */
-    protected Dimension getNewTargetSize(IFigure relocateFigure)
-    {
-        return relocateFigure.getPreferredSize();
-    }
-    
-    public void relocate(IFigure target) {
-        Rectangle targetBounds = getCurrentTargetBounds(target);
-        Dimension targetSize = getNewTargetSize(target);
-        relocateBounds(targetBounds, targetSize);
-
-        target.setBounds(targetBounds);        
-    }
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/DesignerElementEditPolicy.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/DesignerElementEditPolicy.java
deleted file mode 100644
index d374946..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/DesignerElementEditPolicy.java
+++ /dev/null
@@ -1,137 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editpolicies;
-
-import org.eclipse.gef.editpolicies.ComponentEditPolicy;
-
-/**
- * @author mengbo
- */
-public class DesignerElementEditPolicy extends ComponentEditPolicy {
-
-	// /*
-	// * (non-Javadoc)
-	// *
-	// * @see
-	// org.eclipse.gef.editpolicies.ComponentEditPolicy#createDeleteCommand(org.eclipse.gef.requests.GroupRequest)
-	// */
-	// protected Command createDeleteCommand(GroupRequest deleteRequest)
-	// {
-	// // Object model = getHost().getModel();
-	// // ;
-	// // Node parent = null;
-	// // if (model instanceof Node)
-	// // {
-	// // parent = ((Node) model).getParentNode();
-	// // }
-	// // EditDomain domain = getHost().getViewer().getEditDomain();
-	// // IEditorPart editor = null;
-	// // //FIXME: must do this cast?
-	// // if (domain instanceof DefaultEditDomain)
-	// // {
-	// // editor = ((DefaultEditDomain) domain).getEditorPart();
-	// // }
-	// // if (editor instanceof HTMLEditor)
-	// // {
-	// // DeleteNodeCommand deleteCmd = new DeleteNodeCommand(((HTMLEditor)
-	// editor).getTextEditor().getTextViewer());
-	// // deleteCmd.setParent(parent);
-	// // deleteCmd.setChild((Node) getHost().getModel());
-	// // return deleteCmd;
-	// // }
-	// // else
-	// // {
-	// // return null;
-	// // }
-	// }
-	//
-	// /*
-	// * (non-Javadoc)
-	// *
-	// * @see org.eclipse.gef.EditPolicy#getCommand(org.eclipse.gef.Request)
-	// */
-	// public Command getCommand(Request request)
-	// {
-	// if (request.getType() == DesignCutAction.CUT_TYPE && request instanceof
-	// GroupRequest)
-	// {
-	// return createCutCommand((GroupRequest) request);
-	// }
-	// else if (request.getType() == DesignPasteAction.PASTE_TYPE && request
-	// instanceof GroupRequest)
-	// {
-	// return createPasteCommand((GroupRequest) request);
-	// }
-	// return super.getCommand(request);
-	// }
-	//
-	// protected Command createCutCommand(GroupRequest cutRequest)
-	// {
-	// Object model = getHost().getModel();
-	// ;
-	// Node parent = null;
-	// if (model instanceof Node)
-	// {
-	// parent = ((Node) model).getParentNode();
-	// }
-	// EditDomain domain = getHost().getViewer().getEditDomain();
-	// IEditorPart editor = null;
-	// //FIXME: must do this cast?
-	// if (domain instanceof DefaultEditDomain)
-	// {
-	// editor = ((DefaultEditDomain) domain).getEditorPart();
-	// }
-	// if (editor instanceof HTMLEditor)
-	// {
-	// CutNodeCommand cutCmd = new CutNodeCommand(((HTMLEditor)
-	// editor).getTextEditor().getTextViewer());
-	// cutCmd.setParent(parent);
-	// cutCmd.setChild((Node) getHost().getModel());
-	// return cutCmd;
-	// }
-	// else
-	// {
-	// return null;
-	// }
-	// }
-	//
-	// protected Command createPasteCommand(GroupRequest cutRequest)
-	// {
-	// Object model = getHost().getModel();
-	// ;
-	// Node parent = null;
-	// if (model instanceof Node)
-	// {
-	// parent = ((Node) model).getParentNode();
-	// }
-	// EditDomain domain = getHost().getViewer().getEditDomain();
-	// IEditorPart editor = null;
-	// //FIXME: must do this cast?
-	// if (domain instanceof DefaultEditDomain)
-	// {
-	// editor = ((DefaultEditDomain) domain).getEditorPart();
-	// }
-	// if (editor instanceof HTMLEditor)
-	// {
-	// PasteNodeCommand pasteCmd = new PasteNodeCommand(((HTMLEditor)
-	// editor).getTextEditor().getTextViewer());
-	// pasteCmd.setParent(parent);
-	// pasteCmd.setChild((Node) getHost().getModel());
-	// return pasteCmd;
-	// }
-	// else
-	// {
-	// return null;
-	// }
-	// }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/DragMoveEditPolicy.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/DragMoveEditPolicy.java
deleted file mode 100644
index 0a805da..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/DragMoveEditPolicy.java
+++ /dev/null
@@ -1,148 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editpolicies;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.commands.UnexecutableCommand;
-import org.eclipse.gef.requests.ChangeBoundsRequest;
-import org.eclipse.gef.requests.DropRequest;
-import org.eclipse.jst.pagedesigner.commands.CloneNodeCommand;
-import org.eclipse.jst.pagedesigner.commands.MoveNodeCommand;
-import org.eclipse.jst.pagedesigner.dom.DOMPositionHelper;
-import org.eclipse.jst.pagedesigner.dom.DOMUtil;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.parts.NodeEditPart;
-import org.eclipse.jst.pagedesigner.validation.caret.ActionData;
-import org.eclipse.jst.pagedesigner.validation.caret.DnDPositionValidator;
-import org.eclipse.jst.pagedesigner.validation.caret.DropActionData;
-import org.eclipse.jst.pagedesigner.validation.caret.IPositionMediator;
-import org.eclipse.jst.pagedesigner.validation.caret.DropActionData.DropData;
-import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
-import org.eclipse.jst.pagedesigner.viewer.IDropLocationStrategy;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class DragMoveEditPolicy extends DropEditPolicy
-{
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editpolicies.AbstractEditPolicy#getCommand(org.eclipse.gef.Request)
-	 */
-	public final Command getCommand(Request request) {
-		if (!(request instanceof ChangeBoundsRequest)) {
-			return null;
-		}
-
-		ChangeBoundsRequest r = (ChangeBoundsRequest) request;
-
-		// we only support move/copy a single node.
-		if (!MoveSupport.isSingleNode(r)) {
-			return UnexecutableCommand.INSTANCE;
-		}
-
-		// the edit policy only handle at the target part, so only care about
-		// the
-		// target part request.
-		final Object type = r.getType();
-		if (type != REQ_ADD && type != REQ_CLONE && type != REQ_MOVE_CHILDREN) {
-
-			return null;
-		}
-
-		Node draggedNode = MoveSupport.getDraggedNode(r);
-		Node hostNode = ((NodeEditPart) getHost()).getIDOMNode();
-
-		if (DOMUtil.isAncester(draggedNode, hostNode)) {
-			return UnexecutableCommand.INSTANCE;
-		}
-
-		DesignPosition position = findPosition(r);
-		if (position == null || !position.isValid()) {
-			return null;
-		}
-
-		// can't move/copy into self.
-		Node node = position.getContainerNode();
-		if (DOMUtil.isAncester(draggedNode, node)) {
-			return UnexecutableCommand.INSTANCE;
-		}
-
-		// ok, we are about to move/copy into the specified position.
-		IDOMPosition domposition = DOMPositionHelper.toDOMPosition(position);
-
-		if (REQ_CLONE.equals(type)) {
-			return new CloneNodeCommand((IHTMLGraphicalViewer) getHost()
-					.getViewer(), domposition, draggedNode);
-		}
-        return new MoveNodeCommand((IHTMLGraphicalViewer) getHost()
-        		.getViewer(), domposition, draggedNode);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editpolicies.AbstractEditPolicy#getTargetEditPart(org.eclipse.gef.Request)
-	 */
-	public EditPart getTargetEditPart(Request request) {
-		if (request instanceof ChangeBoundsRequest) {
-			return this.getHost();
-		}
-		return super.getTargetEditPart(request);
-	}
-
-	protected final DesignPosition findPosition(DropRequest r) {
-		final IPositionMediator mediator = getDropChildValidator(r);
-        if (mediator == null)
-        {
-            return null;
-        }
-        final IDropLocationStrategy dropStrategy = createDropLocationStrategy(r);
-		final DesignPosition position = 
-            dropStrategy.calculateDesignPosition(getHost(), r.getLocation(), mediator);
-        
-        // verify that the drop strategy has honoured it's contract that our
-        // mediator be respected
-        if (position != null)
-        {
-            if (!mediator.isValidPosition(position))
-            {
-                // if our mediator says no go, then veto the requestor
-                // there is no drop location
-                return null;
-            }
-        }
-		return position;
-	}
-
-    public void showTargetFeedback(Request request) 
-    {
-        Object type = request.getType();
-        // only show feedback for these request types
-        if (type == REQ_ADD || type == REQ_CLONE
-                || type == REQ_MOVE_CHILDREN || type == REQ_MOVE) {
-            super.showTargetFeedback(request);
-        }
-    }
-
-    protected final IPositionMediator createDefaultDropChildValidator(DropData r)
-    {
-        return new DnDPositionValidator(new DropActionData(
-                ActionData.COMPONENT_MOVE, r));
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/DropEditPolicy.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/DropEditPolicy.java
deleted file mode 100644
index 87368ee..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/DropEditPolicy.java
+++ /dev/null
@@ -1,210 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editpolicies;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.editpolicies.GraphicalEditPolicy;
-import org.eclipse.gef.requests.DropRequest;
-import org.eclipse.gef.requests.GroupRequest;
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.jsf.core.internal.tld.TagIdentifierFactory;
-import org.eclipse.jst.pagedesigner.editors.palette.IDropSourceData;
-import org.eclipse.jst.pagedesigner.editors.palette.ITagDropSourceData;
-import org.eclipse.jst.pagedesigner.elementedit.ElementEditFactoryRegistry;
-import org.eclipse.jst.pagedesigner.elementedit.IElementEdit;
-import org.eclipse.jst.pagedesigner.itemcreation.ItemCreationRequest;
-import org.eclipse.jst.pagedesigner.parts.NodeEditPart;
-import org.eclipse.jst.pagedesigner.validation.caret.IPositionMediator;
-import org.eclipse.jst.pagedesigner.validation.caret.DropActionData.DropData;
-import org.eclipse.jst.pagedesigner.viewer.DefaultDropLocationStrategy;
-import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
-import org.eclipse.jst.pagedesigner.viewer.IDropLocationStrategy;
-
-/**
- * @author cbateman
- *
- */
-public abstract class DropEditPolicy extends GraphicalEditPolicy 
-{
-    private List        _feedbackFigures;
-
-    /**
-     * @param r
-     * @return a mediator that can validate valid model drops into the
-     * host's edit part
-     */
-    protected IPositionMediator createDropChildValidator(DropRequest r)
-    {
-        // sub-class may override to customize the drop container validator
-        return null;
-    }
-    
-    /**
-     * @param r
-     * @return the appropriate design position for the drop request
-     */
-    protected abstract DesignPosition findPosition(DropRequest r);
-    
-    /**
-     * @param data
-     * @return a default validation mediator to be used if nothing custom is provided
-     */
-    protected abstract IPositionMediator createDefaultDropChildValidator(DropData data);
-    
-    /**
-     * @param r
-     * @return the validator to be used to validate the 'request' to drop
-     * the edit parts specified by 'r' into this policy's host edit part
-     */
-    protected final IPositionMediator getDropChildValidator(DropRequest r)
-    {
-        IPositionMediator mediator = createDropChildValidator(r);
-        
-        if (mediator == null)
-        {
-            DropData data = createDropData(r);
-            
-            if (data == null)
-            {
-                return null;
-            }
-            mediator = createDefaultDropChildValidator(data);
-        }
-       
-        return mediator;
-    }
-    
-    /**
-     * @param request
-     * @return the data about the drop request
-     */
-    protected DropData createDropData(DropRequest request)
-    {
-        if (request instanceof GroupRequest)
-        {
-            List editParts = ((GroupRequest)request).getEditParts();
-            
-            // TODO: currently we only support one drop item
-            if (editParts.size() > 0)
-            {
-                EditPart part = (EditPart) editParts.get(0);
-                if (part instanceof NodeEditPart)
-                {
-                    NodeEditPart nodePart = (NodeEditPart) part;
-                    TagIdentifier tagId = nodePart.getTagIdentifier();
-                    if (tagId != null)
-                    {
-                        List tagIds = new ArrayList();
-                        tagIds.add(tagId);
-                        return new DropData(tagIds);
-                    }
-                }
-            }
-        }
-        else if (request instanceof ItemCreationRequest)
-        {
-            IDropSourceData creationProvider = 
-                ((ItemCreationRequest)request).getTagCreationProvider();
-            String tagName = creationProvider.getId();
-            if (creationProvider instanceof ITagDropSourceData)
-            {
-                tagName = ((ITagDropSourceData)creationProvider).getTagName();
-            }
-            TagIdentifier tagId = 
-                TagIdentifierFactory.
-                    createJSPTagWrapper(creationProvider.getNamespace(),
-                            tagName);
-            List tagIds = new ArrayList();
-            tagIds.add(tagId);
-            return new DropData(tagIds);
-        }
-        
-        return null;
-    }
-    
-    /**
-     * @param r
-     * @return the drop location strategy
-     */
-    protected final IDropLocationStrategy createDropLocationStrategy(DropRequest r)
-    {
-        DropData dropData = createDropData(r);
-        if (dropData != null && dropData.getTagIdentifiers().size() > 0)
-        {
-            // TODO: only supporting single item drop currently
-            TagIdentifier tagIdentifier = 
-                (TagIdentifier) dropData.getTagIdentifiers().get(0);
-
-            IElementEdit elementEdit = 
-                ElementEditFactoryRegistry.getInstance()
-                    .createElementEdit(tagIdentifier); 
-
-            // element edit not guaranteed to exist
-            if (elementEdit != null)
-            {
-                IDropLocationStrategy strategy = 
-                    elementEdit.getDropRequestorLocationStrategy(tagIdentifier, getHost().getViewer());
-                
-                if (strategy != null)
-                {
-                    return strategy;
-                }
-            }
-        }
-        
-        // by default, return the default strategy
-        return new DefaultDropLocationStrategy(getHost().getViewer());
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.gef.editpolicies.AbstractEditPolicy#eraseTargetFeedback(org.eclipse.gef.Request)
-     */
-    public void eraseTargetFeedback(Request request) {
-        if (_feedbackFigures != null)
-        {
-            for (final Iterator it = _feedbackFigures.iterator(); it.hasNext();)
-            {
-                final IFigure figure = (IFigure) it.next();
-                
-                if (figure != null)
-                {
-                    removeFeedback(figure);
-                }
-            }
-            
-            _feedbackFigures.clear();
-            _feedbackFigures = null;
-        }
-    }
-    
-    public void showTargetFeedback(Request request) 
-    {
-        if (request instanceof DropRequest) 
-        {
-            DesignPosition position = findPosition((DropRequest)request);
-            if (position != null) {
-                // erase any prior feedback
-                eraseTargetFeedback(request);
-                // add figures to feedback layer and save them in _feedbackFigures
-                // for later.
-                _feedbackFigures = createDropLocationStrategy((DropRequest)request).showTargetFeedback(getHost(), position, (DropRequest)request); 
-            }
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/ElementDecoratorSquareHandle.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/ElementDecoratorSquareHandle.java
deleted file mode 100644
index 5ba2257..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/ElementDecoratorSquareHandle.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editpolicies;
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.Locator;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.DragTracker;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.handles.SquareHandle;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Cursor;
-
-/**
- * A square handle for element decoration
- * @author cbateman
- *
- */
-public class ElementDecoratorSquareHandle extends SquareHandle {
-
-    
-    /**
-     * @param owner
-     * @param loc
-     * @param c
-     */
-    public ElementDecoratorSquareHandle(GraphicalEditPart owner, Locator loc,
-            Cursor c) {
-        super(owner, loc, c);
-    }
-    /**
-     * @param owner
-     * @param loc
-     */
-    public ElementDecoratorSquareHandle(GraphicalEditPart owner, Locator loc) {
-        super(owner, loc);
-    }
-    protected DragTracker createDragTracker() {
-        return null;
-    }
-    protected Color getBorderColor() {
-        return ColorConstants.black;
-    }
-
-    protected Color getFillColor() 
-    {
-        return ColorConstants.white;
-    }
-
-    /**
-     * @return the transparency alpha channel (0-255)
-     */
-    protected int getAlpha()
-    {
-        return 255;
-    }
-    
-    /**
-     * Draws the handle with fill color and outline color dependent 
-     * on the primary selection status of the owner editpart.
-     *
-     * @param g The graphics used to paint the figure.
-     */
-    public void paintFigure(Graphics g) {
-        Rectangle r = getBounds();
-        r.shrink(1, 1);
-        try {
-            g.setBackgroundColor(getFillColor());
-            g.setAlpha(getAlpha());
-            g.fillRectangle(r.x, r.y, r.width, r.height);
-            g.setForegroundColor(getBorderColor()); 
-            g.drawRectangle(r.x, r.y, r.width, r.height);
-        } finally {
-            //We don't really own rect 'r', so fix it.
-            r.expand(1, 1);
-        }
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/ElementMenuBar.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/ElementMenuBar.java
deleted file mode 100644
index ee61b03..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/ElementMenuBar.java
+++ /dev/null
@@ -1,231 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-/**
- * 
- */
-package org.eclipse.jst.pagedesigner.editpolicies;
-
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-
-import org.eclipse.draw2d.Figure;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.ToolbarLayout;
-import org.eclipse.gef.EditPart;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jst.pagedesigner.parts.ElementEditPart;
-import org.eclipse.jst.pagedesigner.parts.NonVisualComponentEditPart;
-
-/**
- * A menu bar for a specific element edit part
- * 
- * @author cbateman
- *
- */
-public class ElementMenuBar extends Figure implements ISelectionProvider, ISelectionChangedListener
-{
-    private ElementEditPart   _hostPart;
-    /**
-     * Should always be accessed for use through getChildParts().  Not automatically
-     * allocated because of high probability that a host part will have no children of interest
-     */
-    private Set                    _childParts;
-    private List                    _selectionListeners;
-    private IStructuredSelection    _selection;
-
-    /**
-     * @param hostPart
-     */
-    public ElementMenuBar(ElementEditPart hostPart)
-    {
-        hostPart.getViewer().addSelectionChangedListener(this);
-        
-        _hostPart = hostPart;
-        ToolbarLayout layout = new ToolbarLayout(false);
-        layout.setSpacing(4);
-        setLayoutManager(layout);
-    }
-
-    /**
-     * @return true if there are child parts in the menu
-     */
-    public boolean hasChildParts()
-    {
-        return _childParts != null &&_childParts.size() > 0;
-    }
-    
-    /**
-     * 
-     */
-    public void dispose()
-    {
-        _hostPart.getViewer().removeSelectionChangedListener(this);
-        if (_childParts != null)
-        {
-            _childParts.clear();
-            _childParts = null;
-        }
-        
-        if (_selectionListeners != null)
-        {
-            _selectionListeners.clear();
-            _selectionListeners = null;
-        }
-        
-        _selection = null;
-    }
-    
-    /**
-     * @param editpart
-     */
-    public void addNonVisualChild(NonVisualComponentEditPart editpart)
-    {
-        add(editpart.getFigure());
-        getChildParts().add(editpart);
-    }
-    
-    /**
-     * Removes editpart from the list of non-visual edit parts that this menu
-     * bar is managing the visuals for. 
-     * @param editpart
-     */
-    public void removeNonVisualChild(final NonVisualComponentEditPart editpart)
-    {
-        // TODO: I have relaxed the checking to see if editpart is valid
-        // child because of the way ElementEditPart refreshes itself
-        // when the model changes.  It's possible this will get called more
-        // than once for the same editpart argument
-        getChildParts().remove(editpart);
-        if (editpart.getFigure().getParent() == this)
-        {
-            remove(editpart.getFigure());
-        }
-    }
-
-    /**
-     * @return true if a member of the menu bar has edit part focus
-     */
-    public boolean hasEditPartFocus()
-    {
-        for (Iterator it = getChildParts().iterator(); it.hasNext();)
-        {
-            EditPart editPart = (EditPart) it.next();
-            
-            if (editPart.getSelected() == EditPart.SELECTED_PRIMARY)
-            {
-                return true;
-            }
-        }
-        return false;
-    }
-    
-    private Set getChildParts()
-    {
-        if (_childParts == null) 
-        {
-            _childParts = new HashSet();
-        }
-
-        return _childParts;
-    }
-
-    protected void paintChildren(Graphics graphics) 
-    {
-        // force all children to paint with my alpha setting
-        graphics.setAlpha(getAlpha());
-        //push the current state so it is what the children revert to
-        graphics.pushState();
-        super.paintChildren(graphics);
-        // pop that state we pushed above
-        graphics.popState();
-    }
-
-    private int getAlpha()
-    {
-        return isEnabled() ? 255 : 75;
-    }
-
-    public void addSelectionChangedListener(ISelectionChangedListener listener) {
-        List listeners = getSelectionListeners();
-        
-        if (!listeners.contains(listener))
-        {
-            listeners.add(listener);
-        }
-    }
-
-    public ISelection getSelection() {
-        return _selection;
-    }
-
-    public void removeSelectionChangedListener(
-            ISelectionChangedListener listener) {
-        getSelectionListeners().remove(listener);
-    }
-
-    public void setSelection(ISelection selection) {
-        // no external selection change supported
-    }
-    
-    private List getSelectionListeners()
-    {
-        if (_selectionListeners == null)
-        {
-            _selectionListeners = new ArrayList(1);
-        }
-        
-        return _selectionListeners;
-    }
-
-    private void fireSelectionChanged() 
-    {
-        for (final Iterator it = _selectionListeners.iterator(); it.hasNext();)
-        {
-            ISelectionChangedListener listener = (ISelectionChangedListener) it.next();
-            listener.selectionChanged(new SelectionChangedEvent(this, _selection));
-        }
-    }
-
-    public void selectionChanged(SelectionChangedEvent event) {
-        ISelection selection = event.getSelection();
-        
-        if (selection instanceof IStructuredSelection)
-        {
-            // the number of selections we care about will be no bigger than the total number of selections
-            final List mySelections = new ArrayList(((IStructuredSelection)selection).size());
-            
-            if (_childParts != null)
-            {
-                for (final Iterator it = ((IStructuredSelection)selection).iterator()
-                        ; it.hasNext();)
-                {
-                    Object selectedObj = it.next();
-                    if (_childParts.contains(selectedObj))
-                    {
-                        mySelections.add(selectedObj);
-                    }
-                }
-            }
-
-            _selection = new StructuredSelection(mySelections);
-            
-            fireSelectionChanged();
-        }
-    }
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/ElementResizableEditPolicy.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/ElementResizableEditPolicy.java
deleted file mode 100644
index 368d267..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/ElementResizableEditPolicy.java
+++ /dev/null
@@ -1,493 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editpolicies;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.PositionConstants;
-import org.eclipse.draw2d.RectangleFigure;
-import org.eclipse.draw2d.geometry.Insets;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.PrecisionRectangle;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.DragTracker;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.LayerConstants;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.RequestConstants;
-import org.eclipse.gef.SharedCursors;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.editpolicies.ResizableEditPolicy;
-import org.eclipse.gef.handles.NonResizableHandleKit;
-import org.eclipse.gef.requests.ChangeBoundsRequest;
-import org.eclipse.gef.requests.LocationRequest;
-import org.eclipse.gef.requests.SelectionRequest;
-import org.eclipse.gef.tools.SelectEditPartTracker;
-import org.eclipse.jst.pagedesigner.commands.single.ChangeStyleCommand;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.layout.BlockBox;
-import org.eclipse.jst.pagedesigner.css2.layout.CSSFigure;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.parts.ElementEditPart;
-import org.eclipse.jst.pagedesigner.parts.NodeEditPart;
-import org.eclipse.jst.pagedesigner.requests.LocationModifierRequest;
-import org.eclipse.jst.pagedesigner.tools.ObjectModeDragTracker;
-import org.eclipse.jst.pagedesigner.tools.RangeDragTracker;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Cursor;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ElementResizableEditPolicy extends ResizableEditPolicy implements IEnhancedSelectionEditPolicy 
-{
-	private static final Insets INSETS_1 = new Insets(1, 1, 1, 1);
-
-	private static final int THRESHHOLD = 3;
-    
-    // the number of pixels to offset the top left of tooltop feedback
-    // below the current mouse cursor location
-    private static final int TOOLTIP_VERTICAL_OFFSET = 25;
-
-	private static final Insets INSETS_CONST = new Insets(THRESHHOLD,
-			THRESHHOLD, THRESHHOLD, THRESHHOLD);
-
-	private boolean _showLabelFeedback = true;
-
-	private IFigure[] _hoverFeedbackFigure;
-    
-    //private NonVisualChildDecorator   _selectionDecoratorNorthWest; // = null;
-    private MouseSelectableChildDecorator   _nonVisualChildDecorator; // = null;
-    
-	private final static Color HOVER_FEEDBACK_COLOR = ColorConstants.blue;
-
-	public void deactivate() 
-    {
-        super.deactivate();
-        if (_nonVisualChildDecorator != null)
-        {
-            _nonVisualChildDecorator.dispose();
-            _nonVisualChildDecorator = null;
-        }
-    }
-
-    /*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editpolicies.AbstractEditPolicy#showTargetFeedback(org.eclipse.gef.Request)
-	 */
-	public void showTargetFeedback(Request request) {
-		if (RequestConstants.REQ_SELECTION_HOVER.equals(request.getType())) {
-			if (_hoverFeedbackFigure != null) {
-				for (int i = 0; i < _hoverFeedbackFigure.length; i++) {
-					removeFeedback(_hoverFeedbackFigure[i]);
-				}
-				_hoverFeedbackFigure = null;
-            }
-            
-            // <gripe>this is what I hate about GEF, if it's a location dependent
-            // request why aren't we guaranteed a LocationRequest?!
-            // even GEF interal code protects casts by checking getType()
-            // rather than an instanceof!</gripe>
-            Assert.isTrue(request instanceof LocationRequest);
-            // don't show tooltip if drag is active
-            _showLabelFeedback = !((NodeEditPart)getHost()).isDragActive();
-			_hoverFeedbackFigure = showHoverFeedback((LocationRequest)request);
-		} else {
-			super.showTargetFeedback(request);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editpolicies.AbstractEditPolicy#eraseTargetFeedback(org.eclipse.gef.Request)
-	 */
-	public void eraseTargetFeedback(Request request) {
-		if (RequestConstants.REQ_SELECTION_HOVER.equals(request.getType())) {
-			if (_hoverFeedbackFigure != null) {
-				for (int i = 0; i < _hoverFeedbackFigure.length; i++) {
-					removeFeedback(_hoverFeedbackFigure[i]);
-				}
-				_hoverFeedbackFigure = null;
-                getNonVisualChildDecorator().updateState(MouseSelectableChildDecorator.EVENT_HOST_HOVER_LOST);
-			}
-		} else {
-			super.eraseTargetFeedback(request);
-		}
-	}
-
-	/**
-	 * @param request
-	 */
-	private IFigure[] showHoverFeedback(LocationRequest request) {
-		if (!shouldUseObjectMode(request) && !isStyleTags(getHost())) {
-			return null;
-		}
-
-        final IFigure figure = this.getHostFigure();
-		Rectangle[] rects;
-		if (figure instanceof CSSFigure) {
-			rects = ((CSSFigure) figure).getFragmentsBounds();
-		} else {
-			rects = new Rectangle[] { figure.getBounds() };
-		}
-        int figureSize = rects.length;
-        
-        if (_showLabelFeedback)
-        {
-            figureSize++;
-        }
-        
-		IFigure[] figures = new IFigure[figureSize];
-		for (int i = 0; i < rects.length; i++) {
-			RectangleFigure fig = new RectangleFigure();
-			fig.setFill(false);
-			fig.setOutline(true);
-			fig.setLineWidth(1);
-			fig.setForegroundColor(HOVER_FEEDBACK_COLOR);
-			addFeedback(fig);
-
-			Rectangle r = rects[i].getCopy();
-			figure.translateToAbsolute(r);
-			fig.translateToRelative(r);
-			fig.setBounds(r);
-
-			figures[i] = fig;
-		}
-       
-		if (_showLabelFeedback) 
-        {
-            getNonVisualChildDecorator().updateState(MouseSelectableChildDecorator.EVENT_HOST_HOVER_RECEIVED);
-            
-			BasicLabelToolTip label = new BasicLabelToolTip(getTooltipText());
-			addFeedback(label);
-
-            // use mouse cursor plus an offset so the tooltip doesn't
-            // appear z-ordered below the mouse cursor
-            AbsolutePointLocator locator = AbsolutePointLocator.getInstance();
-            locator.setReferencePoint(request.getLocation(), 0, TOOLTIP_VERTICAL_OFFSET);
-            //  to avoid enlargemeent of the feedback layer
-            locator.setIntersectFigure(getFeedbackLayer());
-            locator.relocate(label);
-			figures[rects.length] = label;
-		}
-		return figures;
-	}
-
-	private String getTooltipText() {
-		Element element = (Element) this.getHost().getModel();
-		StringBuffer text = new StringBuffer(element.getTagName());
-		return text.toString();
-	}
-
-	private boolean isStyleTags(EditPart part) {
-		if (part != null && part.getModel() instanceof Node) {
-			return EditModelQuery.HTML_STYLE_NODES.contains(((Node) part
-					.getModel()).getNodeName());
-		}
-        return false;
-	}
-    private MouseSelectableChildDecorator getNonVisualChildDecorator()
-    {
-        if  (_nonVisualChildDecorator == null)
-        {
-            _nonVisualChildDecorator = 
-                new MouseSelectableChildDecorator((GraphicalEditPart)getHost()
-                        , PositionConstants.NORTH_EAST
-                        , getLayer(LayerConstants.FEEDBACK_LAYER)
-                        , getLayer(LayerConstants.HANDLE_LAYER));
-        }
-        return _nonVisualChildDecorator;
-    }
-
-	/**
-	 * @param request
-	 * @return true if we should be using object mode for this request
-	 */
-	public boolean shouldUseObjectMode(Request request) {
-		ElementEditPart part = (ElementEditPart) this.getHost();
-		if (isStyleTags(part)) {
-			return false;
-		}
-		if (part.isWidget()
-				|| (!part.canHaveDirectTextChild() && !part
-						.haveNonWhitespaceTextChild())) {
-			return true;
-		}
-		if (request instanceof SelectionRequest
-				&& ((SelectionRequest) request).isControlKeyPressed()) {
-			return true;
-		}
-		if (request instanceof LocationModifierRequest
-				&& ((LocationModifierRequest) request).isControlKeyPressed()) {
-			return true;
-		}
-
-		// for other elements
-		if (request instanceof LocationRequest) {
-			Point location = ((LocationRequest) request).getLocation()
-					.getCopy();
-			part.getFigure().translateToRelative(location);
-			return shouldUseObjectMode(location);
-		}
-        return false; // should not happen
-	}
-
-	/**
-	 * @param location
-	 * @return
-	 */
-	private boolean shouldUseObjectMode(Point location) {
-		// when the location is close to the border/padding of the element, then
-		// we think it is default to
-		// object mode selection.
-		CSSFigure figure = (CSSFigure) this.getHostFigure();
-		if (figure.getFragmentsBounds().length != 1) {
-			return false;
-		}
-		Rectangle bounds = figure.getBounds().getCopy();
-		Insets insets = figure.getInsets();
-		bounds.crop(insets);
-		if (insets.top > THRESHHOLD && insets.left > THRESHHOLD
-				&& insets.right > THRESHHOLD && insets.bottom > THRESHHOLD) {
-			return !bounds.contains(location);
-		}
-
-		// since the figure insets could be 0, so we expand it a little, thus
-		// even the point is
-		// a little inside the content area, we still think it is selection the
-		// object.
-		if (bounds.height < 3 * THRESHHOLD || bounds.width < 3 * THRESHHOLD) {
-			bounds.crop(INSETS_1);
-		} else {
-			bounds.crop(INSETS_CONST);
-		}
-		return !bounds.contains(location);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editpolicies.ResizableEditPolicy#createSelectionHandles()
-	 */
-	protected List createSelectionHandles() {
-		// we have three different kinds of handles.
-		// 1. Those element that is resizable.
-		// 2. Those element that is rectangle but not resizable.
-		// 3. Those element that is not rectangle (fragments)
-
-		IFigure figure = this.getHostFigure();
-		if (figure instanceof CSSFigure && getHost() instanceof ElementEditPart) {
-			CSSFigure cssfigure = (CSSFigure) figure;
-			List fragments = cssfigure.getFragmentsForRead();
-
-			// XXX: only one fragment and is blockbox, then we think it is
-			// resizable by figure
-			// should move this test to somewhere else.
-			if (fragments != null && fragments.size() == 1
-					&& fragments.get(0) instanceof BlockBox) {
-				if (((ElementEditPart) getHost()).isResizable()) {
-					// super is Resizable policy, will create a resize handles.
-					return super.createSelectionHandles();
-				}
-                return createNonResizeHandles();
-			}
-            return createFragmentsHandles();
-		}
-        // second case
-        return createNonResizeHandles();
-	}
-
-	/**
-	 * @return
-	 */
-	private List createFragmentsHandles() {
-		List list = new ArrayList();
-		list.add(new FragmentHandle((GraphicalEditPart) getHost()));
-		return list;
-	}
-
-	/**
-	 * @return
-	 */
-	private List createNonResizeHandles() {
-		// following code copied from NonResizableEditPolicy
-		List list = new ArrayList();
-		if (isDragAllowed()) {
-			NonResizableHandleKit.addHandles((GraphicalEditPart) getHost(),
-					list);
-		} else {
-			NonResizableHandleKit.addHandles((GraphicalEditPart) getHost(),
-					list, new SelectEditPartTracker(getHost()),
-					SharedCursors.ARROW);
-		}
-
-		return list;
-	}
-
-
-    protected void hideSelection() {
-        super.hideSelection();
-        // handle removing the menu bar handle separately because it will decide
-        // when to remove itself (not removeSelectionHandles)
-        getNonVisualChildDecorator().updateState(MouseSelectableChildDecorator.EVENT_HOST_SELECTION_LOST);
-
-    }
-
-    protected void showSelection() {
-        super.showSelection();
-        // handle adding the menu bar handle separately because it will decide
-        // when to remove itself (not removeSelectionHandles
-        getNonVisualChildDecorator().updateState(MouseSelectableChildDecorator.EVENT_HOST_SELECTION_RECEIVED);
-    }
-
-    /**
-	 * child class could override this method.
-	 * 
-     * @param element 
-	 * @param width
-	 * @param height
-	 * @return the resize command or null  if none
-	 */
-	protected Command getResizeCommand(IDOMElement element, int width,
-			int height) {
-		Map map = new HashMap();
-		if (width > 0) {
-			map.put("width", width + "px"); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-		if (height > 0) {
-			map.put("height", height + "px"); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-		if (!map.isEmpty()) {
-            return new ChangeStyleCommand(element, map);
-		}
-        return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editpolicies.ResizableEditPolicy#getResizeCommand(org.eclipse.gef.requests.ChangeBoundsRequest)
-	 */
-	protected Command getResizeCommand(ChangeBoundsRequest request) {
-		ElementEditPart part = (ElementEditPart) this.getHost();
-
-		Rectangle rect = part.getFigure().getBounds();
-		rect = request.getTransformedRectangle(rect);
-		int width = rect.width;
-		int height = rect.height;
-
-		// since the user dragged rectangle included border/padding of the
-		// element. And if the element's
-		// width/height style setting don't include border padding, then we need
-		// to set the element's width/height
-		// style property a little smaller.
-		if (part.getFigure() instanceof CSSFigure) {
-			CSSFigure cssfigure = (CSSFigure) part.getFigure();
-			ICSSStyle style = cssfigure.getCSSStyle();
-			if (style != null && !style.isSizeIncludeBorderPadding()) {
-				width -= (style.getBorderInsets().getWidth() + style
-						.getPaddingInsets().getWidth());
-				height -= (style.getBorderInsets().getHeight() + style
-						.getPaddingInsets().getHeight());
-			}
-		}
-
-		//make sure to only change the dimensions for the direction of the resize request.
-		int resizeDirection = request.getResizeDirection();
-		switch (resizeDirection) {
-			case PositionConstants.EAST:
-			case PositionConstants.WEST:
-				//resizing, only the width, so set the height to -1;
-				height = -1;
-				break;
-			case PositionConstants.NORTH:
-			case PositionConstants.SOUTH:
-				//resizing only the height, so set the width to -1
-				width = -1;
-				break;
-			default:
-				//all others are changing both directions...
-		}
-		return getResizeCommand((IDOMElement) part.getIDOMNode(), width, height);
-	}
-
-	/**
-	 * Shows or updates feedback for a change bounds request.
-	 * 
-	 * @param request
-	 *            the request
-	 */
-	protected void showChangeBoundsFeedback(ChangeBoundsRequest request) {
-		IFigure feedback = getDragSourceFeedbackFigure();
-
-		PrecisionRectangle rect = new PrecisionRectangle(
-				getInitialFeedbackBounds().getCopy());
-		getHostFigure().translateToAbsolute(rect);
-		rect.translate(request.getMoveDelta());
-		rect.resize(request.getSizeDelta());
-
-		// to avoid enlarge feedback pane.
-		// when draging a editpart inside designer to move/copy it, we do not
-		// want to
-		// enlarge the canvas, since that may resulting in relayout.
-		rect = (PrecisionRectangle) rect.intersect(getFeedbackLayer()
-				.getBounds());
-
-		feedback.translateToRelative(rect);
-		feedback.setBounds(rect);
-	}
-
-    public Cursor getSelectionToolCursor(Point mouseLocation) {
-        // by default return null to indicate system default.  
-        // sub-classes should override to customize
-        return null;
-    }
-
-    /**
-     * by default, return null
-     * sub-classes should override to customize
-     * @param request
-     * @return the selectin tracker
-     */
-    protected DragTracker getSelectionTracker(LocationRequest request)
-    {
-        return null;
-    }
-    
-    public DragTracker getSelectionDragTracker(LocationRequest request) 
-    {
-        if (org.eclipse.jst.pagedesigner.requests.PageDesignerRequestConstants.REQ_SELECTION_TRACKER.equals(request.getType())){
-            return getSelectionTracker(request);
-        }
-        
-        // be default don't specify a selection drag tracker
-        // sub-classes should override to customize
-        if (shouldUseObjectMode(request)) {
-            return new ObjectModeDragTracker(getHost());
-        }
-        return new RangeDragTracker(getHost());
-
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/FragmentCornerHandle.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/FragmentCornerHandle.java
deleted file mode 100644
index ad3bd87..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/FragmentCornerHandle.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editpolicies;
-
-import org.eclipse.gef.DragTracker;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.handles.SquareHandle;
-import org.eclipse.jst.pagedesigner.tableedit.EmptyLocator;
-
-/**
- * A Handle used to mark the fragment.
- */
-public class FragmentCornerHandle extends SquareHandle {
-	FragmentCornerHandle(GraphicalEditPart owner) {
-		super(owner, new EmptyLocator());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.handles.AbstractHandle#createDragTracker()
-	 */
-	protected DragTracker createDragTracker() {
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/FragmentHandle.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/FragmentHandle.java
deleted file mode 100644
index 5efd984..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/FragmentHandle.java
+++ /dev/null
@@ -1,200 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editpolicies;
-
-import java.util.List;
-
-import org.eclipse.draw2d.Figure;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.LineBorder;
-import org.eclipse.draw2d.Locator;
-import org.eclipse.draw2d.PositionConstants;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.PrecisionRectangle;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.DragTracker;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.Handle;
-import org.eclipse.gef.handles.AbstractHandle;
-import org.eclipse.gef.tools.DragEditPartsTracker;
-import org.eclipse.jst.pagedesigner.css2.layout.CSSFigure;
-import org.eclipse.jst.pagedesigner.css2.layout.FlowBox;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class FragmentHandle extends AbstractHandle implements Handle {
-	/**
-	 * @param owner
-	 */
-	public FragmentHandle(GraphicalEditPart owner) {
-		super(owner, new FragmentLocator());
-		this.setOpaque(false);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.IFigure#paint(org.eclipse.draw2d.Graphics)
-	 */
-	public void paint(Graphics graphics) {
-		graphics.setClip(this.getBounds().getCopy().expand(7, 7));
-		super.paint(graphics);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.handles.AbstractHandle#createDragTracker()
-	 */
-	protected DragTracker createDragTracker() {
-		DragEditPartsTracker tracker = new DragEditPartsTracker(getOwner());
-		tracker.setDefaultCursor(getCursor());
-		return tracker;
-	}
-
-	private void refresh() {
-
-		// set the bounds of this figure, so it could cover all children.
-		bounds = getOwnerFigure().getBounds();
-		bounds = new PrecisionRectangle(bounds.getResized(-1, -1));
-		getOwnerFigure().translateToAbsolute(bounds);
-		this.translateToRelative(bounds);
-		this.setBounds(bounds);
-
-		this.removeAll();
-		// ok, recreate all children.
-		CSSFigure cssfigure = (CSSFigure) getOwner().getFigure();
-		List fragments = cssfigure.getFragmentsForRead();
-		for (int i = 0, size = fragments.size(); i < size; i++) {
-			// the rectangle.
-			Figure childFigure = new BorderFigure();
-			childFigure.setBorder(new LineBorder(1));
-			this.add(childFigure);
-
-			FlowBox box = (FlowBox) fragments.get(i);
-			Rectangle rect = new Rectangle(box.getX(), box.getY(), box.getWidth(), box
-					.getHeight());
-			cssfigure.translateToAbsolute(rect);
-
-			childFigure.translateToRelative(rect);
-			childFigure.setBounds(rect);
-
-			createCornerHandles(cssfigure, box);
-		}
-	}
-
-	/**
-	 * 
-	 */
-	private void createCornerHandles(CSSFigure reference, FlowBox referencebox) {
-		createHandle(reference, referencebox, PositionConstants.SOUTH_EAST);
-		createHandle(reference, referencebox, PositionConstants.SOUTH_WEST);
-		createHandle(reference, referencebox, PositionConstants.NORTH_WEST);
-		createHandle(reference, referencebox, PositionConstants.NORTH_EAST);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.IFigure#containsPoint(int, int)
-	 */
-	public boolean containsPoint(int x, int y) {
-		List children = this.getChildren();
-		for (int i = 0, n = children.size(); i < n; i++) {
-			if (((IFigure) children.get(i)).containsPoint(x, y)) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * @param north_east
-	 */
-	private void createHandle(CSSFigure reference, FlowBox referencebox,
-			int location) {
-		double relativeX, relativeY;
-		switch (location & PositionConstants.NORTH_SOUTH) {
-		case PositionConstants.NORTH:
-			relativeY = 0;
-			break;
-		case PositionConstants.SOUTH:
-			relativeY = 1.0;
-			break;
-		default:
-			relativeY = 0.5;
-		}
-
-		switch (location & PositionConstants.EAST_WEST) {
-		case PositionConstants.WEST:
-			relativeX = 0;
-			break;
-		case PositionConstants.EAST:
-			relativeX = 1.0;
-			break;
-		default:
-			relativeX = 0.5;
-		}
-
-		FragmentCornerHandle target = new FragmentCornerHandle(getOwner());
-		this.add(target);
-
-		// for corner small box.
-		Rectangle targetBounds = new Rectangle(referencebox.getX(),
-				referencebox.getY(), referencebox.getWidth(), referencebox
-						.getHeight());
-		targetBounds = new PrecisionRectangle(targetBounds);
-		reference.translateToAbsolute(targetBounds);
-		target.translateToRelative(targetBounds);
-		// targetBounds.resize(1, 1);
-
-		Dimension targetSize = target.getPreferredSize();
-
-		targetBounds.x += (int) (targetBounds.width * relativeX - ((targetSize.width + 1) / 2));
-		targetBounds.y += (int) (targetBounds.height * relativeY - ((targetSize.height + 1) / 2));
-		targetBounds.setSize(targetSize);
-		target.setBounds(targetBounds);
-	}
-
-	static class FragmentLocator implements Locator {
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.draw2d.Locator#relocate(org.eclipse.draw2d.IFigure)
-		 */
-		public void relocate(IFigure target) {
-			((FragmentHandle) target).refresh();
-		}
-	}
-
-	static class BorderFigure extends Figure {
-		/**
-		 * the bounds padding
-		 */
-		public static final int INNER_PAD = 2;
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.draw2d.IFigure#containsPoint(int, int)
-		 */
-		public boolean containsPoint(int x, int y) {
-			if (!super.containsPoint(x, y))
-				return false;
-			return !Rectangle.SINGLETON.setBounds(getBounds()).shrink(
-					INNER_PAD, INNER_PAD).contains(x, y);
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/HeadItemCreationEditPolicy.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/HeadItemCreationEditPolicy.java
deleted file mode 100644
index a7de205..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/HeadItemCreationEditPolicy.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle Corporation - initial API and implementation and/or initial documentation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editpolicies;
-
-import org.eclipse.gef.Request;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.requests.DropRequest;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.commands.CreateItemCommand;
-import org.eclipse.jst.pagedesigner.dom.DOMPosition;
-import org.eclipse.jst.pagedesigner.dom.DOMPositionHelper;
-import org.eclipse.jst.pagedesigner.dom.DOMRefPosition;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.itemcreation.ItemCreationEditPolicy;
-import org.eclipse.jst.pagedesigner.itemcreation.ItemCreationRequest;
-import org.eclipse.jst.pagedesigner.parts.ElementEditPart;
-import org.eclipse.jst.pagedesigner.validation.caret.ActionData;
-import org.eclipse.jst.pagedesigner.validation.caret.DnDPositionValidator;
-import org.eclipse.jst.pagedesigner.validation.caret.DropActionData;
-import org.eclipse.jst.pagedesigner.validation.caret.IPositionMediator;
-import org.eclipse.jst.pagedesigner.validation.caret.DropActionData.DropData;
-import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
-import org.w3c.dom.Node;
-
-/**
- *
- */
-public class HeadItemCreationEditPolicy extends ItemCreationEditPolicy {
-
-	/**
-	 * @param host
-	 */
-	public HeadItemCreationEditPolicy(ElementEditPart host) {
-		super();
-		setHost(host);
-	}
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editpolicies.AbstractEditPolicy#getCommand(org.eclipse.gef.Request)
-	 */
-	@Override
-	public Command getCommand(Request request) {
-		if (request instanceof ItemCreationRequest) {
-			ItemCreationRequest r = (ItemCreationRequest) request;
-			DesignPosition position = findPosition((ItemCreationRequest)request);
-			
-			if (position == null) {
-				return null;
-			}
-
-			IDOMPosition domposition = DOMPositionHelper.toDOMPosition(position);
-			if (domposition == null) {
-				return null;
-			}
-
-			// since the head tag is a widget, the offset will need 
-			// to be updated in the position so that new node is
-			// appended to the list of children.
-			Node node = domposition.getContainerNode();
-			domposition = new DOMPosition(node, node.getChildNodes().getLength());
-
-			return new CreateItemCommand(
-					PDPlugin
-							.getResourceString("ItemCreationEditPolicy.CommandLabel.CreateItem"),//$NON-NLS-1$
-					getViewer(getHost()).getModel(), domposition, r.getTagCreationProvider());
-		}
-		return null;
-	}
-
-	@Override
-	protected IPositionMediator createDropChildValidator(DropRequest r) {
-		DropData dropData = createDropData(r);
-
-		if (dropData != null) {
-			MyDnDPositionValidator validator = new MyDnDPositionValidator(
-					new DropActionData(ActionData.PALETTE_DND, dropData));
-			return validator;
-		}
-		return null;
-	}
-
-	private static class MyDnDPositionValidator extends DnDPositionValidator {
-
-		public MyDnDPositionValidator(DropActionData dropActionData) {
-			super(dropActionData);
-		}
-
-		@Override
-		public boolean isValidPosition(IDOMPosition position) {
-			// if position is really a IDOMRefPosition, convert it to DOMPosition
-			Node node = null;
-			if (position instanceof DOMRefPosition) {
-				node = ((DOMRefPosition) position).getReferenceNode();
-				if (IHTMLConstants.TAG_HEAD.equalsIgnoreCase(node.getLocalName())) {
-					return true;
-				}
-			} else {
-				node = position.getContainerNode();
-				if (IHTMLConstants.TAG_HEAD.equalsIgnoreCase(node.getLocalName())) {
-					return true;
-				}
-			}
-
-			return super.isValidPosition(position);
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/IEnhancedSelectionEditPolicy.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/IEnhancedSelectionEditPolicy.java
deleted file mode 100644
index 779762b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/IEnhancedSelectionEditPolicy.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editpolicies;
-
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.gef.DragTracker;
-import org.eclipse.gef.requests.LocationRequest;
-import org.eclipse.swt.graphics.Cursor;
-
-/**
- * Allows a selection edit policy to specify extra capabilities
- * 
- * @author cbateman
- */
-public interface IEnhancedSelectionEditPolicy 
-{
-    /**
-     * @param mouseLocation 
-     * @return the cursor that should be displayed when a selection tool
-     * enters the hit box (mouses over) of an edit part but no selection
-     * or drag operations have occurred yet.  Null indicates the caller should
-     * use whatever default it deems appropriate.
-     */
-    Cursor getSelectionToolCursor(Point mouseLocation);
-    
-    /**
-     * @param request 
-     * @param mouseLocator
-     * @return a drag tracker to be used when the mouse moves over a certain
-     * location and mouse state is in initial state or null if the policy
-     * doesn't wish to customize this. This allows an edit part
-     * to customize what drag tracker is used depending on where the mouse is positioned
-     * on its figure.
-     */
-    DragTracker getSelectionDragTracker(LocationRequest request);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/ITableEditAdapter.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/ITableEditAdapter.java
deleted file mode 100644
index 0795c8a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/ITableEditAdapter.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editpolicies;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public interface ITableEditAdapter {
-	/**
-	 * @return the column count
-	 */
-	public int getColumnCount();
-
-	/**
-	 * @return the row count
-	 */
-	public int getRowCount();
-
-	/**
-	 * @param atPosition
-	 */
-	public void insertColumn(int atPosition);
-
-	/**
-	 * @param rowPosition
-	 */
-	public void insertRow(int rowPosition);
-
-	/**
-	 * @param columnIndex
-	 * @return the starting point for resize
-	 */
-	public int getColumnResizeStart(int columnIndex);
-
-	/**
-	 * @return the resize width
-	 */
-	public int getColumnResizeWidth();
-
-	/**
-	 * @param columnIndex
-	 * @return column start
-	 */
-	public int getColumnStart(int columnIndex);
-
-	/**
-	 * @param columnIndex
-	 * @return the column width
-	 */
-	public int getColumnWidth(int columnIndex);
-
-	/**
-	 * @param rowIndex
-	 * @return the row start
-	 */
-	public int getRowStart(int rowIndex);
-
-	/**
-	 * @param rowIndex
-	 * @return the row height
-	 */
-	public int getRowHeight(int rowIndex);
-
-	/**
-	 * @param rowIndex
-	 * @return starting point of the row resize
-	 */
-	public int getRowResizeStart(int rowIndex);
-
-	/**
-	 * @return the row resize width
-	 */
-	public int getRowResizeWidth();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/JSFDropEditPolicy.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/JSFDropEditPolicy.java
deleted file mode 100644
index 0b36919..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/JSFDropEditPolicy.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editpolicies;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.editpolicies.GraphicalEditPolicy;
-import org.eclipse.jst.pagedesigner.commands.PDDropRequest;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- */
-public class JSFDropEditPolicy extends GraphicalEditPolicy {
-	String _attrName;
-
-	/**
-	 * @param attrname
-	 */
-	public JSFDropEditPolicy(String attrname) {
-		_attrName = attrname;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editpolicies.AbstractEditPolicy#getTargetEditPart(org.eclipse.gef.Request)
-	 */
-	public EditPart getTargetEditPart(Request request) {
-		if (request instanceof PDDropRequest) {
-			return getHost();
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editpolicies.AbstractEditPolicy#getCommand(org.eclipse.gef.Request)
-	 */
-	public Command getCommand(Request request) {
-		if (request instanceof PDDropRequest) {
-			PDDropRequest r = (PDDropRequest) request;
-			final String s = (String) r.getCurrentEvent().data;
-			return new Command() {
-				/*
-				 * (non-Javadoc)
-				 * 
-				 * @see org.eclipse.gef.commands.Command#execute()
-				 */
-				public void execute() {
-					// XXX: should check whether alreayd set the attribute,
-					// maybe
-					// should also popup dialog etc.
-					((Element) getHost().getModel()).setAttribute(_attrName, s);
-				}
-			};
-		}
-
-		return super.getCommand(request);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editpolicies.AbstractEditPolicy#eraseTargetFeedback(org.eclipse.gef.Request)
-	 */
-	public void eraseTargetFeedback(Request request) {
-		// 
-		super.eraseTargetFeedback(request);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editpolicies.AbstractEditPolicy#showTargetFeedback(org.eclipse.gef.Request)
-	 */
-	public void showTargetFeedback(Request request) {
-		super.showTargetFeedback(request);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/LinkEditPolicy.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/LinkEditPolicy.java
deleted file mode 100644
index ad222be..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/LinkEditPolicy.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editpolicies;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.editpolicies.GraphicalEditPolicy;
-import org.eclipse.jst.pagedesigner.actions.link.LinkRequest;
-import org.eclipse.jst.pagedesigner.actions.link.MakeLinkCommand;
-import org.eclipse.jst.pagedesigner.parts.TextEditPart;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class LinkEditPolicy extends GraphicalEditPolicy {
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.EditPolicy#getCommand(org.eclipse.gef.Request)
-	 */
-	public Command getCommand(Request request) {
-		EditPart part = this.getHost();
-		IHTMLGraphicalViewer viewer = null;
-		if (part instanceof TextEditPart) {
-			//TODO: ?? part = (TextEditPart) part;
-			viewer = (IHTMLGraphicalViewer) part.getViewer();
-		}
-		if (request instanceof LinkRequest) {
-			LinkRequest req = (LinkRequest) request;
-			String identifier = req.getIdentifier();
-			DesignRange range = req.getDesignRange();
-            // TODO: when part !instancof TextEditPart, viewer == null
-			Command command = new MakeLinkCommand(identifier, viewer, part,
-					range);
-			return command;
-		}
-		return super.getCommand(request);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/LocationHelper.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/LocationHelper.java
deleted file mode 100644
index b6e09fe..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/LocationHelper.java
+++ /dev/null
@@ -1,197 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editpolicies;
-
-import java.util.List;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.jst.pagedesigner.css2.layout.FlowBox;
-import org.eclipse.jst.pagedesigner.css2.layout.ICSSFigure;
-import org.eclipse.jst.pagedesigner.parts.DocumentEditPart;
-import org.eclipse.jst.pagedesigner.parts.ElementEditPart;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
-import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.ModelQuery;
-import org.eclipse.wst.xml.core.internal.modelquery.ModelQueryUtil;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public final class LocationHelper {
-	/**
-	 * @param host 
-	 * @param p
-	 * @param result
-	 * @param tagName
-	 * @param skip
-	 * @return  true if insertion point is found
-	 */
-	public static boolean findInsertLocation(GraphicalEditPart host, Point p,
-			GraphicalEditPart[] result, String tagName, Node skip) {
-		if (isHostInsideSkip(host, skip))
-			return false;
-
-		while (isValidHost(host) && !canHostContainTag(host, tagName)) {
-			if (host.getParent() instanceof GraphicalEditPart)
-				host = (GraphicalEditPart) host.getParent();
-			else
-				host = null;
-		}
-		if (!isValidHost(host))
-			return false;
-
-		// ok, next we try to find a insertion point inside host
-		result[0] = host;
-		List children = host.getChildren();
-		if (children.isEmpty()) {
-			result[1] = null;
-			return true;
-		}
-		// TODO: never read GraphicalEditPart ref = null;
-		for (int i = 0, size = children.size(); i < size; i++) {
-			GraphicalEditPart child = (GraphicalEditPart) children.get(i);
-			Rectangle rect = getAbsoluteBounds(child);
-
-			if (rect.contains(p)) {
-				IFigure figure = child.getFigure();
-				if (figure instanceof ICSSFigure) {
-					List frags = ((ICSSFigure) figure).getFragmentsForRead();
-					if (frags.size() > 1) // more than one frags, so is a zig
-					// zag.
-					{
-						// check whether is before the first box.
-						FlowBox box = (FlowBox) frags.get(0);
-						Rectangle rect1 = getAbsoluteBounds(figure, box);
-						if (rect1.x > p.x && rect1.y + rect1.height > p.y) {
-							// p is at left/above the first box. so we think p
-							// is before this child
-							result[1] = child;
-							return true;
-						}
-						// check whether is after the last box
-						box = (FlowBox) frags.get(frags.size() - 1);
-						rect1 = getAbsoluteBounds(figure, box);
-						if (rect1.x < p.x && rect1.y < p.y) {
-							continue;
-						}
-					}
-				}
-				// ok, treat as the point in a rect figure, see which side is
-				// closer.
-				if (p.x > rect.x + rect.width / 2) {
-					continue;
-				}
-                result[1] = child;
-                return true;
-			} else if (rect.x + rect.width < p.x || rect.y + rect.height < p.y) {
-				// p is at right or below rect. so the point is "after" the
-				// rect.
-				continue;
-			} else {
-				// ok, p is "before" rect.
-				result[1] = child;
-				return true;
-			}
-		}
-		// we search through all.
-		result[1] = null;
-		return true;
-	}
-
-	/**
-	 * @param figure
-	 * @param box
-	 * @return the bounding rectangle
-	 */
-	public static Rectangle getAbsoluteBounds(IFigure figure, FlowBox box) {
-		Rectangle r = new Rectangle(box.getX(), box.getY(), box.getWidth(), box
-				.getHeight());
-		figure.translateToAbsolute(r);
-		return r;
-	}
-
-	/**
-	 * @param child
-	 * @return the bounding rectangle
-	 */
-	public static Rectangle getAbsoluteBounds(GraphicalEditPart child) {
-		Rectangle bounds = child.getFigure().getBounds().getCopy();
-		child.getFigure().translateToAbsolute(bounds);
-		return bounds;
-	}
-
-	/**
-	 * @param host
-	 * @param tagName
-	 * @return
-	 */
-	private static boolean canHostContainTag(GraphicalEditPart host,
-			String tagName) {
-		if (host == null)
-			return false;
-		Node node = (Node) host.getModel();
-		if (node.getNodeType() == Node.ELEMENT_NODE) {
-			ModelQuery modelQuery = getModelQuery(node);
-			if (modelQuery != null) {
-				CMElementDeclaration elementDecl = modelQuery
-						.getCMElementDeclaration((Element) node);
-				if (elementDecl == null) {
-					return true;
-				}
-				if (elementDecl.getContentType() == CMElementDeclaration.EMPTY)
-					return false;
-			}
-		}
-		return true;
-	}
-
-	/**
-	 * @param host
-	 * @return
-	 */
-	private static boolean isValidHost(GraphicalEditPart host) {
-		return host != null
-				&& (host instanceof ElementEditPart || host instanceof DocumentEditPart);
-	}
-
-	/**
-	 * @param host
-	 * @param skip
-	 * @return
-	 */
-	private static boolean isHostInsideSkip(GraphicalEditPart host, Node skip) {
-		if (skip == null)
-			return false;
-
-		// XXX: not done.
-		return false;
-	}
-
-	private static ModelQuery getModelQuery(Node node) {
-        Document doc = node.getOwnerDocument();
-        
-		if (node.getNodeType() == Node.DOCUMENT_NODE) {
-            doc = (Document) node;
-		}
-        return ModelQueryUtil.getModelQuery(doc);
-	}
-
-	private LocationHelper()
-	{
-	    // util class, no external instantiation
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/MouseSelectableChildDecorator.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/MouseSelectableChildDecorator.java
deleted file mode 100644
index 11957af..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/MouseSelectableChildDecorator.java
+++ /dev/null
@@ -1,631 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-/**
- * 
- */
-package org.eclipse.jst.pagedesigner.editpolicies;
-
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.Locator;
-import org.eclipse.draw2d.MouseEvent;
-import org.eclipse.draw2d.MouseListener;
-import org.eclipse.draw2d.MouseMotionListener;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.PrecisionRectangle;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.parts.ElementEditPart;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * A child decorator that supports mouse selection
- * 
- * @author cbateman
- *
- */
-class MouseSelectableChildDecorator extends NonVisualChildDecorator
-{
-    private static final String PIN_UP_IMAGE_FILE = "pin_up.gif"; //$NON-NLS-1$
-    
-	private static final String PIN_DOWN_IMAGE_FILE = "pin_down.gif"; //$NON-NLS-1$
-
-	// no visual or affordance showing
-    private static final int           STATE_START = 0;
-    
-    // the host is showing hover feedback, but is not selected
-    private static final int           STATE_HOST_HOVER = 1;
-    
-    // the host has primary selection
-    private static final int           STATE_HOST_SELECTED = 2;
-    
-    // the selection handle for the decorator has mouse hover
-    private static final int           STATE_HANDLE_HOVER = 3;
-    
-    // the selection handle has been selected (is showing)
-    private static final int           STATE_HANDLE_MENU_BAR_SHOWING = 4;
-    
-    // the menu bar has hover
-    private static final int           STATE_HANDLE_MENU_BAR_HOVER = 5;
-    
-    // the menu bar has primary selection
-    private static final int           STATE_HANDLE_MENU_BAR_SELECTED = 6;
-    
-    /**
-     * An event indicating the host received hover
-     */
-    public static final int           EVENT_HOST_HOVER_RECEIVED = 31;
-    /**
-     * An event indicating the host lost hover
-     */
-    public static final int           EVENT_HOST_HOVER_LOST = 32;
-    /**
-     * An event indicating the host received selection
-     */
-    public static final int           EVENT_HOST_SELECTION_RECEIVED = 33;
-    /**
-     * An event indicating the host lost selection
-     */
-    public static final int           EVENT_HOST_SELECTION_LOST = 34;
-    private static final int          EVENT_HANDLE_HOVER_RECEIVED = 35;
-    private static final int          EVENT_HANDLE_HOVER_LOST = 36;
-    private static final int          EVENT_HANDLE_SELECTED = 37;
-    private static final int          EVENT_ALL_SELECTION_LOST = 38;
-    private static final int          EVENT_MENU_BAR_SELECTION_RECEIVED = 39;
-    
-    private MouseMotionListener      _motionListener;
-    private MouseListener            _mouseListener;
-    private boolean                  _isMouseOver = false;
-    private ElementMenuBar           _elementMenuBar;
-
-    private DisplayStateMachine      _stateMachine;
-    private VerticalMenuLocator      _menuLocator;
-    private AnimatedHideLocator      _hideLocator;
-    private IFigure                  _hoverParent;
-    private IFigure                  _selectionParent;
-
-    private ISelectionChangedListener _menuSelectionListener;
-    
-    MouseSelectableChildDecorator(final GraphicalEditPart hostPart, int location, 
-            IFigure hoverParent, IFigure selectionParent) {
-        super(hostPart, location);
-        _menuLocator = new VerticalMenuLocator(hostPart, this);
-        _hideLocator = new AnimatedHideLocator();
-        _elementMenuBar = ((ElementEditPart)hostPart).getElementMenuBar();
-        _stateMachine = new DisplayStateMachine();
-        _hoverParent = hoverParent;
-        _selectionParent = selectionParent;
-        
-        _motionListener = new MouseMotionListener.Stub()
-        {
-            public void mouseEntered(MouseEvent me) {
-                _isMouseOver = true;
-                updateState(EVENT_HANDLE_HOVER_RECEIVED);
-            }
-    
-            public void mouseExited(MouseEvent me) {
-                _isMouseOver = false;
-                updateState(EVENT_HANDLE_HOVER_LOST);
-            }
-        };
-        addMouseMotionListener(_motionListener);
-            
-        _mouseListener = new MouseListener.Stub()
-        {
-            public void mousePressed(MouseEvent me) {
-                updateState(EVENT_HANDLE_SELECTED);
-            }
-        };
-        addMouseListener(_mouseListener);
-        
-        _menuSelectionListener = new ISelectionChangedListener()
-        {
-            public void selectionChanged(SelectionChangedEvent event) {
-                IStructuredSelection selection = (IStructuredSelection) event.getSelection();
-                if (selection.size() == 0)
-                {
-                    // if the host part has been given back selection, then
-                    // we have a host selection event
-                    if (getOwner().getSelected() == EditPart.SELECTED_PRIMARY)
-                    {
-                        updateState(EVENT_HOST_SELECTION_RECEIVED);
-                    }
-                    // otherwise, both the host and the non-visual children are lost,
-                    // so fire all selection lost
-                    else
-                    {
-                        updateState(EVENT_ALL_SELECTION_LOST);
-                    }
-                }
-                // otherwise, one or more non-visual children have selection
-                else
-                {
-                    updateState(EVENT_MENU_BAR_SELECTION_RECEIVED);
-                }
-            }
-        };
-        _elementMenuBar.addSelectionChangedListener(_menuSelectionListener);
-    }
-    
-    public void paintFigure(Graphics g) {
-        // TODO: could we use an image label toggle button here instead?    
-        Image  arrowImage = null;
-        
-        if (_stateMachine.isMenuShowing())
-        {
-            arrowImage = PDPlugin.getDefault().getImage(PIN_DOWN_IMAGE_FILE);
-        }
-        else
-        {
-            arrowImage = PDPlugin.getDefault().getImage(PIN_UP_IMAGE_FILE);
-        }
-        
-        Rectangle r = getBounds();
-        g.setAlpha(75);
-        g.setBackgroundColor(getFillColor());
-        g.fillRectangle(r.x, r.y, r.width, r.height);
-        g.setAlpha(getAlpha());
-        g.drawImage(arrowImage, r.x+1, r.y+1);
-        g.setForegroundColor(getBorderColor()); 
-        g.drawRectangle(r.x, r.y, r.width-1, r.height-1);
-    }
-
-    /**
-     * @param event
-     */
-    public void updateState(int event)
-    {
-        int oldState = _stateMachine.doTransition(event);
-        updateVisual(oldState);
-    }
-    
-    /**
-     * @param oldState
-     */
-    protected void updateVisual(int oldState)
-    {
-        // overriding all other considerations is whether the menu bar even has
-        // any items to show.  If not don't show anything
-        if (!_elementMenuBar.hasChildParts())
-        {
-            if (getParent() != null)
-            {
-                getParent().remove(this);
-            }
-            
-            return;
-        }
-        
-        switch (_stateMachine._curState)
-        {
-            case STATE_START:
-                hide(_elementMenuBar, false);
-                IFigure parent = getParent();
-                if (parent != null)
-                {
-                    parent.remove(this);
-                }
-            break;
-            
-            case STATE_HOST_HOVER:
-                if (_hoverParent != null)
-                {
-                    _hoverParent.add(this);
-                    validate();
-                }
-                show(_elementMenuBar, false);
-                setVisible(false);
-            break;
-            
-            case STATE_HOST_SELECTED:
-                if (_selectionParent != null)
-                {
-                    _selectionParent.add(this);
-                    validate();
-                }
-
-                setVisible(true);
-
-                if (oldState != STATE_HOST_SELECTED
-                        && oldState != STATE_HANDLE_HOVER)
-                {
-                    show(_elementMenuBar, true);
-                    hide(_elementMenuBar, true);
-                }
-                else
-                {
-                    if (!_hideLocator._isAnimating)
-                    {
-                        hide(_elementMenuBar, false);
-                    }
-                }
-                repaint();
-            break;
-            
-            case STATE_HANDLE_HOVER:
-                if (_stateMachine.isMenuShowing(oldState))
-                {
-                    hide(_elementMenuBar, false);
-                }
-                else
-                {
-                    show(_elementMenuBar, false);
-                }
-                repaint();
-            break;
-            
-            case STATE_HANDLE_MENU_BAR_SHOWING:
-                show(_elementMenuBar, true);
-                repaint();
-            break;
-            
-            case STATE_HANDLE_MENU_BAR_HOVER:
-            case STATE_HANDLE_MENU_BAR_SELECTED:
-                //revalidate();
-            break;
-            
-            
-            default:
-                
-        }
-    }
-
-    protected void init() {
-        setPreferredSize(new Dimension(12, 12));
-    }
-    
-    /**
-     * 
-     */
-    public void dispose()
-    {
-        hide(_elementMenuBar, false);
-        
-        if (_motionListener != null)
-        {
-            removeMouseMotionListener(_motionListener);
-            _motionListener = null;
-        }
-        
-        if (_mouseListener != null)
-        {
-            removeMouseListener(_mouseListener);
-            _mouseListener = null;
-        }
-        
-        if (_menuSelectionListener != null)
-        {
-            _elementMenuBar.removeSelectionChangedListener(_menuSelectionListener);
-            _menuSelectionListener = null;
-        }
-    }
-    
-    private void hide(ElementMenuBar menuBar, boolean animate)
-    {
-        if (animate)
-        {
-            final Point endPoint = this.getLocation().getCopy();
-            //TODO: don't understand when translation is necessary...
-            //this.translateToAbsolute(endPoint);
-            
-            endPoint.x += this.getBounds().width / 2;
-            endPoint.y += this.getBounds().height / 2;
-            _hideLocator.setHideEndPoint(endPoint);
-            _hideLocator.relocate(menuBar);
-        }
-        else 
-        {
-            if (menuBar.getParent() != null)
-            {
-                getParent().remove(menuBar);
-            }
-        }
-    }
-    
-    private void show(ElementMenuBar menuBar, boolean enabled)
-    {
-        menuBar.setEnabled(enabled);
-        getParent().add(menuBar);
-        _menuLocator.relocate(menuBar);
-    }
-    
-    protected int getAlpha() 
-    {
-        return (_isMouseOver || _stateMachine.isMenuShowing()) ? 255 : 75;
-    }
-    
-    private class DisplayStateMachine
-    {
-        private int _curState = STATE_START;
-        
-        /**
-         * @param event
-         * @return execute a state machine transition on event
-         */
-        public int doTransition(int event)
-        {
-            final int     oldState = _curState;
-            
-            switch(_curState)
-            {
-                case STATE_START:
-                    // can only transition from start state
-                    // on a host event
-                    if (event == EVENT_HOST_HOVER_RECEIVED)
-                    {
-                        _curState = STATE_HOST_HOVER;
-                    }
-                    else if (event == EVENT_HOST_SELECTION_RECEIVED)
-                    {
-                        _curState = STATE_HOST_SELECTED;
-                    }
-                break;
-                
-                case STATE_HOST_HOVER:
-                    if (event == EVENT_HOST_SELECTION_RECEIVED)
-                    {
-                        _curState = STATE_HOST_SELECTED;
-                    }
-                    else if (event == EVENT_HOST_SELECTION_LOST
-                            || event == EVENT_HOST_HOVER_LOST)
-                    {
-                        _curState = STATE_START;
-                    }
-                    else if (event == EVENT_HOST_HOVER_RECEIVED)
-                    {
-                        // preserve state in this case
-                    }
-                break;
-
-                case STATE_HOST_SELECTED:
-                    // once the host is selected,the only host event that
-                    // that can change state is selection lost
-                    if (event == EVENT_HOST_SELECTION_LOST)
-                    {
-                        _curState = STATE_START;
-                    }
-                    else if (event == EVENT_HANDLE_HOVER_RECEIVED)
-                    {
-                        _curState = STATE_HANDLE_HOVER;
-                    }
-                    else if (event == EVENT_HANDLE_SELECTED)
-                    {
-                        _curState = STATE_HANDLE_MENU_BAR_SHOWING;
-                    }
-                    else if (event == EVENT_ALL_SELECTION_LOST)
-                    {
-                        _curState = STATE_START;
-                    }
-                break;
-                    
-                case STATE_HANDLE_HOVER:
-                    if (event == EVENT_HANDLE_HOVER_LOST)
-                    {
-                        _curState = STATE_HOST_SELECTED;
-                    }
-                    else if (event == EVENT_HANDLE_SELECTED)
-                    {
-                        _curState = STATE_HANDLE_MENU_BAR_SHOWING;
-                    }
-                    else if (event == EVENT_HOST_SELECTION_LOST)
-                    {
-                        _curState = STATE_START;
-                    }
-                break;
-                case STATE_HANDLE_MENU_BAR_SHOWING:
-                    if (event == EVENT_HANDLE_SELECTED)
-                    {
-                        _curState = STATE_HANDLE_HOVER;
-                    }
-                    else if (event == EVENT_MENU_BAR_SELECTION_RECEIVED)
-                    {
-                        _curState = STATE_HANDLE_MENU_BAR_SELECTED;
-                    }
-                    else if (event == EVENT_ALL_SELECTION_LOST)
-                    {
-                        _curState = STATE_START;
-                    }
-                break;
-
-                case STATE_HANDLE_MENU_BAR_HOVER:
-                break;                    
-
-                case STATE_HANDLE_MENU_BAR_SELECTED:
-                    if (event == EVENT_ALL_SELECTION_LOST)
-                    {
-                        _curState = STATE_START;
-                    }
-                    else if (event == EVENT_HANDLE_SELECTED)
-                    {
-                        _curState = STATE_HANDLE_HOVER;
-                    }
-                break;
-                
-            }
-            
-            
-            return oldState;
-        }
-
-        /**
-         * @return true if the  menu should be showing in the  current state
-         */
-        public boolean isMenuShowing()
-        {
-            return isMenuShowing(_curState);
-        }
-
-        /**
-         * @param state
-         * @return true if state is one in which the menu should be showing
-         */ 
-        public boolean isMenuShowing(int state)
-        {
-            return _curState == STATE_HANDLE_MENU_BAR_SHOWING 
-                    || _curState == STATE_HANDLE_MENU_BAR_HOVER
-                    || _curState == STATE_HANDLE_MENU_BAR_SELECTED;
-        }
-    }
-    
-    private static class VerticalMenuLocator implements Locator
-    {
-        private IFigure  _referenceFigure;
-        
-        VerticalMenuLocator(GraphicalEditPart owner, IFigure reference)
-        {
-            _referenceFigure = reference;
-        }
-        
-        public void relocate(IFigure target) 
-        {
-            final Rectangle finalBounds = getFinalMenuBounds(target);
-            target.setBounds(finalBounds);
-        }
-        
-        
-        private Rectangle getInitialMenuBounds(final IFigure target)
-        {
-            Rectangle targetBounds = 
-                new PrecisionRectangle(_referenceFigure.getBounds().getResized(-1, -1));
-            _referenceFigure.translateToAbsolute(targetBounds);
-            target.translateToRelative(targetBounds);
-            return targetBounds;
-        }
-
-        private Rectangle getFinalMenuBounds(final IFigure target)
-        {
-            final IFigure referenceFigure =  _referenceFigure;
-            
-            Rectangle targetBounds = getInitialMenuBounds(target);
-            Dimension targetSize = target.getPreferredSize();
-
-            // copied from super.relocate because relativeX/Y are private in super
-            // changed from super to remove div by 2 that centers target; we want
-            // it to be corner-to-corner
-            targetBounds.x
-                += targetBounds.width+4;
-            targetBounds.y
-                  -= (targetSize.height / 2) - referenceFigure.getBounds().height/2;
-            targetBounds.setSize(targetSize);
-            //target.setBounds(targetBounds);
-
-//            final Rectangle viewPortRect = 
-//                ((IHTMLGraphicalViewer)_owner.getViewer()).getViewport().getBounds();
-//            final Rectangle targetRect = targetBounds.getCopy();
-//            
-//            targetRect.intersect(viewPortRect);
-
-//            int width = targetBounds.width - targetRect.width;
-//            int height = targetBounds.height - targetRect.height;
-            
-//            if (width != 0)
-//            {
-//                targetBounds.x -= width;
-//            }
-//            
-//            if (height != 0)
-//            {
-//                targetBounds.y += height;
-//            }
-            
-            return targetBounds;
-        }
-    }
-    
-    private static class AnimatedHideLocator implements Locator
-    {
-        private Point _endPoint;
-        private boolean _isAnimating;
-        
-        /**
-         * @param endPoint -- must be absolute coordinate
-         */
-        public void setHideEndPoint(Point endPoint)
-        {
-            _endPoint = endPoint;
-        }
-        
-        public void relocate(IFigure target) 
-        {
-            final Point newEndPoint = _endPoint.getCopy();
-            target.translateToRelative(_endPoint);
-            Rectangle startBounds = target.getBounds().getCopy();
-            animateBoundsChange(target, startBounds, newEndPoint);
-        }
-
-        private void animateBoundsChange(final IFigure target, 
-                final Rectangle startBounds, 
-                final Point endPoint)
-        {
-            final int numSteps = 5;
-            final int numMs = 500;
-            final int timeSteps = numMs/numSteps;
-            
-            int xDelta = endPoint.x - startBounds.x;
-            int yDelta = endPoint.y - startBounds.y;
-            
-            final int widthIncrement = -1 * startBounds.width / numSteps;
-            final int heightIncrement = -1 * startBounds.height / numSteps;
-            int xIncrement = xDelta / numSteps;
-            int yIncrement = yDelta  / numSteps;
-            
-            target.setBounds(startBounds);
-            if (widthIncrement != 0 || heightIncrement != 0)
-            {
-                _isAnimating = true;
-                doAnimation(numMs, timeSteps, widthIncrement, heightIncrement, xIncrement, yIncrement, endPoint, target);
-            }
-        }
-        
-        private void doAnimation(final int remainingTime, 
-                final int timeIncrement, 
-                final int widthIncrement, final int heightIncrement
-                , final int xIncrement, final int yIncrement
-                , final Point endPoint
-                , final IFigure target)
-        {
-            Display.getCurrent().timerExec(timeIncrement, 
-            new Runnable()
-            {
-            public void run() 
-            {
-               if (remainingTime <= 0)
-               {
-                   if (target.getParent() != null)
-                   {
-                       target.getParent().remove(target);
-                   }
-                   _isAnimating = false;
-               }
-               else
-               {
-                   final Rectangle curBounds = target.getBounds().getCopy();
-                   curBounds.width += widthIncrement;
-                   curBounds.height += heightIncrement;
-                   curBounds.x += xIncrement;
-                   curBounds.y += yIncrement;
-                   target.setBounds(curBounds);
-                   target.revalidate();
-                   doAnimation(remainingTime-timeIncrement, timeIncrement, widthIncrement, heightIncrement, xIncrement, yIncrement, endPoint, target);
-               }
-            }
-            });
-         }
-    }
-}
-
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/MoveSupport.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/MoveSupport.java
deleted file mode 100644
index dc420cf..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/MoveSupport.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editpolicies;
-
-import java.util.List;
-
-import org.eclipse.gef.requests.ChangeBoundsRequest;
-import org.eclipse.jst.pagedesigner.parts.NodeEditPart;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class MoveSupport {
-	/**
-	 * Check whether the move operation only drags a single node.
-	 * 
-	 * @param request
-	 * @return true if the request affects a single node
-	 */
-	public static boolean isSingleNode(ChangeBoundsRequest request) {
-		List parts = request.getEditParts();
-		if (parts == null || parts.size() != 1
-				|| !(parts.get(0) instanceof NodeEditPart)) {
-			return false;
-		}
-        return true;
-	}
-
-	/**
-	 * this method must be called after isSingleNode
-	 * 
-	 * @param request
-	 * @return the dragged part
-	 */
-	public static NodeEditPart getDraggedPart(ChangeBoundsRequest request) {
-		List parts = request.getEditParts();
-		NodeEditPart part = (NodeEditPart) parts.get(0);
-		return part;
-	}
-
-	/**
-	 * this method must be called after isSingleNode
-	 * 
-	 * @param request
-	 * @return the dragged node
-	 */
-	public static Node getDraggedNode(ChangeBoundsRequest request) {
-		return getDraggedPart(request).getIDOMNode();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/NonVisualChildDecorator.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/NonVisualChildDecorator.java
deleted file mode 100644
index 2f9c1e6..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/NonVisualChildDecorator.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-/**
- * 
- */
-package org.eclipse.jst.pagedesigner.editpolicies;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.gef.DragTracker;
-import org.eclipse.gef.GraphicalEditPart;
-
-class NonVisualChildDecorator extends ElementDecoratorSquareHandle
-{
-   
-    NonVisualChildDecorator(final GraphicalEditPart hostPart, int location)
-    {
-        super(hostPart, new CornerRelativeHandleLocator(hostPart.getFigure(), location));
-    }
-
-    protected void init() {
-        setPreferredSize(new Dimension(8, 8));
-    }
-    
-    public void ancestorMoved(IFigure ancestor) {
-        // TODO: for some reason this causes an infinite loop
-        // when in the feedback layer...
-        //super.ancestorMoved(ancestor);
-    }
-
-    protected DragTracker createDragTracker() {
-        return null;
-    }
-    
-    protected int getAlpha()
-    {
-        return 255;
-    }
-
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/NonVisualChildGraphicalEditPolicy.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/NonVisualChildGraphicalEditPolicy.java
deleted file mode 100644
index 59678d2..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/NonVisualChildGraphicalEditPolicy.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editpolicies;
-
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.RectangleFigure;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.RequestConstants;
-import org.eclipse.gef.editpolicies.NonResizableEditPolicy;
-import org.eclipse.gef.requests.LocationRequest;
-import org.eclipse.jst.pagedesigner.parts.NodeEditPart;
-import org.eclipse.jst.pagedesigner.parts.NonVisualComponentEditPart;
-import org.eclipse.swt.graphics.Color;
-import org.w3c.dom.Element;
-
-/**
- * An edit policy for non visual child edit parts
- * @author cbateman
- *
- */
-public class NonVisualChildGraphicalEditPolicy extends NonResizableEditPolicy 
-{
-    // the number of pixels to offset the top left of tooltop feedback
-    // below the current mouse cursor location
-    private static final int TOOLTIP_VERTICAL_OFFSET = 25;
-    private final static Color HOVER_FEEDBACK_COLOR = ColorConstants.blue;
-    
-    
-    private BasicLabelToolTip   _toolTip;
-    private boolean             _showLabelFeedback;
-    private RectangleFigure _mouseOverBorder;
-
-    public void showTargetFeedback(Request request) {
-        if (RequestConstants.REQ_SELECTION_HOVER.equals(request.getType())) {
-            removeToolTipLabel();
-            removeMouseOverBorder();
-            Assert.isTrue(request instanceof LocationRequest);
-            // don't show tooltip if drag is active
-            _showLabelFeedback = !((NodeEditPart)getHost()).isDragActive();
-            showHoverFeedback((LocationRequest)request);
-        } else {
-            super.showTargetFeedback(request);
-        }
-
-    }
-
-    public void eraseTargetFeedback(Request request) {
-        removeToolTipLabel();
-        removeMouseOverBorder();
-    }
-
-    /**
-     * @param request
-     */
-    private void showHoverFeedback(LocationRequest request)
-    {
-        if (_showLabelFeedback)
-        {
-            addMouseOverBorder();
-            _toolTip = new BasicLabelToolTip(getTooltipText());
-            addFeedback(_toolTip);
-
-            // use mouse cursor plus an offset so the tooltip doesn't
-            // appear z-ordered below the mouse cursor
-            AbsolutePointLocator locator = AbsolutePointLocator.getInstance();
-            locator.setReferencePoint(request.getLocation(), 0, TOOLTIP_VERTICAL_OFFSET);
-            //  to avoid enlargemeent of the feedback layer
-            locator.setIntersectFigure(getFeedbackLayer());
-            locator.relocate(_toolTip);
-        }
-    }
-    
-    private String getTooltipText() {
-        Element element = (Element) ((NonVisualComponentEditPart)getHost()).getDOMNode();
-        StringBuffer text = new StringBuffer(element.getTagName());
-        return text.toString();
-    }
-    
-    private void addMouseOverBorder()
-    {
-        if (_mouseOverBorder == null)
-        {
-            _mouseOverBorder = new RectangleFigure();
-            _mouseOverBorder.setFill(false);
-            _mouseOverBorder.setOutline(true);
-            _mouseOverBorder.setLineWidth(1);
-            _mouseOverBorder.setForegroundColor(HOVER_FEEDBACK_COLOR);
-        }
-        
-        addFeedback(_mouseOverBorder);
-        
-        IFigure hostFigure = getHostFigure();
-        Rectangle r = hostFigure.getBounds().getCopy().expand(1, 1);
-        hostFigure.translateToAbsolute(r);
-        _mouseOverBorder.translateToRelative(r);
-
-        _mouseOverBorder.setBounds(r);
-    }
-    
-    /**
-     * 
-     */
-    private void removeMouseOverBorder()
-    {
-        if (_mouseOverBorder != null) {
-            removeFeedback(_mouseOverBorder);
-            _mouseOverBorder = null;
-        }
-    }
-    
-    protected List createSelectionHandles() {
-//        return super.createSelectionHandles();
-        return Collections.EMPTY_LIST;  
-    }
-
-    /**
-     * 
-     */
-    private void removeToolTipLabel()
-    {
-        if (_toolTip != null) {
-            removeFeedback(_toolTip);
-            _toolTip = null;
-        }
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/PDEditPolicy.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/PDEditPolicy.java
deleted file mode 100644
index 72e76d6..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/PDEditPolicy.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editpolicies;
-
-/**
- * @author mengbo
- */
-public interface PDEditPolicy {
-	/**
-	 * the edit policy for PD Drop
-	 */
-	String PDDROP_ROLE = "PDDropEditPolicy"; //$NON-NLS-1$
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/PolicyHelper.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/PolicyHelper.java
deleted file mode 100644
index 79b8f7f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/PolicyHelper.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editpolicies;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPartViewer;
-import org.eclipse.jface.action.IStatusLineManager;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-
-/**
- * @author mengbo
- */
-public class PolicyHelper {
-	private static Logger _log = PDPlugin.getLogger(PolicyHelper.class);
-
-	/**
-	 * @param part
-	 * @return the current viewer's status line manager or null
-	 */
-	public static IStatusLineManager getStatusLineManager(EditPart part) {
-		EditPartViewer v = part.getViewer();
-		if (v instanceof IHTMLGraphicalViewer) {
-			IHTMLGraphicalViewer htmlviewer = (IHTMLGraphicalViewer) v;
-			IStatusLineManager m = htmlviewer.getStatusLineManager();
-			if (m == null) {
-				_log.info("Warn.PolicyHelper.0", (String) null); //$NON-NLS-1$
-			}
-			return m;
-		}
-		_log.info("Warn.PolicyHelper.1", (String)null); //$NON-NLS-1$
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/AbstractElementEdit.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/AbstractElementEdit.java
deleted file mode 100644
index 5b87485..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/AbstractElementEdit.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.elementedit;
-
-import org.eclipse.gef.EditPartViewer;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.jsf.core.internal.tld.CMUtil;
-import org.eclipse.jst.jsf.core.internal.tld.TagIdentifierFactory;
-import org.eclipse.jst.pagedesigner.editors.palette.IDropSourceData;
-import org.eclipse.jst.pagedesigner.editors.palette.ITagDropSourceData;
-import org.eclipse.jst.pagedesigner.itemcreation.ITagCreator;
-import org.eclipse.jst.pagedesigner.itemcreation.customizer.AbstractDropCustomizer;
-import org.eclipse.jst.pagedesigner.itemcreation.customizer.IDropCustomizer;
-import org.eclipse.jst.pagedesigner.parts.ElementEditPart;
-import org.eclipse.jst.pagedesigner.parts.NodeEditPart;
-import org.eclipse.jst.pagedesigner.viewer.IDropLocationStrategy;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
-import org.w3c.dom.Element;
-
-/**
- * <p><b>Provisional API - subject to change</b></p>
- * @author mengbo
- * @version 1.5
- */
-// TODO: should this be abstract?
-public class AbstractElementEdit implements IElementEdit {
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.elementedit.IElementEdit#createEditPolicies(org.eclipse.jst.pagedesigner.parts.ElementEditPart)
-	 */
-	public void createEditPolicies(ElementEditPart part) {
-        // do nothing; sub-classes should override to add edit policies a part
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.elementedit.IElementEdit#handleModelChange(org.w3c.dom.Element,
-	 *      org.eclipse.jst.pagedesigner.parts.ElementEditPart)
-	 */
-	public boolean handleModelChange(Element ele, ElementEditPart part,
-			boolean recursive) {
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.elementedit.IElementEdit#fillContextMenu(org.eclipse.jface.action.IMenuManager,
-	 *      org.w3c.dom.Element)
-	 */
-	public void fillContextMenu(IMenuManager contextMenu, Element ele) {
-		// default do nothing, child class could override.
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.elementedit.IElementEdit#fillContainerContextMenu(org.eclipse.jface.action.IMenuManager,
-	 *      org.eclipse.jst.pagedesigner.parts.ElementEditPart,
-	 *      org.eclipse.jst.pagedesigner.parts.NodeEditPart,
-	 *      org.eclipse.jface.viewers.ISelection)
-	 */
-	public boolean fillContainerContextMenu(IMenuManager contextMenu,
-			ElementEditPart elePart, NodeEditPart nodePart,
-			ISelection innerSelection) {
-		return false;
-	}
-
-	/**
-	 * Child class should override this method if they have different way for
-	 * resizing. e.g. DataWindow use "width/height" attribute, not "style".
-	 * Also, the default ResizeCommand will adjust "style", so if child class
-	 * override this method, they should also use different command.
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.editpolicies.ElementResizableEditPolicy#getResizeCommand(org.eclipse.gef.requests.ChangeBoundsRequest)
-	 */
-	public boolean isResizable(Element ele) {
-		CMElementDeclaration decl = CMUtil.getElementDeclaration(ele);
-		if (decl != null) {
-			// XXX: default implementation, if this element support "style"
-			// attribute,
-			// then we think it support resize.
-			return decl.getAttributes().getNamedItem("style") != null; //$NON-NLS-1$
-		}
-		return true;
-	}
-
-    /** 
-     * By default, return null to signal caller should use its default strategy
-     */
-    public IDropLocationStrategy getDropRequestorLocationStrategy(TagIdentifier tag, EditPartViewer viewer) {
-        return null;
-    }
-
-    private final static IDropCustomizer   DEFAULT_DROP_CUSTOMIZER = 
-        new AbstractDropCustomizer(){/* do nothing; use defaults */};
-    
-    /** (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.elementedit.IElementEdit#getDropCustomizer(org.eclipse.jst.jsf.common.dom.TagIdentifier)
-     * @deprecated use getDropCustomizer(IDropSourceData) instead.
-     */
-    public IDropCustomizer getDropCustomizer(TagIdentifier tagId) 
-    {
-        return DEFAULT_DROP_CUSTOMIZER;
-    }
-
-    public IDropCustomizer getDropCustomizer(IDropSourceData dropSourceData)
-    {
-        if (dropSourceData instanceof ITagDropSourceData)
-        {
-            final String uri = ((ITagDropSourceData)dropSourceData).getNamespace();
-            final String tagName = ((ITagDropSourceData)dropSourceData).getTagName();
-            final TagIdentifier tagId = TagIdentifierFactory.createJSPTagWrapper(uri, tagName);
-            return getDropCustomizer(tagId);
-        }
-        return DEFAULT_DROP_CUSTOMIZER;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.elementedit.IElementEdit#getTagCreator(org.eclipse.jst.jsf.common.dom.TagIdentifier)
-     */
-    public ITagCreator getTagCreator(TagIdentifier tagId) 
-    {
-        return null;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/AbstractElementEditFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/AbstractElementEditFactory.java
deleted file mode 100644
index b7e42a5..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/AbstractElementEditFactory.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.elementedit;
-
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-
-/**
- * @author cbateman
- *
- */
-public abstract class AbstractElementEditFactory implements IElementEditFactory 
-{
-    private String _supportedUri;
-    
-    /**
-     * @param uri
-     */
-    protected AbstractElementEditFactory(final String uri)
-    {
-        _supportedUri = uri;
-    }
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.elementedit.IElementEditFactory#createElementEdit(org.eclipse.jst.jsf.common.dom.TagIdentifier)
-     */
-    public abstract IElementEdit createElementEdit(TagIdentifier tag); 
-
-    public String getSupportedURI() 
-    {
-        return _supportedUri;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/ElementEditFacRegistryReader.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/ElementEditFacRegistryReader.java
deleted file mode 100644
index d4162ba..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/ElementEditFacRegistryReader.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.elementedit;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtension;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jst.pagedesigner.IJMTConstants;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.PageDesignerTraceOptions;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ElementEditFacRegistryReader {
-	private static List<IElementEditFactory> _handlers = null;
-
-	/**
-	 * @return all available handers for the ext-pt.  List is not
-	 * modifiable
-	 */
-	public static synchronized List<IElementEditFactory> getAllHandlers() {
-		if (_handlers == null) {
-			_handlers = readAllHandlers();
-		}
-		return Collections.unmodifiableList(_handlers);
-	}
-
-	private static List<IElementEditFactory> readAllHandlers()
-    {
-        List<IElementEditFactory> result = new ArrayList<IElementEditFactory>();
-        IExtensionPoint extensionPoint = Platform.getExtensionRegistry()
-                .getExtensionPoint(PDPlugin.getPluginId(),
-                        IJMTConstants.EXTENSION_POINT_PAGEDESIGNER);
-        IExtension[] extensions = extensionPoint.getExtensions();
-
-        for (int i = 0; i < extensions.length; i++)
-        {
-            IExtension ext = extensions[i];
-            IConfigurationElement[] elementEditElement = ext
-                    .getConfigurationElements();
-
-            for (int j = 0; j < elementEditElement.length; j++)
-            {
-                final IConfigurationElement element = elementEditElement[j];
-                if (element.getName().equals(
-                        IJMTConstants.ELEMENT_EDIT_FACTORY))
-                {
-                    elementEditElement[j].getAttribute("class"); //$NON-NLS-1$
-                    Object obj;
-                    try
-                    {
-                        obj = elementEditElement[j]
-                                .createExecutableExtension("class"); //$NON-NLS-1$
-
-                        // TODO: we need a policy based solution here,
-                        // but this will do for now
-                        if (obj instanceof IElementEditFactory)
-                        {
-                            if (element.getContributor().getName().startsWith("org.eclipse.jst")) //$NON-NLS-1$
-                            {
-                                if (PageDesignerTraceOptions.TRACE_ELEMENTEDITLOAD)
-                                {
-                                    PageDesignerTraceOptions.log("ElementEditFacRegistryReader: Appending to list:"+obj.getClass().getName()); //$NON-NLS-1$
-                                }
-                                // push JSF tools provided ones to the end
-                                result.add((IElementEditFactory) obj);
-                            }
-                            // prepend if something outside JSF tools declared it
-                            else
-                            {
-                                if (PageDesignerTraceOptions.TRACE_ELEMENTEDITLOAD)
-                                {
-                                    PageDesignerTraceOptions.log("ElementEditFacRegistryReader: Prepending to list:"+obj.getClass().getName()); //$NON-NLS-1$
-                                }
-                                // this way, adopters can put their overrides
-                                // of factories with built-in support like
-                                // JSF HTML/CORE will be used first
-                                result.add(0, (IElementEditFactory) obj);
-                            }
-                        }
-                    } catch (CoreException e)
-                    {
-                        PDPlugin.log("Problem loading element edit extension for "+element.toString(), e); //$NON-NLS-1$
-                    }
-                }
-            }
-        }
-        
-
-        if (PageDesignerTraceOptions.TRACE_ELEMENTEDITLOAD)
-        {
-            PageDesignerTraceOptions.log("\nFinal elementEditFactory list in order:"); //$NON-NLS-1$
-            for (final IElementEditFactory factory : result)
-            {
-                PageDesignerTraceOptions.log(factory.getClass().getName());
-            }
-            PageDesignerTraceOptions.log("\n"); //$NON-NLS-1$
-        }
-
-        return result;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/ElementEditFactoryRegistry.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/ElementEditFactoryRegistry.java
deleted file mode 100644
index 0b8f513..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/ElementEditFactoryRegistry.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.elementedit;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.jsf.core.internal.tld.TagIdentifierFactory;
-import org.eclipse.jst.pagedesigner.PageDesignerTraceOptions;
-import org.eclipse.jst.pagedesigner.elementedit.html.HTMLElementEditFactory;
-import org.eclipse.jst.pagedesigner.elementedit.jsp.JSPElementEditFactory;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ElementEditFactoryRegistry
-{
-    List _factories = new ArrayList();
-
-    private static ElementEditFactoryRegistry _instance;
-
-    /**
-	 *
-	 */
-    private ElementEditFactoryRegistry()
-    {
-        final List<IElementEditFactory> facs = ElementEditFacRegistryReader
-                .getAllHandlers();
-
-        if (facs != null)
-        {
-            for (final IElementEditFactory fac : facs)
-            {
-                addFactory(fac);
-            }
-        }
-        addFactory(new HTMLElementEditFactory());
-        addFactory(new JSPElementEditFactory());
-    }
-
-    /**
-     * Add a factory to list available.
-     *
-     * @param fac
-     */
-    public void addFactory(final IElementEditFactory fac)
-    {
-        _factories.add(fac);
-    }
-
-    /**
-     * @param tagIdentifier
-     * @return an IElementEdit constructed for the tag uniquely identified by
-     *         the ns uri (tag uri for JSP tags) and tagName (element name) or
-     *         null if the system can't create one.
-     */
-    public IElementEdit createElementEdit(final TagIdentifier tagIdentifier)
-    {
-        final String uri = tagIdentifier.getUri();
-
-        // first round, match uri
-        for (int i = 0, size = _factories.size(); i < size; i++)
-        {
-            final IElementEditFactory fac = (IElementEditFactory) _factories.get(i);
-            final String facuri = fac.getSupportedURI();
-            if (facuri != null && facuri.equalsIgnoreCase(uri))
-            {
-                final IElementEdit elementEdit = fac.createElementEdit(tagIdentifier);
-                if (elementEdit != null)
-                {
-                    if (PageDesignerTraceOptions.TRACE_ELEMENTEDITSELECTION)
-                    {
-                        PageDesignerTraceOptions.log("ElementEditFactoryRegistry: first loop, "+ //$NON-NLS-1$
-                                String.format("Selected %s for uri=%s, tagname=%s", elementEdit.getClass().getName(),uri, tagIdentifier.getTagName())); //$NON-NLS-1$
-                    }
-                    return elementEdit;
-                }
-            }
-        }
-        // second round
-        for (int i = 0, size = _factories.size(); i < size; i++)
-        {
-            final IElementEditFactory fac = (IElementEditFactory) _factories.get(i);
-            final String facuri = fac.getSupportedURI();
-            if (facuri == null)
-            {
-                final IElementEdit elementEdit = fac.createElementEdit(tagIdentifier);
-                if (elementEdit != null)
-                {
-                    if (PageDesignerTraceOptions.TRACE_ELEMENTEDITSELECTION)
-                    {
-                        PageDesignerTraceOptions.log("ElementEditFactoryRegistry: second loop, "+ //$NON-NLS-1$
-                                String.format("Selected %s for uri=%s, tagname=%s", elementEdit.getClass().getName(),uri, tagIdentifier.getTagName())); //$NON-NLS-1$
-                    }
-                    return elementEdit;
-                }
-            }
-        }
-
-        if (PageDesignerTraceOptions.TRACE_ELEMENTEDITSELECTION)
-        {
-            PageDesignerTraceOptions.log("ElementEditFactoryRegistry: no element edit found, returning null for "+ //$NON-NLS-1$
-                    String.format("uri=%s, name=%s", tagIdentifier.getUri(), tagIdentifier.getTagName())); //$NON-NLS-1$
-        }
-
-        return null;
-    }
-
-    /**
-     * Convenience method for createElementEdit(uri, tagName) that takes a tag
-     * element.
-     *
-     * @param ele
-     * @return an element edit
-     */
-    public IElementEdit createElementEdit(final Element ele)
-    {
-        final TagIdentifier tagIdentifier = TagIdentifierFactory
-                .createDocumentTagWrapper(ele);
-        return createElementEdit(tagIdentifier);
-    }
-
-    /**
-     * @return the single instance of the factory registry
-     */
-    public synchronized static ElementEditFactoryRegistry getInstance()
-    {
-        if (_instance == null)
-        {
-            _instance = new ElementEditFactoryRegistry();
-        }
-        return _instance;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/IElementEdit.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/IElementEdit.java
deleted file mode 100644
index 7a8e12f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/IElementEdit.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.elementedit;
-
-import org.eclipse.gef.EditPartViewer;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.pagedesigner.editors.palette.IDropSourceData;
-import org.eclipse.jst.pagedesigner.itemcreation.ITagCreator;
-import org.eclipse.jst.pagedesigner.itemcreation.customizer.IDropCustomizer;
-import org.eclipse.jst.pagedesigner.parts.ElementEditPart;
-import org.eclipse.jst.pagedesigner.parts.NodeEditPart;
-import org.eclipse.jst.pagedesigner.viewer.IDropLocationStrategy;
-import org.w3c.dom.Element;
-
-/**
- * IElementEdit support additional edit support to an element.
- *
- * This interface should not be extended by clients.  Extend AbstractElementEdit
- * instead.
- *
- * <p><b>Provisional API - subject to change</b></p>
- *
- * @author mengbo
- * @version 1.5
- */
-public interface IElementEdit
-{
-	/**
-	 * override default edit policies on part
-	 * @param part
-	 */
-	public void createEditPolicies(ElementEditPart part);
-
-	/**
-	 * The element (or its decendent) changed.
-	 *
-	 * @param ele
-	 * @param part
-	 * @param recursive
-	 * @return handle model changes on part.
-	 */
-	public boolean handleModelChange(Element ele, ElementEditPart part,
-			boolean recursive);
-
-	/**
-	 * Add special menu items for the particular element to the context menu.
-	 *
-	 * @param contextMenu
-	 * @param ele
-	 */
-	public void fillContextMenu(IMenuManager contextMenu, Element ele);
-
-	/**
-	 * This method is called when current selection is inside "ele". And this
-	 * method should fill in menu items relating to the "ele" context and the
-	 * current "innerSelection". For example, this "ele" could be a table,
-	 * "innerSelection" could be something inside a cell. Then could fill in
-	 * actions relating to the table and the cell, such as "add row before",
-	 * "delete current column", etc.
-	 *
-	 * @param contextMenu
-	 * @param elePart
-	 *            the elementeditpart corresponding to this ElementEdit
-	 * @param nodePart
-	 *            the smallest part covers the current selection. nodePart will
-	 *            always be a decedent of the elePart.
-	 * @param innerSelection
-	 *            the selection
-	 * @return true if added actions.
-	 */
-	public boolean fillContainerContextMenu(IMenuManager contextMenu,
-			ElementEditPart elePart, NodeEditPart nodePart,
-			ISelection innerSelection);
-
-	/**
-	 * whether the corresponding element support resize. If it does, then the
-	 * corresponding policy installed through <code>createEditPolicies</code>
-	 * should handle resize.
-	 * @param ele
-	 *
-	 * @return true if ele has resize support
-	 */
-	public boolean isResizable(Element ele);
-
-    /**
-     * @param tag the element to return a drop location strategy for.
-     * This is the requesting element (being dropped), not the drop target
-     *
-     * @param viewer is the viewer where the new strategy will optionally
-     * add feedback
-     *
-     * @return the strategy to be used to use to find a drop location when
-     * the corresponding element is being dropped (the source part).  May
-     * be null signalling that the caller should use its default strategy.
-     *
-     */
-     public IDropLocationStrategy getDropRequestorLocationStrategy(TagIdentifier tag, EditPartViewer viewer);
-
-    /**
-     * @param tagId
-     * @return the drop customizer for this edit's element.  May return null.
-     * Returning null and returning a IDropCustomizer whose runCustomizer always returns
-     * OK and getDropCustomizationData always returns null will be considered
-     * equivalent by the framework.
-     * @deprecated use getDropCustomizer(IDropSourceData) instead
-     */
-    public IDropCustomizer getDropCustomizer(TagIdentifier tagId);
-
-    /**
-     * @param dropSourceData
-     * @return the drop customizer for the drop source data or null if none.
-     */
-    public IDropCustomizer getDropCustomizer(final IDropSourceData dropSourceData);
-
-    /**
-     * @param tagId
-     * @return a tag creator for the indicated tag or null to indicate that the
-     * system should use it's default tag creator
-     */
-    public ITagCreator getTagCreator(TagIdentifier tagId);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/IElementEditFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/IElementEditFactory.java
deleted file mode 100644
index 052275a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/IElementEditFactory.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.elementedit;
-
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-
-
-/**
- * @author mengbo
- * @version 1.5
- * 
- * Clients should not implement this interface.  Extend AbstractElementEditFactory instead.
- */
-public interface IElementEditFactory {
-	/**
-	 * 
-	 * @param tag
-	 * @return null if this factory don't support this element
-	 */
-	public IElementEdit createElementEdit(TagIdentifier tag);
-
-	/**
-	 * get the URI namespace that this factory support. "null" means this
-	 * factory can be used as default factory.
-	 * 
-	 * @return null if this factory don't have a specific URI to support.
-	 */
-	public String getSupportedURI();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/html/HTMLElementEditFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/html/HTMLElementEditFactory.java
deleted file mode 100644
index 2ddff0c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/html/HTMLElementEditFactory.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.elementedit.html;
-
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.jsf.core.internal.tld.TagIdentifierFactory;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.elementedit.IElementEdit;
-import org.eclipse.jst.pagedesigner.elementedit.IElementEditFactory;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class HTMLElementEditFactory implements IElementEditFactory 
-{
-    final static TagIdentifier HTMLHEAD_TAG_IDENTIFIER =
-        TagIdentifierFactory.createJSPTagWrapper(ITLDConstants.URI_HTML, IHTMLConstants.TAG_HEAD);
-    final static TagIdentifier HTMLTABLE_TAG_IDENTIFIER =
-        TagIdentifierFactory.createJSPTagWrapper(ITLDConstants.URI_HTML, IHTMLConstants.TAG_TABLE);
-    
-    /*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.elementedit.IElementEditFactory#createElementEdit(org.w3c.dom.Element)
-	 */
-	public IElementEdit createElementEdit(TagIdentifier tagIdentifier) {
-		if (HTMLTABLE_TAG_IDENTIFIER.isSameTagType(tagIdentifier)) {
-			return new TableElementEdit();
-		} else if (HTMLHEAD_TAG_IDENTIFIER.isSameTagType(tagIdentifier)) {
-			return new HeadElementEdit();
-		} else if (tagIdentifier != null) {
-			// No need to check the URI, it was checked to get this factory.
-			// Just check the tag name, ignoring case in the HTML tag names.
-			// The HTML tag meta data uses upper case and the programming
-			// constants are in lower case.
-			if (IHTMLConstants.TAG_LINK.equalsIgnoreCase(tagIdentifier.getTagName())) {
-				return new StylesheetLinkElementEdit();
-			}
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.elementedit.IElementEditFactory#getSupportedURI()
-	 */
-	public String getSupportedURI() {
-		return ITLDConstants.URI_HTML;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/html/HeadElementEdit.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/html/HeadElementEdit.java
deleted file mode 100644
index 4840bbb..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/html/HeadElementEdit.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle Corporation - initial API and implementation and/or initial documentation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.elementedit.html;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IContributionItem;
-import org.eclipse.jface.action.IMenuListener;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jst.pagedesigner.editors.PageDesignerActionConstants;
-import org.eclipse.jst.pagedesigner.editpolicies.HeadItemCreationEditPolicy;
-import org.eclipse.jst.pagedesigner.elementedit.AbstractElementEdit;
-import org.eclipse.jst.pagedesigner.itemcreation.ItemCreationRequest;
-import org.eclipse.jst.pagedesigner.parts.ElementEditPart;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.w3c.dom.Element;
-
-/**
- * Simple ElementEdit implementation to support context menu insert
- * actions and drag and drop of tags into the HTML head tag.
- */
-public class HeadElementEdit extends AbstractElementEdit
-{
-	private static final Action EMPTY_ACTION = new Action() {
-        // create a default instance that does nothing.
-        // Action is abstract but has no abstract methods
-        // run() on this object is a NOOP
-	};
-
-	/* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.elementedit.AbstractElementEdit#fillContextMenu(org.eclipse.jface.action.IMenuManager, org.w3c.dom.Element)
-     */
-	@Override
-    public void fillContextMenu(IMenuManager contextMenu, Element ele) {
-		super.fillContextMenu(contextMenu, ele);
-
-		final IDOMElement element = (IDOMElement) ele;
-		IContributionItem item = contextMenu.find(PageDesignerActionConstants.INSERT_SUBMENU_ID);
-		if (item instanceof IMenuManager) {
-			final IMenuManager submenu = (IMenuManager) item;
-    		submenu.add(EMPTY_ACTION);
-    		submenu.addMenuListener(new IMenuListener() {
-    			public void menuAboutToShow(IMenuManager manager) {
-    				submenu.removeAll();
-    				addHeadAddItems(submenu, element);
-    			}
-    		});
-		}
-    }
-
-    private void addHeadAddItems(IMenuManager submenu, IDOMElement element) {
-		submenu.add(new InsertStylesheetLinkAction(element));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.elementedit.IElementEdit#createEditPolicies(org.eclipse.jst.pagedesigner.parts.ElementEditPart)
-	 */
-	@Override
-	public void createEditPolicies(ElementEditPart part) {
-		part.installEditPolicy(ItemCreationRequest.REQ_ITEM_CREATION,
-				new HeadItemCreationEditPolicy(part));
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/html/InsertStylesheetLinkAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/html/InsertStylesheetLinkAction.java
deleted file mode 100644
index a2c9326..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/html/InsertStylesheetLinkAction.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle Corporation - initial API and implementation and/or initial documentation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.elementedit.html;
-
-import java.util.LinkedHashMap;
-import java.util.Map;
-
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.commands.single.AddSubNodeCommand;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- */
-public class InsertStylesheetLinkAction extends Action
-{
-	private IDOMElement _parentElement;
-
-	/**
-	 * @param parentElement 
-	 */
-	public InsertStylesheetLinkAction(IDOMElement parentElement) {
-		setText(PDPlugin.getResourceString("HeadElementEdit.Submenu.InsertStylesheetLink"));//$NON-NLS-1$
-		_parentElement = parentElement;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.action.IAction#run()
-	 */
-	public void run() {
-		// TODO: figure out how to get the default attributes from
-		// the tag create metadata. Get a tag creation provider?
-		Map attributes = new LinkedHashMap();
-		attributes.put("href", "");  //$NON-NLS-1$//$NON-NLS-2$
-		attributes.put("rel", "Stylesheet");  //$NON-NLS-1$//$NON-NLS-2$
-		attributes.put("type", "text/css");  //$NON-NLS-1$//$NON-NLS-2$
-		Command command = new AddSubNodeCommand(
-				PDPlugin.getResourceString("ItemCreationEditPolicy.CommandLabel.CreateItem"),//$NON-NLS-1$
-				_parentElement, IHTMLConstants.TAG_LINK, ITLDConstants.URI_HTML,
-				attributes);
-		command.execute();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/html/StylesheetLinkElementEdit.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/html/StylesheetLinkElementEdit.java
deleted file mode 100644
index d3e4ea5..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/html/StylesheetLinkElementEdit.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle Corporation - initial API and implementation and/or initial documentation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.elementedit.html;
-
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPartViewer;
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.elementedit.AbstractElementEdit;
-import org.eclipse.jst.pagedesigner.validation.caret.IPositionMediator;
-import org.eclipse.jst.pagedesigner.viewer.DefaultDropLocationStrategy;
-import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
-import org.eclipse.jst.pagedesigner.viewer.IDropLocationStrategy;
-import org.w3c.dom.Node;
-
-/**
- * Simple ElementEdit implementation to support drag and drop
- * of style sheet link tags into the HTML head tag.
- */
-public class StylesheetLinkElementEdit extends AbstractElementEdit
-{
-    public IDropLocationStrategy getDropRequestorLocationStrategy(TagIdentifier tag, EditPartViewer viewer) {
-        return new MyDropLocationStrategy(viewer);
-    }
-
-    private static class MyDropLocationStrategy extends DefaultDropLocationStrategy
-    {
-        /**
-         * @param viewer
-         */
-        public MyDropLocationStrategy(EditPartViewer viewer) {
-            super(viewer);
-        }
-
-        public DesignPosition calculateDesignPosition(EditPart host,
-                Point p, IPositionMediator validator) {
-        	Node node = (Node) host.getModel();
-        	if (host != null && IHTMLConstants.TAG_HEAD.equalsIgnoreCase(node.getLocalName())) {
-        		return new DesignPosition(host, 0);
-        	}
-        	return super.calculateDesignPosition(host, p, validator);
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/html/TableElementEdit.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/html/TableElementEdit.java
deleted file mode 100644
index a2d605c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/html/TableElementEdit.java
+++ /dev/null
@@ -1,278 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.elementedit.html;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPolicy;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IMenuListener;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.actions.single.SelectEditPartAction;
-import org.eclipse.jst.pagedesigner.commands.html.TableDeleteColumnCommand;
-import org.eclipse.jst.pagedesigner.commands.html.TableDeleteHeaderFooterCommand;
-import org.eclipse.jst.pagedesigner.commands.html.TableDeleteRowCommand;
-import org.eclipse.jst.pagedesigner.commands.html.TableInsertColumnCommand;
-import org.eclipse.jst.pagedesigner.commands.html.TableInsertHeaderFooterCommand;
-import org.eclipse.jst.pagedesigner.commands.html.TableInsertRowCommand;
-import org.eclipse.jst.pagedesigner.commands.html.TableResizeColumnCommand;
-import org.eclipse.jst.pagedesigner.commands.html.TableResizeRowCommand;
-import org.eclipse.jst.pagedesigner.dom.html.TableChildElementPosition;
-import org.eclipse.jst.pagedesigner.dom.html.TableUtil;
-import org.eclipse.jst.pagedesigner.editors.PageDesignerActionConstants;
-import org.eclipse.jst.pagedesigner.elementedit.AbstractElementEdit;
-import org.eclipse.jst.pagedesigner.parts.ElementEditPart;
-import org.eclipse.jst.pagedesigner.parts.NodeEditPart;
-import org.eclipse.jst.pagedesigner.tableedit.DeleteHeaderFooterAction;
-import org.eclipse.jst.pagedesigner.tableedit.DeleteHeaderFooterRequest;
-import org.eclipse.jst.pagedesigner.tableedit.DeleteRowColumnAction;
-import org.eclipse.jst.pagedesigner.tableedit.InsertHeaderFooterAction;
-import org.eclipse.jst.pagedesigner.tableedit.InsertHeaderFooterRequest;
-import org.eclipse.jst.pagedesigner.tableedit.InsertRowColumnAction;
-import org.eclipse.jst.pagedesigner.tableedit.TableInsertRequest;
-import org.eclipse.jst.pagedesigner.tableedit.TableResizableEditPolicy;
-import org.eclipse.jst.pagedesigner.tableedit.TableResizeRequest;
-import org.eclipse.jst.pagedesigner.tableedit.TableRowColumnDeleteRequest;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TableElementEdit extends AbstractElementEdit {
-
-	private final static Action action = new Action() {
-        // TODO: what's this for?
-	};
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.elementedit.IElementEdit#fillContextMenu(org.eclipse.jface.action.IMenuManager,
-	 *      org.w3c.dom.Element)
-	 */
-	public void fillContextMenu(IMenuManager contextMenu, Element ele) {
-
-		final ElementEditPart tablePart =
-			(ElementEditPart) ((IDOMElement) ele).getAdapterFor(EditPart.class);
-
-		final Element table = (Element) tablePart.getModel();
-
-		final TableChildElementPosition position = new TableUtil(table).getPosition((Node)null);
-		final int cellRow = position.getRowIndex();
-		final int cellColumn = position.getColumnIndex();
-
-		final IMenuManager tableMenu =
-			new MenuManager(PDPlugin.getResourceString("ElementEdit.Submenu.Table")); //$NON-NLS-1$
-		tableMenu.add(action);
-		tableMenu.addMenuListener(new IMenuListener() {
-			public void menuAboutToShow(IMenuManager manager) {
-				tableMenu.removeAll();
-				fillTableMenu(tablePart, cellRow, cellColumn, tableMenu);
-			}
-		});
-
-		contextMenu.appendToGroup(PageDesignerActionConstants.GROUP_CONTAINER, tableMenu);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.elementedit.AbstractElementEdit#fillContainerContextMenu(org.eclipse.jface.action.IMenuManager,
-	 *      org.eclipse.jst.pagedesigner.parts.ElementEditPart,
-	 *      org.eclipse.jst.pagedesigner.parts.NodeEditPart,
-	 *      org.eclipse.jface.viewers.ISelection)
-	 */
-	public boolean fillContainerContextMenu(
-			IMenuManager contextMenu,
-			final ElementEditPart tablePart,
-			NodeEditPart nodePart,
-			ISelection innerSelection) {
-
-		super.fillContainerContextMenu(contextMenu, tablePart, nodePart, innerSelection);
-
-		final Element table = (Element) tablePart.getModel();
-		final Node node = (Node) nodePart.getModel();
-
-		final TableChildElementPosition position = new TableUtil(table).getPosition(node);
-		final int cellRow = position.getRowIndex();
-		final int cellColumn = position.getColumnIndex();
-
-		final IMenuManager tableMenu =
-			new MenuManager(PDPlugin.getResourceString("ElementEdit.Submenu.Table")); //$NON-NLS-1$
-		tableMenu.add(action);
-		tableMenu.addMenuListener(new IMenuListener() {
-			public void menuAboutToShow(IMenuManager manager) {
-				tableMenu.removeAll();
-				fillTableMenu(tablePart, cellRow, cellColumn, tableMenu);
-			}
-		});
-
-		contextMenu.appendToGroup(PageDesignerActionConstants.GROUP_CONTAINER, tableMenu);
-		return true;
-	}
-
-	/**
-	 * @param tablePart
-	 * @param cellRow
-	 * @param cellColumn
-	 * @param tableMenu
-	 */
-	private void fillTableMenu(ElementEditPart tablePart, int cellRow,
-			int cellColumn, IMenuManager tableMenu) {
-		SelectEditPartAction action1 = SelectEditPartAction.create(
-				PDPlugin.getResourceString("ElementEdit.Submenu.SelectTable"), tablePart);//$NON-NLS-1$
-		tableMenu.add(action1);
-
-		tableMenu.add(new Separator());
-
-		{
-			InsertRowColumnAction insertRowBeforeAction = new InsertRowColumnAction(
-					PDPlugin
-							.getResourceString("ElementEdit.Submenu.InsertRowBefore"),//$NON-NLS-1$
-					tablePart, cellRow, true, true);
-			tableMenu.add(insertRowBeforeAction);
-
-			InsertRowColumnAction insertRowAfterAction = new InsertRowColumnAction(
-					PDPlugin
-							.getResourceString("ElementEdit.Submenu.InsertRowAfter"),//$NON-NLS-1$
-					tablePart, cellRow, true, false);
-			tableMenu.add(insertRowAfterAction);
-
-			tableMenu.add(new Separator());
-		}
-
-		{
-			InsertRowColumnAction insertColumnBeforeAction = new InsertRowColumnAction(
-					PDPlugin
-							.getResourceString("ElementEdit.Submenu.InsertColumnBefore"),//$NON-NLS-1$
-					tablePart, cellColumn, false, true);
-			tableMenu.add(insertColumnBeforeAction);
-
-			InsertRowColumnAction insertColumnAfterAction = new InsertRowColumnAction(
-					PDPlugin
-							.getResourceString("ElementEdit.Submenu.InsertColumnAfter"),//$NON-NLS-1$
-					tablePart, cellColumn, false, false);
-			tableMenu.add(insertColumnAfterAction);
-
-			tableMenu.add(new Separator());
-		}
-
-		{
-			DeleteRowColumnAction deleteRowAction = new DeleteRowColumnAction(
-					PDPlugin.getResourceString("ElementEdit.Submenu.DeleteRow"),//$NON-NLS-1$
-					tablePart, cellRow, true);
-			tableMenu.add(deleteRowAction);
-
-			DeleteRowColumnAction deleteColumnAction = new DeleteRowColumnAction(
-					PDPlugin
-							.getResourceString("ElementEdit.Submenu.DeleteColumn"),//$NON-NLS-1$
-					tablePart, cellColumn, false);
-			tableMenu.add(deleteColumnAction);
-			tableMenu.add(new Separator());
-		}
-
-		{
-			InsertHeaderFooterAction headerAction = new InsertHeaderFooterAction(
-					PDPlugin
-							.getResourceString("ElementEdit.Submenu.InsertHeader"), tablePart, true);//$NON-NLS-1$
-			tableMenu.add(headerAction);
-			InsertHeaderFooterAction footerAction = new InsertHeaderFooterAction(
-					PDPlugin
-							.getResourceString("ElementEdit.Submenu.InsertFooter"), tablePart, false);//$NON-NLS-1$
-			tableMenu.add(footerAction);
-			DeleteHeaderFooterAction delHeaderAction = new DeleteHeaderFooterAction(
-					PDPlugin
-							.getResourceString("ElementEdit.Submenu.DeleteHeader"), tablePart, true);//$NON-NLS-1$
-			tableMenu.add(delHeaderAction);
-			DeleteHeaderFooterAction delFooterAction = new DeleteHeaderFooterAction(
-					PDPlugin
-							.getResourceString("ElementEdit.Submenu.DeleteFooter"), tablePart, false);//$NON-NLS-1$
-			tableMenu.add(delFooterAction);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.elementedit.IElementEdit#createEditPolicies(org.eclipse.jst.pagedesigner.parts.ElementEditPart)
-	 */
-	public void createEditPolicies(ElementEditPart part) {
-		part.installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE,
-				new TableResizePolicy(part));
-	}
-
-	static class TableResizePolicy extends TableResizableEditPolicy {
-		ElementEditPart _part;
-
-		/**
-		 * @param part
-		 */
-		public TableResizePolicy(ElementEditPart part) {
-			_part = part;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.gef.editpolicies.ResizableEditPolicy#getCommand(org.eclipse.gef.Request)
-		 */
-		public Command getCommand(Request request) {
-			IHTMLGraphicalViewer viewer = (IHTMLGraphicalViewer) _part
-					.getViewer();
-			Element table = (Element) _part.getIDOMNode();
-			if (request instanceof TableResizeRequest) {
-				TableResizeRequest trq = (TableResizeRequest) request;
-				if (trq.isRow()) {
-					return new TableResizeRowCommand(viewer, table, trq
-							.getIndex(), trq.getDelta());
-				}
-                return new TableResizeColumnCommand(viewer, table, trq
-                		.getIndex(), trq.getDelta());
-			} else if (request instanceof TableInsertRequest) {
-				TableInsertRequest tableInsertRequest = (TableInsertRequest) request;
-				int index = tableInsertRequest.getIndex()
-						+ (tableInsertRequest.isBefore() ? 0 : 1);
-				if (tableInsertRequest.isRow()) {
-					return new TableInsertRowCommand(viewer, table, index,
-							tableInsertRequest.isBefore());
-				}
-                return new TableInsertColumnCommand(viewer, table, index);
-			} else if (request instanceof TableRowColumnDeleteRequest) {
-				TableRowColumnDeleteRequest deleteReq = (TableRowColumnDeleteRequest) request;
-				if (deleteReq.isRow()) {
-					return new TableDeleteRowCommand(viewer, table, deleteReq
-							.getIndex());
-				}
-                return new TableDeleteColumnCommand(viewer, table,
-                		deleteReq.getIndex());
-			} else if (request instanceof InsertHeaderFooterRequest) {
-				InsertHeaderFooterRequest hfRequest = (InsertHeaderFooterRequest) request;
-				return new TableInsertHeaderFooterCommand(viewer, table,
-						hfRequest.isHeader());
-			} else if (request instanceof DeleteHeaderFooterRequest) {
-				DeleteHeaderFooterRequest hfRequest = (DeleteHeaderFooterRequest) request;
-				return new TableDeleteHeaderFooterCommand(viewer, table,
-						hfRequest.isHeader());
-			}
-			return super.getCommand(request);
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/jsp/JSPElementEditFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/jsp/JSPElementEditFactory.java
deleted file mode 100644
index 9dc4f9e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/jsp/JSPElementEditFactory.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.elementedit.jsp;
-
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.jsf.core.internal.tld.TagIdentifierFactory;
-import org.eclipse.jst.pagedesigner.elementedit.IElementEdit;
-import org.eclipse.jst.pagedesigner.elementedit.IElementEditFactory;
-import org.eclipse.jst.pagedesigner.jsp.core.IJSPCoreConstants;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class JSPElementEditFactory implements IElementEditFactory 
-{
-    final static TagIdentifier TAG_DIRECTIVE_TAGLIB_TAG_IDENTIFIER =
-        TagIdentifierFactory.createJSPTagWrapper(ITLDConstants.URI_JSP, IJSPCoreConstants.TAG_DIRECTIVE_TAGLIB);
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.elementedit.IElementEditFactory#createElementEdit(org.w3c.dom.Element)
-	 */
-	public IElementEdit createElementEdit(TagIdentifier tagIdentifier) {
-		if (TAG_DIRECTIVE_TAGLIB_TAG_IDENTIFIER.isSameTagType(tagIdentifier)) {
-			return new TaglibElementEdit();
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.elementedit.IElementEditFactory#getSupportedURI()
-	 */
-	public String getSupportedURI() {
-		return ITLDConstants.URI_JSP;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/jsp/TaglibElementEdit.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/jsp/TaglibElementEdit.java
deleted file mode 100644
index 9c82880..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/jsp/TaglibElementEdit.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.elementedit.jsp;
-
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.editors.PageDesignerActionConstants;
-import org.eclipse.jst.pagedesigner.elementedit.AbstractElementEdit;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TaglibElementEdit extends AbstractElementEdit {
-	private TaglibURIAction action;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.elementedit.IElementEdit#fillContextMenu(org.eclipse.jface.action.IMenuManager,
-	 *      org.w3c.dom.Element)
-	 */
-	public void fillContextMenu(IMenuManager contextMenu, Element ele) {
-		super.fillContextMenu(contextMenu, ele);
-
-		TaglibURIAction action1 = getAction();
-
-		action1.setURI(ele.getAttribute(ICSSPropertyID.ATTR_URI));
-
-		action1.setElement(ele);
-
-        contextMenu.appendToGroup(PageDesignerActionConstants.GROUP_SPECIAL,
-				action1);
-	}
-
-	private TaglibURIAction getAction() {
-		if (action == null) {
-			action = new TaglibURIAction();
-		}
-		return action;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/jsp/TaglibURIAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/jsp/TaglibURIAction.java
deleted file mode 100644
index eefc1b3..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/jsp/TaglibURIAction.java
+++ /dev/null
@@ -1,148 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.elementedit.jsp;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.ide.IDE;
-import org.eclipse.wst.sse.core.internal.util.URIResolver;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TaglibURIAction extends Action {
-	private String URI;
-
-	private Element element;
-
-	/**
-	 * Default constructor
-	 */
-	public TaglibURIAction() {
-		setText(PDPlugin.getResourceString("ElementEdit.Submenu.Taglib"));//$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.action.IAction#isEnabled()
-	 */
-	public boolean isEnabled() {
-		if (element == null || URI == null || "".equals(URI))//$NON-NLS-1$
-		{
-			return false;
-		}
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.action.IAction#run()
-	 */
-	public void run() {
-		String fileName = getResolvedURL(getElement(), URI);
-
-		if (fileName != null && fileName.length() > 0) {
-			IPath includedPath = new Path(fileName);
-			includedPath.makeAbsolute();
-
-			IFile file = getFile(includedPath);
-			if (file != null && file.exists()) {
-				try {
-					IDE.openEditor(getPage(), file);
-					return;
-				} catch (PartInitException e) {
-					PDPlugin.getAlerts().warning(
-							"Message.Warning.Title", e.getLocalizedMessage());//$NON-NLS-1$
-				}
-			}
-		}
-		PDPlugin.getAlerts().warning(
-				"Message.Warning.Title", "Taglib.OpenFile.ERROR");//$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	private IWorkbenchPage getPage() {
-		IWorkbench workbench = PlatformUI.getWorkbench();
-		IWorkbenchWindow window = workbench.getActiveWorkbenchWindow();
-		return window.getActivePage();
-	}
-
-	/**
-	 * @param uri
-	 */
-	public void setURI(String uri) {
-		this.URI = uri;
-	}
-
-	private IFile getFile(IPath includedPath) {
-		IWorkspaceRoot workspaceRoot = ResourcesPlugin.getWorkspace().getRoot();
-		IProject[] projects = workspaceRoot.getProjects();
-
-		for (int i = 0, length = projects.length; i < length; i++) {
-			IPath path = projects[i].getLocation();
-			path = path.makeAbsolute();
-			if (path != null && path.isPrefixOf(includedPath)) {
-				// -1 so we still have the project path
-				includedPath = includedPath.removeFirstSegments(path
-						.segmentCount() - 1);
-				return ResourcesPlugin.getWorkspace().getRoot().getFile(
-						includedPath);
-			}
-		}
-		return null;
-	}
-
-	private String getResolvedURL(Element element_, String attrName) {
-		URIResolver resolver = null;
-		if (element_ instanceof IDOMNode) {
-			resolver = ((IDOMNode) element_).getModel().getResolver();
-		}
-		if (null == resolver) {
-			return null;
-		}
-		String src = URI;
-		if (src != null && src.length() > 0) {
-			return resolver.getLocationByURI(src);
-		}
-		return null;
-	}
-
-	/**
-	 * @return Returns the element.
-	 */
-	public Element getElement() {
-		return element;
-	}
-
-	/**
-	 * @param element
-	 *            The element to set.
-	 */
-	public void setElement(Element element) {
-		this.element = element;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/extensionpoint/IContextMenuItemContributor.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/extensionpoint/IContextMenuItemContributor.java
deleted file mode 100644
index 83bd334..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/extensionpoint/IContextMenuItemContributor.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.extensionpoint;
-
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-
-/**
- * @author mengbo
- * 
- * <p><b>Provisional API - subject to change</b></p>
- */
-
-public interface IContextMenuItemContributor {
-	/**
-	 * @param uri
-	 */
-	void setURI(String uri);
-
-	/**
-	 * @return the uri
-	 */
-	String getURI();
-
-	/**
-	 * @param manager
-	 * @param selection
-	 * @param model
-	 * @param parentUI
-	 */
-	void fillContextMenu(IMenuManager manager, ISelection selection,
-			IStructuredModel model, Control parentUI);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/extensionpoint/package-info.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/extensionpoint/package-info.java
deleted file mode 100644
index 547f3b3..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/extensionpoint/package-info.java
+++ /dev/null
@@ -1,18 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-/**
- * Web Page Editor Extension Point Interfaces. 
- * 
- * <p><b>Provisional API - subject to change</b></p>
- */
-package org.eclipse.jst.pagedesigner.extensionpoint;
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/AbstractFigureHandler.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/AbstractFigureHandler.java
deleted file mode 100644
index 06090c3..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/AbstractFigureHandler.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.figurehandler;
-
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.layout.CSSFigure;
-import org.eclipse.jst.pagedesigner.css2.style.DefaultStyle;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public abstract class AbstractFigureHandler implements IFigureHandler {
-	private CSSFigure _figure;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.sse.core.internal.provisional.INodeAdapter#isAdapterForType(java.lang.Object)
-	 */
-	public boolean isAdapterForType(Object type) {
-		return (type == IFigureHandler.class);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.sse.core.internal.provisional.INodeAdapter#notifyChanged(org.eclipse.wst.sse.core.internal.provisional.INodeNotifier,
-	 *      int, java.lang.Object, java.lang.Object, java.lang.Object, int)
-	 */
-	public void notifyChanged(INodeNotifier notifier, int eventType,
-			Object changedFeature, Object oldValue, Object newValue, int pos) {
-        // TODO: anything?
-	}
-
-	/**
-	 * @param node
-	 * @return the css style on the node
-	 */
-	protected ICSSStyle getCSSStyle(Element node) {
-		ICSSStyle style = null;
-		if (node instanceof IDOMElement) {
-			style = (ICSSStyle) ((IDOMElement) node)
-					.getAdapterFor(ICSSStyle.class);
-		}
-		if (style == null) {
-			style = DefaultStyle.getInstance();
-		} 
-        
-        return style;
-	}
-
-	/**
-	 * @param oldFigure
-	 */
-	protected void setCurrentFigure(CSSFigure oldFigure) {
-		this._figure = oldFigure;
-	}
-
-	public CSSFigure getFigure() {
-		return this._figure;
-	}
-
-	/**
-	 * child class could override this method
-	 */
-	public void dispose() {
-        // TODO: anything to dispose?
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/BRFigureHandler.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/BRFigureHandler.java
deleted file mode 100644
index ff32c72..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/BRFigureHandler.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.figurehandler;
-
-import org.eclipse.jst.pagedesigner.css2.layout.CSSBrFlowLayout;
-import org.eclipse.jst.pagedesigner.css2.layout.CSSFigure;
-import org.eclipse.jst.pagedesigner.css2.layout.CSSLayout;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- */
-public class BRFigureHandler extends AbstractFigureHandler {
-	/**
-	 * @param figure
-	 * @return the CSS layout for fixed layout
-	 */
-	protected CSSLayout getFixedCSSLayout(CSSFigure figure) {
-		return new CSSBrFlowLayout(figure);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.figurehandler.IFigureHandler#isWidget()
-	 */
-	public boolean isWidget() {
-		return false;
-	}
-
-	public void updateFigure(Element node, CSSFigure oldFigure) {
-		oldFigure.setCSSStyle(getCSSStyle(node));
-		oldFigure.setFixedLayoutManager(getFixedCSSLayout(oldFigure));
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/DefaultFigureHandler.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/DefaultFigureHandler.java
deleted file mode 100644
index 82cc075..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/DefaultFigureHandler.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.figurehandler;
-
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.layout.CSSFigure;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class DefaultFigureHandler extends AbstractFigureHandler {
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.figurehandler.IFigureHandler#updateFigure(org.w3c.dom.Element,
-	 *      org.eclipse.jst.pagedesigner.css2.layout.CSSFigure)
-	 */
-	public void updateFigure(Element node, CSSFigure oldFigure) {
-		setCurrentFigure(oldFigure);
-		ICSSStyle style = getCSSStyle(node);
-		oldFigure.setCSSStyle(style);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.figurehandler.IFigureHandler#isWidget()
-	 */
-	public boolean isWidget() {
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/FigureFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/FigureFactory.java
deleted file mode 100644
index f061e11..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/FigureFactory.java
+++ /dev/null
@@ -1,217 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.figurehandler;
-
-import java.util.List;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.jst.jsf.common.ui.JSFUICommonPlugin;
-import org.eclipse.jst.jsf.common.ui.internal.utils.JSFSharedImages;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IStructuredDocumentContextResolverFactory;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IWorkspaceContextResolver;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContextFactory2;
-import org.eclipse.jst.pagedesigner.css2.layout.CSSFigure;
-import org.eclipse.jst.pagedesigner.css2.layout.CSSTextFigure;
-import org.eclipse.jst.pagedesigner.css2.provider.ICSSTextProvider;
-import org.eclipse.jst.pagedesigner.editors.palette.TagImageManager;
-import org.eclipse.jst.pagedesigner.utils.HTMLUtil;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.w3c.dom.Text;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public final class FigureFactory 
-{
-	/**
-	 * @param figure
-	 * @param node
-	 */
-	private static void createFigureDeep(IFigure parentFigure, final Node node) {
-		if (node instanceof Element) {
-			IFigureHandler handler = createAndAdapt((Element) node);
-			if (handler instanceof HiddenFigureHandler) {
-				// for deep hidden element, we don't create figure for them.
-				// this will remove the small <> icon for data window.
-				return;
-			}
-			CSSFigure figure = new CSSFigure();
-			handler.updateFigure((Element) node, figure);
-			// IFigure figure = handler.createFigure((Element) node);
-			parentFigure.add(figure);
-			if (!handler.isWidget()) {
-				NodeList children = node.getChildNodes();
-
-				for (int i = 0, size = children.getLength(); i < size; i++) {
-					createFigureDeep(figure, children.item(i));
-				}
-			}
-		} else if (node instanceof Text) {
-			final String data = HTMLUtil.compactWhitespaces((Text) node, node
-					.getNodeValue());
-			// XXX: seemed there is some bug in handling whitespace (unnecessary
-			// take additional space)
-			// so skip it here.
-			if (data.trim().length() == 0) {
-				return;
-			}
-			// XXX: currently creating of CSSTextFigure is distributed both here
-			// and TextEditPart. We may want to unify them later.
-			CSSTextFigure figure = new CSSTextFigure(new ICSSTextProvider() {
-				/*
-				 * (non-Javadoc)
-				 * 
-				 * @see org.eclipse.jst.pagedesigner.css2.provider.ICSSTextProvider#getCSSStyle()
-				 */
-                //  TODO: dead?
-//				public ICSSStyle getCSSStyle() {
-//					INodeNotifier notifier = (INodeNotifier) node
-//							.getParentNode();
-//					return (ICSSStyle) notifier.getAdapterFor(ICSSStyle.class);
-//				}
-
-				/*
-				 * (non-Javadoc)
-				 * 
-				 * @see org.eclipse.jst.pagedesigner.css2.provider.ICSSTextProvider#getTextData()
-				 */
-				public String getTextData() {
-					return data;
-				}
-
-				/*
-				 * (non-Javadoc)
-				 * 
-				 * @see org.eclipse.jst.pagedesigner.css2.provider.ICSSTextProvider#getSelectedRange()
-				 */
-				public int[] getSelectedRange() {
-					// text figure created here will not be real text in
-					// original doc.
-					// so don't support their selection.
-					return null;
-				}
-			});
-			parentFigure.add(figure);
-		}
-	}
-
-	/**
-	 * @param ele
-	 * @param old
-	 * @param figure
-	 * @return the figure
-	 */
-	public static IFigure updateDeepFigure(Element ele, Element old,
-			CSSFigure figure) {
-		recursiveDisposeAndUnadapt(old);
-		List figureChildren = figure.getChildren();
-		for (int i = figureChildren.size() - 1; i >= 0; i--) {
-			figure.remove((IFigure) figureChildren.get(i));
-		}
-
-		IFigureHandler handler = createAndAdapt(ele);
-		handler.updateFigure(ele, figure);
-		if (!handler.isWidget()) {
-			NodeList children = ele.getChildNodes();
-			for (int i = 0, size = children.getLength(); i < size; i++) {
-				createFigureDeep(figure, children.item(i));
-			}
-		}
-		return figure;
-	}
-
-
-	private static void recursiveDisposeAndUnadapt(Element ele) {
-		disposeAndUnadapt(ele);
-		NodeList nl = ele.getChildNodes();
-		for (int i = 0, size = nl.getLength(); i < size; i++) {
-			Node n = nl.item(i);
-			if (n instanceof Element) {
-				recursiveDisposeAndUnadapt((Element) n);
-			}
-		}
-	}
-
-	private static void disposeAndUnadapt(Element ele) {
-		IFigureHandler handler = getHandler(ele);
-		if (handler != null) {
-			handler.dispose();
-			((IDOMElement) ele).removeAdapter(handler);
-		}
-	}
-
-	private static IFigureHandler getHandler(Element ele) {
-		if (ele instanceof IDOMElement) {
-			IDOMElement xmlele = (IDOMElement) ele;
-			return (IFigureHandler) xmlele.getAdapterFor(IFigureHandler.class);
-		}
-		return null;
-	}
-
-	private static IFigureHandler createAndAdapt(Element ele) {
-		IFigureHandler handler = createFigureHandler(ele);
-		if (ele instanceof IDOMElement) {
-			((IDOMElement) ele).addAdapter(handler);
-		}
-		return handler;
-	}
-
-	private static IFigureHandler createFigureHandler(Element ele) {
-		String tag = ele.getTagName();
-		if ("input".equalsIgnoreCase(tag)) { //$NON-NLS-1$
-			return new InputFigureHandler();
-		} else if ("select".equalsIgnoreCase(tag)) { //$NON-NLS-1$
-			return new SelectFigureHandler();
-		} else if ("img".equalsIgnoreCase(tag)) { //$NON-NLS-1$
-			return new ImgFigureHandler();
-		} else if ("object".equalsIgnoreCase(tag)) { //$NON-NLS-1$
-			return new ObjectFigureHandler();
-		} else if ("textarea".equalsIgnoreCase(tag)) { //$NON-NLS-1$
-			return new TextareaFigureHandler();
-		} else if ("br".equalsIgnoreCase(tag)) { //$NON-NLS-1$
-			return new BRFigureHandler();
-		} else if (!HTMLUtil.isVisualHtmlElement(tag)) {
-			return new HiddenFigureHandler(getSharedHTMLImage(ele));
-		} else {
-			return new DefaultFigureHandler();
-		}
-	}
-
-	/**
-	 * @param tag
-	 * @return
-	 */
-	private static Image getSharedHTMLImage(Element element) {
-		Image image = null;
-		
-        IStructuredDocumentContext context = IStructuredDocumentContextFactory2.INSTANCE.getContext(element);
-        if (context != null){   
-        	IWorkspaceContextResolver wsResolver  = IStructuredDocumentContextResolverFactory.INSTANCE.getWorkspaceContextResolver(context);
-        	if (wsResolver != null){
-        		image = TagImageManager.getInstance().getSmallIconImage(wsResolver.getProject(),"HTML", element.getLocalName()); //$NON-NLS-1$
-        	}
-        }
-		return image != null ? image : JSFUICommonPlugin.getDefault().getImage(
-			JSFSharedImages.DEFAULT_PALETTE_TAG_IMG);	
-	}
-	
-	private FigureFactory()
-	{
-	    // no external instantiation
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/HiddenFigureHandler.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/HiddenFigureHandler.java
deleted file mode 100644
index 4a253cd..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/HiddenFigureHandler.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.figurehandler;
-
-import org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider;
-import org.eclipse.jst.pagedesigner.css2.style.DefaultStyle;
-import org.eclipse.jst.pagedesigner.css2.widget.ImageWidgetProvider;
-import org.eclipse.swt.graphics.Image;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-/*package*/ class HiddenFigureHandler extends WidgetFigureHandler {
-	private Image _image;
-
-	/**
-	 * @param image
-	 */
-	public HiddenFigureHandler(Image image) {
-		_image = image;
-	}
-
-	protected ICSSWidgetProvider initializeWidgetProvider(Element ele) {
-		return new ImageWidgetProvider(getImage(), DefaultStyle.getInstance());
-	}
-
-	/**
-	 * @return
-	 */
-	private Image getImage() {
-		return _image;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/IFigureHandler.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/IFigureHandler.java
deleted file mode 100644
index 99cfe3a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/IFigureHandler.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.figurehandler;
-
-import org.eclipse.jst.pagedesigner.css2.layout.CSSFigure;
-import org.eclipse.wst.sse.core.internal.provisional.INodeAdapter;
-import org.w3c.dom.Element;
-
-/**
- * IFigureHandler is similiar to EditPart in some sence. Each IFigureHandler is
- * adapted to an HTML element node, and provide a figure for it.
- * 
- * @author mengbo
- * @version 1.5
- */
-public interface IFigureHandler extends INodeAdapter {
-	/**
-	 * @param node
-	 * @param oldFigure
-	 */
-	public void updateFigure(Element node, CSSFigure oldFigure);
-
-	/**
-	 * 
-	 */
-	public void dispose();
-
-	/**
-	 * @return true if the node is deemed a widget
-	 */
-	public boolean isWidget();
-
-	/**
-	 * @return the figure
-	 */
-	public CSSFigure getFigure();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/ImgFigureHandler.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/ImgFigureHandler.java
deleted file mode 100644
index 920b3d3..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/ImgFigureHandler.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.figurehandler;
-
-import org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider;
-import org.eclipse.jst.pagedesigner.css2.widget.ImageWidgetProvider;
-import org.eclipse.jst.pagedesigner.utils.ImageResolver;
-import org.eclipse.swt.graphics.Image;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- */
-/*package*/ class ImgFigureHandler extends WidgetFigureHandler {
-	/**
-	 * the image provided for a widget
-	 */
-	protected Image _image;
-
-	/**
-	 * child class can override this method.
-	 * 
-	 * @param node
-	 */
-	protected void initializeImage(Element node) {
-		if (_image != null) {
-			_image.dispose();
-		}
-		_image = ImageResolver.initializeImage(node, "src"); //$NON-NLS-1$
-	}
-
-	public void dispose() {
-		if (_image != null) {
-			_image.dispose();
-			_image = null;
-		}
-	}
-
-	protected ICSSWidgetProvider initializeWidgetProvider(Element ele) {
-		initializeImage(ele);
-		ImageWidgetProvider provider = new ImageWidgetProvider(_image,
-				getCSSStyle(ele));
-		return provider;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/InputFigureHandler.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/InputFigureHandler.java
deleted file mode 100644
index bd61ce0..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/InputFigureHandler.java
+++ /dev/null
@@ -1,193 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.figurehandler;
-
-import org.eclipse.jst.jsf.common.ui.JSFUICommonPlugin;
-import org.eclipse.jst.jsf.common.ui.internal.utils.JSFSharedImages;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider;
-import org.eclipse.jst.pagedesigner.css2.widget.ButtonWidgetProvider;
-import org.eclipse.jst.pagedesigner.css2.widget.CheckboxWidgetProvider;
-import org.eclipse.jst.pagedesigner.css2.widget.HiddenProvider;
-import org.eclipse.jst.pagedesigner.css2.widget.ImageWidgetProvider;
-import org.eclipse.jst.pagedesigner.css2.widget.InputFileWidgetProvider;
-import org.eclipse.jst.pagedesigner.css2.widget.RadioWidgetProvider;
-import org.eclipse.jst.pagedesigner.css2.widget.TextInputWidgetProvider;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.eclipse.jst.pagedesigner.utils.ImageResolver;
-import org.eclipse.swt.graphics.Image;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- */
-/*package*/ class InputFigureHandler extends WidgetFigureHandler {
-	private Image _image;
-
-	void initializeImage(Element node) {
-		if (_image != null) {
-			_image.dispose();
-		}
-		_image = ImageResolver.initializeImage(node, "src"); //$NON-NLS-1$
-	}
-
-	ImageWidgetProvider getImageProvider(Element node) {
-		initializeImage(node);
-		ImageWidgetProvider provider = new ImageWidgetProvider(_image,
-				getCSSStyle(node));
-		return provider;
-	}
-
-	ICSSWidgetProvider getButtonProvider(Element node) {
-		ButtonWidgetProvider provider = new ButtonWidgetProvider(
-				getCSSStyle(node));
-		provider.setValue(getButtonValue(node));
-		return provider;
-	}
-
-	ICSSWidgetProvider getFileProvider(Element node) {
-		// ICSSWidgetProvider textprovider = getTextInputProvider();
-		// // XXX: should we use the defaultstyle for the button?
-		// ButtonWidgetProvider browsebutton = new
-		// ButtonWidgetProvider(getCSSStyle());
-		// browsebutton.setValue("Browse...");
-		// CompositeWidgetProvider provider = new
-		// CompositeWidgetProvider(getCSSStyle(), textprovider, browsebutton,
-		// false);
-		// return provider;
-		ICSSWidgetProvider textprovider = getTextInputProvider(node);
-		// XXX: should we use the defaultstyle for the button?
-		ButtonWidgetProvider browsebutton = new ButtonWidgetProvider(
-				getCSSStyle(node));
-		browsebutton.setValue(Messages.InputFigureHandler_Browse);
-		InputFileWidgetProvider provider = new InputFileWidgetProvider(
-				getCSSStyle(node), textprovider, browsebutton);
-		return provider;
-	}
-
-	/**
-	 * should not return null
-	 * 
-	 * @return the image
-	 */
-	protected Image getHiddenImage() {
-		return JSFUICommonPlugin.getDefault().getImage(
-				JSFSharedImages.DEFAULT_PALETTE_TAG_IMG);
-	}
-
-	ICSSWidgetProvider getHiddenProvider(Element node) {
-		return new HiddenProvider(getHiddenImage(), node);
-	}
-
-	ICSSWidgetProvider getPasswordProvider(Element node) {
-		TextInputWidgetProvider provider = new TextInputWidgetProvider(
-				getCSSStyle(node), TextInputWidgetProvider.PWD_SIZE);
-		provider.setSize(getSize(node));
-		provider.setValue("********"); //$NON-NLS-1$
-		return provider;
-	}
-
-	ICSSWidgetProvider getTextInputProvider(Element node) {
-		TextInputWidgetProvider provider = new TextInputWidgetProvider(
-				getCSSStyle(node));
-		provider.setSize(getSize(node));
-		provider.setValue(getValue(node));
-		return provider;
-	}
-
-	private int getSize(Element node) {
-		String s = DOMUtil.getAttributeIgnoreCase(node, "size"); //$NON-NLS-1$
-		try {
-			if (s != null) {
-				return Integer.parseInt(s);
-			}
-		} catch (NumberFormatException  ex) {
-            // suppress and fall-through; return 0
-		}
-        return 0;
-	}
-
-	/**
-	 * @return
-	 */
-	private String getValue(Element node) {
-		return DOMUtil.getAttributeIgnoreCase(node, "value"); //$NON-NLS-1$
-	}
-
-	private String getButtonValue(Element node) {
-		String value = getValue(node);
-		if (value == null) {
-			String type = DOMUtil.getAttributeIgnoreCase(node,
-					ICSSPropertyID.ATTR_TYPE);
-			if (type.equalsIgnoreCase(ICSSPropertyID.VAL_SUBMIT)) {
-				return IHTMLConstants.SUBMIT_LABEL;
-			} else if (type.equalsIgnoreCase(ICSSPropertyID.VAL_RESET)) {
-				return IHTMLConstants.RESET_LABEL;
-			}
-		}
-		return value;
-	}
-
-	/**
-	 * @return the widget provider
-	 */
-	protected ICSSWidgetProvider initializeWidgetProvider(Element node) {
-		reset();
-
-		String type = DOMUtil.getAttributeIgnoreCase(node,
-				ICSSPropertyID.ATTR_TYPE);
-
-		if (type == null) {
-			return getTextInputProvider(node);
-		} else if (type.equalsIgnoreCase(ICSSPropertyID.VAL_SUBMIT)
-				|| type.equalsIgnoreCase(ICSSPropertyID.VAL_RESET)
-				|| type.equalsIgnoreCase(ICSSPropertyID.VAL_BUTTON)) {
-			return getButtonProvider(node);
-		} else if (type.equalsIgnoreCase(ICSSPropertyID.VAL_IMAGE)) {
-			return getImageProvider(node);
-		} else if (type.equalsIgnoreCase(ICSSPropertyID.VAL_FILE)) {
-			return getFileProvider(node);
-		} else if (type.equalsIgnoreCase(ICSSPropertyID.VAL_RADIO)) {
-			RadioWidgetProvider provider = new RadioWidgetProvider(
-					getCSSStyle(node));
-			provider.setChecked(node.hasAttribute("checked")); //$NON-NLS-1$
-			return provider;
-		} else if (type.equalsIgnoreCase(ICSSPropertyID.VAL_CHECKBOX)) {
-			CheckboxWidgetProvider provider = new CheckboxWidgetProvider(
-					getCSSStyle(node));
-			provider.setChecked(node.hasAttribute("checked")); //$NON-NLS-1$
-			return provider;
-		} else if (type.equalsIgnoreCase(ICSSPropertyID.VAL_HIDDEN)) {
-			return getHiddenProvider(node);
-		}
-		if (type.equalsIgnoreCase(ICSSPropertyID.VAL_PASSWORD)) {
-			return getPasswordProvider(node);
-		}
-        return getTextInputProvider(node);
-	}
-
-	/**
-	 * 
-	 */
-	private void reset() {
-		if (_image != null) {
-			_image.dispose();
-			_image = null;
-		}
-	}
-
-	public void dispose() {
-		reset();
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/Messages.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/Messages.java
deleted file mode 100644
index 63be108..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/Messages.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- * 
- ********************************************************************************/
-package org.eclipse.jst.pagedesigner.figurehandler;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * String resource handler
- *
- */
-public class Messages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.jst.pagedesigner.figurehandler.messages"; //$NON-NLS-1$
-	/**
-	 * see messages.properties
-	 */
-	public static String InputFigureHandler_Browse;
-	static {
-		// initialize resource bundle
-		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-	}
-
-	private Messages() {
-		//
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/ObjectFigureHandler.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/ObjectFigureHandler.java
deleted file mode 100644
index 8dfeccd..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/ObjectFigureHandler.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.figurehandler;
-
-import org.eclipse.jst.pagedesigner.editors.palette.TagImageManager;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-/*package*/ class ObjectFigureHandler extends ImgFigureHandler {
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.figurehandler.ImgFigureHandler#initializeImage()
-	 */
-	protected void initializeImage(Element node) {
-		if (_image == null) {
-			_image = TagImageManager.getInstance().getSmallIconImage(null, "HTML", node.getTagName()); //$NON-NLS-1$
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/SelectFigureHandler.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/SelectFigureHandler.java
deleted file mode 100644
index 6876b54..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/SelectFigureHandler.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.figurehandler;
-
-import java.util.List;
-
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider;
-import org.eclipse.jst.pagedesigner.css2.widget.ComboWidgetProvider;
-import org.eclipse.jst.pagedesigner.css2.widget.ListWidgetProvider;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- */
-/*package*/ class SelectFigureHandler extends WidgetFigureHandler {
-
-	/**
-	 * @param node
-	 * @return the labels
-	 */
-	public String[] getOptionLabels(Element node) {
-		List options = DOMUtil.getChildElementsByTagIgnoreCase(node,
-				IHTMLConstants.TAG_OPTION);
-		String[] ret = new String[options.size()];
-		for (int i = 0; i < ret.length; i++) {
-			Element option = (Element) options.get(i);
-			ret[i] = DOMUtil.getTextElementValue(option);
-		}
-		return ret;
-	}
-
-	/**
-	 * @param node
-	 * @return the label
-	 */
-	public String getSelectedLabels(Element node) {
-		List options = DOMUtil.getChildElementsByTagIgnoreCase(node,
-				IHTMLConstants.TAG_OPTION);
-		String result = null;
-		for (int i = 0, n = options.size(); i < n; i++) {
-			Element option = (Element) options.get(i);
-			if (option.hasAttribute(IHTMLConstants.ATTR_SELECTED)) {
-				result = DOMUtil.getTextElementValue(option);
-			}
-		}
-		return result;
-	}
-
-	/**
-	 * @param node
-	 * @return true if is multiple
-	 */
-	private boolean isMultiple(Element node) {
-		return DOMUtil
-				.getAttributeIgnoreCase(node, ICSSPropertyID.VAL_MULTIPLE) != null;
-	}
-
-	/**
-	 * @return the provider
-	 */
-	protected final ICSSWidgetProvider initializeWidgetProvider(Element node) {
-		String[] labels = getOptionLabels(node);
-		String rows = DOMUtil.getAttributeIgnoreCase(node,
-				IHTMLConstants.ATTR_SIZE);
-		int rowsInt = 0;
-		try {
-			if (rows != null) {
-				rowsInt = Integer.parseInt(rows);
-			}
-		} catch (Exception ex) {
-			// ignore
-		}
-		if (isMultiple(node) || rowsInt > 1) {
-			ListWidgetProvider provider = new ListWidgetProvider(
-					getCSSStyle(node));
-			provider.setOptions(labels);
-			provider.setRows(rowsInt);
-			return provider;
-		}
-        ComboWidgetProvider provider = new ComboWidgetProvider(
-        		getCSSStyle(node));
-        provider.setOptions(labels);
-        provider.setSelectedLabel(getSelectedLabels(node));
-        return provider;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/TextareaFigureHandler.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/TextareaFigureHandler.java
deleted file mode 100644
index 8905538..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/TextareaFigureHandler.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.figurehandler;
-
-import org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider;
-import org.eclipse.jst.pagedesigner.css2.widget.TextAreaWidgetProvider;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-/*package*/ class TextareaFigureHandler extends WidgetFigureHandler {
-	protected ICSSWidgetProvider initializeWidgetProvider(Element node) {
-		TextAreaWidgetProvider provider = new TextAreaWidgetProvider(
-				getCSSStyle(node));
-		String s = DOMUtil.getAttributeIgnoreCase(node, "cols"); //$NON-NLS-1$
-		if (s != null) {
-			try {
-				provider.setColumns(Integer.parseInt(s));
-			} catch (Exception ex) {
-				// ignore
-			}
-		}
-		s = DOMUtil.getAttributeIgnoreCase(node, "rows"); //$NON-NLS-1$
-		if (s != null) {
-			try {
-				provider.setRows(Integer.parseInt(s));
-			} catch (Exception ex) {
-				// ignore
-			}
-		}
-		s = DOMUtil.getTextElementValue(node);
-		if (s != null) {
-			provider.setValue(s);
-		}
-		return provider;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/WidgetFigureHandler.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/WidgetFigureHandler.java
deleted file mode 100644
index d2a3421..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/WidgetFigureHandler.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.figurehandler;
-
-import org.eclipse.jst.pagedesigner.css2.layout.CSSFigure;
-import org.eclipse.jst.pagedesigner.css2.layout.CSSWidgetLayout;
-import org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider;
-import org.w3c.dom.Element;
-
-/**
- * A widget figure handler
- *
- */
-abstract class WidgetFigureHandler extends AbstractFigureHandler {
-
-	/**
-	 * default constructor
-	 */
-	public WidgetFigureHandler() {
-		super();
-	}
-
-	public void updateFigure(Element node, CSSFigure oldFigure) {
-		setCurrentFigure(oldFigure);
-		ICSSWidgetProvider provider = initializeWidgetProvider(node);
-		oldFigure.setCSSStyle(provider.getCSSStyle());
-		oldFigure
-				.setFixedLayoutManager(new CSSWidgetLayout(oldFigure, provider));
-	}
-
-	/**
-	 * @param ele
-	 * @return the widget provider
-	 */
-	protected abstract ICSSWidgetProvider initializeWidgetProvider(Element ele);
-
-	public boolean isWidget() {
-		return true;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/messages.properties b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/messages.properties
deleted file mode 100644
index 3c804bb..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/messages.properties
+++ /dev/null
@@ -1 +0,0 @@
-InputFigureHandler_Browse=Browse...
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/AbstractTagCreationAdvisor.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/AbstractTagCreationAdvisor.java
deleted file mode 100644
index 1ccd833..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/AbstractTagCreationAdvisor.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.itemcreation;
-
-import java.util.Collection;
-
-import org.eclipse.jst.pagedesigner.dom.DOMPositionHelper;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.itemcreation.command.ContainerCreationCommand;
-import org.eclipse.jst.pagedesigner.itemcreation.command.ElementCustomizationCommand;
-import org.eclipse.jst.pagedesigner.utils.BodyHelper;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.w3c.dom.Element;
-
-/**
- * Clients should sub-class in order to create a new ITagCreationAdvisor type,
- * however, it is preferable to extend DefaultTagCreationAdvisor where possible.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author cbateman
- *
- */
-public abstract class AbstractTagCreationAdvisor implements ITagCreationAdvisor 
-{
-    /**
-     * Information passed by the framework about the tag to be created
-     * {@link CreationData}
-     */
-    protected final CreationData  _creationData;
-
-    /**
-     * @param creationData
-     */
-    public AbstractTagCreationAdvisor(CreationData  creationData)
-    {
-        this._creationData = creationData;
-    }
-
-    /**
-     * @param model
-     * @param tagElement
-     */
-    public final void applyCustomization(IDOMModel model, Element tagElement)
-    {
-        ElementCustomizationCommand command = 
-            getElementCustomizationCommand(model, tagElement);
-        
-        if (command != null && command.canExecute())
-        {
-            command.execute();
-        }
-    }
-
-    /**
-     * @param model
-     * @param tagElement
-     * @return the customization command
-     */
-    protected abstract ElementCustomizationCommand getElementCustomizationCommand(IDOMModel model, Element tagElement);
-
-    /**
-     * Return position for tag after all necessary containers are created.  
-     * If necessary containers cannot be created and do not exist for any reason,
-     * implementer should return null
-     * to signal that the tag creation should not occur.
-     * 
-     * Clients may override this method to provide custom container positioning
-     * 
-     * @param model
-     * @param domPosition
-     * @return position after necessary containers are created
-     */
-    public final IDOMPosition checkAndApplyNecessaryContainers(
-            IDOMModel model, IDOMPosition domPosition) 
-    {
-        IDOMPosition position = DOMPositionHelper.splitText(domPosition);
-
-        position = BodyHelper.adjustInsertPosition
-            (_creationData.getUri(), _creationData.getTagName(), position);
-        
-        //position = getContainerCreationCommands(position);
-        ContainerCreationCommand command = getContainerCreationCommand(position);
-        
-        if (command != null)
-        {
-            command.execute();
-            Collection<IDOMPosition>  collection = command.getResult();
-            
-            if (collection.size()==1)
-            {
-                position = collection.iterator().next(); 
-            }
-            else
-            {
-                position = null;
-            }
-        }
-
-        if (position == null) {
-            // user cancelled
-            return null;
-        }
-
-        // because the next call of getPrefix() may insert new taglib node
-        // into the document, if we use the normal
-        // DOMPositin which use index, maybe it will be invalidated by the
-        // new taglib node. So use RefPosition here.
-        return DOMPositionHelper.toDOMRefPosition(position);
-    }
-
-    /**
-     * @param position
-     * @return a command (could be CompoundCommand or chained command) that when executed
-     * will add any necessary containers.
-     */
-    protected abstract ContainerCreationCommand getContainerCreationCommand(IDOMPosition position);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/AbstractTagCreator.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/AbstractTagCreator.java
deleted file mode 100644
index a334781..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/AbstractTagCreator.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.itemcreation;
-
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.w3c.dom.Element;
-
-/**
- * The abstract class from which all client ITagCreator instances
- * should be derived.
- * 
- * The createTag method enforces a set of steps required by the framework
- * to create a new tag.  However, it allows you to configure some of the steps
- * by providing an ITagCreationAdvisor through the doSelectCreationAdvisor.
- *
- * <p><b>Provisional API - subject to change</b></p>
- *
- * @author cbateman
- *
- */
-public abstract class AbstractTagCreator implements ITagCreator 
-{
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.itemcreation.ITagCreator#createTag(org.eclipse.jst.pagedesigner.editors.palette.TagToolPaletteEntry, org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel, org.eclipse.jst.pagedesigner.dom.IDOMPosition)
-     */
-    public final Element createTag(final CreationData creationData) 
-    {
-        final ITagCreationAdvisor  advisor = selectCreationAdvisor(creationData);
-        
-        // adjust the creation position to accommodate required containers
-        final IDOMPosition position = 
-            advisor.checkAndApplyNecessaryContainers(creationData.getModel(), creationData.getDomPosition());
-        
-        if (position == null) return null;//throw exception?
-
-        creationData.setAdjustedPosition(position);
-        
-        // create the element
-        final Element ele =  createElement(creationData);
-        if (ele == null) return null;//throw exception?
-
-        // apply tag customization
-        advisor.applyCustomization(creationData.getModel(), ele);
-
-        // ensure that any attributes required by the tag's definition
-        // is initialized.
-        // TODO: a drawback of this approach is that it leaves the tag in
-        // a state where there are no error flags to tell the user something is
-        // missing, but may initialize the tag with an (empty) invalid value
-        //ensureRequiredAttrs(ele, creationData);
-
-        addTagToContainer(position, ele);
-
-        return ele;
-    }
-
-    private ITagCreationAdvisor selectCreationAdvisor(CreationData creationData)
-    {
-        ITagCreationAdvisor advisor  = doSelectCreationAdvisor(creationData);
-
-        // enforce that the advisor must be an AbstractTagCreationAdvisor to 
-        // avoid using the default (not this case also covers advisor == null)
-        if (! (advisor instanceof AbstractTagCreationAdvisor))
-        {
-            advisor = new DefaultTagCreationAdvisor(creationData);
-        }
-
-        return advisor;
-    }
-    
-    /**
-     * @param creationData
-     * @return a tag creation advisor or null to indicate the use of the system default
-     */
-    protected abstract ITagCreationAdvisor doSelectCreationAdvisor(CreationData creationData);
-
-    /**
-     * @param creationData 
-     * @return {@link Element}
-     */
-    protected final Element createElement(final CreationData creationData)
-    {
-        Element ele =  creationData.getModel().getDocument().createElement(creationData.getTagName());
-        if (ele == null) return null;
-
-        //ugly... fix me
-        
-        // TODO: move this into an ensure method?
-        // XXX: we are using "startsWith("directive.")" to test whether
-        // should setJSPTag, this
-        // maybe is not the best way. Need check whether SSE have special
-        // API for it.
-        if (ITLDConstants.URI_JSP.equals(creationData.getUri())
-                && (ele.getLocalName().startsWith("directive.") //$NON-NLS-1$
-                        || "declaration".equals(ele.getLocalName()) //$NON-NLS-1$
-                        || "expression".equals(ele.getLocalName()) || "scriptlet" //$NON-NLS-1$ //$NON-NLS-2$
-                        .equals(ele.getLocalName()))) {
-            // it is a jsp tag
-            ((IDOMElement) ele).setJSPTag(true);
-        }
-
-        if (creationData.getPrefix() != null)
-        {
-            ele.setPrefix(creationData.getPrefix());
-        }
-
-        return ele;
-    }
-
-    /**
-     * @param position
-     * @param tagElement
-     */
-    private void addTagToContainer(final IDOMPosition position, final Element tagElement) {
-        if (position == null || position.getContainerNode() == null) {
-            return;
-        }
-
-        if (position.getNextSiblingNode() == null) {
-            position.getContainerNode().appendChild(tagElement);
-        } else {
-            position.getContainerNode().insertBefore(tagElement,
-                    position.getNextSiblingNode());
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/CreationData.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/CreationData.java
deleted file mode 100644
index 5669ea9..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/CreationData.java
+++ /dev/null
@@ -1,257 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.itemcreation;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.jsf.common.metadata.Entity;
-import org.eclipse.jst.jsf.common.metadata.Model;
-import org.eclipse.jst.jsf.common.metadata.Trait;
-import org.eclipse.jst.jsf.common.metadata.internal.TraitValueHelper;
-import org.eclipse.jst.jsf.common.metadata.query.ITaglibDomainMetaDataModelContext;
-import org.eclipse.jst.jsf.common.metadata.query.TaglibDomainMetaDataQueryHelper;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.jsf.core.internal.tld.TagIdentifierFactory;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.editors.palette.ITagDropSourceData;
-import org.eclipse.jst.pagedesigner.utils.JSPUtil;
-import org.eclipse.wst.xml.core.internal.provisional.contentmodel.CMDocType;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-
-/**
- * Value object that wraps creation data
- *  
- * <p><b>Provisional API - subject to change</b></p>
- *  
- * @author cbateman
- *
- */
-public final class CreationData
-{
-    private final ITagDropSourceData  _creationProvider;
-    private final String                _prefix; 
-    private final IDOMPosition          _domPosition;
-    private final IDOMModel             _model;
-    private final IAdaptable            _customizationData;
-
-    private TagIdentifier               _tagId; // = null; lazy init on creation 
-    
-    /**
-     * The tag {@link Entity} being created
-     */
-    private Entity _tagEntity; // = null; lazy load because derived from
-                               // potentially expensive meta-data search
-    
-    /**
-     * The {@link ITaglibDomainMetaDataModelContext} for the tag creation
-     */
-    private final ITaglibDomainMetaDataModelContext _taglibMetaDataContext;
-
-    // mutable because it may be changed from the original _domPosition
-    private IDOMPosition _adjustedPosition;
-
-    
-    /**
-     * @param creationProvider 
-     * @param model 
-     * @param domPosition 
-     * @param taglibMetaDataContext 
-     * @param customizationData 
-     */
-    public CreationData(final ITagDropSourceData creationProvider,
-            final IDOMModel model, final IDOMPosition domPosition,
-            final ITaglibDomainMetaDataModelContext taglibMetaDataContext,
-            final IAdaptable customizationData)
-    {
-        super();
-        this._creationProvider = creationProvider;
-        this._taglibMetaDataContext = taglibMetaDataContext;
-        this._domPosition = domPosition;
-        this._adjustedPosition = _domPosition;
-        this._model = model;
-        this._customizationData = customizationData; 
-        this._prefix = getPrefix(getUri(), model, getDefaultPrefix());
-    }
-
-    /**
-     * Returns the ns prefix for the tag and also creates taglib reference if necessary
-     * @param uri
-     * @param model
-     * @param suggested
-     * @return prefix to use
-     */
-    protected static String getPrefix(String uri, IDOMModel model,
-            String suggested) {
-        // TODO: this shouldn't really add to the document
-        if (uri==null || ITLDConstants.URI_HTML.equalsIgnoreCase(uri)
-                || ITLDConstants.URI_JSP.equalsIgnoreCase(uri)
-                || CMDocType.JSP11_DOC_TYPE.equalsIgnoreCase(uri)) {
-            return null;
-        }
-
-        // now handles custom tag lib
-        return JSPUtil.getOrCreatePrefix(model, uri, suggested);
-    }
-    
-    /**
-     * @return the tag identifier uri
-     */
-    public String getUri() {
-       	ITagDropOverrider overrider = getTagDropOverrider();
-    	if (overrider != null && overrider.getUriOverride() != null)
-    		 return overrider.getUriOverride();
-    	
-        return _creationProvider.getNamespace();
-    }
-
-    /**
-     * @return the default prefix
-     */
-    public String getDefaultPrefix() {
-    	ITagDropOverrider overrider = getTagDropOverrider();
-    	if (overrider != null && overrider.getDefaultPrefixOverride() != null)
-    		 return overrider.getDefaultPrefixOverride();
-    	    	
-        return _creationProvider.getDefaultPrefix();
-    }
-
-    private ITagDropOverrider getTagDropOverrider() {
-    	if (getDropCustomizationData() != null
-    			&& getDropCustomizationData()
-    				.getAdapter(ITagDropOverrider.class) != null) {
-    		
-    		 return (ITagDropOverrider)getDropCustomizationData()
-    		 		.getAdapter(ITagDropOverrider.class);
-    	}
-    	return null;
-    }
-    /**
-     * @return the local prefix for the  tag
-     */
-    public String getPrefix() {
-        return _prefix;
-    }
-
-    /**
-     * @return the tag name
-     */
-    public String getTagName() {
-    	ITagDropOverrider overrider = getTagDropOverrider();
-    	if (overrider != null && overrider.getTagNameOverride() != null)
-    		 return overrider.getTagNameOverride();
-    	
-        return _creationProvider.getTagName();
-    }
-
-    /**
-     * @return the creation provider
-     */
-    public ITagDropSourceData getTagCreationProvider()
-    {
-        return _creationProvider;
-    }
-
-    /**
-     * @return the {@link Entity} for this tag element being created
-     */
-    public Entity getTagEntity() {
-        if (_tagEntity == null){
-            _tagEntity = TaglibDomainMetaDataQueryHelper.getEntity(_taglibMetaDataContext, getTagName());
-            
-        }
-        return _tagEntity;
-    }
-    
-    /**
-     * @return flag indicating that html form container ancestor is required
-     */
-    public boolean isHTMLFormRequired() {
-        Trait t = TaglibDomainMetaDataQueryHelper.getTrait(getTagEntity(), "requires-html-form"); //$NON-NLS-1$
-        if (t != null)
-            return TraitValueHelper.getValueAsBoolean(t);
-        
-        return false;
-    }
-    
-    /**
-     * @return flag indicating that jsf component
-     */
-    public boolean isJSFComponent() {      
-        Model model = TaglibDomainMetaDataQueryHelper.getModel(_taglibMetaDataContext);
-        Trait t = TaglibDomainMetaDataQueryHelper.getTrait(model, "is-jsf-component-library"); //$NON-NLS-1$
-        if (t != null)
-            return TraitValueHelper.getValueAsBoolean(t);
-        
-        return false;
-    }
-
-	/**
-	 * @return flag indicating that jsf view container ancestor is required
-	 */
-	public boolean isJSFViewTagRequired() {
-		return JSPUtil.isJSPModel(_model);		
-	}
-	
-    /**
-     * @return the metadata context for the tag
-     */
-    public ITaglibDomainMetaDataModelContext getTaglibMetaDataContext() {
-        return _taglibMetaDataContext;
-    }
-
-    /**
-     * @return the original dom position of the tag creation
-     */
-    public IDOMPosition getDomPosition() {
-        return _domPosition;
-    }
-
-    /**
-     * @return the dom model
-     */
-    public IDOMModel getModel() 
-    {
-        return _model;
-    }
-
-    /**
-     * @return the adjusted position (calculated to account for containers etc.)
-     */
-    public IDOMPosition getAdjustedPosition() {
-        return _adjustedPosition;
-    }
-
-    /**
-     * @param adjustedPosition
-     */
-    /*package*/ void setAdjustedPosition(IDOMPosition adjustedPosition) {
-        _adjustedPosition = adjustedPosition;
-    }
-
-    /**
-     * @return the TagIdentifer for the tag to be created
-     */
-    public TagIdentifier getTagId() 
-    {
-        if (_tagId == null)
-        {
-            _tagId = TagIdentifierFactory.createJSPTagWrapper(getUri(), getTagName());
-        }
-        return _tagId;
-    }
-
-    /**
-     * @return the customization data passed in from the tool.  May be null.
-     */
-    public IAdaptable getDropCustomizationData() {
-        return _customizationData;
-    }
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/DefaultTagCreationAdvisor.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/DefaultTagCreationAdvisor.java
deleted file mode 100644
index a0b0d89..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/DefaultTagCreationAdvisor.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.itemcreation;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.itemcreation.command.ContainerCreationCommand;
-import org.eclipse.jst.pagedesigner.itemcreation.command.ElementCustomizationCommand;
-import org.eclipse.jst.pagedesigner.itemcreation.command.SingletonContainerCreationCommand;
-import org.eclipse.jst.pagedesigner.itemcreation.command.TagContainerCreationCommand;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.w3c.dom.Element;
-
-/**
- * The default advisor.
- * 
- * Clients may extend this class.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author cbateman
- *
- */
-public class DefaultTagCreationAdvisor extends AbstractTagCreationAdvisor 
-{
-    /**
-     * @param creationData
-     */
-    public DefaultTagCreationAdvisor(CreationData creationData) 
-    {
-        super(creationData);
-    }
-
-    
-    @Override
-    protected ElementCustomizationCommand getElementCustomizationCommand(
-            IDOMModel model, Element tagElement) {
-        return new ElementCustomizationCommand(model, tagElement, _creationData);
-    }
-
-    /**
-     * @param position the initial drop position
-     * @return position after creating required containers
-     */
-    protected ContainerCreationCommand getContainerCreationCommand(final IDOMPosition position) {
-    	if (_creationData.isJSFComponent()) {
-            return getJSFContainerCommand(position);
-        }
-        else if (!(_creationData.isJSFComponent()) && _creationData.isHTMLFormRequired()){
-            return getHtmlFormCommand(position);
-        }        
-        return null;
-    }
-
-	/**
-     * @param position
-     * @return the default container creation command for a JSF tag
-     */
-    protected ContainerCreationCommand getJSFContainerCommand(final IDOMPosition position)
-    {
-        ContainerCreationCommand command = null; 
-        	
-        if (_creationData.isJSFViewTagRequired())
-            command = new SingletonContainerCreationCommand(position, IJSFConstants.TAG_IDENTIFIER_VIEW, _creationData.getTagId());
-        
-        if (_creationData.isHTMLFormRequired())
-        {
-        	final ContainerCreationCommand htmlFormCommand = new TagContainerCreationCommand(position, IJSFConstants.TAG_IDENTIFIER_FORM, _creationData.getTagId());
-        	if (command != null)
-        		command.chain(htmlFormCommand);
-        	else
-        		command = htmlFormCommand;
-        }
-        
-        return command;
-    }
-    
-    /**
-     * @param position
-     * @return the default container creation command for an HTML form tag
-     */
-    protected ContainerCreationCommand getHtmlFormCommand(final IDOMPosition position)
-    {
-        return new TagContainerCreationCommand(position, IHTMLConstants.TAG_IDENTIFIER_HTML_FORM, _creationData.getTagId());
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/ITagCreationAdvisor.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/ITagCreationAdvisor.java
deleted file mode 100644
index 97e19c4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/ITagCreationAdvisor.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.itemcreation;
-
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.w3c.dom.Element;
-
-/**
- * An advisor object that allows customization of tag creation in an ITagCreator
- * 
- * Clients should *not* implement this interface.  Extend AbstractTagCreationAdvisor
- * or DefaultTagCreationAdvisor instead.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author cbateman
- *
- */
-public interface ITagCreationAdvisor
-{
-    /**
-     * @param model
-     * @param domPosition
-     * @return a new IDOMPosition adjust for required containers or domPosition
-     * if no adjust is required.  ???May return null???
-     */
-    IDOMPosition checkAndApplyNecessaryContainers(IDOMModel model,
-            IDOMPosition domPosition);
-
-    /**
-     * Apply customization to tagElement.  May use to modify
-     * attributes and child elements of the tag.
-     * 
-     * @param model
-     * @param tagElement
-     * @param tagToolItem
-     */
-    void applyCustomization(IDOMModel model, Element tagElement);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/ITagCreator.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/ITagCreator.java
deleted file mode 100644
index c8d56e0..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/ITagCreator.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.itemcreation;
-
-import org.w3c.dom.Element;
-
-/**
- * The interface type of all tag creators.
- * 
- * Clients should *not* implement this interface.  Extend AbstractTagCreator instead.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- */
-public interface ITagCreator {
-	/**
-	 * @param creationData 
-	 * @return W3C Element for the  tag at the correct position in the DOM.   May be null if creation cannot occur.
-	 */
-	public Element createTag(final CreationData creationData);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/ITagDropOverrider.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/ITagDropOverrider.java
deleted file mode 100644
index 12a24bb..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/ITagDropOverrider.java
+++ /dev/null
@@ -1,59 +0,0 @@
-package org.eclipse.jst.pagedesigner.itemcreation;
-
-/**
- * Used to override the data used in a tag drop in the CreateItemCommand
- * <p>
- * This is NOT API.  Clients should not use this interface as it may change in the future.
- */
-public interface ITagDropOverrider
-{
-
-    /**
-     * The default overrider
-     *
-     */
-    static class DefaultTagDropOverrider implements ITagDropOverrider
-    {
-        private final String _tagNameOverrride;
-        private final String _uriOverride;
-        private final String _defaultPrefixOverride;
-        
-        public DefaultTagDropOverrider(final String uriOverride, final String tagNameOverride, final String defaultPrefixOverride)
-        {
-            super();
-            _tagNameOverrride = tagNameOverride;
-            _uriOverride = uriOverride;
-            _defaultPrefixOverride = defaultPrefixOverride;
-        }
-
-        public String getTagNameOverride()
-        {
-            return _tagNameOverrride;
-        }
-
-        public String getUriOverride()
-        {
-            return _uriOverride;
-        }
-        
-        public String getDefaultPrefixOverride()
-        {
-            return _defaultPrefixOverride;
-        }
-        
-    }
-    /**
-     * @return the new uri to use or null if shouldn't override
-     */
-    String getUriOverride();
-
-    /**
-     * @return the new tag name or null if shouldn't override
-     */
-    String getTagNameOverride();
-    
-    /**
-     * @return the new default prefix or null if shouldn't override
-     */
-    String getDefaultPrefixOverride();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/ItemCreationEditPolicy.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/ItemCreationEditPolicy.java
deleted file mode 100644
index 42c3656..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/ItemCreationEditPolicy.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.itemcreation;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.requests.DropRequest;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.commands.CreateItemCommand;
-import org.eclipse.jst.pagedesigner.dom.DOMPositionHelper;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.editpolicies.DropEditPolicy;
-import org.eclipse.jst.pagedesigner.tools.ExposeHelper;
-import org.eclipse.jst.pagedesigner.validation.caret.ActionData;
-import org.eclipse.jst.pagedesigner.validation.caret.DnDPositionValidator;
-import org.eclipse.jst.pagedesigner.validation.caret.DropActionData;
-import org.eclipse.jst.pagedesigner.validation.caret.IPositionMediator;
-import org.eclipse.jst.pagedesigner.validation.caret.DropActionData.DropData;
-import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
-import org.eclipse.jst.pagedesigner.viewer.IDropLocationStrategy;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-
-/**
- * @author mengbo
- */
-public class ItemCreationEditPolicy extends DropEditPolicy 
-{
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editpolicies.AbstractEditPolicy#getCommand(org.eclipse.gef.Request)
-	 */
-	public Command getCommand(Request request) {
-		if (request instanceof ItemCreationRequest) {
-			ItemCreationRequest r = (ItemCreationRequest) request;
-			DesignPosition position = findPosition((ItemCreationRequest)request);
-            
-			if (position == null) {
-				return null;
-			}
-            IDOMPosition domposition = DOMPositionHelper.toDOMPosition(position);
-			if (domposition == null) {
-				return null;
-			}
-//			TagToolCreationAdapter tagToolCreationAdapter = new TagToolCreationAdapter(r.getTagToolPaletteEntry(), getViewer(getHost()).getModel());
-			return new CreateItemCommand(
-					PDPlugin
-							.getResourceString("ItemCreationEditPolicy.CommandLabel.CreateItem"),//$NON-NLS-1$
-					getViewer(getHost()).getModel(), domposition, r.getTagCreationProvider());
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editpolicies.AbstractEditPolicy#getTargetEditPart(org.eclipse.gef.Request)
-	 */
-	public EditPart getTargetEditPart(Request request) {
-		if (request instanceof ItemCreationRequest) {
-			DesignPosition position = findPosition((ItemCreationRequest)request);
-
-			if (position == null) {
-				return null;
-			}
-
-			EditPart container = position.getContainerPart();
-			return container;
-		}
-		return null;
-	}
-
-	/**
-	 * @param host
-	 * @return the graphical viewer
-	 */
-	protected IHTMLGraphicalViewer getViewer(EditPart host) {
-		return (IHTMLGraphicalViewer) ((GraphicalEditPart) host).getViewer();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editpolicies.AbstractEditPolicy#showTargetFeedback(org.eclipse.gef.Request)
-	 */
-	public void showTargetFeedback(Request request) 
-    {
-        if (request instanceof DropRequest 
-                && request.getType() == ItemCreationRequest.REQ_ITEM_CREATION)
-        {
-            super.showTargetFeedback(request);
-            if (getHost() instanceof GraphicalEditPart) {
-                ExposeHelper exposeHelper = new ExposeHelper(
-                        getViewer(getHost()));
-                exposeHelper.adjustVertical(((DropRequest)request).getLocation());
-            }
-        }
-	}
-
-	protected DesignPosition findPosition(DropRequest request) {
-        final IPositionMediator mediator = getDropChildValidator(request);
-        if (mediator == null)
-        {
-            return null;
-        }
-        
-        final IDropLocationStrategy dropStrategy = createDropLocationStrategy(request);
-        final DesignPosition position = 
-            dropStrategy.calculateDesignPosition(getHost(), request.getLocation(), mediator);
-        
-        // verify that the drop strategy has honoured it's contract that our
-        // mediator be respected
-        if (position != null)
-        {
-            if (!mediator.isValidPosition(position))
-            {
-                // if our mediator says no go, then veto the requestor
-                // there is no drop location
-                return null;
-            }
-        }
-        return position;
-    }
-
-    protected final IPositionMediator createDefaultDropChildValidator(DropData data) {
-        return new DnDPositionValidator(new DropActionData(
-                ActionData.PALETTE_DND, data));    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/ItemCreationRequest.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/ItemCreationRequest.java
deleted file mode 100644
index 317c243..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/ItemCreationRequest.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.itemcreation;
-
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.requests.DropRequest;
-import org.eclipse.jst.pagedesigner.editors.palette.IDropSourceData;
-import org.eclipse.jst.pagedesigner.editors.palette.ITagDropSourceData;
-
-/**
- * Tag tool item creation request class
- * 
- * @author mengbo
- */
-public class ItemCreationRequest extends Request implements DropRequest {
-	/**
-	 * Constant used for item creation request
-	 */
-	public static final String REQ_ITEM_CREATION = "Item Creation"; //$NON-NLS-1$
-	/**
-	 * Constant used for tag tool item
-	 */
-	private static final String DROP_SOURCE_DATA = "TagToolPaletteEntry"; //$NON-NLS-1$
-	/**
-	 * Constant used for location during creation request
-	 */
-	public static final String LOCATION = "location"; //$NON-NLS-1$
-	
-
-	/**
-	 * Constructor
-	 */
-	public ItemCreationRequest() {
-		super(REQ_ITEM_CREATION);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.requests.DropRequest#getLocation()
-	 */
-	public Point getLocation() {
-		return (Point)getExtendedData().get(LOCATION);
-	}
-
-	/**
-	 * Sets the location where the new object will be placed.
-	 * 
-	 * @param location
-	 *            the location
-	 */
-	public void setLocation(Point location) {
-		getExtendedData().remove(LOCATION);
-		getExtendedData().put(LOCATION, location);
-	}
-
-	/**
-	 * Set the tag tool item for creation request
-	 * @param creationProvider
-	 */
-	public void setTagCreationProvider(final IDropSourceData creationProvider) {
-		getExtendedData().remove(DROP_SOURCE_DATA);
-		getExtendedData().put(DROP_SOURCE_DATA, creationProvider);
-	}
-
-	/**
-	 * @return {@link ITagDropSourceData} requesting creation
-	 */
-	public IDropSourceData getTagCreationProvider() {
-		return (IDropSourceData)getExtendedData().get(DROP_SOURCE_DATA);
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/ItemCreationTool.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/ItemCreationTool.java
deleted file mode 100644
index 22ef94a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/ItemCreationTool.java
+++ /dev/null
@@ -1,299 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.itemcreation;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.SharedCursors;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.tools.TargetingTool;
-import org.eclipse.jst.pagedesigner.commands.CreateItemCommand;
-import org.eclipse.jst.pagedesigner.editors.palette.ITagDropSourceData;
-import org.eclipse.jst.pagedesigner.itemcreation.customizer.DropCustomizationController;
-import org.eclipse.swt.graphics.Cursor;
-
-/**
- * This Tool is used to create items. It is to replace the default CreationTool
- * of GEF. We are not using CreationToolEntry for creating item, since the
- * default GEF implementation require creating of the object before drop into
- * the view. We do not want to create the XML element (and possibly its taglib
- * declaration) before the drop is really performed.)
- * 
- * @author mengbo
- */
-public class ItemCreationTool extends TargetingTool {
-    private final ITagDropSourceData _tagDropSourceData; //can we get rid of this?
-
-	/**
-	 * Default constructor. Sets the default and disabled cursors.
-	 * @param tagDropSourceData 
-	 */
-	public ItemCreationTool(ITagDropSourceData tagDropSourceData) {
-		setDefaultCursor(SharedCursors.CURSOR_TREE_ADD);
-		setDisabledCursor(SharedCursors.NO);
-
-		this._tagDropSourceData = tagDropSourceData;  
-	}
-
-	/**
-	 * @see org.eclipse.gef.tools.AbstractTool#calculateCursor()
-	 */
-	protected Cursor calculateCursor() {
-		/*
-		 * Fix for Bug# 66010 The following two lines of code were added for the
-		 * case where a tool is activated via the keyboard (that code hasn't
-		 * been released yet). However, they were causing a problem as described
-		 * in 66010. Since the keyboard activation code is not being released
-		 * for 3.0, the following lines are being commented out.
-		 */
-		// if (isInState(STATE_INITIAL))
-		// return getDefaultCursor();
-		return super.calculateCursor();
-	}
-
-	/**
-	 * Creates a {@link ItemCreationRequest}and sets this tool's factory on the
-	 * request.
-	 * 
-	 * @see org.eclipse.gef.tools.TargetingTool#createTargetRequest()
-	 */
-	protected Request createTargetRequest() {
-		ItemCreationRequest request = new ItemCreationRequest();
-		request.setTagCreationProvider(_tagDropSourceData);
-		return request;
-	}
-
-	/**
-	 * @see org.eclipse.gef.Tool#deactivate()
-	 */
-	public void deactivate() {
-		super.deactivate();
-		// TODO: never read helper = null;
-	}
-
-	/**
-	 * @see org.eclipse.gef.tools.AbstractTool#getCommandName()
-	 */
-	protected String getCommandName() {
-		return ItemCreationRequest.REQ_ITEM_CREATION;
-	}
-
-	/**
-	 * Cast the target request to a CreateRequest and returns it.
-	 * 
-	 * @return the target request as a CreateRequest
-	 * @see TargetingTool#getTargetRequest()
-	 */
-	protected ItemCreationRequest getCreateRequest() {
-		return (ItemCreationRequest) getTargetRequest();
-	}
-
-	/**
-	 * @see org.eclipse.gef.tools.AbstractTool#getDebugName()
-	 */
-	protected String getDebugName() {
-		return "Item Creation Tool";//$NON-NLS-1$
-	}
-
-	/**
-	 * The creation tool only works by clicking mouse button 1 (the left mouse
-	 * button in a right-handed world). If any other button is pressed, the tool
-	 * goes into an invalid state. Otherwise, it goes into the drag state,
-	 * updates the request's location and calls
-	 * {@link TargetingTool#lockTargetEditPart(org.eclipse.gef.EditPart)}with the edit part
-	 * that was just clicked on.
-	 * 
-	 * @see org.eclipse.gef.tools.AbstractTool#handleButtonDown(int)
-	 */
-	protected boolean handleButtonDown(int button) {
-		if (button != 1) {
-			setState(STATE_INVALID);
-			handleInvalidInput();
-			return true;
-		}
-		if (stateTransition(STATE_INITIAL, STATE_DRAG)) {
-			if (getTargetEditPart() != null) {
-				getCreateRequest().setLocation(getLocation());
-				lockTargetEditPart(getTargetEditPart());
-				// Snap only when size on drop is employed
-				// TODO: never read helper = (SnapToHelper) getTargetEditPart().getAdapter(
-				//SnapToHelper.class);
-			}
-		}
-		return true;
-	}
-
-	/**
-	 * If the tool is currently in a drag or drag-in-progress state, it goes
-	 * into the terminal state, performs some cleanup (erasing feedback,
-	 * unlocking target edit part), and then calls {@link #performCreation(int)}.
-	 * 
-	 * @see org.eclipse.gef.tools.AbstractTool#handleButtonUp(int)
-	 */
-	protected boolean handleButtonUp(int button) 
-	{
-		if (stateTransition(STATE_DRAG | STATE_DRAG_IN_PROGRESS, STATE_TERMINAL)) 
-		{
-			eraseTargetFeedback();
-			unlockTargetEditPart();
-			
-			// customizer may cancel the drop
-			customizeDropAndMaybeExecute(button);
-		}
-		
-		setState(STATE_TERMINAL);
-		handleFinished();
-
-		return true;
-	}
-
-	/**
-     * @param button
-     */
-    protected void customizeDropAndMaybeExecute(final int button)
-    {
-        Command command = getCurrentCommand();
-
-        IStatus status = Status.OK_STATUS;
-        if (command instanceof CreateItemCommand)
-        {
-            status = new DropCustomizationController((CreateItemCommand) command,
-                    _tagDropSourceData, 
-                    ((CreateItemCommand)command).getDocument(),
-                    ((CreateItemCommand)command).getPosition()).
-                performCustomization();
-        }
-
-        if (status.getSeverity() == IStatus.OK)
-        {
-            performCreation(button);
-        }
-    }
-
-
-    /**
-	 * Updates the request, sets the current command, and asks to show feedback.
-	 * 
-	 * @see org.eclipse.gef.tools.AbstractTool#handleDragInProgress()
-	 */
-	protected boolean handleDragInProgress() {
-		if (isInState(STATE_DRAG_IN_PROGRESS)) {
-			updateTargetRequest();
-			setCurrentCommand(getCommand());
-			showTargetFeedback();
-		}
-		return true;
-	}
-
-	/**
-	 * @see org.eclipse.gef.tools.AbstractTool#handleDragStarted()
-	 */
-	protected boolean handleDragStarted() {
-		return stateTransition(STATE_DRAG, STATE_DRAG_IN_PROGRESS);
-	}
-
-	/**
-	 * If the user is in the middle of creating a new edit part, the tool erases
-	 * feedback and goes into the invalid state when focus is lost.
-	 * 
-	 * @see org.eclipse.gef.tools.AbstractTool#handleFocusLost()
-	 */
-	protected boolean handleFocusLost() {
-		if (isInState(STATE_DRAG | STATE_DRAG_IN_PROGRESS)) {
-			eraseTargetFeedback();
-			setState(STATE_INVALID);
-			handleFinished();
-			return true;
-		}
-		return false;
-	}
-
-	/**
-	 * @see org.eclipse.gef.tools.TargetingTool#handleHover()
-	 */
-	protected boolean handleHover() {
-		if (isInState(STATE_INITIAL))
-			updateAutoexposeHelper();
-		return true;
-	}
-
-	/**
-	 * Updates the request and mouse target, gets the current command and asks
-	 * to show feedback.
-	 * 
-	 * @see org.eclipse.gef.tools.AbstractTool#handleMove()
-	 */
-	protected boolean handleMove() {
-		updateTargetRequest();
-		updateTargetUnderMouse();
-		setCurrentCommand(getCommand());
-		showTargetFeedback();
-		return true;
-	}
-
-	/**
-	 * Executes the current command and selects the newly created object. The
-	 * button that was released to cause this creation is passed in, but since
-	 * {@link #handleButtonDown(int)}goes into the invalid state if the button
-	 * pressed is not button 1, this will always be button 1.
-	 * 
-	 * @param button
-	 *            the button that was pressed
-	 */
-	protected void performCreation(int button) {
-		executeCurrentCommand();
-		// selectAddedObject();
-	}
-
-	// /*
-	// * Add the newly created object to the viewer's selected objects.
-	// */
-	// private void selectAddedObject() {
-	// final Object model = getCreateRequest().getNewObject();
-	// if (model == null)
-	// return;
-	// EditPartViewer viewer = getCurrentViewer();
-	// Object editpart = viewer.getEditPartRegistry().get(model);
-	// if (editpart instanceof EditPart) {
-	// viewer.flush();
-	// viewer.select((EditPart)editpart);
-	// }
-	// }
-
-	/**
-	 * Sets the location (and size if the user is performing size-on-drop) of
-	 * the request.
-	 * 
-	 * @see org.eclipse.gef.tools.TargetingTool#updateTargetRequest()
-	 */
-	protected void updateTargetRequest() {
-		ItemCreationRequest req = getCreateRequest();
-		req.setLocation(getLocation());
-		// if (isInState(STATE_DRAG_IN_PROGRESS)) {
-		// Point loq = getStartLocation();
-		// req.setLocation(bounds.getLocation());
-		// req.getExtendedData().clear();
-		// if (!getCurrentInput().isAltKeyDown() && helper != null) {
-		// PrecisionRectangle baseRect = new PrecisionRectangle(bounds);
-		// PrecisionRectangle result = baseRect.getPreciseCopy();
-		// helper.snapRectangle(req, PositionConstants.NSEW,
-		// baseRect, result);
-		// req.setLocation(result.getLocation());
-		// req.setSize(result.getSize());
-		// }
-		// } else {
-		// req.setLocation(getLocation());
-		// }
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/UserCustomizedTagCreationAdvisor.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/UserCustomizedTagCreationAdvisor.java
deleted file mode 100644
index 3ff7ad0..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/UserCustomizedTagCreationAdvisor.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/**
- * 
- */
-package org.eclipse.jst.pagedesigner.itemcreation;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.itemcreation.command.ContainerCreationCommand;
-import org.eclipse.jst.pagedesigner.itemcreation.command.ElementCustomizationCommand;
-import org.eclipse.jst.pagedesigner.itemcreation.command.UserCustomizedContainerCreationCommand;
-import org.eclipse.jst.pagedesigner.itemcreation.command.UserCustomizedElementCustomizationCommand;
-import org.eclipse.jst.pagedesigner.itemcreation.customizer.ICustomizationData;
-import org.eclipse.jst.pagedesigner.itemcreation.customizer.ParentData;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.w3c.dom.Element;
-
-/**
- * Tag creation advisor that returns a new ElementCustomizationCommand
- * subclass that will perform customization of attributes, child tags and parent tags 
- * 
- * @author prusev
- * @author Debajit Adhikary
- */
-public class UserCustomizedTagCreationAdvisor extends DefaultTagCreationAdvisor {
-
-    /**
-     * Default
-     * @param creationData
-     */
-    public UserCustomizedTagCreationAdvisor(CreationData creationData) {
-        super(creationData);
-    }
-
-    /**
-     * @param model
-     * @param tagElement
-     * @return
-     * 
-     * Gives back the new command class.
-     */
-    protected ElementCustomizationCommand getElementCustomizationCommand(
-            IDOMModel model, Element tagElement) {
-        return new UserCustomizedElementCustomizationCommand(model, tagElement, _creationData);
-    }
-
-    
-    /** 
-     * Performs parent tag customization for the dropped tag. Chains any
-     * required container creation commands to ensure that the required parents
-     * are created.
-     * 
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jst.pagedesigner.itemcreation.DefaultTagCreationAdvisor#getContainerCreationCommand (org.eclipse.jst.pagedesigner.dom.IDOMPosition)
-     * 
-     */
-    @Override
-    protected ContainerCreationCommand getContainerCreationCommand(IDOMPosition position)
-    {
-        final IAdaptable adaptable = _creationData.getDropCustomizationData();
-        if (adaptable != null)
-        {
-            final ICustomizationData data = (ICustomizationData) adaptable.getAdapter(ICustomizationData.class);
-            ContainerCreationCommand command = null;
-            ParentData parentData = data.getParentData();
-            
-            boolean isFirstParent = true;
-            for (final ICustomizationData parentCustomizationData : parentData.getParentCustomizationData())
-            {
-                TagIdentifier parentTagIdentifier = parentCustomizationData.getTagIdentifier();
-                
-                if (isFirstParent) 
-                {
-                    command = new UserCustomizedContainerCreationCommand(position, parentTagIdentifier, _creationData.getTagId(), parentCustomizationData);
-                    isFirstParent = false;
-                }
-                else
-                {
-                    command.chain(new UserCustomizedContainerCreationCommand(position, parentTagIdentifier, _creationData.getTagId(), parentCustomizationData));
-                }
-            }
-            return command;
-        } 
-        return null;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/command/ContainerCreationCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/command/ContainerCreationCommand.java
deleted file mode 100644
index c7db6e3..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/command/ContainerCreationCommand.java
+++ /dev/null
@@ -1,144 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.itemcreation.command;
-
-import java.util.Collection;
-import java.util.Collections;
-
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.itemcreation.internal.AbstractCreationCommand;
-
-/**
- * Command for creating containers.
- * 
- *  * <p><b>Provisional API - subject to change</b></p>
- *  
- *  Clients may sub-class, but is preferable to use {@link SingletonContainerCreationCommand}
- *  or {@link TagContainerCreationCommand} instead.
- *  
- * @author cbateman
- *
- */
-public abstract class ContainerCreationCommand extends AbstractCreationCommand 
-{
-    private final IDOMPosition          _originalDomPosition;
-    private final TagIdentifier         _containerTag;
-    private final TagIdentifier         _tagBeingCreated;
-    private IDOMPosition                _domPosition;
-    private ContainerCreationCommand    _nextCommand = null;
-    
-    /**
-     * @param domPosition
-     * @param containerTag
-     */
-    /*package*/ ContainerCreationCommand(IDOMPosition domPosition, TagIdentifier containerTag, TagIdentifier tagBeingCreated)
-    {
-        _domPosition = domPosition;
-        _originalDomPosition = domPosition;
-        _containerTag = containerTag;
-        _tagBeingCreated = tagBeingCreated;
-    }
-    
-    @Override
-    public final void execute() 
-    {
-        _domPosition = doExecute();
-        
-        if (_nextCommand != null)
-        {
-            _nextCommand.setDomPosition(_domPosition);
-            _nextCommand.execute();
-            // update the dom position
-            _domPosition = _nextCommand.getDomPosition();
-        }
-    }
-
-    @Override
-    public final Collection<IDOMPosition> getResult() 
-    {
-        return Collections.singletonList(_domPosition);
-    }
-
-    /**
-     * @return the new dom position after the container insert
-     */
-    protected abstract IDOMPosition doExecute();
-
-    @Override
-    public final ContainerCreationCommand chain(Command command) 
-    {
-        if (!(command instanceof ContainerCreationCommand))
-        {
-            throw new IllegalArgumentException("Can only chain ContainerCreationCommand's"); //$NON-NLS-1$
-        }
-        
-        if (_nextCommand == null)
-        {
-            _nextCommand = (ContainerCreationCommand) command;
-        }
-        else
-        {
-            _nextCommand.chain(command);
-        }
-        
-        return this;
-    }
-
-    /**
-     * Update the domPosition
-     * 
-     * @param domPosition
-     */
-    public final void setDomPosition(final IDOMPosition domPosition)
-    {
-        if (_domPosition.getContainerNode().getOwnerDocument() == 
-                domPosition.getContainerNode().getOwnerDocument())
-        {
-            _domPosition = domPosition;
-        }
-        else
-        {
-            // if not in same document, then error
-            throw new IllegalArgumentException("New domPosition must be in same document as old domPosition"); //$NON-NLS-1$
-        }
-    }
-
-    /**
-     * @return the dom position
-     */
-    protected final IDOMPosition getDomPosition() {
-        return _domPosition;
-    }
-
-    /**
-     * @return the original dom position that this container creation command
-     * was created with.
-     */
-    protected final IDOMPosition getOriginalDomPosition() {
-        return _originalDomPosition;
-    }
-
-    /**
-     * @return the container tag to be created
-     */
-    protected final TagIdentifier getContainerTag() {
-        return _containerTag;
-    }
-
-    /**
-     * @return the tag that is being created for which we are adding the container
-     */
-    protected final TagIdentifier getTagBeingCreated() {
-        return _tagBeingCreated;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/command/ElementCustomizationCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/command/ElementCustomizationCommand.java
deleted file mode 100644
index 34b8ce1..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/command/ElementCustomizationCommand.java
+++ /dev/null
@@ -1,195 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.itemcreation.command;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.jst.jsf.core.internal.tld.CMUtil;
-import org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.TagCreationAttribute;
-import org.eclipse.jst.pagedesigner.editors.palette.ITagDropSourceData;
-import org.eclipse.jst.pagedesigner.editors.palette.MetadataTagDropSourceData;
-import org.eclipse.jst.pagedesigner.editors.palette.TagToolCreationAdapter;
-import org.eclipse.jst.pagedesigner.editors.palette.impl.PaletteElementTemplateHelper;
-import org.eclipse.jst.pagedesigner.itemcreation.CreationData;
-import org.eclipse.jst.pagedesigner.itemcreation.internal.AbstractCreationCommand;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.w3c.dom.Element;
-
-/**
- * A command to customize a new tag element
- * <p>
- * <b>Provisional API - subject to change</b>
- * </p>
- * 
- * Clients may sub-class.
- * 
- * @author cbateman
- * 
- */
-public class ElementCustomizationCommand extends AbstractCreationCommand
-{
-    /**
-     * the dom model where the element will be added
-     */
-    protected final IDOMModel _model;
-    /**
-     * the element to be customized
-     */
-    protected final Element _element;
-    /**
-     * the creation data for the new tag
-     */
-    protected final CreationData _creationData;
-
-    /**
-     * @param model
-     * @param element
-     * @param creationData
-     */
-    public ElementCustomizationCommand(final IDOMModel model,
-            final Element element, final CreationData creationData)
-    {
-        _model = model;
-        _element = element;
-        _creationData = creationData;
-    }
-
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.itemcreation.internal.AbstractCreationCommand#execute()
-     */
-    @Override
-    public void execute()
-    {
-        applyChildElementCustomization();
-        applyAttributeCustomization();
-    }
-
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.itemcreation.internal.AbstractCreationCommand#prepare()
-     */
-    @Override
-    protected boolean prepare()
-    {
-        // do nothing by default; return true to indicate can execute
-        return true;
-    }
-
-    /**
-     * Override to customize the children of the tag being created
-     * 
-     * Default implementation uses meta-data to load a template. This is the
-     * prefered method for static child values (i.e. those that are not
-     * calculated dynamically at runtime).
-     */
-    protected void applyChildElementCustomization()
-    {
-        final ITagDropSourceData tagDropSourceData = 
-            _creationData.getTagCreationProvider();
-        if (tagDropSourceData != null)
-        {
-            MetadataTagDropSourceData provider =
-                TagToolCreationAdapter.createMdTagCreationProvider(tagDropSourceData, _model);
-            PaletteElementTemplateHelper.applyTemplate(_model, _element,
-                    provider);
-        }
-    }
-
-    /**
-     * Add required attributes and default values, if set, to the created tag
-     * element
-     * 
-     * To customize the attributes that get added, use TagCreationInfo metadata
-     * 
-     * This method is provided as a utility for clients. It is not used by
-     * default
-     * 
-     * @param element
-     * @param creationData
-     */
-    @SuppressWarnings("deprecation")
-    protected final void ensureRequiredAttrs(final Element element,
-            final CreationData creationData)
-    {
-        final CMElementDeclaration ed = CMUtil.getTLDElementDeclaration(creationData
-                .getUri(), creationData.getTagName(), creationData.getModel()
-                .getDocument().getStructuredDocument());
-
-        if (ed != null)
-        {
-            for (final Iterator it = ed.getAttributes().iterator(); it.hasNext();)
-            {
-                final CMAttributeDeclaration attr = (CMAttributeDeclaration) it
-                        .next();
-                if (attr.getUsage() == CMAttributeDeclaration.REQUIRED
-                        && element.getAttribute(attr.getAttrName()) == null)
-                {
-                    element.setAttribute(attr.getAttrName(), attr
-                            .getDefaultValue());
-                }
-            }
-        }
-    }
-
-    /**
-     * Override to customize the attributes of the tag being created
-     * 
-     * Default implementation uses meta-data to set the attribut values. This is
-     * the prefered method for static attribute values (i.e. those that are not
-     * calculated dynamically at runtime).
-     * 
-     */
-    protected void applyAttributeCustomization()
-    {
-        final ITagDropSourceData info = _creationData.getTagCreationProvider();
-        if (info != null)
-        {
-            final MetadataTagDropSourceData provider =
-                TagToolCreationAdapter.createMdTagCreationProvider(info, _model);
-            final List<TagCreationAttribute> list = provider.getAttributes();
-            if (list != null)
-            {
-                for (final TagCreationAttribute attr : list)
-                {
-                    _element.setAttribute(attr.getId(),
-                            (attr.getValue() == null ? "" : attr.getValue())); //$NON-NLS-1$
-                }
-            }
-        }
-    }
-
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.itemcreation.internal.AbstractCreationCommand#chain(org.eclipse.emf.common.command.Command)
-     */
-    @Override
-    public final Command chain(final Command command)
-    {
-        return super.chain(command);
-    }
-
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.itemcreation.internal.AbstractCreationCommand#getResult()
-     */
-    @Override
-    public final Collection<Element> getResult()
-    {
-        return Collections.singletonList(_element);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/command/SingletonContainerCreationCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/command/SingletonContainerCreationCommand.java
deleted file mode 100644
index 5fa9f6e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/command/SingletonContainerCreationCommand.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.itemcreation.command;
-
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.utils.BodyHelper;
-import org.eclipse.jst.pagedesigner.validation.caret.JSFRootContainerPositionRule;
-import org.w3c.dom.Document;
-
-/**
- * Used to create a container that should only occur once per document. Typically
- * used for HTML body and JSF f:view tags.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * Clients may reference but not sub-class.
- * @author cbateman
- *
- */
-public final class SingletonContainerCreationCommand extends ContainerCreationCommand 
-{
-    private static final int  MAX_DEPTH_TO_SEARCH_FOR_CONTAINER = 10;
-
-    /**
-     * @param domPosition
-     * @param containerTag
-     * @param tagBeingCreated 
-     */
-    public SingletonContainerCreationCommand(IDOMPosition domPosition,
-            TagIdentifier containerTag, TagIdentifier tagBeingCreated) 
-    {
-        super(domPosition, containerTag, tagBeingCreated);
-    }
-
-    @Override
-    protected IDOMPosition doExecute() 
-    {
-       return insertSingletonIfNotPresent();
-    }
-    
-    private IDOMPosition insertSingletonIfNotPresent()
-    {
-        IDOMPosition domPosition = getDomPosition();
-        final TagIdentifier containerTag = getContainerTag();
-        final TagIdentifier tagBeingCreated = getTagBeingCreated();
-        
-        final Document document = EditModelQuery.getDocumentNode(domPosition
-                .getContainerNode());
-        
-        final boolean isContainerAlreadyPresent =
-            JSFRootContainerPositionRule.hasBasicContainers
-                (document, MAX_DEPTH_TO_SEARCH_FOR_CONTAINER);
-
-        if (isContainerAlreadyPresent) 
-        {
-            // if the container and element to be created are the same,
-            // then return null indicating to abort
-            if (containerTag.equals(tagBeingCreated))
-            {
-                domPosition =  null;
-            }
-            // otherwise, simply fall through keeping domPosition unchanged
-        }
-        // if the container isn't already present
-        else
-        {
-            
-            if (!containerTag.equals(tagBeingCreated)) 
-            {
-            // if the container is different and doesn't exist, then add it.
-                domPosition = BodyHelper.insertBody(domPosition, containerTag.asQName(), "f"); //$NON-NLS-1$
-            }
-            // otherwise, fall through leaving domPosition unchanged
-        }
-
-        return domPosition;
-    }
-
-    @Override
-    protected boolean prepare()
-    {
-        throw new UnsupportedOperationException("don't use"); //$NON-NLS-1$
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/command/TagContainerCreationCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/command/TagContainerCreationCommand.java
deleted file mode 100644
index fb2a23f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/command/TagContainerCreationCommand.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.itemcreation.command;
-
-import javax.xml.namespace.QName;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.internal.ResolverUtil;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.dom.ValidatorSupport;
-import org.eclipse.jst.pagedesigner.editors.palette.ITagDropSourceData;
-import org.eclipse.jst.pagedesigner.editors.palette.TagToolCreationAdapter;
-import org.eclipse.jst.pagedesigner.editors.palette.impl.PaletteItemManager;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-
-/**
- * @author cbateman
- * 
- *  * <p><b>Provisional API - subject to change</b></p>
- *  
- *  Clients may sub-class
- *
- */
-public class TagContainerCreationCommand extends ContainerCreationCommand {
-
-    /**
-     * @param domPosition
-     * @param containerTag
-     * @param tagBeingCreated
-     */
-    public TagContainerCreationCommand(IDOMPosition domPosition,
-            TagIdentifier containerTag, TagIdentifier tagBeingCreated) 
-    {
-        super(domPosition, containerTag, tagBeingCreated);
-    }
-
-    @Override
-    protected IDOMPosition doExecute() 
-    {
-        final IDOMPosition domPosition = getDomPosition();
-        final QName  containerQName = getContainerTag().asQName();
-        boolean hasform = ValidatorSupport.checkContainer(domPosition, containerQName);
-        IDOMPosition newPosition = domPosition;
-        if (!hasform)
-        {
-            final IDOMModel model = ((IDOMNode) domPosition.getContainerNode())
-                .getModel();
-            
-            final IFile fileForDocument = ResolverUtil.getFileForDocument(model.getStructuredDocument());            
-            final ITagDropSourceData creationProvider =
-                TagToolCreationAdapter.findProviderForContainer(containerQName, PaletteItemManager.createPaletteContext(fileForDocument));
-            newPosition = ValidatorSupport
-                    .insertContainer(domPosition, model, creationProvider, getContainerCustomizationData());
-            if (newPosition == null) {
-                newPosition = domPosition;
-            }
-        }
-        return newPosition;
-    }
-
-    /**
-     * Override to inject customization data into the tag creation
-     * @return a customization data for the container.
-     */
-    protected IAdaptable getContainerCustomizationData()
-    {
-        return null;
-    }
-    
-    @Override
-    protected final boolean prepare()
-    {
-        throw new UnsupportedOperationException("don't use"); //$NON-NLS-1$
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/command/UserCustomizedContainerCreationCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/command/UserCustomizedContainerCreationCommand.java
deleted file mode 100644
index 7cfbc8e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/command/UserCustomizedContainerCreationCommand.java
+++ /dev/null
@@ -1,90 +0,0 @@
-package org.eclipse.jst.pagedesigner.itemcreation.command;
-
-import javax.xml.namespace.QName;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.internal.ResolverUtil;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.dom.ValidatorSupport;
-import org.eclipse.jst.pagedesigner.editors.palette.ITagDropSourceData;
-import org.eclipse.jst.pagedesigner.editors.palette.TagToolCreationAdapter;
-import org.eclipse.jst.pagedesigner.editors.palette.impl.PaletteItemManager;
-import org.eclipse.jst.pagedesigner.itemcreation.customizer.ICustomizationData;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-
-/**
- * Tag container creation command for tags dropped on to the WPE by the user
- * 
- * @see TagContainerCreationCommand
- * 
- * @author Debajit Adhikary
- * 
- */
-public class UserCustomizedContainerCreationCommand extends
-        TagContainerCreationCommand
-{
-    /**
-     * Customization data for tag dropped
-     * 
-     * @see ICustomizationData
-     * @see IAdaptable
-     */
-    private final IAdaptable    _data;
-
-    
-    /**
-     * @param domPosition
-     *            Position in the DOM where the tag is to be inserted
-     * @param containerTag
-     *            Container tag
-     * @param tagBeingCreated
-     *            The tag which was dropped
-     * @param data
-     *            Customization data for the tag dropped
-     * 
-     * @see TagContainerCreationCommand#TagContainerCreationCommand(IDOMPosition, TagIdentifier, TagIdentifier)
-     */
-    public UserCustomizedContainerCreationCommand(IDOMPosition domPosition,
-            TagIdentifier containerTag, TagIdentifier tagBeingCreated, IAdaptable data)
-    {
-        super(domPosition, containerTag, tagBeingCreated);
-        _data = data;
-    }
-
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.itemcreation.command.TagContainerCreationCommand#getContainerCustomizationData()
-     */
-    @Override
-    protected IAdaptable getContainerCustomizationData()
-    {
-        return _data;
-    }
-
-    @Override
-    protected IDOMPosition doExecute()
-    {
-        final IDOMPosition domPosition = getDomPosition();
-        final QName containerQName = getContainerTag().asQName();
-
-        IDOMPosition newPosition = domPosition;
-        final IDOMModel model = ((IDOMNode) domPosition.getContainerNode())
-                .getModel();
-
-        final IFile fileForDocument = ResolverUtil.getFileForDocument(model.getStructuredDocument());    
-        final ITagDropSourceData creationProvider = TagToolCreationAdapter
-                .findProviderForContainer(containerQName, PaletteItemManager.createPaletteContext(fileForDocument));
-
-        newPosition = ValidatorSupport.insertContainer(domPosition,
-                model, creationProvider, getContainerCustomizationData());
-        if (newPosition == null)
-        {
-            newPosition = domPosition;
-        }
-
-        return newPosition;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/command/UserCustomizedElementCustomizationCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/command/UserCustomizedElementCustomizationCommand.java
deleted file mode 100644
index dcf6c5d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/command/UserCustomizedElementCustomizationCommand.java
+++ /dev/null
@@ -1,200 +0,0 @@
-package org.eclipse.jst.pagedesigner.itemcreation.command;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.jst.jsf.common.metadata.query.ITaglibDomainMetaDataModelContext;
-import org.eclipse.jst.jsf.common.metadata.query.TaglibDomainMetaDataQueryHelper;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.internal.ResolverUtil;
-import org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.TagCreationAttribute;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.dom.DOMPosition;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.editors.palette.ITagDropSourceData;
-import org.eclipse.jst.pagedesigner.editors.palette.MetadataTagDropSourceData;
-import org.eclipse.jst.pagedesigner.editors.palette.TagToolCreationAdapter;
-import org.eclipse.jst.pagedesigner.editors.palette.impl.PaletteItemManager;
-import org.eclipse.jst.pagedesigner.itemcreation.CreationData;
-import org.eclipse.jst.pagedesigner.itemcreation.customizer.ICustomizationData;
-import org.eclipse.jst.pagedesigner.utils.JSPUtil;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.w3c.dom.Element;
-
-/**
- * Added extra functionality to use the customization data to set tag attributes
- * based on user enter values from drop wizard display.
- * 
- * @author prusev
- * @author Debajit Adhikary
- * 
- */
-public class UserCustomizedElementCustomizationCommand extends
-        ElementCustomizationCommand
-{
-
-    /**
-     * @param model
-     * @param element
-     * @param creationData
-     */
-    public UserCustomizedElementCustomizationCommand(IDOMModel model,
-            Element element, CreationData creationData)
-    {
-        super(model, element, creationData);
-    }
-
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.itemcreation.command.ElementCustomizationCommand#execute()
-     */
-    @Override
-    public void execute()
-    {
-        super.execute();
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.itemcreation.command.ElementCustomizationCommand#applyChildElementCustomization()
-     */
-    @Override
-    protected void applyChildElementCustomization()
-    {
-        // TODO: Use this to get child information from metadata?
-        // super.applyChildElementCustomization();
-
-        // Get customization data
-        if (_creationData.getDropCustomizationData() != null)
-        {
-            final ICustomizationData data = (ICustomizationData) _creationData.getDropCustomizationData().getAdapter(ICustomizationData.class);
-//            
-//            if (data.getTextNodeData() != null) {
-//            	final Node textNode = _element.getOwnerDocument().createTextNode(data.getTextNodeData());
-//            	_element.appendChild(textNode);
-//            } 
-//            else 
-            if (data.getChildrenData() != null)
-            {
-                int childCount = 0;
-                CHILDREN_LOOP: for (ICustomizationData child : data.getChildrenData().getChildList())
-                {
-                    assert (_element.getOwnerDocument() != null);
-
-                    // Setup child node
-                    Element childNode = _element.getOwnerDocument().createElement(child.getTagIdentifier().getTagName());
-                    String prefix = JSPUtil.getOrCreatePrefix(_model, child.getTagIdentifier().getUri(), null);
-                    childNode.setPrefix(prefix);
-
-                    // Attach to child the attributes from the customization data 
-                    Map<String, String> attrMap = child.getAttributeData().getAttributes();
-                    for (String attrName : attrMap.keySet())
-                    {
-                        String attrValue = attrMap.get(attrName);
-                        childNode.setAttribute(attrName, attrValue);
-                    }
-
-                    // Attach child node to element
-                    _element.appendChild(childNode);
-
-                    // Set up other attributes and child tags for this child
-                    IFile fileForDocument = ResolverUtil.getFileForDocument(_model.getStructuredDocument());
-                    if (fileForDocument == null)
-                    {
-                        PDPlugin.log("File not found for model: "+_model.toString(), new Exception("Stack trace only"));  //$NON-NLS-1$ //$NON-NLS-2$
-                        continue CHILDREN_LOOP;
-                    }
-//                    final IProject project = fileForDocument.getProject();
-//                    PaletteItemManager itemManager = PaletteItemManager.getInstance(project);
-//                    PaletteItemManager itemManager = PaletteItemManager.getInstance(fileForDocument);
-//
-//                    if (itemManager == null)
-//                    {
-//                    	PDPlugin.log("paletteManager not found for file: "+fileForDocument.toString(), new Exception("Stack trace only")); //$NON-NLS-1$ //$NON-NLS-2$
-////                        PDPlugin.log("paletteManager not found for project: "+project.toString(), new Exception("Stack trace only")); //$NON-NLS-1$ //$NON-NLS-2$
-//                        continue CHILDREN_LOOP;
-//                    }
-
-                    final String uri = child.getTagIdentifier().getUri();
-                    final String tagName = child.getTagIdentifier().getTagName();
-                    final ITagDropSourceData creationProvider =
-                        TagToolCreationAdapter.findProviderForContainer(uri, tagName, PaletteItemManager.createPaletteContext(fileForDocument));
-                    final ITaglibDomainMetaDataModelContext modelContext = 
-                        TaglibDomainMetaDataQueryHelper
-                            .createMetaDataModelContext(fileForDocument.getProject(), child.getTagIdentifier().getUri());
-//                    		.createMetaDataModelContext(project, child.getTagIdentifier().getUri());
-                    IDOMPosition domPosition = new DOMPosition(_element, childCount++);
-                    CreationData creationData = new CreationData(creationProvider,_model, domPosition, modelContext, child);
-
-                    ElementCustomizationCommand command = new UserCustomizedElementCustomizationCommand(_model, childNode, creationData);
-                    command.execute();
-                }
-            }
-        }
-    }
-
-    /**
-     * Override to customize the attributes of the tag being created
-     * 
-     * Default implementation uses meta-data to set the attribute values. This
-     * is the preferred method for static attribute values (i.e. those that are
-     * not calculated dynamically at runtime).
-     * 
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jst.pagedesigner.itemcreation.command.ElementCustomizationCommand#applyAttributeCustomization()
-     */
-    protected void applyAttributeCustomization()
-    {
-        final Map<String, String> attributes = new HashMap<String, String>();
-        addAttributesFromPaletteMetadata(attributes);
-        addAttributesFromDropCustomization(attributes);
-        /*
-         * Added by Pete: Use the attribute data within the customization data
-         * container to configure the tag attributes
-         */
-        for (final Map.Entry<String, String> entry : attributes.entrySet())
-        {
-            _element.setAttribute(entry.getKey(), entry.getValue());
-        }
-    }
-
-    private void addAttributesFromDropCustomization(
-            Map<String, String> attributes)
-    {
-        if (_creationData.getDropCustomizationData() != null)
-        {
-            // Pull out the attribute data using the IAdaptable interface
-            ICustomizationData data = (ICustomizationData) _creationData
-                    .getDropCustomizationData().getAdapter(
-                            ICustomizationData.class);
-            Map<String, String> attrs = data.getAttributeData().getAttributes();
-            // Go through each attribute/value pair and configure it
-            for (String id : attrs.keySet())
-            {
-                attributes.put(id, attrs.get(id) == null ? "" : attrs.get(id)); //$NON-NLS-1$
-            }
-        }
-    }
-
-    private void addAttributesFromPaletteMetadata(Map<String, String> attributes)
-    {
-        final ITagDropSourceData info = _creationData.getTagCreationProvider();
-        if (info != null)
-        {
-            final MetadataTagDropSourceData provider =
-                TagToolCreationAdapter.createMdTagCreationProvider(info, _model);
-
-            final List<TagCreationAttribute> list = provider.getAttributes();
-            if (list != null)
-            {
-                for (final TagCreationAttribute attr : list)
-                {
-                    attributes.put(attr.getId(), (attr.getValue() == null ? "" //$NON-NLS-1$
-                            : attr.getValue()));
-                }
-            }
-        }
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/customizer/AbstractDropCustomizer.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/customizer/AbstractDropCustomizer.java
deleted file mode 100644
index 32a462c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/customizer/AbstractDropCustomizer.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.itemcreation.customizer;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-
-/**
- * Clients should extend to implement their own IDropCustomizer.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author cbateman
- *
- */
-
-public abstract class AbstractDropCustomizer implements IDropCustomizer 
-{
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.itemcreation.customizer.IDropCustomizer#getDropCustomizationData()
-     */
-    public IAdaptable getDropCustomizationData() 
-    {
-        return null;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.itemcreation.customizer.IDropCustomizer#runCustomizer()
-     */
-    public IStatus runCustomizer() 
-    {
-        return Status.OK_STATUS;
-    }
-    
-    public IStatus runCustomizer(final IFile file, final IDOMPosition position)
-    {
-        // backward compatibility: call the deprecated method to ensure that
-        // existing users are not broken
-        return runCustomizer();
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/customizer/AttributeData.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/customizer/AttributeData.java
deleted file mode 100644
index 834674b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/customizer/AttributeData.java
+++ /dev/null
@@ -1,72 +0,0 @@
-package org.eclipse.jst.pagedesigner.itemcreation.customizer;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * Class containing all the data that pertains to the customization
- * of a tag's attributes. 
- * 
- * @author prusev
- * @author Debajit Adhikary
- *
- */
-public class AttributeData {
-
-	private Map<String, String> attrs = new HashMap<String, String>();
-
-	
-	/**
-	 * Returns a map of the attributes (Name-Value pairs)
-	 * 
-	 * @return Map of attribute names and values
-	 * 
-	 */
-	public Map<String, String> getAttributes()
-	{
-		return attrs;
-	}
-
-	
-	/**
-	 * Sets the attribute data to the map of attribute names and values
-	 * provided.
-	 * 
-	 * @param attribs
-	 *            Map of attribute names and values
-	 * 
-	 */
-	public void setAttributes(Map<String, String> attribs)
-	{
-	    attrs.clear();
-	    attrs.putAll(attribs);
-	}
-
-	
-	/**
-	 * Adds an attribute.
-	 * 
-	 * @param attr
-	 *            Attribute name
-	 * @param userVal
-	 *            Attribute value
-	 * 
-	 */
-	public void addAttribute(String attr, String userVal)
-	{
-		attrs.put(attr, userVal);
-	}
-
-	/**
-	 * Returns the value for a given attribute name.
-	 * 
-	 * @param attr
-	 *            Attribute name whose value is to be found
-	 * @return Attribute value for the given attribute name
-	 * 
-	 */
-	public String getValForAttrib(String attr)
-	{
-		return attrs.get(attr);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/customizer/ChildrenData.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/customizer/ChildrenData.java
deleted file mode 100644
index dfdcca2..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/customizer/ChildrenData.java
+++ /dev/null
@@ -1,69 +0,0 @@
-package org.eclipse.jst.pagedesigner.itemcreation.customizer;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * The class containing any data that pertains to the customization of a tag's
- * children will be contained here. Currently, this is empty for this PoC
- * 
- * @author prusev
- * @author Debajit Adhikary
- * 
- */
-public class ChildrenData
-{
-    private List<ICustomizationData> childList;
-
-    
-    /**
-     * Default constructor
-     * 
-     */
-    public ChildrenData()
-    {
-        this.childList = new ArrayList<ICustomizationData>();
-    }
-
-    
-	/**
-	 * Constructor to initialize a ChildrenData object with a list of
-	 * customization data for the child tags
-	 * 
-	 * @param childList
-	 *            List of customization data objects for child tags
-	 * 
-	 */
-    public ChildrenData(List<ICustomizationData> childList)
-    {
-        this.childList = childList;
-    }
-
-    
-    /**
-     * @return the childList
-     */
-    public List<ICustomizationData> getChildList()
-    {
-        return childList;
-    }
-
-    
-    /**
-     * @param childList
-     *            the childList to set
-     */
-    public void setChildList(List<ICustomizationData> childList)
-    {
-        this.childList = childList;
-    }
-
-    
-    /**
-     * @param childData ChildData object to add 
-     */
-    public void add(ICustomizationData childData)
-    {
-        childList.add(childData);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/customizer/CustomizationDataImpl.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/customizer/CustomizationDataImpl.java
deleted file mode 100644
index 6495528..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/customizer/CustomizationDataImpl.java
+++ /dev/null
@@ -1,172 +0,0 @@
-package org.eclipse.jst.pagedesigner.itemcreation.customizer;
-
-
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-
-
-/**
- * Container class for all customization data collected from the tag wizard.
- * Through the Adaptable interface it will return the desired subdata piece such
- * as tag AttributeData.
- * 
- * @author prusev
- * @author Debajit Adhikary
- * 
- */
-
-public class CustomizationDataImpl implements IWritableCustomizationData
-{
-    private TagIdentifier tagIdentifier;
-    private AttributeData _attrs;
-    private ChildrenData childrenData;
-    private ParentData parentData;
-
-    
-	/**
-	 * Constructor.
-	 * 
-	 * @param target
-	 *            Tag identifier for the tag whose customization data this is
-	 * 
-	 */
-    public CustomizationDataImpl(final TagIdentifier target)
-    {
-        tagIdentifier = target;
-        _attrs = new AttributeData();
-        parentData = new ParentData();
-        childrenData = new ChildrenData();
-    }
-
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
-     */
-    public Object getAdapter(Class adapter)
-    {
-        if (ICustomizationData.class.equals(adapter))
-        {
-            return this;
-        }
-        
-        return null;
-    }
-
-    
-    //------------------------------------------------------------
-    // Methods to handle the tag identifier
-    //------------------------------------------------------------
-
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.itemcreation.customizer.ICustomizationData#getTagIdentifier()
-     */
-    public TagIdentifier getTagIdentifier()
-    {
-        return tagIdentifier;
-    }
-
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.itemcreation.customizer.IWritableCustomizationData#setTagIdentifier(org.eclipse.jst.jsf.common.dom.TagIdentifier)
-     */
-    public void setTagIdentifier(TagIdentifier tagId)
-    {
-        this.tagIdentifier = tagId;
-    }
-    
-    
-    //------------------------------------------------------------
-    // Methods to handle attributes
-    //------------------------------------------------------------
-
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.itemcreation.customizer.ICustomizationData#getAttributeData()
-     */
-    public final AttributeData getAttributeData()
-    {
-        return _attrs;
-    }
-
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.itemcreation.customizer.IWritableCustomizationData#setAttributes(org.eclipse.jst.pagedesigner.itemcreation.customizer.AttributeData)
-     */
-    public void setAttributes(AttributeData attrs)
-    {
-        _attrs = attrs;
-    }
-
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.itemcreation.customizer.IWritableCustomizationData#addAttribute(java.lang.String, java.lang.String)
-     */
-    public void addAttribute(String attributeName, String attributeValue)
-    {
-        getAttributeData().addAttribute(attributeName, attributeValue);
-    }
-
-    
-    //------------------------------------------------------------
-    // Methods to handle children
-    //------------------------------------------------------------
-
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.itemcreation.customizer.ICustomizationData#getChildrenData()
-     */
-    public final ChildrenData getChildrenData()
-    {
-        return childrenData;
-    }    
-
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.itemcreation.customizer.IWritableCustomizationData#setChildrenData(org.eclipse.jst.pagedesigner.itemcreation.customizer.ChildrenData)
-     */
-    public void setChildrenData(ChildrenData data)
-    {
-        childrenData = data;
-    }
-
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.itemcreation.customizer.IWritableCustomizationData#addChildrenData(org.eclipse.jst.pagedesigner.itemcreation.customizer.ICustomizationData)
-     */
-    public void addChildData (ICustomizationData childData)
-    {
-        getChildrenData().add(childData);
-    }
-    
-    
-    //------------------------------------------------------------
-    // Methods to handle parents
-    //------------------------------------------------------------
-    
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.itemcreation.customizer.ICustomizationData#getParentData()
-     */
-    public final ParentData getParentData()
-    {
-        return parentData;
-    }
-
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.itemcreation.customizer.IWritableCustomizationData#setParentData(org.eclipse.jst.pagedesigner.itemcreation.customizer.ParentData)
-     */
-    public void setParentData(ParentData parentData)
-    {
-        this.parentData = parentData;
-    }
-
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.itemcreation.customizer.IWritableCustomizationData#addParentData(org.eclipse.jst.pagedesigner.itemcreation.customizer.ICustomizationData)
-     */
-    public void addParentData (ICustomizationData parentData_)
-    {
-        getParentData().add(parentData_);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/customizer/DropCustomizationController.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/customizer/DropCustomizationController.java
deleted file mode 100644
index b1bd18e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/customizer/DropCustomizationController.java
+++ /dev/null
@@ -1,99 +0,0 @@
-package org.eclipse.jst.pagedesigner.itemcreation.customizer;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.internal.ResolverUtil;
-import org.eclipse.jst.jsf.core.internal.tld.TagIdentifierFactory;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.commands.ICustomizableCommand;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.editors.palette.IDropSourceData;
-import org.eclipse.jst.pagedesigner.editors.palette.ITagDropSourceData;
-import org.eclipse.jst.pagedesigner.elementedit.ElementEditFactoryRegistry;
-import org.eclipse.jst.pagedesigner.elementedit.IElementEdit;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
-
-/**
- * Not API -- Do not use
- * 
- * @author cbateman
- *
- */
-public final class DropCustomizationController
-{
-    private final ICustomizableCommand _command;
-    private final IDropSourceData  _dropSourceData;
-    private final IDOMDocument  _domDocument;
-    private final IDOMPosition _domPosition;
-
-    /**
-     * @param command
-     * @param dropSourceData 
-     * @param domDocument 
-     * @param domPosition 
-     */
-    public DropCustomizationController(final ICustomizableCommand command,
-            final IDropSourceData dropSourceData, final IDOMDocument domDocument, final IDOMPosition domPosition)
-    {
-        _command = command;
-        _dropSourceData = dropSourceData;
-        _domDocument = domDocument;
-        _domPosition = domPosition;
-    }
-
-    /**
-     * @return the result of the customization
-     */
-    public IStatus performCustomization()
-    {
-        String tagName = _dropSourceData.getId();
-        if (_dropSourceData instanceof ITagDropSourceData)
-        {
-            tagName = ((ITagDropSourceData)_dropSourceData).getTagName();
-        }
-        final TagIdentifier tagId = TagIdentifierFactory.createJSPTagWrapper(
-                _dropSourceData.getNamespace(), tagName);
-        final IElementEdit elementEdit = ElementEditFactoryRegistry.getInstance()
-                .createElementEdit(tagId);
-
-        IStatus status = Status.OK_STATUS;
-        if (elementEdit != null)
-        {
-            final IDropCustomizer customizer = elementEdit.getDropCustomizer(_dropSourceData);
-
-            if (customizer != null)
-            {
-                final IFile file = getFile(_domDocument);
-                if (file != null)
-                {
-                    status = customizer.runCustomizer(file, _domPosition);
-                }
-                else 
-                {
-                    PDPlugin.log("Could not find file.", new Exception("Not a real exception")); //$NON-NLS-1$ //$NON-NLS-2$
-                    status = Status.CANCEL_STATUS;
-                }
-
-                if (status.getSeverity() == IStatus.OK)
-                {
-                    _command.setCustomizationData(customizer
-                            .getDropCustomizationData());
-                }
-            }
-        }
-        return status;
-    }
-
-    private static IFile getFile(IDOMDocument domDoc)
-    {
-        final IStructuredDocument sdoc = domDoc.getStructuredDocument();
-        if (sdoc != null)
-        {
-            return ResolverUtil.getFileForDocument(sdoc);
-        }
-        return null;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/customizer/ICustomizationData.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/customizer/ICustomizationData.java
deleted file mode 100644
index 0a76ae0..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/customizer/ICustomizationData.java
+++ /dev/null
@@ -1,49 +0,0 @@
-package org.eclipse.jst.pagedesigner.itemcreation.customizer;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-
-/**
- * Represents a read-only customization data object. Customization data for a
- * tag includes its identifier, attribute data, child tag information and parent
- * tag information.
- * 
- * @see IWritableCustomizationData
- * 
- * @author prusev
- * @author Debajit Adhikary
- * 
- */
-public interface ICustomizationData extends IAdaptable  
-{
-    /**
-     * Returns the TagIdentifier for the tag whose customization data this is
-     * 
-     * @return the TagIdentifier 
-     */
-    public TagIdentifier getTagIdentifier();
-    
-    
-    /**
-     * Returns the parent data associated with this customization data
-     * 
-     * @return the attribute information for this customization data
-     */
-    public AttributeData getAttributeData();
-
-    
-    /**
-     * Returns the children data associated with this customization data
-     * 
-     * @return the ChildrenData for this customization data
-     */
-    public ChildrenData getChildrenData();
-
-    
-    /**
-     * Returns the parent data associated with this customization data
-     * 
-     * @return the parent data for this customization data 
-     */
-    public ParentData getParentData();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/customizer/IDropCustomizer.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/customizer/IDropCustomizer.java
deleted file mode 100644
index deca04e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/customizer/IDropCustomizer.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.itemcreation.customizer;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-
-/**
- * Interface used to declare an object that customizes tag creation data prior
- * to a drop.  The drop customizer should be used to ellicit data on per-drop basis.
- * 
- * Clients should not implement this interface.  Extend AbstractDropCustomizer instead.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * @author cbateman
- *
- */
-public interface IDropCustomizer 
-{
-    /**
-     * This is deprecated and is no longer called directly.  AbstractDropCustomizer
-     * will call this from runCustomizer(IFile) in the default case.
-     * 
-     * @return the status condition of the customizer
-     * @deprecated use runCustomizer(IFile, IDOMPosition) instead.
-     */
-    public IStatus runCustomizer();
-
-    /**
-     * Executed when the user performs a drop gesture for a tag, but before the
-     * command is dispatched to create the tag in the target document.  Implementers
-     * may do calculations or raise customization UI.  The return value is used
-     * to decide whether to continue.  Values other than OK and CANCEL are currently
-     * ignored.  If the return value has a severity of CANCEL, then the drop will
-     * be aborted.  If the return severity is OK, then getDropCustomizationData will
-     * be called and it's value will be passed to the ITagCreator framework through
-     * the CreationData object.
-     * 
-     * NOTE: This method may be called on the UI thread, although this is not guaranteed.
-     * Implementer should ensure that anything that is long-running (such as a dialog)
-     * is user-cancellable and that any UI code is run on the display thread.
-     * @param file 
-     * @param position the position in the target file where the new tag will be dropped
-     * 
-     * @return the status condition of the customizer
-     */
-
-    public IStatus runCustomizer(final IFile file, final IDOMPosition position);
-
-    /**
-     * @return the customization data.  This method will only be called after runCustomizer
-     * and only if runCustomizer returns IStatus.OK in its severity.  The adaptable will
-     * be passed to the ITagCreator framework through the CreationData value object.  You
-     * may return null even if runCustomizer() returns OK.
-     */
-    public IAdaptable getDropCustomizationData();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/customizer/IWritableCustomizationData.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/customizer/IWritableCustomizationData.java
deleted file mode 100644
index af9bd67..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/customizer/IWritableCustomizationData.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/**
- * 
- */
-package org.eclipse.jst.pagedesigner.itemcreation.customizer;
-
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-
-
-/**
- * Represents a writable customization data object.
- * 
- * @see ICustomizationData 
- * 
- * @author Debajit Adhikary
- *
- */
-public interface IWritableCustomizationData extends ICustomizationData
-{
-    //------------------------------------------------------------
-    // Methods to set the tag identifier information  
-    //------------------------------------------------------------
-
-    
-    /**
-     * Sets the tag identifier associated with a customization data object
-     * 
-     * @param tagId
-     *            The tag identifier to set it to
-     *            
-     */
-    public void setTagIdentifier(TagIdentifier tagId);
-    
-    
-    //------------------------------------------------------------
-    // Methods to set attribute data
-    //------------------------------------------------------------
-
-    
-    /**
-     * Sets the attribute data for an existing customization data object
-     * 
-     * @param attrs
-     *            The AttributeData object to set it to
-     *            
-     */
-    public void setAttributes(AttributeData attrs);
-
-    
-    /**
-     * Adds one attribute to an existing customization data object.
-     * 
-     * @param attributeName
-     *            The name of the attribute
-     * @param attributeValue
-     *            The value of this attribute
-     * 
-     */
-    public void addAttribute(String attributeName, String attributeValue);
-
-    
-    //------------------------------------------------------------
-    // Methods to set child data 
-    //------------------------------------------------------------
-    
-
-    /**
-     * Sets the child tag(s) customization information for an existing customization
-     * data object
-     * 
-     * @param data
-     *            The ChildrenData object to set it to
-     * 
-     */
-    public void setChildrenData(ChildrenData data);
-    
-    
-    /**
-     * Adds a child to an existing tag. (Adds the child's customization data to
-     * the existing tag's customization data)
-     * 
-     * @param childrenData
-     *            Customization Data for a child
-     * 
-     */
-    public void addChildData (ICustomizationData childrenData);
-
-    
-    //------------------------------------------------------------
-    // Methods to set parent customization data
-    //------------------------------------------------------------
-    
-    /**
-     * Sets parent customization information for an existing tag's customization
-     * data
-     * 
-     * @param parentData
-     *            The parent data to set it to
-     * 
-     */
-    public void setParentData(ParentData parentData);
-
-    
-    /**
-     * Attaches a parent to a tag (The customization data for a parent is added
-     * to the tag's customization data). The oldest parent (outermost container
-     * tag) should be attached (added) first.
-     * 
-     * @param parentData
-     *            Parent customization data
-     */
-    public void addParentData (ICustomizationData parentData);
-    
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/customizer/ParentData.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/customizer/ParentData.java
deleted file mode 100644
index e138685..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/customizer/ParentData.java
+++ /dev/null
@@ -1,65 +0,0 @@
-package org.eclipse.jst.pagedesigner.itemcreation.customizer;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Class to represent parent tag customization data for a tag. This information
- * is stored as a List of ICustomizationData objects, where each
- * ICustomizationData object belongs to one parent tag. (The outermost parent tag
- * (oldest ancestor) should be added first to this list)
- * 
- * @author Debajit Adhikary
- * 
- */
-public class ParentData
-{
-	/**
-	 * List of ICustomizationData objects to store parent tag information. The
-	 * outermost parent tag should be added first. 
-	 */
-	private List<ICustomizationData> parentList;
-
-    
-    /**
-     * Default constructor
-     * 
-     */
-    public ParentData ()
-    {
-        parentList = new ArrayList<ICustomizationData>();
-    }
-    
-    
-    /**
-	 * @param parentData
-	 *            Customization data to add for the parent tag
-	 *            
-	 */
-    public void add (ICustomizationData parentData)
-    {
-        this.parentList.add(parentData);
-    }
-
-    
-    /**
-	 * Returns the Parent customization data as a list of customization objects.
-	 * 
-	 * @return The parent customization data
-	 * 
-	 */
-    public List<ICustomizationData> getParentCustomizationData ()
-    {
-        return parentList;
-    }
-
-    
-    /**
-     * @param parentList List of ICustomizationData to set it to
-     * 
-     */
-    public void setParentCustomizationData (List<ICustomizationData> parentList)
-    {
-        this.parentList = parentList;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/internal/AbstractCreationCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/internal/AbstractCreationCommand.java
deleted file mode 100644
index 325c965..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/internal/AbstractCreationCommand.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.itemcreation.internal;
-
-import java.util.Collection;
-import java.util.Collections;
-
-import org.eclipse.emf.common.command.AbstractCommand;
-import org.eclipse.emf.common.command.Command;
-
-/**
- * Internal super-class of all tag creation commands.
- * 
- * @author cbateman
- *
- */
-public abstract class AbstractCreationCommand extends AbstractCommand implements
-        ICreationCommand 
-{
-    public abstract void execute(); 
-
-    public final void redo() 
-    {
-        throw new UnsupportedOperationException("don't use"); //$NON-NLS-1$
-    }
-
-    @Override
-    public final boolean canExecute() 
-    {
-        return super.canExecute();
-    }
-
-    @Override
-    public final boolean canUndo() {
-        return super.canUndo();
-    }
-
-    @Override
-    public Command chain(Command command) {
-        if (command instanceof ICreationCommand)
-        {
-            return super.chain(command);
-        }
-        throw new IllegalArgumentException("command must an ICreationCommand"); //$NON-NLS-1$
-    }
-
-    @Override
-    public final void dispose() 
-    {
-        throw new UnsupportedOperationException("don't use"); //$NON-NLS-1$
-    }
-
-    @Override
-    public final Collection<?> getAffectedObjects() {
-        return super.getAffectedObjects();
-    }
-
-    @Override
-    public final String getDescription() 
-    {
-        return super.getDescription();
-    }
-
-    @Override
-    public final String getLabel() 
-    {
-        return super.getLabel();
-    }
-
-    @Override
-    public Collection<?> getResult() 
-    {
-        return Collections.EMPTY_LIST;
-    }
-
-    @Override
-    protected abstract boolean prepare(); 
-
-    @Override
-    public final void setDescription(String description) 
-    {
-        super.setDescription(description);
-    }
-
-    @Override
-    public final void setLabel(String label) 
-    {
-        super.setLabel(label);
-    }
-
-    @Override
-    public final void undo() 
-    {
-        // for now, there is no undo
-        super.undo();
-    }
-
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/internal/DefaultTagCreator.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/internal/DefaultTagCreator.java
deleted file mode 100644
index bcb087c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/internal/DefaultTagCreator.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.itemcreation.internal;
-
-import org.eclipse.jst.pagedesigner.itemcreation.AbstractTagCreator;
-import org.eclipse.jst.pagedesigner.itemcreation.CreationData;
-import org.eclipse.jst.pagedesigner.itemcreation.ITagCreationAdvisor;
-
-/**
- * {@link org.eclipse.jst.pagedesigner.itemcreation.ITagCreator} used by the Web Page Editor palette. 
- * 
- * Uses org.eclipse.jst.jsf.common.metadata 
- */
-public class DefaultTagCreator extends AbstractTagCreator 
-{
-
-    @Override
-    protected ITagCreationAdvisor doSelectCreationAdvisor(
-            CreationData creationData) {
-        // return null by default. This causes the default advisor to be used.
-        return null;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/internal/ICreationCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/internal/ICreationCommand.java
deleted file mode 100644
index bc2f25d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/internal/ICreationCommand.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.itemcreation.internal;
-
-
-/**
- * Implemented by commands that do tag model creation.  NOTE: this interface is highly provisional
- * and mainly exists to provide a facade to the future use of an existing Command infrastructure:
- * probably the EMF commands.  We haven't decided yet so it is important that:
- * 
- * This interface should NOT be implemented by clients
- * 
- * @author cbateman
- *
- */
-public interface ICreationCommand 
-{
-    // tagging interface only
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/internal/TagCreationFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/internal/TagCreationFactory.java
deleted file mode 100644
index 948ed45..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/internal/TagCreationFactory.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.itemcreation.internal;
-
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.elementedit.ElementEditFactoryRegistry;
-import org.eclipse.jst.pagedesigner.elementedit.IElementEdit;
-import org.eclipse.jst.pagedesigner.itemcreation.AbstractTagCreator;
-import org.eclipse.jst.pagedesigner.itemcreation.ITagCreator;
-
-/**
- * Creates instances of
- * {@link org.eclipse.jst.pagedesigner.itemcreation.ITagCreator}s 
- * (Eventually) Will use TagCreavtorFactories registered using
- * org.eclipse.jst.jsf.pagedesigner.tagcreationfactories ext-pt. Currently only
- * using DefaultTagCreator.
- */
-public class TagCreationFactory
-{
-    private static TagCreationFactory INSTANCE = null;
-
-    /**
-     * @return singleton instance
-     */
-    public synchronized static TagCreationFactory getInstance()
-    {
-        if (INSTANCE == null)
-        {
-            INSTANCE = new TagCreationFactory();
-        }
-        return INSTANCE;
-    }
-
-    /**
-     * Using the TagToolPaletteEntry, locate the factory to use for tag creation
-     * 
-     * @param tagId
-     * 
-     * @return ITagCreator
-     */
-    public ITagCreator createTagCreator(final TagIdentifier tagId)
-    {
-
-        IElementEdit elementEdit = ElementEditFactoryRegistry.getInstance()
-                .createElementEdit(tagId);
-
-        if (elementEdit != null)
-        {
-            // for (ITagCreatorFactory factory : factories)
-            // {
-            ITagCreator tagCreator = null;
-            try
-            {
-                tagCreator = elementEdit.getTagCreator(tagId);
-            }
-            catch (Exception e)
-            {
-                PDPlugin.getLogger(getClass()).error(
-                        "Error.ProblemLoadingTagCreatorFactory", //$NON-NLS-1$
-                        elementEdit.getClass().toString(), e);
-            }
-
-            if (tagCreator != null)
-            {
-                if (tagCreator instanceof AbstractTagCreator)
-                {
-                    return tagCreator;
-                }
-                // if non-null, skipped, log the issue
-                PDPlugin.getLogger(getClass()).error(
-                        "Error.ProblemLoadingTagCreatorFactory", //$NON-NLS-1$
-                        "Tag creator must extend AbstractTagCreator", //$NON-NLS-1$
-                        new Throwable());
-            }
-        }
-
-        // all else fails, use the internal default
-        return new DefaultTagCreator();
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/internal/TagCreatorFactoryRegistryReader.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/internal/TagCreatorFactoryRegistryReader.java
deleted file mode 100644
index ea06009..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/internal/TagCreatorFactoryRegistryReader.java
+++ /dev/null
@@ -1,203 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.itemcreation.internal;
-
-
-/**
- * A registry reader that lazy initializes a list of uri-sensitive
- * extensions
- * 
- * @author cbateman
- *
- */
-public final class TagCreatorFactoryRegistryReader 
-{
-    // TODO: move this logic into the ElementEditFacRegistryReader
-//    private static Map<String, List<ITagCreatorFactory>> _handlers = null;
-//
-//    /**
-//     * @param uri the uri to get a list of factories for
-//     * @return all available handers for the ext-pt
-//     */
-//    public static synchronized List<ITagCreatorFactory> getAllHandlers(final String uri) 
-//    {
-//        if (_handlers == null) {
-//            _handlers = readAllHandlers();
-//        }
-//        return _handlers.get(uri);
-//    }
-//
-//    private static Map<String, List<ITagCreatorFactory>> readAllHandlers() 
-//    {
-//        final Map<String, List<ExtElement>>  map = 
-//            new HashMap<String, List<ExtElement>>();
-//
-//        IExtensionPoint extensionPoint = Platform.getExtensionRegistry()
-//                .getExtensionPoint(PDPlugin.getPluginId(),
-//                        IJMTConstants.TAG_CREATOR_FACTORY_EXT_NAME);
-//        IExtension[] extensions = extensionPoint.getExtensions();
-//
-//        for (int i = 0; i < extensions.length; i++) 
-//        {
-//            IExtension ext = extensions[i];
-//            IConfigurationElement[] tagCreationHandlers = ext
-//                    .getConfigurationElements();
-//
-//            for (int j = 0; j < tagCreationHandlers.length; j++) {
-//                if (tagCreationHandlers[j].getName().equals(
-//                        IJMTConstants.TAG_CREATOR_FACTORY_ELEMENT_NAME)) 
-//                {
-//                    try
-//                    {
-//                        final ExtElement extElement = 
-//                            new ExtElement(tagCreationHandlers[j]);
-//                        List<ExtElement> elements = 
-//                            map.get(extElement.getUri());
-//                        
-//                        if (elements == null)
-//                        {
-//                            elements = new ArrayList<ExtElement>();
-//                            map.put(extElement.getUri(), elements);
-//                        }
-//                        
-//                        elements.add(extElement);
-//                    }
-//                    catch (CoreException ce)
-//                    {
-//                        PDPlugin.getLogger(ExtElement.class)
-//                            .error("Error.ProblemLoadingExtensionPoint", ce);
-//                    }
-//                }
-//            }
-//        }
-//        
-//        final Map<String, List<ITagCreatorFactory>> handlers = 
-//            new HashMap<String, List<ITagCreatorFactory>>();
-//        
-//        // now loop through the extensions, looking for collisions
-//        // on the same uri
-//        for (String uri : map.keySet())
-//        {
-//            List<ExtElement>  elements = map.get(uri);
-//            
-//            if (elements.size() > 1)
-//            {
-//                Collections.sort(elements);
-//                
-//                MultiStatus chainedStatus = new MultiStatus(PDPlugin.getPluginId(), 0, "Collision detected in ITagCreatorFactory extensions for uri: "+uri+". Factories will be queried in the following order with the first contender to provide a ITagCreator winning",
-//                        new Throwable());
-//                
-//                for (ExtElement element : elements)
-//                {
-//                    IStatus status = 
-//                        new Status(IStatus.WARNING, PDPlugin.getPluginId(), element.getClassName());
-//                    chainedStatus.add(status);
-//                }
-//                
-//                PDPlugin.log(chainedStatus);
-//            }
-//            
-//            List<ITagCreatorFactory>  factories = 
-//                new ArrayList<ITagCreatorFactory>();
-//
-//            for (ExtElement element : elements)
-//            {
-//                factories.add(element.getFactoryInstance());
-//            }
-//            
-//            handlers.put(uri, factories);
-//        }
-//
-//        return handlers;
-//    }
-//
-//    private static class ExtElement implements Comparable<ExtElement>
-//    {
-//        private final IConfigurationElement  _element;
-//        
-//        private final ITagCreatorFactory  _factoryInstance;
-//        
-//        ExtElement(IConfigurationElement element) throws CoreException
-//        {
-//            _element = element;
-//            
-//            final String uri = getUri();
-//            final String factory = getClassName();
-//            
-//            if (uri == null || factory == null)
-//            {
-//                throw new CoreException(new Status(IStatus.ERROR,PDPlugin.getPluginId(), "uri and factory must not be null: uri="+uri+", factory="+factory));
-//            }
-//            
-//            Object obj = _element.createExecutableExtension("factory");
-//
-//            if (obj instanceof ITagCreatorFactory) 
-//            {
-//                _factoryInstance = (ITagCreatorFactory) obj;
-//            }
-//            else
-//            {
-//                throw new CoreException(new Status(IStatus.ERROR,PDPlugin.getPluginId(), "Factory must be instanceof ITagCreatorFactory"));
-//            }
-//        }
-//
-//        /**
-//         * @return the uri
-//         */
-//        public String getUri() {
-//            return _element.getAttribute("uri");
-//        }
-//
-//        /**
-//         * @return the class name
-//         */
-//        public String getClassName() {
-//            return _element.getAttribute("factory");
-//        }
-//
-//        /**
-//         * @return the factory instance or null
-//         */
-//        public ITagCreatorFactory getFactoryInstance() 
-//        {
-//            return _factoryInstance;
-//        }
-//
-//        /* 
-//         * Two elements compare by the canonical comparision of their
-//         * contributor's bundle name string
-//         */
-//        public int compareTo(ExtElement o)
-//        {
-//            return _element.getContributor().getName().compareTo
-//                (o._element.getContributor().getName());
-//        }
-//
-//        @Override
-//        public boolean equals(Object obj) 
-//        {
-//            // ensure that x.equals(y) iff x.compareTo(y) == 0
-//            if (obj instanceof ExtElement)
-//            {
-//                return compareTo((ExtElement) obj) == 0;
-//            }
-//            
-//            return false;
-//        }
-//
-//        @Override
-//        public int hashCode() 
-//        {
-//            // ensure that x.equals(y) => x.hashCode == y.hashCode
-//            return _element.getContributor().getName().hashCode();
-//        }
-//    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/internal/UserCustomizedTagCreator.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/internal/UserCustomizedTagCreator.java
deleted file mode 100644
index a6cef41..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/internal/UserCustomizedTagCreator.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/**
- * 
- */
-package org.eclipse.jst.pagedesigner.itemcreation.internal;
-
-import org.eclipse.jst.pagedesigner.itemcreation.CreationData;
-import org.eclipse.jst.pagedesigner.itemcreation.ITagCreationAdvisor;
-import org.eclipse.jst.pagedesigner.itemcreation.UserCustomizedTagCreationAdvisor;
-
-/**
- * Tag creation advisor that returns a new ElementCustomizationCommand
- * subclass that will perform customization of attributes, child tags and parent tags 
- * 
- * @author prusev
- *
- */
-public class UserCustomizedTagCreator extends DefaultTagCreator {
-
-	/**
-	 * 
-	 */
-	public UserCustomizedTagCreator()
-	{
-		// empty
-	}
-	
-    @Override
-    protected ITagCreationAdvisor doSelectCreationAdvisor(CreationData creationData) {
-        // Return a new tag creation advisor
-        return new UserCustomizedTagCreationAdvisor(creationData);
-    }
-	
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/AttributeDescriptor.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/AttributeDescriptor.java
deleted file mode 100644
index 0b809fc..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/AttributeDescriptor.java
+++ /dev/null
@@ -1,236 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.meta;
-
-import java.util.HashMap;
-import java.util.Map;
-import java.util.StringTokenizer;
-
-import org.eclipse.jst.jsf.common.ui.internal.utils.StringUtil;
-
-/**
- * @author mengbo
- * @deprecated
- */
-public class AttributeDescriptor implements IAttributeDescriptor {
-	private String _attributeName;
-
-	private String _category;
-
-	private String _valueType;
-
-	private String _typeParameter;
-
-	private String _labelString;
-
-	private String _defaultValue;
-
-	private String _description;
-
-	private Map _parameterMap;
-
-	private Map _options;
-
-	private boolean _required;
-
-	/**
-	 * 
-	 */
-	public AttributeDescriptor() {
-		super();
-	}
-
-	/**
-	 * @param attrName
-	 */
-	public AttributeDescriptor(String attrName) {
-		this.setAttributeName(attrName);
-	}
-
-	/**
-	 * @param attributeName
-	 */
-	public void setAttributeName(String attributeName) {
-		this._attributeName = attributeName;
-	}
-
-	/**
-	 * @param category
-	 */
-	public void setCategory(String category) {
-		this._category = category;
-	}
-
-	/**
-	 * @param valueType
-	 */
-	public void setValueType(String valueType) {
-		this._valueType = valueType;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.cm.IAttributeDescriptor#getAttributeName()
-	 */
-	public String getAttributeName() {
-		return _attributeName;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.cm.IAttributeDescriptor#getDescription()
-	 */
-	public String getDescription() {
-		return _description;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.cm.IAttributeDescriptor#getCategory()
-	 */
-	public String getCategory() {
-		return _category;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.cm.IAttributeDescriptor#getValueType()
-	 */
-	public String getValueType() {
-		return _valueType;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.cm.IAttributeDescriptor#getOptions()
-	 */
-	public Map getOptions() {
-		return _options;
-	}
-
-	/**
-	 * @param description
-	 */
-	public void setDescription(String description) {
-		_description = description;
-	}
-
-	/**
-	 * @param map
-	 * @param defaultValue
-	 */
-	public void setOptions(Map map, String defaultValue) {
-		_options = map;
-		_defaultValue = defaultValue;
-	}
-
-	/**
-	 * @return Returns the typeParameter.
-	 */
-	public String getTypeParameter() {
-		return _typeParameter;
-	}
-
-	/**
-	 * @param typeParameter
-	 *            The typeParameter to set.
-	 */
-	public void setTypeParameter(String typeParameter) {
-		this._typeParameter = typeParameter;
-		_parameterMap = null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.meta.IAttributeDescriptor#getLabelString()
-	 */
-	public String getLabelString() {
-		if (_labelString == null) {
-			_labelString = StringUtil.splitVariable(getAttributeName());
-		}
-		return _labelString;
-	}
-
-	/**
-	 * @param labelString
-	 *            The labelString to set.
-	 */
-	public void setLabelString(String labelString) {
-		this._labelString = labelString;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.meta.IAttributeDescriptor#getParameterByName(java.lang.String)
-	 */
-	public String getParameterByName(String name) {
-		if (_parameterMap == null) {
-			parseParameter();
-		}
-		Object value = _parameterMap.get(name);
-		return value == null ? "" : value.toString(); //$NON-NLS-1$
-	}
-
-	/**
-	 * 
-	 */
-	private void parseParameter() {
-		_parameterMap = new HashMap();
-		if (_typeParameter == null) {
-			return;
-		}
-		StringTokenizer tokenizer = new StringTokenizer(_typeParameter, "||"); //$NON-NLS-1$
-		while (tokenizer.hasMoreTokens()) {
-			String parameterEntry = tokenizer.nextToken();
-			int index = parameterEntry.indexOf('=');
-			if (index != -1) {
-				_parameterMap.put(parameterEntry.substring(0, index),
-						parameterEntry.substring(index + 1));
-			}
-		}
-	}
-
-	public String getDefaultValue() {
-		return _defaultValue;
-	}
-
-	/**
-	 * @param value
-	 */
-	public void setDefaultValue(String value) {
-		_defaultValue = value;
-	}
-
-	public boolean isRequired() {
-		return _required;
-	}
-
-	/**
-	 * @param required
-	 */
-	public void setRequired(boolean required) {
-		this._required = required;
-	}
-	
-	public String toString(){
-		StringBuffer buf = new StringBuffer("AttributeDescriptor: "); //$NON-NLS-1$
-		buf.append(this.getAttributeName());
-		return buf.toString();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/BindingHandlerDelegate.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/BindingHandlerDelegate.java
deleted file mode 100644
index bace305..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/BindingHandlerDelegate.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.meta;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.utils.StructuredModelUtil;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-
-/**
- * @author mengbo
- * @version 1.5
- * @deprecated
- */
-public class BindingHandlerDelegate implements IBindingHandler {
-	private static final String BINDING_DISABLED_IMAGE_FILE = "PD_Binding_disabled.gif"; //$NON-NLS-1$
-	private static final String BINDING_IMAGE_FILE = "PD_Binding.gif"; //$NON-NLS-1$
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.meta.IBindingHandler#handleBinding(org.eclipse.swt.widgets.Shell,
-	 *      org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode,
-	 *      org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement,
-	 *      java.lang.String)
-	 */
-	public String handleBinding(Shell shell, IDOMNode ancester,
-			IDOMElement element, String currentValue) {
-		IBindingHandler handler = getDelegatedHandler(ancester, element);
-		if (handler != null) {
-			return handler
-					.handleBinding(shell, ancester, element, currentValue);
-		}
-        return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.meta.IBindingHandler#isEnabled(org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode,
-	 *      org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement)
-	 */
-	// public boolean isEnabled(IDOMNode ancester, IDOMElement element)
-	// {
-	// IBindingHandler handler = getDelegatedHandler(ancester, element);
-	// return (handler == null) ? false : handler.isEnabled(ancester, element);
-	// }
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.meta.IBindingHandler#isEnabled(org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode,
-	 *      org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement,
-	 *      java.lang.String, java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.meta.IAttributeDescriptor)
-	 */
-	public boolean isEnabled(IDOMNode ancester, IDOMElement element,
-			String uri, String tagName, IAttributeDescriptor attr) {
-		IBindingHandler handler = getDelegatedHandler(ancester, element);
-		return (handler == null) ? false : handler.isEnabled(ancester, element,
-				uri, tagName, attr);
-	}
-
-//	public boolean isEnabled(IDOMNode ancester, IDOMElement element,
-//			IPropertyPageDescriptor attr) {
-//		IBindingHandler handler = getDelegatedHandler(ancester, element);
-//		return (handler == null) ? false : handler.isEnabled(ancester, element,
-//				attr);
-//	}
-	
-	
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.meta.IBindingHandler#getImage()
-	 */
-	public Image getImage() {
-		return PDPlugin.getDefault().getImage(BINDING_IMAGE_FILE);
-	}
-
-	public Image getDisabledImage() {
-		return PDPlugin.getDefault().getImage(BINDING_DISABLED_IMAGE_FILE);
-	}
-
-	private IBindingHandler getDelegatedHandler(IDOMNode ancester,
-			IDOMElement element) {
-		IProject project = getProject(ancester, element);
-		if (project != null) {
-			Object obj = project.getAdapter(IBindingHandler.class);
-			if (obj instanceof IBindingHandler) {
-				return (IBindingHandler) obj;
-			}
-		}
-
-		return null;
-	}
-
-	private IProject getProject(IDOMNode ancester, IDOMElement element) {
-		IDOMModel model = getModel(ancester, element);
-		if (model != null) {
-			return StructuredModelUtil.getProjectFor(model);
-		}
-        return null;
-	}
-
-	private IDOMModel getModel(IDOMNode ancester, IDOMElement element) {
-		if (ancester != null) {
-			return ancester.getModel();
-		} else if (element != null) {
-			return element.getModel();
-		} else {
-			return null;
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/DefaultEditorCreator.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/DefaultEditorCreator.java
deleted file mode 100644
index 2275079..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/DefaultEditorCreator.java
+++ /dev/null
@@ -1,256 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.meta;
-
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.pagedesigner.editors.properties.IPropertyPageDescriptor;
-import org.eclipse.jst.pagedesigner.meta.internal.CellEditorFactoryRegistry;
-import org.eclipse.jst.pagedesigner.ui.dialogfields.DialogFieldWrapper;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class DefaultEditorCreator extends EditorCreator {
-	static IPropertyPageDescriptor _staticAttr;
-
-	static IDOMElement _staticElement;
-
-	//static IBindingHandler _staticHandler;
-
-	static CellEditorHolder _staticHolder;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.meta.EditorCreator#createCellEditor(org.eclipse.swt.widgets.Composite,
-	 *      org.eclipse.jst.pagedesigner.meta.IPropertyPageDescriptor,
-	 *      org.w3c.dom.Element)
-	 */
-	public CellEditor createCellEditor(Composite parent,
-			IPropertyPageDescriptor attr, IDOMElement element) {
-		return CellEditorFactoryRegistry.getInstance().createCellEditor(parent,
-				attr, element);
-	}
-
-//	/*
-//	 * (non-Javadoc)
-//	 * 
-//	 * @see org.eclipse.jst.pagedesigner.meta.EditorCreator#createDialogField(org.eclipse.jst.pagedesigner.meta.IPropertyPageDescriptor)
-//	 */
-//	public DialogField createDialogField(IPropertyPageDescriptor attr) {
-//		return CellEditorFactoryRegistry.getInstance().createDialogField(attr);
-//	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.meta.EditorCreator#createCellEditorWithWrapper(org.eclipse.swt.widgets.Composite,
-	 *      org.eclipse.jst.pagedesigner.meta.IPropertyPageDescriptor,
-	 *      org.w3c.dom.Element,
-	 *      org.eclipse.jst.pagedesigner.meta.IBindingHandler,
-	 *      org.eclipse.swt.graphics.Image)
-	 */
-	@SuppressWarnings("deprecation")
-    public CellEditor createCellEditorWithWrapper(Composite parent,
-			IPropertyPageDescriptor attr, final IDOMElement element,
-			IBindingHandler handler1) {
-//		final IBindingHandler handler = (handler1 == null ? getSystemDefaultBindingHandler()
-//				: handler1);
-//		String uri = CMUtil.getElementNamespaceURI(element);
-//		String tagName = element.getLocalName();
-		
-		return createCellEditor(parent, attr, element);
-//		
-//		if (!handler.isEnabled(element, element, uri, tagName, attr)) {
-//			// should not enabled, so directly return original cell editor
-//			return createCellEditor(parent, attr, element);
-//		}
-//		try {
-//			// since "createWrappedCellEditor()" and "getBindingImage()" is
-//			// called from the constructor of CellEditorWrapper, at that time,
-//			// can't reference this DefaultEditorCreator and final fields yet,
-//			// so use static variable for it.
-//			_staticAttr = attr;
-//			_staticElement = element;
-//			_staticHandler = handler;
-//
-//			return new CellEditorWrapper(parent) {
-//				/*
-//				 * (non-Javadoc)
-//				 * 
-//				 * @see org.eclipse.jst.pagedesigner.properties.celleditors.CellEditorWrapper#createWrappedCellEditor(org.eclipse.swt.widgets.Composite)
-//				 */
-//				protected CellEditor createWrappedCellEditor(Composite cell) {
-//					return EditorCreator.getInstance().createCellEditor(cell,
-//							_staticAttr, _staticElement);
-//				}
-//
-//				/*
-//				 * (non-Javadoc)
-//				 * 
-//				 * @see org.eclipse.jst.pagedesigner.properties.celleditors.CellEditorWrapper#openDialogBox(org.eclipse.swt.widgets.Control)
-//				 */
-//				protected Object openDialogBox(Control cellEditorWindow) {
-//					return handler.handleBinding(cellEditorWindow.getShell(),
-//							element, element, convertToString(this.getValue()));
-//				}
-//
-//				/*
-//				 * (non-Javadoc)
-//				 * 
-//				 * @see org.eclipse.jst.pagedesigner.properties.celleditors.CellEditorWrapper#getBindingImage()
-//				 */
-//				protected Image getBindingImage() {
-//					return _staticHandler.getImage();
-//				}
-//			};
-//		} finally {
-//			_staticAttr = null;
-//			_staticElement = null;
-//			_staticHandler = null;
-//			_staticHolder = null;
-//		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.meta.EditorCreator#createCellEditorWithWrapper(org.eclipse.swt.widgets.Composite,
-	 *      org.eclipse.jst.pagedesigner.meta.IPropertyPageDescriptor,
-	 *      org.eclipse.jst.pagedesigner.meta.EditorCreator.CellEditorHolder,
-	 *      org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement,
-	 *      org.eclipse.jst.pagedesigner.meta.IBindingHandler)
-	 */
-	@SuppressWarnings("deprecation")
-    public CellEditor createCellEditorWithWrapper(Composite parent,
-			IPropertyPageDescriptor attr, CellEditorHolder holder,
-			final IDOMElement element, IBindingHandler handler1) {
-//		final IBindingHandler handler = (handler1 == null ? getSystemDefaultBindingHandler()
-//				: handler1);
-//		String uri = CMUtil.getElementNamespaceURI(element);
-//		String tagName = element.getLocalName();
-		
-		return holder.createCellEditor(parent);
-		
-//		if (!handler.isEnabled(element, element, uri, tagName, attr)) {
-//			// should not enabled, so directly return original cell editor
-//			return holder.createCellEditor(parent);
-//		}
-//		try {
-//			// since "createWrappedCellEditor()" and "getBindingImage()" is
-//			// called from the constructor of CellEditorWrapper, at that time,
-//			// can't reference this DefaultEditorCreator and final fields yet,
-//			// so use static variable for it.
-//			_staticElement = element;
-//			_staticHandler = handler;
-//			_staticHolder = holder;
-//
-//			return new CellEditorWrapper(parent) {
-//				/*
-//				 * (non-Javadoc)
-//				 * 
-//				 * @see org.eclipse.jst.pagedesigner.properties.celleditors.CellEditorWrapper#createWrappedCellEditor(org.eclipse.swt.widgets.Composite)
-//				 */
-//				protected CellEditor createWrappedCellEditor(Composite cell) {
-//					return _staticHolder.createCellEditor(cell);
-//				}
-//
-//				/*
-//				 * (non-Javadoc)
-//				 * 
-//				 * @see org.eclipse.jst.pagedesigner.properties.celleditors.CellEditorWrapper#openDialogBox(org.eclipse.swt.widgets.Control)
-//				 */
-//				protected Object openDialogBox(Control cellEditorWindow) {
-//					return handler.handleBinding(cellEditorWindow.getShell(),
-//							element, element, convertToString(this.getValue()));
-//				}
-//
-//				/*
-//				 * (non-Javadoc)
-//				 * 
-//				 * @see org.eclipse.jst.pagedesigner.properties.celleditors.CellEditorWrapper#getBindingImage()
-//				 */
-//				protected Image getBindingImage() {
-//					return _staticHandler.getImage();
-//				}
-//			};
-//		} finally {
-//			_staticAttr = null;
-//			_staticElement = null;
-//			_staticHandler = null;
-//			_staticHolder = null;
-//		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.meta.EditorCreator#createDialogFieldWithWrapper(java.lang.String,
-	 *      java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.meta.IPropertyPageDescriptor,
-	 *      org.eclipse.jst.pagedesigner.meta.IBindingHandler)
-	 */
-	@SuppressWarnings("deprecation")
-    public DialogField createDialogFieldWithWrapper(String uri, String tagName,
-			IPropertyPageDescriptor attr, IBindingHandler handler1) {
-		final IBindingHandler handler = (handler1 == null ? getSystemDefaultBindingHandler()
-				: handler1);
-		DialogField field = createDialogField(attr);
-		// if (field instanceof StringButtonDialogField)
-		// {
-		// ((StringButtonDialogField) field).setButtonLabel("...");
-		// }
-		DialogFieldWrapper wrapper = new DialogFieldWrapper(field, handler
-				.getImage(), handler.getDisabledImage(), uri, tagName, attr,
-				handler);
-		wrapper.setDatabindingEnabled(true);
-
-		return wrapper;
-	}
-
-
-//	private String convertToString(Object value) {
-//		if (value == null) {
-//			return null;
-//		}
-//        return value.toString();
-//	}
-
-	@SuppressWarnings("deprecation")
-    @Override
-	public DialogField createDialogFieldWithWrapper(
-			IPropertyPageDescriptor attr, IBindingHandler handler1) {
-		final IBindingHandler handler = (handler1 == null ? getSystemDefaultBindingHandler()
-				: handler1);
-		DialogField field = createDialogField(attr);
-		// if (field instanceof StringButtonDialogField)
-		// {
-		// ((StringButtonDialogField) field).setButtonLabel("...");
-		// }
-		DialogFieldWrapper wrapper = new DialogFieldWrapper(field, handler
-				.getImage(), handler.getDisabledImage(), attr.getUri(), attr.getTagName(), attr,
-				handler);
-		wrapper.setDatabindingEnabled(true);
-
-		return wrapper;
-	}
-
-	@Override
-	public DialogField createDialogField(IPropertyPageDescriptor attr) {
-		return CellEditorFactoryRegistry.getInstance().createDialogField(attr);		
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/EditorCreator.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/EditorCreator.java
deleted file mode 100644
index a6d6bb6..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/EditorCreator.java
+++ /dev/null
@@ -1,155 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.meta;
-
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.pagedesigner.editors.properties.IPropertyPageDescriptor;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public abstract class EditorCreator {
-	static EditorCreator _instance;
-
-	@SuppressWarnings("deprecation")
-    static IBindingHandler _defaultHandler = new BindingHandlerDelegate();
-
-	/**
-	 * 
-	 */
-	public static interface CellEditorHolder {
-		/**
-		 * @param parent
-		 * @return the cell editor
-		 */
-		public CellEditor createCellEditor(Composite parent);
-	}
-
-	/**
-	 * Create a dialog field without databinding using the specified attribute
-	 * descriptor.
-	 * 
-	 * @param attr
-	 * @return DialogField
-	 */
-	public abstract DialogField createDialogField(IPropertyPageDescriptor attr);
-
-	/**
-	 * Create a dialog field that will have databinding support. Basically, this
-	 * method will create a normal dialog field using the attribute descriptor,
-	 * then make a wrapper on it.
-	 * 
-	 * @param uri
-	 *            the namespace uri
-	 * @param tagName
-	 *            the local tag name
-	 * @param attr
-	 * @param handler
-	 *            if null, system default mechanism will be used.
-	 * @return DialogField
-	 */
-	@SuppressWarnings("deprecation")
-    public abstract DialogField createDialogFieldWithWrapper(String uri,
-			String tagName, IPropertyPageDescriptor attr, IBindingHandler handler);
-
-
-	/**
-	 * @param descriptor
-	 * @param handler
-	 * @return the dialog field
-	 */
-	@SuppressWarnings("deprecation")
-    public abstract DialogField createDialogFieldWithWrapper(IPropertyPageDescriptor descriptor, IBindingHandler handler);
-//	
-//	/**
-//	 * Create a dialog field that will have databinding support. Basically, this
-//	 * method will create a normal dialog field using the attribute descriptor,
-//	 * then make a wrapper on it.
-//	 *
-//	 * @param uri
-//	 *            the namespace uri
-//	 * @param tagName
-//	 *            the local tag name
-//	 * @param attrName
-//	 * @param handler
-//	 *            if null, system default mechanism will be used.
-//	 * @return DialogField
-//	 */
-//	public abstract DialogField createDialogFieldWithWrapper(String uri,
-//			String tagName, String attrName, IBindingHandler handler);
-	/**
-	 * Create a cell editor.
-	 * 
-	 * @param parent
-	 * @param attr
-	 * @param element
-	 * @return CellEditor
-	 */
-	public abstract CellEditor createCellEditor(Composite parent,
-			IPropertyPageDescriptor attr, IDOMElement element);
-
-	/**
-	 * Create a cell editor that will have databinding support.
-	 * 
-	 * @param parent
-	 * @param attr
-	 * @param element
-	 * @param handler
-	 *            if null, system default mechanism will be used.
-	 * @return CellEditor
-	 */
-	@SuppressWarnings("deprecation")
-    public abstract CellEditor createCellEditorWithWrapper(Composite parent,
-			IPropertyPageDescriptor attr, IDOMElement element,
-			IBindingHandler handler);
-
-	/**
-	 * Create a cell edtior that will have databinding support. This method
-	 * don't provide an attribute descriptor, but it provide a CellEditorHolder
-	 * to create whatever normal cell editor it wants.
-	 * 
-	 * @param parent
-	 * @param attr
-	 *            could be null
-	 * @param holder
-	 * @param element
-	 * @param handler
-	 *            if null, system default mechanism will be used.
-	 * @return CellEditor
-	 */
-	@SuppressWarnings("deprecation")
-    public abstract CellEditor createCellEditorWithWrapper(Composite parent,
-			IPropertyPageDescriptor attr, CellEditorHolder holder,
-			IDOMElement element, IBindingHandler handler);
-
-	/**
-	 * @return the singleton instance
-	 */
-	public static EditorCreator getInstance() {
-		if (_instance == null) {
-			_instance = new DefaultEditorCreator();
-		}
-		return _instance;
-	}
-
-	/**
-	 * @return the binding handler
-	 */
-	@SuppressWarnings("deprecation")
-    public IBindingHandler getSystemDefaultBindingHandler() {
-		return _defaultHandler;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/IAttributeDescriptor.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/IAttributeDescriptor.java
deleted file mode 100644
index 91f5f27..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/IAttributeDescriptor.java
+++ /dev/null
@@ -1,125 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.meta;
-
-import java.util.Map;
-
-/**
- * 
- * @author mengbo
- * @deprecated
- */
-public interface IAttributeDescriptor {
-	/**
-	 * suffix
-	 */
-	final String PARAMETER_SUFFIX = "suffix"; //$NON-NLS-1$
-
-	/**
-	 * style
-	 */
-	final String PARAMETER_STYLE = "style"; //$NON-NLS-1$
-
-	/**
-	 * super type
-	 */
-	final String PARAMETER_SUPER_TYPE = "superType"; //$NON-NLS-1$
-
-	/**
-	 * separator
-	 */
-	final String PARAMETER_SEPARATOR = "separator"; //$NON-NLS-1$
-
-	/**
-	 * default
-	 */
-	final String PARAMETER_DEFAULT = "default"; //$NON-NLS-1$
-
-	/**
-	 * get the name of the attribute.
-	 * 
-	 * @return the attribute name
-	 */
-	public String getAttributeName();
-
-	/**
-	 * Returns a brief description of this property. This localized string is
-	 * shown to the user when this property is selected. and it is used as
-	 * tooltip of the property now.
-	 * 
-	 * @return a brief description, or <code>null</code> if none
-	 */
-	public String getDescription();
-
-	/**
-	 * return the category for this attribute.
-	 * 
-	 * @return the category
-	 */
-	public String getCategory();
-
-	/**
-	 * value type is used to construct the cell editor.
-	 * 
-	 * @return the value type
-	 */
-	public String getValueType();
-
-	/**
-	 * Some value type contains additional parameter information. For example,
-	 * if valueType is CLASSNAME, the typeParameter could be super
-	 * interface/super class name.
-	 * 
-	 * NOTE: if valueType is ENUMERATION, caller should use
-	 * <code>getOptions()</code>
-	 * 
-	 * @return null if there is no type parameter.
-	 */
-	public String getTypeParameter();
-
-	/**
-	 * @param name
-	 * @return the parameter
-	 */
-	public String getParameterByName(String name);
-
-	/**
-	 * when the value type is "enumeration", this method will be called to
-	 * construct the drop downlist.
-	 * 
-	 * The Map will be (key->display string)
-	 * 
-	 * @return the options
-	 */
-	public Map getOptions();
-
-	/**
-	 * Gets the default value of Options
-	 * 
-	 * @return the default value
-	 */
-	public String getDefaultValue();
-
-	/**
-	 * A human readable string as the label of the attribute.
-	 * 
-	 * @return the label
-	 */
-	public String getLabelString();
-
-	/**
-	 * Indicate whether the attribute is required.
-	 * 
-	 * @return true if is required
-	 */
-	public boolean isRequired();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/IAttributeRuntimeValueType.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/IAttributeRuntimeValueType.java
deleted file mode 100644
index 8a9512c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/IAttributeRuntimeValueType.java
+++ /dev/null
@@ -1,189 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.meta;
-
-/**
- * Enumeration of core attribute-value-runtime-types.
- * Not to be implemented by clients.
- */
-public interface IAttributeRuntimeValueType {
-	// shared for html and jsf
-	/**
-	 * 
-	 */
-	static final String prefix1 = "org.eclipse.jst.jsf.core.attributevalues."; //$NON-NLS-1$
-	/**
-	 * 
-	 */
-	static final String prefix2 = "org.eclipse.jst.pagedesigner.attributevalues."; //$NON-NLS-1$
-	
-	/**
-	 * 
-	 */
-	public static final String BASE = prefix1+"BaseType"; //$NON-NLS-1$
-	
-	/**
-	 * 
-	 */
-	public static final String CSSSTYLE = prefix1+"CSSStyleType"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String CSSCLASS = prefix1+"CSSClassType"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String CSSID = prefix1+"CSSIdType"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String STRING = prefix1+"StringType"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String BOOLEAN = prefix1+"BooleanType"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String RELATIVEPATH = prefix1+"RelativePathType"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String WEBPATH = prefix1+"WebPathType"; //FIXME //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String COLOR = prefix1+"ColorType"; //$NON-NLS-1$
-
-//	public static final String NAMED_BOOLEAN = prefix1+"NAMED-BOOLEAN";
-	
-	/**
-	 * 
-	 */
-	public static final String LONG = prefix1+"LongType"; //$NON-NLS-1$
-	
-	/**
-	 * 
-	 */
-	public static final String INTEGER = prefix1+"IntegerType"; //$NON-NLS-1$
-	
-	/**
-	 * 
-	 */
-	public static final String DOUBLE = prefix1+"DoubleType"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String METHODBINDING = prefix1+"MethodBindingType"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String JAVACLASS = prefix1+"JavaClassType"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String SCRIPT = prefix1+"ScriptType"; //$NON-NLS-1$
-
-//	public static final String PROPERTYBINDING = prefix1+"PROPERTYBINDING";
-	
-	/**
-	 * 
-	 */
-	public static final String VALUE = prefix1+"ValueType"; //$NON-NLS-1$
-	
-	/**
-	 * 
-	 */
-	public static final String VALUEBINDING = prefix1+"ValueBindingType"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String TIMEZONE = prefix1+"TimeZoneType"; //$NON-NLS-1$
-	
-	/**
-	 * 
-	 */
-	public static final String ACTION = prefix1+"ActionType"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String CLASSPATH_RESOURCE = prefix1+"CLASSPATH_RESOURCE"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String CURRENCYCODE = prefix1+"CurrencyCodeType"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String LINK = prefix1+"LinkType"; //$NON-NLS-1$
-	
-	/**
-	 * 
-	 */
-	public static final String LOCALE = prefix1+"LocaleType"; //$NON-NLS-1$
-
-//	public static final String MULTICHOICE = prefix1+"MULTICHOICE";
-	
-	/**
-	 * 
-	 */
-	public static final String FACESCONFIGIDENTIFIER = prefix1+"FacesConfigIdentifierType"; //$NON-NLS-1$
-	
-	/**
-	 * 
-	 */
-	public static final String FACESCONFIGVALIDATORID = prefix1+"FacesConfigValidatorIDType"; //$NON-NLS-1$
-	
-	/**
-	 * 
-	 */
-	public static final String FACESCONFIGCONVERTERID = prefix1+"FacesConfigConverterIDType"; //$NON-NLS-1$
-	
-	/**
-	 * 
-	 */
-	public static final String COMPONENTBINDING = prefix1+"ComponentBindingType"; //$NON-NLS-1$
-	
-	/**
-	 * 
-	 */
-	public static final String COMPONENTID = prefix1+"ComponentIDType"; //$NON-NLS-1$
-	
-	/**
-	 * 
-	 */
-	public static final String LENGTH = prefix1+"LengthType"; //$NON-NLS-1$
-	
-	/**
-	 * 
-	 */
-	public static final String RESOURCEBUNDLE = prefix1+"ResourceBundleType"; //$NON-NLS-1$
-	
-	/**
-	 * 
-	 */
-	public static final String LANGUAGECODE = prefix1+"LanguageCodeType"; //$NON-NLS-1$
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/IBindingHandler.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/IBindingHandler.java
deleted file mode 100644
index 514cb41..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/IBindingHandler.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.meta;
-
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-
-/**
- * @author mengbo
- * @version 1.5
- * @deprecated
- */
-public interface IBindingHandler {
-	/**
-	 * This handler should open a dialog to accept user input.
-	 * 
-	 * @param shell
-	 * @param ancester
-	 * @param element
-	 * @param currentValue
-	 * @return null means user canceled the operation.
-	 */
-	public String handleBinding(Shell shell, IDOMNode ancester,
-			IDOMElement element, String currentValue);
-
-	/**
-	 * Whether should the binding be enabled for the specified element context.
-	 * element could be null.
-	 * 
-	 * @param ancester
-	 * @param element
-	 * @param uri
-	 * @param tagName
-	 * @param attr
-	 *            could be null.
-	 * @return true if is enabled
-	 */
-	public boolean isEnabled(IDOMNode ancester, IDOMElement element,
-			String uri, String tagName, IAttributeDescriptor attr);
-
-	
-//	public boolean isEnabled(IDOMNode ancester, IDOMElement element,
-//			IPropertyPageDescriptor attr);
-	
-	/**
-	 * given the meta data of an attribute, to see whether should enable binding
-	 * handler for it.
-	 * 
-	 * @param uri
-	 * @param tagName
-	 * @param attr
-	 * @return
-	 */
-	// public boolean isEnabled(String uri, String tagName, IAttributeDescriptor
-	// attr);
-	/**
-	 * Image used for the small button.
-	 * 
-	 * @return the image
-	 */
-	public Image getImage();
-
-	/**
-	 * @return the image indicating disablement
-	 */
-	public Image getDisabledImage();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/ITagAttributeCellEditorFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/ITagAttributeCellEditorFactory.java
deleted file mode 100644
index 363f858..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/ITagAttributeCellEditorFactory.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.meta;
-
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.pagedesigner.editors.properties.IPropertyPageDescriptor;
-import org.eclipse.swt.widgets.Composite;
-import org.w3c.dom.Element;
-
-/**
- * Factory for creating CellEditors and DialogFields to edit element attributes.
- */
-public interface ITagAttributeCellEditorFactory {
-	/**
-	 * create cell editor
-	 * 
-	 * @param parent
-	 * @param attr
-	 * @param ele
-	 * @return null means failed to create cell editor
-	 */
-	public CellEditor createCellEditor(Composite parent,
-			IPropertyPageDescriptor attr, Element ele);
-
-	/**
-	 * Normally, the DialogField for an attribute may appear in the following
-	 * places.
-	 * <ol>
-	 * <li>In the Quick Editor properties view, used to edit an element.
-	 * <li>In a dialog to edit an element
-	 * <li>In a dialog, to create an element
-	 * </ol>
-	 * 
-	 * It is the caller's responsibility to add valueChanged listener to the
-	 * dialog field to decide how to apply the value.
-	 * 
-	 * It is also the caller's responsibility to set the initial value of the
-	 * field.
-	 * 
-	 * The field should always be an instanceof <code>ISupportTextValue</code>,
-	 * it could also optionally implement <code>IElementContextable</code>
-	 * 
-	 * @param attr
-	 *            the attribute descriptor, meta data
-	 * @return A dialog field. null means this factory can't create one.
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.ISupportTextValue
-	 */
-	public DialogField createDialogField(IPropertyPageDescriptor attr);
-
-	/**
-	 * The attribute runtime value types supported by this factory.
-	 * 
-	 * @return null means this factory can behave as default factory.
-	 */
-	public String[] getSupportedValueTypes();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/internal/CategoryNameComparator.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/internal/CategoryNameComparator.java
deleted file mode 100644
index 2a438b3..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/internal/CategoryNameComparator.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.meta.internal;
-
-import java.util.Comparator;
-import java.util.HashSet;
-
-/**
- * Sorts categories and ensures that @see{ITabbedPropertiesConstants.OTHER_CATEGORY} comes last
- * @author mengbo
- */
-public class CategoryNameComparator implements Comparator {
-	static HashSet _pairs = new HashSet();
-
-	private final static CategoryNameComparator _instance = new CategoryNameComparator();
-
-	static class Pair {
-		String s1;
-
-		String s2;
-
-		Pair(String a, String b) {
-			s1 = a;
-			s2 = b;
-		}
-
-		public int hashCode() {
-			return s1.hashCode() + s2.hashCode();
-		}
-
-		public boolean equals(Object o) {
-			if (o instanceof Pair) {
-				Pair p = (Pair) o;
-				return s1.equals(p.s1) && s2.equals(p.s2);
-			}
-			return false;
-		}
-	}
-
-	/**
-	 * @param s1
-	 * @param s2
-	 */
-	public static void addPair(String s1, String s2) {
-		_pairs.add(new Pair(s1, s2));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)
-	 */
-	public int compare(Object o1, Object o2) {
-		if (o1.equals(o2))
-			return 0;
-
-		//Below code sorted OTHER category ("Attributes") to the bottom
-		//Commenting out as it just looks strange
-//		if (ITabbedPropertiesConstants.OTHER_CATEGORY.equals(o1))
-//			return 1;
-//		if (ITabbedPropertiesConstants.OTHER_CATEGORY.equals(o2))
-//			return -1;
-
-//		Pair p = new Pair((String) o1, (String) o2);
-//		if (_pairs.contains(p))
-//			return -1;
-		return ((String)o1).compareTo(((String)o2));
-	}
-
-	/**
-	 * @return the instance
-	 */
-	public static CategoryNameComparator getInstance() {
-		return _instance;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/internal/CellEditorFacRegistryReader.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/internal/CellEditorFacRegistryReader.java
deleted file mode 100644
index 72e8938..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/internal/CellEditorFacRegistryReader.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.meta.internal;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtension;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jst.pagedesigner.IJMTConstants;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.meta.ITagAttributeCellEditorFactory;
-
-/**
- * Read the registry to find out all the CellEditorFactory.
- * 
- * @author mengbo
- */
-public class CellEditorFacRegistryReader {
-	static ITagAttributeCellEditorFactory[] _factories = null;
-
-	/**
-	 * @return ITagAttributeCellEditorFactory[]
-	 */
-	public static synchronized ITagAttributeCellEditorFactory[] getAllFactories() {
-		if (_factories == null) {
-			_factories = readAllFactories();
-		}
-		return _factories;
-
-	}
-
-	private static ITagAttributeCellEditorFactory[] readAllFactories() {
-		List result = new ArrayList();
-		IExtensionPoint extensionPoint = Platform.getExtensionRegistry()
-				.getExtensionPoint(PDPlugin.getPluginId(),
-						IJMTConstants.EXTENSION_POINT_PAGEDESIGNER);
-		IExtension[] extensions = extensionPoint.getExtensions();
-
-		for (int i = 0; i < extensions.length; i++) {
-			IExtension ext = extensions[i];
-			IConfigurationElement[] facs = ext.getConfigurationElements();
-
-			for (int j = 0; j < facs.length; j++) {
-				if (facs[j].getName().equals(
-						IJMTConstants.TAG_ATTRIBUTE_CELLEDITOR_FACTORY)) {
-					Object obj;
-					try {
-						obj = facs[j].createExecutableExtension("class"); //$NON-NLS-1$
-
-						if (obj instanceof ITagAttributeCellEditorFactory) {
-							result.add(obj);
-						}
-					} catch (CoreException e) {
-						// ignore the exception
-						e.printStackTrace();
-					}
-				}
-			}
-		}
-		ITagAttributeCellEditorFactory[] ret = new ITagAttributeCellEditorFactory[result
-				.size()];
-		result.toArray(ret);
-		return ret;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/internal/CellEditorFactoryRegistry.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/internal/CellEditorFactoryRegistry.java
deleted file mode 100644
index e4cdaf5..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/internal/CellEditorFactoryRegistry.java
+++ /dev/null
@@ -1,160 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.meta.internal;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.ISupportTextValue;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.StringDialogField;
-import org.eclipse.jst.pagedesigner.editors.properties.IPropertyPageDescriptor;
-import org.eclipse.jst.pagedesigner.meta.ITagAttributeCellEditorFactory;
-import org.eclipse.jst.pagedesigner.properties.celleditors.CellEditorFactory;
-import org.eclipse.swt.widgets.Composite;
-import org.w3c.dom.Element;
-
-/**
- * CellEditorFactoryRegistry also read information from plugin.xml extension to
- * allow other plugins to contribute new kinds of cell editors.
- * 
- */
-public class CellEditorFactoryRegistry {
-//	private static final Logger _log = PDPlugin
-//			.getLogger(CellEditorFactoryRegistry.class);
-
-	private static CellEditorFactoryRegistry _instance;
-
-	private Map _factoryMap = new HashMap();
-
-	private List _defaultFactories = new ArrayList();
-
-	/**
-	 * @return singleton CellEditorFactoryRegistry
-	 */
-	public static CellEditorFactoryRegistry getInstance() {
-		if (_instance == null) {
-			_instance = new CellEditorFactoryRegistry();
-		}
-		return _instance;
-	}
-
-	private CellEditorFactoryRegistry() {
-		ITagAttributeCellEditorFactory[] facs = CellEditorFacRegistryReader
-				.getAllFactories();
-		if (facs != null) {
-			for (int i = 0; i < facs.length; i++) {
-				addCellEditorFactory(facs[i]);
-			}
-		}
-		addCellEditorFactory(new CellEditorFactory());
-	}
-
-	/**
-	 * @param fac
-	 */
-	public void addCellEditorFactory(ITagAttributeCellEditorFactory fac) {
-		String[] types = fac.getSupportedValueTypes();
-		if (types == null || types.length == 0) {
-			_defaultFactories.add(fac);
-		} else {
-			for (int i = 0; i < types.length; i++) {
-				_factoryMap.put(types[i], fac);
-			}
-		}
-	}
-
-	/**
-	 * Return cell editor for attribute based upon runtime value type
-	 * @param parent
-	 * @param attr
-	 * @param element
-	 * @return CellEditor
-	 */
-	public CellEditor createCellEditor(Composite parent,
-			IPropertyPageDescriptor attr, Element element) {
-		String type = attr.getValueType();
-		if (type == null || type.length() == 0)
-			return null;
-
-		CellEditor result = null;
-		ITagAttributeCellEditorFactory fac = (ITagAttributeCellEditorFactory) _factoryMap
-				.get(type);
-		
-		if (fac != null) {
-			result = fac.createCellEditor(parent, attr, element);
-		}
-		if (result == null) {
-			for (int i = 0, size = _defaultFactories.size(); i < size; i++) {
-				result = ((ITagAttributeCellEditorFactory) _defaultFactories
-						.get(i)).createCellEditor(parent, attr, element);
-				if (result != null)
-					break;
-			}
-		}
-		return result;
-	}
-
-	/**
-	 * @param attr
-	 * @return DialogField
-	 */
-	public DialogField createDialogField(IPropertyPageDescriptor attr) {
-		String type = attr.getValueType();
-		if (type == null || type.length() == 0) {
-			DialogField result = createTextDialogField(attr);
-			result.setLabelText(attr.getLabel()); //labelProvider???
-			return result;
-		}
-//		type = type.toUpperCase();
-
-		DialogField result = null;
-		ITagAttributeCellEditorFactory fac = (ITagAttributeCellEditorFactory) _factoryMap
-				.get(type);
-		if (fac != null) {
-			result = fac.createDialogField(attr);
-		}
-		if (result == null) {
-			for (int i = 0, size = _defaultFactories.size(); i < size; i++) {
-				result = ((ITagAttributeCellEditorFactory) _defaultFactories
-						.get(i)).createDialogField(attr);
-				if (result != null) {
-					break;
-				}
-			}
-		}
-		if (result == null) {
-			result = createTextDialogField(attr);
-		}
-		if (!(result instanceof ISupportTextValue)) {
-			result = createTextDialogField(attr);
-		}
-//		result.setLabelText(attr.getLabel() + ":"); //$NON-NLS-1$
-		return result;
-	}
-
-	/**
-	 * @param attr
-	 * @return DialogField
-	 */
-	public DialogField createTextDialogField(IPropertyPageDescriptor attr) {
-		StringDialogField field = new StringDialogField();
-		field.setLabelText(attr.getLabel());
-		field.setRequired(attr.isRequired());
-		field.setToolTip(attr.getDescription());
-		return field;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/CSSStyleAdapterFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/CSSStyleAdapterFactory.java
deleted file mode 100644
index e9f63ba..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/CSSStyleAdapterFactory.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.parts;
-
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.style.AbstractStyle;
-import org.eclipse.jst.pagedesigner.ui.preferences.PDPreferences;
-import org.eclipse.wst.sse.core.internal.provisional.AbstractAdapterFactory;
-import org.eclipse.wst.sse.core.internal.provisional.INodeAdapter;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class CSSStyleAdapterFactory extends AbstractAdapterFactory {
-	static Class ADAPTERKEY = ICSSStyle.class;
-    private final PDPreferences _prefs;
-
-	private CSSStyleAdapterFactory() {
-		super(ADAPTERKEY, true);
-		_prefs = new PDPreferences();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @seeorg.eclipse.wst.sse.core.internal.provisional.AbstractAdapterFactory#createAdapter(org.eclipse.wst.sse.core.internal.provisional.INodeNotifier)
-	 */
-	protected INodeAdapter createAdapter(INodeNotifier target) {
-		if (target instanceof Element) {
-			return new AbstractStyle((Element) target, _prefs);
-		}
-        return null;
-	}
-
-	/**
-	 * @return the factory instance
-	 */
-	public static CSSStyleAdapterFactory getInstance() {
-        // TODO: this 'singleton' is broken
-		return new CSSStyleAdapterFactory();
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/DocumentEditPart.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/DocumentEditPart.java
deleted file mode 100644
index 92c9bb9..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/DocumentEditPart.java
+++ /dev/null
@@ -1,253 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.parts;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.gef.EditPart;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.layout.FlowPage;
-import org.eclipse.wst.css.core.internal.event.ICSSStyleListener;
-import org.eclipse.wst.css.core.internal.provisional.document.ICSSModel;
-import org.eclipse.wst.css.core.internal.provisional.document.ICSSSelector;
-import org.eclipse.wst.html.core.internal.htmlcss.StyleListener;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-/**
- * @author mengbo
- */
-public class DocumentEditPart extends NodeEditPart implements StyleListener,
-		ICSSStyleListener {
-	boolean _refreshing = false;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.AbstractEditPart#getModelChildren()
-	 */
-	protected List getModelChildren() {
-		List list = new ArrayList();
-		Node model = (Node) getModel();
-		if (model == null) {
-			return list;
-		}
-
-		NodeList children1 = model.getChildNodes();
-		for (int i = 0, n = children1.getLength(); i < n; i++) {
-			Node node = children1.item(i);
-			if (node.getNodeType() != Node.TEXT_NODE
-					&& node.getNodeType() != Node.ELEMENT_NODE) {
-				continue;
-			}
-			list.add(node);
-		}
-		return list;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#createFigure()
-	 */
-	protected IFigure createFigure() {
-		FlowPage f = new FlowPage();
-		return f;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.sse.core.internal.provisional.INodeAdapter#notifyChanged(org.eclipse.wst.sse.core.internal.provisional.INodeNotifier,
-	 *      int, java.lang.Object, java.lang.Object, java.lang.Object, int)
-	 */
-	public void notifyChanged(INodeNotifier notifier, int eventType,
-			Object changedFeature, Object oldValue, Object newValue, int pos) {
-		refresh();
-	}
-
-    /**
-     * @param recursive
-     */
-    public void refresh(final boolean recursive)
-    {
-        if (!recursive)
-        {
-            refresh();
-        }
-        else
-        {
-            refreshVisuals();
-            refreshChildren(recursive);
-            refreshSourceConnections();
-            refreshTargetConnections();
-
-        }
-    }
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#refresh()
-	 */
-	public void refresh() {
-		if (_refreshing) {
-			return;
-		}
-		_refreshing = true;
-		try {
-			super.refresh();
-		} finally {
-			_refreshing = false;
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.AbstractEditPart#refreshChildren()
-	 */
-	protected void refreshChildren() {
-	    refreshChildren(false);
-	}
-
-    /**
-     * @param recursive
-     */
-    protected void refreshChildren(final boolean recursive)
-    {
-        super.refreshChildren();
-        List children1 = getChildren();
-        for (int i = 0, size = children1.size(); i < size; i++)
-        {
-            final EditPart editPart = (EditPart) children1.get(i);
-            if (editPart instanceof ElementEditPart)
-            {
-                ((ElementEditPart)editPart).refresh(recursive);
-            }
-            else
-            {
-                editPart.refresh();
-            }
-        }
-    }
-
-	// protected void removeChildVisual(EditPart childEditPart)
-	// {
-	// if (childEditPart instanceof SubNodeEditPart)
-	// {
-	// Node node = ((SubNodeEditPart) childEditPart).getNodeForFigure();
-	// if (node != null)
-	// {
-	// getDestDocumentForDesign().removeChild(node);
-	// }
-	// }
-	// super.removeChildVisual(childEditPart);
-	// }
-	//    
-	// protected void addChildVisual(EditPart childEditPart, int index)
-	// {
-	// if (childEditPart instanceof SubNodeEditPart)
-	// {
-	// Node node = ((SubNodeEditPart) childEditPart).getNodeForFigure();
-	// if (node != null)
-	// {
-	// NodeList nodeList = getDestDocumentForDesign().getChildNodes();
-	// if (nodeList.getLength() > index)
-	// {
-	// getDestDocumentForDesign().insertBefore(node, nodeList.item(index));
-	// }
-	// else
-	// {
-	// getDestDocumentForDesign().appendChild(node);
-	// }
-	// }
-	// }
-	// super.addChildVisual(childEditPart, index);
-	// }
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.html.core.internal.htmlcss.StyleListener#styleChanged()
-	 */
-	public void styleChanged() {
-		// refresh the whole document when style change (<style> or <link>)
-		this.refreshStyle();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.css.core.internal.event.ICSSStyleListener#styleChanged(org.eclipse.wst.css.core.internal.provisional.document.ICSSModel,
-	 *      org.eclipse.wst.css.core.document.ICSSSelector[],
-	 *      org.eclipse.wst.css.core.document.ICSSSelector[], java.lang.String)
-	 */
-	public void styleChanged(ICSSModel srcModel, ICSSSelector[] removed,
-			ICSSSelector[] added, String media) {
-		if ((removed != null && removed.length > 0) || added != null
-				&& added.length > 0) {
-			this.refreshStyle();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.css.core.internal.event.ICSSStyleListener#styleUpdate(org.eclipse.wst.css.core.internal.provisional.document.ICSSModel)
-	 */
-	public void styleUpdate(ICSSModel srcModel) {
-		this.refreshStyle();
-	}
-
-	/**
-	 * 
-	 */
-	private void refreshStyle() {
-		List childParts = this.getChildren();
-		for (Iterator iter = childParts.iterator(); iter.hasNext();) {
-			EditPart part = (EditPart) iter.next();
-			if (part instanceof ElementEditPart) {
-				IDOMNode node = (IDOMNode) ((ElementEditPart) part)
-						.getNodeForFigure();
-				if (node != null) {
-					refreshChildStyles(node);
-				}
-			}
-		}
-		getFigure().revalidate();
-		// getFigure().repaint();
-	}
-
-	/**
-	 * @param node
-	 */
-	private void refreshChildStyles(IDOMNode node) {
-		NodeList childNodes = node.getChildNodes();
-		for (int i = 0, size = childNodes.getLength(); i < size; i++) {
-			refreshChildStyles((IDOMNode) childNodes.item(i));
-		}
-		if (node instanceof IDOMElement) {
-			// only refresh style on element.
-			ICSSStyle a = (ICSSStyle) node.getAdapterFor(ICSSStyle.class);
-			if (a != null) {
-				a.reset();
-			}
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/EditProxyAdapter.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/EditProxyAdapter.java
deleted file mode 100644
index cac1252..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/EditProxyAdapter.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.parts;
-
-import org.eclipse.jst.pagedesigner.css2.style.IRangeSelectionProxy;
-import org.eclipse.wst.sse.core.internal.provisional.INodeAdapter;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-
-/**
- * EditProxyAdapter is used to provide additional information to the underlying
- * figures. As when we doing the "convert", we are creating new nodes and
- * generate figure using those new nodes. This class is used to adapt to those
- * new nodes, and providing additional information to them.
- * 
- * @author mengbo
- * @version 1.5
- */
-public class EditProxyAdapter implements INodeAdapter, IRangeSelectionProxy {
-	ElementEditPart _part;
-
-	/**
-	 * @param part 
-	 */
-	public EditProxyAdapter(ElementEditPart part) {
-		_part = part;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.sse.core.internal.provisional.INodeAdapter#isAdapterForType(java.lang.Object)
-	 */
-	public boolean isAdapterForType(Object type) {
-		if (type == IRangeSelectionProxy.class) {
-			return true;
-		} else if (type == EditProxyAdapter.class) {
-			return true;
-		}
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.sse.core.internal.provisional.INodeAdapter#notifyChanged(org.eclipse.wst.sse.core.internal.provisional.INodeNotifier,
-	 *      int, java.lang.Object, java.lang.Object, java.lang.Object, int)
-	 */
-	public void notifyChanged(INodeNotifier notifier, int eventType,
-			Object changedFeature, Object oldValue, Object newValue, int pos) {
-        // do nothing?
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.style.IRangeSelectionProxy#isRangeSelected()
-	 */
-	public boolean isRangeSelected() {
-		return _part.isRangeSelected();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/ElementEditPart.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/ElementEditPart.java
deleted file mode 100644
index f85bfba..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/ElementEditPart.java
+++ /dev/null
@@ -1,641 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.parts;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.gef.DragTracker;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPolicy;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.requests.LocationRequest;
-import org.eclipse.gef.tools.DragEditPartsTracker;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.jsf.core.internal.tld.CMUtil;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.converter.ConvertPosition;
-import org.eclipse.jst.pagedesigner.converter.IConverterFactory;
-import org.eclipse.jst.pagedesigner.converter.ITagConverter;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.layout.CSSFigure;
-import org.eclipse.jst.pagedesigner.css2.layout.CSSWidgetLayout;
-import org.eclipse.jst.pagedesigner.css2.style.AbstractStyle;
-import org.eclipse.jst.pagedesigner.css2.widget.HiddenProvider;
-import org.eclipse.jst.pagedesigner.dtmanager.DTManager;
-import org.eclipse.jst.pagedesigner.editpolicies.ElementMenuBar;
-import org.eclipse.jst.pagedesigner.editpolicies.ElementResizableEditPolicy;
-import org.eclipse.jst.pagedesigner.editpolicies.IEnhancedSelectionEditPolicy;
-import org.eclipse.jst.pagedesigner.elementedit.ElementEditFactoryRegistry;
-import org.eclipse.jst.pagedesigner.elementedit.IElementEdit;
-import org.eclipse.jst.pagedesigner.figurehandler.FigureFactory;
-import org.eclipse.jst.pagedesigner.figurehandler.IFigureHandler;
-import org.eclipse.jst.pagedesigner.jsp.core.IJSPCoreConstants;
-import org.eclipse.jst.pagedesigner.range.RangeUtil;
-import org.eclipse.jst.pagedesigner.requests.PageDesignerRequestConstants;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.eclipse.swt.graphics.Cursor;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.wst.sse.core.internal.provisional.INodeAdapter;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMText;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ElementEditPart extends SubNodeEditPart {
-	private static Logger _log = PDPlugin.getLogger(ElementEditPart.class);
-
-	private Element _elementNode;
-
-	private ITagConverter _tagConverter;
-    
-    private ElementMenuBar  _nonVisualElementBar;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.EditPart#setModel(java.lang.Object)
-	 */
-	public void setModel(Object model) {
-		super.setModel(model);
-		_elementNode = (Element) model;
-		_tagConverter = getTagConverter(_elementNode);
-		_tagConverter.convertRefresh(null);
-		adaptEditProxy();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.parts.NodeEditPart#getDragTracker(org.eclipse.gef.Request)
-	 */
-	public DragTracker getDragTracker(Request request) 
-    {
-        EditPolicy policy = this
-            .getEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE);
-
-        if (PageDesignerRequestConstants.REQ_SELECTION_TRACKER.equals(request.getType())
-                || org.eclipse.gef.RequestConstants.REQ_SELECTION.equals(request.getType()))
-        {
-            if (policy instanceof IEnhancedSelectionEditPolicy
-                    && request instanceof LocationRequest)
-            {
-                return ((IEnhancedSelectionEditPolicy)policy).getSelectionDragTracker((LocationRequest)request);
-            }
-            
-            return null;
-        }
-        
-        // should not happen
-        return new DragEditPartsTracker(this);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.parts.NodeEditPart#createEditPolicies()
-	 */
-	protected void createEditPolicies() {
-		super.createEditPolicies();
-		IElementEdit support = getElementEdit();
-		if (support != null) {
-			support.createEditPolicies(this);
-		}
-
-		// if ElementEdit didn't install special SELECTION_FEEDBACK_ROLE policy,
-		// then default
-		if (this.getEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE) == null) {
-			this.installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE,
-					new ElementResizableEditPolicy());
-		}
-	}
-
-	/**
-	 * @return the associated element edit
-	 */
-	public IElementEdit getElementEdit() {
-		// XXX: should we cache it?
-		return ElementEditFactoryRegistry.getInstance().createElementEdit(
-				_elementNode);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.parts.NodeEditPart#addNotify()
-	 */
-	public void addNotify() {
-		if (_tagConverter == null) {
-			_tagConverter = getTagConverter(_elementNode);
-			_tagConverter.convertRefresh(null);
-			adaptEditProxy();
-		}
-		super.addNotify();
-	}
-
-	/**
-	 * @param node
-	 * @return
-	 */
-	private ITagConverter getTagConverter(Element node) {
-		return DTManager.getInstance().getTagConverter(node,
-				IConverterFactory.MODE_DESIGNER,
-				this.getDestDocumentForDesign());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#removeNotify()
-	 */
-	public void removeNotify() {
-		super.removeNotify();
-		// if (_tagConverter != null)
-		// {
-		// _tagConverter.dispose();
-		// _tagConverter = null;
-		// }
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.AbstractEditPart#getModelChildren()
-	 */
-	protected List getModelChildren() {
-		List children_ = new ArrayList(_tagConverter.getChildModeList());
-        
-        for (Iterator it = _tagConverter.getNonVisualChildren().iterator(); it.hasNext();)
-        {
-            Element nonVisualChild = (Element) it.next();
-            children_.add(DTManager.getInstance().getTagConverter(nonVisualChild,
-                IConverterFactory.MODE_DESIGNER,
-                this.getDestDocumentForDesign()));
-        }
-        return children_;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#createFigure()
-	 */
-	protected IFigure createFigure() {
-		// if (_tagConverter.isVisualByHTML())
-		// {
-		// Element result = _tagConverter.getResultElement();
-		// return FigureFactory.createFigure(result,
-		// true);//_tagConverter.isMultiLevel());
-		// }
-		// else
-		// {
-		// CSSWidgetFigure figure = new CSSWidgetFigure(this._elementNode,
-		// createHiddenProvider());
-		// return figure;
-		// }
-		return new CSSFigure();
-	}
-
-	/**
-	 * @return
-	 */
-	private HiddenProvider createHiddenProvider() {
-		Element result = _tagConverter.getHostElement();
-		String localName = result.getLocalName();
-		String appendString = localName;
-		if (localName.equalsIgnoreCase(IJSPCoreConstants.TAG_DIRECTIVE_TAGLIB)) {
-			appendString = ((IDOMElement) result)
-					.getAttribute(IJSPCoreConstants.ATTR_URI);
-			if (appendString == null) {
-				appendString = ((IDOMElement) result)
-					.getAttribute(IJSPCoreConstants.ATTR_TAGDIR);
-				if (appendString == null)
-					appendString = ""; //$NON-NLS-1$
-			}
-		}
-		Image image = _tagConverter.getVisualImage();
-		HiddenProvider provider = new HiddenProvider(image, this);
-		((CSSFigure) getFigure()).setCSSStyle(provider.getCSSStyle());
-		provider.setLabel(appendString);
-		return provider;
-	}
-
-	/**
-	 * called by the
-	 * @param recursive
-	 * 
-	 */
-	public void refreshModelChange(boolean recursive) {
-		IElementEdit support = getElementEdit();
-		if (support == null
-				|| !support.handleModelChange(_elementNode, this, recursive)) {
-			this.refresh(recursive);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#refresh()
-	 */
-	public void refresh() {
-		refresh(false);
-	}
-
-	/**
-	 * @param recursive
-	 */
-	public void refresh(boolean recursive) {
-		if (!_tagConverter.isVisualByHTML()) {
-			_tagConverter.convertRefresh(null);
-			((CSSFigure) getFigure())
-					.setFixedLayoutManager(new CSSWidgetLayout(
-							(CSSFigure) getFigure(), createHiddenProvider()));
-			// nothing to refresh
-			// ((CSSWidgetFigure)
-			// getFigure()).setProvider(createHiddenProvider());
-			return;
-		}
-		EditPart editPart;
-		Object model;
-
-		Map modelToEditPart = new HashMap();
-		List children1 = getChildren();
-
-		for (int i = 0, n = children1.size(); i < n; i++) {
-			editPart = (EditPart) children1.get(i);
-			modelToEditPart.put(editPart.getModel(), editPart);
-			// remove child visual, since we may reconstruct the figure
-			// structure of this edit part
-			removeChildVisual(editPart);
-		}
-
-		Element oldEle = _tagConverter.getResultElement();
-
-		// link parent node.
-		Node parent = oldEle.getParentNode();
-		_tagConverter.convertRefresh(null);
-		if (parent != null) {
-			// a new element is generated. replace the old one.
-			parent.replaceChild(_tagConverter.getResultElement(), oldEle);
-		}
-
-		adaptEditProxy();
-
-		// XXX: comment out the if-else for always deep update.
-		// this is for the case when a empty container generate child
-		// text node, and then when user input data into the container,
-		// the node change from "multiLevel" state to "non-multilevel"
-		// state. We don't handle this very well yet, so always to deep
-		// update for now. (lium)
-		// if (_tagConverter.isMultiLevel())
-		// {
-		FigureFactory.updateDeepFigure(_tagConverter.getResultElement(),
-				oldEle, (CSSFigure) this.getFigure());
-		// }
-		// else
-		// {
-		// FigureFactory.updateNonDeepFigure(_tagConverter.getResultElement(),
-		// this.getFigure());
-		// }
-
-		List modelObjects = getModelChildren();
-		if (!recursive) {
-			for (int i = 0, n = modelObjects.size(); i < n; i++) {
-				model = modelObjects.get(i);
-
-				// Look to see if the EditPart is already around but in the
-				// wrong location
-				editPart = (EditPart) modelToEditPart.remove(model);
-
-				if (editPart != null) {
-					addChildVisual(editPart, i);
-				} else {
-					// An editpart for this model doesn't exist yet. Create and
-					// insert one.
-					editPart = createChild(model);
-					addChild(editPart, i);
-				}
-			}
-			for (Iterator iter = modelToEditPart.values().iterator(); iter
-					.hasNext();) {
-				EditPart part = (EditPart) iter.next();
-				removeChild(part);
-			}
-		} else {
-			// remove all child, and recreate them.
-			for (Iterator iter = modelToEditPart.values().iterator(); iter
-					.hasNext();) {
-				EditPart part = (EditPart) iter.next();
-				removeChild(part);
-			}
-			for (int i = 0, n = modelObjects.size(); i < n; i++) {
-				model = modelObjects.get(i);
-
-				// Look to see if the EditPart is already around but in the
-				// wrong location
-				// An editpart for this model doesn't exist yet. Create and
-				// insert one.
-				editPart = createChild(model);
-				addChild(editPart, i);
-			}
-		}
-	}
-
-	/**
-	 * 
-	 */
-	private void adaptEditProxy() {
-		Element resultEle = _tagConverter.getResultElement();
-		if (resultEle instanceof IDOMElement) {
-			INodeAdapter adapter = ((IDOMElement) resultEle)
-					.getAdapterFor(EditProxyAdapter.class);
-			if (adapter != null) {
-				((IDOMElement) resultEle).removeAdapter(adapter);
-			}
-			((IDOMElement) resultEle).addAdapter(new EditProxyAdapter(this));
-		}
-	}
-
-	/**
-	 * @return true if we are in range mode and this is in 
-	 * the selection range
-	 */
-	public boolean isRangeSelected() {
-		IHTMLGraphicalViewer viewer = (IHTMLGraphicalViewer) this.getViewer();
-		if (viewer == null || !viewer.isInRangeMode()) {
-			return false;
-		}
-		DesignRange range = viewer.getRangeSelection();
-		if (range == null || !range.isValid()) {
-			return false;
-		}
-		return RangeUtil.intersect(range, this);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.parts.NodeEditPart#isWidget()
-	 */
-	public boolean isWidget() {
-		return _tagConverter.isWidget();
-	}
-
-	/**
-	 * @return true if our model node can have direct text children
-	 */
-	public boolean canHaveDirectTextChild() {
-		return CMUtil.canHaveDirectTextChild(this._elementNode);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.parts.NodeEditPart#isResizable()
-	 */
-	public boolean isResizable() {
-		if (!_tagConverter.isVisualByHTML()) {
-			return false;
-		}
-		IElementEdit edit = this.getElementEdit();
-		if (edit != null) {
-			return edit.isResizable(this._elementNode);
-		}
-        CMElementDeclaration decl = CMUtil
-        		.getElementDeclaration(this._elementNode);
-        if (decl != null) {
-        	// XXX: default implementation, if this element support "style"
-        	// attribute,
-        	// then we think it support resize.
-        	return decl.getAttributes().getNamedItem("style") != null; //$NON-NLS-1$
-        }
-        return true;
-	}
-
-	/**
-	 * @param parent
-	 * @return
-	 */
-	private IFigure getFigure(Node parent) {
-		if (parent instanceof INodeNotifier) {
-			IFigureHandler handler = (IFigureHandler) ((INodeNotifier) parent)
-					.getAdapterFor(IFigureHandler.class);
-			if (handler != null) {
-				return handler.getFigure();
-			}
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#addChildVisual(org.eclipse.gef.EditPart,
-	 *      int)
-	 */
-	protected void addChildVisual(EditPart childEditPart, int index) {
-        
-        boolean figureAdded = false;
-
-        if (childEditPart instanceof NonVisualComponentEditPart)
-        {
-            getNonVisualElementBar().addNonVisualChild(((NonVisualComponentEditPart) childEditPart));
-            figureAdded = true;
-            //TODO: need better flow of control.
-            return;
-        }
-        
-		Node childNode = (Node) childEditPart.getModel();
-		IFigure childFigure = ((GraphicalEditPart) childEditPart).getFigure();
-		ConvertPosition position = _tagConverter
-				.getChildVisualPosition(childNode);
-		if (position != null) {
-			Node parent = position.getParentNode();
-			// link up figure.
-			IFigure parentFigure = getFigure(parent);
-			if (parentFigure != null) {
-				parentFigure.add(childFigure, position.getIndex());
-				figureAdded = true;
-			}
-			// link up style
-			if (parent instanceof INodeNotifier) {
-				ICSSStyle parentStyle = (ICSSStyle) ((INodeNotifier) parent)
-						.getAdapterFor(ICSSStyle.class);
-				if (parentStyle != null) {
-					ICSSStyle childStyle = (ICSSStyle) ((INodeNotifier) childNode)
-							.getAdapterFor(ICSSStyle.class);
-					if (childStyle instanceof AbstractStyle) {
-						((AbstractStyle) childStyle)
-								.setParentStyle(parentStyle);
-					}
-				}
-			}
-			// link up the nodeForFigure
-			if (childEditPart instanceof SubNodeEditPart) {
-				Node nodeForFigure = ((SubNodeEditPart) childEditPart)
-						.getNodeForFigure();
-				if (nodeForFigure != null /*
-											 * && !(nodeForFigure instanceof
-											 * PseudoElement)
-											 */) {
-					parent.appendChild(nodeForFigure);
-				}
-			}
-		} else {
-		    _log.error("getChildVisualPosition() return null"); //$NON-NLS-1$
-		}
-
-		if (!figureAdded) {
-			super.addChildVisual(childEditPart, index);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#removeChildVisual(org.eclipse.gef.EditPart)
-	 */
-	protected void removeChildVisual(EditPart childEditPart) {
-        // remove figure
-        IFigure childFigure = ((GraphicalEditPart) childEditPart).getFigure();
-        IFigure parent = childFigure.getParent();
-
-		if (parent != null) {
-			parent.remove(childFigure);
-		}
-        
-        if (childEditPart instanceof NonVisualComponentEditPart)
-        {
-            _nonVisualElementBar.removeNonVisualChild((NonVisualComponentEditPart) childEditPart);
-        }
-        // this only applies to visual edit parts
-        else
-        {
-    		// de-link style
-    		Node childNode = (Node) childEditPart.getModel();
-    		ICSSStyle childStyle = (ICSSStyle) ((INodeNotifier) childNode)
-    				.getAdapterFor(ICSSStyle.class);
-    		if (childStyle instanceof AbstractStyle) {
-    			((AbstractStyle) childStyle).setParentStyle(null);
-    		}
-    		// de-link nodeForFigure
-    		if (childEditPart instanceof SubNodeEditPart) {
-    			Node nodeForFigure = ((SubNodeEditPart) childEditPart)
-    					.getNodeForFigure();
-    			if (nodeForFigure != null && nodeForFigure.getParentNode() != null) {
-    				nodeForFigure.getParentNode().removeChild(nodeForFigure);
-    			}
-    		}
-        }
-	}
-
-	/**
-	 * @return the associated tag converter
-	 */
-	public ITagConverter getTagConvert() {
-		return _tagConverter;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.sse.core.internal.provisional.INodeAdapter#notifyChanged(org.eclipse.wst.sse.core.internal.provisional.INodeNotifier,
-	 *      int, java.lang.Object, java.lang.Object, java.lang.Object, int)
-	 */
-	public void notifyChanged(INodeNotifier notifier, int eventType,
-			Object changedFeature, Object oldValue, Object newValue, int pos) {
-        // XXX: this can cause multiple refreshes on the same edit part for the 
-        // same change.  I can also cause incorrect child refreshes...
-		refresh();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.parts.SubNodeEditPart#getNodeForFigure()
-	 */
-	public Node getNodeForFigure() {
-		return _tagConverter.getResultElement();
-	}
-
-	/**
-	 * @return true this part's node has non whitespace child nodes
-	 */
-	public boolean haveNonWhitespaceTextChild() {
-		List children1 = this.getChildren();
-		for (int i = 0, size = children1.size(); i < size; i++) {
-			if (children1.get(i) instanceof TextEditPart) {
-				IDOMText xmltext = (IDOMText) ((TextEditPart) children1.get(i))
-						.getIDOMNode();
-				if (!xmltext.isElementContentWhitespace()) {
-					return true;
-				}
-			}
-		}
-		return false;
-	}
-
-    private ElementMenuBar getNonVisualElementBar()
-    {
-        if (_nonVisualElementBar == null)
-        {
-            _nonVisualElementBar = new ElementMenuBar(this);
-        }
-        return _nonVisualElementBar;
-    }
-
-    /**
-     * @return the element menu bar for this element
-     */
-    public ElementMenuBar getElementMenuBar() {
-        return getNonVisualElementBar();
-    }
-
-    public void deactivate() {
-        super.deactivate();
-        if (_nonVisualElementBar != null)
-        {
-            _nonVisualElementBar.dispose();
-            _nonVisualElementBar = null;
-        }
-        if (_tagConverter != null) {
-        	_tagConverter.dispose();
-        }
-    }
-
-    public Cursor getCursor(Point mouseLocation) {
-        // let the selection edit policy dictate
-        EditPolicy  editPolicy = getEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE);
-        
-        if (editPolicy instanceof IEnhancedSelectionEditPolicy)
-        {
-            return  ((IEnhancedSelectionEditPolicy)editPolicy).getSelectionToolCursor(mouseLocation);
-        }
-        return super.getCursor(mouseLocation);
-    }
-    
-    
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/HTMLEditPartsFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/HTMLEditPartsFactory.java
deleted file mode 100644
index 66dd085..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/HTMLEditPartsFactory.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.parts;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPartFactory;
-import org.eclipse.jst.pagedesigner.converter.ITagConverter;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
-import org.w3c.dom.Node;
-
-/**
- * The model here can only be Document/Element/Text.
- * 
- * @author mengbo
- */
-public class HTMLEditPartsFactory implements EditPartFactory {
-	private IDOMDocument _destDocument;
-
-	/**
-	 * @param destDoc
-	 */
-	public HTMLEditPartsFactory(IDOMDocument destDoc) {
-		this._destDocument = destDoc;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.EditPartFactory#createEditPart(org.eclipse.gef.EditPart,
-	 *      java.lang.Object)
-	 */
-	public EditPart createEditPart(EditPart context, Object model) {
-        NodeEditPart part = null;
-        
-        if (model instanceof Node)
-        {
-    		Node node = (Node) model;
-    		if (node.getNodeType() == Node.DOCUMENT_NODE) {
-    			part = new DocumentEditPart();
-    		} else if (node.getNodeType() == Node.ELEMENT_NODE) {
-    			// String tag = ((Element)node).getTagName();
-    			// if ("TABLE".equalsIgnoreCase(tag))
-    			// part = new HTMLTableEditPart();
-    			// else
-                    part = new ElementEditPart();
-    		} else if (node.getNodeType() == Node.TEXT_NODE
-    				|| node.getNodeType() == Node.CDATA_SECTION_NODE) {
-    			part = new TextEditPart();
-    		}
-        }
-        // XXX: we need to create wrapper that allows us to know when
-        // a model object represents a non-visual decorator
-        else if (model instanceof ITagConverter)
-        {
-            part = new NonVisualComponentEditPart();
-        }
-        
-		if (part != null) {
-			part.setDestDocumentForDesign(this._destDocument);
-			part.setModel(model);
-		}
-		return part;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/NodeEditPart.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/NodeEditPart.java
deleted file mode 100644
index 653ba15..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/NodeEditPart.java
+++ /dev/null
@@ -1,251 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.parts;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.gef.DragTracker;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPolicy;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.RequestConstants;
-import org.eclipse.gef.editparts.AbstractGraphicalEditPart;
-import org.eclipse.gef.requests.LocationRequest;
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.jsf.core.internal.tld.TagIdentifierFactory;
-import org.eclipse.jst.pagedesigner.dnd.LocalDropRequest;
-import org.eclipse.jst.pagedesigner.dnd.internal.LocalDropEditPolicy;
-import org.eclipse.jst.pagedesigner.editpolicies.DragMoveEditPolicy;
-import org.eclipse.jst.pagedesigner.itemcreation.ItemCreationEditPolicy;
-import org.eclipse.jst.pagedesigner.itemcreation.ItemCreationRequest;
-import org.eclipse.jst.pagedesigner.tools.RangeDragTracker;
-import org.eclipse.swt.graphics.Cursor;
-import org.eclipse.ui.views.properties.IPropertySource;
-import org.eclipse.wst.sse.core.internal.provisional.INodeAdapter;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public abstract class NodeEditPart extends AbstractGraphicalEditPart implements
-		INodeAdapter {
-
-	private IDOMDocument _destDocument;
-	private boolean      _isDragActive;
-    
-	/**
-	 * this method is called from the HTMLEditPartsFactory directly after the
-	 * part's creation.
-	 * 
-	 * @param doc
-	 */
-	public void setDestDocumentForDesign(IDOMDocument doc) {
-		this._destDocument = doc;
-	}
-
-	/**
-	 * @return to owner document of this part's model node
-	 */
-	public IDOMDocument getDestDocumentForDesign() {
-		if (this._destDocument == null) {
-			return (IDOMDocument) this.getIDOMNode().getOwnerDocument();
-		}
-        return this._destDocument;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.AbstractEditPart#createEditPolicies()
-	 */
-	protected void createEditPolicies() {
-		installEditPolicy(EditPolicy.NODE_ROLE, null);
-		installEditPolicy(EditPolicy.GRAPHICAL_NODE_ROLE, null);
-		installEditPolicy(LocalDropRequest.REQ_LOCAL_DROP,
-				new LocalDropEditPolicy());
-		installEditPolicy(ItemCreationRequest.REQ_ITEM_CREATION,
-				new ItemCreationEditPolicy());
-		installEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE,
-				new DragMoveEditPolicy());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.sse.model.INodeAdapter#isAdapterForType(java.lang.Object)
-	 */
-	public boolean isAdapterForType(Object type) {
-		return type == EditPart.class;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#addNotify()
-	 */
-	public void addNotify() {
-		Object obj = getModel();
-		if (obj instanceof INodeNotifier) {
-			((INodeNotifier) obj).addAdapter(this);
-		}
-		super.addNotify();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#removeNotify()
-	 */
-	public void removeNotify() {
-		super.removeNotify();
-		Object obj = getModel();
-		if (obj instanceof INodeNotifier) {
-			((INodeNotifier) obj).removeAdapter(this);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.EditPart#deactivate()
-	 */
-	public void deactivate() {
-		LocationRequest hoverRequest = new LocationRequest();
-		hoverRequest.setType(RequestConstants.REQ_SELECTION_HOVER);
-		this.eraseTargetFeedback(hoverRequest);
-		super.deactivate();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#getAdapter(java.lang.Class)
-	 */
-	public Object getAdapter(Class key) {
-		Object obj = getModel();
-		if (key == IPropertySource.class) {
-			if (obj instanceof INodeNotifier) {
-				return ((INodeNotifier) obj)
-						.getAdapterFor(IPropertySource.class);
-			}
-		}
-
-		if (obj instanceof IAdaptable) {
-			Object ret = ((IAdaptable) obj).getAdapter(key);
-			if (ret != null)
-				return ret;
-		}
-		return super.getAdapter(key);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#getDragTracker(org.eclipse.gef.Request)
-	 */
-	public DragTracker getDragTracker(Request request) {
-		return new RangeDragTracker(this);
-	}
-
-	/**
-	 * @return the model node as an IDOMNode
-	 */
-	public IDOMNode getIDOMNode() {
-		return ((IDOMNode) getModel());
-	}
-
-    /**
-     * @return the model node as a node
-     */
-    public Node getDOMNode()
-    {
-        return ((Node)getModel());
-    }
-    
-    /**
-     * @return if this edit part's model is an Element, then returns
-     * the tag identifier. Otherwise, null.
-     */
-    public TagIdentifier getTagIdentifier()
-    {
-        Node node = getDOMNode();
-        
-        if (node instanceof Element)
-        {
-            return TagIdentifierFactory.createDocumentTagWrapper(((Element)node));
-        }
-        
-        return null;
-    }
-    
-	/**
-	 * if a EditPart don't support caret inside it, and don't can't have child
-	 * edit part, then we call it as a widget.
-	 * 
-	 * @return true if this part represents a widget
-	 */
-	public boolean isWidget() {
-		return false; // child class must override.
-	}
-
-	/**
-	 * whether this EditPart allow the selection range to have one edge in the
-	 * edit part and one edge outside the edit part.
-	 * 
-	 * @return true if selection range across is allowed
-	 */
-	public boolean allowSelectionRangeAcross() {
-		return true;
-	}
-
-	/**
-	 * @return true if this part is resizable
-	 */
-	public boolean isResizable() {
-		return false;
-	}
-    
-    /**
-     * @return true if drag is active on this part
-     */
-    public boolean isDragActive() {
-        return _isDragActive;
-    }
-    
-    /**
-     * @param newValue
-     */
-    public void setDragActive(boolean newValue)
-    {
-        _isDragActive = newValue;
-    }
-    
-    /**
-     * @param mouseLocation
-     * @return this edit part's cursor or null if this edit part
-     * does not wish to specify a specific cursor (the default
-     * should be used).  
-     * Note that this is only called when no drag tracker is active,
-     * when the mouse enters the edit part with the RangeSelectionTool
-     * and the current state is INITIAL.  This allows the editpart to
-     * specify a custom mouse-over tool cursor
-     * TODO: perhaps getCursor is not a specific enough a name
-     */
-    public Cursor getCursor(Point mouseLocation)
-    {
-        return null;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/NonVisualComponentEditPart.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/NonVisualComponentEditPart.java
deleted file mode 100644
index 08b76d1..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/NonVisualComponentEditPart.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.parts;
-
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.ImageFigure;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.EditPolicy;
-import org.eclipse.jst.pagedesigner.converter.ITagConverter;
-import org.eclipse.jst.pagedesigner.editpolicies.NonVisualChildGraphicalEditPolicy;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * Represents a node that is non-visual in the runtime rendering
- * but which may wish to have a meta-representation on the design canvas.
- *
- */
-public class NonVisualComponentEditPart extends NodeEditPart 
-{
-    protected IFigure createFigure() 
-    {
-        IFigure figure_ = new ImageFigure(getTagConverter().getVisualImage())
-        {
-
-            protected void paintFigure(Graphics graphics) {
-                super.paintFigure(graphics);
-                
-                if (getImage() == null)
-                    return;
-
-                Rectangle srcRect = new Rectangle(getImage().getBounds());
-                graphics.drawImage(getImage(), srcRect, getClientArea());
-            }
-            
-        };
-        
-        figure_.setMinimumSize(new Dimension(0,0));
-        return figure_;
-    }
-
-    public void notifyChanged(INodeNotifier notifier, int eventType,
-            Object changedFeature, Object oldValue, Object newValue, int pos) {
-        // for now, do nothing
-    }
-
-    protected void createEditPolicies() {
-        super.createEditPolicies();
-        installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE
-                          , new NonVisualChildGraphicalEditPolicy());
-        installEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE,
-                null);
-    }
-
-    @Override
-    public void deactivate()
-    {
-        ITagConverter tagConverter = (ITagConverter) getModel();
-        if (tagConverter != null)
-        {
-            tagConverter.dispose();
-        }
-        
-        // always do super stuff
-        super.deactivate();
-    }
-
-    /**
-     * @return the tag converter
-     */
-    protected ITagConverter getTagConverter()
-    {
-    	ITagConverter tagConverter = (ITagConverter)getModel();
-    	//need to call convertRefresh to get image (if any) from metadata
-    	if (tagConverter != null) {
-    		tagConverter.convertRefresh(null);
-    	}
-    	return tagConverter;
-    }
-    
-    /**
-     * @return the host element for this edit part
-     */
-    protected Element getModelElement()
-    {
-        return getTagConverter().getHostElement();
-    }
-
-    public IDOMNode getIDOMNode() 
-    {
-        return (IDOMNode) getModelElement();
-    }
-
-    public Node getDOMNode() {
-        return getModelElement();
-    }
-
-//    public DragTracker getDragTracker(Request request) {
-//        // TODO: need to define drag semantics for these
-//        // Also, right now edit part dragging causes bad behaviour
-//        // in the non-visual decorator
-//        return null;//new ObjectModeDragTracker(this);
-//    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/Refresher.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/Refresher.java
deleted file mode 100644
index 67e62f2..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/Refresher.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.parts;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.eclipse.wst.sse.core.internal.provisional.INodeAdapter;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class Refresher implements INodeAdapter {
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.sse.core.internal.provisional.INodeAdapter#isAdapterForType(java.lang.Object)
-	 */
-	public boolean isAdapterForType(Object type) {
-		return (type == Refresher.class);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.sse.core.internal.provisional.INodeAdapter#notifyChanged(org.eclipse.wst.sse.core.internal.provisional.INodeNotifier,
-	 *      int, java.lang.Object, java.lang.Object, java.lang.Object, int)
-	 */
-	public void notifyChanged(INodeNotifier notifier, int eventType,
-			Object changedFeature, Object oldValue, Object newValue, int pos) {
-		if (eventType == INodeNotifier.ADD || eventType == INodeNotifier.REMOVE) {
-			// for ADD and REMOVE, system will fire CHANGE event, so we ignore
-			// the ADD/REMOVE
-			// event here.
-			return;
-		}
-		if (notifier instanceof IDOMNode) {
-			IDOMNode node = (IDOMNode) notifier;
-			// we need to refresh all CSS style adapter of node and its
-			// children.
-			EditPart part = (EditPart) node.getAdapterFor(EditPart.class);
-			if (part instanceof SubNodeEditPart) {
-				Node nodeForFigure = ((SubNodeEditPart) part)
-						.getNodeForFigure();
-				if (nodeForFigure instanceof IDOMNode) {
-					refreshChildStyles((IDOMNode) nodeForFigure);
-				}
-			}
-
-			// we need also find the nearest parent node that has editpart, and
-			// refresh it.
-			refreshContainingPart(node,
-					eventType == INodeNotifier.STRUCTURE_CHANGED);
-
-			part = (EditPart) node.getAdapterFor(EditPart.class);
-			if (part != null) {
-				((IHTMLGraphicalViewer) part.getViewer()).clearSelectionRange();
-			}
-		}
-	}
-
-	/**
-	 * @param node
-	 */
-	private void refreshContainingPart(IDOMNode node, boolean recursive) {
-		if (node.getOwnerDocument() == node) {
-			EditPart part = (EditPart) node.getAdapterFor(EditPart.class);
-			if (part != null) {
-				part.refresh();
-			}
-		} else {
-			while (node != null) {
-				EditPart part = (EditPart) node.getAdapterFor(EditPart.class);
-				if (part != null) {
-					if (part instanceof ElementEditPart) {
-						((ElementEditPart) part).refreshModelChange(recursive);
-					} else {
-						part.refresh();
-					}
-					return;
-				}
-				node = (IDOMNode) node.getParentNode();
-			}
-		}
-	}
-
-	/**
-	 * @param node
-	 */
-	private void refreshChildStyles(IDOMNode node) {
-		NodeList childNodes = node.getChildNodes();
-		for (int i = 0, size = childNodes.getLength(); i < size; i++) {
-			refreshChildStyles((IDOMNode) childNodes.item(i));
-		}
-		if (node instanceof IDOMElement) {
-			// only refresh style on element.
-			ICSSStyle a = (ICSSStyle) node.getAdapterFor(ICSSStyle.class);
-			if (a != null) {
-				a.reset();
-			}
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/RefresherFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/RefresherFactory.java
deleted file mode 100644
index bb9c599..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/RefresherFactory.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.parts;
-
-import org.eclipse.wst.sse.core.internal.provisional.AbstractAdapterFactory;
-import org.eclipse.wst.sse.core.internal.provisional.INodeAdapter;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class RefresherFactory extends AbstractAdapterFactory {
-	private final Refresher refresher = new Refresher();
-
-	RefresherFactory() {
-		super(Refresher.class, true);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @seeorg.eclipse.wst.sse.core.internal.provisional.AbstractAdapterFactory#createAdapter(org.eclipse.wst.sse.core.internal.provisional.INodeNotifier)
-	 */
-	protected INodeAdapter createAdapter(INodeNotifier target) {
-		return refresher;
-	}
-
-	static RefresherFactory _instance = new RefresherFactory();
-
-	/**
-	 * @return the factory singleton
-	 */
-	public static RefresherFactory getInstance() {
-		return _instance;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/SubNodeEditPart.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/SubNodeEditPart.java
deleted file mode 100644
index 8056dd9..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/SubNodeEditPart.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.parts;
-
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public abstract class SubNodeEditPart extends NodeEditPart {
-	/**
-	 * 
-	 * @return could be null
-	 */
-	public abstract Node getNodeForFigure();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/TextEditPart.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/TextEditPart.java
deleted file mode 100644
index 4535c58..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/TextEditPart.java
+++ /dev/null
@@ -1,186 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.parts;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.SharedCursors;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.layout.CSSTextFigure;
-import org.eclipse.jst.pagedesigner.css2.layout.ICSSFigure;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.css2.provider.ICSSTextProvider;
-import org.eclipse.jst.pagedesigner.css2.style.DefaultStyle;
-import org.eclipse.jst.pagedesigner.editpolicies.LinkEditPolicy;
-import org.eclipse.jst.pagedesigner.range.RangeUtil;
-import org.eclipse.jst.pagedesigner.utils.HTMLUtil;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.eclipse.swt.graphics.Cursor;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.w3c.dom.Node;
-import org.w3c.dom.Text;
-
-/**
- * @author mengbo
- */
-public class TextEditPart extends SubNodeEditPart implements ICSSTextProvider {
-	private String _cachedData;
-
-	private Text _textNode;
-
-	private Text _textNodeForFigure;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.EditPart#setModel(java.lang.Object)
-	 */
-	public void setModel(Object model) {
-		super.setModel(model);
-		_textNode = (Text) model;
-		_cachedData = _textNode.getData();
-		_textNodeForFigure = getDestDocumentForDesign().createTextNode(
-				_cachedData);
-	}
-
-	protected IFigure createFigure() {
-		// XXX: currently creating of CSSTextFigure is distributed both here
-		// and FigureFactory. We may want to unify them later.
-		return new CSSTextFigure(this);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.AbstractEditPart#createEditPolicies()
-	 */
-	protected void createEditPolicies() {
-		super.createEditPolicies();
-		this.installEditPolicy("link editpolicy", new LinkEditPolicy()); //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.parts.SubNodeEditPart#getNodeForFigure()
-	 */
-	public Node getNodeForFigure() {
-		return _textNodeForFigure;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.sse.model.INodeAdapter#notifyChanged(com.ibm.sse.model.INodeNotifier,
-	 *      int, java.lang.Object, java.lang.Object, java.lang.Object, int)
-	 */
-	public void notifyChanged(INodeNotifier notifier, int eventType,
-			Object changedFeature, Object oldValue, Object newValue, int pos) {
-		_cachedData = _textNode.getData();
-		_textNodeForFigure.setData(_cachedData);
-		if (eventType == INodeNotifier.CHANGE) {
-			getFigure().revalidate();
-		} else {
-			// XXX: been removed? parent EditPart should have handled it.
-		}
-	}
-
-
-	/**
-	 * @return the associated css style for this text node
-	 */
-	public ICSSStyle getCSSStyle() {
-		IFigure figure1 = this.getFigure();
-		if (figure1 instanceof ICSSFigure) {
-			ICSSStyle style = ((ICSSFigure) figure1).getCSSStyle();
-			if (style != null) {
-				return style;
-			}
-		}
-		return DefaultStyle.getInstance();
-	}
-
-	/**
-	 * As when text are displayed in HTML, they are "normalized". For example,
-	 * leading whitespace may be removed dure to previous node as trailing
-	 * whitespace. Entity reference may have be resolved. Sequence whitespace
-	 * been merged.
-	 * 
-	 * It is also possible that the text node is in "PRE" mode, in that case the
-	 * above things are not done.
-	 * 
-	 * This method return the really value that is going to be presented to
-	 * user. EditPartPosition's offset is referencing this value.
-	 * 
-	 * @return the text data
-	 * @see org.eclipse.jst.pagedesigner.viewer.DesignPosition
-	 */
-	public String getTextData() {
-		ICSSStyle style = getCSSStyle();
-		String data = _cachedData;
-		if (style.getStyleProperty(ICSSPropertyID.ATTR_WHITESPACE) != ICSSPropertyID.VAL_PRE) {
-			return HTMLUtil.compactWhitespaces(_textNode, data);
-		}
-        return data;
-	}
-
-	/**
-	 * check what part of this text node is in the range selection.
-	 * 
-	 * @return text node ranges
-	 */
-	public int[] getSelectedRange() {
-		IHTMLGraphicalViewer viewer = (IHTMLGraphicalViewer) this.getViewer();
-		if (viewer == null || !viewer.isInRangeMode()) {
-			return null;
-		}
-		DesignRange range = viewer.getRangeSelection();
-		if (range == null || !range.isValid()) {
-			return null;
-		}
-		if (!RangeUtil.intersect(range, this)) {
-			return null;
-		}
-		// ok, we intersect with the range.
-		range = RangeUtil.normalize(range);
-		EditPart startContainer = range.getStartPosition().getContainerPart();
-		EditPart endContainer = range.getEndPosition().getContainerPart();
-		int[] ret = new int[2];
-		if (startContainer != this) {
-			ret[0] = 0;
-		} else {
-			ret[0] = range.getStartPosition().getOffset();
-		}
-		if (endContainer != this) {
-			ret[1] = this.getTextData().length();
-		} else {
-			{
-				ret[1] = range.getEndPosition().getOffset();
-			}
-		}
-		return ret;
-	}
-
-	public boolean isSelectable() {
-        // controls, amongst other things, whether or not a standard 
-        // hit test in SelectionTool for mouse over will find this edit part 
-		return true;
-	}
-
-    public Cursor getCursor(Point mouseLocation) {
-        return SharedCursors.IBEAM;
-    }
-    
-    
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/preview/PageExpressionContext.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/preview/PageExpressionContext.java
deleted file mode 100644
index 83d190d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/preview/PageExpressionContext.java
+++ /dev/null
@@ -1,205 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.preview;
-
-import java.io.BufferedInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.lang.reflect.Method;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.Properties;
-
-import javax.servlet.jsp.el.ELException;
-import javax.servlet.jsp.el.FunctionMapper;
-import javax.servlet.jsp.el.VariableResolver;
-
-import org.apache.commons.el.ExpressionEvaluatorImpl;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IStorage;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.jsf.common.ui.internal.utils.ResourceUtils;
-import org.eclipse.jst.jsf.core.internal.tld.LoadBundleUtil;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.jsp.core.el.JSFELParserHelper;
-import org.eclipse.jst.pagedesigner.jsp.core.pagevar.IPageVariablesProvider;
-import org.eclipse.jst.pagedesigner.jsp.core.pagevar.IVariableInfo;
-
-/**
- * This is a static class. But it has "session" concept in it. To make it static
- * is only to simplify its use.
- * 
- * This class currently is only used by TagConverter, when calculating the
- * displayed string for resource bundle items.
- * 
- * XXX: in the future, if we want to this to be non-static, we may incorportate
- * it into the context of the tag converter.
- * 
- * @author mengbo
- * @version 1.5
- */
-// TODO: we may consider support cache the properties.
-public class PageExpressionContext {
-	private static final Logger _log = PDPlugin
-			.getLogger(PageExpressionContext.class);
-
-	static PageExpressionContext _current;
-
-	List _pageVarProviders = new ArrayList();
-
-	VariableResolver resolver = new SimpleVariableResolver();
-
-	private IProject _prj;
-
-	/**
-	 * @param prj
-	 */
-	public PageExpressionContext(IProject prj) {
-		_prj = prj;
-	}
-
-	/**
-	 * reset the context.
-	 */
-	public static void reset() {
-		_current = null;
-	}
-
-	/**
-	 * Initialize the current context
-	 * @param prj
-	 */
-	public static void initialize(IProject prj) {
-		_current = new PageExpressionContext(prj);
-	}
-
-	/**
-	 * @return the current context
-	 */
-	public static PageExpressionContext getCurrent() {
-		return _current;
-	}
-
-	/**
-	 * @param provider
-	 */
-	public void pushPageVarProvider(IPageVariablesProvider provider) {
-		_pageVarProviders.add(provider);
-	}
-
-	/**
-	 * @param provider
-	 */
-	public void popPageVarProvider(IPageVariablesProvider provider) {
-		try {
-			_pageVarProviders.remove(_pageVarProviders.size() - 1);
-		} catch (Exception ex) {
-			// "Error"
-			_log.info("PageExpressionContext.Info.0", ex); //$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * this method is for design time expression evaluation. Currently it only
-	 * handles
-	 * 
-	 * @param expression
-	 * @param expectedClass 
-	 * @param options
-	 *            XXX: not used today. In the future, we may support things like
-	 *            locale in options
-	 * @return the result of evaluating the expression
-	 * @throws ELException 
-	 */
-	public Object evaluateExpression(String expression, Class expectedClass,
-			Map options) throws ELException {
-		expression = JSFELParserHelper.toJspElExpression(expression);
-		ExpressionEvaluatorImpl evaluator = new ExpressionEvaluatorImpl();
-		FunctionMapper mapper = new EmptyFunctionMapper();
-
-		return evaluator.evaluate(expression, expectedClass, resolver, mapper);
-	}
-
-	class SimpleVariableResolver implements VariableResolver {
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see javax.servlet.jsp.el.VariableResolver#resolveVariable(java.lang.String)
-		 */
-		public Object resolveVariable(String varName) throws ELException {
-			// reverse order.
-			for (int k = _pageVarProviders.size() - 1; k >= 0; k--) {
-				IPageVariablesProvider _pageVars = (IPageVariablesProvider) _pageVarProviders
-						.get(k);
-				if (_pageVars != null) {
-					IVariableInfo[] vars = _pageVars.getBeanInfos();
-					if (vars != null) {
-						for (int i = 0; i < vars.length; i++) {
-							if (varName.equals(vars[i].getName())) {
-								// ok we found.
-								if (vars[i].getMode() == IVariableInfo.RESOURCEBUNDLE) {
-									String resourceName = vars[i]
-											.getTypeInfoString();
-									IStorage s = null;
-									try {
-										s = LoadBundleUtil
-												.getLoadBundleResource(_prj,
-														resourceName);
-									} catch (CoreException ex) {
-										// "Error"
-										_log
-												.info(
-														"PageExpressionContext.Info.0", ex); //$NON-NLS-1$
-									}
-									if (s == null) {
-										throw new ELException();
-									}
-									InputStream input = null;
-									try {
-										input = new BufferedInputStream(s
-												.getContents());
-										Properties p = new Properties();
-										p.load(input);
-										return p;
-									} catch (CoreException e) {
-										throw new ELException(e);
-									} catch (IOException e) {
-										throw new ELException(e);
-									} finally {
-										ResourceUtils.ensureClosed(input);
-									}
-								}
-							}
-						}
-					}
-				}
-			}
-			throw new ELException("Can't find: " + varName); //$NON-NLS-1$
-		}
-
-	}
-
-	static class EmptyFunctionMapper implements FunctionMapper {
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see javax.servlet.jsp.el.FunctionMapper#resolveFunction(java.lang.String,
-		 *      java.lang.String)
-		 */
-		public Method resolveFunction(String arg0, String arg1) {
-			return null;
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/preview/PreviewConvertContext.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/preview/PreviewConvertContext.java
deleted file mode 100644
index 4c0b2f7..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/preview/PreviewConvertContext.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.preview;
-
-import java.util.List;
-
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.converter.ConvertPosition;
-import org.eclipse.jst.pagedesigner.converter.IConverterFactory;
-import org.eclipse.jst.pagedesigner.converter.ITagConverter;
-import org.eclipse.jst.pagedesigner.dtmanager.DTManager;
-import org.eclipse.wst.xml.core.internal.document.InvalidCharacterException;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMText;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.w3c.dom.Text;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class PreviewConvertContext {
-	private Logger _log = PDPlugin.getLogger(PreviewConvertContext.class);
-
-	private IDOMDocument _destDocument;
-
-	/**
-	 * Instantiates an instance for the specified IDOMDocument.
-	 * 
-	 * @param destDocument IDOMDocument instance.
-	 */
-	public PreviewConvertContext(IDOMDocument destDocument) {
-		this._destDocument = destDocument;
-	}
-
-	/**
-	 * Converts specified Node for preview.
-	 * 
-	 * @param ele Node instance to convert.
-	 * @return Converted Node instance.
-	 */
-	public Node previewConvert(Node ele) {
-		if (ele instanceof Element) {
-			return previewConvertElement((Element) ele);
-		} else if (ele instanceof Text) {
-			return createText((Text) ele);
-		} else {
-			// XXX: we'll support other node like doctype etc in the future.
-			// so they should also be rendered into preview.
-
-			return null;
-		}
-	}
-
-	/**
-	 * @param text
-	 * @return
-	 */
-	private Node createText(Text text) {
-		Text previewText = this._destDocument.createTextNode(text.getData());
-		try {
-			((IDOMText) previewText).setSource(((IDOMText) text).getSource());
-		} catch (InvalidCharacterException e) {
-			// "Error"
-			_log.info("PreviewConvertContext.Error.0", e); //$NON-NLS-1$
-		}
-		return previewText;
-	}
-
-	/**
-	 * Converts specified Element instance for preview.
-	 * 
-	 * @param ele Element instance to be converted.
-	 * @return Converted Node instance.
-	 */
-	protected Node previewConvertElement(Element ele) {
-		ITagConverter converter = createTagConverter(ele);
-		if (!converter.isVisualByHTML()) {
-			return null;
-		}
-		converter.convertRefresh(null);
-		Element result = converter.getResultElement();
-		List children = converter.getChildModeList();
-		if (children != null) {
-			for (int i = 0, size = children.size(); i < size; i++) {
-				Node child = (Node) children.get(i);
-				if (child != null) {
-					Node childPreview = previewConvert(child);
-					if (childPreview != null) {
-						ConvertPosition position = converter
-								.getChildVisualPosition(child);
-						if (position != null) {
-							/* FIX for bug #179403
-							// FIXME: not using index here, need fix.
-							position.getParentNode().appendChild(childPreview);
-							*/
-							NodeList childNodes = position.getParentNode().getChildNodes();
-							if (childNodes.getLength() > position.getIndex()) {
-								Node item = childNodes.item(position.getIndex());
-								position.getParentNode().insertBefore(childPreview, item);
-							} else {
-								position.getParentNode().appendChild(childPreview);
-							}
-						}
-					}
-				}
-			}
-		}
-		return result;
-	}
-
-	/**
-	 * @param ele
-	 * @return
-	 */
-	private ITagConverter createTagConverter(Element ele) {
-		return DTManager.getInstance().getTagConverter(ele,
-				IConverterFactory.MODE_PREVIEW, _destDocument);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/preview/PreviewHandlerNew.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/preview/PreviewHandlerNew.java
deleted file mode 100644
index 881e306..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/preview/PreviewHandlerNew.java
+++ /dev/null
@@ -1,164 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.preview;
-
-import java.util.List;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.dtresourceprovider.DTSkinManager;
-import org.eclipse.jst.pagedesigner.dtresourceprovider.IDTSkin;
-import org.eclipse.jst.pagedesigner.jsp.core.pagevar.IPageVariablesProvider;
-import org.eclipse.jst.pagedesigner.jsp.core.pagevar.adapter.IDocumentPageVariableAdapter;
-import org.eclipse.jst.pagedesigner.parts.DocumentEditPart;
-import org.eclipse.jst.pagedesigner.parts.NodeEditPart;
-import org.eclipse.jst.pagedesigner.utils.PreviewUtil;
-import org.eclipse.jst.pagedesigner.utils.StructuredModelUtil;
-import org.eclipse.wst.html.core.internal.provisional.contenttype.ContentTypeIdForHTML;
-import org.eclipse.wst.sse.core.StructuredModelManager;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.eclipse.wst.xml.core.internal.document.XMLGeneratorImpl;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-import org.eclipse.wst.xml.core.internal.provisional.document.ISourceGenerator;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class PreviewHandlerNew {
-	//private static Logger _log = PDPlugin.getLogger(PreviewHandlerNew.class);
-
-	/**
-	 * @param part
-	 * @param result
-	 */
-	public static void generatePreview(DocumentEditPart part,
-			StringBuffer result) {
-		try {
-			IProject prj = StructuredModelUtil.getProjectFor(part.getIDOMNode()
-					.getModel());
-			PageExpressionContext.initialize(prj);
-
-			IDOMDocument doc = (IDOMDocument) part.getIDOMNode();
-			Object obj = doc.getAdapterFor(IDocumentPageVariableAdapter.class);
-			if (obj instanceof IPageVariablesProvider) {
-				((IPageVariablesProvider) obj).refresh();
-				PageExpressionContext.getCurrent().pushPageVarProvider(
-						(IPageVariablesProvider) obj);
-			} else {
-				PageExpressionContext.getCurrent().pushPageVarProvider(null);
-			}
-
-			// IDOMModel previewModel =
-			// (IDOMModel)StructuredModelManager.getModelManager().createNewInstance(doc.getModel());
-			// IDOMDocument previewDoc = previewModel.getDocument();
-
-			// CR400625: creating XML model here instead of HTML model. Since
-			// for HTML model, there are checking enforced
-			// by WTP to make sure the HTML content model is not invalidated.
-			// And sometimes, the converted HTML may not fully
-			// comply with HTML content model.
-			// Use XML instead to workaround the content model validation.
-
-			// CR403449: But if we use XML, then system can't recogonize special
-			// tag such as "script", "style", they
-			// support <!-- --> in them.
-			// So we are still using HTML model, but in TagConverter, we are
-			// always caling DOMUtil.cloneNodeDeepIgnoreError
-			// to try to skip the errors.
-			// Hopefully in later version of SSE, the famous "br" problem is
-			// fixed, and we won't met error when doing
-			// deep clone.
-			// IStructuredModel sModel =
-			// StructuredModelManager.getModelManager().createUnManagedStructuredModelFor(IContentTypeIdentifier.ContentTypeID_XML);
-			// FIXME: if is not jsp, should use original contentType, if is jsp,
-			// should use the corresponding
-			// content type
-			IStructuredModel sModel = StructuredModelManager.getModelManager()
-					.createUnManagedStructuredModelFor(
-							ContentTypeIdForHTML.ContentTypeID_HTML);
-
-			IDOMDocument previewDoc = ((IDOMModel) sModel).getDocument();
-			PreviewConvertContext context = new PreviewConvertContext(
-					previewDoc);
-
-			ISourceGenerator generator = XMLGeneratorImpl.getInstance();
-			List subeditparts = part.getChildren();
-			for (int i = 0, size = subeditparts.size(); i < size; i++) {
-				NodeEditPart subpart = (NodeEditPart) subeditparts.get(i);
-				Node node = context.previewConvert(subpart.getIDOMNode());
-
-				PreviewUtil.previewNode(node);
-
-				appendSkinStyleSheetLinks(node, subpart.getIDOMNode());
-
-				if (node != null) {
-					result.append(generator.generateSource(node));
-				}
-
-			}
-			sModel.releaseFromEdit();
-		} finally {
-			PageExpressionContext.reset();
-		}
-	}
-
-	private static void appendSkinStyleSheetLinks(Node previewNode, IDOMNode domNode) {
-		if (previewNode != null && domNode != null) {
-			Element head = locateHeadElement(previewNode);
-			if (head != null) {
-				Document document = head.getOwnerDocument();
-				if (document != null) {
-					DTSkinManager skinManager = DTSkinManager.getInstance(domNode);
-					if (skinManager != null) {
-						List<IDTSkin> currentSkins = skinManager.getCurrentSkins();
-						for (IDTSkin currentSkin: currentSkins) {
-							List<String> styleSheetLocations = currentSkin.getStyleSheetLocations();
-							for (String styleSheetLocation: styleSheetLocations) {
-								Element link = document.createElement(IHTMLConstants.TAG_LINK);
-								link.setAttribute(IHTMLConstants.ATTR_REL, "stylesheet"); //$NON-NLS-1$
-								link.setAttribute(IHTMLConstants.ATTR_TYPE, "text/css"); //$NON-NLS-1$
-								link.setAttribute(IHTMLConstants.ATTR_HREF, styleSheetLocation);
-								head.appendChild(link);
-							}
-						}
-					}
-				}
-			}
-		}
-	}
-
-	private static Element locateHeadElement(Node node) {
-		Element head = null;
-		if (node != null && node instanceof Element) {
-			if (node.getLocalName().equalsIgnoreCase(IHTMLConstants.TAG_HEAD)) {
-				head = (Element)node;
-			} else {
-				NodeList childNodes = node.getChildNodes();
-				for (int i = 0, len = childNodes.getLength(); i < len; i++) {
-					head = locateHeadElement(childNodes.item(i));
-					if (head != null) {
-						break;
-					}
-				}
-			}
-		}
-		return head;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/preview/PreviewResources.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/preview/PreviewResources.java
deleted file mode 100644
index 6aa3c67..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/preview/PreviewResources.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.preview;
-
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.jsf.common.ui.internal.utils.ResourceUtils;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-
-/**
- * @author mengbo
- */
-public class PreviewResources extends ResourceUtils {
-	/** Create the logger for this class */
-	private static Logger _log = PDPlugin.getLogger(PreviewResources.class);
-
-	private static PreviewResources _resource; // singleton
-
-	private static final String BUNDLE = "org.eclipse.jst.pagedesigner.preview.PreviewResources"; //$NON-NLS-1$
-
-	/**
-	 * Empty Constructor.
-	 * 
-	 * @return WizardsResources
-	 */
-
-	public static PreviewResources getInstance() {
-		if (_resource == null) {
-			_resource = new PreviewResources();
-		}
-		return _resource;
-	}
-
-	/**
-	 * The constructor create a resource bundle
-	 */
-	protected PreviewResources() {
-		try {
-			_resources = ResourceBundle.getBundle(BUNDLE);
-			// NOTE: this throws a runtime "MissingResourceException".
-		} catch (MissingResourceException ee) {
-			_log
-					.error(
-							"Log.Error.PreviewResources.ResouceNotFound", BUNDLE, ee); //$NON-NLS-1$
-		}
-		setBundle(_resources, BUNDLE);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/preview/PreviewResources.properties b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/preview/PreviewResources.properties
deleted file mode 100644
index 1e42ee3..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/preview/PreviewResources.properties
+++ /dev/null
@@ -1,16 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-####################################################
-# Resource message for RenderingTraverser
-####################################################
-RenderingTraverser.Error.FileNotFound		=	File not found.
-RenderingTraverser.Error.UnsupportedEncoding	=	Unsupport encoding.
-RenderingTraverser.Error.IO		=	IO exception.
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/preview/WindowsIEBrowser.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/preview/WindowsIEBrowser.java
deleted file mode 100644
index b1811ab..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/preview/WindowsIEBrowser.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.preview;
-
-import java.io.File;
-
-import org.eclipse.swt.browser.Browser;
-import org.eclipse.swt.browser.ProgressEvent;
-import org.eclipse.swt.browser.ProgressListener;
-import org.eclipse.swt.widgets.Composite;
-
-/**
- * Models the windows IE browser for preview
- *
- */
-public class WindowsIEBrowser implements ProgressListener {
-	private Browser _browser;
-
-	/**
-	 * @param composite
-	 * @param i
-	 */
-	public void create(Composite composite, int i) {
-		_browser = new Browser(composite, i);
-		_browser.addProgressListener(this);
-	}
-
-	/**
-	 * @param file
-	 */
-	public synchronized void loadFile(File file) {
-		if (_browser == null) {
-			return;
-		}
-        String s = "file:" + file.getAbsolutePath(); //$NON-NLS-1$
-        _browser.setUrl(s);
-        return;
-	}
-
-	/**
-	 * dispose the instance
-	 */
-	public void dispose() {
-		if (_browser == null) {
-			return;
-		}
-        _browser.dispose();
-        _browser = null;
-        return;
-	}
-
-	public void changed(ProgressEvent progressevent) {
-        // do nothing
-	}
-
-	public void completed(ProgressEvent progressevent) {
-	    // do nothing
-	}
-
-	/**
-	 * @return the underlying swt Browser instance
-	 */
-	public Browser getBrowser() {
-		return _browser;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/AllPropertySection.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/AllPropertySection.java
deleted file mode 100644
index 3c40094..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/AllPropertySection.java
+++ /dev/null
@@ -1,148 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.swt.layout.FormAttachment;
-import org.eclipse.swt.layout.FormData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.views.properties.IPropertySourceProvider;
-import org.eclipse.ui.views.properties.tabbed.AbstractPropertySection;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
-import org.eclipse.wst.sse.core.internal.provisional.INodeAdapter;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * Mainly copied from AdvancedPropertySection. But extend it to allow setting
- * PropertySourceProvider.
- * 
- * @author mengbo
- */
-public class AllPropertySection extends AbstractPropertySection {
-	// FIXME: workaround the eclipse properties view limitation of sorting
-	// category.
-	private AttributePropertySheetPage page;
-
-	/**
-	 * IPropertySourceProvider for this section
-	 */
-	protected IPropertySourceProvider _provider;
-
-	/**
-	 * selected tag IDOMElement 
-	 */
-	protected IDOMElement _element;
-
-	/**
-	 * The INodeAdapter to use for notification of model change
-	 */
-	protected INodeAdapter _adapter = new INodeAdapter() {
-		public boolean isAdapterForType(Object type) {
-			return false;
-		}
-
-		public void notifyChanged(INodeNotifier notifier, int eventType,
-				Object changedFeature, Object oldValue, Object newValue, int pos) {
-			refresh();
-		}
-	};
-
-	/**
-	 * Constructor
-	 */
-	public AllPropertySection() {
-		this.setPropertySourceProvider(new AttributePropertySourceProvider());
-	}
-
-	@Override
-	public void createControls(Composite parent,
-			TabbedPropertySheetPage tabbedPropertySheetPage) {
-		super.createControls(parent, tabbedPropertySheetPage);
-		
-	
-		Composite composite = getWidgetFactory()
-				.createFlatFormComposite(parent);
-		page = new AttributePropertySheetPage();
-		page.init(tabbedPropertySheetPage.getSite());
-
-		if (_provider != null) {
-			page.setPropertySourceProvider(_provider);
-		}
-
-		page.createControl(composite);
-		FormData data = new FormData();
-		data.left = new FormAttachment(0, 0);
-		data.right = new FormAttachment(100, 0);
-		data.top = new FormAttachment(0, 0);
-		data.bottom = new FormAttachment(100, 0);
-		data.height = 100;
-		data.width = 100;
-		page.getControl().setLayoutData(data);
-	}
-
-	@Override
-	public void setInput(IWorkbenchPart part, ISelection selection) {
-		IDOMElement newEle = (IDOMElement) DesignerPropertyTool.getElement(
-				part, selection);
-
-		if (_element != newEle && page != null) {
-			super.setInput(part, selection);
-			page.selectionChanged(part, selection);
-			if (_element != null) {
-				_element.removeAdapter(_adapter);
-			}
-			_element = newEle;
-			if (_element != null) {
-				_element.addAdapter(_adapter);
-			}
-		}
-	}
-
-	@Override
-	public void dispose() {
-		super.dispose();
-
-		if (_element != null) {
-			_element.removeAdapter(_adapter);
-		}
-		if (page != null) {
-			page.dispose();
-			page = null;
-		}
-	}
-
-	@Override
-	public void refresh() {
-		if (page != null)
-			page.refresh();
-	}
-
-	@Override
-	public boolean shouldUseExtraSpace() {
-		return true;
-	}
-
-	/**
-	 * Set provider into tabbedPropertiesPage
-	 * @param provider
-	 */
-	public void setPropertySourceProvider(IPropertySourceProvider provider) {
-		_provider = provider;
-		if (page != null){
-			page.setPropertySourceProvider(_provider);
-
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/AttributePropertySheetPage.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/AttributePropertySheetPage.java
deleted file mode 100644
index 9b236f9..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/AttributePropertySheetPage.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties;
-
-import org.eclipse.jst.pagedesigner.meta.internal.CategoryNameComparator;
-import org.eclipse.ui.views.properties.PropertySheetPage;
-import org.eclipse.ui.views.properties.PropertySheetSorter;
-
-/**
- * In PropertySheetPage, the <code>setSorter</code> is protected. Creating
- * this class to make setSorter accessible to us.
- * 
- * @author mengbo
- * @version 1.5
- */
-public class AttributePropertySheetPage extends PropertySheetPage {
-//	TODO: add actions
-//	public void makeContributions(IMenuManager menuManager,
-//			IToolBarManager toolBarManager, IStatusLineManager statusLineManager) {
-//		super.makeContributions(menuManager, toolBarManager, statusLineManager);
-//		//add actions here
-//			hide/show all categories
-//			collapse
-//			remove
-//	}
-
-	/**
-	 * Use my sorter to sort the category name. Only override the
-	 * compareCategories method.
-	 * 
-	 * @author mengbo
-	 * @version 1.5
-	 */
-	private static class MySorter extends PropertySheetSorter {
-		public int compareCategories(String categoryA, String categoryB) {
-			return CategoryNameComparator.getInstance().compare(categoryA,
-					categoryB);
-		}
-	}
-
-	/**
-	 * Constructor
-	 */
-	public AttributePropertySheetPage() {
-		super();
-		setSorter(new MySorter());
-	}
-
-//	public void createControl(Composite parent) {
-//		super.createControl(parent);
-////		PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(),
-////				PDPlugin.getResourceString("MyPropertySheetPage.help.id"));
-//	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/AttributePropertySource.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/AttributePropertySource.java
deleted file mode 100644
index 6ed998f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/AttributePropertySource.java
+++ /dev/null
@@ -1,251 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jst.jsf.common.metadata.Entity;
-import org.eclipse.jst.jsf.common.metadata.query.ITaglibDomainMetaDataModelContext;
-import org.eclipse.jst.jsf.common.metadata.query.TaglibDomainMetaDataQueryHelper;
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.ITagAttribute;
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.ITagElement;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IStructuredDocumentContextResolverFactory;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.ITaglibContextResolver;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IWorkspaceContextResolver;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.internal.IStructuredDocumentContextResolverFactory2;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContextFactory;
-import org.eclipse.jst.jsf.designtime.internal.resolver.ITagElementResolver;
-import org.eclipse.jst.jsf.metadataprocessors.MetaDataEnabledProcessingFactory;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.commands.single.ChangeAttributeCommand;
-import org.eclipse.jst.pagedesigner.editors.properties.IPropertyPageDescriptor;
-import org.eclipse.ui.views.properties.IPropertyDescriptor;
-import org.eclipse.ui.views.properties.IPropertySource;
-import org.eclipse.ui.views.properties.PropertyDescriptor;
-import org.eclipse.ui.views.properties.TextPropertyDescriptor;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.w3c.dom.Element;
-
-/**
- * 
- * @author mengbo
- */
-public class AttributePropertySource implements IPropertySource {
-	private IDOMElement _element;
-
-	private IPropertySource _innerSource;
-
-	private Entity _tagEntity;
-
-	private IStructuredDocumentContext _context;
-
-	private IPropertyDescriptor[] _descriptors;
-
-	/**
-	 * Constructor
-	 * @param ele
-	 * @param source
-	 */
-	public AttributePropertySource(Element ele, IPropertySource source) {
-		_element = (IDOMElement) ele;
-		_innerSource = source;
-		_tagEntity = getTagEntity();
-	}
-
-	private Entity getTagEntity() {
-		_context = 
-				IStructuredDocumentContextFactory.INSTANCE.getContext(_element.getStructuredDocument(), _element);
-		if (_context == null) 
-			return null;
-		
-		IWorkspaceContextResolver wsresolver = 
-				IStructuredDocumentContextResolverFactory.INSTANCE.getWorkspaceContextResolver(_context);
-		if (wsresolver == null) 
-			return null;
-		
-		ITaglibContextResolver resolver = 
-				IStructuredDocumentContextResolverFactory.INSTANCE.getTaglibContextResolver(_context);
-		if (resolver == null) return null;
-		
-		String uri = resolver.getTagURIForNodeName(_element);
-		
-		//TODO: make below better
-		if (uri == null){
-			if (_element.getNamespaceURI() != null && _element.getNamespaceURI().equals("http://java.sun.com/JSP/Page")) //$NON-NLS-1$
-				uri = "JSP11"; //$NON-NLS-1$
-			else
-				uri = "HTML"; //$NON-NLS-1$
-		}
-		ITaglibDomainMetaDataModelContext domainContext = 
-				TaglibDomainMetaDataQueryHelper.createMetaDataModelContext(wsresolver.getProject(), uri);
-		return TaglibDomainMetaDataQueryHelper.getEntity(domainContext, _element.getLocalName());		
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.properties.IPropertySource#getEditableValue()
-	 */
-	public Object getEditableValue() {
-		return _innerSource.getEditableValue();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.properties.IPropertySource#getPropertyValue(java.lang.Object)
-	 */
-	public Object getPropertyValue(Object id) {
-		// CR377844: when the attribute in source is "a&gt;b", we would like to
-		// display
-		// "a>b" in cell editor. But _innerSource.getPropertyValue(id) will
-		// return the source
-		// of the attribute, so can't use that here.
-		// read QTS log for detail.
-		// return _innerSource.getPropertyValue(id);
-		if (id == null) {
-			return null;
-		}
-		String name = id.toString();
-		String value = _element.getAttribute(name);
-		if (value == null) {
-			value = ""; //$NON-NLS-1$
-		}
-		return value;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.properties.IPropertySource#isPropertySet(java.lang.Object)
-	 */
-	public boolean isPropertySet(Object id) {
-		return _innerSource.isPropertySet(id);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.properties.IPropertySource#resetPropertyValue(java.lang.Object)
-	 */
-	public void resetPropertyValue(Object id) {
-		_innerSource.resetPropertyValue(id);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.properties.IPropertySource#setPropertyValue(java.lang.Object,
-	 *      java.lang.Object)
-	 */
-	public void setPropertyValue(final Object id, final Object value) {
-		Object oldValue = getPropertyValue(id);
-		if (oldValue == value || (oldValue != null && oldValue.equals(value))) {
-			return;
-		}
-		Command c = new ChangeAttributeCommand(
-				PDPlugin
-						.getResourceString("AttributePropertySource.CommandLabel.ChangeAttribute"), _element, (String) id, (String) value); //$NON-NLS-1$
-		c.execute();
-	}
-
-	/**
-	 * the major job of this wrapper is to provide tag attribute property descriptors 
-	 */
-	public IPropertyDescriptor[] getPropertyDescriptors() {
-		if (_descriptors == null) {
-			final List result = new ArrayList();
-			
-			final ITagElementResolver tagregResolver = IStructuredDocumentContextResolverFactory2.INSTANCE
-					.getResolver(_context, ITagElementResolver.class);
-			
-			if (tagregResolver != null) { //relies on getTagEntity() having been called to have setup the _element
-				final ITagElement tag = tagregResolver.getTagElement(_element);
-				if (tag != null) {
-					for (final ITagAttribute attr : tag.getAttributes().values()) {
-						final IPropertyDescriptor pd = getAttrPropertyDescriptor(attr
-								.getName());
-						if (pd != null)
-							result.add(new PropertyDescriptorWrapper(_element,
-									pd));// ,
-							// getStatusLineManager()));
-						else {
-							final PropertyDescriptor pd1 = new TextPropertyDescriptor(
-									attr.getName(), attr.getName());
-							pd1.setDescription(attr.getDescription());
-							pd1.setCategory(ITabbedPropertiesConstants.OTHER_CATEGORY);
-							result.add(new PropertyDescriptorWrapper(_element,
-									pd1));// ,
-							// getStatusLineManager()));
-						}
-
-					}
-				}
-			}
-			
-			if (result.size() == 0) {// for JSP and HTML cases
-														// this is still
-														// necessary
-				final IPropertyDescriptor[] descs = _innerSource.getPropertyDescriptors();
-				for (int i = 0; i < descs.length; i++) {
-					final IPropertyDescriptor pd = getAttrPropertyDescriptor((String) descs[i]
-							.getId());
-					if (pd != null)
-						result.add(new PropertyDescriptorWrapper(_element, pd));// ,
-					// getStatusLineManager()));
-					else {
-						if (descs[i] instanceof PropertyDescriptor)
-							((PropertyDescriptor) descs[i])
-									.setCategory(ITabbedPropertiesConstants.OTHER_CATEGORY);
-						result.add(new PropertyDescriptorWrapper(_element,
-								descs[i]));// ,
-						// getStatusLineManager()));
-					}
-
-				}
-			}
-
-			_descriptors = new IPropertyDescriptor[result.size()];
-			result.toArray(_descriptors);
-
-		}
-		return _descriptors;
-	}
-
-//	private IAttributeDescriptor findReferencedAttribute(
-//			IElementDescriptor elementDescriptor, IPropertyDescriptor desc) {
-//		return null;
-//	}
-
-//	private IElementDescriptor getElementDescriptor() {
-//		ICMRegistry registry = CMRegistry.getInstance();
-//		String uri = CMUtil.getElementNamespaceURI(_element);
-//		return registry.getElementDescriptor(uri, _element.getLocalName());
-//	}
-
-	private IPropertyDescriptor getAttrPropertyDescriptor(String attrName){
-		Entity attrEntity = TaglibDomainMetaDataQueryHelper.getEntity(_tagEntity, attrName);
-		List ppds = MetaDataEnabledProcessingFactory.getInstance().getAttributeValueRuntimeTypeFeatureProcessors(IPropertyPageDescriptor.class, _context, attrEntity);
-		if (ppds.size() > 0)
-			return (IPropertyDescriptor)((IPropertyPageDescriptor)ppds.get(0)).getAdapter(IPropertyDescriptor.class);
-		
-		return null;
-			
-	}
-	
-//	private IStatusLineManager getStatusLineManager() {
-//		_page.getSite().getActionBars().getStatusLineManager();
-//	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/AttributePropertySourceProvider.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/AttributePropertySourceProvider.java
deleted file mode 100644
index 086072b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/AttributePropertySourceProvider.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties;
-
-import org.eclipse.ui.views.properties.IPropertySource;
-import org.eclipse.ui.views.properties.IPropertySourceProvider;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.eclipse.wst.xml.ui.internal.properties.XMLPropertySource;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- */
-public class AttributePropertySourceProvider implements IPropertySourceProvider {
-
-	/**
-	 * Constructor
-	 */
-	public AttributePropertySourceProvider() {
-		//
-	}
-
-	public IPropertySource getPropertySource(Object object) {
-		Element model = null;
-		IPropertySource source = null;
-
-		if ((model = DesignerPropertyTool.getElementNode(object)) != null) {
-			source = (IPropertySource) ((INodeNotifier) (model))
-					.getAdapterFor(IPropertySource.class);
-			if (source == null) {
-				source = new XMLPropertySource((INodeNotifier) model);
-			}
-		}
-		if (source != null) {
-			return new AttributePropertySource( model, source);
-		}
-		return source;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/BaseCustomSection.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/BaseCustomSection.java
deleted file mode 100644
index db8742d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/BaseCustomSection.java
+++ /dev/null
@@ -1,258 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.action.IStatusLineManager;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.StatusUtil;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IFileEditorInput;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.views.properties.tabbed.AbstractPropertySection;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
-import org.eclipse.wst.sse.core.internal.provisional.INodeAdapter;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public abstract class BaseCustomSection extends AbstractPropertySection {
-
-	/**
-	 * Status that all is OK
-	 */
-	protected static final Status OKSTATUS = new Status(IStatus.OK, PDPlugin
-			.getPluginId(), 0, "", null); //$NON-NLS-1$
-
-	private WPETabbedPropertySheetPage _propertySheetPage;
-
-	private boolean _visible = false;
-
-	/**
-	 * the tag IDOMElement
-	 */
-	protected IDOMElement _element;
-
-	/**
-	 * the INodeAdapter used to receive notifications of model updates
-	 */
-	protected INodeAdapter _adapter = new INodeAdapter() {
-		public boolean isAdapterForType(Object type) {
-			return false;
-		}
-
-		public void notifyChanged(INodeNotifier notifier, int eventType,
-				Object changedFeature, Object oldValue, Object newValue, int pos) {
-			BaseCustomSection.this.notifyChanged(notifier, eventType,
-					changedFeature, oldValue, newValue, pos);
-		}
-	};
-
-	public void setInput(IWorkbenchPart part, ISelection selection) {
-		super.setInput(part, selection);
-		IDOMElement newEle = (IDOMElement) DesignerPropertyTool.getElement(
-				part, selection);
-		if (_element != newEle) {
-			if (_element != null) {
-				_element.removeAdapter(_adapter);
-			}
-			_element = newEle;
-			if (_element != null) {
-				_element.addAdapter(_adapter);
-			}
-		}
-	}
-
-	/**
-	 * Method adapter will call when element has changed
-	 * 
-	 * @param notifier
-	 * @param eventType
-	 * @param changedFeature
-	 * @param oldValue
-	 * @param newValue
-	 * @param pos
-	 */
-	protected abstract void notifyChanged(INodeNotifier notifier,
-			int eventType, Object changedFeature, Object oldValue,
-			Object newValue, int pos);
-
-	public void createControls(Composite parent,
-			TabbedPropertySheetPage aTabbedPropertySheetPage) {
-		super.createControls(parent, aTabbedPropertySheetPage);
-		_propertySheetPage = (WPETabbedPropertySheetPage) aTabbedPropertySheetPage;
-	}
-
-	/**
-	 * for certain action performed in the section, may result big change in the
-	 * model. e.g: change tag name will result in editpart recreate. In this
-	 * case, we need do a total refresh.
-	 * 
-	 */
-	protected void refreshPropertySheetPage() {
-		if (_propertySheetPage != null) {
-			IWorkbenchPart part = getPart();
-			if (part != null) {
-				ISelection sel = part.getSite().getSelectionProvider()
-						.getSelection();
-				_propertySheetPage.selectionChanged(part, sel);
-			} else {
-				// XXX: will else happen?
-				System.out.println("AbstractCustomSection --> What to do?"); //$NON-NLS-1$
-			}
-		}
-	}
-
-	/**
-	 * Change selection
-	 * @param node
-	 */
-	protected void gotoNode(Node node) {
-		_propertySheetPage.internalChangeSelection(node, node);
-	}
-
-	/**
-	 * @return IStatusLineManager to use for the property sheet page
-	 */
-	protected IStatusLineManager getStatusLineManager() {
-		if (_propertySheetPage != null) {
-			IActionBars bar = _propertySheetPage.getSite().getActionBars();
-			if (bar != null) {
-				return bar.getStatusLineManager();
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * @param status to display on status line
-	 */
-	protected void applyStatus(IStatus[] status) {
-		if (!_visible) {
-			return;
-		}
-
-		IStatusLineManager statusLine = getStatusLineManager();
-		if (statusLine == null) {
-			return;
-		}
-
-		IStatus s;
-		if (status == null || status.length == 0) {
-			s = null;
-		} else {
-			s = StatusUtil.getMostSevere(status);
-		}
-
-		if (s == null || s.getSeverity() != IStatus.ERROR) {
-			statusLine.setErrorMessage(null);
-		} else {
-			statusLine.setErrorMessage(s.getMessage());
-		}
-	}
-
-	/**
-	 * @param message
-	 */
-	protected void setErrorMessage(String message) {
-		IStatusLineManager s = getStatusLineManager();
-		if (s != null) {
-			s.setErrorMessage(message);
-		}
-	}
-
-	/**
-	 * @param message
-	 * @return Status
-	 */
-	protected Status createErrorStatus(String message) {
-		return new Status(IStatus.ERROR, PDPlugin.getPluginId(), 0, message,
-				null);
-	}
-
-	public void aboutToBeHidden() {
-		applyStatus(null);
-		_visible = false;
-//		IDOMElement newEle = (IDOMElement) DesignerPropertyTool.getElement(
-//				part, selection);
-//		if (_element != newEle) {
-			if (_element != null) {
-				_element.removeAdapter(_adapter);
-			}
-//			_element = newEle;
-//			if (_element != null) {
-//				_element.addAdapter(_adapter);
-//			}
-//		}
-		super.aboutToBeHidden();
-	}
-
-	public void aboutToBeShown() {
-		super.aboutToBeShown();
-//		IDOMElement newEle = (IDOMElement) DesignerPropertyTool.getElement(
-//				part, selection);
-//		if (_element != newEle) {
-//			if (_element != null) {
-//				_element.removeAdapter(_adapter);
-//			}
-//			_element = newEle;
-			if (_element != null) {
-				_element.addAdapter(_adapter);
-			}
-//		}
-		_visible = true;
-	}
-
-	/**
-	 * @return IProject for the WPE editing instance
-	 */
-	protected IProject getProject() {
-		if (_propertySheetPage != null) {
-			IEditorInput input = _propertySheetPage.getEditor()
-					.getEditorInput();
-			if (input instanceof IFileEditorInput) {
-				return ((IFileEditorInput) input).getFile().getProject();
-			}
-		}
-		return null;
-	}
-
-	public void dispose() {
-		super.dispose();
-		if (_element != null) {
-			_element.removeAdapter(_adapter);
-		}
-	}
-
-	/**
-	 * @return IFile for WPE editing instance
-	 */
-	protected IFile getFile() {
-		if (_propertySheetPage != null) {
-			IEditorInput input = _propertySheetPage.getEditor()
-					.getEditorInput();
-			if (input instanceof IFileEditorInput) {
-				return ((IFileEditorInput) input).getFile();
-			}
-		}
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/DesignerPropertyTool.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/DesignerPropertyTool.java
deleted file mode 100644
index d32d534..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/DesignerPropertyTool.java
+++ /dev/null
@@ -1,356 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IProjectNature;
-import org.eclipse.gef.editparts.AbstractEditPart;
-import org.eclipse.gef.ui.parts.GraphicalEditor;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jface.text.ITextSelection;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.dom.DOMUtil;
-import org.eclipse.jst.pagedesigner.editors.HTMLEditor;
-import org.eclipse.jst.pagedesigner.utils.SelectionHelper;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.editors.text.TextEditor;
-import org.eclipse.ui.views.contentoutline.ContentOutline;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
-import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.ModelQuery;
-import org.eclipse.wst.xml.core.internal.modelquery.ModelQueryUtil;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-import org.w3c.dom.Attr;
-import org.w3c.dom.CDATASection;
-import org.w3c.dom.Element;
-import org.w3c.dom.NamedNodeMap;
-import org.w3c.dom.Node;
-import org.w3c.dom.Text;
-
-/**
- * This is util class most used by Property related operation.
- * 
- * @author mengbo
- */
-public class DesignerPropertyTool {
-	
-	/**
-	 * @param fNode
-	 * @param attributeDesc
-	 * @return attribute value
-	 */
-	public static String getAttributeValue(Element fNode, CMNode attributeDesc) {
-		if (attributeDesc == null) {
-			return ""; //$NON-NLS-1$
-		}
-		String returnedValue = ""; //$NON-NLS-1$
-		NamedNodeMap attrMap = fNode.getAttributes();
-		if (attrMap != null) {
-			Node attribute = attrMap.getNamedItem(attributeDesc.getNodeName());
-			if (attribute != null) {
-				if (attribute instanceof IDOMNode) {
-					returnedValue = ((IDOMNode) attribute).getValueSource();
-				} else {
-					returnedValue = attribute.getNodeValue();
-				}
-			}
-		}
-		return returnedValue;
-	}
-
-//	/**
-//	 * @param fNode
-//	 * @param filter
-//	 * @return array of attributes as objects
-//   * (unused)	
-//	 */
-//	public static Object[] getElementReferedAttributes(Element fNode,
-//			String[] filter) {
-//		List result = new ArrayList();
-//		CMNamedNodeMap cmnnm = getElementDeclaredAttributes(fNode);
-//		for (int i = 0, n = cmnnm.getLength(); i < n; i++) {
-//			String name = cmnnm.item(i).getNodeName();
-//			if (Arrays.asList(filter).contains(name)) {
-//				result.add(cmnnm.item(i));
-//			}
-//		}
-//		return result.toArray(new CMNode[result.size()]);
-//	}
-
-	/**
-	 * @param fNode
-	 * @return CMNamedNodeMap
-	 */
-	public static CMNamedNodeMap getElementDeclaredAttributes(Node fNode) {
-		IStructuredModel structModel = null;
-		if (fNode instanceof IDOMNode) {
-			structModel = ((IDOMNode) fNode).getModel();
-		}
-		if (null == structModel) {
-			return null;
-		}
-		CMElementDeclaration cmde = null;
-		CMNamedNodeMap cmnnm = null;
-		if (fNode == null || fNode.getNodeType() != Node.ELEMENT_NODE) {
-			cmde = null;
-		}
-		ModelQuery modelQuery = ModelQueryUtil.getModelQuery(fNode
-				.getOwnerDocument());
-		if (modelQuery != null) {
-			cmde = modelQuery.getCMElementDeclaration((Element) fNode);
-		}
-		if (cmde != null) {
-			cmnnm = cmde.getAttributes();
-		}
-		return cmnnm;
-	}
-
-	/**
-	 * the selection could be different kinds of selection, including: 1.
-	 * ITextSelection 2. IStructuredSelection (Node) 3. IStructuredSelection
-	 * (EditPart) 4. DesignRange we want to normalize it to only #2. If the node
-	 * is ATTR or TEXT/CDATA_SECTION, will use it's parent node.
-	 * 
-	 * @param selectingPart
-	 * @param selection
-	 * @param htmlEditor
-	 * @return null if can't normalize.
-	 */
-	public static Node normalizeSelectionToElement(
-			IWorkbenchPart selectingPart, ISelection selection,
-			HTMLEditor htmlEditor) {
-		
-		Node node = null;
-		if (selectingPart instanceof HTMLEditor) {
-			IEditorPart part = ((HTMLEditor) selectingPart).getActiveEditor();
-			if (part instanceof TextEditor) {
-				if (selection instanceof ITextSelection) {
-					IStructuredModel model = ((HTMLEditor) selectingPart)
-							.getModel();
-					node = SelectionHelper.toNode(model,
-							(ITextSelection) selection);
-				}
-			} else if (part instanceof GraphicalEditor) {
-				if (selection instanceof IStructuredSelection) {
-					node = SelectionHelper
-							.toNode((IStructuredSelection) selection);
-				} else if (selection instanceof DesignRange) {
-					node = SelectionHelper.toNode((DesignRange) selection);
-				}
-			}
-			if (node instanceof Attr) {
-				node = ((Attr) node).getOwnerElement();
-			} else if (node instanceof Text || node instanceof CDATASection) {
-				node = node.getParentNode();
-			}
-		} else if (selectingPart instanceof ContentOutline) {
-			if (selection instanceof IStructuredSelection
-					&& ((ContentOutline) selectingPart).getCurrentPage() != null
-					&& ((ContentOutline) selectingPart).getCurrentPage()
-							.getControl().isFocusControl()) {
-				node = SelectionHelper.toNode((IStructuredSelection) selection);
-				if (node == null) {
-					node = htmlEditor.getDOMDocument();
-				}
-			}
-		}
-
-		return node;
-	}
-
-	/**
-	 * @param node as Object
-	 * @return element 
-	 */
-	public static Element getElementNode(Object node) {
-		Object model;
-		Element element = null;
-		if (node == null) {
-			return null;
-		}
-
-		if (node instanceof Element) {
-			element = (Element) node;
-		} else if (node instanceof AbstractEditPart) {
-			model = ((AbstractEditPart) node).getModel();
-			if (model instanceof Element) {
-				element = (Element) model;
-			}
-		} else if (node instanceof ISelection) {
-			element = getElement(null, (ISelection) node);
-		}
-		return element;
-	}
-
-	/**
-	 * @param element
-	 * @param filter
-	 * @return list of attribute names
-	 */
-	public static List getNameList(Element element, String[] filter) {
-		List result = new ArrayList();
-		CMNamedNodeMap attributes = getElementDeclaredAttributes(element);
-		if (attributes != null) {
-			for (int i = 0, n = attributes.getLength(); i < n; i++) {
-				String name = attributes.item(i).getNodeName();
-				if (Arrays.asList(filter).contains(name))
-					result.add(name);
-			}
-		}
-		return result;
-	}
-
-	/**
-	 * @param selection
-	 *            should be a normalized selection
-	 * @return node
-	 */
-	public static Node getCommonParent(ISelection selection) {
-		if (selection instanceof IStructuredSelection) {
-			Object obj = ((IStructuredSelection) selection).getFirstElement();
-			return (Node) obj;
-		} else if (selection instanceof DesignRange) {
-			DesignRange range = (DesignRange) selection;
-			Node node1 = range.getStartPosition().getContainerNode();
-			Node node2 = range.getEndPosition().getContainerNode();
-			return DOMUtil.findCommonAncester(node1, node2);
-		} else {
-			// should not happen
-			return null;
-		}
-	}
-
-	/**
-	 * The passed in selection should be normalized selection.
-	 * 
-	 * @param selectingPart
-	 * @param selection
-	 * @return element
-	 */
-	public static Element getElement(IWorkbenchPart selectingPart,
-			ISelection selection) {
-		Node node = getCommonParent(selection);
-		if (node instanceof Element) {
-			return (Element) node;
-		} else if (node != null) {
-			node = node.getParentNode();
-			if (node instanceof Element) {
-				return (Element) node;
-			}
-		}
-		return null;
-	}
-
-	// reserved for future native use.
-	// public static void dumpChildren(Element element)
-	// {
-	// // In this function we are using logger to dump message out.
-	// Logger logger = PDPlugin.getLogger(DesignerPropertyTool.class);
-	// if (element == null || !DEBUG)
-	// return;
-	// NodeList nl = element.getChildNodes();
-	// // It's our pattern for dumping message
-	// logger.debug("\n----------------------------"); //$NON-NLS-1$
-	// logger.debug("Element:" + element.getNodeName()); //$NON-NLS-1$
-	// for (int i = 0; i < nl.getLength(); i++)
-	// {
-	// Node node = nl.item(i);
-	// logger.debug("child[" + i + "]:" + node.getNodeName()); //$NON-NLS-1$
-	// //$NON-NLS-2$
-	// }
-	// logger.debug("----------------------------\n"); //$NON-NLS-1$
-	// }
-
-	/**
-	 * @param element
-	 * @return bool
-	 *  (unused)
-	 */
-	public static boolean isMultiSelection(Element element) {
-		if (element.getNodeName().equalsIgnoreCase(IHTMLConstants.TAG_OPTION)) {
-			return element.getAttribute(ICSSPropertyID.ATTR_MULTIPLE) != null;
-		}
-		return false;
-	}
-
-//	/**
-//	 * @param element
-//	 * @return if elementImpl, return source, else null
-//	 * (unused)
-//	 */
-//	public static String getElementTextSource(Element element) {
-//		if (element == null) {
-//			return null;
-//		}
-//		if (element instanceof ElementImpl) {
-//			return ((ElementImpl) element).getSource();
-//		}
-//		return null;
-//	}
-
-	/**
-	 * @param project
-	 * @return IJavaProject
-	 */
-	public static IJavaProject getJavaProject(Object project) {
-		if (project == null) {
-			return null;
-		}
-		if (project instanceof IJavaProject) {
-			return (IJavaProject) project;
-		} else if (project instanceof IProject) {
-			try {
-				IProjectNature nature = ((IProject) project)
-						.getNature(JavaCore.NATURE_ID);
-				if (nature == null) {
-					return null;
-				}
-                return (IJavaProject) nature;
-			} catch (Exception e) {
-				// Error.DesignerPropertyTool.NatureQuerying = Error in project
-				// java nature querying
-				PDPlugin.getLogger(DesignerPropertyTool.class).error(
-						"Error.DesignerPropertyTool.NatureQuerying", e); //$NON-NLS-1$
-				// Should be error tolerable?
-				return null;
-			}
-		}
-		return null;
-	}
-//
-//	/**
-//	 * @param project as Object
-//	 * @return IProject or null
-//	 */
-//	public static IProject getProject(Object project) {
-//		if (project instanceof IProject) {
-//			return (IProject) project;
-//		} else if (project instanceof IJavaProject) {
-//			return ((IJavaProject) project).getProject();
-//		}
-//		return null;
-//	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/ISectionFilter.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/ISectionFilter.java
deleted file mode 100644
index 95591e8..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/ISectionFilter.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties;
-
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- * @deprecated  unused
- */
-public interface ISectionFilter {
-
-	/**
-	 * @param node
-	 * @return true if node applies
-	 */
-	boolean appliesTo(Element node);
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/ITabbedPropertiesConstants.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/ITabbedPropertiesConstants.java
deleted file mode 100644
index 233923a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/ITabbedPropertiesConstants.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public interface ITabbedPropertiesConstants {
-
-	// FIXME: when return null, will in fact using "Misc". This may not guarantee
-	// it be the
-	// last category, since is sorted by string order.
-	/**
-	 * the other category
-	 */
-	static final String OTHER_CATEGORY = Messages.ITabbedPropertiesConstants_other_category;
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/Messages.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/Messages.java
deleted file mode 100644
index a99a43c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/Messages.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * Externalized Strings
- *
- */
-public class Messages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.jst.pagedesigner.properties.messages"; //$NON-NLS-1$
-	/**
-	 * 
-	 */
-	public static String ITabbedPropertiesConstants_other_category;
-	static {
-		// initialize resource bundle
-		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-	}
-
-	private Messages() {
-		//
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/NavigationHiearchyAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/NavigationHiearchyAction.java
deleted file mode 100644
index 262b43b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/NavigationHiearchyAction.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IMenuCreator;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.MenuItem;
-import org.w3c.dom.Document;
-import org.w3c.dom.DocumentFragment;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.Text;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class NavigationHiearchyAction extends Action {
-	private Menu _hiearchyMenu;
-
-	private Node _startNode;
-
-	private Node _currentNode;
-
-	private WPETabbedPropertySheetPage _propertyPage;
-
-	private class MenuCreator implements IMenuCreator {
-		public void dispose() {
-			if (_hiearchyMenu != null) {
-				for (int i = 0, n = _hiearchyMenu.getItemCount(); i < n; i++) {
-					MenuItem menuItem = _hiearchyMenu.getItem(i);
-					menuItem.setData(null);
-				}
-				_hiearchyMenu.dispose();
-				_hiearchyMenu = null;
-			}
-		}
-
-		public Menu getMenu(Menu parent) {
-			return null;
-		}
-
-		public Menu getMenu(Control parent) {
-			dispose();
-			_hiearchyMenu = new Menu(parent);
-
-			// next we need to add the list of parents node into the menu.
-			Node node = _startNode;
-			List list = new ArrayList();
-			while (node != null && !(node instanceof Document)
-					&& !(node instanceof DocumentFragment)) {
-				list.add(node);
-				node = node.getParentNode();
-			}
-
-			// adding ancesters reverse order.
-			for (int i = list.size() - 1; i >= 0; i--) {
-				Node thenode = (Node) list.get(i);
-				MenuItem item = new MenuItem(_hiearchyMenu, SWT.CHECK);
-				item.setSelection(thenode == _currentNode ? true : false);
-				String text = thenode.getNodeName();
-				item.setText(text);
-				item.setData(thenode);
-				item.addSelectionListener(new SelectionAdapter() {
-					public void widgetSelected(SelectionEvent e) {
-						Node selectedNode = (Node) e.widget.getData();
-						_propertyPage.internalChangeSelection(selectedNode,
-								_startNode);
-					}
-				});
-			}
-
-			return _hiearchyMenu;
-		}
-	}
-
-	/**
-	 * @param propertyPage
-	 */
-	public NavigationHiearchyAction(WPETabbedPropertySheetPage propertyPage) {
-		super(""); //$NON-NLS-1$
-		setEnabled(true);
-		setMenuCreator(new MenuCreator());
-		this._propertyPage = propertyPage;
-	}
-
-	/**
-	 * @param selectedNode
-	 * @param startNode
-	 */
-	protected void changeSelection(Node selectedNode, Node startNode) {
-		this._propertyPage.internalChangeSelection(selectedNode, startNode);
-		this._currentNode = selectedNode;
-		this._startNode = startNode;
-		this.setText(this._currentNode.getNodeName());
-	}
-
-	/**
-	 * @param currentNode
-	 * @param startNode
-	 */
-	protected void refresh(Node currentNode, Node startNode) {
-		this._currentNode = currentNode;
-		this._startNode = startNode;
-		if (!(_currentNode instanceof Text)
-				&& !(_currentNode instanceof Element)) {
-			this.setText("---"); //$NON-NLS-1$
-			this.setEnabled(false);
-		} else {
-			this.setText(_currentNode.getNodeName());
-			this.setEnabled(true);
-		}
-	}
-
-	@Override
-	public void run() {
-		this._propertyPage.internalChangeSelection(_currentNode, _startNode);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/PropertyDescriptorWrapper.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/PropertyDescriptorWrapper.java
deleted file mode 100644
index 6503bf1..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/PropertyDescriptorWrapper.java
+++ /dev/null
@@ -1,197 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties;
-
-import org.eclipse.jface.action.IStatusLineManager;
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jface.viewers.ICellEditorListener;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.TextCellEditor;
-import org.eclipse.jst.pagedesigner.meta.EditorCreator;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.views.properties.IPropertyDescriptor;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * This is a simple PropertyDescriptor wrapper. It simply changed the category
- * name. This is because the default category name is "Attributes", which will
- * make them appear before other things, and that is not what we want.
- * 
- * @author mengbo
- */
-public class PropertyDescriptorWrapper implements IPropertyDescriptor {
-
-	private IPropertyDescriptor _inner;
-
-	private IDOMElement _element;
-
-	private IStatusLineManager _statusLineManager;
-
-//	/**
-//	 * Constructor
-//	 * @param element 
-//	 * @param innerDescriptor 
-//	 * @param statusLineManager 
-//	 * 
-//	 */
-//	public PropertyDescriptorWrapper(IDOMElement element,
-//			IPropertyDescriptor innerDescriptor, IStatusLineManager statusLineManager) {
-//		this._element = element;
-//		this._inner = innerDescriptor;
-//		this._statusLineManager = statusLineManager;
-//	}
-
-	/**
-	 * Constructor
-	 * @param element
-	 * @param innerDescriptor
-	 */
-	public PropertyDescriptorWrapper(IDOMElement element,
-			IPropertyDescriptor innerDescriptor) {
-		this._element = element;
-		this._inner = innerDescriptor;
-	}
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.properties.IPropertyDescriptor#createPropertyEditor(org.eclipse.swt.widgets.Composite)
-	 */
-	public CellEditor createPropertyEditor(Composite parent) {
-		EditorCreator.CellEditorHolder holder = new EditorCreator.CellEditorHolder() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jst.pagedesigner.meta.EditorCreator.CellEditorHolder#createCellEditor(org.eclipse.swt.widgets.Composite)
-			 */
-			public CellEditor createCellEditor(Composite parent1) {
-				CellEditor ed = null;
-				if (_inner != null) 
-					ed = _inner.createPropertyEditor(parent1);
-				else
-					ed = new TextCellEditor(parent1);
-				
-				if (_statusLineManager != null)
-					ed.addListener(new StatusBarUpdater(ed));
-				return ed;
-			}
-		};
-		return EditorCreator.getInstance().createCellEditorWithWrapper(parent,
-				null, holder, _element, null);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.properties.IPropertyDescriptor#getCategory()
-	 */
-	public String getCategory() {
-		String cat = _inner.getCategory();
-		return cat != null ? cat : ITabbedPropertiesConstants.OTHER_CATEGORY;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.properties.IPropertyDescriptor#getDescription()
-	 */
-	public String getDescription() {
-		return _inner.getDescription();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.properties.IPropertyDescriptor#getDisplayName()
-	 */
-	public String getDisplayName() {
-		return _inner.getDisplayName();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.properties.IPropertyDescriptor#getFilterFlags()
-	 */
-	public String[] getFilterFlags() {
-		return _inner.getFilterFlags();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.properties.IPropertyDescriptor#getHelpContextIds()
-	 */
-	public Object getHelpContextIds() {
-		return _inner.getHelpContextIds();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.properties.IPropertyDescriptor#getId()
-	 */
-	public Object getId() {
-		return _inner.getId();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.properties.IPropertyDescriptor#getLabelProvider()
-	 */
-	public ILabelProvider getLabelProvider() {
-		return _inner.getLabelProvider();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.properties.IPropertyDescriptor#isCompatibleWith(org.eclipse.ui.views.properties.IPropertyDescriptor)
-	 */
-	public boolean isCompatibleWith(IPropertyDescriptor anotherProperty) {
-		if (anotherProperty instanceof PropertyDescriptorWrapper) {
-			return _inner
-					.isCompatibleWith(((PropertyDescriptorWrapper) anotherProperty)
-							.getInner());
-		}
-		return _inner.isCompatibleWith(anotherProperty);
-	}
-
-	/**
-	 * @return IPropertyDescriptor
-	 */
-	public IPropertyDescriptor getInner() {
-		return _inner;
-	}
-
-	private class StatusBarUpdater implements ICellEditorListener {
-		private CellEditor ed;
-	
-		StatusBarUpdater(CellEditor ed) {
-			this.ed = ed;
-		}
-		public void applyEditorValue() {//
-		}
-		public void cancelEditor() {//
-		}
-
-		public void editorValueChanged(boolean oldValidState,
-				boolean newValidState) {
-			if (!newValidState)
-				_statusLineManager.setErrorMessage(ed.getErrorMessage());				
-			else
-				_statusLineManager.setErrorMessage(null);
-				
-		}
-		
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/WPETabbedPropertySheetPage.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/WPETabbedPropertySheetPage.java
deleted file mode 100644
index 6883987..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/WPETabbedPropertySheetPage.java
+++ /dev/null
@@ -1,211 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties;
-
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.editors.HTMLEditor;
-import org.eclipse.jst.pagedesigner.properties.internal.QuickEditTabManager;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.ISelectionListener;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.part.EditorPart;
-import org.eclipse.ui.part.IPageSite;
-import org.eclipse.ui.views.contentoutline.ContentOutline;
-import org.eclipse.ui.views.properties.tabbed.ITabbedPropertySheetPageContributor;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public class WPETabbedPropertySheetPage extends TabbedPropertySheetPage {
-
-	// TODO: when we want to extend this page, HTMLEditor would not be the sole
-	// type of editor part.
-	private HTMLEditor _htmlEditor;
-
-	private NavigationHiearchyAction _hiearchAction = new NavigationHiearchyAction(
-			this);
-	
-	private QuickEditTabManager manager;
-
-	private ISelectionListener _selListener;
-
-	/**
-	 * Constructor
-	 * @param tabbedPropertySheetPageContributor
-	 * @param editor 
-	 */
-	public WPETabbedPropertySheetPage(
-			ITabbedPropertySheetPageContributor tabbedPropertySheetPageContributor,
-			HTMLEditor editor) {
-		super(tabbedPropertySheetPageContributor);
-		_htmlEditor = editor;
-	}
-
-	public void selectionChanged(IWorkbenchPart part, ISelection selection) {
-		if (part == null) {
-			part = _htmlEditor;
-		}
-		if (part instanceof HTMLEditor || part instanceof ContentOutline) {
-			Node node = DesignerPropertyTool.normalizeSelectionToElement(part,
-					selection, _htmlEditor);
-			if (node != null) {
-				try {
-					_hiearchAction.refresh(node, node);
-					this.getSite().getActionBars().getToolBarManager().update(
-							true);
-					//setInput(part, node);
-					super.selectionChanged(part, new StructuredSelection(node));
-				} catch (Exception e) {
-					// Some synchronization would cause this, it does not damage
-					// the data.
-				}
-			}
-		}
-	}
-	
-	/**
-	 * This method should be called from internal of the property page. Normally
-	 * means user did some action inside the property sheet to change current
-	 * selection.
-	 * 
-	 * @param selectedNode
-	 * @param innerNode
-	 */
-	public void internalChangeSelection(Node selectedNode, Node innerNode) {
-		getEditor().setFocus();
-		_hiearchAction.refresh(selectedNode, innerNode);
-		this.getSite().getActionBars().getToolBarManager().update(true);
-		super.selectionChanged(null, new StructuredSelection(selectedNode));
-	}
-
-	/**
-	 * @return EditorPart instance that this property sheet is for.   Will return instance of WPE (htmlEditor)
-	 */
-	public EditorPart getEditor() {
-		return this._htmlEditor;
-	}
-
-	public void init(IPageSite pageSite) {
-		super.init(pageSite);
-		setSelectionProvider();
-		setSelectionListener();
-		IToolBarManager toolbar = pageSite.getActionBars().getToolBarManager();
-		toolbar.add(_hiearchAction);		
-		_hiearchAction.refresh(null, null);
-	}
-
-	private void setSelectionListener() {
-		this.getSite().getWorkbenchWindow().getSelectionService()
-				.addPostSelectionListener(getSelectionListener());
-	}
-
-	private ISelectionListener getSelectionListener() {
-		if (_selListener == null){
-			_selListener = new ISelectionListener() {
-				public void selectionChanged(IWorkbenchPart part,
-						ISelection selection) {
-					if (getEditor() == part)//only fire if the selection applies to this tabbed prop sheet instance
-						WPETabbedPropertySheetPage.this.selectionChanged(
-							part, selection);
-				}
-			};
-		}
-		return _selListener;
-	}
-
-	private void setSelectionProvider() {
-		this.getSite().setSelectionProvider(new ISelectionProvider() {
-			private ISelection _selection;
-
-			public void addSelectionChangedListener(
-					ISelectionChangedListener listener) {
-			    // do nothing
-			}
-
-			/**
-			 * Returns the current selection for this provider.
-			 * 
-			 * @return the current selection
-			 */
-			public ISelection getSelection() {
-				return _selection;
-			}
-
-			/**
-			 * Removes the given selection change listener from this selection
-			 * provider. Has no affect if an identical listener is not
-			 * registered.
-			 * 
-			 * @param listener
-			 *            a selection changed listener
-			 */
-			public void removeSelectionChangedListener(
-					ISelectionChangedListener listener) {
-				// do nothing
-			}
-
-			/**
-			 * Sets the current selection for this selection provider.
-			 * 
-			 * @param selection
-			 *            the new selection
-			 */
-			public void setSelection(ISelection selection) {
-				_selection = selection;
-			}
-		});
-
-	}
-
-	public void createControl(Composite parent) {
-		super.createControl(parent);
-		PlatformUI
-				.getWorkbench()
-				.getHelpSystem()
-				.setHelp(
-						getControl(),
-						PDPlugin
-								.getResourceString("WPETabbedPropertySheetPage.help.id")); //$NON-NLS-1$
-	}
-
-	/**
-	 * @return acquires an instance of QuickEditTabManager
-	 */
-	public QuickEditTabManager getTabManager() {
-		if (manager == null) {
-			manager = QuickEditTabManager.acquireInstance(this);
-		}
-		return manager;
-	}
-
-	@Override
-	public void dispose() {
-		this.getSite().getWorkbenchWindow().getSelectionService().removePostSelectionListener(getSelectionListener());
-		this.getSite().setSelectionProvider(null);
-		manager.releaseInstance();
-		manager.dispose();
-		manager = null;
-		_selListener = null;
-		_htmlEditor = null;
-		super.dispose();
-	}
-	
-	
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/attrgroup/AttributeGroupMessages.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/attrgroup/AttributeGroupMessages.java
deleted file mode 100644
index 2daa303..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/attrgroup/AttributeGroupMessages.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties.attrgroup;
-
-import java.text.MessageFormat;
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class AttributeGroupMessages {
-	private static final String BUNDLE_NAME = "org.eclipse.jst.pagedesigner.properties.attrgroup.messages"; //$NON-NLS-1$
-
-	private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle
-			.getBundle(BUNDLE_NAME);
-
-	private AttributeGroupMessages() {
-        // no external instantiation
-	}
-
-	/**
-	 * @param key
-	 * @return the value for key or !!key!! if not found
-	 */
-	public static String getString(String key) {
-		try {
-			return RESOURCE_BUNDLE.getString(key);
-		} catch (MissingResourceException e) {
-			return '!' + key + '!';
-		}
-	}
-
-	/**
-	 * Build a formated string from the resource bundle.
-	 * 
-	 * @param key
-	 *            the key into the resource bundle that has the formated string.
-	 * @param arg0
-	 *            the first argument.
-	 * @return the formated string with the argument inline.
-	 */
-	public static String getString(String key, Object arg0) {
-		Object[] args = new Object[1];
-		args[0] = arg0;
-
-		MessageFormat formatter = new MessageFormat(getString(key));
-		return formatter.format(args);
-	}
-
-	/**
-	 * Build a formated string from the resource bundle.
-	 * 
-	 * @param key
-	 *            the key into the resource bundle that has the formated string.
-	 * @param arg0
-	 *            the first argument.
-	 * @param arg1
-	 *            the second argument.
-	 * @return the formated string with the argument inline.
-	 */
-	public static String getString(String key, Object arg0, Object arg1) {
-		Object[] args = new Object[2];
-		args[0] = arg0;
-		args[1] = arg1;
-
-		MessageFormat formatter = new MessageFormat(getString(key));
-		return formatter.format(args);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/attrgroup/DialogUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/attrgroup/DialogUtil.java
deleted file mode 100644
index 8288c89..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/attrgroup/DialogUtil.java
+++ /dev/null
@@ -1,137 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties.attrgroup;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.jface.window.Window;
-import org.eclipse.jface.wizard.Wizard;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogFieldGroupPage;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.ISupportTextValue;
-import org.eclipse.jst.jsf.common.ui.internal.dialogs.CommonWizardDialog;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.commands.single.AddSubNodeCommand;
-import org.eclipse.jst.pagedesigner.editors.properties.IPropertyPageDescriptor;
-import org.eclipse.jst.pagedesigner.properties.internal.AttributeGroup;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class DialogUtil {
-	/**
-	 * Utility method, this method will popup a dialog for user to input
-	 * attributes for initialize a sub element. In this method will create a
-	 * command and execute it.
-	 * 
-	 * @param shell
-	 *            parent shell for dialog
-	 * @param parent
-	 *            the parent element
-	 * @param group
-	 *            the AttributeGroup
-	 * @return true if success, false if user canceled.
-	 */
-	public static boolean createSubElement(Shell shell,
-			final IDOMElement parent, final AttributeGroup group) {
-		group.setElementContext(parent, parent);//2ndParam seems to need to be parent most of the time... don't know why it WAS null... changed 12/19/07
-		
-		if (group.getDialogFields().length == 0){
-			//don't show dialog
-			createSubNode(group, parent, Collections.EMPTY_MAP);
-			return true;
-		}
-		
-		final DialogFieldGroupPage page = new DialogFieldGroupPage("", group); //$NON-NLS-1$
-		page.setTitle(AttributeGroupMessages.getString(
-				"DialogUtil.createTitle", group.getTagName())); //$NON-NLS-1$
-		page
-				.setDescription(AttributeGroupMessages
-						.getString(
-								"DialogUtil.createDescription", group.getTagName(), parent.getTagName())); //$NON-NLS-1$
-
-		Wizard wizard = new Wizard() {
-			public void addPages() {
-				super.addPage(page);
-			}
-
-			public boolean performFinish() {
-				DialogField[] fields = group.getDialogFields();
-				Map map = new HashMap();
-				for (int i = 0; i < fields.length; i++) {
-					IPropertyPageDescriptor desc = group
-							.getPropertyDescriptor(fields[i]);
-					if (desc != null && fields[i] instanceof ISupportTextValue) {
-						String value = ((ISupportTextValue) fields[i])
-								.getText();
-						if (value != null && value.length() > 0) {
-							map.put(desc.getAttributeName(), value);
-						}
-					}
-				}
-				createSubNode(group, parent, map);
-				return true;
-			}
-		};
-		wizard.setWindowTitle(AttributeGroupMessages.getString(
-				"DialogUtil.createTitle", group.getTagName())); //$NON-NLS-1$
-		wizard.setDefaultPageImageDescriptor(PDPlugin.getDefault()
-				.getImageDescriptor("newsuade_wiz.gif")); //$NON-NLS-1$
-		CommonWizardDialog dialog = new CommonWizardDialog(shell, wizard);
-
-		return dialog.open() == Window.OK;
-	}
-
-	private static void createSubNode(final AttributeGroup group, final IDOMElement parent, final Map mapOfAttributeValues) {
-		AddSubNodeCommand addSubCommand = new AddSubNodeCommand(
-				AttributeGroupMessages
-						.getString(
-								"DialogUtil.createCommandLabel", group.getTagName()), parent, group.getTagName(), group.getURI(), mapOfAttributeValues); //$NON-NLS-1$
-		addSubCommand.execute();
-		
-	}
-
-	/**
-	 * Utility method, this method will popup a dialog for user to input
-	 * attributes for initialize a sub element. In this method will create a
-	 * command and execute it.
-	 * 
-	 * @param shell
-	 *            parent shell for dialog
-	 * @param parent
-	 *            parent element
-	 * @param uri
-	 *            new ele's uri
-	 * @param tagName
-	 *            new ele's tag name
-	 * @param attributes
-	 *            an array of attribute names. The dialog will create a
-	 *            dialogfield for each of them to allow user to input initial
-	 *            value. If null, the system will try to use all attribute of
-	 *            the element.
-	 * @return true if success, false if user canceled.
-	 */
-	public static boolean createSubElement(Shell shell,
-			final IDOMElement parent, final String uri, final String tagName,
-			final String[] attributes) {
-		
-		final 	AttributeGroup group = new AttributeGroup(uri, tagName,
-				attributes);
-
-		return createSubElement(shell, parent, group);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/attrgroup/IElementContextable.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/attrgroup/IElementContextable.java
deleted file mode 100644
index bb90d80..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/attrgroup/IElementContextable.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties.attrgroup;
-
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-
-/**
- * This is a special interface for those special dialog field that need context
- * information.
- * 
- * @author mengbo
- * @version 1.5
- */
-public interface IElementContextable {
-	/**
-	 * 
-	 * @param ancester
-	 *            an non null element, could be the element being edited, or an
-	 *            ancester element when we are creating new element.
-	 * @param element
-	 *            if not null, then is the element being edited, could be used
-	 *            to retrive initial data.
-	 * 
-	 */
-	public void setElementContext(IDOMNode ancester, IDOMElement element);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/attrgroup/messages.properties b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/attrgroup/messages.properties
deleted file mode 100644
index dd21120..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/attrgroup/messages.properties
+++ /dev/null
@@ -1,14 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-DialogUtil.createTitle=Create {0}
-DialogUtil.createDescription=Create subelement "{0}" under "{1}"
-DialogUtil.createCommandLabel=Create {0}
-AttributeGroupSection.changeAttribute=Change Attribute
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/CSSDialogCellEditor.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/CSSDialogCellEditor.java
deleted file mode 100644
index b43bcc3..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/CSSDialogCellEditor.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties.celleditors;
-
-import org.eclipse.jface.preference.PreferenceManager;
-import org.eclipse.jface.window.Window;
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.commands.single.ChangeStyleCommand;
-import org.eclipse.jst.pagedesigner.ui.dialogs.StyleDialog;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.wst.css.core.internal.provisional.document.ICSSStyleDeclaration;
-import org.eclipse.wst.css.core.internal.util.declaration.CSSPropertyContext;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.w3c.dom.css.ElementCSSInlineStyle;
-
-/**
- * A css dialog cell editor
- *
- */
-public class CSSDialogCellEditor extends EditableDialogCellEditor {
-	private IDOMElement _element;
-
-	/**
-	 * @param parent
-	 * @param element 
-	 */
-	public CSSDialogCellEditor(Composite parent, IDOMElement element) {
-		super(parent);
-		_element = element;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.DialogCellEditor#openDialogBox(org.eclipse.swt.widgets.Control)
-	 */
-	protected Object openDialogBox(Control cellEditorWindow) {
-		ICSSStyleDeclaration styleDeclaration = (ICSSStyleDeclaration) ((ElementCSSInlineStyle) _element)
-				.getStyle();
-
-		PreferenceManager manager = new PreferenceManager();
-		Shell shell = cellEditorWindow.getShell();
-
-		final CSSPropertyContext context = new CSSPropertyContext(styleDeclaration);
-		StyleDialog dialog = new StyleDialog(shell, manager, _element, context);
-		if (dialog.open() == Window.OK) {
-			if (context.isModified()) {			
-				PlatformUI.getWorkbench().getDisplay().asyncExec(
-	                    new Runnable()
-	                    {
-	                        public void run()
-	                        {
-	            				ChangeStyleCommand c = new ChangeStyleCommand(_element, context);
-	                        	c.execute();
-	                        }
-	            });
-			}
-		}
-
-		String style = (_element == null ? null : _element
-				.getAttribute(IJSFConstants.ATTR_STYLE));
-		return style == null ? "" : style; //$NON-NLS-1$
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/CellEditorFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/CellEditorFactory.java
deleted file mode 100644
index de79670..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/CellEditorFactory.java
+++ /dev/null
@@ -1,248 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.pagedesigner.properties.celleditors;
-
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jface.viewers.TextCellEditor;
-import org.eclipse.jst.jsf.common.metadata.Trait;
-import org.eclipse.jst.jsf.common.metadata.internal.TraitValueHelper;
-import org.eclipse.jst.jsf.common.metadata.query.TaglibDomainMetaDataQueryHelper;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.metadataprocessors.features.IDefaultValue;
-import org.eclipse.jst.jsf.metadataprocessors.features.IPossibleValues;
-import org.eclipse.jst.pagedesigner.editors.properties.IPropertyPageDescriptor;
-import org.eclipse.jst.pagedesigner.jsp.core.IJSPCoreConstants;
-import org.eclipse.jst.pagedesigner.meta.ITagAttributeCellEditorFactory;
-import org.eclipse.jst.pagedesigner.meta.IAttributeRuntimeValueType;
-import org.eclipse.jst.pagedesigner.properties.dialogfields.MDEnabledComboDialogField;
-import org.eclipse.jst.pagedesigner.ui.dialogfields.ClasspathResourceButtonDialogField;
-import org.eclipse.jst.pagedesigner.ui.dialogfields.ContextableResourceButtonDialogField;
-import org.eclipse.jst.pagedesigner.ui.dialogfields.StyleButtonDialogField;
-import org.eclipse.jst.pagedesigner.utils.StructuredModelUtil;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.w3c.dom.Element;
-
-/**
- * 
- * @author mengbo
- */
-public class CellEditorFactory implements ITagAttributeCellEditorFactory {
-	public CellEditor createCellEditor(Composite parent,
-			IPropertyPageDescriptor attr, Element element) {
-		
-		String type = attr.getValueType();
-		
-		IPossibleValues pvs = (IPossibleValues)attr.getAdapter(IPossibleValues.class);
-		IDefaultValue defaultValue = (IDefaultValue)attr.getAdapter(IDefaultValue.class);
-//		ICellEditorValidator validator = (ICellEditorValidator)attr.getAdapter(ICellEditorValidator.class);
-		CellEditor ed = null;
-		if (IAttributeRuntimeValueType.RELATIVEPATH.equalsIgnoreCase(type)|| IAttributeRuntimeValueType.WEBPATH.equalsIgnoreCase(type)) {
-			IProject project = getProject(element);
-			if (project != null) {
-//				String typeParam = TraitValueHelper.getValueAsString(TaglibDomainMetaDataQueryHelper.getTrait(attr.getMetaDataContext().getEntity(),"type-param"));
-				ResourceDialogCellEditor cellEditor = new ResourceDialogCellEditor(
-						parent);
-				Trait fileExt = TaglibDomainMetaDataQueryHelper.getTrait(attr.getMetaDataContext().getEntity(), "file-extensions"); //$NON-NLS-1$
-				Trait separator = TaglibDomainMetaDataQueryHelper.getTrait(attr.getMetaDataContext().getEntity(), "separator"); //$NON-NLS-1$
-				String[] fileExts = null;
-				if (fileExt != null){
-					List exts = TraitValueHelper.getValueAsListOfStrings(fileExt);
-					fileExts = (String[])exts.toArray(new String[exts.size()]);
-				} 
-				
-				String sep = null;
-				if (separator != null)
-					sep = TraitValueHelper.getValueAsString(separator);
-				
-				if (fileExts != null)
-					cellEditor.setSuffixs(fileExts);
-				if (sep != null)
-					cellEditor.setSeparator(sep);
-
-				cellEditor.setProject(project);
-				cellEditor.setReferredFile(getFile(element));
-
-				if (IAttributeRuntimeValueType.WEBPATH.equalsIgnoreCase(type)) {
-					cellEditor.setWebPath(true);
-				}
-
-				if (IJSPCoreConstants.TAG_DIRECTIVE_INCLUDE.equals(element
-						.getLocalName())
-						|| IJSPCoreConstants.TAG_INCLUDE.equals(element
-								.getLocalName())) {
-					cellEditor.setTransformJSPURL(false);
-				}
-				ed = cellEditor;
-			}
-		} 
-		else if (IAttributeRuntimeValueType.RESOURCEBUNDLE.equals(type)) {
-			ed = new LoadbundleSelectionCellEditor(parent,
-					getProject(element));
-		}
-		else if (IAttributeRuntimeValueType.CSSSTYLE.equalsIgnoreCase(type)) {
-//				String param = getParamterValue(attr, "style");
-////							.getParameterByName(IAttributeDescriptor.PARAMETER_STYLE);
-//				if (!param.equalsIgnoreCase("STYLE")) {
-//					return null;
-//				}
-				CSSDialogCellEditor cellEditor = new CSSDialogCellEditor(parent,
-						(IDOMElement) element);
-				ed = cellEditor;
-		}
-		else if (pvs != null && pvs.getPossibleValues().size() > 0) {
-//			if (validator != null) 
-//				ed = LabeledStyleComboCellEditor.newInstance(parent, pvs,
-//	            		defaultValue, SWT.DROP_DOWN | SWT.READ_ONLY);
-//			else 
-				ed = LabeledStyleComboCellEditor.newInstance(parent, pvs,
-            		defaultValue, SWT.NONE);
-	
-		}
-		
-//		} else if (IAttributeRuntimeValueType.CSSID.equalsIgnoreCase(type)) {
-//		    // TODO: missing case?
-
-		else {
-			ed = new TextCellEditor(parent);
-		}
-//		if (validator != null){
-//			ed.setValidator(validator);
-//		}
-		
-		return ed;
-	}
-
-
-//	private String getParamterValue(IPropertyPageDescriptor attr, String traitKey) {
-//		Trait trait = TaglibDomainMetaDataQueryHelper.getTrait(attr.getMetaDataContext().getEntity(), traitKey);
-//		if (trait != null){
-//			return TraitValueHelper.getValueAsString(trait);
-//		}
-//		return null;
-//	}
-
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.meta.NEWMDIAttributeCellEditorFactory#createDialogField(org.eclipse.jst.pagedesigner.meta.IAttributeDescriptor,
-	 *      org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	public DialogField createDialogField(IPropertyPageDescriptor attr) {
-
-		String type = attr.getValueType();
-		
-		IPossibleValues pvs = (IPossibleValues)attr.getAdapter(IPossibleValues.class);
-//		IDefaultValue defaultValue = (IDefaultValue)attr.getAdapter(IDefaultValue.class);
-//		ICellEditorValidator validator = (ICellEditorValidator)attr.getAdapter(ICellEditorValidator.class);
-		
-		
-
-		if (IAttributeRuntimeValueType.RELATIVEPATH.equals(type) ||
-				IAttributeRuntimeValueType.WEBPATH.equals(type)) {
-			Trait fileExt = TaglibDomainMetaDataQueryHelper.getTrait(attr.getMetaDataContext().getEntity(), "file-extensions"); //$NON-NLS-1$
-			Trait seperator = TaglibDomainMetaDataQueryHelper.getTrait(attr.getMetaDataContext().getEntity(), "separator"); //$NON-NLS-1$
-			
-			String[] fileExts = null;
-			if (fileExt != null){
-				List exts = TraitValueHelper.getValueAsListOfStrings(fileExt);
-				fileExts = (String[])exts.toArray(new String[exts.size()]);
-			} 
-			
-			String sep = null;
-			if (seperator != null)
-				sep = TraitValueHelper.getValueAsString(seperator);
-		
-			ContextableResourceButtonDialogField field = new ContextableResourceButtonDialogField();
-			field.setLabelText(attr.getLabel());
-			if (fileExts != null) {
-				field.setSuffixs(fileExts);
-			}
-			
-			if (sep != null) {
-				field.setSeparator(sep);
-			}
-			
-			if ("".equalsIgnoreCase(field.getSeparator())) { //$NON-NLS-1$
-				field.setResourceDescription(ResourceBoundle
-						.getString("FileCellEditor.Msg")); //$NON-NLS-1$
-			} else {
-				field.setResourceDescription(ResourceBoundle
-						.getString("FileCellEditor.Msg1")); //$NON-NLS-1$
-			}
-			field.setWebPath(IAttributeRuntimeValueType.WEBPATH.equals(type));
-			field.setRequired(attr.isRequired());
-			field.setToolTip(attr.getDescription());
-			return field;
-
-		} else if (IAttributeRuntimeValueType.CLASSPATH_RESOURCE.equals(type) ||
-				IAttributeRuntimeValueType.RESOURCEBUNDLE.equals(type)) {
-			ClasspathResourceButtonDialogField field = new ClasspathResourceButtonDialogField();
-			field.setRequired(attr.isRequired());
-			field.setToolTip(attr.getDescription());
-			field.setLabelText(attr.getLabel());
-			return field;
-		} else if (IAttributeRuntimeValueType.CSSSTYLE.equalsIgnoreCase(type)) {
-//			String param = getParamterValue(attr, "style");
-//			if (!"STYLE".equalsIgnoreCase(param)) {
-//				return null;
-//			}
-			StyleButtonDialogField field = new StyleButtonDialogField();
-			field.setRequired(attr.isRequired());
-			field.setToolTip(attr.getDescription());
-			field.setLabelText(attr.getLabel());
-			return field;
-		
-//		// if there is no type or type unknown, then we just return null. and
-//		// system will
-//		// create default (text cell editor).
-		} else if (pvs != null && pvs.getPossibleValues().size() > 0) {
-			MDEnabledComboDialogField field = new MDEnabledComboDialogField(SWT.None);
-			field.setLabelText(attr.getLabel());
-			field.setToolTip(attr.getDescription());
-			field.setRequired(attr.isRequired());
-			return field;
-		}
-		return null;
-	}
-
-	private IProject getProject(Element element) {
-		if (element instanceof IDOMElement) {
-			IDOMModel model = ((IDOMElement) element).getModel();
-			IFile file = StructuredModelUtil.getFileFor(model);
-			if (file != null) {
-				return file.getProject();
-			}
-		}
-		return null;
-	}
-
-	public String[] getSupportedValueTypes() {
-		return null;//default - all!
-	}
-
-	private IFile getFile(Element element) {
-		if (element instanceof IDOMElement) {
-			IDOMModel model = ((IDOMElement) element).getModel();
-			IFile file = StructuredModelUtil.getFileFor(model);
-			return file;
-		}
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/CellEditorWrapper.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/CellEditorWrapper.java
deleted file mode 100644
index 011ff99..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/CellEditorWrapper.java
+++ /dev/null
@@ -1,359 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties.celleditors;
-
-import java.text.MessageFormat;
-
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jface.viewers.ICellEditorListener;
-import org.eclipse.jface.viewers.TextCellEditor;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.KeyAdapter;
-import org.eclipse.swt.events.KeyEvent;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Layout;
-import org.eclipse.swt.widgets.Listener;
-
-/**
- * CellEditorWrapper is a special cell editor, that wraps an existing cell
- * editor by adding a small clickable button to end of it.
- * 
- * Due to limitation of the CellEditor framework, this wrapping technology may
- * resulting in some small inconvenience when change focus from the "wrapped"
- * cell editor to the "added" button.
- * 
- * This is an abstract class. Child class need override some methods.
- * 
- * @author mengbo
- */
-public abstract class CellEditorWrapper extends CellEditor {
-	/**
-	 * The editor control.
-	 */
-	private Composite _editor;
-
-	/**
-	 * the wrapped cell editor
-	 */
-	private CellEditor _wrapped;
-
-	/**
-	 * The button.
-	 */
-	private Button _button;
-
-	/**
-	 * Internal class for laying out the dialog.
-	 */
-	private class DialogCellLayout extends Layout {
-		public void layout(Composite editor, boolean force) {
-			Rectangle bounds = editor.getClientArea();
-			Point size = _button.computeSize(SWT.DEFAULT, SWT.DEFAULT, force);
-			// if (_wrapped != null)
-			_wrapped.getControl().setBounds(0, 0, bounds.width - size.x,
-					bounds.height);
-			_button.setBounds(bounds.width - size.x, 0, size.x, bounds.height);
-		}
-
-		public Point computeSize(Composite editor, int wHint, int hHint,
-				boolean force) {
-			if (wHint != SWT.DEFAULT && hHint != SWT.DEFAULT)
-				return new Point(wHint, hHint);
-			Point contentsSize = _wrapped.getControl().computeSize(SWT.DEFAULT,
-					SWT.DEFAULT, force);
-			Point buttonSize = _button.computeSize(SWT.DEFAULT, SWT.DEFAULT,
-					force);
-			// Just return the button width to ensure the button is not clipped
-			// if the label is long.
-			// The label will just use whatever extra width there is
-			Point result = new Point(buttonSize.x, Math.max(contentsSize.y,
-					buttonSize.y));
-			return result;
-		}
-	}
-
-	/**
-	 * Default DialogCellEditor style
-	 */
-	private static final int defaultStyle = SWT.NONE;
-
-	/**
-	 * Creates a new dialog cell editor with no control
-	 * 
-	 * @since 2.1
-	 */
-	public CellEditorWrapper() {
-		setStyle(defaultStyle);
-	}
-
-	/**
-	 * Creates a new dialog cell editor parented under the given control. The
-	 * cell editor value is <code>null</code> initially, and has no validator.
-	 * 
-	 * @param parent
-	 *            the parent control
-	 */
-	protected CellEditorWrapper(Composite parent) {
-		this(parent, defaultStyle);
-	}
-
-	/**
-	 * Creates a new dialog cell editor parented under the given control. The
-	 * cell editor value is <code>null</code> initially, and has no validator.
-	 * 
-	 * @param parent
-	 *            the parent control
-	 * @param style
-	 *            the style bits
-	 * @since 2.1
-	 */
-	protected CellEditorWrapper(Composite parent, int style) {
-		super(parent, style);
-	}
-
-	/**
-	 * Creates the button for this cell editor under the given parent control.
-	 * <p>
-	 * The default implementation of this framework method creates the button
-	 * display on the right hand side of the dialog cell editor. Subclasses may
-	 * extend or reimplement.
-	 * </p>
-	 * 
-	 * @param parent
-	 *            the parent control
-	 * @return the new button control
-	 */
-	protected Button createButton(Composite parent) {
-		Button result = new Button(parent, SWT.DOWN);
-		result.setImage(getBindingImage());
-		// result.setText("..."); //$NON-NLS-1$
-		return result;
-	}
-
-	/**
-	 * Since createButton is called from constructor, so we could only let child
-	 * class override this method to provide image. Rather than setting as
-	 * property.
-	 * 
-	 * @return image
-	 */
-	protected abstract Image getBindingImage();
-
-	/**
-	 * Creates the controls used to show the value of this cell editor.
-	 * <p>
-	 * The default implementation of this framework method creates a label
-	 * widget, using the same font and background color as the parent control.
-	 * </p>
-	 * <p>
-	 * Subclasses may re-implement. If you re-implement this method, you should
-	 * also re-implement <code>updateContents</code>.
-	 * </p>
-	 * 
-	 * @param cell
-	 *            the control for this cell editor
-	 * @return control
-	 */
-	protected Control createContents(Composite cell) {
-		_wrapped = createWrappedCellEditor(cell);
-		if (_wrapped == null) {
-			_wrapped = new TextCellEditor(cell);
-		}
-		_wrapped.addListener(new ICellEditorListener() {
-			public void applyEditorValue() {
-				fireApplyEditorValue();
-			}
-
-			public void cancelEditor() {
-				fireCancelEditor();
-			}
-
-			public void editorValueChanged(boolean oldValidState,
-					boolean newValidState) {
-				fireEditorValueChanged(oldValidState, newValidState);
-			}
-		});
-		_wrapped.addPropertyChangeListener(new IPropertyChangeListener() {
-			public void propertyChange(PropertyChangeEvent event) {
-				// FIXME:
-			}
-		});
-
-		_wrapped.getControl().setVisible(true);
-		_wrapped.getControl().addListener(SWT.Hide, new Listener() {
-			public void handleEvent(Event event) {
-				Display.getCurrent().asyncExec(new Runnable() {
-					public void run() {
-						if (_wrapped != null && _wrapped.getControl() != null
-								&& !_wrapped.getControl().isDisposed()) {
-							_wrapped.getControl().setVisible(true);
-						} else {
-							deactivate();
-						}
-					}
-				});
-
-			}
-		});
-		return _wrapped.getControl();
-	}
-
-	/**
-	 * @param cell
-	 * @return CellEditor
-	 */
-	protected abstract CellEditor createWrappedCellEditor(Composite cell);
-
-	/*
-	 * (non-Javadoc) Method declared on CellEditor.
-	 */
-	protected Control createControl(Composite parent) {
-		Font font = parent.getFont();
-		Color bg = parent.getBackground();
-
-		_editor = new Composite(parent, getStyle());
-		_editor.setFont(font);
-		_editor.setBackground(bg);
-		_editor.setLayout(new DialogCellLayout());
-
-		createContents(_editor);
-		// updateContents(value);
-
-		_button = createButton(_editor);
-		_button.setFont(font);
-
-		_button.addKeyListener(new KeyAdapter() {
-			public void keyReleased(KeyEvent e) {
-				if (e.character == '\u001b') { // Escape
-					fireCancelEditor();
-				}
-			}
-		});
-
-		_button.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent event) {
-				Object newValue = openDialogBox(_editor);
-				if (newValue != null) {
-					boolean newValidState = isCorrect(newValue);
-					if (newValidState) {
-						markDirty();
-						doSetValue(newValue);
-					} else {
-						// try to insert the current value into the error
-						// message.
-						setErrorMessage(MessageFormat.format(getErrorMessage(),
-								new Object[] { newValue.toString() }));
-					}
-					fireApplyEditorValue();
-				}
-			}
-		});
-
-		setValueValid(true);
-
-		return _editor;
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on CellEditor. The focus is set to the cell
-	 * editor's button.
-	 */
-	protected void doSetFocus() {
-		if (_wrapped != null && _wrapped.getControl() != null
-				&& !_wrapped.getControl().isDisposed()) {
-			_wrapped.setFocus();
-		} else {
-			_button.setFocus();
-		}
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on CellEditor.
-	 */
-	protected Object doGetValue() {
-		return _wrapped.getValue();
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on CellEditor.
-	 */
-	protected void doSetValue(Object value) {
-		if (_wrapped != null) {
-			_wrapped.setValue(value);
-		}
-	}
-
-	/**
-	 * Opens a dialog box under the given parent control and returns the
-	 * dialog's value when it closes, or <code>null</code> if the dialog was
-	 * cancelled or no selection was made in the dialog.
-	 * <p>
-	 * This framework method must be implemented by concrete subclasses. It is
-	 * called when the user has pressed the button and the dialog box must pop
-	 * up.
-	 * </p>
-	 * 
-	 * @param cellEditorWindow
-	 *            the parent control cell editor's window so that a subclass can
-	 *            adjust the dialog box accordingly
-	 * @return the selected value, or <code>null</code> if the dialog was
-	 *         cancelled or no selection was made in the dialog
-	 */
-	protected abstract Object openDialogBox(Control cellEditorWindow);
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.CellEditor#activate()
-	 */
-	public void activate() {
-		super.activate();
-		_wrapped.activate();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.CellEditor#deactivate()
-	 */
-	public void deactivate() {
-		super.deactivate();
-		// if (_wrapped != null)
-		// {
-		// _wrapped.deactivate();
-		// }
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.CellEditor#dispose()
-	 */
-	public void dispose() {
-		_wrapped.dispose();
-		super.dispose();
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/EditableDialogCellEditor.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/EditableDialogCellEditor.java
deleted file mode 100644
index 9a9c385..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/EditableDialogCellEditor.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties.celleditors;
-
-import java.text.MessageFormat;
-
-import org.eclipse.jface.viewers.DialogCellEditor;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.FocusAdapter;
-import org.eclipse.swt.events.FocusEvent;
-import org.eclipse.swt.events.KeyAdapter;
-import org.eclipse.swt.events.KeyEvent;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * @author mengbo
- */
-public abstract class EditableDialogCellEditor extends DialogCellEditor {
-	private Text _text;
-
-	/**
-	 * 
-	 */
-	public EditableDialogCellEditor() {
-		super();
-	}
-
-	/**
-	 * @param parent
-	 */
-	public EditableDialogCellEditor(Composite parent) {
-		super(parent);
-	}
-
-	/**
-	 * @param parent
-	 * @param style
-	 */
-	public EditableDialogCellEditor(Composite parent, int style) {
-		super(parent, style);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.DialogCellEditor#createContents(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Control createContents(Composite cell) {
-		_text = new Text(cell, SWT.LEFT);
-		_text.setFont(cell.getFont());
-		_text.setBackground(cell.getBackground());
-		_text.addKeyListener(new KeyAdapter() {
-			// hook key pressed - see PR 14201
-			public void keyPressed(KeyEvent e) {
-				keyReleaseOccured(e);
-				// disposed this cell editor
-				if ((getControl() == null) || getControl().isDisposed()) {
-					return;
-				}
-			}
-		});
-		// when the text control has focus, the cellEditor will deactive even
-		// when you press the button.
-		// Add the follow codes enable switch to the button control.
-		_text.addFocusListener(new FocusAdapter() {
-			public void focusLost(FocusEvent e) {
-				boolean newValidState = isCorrect(_text.getText());
-				if (newValidState) {
-					markDirty();
-					doSetValue(_text.getText());
-				} else {
-					// try to insert the current value into the error message.
-					setErrorMessage(MessageFormat.format(getErrorMessage(),
-							new Object[] { _text.getText().toString() }));
-				}
-			}
-		});
-
-		return _text;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.CellEditor#doSetFocus()
-	 */
-	protected void doSetFocus() {
-		_text.setFocus();
-		_text.selectAll();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.DialogCellEditor#updateContents(java.lang.Object)
-	 */
-	protected void updateContents(Object value) {
-		if (_text == null || _text.isDisposed()) {
-			return;
-		}
-
-		String text = "";//$NON-NLS-1$
-		if (value != null) {
-			text = value.toString();
-		}
-		_text.setText(text);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.CellEditor#keyReleaseOccured(org.eclipse.swt.events.KeyEvent)
-	 */
-	protected void keyReleaseOccured(KeyEvent keyEvent) {
-		if (keyEvent.character == '\r') {
-			boolean newValidState = isCorrect(_text.getText());
-			if (newValidState) {
-				markDirty();
-				doSetValue(_text.getText());
-			} else {
-				// try to insert the current value into the error message.
-				setErrorMessage(MessageFormat.format(getErrorMessage(),
-						new Object[] { _text.getText().toString() }));
-			}
-			fireApplyEditorValue();
-		}
-		super.keyReleaseOccured(keyEvent);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/LabeledComboBoxCellEditor.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/LabeledComboBoxCellEditor.java
deleted file mode 100644
index efd1df0..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/LabeledComboBoxCellEditor.java
+++ /dev/null
@@ -1,162 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties.celleditors;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.jface.viewers.ComboBoxCellEditor;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.CCombo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.wst.sse.ui.internal.Logger;
-
-/**
- * A simple ComboBoxCellEditor, which allow value and display string to be
- * different.
- * 
- * @author mengbo
- */
-public class LabeledComboBoxCellEditor extends ComboBoxCellEditor {
-	private boolean _fSettingValue = false;
-
-	private Object[] _values;
-
-	/**
-	 * Create LabeledComboBoxCellEditor
-	 * @param parent
-	 * @param valueLabelMap
-	 * @param style
-	 * @return LabeledComboBoxCellEditor
-	 */
-	public static LabeledComboBoxCellEditor newInstance(Composite parent,
-			Map valueLabelMap, int style) {
-		// we'll sort according to label. since that is what being show to user.
-		List list = new ArrayList();
-		for (Iterator iter = valueLabelMap.keySet().iterator(); iter.hasNext();) {
-			Object key = iter.next();
-			String label = (String) valueLabelMap.get(key);
-			list.add(new Object[] { key, label });
-		}
-		// sort by label
-		Collections.sort(list, new Comparator() {
-			public int compare(Object o1, Object o2) {
-				String label1 = (String) ((Object[]) o1)[1];
-				String label2 = (String) ((Object[]) o2)[1];
-				return label1.compareTo(label2);
-			}
-		});
-		Object[] values = new Object[list.size()];
-		String[] labels = new String[list.size()];
-		for (int i = 0, n = list.size(); i < n; i++) {
-			values[i] = ((Object[]) list.get(i))[0];
-			labels[i] = (String) ((Object[]) list.get(i))[1];
-		}
-		return new LabeledComboBoxCellEditor(parent, values, labels, style);
-	}
-
-	/**
-	 * Constructor
-	 * 
-	 * @param parent
-	 * @param values
-	 * @param labels
-	 */
-	public LabeledComboBoxCellEditor(Composite parent, Object[] values,
-			String[] labels) {
-		this(parent, values, labels, SWT.NONE);
-	}
-
-	/**
-	 * Constructor
-	 * 
-	 * @param parent
-	 * @param values
-	 * @param labels
-	 * @param style
-	 */
-	public LabeledComboBoxCellEditor(Composite parent, Object[] values,
-			String[] labels, int style) {
-		super(parent, labels, style);
-		_values = values;
-	}
-
-	protected Object doGetValue() {
-		// otherwise limits to set of valid values
-		Object index = super.doGetValue();
-		int selection = -1;
-		if (index instanceof Integer) {
-			selection = ((Integer) index).intValue();
-		}
-		if (selection >= 0) {
-			return _values[selection];
-		} else if (getControl() instanceof CCombo) {
-			// retrieve the actual text as the list of valid items doesn't
-			// contain the value
-			return ((CCombo) getControl()).getText();
-		}
-		return null;
-	}
-
-	protected void doSetValue(Object value) {
-		if (_fSettingValue) {
-			return;
-		}
-		_fSettingValue = true;
-		if (value instanceof Integer) {
-			super.doSetValue(value);
-		} else {
-			String stringValue = value.toString();
-			int selection = -1;
-			for (int i = 0; i < _values.length; i++) {
-				if (_values[i].equals(stringValue)) {
-					selection = i;
-				}
-			}
-			if (selection >= 0) {
-				super.doSetValue(new Integer(selection));
-			} else {
-				super.doSetValue(new Integer(-1));
-				if (getControl() instanceof CCombo
-						&& !stringValue.equals(((CCombo) getControl())
-								.getText())) {
-					// update the Text widget
-					((CCombo) getControl()).setText(stringValue);
-				}
-			}
-		}
-		_fSettingValue = false;
-	}
-
-	public void setItems(String[] newItems) {
-		if (getControl() == null || getControl().isDisposed()) {
-			Logger.log(Logger.ERROR,
-					"Attempted to update item list for disposed cell editor"); //$NON-NLS-1$
-			return;
-		}
-
-		// keep selection if possible
-		Object previousSelectedValue = getValue();
-		super.setItems(newItems);
-		if (previousSelectedValue != null && getControl() instanceof CCombo) {
-			for (int i = 0; i < newItems.length; i++) {
-				if (newItems[i].equals(previousSelectedValue)) {
-					setValue(previousSelectedValue);
-				}
-			}
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/LabeledStyleComboCellEditor.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/LabeledStyleComboCellEditor.java
deleted file mode 100644
index e8a47d5..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/LabeledStyleComboCellEditor.java
+++ /dev/null
@@ -1,185 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties.celleditors;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jst.jsf.common.ui.internal.utils.StyleCombo;
-import org.eclipse.jst.jsf.metadataprocessors.features.IDefaultValue;
-import org.eclipse.jst.jsf.metadataprocessors.features.IPossibleValue;
-import org.eclipse.jst.jsf.metadataprocessors.features.IPossibleValues;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.wst.sse.ui.internal.Logger;
-
-/**
- * A combo cell editor
- *
- */
-public class LabeledStyleComboCellEditor extends StyleComboCellEditor {
-	private boolean _fSettingValue = false;
-
-	private Object[] _values;
-
-	/**
-	 * @param parent
-	 * @param valueLabelMap
-	 * @param defaultValue
-	 * @param style
-	 * @return the new instance
-	 */
-	public static LabeledStyleComboCellEditor newInstance(Composite parent,
-			Map valueLabelMap, String defaultValue, int style) {
-		// we'll sort according to label. since that is what being show to user.
-		List list = new ArrayList();
-		for (Iterator iter = valueLabelMap.keySet().iterator(); iter.hasNext();) {
-			Object key = iter.next();
-			String label = (String) valueLabelMap.get(key);
-			list.add(new Object[] { key, label });
-		}
-		// sort by label
-		Collections.sort(list, new Comparator() {
-			public int compare(Object o1, Object o2) {
-				String label1 = (String) ((Object[]) o1)[1];
-				String label2 = (String) ((Object[]) o2)[1];
-				return label1.compareTo(label2);
-			}
-		});
-		Object[] values = new Object[list.size()];
-		String[] labels = new String[list.size()];
-		for (int i = 0, n = list.size(); i < n; i++) {
-			values[i] = ((Object[]) list.get(i))[0];
-			labels[i] = (String) ((Object[]) list.get(i))[1];
-		}
-		return new LabeledStyleComboCellEditor(parent, values, labels,
-				defaultValue, style);
-	}
-
-	/**
-	 * Constructor
-	 * 
-	 * @param parent
-	 * @param values
-	 * @param labels
-	 * @param defaultValue 
-	 * @param style
-	 */
-	public LabeledStyleComboCellEditor(Composite parent, Object[] values,
-			String[] labels, String defaultValue, int style) {
-		super(parent, labels, style);
-		StyleCombo combo = (StyleCombo) getControl();
-		if (defaultValue != null)
-			combo.setDefaultValue(defaultValue);
-		_values = values;
-	}
-
-	protected Object doGetValue() {
-		// otherwise limits to set of valid values
-		Object index = super.doGetValue();
-		int selection1 = -1;
-		if (index instanceof Integer) {
-			selection1 = ((Integer) index).intValue();
-		}
-		if (selection1 >= 0) {
-			return _values[selection1];
-		} else if (getControl() instanceof StyleCombo) {
-			// retrieve the actual text as the list of valid items doesn't
-			// contain the value
-			return ((StyleCombo) getControl()).getText();
-		}
-		return null;
-	}
-
-	protected void doSetValue(Object value) {
-		if (_fSettingValue) {
-			return;
-		}
-		_fSettingValue = true;
-		if (value instanceof Integer) {
-			super.doSetValue(value);
-		} else {
-			String stringValue = value.toString();
-			int selection1 = -1;
-			for (int i = 0; i < _values.length; i++) {
-				if (_values[i].equals(stringValue)) {
-					selection1 = i;
-				}
-			}
-			if (selection1 >= 0) {
-				super.doSetValue(new Integer(selection1));
-			} else {
-				super.doSetValue(new Integer(-1));
-				if (getControl() instanceof StyleCombo
-						&& !stringValue.equals(((StyleCombo) getControl())
-								.getText())) {
-					// update the Text widget
-					((StyleCombo) getControl()).setText(stringValue);
-				}
-			}
-		}
-		_fSettingValue = false;
-	}
-
-	public void setItems(String[] newItems) {
-		if (getControl() == null || getControl().isDisposed()) {
-			Logger.log(Logger.ERROR,
-					"Attempted to update item list for disposed cell editor"); //$NON-NLS-1$
-			return;
-		}
-
-		// keep selection if possible
-		Object previousSelectedValue = getValue();
-		super.setItems(newItems);
-		if (previousSelectedValue != null && getControl() instanceof StyleCombo) {
-			for (int i = 0; i < newItems.length; i++) {
-				if (newItems[i].equals(previousSelectedValue)) {
-					setValue(previousSelectedValue);
-				}
-			}
-		}
-	}
-
-	/**
-	 * Create CellEditor
-	 * @param parent
-	 * @param pvs
-	 * @param defaultValue
-	 * @param style
-	 * @return CellEditor
-	 */
-	public static CellEditor newInstance(Composite parent, IPossibleValues pvs,
-			IDefaultValue defaultValue, int style) {
-	
-		CellEditor ed = null;
-		if (pvs != null) {
-			Map map = getPossibleValueMap(pvs);
-			ed = newInstance(parent, map, defaultValue != null ? defaultValue.getDefaultValue() : null, style);
-		}
-		
-		return ed;
-	}
-
-	private static Map getPossibleValueMap(IPossibleValues pvs) {
-		Map<String, String> map = new HashMap<String, String>(pvs.getPossibleValues().size());
-		for (Iterator it = pvs.getPossibleValues().iterator();it.hasNext();){
-			IPossibleValue pv = (IPossibleValue)it.next();
-			map.put(pv.getValue(), pv.getDisplayValue());
-		}
-		return map;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/LoadbundleSelectionCellEditor.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/LoadbundleSelectionCellEditor.java
deleted file mode 100644
index 1465478..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/LoadbundleSelectionCellEditor.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties.celleditors;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jst.jsf.common.ui.IFileFolderConstants;
-import org.eclipse.jst.jsf.common.ui.internal.dialogs.ResourceOnClasspathDialog;
-import org.eclipse.jst.pagedesigner.properties.DesignerPropertyTool;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-
-/**
- * @author mengbo
- */
-public class LoadbundleSelectionCellEditor extends EditableDialogCellEditor {
-	private static final String[] PROPERTIES_FILES_SUFFIXS = new String[] { IFileFolderConstants.EXT_PROPERTIES };
-
-	private String _value;
-
-	private IProject _project;
-
-	/**
-	 * @param parent
-	 * @param project 
-	 */
-	public LoadbundleSelectionCellEditor(Composite parent, IProject project) {
-		super(parent);
-		_project = project;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.DialogCellEditor#openDialogBox(org.eclipse.swt.widgets.Control)
-	 */
-	protected Object openDialogBox(Control cellEditorWindow) {
-		ResourceOnClasspathDialog dialog = new ResourceOnClasspathDialog(
-				cellEditorWindow.getShell(), DesignerPropertyTool
-						.getJavaProject(_project));
-		dialog.setTitle(ResourceBoundle.getString("FileCellEditor.Title")); //$NON-NLS-1$
-		dialog.setSuffixs(PROPERTIES_FILES_SUFFIXS);
-		dialog.open();
-		if (dialog.getResult() != null) {
-			_value = (String) dialog.getResult()[0];
-		}
-		return _value;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/ResourceBoundle.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/ResourceBoundle.java
deleted file mode 100644
index b3eeac5..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/ResourceBoundle.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties.celleditors;
-
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ResourceBoundle {
-	private static final String BUNDLE_NAME = "org.eclipse.jst.pagedesigner.properties.celleditors.messages"; //$NON-NLS-1$
-
-	private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle
-			.getBundle(BUNDLE_NAME);
-
-	private ResourceBoundle() {
-        // no external instantiation
-	}
-
-	/**
-	 * @param key
-	 * @return the value for the key or !!key!!
-	 */
-	public static String getString(String key) {
-		try {
-			return RESOURCE_BUNDLE.getString(key);
-		} catch (MissingResourceException e) {
-			return '!' + key + '!';
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/ResourceDialogCellEditor.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/ResourceDialogCellEditor.java
deleted file mode 100644
index 0eced33..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/ResourceDialogCellEditor.java
+++ /dev/null
@@ -1,213 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties.celleditors;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.jface.window.Window;
-import org.eclipse.jst.jsf.common.ui.internal.dialogs.CommonResourceDialog;
-import org.eclipse.jst.jsf.common.ui.internal.utils.PathUtil;
-import org.eclipse.jst.jsf.common.ui.internal.utils.WebrootUtil;
-import org.eclipse.jst.pagedesigner.utils.WebAppUtil;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * @author mengbo
- */
-public class ResourceDialogCellEditor extends EditableDialogCellEditor {
-	private IProject _project;
-
-	private String[] _suffixs;
-
-	private String _resourceDescription;
-
-	private IFile _referredFile;
-
-	private boolean _isWebPath = false;
-
-	private boolean _needTransformJSPURL = true;
-
-	private String _separator = ""; //$NON-NLS-1$
-
-
-	/**
-	 * Constructor
-	 */
-	public ResourceDialogCellEditor() {
-		super();
-	}
-	
-	/**
-	 * Constructor
-	 * @param parent 
-	 */
-	public ResourceDialogCellEditor(Composite parent) {
-		super(parent);
-	}
-	
-	/**
-	 * Constructor
-	 * @param parent 
-	 * @param style 
-	 */
-	public ResourceDialogCellEditor(Composite parent, int style) {
-		super(parent, style);
-	}
-
-	protected Object openDialogBox(Control cellEditorWindow) {
-		Shell shell = cellEditorWindow.getShell();
-		int style = "".equals(_separator) ? SWT.NONE : SWT.MULTI | SWT.H_SCROLL //$NON-NLS-1$
-				| SWT.V_SCROLL;
-		CommonResourceDialog dialog = new CommonResourceDialog(shell, _project,
-				style);
-		dialog.setTitle(ResourceBoundle.getString("FileCellEditor.Title")); //$NON-NLS-1$
-		dialog.setSuffixs(_suffixs);
-		dialog.setResourceDescription(_resourceDescription);
-		if (dialog.open() == Window.OK) {
-			Object[] result = dialog.getResult();
-			StringBuffer buffer = new StringBuffer();
-			for (int i = 0; i < result.length; i++) {
-				IPath path = ((IFile) result[i]).getLocation();
-
-				IPath referredPath = null;
-				if (_referredFile != null) {
-					referredPath = _referredFile.getLocation();
-				} else {
-					referredPath = _project.getLocation();
-				}
-
-				String newValue = null;
-				if (this._isWebPath) {
-					IFile selectedFile = ((IFile) result[i]);
-					newValue = WebrootUtil.getWebPath(selectedFile
-							.getFullPath());
-				} else {
-					newValue = PathUtil.convertToRelativePath(path.toString(),
-							referredPath.toString());
-				}
-				if (this._needTransformJSPURL) {
-					newValue = WebAppUtil.transformJSPURL(newValue,
-							this._referredFile);
-				}
-				buffer.append(newValue);
-				buffer.append(_separator);
-			}
-			if (buffer.length() > 0) {
-				return buffer.substring(0, buffer.length()
-						- _separator.length());
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * @param project
-	 */
-	public void setProject(IProject project) {
-		this._project = project;
-	}
-
-	/**
-	 * @return Returns the project.
-	 */
-	public IProject getProject() {
-		return _project;
-	}
-
-	/**
-	 * @return Returns the referredFile.
-	 */
-	public IFile getReferredFile() {
-		return _referredFile;
-	}
-
-	/**
-	 * @param referredFile
-	 *            The referredFile to set.
-	 */
-	public void setReferredFile(IFile referredFile) {
-		this._referredFile = referredFile;
-	}
-
-	/**
-	 * @return Returns the resourceDescription.
-	 */
-	public String getResourceDescription() {
-		if (_resourceDescription == null) {
-			if ("".equalsIgnoreCase(getSeparator())) { //$NON-NLS-1$
-				_resourceDescription = ResourceBoundle
-						.getString("FileCellEditor.Msg"); //$NON-NLS-1$
-			} else {
-				_resourceDescription = ResourceBoundle
-						.getString("FileCellEditor.Msg1"); //$NON-NLS-1$
-			}			
-		}
-		return _resourceDescription;
-	}
-
-	/**
-	 * @param resourceDescription
-	 *            The resourceDescription to set.
-	 */
-	public void setResourceDescription(String resourceDescription) {
-		this._resourceDescription = resourceDescription;
-	}
-
-	/**
-	 * @return Returns the suffixes.
-	 */
-	public String[] getSuffixs() {
-		return _suffixs;
-	}
-
-	/**
-	 * @param suffixs
-	 *            The suffixes to set.
-	 */
-	public void setSuffixs(String[] suffixs) {
-		this._suffixs = suffixs;
-	}
-
-	/**
-	 * set some special path to web path instead of relative path
-	 * 
-	 * @param isWebPath
-	 */
-	public void setWebPath(boolean isWebPath) {
-		this._isWebPath = isWebPath;
-	}
-
-	/**
-	 * @param needTransform
-	 */
-	public void setTransformJSPURL(boolean needTransform) {
-		this._needTransformJSPURL = needTransform;
-	}
-
-	/**
-	 * @return separator to use for between values
-	 */
-	public String getSeparator() {
-		return _separator;
-	}
-
-	/**
-	 * @param separator to use for between values
-	 */
-	public void setSeparator(String separator) {
-		this._separator = separator;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/StyleComboCellEditor.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/StyleComboCellEditor.java
deleted file mode 100644
index dba336d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/StyleComboCellEditor.java
+++ /dev/null
@@ -1,257 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties.celleditors;
-
-import java.text.MessageFormat;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jst.jsf.common.ui.internal.utils.StyleCombo;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.FocusAdapter;
-import org.eclipse.swt.events.FocusEvent;
-import org.eclipse.swt.events.KeyAdapter;
-import org.eclipse.swt.events.KeyEvent;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.TraverseEvent;
-import org.eclipse.swt.events.TraverseListener;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-
-/**
- * Combo cell editor
- *
- */
-public class StyleComboCellEditor extends CellEditor {
-	/**
-	 * The list of items to present in the combo box.
-	 */
-	private String[] items;
-
-	/**
-	 * The zero-based index of the selected item.
-	 */
-	int selection;
-
-	/**
-	 * The custom combo box control.
-	 */
-	StyleCombo comboBox;
-
-	/**
-	 * Default ComboBoxCellEditor style
-	 */
-	private static final int defaultStyle = SWT.NONE;
-
-	/**
-	 * Default constructor
-	 */
-	public StyleComboCellEditor() {
-		setStyle(defaultStyle);
-	}
-
-	/**
-	 * @param parent
-	 * @param items
-	 */
-	public StyleComboCellEditor(Composite parent, String[] items) {
-		this(parent, items, defaultStyle);
-	}
-
-	/**
-	 * @param parent
-	 * @param items
-	 * @param style
-	 */
-	public StyleComboCellEditor(Composite parent, String[] items, int style) {
-		super(parent, style);
-		setItems(items);
-	}
-
-	/**
-	 * Returns the list of choices for the combo box
-	 * 
-	 * @return the list of choices for the combo box
-	 */
-	public String[] getItems() {
-		return this.items;
-	}
-
-	/**
-	 * Sets the list of choices for the combo box
-	 * 
-	 * @param items
-	 *            the list of choices for the combo box
-	 */
-	public void setItems(String[] items) {
-		Assert.isNotNull(items);
-		this.items = items;
-		populateComboBoxItems();
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on CellEditor.
-	 */
-	protected Control createControl(Composite parent) {
-
-		comboBox = new StyleCombo(parent, getStyle());
-		comboBox.setFont(parent.getFont());
-
-		comboBox.addKeyListener(new KeyAdapter() {
-			// hook key pressed - see PR 14201
-			public void keyPressed(KeyEvent e) {
-				keyReleaseOccured(e);
-			}
-		});
-
-		comboBox.addSelectionListener(new SelectionAdapter() {
-			public void widgetDefaultSelected(SelectionEvent event) {
-				applyEditorValueAndDeactivate();
-			}
-
-			public void widgetSelected(SelectionEvent event) {
-				selection = comboBox.getSelectionIndex();
-			}
-		});
-
-		comboBox.addTraverseListener(new TraverseListener() {
-			public void keyTraversed(TraverseEvent e) {
-				if (e.detail == SWT.TRAVERSE_ESCAPE
-						|| e.detail == SWT.TRAVERSE_RETURN) {
-					e.doit = false;
-				}
-			}
-		});
-
-		comboBox.addFocusListener(new FocusAdapter() {
-			public void focusLost(FocusEvent e) {
-				StyleComboCellEditor.this.focusLost();
-			}
-		});
-		return comboBox;
-	}
-
-	/**
-	 * The <code>ComboBoxCellEditor</code> implementation of this
-	 * <code>CellEditor</code> framework method returns the zero-based index
-	 * of the current selection.
-	 * 
-	 * @return the zero-based index of the current selection wrapped as an
-	 *         <code>Integer</code>
-	 */
-	protected Object doGetValue() {
-		return new Integer(selection);
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on CellEditor.
-	 */
-	protected void doSetFocus() {
-		comboBox.setFocus();
-	}
-
-	/**
-	 * The <code>ComboBoxCellEditor</code> implementation of this
-	 * <code>CellEditor</code> framework method sets the minimum width of the
-	 * cell. The minimum width is 10 characters if <code>comboBox</code> is
-	 * not <code>null</code> or <code>disposed</code> eles it is 60 pixels
-	 * to make sure the arrow button and some text is visible. The list of
-	 * CCombo will be wide enough to show its longest item.
-	 */
-	public LayoutData getLayoutData() {
-		LayoutData layoutData = super.getLayoutData();
-		if ((comboBox == null) || comboBox.isDisposed())
-			layoutData.minimumWidth = 60;
-		else {
-			// make the comboBox 10 characters wide
-			GC gc = new GC(comboBox);
-			layoutData.minimumWidth = (gc.getFontMetrics()
-					.getAverageCharWidth() * 10) + 10;
-			gc.dispose();
-		}
-		return layoutData;
-	}
-
-	/**
-	 * The <code>ComboBoxCellEditor</code> implementation of this
-	 * <code>CellEditor</code> framework method accepts a zero-based index of
-	 * a selection.
-	 * 
-	 * @param value
-	 *            the zero-based index of the selection wrapped as an
-	 *            <code>Integer</code>
-	 */
-	protected void doSetValue(Object value) {
-		Assert.isTrue(comboBox != null && (value instanceof Integer));
-		selection = ((Integer) value).intValue();
-		comboBox.select(selection);
-	}
-
-	/**
-	 * Updates the list of choices for the combo box for the current control.
-	 */
-	private void populateComboBoxItems() {
-		if (comboBox != null && items != null) {
-			comboBox.removeAll();
-			for (int i = 0; i < items.length; i++)
-				comboBox.add(items[i], i);
-
-			setValueValid(true);
-			selection = 0;
-		}
-	}
-
-	/**
-	 * Applies the currently selected value and deactiavates the cell editor
-	 */
-	void applyEditorValueAndDeactivate() {
-		// must set the selection before getting value
-		selection = comboBox.getSelectionIndex();
-		Object newValue = doGetValue();
-		markDirty();
-		boolean isValid = isCorrect(newValue);
-		setValueValid(isValid);
-		if (!isValid) {
-			// try to insert the current value into the error message.
-			setErrorMessage(MessageFormat.format(getErrorMessage(),
-					new Object[] { items[selection] }));
-		}
-		fireApplyEditorValue();
-		deactivate();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.CellEditor#focusLost()
-	 */
-	protected void focusLost() {
-		if (isActivated()) {
-			applyEditorValueAndDeactivate();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.CellEditor#keyReleaseOccured(org.eclipse.swt.events.KeyEvent)
-	 */
-	protected void keyReleaseOccured(KeyEvent keyEvent) {
-		if (keyEvent.character == '\u001b') { // Escape character
-			fireCancelEditor();
-		} else if (keyEvent.character == '\t') { // tab key
-			applyEditorValueAndDeactivate();
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/messages.properties b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/messages.properties
deleted file mode 100644
index aa55e43..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/messages.properties
+++ /dev/null
@@ -1,13 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-FileCellEditor.Title=Select File
-FileCellEditor.Msg=Select a file
-FileCellEditor.Msg1=Select one or more files
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/dialogfields/MDEnabledComboDialogField.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/dialogfields/MDEnabledComboDialogField.java
deleted file mode 100644
index e63245f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/dialogfields/MDEnabledComboDialogField.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *
- ********************************************************************************/
-package org.eclipse.jst.pagedesigner.properties.dialogfields;
-
-import java.util.Iterator;
-import java.util.Map;
-import java.util.TreeMap;
-
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.StyleComboDialogField;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContextFactory;
-import org.eclipse.jst.jsf.metadataprocessors.features.IDefaultValue;
-import org.eclipse.jst.jsf.metadataprocessors.features.IPossibleValue;
-import org.eclipse.jst.jsf.metadataprocessors.features.IPossibleValues;
-import org.eclipse.jst.pagedesigner.editors.properties.IPropertyPageDescriptor;
-import org.eclipse.jst.pagedesigner.properties.attrgroup.IElementContextable;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-
-/**
- * This combo dialog field defers loading the combos until the element context has been set
- *
- */
-public class MDEnabledComboDialogField extends StyleComboDialogField implements IElementContextable {
-
-	/**
-	 * Constructor
-	 * @param flags
-	 */
-	public MDEnabledComboDialogField(int flags) {
-		super(flags);
-	}
-
-	public void setElementContext(IDOMNode ancester, IDOMElement element) {
-		IStructuredDocumentContext sdContext =IStructuredDocumentContextFactory.INSTANCE.getContext(element.getStructuredDocument(), element);
-		IPropertyPageDescriptor ppd = (IPropertyPageDescriptor)getAttachedData("KEY_ATTR");//FIXME use constant //$NON-NLS-1$
-		ppd.setStructuredDocumentContext(sdContext);
-		IPossibleValues pvs = (IPossibleValues)ppd.getAdapter(IPossibleValues.class);
-		IDefaultValue def = (IDefaultValue)ppd.getAdapter(IDefaultValue.class);
-		if (def != null)
-			setDefaultValue(def.getDefaultValue());
-		if (pvs.getPossibleValues() != null)
-			setEntryMap(getMapOfPossibleValues(pvs));
-	}
-
-	private Map getMapOfPossibleValues(IPossibleValues pvs) {
-		Map map = new TreeMap<String, String>();
-		for (Iterator<IPossibleValue> it=pvs.getPossibleValues().iterator();it.hasNext();){
-			IPossibleValue pv = it.next();
-			map.put(pv.getValue(), pv.getDisplayValue());
-		}
-		return map;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/AllPropertySectionDescriptor.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/AllPropertySectionDescriptor.java
deleted file mode 100644
index 8c5de9b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/AllPropertySectionDescriptor.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties.internal;
-
-import org.eclipse.jst.pagedesigner.properties.AllPropertySection;
-import org.eclipse.ui.views.properties.tabbed.AbstractSectionDescriptor;
-import org.eclipse.ui.views.properties.tabbed.ISection;
-
-/**
- * SectionDescriptor for the WPE Attributes tab
- */
-public class AllPropertySectionDescriptor extends AbstractSectionDescriptor {
-	/**
-	 * Id for the WPE AllPropertySectionDescriptor
-	 */
-	public static final String ID = "AllPropertySectionDescriptor"; //$NON-NLS-1$
-
-	private ISection section;
-
-	public String getId() {
-		return ID;
-	}
-
-	public ISection getSectionClass() {
-		if (section == null){
-			section = new AllPropertySection();
-		}
-		return section;
-	}
-
-	public String getTargetTab() {
-		return AttributesTabDescriptor.TAB_ID;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/AttributeGroup.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/AttributeGroup.java
deleted file mode 100644
index 585cd4e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/AttributeGroup.java
+++ /dev/null
@@ -1,441 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties.internal;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jst.jsf.common.metadata.Entity;
-import org.eclipse.jst.jsf.common.metadata.query.TaglibDomainMetaDataQueryHelper;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogFieldGroup;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogFieldApplyListener;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogFieldChangeListener;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.ISupportTextValue;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IStructuredDocumentContextResolverFactory;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContextFactory;
-import org.eclipse.jst.jsf.metadataprocessors.MetaDataEnabledProcessingFactory;
-import org.eclipse.jst.pagedesigner.editors.HTMLEditor;
-import org.eclipse.jst.pagedesigner.editors.properties.IPropertyPageDescriptor;
-import org.eclipse.jst.pagedesigner.properties.attrgroup.IElementContextable;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-
-/**
- * @author mengbo
- * @version 1.5
- * 
- * TODO: cleanup up constructors
- */
-public class AttributeGroup extends DialogFieldGroup {
-	private static final Object KEY_ATTR = "KEY_ATTR"; //$NON-NLS-1$
-
-//	private String _helpContextId;
-
-	private List<DialogField> _dialogFields = null;  //consider using Map
-	private IDOMElement _ownerElement;
-	private Entity _tagEntity;
-	private List<String> _attrNames;
-	private List<IPropertyPageDescriptor> _attrPDs;
-	private IStructuredDocumentContext _sdContext;
-
-	private String _uri;
-	private String _tagName;
-	
-	/**
-	 * Constructor
-	 * @param tagEntity - may not be null
-	 * @param attrNames - may not be null.  Attribute names must be valid for the tag, and have attribute-value-runtime-type trait info
-	 */
-	public AttributeGroup(Entity tagEntity, List<String> attrNames) {
-		_tagEntity = tagEntity;
-		_attrNames = attrNames;		
-	}
-	
-	/**
-	 * Constructor where tagEntity is determined later or set later
-	 * @param uri - may be null
-	 * @param tagName - may be null
-	 * @param attributeNames - may not be null.  Attribute names must be valid for the tag, and have attribute-value-runtime-type trait info
-	 */
-	public AttributeGroup(String uri,
-			String tagName, String[] attributeNames) {
-		_uri = uri;
-		_tagName = tagName;
-		if (attributeNames != null)
-			_attrNames = Arrays.asList(attributeNames);
-		else 
-			_attrNames = new ArrayList();
-	}
-	
-	private List<IPropertyPageDescriptor> prepareDescriptors(Entity tagEntity,
-			List<String> names) {
-		
-		List pds = new ArrayList();
-		for (String attrName : names) {
-			IPropertyPageDescriptor pd = getPD(tagEntity, attrName);
-			if (pd != null)
-				pds.add(pd);
-		}
-		return pds;
-	}
-
-	private IPropertyPageDescriptor getPD(Entity tagEntity, String attrName) {		
-		IPropertyPageDescriptor pd = null;
-		Entity attrEntity = TaglibDomainMetaDataQueryHelper.getEntity(tagEntity, attrName);
-		if (attrEntity != null){
-			List pds = MetaDataEnabledProcessingFactory.getInstance().getAttributeValueRuntimeTypeFeatureProcessors(
-							IPropertyPageDescriptor.class, getStructuredDocumentContext(), attrEntity);					
-			if (pds != null && !pds.isEmpty())
-				pd = (IPropertyPageDescriptor)pds.get(0);
-			else 
-				pd = new DefaultPropertyPageDescriptor(tagEntity, attrEntity);
-		}
-		return pd;
-	}
-
-
-	private void resetStructuredDocumentContext() {
-		_sdContext = null;
-		getStructuredDocumentContext();		
-	}
-
-	private IStructuredDocumentContext getStructuredDocumentContext() {
-		if (_sdContext == null) {
-			if (_ownerElement != null) {
-				_sdContext = IStructuredDocumentContextFactory.INSTANCE.getContext(_ownerElement.getStructuredDocument(), _ownerElement);				
-				
-			} else {
-				IEditorPart edPart = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActiveEditor();
-				if (edPart != null && edPart instanceof HTMLEditor) {//edPart will always be the WPE, but checking just to be safe
-					_sdContext = IStructuredDocumentContextFactory.INSTANCE.getContext(((HTMLEditor)edPart).getDocument(), 0);
-				}
-			} 
-		}
-		return _sdContext;
-	}
-
-	/**
-	 * @return tag entity for this attribute group
-	 */
-	protected Entity getTagEntity() {
-		if (_tagEntity == null) {
-			if (_ownerElement != null){
-				IStructuredDocumentContext context = IStructuredDocumentContextFactory.INSTANCE.getContext(_ownerElement.getStructuredDocument(), 0);
-				if (context != null){
-					String uri = _uri != null ? _uri : IStructuredDocumentContextResolverFactory.INSTANCE.getDOMContextResolver(context).getNode().getBaseURI();
-					String tagName = _tagName != null ? _tagName :  IStructuredDocumentContextResolverFactory.INSTANCE.getDOMContextResolver(context).getNode().getNodeName();
-					if (uri != null){
-						IProject project = IStructuredDocumentContextResolverFactory.INSTANCE.getWorkspaceContextResolver(context).getProject();
-						_tagEntity = TaglibDomainMetaDataQueryHelper.getEntity(TaglibDomainMetaDataQueryHelper.createMetaDataModelContext(project, uri), tagName);
-					}
-				}
-			}
-		}
-		return _tagEntity;
-	}
-	/**
-	 * @return tag name
-	 */
-	public String getTagName() {
-		if (getTagEntity() == null)
-			return _tagName;
-		return getTagEntity().getId();
-	}
-
-	/**
-	 * @return tag URI
-	 */
-	public String getURI() {
-		if (getTagEntity() == null)
-			return _uri;
-		return getTagEntity().getModel().getCurrentModelContext().getUri();
-	}
-
-
-	/**
-	 * Empty implementation. Subclasses should override to override default dialogField creation
-	 * @param ppd
-	 * @return DialogField
-	 */
-	protected DialogField createDialogField(IPropertyPageDescriptor ppd) {
-		return null;
-	}
-	
-//	protected DialogField createDialogField(String uri, String tag,
-//			String attr) {
-//		
-//		return null;
-//	}
-	
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogFieldGroup#initialize()
-	 */
-	public void initialize() {
-		if (_dialogFields == null) {
-			_dialogFields = new ArrayList();
-
-			for (IPropertyPageDescriptor pd : getAttributePDs()) {
-				DialogField field;			
-				field = createDialogField(pd);
-				
-				if (field == null) {
-					field = pd.getDialogFieldEditor();
-				}
-
-				field.putAttachedData(KEY_ATTR, pd);//descriptors[i]);
-
-				IDialogFieldApplyListener applyListener = getDialogFieldApplyListener(pd);
-//						getURI(), getTagName(), pd.getAttributeName());//descriptors[i]);
-				if (applyListener == null) {
-					applyListener = getDefaultApplyListener();
-				}
-				field.setDialogFieldApplyListener(applyListener);
-
-				IDialogFieldChangeListener changeListener = getDialogFieldChangeListener(pd);
-//						getURI(), getTagName(), pd.getAttributeName());//descriptors[i]);
-				if (changeListener == null) {
-					changeListener = getDefaultChangeListener();
-				}
-				field.setDialogFieldChangeListener(changeListener);
-				_dialogFields.add(field);
-			}
-		}
-	}
-
-	private List<IPropertyPageDescriptor> getAttributePDs() {
-		if (_attrPDs == null){
-			_attrPDs = prepareDescriptors(getTagEntity(), _attrNames);
-		}
-		return _attrPDs;
-	}
-
-	/**
-	 * Child class can override the method to provide listener implementation
-	 * 
-	 * @param ppd
-	 * @return IDialogFieldApplyListener
-	 */
-	protected IDialogFieldApplyListener getDialogFieldApplyListener(IPropertyPageDescriptor ppd) {
-		return null;
-	}
-
-	/**
-	 * Child class can override the method to provide listener implementation
-	 * 
-	 * @param ppd
-	 * @return IDialogFieldChangeListener
-	 */
-	protected IDialogFieldChangeListener getDialogFieldChangeListener(IPropertyPageDescriptor ppd){
-			return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogFieldGroup#refreshData()
-	 */
-	public void refreshData() {
-		if (_ownerElement == null) {
-			return;
-		}
-		initialize();
-		for (int i = 0, size = _dialogFields.size(); i < size; i++) {
-			DialogField field = _dialogFields.get(i);
-
-			ISupportTextValue textValue = (ISupportTextValue) field;
-			IPropertyPageDescriptor attr = (IPropertyPageDescriptor) field
-					.getAttachedData(KEY_ATTR);
-			String attrName = attr.getAttributeName();
-			String attrValue = _ownerElement.getAttribute(attrName);
-			textValue.setTextWithoutUpdate(attrValue);
-		}
-	}
-
-	/**
-	 * @return IDOMElement
-	 */
-	public IDOMElement getElement() {
-		return _ownerElement;
-	}
-
-	/**
-	 * Sets the context in each of the dialogFields in the Group
-	 * @param context
-	 * @param owner
-	 */
-	public void setElementContext(IDOMNode context, IDOMElement owner) {
-		this._ownerElement = owner;
-		resetStructuredDocumentContext();
-		initialize();
-		if (context != null) {
-			for (int i = 0, size = _dialogFields.size(); i < size; i++) {
-				DialogField field = _dialogFields.get(i);
-				if (field instanceof IElementContextable) {
-					((IElementContextable) field).setElementContext(context,
-							owner);
-				}
-			}
-		}
-		refreshData();
-	}
-
-	public void layoutDialogFields(FormToolkit toolkit, Composite parent) {
-		Composite top;
-		if (toolkit == null) {//when being displayed by DialogFieldGroupPage  (wizard)
-			top = new Composite(parent, SWT.NONE);
-			FillLayout fillLayout = new FillLayout(SWT.VERTICAL);
-			parent.setLayout(fillLayout);
-		} else {
-			top = toolkit.createComposite(parent, SWT.NONE);
-		}
-//		FillLayout fillLayout = new FillLayout(SWT.VERTICAL);
-//		parent.setLayout(fillLayout);
-
-//		if (this._helpContextId != null && this._helpContextId.length() > 0) {
-//			PlatformUI.getWorkbench().getHelpSystem().setHelp(top,
-//					_helpContextId);
-//		}
-
-		GridLayout layout = new GridLayout();
-		int numColumns = getNumColumns();
-		layout.numColumns = numColumns;
-		top.setLayout(layout);
-//		top.setLayoutData(new RowData());
-		
-		initialize();
-		for (int i = 0, size = _dialogFields.size(); i < size; i++) {
-			DialogField field = _dialogFields.get(i);
-			field.doFillIntoGrid(toolkit, top, numColumns);
-		}
-
-		DialogField maxColumnField = null;
-		int maxColumn = 0;
-		for (int i = 0, size = _dialogFields.size(); i < size; i++) {
-			DialogField field = _dialogFields.get(i);
-			int c = field.getNumberOfControls();
-			if (c > maxColumn) {
-				maxColumn = c;
-				maxColumnField = field;
-			}
-		}
-		if (maxColumnField != null) {
-			maxColumnField.handleGrabHorizontal();
-		}
-	}
-
-	/**
-	 * @return number of columns in for composite grid layout
-	 */
-	public int getNumColumns() {
-		int columns = 1;
-		initialize();
-		for (int i = 0, size = _dialogFields.size(); i < size; i++) {
-			DialogField field = _dialogFields.get(i);
-			columns = Math.max(columns, field.getNumberOfControls());
-		}
-		return columns;
-	}
-	
-	@Override
-	public IStatus[] validateDialogFields() {
-		return null;
-	}
-
-	/**
-	 * @return DialogField[]
-	 */
-	public DialogField[] getDialogFields() {
-		initialize();
-		DialogField[] ret = new DialogField[_dialogFields.size()];
-		_dialogFields.toArray(ret);
-		return ret;
-	}
-
-	/**
-	 * get the dialogfield for the corresponding attribute.
-	 * 
-	 * @param attrName
-	 *            case sensitive attribute name.
-	 * @return null if fail to find.
-	 */
-	public DialogField getDialogField(String attrName) {
-		initialize();
-		for (int i = 0, size = _dialogFields.size(); i < size; i++) {
-			DialogField field = _dialogFields.get(i);
-			IPropertyPageDescriptor attr = this.getPropertyDescriptor(field);
-			if (attr != null && attr.getAttributeName().equals(attrName)) {
-				return field;
-			}
-		}
-		return null;
-	}
-	
-	/**
-	 * @param field
-	 * @return IPropertyPageDescriptor
-	 */
-	public IPropertyPageDescriptor getPropertyDescriptor(DialogField field) {
-		Object obj = field.getAttachedData(KEY_ATTR);
-		if (obj instanceof IPropertyPageDescriptor) {
-			return (IPropertyPageDescriptor) obj;
-		}
-	    return null;
-	}
-	
-	@Override
-	public void reset(){
-		if (_dialogFields != null){
-			for (DialogField field : _dialogFields){
-				field.setDialogFieldApplyListener(null);
-				field.setDialogFieldChangeListener(null);
-			}
-			_dialogFields = null;
-		}
-	}
-
-	/**
-	 * Set the tag entity
-	 * @param tagEntity
-	 */
-	/*package*/ void setTagEntity(Entity tagEntity) {
-		_tagEntity = tagEntity;		
-	}
-
-	public String toString(){
-		StringBuffer buf = new StringBuffer("AttributeGroup: uri="); //$NON-NLS-1$
-		buf.append("\r\r").append(getURI()).append("\r\rtag=").append(getTagName()); //$NON-NLS-1$ //$NON-NLS-2$
-		buf.append("\r\rAttrs: "); //$NON-NLS-1$
-		for (int i=0;i<_attrNames.size();i++) {
-			String attr = _attrNames.get(i);
-			buf.append(attr);
-			if (i<_attrNames.size())
-				buf.append(", "); //$NON-NLS-1$
-		}
-		return buf.toString();
-	}
-	
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/AttributeGroupSection.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/AttributeGroupSection.java
deleted file mode 100644
index 49a49e4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/AttributeGroupSection.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties.internal;
-
-import java.util.List;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.jsf.common.metadata.Entity;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogFieldApplyListener;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.ISupportTextValue;
-import org.eclipse.jst.pagedesigner.commands.single.ChangeAttributeCommand;
-import org.eclipse.jst.pagedesigner.editors.properties.IPropertyPageDescriptor;
-import org.eclipse.jst.pagedesigner.properties.BaseCustomSection;
-import org.eclipse.jst.pagedesigner.properties.attrgroup.AttributeGroupMessages;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetWidgetFactory;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-
-/**
- * This is a section for a list of attribute dialog fields.
- * 
- * @author mengbo
- * @version 1.5
- */
-public class AttributeGroupSection extends BaseCustomSection {
-	private static final Object KEY_ATTR = "KEY_ATTR"; //$NON-NLS-1$
-	private IDialogFieldApplyListener _fieldApplyListener = new IDialogFieldApplyListener() {
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogFieldApplyListener#dialogFieldApplied(org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField)
-		 */
-		public void dialogFieldApplied(DialogField field) {
-			Object attr = field.getAttachedData(KEY_ATTR);
-			if (attr instanceof IPropertyPageDescriptor && _element != null) {
-				ISupportTextValue textValue = (ISupportTextValue) field;
-				ChangeAttributeCommand c = new ChangeAttributeCommand(
-						AttributeGroupMessages
-								.getString("AttributeGroupSection.changeAttribute"), _element, ((IPropertyPageDescriptor) attr).getAttributeName(), textValue.getText()); //$NON-NLS-1$
-				c.execute();
-			}
-		}
-	};
-
-	private AttributeGroup _group;
-
-	/**
-	 * Constructor.  Create the section with a default AttributeGroup. In default
-	 * AttributeGroup, there is no relationship between fields.
-	 * 
-	 * @param tagEntity
-	 * @param attrNames
-	 */
-	public AttributeGroupSection(Entity tagEntity, List<String> attrNames) {
-		this(new AttributeGroup(tagEntity, attrNames));
-	}
-
-	/**
-	 * Constructor.  In case the group is not a default group (e.g. you may add some
-	 * customized relationship between the fields).
-	 * 
-	 * @param group
-	 */
-	public AttributeGroupSection(AttributeGroup group) {
-		_group = group;
-		_group.setDefaultApplyListener(_fieldApplyListener);
-//		_group.initialize();
-	}
-
-	public void setInput(IWorkbenchPart part, ISelection selection) {
-		super.setInput(part, selection);
-		_group.setElementContext(_element, _element);
-	}
-
-	public void createControls(Composite parent,
-			TabbedPropertySheetPage aTabbedPropertySheetPage) {
-		super.createControls(parent, aTabbedPropertySheetPage);
-		TabbedPropertySheetWidgetFactory factory = aTabbedPropertySheetPage
-				.getWidgetFactory();
-		_group.layoutDialogFields(factory, parent);
-	}
-
-	protected void notifyChanged(INodeNotifier notifier, int eventType,
-			Object changedFeature, Object oldValue, Object newValue, int pos) {
-		if (_group != null) {
-			_group.refreshData();
-		}
-	}
-
-	@Override
-	public void dispose() {
-		super.dispose();
-		_group.reset();
-	}
-	
-	/**
-	 * NOT API - for JUnit testing only
-	 * @return @link{AttributeGroup}
-	 */
-	public AttributeGroup getAttributeGroup() {		
-		return _group;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/AttributesTabDescriptor.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/AttributesTabDescriptor.java
deleted file mode 100644
index 4c00440..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/AttributesTabDescriptor.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties.internal;
-
-import java.util.List;
-import java.util.Vector;
-
-import org.eclipse.ui.views.properties.tabbed.AbstractTabDescriptor;
-import org.eclipse.ui.views.properties.tabbed.ISectionDescriptor;
-
-/**
- * Attributes tab descriptor
- *
- */
-public class AttributesTabDescriptor extends AbstractTabDescriptor {
-	
-	/**
-	 * Attributes tab id 
-	 */
-	public static final String TAB_ID = "jst.pagedesigner.tabbed.properties.attributes"; //$NON-NLS-1$
-
-	private Vector<ISectionDescriptor> descriptors;
-	
-	/**
-	 * Constructor
-	 */
-	public AttributesTabDescriptor(){
-		super();
-		descriptors = new Vector<ISectionDescriptor>(1);
-		descriptors.add(new AllPropertySectionDescriptor());
-	}
-	
-	@Override
-	public List getSectionDescriptors() {		
-		return descriptors;
-	}
-
-	public String getCategory() {
-		return "attributes"; //$NON-NLS-1$
-	}
-
-	public String getId() {
-		return TAB_ID;
-	}
-
-	public String getLabel() {
-		return Messages.AttributesTabDescriptor_label;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/DefaultPropertyPageDescriptor.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/DefaultPropertyPageDescriptor.java
deleted file mode 100644
index e32213c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/DefaultPropertyPageDescriptor.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties.internal;
-
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jst.jsf.common.metadata.Entity;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IStructuredDocumentContextResolverFactory;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.jst.jsf.metadataprocessors.MetaDataContext;
-import org.eclipse.jst.pagedesigner.editors.properties.IPropertyPageDescriptor;
-import org.eclipse.jst.pagedesigner.meta.EditorCreator;
-import org.eclipse.jst.pagedesigner.meta.IAttributeRuntimeValueType;
-import org.eclipse.jst.pagedesigner.meta.internal.CellEditorFactoryRegistry;
-import org.eclipse.jst.pagedesigner.properties.ITabbedPropertiesConstants;
-import org.eclipse.swt.widgets.Composite;
-import org.w3c.dom.Element;
-
-/**
- * Property descriptor implementation for when meta data is available, but the
- * meta data type is not adaptable to a {@link IPropertyPageDescriptor}.
- * 
- * It is assumed that the value type is
- * {@link org.eclipse.jst.jsf.taglibprocessing.attributevalues.StringType}.
- */
-public class DefaultPropertyPageDescriptor implements IPropertyPageDescriptor
-{
-    private Entity _tagEntity;
-    private Entity _attrEntity;
-
-    private IStructuredDocumentContext _sdContext;
-    private MetaDataContext _mdContext;
-
-    /**
-     * Constructor
-     * 
-     * @param tagEntity
-     * @param attrEntity
-     */
-    public DefaultPropertyPageDescriptor(Entity tagEntity, Entity attrEntity)
-    {
-        _tagEntity = tagEntity;
-        _attrEntity = attrEntity;
-    }
-
-    public String getAttributeName()
-    {
-        return _attrEntity.getId();
-    }
-
-    public String getCategory()
-    {
-        return ITabbedPropertiesConstants.OTHER_CATEGORY;
-    }
-
-    public CellEditor getCellEditor(Composite parent)
-    {
-        Element element = (Element) IStructuredDocumentContextResolverFactory.INSTANCE
-                .getDOMContextResolver(getStructuredDocumentContext())
-                .getNode();
-        return CellEditorFactoryRegistry.getInstance().createCellEditor(parent,
-                this, element);
-    }
-
-    public String getDescription()
-    {
-        return null;
-    }
-
-    public DialogField getDialogFieldEditor()
-    {
-        EditorCreator creator = EditorCreator.getInstance();
-        return creator.createDialogFieldWithWrapper(getUri(), getTagName(),
-                this, null);
-    }
-
-    public String getLabel()
-    {
-        return getAttributeName() + ":"; //$NON-NLS-1$
-    }
-
-    public String getTagName()
-    {
-        return _tagEntity.getId();
-    }
-
-    public String getUri()
-    {
-        return _tagEntity.getModel().getCurrentModelContext().getUri();
-    }
-
-    public String getValueType()
-    {
-        return IAttributeRuntimeValueType.STRING;
-    }
-
-    public boolean isRequired()
-    {
-        return false;
-    }
-
-    public MetaDataContext getMetaDataContext()
-    {
-        return _mdContext;
-    }
-
-    public IStructuredDocumentContext getStructuredDocumentContext()
-    {
-        return _sdContext;
-    }
-
-    public void setMetaDataContext(MetaDataContext context)
-    {
-        _mdContext = context;
-    }
-
-    public void setStructuredDocumentContext(IStructuredDocumentContext context)
-    {
-        _sdContext = context;
-    }
-
-    public Object getAdapter(Class adapter)
-    {
-        return null;
-    }
-
-    public String toString()
-    {
-        return getUri()
-                + "/" + getTagName() + "/" + getAttributeName() + " (Default Descriptor)"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/MDQuickEditTabSectionDescriptor.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/MDQuickEditTabSectionDescriptor.java
deleted file mode 100644
index e1628d4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/MDQuickEditTabSectionDescriptor.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties.internal;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.views.properties.tabbed.AbstractSectionDescriptor;
-import org.eclipse.ui.views.properties.tabbed.ISection;
-
-/**
- * Quick Edit section descriptor that uses the quickEditSection trait meta data for the tag entity of the selection
- * to determine the sections to display
- *
- */
-public class MDQuickEditTabSectionDescriptor extends AbstractSectionDescriptor {
-	
-	/**
-	 * Default constructor
-	 */
-	public MDQuickEditTabSectionDescriptor() {
-		super();
-	}
-	
-	@Override
-	public boolean appliesTo(IWorkbenchPart part, ISelection selection) {
-		return true;// we will always display tab, but will show text that no quick edit properties are available when they aren't
-	}
-	
-	public ISection getSectionClass() {
-		return new  QuickEditTabSection();
-	}
-
-	public String getTargetTab() {
-		return QuickEditTabDescriptor.TAB_ID;
-	}
-
-	public String getId() {
-		return "mdQuickEditTabSections"; //$NON-NLS-1$
-	}
-	
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/Messages.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/Messages.java
deleted file mode 100644
index 275a500..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/Messages.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties.internal;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * Externalized strings
- *
- */
-public class Messages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.jst.pagedesigner.properties.internal.messages"; //$NON-NLS-1$
-	/**
-	 * 
-	 */
-	public static String AttributesTabDescriptor_label;
-	/**
-	 * 
-	 */
-	public static String QuickEditTabDescriptor_label;
-	static {
-		// initialize resource bundle
-		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-	}
-
-	private Messages() {
-		//
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/NullQuickEditTabGroupDescriptor.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/NullQuickEditTabGroupDescriptor.java
deleted file mode 100644
index 893b6ab..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/NullQuickEditTabGroupDescriptor.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties.internal;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.ui.views.properties.tabbed.ISection;
-
-/**
- * QuickEdit Tab section when quick edit section info is not available.
- * 
- * Ideally we should not be displaying the tab in the absence of MD, but due to current 
- * issues with the tabbed-properties framework, it is easier to simply display a "null"
- * section. 
- *
- */
-public class NullQuickEditTabGroupDescriptor extends
-		QuickEditTabSectionsDescriptor {
-
-	private List<ISection> nullQuickEditSection;
-	
-	/**
-	 * Constructor
-	 */
-	public NullQuickEditTabGroupDescriptor() {
-		super();
-	}
-
-	@Override
-	public List<ISection> getSections() {
-		return nullQuickEditSection;
-	}
-	
-	@Override
-	public void calculateSections() {
-		nullQuickEditSection = new ArrayList<ISection>(1);
-		nullQuickEditSection.add(new NullQuickEditTabSection());
-	}
-	
-	
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/NullQuickEditTabSection.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/NullQuickEditTabSection.java
deleted file mode 100644
index 11712bf..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/NullQuickEditTabSection.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties.internal;
-
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.CLabel;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.views.properties.tabbed.AbstractPropertySection;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetWidgetFactory;
-
-/**
- * Section that displays text that no quick edit properties are available for the input
- */
-public class NullQuickEditTabSection extends AbstractPropertySection {
-
-	@Override
-	public void createControls(Composite parent,
-			TabbedPropertySheetPage tabbedPropertySheetPage) {
-		super.createControls(parent, tabbedPropertySheetPage);
-		TabbedPropertySheetWidgetFactory factory = tabbedPropertySheetPage.getWidgetFactory();
-		
-		Composite cont = factory.createComposite(parent, SWT.NO_FOCUS);
-		GridLayout layout = new GridLayout(1, false);
-		cont.setLayout(layout);
-
-		CLabel lbl = 
-			factory.createCLabel(cont, PDPlugin.getResourceString("QuickEditTab.no_quick_edit_md"));//$NON-NLS-1$
-		lbl.setLayoutData(new GridData());		
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/QuickEditTabDescriptor.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/QuickEditTabDescriptor.java
deleted file mode 100644
index 5917065..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/QuickEditTabDescriptor.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties.internal;
-
-import org.eclipse.ui.views.properties.tabbed.AbstractTabDescriptor;
-
-/**
- * Quick Edit Tab Descriptor
- */
-public class QuickEditTabDescriptor extends AbstractTabDescriptor {
-
-	/**
-	 * Quick Edit tab id
-	 */
-	public static final String TAB_ID = "jst.pagedesigner.tabbed.properties.quickedit"; //$NON-NLS-1$
-	
-	/**
-	 * Constructor
-	 */
-	public QuickEditTabDescriptor(){
-		super();
-		getSectionDescriptors().add(new MDQuickEditTabSectionDescriptor());
-	}
-	
-	public String getCategory() {
-		return "quickedit"; //$NON-NLS-1$
-	}
-
-	public String getId() {
-		return TAB_ID;
-	}
-
-	public String getLabel() {
-		return Messages.QuickEditTabDescriptor_label;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/QuickEditTabManager.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/QuickEditTabManager.java
deleted file mode 100644
index 55de9cb..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/QuickEditTabManager.java
+++ /dev/null
@@ -1,217 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties.internal;
-
-import javax.xml.namespace.QName;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.jsf.common.metadata.Entity;
-import org.eclipse.jst.jsf.common.metadata.Trait;
-import org.eclipse.jst.jsf.common.metadata.query.ITaglibDomainMetaDataModelContext;
-import org.eclipse.jst.jsf.common.metadata.query.TaglibDomainMetaDataQueryHelper;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IStructuredDocumentContextResolverFactory;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.ITaglibContextResolver;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContextFactory;
-import org.eclipse.jst.pagedesigner.editors.HTMLEditor;
-import org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.QuickEditTabSections;
-import org.eclipse.jst.pagedesigner.properties.DesignerPropertyTool;
-import org.eclipse.jst.pagedesigner.properties.WPETabbedPropertySheetPage;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.part.FileEditorInput;
-import org.w3c.dom.Element;
-
-/**
- * One-to-one with {@link WPETabbedPropertySheetPage} that manages the current sections for the current selection.
- * <p>
- * The QuickEditTabManager has a shared instance of a {@link QuickEditTabSectionsManager} for the project.
- * <p>
- * When a WPETabbedPropertySheetPage is created, it must acquire a QuickEditTabManager using the static acquireInstance method,
- * and then release the instance when it is disposed.  This ensures that the QuickEditTabSectionsManager shared instance (per project) is released appropriately.
- * <p>
- * selectionChanged method must be called prior to calling createControls on the sections for this tab group call.
- */
-public class QuickEditTabManager {
-	private QuickEditTabSectionsManager _groupsManager;
-	private QuickEditTabSections _quickEditTabSections;
-	private Entity _tagEntity;
-	private QName _lastTagID;
-	private QuickEditTabSectionsDescriptor _lastQuickEditTabGroup;
-	private QuickEditTabSectionsDescriptor _nullQuickEditTabGroup;
-	private Element _lastElement;
-	
-	private QuickEditTabSectionsManager getRegistry() {
-		return _groupsManager;
-	}
-
-	/**
-	 * Must only be called once per tabbed property sheet as ref count is kept.  
-	 * Callers must call releaseInstance when the page is disposed
-	 * @param page 
-	 * @return instance for this property sheet
-	 */
-	public static synchronized QuickEditTabManager acquireInstance(WPETabbedPropertySheetPage page) {
-		IProject project = getProject(page);	
-		QuickEditTabManager instance = new QuickEditTabManager();
-		instance._groupsManager = QuickEditTabSectionsManager.acquireInstance(project);
-		return instance;		
-	}
-
-	/**
-	 * Releases this instance, but does not dispose.  Ensures that the {@link QuickEditTabSectionsManager} is released.
-	 */
-	public synchronized void releaseInstance() {
-		this._groupsManager.releaseInstance();			
-	}
-	
-	/**
-	 * Private constructor
-	 */
-	private QuickEditTabManager(){
-		//
-	}
-	
-	private static IProject getProject(WPETabbedPropertySheetPage page) {
-		IProject proj = null;
-		IDocument doc = ((HTMLEditor)page.getEditor()).getDocument();
-		IStructuredDocumentContext context = IStructuredDocumentContextFactory.INSTANCE.getContext(doc, 0);
-		if (context != null){
-			proj = IStructuredDocumentContextResolverFactory.INSTANCE.getWorkspaceContextResolver(context).getProject();
-		}
-		return proj;
-		 
-	}
-	/**
-	 * Must be called so that the sections for the input can be calculated. 
-	 * 
-	 * @param part
-	 * @param selection
-	 * @return true if current selection is different than during the last call
-	 */
-	public boolean selectionChanged(IWorkbenchPart part, ISelection selection) {
-		boolean hasChanged = false;
-		QuickEditTabSections qets = getQuickTabSectionsMetaData(part, selection); 
-		if (qets == null) {//use null quick edit tab			
-			hasChanged = (_quickEditTabSections != null);
-			_quickEditTabSections = qets;
-			_lastQuickEditTabGroup = getNullQuickEditTab();
-			_lastTagID = null;
-		}
-		else {
-			QName tagId = getTagId();
-			if (_lastTagID == null || !_lastTagID.equals(tagId)){
-				_quickEditTabSections = qets;
-				QuickEditTabSectionsDescriptor group = getRegistry().getQuickEditTabSectionsFor(tagId);
-				if (group == null){
-					group = createQuickEditTabGroup(tagId, _quickEditTabSections);
-					if (group != null){					
-						group.calculateSections();
-						getRegistry().addQuickEditTabGroupDescriptor(group);
-					}
-				}
-				_lastQuickEditTabGroup = group;
-				_lastTagID = tagId;
-			}
-		} 
-
-		return hasChanged;
-	}
-	
-	/**
-	 * @return current QuickEditTabSectionsDescriptor
-	 */
-	public QuickEditTabSectionsDescriptor getCurrentTabGroupDescriptor() {
-		return _lastQuickEditTabGroup;
-	}
-	
-	private QuickEditTabSections getQuickTabSectionsMetaData(IWorkbenchPart part,
-			ISelection selection) {
-
-		Element node = DesignerPropertyTool.getElement(part, selection);
-		if (node == null) {
-			return null;
-		}
-		if (_lastElement != node){
-			_lastElement = node;
-			_quickEditTabSections = null;
-			_tagEntity = getTagEntity(part, selection, node);
-			if (_tagEntity != null) {
-				Trait pds = TaglibDomainMetaDataQueryHelper.getTrait(_tagEntity, QuickEditTabSections.TRAIT_ID);
-				if (pds != null){
-					_quickEditTabSections = (QuickEditTabSections)pds.getValue();
-				}		
-			}			
-		}
-		return _quickEditTabSections;
-	}
-
-	private QuickEditTabSectionsDescriptor createQuickEditTabGroup(QName tagId,
-			QuickEditTabSections tabSections) {
-		return new QuickEditTabSectionsDescriptor(_tagEntity, tagId, tabSections);
-	}
-
-	private QName getTagId() {
-		return TaglibDomainMetaDataQueryHelper.getQNameForTagEntity(_tagEntity);
-	}
-
-	/**
-	 * Dispose
-	 */
-	public void dispose() {		
-		_lastQuickEditTabGroup= null;
-		_lastElement = null;
-		_lastTagID = null;		
-		_nullQuickEditTabGroup = null;
-		_quickEditTabSections = null;
-		_groupsManager = null;
-	}
-	
-	private Entity getTagEntity(IWorkbenchPart part, ISelection selection, Element node){
-		HTMLEditor ed = null;
-		if (part instanceof HTMLEditor)
-			ed = (HTMLEditor)part;
-		if (ed == null)
-			return null;
-		
-		if (ed.getEditorInput() instanceof FileEditorInput) {
-			FileEditorInput input = (FileEditorInput)ed.getEditorInput();
-			IStructuredDocumentContext context = IStructuredDocumentContextFactory.INSTANCE.getContext(ed.getDocument(), node);
-			if (context != null){
-				ITaglibContextResolver resolver = IStructuredDocumentContextResolverFactory.INSTANCE.getTaglibContextResolver(context);
-				if (resolver != null){
-					ITaglibDomainMetaDataModelContext mdContext = TaglibDomainMetaDataQueryHelper.createMetaDataModelContext(input.getFile().getProject(),resolver.getTagURIForNodeName(node));
-					return TaglibDomainMetaDataQueryHelper.getEntity(mdContext, node.getLocalName());
-				}
-			}
-		}
-		return null;		
-	}
-	
-	private QuickEditTabSectionsDescriptor getNullQuickEditTab() {
-		if (_nullQuickEditTabGroup == null) {
-			_nullQuickEditTabGroup = new NullQuickEditTabGroupDescriptor();
-			_nullQuickEditTabGroup.calculateSections();
-		}
-		return _nullQuickEditTabGroup;
-	}
-
-	/**
-	 * NOT API - for JUnit testing only
-	 * @return {@link QuickEditTabSectionsManager} 
-	 */	
-	public QuickEditTabSectionsManager getQuickEditTabSectionsManager() {
-		return _groupsManager;
-	}
-
-	
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/QuickEditTabSection.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/QuickEditTabSection.java
deleted file mode 100644
index 172626c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/QuickEditTabSection.java
+++ /dev/null
@@ -1,209 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties.internal;
-
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.pagedesigner.properties.WPETabbedPropertySheetPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Layout;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.views.properties.tabbed.AbstractPropertySection;
-import org.eclipse.ui.views.properties.tabbed.ISection;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
-
-/**
- * Using the tag entity's QuickEditTabSections meta-data, this section reacts to changes in selection,
- * and will dynamically create a QuickEditTabGroup.   The QuickEditTabGroup is cached and reused.
- * <br><br>
- * This section delegates construction to the sections discovered thru meta data.   
- * Because this section is not disposed of until the tab is disposed, this section will enforce the expected section lifecycle
- * on the sections loaded from meta data.   This occurs during setInput.  But will pass on all section lifecycle events as 
- * this section receives them.
- * <br><br>
- * The lifecycle that this section enforces on it's child sections in the setInput call on this section are (in order):
- * 	<li>createControls
- * 	<li>setInput
- *  <li>aboutToBeShown
- *  <li>refresh
- *  
- * When tab section lifecycle events occur to this section, they are passed on to all child sections also. 
- * 	
- */
-public class QuickEditTabSection extends AbstractPropertySection {
-	
-	private QuickEditTabManager manager;
-	private Composite _composite;
-	private Composite _qeGroupComposite;
-	private WPETabbedPropertySheetPage _tabbedPropertySheetPage;
-
-	private QuickEditTabManager getTabManager() {
-		if (manager == null) {
-			manager = _tabbedPropertySheetPage.getTabManager();
-		}
-		return manager;
-	}
-
-	@Override
-	public void createControls(Composite parent,
-			TabbedPropertySheetPage tabbedPropertySheetPage) {
-		super.createControls(parent, tabbedPropertySheetPage);
-		_composite = parent;
-		_tabbedPropertySheetPage = (WPETabbedPropertySheetPage)tabbedPropertySheetPage;
-	}
-
-	@Override
-	public void setInput(IWorkbenchPart part, ISelection selection) {
-		super.setInput(part, selection);
-		if (getTabManager() != null){
-			aboutToBeHidden();
-			createOrResetQuickEditGroupComposite();//disposes of old and recreates new topComp
-			getTabManager().selectionChanged(part, selection);
-			for (ISection section : getSections()){
-				section.createControls(_qeGroupComposite, _tabbedPropertySheetPage);
-				section.setInput(part, selection);
-			}
-			_composite.getParent().layout(true, true);
-			
-			aboutToBeShown();
-			refresh();
-		}			
-	}
-
-	@Override
-	public void aboutToBeHidden() {
-		super.aboutToBeHidden();
-		for (ISection section : getSections()){
-			section.aboutToBeHidden();
-		}
-	}
-
-	@Override
-	public void aboutToBeShown() {
-		super.aboutToBeShown();
-		for (ISection section : getSections()){
-			section.aboutToBeShown();
-		}
-	}
-	
-	@Override
-	public void refresh() {
-		super.refresh();
-		for (ISection section : getSections()){
-			section.refresh();
-		}
-	}
-
-	private void createOrResetQuickEditGroupComposite() {
-		if (_qeGroupComposite != null && !_qeGroupComposite.isDisposed()){
-			//dispose of current sections
-			disposeCurrentQuickEditTabSections();
-			_qeGroupComposite.dispose();
-		}			
-		
-		_qeGroupComposite = _tabbedPropertySheetPage.getWidgetFactory().createComposite(_composite, SWT.NO_FOCUS);
-		QuickEditTabLayout layout = new QuickEditTabLayout();
-		_qeGroupComposite.setLayout(layout);
-		
-	}
-
-	private void disposeCurrentQuickEditTabSections() {		
-		for (ISection section : getSections()){
-			section.dispose();
-		}
-	}
-
-	private List<ISection> getSections(){
-		if (getTabManager().getCurrentTabGroupDescriptor() != null)
-			return getTabManager().getCurrentTabGroupDescriptor().getSections();
-		
-		return Collections.EMPTY_LIST;
-	}
-	
-	public void dispose() {
-		super.dispose();
-		disposeCurrentQuickEditTabSections();
-		manager.dispose();
-		manager = null;
-		_composite = null;
-		_qeGroupComposite = null;
-		_tabbedPropertySheetPage = null;
-	}	
-
-	public boolean shouldUseExtraSpace() {
-		return false;
-	}
-
-	private class QuickEditTabLayout extends Layout {
-
-		// allow for adjustments
-		private static final int MARGIN = 0;
-		private static final int SPACING = 0;
-
-		// cache
-		Point[] sizes;
-		int maxWidth, totalHeight;
-
-		protected Point computeSize(Composite composite, int wHint, int hHint,
-				boolean flushCache) {
-
-			Control children[] = composite.getChildren();
-			if (flushCache || sizes == null || sizes.length != children.length) {
-				initialize(children);
-			}
-
-			int width = wHint, height = hHint;
-			if (wHint == SWT.DEFAULT)
-				width = maxWidth;
-
-			if (hHint == SWT.DEFAULT)
-				height = totalHeight;
-
-			return new Point(width + 2 * MARGIN, height + 2 * MARGIN);
-		}
-
-		protected void layout(Composite composite, boolean flushCache) {
-			Control children[] = composite.getChildren();
-			if (flushCache || sizes == null || sizes.length != children.length) {
-				initialize(children);
-			}
-			Rectangle rect = composite.getClientArea();
-			int x = MARGIN, y = MARGIN;
-			int width = Math.max(rect.width - 2 * MARGIN, maxWidth);
-//			System.out.println("--- Comp id: "+composite.toString()+ "[#Children: "+ composite.getChildren().length +"] -------");
-			for (int i = 0; i < children.length; i++) {
-				int height = sizes[i].y;
-				children[i].setBounds(x, y, width, height);
-				y += height + SPACING;
-//				System.out.println("h="+height+", y="+y);
-			}
-		    composite.setRedraw(true);
-		}
-
-		void initialize(Control children[]) {
-			maxWidth = 0;
-			totalHeight = 0;
-			sizes = new Point[children.length];
-			for (int i = 0; i < children.length; i++) {
-				sizes[i] = children[i].computeSize(SWT.DEFAULT, SWT.DEFAULT, true);
-				maxWidth = Math.max(maxWidth, sizes[i].x);
-				totalHeight += sizes[i].y;
-			}
-			totalHeight += (children.length - 1) * SPACING;
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/QuickEditTabSectionDescriptor.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/QuickEditTabSectionDescriptor.java
deleted file mode 100644
index 18fddd4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/QuickEditTabSectionDescriptor.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties.internal;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.jsf.common.metadata.Entity;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.properties.DesignerPropertyTool;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.internal.views.properties.tabbed.view.SectionDescriptor;
-import org.eclipse.ui.views.properties.tabbed.ISection;
-import org.eclipse.ui.views.properties.tabbed.ITypeMapper;
-import org.w3c.dom.Element;
-
-/**
- * A SectionDescriptor from org.eclipse.ui.views.properties.tabbed.propertySections extension-point 
- * for use by the QuickEdit tab in the Web Page Editor.
- */
-public class QuickEditTabSectionDescriptor extends SectionDescriptor {
-
-	private static final String ATT_CLASS = "class"; //$NON-NLS-1$ 
-	private IConfigurationElement _configurationElement;
-	private Entity _tagEntity;
-
-	/**
-	 * Constructor for the section descriptor.
-	 * 
-	 * @param configurationElement
-	 *            the configuration element for the section descriptor.
-	 * @param typeMapper 
-	 */
-	public QuickEditTabSectionDescriptor(IConfigurationElement configurationElement, ITypeMapper typeMapper) {
-		super(configurationElement, typeMapper);
-		_configurationElement = configurationElement;
-	}
-
-	@Override
-	public boolean appliesTo(IWorkbenchPart part, ISelection selection) {
-		Element node = DesignerPropertyTool.getElement(part, selection);
-		if (node == null) {
-			return false;
-		}
-		return true;
-	}
-
-	@Override
-	public ISection getSectionClass() {
-		ISection section = null;
-		try {
-			Object secOrGroup = _configurationElement
-					.createExecutableExtension(ATT_CLASS);
-			if (secOrGroup instanceof ISection) {
-				section = (ISection) secOrGroup;
-			} else if (secOrGroup instanceof AttributeGroup) {
-				((AttributeGroup) secOrGroup).setTagEntity(_tagEntity);
-				section = new AttributeGroupSection((AttributeGroup) secOrGroup);		
-			}
-		} catch (CoreException exception) {
-			handleSectionError(exception);
-		}
-		return section;
-	}
-	
-	/**
-	 * Handle the section error when an issue is found loading from the
-	 * configuration element.
-	 * 
-	 * @param _configurationElement
-	 *            the configuration element
-	 * @param exception
-	 *            an optional CoreException
-	 */
-	private void handleSectionError(CoreException exception) {
-		PDPlugin.getLogger(QuickEditTabSectionDescriptor.class).error("error", //$NON-NLS-1$
-				exception);
-		exception.printStackTrace();
-	}
-
-	/**
-	 * @param tagEntity
-	 * @return ISection for the tagEntity
-	 */
-	/*package*/ ISection getSectionClass(Entity tagEntity) {
-		_tagEntity = tagEntity;
-		return getSectionClass();
-	}
-		
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/QuickEditTabSectionsDescriptor.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/QuickEditTabSectionsDescriptor.java
deleted file mode 100644
index afba392..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/QuickEditTabSectionsDescriptor.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties.internal;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.xml.namespace.QName;
-
-import org.eclipse.jst.jsf.common.metadata.Entity;
-import org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.QuickEditTabSections;
-import org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.SECTION_TYPE;
-import org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.SectionInfo;
-import org.eclipse.ui.views.properties.tabbed.ISection;
-
-/**
- * Represents all of the section classes that make up the Quick Edit tab for a given tag input.   
- * Uses QuickEditTabSections meta data from tag entity
- */
-public class QuickEditTabSectionsDescriptor {
-
-	private QuickEditTabSections _sections;
-	private QName _tagId;
-	private List<ISection> _sectionClasses;
-	private Entity _tagEntity;
-	private WPETabPropertySectionDescriptorProvider sectionProvider;
-
-	/**
-	 * Constructor
-	 * @param tagEntity
-	 * @param tagId
-	 * @param sections
-	 */
-	public QuickEditTabSectionsDescriptor (Entity tagEntity, QName tagId, QuickEditTabSections sections) {
-		_tagEntity = tagEntity;
-		_tagId = tagId;
-		_sections = sections;
-	}	
-
-	/*package*/ QuickEditTabSectionsDescriptor () {
-		_tagEntity = null;
-		_tagId = null;
-		_sections = null;
-	}
-	
-	/**
-	 * Determines section classes for the group from the available meta data
-	 */
-	public void calculateSections() {
-		if (_sectionClasses == null || _sectionClasses.isEmpty()) {
-			_sectionClasses = new ArrayList();
-			List<String> attrIds = new ArrayList();
-			for (SectionInfo secInfo : _sections.getSections()) {
-				if (secInfo.getType() == SECTION_TYPE.ATTRIBUTE){
-					//collect attrSecs and process as a group so that layout will be best
-					if (secInfo.getId() != null) 
-						attrIds.add(secInfo.getId());
-				}
-				else if (secInfo.getType() == SECTION_TYPE.SECTION) {
-					//if there are any attribute sections not processed, do that now
-					if (attrIds.size() > 0){
-						createAttributeGroup(attrIds);
-						attrIds = new ArrayList();
-					}
-					createSectionGroup(secInfo);
-				}
-			}
-			if (attrIds.size() > 0){
-				createAttributeGroup(attrIds);
-			}
-		}		
-	}
-
-	private void createSectionGroup(SectionInfo secInfo) {
-		QuickEditTabSectionDescriptor sd = getSectionProvider().getNamedSectionDescriptor(secInfo.getId());
-		if (sd != null) {
-			ISection section = sd.getSectionClass(_tagEntity);
-			if (section != null){
-				_sectionClasses.add(section);
-			}
-		}
-		
-	}
-
-	private void createAttributeGroup(List<String> attrNames) {
-		ISection section = new AttributeGroupSection(_tagEntity, attrNames);
-		if (section != null){		
-			_sectionClasses.add(section);
-		}
-	}
-
-	/**
-	 * @return QName of tag that this tab descriptor is for
-	 */
-	public QName getTagId() {
-		return _tagId;
-	}
-
-	/**
-	 * @return List of current ISection classes set after calculateSections() has been called
-	 */
-	public List<ISection> getSections() {
-		return _sectionClasses;
-	}
-
-	private WPETabPropertySectionDescriptorProvider getSectionProvider() {
-		if (sectionProvider == null){
-			sectionProvider = new WPETabPropertySectionDescriptorProvider();
-		}
-		return sectionProvider;
-	}
-	
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/QuickEditTabSectionsManager.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/QuickEditTabSectionsManager.java
deleted file mode 100644
index 17bbc45..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/QuickEditTabSectionsManager.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties.internal;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import javax.xml.namespace.QName;
-
-import org.eclipse.core.resources.IProject;
-
-/**
- * Cache of quickEditTabGroupDescriptors keyed by tagID as QName.  
- */
-public class QuickEditTabSectionsManager {
-	
-	private static QuickEditTabSectionsManagerMgr _mgrInstance = new QuickEditTabSectionsManagerMgr();
-	private Map<QName, QuickEditTabSectionsDescriptor> map = new HashMap<QName, QuickEditTabSectionsDescriptor>(5);
-	private IProject _project;
-	private int clientCount = 0;
-	
-	/**
-	 * Returns instance of QuickEditTabSectionsManager for the given project.   Caller must release the instance when caller is being disposed.
-	 * @param project
-	 * @return instance of QuickEditTabSectionsManager
-	 */
-	public static synchronized QuickEditTabSectionsManager acquireInstance(IProject project){
-		QuickEditTabSectionsManager instance = _mgrInstance.getSectionsManager(project);
-		instance.clientCount++;
-		return instance;	
-	}
-	
-	/**
-	 * Releases instance of QuickEditTabSectionsManager and removes from the QuickEditSectionGroupsManagerMgr if it is the last reference
-	 */
-	public synchronized void releaseInstance(){
-		int refCount = --clientCount;
-		if (refCount == 0){
-			_mgrInstance.removeSectionsManager(_project);
-		}	
-	}
-
-	/**
-	 * private constructor
-	 */
-	private QuickEditTabSectionsManager(){
-		//
-	}
-	
-	/**
-	 * @return IProject that this section manager applies to
-	 */
-	public IProject getProject(){
-		return _project;
-	}
-	
-	/**
-	 * Get QuickEditTabSectionsDescriptor for passed tag
-	 * 
-	 * @param tagId
-	 * @return QuickEditTabSectionsDescriptor
-	 */
-	public QuickEditTabSectionsDescriptor getQuickEditTabSectionsFor(QName tagId) {
-		return map.get(tagId);
-	}
-
-	/**
-	 * Adds QuickEditTabSectionsDescriptor to managed registry keyed by the tagId
-	 * QName
-	 * 
-	 * @param group
-	 */
-	public void addQuickEditTabGroupDescriptor(QuickEditTabSectionsDescriptor group) {
-		map.put(group.getTagId(), group);
-	}
-
-	/**
-	 * Removes and disposes a cached {@link QuickEditTabSectionsDescriptor}
-	 * 
-	 * @param tagId
-	 */
-	public void removeQuickEditTabGroup(QName tagId) {
-		QuickEditTabSectionsDescriptor grp = map.get(tagId);
-		if (grp != null) {
-			map.remove(tagId);
-		}
-	}
-
-	/**
-	 * Manages the QuickEditTabSectionsManager instances.  Ensures one per project.	 
-	 */
-	private static class QuickEditTabSectionsManagerMgr {		
-		private Map <IProject,QuickEditTabSectionsManager>_map = new HashMap<IProject,QuickEditTabSectionsManager>();
-		/**
-		 * @param project - may be null
-		 * @return QuickEditTabManager for project
-		 */
-		public QuickEditTabSectionsManager getSectionsManager(IProject project){
-			if (_map.containsKey(project))
-				return _map.get(project);
-
-			QuickEditTabSectionsManager instance = new QuickEditTabSectionsManager();
-			instance._project = project;
-			_map.put(project, instance);
-			return instance;
-		}
-		
-		/**
-		 * Removes QuickEditTabManager from mgr for given project
-		 * @param project
-		 */
-		public void removeSectionsManager(IProject project){
-			if (_map.containsKey(project))
-				_map.remove(project);
-		}
-		
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/WPETabDescriptorProvider.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/WPETabDescriptorProvider.java
deleted file mode 100644
index 5003d40..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/WPETabDescriptorProvider.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties.internal;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.views.properties.tabbed.ITabDescriptor;
-import org.eclipse.ui.views.properties.tabbed.ITabDescriptorProvider;
-
-/**
- * Class that provides the default tabs for the Web Page Editor
- */
-public class WPETabDescriptorProvider implements ITabDescriptorProvider {
-
-	private AttributesTabDescriptor _attributesTabDescriptor;
-	private QuickEditTabDescriptor _quickTabDescriptor;
-
-	/**
-	 * Constructor
-	 */
-	public WPETabDescriptorProvider() {
-		_quickTabDescriptor = new QuickEditTabDescriptor();
-		_attributesTabDescriptor = new AttributesTabDescriptor();
-	}
-	
-	/**
-	 * Provides a QuickTabDescriptor and the AttributesTabDescriptor
-	 */
-	public ITabDescriptor[] getTabDescriptors(IWorkbenchPart part,
-			ISelection selection) {
-
-		return new ITabDescriptor[]{_quickTabDescriptor, 
-									_attributesTabDescriptor};
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/WPETabPropertySectionDescriptorProvider.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/WPETabPropertySectionDescriptorProvider.java
deleted file mode 100644
index 4e2530d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/WPETabPropertySectionDescriptorProvider.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties.internal;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jst.pagedesigner.editors.HTMLEditor;
-import org.eclipse.ui.views.properties.tabbed.ISectionDescriptor;
-import org.eclipse.ui.views.properties.tabbed.ISectionDescriptorProvider;
-
-/**
- * Provides sections registered for the Web Page Editor whose contributor ID is,
- * "org.eclipse.jst.pagedesigner.tabPropertyContributor" using the
- * org.eclipse.ui.views.properties.tabbed.propertyTabs extension-points.  
- * 
- * The sections declared using the org.eclipse.ui.views.properties.tabbed.propertySections extension-point 
- * for the WPE will only be displayed by the Quick Edit tab is the selected tag has metadata to choose 
- * the section.  TypeMappers/filters, etc. are ignored by this sectionDescriptorProvider.
- * 
- * See jsf_html.xml in the org.eclipse.jst.jsf.standard.tagsupport plugin for examples on how to use.  
- */
-public class WPETabPropertySectionDescriptorProvider implements
-		ISectionDescriptorProvider {
-	
-	private static final String EXTPT_SECTIONS = "propertySections"; //$NON-NLS-1$
-	private static final String ELEMENT_SECTION = "propertySection"; //$NON-NLS-1$
-	private ISectionDescriptor[] _descriptors = null;
-
-	/**
-	 * Constructor
-	 */
-	public WPETabPropertySectionDescriptorProvider() {
-		super();
-	}
-
-	public ISectionDescriptor[] getSectionDescriptors() {
-		if (_descriptors == null) {
-			List result = new ArrayList();
-			List contributedSections = readSectionDescriptors();
-			result.addAll(contributedSections);
-
-//			if (1 == 0){ //disabled for now... do we want to allow other mechanisms to add sections?
-//				List providers = readAdditionalSectionDescriptorProviders();
-//				for (int i = 0, size = providers.size(); i < size; i++) {
-//					try {
-//						ISectionDescriptorProvider provider = (ISectionDescriptorProvider) providers
-//								.get(i);
-//						ISectionDescriptor[] sections = provider
-//								.getSectionDescriptors();
-//						if (sections != null) {
-//							result.addAll(Arrays.asList(sections));
-//						}
-//					} catch (Exception ex) {
-//						// ignore
-//						ex.printStackTrace();
-//					}
-//				}
-//			}
-			_descriptors = new ISectionDescriptor[result.size()];
-			result.toArray(_descriptors);
-		}
-		return _descriptors;
-	}
-
-	/**
-	 * @return registered section descriptors for the WPE QuickEdit tab
-	 */
-	protected List<QuickEditTabSectionDescriptor> readSectionDescriptors() {
-		List result = new ArrayList();
-			
-		IConfigurationElement[] extensions = getConfigurationElements(EXTPT_SECTIONS);
-		for (int i = 0; i < extensions.length; i++) {
-			IConfigurationElement extension = extensions[i];
-			if (extension.getAttribute("contributorId").equals(HTMLEditor.TABBED_PROPERTIES_CONTRIBUTOR_ID)){ //$NON-NLS-1$
-				IConfigurationElement[] sections = extension
-						.getChildren(ELEMENT_SECTION);
-				for (int j = 0; j < sections.length; j++) {
-					IConfigurationElement section = sections[j];
-					ISectionDescriptor descriptor = new QuickEditTabSectionDescriptor(
-							section, null);//ITypeMapper set to null
-					result.add(descriptor);
-				}
-			}
-		}
-		return result;
-	}
-
-	/**
-	 * @param extensionPointId
-	 * @return IConfigurationElement[] 
-	 */
-	private static IConfigurationElement[] getConfigurationElements(
-			String extensionPointId) {
-		IExtensionPoint extensionPoint = Platform.getExtensionRegistry()
-				.getExtensionPoint("org.eclipse.ui.views.properties.tabbed", extensionPointId); //$NON-NLS-1$
-		if (extensionPoint == null) {
-			return null;
-		}
-		return extensionPoint.getConfigurationElements();
-	}
-	
-	/**
-	 * @param name of section
-	 * @return {@link QuickEditTabSectionDescriptor} or null if not located
-	 */
-	public QuickEditTabSectionDescriptor getNamedSectionDescriptor(String name) {
-		for (int i=0;i<getSectionDescriptors().length;i++){
-			QuickEditTabSectionDescriptor sd = (QuickEditTabSectionDescriptor)getSectionDescriptors()[i];
-			if (name.equals(sd.getId()))
-				return sd;
-		}
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/messages.properties b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/messages.properties
deleted file mode 100644
index 57b015f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/messages.properties
+++ /dev/null
@@ -1,12 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-AttributesTabDescriptor_label=Attributes
-QuickEditTabDescriptor_label=Quick Edit
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/messages.properties b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/messages.properties
deleted file mode 100644
index b0d48c1..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/messages.properties
+++ /dev/null
@@ -1,11 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-ITabbedPropertiesConstants_other_category=Attributes
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/range/RangeUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/range/RangeUtil.java
deleted file mode 100644
index 1d85654..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/range/RangeUtil.java
+++ /dev/null
@@ -1,378 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.range;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.jst.pagedesigner.parts.DocumentEditPart;
-import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-
-/**
- * @author mengbo
- */
-public class RangeUtil {
-	/**
-	 * append the child after the reference node as next sibling.
-	 * 
-	 * @param child
-	 *            can't be null
-	 * @param reference
-	 *            can't be null
-	 * @return ??
-	 */
-    //TODO: dead
-//	private static Node appendAfter(Node child, Node reference) {
-//		Node next = reference.getNextSibling();
-//		if (next == null)
-//        {
-//			return reference.getParentNode().appendChild(child);
-//        }
-//        return reference.getParentNode().insertBefore(child, next);
-//	}
-
-	/**
-	 * @param child
-	 * @param reference
-	 * @return ??
-	 */
-    // TODO: dead
-//	private static Node insertBefore(Node child, Node reference) {
-//		return reference.getParentNode().insertBefore(child, reference);
-//	}
-
-	/**
-	 * Insert a node into the specified position. The node can be an element or
-	 * DocumentFragment.
-	 * 
-	 * @param node
-	 * @param position
-	 */
-	// TODO: dead
-//	private static Node insertElement(DesignPosition position, Element node) {
-//		EditPart containerEditPart = position.getContainerPart();
-//		int offset = position.getOffset();
-//
-//		if (containerEditPart instanceof TextEditPart) {
-//			TextEditPart textPart = (TextEditPart) containerEditPart;
-//			String textData = textPart.getTextData();
-//			Node textNode = (Node) textPart.getModel();
-//			if (offset == 0)
-//				return insertBefore(node, textNode);
-//			else if (offset == textData.length())
-//				return appendAfter(node, textNode);
-//			else {
-//				// inserting the element in the middle of text.
-//				String before = textData.substring(0, offset);
-//				String after = textData.substring(offset);
-//
-//				// XXX: don't know whether setNodeValue() will do all those
-//				// escape or not.
-//				textNode.setNodeValue(after);
-//				Node newnode = insertBefore(node, textNode);
-//
-//				// XXX: don't know whether createTextNode() will do all those
-//				// escape or not
-//				Text t = textNode.getOwnerDocument().createTextNode(before);
-//
-//				insertBefore(t, newnode);
-//				return newnode;
-//			}
-//		}
-//        return insertIntoEditPart(containerEditPart, node, offset);
-//	}
-
-	/**
-	 * @param containerEditPart
-	 * @param node
-	 * @param offset
-	 * @return
-	 */
-	// TODO: dead
-//	private static Node insertIntoEditPart(EditPart containerEditPart,
-//			Node node, int offset) {
-//		Node parent = (Node) containerEditPart.getModel();
-//		List childParts = containerEditPart.getChildren();
-//		if (offset >= childParts.size()) {
-//			// to the end of parent
-//			return parent.appendChild(node);
-//		}
-//        Node child = (Node) ((EditPart) childParts.get(offset)).getModel();
-//        return insertBefore(node, child);
-//	}
-
-	// TODO: dead
-//	private static TextPosition insertText(DesignPosition position, String data) {
-//		// TODO: never read EditPart containerEditPart = position.getContainerPart();
-//
-//		position = moveIntoText(position);
-//		int offset = position.getOffset();
-//
-//		if (position.getContainerPart() instanceof TextEditPart) {
-//			// it is guaranteeed that now the containing edit part is text node.
-//			TextEditPart textPart = (TextEditPart) position.getContainerPart();
-//			String textData = textPart.getTextData();
-//			String before = textData.substring(0, offset);
-//			String after = textData.substring(offset);
-//			if (data.startsWith(" ") && before.endsWith(" ")) {
-//				before = before.substring(0, before.length() - 1) + "&nbsp;";
-//			}
-//			if (after.startsWith(" ") && data.endsWith(" ")) {
-//				data = data.substring(0, data.length() - 1) + (char) 160;
-//			}
-//			String nextData = before + data + after;
-//			IDOMText text = (IDOMText) textPart.getModel();
-//			text.setData(nextData);
-//			return new TextPosition(text, offset + data.length());
-//		}
-//        // can't merge into a neighboring text node. So create a text node
-//        // of it's own
-//        EditPart part = position.getContainerPart();
-//        Node parent = (Node) part.getModel();
-//        Text text = parent.getOwnerDocument().createTextNode(data);
-//        insertIntoEditPart(part, text, offset);
-//        return new TextPosition((IDOMText) text, offset);
-//	}
-
-	/**
-	 * Try to make the position move into a text node.
-	 * 
-	 * @param position
-	 * @return
-	 */
-    // TODO: dead
-//	private static DesignPosition moveIntoText(DesignPosition position) {
-//		EditPart container = position.getContainerPart();
-//		if (container instanceof TextEditPart)
-//			return position;
-//		if (position.getOffset() > 0) {
-//			EditPart pre = (EditPart) container.getChildren().get(
-//					position.getOffset() - 1);
-//			if (pre instanceof TextEditPart) {
-//				return new DesignPosition(pre, ((TextEditPart) pre)
-//						.getTextData().length());
-//			}
-//		}
-//		if (position.getOffset() < container.getChildren().size()) {
-//			EditPart next = (EditPart) container.getChildren().get(
-//					position.getOffset());
-//			if (next instanceof TextEditPart) {
-//				return new DesignPosition(next, 0);
-//			}
-//		}
-//		return position;
-//	}
-
-	/**
-	 * try to move the position up to not inside a text. if the position is at 0
-	 * index or last index of a text node, then try to move it up.
-	 * 
-	 * @param position
-	 * @return
-	 */
-    // TODO: dead
-//	private static DesignPosition moveOutFromText(DesignPosition position) {
-//		EditPart container = position.getContainerPart();
-//		if (container instanceof TextEditPart) {
-//			int offset = position.getOffset();
-//			String text = ((TextEditPart) container).getTextData();
-//			if (offset == 0) {
-//				return new DesignPosition(container.getParent(), container
-//						.getParent().getChildren().indexOf(container));
-//			} else if (offset == text.length()) {
-//				return new DesignPosition(container.getParent(), container
-//						.getParent().getChildren().indexOf(container) + 1);
-//			}
-//		}
-//		return position;
-//	}
-
-//	private static void insertDocumentFragment(DesignPosition position,
-//			DocumentFragment fragment) {
-//		// FIXME: NOT DONE.
-//	}
-
-	/**
-	 * Test whether the range intersect with the part.
-	 * 
-	 * @param range
-	 * @param part
-	 * @return true if thereis an intersection
-	 */
-	public static boolean intersect(DesignRange range, EditPart part) {
-		if (range == null || !range.isValid())
-			return false;
-		range = normalize(range);
-		if (part instanceof DocumentEditPart)
-			return true;
-		EditPart parent = part.getParent();
-		int index = parent.getChildren().indexOf(part);
-		DesignPosition left = new DesignPosition(parent, index);
-		DesignPosition right = new DesignPosition(parent, index + 1);
-		int compare = compareDesignPosition(left, range.getEndPosition());
-		if (compare == 1 || compare == 0 || compare == Integer.MIN_VALUE)
-			return false;
-
-		compare = compareDesignPosition(right, range.getStartPosition());
-		if (compare == -1 || compare == 0 || compare == Integer.MIN_VALUE)
-			return false;
-
-		return true;
-	}
-
-	/**
-	 * make sure the start position is before end position. If the original
-	 * range is already normalized, then the original range will be returned
-	 * without constructing a new one.
-	 * 
-	 * @param range
-	 * @return the normalized range
-	 */
-	public static DesignRange normalize(DesignRange range) {
-		if (range == null || !range.isValid()) {
-			return range;
-		}
-		int result = compareDesignPosition(range.getStartPosition(), range
-				.getEndPosition());
-		if (result == 1)
-        {
-			return new DesignRange(range.getEndPosition(), range
-					.getStartPosition());
-        }
-        return range;
-	}
-
-	/**
-	 * 
-	 * @param p1
-	 * @param p2
-	 * @return 0 means equal. 1 Means p1 is after p2. -1 means p1 is before p2.
-	 *         Integer.MIN_VALUE means some error and can't compare.
-	 */
-	private static int compareDesignPosition(DesignPosition p1, DesignPosition p2) {
-		if (!p1.isValid() || !p2.isValid())
-			return Integer.MIN_VALUE;
-		if (p1.equals(p2))
-			return 0;
-		int offset1 = p1.getOffset();
-		int offset2 = p2.getOffset();
-		List a1 = getAncesters(p1.getContainerPart());
-		List a2 = getAncesters(p2.getContainerPart());
-		if (a1 == null || a2 == null)
-			return Integer.MIN_VALUE;
-		if (a1.get(0) != a2.get(0))
-			return Integer.MIN_VALUE; // not same DocumentEditPart
-		for (int i = 1;; i++) {
-			EditPart p1a = (EditPart) a1.get(i);
-			EditPart p2a = (EditPart) a2.get(i);
-			if (p1a == p2a) {
-				if (p1a != null)
-                {
-					continue; // same ancester
-                }
-                // both are null. just compare the offset.
-                return offset1 < offset2 ? -1
-                		: (offset1 == offset2 ? 0 : 1);
-			}
-			// p1a != p2a. now we can just compare p1a and p2a to decide the
-			// order.
-			if (p1a != null)
-				offset1 = p1a.getParent().getChildren().indexOf(p1a);
-			if (p2a != null)
-				offset2 = p2a.getParent().getChildren().indexOf(p2a);
-			if ((p1a == null && p2a == null) || (p1a != null && p2a != null)) {
-				return offset1 < offset2 ? -1 : (offset1 == offset2 ? 0 : 1);
-			} else if (p1a == null) {
-				return offset1 <= offset2 ? -1 : 1;
-			} else {
-				return offset1 >= offset2 ? 1 : -1;
-			}
-		}
-	}
-
-	/**
-	 * Get a list of ancester nodes starting from the DocumentEditPart till the
-	 * node.
-	 * 
-	 * @param part
-	 * @return
-	 */
-	private static List getAncesters(EditPart part) {
-		List list = new ArrayList();
-		while (part != null) {
-			list.add(part);
-			if (part instanceof DocumentEditPart)
-            {
-				break;
-            }
-			part = part.getParent();
-		}
-		if (part == null) {
-			// if part ==null, means we didn't find a DocumentEditPart,
-			// something must be wrong.
-			return null;
-		}
-		// reverse to make it starting from the docuemnteditpart node.
-		Collections.reverse(list);
-		list.add(null); // add an null terminator.
-		return list;
-	}
-
-	/**
-	 * find the smallest common ancester of two edit part.
-	 * 
-	 * @param part1
-	 * @param part2
-	 * @return
-	 */
-	private static EditPart findCommonAncester(EditPart part1, EditPart part2) {
-		if (part1 == part2) {
-			return part1;
-		}
-		List list1 = getAncesters(part1);
-		if (list1 == null)
-			return null;
-		List list2 = getAncesters(part2);
-		if (list2 == null)
-			return null;
-		if (list1.get(0) != list2.get(0))
-			return null;
-		EditPart common = (EditPart) list1.get(0);
-		for (int i = 1;; i++) {
-			EditPart p1 = (EditPart) list1.get(i);
-			EditPart p2 = (EditPart) list2.get(i);
-			if (p1 == null || p2 == null)
-				return common;
-			if (p1 != p2)
-				return common;
-			common = p1;
-		}
-
-	}
-
-	/**
-	 * @param range
-	 * @return the common ancestor
-	 */
-	public static EditPart findCommonAncestor(DesignRange range) {
-		if (!range.isValid()) {
-			return null;
-		}
-		DesignPosition startPosition = range.getStartPosition();
-		DesignPosition endPosition = range.getEndPosition();
-		return findCommonAncester(startPosition.getContainerPart(), endPosition
-				.getContainerPart());
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/requests/LocationModifierRequest.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/requests/LocationModifierRequest.java
deleted file mode 100644
index 176710b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/requests/LocationModifierRequest.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.requests;
-
-import org.eclipse.gef.requests.LocationRequest;
-
-/**
- * This is a LocationRequest plus keyboard modified support.
- * 
- * @author mengbo
- * @version 1.5
- */
-public class LocationModifierRequest extends LocationRequest {
-
-	private boolean _controlKeyDown;
-
-	/**
-	 * 
-	 */
-	public LocationModifierRequest() {
-		super();
-	}
-
-	/**
-	 * @param type
-	 */
-	public LocationModifierRequest(Object type) {
-		super(type);
-	}
-
-	/**
-	 * @return true if the control key was pressed
-	 */
-	public boolean isControlKeyPressed() {
-		return _controlKeyDown;
-	}
-
-	/**
-	 * @param b
-	 */
-	public void setControlKeyPressed(boolean b) {
-		this._controlKeyDown = b;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/requests/NodeCreationFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/requests/NodeCreationFactory.java
deleted file mode 100644
index 7c54de0..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/requests/NodeCreationFactory.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.requests;
-
-import java.util.Iterator;
-import java.util.Map;
-
-import org.eclipse.gef.requests.CreationFactory;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.editors.HTMLEditor;
-import org.eclipse.jst.pagedesigner.utils.JSPUtil;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- */
-public class NodeCreationFactory implements CreationFactory {
-	private final String _tagName;
-
-	private final String _uri;
-
-	private final String _suggestedPrefix;
-
-	private final Map _attributes;
-
-	/**
-	 * @param uri
-	 * @param tagname
-	 * @param suggestedPrefix
-	 * @param attributes
-	 */
-	public NodeCreationFactory(String uri, String tagname,
-			String suggestedPrefix, Map attributes) {
-		_tagName = tagname;
-		_uri = uri;
-		_suggestedPrefix = suggestedPrefix;
-		_attributes = attributes;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.requests.CreationFactory#getNewObject()
-	 */
-	public Object getNewObject() {
-		Document ownerdoc = getOwnerDocument();
-		if (ownerdoc == null)
-			return null;
-
-		Element ele = ownerdoc.createElement(_tagName);
-		if (ele instanceof IDOMNode) {
-			String prefix = getPrefix(_uri, ((IDOMDocument) ownerdoc)
-					.getModel(), _suggestedPrefix);
-			if (prefix != null) {
-				ele.setPrefix(prefix);
-			}
-		}
-		if (_attributes != null) {
-			for (Iterator iter = _attributes.keySet().iterator(); iter
-					.hasNext();) {
-				String key = (String) iter.next();
-				String value = (String) _attributes.get(key);
-				ele.setAttribute(key, value);
-			}
-		}
-		return ele;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.requests.CreationFactory#getObjectType()
-	 */
-	public Object getObjectType() {
-		return _tagName;
-	}
-
-	/**
-	 * XXX: need some better way for owner document. Maybe pass in from
-	 * constructor
-	 * 
-	 * @return the owner document
-	 */
-	protected Document getOwnerDocument() {
-		IWorkbenchWindow active = PlatformUI.getWorkbench()
-				.getActiveWorkbenchWindow();
-		if (active == null)
-			return null;
-		IWorkbenchPage page = active.getActivePage();
-		if (page == null)
-			return null;
-		IEditorPart editor = page.getActiveEditor();
-		if (editor instanceof HTMLEditor) {
-			return ((HTMLEditor) editor).getDOMDocument();
-		}
-        return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.requests.NodeCreationFactory#getPrefix(int)
-	 */
-	private String getPrefix(String uri, IDOMModel model, String suggested) {
-		if (ITLDConstants.URI_HTML.equals(uri)
-				|| ITLDConstants.URI_JSP.equals(uri))
-			return null;
-
-		// now handles custom tag lib
-		return JSPUtil.getOrCreatePrefix(model, uri, suggested);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/requests/PageDesignerRequestConstants.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/requests/PageDesignerRequestConstants.java
deleted file mode 100644
index cd5d105..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/requests/PageDesignerRequestConstants.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.requests;
-
-/**
- * Page designer constants
- *
- */
-public final class PageDesignerRequestConstants 
-{
-    /**
-     * sent to an edit part to request a selection drag tracker
-     */
-    public final static String REQ_SELECTION_TRACKER = "selection.tracker.request"; //$NON-NLS-1$
-    
-    private PageDesignerRequestConstants()
-    {
-        // no instantiation
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/ColumnHandle.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/ColumnHandle.java
deleted file mode 100644
index 97a1c1a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/ColumnHandle.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.tableedit;
-
-import org.eclipse.gef.GraphicalEditPart;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ColumnHandle extends TableSideItemHandle {
-
-	/**
-	 * @param owner
-	 * @param index
-	 */
-	public ColumnHandle(GraphicalEditPart owner, int index) {
-		super(owner, false, index);
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/ColumnResizeHandle.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/ColumnResizeHandle.java
deleted file mode 100644
index e6446a1..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/ColumnResizeHandle.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.tableedit;
-
-import org.eclipse.gef.GraphicalEditPart;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ColumnResizeHandle extends TableSideResizeHandle {
-	// 0 means before first column
-	int _columnIndex;
-
-	/**
-	 * @param owner 
-	 * @param index 
-	 * 
-	 */
-	public ColumnResizeHandle(GraphicalEditPart owner, int index) {
-		super(owner, false, index);
-		_columnIndex = index;
-	}
-
-	/**
-	 * @return the column index
-	 */
-	public int getColumnIndex() {
-		return _columnIndex;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/DeleteHeaderFooterAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/DeleteHeaderFooterAction.java
deleted file mode 100644
index 02a8e5c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/DeleteHeaderFooterAction.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.tableedit;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jface.action.Action;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class DeleteHeaderFooterAction extends Action {
-	private Command _command;
-
-	/**
-	 * @param text
-	 * @param editPart 
-	 * @param isHeader 
-	 */
-	public DeleteHeaderFooterAction(String text, EditPart editPart,
-			boolean isHeader) {
-		super(text);
-		DeleteHeaderFooterRequest req = new DeleteHeaderFooterRequest(text,
-				isHeader);
-		this._command = editPart.getCommand(req);
-		this.setEnabled(this._command != null && this._command.canExecute());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.action.Action#run()
-	 */
-	public void run() {
-		_command.execute();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/DeleteHeaderFooterRequest.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/DeleteHeaderFooterRequest.java
deleted file mode 100644
index ebd315d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/DeleteHeaderFooterRequest.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.tableedit;
-
-import org.eclipse.gef.Request;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class DeleteHeaderFooterRequest extends Request {
-	private boolean _isHeader;
-
-	/**
-	 * @param type
-	 * @param isHeader
-	 */
-	public DeleteHeaderFooterRequest(String type, boolean isHeader) {
-		super(type);
-		this._isHeader = isHeader;
-	}
-
-	/**
-	 * @return Returns the _isHeader.
-	 */
-	public boolean isHeader() {
-		return _isHeader;
-	}
-
-	/**
-	 * @param header
-	 *            The _isHeader to set.
-	 */
-	public void setHeader(boolean header) {
-		_isHeader = header;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/DeleteRowColumnAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/DeleteRowColumnAction.java
deleted file mode 100644
index 0f68bd1..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/DeleteRowColumnAction.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.tableedit;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jface.action.Action;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class DeleteRowColumnAction extends Action {
-	private Command _command;
-
-	/**
-	 * @param text
-	 * @param tablePart 
-	 * @param index 
-	 * @param isrow 
-	 */
-	public DeleteRowColumnAction(String text, EditPart tablePart, int index,
-			boolean isrow) {
-		super(text);
-
-		TableRowColumnDeleteRequest req = new TableRowColumnDeleteRequest(
-				isrow, index);
-		this._command = tablePart.getCommand(req);
-		this.setEnabled(this._command != null && this._command.canExecute());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.action.Action#run()
-	 */
-	public void run() {
-		_command.execute();
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/EmptyLocator.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/EmptyLocator.java
deleted file mode 100644
index d69fc73..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/EmptyLocator.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.tableedit;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.Locator;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class EmptyLocator implements Locator {
-	/**
-	 * 
-	 */
-	public EmptyLocator() {
-		super();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.Locator#relocate(org.eclipse.draw2d.IFigure)
-	 */
-	public void relocate(IFigure target) {
-        // do nothing; this is a noop locator
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/InsertHeaderFooterAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/InsertHeaderFooterAction.java
deleted file mode 100644
index 4009220..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/InsertHeaderFooterAction.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.tableedit;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jface.action.Action;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class InsertHeaderFooterAction extends Action {
-	private Command _command;
-
-	/**
-	 * @param text
-	 * @param editPart 
-	 * @param isHeader 
-	 */
-	public InsertHeaderFooterAction(String text, EditPart editPart,
-			boolean isHeader) {
-		super(text);
-
-		InsertHeaderFooterRequest req = new InsertHeaderFooterRequest(text,
-				isHeader);
-		this._command = editPart.getCommand(req);
-		this.setEnabled(this._command != null && this._command.canExecute());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.action.Action#run()
-	 */
-	public void run() {
-		_command.execute();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/InsertHeaderFooterRequest.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/InsertHeaderFooterRequest.java
deleted file mode 100644
index 845d48a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/InsertHeaderFooterRequest.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.tableedit;
-
-import org.eclipse.gef.Request;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class InsertHeaderFooterRequest extends Request {
-	private boolean _isHeader;
-
-	/**
-	 * @param type
-	 * @param isHeader
-	 */
-	public InsertHeaderFooterRequest(String type, boolean isHeader) {
-		super(type);
-		this._isHeader = isHeader;
-	}
-
-	/**
-	 * @return Returns the _isHeader.
-	 */
-	public boolean isHeader() {
-		return _isHeader;
-	}
-
-	/**
-	 * @param header
-	 *            The _isHeader to set.
-	 */
-	public void setHeader(boolean header) {
-		_isHeader = header;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/InsertRowColumnAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/InsertRowColumnAction.java
deleted file mode 100644
index 6eedf0a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/InsertRowColumnAction.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.tableedit;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jface.action.Action;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class InsertRowColumnAction extends Action {
-	private Command _command;
-
-	/**
-	 * @param text
-	 * @param tablePart 
-	 * @param index 
-	 * @param isrow 
-	 * @param isbefore 
-	 */
-	public InsertRowColumnAction(String text, EditPart tablePart, int index,
-			boolean isrow, boolean isbefore) {
-		super(text);
-
-		TableInsertRequest req = new TableInsertRequest(isrow, index, isbefore);
-		this._command = tablePart.getCommand(req);
-		this.setEnabled(this._command != null && this._command.canExecute());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.action.Action#run()
-	 */
-	public void run() {
-		_command.execute();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/MarqueeRectangleFigure.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/MarqueeRectangleFigure.java
deleted file mode 100644
index c65e771..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/MarqueeRectangleFigure.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.tableedit;
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.Figure;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * This class is copied from MarqueeSelectionTool, since it is private there.
- * 
- * @author mengbo
- * @version 1.5
- */
-class MarqueeRectangleFigure extends Figure {
-
-	private int offset = 0;
-
-	private boolean schedulePaint = true;
-
-	private static final int DELAY = 110; // animation delay in millisecond
-
-	/**
-	 * @see org.eclipse.draw2d.Figure#paintFigure(org.eclipse.draw2d.Graphics)
-	 */
-	protected void paintFigure(Graphics graphics) {
-		Rectangle bounds1 = getBounds().getCopy();
-		graphics.translate(getLocation());
-
-		graphics.setXORMode(true);
-		graphics.setForegroundColor(ColorConstants.white);
-		graphics.setBackgroundColor(ColorConstants.black);
-
-		graphics.setLineStyle(Graphics.LINE_DOT);
-
-		int[] points = new int[6];
-
-		points[0] = 0 + offset;
-		points[1] = 0;
-		points[2] = bounds1.width - 1;
-		points[3] = 0;
-		points[4] = bounds1.width - 1;
-		points[5] = bounds1.height - 1;
-
-		graphics.drawPolyline(points);
-
-		points[0] = 0;
-		points[1] = 0 + offset;
-		points[2] = 0;
-		points[3] = bounds1.height - 1;
-		points[4] = bounds1.width - 1;
-		points[5] = bounds1.height - 1;
-
-		graphics.drawPolyline(points);
-
-		graphics.translate(getLocation().getNegated());
-
-		if (schedulePaint) {
-			Display.getCurrent().timerExec(DELAY, new Runnable() {
-				public void run() {
-					offset++;
-					if (offset > 5)
-						offset = 0;
-
-					schedulePaint = true;
-					repaint();
-				}
-			});
-		}
-
-		schedulePaint = false;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/RowHandle.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/RowHandle.java
deleted file mode 100644
index 5ebd6d9..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/RowHandle.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.tableedit;
-
-import org.eclipse.gef.GraphicalEditPart;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class RowHandle extends TableSideItemHandle {
-
-	/**
-	 * @param owner
-	 * @param index
-	 */
-	public RowHandle(GraphicalEditPart owner, int index) {
-		super(owner, true, index);
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/RowResizeHandle.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/RowResizeHandle.java
deleted file mode 100644
index 8efbcc3..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/RowResizeHandle.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.tableedit;
-
-import org.eclipse.gef.GraphicalEditPart;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class RowResizeHandle extends TableSideResizeHandle {
-	// 0 means before first row
-	int _rowIndex;
-
-	/**
-	 * @param owner 
-	 * @param index 
-	 */
-	public RowResizeHandle(GraphicalEditPart owner, int index) {
-		super(owner, true, index);
-
-		_rowIndex = index;
-	}
-
-	/**
-	 * @return the row index
-	 */
-	public int getRowIndex() {
-		return _rowIndex;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableColumnHandle.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableColumnHandle.java
deleted file mode 100644
index 466159b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableColumnHandle.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.tableedit;
-
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.jst.pagedesigner.editpolicies.ITableEditAdapter;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TableColumnHandle extends TableSideHandle {
-	/**
-	 * @param tableHost
-	 */
-	public TableColumnHandle(GraphicalEditPart tableHost) {
-		super(tableHost, new TableColumnHandleLocator(tableHost));
-	}
-
-	/**
-	 * 
-	 * 
-	 */
-	public void setupColumns() {
-		ITableEditAdapter tableAdapter = getTableEditAdapter();
-		if (tableAdapter == null) {
-			return;
-		}
-		int numColumns = tableAdapter.getColumnCount();
-		for (int i = 0; i < numColumns; i++) {
-			ColumnHandle columnHandle = createColumnHandle(i);
-			add(columnHandle);
-			ColumnResizeHandle columnResizeHandle = createColumnResizeHandle(i);
-			add(columnResizeHandle);
-		}
-		ColumnResizeHandle lastResize = createColumnResizeHandle(numColumns);
-		add(lastResize);
-	}
-
-	/**
-	 * @param numColumns
-	 * @return
-	 */
-	private ColumnResizeHandle createColumnResizeHandle(int numColumns) {
-		return new ColumnResizeHandle(getOwner(), numColumns);
-	}
-
-	/**
-	 * @param i
-	 * @return
-	 */
-	private ColumnHandle createColumnHandle(int i) {
-		return new ColumnHandle(getOwner(), i);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableColumnHandleLocator.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableColumnHandleLocator.java
deleted file mode 100644
index 37bb7e2..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableColumnHandleLocator.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.tableedit;
-
-import java.util.List;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.geometry.Insets;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.handles.HandleBounds;
-import org.eclipse.gef.handles.MoveHandleLocator;
-import org.eclipse.jst.pagedesigner.editpolicies.ITableEditAdapter;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TableColumnHandleLocator extends MoveHandleLocator {
-
-	GraphicalEditPart _tablePart;
-
-	/**
-	 * @param tablePart 
-	 */
-	public TableColumnHandleLocator(GraphicalEditPart tablePart) {
-		super(tablePart.getFigure());
-		_tablePart = tablePart;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.handles.MoveHandleLocator#relocate(org.eclipse.draw2d.IFigure)
-	 */
-	public void relocate(IFigure target) {
-		Rectangle bounds;
-		if (getReference() instanceof HandleBounds) {
-			bounds = ((HandleBounds) getReference()).getHandleBounds();
-		} else {
-			bounds = getReference().getBounds();
-		}
-		Insets referenceInsets = getReference().getInsets();
-
-		Rectangle r = new Rectangle(bounds.x + referenceInsets.left, bounds.y
-				+ bounds.height, bounds.width - referenceInsets.getWidth(),
-				TableEditConst.HEIGHT);
-
-		getReference().translateToAbsolute(r);
-		target.translateToRelative(r);
-
-		target.setBounds(r);
-		relocateChildren(target, getReference());
-	}
-
-	/**
-	 * @param target
-	 * @param reference
-	 */
-	private void relocateChildren(IFigure target, IFigure reference) {
-		// As user may removed columns/rows, so need to recalculate columns.
-		TableColumnHandle tableColumnHandle = (TableColumnHandle) target;
-		tableColumnHandle.removeAll();
-		tableColumnHandle.setupColumns();
-
-		// ---------------------------
-		List children = target.getChildren();
-
-		ITableEditAdapter tableAdapter = TableEditHelper
-				.getTableEditAdapter(this._tablePart);
-		if (tableAdapter == null) {
-			// XXX: what should we do if we found it is no longer table?
-			// here just skip
-			return;
-		}
-		for (int i = 0, size = children.size(); i < size; i++) {
-			Rectangle rect = null;
-			IFigure child = (IFigure) children.get(i);
-			if (child instanceof ColumnHandle) {
-				ColumnHandle columnHandle = (ColumnHandle) child;
-				int columnIndex = columnHandle.getIndex();
-				rect = new Rectangle(tableAdapter.getColumnStart(columnIndex),
-						0, tableAdapter.getColumnWidth(columnIndex),
-						TableEditConst.HEIGHT);
-			} else if (child instanceof ColumnResizeHandle) {
-				ColumnResizeHandle resizeHandle = (ColumnResizeHandle) child;
-				int columnIndex = resizeHandle.getColumnIndex();
-				rect = new Rectangle(tableAdapter
-						.getColumnResizeStart(columnIndex), 0, tableAdapter
-						.getColumnResizeWidth(), TableEditConst.HEIGHT);
-			} else {
-				// should not happen.
-			}
-			if (rect != null) {
-				child.setBounds(rect);
-			}
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableEditAdapter.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableEditAdapter.java
deleted file mode 100644
index 6689636..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableEditAdapter.java
+++ /dev/null
@@ -1,158 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.tableedit;
-
-import org.eclipse.jst.pagedesigner.css2.layout.table.CSSTableLayout2;
-import org.eclipse.jst.pagedesigner.editpolicies.ITableEditAdapter;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TableEditAdapter implements ITableEditAdapter {
-	CSSTableLayout2 _tableLayout;
-
-	/**
-	 * @param layout2
-	 */
-	public TableEditAdapter(CSSTableLayout2 layout2) {
-		this._tableLayout = layout2;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.editpolicies.ITableEditAdapter#getColumnCount()
-	 */
-	public int getColumnCount() {
-		return _tableLayout.getColumnWidths().length;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.editpolicies.ITableEditAdapter#getRowCount()
-	 */
-	public int getRowCount() {
-		return _tableLayout.getRowHeights().length;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.editpolicies.ITableEditAdapter#insertColumn(int)
-	 */
-	public void insertColumn(int atPosition) {
-	    // do nothing
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.editpolicies.ITableEditAdapter#insertRow(int)
-	 */
-	public void insertRow(int rowPosition) {
-		// TODO Auto-generated method stub
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.editpolicies.ITableEditAdapter#getResizeStart(int)
-	 */
-	public int getColumnResizeStart(int columnIndex) {
-		int w = 0;
-		int[] columnWidths = _tableLayout.getColumnWidths();
-		for (int i = 0; i < columnIndex; i++) {
-			w += columnWidths[i];
-		}
-		w += columnIndex * _tableLayout.getHSpacing();
-		return w;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.editpolicies.ITableEditAdapter#getResizeWidth()
-	 */
-	public int getColumnResizeWidth() {
-		return _tableLayout.getHSpacing();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.editpolicies.ITableEditAdapter#getColumnStart(int)
-	 */
-	public int getColumnStart(int columnIndex) {
-		return getColumnResizeStart(columnIndex) + _tableLayout.getHSpacing();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.editpolicies.ITableEditAdapter#getColumnWidth(int)
-	 */
-	public int getColumnWidth(int columnIndex) {
-		return _tableLayout.getColumnWidths()[columnIndex];
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.editpolicies.ITableEditAdapter#getRowStart(int)
-	 */
-	public int getRowStart(int rowIndex) {
-		int start = getRowResizeStart(rowIndex) + _tableLayout.getVSpacing();
-		if (_tableLayout.getCaptionInfo() != null
-				&& "top".equalsIgnoreCase(_tableLayout.getCaptionInfo().getAlign())) //$NON-NLS-1$
-		{
-			start += _tableLayout.getCaptionSize().height;
-		}
-		return start;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.editpolicies.ITableEditAdapter#getRowHeight(int)
-	 */
-	public int getRowHeight(int rowIndex) {
-		return _tableLayout.getRowHeights()[rowIndex];
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.editpolicies.ITableEditAdapter#getRowResizeStart(int)
-	 */
-	public int getRowResizeStart(int rowIndex) {
-		int w = 0;
-		int[] rowHeights = _tableLayout.getRowHeights();
-		for (int i = 0; i < rowIndex; i++) {
-			w += rowHeights[i];
-		}
-		w += rowIndex * _tableLayout.getHSpacing();
-		return w;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.editpolicies.ITableEditAdapter#getRowResizeWidth()
-	 */
-	public int getRowResizeWidth() {
-		return _tableLayout.getVSpacing();
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableEditConst.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableEditConst.java
deleted file mode 100644
index 40b1dee..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableEditConst.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.tableedit;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-/*package*/ interface TableEditConst {
-	/**
-	 * height constant
-	 */
-	public static final int HEIGHT = 10;
-
-	/**
-	 * width constant
-	 */
-	public static final int WIDTH = 10;
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableEditHelper.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableEditHelper.java
deleted file mode 100644
index 5614d81..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableEditHelper.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.tableedit;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.LayoutManager;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.jst.pagedesigner.css2.layout.table.CSSTableLayout2;
-import org.eclipse.jst.pagedesigner.editpolicies.ITableEditAdapter;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TableEditHelper {
-	/**
-	 * This method will return null if the editpart is not a table.
-	 * 
-	 * @param tablePart
-	 * @return the adapter
-	 */
-	public static ITableEditAdapter getTableEditAdapter(
-			GraphicalEditPart tablePart) {
-		IFigure figure = tablePart.getFigure();
-		LayoutManager layout = figure.getLayoutManager();
-		if (layout instanceof CSSTableLayout2) {
-			return new TableEditAdapter((CSSTableLayout2) layout);
-		}
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableHandleKit.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableHandleKit.java
deleted file mode 100644
index c8082e5..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableHandleKit.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.tableedit;
-
-import java.util.List;
-
-import org.eclipse.gef.GraphicalEditPart;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TableHandleKit {
-
-	/**
-	 * @param tableHost
-	 * @param handles
-	 */
-	public static void addHandles(GraphicalEditPart tableHost, List handles) {
-		addColumnHandles(tableHost, handles);
-		addRowHandles(tableHost, handles);
-	}
-
-	/**
-	 * @param tableHost
-	 * @param handles
-	 */
-	private static void addColumnHandles(GraphicalEditPart tableHost,
-			List handles) {
-		TableColumnHandle handle = new TableColumnHandle(tableHost);
-		handles.add(handle);
-
-	}
-
-	/**
-	 * @param tableHost
-	 * @param handles
-	 */
-	private static void addRowHandles(GraphicalEditPart tableHost, List handles) {
-		TableRowHandle handle = new TableRowHandle(tableHost);
-		handles.add(handle);
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableInsertRequest.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableInsertRequest.java
deleted file mode 100644
index 7ad13d9..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableInsertRequest.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.tableedit;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TableInsertRequest extends TableRowColumnRequest {
-	/**
-	 * 
-	 */
-	private static final String TABLE_INSERT_REQUEST = "Table Insert"; //$NON-NLS-1$
-
-	boolean _before;
-
-	/**
-	 * @param row 
-	 * @param index 
-	 * @param before 
-	 * 
-	 */
-	public TableInsertRequest(boolean row, int index, boolean before) {
-		super(TABLE_INSERT_REQUEST, row, index);
-		this._before = before;
-	}
-
-	/**
-	 * @return true if is before
-	 */
-	public boolean isBefore() {
-		return _before;
-	}
-
-	/**
-	 * @param before
-	 */
-	public void setBefore(boolean before) {
-		this._before = before;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableResizableEditPolicy.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableResizableEditPolicy.java
deleted file mode 100644
index 87619c2..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableResizableEditPolicy.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.tableedit;
-
-import java.util.List;
-
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.jst.pagedesigner.editpolicies.ElementResizableEditPolicy;
-import org.eclipse.jst.pagedesigner.editpolicies.ITableEditAdapter;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TableResizableEditPolicy extends ElementResizableEditPolicy {
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editpolicies.ResizableEditPolicy#createSelectionHandles()
-	 */
-	protected List createSelectionHandles() {
-		List list = super.createSelectionHandles();
-
-		// CR402770-1. Add a check whether it is table. If is not, will not
-		// create the handles. Thus, the handles could assume
-		// TableEditHelper.getTableEditAdatper()
-		// will always return non null.
-		ITableEditAdapter adapter = TableEditHelper
-				.getTableEditAdapter((GraphicalEditPart) getHost());
-		if (adapter != null) {
-			TableHandleKit.addHandles((GraphicalEditPart) getHost(), list);
-		}
-		return list;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableResizeRequest.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableResizeRequest.java
deleted file mode 100644
index f776ba8..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableResizeRequest.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.tableedit;
-
-import org.eclipse.gef.Request;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TableResizeRequest extends Request {
-	private static final String TABLE_RESIZE_REQ = "Table Resize"; //$NON-NLS-1$
-
-	private boolean _row;
-
-	private int _index;
-
-	private int _delta;
-
-	/**
-	 * @param isrow 
-	 * @param index 
-	 */
-	public TableResizeRequest(boolean isrow, int index) {
-		super(TABLE_RESIZE_REQ);
-		this._row = isrow;
-		this._index = index;
-	}
-
-	/**
-	 * @return the index
-	 */
-	public int getIndex() {
-		return _index;
-	}
-
-	/**
-	 * @param index
-	 */
-	public void setIndex(int index) {
-		this._index = index;
-	}
-
-	/**
-	 * @return true if is row
-	 */
-	public boolean isRow() {
-		return _row;
-	}
-
-	/**
-	 * @param row
-	 */
-	public void setRow(boolean row) {
-		this._row = row;
-	}
-
-	/**
-	 * @return the delta
-	 */
-	public int getDelta() {
-		return _delta;
-	}
-
-	/**
-	 * @param delta
-	 */
-	public void setDelta(int delta) {
-		this._delta = delta;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableRowColumnDeleteRequest.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableRowColumnDeleteRequest.java
deleted file mode 100644
index 8688e87..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableRowColumnDeleteRequest.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.tableedit;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TableRowColumnDeleteRequest extends TableRowColumnRequest {
-	private static final String TABLE_ROWCOLUMN_DELETE = "Table RowColumn Delete"; //$NON-NLS-1$
-
-	/**
-	 * @param row
-	 * @param index
-	 */
-	public TableRowColumnDeleteRequest(boolean row, int index) {
-		super(TABLE_ROWCOLUMN_DELETE, row, index);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableRowColumnRequest.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableRowColumnRequest.java
deleted file mode 100644
index b7bc8cd..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableRowColumnRequest.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.tableedit;
-
-import org.eclipse.gef.Request;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TableRowColumnRequest extends Request {
-	int _index;
-
-	boolean _row;
-
-	/**
-	 * @param type
-	 * @param row 
-	 * @param index 
-	 */
-	public TableRowColumnRequest(Object type, boolean row, int index) {
-		super(type);
-		this._row = row;
-		this._index = index;
-	}
-
-	/**
-	 * @return the index
-	 */
-	public int getIndex() {
-		return _index;
-	}
-
-	/**
-	 * @param index
-	 */
-	public void setIndex(int index) {
-		this._index = index;
-	}
-
-	/**
-	 * @return true if is row
-	 */
-	public boolean isRow() {
-		return _row;
-	}
-
-	/**
-	 * @param row
-	 */
-	public void setRow(boolean row) {
-		this._row = row;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableRowHandle.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableRowHandle.java
deleted file mode 100644
index daca6e4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableRowHandle.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.tableedit;
-
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.jst.pagedesigner.editpolicies.ITableEditAdapter;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TableRowHandle extends TableSideHandle {
-	/**
-	 * @param tableHost
-	 */
-	public TableRowHandle(GraphicalEditPart tableHost) {
-		super(tableHost, new TableRowHandleLocator(tableHost));
-		// setupRows();
-	}
-
-	/**
-	 * 
-	 * 
-	 */
-	public void setupRows() {
-		ITableEditAdapter tableAdapter = getTableEditAdapter();
-		if (tableAdapter == null) {
-			return;
-		}
-		int numRows = tableAdapter.getRowCount();
-		for (int i = 0; i < numRows; i++) {
-			RowHandle rowHandle = createRowHandle(i);
-			add(rowHandle);
-			RowResizeHandle rowResizeHandle = createRowResizeHandle(i);
-			add(rowResizeHandle);
-		}
-		RowResizeHandle lastResize = createRowResizeHandle(numRows);
-		add(lastResize);
-	}
-
-	/**
-	 * @param rowIndex
-	 * @return
-	 */
-	private RowResizeHandle createRowResizeHandle(int rowIndex) {
-		return new RowResizeHandle(getOwner(), rowIndex);
-	}
-
-	/**
-	 * @param rowIndex
-	 * @return
-	 */
-	private RowHandle createRowHandle(int rowIndex) {
-		return new RowHandle(getOwner(), rowIndex);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableRowHandleLocator.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableRowHandleLocator.java
deleted file mode 100644
index 54ed350..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableRowHandleLocator.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.tableedit;
-
-import java.util.List;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.geometry.Insets;
-import org.eclipse.draw2d.geometry.PrecisionRectangle;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.handles.HandleBounds;
-import org.eclipse.gef.handles.MoveHandleLocator;
-import org.eclipse.jst.pagedesigner.editpolicies.ITableEditAdapter;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TableRowHandleLocator extends MoveHandleLocator {
-
-	GraphicalEditPart _tablePart;
-
-	/**
-	 * @param tablePart
-	 */
-	public TableRowHandleLocator(GraphicalEditPart tablePart) {
-		super(tablePart.getFigure());
-		_tablePart = tablePart;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.handles.MoveHandleLocator#relocate(org.eclipse.draw2d.IFigure)
-	 */
-	public void relocate(IFigure target) {
-		Rectangle bounds;
-		if (getReference() instanceof HandleBounds) {
-			bounds = ((HandleBounds) getReference()).getHandleBounds();
-		} else {
-			bounds = getReference().getBounds();
-		}
-		// bounds = new PrecisionRectangle(bounds.getResized(-1, -1));
-		Insets referenceInsets = getReference().getInsets();
-
-		Rectangle r = new Rectangle(bounds.x + bounds.width, bounds.y
-				+ referenceInsets.top, TableEditConst.WIDTH, bounds.height
-				- referenceInsets.getHeight());
-		bounds = new PrecisionRectangle(r);
-
-		getReference().translateToAbsolute(bounds);
-		target.translateToRelative(bounds);
-
-		target.setBounds(bounds);
-		relocateChildren(target, getReference());
-	}
-
-	/**
-	 * @param target
-	 * @param reference
-	 */
-	private void relocateChildren(IFigure target, IFigure reference) {
-		// As user may removed columns/rows, so need to recalculate columns.
-		TableRowHandle tableRowHandle = (TableRowHandle) target;
-		tableRowHandle.removeAll();
-		tableRowHandle.setupRows();
-		List children = target.getChildren();
-
-		ITableEditAdapter tableAdapter = TableEditHelper
-				.getTableEditAdapter(this._tablePart);
-		if (tableAdapter == null) {
-			return;
-		}
-		for (int i = 0, size = children.size(); i < size; i++) {
-			Rectangle rect = null;
-			IFigure child = (IFigure) children.get(i);
-			if (child instanceof RowHandle) {
-				RowHandle rowHandle = (RowHandle) child;
-				int rowIndex = rowHandle.getIndex();
-				rect = new Rectangle(0, tableAdapter.getRowStart(rowIndex),
-						TableEditConst.WIDTH, tableAdapter
-								.getRowHeight(rowIndex));
-			} else if (child instanceof RowResizeHandle) {
-				RowResizeHandle resizeHandle = (RowResizeHandle) child;
-				int rowIndex = resizeHandle.getRowIndex();
-				rect = new Rectangle(0, tableAdapter
-						.getRowResizeStart(rowIndex), TableEditConst.WIDTH,
-						tableAdapter.getRowResizeWidth());
-			} else {
-				// should not happen.
-			}
-			if (rect != null) {
-				child.setBounds(rect);
-			}
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableSideHandle.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableSideHandle.java
deleted file mode 100644
index 753ad40..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableSideHandle.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.tableedit;
-
-import org.eclipse.draw2d.Locator;
-import org.eclipse.gef.DragTracker;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.handles.AbstractHandle;
-import org.eclipse.jst.pagedesigner.editpolicies.ITableEditAdapter;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TableSideHandle extends AbstractHandle {
-	/**
-	 * @param owner
-	 * @param loc
-	 */
-	public TableSideHandle(GraphicalEditPart owner, Locator loc) {
-		super(owner, loc);
-		// TODO Auto-generated constructor stub
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.handles.AbstractHandle#createDragTracker()
-	 */
-	protected DragTracker createDragTracker() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	/**
-	 * @return the edit part
-	 */
-	public GraphicalEditPart getTableEditPart() {
-		return this.getOwner();
-	}
-
-	/**
-	 * @return the adapter
-	 */
-	public ITableEditAdapter getTableEditAdapter() {
-		return TableEditHelper.getTableEditAdapter(getOwner());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.Figure#useLocalCoordinates()
-	 */
-	protected boolean useLocalCoordinates() {
-		return true;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableSideItemDragTracker.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableSideItemDragTracker.java
deleted file mode 100644
index efedef5..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableSideItemDragTracker.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.tableedit;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.tools.DragEditPartsTracker;
-
-/**
- * This is the tracker for the TableSideItem. It will be responsible to track
- * the right mouse down event and popup a menu.
- * 
- * @author mengbo
- * @version 1.5
- */
-public class TableSideItemDragTracker extends DragEditPartsTracker {
-    // TODO: dead?
-    //	private boolean _isRow;
-//
-//	private int _index;
-
-	/**
-	 * 
-	 * @param sourceEditPart
-	 * @param isrow
-	 * @param index
-	 */
-	public TableSideItemDragTracker(EditPart sourceEditPart, boolean isrow,
-			int index) {
-		super(sourceEditPart);
-        // TODO: dead?
-//		this._isRow = isrow;
-//		this._index = index;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.tools.DragEditPartsTracker#handleButtonUp(int)
-	 */
-	protected boolean handleButtonUp(int button) {
-		boolean result = super.handleButtonUp(button);
-		//
-		// if (button == 3)
-		// {
-		// MenuManager m = new MenuManager();
-		// if (_isRow)
-		// {
-		// m.add(new InsertRowColumnAction("Insert row before",
-		// getSourceEditPart(), _index, _isRow, true));
-		// m.add(new InsertRowColumnAction("Insert row after",
-		// getSourceEditPart(), _index, _isRow, false));
-		// m.add(new DeleteRowColumnAction("Delete row", getSourceEditPart(),
-		// _index, _isRow));
-		// }
-		// else
-		// {
-		// m.add(new InsertRowColumnAction("Insert column before",
-		// getSourceEditPart(), _index, _isRow, true));
-		// m.add(new InsertRowColumnAction("Insert column after",
-		// getSourceEditPart(), _index, _isRow, false));
-		// m.add(new DeleteRowColumnAction("Delete column", getSourceEditPart(),
-		// _index, _isRow));
-		// }
-		// m.createContextMenu(this.getCurrentViewer().getControl()).setVisible(true);
-		// }
-		return result;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableSideItemHandle.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableSideItemHandle.java
deleted file mode 100644
index 9b833ab..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableSideItemHandle.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.tableedit;
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.Cursors;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.LineBorder;
-import org.eclipse.gef.DragTracker;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.handles.AbstractHandle;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public abstract class TableSideItemHandle extends AbstractHandle {
-	private boolean _isRow;
-
-	private int _index;
-
-	/**
-	 * @param owner 
-	 * @param isRow 
-	 * @param index 
-	 * 
-	 */
-	public TableSideItemHandle(GraphicalEditPart owner, boolean isRow, int index) {
-		super(owner, new EmptyLocator());
-		this._isRow = isRow;
-		this._index = index;
-		initialize();
-	}
-
-	/**
-	 * 
-	 */
-	private void initialize() {
-		this.setOpaque(false);
-		LineBorder border1 = new LineBorder(ColorConstants.green, 1);
-		this.setBorder(border1);
-		this.setCursor(Cursors.ARROW);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.Figure#paintFigure(org.eclipse.draw2d.Graphics)
-	 */
-	protected void paintFigure(Graphics graphics) {
-		graphics.setXORMode(true);
-		graphics.setBackgroundColor(ColorConstants.darkGray);
-		graphics.fillRectangle(getBounds());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.handles.AbstractHandle#createDragTracker()
-	 */
-	protected DragTracker createDragTracker() {
-		return new TableSideItemDragTracker(getOwner(), _isRow, _index);
-	}
-
-	/**
-	 * @return the index
-	 */
-	public int getIndex() {
-		return _index;
-	}
-
-	/**
-	 * @return true if is row
-	 */
-	public boolean isRow() {
-		return _isRow;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableSideResizeDragTracker.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableSideResizeDragTracker.java
deleted file mode 100644
index ca0771f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableSideResizeDragTracker.java
+++ /dev/null
@@ -1,177 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.tableedit;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.geometry.Insets;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.tools.DragEditPartsTracker;
-import org.eclipse.jst.pagedesigner.editpolicies.ITableEditAdapter;
-
-/**
- * This is the drag tracker for the small resize item on the
- * TableSideResizeHandle. used to adjust a single column/row size.
- * 
- * @author mengbo
- * @version 1.5
- */
-public class TableSideResizeDragTracker extends DragEditPartsTracker {
-	private boolean _isrow;
-
-	private int _index;
-
-	private MarqueeRectangleFigure _marqueeFigure;
-
-	/**
-	 * @param sourceEditPart
-	 * @param isrow 
-	 * @param index 
-	 */
-	public TableSideResizeDragTracker(EditPart sourceEditPart, boolean isrow,
-			int index) {
-		super(sourceEditPart);
-		this._isrow = isrow;
-		this._index = index;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.tools.DragEditPartsTracker#showSourceFeedback()
-	 */
-	protected void showSourceFeedback() {
-		Rectangle rect = getFeedbackRect();
-		if (rect != null) {
-			rect = rect.getCopy();
-			getMarqueeRectangleFigure().setBounds(rect);
-		} else {
-			// ignore.
-		}
-	}
-
-	private int calculateDelta() {
-		int delta;
-		// FIXME: TODO: XXX: when delta is too small (<0) to make previous
-		// column/row
-		// to have negative size, then we need adjust delta.
-		if (_isrow) {
-			delta = getLocation().y - getStartLocation().y;
-		} else {
-			delta = getLocation().x - getStartLocation().x;
-		}
-		return delta;
-	}
-
-	/**
-	 * @return null if this is not a table.
-	 */
-	private Rectangle getFeedbackRect() {
-		ITableEditAdapter adapter = getTableEditAdapter();
-		if (adapter == null) {
-			return null;
-		}
-
-		IFigure figure = ((GraphicalEditPart) this.getSourceEditPart())
-				.getFigure();
-		Rectangle bounds = figure.getBounds();
-		Insets insets = figure.getInsets();
-		Rectangle rect;
-		if (_isrow) {
-			int delta = calculateDelta();
-			rect = new Rectangle(0, adapter.getRowResizeStart(_index) + delta,
-					bounds.width - insets.getWidth(), adapter
-							.getRowResizeWidth());
-		} else {
-			int delta = calculateDelta();
-			rect = new Rectangle(adapter.getColumnResizeStart(_index) + delta,
-					0, adapter.getColumnResizeWidth(), bounds.height
-							- insets.getHeight());
-		}
-		rect.translate(bounds.x + insets.left, bounds.y + insets.top);
-
-		figure.translateToAbsolute(rect);
-		getMarqueeRectangleFigure().translateToRelative(rect);
-		return rect;
-	}
-
-	/**
-	 * 
-	 * @return null if this is not a table.
-	 */
-	private ITableEditAdapter getTableEditAdapter() {
-		return TableEditHelper.getTableEditAdapter((GraphicalEditPart) this
-				.getSourceEditPart());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.tools.DragEditPartsTracker#eraseSourceFeedback()
-	 */
-	protected void eraseSourceFeedback() {
-		super.eraseSourceFeedback();
-		if (_marqueeFigure != null) {
-			removeFeedback(_marqueeFigure);
-			_marqueeFigure = null;
-		}
-	}
-
-	private MarqueeRectangleFigure getMarqueeRectangleFigure() {
-		if (this._marqueeFigure == null) {
-			this._marqueeFigure = new MarqueeRectangleFigure();
-			addFeedback(this._marqueeFigure);
-		}
-		return this._marqueeFigure;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.tools.DragEditPartsTracker#createTargetRequest()
-	 */
-	protected Request createTargetRequest() {
-		return new TableResizeRequest(this._isrow, this._index);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.tools.DragEditPartsTracker#updateTargetRequest()
-	 */
-	protected void updateTargetRequest() {
-		TableResizeRequest req = (TableResizeRequest) getTargetRequest();
-		req.setDelta(calculateDelta());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.tools.SelectEditPartTracker#handleButtonDown(int)
-	 */
-	protected boolean handleButtonDown(int button) {
-		lockTargetEditPart(getSourceEditPart());
-		return super.handleButtonDown(button);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.tools.DragEditPartsTracker#getCommand()
-	 */
-	protected Command getCommand() {
-		return getTargetEditPart().getCommand(getTargetRequest());
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableSideResizeHandle.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableSideResizeHandle.java
deleted file mode 100644
index bfe6b22..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableSideResizeHandle.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.tableedit;
-
-import org.eclipse.draw2d.Cursors;
-import org.eclipse.gef.DragTracker;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.handles.AbstractHandle;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TableSideResizeHandle extends AbstractHandle {
-	private boolean _isRow;
-
-	private int _index;
-
-	/**
-	 * @param owner 
-	 * @param isrow 
-	 * @param index 
-	 * 
-	 */
-	public TableSideResizeHandle(GraphicalEditPart owner, boolean isrow,
-			int index) {
-		super(owner, new EmptyLocator());
-		this._isRow = isrow;
-		this._index = index;
-
-		this.setCursor(isrow ? Cursors.SIZEN : Cursors.SIZEE);
-		// this.setBackgroundColor(ColorConstants.green);
-		this.setOpaque(false);
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.handles.AbstractHandle#createDragTracker()
-	 */
-	protected DragTracker createDragTracker() {
-		return new TableSideResizeDragTracker(getOwner(), _isRow, _index);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tools/ExposeHelper.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tools/ExposeHelper.java
deleted file mode 100644
index 6828db1..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tools/ExposeHelper.java
+++ /dev/null
@@ -1,333 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.tools;
-
-import org.eclipse.draw2d.FigureCanvas;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.Viewport;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.editpolicies.AbstractEditPolicy;
-import org.eclipse.gef.ui.parts.ScrollingGraphicalViewer;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.w3c.dom.Node;
-
-/**
- * This helper class expose an rectangle in design view, currentlly it is used
- * to help expose caret.
- * 
- * @author mengbo
- */
-public class ExposeHelper {
-	private static final int DEFAULT_OFFSET = 100;
-
-	private static final int SCROLL_OFFSET = 8;
-
-	IHTMLGraphicalViewer _viewer;
-
-	/**
-	 * @param viewer 
-	 */
-	public ExposeHelper(IHTMLGraphicalViewer viewer) {
-		_viewer = viewer;
-	}
-
-	/**
-	 * Expose rectangle. (non-Javadoc)
-	 * @param rect 
-	 * 
-	 * @see org.eclipse.gef.ExposeHelper#exposeDescendant(org.eclipse.gef.EditPart)
-	 */
-	public void exposeArea(Rectangle rect) {
-		if (_viewer == null) {
-			return;
-		}
-		FigureCanvas canvas = (FigureCanvas) _viewer.getControl();
-		Viewport port = _viewer.getViewport();
-
-		if (port == null) {
-			return;
-		}
-		Rectangle exposeRegion = rect.getCopy();
-		Rectangle portBounds = port.getBounds().getCopy();
-		Point viewLocation = port.getViewLocation();
-		Dimension diff = calculateDiff(portBounds, exposeRegion);
-		if (diff != null) {
-			viewLocation.x -= diff.width;
-			viewLocation.y -= diff.height;
-			canvas.scrollSmoothTo(viewLocation.x, viewLocation.y);
-		}
-	}
-
-	private void exposeVertical(int offset) {
-		if (_viewer == null) {
-			return;
-		}
-		FigureCanvas canvas = (FigureCanvas) _viewer.getControl();
-		Viewport port = _viewer.getViewport();
-
-		if (port == null) {
-			return;
-		}
-		Point viewLocation = port.getViewLocation();
-		viewLocation.y += offset;
-		canvas.scrollSmoothTo(viewLocation.x, viewLocation.y);
-	}
-
-	private void exposeHorizontal(int offset) {
-		if (_viewer == null) {
-			return;
-		}
-		FigureCanvas canvas = (FigureCanvas) _viewer.getControl();
-		Viewport port = _viewer.getViewport();
-
-		if (port == null) {
-			return;
-		}
-		Point viewLocation = port.getViewLocation();
-		viewLocation.x += offset;
-		canvas.scrollSmoothTo(viewLocation.x, viewLocation.y);
-	}
-
-	private int calculateX(Rectangle portBounds, Rectangle caretRect) {
-		int result = 0;
-		if (portBounds.x > caretRect.getRight().x) {
-			result = portBounds.getLeft().getDifference(caretRect.getRight()).width;
-			if (portBounds.width >= caretRect.width) {
-				result = portBounds.getLeft()
-						.getDifference(caretRect.getLeft()).width;
-			}
-		} else if (portBounds.getRight().x < caretRect.getLeft().x) {
-			result = portBounds.getRight().getDifference(caretRect.getLeft()).width;
-			if (portBounds.width >= caretRect.width) {
-				result = portBounds.getRight().getDifference(
-						caretRect.getRight()).width;
-			}
-		}
-		return result;
-	}
-
-	private int calculateY(Rectangle portBounds, Rectangle caretRect) {
-		int result = 0;
-		if (portBounds.y > caretRect.getBottom().y) {
-			result = portBounds.getTop().getDifference(caretRect.getBottom()).height;
-			if (portBounds.height >= caretRect.height) {
-				result = portBounds.getTop().getDifference(caretRect.getTop()).height;
-			}
-		} else if (portBounds.getBottom().y < caretRect.getTop().y) {
-			result = portBounds.getBottom().getDifference(caretRect.getTop()).height;
-			if (portBounds.height >= caretRect.height) {
-				result = portBounds.getBottom().getDifference(
-						caretRect.getBottom()).height;
-			}
-		} else if (portBounds.getBottom().y < caretRect.getBottom().y) {
-			if (portBounds.height >= caretRect.height) {
-				result = portBounds.getBottom().getDifference(
-						caretRect.getBottom()).height;
-			}
-		} else if (portBounds.getTop().y > caretRect.getTop().y) {
-			if (portBounds.height >= caretRect.height) {
-				result = portBounds.getTop().getDifference(caretRect.getTop()).height;
-			}
-		}
-		return result;
-	}
-
-	/**
-	 * Calculate caretPoint's offset to posrBounds at both x coordinate and y
-	 * coordinate.
-	 * 
-	 * @param portBounds
-	 * @param exposeRegion
-	 * @param canvas
-	 * @param caretPoint
-	 */
-	private Dimension calculateDiff(Rectangle portBounds, Rectangle caretRect) {
-		Dimension diff = new Dimension(0, 0);
-		diff.width = calculateX(portBounds, caretRect);
-		diff.height = calculateY(portBounds, caretRect);
-		return diff;
-	}
-
-	// /**
-	// * Calculate caretPoint's offset to posrBounds at both x coordinate and y
-	// coordinate.
-	// *
-	// * @param portBounds
-	// * @param exposeRegion
-	// * @param canvas
-	// * @param caretPoint
-	// */
-	// private Dimension calculateDiff(Rectangle portBounds, Point caretPoint)
-	// {
-	// int position = portBounds.getPosition(caretPoint);
-	// Dimension diff = null;
-	// Point containerPos = null;
-	// switch (position)
-	// {
-	// case PositionConstants.EAST:
-	// containerPos = new Point(portBounds.getRight().x, caretPoint.y);
-	// diff = containerPos.getDifference(caretPoint);
-	// break;
-	// case PositionConstants.NORTH_EAST:
-	// diff = portBounds.getTopRight().getDifference(caretPoint);
-	// break;
-	// case PositionConstants.WEST:
-	// containerPos = new Point(portBounds.getLeft().x, caretPoint.y);
-	// diff = containerPos.getDifference(caretPoint);
-	// break;
-	// case PositionConstants.NORTH_WEST:
-	// diff = portBounds.getTopLeft().getDifference(caretPoint);
-	// break;
-	// case PositionConstants.SOUTH_WEST:
-	// diff = portBounds.getBottomLeft().getDifference(caretPoint);
-	// break;
-	// case PositionConstants.SOUTH_EAST:
-	// diff = portBounds.getBottomRight().getDifference(caretPoint);
-	// break;
-	// case PositionConstants.NORTH:
-	// containerPos = new Point(caretPoint.x, portBounds.getTop().y);
-	// diff = containerPos.getDifference(caretPoint);
-	// break;
-	// case PositionConstants.SOUTH:
-	// containerPos = new Point(caretPoint.x, portBounds.getBottom().y);
-	// diff = containerPos.getDifference(caretPoint);
-	// break;
-	// }
-	// return diff;
-	// }
-	//
-	private static void expose(EditPart part, ScrollingGraphicalViewer viewer) {
-		if (part != null && part.getModel() instanceof Node) {
-			viewer.reveal(part);
-		}
-	}
-
-	private static void expose(Node element, ScrollingGraphicalViewer viewer) {
-		if (element instanceof INodeNotifier) {
-			EditPart editPart = (EditPart) ((INodeNotifier) element)
-					.getAdapterFor(EditPart.class);
-			expose(editPart, viewer);
-		}
-	}
-
-	/**
-	 * @param selection
-	 * @param viewer
-	 */
-	public static void expose(ISelection selection,
-			ScrollingGraphicalViewer viewer) {
-		if (selection instanceof IStructuredSelection) {
-			Object element = ((IStructuredSelection) selection)
-					.getFirstElement();
-			if (element instanceof Node) {
-				expose((Node) element, viewer);
-			} else if (element instanceof EditPart) {
-				expose((EditPart) element, viewer);
-			}
-		}
-	}
-
-	/**
-	 * @param p
-	 */
-	public void adjustVertical(Point p) {
-		int offset = 0;
-		if ((offset = getVerticalBoundsOffset(p, false)) < SCROLL_OFFSET) {
-			exposeVertical(SCROLL_OFFSET - offset);
-		} else if ((offset = getVerticalBoundsOffset(p, true)) < SCROLL_OFFSET) {
-			exposeVertical(offset - SCROLL_OFFSET);
-		}
-		if ((offset = getHorizontalBoundsOffset(p, true)) < SCROLL_OFFSET) {
-			exposeHorizontal(SCROLL_OFFSET - offset);
-		} else if ((offset = getHorizontalBoundsOffset(p, false)) < SCROLL_OFFSET) {
-			exposeHorizontal(offset - SCROLL_OFFSET);
-		}
-	}
-
-	/**
-	 * @return the location of the view port
-	 */
-	public Point getViewpostLocation() {
-		if (_viewer != null) {
-			Viewport port = _viewer.getViewport();
-
-			if (port != null) {
-				return port.getViewLocation();
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * @param figure
-	 * @param p
-	 * @return the translated point
-	 */
-	public Point translateToViewport(IFigure figure, Point p) {
-		Point vp = getViewpostLocation();
-		return new Point(p.x - vp.x, p.y - vp.y);
-	}
-
-	private int getHorizontalBoundsOffset(Point p, boolean forward) {
-		if (_viewer == null) {
-			return DEFAULT_OFFSET;
-		}
-		Viewport port = _viewer.getViewport();
-
-		if (port == null) {
-			return DEFAULT_OFFSET;
-		}
-		if (forward) {
-			Rectangle portBounds = port.getBounds().getCopy();
-			return portBounds.getRight().x - p.x;
-		}
-        return p.x;
-	}
-
-	private int getVerticalBoundsOffset(Point p, boolean up) {
-		if (_viewer == null) {
-			return DEFAULT_OFFSET;
-		}
-		Viewport port = _viewer.getViewport();
-
-		if (port == null) {
-			return DEFAULT_OFFSET;
-		}
-		if (!up) {
-			Rectangle portBounds = port.getBounds().getCopy();
-			return portBounds.getBottom().y - p.y;
-		}
-        return p.y;
-	}
-
-	/**
-	 * @param rect
-	 * @param policy
-	 */
-	void exposeBorder(Rectangle rect, AbstractEditPolicy policy) {
-		Point p = rect.getTopLeft();
-		p = translateToViewport(((GraphicalEditPart) policy.getHost())
-				.getFigure(), p);
-		adjustVertical(p);
-		p = rect.getBottomRight();
-		p = translateToViewport(((GraphicalEditPart) policy.getHost())
-				.getFigure(), p);
-		adjustVertical(p);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tools/ObjectModeDragTracker.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tools/ObjectModeDragTracker.java
deleted file mode 100644
index 15519bc..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tools/ObjectModeDragTracker.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.tools;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.tools.DragEditPartsTracker;
-import org.eclipse.jst.pagedesigner.range.RangeUtil;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-
-/**
- * When user press right mouse to do selection, if the selected node is inside
- * current range selection, then don't change selection. This is for better
- * context menu support.
- * 
- * @author mengbo
- * @version 1.5
- */
-public class ObjectModeDragTracker extends DragEditPartsTracker {
-	/**
-	 * @param sourceEditPart
-	 */
-	public ObjectModeDragTracker(EditPart sourceEditPart) {
-		super(sourceEditPart);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.tools.SelectEditPartTracker#handleButtonDown(int)
-	 */
-	protected boolean handleButtonDown(int button) {
-		if (button == 3 && isInState(STATE_INITIAL)) {
-			EditPart sourcePart = this.getSourceEditPart();
-			IHTMLGraphicalViewer viewer = (IHTMLGraphicalViewer) sourcePart
-					.getViewer();
-			if (viewer != null && viewer.isInRangeMode()) {
-				DesignRange range = viewer.getRangeSelection();
-				if (range != null && range.isValid()) {
-					if (RangeUtil.intersect(range, sourcePart)) {
-						return true;
-					}
-				}
-			}
-		}
-		return super.handleButtonDown(button);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tools/RangeDragTracker.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tools/RangeDragTracker.java
deleted file mode 100644
index 03e690e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tools/RangeDragTracker.java
+++ /dev/null
@@ -1,314 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.tools;
-
-import java.util.Collections;
-
-import org.eclipse.draw2d.Cursors;
-import org.eclipse.gef.DragTracker;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPartViewer;
-import org.eclipse.gef.RequestConstants;
-import org.eclipse.gef.requests.SelectionRequest;
-import org.eclipse.gef.tools.TargetingTool;
-import org.eclipse.jst.pagedesigner.parts.NodeEditPart;
-import org.eclipse.jst.pagedesigner.parts.TextEditPart;
-import org.eclipse.jst.pagedesigner.range.RangeUtil;
-import org.eclipse.jst.pagedesigner.validation.caret.ActionData;
-import org.eclipse.jst.pagedesigner.validation.caret.IPositionMediator;
-import org.eclipse.jst.pagedesigner.validation.caret.InlineEditingPositionMediator;
-import org.eclipse.jst.pagedesigner.validation.caret.Target;
-import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-import org.eclipse.jst.pagedesigner.viewer.EditPartPositionHelper;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.eclipse.swt.graphics.Cursor;
-
-/**
- * @author mengbo
- */
-public class RangeDragTracker extends TargetingTool implements DragTracker {
-	/** Flag to indicate selection has been performed. */
-	private static final int FLAG_SELECTION_PERFORMED = TargetingTool.MAX_FLAG << 1;
-
-	private EditPart editpart;
-
-	/**
-	 * Constructs a new SelectEditPartTracker with the given edit part as the
-	 * source.
-	 * 
-	 * @param owner
-	 *            the source edit part
-	 */
-	public RangeDragTracker(EditPart owner) {
-		setSourceEditPart(owner);
-	}
-
-	/**
-	 * @see org.eclipse.gef.tools.AbstractTool#calculateCursor()
-	 */
-	protected Cursor calculateCursor() {
-        return Cursors.IBEAM;
-//		if (isInState(STATE_INITIAL))
-//        {
-//            return Cursors.IBEAM;
-//        }
-//        else if (isInState(STATE_DRAG | STATE_ACCESSIBLE_DRAG))
-//        {
-//			return getDefaultCursor();
-//		}
-//        return Cursors.IBEAM;
-//		return super.calculateCursor();
-	}
-
-	/**
-	 * @see org.eclipse.gef.tools.AbstractTool#getCommandName()
-	 */
-	protected String getCommandName() {
-		return "Range Drag Tracker";//$NON-NLS-1$
-	}
-
-	/**
-	 * @see org.eclipse.gef.tools.AbstractTool#getDebugName()
-	 */
-	protected String getDebugName() {
-		return "Range Drag Tracker";//$NON-NLS-1$
-	}
-
-	/**
-	 * Returns the source edit part.
-	 * 
-	 * @return the source edit part
-	 */
-	protected EditPart getSourceEditPart() {
-		return editpart;
-	}
-
-	/**
-	 * Performs a conditional selection if needed (if right or left mouse button
-	 * have been pressed) and goes into the drag state. If any other button has
-	 * been pressed, the tool goes into the invalid state.
-	 * 
-	 * @see org.eclipse.gef.tools.AbstractTool#handleButtonDown(int)
-	 */
-	protected boolean handleButtonDown(int button) {
-		if (button == 3 && isInState(STATE_INITIAL)) {
-			EditPart sourcePart = this.getSourceEditPart();
-			IHTMLGraphicalViewer viewer = (IHTMLGraphicalViewer) sourcePart
-					.getViewer();
-			if (viewer != null && viewer.isInRangeMode()) {
-				DesignRange range = viewer.getRangeSelection();
-				if (range != null && range.isValid()) {
-					if (RangeUtil.intersect(range, sourcePart)) {
-						return true;
-					}
-				}
-			}
-		}
-
-		if ((button == 1 || button == 3) && isInState(STATE_INITIAL)) {
-			peroformSelectionBegin();
-		}
-
-		if (button != 1) {
-			setState(STATE_INVALID);
-			if (button == 3)
-				setState(STATE_TERMINAL);
-			handleInvalidInput();
-		} else {
-			stateTransition(STATE_INITIAL, STATE_DRAG);
-		}
-		return true;
-	}
-
-	/**
-	 * If the
-	 * source is selected and there are no modifier keys pressed (i.e. the user
-	 * isn't selecting multiple edit parts or deselecting edit parts), sets the
-	 * direct edit flag so that when the mouse is released, a direct edit will
-	 * be performed.
-	 */
-	protected void peroformSelectionBegin() {
-		// if (getCurrentInput().isControlKeyDown())
-		// {
-		// // when control key is down, switch to object selection mode.
-		// getHTMLGraphicalViewer().ensureObjectSelectionMode();
-		// setFlag(FLAG_SELECTION_PERFORMED, true);
-		// EditPartViewer viewer = getCurrentViewer();
-		// List selectedObjects = viewer.getSelectedEditParts();
-		//
-		// if (selectedObjects.contains(getSourceEditPart()))
-		// viewer.deselect(getSourceEditPart());
-		// else
-		// viewer.appendSelection(getSourceEditPart());
-		// }
-		// else
-		if (getCurrentInput().isShiftKeyDown()) {
-			getHTMLGraphicalViewer().ensureRangeSelectionMode();
-			rangeSelection(true);
-		} else {
-			if (shouldStartRangeSelection()) {
-				rangeSelection(false);
-			} else {
-				getCurrentViewer().select(getSourceEditPart());
-			}
-		}
-	}
-
-	/**
-	 * If in the drag state, the tool selects the source edit part.  If the
-	 * edit part is newly selected and not completely visible,
-	 * {@link org.eclipse.gef.EditPartViewer#reveal(EditPart)}is called to show the selected
-	 * edit part.
-	 * 
-	 * @see org.eclipse.gef.tools.AbstractTool#handleButtonUp(int)
-	 */
-	protected boolean handleButtonUp(int button) {
-		if (isInState(STATE_DRAG)) {
-			// XXX: commented the following two line (lium)
-			// performSelection();
-			// if (button == 1 && getSourceEditPart().getSelected() !=
-			// EditPart.SELECTED_NONE)
-			// getCurrentViewer().reveal(getSourceEditPart());
-			setState(STATE_TERMINAL);
-			return true;
-		}
-		return false;
-	}
-
-	/**
-	 * Calls {@link #performOpen()}if the double click was with mouse button 1.
-	 * 
-	 * @see org.eclipse.gef.tools.AbstractTool#handleDoubleClick(int)
-	 */
-	protected boolean handleDoubleClick(int button) {
-		if (button == 1) {
-			performOpen();
-		}
-		return true;
-	}
-
-	/**
-	 * @see org.eclipse.gef.tools.AbstractTool#handleDragStarted()
-	 */
-	protected boolean handleDragStarted() {
-		return stateTransition(STATE_DRAG, STATE_DRAG_IN_PROGRESS);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.tools.AbstractTool#handleDragInProgress()
-	 */
-	protected boolean handleDragInProgress() {
-		if (getHTMLGraphicalViewer().isInRangeMode()) {
-			rangeSelection(true);
-			return true;
-		}
-        return super.handleDragInProgress();
-	}
-
-	/**
-	 * Returns <code>true</code> if selection has already occured.
-	 * 
-	 * @return <code>true</code> if selection has occured
-	 */
-	protected boolean hasSelectionOccurred() {
-		return getFlag(FLAG_SELECTION_PERFORMED);
-	}
-
-	/**
-	 * Creates a {@link SelectionRequest}and sends it to the source edit part
-	 * via {@link EditPart#performRequest(org.eclipse.gef.Request)}. Possible uses are to open
-	 * the selected item in another editor or replace the current editor's
-	 * contents based on the selected item.
-	 */
-	protected void performOpen() {
-		SelectionRequest request = new SelectionRequest();
-		request.setLocation(getLocation());
-		request.setType(RequestConstants.REQ_OPEN);
-		getSourceEditPart().performRequest(request);
-	}
-
-	/**
-	 * @see org.eclipse.gef.tools.AbstractTool#resetFlags()
-	 */
-	protected void resetFlags() {
-		super.resetFlags();
-		setFlag(FLAG_SELECTION_PERFORMED, false);
-	}
-
-	/**
-	 * Sets the source edit part.
-	 * 
-	 * @param part
-	 *            the source edit part
-	 */
-	protected void setSourceEditPart(EditPart part) {
-		this.editpart = part;
-	}
-
-	/**
-	 * @return the html graphical viewer
-	 */
-	public IHTMLGraphicalViewer getHTMLGraphicalViewer() {
-		return (IHTMLGraphicalViewer) getCurrentViewer();
-	}
-
-	/**
-	 * @return
-	 */
-	private boolean shouldStartRangeSelection() {
-		IPositionMediator positionMediator = new InlineEditingPositionMediator(
-				new ActionData(ActionData.INLINE_EDIT, null));
-		if (positionMediator.isEditable(new Target(getSourceEditPart()))) {
-			return getSourceEditPart() instanceof TextEditPart
-					|| !(((NodeEditPart) getSourceEditPart()).isWidget());
-		}
-        return false;
-	}
-
-	/**
-	 * @param b
-	 *            true means remain the old range start position.
-	 */
-	private void rangeSelection(boolean b) {
-		// XXX: not using updateTargetEditPartUnderMouse. Maybe should. Don't
-		// want to
-		// go through the request mechanism, so simple implementation for now.
-		
-		//to avoid 219038 and possibility of current viewer changing
-		final EditPartViewer viewer = getCurrentViewer();
-		final IHTMLGraphicalViewer graphicalViewer = (IHTMLGraphicalViewer)viewer;
-		EditPart editPart = viewer.findObjectAtExcluding(
-				getLocation(), Collections.EMPTY_LIST);
-		IPositionMediator positionMediator = new InlineEditingPositionMediator(
-				new ActionData(ActionData.INLINE_EDIT, null));
-		ExposeHelper exposeHelper = new ExposeHelper(graphicalViewer);
-		exposeHelper.adjustVertical(getCurrentInput().getMouseLocation());
-		DesignPosition position = EditPartPositionHelper.findEditPartPosition(
-				editPart, getCurrentInput().getMouseLocation(),
-				positionMediator);
-		if (b) {
-			graphicalViewer.setRangeEndPosition(position);
-		} else {
-			graphicalViewer.setRange(position, position);
-		}
-		graphicalViewer.updateHorizontalPos();
-	}
-
-    protected boolean handleHover() {
-        boolean retValue = super.handleHover();
-        refreshCursor();
-        return retValue;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tools/RangeSelectionTool.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tools/RangeSelectionTool.java
deleted file mode 100644
index e25c052..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tools/RangeSelectionTool.java
+++ /dev/null
@@ -1,319 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.tools;
-
-import org.eclipse.gef.DragTracker;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.RequestConstants;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.requests.LocationRequest;
-import org.eclipse.gef.tools.SelectionTool;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jst.pagedesigner.commands.DeleteNodeCommand;
-import org.eclipse.jst.pagedesigner.commands.SwitchSelectionCommand;
-import org.eclipse.jst.pagedesigner.commands.nav.HorizontalMoveCommand;
-import org.eclipse.jst.pagedesigner.commands.nav.ICaretPositionMover;
-import org.eclipse.jst.pagedesigner.commands.nav.VerticalMoveCommand;
-import org.eclipse.jst.pagedesigner.commands.range.CopyCommand;
-import org.eclipse.jst.pagedesigner.commands.range.CutCommand;
-import org.eclipse.jst.pagedesigner.commands.range.DeleteCommand;
-import org.eclipse.jst.pagedesigner.commands.range.InsertCommand;
-import org.eclipse.jst.pagedesigner.commands.range.KeyboardData;
-import org.eclipse.jst.pagedesigner.commands.range.PasteCommand;
-import org.eclipse.jst.pagedesigner.commands.range.SelectAllCommand;
-import org.eclipse.jst.pagedesigner.editors.pagedesigner.PageDesignerResources;
-import org.eclipse.jst.pagedesigner.parts.DocumentEditPart;
-import org.eclipse.jst.pagedesigner.parts.NodeEditPart;
-import org.eclipse.jst.pagedesigner.requests.LocationModifierRequest;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.KeyEvent;
-import org.eclipse.swt.graphics.Cursor;
-
-/**
- * @author mengbo
- */
-public class RangeSelectionTool extends SelectionTool 
-{
-	private LocationRequest _hoverRequest;
-    
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.tools.SelectionTool#handleKeyDown(org.eclipse.swt.events.KeyEvent)
-	 */
-	protected boolean handleKeyDown(KeyEvent e) {
-		// resetHover() is not visible.
-		if (isHoverActive()) {
-			handleHoverStop();
-		}
-		setHoverActive(false);
-
-		if ((e.stateMask & SWT.ALT) != 0) {
-			return false;
-		}
-		Command command = null;
-		KeyboardData keyCode = null;
-		switch (e.keyCode) {
-		case SWT.F2:
-			command = new SwitchSelectionCommand((IHTMLGraphicalViewer) this
-					.getCurrentViewer());
-
-			break;
-		case SWT.ARROW_UP:
-			command = new VerticalMoveCommand((IHTMLGraphicalViewer) this
-					.getCurrentViewer(), true, (e.stateMask & SWT.SHIFT) != 0);
-			break;
-		case SWT.ARROW_DOWN:
-			command = new VerticalMoveCommand((IHTMLGraphicalViewer) this
-					.getCurrentViewer(), false, (e.stateMask & SWT.SHIFT) != 0);
-			break;
-		case SWT.ARROW_LEFT:
-			command = new HorizontalMoveCommand((IHTMLGraphicalViewer) this
-					.getCurrentViewer(), false, (e.stateMask & SWT.SHIFT) != 0);
-			break;
-		case SWT.ARROW_RIGHT:
-			command = new HorizontalMoveCommand((IHTMLGraphicalViewer) this
-					.getCurrentViewer(), true, (e.stateMask & SWT.SHIFT) != 0);
-			break;
-		case SWT.DEL:
-			if ((e.stateMask & SWT.SHIFT) == 0) {
-				if (getCurrentViewer().getSelection() != null) {
-					ISelection selection = getCurrentViewer().getSelection();
-					if (selection instanceof StructuredSelection) {
-						Object object = ((StructuredSelection) selection)
-								.getFirstElement();
-						if (!(object instanceof DocumentEditPart)) {
-							// "delete node"
-							command = new DeleteNodeCommand(
-									(IHTMLGraphicalViewer) getCurrentViewer());
-						}
-					}
-				}
-				if (command == null) {
-					// "delete"
-					command = new DeleteCommand(true,
-							(IHTMLGraphicalViewer) this.getCurrentViewer());
-				}
-			} else {
-				// "cut"
-				command = new CutCommand((IHTMLGraphicalViewer) this
-						.getCurrentViewer());
-				e.doit = false;
-			}
-			break;
-		case SWT.BS:
-			// "delete"
-			command = new DeleteCommand(false, (IHTMLGraphicalViewer) this
-					.getCurrentViewer());
-			e.doit = false;
-			break;
-		case SWT.INSERT:
-			if ((e.stateMask & SWT.SHIFT) != 0) {
-				// "paste"
-				command = new PasteCommand((IHTMLGraphicalViewer) this
-						.getCurrentViewer());
-				e.doit = false;
-				break;
-			} else if ((e.stateMask & SWT.CONTROL) != 0) {
-				// "copy"
-				command = new CopyCommand((IHTMLGraphicalViewer) this
-						.getCurrentViewer());
-				e.doit = false;
-				break;
-			}
-			break;
-		case SWT.LF:
-		case SWT.CR:
-			// "insert"
-			keyCode = new KeyboardData(e.character, e.stateMask,
-					(IHTMLGraphicalViewer) getCurrentViewer());
-			command = new InsertCommand(
-					PageDesignerResources.getInstance().getString(
-							"RangeSelectionTool.CommandLabel.Insert"), (IHTMLGraphicalViewer) this.getCurrentViewer(), keyCode); //$NON-NLS-1$
-			e.doit = false;
-			break;
-		default:
-			if (e.keyCode == 'a' && (e.stateMask & SWT.CTRL) != 0) {
-				command = new SelectAllCommand("selectAll", //$NON-NLS-1$
-						(IHTMLGraphicalViewer) this.getCurrentViewer());
-				e.doit = false;
-			} else {
-				if (getCurrentViewer() instanceof IHTMLGraphicalViewer
-						&& ((IHTMLGraphicalViewer) getCurrentViewer())
-								.isInRangeMode()
-						&& (!Character.isIdentifierIgnorable(e.character) && !Character
-								.isISOControl(e.character))
-						|| (e.character == '\r')) {
-					keyCode = new KeyboardData(e.character, e.stateMask,
-							(IHTMLGraphicalViewer) getCurrentViewer());
-					// "insert"
-					command = new InsertCommand(
-							PageDesignerResources.getInstance().getString(
-									"RangeSelectionTool.CommandLabel.Insert"), (IHTMLGraphicalViewer) this.getCurrentViewer(), keyCode); //$NON-NLS-1$
-					e.doit = false;
-					break;
-				}
-                return super.handleKeyDown(e);
-			}
-		}
-		if (command != null) {
-			command.execute();
-			e.doit = false;
-			if (command instanceof ICaretPositionMover) {
-				if (getCurrentViewer() instanceof IHTMLGraphicalViewer) {
-					((IHTMLGraphicalViewer) getCurrentViewer())
-							.updateHorizontalPos();
-				}
-			}
-			return true;
-		}
-		return false;
-	}
-
-	// /**
-	// * @param e
-	// * @return
-	// */
-	// protected boolean handleRangeModeKeyDown(KeyEvent e)
-	// {
-	// if (e.keyCode == SWT.SHIFT || e.keyCode == SWT.CONTROL || e.keyCode ==
-	// SWT.ALT)
-	// {
-	// return false;
-	// }
-	//
-	// dumpKey(e);
-	// Command command = null;
-	// switch (e.keyCode)
-	// {
-	// case SWT.ARROW_LEFT:
-	// command = new HorizontalMoveCommand((IHTMLGraphicalViewer)
-	// this.getCurrentViewer(), false,
-	// (e.stateMask & SWT.SHIFT) != 0);
-	// break;
-	// case SWT.ARROW_RIGHT:
-	// command = new HorizontalMoveCommand((IHTMLGraphicalViewer)
-	// this.getCurrentViewer(), true,
-	// (e.stateMask & SWT.SHIFT) != 0);
-	// break;
-	//
-	// }
-	// if (command != null)
-	// {
-	// command.execute();
-	// return true;
-	// }
-	//
-	// char content = e.character;
-	//
-	// // when reach here, should be standard content keys.
-	// return handleRangeModeContentChar(content);
-	// }
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.tools.SelectionTool#createHoverRequest()
-	 */
-	protected void createHoverRequest() {
-		this._hoverRequest = new LocationModifierRequest();
-		_hoverRequest.setType(RequestConstants.REQ_SELECTION_HOVER);
-	}
-
-	protected Request getTargetHoverRequest() {
-		if (_hoverRequest == null) {
-			createHoverRequest();
-		}
-		return _hoverRequest;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.tools.SelectionTool#updateHoverRequest()
-	 */
-	protected void updateHoverRequest() {
-		LocationModifierRequest request = (LocationModifierRequest) getTargetHoverRequest();
-		request.setLocation(getLocation());
-		request.setControlKeyPressed(getCurrentInput().isControlKeyDown());
-	}
-
-    /* 
-     * If the target edit part is a NodeEditPart, then inform it if of the current
-     * drag status before calling its hover feedback
-     */
-    protected void showHoverFeedback() 
-    {
-        if (getTargetEditPart() instanceof NodeEditPart)
-        {
-            ((NodeEditPart)getTargetEditPart())
-                .setDragActive(
-                        isInState(STATE_DRAG_IN_PROGRESS 
-                                | STATE_ACCESSIBLE_DRAG_IN_PROGRESS 
-                                | STATE_DRAG));
-        }
-        super.showHoverFeedback();
-    }
-
-    // TODO : this method is for debug purposes and should
-    // be removed in production
-//    protected boolean updateTargetUnderMouse() {
-//        EditPart editPart = getTargetEditPart();
-//        boolean retValue =  super.updateTargetUnderMouse();
-//        if (getTargetEditPart() != editPart)
-//        {
-//            System.out.println("New target editpart:  "+getTargetEditPart()+" Old edit part: "+editPart);
-//        }
-//        return retValue;
-//    }
-
-    protected boolean handleMove() {
-        boolean handled =  super.handleMove();
-        EditPart targetEditPart = getTargetEditPart();
-        
-        if (isInState(STATE_INITIAL)
-                && targetEditPart instanceof NodeEditPart)
-        {
-            LocationRequest request = new LocationRequest(org.eclipse.jst.pagedesigner.requests.PageDesignerRequestConstants.REQ_SELECTION_TRACKER);
-            request.setLocation(getLocation());
-            DragTracker selectionTracker = targetEditPart.getDragTracker(request);
-            setDragTracker(selectionTracker);
-        }
-        
-        return handled;
-    }
-
-    protected Cursor calculateCursor() {
-        EditPart targetEditPart = getTargetEditPart();
-        if (isInState(STATE_INITIAL)
-               && targetEditPart instanceof NodeEditPart)
-        {
-            final Cursor  nodeCursor = 
-                ((NodeEditPart)targetEditPart).getCursor(getLocation());
-            
-            // if the edit part specified a custom cursor and there is no
-            // active drag tracker (which would otherwise manage cursor)
-            // then set the custom cursor
-            // if we fall-through, the default behaviour will be used
-            if (nodeCursor != null
-                    && getDragTracker() == null)
-            {
-                return nodeCursor;
-            }
-        }
-        // otherwise, use super's defaults
-        return super.calculateCursor();
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/common/CommonResourceDialog.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/common/CommonResourceDialog.java
deleted file mode 100644
index 8d6b638..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/common/CommonResourceDialog.java
+++ /dev/null
@@ -1,403 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.ui.common;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.jst.jsf.common.ui.IFileFolderConstants;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.jsf.common.ui.internal.utils.WebrootUtil;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.editors.pagedesigner.PageDesignerResources;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.model.WorkbenchLabelProvider;
-
-/**
- * This dialog shows IFile type resources within a IProject domain for
- * selection. The client can prvide the suffixs of files to filter when
- * candidates are shown on the tree,
- * 
- * TODO: dead?
- * 
- * @author mengbo
- */
-class CommonResourceDialog extends TreeViewerSelectionDialog {
-	private static final int WEBROOT_FOLDER_DEPTH = 2;
-
-	// CommonResourceDialog.statusMessage = Please select an image file
-	private static final String STATUS_MESSAGE = PageDesignerResources
-			.getInstance().getString("CommonResourceDialog.statusMessage"); //$NON-NLS-1$
-
-	private String _suffixs[] = null;
-
-	private CommonResourceFilter _filter;
-
-	/** Create the logger for this class */
-	private static Logger _log = PDPlugin.getLogger(CommonResourceDialog.class);
-
-	// The content provider
-	class ProjectFileDialogContentProvider implements ITreeContentProvider {
-		/**
-		 * The visual part that is using this content provider is about to be
-		 * disposed. Deallocate all allocated SWT resources.
-		 */
-		public void dispose() {
-            // do nothing
-		}
-
-		/**
-		 * @see ITreeContentProvider#getChildren
-		 */
-		public Object[] getChildren(Object element) {
-			if (element instanceof IWorkspace) {
-				IWorkspaceRoot root = ((IWorkspace) element).getRoot();
-				IProject[] projects = root.getProjects();
-				return projects;
-			} else if (element instanceof IContainer) {
-				if (element instanceof IProject) {
-					IContainer container = (IContainer) element;
-					if (container.isAccessible()) {
-						try {
-							IResource[] members = container.members();
-							return members;
-						} catch (CoreException e) {
-							// "Error.CommonResourceDialog.0.1" = "Error in
-							// project memeber querying"
-							// "Error.CommonResourceDialog.0.2" = "Please refer
-							// to the log for details"
-							PDPlugin
-									.getAlerts()
-									.error(
-											"Error.CommonResourceDialog.0.1", "Error.CommonResourceDialog.0.2"); //$NON-NLS-1$ //$NON-NLS-2$
-							// Error.ProjectFileDialogContentProvider.0 = Core
-							// error, you may need to restart the application
-							_log
-									.error(
-											"Error.ProjectFileDialogContentProvider.0", e); //$NON-NLS-1$
-						}
-					}
-				} else if (element instanceof IFolder) {
-					// Process the folder container
-					IContainer container = (IContainer) element;
-					if (container.isAccessible()) {
-						try {
-							// Filter all the files under the project and only
-							// show
-							// the folder in the container selection dialog
-							List children = new ArrayList();
-							IResource[] members = container.members();
-							for (int i = 0; i < members.length; i++) {
-								if (!members[i].getName().equals(
-										IFileFolderConstants.FOLDER_WEBINF)
-										&& !members[i]
-												.getName()
-												.equals(
-														IFileFolderConstants.FOLDER_METAINF)) {
-									children.add(members[i]);
-								}
-							}
-							return children.toArray();
-						} catch (CoreException e) {
-							// "Error.CommonResourceDialog.0.1" = "Error in
-							// project memeber querying"
-							// "Error.CommonResourceDialog.0.2" = "Please refer
-							// to the log for details"
-							PDPlugin
-									.getAlerts()
-									.error(
-											"Error.CommonResourceDialog.0.1", "Error.CommonResourceDialog.0.2"); //$NON-NLS-1$ //$NON-NLS-2$
-							// Error.ProjectFileDialogContentProvider.0 = core
-							// error, you may need to restart the application
-							_log
-									.error(
-											"Error.ProjectFileDialogContentProvider.0", e); //$NON-NLS-1$
-						}
-					}
-				}
-			}
-			return new Object[0];
-		}
-
-		/**
-		 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements
-		 */
-		public Object[] getElements(Object element) {
-			return getChildren(element);
-		}
-
-		/**
-		 * @see ITreeContentProvider#getParent
-		 */
-		public Object getParent(Object element) {
-			if (element instanceof IResource) {
-				return ((IResource) element).getParent();
-			}
-			return null;
-		}
-
-		/**
-		 * @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren
-		 */
-		public boolean hasChildren(Object element) {
-			return getChildren(element).length > 0;
-		}
-
-		/**
-		 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged
-		 */
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-            // do nothing
-		}
-
-	}
-
-	// The default resource filter
-	static class CommonResourceFilter extends ViewerFilter {
-		private String _suffixs[] = { IFileFolderConstants.EXT_PROPERTIES };
-
-		private Logger _mylog = PDPlugin.getLogger(CommonResourceFilter.class);
-
-		private IProject _project;
-
-		/**
-		 * @return Returns the _suffixs.
-		 */
-		public String[] getSuffixs() {
-			return _suffixs;
-		}
-
-		/**
-		 * @param _suffixs
-		 *            The _suffixs to set.
-		 */
-		public void setSuffixs(String[] _suffixs) {
-			this._suffixs = _suffixs;
-		}
-
-		/**
-		 * @param project
-		 */
-		public CommonResourceFilter(IProject project) {
-			_project = project;
-		}
-
-		/**
-		 * @param project
-		 *            The _project to set.
-		 */
-		public void setProject(IProject project) {
-			this._project = project;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.ViewerFilter#select(org.eclipse.jface.viewers.Viewer,
-		 *      java.lang.Object, java.lang.Object)
-		 */
-		public boolean select(Viewer viewer, Object parentElement,
-				Object element) {
-			// TODO: This logic can be improved by add caching mechanism
-			if (element instanceof IWorkspace) {
-				return true;
-			} else if (element instanceof IFile) {
-				if (Arrays.asList(_suffixs).contains(
-						((IFile) element).getFileExtension())) {
-					return true;
-				}
-			} else if (element instanceof IContainer) {
-				if (!((IContainer) element).isAccessible()) {
-					return false;
-				}
-				if (element instanceof IProject) {
-					IProject container = (IProject) element;
-					if (isWebAppProject(container)
-							&& this.isSameProject(container, _project)) {
-						return true;
-					}
-                    return false;
-				} else if (element instanceof IFolder) {
-					IContainer container = (IContainer) element;
-					try {
-						if (container.getName().equals(
-								IFileFolderConstants.FOLDER_WEBINF)
-								|| container.getName().equals(
-										IFileFolderConstants.FOLDER_METAINF)) {
-							return false;
-						}
-						IResource[] members = container.members();
-						for (int i = 0; i < members.length; i++) {
-							{
-								if (select(viewer, members[i].getParent(),
-										members[i])) {
-									return true;
-								}
-							}
-						}
-					} catch (CoreException e) {
-						// "Error.ImgFileFilter.0" = "Error in filtering the
-						// tree", "Error.ImgFileFilter.2 = ""CoreException is
-						// thrown, please refer to error log for details"
-						// "Error.ProjectFileDialogContentProvider.0" = core
-						// error, show alert dialog to user.
-						PDPlugin
-								.getAlerts()
-								.detailError(
-										"Error.ImgFileFilter.0", "Error.ImgFileFilter.2");  //$NON-NLS-1$//$NON-NLS-2$
-						_mylog.error(
-								"Error.ProjectFileDialogContentProvider.0", e); //$NON-NLS-1$
-						return false;
-					}
-				}
-			}
-			// we don't select any other types of resources.
-			return false;
-		}
-
-		/**
-		 * Determines if a project is a Web Application project by the presence
-		 * of an associated Web Application Nature.
-		 * 
-		 * @return boolean - True, when project is a Web Application project
-		 */
-		private boolean isWebAppProject(IProject project) {
-			return WebrootUtil.isValidWebProject(project);
-		}
-
-		private boolean isSameProject(IProject orig, IProject dst) {
-			String currentProjectName = orig.getFullPath()
-					.toString().trim();
-			String projectName = dst.getFullPath().toString().trim();
-			return projectName.equalsIgnoreCase(currentProjectName);
-		}
-	}
-
-	/**
-	 * This is a dialog for common resource selection, the resouce supported
-	 * include IFolder, IProject, IFile, user can provide
-	 * 
-	 * @param parentShell
-	 * @param project
-	 */
-	public CommonResourceDialog(Shell parentShell, IProject project) {
-		super(parentShell, STATUS_MESSAGE);
-		setContentProvider(new ProjectFileDialogContentProvider());
-		setLabelProvider(WorkbenchLabelProvider
-				.getDecoratingWorkbenchLabelProvider());
-		_filter = new CommonResourceFilter(project);
-		setFilter(_filter);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.ui.common.SelectionTreeViewerDialog#findInputElement()
-	 */
-	protected Object findInputElement() {
-		return ResourcesPlugin.getWorkspace();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.ui.common.SelectionTreeViewerDialog#isValidSelection(java.lang.Object)
-	 */
-	protected boolean isValidSelection(Object selection) {
-		if (getContainerFullPath(selection) == null) {
-			return false;
-		}
-        int depth = getContainerFullPath(selection).segmentCount();
-        // The location is within WEBROOT PATH?
-        if ((selection instanceof IFile) && depth >= WEBROOT_FOLDER_DEPTH) {
-        	// Null means no filter is set
-        	if (_suffixs == null) {
-        		return true;
-        	}
-        	// The extension is supported?
-        	else if (_suffixs != null
-        			&& Arrays.asList(_suffixs).contains(
-        					((IFile) selection).getFileExtension())) {
-        		return true;
-        	}
-        }
-        // None of above conditions, invalid.
-        return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.dialogs.SelectionDialog#getResult()
-	 */
-	public Object[] getResult() {
-		Object[] objects = super.getResult();
-		if (objects == null || objects.length == 0) {
-			return null;
-		}
-		// Only one element is set by us.
-		IPath returnValue = getWebRelatedPath(objects[0]);
-		if (returnValue != null) {
-			if (!(returnValue.toString().startsWith(
-					IFileFolderConstants.PATH_SEPARATOR) || returnValue
-					.toString().startsWith("\\"))) { //$NON-NLS-1$
-				Path tempPath = new Path(IFileFolderConstants.PATH_SEPARATOR
-						+ returnValue.toString());
-				returnValue = tempPath;
-			}
-		}
-		return new Object[] { returnValue };
-	}
-
-	private IPath getContainerFullPath(Object _selectedElement) {
-		if (_selectedElement == null) {
-			return null;
-		} else if (_selectedElement instanceof IContainer) {
-			return ((IContainer) _selectedElement).getFullPath();
-		} else if (_selectedElement instanceof IFile) {
-			return ((IFile) _selectedElement).getFullPath();
-		}
-		return null;
-	}
-
-	private IPath getWebRelatedPath(Object _selectedElement) {
-		IPath result = null;
-		if (_selectedElement == null) {
-			return null;
-		} else if (_selectedElement instanceof IContainer) {
-			result = ((IContainer) _selectedElement).getFullPath();
-		} else if (_selectedElement instanceof IFile) {
-			result = ((IFile) _selectedElement).getFullPath();
-		}
-		if (result != null) {
-			if (result.segmentCount() > 2) {
-				result = result.removeFirstSegments(2);
-			}
-		}
-		return result;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/common/PartActivationHandler.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/common/PartActivationHandler.java
deleted file mode 100644
index e6bc799..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/common/PartActivationHandler.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.ui.common;
-
-import org.eclipse.swt.events.ShellAdapter;
-import org.eclipse.swt.events.ShellEvent;
-import org.eclipse.ui.IPartListener;
-import org.eclipse.ui.IWorkbenchPart;
-
-/**
- * @author mengbo
- */
-public abstract class PartActivationHandler extends ShellAdapter implements
-		IPartListener {
-	private IWorkbenchPart _activePart;
-
-	private boolean _isHandlingActivation = false;
-
-	private IWorkbenchPart _trace;
-
-	/**
-	 * @param part
-	 */
-	public PartActivationHandler(IWorkbenchPart part) {
-		_trace = part;
-	}
-
-	/**
-	 * this method is called when the specified part is activated.
-	 */
-	public abstract void handleActivation();
-
-	private void internalHandleActivation() {
-
-		if (_isHandlingActivation)
-			return;
-
-		if (_activePart == _trace) {
-			_isHandlingActivation = true;
-			try {
-				handleActivation();
-			} finally {
-				_isHandlingActivation = false;
-			}
-		}
-	}
-
-	/**
-	 * @see IPartListener#partActivated(IWorkbenchPart)
-	 */
-	public void partActivated(IWorkbenchPart part) {
-		_activePart = part;
-		internalHandleActivation();
-	}
-
-	/**
-	 * @see IPartListener#partBroughtToTop(IWorkbenchPart)
-	 */
-	public void partBroughtToTop(IWorkbenchPart part) {
-        // do nothing
-	}
-
-	/**
-	 * @see IPartListener#partClosed(IWorkbenchPart)
-	 */
-	public void partClosed(IWorkbenchPart part) {
-        // do nothing
-	}
-
-	/**
-	 * @see IPartListener#partDeactivated(IWorkbenchPart)
-	 */
-	public void partDeactivated(IWorkbenchPart part) {
-		_activePart = null;
-	}
-
-	/**
-	 * @see IPartListener#partOpened(IWorkbenchPart)
-	 */
-	public void partOpened(IWorkbenchPart part) {
-        // do nothing
-	}
-
-	/*
-	 * @see ShellListener#shellActivated(ShellEvent)
-	 */
-	public void shellActivated(ShellEvent e) {
-		internalHandleActivation();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/common/ResourceOnClasspathDialog.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/common/ResourceOnClasspathDialog.java
deleted file mode 100644
index 6065899..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/common/ResourceOnClasspathDialog.java
+++ /dev/null
@@ -1,255 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.ui.common;
-
-import java.io.File;
-import java.util.Arrays;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.jdt.core.IJarEntryResource;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.ui.JavaElementLabelProvider;
-import org.eclipse.jdt.ui.StandardJavaElementContentProvider;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.jst.jsf.common.ui.IFileFolderConstants;
-import org.eclipse.jst.pagedesigner.editors.pagedesigner.PageDesignerResources;
-import org.eclipse.jst.pagedesigner.utils.JavaUtil;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * This dialog will let client to select resources that located on a
- * IJavaProject classpath, the client can provide a list of files suffixs to
- * filter.
- * 
- * @author mengbo
- */
-// TODO: Since many jar files might do nothing to do with client's selection, we
-// may need to provides more filter choice
-// to clients to exclude unnecessary jar files, such as that are located in JDK
-// dir.
-public class ResourceOnClasspathDialog extends TreeViewerSelectionDialog {
-	// ResourcesOnClasspathDialog.statusMessage = Please select a property file
-	private static final String STATUS_MESSAGE = PageDesignerResources
-			.getInstance()
-			.getString("ResourcesOnClasspathDialog.statusMessage"); //$NON-NLS-1$
-
-	private IJavaProject _javaProject;
-
-	// the suffixs of files that can be selected
-	private String _suffixs[]; // =
-
-	// IJMTConstants.DEFAULT_SUFFIX;
-
-	private ResourceOnClasspathFilter _filter;
-
-	// Client doesn't need to know it.
-	class ResourceOnClasspathFilter extends ViewerFilter {
-		StandardJavaElementContentProvider _javaContentProvider;
-
-		/**
-		 * @param contentProvider
-		 */
-		public ResourceOnClasspathFilter(
-				StandardJavaElementContentProvider contentProvider) {
-			_javaContentProvider = contentProvider;
-		}
-
-		/**
-		 * Set the suffixs of files need to be selected.
-		 * 
-		 * @param suffixs
-		 */
-		public void setSuffixs(String suffixs[]) {
-			_suffixs = suffixs;
-		}
-
-		/**
-		 * @param contentProvider
-		 *            The _javaContentProvider to set.
-		 */
-		public void setJavaContentProvider(
-				StandardJavaElementContentProvider contentProvider) {
-			_javaContentProvider = contentProvider;
-		}
-
-		/**
-		 * @param project
-		 *            The _javaProject to set.
-		 */
-		public void setJavaProject(IJavaProject project) {
-			_javaProject = project;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.ViewerFilter#select(org.eclipse.jface.viewers.Viewer,
-		 *      java.lang.Object, java.lang.Object)
-		 */
-		public boolean select(Viewer viewer, Object parentElement,
-				Object element) {
-			// TODO: This logic can be improved by add caching mechanism
-			if (element instanceof IJavaProject) {
-				String currentProjectName = ((IJavaProject) element)
-						.getProject().getFullPath().toString().trim();
-				String projectName = _javaProject.getProject().getFullPath()
-						.toString().trim();
-				if (projectName.equalsIgnoreCase(currentProjectName)) {
-					return true;
-				}
-                return false;
-			} else if (element instanceof IResource) {
-				if (((_javaProject != null) && !_javaProject
-						.isOnClasspath((IResource) element))) {
-					return false;
-				}
-				if (element instanceof IFile) {
-					if (Arrays.asList(_suffixs).contains(
-							((IFile) element).getFileExtension())) {
-						return true;
-					}
-				}
-				return false;
-			}
-
-			if (element instanceof IJarEntryResource) {
-				String ext = ((IJarEntryResource) element).getFullPath()
-						.getFileExtension();
-				if (ext != null && Arrays.asList(_suffixs).contains(ext)) {
-					return true;
-				}
-                return false;
-			}
-			if (!(element instanceof IJavaElement)) {
-				return false;
-			}
-			if (((_javaProject != null) && !_javaProject
-					.isOnClasspath((IJavaElement) element))) {
-				return false;
-			}
-			IJavaElement javaElement = (IJavaElement) element;
-			Object[] children = null;
-			switch (javaElement.getElementType()) {
-			case IJavaElement.PACKAGE_FRAGMENT_ROOT:
-				children = _javaContentProvider.getChildren(javaElement);
-				break;
-			case IJavaElement.IMPORT_CONTAINER:
-				return true;
-			case IJavaElement.PACKAGE_FRAGMENT:
-				children = _javaContentProvider.getChildren(javaElement);
-				break;
-			case IJavaElement.CLASS_FILE:
-				if (Arrays.asList(_suffixs).contains(
-						IFileFolderConstants.EXT_CLASS)) {
-					return true;
-				} 
-				return false;
-			case IJavaElement.COMPILATION_UNIT:
-				String ext = javaElement.getPath().getFileExtension();
-				if (ext != null && Arrays.asList(_suffixs).contains(ext)) {
-					return true;
-				} 
-				return false;
-			default:
-				return false;
-			}
-
-			for (int i = 0; i < children.length; i++) {
-				if (select(viewer, javaElement, children[i])) {
-					return true;
-				}
-			}
-			// Either the resouce or its children are not for displaying.
-			return false;
-		}
-	}
-
-	/**
-	 * Set the suffixs of files need to be selected.
-	 * 
-	 * @param suffixs
-	 */
-	public void setSuffixs(String suffixs[]) {
-		_suffixs = suffixs;
-		_filter.setSuffixs(suffixs);
-	}
-
-	/**
-	 * @param parentShell
-	 * @param project
-	 */
-	public ResourceOnClasspathDialog(Shell parentShell, IJavaProject project) {
-		super(parentShell, STATUS_MESSAGE);
-		// set provider and filter
-		StandardJavaElementContentProvider contentProvider = new StandardJavaElementContentProvider();
-		setContentProvider(contentProvider);
-		setLabelProvider(new JavaElementLabelProvider());
-		_filter = new ResourceOnClasspathFilter(contentProvider);
-		setFilter(_filter);
-		// store the project
-		_javaProject = project;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.dialogs.SelectionDialog#getResult()
-	 */
-	public Object[] getResult() {
-		Object[] objects = super.getResult();
-		if (objects == null || objects.length == 0) {
-			return null;
-		}
-		IPath path = JavaUtil.getPathOnClasspath(_javaProject, objects[0]);
-		String result = null;
-		if (path.segmentCount() == 0) {
-			return new Object[] { "" }; //$NON-NLS-1$
-		}
-		path = path.removeFileExtension();
-		result = path.toOSString();
-		result = result.replace(File.separatorChar, '.');
-		return new Object[] { result };
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.ui.common.SelectionTreeViewerDialog#isValidSelection()
-	 */
-	protected boolean isValidSelection(Object selection) {
-		String extension = JavaUtil.getPathOnClasspath(_javaProject, selection)
-				.getFileExtension();
-		return (extension != null && Arrays.asList(_suffixs)
-				.contains(extension));
-	}
-
-	protected Object findInputElement() {
-		Object input = ResourcesPlugin.getWorkspace();
-		if (input instanceof IWorkspace) {
-			return JavaCore.create(((IWorkspace) input).getRoot());
-		} else if (input instanceof IContainer) {
-			IJavaElement element = JavaCore.create((IContainer) input);
-			if (element != null && element.exists())
-				return element;
-			return input;
-		}
-		return JavaCore.create(ResourcesPlugin.getWorkspace().getRoot());
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/common/TreeViewerSelectionDialog.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/common/TreeViewerSelectionDialog.java
deleted file mode 100644
index 097f048..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/common/TreeViewerSelectionDialog.java
+++ /dev/null
@@ -1,328 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.ui.common;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.jface.viewers.DoubleClickEvent;
-import org.eclipse.jface.viewers.IDoubleClickListener;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.jface.viewers.ViewerSorter;
-import org.eclipse.jst.jsf.common.ui.internal.guiutils.SWTUtils;
-import org.eclipse.jst.pagedesigner.editors.pagedesigner.PageDesignerResources;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.dialogs.SelectionDialog;
-import org.eclipse.ui.part.DrillDownComposite;
-
-/**
- * This is a base dialog that uses TreeViewer to show selections, subclass needs
- * to provide IContentProvider, ILabelProvider and ViewerFilter for the
- * TreeViewer. Subclass needs to implement isValidSelection(), which valids the
- * selection, and findInputElement() which provides the root element of the
- * tree. Besides, subclass might need to implement getResult() to return a
- * customized result.
- * 
- * @author mengbo
- */
-abstract class TreeViewerSelectionDialog extends SelectionDialog {
-	// = "Select a file"
-	private static final String DEFAULT_TITLE = PageDesignerResources
-			.getInstance().getString("TreeViewerSelectionDialog.Title"); //$NON-NLS-1$
-
-	/** Used to tag the image type */
-	static final int STYLE_NONE = 0;
-
-	static final int STYLE_INFORMATION = 1;
-
-	static final int STYLE_ERROR = 2;
-
-	static final int STYLE_WARNING = 3;
-
-	/** Sizi of the TreeViewer composite */
-	private static final int SIZING_SELECTION_PANE_HEIGHT = 300;
-
-	private static final int SIZING_SELECTION_PANE_WIDTH = 320;
-
-	private String _title = DEFAULT_TITLE;
-
-	// the seleciton on the treeviewer.
-	private static Object _selection;
-
-	// providers
-	private ITreeContentProvider _contentProvider;
-
-	private ILabelProvider _labelProvider;
-
-	private ViewerFilter _filter;
-
-	/** The validation image */
-	private Label _statusImage;
-
-	/** The validation message */
-	private Label _statusLabel;
-
-	private String _statusMessage;
-
-	// private IJavaProject _project;
-	/** The selection tree */
-	private TreeViewer _treeViewer;
-
-	/**
-	 * @param parentShell
-	 * @param statusMessage 
-	 */
-	public TreeViewerSelectionDialog(Shell parentShell, String statusMessage) {
-		super(parentShell);
-		_statusMessage = statusMessage;
-		// ? need SWT.RESIZE
-		setShellStyle(getShellStyle());
-	}
-
-	/**
-	 * Returns a new drill down viewer for this dialog.
-	 * @param parent 
-	 * 
-	 */
-	protected void createTreeViewer(Composite parent) {
-		// Create drill down
-		DrillDownComposite drillDown = new DrillDownComposite(parent,
-				SWT.BORDER);
-		GridData spec = new GridData(GridData.VERTICAL_ALIGN_FILL
-				| GridData.HORIZONTAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL
-				| GridData.GRAB_VERTICAL);
-		spec.widthHint = SIZING_SELECTION_PANE_WIDTH;
-		spec.heightHint = SIZING_SELECTION_PANE_HEIGHT;
-		drillDown.setLayoutData(spec);
-		_treeViewer = new TreeViewer(drillDown, SWT.NONE);
-		drillDown.setChildTree(_treeViewer);
-	}
-
-	private void setTreeViewerProviders() {
-		_treeViewer.setContentProvider(_contentProvider);
-		_treeViewer.setLabelProvider(_labelProvider);
-		_treeViewer.setSorter(new ViewerSorter());
-		_treeViewer
-				.addSelectionChangedListener(new ISelectionChangedListener() {
-					public void selectionChanged(SelectionChangedEvent event) {
-						_selection = getSelectedElement((IStructuredSelection) event
-								.getSelection());
-						updateStatus();
-					}
-				});
-		_treeViewer.addDoubleClickListener(new IDoubleClickListener() {
-			public void doubleClick(DoubleClickEvent event) {
-				ISelection selection = event.getSelection();
-				if (selection instanceof IStructuredSelection) {
-					Object item = ((IStructuredSelection) selection)
-							.getFirstElement();
-					if (_treeViewer.getExpandedState(item)) {
-						_treeViewer.collapseToLevel(item, 1);
-					} else {
-						_treeViewer.expandToLevel(item, 1);
-					}
-				}
-			}
-		});
-		_treeViewer.setInput(findInputElement());
-
-		if (_filter != null) {
-			// Assert.isLegal(_contentProvider instanceof
-			// StandardJavaElementContentProvider);
-			_treeViewer.addFilter(_filter);
-		}
-
-	}
-
-	/**
-	 * Creates the contents of the composite.
-	 * @param parent 
-	 */
-	public void createTreeViewerComposite(Composite parent) {
-		Composite treeViewerComposite = new Composite(parent, SWT.NONE);
-		GridLayout layout = new GridLayout();
-		layout.marginWidth = 0;
-		treeViewerComposite.setLayout(layout);
-		GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
-		gridData.horizontalSpan = 2;
-		treeViewerComposite.setLayoutData(gridData);
-		Label label = new Label(treeViewerComposite, SWT.WRAP);
-		label.setText(_title);
-		label.setFont(treeViewerComposite.getFont());
-		createTreeViewer(treeViewerComposite);
-		Dialog.applyDialogFont(treeViewerComposite);
-	}
-
-	/**
-	 * Sets the selected existing container.
-	 * 
-	 * @param selection -
-	 *            the current selected container.
-	 */
-	public void setSelectedElement(Object selection) {
-		// Expand to and select the specified container
-		if (_selection != null) {
-			_treeViewer.expandToLevel(_selection, 1);
-		}
-		List itemsToExpand = new ArrayList();
-		Object parent = _contentProvider.getParent(selection);
-		if (parent == null) {
-			return;
-		}
-		while (parent != null) {
-			itemsToExpand.add(0, parent);
-			parent = _contentProvider.getParent(parent);
-		}
-		_treeViewer.setExpandedElements(itemsToExpand.toArray());
-		_treeViewer.setSelection(new StructuredSelection(selection), true);
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on Dialog.
-	 */
-	protected Control createDialogArea(Composite parent) {
-		Composite area = (Composite) super.createDialogArea(parent);
-		GridLayout gridLayout = new GridLayout();
-		gridLayout.numColumns = 2;
-		area.setLayout(gridLayout);
-
-		// Container treeviewer composite
-		createTreeViewerComposite(area);
-
-		_statusImage = SWTUtils.createLabelImage(area,
-				getMessageImage(STYLE_ERROR), 1, null);
-		_statusLabel = SWTUtils.createLabel(area, "", 1); //$NON-NLS-1$
-		// Link to model
-		setTreeViewerProviders();
-
-		return dialogArea;
-	}
-
-	private Object getSelectedElement(IStructuredSelection selection) {
-		return selection.getFirstElement();
-	}
-
-	/**
-	 * @param provider
-	 *            The _contentProvider to set.
-	 */
-	public void setContentProvider(ITreeContentProvider provider) {
-		_contentProvider = provider;
-	}
-
-	/**
-	 * @param provider
-	 *            The _labelProvider to set.
-	 */
-	public void setLabelProvider(ILabelProvider provider) {
-		_labelProvider = provider;
-	}
-
-	/**
-	 * @param filter
-	 *            The _filter to set.
-	 */
-	public void setFilter(ViewerFilter filter) {
-		this._filter = filter;
-	}
-
-
-	/**
-	 * Update the status message
-	 */
-	private void updateStatus() {
-		if (isValidSelection(_selection)) {
-			_statusImage.setImage(getMessageImage(STYLE_NONE));
-			_statusLabel.setText(""); //$NON-NLS-1$
-			getOkButton().setEnabled(true);
-		} else {
-			_statusImage.setImage(getMessageImage(STYLE_ERROR));
-			_statusLabel.setText(_statusMessage);
-			getOkButton().setEnabled(false);
-		}
-	}
-
-	/**
-	 * Get the different message according the message type.
-	 * 
-	 * @param imageType 
-	 * 
-	 * @return Image - the message image
-	 */
-	protected Image getMessageImage(int imageType) {
-		switch (imageType) {
-		case STYLE_ERROR:
-			return JFaceResources.getImage(Dialog.DLG_IMG_MESSAGE_ERROR);
-		case STYLE_WARNING:
-			return JFaceResources.getImage(Dialog.DLG_IMG_MESSAGE_WARNING);
-		case STYLE_INFORMATION:
-			return JFaceResources.getImage(Dialog.DLG_IMG_MESSAGE_INFO);
-		default:
-			return null;
-		}
-	}
-
-	/**
-	 * The <code>ContainerSelectionDialog</code> implementation of this
-	 * <code>Dialog</code> method builds a list of the selected resource
-	 * containers for later retrieval by the client and closes this dialog.
-	 */
-	protected void okPressed() {
-		List chosenContainerPathList = new ArrayList();
-		if (_selection != null) {
-			chosenContainerPathList.add(_selection);
-		}
-		setResult(chosenContainerPathList);
-		super.okPressed();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.window.Window#createContents(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Control createContents(Composite parent) {
-		Control control = super.createContents(parent);
-		if (_selection != null) {
-			this.setSelectedElement(_selection);
-		}
-		return control;
-	}
-
-	/**
-	 * @param selection
-	 * @return true if the selection is valid
-	 */
-	protected abstract boolean isValidSelection(Object selection);
-
-	/**
-	 * @return the input element
-	 */
-	protected abstract Object findInputElement();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/common/sash/NestedEditorActionBarContributor.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/common/sash/NestedEditorActionBarContributor.java
deleted file mode 100644
index 2e0a2c0..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/common/sash/NestedEditorActionBarContributor.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.ui.common.sash;
-
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.part.MultiPageEditorActionBarContributor;
-
-/**
- * This contributor should be used when a SashEditor is inside a multipage
- * editor.
- * 
- * @author mengbo
- * @version 1.5
- */
-public abstract class NestedEditorActionBarContributor extends
-		MultiPageEditorActionBarContributor {
-	/**
-	 * Child class should not override this method.
-	 */
-	public final void setActivePage(IEditorPart activeEditor) {
-		if (activeEditor instanceof SashEditorPart) {
-			activeEditor = ((SashEditorPart) activeEditor).getActiveEditor();
-		}
-
-		setInnerActivePage(activeEditor);
-	}
-
-	/**
-	 * Child class should override this method
-	 * 
-	 * @param activeEditor
-	 */
-	public abstract void setInnerActivePage(IEditorPart activeEditor);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/common/sash/SashEditorPart.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/common/sash/SashEditorPart.java
deleted file mode 100644
index ddaf592..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/common/sash/SashEditorPart.java
+++ /dev/null
@@ -1,531 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.ui.common.sash;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.SafeRunner;
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.jface.util.SafeRunnable;
-import org.eclipse.jface.viewers.IPostSelectionProvider;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jst.jsf.common.ui.internal.guiutils.SWTUtils;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.SashForm;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.ui.IEditorActionBarContributor;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.IKeyBindingService;
-import org.eclipse.ui.INestableKeyBindingService;
-import org.eclipse.ui.IPropertyListener;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.part.EditorPart;
-import org.eclipse.ui.part.MultiPageEditorActionBarContributor;
-import org.eclipse.ui.part.MultiPageEditorSite;
-
-/**
- * This class emulates the MultiPageEditorPart. But instead of using multipage,
- * it use SashForm to separate the editors.
- * 
- * @author mengbo
- */
-public abstract class SashEditorPart extends EditorPart {
-	private int _orientation = SWT.VERTICAL;
-
-	private SashForm _sashForm;
-
-	/**
-	 * List of nested editors. Element type: IEditorPart. Need to hang onto them
-	 * here, in addition to using get/setData on the items, because dispose()
-	 * needs to access them, but widgetry has already been disposed at that
-	 * point.
-	 */
-	private ArrayList _nestedEditors = new ArrayList(3);
-
-	private Map _editorToComposite = new HashMap();
-
-	private IEditorPart _activeEditor = null;
-
-	/**
-	 * Creates and adds a new page containing the given editor to this
-	 * multi-page editor. The page is added at the given index. This also hooks
-	 * a property change listener on the nested editor.
-	 * 
-	 * @param editor
-	 *            the nested editor
-	 * @param input
-	 *            the input for the nested editor
-	 * @exception PartInitException
-	 *                if a new page could not be created
-	 * @see org.eclipse.ui.part.MultiPageEditorPart#handlePropertyChange(int) the handler for
-	 *      property change events from the nested editor
-	 */
-	public void addPage(final IEditorPart editor, IEditorInput input)
-			throws PartInitException {
-		IEditorSite site = createSite(editor);
-		// call init first so that if an exception is thrown, we have created no
-		// new widgets
-		editor.init(site, input);
-		final Composite parent1 = new Composite(getContainer(), SWT.NONE);
-		FillLayout fillLayout = new FillLayout();
-		fillLayout.marginWidth = fillLayout.marginHeight = 1;
-		parent1.setLayout(fillLayout);
-
-		parent1.addListener(SWT.Activate, new Listener() {
-			public void handleEvent(Event event) {
-				if (event.type == SWT.Activate) {
-					activeEditorChanged(editor);
-					parent1.setBackground(ColorConstants.green);
-				}
-			}
-		});
-		parent1.addListener(SWT.Deactivate, new Listener() {
-			public void handleEvent(Event event) {
-				parent1.setBackground(ColorConstants.titleInactiveBackground);
-			}
-		});
-		SWTUtils.workaroundResize(parent1);
-		editor.createPartControl(parent1);
-		editor.addPropertyListener(new IPropertyListener() {
-			public void propertyChanged(Object source, int propertyId) {
-				SashEditorPart.this.handlePropertyChange(propertyId);
-			}
-		});
-
-		_nestedEditors.add(editor);
-		_editorToComposite.put(editor, parent1);
-
-		connectPage(editor);
-	}
-
-	/**
-	 * @param editor
-	 */
-	protected void connectPage(IEditorPart editor) {
-		ISelectionProvider editSelectionProvider = editor.getSite()
-				.getSelectionProvider();
-		if (editSelectionProvider instanceof IPostSelectionProvider) {
-			((IPostSelectionProvider) editSelectionProvider)
-					.addPostSelectionChangedListener(new ISelectionChangedListener() {
-						public void selectionChanged(SelectionChangedEvent event) {
-							((SashEditorSelectionProvider) getSite()
-									.getSelectionProvider())
-									.firePostSelectionChanged(event);
-						}
-					});
-		} else {
-			editSelectionProvider
-					.addSelectionChangedListener(new ISelectionChangedListener() {
-
-						public void selectionChanged(SelectionChangedEvent event) {
-							((SashEditorSelectionProvider) getSite()
-									.getSelectionProvider())
-									.fireSelectionChanged(event);
-						}
-					});
-		}
-	}
-
-	/**
-	 * Creates an empty container. Creates a CTabFolder with no style bits set,
-	 * and hooks a selection listener which calls <code>pageChange()</code>
-	 * whenever the selected tab changes.
-	 * 
-	 * @param parent
-	 *            The composite in which the container tab folder should be
-	 *            created; must not be <code>null</code>.
-	 * @return a new container
-	 */
-	private SashForm createContainer(Composite parent) {
-		// use SWT.FLAT style so that an extra 1 pixel border is not reserved
-		// inside the folder
-		SashForm newContainer = new SashForm(parent, SWT.NONE);
-		SWTUtils.workaroundResize(newContainer);
-		newContainer.setOrientation(_orientation);
-		return newContainer;
-	}
-
-	/**
-	 * @throws PartInitException
-	 */
-	abstract protected void createPages() throws PartInitException;
-
-	/**
-	 * The <code>MultiPageEditor</code> implementation of this
-	 * <code>IWorkbenchPart</code> method creates the control for the
-	 * multi-page editor by calling <code>createContainer</code>, then
-	 * <code>createPages</code>. Subclasses should implement
-	 * <code>createPages</code> rather than overriding this method.
-	 * 
-	 * @param parent
-	 *            The parent in which the editor should be created; must not be
-	 *            <code>null</code>.
-	 */
-	public final void createPartControl(Composite parent) {
-		this._sashForm = createContainer(parent);
-
-		try {
-			createPages();
-		} catch (PartInitException ex) {
-			ex.printStackTrace();
-		}
-		// set the active page (page 0 by default), unless it has already been
-		// done
-		if (getActiveEditor() == null) {
-			if (!_nestedEditors.isEmpty()) {
-				setActiveEditor((IEditorPart) _nestedEditors.get(0));
-			}
-		}
-	}
-
-	/**
-	 * Creates the site for the given nested editor. The
-	 * <code>MultiPageEditorPart</code> implementation of this method creates
-	 * an instance of <code>MultiPageEditorSite</code>. Subclasses may
-	 * reimplement to create more specialized sites.
-	 * 
-	 * @param editor
-	 *            the nested editor
-	 * @return the editor site
-	 */
-	protected IEditorSite createSite(IEditorPart editor) {
-		return new SashEditorSite(this, editor);
-	}
-
-	/**
-	 * The <code>MultiPageEditorPart</code> implementation of this
-	 * <code>IWorkbenchPart</code> method disposes all nested editors.
-	 * Subclasses may extend.
-	 */
-	public void dispose() {
-		_activeEditor = null;
-		for (int i = 0; i < _nestedEditors.size(); ++i) {
-			IEditorPart editor = (IEditorPart) _nestedEditors.get(i);
-			disposePart(editor);
-		}
-		_nestedEditors.clear();
-		_editorToComposite.clear();
-	}
-
-	/**
-	 * Returns the active nested editor if there is one.
-	 * <p>
-	 * Subclasses should not override this method
-	 * </p>
-	 * 
-	 * @return the active nested editor, or <code>null</code> if none
-	 */
-	public IEditorPart getActiveEditor() {
-		return _activeEditor;
-	}
-
-	/**
-	 * Returns the composite control containing this multi-page editor's pages.
-	 * This should be used as the parent when creating controls for the
-	 * individual pages. That is, when calling <code>addPage(Control)</code>,
-	 * the passed control should be a child of this container.
-	 * <p>
-	 * Warning: Clients should not assume that the container is any particular
-	 * subclass of Composite. The actual class used may change in order to
-	 * improve the look and feel of multi-page editors. Any code making
-	 * assumptions on the particular subclass would thus be broken.
-	 * </p>
-	 * <p>
-	 * Subclasses should not override this method
-	 * </p>
-	 * 
-	 * @return the composite, or <code>null</code> if
-	 *         <code>createPartControl</code> has not been called yet
-	 */
-	protected Composite getContainer() {
-		return _sashForm;
-	}
-
-	/**
-	 * Returns the editor for the given page index. The page index must be
-	 * valid.
-	 * 
-	 * @param pageIndex
-	 *            the index of the page
-	 * @return the editor for the specified page, or <code>null</code> if the
-	 *         specified page was not created with
-	 *         <code>addPage(IEditorPart,IEditorInput)</code>
-	 */
-	protected IEditorPart getEditor(int pageIndex) {
-		return (IEditorPart) _nestedEditors.get(pageIndex);
-	}
-
-	/**
-	 * Handles a property change notification from a nested editor. The default
-	 * implementation simply forwards the change to listeners on this multi-page
-	 * editor by calling <code>firePropertyChange</code> with the same
-	 * property id. For example, if the dirty state of a nested editor changes
-	 * (property id <code>IEditorPart.PROP_DIRTY</code>), this method handles
-	 * it by firing a property change event for
-	 * <code>IEditorPart.PROP_DIRTY</code> to property listeners on this
-	 * multi-page editor.
-	 * <p>
-	 * Subclasses may extend or reimplement this method.
-	 * </p>
-	 * 
-	 * @param propertyId
-	 *            the id of the property that changed
-	 */
-	protected void handlePropertyChange(int propertyId) {
-		firePropertyChange(propertyId);
-	}
-
-	/**
-	 * The <code>MultiPageEditorPart</code> implementation of this
-	 * <code>IEditorPart</code> method sets its site to the given site, its
-	 * input to the given input, and the site's selection provider to a
-	 * <code>MultiPageSelectionProvider</code>. Subclasses may extend this
-	 * method.
-	 * 
-	 * @param site
-	 *            The site for which this part is being created; must not be
-	 *            <code>null</code>.
-	 * @param input
-	 *            The input on which this editor should be created; must not be
-	 *            <code>null</code>.
-	 * @throws PartInitException
-	 *             If the initialization of the part fails -- currently never.
-	 */
-	public void init(IEditorSite site, IEditorInput input)
-			throws PartInitException {
-		setSite(site);
-		setInput(input);
-		site.setSelectionProvider(new SashEditorSelectionProvider(this));
-	}
-
-	/**
-	 * The <code>MultiPageEditorPart</code> implementation of this
-	 * <code>IEditorPart</code> method returns whether the contents of any of
-	 * this multi-page editor's nested editors have changed since the last save.
-	 * Pages created with <code>addPage(Control)</code> are ignored.
-	 * <p>
-	 * Subclasses may extend or reimplement this method.
-	 * </p>
-	 * 
-	 * @return <code>true</code> if any of the nested editors are dirty;
-	 *         <code>false</code> otherwise.
-	 */
-	public boolean isDirty() {
-		// use nestedEditors to avoid SWT requests; see bug 12996
-		for (Iterator i = _nestedEditors.iterator(); i.hasNext();) {
-			IEditorPart editor = (IEditorPart) i.next();
-			if (editor.isDirty()) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * Notifies this multi-page editor that the page with the given id has been
-	 * activated. This method is called when the user selects a different tab.
-	 * <p>
-	 * The <code>MultiPageEditorPart</code> implementation of this method sets
-	 * focus to the new page, and notifies the action bar contributor (if there
-	 * is one). This checks whether the action bar contributor is an instance of
-	 * <code>MultiPageEditorActionBarContributor</code>, and, if so, calls
-	 * <code>setActivePage</code> with the active nested editor. This also
-	 * fires a selection change event if required.
-	 * </p>
-	 * <p>
-	 * Subclasses may extend this method.
-	 * </p>
-	 * @param activeEditor 
-	 * 
-	 */
-	protected void activeEditorChanged(IEditorPart activeEditor) {
-		setActiveEditor(activeEditor);
-		setFocus();
-
-		IEditorSite site = getEditorSite();
-		while (site != null) {
-			IEditorActionBarContributor contributor = site
-					.getActionBarContributor();
-			if (contributor instanceof MultiPageEditorActionBarContributor) {
-				((MultiPageEditorActionBarContributor) contributor)
-						.setActivePage(activeEditor);
-			}
-			if (site instanceof MultiPageEditorSite) {
-				site = (IEditorSite) ((MultiPageEditorSite) site)
-						.getMultiPageEditor().getSite();
-			} else if (site instanceof SashEditorSite) {
-				site = (IEditorSite) ((SashEditorSite) site).getSashEditor()
-						.getSite();
-			} else {
-				site = null;
-			}
-		}
-
-		if (activeEditor != null) {
-			// Workaround for 1GAUS7C: ITPUI:ALL - Editor not activated when
-			// restored from previous session
-			// do not need second if once fixed
-			ISelectionProvider selectionProvider = activeEditor.getSite()
-					.getSelectionProvider();
-			if (selectionProvider != null) {
-				SelectionChangedEvent event = new SelectionChangedEvent(
-						selectionProvider, selectionProvider.getSelection());
-				((SashEditorSelectionProvider) getSite().getSelectionProvider())
-						.fireSelectionChanged(event);
-			}
-		}
-	}
-
-	/**
-	 * Disposes the given part and its site.
-	 * 
-	 * @param part
-	 *            The part to dispose; must not be <code>null</code>.
-	 */
-	private void disposePart(final IWorkbenchPart part) {
-        SafeRunner.run(new SafeRunnable() {
-			public void run() {
-				if (part.getSite() instanceof SashEditorSite) {
-					SashEditorSite partSite = (SashEditorSite) part.getSite();
-					partSite.dispose();
-				}
-				part.dispose();
-			}
-
-			public void handleException(Throwable e) {
-				// Exception has already being logged by Core. Do nothing.
-			}
-		});
-	}
-
-	/**
-	 * Sets the currently active page.
-	 * @param part
-	 * 
-	 */
-	protected void setActiveEditor(IEditorPart part) {
-		_activeEditor = part;
-	}
-
-	/**
-	 * The <code>MultiPageEditor</code> implementation of this
-	 * <code>IWorkbenchPart</code> method sets focus on the active nested
-	 * editor, if there is one.
-	 * <p>
-	 * Subclasses may extend or reimplement.
-	 * </p>
-	 */
-	public void setFocus() {
-		setFocus(getActiveEditor());
-	}
-
-	/**
-	 * Sets focus to the control for the given page. If the page has an editor,
-	 * this calls its <code>setFocus()</code> method. Otherwise, this calls
-	 * <code>setFocus</code> on the control for the page.
-	 * 
-	 * @param pageIndex
-	 *            the index of the page
-	 */
-	private void setFocus(IEditorPart editor) {
-		final IKeyBindingService service = getSite().getKeyBindingService();
-
-		if (editor == null) {
-			// There is no selected page, so deactivate the active service.
-			if (service instanceof INestableKeyBindingService) {
-				final INestableKeyBindingService nestableService = (INestableKeyBindingService) service;
-				nestableService.activateKeyBindingService(null);
-			} else {
-				//WorkbenchPlugin
-				PDPlugin
-				    .getLogger(getClass()).error("MultiPageEditorPart.setFocus()   Parent key binding service was not an instance of INestableKeyBindingService.  It was an instance of " + service.getClass().getName() + " instead."); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-			return;
-		}
-        editor.setFocus();
-        // There is no selected page, so deactivate the active service.
-        if (service instanceof INestableKeyBindingService) {
-        	final INestableKeyBindingService nestableService = (INestableKeyBindingService) service;
-        	if (editor != null) {
-        		nestableService.activateKeyBindingService(editor
-        				.getEditorSite());
-        	} else {
-        		nestableService.activateKeyBindingService(null);
-        	}
-        } else {
-            PDPlugin
-                .getLogger(getClass()).error("MultiPageEditorPart.setFocus()   Parent key binding service was not an instance of INestableKeyBindingService.  It was an instance of " + service.getClass().getName() + " instead."); //$NON-NLS-1$ //$NON-NLS-2$
-        }
-	}
-
-	public void doSave(IProgressMonitor monitor) {
-		if (_activeEditor != null) {
-			_activeEditor.doSave(monitor);
-		}
-	}
-
-	public void doSaveAs() {
-		if (_activeEditor != null) {
-			_activeEditor.doSaveAs();
-		}
-
-	}
-
-	public boolean isSaveAsAllowed() {
-		if (_activeEditor != null)
-        {
-			return _activeEditor.isSaveAsAllowed();
-        }
-		return false;
-	}
-
-	/**
-	 * @param orientation
-	 */
-	public void setOrientation(int orientation) {
-		this._orientation = orientation;
-		if (_sashForm != null && !_sashForm.isDisposed()) {
-			_sashForm.setMaximizedControl(null);
-			_sashForm.setOrientation(_orientation);
-		}
-	}
-
-	/**
-	 * @param part
-	 */
-	public void setMaximizedEditor(IEditorPart part) {
-		if (part != null) {
-			Composite c = (Composite) _editorToComposite.get(part);
-			if (c != null && _sashForm != null && !_sashForm.isDisposed()) {
-				_sashForm.setMaximizedControl(c);
-				part.setFocus();
-			}
-		} else {
-			if (_sashForm != null && !_sashForm.isDisposed()) {
-				_sashForm.setMaximizedControl(null);
-			}
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/common/sash/SashEditorSelectionProvider.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/common/sash/SashEditorSelectionProvider.java
deleted file mode 100644
index 2f47aaa..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/common/sash/SashEditorSelectionProvider.java
+++ /dev/null
@@ -1,155 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.ui.common.sash;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.ListenerList;
-import org.eclipse.core.runtime.SafeRunner;
-import org.eclipse.jface.util.SafeRunnable;
-import org.eclipse.jface.viewers.IPostSelectionProvider;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.ui.IEditorPart;
-
-/**
- * @author mengbo
- */
-public class SashEditorSelectionProvider implements IPostSelectionProvider {
-
-	/**
-	 * Registered selection changed listeners (element type:
-	 * <code>ISelectionChangedListener</code>).
-	 */
-	private ListenerList _listeners = new ListenerList(ListenerList.IDENTITY);
-
-	private ListenerList _postSelectionChangedListeners = new ListenerList(ListenerList.IDENTITY);
-
-	/**
-	 * The multi-page editor.
-	 */
-	private SashEditorPart _sashEditor;
-
-	/**
-	 * Creates a selection provider for the given multi-page editor.
-	 * 
-	 * @param sashEditor
-	 *            the multi-page editor
-	 */
-	public SashEditorSelectionProvider(SashEditorPart sashEditor) {
-		Assert.isNotNull(sashEditor);
-		this._sashEditor = sashEditor;
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on <code>ISelectionProvider</code>.
-	 */
-	public void addSelectionChangedListener(ISelectionChangedListener listener) {
-		_listeners.add(listener);
-	}
-
-	/**
-	 * Notifies all registered selection changed listeners that the editor's
-	 * selection has changed. Only listeners registered at the time this method
-	 * is called are notified.
-	 * 
-	 * @param event
-	 *            the selection changed event
-	 */
-	public void fireSelectionChanged(final SelectionChangedEvent event) {
-		Object[] listeners = this._listeners.getListeners();
-		for (int i = 0; i < listeners.length; ++i) {
-			final ISelectionChangedListener l = (ISelectionChangedListener) listeners[i];
-            SafeRunner.run(new SafeRunnable() {
-				public void run() {
-					l.selectionChanged(event);
-				}
-			});
-		}
-	}
-
-	/**
-	 * Returns the sash editor.
-	 * @return the sash editor part
-	 */
-	public SashEditorPart getSashEditor() {
-		return _sashEditor;
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on <code>ISelectionProvider</code>.
-	 */
-	public ISelection getSelection() {
-		IEditorPart activeEditor = _sashEditor.getActiveEditor();
-		if (activeEditor != null) {
-			ISelectionProvider selectionProvider = activeEditor.getSite()
-					.getSelectionProvider();
-			if (selectionProvider != null)
-				return selectionProvider.getSelection();
-		}
-		return null;
-	}
-
-	/*
-	 * (non-JavaDoc) Method declaed on <code>ISelectionProvider</code>.
-	 */
-	public void removeSelectionChangedListener(
-			ISelectionChangedListener listener) {
-		_listeners.remove(listener);
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on <code>ISelectionProvider</code>.
-	 */
-	public void setSelection(ISelection selection) {
-		IEditorPart activeEditor = _sashEditor.getActiveEditor();
-		if (activeEditor != null) {
-			ISelectionProvider selectionProvider = activeEditor.getSite()
-					.getSelectionProvider();
-			if (selectionProvider != null)
-				selectionProvider.setSelection(selection);
-		}
-	}
-
-	public void addPostSelectionChangedListener(
-			ISelectionChangedListener listener) {
-		_postSelectionChangedListeners.add(listener);
-	}
-
-	public void removePostSelectionChangedListener(
-			ISelectionChangedListener listener) {
-		_postSelectionChangedListeners.remove(listener);
-	}
-
-	/**
-	 * Notifies any post selection listeners that a post selection event has
-	 * been received. Only listeners registered at the time this method is
-	 * called are notified.
-	 * 
-	 * @param event
-	 *            a selection changed event
-	 * 
-	 * @see #addPostSelectionChangedListener(ISelectionChangedListener)
-	 */
-	public void firePostSelectionChanged(final SelectionChangedEvent event) {
-		Object[] listeners = _postSelectionChangedListeners.getListeners();
-		for (int i = 0; i < listeners.length; ++i) {
-			final ISelectionChangedListener l = (ISelectionChangedListener) listeners[i];
-			SafeRunnable.run(new SafeRunnable() {
-				public void run() {
-					l.selectionChanged(event);
-				}
-			});
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/common/sash/SashEditorSite.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/common/sash/SashEditorSite.java
deleted file mode 100644
index 4558404..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/common/sash/SashEditorSite.java
+++ /dev/null
@@ -1,435 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.ui.common.sash;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.viewers.ILabelDecorator;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.IEditorActionBarContributor;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.IKeyBindingService;
-import org.eclipse.ui.INestableKeyBindingService;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.IWorkbenchWindow;
-//import org.eclipse.ui.internal.PopupMenuExtender;
-
-/**
- * @author mengbo
- */
-public class SashEditorSite implements IEditorSite {
-
-	/**
-	 * The nested editor.
-	 */
-	private IEditorPart _editor;
-
-	/**
-	 * The multi-page editor.
-	 */
-	private SashEditorPart _sashEditor;
-
-	/**
-	 * The selection provider; <code>null</code> if none.
-	 * 
-	 * @see SashEditorSite#setSelectionProvider(ISelectionProvider)
-	 */
-	private ISelectionProvider _selectionProvider = null;
-
-	/**
-	 * The selection change listener, initialized lazily; <code>null</code> if
-	 * not yet created.
-	 */
-	private ISelectionChangedListener _selectionChangedListener = null;
-
-	/**
-	 * The cached copy of the key binding service specific to this sash editor
-	 * site. This value is <code>null</code> if it is not yet initialized.
-	 */
-	private IKeyBindingService _service = null;
-
-	/**
-	 * The list of popup menu extenders; <code>null</code> if none registered.
-	 */
-	// TODO: dead? private ArrayList _menuExtenders;
-
-	/**
-	 * Creates a site for the given editor nested within the given multi-page
-	 * editor.
-	 * 
-	 * @param sashEditor
-	 *            the multi-page editor
-	 * @param editor
-	 *            the nested editor
-	 */
-	public SashEditorSite(SashEditorPart sashEditor, IEditorPart editor) {
-		Assert.isNotNull(sashEditor);
-		Assert.isNotNull(editor);
-		this._sashEditor = sashEditor;
-		this._editor = editor;
-	}
-
-	/**
-	 * Dispose the contributions.
-	 */
-	public void dispose() {
-//		if (_menuExtenders != null) {
-//			for (int i = 0, size = _menuExtenders.size(); i < size; i++) {
-//				((PopupMenuExtender) _menuExtenders.get(i)).dispose();
-//			}
-//			_menuExtenders = null;
-//		}
-
-		// Remove myself from the list of nested key binding services.
-		if (_service != null) {
-			IKeyBindingService parentService = getEditor().getSite()
-					.getKeyBindingService();
-			if (parentService instanceof INestableKeyBindingService) {
-				INestableKeyBindingService nestableParent = (INestableKeyBindingService) parentService;
-				nestableParent.removeKeyBindingService(this);
-			}
-			_service = null;
-		}
-	}
-
-	/**
-	 * The <code>SashEditorSite</code> implementation of this
-	 * <code>IEditorSite</code> method returns <code>null</code>, since
-	 * nested editors do not have their own action bar contributor.
-	 * 
-	 * @return <code>null</code>
-	 */
-	public IEditorActionBarContributor getActionBarContributor() {
-		return null;
-	}
-
-	/**
-	 * The <code>SashEditorSite</code> implementation of this
-	 * <code>IEditorSite</code> method forwards to the multi-page editor to
-	 * return the action bars.
-	 * 
-	 * @return The action bars from the parent multi-page editor.
-	 */
-	public IActionBars getActionBars() {
-		return _sashEditor.getEditorSite().getActionBars();
-	}
-
-	/**
-	 * The <code>SashEditorSite</code> implementation of this
-	 * <code>IWorkbenchPartSite</code> method forwards to the multi-page
-	 * editor to return the decorator manager.
-	 * 
-	 * @return The decorator from the workbench window.
-	 * @deprecated use IWorkbench.getDecoratorManager()
-	 */
-	public ILabelDecorator getDecoratorManager() {
-		return getWorkbenchWindow().getWorkbench().getDecoratorManager()
-				.getLabelDecorator();
-	}
-
-	/**
-	 * Returns the nested editor.
-	 * 
-	 * @return the nested editor
-	 */
-	public IEditorPart getEditor() {
-		return _editor;
-	}
-
-	/**
-	 * The <code>SashEditorSite</code> implementation of this
-	 * <code>IWorkbenchPartSite</code> method returns an empty string since
-	 * the nested editor is not created from the registry.
-	 * 
-	 * @return An empty string.
-	 */
-	public String getId() {
-		return ""; //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IEditorSite.
-	 */
-	public IKeyBindingService getKeyBindingService() {
-		if (_service == null) {
-			_service = getSashEditor().getEditorSite().getKeyBindingService();
-			if (_service instanceof INestableKeyBindingService) {
-				INestableKeyBindingService nestableService = (INestableKeyBindingService) _service;
-				_service = nestableService.getKeyBindingService(this);
-
-			} else {
-				/*
-				 * This is an internal reference, and should not be copied by
-				 * client code. If you are thinking of copying this, DON'T DO
-				 * IT.
-				 */
-				PDPlugin
-						.getLogger(SashEditorSite.class)
-						.info(
-								"MultiPageEditorSite.getKeyBindingService()   Parent key binding service was not an instance of INestableKeyBindingService.  It was an instance of " + _service.getClass().getName() + " instead."); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-		}
-
-		return _service;
-	}
-
-	/**
-	 * Returns the sash editor.
-	 * 
-	 * @return the sash editor
-	 */
-	public SashEditorPart getSashEditor() {
-		return _sashEditor;
-	}
-
-	/**
-	 * The <code>SashEditorSite</code> implementation of this
-	 * <code>IWorkbenchPartSite</code> method forwards to the multi-page
-	 * editor to return the workbench page.
-	 * 
-	 * @return The workbench page in which this editor site resides.
-	 */
-	public IWorkbenchPage getPage() {
-		return getSashEditor().getSite().getPage();
-	}
-
-	/**
-	 * The <code>SashEditorSite</code> implementation of this
-	 * <code>IWorkbenchPartSite</code> method returns an empty string since
-	 * the nested editor is not created from the registry.
-	 * 
-	 * @return An empty string.
-	 */
-	public String getPluginId() {
-		return ""; //$NON-NLS-1$
-	}
-
-	/**
-	 * The <code>SashEditorSite</code> implementation of this
-	 * <code>IWorkbenchPartSite</code> method returns an empty string since
-	 * the nested editor is not created from the registry.
-	 * 
-	 * @return An empty string.
-	 */
-	public String getRegisteredName() {
-		return ""; //$NON-NLS-1$
-	}
-
-	/**
-	 * Returns the selection changed listener which listens to the nested
-	 * editor's selection changes, and calls <code>handleSelectionChanged</code>.
-	 * 
-	 * @return the selection changed listener
-	 */
-	private ISelectionChangedListener getSelectionChangedListener() {
-		if (_selectionChangedListener == null) {
-			_selectionChangedListener = new ISelectionChangedListener() {
-				public void selectionChanged(SelectionChangedEvent event) {
-					SashEditorSite.this.handleSelectionChanged(event);
-				}
-			};
-		}
-		return _selectionChangedListener;
-	}
-
-	/**
-	 * The <code>SashEditorSite</code> implementation of this
-	 * <code>IWorkbenchPartSite</code> method returns the selection provider
-	 * set by <code>setSelectionProvider</code>.
-	 * 
-	 * @return The current selection provider.
-	 */
-	public ISelectionProvider getSelectionProvider() {
-		return _selectionProvider;
-	}
-
-	/**
-	 * The <code>SashEditorSite</code> implementation of this
-	 * <code>IWorkbenchPartSite</code> method forwards to the multi-page
-	 * editor to return the shell.
-	 * 
-	 * @return The shell in which this editor site resides.
-	 */
-	public Shell getShell() {
-		return getSashEditor().getSite().getShell();
-	}
-
-	/**
-	 * The <code>SashEditorSite</code> implementation of this
-	 * <code>IWorkbenchPartSite</code> method forwards to the multi-page
-	 * editor to return the workbench window.
-	 * 
-	 * @return The workbench window in which this editor site resides.
-	 */
-	public IWorkbenchWindow getWorkbenchWindow() {
-		return getSashEditor().getSite().getWorkbenchWindow();
-	}
-
-	/**
-	 * Handles a selection changed event from the nested editor. The default
-	 * implementation gets the selection provider from the multi-page editor's
-	 * site, and calls <code>fireSelectionChanged</code> on it (only if it is
-	 * an instance of <code>SashSelectionProvider</code>), passing a new
-	 * event object.
-	 * <p>
-	 * Subclasses may extend or reimplement this method.
-	 * </p>
-	 * 
-	 * @param event
-	 *            the event
-	 */
-	public void handleSelectionChanged(SelectionChangedEvent event) {
-		// we'll only make the parent editor site fire the selection change
-		// event
-		// when we (the sasheditorsite) is the active editor in the parent site.
-		if (getSashEditor().getActiveEditor() == this.getPart()) {
-			ISelectionProvider parentProvider = getSashEditor().getSite()
-					.getSelectionProvider();
-			if (parentProvider instanceof SashEditorSelectionProvider) {
-				SelectionChangedEvent newEvent = new SelectionChangedEvent(
-						parentProvider, event.getSelection());
-				((SashEditorSelectionProvider) parentProvider)
-						.fireSelectionChanged(newEvent);
-			}
-		}
-	}
-
-	/**
-	 * The <code>SashEditorSite</code> implementation of this
-	 * <code>IWorkbenchPartSite</code> method forwards to the multi-page
-	 * editor for registration.
-	 * 
-	 * @param menuID
-	 *            The identifier for the menu.
-	 * @param menuMgr
-	 *            The menu manager
-	 * @param selProvider
-	 *            The selection provider.
-	 */
-	public void registerContextMenu(String menuID, MenuManager menuMgr,
-			ISelectionProvider selProvider) {
-//		if (_menuExtenders == null) {
-//			_menuExtenders = new ArrayList(1);
-//		}
-		// cancel the registration of PopupMenuExtender since the
-		// PopupMenuExtender's behavior
-		// is different between eclipse 3.0 and eclipse 3.1,and we always have
-		// one context
-		// menu listener,no need add PopupMenuExtender as the second
-		// listener(workaroud for bug 408295-1)
-		// _menuExtenders.add(new PopupMenuExtender(menuID, menuMgr,
-		// selProvider,
-		// _editor));
-	}
-
-	/**
-	 * The <code>SashEditorSite</code> implementation of this
-	 * <code>IWorkbenchPartSite</code> method forwards to the multi-page
-	 * editor for registration.
-	 * 
-	 * @param menuManager
-	 *            The menu manager
-	 * @param selProvider
-	 *            The selection provider.
-	 */
-	public void registerContextMenu(MenuManager menuManager,
-			ISelectionProvider selProvider) {
-		getSashEditor().getSite().registerContextMenu(menuManager, selProvider);
-	}
-
-	/**
-	 * The <code>SashEditorSite</code> implementation of this
-	 * <code>IWorkbenchPartSite</code> method remembers the selection
-	 * provider, and also hooks a listener on it, which calls
-	 * <code>handleSelectionChanged</code> when a selection changed event
-	 * occurs.
-	 * 
-	 * @param provider
-	 *            The selection provider.
-	 * @see SashEditorSite#handleSelectionChanged(SelectionChangedEvent)
-	 */
-	public void setSelectionProvider(ISelectionProvider provider) {
-		ISelectionProvider oldSelectionProvider = _selectionProvider;
-		_selectionProvider = provider;
-		if (oldSelectionProvider != null) {
-			oldSelectionProvider
-					.removeSelectionChangedListener(getSelectionChangedListener());
-		}
-		if (_selectionProvider != null) {
-			_selectionProvider
-					.addSelectionChangedListener(getSelectionChangedListener());
-		}
-	}
-
-	/**
-	 * @param job
-	 */
-	public void progressEnd(Job job) {
-		// Do nothing
-	}
-
-
-	/**
-	 * @param job
-	 */
-	public void progressStart(Job job) {
-		// Do nothing
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
-	 */
-	public Object getAdapter(Class adapter) {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.IWorkbenchPartSite#getPart()
-	 */
-	public IWorkbenchPart getPart() {
-		return _editor;
-	}
-
-	public void registerContextMenu(MenuManager menuManager,
-			ISelectionProvider selectionProvider, boolean includeEditorInput) {
-	    // do nothing
-	}
-
-	public void registerContextMenu(String menuId, MenuManager menuManager,
-			ISelectionProvider selectionProvider, boolean includeEditorInput) {
-		// do nothing
-
-	}
-
-	public Object getService(Class api) {
-		// return null
-		return null;
-	}
-
-	public boolean hasService(Class api) {
-		// no service
-		return false;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogfields/ClasspathResourceButtonDialogField.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogfields/ClasspathResourceButtonDialogField.java
deleted file mode 100644
index 61af631..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogfields/ClasspathResourceButtonDialogField.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.ui.dialogfields;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jface.window.Window;
-import org.eclipse.jst.jsf.common.ui.IFileFolderConstants;
-import org.eclipse.jst.jsf.common.ui.JSFUICommonPlugin;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.IStringButtonAdapter;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.StringButtonDialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogs.ResourceOnClasspathDialog;
-import org.eclipse.jst.pagedesigner.properties.attrgroup.IElementContextable;
-import org.eclipse.jst.pagedesigner.utils.StructuredModelUtil;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * @author mengbo
- */
-public class ClasspathResourceButtonDialogField extends StringButtonDialogField implements IElementContextable
-{
-
-	private static final String[] PROPERTIES_FILES_SUFFIXS = new String[] { IFileFolderConstants.EXT_PROPERTIES };
-
-	private static class MyStringButtonAdapter implements IStringButtonAdapter
-	{
-		private IProject _project;
-
-		public void changeControlPressed(DialogField field) {
-			browseButtonPressed(field);
-		}
-
-		private void browseButtonPressed(DialogField field) 
-		{
-			if (field instanceof ClasspathResourceButtonDialogField)
-			{
-				ClasspathResourceButtonDialogField classPathField = 
-					(ClasspathResourceButtonDialogField) field;
-				Shell shell = field.getShell();
-				ResourceOnClasspathDialog dialog = 
-					new ResourceOnClasspathDialog(shell, getJavaProject());
-				dialog.setTitle(JSFUICommonPlugin
-						.getResourceString("DialogField.ResourceButton.SelectFile"));//$NON-NLS-1$
-				dialog.setSuffixs(PROPERTIES_FILES_SUFFIXS);
-				if (dialog.open() == Window.OK) {
-					String oldValue = classPathField.getText();
-	
-					String newValue = (String) dialog.getResult()[0];
-					if (oldValue != newValue) {
-						classPathField.setText(newValue);
-					}
-				}
-			}
-		}
-		
-		private IJavaProject getJavaProject() {
-			try {
-				if (_project != null && _project.hasNature(JavaCore.NATURE_ID)) {
-					return JavaCore.create(_project);
-				}
-	            return null;
-			} catch (CoreException e) {
-				return null;
-			}
-		}
-	}
-	
-	/**
-s	 */
-	public ClasspathResourceButtonDialogField() {
-		super(new MyStringButtonAdapter());
-	}
-
-	public void setElementContext(
-			org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode ancester,
-			IDOMElement element) {
-		IProject prj = StructuredModelUtil.getProjectFor(ancester.getModel());
-		
-		IStringButtonAdapter adapter = getStringButtonAdapter();
-		
-		if (adapter instanceof MyStringButtonAdapter)
-		{
-			((MyStringButtonAdapter)adapter)._project = prj;
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogfields/ContextableResourceButtonDialogField.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogfields/ContextableResourceButtonDialogField.java
deleted file mode 100644
index a9e50ec..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogfields/ContextableResourceButtonDialogField.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.ui.dialogfields;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.ResourceButtonDialogField;
-import org.eclipse.jst.pagedesigner.properties.attrgroup.IElementContextable;
-import org.eclipse.jst.pagedesigner.utils.StructuredModelUtil;
-import org.eclipse.jst.pagedesigner.utils.WebAppUtil;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ContextableResourceButtonDialogField extends
-		ResourceButtonDialogField implements IElementContextable {
-
-	/**
-	 * Default constructor
-	 */
-	public ContextableResourceButtonDialogField() {
-		super(null);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.properties.attrgroup.IElementContextable#setElementContext(org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode,
-	 *      org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement)
-	 */
-	public void setElementContext(IDOMNode ancester, IDOMElement element) {
-		if (ancester == null) {
-			setProject(null);
-			setReferredFile(null);
-		} else {
-			IDOMModel model = ancester.getModel();
-			IFile file = StructuredModelUtil.getFileFor(model);
-			IProject prj = (file == null ? null : file.getProject());
-			setProject(prj);
-			setReferredFile(file);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.ResourceButtonDialogField#browseButtonPressed()
-	 */
-	protected String browseButtonPressed() {
-		String url = super.browseButtonPressed();
-		url = WebAppUtil.transformJSPURL(url, this.getReferredFile());
-		return url;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogfields/DialogFieldWrapper.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogfields/DialogFieldWrapper.java
deleted file mode 100644
index 4d1b16b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogfields/DialogFieldWrapper.java
+++ /dev/null
@@ -1,480 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.ui.dialogfields;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogFieldApplyListener;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogFieldChangeListener;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.IStringButtonAdapter;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.ISupportTextValue;
-import org.eclipse.jst.pagedesigner.editors.properties.IPropertyPageDescriptor;
-import org.eclipse.jst.pagedesigner.meta.IAttributeDescriptor;
-import org.eclipse.jst.pagedesigner.meta.IBindingHandler;
-import org.eclipse.jst.pagedesigner.properties.attrgroup.IElementContextable;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.PaintEvent;
-import org.eclipse.swt.events.PaintListener;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.forms.events.IHyperlinkListener;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-
-/**
- * This is a wrapper to a dialog field, by adding a small image button at the
- * end. The caller is responsible to provide the image and the button click
- * handler.
- * 
- * @author mengbo
- * @version 1.5
- * @see org.eclipse.jst.pagedesigner.properties.celleditors.CellEditorWrapper
- */
-// NOTE: currently this class is dedicated to page designer by using the
-// IElementContextable interface.
-// It should be very easy to make it standard alone and reused in other places.
-@SuppressWarnings("deprecation")
-public class DialogFieldWrapper implements DialogField, ISupportTextValue,
-		IElementContextable {
-	private DialogField _wrapped;
-
-	private IDOMNode _ancester;
-
-	private IDOMElement _element;
-
-	private Button _databindingButton;
-
-	private boolean _databindingEnabled;
-
-	private Image _image;
-
-	private Image _disabledImage;
-
-	private IStringButtonAdapter _adapter;
-
-	private String _uri;
-
-	private String _tagName;
-
-    private IAttributeDescriptor _attr;
-
-    private IBindingHandler _handler;
-
-	private IPropertyPageDescriptor _pdattr;
-
-	/**
-	 * @param field 
-	 * @param image 
-	 * @param disabledImage 
-	 * @param uri 
-	 * @param tagName 
-	 * @param attr 
-	 * @param handler 
-	 * 
-	 */
-    public DialogFieldWrapper(DialogField field, Image image,
-			Image disabledImage, String uri, String tagName,
-			IAttributeDescriptor attr, IBindingHandler handler) {
-		super();
-		if (!(field instanceof ISupportTextValue)) {
-			throw new IllegalArgumentException(
-					"Field must be ISupportTextValue"); //$NON-NLS-1$
-		}
-		_wrapped = field;
-		this._image = image;
-		this._disabledImage = disabledImage;
-		this._uri = uri;
-		this._tagName = tagName;
-		this._attr = attr;
-		this._handler = handler;
-
-		setDatabindingPressedHandler(new IStringButtonAdapter() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.IStringButtonAdapter#changeControlPressed(org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField)
-			 */
-            public void changeControlPressed(DialogField field1) {
-				Shell shell = field1.getLabelControl(null, null).getShell();
-				DialogFieldWrapper wrapper = (DialogFieldWrapper) field1;
-				String result = _handler
-						.handleBinding(shell, wrapper.getAncester(), wrapper
-								.getElement(), wrapper.getText());
-				if (result != null) {
-					wrapper.setText(result);
-				}
-			}
-		});
-	}
-	
-	/**
-	 * @param field 
-	 * @param image 
-	 * @param disabledImage 
-	 * @param uri 
-	 * @param tagName 
-	 * @param attr 
-	 * @param handler 
-	 * 
-	 */
-    public DialogFieldWrapper(DialogField field, Image image,
-			Image disabledImage, String uri, String tagName,
-			IPropertyPageDescriptor attr, IBindingHandler handler) {
-		super();
-		if (!(field instanceof ISupportTextValue)) {
-			throw new IllegalArgumentException(
-					"Field must be ISupportTextValue"); //$NON-NLS-1$
-		}
-		_wrapped = field;
-		this._image = image;
-		this._disabledImage = disabledImage;
-		this._uri = uri;
-		this._tagName = tagName;
-		this._pdattr = attr;
-		this._handler = handler;
-
-		setDatabindingPressedHandler(new IStringButtonAdapter() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.IStringButtonAdapter#changeControlPressed(org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField)
-			 */
-			public void changeControlPressed(DialogField field1) {
-				Shell shell = field1.getLabelControl(null, null).getShell();
-				DialogFieldWrapper wrapper = (DialogFieldWrapper) field1;
-				String result = _handler
-						.handleBinding(shell, wrapper.getAncester(), wrapper
-								.getElement(), wrapper.getText());
-				if (result != null) {
-					wrapper.setText(result);
-				}
-			}
-		});
-	}
-
-	private void setDatabindingPressedHandler(IStringButtonAdapter adapter) {
-		this._adapter = adapter;
-		this.updateDatabindingControl();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.ISupportTextValue#setTextWithoutUpdate(java.lang.String)
-	 */
-	public void setTextWithoutUpdate(String value) {
-		((ISupportTextValue) _wrapped).setTextWithoutUpdate(value);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.ISupportTextValue#getText()
-	 */
-	public String getText() {
-		return ((ISupportTextValue) _wrapped).getText();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.ISupportTextValue#setText(java.lang.String)
-	 */
-	public void setText(String value) {
-		((ISupportTextValue) _wrapped).setText(value);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.properties.attrgroup.IElementContextable#setElementContext(org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode,
-	 *      org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement)
-	 */
-    public void setElementContext(IDOMNode ancester, IDOMElement element) {
-		if (_wrapped instanceof IElementContextable) {
-			((IElementContextable) _wrapped).setElementContext(ancester,
-					element);
-		}
-		this._ancester = ancester;
-		this._element = element;
-
-		boolean bindingEnabled = false;
-		
-		if (_attr != null)
-			bindingEnabled = _handler.isEnabled(_ancester, _element, _uri,
-				_tagName, _attr);
-		else if (_pdattr != null)
-			bindingEnabled = false;//_handler.isEnabled(_ancester, _element, _pdattr);
-		
-		this.setDatabindingEnabled(bindingEnabled);
-	}
-
-	// --------------------------------------------------------------------------------------------
-	// wrapped method to add the data binding browse button
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField#doFillIntoGrid(org.eclipse.ui.forms.widgets.FormToolkit,
-	 *      org.eclipse.swt.widgets.Composite, int)
-	 */
-	public Control[] doFillIntoGrid(FormToolkit toolkit, Composite parent,
-			int nColumns) {
-		Control[] wrappedControls = _wrapped.doFillIntoGrid(toolkit, parent,
-				nColumns - 1);
-		Control[] result = new Control[wrappedControls.length];
-
-		Control button = getDatabingingButton(toolkit, parent);
-		button.setLayoutData(gridDataForDatabindingButton(1));
-		button.setVisible(false);
-
-		System.arraycopy(wrappedControls, 0, result, 0, wrappedControls.length);
-		result[result.length - 1] = _databindingButton;
-		return result;
-	}
-
-	/**
-	 * @param span
-	 * @return
-	 */
-	private GridData gridDataForDatabindingButton(int span) {
-		GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
-		gd.horizontalSpan = span;
-		gd.widthHint = gd.heightHint = 18;
-		return gd;
-	}
-
-	/**
-	 * @param toolkit
-	 * @param parent
-	 * @return
-	 */
-	private Control getDatabingingButton(FormToolkit toolkit, Composite parent) {
-		if (_databindingButton == null || _databindingButton.isDisposed()) {
-			Assert.isNotNull(parent,
-					"uncreated control requested with composite null"); //$NON-NLS-1$
-			if (toolkit != null) {
-				_databindingButton = toolkit.createButton(parent, "", SWT.PUSH); //$NON-NLS-1$
-				_databindingButton.setImage(getImage());
-			} else {
-				_databindingButton = new Button(parent, SWT.PUSH);
-				_databindingButton.setImage(getImage());
-			}
-			_databindingButton.addPaintListener(new PaintListener() {
-				public void paintControl(PaintEvent e) {
-					if (!_databindingButton.isEnabled()
-							&& getDisabledImage() != null) {
-						Rectangle buttonBounds = _databindingButton.getBounds();
-						Rectangle imageBounds = getDisabledImage().getBounds();
-						e.gc.drawImage(getDisabledImage(),
-								(buttonBounds.width - imageBounds.width) / 2,
-								(buttonBounds.height - imageBounds.height) / 2);
-					}
-				}
-			});
-			_databindingButton.setEnabled(isEnabled() && _databindingEnabled);
-			_databindingButton.addSelectionListener(new SelectionListener() {
-				public void widgetDefaultSelected(SelectionEvent e) {
-					databindingControlPressed();
-				}
-
-				public void widgetSelected(SelectionEvent e) {
-					databindingControlPressed();
-				}
-			});
-
-		}
-		return _databindingButton;
-	}
-
-	/**
-	 * @return
-	 */
-	private Image getImage() {
-		return _image;
-	}
-
-	private Image getDisabledImage() {
-		return _disabledImage;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField#getLabelControl(org.eclipse.ui.forms.widgets.FormToolkit,
-	 *      org.eclipse.swt.widgets.Composite)
-	 */
-	public Control getLabelControl(FormToolkit _formToolkit, Composite parent) {
-		return _wrapped.getLabelControl(_formToolkit, parent);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogField#setHyperLink(org.eclipse.ui.forms.events.IHyperlinkListener)
-	 */
-	public void setHyperLink(IHyperlinkListener listener) {
-		_wrapped.setHyperLink(listener);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogField#setLabelText(java.lang.String)
-	 */
-	public void setLabelText(String labeltext) {
-		_wrapped.setLabelText(labeltext);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogField#setDialogFieldChangeListener(org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogFieldChangeListener)
-	 */
-	public void setDialogFieldChangeListener(IDialogFieldChangeListener listener) {
-		_wrapped.setDialogFieldChangeListener(listener);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogField#setDialogFieldApplyListener(org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogFieldApplyListener)
-	 */
-	public void setDialogFieldApplyListener(IDialogFieldApplyListener listener) {
-		_wrapped.setDialogFieldApplyListener(listener);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogField#setFocus()
-	 */
-	public boolean setFocus() {
-		return _wrapped.setFocus();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogField#getNumberOfControls()
-	 */
-	public int getNumberOfControls() {
-		return _wrapped.getNumberOfControls() + 1;
-	}
-
-	/**
-	 * @param enabled
-	 */
-	public void setDatabindingEnabled(boolean enabled) {
-		this._databindingEnabled = enabled;
-		updateDatabindingControl();
-	}
-
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogField#setEnabled(boolean)
-	 */
-	public void setEnabled(boolean enabled) {
-		_wrapped.setEnabled(enabled);
-		updateDatabindingControl();
-	}
-
-	/**
-	 * 
-	 */
-	private void updateDatabindingControl() {
-		if (this._databindingButton != null && !_databindingButton.isDisposed()) {
-			this._databindingButton.setEnabled(this.isEnabled()
-					&& _databindingEnabled && _adapter != null);
-			_databindingButton.redraw();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogField#isEnabled()
-	 */
-	public boolean isEnabled() {
-		return _wrapped.isEnabled();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogField#getAttachedData(java.lang.Object)
-	 */
-	public Object getAttachedData(Object key) {
-		return _wrapped.getAttachedData(key);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogField#putAttachedData(java.lang.Object,
-	 *      java.lang.Object)
-	 */
-	public void putAttachedData(Object key, Object value) {
-		_wrapped.putAttachedData(key, value);
-	}
-
-	private void databindingControlPressed() {
-		if (_adapter != null) {
-			_adapter.changeControlPressed(this);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField#handleGrabHorizontal()
-	 */
-	public void handleGrabHorizontal() {
-		_wrapped.handleGrabHorizontal();
-	}
-
-	private IDOMNode getAncester() {
-		return _ancester;
-	}
-
-	private IDOMElement getElement() {
-		return _element;
-	}
-
-	/**
-	 * @return the wrapped field
-	 */
-	public DialogField getWrappedDialogField() {
-		return _wrapped;
-	}
-
-	public boolean isRequired() {
-		return _wrapped.isRequired();
-	}
-
-	public void setToolTip(String toolTip) {
-		_wrapped.setToolTip(toolTip);
-	}
-
-	public Shell getShell() {
-		return _wrapped.getShell();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogfields/ExtendedResourceButtonDialogField.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogfields/ExtendedResourceButtonDialogField.java
deleted file mode 100644
index 0c458ec..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogfields/ExtendedResourceButtonDialogField.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.ui.dialogfields;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.ResourceButtonDialogField;
-import org.eclipse.jst.pagedesigner.utils.WebAppUtil;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ExtendedResourceButtonDialogField extends
-		ResourceButtonDialogField {
-	/**
-	 * @param project
-	 */
-	public ExtendedResourceButtonDialogField(IProject project) {
-		super(project);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.ResourceButtonDialogField#browseButtonPressed()
-	 */
-	protected String browseButtonPressed() {
-		String url = super.browseButtonPressed();
-		url = WebAppUtil.transformJSPURL(url, this.getReferredFile());
-		return url;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogfields/StyleButtonDialogField.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogfields/StyleButtonDialogField.java
deleted file mode 100644
index 0e05a53..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogfields/StyleButtonDialogField.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.ui.dialogfields;
-
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.preference.PreferenceManager;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.IStringButtonAdapter;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.StringButtonDialogField;
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.commands.single.ChangeStyleCommand;
-import org.eclipse.jst.pagedesigner.properties.attrgroup.IElementContextable;
-import org.eclipse.jst.pagedesigner.ui.dialogs.DialogsMessages;
-import org.eclipse.jst.pagedesigner.ui.dialogs.StyleDialog;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.wst.css.core.internal.provisional.document.ICSSStyleDeclaration;
-import org.eclipse.wst.css.core.internal.util.declaration.CSSPropertyContext;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-import org.w3c.dom.css.ElementCSSInlineStyle;
-
-/**
- * @author mengbo
- */
-public class StyleButtonDialogField extends StringButtonDialogField implements
-		IElementContextable {
-	private IDOMElement _element;
-
-	/**
-	 * Equivalent to StyleButtonDialogField(null)
-	 */
-	public StyleButtonDialogField() {
-		this(null);
-	}
-
-	/**
-	 * @param element
-	 */
-	public StyleButtonDialogField(IDOMElement element) {
-		this(null, element);
-		setStringButtonAdapter(new IStringButtonAdapter() {
-			public void changeControlPressed(DialogField field) {
-				browseButtonPressed();
-			}
-		});
-		setButtonLabel(DialogsMessages.getString("StyleButtonDialogField.Edit"));//$NON-NLS-1$ 
-	}
-
-	/**
-	 * @param adapter
-	 * @param element
-	 */
-	public StyleButtonDialogField(IStringButtonAdapter adapter,
-			IDOMElement element) {
-		super(adapter);
-		_element = element;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.properties.attrgroup.IElementContextable#setElementContext(org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode,
-	 *      org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement)
-	 */
-	public void setElementContext(IDOMNode ancester, IDOMElement element) {
-		this._element = element;
-	}
-
-	private void browseButtonPressed() {
-		if (_element instanceof ElementCSSInlineStyle) {
-			ICSSStyleDeclaration styleDeclaration = (ICSSStyleDeclaration) ((ElementCSSInlineStyle) _element)
-					.getStyle();
-
-			PreferenceManager manager = new PreferenceManager();
-			Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow()
-					.getShell();
-
-			CSSPropertyContext context = new CSSPropertyContext(
-					styleDeclaration);
-			StyleDialog dialog = new StyleDialog(shell, manager, _element,
-					context);
-			if (dialog.open() == Dialog.OK) {
-				if (!context.isModified()) {
-					return;
-				}
-				ChangeStyleCommand c = new ChangeStyleCommand(_element, context);
-				c.execute();
-
-				String style = (_element == null ? null : _element
-						.getAttribute(IJSFConstants.ATTR_STYLE));
-				setText(style);
-			}
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/BackgroudPreferenceNode.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/BackgroudPreferenceNode.java
deleted file mode 100644
index b2ed929..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/BackgroudPreferenceNode.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.ui.dialogs;
-
-import org.eclipse.jface.preference.IPreferenceNode;
-import org.eclipse.jface.preference.IPreferencePage;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.wst.css.core.internal.util.declaration.CSSPropertyContext;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class BackgroudPreferenceNode implements IPreferenceNode {
-	private BackgroundPreferencePage _page;
-
-	private IDOMElement _element;
-
-	private CSSPropertyContext _style;
-
-	/**
-	 * @param element
-	 * @param style
-	 */
-	public BackgroudPreferenceNode(IDOMElement element, CSSPropertyContext style) {
-		super();
-		_element = element;
-		_style = style;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#add(org.eclipse.jface.preference.IPreferenceNode)
-	 */
-	public void add(IPreferenceNode node) {
-        // TODO: do nothing?
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#createPage()
-	 */
-	public void createPage() {
-		_page = new BackgroundPreferencePage(_element, _style);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#disposeResources()
-	 */
-	public void disposeResources() {
-        //TODO: do nothing?
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#findSubNode(java.lang.String)
-	 */
-	public IPreferenceNode findSubNode(String id) {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getId()
-	 */
-	public String getId() {
-		return "Background"; //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getLabelImage()
-	 */
-	public Image getLabelImage() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getLabelText()
-	 */
-	public String getLabelText() {
-		return DialogsMessages.getString("BackgroundPreferenceNode.LabelText"); //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getPage()
-	 */
-	public IPreferencePage getPage() {
-		return _page;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getSubNodes()
-	 */
-	public IPreferenceNode[] getSubNodes() {
-		return new IPreferenceNode[0];
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#remove(java.lang.String)
-	 */
-	public IPreferenceNode remove(String id) {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#remove(org.eclipse.jface.preference.IPreferenceNode)
-	 */
-	public boolean remove(IPreferenceNode node) {
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/BackgroundPreferencePage.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/BackgroundPreferencePage.java
deleted file mode 100644
index e89f95c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/BackgroundPreferencePage.java
+++ /dev/null
@@ -1,320 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.ui.dialogs;
-
-import org.eclipse.jface.preference.PreferencePage;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.ColorButtonDialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogFieldApplyListener;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.wst.css.core.internal.util.declaration.CSSPropertyContext;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class BackgroundPreferencePage extends PreferencePage {
-	private CSSPropertyContext _style;
-
-	private StyleCombo _backgroundImageCombo, _backgroundRepeatCombo,
-			_backgroundAttachmentCombo, _horizontalNumberCombo,
-			_horizontalUnitCombo, _verticalNumberCombo, _verticalUnitCombo;
-
-	private ColorButtonDialogField _backgroundColorField;
-
-	/**
-	 * @param element
-	 * @param style
-	 */
-	public BackgroundPreferencePage(IDOMElement element,
-			CSSPropertyContext style) {
-		super();
-		_style = style;
-
-		setTitle(DialogsMessages.getString("BackgroundPreferencePage.Title")); //$NON-NLS-1$
-	}
-
-	/**
-	 * @see org.eclipse.jface.preference.
-	 *      PreferencePage#createContents(Composite)
-	 */
-	protected Control createContents(Composite parent) {
-		GridLayout layout;
-		GridData data;
-
-		Composite top = new Composite(parent, SWT.NONE);
-		layout = new GridLayout(3, false);
-		data = new GridData(GridData.FILL_BOTH);
-		top.setLayout(layout);
-		top.setLayoutData(data);
-
-		_backgroundColorField = new ColorButtonDialogField(SWT.BORDER, new ColorUtil());
-		_backgroundColorField.setLabelText(DialogsMessages
-				.getString("BackgroundBoxPreferencePage.BackgroundColor")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		_backgroundColorField.getLabelControl(null, top).setLayoutData(data);
-
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_backgroundColorField.getComboControl(null, top).setLayoutData(data);
-
-		data = new GridData();
-		_backgroundColorField.getChangeControl(null, top).setLayoutData(data);
-		_backgroundColorField
-				.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
-					public void dialogFieldApplied(DialogField field) {
-						String color = _backgroundColorField.getText();
-
-						_style.setBackgroundColor(color);
-					}
-				});
-
-		Label backgroundImageLabel = new Label(top, SWT.NONE);
-		backgroundImageLabel.setText(DialogsMessages
-				.getString("BackgroundBoxPreferencePage.BackgroundImage")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		backgroundImageLabel.setLayoutData(data);
-
-		_backgroundImageCombo = new StyleCombo(top, SWT.NONE);
-		_backgroundImageCombo.setItems(IStyleConstants.NONE);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_backgroundImageCombo.setLayoutData(data);
-		_backgroundImageCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String image = _backgroundImageCombo.getText();
-
-				_style.setBackgroundImage(image);
-			}
-		});
-
-		new Label(top, SWT.NONE);
-
-		Label backgroundRepeatLabel = new Label(top, SWT.NONE);
-		backgroundRepeatLabel
-				.setText(DialogsMessages
-						.getString("BackgroundBoxPreferencePage.BackgroundRepeatLabel")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		backgroundRepeatLabel.setLayoutData(data);
-
-		_backgroundRepeatCombo = new StyleCombo(top, SWT.NONE);
-		_backgroundRepeatCombo.setItems(IStyleConstants.REPEAT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_backgroundRepeatCombo.setLayoutData(data);
-		_backgroundRepeatCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String repeat = _backgroundRepeatCombo.getText();
-
-				_style.setBackgroundRepeat(repeat);
-			}
-		});
-
-		new Label(top, SWT.NONE);
-
-		Label backgroundAttachmentLabel = new Label(top, SWT.NONE);
-		backgroundAttachmentLabel
-				.setText(DialogsMessages
-						.getString("BackgroundBoxPreferencePage.BackgroundAttachmentLabel")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		backgroundAttachmentLabel.setLayoutData(data);
-
-		_backgroundAttachmentCombo = new StyleCombo(top, SWT.NONE);
-		_backgroundAttachmentCombo.setItems(IStyleConstants.ATTACHMENT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_backgroundAttachmentCombo.setLayoutData(data);
-		_backgroundAttachmentCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String attachment = _backgroundAttachmentCombo.getText();
-
-				_style.setBackgroundAttachment(attachment);
-			}
-		});
-
-		new Label(top, SWT.NONE);
-
-		Label backgroundHorizontalLabel = new Label(top, SWT.NONE);
-		backgroundHorizontalLabel.setText(DialogsMessages
-				.getString("BackgroundBoxPreferencePage.HorizontalLabel")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		backgroundHorizontalLabel.setLayoutData(data);
-
-		_horizontalNumberCombo = new StyleCombo(top, SWT.NONE);
-		_horizontalNumberCombo.setItems(IStyleConstants.POSITION);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_horizontalNumberCombo.setLayoutData(data);
-		_horizontalNumberCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_horizontalUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_horizontalNumberCombo.getText());
-				} catch (NumberFormatException ex) {
-					_horizontalUnitCombo.setEnabled(false);
-				}
-
-				String position = _horizontalNumberCombo.getText();
-				if (_horizontalUnitCombo.isEnabled()) {
-					position += _horizontalUnitCombo.getText();
-				}
-
-				_style.setBackgroundPositionX(position);
-			}
-		});
-
-		_horizontalUnitCombo = new StyleCombo(top, SWT.READ_ONLY);
-		_horizontalUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL);
-		_horizontalUnitCombo.setLayoutData(data);
-		_horizontalUnitCombo.select(0);
-		_horizontalUnitCombo.setEnabled(false);
-		_horizontalUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String position = _horizontalNumberCombo.getText();
-				if (_horizontalUnitCombo.isEnabled()) {
-					position += _horizontalUnitCombo.getText();
-				}
-
-				_style.setBackgroundPositionX(position);
-
-			}
-		});
-
-		Label backgroundVerticalLabel = new Label(top, SWT.NONE);
-		backgroundVerticalLabel.setText(DialogsMessages
-				.getString("BackgroundBoxPreferencePage.VerticalLabel")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		backgroundVerticalLabel.setLayoutData(data);
-
-		_verticalNumberCombo = new StyleCombo(top, SWT.NONE);
-		_verticalNumberCombo.setItems(IStyleConstants.POSITION);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_verticalNumberCombo.setLayoutData(data);
-		_verticalNumberCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_verticalUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_verticalNumberCombo.getText());
-				} catch (NumberFormatException ex) {
-					_verticalUnitCombo.setEnabled(false);
-				}
-
-				String position = _verticalNumberCombo.getText();
-				if (_verticalUnitCombo.isEnabled()) {
-					position += _verticalUnitCombo.getText();
-				}
-
-				_style.setBackgroundPositionY(position);
-			}
-		});
-
-		_verticalUnitCombo = new StyleCombo(top, SWT.READ_ONLY);
-		_verticalUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL);
-		_verticalUnitCombo.setLayoutData(data);
-		_verticalUnitCombo.select(0);
-		_verticalUnitCombo.setEnabled(false);
-		_verticalUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String position = _verticalNumberCombo.getText();
-				if (_verticalUnitCombo.isEnabled()) {
-					position += _verticalUnitCombo.getText();
-				}
-
-				_style.setBackgroundPositionY(position);
-			}
-		});
-
-		initializeControls();
-
-		return top;
-	}
-
-	private void initializeControls() {
-		// background-color
-		String color = _style.getBackgroundColor();
-		if (!isEmptyString(color)) {
-			_backgroundColorField.setTextWithoutUpdate(color);
-		}
-
-		// background-image
-		String image = _style.getBackgroundImage();
-		if (!isEmptyString(image)) {
-			int index = _backgroundImageCombo.indexOf(image);
-			if (index != -1) {
-				_backgroundImageCombo.select(index);
-			} else {
-				_backgroundImageCombo.setText(image);
-			}
-		}
-
-		// background-repeat
-		String repeat = _style.getBackgroundRepeat();
-		if (!isEmptyString(repeat)) {
-			int index = _backgroundRepeatCombo.indexOf(repeat);
-			if (index != -1) {
-				_backgroundRepeatCombo.select(index);
-			} else {
-				_backgroundRepeatCombo.setText(repeat);
-			}
-		}
-
-		// background-attachment
-		String attachment = _style.getBackgroundAttachment();
-		if (!isEmptyString(attachment)) {
-			int index = _backgroundAttachmentCombo.indexOf(repeat);
-			if (index != -1) {
-				_backgroundAttachmentCombo.select(index);
-			} else {
-				_backgroundAttachmentCombo.setText(attachment);
-			}
-		}
-
-		// background-position
-		String position = _style.getBackgroundPositionX();
-		if (!isEmptyString(position)) {
-			int index = _horizontalNumberCombo.indexOf(position);
-			if (index != -1) {
-				_horizontalNumberCombo.select(index);
-			} else {
-				_horizontalNumberCombo.setText(position);
-			}
-		}
-		position = _style.getBackgroundPositionY();
-		if (!isEmptyString(position)) {
-			int index = _verticalNumberCombo.indexOf(position);
-			if (index != -1) {
-				_verticalNumberCombo.select(index);
-			} else {
-				_verticalNumberCombo.setText(position);
-			}
-		}
-	}
-
-	public void setVisible(boolean visible) {
-		super.setVisible(visible);
-
-		getApplyButton().setVisible(false);
-		getDefaultsButton().setVisible(false);
-	}
-
-	private boolean isEmptyString(String str) {
-		if (str == null || str.length() == 0) {
-			return true;
-		}
-        return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/BlockPreferenceNode.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/BlockPreferenceNode.java
deleted file mode 100644
index 2f53009..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/BlockPreferenceNode.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.ui.dialogs;
-
-import org.eclipse.jface.preference.IPreferenceNode;
-import org.eclipse.jface.preference.IPreferencePage;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.wst.css.core.internal.util.declaration.CSSPropertyContext;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class BlockPreferenceNode implements IPreferenceNode {
-	private BlockPreferencePage _page;
-
-	private IDOMElement _element;
-
-	private CSSPropertyContext _style;
-
-	/**
-	 * @param element
-	 * @param style
-	 */
-	public BlockPreferenceNode(IDOMElement element, CSSPropertyContext style) {
-		super();
-		_element = element;
-		_style = style;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#add(org.eclipse.jface.preference.IPreferenceNode)
-	 */
-	public void add(IPreferenceNode node) {
-        // TODO: do nothing?
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#createPage()
-	 */
-	public void createPage() {
-		_page = new BlockPreferencePage(_element, _style);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#disposeResources()
-	 */
-	public void disposeResources() {
-        // TODO: do nothing?
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#findSubNode(java.lang.String)
-	 */
-	public IPreferenceNode findSubNode(String id) {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getId()
-	 */
-	public String getId() {
-		return "Block"; //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getLabelImage()
-	 */
-	public Image getLabelImage() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getLabelText()
-	 */
-	public String getLabelText() {
-		return DialogsMessages.getString("BlockPreferenceNode.LabelText"); //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getPage()
-	 */
-	public IPreferencePage getPage() {
-		return _page;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getSubNodes()
-	 */
-	public IPreferenceNode[] getSubNodes() {
-		return new IPreferenceNode[0];
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#remove(java.lang.String)
-	 */
-	public IPreferenceNode remove(String id) {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#remove(org.eclipse.jface.preference.IPreferenceNode)
-	 */
-	public boolean remove(IPreferenceNode node) {
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/BlockPreferencePage.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/BlockPreferencePage.java
deleted file mode 100644
index 786e738..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/BlockPreferencePage.java
+++ /dev/null
@@ -1,398 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.ui.dialogs;
-
-import org.eclipse.jface.preference.PreferencePage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.wst.css.core.internal.util.declaration.CSSPropertyContext;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class BlockPreferencePage extends PreferencePage {
-	private CSSPropertyContext _style;
-
-	private StyleCombo _wordSpacingNumberCombo, _wordSpacingUnitCombo,
-			_letterSpacingNumberCombo, _letterSpacingUnitCombo,
-			_verticalAlignNumberCombo, _verticalAlignUnitCombo,
-			_textAlignCombo, _textIndentUnitCombo, _whiteSpaceCombo,
-			_displayCombo;
-
-	private Text _textIndentText;
-
-	/**
-	 * @param element
-	 * @param style
-	 */
-	public BlockPreferencePage(IDOMElement element, CSSPropertyContext style) {
-		super();
-		_style = style;
-
-		setTitle(DialogsMessages.getString("BlockPreferencePage.Title")); //$NON-NLS-1$
-	}
-
-	/**
-	 * @see org.eclipse.jface.preference.
-	 *      PreferencePage#createContents(Composite)
-	 */
-	protected Control createContents(Composite parent) {
-		GridLayout layout;
-		GridData data;
-
-		Composite top = new Composite(parent, SWT.NONE);
-		layout = new GridLayout(3, false);
-		data = new GridData(GridData.FILL_BOTH);
-		top.setLayout(layout);
-		top.setLayoutData(data);
-
-		Label wordSpacingLabel = new Label(top, SWT.NONE);
-		wordSpacingLabel.setText(DialogsMessages
-				.getString("BlockPreferencePage.WordSpacing")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		wordSpacingLabel.setLayoutData(data);
-
-		_wordSpacingNumberCombo = new StyleCombo(top, SWT.NONE);
-		_wordSpacingNumberCombo.setItems(IStyleConstants.NORMAL);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_wordSpacingNumberCombo.setLayoutData(data);
-		_wordSpacingNumberCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_wordSpacingUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_wordSpacingNumberCombo.getText());
-				} catch (NumberFormatException ex) {
-					_wordSpacingUnitCombo.setEnabled(false);
-				}
-
-				String spacing = _wordSpacingNumberCombo.getText();
-				if (_wordSpacingUnitCombo.isEnabled()) {
-					spacing += _wordSpacingUnitCombo.getText();
-				}
-
-				_style.setWordSpacing(spacing);
-			}
-		});
-
-		_wordSpacingUnitCombo = new StyleCombo(top, SWT.READ_ONLY);
-		_wordSpacingUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_wordSpacingUnitCombo.setLayoutData(data);
-		_wordSpacingUnitCombo.select(0);
-		_wordSpacingUnitCombo.setEnabled(false);
-		_wordSpacingUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String spacing = _wordSpacingNumberCombo.getText();
-				if (_wordSpacingUnitCombo.isEnabled()) {
-					spacing += _wordSpacingUnitCombo.getText();
-				}
-
-				_style.setWordSpacing(spacing);
-
-			}
-		});
-
-		Label letterSpacingLabel = new Label(top, SWT.NONE);
-		letterSpacingLabel.setText(DialogsMessages
-				.getString("BlockPreferencePage.LetterSpacing")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		letterSpacingLabel.setLayoutData(data);
-
-		_letterSpacingNumberCombo = new StyleCombo(top, SWT.NONE);
-		_letterSpacingNumberCombo.setItems(IStyleConstants.NORMAL);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_letterSpacingNumberCombo.setLayoutData(data);
-		_letterSpacingNumberCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_letterSpacingUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_letterSpacingNumberCombo.getText());
-				} catch (NumberFormatException ex) {
-					_letterSpacingUnitCombo.setEnabled(false);
-				}
-
-				String spacing = _letterSpacingNumberCombo.getText();
-				if (_letterSpacingUnitCombo.isEnabled()) {
-					spacing += _letterSpacingUnitCombo.getText();
-				}
-
-				_style.setLetterSpacing(spacing);
-			}
-		});
-
-		_letterSpacingUnitCombo = new StyleCombo(top, SWT.READ_ONLY);
-		_letterSpacingUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_letterSpacingUnitCombo.setLayoutData(data);
-		_letterSpacingUnitCombo.select(0);
-		_letterSpacingUnitCombo.setEnabled(false);
-		_letterSpacingUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String spacing = _letterSpacingNumberCombo.getText();
-				if (_letterSpacingUnitCombo.isEnabled()) {
-					spacing += _letterSpacingUnitCombo.getText();
-				}
-
-				_style.setLetterSpacing(spacing);
-			}
-		});
-
-		Label verticalAlignLabel = new Label(top, SWT.NONE);
-		verticalAlignLabel.setText(DialogsMessages
-				.getString("BlockPreferencePage.VerticalAlign")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		verticalAlignLabel.setLayoutData(data);
-
-		_verticalAlignNumberCombo = new StyleCombo(top, SWT.NONE);
-		_verticalAlignNumberCombo.setItems(IStyleConstants.VERTICAL_ALIGN);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_verticalAlignNumberCombo.setLayoutData(data);
-		_verticalAlignNumberCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_verticalAlignUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_verticalAlignNumberCombo.getText());
-				} catch (NumberFormatException ex) {
-					_verticalAlignUnitCombo.setEnabled(false);
-				}
-
-				String align = _verticalAlignNumberCombo.getText();
-				if (_verticalAlignUnitCombo.isEnabled()) {
-					align += _verticalAlignUnitCombo.getText();
-				}
-
-				_style.setVerticalAlign(align);
-			}
-		});
-
-		_verticalAlignUnitCombo = new StyleCombo(top, SWT.READ_ONLY);
-		_verticalAlignUnitCombo.setItems(IStyleConstants.PERCENT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_verticalAlignUnitCombo.setLayoutData(data);
-		_verticalAlignUnitCombo.select(0);
-		_verticalAlignUnitCombo.setEnabled(false);
-		_verticalAlignUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String align = _verticalAlignNumberCombo.getText();
-				if (_verticalAlignUnitCombo.isEnabled()) {
-					align += _verticalAlignUnitCombo.getText();
-				}
-
-				_style.setVerticalAlign(align);
-			}
-		});
-
-		Label textAlignLabel = new Label(top, SWT.NONE);
-		textAlignLabel.setText(DialogsMessages
-				.getString("BlockPreferencePage.TextAlign")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		textAlignLabel.setLayoutData(data);
-
-		_textAlignCombo = new StyleCombo(top, SWT.NONE);
-		_textAlignCombo.setItems(IStyleConstants.TEXT_ALIGN);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_textAlignCombo.setLayoutData(data);
-		_textAlignCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String align = _textAlignCombo.getText();
-
-				_style.setTextAlign(align);
-			}
-		});
-
-		new Label(top, SWT.NONE);
-
-		Label textIndentLabel = new Label(top, SWT.NONE);
-		textIndentLabel.setText(DialogsMessages
-				.getString("BlockPreferencePage.TextIndent")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		textIndentLabel.setLayoutData(data);
-
-		_textIndentText = new Text(top, SWT.BORDER);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_textIndentText.setLayoutData(data);
-		_textIndentText.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_textIndentUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_textIndentText.getText());
-				} catch (NumberFormatException ex) {
-					_textIndentUnitCombo.setEnabled(false);
-				}
-
-				String indent = _textIndentText.getText();
-				if (_textIndentUnitCombo.isEnabled()) {
-					indent += _textIndentUnitCombo.getText();
-				}
-
-				_style.setTextIndent(indent);
-			}
-		});
-
-		_textIndentUnitCombo = new StyleCombo(top, SWT.READ_ONLY);
-		_textIndentUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_textIndentUnitCombo.setLayoutData(data);
-		_textIndentUnitCombo.select(0);
-		_textIndentUnitCombo.setEnabled(false);
-		_textIndentUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String indent = _textIndentText.getText();
-				if (_textIndentUnitCombo.isEnabled()) {
-					indent += _textIndentUnitCombo.getText();
-				}
-
-				_style.setTextIndent(indent);
-			}
-		});
-
-		Label whiteSpaceLabel = new Label(top, SWT.NONE);
-		whiteSpaceLabel.setText(DialogsMessages
-				.getString("BlockPreferencePage.WhiteSpace")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		whiteSpaceLabel.setLayoutData(data);
-
-		_whiteSpaceCombo = new StyleCombo(top, SWT.NONE);
-		_whiteSpaceCombo.setItems(IStyleConstants.WHITE_SPACE);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_whiteSpaceCombo.setLayoutData(data);
-		_whiteSpaceCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String space = _whiteSpaceCombo.getText();
-
-				_style.setWhiteSpace(space);
-			}
-		});
-
-		new Label(top, SWT.NONE);
-
-		Label displayLabel = new Label(top, SWT.NONE);
-		displayLabel.setText(DialogsMessages
-				.getString("BlockPreferencePage.Display")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		displayLabel.setLayoutData(data);
-
-		_displayCombo = new StyleCombo(top, SWT.NONE);
-		_displayCombo.setItems(IStyleConstants.DISPLAY);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_displayCombo.setLayoutData(data);
-		_displayCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String display = _displayCombo.getText();
-
-				_style.setDisplay(display);
-			}
-		});
-
-		initializeControls();
-
-		return top;
-	}
-
-	private void initializeControls() {
-		// word-spacing
-		String spacing = _style.getWordSpacing();
-		if (!isEmptyString(spacing)) {
-			int index = _wordSpacingNumberCombo.indexOf(spacing);
-			if (index != -1) {
-				_wordSpacingNumberCombo.select(index);
-			} else {
-				_wordSpacingNumberCombo.setText(spacing);
-			}
-		}
-
-		// letter-spacing
-		spacing = _style.getLetterSpacing();
-		if (!isEmptyString(spacing)) {
-			int index = _letterSpacingNumberCombo.indexOf(spacing);
-			if (index != -1) {
-				_letterSpacingNumberCombo.select(index);
-			} else {
-				_letterSpacingNumberCombo.setText(spacing);
-			}
-		}
-
-		// veritcal-align
-		String align = _style.getVerticalAlign();
-		if (!isEmptyString(align)) {
-			int index = _verticalAlignNumberCombo.indexOf(align);
-			if (index != -1) {
-				_verticalAlignNumberCombo.select(index);
-			} else {
-				_verticalAlignNumberCombo.setText(align);
-			}
-		}
-
-		// text-align
-		align = _style.getTextAlign();
-		if (!isEmptyString(align)) {
-			int index = _textAlignCombo.indexOf(align);
-			if (index != -1) {
-				_textAlignCombo.select(index);
-			} else {
-				_textAlignCombo.setText(align);
-			}
-		}
-
-		// text-indent
-		String indent = _style.getTextIndent();
-		if (!isEmptyString(indent)) {
-			_textIndentText.setText(indent);
-		}
-
-		// white-space
-		String space = _style.getWhiteSpace();
-		if (!isEmptyString(space)) {
-			int index = _whiteSpaceCombo.indexOf(space);
-			if (index != -1) {
-				_whiteSpaceCombo.select(index);
-			} else {
-				_whiteSpaceCombo.setText(space);
-			}
-		}
-
-		// display
-		String display = _style.getDisplay();
-		if (!isEmptyString(display)) {
-			int index = _displayCombo.indexOf(display);
-			if (index != -1) {
-				_displayCombo.select(index);
-			} else {
-				_displayCombo.setText(display);
-			}
-		}
-	}
-
-	public void setVisible(boolean visible) {
-		super.setVisible(visible);
-
-		getApplyButton().setVisible(false);
-		getDefaultsButton().setVisible(false);
-	}
-
-    // TODO: seeing this method repeated in on other preference pages..
-	private boolean isEmptyString(String str) {
-		if (str == null || str.length() == 0) {
-			return true;
-		}
-        return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/BorderPreferenceNode.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/BorderPreferenceNode.java
deleted file mode 100644
index 2707d94..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/BorderPreferenceNode.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.ui.dialogs;
-
-import org.eclipse.jface.preference.IPreferenceNode;
-import org.eclipse.jface.preference.IPreferencePage;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.wst.css.core.internal.util.declaration.CSSPropertyContext;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class BorderPreferenceNode implements IPreferenceNode {
-	private BorderPreferencePage _page;
-
-	private IDOMElement _element;
-
-	private CSSPropertyContext _style;
-
-	/**
-	 * @param element
-	 * @param style
-	 */
-	public BorderPreferenceNode(IDOMElement element, CSSPropertyContext style) {
-		super();
-		_element = element;
-		_style = style;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#add(org.eclipse.jface.preference.IPreferenceNode)
-	 */
-	public void add(IPreferenceNode node) {
-        // TODO: do nothing?
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#createPage()
-	 */
-	public void createPage() {
-		_page = new BorderPreferencePage(_element, _style);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#disposeResources()
-	 */
-	public void disposeResources() {
-        // TODO: do nothing?
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#findSubNode(java.lang.String)
-	 */
-	public IPreferenceNode findSubNode(String id) {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getId()
-	 */
-	public String getId() {
-		return "Border"; //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getLabelImage()
-	 */
-	public Image getLabelImage() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getLabelText()
-	 */
-	public String getLabelText() {
-		return DialogsMessages.getString("BorderPreferenceNode.LabelText"); //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getPage()
-	 */
-	public IPreferencePage getPage() {
-		return _page;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getSubNodes()
-	 */
-	public IPreferenceNode[] getSubNodes() {
-		return new IPreferenceNode[0];
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#remove(java.lang.String)
-	 */
-	public IPreferenceNode remove(String id) {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#remove(org.eclipse.jface.preference.IPreferenceNode)
-	 */
-	public boolean remove(IPreferenceNode node) {
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/BorderPreferencePage.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/BorderPreferencePage.java
deleted file mode 100644
index 858bf5c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/BorderPreferencePage.java
+++ /dev/null
@@ -1,538 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.ui.dialogs;
-
-import org.eclipse.jface.preference.PreferencePage;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.ColorButtonDialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogFieldApplyListener;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.wst.css.core.internal.util.declaration.CSSPropertyContext;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class BorderPreferencePage extends PreferencePage {
-	private CSSPropertyContext _style;
-
-	private StyleCombo _styleTopCombo, _styleRightCombo, _styleBottomCombo,
-			_styleLeftCombo;
-
-	private StyleCombo _widthTopNumberCombo, _widthRightNumberCombo,
-			_widthBottomNumberCombo, _widthLeftNumberCombo;
-
-	private StyleCombo _widthTopUnitCombo, _widthRightUnitCombo,
-			_widthBottomUnitCombo, _widthLeftUnitCombo;
-
-	private ColorButtonDialogField _colorTopField, _colorRightField,
-			_colorBottomField, _colorLeftField;
-
-	/**
-	 * @param element
-	 * @param style
-	 */
-	public BorderPreferencePage(IDOMElement element, CSSPropertyContext style) {
-		super();
-		_style = style;
-
-		setTitle(DialogsMessages.getString("BorderPreferencePage.Title")); //$NON-NLS-1$
-	}
-
-	/**
-	 * @see org.eclipse.jface.preference.
-	 *      PreferencePage#createContents(Composite)
-	 */
-	protected Control createContents(Composite parent) {
-		GridLayout layout;
-		GridData data;
-
-		Composite top = new Composite(parent, SWT.NONE);
-		layout = new GridLayout(1, false);
-		data = new GridData(GridData.FILL_BOTH);
-		top.setLayout(layout);
-		top.setLayoutData(data);
-
-		Group styleGroup = new Group(top, SWT.NONE);
-		styleGroup.setText(DialogsMessages
-				.getString("BorderPreferencePage.Style")); //$NON-NLS-1$
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		styleGroup.setLayoutData(data);
-		layout = new GridLayout(2, false);
-		styleGroup.setLayout(layout);
-
-		Label styleTopLabel = new Label(styleGroup, SWT.NONE);
-		styleTopLabel.setText(DialogsMessages
-				.getString("BorderPreferencePage.Top")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		styleTopLabel.setLayoutData(data);
-
-		_styleTopCombo = new StyleCombo(styleGroup, SWT.NONE);
-		_styleTopCombo.setItems(IStyleConstants.BORDER_STYLE);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_styleTopCombo.setLayoutData(data);
-		_styleTopCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String style = _styleTopCombo.getText();
-				_style.setBorderTopStyle(style);
-			}
-		});
-
-		Label styleRightLabel = new Label(styleGroup, SWT.NONE);
-		styleRightLabel.setText(DialogsMessages
-				.getString("BorderPreferencePage.Right")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		styleRightLabel.setLayoutData(data);
-
-		_styleRightCombo = new StyleCombo(styleGroup, SWT.NONE);
-		_styleRightCombo.setItems(IStyleConstants.BORDER_STYLE);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_styleRightCombo.setLayoutData(data);
-		_styleRightCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String style = _styleRightCombo.getText();
-				_style.setBorderRightStyle(style);
-			}
-		});
-
-		Label styleBottomLabel = new Label(styleGroup, SWT.NONE);
-		styleBottomLabel.setText(DialogsMessages
-				.getString("BorderPreferencePage.Bottom")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		styleBottomLabel.setLayoutData(data);
-
-		_styleBottomCombo = new StyleCombo(styleGroup, SWT.NONE);
-		_styleBottomCombo.setItems(IStyleConstants.BORDER_STYLE);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_styleBottomCombo.setLayoutData(data);
-		_styleBottomCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String style = _styleBottomCombo.getText();
-				_style.setBorderBottomStyle(style);
-			}
-		});
-
-		Label styleLeftLabel = new Label(styleGroup, SWT.NONE);
-		styleLeftLabel.setText(DialogsMessages
-				.getString("BorderPreferencePage.Left")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		styleLeftLabel.setLayoutData(data);
-
-		_styleLeftCombo = new StyleCombo(styleGroup, SWT.NONE);
-		_styleLeftCombo.setItems(IStyleConstants.BORDER_STYLE);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_styleLeftCombo.setLayoutData(data);
-		_styleLeftCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String style = _styleLeftCombo.getText();
-				_style.setBorderLeftStyle(style);
-			}
-		});
-
-		Group colorGroup = new Group(top, SWT.NONE);
-		colorGroup.setText(DialogsMessages
-				.getString("BorderPreferencePage.Color")); //$NON-NLS-1$
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		colorGroup.setLayoutData(data);
-		layout = new GridLayout(3, false);
-		colorGroup.setLayout(layout);
-
-		_colorTopField = new ColorButtonDialogField(SWT.BORDER, new ColorUtil());
-		_colorTopField.setLabelText(DialogsMessages
-				.getString("BorderPreferencePage.Top")); //$NON-NLS-1$
-
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		_colorTopField.getLabelControl(null, colorGroup).setLayoutData(data);
-
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_colorTopField.getComboControl(null, colorGroup).setLayoutData(data);
-
-		data = new GridData();
-		_colorTopField.getChangeControl(null, colorGroup).setLayoutData(data);
-		_colorTopField
-				.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
-					public void dialogFieldApplied(DialogField field) {
-						String color = _colorTopField.getText();
-						_style.setBorderTopColor(color);
-					}
-				});
-
-		_colorRightField = new ColorButtonDialogField(SWT.BORDER, new ColorUtil());
-		_colorRightField.setLabelText(DialogsMessages
-				.getString("BorderPreferencePage.Right")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		_colorRightField.getLabelControl(null, colorGroup).setLayoutData(data);
-
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_colorRightField.getComboControl(null, colorGroup).setLayoutData(data);
-
-		data = new GridData();
-		_colorRightField.getChangeControl(null, colorGroup).setLayoutData(data);
-		_colorRightField
-				.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
-					public void dialogFieldApplied(DialogField field) {
-						String color = _colorRightField.getText();
-						_style.setBorderRightColor(color);
-					}
-				});
-
-		_colorBottomField = new ColorButtonDialogField(SWT.BORDER, new ColorUtil());
-		_colorBottomField.setLabelText(DialogsMessages
-				.getString("BorderPreferencePage.Bottom")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		_colorBottomField.getLabelControl(null, colorGroup).setLayoutData(data);
-
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_colorBottomField.getComboControl(null, colorGroup).setLayoutData(data);
-
-		data = new GridData();
-		_colorBottomField.getChangeControl(null, colorGroup)
-				.setLayoutData(data);
-		_colorBottomField
-				.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
-					public void dialogFieldApplied(DialogField field) {
-						String color = _colorBottomField.getText();
-						_style.setBorderBottomColor(color);
-					}
-				});
-
-		_colorLeftField = new ColorButtonDialogField(SWT.BORDER, new ColorUtil());
-		_colorLeftField.setLabelText(DialogsMessages
-				.getString("BorderPreferencePage.Left")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		_colorLeftField.getLabelControl(null, colorGroup).setLayoutData(data);
-
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_colorLeftField.getComboControl(null, colorGroup).setLayoutData(data);
-
-		data = new GridData();
-		_colorLeftField.getChangeControl(null, colorGroup).setLayoutData(data);
-		_colorLeftField
-				.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
-					public void dialogFieldApplied(DialogField field) {
-						String color = _colorLeftField.getText();
-						_style.setBorderLeftColor(color);
-					}
-				});
-
-		Group widthGroup = new Group(top, SWT.NONE);
-		widthGroup.setText(DialogsMessages
-				.getString("BorderPreferencePage.Width")); //$NON-NLS-1$
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		widthGroup.setLayoutData(data);
-		layout = new GridLayout(3, false);
-		widthGroup.setLayout(layout);
-
-		Label widthTopLabel = new Label(widthGroup, SWT.NONE);
-		widthTopLabel.setText(DialogsMessages
-				.getString("BorderPreferencePage.Top")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		widthTopLabel.setLayoutData(data);
-
-		_widthTopNumberCombo = new StyleCombo(widthGroup, SWT.NONE);
-		_widthTopNumberCombo.setItems(IStyleConstants.BORDER_WIDTH);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_widthTopNumberCombo.setLayoutData(data);
-		_widthTopNumberCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_widthTopUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_widthTopNumberCombo.getText());
-				} catch (NumberFormatException ex) {
-					_widthTopUnitCombo.setEnabled(false);
-				}
-
-				String width = _widthTopNumberCombo.getText();
-				if (_widthTopUnitCombo.isEnabled()) {
-					width += _widthTopUnitCombo.getText();
-				}
-
-				_style.setBorderTopWidth(width);
-			}
-		});
-
-		_widthTopUnitCombo = new StyleCombo(widthGroup, SWT.READ_ONLY);
-		_widthTopUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_widthTopUnitCombo.setLayoutData(data);
-		_widthTopUnitCombo.select(0);
-		_widthTopUnitCombo.setEnabled(false);
-		_widthTopUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String width = _widthTopNumberCombo.getText();
-				if (_widthTopUnitCombo.isEnabled()) {
-					width += _widthTopUnitCombo.getText();
-				}
-
-				_style.setBorderTopWidth(width);
-			}
-		});
-
-		Label widthRightLabel = new Label(widthGroup, SWT.NONE);
-		widthRightLabel.setText(DialogsMessages
-				.getString("BorderPreferencePage.Right")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		widthRightLabel.setLayoutData(data);
-
-		_widthRightNumberCombo = new StyleCombo(widthGroup, SWT.NONE);
-		_widthRightNumberCombo.setItems(IStyleConstants.BORDER_WIDTH);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_widthRightNumberCombo.setLayoutData(data);
-		_widthRightNumberCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_widthRightUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_widthRightNumberCombo.getText());
-				} catch (NumberFormatException ex) {
-					_widthRightUnitCombo.setEnabled(false);
-				}
-
-				String width = _widthRightNumberCombo.getText();
-				if (_widthRightUnitCombo.isEnabled()) {
-					width += _widthRightUnitCombo.getText();
-				}
-
-				_style.setBorderRightWidth(width);
-			}
-		});
-
-		_widthRightUnitCombo = new StyleCombo(widthGroup, SWT.READ_ONLY);
-		_widthRightUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_widthRightUnitCombo.setLayoutData(data);
-		_widthRightUnitCombo.select(0);
-		_widthRightUnitCombo.setEnabled(false);
-		_widthRightUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String width = _widthRightNumberCombo.getText();
-				if (_widthRightUnitCombo.isEnabled()) {
-					width += _widthRightUnitCombo.getText();
-				}
-
-				_style.setBorderRightWidth(width);
-			}
-		});
-
-		Label widthBottomLabel = new Label(widthGroup, SWT.NONE);
-		widthBottomLabel.setText(DialogsMessages
-				.getString("BorderPreferencePage.Bottom")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		widthBottomLabel.setLayoutData(data);
-
-		_widthBottomNumberCombo = new StyleCombo(widthGroup, SWT.NONE);
-		_widthBottomNumberCombo.setItems(IStyleConstants.BORDER_WIDTH);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_widthBottomNumberCombo.setLayoutData(data);
-		_widthBottomNumberCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_widthBottomUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_widthBottomNumberCombo.getText());
-				} catch (NumberFormatException ex) {
-					_widthBottomUnitCombo.setEnabled(false);
-				}
-
-				String width = _widthBottomNumberCombo.getText();
-				if (_widthBottomUnitCombo.isEnabled()) {
-					width += _widthBottomUnitCombo.getText();
-				}
-
-				_style.setBorderBottomWidth(width);
-			}
-		});
-
-		_widthBottomUnitCombo = new StyleCombo(widthGroup, SWT.READ_ONLY);
-		_widthBottomUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_widthBottomUnitCombo.setLayoutData(data);
-		_widthBottomUnitCombo.select(0);
-		_widthBottomUnitCombo.setEnabled(false);
-		_widthBottomUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String width = _widthBottomNumberCombo.getText();
-				if (_widthBottomUnitCombo.isEnabled()) {
-					width += _widthBottomUnitCombo.getText();
-				}
-
-				_style.setBorderBottomWidth(width);
-			}
-		});
-
-		Label widthLeftLabel = new Label(widthGroup, SWT.NONE);
-		widthLeftLabel.setText(DialogsMessages
-				.getString("BorderPreferencePage.Left")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		widthLeftLabel.setLayoutData(data);
-
-		_widthLeftNumberCombo = new StyleCombo(widthGroup, SWT.NONE);
-		_widthLeftNumberCombo.setItems(IStyleConstants.BORDER_WIDTH);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_widthLeftNumberCombo.setLayoutData(data);
-		_widthLeftNumberCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_widthLeftUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_widthLeftNumberCombo.getText());
-				} catch (NumberFormatException ex) {
-					_widthLeftUnitCombo.setEnabled(false);
-				}
-
-				String width = _widthLeftNumberCombo.getText();
-				if (_widthLeftUnitCombo.isEnabled()) {
-					width += _widthLeftUnitCombo.getText();
-				}
-
-				_style.setBorderLeftWidth(width);
-			}
-		});
-
-		_widthLeftUnitCombo = new StyleCombo(widthGroup, SWT.READ_ONLY);
-		_widthLeftUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_widthLeftUnitCombo.setLayoutData(data);
-		_widthLeftUnitCombo.select(0);
-		_widthLeftUnitCombo.setEnabled(false);
-		_widthLeftUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String width = _widthLeftNumberCombo.getText();
-				if (_widthLeftUnitCombo.isEnabled()) {
-					width += _widthLeftUnitCombo.getText();
-				}
-
-				_style.setBorderLeftWidth(width);
-			}
-		});
-
-		initializeControls();
-
-		return top;
-	}
-
-	private void initializeControls() {
-		// border-style
-		String style = _style.getBorderTopStyle();
-		if (!isEmptyString(style)) {
-			int index = _styleTopCombo.indexOf(style);
-			if (index != -1) {
-				_styleTopCombo.select(index);
-			} else {
-				_styleTopCombo.setText(style);
-			}
-		}
-		style = _style.getBorderRightStyle();
-		if (!isEmptyString(style)) {
-			int index = _styleRightCombo.indexOf(style);
-			if (index != -1) {
-				_styleRightCombo.select(index);
-			} else {
-				_styleRightCombo.setText(style);
-			}
-		}
-		style = _style.getBorderBottomStyle();
-		if (!isEmptyString(style)) {
-			int index = _styleBottomCombo.indexOf(style);
-			if (index != -1) {
-				_styleBottomCombo.select(index);
-			} else {
-				_styleBottomCombo.setText(style);
-			}
-		}
-		style = _style.getBorderLeftStyle();
-		if (!isEmptyString(style)) {
-			int index = _styleLeftCombo.indexOf(style);
-			if (index != -1) {
-				_styleLeftCombo.select(index);
-			} else {
-				_styleLeftCombo.setText(style);
-			}
-		}
-
-		// border-color
-		String color = _style.getBorderTopColor();
-		if (!isEmptyString(color)) {
-			_colorTopField.setTextWithoutUpdate(color);
-		}
-		color = _style.getBorderRightColor();
-		if (!isEmptyString(color)) {
-			_colorRightField.setTextWithoutUpdate(color);
-		}
-		color = _style.getBorderBottomColor();
-		if (!isEmptyString(color)) {
-			_colorBottomField.setTextWithoutUpdate(color);
-		}
-		color = _style.getBorderLeftColor();
-		if (!isEmptyString(color)) {
-			_colorLeftField.setTextWithoutUpdate(color);
-		}
-
-		// border-width
-		String width = _style.getBorderTopWidth();
-		if (!isEmptyString(width)) {
-			int index = _widthTopNumberCombo.indexOf(width);
-			if (index != -1) {
-				_widthTopNumberCombo.select(index);
-			} else {
-				_widthTopNumberCombo.setText(width);
-			}
-		}
-		width = _style.getBorderRightWidth();
-		if (!isEmptyString(width)) {
-			int index = _widthRightNumberCombo.indexOf(width);
-			if (index != -1) {
-				_widthRightNumberCombo.select(index);
-			} else {
-				_widthRightNumberCombo.setText(width);
-			}
-		}
-		width = _style.getBorderBottomWidth();
-		if (!isEmptyString(width)) {
-			int index = _widthBottomNumberCombo.indexOf(width);
-			if (index != -1) {
-				_widthBottomNumberCombo.select(index);
-			} else {
-				_widthBottomNumberCombo.setText(width);
-			}
-		}
-		width = _style.getBorderLeftWidth();
-		if (!isEmptyString(width)) {
-			int index = _widthLeftNumberCombo.indexOf(width);
-			if (index != -1) {
-				_widthLeftNumberCombo.select(index);
-			} else {
-				_widthLeftNumberCombo.setText(width);
-			}
-		}
-	}
-
-	public void setVisible(boolean visible) {
-		super.setVisible(visible);
-
-		getApplyButton().setVisible(false);
-		getDefaultsButton().setVisible(false);
-	}
-
-	private boolean isEmptyString(String str) {
-		if (str == null || str.length() == 0) {
-			return true;
-		}
-        return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/BoxPreferenceNode.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/BoxPreferenceNode.java
deleted file mode 100644
index 0813ac4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/BoxPreferenceNode.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.ui.dialogs;
-
-import org.eclipse.jface.preference.IPreferenceNode;
-import org.eclipse.jface.preference.IPreferencePage;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.wst.css.core.internal.util.declaration.CSSPropertyContext;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class BoxPreferenceNode implements IPreferenceNode {
-	private BoxPreferencePage _page;
-
-	private IDOMElement _element;
-
-	private CSSPropertyContext _styles;
-
-	/**
-	 * @param element
-	 * @param style
-	 */
-	public BoxPreferenceNode(IDOMElement element, CSSPropertyContext style) {
-		super();
-		_element = element;
-		_styles = style;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#add(org.eclipse.jface.preference.IPreferenceNode)
-	 */
-	public void add(IPreferenceNode node) {
-        // TODO: this pattern is being repeated; perhaps need common super for preference nodes?
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#createPage()
-	 */
-	public void createPage() {
-		_page = new BoxPreferencePage(_element, _styles);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#disposeResources()
-	 */
-	public void disposeResources() {
-        // TODO:
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#findSubNode(java.lang.String)
-	 */
-	public IPreferenceNode findSubNode(String id) {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getId()
-	 */
-	public String getId() {
-		return "Box"; //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getLabelImage()
-	 */
-	public Image getLabelImage() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getLabelText()
-	 */
-	public String getLabelText() {
-		return DialogsMessages.getString("BoxPreferenceNode.LabelText"); //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getPage()
-	 */
-	public IPreferencePage getPage() {
-		return _page;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getSubNodes()
-	 */
-	public IPreferenceNode[] getSubNodes() {
-		return new IPreferenceNode[0];
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#remove(java.lang.String)
-	 */
-	public IPreferenceNode remove(String id) {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#remove(org.eclipse.jface.preference.IPreferenceNode)
-	 */
-	public boolean remove(IPreferenceNode node) {
-		return false;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/BoxPreferencePage.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/BoxPreferencePage.java
deleted file mode 100644
index ecd70c7..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/BoxPreferencePage.java
+++ /dev/null
@@ -1,673 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.ui.dialogs;
-
-import org.eclipse.jface.preference.PreferencePage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.wst.css.core.internal.util.declaration.CSSPropertyContext;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class BoxPreferencePage extends PreferencePage {
-	private CSSPropertyContext _style;
-
-	private StyleCombo _widthNumberCombo, _widthUnitCombo, _heightNumberCombo,
-			_heightUnitCombo, _clearCombo;
-
-	private Text _paddingTopNumberText, _paddingRightNumberText,
-			_paddingBottomNumberText, _paddingLeftNumberText;
-
-	private StyleCombo _paddingTopUnitCombo, _paddingRightUnitCombo,
-			_paddingBottomUnitCombo, _paddingLeftUnitCombo;
-
-	private StyleCombo _marginTopNumberCombo, _marginRightNumberCombo,
-			_marginBottomNumberCombo, _marginLeftNumberCombo;
-
-	private StyleCombo _marginTopUnitCombo, _marginRightUnitCombo,
-			_marginBottomUnitCombo, _marginLeftUnitCombo;
-
-	/**
-	 * @param element
-	 * @param style
-	 */
-	public BoxPreferencePage(IDOMElement element, CSSPropertyContext style) {
-		super();
-		_style = style;
-
-		setTitle(DialogsMessages.getString("BoxPreferencePage.Title")); //$NON-NLS-1$
-	}
-
-	/**
-	 * @see org.eclipse.jface.preference.
-	 *      PreferencePage#createContents(Composite)
-	 */
-	protected Control createContents(Composite parent) {
-		GridLayout layout;
-		GridData data;
-
-		Composite top = new Composite(parent, SWT.NONE);
-		layout = new GridLayout(6, false);
-		data = new GridData(GridData.FILL_BOTH);
-		top.setLayout(layout);
-		top.setLayoutData(data);
-
-		Label widthLabel = new Label(top, SWT.NONE);
-		widthLabel
-				.setText(DialogsMessages.getString("BoxPreferencePage.Width")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		widthLabel.setLayoutData(data);
-
-		_widthNumberCombo = new StyleCombo(top, SWT.NONE);
-		_widthNumberCombo.setItems(IStyleConstants.AUTO);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_widthNumberCombo.setLayoutData(data);
-		_widthNumberCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_widthUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_widthNumberCombo.getText());
-				} catch (NumberFormatException ex) {
-					_widthUnitCombo.setEnabled(false);
-				}
-
-				String width = _widthNumberCombo.getText();
-				if (_widthUnitCombo.isEnabled()) {
-					width += _widthUnitCombo.getText();
-				}
-
-				_style.setWidth(width);
-			}
-		});
-
-		_widthUnitCombo = new StyleCombo(top, SWT.READ_ONLY);
-		_widthUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_widthUnitCombo.setLayoutData(data);
-		_widthUnitCombo.select(0);
-		_widthUnitCombo.setEnabled(false);
-		_widthUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String width = _widthNumberCombo.getText();
-				if (_widthUnitCombo.isEnabled()) {
-					width += _widthUnitCombo.getText();
-				}
-
-				_style.setWidth(width);
-			}
-		});
-
-		Label clearLabel = new Label(top, SWT.NONE);
-		clearLabel
-				.setText(DialogsMessages.getString("BoxPreferencePage.Clear")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		clearLabel.setLayoutData(data);
-
-		_clearCombo = new StyleCombo(top, SWT.NONE);
-		_clearCombo.setItems(IStyleConstants.CLEAR);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_clearCombo.setLayoutData(data);
-		_clearCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String clear = _clearCombo.getText();
-				_style.setClear(clear);
-			}
-		});
-
-		new Label(top, SWT.NONE);
-
-		Label heightLabel = new Label(top, SWT.NONE);
-		heightLabel.setText(DialogsMessages
-				.getString("BoxPreferencePage.Height")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		heightLabel.setLayoutData(data);
-
-		_heightNumberCombo = new StyleCombo(top, SWT.NONE);
-		_heightNumberCombo.setItems(IStyleConstants.AUTO);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_heightNumberCombo.setLayoutData(data);
-		_heightNumberCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_heightUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_heightNumberCombo.getText());
-				} catch (NumberFormatException ex) {
-					_heightUnitCombo.setEnabled(false);
-				}
-
-				String height = _heightNumberCombo.getText();
-				if (_heightUnitCombo.isEnabled()) {
-					height += _heightUnitCombo.getText();
-				}
-
-				_style.setHeight(height);
-			}
-		});
-
-		_heightUnitCombo = new StyleCombo(top, SWT.READ_ONLY);
-		_heightUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_heightUnitCombo.setLayoutData(data);
-		_heightUnitCombo.select(0);
-		_heightUnitCombo.setEnabled(false);
-		_heightUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String height = _heightNumberCombo.getText();
-				if (_heightUnitCombo.isEnabled()) {
-					height += _heightNumberCombo.getText();
-				}
-
-				_style.setHeight(height);
-			}
-		});
-
-		new Label(top, SWT.NONE);
-		new Label(top, SWT.NONE);
-		new Label(top, SWT.NONE);
-
-		Group paddingGroup = new Group(top, SWT.NONE);
-		paddingGroup.setText(DialogsMessages
-				.getString("BoxPreferencePage.Padding")); //$NON-NLS-1$
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		data.horizontalSpan = 3;
-		data.verticalSpan = 4;
-		paddingGroup.setLayoutData(data);
-		layout = new GridLayout(3, false);
-		paddingGroup.setLayout(layout);
-
-		Label paddingTopLabel = new Label(paddingGroup, SWT.NONE);
-		paddingTopLabel.setText(DialogsMessages
-				.getString("BoxPreferencePage.Top")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		paddingTopLabel.setLayoutData(data);
-
-		_paddingTopNumberText = new Text(paddingGroup, SWT.BORDER);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_paddingTopNumberText.setLayoutData(data);
-		_paddingTopNumberText.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_paddingTopUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_paddingTopNumberText.getText());
-				} catch (NumberFormatException ex) {
-					_paddingTopUnitCombo.setEnabled(false);
-				}
-
-				String padding = _paddingTopNumberText.getText();
-				if (_paddingTopUnitCombo.isEnabled()) {
-					padding += _paddingTopUnitCombo.getText();
-				}
-
-				_style.setPaddingTop(padding);
-			}
-		});
-
-		_paddingTopUnitCombo = new StyleCombo(paddingGroup, SWT.READ_ONLY);
-		_paddingTopUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_paddingTopUnitCombo.setLayoutData(data);
-		_paddingTopUnitCombo.select(0);
-		_paddingTopUnitCombo.setEnabled(false);
-		_paddingTopUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String padding = _paddingTopNumberText.getText();
-				if (_paddingTopUnitCombo.isEnabled()) {
-					padding += _paddingTopUnitCombo.getText();
-				}
-
-				_style.setPaddingTop(padding);
-			}
-		});
-
-		Label paddingRightLabel = new Label(paddingGroup, SWT.NONE);
-		paddingRightLabel.setText(DialogsMessages
-				.getString("BoxPreferencePage.Right")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		paddingRightLabel.setLayoutData(data);
-
-		_paddingRightNumberText = new Text(paddingGroup, SWT.BORDER);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_paddingRightNumberText.setLayoutData(data);
-		_paddingRightNumberText.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_paddingRightUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_paddingRightNumberText.getText());
-				} catch (NumberFormatException ex) {
-					_paddingRightUnitCombo.setEnabled(false);
-				}
-
-				String padding = _paddingRightNumberText.getText();
-				if (_paddingRightUnitCombo.isEnabled()) {
-					padding += _paddingRightUnitCombo.getText();
-				}
-
-				_style.setPaddingRight(padding);
-			}
-		});
-
-		_paddingRightUnitCombo = new StyleCombo(paddingGroup, SWT.READ_ONLY);
-		_paddingRightUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_paddingRightUnitCombo.setLayoutData(data);
-		_paddingRightUnitCombo.select(0);
-		_paddingRightUnitCombo.setEnabled(false);
-		_paddingRightUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String padding = _paddingRightNumberText.getText();
-				if (_paddingRightUnitCombo.isEnabled()) {
-					padding += _paddingRightUnitCombo.getText();
-				}
-
-				_style.setPaddingRight(padding);
-			}
-		});
-
-		Label paddingBottomLabel = new Label(paddingGroup, SWT.NONE);
-		paddingBottomLabel.setText(DialogsMessages
-				.getString("BoxPreferencePage.Bottom")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		paddingBottomLabel.setLayoutData(data);
-
-		_paddingBottomNumberText = new Text(paddingGroup, SWT.BORDER);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_paddingBottomNumberText.setLayoutData(data);
-		_paddingBottomNumberText.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_paddingBottomUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_paddingBottomNumberText.getText());
-				} catch (NumberFormatException ex) {
-					_paddingBottomUnitCombo.setEnabled(false);
-				}
-
-				String padding = _paddingBottomNumberText.getText();
-				if (_paddingBottomUnitCombo.isEnabled()) {
-					padding += _paddingBottomUnitCombo.getText();
-				}
-
-				_style.setPaddingBottom(padding);
-			}
-		});
-
-		_paddingBottomUnitCombo = new StyleCombo(paddingGroup, SWT.READ_ONLY);
-		_paddingBottomUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_paddingBottomUnitCombo.setLayoutData(data);
-		_paddingBottomUnitCombo.select(0);
-		_paddingBottomUnitCombo.setEnabled(false);
-		_paddingBottomUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String padding = _paddingBottomNumberText.getText();
-				if (_paddingBottomUnitCombo.isEnabled()) {
-					padding += _paddingBottomUnitCombo.getText();
-				}
-
-				_style.setPaddingBottom(padding);
-			}
-		});
-
-		Label paddingLeftLabel = new Label(paddingGroup, SWT.NONE);
-		paddingLeftLabel.setText(DialogsMessages
-				.getString("BoxPreferencePage.Left")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		paddingLeftLabel.setLayoutData(data);
-
-		_paddingLeftNumberText = new Text(paddingGroup, SWT.BORDER);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_paddingLeftNumberText.setLayoutData(data);
-		_paddingLeftNumberText.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_paddingLeftUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_paddingLeftNumberText.getText());
-				} catch (NumberFormatException ex) {
-					_paddingLeftUnitCombo.setEnabled(false);
-				}
-
-				String top1 = _paddingLeftNumberText.getText();
-				if (_paddingLeftUnitCombo.isEnabled()) {
-					top1 += _paddingLeftUnitCombo.getText();
-				}
-
-				_style.setPaddingLeft(top1);
-			}
-		});
-
-		_paddingLeftUnitCombo = new StyleCombo(paddingGroup, SWT.READ_ONLY);
-		_paddingLeftUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_paddingLeftUnitCombo.setLayoutData(data);
-		_paddingLeftUnitCombo.select(0);
-		_paddingLeftUnitCombo.setEnabled(false);
-		_paddingLeftUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String top1 = _paddingLeftNumberText.getText();
-				if (_paddingLeftUnitCombo.isEnabled()) {
-					top1 += _paddingLeftUnitCombo.getText();
-				}
-
-				_style.setPaddingLeft(top1);
-			}
-		});
-
-		Group marginGroup = new Group(top, SWT.NONE);
-		marginGroup.setText(DialogsMessages
-				.getString("BoxPreferencePage.Margin")); //$NON-NLS-1$
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		data.horizontalSpan = 3;
-		data.verticalSpan = 4;
-		marginGroup.setLayoutData(data);
-		layout = new GridLayout(3, false);
-		marginGroup.setLayout(layout);
-
-		Label marginTopLabel = new Label(marginGroup, SWT.NONE);
-		marginTopLabel.setText(DialogsMessages
-				.getString("BoxPreferencePage.Top")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		marginTopLabel.setLayoutData(data);
-
-		_marginTopNumberCombo = new StyleCombo(marginGroup, SWT.NONE);
-		_marginTopNumberCombo.setItems(IStyleConstants.AUTO);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_marginTopNumberCombo.setLayoutData(data);
-		_marginTopNumberCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_marginTopUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_marginTopNumberCombo.getText());
-				} catch (NumberFormatException ex) {
-					_marginTopUnitCombo.setEnabled(false);
-				}
-
-				String margin = _marginTopNumberCombo.getText();
-				if (_marginTopUnitCombo.isEnabled()) {
-					margin += _marginTopUnitCombo.getText();
-				}
-
-				_style.setMarginTop(margin);
-			}
-		});
-
-		_marginTopUnitCombo = new StyleCombo(marginGroup, SWT.READ_ONLY);
-		_marginTopUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_marginTopUnitCombo.setLayoutData(data);
-		_marginTopUnitCombo.select(0);
-		_marginTopUnitCombo.setEnabled(false);
-		_marginTopUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String margin = _marginTopNumberCombo.getText();
-				if (_marginTopUnitCombo.isEnabled()) {
-					margin += _marginTopUnitCombo.getText();
-				}
-
-				_style.setMarginTop(margin);
-			}
-		});
-
-		Label marginRightLabel = new Label(marginGroup, SWT.NONE);
-		marginRightLabel.setText(DialogsMessages
-				.getString("BoxPreferencePage.Right")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		marginRightLabel.setLayoutData(data);
-
-		_marginRightNumberCombo = new StyleCombo(marginGroup, SWT.NONE);
-		_marginRightNumberCombo.setItems(IStyleConstants.AUTO);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_marginRightNumberCombo.setLayoutData(data);
-		_marginRightNumberCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_marginRightUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_marginRightNumberCombo.getText());
-				} catch (NumberFormatException ex) {
-					_marginRightUnitCombo.setEnabled(false);
-				}
-
-				String margin = _marginRightNumberCombo.getText();
-				if (_marginRightUnitCombo.isEnabled()) {
-					margin += _marginRightUnitCombo.getText();
-				}
-
-				_style.setMarginRight(margin);
-			}
-		});
-
-		_marginRightUnitCombo = new StyleCombo(marginGroup, SWT.READ_ONLY);
-		_marginRightUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_marginRightUnitCombo.setLayoutData(data);
-		_marginRightUnitCombo.select(0);
-		_marginRightUnitCombo.setEnabled(false);
-		_marginRightUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String margin = _marginRightNumberCombo.getText();
-				if (_marginRightUnitCombo.isEnabled()) {
-					margin += _marginRightUnitCombo.getText();
-				}
-
-				_style.setMarginRight(margin);
-			}
-		});
-
-		Label marginBottomLabel = new Label(marginGroup, SWT.NONE);
-		marginBottomLabel.setText(DialogsMessages
-				.getString("BoxPreferencePage.Bottom")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		marginBottomLabel.setLayoutData(data);
-
-		_marginBottomNumberCombo = new StyleCombo(marginGroup, SWT.NONE);
-		_marginBottomNumberCombo.setItems(IStyleConstants.AUTO);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_marginBottomNumberCombo.setLayoutData(data);
-		_marginBottomNumberCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_marginBottomUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_marginBottomNumberCombo.getText());
-				} catch (NumberFormatException ex) {
-					_marginBottomUnitCombo.setEnabled(false);
-				}
-
-				String margin = _marginBottomNumberCombo.getText();
-				if (_marginBottomUnitCombo.isEnabled()) {
-					margin += _marginBottomUnitCombo.getText();
-				}
-
-				_style.setMarginBottom(margin);
-			}
-		});
-
-		_marginBottomUnitCombo = new StyleCombo(marginGroup, SWT.READ_ONLY);
-		_marginBottomUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_marginBottomUnitCombo.setLayoutData(data);
-		_marginBottomUnitCombo.select(0);
-		_marginBottomUnitCombo.setEnabled(false);
-		_marginBottomUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String margin = _marginBottomNumberCombo.getText();
-				if (_marginBottomUnitCombo.isEnabled()) {
-					margin += _marginBottomUnitCombo.getText();
-				}
-
-				_style.setMarginBottom(margin);
-			}
-		});
-
-		Label marginLeftLabel = new Label(marginGroup, SWT.NONE);
-		marginLeftLabel.setText(DialogsMessages
-				.getString("BoxPreferencePage.Left")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		marginLeftLabel.setLayoutData(data);
-
-		_marginLeftNumberCombo = new StyleCombo(marginGroup, SWT.NONE);
-		_marginLeftNumberCombo.setItems(IStyleConstants.AUTO);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_marginLeftNumberCombo.setLayoutData(data);
-		_marginLeftNumberCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_marginLeftUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_marginLeftNumberCombo.getText());
-				} catch (NumberFormatException ex) {
-					_marginLeftUnitCombo.setEnabled(false);
-				}
-
-				String top1 = _marginLeftNumberCombo.getText();
-				if (_marginLeftUnitCombo.isEnabled()) {
-					top1 += _marginLeftUnitCombo.getText();
-				}
-
-				_style.setMarginLeft(top1);
-			}
-		});
-
-		_marginLeftUnitCombo = new StyleCombo(marginGroup, SWT.READ_ONLY);
-		_marginLeftUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_marginLeftUnitCombo.setLayoutData(data);
-		_marginLeftUnitCombo.select(0);
-		_marginLeftUnitCombo.setEnabled(false);
-		_marginLeftUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String top1 = _marginLeftNumberCombo.getText();
-				if (_marginLeftUnitCombo.isEnabled()) {
-					top1 += _marginLeftUnitCombo.getText();
-				}
-
-				_style.setMarginLeft(top1);
-			}
-		});
-
-		initializeControls();
-
-		return top;
-	}
-
-	private void initializeControls() {
-		// width
-		String width = _style.getWidth();
-		if (!isEmptyString(width)) {
-			int index = _widthNumberCombo.indexOf(width);
-			if (index != -1) {
-				_widthNumberCombo.select(index);
-			} else {
-				_widthNumberCombo.setText(width);
-			}
-		}
-
-		// height
-		String height = _style.getHeight();
-		if (!isEmptyString(height)) {
-			int index = _heightNumberCombo.indexOf(height);
-			if (index != -1) {
-				_heightNumberCombo.select(index);
-			} else {
-				_heightNumberCombo.setText(height);
-			}
-		}
-
-		// clear
-		String clear = _style.getClear();
-		if (!isEmptyString(clear)) {
-			int index = _clearCombo.indexOf(clear);
-			if (index != -1) {
-				_clearCombo.select(index);
-			} else {
-				_clearCombo.setText(clear);
-			}
-		}
-
-		// padding
-		String padding = _style.getPaddingTop();
-		if (!isEmptyString(padding)) {
-			_paddingTopNumberText.setText(padding);
-		}
-		padding = _style.getPaddingRight();
-		if (!isEmptyString(padding)) {
-			_paddingRightNumberText.setText(padding);
-		}
-		padding = _style.getPaddingBottom();
-		if (!isEmptyString(padding)) {
-			_paddingBottomNumberText.setText(padding);
-		}
-		padding = _style.getPaddingLeft();
-		if (!isEmptyString(padding)) {
-			_paddingLeftNumberText.setText(padding);
-		}
-
-		// margin
-		String margin = _style.getMarginTop();
-		if (!isEmptyString(margin)) {
-			int index = _marginTopNumberCombo.indexOf(margin);
-			if (index != -1) {
-				_marginTopNumberCombo.select(index);
-			} else {
-				_marginTopNumberCombo.setText(margin);
-			}
-		}
-		margin = _style.getMarginRight();
-		if (!isEmptyString(margin)) {
-			int index = _marginRightNumberCombo.indexOf(margin);
-			if (index != -1) {
-				_marginRightNumberCombo.select(index);
-			} else {
-				_marginRightNumberCombo.setText(margin);
-			}
-		}
-		margin = _style.getMarginBottom();
-		if (!isEmptyString(margin)) {
-			int index = _marginBottomNumberCombo.indexOf(margin);
-			if (index != -1) {
-				_marginBottomNumberCombo.select(index);
-			} else {
-				_marginBottomNumberCombo.setText(margin);
-			}
-		}
-		margin = _style.getMarginLeft();
-		if (!isEmptyString(margin)) {
-			int index = _marginLeftNumberCombo.indexOf(margin);
-			if (index != -1) {
-				_marginLeftNumberCombo.select(index);
-			} else {
-				_marginLeftNumberCombo.setText(margin);
-			}
-		}
-	}
-
-	public void setVisible(boolean visible) {
-		super.setVisible(visible);
-
-		getApplyButton().setVisible(false);
-		getDefaultsButton().setVisible(false);
-	}
-
-	private boolean isEmptyString(String str) {
-		if (str == null || str.length() == 0) {
-			return true;
-		}
-        return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/ColorUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/ColorUtil.java
deleted file mode 100644
index a8590fa..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/ColorUtil.java
+++ /dev/null
@@ -1,215 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.ui.dialogs;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.ColorPalette;
-import org.eclipse.swt.graphics.Color;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ColorUtil extends ColorPalette {
-	private static final Map EXTENDED_COLORS = new HashMap(20);
-
-	private static final Map BASIC_COLORS = new HashMap(143);
-
-	static {
-		BASIC_COLORS.put("Aqua", new Color(null, 0x00, 0xFF, 0xFF)); //$NON-NLS-1$
-		BASIC_COLORS.put("Black", new Color(null, 0x00, 0x00, 0x00)); //$NON-NLS-1$
-		BASIC_COLORS.put("Blue", new Color(null, 0x00, 0x00, 0xFF)); //$NON-NLS-1$
-		BASIC_COLORS.put("Fuchsia", new Color(null, 0xFF, 0x00, 0xFF)); //$NON-NLS-1$
-		BASIC_COLORS.put("Gray", new Color(null, 0x80, 0x80, 0x80)); //$NON-NLS-1$
-		BASIC_COLORS.put("Green", new Color(null, 0x00, 0x80, 0x00)); //$NON-NLS-1$
-		BASIC_COLORS.put("Lime", new Color(null, 0x00, 0xFF, 0x00)); //$NON-NLS-1$
-		BASIC_COLORS.put("Maroon", new Color(null, 0x80, 0x00, 0x00)); //$NON-NLS-1$
-		BASIC_COLORS.put("Navy", new Color(null, 0x00, 0x00, 0x80)); //$NON-NLS-1$
-		BASIC_COLORS.put("Olive", new Color(null, 0x80, 0x80, 0x00)); //$NON-NLS-1$
-		BASIC_COLORS.put("Purple", new Color(null, 0x80, 0x00, 0x80)); //$NON-NLS-1$
-		BASIC_COLORS.put("Red", new Color(null, 0xFF, 0x00, 0x00)); //$NON-NLS-1$
-		BASIC_COLORS.put("Silver", new Color(null, 0xC0, 0xC0, 0xC0)); //$NON-NLS-1$
-		BASIC_COLORS.put("Teal", new Color(null, 0x00, 0x80, 0x80)); //$NON-NLS-1$
-		BASIC_COLORS.put("White", new Color(null, 0xFF, 0xFF, 0xFF)); //$NON-NLS-1$
-		BASIC_COLORS.put("Yellow", new Color(null, 0xFF, 0xFF, 0x00)); //$NON-NLS-1$
-	}
-
-	static {
-		EXTENDED_COLORS.put("AliceBlue", new Color(null, 0xF0, 0xF8, 0xFF)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("AntiqueWhite", new Color(null, 0xFA, 0xEB, 0xD7)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("Aqua", new Color(null, 0x00, 0xFF, 0xFF)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("Aquamarine", new Color(null, 0x7F, 0xFF, 0xD4)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("Azure", new Color(null, 0xF0, 0xFF, 0xFF)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("Beige", new Color(null, 0xF5, 0xF5, 0xDC)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("Bisque", new Color(null, 0xFF, 0xE4, 0xC4)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("Black", new Color(null, 0x00, 0x00, 0x00)); //$NON-NLS-1$
-		EXTENDED_COLORS
-				.put("BlanchedAlmond", new Color(null, 0xFF, 0xEB, 0xCD)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("Blue", new Color(null, 0x00, 0x00, 0xFF)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("BlueViolet", new Color(null, 0x8A, 0x2B, 0xE2)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("Brown", new Color(null, 0xA5, 0x2A, 0x2A)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("BurlyWood", new Color(null, 0xDE, 0xB8, 0x87)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("CadetBlue", new Color(null, 0x5F, 0x9E, 0xA0)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("Chartreuse", new Color(null, 0x7F, 0xFF, 0x00)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("Chocolate", new Color(null, 0xD2, 0x69, 0x1E)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("Coral", new Color(null, 0xFF, 0x7F, 0x50)); //$NON-NLS-1$
-		EXTENDED_COLORS
-				.put("CornflowerBlue", new Color(null, 0x64, 0x95, 0xED)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("Cornsilk", new Color(null, 0xFF, 0xF8, 0xDC)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("Crimson", new Color(null, 0xDC, 0x14, 0x3C)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("Cyan", new Color(null, 0x00, 0xFF, 0xFF)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("DarkBlue", new Color(null, 0x00, 0x00, 0x8B)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("DarkCyan", new Color(null, 0x00, 0x8B, 0x8B)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("DarkGoldenRod", new Color(null, 0xB8, 0x86, 0x0B)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("DarkGray", new Color(null, 0xA9, 0xA9, 0xA9)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("DarkGreen", new Color(null, 0x00, 0x64, 0x00)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("DarkKhaki", new Color(null, 0xBD, 0xB7, 0x6B)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("DarkMagenta", new Color(null, 0x8B, 0x00, 0x8B)); //$NON-NLS-1$
-		EXTENDED_COLORS
-				.put("DarkOliveGreen", new Color(null, 0x55, 0x6B, 0x2F)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("Darkorange", new Color(null, 0xFF, 0x8C, 0x00)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("DarkOrchid", new Color(null, 0x99, 0x32, 0xCC)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("DarkRed", new Color(null, 0x8B, 0x00, 0x00)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("DarkSalmon", new Color(null, 0xE9, 0x96, 0x7A)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("DarkSeaGreen", new Color(null, 0x8F, 0xBC, 0x8F)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("DarkSlateBlue", new Color(null, 0x48, 0x3D, 0x8B)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("DarkSlateGray", new Color(null, 0x2F, 0x4F, 0x4F)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("DarkTurquoise", new Color(null, 0x00, 0xCE, 0xD1)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("DarkViolet", new Color(null, 0x94, 0x00, 0xD3)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("DeepPink", new Color(null, 0xFF, 0x14, 0x93)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("DeepSkyBlue", new Color(null, 0x00, 0xBF, 0xFF)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("DimGray", new Color(null, 0x69, 0x69, 0x69)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("DodgerBlue", new Color(null, 0x1E, 0x90, 0xFF)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("Feldspar", new Color(null, 0xD1, 0x92, 0x75)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("FireBrick", new Color(null, 0xB2, 0x22, 0x22)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("FloralWhite", new Color(null, 0xFF, 0xFA, 0xF0)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("ForestGreen", new Color(null, 0x22, 0x8B, 0x22)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("Fuchsia", new Color(null, 0xFF, 0x00, 0xFF)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("Gainsboro", new Color(null, 0xDC, 0xDC, 0xDC)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("GhostWhite", new Color(null, 0xF8, 0xF8, 0xFF)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("Gold", new Color(null, 0xFF, 0xD7, 0x00)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("GoldenRod", new Color(null, 0xDA, 0xA5, 0x20)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("Gray", new Color(null, 0x80, 0x80, 0x80)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("Green", new Color(null, 0x00, 0x80, 0x00)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("GreenYellow", new Color(null, 0xAD, 0xFF, 0x2F)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("HoneyDew", new Color(null, 0xF0, 0xFF, 0xF0)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("HotPink", new Color(null, 0xFF, 0x69, 0xB4)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("IndianRed", new Color(null, 0xCD, 0x5C, 0x5C)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("Indigo", new Color(null, 0x4B, 0x00, 0x82)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("Ivory", new Color(null, 0xFF, 0xFF, 0xF0)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("Khaki", new Color(null, 0xF0, 0xE6, 0x8C)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("Lavender", new Color(null, 0xE6, 0xE6, 0xFA)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("LavenderBlush", new Color(null, 0xFF, 0xF0, 0xF5)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("LawnGreen", new Color(null, 0x7C, 0xFC, 0x00)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("LemonChiffon", new Color(null, 0xFF, 0xFA, 0xCD)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("LightBlue", new Color(null, 0xAD, 0xD8, 0xE6)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("LightCoral", new Color(null, 0xF0, 0x80, 0x80)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("LightCyan", new Color(null, 0xE0, 0xFF, 0xFF)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("LightGoldenRodYellow", new Color(null, 0xFA, 0xFA, //$NON-NLS-1$
-				0xD2));
-		EXTENDED_COLORS.put("LightGrey", new Color(null, 0xD3, 0xD3, 0xD3)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("LightGreen", new Color(null, 0x90, 0xEE, 0x90)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("LightPink", new Color(null, 0xFF, 0xB6, 0xC1)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("LightSalmon", new Color(null, 0xFF, 0xA0, 0x7A)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("LightSeaGreen", new Color(null, 0x20, 0xB2, 0xAA)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("LightSkyBlue", new Color(null, 0x87, 0xCE, 0xFA)); //$NON-NLS-1$
-		EXTENDED_COLORS
-				.put("LightSlateBlue", new Color(null, 0x84, 0x70, 0xFF)); //$NON-NLS-1$
-		EXTENDED_COLORS
-				.put("LightSlateGray", new Color(null, 0x77, 0x88, 0x99)); //$NON-NLS-1$
-		EXTENDED_COLORS
-				.put("LightSteelBlue", new Color(null, 0xB0, 0xC4, 0xDE)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("LightYellow", new Color(null, 0xFF, 0xFF, 0xE0)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("Lime", new Color(null, 0x00, 0xFF, 0x00)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("LimeGreen", new Color(null, 0x32, 0xCD, 0x32)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("Linen", new Color(null, 0xFA, 0xF0, 0xE6)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("Magenta", new Color(null, 0xFF, 0x00, 0xFF)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("Maroon", new Color(null, 0x80, 0x00, 0x00)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("MediumAquaMarine", new Color(null, 0x66, 0xCD, //$NON-NLS-1$
-				0xAA));
-		EXTENDED_COLORS.put("MediumBlue", new Color(null, 0x00, 0x00, 0xCD)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("MediumOrchid", new Color(null, 0xBA, 0x55, 0xD3)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("MediumPurple", new Color(null, 0x93, 0x70, 0xD8)); //$NON-NLS-1$
-		EXTENDED_COLORS
-				.put("MediumSeaGreen", new Color(null, 0x3C, 0xB3, 0x71)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("MediumSlateBlue", //$NON-NLS-1$
-				new Color(null, 0x7B, 0x68, 0xEE));
-		EXTENDED_COLORS.put("MediumSpringGreen", new Color(null, 0x00, 0xFA, //$NON-NLS-1$
-				0x9A));
-		EXTENDED_COLORS.put("MediumTurquoise", //$NON-NLS-1$
-				new Color(null, 0x48, 0xD1, 0xCC));
-		EXTENDED_COLORS.put("MediumVioletRed", //$NON-NLS-1$
-				new Color(null, 0xC7, 0x15, 0x85));
-		EXTENDED_COLORS.put("MidnightBlue", new Color(null, 0x19, 0x19, 0x70)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("MintCream", new Color(null, 0xF5, 0xFF, 0xFA)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("MistyRose", new Color(null, 0xFF, 0xE4, 0xE1)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("Moccasin", new Color(null, 0xFF, 0xE4, 0xB5)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("NavajoWhite", new Color(null, 0xFF, 0xDE, 0xAD)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("Navy", new Color(null, 0x00, 0x00, 0x80)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("OldLace", new Color(null, 0xFD, 0xF5, 0xE6)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("Olive", new Color(null, 0x80, 0x80, 0x00)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("OliveDrab", new Color(null, 0x6B, 0x8E, 0x23)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("Orange", new Color(null, 0xFF, 0xA5, 0x00)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("OrangeRed", new Color(null, 0xFF, 0x45, 0x00)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("Orchid", new Color(null, 0xDA, 0x70, 0xD6)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("PaleGoldenRod", new Color(null, 0xEE, 0xE8, 0xAA)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("PaleGreen", new Color(null, 0x98, 0xFB, 0x98)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("PaleTurquoise", new Color(null, 0xAF, 0xEE, 0xEE)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("PaleVioletRed", new Color(null, 0xD8, 0x70, 0x93)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("PapayaWhip", new Color(null, 0xFF, 0xEF, 0xD5)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("PeachPuff", new Color(null, 0xFF, 0xDA, 0xB9)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("Peru", new Color(null, 0xCD, 0x85, 0x3F)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("Pink", new Color(null, 0xFF, 0xC0, 0xCB)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("Plum", new Color(null, 0xDD, 0xA0, 0xDD)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("PowderBlue", new Color(null, 0xB0, 0xE0, 0xE6)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("Purple", new Color(null, 0x80, 0x00, 0x80)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("Red", new Color(null, 0xFF, 0x00, 0x00)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("RosyBrown", new Color(null, 0xBC, 0x8F, 0x8F)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("RoyalBlue", new Color(null, 0x41, 0x69, 0xE1)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("SaddleBrown", new Color(null, 0x8B, 0x45, 0x13)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("Salmon", new Color(null, 0xFA, 0x80, 0x72)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("SandyBrown", new Color(null, 0xF4, 0xA4, 0x60)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("SeaGreen", new Color(null, 0x2E, 0x8B, 0x57)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("SeaShell", new Color(null, 0xFF, 0xF5, 0xEE)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("Sienna", new Color(null, 0xA0, 0x52, 0x2D)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("Silver", new Color(null, 0xC0, 0xC0, 0xC0)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("SkyBlue", new Color(null, 0x87, 0xCE, 0xEB)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("SlateBlue", new Color(null, 0x6A, 0x5A, 0xCD)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("SlateGray", new Color(null, 0x70, 0x80, 0x90)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("Snow", new Color(null, 0xFF, 0xFA, 0xFA)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("SpringGreen", new Color(null, 0x00, 0xFF, 0x7F)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("SteelBlue", new Color(null, 0x46, 0x82, 0xB4)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("Tan", new Color(null, 0xD2, 0xB4, 0x8C)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("Teal", new Color(null, 0x00, 0x80, 0x80)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("Thistle", new Color(null, 0xD8, 0xBF, 0xD8)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("Tomato", new Color(null, 0xFF, 0x63, 0x47)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("Turquoise", new Color(null, 0x40, 0xE0, 0xD0)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("Violet", new Color(null, 0xEE, 0x82, 0xEE)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("VioletRed", new Color(null, 0xD0, 0x20, 0x90)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("Wheat", new Color(null, 0xF5, 0xDE, 0xB3)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("White", new Color(null, 0xFF, 0xFF, 0xFF)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("WhiteSmoke", new Color(null, 0xF5, 0xF5, 0xF5)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("Yellow", new Color(null, 0xFF, 0xFF, 0x00)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("YellowGreen", new Color(null, 0x9A, 0xCD, 0x32)); //$NON-NLS-1$
-	}
-
-	public final Map getBasicColorMap() {
-		return Collections.unmodifiableMap(BASIC_COLORS);
-	}
-
-	public final Map getExtendedColorMap() {
-		return Collections.unmodifiableMap(EXTENDED_COLORS);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/DialogsMessages.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/DialogsMessages.java
deleted file mode 100644
index 612d976..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/DialogsMessages.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.ui.dialogs;
-
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class DialogsMessages {
-	private static final String BUNDLE_NAME = "org.eclipse.jst.pagedesigner.ui.dialogs.DialogsMessages"; //$NON-NLS-1$
-
-	private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle
-			.getBundle(BUNDLE_NAME);
-
-	private DialogsMessages() {
-        // no external instantiation
-	}
-
-	/**
-	 * @param key
-	 * @return the value for key or !!key!! if none
-	 */
-	public static String getString(String key) {
-		try {
-			return RESOURCE_BUNDLE.getString(key);
-		} catch (MissingResourceException e) {
-			return '!' + key + '!';
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/DialogsMessages.properties b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/DialogsMessages.properties
deleted file mode 100644
index 6a49cd0..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/DialogsMessages.properties
+++ /dev/null
@@ -1,99 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-StyleButtonDialogField.Edit=Edit...
-StyleDialog.Title=CSS Style Definition
-
-TextPreferenceNode.LabelText=Text
-TextPreferencePage.Title=Text
-TextPreferencePage.Font=Font:
-TextPreferencePage.Size=Size:
-TextPreferencePage.Weight=Weight:
-TextPreferencePage.Style=Style:
-TextPreferencePage.Variant=Variant:
-TextPreferencePage.LineHeight=Line Height:
-TextPreferencePage.Case=Case:
-TextPreferencePage.Decoration=Decoration:
-TextPreferencePage.Color=Color:
-
-BackgroundPreferenceNode.LabelText=Background
-BackgroundPreferencePage.Title=Background
-BackgroundBoxPreferencePage.BackgroundColor=Background color:
-BackgroundBoxPreferencePage.BackgroundImage=Background image:
-BackgroundBoxPreferencePage.BackgroundRepeatLabel=Repeat:
-BackgroundBoxPreferencePage.BackgroundAttachmentLabel=Attachment:
-BackgroundBoxPreferencePage.HorizontalLabel=Horizontal position:
-BackgroundBoxPreferencePage.VerticalLabel=Vertical position:
-
-BlockPreferenceNode.LabelText=Block
-BlockPreferencePage.Title=Block
-BlockPreferencePage.WordSpacing=Word spacing:
-BlockPreferencePage.LetterSpacing=Letter spacing:
-BlockPreferencePage.VerticalAlign=Vertical align:
-BlockPreferencePage.TextAlign=Text align:
-BlockPreferencePage.TextIndent=Text indent:
-BlockPreferencePage.WhiteSpace=White space:
-BlockPreferencePage.Display=Display:
-
-BoxPreferenceNode.LabelText=Box
-BoxPreferencePage.Title=Box
-BoxPreferencePage.Width=Width:
-BoxPreferencePage.Clear=Clear:
-BoxPreferencePage.Height=Height:
-BoxPreferencePage.Padding=Padding
-BoxPreferencePage.Margin=Margin
-BoxPreferencePage.Top=Top:
-BoxPreferencePage.Right=Right:
-BoxPreferencePage.Bottom=Bottom:
-BoxPreferencePage.Left=Left:
-
-BorderPreferenceNode.LabelText=Border
-BorderPreferencePage.Title=Border
-BorderPreferencePage.Style=Style
-BorderPreferencePage.Width=Width
-BorderPreferencePage.Color=Color
-BorderPreferencePage.Top=Top:
-BorderPreferencePage.Right=Right:
-BorderPreferencePage.Bottom=Bottom:
-BorderPreferencePage.Left=Left:
-
-ListPreferenceNode.LabelText=List
-ListPreferencePage.Title=List
-ListPreferencePage.Type=Type:
-ListPreferencePage.Image=Bullet image:
-ListPreferencePage.Position=Position:
-
-PositioningPreferenceNode.LabelText=Positioning
-PositioningPreferencePage.Title=Positioning
-PositioningPreferencePage.Type=Type:
-PositioningPreferencePage.Visibility=Visibility:
-PositioningPreferencePage.Width=Width:
-PositioningPreferencePage.ZIndex=Z-Index:
-PositioningPreferencePage.Height=Height:
-PositioningPreferencePage.Overflow=Overflow:
-PositioningPreferencePage.Placement=Placement
-PositioningPreferencePage.Clip=Clip
-PositioningPreferencePage.Right=Right:
-PositioningPreferencePage.Bottom=Bottom:
-PositioningPreferencePage.Left=Left:
-
-ExtensionsPreferenceNode.LabelText=Extensions
-ExtensionsPreferencePage.Title=Extensions
-ExtensionsPreferencePage.PageBreak=Page break
-ExtensionsPreferencePage.Before=Before:
-ExtensionsPreferencePage.After=After:
-ExtensionsPreferencePage.VisualEffect=Visual effect
-ExtensionsPreferencePage.Cursor=Cursor:
-
-WPEPropertyPage.Description=Select a tag library to see associated skins and set a current skin.
-WPEPropertyPage.TagLibs.Label=&Tag libraries:
-WPEPropertyPage.Skins.Label=Associated &skins:
-WPEPropertyPage.Current.Button=&Current
-WPEPropertyPage.Skins.Item.Current=(current)
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/ExtensionsPreferenceNode.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/ExtensionsPreferenceNode.java
deleted file mode 100644
index 4eab2d2..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/ExtensionsPreferenceNode.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.ui.dialogs;
-
-import org.eclipse.jface.preference.IPreferenceNode;
-import org.eclipse.jface.preference.IPreferencePage;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.wst.css.core.internal.util.declaration.CSSPropertyContext;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ExtensionsPreferenceNode implements IPreferenceNode {
-	private ExtensionsPreferencePage _page;
-
-	private IDOMElement _element;
-
-	private CSSPropertyContext _style;
-
-	/**
-	 * @param element
-	 * @param style
-	 */
-	public ExtensionsPreferenceNode(IDOMElement element,
-			CSSPropertyContext style) {
-		super();
-		_element = element;
-		_style = style;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#add(org.eclipse.jface.preference.IPreferenceNode)
-	 */
-	public void add(IPreferenceNode node) {
-        // TODO:
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#createPage()
-	 */
-	public void createPage() {
-		_page = new ExtensionsPreferencePage(_element, _style);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#disposeResources()
-	 */
-	public void disposeResources() {
-        // TODO:
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#findSubNode(java.lang.String)
-	 */
-	public IPreferenceNode findSubNode(String id) {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getId()
-	 */
-	public String getId() {
-		return "Extensions"; //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getLabelImage()
-	 */
-	public Image getLabelImage() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getLabelText()
-	 */
-	public String getLabelText() {
-		return DialogsMessages.getString("ExtensionsPreferenceNode.LabelText"); //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getPage()
-	 */
-	public IPreferencePage getPage() {
-		return _page;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getSubNodes()
-	 */
-	public IPreferenceNode[] getSubNodes() {
-		return new IPreferenceNode[0];
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#remove(java.lang.String)
-	 */
-	public IPreferenceNode remove(String id) {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#remove(org.eclipse.jface.preference.IPreferenceNode)
-	 */
-	public boolean remove(IPreferenceNode node) {
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/ExtensionsPreferencePage.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/ExtensionsPreferencePage.java
deleted file mode 100644
index 7f9f42d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/ExtensionsPreferencePage.java
+++ /dev/null
@@ -1,184 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.ui.dialogs;
-
-import org.eclipse.jface.preference.PreferencePage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.wst.css.core.internal.util.declaration.CSSPropertyContext;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ExtensionsPreferencePage extends PreferencePage {
-	private CSSPropertyContext _style;
-
-	private StyleCombo _beforeCombo, _afterCombo, _cursorCombo;
-
-	/**
-	 * Creates an instance.
-	 * 
-	 * @param element IDOMElement instance.
-	 * @param style CSSPropertyContext instance.
-	 */
-	public ExtensionsPreferencePage(IDOMElement element,
-			CSSPropertyContext style) {
-		super();
-		_style = style;
-
-		setTitle(DialogsMessages.getString("ExtensionsPreferencePage.Title")); //$NON-NLS-1$
-	}
-
-	/**
-	 * @see org.eclipse.jface.preference.
-	 *      PreferencePage#createContents(Composite)
-	 */
-	protected Control createContents(Composite parent) {
-		GridLayout layout;
-		GridData data;
-
-		Composite top = new Composite(parent, SWT.NONE);
-		layout = new GridLayout(1, false);
-		data = new GridData(GridData.FILL_BOTH);
-		top.setLayout(layout);
-		top.setLayoutData(data);
-
-		Group pageGroup = new Group(top, SWT.NONE);
-		pageGroup.setText(DialogsMessages
-				.getString("ExtensionsPreferencePage.PageBreak")); //$NON-NLS-1$
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		pageGroup.setLayoutData(data);
-		layout = new GridLayout(2, false);
-		pageGroup.setLayout(layout);
-
-		Label beforeLabel = new Label(pageGroup, SWT.NONE);
-		beforeLabel.setText(DialogsMessages
-				.getString("ExtensionsPreferencePage.Before")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		beforeLabel.setLayoutData(data);
-
-		_beforeCombo = new StyleCombo(pageGroup, SWT.NONE);
-		_beforeCombo.setItems(IStyleConstants.PAGE_BREAK);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_beforeCombo.setLayoutData(data);
-		_beforeCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String page = _beforeCombo.getText();
-				_style.setPageBreakBefore(page);
-			}
-		});
-
-		Label afterLabel = new Label(pageGroup, SWT.NONE);
-		afterLabel.setText(DialogsMessages
-				.getString("ExtensionsPreferencePage.After")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		afterLabel.setLayoutData(data);
-
-		_afterCombo = new StyleCombo(pageGroup, SWT.NONE);
-		_afterCombo.setItems(IStyleConstants.PAGE_BREAK);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_afterCombo.setLayoutData(data);
-		_afterCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String page = _afterCombo.getText();
-				_style.setPageBreakAfter(page);
-			}
-		});
-
-		Group visualGroup = new Group(top, SWT.NONE);
-		visualGroup.setText(DialogsMessages
-				.getString("ExtensionsPreferencePage.VisualEffect")); //$NON-NLS-1$
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		visualGroup.setLayoutData(data);
-		layout = new GridLayout(2, false);
-		visualGroup.setLayout(layout);
-
-		Label cursorLabel = new Label(visualGroup, SWT.NONE);
-		cursorLabel.setText(DialogsMessages
-				.getString("ExtensionsPreferencePage.Cursor")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		cursorLabel.setLayoutData(data);
-
-		_cursorCombo = new StyleCombo(visualGroup, SWT.NONE);
-		_cursorCombo.setItems(IStyleConstants.CURSOR);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_cursorCombo.setLayoutData(data);
-		_cursorCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String cursor = _cursorCombo.getText();
-				_style.setCursor(cursor);
-			}
-		});
-
-		initializeControls();
-
-		return top;
-	}
-
-	private void initializeControls() {
-		// page-break-before
-		String page = _style.getPageBreakBefore();
-		if (!isEmptyString(page)) {
-			int index = _beforeCombo.indexOf(page);
-			if (index != -1) {
-				_beforeCombo.select(index);
-			} else {
-				_beforeCombo.setText(page);
-			}
-		}
-
-		// page-break-after
-		page = _style.getPageBreakAfter();
-		if (!isEmptyString(page)) {
-			int index = _afterCombo.indexOf(page);
-			if (index != -1) {
-				_afterCombo.select(index);
-			} else {
-				_afterCombo.setText(page);
-			}
-		}
-
-		// cursor
-		String cursor = _style.getCursor();
-		if (!isEmptyString(cursor)) {
-			int index = _cursorCombo.indexOf(cursor);
-			if (index != -1) {
-				_cursorCombo.select(index);
-			} else {
-				_cursorCombo.setText(cursor);
-			}
-		}
-	}
-
-	public void setVisible(boolean visible) {
-		super.setVisible(visible);
-
-		getApplyButton().setVisible(false);
-		getDefaultsButton().setVisible(false);
-	}
-
-	private boolean isEmptyString(String str) {
-		if (str == null || str.length() == 0) {
-			return true;
-		}
-        return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/IStyleConstants.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/IStyleConstants.java
deleted file mode 100644
index 3ca24c8..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/IStyleConstants.java
+++ /dev/null
@@ -1,203 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.ui.dialogs;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public interface IStyleConstants {
-	/**
-	 * attachment constants
-	 */
-	final public static String[] ATTACHMENT = { "fixed", "scroll" }; //$NON-NLS-1$ //$NON-NLS-2$
-
-	/**
-	 * auto constants
-	 */
-	final public static String[] AUTO = { "auto" }; //$NON-NLS-1$
-
-	/**
-	 * border style constants
-	 */
-	final public static String[] BORDER_STYLE = { "none", "dotted", "dashed", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-			"solid", "double", "groove", "ridge", "inset", "outset" }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$
-
-	/**
-	 * border width constants
-	 */
-	final public static String[] BORDER_WIDTH = { "thin", "medium", "thick" }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-
-	/**
-	 * clear constants
-	 */
-	final public static String[] CLEAR = { "left", "right", "both", "none" }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
-
-	/**
-	 * color constants
-	 */
-	final public static String[] COLOR = { "black", "blue", "gray", "green", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
-			"orange", "red", "white", "yellow", "aqua", "fuchsia", "lime", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$
-			"maroon", "navy", "olive", "purple", "silver", "teal" }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$
-
-	/**
-	 * display constants
-	 */
-	final public static String[] DISPLAY = { "none", "inline", "block", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-			"list-item", "run-in", "compact", "marker", "table", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
-			"inline-table", "table-row-group", "table-header-group", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-			"table-footer-group", "table-row", "table-column-group", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-			"table-column", "table-cell", "table-caption" }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-
-	/**
-	 * float constants
-	 */
-	final public static String[] FLOAT = { "left", "right", "none" }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-
-	/**
-	 * font family constants
-	 */
-	final public static String[] FONT_FAMILY = { "Verdana, Arial, Sans-Serif", //$NON-NLS-1$
-			"Tahoma, Verdana, Arial, Sans-Serif", "\"Times New Roman\", Serif", //$NON-NLS-1$ //$NON-NLS-2$
-			"Georgia, \"Times New Roman\", Serif", //$NON-NLS-1$
-			"\"Book Antiqua\", \"Times New Roman\", Serif", //$NON-NLS-1$
-			"\"Comic Sans MS\", Sans-Serif", "\"Courier New\", Courier", //$NON-NLS-1$ //$NON-NLS-2$
-			"\"Trebuchet MS\", Sans-Serif" }; //$NON-NLS-1$
-
-	/**
-	 * font size constants
-	 */
-	final public static String[] FONT_SIZE_NUMBER = { "9", "10", "12", "14", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
-			"16", "18", "24", "36", "xx-small", "x-small", "small", "medium", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$
-			"large", "x-large", "xx-large", "smaller", "larger" }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
-
-	/**
-	 * font style constants
-	 */
-	final public static String[] FONT_STYLE = { "normal", "italic", "oblique" }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-
-	/**
-	 * font transform constants
-	 */
-	final public static String[] FONT_TEXTTRANSFORM = { "capitalize", //$NON-NLS-1$
-			"uppercase", "lowercase", "none" }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-
-	/**
-	 * font variant constants
-	 */
-	final public static String[] FONT_VARIANT = { "normal", "small-caps" }; //$NON-NLS-1$ //$NON-NLS-2$
-
-	/**
-	 * font weight constants
-	 */
-	final public static String[] FONT_WEIGHT = { "normal", "bold", "bolder", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-			"lighter", "100", "200", "300", "400", "500", "600", "700", "800", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ //$NON-NLS-9$
-			"900" }; //$NON-NLS-1$
-
-	/**
-	 * list position constants
-	 */
-	final public static String[] LIST_POSITION = { "inside", "outside" }; //$NON-NLS-1$ //$NON-NLS-2$
-
-	/**
-	 * list type constants
-	 */
-	final public static String[] LIST_TYPE = { "disc", "circle", "sqaure", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-			"decimal", "lower-roman", "upper-roman", "lower-alpha", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
-			"upper-alpah", "none" }; //$NON-NLS-1$ //$NON-NLS-2$
-
-	/**
-	 * none
-	 */
-	final public static String[] NONE = { "none" }; //$NON-NLS-1$
-
-	/**
-	 * normal
-	 */
-	final public static String[] NORMAL = { "normal" }; //$NON-NLS-1$
-
-	/**
-	 * percent
-	 */
-	final public static String[] PERCENT = { "%" }; //$NON-NLS-1$
-
-	/**
-	 * position constants
-	 */
-	final public static String[] POSITION = { "left", "center", "right" }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-
-	/**
-	 * positioning type constants
-	 */
-	final public static String[] POSITIONING_TYPE = { "absolute", "relative", //$NON-NLS-1$ //$NON-NLS-2$
-			"static" }; //$NON-NLS-1$
-
-	/**
-	 * repeat constants
-	 */
-	final public static String[] REPEAT = { "no-repeat", "repeat", "repeat-x", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-			"repeat-y" }; //$NON-NLS-1$
-
-	/**
-	 * unit of size constants
-	 */
-	final public static String[] SIZE_UNIT = { "px", "pt", "in", "cm", "mm", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
-			"pc", "em", "ex", "%" }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
-
-	/**
-	 * text align constants
-	 */
-	final public static String[] TEXT_ALIGN = { "left", "right", "center", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-			"justify" }; //$NON-NLS-1$
-
-	/**
-	 * text decoration constants
-	 */
-	final public static String[] TEXT_DECORATION = { "underline", "overline", //$NON-NLS-1$ //$NON-NLS-2$
-			"line-through", "blink", "none" }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-
-	/**
-	 * veritical align constants
-	 */
-	final public static String[] VERTICAL_ALIGN = { "baseline", "sub", "super", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-			"top", "text-top", "middle", "bottom", "text-bottom" }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
-
-	/**
-	 * white space constants
-	 */
-	final public static String[] WHITE_SPACE = { "normal", "pre", "nowrap" }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-
-	/**
-	 * visibility constants
-	 */
-	final public static String[] VISIBILITY = { "inherit", "visible", "hidden" }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-
-	/**
-	 * overflow constants
-	 */
-	final public static String[] OVERFLOW = { "visible", "hidden", "scroll", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-			"auto" }; //$NON-NLS-1$
-
-	/**
-	 * page break constants
-	 */
-	final public static String[] PAGE_BREAK = { "auto", "always", "left", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-			"right" }; //$NON-NLS-1$
-
-	/**
-	 * cursor constants
-	 */
-	final public static String[] CURSOR = { "hand", "crosshair", "text", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-			"wait", "default", "help", "e-resize", "ne-resize", "n-resize", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$
-			"nw-resize", "w-resize", "sw-resize", "s-resize", "se-resize", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
-			"auto" }; //$NON-NLS-1$
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/ListPreferenceNode.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/ListPreferenceNode.java
deleted file mode 100644
index 8964d7b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/ListPreferenceNode.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.ui.dialogs;
-
-import org.eclipse.jface.preference.IPreferenceNode;
-import org.eclipse.jface.preference.IPreferencePage;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.wst.css.core.internal.util.declaration.CSSPropertyContext;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ListPreferenceNode implements IPreferenceNode {
-	private ListPreferencePage _page;
-
-	private IDOMElement _element;
-
-	private CSSPropertyContext _style;
-
-	/**
-	 * @param element
-	 * @param style
-	 */
-	public ListPreferenceNode(IDOMElement element, CSSPropertyContext style) {
-		super();
-		_element = element;
-		_style = style;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#add(org.eclipse.jface.preference.IPreferenceNode)
-	 */
-	public void add(IPreferenceNode node) {
-        // TODO:
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#createPage()
-	 */
-	public void createPage() {
-		_page = new ListPreferencePage(_element, _style);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#disposeResources()
-	 */
-	public void disposeResources() {
-        // TODO:
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#findSubNode(java.lang.String)
-	 */
-	public IPreferenceNode findSubNode(String id) {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getId()
-	 */
-	public String getId() {
-		return "List"; //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getLabelImage()
-	 */
-	public Image getLabelImage() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getLabelText()
-	 */
-	public String getLabelText() {
-		return DialogsMessages.getString("ListPreferenceNode.LabelText"); //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getPage()
-	 */
-	public IPreferencePage getPage() {
-		return _page;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getSubNodes()
-	 */
-	public IPreferenceNode[] getSubNodes() {
-		return new IPreferenceNode[0];
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#remove(java.lang.String)
-	 */
-	public IPreferenceNode remove(String id) {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#remove(org.eclipse.jface.preference.IPreferenceNode)
-	 */
-	public boolean remove(IPreferenceNode node) {
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/ListPreferencePage.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/ListPreferencePage.java
deleted file mode 100644
index eda6fa5..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/ListPreferencePage.java
+++ /dev/null
@@ -1,163 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.ui.dialogs;
-
-import org.eclipse.jface.preference.PreferencePage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.wst.css.core.internal.util.declaration.CSSPropertyContext;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ListPreferencePage extends PreferencePage {
-	private CSSPropertyContext _style;
-
-	private StyleCombo _typeCombo, _imageCombo, _positionCombo;
-
-	/**
-	 * @param element
-	 * @param style
-	 */
-	public ListPreferencePage(IDOMElement element, CSSPropertyContext style) {
-		super();
-		_style = style;
-
-		setTitle(DialogsMessages.getString("ListPreferencePage.Title")); //$NON-NLS-1$
-	}
-
-	/**
-	 * @see org.eclipse.jface.preference.
-	 *      PreferencePage#createContents(Composite)
-	 */
-	protected Control createContents(Composite parent) {
-		GridLayout layout;
-		GridData data;
-
-		Composite top = new Composite(parent, SWT.NONE);
-		layout = new GridLayout(2, false);
-		data = new GridData(GridData.FILL_BOTH);
-		top.setLayout(layout);
-		top.setLayoutData(data);
-
-		Label typeLabel = new Label(top, SWT.NONE);
-		typeLabel.setText(DialogsMessages.getString("ListPreferencePage.Type")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		typeLabel.setLayoutData(data);
-
-		_typeCombo = new StyleCombo(top, SWT.NONE);
-		_typeCombo.setItems(IStyleConstants.LIST_TYPE);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_typeCombo.setLayoutData(data);
-		_typeCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String type = _typeCombo.getText();
-				_style.setListStyleType(type);
-			}
-		});
-
-		Label imageLabel = new Label(top, SWT.NONE);
-		imageLabel.setText(DialogsMessages
-				.getString("ListPreferencePage.Image")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		imageLabel.setLayoutData(data);
-
-		_imageCombo = new StyleCombo(top, SWT.NONE);
-		_imageCombo.setItems(IStyleConstants.NONE);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_imageCombo.setLayoutData(data);
-		_imageCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String image = _imageCombo.getText();
-				_style.setListStyleImage(image);
-			}
-		});
-
-		Label positionLabel = new Label(top, SWT.NONE);
-		positionLabel.setText(DialogsMessages
-				.getString("ListPreferencePage.Position")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		positionLabel.setLayoutData(data);
-
-		_positionCombo = new StyleCombo(top, SWT.NONE);
-		_positionCombo.setItems(IStyleConstants.LIST_POSITION);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_positionCombo.setLayoutData(data);
-		_positionCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String position = _positionCombo.getText();
-				_style.setListStylePosition(position);
-			}
-		});
-
-		initializeControls();
-
-		return top;
-	}
-
-	private void initializeControls() {
-		// list-style-tyle
-		String type = _style.getListStyleType();
-		if (!isEmptyString(type)) {
-			int index = _typeCombo.indexOf(type);
-			if (index != -1) {
-				_typeCombo.select(index);
-			} else {
-				_typeCombo.setText(type);
-			}
-		}
-
-		// list-style-image
-		String image = _style.getListStyleImage();
-		if (!isEmptyString(image)) {
-			int index = _imageCombo.indexOf(image);
-			if (index != -1) {
-				_imageCombo.select(index);
-			} else {
-				_imageCombo.setText(image);
-			}
-		}
-
-		// list-style-position
-		String position = _style.getListStylePosition();
-		if (!isEmptyString(position)) {
-			int index = _positionCombo.indexOf(position);
-			if (index != -1) {
-				_positionCombo.select(index);
-			} else {
-				_positionCombo.setText(position);
-			}
-		}
-	}
-
-	public void setVisible(boolean visible) {
-		super.setVisible(visible);
-
-		getApplyButton().setVisible(false);
-		getDefaultsButton().setVisible(false);
-	}
-
-	private boolean isEmptyString(String str) {
-		if (str == null || str.length() == 0) {
-			return true;
-		}
-        return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/PositioningPreferenceNode.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/PositioningPreferenceNode.java
deleted file mode 100644
index fec8192..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/PositioningPreferenceNode.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.ui.dialogs;
-
-import org.eclipse.jface.preference.IPreferenceNode;
-import org.eclipse.jface.preference.IPreferencePage;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.wst.css.core.internal.util.declaration.CSSPropertyContext;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class PositioningPreferenceNode implements IPreferenceNode {
-	private PositioningPreferencePage _page;
-
-	private IDOMElement _element;
-
-	private CSSPropertyContext _style;
-
-	/**
-	 * @param element
-	 * @param style
-	 */
-	public PositioningPreferenceNode(IDOMElement element,
-			CSSPropertyContext style) {
-		super();
-		_element = element;
-		_style = style;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#add(org.eclipse.jface.preference.IPreferenceNode)
-	 */
-	public void add(IPreferenceNode node) {
-        // TODO:
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#createPage()
-	 */
-	public void createPage() {
-		_page = new PositioningPreferencePage(_element, _style);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#disposeResources()
-	 */
-	public void disposeResources() {
-        // TODO:
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#findSubNode(java.lang.String)
-	 */
-	public IPreferenceNode findSubNode(String id) {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getId()
-	 */
-	public String getId() {
-		return "Positioning"; //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getLabelImage()
-	 */
-	public Image getLabelImage() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getLabelText()
-	 */
-	public String getLabelText() {
-		return DialogsMessages.getString("PositioningPreferenceNode.LabelText"); //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getPage()
-	 */
-	public IPreferencePage getPage() {
-		return _page;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getSubNodes()
-	 */
-	public IPreferenceNode[] getSubNodes() {
-		return new IPreferenceNode[0];
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#remove(java.lang.String)
-	 */
-	public IPreferenceNode remove(String id) {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#remove(org.eclipse.jface.preference.IPreferenceNode)
-	 */
-	public boolean remove(IPreferenceNode node) {
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/PositioningPreferencePage.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/PositioningPreferencePage.java
deleted file mode 100644
index 026769b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/PositioningPreferencePage.java
+++ /dev/null
@@ -1,782 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.ui.dialogs;
-
-import org.eclipse.jface.preference.PreferencePage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.wst.css.core.internal.util.declaration.CSSPropertyContext;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class PositioningPreferencePage extends PreferencePage {
-	private CSSPropertyContext _style;
-
-	private Combo _typeCombo, _visibilityCombo, _widthNumberCombo,
-			_widthUnitCombo, _zIndexCombo, _heightNumberCombo,
-			_heightUnitCombo, _overflowCombo;
-
-	private Combo _placementTopNumberCombo, _placementRightNumberCombo,
-			_placementBottomNumberCombo, _placementLeftNumberCombo;
-
-	private Combo _placementTopUnitCombo, _placementRightUnitCombo,
-			_placementBottomUnitCombo, _placementLeftUnitCombo;
-
-	private Combo _clipTopNumberCombo, _clipRightNumberCombo,
-			_clipBottomNumberCombo, _clipLeftNumberCombo;
-
-	private Combo _clipTopUnitCombo, _clipRightUnitCombo, _clipBottomUnitCombo,
-			_clipLeftUnitCombo;
-
-	/**
-	 * @param element
-	 * @param style
-	 */
-	public PositioningPreferencePage(IDOMElement element,
-			CSSPropertyContext style) {
-		super();
-		_style = style;
-
-		setTitle(DialogsMessages.getString("PositioningPreferencePage.Title")); //$NON-NLS-1$
-	}
-
-	/**
-	 * @see org.eclipse.jface.preference.
-	 *      PreferencePage#createContents(Composite)
-	 */
-	protected Control createContents(Composite parent) {
-		GridLayout layout;
-		GridData data;
-
-		Composite top = new Composite(parent, SWT.NONE);
-		layout = new GridLayout(6, false);
-		data = new GridData(GridData.FILL_BOTH);
-		top.setLayout(layout);
-		top.setLayoutData(data);
-
-		Label typeLabel = new Label(top, SWT.NONE);
-		typeLabel.setText(DialogsMessages
-				.getString("PositioningPreferencePage.Type")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		typeLabel.setLayoutData(data);
-
-		_typeCombo = new Combo(top, SWT.NONE);
-		_typeCombo.setItems(IStyleConstants.POSITIONING_TYPE);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		data.horizontalSpan = 2;
-		_typeCombo.setLayoutData(data);
-		_typeCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String type = _typeCombo.getText();
-				_style.setPosition(type);
-			}
-		});
-
-		Label visibilityLabel = new Label(top, SWT.NONE);
-		visibilityLabel.setText(DialogsMessages
-				.getString("PositioningPreferencePage.Visibility")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		visibilityLabel.setLayoutData(data);
-
-		_visibilityCombo = new Combo(top, SWT.NONE);
-		_visibilityCombo.setItems(IStyleConstants.VISIBILITY);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_visibilityCombo.setLayoutData(data);
-		_visibilityCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String visibility = _visibilityCombo.getText();
-				_style.setVisibility(visibility);
-			}
-		});
-
-		new Label(top, SWT.NONE);
-
-		Label widthLabel = new Label(top, SWT.NONE);
-		widthLabel.setText(DialogsMessages
-				.getString("PositioningPreferencePage.Width")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		widthLabel.setLayoutData(data);
-
-		_widthNumberCombo = new Combo(top, SWT.NONE);
-		_widthNumberCombo.setItems(IStyleConstants.LIST_POSITION);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_widthNumberCombo.setLayoutData(data);
-		_widthNumberCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_widthUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_widthNumberCombo.getText());
-				} catch (NumberFormatException ex) {
-					_widthUnitCombo.setEnabled(false);
-				}
-
-				String width = _widthNumberCombo.getText();
-				if (_widthUnitCombo.isEnabled()) {
-					width += _widthUnitCombo.getText();
-				}
-
-				_style.setWidth(width);
-			}
-		});
-
-		_widthUnitCombo = new Combo(top, SWT.READ_ONLY);
-		_widthUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_widthUnitCombo.setLayoutData(data);
-		_widthUnitCombo.select(0);
-		_widthUnitCombo.setEnabled(false);
-		_widthUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String width = _widthNumberCombo.getText();
-				if (_widthUnitCombo.isEnabled()) {
-					width += _widthUnitCombo.getText();
-				}
-
-				_style.setWidth(width);
-			}
-		});
-
-		Label zIndexLabel = new Label(top, SWT.NONE);
-		zIndexLabel.setText(DialogsMessages
-				.getString("PositioningPreferencePage.ZIndex")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		zIndexLabel.setLayoutData(data);
-
-		_zIndexCombo = new Combo(top, SWT.NONE);
-		_zIndexCombo.setItems(IStyleConstants.AUTO);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_zIndexCombo.setLayoutData(data);
-		_zIndexCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String index = _zIndexCombo.getText();
-				_style.setZIndex(index);
-			}
-		});
-
-		new Label(top, SWT.NONE);
-
-		Label heightLabel = new Label(top, SWT.NONE);
-		heightLabel.setText(DialogsMessages
-				.getString("PositioningPreferencePage.Height")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		heightLabel.setLayoutData(data);
-
-		_heightNumberCombo = new Combo(top, SWT.NONE);
-		_heightNumberCombo.setItems(IStyleConstants.LIST_POSITION);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_heightNumberCombo.setLayoutData(data);
-		_heightNumberCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_heightUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_heightNumberCombo.getText());
-				} catch (NumberFormatException ex) {
-					_heightUnitCombo.setEnabled(false);
-				}
-
-				String height = _heightNumberCombo.getText();
-				if (_heightUnitCombo.isEnabled()) {
-					height += _heightUnitCombo.getText();
-				}
-
-				_style.setHeight(height);
-			}
-		});
-
-		_heightUnitCombo = new Combo(top, SWT.READ_ONLY);
-		_heightUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_heightUnitCombo.setLayoutData(data);
-		_heightUnitCombo.select(0);
-		_heightUnitCombo.setEnabled(false);
-		_heightUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String height = _heightNumberCombo.getText();
-				if (_heightUnitCombo.isEnabled()) {
-					height += _heightUnitCombo.getText();
-				}
-
-				_style.setHeight(height);
-			}
-		});
-
-		Label overflowLabel = new Label(top, SWT.NONE);
-		overflowLabel.setText(DialogsMessages
-				.getString("PositioningPreferencePage.Overflow")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		overflowLabel.setLayoutData(data);
-
-		_overflowCombo = new Combo(top, SWT.NONE);
-		_overflowCombo.setItems(IStyleConstants.OVERFLOW);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_overflowCombo.setLayoutData(data);
-		_overflowCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String overflow = _overflowCombo.getText();
-				_style.setOverflow(overflow);
-			}
-		});
-
-		Group placementGroup = new Group(top, SWT.NONE);
-		placementGroup.setText(DialogsMessages
-				.getString("PositioningPreferencePage.Placement")); //$NON-NLS-1$
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		data.horizontalSpan = 3;
-		data.verticalSpan = 4;
-		placementGroup.setLayoutData(data);
-		layout = new GridLayout(3, false);
-		placementGroup.setLayout(layout);
-
-		Label placementTopLabel = new Label(placementGroup, SWT.NONE);
-		placementTopLabel.setText(DialogsMessages
-				.getString("BoxPreferencePage.Top")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		placementTopLabel.setLayoutData(data);
-
-		_placementTopNumberCombo = new Combo(placementGroup, SWT.NONE);
-		_placementTopNumberCombo.setItems(IStyleConstants.AUTO);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_placementTopNumberCombo.setLayoutData(data);
-		_placementTopNumberCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_placementTopUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_placementTopNumberCombo.getText());
-				} catch (NumberFormatException ex) {
-					_placementTopUnitCombo.setEnabled(false);
-				}
-
-				String placement = _placementTopNumberCombo.getText();
-				if (_placementTopUnitCombo.isEnabled()) {
-					placement += _placementTopUnitCombo.getText();
-				}
-
-				_style.setTop(placement);
-			}
-		});
-
-		_placementTopUnitCombo = new Combo(placementGroup, SWT.READ_ONLY);
-		_placementTopUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_placementTopUnitCombo.setLayoutData(data);
-		_placementTopUnitCombo.select(0);
-		_placementTopUnitCombo.setEnabled(false);
-		_placementTopUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String placement = _placementTopNumberCombo.getText();
-				if (_placementTopUnitCombo.isEnabled()) {
-					placement += _placementTopUnitCombo.getText();
-				}
-
-				_style.setTop(placement);
-			}
-		});
-
-		Label placementRightLabel = new Label(placementGroup, SWT.NONE);
-		placementRightLabel.setText(DialogsMessages
-				.getString("BoxPreferencePage.Right")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		placementRightLabel.setLayoutData(data);
-
-		_placementRightNumberCombo = new Combo(placementGroup, SWT.NONE);
-		_placementRightNumberCombo.setItems(IStyleConstants.AUTO);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_placementRightNumberCombo.setLayoutData(data);
-		_placementRightNumberCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_placementRightUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_placementRightNumberCombo.getText());
-				} catch (NumberFormatException ex) {
-					_placementRightUnitCombo.setEnabled(false);
-				}
-
-				String placement = _placementRightNumberCombo.getText();
-				if (_placementRightUnitCombo.isEnabled()) {
-					placement += _placementRightUnitCombo.getText();
-				}
-
-				_style.setRight(placement);
-			}
-		});
-
-		_placementRightUnitCombo = new Combo(placementGroup, SWT.READ_ONLY);
-		_placementRightUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_placementRightUnitCombo.setLayoutData(data);
-		_placementRightUnitCombo.select(0);
-		_placementRightUnitCombo.setEnabled(false);
-		_placementRightUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String placement = _placementRightNumberCombo.getText();
-				if (_placementRightUnitCombo.isEnabled()) {
-					placement += _placementRightUnitCombo.getText();
-				}
-
-				_style.setRight(placement);
-			}
-		});
-
-		Label placementBottomLabel = new Label(placementGroup, SWT.NONE);
-		placementBottomLabel.setText(DialogsMessages
-				.getString("BoxPreferencePage.Bottom")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		placementBottomLabel.setLayoutData(data);
-
-		_placementBottomNumberCombo = new Combo(placementGroup, SWT.NONE);
-		_placementBottomNumberCombo.setItems(IStyleConstants.AUTO);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_placementBottomNumberCombo.setLayoutData(data);
-		_placementBottomNumberCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_placementBottomUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_placementBottomNumberCombo.getText());
-				} catch (NumberFormatException ex) {
-					_placementBottomUnitCombo.setEnabled(false);
-				}
-
-				String placement = _placementBottomNumberCombo.getText();
-				if (_placementBottomUnitCombo.isEnabled()) {
-					placement += _placementBottomUnitCombo.getText();
-				}
-
-				_style.setBottom(placement);
-			}
-		});
-
-		_placementBottomUnitCombo = new Combo(placementGroup, SWT.READ_ONLY);
-		_placementBottomUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_placementBottomUnitCombo.setLayoutData(data);
-		_placementBottomUnitCombo.select(0);
-		_placementBottomUnitCombo.setEnabled(false);
-		_placementBottomUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String placement = _placementBottomNumberCombo.getText();
-				if (_placementBottomUnitCombo.isEnabled()) {
-					placement += _placementBottomUnitCombo.getText();
-				}
-
-				_style.setBottom(placement);
-			}
-		});
-
-		Label placementLeftLabel = new Label(placementGroup, SWT.NONE);
-		placementLeftLabel.setText(DialogsMessages
-				.getString("BoxPreferencePage.Left")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		placementLeftLabel.setLayoutData(data);
-
-		_placementLeftNumberCombo = new Combo(placementGroup, SWT.NONE);
-		_placementLeftNumberCombo.setItems(IStyleConstants.AUTO);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_placementLeftNumberCombo.setLayoutData(data);
-		_placementLeftNumberCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_placementLeftUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_placementLeftNumberCombo.getText());
-				} catch (NumberFormatException ex) {
-					_placementLeftUnitCombo.setEnabled(false);
-				}
-
-				String top1 = _placementLeftNumberCombo.getText();
-				if (_placementLeftUnitCombo.isEnabled()) {
-					top1 += _placementLeftUnitCombo.getText();
-				}
-
-				_style.setLeft(top1);
-			}
-		});
-
-		_placementLeftUnitCombo = new Combo(placementGroup, SWT.READ_ONLY);
-		_placementLeftUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_placementLeftUnitCombo.setLayoutData(data);
-		_placementLeftUnitCombo.select(0);
-		_placementLeftUnitCombo.setEnabled(false);
-		_placementLeftUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String top1 = _placementLeftNumberCombo.getText();
-				if (_placementLeftUnitCombo.isEnabled()) {
-					top1 += _placementLeftUnitCombo.getText();
-				}
-
-				_style.setLeft(top1);
-			}
-		});
-
-		Group clipGroup = new Group(top, SWT.NONE);
-		clipGroup.setText(DialogsMessages
-				.getString("PositioningPreferencePage.Clip")); //$NON-NLS-1$
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		data.horizontalSpan = 3;
-		data.verticalSpan = 4;
-		clipGroup.setLayoutData(data);
-		layout = new GridLayout(3, false);
-		clipGroup.setLayout(layout);
-
-		Label clipTopLabel = new Label(clipGroup, SWT.NONE);
-		clipTopLabel
-				.setText(DialogsMessages.getString("BoxPreferencePage.Top")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		clipTopLabel.setLayoutData(data);
-
-		_clipTopNumberCombo = new Combo(clipGroup, SWT.NONE);
-		_clipTopNumberCombo.setItems(IStyleConstants.AUTO);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_clipTopNumberCombo.setLayoutData(data);
-		_clipTopNumberCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_clipTopUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_clipTopNumberCombo.getText());
-				} catch (NumberFormatException ex) {
-					_clipTopUnitCombo.setEnabled(false);
-				}
-
-				String clip = _clipTopNumberCombo.getText();
-				if (_clipTopUnitCombo.isEnabled()) {
-					clip += _clipTopUnitCombo.getText();
-				}
-
-				_style.setClipTop(clip);
-			}
-		});
-
-		_clipTopUnitCombo = new Combo(clipGroup, SWT.READ_ONLY);
-		_clipTopUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_clipTopUnitCombo.setLayoutData(data);
-		_clipTopUnitCombo.select(0);
-		_clipTopUnitCombo.setEnabled(false);
-		_clipTopUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String clip = _clipTopNumberCombo.getText();
-				if (_clipTopUnitCombo.isEnabled()) {
-					clip += _clipTopUnitCombo.getText();
-				}
-
-				_style.setClipTop(clip);
-			}
-		});
-
-		Label clipRightLabel = new Label(clipGroup, SWT.NONE);
-		clipRightLabel.setText(DialogsMessages
-				.getString("PositioningPreferencePage.Right")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		clipRightLabel.setLayoutData(data);
-
-		_clipRightNumberCombo = new Combo(clipGroup, SWT.NONE);
-		_clipRightNumberCombo.setItems(IStyleConstants.AUTO);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_clipRightNumberCombo.setLayoutData(data);
-		_clipRightNumberCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_clipRightUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_clipRightNumberCombo.getText());
-				} catch (NumberFormatException ex) {
-					_clipRightUnitCombo.setEnabled(false);
-				}
-
-				String clip = _clipRightNumberCombo.getText();
-				if (_clipRightUnitCombo.isEnabled()) {
-					clip += _clipRightUnitCombo.getText();
-				}
-
-				_style.setClipRight(clip);
-			}
-		});
-
-		_clipRightUnitCombo = new Combo(clipGroup, SWT.READ_ONLY);
-		_clipRightUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_clipRightUnitCombo.setLayoutData(data);
-		_clipRightUnitCombo.select(0);
-		_clipRightUnitCombo.setEnabled(false);
-		_clipRightUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String clip = _clipRightNumberCombo.getText();
-				if (_clipRightUnitCombo.isEnabled()) {
-					clip += _clipRightUnitCombo.getText();
-				}
-
-				_style.setClipRight(clip);
-			}
-		});
-
-		Label clipBottomLabel = new Label(clipGroup, SWT.NONE);
-		clipBottomLabel.setText(DialogsMessages
-				.getString("PositioningPreferencePage.Bottom")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		clipBottomLabel.setLayoutData(data);
-
-		_clipBottomNumberCombo = new Combo(clipGroup, SWT.NONE);
-		_clipBottomNumberCombo.setItems(IStyleConstants.AUTO);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_clipBottomNumberCombo.setLayoutData(data);
-		_clipBottomNumberCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_clipBottomUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_clipBottomNumberCombo.getText());
-				} catch (NumberFormatException ex) {
-					_clipBottomUnitCombo.setEnabled(false);
-				}
-
-				String clip = _clipBottomNumberCombo.getText();
-				if (_clipBottomUnitCombo.isEnabled()) {
-					clip += _clipBottomUnitCombo.getText();
-				}
-
-				_style.setClipBottom(clip);
-			}
-		});
-
-		_clipBottomUnitCombo = new Combo(clipGroup, SWT.READ_ONLY);
-		_clipBottomUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_clipBottomUnitCombo.setLayoutData(data);
-		_clipBottomUnitCombo.select(0);
-		_clipBottomUnitCombo.setEnabled(false);
-		_clipBottomUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String clip = _clipBottomNumberCombo.getText();
-				if (_clipBottomUnitCombo.isEnabled()) {
-					clip += _clipBottomUnitCombo.getText();
-				}
-
-				_style.setClipBottom(clip);
-			}
-		});
-
-		Label clipLeftLabel = new Label(clipGroup, SWT.NONE);
-		clipLeftLabel.setText(DialogsMessages
-				.getString("PositioningPreferencePage.Left")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		clipLeftLabel.setLayoutData(data);
-
-		_clipLeftNumberCombo = new Combo(clipGroup, SWT.NONE);
-		_clipLeftNumberCombo.setItems(IStyleConstants.AUTO);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_clipLeftNumberCombo.setLayoutData(data);
-		_clipLeftNumberCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_clipLeftUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_clipLeftNumberCombo.getText());
-				} catch (NumberFormatException ex) {
-					_clipLeftUnitCombo.setEnabled(false);
-				}
-
-				String top1 = _clipLeftNumberCombo.getText();
-				if (_clipLeftUnitCombo.isEnabled()) {
-					top1 += _clipLeftUnitCombo.getText();
-				}
-
-				_style.setClipLeft(top1);
-			}
-		});
-
-		_clipLeftUnitCombo = new Combo(clipGroup, SWT.READ_ONLY);
-		_clipLeftUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_clipLeftUnitCombo.setLayoutData(data);
-		_clipLeftUnitCombo.select(0);
-		_clipLeftUnitCombo.setEnabled(false);
-		_clipLeftUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String top1 = _clipLeftNumberCombo.getText();
-				if (_clipLeftUnitCombo.isEnabled()) {
-					top1 += _clipLeftUnitCombo.getText();
-				}
-
-				_style.setClipLeft(top1);
-			}
-		});
-
-		initializeControls();
-
-		return top;
-	}
-
-	private void initializeControls() {
-		// position
-		String position = _style.getPosition();
-		if (!isEmptyString(position)) {
-			int index = _typeCombo.indexOf(position);
-			if (index != -1) {
-				_typeCombo.select(index);
-			} else {
-				_typeCombo.setText(position);
-			}
-		}
-
-		// visibility
-		String visibility = _style.getVisibility();
-		if (!isEmptyString(visibility)) {
-			int index = _visibilityCombo.indexOf(visibility);
-			if (index != -1) {
-				_visibilityCombo.select(index);
-			} else {
-				_visibilityCombo.setText(visibility);
-			}
-		}
-
-		// width
-		String width = _style.getWidth();
-		if (!isEmptyString(width)) {
-			int index = _widthNumberCombo.indexOf(width);
-			if (index != -1) {
-				_widthNumberCombo.select(index);
-			} else {
-				_widthNumberCombo.setText(width);
-			}
-		}
-
-		// z-index
-		String zindex = _style.getZIndex();
-		if (!isEmptyString(zindex)) {
-			int index = _zIndexCombo.indexOf(zindex);
-			if (index != -1) {
-				_zIndexCombo.select(index);
-			} else {
-				_zIndexCombo.setText(zindex);
-			}
-		}
-
-		// height
-		String height = _style.getHeight();
-		if (!isEmptyString(height)) {
-			int index = _heightNumberCombo.indexOf(height);
-			if (index != -1) {
-				_heightNumberCombo.select(index);
-			} else {
-				_heightNumberCombo.setText(height);
-			}
-		}
-
-		// overflow
-		String overflow = _style.getOverflow();
-		if (!isEmptyString(overflow)) {
-			int index = _overflowCombo.indexOf(overflow);
-			if (index != -1) {
-				_overflowCombo.select(index);
-			} else {
-				_overflowCombo.setText(overflow);
-			}
-		}
-
-		// placement
-		String placement = _style.getTop();
-		if (!isEmptyString(placement)) {
-			int index = _placementTopNumberCombo.indexOf(placement);
-			if (index != -1) {
-				_placementTopNumberCombo.select(index);
-			} else {
-				_placementTopNumberCombo.setText(placement);
-			}
-		}
-		placement = _style.getRight();
-		if (!isEmptyString(placement)) {
-			int index = _placementRightNumberCombo.indexOf(placement);
-			if (index != -1) {
-				_placementRightNumberCombo.select(index);
-			} else {
-				_placementRightNumberCombo.setText(placement);
-			}
-		}
-		placement = _style.getBottom();
-		if (!isEmptyString(placement)) {
-			int index = _placementBottomNumberCombo.indexOf(placement);
-			if (index != -1) {
-				_placementBottomNumberCombo.select(index);
-			} else {
-				_placementBottomNumberCombo.setText(placement);
-			}
-		}
-		placement = _style.getLeft();
-		if (!isEmptyString(placement)) {
-			int index = _placementLeftNumberCombo.indexOf(placement);
-			if (index != -1) {
-				_placementLeftNumberCombo.select(index);
-			} else {
-				_placementLeftNumberCombo.setText(placement);
-			}
-		}
-
-		// clip
-		String clip = _style.getClipTop();
-		if (!isEmptyString(clip)) {
-			int index = _clipTopNumberCombo.indexOf(clip);
-			if (index != -1) {
-				_clipTopNumberCombo.select(index);
-			} else {
-				_clipTopNumberCombo.setText(clip);
-			}
-		}
-		clip = _style.getClipRight();
-		if (!isEmptyString(clip)) {
-			int index = _clipRightNumberCombo.indexOf(clip);
-			if (index != -1) {
-				_clipRightNumberCombo.select(index);
-			} else {
-				_clipRightNumberCombo.setText(clip);
-			}
-		}
-		clip = _style.getClipBottom();
-		if (!isEmptyString(clip)) {
-			int index = _clipBottomNumberCombo.indexOf(clip);
-			if (index != -1) {
-				_clipBottomNumberCombo.select(index);
-			} else {
-				_clipBottomNumberCombo.setText(clip);
-			}
-		}
-		clip = _style.getClipLeft();
-		if (!isEmptyString(clip)) {
-			int index = _clipLeftNumberCombo.indexOf(clip);
-			if (index != -1) {
-				_clipLeftNumberCombo.select(index);
-			} else {
-				_clipLeftNumberCombo.setText(clip);
-			}
-		}
-	}
-
-	public void setVisible(boolean visible) {
-		super.setVisible(visible);
-
-		getApplyButton().setVisible(false);
-		getDefaultsButton().setVisible(false);
-	}
-
-	private boolean isEmptyString(String str) {
-		if (str == null || str.length() == 0) {
-			return true;
-        }	
-        return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/StyleCombo.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/StyleCombo.java
deleted file mode 100644
index e50a885..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/StyleCombo.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.ui.dialogs;
-
-import org.eclipse.swt.events.ControlAdapter;
-import org.eclipse.swt.events.ControlEvent;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class StyleCombo extends Combo {
-
-	/**
-	 * @param parent
-	 * @param style
-	 */
-	public StyleCombo(Composite parent, int style) {
-		super(parent, style);
-		this.addControlListener(new ControlAdapter() {
-			public void controlResized(ControlEvent e) {
-				Combo combo = (Combo) e.widget;
-				combo.setSelection(new Point(0, 0));
-			}
-		});
-	}
-
-	protected void checkSubclass() {
-        // override subclass validation, otherwise Widget.isValidSubclass
-        // will throw an error
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/StyleDialog.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/StyleDialog.java
deleted file mode 100644
index 7c36d32..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/StyleDialog.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.ui.dialogs;
-
-import org.eclipse.jface.preference.PreferenceDialog;
-import org.eclipse.jface.preference.PreferenceManager;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.wst.css.core.internal.util.declaration.CSSPropertyContext;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class StyleDialog extends PreferenceDialog {
-	/**
-	 * @param parentShell
-	 * @param manager
-	 * @param element 
-	 * @param style 
-	 */
-	public StyleDialog(Shell parentShell, PreferenceManager manager,
-			IDOMElement element, CSSPropertyContext style) {
-		super(parentShell, manager);
-		manager.addToRoot(new TextPreferenceNode(element, style));
-		manager.addToRoot(new BackgroudPreferenceNode(element, style));
-		manager.addToRoot(new BlockPreferenceNode(element, style));
-		manager.addToRoot(new BoxPreferenceNode(element, style));
-		manager.addToRoot(new BorderPreferenceNode(element, style));
-		manager.addToRoot(new ListPreferenceNode(element, style));
-		manager.addToRoot(new PositioningPreferenceNode(element, style));
-		manager.addToRoot(new ExtensionsPreferenceNode(element, style));
-	}
-
-	protected Control createDialogArea(Composite parent) {
-		Control control = super.createDialogArea(parent);
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(control,
-				PDPlugin.getResourceString("StyleDialog.help.id")); //$NON-NLS-1$
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(
-				getTreeViewer().getControl(),
-				PDPlugin.getResourceString("StyleDialog.help.id")); //$NON-NLS-1$
-		return control;
-	}
-
-	protected void update() {
-		super.update();
-		getShell().setText(DialogsMessages.getString("StyleDialog.Title")); //$NON-NLS-1$
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/TextPreferenceNode.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/TextPreferenceNode.java
deleted file mode 100644
index f88c0df..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/TextPreferenceNode.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.ui.dialogs;
-
-import org.eclipse.jface.preference.IPreferenceNode;
-import org.eclipse.jface.preference.IPreferencePage;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.wst.css.core.internal.util.declaration.CSSPropertyContext;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TextPreferenceNode implements IPreferenceNode {
-	private TextPreferencePage _page;
-
-	private CSSPropertyContext _style;
-
-	private IDOMElement _element;
-
-	/**
-	 * @param element
-	 * @param style
-	 */
-	public TextPreferenceNode(IDOMElement element, CSSPropertyContext style) {
-		super();
-		_element = element;
-		_style = style;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#add(org.eclipse.jface.preference.IPreferenceNode)
-	 */
-	public void add(IPreferenceNode node) {
-        // TODO:
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#createPage()
-	 */
-	public void createPage() {
-		_page = new TextPreferencePage(_element, _style);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#disposeResources()
-	 */
-	public void disposeResources() {
-        // TODO:
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#findSubNode(java.lang.String)
-	 */
-	public IPreferenceNode findSubNode(String id) {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getId()
-	 */
-	public String getId() {
-		return "Text"; //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getLabelImage()
-	 */
-	public Image getLabelImage() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getLabelText()
-	 */
-	public String getLabelText() {
-		return DialogsMessages.getString("TextPreferenceNode.LabelText"); //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getPage()
-	 */
-	public IPreferencePage getPage() {
-		return _page;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getSubNodes()
-	 */
-	public IPreferenceNode[] getSubNodes() {
-		return new IPreferenceNode[0];
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#remove(java.lang.String)
-	 */
-	public IPreferenceNode remove(String id) {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#remove(org.eclipse.jface.preference.IPreferenceNode)
-	 */
-	public boolean remove(IPreferenceNode node) {
-		return false;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/TextPreferencePage.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/TextPreferencePage.java
deleted file mode 100644
index b830708..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/TextPreferencePage.java
+++ /dev/null
@@ -1,525 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.ui.dialogs;
-
-import org.eclipse.jface.preference.PreferencePage;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.ColorButtonDialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogFieldApplyListener;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.wst.css.core.internal.util.declaration.CSSPropertyContext;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TextPreferencePage extends PreferencePage {
-	private CSSPropertyContext _style;
-
-	private StyleCombo _fontFamilyCombo, _fontSizeNumberCombo,
-			_fontSizeUnitCombo, _fontWeightCombo, _fontStyleCombo,
-			_fontVariantCombo, _fontLineHeightNumberCombo,
-			_fontLineHeightUnitCombo, _textTransformCombo;
-
-	private ColorButtonDialogField _colorField;
-
-	private Button _textDecorationUnderlineButton,
-			_textDecorationOverlineButton, _textDecorationLineThroughButton,
-			_textDecorationBlinkButton, _textDecorationNoneButton;
-
-	/**
-	 * @param element
-	 * @param style
-	 */
-	public TextPreferencePage(IDOMElement element, CSSPropertyContext style) {
-		super();
-		_style = style;
-
-		// Set the preference store for the preference page.
-		// IPreferenceStore store =
-		// JMTIntegrationPlugin.getDefault().getPreferenceStore();
-		// setPreferenceStore(store);
-		setTitle(DialogsMessages.getString("TextPreferencePage.Title")); //$NON-NLS-1$
-	}
-
-	/**
-	 * @see org.eclipse.jface.preference.
-	 *      PreferencePage#createContents(Composite)
-	 */
-	protected Control createContents(Composite parent) {
-		GridLayout layout;
-		GridData data;
-
-		Composite top = new Composite(parent, SWT.NONE);
-		layout = new GridLayout(5, false);
-		data = new GridData(GridData.FILL_BOTH);
-		top.setLayout(layout);
-		top.setLayoutData(data);
-
-		Label fontLabel = new Label(top, SWT.NONE);
-		fontLabel.setText(DialogsMessages.getString("TextPreferencePage.Font")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		fontLabel.setLayoutData(data);
-
-		_fontFamilyCombo = new StyleCombo(top, SWT.NONE);
-		_fontFamilyCombo.setItems(IStyleConstants.FONT_FAMILY);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		data.horizontalSpan = 4;
-		_fontFamilyCombo.setLayoutData(data);
-		_fontFamilyCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_style.setFontFamily(_fontFamilyCombo.getText());
-			}
-		});
-
-		Label sizeLabel = new Label(top, SWT.NONE);
-		sizeLabel.setText(DialogsMessages.getString("TextPreferencePage.Size")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		sizeLabel.setLayoutData(data);
-
-		_fontSizeNumberCombo = new StyleCombo(top, SWT.NONE);
-		_fontSizeNumberCombo.setItems(IStyleConstants.FONT_SIZE_NUMBER);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_fontSizeNumberCombo.setLayoutData(data);
-		_fontSizeNumberCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_fontSizeUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_fontSizeNumberCombo.getText());
-				} catch (NumberFormatException ex) {
-					_fontSizeUnitCombo.setEnabled(false);
-				}
-
-				String size = _fontSizeNumberCombo.getText();
-				if (_fontSizeUnitCombo.isEnabled()) {
-					size += _fontSizeUnitCombo.getText();
-				}
-
-				_style.setFontSize(size);
-			}
-		});
-
-		_fontSizeUnitCombo = new StyleCombo(top, SWT.READ_ONLY);
-		_fontSizeUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_fontSizeUnitCombo.setLayoutData(data);
-		_fontSizeUnitCombo.select(0);
-		_fontSizeUnitCombo.setEnabled(false);
-		_fontSizeUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String size = _fontSizeNumberCombo.getText();
-				if (_fontSizeUnitCombo.isEnabled()) {
-					size += _fontSizeUnitCombo.getText();
-				}
-
-				_style.setFontSize(size);
-			}
-		});
-
-		Label weightLabel = new Label(top, SWT.NONE);
-		weightLabel.setText(DialogsMessages
-				.getString("TextPreferencePage.Weight")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		weightLabel.setLayoutData(data);
-
-		_fontWeightCombo = new StyleCombo(top, SWT.NONE);
-		_fontWeightCombo.setItems(IStyleConstants.FONT_WEIGHT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_fontWeightCombo.setLayoutData(data);
-		_fontWeightCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String weight = _fontWeightCombo.getText();
-				_style.setFontWeight(weight);
-			}
-		});
-
-		Label stylesLabel = new Label(top, SWT.NONE);
-		stylesLabel.setText(DialogsMessages
-				.getString("TextPreferencePage.Style")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		stylesLabel.setLayoutData(data);
-
-		_fontStyleCombo = new StyleCombo(top, SWT.NONE);
-		_fontStyleCombo.setItems(IStyleConstants.FONT_STYLE);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_fontStyleCombo.setLayoutData(data);
-		_fontStyleCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String style = _fontStyleCombo.getText();
-				_style.setFontStyle(style);
-			}
-		});
-
-		new Label(top, SWT.NONE);
-
-		Label variantLabel = new Label(top, SWT.NONE);
-		variantLabel.setText(DialogsMessages
-				.getString("TextPreferencePage.Variant")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		variantLabel.setLayoutData(data);
-
-		_fontVariantCombo = new StyleCombo(top, SWT.NONE);
-		_fontVariantCombo.setItems(IStyleConstants.FONT_VARIANT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_fontVariantCombo.setLayoutData(data);
-		_fontVariantCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String variant = _fontVariantCombo.getText();
-				_style.setFontVariant(variant);
-			}
-		});
-
-		Label lineHeightLabel = new Label(top, SWT.NONE);
-		lineHeightLabel.setText(DialogsMessages
-				.getString("TextPreferencePage.LineHeight")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		lineHeightLabel.setLayoutData(data);
-
-		_fontLineHeightNumberCombo = new StyleCombo(top, SWT.NONE);
-		_fontLineHeightNumberCombo.setItems(IStyleConstants.NORMAL);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_fontLineHeightNumberCombo.setLayoutData(data);
-		_fontLineHeightNumberCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_fontLineHeightUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_fontLineHeightNumberCombo.getText());
-				} catch (NumberFormatException ex) {
-					_fontLineHeightUnitCombo.setEnabled(false);
-				}
-
-				String height = _fontLineHeightNumberCombo.getText();
-				if (_fontLineHeightUnitCombo.isEnabled()) {
-					height += _fontLineHeightUnitCombo.getText();
-				}
-
-				_style.setLineHeight(height);
-			}
-		});
-
-		_fontLineHeightUnitCombo = new StyleCombo(top, SWT.READ_ONLY);
-		_fontLineHeightUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_fontLineHeightUnitCombo.setLayoutData(data);
-		_fontLineHeightUnitCombo.select(0);
-		_fontLineHeightUnitCombo.setEnabled(false);
-		_fontLineHeightUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String height = _fontLineHeightNumberCombo.getText();
-				if (_fontLineHeightUnitCombo.isEnabled()) {
-					height += _fontLineHeightUnitCombo.getText();
-				}
-
-				_style.setLineHeight(height);
-			}
-		});
-
-		Label caseLabel = new Label(top, SWT.NONE);
-		caseLabel.setText(DialogsMessages.getString("TextPreferencePage.Case")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		caseLabel.setLayoutData(data);
-
-		_textTransformCombo = new StyleCombo(top, SWT.NONE);
-		_textTransformCombo.setItems(IStyleConstants.FONT_TEXTTRANSFORM);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_textTransformCombo.setLayoutData(data);
-		_textTransformCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String textTransform = _textTransformCombo.getText();
-				_style.setTextTransform(textTransform);
-			}
-		});
-
-		Label decorationLabel = new Label(top, SWT.NONE);
-		decorationLabel.setText(DialogsMessages
-				.getString("TextPreferencePage.Decoration")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		decorationLabel.setLayoutData(data);
-
-		Composite decorationComposite = new Composite(top, SWT.NONE);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		data.horizontalSpan = 4;
-		decorationComposite.setLayoutData(data);
-		layout = new GridLayout(5, true);
-		layout.marginWidth = 0;
-		decorationComposite.setLayout(layout);
-
-		_textDecorationUnderlineButton = new Button(decorationComposite,
-				SWT.CHECK);
-		_textDecorationUnderlineButton
-				.setText(IStyleConstants.TEXT_DECORATION[0]);
-		_textDecorationUnderlineButton
-				.addSelectionListener(new SelectionAdapter() {
-					public void widgetSelected(SelectionEvent e) {
-						if (_textDecorationUnderlineButton.getSelection()) {
-							_textDecorationNoneButton.setSelection(false);
-						}
-						_style.setTextDecoration(getTextDecoration());
-					}
-				});
-
-		_textDecorationOverlineButton = new Button(decorationComposite,
-				SWT.CHECK);
-		_textDecorationOverlineButton
-				.setText(IStyleConstants.TEXT_DECORATION[1]);
-		_textDecorationOverlineButton
-				.addSelectionListener(new SelectionAdapter() {
-					public void widgetSelected(SelectionEvent e) {
-						if (_textDecorationOverlineButton.getSelection()) {
-							_textDecorationNoneButton.setSelection(false);
-						}
-						_style.setTextDecoration(getTextDecoration());
-					}
-				});
-
-		_textDecorationLineThroughButton = new Button(decorationComposite,
-				SWT.CHECK);
-		_textDecorationLineThroughButton
-				.setText(IStyleConstants.TEXT_DECORATION[2]);
-		_textDecorationLineThroughButton
-				.addSelectionListener(new SelectionAdapter() {
-					public void widgetSelected(SelectionEvent e) {
-						if (_textDecorationLineThroughButton.getSelection()) {
-							_textDecorationNoneButton.setSelection(false);
-						}
-						_style.setTextDecoration(getTextDecoration());
-					}
-				});
-
-		_textDecorationBlinkButton = new Button(decorationComposite, SWT.CHECK);
-		_textDecorationBlinkButton.setText(IStyleConstants.TEXT_DECORATION[3]);
-		_textDecorationBlinkButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				if (_textDecorationBlinkButton.getSelection()) {
-					_textDecorationNoneButton.setSelection(false);
-				}
-				_style.setTextDecoration(getTextDecoration());
-			}
-		});
-
-		_textDecorationNoneButton = new Button(decorationComposite, SWT.CHECK);
-		_textDecorationNoneButton.setText(IStyleConstants.TEXT_DECORATION[4]);
-		_textDecorationNoneButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				if (_textDecorationNoneButton.getSelection()) {
-					_textDecorationUnderlineButton.setSelection(false);
-					_textDecorationOverlineButton.setSelection(false);
-					_textDecorationLineThroughButton.setSelection(false);
-					_textDecorationBlinkButton.setSelection(false);
-				}
-				_style.setTextDecoration(getTextDecoration());
-			}
-		});
-
-		_colorField = new ColorButtonDialogField(SWT.BORDER, new ColorUtil());
-		_colorField.setLabelText(DialogsMessages
-				.getString("TextPreferencePage.Color")); //$NON-NLS-1$
-
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		_colorField.getLabelControl(null, top).setLayoutData(data);
-
-		data = new GridData();
-		data.horizontalAlignment = GridData.FILL;
-		data.grabExcessHorizontalSpace = false;
-		_colorField.getComboControl(null, top).setLayoutData(data);
-
-		data = new GridData();
-		_colorField.getChangeControl(null, top).setLayoutData(data);
-		_colorField
-				.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
-					public void dialogFieldApplied(DialogField field) {
-						String color = _colorField.getText();
-						_style.setColor(color);
-					}
-				});
-
-		initializeControls();
-
-		return top;
-	}
-
-	private void initializeControls() {
-		// font-family
-		String fontFamily = _style.getFontFamily();
-		if (!isEmptyString(fontFamily)) {
-			int index = _fontFamilyCombo.indexOf(fontFamily);
-			if (index != -1) {
-				_fontFamilyCombo.select(index);
-			} else {
-				_fontFamilyCombo.setText(fontFamily);
-			}
-		}
-
-		// font-size
-		String fontSize = _style.getFontSize();
-		if (!isEmptyString(fontSize)) {
-			int index = _fontSizeNumberCombo.indexOf(fontSize);
-			if (index != -1) {
-				_fontSizeNumberCombo.select(index);
-			} else {
-				_fontSizeNumberCombo.setText(fontSize);
-			}
-		}
-
-		// font-weight
-		String fontWeight = _style.getFontWeight();
-		if (!isEmptyString(fontWeight)) {
-			int index = _fontWeightCombo.indexOf(fontWeight);
-			if (index != -1) {
-				_fontWeightCombo.select(index);
-			} else {
-				_fontWeightCombo.setText(fontWeight);
-			}
-		}
-
-		// font-style
-		String fontStyle = _style.getFontStyle();
-		if (!isEmptyString(fontStyle)) {
-			int index = _fontStyleCombo.indexOf(fontStyle);
-			if (index != -1) {
-				_fontStyleCombo.select(index);
-			} else {
-				_fontStyleCombo.setText(fontStyle);
-			}
-		}
-
-		// font-variant
-		String fontVariant = _style.getFontVariant();
-		if (!isEmptyString(fontVariant)) {
-			int index = _fontVariantCombo.indexOf(fontVariant);
-			if (index != -1) {
-				_fontVariantCombo.select(index);
-			} else {
-				_fontVariantCombo.setText(fontVariant);
-			}
-		}
-
-		// line-height
-		String lineHeight = _style.getLineHeight();
-		if (!isEmptyString(lineHeight)) {
-			int index = _fontLineHeightNumberCombo.indexOf(lineHeight);
-			if (index != -1) {
-				_fontLineHeightNumberCombo.select(index);
-			} else {
-				_fontLineHeightNumberCombo.setText(lineHeight);
-			}
-		}
-
-		// text-transform
-		String textTransform = _style.getTextTransform();
-		if (!isEmptyString(textTransform)) {
-			int index = _textTransformCombo.indexOf(textTransform);
-			if (index != -1) {
-				_textTransformCombo.select(index);
-			} else {
-				_textTransformCombo.setText(textTransform);
-			}
-		}
-
-		// text-decoration
-		String textDecoration = _style.getTextDecoration();
-		if (!isEmptyString(textDecoration)) {
-			int index = textDecoration
-					.indexOf(IStyleConstants.TEXT_DECORATION[0]);
-			if (index != -1) {
-				_textDecorationUnderlineButton.setSelection(true);
-			} else {
-				_textDecorationUnderlineButton.setSelection(false);
-			}
-
-			index = textDecoration.indexOf(IStyleConstants.TEXT_DECORATION[1]);
-			if (index != -1) {
-				_textDecorationOverlineButton.setSelection(true);
-			} else {
-				_textDecorationOverlineButton.setSelection(false);
-			}
-
-			index = textDecoration.indexOf(IStyleConstants.TEXT_DECORATION[2]);
-			if (index != -1) {
-				_textDecorationLineThroughButton.setSelection(true);
-			} else {
-				_textDecorationLineThroughButton.setSelection(false);
-			}
-
-			index = textDecoration.indexOf(IStyleConstants.TEXT_DECORATION[3]);
-			if (index != -1) {
-				_textDecorationBlinkButton.setSelection(true);
-			} else {
-				_textDecorationBlinkButton.setSelection(false);
-			}
-
-			index = textDecoration.indexOf(IStyleConstants.TEXT_DECORATION[4]);
-			if (index != -1) {
-				_textDecorationNoneButton.setSelection(true);
-			} else {
-				_textDecorationNoneButton.setSelection(false);
-			}
-		}
-
-		// color
-		String color = _style.getColor();
-		if (!isEmptyString(color)) {
-			_colorField.setTextWithoutUpdate(color);
-		}
-	}
-
-	private String getTextDecoration() {
-		StringBuffer textDecoration = new StringBuffer();
-		if (_textDecorationUnderlineButton.getSelection()) {
-			textDecoration.append(_textDecorationUnderlineButton.getText())
-					.append(' ');
-		}
-		if (_textDecorationOverlineButton.getSelection()) {
-			textDecoration.append(_textDecorationOverlineButton.getText())
-					.append(' ');
-		}
-		if (_textDecorationLineThroughButton.getSelection()) {
-			textDecoration.append(_textDecorationLineThroughButton.getText())
-					.append(' ');
-		}
-		if (_textDecorationBlinkButton.getSelection()) {
-			textDecoration.append(_textDecorationBlinkButton.getText()).append(
-					' ');
-		}
-		if (_textDecorationNoneButton.getSelection()) {
-			textDecoration.append(_textDecorationNoneButton.getText()).append(
-					' ');
-		}
-
-		return textDecoration.toString().trim();
-	}
-
-	public void setVisible(boolean visible) {
-		super.setVisible(visible);
-
-		getApplyButton().setVisible(false);
-		getDefaultsButton().setVisible(false);
-	}
-
-	private boolean isEmptyString(String str) {
-		if (str == null || str.length() == 0) {
-			return true;
-		}
-        return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/WPEPropertyPage.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/WPEPropertyPage.java
deleted file mode 100644
index 3ee9530..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/WPEPropertyPage.java
+++ /dev/null
@@ -1,454 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2009 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.ui.dialogs;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jst.jsf.common.metadata.Model;
-import org.eclipse.jst.jsf.common.metadata.Trait;
-import org.eclipse.jst.jsf.common.metadata.internal.TraitValueHelper;
-import org.eclipse.jst.jsf.common.metadata.query.ITaglibDomainMetaDataModelContext;
-import org.eclipse.jst.jsf.common.metadata.query.TaglibDomainMetaDataQueryHelper;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.dtresourceprovider.DTResourceProviderFactory;
-import org.eclipse.jst.pagedesigner.dtresourceprovider.DTSkinManager;
-import org.eclipse.jst.pagedesigner.dtresourceprovider.IDTResourceProvider;
-import org.eclipse.jst.pagedesigner.dtresourceprovider.IDTSkin;
-import org.eclipse.jst.pagedesigner.utils.EditorUtil;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.ui.dialogs.PropertyPage;
-
-/**
- * Property page for the Web Page Editor.
- * 
- * @author Ian Trimble - Oracle
- */
-public class WPEPropertyPage extends PropertyPage {
-
-	private IProject project;
-	private TableViewer taglibTable;
-	private TableViewer skinsTable;
-	private Button currentButton;
-	private Map<String, IDTSkin> localCurrentSkinMap = new HashMap<String, IDTSkin>();
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jface.dialogs.DialogPage#getDescription()
-	 */
-	@Override
-	public String getDescription() {
-		return DialogsMessages.getString("WPEPropertyPage.Description"); //$NON-NLS-1$
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.preference.PreferencePage#createContents(org.eclipse.swt.widgets.Composite)
-	 */
-	@Override
-	protected Control createContents(Composite parent) {
-		Composite top = new Composite(parent, SWT.NONE);
-		GridLayout topLayout = new GridLayout(2, false);
-		topLayout.marginWidth = 0;
-		top.setLayout(topLayout);
-		top.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
-
-		//taglibs label
-		Label taglibLabel = new Label(top, SWT.NONE);
-		taglibLabel.setText(DialogsMessages.getString("WPEPropertyPage.TagLibs.Label")); //$NON-NLS-1$
-		taglibLabel.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
-
-		//empty cell
-		new Label(top, SWT.NONE).setVisible(false);
-
-		//taglibs list
-		taglibTable = new TableViewer(top, SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
-		taglibTable.getControl().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
-		taglibTable.getTable().addSelectionListener(new TaglibSelectionListener());
-		taglibTable.setContentProvider(new TaglibContentProvider());
-		taglibTable.setLabelProvider(new TaglibLabelProvider());
-		taglibTable.setInput(project);
-
-		//empty cell
-		new Label(top, SWT.NONE).setVisible(false);
-
-		//skins label
-		Label skinsLabel = new Label(top, SWT.NONE);
-		skinsLabel.setText(DialogsMessages.getString("WPEPropertyPage.Skins.Label")); //$NON-NLS-1$
-		skinsLabel.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
-
-		//empty cell
-		new Label(top, SWT.NONE).setVisible(false);
-
-		//skins list
-		skinsTable = new TableViewer(top, SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
-		skinsTable.getControl().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
-		skinsTable.getTable().addSelectionListener(new SkinSelectionListener());
-		skinsTable.setContentProvider(new SkinContentProvider());
-		skinsTable.setLabelProvider(new SkinLabelProvider());
-
-		//buttons
-		Composite buttons = new Composite(top, SWT.NONE);
-		GridLayout buttonsLayout = new GridLayout(1, true);
-		buttonsLayout.marginWidth = 0;
-		buttons.setLayout(buttonsLayout);
-		buttons.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false));
-		currentButton = new Button(buttons, SWT.NONE);
-		currentButton.setText(DialogsMessages.getString("WPEPropertyPage.Current.Button")); //$NON-NLS-1$
-		currentButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent event) {
-				String nsURI = getCurrentNSURI();
-				IStructuredSelection selection = (IStructuredSelection)skinsTable.getSelection();
-				IDTSkin dtSkin = (IDTSkin)selection.getFirstElement();
-				if (dtSkin != null) {
-					localCurrentSkinMap.put(nsURI, dtSkin);
-					skinsTable.refresh();
-					updateButtons();
-				}
-			}
-		});
-		updateButtons();
-
-		return top;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.ui.dialogs.PropertyPage#setElement(org.eclipse.core.runtime.IAdaptable)
-	 */
-	@Override
-	public void setElement(IAdaptable element) {
-		Object objElement = element.getAdapter(IProject.class);
-		if (objElement != null) {
-			project = (IProject)objElement;
-			if (taglibTable != null) {
-				taglibTable.setInput(objElement);
-			}
-		}
-		super.setElement(element);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.preference.PreferencePage#performDefaults()
-	 */
-	@Override
-	protected void performDefaults() {
-		List<TaglibData> taglibDataList = getTaglibDataList();
-		for (TaglibData taglibData: taglibDataList) {
-			String nsURI = taglibData.getNSURI();
-			IDTSkin defaultDTSkin = DTSkinManager.getInstance(project).getDefaultSkin(nsURI);
-			localCurrentSkinMap.put(nsURI, defaultDTSkin);
-		}
-		skinsTable.refresh();
-		updateButtons();
-		super.performDefaults();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.preference.PreferencePage#performOk()
-	 */
-	@Override
-	public boolean performOk() {
-		Set keys = localCurrentSkinMap.keySet();
-		for (Object key: keys) {
-			String nsURI = (String)key;
-			IDTSkin dtSkin = localCurrentSkinMap.get(nsURI);
-			DTSkinManager.getInstance(project).setCurrentSkin(nsURI, dtSkin);
-		}
-		EditorUtil.refreshAllWPEDesignViewers();
-		return super.performOk();
-	}
-
-	private IDTSkin getLocalCurrentSkin() {
-		IDTSkin localCurrentSkin = null;
-		String nsURI = getCurrentNSURI();
-		localCurrentSkin = localCurrentSkinMap.get(nsURI);
-		if (localCurrentSkin == null) {
-			localCurrentSkin = DTSkinManager.getInstance(project).getCurrentSkin(nsURI);
-		}
-		return localCurrentSkin;
-	}
-
-	private String getCurrentNSURI() {
-		String nsURI = null;
-		if (skinsTable != null) {
-			Object objInput = skinsTable.getInput();
-			if (objInput instanceof TaglibData) {
-				nsURI = ((TaglibData)objInput).getNSURI();
-			}
-		}
-		return nsURI;
-	}
-
-	private List<TaglibData> getTaglibDataList() {
-		List<TaglibData> taglibDataList = new ArrayList<TaglibData>();
-		List<IDTResourceProvider> resourceProviders =
-			DTResourceProviderFactory.getInstance().getActiveDTResourceProviders(project);
-		for (IDTResourceProvider resourceProvider: resourceProviders) {
-			TaglibData taglibData = new TaglibData(resourceProvider.getId());
-			if (!taglibDataList.contains(taglibData)) {
-				taglibDataList.add(taglibData);
-			}
-		}
-		return taglibDataList;
-	}
-
-	private void updateButtons() {
-		boolean currentButtonEnabled = false;
-		if (skinsTable != null) {
-			IStructuredSelection selection = (IStructuredSelection)skinsTable.getSelection();
-			if (selection != null) {
-				Object selectedObject = selection.getFirstElement();
-				if (selectedObject instanceof IDTSkin) {
-					IDTSkin localCurrentSkin = getLocalCurrentSkin();
-					if ((IDTSkin)selectedObject != localCurrentSkin) {
-						currentButtonEnabled = true;
-					}
-				}
-			}
-		}
-		currentButton.setEnabled(currentButtonEnabled);
-	}
-
-
-
-	/**
-	 * Content provider for taglib table viewer.
-	 */
-	private class TaglibContentProvider implements IStructuredContentProvider {
-		/*
-		 * (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-		 */
-		public Object[] getElements(Object inputElement) {
-			return getTaglibDataList().toArray();
-		}
-		/*
-		 * (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
-		 */
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-			viewer.refresh();
-		}
-		/*
-		 * (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-		 */
-		public void dispose() {
-			//nothing to dispose
-		}
-	}
-
-
-
-	/**
-	 * Label provider for taglib table viewer.
-	 */
-	private class TaglibLabelProvider extends LabelProvider {
-		/*
-		 * (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.ILabelProvider#getImage(java.lang.Object)
-		 */
-		public Image getImage(Object element) {
-			Image image = null;
-			if (element instanceof TaglibData) {
-				image = PDPlugin.getDefault().getImage("library_obj.gif"); //$NON-NLS-1$
-			}
-			return image;
-		}
-		/*
-		 * (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.ILabelProvider#getText(java.lang.Object)
-		 */
-		public String getText(Object element) {
-			String text = null;
-			if (element instanceof TaglibData) {
-				TaglibData taglibData = ((TaglibData)element);
-				if (taglibData.getName() != null) {
-					text = taglibData.getName();
-				} else {
-					text = taglibData.getNSURI();
-				}
-			}
-			return text;
-		}
-	}
-
-
-
-	private class TaglibSelectionListener implements SelectionListener {
-		/*
-		 * (non-Javadoc)
-		 * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
-		 */
-		public void widgetSelected(SelectionEvent event) {
-			Object obj = event.item.getData();
-			if (obj instanceof TaglibData) {
-				skinsTable.setInput(obj);
-			}
-		}
-		/*
-		 * (non-Javadoc)
-		 * @see org.eclipse.swt.events.SelectionListener#widgetDefaultSelected(org.eclipse.swt.events.SelectionEvent)
-		 */
-		public void widgetDefaultSelected(SelectionEvent event) {
-			widgetSelected(event);
-		}
-	}
-
-
-
-	/**
-	 * Used to hold and pass taglib-related data.
-	 */
-	private class TaglibData {
-		private String nsURI;
-		private String name;
-		public TaglibData(String nsURI) {
-			this.nsURI = nsURI;
-			ITaglibDomainMetaDataModelContext modelContext = TaglibDomainMetaDataQueryHelper.createMetaDataModelContext(project, nsURI);
-			Model model = TaglibDomainMetaDataQueryHelper.getModel(modelContext);
-			Trait trait = TaglibDomainMetaDataQueryHelper.getTrait(model, "display-label"); //$NON-NLS-1$
-			this.name = TraitValueHelper.getValueAsString(trait);
-		}
-		public String getNSURI() {
-			return nsURI;
-		}
-		public String getName() {
-			return name;
-		}
-		/*
-		 * (non-Javadoc)
-		 * @see java.lang.Object#hashCode()
-		 */
-		public int hashCode() {
-			int nsURIHashCode = 0;
-			if (nsURI != null) {
-				nsURIHashCode = nsURI.hashCode();
-			}
-			int nameHashCode = 0;
-			if (name != null) {
-				nameHashCode = name.hashCode();
-			}
-			return nameHashCode | nsURIHashCode ;
-		}
-	}
-
-
-
-	/**
-	 * Content provider for skin table viewer.
-	 */
-	private class SkinContentProvider implements IStructuredContentProvider {
-		/*
-		 * (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-		 */
-		public Object[] getElements(Object inputElement) {
-			List<IDTSkin> skinList;
-			if (inputElement instanceof TaglibData) {
-				skinList = DTSkinManager.getInstance(project).getSkins(((TaglibData)inputElement).getNSURI());
-			} else {
-				skinList = Collections.EMPTY_LIST;
-			}
-			return skinList.toArray();
-		}
-		/*
-		 * (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
-		 */
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-			viewer.refresh();
-			updateButtons();
-		}
-		/*
-		 * (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-		 */
-		public void dispose() {
-			//nothing to dispose
-		}
-	}
-
-
-
-	/**
-	 * Label provider for skin table viewer.
-	 */
-	private class SkinLabelProvider extends LabelProvider {
-		/*
-		 * (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.ILabelProvider#getImage(java.lang.Object)
-		 */
-		public Image getImage(Object element) {
-			Image image = null;
-			if (element instanceof IDTSkin) {
-				image = PDPlugin.getDefault().getImage("skin.png"); //$NON-NLS-1$
-			}
-			return image;
-		}
-		/*
-		 * (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.ILabelProvider#getText(java.lang.Object)
-		 */
-		public String getText(Object element) {
-			String text = null;
-			if (element instanceof IDTSkin) {
-				IDTSkin dtSkin = (IDTSkin)element;
-				text = dtSkin.getName();
-				if (dtSkin == getLocalCurrentSkin()) {
-					text += " "  + DialogsMessages.getString("WPEPropertyPage.Skins.Item.Current"); //$NON-NLS-1$ //$NON-NLS-2$
-				}
-			}
-			return text;
-		}
-	}
-
-
-
-	private class SkinSelectionListener implements SelectionListener {
-		/*
-		 * (non-Javadoc)
-		 * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
-		 */
-		public void widgetSelected(SelectionEvent event) {
-			updateButtons();
-		}
-		/*
-		 * (non-Javadoc)
-		 * @see org.eclipse.swt.events.SelectionListener#widgetDefaultSelected(org.eclipse.swt.events.SelectionEvent)
-		 */
-		public void widgetDefaultSelected(SelectionEvent event) {
-			widgetSelected(event);
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/preferences/PDPreferencePage.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/preferences/PDPreferencePage.java
deleted file mode 100644
index 1be27be..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/preferences/PDPreferencePage.java
+++ /dev/null
@@ -1,153 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.ui.preferences;
-
-import org.eclipse.jface.preference.BooleanFieldEditor;
-import org.eclipse.jface.preference.FieldEditorPreferencePage;
-import org.eclipse.jface.preference.IntegerFieldEditor;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.utils.EditorUtil;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPreferencePage;
-
-/**
- * This class represents a preference page that is contributed to the
- * Preferences dialog. By subclassing <samp>FieldEditorPreferencePage </samp>,
- * we can use the field support built into JFace that allows us to create a page
- * that is small and knows how to save, restore and apply itself.
- * <p>
- * This page is used to modify preferences only. They are stored in the
- * preference store that belongs to the main plug-in class. That way,
- * preferences can be accessed directly via the preference store.
- * 
- * C.B: Copied from the GEMPreferences in the Faces Config Editor.
- */
-
-public final class PDPreferencePage extends FieldEditorPreferencePage implements
-        IWorkbenchPreferencePage
-{
-
-    // appearance
-
-    private Group _cssLayoutGroup;
-
-    // private BooleanField _enableAbsolute;
-    //
-    // private IntegerFieldEditor _artificialCellpadding;
-
-    private class BooleanField extends BooleanFieldEditor
-    {
-        // private Composite parent;
-
-        /**
-         * @param name
-         * @param label
-         * @param parent
-         */
-        public BooleanField(String name, String label, Composite parent)
-        {
-            super(name, label, parent);
-            // this.parent = parent;
-        }
-
-        // /**
-        // * @return the change control button
-        // */
-        // public Button getButton() {
-        // return getChangeControl(parent);
-        // }
-    }
-
-    /**
-     * Constructor
-     */
-    public PDPreferencePage()
-    {
-        super(GRID);
-        setPreferenceStore(PDPlugin.getDefault().getPreferenceStore());
-        setDescription(PreferenceMessages.PDPreferences_description);
-    }
-
-    /**
-     * Creates the field editors. Field editors are abstractions of the common
-     * GUI blocks needed to manipulate various types of preferences. Each field
-     * editor knows how to save and restore itself.
-     */
-    public void createFieldEditors()
-    {
-        _cssLayoutGroup = new Group(getFieldEditorParent(), SWT.NULL);
-
-        // note, we aren't saving the reference. It's assumed that parent
-        // worries about destruction, persistence etc.
-        /* _enableAbsolute = */addBooleanField(
-                PDPreferences.CSS_ENABLE_ABSOLUTE_POSITIONING,
-                PreferenceMessages.EditorPreferences_LABEL_CSSEnableAbsolutePositioning,
-                _cssLayoutGroup);
-        /* _artificialCellpadding = */addIntegerField(
-                PDPreferences.CSS_USE_ARTIFICAL_CELL_PADDING,
-                PreferenceMessages.EditorPreferences_LABEL_CSSArtificalCellPadding,
-                _cssLayoutGroup);
-    }
-
-    
-    @Override
-    public boolean performOk()
-    {
-        final boolean succeeded = super.performOk();
-        if (succeeded)
-        {
-            EditorUtil.refreshAllWPEDesignViewers();
-        }
-        return succeeded;
-    }
-
-    
-    protected void initialize()
-    {
-        // Color use: Default canvas colors should pick up system defaults
-        // enable or disable all of the color and font selection controls in the
-        // preference dialog
-        // depending on whether the "Use System Colors" checkbox is selected.
-        super.initialize();
-
-        ((GridLayout) getFieldEditorParent().getLayout()).numColumns = 1;
-        _cssLayoutGroup.setLayout(new GridLayout(2, false));
-        _cssLayoutGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL
-                | GridData.VERTICAL_ALIGN_BEGINNING));
-    }
-
-    public void init(IWorkbench workbench)
-    {
-        // no initialization
-    }
-
-    private IntegerFieldEditor addIntegerField(String name, String labelText,
-            Composite parent)
-    {
-        IntegerFieldEditor f = new IntegerFieldEditor(name, labelText, parent);
-        addField(f);
-        return f;
-    }
-
-    private BooleanField addBooleanField(String name, String labelText,
-            Composite parent)
-    {
-        BooleanField f = new BooleanField(name, labelText, parent);
-        addField(f);
-        return f;
-    }
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/preferences/PDPreferences.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/preferences/PDPreferences.java
deleted file mode 100644
index b2dda7a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/preferences/PDPreferences.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2009 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.ui.preferences;
-
-import org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.editors.HTMLEditor;
-
-/**
- * Utility class for handling preferences related to the Web Page Editor plug-in.
- * <br>
- * <p><b>Provisional API - subject to change</b></p>
- */
-public class PDPreferences extends AbstractPreferenceInitializer {
-
-    /**
-     * Preference used to set modes for the page designer when displayed in a
-     * sash editor.
-     */
-    public static final String SASH_EDITOR_MODE_PREF = PDPreferences.class
-            .getName()
-            + ".sash_editor_mode"; //$NON-NLS-1$
-    /**
-     * The number of pixels of artificial cell padding to use Default = 0
-     */
-    public final static String CSS_USE_ARTIFICAL_CELL_PADDING = PDPreferences.class
-            .getName()
-            + ".CSSArtificalCellPadding"; //$NON-NLS-1$
-    /**
-     * Whether or not to enable absolute positioning Default = false
-     */
-    public final static String CSS_ENABLE_ABSOLUTE_POSITIONING = PDPreferences.class
-            .getName()
-            + ".CSSEnableAbsolutePositioning"; //$NON-NLS-1$
-    /**
-     * The default value for absolute positioning enablement
-     */
-    public static final boolean DEFAULT_CSS_ENABLE_ABSOLUTE_POSITIONING = false;
-    /**
-     * The default value for artificial cell padding.
-     */
-    public static final int DEFAULT_CSS_USE_ARTIFICIAL_CELL_PADDING = 4;
-
-    private static IPreferenceStore getPreferenceStore()
-    {
-        return PDPlugin.getDefault().getPreferenceStore();
-    }
-
-    /**
-     * @return the css absolute positioning enablement flag.
-     */
-    public boolean isCssAbsolutePositioningEnabled()
-    {
-        final IPreferenceStore store = getPreferenceStore();
-        return store.getBoolean(CSS_ENABLE_ABSOLUTE_POSITIONING);
-    }
-
-    /**
-     * @return the css artificial cell padding preference
-     */
-    public int getCssArtificialCellPadding()
-    {
-        final IPreferenceStore store = getPreferenceStore();
-        return store.getInt(CSS_USE_ARTIFICAL_CELL_PADDING);
-    }
-
-    @Override
-    public void initializeDefaultPreferences()
-    {
-        // Set default HTML editor split vertical (i.e. with top and bottom
-        // pane)
-        IPreferenceStore store = getPreferenceStore();
-        store.setDefault(SASH_EDITOR_MODE_PREF, HTMLEditor.MODE_SASH_VERTICAL);
-        store.setDefault(CSS_USE_ARTIFICAL_CELL_PADDING,
-                DEFAULT_CSS_USE_ARTIFICIAL_CELL_PADDING);
-        store.setDefault(CSS_ENABLE_ABSOLUTE_POSITIONING,
-                DEFAULT_CSS_ENABLE_ABSOLUTE_POSITIONING);
-    }
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/preferences/PreferenceMessages.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/preferences/PreferenceMessages.java
deleted file mode 100644
index 0caaeee..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/preferences/PreferenceMessages.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package org.eclipse.jst.pagedesigner.ui.preferences;
-
-import org.eclipse.osgi.util.NLS;
-
-/*package*/ class PreferenceMessages extends NLS
-{
-    private static final String BUNDLE_NAME = "org.eclipse.jst.pagedesigner.ui.preferences.PreferenceMessages"; //$NON-NLS-1$
-    /**
-     * See PreferenceMessages.properties
-     */
-    public static String PDPreferences_description;
-    /**
-     * See PreferenceMessages.properties
-     */
-    public static String EditorPreferences_LABEL_CSSArtificalCellPadding;
-    /**
-     * See PreferenceMessages.properties
-     */
-    public static String EditorPreferences_LABEL_CSSEnableAbsolutePositioning;
-
-    private PreferenceMessages() {
-        // Do not instantiate
-    }
-
-    static {
-        NLS.initializeMessages(BUNDLE_NAME, PreferenceMessages.class);
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/preferences/PreferenceMessages.properties b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/preferences/PreferenceMessages.properties
deleted file mode 100644
index c7c7205..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/preferences/PreferenceMessages.properties
+++ /dev/null
@@ -1,3 +0,0 @@
-PDPreferences_description=Preferences for the design page of Web Page Editor.
-EditorPreferences_LABEL_CSSArtificalCellPadding=Add Artificial Padding Around Containers:
-EditorPreferences_LABEL_CSSEnableAbsolutePositioning=Enable Absolute CSS Position
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/BodyHelper.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/BodyHelper.java
deleted file mode 100644
index 725bcad..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/BodyHelper.java
+++ /dev/null
@@ -1,345 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.utils;
-
-import java.util.ArrayList;
-import java.util.Comparator;
-
-import javax.xml.namespace.QName;
-
-import org.eclipse.jst.jsf.core.internal.tld.CMUtil;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.adapters.IBodyInfo;
-import org.eclipse.jst.pagedesigner.adapters.internal.BodyInfo;
-import org.eclipse.jst.pagedesigner.dom.DOMPosition;
-import org.eclipse.jst.pagedesigner.dom.DOMRefPosition;
-import org.eclipse.jst.pagedesigner.dom.DOMRefPosition2;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMText;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-/**
- * This class helps location insertion position to inside correct body or doc
- * prefix. NOTE: this class only doing limited support on doc level position
- * validation. Element specific position validation will be done in other
- * places.
- * 
- * @author mengbo
- */
-public class BodyHelper {
-	// bit flags used for child skipping.
-	/**
-	 * Bit flag for empty text node
-	 */
-	public static final int EMPTY_TEXT = 1;
-
-	/**
-	 * Bit flag for comment node
-	 */
-	public static final int COMMENT = 2;
-
-	/**
-	 * Bit flag for HEAD node
-	 */
-	public static final int HEADER = 3;
-
-	/**
-	 * 
-	 * @param child
-	 * @return boolean
-	 */
-	private static boolean isSkippableChild(Node parent, Node child, int flag) {
-		if ((flag & COMMENT) != 0 && child.getNodeType() == Node.COMMENT_NODE)
-			return true;
-		if ((flag & EMPTY_TEXT) != 0 && child instanceof IDOMText
-				&& ((IDOMText) child).isElementContentWhitespace())
-			return true;
-
-		if ((flag & HEADER) != 0 && child.getNodeType() == Node.ELEMENT_NODE) {
-			String uri = CMUtil.getElementNamespaceURI((Element) child);
-			IBodyInfo parentInfo = getBodyInfo((IDOMNode) parent);
-			if (parentInfo != null
-					&& parentInfo.isBodyHeader((IDOMNode) parent, uri,
-							((Element) child).getLocalName()))
-				return true;
-		}
-		return false;
-	}
-
-	/**
-	 * check whether uri/tag should be header of any body container that is
-	 * ancester of the start node.
-	 * 
-	 * @param start
-	 * @param uri
-	 * @param tag
-	 * @return IDOMNode
-	 */
-	public static IDOMNode findHeaderContainer(IDOMNode start, String uri,
-			String tag) {
-		while (start != null) {
-			IBodyInfo designInfo = getBodyInfo(start);
-			if (designInfo != null && designInfo.isBodyContainer(start)) {
-				if (designInfo.isBodyHeader(start, uri, tag))
-					return start;
-			}
-			start = (IDOMNode) start.getParentNode();
-		}
-		return null;
-	}
-
-	/**
-	 * find the closest body insertion point, to make it as deep as possible.
-	 * (Move into as more body as possible)
-	 * @param position 
-	 * @return IDOMPosition
-	 */
-	public static IDOMPosition findBodyInsertLocation(IDOMPosition position) {
-		// forward first.
-		Node reference = position.getNextSiblingNode();
-		Node container = position.getContainerNode();
-		while (reference != null) {
-			IBodyInfo info = getBodyInfo((IDOMNode) reference);
-			if (info != null && info.isBodyContainer((IDOMNode) reference)) {
-				// good, we find a body!
-				position = new DOMPosition(reference, 0);
-				return findBodyInsertLocation(position);
-			}
-			if (isSkippableChild(container, reference, EMPTY_TEXT | COMMENT
-					| HEADER)) {
-				reference = reference.getNextSibling();
-				continue;
-			}
-            break;
-		}
-
-		// backward
-		reference = position.getPreviousSiblingNode();
-		while (reference != null) {
-			IBodyInfo info = getBodyInfo((IDOMNode) reference);
-			if (info != null && info.isBodyContainer((IDOMNode) reference)) {
-				// good, we find a body!
-				position = new DOMPosition(reference, reference.getChildNodes()
-						.getLength());
-				return findBodyInsertLocation(position);
-			}
-			// XXX: not skip header here. So if there is some header with wrong
-			// location, we will respect user.
-			if (isSkippableChild(container, reference, EMPTY_TEXT | COMMENT)) {
-				reference = reference.getPreviousSibling();
-				continue;
-			}
-            break;
-		}
-
-		// not find any body at same level as the insertion point.
-		return position;
-	}
-
-	/**
-	 * The element type identified by "uri" and "tag" is going to be inserted
-	 * into the document. This method is used to adjust the insert position so
-	 * it can be put into correct body or header section.
-	 * @param uri 
-	 * @param tag 
-	 * @param position 
-	 * @return IDOMPosition
-	 * 
-	 */
-	public static IDOMPosition adjustInsertPosition(String uri, String tag,
-			IDOMPosition position) {
-		IDOMNode parent = (IDOMNode) position.getContainerNode();
-		IBodyInfo designInfo = getBodyInfo(parent);
-		if (designInfo == null) {
-			return position; // should not happen.
-		}
-
-		IDOMNode headerContainer = findHeaderContainer(parent, uri, tag);
-
-		if (headerContainer == null) {
-			// the new node is not header.
-			if (shouldIgnoreAdjust(uri, tag)) {
-				return position;
-			}
-
-			// new node is not body header. So should place inside the inner most
-			// body.
-			if (!designInfo.isBodyContainer(parent)) {
-				return position; // it's parent is not body, so we suggest
-				// it's parent already correctly located, and respect user's
-				// choice.
-			}
-
-			// ok, we are inside some body, but we don't know whether we are in
-			// the inner most body.
-			// try to find a body container at same level and see whether we can
-			// move into that body.
-			return findBodyInsertLocation(position);
-		}
-        // good, we find a body container and the new node should be header
-        // of it.
-        Node child = headerContainer.getFirstChild();
-
-        // if parent is different from headerContainer, then
-        // child!=referenceHolder[0] will always be true
-        while (child != null) // && child != refNode)
-        {
-        	Comparator comp = NodeLocationComparator.getInstance();
-        	// Currently the comparator deels with tags like taglib and
-        	// loadbundle particularly, comparasion result 0
-        	// means it didn't compare the tags.
-        	if (comp.compare(child, tag) < 0
-        			|| (comp.compare(child, tag) == 0 && isSkippableChild(
-        					headerContainer, child, COMMENT | EMPTY_TEXT
-        							| HEADER))) {
-        		child = child.getNextSibling();
-        	} else {
-        		break;
-        	}
-        }
-        if (child != null) {
-        	return new DOMRefPosition(child, false);
-        }
-        return new DOMPosition(parent, parent.getChildNodes()
-        		.getLength());
-	}
-
-	/**
-	 * Find the position to insert a header element into the specified parent.
-	 * 
-	 * @param uri
-	 * @param tag
-	 * @param parent
-	 * @param ref 
-	 */
-	public static void findHeaderInsertPosition(String uri, String tag,
-			Node parent, Node[] ref) {
-		Node child = parent.getFirstChild();
-		while (child != null) {
-			Comparator comp = NodeLocationComparator.getInstance();
-			if (comp.compare(child, tag) < 0
-					|| (comp.compare(child, tag) == 0 && isSkippableChild(
-							parent, child, COMMENT | EMPTY_TEXT | HEADER))) {
-				child = child.getNextSibling();
-			} else {
-				break;
-			}
-		}
-		ref[0] = child;
-		return;
-	}
-
-	/**
-	 * @param position
-	 * @param body
-	 * @param defaultPrefix
-	 * @return the new dom position based on the insert.  May return null if
-	 * insert fails.
-	 */
-	public static IDOMPosition insertBody(IDOMPosition position, QName body,
-			String defaultPrefix) {
-		IBodyInfo bodyInfo = getBodyInfo((IDOMNode) position.getContainerNode());
-
-		Node node = position.getContainerNode();
-		final Node originalContainer = node;
-		final Node nextSibling = position.getNextSiblingNode();
-
-		// create the body element first.
-		Document ownerDoc;
-		if (node instanceof Document) {
-			ownerDoc = (Document) node;
-		} else {
-			ownerDoc = node.getOwnerDocument();
-		}
-		if (ownerDoc == null) {
-			return null; // should not happen
-		}
-
-		final String prefix = JSPUtil.getOrCreatePrefix(((IDOMNode) node).getModel(),
-				body.getNamespaceURI(), defaultPrefix);
-		final Element ele = ownerDoc.createElement((prefix == null ? "" //$NON-NLS-1$
-				: (prefix + ":")) //$NON-NLS-1$
-				+ body.getLocalPart());
-
-		// need to find out the insertion point
-		while (node instanceof IDOMNode) {
-			if (bodyInfo.isBodyContainer((IDOMNode) node)) {
-				// ok, node is a body container.
-				// we could create the new node as child of node and move all
-				// node's none header children
-				// as children of the new node.
-
-				NodeList nl = node.getChildNodes();
-				ArrayList list = new ArrayList();
-				for (int i = 0; i < nl.getLength(); i++) {
-					Node child = nl.item(i);
-					if (isSkippableChild(node, child, HEADER | COMMENT
-							| EMPTY_TEXT)) {
-						continue;
-					}
-					list.add(nl.item(i));
-				}
-				for (int i = 0; i < list.size(); i++) {
-					ele.appendChild((Node) list.get(i));
-				}
-				node.appendChild(ele);
-
-				if (node == originalContainer) {
-					if (nextSibling == null) {
-						return new DOMRefPosition2(ele, true);
-					} else if (nextSibling.getParentNode() == ele) {
-						// next sibling is not in header part
-						return new DOMRefPosition(nextSibling, false);
-					} else {
-						return new DOMPosition(ele, 0);
-					}
-				}
-                return position;
-			}
-			node = node.getParentNode();
-		}
-		// should not happen, because document and documentfragment node will
-		// always be body node
-		// so if reach here, means the position is not in document.
-		return null;
-	}
-
-	/**
-	 * For certain special tags, do not following the "header"/"body" separation
-	 * and can't fit into the relocation process.
-	 * 
-	 * @param uri
-	 * @param tag
-	 * @return true if tag is an element that should be moved in response to 
-	 * body insert.
-	 */
-	public static boolean shouldIgnoreAdjust(String uri, String tag) {
-		// FIXME:
-		return (ITLDConstants.URI_HTML.equalsIgnoreCase(uri) && "script" //$NON-NLS-1$
-				.equalsIgnoreCase(tag))
-				|| (ITLDConstants.URI_JSP.equals(uri));
-	}
-
-	/**
-	 * @param node
-	 * @return the body info corresponding to node (should we use a node adapter?)
-	 */
-	public static IBodyInfo getBodyInfo(IDOMNode node) {
-		// TODO: in the future, when bodyinfo is no longer singleton, we'll use
-		// adapter mechanism.
-		return BodyInfo.getInstance();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/CacheManager.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/CacheManager.java
deleted file mode 100644
index 5483281..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/CacheManager.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.utils;
-
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.Map;
-
-/**
- * This is a cache manager. It will use the ICacheEntryCreator interface to
- * manage creating new item and dispose old item.
- * 
- * @author mengbo
- * @version 1.5
- */
-public class CacheManager {
-	ICacheEntryCreator _creator;
-
-	int _maxSize;
-
-	// key --> value
-	Map _map = new HashMap();
-
-	// keep track of LRU
-	LinkedList _keys = new LinkedList();
-
-	/**
-	 * @param creator
-	 * @param maxSize
-	 */
-	public CacheManager(ICacheEntryCreator creator, int maxSize) {
-		_creator = creator;
-		_maxSize = maxSize;
-		if (_maxSize <= 0) {
-			_maxSize = 10;
-		}
-	}
-
-	/**
-	 * @param key
-	 * @return the cache entry for key
-	 */
-	public Object getEntry(Object key) {
-		Object result = _map.get(key);
-		if (result == null) {
-			// not existed yet.
-			if (_map.size() >= _maxSize) {
-				// we need to remove the oldest one.
-				Object keyRemove = _keys.removeFirst();
-				Object objToRemove = _map.remove(keyRemove);
-				_creator.dispose(keyRemove, objToRemove);
-			}
-			result = _creator.createEntry(key);
-			_keys.addLast(key);
-			_map.put(key, result);
-			return result;
-		}
-        _keys.remove(key);
-        _keys.addLast(key);
-        return result;
-	}
-
-	/**
-	 * Dispose the cache
-	 */
-	public void disposeAll() {
-		_keys.clear();
-		for (Iterator iter = _map.keySet().iterator(); iter.hasNext();) {
-			Object key = iter.next();
-			Object entry = _map.get(key);
-			_creator.dispose(key, entry);
-		}
-		_map.clear();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/CommandUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/CommandUtil.java
deleted file mode 100644
index 281f045..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/CommandUtil.java
+++ /dev/null
@@ -1,123 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.utils;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jst.jsf.common.metadata.query.ITaglibDomainMetaDataModelContext;
-import org.eclipse.jst.jsf.common.metadata.query.TaglibDomainMetaDataQueryHelper;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IStructuredDocumentContextResolverFactory;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IWorkspaceContextResolver;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContextFactory;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.editors.palette.IDropSourceData;
-import org.eclipse.jst.pagedesigner.editors.palette.ITagDropSourceData;
-import org.eclipse.jst.pagedesigner.itemcreation.CreationData;
-import org.eclipse.jst.pagedesigner.itemcreation.ITagCreator;
-import org.eclipse.jst.pagedesigner.itemcreation.internal.TagCreationFactory;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class CommandUtil
-{
-    private static final Logger _log = PDPlugin.getLogger(CommandUtil.class);
-
-    /**
-     * @param dropSourceData
-     * @param model
-     * @param domPosition
-     * @param customizationData
-     * @return the element inserted or null if failed
-     */
-    public static Element executeInsertion(
-            final IDropSourceData dropSourceData, final IDOMModel model,
-            final IDOMPosition domPosition, final IAdaptable customizationData)
-    {
-        try
-        {
-            final ITaglibDomainMetaDataModelContext modelContext = getMetadataContext(
-                    dropSourceData.getNamespace(), model);
-
-            ITagDropSourceData tagDropSourceData = null;
-
-            if (dropSourceData instanceof ITagDropSourceData)
-            {
-                tagDropSourceData = (ITagDropSourceData) dropSourceData;
-            } else if (customizationData != null)
-            {
-                tagDropSourceData = (ITagDropSourceData) customizationData
-                        .getAdapter(ITagDropSourceData.class);
-            }
-
-            if (tagDropSourceData == null)
-            {
-                PDPlugin
-                        .log(
-                                "Could not down cast dropSourceData to tagDropSourceData", new Exception("for stack trace only")); //$NON-NLS-1$//$NON-NLS-2$
-            }
-
-            // TODO: note that the constructor currently causes the prefix defn
-            // to be added to the target doc. This should be moved into
-            // an ensure method in the AbstractTagCreator
-            final CreationData creationData = new CreationData(
-                    tagDropSourceData, model, domPosition, modelContext,
-                    customizationData);
-
-            final ITagCreator tagCreator = TagCreationFactory.getInstance()
-                    .createTagCreator(creationData.getTagId());
-
-            if (tagCreator == null)
-            {
-                return null;// should never get here!
-            }
-
-            return tagCreator.createTag(creationData);
-        } catch (Exception e)
-        {
-            _log
-                    .error(
-                            "Problem creating tag " + dropSourceData.getId() + " at:" + domPosition + "\n", e); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-        }
-        return null;
-    }
-
-    /**
-     * @param uri
-     * @param model
-     * @return the metadata context for uri in the DOM model or null if none.
-     */
-    public static ITaglibDomainMetaDataModelContext getMetadataContext(
-            final String uri, final IDOMModel model)
-    {
-        final IStructuredDocument doc = model.getDocument()
-                .getStructuredDocument();
-
-        final IStructuredDocumentContext context = IStructuredDocumentContextFactory.INSTANCE
-                .getContext(doc, -1);
-        final IWorkspaceContextResolver resolver = IStructuredDocumentContextResolverFactory.INSTANCE
-                .getWorkspaceContextResolver(context);
-
-        final IProject project = resolver.getProject();
-
-        final ITaglibDomainMetaDataModelContext modelContext = TaglibDomainMetaDataQueryHelper
-                .createMetaDataModelContext(project, uri);
-        return modelContext;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/DOMUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/DOMUtil.java
deleted file mode 100644
index 196a87c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/DOMUtil.java
+++ /dev/null
@@ -1,260 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.utils;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.wst.xml.core.internal.document.ElementImpl;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.NamedNodeMap;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.w3c.dom.Text;
-
-/**
- * @author mengbo
- */
-public class DOMUtil {
-	/**
-	 * @param parent
-	 * @param tag
-	 * @return the list of child elements  of parent that are Elements
-	 * and that have name 'tag' ignoring case
-	 */
-	public static List getChildElementsByTagIgnoreCase(Element parent,
-			String tag) {
-		List ret = new ArrayList();
-		NodeList nodeList = parent.getChildNodes();
-		for (int i = 0, size = nodeList.getLength(); i < size; i++) {
-			Node node = nodeList.item(i);
-			if (node.getNodeType() == Node.ELEMENT_NODE) {
-				String t = node.getNodeName();
-				if (tag.equalsIgnoreCase(t)) {
-					ret.add(node);
-				}
-			}
-		}
-		return ret;
-	}
-
-	/**
-	 * @param ele
-	 * @return the element value of the TEXT_NODE children of element
-	 * concat'd together
-	 */
-	public static String getTextElementValue(Element ele) {
-		StringBuffer buffer = new StringBuffer();
-		Node node = ele.getFirstChild();
-		while (node != null) {
-			if (node.getNodeType() == Node.TEXT_NODE) {
-				buffer.append(node.getNodeValue());
-			} else if (node.getNodeType() == Node.CDATA_SECTION_NODE) {
-				buffer.append(node.getNodeValue());
-			}
-			node = node.getNextSibling();
-		}
-		return buffer.toString();
-	}
-
-	/**
-	 * @param element
-	 * @param string
-	 * @return the attribute named string on element ignoring case in the comparison
-	 * or null if not found
-	 */
-	public static String getAttributeIgnoreCase(Element element, String string) {
-		NamedNodeMap map = element.getAttributes();
-		for (int i = 0; i < map.getLength(); i++) {
-			Node attr = map.item(i);
-			if (string.equalsIgnoreCase(attr.getNodeName())) {
-				return attr.getNodeValue();
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * @param parent
-	 * @param tags
-	 * @return the list of children of parent with name in tags ignoring case
-	 */
-	public static List getChildrenByTagsIgnoreCase(Element parent, String[] tags) {
-		List result = new ArrayList();
-		NodeList nodeList = parent.getChildNodes();
-		for (int i = 0, size = nodeList.getLength(); i < size; i++) {
-			Node node = nodeList.item(i);
-			if (node.getNodeType() == Node.ELEMENT_NODE) {
-				String t = node.getNodeName();
-				for (int k = 0; k < tags.length; k++) {
-					if (tags[k].equalsIgnoreCase(t)) {
-						result.add(node);
-						break;
-					}
-				}
-			}
-		}
-		return result;
-	}
-
-	/**
-	 * @param ele
-	 */
-	public static void removeAllChildren(Element ele) {
-		((ElementImpl) ele).removeChildNodes();
-	}
-
-	/**
-	 * @param ele
-	 * @param value
-	 */
-	public static void setTextElementValue(Element ele, String value) {
-		removeAllChildren(ele);
-		Text txt = ele.getOwnerDocument().createTextNode(value);
-		ele.appendChild(txt);
-	}
-
-	/**
-	 * @param ele 
-	 * @param attr 
-	 * @param defaultvalue 
-	 * @return the integer attribute of ele called attr.  Default value
-	 * is returned if the attribute is not found.
-	 */
-	public static int getIntAttributeIgnoreCase(Element ele, String attr,
-			int defaultvalue) {
-		if (ele == null) {
-			return defaultvalue;
-		}
-		String attrvalue = getAttributeIgnoreCase(ele, attr);
-		if (attrvalue == null) {
-			return defaultvalue;
-		}
-        try {
-        	return Integer.parseInt(attrvalue);
-        } catch (NumberFormatException  ex) {
-        	return defaultvalue;
-        }
-	}
-
-	/**
-	 * get all child elements
-	 * 
-	 * @param ele
-	 * @return the list of element children of type ELEMENT_NODE
-	 */
-	public static List getElementChildren(Element ele) {
-		List ret = new ArrayList();
-		NodeList nodeList = ele.getChildNodes();
-		for (int i = 0, size = nodeList.getLength(); i < size; i++) {
-			Node node = nodeList.item(i);
-			if (node.getNodeType() == Node.ELEMENT_NODE) {
-				ret.add(node);
-			}
-		}
-		return ret;
-	}
-
-	/**
-	 * judge whether element has an attribute named attrName
-	 * 
-	 * @param ele
-	 * @param attrName
-	 * @return true if element has attribute called attrName ignoring
-	 * case  in the comparison.
-	 */
-	public static boolean hasAttribute(Element ele, String attrName) {
-		NamedNodeMap map = ele.getAttributes();
-		for (int i = 0; i < map.getLength(); i++) {
-			Node attr = map.item(i);
-			if (attr.getNodeName().equalsIgnoreCase(attrName)) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * @param node
-	 * @param sb
-	 */
-	public static void nodeToString(Node node, StringBuffer sb) {
-		int type = node.getNodeType();
-		switch (type) {
-		case Node.DOCUMENT_NODE:
-			sb.append("<?xml version=\"1.0\" ?>"); //$NON-NLS-1$
-			nodeToString(((Document) node).getDocumentElement(), sb);
-			break;
-
-		case Node.ELEMENT_NODE:
-			sb.append("<"); //$NON-NLS-1$
-			sb.append(node.getNodeName());
-			NamedNodeMap attrs = node.getAttributes();
-			for (int i = 0; i < attrs.getLength(); i++) {
-				Node attr = attrs.item(i);
-				sb.append(" " + attr.getNodeName() + "=\"" //$NON-NLS-1$ //$NON-NLS-2$
-						+ attr.getNodeValue() + "\""); //$NON-NLS-1$
-			}
-
-			NodeList children = node.getChildNodes();
-			if (children != null) {
-				int len = children.getLength();
-				if (len != 0) {
-					sb.append(">"); //$NON-NLS-1$
-				}
-				for (int i = 0; i < len; i++) {
-					nodeToString(children.item(i), sb);
-				}
-			}
-			break;
-
-		case Node.ENTITY_REFERENCE_NODE:
-			sb.append("&"); //$NON-NLS-1$
-			sb.append(node.getNodeName());
-			sb.append(";"); //$NON-NLS-1$
-			break;
-
-		case Node.CDATA_SECTION_NODE:
-			sb.append("<![CDATA["); //$NON-NLS-1$
-			sb.append(node.getNodeValue());
-			sb.append("]]>"); //$NON-NLS-1$
-			break;
-
-		case Node.TEXT_NODE:
-			sb.append(node.getNodeValue());
-			break;
-
-		case Node.PROCESSING_INSTRUCTION_NODE:
-			sb.append("<?"); //$NON-NLS-1$
-			sb.append(node.getNodeName());
-			String data = node.getNodeValue();
-			{
-				sb.append(" "); //$NON-NLS-1$
-				sb.append(data);
-			}
-			sb.append("?>"); //$NON-NLS-1$
-			break;
-		}
-
-		if (type == Node.ELEMENT_NODE) {
-			if (node.getFirstChild() != null) {
-				sb.append("</"); //$NON-NLS-1$
-				sb.append(node.getNodeName());
-				sb.append(">"); //$NON-NLS-1$
-			} else {
-				sb.append("/>"); //$NON-NLS-1$
-			}
-
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/EditorUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/EditorUtil.java
deleted file mode 100644
index bfffd3c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/EditorUtil.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2009 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.utils;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.QualifiedName;
-import org.eclipse.jst.pagedesigner.editors.HTMLEditor;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IEditorReference;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.ide.ResourceUtil;
-import org.eclipse.ui.internal.Workbench;
-
-/**
- * Utility class for Editor related information.
- * <br>
- * <p><b>Provisional API - subject to change</b></p>
- */
-public class EditorUtil {
-
-	private static final String PROPERTY_QUALIFIER = "org.eclipse.jst.pagedesigner"; //$NON-NLS-1$
-    private static final String PERSIST_PROPERTY_NAME_DESIGNER_MODE = "DesignMode";  //$NON-NLS-1$
-    private static final QualifiedName PERSIST_PROPERTY_KEY_DESIGNER_MODE = 
-    	new QualifiedName(PROPERTY_QUALIFIER, PERSIST_PROPERTY_NAME_DESIGNER_MODE);
-
-	/**
-	 * Find the design mode property for the file resource of the
-	 * editor input. If found, then return the property value,
-	 * otherwise return null. 
-	 * 
-	 * @param editorInput
-	 * @return user selected design mode for the editor input file
-	 */
-	public static String getEditorInputDesignModeProperty(IEditorInput editorInput) {
-		String dmProperty = null;
-		if (editorInput != null) {
-			IResource res = ResourceUtil.getResource(editorInput);
-			if (res != null) {
-				try {
-					dmProperty = res.getPersistentProperty(PERSIST_PROPERTY_KEY_DESIGNER_MODE);
-				} catch (CoreException e) {
-					// do nothing;
-				}
-			}
-		}
-
-		return dmProperty;
-	}
-
-	/**
-	 * Save the design mode property for the file resource of the
-	 * editor input. If the supplied mode is <code>null</code>,
-	 * the persistent property is removed from this resource. 
-	 * 
-	 * @param editorInput
-	 * @param mode user selected design mode to be saved
-	 */
-	public static void setEditorInputDesignModeProperty(IEditorInput editorInput, String mode) {
-		if (editorInput != null) {
-			IResource res = ResourceUtil.getResource(editorInput);
-			if (res != null) {
-				try {
-					res.setPersistentProperty(PERSIST_PROPERTY_KEY_DESIGNER_MODE, mode);
-				} catch (CoreException e) {
-					// do nothing;
-				}
-			}
-		}
-	}
-
-	/**
-	 * Calls <code>refreshDesignViewer()</code> on all open HTMLEditor
-	 * (Web Page Editor) instances.
-	 */
-	public static void refreshAllWPEDesignViewers() {
-		IWorkbenchWindow window = Workbench.getInstance().getActiveWorkbenchWindow();
-		if (window != null) {
-			IWorkbenchPage page = window.getActivePage();
-			if (page != null) {
-				IEditorReference[] editorRefs = page.getEditorReferences();
-				for (IEditorReference editorRef: editorRefs) {
-					IEditorPart editorPart = editorRef.getEditor(false);
-					if (editorPart instanceof HTMLEditor) {
-						((HTMLEditor)editorPart).refreshDesignViewer();
-					}
-				}
-			}
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/EntityMap.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/EntityMap.java
deleted file mode 100644
index 0b68bad..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/EntityMap.java
+++ /dev/null
@@ -1,212 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.utils;
-
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-
-/**
- * @author mengbo
- */
-public class EntityMap {
-	private static Logger _log = PDPlugin.getLogger(EntityMap.class);
-
-	/**
-	 * @param s
-	 * @return s translated for HTML entities.
-	 */
-	public static String translate(String s) {
-		char[] array = s.toCharArray();
-		StringBuffer buffer = new StringBuffer();
-		int posi = 0;
-		int len = array.length;
-		while (posi < len) {
-			if (array[posi] != '&') {
-				buffer.append(replaceBadEntity(array[posi++]));
-				continue;
-			}
-
-			// now array[posi] == '&'
-			int lastPosi = posi;
-			posi++;
-			if (posi < len && array[posi] == '#') {
-				posi++;
-			}
-			while (posi < len) {
-				if (!Character.isLetterOrDigit(array[posi]))
-                {
-					break;
-                }
-				posi++;
-			}
-			// now posi>=array.length or array[posi] is non letter or digit
-			String str = new String(array, lastPosi, posi - lastPosi);
-			if (translateEntity(str, buffer)) {
-				// translated, skip the ';'
-				if (posi < len && array[posi] == ';') {
-					posi++;
-				}
-			}
-
-			if (posi == len) {
-				return buffer.toString();
-			}
-		}
-		return buffer.toString();
-	}
-
-	/**
-	 * Translate entity maps and compact whitespace. For heading and training
-	 * space, will not trim, only compact (making multiple whitespace to become
-	 * a single ' ' char).
-	 * @param s 
-	 * @return the result string.
-	 */
-	public static String translateAndCompact(String s) {
-		char[] array = s.toCharArray();
-		StringBuffer buffer = new StringBuffer();
-		int posi = 0;
-		int len = array.length;
-		while (posi < len) {
-			if (HTMLUtil.isHTMLWhitespace(array[posi])) {
-				while (++posi < len && HTMLUtil.isHTMLWhitespace(array[posi]))
-                {
-                    // no body
-                    // loop until we have find non-whitepspace or endof array
-                }
-
-                buffer.append(' ');
-				continue;
-			}
-			if (array[posi] != '&') {
-				buffer.append(replaceBadEntity(array[posi++]));
-				continue;
-			}
-
-			// now array[posi] == '&'
-			int lastPosi = posi;
-			posi++;
-			if (posi < len && array[posi] == '#') {
-				posi++;
-			}
-			while (posi < len) {
-				if (!Character.isLetterOrDigit(array[posi])) {
-					break;
-				}
-                posi++;
-			}
-			// now posi>=array.length or array[posi] is non letter or digit
-			String str = new String(array, lastPosi, posi - lastPosi);
-
-			if (translateEntity(str, buffer)) {
-				// translated, skip the ';'
-				if (posi < len && array[posi] == ';') {
-					posi++;
-				}
-			}
-
-			if (posi == len) {
-				return buffer.toString();
-			}
-		}
-		return buffer.toString();
-	}
-
-	/**
-	 * if can translate will return true and append the result string if can't
-	 * translate will return false and append original string
-	 * 
-	 * @param s
-	 *            the form &#number or &letterordigit without the trailing ";"
-	 * @param strBuf 
-	 * @return true  the translation can be done
-	 */
-	public static boolean translateEntity(String s, StringBuffer strBuf) {
-		int i = HTMLSpecialCharHelper.getSpecial(s); // HTMLSpecialCharHelper
-		// support without
-		// traning ';'
-		if (i != -1) {
-			strBuf.append((char) i);
-			return true;
-		}
-		if (s.length() > 2 && s.charAt(1) == '#') {
-			String number;
-			number = s.substring(2);
-			try {
-				int n;
-				if (number.length() > 0
-						&& (number.charAt(0) == 'x' || number.charAt(0) == 'X')) {
-					n = Integer.parseInt(number.substring(1), 16);
-				} else {
-					n = Integer.parseInt(number);
-				}
-				strBuf.append(replaceBadEntity((char) n));
-				return true;
-			} catch (Exception ex) {
-				// Error in integer formating
-				_log.info("Error occurred in integer formatting", ex); //$NON-NLS-1$
-				strBuf.append(s);
-				return false;
-			}
-		}
-        strBuf.append(s);
-        return false;
-	}
-
-	/**
-	 * In HTML &#149; is sometimes used (mostly based on CP 1252), but is
-	 * illegal, because it does not exist in Unicode
-	 * 
-	 * @param n
-	 * @return
-	 * see http://www.w3.org/Talks/1999/0830-tutorial-unicode-mjd/slide27-0.html
-	 */
-	private static char replaceBadEntity(char n) {
-		if (n < 132 || n > 156)
-			return n;
-		switch (n) {
-		case 132:
-			return (char) 8222;
-		case 133:
-			return (char) 8230;
-		case 134:
-			return (char) 8224;
-		case 135:
-			return (char) 8225;
-		case 139:
-			return (char) 8249;
-		case 140:
-			return (char) 338;
-		case 145:
-			return (char) 8216;
-		case 146:
-			return (char) 8217;
-		case 147:
-			return (char) 8220;
-		case 148:
-			return (char) 8221;
-		case 149:
-			return (char) 8226;
-		case 151:
-			return (char) 8212;
-		case 153:
-			return (char) 8482;
-		case 155:
-			return (char) 8250;
-		case 156:
-			return (char) 339;
-		default:
-			return n;
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/HTMLSpecialCharHelper.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/HTMLSpecialCharHelper.java
deleted file mode 100644
index d30fcd2..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/HTMLSpecialCharHelper.java
+++ /dev/null
@@ -1,464 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.utils;
-
-import java.io.IOException;
-import java.io.Writer;
-import java.util.Enumeration;
-import java.util.Hashtable;
-
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-
-/**
- * entity map support.
- * 
- * @author mengbo
- */
-public class HTMLSpecialCharHelper {
-	private static Logger _log = PDPlugin
-			.getLogger(HTMLSpecialCharHelper.class);
-
-	private static Hashtable _table;
-
-	private static Hashtable _reverse;
-	static {
-		_table = new Hashtable(256);
-
-		_table.put(Integer.valueOf(34), "&quot;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(38), "&amp;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(60), "&lt;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(62), "&gt;"); //$NON-NLS-1$
-
-		_table.put(Integer.valueOf(160), "&nbsp;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(161), "&iexcl;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(162), "&cent;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(163), "&pound;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(164), "&curren;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(165), "&yen;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(166), "&brvbar;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(167), "&sect;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(168), "&uml;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(169), "&copy;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(170), "&ordf;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(171), "&laquo;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(172), "&not;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(173), "&shy;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(174), "&reg;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(175), "&macr;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(176), "&deg;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(177), "&plusmn;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(178), "&sup2;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(179), "&sup3;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(180), "&acute;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(181), "&micro;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(182), "&para;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(183), "&middot;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(184), "&cedil;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(185), "&sup1;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(186), "&ordm;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(187), "&raquo;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(188), "&frac14;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(189), "&frac12;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(190), "&frac34;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(191), "&iquest;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(192), "&Agrave;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(193), "&Aacute;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(194), "&Acirc;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(195), "&Atilde;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(196), "&Auml;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(197), "&Aring;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(198), "&AElig;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(199), "&Ccedil;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(200), "&Egrave;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(201), "&Eacute;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(202), "&Ecirc;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(203), "&Euml;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(204), "&Igrave;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(205), "&Iacute;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(206), "&Icirc;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(207), "&Iuml;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(208), "&ETH;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(209), "&Ntilde;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(210), "&Ograve;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(211), "&Oacute;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(212), "&Ocirc;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(213), "&Otilde;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(214), "&Ouml;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(215), "&times;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(216), "&Oslash;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(217), "&Ugrave;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(218), "&Uacute;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(219), "&Ucirc;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(220), "&Uuml;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(221), "&Yacute;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(222), "&THORN;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(223), "&szlig;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(224), "&agrave;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(225), "&aacute;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(226), "&acirc;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(227), "&atilde;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(228), "&auml;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(229), "&aring;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(230), "&aelig;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(231), "&ccedil;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(232), "&egrave;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(233), "&eacute;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(234), "&ecirc;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(235), "&euml;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(236), "&igrave;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(237), "&iacute;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(238), "&icirc;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(239), "&iuml;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(240), "&eth;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(241), "&ntilde;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(242), "&ograve;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(243), "&oacute;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(244), "&ocirc;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(245), "&otilde;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(246), "&ouml;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(247), "&divide;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(248), "&oslash;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(249), "&ugrave;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(250), "&uacute;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(251), "&ucirc;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(252), "&uuml;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(253), "&yacute;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(254), "&thorn;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(255), "&yuml;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(402), "&fnof;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(913), "&Alpha;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(914), "&Beta;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(915), "&Gamma;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(916), "&Delta;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(917), "&Epsilon;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(918), "&Zeta;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(919), "&Eta;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(920), "&Theta;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(921), "&Iota;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(922), "&Kappa;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(923), "&Lambda;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(924), "&Mu;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(925), "&Nu;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(926), "&Xi;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(927), "&Omicron;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(928), "&Pi;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(929), "&Rho;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(931), "&Sigma;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(932), "&Tau;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(933), "&Upsilon;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(934), "&Phi;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(935), "&Chi;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(936), "&Psi;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(937), "&Omega;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(945), "&alpha;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(946), "&beta;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(947), "&gamma;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(948), "&delta;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(949), "&epsilon;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(950), "&zeta;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(951), "&eta;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(952), "&theta;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(953), "&iota;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(954), "&kappa;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(955), "&lambda;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(956), "&mu;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(957), "&nu;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(958), "&xi;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(959), "&omicron;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(960), "&pi;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(961), "&rho;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(962), "&sigmaf;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(963), "&sigma;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(964), "&tau;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(965), "&upsilon;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(966), "&phi;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(967), "&chi;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(968), "&psi;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(969), "&omega;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(977), "&thetasym;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(978), "&upsih;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(982), "&piv;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8226), "&bull;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8230), "&hellip;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8242), "&prime;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8243), "&Prime;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8254), "&oline;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8260), "&frasl;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8472), "&weierp;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8465), "&image;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8476), "&real;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8482), "&trade;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8501), "&alefsym;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8592), "&larr;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8593), "&uarr;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8594), "&rarr;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8595), "&darr;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8596), "&harr;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8629), "&crarr;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8656), "&lArr;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8657), "&uArr;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8658), "&rArr;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8659), "&dArr;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8660), "&hArr;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8704), "&forall;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8706), "&part;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8707), "&exist;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8709), "&empty;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8711), "&nabla;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8712), "&isin;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8713), "&notin;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8715), "&ni;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8719), "&prod;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8722), "&sum;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8722), "&minus;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8727), "&lowast;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8730), "&radic;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8733), "&prop;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8734), "&infin;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8736), "&ang;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8869), "&and;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8870), "&or;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8745), "&cap;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8746), "&cup;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8747), "&int;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8756), "&there4;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8764), "&sim;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8773), "&cong;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8773), "&asymp;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8800), "&ne;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8801), "&equiv;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8804), "&le;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8805), "&ge;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8834), "&sub;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8835), "&sup;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8836), "&nsub;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8838), "&sube;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8839), "&supe;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8853), "&oplus;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8855), "&otimes;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8869), "&perp;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8901), "&sdot;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8968), "&lceil;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8969), "&rceil;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8970), "&lfloor;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8971), "&rfloor;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(9001), "&lang;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(9002), "&rang;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(9674), "&loz;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(9824), "&spades;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(9827), "&clubs;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(9829), "&hearts;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(9830), "&diams;"); //$NON-NLS-1$
-
-		_table.put(Integer.valueOf(338), "&OElig;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(339), "&oelig;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(352), "&Scaron;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(353), "&scaron;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(376), "&Yuml;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(710), "&circ;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(732), "&tilde;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8194), "&ensp;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8195), "&emsp;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8201), "&thinsp;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8204), "&zwnj;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8205), "&zwj;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8206), "&lrm;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8207), "&rlm;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8211), "&ndash;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(151), "&mdash;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8216), "&lsquo;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8217), "&rsquo;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8218), "&sbquo;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8220), "&ldquo;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8221), "&rdquo;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8222), "&bdquo;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8224), "&dagger;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8225), "&Dagger;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8240), "&permil;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8249), "&lsaquo;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8250), "&rsaquo;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8364), "&euro;"); //$NON-NLS-1$
-
-		_reverse = new Hashtable(256);
-		for (Enumeration e = _table.keys(); e.hasMoreElements();) {
-			Object key = e.nextElement();
-			String value = (String) _table.get(key);
-			_reverse.put(value, key);
-			// also support without the training ';'
-			_reverse.put(value.substring(0, value.length() - 1), key);
-		}
-	}
-
-	/**
-	 * @param ch 
-	 * @return if not in the special list
-	 */
-	public static String getSpecial(int ch) {
-		return (String) _table.get(Integer.valueOf(ch));
-	}
-
-	/**
-	 * @param str
-	 * @return the code value corresponding to the string or null
-	 * if string is unknown
-	 */
-	public static int getSpecial(String str) {
-		Integer result = (Integer) _reverse.get(str);
-		if (result == null) {
-			return -1;
-		}
-        return result.intValue();
-	}
-
-	/**
-	 * @param str
-	 * @param start
-	 * @param end
-	 * @param writer
-	 * @throws IOException
-	 */
-	public static void encode(String str, int start, int end, Writer writer)
-			throws IOException {
-		for (int i = start; i < end; i++) {
-			char ch = str.charAt(i);
-			String special = getSpecial(ch);
-			if (special != null) {
-				writer.write(special);
-			} else {
-				if ((ch & 0xff) != 0) {
-					writer.write("&#"); //$NON-NLS-1$
-					writer.write(Integer.toString(ch));
-					writer.write(";"); //$NON-NLS-1$
-				} else {
-					writer.write(ch);
-				}
-			}
-		}
-	}
-
-	/**
-	 * @param str
-	 * @param result
-	 * @return the encoded string buffer
-	 */
-	public static StringBuffer encode(String str, StringBuffer result) {
-		return encode(str, 0, str.length(), result);
-	}
-
-	/**
-	 * @param str
-	 * @param start
-	 * @param end
-	 * @param result
-	 * @return the encoded string buffer
-	 */
-	public static StringBuffer encode(String str, int start, int end,
-			StringBuffer result) {
-		for (int i = start; i < end; i++) {
-			char ch = str.charAt(i);
-			String special = getSpecial(ch);
-			if (special != null) {
-				result.append(special);
-			} else {
-				if ((ch & 0xff00) != 0) {
-					result.append("&#"); //$NON-NLS-1$
-					result.append(Integer.toString(ch));
-					result.append(";"); //$NON-NLS-1$
-				} else {
-					result.append(ch);
-				}
-			}
-		}
-		return result;
-	}
-
-	/**
-	 * @param str
-	 * @param buffer
-	 * @return the decoded string buffer
-	 * @throws RuntimeException
-	 */
-	public static StringBuffer decode(String str, StringBuffer buffer)
-			throws RuntimeException {
-		return decode(str, 0, str.length(), buffer);
-	}
-
-	/**
-	 * @param str
-	 * @param start
-	 * @param end
-	 * @param buffer
-	 * @return the decoded string buffer
-	 * @throws RuntimeException
-	 */
-	public static StringBuffer decode(String str, int start, int end,
-			StringBuffer buffer) throws RuntimeException {
-		int pos = start;
-		do {
-			char ch = str.charAt(pos);
-			if (ch == '&') {
-				int stop = str.indexOf(';', pos + 1);
-				if (stop < 0 || stop >= end) {
-					_log.error("HTMLSpecialCharHelper.3"); //$NON-NLS-1$
-					throw new RuntimeException("HTMLSpecialCharHelper.2"); //$NON-NLS-1$
-				}
-				String sp = str.substring(pos, stop + 1);
-				int special = getSpecial(sp);
-				if (special != -1) {
-					buffer.append((char) special);
-				} else {
-					ch = sp.charAt(1);
-					if (ch != '#')
-						throw new RuntimeException("HTMLSpecialCharHelper.1"); //$NON-NLS-1$
-					try {
-						buffer.append((char) Integer.parseInt(sp.substring(2,
-								sp.length() - 1)));
-					} catch (NumberFormatException ex) {
-						_log.info("HTMLSpecialCharHelper.0", ex); //$NON-NLS-1$
-						throw new RuntimeException("illegal: " + sp); //$NON-NLS-1$
-					}
-				}
-				pos = stop + 1;
-			} else {
-				buffer.append(ch);
-				pos++;
-			}
-		} while (pos < end);
-		return buffer;
-	}
-
-	/**
-	 * @param entityRef
-	 * @return the code for the decoded entity reference
-	 */
-	public static int decodeEntity(String entityRef) {
-		Integer result = (Integer) _reverse.get(entityRef);
-		if (result != null) {
-			return result.intValue();
-		}
-		if (entityRef.length() >= 2 && entityRef.charAt(1) == '#') {
-			String s = entityRef.substring(2);
-			if (s.endsWith(";")) { //$NON-NLS-1$
-				s = s.substring(0, s.length() - 1);
-			}
-			try {
-				return Integer.parseInt(s);
-			} catch (Exception ex) {
-				// ignore
-			}
-		}
-		return -1;
-	}
-}
-
-// FIXME: will it better to use Character instead of Integer ? (yang)
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/HTMLUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/HTMLUtil.java
deleted file mode 100644
index f189f78..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/HTMLUtil.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.utils;
-
-import java.util.Arrays;
-
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.w3c.dom.Text;
-
-/**
- * @author mengbo
- */
-public class HTMLUtil {
-	/**
-	 * check whether a char is a HTML whitespace.
-	 * 
-	 * @param ch
-	 * @return true if ch is considered to be HTML whitespace
-	 * @see <a href="http://www.w3.org/TR/html4/struct/text.html#h-9.1">white
-	 *      space </a>
-	 */
-	public static boolean isHTMLWhitespace(char ch) {
-		return ch == ' ' || ch == 0x09 || ch == 0x0c || ch == 0x0d
-				|| ch == 0x0a || ch == 0x200b;
-	}
-
-	/**
-	 * @param text
-	 * @return true if the entire string is considered to be HTML whitespace
-	 */
-	public static boolean isHTMLWhitespaceString(String text) {
-		for (int i = 0, size = text.length(); i < size; i++) {
-			if (!isHTMLWhitespace(text.charAt(i))) {
-				return false;
-			}
-		}
-		return true;
-	}
-
-	/**
-	 * the HTML tags considered to be hidden
-	 */
-	static final String[] HiddenTags = new String[] {
-			IHTMLConstants.TAG_APPLET,
-			IHTMLConstants.TAG_AREA,
-			IHTMLConstants.TAG_BASE,
-			IHTMLConstants.TAG_BASEFONT,
-			IHTMLConstants.TAG_HEAD,
-			IHTMLConstants.TAG_IFRAME,
-			IHTMLConstants.TAG_ISINDEX,
-			IHTMLConstants.TAG_LINK,
-			IHTMLConstants.TAG_META,
-			IHTMLConstants.TAG_NOEMBED,
-			IHTMLConstants.TAG_NOFRAMES,
-			IHTMLConstants.TAG_NOSCRIPT,
-			IHTMLConstants.TAG_SCRIPT,
-			IHTMLConstants.TAG_STYLE,
-			IHTMLConstants.TAG_TITLE,
-			IHTMLConstants.TAG_PARAM };
-
-	/**
-	 * @param tag
-	 * @return true if the tag name is not in the list of hidden tags
-	 */
-	public static boolean isVisualHtmlElement(String tag) {
-		return !Arrays.asList(HiddenTags).contains(tag.toLowerCase());
-	}
-
-	/**
-	 * Handling white space. Basically, for leading and trailing whitespace,
-	 * will handle according whether the text is just after tag start or before
-	 * tag close.
-	 * <p>
-	 * For consequent whitespace, will compact them.
-	 * @param textNode 
-	 * @param s 
-	 * @return the compacted string
-	 * see http://www.w3.org/TR/html4/struct/text.html#h-9.1
-	 */
-	// XXX: currently, the whitespace handling is in this class, in the future
-	// may consider move it
-	// into lower layer (display/CSS layer)
-	public static String compactWhitespaces(Text textNode, String s) {
-		char[] array = s.toCharArray();
-		StringBuffer buffer = new StringBuffer(array.length);
-		int posi = 0;
-		int len = array.length;
-
-		while (posi < len) {
-			if (HTMLUtil.isHTMLWhitespace(array[posi])) {
-				while (++posi < len && HTMLUtil.isHTMLWhitespace(array[posi]))
-                {
-                    // no body
-                    // loop until we have find non-whitepspace or endof array
-                }
-
-				buffer.append(' ');
-				continue;
-			}
-			buffer.append(array[posi++]);
-			continue;
-		}
-		return buffer.toString();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/ICacheEntryCreator.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/ICacheEntryCreator.java
deleted file mode 100644
index a63faee..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/ICacheEntryCreator.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.utils;
-
-/**
- * Identifies a factory/dispose advisor for cache entries
- * @param <KEY> 
- * @param <ENTRY> 
- */
-public interface ICacheEntryCreator<KEY,ENTRY> {
-	/**
-	 * @param key
-	 * @return the created entry
-	 */
-	public ENTRY createEntry(KEY key);
-
-	/**
-	 * @param key
-	 * @param entry
-	 */
-	public void dispose(KEY key, ENTRY entry);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/ImageResolver.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/ImageResolver.java
deleted file mode 100644
index 1fd8672..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/ImageResolver.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.utils;
-
-import java.io.UnsupportedEncodingException;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.net.URLDecoder;
-
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.swt.SWTException;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.wst.sse.core.internal.util.URIResolver;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ImageResolver {
-	/**
-	 * 
-	 * @param element
-	 * @param attrName
-	 * @return
-	 */
-	static String getResolvedURL(Element element, String attrName) {
-		URIResolver resolver = null;
-		if (element instanceof IDOMNode) {
-			resolver = ((IDOMNode) element).getModel().getResolver();
-		}
-		if (null == resolver) {
-			return null;
-		}
-		String src = DOMUtil.getAttributeIgnoreCase(element, attrName);
-		if (src != null && src.length() > 0) {
-			return resolver.getLocationByURI(src);
-		}
-		return null;
-	}
-
-	/**
-	 * given the element and an attribute name identifying the src of the image,
-	 * create a image.
-	 * 
-	 * @param element
-	 * @param attrName
-	 * @return the new image
-	 */
-	public static Image initializeImage(Element element, String attrName) {
-		String url = getResolvedURL(element, attrName);
-		if (url == null) {
-			return null;
-		}
-		//Bug 307801 - [WPE] WPE does not render Images with URL encoding in their path in the preview pane
-		try {
-			url = URLDecoder.decode(url, "UTF-8"); //$NON-NLS-1$
-		} catch(UnsupportedEncodingException uee) {
-			//we tried to decode using recommended encoding, we failed
-		} catch(IllegalArgumentException iae) {
-			//we tried to decode using recommended encoding, we failed
-		}
-		Image img = null;
-		int colonIndex = url.indexOf(":"); //$NON-NLS-1$
-		int slashIndex = url.indexOf("/"); //$NON-NLS-1$
-		if (colonIndex != -1 && (slashIndex != -1 && colonIndex < slashIndex)) {
-			//the url seems to have a protocol, so try to load it as a URL
-			try {
-				URL urlObj = new URL(url);
-				ImageDescriptor imgDesc = ImageDescriptor.createFromURL(urlObj);
-				img = imgDesc.createImage(false);
-			} catch(MalformedURLException mfe) {
-				//attempt to load as a file
-				try {
-					img = new Image(null, url);
-				} catch(SWTException se) {
-					//img remains null on return
-				}
-			} catch(SWTException se) {
-				//img remains null on return
-			}
-		} else {
-			//no protocol, so load it as a file
-			try {
-				img = new Image(null, url);
-			} catch(SWTException se) {
-				//img remains null on return
-			}
-		}
-		return img;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/IntFlexArray.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/IntFlexArray.java
deleted file mode 100644
index 4c50dcf..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/IntFlexArray.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.utils;
-
-/**
- * Flexible int array. You can set/get of any index value. The array size will
- * be automatically adjusted.
- * 
- * @author mengbo
- */
-public class IntFlexArray {
-	int[] array;
-
-	int size = 0;
-
-	/**
-	 * Create a new flex array with default capacity
-	 */
-	public IntFlexArray() {
-		this(10);
-	}
-
-	/**
-	 * @param initCapacity
-	 */
-	public IntFlexArray(int initCapacity) {
-		if (initCapacity <= 0)
-			initCapacity = 10;
-		array = new int[initCapacity];
-	}
-
-	/**
-	 * @param idx
-	 * @param obj
-	 */
-	public void setAt(int idx, int obj) {
-		ensureCapacity(idx + 1);
-		array[idx] = obj;
-		if (idx + 1 > size)
-			size = idx + 1;
-	}
-
-	/**
-	 * @param idx
-	 * @return the value at idx or 0 if idx is out of bounds
-	 */
-	public int getAt(int idx) {
-		if (idx < array.length)
-			return array[idx];
-        return 0;
-	}
-
-	/**
-	 * @return the current size of the array
-	 */
-	public int getSize() {
-		return size;
-	}
-
-	private void ensureCapacity(int size1) {
-		if (size1 <= array.length)
-			return;
-		int[] temp = array;
-		array = new int[2 * temp.length];
-		System.arraycopy(temp, 0, array, 0, temp.length);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/JSPUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/JSPUtil.java
deleted file mode 100644
index 0b7f587..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/JSPUtil.java
+++ /dev/null
@@ -1,346 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.utils;
-
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.content.IContentType;
-import org.eclipse.core.runtime.content.IContentTypeManager;
-import org.eclipse.jst.jsf.common.metadata.Trait;
-import org.eclipse.jst.jsf.common.metadata.internal.TraitValueHelper;
-import org.eclipse.jst.jsf.common.metadata.query.ITaglibDomainMetaDataModelContext;
-import org.eclipse.jst.jsf.common.metadata.query.TaglibDomainMetaDataQueryHelper;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IStructuredDocumentContextResolverFactory;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IWorkspaceContextResolver;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContextFactory;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.jsp.core.internal.contentmodel.TaglibController;
-import org.eclipse.jst.jsp.core.internal.contentmodel.tld.TLDCMDocumentManager;
-import org.eclipse.jst.jsp.core.internal.contentmodel.tld.TaglibTracker;
-import org.eclipse.jst.jsp.core.internal.contentmodel.tld.provisional.TLDDocument;
-import org.eclipse.jst.jsp.core.taglib.TaglibIndex;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.jsp.core.IJSPCoreConstants;
-import org.eclipse.wst.html.core.internal.format.HTMLFormatProcessorImpl;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMDocument;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.w3c.dom.Attr;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.NamedNodeMap;
-import org.w3c.dom.Node;
-
-/**
- * utility class for JSP related information.
- * 
- * @author mengbo
- */
-public class JSPUtil {
-	
-	/**
-	 * JSP source contenttype
-	 */
-	public static final IContentType JSP_CONTENTTYPE = Platform.getContentTypeManager().getContentType("org.eclipse.jst.jsp.core.jspsource"); //$NON-NLS-1$
-	/**
-	 * find out whether the specified taglib has been defined in the IDOMModel.
-	 * If found, then return the prefix. If can't find, then will try to add a
-	 * taglib declaration into the model, and try to use the specified default
-	 * prefix
-	 * 
-	 * @param model
-	 * @param uri
-	 * @param defaultPrefix 
-	 * @return prefix
-	 */
-	public static String getOrCreatePrefix(IDOMModel model, String uri,
-			String defaultPrefix) {
-		return getOrCreatePrefix(model, uri, defaultPrefix, null);
-	}
-
-	/**
-	 * 
-	 * @param model
-	 * @param uri
-	 * @param defaultPrefix
-	 * @param nodes
-	 *            if a taglib node is created, then the created tag lib node is
-	 *            returned in this.  In the case of xml format, it is the attribute node on
-	 *            jsp:root
-	 * @return prefix
-	 */
-	public static String getOrCreatePrefix(IDOMModel model, String uri,
-			String defaultPrefix, Node[] nodes) {
-	
-		String prefix = getPrefix(model, uri);
-		if (prefix != null) {
-			return prefix;
-		}
-
-		prefix = findUnusedPrefix(model, defaultPrefix);
-
-		//need proper API to determine xml type... this may need to change in future
-		if (! model.getDocument().isXMLType()){
-			// TODO: should create the taglib inside the IDOMModel
-			//this is virtually the same as createTaglibDeclaration... fix me
-			Node[] ref = new Node[1];
-			BodyHelper.findHeaderInsertPosition(ITLDConstants.URI_JSP, "taglib", //$NON-NLS-1$
-					model.getDocument(), ref);
-			
-			Element ele = model.getDocument().createElement("jsp:directive.taglib"); //$NON-NLS-1$
-			((IDOMElement) ele).setJSPTag(true);
-			if (isTagDir(uri, model)) {
-				ele.setAttribute(IJSPCoreConstants.ATTR_TAGDIR, uri);
-			}
-			else {
-				ele.setAttribute(IJSPCoreConstants.ATTR_URI, uri);
-			}
-			ele.setAttribute(ICSSPropertyID.ATTR_PREFIX, prefix);
-			if (nodes != null && nodes.length > 0) {
-				nodes[0] = ele;
-			}
-			model.getDocument().insertBefore(ele, ref[0]);
-			new HTMLFormatProcessorImpl().formatNode(ele);
-		}
-		else {//xml format
-			//find root element
-			boolean tldRefExists = false;
-			Element root = getRootElement(model);
-			if (root != null){				
-				NamedNodeMap attrs = root.getAttributes();
-				for (int i=0;i<attrs.getLength();i++){
-					Attr a = (Attr)attrs.item(i);
-					//is the taglib uri already declared?
-					if (a.getValue().equals(uri)){
-						tldRefExists = true;
-						break;
-					}
-				}
-				if (!tldRefExists){
-					//create attribute
-					Attr a = model.getDocument().createAttribute("xmlns:"+prefix); //$NON-NLS-1$
-					a.setValue(uri);
-					root.setAttributeNode(a);
-					new HTMLFormatProcessorImpl().formatNode(root);
-					
-					//duplicating what non-xml case does... no callerd making use of this currently
-					if (nodes != null && nodes.length > 0) {
-						nodes[0] = a;
-					}
-				}
-			}				
-		}
-		return prefix;
-	}
-
-	private static boolean isTagDir(String uri, IDOMModel model) {
-		IStructuredDocumentContext context = IStructuredDocumentContextFactory.INSTANCE.getContext(model.getStructuredDocument(), 0);
-		if (context != null) {
-			IWorkspaceContextResolver resolver = IStructuredDocumentContextResolverFactory.INSTANCE.getWorkspaceContextResolver(context);
-			if (resolver != null) {
-				ITaglibDomainMetaDataModelContext tldContext = TaglibDomainMetaDataQueryHelper.createMetaDataModelContext(resolver.getProject(), uri);
-				Trait t = TaglibDomainMetaDataQueryHelper.getTrait(tldContext, "", "isTagDir"); //$NON-NLS-1$ //$NON-NLS-2$		
-				return TraitValueHelper.getValueAsBoolean(t);
-			}
-		}
-		return false;
-	}
-
-	private static Element getRootElement(IDOMModel model) {
-		Document docNode = EditModelQuery.getDocumentNode(model.getDocument());
-		return docNode.getDocumentElement();
-	}
-
-	/**
-	 * Return prefix for taglib if declared in jsp file
-	 * @param model
-	 * @param uri
-	 * @return null means this is tld is not declared in the jsp file
-	 */
-	public static String getPrefix(IDOMModel model, String uri) {
-		TLDCMDocumentManager m = TaglibController.getTLDCMDocumentManager(model
-				.getStructuredDocument());
-		if (m == null) {
-		    // if the doc manager has nothing but the type is XML,
-		    // then see if the prefix is encoded as a namespace in
-		    // the doc root
-		    if (model.getDocument().isXMLType())
-		    {
-		        Element root = getRootElement(model);
-	            if (root != null){              
-	                NamedNodeMap attrs = root.getAttributes();
-	                for (int i=0;i<attrs.getLength();i++){
-	                    Attr a = (Attr)attrs.item(i);
-	                    //is the taglib uri already declared?
-	                    if (a.getValue().equals(uri)
-	                            && a.getName().startsWith("xmlns:")) //$NON-NLS-1$
-	                    {
-	                        String prefix =  a.getNodeName().substring("xmlns:".length()); //$NON-NLS-1$
-	                        
-	                        if ("".equals(prefix)) //$NON-NLS-1$
-	                        {
-	                            prefix = null;
-	                        }
-	                        return prefix;
-	                    }
-	                }
-	            }
-		    }
-			return null;
-		}
-		List trackers = m.getTaglibTrackers();
-		for (Iterator iter = trackers.iterator(); iter.hasNext();) {
-			TaglibTracker tracker = (TaglibTracker) iter.next();
-			if (uri.equals(tracker.getURI())) {
-				return tracker.getPrefix();
-			}
-            CMDocument cmdoc = tracker.getDocument();
-            if (cmdoc instanceof TLDDocument
-            		&& uri.equals(((TLDDocument) cmdoc).getUri())) {
-            	return tracker.getPrefix();
-            }
-		}
-		return null;
-	}
-
-	/**
-	 * create specified taglib declaration as jsp directive element
-	 * 
-	 * @param model
-	 * @param uri
-	 * @param prefix
-	 * @return Element
-	 */
-	public static Element createTaglibDeclaration(IDOMModel model, String uri,
-			String prefix) {
-		
-		//seemingly unused - 5/6/09
-		Node[] ref = new Node[1];
-		BodyHelper.findHeaderInsertPosition(ITLDConstants.URI_JSP, "taglib", //$NON-NLS-1$
-				model.getDocument(), ref);
-		Element ele = model.getDocument().createElement("jsp:directive.taglib"); //$NON-NLS-1$
-		((IDOMElement) ele).setJSPTag(true);
-		if (isTagDir(uri, model)) {
-			ele.setAttribute(IJSPCoreConstants.ATTR_TAGDIR, uri);
-		}
-		else {
-			ele.setAttribute(IJSPCoreConstants.ATTR_URI, uri);
-		}
-		ele.setAttribute("prefix", prefix); //$NON-NLS-1$
-		model.getDocument().insertBefore(ele, ref[0]);
-		return ele;
-	}
-
-	/**
-	 * Return prefix to use based upon the suggestion.   
-	 * Appends an integer until unique, if suggestion was used.
-	 * @param model
-	 * @param suggestion
-	 * @return prefix
-	 */
-	public static String findUnusedPrefix(IDOMModel model, String suggestion) {
-		if (suggestion == null) {
-			suggestion = "p"; //$NON-NLS-1$
-		}
-		TLDCMDocumentManager m = TaglibController.getTLDCMDocumentManager(model
-				.getStructuredDocument());
-		if (m == null) {
-			return suggestion;
-		}
-		List trackers = m.getTaglibTrackers();
-		Set map = new HashSet();
-		for (Iterator iter = trackers.iterator(); iter.hasNext();) {
-			TaglibTracker tracker = (TaglibTracker) iter.next();
-			map.add(tracker.getPrefix());
-		}
-		if (!map.contains(suggestion)) {
-			return suggestion;
-		}
-		for (int i = 1;; i++) {
-			if (!map.contains(suggestion + i)) {
-				return suggestion + i;
-			}
-		}
-	}
-
-	/**
-	 * given the prefix, find the corresponding jsp tld URI.
-	 * 
-	 * @param model
-	 * @param prefix
-	 * @return prefix
-	 */
-	public static String findURIForPrefix(IDOMModel model, String prefix) {
-		if (prefix == null || model == null) {
-			return null;
-		}
-		TLDCMDocumentManager m = TaglibController.getTLDCMDocumentManager(model
-				.getStructuredDocument());
-		if (m == null) {
-			return null;
-		}
-		List trackers = m.getTaglibTrackers();
-		for (Iterator iter = trackers.iterator(); iter.hasNext();) {
-			TaglibTracker tracker = (TaglibTracker) iter.next();
-			if (prefix.equals(tracker.getPrefix())) {
-				CMDocument cmdoc = tracker.getDocument();
-				if (cmdoc instanceof TLDDocument) {
-					return ((TLDDocument) cmdoc).getUri();
-				}
-                break; // fall out and return null
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * judge whether the the baseFile belonged project can support uri specified
-	 * tag lib
-	 * 
-	 * @param uri
-	 *            tag lib uri
-	 * @param baseFile
-	 * @return boolean
-	 */
-	public static boolean supportTaglib(String uri, IFile baseFile) {
-		 //IPath location = baseFile.getLocation();
-		//Bug  https://bugs.eclipse.org/bugs/show_bug.cgi?id=221197 
-		 IPath location = baseFile.getFullPath();
-		if (location != null) {
-			return TaglibIndex.resolve(location.toString(), uri, false) != null;
-		}
-		return false;
-	}
-
-	/**
-	 * @param model
-	 * @return true if model is a JSP contenttype
-	 */
-	public static boolean isJSPModel(IDOMModel model) {		
-		final IContentTypeManager typeManager = Platform.getContentTypeManager();
-		final IStructuredDocumentContext context = IStructuredDocumentContextFactory.INSTANCE.getContext(model.getStructuredDocument(), 0);
-		final IWorkspaceContextResolver resolver = IStructuredDocumentContextResolverFactory.INSTANCE.getWorkspaceContextResolver(context);
-		final IFile file = (IFile)resolver.getResource();
-        final IContentType contentType = 
-            typeManager.findContentTypeFor(file.getName());
-        
-		return contentType.isKindOf(JSP_CONTENTTYPE);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/JavaUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/JavaUtil.java
deleted file mode 100644
index e05000d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/JavaUtil.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.utils;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jdt.core.IClasspathEntry;
-import org.eclipse.jdt.core.IJarEntryResource;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jst.jsf.common.ui.IFileFolderConstants;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-
-/**
- * @author mengbo
- */
-public class JavaUtil {
-	/**
-	 * 
-	 * @param javaProject
-	 * @param parent
-	 * @return the path in javaProject or new Path("") if not found on a class path
-	 * @author mengbo
-	 */
-	public static IPath getPathOnClasspath(IJavaProject javaProject,
-			Object parent) {
-		IPath result = null;
-		if (javaProject == null || parent == null) {
-			return new Path(""); //$NON-NLS-1$
-		}
-		IClasspathEntry[] entries = javaProject.readRawClasspath();
-		IPath classPath = null;
-		if (parent instanceof IResource) {
-			if (((javaProject != null) && !javaProject
-					.isOnClasspath((IResource) parent))) {
-				return new Path(""); //$NON-NLS-1$
-			}
-			if (parent instanceof IFile) {
-				IPath elementPath = ((IFile) parent).getFullPath();
-				if (((IFile) parent).getFileExtension().equalsIgnoreCase(
-						IFileFolderConstants.EXT_PROPERTIES)) {
-					int machings = 0;
-					try {
-						for (int i = 0; i < entries.length; i++) {
-							// Determine whether on this classentry's path
-							machings = entries[i].getPath()
-									.matchingFirstSegments(elementPath);
-							if (machings > 0) {
-								// Get package name
-								classPath = elementPath.removeFirstSegments(
-										machings).removeLastSegments(1);
-								break;
-							}
-						}
-						// Not on the classpath?
-						if (classPath == null) {
-							return null;
-						} else if (classPath.segmentCount() > 0)
-							result = javaProject.findElement(classPath)
-									.getPath().removeFirstSegments(machings)
-									.append(((IFile) parent).getName());
-						else
-							result = ((IFile) parent).getFullPath()
-									.removeFirstSegments(machings);
-					} catch (Exception e) {
-						// Error.DesignerPropertyTool.NatureQuerying = Error in
-						// project java nature querying
-						PDPlugin.getLogger(JavaUtil.class).error(
-								"Error.DesignerPropertyTool.NatureQuerying", e); //$NON-NLS-1$
-						return null;
-					}
-				}
-			}
-		} else if (parent instanceof IJarEntryResource) {
-			IPath elementPath = ((IJarEntryResource) parent).getFullPath();
-			if (elementPath.getFileExtension().equalsIgnoreCase(
-					IFileFolderConstants.EXT_PROPERTIES)) {
-				result = elementPath;
-			}
-		}
-		if (result != null) {
-			return result;
-		}
-		return new Path(""); //$NON-NLS-1$
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/NodeLocationComparator.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/NodeLocationComparator.java
deleted file mode 100644
index 164a07e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/NodeLocationComparator.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.utils;
-
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.core.runtime.Assert;
-import org.w3c.dom.Node;
-
-/**
- * To sort the location of tags, this comparator is used to compare tags' order.
- * 
- * @author mengbo
- */
-public class NodeLocationComparator implements Comparator {
-	private final static Map orders = new HashMap();
-
-	private final static Integer DEFAULT_ORDER = Integer.valueOf(Integer.MAX_VALUE);
-
-	private static NodeLocationComparator _instance = new NodeLocationComparator();
-	static {
-		orders.put("taglib", Integer.valueOf(0)); //$NON-NLS-1$
-		orders.put("directive.taglib", Integer.valueOf(0)); //$NON-NLS-1$
-		orders.put("head", Integer.valueOf(1)); //$NON-NLS-1$
-	}
-
-	private NodeLocationComparator() {
-        // no external instantiation
-	}
-
-	/**
-	 * @return the singleton
-	 */
-	public static NodeLocationComparator getInstance() {
-		return _instance;
-	}
-
-	/**
-	 * The object to be compared could be Node or tag name.
-	 * 
-	 * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)
-	 */
-	public int compare(Object o1, Object o2) {
-		Assert.isTrue((o1 instanceof Node || o1 instanceof String)
-				&& (o2 instanceof Node || o2 instanceof String));
-		Integer i1 = getOrder(o1);
-		Integer i2 = getOrder(o2);
-		return i1.compareTo(i2);
-	}
-
-	private Integer getOrder(Object n) {
-		String name = null;
-		if (n instanceof Node) {
-			name = ((Node) n).getLocalName();
-		} else {
-			name = (String) n;
-		}
-		if (name != null) {
-			Object order = orders.get(name);
-			if (order != null) {
-				return (Integer) order;
-			}
-		}
-		return DEFAULT_ORDER;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/PreviewUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/PreviewUtil.java
deleted file mode 100644
index 2433b11..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/PreviewUtil.java
+++ /dev/null
@@ -1,420 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.utils;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.PrintStream;
-import java.io.StringReader;
-import java.io.UnsupportedEncodingException;
-import java.net.URLDecoder;
-import java.nio.charset.Charset;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.MissingResourceException;
-import java.util.PropertyResourceBundle;
-import java.util.Map.Entry;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.content.IContentDescription;
-import org.eclipse.core.runtime.content.IContentType;
-import org.eclipse.core.runtime.content.IContentTypeManager;
-import org.eclipse.jst.jsf.common.ui.IFileFolderConstants;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.jsf.common.ui.internal.utils.PathUtil;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.ui.IEditorInput;
-import org.w3c.dom.Attr;
-import org.w3c.dom.NamedNodeMap;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-/**
- * @author mengbo
- */
-public class PreviewUtil {
-	/** Create the logger for this class */
-	private static Logger _log = PDPlugin.getLogger(PreviewUtil.class);
-
-	/** line separator */
-	public static final String LINE_SEPARATOR = System
-			.getProperty("line.separator"); //$NON-NLS-1$
-
-	/** web root path */
-	private final static String WEBROOT_PATH = null;
-
-	/** the file being previewed */
-	private static IFile CURRENT_FILE = null;
-
-	/** the property bundel */
-	private static PropertyResourceBundle BUNDLE = null;
-
-	/** the property bundel map used for loadbundle preview action */
-	private static Map BUNDLE_MAP = null;
-
-	/** the variable name used for loadbundel preview action */
-	private static String VAR = null;
-
-	/** key is prefix value is uri */
-	private static Map _taglibMap = new HashMap();
-
-
-	/**
-	 * @return the current bundle
-	 */
-	public static final PropertyResourceBundle getBUNDLE() {
-        return BUNDLE;
-    }
-
-    /**
-     * @param bundle
-     */
-    public static final void setBUNDLE(PropertyResourceBundle bundle) {
-        BUNDLE = bundle;
-    }
-
-    /**
-     * @return the current bundle map
-     */
-    public static final Map getBUNDLE_MAP() {
-        return BUNDLE_MAP;
-    }
-
-    /**
-     * @param bundle_map
-     */
-    public static final void setBUNDLE_MAP(Map bundle_map) {
-        BUNDLE_MAP = bundle_map;
-    }
-
-    /**
-     * @return the current variable
-     */
-    public static final String getVAR() {
-        return VAR;
-    }
-
-    /**
-     * @param var
-     */
-    public static final void setVAR(String var) {
-        VAR = var;
-    }
-
-    /**
-	 * @return Returns the _taglibMap.
-	 */
-	public static Map getTaglibMap() {
-		return _taglibMap;
-	}
-
-	/**
-	 * @param map
-	 *            The _taglibMap to set.
-	 */
-	public static void setTaglibMap(Map map) {
-		_taglibMap = map;
-	}
-
-	/**
-	 * Get tag attribute string from attribute map
-	 * 
-	 * @param map
-	 *            tag attribute map
-	 * @return the attribute string
-	 */
-	public static String getAttributesAsString(Map map) {
-		return getAttributesAsString(map, true);
-	}
-
-	/**
-	 * Get file path from uri
-	 * 
-	 * @param uri
-	 *            taglib uri
-	 * @return the path as a string
-	 */
-	public static String getPathFromURI(String uri) {
-		if (uri == null) {
-			return uri;
-		}
-
-		if (uri.startsWith(IFileFolderConstants.PATH_SEPARATOR)) {
-			return PreviewUtil.WEBROOT_PATH + uri;
-		}
-		IFile curFile = PreviewUtil.CURRENT_FILE;
-		if (curFile != null) {
-			IContainer con = curFile.getParent();
-			if (con != null) {
-				IPath path = con.getLocation();
-				if (path != null) {
-					String aPath = path.toString() + File.separator + uri;
-
-					aPath = aPath.replace('/', File.separatorChar);
-					aPath = aPath.replace('\\', File.separatorChar);
-					if (aPath.endsWith(File.separator)) {
-						aPath += File.separator;
-					}
-					File file = new File(aPath);
-					if (file.exists()) {
-						return aPath;
-					}
-                    return uri;
-				}
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Get bundle value for expression
-	 * 
-	 * @param attrValue
-	 *            expression
-	 * @return the value
-	 */
-	public static String getValueOFEP(String attrValue) {
-		if (attrValue != null) {
-			if (attrValue.startsWith("#{")) //$NON-NLS-1$
-			{
-				String key, value = null;
-				int i = attrValue.lastIndexOf("."); //$NON-NLS-1$
-				if (i > 0) {
-					key = attrValue.substring(i + 1, attrValue.length() - 1)
-							.trim();
-					String bundleVariable = attrValue.substring(2, i).trim();
-					if (BUNDLE_MAP == null) {
-						return attrValue;
-					}
-					PropertyResourceBundle bundle = (PropertyResourceBundle) BUNDLE_MAP
-							.get(bundleVariable);
-
-					if (bundle != null) {
-						try {
-							value = bundle.getString(key);
-							if (value != null) {
-								return value;
-							}
-                            return attrValue;
-						} catch (MissingResourceException e1) {
-							// "Error in resource bundle processing:"
-							_log.info("PreviewUtil.Error.0", e1); //$NON-NLS-1$
-						}
-					}
-				}
-			}
-		}
-		return attrValue;
-	}
-
-	/**
-	 * Get tag attribute string from attribute map
-	 * 
-	 * @param map
-	 *            tag attribute map
-	 * @param flag
-	 *            state
-	 * @return the attributes as a single string
-	 */
-	private static String getAttributesAsString(Map<String, String> map, boolean flag) {
-		if (map == null) {
-			return null;
-		}
-
-		StringBuffer stringbuffer = new StringBuffer();
-		for (Iterator<Entry<String, String>> e = map.entrySet().iterator(); e.hasNext();) {
-		    Map.Entry<String,String> entry = e.next();
-			String attrName = entry.getKey();
-			String attrValue = entry.getValue();
-			attrValue = getValueOFEP(attrValue);
-			if (ICSSPropertyID.ATTR_SRC.equalsIgnoreCase(attrName)
-					|| ICSSPropertyID.ATTR_HREF.equalsIgnoreCase(attrName)
-					|| ICSSPropertyID.ATTR_URI.equalsIgnoreCase(attrName)
-					|| ICSSPropertyID.ATTR_BINDING.equalsIgnoreCase(attrName)
-					|| ICSSPropertyID.ATTR_PAGE.equalsIgnoreCase(attrName)) {
-				if (PreviewUtil.WEBROOT_PATH != null && attrValue != null
-						&& !attrValue.startsWith("http") //$NON-NLS-1$
-						&& !attrValue.startsWith("file")) //$NON-NLS-1$
-				{
-					attrValue = getPathFromURI(attrValue);
-				}
-			}
-			if (attrValue != null) {
-				stringbuffer.append(" ").append(attrName); //$NON-NLS-1$
-				if (attrValue.indexOf(34) != -1) {
-					StringBuffer stringbuffer1 = new StringBuffer();
-					for (int j = 0; j < attrValue.length(); j++) {
-						char c = attrValue.charAt(j);
-						if (c != '"') {
-							stringbuffer1.append(c);
-						}
-					}
-
-					attrValue = stringbuffer1.toString();
-				}
-				if (attrValue != null && attrValue.startsWith("#{")) //$NON-NLS-1$
-				{
-					attrValue = ""; //$NON-NLS-1$
-				}
-				stringbuffer.append("=\"").append(attrValue).append('"'); //$NON-NLS-1$
-			}
-		}
-		// System.out.println("BBBB:" +stringbuffer.toString());
-
-		return stringbuffer.toString();
-	}
-
-	/**
-	 * Change NamedNodeMap type to Map type
-	 * 
-	 * @param nodeMap
-	 *            NamedNodeMap type
-	 * @return the map
-	 */
-	public static Map getAttributeMap(NamedNodeMap nodeMap) {
-		if (nodeMap != null) {
-			int len = nodeMap.getLength();
-			HashMap map = new HashMap();
-			for (int i = 0; i < len; i++) {
-				Node node = nodeMap.item(i);
-				String name = node.getNodeName();
-				String value = node.getNodeValue();
-				if (name != null
-						&& !name.trim().equalsIgnoreCase("") && value != null) //$NON-NLS-1$
-				{
-					map.put(name, value);
-				}
-			}
-			return map;
-		}
-		return null;
-	}
-
-	/**
-	 * @param result
-	 * @param editorInput
-	 * @return the file
-	 */
-	public static File toFile(StringBuffer result, IEditorInput editorInput) {
-		try {
-			File file = File.createTempFile("previewtmp", ".html"); //$NON-NLS-1$ //$NON-NLS-2$
-			if (!file.exists()) {
-				file.createNewFile();
-			}
-			
-			//fix for https://bugs.eclipse.org/bugs/show_bug.cgi?id=202613 kindly contributed by Eiji Morito. 
-			IContentTypeManager contentTypeManager = Platform.getContentTypeManager();
-			IContentType contentType = contentTypeManager.getContentType("org.eclipse.wst.html.core.htmlsource"); //$NON-NLS-1$
-			IContentDescription contentDescription = contentType.getDescriptionFor(new StringReader(result.toString()), null);
-			String charset = contentDescription.getCharset();
-			
-			if (charset == null || !Charset.isSupported(charset)) {
-				charset = ResourcesPlugin.getEncoding();
-				if (charset == null)
-					charset = "UTF-8"; //$NON-NLS-1$
-			}
-
-			FileOutputStream fos = new FileOutputStream(file);
-			PrintStream ps = new PrintStream(fos, true, charset);
-			ps.print(result.toString());
-			ps.close();
-			fos.close();
-			return file;
-		} catch (IOException e) {
-			// "Error in file open:"
-			_log.info("PreviewUtil.Error.3", e); //$NON-NLS-1$
-			return null;
-		}
-	}
-
-
-	/**
-	 * do preivew on Node recursively translate escape char for Node and Node's
-	 * child translate relative path for Node and Node's child
-	 * 
-	 * @param node
-	 *            root node that will be previewed
-	 */
-	public static void previewNode(Node node) {
-		if (node == null) {
-			return;
-		}
-		NodeList nodeList = node.getChildNodes();
-		if (nodeList == null) {
-			return;
-		}
-		NamedNodeMap attrMap = node.getAttributes();
-
-		if (attrMap != null) {
-			for (int i = 0, n = attrMap.getLength(); i < n; i++) {
-				Node attrNode = attrMap.item(i);
-				if (attrNode instanceof Attr) {
-					Attr attr = (Attr) attrNode;
-					String value = attr.getNodeValue();
-					value = getValueOFEP(value);
-					//Bug 307801 - [WPE] WPE does not render Images with URL encoding in their path in the preview pane
-					try {
-						value = URLDecoder.decode(value, "UTF-8"); //$NON-NLS-1$
-					} catch(UnsupportedEncodingException uee) {
-						//we tried to decode using recommended encoding, we failed
-					} catch(IllegalArgumentException iae) {
-						//we tried to decode using recommended encoding, we failed
-					}
-					value = PathUtil.convertToAbsolutePath(value, null);
-					attr.setNodeValue(value);
-				}
-			}
-		}
-		for (int i = 0, n = nodeList.getLength(); i < n; i++) {
-			previewNode(nodeList.item(i));
-		}
-	}
-
-	// /**
-	// * handle escape attebute of tag
-	// *
-	// * @param node
-	// * @return
-	// */
-	// public static boolean escapeFoeNode(Node node)
-	// {
-	// if (node == null)
-	// {
-	// return false;
-	// }
-	// NamedNodeMap attrMap = node.getAttributes();
-	// if (attrMap != null)
-	// {
-	// for (int i = 0, n = attrMap.getLength(); i < n; i++)
-	// {
-	// Node attrNode = attrMap.item(i);
-	// if (attrNode != null && attrNode instanceof Attr)
-	// {
-	// if ("escape".equalsIgnoreCase(attrNode.getNodeName())
-	// && "true".equalsIgnoreCase(attrNode.getNodeValue()))
-	// {
-	// return true;
-	// }
-	// }
-	// }
-	// }
-	// return false;
-	// }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/ProjectResolver.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/ProjectResolver.java
deleted file mode 100644
index 46330f5..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/ProjectResolver.java
+++ /dev/null
@@ -1,526 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.utils;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.UnsupportedEncodingException;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.net.URLDecoder;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.StringTokenizer;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jst.jsf.common.ui.IFileFolderConstants;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.jsf.common.ui.internal.utils.ResourceUtils;
-import org.eclipse.jst.jsf.common.ui.internal.utils.WebrootUtil;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.wst.common.uriresolver.internal.util.URIHelper;
-import org.eclipse.wst.sse.core.StructuredModelManager;
-import org.eclipse.wst.sse.core.internal.provisional.IModelManager;
-import org.eclipse.wst.sse.core.internal.util.URIResolver;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.w3c.dom.DOMException;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-/**
- * A URIResolver implementation
- *
- */
-public class ProjectResolver implements URIResolver {
-	private static final String TLD_TAG_URI = "uri"; //$NON-NLS-1$
-
-	private static final String URI_PREFIX_HTTP = "http"; //$NON-NLS-1$
-
-	private static final String FILE_PROTOCOL = "file"; //$NON-NLS-1$
-
-	/** Create the logger for this class */
-	private static Logger _log = PDPlugin.getLogger(ProjectResolver.class);
-
-	private IProject _project = null;
-
-	private String _fileBaseLocation = null;
-
-	private static Map _uriMap = null;
-
-	/**
-	 * It is strongly recommended that clients use
-	 * project.getAdapter(URIResolver.class) to obtain a URIResolver aware of
-	 * the Project's special requirements. Note that a URIResolver may not be
-	 * returned at all so manually creating this object may still be required.
-	 * @param project
-	 */
-	public ProjectResolver(IProject project) {
-		super();
-		_project = project;
-	}
-
-	/**
-	 * @param path
-	 */
-	public void seekTld(IFolder path) {
-		if (path == null) {
-			return;
-		}
-		if (_uriMap == null) {
-			_uriMap = new HashMap();
-		}
-
-		try {
-			IResource[] res = path.members();
-			if (null == res) {
-				return;
-			}
-			for (int i = 0; i < res.length; i++) {
-				if (res[i] instanceof IFolder) {
-					seekTld((IFolder) res[i]);
-				}
-				String ext = res[i].getFileExtension();
-				if (IFileFolderConstants.EXT_TAGLIB.equalsIgnoreCase(ext)) {
-					IFile tldFile = (IFile) res[i];
-					String uri = getURIfromTLD(tldFile);
-					String locate = tldFile.getLocation().toOSString();
-					if (uri != null && _uriMap.get(uri) == null) {
-						_uriMap.put(uri, locate);
-					}
-				}
-			}
-		} catch (CoreException e) {
-			_log.error("Error.ProjectResolver.GetlocationByURI.0", e); //$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * @param path
-	 */
-	public void seekTld(File path) {
-		if (path == null || !path.isDirectory()) {
-			return;
-		}
-		if (_uriMap == null) {
-			_uriMap = new HashMap();
-		}
-
-		try {
-			File[] res = path.listFiles();
-			if (null == res) {
-				return;
-			}
-			for (int i = 0; i < res.length; i++) {
-				if (res[i] instanceof IFolder) {
-					seekTld(res[i]);
-				}
-
-				if (res[i].getName().endsWith(
-						IFileFolderConstants.DOT
-								+ IFileFolderConstants.EXT_TAGLIB)) {
-					String uri = getURIfromTLD(res[i]);
-					String locate;
-
-					locate = res[i].getCanonicalPath();
-
-					if (uri != null && _uriMap.get(uri) == null) {
-						_uriMap.put(uri, locate);
-					}
-				}
-			}
-		} catch (IOException e1) {
-			_log.error("Error.ProjectResolver.GetlocationByURI.0", e1); //$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * @param tldFile
-	 * @return the uri for the tld in tldFile or null
-	 */
-	public String getURIfromTLD(File tldFile) {
-
-		if (tldFile == null) {
-			return null;
-		}
-		IDOMModel tldModel = null;
-
-		InputStream in = null;
-		try {
-			in = new FileInputStream(tldFile);
-		} catch (FileNotFoundException e) {
-			_log.error("RenderingTraverser.Error.FileNotFound", e); //$NON-NLS-1$
-			return null;
-		}
-//		IDOMModel xmlModel = null;
-
-		try {
-			tldModel = (IDOMModel) StructuredModelManager.getModelManager().getModelForRead(
-					tldFile.getAbsolutePath(), in, null);
-			NodeList uriList = tldModel.getDocument().getElementsByTagName(
-					TLD_TAG_URI);
-			for (int i = 0, n = uriList.getLength(); i < n; i++) {
-				Node uri = uriList.item(i);
-				return uri.getChildNodes().item(0).getNodeValue();
-			}
-		} catch (UnsupportedEncodingException e1) {
-			_log.error("RenderingTraverser.Error.UnsupportedEncoding", e1); //$NON-NLS-1$
-		} catch (IOException e1) {
-			_log.error("RenderingTraverser.Error.IO", e1); //$NON-NLS-1$
-		} finally {
-			ResourceUtils.ensureClosed(in);
-			
-			if (tldModel != null)
-			{
-			    tldModel.releaseFromRead();
-			}
-		}
-
-		return null;
-	}
-
-	/**
-	 * @param tldFile
-	 * @return the URI for the TLD in tldFile or null
-	 */
-	public String getURIfromTLD(IFile tldFile) {
-		if (tldFile == null) {
-			return null;
-		}
-		IDOMModel tldModel;
-
-		try {
-			tldModel = (IDOMModel) getModelManager().getModelForRead(tldFile);
-			NodeList uriList = tldModel.getDocument().getElementsByTagName(
-					TLD_TAG_URI);
-			for (int i = 0, n = uriList.getLength(); i < n; i++) {
-				Node uri = uriList.item(i);
-				return uri.getChildNodes().item(0).getNodeValue();
-			}
-		} catch (IOException e) {
-			// Error in taglib locating.
-			_log.error("Error.ProjectResolver.GetlocationByURI.0", e); //$NON-NLS-1$
-		} catch (CoreException e1) {
-			_log.error("Error.ProjectResolver.GetlocationByURI.0", e1); //$NON-NLS-1$
-		}
-		return null;
-	}
-
-	/**
-	 * initialize the map of tlds
-	 */
-	public void initTldMap() {
-		if (_uriMap == null) {
-			_uriMap = new HashMap();
-		}
-		if (_project == null) {
-			return;
-		}
-		if (WebrootUtil.getWebContentFolder(_project) == null) {
-			return;
-		}
-		IFolder webinf = WebrootUtil.getWebContentFolder(_project).getFolder(
-				IFileFolderConstants.FOLDER_WEBINF);
-		if (webinf != null && webinf.exists()) {
-			seekTld(webinf);
-		}
-
-		String locate = PDPlugin.getInstallLocation().append("/jsf-tld") //$NON-NLS-1$
-				.toString();
-		File jsfDir = new File(locate);
-		seekTld(jsfDir);
-
-	}
-
-	public java.lang.String getFileBaseLocation() {
-		return _fileBaseLocation;
-	}
-
-	public java.lang.String getLocationByURI(String uri) {
-		// System.out.println(getLocationByURI(uri, getFileBaseLocation()));
-		return getLocationByURI(uri, getFileBaseLocation());
-	}
-
-	private IModelManager getModelManager() {
-		return StructuredModelManager.getModelManager();
-	}
-
-	private String getLocationFromWEBXML(String uri, String baseReference) {
-		if (uri == null) {
-			return null;
-		}
-		try {
-			// if (_project.hasNature(ICommonConstants.NATURE_WEBAPP))
-			// {
-			if (uri.startsWith(IFileFolderConstants.PATH_SEPARATOR)) {
-				uri = _project.getProject().getLocation().toString()
-						+ IFileFolderConstants.PATH_SEPARATOR
-						+ WebrootUtil.getWebContentFolderName(_project) + uri;
-			}
-			if (uri.startsWith(URI_PREFIX_HTTP)) {
-				IFile webxml = WebrootUtil.getWebContentFolder(_project)
-						.getFolder(IFileFolderConstants.FOLDER_WEBINF).getFile(
-								IFileFolderConstants.FILE_WEB_XML);
-				IDOMModel xmlModel;
-
-				if (webxml.exists()) {
-					try {
-						xmlModel = (IDOMModel) getModelManager()
-								.getModelForRead(webxml);
-
-						NodeList taglibNodeList = xmlModel
-								.getDocument()
-								.getElementsByTagName(ICSSPropertyID.TAG_TAGLIB);
-
-						for (int i = 0, size = taglibNodeList.getLength(); i < size; i++) {
-							Node taglibNode = taglibNodeList.item(i);
-
-							NodeList childList = taglibNode.getChildNodes();
-							String taguri = ""; //$NON-NLS-1$
-							String taglocation = ""; //$NON-NLS-1$
-							for (int j = 0, childSize = childList.getLength(); j < childSize; j++) {
-								Node childTaglibNode = childList.item(j);
-								if (ICSSPropertyID.ATTR_TAGLIB_URI
-										.equalsIgnoreCase(childTaglibNode
-												.getNodeName())) {
-									taguri = childTaglibNode.getChildNodes()
-											.item(0).getNodeValue();
-								}
-								if (ICSSPropertyID.ATTR_TAGLIB_LOCATION
-										.equalsIgnoreCase(childTaglibNode
-												.getNodeName())) {
-									taglocation = childTaglibNode
-											.getChildNodes().item(0)
-											.getNodeValue();
-								}
-
-							}
-							if (uri.equalsIgnoreCase(taguri))
-								uri = _project.getProject().getLocation()
-										.toString()
-										+ IFileFolderConstants.PATH_SEPARATOR
-										+ WebrootUtil
-												.getWebContentFolderName(_project)
-										+ taglocation;
-						}
-						xmlModel.releaseFromRead();
-					} catch (IOException e) {
-
-						// Error in taglib locating.
-						_log.error(
-								"Error.ProjectResolver.GetlocationByURI.0", e); //$NON-NLS-1$
-					} catch (CoreException e1) {
-						e1.printStackTrace();
-						_log.error("Error.ProjectResolver.GetlocationByURI.0", //$NON-NLS-1$
-								e1);
-					}
-
-				}
-			}
-			// }
-		} catch (DOMException e1) {
-			// Error in taglib locating.
-			_log.error("Error.ProjectResolver.GetlocationByURI.0", e1); //$NON-NLS-1$
-		}
-		// catch (CoreException e1)
-		// {
-		//
-		// _log.error("Error.ProjectResolver.GetlocationByURI.0", e1);
-		// }
-
-		if (isFileURL(uri)) {
-			try {
-				URL url = new URL(uri);
-				return getPath(url);
-			} catch (MalformedURLException e) {
-				_log.error("Error.ProjectResolver.GetlocationByURI.0", e); //$NON-NLS-1$
-			}
-		}
-		// defect 244817 end
-		return URIHelper.normalize(uri, baseReference, getRootLocationString());
-
-	}
-
-	public String getLocationByURI(String uri, String baseReference) {
-		// DataWindow may generate URL like "d:\somefile" (dos path). We may
-		// need some
-		// special support. (lium)
-		int columnIndex = uri.indexOf(":"); //$NON-NLS-1$
-		int slashIndex = uri.indexOf("/"); //$NON-NLS-1$
-		if (columnIndex != -1 && (slashIndex == -1 || columnIndex < slashIndex)) {
-			return uri;
-		}
-		try {
-			uri = URLDecoder.decode(uri, "UTF-8");  //$NON-NLS-1$
-		} catch (UnsupportedEncodingException e) {
-			// suppress this.  the user's data may be invalid.
-		}
-		String result = getLocationFromWEBXML(uri, baseReference);
-		if (result != null && !result.equals(uri)) {
-			return result;
-		}
-		if (_uriMap == null) {
-			initTldMap();
-		}
-		if (_uriMap != null) {
-			return (String) _uriMap.get(uri);
-		}
-		return null;
-	}
-
-	// defect 244817 start
-	/**
-	 * @param passedSpec
-	 * @return boolean
-	 */
-	private boolean isFileURL(String passedSpec) {
-		if (passedSpec == null) {
-			return false;
-		}
-		final String spec = passedSpec.trim();
-		if (spec.length() == 0) {
-			return false;
-		}
-		String newProtocol = null;
-		for (int index = 0, limit = spec.length(); index < limit; index++) {
-			final char p = spec.charAt(index);
-			if (p == '/') {
-				//$NON-NLS-1$
-				break;
-			}
-			if (p == ':') {
-				//$NON-NLS-1$
-				newProtocol = spec.substring(0, index);
-				break;
-			}
-		}
-		return (newProtocol != null && newProtocol
-				.compareToIgnoreCase(FILE_PROTOCOL) == 0);
-	}
-
-	/**
-	 * @param url
-	 * @return String
-	 */
-	private String getPath(URL url) {
-		String ref = url.getRef() == null ? "" : "#" + url.getRef(); //$NON-NLS-1$ //$NON-NLS-2$
-		String strPath = url.getFile() + ref;
-		IPath path;
-		if (strPath.length() == 0) {
-			path = Path.ROOT;
-		} else {
-			path = new Path(strPath);
-			String query = null;
-			StringTokenizer parser = new StringTokenizer(strPath, "?"); //$NON-NLS-1$
-			int tokenCount = parser.countTokens();
-			if (tokenCount == 2) {
-				path = new Path((String) parser.nextElement());
-				query = (String) parser.nextElement();
-			}
-			if (query == null) {
-				parser = new StringTokenizer(path.toString(), "#"); //$NON-NLS-1$
-				tokenCount = parser.countTokens();
-				if (tokenCount == 2) {
-					path = new Path((String) parser.nextElement());
-				}
-			}
-		}
-		return getPath(path, url.getHost());
-	}
-
-	/**
-	 * @param path
-	 * @param host
-	 * @return String
-	 */
-	private String getPath(IPath path, String host) {
-		IPath newPath = path;
-		// They are potentially for only Windows operating system.
-		// a.) if path has a device, and if it begins with IPath.SEPARATOR,
-		// remove it
-		final String device = path.getDevice();
-		if (device != null && device.length() > 0) {
-			if (device.charAt(0) == IPath.SEPARATOR) {
-				final String newDevice = device.substring(1);
-				newPath = path.setDevice(newDevice);
-			}
-		}
-		// b.) if it has a hostname, it is UNC name... Any java or eclipse api
-		// helps it ??
-		if (newPath != null && host != null && host.length() != 0) {
-			IPath uncPath = new Path(host);
-			uncPath = uncPath.append(path);
-			newPath = uncPath.makeUNC(true);
-		}
-		
-		if (newPath != null)
-		{
-		    return newPath.toString();
-		}
-		return path.toString();
-	}
-
-	/**
-	 * Resolve the (possibly relative) URI acording to RFC1808 using the default
-	 * file base location. Resolves resource references into absolute resource
-	 * locations without ensuring that the resource actually exists. Note:
-	 * currently resolveCrossProjectLinks is ignored in this implementation.
-	 */
-	public java.lang.String getLocationByURI(String uri,
-			boolean resolveCrossProjectLinks) {
-		return getLocationByURI(uri, getFileBaseLocation(),
-				resolveCrossProjectLinks);
-	}
-
-	/**
-	 * Perform the getLocationByURI action using the baseReference as the point
-	 * of reference instead of the default for this resolver Note: currently
-	 * resolveCrossProjectLinks is ignored in this implementation.
-	 */
-	public java.lang.String getLocationByURI(String uri, String baseReference,
-			boolean resolveCrossProjectLinks) {
-		return getLocationByURI(uri, baseReference);
-	}
-
-	public org.eclipse.core.resources.IProject getProject() {
-		return _project;
-	}
-
-	public org.eclipse.core.resources.IContainer getRootLocation() {
-		return _project;
-	}
-
-	private String getRootLocationString() {
-		return null;
-	}
-
-	public void setFileBaseLocation(java.lang.String newFileBaseLocation) {
-		_fileBaseLocation = newFileBaseLocation;
-	}
-
-	public void setProject(org.eclipse.core.resources.IProject newProject) {
-		_project = newProject;
-	}
-
-	public InputStream getURIStream(String uri) {
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/SelectManyHelper.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/SelectManyHelper.java
deleted file mode 100644
index c019190..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/SelectManyHelper.java
+++ /dev/null
@@ -1,196 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.utils;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-import org.eclipse.jst.jsf.core.internal.tld.CMUtil;
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-/**
- * @author mengbo
- */
-public class SelectManyHelper {
-
-	private final static Set<String> JSF_SELECT_TAGS, HTML_SELECT_TAGS;
-
-
-	static {
-		Set<String> tempSet = new HashSet<String>(4);
-		tempSet.add(IHTMLConstants.TAG_SELECT);
-		tempSet.add(IHTMLConstants.TAG_OPTGROUP);
-		HTML_SELECT_TAGS = Collections.unmodifiableSet(tempSet);
-		
-		tempSet = new HashSet(8);
-		tempSet.add(IJSFConstants.TAG_SELECTONELISTBOX);
-		tempSet.add(IJSFConstants.TAG_SELECTONEMENU);
-		tempSet.add(IJSFConstants.TAG_SELECTMANYLISTBOX);//
-		tempSet.add(IJSFConstants.TAG_SELECTMANYMENU);//
-		tempSet.add(IJSFConstants.TAG_SELECTMANYCHECKBOX);
-		JSF_SELECT_TAGS = Collections.unmodifiableSet(tempSet);
-	}
-
-	/**
-	 * @param node
-	 * @return the select option children of node
-	 */
-	public static Object[] getSelectOptions(Element node) {
-		if (node == null) {
-			return null;
-		}
-		IDOMModel xmlModel = null;
-		if (node instanceof IDOMNode) {
-			xmlModel = ((IDOMNode) node).getModel();
-		}
-		if (xmlModel == null) {
-			return null;
-		}
-		// TODO: this query is not cached.
-		String prefixNode = JSPUtil.getPrefix(xmlModel,
-				ITLDConstants.URI_JSF_HTML);
-		if (prefixNode != null && node.getPrefix() != null
-				&& node.getPrefix().equals(prefixNode)) {
-			if (JSF_SELECT_TAGS.contains(node.getLocalName())) {
-				String prefixItem = JSPUtil.getPrefix(xmlModel,
-						ITLDConstants.URI_JSF_CORE);
-				List result = new ArrayList();
-				NodeList items = node.getElementsByTagName(prefixItem
-						+ ":" + IJSFConstants.TAG_SELECTITEM); //$NON-NLS-1$
-				for (int i = 0, n = items.getLength(); i < n; i++) {
-					result.add(items.item(i));
-				}
-				items = node.getElementsByTagName(prefixItem
-						+ ":" + IJSFConstants.TAG_SELECTITEMS); //$NON-NLS-1$
-				for (int i = 0, n = items.getLength(); i < n; i++) {
-					result.add(items.item(i));
-				}
-				return result.size() > 0 ? result.toArray(new Node[result
-						.size()]) : null;
-			}
-		}
-		if (node.getPrefix() == null) {
-			if (HTML_SELECT_TAGS.contains(node.getNodeName().toLowerCase())) {
-				List result = new ArrayList();
-				NodeList options = node
-						.getElementsByTagName(IHTMLConstants.TAG_OPTION);
-				NodeList optionGroups = node
-						.getElementsByTagName(IHTMLConstants.TAG_OPTGROUP);
-				for (int i = 0, n = options.getLength(); i < n; i++) {
-					result.add(options.item(i));
-				}
-				for (int i = 0, n = optionGroups.getLength(); i < n; i++) {
-					result.add(optionGroups.item(i));
-				}
-				return result.toArray(new Node[result.size()]);
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * @param node
-	 * @return the selection option children of node as strings
-	 */
-	public static String[] getSelectOptionsString(Element node) {
-		if (node == null) {
-			return null;
-		}
-		Object[] options = getSelectOptions(node);
-		if (null == options || options[0] == null) {
-			return null;
-		}
-		List result = new ArrayList();
-		for (int i = 0, n = options.length; i < n; i++) {
-			if (options[i] instanceof Element) {
-				Element element = (Element) options[i];
-				Node value = null;
-				if (element.getNodeName()
-						.indexOf(IJSFConstants.TAG_SELECTITEMS) >= 0) {
-					value = element.getAttributeNode(IJSFConstants.ATTR_VALUE);
-				} else if (element.getNodeName().indexOf(
-						IJSFConstants.TAG_SELECTITEM) >= 0) {
-					value = element
-							.getAttributeNode(ICSSPropertyID.ATTR_ITEMLABEL);
-				}
-				if (value != null) {
-					result.add(value.getNodeValue());
-				}
-			}
-		}
-		return (String[]) result.toArray(new String[] {});
-	}
-
-	/**
-	 * @param node
-	 * @return true if node has select option children
-	 */
-	public static boolean hasSelectOptions(Element node) {
-		if (node == null) {
-			return false;
-		}
-		String uri = CMUtil.getElementNamespaceURI(node);
-		if (ITLDConstants.URI_JSF_HTML.equals(uri)) {
-
-			if (JSF_SELECT_TAGS.contains(node.getLocalName())) {
-				IDOMModel model = ((IDOMElement) node).getModel();
-				String jsfcorePrefix = JSPUtil.getPrefix(model,
-						ITLDConstants.URI_JSF_CORE);
-				if (jsfcorePrefix != null) {
-					NodeList nl = node.getElementsByTagName(jsfcorePrefix + ":" //$NON-NLS-1$
-							+ IJSFConstants.TAG_SELECTITEM);
-					NodeList nl1 = node.getElementsByTagName(jsfcorePrefix
-							+ ":" + IJSFConstants.TAG_SELECTITEMS); //$NON-NLS-1$
-					return nl.getLength() > 0 || nl1.getLength() > 0;
-				}
-                return false;
-			}
-		}
-		if (ITLDConstants.URI_HTML.equals(uri)) {
-			if (HTML_SELECT_TAGS.contains(node.getNodeName().toLowerCase())) {
-				NodeList nl = node
-						.getElementsByTagName(IHTMLConstants.TAG_OPTION);
-				NodeList nl1 = node
-						.getElementsByTagName(IHTMLConstants.TAG_OPTGROUP);
-				return nl.getLength() > 0 || nl1.getLength() > 0;
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * @param node
-	 * @return true if node is a core or HTML select tag
-	 */
-	public static boolean supportSections(Element node) {
-		String uri = CMUtil.getElementNamespaceURI(node);
-		if (ITLDConstants.URI_JSF_HTML.equals(uri)) {
-			return JSF_SELECT_TAGS.contains(node.getLocalName());
-		}
-		if (ITLDConstants.URI_HTML.equals(uri)) {
-			return HTML_SELECT_TAGS.contains(node.getNodeName().toLowerCase());
-		}
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/SelectionHelper.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/SelectionHelper.java
deleted file mode 100644
index ee93b58..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/SelectionHelper.java
+++ /dev/null
@@ -1,384 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.utils;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.jface.text.ITextSelection;
-import org.eclipse.jface.text.TextSelection;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jst.jsf.core.internal.tld.CMUtil;
-import org.eclipse.jst.pagedesigner.dom.DOMPosition;
-import org.eclipse.jst.pagedesigner.dom.DOMPositionHelper;
-import org.eclipse.jst.pagedesigner.dom.DOMRefPosition;
-import org.eclipse.jst.pagedesigner.dom.DOMRefPosition2;
-import org.eclipse.jst.pagedesigner.dom.DOMUtil;
-import org.eclipse.jst.pagedesigner.dom.EditValidateUtil;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.parts.NodeEditPart;
-import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext;
-import org.w3c.dom.CharacterData;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.Text;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class SelectionHelper {
-	/**
-	 * convert the text selection to a Node. Will use the start offset of the
-	 * text selection.
-	 * 
-	 * @param model
-	 * @param textSel
-	 * @return the node for the text selectin in model or null
-	 */
-	public static Node toNode(IStructuredModel model, ITextSelection textSel) {
-		// FIXME: currently always normalize to a single node. should also
-		// consider change into DesignRange
-		// on text selection, find the appropriate Node
-		Object inode = model.getIndexedRegion(textSel.getOffset());
-		if (inode instanceof Node) {
-			return (Node) inode;
-		}
-        return null;
-	}
-
-	/**
-	 * convert a structured selection of NodeEditPart or Node into the first
-	 * node.
-	 * 
-	 * @param selection
-	 * @return the node for the selection or null
-	 */
-	public static Node toNode(IStructuredSelection selection) {
-		if (selection.isEmpty()) {
-			return null;
-		}
-		Object first = selection.getFirstElement();
-		if (first instanceof Node) {
-			return (Node) first;
-		} else if (first instanceof NodeEditPart) {
-			return ((NodeEditPart) first).getIDOMNode();
-		} else {
-			return null;
-		}
-	}
-
-	/**
-	 * convert a DesignRange into a single node.
-	 * 
-	 * @param range
-	 * @return the node for the design range or null
-	 */
-	public static Node toNode(DesignRange range) {
-		if (range.isValid()) {
-			Node node1 = range.getStartPosition().getContainerNode();
-			Node node2 = range.getEndPosition().getContainerNode();
-			return DOMUtil.findCommonAncester(node1, node2);
-		}
-        return null;
-	}
-
-	/**
-	 * @param model
-	 * @param region
-	 *            if null, then will calculate it using offset.
-	 * @param offset
-	 *            offset in source.
-	 * @return a dom position for the region and offset
-	 */
-	public static IDOMPosition toDOMPosition(IDOMModel model,
-			IndexedRegion region, int offset) {
-		if (region == null) {
-			region = model.getIndexedRegion(offset);
-		}
-		if (region == null && offset > 0) {
-			// in case this is at end of file.
-			offset = offset - 1;
-			region = model.getIndexedRegion(offset);
-			if (region != null) {
-				if (region.getEndOffset() >= offset + 1) {
-					offset += 1; // restore offset.
-				}
-			}
-		}
-		if (region == null) {
-			return new DOMPosition(model.getDocument(), 0);
-		}
-		IDOMNode node = (IDOMNode) region;
-		int start = node.getStartOffset();
-		if (offset <= start) {
-			return new DOMRefPosition(node, false);
-		}
-		int end = node.getEndOffset();
-		if (offset >= end) {
-			return new DOMRefPosition(node, true);
-		}
-		if (node instanceof CharacterData) {
-			String data = ((CharacterData) node).getData();
-			String source = node.getSource();
-			if (data.equals(source)) {
-				return new DOMPosition(node, offset - start);
-			}
-			IStructuredDocumentRegion r = node
-					.getFirstStructuredDocumentRegion();
-			int countedData = 0;
-			// TODO: dead? int offsetInNode = offset - start;
-			while (r != null) {
-				if (DOMRegionContext.XML_CHAR_REFERENCE.equals(r.getType())
-						|| DOMRegionContext.XML_ENTITY_REFERENCE.equals(r
-								.getType())) {
-					countedData += 1; // FIXME: what if the entity reference's
-					// corresponding data is more than 1
-					// char?
-					// where can we get that information?
-					if (r.getEnd() >= offset) {
-						return new DOMPosition(node, countedData);
-					}
-				} else {
-					if (r.getEnd() >= offset) {
-						return new DOMPosition(node, countedData + offset
-								- r.getStart());
-					}
-					countedData += r.getLength();
-				}
-				r = r.getNext();
-			}
-			return new DOMRefPosition(node, true);
-		} else if (node instanceof Element) {
-			CMElementDeclaration cm = CMUtil
-					.getElementDeclaration((Element) node);
-			if (cm != null && cm.getContentType() == CMElementDeclaration.EMPTY) {
-				// this node can't have children.
-				return new DOMRefPosition(node, true);
-			}
-			IStructuredDocumentRegion startRegion = node
-					.getStartStructuredDocumentRegion();
-			if (startRegion == null) {
-				return new DOMRefPosition(node, true);
-			}
-            int startRegionEnd = node.getStartStructuredDocumentRegion()
-            		.getEnd();
-            if (offset <= startRegionEnd) {
-            	// it is in the start tag region. So put position at first
-            	// child position.
-            	return new DOMRefPosition2(node, false);
-            }
-            return new DOMRefPosition2(node, true);
-		} else {
-			return new DOMRefPosition(node, true);
-		}
-		// XXX: the implementation in EditModelQuery seemed to be very complex.
-		// Need revisit that
-		// and refactor the implementation to this class later. (lium)
-	}
-
-	/**
-	 * Give a text selection with offset and length, convert it into a Designer
-	 * selection (IStrucuturedSelection of editpart or DesignerRange). If the
-	 * text selection include just a single element node, we'll create a
-	 * IStructuredSelection, otherwise we'll create a DesignerRange.
-	 * 
-	 * @param graphicViewer
-	 * @param offset
-	 * @param length
-	 * @return a selection
-	 */
-	public static ISelection convertToDesignerSelection(
-			IHTMLGraphicalViewer graphicViewer, int offset, int length) {
-		IDOMModel model = graphicViewer.getModel();
-		IndexedRegion region1 = model.getIndexedRegion(offset);
-		IndexedRegion region2 = model.getIndexedRegion(offset + length);
-		IDOMNode node1 = (IDOMNode) region1;
-
-		if (node1 == null) {
-			IDOMPosition endOfDoc = new DOMRefPosition2(model.getDocument(),
-					true);
-			DesignPosition p = DOMPositionHelper.toDesignPosition(endOfDoc);
-			return new DesignRange(p, p);
-		}
-
-		if ((region1 == region2 || node1.getEndOffset() == offset + length)
-				&& !(node1 instanceof Text)) {
-			// ok, we selected a single node.
-			EditPart part = (EditPart) node1.getAdapterFor(EditPart.class);
-			if (part != null) {
-				return new StructuredSelection(part);
-			}
-		}
-
-		// when we reach here, we'll create a DesignerRange
-		IDOMPosition position1 = toDOMPosition(model, region1, offset);
-		IDOMPosition position2 = (length == 0 ? position1 : toDOMPosition(
-				model, region2, offset + length));
-
-		if (position1 == null || position2 == null) {
-			return new DesignRange(null, null);
-		}
-		DesignPosition p1 = DOMPositionHelper.toDesignPosition(position1);
-		DesignPosition p2 = (length == 0 ? p1 : DOMPositionHelper
-				.toDesignPosition(position2));
-		if (p1 == null || p2 == null) {
-			return new DesignRange(null, null);
-		}
-
-		return new DesignRange(p1, p2);
-
-	}
-
-	/**
-	 * convert a IDOMPosition into index in the source.
-	 * 
-	 * @param p
-	 * @return
-	 */
-	private static int getIndexedRegionLocation(IDOMPosition p) {
-		if (!EditValidateUtil.validPosition(p)) {
-			return 0;
-		}
-
-		IDOMNode parent = (IDOMNode) p.getContainerNode();
-		if (p.isText()) {
-			String text = ((CharacterData) parent).getData();
-			String source = parent.getSource();
-			if (text.length() == source.length()) {
-				// no entity reference.
-				return parent.getStartOffset() + p.getOffset();
-			}
-			// CR404708. Need to handle entity reference in the text.
-			int offset = p.getOffset();
-			int counted = 0;
-			IStructuredDocumentRegion r = parent
-					.getFirstStructuredDocumentRegion();
-			while (r != null && counted < offset) {
-				if (DOMRegionContext.XML_CHAR_REFERENCE.equals(r.getType())
-						|| DOMRegionContext.XML_ENTITY_REFERENCE.equals(r
-								.getType())) {
-					counted++;
-					if (counted >= offset) {
-						return r.getEndOffset();
-					}
-				} else {
-					int length = r.getLength();
-					if (counted + length >= offset) {
-						return r.getStartOffset() + offset - counted;
-					}
-					counted += length;
-				}
-				r = r.getNext();
-			}
-			return parent.getStartOffset() + p.getOffset();
-		}
-        IDOMNode previous = (IDOMNode) p.getPreviousSiblingNode();
-        if (previous != null) {
-        	return previous.getEndOffset();
-        }
-        IDOMNode next = (IDOMNode) p.getNextSiblingNode();
-        if (next != null) {
-        	return next.getStartOffset();
-        }
-        IStructuredDocumentRegion r = parent
-        		.getStartStructuredDocumentRegion();
-        if (r != null) {
-        	return r.getEnd();
-        }
-        // r == null normally means the parent is the document node.
-        return parent.getEndOffset();
-	}
-
-	/**
-	 * convert design selection of structured selection of NodeEditPart into
-	 * structured selection of Node
-	 * 
-	 * @param sel
-	 * @return a structured selectino
-	 */
-	public static IStructuredSelection convertFromDesignSelection(
-			IStructuredSelection sel) {
-		List list = sel.toList();
-		if (list != null) {
-			List result = new ArrayList(list.size());
-			for (int i = 0, size = list.size(); i < size; i++) {
-				NodeEditPart part = (NodeEditPart) list.get(i);
-				result.add(part.getIDOMNode());
-			}
-			return new StructuredSelection(result);
-		}
-        return new StructuredSelection();
-	}
-
-	/**
-	 * 
-	 * @param range
-	 *            selection from designer, could be IStructuredSelection of
-	 *            NodeEditPart, or DesignRange.
-	 * @return a text selection
-	 */
-	public static ITextSelection convertFromDesignSelection(DesignRange range) {
-		if (range.isValid()) {
-			IDOMPosition start = DOMPositionHelper.toDOMPosition(range
-					.getStartPosition());
-			IDOMPosition end = DOMPositionHelper.toDOMPosition(range
-					.getEndPosition());
-			// We should not encounter invalid position.
-			if (EditValidateUtil.validPosition(start)
-					&& EditValidateUtil.validPosition(end)) {
-				int offset = getIndexedRegionLocation(start);
-				int endoffset = getIndexedRegionLocation(end);
-				if (offset > endoffset) {
-					int temp = offset;
-					offset = endoffset;
-					endoffset = temp;
-				}
-				return new TextSelection(offset, endoffset - offset);
-			} 
-		}
-        return new TextSelection(0, 0);
-	}
-
-	/**
-	 * @param selection
-	 * @return a text selection for the selection or TextSelection(0,0)
-	 * if nothing can be determined
-	 */
-	public static ITextSelection convertFromDesignSelectionToTextSelection(
-			ISelection selection) {
-		if (selection instanceof IStructuredSelection) {
-			IStructuredSelection nodes = convertFromDesignSelection((IStructuredSelection) selection);
-			IDOMNode node = (IDOMNode) nodes.getFirstElement();
-			if (node != null && node.getNodeType() != Node.DOCUMENT_NODE) {
-				return new TextSelection(node.getStartOffset(), node
-						.getEndOffset()
-						- node.getStartOffset());
-			}
-		} else if (selection instanceof DesignRange) {
-			return convertFromDesignSelection((DesignRange) selection);
-		}
-        return new TextSelection(0, 0);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/StructuredModelUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/StructuredModelUtil.java
deleted file mode 100644
index 8853975..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/StructuredModelUtil.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.utils;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-
-/**
- * @author mengbo
- */
-public class StructuredModelUtil {
-
-	/**
-	 * this method is copied from ModelManagerImpl of wtp. Because it is
-	 * internal.
-	 * 
-	 * @param model
-	 * @return null if can't get file.
-	 */
-	// TODO: replace (or supplement) this is a "model info" association to the
-	// IFile that created the model
-	public static IFile getFileFor(IStructuredModel model) {
-		if (model == null)
-			return null;
-		String path = model.getBaseLocation();
-		if (path == null || path.length() == 0) {
-			Object id = model.getId();
-			if (id == null)
-				return null;
-			path = id.toString();
-		}
-		// TODO needs rework for linked resources
-		IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
-		try {
-			IFile file = root.getFile(new Path(path));
-			// IFile file = root.getFileForLocation(new Path(path));
-			return file;
-		} catch (Exception ex) {
-			return null;
-		}
-	}
-
-	/**
-	 * 
-	 * @param model
-	 * @return null if can't find project for the model
-	 */
-	public static IProject getProjectFor(IStructuredModel model) {
-		IProject project = null;
-
-		IFile file = getFileFor(model);
-		if (file != null) {
-			project = file.getProject();
-		}
-		return project;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/UriAdapterFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/UriAdapterFactory.java
deleted file mode 100644
index 4bad85a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/UriAdapterFactory.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.utils;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IAdapterFactory;
-import org.eclipse.wst.sse.core.internal.util.URIResolver;
-
-/**
- * @author mengbo comment go to Window - Preferences - Java - Code Style - Code
- *         Templates
- */
-public class UriAdapterFactory implements IAdapterFactory {
-	/** Create the logger for this class */
-	//private static Logger _log = PDPlugin.getLogger(UriAdapterFactory.class);
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.runtime.IAdapterFactory#getAdapter(java.lang.Object,
-	 *      java.lang.Class)
-	 */
-	public Object getAdapter(Object adaptableObject, Class adapterType) {
-		if (URIResolver.class.equals(adapterType)) {
-			IProject project = (IProject) adaptableObject;
-			URIResolver fProjectResolver = new ProjectResolver(project);
-			return fProjectResolver;
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.runtime.IAdapterFactory#getAdapterList()
-	 */
-	public Class[] getAdapterList() {
-		Class[] classes = new Class[1];
-		classes[0] = URIResolver.class;
-		return classes;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/WebAppUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/WebAppUtil.java
deleted file mode 100644
index 87324f0..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/WebAppUtil.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.utils;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.jst.j2ee.internal.web.deployables.WebDeployableArtifactUtil;
-import org.eclipse.jst.jsf.common.ui.IFileFolderConstants;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.wst.common.componentcore.ComponentCore;
-import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
-import org.eclipse.wst.common.componentcore.resources.IVirtualResource;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class WebAppUtil {
-	private final static String FACES_SERVLET_NAME = "javax.faces.webapp.FacesServlet"; //$NON-NLS-1$
-
-	/**
-	 * @param url
-	 * @param openedFile
-	 * @return the transformed url
-	 */
-	public static String transformJSPURL(String url, IFile openedFile) {
-		boolean canSupportJSF = JSPUtil.supportTaglib(
-				ITLDConstants.URI_JSF_HTML, openedFile);
-		if (canSupportJSF
-				&& url != null
-				&& url.endsWith(IFileFolderConstants.DOT
-						+ IFileFolderConstants.EXT_JSP)) {
-			String urlPattern = ""; //$NON-NLS-1$
-			IVirtualResource[] resources = ComponentCore
-					.createResources(openedFile);
-			IVirtualComponent component = null;
-			if (resources[0] != null) {
-				component = resources[0].getComponent();
-			}
-			if (component != null) {
-				urlPattern = WebDeployableArtifactUtil.getServletMapping(
-						openedFile.getProject(), true, FACES_SERVLET_NAME,
-						component.getName());
-			}
-			if (urlPattern.lastIndexOf(IFileFolderConstants.DOT) != -1) {
-				String extension = urlPattern.substring(urlPattern
-						.lastIndexOf(IFileFolderConstants.DOT));
-				url = url.substring(0, url.lastIndexOf(IFileFolderConstants.DOT
-						+ IFileFolderConstants.EXT_JSP))
-						+ extension;
-			}
-		}
-		return url;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/XMLUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/XMLUtil.java
deleted file mode 100644
index 7638cd4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/XMLUtil.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.utils;
-
-/**
- * @author mengbo
- */
-
-import java.io.IOException;
-import java.io.OutputStream;
-
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.transform.OutputKeys;
-import javax.xml.transform.Source;
-import javax.xml.transform.Transformer;
-import javax.xml.transform.TransformerConfigurationException;
-import javax.xml.transform.TransformerException;
-import javax.xml.transform.TransformerFactory;
-import javax.xml.transform.TransformerFactoryConfigurationError;
-import javax.xml.transform.dom.DOMSource;
-import javax.xml.transform.stream.StreamResult;
-
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.w3c.dom.Document;
-
-/**
- * 
- *
- */
-public class XMLUtil {
-	private static Logger _log = PDPlugin.getLogger(XMLUtil.class);
-
-	/**
-	 * Returns a DocumentBuilder capable of creating a DOM Document from input.
-	 * 
-	 * @return a new instance of a document builder or null if an exception
-	 * occurs on creation
-	 */
-	public synchronized static DocumentBuilder getDocumentBuilder() {
-		DocumentBuilder result = null;
-		try {
-			result = DocumentBuilderFactory.newInstance().newDocumentBuilder();
-		} catch (ParserConfigurationException e) {
-			// "Error in create documentBuilder"
-			_log.info("XMLUtil.Error.0", e); //$NON-NLS-1$
-		}
-		return result;
-	}
-
-	/**
-	 * Transforms a DOM document into a lightly-formatted UTF-8 represntation
-	 * and outputs it to an outputstream
-	 * 
-	 * @param document
-	 * @param ostream
-	 * @throws IOException
-	 */
-	public static void serialize(Document document, OutputStream ostream)
-			throws IOException {
-		Source domSource = new DOMSource(document);
-		try {
-			Transformer serializer = TransformerFactory.newInstance()
-					.newTransformer();
-			try {
-				serializer.setOutputProperty(OutputKeys.INDENT, "yes"); //$NON-NLS-1$
-				serializer.setOutputProperty(
-						"{http://xml.apache.org/xslt}indent-amount", "4"); //$NON-NLS-1$ //$NON-NLS-2$
-				serializer.setOutputProperty(OutputKeys.ENCODING, "UTF-8"); //$NON-NLS-1$
-			} catch (IllegalArgumentException e) {
-				// "Error in object persistance:"
-				_log.info("XMLUtil.Error.2", e); //$NON-NLS-1$
-			}
-			serializer.transform(domSource, new StreamResult(ostream));
-		} catch (TransformerConfigurationException e) {
-			// "Error in object persistance:"
-			_log.info("XMLUtil.Error.2", e); //$NON-NLS-1$
-			throw new IOException(e.getMessage());
-		} catch (TransformerFactoryConfigurationError e) {
-			// "Error in object persistance:"
-			_log.info("XMLUtil.Error.2", e); //$NON-NLS-1$
-			throw new IOException(e.getMessage());
-		} catch (TransformerException e) {
-			// "Error in object persistance:"
-			_log.info("XMLUtil.Error.2", e); //$NON-NLS-1$
-			throw new IOException(e.getMessage());
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/ActionData.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/ActionData.java
deleted file mode 100644
index e0c1afa..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/ActionData.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.validation.caret;
-
-/**
- * This method represents a user action, the 'data' could be any related
- * data that will be referenced later in the action processing. For example.
- * when user does a DnD, the localData will be referenced as _data.
- * 
- * @author mengbo
- */
-public class ActionData {
-	/**
-	 * Action type for palette drag and drop
-	 */
-	public static final int PALETTE_DND = 1;
-
-	/**
-	 * Action type for databinding drag and drop
-	 */
-	public static final int DATABINDING_DND = 2;
-
-	/**
-	 * Action type for other drag and  drop
-	 */
-	public static final int OTHER_DND = 3;
-
-	/**
-	 * Action type for key board navigation
-	 */
-	public static final int KEYBOARD_NAVAGATION = 4;
-
-	/**
-	 * Action type for inline editing
-	 */
-	public static final int INLINE_EDIT = 5;
-
-	/**
-	 * Action type for component move
-	 */
-	public static final int COMPONENT_MOVE = 6;
-
-	/**
-	 * Unknown action type (?)
-	 */
-	public static final int UNKNOWN = 0;
-
-	private final int _actionType;
-
-	private final Object _data;
-
-	/**
-	 * @param action 
-	 * @param data 
-	 */
-	public ActionData(int action, Object data) {
-		_actionType = action;
-		if (data != null) {
-			_data = data;
-		} else {
-			_data = new Object();
-		}
-	}
-
-	/**
-	 * @return Returns the _actionType.
-	 */
-	public final int getActionType() {
-		return _actionType;
-	}
-
-	/**
-	 * @return Returns the _data.
-	 */
-	public final Object getData() {
-		return _data;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/BasicMovementRule.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/BasicMovementRule.java
deleted file mode 100644
index f1306ce..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/BasicMovementRule.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.validation.caret;
-
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-/*package*/ class BasicMovementRule extends DefaultMovementRule {
-
-	/**
-	 * @param actionData
-	 */
-	public BasicMovementRule(ActionData actionData) {
-		super(actionData);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.validation.caret.IMovementRule#allowsMoveIn(org.eclipse.jst.pagedesigner.validation.caret.Target)
-	 */
-	public boolean allowsMoveIn(Target target) {
-		if (_actionData.getActionType() == ActionData.INLINE_EDIT) {
-			Node node = target.getNode();
-			return EditModelQuery.isText(node) || node.hasChildNodes();
-		}
-		return super.allowsMoveIn(target);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/BasicPositionRule.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/BasicPositionRule.java
deleted file mode 100644
index 3eaa5f0..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/BasicPositionRule.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.validation.caret;
-
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.dom.EditValidateUtil;
-import org.w3c.dom.Node;
-
-/**
- * Deal with widget.
- * 
- * @author mengbo
- */
-/*package*/ class BasicPositionRule extends DefaultPositionRule 
-{
-    private final IPositionMediator _mediator;
-
-	/**
-	 * @param mediator
-	 * @param actionData 
-	 */
-	public BasicPositionRule(IPositionMediator mediator, ActionData actionData) {
-	    super(actionData);
-        _mediator = mediator;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.caret.IPositionRule#hasEditableArea(org.eclipse.gef.EditPart)
-	 */
-	public boolean hasEditableArea(Target target) {
-		if (target == null || target.getPart() == null) {
-			return false;
-		}
-		if (!EditValidateUtil.validNode(target.getNode())) {
-			return false;
-		}
-		if (DefaultPositionRule.isWidget(target.getPart())) {
-			return false;
-		}
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.caret.IPositionRule#isEditable(org.eclipse.gef.EditPart)
-	 */
-	public boolean isEditable(Target target) {
-		if (target.getPart() == null) {
-			return false;
-		}
-		Node node = target.getNode();
-
-		// text is depending on parent.
-		if (EditModelQuery.isText(node)) {
-			return _mediator.isEditable(new Target(node.getParentNode()));
-		}
-		String name = node.getLocalName();
-		// Name is null, the node should not be Element
-		if (name == null && !EditModelQuery.isDocument(node)
-				&& !EditModelQuery.isText(node)) {
-			return false;
-		}
-		// if is widget, return false;
-		if (DefaultPositionRule.isWidget(target.getPart())) {
-			return false;
-		}
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.caret.IPositionRule#canStopHere(org.w3c.dom.Node)
-	 */
-	public boolean canReference(Target target, boolean atRight) {
-		Node node = target.getNode();
-		if (target.getPart() == null || node.getNodeType() != Node.ELEMENT_NODE
-				&& !EditModelQuery.isText(node)) {
-			return false;
-		}
-		return true;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/ContainerMoveInAndOutRule.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/ContainerMoveInAndOutRule.java
deleted file mode 100644
index c953334..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/ContainerMoveInAndOutRule.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.validation.caret;
-
-import java.util.Arrays;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-/*package*/ class ContainerMoveInAndOutRule extends DefaultMovementRule {
-	private static final String[] HTML_CONTAINERS = { IHTMLConstants.TAG_TABLE };
-
-	private static final String[] NONE_HTML_CONTAINERS = {};
-
-	private static final String[] SPECIAL_HTML_CONTAINERS = {
-			IJSFConstants.TAG_OUTPUTLINK, IJSFConstants.TAG_COMMANDLINK,
-			IJSFConstants.TAG_FACET, IJSFConstants.TAG_VERBATIM };
-
-	/**
-	 * @param actionData
-	 */
-	public ContainerMoveInAndOutRule(ActionData actionData) {
-		super(actionData);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.caret.IMovementRule#canEnter(org.w3c.dom.Node)
-	 */
-	public boolean allowsMoveIn(Target target) {
-		Node node = target.getNode();
-		if (node.getLocalName() != null && //
-				(Arrays.asList(HTML_CONTAINERS).contains(node.getLocalName()
-						.toLowerCase())) || //
-				Arrays.asList(NONE_HTML_CONTAINERS).contains(
-						node.getLocalName()) || //
-				Arrays.asList(SPECIAL_HTML_CONTAINERS).contains(
-						node.getLocalName())) {
-			return false;
-		}
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.caret.IMovementRule#canMoveOut(org.eclipse.gef.EditPart)
-	 */
-	public boolean allowsMoveOut(Target target) {
-		Node node = target.getNode();
-		if (EditModelQuery.isDocument(node)) {
-			return false;
-		}
-
-		if (_actionData.getActionType() == ActionData.INLINE_EDIT
-				&& (IHTMLConstants.TAG_TD.equalsIgnoreCase(node.getLocalName()) || IHTMLConstants.TAG_TH
-						.equalsIgnoreCase(node.getLocalName()))) {
-			return false;
-		}
-		if (node.getLocalName() != null && //
-				(Arrays.asList(HTML_CONTAINERS).contains(node.getLocalName()
-						.toLowerCase())) || //
-				Arrays.asList(NONE_HTML_CONTAINERS).contains(
-						node.getLocalName())) {
-			return false;
-		}
-
-		if (node.getLocalName() != null
-				&& (Arrays.asList(
-						RootContainerPositionRule.HTML_ROOT_CONTAINERS)
-						.contains(node.getLocalName().toLowerCase()) || //
-				Arrays.asList(JSFRootContainerPositionRule.JSF_ROOT_CONTAINERS)
-						.contains(node.getLocalName()))) {
-			if (!EditModelQuery.isChild(
-					JSFRootContainerPositionRule.JSF_ROOT_CONTAINERS, node,
-					false, true)
-					&& //
-					!EditModelQuery.isChild(
-							RootContainerPositionRule.HTML_ROOT_CONTAINERS,
-							node, true, true)) {
-				return false;
-			}
-		}
-		return true;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/DefaultMovementRule.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/DefaultMovementRule.java
deleted file mode 100644
index 1aaab7c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/DefaultMovementRule.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.validation.caret;
-
-/**
- * @author mengbo
- */
-/*package*/ class DefaultMovementRule implements IMovementRule {
-	ActionData _actionData;
-
-	/**
-	 * @param actionData 
-	 * 
-	 */
-	public DefaultMovementRule(ActionData actionData) {
-		super();
-		_actionData = actionData;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.validation.caret.IMovementRule#allowsMoveIn(org.eclipse.jst.pagedesigner.validation.caret.Target)
-	 */
-	public boolean allowsMoveIn(Target target) {
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.validation.caret.IMovementRule#allowsMoveOut(org.eclipse.jst.pagedesigner.validation.caret.Target)
-	 */
-	public boolean allowsMoveOut(Target target) {
-		return true;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/DefaultPositionRule.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/DefaultPositionRule.java
deleted file mode 100644
index 40e8222..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/DefaultPositionRule.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.validation.caret;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.jst.pagedesigner.dom.DOMRefPosition;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.parts.NodeEditPart;
-
-/**
- * @author mengbo
- */
-public class DefaultPositionRule implements IPositionRule {
-
-	private ActionData _actionData;
-
-	/**
-	 * @param actionData 
-	 * 
-	 */
-	public DefaultPositionRule(ActionData actionData) {
-		super();
-		if (actionData != null) {
-			_actionData = actionData;
-		} else {
-			_actionData = new ActionData(ActionData.UNKNOWN, new Object());
-		}
-	}
-
-    /**
-     * @return the action data
-     */
-    protected final ActionData getActionData()
-    {
-        return _actionData;
-    }
-    
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.caret.IPositionRule#hasEditableArea(org.w3c.dom.Node)
-	 */
-	public boolean hasEditableArea(Target target) {
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.caret.IPositionRule#isEditable(org.eclipse.gef.EditPart)
-	 */
-	public boolean isEditable(Target target) {
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.caret.IPositionRule#isTransparent(org.eclipse.gef.EditPart,
-	 *      org.eclipse.draw2d.geometry.Point)
-	 */
-	public boolean canReference(Target target, boolean atRight) {
-		return true;
-	}
-
-	/**
-	 * If container is inEditable and can be referenced, the position is
-	 * invalid, otherwise as default the position is valid. (non-Javadoc)
-	 */
-	public boolean isValidPosition(IDOMPosition position) {
-		boolean result = isEditable(new Target(position.getContainerNode()));
-		if (result) {
-			if (position.getOffset() == 0
-					|| position.getOffset() == position.getContainerNode()
-							.getChildNodes().getLength()) {
-				result = true;
-			} else {
-				boolean dir;
-				Target target = null;
-				if (position instanceof DOMRefPosition) {
-					target = new Target(((DOMRefPosition) position)
-							.getReferenceNode());
-					dir = ((DOMRefPosition) position).isForward();
-					result = canReference(target, dir);
-				}
-			}
-		}
-		return result;
-	}
-    
-    /**
-     * @param host
-     * @return true if the host edit part is a widget
-     */
-     public static boolean isWidget(EditPart host) {
-        if (host instanceof NodeEditPart) {
-            return ((NodeEditPart) host).isWidget();
-        }
-        return false;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/DefaultPositionValidator.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/DefaultPositionValidator.java
deleted file mode 100644
index 6c45a83..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/DefaultPositionValidator.java
+++ /dev/null
@@ -1,234 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.validation.caret;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.jst.pagedesigner.dom.DOMPositionHelper;
-import org.eclipse.jst.pagedesigner.dom.EditHelper;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.parts.DocumentEditPart;
-import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
-import org.w3c.dom.Document;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-/*package*/ class DefaultPositionValidator implements IPositionMediator {
-	private List<IValidationRule> _rules = new ArrayList<IValidationRule>();
-
-	/**
-	 * the validator's action data
-	 */
-	protected final ActionData _actionData;
-
-	/**
-	 * @return Returns the _actionData.
-	 */
-	public ActionData getActionData() {
-		return _actionData;
-	}
-
-	/**
-	 * @param actionData 
-	 */
-	protected DefaultPositionValidator(ActionData actionData) {
-		_actionData = actionData;
-		initRules();
-	}
-
-	/**
-	 * initialize the default rules
-	 */
-	protected void initRules() {
-		_rules.clear();
-		addRule(new BasicPositionRule(this, _actionData));
-        addRule(new IETablePositionRule(_actionData));
-        addRule(new RootContainerPositionRule(_actionData));
-        addRule(new JSFRootContainerPositionRule(_actionData));
-        addRule(new WhitespacePositionMoveRule(_actionData));
-	}
-
-	/**
-	 * @return Returns the _rules.
-	 */
-	public List getRules() {
-		return Collections.unmodifiableList(_rules);
-	}
-
-	/**
-	 * @param rule
-	 */
-	protected void addRule(IValidationRule rule) {
-		_rules.add(rule);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.caret.IValidator#hasEditableArea(org.w3c.dom.Node)
-	 */
-	public boolean hasEditableArea(Target target) {
-		boolean result = true;
-		List rules = getRules();
-		for (int i = 0, n = rules.size(); i < n; i++) {
-			Object rule = rules.get(i);
-			if (rule instanceof IPositionRule) {
-				result &= ((IPositionRule) rule).hasEditableArea(target);
-			}
-			if (!result) {
-				break;
-			}
-		}
-		return result;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.caret.IValidator#isEditable(org.w3c.dom.Node)
-	 */
-	public boolean isEditable(Target target) {
-		Node node = target.getNode();
-		boolean result = true;
-		List rules = getRules();
-		for (int i = 0, n = rules.size(); i < n; i++) {
-			Object rule = rules.get(i);
-			if (rule instanceof IPositionRule) {
-				result &= ((IPositionRule) rule).isEditable(new Target(node));
-			}
-			if (!result) {
-				break;
-			}
-		}
-		return result;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.caret.IValidator#isValidPosition(org.eclipse.jst.pagedesigner.viewer.DesignPosition)
-	 */
-	public boolean isValidPosition(DesignPosition position) {
-		return isValidPosition(DOMPositionHelper.toDOMPosition(position));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.caret.IValidator#isValidPosition(org.eclipse.jst.pagedesigner.dom.IDOMPosition)
-	 */
-	public boolean isValidPosition(IDOMPosition position) {
-        // if position is really a IDOMRefPosition, convert it to DOMPosition
-		position = EditHelper.ensureDOMPosition(position);
-		boolean refLeft = true, refRight = true, result = true;
-		if (position == null) {
-			return false;
-		}
-		List rules = getRules();
-		for (int i = 0, n = rules.size(); i < n; i++) {
-			Object rule = rules.get(i);
-            
-            // rule may be an IValidationRule that is not a position rule
-            // so only use those that are actually position rules
-			if (rule instanceof IPositionRule) {
-                // the IDOMPosition represents a position somewhere in a parent
-                // node based on a node list index.  We need to verify that the
-                // parent is editable.
-				result &= ((IPositionRule) rule).isEditable(new Target(position
-						.getContainerNode()));
-				if (result) {
-					if (!position.isText()) {
-
-                        // TODO C.B: no sure what the point is here.  It appears
-                        // as though it is validating whether the sibling either
-                        // side of this position is a valid location for this 
-                        // action
-                        
-						// ref1?
-						Node node = EditModelQuery.getInstance().getSibling(
-								position, true);
-						if (node != null & refLeft) {
-							refLeft &= ((IPositionRule) rule).canReference(
-									new Target(node), false);
-						}
-						// ref2?
-						node = EditModelQuery.getInstance().getSibling(
-								position, false);
-						if (node != null & refRight) {
-							refRight = ((IPositionRule) rule).canReference(
-									new Target(node), true);
-						}
-						if (!(refLeft | refRight)) {
-							result = false;
-							break;
-						}
-					}
-				} else {
-					break;
-				}
-				// }
-			}
-		}
-		return (result & (refLeft | refRight));
-	}
-
-	/**
-	 * Adjust the position to an editable area.
-	 */
-	public EditPart getEditableContainer(Target target) {
-		EditPart part = target.getPart();
-		if (hasEditableArea(target)) {
-			return target.getPart();
-		}
-		while (part != null && !(part instanceof DocumentEditPart)) {
-			if (hasEditableArea(target)) {
-				break;
-			}
-			part = part.getParent();
-			target = new Target(part);
-		}
-		if (part instanceof DocumentEditPart
-				&& RootContainerPositionRule.hasBasicContainers((Document) part
-						.getModel())) {
-			Node node = RootContainerPositionRule
-					.getBasicContainer((Document) part.getModel());
-			part = Target.resolvePart(node);
-		}
-		return part;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.caret.IValidator#canReference(org.w3c.dom.Node)
-	 */
-	public boolean canReference(Target target, boolean atRight) {
-		boolean result = true;
-		List rules = getRules();
-		for (int i = 0, n = rules.size(); i < n; i++) {
-			Object rule = rules.get(i);
-			if (rule instanceof IPositionRule) {
-				result &= ((IPositionRule) rule).canReference(target, atRight);
-			}
-			if (!result) {
-				break;
-			}
-		}
-		return result;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/DnDPositionValidator.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/DnDPositionValidator.java
deleted file mode 100644
index 6fddc52..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/DnDPositionValidator.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.validation.caret;
-
-/**
- * This validator is used for caret positioning when user do drag & drop on the
- * screen.
- * 
- * @author mengbo
- * TODO: is this class complete?
- */
-public class DnDPositionValidator extends DefaultPositionValidator {
-    //TODO: not used
-//	private static DnDPositionValidator _instance;
-//
-//	private ActionData _data;
-
-	/**
-	 * @param actionData
-	 */
-	public DnDPositionValidator(ActionData actionData) {
-		super(actionData);
-	}
-
-    /**
-     * Override to make adding rules public on Dnd validators
-     */
-    public void addRule(IValidationRule rule) 
-    {
-        super.addRule(rule);
-    }
-    
-    
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/DropActionData.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/DropActionData.java
deleted file mode 100644
index 0d3f211..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/DropActionData.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.validation.caret;
-
-import java.util.Collections;
-import java.util.List;
-
-/**
- * An action data for object drops
- * @author cbateman
- *
- */
-public class DropActionData extends ActionData
-{
-    /**
-     * @param action
-     * @param data
-     */
-    public DropActionData(int action, DropData data ) 
-    {
-        super(action, data);
-    }
-
-    /**
-     * @return the drop data or  null if none
-     */
-    public DropData getDropData()
-    {
-        return (DropData) getData();
-    }
-    
-    /**
-     * Encapsulates the tags to be dropped
-     *
-     */
-    public static class DropData
-    {
-        private final List    _tagIds;
-        
-        /**
-         * @param tagIds
-         */
-        public DropData(List tagIds)
-        {
-            _tagIds = Collections.unmodifiableList(tagIds);
-        }
-        
-        /**
-         * @return the list of tag ids being dropped.  List
-         * is unmodifiable
-         */
-        public List getTagIdentifiers()
-        {
-            return _tagIds;
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/HeadDataPositionRule.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/HeadDataPositionRule.java
deleted file mode 100644
index ed2fcae..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/HeadDataPositionRule.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.validation.caret;
-
-/**
- * Ensure the DnD for loadBundle or taglib is in head area.
- * 
- * @author mengbo
- */
-/*package*/ class HeadDataPositionRule extends DefaultPositionRule {
-
-	/**
-	 * @param data
-	 */
-	public HeadDataPositionRule(ActionData data) {
-		super(data);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/IEPanelgridPositionRule.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/IEPanelgridPositionRule.java
deleted file mode 100644
index df41805..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/IEPanelgridPositionRule.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.validation.caret;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.w3c.dom.Node;
-
-/**
- * In some place, wen can't do inline editing, like the area between td, in
- * panelGrid, etc. In these places we can't place caret
- * 
- * @author mengbo
- */
-/*package*/ class IEPanelgridPositionRule extends DefaultPositionRule {
-	/**
-	 * @param actionData
-	 */
-	public IEPanelgridPositionRule(ActionData actionData) {
-		super(actionData);
-	}
-
-	/**
-	 * PanelGrid is not editable.
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.validation.caret.IPositionRule#isEditable(Target)
-	 */
-	public boolean isEditable(Target target) {
-		Node node = target.getNode();
-		return !EditModelQuery.isChild(new String[] {
-				IJSFConstants.TAG_PANELGRID, IJSFConstants.TAG_DATATABLE },
-				node, false, false);
-	}
-
-	public boolean hasEditableArea(Target target) {
-		Node node = target.getNode();
-		return !EditModelQuery.isChild(new String[] {
-				IJSFConstants.TAG_PANELGRID, IJSFConstants.TAG_DATATABLE },
-				node, false, false);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/IETablePositionRule.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/IETablePositionRule.java
deleted file mode 100644
index f93405c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/IETablePositionRule.java
+++ /dev/null
@@ -1,187 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.validation.caret;
-
-import java.util.Arrays;
-import java.util.List;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.dom.EditValidateUtil;
-import org.w3c.dom.Node;
-
-/**
- * This rule constains the operation within a table: 1. The inputing position
- * can only be in 'td' 2. Table structure must be valid.
- * 
- * @author mengbo
- */
-public class IETablePositionRule extends DefaultPositionRule {
-	// We will introduce validation based on DtD later, this is not final
-	// solution.
-	private final String[] CONTAINER = { IHTMLConstants.TAG_THEAD,
-			IHTMLConstants.TAG_TBODY, IHTMLConstants.TAG_TFOOT };
-
-	/**
-	 * @param actionData 
-	 */
-	public IETablePositionRule(ActionData actionData) {
-		super(actionData);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.caret.IPositionRule#hasEditableArea(org.eclipse.jst.pagedesigner.caret.Target)
-	 */
-	public boolean hasEditableArea(Target target) {
-		if (EditModelQuery.isChild(IHTMLConstants.TAG_TABLE, target.getNode(),
-				true)) {
-			if (target.getPart() == null) {
-				return false;
-			}
-			Node node = target.getNode();
-			// The target must be in a valid table structure.
-			String name = node.getLocalName();
-			if (node.hasChildNodes()) {
-				// for constrained container, depends on its children.
-				if (name != null
-						&& (IHTMLConstants.TAG_TABLE.equalsIgnoreCase(name) || //
-								Arrays.asList(CONTAINER).contains(
-										name.toLowerCase()) || //
-						IHTMLConstants.TAG_TR.equalsIgnoreCase(name))) {
-					List children = target.getPart().getChildren();
-					for (int i = 0, n = children.size(); i < n; i++) {
-						if (hasEditableArea(new Target((EditPart) children
-								.get(i)))) {
-							return true;
-						}
-					}
-					return false;
-				}
-			} else {
-				if (!isEditable(new Target(node))) {
-					return false;
-				}
-			}
-		}
-		return super.hasEditableArea(target);
-	}
-
-	/**
-	 * Used to valid the structure of table, later will use dtd to do that.
-	 * @param container 
-	 * @return true if the table is valid
-	 */
-	public boolean isInValidTable(Node container) {
-		boolean result = false;
-		try {
-			if (EditValidateUtil.validNode(container)) {
-				if (EditModelQuery.isText(container)) {
-					container = container.getParentNode();
-				}
-				String name = container.getLocalName();
-				if (EditModelQuery.isChild(IHTMLConstants.TAG_TABLE, container,
-						true)) {
-					List ancestors = EditModelQuery.getAncestors(container,
-							IHTMLConstants.TAG_TABLE, true);
-					int offset = ancestors.size();
-					// remove 'table'
-					Node temp = (Node) ancestors.remove(offset - 1);
-					if (temp == container) {
-						return true;
-					}
-					offset--;
-					result = checkValidTrTd(ancestors, container);
-					if (!result) {
-						// thead->tr->td
-						temp = (Node) ancestors.get(offset - 1);
-						name = temp.getNodeName();
-						if (Arrays.asList(CONTAINER).contains(
-								name.toLowerCase())) {
-							if (temp == container) {
-								result = true;
-							} else {
-								// remove 'thead'
-								ancestors.remove(offset - 1);
-								offset--;
-								result = checkValidTrTd(ancestors, container);
-							}
-						}
-					}
-				}
-			}
-			return result;
-		} catch (Exception e) {
-			// The exception means the structure is not a valid table, don't
-			// need to report.
-			return false;
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.caret.IPositionRule#isEditable(org.eclipse.jst.pagedesigner.caret.Target)
-	 */
-	public boolean isEditable(Target target) {
-		if (EditModelQuery.isChild(IHTMLConstants.TAG_TABLE, target.getNode(),
-				false)) {
-			if (isInValidTable(target.getNode())) {
-				List ancestors = EditModelQuery.getAncestors(target.getNode(),
-						IHTMLConstants.TAG_TABLE, true);
-				if (ancestors.size() >= 3) {
-					if (IHTMLConstants.TAG_TH
-							.equalsIgnoreCase(((Node) ancestors.get(ancestors
-									.size() - 3)).getNodeName())
-							|| //
-							IHTMLConstants.TAG_TD
-									.equalsIgnoreCase(((Node) ancestors
-											.get(ancestors.size() - 3))
-											.getNodeName())) {
-						return true;
-					} else if (ancestors.size() >= 4 //
-							&& (IHTMLConstants.TAG_TH
-									.equalsIgnoreCase(((Node) ancestors
-											.get(ancestors.size() - 4))
-											.getNodeName()) || //
-							IHTMLConstants.TAG_TD
-									.equalsIgnoreCase(((Node) ancestors
-											.get(ancestors.size() - 4))
-											.getNodeName()))) {
-						return true;
-					}
-				}
-			}
-			return false;
-		}
-		return super.isEditable(target);
-	}
-
-	private boolean checkValidTrTd(List ancestors, Node node) {
-		int offset = ancestors.size();
-		if (IHTMLConstants.TAG_TR.equalsIgnoreCase(((Node) ancestors
-				.get(offset - 1)).getLocalName())) {
-			if (ancestors.get(offset - 1) == node) {
-				return true;
-			} else if (IHTMLConstants.TAG_TH.equalsIgnoreCase(((Node) ancestors
-					.get(offset - 2)).getLocalName())
-					|| //
-					IHTMLConstants.TAG_TD.equalsIgnoreCase(((Node) ancestors
-							.get(offset - 2)).getLocalName())) {
-				return true;
-			}
-		}
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/IMovementMediator.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/IMovementMediator.java
deleted file mode 100644
index 8c1fccd..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/IMovementMediator.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.validation.caret;
-
-import org.eclipse.gef.EditPart;
-
-/**
- * @author mengbo
- */
-public interface IMovementMediator extends IPositionMediator {
-	/**
-	 * @param target
-	 * @return true if mediator allows movment in
-	 */
-	public boolean allowsMoveIn(Target target);
-
-	/**
-	 * @param target
-	 * @return true if mediator allows movement out
-	 */
-	public boolean allowsMoveOut(Target target);
-
-	/**
-	 * Return a closest parent part which is editable, and it can't moveout.
-	 * 
-	 * @param target
-	 * @return if taget part is editable, then returns itself.
-	 */
-	public EditPart getConstainedEditableContainer(Target target);
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/IMovementRule.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/IMovementRule.java
deleted file mode 100644
index 90377a8..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/IMovementRule.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.validation.caret;
-
-/**
- * @author mengbo
- */
-public interface IMovementRule extends IValidationRule {
-	/**
-	 * @param target
-	 * @return true if allows move in
-	 */
-	public boolean allowsMoveIn(Target target);
-
-	/**
-	 * @param target
-	 * @return true allows move out
-	 */
-	public boolean allowsMoveOut(Target target);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/IPositionMediator.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/IPositionMediator.java
deleted file mode 100644
index 235a164..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/IPositionMediator.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.validation.caret;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
-
-/**
- * @author mengbo
- */
-public interface IPositionMediator {
-	/**
-	 * @return this mediator's action data
-	 */
-	public ActionData getActionData();
-
-	/**
-	 * To see if the node itself or its descendent is editable.
-	 * 
-	 * @param target
-	 * @return true if the target has editable area
-	 */
-	public boolean hasEditableArea(Target target);
-
-	/**
-	 * To see if the position is valid.
-	 * 
-	 * @param position
-	 * @return true if position is  valid
-	 */
-	public boolean isValidPosition(IDOMPosition position);
-
-	/**
-	 * @param position
-	 * @return true if position is valid
-	 */
-	public boolean isValidPosition(DesignPosition position);
-
-	/**
-	 * To see if the node is editable.
-	 * 
-	 * @param target
-	 * @return true if target is editable
-	 */
-	public boolean isEditable(Target target);
-
-	/**
-	 * @param target
-	 * @param atRight
-	 * @return true if can reference target
-	 */
-	public boolean canReference(Target target, boolean atRight);
-
-	/**
-	 * Return a node which contains 'node', and it has editable area.
-	 * 
-	 * @param target
-	 * @return if part is editable, then itself is returned, otherwise a parent
-	 *         is returned.
-	 */
-	public EditPart getEditableContainer(Target target);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/IPositionRule.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/IPositionRule.java
deleted file mode 100644
index 6088e1e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/IPositionRule.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.validation.caret;
-
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-
-/**
- * @author mengbo
- */
-public interface IPositionRule extends IValidationRule {
-	/**
-	 * To see if the node is editable. For inline editing, this means whether
-	 * can we input something into the target. For DnD, this means whether can
-	 * we drag and drop something into it.
-	 * 
-	 * @param target
-	 * @return true if target is editable
-	 */
-	public boolean isEditable(Target target);
-
-	/**
-	 * To see if the node itself or its descendent is editable.
-	 * 
-	 * @param target
-	 * @return true if target is editable
-	 */
-	public boolean hasEditableArea(Target target);
-
-	/**
-	 * Whether can we place caret against this part's border. Some container we
-	 * are consider white box, and whitespace may not be suitable for caret
-	 * reference.
-	 * 
-	 * @param target
-	 * @param atRight
-	 *            TODO
-	 * @return true if can reference target
-	 */
-	public boolean canReference(Target target, boolean atRight);
-
-	/**
-	 * To see if the position is valid. Please note, the container is editable
-	 * means there is a child area whithin it is editable, the position may be
-	 * in an inEditable place. So this method is different from hasEditableArea
-	 * and isEditable.
-	 * 
-	 * @param position
-	 * @return true if position is valid
-	 */
-	public boolean isValidPosition(IDOMPosition position);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/IValidationRule.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/IValidationRule.java
deleted file mode 100644
index 296d02b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/IValidationRule.java
+++ /dev/null
@@ -1,19 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.validation.caret;
-
-/**
- * @author mengbo
- */
-public interface IValidationRule {
-    // TODO: tagging interface?
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/InlineEditingNavigationMediator.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/InlineEditingNavigationMediator.java
deleted file mode 100644
index c1c1115..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/InlineEditingNavigationMediator.java
+++ /dev/null
@@ -1,190 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.validation.caret;
-
-import java.util.List;
-
-import org.eclipse.draw2d.Viewport;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.GraphicalViewer;
-import org.eclipse.gef.editparts.ScalableRootEditPart;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.parts.DocumentEditPart;
-import org.eclipse.jst.pagedesigner.tools.ExposeHelper;
-import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Document;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public class InlineEditingNavigationMediator extends
-		InlineEditingPositionMediator implements IMovementMediator {
-
-	/**
-	 * @param actionData
-	 */
-	public InlineEditingNavigationMediator(ActionData actionData) {
-		super(actionData);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.caret.DefaultPositionValidator#initRules(org.eclipse.jst.pagedesigner.caret.ActionData)
-	 */
-	protected void initRules() {
-		super.initRules();
-		this.addRule(new ContainerMoveInAndOutRule(_actionData));
-		this.addRule(new BasicMovementRule(_actionData));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.caret.IMovementValidator#allowsMoveIn(org.eclipse.gef.EditPart)
-	 */
-	public boolean allowsMoveIn(Target target) {
-		boolean result = true;
-		List _rules = getRules();
-		for (int i = 0, n = _rules.size(); i < n; i++) {
-			Object rule = _rules.get(i);
-			if (rule instanceof IMovementRule) {
-				result &= ((IMovementRule) rule).allowsMoveIn(target);
-			} else if (rule instanceof IPositionRule) {
-				result &= ((IPositionRule) rule).hasEditableArea(target);
-			}
-			if (!result) {
-				break;
-			}
-		}
-		return result;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.caret.IMovementValidator#allowsMoveOut(org.eclipse.gef.EditPart)
-	 */
-	public boolean allowsMoveOut(Target target) {
-		boolean result = true;
-		List _rules = getRules();
-		for (int i = 0, n = _rules.size(); i < n; i++) {
-			Object rule = _rules.get(i);
-			if (rule instanceof IMovementRule) {
-				result &= ((IMovementRule) rule).allowsMoveOut(target);
-			}
-			if (!result) {
-				break;
-			}
-		}
-		return result;
-	}
-
-	/**
-	 * @param target 
-	 * @return ? 
-	 */
-	public EditPart getRootConstainedEditableContainer(Target target) {
-		// if (EditModelQuery.isDocument(target.getNode()))
-		// {
-		// return target.getPart();
-		// }
-		EditPart part = target.getPart();
-		while (part != null) {
-			if (hasEditableArea(target) && !allowsMoveOut(target)) {
-				break;
-			}
-			part = part.getParent();
-			target = new Target(part);
-		}
-		if (part instanceof DocumentEditPart
-				&& RootContainerPositionRule.hasBasicContainers((Document) part
-						.getModel())) {
-			Node node = RootContainerPositionRule
-					.getBasicContainer((Document) part.getModel());
-			part = Target.resolvePart(node);
-		}
-
-		return part;
-	}
-
-	/**
-	 * @see org.eclipse.jst.pagedesigner.validation.caret.IMovementMediator#getConstainedEditableContainer(org.eclipse.jst.pagedesigner.validation.caret.Target)
-	 */
-	public EditPart getConstainedEditableContainer(Target target) {
-		EditPart part = target.getPart();
-		while (part != null) {
-			if (hasEditableArea(target)) {
-				break;
-			}
-			part = part.getParent();
-			target = new Target(part);
-		}
-		if (part instanceof DocumentEditPart
-				&& RootContainerPositionRule.hasBasicContainers((Document) part
-						.getModel())) {
-			Node node = RootContainerPositionRule
-					.getBasicContainer((Document) part.getModel());
-			part = Target.resolvePart(node);
-		}
-		return part;
-	}
-
-	/**
-	 * @param position 
-	 * @param p 
-	 * @param viewer 
-	 * @return the constrained editable container or null if none found for the arguments
-	 * @see org.eclipse.jst.pagedesigner.validation.caret.IMovementMediator#getConstainedEditableContainer(org.eclipse.jst.pagedesigner.validation.caret.Target)
-	 */
-	public EditPart getConstainedEditableContainer(DesignPosition position,
-			Point p, GraphicalViewer viewer) {
-		Rectangle rect = new Rectangle(p.x, p.y, 1, 1);
-		Viewport port = ((IHTMLGraphicalViewer) viewer).getViewport();
-
-		Point viewLocation = port.getViewLocation();
-		Point lastLocation = viewLocation.getCopy();
-		new ExposeHelper((IHTMLGraphicalViewer) viewer).exposeArea(rect);
-		viewLocation = port.getViewLocation();
-		Dimension offset = lastLocation.getDifference(viewLocation);
-
-		p.translate(offset.width, offset.height);
-		EditPart part = viewer.findObjectAt(p);
-		if (part != null && !(part instanceof ScalableRootEditPart)) {
-			while (part != null) {
-				Target target = new Target(part);
-				if (hasEditableArea(target)) {
-					if (allowsMoveIn(target)
-							|| EditModelQuery.isChild(target.getNode(),
-									position.getContainerNode())) {
-						break;
-					}
-				}
-				part = part.getParent();
-			}
-			if (part instanceof DocumentEditPart
-					&& RootContainerPositionRule
-							.hasBasicContainers((Document) part.getModel())) {
-				Node node = RootContainerPositionRule
-						.getBasicContainer((Document) part.getModel());
-				part = Target.resolvePart(node);
-			}
-			return part;
-		}
-        return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/InlineEditingPositionMediator.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/InlineEditingPositionMediator.java
deleted file mode 100644
index 5329586..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/InlineEditingPositionMediator.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.validation.caret;
-
-/**
- * This validtor is used for inline editing, caret positioning with mouse.
- * 
- * @author mengbo
- */
-public class InlineEditingPositionMediator extends DefaultPositionValidator {
-
-	/**
-	 * @param actionData
-	 */
-	public InlineEditingPositionMediator(ActionData actionData) {
-		super(actionData);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.caret.DefaultPositionValidator#initRules()
-	 */
-	protected void initRules() {
-		super.initRules();
-		addRule(new IEPanelgridPositionRule(_actionData));
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/JSFRootContainerPositionRule.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/JSFRootContainerPositionRule.java
deleted file mode 100644
index 7ec0906..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/JSFRootContainerPositionRule.java
+++ /dev/null
@@ -1,157 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.validation.caret;
-
-import java.util.Arrays;
-
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.w3c.dom.Document;
-import org.w3c.dom.Node;
-
-/**
- * Ensure the DnD of jsf component should be within f:view or f:subview.
- * 
- * @author mengbo
- */
-public class JSFRootContainerPositionRule extends DefaultPositionRule {
-    
-    private final static int  DEFAULT_MAX_DEPTH_SEARCH = 3;
-    
-	/**
-	 * TODO: this is not enough because it ignores the uri and keys on only
-	 * the name of the tag.
-	 */
-	/*package*/ static final String[] JSF_ROOT_CONTAINERS = { "view", "subview" }; //$NON-NLS-1$ //$NON-NLS-2$
-
-	/**
-	 * @param actionData
-	 */
-	public JSFRootContainerPositionRule(ActionData actionData) {
-		super(actionData);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.validation.caret.IPositionRule#hasEditableArea(org.eclipse.jst.pagedesigner.validation.caret.Target)
-	 */
-	public boolean hasEditableArea(Target target) {
-		Node node = target.getNode();
-		if (hasBasicContainers(EditModelQuery.getDocumentNode(node),DEFAULT_MAX_DEPTH_SEARCH)) {
-            ActionData actionData = getActionData();
-			if (actionData instanceof DropActionData) {
-                DropActionData dropActionData = (DropActionData) actionData;
-                TagIdentifier tagId = 
-                     (TagIdentifier) dropActionData.getDropData().getTagIdentifiers().get(0);
-                final String uri  = tagId.getUri();
-				if (ITLDConstants.URI_JSF_HTML.equalsIgnoreCase(uri)
-						|| ITLDConstants.URI_JSF_CORE.equalsIgnoreCase(uri)) {
-					boolean result = EditModelQuery.isChild(
-							JSF_ROOT_CONTAINERS, node, true, false);
-					return result
-							|| EditModelQuery.getChild(node,
-									JSF_ROOT_CONTAINERS, 3, false) != null;
-				}
-			} else if (getActionData().getActionType() == ActionData.DATABINDING_DND) {
-				boolean result = EditModelQuery.isChild(JSF_ROOT_CONTAINERS,
-						node, true, false);
-				return result
-						|| EditModelQuery.getChild(node, JSF_ROOT_CONTAINERS, 3,
-								false) != null;
-			}
-		}
-		return super.isEditable(target);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.validation.caret.IPositionRule#isEditable(org.eclipse.jst.pagedesigner.validation.caret.Target)
-	 */
-	public boolean isEditable(Target target) {
-		boolean result = true;
-		Node node = target.getNode();
-		if (hasBasicContainers(EditModelQuery.getDocumentNode(node), DEFAULT_MAX_DEPTH_SEARCH)) {
-            ActionData actionData = getActionData();
-            if (actionData instanceof DropActionData) {
-                DropActionData dropActionData = (DropActionData) actionData;
-                TagIdentifier tagId = 
-                     (TagIdentifier) dropActionData.getDropData().getTagIdentifiers().get(0);
-                final String uri  = tagId.getUri();
-
-				if (ITLDConstants.URI_JSF_HTML.equalsIgnoreCase(uri)
-						|| ITLDConstants.URI_JSF_CORE.equalsIgnoreCase(uri)) {
-					result = EditModelQuery.isChild(JSF_ROOT_CONTAINERS,
-							node, true, false);
-				}
-			} else if (getActionData().getActionType() == ActionData.DATABINDING_DND) {
-				result = EditModelQuery.isChild(JSF_ROOT_CONTAINERS, node,
-						true, false);
-			}
-			return result;
-		}
-		return super.isEditable(target);
-	}
-
-
-	/**
-	 * @param document
-	 * @param maxDepth 
-	 * @return the closest tag called "view" or "subview" to the root of document
-	 * search to a maximum tag depth of maxDepth
-	 */
-	public static Node getBasicContainer(Document document, int maxDepth) {
-		Node node = EditModelQuery.getChild(document, JSF_ROOT_CONTAINERS, maxDepth,
-				false);
-		return node;
-	}
-
-	/**
-	 * We need to see if body, view are there. and they should be at first or
-	 * second level.
-	 * 
-	 * @param document
-	 * @param maxDepth 
-	 * @return true if document has a view and subview limited to a maximum search
-	 * depth of maxDepth
-	 */
-	public static boolean hasBasicContainers(Document document, int maxDepth) {
-		return getBasicContainer(document, maxDepth) != null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.validation.caret.IPositionRule#canReference(org.eclipse.jst.pagedesigner.validation.caret.Target,
-	 *      boolean)
-	 */
-	public boolean canReference(Target target, boolean atRight) {
-		Node node = target.getNode();
-		if (node.getLocalName() != null) {
-            // if the local name of the target is in the list of JSF root
-            // containers
-			if (Arrays.asList(JSF_ROOT_CONTAINERS).contains(
-					node.getLocalName().toLowerCase())) {
-                
-                // verify that either the target is 
-				return EditModelQuery.isChild(
-						RootContainerPositionRule.HTML_ROOT_CONTAINERS, node,
-						false, false)
-						|| EditModelQuery.isChild(JSF_ROOT_CONTAINERS, node,
-								false, false);
-			}
-		}
-		return super.canReference(target, atRight);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/NodeConstructionPositionRule.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/NodeConstructionPositionRule.java
deleted file mode 100644
index 54b389f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/NodeConstructionPositionRule.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.validation.caret;
-
-/**
- * @author mengbo
- */
-public class NodeConstructionPositionRule extends DefaultPositionRule {
-
-	/**
-	 * @param actionData 
-	 */
-	public NodeConstructionPositionRule(ActionData actionData) {
-		super(actionData);
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/RootContainerPositionRule.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/RootContainerPositionRule.java
deleted file mode 100644
index b44bdb1..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/RootContainerPositionRule.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.validation.caret;
-
-import java.util.Arrays;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.w3c.dom.Document;
-import org.w3c.dom.Node;
-
-/**
- * This rule deal with containers 'body', 'head', 'view', 'subview'.
- * 
- * @author mengbo
- */
-public class RootContainerPositionRule extends DefaultPositionRule {
-	static final String[] HTML_ROOT_CONTAINERS = { IHTMLConstants.TAG_BODY, IHTMLConstants.TAG_HEAD };
-
-	/**
-	 * @param actionData
-	 */
-	public RootContainerPositionRule(ActionData actionData) {
-		super(actionData);
-	}
-
-	/**
-	 * 1. If anyone of the three containers exists, the target should be in the
-	 * container. 2. If none of the containers exists, then target will be not
-	 * restricted.
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.validation.caret.IPositionRule#hasEditableArea(org.eclipse.jst.pagedesigner.validation.caret.Target)
-	 */
-	public boolean hasEditableArea(Target target) {
-		EditPart part = target.getPart();
-		if (part == null) {
-			return false;
-		}
-		Node node = target.getNode();
-		if (hasBasicContainers(EditModelQuery.getDocumentNode(node))) {
-			return true;// isWithinBasicContainer(node);
-		}
-		return super.hasEditableArea(target);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.caret.IPositionRule#isEditable(org.eclipse.gef.EditPart)
-	 */
-	public boolean isEditable(Target target) {
-		Node node = target.getNode();
-		if (hasBasicContainers(EditModelQuery.getDocumentNode(node))) {
-			boolean result = isWithinBasicContainer(node);
-			return result;
-		}
-		return super.isEditable(target);
-	}
-
-	/**
-	 * We need to see if body, view are there. and they should be at first or
-	 * second level.
-	 * 
-	 * @param document
-	 * @return true if the document has basic containers
-	 */
-	public static boolean hasBasicContainers(Document document) {
-		return getBasicContainer(document) != null;
-
-	}
-
-	private static boolean isWithinBasicContainer(Node node) {
-		return EditModelQuery.isChild(HTML_ROOT_CONTAINERS, node, true, false);
-	}
-
-	/**
-	 * @param document
-	 * @return the basic root container for the document or null
-	 */
-	public static Node getBasicContainer(Document document) {
-		Node node = EditModelQuery.getChild(document, HTML_ROOT_CONTAINERS, 2,
-				false);
-		if (node == null) {
-			node = EditModelQuery.getChild(document, HTML_ROOT_CONTAINERS, 2,
-					true);
-		}
-		return node;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.validation.caret.IPositionRule#canReference(org.eclipse.jst.pagedesigner.validation.caret.Target,
-	 *      boolean)
-	 */
-	public boolean canReference(Target target, boolean atRight) {
-		Node node = target.getNode();
-		if (node.getLocalName() != null) {
-			if (Arrays.asList(HTML_ROOT_CONTAINERS).contains(
-					node.getLocalName().toLowerCase())) {
-				return EditModelQuery.isChild(
-						JSFRootContainerPositionRule.JSF_ROOT_CONTAINERS, node,
-						false, false);
-			}
-		}
-		return true;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/Target.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/Target.java
deleted file mode 100644
index d680ec9..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/Target.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.validation.caret;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.gef.EditPart;
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.jsf.core.internal.tld.TagIdentifierFactory;
-import org.eclipse.jst.pagedesigner.converter.ITagConverter;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public class Target {
-	private EditPart _part;
-
-	private Node _node;
-
-	/**
-	 * @param part
-	 */
-	public Target(EditPart part) {
-		_part = part;
-        
-        if(part.getModel() instanceof Node)
-        {
-            _node = (Node) part.getModel();        
-        }
-        else if (part.getModel() instanceof ITagConverter)
-        {
-            _node = ((ITagConverter)part.getModel()).getHostElement();
-        }
-        else
-        {
-            Assert.isTrue(false);
-        }
-	}
-
-	/**
-	 * @param node
-	 */
-	public Target(Node node) {
-		_node = node;
-		Assert.isTrue(node instanceof INodeNotifier);
-		if (((INodeNotifier) node).getAdapterFor(EditPart.class) != null) {
-			_part = (EditPart) ((INodeNotifier) node)
-					.getAdapterFor(EditPart.class);
-		}
-	}
-
-	/**
-	 * @return Returns the _node.
-	 */
-	public Node getNode() {
-		return _node;
-	}
-
-	/**
-	 * @return Returns the _part.
-	 */
-	public EditPart getPart() {
-		return _part;
-	}
-
-    /**
-     * @return the target's tag wrapper or null if the target
-     * is not an Element node
-     */
-    public TagIdentifier getTagWrapper()
-    {
-        if (_node instanceof Element)
-        {
-            return TagIdentifierFactory.createDocumentTagWrapper((Element)_node);
-        }
-        
-        return null;
-    }
-    
-	/**
-	 * @param node
-	 * @return the edit part for node or null if none found
-	 */
-	public static EditPart resolvePart(Node node) {
-		if (node instanceof INodeNotifier
-				&& ((INodeNotifier) node).getAdapterFor(EditPart.class) != null) {
-			return (EditPart) ((INodeNotifier) node)
-					.getAdapterFor(EditPart.class);
-		}
-		return null;
-	}
-
-	/**
-	 * @param part
-	 * @return the node for part
-	 */
-	public static Node resolveNode(EditPart part) {
-		return (Node) part.getModel();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/WhitespacePositionMoveRule.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/WhitespacePositionMoveRule.java
deleted file mode 100644
index 79e87c5..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/WhitespacePositionMoveRule.java
+++ /dev/null
@@ -1,147 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.validation.caret;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
-import org.eclipse.jst.pagedesigner.viewer.DesignRefPosition;
-import org.eclipse.jst.pagedesigner.viewer.EditPartPositionHelper;
-import org.w3c.dom.Text;
-
-/**
- * For whitespaces 1. If there is sibling can be reference, then we don't
- * reference whitespace text. 2. Position can't be between whitespace text.
- * 
- * @author mengbo
- */
-public class WhitespacePositionMoveRule extends DefaultPositionRule implements
-		IMovementRule {
-
-	/**
-	 * @param actionData
-	 */
-	public WhitespacePositionMoveRule(ActionData actionData) {
-		super(actionData);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.caret.IMovementRule#canEnter(org.eclipse.gef.EditPart)
-	 */
-	public boolean allowsMoveIn(Target target) {
-		if (EditModelQuery.isTransparentText(target.getNode())) {
-			return false;
-		}
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.caret.IMovementRule#canMoveOut(org.eclipse.gef.EditPart)
-	 */
-	public boolean allowsMoveOut(Target target) {
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.caret.IPositionRule#canReference(org.eclipse.jst.pagedesigner.caret.Target)
-	 */
-	public boolean canReference(Target target, boolean atRight) {
-		boolean result = super.canReference(target, atRight);
-		if (EditModelQuery.isText(target.getNode())) {
-			if (((Text) target.getNode()).getData().length() == 0) {
-				result = false;
-			} else if (EditModelQuery.isTransparentText(target.getNode())) {
-				DesignPosition position = new DesignRefPosition(target
-						.getPart(), atRight);
-				if (EditPartPositionHelper.getConcretePart(position, atRight) != null) {
-					result = true;
-				} else {
-					EditPart part = EditPartPositionHelper.getNextConcretPart(
-							position, atRight);
-					EditPart oppPart = EditPartPositionHelper
-							.getNextConcretPart(position, !atRight);
-					if (part == null) {
-						if (oppPart == null) {
-							result = true;
-						}
-					}
-					result = false;
-				}
-			}
-		}
-		return result;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.caret.IPositionRule#hasEditableArea(org.eclipse.jst.pagedesigner.caret.Target)
-	 */
-	public boolean hasEditableArea(Target target) {
-		if (EditModelQuery.isTransparentText(target.getNode())) {
-			return false;
-		}
-		return super.hasEditableArea(target);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.caret.IPositionRule#isEditable(org.eclipse.jst.pagedesigner.caret.Target)
-	 */
-	public boolean isEditable(Target target) {
-		if (EditModelQuery.isTransparentText(target.getNode())) {
-			return false;
-		}
-		return super.isEditable(target);
-	}
-
-	// /*
-	// * (non-Javadoc)
-	// *
-	// * @see
-	// org.eclipse.jst.pagedesigner.caret.IPositionRule#isValidPosition(org.eclipse.jst.pagedesigner.dom.IDOMPosition)
-	// */
-	// public boolean isValidPosition(IDOMPosition position)
-	// {
-	// Node node = null;
-	// if (position instanceof DOMRefPosition)
-	// {
-	// node = ((DOMRefPosition)position).getReferenceNode();
-	// } else if (position.isText())
-	// {
-	// node = position.getContainerNode();
-	// } else {
-	// return super.isValidPosition(position);
-	// }
-	// if (EditModelQuery.isTransparentText(position.getContainerNode()))
-	// {
-	// if (node.getPreviousSibling() != null)
-	// {
-	// node = node.getPreviousSibling();
-	// return _mediator.canReference(new Target(node), true);
-	// }
-	// else if (node.getNextSibling() != null)
-	// {
-	// node = node.getNextSibling();
-	// return _mediator.canReference(new Target(node), false);
-	// }
-	// }
-	// return super.isValidPosition(position);
-	// }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/AbstractDropLocationStrategy.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/AbstractDropLocationStrategy.java
deleted file mode 100644
index 6dbeb64..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/AbstractDropLocationStrategy.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.viewer;
-
-import java.util.List;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPartViewer;
-import org.eclipse.gef.LayerConstants;
-import org.eclipse.gef.editparts.LayerManager;
-import org.eclipse.gef.requests.DropRequest;
-import org.eclipse.jst.pagedesigner.validation.caret.IPositionMediator;
-
-/**
- * Abstract parent of all concrete client implmentation of IDropLocationStrategy's
- * Clients should sub-class instead of implementing {@link IDropLocationStrategy} directly
- * to avoid future API breakage
- * 
- * @author cbateman
- *
- */
-public abstract class AbstractDropLocationStrategy  implements IDropLocationStrategy 
-{
-    private final EditPartViewer        _viewer;
-    
-    /**
-     * @param viewer
-     */
-    public AbstractDropLocationStrategy(EditPartViewer viewer)
-    {
-        _viewer = viewer;
-    }
-    
-    public abstract DesignPosition calculateDesignPosition(EditPart host, Point p,
-            IPositionMediator validator);
-
-    public abstract List showTargetFeedback(EditPart host, DesignPosition position, DropRequest request);
-
-    /**
-     * @return the viewer in which this strategy may show target feedback
-     */
-    protected final EditPartViewer getViewer() 
-    {
-        return _viewer;
-    }
-    
-    /**
-     * @return the figure for the feedback layer
-     */
-    protected final IFigure getFeedbackLayer()
-    {
-        return LayerManager.Helper.find(_viewer.getRootEditPart().getContents()).getLayer(LayerConstants.FEEDBACK_LAYER);
-    }
-    
-    /**
-     * Adds the specified <code>Figure</code> to the {@link LayerConstants#FEEDBACK_LAYER}.
-     * @param figure the feedback to add
-     */
-    protected void addFeedback(IFigure figure) {
-        getFeedbackLayer().add(figure);
-    }
-    
-    /**
-     * Removes the specified <code>Figure</code> to the {@link LayerConstants#FEEDBACK_LAYER}.
-     * @param figure the feedback to remove
-     */
-    protected void removeFeedback(IFigure figure) {
-        getFeedbackLayer().remove(figure);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/CaretPositionResolver.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/CaretPositionResolver.java
deleted file mode 100644
index 27aae69..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/CaretPositionResolver.java
+++ /dev/null
@@ -1,328 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.viewer;
-
-import java.util.List;
-
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.EditPart;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.validation.caret.IMovementMediator;
-import org.eclipse.jst.pagedesigner.validation.caret.IPositionMediator;
-import org.eclipse.jst.pagedesigner.validation.caret.Target;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class CaretPositionResolver {
-	private IPositionMediator _validator;
-
-	private Point _point;
-
-	private static CaretPositionResolver _instance;
-
-	/**
-	 * @param validator
-	 * @param point
-	 * @return the singleton instance
-	 */
-	public static CaretPositionResolver getInstance(
-			IPositionMediator validator, Point point) {
-		if (_instance == null) {
-			_instance = new CaretPositionResolver();
-		}
-		_instance.setPoint(point);
-		_instance.setValidator(validator);
-		return _instance;
-	}
-
-	/**
-	 * @param _point
-	 *            The _point to set.
-	 */
-	private void setPoint(Point _point) {
-		this._point = _point;
-	}
-
-	/**
-	 * @param _validator
-	 *            The _validator to set.
-	 */
-	private void setValidator(IPositionMediator _validator) {
-		this._validator = _validator;
-	}
-
-	/**
-	 * Calculate the two part's distance to point, the shorter one will be
-	 * return. Distance is calculated based on: if there is one box contains
-	 * point.y, then calculate that box, or if there is no any such one box,
-	 * then calculate the y distance.
-	 * 
-	 * @param part1
-	 * @param part2
-	 * @param point
-	 * @return
-	 */
-	static LayoutPart getCloserPart(LayoutPart part1, LayoutPart part2,
-			Point _point) {
-		if (part1 == null
-				|| EditModelQuery.isTransparentText(Target.resolveNode(part1
-						.getPart()))) {
-			return part2;
-		} else if (part2 == null
-				|| EditModelQuery.isTransparentText(Target.resolveNode(part2
-						.getPart()))) {
-			return part1;
-		}
-		Rectangle rect1 = part1.getAbsoluteBounds();
-		Rectangle rect2 = part2.getAbsoluteBounds();
-		Node n1 = Target.resolveNode(part1.getPart());
-		Node n2 = Target.resolveNode(part2.getPart());
-		// Within same.
-		if (EditModelQuery.isChild(n1, n2)
-				&& (CaretPositionResolver.getXDistance(rect2, _point) == 0)
-				&& !part1.isCloseToEdgeFromOutSide()) {
-			return part2;
-		} else if (EditModelQuery.isChild(n2, n1)
-				&& (CaretPositionResolver.getXDistance(rect1, _point) == 0 && !part2
-						.isCloseToEdgeFromOutSide())
-				&& !part2.isCloseToEdgeFromOutSide()) {
-			return part1;
-		}
-		if (rect1.intersect(new Rectangle(rect1.x, rect2.y, rect1.width,
-				rect2.height)).height == 0) {
-			return heightFirst(part1, part2, _point);
-		}
-        return widthFirst(part1, part2, _point);
-	}
-
-	private static LayoutPart heightFirst(LayoutPart part1, LayoutPart part2,
-			Point _point) {
-		Rectangle rect1 = part1.getAbsoluteBounds();
-		Rectangle rect2 = part2.getAbsoluteBounds();
-		int offset1 = Math.abs(CaretPositionResolver
-				.getYDistance(rect1, _point));
-		int offset2 = Math.abs(CaretPositionResolver
-				.getYDistance(rect2, _point));
-		if (offset1 > offset2) {
-			return part2;
-		} else if (offset1 < offset2) {
-			return part1;
-		} else {
-			offset1 = Math.abs(CaretPositionResolver
-					.getXDistance(rect1, _point));
-			offset2 = Math.abs(CaretPositionResolver
-					.getXDistance(rect2, _point));
-			if (offset1 >= offset2) {
-				return part2;
-			}
-            return part1;
-		}
-	}
-
-	private static LayoutPart widthFirst(LayoutPart part1, LayoutPart part2,
-			Point _point) {
-		Rectangle rect1 = part1.getAbsoluteBounds();
-		Rectangle rect2 = part2.getAbsoluteBounds();
-		int offset1 = Math.abs(CaretPositionResolver
-				.getXDistance(rect1, _point));
-		int offset2 = Math.abs(CaretPositionResolver
-				.getXDistance(rect2, _point));
-		if (offset1 > offset2) {
-			return part2;
-		} else if (offset1 < offset2) {
-			return part1;
-		} else {
-			offset1 = Math.abs(CaretPositionResolver
-					.getYDistance(rect1, _point));
-			offset2 = Math.abs(CaretPositionResolver
-					.getYDistance(rect2, _point));
-			if (offset1 >= offset2) {
-				return part2;
-			}
-            return part1;
-		}
-	}
-
-	/**
-	 * Return a descendent part under parent that is one of the closest part to
-	 * point.
-	 * 
-	 * @param parent
-	 * @return
-	 */
-	private LayoutPart getClosestChildPart(LayoutPart parent) {
-		LayoutPart result = null;
-		if (parent != null) {
-			List children = null;
-			if ((children = parent.getPart().getChildren()).size() > 0) // &&
-			// _validator.hasEditableArea(new
-			// Target(parent.getPart())))
-			{
-				// iterate its children, we know the part doesn't contain p. so
-				// we only see if its children can be
-				// referenced.
-				for (int i = 0, n = children.size(); i < n; i++) {
-					LayoutPart nextPart = new LayoutPart((EditPart) children
-							.get(i), _point);
-					Target target = new Target(nextPart.getPart());
-					if (_validator.isValidPosition(new DesignRefPosition(target
-							.getPart(), false))) {
-						result = getCloserPart(result, nextPart, _point);
-					} else if (_validator.hasEditableArea(target)) {
-						LayoutPart temp = getClosestChildPart(nextPart);
-						if (temp == null) {
-							temp = nextPart;
-						}
-						result = getCloserPart(result, temp, _point);
-					}
-				}
-			}
-		}
-		return result;
-	}
-
-	/**
-	 * Use by vertical movement, we need to see whther the par
-	 * 
-	 * @param closestPart
-	 * @param target
-	 * @return
-	 */
-	LayoutPart resolveClosestPartFrom(LayoutPart closestPart) {
-		Target target = new Target(closestPart.getPart());
-		LayoutPart finalPart = null;
-		if (EditModelQuery.isInline(Target.resolveNode(closestPart.getPart()))) {
-
-			if (closestPart.isAfterPoint() || closestPart.isBeforePoint()) {
-				finalPart = closestPart;
-			} else {
-				if (_validator.hasEditableArea(target)
-						&& (_validator instanceof IMovementMediator
-								&& ((IMovementMediator) _validator)
-										.allowsMoveIn(target) || !(_validator instanceof IMovementMediator))) {
-					finalPart = getClosestChildPartOrPart(closestPart);
-				}
-			}
-		}
-		// block
-		else {
-			if (closestPart.contains(_point)) {
-				if (_validator.hasEditableArea(target) && //
-						(_validator instanceof IMovementMediator
-								&& ((IMovementMediator) _validator)
-										.allowsMoveIn(target) || !(_validator instanceof IMovementMediator))) {
-					finalPart = getClosestChildPartOrPart(closestPart);
-				}
-			}
-			// outside of bounds
-			else {
-				if (_validator.hasEditableArea(target)
-						&& !IHTMLConstants.TAG_TABLE.equalsIgnoreCase(target
-								.getNode().getNodeName())
-						&& (_validator instanceof IMovementMediator
-								&& ((IMovementMediator) _validator)
-										.allowsMoveIn(target) || !(_validator instanceof IMovementMediator))) {
-					if (closestPart.atSameRow(_point)) {
-						finalPart = getClosestChildPartOrPart(closestPart);
-					} else if (!_validator
-							.isValidPosition(new DesignRefPosition(target
-									.getPart(), true))) {
-						finalPart = getClosestChildPartOrPart(closestPart);
-					}
-				}
-			}
-		}
-		if (finalPart == null && //
-				(_validator.isValidPosition(new DesignRefPosition(target
-						.getPart(), true)) || // 
-				_validator.isValidPosition(new DesignRefPosition(target
-						.getPart(), false)))) {
-			finalPart = closestPart;
-		}
-		return finalPart;
-	}
-
-	private LayoutPart getClosestChildPartOrPart(LayoutPart closestPart) {
-		LayoutPart result = getClosestChildPart(closestPart);
-		if (result != null) {
-			result = resolveClosestPartFrom(result);
-		} else {
-			if (closestPart.getConcretePart() == null) {
-				result = closestPart;
-			}
-		}
-		return result;
-	}
-
-	/**
-	 * Get the distance from rect's edge to point.x.
-	 * 
-	 * @param rect
-	 * @param point
-	 * @return the X distance
-	 */
-	public static int getXDistance(Rectangle rect, Point point) {
-		if (rect.getRight().x <= point.x) {
-			return point.x - (rect.getRight().x);
-		} else if (rect.x >= point.x) {
-			return point.x - rect.x;
-		} else if (rect.x <= point.x && point.x <= rect.getRight().x) {
-			return 0;
-		}
-		return -1;
-	}
-
-	/**
-	 * from point to middle's distance. If the result is nagative, point is at
-	 * left part of rect, if it is positive, the point is at the right part.
-	 * 
-	 * @param rect
-	 * @param point
-	 * @return the X distance
-	 */
-	public static int toXMiddle(Rectangle rect, Point point) {
-		return (point.x - (rect.x + rect.getRight().x) / 2);
-	}
-
-	/**
-	 * from point to middle's distance If the result is nagative, point is at
-	 * upper part of rect, if it is positive, the point is at the lower part.
-	 * 
-	 * @param rect
-	 * @param point
-	 * @return the Y distance
-	 */
-	public static int toYMiddle(Rectangle rect, Point point) {
-		return (point.y - (rect.y + rect.getBottom().y) / 2);
-	}
-
-	/**
-	 * @param rect
-	 * @param point
-	 * @return the Y distance
-	 */
-	public static int getYDistance(Rectangle rect, Point point) {
-		if (rect.y + rect.height <= point.y) {
-			return point.y - (rect.y + rect.height);
-		} else if (rect.y >= point.y) {
-			return point.y - rect.y;
-		} else if (rect.y <= point.y && point.y <= rect.y + rect.height) {
-			return 0;
-		}
-		return -1;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/CaretUpdater.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/CaretUpdater.java
deleted file mode 100644
index f116e06..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/CaretUpdater.java
+++ /dev/null
@@ -1,241 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.viewer;
-
-import java.beans.PropertyChangeEvent;
-import java.beans.PropertyChangeListener;
-
-import org.eclipse.draw2d.FigureListener;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.RangeModel;
-import org.eclipse.draw2d.Viewport;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.tools.ExposeHelper;
-import org.eclipse.swt.widgets.Caret;
-
-/**
- * This class is responsible for update the caret location. At least the
- * following changes may result in caret location change. <ll>
- * <li>The selection mode change. For example, from/to text mode to/from object
- * mode, we need to hide/display the caret
- * <li>The caret location change in the model.
- * <li>the figures moved. This may result in model change in somewhere else, or
- * user resized the page designer.
- * <li>The figure that containing the caret get recreated. </ll>
- * 
- * @author mengbo
- */
-/*package*/ class CaretUpdater implements IHTMLGraphicalViewerListener,
-		FigureListener {
-//	private static final Logger _log = PDPlugin.getLogger(CaretUpdater.class);
-
-	private IHTMLGraphicalViewer _viewer;
-
-	private boolean _viewerBatchChanging = false;
-
-	/**
-	 * the width value of the caret in pixels
-	 */
-	public static final int CARET_WIDTH = 2;
-
-	/**
-	 * the figure the caret associate to, we need to track this figure's
-	 * resizing, location change, etc.
-	 */
-	private IFigure _trackFigure;
-
-	/**
-	 * @param viewer
-	 */
-	public CaretUpdater(IHTMLGraphicalViewer viewer) {
-		_viewer = viewer;
-		setup();
-	}
-
-	/**
-	 * set up the
-	 */
-	public void setup() {
-		_viewer.addHTMLViewerListener(this);
-	}
-
-	/**
-	 * this method is called after the view is fully initialized.
-	 */
-	public void connectViewer() {
-		Viewport viewport = _viewer.getViewport();
-		if (viewport != null) {
-			viewport.getHorizontalRangeModel().addPropertyChangeListener(
-					new PropertyChangeListener() {
-						public void propertyChange(
-								PropertyChangeEvent propertychangeevent) {
-							if ((propertychangeevent.getSource() instanceof RangeModel)
-									&& (propertychangeevent.getPropertyName()
-											.equals(ICSSPropertyID.ATTR_VALUE) || propertychangeevent
-											.getPropertyName().equals("extent"))) //$NON-NLS-1$
-								updateCaret();
-						}
-
-					});
-			viewport.getVerticalRangeModel().addPropertyChangeListener(
-					new PropertyChangeListener() {
-
-						public void propertyChange(
-								PropertyChangeEvent propertychangeevent) {
-							if ((propertychangeevent.getSource() instanceof RangeModel)
-									&& (propertychangeevent.getPropertyName()
-											.equals(ICSSPropertyID.ATTR_VALUE) || propertychangeevent
-											.getPropertyName().equals("extent"))) //$NON-NLS-1$
-								updateCaret();
-						}
-
-					});
-		}
-	}
-
-	/**
-	 * dispose the instance
-	 */
-	public void dispose() {
-		_viewer.removeHTMLViewerListener(this);
-	}
-
-	/**
-	 * Update the selection
-	 */
-	public void updateSelection() {
-		setCaretVisible(false);
-		updateRangeSelection();
-		updateCaret();
-		reveal();
-	}
-
-	private void setCaretVisible(boolean visible) {
-		Caret caret = _viewer.getCaret();
-		if (caret == null)
-			return;
-		if (caret.isDisposed()) {
-			return;
-		}
-		caret.setVisible(visible);
-	}
-
-	/**
-	 * 
-	 */
-	private void updateRangeSelection() {
-		// FIXME: optimization needed here. Normally should not repaint the
-		// whole page.
-		((GraphicalEditPart) _viewer.getRootEditPart()).getFigure().repaint();
-		((GraphicalEditPart) _viewer.getRootEditPart()).getFigure()
-				.getUpdateManager().performUpdate();
-	}
-
-	/**
-	 * update the caret
-	 */
-	public void updateCaret() {
-		if (_trackFigure != null) {
-			_trackFigure.removeFigureListener(this);
-			_trackFigure = null;
-		}
-		Caret caret = _viewer.getCaret();
-		if (caret == null) {
-			return;
-		}
-		if (caret.isDisposed()) {
-			return;
-		}
-
-		Rectangle rect = null;
-
-		// try get the caret bounds.
-		if (_viewer.isInRangeMode()) {
-			DesignRange range = _viewer.getRangeSelection();
-			if (range != null) {
-				DesignPosition endPosition = range.getEndPosition();
-				if (endPosition != null && endPosition.isValid()) {
-					rect = EditPartPositionHelper
-							.convertToAbsoluteCaretRect(endPosition);
-					_trackFigure = ((GraphicalEditPart) endPosition
-							.getContainerPart()).getFigure();
-					_trackFigure.addFigureListener(this);
-				}
-			}
-		}
-
-		// set visible effect
-		if (rect == null) {
-			caret.setVisible(false);
-		} else {
-			caret.setVisible(false); // make sure it get removed from the
-			// screen.
-			// the caret width doesn't need to be calculated, the x pos should
-			// be adjusted more acurately.
-			caret.setBounds(rect.x, rect.y, CARET_WIDTH, rect.height);
-			caret.setVisible(true);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
-	 */
-	public void selectionChanged(SelectionChangedEvent event) {
-		if (_viewerBatchChanging) {
-			return;
-		}
-		updateSelection();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewerListener#selectionAboutToChange()
-	 */
-	public void selectionAboutToChange() {
-		_viewerBatchChanging = true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewerListener#selectionChangeFinished()
-	 */
-	public void selectionChangeFinished() {
-		_viewerBatchChanging = false;
-		updateSelection();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.FigureListener#figureMoved(org.eclipse.draw2d.IFigure)
-	 */
-	public void figureMoved(IFigure source) {
-		updateCaret();
-	}
-
-	private void reveal() {
-		Caret caret = _viewer.getCaret();
-		if (caret != null && !caret.isDisposed() && _viewer.isInRangeMode()) {
-			org.eclipse.swt.graphics.Rectangle rect = caret.getBounds();
-			ExposeHelper helper = new ExposeHelper(_viewer);
-			helper.exposeArea(new Rectangle(rect.x, rect.y, rect.width,
-					rect.height));
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/DefaultDropLocationStrategy.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/DefaultDropLocationStrategy.java
deleted file mode 100644
index 33fa579..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/DefaultDropLocationStrategy.java
+++ /dev/null
@@ -1,193 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.viewer;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.Label;
-import org.eclipse.draw2d.LineBorder;
-import org.eclipse.draw2d.RectangleFigure;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.Insets;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPartViewer;
-import org.eclipse.gef.requests.DropRequest;
-import org.eclipse.jst.pagedesigner.parts.ElementEditPart;
-import org.eclipse.jst.pagedesigner.validation.caret.IPositionMediator;
-
-/**
- * A default implementation of the drop location strategy
- * @author cbateman
- *
- */
-public class DefaultDropLocationStrategy extends AbstractDropLocationStrategy 
-{
-    // the amount of vertical offset below the mouse pointer to place
-    // the upper left of the drop hint tooltip
-    private static final int DROP_HINT_VERTICAL_OFFSET = 20;
-
-    /**
-     * @param viewer
-     */
-    public DefaultDropLocationStrategy(EditPartViewer viewer) {
-        super(viewer);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.viewer.AbstractDropLocationStrategy#calculateDesignPosition(org.eclipse.gef.EditPart, org.eclipse.draw2d.geometry.Point, org.eclipse.jst.pagedesigner.validation.caret.IPositionMediator)
-     */
-    @Override
-    public DesignPosition calculateDesignPosition(EditPart host, Point p,
-            IPositionMediator validator) {
-        return EditPartPositionHelper.findEditPartPosition(
-                host, p, validator);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.viewer.AbstractDropLocationStrategy#showTargetFeedback(org.eclipse.gef.EditPart, org.eclipse.jst.pagedesigner.viewer.DesignPosition, org.eclipse.gef.requests.DropRequest)
-     */
-    @Override
-    public List showTargetFeedback(EditPart host, DesignPosition position, DropRequest request) 
-    {
-        List feedback = new ArrayList(4);
-        feedback.add(showFeedbackRect(createCaretBounds(position)));
-        feedback.add(showDropHintLabel(request.getLocation(), position));
-        
-        return feedback;
-    }
-
-    
-    
-    /**
-     * @param rect
-     * @return the default rectangle figure for the requested visual rectangle
-     */
-    protected final RectangleFigure showFeedbackRect(Rectangle rect) {
-        RectangleFigure pf = createFeedbackFigure();
-        pf.translateToRelative(rect);
-        pf.setBounds(rect);
-        return pf;
-    }
-    
-    /**
-     * @param position
-     * @return the bounding rectangle for the caret at the current
-     * position in absolute coords
-     */
-    protected Rectangle createCaretBounds(DesignPosition position)
-    {
-        Rectangle rect = EditPartPositionHelper
-            .convertToAbsoluteCaretRect(position);
-
-        // to avoid enlarge feedback pane.
-        rect = rect.intersect(getFeedbackLayer().getBounds());
-        
-        return rect;
-    }
-    
-    /**
-     * @return the newly created feedback figure
-     */
-    protected RectangleFigure createFeedbackFigure() 
-    {
-        RectangleFigure feedbackFigure = new RectangleFigure();
-        feedbackFigure.setFill(true);
-        feedbackFigure.setOutline(true);
-        feedbackFigure.setLineWidth(1);
-        feedbackFigure.setForegroundColor(ColorConstants.red);
-        feedbackFigure.setBounds(new Rectangle(0, 0, 0, 0));
-        feedbackFigure.setXOR(true);
-        addFeedback(feedbackFigure);
-        return feedbackFigure;
-    }
-
-    /**
-     * Shows a label in a position relative to the drop marker
-     * that hints where the new component will be dropped in
-     * respect of components already there
-     * @param mousePosition 
-     * @param position 
-     * @return the drop hint label
-     */
-    protected final Label showDropHintLabel(Point mousePosition, DesignPosition position)
-    {
-        Label    dropHintLabel = new Label();
-        dropHintLabel.setOpaque(true);
-        dropHintLabel.setBackgroundColor(ColorConstants.tooltipBackground);
-        dropHintLabel.setBorder(
-                new LineBorder(ColorConstants.black, 1)
-                {
-                    // add an extra pixel of inset to make sure the text
-                    // isn't pressed against the border
-                    public Insets getInsets(IFigure figure) {
-                        return new Insets(getWidth()+1);
-                    }
-                }
-        );
-        addFeedback(dropHintLabel);
-
-        final String hintText = getDropHintText(position);
-        dropHintLabel.setText(hintText);
-        //TODO: need to handle viewport clipping and adjust label location appropriately
-        Dimension hintSize = dropHintLabel.getPreferredSize();
-        Point hintLocation = new Point(mousePosition.x, mousePosition.y+DROP_HINT_VERTICAL_OFFSET);
-        Rectangle hintRect = new Rectangle(hintLocation, hintSize);
-
-        //Bug 303524 - [WPE] design view flickers on dnd of jsf html column
-        //    (translateToRelative BEFORE intersect, so intersection happens on final display bounds)
-        dropHintLabel.translateToRelative(hintRect);
-        // we need to intersect the rectangle with the feedback pane, otherwise, when the mouse
-        // is dragged near the edge of the viewport with the drop hint active, the canvas will expand
-        // away from the mouse.  In future a more ideal solution will be to relocate the tooltip
-        // so that is is completely inside the viewport.
-        hintRect = hintRect.intersect(getFeedbackLayer().getBounds());
-
-        dropHintLabel.setBounds(hintRect);
-        
-        return dropHintLabel;
-    }
-    
-    /**
-     * @param position
-     * @return the drop hint text for the current position
-     */
-    protected String getDropHintText(DesignPosition position)
-    {
-        StringBuffer buffer = new StringBuffer("Place"); //$NON-NLS-1$
-        
-        EditPart prevPart = position.getSiblingEditPart(false);
-        EditPart nextPart = position.getSiblingEditPart(true);
-
-        if (nextPart instanceof ElementEditPart)
-        {
-            buffer.append(" before "); //$NON-NLS-1$
-            buffer.append(((ElementEditPart)nextPart).getTagConvert().getHostElement().getNodeName());
-            buffer.append(","); //$NON-NLS-1$
-        }
-        
-        if (prevPart instanceof ElementEditPart)
-        {
-            buffer.append(" after "); //$NON-NLS-1$
-            buffer.append(((ElementEditPart)prevPart).getTagConvert().getHostElement().getNodeName());
-            buffer.append(","); //$NON-NLS-1$
-        }
-        
-        buffer.append(" inside "); //$NON-NLS-1$
-        buffer.append(position.getContainerNode().getNodeName());
-        
-        return buffer.toString();
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/DesignPosition.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/DesignPosition.java
deleted file mode 100644
index a869f80..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/DesignPosition.java
+++ /dev/null
@@ -1,203 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.viewer;
-
-import java.util.List;
-
-import org.eclipse.gef.EditPart;
-import org.w3c.dom.Node;
-import org.w3c.dom.Text;
-
-/**
- * @author mengbo
- */
-public class DesignPosition {
-	/**
-	 * a singleton that can be used as an invalid position
-	 */
-	public static final DesignPosition INVALID = new DesignPosition(null, -1);
-
-	private EditPart _containerPart;
-
-	int _offset;
-
-	//private Node _containerNode;
-
-	/**
-	 * @param part
-	 * @param offset
-	 */
-	public DesignPosition(EditPart part, int offset) {
-		_containerPart = part;
-		_offset = offset;
-	}
-
-	/**
-	 * if _containerPart is null, means it is invalid
-	 * 
-	 * @return the container edit part
-	 */
-	public EditPart getContainerPart() {
-		return _containerPart;
-	}
-
-	/**
-	 * @return the container node
-	 */
-	public Node getContainerNode() {
-		if (_containerPart != null) {
-			return (Node) _containerPart.getModel();
-		}
-        return null;
-	}
-
-	/**
-	 * if offset < 0, means it is invalid.
-	 * 
-	 * @return the offset
-	 */
-	public int getOffset() {
-		return _offset;
-	}
-
-	/**
-	 * @return true if the design position is valid
-	 */
-	public boolean isValid() {
-		return (_containerPart != null) && (_offset >= 0);
-	}
-
-	/**
-	 * This method should not be called when is text node.
-	 * 
-	 * @param forward
-	 * @return the sibling part one to right in the tree if 
-	 * forward == true, one to the left if forward == false.  May
-	 * return null if position is invalid or there is no valid sibling.
-	 */
-	public EditPart getSiblingEditPart(boolean forward) {
-		if (!isValid()) {
-			return null;
-		}
-
-		int index = forward ? (_offset) : (_offset - 1);
-		List children = _containerPart.getChildren();
-
-		if ((index >= children.size()) || (index < 0)) {
-			return null;
-		}
-
-		return (EditPart) children.get(index);
-	}
-
-	/**
-	 * factory method
-	 * 
-	 * @param part
-	 * @return a design position one before part
-	 */
-	public static DesignPosition createPositionBeforePart(EditPart part) {
-		EditPart parent = part.getParent();
-
-		if (parent == null) {
-			return new DesignPosition(part, 0);
-		}
-        return new DesignPosition(parent, parent.getChildren()
-        		.indexOf(part));
-	}
-
-	/**
-	 * factory method
-	 * 
-	 * @param part
-	 * @return the design position for one after part
-	 */
-	public static DesignPosition createPositionAfterPart(EditPart part) {
-		EditPart parent = part.getParent();
-
-		if (parent == null) {
-			return new DesignPosition(part, part.getChildren().size());
-		}
-        return new DesignPosition(parent, parent.getChildren()
-        		.indexOf(part) + 1);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Object#equals(java.lang.Object)
-	 */
-	public boolean equals(Object obj) {
-	    if (obj == this)
-	    {
-	        return true;
-	    }
-	    
-		if (obj instanceof DesignPosition) {
-			DesignPosition p = (DesignPosition) obj;
-
-			return (p.getContainerPart() == this._containerPart)
-					&& (p.getOffset() == this._offset);
-		}
-
-		return false;
-	}
-
-	
-	@Override
-    public int hashCode() {
-	    return System.identityHashCode(_containerPart) ^ System.identityHashCode(Integer.valueOf(_offset));
-    }
-
-	/**
-	 * @param buffer
-	 * @return the buffer with the debug dump
-	 */
-	public StringBuffer debugDump(StringBuffer buffer) {
-//		try {
-			buffer.append("DesignPosition: ").append(this._containerPart) //$NON-NLS-1$
-					.append(": ").append(this._offset).append("\n"); //$NON-NLS-1$ //$NON-NLS-2$
-
-			if (this._containerPart.getModel() instanceof Text) {
-				// skip
-			} else {
-				if (this._offset > 0) {
-					buffer.append("after: ").append( //$NON-NLS-1$
-							this._containerPart.getChildren().get(
-									this._offset - 1)).append("\n"); //$NON-NLS-1$
-				}
-
-				if (this._offset < (this._containerPart.getChildren().size() - 1)) {
-					buffer.append("before: ") //$NON-NLS-1$
-							.append(
-									this._containerPart.getChildren().get(
-											this._offset)).append("\n"); //$NON-NLS-1$
-				}
-			}
-            //TODO: what was being caught here?
-//		} catch (Exception e) {
-//		}
-
-		return buffer;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		StringBuffer buffer = new StringBuffer();
-
-		return debugDump(buffer).toString();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/DesignRange.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/DesignRange.java
deleted file mode 100644
index c3f0552..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/DesignRange.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.viewer;
-
-import org.eclipse.jface.viewers.ISelection;
-
-/**
- * @author mengbo
- */
-public class DesignRange implements ISelection 
-{
-    private final DesignPosition _start;
-    private final DesignPosition _end;
-
-	/**
-	 * @param start
-	 * @param end
-	 */
-	public DesignRange(DesignPosition start, DesignPosition end) {
-		_start = start;
-		_end = end;
-	}
-
-	/**
-	 * @return the start position in the range
-	 */
-	public DesignPosition getStartPosition() {
-		return _start;
-	}
-
-	/**
-	 * @return the end position in the range
-	 */
-	public DesignPosition getEndPosition() {
-		return _end;
-	}
-
-	/**
-	 * @return true if the range is valid
-	 */
-	public boolean isValid() {
-		return _start != null && _start.isValid() && _end != null
-				&& _end.isValid();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelection#isEmpty()
-	 */
-	public boolean isEmpty() {
-		// FIXME: temp implementation, need revisit.
-		return !isValid() || _start.equals(_end);
-	}
-
-	/**
-	 * @param buffer
-	 * @return a buffer with the debug dum
-	 */
-	public StringBuffer debugDump(StringBuffer buffer) {
-		if (_start != null) {
-			buffer.append("Start: ").append(_start); //$NON-NLS-1$
-		} else {
-			buffer.append("Start: null"); //$NON-NLS-1$
-		}
-		if (_end != null) {
-			buffer.append("End: ").append(_end); //$NON-NLS-1$
-		} else {
-			buffer.append("End: null"); //$NON-NLS-1$
-		}
-		return buffer;
-	}
-
-	public String toString() {
-		StringBuffer buffer = new StringBuffer();
-		return debugDump(buffer).toString();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/DesignRefPosition.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/DesignRefPosition.java
deleted file mode 100644
index da6e305..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/DesignRefPosition.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.viewer;
-
-import org.eclipse.gef.EditPart;
-
-/**
- * @author mengbo
- */
-public class DesignRefPosition extends DesignPosition {
-	private boolean _caretIsAtRight;
-
-	private EditPart _refPart;
-
-	/**
-	 * @param part
-	 * @param caretIsAfter
-	 */
-	public DesignRefPosition(EditPart part, boolean caretIsAfter) {
-		super(part.getParent(), 0);
-		int offset = part.getParent().getChildren().indexOf(part);
-		_offset = caretIsAfter ? offset + 1 : offset;
-		_refPart = part;
-		_caretIsAtRight = caretIsAfter;
-	}
-
-	/**
-	 * @return the reference edit part
-	 */
-	public EditPart getRefPart() {
-		return _refPart;
-	}
-
-	/**
-	 * @return Returns the _isAfter.
-	 */
-	public boolean caretIsAtRight() {
-		return _caretIsAtRight;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/EditPartPositionHelper.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/EditPartPositionHelper.java
deleted file mode 100644
index 0f11741..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/EditPartPositionHelper.java
+++ /dev/null
@@ -1,678 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.viewer;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.css2.layout.CSSFigure;
-import org.eclipse.jst.pagedesigner.css2.layout.CSSTextFigure;
-import org.eclipse.jst.pagedesigner.css2.layout.FlowBox;
-import org.eclipse.jst.pagedesigner.dom.DOMPosition;
-import org.eclipse.jst.pagedesigner.dom.DOMPositionHelper;
-import org.eclipse.jst.pagedesigner.dom.DOMRefPosition;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.parts.NodeEditPart;
-import org.eclipse.jst.pagedesigner.parts.TextEditPart;
-import org.eclipse.jst.pagedesigner.validation.caret.IMovementMediator;
-import org.eclipse.jst.pagedesigner.validation.caret.IPositionMediator;
-import org.eclipse.jst.pagedesigner.validation.caret.Target;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public class EditPartPositionHelper {
-//	private final static Logger _log = PDPlugin
-//			.getLogger(EditPartPositionHelper.class);
-
-	/**
-	 * Add something to current
-	 * 
-	 * @param lineBox
-	 * @param host
-	 * @param point
-	 * @param validator
-	 */
-	private static void addToCurrentLine(FlowBoxLine lineBox, EditPart host,
-			Point point, IPositionMediator validator) {
-		Node node = Target.resolveNode(host);
-		if (!(node == null || EditModelQuery.isDocument(node))) {
-			// Either it is referencable or is editable.
-			if (validator.isValidPosition(new DOMRefPosition(node, true))
-					|| //
-					validator
-							.isValidPosition((new DOMRefPosition(node, false)))
-					|| //
-					validator.isValidPosition(new DOMPosition(node, 0))) {
-				lineBox.addLayoutPart(host, point);
-			}
-		}
-	}
-
-	/**
-	 * @param position 
-	 * @return null means failed to convert to rect.
-	 */
-	public static Rectangle convertToAbsoluteCaretRect(DesignPosition position) {
-		Rectangle ret = null;
-		try {
-			final int CARET_OFFSET = 1;
-			if (position == null || !position.isValid()) {
-				return null;
-			}
-			EditPart containerEditPart = position.getContainerPart();
-			if (containerEditPart instanceof TextEditPart) {
-				CSSTextFigure figure = (CSSTextFigure) ((TextEditPart) containerEditPart)
-						.getFigure();
-				ret = figure.calculateCaretPosition(position.getOffset());
-				figure.translateToAbsolute(ret);
-				ret.width = CaretUpdater.CARET_WIDTH;
-			} else {
-				int offset = position.getOffset();
-				// there is no child
-				if (containerEditPart.getChildren().isEmpty()
-						|| LayoutPart.getConcretePart(containerEditPart) == null) {
-					IFigure figure = ((GraphicalEditPart) containerEditPart)
-							.getFigure();
-					Rectangle bounds = figure.getBounds();
-					if (figure instanceof CSSFigure) {
-						List fragments = ((CSSFigure) figure)
-								.getFragmentsForRead();
-						if (fragments.size() > 0) {
-							FlowBox box = (FlowBox) fragments.get(fragments
-									.size() - 1);
-							bounds = LayoutPart.getBounds(box);
-						}
-					}
-
-					ret = new Rectangle(bounds.x + CARET_OFFSET, bounds.y,
-							CaretUpdater.CARET_WIDTH, bounds.height);
-
-					figure.translateToAbsolute(ret);
-				} else if (offset >= 0
-						&& offset <= containerEditPart.getChildren().size()) {
-					ret = getRefRect(position);
-				}
-			}
-		} catch (Exception e) {
-			// This should never happen, we catch here for later analysis.
-			// _log.debug("Error in caret rect resolving", e);
-			ret = new Rectangle(0, 0, 0, 0);
-		}
-		if (ret == null) {
-			ret = new Rectangle(0, 0, 0, 0);
-		}
-		return ret;
-	}
-
-	/**
-	 * This method will create FlowBoxLine to calculate the accurate parts.
-	 * 
-	 * @param host
-	 * @param p
-	 * @param validator 
-	 * @return the design position
-	 */
-	public static DesignPosition findEditPartPosition(EditPart host, Point p,
-			IPositionMediator validator) {
-		try {
-			host = validator.getEditableContainer(new Target(host));
-			FlowBoxLine boxLine = new FlowBoxLine(
-					new Rectangle(p.x, p.y, 0, 0), validator, p);
-			DesignPosition position = innerFindEditPartPosition(host, host, p,
-					boxLine, validator);
-			if (position == null) {
-				position = innerFindEditPartPosition(host, host, p, boxLine,
-						validator);
-				if (position == null) {
-					EditPart part = boxLine.getClosestPart();
-					if (part != null) {
-						LayoutPart layoutPart = new LayoutPart(part, p);
-						position = layoutPart.resolvePosition(validator);
-					}
-				}
-			}
-			return position;
-		} catch (Exception e) {
-			return null;
-		}
-
-	}
-
-	/**
-	 * This function finds the position, if there is one which is widget or text
-	 * and it contains p, or there is not such widget, then boxLine will return
-	 * the widget that are in a same line which contains p;
-	 * @param rootHost 
-	 * @param host 
-	 * 
-	 * @param p
-	 * @param boxLine 
-	 * @param validator 
-	 * @return the design position
-	 */
-    //TODO: needs refactoring
-	public static DesignPosition innerFindEditPartPosition(EditPart rootHost,
-			EditPart host, Point p, FlowBoxLine boxLine,
-			IPositionMediator validator) {
-		Target target = new Target(host);
-		LayoutPart lPart = new LayoutPart(host, p);
-		// text
-		if (host instanceof TextEditPart) {
-			if (lPart.contains(p)) {
-				DesignPosition position = null;
-				// see if the point is within string.
-				position = findTextEditPartPosition((TextEditPart) host, p);
-				if (position == null) {
-					addToCurrentLine(boxLine, host, p, validator);
-				}
-				// found?!!
-				return position;
-			}
-            addToCurrentLine(boxLine, host, p, validator);
-            return null;
-		}
-		// widget
-		else if (isWidget(host)) {
-			if (lPart.contains(p)
-					&& (validator.isValidPosition(new DOMRefPosition(target
-							.getNode(), true)) || //
-					validator.isValidPosition((new DOMRefPosition(target
-							.getNode(), false))))) {
-				if (IHTMLConstants.TAG_BR.equalsIgnoreCase(Target.resolveNode(
-						host).getNodeName())) {
-					return new DesignRefPosition(host, lPart.isBeforePoint(p));
-				}
-                return new DesignRefPosition(host, lPart.isBeforePoint(p)
-                		|| !lPart.atLeftPart(p));
-			}
-            addToCurrentLine(boxLine, host, p, validator);
-		} else {
-			// root host. we always support it has editable area.
-			if (host == rootHost) {
-				if (host.getChildren().size() > 0) {
-					List children = host.getChildren();
-					for (int i = 0, size = children.size(); i < size; i++) {
-						GraphicalEditPart child = (GraphicalEditPart) children
-								.get(i);
-						DesignPosition position = innerFindEditPartPosition(
-								rootHost, child, p, boxLine, validator);
-						if (position != null) {
-							return position;
-						}
-					}
-				}
-				if (boxLine.getPartsList().size() == 0) {
-					if (lPart.contains(p)) {
-						// found!!!
-						return new DesignPosition(host, 0);
-					}
-					addToCurrentLine(boxLine, host, p, validator);
-				}
-			}
-			// container
-			else {
-				// can't edit it.
-				if (!validator.hasEditableArea(target)) {
-					if (lPart.contains(p) && //
-							(validator.isValidPosition(new DesignRefPosition(
-									target.getPart(), true)) || //
-							validator.isValidPosition(new DesignRefPosition(
-									target.getPart(), false)))) {
-						return new DesignRefPosition(host, lPart
-								.isBeforePoint(p)
-								|| !lPart.atLeftPart(p));
-					}
-                    addToCurrentLine(boxLine, host, p, validator);
-				}
-				// can edit
-				else {
-					// contains p
-					if (lPart.contains(p) || //
-							(!validator.isValidPosition(new DesignRefPosition(
-									target.getPart(), true)) && //
-							!validator.isValidPosition(new DesignRefPosition(
-									target.getPart(), false)))) {
-						if (host.getChildren().size() > 0) {
-							List children = host.getChildren();
-							for (int i = 0, size = children.size(); i < size; i++) {
-								GraphicalEditPart child = (GraphicalEditPart) children
-										.get(i);
-								DesignPosition position = innerFindEditPartPosition(
-										rootHost, child, p, boxLine, validator);
-								if (position != null) {
-									return position;
-								}
-							}
-						} else {
-							// we put the container which is empty here.
-							if (lPart.contains(p)) {
-								// found!!!
-								return new DesignPosition(host, 0);
-							}
-                            addToCurrentLine(boxLine, host, p, validator);
-						}
-					}
-					// not contains p
-					else {
-						addToCurrentLine(boxLine, host, p, validator);
-					}
-				}
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Similar to findEditPartPositionConstrained, this method is used to
-	 * vertically move caret.
-	 * 
-	 * @param host
-	 * @param p
-	 * @param validator 
-	 * @return the design position
-	 */
-	public static DesignPosition findEditPartPositionConstrained(EditPart host,
-			Point p, IMovementMediator validator) {
-		try {
-			FlowBoxLine boxLine = new FlowBoxLine(
-					new Rectangle(p.x, p.y, 0, 0), validator, p);
-			DesignPosition position = innerFindEditPartPositionConstrained(
-					host, host, p, boxLine, validator);
-			if (position == null) {
-				position = innerFindEditPartPositionConstrained(host, host, p,
-						boxLine, validator);
-				if (position == null) {
-					EditPart part = boxLine.getClosestPart();
-					if (part != null) {
-						LayoutPart layoutPart = new LayoutPart(part, p);
-						position = layoutPart.resolvePosition(validator);
-					}
-				}
-			}
-			return position;
-		} catch (Exception e) {
-			return null;
-		}
-	}
-
-	/**
-	 * This method is used for move up/down, except for using tactics to deal
-	 * with container, this method is similar to findEditPartPosition.
-	 * 
-	 * @param rootHost 
-	 * @param host 
-	 * @param p
-	 * @param boxLine 
-	 * @param validator 
-	 * @return the design position
-	 */
-    // TODO: needs refactoring
-	public static DesignPosition innerFindEditPartPositionConstrained(
-			EditPart rootHost, EditPart host, Point p, FlowBoxLine boxLine,
-			IMovementMediator validator) {
-		Target target = new Target(host);
-		LayoutPart lPart = new LayoutPart(host, p);
-		// text
-		if (host instanceof TextEditPart) {
-			if (lPart.contains(p)) {
-				DesignPosition position = null;
-				// see if the point is within string.
-				position = findTextEditPartPosition((TextEditPart) host, p);
-				if (position == null) {
-					addToCurrentLine(boxLine, host, p, validator);
-				}
-				// found?!!
-				return position;
-			}
-            addToCurrentLine(boxLine, host, p, validator);
-            return null;
-		}
-		// widget
-		else if (isWidget(host)) {
-			if (lPart.contains(p)) {
-				// found!!!
-				if (IHTMLConstants.TAG_BR.equalsIgnoreCase(Target.resolveNode(
-						host).getNodeName())) {
-					return new DesignRefPosition(host, lPart.isBeforePoint(p));
-				}
-                return new DesignRefPosition(host, lPart.isBeforePoint(p)
-                		|| !lPart.atLeftPart(p));
-			}
-            addToCurrentLine(boxLine, host, p, validator);
-		} else {
-			// root host. we always support it has editable area.
-			if (host == rootHost) {
-				if (host.getChildren().size() > 0) {
-					List children = host.getChildren();
-					for (int i = 0, size = children.size(); i < size; i++) {
-						GraphicalEditPart child = (GraphicalEditPart) children
-								.get(i);
-						DesignPosition position = innerFindEditPartPositionConstrained(
-								rootHost, child, p, boxLine, validator);
-						if (position != null) {
-							return position;
-						}
-					}
-				} else {
-					if (lPart.contains(p)) {
-						// found!!!
-						return new DesignPosition(host, 0);
-					}
-					addToCurrentLine(boxLine, host, p, validator);
-				}
-			}
-			// container
-			else {
-				// can't edit it.
-				if (!validator.hasEditableArea(target)
-						|| !validator.allowsMoveIn(target)) {
-					if (validator.canReference(target, true)
-							|| validator.canReference(target, false)) {
-						if (lPart.contains(p)) {
-							return new DesignRefPosition(host, lPart
-									.isBeforePoint(p)
-									|| !lPart.atLeftPart(p));
-						}
-                        addToCurrentLine(boxLine, host, p, validator);
-					}
-				}
-				// can edit
-				else {
-					// contains p
-					if (lPart.contains(p)) {
-						if (host.getChildren().size() > 0) {
-							List children = host.getChildren();
-							for (int i = 0, size = children.size(); i < size; i++) {
-								GraphicalEditPart child = (GraphicalEditPart) children
-										.get(i);
-								DesignPosition position = innerFindEditPartPositionConstrained(
-										rootHost, child, p, boxLine, validator);
-								if (position != null) {
-									return position;
-								}
-							}
-						} else {
-							// we put the container which is empty here.
-							if (lPart.contains(p)) {
-								// found!!!
-								return new DesignPosition(host, 0);
-							}
-                            addToCurrentLine(boxLine, host, p, validator);
-						}
-					}
-					// not contains p
-					else {
-						addToCurrentLine(boxLine, host, p, validator);
-					}
-				}
-			}
-		}
-		return null;
-
-	}
-
-	// /**
-	// * @param host
-	// * @param p
-	// * @return
-	// */
-	// private static DesignPosition
-	// findTextEditPartPositionAdjacent(TextEditPart host, Point p)
-	// {
-	// if (host.getFigure() instanceof CSSTextFigure)
-	// {
-	// CSSTextFigure figure = (CSSTextFigure) host.getFigure();
-	// // make a copy to not destroy the original o
-	// p = p.getCopy();
-	// figure.translateToRelative(p);
-	// int offset = figure.getNewInsertionOffset(p);
-	// if (offset >= 0)
-	// {
-	// return new DesignPosition(host, offset);
-	// }
-	// else
-	// {
-	// return null;
-	// }
-	// }
-	// else
-	// {
-	// // should not happen.
-	// return new DesignPosition(host, 0);
-	// }
-	// }
-
-	/**
-	 * @param host
-	 * @param p
-	 * @return
-	 */
-	private static DesignPosition findTextEditPartPosition(TextEditPart host,
-			Point p) {
-		if (host.getFigure() instanceof CSSTextFigure) {
-			CSSTextFigure figure = (CSSTextFigure) host.getFigure();
-			// make a copy to not destroy the original o
-			p = p.getCopy();
-			figure.translateToRelative(p);
-			int offset = figure.getInsertionOffset(p);
-			if (offset >= 0) {
-				return new DesignPosition(host, offset);
-			}
-            return null;
-		}
-        // should not happen.
-        return new DesignPosition(host, 0);
-	}
-
-	/**
-	 * @param figure
-	 * @param box
-	 * @return
-	 */
-//	public static Rectangle getBoxBounds(IFigure figure, FlowBox box) {
-//		Rectangle r = new Rectangle(box._x, box._y, box.getWidth(), box
-//				.getHeight());
-//		figure.translateToAbsolute(r);
-//		return r;
-//	}
-
-	/**
-	 * If child is a GraphicalEditPart, a new copy of its bounding rectangle
-	 * will be returned translated to absolute bounds. If child is not a GraphicalEditPart
-	 * then the empty rectangle (0,0,0,0) is returned.
-	 * 
-	 * @param child
-	 * @return the bounding rectangle or (0,0,0,0) if none.
-	 */
-	public static Rectangle getAbsoluteBounds(EditPart child) {
-		if (child instanceof GraphicalEditPart) {
-			Rectangle bounds = ((GraphicalEditPart) child).getFigure()
-					.getBounds().getCopy();
-			((GraphicalEditPart) child).getFigure().translateToAbsolute(bounds);
-			return bounds;
-		}
-        return new Rectangle(0, 0, 0, 0);
-	}
-
-	/**
-	 * @param host
-	 * @param tagName
-	 * @return
-	 */
-	private static boolean isWidget(EditPart host) {
-		if (host instanceof NodeEditPart) {
-			return ((NodeEditPart) host).isWidget();
-		}
-        return false;
-	}
-
-	/**
-	 * Is Caret at right?
-	 * 
-	 * @param position
-	 * @param caretRefResult
-	 * @return
-	 */
-	private static EditPart tryTwoWays(DesignPosition position,
-			List<Boolean> caretRefResult) {
-		EditPart result = null;
-		// Sibling first:
-		Node node = EditModelQuery.getInstance().getSibling(
-				DOMPositionHelper.toDOMPosition(position), true);
-		if (node != null && !EditModelQuery.isTransparentText(node)) {
-			result = Target.resolvePart(node);
-			caretRefResult.add(Boolean.FALSE);
-		} else {
-			node = EditModelQuery.getInstance().getSibling(
-					DOMPositionHelper.toDOMPosition(position), false);
-			if (node != null && !EditModelQuery.isTransparentText(node)) {
-				result = Target.resolvePart(node);
-				caretRefResult.add(Boolean.TRUE);
-			}
-		}
-		if (result == null) {
-			if (getConcretePart(position, false) != null) {
-				result = getConcretePart(position, false);
-				caretRefResult.add(Boolean.TRUE);
-			} else if (getConcretePart(position, true) != null) {
-				result = getConcretePart(position, true);
-				caretRefResult.add(Boolean.FALSE);
-			}
-		}
-		return result;
-	}
-
-	/*
-	 * Here we are doing something to avoid reference whitespace tag. Since we
-	 * still need to improve whitespace tags's layout further more.
-	 */
-	private static EditPart getNextConcretPart(DesignPosition position,
-			List<Boolean> caretIsAtRightTest) {
-		EditPart result = null;
-		boolean caretIsAtRight = true;
-		if (position instanceof DesignRefPosition) {
-			caretIsAtRight = ((DesignRefPosition) position).caretIsAtRight();
-			result = ((DesignRefPosition) position).getRefPart();
-			caretIsAtRightTest.add(Boolean.valueOf(caretIsAtRight));
-		}
-		if (result == null
-				|| EditModelQuery.isTransparentText(Target.resolveNode(result))) {
-			caretIsAtRightTest.clear();
-			result = tryTwoWays(position, caretIsAtRightTest);
-		}
-		return result;
-	}
-
-	/**
-	 * Avoid whitespaces
-	 * 
-	 * @param position
-	 * @param forward
-	 * @return the edit part at position which is non-whitespace ? TODO:
-	 */
-	public static EditPart getConcretePart(DesignPosition position,
-			boolean forward) {
-		EditPart result = null;
-		Node node = EditModelQuery.getInstance().getSibling(
-				DOMPositionHelper.toDOMPosition(position), forward);
-		while (node != null && EditModelQuery.isTransparentText(node)) {
-			node = EditModelQuery.getInstance().getSibling(node, forward);
-		}
-		if (node != null) {
-			result = Target.resolvePart(node);
-		}
-		return result;
-	}
-
-	/**
-	 * @param position
-	 * @param forward
-	 * @return the next concrete part.
-	 */
-	public static EditPart getNextConcretPart(DesignPosition position,
-			boolean forward) {
-		Node node;
-		EditPart result = null;
-		node = EditModelQuery.getInstance().getSibling(
-				DOMPositionHelper.toDOMPosition(position), forward);
-		if (node != null) {
-			if (forward) {
-				while (node != null) {
-					if (!EditModelQuery.isTransparentText(node)
-							&& (result = Target.resolvePart(node)) != null) {
-						result = Target.resolvePart(node);
-						break;
-					}
-					node = node.getNextSibling();
-				}
-			} else {
-				while (node != null) {
-					if (!EditModelQuery.isTransparentText(node)
-							&& (result = Target.resolvePart(node)) != null) {
-						result = Target.resolvePart(node);
-						break;
-					}
-					node = node.getPreviousSibling();
-				}
-			}
-		}
-		return result;
-	}
-
-	private static Rectangle getRefRect(DesignPosition position) {
-		List<Boolean> caretLocation = new ArrayList<Boolean>();
-		EditPart part = getNextConcretPart(position, caretLocation);
-		LayoutPart layoutPart;
-		Rectangle rect = null;
-		if (part != null) {
-			layoutPart = new LayoutPart(part, null);
-			boolean caretIsAtRight = caretLocation.get(0)
-					.booleanValue();
-			final int CARET_OFFSET = 1;
-			Rectangle bounds = null;
-			IFigure figure = ((GraphicalEditPart) part).getFigure();
-			if (!caretIsAtRight) {
-				FlowBox box;
-				if ((box = layoutPart.getLine(0)) != null) {
-					bounds = LayoutPart.getBounds(box);
-				}
-			} else {
-				FlowBox box;
-				if ((box = layoutPart.getLastLine()) != null) {
-					bounds = LayoutPart.getBounds(box);
-				}
-			}
-			if (bounds == null) {
-				bounds = figure.getBounds();
-			}
-			if (!caretIsAtRight) {
-				rect = new Rectangle(bounds.x - CARET_OFFSET, bounds.y,
-						CaretUpdater.CARET_WIDTH, bounds.height);// new
-			} else {
-				rect = new Rectangle(bounds.getRight().x + CARET_OFFSET,
-						bounds.y, CaretUpdater.CARET_WIDTH, bounds.height);// new
-			}
-			figure.translateToAbsolute(rect);
-		} else {
-			System.out.println("No concrete part?"); //$NON-NLS-1$
-		}
-		return rect;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/FlowBoxLine.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/FlowBoxLine.java
deleted file mode 100644
index 5e45ac1..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/FlowBoxLine.java
+++ /dev/null
@@ -1,249 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.viewer;
-
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.EditPart;
-import org.eclipse.jst.pagedesigner.validation.caret.ActionData;
-import org.eclipse.jst.pagedesigner.validation.caret.IPositionMediator;
-
-/**
- * FlowBoxLine collects EditParts in a line that cover the x or y coordinate of
- * design view caret. An EditPart may be a widget that can't contains children,
- * a TextEditPart which contains a set of flowbox, or a widgets container which
- * contains some other editparts. For container, there are two types: white box
- * to visitor, that is the container * visitor should consider its content, like
- * <A>, <B>. etc, or black box to visitor, like <TABLE>. Black box means the
- * container will be considered as a whole from outside. For non-container
- * widget we only see TextEditPart can be broken at line end. For black box,
- * only start box or latest box are used for final reference, for white box, we
- * will process its content for reference <@see
- * EditPartPositionHelper.findEditPartPosition>. For Text, the char that is
- * closest to caret will be referenced. In this line class, tree types of
- * EditPart are collected: TextEditPart, Widget, BlackBox container.
- * 
- * @author mengbo
- */
-public class FlowBoxLine {
-	private int _x;
-
-	private int _y;
-
-	private int _height;
-
-	private int _width;
-
-	private HashMap _parts = new HashMap();
-
-	private IPositionMediator _validator;
-
-	private Point _point;
-
-	/**
-	 * @param rect
-	 * @param validator
-	 * @param point
-	 */
-	public FlowBoxLine(Rectangle rect, IPositionMediator validator, Point point) {
-		_x = rect.x;
-		_y = rect.y;
-		_width = rect.width;
-		_height = rect.height;
-		_validator = validator;
-		_point = point;
-	}
-
-	/**
-	 * @return Returns the _height.
-	 */
-	public int getHeight() {
-		return _height;
-	}
-
-	/**
-	 * @return Returns the _width.
-	 */
-	public int getWidth() {
-		return _width;
-	}
-
-	/**
-	 * @return Returns the _x.
-	 */
-	public int getX() {
-		return _x;
-	}
-
-	/**
-	 * @return Returns the _y.
-	 */
-	public int getY() {
-		return _y;
-	}
-
-	/**
-	 * @return the part list
-	 */
-	public Map getPartsList() {
-		return _parts;
-	}
-
-	/**
-	 * @return the right bottom coordiate
-	 */
-	public Point getRightBottom() {
-		return new Point(_x + _width, _y + _height);
-	}
-
-	/**
-	 * @param part
-	 * @param point
-	 * @return layout part added
-	 */
-	public boolean addLayoutPart(EditPart part, Point point) {
-		Assert.isTrue(part != null && point != null);
-		Rectangle rect = null;
-		LayoutPart lPart = new LayoutPart(part, point);
-		if (_parts.size() == 0) {
-			resetBounds(lPart);
-			return true;
-		}
-		if (!interact(lPart)) {
-			if (closer(lPart)) {
-				resetBounds(lPart);
-				return true;
-			}
-            return false;
-		}
-        rect = lPart.getAbsoluteBounds();
-		int xx = Math.min(rect.x, _x);
-		int width = Math.max(rect.getRight().x, getRightBottom().x) - xx;
-		int yy = Math.min(rect.y, _y);
-		int height = Math.max(rect.getBottom().y, getRightBottom().y) - yy;
-		_x = xx;
-		_y = yy;
-		_width = width;
-		_height = height;
-		_parts.put(part, lPart);
-		return true;
-	}
-
-	/**
-	 * @param lPart
-	 * @return true if layout part is within the right bottom corner of the line
-	 */
-	public boolean interact(LayoutPart lPart) {
-		Rectangle rect = lPart.getAbsoluteBounds();
-		return !(rect.getBottom().y <= _y || getRightBottom().y <= rect.y);
-	}
-
-	/**
-	 * @param part
-	 * @return true if the line contains part
-	 */
-	public boolean contains(EditPart part) {
-		return _parts.containsKey(part);
-	}
-
-	/**
-	 * @param part
-	 * @return true if the line contains part
-	 */
-	public boolean contains(LayoutPart part) {
-		return _parts.containsValue(part);
-	}
-
-	/**
-	 * @param part
-	 * @return the layout part for part
-	 */
-	public LayoutPart getLayoutPart(EditPart part) {
-		return (LayoutPart) _parts.get(part);
-	}
-
-	// 
-	/**
-	 * For vertical movement, we need to see if there is part cover p.x.
-	 * 
-	 * @return the closest edit part
-	 */
-	public EditPart getClosestPart() {
-		if (_parts.isEmpty()) {
-			return null;
-		}
-		Collection parts = _parts.values();
-		Iterator iterator = parts.iterator();
-		LayoutPart closestPart = (LayoutPart) iterator.next();
-		if (iterator.hasNext()) {
-			while (iterator.hasNext()) {
-				LayoutPart nextPart = (LayoutPart) iterator.next();
-				closestPart = CaretPositionResolver.getCloserPart(closestPart,
-						nextPart, _point);
-			}
-		}
-		// for children.
-		LayoutPart result = null;
-		if (_validator.getActionData().getActionType() == ActionData.KEYBOARD_NAVAGATION
-				|| //
-				closestPart.isInline()) {
-			result = CaretPositionResolver.getInstance(_validator, _point)
-					.resolveClosestPartFrom(closestPart);
-		} else {
-			result = closestPart;
-		}
-		if (result != null) {
-			return result.getPart();
-		}
-        return null;
-	}
-
-	/**
-	 * See how close the part,box is closer to point, if it is closer than
-	 * current FlowBoxLine. return true;
-	 */
-	private boolean closer(LayoutPart lPart) {
-		int lineYOffset = Math.abs(CaretPositionResolver.getYDistance(
-				getBounds(), _point));
-		int partYOffset = Math.abs(CaretPositionResolver.getYDistance(lPart
-				.getAbsoluteBounds(), _point));
-		return lineYOffset > partYOffset;
-	}
-
-	/**
-	 * @return the bounding rectangle of the line
-	 */
-	public Rectangle getBounds() {
-		return new Rectangle(_x, _y, _width, _height);
-	}
-
-	private void resetBounds(Rectangle rect) {
-		_x = rect.x;
-		_y = rect.y;
-		_width = rect.width;
-		_height = rect.height;
-	}
-
-	private void resetBounds(LayoutPart lPart) {
-		EditPart part = lPart.getPart();
-		Rectangle rect = lPart.getAbsoluteBounds();
-		resetBounds(rect);
-		_parts.clear();
-		_parts.put(part, lPart);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/HTMLGraphicalViewer.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/HTMLGraphicalViewer.java
deleted file mode 100644
index 7080136..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/HTMLGraphicalViewer.java
+++ /dev/null
@@ -1,547 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.viewer;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.draw2d.FigureCanvas;
-import org.eclipse.draw2d.Viewport;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.ui.parts.ScrollingGraphicalViewer;
-import org.eclipse.jface.action.IStatusLineManager;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jst.pagedesigner.commands.nav.CaretPositionTracker;
-import org.eclipse.jst.pagedesigner.dom.DOMPositionHelper;
-import org.eclipse.jst.pagedesigner.dom.DOMRefPosition;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.parts.DocumentEditPart;
-import org.eclipse.jst.pagedesigner.parts.ElementEditPart;
-import org.eclipse.jst.pagedesigner.tools.ExposeHelper;
-import org.eclipse.swt.widgets.Canvas;
-import org.eclipse.swt.widgets.Caret;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-import org.w3c.dom.Node;
-
-/**
- * For the GraphicalViewer selection management, we have two different selection
- * mode: Range mode and object mode.
- * 
- * Range mode is to support inline text editing, it selects a range. Object mode
- * selects a list of edit parts.
- * 
- * We let the super class of HTMLGraphicalViewer to handle object selection, and
- * add range selection support in this class. Need to override certain selection
- * related methods of super class to handle selection mode switching.
- * 
- * @author mengbo
- */
-/*package*/ class HTMLGraphicalViewer extends ScrollingGraphicalViewer implements
-		IHTMLGraphicalViewer, CaretPositionTracker {
-	private IEditorPart _parentPart;
-	private Caret _caret;
-	// initially nothing selected, treat as object selectin mode.
-	private boolean _rangeMode = false;
-	private DesignRange _selectionRange = null;
-	private int _inBatch = 0;
-	private final CaretUpdater _caretUpdater;
-	private int _xOffset;
-	private final List<IHTMLGraphicalViewerListener>  _htmlViewerListeners;
-	// private ListenerList _postSelectionChangedListeners = new
-	// ListenerList(1);
-
-	/**
-	 * @param parent 
-	 * 
-	 */
-	public HTMLGraphicalViewer(IEditorPart parent) {
-		_parentPart = parent;
-		// CaretUpdater is not fully initialized yet, since this time the
-		// viewport is not
-		// initialized yet, and we need add listener to range model change.
-        _htmlViewerListeners = new ArrayList<IHTMLGraphicalViewerListener>();
-		_caretUpdater = new CaretUpdater(this);
-	}
-
-	/**
-	 * Adds listener both as a selection changed listener and as an
-	 * {@link IHTMLGraphicalViewerListener}.  Callers of this method
-	 * need not call addSelectionChangedListener.
-	 * @param listener
-	 */
-	public void addHTMLViewerListener(IHTMLGraphicalViewerListener listener)
-	{
-	    addSelectionChangedListener(listener);
-	    
-	    if (!_htmlViewerListeners.contains(listener))
-	    {
-	        _htmlViewerListeners.add(listener);
-	    }
-	}
-	
-	/**
-	 * Removes listener both as a selection changed listener and as an
-     * {@link IHTMLGraphicalViewerListener}.  Callers of this method
-     * need not call removeSelectionChangedListener.
-	 * @param listener
-	 */
-	public void removeHTMLViewerListener(IHTMLGraphicalViewerListener listener)
-	{
-	    removeSelectionChangedListener(listener);
-	    _htmlViewerListeners.remove(listener);
-	}
-
-	public Viewport getViewport() {
-		FigureCanvas canvas = this.getFigureCanvas();
-		if (canvas != null) {
-			return canvas.getViewport();
-		}
-        return null;
-	}
-
-	public IDOMModel getModel() {
-		// XXX: temp implementation.
-		EditPart part = this.getContents();
-		if (part != null) {
-			return ((IDOMNode) part.getModel()).getModel();
-		}
-        return null;
-	}
-
-	/**
-	 * @return the status line manager
-	 */
-	public IStatusLineManager getStatusLineManager() {
-		if (_parentPart == null) {
-			return null;
-		}
-        return _parentPart.getEditorSite().getActionBars()
-        		.getStatusLineManager();
-	}
-
-	public Caret getCaret() {
-		if (_caret == null) {
-			Canvas parentCanvas = (Canvas) getControl();
-			if (parentCanvas == null || parentCanvas.isDisposed()) {
-				return null;
-			}
-
-			_caret = new Caret(parentCanvas, 0);
-			_caretUpdater.connectViewer();
-		}
-		return _caret;
-
-	}
-
-	/**
-	 * this method normally should only be called when in object selection mode.
-	 * 
-	 * @return the edit part that has primary selection or null if none
-	 */
-	public EditPart getPrimarySelectedNode() {
-		List list = this.getSelectedEditParts();
-		if (list.isEmpty()) {
-			return null;
-		}
-		for (int i = 0, n = list.size(); i < n; i++) {
-			EditPart part = (EditPart) list.get(i);
-			if (part.getSelected() == EditPart.SELECTED_PRIMARY) {
-				return part;
-			}
-		}
-		return (EditPart) list.get(0);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.parts.IHTMLGraphicalViewer#ensureRangeSelectionMode()
-	 */
-	public void ensureRangeSelectionMode() {
-		if (!_rangeMode) {
-			EditPart primary = getPrimarySelectedNode();
-			this.deselectAll();
-			DesignPosition begin = primary == null ? DesignPosition.INVALID
-					: DesignPosition.createPositionBeforePart(primary);
-			DesignPosition after = primary == null ? DesignPosition.INVALID
-					: DesignPosition.createPositionAfterPart(primary);
-			internalSetRange(begin, after);
-			fireSelectionChanged();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.parts.IHTMLGraphicalViewer#ensureObjectSelectionMode()
-	 */
-	public void ensureObjectSelectionMode() {
-		if (_rangeMode) {
-			// switch to object selection mode with no selection.
-			internalToObjectMode();
-			fireSelectionChanged();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.parts.IHTMLGraphicalViewer#isInRangeMode()
-	 */
-	public boolean isInRangeMode() {
-		return _rangeMode;
-	}
-
-	public ISelection getSelection() {
-		if (isInRangeMode()) {
-			return getRangeSelection();
-		}
-        return super.getSelection();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.parts.IHTMLGraphicalViewer#startSelectionChange()
-	 */
-	public void startSelectionChange() {
-		if (_inBatch == 0) {
-			fireSelectionAboutToChange();
-		}
-		_inBatch++;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.parts.IHTMLGraphicalViewer#selectionChanged()
-	 */
-	public void selectionChanged() {
-		if (--_inBatch == 0) {
-			fireSelectionChanged();
-			fireSelectionChangeFinished();
-		}
-	}
-
-	/**
-	 * 
-	 */
-	private void fireSelectionAboutToChange() {
-		IHTMLGraphicalViewerListener listeners[] = 
-		    _htmlViewerListeners.toArray(new IHTMLGraphicalViewerListener[0]);
-
-		for (int i = 0; i < listeners.length; i++) 
-		{
-			listeners[i].selectionAboutToChange();
-		}
-	}
-
-	/**
-	 * 
-	 */
-	private void fireSelectionChangeFinished()
-	{
-        IHTMLGraphicalViewerListener listeners[] = 
-            _htmlViewerListeners.toArray(new IHTMLGraphicalViewerListener[0]);
-        for (int i = 0; i < listeners.length; i++) 
-        {
-            listeners[i].selectionChangeFinished();
-        }
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.ui.parts.AbstractEditPartViewer#fireSelectionChanged()
-	 */
-	protected void fireSelectionChanged() {
-		if (_inBatch == 0)// && this.getControl().isFocusControl())
-		{
-			super.fireSelectionChanged();
-			// firePostSelectionChanged(new SelectionChangedEvent(this,
-			// getSelection()));
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.ui.parts.AbstractEditPartViewer#setSelection(org.eclipse.jface.viewers.ISelection)
-	 */
-	public void setSelection(ISelection newSelection) {
-		if (newSelection instanceof IStructuredSelection) {
-			internalToObjectMode();
-			ExposeHelper.expose(newSelection, this);
-			updateRangeSelection(newSelection);
-			super.setSelection(newSelection);
-		} else if (newSelection instanceof DesignRange) {
-			DesignRange range = (DesignRange) newSelection;
-			internalSetRange(range.getStartPosition(), range.getEndPosition());
-			fireSelectionChanged();
-		}
-		// else we don't support, ignore
-	}
-
-
-	/**
-	 * @param newSelection
-	 */
-	public void updateRangeSelection(ISelection newSelection) {
-		if (newSelection instanceof IStructuredSelection && //
-				!(((IStructuredSelection) newSelection).getFirstElement() instanceof DocumentEditPart)) {
-			Object element = ((IStructuredSelection) newSelection)
-					.getFirstElement();
-			if (element instanceof ElementEditPart) {
-				updateRangeSelection(new DesignRefPosition((EditPart) element,
-						false), new DesignRefPosition((EditPart) element, true));
-			} else if (element instanceof Node) {
-				IDOMPosition start = new DOMRefPosition((Node) element, false);
-				IDOMPosition end = new DOMRefPosition((Node) element, true);
-				updateRangeSelection(DOMPositionHelper.toDesignPosition(start),
-						DOMPositionHelper.toDesignPosition(end));
-			}
-		}
-	}
-
-	/**
-	 * This method is used to synchronize range mode selection when node
-	 * selection is changed.
-	 * 
-	 * @param position
-	 * @param position2
-	 */
-	private void updateRangeSelection(DesignPosition position,
-			DesignPosition position2) {
-		// if only one position is invalid, we will make a collapsed range using
-		// the valid position
-		if (position == null) {
-			position = DesignPosition.INVALID;
-		}
-		if (position2 == null || !position2.isValid()) {
-			position2 = position;
-		}
-		if (!position.isValid()) {
-			position = position2;
-		}
-
-		_selectionRange = new DesignRange(position, position2);
-	}
-
-	// -------------------------------------------------------------------------------------------------
-	// override super class methods for selection handling.
-	// operations that handles object selection
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.ui.parts.AbstractEditPartViewer#appendSelection(org.eclipse.gef.EditPart)
-	 */
-	public void appendSelection(EditPart editpart) {
-		internalToObjectMode();
-		super.appendSelection(editpart); // super will fireSelectionChanged.
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.ui.parts.AbstractEditPartViewer#deselectAll()
-	 */
-	public void deselectAll() {
-		internalToObjectMode();
-		super.deselectAll(); // super.deselectAll() will fireSelectionChanged
-	}
-
-	/**
-	 * Clear the selection to null. When the model is modified, the selection is
-	 * invalid, so we need to clear the selection. We change the selection
-	 * directly, it won't need to fire selectionchange event to other part.
-	 * 
-	 */
-	public void clearSelectionRange() {
-		internalToObjectMode();
-		_selectionRange = null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.ui.parts.AbstractEditPartViewer#deselect(org.eclipse.gef.EditPart)
-	 */
-	public void deselect(EditPart editpart) {
-		if (!_rangeMode) {
-			super.deselect(editpart); // super will fireSelectionChanged.
-		}
-		// else just ignore.
-	}
-
-	// ---------------------------------------------------------------------------------------------
-	// range selection handling methods.
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.parts.IHTMLGraphicalViewer#getRangeSelection()
-	 */
-	public DesignRange getRangeSelection() {
-		return _selectionRange;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.parts.IHTMLGraphicalViewer#setRange(org.eclipse.jst.pagedesigner.selection.EditPartPosition,
-	 *      org.eclipse.jst.pagedesigner.selection.EditPartPosition)
-	 */
-	public void setRange(DesignPosition position, DesignPosition position2) {
-		internalSetRange(position, position2);
-		fireSelectionChanged();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.parts.IHTMLGraphicalViewer#setRangeEndPosition(org.eclipse.jst.pagedesigner.selection.EditPartPosition)
-	 */
-	public void setRangeEndPosition(DesignPosition position) {
-		DesignRange range = getRangeSelection();
-		DesignPosition begin = null;
-		if (range != null) {
-			begin = range.getStartPosition();
-		}
-		internalSetRange(begin, position);
-		fireSelectionChanged();
-	}
-
-	// --------------------------------------------------------------------------------------
-	/**
-	 * internall switch to object mode, no selection change event is fired. the
-	 * caller must call some other methods that will result in selection change
-	 * event after calling this method.
-	 */
-	private void internalToObjectMode() {
-		_rangeMode = false;
-	}
-
-	/**
-	 * this method will not fire selection changed event. caller should do that.
-	 * 
-	 * @param position
-	 * @param position2
-	 */
-	private void internalSetRange(DesignPosition position,
-			DesignPosition position2) {
-		if (!_rangeMode) {
-			// XXX: deselectAll() will result in fireSelectionChange, so here is
-			// one unnecessary
-			// event fire. But should be ok.
-			deselectAll();
-			_rangeMode = true;
-		}
-		// if only one position is invalid, we will make a collapsed range using
-		// the valid position
-		if (position == null) {
-			position = DesignPosition.INVALID;
-		}
-		if (position2 == null || !position2.isValid()) {
-			position2 = position;
-		}
-		if (!position.isValid()) {
-			position = position2;
-		}
-
-		_selectionRange = new DesignRange(position, position2);
-	}
-
-	/**
-	 * debug method, dump some debug information to the console
-	 */
-	public void dumpStatus() {
-		if (isInRangeMode()) {
-			// System.out.println("Range start: " +
-			// this.getRangeSelection().getStartPosition());
-			// System.out.println("Range end: " +
-			// this.getRangeSelection().getEndPosition());
-		} else {
-			// System.out.println("Object selection mode");
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.nav.CaretPositionTracker#getXoffset()
-	 */
-	public int getXoffset() {
-		return _xOffset;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.nav.CaretPositionTracker#setXoffset(int)
-	 */
-	public void setXoffset(int xoffset) {
-		this._xOffset = xoffset;
-	}
-
-	/**
-	 * 
-	 */
-	public void updateHorizontalPos() {
-		Caret caret = getCaret();
-		if (caret != null && !caret.isDisposed() && isInRangeMode()) {
-			org.eclipse.swt.graphics.Rectangle rect = caret.getBounds();
-			setXoffset(rect.x);
-		}
-	}
-    
-	// public void addPostSelectionChangedListener(ISelectionChangedListener
-	// listener)
-	// {
-	// _postSelectionChangedListeners.add(listener);
-	//
-	// }
-	//
-	// public void removePostSelectionChangedListener(ISelectionChangedListener
-	// listener)
-	// {
-	// _postSelectionChangedListeners.remove(listener);
-	// }
-
-	/**
-	 * Notifies any post selection listeners that a post selection event has
-	 * been received. Only listeners registered at the time this method is
-	 * called are notified.
-	 * 
-	 * @param event
-	 *            a selection changed event
-	 * 
-	 * @see #addPostSelectionChangedListener(ISelectionChangedListener)
-	 */
-	// public void firePostSelectionChanged(final SelectionChangedEvent event)
-	// {
-	// Object[] listeners = _postSelectionChangedListeners.getListeners();
-	// for (int i = 0; i < listeners.length; ++i)
-	// {
-	// final ISelectionChangedListener l = (ISelectionChangedListener)
-	// listeners[i];
-	// SafeRunnable.run(new SafeRunnable()
-	// {
-	// public void run()
-	// {
-	// l.selectionChanged(event);
-	// }
-	// });
-	// }
-	// }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/HTMLGraphicalViewerListenenerAdapter.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/HTMLGraphicalViewerListenenerAdapter.java
deleted file mode 100644
index 4b368aa..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/HTMLGraphicalViewerListenenerAdapter.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.viewer;
-
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-
-/**
- * @author cbateman
- * 
- * Default adapter class for IHTMLGraphicalViewerListener
- *
- */
-public abstract class HTMLGraphicalViewerListenenerAdapter implements
-        IHTMLGraphicalViewerListener {
-
-    public void selectionAboutToChange() {
-        // do nothing -- override to implement
-    }
-
-    public void selectionChangeFinished() {
-        // do nothing -- override to implement
-    }
-
-    public void selectionChanged(SelectionChangedEvent event) {
-        // do nothing == override to implement
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/IDropLocationStrategy.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/IDropLocationStrategy.java
deleted file mode 100644
index 0798fea..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/IDropLocationStrategy.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.viewer;
-
-import java.util.List;
-
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.requests.DropRequest;
-import org.eclipse.jst.pagedesigner.validation.caret.IPositionMediator;
-
-/**
- * A strategy used to determine the closest valid drop location given
- * a current position.
- * 
- * Note: clients should not implement or sub-class this interface.  Instead,
- * sub-class AbstractDropLocationStrategy.
- * @author cbateman
- *
- */
-public interface IDropLocationStrategy
-{
-    /**
-     * @param host
-     * @param p
-     * @param validator
-     * @return the closest valid design positionn to p, starting from host
-     * that is valid based on validator, or null if there is no such position
-     * (drop not valid).  validator.isValidPosition must be honoured.
-     */
-    DesignPosition calculateDesignPosition(EditPart host, Point p, IPositionMediator validator);
-    
-    /**
-     * May choose to contribute target feedback given a target part host and given
-     * the proposed drops location given by position
-     * 
-     * @param host 
-     * @param position
-     * @param request 
-     * @return must contain all IFigure objects that were added to the feedback layer by
-     * this call.  Once returned, these IFigure's must not be kept as state information
-     * by the strategy because they may be manipulated at any time after return to the caller.
-     * This includes erasing them from the feedback layer.  List must be modifiable by
-     * the caller.
-     * 
-     * Note: most feedback in Draw2D requires that it is added to the feedback layer
-     * before it can be fully initialized, which is why this call adds feedback and then
-     * returns it.  The caller is responsible for erasing the figures in the list.
-     */
-    List showTargetFeedback(EditPart host, DesignPosition position, DropRequest request);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/IHTMLGraphicalViewer.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/IHTMLGraphicalViewer.java
deleted file mode 100644
index 6ee3ce4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/IHTMLGraphicalViewer.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.viewer;
-
-import org.eclipse.draw2d.Viewport;
-import org.eclipse.gef.GraphicalViewer;
-import org.eclipse.jface.action.IStatusLineManager;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.swt.widgets.Caret;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-
-/**
- * @author mengbo
- */
-public interface IHTMLGraphicalViewer extends GraphicalViewer 
-{
-    /**
-     * Factory for IHTMLGraphicalViewers
-     *
-     */
-    static class Factory
-    {
-        /**
-         * @param part 
-         * @return a new graphical viewer for part
-         */
-        public static IHTMLGraphicalViewer createGraphicalViewer(IEditorPart part)
-        {
-            return new HTMLGraphicalViewer(part);
-        }
-    }
-
-	/**
-	 * @return the dom model
-	 */
-	public IDOMModel getModel();
-
-	/**
-	 * ensure we are in range selection mode
-	 */
-	public void ensureRangeSelectionMode();
-
-	/**
-	 * 
-	 */
-	public void ensureObjectSelectionMode();
-
-	/**
-	 * @return true if in range mode
-	 */
-	public boolean isInRangeMode();
-
-	/**
-	 * @return the current selection range
-	 */
-	public DesignRange getRangeSelection();
-
-	/**
-	 * @param position
-	 * @param position2
-	 */
-	public void setRange(DesignPosition position, DesignPosition position2);
-
-	/**
-	 * @param position
-	 */
-	public void setRangeEndPosition(DesignPosition position);
-
-	/**
-	 * @return the caret
-	 */
-	public Caret getCaret();
-
-	/**
-	 * indicate a batch of operations is began, and may result in selection
-	 * change. This viewer will only fire a single selection changed event when
-	 * this batch of operations finish.
-	 */
-	public void startSelectionChange();
-
-	/**
-	 * batch operation that change the selection finished.
-	 * 
-	 */
-	public void selectionChanged();
-
-	/**
-	 * @return the view port
-	 */
-	public Viewport getViewport();
-	
-	/**
-	 * @return the status line manager
-	 */
-	public IStatusLineManager getStatusLineManager();
-	
-	/**
-	 * @param newSelection
-	 */
-	public void updateRangeSelection(ISelection newSelection);
-	
-	/**
-	 * Update the horizontal position
-	 */
-	public void updateHorizontalPos();
-
-	/**
-	 * Clear the selection to null. When the model is modified, the selection is
-     * invalid, so we need to clear the selection. We change the selection
-     * directly, it won't need to fire selectionchange event to other part.
-     */
-	public void clearSelectionRange();
-
-	/**
-     * Adds listener both as a selection changed listener and as an
-     * {@link IHTMLGraphicalViewerListener}.  Callers of this method
-     * need not call addSelectionChangedListener.
-     * @param listener
-     */
-    public void addHTMLViewerListener(IHTMLGraphicalViewerListener listener);
-    
-    /**
-     * Removes listener both as a selection changed listener and as an
-     * {@link IHTMLGraphicalViewerListener}.  Callers of this method
-     * need not call removeSelectionChangedListener.
-     * @param listener
-     */
-    public void removeHTMLViewerListener(IHTMLGraphicalViewerListener listener);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/IHTMLGraphicalViewerListener.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/IHTMLGraphicalViewerListener.java
deleted file mode 100644
index 0d48ca9..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/IHTMLGraphicalViewerListener.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.viewer;
-
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-
-/**
- * @author mengbo
- */
-public interface IHTMLGraphicalViewerListener extends ISelectionChangedListener {
-	/**
-	 * Fired before selection changes
-	 */
-	public void selectionAboutToChange();
-
-	/**
-	 * Fired after selection changed listeners have all been processed
-	 * for a change
-	 */
-	public void selectionChangeFinished();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/LayoutPart.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/LayoutPart.java
deleted file mode 100644
index 853ec06..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/LayoutPart.java
+++ /dev/null
@@ -1,476 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.viewer;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.css2.layout.CSSFigure;
-import org.eclipse.jst.pagedesigner.css2.layout.CSSTextFigure;
-import org.eclipse.jst.pagedesigner.css2.layout.FlowBox;
-import org.eclipse.jst.pagedesigner.css2.layout.FlowUtilities;
-import org.eclipse.jst.pagedesigner.css2.layout.TextFragmentBox;
-import org.eclipse.jst.pagedesigner.css2.layout.TextLayoutSupport;
-import org.eclipse.jst.pagedesigner.dom.DOMRefPosition;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.parts.SubNodeEditPart;
-import org.eclipse.jst.pagedesigner.parts.TextEditPart;
-import org.eclipse.jst.pagedesigner.validation.caret.IPositionMediator;
-import org.eclipse.jst.pagedesigner.validation.caret.Target;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public final  class LayoutPart {
-	private final static int MAX_OFFSET_TO_EDGE = 10;
-
-	private EditPart _part;
-
-	private FlowBox _box;
-
-	private final Point EMPTY_POINT = new Point(0, 0);
-
-	private Point _point = EMPTY_POINT;
-
-	/**
-	 * If caller didn't resolve FlowBox, call this.
-	 * 
-	 * @param part
-	 * @param point
-	 */
-	public LayoutPart(EditPart part, Point point) {
-		Assert.isTrue(part != null);
-		_part = part;
-		_point = point;
-	}
-
-	/**
-	 * @return Returns the _box, when it is null, generate box with part and
-	 *         point.
-	 */
-	public FlowBox getBox() {
-		if (_box == null) {
-			_box = getClosestBox();
-		}
-		return _box;
-	}
-
-	/**
-	 * @return Returns the _part.
-	 */
-	public EditPart getPart() {
-		return _part;
-	}
-
-	/**
-	 * Get closest box's bounds.
-	 * 
-	 * @param point
-	 * @return
-	 */
-	private Rectangle getClosestBoxAbsoluteBounds() {
-		Rectangle rect = null;
-		if (getBox() != null) {
-			rect = getAbsoluteBounds(getBox());
-		}
-		return rect;
-	}
-
-	/**
-	 * Try to get the closest flowbox absolute bounds.
-	 * 
-	 * @return the bounding rectangle
-	 */
-	public Rectangle getAbsoluteBounds() {
-		Rectangle bounds = null;
-		if ((bounds = getClosestBoxAbsoluteBounds()) == null) {
-			// This should never happens.
-			bounds = EditPartPositionHelper.getAbsoluteBounds(_part);
-		}
-		return bounds;
-	}
-
-	/**
-	 * Get box's absolute bounds.
-	 * 
-	 * @param box
-	 * @return the box's bounding rectangle
-	 */
-	public Rectangle getAbsoluteBounds(FlowBox box) {
-		if (box != null) {
-			IFigure figure = ((GraphicalEditPart) _part).getFigure();
-			Rectangle rect = new Rectangle(box.getX(), box.getY(), box.getWidth(), box
-					.getHeight());
-			figure.translateToAbsolute(rect);
-			return rect;
-		}
-		return null;
-	}
-
-	/**
-	 * Closest box is the part's FlowBox which y coordinate is closest to point,
-	 * and then its x coordinate is more close to point than other boxs of the
-	 * same line.
-	 * 
-	 * @param part
-	 * @param point
-	 * @return
-	 */
-	private FlowBox getClosestBox() {
-		FlowBox closestBox = null;
-		List fragments = getLines(_part);
-
-		// if there is one which are at the same line with relative,
-		// calculate that line first;
-		for (int i = 0; i < fragments.size(); i++) {
-			FlowBox box = (FlowBox) fragments.get(i);
-			Rectangle boxRect = getAbsoluteBounds(box);
-			if (boxRect.contains(_point.x, _point.y)) {
-				closestBox = box;
-				break;
-			}
-            if (closestBox == null) {
-            	closestBox = box;
-            } else {
-            	// compare y.
-            	int offset1 = Math.abs(CaretPositionResolver.getYDistance(
-            			boxRect, _point));
-            	Rectangle closestRect = getAbsoluteBounds(closestBox);
-            	int offset2 = Math.abs(CaretPositionResolver.getYDistance(
-            			closestRect, _point));
-            	if (offset1 < offset2) {
-            		closestBox = box;
-            	}
-            }
-            // at the same line
-            if (closestBox != box && boxRect.contains(boxRect.x, _point.y)) {
-            	// compare x.
-            	int offset1 = Math.abs(CaretPositionResolver.getXDistance(
-            			boxRect, _point));
-            	Rectangle closestRect = getAbsoluteBounds(closestBox);
-            	int offset2 = Math.abs(CaretPositionResolver.getXDistance(
-            			closestRect, _point));
-            	if (offset1 < offset2) {
-            		closestBox = box;
-            	}
-            }
-		}
-		return closestBox;
-	}
-
-	/**
-	 * The point is whitin the bounds of the figure.
-	 * 
-	 * @param point
-	 * @return true if point is the absolute bounds of this
-	 */
-	public boolean contains(Point point) {
-		return getAbsoluteBounds().contains(point);
-	}
-
-	/**
-	 * @return the design position
-	 */
-	public DesignPosition resolveTextPosition() {
-		DesignPosition result = null;
-		if (_part instanceof TextEditPart
-				&& !EditModelQuery.isTransparentText(Target.resolveNode(_part))) {
-			FlowBox flowBox = getBox();
-			if (flowBox instanceof TextFragmentBox) {
-				TextFragmentBox box = (TextFragmentBox) flowBox;
-				if (((TextEditPart) _part).getFigure() instanceof CSSTextFigure) {
-					CSSTextFigure figure = (CSSTextFigure) ((TextEditPart) _part)
-							.getFigure();
-					Rectangle boxRect = getAbsoluteBounds(box);
-					int index = FlowUtilities.getTextInWidth(box.getTextData(),
-							figure.getCSSStyle().getCSSFont().getSwtFont(),
-							_point.x - boxRect.x, TextLayoutSupport
-									.getAverageCharWidth(box));
-					result = new DesignPosition(_part, box._offset + index);
-				}
-			}
-		}
-		return result;
-	}
-
-	/**
-	 * @param validator
-	 * @return resolve the design position using validator
-	 */
-	public DesignPosition resolvePosition(IPositionMediator validator) {
-		DesignPosition result;
-		if ((result = resolveTextPosition()) == null) {
-			boolean atPointLeft = isBeforePoint(_point);
-//			boolean atPointRight = isAfterPoint(_point);
-//			if (atPointLeft == atPointRight) {
-//			    // TODO: and...?
-//			}
-			Target target = new Target(getPart());
-			if (validator.isValidPosition(new DOMRefPosition(target.getNode(),
-					atPointLeft))) {
-				result = new DesignRefPosition(_part, atPointLeft);
-			} else if (validator.isValidPosition(new DOMRefPosition(target
-					.getNode(), !atPointLeft))) {
-				result = new DesignRefPosition(_part, !atPointLeft);
-			} else if (validator.isEditable(target)) {
-				if (atPointLeft) {
-					result = new DesignPosition(_part, 0);
-				} else {
-					result = new DesignPosition(_part, _part.getChildren()
-							.size());
-				}
-			}
-		}
-		return result;
-	}
-
-    // TODO: dead?
-//	private IFigure getFigure() {
-//		return ((GraphicalEditPart) _part).getFigure();
-//	}
-
-	private boolean isAfterPoint(Point point) {
-		boolean result = false;
-		FlowBox flowBox = getLine(0);
-		if (IHTMLConstants.TAG_BR.equalsIgnoreCase(Target.resolveNode(_part)
-				.getNodeName())) {
-			if (flowBox != null) {
-				Rectangle boxRect = getAbsoluteBounds(flowBox);
-				result = CaretPositionResolver.getYDistance(boxRect, point) == 0;
-			}
-		} else {
-
-			if (flowBox != null) {
-				Rectangle boxRect = getAbsoluteBounds(flowBox);
-				if (CaretPositionResolver.getXDistance(boxRect, point) != 0) {
-					result = CaretPositionResolver.getXDistance(boxRect, point) < 0
-							&& // 
-							CaretPositionResolver.getYDistance(boxRect, point) == 0;
-				}
-			}
-		}
-		result |= isUnderCaret();
-		// if (isWidget() && flowBox != null)
-		// {
-		// result |= contains(point) &&
-		// CaretPositionResolver.toXMiddle(getAbsoluteBounds(flowBox), point) <
-		// 0;
-		// }
-		return result;
-
-	}
-
-	/*package*/ boolean isBeforePoint(Point point) {
-		boolean result = false;
-		FlowBox flowBox = getLastLine();
-		if (flowBox != null) {
-			Rectangle boxRect = getAbsoluteBounds(flowBox);
-			if (IHTMLConstants.TAG_BR.equalsIgnoreCase(Target
-					.resolveNode(_part).getNodeName())) {
-				return CaretPositionResolver.getYDistance(boxRect, point) == 0;
-			} else if (CaretPositionResolver.getXDistance(boxRect, point) != 0) {
-				result = CaretPositionResolver.getXDistance(boxRect, point) > 0
-						&& // 
-						CaretPositionResolver.getYDistance(boxRect, point) == 0;
-			}
-		}
-		result |= isAboveCaret();
-		// if (isWidget() && flowBox != null)
-		// {
-		// result |= contains(point) &&
-		// CaretPositionResolver.toXMiddle(getAbsoluteBounds(flowBox), point) >
-		// 0;
-		// }
-		return result;
-		// return !isAfterPoint(point);
-	}
-
-	/*package*/ boolean isBeforePoint() {
-		return isBeforePoint(_point);
-	}
-
-	/*package*/ boolean atLeftPart(Point point) {
-		FlowBox flowBox = getBox();
-		if (flowBox != null) {
-			Rectangle boxRect = getAbsoluteBounds(flowBox);
-			return CaretPositionResolver.toXMiddle(boxRect, point) < 0;
-		}
-		return true;
-	}
-
-	/*package*/ boolean isAfterPoint() {
-		return isAfterPoint(_point);
-	}
-
-	// TODO: dead but possibly useful?
-//	private boolean atSameLine(Point point) {
-//		Rectangle bounds = getAbsoluteBounds();
-//		return bounds.contains(bounds.getTop().x, point.y);
-//	}
-
-	/*package*/ boolean atSameRow(Point point) {
-		Rectangle bounds = getAbsoluteBounds();
-		return bounds.contains(point.x, bounds.getRight().y);
-	}
-
-	/*package*/ static Rectangle getBounds(FlowBox box) {
-		return new Rectangle(box.getX(), box.getY(), box.getWidth(), box.getHeight());
-	}
-
-	/**
-	 * @return Returns the _point.
-	 */
-	public Point getPoint() {
-		return _point;
-	}
-
-	FlowBox getLine(int index) {
-		FlowBox result = null;
-		List lines = getLines(_part);
-		if (lines.size() > 0 && index >= 0 && index <= lines.size() - 1) {
-			result = (FlowBox) lines.get(index);
-		}
-		return result;
-	}
-
-	FlowBox getLastLine() {
-		FlowBox result = null;
-		List lines = getLines(_part);
-		if (lines.size() > 0) {
-			result = (FlowBox) lines.get(lines.size() - 1);
-		}
-		return result;
-	}
-
-	/**
-	 * @param part
-	 * @return
-	 */
-	List getLines(EditPart part) {
-		List fragments = new ArrayList();
-		if (part instanceof SubNodeEditPart) {
-			IFigure figure = ((GraphicalEditPart) part).getFigure();
-
-			if (figure instanceof CSSTextFigure) {
-				fragments = ((CSSTextFigure) figure).getFragments();
-				((CSSTextFigure) figure).getCSSStyle();
-			} else if (figure instanceof CSSFigure) {
-				fragments = ((CSSFigure) figure).getFragmentsForRead();
-				((CSSFigure) figure).getCSSStyle();
-			}
-		}
-		return fragments;
-	}
-
-	/**
-	 * To search for none empty string, this is not final.
-	 * @param part 
-	 * @return the edit part
-	 * 
-	 */
-	/*package*/ static EditPart getConcretePart(EditPart part) {
-		if (part != null) {
-			Node node = Target.resolveNode(part);
-			Node child = node.getFirstChild();
-			EditPart result;
-			while (child != null) {
-				if (!EditModelQuery.isTransparentText(child)
-						&& (result = Target.resolvePart(child)) != null) {
-					return result;
-				}
-				child = child.getNextSibling();
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * To search for none empty string, this is not final.
-	 * Equivalent to getConcretePart(getPart())
-	 * 
-	 * @return the edit part
-	 * 
-	 */
-	public EditPart getConcretePart() {
-		return getConcretePart(_part);
-	}
-
-	/**
-	 * @param node
-	 * @return the node
-	 */
-	public static Node getConcreteNode(Node node) {
-		if (node != null) {
-			Node child = node.getFirstChild();
-			while (child != null) {
-				if (!EditModelQuery.isTransparentText(child)) {
-					return node;
-				}
-				child = child.getNextSibling();
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * @return true if is close to edge
-	 */
-	public boolean isCloseToEdgeFromOutSide() {
-		boolean result = false;
-		if (EditModelQuery.isBlockNode(Target.resolveNode(_part))) {
-			result = Math.abs(getAbsoluteBounds().getLeft().x - _point.x) <= MAX_OFFSET_TO_EDGE;
-			if (!result) {
-				result = Math.abs(getAbsoluteBounds().getRight().x - _point.x) <= MAX_OFFSET_TO_EDGE;
-			}
-		}
-		return result;
-	}
-
-	private boolean isAboveCaret() {
-		return getAbsoluteBounds().getBottom().y <= _point.y;
-	}
-
-	private boolean isUnderCaret() {
-		return getAbsoluteBounds().getTop().y >= _point.y;
-	}
-
-	/**
-	 * @return tru if getPart() is considered inline
-	 */
-	/*package*/ boolean isInline() {
-		return EditModelQuery.isInline(Target.resolveNode(_part));
-	}
-
-    // TODO: dead?
-//	private boolean isWidget() {
-//		return EditModelQuery.isWidget(_part);
-//	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		StringBuffer sb = new StringBuffer();
-		sb.append("editPart:" + _part + ", --- box: " + getBox()); //$NON-NLS-1$ //$NON-NLS-2$
-		return sb.toString();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/TextPosition.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/TextPosition.java
deleted file mode 100644
index 46850b4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/TextPosition.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.viewer;
-
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMText;
-
-/**
- * This class used to identify a position in a text node. It's very similiar to
- * EditPartPosition. Used instead of EditPartPosition when in cases we are in
- * the middle of handling something without available EditPart created.
- * 
- * offset has the same meaning as in EditPartPosition.
- * 
- * @author mengbo
- */
-public class TextPosition {
-	private IDOMText _containerNode;
-
-	private int _offset;
-
-	/**
-	 * @param part
-	 * @param offset
-	 */
-	public TextPosition(IDOMText part, int offset) {
-		_containerNode = part;
-		_offset = offset;
-	}
-
-	/**
-	 * if _containerPart is null, means it is invalid
-	 * 
-	 * @return the text node
-	 */
-	public IDOMText getTextNode() {
-		return _containerNode;
-	}
-
-	/**
-	 * if offset < 0, means it is invalid.
-	 * 
-	 * @return the offset
-	 */
-	public int getOffset() {
-		return _offset;
-	}
-
-	/**
-	 * @return if this position is considered valid
-	 */
-	public boolean isValid() {
-		return _containerNode != null && _offset >= 0;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Object#equals(java.lang.Object)
-	 */
-	public boolean equals(Object obj) {
-		if (obj instanceof TextPosition) {
-			TextPosition p = (TextPosition) obj;
-			return p.getTextNode() == this._containerNode
-					&& p.getOffset() == this._offset;
-		}
-		return false;
-	}
-
-    @Override
-    public int hashCode() 
-    {
-        // match hash code to equals criteria
-        return System.identityHashCode(getTextNode()) 
-                ^ System.identityHashCode(Integer.valueOf(getOffset()));
-    }
-	
-	
-}
